fv5.4/0002755000220700001010000000000012565674113011220 5ustar birbylheadevfv5.4/ftools/0002755000220700001010000000000012565676540012534 5ustar birbylheadevfv5.4/ftools/guis/0002755000220700001010000000000012565673764013510 5ustar birbylheadevfv5.4/ftools/guis/fgui/0002755000220700001010000000000012565673763014441 5ustar birbylheadevfv5.4/ftools/guis/fgui/class/0002755000220700001010000000000012565673763015546 5ustar birbylheadevfv5.4/ftools/guis/fgui/class/FVFtool.tcl0000755000220700001010000022365410617676020017567 0ustar birbylheadevitcl::class FtoolParameter { constructor {args} {} destructor {} public { variable name variable value variable descr variable mode variable type variable isFits variable isOutput variable frame variable cframe method GetParameter { par2Content frame frameWidth prevNameLen prevDescrLen } method CheckParameter {} } private { variable pseparator variable temp_value variable callRoutine variable descrWidth method ParBrowser { wndw } method ParReset {} method ParOK {parobj flag} } } itcl::body FtoolParameter::constructor {args} { set name [lindex $args 0] set value [lindex $args 1] set type [lindex $args 2] set mode [lindex $args 3] if { $type == "b" } { set value [string tolower [lindex $args 1]] } set descr [lindex $args 4] set descrWidth [lindex $args 5] set callRoutine [lindex $args 6] set isFits 0 set isOutput 0 set pseparator "," } itcl::body FtoolParameter::destructor {} { } itcl::body FtoolParameter::GetParameter { par2Content frame frameWidth prevNameLen prevDescrLen } { # variable is never used anywhere global g_entryFont global g_titleFont global tcl_platform set temp [string tolower $name] set cframe ${frame}.${temp} set fr $cframe if [winfo exists $fr] { return } frame $fr -relief groove set nameLen [string length $name] set descrLen [string length $descr] if { $descrLen < $prevDescrLen } { set descrLen $prevDescrLen } if { $nameLen < $prevNameLen } { set nameLen $prevNameLen } label $fr.name -text $name -width 10 -anchor w label $fr.descr -text $descr -width $descrWidth -anchor w -font {Arial 10 bold} if {$type == "b" } { text $fr.value -width 25 -height 1.1 -relief flat radiobutton $fr.value.yes -variable [itcl::scope value] -value "yes" \ -font g_titleFont -text "Yes" radiobutton $fr.value.no -variable [itcl::scope value] -value "no" \ -font g_titleFont -text "No" $fr.value window create end -window $fr.value.yes $fr.value window create end -window $fr.value.no } else { entry $fr.value -width 25 -textvariable [itcl::scope value] -font g_titleFont } pack $fr.name -side left -ipadx 1 pack $fr.descr -side left -ipadx 1 pack $fr.value -side left -ipadx 1 -expand true # pack $fr.isfits -side left -ipadx 1 # pack $fr.isoutput -side left -ipadx 1 if {$type == "s" || $type == "f" || $type == "fr" } { set idx [lsearch -glob $par2Content "$name|*"] set ret "" if { $idx >= 0 } { set ret [lindex [split [lindex $par2Content $idx] "|"] 1] } if { $ret == "I" || $ret == "F" } { button $fr.browser -text browse -command [itcl::code $this ParBrowser $fr.value] bind $fr.browser { %W configure -cursor hand2 } pack $fr.browser -side left -padx 2 } } update idletask set width [expr [string length $name] + [string length $descr] + 30] if [winfo exists $fr.browser] { set width [expr $width + 35] } set returnWidth $frameWidth if { $width > $frameWidth } { set returnWidth $width .pframe.params.list configure -width $width update idletask } return [list $returnWidth $nameLen $descrLen] } itcl::body FtoolParameter::CheckParameter {} { switch -exact -- $type { b { if { $value != "yes" && $value !="no" } { set str "Parameter $name has invalid value, $value.\n" set str "$str Only yes and no are allowed." tk_dialog .parerror "Parameter Error" \ $str error 0 Ok return 1 } } i { if { [regexp -nocase {[a-z_,\.]} $value ] && \ $value != "INDEF" } { set str "Parameter $name has invalid value, $value.\n" set str "$str Only integer is allowed." tk_dialog .parerror "Parameter Error" \ $str error 0 Ok return 1 } } r { if { [regexp -nocase {[a-z_,]} $value ] && \ $value != "INDEF" } { set str "Parameter $name has invalid value, $value.\n" set str "$str Only numerical value is allowed." tk_dialog .parerror "Parameter Error" \ $str error 0 Ok return 1 } } } return 0 } itcl::body FtoolParameter::ParBrowser { wndw } { global g_titleFont if ![winfo exists .fD] { FitsFileselectionbox ::.fD $callRoutine -title "fgui: File Dialog" } .fD activate Open $wndw } itcl::body FtoolParameter::ParReset { } { $callRoutine ParClear $callRoutine ParSet } itcl::body FtoolParameter::ParOK {parobj flag} { if { $flag == 1 } { set value $temp_value } itcl::delete object $parobj } itcl::class FtoolInstance { constructor {args} {} destructor {} public { method MainMenu {} method notify { obj msg opts } method displayHelpMessage { topic_ { package "NONE" } { website "NONE" } } method FtoolRunInteractive { cmd } method addNewXterminal { page entry } { set xTerminalList($page) $entry } method getTerminalId { page } { return $xTerminalList($page) } method setCurrentTab { page } } private { method MenuInit {} method PackageMenu { } method PackageGet { package } method constructToolList {} method FtoolGet {} method FtoolRun {} method FtoolCancel {} method FtoolTerminate {} method FtoolHelp {} method FavoriteSave {} method FavoriteGet {} method FavoriteAdd { { entry "none" } } method FavoriteDelete {} method FavoriteReset {} method FavoriteCheck {} method ConfigSet {} method ConfigOk {} method HelpGet {} method LogClear {} method LogError {} method ParExist {} method ParClear {} method ParSave {} method ParSet {} method ParDialog {} method ParsRedraw {fpar} method ParsReset {fpar} method ParsOk {} method ParsCancel {} method CmdDialog {} method CmdOk {} method CmdCancel {} method runTool {} method selectCmd { args } method DumpText {wtext chan termCmd} method SearchDir {pathname filename} method processToolList { package fd } method changeBrowser {} method updateBrowserSetting {} method changeHeadasRoot {} method updateHeadasRootSetting {} method paneManager { command args } method _expandDirectoryView { cDirWndw } method _changeDirectory { dir } method _resolveSymLinks { filename_ } method _expandDirectoryViewX { cDirWndw } method _changeDirectoryX { dir } method _addNewTab {} method _deleteTab {} method _modifyTabText {} variable origPath variable ftoolPath variable helpPath variable parPath variable par2Path variable autoSave variable autoClear variable currPackage variable currFtool variable currCmd variable favorite variable imageFlag variable wlist variable cmdNum 0 variable logtext variable logchan variable currParFile variable currParList variable parObjs variable fhelpname variable isParTool variable showHidden variable goodCommand variable outputFits variable curPos variable tmp_ftoolPath variable tmp_helpPath variable tmp_parPath variable tmp_autoSave variable tmp_autoClear variable tmp_currCmd variable tmp_outputFits variable runcmd "" variable currSelection "" variable prevSelection "" variable openEntryList {} variable prevOpenEntryList {} variable delimiter "#" variable frameWidth 80 variable prevNameLen 0.0 variable prevDescrLen 0.0 variable startY 0 variable endY 0 variable toolHListTextRatio 1 variable cWorkingDirectory [pwd] variable hammerIcon variable allTools {} variable toolHList variable headasPrefix "headas" variable availablePackage [list "Favorite" "asca" "caltools" "einstein" "exosat" "fimage" \ "futils" "gro" "heao1" "heasarc" "oso" "rosat" \ "time" "vela5b" "xronos" "xte" ] variable preDefineDocWebSite "http://heasarc.gsfc.nasa.gov/docs/software/ftools/headas/" variable docWebSite "http://heasarc.gsfc.nasa.gov/docs/software/ftools/headas/" variable htmlBrowser variable xTerminal variable currentPage variable xTerminalList variable toolServer variable totalXtermCnt 0 variable xtermCnt -1 } } itcl::body FtoolInstance::constructor {args} { global env tcl_platform global pWorkingDirectory catch { fguiPreferences ::fguiPref } err if { $tcl_platform(platform) == "windows" } { if { $fguiPref::FtoolsHeadasRoot == "None Defined"} { catch { changeHeadasRoot } err vwait fguiPref::FtoolsHeadasRoot } else { set ::env(LHEASOFT) $::fguiPref::FtoolsHeadasRoot } set idx [string first $headasPrefix $env(LHEASOFT)] set ::env(CYGWIN_HOME) [string range $env(LHEASOFT) 0 [expr $idx - 2]] set token [split [file normalize $env(LHEASOFT)] "/"] set ::env(CYGWIN_ROOT) [format "%s/%s" [lindex $token 0] [lindex $token 1]] set ::env(CYGWIN_BASH_HOME) [string range $env(CYGWIN_HOME) [string length $env(CYGWIN_ROOT)] end] set idx [string first $env(CYGWIN_BASH_HOME) $env(LHEASOFT)] set ::env(CYGWIN_BASH_LHEASOFT) [string range $env(LHEASOFT) $idx end] set ::env(ORIGINAL_PWD) [pwd] set pWorkingDirectory [pwd] #puts "HOME: $env(CYGWIN_HOME)" #puts "ROOT: $env(CYGWIN_ROOT)" #puts "BASH_HOME: $env(CYGWIN_BASH_HOME)" set ::env(HOME) [file normalize $env(HOME)] set ::env(WIN_HOME) [file normalize $env(HOME)] set ::env(HEADAS) $env(LHEASOFT) set ::env(PATH) "$env(PATH);$env(LHEASOFT)/lib;$env(LHEASOFT)/bin" set ::env(LHEA_HELP) "$env(LHEASOFT)/help" set ::env(PFILES) "$env(LHEASOFT)/syspfiles" set ::env(P2FILES) "$env(LHEASOFT)/fguipfiles" set ::env(HEADASPROMPT) "stdout" set ::env(FTOOLSOUTPUT) "stdout" set ::env(PGPLOT_DIR) $env(HEADAS)/lib set ::env(PGPLOT_RGB) $env(HEADAS)/lib/rgb.txt set ::env(PGPLOT_FONT) $env(HEADAS)/lib/grfont.dat set ::env(LHEAPERL) /usr/bin/perl set ::env(PERLLIB) $env(CYGWIN_BASH_LHEASOFT)/lib/perl } else { set fguiPref::FtoolsHeadasRoot $env(LHEASOFT) fguiPref save } set ftoolPath "" if { $tcl_platform(platform) != "windows"} { set htmlBrowser "netscape" } else { set htmlBrowser "start" } if [info exists env(PATH) ] { set origPath $env(PATH) } else { set origPath "" } if [info exists env(LHEA_HELP) ] { set helpPath $env(LHEA_HELP) } else { set helpPath "" } if [info exists env(PFILES) ] { set parPath $env(PFILES) set par2Path $env(P2FILES) } else { set parPath "" set par2Path "" } set autoSave 1 set autoClear 0 set currCmd "" set currFtool "" set currPackage "" set currParList "" set currParFile "" set parObjs "" set favorite "" set showHidden 0 set goodCommand 0 set outputFits "" set logchan "" set isParTool 1 set tmp_ftoolPath "" set tmp_helpPath "" set tmp_parPath "" set tmp_autoSave "" set tmp_autoClear "" set tmp_currCmd "" set tmp_outputFits "" } itcl::body FtoolInstance::destructor {} { } itcl::body FtoolInstance::MainMenu {} { global g_titleFont global g_entryFont if [winfo exist .ftoolframe ] { focus .ftoolframe raise .ftoolframe return } FavoriteAdd init package require Tix toplevel .ftoolframe -class Dialog wm title .ftoolframe "fgui: Run Ftool" #################################### # # # Set up the Ftools Menu Bar # # # #################################### frame .ftoolframe.menu pack .ftoolframe.menu -fill x -pady 2 -pady 2 bind .ftoolframe { exit } set fm .ftoolframe.menu # Ftool menu button menubutton $fm.ftool -text "Action" -menu $fm.ftool.menu -font g_titleFont pack $fm.ftool -padx 2 -pady 2 -side left set m3 [menu $fm.ftool.menu -tearoff 1 ] $m3 add command -label "Run..." \ -command [itcl::code $this FtoolRun] -font g_titleFont $m3 add command -label "Cancel..." \ -command [itcl::code $this FtoolCancel] -font g_titleFont $m3 add command -label "Ftool Help" \ -command [itcl::code $this FtoolHelp] -font g_titleFont $m3 add separator $m3 add command -label "Preference" -command "fguiPref edit" -font g_titleFont $m3 add separator $m3 add command -label "Exit" \ -command "[itcl::code $this FavoriteSave] ; destroy ." -font g_titleFont # package menu button menubutton $fm.packages -text Packages -menu $fm.packages.menu -font g_titleFont #pack $fm.packages -padx 2 -pady 2 -side left set m1 [menu $fm.packages.menu -tearoff 1] PackageMenu # favorite menu button menubutton $fm.favorite -text "Favorite" -menu $fm.favorite.menu -font g_titleFont pack $fm.favorite -padx 2 -pady 2 -side left set m2 [menu $fm.favorite.menu -tearoff 1 ] $m2 add command -label "Go to..." \ -command [itcl::code $this FavoriteGet] -font g_titleFont $m2 add command -label "Add..." \ -command [itcl::code $this FavoriteAdd] -font g_titleFont $m2 add command -label "Delete..." \ -command [itcl::code $this FavoriteDelete] -font g_titleFont $m2 add command -label "Reset..." \ -command [itcl::code $this FavoriteReset] -font g_titleFont $m2 add separator $m2 add command -label "Configure" \ -command [itcl::code $this ConfigSet] -font g_titleFont # help menu button menubutton $fm.help -text "Help" -menu $fm.help.menu -font g_titleFont pack $fm.help -padx 2 -pady 2 -side left set m4 [menu $fm.help.menu -tearoff 1 ] $m4 add command -label "About this program" \ -command [itcl::code $this displayHelpMessage fgui.html NONE local] -font g_titleFont $m4 add command -label "About selected ftool" \ -command [itcl::code $this FtoolHelp] -font g_titleFont #################################### # # # Set up the Ftools List # # # #################################### set newAvailablePackage { "Favorite" } foreach name $availablePackage { set name [string trim $name] if { $name == "" } continue if [file exists $helpPath/${name}.txt] { set f [open $helpPath/${name}.txt r] processToolList $name $f close $f lappend newAvailablePackage $name } } set availablePackage $newAvailablePackage frame .ftoolframe.tools -relief groove -bd 4 pack .ftoolframe.tools -fill x -padx 2 -padx 2 set ft .ftoolframe.tools frame .ftoolframe.tools.info -relief flat -bd 4 label $ft.info.label -font g_titleFont -text "Working Directory:" entry $ft.info.entry -font g_titleFont -width 50 -bg white -selectbackground yellow button $ft.info.button -font g_titleFont -text "Browse" button $ft.info.hbutton -font g_titleFont -text "Home" pack $ft.info.label -side left -padx 2 -padx 2 pack $ft.info.entry -side left -padx 2 -padx 2 -fill x -expand true pack $ft.info.button -side left -padx 2 -padx 4 pack $ft.info.hbutton -side left -padx 2 -padx 4 pack .ftoolframe.tools.info -side top -fill x bind $ft.info.button { %W configure -cursor hand2 } bind $ft.info.button [itcl::code $this _expandDirectoryView .ftoolframe.tools.info.entry] bind $ft.info.hbutton { %W configure -cursor hand2 } bind $ft.info.entry { set dir [%W get] focus .ftoolframe.tools.info.entry .ftoolframe.tools.info.entry selection range 0 end if ![file exists $dir] { .ftoolframe.tools.info.entry configure -selectbackground red .ftoolframe.tools.info.entry configure -selectforeground white tk_messageBox -icon warning -type ok \ -message "$dir does not exists, operation might failed." } else { .ftoolframe.tools.info.entry configure -selectbackground yellow .ftoolframe.tools.info.entry configure -selectforeground black cd $dir } } bind $ft.info.hbutton { global env .ftoolframe.tools.info.entry delete 0 end .ftoolframe.tools.info.entry insert end $env(HOME) cd $env(HOME) } $ft.info.entry insert end [pwd] catch { constructToolList } err frame $ft.f2 pack $ft.f2 -side top -fill x -pady 3 -padx 3 button $ft.f2.fav -text "Add to Favorite" -width 15 -font g_titleFont button $ft.f2.run -text "Run" -command [itcl::code $this FtoolRun ] \ -width 12 -font g_titleFont button $ft.f2.cancel -text "Cancel" -command [itcl::code $this FtoolCancel ] \ -width 12 -font g_titleFont button $ft.f2.help -text "Ftool Help" -command [itcl::code $this FtoolHelp ] \ -width 12 -font g_titleFont pack $ft.f2.fav -side left -padx 20 pack $ft.f2.run -side left -padx 20 pack $ft.f2.cancel -side left -padx 20 pack $ft.f2.help -side left -padx 20 frame $ft.grip -width 10 -height 10 -background blue -bd 1 -relief raised -cursor double_arrow place $ft.grip -anchor c -relx 0.5 -rely 1.0 bind $ft.grip [itcl::code $this paneManager start %W] #bind $ft.grip [itcl::code $this paneManager motion %W %Y] bind $ft.grip [itcl::code $this paneManager stop %W] #################################### #################################### # # # Set up the Ftools Log # # # #################################### frame .ftoolframe.log -relief groove -bd 4 pack .ftoolframe.log -fill both -padx 2 -padx 2 -expand true frame .ftoolframe.log.tabcontrol -relief flat pack .ftoolframe.log.tabcontrol -fill x -padx 2 -padx 2 button .ftoolframe.log.tabcontrol.add -text "New Tab" \ -command [itcl::code $this _addNewTab ] pack .ftoolframe.log.tabcontrol.add -side left catch { xterminalTabs ::xtermTab .ftoolframe.log $this } err _addNewTab set fl .ftoolframe.log } itcl::body FtoolInstance::_addNewTab {} { incr totalXtermCnt xtermTab addPage Tab_[incr xtermCnt] } itcl::body FtoolInstance::_deleteTab {} { incr totalXtermCnt -1 xtermTab deletePage $currentPage } itcl::body FtoolInstance::_modifyTabText {} { xtermTab updateTitle $currentPage $currFtool } itcl::body FtoolInstance::_expandDirectoryView { cDirWndw } { package require Tix global pWorkingDirectory set pWorkingDirectory [.ftoolframe.tools.info.entry get] if [winfo exists .expand] { destroy .expand } toplevel .expand wm title .expand "choose working directory" wm geom .expand 300x200 frame .expand.frame -relief sunken tixDirTree .expand.frame.expandDirectoryView -value [$cDirWndw get] \ -command [itcl::code $this _changeDirectory] \ -browsecmd [itcl::code $this _changeDirectory] pack .expand.frame.expandDirectoryView -fill both -expand true pack .expand.frame -fill both -expand true frame .expand.tool button .expand.tool.cancel -text "Cancel" \ -command { global pWorkingDirectory ; \ .ftoolframe.tools.info.entry delete 0 end ; \ .ftoolframe.tools.info.entry insert end $pWorkingDirectory ; \ destroy .expand } button .expand.tool.done -text "Done" -command { destroy .expand } pack .expand.tool.cancel -padx 20 -side left pack .expand.tool.done -padx 20 -side right pack .expand.tool -fill x -expand true update idletask } itcl::body FtoolInstance::_changeDirectory { dir } { set cWorkingDirectory $dir cd $cWorkingDirectory .ftoolframe.tools.info.entry delete 0 end .ftoolframe.tools.info.entry insert end $cWorkingDirectory } itcl::body FtoolInstance::constructToolList {} { option add *TixHList.selectBackground yellow option add *TixHList.selectForeground black set ft .ftoolframe.tools if [winfo exists $ft.toolTree] { $ft.toolTree delete all } else { tixTree $ft.toolTree -browsecmd [itcl::code $this selectCmd] -options { hlist.separator # hlist.itemType imagetext hlist.drawBranch true hlist.font g_titleFont hlist.indent 18 hlist.height 12 hlist.background white } pack $ft.toolTree -fill both -expand true } set toolHList [$ft.toolTree subwidget hlist] set catagory "" set imageFlag false set flagErr [catch { image create bitmap systemIcon -data { #define system_width 15 #define system_height 15 static unsigned char system_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f, 0x02, 0x20, 0x02, 0x20, 0xfe, 0x3f, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; } } err] if { !$flagErr } { set imageFlag true image create bitmap dropIcon -data { #define drop_width 16 #define drop_height 16 #define drop_x_hot 6 #define drop_y_hot 4 static unsigned char drop_bits[] = { 0x00, 0x00, 0xfe, 0x07, 0x02, 0x04, 0x02, 0x04, 0x42, 0x04, 0xc2, 0x04, 0xc2, 0x05, 0xc2, 0x07, 0xc2, 0x07, 0xc2, 0x0f, 0xfe, 0x1f, 0xc0, 0x07, 0xc0, 0x06, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x08}; } -foreground red } image create bitmap hammerIcon -data { #define hammer2_width 13 #define hammer2_height 13 static char hammer2_bits[] = { 0x00,0x00,0xc0,0x03,0xf0,0x01,0xf8,0x01,0xf8,0x00,0x9e,0x00,0xbe,0x00,0x4c, 0x01,0x80,0x02,0x00,0x0c,0x00,0x1a,0x00,0x14,0x00,0x08}; } #################################################### # first add favorite tool item #################################################### #################################################### # add available tool item #################################################### set getFavorite true foreach targetList [list $favorite $allTools] { if { [llength $targetList] <= 0 && $getFavorite == "true" } { $toolHList add "Favorite" -image [tix getimage folder] -text Favorite continue } set targetList [lsort -increasing $targetList] set catagoryCnt 0 foreach line $targetList { if { [string range $line 0 0] == "#" || [string trim $line] == "" } { # ignore comment out tool name continue } set toolstring $delimiter set toolroot [lindex $line 0] if [string match $toolroot "Featured"] { continue } if ![string match $toolroot $catagory] { incr catagoryCnt set catagory $toolroot if ![string match $catagory "None"] { set toolstring [format "%s" $toolroot] $toolHList add $toolstring -image [tix getimage folder] -text [file tail $toolstring] } } set toolsubpath [lindex $line 1] if { $toolsubpath != "none" } { regsub -all _ $toolsubpath " " toolsubpath set toolstring [format "%s%s%s" $toolroot $delimiter $toolsubpath] if ![$toolHList info exists $toolstring] { $toolHList add $toolstring -image [tix getimage folder] -text [file tail $toolstring] $toolHList hide entry $toolstring } } else { set toolstring $toolroot } set toolpath [lindex $line 2] set tooldesc [lindex $line 3] set idx [string first $tooldesc $line] set tooldesc [string range $line $idx end] if ![string match $toolroot "None"] { set toolentry [format "%s%s%s - %s" $toolstring $delimiter $toolpath $tooldesc] set toolstring [format "%s - %s" $toolpath $tooldesc] } else { set toolstring [format "%s - %s" $toolpath $tooldesc] } if { $imageFlag == "false" } { $toolHList add $toolentry -image [tix getimage system] -text $toolstring } else { $toolHList add $toolentry -image hammerIcon -text $toolstring } if ![string match $toolroot "None"] { $toolHList hide entry $toolentry } } if { $getFavorite == "true" } { set getFavorite "false" set childrenList [$toolHList info children "Favorite"] for {set i 0} {$i < [llength $childrenList]} {incr i} { $toolHList show entry [lindex $childrenList $i] } } update idletask } $ft.toolTree autosetmode bind $toolHList [itcl::code $this runTool] update scan [winfo geometry $toolHList] "%dx%d+%d+%d" Rw Rh Rx Ry set textheight [$toolHList cget -height] set toolHListTextRatio [expr $Rh / $textheight] } itcl::body FtoolInstance::MenuInit {} { .ftoolframe.menu.favorite.menu entryconfigure 2 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 3 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 4 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 1 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 3 -state disabled .ftoolframe.menu.help.menu entryconfigure 2 -state disabled .ftoolframe.tools.f2.fav configure -state disable .ftoolframe.tools.f2.run configure -state disable #bind .ftoolframe.tools.f1.list {} .ftoolframe.tools.f2.cancel configure -state disable .ftoolframe.tools.f2.help configure -state disable $logtext configure -state disabled } itcl::body FtoolInstance::PackageMenu {} { global g_titleFont set fm .ftoolframe.menu set m1 .ftoolframe.menu.packages.menu $m1 delete 1 end set packagelist [list "asca" "caltools" "einstein" "exosat" "fimage" \ "futils" "gro" "heao1" "heasarc" "oso" "rosat" "time" "vela5b" "xronos" \ "xte" ] set numPacks [llength $packagelist] for { set i 0 } { $i < $numPacks } {incr i } { set package [lindex $packagelist $i] set b [SearchDir $helpPath $package.txt] if {$b != ""} { $m1 add command -label $package \ -font g_titleFont \ -command [itcl::code $this PackageGet $package ] } } } itcl::body FtoolInstance::PackageGet {package } { set currPackage $package if [winfo exists .ftoolframe.tools.info.label ] { .ftoolframe.tools.info.label configure -text $package } if [winfo exists $wlist ] { $wlist delete 0 end set txtfile [ SearchDir $helpPath $package.txt] set channel [open $txtfile r] set i 0 while {[gets $channel line ] >= 0 } { incr i set line [string trim $line ] if {$line == ""} { continue } set line [string trim $line \#\*\+] set line [string trim $line ] if [regexp ^\[P\] $line] { break } if { [string first " - " $line] == -1 } { set line [string trim $line] set line "$temp $line" $wlist delete end } $wlist insert end $line set temp $line } close $channel #.ftoolframe.tools.f1.list selection set 0 .ftoolframe.tools.f2.fav configure -command [itcl::code $this FavoriteAdd] .ftoolframe.tools.f2.fav configure -text "Add to Favorite" .ftoolframe.tools.f2.fav configure -state normal .ftoolframe.tools.f2.run configure -state normal # bind .ftoolframe.tools.f1.list [itcl::code $this FtoolRun ] .ftoolframe.tools.f2.cancel configure -state disabled .ftoolframe.tools.f2.help configure -state normal .ftoolframe.menu.ftool.menu entryconfigure 1 -state normal .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 3 -state normal .ftoolframe.menu.help.menu entryconfigure 2 -state normal if {$i > 0} { .ftoolframe.menu.favorite.menu entryconfigure 2 -state normal } else { .ftoolframe.menu.favorite.menu entryconfigure 2 -state disabled } } .ftoolframe.menu.favorite.menu entryconfigure 3 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 4 -state disabled } itcl::body FtoolInstance::FavoriteGet {} { global g_titleFont if [winfo exists .ftoolframe.tools.info.label ] { .ftoolframe.tools.info.label configure -text "My favorite" -font g_titleFont } #if [winfo exists $wlist ] { constructToolList #.ftoolframe.tools.f2.fav configure -command [itcl::code $this FavoriteDelete] #.ftoolframe.tools.f2.fav configure -text "Delete " .ftoolframe.menu.favorite.menu entryconfigure 2 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 3 -state normal # $wlist delete 0 end # set num [FavoriteCheck] # if {$num == 0} { # return # } # for {set i 0} {$i < $num} {incr i} { # $wlist insert end [lindex $favorite $i] # } # $wlist selection set 0 #} } itcl::body FtoolInstance::FavoriteReset {} { set favorite "" #.ftoolframe.tools.f1.list delete 0 end } itcl::body FtoolInstance::ConfigSet {} { global g_titleFont set tmp_ftoolPath $ftoolPath set tmp_parPath $parPath set tmp_helpPath $helpPath set tmp_autoSave $autoSave set tmp_autoClear $autoClear toplevel .cframe -class Dialog wm title .cframe "fgui: Ftool Configuration " frame .cframe.frm -relief groove -bd 2 pack .cframe.frm -side top -ipadx 2 -ipadx 2 frame .cframe.frm.ft set f1 .cframe.frm.ft label $f1.label -text "Ftool Path" -width 15 -anchor w -font g_titleFont entry $f1.entry -textvariable [itcl::scope tmp_ftoolPath ] -width 40 \ -font g_titleFont pack $f1.label -side left -anchor w pack $f1.entry -side left -anchor w frame .cframe.frm.fp set f2 .cframe.frm.fp label $f2.label -text "Par File Path" -width 15 -anchor w -font g_titleFont entry $f2.entry -textvariable [itcl::scope tmp_parPath ] -width 40 \ -font g_titleFont pack $f2.label -side left -anchor w pack $f2.entry -side left -anchor w frame .cframe.frm.fh set f3 .cframe.frm.fh label $f3.label -text "Help File Path" -width 15 -anchor w -font g_titleFont entry $f3.entry -textvariable [itcl::scope tmp_helpPath ] -width 40 \ -font g_titleFont pack $f3.label -side left -anchor w pack $f3.entry -side left -anchor w frame .cframe.frm.fo set f4 .cframe.frm.fo checkbutton $f4.save -variable [itcl::scope tmp_autoSave] \ -onvalue 1 -offvalue 0 \ -text "Save the parameter file automatically" -font g_titleFont checkbutton $f4.clear -variable [itcl::scope tmp_autoClear] \ -onvalue 1 -offvalue 0 \ -text "Clear the Log window automatically" -font g_titleFont pack $f4.save -side top -anchor w pack $f4.clear -side top -anchor w pack $f1 -side top -anchor w -fill x pack $f2 -side top -anchor w -fill x pack $f3 -side top -anchor w -fill x pack $f4 -side top -anchor w -fill x frame .cframe.cmd pack .cframe.cmd -side top -padx 5 -pady 5 -fill x button .cframe.cmd.ok -text "OK" -command [itcl::code $this ConfigOk ] -font g_titleFont button .cframe.cmd.cancel -text "Cancel" -command {destroy .cframe} -font g_titleFont pack .cframe.cmd.ok -side left -padx 10 pack .cframe.cmd.cancel -side right -padx 10 } itcl::body FtoolInstance::ConfigOk {} { global env set ftoolPath [string trim $tmp_ftoolPath] set parPath [string trim $tmp_parPath] set helpPath [string trim $tmp_helpPath] set autoSave [string trim $tmp_autoSave ] set autoClear [string trim $tmp_autoClear ] # set env(FTOOLS) $ftoolPath if {$ftoolPath != "" } { set env(PATH) "$ftoolPath;$origPath" } set env(LHEA_HELP) $helpPath if {$helpPath == "" } { unset env(LHEA_HELP) } set env(PFILES) $parPath if {$parPath == "" } { unset env(PFILES) } PackageMenu MenuInit if [winfo exists $wlist ] { $wlist delete 0 end } ParClear set currFtool "" destroy .cframe } itcl::body FtoolInstance::HelpGet {} { hhelp ftool } itcl::body FtoolInstance::FtoolHelp {} { set fhelpname $runcmd displayHelpMessage $runcmd } itcl::body FtoolInstance::FtoolRun {} { global tcl_platform env global oldHOME oldPFILES # if it is the new ftool, initialize it. .ftoolframe.tools.f2.run configure -state disabled #bind .ftoolframe.tools.f1.list {} .ftoolframe.tools.f2.cancel configure -state normal .ftoolframe.menu.favorite.menu entryconfigure 2 -state normal # set temp [ FtoolGet ] set temp $runcmd if {$currFtool != $temp } { ParClear set currFtool $temp set isParTool [ ParExist ] if {$isParTool == 1} { ParSet } } # open the dialog if {$isParTool == 1} { ParDialog tkwait window .pframe } else { CmdDialog tkwait window .cmdframe } # run the command if {$goodCommand == 0} { .ftoolframe.tools.f2.run configure -state normal #bind .ftoolframe.tools.f1.list [itcl::code $this FtoolRun ] .ftoolframe.tools.f2.cancel configure -state disabled .ftoolframe.menu.ftool.menu entryconfigure 1 -state normal .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled return } else { # set curPos [$logtext index end] if {$autoClear == 1} { # LogClear } } if {$isParTool == 1} { if { $tcl_platform(platform) == "windows" } { #set currFtool ${currFtool}.exe } set currCmd $currFtool set npar [llength $currParList] if {$npar < 1} { return } for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] set parname [$objname cget -name] set parvalue [$objname cget -value] if {$parname == "page" } { set parvalue "no" } if {$parname == "confirm" } { set parvalue "no" } if {$parname == "proceed" } { set parvalue "yes" } if {$parvalue == "" } { set parvalue " " } if { $tcl_platform(platform) == "windows" } { # since we are going to work around the cygwin structure, the file # needs to be in full path # if ![file exists $parvalue] { # if [file exists [pwd]/$parvalue] { # set parvalue [pwd]/$parvalue # } # } } set currCmd "$currCmd \"${parname}=${parvalue}\" " } } set n [string length $currCmd] set n1 $n set cmdstr "" set i 0 while {$n1 > 0} { if { $n1 > 80 } { set j [expr $i + 79] } else { set j $n } set cmdstr "$cmdstr [string range $currCmd $i $j] \n" set i [expr $j + 1 ] set n1 [expr $n1 - 80] } set toolServer [gToolServer $currFtool] set xTerminal $xTerminalList($currentPage) _modifyTabText $xTerminal changeToolServer $toolServer [gNotifications default] addObserver $this notify $toolServer "*" $xTerminal addToHistory "$currCmd" $xTerminal appendOutput "$currCmd" OutputChannel USER_INPUT $toolServer runTool $currCmd } itcl::body FtoolInstance::FtoolRunInteractive { cmd } { set tokenList [split $cmd " "] set currFtool [lindex $tokenList 0] set toolServer [gToolServer $currFtool] [gNotifications default] addObserver $this notify $toolServer "*" $toolServer runTool $cmd _modifyTabText return $toolServer } itcl::body FtoolInstance::notify { obj msg opts } { global toolHasFinishFlag set idx [string first " " $msg] set msgType [string range $msg 0 [expr $idx - 1]] set nextMessage [string range $msg [expr $idx + 1] end] set xTerminal $xTerminalList($currentPage) switch -- $msgType { "toolHasFinished" { set toolHasFinishFlag($toolServer) true FtoolTerminate $toolServer shutdownToolServer $xTerminal setToolName "cmd" $xTerminal appendOutput "cmd> " OutputChannel $xTerminal changeToolServer NONE return } "toolHasOutputAvailable" { catch { $xTerminal appendOutput $nextMessage OutputChannel } err set toolHasFinishFlag($toolServer) continue return } "toolHasErrorAvailable" { catch { $xTerminal appendOutput $nextMessage ErrorChannel } err set toolHasFinishFlag($toolServer) continue return } } } itcl::body FtoolInstance::FtoolTerminate {} { global g_fitsFileMode global oldHOME oldPFILES env tcl_platform if { $tcl_platform(platform) == "windows" } { if { [file exists $env(CYGWIN_HOME)/pfiles/${currFtool}.par] && \ $env(CYGWIN_HOME) != "$env(WIN_HOME)" } { file copy -force $env(CYGWIN_HOME)/pfiles/${currFtool}.par $env(WIN_HOME)/pfiles/${currFtool}.par } } set ::env(HOME) $oldHOME set ::env(PFILES) $oldPFILES set parPath $env(PFILES) # display the file header set num [llength $outputFits] for {set i 0} {$i < $num} {incr i} { set ftooloutput [lindex $outputFits $i] set ftooloutput [string trim $ftooloutput] set ftooloutput [string trim $ftooloutput \!] set oldMode $g_fitsFileMode # Set Read-Only flag set g_fitsFileMode 1 set tmp [openFitsFile $ftooloutput] $tmp changeFile set g_fitsFileMode $oldMode } # save the par file if {$autoSave == 1 && $goodCommand == 1 && $isParTool == 1 } { ParSave } .ftoolframe.tools.f2.run configure -state normal .ftoolframe.tools.f2.cancel configure -state disabled .ftoolframe.menu.ftool.menu entryconfigure 1 -state normal .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled return } itcl::body FtoolInstance::FtoolCancel {} { if {$logchan != "" } { catch {close $logchan} } .ftoolframe.tools.f2.run configure -state normal #bind .ftoolframe.tools.f1.list [itcl::code $this FtoolRun ] .ftoolframe.tools.f2.cancel configure -state disabled .ftoolframe.menu.ftool.menu entryconfigure 1 -state normal .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled } itcl::body FtoolInstance::FavoriteSave {} { global env set f [open $env(HOME)/.fguiFavorite w+] foreach entry $favorite { set token [split $entry " "] set catagory [lindex $token 0] set toolName [lindex $token 2] set toolDesc [lindex $token 3] set idx [string first $toolDesc $entry] set toolDesc [string range $entry $idx end] set outputStr [format "%s%s%s - %s" $catagory $delimiter $toolName $toolDesc] puts $f $outputStr } close $f } itcl::body FtoolInstance::FavoriteAdd { { entry "none" } } { global env set action addGroup set entryList {} if { $entry == "none" } { lappend entryList [lindex [$toolHList info selection] 0] set action addOneItem } else { if [file exists $env(HOME)/.fguiFavorite] { set f [open $env(HOME)/.fguiFavorite r] set entryList [split [read $f [file size $env(HOME)/.fguiFavorite]] \n] close $f } } if { [llength $favorite] > 0 } { set childrenList [$toolHList info children "Favorite"] for {set i 0} {$i < [llength $childrenList]} {incr i} { $toolHList show entry [lindex $childrenList $i] } } foreach entry $entryList { set entry [string trim $entry] if { $entry == "" } continue set catagory [lindex [split $entry $delimiter] 0] set toolInfo [lindex [split $entry $delimiter] 1] set toolName [string trim [lindex [split $toolInfo "-"] 0]] set toolDesc [string trim [lindex [split $toolInfo "-"] 1]] set idx [string first $toolDesc $entry] set toolDesc [string range $entry $idx end] set outputStr [format "%s none %s %s" "Favorite" $toolName $toolDesc] set idx [lsearch -exact $favorite $outputStr] if { $idx < 0 } { lappend favorite $outputStr if { $action == "addOneItem" } { set addEntry [format "Favorite%s%s" $delimiter $toolInfo] if { $imageFlag == "false" } { $toolHList add $addEntry -image [tix getimage system] -text $toolInfo } else { $toolHList add $addEntry -image hammerIcon -text $toolInfo } } } } if [winfo exists .ftoolframe.tools.toolTree] { .ftoolframe.tools.toolTree autosetmode } FavoriteSave return $favorite } itcl::body FtoolInstance::FavoriteDelete {} { set select [lindex [$toolHList info selection] 0] set selectionList [$toolHList info children $select] if { [llength $selectionList] <= 0 } { # child lappend selectionList $select } foreach selection $selectionList { set catagory [string trim [lindex [split $selection $delimiter] 0]] set toolName [string trim [lindex [split [lindex [split $selection $delimiter] 1] "-"] 0]] set parent [$toolHList info parent $selection] $toolHList delete entry $selection set idx [lsearch -glob $favorite "$catagory none $toolName *"] set favorite [lreplace $favorite $idx $idx] # check to see if parent has no more child set children [$toolHList info children $parent] } if [winfo exists .ftoolframe.tools.toolTree] { .ftoolframe.tools.toolTree autosetmode } FavoriteSave } itcl::body FtoolInstance::FtoolGet {} { set i [$wlist curselection] set temp [$wlist get $i] set temp [split $temp] return [lindex $temp 0] } itcl::body FtoolInstance::FavoriteCheck {} { set num [llength $favorite] if {$num == 0 } { .ftoolframe.tools.f2.fav configure -state disable .ftoolframe.tools.f2.run configure -state disable #bind .ftoolframe.tools.f1.list {} .ftoolframe.tools.f2.cancel configure -state disable .ftoolframe.tools.f2.help configure -state disable .ftoolframe.menu.ftool.menu entryconfigure 1 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 3 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 2 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 3 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 4 -state disabled .ftoolframe.menu.help.menu entryconfigure 2 -state disabled } else { .ftoolframe.tools.f2.fav configure -state normal .ftoolframe.tools.f2.run configure -state normal #bind .ftoolframe.tools.f1.list [itcl::code $this FtoolRun ] .ftoolframe.tools.f2.cancel configure -state disabled .ftoolframe.tools.f2.help configure -state normal .ftoolframe.menu.ftool.menu entryconfigure 1 -state normal .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 3 -state normal .ftoolframe.menu.favorite.menu entryconfigure 2 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 3 -state normal .ftoolframe.menu.favorite.menu entryconfigure 4 -state normal .ftoolframe.menu.help.menu entryconfigure 2 -state normal } return $num } itcl::body FtoolInstance::LogClear {} { $logtext configure -state normal $logtext delete 1.0 end $logtext configure -state disabled eval { $logtext tag delete } [$logtext tag names] set cmdNum 0 } itcl::body FtoolInstance::LogError {} { $logtext configure -state normal $logtext insert end \ "$currFtool needs runtime input and can not be handled by Fv. \n" $logtext configure -state disabled FtoolCancel } itcl::body FtoolInstance::ParExist {} { global env tcl_platform set homeDir $env(HOME) set pfile "${currFtool}.par" set b [split $parPath \;] set localPFileDir $env(HOME)/pfiles if ![file exists $localPFileDir] { file mkdir $localPFileDir } if { $tcl_platform(platform) == "windows" } { set currParFile [file join $localPFileDir $pfile] if ![ file exists $currParFile ] { set currParFile [file join $env(PFILES) $pfile] if { [file type $currParFile] == "link" } { file copy -force [_resolveSymLinks $currParFile] $localPFileDir } else { file copy -force $currParFile $localPFileDir } set currParFile [file join $localPFileDir [file tail $currParFile]] set ::env(PFILES) $localPFileDir } return 1 } else { for { set i 0 } { $i < [llength $b] } { incr i } { set dir0 [lindex $b $i] set currParFile [file join $dir0 $pfile] if [ file exists $currParFile ] { if { $dir0 != $localPFileDir } { if { [file type $currParFile] == "link" } { file copy -force [_resolveSymLinks $currParFile] $localPFileDir } else { file copy -force $currParFile $localPFileDir } set currParFile [file join $localPFileDir [file tail $currParFile]] } return 1 } } } set tmpfile [SearchDir $parPath $pfile] if { $tmpfile != "" && [file type $tmpfile] == "link" } { set tmpfile [format "%s/%s" [file dirname $tmpfile] [file readlink $tmpfile]] } if {$tmpfile != "" } { file copy -force $tmpfile $currParFile } if ![ file exists $currParFile ] { return 0 } return 1 } itcl::body FtoolInstance::ParSet {} { set parObjs "" set currParList "" set pchannel [open $currParFile r] set resultList {} set descrWidth 0 while { [gets $pchannel line] >=0 } { set line [string trim $line] if [regexp ^\# $line ] { continue } set par [split $line \,] set parname [string trim [lindex $par 0] ] if {$parname ==""} { continue } set entry {} lappend entry $parname set parvalue [string trim [lindex $par 3] ] lappend entry [string trim $parvalue \"] set pardescr [string trim [lindex $par 6] ] set pardescr [string trim $pardescr \"] if { [string length $pardescr] > $descrWidth } { set descrWidth [string length $pardescr] } lappend entry $pardescr lappend entry [string trim [lindex $par 1] ] lappend entry [string trim [lindex $par 2] ] lappend resultList $entry } for { set i 0 } {$i < [llength $resultList]} { incr i } { set entry [lindex $resultList $i] if { $entry == {} } continue set parname [lindex $entry 0] set parvalue [lindex $entry 1] set pardescr [lindex $entry 2] set partype [lindex $entry 3] set parmode [lindex $entry 4] lappend currParList $parname set objname par_${parname} FtoolParameter $objname $parname $parvalue $partype $parmode \ $pardescr $descrWidth $this lappend parObjs $objname } close $pchannel } itcl::body FtoolInstance::ParSave {} { set buffer "" set pchannel [open $currParFile r+] while { [gets $pchannel line] >=0 } { lappend buffer $line } close $pchannel set cauto a if ![string match l [par_mode cget -value] ] { set cauto x } set pchannel [open "partemp.par" w] set npar [llength $currParList] for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] set line [lindex $buffer $i] set temp [split $line \,] set parvalue [lindex $temp 3] set parmode [lindex $temp 2] set partype [lindex $temp 1] set currvalue [$objname cget -value] set currvalue [string trim $currvalue] set parvalue [string trim $parvalue] if ![ string match {[l$cauto]} $parmode ] { puts $pchannel $line continue } if { $partype == "s" } { set currvalue "\"$currvalue\"" } if {$parvalue != $currvalue } { set temp [lreplace $temp 3 3 $currvalue] set line [join $temp \,] } puts $pchannel $line } close $pchannel file copy -force "partemp.par" $currParFile file delete "partemp.par" } itcl::body FtoolInstance::ParClear {} { set npar [llength $currParList] if {$npar == 0 } { return } for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] itcl::delete object $objname } set parObjs "" set currParList "" set outputFits "" } itcl::body FtoolInstance::ParDialog {} { set pfile "${currFtool}.par" if [winfo exists .pframe] { destroy .pframe } if [winfo exists .cmdframe] { destroy .cmdframe } toplevel .pframe -class Dialog wm title .pframe "fgui: $pfile" frame .pframe.title set title .pframe.title label $title.name -text "Name" -width 10 -anchor w label $title.descr -text "Description" -width 33 -anchor w label $title.value -text "Value" -width 20 -anchor w # label $title.isfits -text "Fits?" -width 5 -anchor w # label $title.isoutput -text "Output?" -width 7 -anchor w label $title.browser -text "" -width 6 -anchor w pack $title.name -side left -ipadx 1 pack $title.descr -side left -ipadx 1 pack $title.value -side left -ipadx 1 # pack $title.isfits -side left -ipadx 1 # pack $title.isoutput -side left -ipadx 1 pack $title.browser -side left -ipadx 1 pack $title -fill x frame .pframe.params text .pframe.params.list -yscrollcommand {.pframe.params.scrolly set } \ -wrap none -width 80 scrollbar .pframe.params.scrolly -orient vertical \ -command {.pframe.params.list yview} pack .pframe.params.scrolly -side right -fill both pack .pframe.params.list -side left -fill both -expand true pack .pframe.params -side top -fill both -expand true set fpar .pframe.params.list ParsRedraw $fpar frame .pframe.commands set pfm .pframe.commands checkbutton $pfm.hidden -variable [itcl::scope showHidden] -onvalue 1 -offvalue 0 \ -text "Show hidden" -command [itcl::code $this ParsRedraw $fpar] button $pfm.reset -text "Reset to System Default" -width 20 \ -command [itcl::code $this ParsReset $fpar ] button $pfm.help -text Help -width 6 -command [itcl::code $this FtoolHelp] button $pfm.cancel -text Cancel -width 6 -command [itcl::code $this ParsCancel] button $pfm.ok -text OK -width 6 -command [itcl::code $this ParsOk] pack $pfm.hidden -side left -padx 10 pack $pfm.reset -side left -padx 10 pack $pfm.help -side right -padx 10 pack $pfm.cancel -side right -padx 10 pack $pfm.ok -side right -padx 10 pack $pfm -side top -fill x -pady 5 } itcl::body FtoolInstance::ParsReset {fpar} { global env # force to recopy the system one. if { [string first "syspfiles" $currParFile] < 0 } { file delete $currParFile } ParClear if [ ParExist ] { ParSet } ParsRedraw $fpar } itcl::body FtoolInstance::ParsRedraw {fpar } { set npar [llength $currParList] if {$npar < 1} { return } $fpar delete 1.0 end set nshow 0 set f [open ${par2Path}/${runcmd}.par2 r] set par2Content [split [read $f [file size ${par2Path}/${runcmd}.par2]] \n] close $f if {$showHidden == 1} { for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] set retList [$objname GetParameter $par2Content $fpar $frameWidth $prevNameLen $prevDescrLen] set frameWidth [lindex $retList 0] set prevNameLen [lindex $retList 1] set prevDescrLen [lindex $retList 2] set cf [$objname cget -cframe] $fpar window create end -window $cf $fpar insert end "\n" incr nshow } set cauto a if ![string match q [par_mode cget -value] ] { set cauto x } for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] set parmode [$objname cget -mode] if [ string match {[q$cauto]} $parmode ] { set cf [ $objname cget -cframe ] ${cf}.name configure -bg green } } } else { set cauto x if [string match h [par_mode cget -value] ] { set cauto a } for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] set parmode [$objname cget -mode] if {$parmode == "h" || $parmode == $cauto} { continue } set retList [$objname GetParameter $par2Content $fpar $frameWidth $prevNameLen $prevDescrLen] set frameWidth [lindex $retList 0] set prevNameLen [lindex $retList 1] set prevDescrLen [lindex $retList 2] set cf [$objname cget -cframe] ${cf}.name configure -bg green $fpar window create end -window $cf $fpar insert end "\n" incr nshow } } set nshow [expr $nshow*2] if {$nshow > 24 } { set nshow 24 } $fpar configure -height $nshow } itcl::body FtoolInstance::ParsCancel {} { set goodCommand 0 ParClear ParSet destroy .pframe } itcl::body FtoolInstance::ParsOk {} { set npar [llength $currParList] if {$npar < 1} { set goodCommand 0 destroy .pframe return } # validify the parameter value for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] set status [$objname CheckParameter] if {$status == 1} { set goodCommand 0 focus .pframe raise .pframe return } } # check the output fits set outputFits "" for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] set isoutput [$objname cget -isOutput] set isfits [$objname cget -isFits] if {$isoutput == 1 && $isfits == 1} { lappend outputFits [$objname cget -value] } } set goodCommand 1 destroy .pframe } itcl::body FtoolInstance::CmdDialog {} { global g_titleFont if [winfo exists .pframe] { destroy .pframe } if [winfo exists .cmdframe] { destroy .cmdframe } toplevel .cmdframe -class Dialog wm title .cmdframe "fgui: $currFtool" set tmp_currCmd $currFtool frame .cmdframe.cmd -relief groove set fc .cmdframe.cmd label $fc.labelc -text "Command" -anchor w entry $fc.entryc -textvariable [itcl::scope tmp_currCmd] -width 40 \ -font g_titleFont label $fc.labelo -text "Output Fits File" -anchor w entry $fc.entryo -textvariable [itcl::scope tmp_outputFits] -width 40 \ -font g_titleFont pack $fc.labelc -side top -anchor w -padx 2 -pady 2 pack $fc.entryc -side top -anchor w -padx 2 -pady 2 pack $fc.labelo -side top -anchor w -padx 2 -pady 2 pack $fc.entryo -side top -anchor w -padx 2 -pady 2 pack $fc -fill x frame .cmdframe.buttons set fb .cmdframe.buttons button $fb.help -text Help -width 6 -command [itcl::code $this FtoolHelp] button $fb.cancel -text Cancel -width 6 -command [itcl::code $this CmdCancel] button $fb.ok -text OK -width 6 -command [itcl::code $this CmdOk] pack $fb.help -side right -padx 10 pack $fb.cancel -side right -padx 10 pack $fb.ok -side right -padx 10 pack $fb -side top -fill x -pady 5 } itcl::body FtoolInstance::CmdCancel {} { set goodCommand 0 destroy .cmdframe } itcl::body FtoolInstance::CmdOk {} { set currCmd $tmp_currCmd set outputFits $tmp_outputFits set goodCommand 1 destroy .cmdframe } itcl::body FtoolInstance::DumpText {wtext chan args} { if [eof $chan] { catch {close $chan} if { [llength $args ] > 0 } { set termcmd [lindex $args 0] $termcmd } return } gets $chan line $wtext configure -state normal $wtext insert end "$line \n" $wtext configure -state disabled } itcl::body FtoolInstance::SearchDir {pathname filename} { set b [split $pathname \;\:] for {set i 0} {$i < [llength $b] } {incr i} { set dirf [lindex $b $i] set fullfile [file join $dirf $filename] if [file exists $fullfile] { return $fullfile } } return "" } itcl::body FtoolInstance::processToolList { package fd } { global env tcl_platform set temp "" set reminderStrFound false while {[gets $fd line ] >= 0 } { set line [string trim $line ] if {$line == ""} { continue } set line [string trim $line \#\*\+] set line [string trim $line ] if { [regexp {^\[P\]} $line] == 1 } { break } if { [string first " - " $line] == -1 } { set line [string trim $line] if { $temp != "" } { set reminderStrFound true set line "$temp $line" } # set allTools [lreplace $allTools end end] } else { set reminderStrFound false set temp "" regsub " - " $line " " line } set tool [file join $env(HEADAS)/bin [lindex $line 0]] if { $tcl_platform(platform) == "windows" } { set tool ${tool}.exe } if { $reminderStrFound == "false" } { set line [format "%s none %s" $package $line] } set temp $line if [file exists $tool] { lappend allTools $line } } } itcl::body FtoolInstance::runTool {} { set selection [$toolHList info selection] if { [lsearch -exact $availablePackage $selection] < 0 } { set runcmd [string trim [lindex [split [lindex [split $selection "-"] 0] "#"] 1]] } else { return } .ftoolframe.tools.f2.run configure -state normal .ftoolframe.menu.favorite.menu entryconfigure 3 -state normal .ftoolframe.tools.f2.fav configure -command [itcl::code $this FavoriteAdd] .ftoolframe.tools.f2.fav configure -text "Add to Favorite" .ftoolframe.tools.f2.fav configure -state normal .ftoolframe.menu.favorite.menu entryconfigure 2 -state normal .ftoolframe.menu.favorite.menu entryconfigure 3 -state disable .ftoolframe.tools.f2.run configure -state normal .ftoolframe.tools.f2.cancel configure -state disabled .ftoolframe.tools.f2.help configure -state normal .ftoolframe.menu.ftool.menu entryconfigure 1 -state normal .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 3 -state normal .ftoolframe.menu.help.menu entryconfigure 2 -state normal FtoolRun } itcl::body FtoolInstance::selectCmd { args } { set selection [lindex [$toolHList info selection] 0] set currSelection $selection set favoriteList false set children [$toolHList info children $selection] if { [lsearch -exact $availablePackage $selection] < 0 } { set runcmd [string trim [lindex [split [lindex [split $selection "-"] 0] "#"] 1]] .ftoolframe.tools.f2.run configure -state normal .ftoolframe.menu.favorite.menu entryconfigure 3 -state normal set catagory [string trim [lindex [split [lindex [split $selection "-"] 0] "#"] 0]] if { $catagory == "Favorite" } { .ftoolframe.tools.f2.fav configure -command [itcl::code $this FavoriteDelete] .ftoolframe.tools.f2.fav configure -text "Delete from Favorite" -width 20 .ftoolframe.menu.favorite.menu entryconfigure 3 -state normal .ftoolframe.menu.favorite.menu entryconfigure 2 -state disable } else { .ftoolframe.tools.f2.fav configure -command [itcl::code $this FavoriteAdd] .ftoolframe.tools.f2.fav configure -text "Add to Favorite" .ftoolframe.menu.favorite.menu entryconfigure 2 -state normal .ftoolframe.menu.favorite.menu entryconfigure 3 -state disable } .ftoolframe.tools.f2.fav configure -state normal .ftoolframe.tools.f2.run configure -state normal .ftoolframe.tools.f2.cancel configure -state disabled .ftoolframe.tools.f2.help configure -state normal .ftoolframe.menu.ftool.menu entryconfigure 1 -state normal .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 3 -state normal .ftoolframe.menu.help.menu entryconfigure 2 -state normal } else { return } } itcl::body FtoolInstance::changeBrowser {} { global g_titleFont set top .changeBrowserWndw toplevel .changeBrowserWndw wm geometry $top +[winfo pointerx .]+[winfo pointery .] wm title .changeBrowserWndw "Choose Your Browser Preference" label $top.label1 -text "FGui uses your standard Web browser to display help text and other" \ -font [list Helvetica 12 ] label $top.label2 -text "information. Please enter the command (or full path) used to start" \ -font [list Helvetica 12 ] label $top.label3 -text "your browser (e.g., netscape, firefox, safari, opera, ..) here: \n" \ -font [list Helvetica 12 ] entry $top.entry -text "" -width 20 -background white -font g_titleFont label $top.label4 -text "\nYou may modify your browse preference in \"Preference\" at any time" \ -font [list Helvetica 12 ] label $top.label5 -text "under the \"Action\" button at the upper left of the main Hera window.\n" \ -font [list Helvetica 12 ] grid $top.label1 -row 0 -column 0 -columnspan 10 -sticky nws grid $top.label2 -row 1 -column 0 -columnspan 10 -sticky nws grid $top.label3 -row 2 -column 0 -columnspan 10 -sticky nws grid $top.entry -row 3 -column 3 -columnspan 6 -sticky nws grid $top.label4 -row 4 -column 0 -columnspan 10 -sticky nws grid $top.label5 -row 5 -column 0 -columnspan 10 -sticky nws frame $top.actionFrame set actionFrame $top.actionFrame button $actionFrame.ok -text "Go" -command [itcl::code $this updateBrowserSetting] button $actionFrame.cancel -text "Cancel" -command [itcl::code $this updateBrowserSetting] grid $actionFrame.ok -row 0 -column 4 grid $actionFrame.cancel -row 0 -column 5 grid $actionFrame -row 6 -column 0 -columnspan 10 -sticky news focus $top.entry update idletask bind $top.entry [itcl::code $this updateBrowserSetting] } itcl::body FtoolInstance::changeHeadasRoot {} { global g_titleFont set top .changeHeadasRootWndw toplevel .changeHeadasRootWndw wm geometry $top +[winfo pointerx .]+[winfo pointery .] wm title .changeHeadasRootWndw "Set Headas Root Directory " label $top.label1 -text "FGui will need the root directory of installed Ftools package" \ -font [list Helvetica 12 ] label $top.label2 -text "to accurately run ftools command. Please enter the full path" \ -font [list Helvetica 12 ] label $top.label3 -text "or use \"browse\" button select the directory name." \ -font [list Helvetica 12 ] entry $top.entry -text "" -width 50 -background white -font g_titleFont button $top.browse -text "browse" -font g_titleFont label $top.label4 -text "\nYou may modify the directory path in \"Preference\" at any time " \ -font [list Helvetica 12 ] label $top.label5 -text "under the \"Action\" button at the upper left of the main FGui window.\n" \ -font [list Helvetica 12 ] grid $top.label1 -row 0 -column 0 -columnspan 10 -sticky nws grid $top.label2 -row 1 -column 0 -columnspan 10 -sticky nws grid $top.label3 -row 2 -column 0 -columnspan 10 -sticky nws grid $top.entry -row 3 -column 3 -columnspan 5 -sticky nws grid $top.browse -row 3 -column 9 -sticky nws grid $top.label4 -row 4 -column 0 -columnspan 10 -sticky nws grid $top.label5 -row 5 -column 0 -columnspan 10 -sticky nws frame $top.actionFrame set actionFrame $top.actionFrame button $actionFrame.ok -text "Go" -command [itcl::code $this updateHeadasRootSetting] button $actionFrame.cancel -text "Cancel" -command [itcl::code $this updateHeadasRootSetting] grid $actionFrame.ok -row 0 -column 4 grid $actionFrame.cancel -row 0 -column 5 grid $actionFrame -row 6 -column 0 -columnspan 10 -sticky news bind $top.entry [itcl::code $this updateHeadasRootSetting] bind $top.browse { %W configure -cursor hand2 } bind $top.browse [itcl::code $this _expandDirectoryViewX .changeHeadasRootWndw.entry] bind $top.entry { set dir [%W get] focus .changeHeadasRootWndw.entry .changeHeadasRootWndw.entry selection range 0 end if ![file exists $dir] { .changeHeadasRootWndw.entry configure -selectbackground red .changeHeadasRootWndw.entry configure -selectforeground white tk_messageBox -icon warning -type ok \ -message "$dir does not exists, operation might failed." } else { .changeHeadasRootWndw.entry configure -selectbackground yellow .changeHeadasRootWndw.entry configure -selectforeground black } fguiPref save } } itcl::body FtoolInstance::updateHeadasRootSetting {} { set setting [string trim [.changeHeadasRootWndw.entry get]] set previousChoice $::fguiPref::FtoolsHeadasRoot if { $setting == "" } { set ::fguiPref::FtoolsHeadasRoot $previousChoice } else { set ::fguiPref::FtoolsHeadasRoot $setting fguiPref save } destroy .changeHeadasRootWndw } itcl::body FtoolInstance::_expandDirectoryViewX { cDirWndw } { package require Tix global pDirectory set pDirectory [pwd] if [winfo exists .expandDVx] { destroy .expandDVx } toplevel .expandDVx wm title .expandDVx "choose Headas Root directory" wm geom .expandDVx 300x200 frame .expandDVx.frame -relief sunken tixDirTree .expandDVx.frame.expandDirectoryView -value [pwd] \ -command [itcl::code $this _changeDirectoryX] \ -browsecmd [itcl::code $this _changeDirectoryX] pack .expandDVx.frame.expandDirectoryView -fill both -expand true pack .expandDVx.frame -fill both -expand true frame .expandDVx.tool button .expandDVx.tool.done -text "Done" \ -command { global pDirectory env ; \ .changeHeadasRootWndw.entry delete 0 end ; \ .changeHeadasRootWndw.entry insert end $pDirectory; \ fguiPref save ; \ set ::env(LHEASOFT) $pDirectory ; \ destroy .expandDVx } pack .expandDVx.tool.done -padx 20 -side right pack .expandDVx.tool -fill x -expand true update idletask } itcl::body FtoolInstance::_changeDirectoryX { dir } { global pDirectory env set pDirectory $dir .changeHeadasRootWndw.entry delete 0 end .changeHeadasRootWndw.entry insert end $dir } itcl::body FtoolInstance::updateBrowserSetting {} { set setting [string trim [.changeBrowserWndw.entry get]] set previousChoice $::fguiPref::BrowserSetting if { $setting == "" } { set ::fguiPref::BrowserSetting $previousChoice } else { set ::fguiPref::BrowserSetting $setting fguiPref save } destroy .changeBrowserWndw } itcl::body FtoolInstance::displayHelpMessage { topic_ { package "NONE" } { website "NONE" } } { global heraHelpViewer global g_backupDir global tcl_platform env set docWebSite $preDefineDocWebSite if { $website != "NONE" } { set docWebSite $website if { $website == "local" } { set docWebSite $env(LHEASOFT)/lib/fgui/doc/ } } if { $package == "NONE" } { if { [string range $topic_ [expr [string length $topic_] - 5] end] != ".txt" && \ [string range $topic_ [expr [string length $topic_] - 5] end] != ".html" } { set topic_ ${topic_}.txt } if { $tcl_platform(platform) != "windows"} { if [info exists fguiPref::BrowserSetting] { if { $fguiPref::BrowserSetting == "None Defined" } { catch { changeBrowser } err vwait fguiPref::BrowserSetting } set htmlBrowser [string trim $fguiPref::BrowserSetting] if { $htmlBrowser == "" } { set errorFlag 1 } else { set errorFlag [ catch { exec $htmlBrowser ${docWebSite}${topic_} & } err ] } if { ![info exists ::fguiPref::BrowserSetting] || \ ([info exists errorFlag] && $errorFlag == 1) } { if [winfo exists .fhelpframe] { destroy .fhelpframe } toplevel .fhelpframe -class Dialog wm title .fhelpframe "fgui: ${runcmd}.txt" frame .fhelpframe.f1 set f1 .fhelpframe.f1 text $f1.text -bd 1 -width 80 -font {courier 13 bold}\ -yscrollcommand {.fhelpframe.f1.yscroll set} \ -xscrollcommand {.fhelpframe.f1.xscroll set} set htext $f1.text scrollbar $f1.yscroll \ -command {.fhelpframe.f1.text yview} scrollbar $f1.xscroll -orient horizontal \ -command {.fhelpframe.f1.text xview} pack $f1.yscroll -side right -fill y pack $f1.xscroll -side bottom -fill x pack $f1.text -side left -fill x -fill y pack $f1 button .fhelpframe.button -text OK -command "destroy .fhelpframe" pack .fhelpframe.button -pady 4 $htext delete 1.0 end set txtfile [SearchDir $helpPath $fhelpname.txt ] if {$txtfile != "" } { set hchan [open $txtfile r] fileevent $hchan readable [itcl::code $this DumpText $htext $hchan ] } else { $htext insert end "404 - No text help file found" } } } } else { exec cmd /c $htmlBrowser /max ${docWebSite}${topic_} & } } else { # help format: # 1. ftools : $helpDocWebSite/.html # 2. chandra: $helpDocWebSite/ # 3. xmm-sas: $helpDocWebSite/ set idx [lsearch -glob $helpDocWebSiteList [list $package *]] switch $package { "ftools" { set helpDocWebSite [lindex [lindex $helpDocWebSiteList $idx] 1]/${topic_}.html } "chandra" { set helpDocWebSite [lindex [lindex $helpDocWebSiteList $idx] 1]/ahelp if { $topic_ != "ahelp" } { set helpDocWebSite $helpDocWebSite/${topic_}.html } } "xmm-sas" { set helpDocWebSite [lindex [lindex $helpDocWebSiteList $idx] 1]/${topic_} } default { set helpDocWebSite $topic_ } } if { !$isWin } { catch { exec $htmlBrowser ${helpDocWebSite} & } err } else { exec cmd /c $htmlBrowser /max ${helpDocWebSite} & } } } itcl::body FtoolInstance::paneManager { command args } { set w [lindex $args 0] set wndwA $toolHList set wndwB .ftoolframe.log switch $command { start { set startY [winfo pointery $w ] } motion { set y [lindex $args 1] set realY [expr $y + [winfo rooty $w]] set Ymax [winfo height .ftoolframe] #puts "y: $y, rootY: [winfo rooty $w], realY: $realY, Ymax: $Ymax" set frac [expr double($realY)/$Ymax] #puts "frac: $frac" if { $frac < 0.05 } { set frac 0.05 } if { $frac > 1.0 } { set frac 1.0 } place .ftoolframe.tools.grip -rely $frac } stop { set endY [winfo pointery $w ] scan [winfo geometry $wndwA] "%dx%d+%d+%d" Rw Rh Rx Ry scan [winfo geometry $wndwB] "%dx%d+%d+%d" Lw Lh Lx Ly #puts "orginial: [winfo geometry $wndwA]" #puts " [winfo geometry $wndwB]" #puts "text new height: [expr abs($Rh + [expr $endY - $startY]) / $toolHListTextRatio]" #puts "log new height : [expr $Lh - [expr $endY - $startY]]" set newHeight [expr ($Rh + [expr $endY - $startY]) / $toolHListTextRatio] if { $newHeight <= 0 } { set newHeight 1 } $wndwA configure -height $newHeight $wndwB configure -height \ [expr ($Lh - [expr $endY - $startY])] #pack .ftoolframe.tools.log.f2 -side top -fill x -pady 3 -padx 3 update idletasks #puts "after: [winfo geometry $wndwA]" #puts " [winfo geometry $wndwB]" } } } itcl::body FtoolInstance::setCurrentTab { page } { set currentPage $page set xTerminal $xTerminalList($page) } itcl::body FtoolInstance::_resolveSymLinks { filename_ } { if { [file type $filename_] == "link" } { set lName [file readlink $filename_] if { [file pathtype $lName] == "relative" } { set root [file dirname $filename_] set lName [file join $root $lName] } return [_resolveSymLinks $lName] } return $filename_ } fv5.4/ftools/guis/fgui/class/FitsFileSelection.tcl0000644000220700001010000007145610613451055021614 0ustar birbylheadev# modified by Jianjun Xu # # FitsFileselectionbox # ------------------------------------------------------------------ itcl::class FitsFileselectionbox { inherit itk::Toplevel constructor {args} {} destructor {} private common _ffbFilter * private common _ffbFileName "" private common _displayFitsOnly 0 private common _userName "" private common _passwd "" private common _ftpHost "" private variable _pwd . private variable _selected "" private variable _fileCmd Open private variable _isFtp 0 private variable _lastLocalDir "" private variable _lastRemoteDir "" private variable _nameList {} private variable _sizeList {} private variable _dateList {} private variable _dirChar "/" private variable currentWndw "" private method _fillContent {cDir} private method _upDir {} private method _setDir { n } private method _openThisFile {} private method _openSelection {} private method _completeFileName {} private method _selectThat { box } private method _listFits {} private method _setFilter {} private method _helpCmd {} private method _initFtp {} private method _isDir {} private method _pwd { {full 1} } private method _updateAll {} private method _switchRemoteLocal {} private method _closeFTP {} private method _showNamedFile {} private method _searchCharsForCompletion {root list} private method _pickElemByName {name list} private method _ftpOpen {} private method _buildMenu {} private method _postMenu {time x y} private method _buttonRelease {time} private method urlSplit { url_ } private method calcDateStr { time_ } private method setWatchCursor { win_ args } private method resolveSymLinks { filename_ } private method calcSizeStr { size_ } private method _scrollBoxes { args } private method _scrollOthers { box args } private method _updateBoxes { data } private method _cancelCmd {} private method _openFileCmd {} private method _saveFileCmd {} private method _setCmd {cmd} private variable _postTime private variable _pathElems private variable _fileCols "files sizes dates" private variable _fileLbls "Name Size {Mod Date}" private variable _driveList private variable _dsizeList private variable _ddateList private variable _callRoutine public method get {} public method chgDir {dir} public method init {} public method activate { cmd {defaultName ""} } public method deactivate {} public method changeListFITSoption {} } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body FitsFileselectionbox::constructor {args} { global g_fitsFileMode global isMac global isWin global env tcl_platform set _callRoutine [lindex $args 0] set args [lreplace $args 0 0] if { $tcl_platform(platform) == "windows" } { load fitstcl fits } else { load [glob $env(FITSVIEWER_LIBRARY)/../libfitstcl.{s\[ol\]*,dylib}] } if { $isWin } { set _driveList {} foreach drive { c d e f g h i j k l m n o p q r s } { catch { [glob ${drive}:/*] } returnCodeList catch { [glob ${drive}:/*.*] } returnCodeFile if { [string first "no files matched" $returnCodeList] < 0 || [string first "no files matched" $returnCodeFile] < 0 } { lappend _driveList "$drive:/" lappend _dsizeList "(dir)" lappend _ddateList {} } } } wm withdraw $itk_component(hull) wm geometry $itk_component(hull) 350x450 if { $isMac } { set _dirChar ":" } component hull configure -borderwidth 0 # # Create an internal frame to contain the components. # itk_component add frame { frame $itk_interior.frame } pack $itk_component(frame) -fill both -expand yes # pack propagate $itk_component(frame) no # Create the dir entry. # itk_component add dframe { frame $itk_component(frame).df } pack $itk_component(dframe) -fill x -expand 0 -pady 4 -padx 4 itk_component add dirBtn { menubutton $itk_component(dframe).dir -indicatoron 1 -relief raised \ -menu $itk_component(dframe).dir.menu } pack $itk_component(dirBtn) -side left -fill x -expand 1 -padx 2 itk_component add dirMenu { menu $itk_component(dirBtn).menu -tearoff 0 } bind $itk_component(dirBtn) \ "[itcl::code $this _postMenu %t %X %Y]; break" bind $itk_component(dirMenu) \ [itcl::code $this _buttonRelease %t] image create bitmap _upDirIcon -data { #define updir_width 28 #define updir_height 16 static char updir_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x01, 0x10, 0x00, 0x00, 0x01, 0x10, 0x02, 0x00, 0x01, 0x10, 0x07, 0x00, 0x01, 0x90, 0x0f, 0x00, 0x01, 0x10, 0x02, 0x00, 0x01, 0x10, 0x02, 0x00, 0x01, 0x10, 0x02, 0x00, 0x01, 0x10, 0xfe, 0x07, 0x01, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0xf0, 0xff, 0xff, 0x01}; } itk_component add updir { button $itk_component(dframe).up \ -image _upDirIcon \ -command [itcl::code $this _upDir] } pack $itk_component(updir) -side left -expand 0 -padx 2 ############################ # # Create the files list. # itk_component add fframe { frame $itk_component(frame).fframe -relief sunken } pack $itk_component(fframe) -side top -fill both -expand 1 -padx 4 -pady 6 grid columnconfig $itk_component(fframe) 0 -weight 1 grid rowconfig $itk_component(fframe) 1 -weight 1 # Create file columns set i 0 foreach l $_fileLbls lb $_fileCols { itk_component add lbl$i { label $itk_component(fframe).lbl$i -text $l -relief raised } itk_component add $lb { listbox $itk_component(fframe).$lb -height 3 -relief flat \ -exportselection 0 -bd 0 -highlightthickness 0 \ -yscrollcommand [itcl::code $this _scrollOthers $lb] \ -takefocus 0 } grid $itk_component(lbl$i) -row 0 -column $i -sticky "news" grid $itk_component($lb) -row 1 -column $i -sticky "news" bind $itk_component($lb) \ +[itcl::code $this _selectThat $lb] bind $itk_component($lb) \ [itcl::code $this setWatchCursor $itk_component(hull) [itcl::code $this _openSelection]] bind $itk_component($lb) { %W configure -cursor hand2 } incr i } $itk_component(sizes) config -width 7 $itk_component(dates) config -width 12 # scrollbar itk_component add fscroll { scrollbar $itk_component(fframe).fscroll \ -command [itcl::code $this _scrollBoxes] } grid $itk_component(fscroll) -row 1 -column $i -sticky news # # ############################ # the bottom portion using grid itk_component add bframe { frame $itk_component(frame).bframe } pack $itk_component(bframe) -side top -fill x -expand 0 # File name itk_component add fnamel { label $itk_component(bframe).fnamel -text "File Name" } itk_component add fnamee { entry $itk_component(bframe).fnamee -textvariable [itcl::scope _ffbFileName] } bind $itk_component(fnamee) \ [itcl::code $this setWatchCursor $itk_component(hull) [itcl::code $this _openThisFile]] # # bind all {} bind $itk_component(fnamee) "[itcl::code $this _completeFileName]; break" # Filter itk_component add filterl { label $itk_component(bframe).filterl -text "File of type" } itk_component add filtere { entry $itk_component(bframe).filtere -textvariable [itcl::scope _ffbFilter] } bind $itk_component(filtere) [itcl::code $this _setFilter] # fitsfile # set _displayFitsOnly $fguiPref::ifDispFitsOnly itk_component add fitsmode { checkbutton $itk_component(bframe).fitsmode \ -variable [itcl::scope _displayFitsOnly] \ -text "List FITS files only" \ -selectcolor $fguiPref::checkBBgColor \ -activeforeground black -activebackground $fguiPref::globalBgColor \ -command [itcl::code $this _listFits] } # buttons itk_component add openB { button $itk_component(bframe).openB -text Open \ -command [itcl::code $this setWatchCursor $itk_component(hull) [itcl::code $this _openThisFile]] } itk_component add cancelB { button $itk_component(bframe).cancelB -text Cancel \ -command [itcl::code $this _cancelCmd] } itk_component add helpB { button $itk_component(bframe).helpB -text Help \ -command [itcl::code $this _helpCmd] } # geometry grid config $itk_component(fnamel) -column 0 -row 0 \ -columnspan 1 -rowspan 1 -sticky "w" grid config $itk_component(fnamee) -column 1 -row 0 \ -columnspan 1 -rowspan 1 -sticky "snew" grid config $itk_component(filterl) -column 0 -row 1 \ -columnspan 1 -rowspan 1 -sticky "w" grid config $itk_component(filtere) -column 1 -row 1 \ -columnspan 1 -rowspan 1 -sticky "snew" grid config $itk_component(fitsmode) -column 1 -row 3 \ -columnspan 1 -rowspan 1 -sticky "w" grid config $itk_component(openB) -column 2 -row 0 \ -columnspan 1 -rowspan 1 -sticky "snew" -padx 4 grid config $itk_component(cancelB) -column 2 -row 1 \ -columnspan 1 -rowspan 1 -sticky "snew" -padx 4 grid config $itk_component(helpB) -column 2 -row 2 \ -columnspan 1 -rowspan 1 -sticky "snew" -padx 4 grid columnconfigure $itk_component(bframe) 1 -weight 5 wm protocol $itk_interior WM_DELETE_WINDOW [itcl::code $this _cancelCmd] eval itk_initialize $args } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body FitsFileselectionbox::destructor {} { } itcl::body FitsFileselectionbox::_fillContent {cDir} { global isMac isWin if { $cDir != "" } { chgDir $cDir } _buildMenu set fileNameList "" set fileSizeList "" set fileDateList "" set dirNameList "" set dirSizeList "" set dirDateList "" set selCO "" if { $_isFtp } { _updateBoxes [list {\[Loading...\]} {} {}] set rlist [itcl::code $this [setWatchCursor $itk_component(hull) [itcl::code ftpClient list ""]]] set dirNameList [lindex $rlist 0] set dirSizeList [lindex $rlist 1] set dirDateList [lindex $rlist 2] set fileNameList [lindex $rlist 3] set fileSizeList [lindex $rlist 4] set fileDateList [lindex $rlist 5] } else { set _lastLocalDir $_pwd set _ffbFilter [string trim $_ffbFilter " "] if { $_ffbFilter == "" } { set _ffbFilter * } set tmpID [$itk_component(files) curselection] if { $tmpID != "" } { $itk_component(files) see $tmpID } if { $cDir == "" } { set curContent [file volumes] } else { #multi filter separated by comma set _ffbFilter [join [split $_ffbFilter ","]] set curContent [lsort -increasing [eval glob -nocomplain $_ffbFilter]] } foreach i $curContent { if ![file readable $i ] continue if { ( [string index $i 0]=="~" ) || \ ( ($isMac || $isWin) && [file attributes $i -hidden]) || \ ( $isMac && $i=="Trash" ) } { continue } if { [catch {set fType [file type [resolveSymLinks $i]]}] } { continue } switch $fType { file { if { $_displayFitsOnly } { if { [catch {set isfits [isFits $i]} err] } { continue } if { $isfits == 0 } continue } lappend fileNameList $i lappend fileSizeList [calcSizeStr [file size $i]] lappend fileDateList [file mtime $i] } directory { lappend dirNameList [string trimright $i $_dirChar]$_dirChar lappend dirSizeList "(dir)" lappend dirDateList [file mtime $i] } default { ; } } } } if { $isMac } { set _nameList [eval list $dirNameList $fileNameList] set _sizeList [eval list $dirSizeList $fileSizeList] set _dateList [eval list $dirDateList $fileDateList] } else { set _nameList [eval list "../" $dirNameList $fileNameList] set _sizeList [eval list "(dir)" $dirSizeList $fileSizeList] set _dateList [eval list "-" $dirDateList $fileDateList] } set selID [$itk_component(files) curselection] if { $selID != "" } { set selCO [$itk_component(files) get $selID] } if { [llength $_nameList] == 0 } { _updateBoxes [list {\[ \]} {} {}] } elseif { $_isFtp } { _updateBoxes [list $_nameList $_sizeList $_dateList] } else { set _dateListFmt {} foreach d $_dateList { lappend _dateListFmt [calcDateStr $d] } _updateBoxes [list $_nameList $_sizeList $_dateListFmt] } set newID [lsearch $_nameList $selCO] if { $newID != -1} { $itk_component(files) selection set $newID $itk_component(files) see $newID _selectThat files } } itcl::body FitsFileselectionbox::_upDir {} { global isMac global isWin set preUpDir $_pwd if { $_isFtp } { ftpClient cd .. } else { if { $isMac && [string first : $_pwd] == [expr [string length $_pwd]-1] } { set _pwd "" _fillContent "" return } elseif { $_pwd != "" } { cd .. } } set _pwd [_pwd] set postUpDir $_pwd if { $isWin && $preUpDir == $postUpDir } { _updateBoxes [list $_driveList $_dsizeList $_ddateList] } else { _fillContent $_pwd } } itcl::body FitsFileselectionbox::_selectThat { box } { set tmpIdx [$itk_component($box) curselection] if { $tmpIdx == "" } { set _selected "" return } foreach b $_fileCols { if { $box!=$b } { $itk_component($b) selection clear 0 end $itk_component($b) selection set $tmpIdx } } set _selected [$itk_component(files) get $tmpIdx] if { ![_isDir] } { set _ffbFileName $_selected $itk_component(fnamee) selection range 0 end focus $itk_component(fnamee) $itk_component(fnamee) icursor end } } itcl::body FitsFileselectionbox::_isDir {} { global isMac if { $_isFtp } { if { [string range $_selected end end] == "/" } { return 1 } elseif { [string trim $_selected .] == "" } { return 1 } elseif { [lsearch -exact $_nameList $_ffbFileName/] != -1 } { return 1 } elseif { [string first / $_ffbFileName] != -1 } { return 1 } else { return 0 } } else { if { $isMac && $_pwd=="" } { return 1 } else { return [file isdirectory [string trimright $_selected $_dirChar]] } } } itcl::body FitsFileselectionbox::_openThisFile {} { global pWorkingDirectory set _ffbFileName [string trim $_ffbFileName " "] if { $_ffbFileName != "" } { set _selected $_ffbFileName set dirFlag [_isDir] _openSelection if { [winfo exists $currentWndw] && $currentWndw != "" } { $currentWndw delete 0 end $currentWndw insert end $_pwd/$_ffbFileName set pWorkingDirectory $_pwd .ftoolframe.tools.info.entry delete 0 end .ftoolframe.tools.info.entry insert end $pWorkingDirectory } if { $dirFlag } { set _ffbFileName "" } } } itcl::body FitsFileselectionbox::_openSelection {} { global isMac if { $_selected=="" } return if { [_isDir] } { # open contents of directory if { !$isMac && [file pathtype $_selected]=="absolute" } { _fillContent $_selected } else { _fillContent $_pwd$_selected } } else { # it's a file if { $_fileCmd == "Save" } { _saveFileCmd } elseif { $_fileCmd == "Open"} { _openFileCmd } else { puts "Un-supported file command" } } } itcl::body FitsFileselectionbox::_listFits {} { _fillContent $_pwd # set fguiPref::ifDispFitsOnly $_displayFitsOnly # ::fguiPref save } itcl::body FitsFileselectionbox::_setFilter {} { _fillContent $_pwd } itcl::body FitsFileselectionbox::_helpCmd {} { $_callRoutine displayHelpMessage fileSelection.html NONE local } itcl::body FitsFileselectionbox::get {} { if { $_isFtp } { # Need to call _pwd here to remove the starting directory from filename set r_string "[_pwd 0]$_ffbFileName" set r_string \ "ftp://${_userName}:${_passwd}\@[string range $r_string 6 end]" } else { set r_string [string trim $_ffbFileName " "] if { [file pathtype $_ffbFileName]!="absolute" } { set r_string "$_pwd$_ffbFileName" } } return $r_string } itcl::body FitsFileselectionbox::_setCmd {cmd} { set _fileCmd $cmd if { $cmd == "Open" } { $itk_component(openB) configure -text Open } elseif {$cmd == "Save" } { $itk_component(openB) configure -text Save } else { error "Not recognized command" } } itcl::body FitsFileselectionbox::init {} { $itk_component(files) select clear 0 end if { $_isFtp } { # Reinitialzing, so return to local directory _switchRemoteLocal } else { catch { _fillContent [_pwd] } err } } itcl::body FitsFileselectionbox::chgDir {dir} { if { $_isFtp } { set dir [string range $dir 6 end] set idx [string first / $dir] if { $idx==-1 } { set tmpdir "/" } else { set tmpdir [string range $dir $idx end] if { $tmpdir=="/." } {set tmpdir "."} } ftpClient cd $tmpdir } else { cd $dir } set _pwd [_pwd] } itcl::body FitsFileselectionbox::_initFtp {} { global g_titleFont _closeFTP RemoteClass ftpClient # ask for user name and _passwd powToplevel .ftp .dummy iwidgets::entryfield .ftp.rhost -labeltext "Remote Host" \ -labelpos nw -textvariable [itcl::scope _ftpHost] \ -command [itcl::code $this _ftpOpen] -textfont g_titleFont -labelfont g_titleFont pack .ftp.rhost -padx 4 -pady 4 -fill x iwidgets::entryfield .ftp.login -labeltext "Optional User Name (if not 'anonymous')" \ -labelpos nw -textvariable [itcl::scope _userName] \ -command [itcl::code $this _ftpOpen] -textfont g_titleFont -labelfont g_titleFont pack .ftp.login -padx 4 -pady 4 -fill x iwidgets::entryfield .ftp._passwd -labeltext "Password" \ -labelpos nw -show "\267" -textvariable [itcl::scope _passwd] \ -command [itcl::code $this _ftpOpen] -textfont g_titleFont -labelfont g_titleFont pack .ftp._passwd -padx 4 -pady 4 -fill x iwidgets::Buttonbox .ftp.butts -padx 4 -pady 4 -orient horizontal .ftp.butts add connect -text "Connect" \ -font g_titleFont \ -command [itcl::code $this _ftpOpen] .ftp.butts add cancel -text "Cancel" \ -font g_titleFont \ -command { destroy .ftp } .ftp.butts default connect pack .ftp.butts focus [.ftp.rhost component entry] tkwait window .ftp } itcl::body FitsFileselectionbox::_ftpOpen {} { if { $_userName=="" } { set _userName anonymous } if { $_passwd=="" && ($_userName=="anonymous" || $_userName=="ftp") } { set _passwd "fv@fv.gsfc.nasa.gov" } setWatchCursor .ftp [itcl::code ftpClient openConn $_ftpHost $_userName $_passwd] set _isFtp 1 destroy .ftp } itcl::body FitsFileselectionbox::_pwd { {full 1} } { # Always return the _dirChar at end of the _pwd string if { $_isFtp } { return [string trimright [ftpClient pwd $full] "/"]/ } else { return [string trimright [pwd] $_dirChar]$_dirChar } } itcl::body FitsFileselectionbox::_updateAll {} { if { $_isFtp } return _setFilter } itcl::body FitsFileselectionbox::_switchRemoteLocal {} { if { $_isFtp } { set ffbCurrentDir $_lastLocalDir set _isFtp 0 $itk_component(ftpB) configure -text "FTP..." _closeFTP } else { _initFtp if { $_isFtp } { set ffbCurrentDir "ftp://$_ftpHost/." $itk_component(ftpB) configure -text "Local..." } else { set ffbCurrentDir $_lastLocalDir } } _fillContent $ffbCurrentDir } itcl::body FitsFileselectionbox::_closeFTP {} { # if another ftp is in session, close it first if { [itcl::find objects -class RemoteClass] != "" } { itcl::delete object ftpClient } } itcl::body FitsFileselectionbox::_completeFileName {} { if { $_ffbFileName == "" } return set tmpContent [lsort -increasing \ [_pickElemByName ${_ffbFileName} $_nameList]] if { [llength $tmpContent] == 0 } return set tmpRootName [lindex $tmpContent 0] set tmpRootLength [string length $tmpRootName] set tmpList [lrange $tmpContent 1 end] if { [llength $tmpList ] == 0 } { set i [string length $tmpRootName] } else { for {set i 0} {$i < $tmpRootLength} {incr i} { set tmpRoot [string range $tmpRootName 0 $i] if { [_searchCharsForCompletion $tmpRoot $tmpList] == 1} { break } } } set _ffbFileName [string range $tmpRootName 0 [expr $i-1]] _showNamedFile $itk_component(fnamee) selection range $i end } itcl::body FitsFileselectionbox::_pickElemByName {name list} { set tmplist "" set last [expr [string length $name]-1] foreach i $list { if { $name==[string range $i 0 $last]} { lappend tmplist $i } } return $tmplist } itcl::body FitsFileselectionbox::_searchCharsForCompletion {root list} { set last [expr [string length $root]-1] foreach i $list { if { $root!=[string range $i 0 $last] } { return 1 } } return 0 } itcl::body FitsFileselectionbox::_showNamedFile {} { $itk_component(fnamee) icursor end set tmpIndex [lsearch -glob $_nameList ${_ffbFileName}*] if { $tmpIndex == -1} return $itk_component(files) see $tmpIndex $itk_component(files) select clear 0 end $itk_component(files) select set $tmpIndex _selectThat files } ################################################### itcl::body FitsFileselectionbox::activate { cmd {defaultName ""} } { init _setCmd $cmd if { $cmd == "Open" && $defaultName != "" } { set currentWndw $defaultName set defaultName "" } if { $defaultName != "" } { set _ffbFileName $defaultName } wm deiconify $itk_component(hull) raise $itk_component(hull) focus $itk_component(hull) $itk_component(fnamee) selection range 0 end $itk_component(fnamee) icursor end } itcl::body FitsFileselectionbox::deactivate {} { _cancelCmd } ################################################### itcl::body FitsFileselectionbox::_cancelCmd {} { global fileselect wm withdraw $itk_component(hull) set fileselect "" } itcl::body FitsFileselectionbox::_openFileCmd {} { global g_isScript fileselect set fileselect [get] if { $_isFtp } { itcl::delete object ftpClient if { [catch {openFitsFileWM $fileselect 1} err] } { # reopen ftpClient RemoteClass ftpClient setWatchCursor "" \ [itcl::code ftpClient openConn $_ftpHost $_userName $_passwd] _fillContent $_pwd error $err } } else { if {$fileselect == "" } { error "Please select a file" return } if { [file exist $fileselect] == 0 } { set oldFile $fileselect foreach ext { gz Z z zip } { if { [file exists $fileselect.$ext] } { set fileselect $fileselect.$ext break } } if { $fileselect == $oldFile } { error "File $fileselect does not exist" return } } if { [file readable $fileselect] == 0 } { error "File $fileselect is not readable" return } } wm withdraw $itk_component(hull) } itcl::body FitsFileselectionbox::_saveFileCmd {} { global fileselect set fileselect [get] set saveToDir [file dir $fileselect] if {$fileselect == "" } { error "No file name given" } elseif { ![file writable $saveToDir] } { error "$saveToDir is not writable" } else { wm withdraw $itk_component(hull) } } ################################################### itcl::body FitsFileselectionbox::_buildMenu {} { global isMac $itk_component(dirMenu) delete 0 end set _pathElems [urlSplit $_pwd] if { $_isFtp } { set newP "[lindex $_pathElems 0][lindex $_pathElems 1]" eval lappend newP [lrange $_pathElems 2 end] set _pathElems $newP } elseif { $isMac } { set _pathElems [linsert $_pathElems 0 Desktop] } if { !$isMac || $_isFtp } { set pathSym $_dirChar } else { set pathSym "" } set c 0 foreach i $_pathElems { if { $i==$pathSym } { set i "" } $itk_component(dirMenu) add command -label $i$pathSym \ -command [itcl::code $this _setDir $c] incr c } $itk_component(dirBtn) configure -text $i$pathSym } itcl::body FitsFileselectionbox::_setDir { n } { global isMac if { $_isFtp } { set newPath [join [lrange $_pathElems 0 $n] /] } elseif { $isMac } { if { $n==0 } { set newPath "" set _pwd "" } else { set newPath [eval file join [lrange $_pathElems 1 $n]] } } else { set newPath [eval file join [lrange $_pathElems 0 $n]] } _fillContent $newPath } itcl::body FitsFileselectionbox::_postMenu {time X Y} { set _postTime $time set x [expr $X - [winfo reqwidth $itk_component(dirMenu)]/2 ] set y [expr $Y - [$itk_component(dirMenu) yposition end] - 10] tk_popup $itk_component(dirMenu) $x $y } itcl::body FitsFileselectionbox::_buttonRelease {time} { if { [expr abs([expr $_postTime - $time])] <= 150 } { return -code break } } ############################################################ itcl::body FitsFileselectionbox::_scrollBoxes { args } { foreach b $_fileCols { eval $itk_component($b) yview $args } } itcl::body FitsFileselectionbox::_scrollOthers { box args } { eval $itk_component(fscroll) set $args set view [$itk_component($box) yview] foreach b $_fileCols { if { $box!=$b } { $itk_component($b) yview moveto [lindex $view 0] } } } itcl::body FitsFileselectionbox::_updateBoxes { data } { foreach b $_fileCols d $data { $itk_component($b) delete 0 end eval $itk_component($b) insert 0 $d } } itcl::body FitsFileselectionbox::changeListFITSoption {} { # set _displayFitsOnly $fguiPref::ifDispFitsOnly } itcl::body FitsFileselectionbox::urlSplit { url_ } { global isMac set uPos [string first :// $url_] if { $uPos == -1 } { return [file split $url_] } else { set lst [string range $url_ 0 [expr $uPos+2]] eval lappend lst [split [string range $url_ [expr $uPos+3] end] /] if { [lindex $lst end]=="" } { set lst [lrange $lst 0 [expr [llength $lst]-2]] } return $lst } } itcl::body FitsFileselectionbox::calcDateStr { time_ } { if { $time_=="-" || [catch {expr $time_+1}] } { return "-" } if { $time_ > [clock scan "00:00 today"] } { set str [clock format $time_ -format "Today %H:%M"] } elseif { $time_ > [clock scan "00:00 6 days ago"] } { set str [clock format $time_ -format "%a %H:%M"] } else { set str [clock format $time_ -format "%b %d, %Y"] } return $str } itcl::body FitsFileselectionbox::setWatchCursor { win_ args } { # puts "$win $args" if { $win_ != "" } { $win_ configure -cursor watch } update catch {set rslt [eval $args]} err if { $win_ != "" } { $win_ configure -cursor top_left_arrow } if { [info exists rslt] } { return $rslt } else { error $err } } itcl::body FitsFileselectionbox::resolveSymLinks { filename_ } { if { [file type $filename_] == "link" } { set lName [file readlink $filename_] if { [file pathtype $lName] == "relative" } { set root [file dirname $filename_] set lName [file join $root $lName] } return [resolveSymLinks $lName] } return $filename_ } itcl::body FitsFileselectionbox::calcSizeStr { size_ } { if { [catch {expr $size_+1}] } { return "???" } set unit 0 set units [list "" k M G T ? ? ? ? ? ?] while { $size_ > 5632 } { incr unit set size_ [expr round( $size_/1024.0 )] } return $size_[lindex $units $unit] } fv5.4/ftools/guis/fgui/class/Notifications.tcl0000644000220700001010000002117310615447031021042 0ustar birbylheadev######################################################################## # # class: Notifications # # purpose: Provide a message distribution center for special events. # Any number of objects/users can ask to be notified when # a given event occurs. # # usage: To create/access the notification center: # set newObj [gNotifications] # or # set oldObj [gNotifications default] # where the first example creates a new notification center # and the later returns pre-existing one of an unknown # name (or creates a new one if one doesn't already exist). # In most cases, an application should have only one # notification object, so either create one and store it in # a global variable, or always access it through the "default" # method. # # To send a message: # NotificationObj postMessage object message ?args? # where "object" is the object to which "message" applies, # usually the sending object. "message" is a string # describing the event which has just taken place... # eg, "graphHasFinishedDrawing". "args" contains extra # information observers may use. # # To register to receive messages: # NotificationObj addObserver observer cmd object message # where "observer" is the object (or function name) to be # called when "message" is posted by (or for) "object". "cmd" # is either the observing object's method to be used or a # extra/dummy argument passed to an observing function. An # observing object needs to implement the method: # body observer::cmd { object message opts } {...} # while an observing function implements the procedure: # proc observer { cmd object message opts } {...} # where opts is an optional list of additional information # sent by the object. # # To unregister: # NotificationObj removeObserver observer ?object? ?message? # where "observer" is the same as before. An observer can # unregister for all messages or just ones from particular # objects and messages. # ####################################################################### itcl::class Notifications { constructor {} {} destructor {} public { method addObserver { observer cmd object message } method removeObserver { observer {object ""} {message ""} } method postMessage { object message args } method registerRemote { rNotes } { set remoteNotes $rNotes } } private { variable lookup variable remoteNotes "" method locateObserver { observer observerList } } } ####################################################################### # # gNotifications ?default? # # Use this procedure to create/access instances of Notifications in # the global namespace # ####################################################################### proc gNotifications { args } { global notificationList switch -exact [lindex $args 0] { "default" { set args "" set gNote [lindex [itcl::find objects ::* -class Notifications] 0] if { $gNote != "" } { return $gNote } return [uplevel #0 Notifications #auto $args] } default { set user [lindex $args 0] if { [llength $notificationList] == 1 && [lindex [lindex $notificationList 0] 0] == "NoOne" } { # case 1: only one notification, place user in this one set newList [list $user [lindex [lindex $notificationList 0] 1]] set notificationList {} lappend notificationList $newList return [lindex [lindex $notificationList 0] 1] } else { set idx [lsearch -glob $notificationList [list $user *]] if { $idx >= 0 } { return [lindex [lindex $notificationList $idx] 1] } else { return [uplevel #0 Notifications #auto] } } } } } ######################################################################## # # addObserver cmd object message # # Use this method to register an object/procedure as an observer for # a particular object/message # ######################################################################## itcl::body Notifications::addObserver { observer cmd object message } { set object [string trimleft $object :] if { $cmd=="-" } { set cmd $message } if { $remoteNotes != "" \ && $object != "" && $object != "*" && [itcl::find object *::$object] != "" \ && [$object isa DistantObject] && $message != "connectionHasClosed" } { # Looking for a message not sent by a DO, so pass registration # to remote Notification center. $remoteNotes addObserver $observer $cmd $object $message return } if { [info exists lookup($message,$object)] } { set currentObservers $lookup($message,$object) if { [locateObserver $observer $currentObservers]==-1 } { lappend currentObservers [list $observer $cmd] } } else { set currentObservers [list [list $observer $cmd]] } set lookup($message,$object) $currentObservers } ######################################################################## # # removeObserver observer ?object? ?message? # # Use this method to remove an object/procedure from receiving # certian notifications # ######################################################################## itcl::body Notifications::removeObserver { observer {object ""} {message ""} } { set object [string trimleft $object :] if { $remoteNotes != "" \ && $object != "" && $object != "*" && [itcl::find object *::$object] != "" \ && [$object isa DistantObject] && $message != "connectionHasClosed" } { # Looking for a message not sent by a DO, so pass registration # to remote Notification center. $remoteNotes removeObserver $observer $object $message return } if { $object!="" && $message!="" } { if { ![info exists lookup($message,$object)] } return set currentObservers $lookup($message,$object) set idx [locateObserver $observer $currentObservers] if { $idx == -1 } return set lookup($message,$object) [lreplace $currentObservers $idx $idx] } else { foreach key [array names lookup] { foreach [list o m] [split $key ","] {} if { ($object=="" || $object==$o) && \ ($message=="" || $message==$m) } { set currentObservers $lookup($key) set idx [locateObserver $observer $currentObservers] if { $idx != -1 } { set lookup($key) [lreplace $currentObservers $idx $idx] } } } } } ######################################################################## # # postMessage object message # # Use this method to send a message to all observers # ######################################################################## itcl::body Notifications::postMessage { object message args } { set object [string trimleft $object :] ########### # # Build list of ... # set allObservers {} # # ... observers of fully-resolved object-message, ... # if { [info exists lookup($message,$object)] } { eval lappend allObservers $lookup($message,$object) } # # ... observers of all messages from this object, ... # if { [info exists lookup(*,$object)] } { eval lappend allObservers $lookup(*,$object) } # # ... observers of this message from all objects # if { [info exists lookup($message,*)] } { eval lappend allObservers $lookup($message,*) } # # Now send notifications to each observer # foreach observer $allObservers { foreach [list obs cmd] $observer {} #puts "... ${cmd}ing \"$obs\" of $message" # send synchronously if { [catch {$obs $cmd $object $message $args} res] } { #puts "*** Notify error: $obs $cmd $object $message" #puts "$res" } } return } ######################################################################## # # Private methods... # itcl::body Notifications::locateObserver { observer observerList } { set idx 0 foreach oldObserver $observerList { if { $observer == [lindex $oldObserver 0] } { return $idx } incr idx } return -1 } fv5.4/ftools/guis/fgui/class/ToolServer.tcl0000644000220700001010000000615210617676020020341 0ustar birbylheadevproc gToolServer { args } { return [uplevel #0 ToolServer #auto $args] } itcl::class ToolServer { constructor { cmd } { set currentFtool $cmd } destructor {} public { method runTool { cmdLine } method readChannel { } method readErrorChannel { } method writeChannel { data } method flushChannel { } method closeObj { } method shutdownToolServer { } { itcl::delete object $this } } private { variable toolChannel variable errorChannel variable currentFtool } } ######################################################################## itcl::body ToolServer::destructor {} { if { [info exists toolChannel] } { close $toolChannel close $errorChannel } } itcl::body ToolServer::runTool { cmdLine } { global env tcl_platform global oldHOME oldPFILES if { [info exists toolChannel] } { close $toolChannel close $errorChannel unset toolChannel } set oldHOME $env(HOME) set oldPFILES $env(PFILES) if { $tcl_platform(platform) == "windows" } { if { [file exists $env(PFILES)/${currentFtool}.par] && \ $env(PFILES) != "$env(CYGWIN_HOME)/pfiles" } { file copy -force $env(PFILES)/${currentFtool}.par $env(CYGWIN_HOME)/pfiles/${currentFtool}.par } set ::env(HOME) $env(CYGWIN_BASH_HOME) set ::env(PFILES) $env(CYGWIN_BASH_HOME)/pfiles cd $env(ORIGINAL_PWD) set errorChannel [open "| $env(CYGWIN_ROOT)/bin/cat.exe" r+] set toolChannel [open "| $env(CYGWIN_ROOT)/bin/bash.exe -c {$env(CYGWIN_BASH_LHEASOFT)/bin/spawnToolCmds.csh $cmdLine} 2>@ $errorChannel" r+] } else { set errorChannel [open "| /bin/cat" r+] set toolChannel [open "| $env(LHEASOFT)/bin/spawnToolCmds.csh $cmdLine 2>@ $errorChannel" r+] } fileevent $errorChannel readable [itcl::code $this readErrorChannel] fconfigure $errorChannel -buffering none -blocking false fileevent $toolChannel readable [itcl::code $this readChannel] fconfigure $toolChannel -buffering none -blocking false return } itcl::body ToolServer::readChannel { } { # We aren't blocking the channel, so pause # just a little in case there is a big block being sent after 150 set output [read $toolChannel] if { [eof $toolChannel] } { close $toolChannel close $errorChannel unset toolChannel [gNotifications default] postMessage $this "toolHasFinished NONE" } if { $output != "" } { [gNotifications default] postMessage $this "toolHasOutputAvailable $output" } } itcl::body ToolServer::readErrorChannel { } { # We aren't blocking the channel, so pause # just a little in case there is a big block being sent after 150 set output [read $errorChannel] if { [eof $errorChannel] } { close $errorChannel } if { $output != "" } { [gNotifications default] postMessage $this "toolHasErrorAvailable $output" } } itcl::body ToolServer::writeChannel { data } { puts $toolChannel $data } itcl::body ToolServer::flushChannel {} { catch { flush $toolChannel } err } itcl::body ToolServer::closeObj { } { delete object $this } fv5.4/ftools/guis/fgui/class/XTerminal.tcl0000644000220700001010000013121310616371676020145 0ustar birbylheadevproc gXTerminal { args } { return [uplevel #0 XTerminal #auto $args] } itcl::class XTerminal { constructor { wndw option server cSession tSession } {} destructor {} public { method setupRunningState { state } method shutdown {} # drag and drop method dropDraggedItem { args } method dragOver { args } # I/O method appendOutput { output fromWhere { option "NOT_USER_INPUT" } } method sendTextToTool { cmd } method _getPreviousHistory {} method _displayHistory {} method _setScriptRunning { state } { set scriptFlag $state } # for Print method printOutput {} method checkEditor { fileName } method setEditor {} # for Save method saveAsSelectDirectory { dir } method saveFile {} method saveAs {} method Dump_Session {} method Dump_Cmd {} method setLocalHandler { obj } method changeToolServer { srvr } method getItsToolServer {} { return $toolServer } # interactive with Server method receiveOutput { args } method setToolName { name } { set theTool $name } # add to history method addToHistory { cmd } # window manage } private { method processAnyKey { currentInput currentInputKeySym wndw } method processOutput { line lastLineFlag } method reverseModifyName { name } # binding method setup_XTerminalBinding { wndw } method bind_MouseEnterX { wndw } method bind_MouseEnter { wndw } method bind_ButtonPressOne { wndw } method bind_ButtonReleaseOne { wndw } method bind_ButtonOneMotion { wndw } method bind_KeyPressDeleteCheck { currentInputKeySym wndw } method bind_KeyPressLeft { wndw } method bind_KeyReleaseHome { wndw } method bind_KeyReleaseReconstructDelete { wndw } method bind_KeyReleaseReturn { wndw } method bind_KeyReleaseLeft { wndw } method bind_KeyReleaseRight { wndw } method bind_KeyReleaseUp { wndw } method bind_KeyReleaseDown { wndw } method bind_TripleButtonPressOne { wndw } method bind_TripleButtonReleaseOne { wndw } method bind_ButtonTwo { wndw { x {} } { y {} } } method bind_FocusIn { wndw } # interactive with Server method _sendPanicSignal { wndw } # prompt variable currentPrompt variable promptLine variable previous_promptStart "X.X" variable promptStart "X.X" variable promptMajor variable promptMinor variable expectingReturn false variable promptLineFound false variable promptLength # button selection variable selectionStart variable selectionEnd variable appendOutputFlag false # buffer and history of input key variable previousInputBuffer "" variable inputBuffer variable inputHistory {} variable selectedHistoryIdx 0 variable textBuffer {} variable viewer "notepad" variable selectDirectory variable savedFileName "saveFile.txt" variable currentChar # current position of insertion variable currentPos variable triplePressSelection variable pIdx1 # tool variable theTool "Terminal" variable outputWndw variable toolServer "NONE" variable plistFlag "false" variable scriptFlag "false" variable callSession variable topSession # display History variable nextLineNumber 1 variable maxMark 500 variable moreFlag "false" # user info variable userName variable myWndw variable myWndwHeight variable myWndwWidth variable lastRowNumber variable wndwOption variable heraFS variable localFS variable runner variable mainWndw variable path } } itcl::body XTerminal::constructor { wndw option server cSession tSession } { set outputWndw $wndw set wndwOption $option set toolServer $server set callSession $cSession set topSession $tSession frame $outputWndw.opframe menubutton $outputWndw.opframe.file -text "File" -menu $outputWndw.opframe.file.menu button $outputWndw.opframe.history -text "History" -command [itcl::code $this _displayHistory] \ -relief flat grid $outputWndw.opframe.file -row 0 -column 0 -padx 10 grid $outputWndw.opframe.history -row 0 -column 1 -padx 10 set m [menu $outputWndw.opframe.file.menu -tearoff 0] $m add command -label "Dump Log" -command [itcl::code $this Dump_Session] $m add command -label "Dump Cmd" -command [itcl::code $this Dump_Cmd] $m add separator $m add command -label "Print" -command [itcl::code $this printOutput] iwidgets::scrolledtext $outputWndw.txt \ -textfont [list Courier 12] \ -textbackground white \ -hscrollmode dynamic \ -vscrollmode dynamic \ -wrap char -visibleitems 80x15 $outputWndw.txt tag configure inputTag -foreground blue $outputWndw.txt tag configure errorTag -foreground red $outputWndw.txt component text configure -insertwidth 3 -insertbackground red label $outputWndw.title set colNum [lindex [split [$outputWndw.txt cget -visibleitems] "x"] 0] set rowNum [lindex [split [$outputWndw.txt cget -visibleitems] "x"] 1] grid $outputWndw.opframe -row 0 -column 0 -sticky nws -columnspan 2 grid $outputWndw.txt -row 1 -column 0 -sticky news -rowspan $rowNum -columnspan $colNum grid $outputWndw.title -row [expr $rowNum + 1] -column 0 -sticky new -columnspan $colNum grid rowconfigure $outputWndw 2 -weight 1 grid columnconfigure $outputWndw 1 -weight 1 appendOutput "cmd> " OutputChannel NEW_WINDOWS update idletasks set childsite [$outputWndw.txt childsite] setup_XTerminalBinding $childsite focus $childsite } itcl::body XTerminal::destructor {} { } itcl::body XTerminal::shutdown {} { set windowList [winfo children $outputWndw] foreach wndw $windowList { destroy $wndw } destroy $outputWndw #itcl::delete object $this } itcl::body XTerminal::processAnyKey { currentInput currentInputKeySym wndw } { # make sure that the insert is always at the end set lineMajor [lindex [split [$wndw index insert] "."] 0] set lineMinor [lindex [split [$wndw index insert] "."] 1] if { $lineMajor != [expr $nextLineNumber - 1] || $lineMinor < $promptLength } { $wndw mark set insert end } if ![info exists inputBuffer] { set inputBuffer "" } if ![info exists inputHistory] { set inputHistory {} set selectedHistoryIdx 0 } if { [string length $inputBuffer] == 0 } { set previous_promptStart $promptStart set promptStart [$wndw index insert] set currentPos [lindex [split $promptStart "."] 1] set token [split $promptStart "."] set promptMajor [lindex $token 0] set promptMinor [lindex $token 1] } # reset selectedHistoryIdx to top of history stack set previousSelectedHistoryIdx $selectedHistoryIdx set selectedHistoryIdx -1 set idx2 [$wndw index "end - 1 char"] $wndw tag add inputTag [expr $nextLineNumber - 1].$promptLength $idx2 scan $currentInput "%s" currentInput switch -exact $currentInputKeySym { "Return" { $wndw mark set insert end # append the string enter before to history, and clear the buffer # only those string that has length greater than 0 will be appended # list is in stack order for easy retrieval set doneLine [lindex [split [$wndw index insert] "."] 0] set doneChar [lindex [split [$wndw index insert] "."] 1] if { $doneChar < $currentPos } { $wndw mark set insert ${doneLine}.$currentPos } set inputBuffer [$wndw get $promptStart [$wndw index insert]] if { [string length [string trim $inputBuffer]] > 0 } { set inputOldHistory $inputHistory unset inputHistory # reverse order lappend inputHistory $inputBuffer foreach history $inputOldHistory { if { [string trim $history] != "" } { lappend inputHistory $history } } } set selectedHistoryIdx -1 set nextPromptStartMajor [lindex [split [$wndw index insert] "."] 0] set promptStart [format "%s.0" [expr $nextPromptStartMajor + 1]] $wndw mark set insert $promptStart update idletasks } "BackSpace" - "Delete" { # These keys are bounded by other procedures, processAnyKey would ignore this key } "Up" - "Down" { $wndw mark set insert end set selectedHistoryIdx $previousSelectedHistoryIdx if { [string length $inputBuffer] == 0 } { set previous_promptStart $promptStart set promptStart [$wndw index insert] set currentPos [lindex [split $promptStart "."] 1] set token [split $promptStart "."] set promptMajor [lindex $token 0] set promptMinor [lindex $token 1] } # Event generate this key, process should ignore this key and not put in the list } "Left" - "Right" { # Event generate this key, process should ignore this key and not put in the list } default { $wndw mark set insert [$wndw index insert] if { [string length $inputBuffer] == 0 } { set previous_promptStart $promptStart set promptStart [$wndw index insert] set currentPos [lindex [split $promptStart "."] 1] set token [split $promptStart "."] set promptMajor [lindex $token 0] set promptMinor [lindex $token 1] } set minor [lindex [split [$wndw index insert] "."] 1] $wndw mark set current ${promptMajor}.$minor if { [string length $currentInput] > 0 } { # append the current input character to buffer # append inputBuffer $currentInput $wndw tag remove currentInputTag $promptStart end if { $inputBuffer == "" } { set inputBuffer $currentInput } else { set inputBuffer [format "%s%s" $inputBuffer $currentInput] } $wndw tag add currentInputTag $promptStart end incr currentPos } } } } itcl::body XTerminal::setup_XTerminalBinding { wndw } { bind $wndw [itcl::code $this processAnyKey %A %K %W] bind $wndw [itcl::code $this bind_KeyPressDeleteCheck %K %W] bind $wndw [itcl::code $this bind_KeyPressDeleteCheck %K %W] bind $wndw [itcl::code $this bind_KeyPressLeft %W] bind $wndw [itcl::code $this bind_KeyReleaseHome %W] bind $wndw [itcl::code $this bind_KeyReleaseReconstructDelete %W] bind $wndw [itcl::code $this bind_KeyReleaseReconstructDelete %W] bind $wndw [itcl::code $this bind_KeyReleaseRight %W] bind $wndw [itcl::code $this bind_KeyReleaseLeft %W] bind $wndw [itcl::code $this bind_KeyReleaseReturn %W] bind $wndw [itcl::code $this bind_KeyReleaseUp %W] bind $wndw [itcl::code $this bind_KeyReleaseDown %W] bind $wndw [itcl::code $this bind_ButtonOneMotion %W] bind $wndw [itcl::code $this bind_ButtonPressOne %W] bind $wndw [itcl::code $this bind_ButtonReleaseOne %W] bind $wndw [itcl::code $this bind_ButtonTwo $wndw %x %y] bind $wndw <> [itcl::code $this bind_ButtonTwo $wndw] bind $wndw [itcl::code $this bind_TripleButtonPressOne %W] bind $wndw [itcl::code $this bind_TripleButtonReleaseOne %W] bind $wndw <> [itcl::code $this dragOver %W] bind $wndw <> [itcl::code $this dropDraggedItem %W] # bind $wndw [itcl::code $this bind_MouseEnter %W] bind $wndw [itcl::code $this _sendPanicSignal NONE] } itcl::body XTerminal::bind_FocusIn { wndw } { #puts "focus: wndw: $wndw" if { $wndwOption == "parameter" } { $callSession notifyHeraClient "setCurrentOpenedWndw $wndw" } else { $callSession setCurrentOpenedWndw $wndw } } itcl::body XTerminal::bind_MouseEnterX { wndw } { if { ![winfo exists .saveAsSetup] || ![winfo ismapped .saveAsSetup] } { focus $wndw event generate $wndw catch { unset selectionStart unset selectionEnd set inputBuffer "" } $wndw mark set insert end $wndw mark set current end $wndw see end } } itcl::body XTerminal::bind_MouseEnter { wndw } { if { ![winfo exists .saveAsSetup] || ![winfo ismapped .saveAsSetup] } { focus $wndw $wndw mark set current [$wndw index insert] $wndw mark set insert [$wndw index insert] } } itcl::body XTerminal::bind_KeyPressDeleteCheck { currentInputKeySym wndw } { set selectionStart [$wndw index insert] set selectionMajor [lindex [split $selectionStart "."] 0] set selectionMinor [lindex [split $selectionStart "."] 1] if { $selectionMajor != $promptMajor } { event generate $wndw catch { unset selectionStart unset selectionEnd } $wndw see end } else { # blocking deletion (backspace or delete key) to remove prompt if { $selectionMinor <= $promptLength } { # pick up the one character is been deleted by "BackSpace or Delete" if { $currentInputKeySym == "BackSpace" } { set currentChar [$wndw get $selectionMajor.[expr $selectionMinor - 1]] } else { set currentChar [$wndw get $selectionMajor.$selectionMinor] } } } } itcl::body XTerminal::bind_KeyReleaseReconstructDelete { wndw } { set currentMajor [lindex [split [$wndw index insert] "."] 0] set currentMinor [lindex [split [$wndw index insert] "."] 1] if { $currentMinor > $promptLength } { if { [info exists inputBuffer] && [string length $inputBuffer] > 0 } { set inputBuffer [string range $inputBuffer 0 [expr [string length $inputBuffer] - 2]] } $wndw mark set current [$wndw index insert] } else { catch { $wndw insert [$wndw index insert] $currentChar } set currentChar "" $wndw mark set current ${currentMajor}.[expr $promptLength + 1] $wndw mark set insert ${currentMajor}.[expr $promptLength + 1] } update idletasks } itcl::body XTerminal::bind_ButtonPressOne { wndw } { if { $appendOutputFlag == "false" } { set selectionStart [$wndw index current] } } itcl::body XTerminal::bind_ButtonReleaseOne { wndw } { if { $appendOutputFlag == "false" } { set selectionEnd [$wndw index current] } } itcl::body XTerminal::bind_ButtonOneMotion { wndw } { if ![info exists selectionStart] { set selectionStart [$wndw index current] } } itcl::body XTerminal::bind_ButtonTwo { wndw { x {} } { y {} } } { set errorFlag [ catch { set result [selection get -selection PRIMARY] } err ] if { !$errorFlag } { set inputBuffer $result } else { set inputBuffer $previousInputBuffer } event generate $wndw catch { unset selectionStart unset selectionEnd } set currentPos [lindex [split [$wndw index insert] "."] 1] set currentMajor [lindex [split [$wndw index insert] "."] 0] $wndw insert end $inputBuffer set previousInputBuffer $inputBuffer set inputBuffer [$wndw get ${currentMajor}.$promptMinor end] set promptStart ${currentMajor}.$promptMinor set promptMajor $currentMajor bind $wndw <> { break } $wndw mark set current [$wndw index insert] update idletasks } itcl::body XTerminal::bind_KeyReleaseReturn { wndw } { global toolHasFinishFlag if { [info exists toolHasFinishFlag($toolServer)] } { #puts "bind_KeyReleaseReturn toolHasFinishFlag($toolServer): $toolHasFinishFlag($toolServer)" } if { ([info exists toolHasFinishFlag($toolServer)] && $toolHasFinishFlag($toolServer) == "continue") || \ [string length [string trim $inputBuffer]] > 0 } { sendTextToTool $inputBuffer set inputBuffer "" } else { appendOutput "$theTool> " OutputChannel NEW_COMMANDS } update idletasks } itcl::body XTerminal::bind_KeyReleaseRight { wndw } { $wndw mark set current [$wndw index insert] update idletasks } itcl::body XTerminal::bind_KeyPressLeft { wndw } { set leftMajor [lindex [split [$wndw index current] "."] 0] set leftMinor [lindex [split [$wndw index current] "."] 1] set promptMajor [lindex [split $promptStart "."] 0] set promptMinor [lindex [split $promptStart "."] 1] if { $leftMajor == $promptMajor } { $wndw mark set insert ${leftMajor}.$leftMinor $wndw mark set current ${leftMajor}.$leftMinor if { $leftMinor < $promptMinor } { event generate $wndw $wndw mark set insert $promptStart } } } itcl::body XTerminal::bind_KeyReleaseLeft { wndw } { $wndw mark set current [$wndw index insert] update idletasks } itcl::body XTerminal::bind_KeyReleaseUp { wndw } { $wndw mark set insert $promptStart if ![info exists selectedHistoryIdx] { set selectedHistoryIdx -1 } incr selectedHistoryIdx if { $selectedHistoryIdx > [expr [llength $inputHistory] - 1] } { set selectedHistoryIdx [expr [llength $inputHistory] - 1] return } set currentSelection [string trim [lindex $inputHistory $selectedHistoryIdx]] set promptStart [$wndw index insert] $wndw delete $promptStart end $wndw insert $promptStart "$currentSelection" $wndw see $promptStart set inputBuffer $currentSelection } itcl::body XTerminal::bind_KeyReleaseDown { wndw } { $wndw mark set insert $promptStart if ![info exists selectedHistoryIdx] { set selectedHistoryIdx [llength $inputHistory] } incr selectedHistoryIdx -1 if { $selectedHistoryIdx < 0 } { set selectedHistoryIdx 0 return } set currentSelection [lindex $inputHistory $selectedHistoryIdx] set promptStart [$wndw index insert] $wndw delete $promptStart end $wndw insert $promptStart "$currentSelection" $wndw see $promptStart set inputBuffer $currentSelection } itcl::body XTerminal::bind_KeyReleaseHome { wndw } { set insertMajor [lindex [split [$wndw index insert] "."] 0] $wndw mark set insert $insertMajor.$promptLength } itcl::body XTerminal::bind_TripleButtonPressOne { wndw } { set triplePressSelection [$wndw index insert] set selectionStart [$wndw index insert] } itcl::body XTerminal::bind_TripleButtonReleaseOne { wndw } { set promptMajor [lindex [split $promptStart "."] 0] set promptMinor [lindex [split $promptStart "."] 1] set buttonMajor [lindex [split $triplePressSelection "."] 0] set buttonMinor [lindex [split $triplePressSelection "."] 1] set selectionEnd [$wndw index insert] if { $buttonMajor == $promptMajor } { selection clear $wndw tag add sel $promptStart end } } itcl::body XTerminal::dragOver { args } { set w [lindex $args 0] $w configure -cursor hand2 #raise [winfo toplevel $w] [focus] } itcl::body XTerminal::dropDraggedItem { args } { global tcl_platform set w [lindex $args 0] set dragFromWndw [focus] $dragFromWndw configure -cursor {} set dragItem [[focus] item cget [[focus] info anchor] 0 -text] set dragItemParent [reverseModifyName [[focus] info parent [[focus] info anchor]]] event generate $w if {[string first "local" $dragFromWndw] >= 0} { set rootDir [${mainWndw}.dirFrame.topLocalDirFrame.localLabelFrame.localDirEntry get] set dragItemParent "" set localFS [gLocalFileSystem] set fileSystem [gLocalFileSystem] } else { set rootDir /heradata/users/$userName set dragItemParent [string range $dragItemParent 1 end] } set result [$fileSystem resolveSymLinks $rootDir$dragItemParent/$dragItem] if { ![info exists inputBuffer] || $inputBuffer == "" } { set inputBuffer $result set promptStart [$w index insert] } else { set inputBuffer [format "%s %s" $inputBuffer $result] } set currentPos [lindex [split [$w index insert] "."] 1] # event generate $outputWndw.txt $w insert [$w index insert] $result $w configure -cursor {} event generate $w $w mark set current [$w index insert] update idletasks focus $w } itcl::body XTerminal::setupRunningState { state } { if { $state == "DONE" } { if { [string first "toolRunnerX" $callSession] < 0 } { $outputWndw.txt configure -cursor {} $outputWndw.title configure -text "$theTool: Done" -fg black $outputWndw.txt configure -state disabled } if { $theTool == "POWplot" } { powResizeScope $powScopeWidth $powScopeHeight } return } if { $state == "WAITING_FOR_NEXT_CMD" } { if { [string first "toolRunnerX" $callSession] < 0 } { $outputWndw.txt configure -cursor {} $outputWndw.title configure -text "$theTool: Done" -fg red } return } if { $theTool == "fdump" } { $outputWndw.txt configure -cursor watch } #update idletasks #scan [winfo geometry $outputWndw] "%dx%d+%d+%d" heraRw heraRh Rx Ry #set x [expr int(([winfo screenwidth .] - $heraRw )/ 2.0)] #catch { wm geometry $outputWndw +${x}-0 } err #update idletasks set childsite [$outputWndw.txt childsite] focus $childsite $outputWndw.title configure -text "$theTool: Running..." -fg red } itcl::body XTerminal::sendTextToTool { cmd } { global toolHasFinishFlag global signalToXterm global tkWaitAnswer global promptWaitAnswer global writeChannelCmd if { [info exists tkWaitAnswer] && [string tolower $tkWaitAnswer] == "wait" } { set tkWaitAnswer $cmd return } switch -exact [string trim [string tolower $cmd]] { "exit" - "quit" { if { $toolServer != "NONE" } { $toolServer writeChannel exit set writeChannelCmd exit $toolServer flushChannel $toolServer shutdownToolServer } appendOutput "cmd> " OutputChannel set toolServer "NONE" return } } if { $toolServer == "NONE" } { # submit the first command # set path "/data" set tokenList [split $cmd " "] set tool [lindex $tokenList 0] set toolServer [$topSession FtoolRunInteractive $cmd] lappend textBuffer $cmd } else { $toolServer writeChannel $cmd set writeChannelCmd $cmd $toolServer flushChannel } } itcl::body XTerminal::processOutput { line lastLineFlag } { global promptWaitAnswer # very likely to be the prompt set promptLineFound false set token [split $line "\n"] set outputLine [string trim $line] set lastChar [string range $outputLine end end] if { $lastLineFlag == "true" } { switch -exact $lastChar { ")" - ">" - "\]" - ":" { set firstChar "NONE" switch -exact $lastChar { "\]" { set firstChar "\[" } } # add a space between prompt and command set currentPrompt [string range $outputLine 0 [expr [string length $outputLine] - 1]] set promptLine [format "%s " $outputLine] # set currentMajor [lindex [split [$outputWndw.txt index insert] "."] 0] set promptMajor [lindex [split [$outputWndw.txt index insert] "."] 0] # index of line position starts from 1 # set promptMajor [expr $currentMajor + 1] # index of character position starts from 0 set promptMinor [string length $promptLine] set promptStart [format "%s.%s" $promptMajor $promptMinor] set promptLength [lindex [split $promptStart "."] 1] # no end of line appended to return string since it represents command line set promptLineFound true if { $promptLine != "$theTool> " } { if { $firstChar != "NONE" } { set idxB [string last $firstChar $promptLine] set idxE [string last $lastChar $promptLine] set promptWaitAnswer [string range $promptLine [expr $idxB + 1] [expr $idxE - 1]] } else { set promptWaitAnswer "NONE" } } else { catch { unset promptWaitAnswer } } return $promptLine } default { catch { unset promptWaitAnswer } # any other type should have end of line appended to it set returnLine $line if { [info exists promptStart] && $promptStart != "X.X" } { set previous_promptStart $promptStart set promptStart "X.X" } return $returnLine } } } else { # any other type should have end of line appended to it set returnLine [format "%s\n" $line] if { [info exists promptStart] && $promptStart != "X.X" } { set previous_promptStart $promptStart set promptStart "X.X" } return $returnLine } } itcl::body XTerminal::appendOutput { output fromWhere { option "NOT_USER_INPUT" } } { global toolHasFinishFlag global writeChannelCmd set checkToken [string trim [lindex [split $output " "] 0]] if [info exists writeChannelCmd] { if { $checkToken == [string trim $writeChannelCmd] && \ [string trim $writeChannelCmd] != "" } return } if { [string tolower $checkToken] == "spawn" } { set idx [string first "\n" $output] set output [string range $output [expr $idx + 1] end] } focus $outputWndw.txt event generate $outputWndw.txt catch { unset selectionStart unset selectionEnd } set appendOutputFlag true # no need to append output if outputWndw not exist or tool has finished if { [info exists toolHasFinishFlag($toolServer)] && \ $toolHasFinishFlag($toolServer) == "true" && [string trim $output] == "" } { return } set resultData {} if { $output != "" } { # split the output into lines set resultData [split $output \n] set moreFlag false set moreStrOutput "" # get rid of any occurance of line feed "\n" at the end of TOTAL data stream # the reason is to find out if last non-empty line contains prompt set stopFlag "false" while { $stopFlag == "false" } { set token [lindex $resultData end] if { [string length [string trim $token]] <= 0 } { set resultData [lreplace $resultData end end] } else { set stopFlag true } } } else { return } # begin process line by line for {set i 0} {$i < [llength $resultData]} {incr i} { # get current line set inputLine [lindex $resultData $i] if { $i == [expr [llength $resultData] - 1] } { # last line set outputLine [processOutput $inputLine true] } else { set outputLine [processOutput $inputLine false] } # Debug #set outputLine [format "%s. %s" $nextLineNumber $outputLine] #if { $promptStart != "X.X" } { # set promptMajor [lindex [split $promptStart "."] 0] # set promptMinor [lindex [split $promptStart "."] 1] # set promptStart [format "%s.%s" $promptMajor [expr [string length $nextLineNumber] + 2 + $promptMinor]] # set promptMajor [lindex [split $promptStart "."] 0] # set promptMinor [lindex [split $promptStart "."] 1] #} # to see if "more" is part of string set moreStr [string tolower [string range $outputLine 0 3]] if { $moreStr == "more" } { set moreStrOutput $outputLine set moreFlag true } set systemInsertMajor [lindex [split [$outputWndw.txt index insert] "."] 0] set systemInsertMinor [lindex [split [$outputWndw.txt index insert] "."] 1] if { $systemInsertMajor != $nextLineNumber } { # meaning system is try to insert the line at the position that is different # than the desired insert loction if { ($systemInsertMinor == 0 || $systemInsertMinor == $promptLength) && \ $systemInsertMajor < $nextLineNumber } { # system has determined that insert the line into a right position than determined set nextLineNumber $systemInsertMajor } else { $outputWndw.txt insert end "\n" incr nextLineNumber } } if { $outputLine == "$theTool> " && $option != "NEW_WINDOWS" && $option != "NEW_COMMANDS"} { # set outputLine [format "%s" $outputLine] } set errorFlag [ catch { set idx1 [$outputWndw.txt index "end - 1 char"] $outputWndw.txt insert ${nextLineNumber}.$systemInsertMinor $outputLine set idx2 [$outputWndw.txt index "end - 1 char"] $outputWndw.txt see end if { $fromWhere == "ErrorChannel" } { $outputWndw.txt tag add errorTag $idx1 $idx2 } else { if { $option == "USER_INPUT" } { $outputWndw.txt tag add inputTag $idx1 $idx2 } } } err] lappend textBuffer $outputLine incr nextLineNumber } if { $promptStart == "X.X" } { # last line does not contain prompt set promptStart $previous_promptStart $outputWndw.txt insert ${nextLineNumber}.0 "\n" incr nextLineNumber } if { $moreFlag == "true" } { if { $nextLineNumber < $maxMark } { # this is for very large output, allow a break for user to determine if he/she want to continue sendTextToTool "y" } else { $outputWndw.txt see end } } set appendOutputFlag false # now determine where the insert cursor is set currentPosMinor [lindex [split [$outputWndw.txt index insert] "."] 1] if { $currentPosMinor == 0 } { # current pos is at 0 } set childsite [$outputWndw.txt childsite] focus $childsite update idletasks } itcl::body XTerminal::reverseModifyName { name } { set newName "" for {set i 0} {$i < [string length $name]} {incr i} { if [string match "%" [string range $name $i $i]] { set newSubString " " } else { set newSubString [string range $name $i $i] } set newName [format "%s%s" $newName $newSubString] } return $newName } itcl::body XTerminal::_sendPanicSignal { wndw } { catch { $toolServer shutdownToolServer } if { $wndw != "NONE" } { $outputWndw.txt configure -cursor {} $outputWndw.title configure -text "$theTool: Done" -fg black $outputWndw.txt configure -state disabled $wndw configure -state disabled } else { catch { itcl::delete object $toolServer } catch { itcl::delete object $runner } catch { unset runner } # append prompt and ready to accept new command appendOutput "cmd> " OutputChannel set toolServer "NONE" } } itcl::body XTerminal::setEditor {} { set viewer [.newTextEditor.entry get] } itcl::body XTerminal::checkEditor { fileName } { global outFlag set outFlag false while (1) { set errorFlag [ catch { exec $viewer $fileName } err ] if { !$errorFlag } { break } toplevel .newTextEditor set top .newTextEditor wm geometry $top 300x100 wm title $top "New Text Editor" label $top.label -text "$viewer not found.\nPlease enter new text editor name on Windows" entry $top.entry -width 40 -bg white frame $top.frame button $top.frame.action -text "GO" -command "[itcl::code $this setEditor] ; destroy .newTextEditor" button $top.frame.cancel -text "Cancel" -command "destroy .newTextEditor ; set outFlag true" pack $top.frame.action $top.frame.cancel -side left -padx 5 pack $top.label pack $top.entry pack $top.frame tkwait window .newTextEditor if { $outFlag == "true" } break } } itcl::body XTerminal::printOutput {} { set tmpFile [format "%s/%s" $::env(HOME) tmpfile_[clock seconds]] set f [open $tmpFile "w"] foreach line $textBuffer { puts $f $line } close $f if { $::isWin } { checkEditor $tmpFile } else { set errorFlag [ catch { exec lp $tmpFile } err ] if { $errorFlag } { tk_messageBox -icon error -type ok \ -message "Failed to print. Error: $err" } else { tk_messageBox -icon info -type ok \ -message "The file has been printed.. $err" } } file delete -force $tmpFile } itcl::body XTerminal::saveAs {} { global g_titleFont powbg if [winfo exists .saveAsSetup] { wm deiconify .saveAsSetup return } toplevel .saveAsSetup bind .saveAsSetup <> "destroy .saveAsSetup" wm title .saveAsSetup "Save File As" grid rowconfigure .saveAsSetup 2 -weight 1 grid columnconfigure .saveAsSetup 0 -weight 1 grid columnconfigure .saveAsSetup 1 -weight 1 frame .saveAsSetup.directory -bd 2 -relief ridge label .saveAsSetup.directory.dirLabel -text "Directory: " -font g_titleFont entry .saveAsSetup.directory.saveInEntry -width 35 -bg white -font g_titleFont .saveAsSetup.directory.saveInEntry delete 0 end .saveAsSetup.directory.saveInEntry insert end [pwd] set directoryValue [pwd] tixDirTree .saveAsSetup.directory.directoryTree -value $directoryValue \ -browsecmd [itcl::code $this saveAsSelectDirectory] \ -command [itcl::code $this saveAsSelectDirectory] \ -options { \ hlist.foreground black \ hlist.background white \ hlist.font g_titleFont \ hlist.width 40 \ } set selectDirectory $directoryValue grid .saveAsSetup.directory -row 2 -column 0 -sticky news -columnspan 5 -rowspan 10 grid .saveAsSetup.directory.dirLabel -row 2 -column 0 -sticky nw grid .saveAsSetup.directory.saveInEntry -row 2 -column 1 -sticky new grid .saveAsSetup.directory.directoryTree -row 3 -column 0 -columnspan 5 -rowspan 10 -sticky news grid columnconfigure .saveAsSetup.directory 1 -weight 1 grid rowconfigure .saveAsSetup.directory 3 -weight 1 bind .saveAsSetup.directory.saveInEntry { [.saveAsSetup.directory.directoryTree subwidget hlist] delete all destroy .saveAsSetup.directory.directoryTree tixDirTree .saveAsSetup.directory.directoryTree \ -value [.saveAsSetup.directory.saveInEntry get] \ -browsecmd [itcl::code $this saveAsSelectDirectory] \ -command [itcl::code $this saveAsSelectDirectory] \ -options { \ hlist.foreground black \ hlist.background white \ hlist.font g_titleFont \ hlist.width 40 \ } grid .saveAsSetup.directory.directoryTree -row 3 -column 0 -columnspan 5 -rowspan 10 -sticky news } frame .saveAsSetup.file label .saveAsSetup.file.fileNameLbl -text "File name:" -font g_titleFont entry .saveAsSetup.file.fileNameEntry -width 35 -bg white -font g_titleFont .saveAsSetup.file.fileNameEntry insert end $savedFileName grid .saveAsSetup.file -row 13 -column 0 -sticky news -columnspan 5 -rowspan 2 grid .saveAsSetup.file.fileNameLbl -row 0 -column 0 -sticky nw grid .saveAsSetup.file.fileNameEntry -row 0 -column 1 -sticky new grid columnconfigure .saveAsSetup.file 1 -weight 1 frame .saveAsSetup.action button .saveAsSetup.action.ok -text "OK" -font g_titleFont -command [itcl::code $this saveFile] label .saveAsSetup.action.blanklabel -text " " -font g_titleFont button .saveAsSetup.action.cancel -text "Cancel" -font g_titleFont \ -command { wm withdraw .saveAsSetup } grid .saveAsSetup.action -row 18 -column 0 -columnspan 6 -sticky news grid .saveAsSetup.action.ok -row 0 -column 1 -sticky w grid .saveAsSetup.action.blanklabel -row 0 -column 2 -columnspan 2 -sticky news grid .saveAsSetup.action.cancel -row 0 -column 4 -sticky e wm geometry .saveAsSetup +[expr [winfo screenwidth .] / 3]+[expr [winfo screenheight .] / 2] } itcl::body XTerminal::saveFile {} { set savedFileName [.saveAsSetup.file.fileNameEntry get] set selectDirectory [.saveAsSetup.directory.saveInEntry get] ; \ if [file exists $selectDirectory/$savedFileName] { set ans [tk_messageBox -icon warning -type okcancel \ -message "File exists. Do you want to write over it?"] if { $ans == "cancel" } { return } } set fd [open $selectDirectory/$savedFileName "w+"] foreach line $textBuffer { puts $fd [string trim $line \n] } close $fd wm withdraw .saveAsSetup } itcl::body XTerminal::saveAsSelectDirectory { dir } { set selectDirectory $dir .saveAsSetup.directory.saveInEntry delete 0 end .saveAsSetup.directory.saveInEntry insert end $selectDirectory } itcl::body XTerminal::_displayHistory {} { if [winfo exists .history] { destroy .history } toplevel .history set top .history wm title $top "Command History" wm geometry $top +[winfo pointerx .]+[winfo pointery .] listbox $top.historyList -relief sunken -borderwidth 2 -bg white -fg black \ -yscrollcommand "$top.scroll set" pack $top.historyList -side left scrollbar $top.scroll -command "$top.historyList yview" pack $top.scroll -side right -fill y foreach dirName $inputHistory { $top.historyList insert end $dirName } bind $top { destroy .history } bind $top [itcl::code $this _getPreviousHistory] } itcl::body XTerminal::_getPreviousHistory {} { set chosedCmd [selection get] set wndw [$outputWndw.txt childsite] $wndw mark set insert $promptStart set selectedHistoryIdx [lsearch -exact $inputHistory $chosedCmd] set minor [lindex [split $promptStart "."] 1] set major [lindex [split [$wndw index insert] "."] 0] $wndw delete ${major}.${minor} end $wndw insert ${major}.${minor} "$chosedCmd" $wndw see ${major}.${minor} set promptStart ${major}.${minor} set inputBuffer $chosedCmd destroy .history } itcl::body XTerminal::setLocalHandler { obj } { set callSession $obj } itcl::body XTerminal::receiveOutput { args } { global toolHasFinishFlag #puts "XTerminal receiveOutput: args: $args" set type [lindex $args 0] set value [lindex $args 1] if { [llength $args] > 2 } { set package [lindex $args 2] set resetParam "[lindex $args 3] [lindex $args 4]" for { set i 5 } { $i < [llength $args] } {incr i} { if { [string first "mode" [lindex $args $i]] < 0 } { set resetParam [format "%s %s" $resetParam [lindex $args $i]] } } } #puts "resetParam: $resetParam" switch -glob -- $type { "toolInXtermDone" { set toolHasFinishFlag($value) continue #puts "scriptFlag: $scriptFlag" catch { $value shutdownToolServer itcl::delete object $value [gNotifications default] removeObserver $this $value "*" itcl::delete object $runner unset runner } # delete temporary directory #puts "delete temp directory" set result [$mySession askDeleteTempDir $userName [file tail $path] $scriptFlag] # set parfile to what user input if { [llength $args] > 2 } { catch { unset toolHasFinishFlag($value) } set toolHasFinishFlag($toolServer) false set path "/data" set toolServer [$mySession tool $userName $path] [gNotifications default] addObserver $this notify $toolServer "*" catch { $toolServer runTool $package $resetParam } err #$toolServer shutdownToolServer #itcl::delete object $toolServer set toolHasFinishFlag($toolServer) continue set theOperation [lindex [split [lindex $args 4] "."] 0] } # append prompt and ready to accept new command appendOutput "$theTool> " OutputChannel set toolServer "NONE" if { $plistFlag == "true" } { sendTextToTool "plist $theOperation" set plistFlag false } #puts "done delete temp directory" } "toolToXtermDone" { set toolHasFinishFlag($value) continue $value shutdownToolServer itcl::delete object $value # append prompt and ready to accept new command appendOutput "$theTool> " OutputChannel set toolServer "NONE" } "herahtmlbrowser" { if { $wndwOption == "parameter" } { $callSession notifyHeraClient "herahtmlbrowser $value" } else { $callSession receiveOutput herahtmlbrowser $value } } } } itcl::body XTerminal::addToHistory { cmd } { set inputOldHistory $inputHistory unset inputHistory # reverse order lappend inputHistory $cmd foreach history $inputOldHistory { lappend inputHistory $history } set selectedHistoryIdx -1 } itcl::body XTerminal::changeToolServer { srvr } { global toolHasFinishFlag catch { unset toolHasFinishFlag($toolServer) } set toolServer $srvr if { $srvr != "NONE" } { set toolHasFinishFlag($toolServer) false } } itcl::body XTerminal::Dump_Session {} { set logfile [ tk_getSaveFile -initialfile "ftool.log"] if { $logfile == "" } { return } set channel [open $logfile a] set num [llength $textBuffer] for {set i 0} {$i < $num} {incr i} { puts $channel [lindex $textBuffer $i] } close $channel } itcl::body XTerminal::Dump_Cmd {} { set cmdlogfile [ tk_getSaveFile -initialfile "ftool_cmd.log"] if { $cmdlogfile == "" } { return } set channel [open $cmdlogfile a] set num [llength $inputHistory] for {set i 0} {$i < $num} {incr i} { puts $channel [lindex $inputHistory $i] } close $channel } fv5.4/ftools/guis/fgui/class/fguiCore.tcl0000755000220700001010000000414410604522466020002 0ustar birbylheadevproc fguiInit { args } { global g_ftoolflag global g_titleFont global tcl_platform global isWin isMac # Load Itcl/Itk packages wm withdraw . package require Itcl package require Itk package require Iwidgets set isWin 0 set isMac 0 if { $tcl_platform(platform) == "windows" } { set isWin 1 font create g_titleFont -family Arial -size -12 font create g_notebookTitleFont -family Arial -size -14 } elseif { $tcl_platform(platform) == "macintosh" } { set isMac 1 font create g_titleFont -family system -size -12 font create g_notebookTitleFont -family system -size -14 } else { font create g_titleFont -family Helvetica -size -12 -weight bold font create g_notebookTitleFont -family Helvetica -size -14 -weight bold } font create g_entryFont -family Courier -size -12 set g_charPix [font measure g_entryFont m] # These lines guarantee that the default fonts are always loaded. entry .dummyFnt1 entry .dummyFnt2 -font g_entryFont entry .dummyFnt3 -font g_titleFont entry .dummyFnt4 -font g_notebookTitleFont if ![info exists g_ftoolflag ] { set g_ftoolflag 1 FtoolInstance fguiFtool } catch { fguiFtool MainMenu } err } set ::g_fguiHelpFiles [list \ "FTOOL Execution" ftool.html \ ] proc hhelp {topic_} { global g_fguiHelpFiles global isWin global env if { [string match "*.html" $topic_] } { set topic_ [string range $topic_ 0 end-5] } if { [winfo exist .hyperHelp] == 0} { if { $isWin } { set size large } else { set size medium } set allTopics {} foreach [list aTitle aTopic] $g_fguiHelpFiles { lappend allTopics [list $aTitle $aTopic] } iwidgets::hyperhelp .hyperHelp -title "fgui: Hyperhelp" \ -topics $allTopics \ -fontname courier -fontsize $size \ -helpdir $env(FGUI_HELPDIR) } .hyperHelp showtopic $topic_ catch {.hyperHelp activate} } fv5.4/ftools/guis/fgui/class/fguiNotebook.tcl0000644000220700001010000002214510615472066020672 0ustar birbylheadev# A fguiNotebook widget for Tcl/Tk # $Revision: 1.1 $ # # Copyright (C) 1996,1997,1998 D. Richard Hipp # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # # Author contact information: # drh@acm.org # http://www.hwaci.com/drh/ # # Create a new notebook widget # proc fguiNotebook:create {w args} { global fguiNotebook powbg global g_notebookTitleFont set fontName [font names] if { [string first "g_notebookTitleFont" $fontName] >= 0 } { set fguiNotebook($w,fontName) g_notebookTitleFont } else { set fguiNotebook($w,fontName) [list System 16] } set fguiNotebook($w,width) 300 set fguiNotebook($w,height) 300 set fguiNotebook($w,pages) {} set fguiNotebook($w,top) 0 set fguiNotebook($w,pad) 5 set fguiNotebook($w,fg,on) black set fguiNotebook($w,textFg,on) black set fguiNotebook($w,textFg,off) grey50 set fguiNotebook($w,fg,off) grey50 canvas $w -bd 0 -highlightthickness 0 -takefocus 0 set fguiNotebook($w,bg) [$w cget -bg] bind $w <1> "fguiNotebook:click $w %x %y" bind $w "fguiNotebook:scheduleExpand $w" eval fguiNotebook:config $w $args } # # Change configuration options for the notebook widget # proc fguiNotebook:config {w args} { global fguiNotebook foreach {tag value} $args { switch -- $tag { -width { set fguiNotebook($w,width) $value } -height { set fguiNotebook($w,height) $value } -pages { set fguiNotebook($w,pages) $value } -pad { set fguiNotebook($w,pad) $value } -bg { set fguiNotebook($w,bg) $value } -fg { set fguiNotebook($w,fg,on) $value } -disabledforeground { set fguiNotebook($w,fg,off) $value } -font { set fguiNotebook($w,fontName) $value } -textFg { set fguiNotebook($w,textFg,on) $value } } } # # After getting new configuration values, reconstruct the widget # $w delete all set fguiNotebook($w,x1) $fguiNotebook($w,pad) set fguiNotebook($w,x2) [expr $fguiNotebook($w,x1)+2] set fguiNotebook($w,x3) [expr $fguiNotebook($w,x2)+$fguiNotebook($w,width)] set fguiNotebook($w,x4) [expr $fguiNotebook($w,x3)+2] set fguiNotebook($w,y1) [expr $fguiNotebook($w,pad)+2] set fguiNotebook($w,y2) [expr $fguiNotebook($w,y1)+2] set fguiNotebook($w,y5) [expr $fguiNotebook($w,y1)+30] set fguiNotebook($w,y6) [expr $fguiNotebook($w,y5)+2] set fguiNotebook($w,y3) [expr $fguiNotebook($w,y6)+$fguiNotebook($w,height)] set fguiNotebook($w,y4) [expr $fguiNotebook($w,y3)+2] set x $fguiNotebook($w,x1) set cnt 0 set y7 [expr $fguiNotebook($w,y1)+10] foreach p $fguiNotebook($w,pages) { set fguiNotebook($w,p$cnt,x5) $x set id [$w create text 0 0 -text $p -anchor nw -tags "p$cnt t$cnt" \ -font $fguiNotebook($w,fontName) \ -fill $fguiNotebook($w,textFg,on)] set bbox [$w bbox $id] set width [lindex $bbox 2] $w move $id [expr $x+10] $y7 $w create line \ $x $fguiNotebook($w,y5)\ $x $fguiNotebook($w,y2) \ [expr $x+2] $fguiNotebook($w,y1) \ [expr $x+$width+16] $fguiNotebook($w,y1) \ -width 2 -fill white -tags p$cnt $w create line \ [expr $x+$width+16] $fguiNotebook($w,y1) \ [expr $x+$width+18] $fguiNotebook($w,y2) \ [expr $x+$width+18] $fguiNotebook($w,y5) \ -width 2 -fill black -tags p$cnt set x [expr $x+$width+20] set fguiNotebook($w,p$cnt,x6) [expr $x-2] if {![winfo exists $w.f$cnt]} { frame $w.f$cnt -bd 0 } place $w.f$cnt -x $fguiNotebook($w,x2) -y $fguiNotebook($w,y6) \ -width $fguiNotebook($w,width) -height $fguiNotebook($w,height) $w.f$cnt config -bg $fguiNotebook($w,bg) incr cnt } $w create line \ $fguiNotebook($w,x1) [expr $fguiNotebook($w,y5)-2] \ $fguiNotebook($w,x1) $fguiNotebook($w,y3) \ -width 2 -fill white $w create line \ $fguiNotebook($w,x1) $fguiNotebook($w,y3) \ $fguiNotebook($w,x2) $fguiNotebook($w,y4) \ $fguiNotebook($w,x3) $fguiNotebook($w,y4) \ $fguiNotebook($w,x4) $fguiNotebook($w,y3) \ $fguiNotebook($w,x4) $fguiNotebook($w,y6) \ $fguiNotebook($w,x3) $fguiNotebook($w,y5) \ -width 2 -fill black if {![info exists fguiNotebook($w,expand)]} { $w config -width [expr $fguiNotebook($w,x4)+$fguiNotebook($w,pad)] \ -height [expr $fguiNotebook($w,y4)+$fguiNotebook($w,pad)] \ -bg $fguiNotebook($w,bg) } set top $fguiNotebook($w,top) set fguiNotebook($w,top) -1 fguiNotebook:raise.page $w $top } # # This routine is called whenever the mouse-button is pressed over # the notebook. It determines if any page should be raised and raises # that page. # proc fguiNotebook:click {w x y} { global fguiNotebook if {$y<$fguiNotebook($w,y1) || $y>$fguiNotebook($w,y6)} return set N [llength $fguiNotebook($w,pages)] for {set i 0} {$i<$N} {incr i} { if {$x>=$fguiNotebook($w,p$i,x5) && $x<=$fguiNotebook($w,p$i,x6)} { fguiNotebook:raise.page $w $i break } } } # # For internal use only. This procedure raised the n-th page of # the notebook # proc fguiNotebook:raise.page {w n} { global fguiNotebook if {$n<0 || $n>=[llength $fguiNotebook($w,pages)]} return set top $fguiNotebook($w,top) if {$top>=0 && $top<[llength $fguiNotebook($w,pages)]} { $w move p$top 0 2 } $w move p$n 0 -2 $w delete topline if {$n>0} { $w create line \ $fguiNotebook($w,x1) $fguiNotebook($w,y6) \ $fguiNotebook($w,x2) $fguiNotebook($w,y5) \ $fguiNotebook($w,p$n,x5) $fguiNotebook($w,y5) \ $fguiNotebook($w,p$n,x5) [expr $fguiNotebook($w,y5)-2] \ -width 2 -fill white -tags topline } $w create line \ $fguiNotebook($w,p$n,x6) [expr $fguiNotebook($w,y5)-2] \ $fguiNotebook($w,p$n,x6) $fguiNotebook($w,y5) \ -width 2 -fill white -tags topline $w create line \ $fguiNotebook($w,p$n,x6) $fguiNotebook($w,y5) \ $fguiNotebook($w,x3) $fguiNotebook($w,y5) \ -width 2 -fill white -tags topline set fguiNotebook($w,top) $n raise $w.f$n } # # Change the page-specific configuration options for the notebook # proc fguiNotebook:pageconfig {w name args} { global fguiNotebook set i [lsearch $fguiNotebook($w,pages) $name] if {$i<0} return foreach {tag value} $args { switch -- $tag { -state { if {"$value"=="disabled"} { $w itemconfig t$i -fg $fguiNotebook($w,fg,off) } else { $w itemconfig t$i -fg $fguiNotebook($w,fg,on) } } -onexit { set fguiNotebook($w,p$i,onexit) $value } } } } # # This procedure raises a notebook page given its name. But first # we check the "onexit" procedure for the current page (if any) and # if it returns false, we don't allow the raise to proceed. # proc fguiNotebook:raise {w name} { global fguiNotebook set i [lsearch $fguiNotebook($w,pages) $name] if {$i<0} return if {[info exists fguiNotebook($w,p$i,onexit)]} { set onexit $fguiNotebook($w,p$i,onexit) if {"$onexit"!="" && [eval uplevel #0 $onexit]!=0} { fguiNotebook:raise.page $w $i } } else { fguiNotebook:raise.page $w $i } } # # Return the frame associated with a given page of the notebook. # proc fguiNotebook:frame {w name} { global fguiNotebook set i [lsearch $fguiNotebook($w,pages) $name] if {$i>=0} { return $w.f$i } else { return {} } } # # Try to resize the notebook to the next time we become idle. # proc fguiNotebook:scheduleExpand w { global fguiNotebook if {[info exists fguiNotebook($w,expand)]} return set fguiNotebook($w,expand) 1 after idle "fguiNotebook:expand $w" } # # Resize the notebook to fit inside its containing widget. # proc fguiNotebook:expand w { global fguiNotebook set wi [expr [winfo width $w]-($fguiNotebook($w,pad)*2+4)] set hi [expr [winfo height $w]-($fguiNotebook($w,pad)*2+36)] fguiNotebook:config $w -width $wi -height $hi catch {unset fguiNotebook($w,expand)} } # # Locate minimum dimensions of frame and expand to it # proc fguiNotebook:resize w { global fguiNotebook update set minWid [expr [winfo width $w]-($fguiNotebook($w,pad)*2+4)] set minHgt [expr [winfo height $w]-($fguiNotebook($w,pad)*2+36)] foreach pg $fguiNotebook($w,pages) { set frm [fguiNotebook:frame $w $pg] set hgt [winfo reqheight $frm] set wid [winfo reqwidth $frm] if { $hgt>$minHgt } { set minHgt $hgt } if { $wid>$minWid } { set minWid $wid } } fguiNotebook:config $w -width $minWid -height $minHgt } fv5.4/ftools/guis/fgui/class/fguiPreferences.tcl0000644000220700001010000003066610615472066021362 0ustar birbylheadev# When this class is initialized in FVFtool.tcl, the constructor will create a # ::fguiPref namespace with various variable names itcl::class fguiPreferences { # Create and initialize fguiPref namespace constructor { args } {} destructor { } public { method save { } method edit { {page "fgui"} } method close { } method raisePage { page } method _askDirectorySetup {} } private { method _read {} method _buildPage_App { w } method _buildPage_Web { w } method _buildPage_Colors { w } method _changeColor { type } method _changeWindowColors { win type } variable note variable _FGUIRC variable _padXAmnt 10 variable _padYAmnt 3 variable _tabLabels [list App Web Colors] } } itcl::body fguiPreferences::constructor { args } { global tcl_platform env FITSVIEWER_LIBRARY global g_titleFont switch $tcl_platform(platform) { "macintosh" { set _FGUIRC [file join $env(PREF_FOLDER) "fgui Preferences"] } "windows" { set FITSVIEWER_LIBRARY $env(FITSVIEWER_LIBRARY) set _FGUIRC [file join $FITSVIEWER_LIBRARY "fgui.ini"] # Pan Chai: uncomment when XPA is available in Windows # lappend _tabLabels Library } default { set _FGUIRC "~/.fguirc" } } option add *fguiPreference.font g_titleFont # Create and initialize fguiPref namespace namespace eval ::fguiPref { variable globalBgColor #cccccc variable globalFgColor black variable activeBgColor #eeeeee variable activeFgColor black variable checkBBgColor red variable FtoolsHeadasRoot "None Defined" variable BrowserSetting "None Defined" } # Override some defaults based on enviroment set tmpBg [option get . background Background] if { $tmpBg != ""} { set fguiPref::globalBgColor $tmpBg } set tmpFg [option get . foreground Foreground] if { $tmpFg != ""} { set fguiPref::globalFgColor $tmpFg } if { $tcl_platform(platform)=="macintosh" } { set fguiPref::globalBgColor "#eeeeee" set fguiPref::activeBgColor "#cccccc" } if { $tcl_platform(platform) != "windows" } { set fguiPref::BrowserSetting "None Defined" } # Read in the preferences file _read } itcl::body fguiPreferences::destructor { } { if { [winfo exists .fguipref] } { destroy .fguipref } } itcl::body fguiPreferences::edit { {page "fgui"} } { global tcl_platform global g_titleFont if { [winfo exists .fguipref] } { if {$tcl_platform(platform)!= "windows"} { .fguipref activate fguiNotebook:raise [.fguipref childsite].notebook $page # since the notebook does not actual destroy, we need this line to update graph size } else { focus .fguipref raise .fguipref fguiNotebook:raise .fguipref.notebook $page } return } ########### # Setup Dialog Box ########### if { $tcl_platform(platform) != "windows" } { ::iwidgets::dialogshell .fguipref -title "fv: Preferences" -modality "none" .fguipref add Save -text "Save" -command [itcl::code $this save] -font g_titleFont .fguipref add Help -text "Help" -command "hhelp preferences" -font g_titleFont .fguipref add Exit -text "Exit" -command [itcl::code $this close] -font g_titleFont .fguipref default Exit } else { toplevel .fguipref -class Dialog wm title .fguipref "fgui: Preferences" frame .fguipref.buts button .fguipref.buts.save -text Save -command [itcl::code $this save] -font g_titleFont button .fguipref.buts.help -text Help -command "hhelp preferences" -font g_titleFont button .fguipref.buts.exit -text Exit -command [itcl::code $this close] -font g_titleFont pack .fguipref.buts.save -side left -padx 30 -pady 4 pack .fguipref.buts.help -side left -padx 30 -pady 4 pack .fguipref.buts.exit -side right -padx 30 -pady 4 } bind .fguipref <> [itcl::code $this close] ########### # Setup Tabbed fguiNotebook Widget ########### if {$tcl_platform(platform) != "windows" } { set note "[.fguipref childsite].notebook" } else { set note .fguipref.notebook } catch { fguiNotebook:create $note -pages $_tabLabels -pad 8 } err foreach p $_tabLabels { if { $tcl_platform(platform) == "windows" && $p == "Web" } continue eval _buildPage_$p [fguiNotebook:frame $note $p] } pack $note -fill both -expand 1 ########### # Display dialog ########### fguiNotebook:raise $note $page fguiNotebook:raise.page $note [lsearch $_tabLabels "Graphs"] fguiNotebook:resize $note if {$tcl_platform(platform) != "windows" } { .fguipref activate } else { pack .fguipref.buts } } itcl::body fguiPreferences::raisePage { page } { fguiNotebook:raise.page $note [lsearch $_tabLabels $page] fguiNotebook:resize $note } itcl::body fguiPreferences::close { } { global tcl_platform if { [winfo exists .fguipref] } { if {$tcl_platform(platform) == "windows" } { destroy .fguipref } else { .fguipref deactivate } } } itcl::body fguiPreferences::_read { } { global tcl_platform if { ![catch { set rcFile [open $_FGUIRC r] } ] } { while { [gets $rcFile line] != -1} { set entry [lindex $line 0] set value [lindex $line 1] if { [string length [string trim $entry]] <= 0 } continue switch -glob -- $entry { "Background" { set fguiPref::globalBgColor $value } "Foreground" { set fguiPref::globalFgColor $value } "ActiveBackground" { set fguiPref::activeBgColor $value } "ActiveForeground" { set fguiPref::activeFgColor $value } "CheckButtonColor" { set fguiPref::checkBBgColor $value } "FtoolsHeadasRoot" { set fguiPref::FtoolsHeadasRoot $value } "BrowserSetting" { set fguiPref::BrowserSetting "$value" } "#*" { } default { if [info exist fguiPref::$entry] { set fguiPref::$entry $value } } } } ::close $rcFile } option add *Background $fguiPref::globalBgColor option add *Foreground $fguiPref::globalFgColor option add *HighlightBackground $fguiPref::globalBgColor option add *activeForeground $fguiPref::activeFgColor option add *activeBackground $fguiPref::activeBgColor option add *selectForeground $fguiPref::activeFgColor option add *selectBackground $fguiPref::activeBgColor option add *selectColor $fguiPref::checkBBgColor } itcl::body fguiPreferences::save {} { global tcl_platform # check if _FGUIRC file is there catch { [file delete -force $_FGUIRC]} if { [catch {set rcFile [open $_FGUIRC w]} err] == 1} { error "Unable to open $_FGUIRC to write" return } puts $rcFile "\# Please don't change this file. It's auto generated by fgui" puts $rcFile "Background $fguiPref::globalBgColor" puts $rcFile "Foreground $fguiPref::globalFgColor" puts $rcFile "ActiveBackground $fguiPref::activeBgColor" puts $rcFile "ActiveForeground $fguiPref::activeFgColor" puts $rcFile "CheckButtonColor $fguiPref::checkBBgColor" puts $rcFile "FtoolsHeadasRoot $fguiPref::FtoolsHeadasRoot" if { [info exists ::fguiPref::BrowserSetting] && \ [string trim $fguiPref::BrowserSetting] != "None Defined" && \ $tcl_platform(platform) != "windows" } { puts $rcFile "BrowserSetting $fguiPref::BrowserSetting" } ::close $rcFile # puts "Options saved in $_FGUIRC" } ########################################################## ############# Private Functions ################ ########################################################## ################## # # Setup Page: Web # ################## itcl::body fguiPreferences::_buildPage_Web { w } { global tcl_platform global g_titleFont option add *textBackground white ::iwidgets::entryfield $w.browser -labeltext "Html Browser:" -labelfont g_titleFont -width 15 \ -textvariable fguiPref::BrowserSetting grid $w.browser -row 5 -column 1 -sticky w -pady $_padYAmnt grid columnconfig $w 1 -weight 1 } ################## # # Setup Page: File Selection # ################## itcl::body fguiPreferences::_buildPage_App { w } { global tcl_platform global g_titleFont ::iwidgets::entryfield $w.headas -labeltext "Headas Root:" -labelfont g_titleFont -width 15 \ -textvariable fguiPref::FtoolsHeadasRoot grid $w.headas -row 1 -column 1 -sticky w -pady $_padYAmnt -padx $_padXAmnt grid columnconfig $w 1 -weight 1 } ################## # # Setup Page: Colors grid columnconfig $w 1 -weight 1 # ################## itcl::body fguiPreferences::_buildPage_Colors { w } { global g_titleFont set row 1 foreach lbl [list \ Background: \ Foreground: \ "Active Background:" \ "Active Foreground:" \ "Check Button:"] \ var [list \ globalBg \ globalFg \ activeBg \ activeFg \ checkBBg] { label $w.clab$row -text $lbl -font g_titleFont button $w.cbtn$row -textvariable fguiPref::${var}Color -width 7 \ -command [itcl::code $this _changeColor $var] -font g_titleFont grid $w.clab$row -row $row -column 1 -sticky w -pady 0 \ -padx $_padXAmnt grid $w.cbtn$row -row $row -column 2 -sticky w -pady 0 \ -padx 0 incr row } grid columnconfigure $w 2 -weight 1 } itcl::body fguiPreferences::_changeColor {type} { switch $type { "globalBg" { set currColor $fguiPref::globalBgColor } "globalFg" { set currColor $fguiPref::globalFgColor } "activeBg" { set currColor $fguiPref::activeBgColor } "activeFg" { set currColor $fguiPref::activeFgColor } "checkBBg" { set currColor $fguiPref::checkBBgColor } default { set currColor "black" } } set tmpColor [tk_chooseColor -initialcolor $currColor] if { $tmpColor == "" } return switch $type { "globalBg" { option add *Background $tmpColor option add *HighlightBackground $tmpColor set fguiPref::globalBgColor $tmpColor } "globalFg" { option add *Foreground $tmpColor set fguiPref::globalFgColor $tmpColor } "activeFg" { option add *activeForeground $tmpColor set fguiPref::activeFgColor $tmpColor } "activeBg" { option add *activeBackground $tmpColor set fguiPref::activeBgColor $tmpColor } "checkBBg" { option add *selectColor $tmpColor set fguiPref::checkBBgColor $tmpColor } default {error "Unknown color type"} } # find all the windows and change their color set tmpWins [winfo children .] foreach i $tmpWins { _changeWindowColors $i $type } } itcl::body fguiPreferences::_changeWindowColors {win type} { switch $type { "globalBg" { catch {$win configure -background $fguiPref::globalBgColor} catch {$win configure -highlightbackground $fguiPref::globalBgColor} if { [winfo class $win] == "Checkbutton" } { catch {$win configure -activebackground $fguiPref::globalBgColor} } } "globalFg" { fguiNotebook:config $note -textFg $fguiPref::globalFgColor catch {$win configure -foreground $fguiPref::globalFgColor} } "activeFg" { catch {$win configure -activeforeground $fguiPref::activeFgColor} } "activeBg" { catch {$win configure -activebackground $fguiPref::activeBgColor} } "checkBBg" { catch {$win configure -selectcolor $fguiPref::checkBBgColor} } default {error "Unknown bg type"} } set tmpChildren [winfo children $win] if { $tmpChildren == "" } { return } else { foreach i $tmpChildren { _changeWindowColors $i $type } } } fv5.4/ftools/guis/fgui/class/notebook.tcl0000644000220700001010000003404210617676020020054 0ustar birbylheadev# A Notebook widget for Tcl/Tk # $Revision: 1.10 $ # # Copyright (C) 1996,1997,1998 D. Richard Hipp # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # # Author contact information: # drh@acm.org # http://www.hwaci.com/drh/ # # Create a new notebook widget # proc Notebook:create {w args} { global Notebook powbg global g_notebookTitleFont set fontName [font names] if { [string first "g_notebookTitleFont" $fontName] >= 0 } { set Notebook($w,fontName) g_notebookTitleFont } else { set Notebook($w,fontName) [list System 16] } set Notebook($w,width) 300 set Notebook($w,height) 300 set Notebook($w,pages) {} set Notebook($w,top) 0 set Notebook($w,pad) 5 set Notebook($w,fg,on) black set Notebook($w,textFg,on) black set Notebook($w,textFg,off) grey50 set Notebook($w,fg,off) grey50 canvas $w -bd 0 -highlightthickness 0 -takefocus 0 set Notebook($w,bg) [$w cget -bg] bind $w <1> "Notebook:click $w %x %y" bind $w "Notebook:scheduleExpand $w" eval Notebook:config $w $args } # # Change configuration options for the notebook widget # proc Notebook:config {w args} { global Notebook global notebookWndw set notebookWndw $w foreach {tag value} $args { switch -- $tag { -width { set Notebook($w,width) $value } -height { set Notebook($w,height) $value } -pages { set Notebook($w,pages) $value } -pad { set Notebook($w,pad) $value } -bg { set Notebook($w,bg) $value } -fg { set Notebook($w,fg,on) $value } -disabledforeground { set Notebook($w,fg,off) $value } -font { set Notebook($w,fontName) $value } -textFg { set Notebook($w,textFg,on) $value } } } # # After getting new configuration values, reconstruct the widget # $w delete all set Notebook($w,x1) $Notebook($w,pad) set Notebook($w,x2) [expr $Notebook($w,x1)+2] set Notebook($w,x3) [expr $Notebook($w,x2)+$Notebook($w,width)] set Notebook($w,x4) [expr $Notebook($w,x3)+2] set Notebook($w,y1) [expr $Notebook($w,pad)+2] set Notebook($w,y2) [expr $Notebook($w,y1)+2] set Notebook($w,y5) [expr $Notebook($w,y1)+30] set Notebook($w,y6) [expr $Notebook($w,y5)+2] set Notebook($w,y3) [expr $Notebook($w,y6)+$Notebook($w,height)] set Notebook($w,y4) [expr $Notebook($w,y3)+2] set x $Notebook($w,x1) set cntx 0 set y7 [expr $Notebook($w,y1)+10] foreach p $Notebook($w,pages) { set cnt [lindex [split $p "_"] 1] set Notebook($w,p$cnt,x5) $x set id [$w create text 0 0 -text [lindex $Notebook($w,text) $cntx] \ -anchor nw -tags "p$cnt t$cnt" \ -font $Notebook($w,fontName) \ -fill $Notebook($w,textFg,on)] set bbox [$w bbox $id] set width [lindex $bbox 2] $w move $id [expr $x+10] $y7 set xwidth 0 if { $cnt > 0 } { image create bitmap exitIcon -data { #define exit_width 13 #define exit_height 13 static char exit_bits[] = { 0xfc,0xef,0xfe,0xff,0xff,0xff,0xe7,0xf9,0xc7,0xf8,0x0f,0xfc,0x1f,0xfe,0x1f, 0xfe,0x0f,0xfc,0xc7,0xf8,0xe7,0xf9,0xff,0xff,0xfe,0xff}; } -foreground red set xid [$w create image 0 0 -anchor nw -image exitIcon -tags "p$cnt x$cnt"] set xbbox [$w bbox $xid] set xwidth [expr [lindex $xbbox 2] + 5] $w bind x$cnt <1> { global Notebook global notebookWndw global NotebookTerm bind .ftoolframe {} set current [%W find withtag current] set cnt [string range [lindex [split [%W itemcget current -tags] " "] 0] 1 end] set displayTop false if { $cnt == [expr [llength $Notebook($notebookWndw,pages)] - 1] } { set displayTop true } set targetIdx [lsearch $Notebook($notebookWndw,pages) Tab_$cnt] Notebook:delete $notebookWndw [lindex $Notebook($notebookWndw,pages) $targetIdx] Notebook:resize $notebookWndw if { $displayTop == "false" } { Notebook:click $notebookWndw %x %y } else { Notebook:raise.page $notebookWndw 0 } bind .ftoolframe { exit } } $w move $xid [expr $x+$width+17] $y7 } $w create line \ $x $Notebook($w,y5)\ $x $Notebook($w,y2) \ [expr $x+2] $Notebook($w,y1) \ [expr $x+$width+$xwidth+16] $Notebook($w,y1) \ -width 2 -fill white -tags p$cnt $w create line \ [expr $x+$width+$xwidth+16] $Notebook($w,y1) \ [expr $x+$width+$xwidth+18] $Notebook($w,y2) \ [expr $x+$width+$xwidth+18] $Notebook($w,y5) \ -width 2 -fill black -tags p$cnt set x [expr $x+$width+$xwidth+20] set Notebook($w,p$cnt,x6) [expr $x-2] if {![winfo exists $w.f$cnt]} { frame $w.f$cnt -bd 0 } place $w.f$cnt -x $Notebook($w,x2) -y $Notebook($w,y6) \ -width $Notebook($w,width) -height $Notebook($w,height) $w.f$cnt config -bg $Notebook($w,bg) incr cntx } $w create line \ $Notebook($w,x1) [expr $Notebook($w,y5)-2] \ $Notebook($w,x1) $Notebook($w,y3) \ -width 2 -fill white -tags p$cntx $w create line \ $Notebook($w,x1) $Notebook($w,y3) \ $Notebook($w,x2) $Notebook($w,y4) \ $Notebook($w,x3) $Notebook($w,y4) \ $Notebook($w,x4) $Notebook($w,y3) \ $Notebook($w,x4) $Notebook($w,y6) \ $Notebook($w,x3) $Notebook($w,y5) \ -width 2 -fill black -tags p$cntx if {![info exists Notebook($w,expand)]} { $w config -width [expr $Notebook($w,x4)+$Notebook($w,pad)] \ -height [expr $Notebook($w,y4)+$Notebook($w,pad)] \ -bg $Notebook($w,bg) } set top $Notebook($w,top) set Notebook($w,top) -1 Notebook:raise.page $w $top } proc Notebook:updateTitle {w page newText } { global Notebook set cntx [lsearch $Notebook($w,pages) $page] set cnt [lindex [split $page "_"] 1] $w itemconfigure t$cnt -text $newText set Notebook($w,text) [lreplace $Notebook($w,text) $cntx $cntx $newText] Notebook:resize $w } proc Notebook:modifyTerm {w page t} { global NotebookTerm set NotebookTerm($w,$page) $t } proc Notebook:add {w page} { global Notebook set cnt [lindex [split $page "_"] 1] lappend Notebook($w,pages) $page lappend Notebook($w,text) $page set currentWidth [$w cget -width] set Notebook($w,x1) [expr $Notebook($w,pad) + $currentWidth] set Notebook($w,x2) [expr $Notebook($w,x1)+2] set Notebook($w,x3) [expr $Notebook($w,x2)] set Notebook($w,x4) [expr $Notebook($w,x3)+2] set Notebook($w,y1) [expr $Notebook($w,pad)+2] set Notebook($w,y2) [expr $Notebook($w,y1)+2] set Notebook($w,y5) [expr $Notebook($w,y1)+30] set Notebook($w,y6) [expr $Notebook($w,y5)+2] set Notebook($w,y3) [expr $Notebook($w,y6)+$Notebook($w,height)] set Notebook($w,y4) [expr $Notebook($w,y3)+2] set x $currentWidth set y7 [expr $Notebook($w,y1)+10] set Notebook($w,p$cnt,x5) $x set id [$w create text 0 0 -text $page -anchor nw -tags "p$cnt t$cnt" \ -font $Notebook($w,fontName) \ -fill $Notebook($w,textFg,on)] set bbox [$w bbox $id] set width [lindex $bbox 2] image create bitmap exitIcon -data { #define exit_width 13 #define exit_height 13 static char exit_bits[] = { 0xfc,0xef,0xfe,0xff,0xff,0xff,0xe7,0xf9,0xc7,0xf8,0x0f,0xfc,0x1f,0xfe,0x1f, 0xfe,0x0f,0xfc,0xc7,0xf8,0xe7,0xf9,0xff,0xff,0xfe,0xff}; } -foreground red set xid [$w create image 0 0 -anchor nw -image exitIcon -tags "p$cnt x$cnt"] set xbbox [$w bbox $xid] set xwidth [expr [lindex $xbbox 2] + 5] $w move $id [expr $x+10] $y7 $w move $xid [expr $x+$width+17] $y7 $w create line \ $x $Notebook($w,y5)\ $x $Notebook($w,y2) \ [expr $x+2] $Notebook($w,y1) \ [expr $x+$width+$xwidth+16] $Notebook($w,y1) \ -width 2 -fill white -tags p$cnt $w create line \ [expr $x+$xwidth+$width+16] $Notebook($w,y1) \ [expr $x+$width+$xwidth+18] $Notebook($w,y2) \ [expr $x+$width+$xwidth+18] $Notebook($w,y5) \ -width 2 -fill black -tags p$cnt set x [expr $x+$width+$xwidth+20] set Notebook($w,p$cnt,x6) [expr $x-2] if {![winfo exists $w.f$cnt]} { frame $w.f$cnt -bd 0 } place $w.f$cnt -x $Notebook($w,x2) -y $Notebook($w,y6) \ -width $Notebook($w,width) -height $Notebook($w,height) $w.f$cnt config -bg $Notebook($w,bg) $w create line \ $Notebook($w,x1) [expr $Notebook($w,y5)-2] \ $Notebook($w,x1) $Notebook($w,y3) \ -width 2 -fill white $w create line \ $Notebook($w,x1) $Notebook($w,y3) \ $Notebook($w,x2) $Notebook($w,y4) \ $Notebook($w,x3) $Notebook($w,y4) \ $Notebook($w,x4) $Notebook($w,y3) \ $Notebook($w,x4) $Notebook($w,y6) \ $Notebook($w,x3) $Notebook($w,y5) \ -width 2 -fill black if {![info exists Notebook($w,expand)]} { $w config -width [expr $Notebook($w,x4)+$Notebook($w,pad)] \ -height [expr $Notebook($w,y4)+$Notebook($w,pad)] \ -bg $Notebook($w,bg) } set top $Notebook($w,top) set Notebook($w,top) -1 Notebook:raise.page $w $top return $cnt } # # This routine is called whenever the mouse-button is pressed over # the notebook. It determines if any page should be raised and raises # that page. # proc Notebook:click {w x y} { global Notebook global mainSession if {$y<$Notebook($w,y1) || $y>$Notebook($w,y6)} return set N [llength $Notebook($w,pages)] for {set i 0} {$i<$N} {incr i} { set idx [lindex [split [lindex $Notebook($w,pages) $i] "_"] 1] if {$x>=$Notebook($w,p$idx,x5) && $x<=$Notebook($w,p$idx,x6)} { if [winfo exists $w.f$idx] { Notebook:raise.page $w $i $mainSession setCurrentTab [lindex $Notebook($w,pages) $i] } break } } } # # For internal use only. This procedure raised the n-th page of # the notebook # proc Notebook:raise.page {w n} { global Notebook if {$n<0 || $n>=[llength $Notebook($w,pages)]} return set n [lindex [split [lindex $Notebook($w,pages) $n] "_"] 1] set top $Notebook($w,top) $w delete topline if {$n>0} { $w create line \ $Notebook($w,x1) $Notebook($w,y6) \ $Notebook($w,x2) $Notebook($w,y5) \ $Notebook($w,p$n,x5) $Notebook($w,y5) \ $Notebook($w,p$n,x5) [expr $Notebook($w,y5)-2] \ -width 2 -fill white -tags topline } $w create line \ $Notebook($w,p$n,x6) [expr $Notebook($w,y5)-2] \ $Notebook($w,p$n,x6) $Notebook($w,y5) \ -width 2 -fill white -tags topline $w create line \ $Notebook($w,p$n,x6) $Notebook($w,y5) \ $Notebook($w,x3) $Notebook($w,y5) \ -width 2 -fill white -tags topline set Notebook($w,top) $n raise $w.f$n } # # Change the page-specific configuration options for the notebook # proc Notebook:pageconfig {w name args} { global Notebook set i [lsearch $Notebook($w,pages) $name] if {$i<0} return foreach {tag value} $args { switch -- $tag { -state { if {"$value"=="disabled"} { $w itemconfig t$i -fg $Notebook($w,fg,off) } else { $w itemconfig t$i -fg $Notebook($w,fg,on) } } -onexit { set Notebook($w,p$i,onexit) $value } } } } # # This procedure raises a notebook page given its name. But first # we check the "onexit" procedure for the current page (if any) and # if it returns false, we don't allow the raise to proceed. # proc Notebook:raise {w name} { global Notebook set i [lsearch $Notebook($w,pages) $name] if {$i<0} return if {[info exists Notebook($w,p$i,onexit)]} { set onexit $Notebook($w,p$i,onexit) if {"$onexit"!="" && [eval uplevel #0 $onexit]!=0} { Notebook:raise.page $w $i } } else { Notebook:raise.page $w $i } } # # Return the frame associated with a given page of the notebook. # proc Notebook:frame {w name} { global Notebook set i [lsearch $Notebook($w,pages) $name] if {$i>=0} { return $w.f$i } else { return {} } } # # Try to resize the notebook to the next time we become idle. # proc Notebook:scheduleExpand w { global Notebook if {[info exists Notebook($w,expand)]} return set Notebook($w,expand) 1 after idle "Notebook:expand $w" } # # Resize the notebook to fit inside its containing widget. # proc Notebook:expand w { global Notebook set wi [expr [winfo width $w]-($Notebook($w,pad)*2+4)] set hi [expr [winfo height $w]-($Notebook($w,pad)*2+36)] Notebook:config $w -width $wi -height $hi catch {unset Notebook($w,expand)} } # # Locate minimum dimensions of frame and expand to it # proc Notebook:resize w { global Notebook update set minWid [expr [winfo width $w]-($Notebook($w,pad)*2+4)] set minHgt [expr [winfo height $w]-($Notebook($w,pad)*2+36)] foreach pg $Notebook($w,pages) { set frm [Notebook:frame $w $pg] if [winfo exists $frm] { set hgt [winfo reqheight $frm] set wid [winfo reqwidth $frm] if { $hgt>$minHgt } { set minHgt $hgt } if { $wid>$minWid } { set minWid $wid } } } Notebook:config $w -width $minWid -height $minHgt } proc Notebook:delete {w page} { global Notebook global NotebookTerm if { [llength $Notebook($w,pages)] <= 1 } { # at least one tab return } $NotebookTerm($w,$page) shutdown set idx [lsearch -exact $Notebook($w,pages) $page] set Notebook($w,pages) [lreplace $Notebook($w,pages) $idx $idx] set Notebook($w,text) [lreplace $Notebook($w,text) $idx $idx] $w delete p$idx } fv5.4/ftools/guis/fgui/class/tclIndex0000755000220700001010000003344110615672771017241 0ustar birbylheadev# 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(fguiInit) [list source [file join $dir fguiCore.tcl]] set auto_index(hhelp) [list source [file join $dir fguiCore.tcl]] set auto_index(FtoolParameter) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolParameter::constructor) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolParameter::destructor) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolParameter::GetParameter) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolParameter::CheckParameter) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolParameter::ParBrowser) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolParameter::ParApply) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolParameter::ParAppend) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolParameter::ParReset) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolParameter::ParOK) [list source [file join $dir FVFtool.tcl]] set auto_index(FtoolInstance) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::constructor) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::destructor) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::MainMenu) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::MenuInit) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::PackageMenu) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::PackageGet) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::FavoriteGet) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::FavoriteReset) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::ConfigSet) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::ConfigOk) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::HelpGet) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::FtoolHelp) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::FtoolRun) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::FtoolTerminate) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::FtoolCancel) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::FavoriteAdd) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::FavoriteDelete) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::FtoolGet) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::FavoriteCheck) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::LogClear) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::LogError) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::LogDump) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::ParExist) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::ParSet) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::ParSave) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::ParClear) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::ParDialog) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::ParsReset) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::ParsRedraw) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::ParsCancel) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::ParsOk) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::CmdDialog) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::CmdCancel) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::CmdOk) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::DumpText) [list source [file join $dir FVFtool.tcl]] set auto_index(::FtoolInstance::SearchDir) [list source [file join $dir FVFtool.tcl]] set auto_index(fguiPreferences) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::constructor) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::destructor) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::edit) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::close) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::read) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::save) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::buildPage_App) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::buildPage_Keywords) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::buildPage_Tables) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::buildPage_Graphs) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::buildPage_Colors) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::setGraphSize) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::getGraphSize) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::changeColor) [list source [file join $dir fguiPreferences.tcl]] set auto_index(::fguiPreferences::changeWindowColors) [list source [file join $dir fguiPreferences.tcl]] set auto_index(fguiNotebook:create) [list source [file join $dir fguiNotebook.tcl]] set auto_index(fguiNotebook:delete) [list source [file join $dir fguiNotebook.tcl]] set auto_index(fguiNotebook:config) [list source [file join $dir fguiNotebook.tcl]] set auto_index(fguiNotebook:add) [list source [file join $dir fguiNotebook.tcl]] set auto_index(fguiNotebook:click) [list source [file join $dir fguiNotebook.tcl]] set auto_index(fguiNotebook:raise.page) [list source [file join $dir fguiNotebook.tcl]] set auto_index(fguiNotebook:pageconfig) [list source [file join $dir fguiNotebook.tcl]] set auto_index(fguiNotebook:raise) [list source [file join $dir fguiNotebook.tcl]] set auto_index(fguiNotebook:frame) [list source [file join $dir fguiNotebook.tcl]] set auto_index(fguiNotebook:scheduleExpand) [list source [file join $dir fguiNotebook.tcl]] set auto_index(fguiNotebook:expand) [list source [file join $dir fguiNotebook.tcl]] set auto_index(fguiNotebook:resize) [list source [file join $dir fguiNotebook.tcl]] set auto_index(fguiNotebook:updateTitle) [list source [file join $dir fguiNotebook.tcl]] set auto_index(Notebook:create) [list source [file join $dir notebook.tcl]] set auto_index(Notebook:delete) [list source [file join $dir notebook.tcl]] set auto_index(Notebook:config) [list source [file join $dir notebook.tcl]] set auto_index(Notebook:add) [list source [file join $dir notebook.tcl]] set auto_index(Notebook:modifyTerm) [list source [file join $dir notebook.tcl]] set auto_index(Notebook:click) [list source [file join $dir notebook.tcl]] set auto_index(Notebook:raise.page) [list source [file join $dir notebook.tcl]] set auto_index(Notebook:pageconfig) [list source [file join $dir notebook.tcl]] set auto_index(Notebook:raise) [list source [file join $dir notebook.tcl]] set auto_index(Notebook:frame) [list source [file join $dir notebook.tcl]] set auto_index(Notebook:scheduleExpand) [list source [file join $dir notebook.tcl]] set auto_index(Notebook:expand) [list source [file join $dir notebook.tcl]] set auto_index(Notebook:resize) [list source [file join $dir notebook.tcl]] set auto_index(Notebook:updateTitle) [list source [file join $dir notebook.tcl]] set auto_index(FitsFileselectionbox) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(ffb) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::constructor) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::destructor) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::fillContent) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::upDir) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::selectThat) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::isDir) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::openThisFile) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::openSelection) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::listFits) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::setFilter) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::helpCmd) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::get) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::setCmd) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::init) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::chgDir) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::initFtp) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::_ftpOpen) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::_pwd) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::updateAll) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::switchRemoteLocal) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::closeFTP) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::completeFileName) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::pickElemByName) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::searchCharsForCompletion) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::showNamedFile) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::activate) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::cancelCmd) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::openFileCmd) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::saveFileCmd) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::buildMenu) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::setDir) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::postMenu) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::buttonRelease) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::scrollBoxes) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::scrollOthers) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(::FitsFileselectionbox::updateBoxes) [list source [file join $dir FitsFileSelection.tcl]] set auto_index(gXTerminal) [list source [file join $dir XTerminal.tcl]] set auto_index(XTerminal) [list source [file join $dir XTerminal.tcl]] set auto_index(gToolServer) [list source [file join $dir ToolServer.tcl]] set auto_index(ToolServer) [list source [file join $dir ToolServer.tcl]] set auto_index(gNotifications) [list source [file join $dir Notifications.tcl]] set auto_index(Notifications) [list source [file join $dir Notifications.tcl]] set auto_index(xterminalTabs) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::constructor) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::destructor) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::edit) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::close) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::read) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::save) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::buildPage_App) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::buildPage_Keywords) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::buildPage_Tables) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::buildPage_Graphs) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::buildPage_Colors) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::setGraphSize) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::getGraphSize) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::changeColor) [list source [file join $dir xterminalTabs.tcl]] set auto_index(::xterminalTabs::changeWindowColors) [list source [file join $dir xterminalTabs.tcl]] fv5.4/ftools/guis/fgui/class/xterminalTabs.tcl0000644000220700001010000000525010615742265021053 0ustar birbylheadev# When this class is initialized in FVFtool.tcl, the constructor will create a # ::xterminalTab namespace with various variable names itcl::class xterminalTabs { # Create and initialize xterminalTab namespace constructor { wndw cSession } {} destructor {} public { method addPage { {page "Tab"} } method deletePage { page } method raisePage { page } method updateTitle { page newText } } private { method _buildPage { w page } variable note variable _FGUIRC variable _padXAmnt 10 variable _padYAmnt 3 variable _tabLabels {} variable _topLevel variable _newTerm variable _callSession } } itcl::body xterminalTabs::constructor { wndw cSession } { global mainSession set _topLevel $wndw set _callSession $cSession set mainSession $cSession frame ${_topLevel}.xterminalTab pack ${_topLevel}.xterminalTab -fill both -expand true set note ${_topLevel}.xterminalTab.notebook Notebook:create $note -pages $_tabLabels -pad 8 pack $note -fill both -expand true } itcl::body xterminalTabs::destructor { } { if { [winfo exists .xterminalTab] } { destroy .xterminalTab } } itcl::body xterminalTabs::addPage { {page "Tab"} } { global tcl_platform global g_titleFont ########### # Setup Tabbed Notebook Widget ########### set cnt [Notebook:add $note $page] lappend _tabLabels $page eval _buildPage $note.f$cnt $page Notebook:raise $note $page Notebook:raise.page $note [lsearch $_tabLabels $page] Notebook:resize $note $_callSession setCurrentTab $page return $_newTerm } itcl::body xterminalTabs::deletePage { page } { set deleteXterm [$_callSession getTerminalId $page] set idx [lsearch $_tabLabels $page] set _tabLabels [lreplace $_tabLabels $idx $idx] Notebook:delete $note $page catch { itcl::delete object $deleteXterm } err Notebook:resize $note } itcl::body xterminalTabs::updateTitle { page newText } { Notebook:updateTitle $note $page $newText } itcl::body xterminalTabs::raisePage { page } { $_callSession setCurrentTab $page Notebook:raise.page $note [lsearch $_tabLabels $page] Notebook:resize $note } ########################################################## ############# Private Functions ################ ########################################################## itcl::body xterminalTabs::_buildPage { w page } { global g_titleFont set row 1 Notebook:raise $note $page set _newTerm [gXTerminal $w command NONE $this $_callSession] $_callSession addNewXterminal $page $_newTerm Notebook:modifyTerm $note $page $_newTerm return $_newTerm } fv5.4/ftools/guis/fgui/Makefile0000644000220700001010000000067310617642657016077 0ustar birbylheadevHD_COMPONENT_NAME = ftools HD_COMPONENT_VERS = HD_INSTALL_EXTRA = install-fgui HD_INSTALL_HELP = doc/fgui.html doc/fileSelection.html include ${HD_STD_MAKEFILE} FGUI_LIBRARY = class doc fguiInit.tcl install-fgui: @for item in ${FGUI_LIBRARY}; do \ ${HD_INSTALL} $$item ${HD_LIB}/fgui/$$item ${HD_CP_P}; \ done @${HD_INSTALL} fgui ${HD_BIN}/fgui ${HD_CP_P} @${HD_INSTALL} spawnToolCmds.csh ${HD_BIN}/spawnToolCmds.csh ${HD_CP_P} fv5.4/ftools/guis/fgui/convertField.txt0000644000220700001010000000533710604533214017606 0ustar birbylheadevadcfile alignfile alkfile alkfile1 alkfile10 alkfile11 alkfile12 alkfile13 alkfile2 alkfile3 alkfile4 alkfile5 alkfile6 alkfile7 alkfile8 alkfile9 ancrfile aperture appidfile areafile arffil arfil attfil attfile attitude attname attorbfile auxfile badpixfile badpixlist bcfile bckfil bcontfil bethick bftfile bgfile biasfile binfile bkgfile bkgreg bodfil bofil bpfile bptable bpulsfil calfile calvalf catalog catfile cdfile cfile1 cfile2 cfile3 cfile4 chan_file cif clockfile cmapfile coinfile colfile collcube configfile configure cont_srcelist convfile corfil corrfile crffil datafile dayfile deadfile defGISfile defS1file defS2Ffile defS2Pfile defS3Ffile defS3Pfile defSISfile defSOfile defxrtfile depthfile detfil detmask dfefile divfiles dmapfil drmfile ebdfile ebfil ecdata echohist echosh efffil efile efilenm emapfile endepfile engvalf ephfile eventarcf eventfile eventkey evfile evrfil evtfil evtfile evtlist evtmapfil evtrangefile expfile expmapfil expofile expomap file1 file2 filelist filename filfil filterfile filtfile fitfile fitsfile flatfile fltfil fltpulserfile fovfile frffile frforbit g2_hk gainfile gcorrfile gefil geofile ghk GIS2 GIS3 gmapfile gradefile grid gtiandfile gtifil gtifile gtiname gtiorfile gtis hdfile headfile histfile hkfile hkrangefile hklist_name hxd_teldef image imagefile imagelist imbiasfile imfil imgfile imglist inarf inarf1 inarf2 inarf3 inarf4 inarffile incatalog index inevent infil infil1 in_fil1 infil2 in_fil2 infile infile1 infile2 infiles inhdu inmsk1 inmsk2 inpha inputfile input_name inrfil instfile instname inverse keyfil lcfile leapfile leapname leapsec leapsec_name likefile list lookup lsffile ltffil maskfile maskwt masterfile mirfile mkfconfigfile mkffile modelfile modfile multfiles oahfil orbfile orbit orbitfile orbit_file orbitfiles orblist orbname pastefile pcgainfile pcodefile pdbiasfile pdgainfile phafil phafile phalcf phasefile phtopi plotfile posfile predfil psffile pulserfile quadfile qvpfile ratefile rawlist rddhis regfil regfil_bck regfile regfil_sou regionfile residfile resol_file respfile resp_file revtfile rigfile rigidity rigname rmffil rmffile rmfil rspfil rspfile S0C0rdd S0C1rdd S0C2rdd S0C3rdd s0_hk S1C0rdd S1C1rdd S1C2rdd S1C3rdd s1_hk saahfile saofile scalefacfile sccfil sccfile shftfil SIS0 SIS1 skyfile sofil spec1file spec2file specfile spectrum spectrumset spgfile spgkfile spibackfil srcfil srcfile srcreg swcofile syserrfile tamfile tblfile teldef teldeffile template tempofile timefile timeint_fil timeline tim_filename tmpfil trans1 trans2 trans3 transform transmfile trfile userbpfile usrgtifile vigfile vplist wavefile window wmapfile wtfil wtgainfile wtmapin xenon1 xenon2 xis0_teldef xis1_teldef xis2_teldef xis3_teldef xrs_teldef xrtfile xrtpsf xrtrsp xtefilt ymapfile zerofile fv5.4/ftools/guis/fgui/convertpar.tcl0000755000220700001010000000636610604534015017316 0ustar birbylheadev# call by "tclsh convertpar.tcl # convertField.txt must be presented proc createField { contents f targetTokenList specialCase specialValue } { set specialTokenList {} if { $specialCase != "NONE" } { set specialTokenList [split $specialCase ","] } foreach line $contents { set line [string trim $line] if { [string length $line] <= 0 } continue if { [string range $line 0 0] == "#" } continue set token [split $line ","] set paramName [lindex $token 0] set idx [lsearch -exact $targetTokenList $paramName] if { $idx >= 0 } { set action "I" } else { if { [lsearch -exact $specialTokenList $paramName] >= 0 } { set action "I" } else { if { [string first "file" $paramName] >= 0 } { set action "F" } else { set action "NONE" } } } set idx [lsearch -glob $specialValue [list $paramName *]] if { $idx >= 0 } { set value [lindex [lindex $specialValue $idx] 1] } else { set value "NONE" } # puts $f [format "%s|%s|%s" $paramName $action $value] puts $f [format "%s|%s" $paramName $action] } } global env set f [open convertField.txt r] set targetTokenList [split [read $f [file size convertField.txt]] "\n"] close $f set f [open specialCase.txt r] set specialTokenFileList [split [read $f [file size specialCase.txt]] "\n"] close $f set specialTokenList {} foreach lineToken $specialTokenFileList { set token [split $lineToken "|"] lappend specialTokenList $token } set f [open specialValue.txt r] set specialTokenValueList [split [read $f [file size specialValue.txt]] "\n"] close $f set specialValueList {} foreach lineToken $specialTokenValueList { set token [split $lineToken "|"] lappend specialValueList $token } set paramToken [list [list "ftools" "$env(HEADAS)/syspfiles" "$env(HEADAS)/fguipfiles"] \ ] set targetParamToken $paramToken if { [llength $argv] == 1 && [lindex $argv 0] != "all" } { set targetTool [lindex $argv 0] set idx [lsearch -glob $paramToken [list $targetTool * *]] if { $idx < 0 } { puts "No such target: $targetTool" exit } set targetParamToken [list [lindex $paramToken $idx]] } foreach tokenList $targetParamToken { set sourceDir [lindex $tokenList 1] set targetDir [lindex $tokenList 2] catch { file delete -force $targetDir } catch { file mkdir $targetDir } set fileNameList [eval glob -directory $sourceDir -nocomplain "*.par"] foreach fileName $fileNameList { set idx [lsearch -glob $specialTokenList [list $targetDir [file tail $fileName] *]] set f [open $fileName "r"] set contents [split [read $f [file size $fileName]] \n] close $f set f [open "$targetDir/[file tail $fileName]2" "w+"] if { $idx < 0 } { createField $contents $f $targetTokenList "NONE" $specialValueList } else { createField $contents $f $targetTokenList [lindex [lindex $specialTokenList $idx] 2] $specialValueList } close $f } } fv5.4/ftools/guis/fgui/fgui0000755000220700001010000000120310604524760015273 0ustar birbylheadev#!/bin/sh # (if [ "x$FGUI" = x ] ; then \ FGUI=$FTOOLS; \ export FGUI; fi; \ FITSVIEWER_LIBRARY=$FGUI/lib/fgui; \ LD_LIBRARY_PATH=$FGUI/lib:$LD_LIBRARY_PATH ;\ if [ "x$DYLD_LIBRARY_PATH" = x ] ; then \ DYLD_LIBRARY_PATH=$FGUI/lib; \ else \ DYLD_LIBRARY_PATH=$FGUI/lib:$DYLD_LIBRARY_PATH; \ fi; \ export DYLD_LIBRARY_PATH; \ export FITSVIEWER_LIBRARY; \ export LD_LIBRARY_PATH;\ unset TCL_LIBRARY; unset TK_LIBRARY; unset TCLLIBPATH; \ unset ITCL_LIBRARY; unset ITK_LIBRARY; \ if [ "$#" -ge 2 -a "$2" = "hera" ] ; then \ XPA_ACL=false; \ export XPA_ACL; fi; \ $FGUI/bin/wish $FITSVIEWER_LIBRARY/fguiInit.tcl -- "$@") fv5.4/ftools/guis/fgui/fguiInit.tcl0000755000220700001010000000104210604522466016702 0ustar birbylheadevglobal env if {$tcl_platform(platform) == "windows"} { set fullname [info nameofexecutable] set home [file dirname $fullname] set env(FGUI_HOME) [file dirname $home] set libdir [file join $env(FGUI_HOME) lib] set env(FITSVIEWER_LIBRARY) [file join $libdir fgui] } set env(P2FILES) [file join $env(LHEASOFT) fguipfiles] # Add auto_load path lappend auto_path [file join "$env(FITSVIEWER_LIBRARY)" class] # Add pathes for help files. set env(FGUI_HELPDIR) [file join "$env(FITSVIEWER_LIBRARY)" doc] eval fguiInit $argv fv5.4/ftools/guis/fgui/spawnToolCmds.csh0000755000220700001010000000006710616124056017716 0ustar birbylheadev#!/usr/bin/expect -f eval spawn -noecho $argv interact fv5.4/ftools/guis/fgui/specialCase.txt0000644000220700001010000000124110604533214017364 0ustar birbylheadevxmm-sas|arfgen.par|rmfget,detmaparray,badpixlocation xmm-sas|rmfgen.par|detmaparray,badpixlocation ftools|hxdarfgen.par|hxd_arfdb_name,input_pi_name,image_fname ftools|hxdgrade.par|hxdgrade_psdsel_fname,hxdgrade_pinthres_fname ftools|hxdmkwamgainhist.par|trn_fitlog_name,trn_gainhist_name ftools|hxdpi.par|pin_gainhist_name,gso_gainhist_name,hxdgsolin_fname,hxdpinlin_fname ftools|hxdwampi.par|trn_bintbl_name,trn_gainhist_name ftools|mkphlist.par|qdp_spec_file,fits_image_file,teldef_file ftools|xispi.par|trcor_caldbfile,cticor_caldbfile,grade_caldbfile,pha2pi_hkfile,pha2pi_caldbfile ftools|xisputpixelquality.par|badcolumn_file,calmask_file ftools|xistime.par|tim_file fv5.4/ftools/guis/fgui/specialValue.txt0000644000220700001010000000004010604533214017561 0ustar birbylheadevattitude|key,user,euler,default fv5.4/ftools/guis/fgui/doc/0002755000220700001010000000000012565673763015206 5ustar birbylheadevfv5.4/ftools/guis/fgui/doc/fgui.html0000644000220700001010000001221610606530672017007 0ustar birbylheadev Run Ftools

Run Ftools

This tool is the GUI client of console FTOOL programs. It takes advantage of the rich functionalities of FTOOL tools and integrates them into fv. With this utility, to run a FTOOL program, you no longer need to leave the fv and open the other console window. However, you need to install the FTOOL or HEASOFT package to use this utility.

Menus

There are four menus.
  • Ftool
    • Run :Run the selected tool program.
    • Cancel : Cancel the current running tool program.
    • tool help : Open the help file for the selected tool.
    • Clear Log : Clear Log window.
    • Dump Log: Dump the content of Log window to a log file.
    • Exit: Terminate this tool.
  • Packages
      Listing of the sub-packages of tools. When one of them is selected, its contents will appear on the tool window.
  • Favorite You can choose tools from different sub-packages and assemble them in your favorite group.
    • Go to... : Go to your favorite group.
    • Add...: Add current selected tool to the favorite group.
    • Delete...: Delete the selected tool from the favorite group.
    • Reset...: Delete every tool from the favorite group.
    • Configure Configure the tool path, parfile path, and help file path, whether to save the parameters automatically, and whether to clear the log window automatically.
  • Help :
    • About this program... : Open this help file.
    • About selected tool.. : Open the help file for the selected tool.

Tool Window

When you selected a sub-package from Packages menu button, a listings of tools in this sub-package and its brief description will appear in this window. To select the desired tool, click the left mouse button on it.
  • Add to Favorite : Add the selected tool to the favorite group.
  • Run : Run the selected tool. It opens the Parameter Dialog or Command Dialog depending on whether the task is parameter file based or a script.
  • Cancel : Terminate the Running tool.
  • tool Help : Open the tool help window.

Log Window

This window records the output of the tool when it is running.
  • Clear Log : Clear Log window.
  • Dump Log: Dump the content of Log window to a log file.
  • Exit: Terminate this tool.

Parameter Dialog

This window is opened when the Run Button is pressed. It displays the listings of parameters of the selected tool if it is parameter-based. It consists of three columns, name, description, and value. You can enter the parameter value or set the Yes/No radio buttons in the Value field. For a parameter asking file name(s), you can press the Browser button next to it to open a file selection dialog . All the mandatory parameters are shaded with green color.
  • Show hidden : Toggle between showing or hiding the hidden parameters.
  • Reset : Reset the parameter values to system default values.
  • OK : Accept the current values, close this dialog and start to run the tool.
  • Cancel : Close this dialog without running the tool.
  • Help : Open the help file of the tool.

Command Dialog

This window is opened when the Run Button is pressed if the corresponding tool is not parameter-based. The command is entered in the Command field. The Output Fits File field is optional. It tells the program the file name of the output Fits File, so it can open the File Summary after the command is successfully finished.
  • OK : Accept the command, close this dialog and start to run the command.
  • Cancel : Close this dialog without running.
  • Help : Open the help file for the command.

File Selection Dialog

This window is opened when the browser Button in the Parameter Dialog is pressed. To select a desired file, use left mouse to click on it then press either the Apply to... or Append to... button. The file name will be entered or appended on the Value field. When appending, a separator in the Separator field will be inserted before the file name is appended.

The attributes of the selected file can also be selected by the radio buttons, Output and Input , and the check box Fits file . When both the Output and Fits file are set, a File Summary window will be opened after the tool successfully finishes its execution.


fv5.4/ftools/guis/fgui/doc/fileSelection.html0000644000220700001010000000350710606530672020645 0ustar birbylheadev File Browser

File Browser

Directory Navigation

The top of the window consists of 2 buttons with which you can change the current directory. The first button displays the current directory name. Clicking on the button brings up a popup menu showing the entire directory hierarchy with the current directory at the bottom. Select one of the other directories to jump to that position in the hierarchy.

The next button, showing a folder icon with an arrow, will move you up one directory level.

File list box

The file listing shows the names of all files which have the form specified in "File of type" field, their file sizes, and last modification dates. When the "List Fits files only" is selected, only FITS files are shown as well as all the compressed files. Double click a file name to open that file. Directories are listed with "/" (":" on MacOS). Double click a directory name to move to that directory.

File name

In the "File Name" field, the currently selected file name is shown. One can type a partial filename and press TAB to invoke automatic filename completion. One can also type a directory path to move quickly to another location without having to navigate all the intervening directories.

File of type

The file list will be filtered using the wildcard string contained in this entry field.

List Fits files only

To show only the FITS files in the "Files" list, enable the check button. Also, compressed files are listed.

Open

Click this button to insert the currently selected file name corresponding entry in the par file editing windows.

Cancel

Quit from the file selection dialog.

Help

Bring up this help file.
fv5.4/ftools/guis/Makefile0000644000220700001010000000023210604741342015117 0ustar birbylheadevHD_COMPONENT_NAME = ftools HD_COMPONENT_VERS = HD_SUBDIRS = fitsTcl powclient fgui fv xdf xsut # unused: flaunch lheatkcon include ${HD_STD_MAKEFILE} fv5.4/ftools/guis/fv/0002755000220700001010000000000012565673764014123 5ustar birbylheadevfv5.4/ftools/guis/fv/class/0002755000220700001010000000000012565673763015227 5ustar birbylheadevfv5.4/ftools/guis/fv/class/CubeImage.tcl0000644000220700001010000003125711203345470017535 0ustar birbylheadev# First draft 06/27/96 Jianjun # CubeImage CubeImageName FitsFileObjName currentHDU firstSlice lastSlice itcl::class CubeImage { inherit FitsImage constructor {args} { eval FitsImage::constructor [lrange $args 0 1] } { set _istart [lindex $args 2] set _iend [lindex $args 3] set _cslice [lindex $args 4] } # all of these methods override/specialize methods defined in # FitsImage or its parent Table public method setFileName { fName_ } private method _readInTable {} private method _readTableData {fCol_ fRow_ nCols_ nRows_} private method _putRawData {col_ row_ val_} private method _getRawDataBlock { fCol_ fRow_ lCol_ lRow_ } private method _putRawDataBlock { fCol_ fRow_ data_ } private method _powMakeImage {} private method _saoMakeImage {} private method _ds9MakeImage {} # these variables are only for use wihin this class # which image slice to start the pow movie from private variable _istart # which image slice to end the pow movie at private variable _iend # which cube slice to end the pow movie at private variable _cslice } itcl::body CubeImage::setFileName { fName_ } { set fileName $fName_ set rName [urlTail $fName_] set dName [getFullDirPath $fName_] wm title $_droot "fv: $_tableType\[$_istart\] of $rName\[[expr $currentHDU-1]\] in $dName" .fvwinkeeper signoff $_droot .fvwinkeeper register $_droot "Image Table" [urlTail $fName_] $currentHDU $this } itcl::body CubeImage::_readInTable { } { global g_charPix set _DC(height) 20 set _DC(width) [expr (int(log10($_numRows))+6)*$g_charPix] set _DC(headroom) 20 set _DC(footroom) 40 set _DC(vscrollsize) 15 set _DC(hscrollsize) 15 set _DC(rightspace) 6 set _DC(interline) 0 set _DC(tmar) 6 set _DC(lmar) 8 set _DC(tabspace) 0 # flag that the imageTable is being displayed set _isImageTable 1 if { $_imgType == 0 } { set _cellSize 8 } elseif {$_imgType == 1} { set _cellSize 8 } elseif {$_imgType == 2} { set _cellSize 16 } elseif {$_imgType == 3} { set _cellSize 16 } elseif {$_imgType == 4} { set _cellSize 20 } else { set _cellSize 8 } set _listPreSelectedColNames {} set _dispCols $_numCols set _tableType Image # use fits command setrowstate to initialize the rowState # usage setrowstate totalNumOfRos startRow endRow status # (0:normal, 1:selected, 2: deleted) setarray rowState 0 [expr $_numRows-1] 0 setarray _colNotchedState 0 [expr $_dispCols-1] 0 set _absXPos(0) [expr $_DC(lmar) + $_DC(width)/2] for {set i 0} {$i < $_dispCols} {incr i} { set _valueTDIM($i) 0 set _columnName($i) [expr $i+1] set _columnType($i) " " set _columnUnit($i) " " lappend _listPreSelectedColNames [expr $i+1] set _cellWidth($i) $_cellSize set _cellPixWidth($i) [expr $g_charPix*(1+$_cellWidth($i))] set _absXPos([expr $i+1]) [expr $_absXPos($i) + $_cellPixWidth($i) \ +$_DC(rightspace)] } } itcl::body CubeImage::_saoMakeImage {} { tk_messageBox -type ok -message "SAOtng can only load the first slice of a 3D image at this point" -icon warning FitsImage::_saoMakeImage } itcl::body CubeImage::_ds9MakeImage {} { # tk_messageBox -type ok -message "DS9 can only load the first slice of a 3D image at this point" -icon warning FitsImage::_ds9MakeImage } itcl::body CubeImage::_powMakeImage {} { global powWCS powFitsHeader powFitsHeaderCnt powPlotParam global xCount yCount global powWCSName powWCSTranslation powWCSLabel powWCSList global useWCSInfo # get the pow widget if { [winfo exist .pow.pow] != 1 } { powInit .dummy } regsub -all { } [urlTail $fileName] _ cleanFileName set imgIndex ${cleanFileName}_[expr $currentHDU-1] set imgHandle ${cleanFileName}_[expr $currentHDU-1]_$_graphIDhighest incr _graphIDhighest for {set i $_istart} {$i <= $_iend} {incr i} { # load slice of image without rotating set dataAddressForPOW [$fFile loadImageSlice $i 0] # the last param is for copying data powCreateData ${imgHandle}_$i $dataAddressForPOW $_imgType \ [expr $_numCols*$_numRows] 1 # free the data array $fFile freeImage $dataAddressForPOW } set powWCSName($imgIndex) 0 set powWCSName($imgHandle) 0 set x_0 1 set y_0 1 set incrx 1 set incry 1 set x_label "" set y_label "" set x_unit "pixels" set y_unit "pixels" if { ![catch {set tmp [$fFile getKeyword CTYPE1]}] } { set v [lindex [lindex $tmp 0] 1] set x_label [string trim $v {' }] } if { ![catch {set tmp [$fFile getKeyword CTYPE2]}] } { set v [lindex [lindex $tmp 0] 1] set y_label [string trim $v {' }] } if { ![catch {set tmp [$fFile getKeyword CUNIT1]}] } { set v [lindex [lindex $tmp 0] 1] set x_unit [string trim $v {' }] } if { ![catch {set tmp [$fFile getKeyword CUNIT2]}] } { set v [lindex [lindex $tmp 0] 1] set y_unit [string trim $v {' }] } # Get the WCS info (if needed) and pass them to pow set powWCS($imgIndex) [$fFile getWcs] set useWCSInfo($imgIndex) $fvPref::ifWCSInfo if { $fvPref::ifWCSInfo } { set result [$fFile getHeader2String] set cntList($imgIndex) [$fFile getHeaderKeyWord [lindex $result 0] $imgIndex] set powFitsHeaderCnt($imgIndex) [lindex $cntList($imgIndex) 1] if { [lindex $cntList($imgIndex) 0] > 0 } { #set powFitsHeader($imgIndex) [$fFile assembleWcsHeader $imgIndex] set powFitsHeader($imgIndex) [lindex $result 0] set powWCSInfo($imgIndex,DEFAULT) $powWCS($imgIndex) set wcsinfo $powWCS($imgIndex) set x_label [lindex [lindex $wcsinfo 3] 0] set y_label [lindex [lindex $wcsinfo 3] 1] if { $x_unit=="pixels" } {set x_unit NULL} if { $y_unit=="pixels" } {set y_unit NULL} } else { set powFitsHeader($imgIndex) [$fFile assembleWcsHeader $imgIndex NOWCS] set powWCS($imgIndex) [$fFile getWcs] } } else { set powWCS($imgIndex) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set powFitsHeader($imgIndex) "" set powFitsHeaderCnt($imgIndex) 0 } #puts "powFitsHeader($imgIndex): $powFitsHeader($imgIndex)" #puts "powWCS($imgIndex): $powWCS($imgIndex)" #puts "powFitsHeader($imgIndex): $powFitsHeader($imgIndex)" #puts "powFitsHeaderCnt($imgIndex): $powFitsHeaderCnt($imgIndex)" # set powWCSList($imgIndex) {} set powWCSList(${imgIndex}scope) {} set imgList {} for {set i $_istart} {$i <= $_iend} {incr i} { if [info exists powWCS(${imgHandle}_$i)] { catch { unset powWCS(${imgHandle}_$i) } } set powFitsHeader(${imgHandle}_$i) $powFitsHeader($imgIndex) set powFitsHeaderCnt(${imgHandle}_$i) $powFitsHeaderCnt($imgIndex) catch { set powWCS(${imgHandle}_$i) $powWCS($imgIndex) } set powPlotParam(graphType,${imgHandle}_$i) \ [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(graphType,${imgHandle}_${i}scope) \ $powPlotParam(graphType,${imgHandle}_${i}) set powPlotParam(zoomed,${imgHandle}_${i}) 0 set powPlotParam(zoomed,${imgHandle}_${i}scope) 0 set xCount(${imgHandle}_$i) 0 set yCount(${imgHandle}_$i) 0 set xCount(${imgHandle}_${i}scope) 0 set yCount(${imgHandle}_${i}scope) 0 set powWCSName(${imgHandle}_$i) 0 set powWCSName(${imgHandle}_${i}scope) 0 set powWCSTranslation 0 catch { powCreateImage ${imgHandle}_$i ${imgHandle}_$i 0 0\ $_numCols $_numRows $x_0 \ $incrx $y_0 $incry $x_label $y_label counts } err if [info exists powWCSList(${imgHandle}_${i})] { foreach name [lindex $powWCSList(${imgHandle}_$i) 1] { $fFile assembleWcsLabel ${imgHandle}_$i $name } } else { set powWCSList(${imgHandle}_${i}) {} lappend powWCSList(${imgHandle}_${i}) 1 lappend powWCSList(${imgHandle}_${i}) {} } set powWCSList(${imgHandle}_${i}scope) $powWCSList(${imgHandle}_${i}) lappend imgList ${imgHandle}_$i set powWCSLabel(xlabel,${imgHandle}_$i,DEFAULT) $x_label set powWCSLabel(ylabel,${imgHandle}_$i,DEFAULT) $y_label set powWCSLabel(xunit,${imgHandle}_$i,DEFAULT) $x_unit set powWCSLabel(yunit,${imgHandle}_$i,DEFAULT) $y_unit } # wcslist can be obtained from any one slice set powWCSList($imgIndex) $powWCSList(${imgHandle}_$_iend) set powWCSList(${imgIndex}scope) $powWCSList(${imgHandle}_$_iend) if [info exists powWCSList($imgIndex)] { foreach name [lindex $powWCSList($imgIndex) 1] { $fFile assembleWcsLabel $imgIndex $name } } else { set powWCSList($imgIndex) {} lappend powWCSList($imgIndex) 1 lappend powWCSList($imgIndex) {} } set powWCSList(${imgHandle}) $powWCSList($imgIndex) set powWCSList(${imgHandle}scope) $powWCSList($imgIndex) set powWCS(${imgHandle}) $powWCS($imgIndex) set powWCS(${imgHandle}scope) $powWCS($imgIndex) set powFitsHeader($imgHandle) $powFitsHeader($imgIndex) set powFitsHeaderCnt($imgHandle) $powFitsHeaderCnt($imgIndex) set powFitsHeader(${imgHandle}scope) $powFitsHeader($imgIndex) set powFitsHeaderCnt(${imgHandle}scope) $powFitsHeaderCnt($imgIndex) set powPlotParam(graphType,$imgHandle) [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(graphType,${imgHandle}scope) $powPlotParam(graphType,$imgHandle) set powPlotParam(zoomed,$imgHandle) 0 set powPlotParam(zoomed,${imgHandle}scope) 0 set xCount($imgHandle) 0 set yCount($imgHandle) 0 set xCount(${imgHandle}scope) 0 set yCount(${imgHandle}scope) 0 powCreateGraph $imgHandle NULL $imgList \ $x_unit $y_unit \ $x_label $y_label \ [lindex $fvPref::graphDispSize 0] \ [lindex $fvPref::graphDispSize 1] set powWCSLabel(xlabel,${imgHandle},DEFAULT) $x_label set powWCSLabel(ylabel,${imgHandle},DEFAULT) $y_label set powWCSLabel(xunit,${imgHandle},DEFAULT) $x_unit set powWCSLabel(yunit,${imgHandle},DEFAULT) $y_unit catch {unset imgList} # play the movie if { $_istart != $_iend} { powMovie # set g_movieParam(loop) 1 after 1 powPlayMovie } } ############################################## # # Handle Reading/Writing/Formatting of Data # itcl::body CubeImage::_readTableData {fCol_ fRow_ nCols_ nRows_} { if { $_istart != $_iend } { error "Can only load one slice a time" } set _slice $_istart set fRow_ [expr $_numRows - $fRow_ - $nRows_ + 1] incr fCol_ # image data will be loaded into a 2-d Tcl array _tableData # this cannot be done as a FitsFile method because Tcl does not # allow arrays to be returned # the array must be created locally set fitsfile [$fFile cget -fitsfile] $fitsfile load iblock "_tableData" $fRow_ $nRows_ $fCol_ $nCols_ $_istart $_cslice } itcl::body CubeImage::_putRawData { col_ row_ val_ } { # Overrides IMAGE method so that the image $_slice is taken into account set realRow [expr $_numRows-$row_-1] set origin [expr $_numRows*$_numCols*($_slice-1)] set firstElem [expr $realRow*$_numCols+$col_+1+$origin] $fFile putImage $firstElem 1 [list $val_] _readTableData $col_ $row_ 1 1 } itcl::body CubeImage::_getRawDataBlock { fCol_ fRow_ lCol_ lRow_ } { # col/row zero-indexed set origin [expr $_numRows*$_numCols*($_slice-1)] set nElem [expr $lCol_ - $fCol_ + 1] for { set col 0 } { $col<$nElem } { incr col } { set _colData($col) {} } set row $fRow_ for { set row $fRow_ } { $row <= $lRow_ } { incr row } { set realRow [expr $_numRows-$row-1] set firstElem [expr $realRow*$_numCols+$fCol_+1+$origin] set col 0 foreach datum [$fFile getImageAsList $firstElem $nElem] { lappend _colData($col) $datum incr col } } set data {} for { set col 0 } { $col<$nElem } { incr col } { lappend data $_colData($col) } return $data } itcl::body CubeImage::_putRawDataBlock { fCol_ fRow_ data_ } { # col/row zero-indexed set origin [expr $_numRows*$_numCols*($_slice-1)] set nCols [llength $data_] set nRows [llength [lindex $data_ 0]] for { set i 0 } { $i<$nRows } { incr i } { set rowData {} foreach cData $data_ { lappend rowData [lindex $cData $i] } set realRow [expr $_numRows-$fRow_-1] set firstElem [expr $realRow*$_numCols+$fCol_+1+$origin] $fFile putImage $firstElem $nCols $rowData incr fRow_ } } # # End Data handlers # ############################################## fv5.4/ftools/guis/fv/class/FVFile.tcl0000644000220700001010000000453510442112363017023 0ustar birbylheadevitcl::class FVFile { constructor {args} {} destructor {} private variable fileName private variable extNum 1 private variable openMode 0 private variable fFileName private variable isOpen 0 private variable colList {} private variable xcolumn {} private variable ycolumn {} private variable xecolumn {} private variable yecolumn {} public method setFileName {fname} public method setFileMode {fmode} public method setExtension {extnum} public method displayTable {} public method displayHeader {} public method displayImage {} public method plotTable {} public method setColumnList {args} public method setXColumn {x} public method setYColumn {y} public method setXErrorColumn {xe} public method setYErrorColumn {ye} private method openFVFile {} } itcl::body FVFile::constructor {} { } itcl::body FVFile::setFileName {fname} { set fileName $fname } itcl::body FVFile::setFileMode {fmode} { # rw =0 , r = 1, new = 2 switch $fmode { "new" { set file_mode 2 } "r" { set file_mode 1 } "wr" - "rw" { set file_mode 0 } default { set file_mode $fmode } } set openMode $file_mode } itcl::body FVFile::setExtension {extnum} { # primary array extnum = 1 set extNum $extnum } itcl::body FVFile::openFVFile {} { if { $isOpen == 1} return # _father is only for displaying the highlight. open as read-only set fFileName [openFitsFileWM $fileName $openMode] set isOpen 1 } itcl::body FVFile::displayTable {} { openFVFile $fFileName openTable $extNum - 1 } itcl::body FVFile::plotTable {} { openFVFile if { $xcolumn == {} || $ycolumn == {} } { puts "You need to specify X and Y column names for plotting" return } $fFileName plotData $extNum [list $xcolumn $xecolumn $ycolumn $yecolumn 0] } itcl::body FVFile::displayHeader {} { openFVFile $fFileName openHeader $extNum } itcl::body FVFile::displayImage {} { openFVFile $fFileName plotData $extNum } itcl::body FVFile::setColumnList {args} { set colList [join $args] } itcl::body FVFile::setXColumn {x} { set xcolumn $x } itcl::body FVFile::setYColumn {y} { set ycolumn $y } itcl::body FVFile::setXErrorColumn {xe} { set xecolumn $xe } itcl::body FVFile::setYErrorColumn {ye} { set yecolumn $ye } fv5.4/ftools/guis/fv/class/FVFtool.tcl0000644000220700001010000011671210576017172017242 0ustar birbylheadevitcl::class FtoolParameter { public variable name public variable value public variable descr public variable mode public variable type public variable isFits public variable isOutput public variable frame public variable cframe private variable pseparator private variable temp_value constructor {args} {} destructor {} public method GetParameter {frame} public method CheckParameter {} private method ParBrowser {} private method ParApply {} private method ParAppend {} private method ParReset {} private method ParOK {parobj flag} } itcl::body FtoolParameter::constructor {args} { set name [lindex $args 0] set value [lindex $args 1] set type [lindex $args 2] set mode [lindex $args 3] if { $type == "b" } { set value [string tolower [lindex $args 1]] } set descr [lindex $args 4] set isFits 0 set isOutput 0 set pseparator "," } itcl::body FtoolParameter::destructor {} { } itcl::body FtoolParameter::GetParameter {frame} { # variable is never used anywhere global g_entryFont global g_titleFont set temp [string tolower $name] set cframe ${frame}.${temp} set fr $cframe if [winfo exists $fr] { return } frame $fr -relief groove label $fr.name -text $name -width 10 -anchor w label $fr.descr -text $descr -width 36 -anchor w -font {Arial 10 bold} if {$type == "b" } { text $fr.value -width 25 -height 1.1 -relief flat radiobutton $fr.value.yes -variable [itcl::scope value] -value "yes" \ -font g_titleFont -text "Yes" radiobutton $fr.value.no -variable [itcl::scope value] -value "no" \ -font g_titleFont -text "No" $fr.value window create end -window $fr.value.yes $fr.value window create end -window $fr.value.no } else { entry $fr.value -width 25 -textvariable [itcl::scope value] -font g_titleFont } pack $fr.name -side left -ipadx 1 pack $fr.descr -side left -ipadx 1 pack $fr.value -side left -ipadx 1 -expand true # pack $fr.isfits -side left -ipadx 1 # pack $fr.isoutput -side left -ipadx 1 if {$type == "s" } { button $fr.browser -text browser -command [itcl::code $this ParBrowser] pack $fr.browser -side left -padx 2 } } itcl::body FtoolParameter::CheckParameter {} { switch -exact -- $type { b { if {$value != "yes" && $value !="no"} { set str "Parameter $name has invalid value, $value.\n" set str "$str Only yes and no are allowed." tk_dialog .parerror "Parameter Error" \ $str error 0 Ok return 1 } } i { if { [regexp -nocase {[a-z_,\.]} $value ] && \ $value != "INDEF" } { set str "Parameter $name has invalid value, $value.\n" set str "$str Only integer is allowed." tk_dialog .parerror "Parameter Error" \ $str error 0 Ok return 1 } } r { if { [regexp -nocase {[a-z_,]} $value ] && \ $value != "INDEF" } { set str "Parameter $name has invalid value, $value.\n" set str "$str Only numerical value is allowed." tk_dialog .parerror "Parameter Error" \ $str error 0 Ok return 1 } } } return 0 } itcl::body FtoolParameter::ParBrowser {} { global g_titleFont set temp_value [string trim $value] set parobj [ iwidgets::fileselectiondialog .parbrowser \ -childsitepos s -selectionon false -title $name -height 500 ] .parbrowser hide 3 set f "[.parbrowser childsite].f" frame $f -relief groove -bd 2 pack $f -side top -fill x -expand yes -pady 3 set f1 $f.f1 frame $f1 pack $f1 -side left radiobutton $f1.output -variable [itcl::scope isOutput] -value 1 \ -font g_titleFont -text "Output" -anchor w \ -command [itcl::code $this ParReset ] radiobutton $f1.input -variable [itcl::scope isOutput] -value 0 \ -font g_titleFont -text "Input" -anchor w \ -command [itcl::code $this ParReset ] checkbutton $f1.isfits -variable [itcl::scope isFits] -onvalue 1 -offvalue 0 \ -anchor w -text "Fits file" pack $f1.output -side top -anchor w pack $f1.input -side top -anchor w pack $f1.isfits -side top -anchor w set f2 $f.f2 frame $f2 pack $f2 -side right -padx 10 button $f2.apply -text "Apply to..." -command [itcl::code $this ParApply] button $f2.append -text "Append to..." -command [itcl::code $this ParAppend] iwidgets::entryfield $f2.sep -labeltext "Separator" \ -textvariable [itcl::scope pseparator] -width 6 pack $f2.apply -side top -pady 2 -fill x -expand yes pack $f2.append -side top -pady 2 -fill x -expand yes pack $f2.sep -side top -anchor w -pady 2 -fill x -expand yes set ventry "[.parbrowser childsite].value" iwidgets::entryfield $ventry -labeltext "Value" \ -textvariable [itcl::scope temp_value] pack $ventry -fill x -expand yes -pady 3 .parbrowser buttonconfigure 0 -command [itcl::code $this ParOK $parobj 1] .parbrowser buttonconfigure 2 -command [itcl::code $this ParOK $parobj 0] ParReset .parbrowser activate } itcl::body FtoolParameter::ParApply {} { if {$isOutput == 1} { set temp [.parbrowser get] set temp_value "[file dirname $temp]\/" } else { set temp_value [.parbrowser get] } } itcl::body FtoolParameter::ParAppend {} { if {$temp_value == ""} { set temp_value [.parbrowser get] } else { set temp_value "${temp_value}${pseparator}[.parbrowser get]" } } itcl::body FtoolParameter::ParReset { } { if {$isOutput == 1} { [.parbrowser childsite].f.f2.append configure -state disabled } else { [.parbrowser childsite].f.f2.append configure -state normal } } itcl::body FtoolParameter::ParOK {parobj flag} { if { $flag == 1 } { set value $temp_value } itcl::delete object $parobj } itcl::class FtoolInstance { private variable origPath private variable ftoolPath private variable helpPath private variable parPath private variable autoSave private variable autoClear private variable currPackage private variable currFtool private variable currCmd private variable favorite private variable wlist private variable logtext private variable logchan private variable currParFile private variable currParList private variable parObjs private variable isParTool private variable showHidden private variable goodCommand private variable outputFits private variable curPos private variable tmp_ftoolPath private variable tmp_helpPath private variable tmp_parPath private variable tmp_autoSave private variable tmp_autoClear private variable tmp_currCmd private variable tmp_outputFits constructor {args} {} destructor {} public method MainMenu {} private method MenuInit {} private method PackageMenu { } private method PackageGet { package } private method FtoolGet {} private method FtoolRun {} private method FtoolCancel {} private method FtoolTerminate {} private method FtoolHelp {} private method FavoriteGet {} private method FavoriteAdd {} private method FavoriteDelete {} private method FavoriteReset {} private method FavoriteCheck {} private method ConfigSet {} private method ConfigOk {} private method HelpGet {} private method LogDump {} private method LogClear {} private method LogError {} private method ParExist {} private method ParClear {} private method ParSave {} private method ParSet {} private method ParDialog {} private method ParsRedraw {fpar} private method ParsReset {fpar} private method ParsOk {} private method ParsCancel {} private method CmdDialog {} private method CmdOk {} private method CmdCancel {} private method DumpText {wtext chan termCmd} private method SearchDir {pathname filename} } itcl::body FtoolInstance::constructor {args} { global env set ftoolPath "" if [info exists env(PATH) ] { set origPath $env(PATH) } else { set origPath "" } if [info exists env(LHEA_HELP) ] { set helpPath $env(LHEA_HELP) } else { set helpPath "" } if [info exists env(PFILES) ] { set parPath $env(PFILES) } else { set parPath "" } set autoSave 1 set autoClear 0 set currCmd "" set currFtool "" set currPackage "" set currParList "" set currParFile "" set parObjs "" set favorite "" set showHidden 0 set goodCommand 0 set outputFits "" set logchan "" set isParTool 1 set tmp_ftoolPath "" set tmp_helpPath "" set tmp_parPath "" set tmp_autoSave "" set tmp_autoClear "" set tmp_currCmd "" set tmp_outputFits "" } itcl::body FtoolInstance::destructor {} { } itcl::body FtoolInstance::MainMenu {} { global g_titleFont global g_entryFont if [winfo exist .ftoolframe ] { focus .ftoolframe raise .ftoolframe return } toplevel .ftoolframe -class Dialog wm title .ftoolframe "fv: Run Ftool" #################################### # # # Set up the Ftools Menu Bar # # # #################################### frame .ftoolframe.menu pack .ftoolframe.menu -fill x -pady 2 -pady 2 set fm .ftoolframe.menu # Ftool menu button menubutton $fm.ftool -text "Ftool" -menu $fm.ftool.menu -font g_titleFont pack $fm.ftool -padx 2 -pady 2 -side left set m3 [menu $fm.ftool.menu -tearoff 1 ] $m3 add command -label "Run..." \ -command [itcl::code $this FtoolRun] -font g_titleFont $m3 add command -label "Cancel..." \ -command [itcl::code $this FtoolCancel] -font g_titleFont $m3 add command -label "Ftool Help" \ -command [itcl::code $this FtoolHelp] -font g_titleFont $m3 add separator $m3 add command -label "Clear Log" \ -command [itcl::code $this LogClear] -font g_titleFont $m3 add command -label "Dump Log" \ -command [itcl::code $this LogDump] -font g_titleFont $m3 add separator $m3 add command -label "Exit" \ -command "destroy .ftoolframe" -font g_titleFont # package menu button menubutton $fm.packages -text Packages -menu $fm.packages.menu -font g_titleFont pack $fm.packages -padx 2 -pady 2 -side left set m1 [menu $fm.packages.menu -tearoff 1] PackageMenu # favorite menu button menubutton $fm.favorite -text "Favorite" -menu $fm.favorite.menu -font g_titleFont pack $fm.favorite -padx 2 -pady 2 -side left set m2 [menu $fm.favorite.menu -tearoff 1 ] $m2 add command -label "Go to..." \ -command [itcl::code $this FavoriteGet] -font g_titleFont $m2 add command -label "Add..." \ -command [itcl::code $this FavoriteAdd] -font g_titleFont $m2 add command -label "Delete..." \ -command [itcl::code $this FavoriteDelete] -font g_titleFont $m2 add command -label "Reset..." \ -command [itcl::code $this FavoriteReset] -font g_titleFont $m2 add separator $m2 add command -label "Configure" \ -command [itcl::code $this ConfigSet] -font g_titleFont # help menu button menubutton $fm.help -text "Help" -menu $fm.help.menu -font g_titleFont pack $fm.help -padx 2 -pady 2 -side left set m4 [menu $fm.help.menu -tearoff 1 ] $m4 add command -label "About this program" \ -command [itcl::code $this HelpGet] -font g_titleFont $m4 add command -label "About selected ftool" \ -command [itcl::code $this FtoolHelp] -font g_titleFont #################################### # # # Set up the Ftools List # # # #################################### frame .ftoolframe.tools -relief groove -bd 4 pack .ftoolframe.tools -fill x -padx 2 -padx 2 set ft .ftoolframe.tools label $ft.label -font {System 15 bold} pack $ft.label -side top -anchor w -padx 2 -padx 2 frame $ft.f1 pack $ft.f1 -side top -fill x listbox $ft.f1.list -bd 1 -selectmode single \ -yscrollcommand {.ftoolframe.tools.f1.yscroll set} \ -xscrollcommand {.ftoolframe.tools.f1.xscroll set} \ -exportselection 0 -takefocus 0 -font g_titleFont set wlist $ft.f1.list scrollbar $ft.f1.yscroll \ -command {.ftoolframe.tools.f1.list yview} scrollbar $ft.f1.xscroll -orient horizontal \ -command {.ftoolframe.tools.f1.list xview} bind $ft.f1.list [itcl::code $this FtoolRun ] pack $ft.f1.yscroll -side right -fill y pack $ft.f1.xscroll -side bottom -fill x pack $ft.f1.list -side left -fill x -expand true frame $ft.f2 pack $ft.f2 -side top -fill x -pady 3 -padx 3 button $ft.f2.fav -text "Add to Favorite" -width 12 -font g_titleFont button $ft.f2.run -text "Run" -command [itcl::code $this FtoolRun ] \ -width 12 -font g_titleFont button $ft.f2.cancel -text "Cancel" -command [itcl::code $this FtoolCancel ] \ -width 12 -font g_titleFont button $ft.f2.help -text "Ftool Help" -command [itcl::code $this FtoolHelp ] \ -width 12 -font g_titleFont pack $ft.f2.fav -side left -padx 20 pack $ft.f2.run -side left -padx 20 pack $ft.f2.cancel -side left -padx 20 pack $ft.f2.help -side left -padx 20 #################################### # # # Set up the Ftools Log # # # #################################### frame .ftoolframe.log -relief groove -bd 4 pack .ftoolframe.log -fill x -padx 2 -padx 2 set fl .ftoolframe.log label $fl.label -font g_titleFont -text Log pack $fl.label -side top -anchor w -padx 2 -padx 2 frame $fl.f1 set f1 $fl.f1 text $f1.text -bd 1 \ -yscrollcommand {.ftoolframe.log.f1.yscroll set} \ -xscrollcommand {.ftoolframe.log.f1.xscroll set} \ -wrap none -font g_entryFont set logtext $f1.text scrollbar $f1.yscroll \ -command {.ftoolframe.log.f1.text yview} scrollbar $f1.xscroll -orient horizontal \ -command {.ftoolframe.log.f1.text xview} pack $f1.yscroll -side right -fill y pack $f1.xscroll -side bottom -fill x pack $f1.text -side left -fill x -fill y -expand true pack $f1 -fill x -side top -padx 2 -padx 2 -expand true frame $fl.f2 pack $fl.f2 -side top -fill x -pady 3 -padx 3 button $fl.f2.dump -text "Dump" -command [itcl::code $this LogDump] -font g_titleFont button $fl.f2.clear -text "Clear" -command [itcl::code $this LogClear ] -font g_titleFont button $fl.f2.close -text "Exit" -command \ "destroy .ftoolframe" -font g_titleFont pack $fl.f2.dump -side left -padx 20 pack $fl.f2.clear -side left -padx 20 pack $fl.f2.close -side right -padx 20 bind .ftoolframe { destroy . } MenuInit } itcl::body FtoolInstance::MenuInit {} { .ftoolframe.menu.favorite.menu entryconfigure 2 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 3 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 4 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 1 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 3 -state disabled .ftoolframe.menu.help.menu entryconfigure 2 -state disabled .ftoolframe.tools.f2.fav configure -state disable .ftoolframe.tools.f2.run configure -state disable bind .ftoolframe.tools.f1.list {} .ftoolframe.tools.f2.cancel configure -state disable .ftoolframe.tools.f2.help configure -state disable $logtext configure -state disabled } itcl::body FtoolInstance::PackageMenu {} { global g_titleFont set fm .ftoolframe.menu set m1 .ftoolframe.menu.packages.menu $m1 delete 1 end set packagelist [list "asca" "caltools" "einstein" "exosat" "fimage" \ "futils" "gro" "heao1" "heasarc" "oso" "rosat" "time" "vela5b" "xronos" \ "xte" ] set numPacks [llength $packagelist] for { set i 0 } { $i < $numPacks } {incr i } { set package [lindex $packagelist $i] set b [SearchDir $helpPath $package.txt] if {$b != ""} { $m1 add command -label $package \ -font g_titleFont \ -command [itcl::code $this PackageGet $package ] } } } itcl::body FtoolInstance::PackageGet {package } { set currPackage $package if [winfo exists .ftoolframe.tools.label ] { .ftoolframe.tools.label configure -text $package } if [winfo exists $wlist ] { $wlist delete 0 end set txtfile [ SearchDir $helpPath $package.txt] set channel [open $txtfile r] set i 0 while {[gets $channel line ] >= 0 } { incr i set line [string trim $line ] if {$line == ""} { continue } set line [string trim $line \#\*\+] set line [string trim $line ] if [regexp ^\[P\] $line] { break } if { [string first " - " $line] == -1 } { set line [string trim $line] set line "$temp $line" $wlist delete end } $wlist insert end $line set temp $line } close $channel .ftoolframe.tools.f1.list selection set 0 .ftoolframe.tools.f2.fav configure -command [itcl::code $this FavoriteAdd] .ftoolframe.tools.f2.fav configure -text "Add to Favorite" .ftoolframe.tools.f2.fav configure -state normal .ftoolframe.tools.f2.run configure -state normal bind .ftoolframe.tools.f1.list [itcl::code $this FtoolRun ] .ftoolframe.tools.f2.cancel configure -state disabled .ftoolframe.tools.f2.help configure -state normal .ftoolframe.menu.ftool.menu entryconfigure 1 -state normal .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 3 -state normal .ftoolframe.menu.help.menu entryconfigure 2 -state normal if {$i > 0} { .ftoolframe.menu.favorite.menu entryconfigure 2 -state normal } else { .ftoolframe.menu.favorite.menu entryconfigure 2 -state disabled } } .ftoolframe.menu.favorite.menu entryconfigure 3 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 4 -state disabled } itcl::body FtoolInstance::FavoriteGet {} { global g_titleFont if [winfo exists .ftoolframe.tools.label ] { .ftoolframe.tools.label configure -text "My favorite" -font g_titleFont } if [winfo exists $wlist ] { .ftoolframe.tools.f2.fav configure -command [itcl::code $this FavoriteDelete] .ftoolframe.tools.f2.fav configure -text "Delete " .ftoolframe.menu.favorite.menu entryconfigure 2 -state disabled $wlist delete 0 end set num [FavoriteCheck] if {$num == 0} { return } for {set i 0} {$i < $num} {incr i} { $wlist insert end [lindex $favorite $i] } $wlist selection set 0 } } itcl::body FtoolInstance::FavoriteReset {} { set favorite "" .ftoolframe.tools.f1.list delete 0 end } itcl::body FtoolInstance::ConfigSet {} { global g_titleFont set tmp_ftoolPath $ftoolPath set tmp_parPath $parPath set tmp_helpPath $helpPath set tmp_autoSave $autoSave set tmp_autoClear $autoClear toplevel .cframe -class Dialog wm title .cframe "fv: Ftool Configuration " frame .cframe.frm -relief groove -bd 2 pack .cframe.frm -side top -ipadx 2 -ipadx 2 frame .cframe.frm.ft set f1 .cframe.frm.ft label $f1.label -text "Ftool Path" -width 15 -anchor w -font g_titleFont entry $f1.entry -textvariable [itcl::scope tmp_ftoolPath ] -width 40 \ -font g_titleFont pack $f1.label -side left -anchor w pack $f1.entry -side left -anchor w frame .cframe.frm.fp set f2 .cframe.frm.fp label $f2.label -text "Par File Path" -width 15 -anchor w -font g_titleFont entry $f2.entry -textvariable [itcl::scope tmp_parPath ] -width 40 \ -font g_titleFont pack $f2.label -side left -anchor w pack $f2.entry -side left -anchor w frame .cframe.frm.fh set f3 .cframe.frm.fh label $f3.label -text "Help File Path" -width 15 -anchor w -font g_titleFont entry $f3.entry -textvariable [itcl::scope tmp_helpPath ] -width 40 \ -font g_titleFont pack $f3.label -side left -anchor w pack $f3.entry -side left -anchor w frame .cframe.frm.fo set f4 .cframe.frm.fo checkbutton $f4.save -variable [itcl::scope tmp_autoSave] \ -onvalue 1 -offvalue 0 \ -text "Save the parameter file automatically" -font g_titleFont checkbutton $f4.clear -variable [itcl::scope tmp_autoClear] \ -onvalue 1 -offvalue 0 \ -text "Clear the Log window automatically" -font g_titleFont pack $f4.save -side top -anchor w pack $f4.clear -side top -anchor w pack $f1 -side top -anchor w -fill x pack $f2 -side top -anchor w -fill x pack $f3 -side top -anchor w -fill x pack $f4 -side top -anchor w -fill x frame .cframe.cmd pack .cframe.cmd -side top -padx 5 -pady 5 -fill x button .cframe.cmd.ok -text "OK" -command [itcl::code $this ConfigOk ] -font g_titleFont button .cframe.cmd.cancel -text "Cancel" -command {destroy .cframe} -font g_titleFont pack .cframe.cmd.ok -side left -padx 10 pack .cframe.cmd.cancel -side right -padx 10 } itcl::body FtoolInstance::ConfigOk {} { global env set ftoolPath [string trim $tmp_ftoolPath] set parPath [string trim $tmp_parPath] set helpPath [string trim $tmp_helpPath] set autoSave [string trim $tmp_autoSave ] set autoClear [string trim $tmp_autoClear ] # set env(FTOOLS) $ftoolPath if {$ftoolPath != "" } { set env(PATH) "$ftoolPath;$origPath" } set env(LHEA_HELP) $helpPath if {$helpPath == "" } { unset env(LHEA_HELP) } set env(PFILES) $parPath if {$parPath == "" } { unset env(PFILES) } PackageMenu MenuInit if [winfo exists $wlist ] { $wlist delete 0 end } .ftoolframe.tools.label configure -text "" ParClear set currFtool "" destroy .cframe } itcl::body FtoolInstance::HelpGet {} { hhelp ftool } itcl::body FtoolInstance::FtoolHelp {} { set fhelpname [ FtoolGet ] if [winfo exists .fhelpframe] { return } toplevel .fhelpframe -class Dialog wm title .fhelpframe "fv: ${fhelpname}.txt" frame .fhelpframe.f1 set f1 .fhelpframe.f1 text $f1.text -bd 1 -width 80 -font {courier 13 bold}\ -yscrollcommand {.fhelpframe.f1.yscroll set} \ -xscrollcommand {.fhelpframe.f1.xscroll set} set htext $f1.text scrollbar $f1.yscroll \ -command {.fhelpframe.f1.text yview} scrollbar $f1.xscroll -orient horizontal \ -command {.fhelpframe.f1.text xview} pack $f1.yscroll -side right -fill y pack $f1.xscroll -side bottom -fill x pack $f1.text -side left -fill x -fill y pack $f1 button .fhelpframe.button -text OK -command " destroy .fhelpframe" pack .fhelpframe.button -pady 4 $htext delete 1.0 end set txtfile [SearchDir $helpPath $fhelpname.txt ] if {$txtfile != "" } { set hchan [open $txtfile r] fileevent $hchan readable [itcl::code $this DumpText $htext $hchan ] } else { $htext insert end "404 - No text help file found" } } itcl::body FtoolInstance::FtoolRun {} { # if it is the new ftool, initialize it. .ftoolframe.tools.f2.run configure -state disabled bind .ftoolframe.tools.f1.list {} .ftoolframe.tools.f2.cancel configure -state normal .ftoolframe.menu.favorite.menu entryconfigure 2 -state normal set temp [ FtoolGet ] if {$currFtool != $temp } { ParClear set currFtool $temp set isParTool [ ParExist ] if {$isParTool == 1} { ParSet } } # open the dialog if {$isParTool == 1} { ParDialog tkwait window .pframe } else { CmdDialog tkwait window .cmdframe } # run the command if {$goodCommand == 0} { .ftoolframe.tools.f2.run configure -state normal bind .ftoolframe.tools.f1.list [itcl::code $this FtoolRun ] .ftoolframe.tools.f2.cancel configure -state disabled .ftoolframe.menu.ftool.menu entryconfigure 1 -state normal .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled return } else { set curPos [$logtext index end] if {$autoClear == 1} { LogClear } } if {$isParTool == 1} { set currCmd $currFtool set npar [llength $currParList] if {$npar < 1} { return } for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] set parname [$objname cget -name] set parvalue [$objname cget -value] if {$parname == "page" } { set parvalue "no" } if {$parname == "confirm" } { set parvalue "no" } if {$parname == "proceed" } { set parvalue "yes" } if {$parvalue == "" } { set parvalue " " } set currCmd "$currCmd \"${parname}=${parvalue}\" " } } set n [string length $currCmd] set n1 $n set cmdstr "" set i 0 while {$n1 > 0} { if { $n1 > 80 } { set j [expr $i + 79] } else { set j $n } set cmdstr "$cmdstr [string range $currCmd $i $j] \n" set i [expr $j + 1 ] set n1 [expr $n1 - 80] } $logtext configure -state normal $logtext insert end "$cmdstr \n" $logtext configure -state disabled set logchan [open "| $currCmd |& cat " r] fileevent $logchan readable \ [itcl::code $this DumpText $logtext $logchan FtoolTerminate ] } itcl::body FtoolInstance::FtoolTerminate {} { global g_fitsFileMode # display the file header set num [llength $outputFits] for {set i 0} {$i < $num} {incr i} { set ftooloutput [lindex $outputFits $i] set ftooloutput [string trim $ftooloutput] set ftooloutput [string trim $ftooloutput \!] set oldMode $g_fitsFileMode # Set Read-Only flag set g_fitsFileMode 1 set tmp [openFitsFile $ftooloutput] $tmp changeFile set g_fitsFileMode $oldMode } # save the par file if {$autoSave == 1 && $goodCommand == 1 && $isParTool == 1 } { ParSave } .ftoolframe.tools.f2.run configure -state normal bind .ftoolframe.tools.f1.list [itcl::code $this FtoolRun ] .ftoolframe.tools.f2.cancel configure -state disabled .ftoolframe.menu.ftool.menu entryconfigure 1 -state normal .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled # set the pointer position in log window if {$autoClear == 1} { $logtext see 0.1 } else { $logtext see $curPos } return } itcl::body FtoolInstance::FtoolCancel {} { if {$logchan != "" } { catch {close $logchan} } .ftoolframe.tools.f2.run configure -state normal bind .ftoolframe.tools.f1.list [itcl::code $this FtoolRun ] .ftoolframe.tools.f2.cancel configure -state disabled .ftoolframe.menu.ftool.menu entryconfigure 1 -state normal .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled } itcl::body FtoolInstance::FavoriteAdd {} { set i [$wlist curselection] set temp [$wlist get $i] lappend favorite $temp } itcl::body FtoolInstance::FavoriteDelete {} { set num [FavoriteCheck] if {$num == 0} { return } set i [$wlist curselection] $wlist delete $i set favorite [$wlist get 0 end ] set num [FavoriteCheck] if {$num != 0} { $wlist selection set $i } } itcl::body FtoolInstance::FtoolGet {} { set i [$wlist curselection] set temp [$wlist get $i] set temp [split $temp] return [lindex $temp 0] } itcl::body FtoolInstance::FavoriteCheck {} { set num [llength $favorite] if {$num == 0 } { .ftoolframe.tools.f2.fav configure -state disable .ftoolframe.tools.f2.run configure -state disable bind .ftoolframe.tools.f1.list {} .ftoolframe.tools.f2.cancel configure -state disable .ftoolframe.tools.f2.help configure -state disable .ftoolframe.menu.ftool.menu entryconfigure 1 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 3 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 2 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 3 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 4 -state disabled .ftoolframe.menu.help.menu entryconfigure 2 -state disabled } else { .ftoolframe.tools.f2.fav configure -state normal .ftoolframe.tools.f2.run configure -state normal bind .ftoolframe.tools.f1.list [itcl::code $this FtoolRun ] .ftoolframe.tools.f2.cancel configure -state disabled .ftoolframe.tools.f2.help configure -state normal .ftoolframe.menu.ftool.menu entryconfigure 1 -state normal .ftoolframe.menu.ftool.menu entryconfigure 2 -state disabled .ftoolframe.menu.ftool.menu entryconfigure 3 -state normal .ftoolframe.menu.favorite.menu entryconfigure 2 -state disabled .ftoolframe.menu.favorite.menu entryconfigure 3 -state normal .ftoolframe.menu.favorite.menu entryconfigure 4 -state normal .ftoolframe.menu.help.menu entryconfigure 2 -state normal } return $num } itcl::body FtoolInstance::LogClear {} { $logtext configure -state normal $logtext delete 1.0 end $logtext configure -state disabled } itcl::body FtoolInstance::LogError {} { $logtext configure -state normal $logtext insert end \ "$currFtool needs runtime input and can not be handled by Fv. \n" $logtext configure -state disabled FtoolCancel } itcl::body FtoolInstance::LogDump {} { set logfile [ tk_getSaveFile -initialfile "ftool.log"] if { $logfile == "" } { return } $logtext configure -state normal set channel [open $logfile a] set buffer [split [$logtext get 1.0 end ] \n] set num [llength $buffer] for {set i 0} {$i < $num} {incr i} { puts $channel [lindex $buffer $i] } close $channel $logtext configure -state disabled } itcl::body FtoolInstance::ParExist {} { set pfile "${currFtool}.par" set b [split $parPath \;] set dir0 [lindex $b 0] set currParFile [file join $dir0 $pfile] if [ file exists $currParFile ] { return 1 } set tmpfile [SearchDir $parPath $pfile] if { $tmpfile != "" && [file type $tmpfile] == "link" } { set tmpfile [format "%s/%s" [file dirname $tmpfile] [file readlink $tmpfile]] } if {$tmpfile != "" } { file copy -force $tmpfile $currParFile } if ![ file exists $currParFile ] { return 0 } return 1 } itcl::body FtoolInstance::ParSet {} { set parObjs "" set currParList "" set pchannel [open $currParFile r] while { [gets $pchannel line] >=0 } { set line [string trim $line] if [regexp ^\# $line ] { continue } set par [split $line \,] set parname [string trim [lindex $par 0] ] if {$parname ==""} { continue } set parvalue [string trim [lindex $par 3] ] set parvalue [string trim $parvalue \"] set pardescr [string trim [lindex $par 6] ] set pardescr [string trim $pardescr \"] set partype [string trim [lindex $par 1] ] set parmode [string trim [lindex $par 2] ] lappend currParList $parname set objname par_${parname} FtoolParameter $objname $parname $parvalue $partype $parmode \ $pardescr lappend parObjs $objname } close $pchannel } itcl::body FtoolInstance::ParSave {} { set buffer "" set pchannel [open $currParFile r+] while { [gets $pchannel line] >=0 } { lappend buffer $line } close $pchannel set cauto a if ![string match l [par_mode cget -value] ] { set cauto x } set pchannel [open "partemp.par" w] set npar [llength $currParList] for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] set line [lindex $buffer $i] set temp [split $line \,] set parvalue [lindex $temp 3] set parmode [lindex $temp 2] set partype [lindex $temp 1] set currvalue [$objname cget -value] set currvalue [string trim $currvalue] set parvalue [string trim $parvalue] if ![ string match {[l$cauto]} $parmode ] { puts $pchannel $line continue } if { $partype == "s" } { set currvalue "\"$currvalue\"" } if {$parvalue != $currvalue } { set temp [lreplace $temp 3 3 $currvalue] set line [join $temp \,] } puts $pchannel $line } close $pchannel file copy -force "partemp.par" $currParFile file delete "partemp.par" } itcl::body FtoolInstance::ParClear {} { set npar [llength $currParList] if {$npar == 0 } { return } for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] itcl::delete object $objname } set parObjs "" set currParList "" set outputFits "" } itcl::body FtoolInstance::ParDialog {} { set pfile "${currFtool}.par" toplevel .pframe -class Dialog wm title .pframe "fv: $pfile" frame .pframe.title set title .pframe.title label $title.name -text "Name" -width 10 -anchor w label $title.descr -text "Description" -width 33 -anchor w label $title.value -text "Value" -width 20 -anchor w # label $title.isfits -text "Fits?" -width 5 -anchor w # label $title.isoutput -text "Output?" -width 7 -anchor w label $title.browser -text "" -width 6 -anchor w pack $title.name -side left -ipadx 1 pack $title.descr -side left -ipadx 1 pack $title.value -side left -ipadx 1 # pack $title.isfits -side left -ipadx 1 # pack $title.isoutput -side left -ipadx 1 pack $title.browser -side left -ipadx 1 pack $title -fill x frame .pframe.params text .pframe.params.list -yscrollcommand {.pframe.params.scrolly set } \ -wrap none -width 80 scrollbar .pframe.params.scrolly -orient vertical \ -command {.pframe.params.list yview} pack .pframe.params.scrolly -side right -fill y -expand true pack .pframe.params.list -side left -fill x -fill y -expand true pack .pframe.params -side top -fill x set fpar .pframe.params.list ParsRedraw $fpar frame .pframe.commands set pfm .pframe.commands checkbutton $pfm.hidden -variable [itcl::scope showHidden] -onvalue 1 -offvalue 0 \ -text "Show hidden" -command [itcl::code $this ParsRedraw $fpar] button $pfm.reset -text Reset -width 6 \ -command [itcl::code $this ParsReset $fpar ] button $pfm.help -text Help -width 6 -command [itcl::code $this FtoolHelp] button $pfm.cancel -text Cancel -width 6 -command [itcl::code $this ParsCancel] button $pfm.ok -text OK -width 6 -command [itcl::code $this ParsOk] pack $pfm.hidden -side left -padx 10 pack $pfm.reset -side left -padx 10 pack $pfm.help -side right -padx 10 pack $pfm.cancel -side right -padx 10 pack $pfm.ok -side right -padx 10 pack $pfm -side top -fill x -pady 5 } itcl::body FtoolInstance::ParsReset {fpar} { # force to recopy the system one. file delete $currParFile ParClear if [ ParExist ] { ParSet } ParsRedraw $fpar } itcl::body FtoolInstance::ParsRedraw {fpar } { set npar [llength $currParList] if {$npar < 1} { return } $fpar delete 1.0 end set nshow 0 if {$showHidden == 1} { for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] $objname GetParameter $fpar set cf [$objname cget -cframe] $fpar window create end -window $cf $fpar insert end "\n" incr nshow } set cauto a if ![string match q [par_mode cget -value] ] { set cauto x } for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] set parmode [$objname cget -mode] if [ string match {[q$cauto]} $parmode ] { set cf [ $objname cget -cframe ] ${cf}.name configure -bg green } } } else { set cauto x if [string match h [par_mode cget -value] ] { set cauto a } for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] set parmode [$objname cget -mode] if {$parmode == "h" || $parmode == $cauto} { continue } $objname GetParameter $fpar set cf [$objname cget -cframe] ${cf}.name configure -bg green $fpar window create end -window $cf $fpar insert end "\n" incr nshow } } set nshow [expr $nshow*2] if {$nshow > 24 } { set nshow 24 } $fpar configure -height $nshow } itcl::body FtoolInstance::ParsCancel {} { set goodCommand 0 ParClear ParSet destroy .pframe } itcl::body FtoolInstance::ParsOk {} { set npar [llength $currParList] if {$npar < 1} { set goodCommand 0 destroy .pframe return } # validify the parameter value for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] set status [$objname CheckParameter] if {$status == 1} { set goodCommand 0 focus .pframe raise .pframe return } } # check the output fits set outputFits "" for {set i 0} {$i < $npar} {incr i} { set objname [lindex $parObjs $i] set isoutput [$objname cget -isOutput] set isfits [$objname cget -isFits] if {$isoutput == 1 && $isfits == 1} { lappend outputFits [$objname cget -value] } } set goodCommand 1 destroy .pframe } itcl::body FtoolInstance::CmdDialog {} { global g_titleFont toplevel .cmdframe -class Dialog wm title .cmdframe "fv: $currFtool" set tmp_currCmd $currFtool frame .cmdframe.cmd -relief groove set fc .cmdframe.cmd label $fc.labelc -text "Command" -anchor w entry $fc.entryc -textvariable [itcl::scope tmp_currCmd] -width 40 \ -font g_titleFont label $fc.labelo -text "Output Fits File" -anchor w entry $fc.entryo -textvariable [itcl::scope tmp_outputFits] -width 40 \ -font g_titleFont pack $fc.labelc -side top -anchor w -padx 2 -pady 2 pack $fc.entryc -side top -anchor w -padx 2 -pady 2 pack $fc.labelo -side top -anchor w -padx 2 -pady 2 pack $fc.entryo -side top -anchor w -padx 2 -pady 2 pack $fc -fill x frame .cmdframe.buttons set fb .cmdframe.buttons button $fb.help -text Help -width 6 -command [itcl::code $this FtoolHelp] button $fb.cancel -text Cancel -width 6 -command [itcl::code $this CmdCancel] button $fb.ok -text OK -width 6 -command [itcl::code $this CmdOk] pack $fb.help -side right -padx 10 pack $fb.cancel -side right -padx 10 pack $fb.ok -side right -padx 10 pack $fb -side top -fill x -pady 5 } itcl::body FtoolInstance::CmdCancel {} { set goodCommand 0 destroy .cmdframe } itcl::body FtoolInstance::CmdOk {} { set currCmd $tmp_currCmd set outputFits $tmp_outputFits set goodCommand 1 destroy .cmdframe } itcl::body FtoolInstance::DumpText {wtext chan args} { if [eof $chan] { catch {close $chan} if { [llength $args ] > 0 } { set termcmd [lindex $args 0] $termcmd } return } gets $chan line $wtext configure -state normal $wtext insert end "$line \n" $wtext configure -state disabled } itcl::body FtoolInstance::SearchDir {pathname filename} { set b [split $pathname \;] for {set i 0} {$i < [llength $b] } {incr i} { set dirf [lindex $b $i] set fullfile [file join $dirf $filename] if [file exists $fullfile] { return $fullfile } } return "" } fv5.4/ftools/guis/fv/class/FVSkyview.tcl0000644000220700001010000010104212564652516017614 0ustar birbylheadevitcl::class FVSkyview { constructor {args} {} destructor {} private variable skyvID private variable skyvCoord private variable skyvCoordSys private variable skyvEquinox private variable _skyvImgSizeMinutes private variable skyvImgSizex private variable skyvImgSizey private variable skyvCatalogFlag private variable skyvPlotFlag private variable skyviewProcess private variable skyvcatID private variable catCoord private variable catCoordSys private variable catEquinox private variable _catImgSizeMinutes private variable catOverlayFlag private variable catProcess public method setskyvCoordSys {} public method getskyvcat {} public method getskyvfile {} private method skyviewOK {} private method skyviewReset {} private method catOK {} private method catReset {} private method configCatalog {} private method _encodeString { coord } private variable skyvCatalogDesc [list "HST Guide Star Catalog, Version 2.2" \ "Smithsonian Astrophysical Observatory Star Catalog" \ "Bright Star Catalog" \ "Hipparcos Main Catalog" \ "TYCHO-2 Catalog of the 2.5 Million Brightest Stars" \ "Master Optical Catalog" \ "Master X-Ray Catalog" \ "Master Radio Catalog" \ "NGC 2000.0 Catalog" \ "Messier Nebulae" \ "Extraglactic Radio Sources" \ "Gliese Catalog of Nearby Stars, 3rd Edition" \ "Henry Draper (HD) Catalog" \ "CfA Redshift Catalog (June 1995 Version)" \ "IRAS Faint Sources" \ "IRAS Point Sources" \ "Markarian Galaxies" \ "ROSAT All-Sky Survey: Bright Sources" \ "ROSAT All-Sky Survey: Faint Sources" \ "ROSAT Catalog PSPC RX MPE Sources" \ "ROSAT Catalog PSPC WGA Sources" \ "Third Reference Catalog of Galaxies" \ "USNO A-2 (Monet) Catalog" \ "Uppsala General Catalog of Galaxies" \ "Veron Quasars & AGNs (V2001)" \ "Zwicky Clusters" ] private variable skyvCatalogTableName [ list "I/271" \ "heasarc_sao" \ "heasarc_bsc5p" \ "heasarc_hipparcos" \ "heasarc_tycho2" \ "heasarc_optical" \ "heasarc_xray" \ "heasarc_radio" \ "heasarc_ngc2000" \ "heasarc_messier" \ "heasarc_kuehr" \ "heasarc_cns3" \ "heasarc_hd" \ "heasarc_zcat" \ "heasarc_irasfsc" \ "heasarc_iraspsc" \ "heasarc_markarian" \ "heasarc_rassbsc" \ "heasarc_rassfsc" \ "heasarc_rosatsrc" \ "heasarc_wgacat" \ "heasarc_rc3" \ "I/252" \ "heasarc_ugc" \ "heasarc_veron2001" \ "heasarc_zwclusters" ] private variable skyvSurveyName [ list { "DSS Original (optical)" "DSS" } \ { "DSS1, Red" "DSS1R" } \ { "DSS1, Blue" "DSS1B" } \ { "DSS2, Red" "DSS2R" } \ { "DSS2, Blue" "DSS2B" } \ { "DSS2, IR" "DSS2IR" } \ { "Sloan DSS U-band" "SDSSu" } \ { "Sloan DSS G-band" "SDSSg" } \ { "Sloan DSS R-band" "SDSSr" } \ { "Sloan DSS I-band" "SDSSi" } \ { "Sloan DSS Z-band" "SDSSz" } \ { "2MASS-J (Infrared 1.25 micron)" "2MASS-J" } \ { "2MASS-H (Infrared 1.65)" "2MASS-H" } \ { "2MASS-K (Infrared 2.17)" "2MASS-K" } \ { "Greenbank (6 cm Radio)" "GB6" } \ { "HI All-Sky Continuum Survey (408 MHz)" "408MHz" } \ { "VLA First (21 cm Radio)" "FIRST" } \ { "Westerbork N. Sky Survey (92 cm Radio)" "wenss" } \ { "NVSS NRAO VLA Sky Survey (1.4 GHz)" "NVSS" } \ { "IRIS 12 micron (Infrared)" "IRIS12" } \ { "IRIS 25 micron (Infrared)" "IRIS25" } \ { "IRIS 60 micron (Infrared)" "IRIS60" } \ { "IRIS 100 micron (Infrared)" "IRIS100" } \ { "EUVE 83 Angstrom" "euve83" } \ { "EUVE 171 Angstrom" "euve171" } \ { "EUVE 405 Angstrom" "euve405" } \ { "EUVE 555 Angstrom" "euve555" } \ { "ROSAT Wide Field Camera (100 Angstroms)" "wfcf1" } \ { "ROSAT Wide Field Camera (130 Angstroms)" "wfcf2" } \ { "ROSAT PSPC 2.0 Deg (X-ray)" "PSPC2int" } \ { "ROSAT All Sky Broad Band (0.1 - 2.4 keV X-ray)" "RASS+broad" } \ { "ROSAT All Sky Hard Band (0.5 - 2.0 keV X-ray)" "RASS+Hard" } \ { "ROSAT All Sky Soft Band (0.1 - 0.4 keV X-ray)" "RASS+Soft" } \ { "EGRET >100 MeV (Gamma-ray)" "EGREThard" } \ { "EGRET <100 MeV (Gamma-ray)" "EGRETsoft" } ] } itcl::body FVSkyview::constructor {args} { set skyvID 0 set skyvCoord "" set skyvCoordSys "Equatorial" set skyvEquinox "2000" set _skyvImgSizeMinutes "Default" set skyvImgSizex "300" set skyvImgSizey "300" set skyvCatalogFlag 0 set skyvPlotFlag 1 set skyvcatID 0 set catCoord "" set catCoordSys "Equatorial" set _catImgSizeMinutes "" set catEquinox "2000" set catOverlayFlag 0 } itcl::body FVSkyview::destructor {} { } itcl::body FVSkyview::getskyvfile {} { global g_titleFont if ![info exist skyvID] { set skyvID 1 } if ![info exist skyvEquinox ] { set skyvEquinox "2000" } if ![info exist _skyvImgSizeMinutes ] { set _skyvImgSizeMinutes "Default" } if ![info exist skyvImgSizex ] { set skyvImgSizex "300" } if ![info exist skyvImgSizey ] { set skyvImgSizey "300" } if ![info exist skyvCatalogFlag ] { set skyvCatalogFlag 0 } if [winfo exist .skyviewdlg] { focus .skyviewdlg raise .skyviewdlg return } toplevel .skyviewdlg -class Dialog wm title .skyviewdlg "fv: SkyView" label .skyviewdlg.title -anchor w \ -text "Retrieve an image from NASA's SkyView site." -font g_titleFont pack .skyviewdlg.title -pady 3 -padx 5 -anchor w frame .skyviewdlg.coord -relief flat label .skyviewdlg.coord.label -text "Coordinate or Source:" \ -font g_titleFont -anchor w entry .skyviewdlg.coord.entry -width 40 \ -textvariable [itcl::scope skyvCoord] -relief sunken -font g_titleFont pack .skyviewdlg.coord -pady 3 -padx 5 -anchor w pack .skyviewdlg.coord.label .skyviewdlg.coord.entry -side left frame .skyviewdlg.note -relief flat label .skyviewdlg.note.label -text \ "(e.g. \"Eta Carinae\", \"10 45 3.6, -59 41 4.2\", or \"161.265, -59.685\")" \ -font g_titleFont -anchor w pack .skyviewdlg.note -pady 3 -padx 5 -anchor w pack .skyviewdlg.note.label -side left frame .skyviewdlg.surveytext -relief flat label .skyviewdlg.surveytext.label -text "Choose desired survey:" \ -font g_titleFont -anchor w pack .skyviewdlg.surveytext -pady 3 -padx 5 -anchor w pack .skyviewdlg.surveytext.label -anchor w -side top frame .skyviewdlg.survey -relief flat listbox .skyviewdlg.survey.list -exportselection 0 -takefocus 0 \ -height 5 -width 40 -font g_titleFont \ -yscrollcommand ".skyviewdlg.survey.scroll set" scrollbar .skyviewdlg.survey.scroll \ -command ".skyviewdlg.survey.list yview" foreach token $skyvSurveyName { .skyviewdlg.survey.list insert end [lindex $token 0] } .skyviewdlg.survey.list selection set 0 pack .skyviewdlg.survey -pady 5 -padx 5 -anchor w pack .skyviewdlg.survey.list -side left pack .skyviewdlg.survey.scroll -side right -fill y frame .skyviewdlg.coordsys -relief flat frame .skyviewdlg.coordsys.coord -relief flat set opt .skyviewdlg.coordsys.coord iwidgets::optionmenu $opt.sys -labeltext "System:" \ -font g_titleFont -labelfont g_titleFont \ -command {set skyvCoordSys [.skyviewdlg.coordsys.coord.sys get] } $opt.sys insert end "Equatorial" $opt.sys insert end "Galactic" $opt.sys insert end "Ecliptic" $opt.sys select 0 frame $opt.equinox -relief flat label $opt.equinox.label -text "Equinox: " \ -font g_titleFont -anchor w entry $opt.equinox.entry -width 10 \ -textvariable [itcl::scope skyvEquinox] -relief sunken -font g_titleFont pack $opt.equinox.label \ $opt.equinox.entry -side left -anchor w pack $opt.sys -anchor w -side top pack $opt.equinox -anchor w -side top frame .skyviewdlg.coordsys.options -relief flat frame .skyviewdlg.coordsys.options.imgsized -relief flat label .skyviewdlg.coordsys.options.imgsized.label \ -text "Image width (minutes):" \ -font g_titleFont -anchor w entry .skyviewdlg.coordsys.options.imgsized.entry -width 10 \ -textvariable [itcl::scope _skyvImgSizeMinutes] -relief sunken -font g_titleFont pack .skyviewdlg.coordsys.options.imgsized.label \ .skyviewdlg.coordsys.options.imgsized.entry \ -side left -anchor w frame .skyviewdlg.coordsys.options.imgsizep -relief flat label .skyviewdlg.coordsys.options.imgsizep.label \ -text "Image dimensions(Pixels):" \ -font g_titleFont -anchor w label .skyviewdlg.coordsys.options.imgsizep.labelx \ -text "X:" \ -font g_titleFont -anchor w entry .skyviewdlg.coordsys.options.imgsizep.entryx -width 5 \ -textvariable [itcl::scope skyvImgSizex] -relief sunken -font g_titleFont label .skyviewdlg.coordsys.options.imgsizep.labely \ -text "Y:" \ -font g_titleFont -anchor w entry .skyviewdlg.coordsys.options.imgsizep.entryy -width 5 \ -textvariable [itcl::scope skyvImgSizey] -relief sunken -font g_titleFont pack .skyviewdlg.coordsys.options.imgsizep.label \ .skyviewdlg.coordsys.options.imgsizep.labelx \ .skyviewdlg.coordsys.options.imgsizep.entryx \ .skyviewdlg.coordsys.options.imgsizep.labely \ .skyviewdlg.coordsys.options.imgsizep.entryy \ -side left -anchor w pack .skyviewdlg.coordsys.options.imgsized \ .skyviewdlg.coordsys.options.imgsizep \ -pady 5 -padx 5 -anchor w pack .skyviewdlg.coordsys.coord -pady 3 -padx 5 -anchor w -side left pack .skyviewdlg.coordsys.options -pady 3 -padx 5 -anchor n -side left pack .skyviewdlg.coordsys -pady 3 -padx 5 -anchor w frame .skyviewdlg.choices -relief flat # checkbutton .skyviewdlg.choices.cat \ # -text "Retrieve catalog(s) of objects within image?" \ # -font g_titleFont -anchor w -onvalue 1 -offvalue 0 \ # -variable [itcl::scope skyvCatalogFlag ] \ # -command [itcl::code $this configCatalog] # # pack .skyviewdlg.choices -pady 3 -padx 5 -anchor w # pack .skyviewdlg.choices.cat -anchor w -side top # frame .skyviewdlg.catalog -relief flat # listbox .skyviewdlg.catalog.list -exportselection 0 -takefocus 0 \ # -height 5 -width 50 -font g_titleFont -selectmode multiple \ # -yscrollcommand ".skyviewdlg.catalog.scroll set" # scrollbar .skyviewdlg.catalog.scroll \ # -command ".skyviewdlg.catalog.list yview" # pack .skyviewdlg.catalog -pady 3 -padx 5 -anchor w # pack .skyviewdlg.catalog.list -side left # pack .skyviewdlg.catalog.scroll -side right -fill y # configCatalog frame .skyviewdlg.plotchoice -relief flat checkbutton .skyviewdlg.plotchoice.plot \ -text "Display image after retrieving?" \ -font g_titleFont -anchor w -onvalue 1 -offvalue 0 \ -variable [itcl::scope skyvPlotFlag ] pack .skyviewdlg.plotchoice -pady 3 -padx 5 -anchor w pack .skyviewdlg.plotchoice.plot -anchor w -side top frame .skyviewdlg.skyviewbt -relief flat button .skyviewdlg.skyviewbt.submit -text Submit -width 8 \ -font g_titleFont \ -command [itcl::code $this skyviewOK] button .skyviewdlg.skyviewbt.reset -text Reset -width 8 \ -font g_titleFont \ -command [itcl::code $this skyviewReset] button .skyviewdlg.skyviewbt.cancel -text Close -width 8 \ -font g_titleFont \ -command {destroy .skyviewdlg} button .skyviewdlg.skyviewbt.help -text Help -width 8 \ -font g_titleFont \ -command {hhelp SkyView} pack .skyviewdlg.skyviewbt.submit -side left -padx 10 pack .skyviewdlg.skyviewbt.reset -side left -padx 10 pack .skyviewdlg.skyviewbt.cancel -side left -padx 10 pack .skyviewdlg.skyviewbt.help -side left -padx 10 pack .skyviewdlg.skyviewbt -side top -pady 5 -padx 5 -expand true bind .skyviewdlg [itcl::code $this skyviewOK] focus .skyviewdlg.coord.entry # tkwait window .skyviewdlg } itcl::body FVSkyview::configCatalog {} { if {$skyvCatalogFlag == 1} { foreach descLine $skyvCatalogDesc { .skyviewdlg.catalog.list insert end $descLine } } else { .skyviewdlg.catalog.list delete 0 end } } itcl::body FVSkyview::skyviewOK {} { global g_fitsFileMode global g_backupDir package require http if [info exist skyviewProcess ] { return } set skyviewProcess 1 # set skyviewfile [file join $g_backupDir skyview.tmp$skyvID] set skyviewfile [file join $g_backupDir skyview.tmp_[clock seconds]] if [file exists $skyviewfile] { file delete $skyviewfile } set skyvsurvey [lindex [lindex $skyvSurveyName [.skyviewdlg.survey.list curselection]] 1] if {$skyvCoord == "" } { tk_dialog .skverr "Skyview Error" \ "Source is not entered." error 0 Ok unset skyviewProcess return } set skyviewout [open $skyviewfile w] if { $_skyvImgSizeMinutes == "Default" } { set imgDegrees "Default" } else { set imgDegrees [expr $_skyvImgSizeMinutes * 0.0166667] } set skyvCoordSys [.skyviewdlg.coordsys.coord.sys get] set cmd [list ::http::formatQuery \ VCOORD $skyvCoord \ SURVEY $skyvsurvey \ SCOORD $skyvCoordSys \ SFACTR $imgDegrees \ PIXELX $skyvImgSizex \ PIXELY $skyvImgSizey ] if {$skyvCatalogFlag == 1} { set catalogs [.skyviewdlg.catalog.list curselection] set l [llength $catalogs] if {$l == 0} { tk_dialog .skverr "Skyview Error" \ "The catalogs are not selected." error 0 Ok unset skyviewProcess return } set catstr "" for {set i 0} {$i < $l} {incr i} { set j [lindex $catalogs $i] set skyvcatalog [.skyviewdlg.catalog.list get $j] lappend catstr CATLOG lappend catstr $skyvcatalog } set cmd [concat $cmd $catstr] } set skyviewqst [eval $cmd] .skyviewdlg.skyviewbt.submit configure -state disabled .skyviewdlg.skyviewbt.reset configure -state disabled .skyviewdlg.skyviewbt.cancel configure -state disabled #set token [::http::geturl "http://skyview.gsfc.nasa.gov/cgi-bin/pskcall" \ # -channel $skyviewout -query $skyviewqst ] set token [::http::geturl "http://skyview.gsfc.nasa.gov/cgi-bin/pskcall?$skyviewqst"] fconfigure $skyviewout -translation binary puts -nonewline $skyviewout [::http::data $token] close $skyviewout .skyviewdlg.skyviewbt.submit configure -state normal .skyviewdlg.skyviewbt.reset configure -state normal .skyviewdlg.skyviewbt.cancel configure -state normal set temptest [open $skyviewfile r ] set line [read $temptest 6] close $temptest if {$line != "SIMPLE" } { set temptest [open $skyviewfile r ] set errstr "" set errorflag 0 while {[gets $temptest line] >= 0} { if [regexp {^

} $line] { set errorflag 0 } if [regexp {^ERROR:} $line] { set errorflag 1 } if {$errorflag == 1} { set errstr "${errstr}${line}" } } close $temptest if {$errstr == ""} { tk_dialog .skvmsg "Skyview Message" \ "No image available at this sky position in the selected survey." \ info 0 Ok unset skyviewProcess return } tk_dialog .skverr "Skyview Error" \ $errstr error 0 Ok unset skyviewProcess return } set tmp [fits open $skyviewfile 0] set hdunum [$tmp info nhdu] $tmp close set oldMode $g_fitsFileMode # Set Read-Only flag set g_fitsFileMode 1 set previousIfAutoPlotPrimary $fvPref::ifAutoPlotPrimary if { $previousIfAutoPlotPrimary == 0 } { if { $skyvPlotFlag == 1} { set fvPref::ifAutoPlotPrimary 1 } } set tmp [openFitsFile $skyviewfile] if { $skyvCatalogFlag == 1} { if { $hdunum == 2} { fvCmds::display curve 1 RA {} DEC {} 1 } if {$hdunum < 1 } { tk_dialog .skvmsg "Skyview Message" \ "No desired objects are found in the selected catalog(s)" \ info 0 Ok } } set g_fitsFileMode 1 catch { $tmp changeFile } err unset skyviewProcess set fvPref::ifAutoPlotPrimary $previousIfAutoPlotPrimary } itcl::body FVSkyview::skyviewReset {} { set skyvCoord "" set skyvCoordSys "Equatorial" set skyvEquinox "2000" set _skyvImgSizeMinutes "Default" set skyvImgSizex "300" set skyvImgSizey "300" set skyvCatalogFlag 0 set skyvPlotFlag 1 .skyviewdlg.survey.list selection clear 0 end .skyviewdlg.survey.list selection set 0 # put configCatalog under itcl::code space set result [itcl::code $this configCatalog] } itcl::body FVSkyview::getskyvcat {} { global g_titleFont if ![info exist skyvcatID] { set skyvcatID 1 } if ![info exist catEquinox ] { set catEquinox "2000" } if ![info exist catOverlagFlag ] { set catOverlayFlag 0 } if [winfo exist .skyvcatdlg] { focus .skyvcatdlg raise .skyvcatdlg return } toplevel .skyvcatdlg -class Dialog wm title .skyvcatdlg "fv: Catalog" label .skyvcatdlg.title -anchor w \ -text "Retrieve catalog of objects from NASA's SkyView site." \ -font g_titleFont pack .skyvcatdlg.title -pady 3 -padx 5 -anchor w frame .skyvcatdlg.coord -relief flat label .skyvcatdlg.coord.label -text "Coordinate or Source:" \ -font g_titleFont -anchor w entry .skyvcatdlg.coord.entry -width 40 \ -textvariable [itcl::scope catCoord] -relief sunken -font g_titleFont pack .skyvcatdlg.coord -pady 5 -padx 5 -anchor w pack .skyvcatdlg.coord.label .skyvcatdlg.coord.entry -side left frame .skyvcatdlg.note -relief flat label .skyvcatdlg.note.label -text \ "(e.g. \"Eta Carinae\", \"10 45 3.6, -59 41 4.2\", or \"161.265, -59.685\")" \ -font g_titleFont -anchor w pack .skyvcatdlg.note -pady 5 -padx 5 -anchor w pack .skyvcatdlg.note.label -side left frame .skyvcatdlg.radius -relief flat label .skyvcatdlg.radius.label -text "Search radius (minutes):" \ -font g_titleFont -anchor w entry .skyvcatdlg.radius.entry -width 10 \ -textvariable [itcl::scope _catImgSizeMinutes] -relief sunken -font g_titleFont pack .skyvcatdlg.radius -pady 5 -padx 5 -anchor w pack .skyvcatdlg.radius.label .skyvcatdlg.radius.entry \ -side left -anchor w frame .skyvcatdlg.catalogtext -relief flat label .skyvcatdlg.catalogtext.label -text "Choose desired catalog(s)" \ -font g_titleFont -anchor w pack .skyvcatdlg.catalogtext -pady 5 -padx 5 -anchor w pack .skyvcatdlg.catalogtext.label -anchor w -side top frame .skyvcatdlg.catalog -relief flat listbox .skyvcatdlg.catalog.list -exportselection 0 -takefocus 0 \ -height 5 -width 50 -font g_titleFont -selectmode multiple \ -yscrollcommand ".skyvcatdlg.catalog.scroll set" scrollbar .skyvcatdlg.catalog.scroll \ -command ".skyvcatdlg.catalog.list yview" foreach descLine $skyvCatalogDesc { .skyvcatdlg.catalog.list insert end $descLine } # .skyvcatdlg.catalog.list selection set 0 pack .skyvcatdlg.catalog -pady 5 -padx 5 -anchor w pack .skyvcatdlg.catalog.list -side left pack .skyvcatdlg.catalog.scroll -side right -fill y frame .skyvcatdlg.coordsys -relief flat frame .skyvcatdlg.coordsys.coord -relief flat label .skyvcatdlg.coordsys.coord.label -text "Cooridinate System:" \ -font g_titleFont -anchor w radiobutton .skyvcatdlg.coordsys.coord.equatorial -text "Equatorial" \ -font g_titleFont -variable [itcl::scope catCoordSys] -value "Equatorial" radiobutton .skyvcatdlg.coordsys.coord.galactic -text "Galactic" \ -font g_titleFont -variable [itcl::scope catCoordSys] -value "Galactic" radiobutton .skyvcatdlg.coordsys.coord.ecliptic -text "Ecliptic" \ -font g_titleFont -variable [itcl::scope catCoordSys] -value "Ecliptic" .skyvcatdlg.coordsys.coord.equatorial select pack .skyvcatdlg.coordsys.coord.label -anchor w -side top pack .skyvcatdlg.coordsys.coord.equatorial -anchor w -side top pack .skyvcatdlg.coordsys.coord.galactic -anchor w -side top pack .skyvcatdlg.coordsys.coord.ecliptic -anchor w -side top frame .skyvcatdlg.coordsys.options -relief flat label .skyvcatdlg.coordsys.options.label -text "Equinox:" \ -font g_titleFont -anchor w entry .skyvcatdlg.coordsys.options.entry -width 10 \ -textvariable [itcl::scope catEquinox] -relief sunken -font g_titleFont checkbutton .skyvcatdlg.coordsys.options.checkbox \ -text "Plot on the current graph? " \ -font g_titleFont -anchor w -onvalue 1 -offvalue 0 \ -variable [itcl::scope catOverlayFlag ] pack .skyvcatdlg.coordsys.options.label -anchor w -side top pack .skyvcatdlg.coordsys.options.entry -anchor w -side top pack .skyvcatdlg.coordsys.options.checkbox -anchor w -side bottom pack .skyvcatdlg.coordsys.coord -pady 5 -padx 5 -anchor w -side left pack .skyvcatdlg.coordsys.options -pady 5 -padx 5 -anchor n -side left \ -fill y pack .skyvcatdlg.coordsys -pady 5 -padx 5 -anchor w frame .skyvcatdlg.skyvcatbt -relief flat button .skyvcatdlg.skyvcatbt.submit -text Submit -width 8 \ -font g_titleFont \ -command [itcl::code $this catOK ] button .skyvcatdlg.skyvcatbt.reset -text Reset -width 8 \ -font g_titleFont \ -command [itcl::code $this catReset ] button .skyvcatdlg.skyvcatbt.cancel -text Close -width 8 \ -font g_titleFont \ -command {destroy .skyvcatdlg} button .skyvcatdlg.skyvcatbt.help -text Help -width 8 \ -font g_titleFont \ -command {hhelp catalog} pack .skyvcatdlg.skyvcatbt.submit -side left -padx 10 pack .skyvcatdlg.skyvcatbt.reset -side left -padx 10 pack .skyvcatdlg.skyvcatbt.cancel -side left -padx 10 pack .skyvcatdlg.skyvcatbt.help -side left -padx 10 pack .skyvcatdlg.skyvcatbt -side top -pady 5 -padx 5 -expand true bind .skyvcatdlg.coord.entry \ {focus .skyvcatdlg.radius.entry } bind .skyvcatdlg.radius.entry [itcl::code $this catOK] focus .skyvcatdlg.coord.entry # tkwait window .skyvcatdlg } itcl::body FVSkyview::catOK {} { global g_fitsFileMode global g_backupDir package require http if [info exist catProcess ] { return } set catProcess 1 set skyvcatfile [file join $g_backupDir skyvcat.tmp_[clock seconds]] if [file exists $skyvcatfile] { file delete $skyvcatfile } set skyvcatout [open $skyvcatfile w] set skyvcattemp "" if {$catCoord == "" } { tk_dialog .skverr "Catalog Error" \ "Source is not entered." error 0 Ok unset catProcess return } if {$_catImgSizeMinutes == ""} { set _catImgSizeMinutes "default" } # set catDegrees [expr $_catImgSizeMinutes * 0.0166667] set catDegrees $_catImgSizeMinutes set catalogs [.skyvcatdlg.catalog.list curselection] set l [llength $catalogs] if {$l == 0} { tk_dialog .skverr "Catalog Error" \ "The catalogs are not selected." error 0 Ok unset catProcess return } # Entry set skyvcatqst [format "%s=%s&" Entry [_encodeString $catCoord]] # Coordinates set skyvcatqst [format "%s%s=%s&" $skyvcatqst Coordinates $catCoordSys] # Equinox set skyvcatqst [format "%s%s=%s&" $skyvcatqst Equinox $catEquinox] # Radius set skyvcatqst [format "%s%s=%s&" $skyvcatqst Radius $catDegrees] # ResultMax set skyvcatqst [format "%s%s=%s&" $skyvcatqst ResultMax 0] # Displaymode set skyvcatqst [format "%s%s=%s&" $skyvcatqst displaymode FitsDisplay] # tablehead foreach i $catalogs { set skyvcatqst [format "%s%s=%s3D%s&" $skyvcatqst tablehead \ "name%" [_encodeString [lindex $skyvCatalogTableName $i]] ] } .skyvcatdlg.skyvcatbt.submit configure -state disabled .skyvcatdlg.skyvcatbt.reset configure -state disabled .skyvcatdlg.skyvcatbt.cancel configure -state disabled #set token [::http::geturl "http://heasarc.gsfc.nasa.gov/cgi-bin/W3Browse/w3query.pl" \ # -channel $skyvcatout -query $skyvcatqst ] set token [::http::geturl "http://heasarc.gsfc.nasa.gov/cgi-bin/W3Browse/w3query.pl?$skyvcatqst"] fconfigure $skyvcatout -translation binary puts -nonewline $skyvcatout [::http::data $token] close $skyvcatout .skyvcatdlg.skyvcatbt.submit configure -state normal .skyvcatdlg.skyvcatbt.reset configure -state normal .skyvcatdlg.skyvcatbt.cancel configure -state normal set temptest [open $skyvcatfile r ] set line [read $temptest 6] close $temptest if {$line != "SIMPLE" } { set temptest [open $skyvcatfile r ] set errstr "" set errorflag 0 while {[gets $temptest line] >= 0} { if [regexp {^

} $line] { set errorflag 0 } if [regexp {^ERROR:} $line] { set errorflag 1 } if {$errorflag == 1} { set errstr "${errstr}${line}" } } close $temptest if {$errstr == ""} { tk_dialog .skvmsg "Catalog Message" \ "No desired objects are found in selected catalog(s)" \ info 0 Ok unset catProcess return } tk_dialog .skverr "Catalog Error" \ $errstr error 0 Ok unset catProcess return } set oldMode $g_fitsFileMode set tmp [fits open $skyvcatfile 0] set hdunum [$tmp info nhdu] $tmp close # Set Read-Only flag set g_fitsFileMode 1 set tmp [openFitsFile $skyvcatfile] $tmp changeFile set g_fitsFileMode $oldMode incr skyvcatID # Plot on the current graph if { $catOverlayFlag == 1} { # fvCmds::select $skyvcatfile if { $hdunum >= 2} { #$tmp plotData1 2 set errorFlag [ catch { fvCmds::display curve 1 RAJ2000_ {} DEJ2000_ {} 2 } err ] if { $errorFlag } { set errorFlag [ catch { fvCmds::display curve 1 RA {} DEC {} 2 } err ] } if { $errorFlag } { tk_messageBox -icon error -type ok \ -message "Keyword RAJ2000_, DEJ2000_, RA, and DEC do not exists.\nPlease choose columns to plot." $tmp plotData1 2 } set g_fitsFileMode 1 } } unset catProcess } itcl::body FVSkyview::catReset {} { set catCoord "" set _catImgSizeMinutes "" set catEquinox "2000" set catOverlayFlag 0 .skyvcatdlg.catalog.list selection clear 0 end } itcl::body FVSkyview::_encodeString { coord } { regsub -all {,} $coord {;} coord regsub -all {"} $coord {} coord set token [split $coord ";"] set coord "" for {set i 0} {$i < [llength $token]} {incr i} { if { $i > 0 } { set coord [format "%s;" $coord] } set coord [format "%s%s" $coord [string trim [lindex $token $i]]] } # What this function does is hex encode any char that isn't a-z, A-Z, 0-9, an # underscore, a period, or a dash. # the following regsub is to mask all the character that fits the above description # anything else left will be the one to encode set totalMasked 0 set totalMasked [expr $totalMasked + [regsub -all {[a-z]} $coord {#} result]] set totalMasked [expr $totalMasked + [regsub -all {[A-Z]} $result {#} result]] set totalMasked [expr $totalMasked + [regsub -all {[0-9]} $result {#} result]] set totalMasked [expr $totalMasked + [regsub -all {_} $result {#} result]] set totalMasked [expr $totalMasked + [regsub -all {\.} $result {#} result]] set totalMasked [expr $totalMasked + [regsub -all {\-} $result {#} result]] if { $totalMasked == [string length $coord] } { # no encoding need return $coord } set newValue "" for {set i 0} {$i < [string length $coord]} {incr i} { set currentChar [string range $coord $i $i] set matchChar [string range $result $i $i] if { $matchChar != "#" && $matchChar != ";"} { binary scan $currentChar c value set newValue [format "%s%%%x" $newValue $value] } else { set newValue [format "%s%s" $newValue $currentChar] } } return $newValue } fv5.4/ftools/guis/fv/class/FVVizier.tcl0000644000220700001010000004361612564650740017434 0ustar birbylheadevitcl::class FVVizier { constructor {args} {} destructor {} public method selectVizier {} private method _fetchVizier {} # temporary defaults for testing this search out private variable _catalogID "" private variable _coneCenter "" private variable _searchRadius 10 private variable _maxRows 1000 private variable _selectionBoxID 2 private variable _mirrorBoxID 0 private variable _vizierFileID 0 } itcl::body FVVizier::constructor {args} { set _vizierFileID 0 } itcl::body FVVizier::destructor {} { } itcl::body FVVizier::selectVizier {} { if [winfo exist .vizier] { focus .vizier raise .vizier return } global g_titleFont toplevel .vizier -class Dialog wm title .vizier "fv: VizieR" label .vizier.title -anchor w \ -text "Retrieve a table from VizieR." -font g_titleFont pack .vizier.title -pady 3 -padx 5 -anchor w # a frame with catalog on the left, mirror sites on the right # cm = catmirror frame .vizier.cm -relief flat iwidgets::entryfield .vizier.cm.catalog -labeltext "Catalog ID:" \ -width 17 \ -labelfont g_titleFont \ -textfont g_titleFont \ -textvariable [itcl::scope _catalogID] frame .vizier.cm.mirror -relief flat frame .vizier.cm.mirror.text -relief flat label .vizier.cm.mirror.text.label -text "Choose mirror site:" \ -font g_titleFont -anchor w pack .vizier.cm.mirror.text.label -anchor w -side top frame .vizier.cm.mirror.sites -relief flat listbox .vizier.cm.mirror.sites.list -exportselection 0 -takefocus 0 \ -height 8 -width 25 -font g_titleFont .vizier.cm.mirror.sites.list insert end "CDS (Strasbourg, France)" .vizier.cm.mirror.sites.list insert end "CfA (Harvard, USA)" .vizier.cm.mirror.sites.list insert end "ADAC (Tokyo, Japan)" .vizier.cm.mirror.sites.list insert end "CADC (Canada)" .vizier.cm.mirror.sites.list insert end "Cambridge (UK)" .vizier.cm.mirror.sites.list insert end "IUCAA (Pune, India)" .vizier.cm.mirror.sites.list insert end "Bejing (Bejing, China)" .vizier.cm.mirror.sites.list insert end "UKIRT (Hawaii, USA)" .vizier.cm.mirror.sites.list selection set $_mirrorBoxID pack .vizier.cm.mirror.sites.list -side left -padx 2 pack .vizier.cm.mirror.text -anchor n -side left pack .vizier.cm.mirror.sites -anchor n -side left pack .vizier.cm.catalog -anchor n -side left pack .vizier.cm.mirror -anchor n -side right -padx 7 pack .vizier.cm -pady 3 -padx 5 -anchor w frame .vizier.surveytext -relief flat label .vizier.surveytext.label -text "Or choose desired catalog:" \ -font g_titleFont -anchor w pack .vizier.surveytext -padx 5 -anchor w pack .vizier.surveytext.label -anchor w -side top frame .vizier.survey -relief flat listbox .vizier.survey.list -exportselection 0 -takefocus 0 \ -height 7 -width 70 -font g_titleFont \ -yscrollcommand ".vizier.survey.scroll set" scrollbar .vizier.survey.scroll \ -command ".vizier.survey.list yview" .vizier.survey.list insert end "Mega Catalogues" .vizier.survey.list insert end "" .vizier.survey.list insert end "(I/239) The Hipparcos and Tycho Catalogues (ESA 1997)" .vizier.survey.list insert end "(I/196) Hipparcos Input Catalogue, Version 2 (Turon+ 1993)" .vizier.survey.list insert end "(I/259) The Tycho-2 Catalogue (Hog+ 2000)" .vizier.survey.list insert end "(I/250) The Tycho Reference Catalogue (Hog+ 1998)" .vizier.survey.list insert end "(I/197A) Tycho Input Catalogue, Revised version (Egret+ 1992)" .vizier.survey.list insert end "(I/207) Preliminary list from Tycho observations (TIC data) (Halbwachs+ 1994)" .vizier.survey.list insert end "(I/247) The AC2000 Catalogue (Urban+ 1997)" .vizier.survey.list insert end "(I/246) The ACT Reference Catalog (Urban+ 1997)" .vizier.survey.list insert end "(I/252) The USNO-A2.0 Catalogue (Monet+ 1998)" .vizier.survey.list insert end "(I/243) The PMM USNO-A1.0 Catalogue (Monet 1997)" .vizier.survey.list insert end "(I/271) The GSC 2.2 Catalogue (STScl, 2001)" .vizier.survey.list insert end "(I/284) The USNO-B1.0 Catalog (Monet+ 2003)" .vizier.survey.list insert end "(I/289) The USNO 2nd CCD Astrograph Catalogue (Zacharias+ 2003)" .vizier.survey.list insert end "(B/denis) The DENIS database (DENIS Consortium, 1998)" .vizier.survey.list insert end "(J/A+AS/135/133) First DENIS I-band extragalactic catalog (Vauglin+ 1999)" .vizier.survey.list insert end "(II/228A) DENIS Catalogue toward Magellanic Clouds (DCMC) (Cioni+ 2000)" .vizier.survey.list insert end "(II/246) 2MASS All-Sky Catalog of Point Sources (Cutri+ 2003)" .vizier.survey.list insert end "(I/255) The HST Guide Star Catalog, Version GSC-ACT (Lasker+ 1996-99)" .vizier.survey.list insert end "(I/254) The HST Guide Star Catalog, Version 1.2 (Lasker+ 1996)" #.vizier.survey.list insert end "(I/220) The HST Guide Star Catalog, Version 1.1 (Lasker+ 1992)" .vizier.survey.list insert end "(B/2mass) The 2MASS database (IPAC/UMass, 2000)" .vizier.survey.list insert end "" .vizier.survey.list insert end "Galaxies and QSOs" .vizier.survey.list insert end "" .vizier.survey.list insert end "(VII/155) Third Reference Cat. of Bright Galaxies (RC3) (de Vaucouleurs+ 1991)" .vizier.survey.list insert end "(VII/16) Reference Catalogue of Bright Galaxies (RC1; de Vaucouleurs+ 1964)" .vizier.survey.list insert end "(VII/119) Catalogue of Principal Galaxies (PGC) (Paturel+ 1989)" .vizier.survey.list insert end "(VII/26D) Uppsala General Catalogue of Galaxies (UGC) (Nilson 1973)" .vizier.survey.list insert end "(VII/145) Nearby Galaxies Catalogue (NBG) (Tully 1988)" .vizier.survey.list insert end "(VII/157) The Extended 12um galaxy sample (Rush+ 1993)" .vizier.survey.list insert end "(VII/4A) Abell and Zwicky Clusters of Galaxies (Abell+ 1974)" .vizier.survey.list insert end "(VII/118) NGC 2000.0 (Sky Publishing, ed. Sinnott 1988)" .vizier.survey.list insert end "(VII/1B) Revised New General Catalogue (Sulentic+, 1973)" .vizier.survey.list insert end "(VII/224) Quasars and Active Galactic Nuclei (10th Ed.) (Veron+ 2001)" .vizier.survey.list insert end "(VII/173) Catalogue of Seyfert Galaxies (Lipovetsky+, 1988)" .vizier.survey.list insert end "(J/A+A/335/912) Seyferts in galaxy pairs and groups (Kelm+ 1998)" .vizier.survey.list insert end "(J/AJ/114/2353) AGNs and QSOs behind nearby galaxies (Crampton+, 1997)" .vizier.survey.list insert end "(J/A+AS/139/575) RASS AGN sample (Wei+, 1999)" .vizier.survey.list insert end "(J/A+AS/133/171) The Marseille Schmidt survey I. (Surace+ 1998)" .vizier.survey.list insert end "" .vizier.survey.list insert end "Stars" .vizier.survey.list insert end "" .vizier.survey.list insert end "(I/131A) SAO Star Catalog J2000 (SAO Staff 1966; USNO, ADC 1990)" .vizier.survey.list insert end "(V/102) SKY2000 - Master Star Catalog, Version 2 (Sande+ 1998)" .vizier.survey.list insert end "(V/50) Bright Star Catalogue, 5th Revised Ed. (Hoffleit+, 1991)" .vizier.survey.list insert end "(V/70A) Nearby Stars, Preliminary 3rd Version (Gliese+ 1991)" .vizier.survey.list insert end "(III/135A) Henry Draper Catalogue and Extension (Cannon+ 1918-1924; ADC 1989)" .vizier.survey.list insert end "(I/122) Bonner Durchmusterung (Argelander 1859-62)" .vizier.survey.list insert end "(I/108) Cape Photographic Durchmusterung (Gill+ 1895-1900)" .vizier.survey.list insert end "(I/114) Cordoba Durchmusterung (Thome 1892-1932)" .vizier.survey.list insert end "(III/190B) WEB Catalog of Radial Velocities (Duflot+ 1995)" .vizier.survey.list insert end "(III/213) General Catalog of mean radial velocities (Barbier-Brossat+, 2000)" .vizier.survey.list insert end "(III/184) 3rd Bibliog. Cat. of Stellar Radial Vel. (Barbier-Brossat+, 1994)" .vizier.survey.list insert end "(III/191) Radial Velocities of Nearby Stars (Tokovinin, 1992)" .vizier.survey.list insert end "(II/214A) Combined General Catalogue of Variable Stars (Kholopov+ 1998)" .vizier.survey.list insert end "(II/139B) General Catalog of Variable Stars, 4th Ed. (GCVS4) (Kholopov+ 1988)" .vizier.survey.list insert end "(II/219) New Catalogue of Suspected Variable Stars Supplement (Kazarovets+ 1998)" .vizier.survey.list insert end "(I/238) Yale Trigonometric Parallaxes, Fourth Edition (van Altena+ 1995)" .vizier.survey.list insert end "(I/146) Positions and Proper Motions - North (Roeser+, 1988)" .vizier.survey.list insert end "(I/79) Lowell Proper Motion Survey 8991 Northern Stars (Giclas 1971)" .vizier.survey.list insert end "(I/112) Lowell Proper Motion Survey - Southern Hemisphere (Giclas+ 1978)" .vizier.survey.list insert end "(I/193) Positions and Proper Motions - South (Bastian+ 1993)" .vizier.survey.list insert end "(I/98A) NLTT Catalogue (Luyten, 1979)" .vizier.survey.list insert end "(I/87B) LHS Catalogue, 2nd Edition (Luyten 1979)" .vizier.survey.list insert end "(II/226) Stellar polarization catalogs agglomeration (Heiles, 2000)" .vizier.survey.list insert end "(II/215) uvby-beta Catalogue (Hauck+ 1997)" .vizier.survey.list insert end "(III/42) Selected MK Spectral Types (Jaschek, 1978)" .vizier.survey.list insert end "(III/198) Palomar/MSU nearby star spectroscopic survey (Hawley+ 1997)" .vizier.survey.list insert end "(I/237) The Washington Visual Double Star Catalog, 1996.0 (Worley+, 1996)" .vizier.survey.list insert end "(V/76) Chromospherically Active Binaries (Strassmeier+ 1993)" .vizier.survey.list insert end "(J/A+AS/124/75) Multiple star catalogue (MSC) (Tokovinin 1997-1999)" .vizier.survey.list insert end "(I/211) CCDM (Components of Double and Multiple stars) (Dommanget+ 1994)" .vizier.survey.list insert end "(III/49) White Dwarf Catalogue (Luyten 1970)" .vizier.survey.list insert end "(V/99) Cataclysmic Binaries and LMXB Catalogue (Ritter+ 1998)" .vizier.survey.list insert end "(VII/92A) Open Cluster Data 5th Edition (Lynga 1987)" .vizier.survey.list insert end "(V/84) Strasbourg-ESO Catalogue of Galactic Planetary Nebulae (Acker+, 1992)" .vizier.survey.list insert end "" .vizier.survey.list insert end "X-Ray Surveys" .vizier.survey.list insert end "" .vizier.survey.list insert end "(IX/10A) ROSAT All-Sky Bright Source Catalogue (1RXS) (Voges+ 1999)" .vizier.survey.list insert end "(IX/29) ROSAT All-Sky Survey Faint Source Catalog (Voges+ 2000)" .vizier.survey.list insert end "(IX/30) Second ROSAT PSPC Catalog (ROSAT, 2000)" .vizier.survey.list insert end "(IX/31) The WGACAT version of ROSAT sources (White+ 2000)" .vizier.survey.list insert end "" .vizier.survey.list insert end "IR Surveys" .vizier.survey.list insert end "" .vizier.survey.list insert end "(II/125) IRAS catalogue of Point Sources, Version 2.0 (IPAC 1986)" .vizier.survey.list insert end "(II/156A) IRAS Faint Source Catalog, |b| > 10, Version 2.0 (Moshir+ 1989)" .vizier.survey.list insert end "(II/126) IRAS Serendipitous Survey Catalog (IPAC 1986)" .vizier.survey.list insert end "(III/197) IRAS Low Resolution Spectra (IRAS team, 1987)" .vizier.survey.list insert end "(II/225) Catalog of Infrared Observations, Edition 5 (Gezari+ 1999)" .vizier.survey.list insert end "(V/98) MSX Infrared Astrometric Catalog (Egan+ 1996)" .vizier.survey.list insert end "" .vizier.survey.list insert end "Radio Surveys" .vizier.survey.list insert end "" .vizier.survey.list insert end "(J/ApJS/105/369) Galactic H I column densities (Murphy+ 1996)" .vizier.survey.list insert end "(VIII/37) The Third Bologna Survey (B3) (Ficarra+ 1985)" .vizier.survey.list insert end "(VIII/36) The Second Bologna Survey (Colla+ 1970-1974)" .vizier.survey.list insert end "(VIII/5) Bright Extragalactic Radio Sources (1Jy) (Kuehr+, 1981)" .vizier.survey.list insert end "(VIII/15) Parkes Radio Sources Catalogue (PKSCAT90) (Wright+ 1990)" .vizier.survey.list insert end "(VIII/40) GB6 catalog of radio sources (Gregory+ 1996)" .vizier.survey.list insert end "(VIII/42) Texas Survey of radio sources at 365MHz (Douglas+ 1996)" .vizier.survey.list insert end "(VIII/14) 87GB Catalog of radio sources (Gregory et al., 1991)" .vizier.survey.list insert end "(VIII/38) The Parkes-MIT-NRAO 4.85GHz (PMN) Surveys (Griffith+ 1993-1996)" .vizier.survey.list insert end "(III/175) Optical spectroscopy of radio sources (Stickel+, 1989-94)" .vizier.survey.list insert end "" .vizier.survey.list insert end "Misc." .vizier.survey.list insert end "" .vizier.survey.list insert end "(VI/90) Wide-Field Plate Database (Tsvetkov+ 1997)" .vizier.survey.list insert end "(B/hst) HST Archived Exposures Catalog (STScI, 2001)" .vizier.survey.list selection set $_selectionBoxID pack .vizier.survey -pady 5 -padx 5 -fill both -expand 1 pack .vizier.survey.list -side left -fill both -expand 1 pack .vizier.survey.scroll -side right -fill y iwidgets::entryfield .vizier.conecenter \ -labeltext "Cone center (name or coordinates, e.g., 3c273):" \ -labelfont g_titleFont -textfont g_titleFont \ -textvariable [itcl::scope _coneCenter] pack .vizier.conecenter -pady 3 -padx 5 -anchor w -fill x iwidgets::entryfield .vizier.searchradius \ -labeltext "Search radius (minutes):" \ -labelfont g_titleFont -textfont g_titleFont \ -textvariable [itcl::scope _searchRadius] pack .vizier.searchradius -pady 3 -padx 5 -anchor w -fill x iwidgets::entryfield .vizier.maxrows \ -labeltext "Maximum number of rows:" \ -labelfont g_titleFont -textfont g_titleFont \ -textvariable [itcl::scope _maxRows] pack .vizier.maxrows -pady 3 -padx 5 -anchor w -fill x # iwidgets::buttonbox .vizier.bbox # .vizier.bbox add submit -text "Submit" -command [itcl::code $this _fetchVizier] # .vizier.bbox add cancel -text "Cancel" -command "destroy .vizier" # pack .vizier.bbox -pady 5 -padx 5 -anchor w button .vizier.submit -text "Submit" -command [itcl::code $this _fetchVizier] -font g_titleFont button .vizier.cancel -text "Cancel" -command "destroy .vizier" -font g_titleFont button .vizier.help -text "Help" -command "hhelp VizieR" -font g_titleFont pack .vizier.submit -pady 5 -padx 5 -side left pack .vizier.cancel -pady 5 -padx 5 -side left pack .vizier.help -pady 5 -padx 5 -side left # tkwait window .vizier } itcl::body FVVizier::_fetchVizier {} { global g_backupDir global g_fitsFileMode if { $_coneCenter == "" } { error "Please enter cone center" return } if { $_searchRadius == "" } { error "Please enter search radius" return } if { $_maxRows == "" } { error "Please enter maximun rows" return } # set sugName "vizier.tmp$_vizierFileID" set vizierFileName [file join $g_backupDir vizier.tmp_[clock seconds]] # get VizieR catalog set i [.vizier.survey.list curselection] set vizierSelect [.vizier.survey.list get $i ] # remember selection next time VizieR window is displayed set _selectionBoxID $i if { $_catalogID == "" } { # set catalogID regsub {\).*} $vizierSelect "" vizierSelect regsub {\(} $vizierSelect "" vizierSelect set catalogID $vizierSelect } else { set catalogID $_catalogID } # get VizieR mirror site set j [.vizier.cm.mirror.sites.list curselection] set vizierMirror [.vizier.cm.mirror.sites.list get $j ] # remember selection next time VizieR window is displayed set _mirrorBoxID $j switch $vizierMirror { "CDS (Strasbourg, France)" { set vizierURL "http://vizier.u-strasbg.fr/cgi-bin/asu-fits" } "CfA (Harvard, USA)" { # set vizierURL "http://adc.gsfc.nasa.gov/viz-bin/asu-fits" set vizierURL "http://vizier.cfa.harvard.edu/viz-bin/asu-fits" } "ADAC (Tokyo, Japan)" { set vizierURL "http://vizier.nao.ac.jp/viz-bin/asu-fits" } "CADC (Canada)" { set vizierURL "vizier.hia.nrc.ca/viz-bin/asu-fits" } "Cambridge (UK)" { set vizierURL "http://archive.ast.cam.ac.uk/viz-bin/asu-fits" } "IUCAA (Pune, India)" { set vizierURL "http://urania.iucaa.ernet.in/viz-bin/asu-fits" } "Bejing (Bejing, China)" { set vizierURL "http://data.bao.ac.cn/viz-bin/asu-fits" } "UKIRT (Hawaii, USA)" { set vizierURL "http://www.ukirt.jach.hawaii.edu/viz-bin/asu-fits" } } # replace " " with "+" in _coneCenter regsub -all {[, ]} $_coneCenter {%20} coneCenter .vizier.submit configure -state disabled .vizier.cancel configure -state disabled if { ![catch {set urlVizier "$vizierURL?-source=$catalogID&-c=$coneCenter&-c.rm=$_searchRadius&-out.all&-out.max=$_maxRows&-out.add=RAJ2000,DEJ2000&-oc.form=dec"}] } { set vizierFile [open $vizierFileName w] #package require http 2.3 package require http # catch { set token [::http::geturl $urlVizier -channel $vizierFile] } err catch { set token [::http::geturl $urlVizier] } err fconfigure $vizierFile -translation binary puts -nonewline $vizierFile [::http::data $token] close $vizierFile } else { error "Could not retrieve VizieR file. Please recheck your search or contact VizieR." } .vizier.submit configure -state normal .vizier.cancel configure -state normal # open up Vizier file for viewing if { [catch {set tmp [openFitsFile $vizierFileName]}] } { tk_messageBox -icon warning -type ok \ -message "No matching record found within search radius." # error "The VizieR file has invalid format. There was probably a mistake in your search entry. Please recheck your search or contact VizieR." } else { set oldMode $g_fitsFileMode # Set Read-Only flag set g_fitsFileMode 1 $tmp changeFile set g_fitsFileMode $oldMode # only when file is successfully closed and saved, do we increment incr _vizierFileID } } fv5.4/ftools/guis/fv/class/FitsBaseCalculator.tcl0000644000220700001010000003071511214543217021425 0ustar birbylheadevoption add *FitsFileselectionbox.font "Helvetica 12 bold" itcl::class FitsBaseCalculator { inherit itk::Toplevel constructor {theFather theCols} {} destructor {} protected common resultFormula protected common resultColumn protected common resultForm protected variable numColBut protected variable numPage protected variable curPage 0 protected variable _father protected variable _colNameList # Ziqin Pan Feb 18, 2004 # Add variables to support row selection protected variable _calcselonly protected variable _calcselor protected variable _calcseland protected method addOrCheckButton {} # protected method addBut {element isCol} protected method butPage {page} protected method _pageUp {} protected method _pageDown {} protected method setResult {} protected method validation {} protected method init {} protected method _calculateCmd {} public method refresh {} } itcl::body FitsBaseCalculator::constructor {theFather theCols} { set _colNameList $theCols set _father $theFather init $_father addChild $this } itcl::body FitsBaseCalculator::destructor {} { $_father freeChild $this } itcl::body FitsBaseCalculator::init {} { global g_titleFont option add *FitsBaseCalculator.font g_titleFont # frame layout itk_component add outputFrame { frame $itk_interior.f1 } itk_component add sep1 { frame $itk_interior.s1 -height 4 -relief raised -bd 2 } itk_component add uslButFrame { frame $itk_interior.f2 } itk_component add sep2 { frame $itk_interior.s2 -width 4 -relief raised -bd 2 } itk_component add sep3 { frame $itk_interior.s3 -width 4 -relief raised -bd 2 } itk_component add colButFrame { frame $itk_interior.f3 } itk_component add pageFrame { frame $itk_interior.f4 } itk_component add pageButFrame { frame $itk_interior.f5 } grid configure $itk_component(outputFrame) -column 0 -row 0 \ -columnspan 5 -sticky "snew" grid configure $itk_component(sep1) -column 0 -row 1 \ -columnspan 5 -sticky "snew" grid configure $itk_component(uslButFrame) -column 0 -row 2 \ -sticky "snew" -rowspan 2 grid configure $itk_component(sep2) -column 1 -row 2 \ -sticky "snw" -rowspan 2 grid configure $itk_component(colButFrame) -column 2 -row 2 \ -sticky "snew" grid configure $itk_component(pageButFrame) -column 2 -row 3 \ -sticky "swe" grid configure $itk_component(sep3) -column 3 -row 2 \ -sticky "sne" -rowspan 2 grid configure $itk_component(pageFrame) -column 4 -row 2 \ -sticky "snew" -rowspan 2 # the entry field set itk_interior $itk_component(outputFrame) # for different purposes(Add column and Delete rows) setResult is different setResult itk_component add eqSign { label $itk_interior.eqSign -text "=" -font g_titleFont } itk_component add result { entry $itk_interior.result -textvariable [itcl::scope resultFormula($this)] \ -width 50 -font g_titleFont } grid configure $itk_component(resultCol) -in $itk_component(outputFrame) \ -column 0 -row 0 grid configure $itk_component(eqSign) -in $itk_component(outputFrame) \ -column 1 -row 0 grid configure $itk_component(result) -in $itk_component(outputFrame) \ -column 2 -row 0 -sticky "snew" # the button field set itk_interior $itk_component(uslButFrame) set uslButList [list sin cos tan "log e" exp \ asin acos atan log10 sqrt \ "<" "==" ">" rgn gti \ && || "(" ")" "^" \ PI 7 8 9 "/" \ e 4 5 6 "*" \ EE 1 2 3 "-" \ CL 0 "." #ROW "+" ] set i 0 foreach elem $uslButList { itk_component add uslBut$i { button $itk_interior.b$i -text $elem -padx 3 -pady 2 \ -command [itcl::code $this addBut $elem 0] -font g_titleFont } set col [expr $i%5] set row [expr $i/5] grid configure $itk_component(uslBut$i) -in $itk_component(uslButFrame) \ -column $col -row $row -sticky "snew" incr i } incr row itk_component add moreHelp { label $itk_interior.bhelp -text "(see Help for more functions)" -font g_titleFont } grid configure $itk_component(moreHelp) -in $itk_component(uslButFrame) \ -column 0 -row $row -sticky "snew" -columnspan 5 # the column button field set itk_interior $itk_component(colButFrame) itk_component add colLable { label $itk_interior.bl -text "Columns" -font g_titleFont } grid configure $itk_component(colLable) -in $itk_component(colButFrame) \ -column 0 -columnspan 6 -row 0 -sticky "snew" set i 0 foreach elem $_colNameList { itk_component add colBut$i { button $itk_interior.b$i -text $elem -padx 3 -pady 2 \ -command [itcl::code $this addBut $elem 1] -width 10 -font g_titleFont } incr i } set numColBut $i set numPage [expr 1+$i/24] for {set j $numColBut} { $j < [expr $numPage*24]} {incr j} { itk_component add colBut$j { button $itk_interior.b$j -text "" -padx 3 -pady 2 \ -width 10 -state disabled } } butPage $curPage set itk_interior $itk_component(pageButFrame) itk_component add pageUp { button $itk_interior.up -text "Up" -command [itcl::code $this _pageUp] } itk_component add pageDown { button $itk_interior.down -text "Down" -command [itcl::code $this _pageDown] } itk_component add pageSep { frame $itk_interior.sep -height 4 -borderwidth 2 -relief \ raised } # Ziqin Pan, Feb 18, 2004 # add to support row selection addOrCheckButton # itk_component add selonlyCheckButton { checkbutton $itk_interior.selonly -text "Apply only to selected rows" \ -variable [itcl::scope _calcselonly ] } pack $itk_component(pageSep) -in $itk_component(pageButFrame) \ -fill x -side top pack $itk_component(orCheckButton) -in $itk_component(pageButFrame) \ -fill x -side top pack $itk_component(selonlyCheckButton) -in $itk_component(pageButFrame) \ -fill x -side top pack $itk_component(pageUp) -in $itk_component(pageButFrame) \ -side left pack $itk_component(pageDown) -in $itk_component(pageButFrame) \ -side right if { $numPage == 1} { $itk_component(pageUp) configure -state disabled $itk_component(pageDown) configure -state disabled } # set itk_interior $itk_component(pageFrame) itk_component add calculate { button $itk_interior.calculate -text Calculate \ -font g_titleFont \ -command [itcl::code $this _calculateCmd] } bind $itk_component(result) \ [itcl::code $itk_component(calculate) invoke] itk_component add cancel { button $itk_interior.cancel -text Close -command "itcl::delete object $this" -font g_titleFont } itk_component add help { button $itk_interior.help -text Help -command {hhelp calculator} -font g_titleFont } grid configure $itk_component(calculate) -in $itk_component(pageFrame) \ -column 0 -row 2 -sticky "snew" grid configure $itk_component(cancel) -in $itk_component(pageFrame) \ -column 0 -row 3 -sticky "snew" grid configure $itk_component(help) -in $itk_component(pageFrame) \ -column 0 -row 4 -sticky "snew" # eval itk_initialize focus $itk_component(result) } itcl::body FitsBaseCalculator::butPage {page} { for {set j 0} {$j < 24} {incr j} { set col [expr $j/6] set row [expr $j%6 +1] set index [expr $page*24+$j] grid configure $itk_component(colBut$index) \ -in $itk_component(colButFrame) \ -column $col -row $row -sticky "snew" } } itcl::body FitsBaseCalculator::addBut {element isCol} { if { $isCol } { if { [string is alnum $element] == 0 && [string is alpha $element] == 0 } { if { [regexp -nocase {[\$\+\-\*\/\.\<\>\%\^]} $element] == 1 } { set element "\$$element\$" } } } else { switch -exact -- $element { sin - cos - tan - asin - acos - atan - sqrt - exp - log10 { set element "${element}(x)" ; set backup {2 1}; } "log e" { set element "log(x)" ; set backup {2 1}; } PI { set element "#pi " } e { set element "#e " } EE { set element "E" } gti { set element "gtifilter()" ; set backup {1 0}; } rgn { set element "regfilter(\"rgnFile\")" ; set backup {9 7}; } CL { set element ""; set [itcl::scope resultFormula($this)] "" } } } if { [$itk_component(result) selection present] } { $itk_component(result) delete sel.first sel.last } $itk_component(result) insert insert $element if { [info exists backup] } { set loc [$itk_component(result) index insert] set start [expr $loc-[lindex $backup 0] ] $itk_component(result) icursor $start $itk_component(result) selection range \ $start [expr $start+[lindex $backup 1]] } } itcl::body FitsBaseCalculator::_pageDown {} { if { $numPage == 1 } return if { $curPage == [expr $numPage-1]} return for {set j 0} {$j < 24} {incr j} { set index [expr $curPage*24+$j] grid forget $itk_component(colBut$index) } incr curPage butPage $curPage } itcl::body FitsBaseCalculator::_pageUp {} { if { $numPage == 1 } return if { $curPage == 0 } return for {set j 0} {$j < 24} {incr j} { set index [expr $curPage*24+$j] grid forget $itk_component(colBut$index) } incr curPage -1 butPage $curPage } itcl::body FitsBaseCalculator::addOrCheckButton {} { itk_component add orCheckButton { label $itk_interior.orCheckButton -text " " } } itcl::body FitsBaseCalculator::setResult {} { itk_component add resultCol { iwidgets::combobox $itk_interior.resultCol -textvariable \ [itcl::scope resultColumn($this)] -completion 0 \ -selectioncommand [::itcl::code $this validation] } eval $itk_component(resultCol) insert list end $_colNameList } itcl::body FitsBaseCalculator::validation {} { if { [string is alnum $resultColumn($this)] == 0 && \ [string is alpha $resultColumn($this)] == 0 } { if { [string first "$" $resultColumn($this)] >= 0 || [string first "-" $resultColumn($this)] >= 0 || [string first "%" $resultColumn($this)] >= 0 || [string first "^" $resultColumn($this)] >= 0 || [string first "=" $resultColumn($this)] >= 0 || [string first "+" $resultColumn($this)] >= 0 || [string first "*" $resultColumn($this)] >= 0 || [string first "^" $resultColumn($this)] >= 0 || [string first "<" $resultColumn($this)] >= 0 || [string first ">" $resultColumn($this)] >= 0 || [string first "/" $resultColumn($this)] >= 0 } { #set resultColumn($this) "\$$resultColumn($this)\$" } } } itcl::body FitsBaseCalculator::refresh {} { set _colNameList [$_father getCalcCols] set newPages [expr 1+([llength $_colNameList]-1)/24] # Update the number of buttons needed set itk_interior $itk_component(colButFrame) if { $numPage < $newPages } { # Have to create more pages for { set j [expr $numPage*24] } { $j < [expr $newPages*24] } {incr j} { itk_component add colBut$j { button $itk_interior.b$j -text "" -padx 3 -pady 2 \ -width 10 -state disabled } } } elseif { $numPage > $newPages } { # Delete excess buttons for { set j [expr $newPages*24] } { $j < [expr $numPage*24] } {incr j} { destroy $itk_component(colBut$j) } } set numPage $newPages # Update buttons to reflect current column names set i 0 foreach elem $_colNameList { $itk_component(colBut$i) configure -text $elem -padx 3 -pady 2 \ -command [itcl::code $this addBut $elem 1] -width 10 \ -state normal incr i } set numColBut $i while { $i < [expr $numPage*24]} { $itk_component(colBut$i) configure -text "" -padx 3 -pady 2 \ -width 10 -state disabled incr i } if { $numPage == 1} { $itk_component(pageUp) configure -state disabled $itk_component(pageDown) configure -state disabled } else { $itk_component(pageUp) configure -state normal $itk_component(pageDown) configure -state normal } if { $curPage >= $numPage } { # No need to "forget" buttons... they should have been deleted set curPage [expr $numPage-1] butPage $curPage } } fv5.4/ftools/guis/fv/class/FitsCalculator.tcl0000644000220700001010000000671211214543217020632 0ustar birbylheadevitcl::class FitsCalculator { inherit FitsBaseCalculator constructor {theFather theCols} { FitsBaseCalculator::constructor $theFather $theCols } {} destructor {} private method _calculateCmd {} private method setResult {} private method validation {} private method displayMsg { msg } } itcl::body FitsCalculator::_calculateCmd {} { global donotDisplayFlag if { ($resultColumn($this) == "") || ($resultFormula($this) == "") } { error "You need to give me both the result column name \n and the formula to calculate" return } # try to tolerate = in the formula, just substitute with == before # pass it to fitsTcl set tmp $resultFormula($this) # to see if the result is in an existing column set cform "default" if ![regexp "^(.+)\\\((.+)\\\)$" $resultColumn($this) cdmy cname cform] { set cname $resultColumn($this) } set idx [lsearch -exact $_colNameList $cname] if { $idx >= 0 } { # result been put back to an existing column, check its type set cform [lindex [lindex [$_father getColInfo $cname] 0] 1] } if { $cform != "default" } { if [regexp K $cform] { # this will be removed when cfitsio fully supports 64 bits integer arithmetic if { ![info exist donotDisplayFlag] || ( [info exist donotDisplayFlag] && $donotDisplayFlag == "no") } { displayMsg "Arithmetic function on 64 bits integer is not fully supported yet\nfor value that is larger than 10^15." tkwait window .thismsg } } } regsub -all {([^!<>=])=([^<>=])} $tmp {\1==\2} tmp set [itcl::scope resultFormula($this)] $tmp if { [regexp "^(.+)\\\((.+)\\\)$" $resultColumn($this) dmy name form] } { set [itcl::scope resultColumn($this)] $name set [itcl::scope resultForm($this)] $form } else { set [itcl::scope resultForm($this)] "default" } # pass the formula back to _father object, and continue $_father calculateCols $resultColumn($this) $resultForm($this) \ $resultFormula($this) $_calcselonly # catch {itcl::delete object $this} } itcl::body FitsCalculator::setResult {} { itk_component add resultCol { iwidgets::combobox $itk_interior.resultCol -textvariable \ [itcl::scope resultColumn($this)] -completion 0 \ -selectioncommand [::itcl::code $this validation] } eval $itk_component(resultCol) insert list end $_colNameList } itcl::body FitsCalculator::validation {} { if { [string is alnum $resultColumn($this)] == 0 && \ [string is alpha $resultColumn($this)] == 0 } { #set resultColumn($this) "\$$resultColumn($this)\$" } } itcl::body FitsCalculator::displayMsg { msg } { global donotDisplayFlag if [winfo exists .thismsg] { destroy .thismsg } toplevel .thismsg set top .thismsg wm geom .thismsg +[expr [winfo screenwidth .] / 3]+[expr [winfo screenheight .] / 2] wm title .thismsg "Warning" message $top.msg -text "$msg\n" -aspect 15000 set lineCnt [expr [llength [split $msg \n]] + 1] checkbutton $top.display -text "Do not show this message again" -variable donotDisplayFlag \ -onvalue yes -offvalue no button $top.done -text "done" -command { destroy .thismsg } grid $top.msg -column 0 -row 0 -columnspan 7 -rowspan $lineCnt grid $top.display -column 0 -row [expr $lineCnt + 1] -columnspan 7 grid $top.done -column 3 -row [expr $lineCnt + 2] } fv5.4/ftools/guis/fv/class/FitsClipBoard.tcl0000644000220700001010000001301110442112363020362 0ustar birbylheadev# FitsClipBoard class # Function: keep data (keywords, columns, rows or a block of data ) # for copying ... # infoType: infoInfo: # tableBlock {xdim ydim $blocks} : blocks is a list of strings # tableRows {numCols $blocks} : # : block ans rows use tcl variables # tableColumn {dataAddressForPOW type numRows colName colType colUnit colNull} # : column use c variable in memory # keywords {numKeys $keys} : keywords use tcl string. # hdus {numHDUs $sourceFileName} : # # itcl::class FitsClipBoard { constructor {args} {} destructor {} public method toggleView {} public method hide {} public method activate {} public method register {type src desc dataList} public method report {} public method clean {} public method hasRec {} private method _buildWindow {} private method _postMenus {} private variable _infoType "None" private variable _infoSrc "None" private variable _infoInfo "None" private variable _dataBlock "" private variable _droot private variable _mBar } itcl::body FitsClipBoard::constructor {args} { _buildWindow hide } itcl::body FitsClipBoard::destructor {} { global g_backupDir catch { file delete [file join $g_backupDir cb.fits] } catch { destroy $_droot } } itcl::body FitsClipBoard::_buildWindow {} { global isMac global g_titleFont set _droot .[namespace tail $this] powToplevel $_droot .dummy wm title $_droot "fv Clipboard" # Bind Menubar Events bind $_droot <> [itcl::code $this hide] bind $_droot <> [itcl::code $this clean] bind $_droot <> [itcl::code $this _postMenus] # Create Menubar if { $isMac } { set _mBar .mbar.clip set evtWndw "" } else { set _mBar $_droot.mbar set evtWndw $_droot } $_droot config -menu $_mBar if { ![winfo exists $_mBar] } { menu $_mBar -postcommand "doMenuEvent <> $evtWndw" if { $isMac } { $_mBar add cascade -menu $_mBar.apple $_mBar add cascade -menu $_mBar.file -label File $_mBar add cascade -menu $_mBar.edit -label Edit $_mBar add cascade -menu .mbar.wind -label Windows $_mBar add cascade -menu $_mBar.help -label Help buildAppleStyleMenu $_mBar.apple buildFileMenu $_mBar.file buildEditMenu $_mBar.edit # Opts and Wind use global menu buildHelpMenu $_mBar.help v v $_mBar.help delete 0 1 $_mBar.file entryconfig "Close" -state normal -font g_titleFont } else { $_mBar add cascade -menu $_mBar.edit -label Edit -font g_titleFont menu $_mBar.edit -tearoff False \ -postcommand "doMenuEvent <> $evtWndw" $_mBar.edit add command -label Clear \ -command "doMenuEvent <>" $_mBar.edit add command -label Close -font g_titleFont \ -command "doMenuEvent <>" } } # Create Window Body frame $_droot.bodyF pack $_droot.bodyF -side top -fill both -expand 1 label $_droot.bodyF.typeT -text "Type" -width 10 -font g_titleFont label $_droot.bodyF.srcT -text "Source" -width 10 -font g_titleFont label $_droot.bodyF.infoT -text "Info" -width 10 -font g_titleFont frame $_droot.bodyF.sepF -relief raised -bd 2 -height 6 label $_droot.bodyF.typeL -textvariable [itcl::scope _infoType] -font g_titleFont label $_droot.bodyF.srcL -textvariable [itcl::scope _infoSrc] -font g_titleFont label $_droot.bodyF.infoL -textvariable [itcl::scope _infoInfo] -font g_titleFont grid configure $_droot.bodyF.typeT -column 0 -row 0 -sticky "snew" grid configure $_droot.bodyF.srcT -column 2 -row 0 -sticky "snew" grid configure $_droot.bodyF.infoT -column 1 -row 0 -sticky "snew" grid configure $_droot.bodyF.sepF -column 0 -row 1 -columnspan 3 \ -sticky "snew" grid configure $_droot.bodyF.typeL -column 0 -row 3 -sticky "snew" grid configure $_droot.bodyF.srcL -column 2 -row 3 -sticky "snew" grid configure $_droot.bodyF.infoL -column 1 -row 3 -sticky "snew" grid columnconfigure $_droot.bodyF 2 -weight 5 } itcl::body FitsClipBoard::_postMenus {} { global isMac if { [hasRec] } { $_mBar.edit entryconfig "Clear" -state normal -font g_titleFont } else { $_mBar.edit entryconfig "Clear" -state disabled -font g_titleFont } update idle } itcl::body FitsClipBoard::toggleView {} { if { ! [winfo exists $_droot] } { _buildWindow } if { [winfo viewable $_droot] } { hide } else { activate } } itcl::body FitsClipBoard::hide {} { wm withdraw $_droot } itcl::body FitsClipBoard::activate {} { wm deiconify $_droot raise $_droot } itcl::body FitsClipBoard::register {type src desc dataList} { if { [hasRec] } { clean } set _infoType $type set _infoSrc $src set _infoInfo $desc set _dataBlock $dataList } itcl::body FitsClipBoard::clean {} { if { ![hasRec] } { return } # clean up the tcl variables set _infoType "None" set _infoSrc "None" set _infoInfo "None" } itcl::body FitsClipBoard::hasRec {} { if { $_infoType == "None" } { return 0 } else { return 1 } } itcl::body FitsClipBoard::report {} { return [list $_infoType $_infoSrc $_dataBlock] } fv5.4/ftools/guis/fv/class/FitsDelCalculator.tcl0000644000220700001010000000221610442112363021246 0ustar birbylheadevitcl::class FitsDelCalculator { inherit FitsBaseCalculator constructor {theFather theCols} { FitsBaseCalculator::constructor $theFather $theCols } { $itk_component(calculate) configure -text "Delete" \ -command [itcl::code $this deleteCmd] $itk_component(help) configure -command {hhelp deleteRows} } destructor {} private method setResult {} private method deleteCmd {} } itcl::body FitsDelCalculator::deleteCmd { } { set rslt [promptMsg \ "The table rows will be permanently deleted.\nAre you sure?" \ return Yes No] if { $rslt=="CANCEL" || $rslt=="BREAK" } return if { [regexp {[^0-9, -]} $resultFormula($this)] } { setWatchCursor [namespace tail $this] \ [itcl::code $_father delRowsWithCondition $resultFormula($this)] } else { # setWatchCursor [namespace tail $this] \ # [itcl::code $_father delRowsFromList $resultFormula($this)] $_father delRowsFromList $resultFormula($this) } } itcl::body FitsDelCalculator::setResult {} { itk_component add resultCol { label $itk_interior.resultCol -text "Rows to delete or condition:" } } fv5.4/ftools/guis/fv/class/FitsExtension.tcl0000644000220700001010000005367012055447275020535 0ustar birbylheadev# First draft 02/06/97 Jianjun #constrct a FitsExtension class to let header and table share one FitsFileObj # FitsExtension fMode currentHDU fileName father header/data itcl::class FitsExtension { public method dispHeader {} public method skipTable { {content_ {}} } public method callHistogram { extNum_ fillFlag_ } public method dispTable { extNum_ {content_ {}} forceNew_ } public method displaySlice { extNum_ slice } public method plotData { {params_ {}} } public method addChild { child_ type_ } public method freeChild { child_ } public method updateHL { field_ value_ } public method updateDisps { child_ } public method setFileName { fName_ } public method closeCmd { } private method _getImageSlice { numSlices_ } private method _getTableSlice { numSlices_ } public variable fFile public variable fileName # this is only one header private variable _myHeader "" # this is a LIST of Tables private variable _myTables {} private variable _fatherFitsFile private variable _currentHDU # These are scratch variables for handling 3D images private variable _itype private variable _istart private variable _iend private variable _islice private variable _cslice 1 private method _setIType { type_ } private variable imgdim # when plotting a 1-d image private method _oneDimImages {} constructor {args} {} destructor {} } # FitsExtension fMode currentHDU fileName father header/data itcl::body FitsExtension::constructor {args} { global totalCoordinateSystem set fMode [lindex $args 0] set _currentHDU [lindex $args 1] set fileName [lindex $args 2] set _fatherFitsFile [lindex $args 3] if { $fMode == 1 } { set fFile [FitsFile #auto $fileName $fMode $_fatherFitsFile] } else { if { [file writable $fileName] } { set fFile [FitsFile #auto $fileName $fMode $_fatherFitsFile] } else { set fFile [FitsFile #auto $fileName 1 $_fatherFitsFile] } } $fFile moveToHDU $_currentHDU set totalCoordinateSystem 1 foreach desn [list a b c d e f g h i j k l m n o p q r s t u v w x y z] { if { [catch {set ctype [$fFile getKeyword "CTYPE1$desn"]} ] == 0 } { incr totalCoordinateSystem } } $_fatherFitsFile addChild $this $_currentHDU } itcl::body FitsExtension::destructor {} { itcl::delete object $fFile $_fatherFitsFile freeChild $_currentHDU } itcl::body FitsExtension::dispHeader {} { if { $_myHeader == "" } { set _myHeader [namespace current]::[FitsHeader #auto $fFile $this] } else { $_myHeader bringToFront } return $_myHeader } itcl::body FitsExtension::callHistogram { extNum_ fillFlag_ } { set fT [FitsTable #auto $fFile $this] set fT [namespace current]::$fT $fT callHistogramDirectly 1 $fillFlag_ return } itcl::body FitsExtension::skipTable { {content_ {}} } { set fT [FitsImage #auto $fFile $this] set fT [namespace current]::$fT return [$fT _sPlotCmd] } itcl::body FitsExtension::dispTable { extNum_ {content_ {}} forceNew_ } { # content_ is the coor_ passed into FitsFile::openTable # content_ is "" if one just pushes a button # it only has content if something else calls FitsFile::openTable # -- for example, when double an image pixel, the image coors are # passed in # forceNew_ is 1 if the right mouse button was pressed on the "Table" button # forceNew_ is 0 if not; usually due to pressing left mouse on "Table" button # if a table exists and we don't have to forceNew_ a new one, return the table if { !$forceNew_ } { set oneRaised 0 foreach fT $_myTables { if { [$fT bringToFront] } { set oneRaised 1 set raisedTable $fT } } if { $oneRaised } { # if $content_ is "coord1 coord2" from clicking on image pixels if { [llength $content_] > 1 } { # Highlight the indicated pixel update idletask $raisedTable showCell [lindex $content_ 0] [lindex $content_ 1] } return [lindex $_myTables 0] } } # otherwise create the new table # decide whether we're creating a FitsTable, FitsImage, or CubeImage set type [lindex [$fFile getTableInfo hdutype] 1] # TABLE if { $type == "Table" } { set fT [FitsTable #auto $fFile $this] # don't know why this "namespace current" is here set fT [namespace current]::$fT if { !$forceNew_ && $content_ == "" } { # most common scenario resulting from left-button click on Table button set content_ "-" } $fT dispTable $extNum_ $content_ # IMAGE ($type could be "extension") } else { set imgdim [$fFile getImgInfo] # CUBE if { [llength $imgdim] > 2 && [lindex $imgdim 2] > 1 } { if { [llength $content_] == 1 || [llength $content_] == 3 } { set _islice [lindex $content_ end] } else { while { 1 } { set _islice 1 _getTableSlice [lindex $imgdim end] if { $_islice == -99 } return if { $_cslice < 1 || $_cslice > [lindex $imgdim end] } { tk_messageBox -icon error -type ok -message "Cube selection out of bound\nvalue should between 1 and [lindex $imgdim end]" continue } if { $_islice < 1 || $_islice > [lindex $imgdim end] } { tk_messageBox -icon error -type ok -message "Slice selection out of bound\nvalue should between 1 and [lindex $imgdim end]" continue } break } } set fT [CubeImage #auto $fFile $this $_islice $_islice $_cslice] set fT [namespace current]::$fT } else { # 2-D IMAGE set fT [FitsImage #auto $fFile $this] set fT [namespace current]::$fT } $fT makeTable $extNum_ if { [llength $content_] > 1 } { # Highlight the indicated pixel update idletask $fT showCell [lindex $content_ 0] [lindex $content_ 1] } } return $fT } itcl::body FitsExtension::displaySlice { extNum_ slice } { set fI [FitsImage #auto $fFile $this] # set fI [CubeImage #auto $fFile $this $slice $slice] set fI [namespace current]::$fI return [$fI makeImage] } itcl::body FitsExtension::plotData { {params_ {}} } { set type [lindex [$fFile getTableInfo hdutype] 1] if { $type == "Table" } { set fT [FitsTable #auto $fFile $this] $fT scplotCmd $params_ } else { # Image table set imgdim [$fFile getImgInfo] if { [llength $imgdim] == 1 } { set fI [FitsImage #auto $fFile $this] if { [llength $params_] ==0 } { set curveType "column" set _istart 1 set _iend 1 set inCurrgn 0 } elseif { [llength $params_] ==1 } { if { [lindex $params_ 0 ] =="-rows" } { set curveType "row" } else { set curveType "column" } set _istart 1 set _iend 1 set inCurrgn 0 } elseif { [llength $params_] ==2 } { if { [lindex $params_ 0 ] =="-rows" } { set curveType "row" } else { set curveType "column" } set _istart [lindex $params_ 1] set _iend [lindex $params_ 1] set inCurrgn 0 } elseif { [llength $params_] ==3 } { if { [lindex $params_ 0 ] =="-rows" } { set curveType "row" } else { set curveType "column" } set _istart [lindex $params_ 1] set _iend [lindex $params_ 2] set inCurrgn 0 } else { if { [lindex $params_ 0 ] =="-rows" } { set curveType "row" } else { set curveType "column" } set _istart [lindex $params_ 1] set _iend [lindex $params_ 2] set inCurrgn [lindex $params_ 3] } # $fI _sPlotCmd $fI imagePlot [list $curveType $_istart $_iend $inCurrgn] # one-dimensional images will be line-plotted # _oneDimImages } else { # standard images # image slices if { [llength $imgdim] > 2 && [lindex $imgdim 2] > 1 } { if { [llength $params_] == 0 } { _getImageSlice [lindex $imgdim 2] if { $_cslice < 1 || $_cslice > [lindex $imgdim end] } { tk_messageBox -icon error -type ok -message "Cube selection out of bound\nvalue should between 1 and [lindex $imgdim end]" return } else { set _istart [expr ($_cslice - 1) * [lindex $imgdim 2] + $_istart] set _iend [expr ($_cslice - 1) * [lindex $imgdim 2] + $_iend] } } elseif { [llength $params_] == 1 } { set _istart $params_ set _iend $params_ set _itype "Animate" } else { set _istart [lindex $params_ 0] set _iend [lindex $params_ 1] set _itype "Animate" } #puts "FitsExtension: params: $params_" #puts "FitsExtension: _itype: $_itype" #puts "FitsExtension: _istart: $_istart" #puts "FitsExtension: _iend: $_iend" #puts "FitsExtension: _cslice: $_cslice" switch $_itype { "Mosaic" { # Not enabled set fI [FitsImage #auto $fFile $this] } "WFPC" { set fI [WFPC2Image #auto $fFile $this] } "Animate" { set fI [CubeImage #auto $fFile $this $_istart $_iend $_cslice] } default { return } } } else { set fI [FitsImage #auto $fFile $this] } if { [lindex $params_ 0] == "-rows" || [lindex $params_ 0] == "-cols" } { set inCurrgn 0 set curveType [string range [lindex $params_ 0] 1 3] if { [llength $params_] == 1 } { error "Usage: display curve extNum -rows|-cols start ?end? ?currGraph?" } elseif { [llength $params_] == 2 } { set _istart [lindex $params_ 1] set _iend $_istart } elseif { [llength $params_] == 3 } { set _istart [lindex $params_ 1] set _iend [lindex $params_ 2] } else { set _istart [lindex $params_ 1] set _iend [lindex $params_ 2] set inCurrgn [lindex $params_ 3] } $fI imagePlot [list $curveType $_istart $_iend $inCurrgn] } else { $fI makeImage } } } } itcl::body FitsExtension::_getImageSlice { numSlices_ } { # Sets '_itype' to the image type to display, and '_istart/_iend' if # an animation is desired. '_itype' will be "" if canceled set _istart 1 set _islice 1 set _iend $numSlices_ set _itype "" if { [catch {set instName [$fFile getKeyword "INSTRUME"]} ] == 0 } { set instName [string range [string trim [lindex \ [join $instName] 1] "' "] 0 3] } else { set instName "" } # image selection if { [winfo exist .fv_imgsel] == 1 } { destroy .fv_imgsel } powToplevel .fv_imgsel .dummy wm title .fv_imgsel "fv: Image Selection" if { $instName == "WFPC"} { label .fv_imgsel.label -text "This is an HST/WFPC image" \ -relief ridge -borderwidth 4 button .fv_imgsel.mosaic -text "WFPC" \ -command "[itcl::code $this _setIType WFPC] destroy .fv_imgsel" } else { if { [llength $imgdim] <= 3 } { set labelTxt "The [llength $imgdim]D image has $numSlices_ slices" } else { set labelTxt "The [llength $imgdim]D image contains [lindex $imgdim end] data cube, each with $numSlices_ slices" label .fv_imgsel.dl -width 10 -text "Data Cube" entry .fv_imgsel.de -width 10 -textvariable [itcl::scope _cslice] } label .fv_imgsel.label -text $labelTxt -relief ridge -borderwidth 4 button .fv_imgsel.mosaic -text "Mosaic" \ -command "[itcl::code $this _setIType MOSAIC] destroy .fv_imgsel" \ -state disabled } label .fv_imgsel.sl -width 5 -text "Start" entry .fv_imgsel.se -width 10 -textvariable [itcl::scope _istart] label .fv_imgsel.el -width 5 -text "End" entry .fv_imgsel.ee -width 10 -textvariable [itcl::scope _iend] button .fv_imgsel.anim -text "Animate" \ -command "[itcl::code $this _setIType Animate] destroy .fv_imgsel" button .fv_imgsel.cancel -text "Cancel" \ -command "destroy .fv_imgsel" button .fv_imgsel.help -text "Help" \ -command "hhelp 3D-ImageDisplay" grid .fv_imgsel.label -column 0 -row 0 -columnspan 4 -sticky "snew" set rowIdx 1 if { [llength $imgdim] > 3 } { grid .fv_imgsel.dl -column 0 -row 1 grid .fv_imgsel.de -column 1 -row 1 incr rowIdx } grid .fv_imgsel.sl -column 0 -row $rowIdx grid .fv_imgsel.se -column 1 -row $rowIdx grid .fv_imgsel.el -column 2 -row $rowIdx grid .fv_imgsel.ee -column 3 -row $rowIdx incr rowIdx grid .fv_imgsel.anim -column 0 -row $rowIdx grid .fv_imgsel.mosaic -column 1 -row $rowIdx grid .fv_imgsel.cancel -column 2 -row $rowIdx grid .fv_imgsel.help -column 3 -row $rowIdx tkwait window .fv_imgsel } itcl::body FitsExtension::_getTableSlice { numSlices_ } { # Sets '_islice' to the image slice to display, or -1 if canceled set _istart 1 set _islice 1 set _cslice 1 set _iend $numSlices_ set _itype "" # image selection if { [winfo exist .fv_imgsel] } { destroy .fv_imgsel } powToplevel .fv_imgsel .dummy wm title .fv_imgsel "fv: Image Selection" if { [llength $imgdim] <= 3 } { set labelTxt "The [llength $imgdim]D image has $numSlices_ slices" } else { set labelTxt "The [llength $imgdim]D image contains $numSlices_ data cube, each with [lindex $imgdim 2] slices" label .fv_imgsel.dl -width 10 -text "Data Cube" entry .fv_imgsel.de -width 10 -textvariable [itcl::scope _cslice] bind .fv_imgsel.de "[itcl::code $this _setIType Slice] destroy .fv_imgsel" } label .fv_imgsel.label -text $labelTxt -relief ridge -borderwidth 4 label .fv_imgsel.sl -width 12 -text "Image Slice" entry .fv_imgsel.se -width 10 -textvariable [itcl::scope _islice] bind .fv_imgsel.se "[itcl::code $this _setIType Slice] destroy .fv_imgsel" button .fv_imgsel.display -text "Display" -command "[itcl::code $this _setIType Slice] destroy .fv_imgsel" button .fv_imgsel.cancel -text "Cancel" \ -command "[itcl::code $this _setIType CANCEL] destroy .fv_imgsel" button .fv_imgsel.help -text "Help" \ -command "hhelp 3D-ImageTable" grid .fv_imgsel.label -column 0 -row 0 -columnspan 4 -sticky "snew" set rowIdx 1 if [winfo exists .fv_imgsel.dl] { grid .fv_imgsel.dl -column 0 -row $rowIdx grid .fv_imgsel.de -column 1 -row $rowIdx incr rowIdx } grid .fv_imgsel.sl -column 0 -row $rowIdx grid .fv_imgsel.se -column 1 -row $rowIdx incr rowIdx grid .fv_imgsel.display -column 0 -row $rowIdx grid .fv_imgsel.cancel -column 1 -row $rowIdx grid .fv_imgsel.help -column 2 -row $rowIdx tkwait window .fv_imgsel if { $_itype == "" } { set _islice -1 } elseif { $_itype == "CANCEL" } { set _islice -99 } else { # extract only the first number regexp {[0123456789]*} $_islice newslice if { $newslice != $_islice } { error "Must enter the number of slice you wish to browse. A range is not allowed because only 1 table slice can be browsed at a time." } } } itcl::body FitsExtension::_setIType { type_ } { set _itype $type_ } itcl::body FitsExtension::addChild { child_ type_ } { if { $type_ == "header" } { # there can only be one header per extension if { $_myHeader == "" } { set _myHeader $child_ } else { puts "_myHeader already has value $_myHeader" } } elseif { $type_ == "table" } { # but many tables are possible per extension lappend _myTables $child_ } } itcl::body FitsExtension::freeChild { child_ } { if { $child_ == $_myHeader } { set _myHeader "" } else { set pos [lsearch $_myTables $child_] if { $pos != -1 } { set _myTables [lreplace $_myTables $pos $pos] } else { puts "Unable to find child $child_" } } # if we don't have a header or table child, then this extension isn't # needed, so delete it if { $_myHeader == "" && [llength $_myTables] == 0 } { itcl::delete object $this } } itcl::body FitsExtension::updateHL { field_ value_ } { $_fatherFitsFile updateHighLight $_currentHDU $field_ $value_ } itcl::body FitsExtension::updateDisps { child_ } { # sometimes there is nothing for $_myHeader or $_myTables, hence we use foreach foreach head $_myHeader { if { $child_ != $head } {$head refresh} } foreach table $_myTables { if { $child_ != $table } {$table refresh} } } itcl::body FitsExtension::setFileName { fName_ } { foreach head $_myHeader { $head setFileName $fName_ } foreach table $_myTables { $table setFileName $fName_ } } itcl::body FitsExtension::closeCmd { } { foreach head $_myHeader { $head closeCmd } foreach table $_myTables { $table closeCmd } } itcl::body FitsExtension::_oneDimImages {} { ## assume image data is int or real (if not, program will bomb) global powWCS global powFitsHeader powFitsHeaderCnt powPlotParam global xCount yCount global powWCSList powWCSLabel powWCSName global useWCSInfo # create image name from file name regsub -all { } [urlTail $fileName] _ cleanFileName set graphName ${cleanFileName}_[expr $_currentHDU-1] set curveName "c0_$graphName" # not sure if these keywords are used set powWCS($curveName) [$fFile getWcs] set powWCSName($curveName) 0 set powWCSName(${curveName}scope) 0 set useWCSInfo($curveName) $fvPref::ifWCSInfo set useWCSInfo(${curveName}scope) $fvPref::ifWCSInfo if { $fvPref::ifWCSInfo } { set result [$fFile getHeader2String] set cntList($curveName) [$fFile getHeaderKeyWord [lindex $result 0] $imgIndex] set powFitsHeaderCnt($curveName) [lindex $cntList($curveName) 1] if { [lindex $cntList($curveName) 0] > 0 } { #set powFitsHeader($curveName) [$fFile assembleWcsHeader $curveName] set powFitsHeader($curveName) [lindex $result 0] set powWCSInfo($curveName,DEFAULT) $powWCS($curveName) set wcsinfo $powWCS($curveName) set x_label [lindex [lindex $wcsinfo 3] 0] set y_label [lindex [lindex $wcsinfo 3] 1] if { $y_label == "" } { set y_label "Data" } set x_unit "" set y_unit "intensity" } else { set powFitsHeader($curveName) [$fFile assembleWcsHeader $curveName NOWCS] set x_label "Pixel" set y_label "Data" set x_unit "" set y_unit "intensity" } } else { set powWCS($curveName) "" set powFitsHeader($curveName) "" set powFitsHeaderCnt($curveName) 0 set x_label "Pixel" set y_label "Data" set x_unit "" set y_unit "intensity" } # get row # info # set dataInfoForPOW [$fFile loadExpr "#ROW" NULL ""] # set dataPtr [lindex $dataInfoForPOW 0] # set dataType [lindex $dataInfoForPOW 1] # set numElements [lindex $dataInfoForPOW 2] set numElements [$fFile getImgInfo] # powCreateData "rowsData" $dataPtr $dataType $numElements 1 set dataInfoForPOW [$fFile loadImageMeanRows 1 $numElements 1] set dataPtr [lindex $dataInfoForPOW 0] set dataType [lindex $dataInfoForPOW 1] set numElements [lindex $dataInfoForPOW 2] powCreateData "colsData" $dataPtr $dataType $numElements 1 # create list from 1 to numElements set listRows {} for { set i 1 } { $i <= $numElements } { incr i } { lappend listRows $i } powCreateDataFromList "rowsData" $listRows powCreateVector "rowsVector" "rowsData" 0 NULL NULL powCreateVector "colsVector" "colsData" 0 NULL NULL set powWCSList($curveName) {} set powWCSList(${curveName}scope) {} powCreateCurve $curveName rowsVector NULL colsVector NULL if [info exists powWCSList($curveName)] { foreach name [lindex $powWCSList($curveName) 1] { $fFile assembleWcsLabel $curveName $name } } else { set powWCSList($curveName) {} lappend powWCSList($curveName) 1 lappend powWCSList($curveName) {} } set powWCSList(${curveName}scope) $powWCSList($curveName) set curves [list $curveName] if { [winfo exist .pow.pow]!=1 } { powInit .dummy } set powPlotParam(graphType,$graphName) [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(graphType,${graphName}scope) $powPlotParam(graphType,$graphName) set powPlotParam(zoomed,$graphName) 0 set powPlotParam(zoomed,${graphName}scope) 0 set xCount(${graphName}) 0 set yCount(${graphName}) 0 set xCount(${graphName}scope) 0 set yCount(${graphName}scope) 0 set powWCSList($graphName) {} set powWCSList(${graphName}scope) {} powCreateGraph $graphName $curves NULL $x_unit $y_unit $x_label $y_label \ [lindex $fvPref::graphDispSize 0] [lindex $fvPref::graphDispSize 1] set powWCSList($graphName) $powWCSList($curveName) set powWCSList(${graphName}scope) $powWCSList($curveName) powSetCurveOptions $graphName $curves pDisp No lDisp Yes } fv5.4/ftools/guis/fv/class/FitsFile.tcl0000644000220700001010000023612212053000724017411 0ustar birbylheadevitcl::class FitsFile { constructor {args} {} destructor {} public method save {} public method saveAs { {saveFileName_ ""} } public method saveHDUsAsText { {saveFileName_ ""} } public method saveHDUsAs {} public method saveCHDUAs {ext_} public method revertFile {} public method writeHisKey {} public method getBackup {} public method getTableInfo {name_} public method getColInfo {colName_} public method getExprInfo {expr_} public method getImgInfo {} public method getImgType {} public method getcolblock {col_ rowrange_} public method getKeywords {keywords_} public method dumpHeader {} public method isReadOnly {} public method closeCmd { {force_ 0} } public method cleanChild {} public method updateHighLight {extNum_ field_ value_} public method sort {column_ ascendFlag_ isMerge_} public method getWcs {{dest {}} {RAColNum_ {}} {DecColNum_ {}}} public method getColMinMax {colname_ felem_ rowrange_} public method getColStat {colname_ felem_ rowrange_} public method getColNum {colname_} public method getTLMinMax {colname_} public method makeHistogram {args} public method plotHisto {} public method addChild { child_ extNum_ } public method freeChild { extNum_ } public method countChanged {} public method getMaster {} public method displaySlice { extNum_ slice } public method plotData { extNum_ {xyNames_ {}} } public method plotData1 { extNum_ {xyNames_ {}} } public method openHeader { extNum_ } public method openTable { extNum_ {coor_ {}} {newTable_ {}} } public method openExtension { extNum_ } public method closeExtension { extNum_ } public method skipTable { extNum_ {coor_ {}} } public method callHistogram { extNum_ fillFlag_ } public method checkXYCol { idx } public method deleteExt { extNum_ } public method _transformFileName { name } public method _reverseTransformedFileName { name } public method _isEmptyDir { dir } public method getHeader2String {} public method translateKeyWords { colName rowNum dest tempFile } public method getDummyHeader2String {{dest {}} RAColNum_ DecColNum_} public method getHeaderKeyWord { str img } public method assembleWcsHeader { img {selection "DEFAULT"} } public method assembleWcsLabel { img {selection "DEFAULT"} } public method headerDebugDataPrint { title string } # fhl = file highlight window private variable _oldName private variable _fhl private variable _loaded private variable _mBar private variable _subwin private variable _myExtensionChildren private variable _myExtNums private variable _createTransformDirectory private common _smoothID public variable xwin public variable ywin public variable dosmooth #public member public variable opened public variable filename public variable openedFileName ## this is variable "chdu" in fitsTcl public variable currentHDU public variable isMaster 0 public variable isFailedToCopy 0 # the actual variable...see fitsTcl2.1 user's guide for more info on fitsfiles public variable fitsfile public variable filePermission "" public method moveToHDU {numHDU_} public method getNthKey {n_} public method copyCHDU {saveName_} public method insertKey {n_ rec_ fflag_} public method putNthKey {n_ rec_ fflag_} public method putHis {rec_} public method delNthKey {n_} public method flush {isClear_} public method loadColumn {col_ null_ i_} public method loadExpr {expr_ null_ {rows_ "-"}} public method loadImage {} public method loadImageFlip { direction } public method loadImageBlock {fRow_ nRows_ fCol_ nCols_ slice_} public method loadImageSlice {i_ r_} public method loadVectorTableToDataAddressForPOW {colName_} public method getVectorTableAsRawList {colName_ rows_ range_} public method getVectorTableRowAsFormattedList {colName_ row_ totalCols_} public method freeColumn {add_} public method freeExpr {add_} public method freeImage {add_} public method freeVTable {add_} public method loadTBlock {var_ cList_ fRow_ nRows_ fCol_ nCols_ i_} public method delRows {n0_ nn_} public method delRowsRange {rowrange_} public method delRowsWithCondition {cond_} public method delCols {colList_} public method selRowsWithCondition {cond_ fRow_ nRows_} public method addColumn {name_ form_} public method addColumnFrExpr {name_ form_ expr_ rowrange_} public method addRow {nRows_} public method getImageAsList {firstElem_ nElem_} public method putImage {fElem_ fRow_ value_} public method putTable {name_ felem_ range_ value_} public method putKwd {rec_ fflag_} public method saveTabToASCII {name_ n_ fRow_ nRows_ colList_ width_ ifFixedFormat_ ifCSV_ ifPrintRow_ sepString_} public method saveImgToASCII {name_ n_ fRow_ nRows_ fCol_ nCols_ width_ ifCSV_ ifPrintRow_ sepString_ { slice 1 } } public method saveVecToASCII {name_ n_ fRow_ nRows_ fCol_ nCols_ colName_ ifCSV_ ifPrintRow_ sepString_ ifVariableVec_} public method getKeyword {keyword_} public method insertCol {index_ ttype_ tform_} public method insertRow {index_ nRows_} public method getHDUtype { hdu } public method getNumHdus { } public method getOrigName {} public method changeFile {} public method unchangeFile {} public method isFileChanged {} public method loadImageMeanCols {fCol_ lCol_ slice_} public method loadImageMeanRows {fRow_ lRow_ slice_} public method updateChecksum { {forceUpdate_ 0} } public method verifyChecksum {} public method redrawHighLight {} # private member # 1=readonly, 0=read/write private variable _fileMode private variable _isChanged 0 private variable _numExts private variable _isFtp 0 private variable _isHttp 0 # either this FitsFile represents the original file, or it's a draft copy private variable _isOriginalFile 1 # this variable is only set (in constructor) # note _origFileObj = "" if and only if _isOriginalFile is true private variable _origFileObj "" private variable _ftp_user private variable _ftp_pass private variable _ftp_file # called by the constructor private method _createFileHighlightWindow {} private method _redrawHighLight {} # called by _createFileHighlightWindow and _redrawHighLight private method _drawContent {} # checks to make sure file is open, returns error if not private method _isOpen {} private method _getNumHdus {} # both open and close the fitsfile class variable private method _openFitsFile {} private method _closeFitsFile {} private method _ftpFile {fname_ saveAs_} private method _fetchFile {} private method _deleteHDUs {} private method _copyHDUs {} private method _pasteHDUs {} private method _writeHDUsToClipBoard {ifDelete_} private method _isHDUSelected {} private method _isImgSelected {} private method _isThereImgExt {} private method _isTblSelected {} private method _appendNewHDU {} private method _postMenus {} private method _smoothImgs {} private method _smoothOK {} private method _plotHDUs {} # whether an extension's check box button is on or off private variable _extCheck # data of all the extension ($i,fieldname) private variable _extData private variable _openExtraTable 0 private method _setNewTable { flag_ } private variable closeCmdSave "NOTYET" } itcl::body FitsFile::constructor {args} { global g_listObjs global isWin set fitsfile "" set opened 0 set filename [lindex $args 0] set _fileMode [lindex $args 1] # Build full path to filename set rName [urlTail $filename] set dName [getFullDirPath $filename] set filename "${dName}${rName}" set _oldName $filename set filename [_transformFileName $filename] if { $isWin } { # Must change all \'s to /'s to avoid problems with escape chars regsub -all "\\\\" $filename "/" filename } # BACKUP if { [llength $args] == 3 } { set _isOriginalFile 0 # This indicates we want to work with a backup of the original file # see FitsExtension::constructor for when this is called # because when we open a header editor window, the constructor # opens a new scratch fFile (namely this one) with the original fFile # as this one's backup, hence we call it the _origFileObj # # the call from FitsExtension::constructor is: # # set fFile [FitsFile #auto $fileName $fMode $_fatherFitsFile] # where _fatherFitsFile is the original FitsFile object # and this constructor is creating as a new scratch version of # _origFileObj = $_fatherFitsFile in declaration set _origFileObj [lindex $args 2] set openedFileName [lindex $args 0] if { $_fileMode == 0 } { set openedFileName [$_origFileObj getBackup] } # this doesn't do much besides open $filename and set $fitsfile _openFitsFile # ORIGINAL } else { _fetchFile # note this is *not* done in the backup case above lappend g_listObjs $this set _myExtensionChildren {} set _myExtNums {} set isMaster 1 # most of the work is done here # note _openFitsFile is called within _createFileHighlightWindow _createFileHighlightWindow update idletasks if { $fvPref::ifAutoPlotPrimary } { _openFitsFile moveToHDU 1 set dims [getImgInfo] _closeFitsFile if { [llength $dims] == 2 } { plotData 1 } } } } itcl::body FitsFile::destructor {} { global g_listObjs global g_backupDir if { $isMaster } { set pos [lsearch $g_listObjs $this] if { $pos != -1 } { set g_listObjs [lreplace $g_listObjs $pos $pos] } # Get location of this file in the native format, so that we can # do a valid string comparison set nativeBackupDir [file nativename $g_backupDir] set nativeOpenedDir [file nativename [file dir $openedFileName]] if { $nativeOpenedDir == $nativeBackupDir } { # File viewed/editted or FTP/HTTP file copied catch {_closeFitsFile} err # catch { fits close $openedFileName } err file delete \"$openedFileName\" } destroy $_fhl } else { # This is an extension file handler... close and exit if { $_isChanged } { writeHisKey updateChecksum } if { [catch {_closeFitsFile} err] } { puts $err } } } itcl::body FitsFile::_transformFileName { name } { set inputName $name regsub -all \\( "$name" _ name regsub -all \\) "$name" _ name set newName $name set _createTransformDirectory false if { $_oldName != $newName } { set newdir [file dirname $newName] if ![file exists $newdir] { set errorFlag [ catch { file mkdir $newdir } err] if { $errorFlag } { error "fv does not supported file name with '(' or ')' in it." } else { set _createTransformDirectory true } } set newName [format "%s_%s" $newName [clock seconds]] file rename "$inputName" $newName } return $newName } itcl::body FitsFile::_isEmptyDir { dir } { set filenames [glob -nocomplain -tails -directory $dir * .*] return [expr {![llength [lsearch -all -not -regexp $filenames {^\.\.?$}]]}] } itcl::body FitsFile::_reverseTransformedFileName { name } { if { $_oldName != $name && [file exists $name] } { file rename $name $_oldName } if { [_isEmptyDir [file dirname $name]] == 1 } { file delete [file dirname $name] } return } # creates the "fv: Summary of blah.fit in /blahdir" window # itcl::body FitsFile::_createFileHighlightWindow {} { global isMac isWin global g_titleFont # file highlight window - _fhl set _fhl ._fhl_[namespace tail $this] # see pow for documentation powToplevel $_fhl .dummy # report to fvwinkeeper .fvwinkeeper register $_fhl "Highlight" [urlTail $filename] 0 $this if { $isMac } { set cmdkey "Cmd" } else { set cmdkey "Alt" } # registers tells $_fhl to close by calling closeCmd wm protocol $_fhl WM_DELETE_WINDOW [itcl::code $this closeCmd] bind $_fhl <> [itcl::code $this save] bind $_fhl <> [itcl::code $this saveAs] bind $_fhl <> [itcl::code $this saveHDUsAs] bind $_fhl <> [itcl::code $this saveHDUsAsText] bind $_fhl <> [itcl::code $this revertFile] bind $_fhl <> [itcl::code $this closeCmd] bind $_fhl <> [itcl::code $this _copyHDUs] bind $_fhl <> [itcl::code $this _deleteHDUs] bind $_fhl <> [itcl::code $this _pasteHDUs] bind $_fhl <> [itcl::code $this _smoothImgs] bind $_fhl <> [itcl::code $this _plotHDUs] bind $_fhl <> [itcl::code $this _appendNewHDU] bind $_fhl <> [itcl::code $this _postMenus] bind $_fhl [itcl::code $this _reverseTransformedFileName $filename] # Create toplevel MenuBar # (Macs get one common menubar for each window type... finite number of cascade menus allowed.) if { $isMac } { set _mBar .mbar.summary set evtWndw "" } else { set _mBar $_fhl.mbar set evtWndw $_fhl } $_fhl config -menu $_mBar if { ![winfo exists $_mBar] } { menu $_mBar -font g_titleFont if { $isMac } { $_mBar add cascade -menu $_mBar.apple $_mBar add cascade -menu $_mBar.file -label File $_mBar add cascade -menu $_mBar.edit -label Edit $_mBar add cascade -menu $_mBar.tools -label Tools $_mBar add cascade -menu .mbar.wind -label Windows $_mBar add cascade -menu $_mBar.help -label Help # APPLE menu buildAppleStyleMenu $_mBar.apple } else { $_mBar add cascade -menu $_mBar.file -label File $_mBar add cascade -menu $_mBar.edit -label Edit $_mBar add cascade -menu $_mBar.tools -label Tools $_mBar add cascade -menu $_mBar.help -label Help } # FILE menu buildFileMenu $_mBar.file $_mBar.file entryconfig "Export" -label "Export HDUs..." $_mBar.file entryconfig "ExportAs" -label "Make HDU Listing..." -state normal $_mBar.file entryconfig "Save As..." -state normal $_mBar.file entryconfig "Close" -state normal # EDIT menu buildEditMenu $_mBar.edit $_mBar.edit entryconfigure "Copy" -label "Copy HDUs" $_mBar.edit entryconfigure "Cut" -label "Cut HDUs" $_mBar.edit entryconfigure "Paste" -label "Paste HDUs" $_mBar.edit insert "Prefer*" command -label "New Extension..." \ -font g_titleFont \ -underline 4 -accelerator "$cmdkey+E" \ -command "doMenuEvent <>" $_mBar.edit insert "Prefer*" separator # Tools menu buildToolsMenu $_mBar.tools $_mBar.tools entryconfigure "Smooth" -label "Smooth Image" $_mBar.tools entryconfigure "Plot" -label "Plot" # HELP menu buildHelpMenu $_mBar.help fileSummary "File Summary" # Configure the Post Commands if { $isMac || $isWin } { # The Mac and Windows post all menus at once, so we only need # to do the post on the top level $_mBar configure -postcommand "doMenuEvent <> $evtWndw" } else { # Unix has to post each individual menu $_mBar.file configure -postcommand \ "doMenuEvent <> $evtWndw" $_mBar.edit configure -postcommand \ "doMenuEvent <> $evtWndw" $_mBar.tools configure -postcommand \ "doMenuEvent <> $evtWndw" } } frame $_fhl.fsep -height 3 -relief raised -borderwidth 1 frame $_fhl.labelframe label $_fhl.labelframe.findex -text Index -width 9 -justify center -font g_titleFont label $_fhl.labelframe.fextName -text Extension -width 16 -justify center -font g_titleFont label $_fhl.labelframe.ftype -text Type -width 8 -justify center -font g_titleFont label $_fhl.labelframe.fdims -text Dimension -width 30 -justify center -font g_titleFont label $_fhl.labelframe.fbut -text View -width 25 -justify center -font g_titleFont label $_fhl.labelframe.fspace -text "" -width 7 -justify center -font g_titleFont # grid config $_fhl.labelframe -column 0 -row 1 -columnspan 7 -sticky "nw" grid config $_fhl.labelframe -column 0 -row 1 -columnspan 7 -sticky "nw" grid config $_fhl.fsep -column 0 -row 2 -columnspan 7 -sticky "nw" grid config $_fhl.labelframe.findex -column 0 -row 0 -sticky "nw" grid config $_fhl.labelframe.fextName -column 1 -row 0 -sticky "news" grid config $_fhl.labelframe.ftype -column 2 -row 0 -sticky "nw" grid config $_fhl.labelframe.fdims -column 3 -row 0 -sticky "nw" grid config $_fhl.labelframe.fbut -column 4 -row 0 -sticky "nw" -columnspan 3 grid config $_fhl.labelframe.fspace -column 7 -row 0 -sticky "nw" iwidgets::scrolledframe $_fhl.contentframe -relief ridge -borderwidth 2 \ -vscrollmode dynamic -hscrollmode none grid config $_fhl.contentframe -column 0 -row 3 -columnspan 7 -sticky "snew" grid rowconfigure $_fhl 3 -weight 5 grid columnconfigure $_fhl 0 -weight 5 # expand text entry grid columnconfigure $_fhl.labelframe 1 -weight 5 # make sure all children of contentframe are also moveable # noted these are hardcoded by system .lwchildsite.clipper.canvas set _subwin [$_fhl.contentframe childsite] _openFitsFile _drawContent _closeFitsFile grid columnconfigure $_fhl.contentframe 0 -weight 5 grid config $_fhl.contentframe.lwchildsite -sticky "news" grid columnconfigure $_fhl.contentframe.lwchildsite 0 -weight 5 grid config $_fhl.contentframe.lwchildsite.clipper -sticky "news" grid columnconfigure $_fhl.contentframe.lwchildsite.clipper 0 -weight 5 grid config $_fhl.contentframe.lwchildsite.clipper.canvas -sticky "news" grid columnconfigure $_fhl.contentframe.lwchildsite.clipper.canvas 0 -weight 5 #grid config $_subwin -sticky "news" #ziqin } itcl::body FitsFile::getNumHdus { } { return $_numExts } itcl::body FitsFile::_drawContent { } { global isWin isMac global _buttonDivider global g_titleFont set rName [urlTail $filename] set dName [getFullDirPath $filename] wm title $_fhl "fv: Summary of [file tail $_oldName] in $dName" set nhdus [_getNumHdus] set _numExts $nhdus if { $isMac } { set btnRelief flat } else { set btnRelief raised } set textMaxLength -99 for {set i 1} {$i <= $nhdus} {incr i} { set tableFlag false catch {moveToHDU $i} err set _extData($i,dims) "0" if { $i == 1 } { set _extData($i,extName) Primary set _extData($i,type) Image set dimsl [getImgInfo] set ndims [llength $dimsl] if { $ndims != 0 } { set _extData($i,dims) [lindex $dimsl 0] for {set k 1} { $k < $ndims } {incr k} { set tmpDim [lindex $dimsl $k] append _extData($i,dims) " X $tmpDim" } } } else { if { [catch { set _extData($i,extName) \ [lindex [join [getKeyword EXTNAME]] 1] } ] } { set _extData($i,extName) "NoName" } else { set _extData($i,extName) [string trim $_extData($i,extName) {' }] } set _extData($i,type) [lindex [join [getTableInfo hdutype]] 0] if { ($_extData($i,type) == "Binary") || ($_extData($i,type) == "ASCII") } { set tableFlag true set _extData($i,nrows) [getTableInfo nrows] set _extData($i,ncols) [getTableInfo ncols] set _extData($i,colList) [getTableInfo column] set _extData($i,dims) "$_extData($i,ncols) cols" append _extData($i,dims) " X $_extData($i,nrows) rows" } else { set dimsl [getImgInfo] set ndims [llength $dimsl ] if { $ndims != 0 } { set _extData($i,dims) [lindex $dimsl 0] for {set k 1} { $k < $ndims } {incr k} { set tmpDim [lindex $dimsl $k] append _extData($i,dims) " X $tmpDim" } } } } set currentTextMaxLength [expr [string length $_extData($i,extName)] + 10] if { $textMaxLength < $currentTextMaxLength } { set textMaxLength $currentTextMaxLength } checkbutton $_subwin.index$i -text [expr $i-1] -width 6 \ -variable [itcl::scope _extCheck($i)] \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black -activebackground $fvPref::globalBgColor \ -justify center -font g_titleFont label $_subwin.extName$i -text $_extData($i,extName) \ -width $textMaxLength \ -justify center -font g_titleFont label $_subwin.type$i -text $_extData($i,type) -width 8 \ -justify center -font g_titleFont label $_subwin.dims$i -text $_extData($i,dims) -width 30 \ -justify center -font g_titleFont button $_subwin.kwds$i -text "Header" \ -borderwidth 2 -relief $btnRelief -width 5 \ -command [itcl::code $this openHeader $i] -font g_titleFont button $_subwin.img$i -text "Hist" \ -borderwidth 2 -relief $btnRelief -width 2 \ -command [itcl::code $this callHistogram $i false ] -font g_titleFont button $_subwin.plot$i -text "Plot" \ -borderwidth 2 -relief $btnRelief -width 4 \ -command [itcl::code $this plotData $i] -font g_titleFont # -command [itcl::code $this plotData1 $i] -font g_titleFont button $_subwin.tab$i -text "All" \ -borderwidth 2 -relief $btnRelief -width 6 \ -command [itcl::code $this openTable $i] -font g_titleFont button $_subwin.selcol$i -text "Select" -font g_titleFont \ -borderwidth 2 -relief $btnRelief -width 5 \ -command [itcl::code $this openTable $i] set errorFlag [ catch { set imgDim [getImgInfo] } err ] set noSelColFlag true set xyFlag false if { $errorFlag } { set noSelColFlag false } if { ($_extData($i,type) != "Binary") && ($_extData($i,type) != "ASCII") } { if { [regexp X $_extData($i,dims)] } { $_subwin.plot$i config -text "Image" -width 4 } # else if image is 1-d (no "X") then the mid button should say "Plot" # if image is empty, disable the image/table buttons if { $_extData($i,dims) == 0 } { $_subwin.plot$i config -text "Image" -width 4 $_subwin.plot$i configure -state disabled $_subwin.tab$i configure -state disabled -text "Table" set noSelColFlag true } } else { # check if x and y are presented in column name list set xyFlag [checkXYCol $i] } bind $_subwin.selcol$i \ "[itcl::code $this _setNewTable 1]; tk::ButtonUp %W" if { $isMac } { bind $_subwin.selcol$i { tk::ButtonDown %W } bind $_subwin.selcol$i \ "[itcl::code $this _setNewTable 1]; tk::ButtonUp %W" } set colIdx 0 grid config $_subwin.index$i -column $colIdx -row [expr $i] -sticky "nw" incr colIdx grid config $_subwin.extName$i -column $colIdx -row [expr $i] -sticky "new" set textCol $colIdx incr colIdx grid config $_subwin.type$i -column $colIdx -row [expr $i] -sticky "nw" incr colIdx grid config $_subwin.dims$i -column $colIdx -row [expr $i] -sticky "nw" incr colIdx grid config $_subwin.kwds$i -column $colIdx -row [expr $i] -sticky "nw" incr colIdx if { $tableFlag == "true" } { $_fhl.labelframe.fbut configure -width 35 if { $xyFlag == "true" } { $_subwin.img$i configure -command [itcl::code $this callHistogram $i true] } grid config $_subwin.img$i -column $colIdx -row [expr $i] -sticky "nesw" incr colIdx $_subwin.plot$i configure -width 2 grid config $_subwin.plot$i -column $colIdx -row [expr $i] -sticky "snew" incr colIdx } else { grid config $_subwin.plot$i -column $colIdx -row [expr $i] -sticky "snew" -columnspan 2 set colIdx [expr $colIdx + 2] } if { $noSelColFlag == "false" } { $_subwin.tab$i configure -width 2 grid config $_subwin.tab$i -column $colIdx -row [expr $i] -sticky "nsew" incr colIdx grid config $_subwin.selcol$i -column $colIdx -row [expr $i] -sticky "nsew" } else { $_subwin.tab$i configure -text "Table" grid config $_subwin.tab$i -column $colIdx -row [expr $i] -sticky "wnes" -columnspan 2 } } # expand text entry $_fhl.labelframe.fextName configure -width $textMaxLength grid columnconfigure $_subwin $textCol -weight 5 set lineHeight [expr [winfo reqheight $_subwin.tab1] ] if { $_numExts <= 10} { $_fhl.labelframe.fspace configure -width 3 $_fhl.contentframe configure -height [expr 10 + $_numExts*$lineHeight] } else { $_fhl.contentframe configure -height [expr 10 + 10*$lineHeight] } } itcl::body FitsFile::_fetchFile {} { global g_backupDir global isWin isMac ##### # Copy FTP and HTTP files to backup directory for accessing ##### # FTP FILE if { [string range $filename 0 5] == "ftp://" } { # Handle FTP files set _isFtp 1 # Make copy and check that the name is unique set cnt 0 set endName [urlTail $filename] set openedFileName [file join ${g_backupDir} $endName] while { [file exists $openedFileName] } { incr cnt set openedFileName [file join $g_backupDir f${cnt}_$endName] } # Copy ftp file using RemoteClass ftp method, rather than # leave it to CFITSIO, which doesn't have drivers for Windows _ftpFile $filename $openedFileName # HTTP FILE } elseif { [string range $filename 0 6] == "http://" } { # Handle HTTP files set _isHttp 1 # Make copy, but check that the name is unique set cnt 0 set endName [urlTail $filename] set openedFileName [file join ${g_backupDir} $endName] while { [file exists $openedFileName] } { incr cnt set openedFileName [file join ${g_backupDir} h${cnt}_$endName] } set tmpFileName ${filename}\($openedFileName\) # not sure what the purpose of this is set f [fits open $tmpFileName] $f close # ORDINARY DISK FILE } else { set openedFileName $filename } if { $isWin } { set filePermission [file attributes $openedFileName -system] } elseif { $isMac } { set filePermissions "" } else { set filePermission [file attributes $openedFileName -permissions] } } itcl::body FitsFile::_ftpFile { fname_ saveAs_ } { global g_backupDir set ftpC ftp_[namespace tail $this] RemoteClass $ftpC # Decode this file syntax: "ftp://userName:passwd@host/path/file.fits" set fname_ [string range $fname_ 6 end] set idx [string first "/" $fname_] if { $idx == -1 || [string range $fname_ end end] == "/" } { # Not pointing to a file... error out error "File name points to a host or directory, not a file" } set path [string range $fname_ $idx end] incr idx -1 set loginInfo [string range $fname_ 0 $idx] set idx [string last "/" $path] set file [string range $path [expr $idx+1] end] set path [string range "$path" 1 [expr $idx-1]] set idx [string last "@" $loginInfo] if { $idx == -1 } { set host $loginInfo set user anonymous set pass "fv@fv.gsfc.nasa.gov" } else { set host [string range $loginInfo [expr $idx+1] end] set user [string range $loginInfo 0 [expr $idx-1]] set idx [string first ":" $user] if { $idx == -1 } { set pass "fv@fv.gsfc.nasa.gov" } else { set pass [string range $user [expr $idx+1] end] set user [string range $user 0 [expr $idx-1]] } } $ftpC openConn $host $user $pass $ftpC cd $path if { ![$ftpC get ${file} $saveAs_] } { itcl::delete object $ftpC error "Unable to copy $file to local disk" } itcl::delete object $ftpC # save FTP information for later set _ftp_user $user set _ftp_pass $pass if { $path == "" } { set _ftp_file "${host}/${file}" } else { set _ftp_file "${host}/${path}/${file}" } if { $user == "anonymous" } { set filename "ftp://${_ftp_file}" } else { set filename "ftp://${user}@${_ftp_file}" } } ## actually opens $filename and sets $fitsfile # itcl::body FitsFile::_openFitsFile {} { if { $isMaster || $isFailedToCopy } { # Read ONLY set rw 0 } else { set rw 1 } if { [string first "ftp:" $filename] >= 0 } { set rw 0 } set errorFlag [ catch { set fitsfile [fits open "$openedFileName" $rw] } err ] if { $errorFlag } { if { $rw == 1 } { set rw 0 } elseif { $rw == 0 } { set rw 0 } set errorFlag [ catch { set fitsfile [fits open "$openedFileName" $rw] } err ] if { $errorFlag } { error "Cannot open file: $openedFileName, error: $err" } } set opened 1 } ## argh -- poorly documented method!! # itcl::body FitsFile::getBackup {} { global g_backupDir global isWin isMac # Get location of this file in the native format, so that we can # do a valid string comparison... do not create backup if opened # file is already in the backup directory... eg, histogram set nativeBackupDir [file nativename $g_backupDir] set nativeOpenedDir [file nativename [file dir $openedFileName]] if { $openedFileName == $filename && !$_isFtp && !$_isHttp \ && $nativeOpenedDir != $nativeBackupDir } { set root [file rootname [urlTail $filename]] set ext [file extension $filename] # make the filename "." and ":" free for Win32 regsub -all ":|\\." $root "_" tmpFileName # Make sure the name is unique set cnt 0 set backupfilename [file join ${g_backupDir} ${tmpFileName}$ext] while { [file exists $backupfilename] } { incr cnt set backupfilename [file join ${g_backupDir} b${cnt}_${tmpFileName}$ext] } # Try to make a copy in the g_backupDir # If a compressed file, use CFITSIO to copy/uncompress if { [isFits $filename] == 2 } { set fName "${filename}(${backupfilename})" set errFlag [catch {set f [fits open $fName 0]} err] if { !$errFlag } {$f close} } else { set errFlag [catch {file copy $filename $backupfilename} err] } if { $errFlag } { set _fileMode 1 set isFailedToCopy 1 puts "Error: $err" puts "Cannot make backup, please set FVTMP to some place" puts "which has bigger disk space. Open as readonly this time." } else { # chmod to 666 for read and write if { $isWin || $isMac } { file attributes $backupfilename -readonly 0 } else { # most common situation file attributes $backupfilename -permissions 00666 } # most common situation set openedFileName $backupfilename } } return $openedFileName } itcl::body FitsFile::_closeFitsFile {} { if { [catch {$fitsfile close} error] == 1 } { error $error } set opened 0 set _loaded 0 } itcl::body FitsFile::countChanged {} { # Count number of extensions changed set nChanged 0 foreach child $_myExtensionChildren { set childFObj ::FitsExtension::[$child cget -fFile] if { [$childFObj isFileChanged] } { incr nChanged } } return $nChanged } itcl::body FitsFile::save {} { global isWin isMac g_backupDir global g_fileIsClosing if { ![isFileChanged] } return if { !$_isOriginalFile } { set nChanged [$_origFileObj countChanged] if { $nChanged > 1 } { set feedback [promptMsg "WARNING: This will save changes made\ to multiple extensions. Continue?" \ return Yes No] if { $feedback == "CANCEL" } return } $_origFileObj save return } if { [string first $g_backupDir $filename] >= 0 } { # current file is created out of original file and it is in the temp directory set result [saveAs] if { $result == "NOTSAVE" } return } # Update/flush each subordinate FITS file still opened foreach child $_myExtensionChildren { set childFObj ::FitsExtension::[$child cget -fFile] if { [$childFObj isFileChanged] } { $childFObj writeHisKey $childFObj updateChecksum $childFObj flush noClear $child updateDisps "" } } # Try to make a backup if ![info exists g_fileIsClosing] { if { [catch {file copy -force $filename $filename~} err] } { puts "Warning: cannot make a backup of the original file:\n $err" } # Copy file if { [catch {file copy -force $openedFileName $filename} err ] } { error $err return } } unchangeFile # copy permissions of original if { $isWin } { file attributes $filename -system $filePermission } elseif { $isMac } { # Make file fvEd/FITS type file attributes $filename -creator "fvEd" -type "FITS" } else { file attributes $filename -permissions $filePermission } _redrawHighLight } itcl::body FitsFile::saveHDUsAsText { {saveFileName_ ""} } { global isWin isMac if { !$_isOriginalFile } { $_origFileObj saveAs $saveFileName_ return } if { $saveFileName_ == "" } { set t [urlTail $filename] set r [file root $t] set e [file ext $t] if { [lsearch -exact [list .gz .Z .z] $e] != -1 } { set e [file ext $r] set r [file root $r] } set sugName "${r}_hdu.txt" set saveFileName_ [getSelectedFileName $sugName] if { $saveFileName_ == "" } return if { [file exist $saveFileName_] } { set feedback [promptMsg "File $saveFileName_ exists\n overwrite?" \ return Yes No] if { $feedback == "CANCEL" } return } } set f [open $saveFileName_ "w"] puts $f [format "%-5s %-30s %-10s %-20s" Index Extension Type Dimension] puts $f [format "%-5s %-30s %-10s %-20s" "=====" \ "==============================" \ "==========" \ "===================="] for {set i 1} {$i <= $_numExts} {incr i} { puts $f [format "%-5s %-30s %-10s %-20s" $i $_extData($i,extName) $_extData($i,type) $_extData($i,dims)] } close $f # copy permissions of original, but make read/write if { $isWin } { file attributes $saveFileName_ -system $filePermission file attributes $saveFileName_ -readonly 0 set filePermission [file attributes $saveFileName_ -system] } elseif { $isMac } { # Make file fvEd/FITS type file attributes $saveFileName_ -creator "fvEd" -type "FITS" } else { set filePermission "006[string range $filePermission 3 end]" file attributes $saveFileName_ -permissions $filePermission } set filename $saveFileName_ .fvwinkeeper signoff $_fhl .fvwinkeeper register $_fhl "Highlight" [urlTail $filename] 0 $this set _fileMode 0 foreach child $_myExtensionChildren { $child setFileName $filename } _redrawHighLight } itcl::body FitsFile::saveAs { {saveFileName_ ""} } { global isWin isMac # This function should be called only from the Master FitsFile # PDW 2000/11/16: SaveAs does exist in Mac File menu, so this # needs to work there, too, so pass it to _origFileObj if { !$_isOriginalFile } { $_origFileObj saveAs $saveFileName_ return } if { $saveFileName_ == "" } { set t [urlTail $filename] set r [file root $t] set e [file ext $t] if { [lsearch -exact [list .gz .Z .z] $e] != -1 } { set e [file ext $r] set r [file root $r] } set sugName "${r}_2${e}" set saveFileName_ [getSelectedFileName $sugName] if { $saveFileName_ == "" } { return NOTSAVE } if { [file exist $saveFileName_] } { set feedback [promptMsg "File $saveFileName_ exists\n overwrite?" \ return Yes No] if { $feedback == "CANCEL" } { return NOTSAVE } } } # Update/flush each subordinate FITS file still opened foreach child $_myExtensionChildren { set childFObj ::FitsExtension::[$child cget -fFile] if { [$childFObj isFileChanged] } { $childFObj writeHisKey $childFObj updateChecksum $childFObj flush noClear } } file copy -force $openedFileName $saveFileName_ unchangeFile # copy permissions of original, but make read/write if { $isWin } { file attributes $saveFileName_ -system $filePermission file attributes $saveFileName_ -readonly 0 set filePermission [file attributes $saveFileName_ -system] } elseif { $isMac } { # Make file fvEd/FITS type file attributes $saveFileName_ -creator "fvEd" -type "FITS" } else { set filePermission "006[string range $filePermission 3 end]" file attributes $saveFileName_ -permissions $filePermission } set filename $saveFileName_ .fvwinkeeper signoff $_fhl .fvwinkeeper register $_fhl "Highlight" [urlTail $filename] 0 $this set _fileMode 0 foreach child $_myExtensionChildren { $child setFileName $filename } _redrawHighLight wm title $_fhl "fv: Summary of [file tail $saveFileName_] in [file dirname $saveFileName_]" return [file tail $saveFileName_] } itcl::body FitsFile::saveCHDUAs {ext} { global isWin isMac set t [urlTail $filename] set r [file root $t] set e [file ext $t] if { [lsearch -exact [list .gz .Z .z] $e] != -1 } { set e [file ext $r] set r [file root $r] } set sugName "${r}_hdu${e}" set saveFileName [getSelectedFileName $sugName] if { $saveFileName == "" } return if { [file exist $saveFileName] } { set feedback [promptMsg "File $saveFileName exists\n overwrite?" \ return Yes No] if { $feedback == "CANCEL" } return } file delete \"$saveFileName\" set tmpfits [fits open $saveFileName 2 tmpfits] $tmpfits put ihd -p $tmpfits close set tmpfitsfile [fits open $openedFileName 0] set nhdus [$tmpfitsfile info nhdu] set _extCheck(2) 1 for {set i 1} {$i <= $nhdus} {incr i} { if { $_extCheck($i) } { # means to move to current HDU $tmpfitsfile move $i if { $_extData($i,extName) == "Primary" } { $tmpfitsfile copy $saveFileName } else { $tmpfitsfile append $saveFileName } } set _extCheck($i) 0 } $tmpfitsfile close # copy permissions of original but make writeable if { $isWin } { file attributes $saveFileName -system $filePermission file attributes $saveFileName -readonly 0 set filePermission [file attributes $saveFileName -system] } elseif { $isMac } { # Make file fvEd/FITS type file attributes $saveFileName -creator "fvEd" -type "FITS" } else { set filePermission "006[string range $filePermission 3 end]" file attributes $saveFileName -permissions $filePermission } } itcl::body FitsFile::saveHDUsAs {} { global isWin isMac if { ![_isHDUSelected] } { error "Please select HDU first" return } set t [urlTail $filename] set r [file root $t] set e [file ext $t] if { [lsearch -exact [list .gz .Z .z] $e] != -1 } { set e [file ext $r] set r [file root $r] } set sugName "${r}_hdu${e}" set saveFileName [getSelectedFileName $sugName] if { $saveFileName == "" } return if { [file exist $saveFileName] } { set feedback [promptMsg "File $saveFileName exists\n overwrite?" \ return Yes No] if { $feedback == "CANCEL" } return } file delete \"$saveFileName\" set tmpfits [fits open $saveFileName 2 tmpfits] $tmpfits put ihd -p $tmpfits close set tmpfitsfile [fits open $openedFileName 0] set nhdus [$tmpfitsfile info nhdu] for {set i 1} {$i <= $nhdus} {incr i} { if { $_extCheck($i) } { # means to move to current HDU $tmpfitsfile move $i if { $_extData($i,extName) == "Primary" } { $tmpfitsfile copy $saveFileName } else { $tmpfitsfile append $saveFileName } } set _extCheck($i) 0 } $tmpfitsfile close # copy permissions of original but make writeable if { $isWin } { file attributes $saveFileName -system $filePermission file attributes $saveFileName -readonly 0 set filePermission [file attributes $saveFileName -system] } elseif { $isMac } { # Make file fvEd/FITS type file attributes $saveFileName -creator "fvEd" -type "FITS" } else { set filePermission "006[string range $filePermission 3 end]" file attributes $saveFileName -permissions $filePermission } } itcl::body FitsFile::flush {isClear_} { if { $isClear_ == "clear"} { $fitsfile flush clear } else { $fitsfile flush } } itcl::body FitsFile::revertFile {} { if { ![isFileChanged] } return set feedback [promptMsg \ "All changes since last save will be lost. Continue?" \ return Yes No] if {$feedback == "CANCEL"} return cleanChild if { $filename != $openedFileName } { file delete \"$openedFileName\" } if { $_isFtp } { # Must reconstruct original filename set filename "ftp://${_ftp_user}:${_ftp_pass}@${_ftp_file}" } _fetchFile unchangeFile _redrawHighLight } itcl::body FitsFile::writeHisKey {} { global env global isWin # write the HISTORY keyword if { $fvPref::ifWriteHisKey == 1 && [isFileChanged] && !$_isOriginalFile } { set date [clock format [clock seconds] \ -format %Y-%m-%dT%H:%M:%S] # Search through the various enviroment variables for a user name if { [info exists env(USER)] } { set uname $env(USER) } elseif { [info exists env(USERNAME)] } { set uname $env(USERNAME) } elseif { [info exists env(LOGNAME)] } { set uname $env(LOGNAME) } else { set uname "???" } putHis "File modified by user \'$uname\' with fv on $date" } } # the following methods are wrappers around $fitsfile, which is a FitsTcl object # all fv code uses these wrappers with two exceptions # (1) $fitsfile load iblock # (2) $fitsfile load tblock # in both cases, the local code's $fitsfile will create a local 2d Tcl Array # since Tcl does not pass arrays, we cannot create the arrays here in FitsFile # instead, the array is created locally and the local code grabs $fitsfile from here, # which is why FitsFile keeps $fitsfile as a public variable itcl::body FitsFile::_getNumHdus {} { _isOpen $fitsfile info nhdu } itcl::body FitsFile::getTableInfo {name_} { $fitsfile info $name_ } itcl::body FitsFile::getColInfo {colName_} { $fitsfile info column -exact $colName_ } # unclear what it returns since it's not documented in fitsTcl itcl::body FitsFile::getExprInfo {expr_} { $fitsfile info expr $expr_ } itcl::body FitsFile::getImgInfo {} { $fitsfile info imgdim } itcl::body FitsFile::getImgType {} { $fitsfile info imgType } itcl::body FitsFile::moveToHDU {numHDU_} { # change the currentHDU to numHDU_ _isOpen if { [catch {$fitsfile move $numHDU_} ] == 1 } { error "Cannot access HDU extension [expr $numHDU_ -1]. Does the file still exist?" return } else { set currentHDU $numHDU_ } } itcl::body FitsFile::getcolblock {col_ rowrange_} { _isOpen if { [catch { set x [$fitsfile get table -c -noformat $col_ $rowrange_] } err] } { puts "Cannot read table block of column $col_: $err" return {} } return $x } itcl::body FitsFile::getKeyword {keyword} { # get $keyword _isOpen $fitsfile get keyword ^$keyword\$ } itcl::body FitsFile::getWcs {{dest {}} {RAColNum_ {}} {DecColNum_ {}} } { _isOpen if { $RAColNum_ == "" || $DecColNum_ == "" } { if { [catch {set wcs [$fitsfile get wcs -m $dest]} err] } { return "" } else { return $wcs } } else { set wcs [$fitsfile get wcs -m $dest $RAColNum_ $DecColNum_] return $wcs } } itcl::body FitsFile::getKeywords {keywords_} { # return a list of all the values for $keywords_ set values {} _isOpen set currentHDU [$fitsfile info chdu] set curext 0 for {set i 1} {$i <= [llength $keywords_]} {incr i} { set retval([lindex $keywords_ [expr $i-1]]) {} } < while {1} { incr curext if {[catch {moveToHDU $curext}]} { #we're done. break } for {set i 1} {$i <= [llength $keywords_]} {incr i} { set keyword [lindex $keywords_ [expr $i-1]] if {[catch {getKeyword $keyword} result]} { # didn't find it continue } set result [lindex [lindex $result 0] 1] set result [string trim $result '] set result [string trim $result] set retval($keyword) [concat $retval($keyword) \ [list $result]] set values [concat $values [list $result]] } } moveToHDU $currentHDU set values {} for {set i 1} {$i <= [llength $keywords_]} {incr i} { set values [concat $values \ [list $retval([lindex $keywords_ [expr $i-1]])]] } return $values } itcl::body FitsFile::dumpHeader {} { _isOpen set header [$fitsfile dump -e] return $header # header is a string separated by newline characters } itcl::body FitsFile::_isOpen {} { if {$opened == 0} { error "FitsFile $this : $filename not open" } } itcl::body FitsFile::isReadOnly {} { if { $_isOriginalFile } { # 1 means readonly, 0 means read/write return $_fileMode } else { return [$_origFileObj isReadOnly] } } itcl::body FitsFile::closeCmd { {force_ 0} } { global env global fvHOME global g_fileIsClosing global notSaveAll # Check for modifications needing saving set g_fileIsClosing 1 if { [isFileChanged] } { if { $_isFtp || $_isHttp || [isReadOnly] } { set cmd [itcl::code $this saveAs] } else { set cmd [itcl::code $this save] } if { $force_ } { set cTxt "None" } else { set cTxt "Cancel" } if { [string first $env($fvHOME) $filename] > 0 } { } else { if ![info exists notSaveAll] { set feedback [promptMsg \ "File $filename has changed.\n\ Do you want to save the file before closing?" \ $cmd Yes $cTxt "No to All"] if {!$force_ && $feedback == "BREAK"} { return 1 } if { $feedback != "CANCEL" } { # Pan Chai: pop up directory list to save the file saveAs } } } } cleanChild .fvwinkeeper signoff $_fhl itcl::delete object $this unset g_fileIsClosing return 0 } itcl::body FitsFile::cleanChild {} { foreach child $_myExtensionChildren { $child closeCmd } } itcl::body FitsFile::_postMenus {} { global isMac if { [isFileChanged] } { if { [isReadOnly] } { $_mBar.file entryconfigure Save -state disabled } else { $_mBar.file entryconfigure Save -state normal } $_mBar.file entryconfigure Revert -state normal } else { $_mBar.file entryconfigure Save -state disabled $_mBar.file entryconfigure Revert -state disabled } if { [_isHDUSelected] } { $_mBar.file entryconfigure "Export*" -state normal $_mBar.edit entryconfigure "Copy*" -state normal $_mBar.edit entryconfigure "Cut*" -state normal } else { $_mBar.file entryconfigure "Export*" -state disabled $_mBar.edit entryconfigure "Copy*" -state disabled $_mBar.edit entryconfigure "Cut*" -state disabled } if { [_isImgSelected] } { $_mBar.tools entryconfigure "Smooth*" -state normal $_mBar.tools entryconfigure "Plot*" -state normal } else { if [_isThereImgExt] { $_mBar.tools entryconfigure "Smooth*" -state normal } else { $_mBar.tools entryconfigure "Smooth*" -state disabled } if { [_isTblSelected] } { $_mBar.tools entryconfigure "Plot*" -state normal } else { $_mBar.tools entryconfigure "Plot*" -state disabled } } if { [lindex [fvClipBoard report] 0] == "HDUs" } { $_mBar.edit entryconfigure "Paste*" -state normal } else { $_mBar.edit entryconfigure "Paste*" -state disabled } update idle } itcl::body FitsFile::updateHighLight {extNum_ field_ value_} { switch $field_ { "DIMENSION" { $_subwin.dims$extNum_ configure \ -text "[lindex $value_ 0] cols X [lindex $value_ 1] rows" } "EXTNAME" { $_subwin.extName$extNum_ configure -text $value_ } default {return} } } itcl::body FitsFile::getNthKey {n_} { _isOpen $fitsfile get keyword -num $n_ } itcl::body FitsFile::copyCHDU {saveName_} { $fitsfile copy $saveName_ } itcl::body FitsFile::insertKey {n_ rec_ fflag_} { $fitsfile insert keyword $n_ $rec_ $fflag_ } itcl::body FitsFile::putNthKey {n_ rec_ fflag_} { $fitsfile put keyword -num $n_ $rec_ $fflag_ } itcl::body FitsFile::putHis {rec_} { $fitsfile put history $rec_ } itcl::body FitsFile::delNthKey {n_} { $fitsfile delete keyword $n_ } itcl::body FitsFile::loadColumn {col_ null_ i_} { $fitsfile load column $col_ $null_ $i_ } # evaluate arithemetic expression $expr_ on each row in $rows_ # using $null_ as result of any null results # Returns: dataAddress dataType numElements itcl::body FitsFile::loadExpr {expr_ null_ {rows_ "-"} } { $fitsfile load expr -rows $rows_ $expr_ $null_ } itcl::body FitsFile::loadImage {} { $fitsfile load image } itcl::body FitsFile::loadImageFlip { direction } { $fitsfile load image flip $direction } # loads image block into a memory data address for POW to use # the memory address is returned to the caller itcl::body FitsFile::loadImageBlock {fRow_ nRows_ fCol_ nCols_ slice_} { $fitsfile load iblock -- $fRow_ $nRows_ $fCol_ $nCols_ $slice_ } itcl::body FitsFile::loadImageSlice {i_ r_} { $fitsfile load image $i_ $r_ } # loads the entire vector table contained in $colName_ # to a data address for POW to plot itcl::body FitsFile::loadVectorTableToDataAddressForPOW {colName_} { $fitsfile load vtable $colName_ } itcl::body FitsFile::getVectorTableAsRawList {colName_ rows_ range_} { $fitsfile get vtable -noformat $colName_ $rows_ $range_ } # returns a list of totalCol_ elements in the row_ row of a vector table # based on the colName_ of its parent table itcl::body FitsFile::getVectorTableRowAsFormattedList {colName_ row_ totalCols_} { set tmpList {} for {set col 0} {col < totalCols_} {incr col} { lappend tmpList [$fitsfile get vtable $colName_ $col_ $row_] } return $tmpList } itcl::body FitsFile::freeColumn {add_} { $fitsfile free column $add_ } itcl::body FitsFile::freeExpr {add_} { $fitsfile free expr $add_ } itcl::body FitsFile::freeVTable {add_} { $fitsfile free vtable $add_ } itcl::body FitsFile::loadTBlock {var_ cList_ fRow_ nRows_ fCol_ nCols i_} { $fitsfile load tblock $var_ $cList_ $fRow_ $nRows_ $fCol_ $nCols $i_ } itcl::body FitsFile::delRows {n0_ nn_} { $fitsfile delete rows $n0_ $nn_ } itcl::body FitsFile::delRowsRange {rowrange_} { $fitsfile delete rows -range $rowrange_ } itcl::body FitsFile::selRowsWithCondition {cond_ fRow_ nRow_} { $fitsfile select rows -expr $cond_ $fRow_ $nRow_ } itcl::body FitsFile::delRowsWithCondition {cond_} { $fitsfile delete rows -expr $cond_ } itcl::body FitsFile::addColumn {name_ form_} { $fitsfile add column $name_ $form_ } itcl::body FitsFile::addColumnFrExpr {name_ form_ expr_ rowrange_} { $fitsfile add column $name_ $form_ $expr_ $rowrange_ } itcl::body FitsFile::addRow {nRows_} { $fitsfile add row $nRows_ } itcl::body FitsFile::insertCol {index_ ttype_ tform_} { $fitsfile insert column $index_ $ttype_ $tform_ } itcl::body FitsFile::insertRow {index_ nRows_} { $fitsfile insert row $index_ $nRows_ } itcl::body FitsFile::delCols {colList_} { $fitsfile delete cols $colList_ } itcl::body FitsFile::getImageAsList {firstElem_ nElem_} { $fitsfile get image $firstElem_ $nElem_ } itcl::body FitsFile::putImage {fElem_ fRow_ value_} { $fitsfile put image $fElem_ $fRow_ $value_ } itcl::body FitsFile::putTable {name_ felem_ range_ value_} { $fitsfile put table $name_ $felem_ $range_ $value_ } itcl::body FitsFile::putKwd {rec_ fflag_} { $fitsfile put keyword $rec_ $fflag_ } itcl::body FitsFile::saveTabToASCII {name_ n_ fRow_ nRows_ colList_ width_ ifFixedFormat_ ifCSV_ ifPrintRow_ sepString_} { #okbox [list $colList_ $width_] $fitsfile sascii table $name_ $n_ $fRow_ $nRows_ $colList_ $width_ $ifFixedFormat_ $ifCSV_ $ifPrintRow_ $sepString_ } itcl::body FitsFile::saveImgToASCII {name_ n_ fRow_ nRows_ fCol_ nCols_ width_ ifCSV_ ifPrintRow_ sepString_ { slice_ 1 }} { $fitsfile sascii image $name_ $n_ $fRow_ $nRows_ $fCol_ $nCols_ $width_ $ifCSV_ $ifPrintRow_ $sepString_ $slice_ } itcl::body FitsFile::saveVecToASCII {name_ n_ fRow_ nRows_ fCol_ nCols_ colName_ ifCSV_ ifPrintRow_ sepString_ ifVariableVec_} { $fitsfile sascii vector $name_ $n_ $fRow_ $nRows_ $fCol_ $nCols_ $colName_ $ifCSV_ $ifPrintRow_ $sepString_ $ifVariableVec_ } itcl::body FitsFile::freeImage {add_} { $fitsfile free image $add_ } itcl::body FitsFile::sort {column_ ascendFlag_ isMerge_} { # column_ is a list of all the column names used in sorting # ascendFlag_ is a list of 1/0 to indicate ascending/decending # sorting for each column # isMerge_ == 1, then merge all identical rows if { $isMerge_ == 1 } { $fitsfile sort -merge $column_ $ascendFlag_ } else { $fitsfile sort $column_ $ascendFlag_ } } itcl::body FitsFile::getMaster {} { if { $_isOriginalFile } { return $this } else { return $_origFileObj } } itcl::body FitsFile::getHDUtype { hdu } { if [info exists _extData($hdu,type)] { return $_extData($hdu,type) } else { return UNKNOWN } } itcl::body FitsFile::getOrigName {} { if { $_isOriginalFile } { return $filename } else { return [$_origFileObj getOrigName] } } itcl::body FitsFile::changeFile {} { set _isChanged 1 if { !$_isOriginalFile } { $_origFileObj changeFile } } itcl::body FitsFile::unchangeFile {} { set _isChanged 0 if { $_isOriginalFile } { foreach child $_myExtensionChildren { set childFObj ::FitsExtension::[$child cget -fFile] $childFObj unchangeFile } } } itcl::body FitsFile::isFileChanged {} { return $_isChanged } itcl::body FitsFile::_deleteHDUs {} { if { [_isHDUSelected] != 1 } { error "Please select HDU first" return } if { $_extCheck(1) } { tk_messageBox -message "You cannot delete the primary array\n" return } if { [llength $_myExtensionChildren] != 0 } { tk_messageBox -message \ "There are extensions opened for this file. Please close all\ other fv windows related to this file before deleting HDUs." return } # cut the HDUs to the clipboard file _writeHDUsToClipBoard 1 _redrawHighLight } itcl::body FitsFile::redrawHighLight {} { _redrawHighLight } itcl::body FitsFile::_redrawHighLight {} { foreach i [winfo children $_subwin] { catch {destroy $i} } # Update required to let the TK event handlers actually handle the # destruction of this objects before we recreate them update idletasks _openFitsFile _drawContent _closeFitsFile } itcl::body FitsFile::_copyHDUs {} { # just copy if { ! [_isHDUSelected] } { error "Please select HDU first" return } _writeHDUsToClipBoard 0 } itcl::body FitsFile::_pasteHDUs {} { global g_backupDir set tmp [fvClipBoard report] # check if there are hdus in the clipboard if { [lindex $tmp 0] != "HDUs" } { error "Sorry, there are no HDUs in the clipboard" return } set cbfilename [file join ${g_backupDir} cb.fits] fits open $cbfilename 0 tmpcbfits set nhdu [tmpcbfits info nhdu] # skip the first header for { set i $nhdu} { $i > 1} {incr i -1} { tmpcbfits move $i tmpcbfits append $openedFileName } tmpcbfits close # update the total _numExts set _numExts [expr $_numExts+$nhdu-1] _redrawHighLight changeFile } itcl::body FitsFile::_smoothImgs {} { global g_titleFont global g_backupDir global g_fitsFileMode if ![_isImgSelected] { tk_messageBox -type ok -icon warning \ -message "You must first select which image extension to be smoothed." return } # open the smooth dialog if ![info exist xwin] { set xwin 3 } if ![info exist ywin] { set ywin 3 } if ![info exist _smoothID] { set _smoothID 1 } set dosmooth 0 if [winfo exists .smthdlg ] { focus .smthdlg raise .smthdlg return } toplevel .smthdlg -class Dialog wm title .smthdlg "fv: Smooth Image" label .smthdlg.title -text "Size of smoothing box:" -font g_titleFont \ -anchor w pack .smthdlg.title -pady 5 -ipadx 35 -anchor w frame .smthdlg.smthx -relief flat label .smthdlg.smthx.px -text "Width: " -anchor w -font g_titleFont entry .smthdlg.smthx.ex -width 4 \ -textvariable [itcl::scope xwin] -relief sunken -font g_titleFont pack .smthdlg.smthx.px .smthdlg.smthx.ex -side left label .smthdlg.smthx.unit -text " pixel" -anchor w -font g_titleFont pack .smthdlg.smthx.px .smthdlg.smthx.ex .smthdlg.smthx.unit -side left pack .smthdlg.smthx -pady 3 -padx 3 -anchor w frame .smthdlg.smthy -relief flat label .smthdlg.smthy.py -text "Height:" -anchor w -font g_titleFont entry .smthdlg.smthy.ey -width 4 \ -textvariable [itcl::scope ywin] -relief sunken -font g_titleFont label .smthdlg.smthy.unit -text " pixel" -anchor w -font g_titleFont pack .smthdlg.smthy.py .smthdlg.smthy.ey .smthdlg.smthy.unit -side left pack .smthdlg.smthy -side top -pady 3 -padx 3 -anchor w label .smthdlg.note -text "(must be odd numbers)" -font g_titleFont pack .smthdlg.note -pady 5 -anchor w frame .smthdlg.smthbt -relief flat button .smthdlg.smthbt.ok -text OK \ -command [itcl::code $this _smoothOK] button .smthdlg.smthbt.cancel -text Cancel -command {destroy .smthdlg} pack .smthdlg.smthbt.ok -side left pack .smthdlg.smthbt.cancel -side right pack .smthdlg.smthbt -side top -pady 5 -padx 5 -expand true -fill x tkwait win .smthdlg set window $xwin lappend window $ywin if {$dosmooth == 0 } { return 0 } # smooth all the selected extensions set tmpfits [fits open $filename 0] set numexts $_numExts set smfile [file join $g_backupDir smooth.tmp$_smoothID] incr _smoothID if [file exists $smfile] { file delete $smfile } for {set i 1} {$i <= $numexts} {incr i} { if { $_extCheck($i) || $numexts == 1} { set htype [$tmpfits move $i] if {$htype == 0} { $tmpfits smooth $window $smfile } } } $tmpfits close set oldMode $g_fitsFileMode # Set Read-Only flag set g_fitsFileMode 1 # note this is an fedit.tcl openFitsFile proc, not to be confused with _openFitsFile set smtmp [openFitsFile $smfile] $smtmp changeFile set g_fitsFileMode $oldMode return 0 } itcl::body FitsFile::_smoothOK {} { set dosmooth 1 destroy .smthdlg } itcl::body FitsFile::_plotHDUs {} { global g_titleFont set numexts $_numExts if {$numexts == 1} { plotData 1 return 0 } set tmpfits [fits open $filename 0] for {set i 1} {$i <= $numexts} {incr i} { if { $_extCheck($i) } { set htype [$tmpfits move $i] if {$htype == 0} { set dimsl [$tmpfits info imgdim] set ndims [llength $dimsl ] if { $ndims > 0} { plotData $i } } else { plotData $i } } } $tmpfits close return 0 } itcl::body FitsFile::_isHDUSelected {} { for {set i 1} {$i <= $_numExts} {incr i} { if { $_extCheck($i) } { return 1 } } return 0 } itcl::body FitsFile::_isThereImgExt {} { for {set i 1} {$i <= $_numExts} {incr i} { if { $_extData($i,type) == "Image" && $_extData($i,dims) != "0" } { return 1 } } return 0 } itcl::body FitsFile::_isImgSelected {} { for {set i 1} {$i <= $_numExts} {incr i} { if { $_extCheck($i) || $_numExts == 1 } { if { $_extData($i,type) == "Image" && $_extData($i,dims) != "0" } { return 1 } } } return 0 } itcl::body FitsFile::_isTblSelected {} { for {set i 1} {$i <= $_numExts} {incr i} { if { $_extCheck($i) && $_extData($i,type) != "Image" } { return 1 } } return 0 } itcl::body FitsFile::_writeHDUsToClipBoard {ifDelete_} { global g_backupDir getBackup # ifDelete_ = 1 : cut # ifDelete_ = 0 : copy set cbfilename [file join ${g_backupDir} cb.fits] file delete $cbfilename set tmpcbfits [fits open $cbfilename 2 tmpcbfits] $tmpcbfits put ihd -p $tmpcbfits close set tmpfits [fits open [getBackup] 1] set hduList {} for {set i $_numExts} {$i > 0} {incr i -1} { if { $_extCheck($i) } { $tmpfits move $i $tmpfits append $cbfilename lappend hduList "[expr $i-1]," if { $ifDelete_ } { $tmpfits delete chdu } } set _extCheck($i) 0 } # register to the clipboard. The first arg is a dummy arg fvClipBoard register "HDUs" $filename $hduList $hduList set _numExts [$tmpfits info nhdu] $tmpfits close if { $ifDelete_ } changeFile } itcl::body FitsFile::getColNum { colname_ } { set collist [$fitsfile info column] set colnum [lsearch -exact $collist $colname_] incr colnum return $colnum } itcl::body FitsFile::getTLMinMax {colname_} { set colnum [getColNum $colname_] if { $colnum == 0} { return "" } if { [catch {set tmpmin [getKeyword "TLMIN$colnum"]}] == 1} return "" set min [lindex [lindex $tmpmin 0] 1] if { [catch {set tmpmax [getKeyword "TLMAX$colnum"]}] == 1} return "" set max [lindex [lindex $tmpmax 0] 1] # Make sure min/max is a valid number regsub {[dD]} $min E min regsub {[dD]} $max E max if { [catch {set min [expr $min]}] } { set min "" } if { [catch {set max [expr $max]}] } { set max "" } return "$min $max" } itcl::body FitsFile::getColMinMax {colname_ felem_ rowrange_} { $fitsfile info column -minmax $colname_ $felem_ $rowrange_ } itcl::body FitsFile::getColStat {colname_ felem_ rowrange_} { $fitsfile info column -stat $colname_ $felem_ $rowrange_ } itcl::body FitsFile::callHistogram { extNum_ fillFlag_ } { # Ziqin # set fT [openTable $extNum_ ] # return [$fT callHistogramDirectly $extNum_ $fillFlag_ ] set fE [openExtension $extNum_ ] return [$fE callHistogram $extNum_ $fillFlag_ ] } itcl::body FitsFile::makeHistogram {args} { eval $fitsfile histogram $args } itcl::body FitsFile::loadImageMeanCols {fCol_ lCol slice_} { $fitsfile load icols $fCol_ $lCol $slice_ } itcl::body FitsFile::loadImageMeanRows {fRow_ lRow_ slice_} { $fitsfile load irows $fRow_ $lRow_ $slice_ } itcl::body FitsFile::plotHisto { } { global g_histoPlotId powPlotParam global xCount yCount global powWCSList powWCSLabel powWCSName _openFitsFile # if not a 1D histogram abort. if { [catch {set xval [getKeyword "CRVAL1"]} ] } {_closeFitsFile; return} if { [catch {set xpix [getKeyword "CRPIX1"]} ] } {_closeFitsFile; return} if { [catch {set xbin [getKeyword "CDELT1"]} ] } {_closeFitsFile; return} set imgDim [getImgInfo] set numX [lindex $imgDim 0] if { [llength $imgDim]>2 \ || ([llength $imgDim] == 2 && [lindex $imgDim 1] != 1) } {_closeFitsFile; return} # set xval [lindex [lindex $xval 0] 1] set xpix [lindex [lindex $xpix 0] 1] set xbin [lindex [lindex $xbin 0] 1] set xval [expr $xval + (1.0-$xpix)*$xbin] incr g_histoPlotId set graphID 1D_Histogram_${g_histoPlotId} set dataInfo [loadImageBlock 1 1 1 $numX 1] set dataAddressForPOW [lindex $dataInfo 0] set dataType [lindex $dataInfo 1] set dataLength [lindex $dataInfo 2] if { [winfo exist .pow.pow] != 1 } { powInit .dummy } powCreateVectorEN x_$graphID x_$graphID $dataLength $xval $xbin NULL powCreateData y_d_$graphID $dataAddressForPOW $dataType $dataLength 1 freeImage $dataAddressForPOW powCreateVector y_$graphID y_d_$graphID 0 $dataLength 1 if { [catch {set xunt [getKeyword "CUNIT1"]} ] } { set xUnit Pixels } else { set xUnit [lindex [lindex $xunt 0] 1] set xUnit [string trim $xUnit { '}] } if { [catch {set xlbl [getKeyword "CTYPE1"]} ] } { set xLabel Pixels } else { set xLabel [lindex [lindex $xlbl 0] 1] set xLabel [string trim $xLabel { '}] set dsh [string first - $xLabel] if { $dsh > 0 } { incr dsh -1 set xLabel [string range $xLabel 0 $dsh] } } set yUnit NULL set yLabel Counts set powWCSLabel(xlabel,$imgHandle,DEFAULT) $xLabel set powWCSLabel(ylabel,$imgHandle,DEFAULT) $yLabel set powWCSLabel(xunit,$imgHandle,DEFAULT) $xUnit set powWCSLabel(yunit,$imgHandle,DEFAULT) $yUnit set powWCSName($graphID) 0 set powWCSName(${graphID}scope) 0 set powWCS($graphID) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set powFitsHeader($graphID) "" set powFitsHeaderCnt($graphID) 0 powCreateCurve $graphID x_$graphID NULL y_$graphID NULL NULL NULL # Draw as a histogram powSetCurveOptions $graphID $graphID lStep Yes lDisp Yes set powPlotParam(graphType,$graphID) [string tolower [lindex [getTableInfo hdutype] 0]] set powPlotParam(graphType,${graphID}scope) $powPlotParam(graphType,$graphID) set powPlotParam(zoomed,$graphID) 0 set powPlotParam(zoomed,${graphID}scope) 0 set xCount($graphID) 0 set yCount($graphID) 0 set xCount(${graphID}scope) 0 set yCount(${graphID}scope) 0 powCreateGraph $graphID $graphID NULL $xUnit $yUnit \ $xLabel $yLabel \ [lindex $fvPref::graphDispSize 0] [lindex $fvPref::graphDispSize 1] set powWCSList($graphID) {} lappend powWCSList($graphID) 1 lappend powWCSList($graphID) {} _closeFitsFile } itcl::body FitsFile::_appendNewHDU {} { if { [winfo exists .newhdu] } { itcl::delete object .newhdu } NewExtension .newhdu [getBackup] -title "fv: New HDU" tkwait window .newhdu _redrawHighLight changeFile } itcl::body FitsFile::updateChecksum { {forceUpdate_ 0} } { if { [isFileChanged] && ! $forceUpdate_} { _isOpen switch $fvPref::ifAutoUpdateChecksum { 0 {return} 1 { if { [$fitsfile checksum verify]<0 } { set forceUpdate_ 1 } } 2 {set forceUpdate_ 1} } } if { $forceUpdate_ } { $fitsfile checksum update changeFile } } itcl::body FitsFile::verifyChecksum {} { _isOpen # return 1 checksum ok # 0 checksum keyword not there # -1 dooh! $fitsfile checksum verify } ####################################### # # Open extensions # ####################################### itcl::body FitsFile::openHeader { extNum_ } { set fE [openExtension $extNum_] return [$fE dispHeader] } ## when (the left) mouse button is pushed, only extNum_ is passed in ## these extra args are called from somewhere else # itcl::body FitsFile::openTable { extNum_ {coor_ {}} {newTable_ {}} } { if { $newTable_ == "" } { # standard case # _openExtraTable is 1 if and only if third mouse button was pressed set newTable_ $_openExtraTable } set _openExtraTable 0 set fE [openExtension $extNum_] # when clicking on a POW image, $coor_ is the image pixels clicked on return [$fE dispTable $extNum_ $coor_ $newTable_] } itcl::body FitsFile::plotData { extNum_ {xyNames_ {}} } { # set fT [openTable $extNum_] # $fT scplotCmd $xyNames_ set fE [openExtension $extNum_] # Ziqin # $fE dispTable "" "" $fE plotData $xyNames_ } itcl::body FitsFile::plotData1 { extNum_ {xyNames_ {}} } { set fT [openTable $extNum_] $fT scplotCmd $xyNames_ ## set fE [openExtension $extNum_] # Ziqin # $fE dispTable "" "" ## $fE plotData $xyNames_ } itcl::body FitsFile::deleteExt { extNum_ } { incr extNum_ if { ($extNum_ < 2) || ($extNum_ > $_numExts) } { error "Extension num is invalid" } else { for {set i 1} { $i <= $_numExts } { incr i} { set _extCheck($i) 0 } set _extCheck($extNum_) 1 } _deleteHDUs } itcl::body FitsFile::checkXYCol { idx } { set token [split $_extData($idx,colList) " "] set xPos [lsearch -exact [string tolower $token] "x"] set yPos [lsearch -exact [string tolower $token] "y"] if { $xPos >= 0 && $xPos >= 0 } { return true } else { return false } } itcl::body FitsFile::displaySlice { extNum_ slice } { set fE [openExtension $extNum_ ] return [$fE displaySlice $extNum_ $slice] } itcl::body FitsFile::skipTable { extNum_ {coor_ {}} } { set fE [openExtension $extNum_ ] return [$fE skipTable $coor_ ] } ## if the FitsExtension hasn't been created, create it ## if it already has been create, simply return it # itcl::body FitsFile::openExtension { extNum_ } { if { !$_isOriginalFile } { return [$_origFileObj openExtension $extNum_] } set pos [lsearch $_myExtNums $extNum_] if { $pos == -1 } { set fE [FitsExtension #auto $_fileMode $extNum_ $filename $this] } else { set fE [lindex $_myExtensionChildren $pos] } return $fE } itcl::body FitsFile::closeExtension { extNum_ } { if { !$_isOriginalFile } { $_origFileObj closeExtension $extNum_ } else { if { $extNum_ < 0 } { # Close ALL extensions foreach fE $_myExtensionChildren { $fE closeCmd } } else { set pos [lsearch $_myExtNums $extNum_] if { $pos != -1 } { set fE [lindex $_myExtensionChildren $pos] $fE closeCmd } } } } itcl::body FitsFile::_setNewTable { flag_ } { set _openExtraTable $flag_ } itcl::body FitsFile::addChild { child_ extNum_ } { set pos [lsearch $_myExtNums $extNum_] if { $pos == -1 } { lappend _myExtensionChildren $child_ lappend _myExtNums $extNum_ } else { puts "$extNum_ already exists: [lindex $_myExtensionChildren $pos]" } } itcl::body FitsFile::freeChild { extNum_ } { set pos [lsearch $_myExtNums $extNum_] if { $pos == -1 } { puts "[expr $extNum_ - 1] does not exist" } else { set _myExtensionChildren [lreplace $_myExtensionChildren $pos $pos] set _myExtNums [lreplace $_myExtNums $pos $pos] } } itcl::body FitsFile::translateKeyWords { colName rowNum dest tempFile } { # wrapper to call fits_copy_cell2image in cfitsio # return new header string and wcs info return [$fitsfile get translatedKeywords $colName $rowNum $dest $tempFile] } itcl::body FitsFile::getHeader2String {} { # wrapper to call ffhdr2str in cfitsio return [$fitsfile get header2str] } itcl::body FitsFile::getDummyHeader2String {{dest {}} RAColNum_ DecColNum_} { # wrapper to call to get dummy return [$fitsfile get dummy2str $dest $RAColNum_ $DecColNum_] } itcl::body FitsFile::getHeaderKeyWord { str img } { global powHeaderWcsKeyWord powWCSInfo powWCSToken powWCS if [info exists powHeaderWcsKeyWord($img,DEFAULT)] { foreach letter [list a b c d e f g h i j k l m n o p q r s t u v w x y z] { if [info exists powHeaderWcsKeyWord($img,$letter)] { unset powHeaderWcsKeyWord($img,$letter) } } if [info exists powHeaderWcsKeyWord($img,NONE)] { unset powHeaderWcsKeyWord($img,NONE) } if [info exists powHeaderWcsKeyWord($img,END)] { unset powHeaderWcsKeyWord($img,END) } if [info exists powHeaderWcsKeyWord($img,DEFAULT)] { unset powHeaderWcsKeyWord($img,DEFAULT) } unset powHeaderWcsKeyWord } set i 0 set numCard 0 set numCoord 0 set numCardInCoord 0 set powWCSToken($img) { DEFAULT } while { 1 } { set currentStr [string range $str $i [expr $i + 79]] incr i 80 if { [string trim $currentStr] == "" } { if { $i > [string length $str] } break continue } set currentStrToken [split $currentStr "="] set header [string trim [lindex $currentStrToken 0]] incr numCard if { [llength $currentStrToken] == 2 } { switch -regexp -- $header { {CTYPE[0-9][A-Z]?} - {[0-9]CTYP[0-9][A-Z]?} - {CUNIT[0-9][A-Z]?} - {[0-9]CUNI[0-9][A-Z]?} - {CRVAL[0-9][A-Z]?} - {CRPIX[0-9][A-Z]?} - {CD[0-9][_][0-9][A-Z]?} - {CDELT[0-9][A-Z]?} - {[0-9]CDLT[0-9][A-Z]?} - {CROTA[0-9][A-Z]?} - {TCTYP[0-9][A-Z]?} - {TCUNI[0-9][A-Z]?} - {TCRVL[0-9][A-Z]?} - {TCRPX[0-9][A-Z]?} - {TCDLT[0-9][A-Z]?} - {TCD[0-9][A-Z]?} - {TCROT[0-9][A-Z]?} - {OFFSET[0-9][A-Z]?} { incr numCardInCoord set lastChar [string toupper [string range $header end end]] regsub {[A-Z]} $lastChar {} testChar if { $testChar == "" } { set headerLength [string length [lindex $currentStrToken 0]] set newHeader [string range $header 0 [expr [string length $header] - 2]] set newStr [format "%-${headerLength}s=%s" $newHeader \ [lindex $currentStrToken 1]] if { ![info exists powHeaderWcsKeyWord] || \ ![info exists powHeaderWcsKeyWord($img,$lastChar)] } { incr numCoord set powHeaderWcsKeyWord($img,$lastChar) $newStr set powWCSInfo($img,$lastChar) [getWcs $lastChar] lappend powWCSToken($img) $lastChar } else { set powHeaderWcsKeyWord($img,$lastChar) \ [format "%s%s" $powHeaderWcsKeyWord($img,$lastChar) $newStr] } } else { if { ![info exists powHeaderWcsKeyWord] || \ ![info exists powHeaderWcsKeyWord($img,DEFAULT)] } { incr numCoord set powWCSInfo($img,DEFAULT) $powWCS($img) set powHeaderWcsKeyWord($img,DEFAULT) $currentStr } else { set powHeaderWcsKeyWord($img,DEFAULT) \ [format "%s%s" $powHeaderWcsKeyWord($img,DEFAULT) $currentStr] } } } default { if { ![info exists powHeaderWcsKeyWord] || \ ![info exists powHeaderWcsKeyWord($img,NONE)] } { set powHeaderWcsKeyWord($img,NONE) $currentStr } else { set powHeaderWcsKeyWord($img,NONE) \ [format "%s%s" $powHeaderWcsKeyWord($img,NONE) $currentStr] } } } } else { switch -glob -- $header { "END*" { set powHeaderWcsKeyWord($img,END) $currentStr } default { if { ![info exists powHeaderWcsKeyWord] || \ ![info exists powHeaderWcsKeyWord($img,NONE)] } { set powHeaderWcsKeyWord($img,NONE) $currentStr } else { set powHeaderWcsKeyWord($img,NONE) \ [format "%s%s" $powHeaderWcsKeyWord($img,NONE) $currentStr] } } } } if { $i > [string length $str] } break } if { $numCoord > 0 } { set numCardPerCoord [expr $numCardInCoord / $numCoord] return [list $numCard $numCard] } else { return [list 0 $numCard] } } itcl::body FitsFile::assembleWcsLabel { img {selection "DEFAULT"} } { global powWCSLabel if { $selection == " " } return set powWCSLabel(xlabel,$img,$selection) "" set powWCSLabel(ylabel,$img,$selection) "" set powWCSLabel(xunit,$img,$selection) "" set powWCSLabel(yunit,$img,$selection) "" set x_label "" set y_label "" set x_unit "pixels" set y_unit "pixels" if { ![catch {set tmp [getKeyword CTYPE1$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_label [string trim $v {' }] set powWCSLabel(xlabel,$img,$selection) $x_label } if { ![catch {set tmp [getKeyword CTYPE2$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_label [string trim $v {' }] set powWCSLabel(ylabel,$img,$selection) $y_label } if { ![catch {set tmp [getKeyword CUNIT1$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_unit [string trim $v {' }] set powWCSLabel(xunit,$img,$selection) $x_unit } if { ![catch {set tmp [getKeyword CUNIT2$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_unit [string trim $v {' }] set powWCSLabel(yunit,$img,$selection) $y_unit } set z_label "counts" if { ![catch {set tmp [getKeyword BUNIT$selection]}] } { set v [lindex [lindex $tmp 0] 1] set z_label [string trim $v {' }] } set powWCSLabel(zlabel,$img,$selection) $z_label } itcl::body FitsFile::assembleWcsHeader { img {selection "DEFAULT"} } { global powHeaderWcsKeyWord # regular header if { $selection == "NOWCS" } { return [format "%s%s" $powHeaderWcsKeyWord($img,NONE) \ $powHeaderWcsKeyWord($img,END)] } else { headerDebugDataPrint "NONE STRING" $powHeaderWcsKeyWord($img,NONE) headerDebugDataPrint "selection: $selection" $powHeaderWcsKeyWord($img,$selection) headerDebugDataPrint "END STRING" $powHeaderWcsKeyWord($img,END) return [format "%s%s%s" $powHeaderWcsKeyWord($img,NONE) \ $powHeaderWcsKeyWord($img,$selection) \ $powHeaderWcsKeyWord($img,END)] } } itcl::body FitsFile::headerDebugDataPrint { title string } { puts "$title" set k 0 for {set i 0} {$i < [string length $string]} {incr i 80} { set currentStr [string range $string $i [expr $i + 79]] puts "<$currentStr>" incr k } puts "count: $k" } fv5.4/ftools/guis/fv/class/FitsFileSelection.tcl0000644000220700001010000006513011203345470021264 0ustar birbylheadev# modified by Jianjun Xu # # FitsFileselectionbox # ------------------------------------------------------------------ itcl::class FitsFileselectionbox { inherit itk::Toplevel constructor {args} {} destructor {} private common _ffbFilter * private common _ffbFileName "" private common _displayFitsOnly 0 private common _userName "" private common _passwd "" private common _ftpHost "" private variable _pwd . private variable _selected "" private variable _fileCmd Open private variable _isFtp 0 private variable _lastLocalDir "" private variable _lastRemoteDir "" private variable _nameList {} private variable _sizeList {} private variable _dateList {} private variable _dirChar "/" private method _fillContent {cDir} private method _upDir {} private method _setDir { n } private method _openThisFile {} private method _openSelection {} private method _completeFileName {} private method _selectThat { box } private method _listFits {} private method _setFilter {} private method _helpCmd {} private method _initFtp {} private method _isDir {} private method _pwd { {full 1} } private method _updateAll {} private method _switchRemoteLocal {} private method _closeFTP {} private method _showNamedFile {} private method _searchCharsForCompletion {root list} private method _pickElemByName {name list} private method _ftpOpen {} private method _buildMenu {} private method _postMenu {time x y} private method _buttonRelease {time} private method _scrollBoxes { args } private method _scrollOthers { box args } private method _updateBoxes { data } private method _cancelCmd {} private method _openFileCmd {} private method _saveFileCmd {} private method _setCmd {cmd} private variable _postTime private variable _pathElems private variable _fileCols "files sizes dates" private variable _fileLbls "Name Size {Mod Date}" private variable _driveList private variable _dsizeList private variable _ddateList public method get {} public method chgDir {dir} public method init {} public method activate { cmd {defaultName ""} } public method deactivate {} public method changeListFITSoption {} } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body FitsFileselectionbox::constructor {args} { global g_fitsFileMode global isMac global isWin if { $isWin } { set _driveList {} foreach drive { c d e f g h i j k l m n o p q r s } { catch { [glob ${drive}:/*] } returnCodeList catch { [glob ${drive}:/*.*] } returnCodeFile if { [string first "no files matched" $returnCodeList] < 0 || [string first "no files matched" $returnCodeFile] < 0 } { lappend _driveList "$drive:/" lappend _dsizeList "(dir)" lappend _ddateList {} } } } wm withdraw $itk_component(hull) wm geometry $itk_component(hull) 350x450 if { $isMac } { set _dirChar ":" } component hull configure -borderwidth 0 # # Create an internal frame to contain the components. # itk_component add frame { frame $itk_interior.frame } pack $itk_component(frame) -fill both -expand yes # pack propagate $itk_component(frame) no # Create the dir entry. # itk_component add dframe { frame $itk_component(frame).df } pack $itk_component(dframe) -fill x -expand 0 -pady 4 -padx 4 itk_component add dirBtn { menubutton $itk_component(dframe).dir -indicatoron 1 -relief raised \ -menu $itk_component(dframe).dir.menu } pack $itk_component(dirBtn) -side left -fill x -expand 1 -padx 2 itk_component add dirMenu { menu $itk_component(dirBtn).menu -tearoff 0 } bind $itk_component(dirBtn) \ "[itcl::code $this _postMenu %t %X %Y]; break" bind $itk_component(dirMenu) \ [itcl::code $this _buttonRelease %t] image create bitmap _upDirIcon -data { #define updir_width 28 #define updir_height 16 static char updir_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x01, 0x10, 0x00, 0x00, 0x01, 0x10, 0x02, 0x00, 0x01, 0x10, 0x07, 0x00, 0x01, 0x90, 0x0f, 0x00, 0x01, 0x10, 0x02, 0x00, 0x01, 0x10, 0x02, 0x00, 0x01, 0x10, 0x02, 0x00, 0x01, 0x10, 0xfe, 0x07, 0x01, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0xf0, 0xff, 0xff, 0x01}; } itk_component add updir { button $itk_component(dframe).up \ -image _upDirIcon \ -command [itcl::code $this _upDir] } pack $itk_component(updir) -side left -expand 0 -padx 2 itk_component add ftpB { button $itk_component(dframe).ftpb -text "FTP..."\ -command [itcl::code $this _switchRemoteLocal] \ -padx 1 -pady 1 -width 8 } pack $itk_component(ftpB) -side left -expand 0 -padx 2 ############################ # # Create the files list. # itk_component add fframe { frame $itk_component(frame).fframe -relief sunken } pack $itk_component(fframe) -side top -fill both -expand 1 -padx 4 -pady 6 grid columnconfig $itk_component(fframe) 0 -weight 1 grid rowconfig $itk_component(fframe) 1 -weight 1 # Create file columns set i 0 foreach l $_fileLbls lb $_fileCols { itk_component add lbl$i { label $itk_component(fframe).lbl$i -text $l -relief raised } itk_component add $lb { listbox $itk_component(fframe).$lb -height 3 -relief flat \ -exportselection 0 -bd 0 -highlightthickness 0 \ -yscrollcommand [itcl::code $this _scrollOthers $lb] \ -takefocus 0 } grid $itk_component(lbl$i) -row 0 -column $i -sticky "news" grid $itk_component($lb) -row 1 -column $i -sticky "news" bind $itk_component($lb) \ +[itcl::code $this _selectThat $lb] bind $itk_component($lb) \ "setWatchCursor $itk_component(hull) [itcl::code $this _openSelection]" incr i } $itk_component(sizes) config -width 7 $itk_component(dates) config -width 12 # scrollbar itk_component add fscroll { scrollbar $itk_component(fframe).fscroll \ -command [itcl::code $this _scrollBoxes] } grid $itk_component(fscroll) -row 1 -column $i -sticky news # # ############################ # the bottom portion using grid itk_component add bframe { frame $itk_component(frame).bframe } pack $itk_component(bframe) -side top -fill x -expand 0 # File name itk_component add fnamel { label $itk_component(bframe).fnamel -text "File Name" } itk_component add fnamee { entry $itk_component(bframe).fnamee -textvariable [itcl::scope _ffbFileName] } bind $itk_component(fnamee) \ "setWatchCursor $itk_component(hull) [itcl::code $this _openThisFile]" # # bind all {} bind $itk_component(fnamee) "[itcl::code $this _completeFileName]; break" # Filter itk_component add filterl { label $itk_component(bframe).filterl -text "File of type" } itk_component add filtere { entry $itk_component(bframe).filtere -textvariable [itcl::scope _ffbFilter] } bind $itk_component(filtere) [itcl::code $this _setFilter] # file mode itk_component add filemode { checkbutton $itk_component(bframe).filemode \ -variable g_fitsFileMode \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black -activebackground $fvPref::globalBgColor \ -text "Open as read-only" } # fitsfile set _displayFitsOnly $fvPref::ifDispFitsOnly itk_component add fitsmode { checkbutton $itk_component(bframe).fitsmode \ -variable [itcl::scope _displayFitsOnly] \ -text "List FITS files only" \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black -activebackground $fvPref::globalBgColor \ -command [itcl::code $this _listFits] } # buttons itk_component add openB { button $itk_component(bframe).openB -text Open \ -command "setWatchCursor $itk_component(hull) [itcl::code $this _openThisFile]" } itk_component add cancelB { button $itk_component(bframe).cancelB -text Cancel \ -command [itcl::code $this _cancelCmd] } itk_component add helpB { button $itk_component(bframe).helpB -text Help \ -command [itcl::code $this _helpCmd] } # geometry grid config $itk_component(fnamel) -column 0 -row 0 \ -columnspan 1 -rowspan 1 -sticky "w" grid config $itk_component(fnamee) -column 1 -row 0 \ -columnspan 1 -rowspan 1 -sticky "snew" grid config $itk_component(filterl) -column 0 -row 1 \ -columnspan 1 -rowspan 1 -sticky "w" grid config $itk_component(filtere) -column 1 -row 1 \ -columnspan 1 -rowspan 1 -sticky "snew" grid config $itk_component(filemode) -column 1 -row 2 \ -columnspan 1 -rowspan 1 -sticky "w" grid config $itk_component(fitsmode) -column 1 -row 3 \ -columnspan 1 -rowspan 1 -sticky "w" grid config $itk_component(openB) -column 2 -row 0 \ -columnspan 1 -rowspan 1 -sticky "snew" -padx 4 grid config $itk_component(cancelB) -column 2 -row 1 \ -columnspan 1 -rowspan 1 -sticky "snew" -padx 4 grid config $itk_component(helpB) -column 2 -row 2 \ -columnspan 1 -rowspan 1 -sticky "snew" -padx 4 grid columnconfigure $itk_component(bframe) 1 -weight 5 wm protocol $itk_interior WM_DELETE_WINDOW [itcl::code $this _cancelCmd] eval itk_initialize $args } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body FitsFileselectionbox::destructor {} { } itcl::body FitsFileselectionbox::_fillContent {cDir} { global isMac isWin if { $cDir != "" } { chgDir $cDir } _buildMenu set fileNameList "" set fileSizeList "" set fileDateList "" set dirNameList "" set dirSizeList "" set dirDateList "" set selCO "" if { $_isFtp } { _updateBoxes [list {\[Loading...\]} {} {}] set rlist [setWatchCursor $itk_component(hull) \ [itcl::code ftpClient list ""]] set dirNameList [lindex $rlist 0] set dirSizeList [lindex $rlist 1] set dirDateList [lindex $rlist 2] set fileNameList [lindex $rlist 3] set fileSizeList [lindex $rlist 4] set fileDateList [lindex $rlist 5] } else { set _lastLocalDir $_pwd set _ffbFilter [string trim $_ffbFilter " "] if { $_ffbFilter == "" } { set _ffbFilter * } set tmpID [$itk_component(files) curselection] if { $tmpID != "" } { $itk_component(files) see $tmpID } if { $cDir == "" } { set curContent [file volumes] } else { #multi filter separated by comma set _ffbFilter [join [split $_ffbFilter ","]] set curContent [lsort -increasing [eval glob -nocomplain $_ffbFilter]] } foreach i $curContent { if ![file readable $i ] continue if { ( [string index $i 0]=="~" ) || \ ( ($isMac || $isWin) && [file attributes $i -hidden]) || \ ( $isMac && $i=="Trash" ) } { continue } if { [catch {set fType [file type [resolveSymLinks $i]]}] } { continue } switch $fType { file { if { $_displayFitsOnly } { if { [catch {set isfits [isFits $i]}] } continue if { $isfits == 0 } continue } lappend fileNameList $i lappend fileSizeList [calcSizeStr [file size $i]] lappend fileDateList [file mtime $i] } directory { lappend dirNameList [string trimright $i $_dirChar]$_dirChar lappend dirSizeList "(dir)" lappend dirDateList [file mtime $i] } default { ; } } } } if { $isMac } { set _nameList [eval list $dirNameList $fileNameList] set _sizeList [eval list $dirSizeList $fileSizeList] set _dateList [eval list $dirDateList $fileDateList] } else { set _nameList [eval list "../" $dirNameList $fileNameList] set _sizeList [eval list "(dir)" $dirSizeList $fileSizeList] set _dateList [eval list "-" $dirDateList $fileDateList] } set selID [$itk_component(files) curselection] if { $selID != "" } { set selCO [$itk_component(files) get $selID] } if { [llength $_nameList] == 0 } { _updateBoxes [list {\[ \]} {} {}] } elseif { $_isFtp } { _updateBoxes [list $_nameList $_sizeList $_dateList] } else { set _dateListFmt {} foreach d $_dateList { lappend _dateListFmt [calcDateStr $d] } _updateBoxes [list $_nameList $_sizeList $_dateListFmt] } set newID [lsearch $_nameList $selCO] if { $newID != -1} { $itk_component(files) selection set $newID $itk_component(files) see $newID _selectThat files } } itcl::body FitsFileselectionbox::_upDir {} { global isMac global isWin set preUpDir $_pwd if { $_isFtp } { ftpClient cd .. } else { if { $isMac && [string first : $_pwd] == [expr [string length $_pwd]-1] } { set _pwd "" _fillContent "" return } elseif { $_pwd != "" } { cd .. } } set _pwd [_pwd] set postUpDir $_pwd if { $isWin && $preUpDir == $postUpDir } { _updateBoxes [list $_driveList $_dsizeList $_ddateList] } else { _fillContent $_pwd } } itcl::body FitsFileselectionbox::_selectThat { box } { set tmpIdx [$itk_component($box) curselection] if { $tmpIdx == "" } { set _selected "" return } foreach b $_fileCols { if { $box!=$b } { $itk_component($b) selection clear 0 end $itk_component($b) selection set $tmpIdx } } set _selected [$itk_component(files) get $tmpIdx] if { ![_isDir] } { set _ffbFileName $_selected $itk_component(fnamee) selection range 0 end focus $itk_component(fnamee) $itk_component(fnamee) icursor end } } itcl::body FitsFileselectionbox::_isDir {} { global isMac if { $_isFtp } { if { [string range $_selected end end] == "/" } { return 1 } elseif { [string trim $_selected .] == "" } { return 1 } elseif { [lsearch -exact $_nameList $_ffbFileName/] != -1 } { return 1 } elseif { [string first / $_ffbFileName] != -1 } { return 1 } else { return 0 } } else { if { $isMac && $_pwd=="" } { return 1 } else { return [file isdirectory [string trimright $_selected $_dirChar]] } } } itcl::body FitsFileselectionbox::_openThisFile {} { set _ffbFileName [string trim $_ffbFileName " "] if { $_ffbFileName != "" } { set _selected $_ffbFileName set dirFlag [_isDir] _openSelection if { $dirFlag } { set _ffbFileName "" } } } itcl::body FitsFileselectionbox::_openSelection {} { global isMac if { $_selected=="" } return if { [_isDir] } { # open contents of directory if { !$isMac && [file pathtype $_selected]=="absolute" } { _fillContent $_selected } else { _fillContent $_pwd$_selected } } else { # it's a file if { $_fileCmd == "Save" } { _saveFileCmd } elseif { $_fileCmd == "Open"} { _openFileCmd } else { puts "Un-supported file command" } } } itcl::body FitsFileselectionbox::_listFits {} { _fillContent $_pwd } itcl::body FitsFileselectionbox::_setFilter {} { _fillContent $_pwd } itcl::body FitsFileselectionbox::_helpCmd {} { hhelp fileSelection } itcl::body FitsFileselectionbox::get {} { if { $_isFtp } { # Need to call _pwd here to remove the starting directory from filename set r_string "[_pwd 0]$_ffbFileName" set r_string \ "ftp://${_userName}:${_passwd}\@[string range $r_string 6 end]" } else { set r_string [string trim $_ffbFileName " "] if { [file pathtype $_ffbFileName]!="absolute" } { set r_string "$_pwd$_ffbFileName" } } return $r_string } itcl::body FitsFileselectionbox::_setCmd {cmd} { set _fileCmd $cmd if { $cmd == "Open" } { $itk_component(openB) configure -text Open $itk_component(filemode) configure -state normal } elseif {$cmd == "Save" } { $itk_component(openB) configure -text Save $itk_component(filemode) configure -state disabled } else { error "Not recognized command" } } itcl::body FitsFileselectionbox::init {} { $itk_component(files) select clear 0 end if { $_isFtp } { # Reinitialzing, so return to local directory _switchRemoteLocal } else { _fillContent [_pwd] } } itcl::body FitsFileselectionbox::chgDir {dir} { if { $_isFtp } { set dir [string range $dir 6 end] set idx [string first / $dir] if { $idx==-1 } { set tmpdir "/" } else { set tmpdir [string range $dir $idx end] if { $tmpdir=="/." } {set tmpdir "."} } ftpClient cd $tmpdir } else { cd $dir } set _pwd [_pwd] } itcl::body FitsFileselectionbox::_initFtp {} { global g_titleFont _closeFTP RemoteClass ftpClient # ask for user name and _passwd powToplevel .ftp .dummy iwidgets::entryfield .ftp.rhost -labeltext "Remote Host" \ -labelpos nw -textvariable [itcl::scope _ftpHost] \ -command [itcl::code $this _ftpOpen] -textfont g_titleFont -labelfont g_titleFont pack .ftp.rhost -padx 4 -pady 4 -fill x iwidgets::entryfield .ftp.login -labeltext "Optional User Name (if not 'anonymous')" \ -labelpos nw -textvariable [itcl::scope _userName] \ -command [itcl::code $this _ftpOpen] -textfont g_titleFont -labelfont g_titleFont pack .ftp.login -padx 4 -pady 4 -fill x iwidgets::entryfield .ftp._passwd -labeltext "Password" \ -labelpos nw -show "\267" -textvariable [itcl::scope _passwd] \ -command [itcl::code $this _ftpOpen] -textfont g_titleFont -labelfont g_titleFont pack .ftp._passwd -padx 4 -pady 4 -fill x iwidgets::Buttonbox .ftp.butts -padx 4 -pady 4 -orient horizontal .ftp.butts add connect -text "Connect" \ -font g_titleFont \ -command [itcl::code $this _ftpOpen] .ftp.butts add cancel -text "Cancel" \ -font g_titleFont \ -command { destroy .ftp } .ftp.butts default connect pack .ftp.butts focus [.ftp.rhost component entry] tkwait window .ftp } itcl::body FitsFileselectionbox::_ftpOpen {} { if { $_userName=="" } { set _userName anonymous } if { $_passwd=="" && ($_userName=="anonymous" || $_userName=="ftp") } { set _passwd "fv@fv.gsfc.nasa.gov" } setWatchCursor .ftp [itcl::code ftpClient openConn $_ftpHost $_userName $_passwd] set _isFtp 1 destroy .ftp } itcl::body FitsFileselectionbox::_pwd { {full 1} } { # Always return the _dirChar at end of the _pwd string if { $_isFtp } { return [string trimright [ftpClient pwd $full] "/"]/ } else { return [string trimright [pwd] $_dirChar]$_dirChar } } itcl::body FitsFileselectionbox::_updateAll {} { if { $_isFtp } return _setFilter } itcl::body FitsFileselectionbox::_switchRemoteLocal {} { if { $_isFtp } { set ffbCurrentDir $_lastLocalDir set _isFtp 0 $itk_component(ftpB) configure -text "FTP..." _closeFTP } else { _initFtp if { $_isFtp } { set ffbCurrentDir "ftp://$_ftpHost/." $itk_component(ftpB) configure -text "Local..." } else { set ffbCurrentDir $_lastLocalDir } } _fillContent $ffbCurrentDir } itcl::body FitsFileselectionbox::_closeFTP {} { # if another ftp is in session, close it first if { [itcl::find objects -class RemoteClass] != "" } { itcl::delete object ftpClient } } itcl::body FitsFileselectionbox::_completeFileName {} { if { $_ffbFileName == "" } return set tmpContent [lsort -increasing \ [_pickElemByName ${_ffbFileName} $_nameList]] if { [llength $tmpContent] == 0 } return set tmpRootName [lindex $tmpContent 0] set tmpRootLength [string length $tmpRootName] set tmpList [lrange $tmpContent 1 end] if { [llength $tmpList ] == 0 } { set i [string length $tmpRootName] } else { for {set i 0} {$i < $tmpRootLength} {incr i} { set tmpRoot [string range $tmpRootName 0 $i] if { [_searchCharsForCompletion $tmpRoot $tmpList] == 1} { break } } } set _ffbFileName [string range $tmpRootName 0 [expr $i-1]] _showNamedFile $itk_component(fnamee) selection range $i end } itcl::body FitsFileselectionbox::_pickElemByName {name list} { set tmplist "" set last [expr [string length $name]-1] foreach i $list { if { $name==[string range $i 0 $last]} { lappend tmplist $i } } return $tmplist } itcl::body FitsFileselectionbox::_searchCharsForCompletion {root list} { set last [expr [string length $root]-1] foreach i $list { if { $root!=[string range $i 0 $last] } { return 1 } } return 0 } itcl::body FitsFileselectionbox::_showNamedFile {} { $itk_component(fnamee) icursor end set tmpIndex [lsearch -glob $_nameList ${_ffbFileName}*] if { $tmpIndex == -1} return $itk_component(files) see $tmpIndex $itk_component(files) select clear 0 end $itk_component(files) select set $tmpIndex _selectThat files } ################################################### itcl::body FitsFileselectionbox::activate { cmd {defaultName ""} } { init _setCmd $cmd if { $defaultName != "" } { set _ffbFileName $defaultName } wm deiconify $itk_component(hull) raise $itk_component(hull) focus $itk_component(hull) $itk_component(fnamee) selection range 0 end $itk_component(fnamee) icursor end } itcl::body FitsFileselectionbox::deactivate {} { _cancelCmd } ################################################### itcl::body FitsFileselectionbox::_cancelCmd {} { global fileselect wm withdraw $itk_component(hull) set fileselect "" checkForExit } itcl::body FitsFileselectionbox::_openFileCmd {} { global g_isScript fileselect set fileselect [get] if { $_isFtp } { itcl::delete object ftpClient if { [catch {openFitsFileWM $fileselect 1} err] } { # reopen ftpClient RemoteClass ftpClient setWatchCursor "" \ [itcl::code ftpClient openConn $_ftpHost $_userName $_passwd] _fillContent $_pwd error $err } } else { if {$fileselect == "" } { error "Please select a file" return } if { [file exist $fileselect] == 0 } { set oldFile $fileselect foreach ext { gz Z z zip } { if { [file exists $fileselect.$ext] } { set fileselect $fileselect.$ext break } } if { $fileselect == $oldFile } { error "File $fileselect does not exist" return } } if { [file readable $fileselect] == 0 } { error "File $fileselect is not readable" return } if { [file extension $fileselect] == ".fv" } { set g_isScript 1 namespace eval ::fvCmds [list source $fileselect] set g_isScript 0 } elseif { [openFitsFile $fileselect] == "ERROR" } { return } } if { $fvPref::keepFileDialogVisible == 0 } { wm withdraw $itk_component(hull) } } itcl::body FitsFileselectionbox::_saveFileCmd {} { global fileselect set fileselect [get] set saveToDir [file dir $fileselect] if {$fileselect == "" } { error "No file name given" } elseif { ![file writable $saveToDir] } { error "$saveToDir is not writable" } else { wm withdraw $itk_component(hull) } } ################################################### itcl::body FitsFileselectionbox::_buildMenu {} { global isMac $itk_component(dirMenu) delete 0 end set _pathElems [urlSplit $_pwd] if { $_isFtp } { set newP "[lindex $_pathElems 0][lindex $_pathElems 1]" eval lappend newP [lrange $_pathElems 2 end] set _pathElems $newP } elseif { $isMac } { set _pathElems [linsert $_pathElems 0 Desktop] } if { !$isMac || $_isFtp } { set pathSym $_dirChar } else { set pathSym "" } set c 0 foreach i $_pathElems { if { $i==$pathSym } { set i "" } $itk_component(dirMenu) add command -label $i$pathSym \ -command [itcl::code $this _setDir $c] incr c } $itk_component(dirBtn) configure -text $i$pathSym } itcl::body FitsFileselectionbox::_setDir { n } { global isMac if { $_isFtp } { set newPath [join [lrange $_pathElems 0 $n] /] } elseif { $isMac } { if { $n==0 } { set newPath "" set _pwd "" } else { set newPath [eval file join [lrange $_pathElems 1 $n]] } } else { set newPath [eval file join [lrange $_pathElems 0 $n]] } _fillContent $newPath } itcl::body FitsFileselectionbox::_postMenu {time X Y} { set _postTime $time set x [expr $X - [winfo reqwidth $itk_component(dirMenu)]/2 ] set y [expr $Y - [$itk_component(dirMenu) yposition end] - 10] tk_popup $itk_component(dirMenu) $x $y } itcl::body FitsFileselectionbox::_buttonRelease {time} { if { [expr abs([expr $_postTime - $time])] <= 150 } { return -code break } } ############################################################ itcl::body FitsFileselectionbox::_scrollBoxes { args } { foreach b $_fileCols { eval $itk_component($b) yview $args } } itcl::body FitsFileselectionbox::_scrollOthers { box args } { eval $itk_component(fscroll) set $args set view [$itk_component($box) yview] foreach b $_fileCols { if { $box!=$b } { $itk_component($b) yview moveto [lindex $view 0] } } } itcl::body FitsFileselectionbox::_updateBoxes { data } { foreach b $_fileCols d $data { $itk_component($b) delete 0 end eval $itk_component($b) insert 0 $d } } itcl::body FitsFileselectionbox::changeListFITSoption {} { set _displayFitsOnly $fvPref::ifDispFitsOnly } fv5.4/ftools/guis/fv/class/FitsHeader.tcl0000644000220700001010000007424211272322475017741 0ustar birbylheadev# First draft 05/16/96 Jianjun #constrct a FitsHeader object # FitsHeader FitsHeaderObjName FitsFileObjName _currentHDU itcl::class FitsHeader { constructor {args} {} destructor {} # all public methods are only called by $_fatherFitsExtension # when changes at the father window need to propagate to its children # (of which this is one) public method refresh {} public method closeCmd {} public method bringToFront {} public method setFileName { fName_ } # creates the window is called by the constructor private method _checkTDISP { card } private method _makeHeader {} private method _bind_show { wndw {mode "-verbose"} } private method _insertAbove {} private method _deleteRec {} private method _userInputCommand { selection } private method _UndoCmd {} private method _CopyCmd {} private method _CutCmd {} private method _PasteCmd {} private method _ClearCmd {} private method _changeKey {} private method _saveAsFile {} private method _saveHeaderToAscii {} private method _clickSelectLine {} private method _selectLine {line_} private method _popTheMenu {x_ y_} private method _setEditStatus {} private method _searchStr {} private method _saveFile {} private method _closeFrWm {w_} private method _caseSel {} private method _moveLine {mode_} private method _cleanEmptyInsert {} private method _dispKeys {} private method _updateRestDisps {} private method _recAction {action} private method _insKey {pos_ rec_} private method _delKey {pos_} private method _createChecksum {} private method _verifyChecksum {} private method _postMenus {} private method _updateHL {} private method _highlightValue {} private variable _fFile private variable _tixSubEntry "" private variable preDefineHistorySize 6 private variable _userInputCmdStr "" private variable _droot private variable _fileName private variable _mBar # _allHeader is a string separated by newline characters private variable _allHeader private variable _ablehighLightColor yellow private variable _disablehighLightColor tan private variable _selLine 0 private variable _editStatus "append" private variable _keyList private variable _isFailedToCopy 0 private variable _fatherFitsExtension private variable _caseOption "-nocase" private variable _isRequired 0 private variable _insertDone 1 private variable _currentHDU private variable _actionRec {} private variable _backUpRec "" private variable _isBeingDestroyed 0 private variable _modifiedKey } # FitsHeader FitsHeaderObjName FitsFileObjName _currentHDU itcl::body FitsHeader::constructor {args} { #use the FitsFile class to handle the fits files. set _fFile FitsExtension::[lindex $args 0] set _fatherFitsExtension [lindex $args 1] set _currentHDU [$_fFile cget -currentHDU] set _isFailedToCopy [$_fFile cget -isFailedToCopy] set _fileName [$_fFile getOrigName] # Header info set _allHeader [$_fFile dumpHeader] # _allHeader is a string separated by newline characters $_fatherFitsExtension addChild $this header _makeHeader } itcl::body FitsHeader::destructor {} { set _isBeingDestroyed 1 destroy $_droot $_fatherFitsExtension freeChild $this } itcl::body FitsHeader::refresh {} { set _allHeader [eval $_fFile dumpHeader] # rewrite keys _dispKeys # clean up the highlighted keys _selectLine 1 } ## sets the _fileName ## then registers the window with the filename as window title # itcl::body FitsHeader::setFileName { fName_ } { if ![winfo exists $_droot] return set _fileName $fName_ set rName [urlTail $fName_] set dName [getFullDirPath $fName_] .fvwinkeeper signoff $_droot .fvwinkeeper register $_droot Header $rName $_currentHDU $this wm title $_droot "fv: Header of $rName\[[expr $_currentHDU-1]\] in $dName" } ## this creates the FitsHeader edit window # itcl::body FitsHeader::_makeHeader {} { global isMac isWin global g_titleFont global g_entryFont if { $isMac } { set cmdkey "Cmd" } else { set cmdkey "Alt" } # Display parameter catch {destroy $_droot} set _droot .[namespace tail $this] powToplevel $_droot .dummy setFileName $_fileName bind $_droot {} bind $_droot {} bind $_droot {} # bind for the selection bind $_droot [itcl::code $this _moveLine -1] bind $_droot [itcl::code $this _moveLine 1] bind $_droot +[itcl::code $this _closeFrWm %W] # Bind window to menu events bind $_droot <> [itcl::code $this _saveFile] bind $_droot <> [itcl::code $this _saveAsFile] bind $_droot <> [itcl::code $this _saveHeaderToAscii] bind $_droot <> [itcl::code $this closeCmd] bind $_droot <> [itcl::code $this _UndoCmd] bind $_droot <> [itcl::code $this _CopyCmd] bind $_droot <> [itcl::code $this _CutCmd] bind $_droot <> [itcl::code $this _PasteCmd] bind $_droot <> [itcl::code $this _ClearCmd] bind $_droot <> [itcl::code $this _deleteRec] bind $_droot <> [itcl::code $this _insertAbove] bind $_droot <> [itcl::code $this _postMenus] bind $_droot <> [itcl::code $this _createChecksum] bind $_droot <> [itcl::code $this _verifyChecksum] # Create toplevel MenuBar if { $isMac } { set _mBar .mbar.header set evtWndw "" } else { set _mBar $_droot.mbar set evtWndw $_droot } $_droot config -menu $_mBar if { ![winfo exists $_mBar] } { menu $_mBar -font g_titleFont if { $isMac } { $_mBar add cascade -menu $_mBar.apple $_mBar add cascade -menu $_mBar.file -label File $_mBar add cascade -menu $_mBar.edit -label Edit $_mBar add cascade -menu $_mBar.tool -label Tools $_mBar add cascade -menu .mbar.wind -label Windows $_mBar add cascade -menu $_mBar.help -label Help buildAppleStyleMenu $_mBar.apple } else { $_mBar add cascade -menu $_mBar.file -label File $_mBar add cascade -menu $_mBar.edit -label Edit $_mBar add cascade -menu $_mBar.tool -label Tools $_mBar add cascade -menu $_mBar.help -label Help } # FILE if { $isMac } { buildFileMenu $_mBar.file $_mBar.file entryconfig "Export" -label "Export as Text..." \ -state normal -font g_titleFont $_mBar.file entryconfig "Save As..." -state normal -font g_titleFont $_mBar.file entryconfig "Close" -state normal -font g_titleFont } else { menu $_mBar.file -tearoff False $_mBar.file add command -label "Save" -underline 0 \ -command "doMenuEvent <>" -accelerator "$cmdkey+S" -font g_titleFont $_mBar.file add command -label "Export as Text..." \ -command "doMenuEvent <>" -font g_titleFont $_mBar.file add command -label "Close" \ -command "doMenuEvent <>" -accelerator "$cmdkey+W" -font g_titleFont } # EDIT buildEditMenu $_mBar.edit $_mBar.edit insert "Prefer*" command -label "Insert Key" \ -command "doMenuEvent <>" -accelerator "$cmdkey+I" -font g_titleFont $_mBar.edit insert "Prefer*" command -label "Delete Key" \ -command "doMenuEvent <>" -accelerator "$cmdkey+D" -font g_titleFont $_mBar.edit insert "Prefer*" separator # TOOLS menu $_mBar.tool -tearoff False $_mBar.tool add command -label "Create Checksum" \ -command "doMenuEvent <>" -font g_titleFont $_mBar.tool add command -label "Verify Checksum" \ -command "doMenuEvent <>" -font g_titleFont # HELP buildHelpMenu $_mBar.help headerDisplay "Header Display" # Configure the Post Commands if { $isMac || $isWin } { # The Mac and Windows post all menus at once, so we only need # to do the post on the top level $_mBar configure -postcommand "doMenuEvent <> $evtWndw" } else { # Unix has to post each individual menu $_mBar.file configure -postcommand \ "doMenuEvent <> $evtWndw" $_mBar.edit configure -postcommand \ "doMenuEvent <> $evtWndw" $_mBar.tool configure -postcommand \ "doMenuEvent <> $evtWndw" } } frame $_droot.toolbar -relief raised -bd 1 pack $_droot.toolbar -side top -fill x -expand 0 label $_droot.toolbar.lfind -text "Search for:" -font g_titleFont package require Tix tix configure -fontset 14Point tixComboBox $_droot.toolbar.efind -editable true \ -historylimit 20 \ -selectmode browse \ -variable _userInputCmdStr \ -options { \ listbox.height 4 \ label.font g_titleFont \ listbox.font g_titleFont \ entry.font g_titleFont \ entry.background white \ entry.ipady 5 \ } \ -command [itcl::code $this _userInputCommand] set _tixSubEntry [$_droot.toolbar.efind subwidget entry] bind $_tixSubEntry [itcl::code $this _searchStr] button $_droot.toolbar.sfind -text "Find" \ -command [itcl::code $this _searchStr] -font g_titleFont label $_droot.toolbar.casel -text "Case sensitive?" -font g_titleFont button $_droot.toolbar.case -text No -command [itcl::code $this _caseSel] -font g_titleFont pack $_droot.toolbar.lfind -side left pack $_droot.toolbar.efind -side left pack $_droot.toolbar.sfind -side left pack $_droot.toolbar.casel -side left pack $_droot.toolbar.case -side left # text $_droot.text -wrap none -width 80 -relief sunken -bd 1 \ -xscrollcommand "$_droot.xscroll set" \ -yscrollcommand "$_droot.scroll set" -font g_entryFont if { ![winfo exist .popmenu] } { # buildEditMenu .popmenu menu .popmenu .popmenu add command -label "Undo" -command "doMenuEvent <>" .popmenu add command -label "Insert" -command "doMenuEvent <>" .popmenu add command -label "Delete" -command "doMenuEvent <>" } bind $_droot.text <1> +[itcl::code $this _clickSelectLine] # bin for the popup menu bind $_droot.text <3> [itcl::code $this _popTheMenu %X %Y] bind $_droot.text [itcl::code $this _popTheMenu %X %Y] scrollbar $_droot.scroll -command "$_droot.text yview" scrollbar $_droot.xscroll -orient horizontal -command "$_droot.text xview" entry $_droot.text2 -width 80 -relief sunken -bd 1 -font g_entryFont \ -textvariable [itcl::scope _modifiedKey] pack $_droot.text2 -side bottom -fill y -anchor w bind $_droot.text2 [itcl::code $this _changeKey] bind $_droot.text2 <> "[itcl::code $this _ClearCmd];break" pack $_droot.scroll -side right -fill y -expand 0 pack $_droot.xscroll -side bottom -fill x -expand 0 pack $_droot.text -side left -fill both -expand 1 _dispKeys } itcl::body FitsHeader::_userInputCommand { selection } { set _userInputCmdStr $selection } itcl::body FitsHeader::_bind_show { wndw {mode "-verbose"} } { puts $wndw foreach tag [bindtags $wndw] { puts "\t$tag" foreach spec [bind $tag] { puts "\t\t$spec" if { $mode == "-verbose" } { set cmd [bind $tag $spec] set cmd [string trim $cmd "\n"] regsub -all "\n" $cmd "\n\t\t\t" cmd puts "\t\t\t$cmd" } } } } itcl::body FitsHeader::_postMenus {} { global isMac _setEditStatus if { [$_fFile isFileChanged] && ![$_fFile isReadOnly] } { $_mBar.file entryconfigure Save -state normal } else { $_mBar.file entryconfigure Save -state disabled } update idle } itcl::body FitsHeader::bringToFront {} { if { ![winfo ismapped $_droot] } { wm deiconify $_droot } raise $_droot focus $_droot } itcl::body FitsHeader::_dispKeys {} { $_droot.text configure -state normal $_droot.text delete 1.0 end $_droot.text insert 0.0 $_allHeader set tmpNumKwds [$_droot.text index end] $_droot.text insert end "END" set _keyList {} # there are two blank space needs to be removed. for {set i 1} { $i< [expr $tmpNumKwds-1]} {incr i} { lappend _keyList [$_droot.text get $i.0 $i.8] } # $_droot.text configure -state disabled $_droot.text configure -state disabled # set up a mark for search $_droot.text mark set smark 1.0 } itcl::body FitsHeader::_caseSel {} { if { [$_droot.toolbar.case cget -text] == "Yes"} { $_droot.toolbar.case configure -text No set _caseOption "-nocase" } else { $_droot.toolbar.case configure -text Yes set _caseOption "" } } itcl::body FitsHeader::_popTheMenu {x_ y_} { _setEditStatus tk_popup .popmenu $x_ $y_ } itcl::body FitsHeader::_setEditStatus {} { # _selLine isFailed _actionRec clipboard # Undo Y # Copy Y # Cut Y N # Paste Y N Y # Clear Y N # Insert Y N # Delete Y N if { [llength $_actionRec] == 0 } { $_mBar.edit entryconfigure Undo -state disabled .popmenu entryconfigure Undo -state disabled } else { $_mBar.edit entryconfigure Undo -state normal .popmenu entryconfigure Undo -state normal } if { $_selLine == 0 } { $_mBar.edit entryconfigure "Copy" -state disabled } else { $_mBar.edit entryconfigure "Copy" -state normal } if { $_selLine != 0 && $_isFailedToCopy == 0 } { .popmenu entryconfigure Insert -state normal .popmenu entryconfigure Delete -state normal $_mBar.edit entryconfigure "Insert*" -state normal $_mBar.edit entryconfigure "Delete*" -state normal $_mBar.edit entryconfigure "Cut*" -state normal $_mBar.edit entryconfigure "Clear" -state normal if { [lindex [fvClipBoard report] 0] == "keyword" } { $_mBar.edit entryconfigure "Paste" -state normal } else { $_mBar.edit entryconfigure "Paste" -state disabled } } else { .popmenu entryconfigure Delete -state disabled .popmenu entryconfigure Insert -state disabled $_mBar.edit entryconfigure "Delete*" -state disabled $_mBar.edit entryconfigure "Insert*" -state disabled $_mBar.edit entryconfigure "Cut*" -state disabled $_mBar.edit entryconfigure "Clear" -state disabled $_mBar.edit entryconfigure "Paste" -state disabled } } itcl::body FitsHeader::_searchStr {} { global env # get the string from entry and find out the line and column number set fStr [$_tixSubEntry get] if { $fStr == ""} { return } $_droot.toolbar.efind addhistory $fStr set fPos [eval $_droot.text search $_caseOption -forward {$fStr} smark ] if { $fPos == ""} { tk_messageBox -icon warning -type ok -message "End of Search" return } scan $fPos "%d.%d" curLine curCol _selectLine $curLine _highlightValue # if doesn't exist, beep; else highlight if { $fPos == "" } { bell } else { $_droot.text mark set smark $curLine.[expr $curCol+2] $_droot.text see smark $_droot.text tag delete foundStr $_droot.text tag add foundStr ${curLine}.${curCol} \ ${curLine}.[expr $curCol+[string length $fStr]] $_droot.text tag configure foundStr -background grey -borderwidth 2 \ -relief raised } focus $_tixSubEntry } itcl::body FitsHeader::_insertAbove {} { # delete the previous imcomplete insertion _cleanEmptyInsert if { $_isRequired > 1} return $_droot.text configure -state normal $_droot.text insert $_selLine.0 " \n" $_droot.text configure -state disabled _selectLine $_selLine focus $_droot.text2 # reset parameters set _modifiedKey "" set _insertDone 0 set _editStatus "insert" } itcl::body FitsHeader::_clickSelectLine {} { _cleanEmptyInsert set pos [$_droot.text index current] set line [lindex [split $pos .] 0] _selectLine $line _highlightValue } itcl::body FitsHeader::_cleanEmptyInsert {} { # if one is inserting a new key, and he moves the highlight. Then the inserting # is canceled, clean the blank line if { ($_insertDone != 0) || ($_editStatus != "insert")} { return } $_droot.text configure -state normal $_droot.text delete $_selLine.0 [expr 1+$_selLine].0 $_droot.text configure -state disabled set _insertDone 1 } itcl::body FitsHeader::_selectLine {line_} { set _selLine $line_ $_droot.text mark set smark $line_.0 $_droot.text see $line_.0 set key [$_droot.text get $line_.0 $line_.80] set _backUpRec $key set keyRoot [string range $key 0 4] set keyName [string range $key 0 7] if { $keyName == "" } { $_droot.text configure -state normal $_droot.text insert $line_.0 " " $_droot.text configure -state disabled } $_droot.text tag delete selectedLine $_droot.text tag add selectedLine $line_.0 $line_.80 # $_droot.text2 delete 0 end if { $fvPref::ifProtectedKeys && ( ($keyName == "SIMPLE ") || ($keyName == "BITPIX ") || ($keyRoot == "NAXIS" ) || ($keyName == "PCOUNT ") || ($keyName == "TFIELDS ") || ($keyName == "GCOUNT ") ) } { $_droot.text tag configure selectedLine \ -background $_disablehighLightColor \ -borderwidth 2 -relief raised set tmpRec [$_fFile getNthKey $line_] set _modifiedKey [lindex $tmpRec 2] set _isRequired 2 } elseif { $fvPref::ifProtectedKeys && ( ($keyName == "XTENSION") || ($keyRoot == "TBCOL" ) || ($keyRoot == "THEAP" ) || ($keyRoot == "TFORM" ) ) } { $_droot.text tag configure selectedLine \ -background $_disablehighLightColor \ -borderwidth 2 -relief raised set tmpRec [$_fFile getNthKey $line_] set _modifiedKey [lindex $tmpRec 2] set _isRequired 1 } elseif { $keyName == "END" } { set _isRequired 0 $_droot.text tag configure selectedLine \ -background $_disablehighLightColor \ -borderwidth 2 -relief raised set _modifiedKey "" } else { $_droot.text tag configure selectedLine \ -background $_ablehighLightColor \ -borderwidth 2 -relief raised set _modifiedKey $key set _isRequired 0 } focus $_droot.text2 } itcl::body FitsHeader::_changeKey {} { set newRec $_modifiedKey if { ($newRec == "") && ($_editStatus != "insert") } { return } if { $_isFailedToCopy == 0 } { if { $_editStatus == "insert"} { # Pan Chai - # Add check to see if TDISPn has correct value if { [string range $newRec 0 4] == "TDISP" } { set result [ _checkTDISP $newRec ] if { $result == "FAILED" } { error "illegal TDISP value\nExamples: 'I6', 'F10.6', 'E12.4', 'D20.14'\nCode letter must be uppercase" } } _insKey $_selLine $newRec _recAction insert } else { if {$_isRequired >= 1} { set oldCard [$_fFile getNthKey $_selLine] if { $fvPref::ifAutoReformatKeys == 1} { set newRec "[lindex $oldCard 0] [lindex $oldCard 1] $newRec" } else { if { $newRec == "" } { set newRec { } } set newRec [format "%-8s= %s / %s" [lindex $oldCard 0] \ [lindex $oldCard 1] $newRec] } } set card [$_fFile putNthKey $_selLine $newRec \ $fvPref::ifAutoReformatKeys] set keyName [string range $card 0 7] # Pan Chai - # Add check to see if TDISPn has correct value if { [string range $keyName 0 4] == "TDISP" } { set result [ _checkTDISP $card ] if { $result == "FAILED" } { error "illegal TDISP value\nExamples: 'I6', 'F10.6', 'E12.4', 'D20.14'\nCode letter must be uppercase" } } set tmpPos [expr 1+ [lsearch $_keyList $keyName]] if { ($tmpPos == 0) && ($_selLine == 0)} { set ke_yPos [$_droot.text index end] scan $ke_yPos "%d.%d" tmpLine tmpCol $_droot.text configure -state normal $_droot.text insert [expr $tmpLine-1].0 "$card\n" $_droot.text configure -state disabled lappend _keyList $keyName _recAction append set _selLine $tmpLine } else { $_droot.text configure -state normal $_droot.text delete $_selLine.0 $_selLine.end $_droot.text insert $_selLine.0 $card $_droot.text configure -state disabled _recAction change } set _editStatus "append" } $_fFile changeFile _updateRestDisps } _selectLine $_selLine } itcl::body FitsHeader::_checkTDISP { card } { set valueStr [string range $card [expr [string first "'" $card] + 1] end] set valueStr [string range $valueStr 0 [expr [string first "'" $valueStr] - 1] ] set valueStr [string trim $valueStr] if { [string length $valueStr] == 0 } { return IGNORED } # check No.1 the TDIM keyword is a string if { [string wordend $valueStr 0] != [string length $valueStr] } { # then we find out the character in the breaking point.. set idx [string wordend $valueStr 0] # if the character in the breaking point is not a "." as like XX.X # then the test failed. if {[string range $valueStr $idx $idx] != "." } { return FAILED } } # check No.2 the TDIM keyword starts with A, L, I, B, O, Z, E, EN, ES, G or D set firstChar [string range $valueStr 0 0] if { $firstChar == "A" || $firstChar == "L" || $firstChar == "I" || $firstChar == "B" || $firstChar == "O" || $firstChar == "Z" || $firstChar == "F" || $firstChar == "E" || $firstChar == "G" || $firstChar == "D" } { set idx 1 set twoChars [string range $valueStr 0 1] if { $twoChars == "EN" || $twoChars == "ES" } { set idx 2 } set numChar [string range $valueStr $idx $idx] # check No.3 follow by a decimal digit if { $numChar >= "0" && $numChar <= "9" } { return SUCCESS } } # illegal TDISP keyword return FAILED } itcl::body FitsHeader::_deleteRec {} { if { $_isRequired >= 1} return _delKey $_selLine # record the action _recAction delete $_fFile changeFile # highlight the next line _selectLine $_selLine _highlightValue _updateRestDisps } itcl::body FitsHeader::_saveHeaderToAscii {} { set t [urlTail $_fileName] set r [file root $t] set e [file ext $t] if { [lsearch -exact [list .gz .Z .z] $e] != -1 } { set e [file ext $r] set r [file root $r] } set sugName "${r}_h[expr $_currentHDU-1].txt" # get the file name from the entry set asciiFileName [getSelectedFileName $sugName] if { $asciiFileName == "" } return if { [file exist $asciiFileName] == 1 } { set feedback [promptMsg "File $asciiFileName exist\n overwrite?" \ return Yes No] if { $feedback == "CANCEL"} return } # open the file as write set f [open $asciiFileName w] # dump all the headers to the file puts $f [string trimright [$_fFile dumpHeader]] puts $f "END" # flush it flush $f # close it close $f # destroy it } itcl::body FitsHeader::_saveAsFile { } { $_fFile saveAs } itcl::body FitsHeader::_saveFile {} { $_fFile save _updateHL } itcl::body FitsHeader::_updateHL {} { if { [lsearch $_keyList "EXTNAME "]<0 } { # $_fatherFitsExtension updateHL EXTNAME NoName } else { set extVal [lindex [lindex [$_fFile getKeyword EXTNAME] 0] 1] $_fatherFitsExtension updateHL EXTNAME [string trim $extVal {' }] } } itcl::body FitsHeader::_closeFrWm {w_} { if { $w_ == $_droot && !$_isBeingDestroyed } { closeCmd } } itcl::body FitsHeader::closeCmd {} { .fvwinkeeper signoff $_droot _updateHL itcl::delete object $this } itcl::body FitsHeader::_moveLine {mode_} { if { $_selLine == 0 } return _cleanEmptyInsert if { $mode_ == 1} { incr _selLine set tmp [expr 1+[llength $_keyList]] if {$_selLine > $tmp } { set _selLine $tmp } } elseif {$mode_ == -1 } { incr _selLine -1 if { $_selLine < 1 } { set _selLine 1 } } else { error "Unknown move mode (should be 1/-1)" } _selectLine $_selLine _highlightValue } itcl::body FitsHeader::_updateRestDisps {} { $_fatherFitsExtension updateDisps $this } itcl::body FitsHeader::_recAction {action_} { # store actions and associated info if { $action_ == "append" } { lappend _actionRec [list $action_ [llength $_keyList] $_backUpRec] } else { lappend _actionRec [list $action_ $_selLine $_backUpRec] } } ##################### # # Edit Menu Bindings # ##################### itcl::body FitsHeader::_UndoCmd {} { set lastActionRec [lindex $_actionRec end] if { $lastActionRec == "" } { return } set _actionRec [lreplace $_actionRec end end] set lastAction [lindex $lastActionRec 0] set lastPosition [lindex $lastActionRec 1] set lastRecord [lindex $lastActionRec 2] switch $lastAction { insert { _delKey $lastPosition } delete { $_droot.text configure -state normal $_droot.text insert $lastPosition.0 "\n" $_droot.text configure -state disabled _insKey $lastPosition $lastRecord } append { _delKey $lastPosition } change { _delKey $lastPosition $_droot.text configure -state normal $_droot.text insert $lastPosition.0 "\n" $_droot.text configure -state disabled _insKey $lastPosition $lastRecord } default { error "No such action recorded" } } _selectLine $lastPosition _highlightValue _updateRestDisps } itcl::body FitsHeader::_CopyCmd {} { set key [$_droot.text get $_selLine.0 $_selLine.80] set keyName [string trimright [lindex $key 0] =] if { $keyName == "HIERARCH" } { set keyName [string trimright [lindex $key 1] =] } fvClipBoard register keyword $_fileName $keyName $key } itcl::body FitsHeader::_CutCmd {} { if {$_isRequired >= 1} return _CopyCmd _deleteRec } itcl::body FitsHeader::_PasteCmd {} { if {$_isRequired >= 1} return set clipRec [fvClipBoard report] if { [lindex $clipRec 0] != "keyword" } return _insertAbove set _modifiedKey [lindex $clipRec 2] _changeKey } itcl::body FitsHeader::_ClearCmd {} { if {$_isRequired >= 1} return _deleteRec _insertAbove } itcl::body FitsHeader::_insKey {pos_ rec_} { set card [$_fFile insertKey $pos_ $rec_ $fvPref::ifAutoReformatKeys] set newKey [string range $card 0 7] $_droot.text configure -state normal $_droot.text delete $pos_.0 $pos_.end $_droot.text insert $pos_.0 $card $_droot.text configure -state disabled set _keyList [linsert $_keyList $pos_ $newKey] set _editStatus "append" set _insertDone 1 } itcl::body FitsHeader::_delKey {pos_} { $_droot.text configure -state normal $_droot.text delete $pos_.0 [expr 1+$pos_].0 $_droot.text tag delete selectedLine $_droot.text configure -state disabled # need to delete the rec from the file $_fFile delNthKey $pos_ # set _modifiedKey "" set tmp [expr $pos_ - 1] set _keyList [lreplace $_keyList $tmp $tmp] } itcl::body FitsHeader::_createChecksum {} { $_fFile updateChecksum 1 refresh } itcl::body FitsHeader::_verifyChecksum {} { set checksumStatus [$_fFile verifyChecksum] switch -- $checksumStatus { 1 { tk_messageBox -icon info \ -message "The CHECKSUM keyword is valid" } 0 { set res [tk_messageBox -icon warning -message \ "The CHECKSUM keyword does not exist in this HDU.\n\ \nCreate keywords?" -type yesno -default "no"] if { $res == "yes" } { $_fFile updateChecksum 1 refresh } } -1 { set res [tk_messageBox -icon error \ -message "The CHECKSUM keyword is invalid!\n\ \nUpdate keywords?" -type yesno -default "no"] if { $res == "yes" } { $_fFile updateChecksum 1 refresh } } default { error "Unknown error in checksum varification"} } } itcl::body FitsHeader::_highlightValue {} { set root [string range $_modifiedKey 0 7] $_droot.text2 selection clear if { $_isRequired } { # Only the comment is present $_droot.text2 selection range 0 end $_droot.text2 icursor end } elseif { $root == "COMMENT " || $root == "HISTORY " } { # Highlight entire field except keyword set value [string trimleft [string range $_modifiedKey 8 end] { }] set idx [string first $value $_modifiedKey] $_droot.text2 selection range $idx end $_droot.text2 icursor end } else { # Locate value to hightlight set k [$_fFile getNthKey $_selLine] set val [lindex $k 1] if { [string range $val 0 0] == "'" && [string range $val end end] == "'" } { set last [string length $val] set val [string range $val 1 [expr $last-2]] } set start [string first = $_modifiedKey] if { $start == -1 } { set start 9 } set idx [string first $val $_modifiedKey $start] if { $idx == -1 } { $_droot.text2 icursor end } else { set last [expr $idx + [string length $val]] $_droot.text2 selection range $idx $last $_droot.text2 icursor $last } } } fv5.4/ftools/guis/fv/class/FitsHistoParam.tcl0000644000220700001010000004254510766554457020637 0ustar birbylheadevitcl::class FitsHistoParam { inherit itk::Toplevel private variable xColName private variable yColName private variable cColName private variable rowRange private variable xMin private variable yMin private variable xMax private variable yMax private variable uxMin private variable uyMin private variable uxMax private variable uyMax private variable tlxMin private variable tlyMin private variable tlxMax private variable tlyMax private variable xBin private variable yBin private variable _colNames private variable _histselonly private variable fTable private variable fFile private variable type public method insertDefaultValue {} public method getXMinMax {} public method getYMinMax {} public method getMinMax {} public method turnsel {flag} private method quitCmd {} private method _makeHistogram { closeFlag } private method enableEntry {} private method disableEntry {} private method getSelRange {} constructor {args} { global g_histoParam global g_titleFont option add *FitsHistoParam.font g_titleFont option add *FitsHistoParam.labelfont g_titleFont # frame layout set fFile [lindex $args 0] set _listPreSelectedColNames [lindex $args 1] set _colNames $_listPreSelectedColNames set fTable [lindex $args 2] set xColName "" set yColName "" set cColName "" set rowRange "" set xMin "" set yMin "" set xMax "" set yMax "" set uxMin "" set uyMin "" set uxMax "" set uyMax "" set tlxMin "" set tlyMin "" set tlxMax "" set tlyMax "" set xBin "" set yBin "" set g_histoParam "" # # labels itk_component add title { message $itk_interior.mssg -text \ "Make a 1D or 2D histogram by binning 1 or 2 table columns" \ -width 400 -relief ridge } itk_component add colLabel { label $itk_interior.coll -text "Column Name" } itk_component add rowLabel { label $itk_interior.rowl -text "Row Range" } itk_component add tlminLabel { label $itk_interior.tlminl -text "TLMin" } itk_component add tlmaxLabel { label $itk_interior.tlmaxl -text "TLMax" } itk_component add uminLabel { label $itk_interior.uminl -text "Min" } itk_component add umaxLabel { label $itk_interior.umaxl -text "Max" } itk_component add minLabel { label $itk_interior.minl -text "Data Min" } itk_component add maxLabel { label $itk_interior.maxl -text "Data Max" } itk_component add binLabel { label $itk_interior.binl -text "Bin Size" } itk_component add sep { frame $itk_interior.sep -height 8 -borderwidth 3 -relief ridge } #entry itk_component add xcolEntry { iwidgets::combobox $itk_interior.xcole -labeltext X -labelpos n \ -textvariable [itcl::scope xColName] -width 14 \ -selectioncommand [itcl::code $this getXMinMax] } eval $itk_component(xcolEntry) insert list 0 $_listPreSelectedColNames itk_component add rowEntry { entry $itk_interior.rowe -width 14 -textvariable [itcl::scope rowRange] } bind $itk_component(rowEntry) [itcl::code $this getXMinMax] bind $itk_component(rowEntry) +[itcl::code $this getYMinMax] itk_component add tlxminEntry { entry $itk_interior.tlxmine -width 14 -textvariable [itcl::scope tlxMin] \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -state disabled -borderwidth 1 -relief raised } itk_component add tlxmaxEntry { entry $itk_interior.tlxmaxe -width 14 \ -borderwidth 1 -relief raised \ -textvariable [itcl::scope tlxMax] \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -state disabled } itk_component add uxminEntry { entry $itk_interior.uxmine -width 14 -textvariable [itcl::scope uxMin] } itk_component add uxmaxEntry { entry $itk_interior.uxmaxe -width 14 -textvariable [itcl::scope uxMax] } itk_component add xminEntry { entry $itk_interior.xmine -width 14 \ -borderwidth 1 -relief raised \ -textvariable [itcl::scope xMin] -state disabled \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor } itk_component add xmaxEntry { entry $itk_interior.xmaxe -width 14 \ -borderwidth 1 -relief raised \ -textvariable [itcl::scope xMax] -state disabled \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor } itk_component add xbinEntry { entry $itk_interior.xbine -width 14 -textvariable [itcl::scope xBin] } ###################### itk_component add ycolEntry { global g_titleFont iwidgets::combobox $itk_interior.ycole -labeltext Y -labelpos n \ -textvariable [itcl::scope yColName] -width 14 \ -selectioncommand [itcl::code $this getYMinMax] \ } { keep -labelfont -textfont } eval $itk_component(ycolEntry) insert list end $_listPreSelectedColNames itk_component add ccolEntry { iwidgets::combobox $itk_interior.ccole -labeltext Weight \ -labelpos n \ -textvariable [itcl::scope cColName] -width 14 } eval $itk_component(ccolEntry) insert list end $_listPreSelectedColNames itk_component add tlyminEntry { entry $itk_interior.tlymine -width 14 \ -borderwidth 1 -relief raised \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -textvariable [itcl::scope tlyMin] -state disabled } itk_component add tlymaxEntry { entry $itk_interior.tlymaxe -width 14 \ -borderwidth 1 -relief raised \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -textvariable [itcl::scope tlyMax] -state disabled } itk_component add uyminEntry { entry $itk_interior.uymine -width 14 -textvariable [itcl::scope uyMin] } itk_component add uymaxEntry { entry $itk_interior.uymaxe -width 14 -textvariable [itcl::scope uyMax] } itk_component add yminEntry { entry $itk_interior.ymine -width 14 \ -borderwidth 1 -relief raised \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -textvariable [itcl::scope yMin] -state disabled } itk_component add ymaxEntry { entry $itk_interior.ymaxe -width 14 \ -borderwidth 1 -relief raised \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -textvariable [itcl::scope yMax] -state disabled } itk_component add ybinEntry { entry $itk_interior.ybine -width 14 -textvariable [itcl::scope yBin] } itk_component add histselonlyCHK { checkbutton $itk_interior.histselonly -text "Use selected rows" \ -variable [itcl::scope _histselonly ] \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black \ -activebackground $fvPref::globalBgColor \ -state disabled \ -command [itcl::code $this getMinMax] } { usual ignore -selectcolor -activeforeground -activebackground } itk_component add Button { iwidgets::buttonbox $itk_interior.bb } $itk_component(Button) add makeclose -text "Make/Close" \ -font g_titleFont \ -command [itcl::code $this _makeHistogram true] $itk_component(Button) add make -text "Make" \ -font g_titleFont \ -command [itcl::code $this _makeHistogram false] $itk_component(Button) add cancel -text Close \ -font g_titleFont \ -command [itcl::code $this quitCmd] $itk_component(Button) add help -text Help \ -font g_titleFont \ -command "hhelp 2D-Histogram" pack $itk_component(Button) -side bottom grid configure $itk_component(title) -column 0 -row 0 \ -columnspan 4 -sticky "new" -ipady 10 grid configure $itk_component(colLabel) -column 0 -row 1 \ -sticky "se" grid configure $itk_component(tlminLabel) -column 0 -row 2 -sticky "se" grid configure $itk_component(tlmaxLabel) -column 0 -row 3 -sticky "se" grid configure $itk_component(minLabel) -column 0 -row 4 -sticky "se" grid configure $itk_component(maxLabel) -column 0 -row 5 -sticky "se" grid configure $itk_component(uminLabel) -column 0 -row 6 -sticky "se" grid configure $itk_component(umaxLabel) -column 0 -row 7 -sticky "se" grid configure $itk_component(binLabel) -column 0 -row 8 -sticky "se" grid configure $itk_component(rowLabel) -column 0 -row 9 -sticky "se" grid configure $itk_component(histselonlyCHK) -column 0 -row 10 \ -columnspan 4 -sticky "snew" grid configure $itk_component(sep) -column 0 -row 11 \ -columnspan 4 -sticky "snew" grid configure $itk_component(xcolEntry) -column 1 -row 1 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(ycolEntry) -column 2 -row 1 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(ccolEntry) -column 3 -row 1 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(tlxminEntry) -column 1 -row 2 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(tlxmaxEntry) -column 1 -row 3 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(tlyminEntry) -column 2 -row 2 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(tlymaxEntry) -column 2 -row 3 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(xminEntry) -column 1 -row 4 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(xmaxEntry) -column 1 -row 5 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(yminEntry) -column 2 -row 4 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(ymaxEntry) -column 2 -row 5 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(uxminEntry) -column 1 -row 6 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(uxmaxEntry) -column 1 -row 7 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(uyminEntry) -column 2 -row 6 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(uymaxEntry) -column 2 -row 7 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(rowEntry) -column 1 -row 9 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(xbinEntry) -column 1 -row 8 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(ybinEntry) -column 2 -row 8 \ -padx 4 -pady 4 -sticky "snew" grid configure $itk_component(Button) -column 0 -row 12 \ -columnspan 4 -sticky "snew" # eval itk_initialize } destructor { } } itcl::body FitsHistoParam::turnsel {flag} { if {$flag == 1} { $itk_component(histselonlyCHK) configure -state normal } else { $itk_component(histselonlyCHK) configure -state disabled } } itcl::body FitsHistoParam::insertDefaultValue {} { set token [split $_colNames " "] eval $itk_component(xcolEntry) selection set [lsearch -exact [string tolower $token] "x"] eval $itk_component(ycolEntry) selection set [lsearch -exact [string tolower $token] "y"] getXMinMax getYMinMax } itcl::body FitsHistoParam::getMinMax {} { getXMinMax getYMinMax } itcl::body FitsHistoParam::getXMinMax {} { if { $xColName == ""} return set selrange [$this getSelRange] set tlminmax [$fFile getTLMinMax $xColName] # set minmax [$fFile getColMinMax $xColName 1 $rowRange] set minmax [$fFile getColMinMax $xColName 1 $selrange] set xColType [lindex [lindex [$fFile getColInfo \ $xColName] 0] 4] if { [regexp {[duo]} $xColType] } { set colIsInt 1 set tmpMin [expr int([lindex $minmax 0])] set tmpMax [expr int([lindex $minmax 1])] } else { set colIsInt 0 set tmpMin [lindex $minmax 0] set tmpMax [lindex $minmax 1] } enableEntry set tlxMin [lindex $tlminmax 0] set tlxMax [lindex $tlminmax 1] set xMin $tmpMin set xMax $tmpMax if { $tlxMin == "" } { set uxMin $xMin } else { set uxMin $tlxMin } if { $tlxMax == "" } { set uxMax $xMax } else { set uxMax $tlxMax } set colnum [$fFile getColNum $xColName] if { [catch {set tmpbin [$fFile getKeyword "TDBIN$colnum"]}] } { # TDBIN keyword doesn't exist, so calculate one # default 2^n binsize set diff [expr $uxMax - $uxMin] set n [expr floor( log($diff/257.0)/log(2.0) )] set xBin [expr pow(2.0,$n)] if { $colIsInt } { if { $xBin < 1} { set xBin 1 } else { set xBin [expr int($xBin)] } } } else { set xBin [lindex [lindex $tmpbin 0] 1] } disableEntry } itcl::body FitsHistoParam::getSelRange {} { if { $_histselonly == 1 } { set numRows [$fTable getnumRows] if { $rowRange == "" } { set tmpRange "1-$numRows" } else { set tmpRange $rowRange } set selrange "" set tmplist [split $tmpRange ","] set numlist [llength $tmplist] for { set k 0 } {$k <$numlist } {incr k} { set start_end [lindex $tmplist $k] if { $selrange =="" } { append selrange [$fTable _parseToRowRange $start_end] } else { append selrange "," [$fTable _parseToRowRange $start_end] } } if {$selrange == "" } { set selrange "1-1" } } else { set selrange $rowRange } return $selrange } itcl::body FitsHistoParam::getYMinMax {} { if { $yColName == ""} return set selrange [$this getSelRange] set tlminmax [$fFile getTLMinMax $yColName] # set minmax [$fFile getColMinMax $yColName 1 $rowRange] set minmax [$fFile getColMinMax $yColName 1 $selrange] set yColType [lindex [lindex [$fFile getColInfo \ $yColName] 0] 4] if { [regexp {[duo]} $yColType] } { set colIsInt 1 set tmpMin [expr int([lindex $minmax 0])] set tmpMax [expr int([lindex $minmax 1])] } else { set colIsInt 0 set tmpMin [lindex $minmax 0] set tmpMax [lindex $minmax 1] } enableEntry set tlyMin [lindex $tlminmax 0] set tlyMax [lindex $tlminmax 1] set yMin $tmpMin set yMax $tmpMax if { $tlyMin == "" } { set uyMin $yMin } else { set uyMin $tlyMin } if { $tlyMax == "" } { set uyMax $yMax } else { set uyMax $tlyMax } set colnum [$fFile getColNum $yColName] if { [catch {set tmpbin [$fFile getKeyword "TDBIN$colnum"]}] } { # TDBIN keyword doesn't exist, so calculate one set diff [expr $uyMax - $uyMin] set n [expr floor( log($diff/257.0)/log(2.0) )] set yBin [expr pow(2.0,$n)] if { $colIsInt } { if { $yBin < 1} { set yBin 1 } else { set yBin [expr int($yBin)] } } } else { set yBin [lindex [lindex $tmpbin 0] 1] } disableEntry } itcl::body FitsHistoParam::enableEntry {} { $itk_component(tlxminEntry) configure -state normal $itk_component(tlyminEntry) configure -state normal $itk_component(tlxmaxEntry) configure -state normal $itk_component(tlymaxEntry) configure -state normal $itk_component(xminEntry) configure -state normal $itk_component(yminEntry) configure -state normal $itk_component(xmaxEntry) configure -state normal $itk_component(ymaxEntry) configure -state normal } itcl::body FitsHistoParam::disableEntry {} { $itk_component(tlxminEntry) configure -state disabled $itk_component(tlyminEntry) configure -state disabled $itk_component(tlxmaxEntry) configure -state disabled $itk_component(tlymaxEntry) configure -state disabled $itk_component(xminEntry) configure -state disabled $itk_component(yminEntry) configure -state disabled $itk_component(xmaxEntry) configure -state disabled $itk_component(ymaxEntry) configure -state disabled } itcl::body FitsHistoParam::_makeHistogram { closeFlag } { global g_histoParam global g_backupDir global g_histoFileID set g_histoParam "" set selrange [$this getSelRange] if { $xColName == "" } { error "Please select a x column" } if { $xBin == "" } { error "Please provide x bin size" } if { $cColName != "" } { lappend g_histoParam -weight $cColName } if { $selrange != "" } { lappend g_histoParam -rows $selrange } incr g_histoFileID set histoFileName [file join ${g_backupDir} histo.tmp$g_histoFileID] lappend g_histoParam $histoFileName lappend g_histoParam [list $xColName $uxMin $uxMax $xBin] if { $yColName != "" } { if { $yBin == ""} { error "Please provide y bin size" } lappend g_histoParam [list $yColName $uyMin $uyMax $yBin] } if { $g_histoFileID > 0 } { if ![file exists $histoFileName] { eval $fFile makeHistogram $g_histoParam } else { } set fftmp [openFitsFile [file join $g_backupDir histo.tmp$g_histoFileID]] $fftmp changeFile $fftmp plotData 1 } if { $closeFlag == "true" } { itcl::delete object $this } } itcl::body FitsHistoParam::quitCmd {} { global g_histoParam # global _fth set g_histoParam "" # set _fth 0 itcl::delete object $this } fv5.4/ftools/guis/fv/class/FitsImage.tcl0000644000220700001010000013007412055472637017575 0ustar birbylheadev# First draft 06/27/96 Jianjun #-------------------------------------------------------------- # Modification history # Ziqin Pan, Feb 18, 2004 # Add export as text on selected rows #-------------------------------------------------------------- # FitsImage FitsImageObjName FitsFileObjName currentHDU itcl::class FitsImage { inherit Table constructor {args} {} destructor {} # this public method overrides the parent Table class public method setFileName { fName_ } # these public methods are not in the parent and are unique to this class public method makeImage { } public method showCell {col_ row_} public method imagePlot {paramList_} public method _sPlotCmd {} public variable imgHandle # these protected methods override the parent Table class protected method _buildMenus {} protected method _postMenus {} protected method _drawTable {} protected method _readInTable {} protected method _plotCmd {} protected method _saveTableToAscii {win_ asciiFileName_} protected method _constructDS9Image { tmpfile } # data handlers protected method _readTableData {fCol_ fRow_ nCols_ nRows_} protected method _writeTableData {col_ row_ val_} protected method _getFormattedData {col_ row_} protected method _getRawDataForDS9 {col_ row_} protected method _getRawData {col_ row_} protected method _getRawDataBlock { fCol_ fRow_ lCol_ lRow_ } protected method _getImageVectorData { fCol_ fRow_ lCol_ lRow_ } protected method _putRawDataBlock { fCol_ fRow_ data_ } protected method _putRawData {col_ row_ val_} # these protected methods are not in the parent and are unique to this class protected method _powMakeImageFlip { direction } protected method _powMakeImage {} protected method _saoMakeImage {} protected method _ds9MakeImage {} protected method _ds9MakePlot { rowNum_ fRow lRow xColumn_ yColumn_ } # these protected variables are not in the parent and are unique to this class protected variable _imgType protected variable _bitpixKey protected variable _cellSize protected variable _isImageTable 0 protected variable _slice 1 protected variable _dims protected variable _imgNull protected variable _colData protected variable _imgForm protected variable _tableDataDS9 #protected variable fFile } itcl::body FitsImage::constructor {args} { # if _tableType exists, then we're creating a VectorTable, so skip these inits if { ![info exists _tableType] } { set fFile FitsExtension::[lindex $args 0] set _fatherFitsExtension [lindex $args 1] set currentHDU [$fFile cget -currentHDU] set isFailedToCopy [$fFile cget -isFailedToCopy] set fileName [$fFile getOrigName] # Image info set _dims [$fFile getImgInfo] if { [llength $_dims] > 1 } { set _numCols [lindex $_dims 0] set _numRows [lindex $_dims 1] } else { # Display image vertically set _numCols 1 set _numRows [lindex $_dims 0] } if { $_showRows > $_numRows } { set _showRows $_numRows } if { $_showCols > $_numCols } { set _showCols $_numCols } set _bitpixKey [$fFile getImgType] if { [catch { set tmpNul [$fFile getKeyword BLANK] }] } { set _imgNull "NULL" } else { set _imgNull [lindex [join $tmpNul] 1] } if { ![catch {$fFile getKeyword BZERO}] || ![catch {$fFile getKeyword BSCALE}] } { set _imgType 4 # set _imgForm "% #.10E" set _imgForm "%g" } else { if { $_bitpixKey == "8" } { set _imgType 0 set _imgForm "%u" } elseif {$_bitpixKey == "16"} { set _imgType 1 set _imgForm "%d" } elseif {$_bitpixKey == "32"} { set _imgType 2 set _imgForm "%d" } elseif {$_bitpixKey == "-32"} { set _imgType 3 # set _imgForm "% #.5f" set _imgForm "%g" } elseif {$_bitpixKey == "-64"} { set _imgType 4 # set _imgForm "% #.10E" set _imgForm "%g" } elseif {$_bitpixKey == "64"} { set _imgType 5 set _imgForm "%s" } else { puts "unsupported image format, treat as integer type" set _imgType 2 } } set _tableType Image $_fatherFitsExtension addChild $this table } } itcl::body FitsImage::destructor {} { if { $_tableType == "Image" } { #take care of the stuff on the canvas if { $_isImageTable } { set _isBeingDestroyed 1 destroy $_droot } $_fatherFitsExtension freeChild $this } # else it's a VectorTable, so follow VectorTable's destructor's code } itcl::body FitsImage::setFileName { fName_ } { Table::setFileName $fName_ .fvwinkeeper signoff $_droot .fvwinkeeper register $_droot "Image Table" [urlTail $fName_] $currentHDU \ $this } itcl::body FitsImage::_drawTable {} { Table::_drawTable bind $_droot <> [itcl::code $this _plotCmd] } itcl::body FitsImage::_buildMenus {} { global isMac global g_titleFont if { $isMac } { set _mBar .mbar.itable } else { set _mBar $_droot.mbar } $_droot config -menu $_mBar if { ![winfo exists $_mBar] } { _buildNewMenus # Can only Plot an image $_mBar.tools add command -label "Plot..." \ -command "doMenuEvent <>" -font g_titleFont } } itcl::body FitsImage::_postMenus {} { Table::_postMenus update idle } itcl::body FitsImage::_readInTable { } { global g_charPix set _DC(height) 20 set _DC(width) [expr (int(log10($_numRows))+6)*$g_charPix] # set _DC(headroom) 20 set _DC(headroom) 80 set _DC(footroom) 40 set _DC(vscrollsize) 15 set _DC(hscrollsize) 15 set _DC(rightspace) 6 set _DC(interline) 0 set _DC(tmar) 6 set _DC(lmar) 8 set _DC(tabspace) 0 # flag that the imageTable is being displayed set _isImageTable 1 if { $_imgType == 0 } { set _cellSize 8 } elseif {$_imgType == 1} { set _cellSize 8 } elseif {$_imgType == 2} { set _cellSize 16 } elseif {$_imgType == 3} { set _cellSize 16 } elseif {$_imgType == 4 || $_imgType == 5} { set _cellSize 20 } else { set _cellSize 8 } set _listPreSelectedColNames {} set _dispCols $_numCols # use fits command setrowstate to initialize the rowState # usage setrowstate totalNumOfRos startRow endRow status # (0:normal, 1:selected, 2: deleted) setarray rowState 0 [expr $_numRows-1] 0 setarray _colNotchedState 0 [expr $_dispCols-1] 0 set _absXPos(0) [expr $_DC(lmar) + $_DC(width) + $_DC(rightspace)] for {set i 0} {$i < $_dispCols} {incr i} { set _valueTDIM($i) 0 set _columnName($i) [expr $i+1] set _columnType($i) " " set _columnUnit($i) " " lappend _listPreSelectedColNames [expr $i+1] set _cellWidth($i) $_cellSize set _cellPixWidth($i) [expr $g_charPix*(1+$_cellWidth($i))] set _absXPos([expr $i+1]) [expr $_absXPos($i) + $_cellPixWidth($i) \ +$_DC(rightspace)] } } itcl::body FitsImage::makeImage { } { global g_hasSAOtng g_hasDS9 if { $fvPref::imgDisplayer == "SAOtng" && $g_hasSAOtng } { set err [catch {_saoMakeImage} errmsg] } elseif { $fvPref::imgDisplayer == "DS9" && $g_hasDS9 } { set err [catch {_ds9MakeImage} errmsg] } else { set err [catch {_powMakeImage} errmsg] } # after the image is displayed. clean up itcl::delete object $this if { $err } { error $errmsg } } itcl::body FitsImage::_saoMakeImage {} { global g_backupDir set err "none" set tmpfile $g_backupDir/saoimage.fits if { ![catch {$fFile copyCHDU $tmpfile} ] } { catch {exec xpaaccess SAOtng} result if { [string range $result 0 1] == "no" } { # start SAOtng if SAOtng isn't there if { [catch {exec saotng &} saopid] } { file delete $tmpfile if { [tk_dialog .saoError "SAOtng startup error" \ "Cannot start saotng!\nUse POW instead?" \ question 0 Yes No] == 0 } { _powMakeImage } return } # wait till saotng is up set flag 1 set nSecs 0 while { $flag } { after 1000 incr nSecs catch {exec xpaaccess SAOtng} result if { [string range $result 0 2] == "yes" } { set flag 0 } else { if { $nSecs > 10 } { file delete $tmpfile if { [tk_dialog .saoError "SAOtng startup error" \ "Cannot start saotng!\nUse POW instead?" \ question 0 Yes No] == 0 } { _powMakeImage } return } } } } exec echo "flip y" | xpaset SAOtng exec xpaset SAOtng fits < $tmpfile file delete $tmpfile } } itcl::body FitsImage::_constructDS9Image { tmpfile } { # Pan Chai.. this routine is been disabled set _dims [$fFile getImgInfo] set _bitpixKey [$fFile getImgType] set _extname "" catch { set _extname [$fFile getKeyword "EXTNAME"] } err set fh [$fFile cget -fitsfile] if { $_extname == "" } { catch {$fh load copyto $fileName $tmpfile} err } else { set _extname [string trim [lindex [split $_extname " "] 1] "\{'\}"] catch {$fh load copyto "$fileName\[$_extname\]" $tmpfile} err } return SUCCESS } itcl::body FitsImage::_ds9MakeImage {} { global g_backupDir set err "none" set tmpfile $g_backupDir/saoimage.fits set errorFlag [catch { file copy -force $fileName $tmpfile } err ] if { !$errorFlag } { catch {exec xpaaccess ds9} result if { [string range $result 0 1] == "no" } { # start DS9 if DS9 isn't there if { [catch {exec ds9 &} ds9pid] } { file delete $tmpfile if { [tk_dialog .saoError "DS9 startup error" \ "Cannot start DS9!\nUse POW instead?" \ question 0 Yes No] == 0 } { _powMakeImage } return } # wait till ds9 is up set flag 1 set nSecs 0 while { $flag } { after 1000 incr nSecs catch {exec xpaaccess ds9} result if { [string range $result 0 2] == "yes" } { set flag 0 } else { if { $nSecs > 10 } { file delete $tmpfile if { [tk_dialog .saoError "DS9 startup error" \ "Cannot start ds9!\nUse POW instead?" \ question 0 Yes No] == 0 } { _powMakeImage } return } } } } set ds9Ext [expr $currentHDU - 1] exec xpaset ds9 fits "[file tail $fileName]\[$ds9Ext\]" < "$tmpfile" file delete $tmpfile } else { file delete $tmpfile if { [tk_dialog .saoError "Can't create temporary file for DS9!\nTry POW instead?" \ question 0 Yes No] == 0 } { _powMakeImage } } } itcl::body FitsImage::_powMakeImageFlip { direction } { global powWCS global powWCSTranslation powPlotParam global xCount yCount global useWCSInfo # get the pow widget if { [winfo exist .pow.pow] != 1 } { powInit .dummy } set dataAddressForPOW [$fFile loadImage] regsub -all { } [urlTail $fileName] _ cleanFileName set imgIndex ${cleanFileName}_[expr $currentHDU-1] set imgHandle ${cleanFileName}_[expr $currentHDU-1] if { [llength $_dims] == 1 } { # Display image horizontally set nCols $_numRows set nRows $_numCols } else { set nCols $_numCols set nRows $_numRows } # the last param is for copying data powCreateDataFlip $imgHandle $dataAddressForPOW $_imgType [expr $nCols*$nRows] 1 $direction $nRows $nCols # free the data array $fFile freeImage $dataAddressForPOW set x_0 1 set y_0 1 set incrx 1 set incry 1 set x_label "" set y_label "" set x_unit "pixels" set y_unit "pixels" if { ![catch {set tmp [$fFile getKeyword CTYPE1]}] } { set v [lindex [lindex $tmp 0] 1] set x_label [string trim $v {' }] } if { ![catch {set tmp [$fFile getKeyword CTYPE2]}] } { set v [lindex [lindex $tmp 0] 1] set y_label [string trim $v {' }] } if { ![catch {set tmp [$fFile getKeyword CUNIT1]}] } { set v [lindex [lindex $tmp 0] 1] set x_unit [string trim $v {' }] } if { ![catch {set tmp [$fFile getKeyword CUNIT2]}] } { set v [lindex [lindex $tmp 0] 1] set y_unit [string trim $v {' }] } set z_label "counts" if { ![catch {set tmp [$fFile getKeyword BUNIT]}] } { set v [lindex [lindex $tmp 0] 1] set z_label [string trim $v {' }] } # Get the WCS info (if needed) and pass them to pow set useWCSInfo($imgHandle) $fvPref::ifWCSInfo set useWCSInfo(${imgHandle}scope) $fvPref::ifWCSInfo if { $fvPref::ifWCSInfo } { set wcsinfo [$fFile getWcs] set powWCS($imgIndex) $wcsinfo set x_label [lindex [lindex $wcsinfo 3] 0] set y_label [lindex [lindex $wcsinfo 3] 1] if { $x_unit=="pixels" } {set x_unit NULL} if { $y_unit=="pixels" } {set y_unit NULL} } else { set powWCS($imgIndex) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} } # powWCSTraslation is a variable that will be set in PowUtils.c set powWCSTranslation 0 set powPlotParam(graphType,$imgHandle) [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(graphType,${imgHandle}scope) $powPlotParam(graphType,$imgHandle) set powPlotParam(zoomed,$imgHandle) 0 set powPlotParam(zoomed,${imgHandle}scope) 0 set xCount($imgHandle) 0 set yCount($imgHandle) 0 set xCount(${imgHandle}scope) 0 set yCount(${imgHandle}scope) 0 powCreateImage $imgHandle $imgHandle 0 0 $nCols $nRows $x_0 \ $incrx $y_0 $incry $x_label $y_label $z_label if { $powWCSTranslation != 0 } { if { $powWCSTranslation == 1 } { tk_messageBox -icon warning -type ok \ -message "Unrecognized Coordinate System is ignored." } else { tk_messageBox -icon warning -type ok -message "$powWCSTranslation\n\ndefault to pixel coordinate." } set useWCSInfo($imgHandle) 0 set useWCSInfo(${imgHandle}scope) 0 set powWCS($imgIndex) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} powCreateImage $imgHandle $imgHandle 0 0 $nCols $nRows $x_0 \ $incrx $y_0 $incry $x_label $y_label $z_label powCreateGraph $imgHandle NULL $imgHandle $x_unit $y_unit \ $x_label $y_label \ [lindex $fvPref::graphDispSize 0] [lindex $fvPref::graphDispSize 1] } else { powCreateGraph $imgHandle NULL $imgHandle $x_unit $y_unit \ $x_label $y_label \ [lindex $fvPref::graphDispSize 0] [lindex $fvPref::graphDispSize 1] } # allows double clicking on an image to pop up table display centered on pixel .pow.pow bind img_$imgHandle <> \ "+returnCurrentImageInfo [$fFile getMaster] $currentHDU $imgHandle %x %y" } itcl::body FitsImage::_powMakeImage {} { global powWCS powRotation powWCSName global powWCSTranslation global powFitsHeader powFitsHeaderCnt powPlotParam global xCount yCount global graphHandleList global powWCSList powWCSLabel global useWCSInfo # get the pow widget if { [winfo exist .pow.pow] != 1 } { powInit .dummy } set dataAddressForPOW [$fFile loadImage] regsub -all { } [urlTail $fileName] _ cleanFileName set imgIndex ${cleanFileName}_[expr $currentHDU-1] set imgHandle ${cleanFileName}_[expr $currentHDU-1]_$_graphIDhighest set fileName [$fFile getOrigName] set idx -1 if [info exist graphHandleList] { set idx [lsearch -glob $graphHandleList [list $fileName "${imgIndex}*"]] } if { $idx < 0 } { # if we are creating a brand new image set entry {} lappend entry $fileName lappend entry $imgHandle lappend graphHandleList $entry incr _graphIDhighest } else { set imgHandle [lindex [lindex $graphHandleList $idx] 1] } if [info exists powWCS($imgHandle)] { powDeleteImage $imgHandle $imgHandle powDeleteGraph $imgHandle NOPROMPT powDeleteCurve $imgHandle curve catch { unset powWCS($imgHandle) } } if { [llength $_dims] == 1 } { # Display image horizontally set nCols $_numRows set nRows $_numCols } else { set nCols $_numCols set nRows $_numRows } # the last param is for copying data powCreateData $imgHandle $dataAddressForPOW $_imgType [expr $nCols*$nRows] 1 # free the data array $fFile freeImage $dataAddressForPOW set x_0 1 set y_0 1 set incrx 1 set incry 1 set x_label "" set y_label "" set x_unit "pixels" set y_unit "pixels" if { ![catch {set tmp [$fFile getKeyword CTYPE1]}] } { set v [lindex [lindex $tmp 0] 1] set x_label [string trim $v {' }] } if { ![catch {set tmp [$fFile getKeyword CTYPE2]}] } { set v [lindex [lindex $tmp 0] 1] set y_label [string trim $v {' }] } if { ![catch {set tmp [$fFile getKeyword CUNIT1]}] } { set v [lindex [lindex $tmp 0] 1] set x_unit [string trim $v {' }] } if { ![catch {set tmp [$fFile getKeyword CUNIT2]}] } { set v [lindex [lindex $tmp 0] 1] set y_unit [string trim $v {' }] } set z_label "counts" if { ![catch {set tmp [$fFile getKeyword BUNIT]}] } { set v [lindex [lindex $tmp 0] 1] set z_label [string trim $v {' }] } # Get the WCS info (if needed) and pass them to pow set powWCS($imgHandle) [$fFile getWcs] set powWCSName($imgHandle) 0 set powWCSName(${imgHandle}scope) 0 set useWCSInfo($imgHandle) $fvPref::ifWCSInfo set useWCSInfo(${imgHandle}scope) $fvPref::ifWCSInfo if { $fvPref::ifWCSInfo } { set result [$fFile getHeader2String] set cntList($imgHandle) [$fFile getHeaderKeyWord [lindex $result 0] $imgHandle] #puts "result: $result" #puts "cntList($imgHandle): $cntList($imgHandle)" set powFitsHeaderCnt($imgHandle) [lindex $cntList($imgHandle) 1] if { [lindex $cntList($imgHandle) 0] > 0 } { #set powFitsHeader($imgHandle) [$fFile assembleWcsHeader $imgHandle] set powFitsHeader($imgHandle) [lindex $result 0] #[$fFile headerDebugDataPrint "Default" $powFitsHeader($imgHandle)] #set powWCS($imgHandle) [$fFile getWcs] set powWCSInfo($imgHandle,DEFAULT) $powWCS($imgHandle) set wcsinfo $powWCS($imgHandle) set x_label [lindex [lindex $wcsinfo 3] 0] set y_label [lindex [lindex $wcsinfo 3] 1] if { $x_unit=="pixels" } {set x_unit NULL} if { $y_unit=="pixels" } {set y_unit NULL} if { ![catch {set tmp [$fFile getKeyword CROTA2]}] } { set v [lindex [lindex $tmp 0] 1] set powRotation($imgHandle) [string trim $v {' }] } } else { set powFitsHeader($imgHandle) [$fFile assembleWcsHeader $imgHandle NOWCS] set powWCS($imgHandle) [$fFile getWcs] } if { [lindex $powWCS($imgHandle) end] == "none" } { # no projection, assume linear #set powWCS($imgHandle) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} #set powFitsHeader($imgHandle) "" #set powFitsHeaderCnt($imgHandle) 0 } } else { set powWCS($imgHandle) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set powFitsHeader($imgHandle) "" set powFitsHeaderCnt($imgHandle) 0 } set powWCSTranslation 0 set powWCSList($imgHandle) {} set powWCSList(${imgHandle}scope) {} set powPlotParam(graphType,$imgHandle) [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(graphType,${imgHandle}scope) $powPlotParam(graphType,$imgHandle) set powPlotParam(zoomed,$imgHandle) 0 set powPlotParam(zoomed,${imgHandle}scope) 0 set xCount($imgHandle) 0 set yCount($imgHandle) 0 set xCount(${imgHandle}scope) 0 set yCount(${imgHandle}scope) 0 powCreateImage $imgHandle $imgHandle 0 0 $nCols $nRows $x_0 \ $incrx $y_0 $incry $x_label $y_label $z_label if [info exists powWCSList($imgHandle)] { foreach name [lindex $powWCSList($imgHandle) 1] { $fFile assembleWcsLabel $imgHandle $name } } else { set powWCSList($imgHandle) {} lappend powWCSList($imgHandle) 1 lappend powWCSList($imgHandle) {} } set powWCSList(${imgHandle}scope) $powWCSList($imgHandle) if { $powWCSTranslation != 0 } { if { $powWCSTranslation == 1 } { tk_messageBox -icon warning -type ok \ -message "Unrecognized Coordinate System is ignored." } elseif { $fvPref::ifWCSInfo } { tk_messageBox -icon warning -type ok -message "$powWCSTranslation\n\ndefault to pixel coordinate." } set powWCSTranslation 0 set useWCSInfo($imgHandle) 0 set useWCSInfo(${imgHandle}scope) 0 set powWCS($imgHandle) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} powCreateImage $imgHandle $imgHandle 0 0 $nCols $nRows $x_0 \ $incrx $y_0 $incry $x_label $y_label $z_label set powWCSList(${imgHandle}scope) $powWCSList($imgHandle) powCreateGraph $imgHandle NULL $imgHandle $x_unit $y_unit \ $x_label $y_label \ [lindex $fvPref::graphDispSize 0] [lindex $fvPref::graphDispSize 1] } else { set errorFlag [ catch { powCreateGraph $imgHandle NULL $imgHandle $x_unit $y_unit \ $x_label $y_label [lindex $fvPref::graphDispSize 0] [lindex $fvPref::graphDispSize 1] } err ] if { $fvPref::ifWCSInfo } { if $errorFlag { set useWCSInfo($imgHandle) 0 set useWCSInfo(${imgHandle}scope) 0 # catch { powDeleteGraph $imgHandle NOPROMPT # powDeleteImage $imgHandle $imgHandle # powDeleteCurve $imgHandle curve } set powWCS($imgHandle) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set powFitsHeader($imgHandle) "" set powFitsHeaderCnt($imgHandle) 0 powCreateImage $imgHandle $imgHandle 0 0 $nCols $nRows $x_0 \ $incrx $y_0 $incry $x_label $y_label $z_label set errorFlag [ catch { powCreateGraph $imgHandle NULL $imgHandle $x_unit $y_unit \ $x_label $y_label [lindex $fvPref::graphDispSize 0] \ [lindex $fvPref::graphDispSize 1] } err ] } } if $errorFlag { tk_messageBox -icon error -type ok -message "Can't create image" return } } set powWCSLabel(xlabel,$imgHandle,DEFAULT) $x_label set powWCSLabel(ylabel,$imgHandle,DEFAULT) $y_label set powWCSLabel(xunit,$imgHandle,DEFAULT) $x_unit set powWCSLabel(yunit,$imgHandle,DEFAULT) $y_unit # allows double clicking on an image to pop up table display centered on pixel .pow.pow bind img_$imgHandle <> \ "+returnCurrentImageInfo [$fFile getMaster] $currentHDU $imgHandle %x %y" } itcl::body FitsImage::_sPlotCmd {} { global g_GL set tmpName [namespace tail $this] FitsImgPlotSel .pltSel_$tmpName $this 1 $_numRows wm title .pltSel_$tmpName "Image Plot Selection" tkwait window .pltSel_$tmpName if { [info exist g_GL($this,plotImg)] == 0} { return } if { [llength $g_GL($this,plotImg)] == 0} { return } imagePlot $g_GL($this,plotImg) } itcl::body FitsImage::_plotCmd { } { global g_GL ifWCSInfo_old set ifWCSInfo_old $fvPref::ifWCSInfo set fvPref::ifWCSInfo 0 set tmpName [namespace tail $this] FitsImgPlotSel .pltSel_$tmpName $this $_numCols $_numRows wm title .pltSel_$tmpName "Image Plot Selection" tkwait window .pltSel_$tmpName if { [info exist g_GL($this,plotImg)] == 0} { return } if { [llength $g_GL($this,plotImg)] == 0} { return } imagePlot $g_GL($this,plotImg) } itcl::body FitsImage::_getImageVectorData { fRow_ nRows_ fCol_ nCols_ } { incr fCol_ # col/row zero-indexed set fitsfile [$fFile cget -fitsfile] $fitsfile load iblock "_tableDataDS9" $fRow_ $nRows_ $fCol_ $nCols_ } itcl::body FitsImage::imagePlot {paramList_} { global g_backupDir global powWCS powPlotParam global powFitsHeader powFitsHeaderCnt global ifWCSInfo_old global xCount yCount global powWCSList powWCSLabel powWCSName global useWCSInfo #puts "paramList_: $paramList_" set imgPlotType [lindex $paramList_ 0] set imgPlotStart [lindex $paramList_ 1] set imgPlotEnd [lindex $paramList_ 2] set imgCurrgn [lindex $paramList_ 3] #puts "imgPlotStart: $imgPlotStart" #puts "imgPlotEnd: $imgPlotEnd" #puts "_numCols: $_numCols" #puts "_numRows: $_numRows" if { $fvPref::imgDisplayer == "DS9" } { # display is for DS9 set flag "NOT_YET" set tmpfile ${g_backupDir}/ds9PlotTemp.data if [file exists $tmpfile] { file delete -force $tmpfile } if { [catch {set newDataFile [open $tmpfile "w"]} err] } { error $err return } if { $imgPlotType == "row" } { _getImageVectorData $imgPlotStart [expr $imgPlotEnd - $imgPlotStart + 1] 0 $_numCols set xColumn_ "Column_Number" set yColumn_ "Value" for {set col 0} {$col < [expr $_numCols - 1]} {incr col} { set totalValue 0 for {set row [expr $imgPlotStart - 1]} {$row < $imgPlotEnd} {incr row} { set data [_getRawDataForDS9 $col $row] set currentVal $data if { $data == "NULL" } { set currentVal 0 } set totalValue [expr $totalValue + $currentVal] } puts $newDataFile [format "%s %s" $col [expr $totalValue / ($imgPlotEnd - $imgPlotStart + 1)]] } } else { _getImageVectorData 1 $_numRows [expr $imgPlotStart - 1] [expr $imgPlotEnd - $imgPlotStart + 1] set xColumn_ "Row_Number" set yColumn_ "Value" for {set row 0} {$row < [expr $_numRows - 1]} {incr row} { set totalValue 0 for {set col [expr $imgPlotStart - 1]} {$col < $imgPlotEnd} {incr col} { set data [_getRawDataForDS9 $col $row] set currentVal $data if { $data == "NULL" } { set currentVal 0 } set totalValue [expr $totalValue + $currentVal] } puts $newDataFile [format "%s %s" $row [expr $totalValue / ($imgPlotEnd - $imgPlotStart + 1)]] } } close $newDataFile set err "none" catch {exec xpaaccess ds9} result if { [string range $result 0 1] == "no" } { # start DS9 if DS9 isn't there if { [catch {exec ds9 &} ds9pid] } { file delete $tmpfile if { [tk_dialog .saoError "DS9 startup error.. Cannot start DS9!\nUse POW instead?" \ question 0 Yes No] == 0 } { close $fFile set flag INCOMPLETE_DONE } close $fFile set flag DONE } if { $flag == "NOT_YET" } { # wait till ds9 is up set stopflag 1 set nSecs 0 while { $stopflag } { after 1000 incr nSecs catch {exec xpaaccess ds9} result if { [string range $result 0 2] == "yes" } { set flag DONE set stopflag 0 } else { if { $nSecs > 10 } { file delete $tmpfile if { [tk_dialog .saoError "DS9 startup error.. Cannot start ds9!\nUse POW instead?" \ question 0 Yes No] == 0 } { close $fFile set flag NOT_YET break } else { close $fFile set flag INCOMPLETE_DONE break } } } } } } else { set flag DONE } if { $flag == "DONE" } { if { $imgPlotStart == $imgPlotEnd } { set displayName [format "%s(%s_%s)" [file tail $fileName] $imgPlotType $imgPlotStart] } else { set displayName [format "%s(%s_%s-%s)" [file tail $fileName] $imgPlotType $imgPlotStart $imgPlotEnd] } #Ziqin Pan, April 15, 2004 #Use new version ds9 plot command instead of analysis plot # # exec xpaset ds9 analysis plot $displayName $xColumn_ $yColumn_ 2 < $tmpfile if {$imgCurrgn == 1} { catch {[exec xpaset -p ds9 plot close]} err set imgCurrgn 0 } if {$imgCurrgn == 0} { exec xpaset ds9 plot new $displayName $xColumn_ $yColumn_ xy < $tmpfile } file delete $tmpfile } if { $flag != "NOT_YET" } return } set graphID [namespace tail $this] set graphID ${graphID}_$_graphIDhighest if { $imgPlotType == "row" } { powCreateVectorEN x_$graphID ColumnNumber $_numCols 1 1 NULL if { [llength $_dims] == 1 } { set dataInfoForPOW [$fFile loadImageMeanCols $imgPlotStart \ $imgPlotEnd $_slice] } else { set dataInfoForPOW [$fFile loadImageMeanRows $imgPlotStart \ $imgPlotEnd $_slice] } } else { powCreateVectorEN x_$graphID RowNumber $_numRows 1 1 NULL if { [llength $_dims] == 1 } { set dataInfoForPOW [$fFile loadImageMeanRows $imgPlotStart \ $imgPlotEnd $_slice] } else { set dataInfoForPOW [$fFile loadImageMeanCols $imgPlotStart \ $imgPlotEnd $_slice] } } set dataAddressForPOW [lindex $dataInfoForPOW 0] set dataType [lindex $dataInfoForPOW 1] set numElements [lindex $dataInfoForPOW 2] powCreateData y_d_$graphID $dataAddressForPOW $dataType $numElements 1 $fFile freeColumn $dataAddressForPOW powCreateVector y_$graphID y_d_$graphID 0 $numElements 1 set xUnit NULL set yUnit NULL set x_label "" set x_unit "pixels" regsub -all { } [urlTail $fileName] _ cleanFileName set graphHandle ${cleanFileName}_[expr $currentHDU-1]_$_graphIDhighest set useWCSInfo($graphHandle) $fvPref::ifWCSInfo set useWCSInfo(${graphHandle}scope) $fvPref::ifWCSInfo set powWCSLabel(xlabel,$graphHandle,DEFAULT) "" set powWCSLabel(ylabel,$graphHandle,DEFAULT) "" set powWCSLabel(xunit,$graphHandle,DEFAULT) "pixels" set powWCSLabel(yunit,$graphHandle,DEFAULT) "" if { ![catch {set tmp [$fFile getKeyword CTYPE1]}] } { set v [lindex [lindex $tmp 0] 1] set x_label [string trim $v {' }] } if { ![catch {set tmp [$fFile getKeyword CUNIT1]}] } { set v [lindex [lindex $tmp 0] 1] set x_unit [string trim $v {' }] } if { $imgPlotType == "row" } { set xLabel "Column_Number" } else { set xLabel "Row_Number" } if { $fvPref::ifWCSInfo } { set xLabel $x_label set xUnit $x_unit } if { ![catch {set tmp [$fFile getKeyword BUNIT]}] } { set v [lindex [lindex $tmp 0] 1] set yLabel [string trim $v {' }] } else { set yLabel "Counts" } set powWCSLabel(xlabel,$graphHandle,DEFAULT) $xLabel set powWCSLabel(ylabel,$graphHandle,DEFAULT) $yLabel set powWCSLabel(xunit,$graphHandle,DEFAULT) $xUnit set powWCSLabel(yunit,$graphHandle,DEFAULT) $yUnit if { [winfo exist .pow.pow]!=1 } { powInit .dummy } set powWCSName($graphHandle) 0 set powWCSName(${graphHandle}scope) 0 set realGraphHandle $graphHandle if { $fvPref::ifWCSInfo } { set powWCS($graphHandle) [$fFile getWcs] if { $_numCols > 1 } { set result [$fFile getHeader2String] set powFitsHeader($graphHandle) [lindex $result 0] set cntList($graphHandle) [$fFile getHeaderKeyWord [lindex $result 0] $graphHandle] set powFitsHeaderCnt($graphHandle) [lindex $cntList($graphHandle) 1] #puts "powFitsHeader($graphHandle): $powFitsHeader($graphHandle)" #puts "cntList($graphHandle): $cntList($graphHandle)" #puts "powFitsHeaderCnt($graphHandle): $powFitsHeaderCnt($graphHandle)" if { [lindex $cntList($graphHandle) 0] > 0 } { #set powFitsHeader($graphHandle) [$fFile assembleWcsHeader $graphHandle] #set powWCS($graphHandle) [$fFile getWcs] set powWCSInfo($graphHandle,DEFAULT) $powWCS($graphHandle) set wcsinfo $powWCS($graphHandle) set curveName "c0_$graphID" set powWCS($curveName) $wcsinfo set xLabel [lindex [lindex $wcsinfo 3] 0] set yLabel [lindex [lindex $wcsinfo 3] 1] if { $yLabel == "" } { set yLabel "Data" } set xUnit "" set yUnit "intensity" set curveName $curveName } else { set powFitsHeaderCnt($graphHandle) 0 #set powWCS($graphHandle) [$fFile getWcs] set powWCS($curveName) $powWCS($graphHandle) set powFitsHeader($curveName) $powFitsHeader($graphHandle) set powFitsHeaderCnt($curveName) $powFitsHeaderCnt($graphHandle) } } else { #set powWCS($graphHandle) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} #set powWCS($graphHandle) $wcsinfo set useWCSInfo($graphHandle) 0 set useWCSInfo(${graphHandle}scope) 0 set powFitsHeader($graphHandle) "" set powFitsHeaderCnt($graphHandle) 0 set curveName $graphHandle set powWCS($curveName) $powWCS($graphHandle) set powFitsHeader($curveName) $powFitsHeader($graphHandle) set powFitsHeaderCnt($curveName) $powFitsHeaderCnt($graphHandle) } } else { set powWCS($graphHandle) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set powFitsHeader($graphHandle) "" set powFitsHeaderCnt($graphHandle) 0 set curveName $graphHandle set powWCS($curveName) $powWCS($graphHandle) set powFitsHeader($curveName) $powFitsHeader($graphHandle) set powFitsHeaderCnt($curveName) $powFitsHeaderCnt($graphHandle) } eval powCreateCurve $curveName x_$graphID "NULL" y_$graphID "NULL" set curves [list $curveName] #puts "powFitsHeader($graphHandle): $powFitsHeader($graphHandle)" set powPlotParam(graphType,$graphHandle) [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(graphType,${graphHandle}scope) $powPlotParam(graphType,$graphHandle) set powPlotParam(zoomed,$graphHandle) 0 set powPlotParam(zoomed,${graphHandle}scope) 0 set xCount($graphHandle) 0 set yCount($graphHandle) 0 set xCount(${graphHandle}scope) 0 set yCount(${graphHandle}scope) 0 if [info exists powWCSList($graphHandle)] { foreach name [lindex $powWCSList($graphHandle) 1] { $fFile assembleWcsLabel $graphHandle $name } } else { set powWCSList($graphHandle) {} lappend powWCSList($graphHandle) 1 lappend powWCSList($graphHandle) {} } set powWCSList(${graphHandle}scope) $powWCSList($graphHandle) if { $imgCurrgn && [powGetCurrentGraph]!="" } { set realGraphHandle [powGetCurrentGraph] powAddCurves [powGetCurrentGraph] $curveName } else { powCreateGraph $graphHandle $curves NULL $xUnit $yUnit \ $xLabel $yLabel \ [lindex $fvPref::graphDispSize 0] [lindex $fvPref::graphDispSize 1] } if [info exists ifWCSInfo_old] { set fvPref::ifWCSInfo $ifWCSInfo_old set useWCSInfo $fvPref::ifWCSInfo } incr _graphIDhighest catch { powSetCurveOptions $realGraphHandle $curveName pDisp No lDisp Yes } err } # Highlight the center itcl::body FitsImage::showCell {col_ row_} { if { $_droot == "" || ![winfo exists $_droot] } return if { [llength $_dims]==1 } { # Swap col_/row_ set tmp $col_; set col_ $row_; set row_ $tmp } _jump [expr $row_ + $_showRows/2] _setHScroll [expr $col_-$_showCols/2-1] update idletask _setStartMark [expr $col_-$_firstCol] [expr $_numRows-$_firstRow+1-$row_] } ############################################## # # Handle Reading/Writing/Formatting of Data # itcl::body FitsImage::_writeTableData {col_ row_ val_} { set tmpStr [string toupper [string trim $val_ " "]] if { $tmpStr == "NULL" } { # float and double do not need a BLANK key if { $_imgNull == "NULL" && $_imgType!=3 && $_imgType!=4 } { error "\nNo NULL value is defined. Please write a\ BLANK keyword in the header first." } set val_ "NULL" } _putRawData $col_ $row_ $val_ } itcl::body FitsImage::_readTableData {fCol_ fRow_ nCols_ nRows_} { set fRow_ [expr $_numRows - $fRow_ - $nRows_ + 1] incr fCol_ # image data will be loaded into a 2-d Tcl array _tableData # this cannot be done as a FitsFile method because Tcl does not # allow arrays to be returned # the array must be created locally set fitsfile [$fFile cget -fitsfile] $fitsfile load iblock "_tableData" $fRow_ $nRows_ $fCol_ $nCols_ } itcl::body FitsImage::_getFormattedData {col_ row_} { set val_ [_getRawData $col_ $row_] if { $val_=="NULL" } { return $val_ } set errorFlag [ catch { set returnStr [format $_imgForm $val_] } err ] if { $errorFlag } { # can't recongize the format, return as it is.. set returnStr $val_ } return $returnStr } itcl::body FitsImage::_getRawDataForDS9 {col_ row_} { set v $_tableDataDS9($col_,$row_) if { $v!="NULL" } { if { $_imgType==3 } { return [format "%.7G" $v] } elseif { $_imgType==4 } { return [format "%.15G" $v] } } return $v } itcl::body FitsImage::_getRawData {col_ row_} { set v $_tableData($col_,[expr $_numRows-$row_-1]) if { $v!="NULL" } { if { $_imgType==3 } { return [format "%.7G" $v] } elseif { $_imgType==4 } { return [format "%.15G" $v] } elseif { $_imgType == 5 } { # chai: 64 bits integer return [lindex [split $v "."] 0] } } return $v } itcl::body FitsImage::_putRawData {col_ row_ val_} { set realRow [expr $_numRows-$row_-1] set firstElem [expr $realRow*$_numCols+$col_+1] $fFile putImage $firstElem 1 [list $val_] _readTableData $col_ $row_ 1 1 } itcl::body FitsImage::_getRawDataBlock { fCol_ fRow_ lCol_ lRow_ } { # col/row zero-indexed set nElem [expr $lCol_ - $fCol_ + 1] for { set col 0 } { $col<$nElem } { incr col } { set _colData($col) {} } set row $fRow_ for { set row $fRow_ } { $row <= $lRow_ } { incr row } { set realRow [expr $_numRows-$row-1] set firstElem [expr $realRow*$_numCols+$fCol_+1] set col 0 foreach datum [$fFile getImageAsList $firstElem $nElem] { lappend _colData($col) $datum incr col } } set data {} for { set col 0 } { $col<$nElem } { incr col } { lappend data $_colData($col) } return $data } itcl::body FitsImage::_putRawDataBlock { fCol_ fRow_ data_ } { # col/row zero-indexed set nCols [llength $data_] set nRows [llength [lindex $data_ 0]] for { set i 0 } { $i<$nRows } { incr i } { set rowData {} foreach cData $data_ { lappend rowData [lindex $cData $i] } set realRow [expr $_numRows-$fRow_-1] set firstElem [expr $realRow*$_numCols+$fCol_+1] $fFile putImage $firstElem $nCols $rowData incr fRow_ } } # # End Data handlers # ############################################## itcl::body FitsImage::_saveTableToAscii {win_ asciiFileName_} { # these vars are used # _exportFirstRow # _exportLastRow # _exportFirstCol # _exportLastCol # _exportCSV # _exportPrintRowNumbers # _exportCharBetweenCols for {set i 1} { $i <= $_numRows} {incr i} { set _selectedRowstmp($i) $_selectedRows([expr $_numRows -$i+1]) } set _exportFormat [$win_.rb get] if { $_exportFormat == "csv" } { set _exportCSV 1 set _exportFixedFormat 0 } elseif { $_exportFormat == "userdefine" } { set _exportCSV 0 set _exportFixedFormat 0 } # Note: all rows and cols are 1-based # this matches the $fFile print commands below use 1-based, so no # change is needed ################################################################ # set up the feedback bar set totalRowsPrint [expr $_exportLastRow - $_exportFirstRow + 1] # NOTE -- this is changed to 1000000000 rows # we will print 1000 rows at a time (or whatever is left) # numPrintBlocks = total blocks of 1000 or iterations in feedbar bar # if we have 2835 rows, we'll print: # 1 to 1000, (first block) # 1001 to 2000, (second block) # 2001 to 2835. (third block) # # tables are meant to be printed in standard row order set numPrintBlocks [expr $totalRowsPrint/1000000000] if { ($totalRowsPrint - $numPrintBlocks*1000000000) > 0 } { incr numPrintBlocks } $win_.f.fdb configure -steps $numPrintBlocks set firstloop 1 if { $_exportsel == 1 } { set _exportFirstRow 1 set _exportLastRow $_numRows set totalRowsPrint [expr $_exportLastRow - $_exportFirstRow + 1] } if { $_exportselc == 1 } { set _exportFirstCol 1 set _exportLastCol $_dispCols } if { $_exportsel == 3 } { for {set r $_numRows} { $r >=1 } { incr r -1} { if {$_selectedRowstmp($r) ==1 } { set _exportFirstRow $r while { $_selectedRowstmp($r) == 1} { incr r -1 if { $r < 1 } { break } } set totalRowsPrint [expr $_exportFirstRow - $r] set _exportFirstRow [expr $r + 1] for {set n 1} {$n <= $numPrintBlocks} {incr n} { if { $n == 1 && $firstloop == 1} { # write into a new file and write column names set filePrintMode 0 } else { # append to that file and don't write column names set filePrintMode 2 } set fRow [expr 1000000000*[expr $n-1] + 1] if { $n == $numPrintBlocks } { set nRows [expr $totalRowsPrint - $fRow + 1] } else { set nRows 1000000000 } # shift by the first user-selected row set fRow [expr $fRow + $_exportFirstRow - 1] set fCol $_exportFirstCol set nCols [expr $_exportLastCol - $_exportFirstCol + 1] $fFile saveImgToASCII $asciiFileName_ $filePrintMode \ $fRow $nRows $fCol $nCols \ $_cellSize \ $_exportCSV \ $_exportPrintRowNumbers \ $_exportCharBetweenCols \ $_slice # if user presses cancel, stop if {[catch {$win_.f.fdb step}] == 1} { file delete $asciiFileName_ return } } set firstloop 0 } } } else { for {set n 1} {$n <= $numPrintBlocks} {incr n} { if { $n == 1 } { # write into a new file and write column names set filePrintMode 0 } else { # append to that file and don't write column names set filePrintMode 2 } set fRow [expr 1000000000*[expr $n-1] + 1] if { $n == $numPrintBlocks } { set nRows [expr $totalRowsPrint - $fRow + 1] } else { set nRows 1000000000 } # shift by the first user-selected row set fRow [expr $fRow + $_exportFirstRow - 1] set fCol $_exportFirstCol set nCols [expr $_exportLastCol - $_exportFirstCol + 1] $fFile saveImgToASCII $asciiFileName_ $filePrintMode \ $fRow $nRows $fCol $nCols \ $_cellSize \ $_exportCSV \ $_exportPrintRowNumbers \ $_exportCharBetweenCols \ $_slice # if user presses cancel, stop if {[catch {$win_.f.fdb step}] == 1} { file delete $asciiFileName_ return } } } destroy $win_ } fv5.4/ftools/guis/fv/class/FitsImgPlotSel.tcl0000644000220700001010000001451310442112364020553 0ustar birbylheadevitcl::class FitsImgPlotSel { inherit itk::Toplevel private common range private common typeSelection private common cbCurrgn private variable id private variable _numRows private variable _numCols private variable entryWidth 15 private variable _oneDim 0 private method doneCmd {} private method cancelCmd {} private method helpCmd {} private method parseRange {} private method selType {} constructor {args} { global activeBgColor global checkBBgColor global globalBgColor global g_titleFont option add *FitsImgPlotSel.font g_titleFont set id [lindex $args 0] set _numCols [lindex $args 1] set _numRows [lindex $args 2] # window looks and behaves differently when there's only one column # when there's only one column, user can only choose a range of rows (not columns) if { $_numCols == 1 } { set _oneDim 1 } # labels itk_component add title { if { !$_oneDim } { message $itk_interior.mssg -text "Image Size: $_numCols X $_numRows" \ -width 300 -relief ridge -borderwidth 4 -font g_titleFont } else { message $itk_interior.mssg -text "Rows change 1-$_numRows" \ -width 300 -relief ridge -borderwidth 4 -font g_titleFont } } if { !$_oneDim } { set [itcl::scope typeSelection] row itk_component add selRow { radiobutton $itk_interior.selrow -text "Plot Rows" \ -variable [itcl::scope typeSelection] -value row \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black -activebackground $fvPref::globalBgColor \ -command [itcl::code $this selType] -font g_titleFont } } else { set [itcl::scope typeSelection] col } itk_component add selCol { radiobutton $itk_interior.selcol -text "Plot Columns" \ -variable [itcl::scope typeSelection] -value col \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black -activebackground $fvPref::globalBgColor \ -command [itcl::code $this selType] -font g_titleFont } if { !$_oneDim } { itk_component add rangeLabel { label $itk_interior.rangel -text "Range of rows to plot" \ -width 25 -font g_titleFont } itk_component add rangeEntry { entry $itk_interior.rangee -textvariable [itcl::scope range($id)] \ -width $entryWidth -font g_titleFont } } else { itk_component add rangeLabel { label $itk_interior.rangel -text "Range of columns to plot" \ -width 25 -font g_titleFont } set range($id) 1 itk_component add rangeEntry { entry $itk_interior.rangee -textvariable [itcl::scope range($id)] \ -width $entryWidth -font g_titleFont } } bind $itk_component(rangeEntry) [itcl::code $this doneCmd] itk_component add sep { frame $itk_interior.sep -height 4 -borderwidth 2 -relief raised } itk_component add sep1 { frame $itk_interior.sep1 -height 4 -borderwidth 2 -relief raised } set cbCurrgn 0 itk_component add cbCurrgn { checkbutton $itk_interior.cbCurrgn -variable [itcl::scope cbCurrgn] \ -text "Add curve to current graph" \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black \ -activebackground $fvPref::globalBgColor -font g_titleFont } { usual ignore -selectcolor -activeforeground -activebackground } itk_component add Button { iwidgets::buttonbox $itk_interior.bb } $itk_component(Button) add make -text "Plot" \ -command [itcl::code $this doneCmd] -font g_titleFont $itk_component(Button) add cancel -text Cancel \ -command [itcl::code $this cancelCmd] -font g_titleFont $itk_component(Button) add help -text Help \ -command [itcl::code $this helpCmd] -font g_titleFont grid configure $itk_component(title) -column 0 -row 0 \ -rowspan 2 -sticky "snew" if { !$_oneDim } { grid configure $itk_component(selRow) -column 1 -row 0 \ -sticky "sw" } grid configure $itk_component(selCol) -column 1 -row 1 \ -sticky "sw" grid configure $itk_component(sep1) -column 0 -row 2 \ -columnspan 4 -sticky "snew" grid configure $itk_component(rangeLabel) -column 0 -row 3 \ -sticky "snew" -pady 5 grid configure $itk_component(rangeEntry) -column 1 -row 3 \ -sticky "snew" -pady 5 grid configure $itk_component(sep) -column 0 -row 4 \ -columnspan 2 -sticky "snew" grid configure $itk_component(cbCurrgn) -column 0 -row 5 \ -columnspan 2 -sticky "snew" grid configure $itk_component(Button) -column 0 -row 6 \ -columnspan 2 -sticky "snew" } destructor { } } itcl::body FitsImgPlotSel::doneCmd {} { global g_GL if { $range($id) == " " | $range($id) == ""} { error "Please enter the range to plot" return } if { $typeSelection == "row" } { set rangeList [parseRange] set start [lindex $rangeList 0] set end [lindex $rangeList 1] if { $start<1 || $start>$_numRows || $end<1 || $end>$_numRows } { error "Row range is out of range" return } lappend paramList "row" } else { set rangeList [parseRange] set start [lindex $rangeList 0] set end [lindex $rangeList 1] if { $start<1 || $start>$_numCols || $end<1 || $end>$_numCols } { error "Column range is out of range" return } lappend paramList "column" } lappend paramList $start lappend paramList $end lappend paramList $cbCurrgn set g_GL($id,plotImg) [join $paramList] itcl::delete object $this } itcl::body FitsImgPlotSel::cancelCmd {} { global g_GL set g_GL($id,plotImg) "" itcl::delete object $this } itcl::body FitsImgPlotSel::helpCmd {} { hhelp imagePlot } itcl::body FitsImgPlotSel::parseRange {} { regsub -all " " $range($id) "" tmprange if { $tmprange == "" } { if { $typeSelection == "row" } { return [list 1 $_numCols] } else { return [list 1 $_numRows] } } set start 1 set end 1 set rangeCount [scan $tmprange "%d-%d" start end] if { $rangeCount == 1 } { set end $start } elseif { $rangeCount == 2} { ; } else { error "Parse error: range" return } return [list $start $end] } itcl::body FitsImgPlotSel::selType {} { if { $typeSelection == "row" } { $itk_component(rangeLabel) configure -text "Range of rows to plot" } else { $itk_component(rangeLabel) configure -text "Range of columns to plot" } } fv5.4/ftools/guis/fv/class/FitsPlotSel.tcl0000644000220700001010000002105210766554457020140 0ustar birbylheadev# rewritten by Han Huang 05/23/01 # more OOP-correct itcl::class FitsPlotSel { inherit itk::Toplevel constructor {args} {} public method quitCmd { } public method turnsel {flag} public method returnAddMyCurve {} { return $cbCurrgn } private method _plotCmd {} private method _selAxis {args} private method _clearCmd {} private variable colList {} private variable vecList {} private variable xAxis "" private variable yAxis "" private variable exAxis "" private variable eyAxis "" private variable rows "" private variable execute "" #Ziqin Pan private variable _plotselonly # Keep this common so that subsequent invocations will retain the setting private common cbCurrgn 0 private variable id "" } itcl::body FitsPlotSel::constructor {args} { # frame layout global g_titleFont option add *FitsPlotSel.font g_titleFont itk_component add lbFrame { frame $itk_interior.flb } pack $itk_component(lbFrame) -side left -fill both -expand 1 itk_component add eFrame { frame $itk_interior.ef } pack $itk_component(eFrame) -side top -fill x -expand 1 #button frame itk_component add bFrame { frame $itk_interior.fb -borderwidth 2 -relief ridge } pack $itk_component(bFrame) -side top -fill both -expand 1 # listbox + scrollbr set itk_interior $itk_component(lbFrame) itk_component add listbox { listbox $itk_interior.lb -yscrollcommand \ [itcl::code $itk_interior.sb set] } pack $itk_component(listbox) -side left -fill both -expand 1 set id [lindex $args 0] set colList [lindex $args 1] set vecList [lindex $args 2] set execute [lindex $args 3] # Fill listbox for {set i 0} { $i < [llength $colList] } {incr i} { set tmpVec [lindex $vecList $i] if { [llength $tmpVec]>1 || [lindex $tmpVec 0]>1 } { set vecStr [join $tmpVec ,] $itk_component(listbox) insert end \ "[lindex $colList $i]\[$vecStr\]" } else { $itk_component(listbox) insert end [lindex $colList $i] } } itk_component add scrollbar { scrollbar $itk_interior.sb -command \ [itcl::code $itk_interior.lb yview] } pack $itk_component(scrollbar) -side left -fill y -expand 1 # set itk_interior $itk_component(eFrame) itk_component add axisl { label $itk_interior.asixl -text "Axis" } itk_component add columnl { label $itk_interior.columnl -text "Column name or expression to plot" } itk_component add xbutton { button $itk_interior.xb -text "X" \ -command [itcl::code $this _selAxis X] } itk_component add xEntry { entry $itk_interior.xe -textvariable [itcl::scope xAxis] } # itk_component add ybutton { button $itk_interior.yb -text "Y" \ -command [itcl::code $this _selAxis Y] } itk_component add yEntry { entry $itk_interior.ye -textvariable [itcl::scope yAxis] } # itk_component add exbutton { button $itk_interior.exb -text "X Error" \ -command [itcl::code $this _selAxis EX] } itk_component add exEntry { entry $itk_interior.exe -textvariable [itcl::scope exAxis] } # itk_component add eybutton { button $itk_interior.eyb -text "Y Error" \ -command [itcl::code $this _selAxis EY] } itk_component add eyEntry { entry $itk_interior.eye -textvariable [itcl::scope eyAxis] } itk_component add rowEntry { entry $itk_interior.rowe -textvariable [itcl::scope rows] } itk_component add rowLabel { label $itk_interior.rowl -text "Rows:" } itk_component add selonlyCheckButton { checkbutton $itk_interior.selonly -text "Use selected rows" \ -variable [itcl::scope _plotselonly ] \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black \ -activebackground $fvPref::globalBgColor \ -state disabled } { usual ignore -selectcolor -activeforeground -activebackground } itk_component add cbCurrgn { checkbutton $itk_interior.cbCurrgn -variable [itcl::scope cbCurrgn] \ -text "Add my curve to current graph" \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black \ -activebackground $fvPref::globalBgColor } { usual ignore -selectcolor -activeforeground -activebackground } itk_component add help { label $itk_interior.help -text "Click on a column name then select the \n\ corresponding plot axis or error bar" \ -borderwidth 2 -relief ridge } grid configure $itk_component(help) -column 0 -row 0 \ -columnspan 2 -sticky "snew" grid configure $itk_component(axisl) -column 0 -row 1 -sticky "snew" grid configure $itk_component(columnl) -column 1 -row 1 -sticky "snew" grid configure $itk_component(xbutton) -column 0 -row 2 -sticky "snew" grid configure $itk_component(ybutton) -column 0 -row 3 -sticky "snew" grid configure $itk_component(exbutton) -column 0 -row 4 -sticky "snew" grid configure $itk_component(eybutton) -column 0 -row 5 -sticky "snew" grid configure $itk_component(rowLabel) -column 0 -row 6 -sticky "snew" grid configure $itk_component(xEntry) -column 1 -row 2 -sticky "snew" grid configure $itk_component(yEntry) -column 1 -row 3 -sticky "snew" grid configure $itk_component(exEntry) -column 1 -row 4 -sticky "snew" grid configure $itk_component(eyEntry) -column 1 -row 5 -sticky "snew" grid configure $itk_component(rowEntry) -column 1 -row 6 -sticky "snew" grid configure $itk_component(selonlyCheckButton) -column 0 -row 7 \ -sticky "snew" -columnspan 2 -padx 5 grid configure $itk_interior.cbCurrgn -column 0 -row 8 \ -sticky "snew" -columnspan 2 -padx 5 grid columnconfigure $itk_component(eFrame) 1 -weight 5 # set itk_interior $itk_component(bFrame) itk_component add gobutton { button $itk_interior.gob -text "Plot" -width 5\ -command [itcl::code $this _plotCmd] } itk_component add clearbutton { button $itk_interior.clearb -text "Clear" -width 5\ -command [itcl::code $this _clearCmd] } itk_component add quitbutton { button $itk_interior.quitb -text "Close" -width 5\ -command [itcl::code $this quitCmd] } itk_component add helpbutton { button $itk_interior.helpb -text "Help" -width 5 \ -command "hhelp plotDialog" } grid config $itk_component(gobutton) -padx 5\ -column 0 -row 1 -sticky "snew" grid config $itk_component(clearbutton) -padx 5\ -column 1 -row 1 -sticky "snew" grid config $itk_component(quitbutton) -padx 5\ -column 2 -row 1 -sticky "snew" grid config $itk_component(helpbutton) -padx 5\ -column 3 -row 1 -sticky "snew" set xAxis "" set yAxis "" set exAxis "" set eyAxis "" eval itk_initialize } itcl::body FitsPlotSel::_plotCmd {} { # check the element range if { ($xAxis == "") || ($yAxis == "")} { error "Need both X and Y axes" return } $execute $xAxis $exAxis $yAxis $eyAxis $cbCurrgn $rows $_plotselonly # destroy $itk_component(hull) } itcl::body FitsPlotSel::quitCmd { } { destroy $itk_component(hull) } itcl::body FitsPlotSel::turnsel {flag} { if {$flag == 1} { $itk_component(selonlyCheckButton) configure -state normal } else { $itk_component(selonlyCheckButton) configure -state disabled } } itcl::body FitsPlotSel::_selAxis {args} { if { [$itk_component(listbox) curselection] == "" } { return } set column [lindex $colList [$itk_component(listbox) curselection]] set vecSize [lindex $vecList [$itk_component(listbox) curselection]] if { $column == ""} { puts "please select a column name" return } if { [string first " " $column] != -1 } { set bracket [string first \[ $column] if { $bracket == -1 } { set column "\$$column\$" } else { set column "\$[string range $column 0 [expr $bracket-1]]\$[string range $column $bracket end]" } } switch $args { X { set xAxis $column } Y { set yAxis $column } EX { set exAxis $column } EY { set eyAxis $column } } } itcl::body FitsPlotSel::_clearCmd {} { set xAxis "" set yAxis "" set exAxis "" set eyAxis "" set cbCurrgn 0 # $itk_component(vecmsg) configure -text " \n" } fv5.4/ftools/guis/fv/class/FitsSelCalculator.tcl0000644000220700001010000000421110442112364021263 0ustar birbylheadev#-------------------------------------------------------- # Modification History: # # Created by Ziqin Pan, Feb 18, 2004 # to support selection of row from expression # #-------------------------------------------------------- itcl::class FitsSelCalculator { inherit FitsBaseCalculator constructor {theFather theCols fRow nRows} { set fRow_ $fRow set nRows_ $nRows FitsBaseCalculator::constructor $theFather $theCols } { $itk_component(calculate) configure -text "Select" \ -command [itcl::code $this selectCmd] $itk_component(help) configure -command {hhelp selectRows} $itk_component(selonlyCheckButton) configure -text "AND with previous selected rows" \ -variable [itcl::scope _calcseland] \ -command [itcl::code $this ORoff] } destructor {} private variable fRow_ private variable nRows_ private method setResult {} private method addOrCheckButton {} private method selectCmd {} private method ANDoff {} private method ORoff {} } itcl::body FitsSelCalculator::ANDoff { } { if { $_calcselor == 1} { $itk_component(selonlyCheckButton) deselect } } itcl::body FitsSelCalculator::ORoff { } { if { $_calcseland == 1} { $itk_component(orCheckButton) deselect } } itcl::body FitsSelCalculator::selectCmd { } { if { [regexp {[^0-9, -]} $resultFormula($this)] } { setWatchCursor [namespace tail $this] \ [itcl::code $_father selRowsWithCondition $resultFormula($this) $fRow_ $nRows_ $_calcseland $_calcselor] } else { $_father selRowsFromList $resultFormula($this) $_calcseland $_calcselor } } itcl::body FitsSelCalculator::addOrCheckButton {} { itk_component add orCheckButton { checkbutton $itk_interior.orCheckButton -text "OR with previous selected rows " \ -variable [itcl::scope _calcselor] \ -command [itcl::code $this ANDoff] } } itcl::body FitsSelCalculator::setResult {} { itk_component add resultCol { label $itk_interior.resultCol -text "Rows to select or condition:" } } fv5.4/ftools/guis/fv/class/FitsTable.tcl0000644000220700001010000005603010533112425017562 0ustar birbylheadev# First draft 05/01/96 Jianjun # 01/01/2004 Ziqin add row selection function #constrct a FitsTable object # FitsTable FitsTableObjName FitsFileObjName currentHDU itcl::class FitsTable { inherit Table constructor {args} {} destructor {} ### the following override public methods in Table parent class public method setFileName { fName_ } ### the following does not exist in the Table parent class public method dispTable { extNum_ {cols_ {}} } #------------------------------- ### the following override protected methods in Table class private method _drawTable {} private method _buildNewMenus {} private method _postMenus {} private method _updateHL {} private method _updateNumCols {} private method _writeTableData {col_ row_ val_} private method _readTableData {fCol_ fRow_ nCols_ nRows_} private method _getFormattedData {col_ row_} private method _getRawData {col_ row_} private method _getRawDataBlock { fCol_ fRow_ lCol_ lRow_ } private method _putRawDataBlock { fCol_ fRow_ data_ } private method _putRawData {col_ row_ val_} # private method _createTable {} ### the following methods and variables do not exist in the parent ### in fact, these names are procs are unique to this class protected method _editColParamsWindow { { colNum0_ 0 } } private method _tableHighLight {} private method _selAllCol {} private method _unselAllCol {} private method _makeColSelList {} private method _colInfoSelCmd {} private method _changeTDisp {} private method _checkTDisp {tdisp_} # stores display data of the "Edit Column Parameters" window private variable _editColWin_name private variable _editColWin_tdisp private variable _editColWin_unit private variable _editColWin_newname private variable _editColWin_type private variable _editColWin_comment private variable _colSelState private variable _isTableDisplayed 0 } itcl::body FitsTable::constructor {args} { global g_titleFont option add *FitsTable.font g_titleFont set fFile [lindex $args 0] set fFile FitsExtension::$fFile set _fatherFitsExtension [lindex $args 1] set currentHDU [$fFile cget -currentHDU] set isFailedToCopy [$fFile cget -isFailedToCopy] set fileName [$fFile getOrigName] # Table info set _tableType [$fFile getTableInfo hdutype] if { ($_tableType != "Binary Table") \ && ($_tableType != "ASCII Table") } { puts "It is not a table \n" return } set _numCols [$fFile getTableInfo ncols] set _numRows [$fFile getTableInfo nrows] set _listColNames [$fFile getTableInfo column] set _listPreSelectedColNames $_listColNames $_fatherFitsExtension addChild $this table } itcl::body FitsTable::destructor {} { set _isBeingDestroyed 1 if { [winfo exists $_droot] } { destroy $_droot } $_fatherFitsExtension freeChild $this } #body FitsTable::_createTable {} { # puts "I am going to create a new Table" #} itcl::body FitsTable::setFileName { fName_ } { Table::setFileName $fName_ .fvwinkeeper signoff $_droot .fvwinkeeper register $_droot "Table" [urlTail $fName_] $currentHDU \ $this if { [llength $_myChildren] } { foreach child $_myChildren { # Not all children contain setFileName catch {$child setFileName $fName_} } } } itcl::body FitsTable::_drawTable {} { Table::_drawTable # bind $_droot <> [itcl::code $this _selRowsFrExpr 1] bind $_droot <> [itcl::code $this _tryDelRows] bind $_droot <> [itcl::code $this _tryDelCols] bind $_droot <> [itcl::code $this _addRows] bind $_droot <> [itcl::code $this _addCols] bind $_droot <> [itcl::code $this _selRowsFrExpr 0] bind $_droot <> [itcl::code $this _editColParamsWindow] bind $_droot <> [itcl::code $this _plotCmd] bind $_droot <> [itcl::code $this _sortCmd] bind $_droot <> [itcl::code $this _calculateCmd] bind $_droot <> [itcl::code $this _histoCmd] bind $_droot <> [itcl::code $this _statCmd] } itcl::body FitsTable::_buildNewMenus {} { global g_titleFont Table::_buildNewMenus # Add some items to the Edit menu # Insert $_mBar.edit insert "Prefer*" cascade -label "Insert" -menu $_mBar.edit.insert -font g_titleFont menu $_mBar.edit.insert -tearoff false $_mBar.edit.insert add command -label "Row" \ -command "doMenuEvent <>" -font g_titleFont $_mBar.edit.insert add command -label "Column" \ -command "doMenuEvent <>" -font g_titleFont # Delete $_mBar.edit insert "Prefer*" cascade -label "Delete" -menu $_mBar.edit.delete -font g_titleFont menu $_mBar.edit.delete -tearoff false $_mBar.edit.delete add command -label "Selected rows" \ -command "doMenuEvent <>" -font g_titleFont $_mBar.edit.delete add command -label "Selected columns" \ -command "doMenuEvent <>" -font g_titleFont #Ziqin pan $_mBar.edit insert "Prefer*" command -label "Select Rows From Expr" \ -command "doMenuEvent <>" -font g_titleFont # Display Format $_mBar.edit insert "Prefer*" command -label "Column Parameters" \ -command "doMenuEvent <>" -font g_titleFont $_mBar.edit insert "Prefer*" separator # Fill in the TOOLS menu $_mBar.tools add command -label "Plot..." \ -command "doMenuEvent <>" -font g_titleFont $_mBar.tools add command -label "Sort Rows..." \ -command "doMenuEvent <>" -font g_titleFont $_mBar.tools add command -label "Calculator..." \ -command "doMenuEvent <>" -font g_titleFont $_mBar.tools add command -label "Histogram..." \ -command "doMenuEvent <>" -font g_titleFont $_mBar.tools add command -label "Statistics..." \ -command "doMenuEvent <>" -font g_titleFont } itcl::body FitsTable::_postMenus {} { Table::_postMenus set _anyColSelected [sarray _colNotchedState 0 [expr $_dispCols-1] 1] if { $_anyColSelected } { $_mBar.edit.delete entryconfigure "*column*" -state normal } else { $_mBar.edit.delete entryconfigure "*column*" -state disabled } set _anyRowsSelected 0 for {set i 1} { $i <= $_numRows } { incr i } { if {$_selectedRows($i) == 1} { set _anyRowsSelected 1 break } } if { $_anyRowsSelected == 1} { $_mBar.edit.delete entryconfigure "*rows*" -state normal } else { $_mBar.edit.delete entryconfigure "*rows*" -state disabled } if { $isFailedToCopy } { $_mBar.tools entryconfigure "Sort Rows..." -state disabled $_mBar.tools entryconfigure "Calculator..." -state disabled } else { $_mBar.tools entryconfigure "Sort Rows..." -state normal $_mBar.tools entryconfigure "Calculator..." -state normal } update idle } itcl::body FitsTable::_updateNumCols {} { set _numCols [$fFile getTableInfo ncols] set _listColNames [$fFile getTableInfo column] } itcl::body FitsTable::_editColParamsWindow { { colNum0_ 0 } } { global g_titleFont set fmtWin .fmtInfo catch {destroy $fmtWin} powToplevel $fmtWin .dummy wm title $fmtWin "fv: Edit Column Parameters" wm geometry $fmtWin +[winfo pointerx .]+[winfo pointery .] # start out displaying first (0th) column data set _editColWin_name $_columnName($colNum0_) set _editColWin_tdisp $_columnTDisp($colNum0_) set _editColWin_unit $_columnUnit($colNum0_) set _editColWin_newname $_columnName($colNum0_) set _editColWin_type $_columnType($colNum0_) set _editColWin_comment $_columnComment($colNum0_) iwidgets::combobox $fmtWin.name -labeltext "Column" \ -labelpos w \ -labelfont g_titleFont \ -textfont g_titleFont \ -selectioncommand [itcl::code $this _colInfoSelCmd] \ -textvariable [itcl::scope _editColWin_name] -editable 0 eval $fmtWin.name insert list end $_listPreSelectedColNames iwidgets::entryfield $fmtWin.w -labeltext "Display format" \ -labelpos w \ -width 10 \ -labelfont g_titleFont \ -textfont g_titleFont \ -textvariable [itcl::scope _editColWin_tdisp] \ -command [itcl::code $this _changeTDisp] iwidgets::entryfield $fmtWin.w2 -labeltext "Column Units" \ -labelpos w \ -width 10 \ -labelfont g_titleFont \ -textfont g_titleFont \ -textvariable [itcl::scope _editColWin_unit] \ -command [itcl::code $this _changeTDisp] iwidgets::entryfield $fmtWin.w3 -labeltext "New Name" \ -labelpos w \ -width 10 \ -labelfont g_titleFont \ -textfont g_titleFont \ -textvariable [itcl::scope _editColWin_newname] \ -command [itcl::code $this _changeTDisp] iwidgets::entryfield $fmtWin.w4 -labeltext "Comments" \ -labelpos w \ -width 10 \ -labelfont g_titleFont \ -textfont g_titleFont \ -textvariable [itcl::scope _editColWin_comment] \ -command [itcl::code $this _changeTDisp] _colInfoSelCmd grid $fmtWin.name -row 1 -column 1 -sticky ew grid $fmtWin.w -row 2 -column 1 -sticky ew grid $fmtWin.w2 -row 3 -column 1 -sticky ew grid $fmtWin.w3 -row 4 -column 1 -sticky ew grid $fmtWin.w4 -row 5 -column 1 -sticky ew iwidgets::buttonbox $fmtWin.bbox $fmtWin.bbox add apply -text Apply -command [itcl::code $this _changeTDisp] -font g_titleFont $fmtWin.bbox add help -text Help -command "hhelp displayFormat" -font g_titleFont $fmtWin.bbox add cancel -text Close -command "destroy $fmtWin" -font g_titleFont grid $fmtWin.bbox -row 6 -column 1 iwidgets::Labeledwidget::alignlabels $fmtWin.name $fmtWin.w $fmtWin.w2 $fmtWin.w3 $fmtWin.w4 } itcl::body FitsTable::_colInfoSelCmd {} { ## NOTE # if something changes, make sure to save, else do nothing # from the chosen name, get the position and rest of data set i [lsearch $_listPreSelectedColNames $_editColWin_name] set _editColWin_newname $_editColWin_name set _editColWin_unit $_columnUnit($i) set _editColWin_type $_columnType($i) set _editColWin_tdisp [string trim $_columnTDisp($i) '] set _editColWin_type [string trim $_columnType($i) '] set _editColWin_comment [string trim $_columnComment($i) '] _checkTDisp $_editColWin_tdisp } itcl::body FitsTable::_changeTDisp {} { regsub -all " " $_editColWin_tdisp "" [itcl::scope _editColWin_tdisp] set tmpTdisp [_checkTDisp $_editColWin_tdisp ] if { $tmpTdisp == "NO" } { error "illegal TDISP value\nExamples: 'I6', 'F10.6', 'E12.4', 'D20.14'\nCode letter must be uppercase" return } else { set _editColWin_tdisp $tmpTdisp } set _editColWin_newname [string trim $_editColWin_newname " "] if { $_editColWin_newname == "" } { error "New column name cannot be a blank string" return } set tmpPos [lsearch -exact $_listColNames $_editColWin_name] set tmpPreSelectedPos [lsearch -exact $_listPreSelectedColNames $_editColWin_name] if { $tmpPos == -1} { error "No such column." return } else { # tmpPos is 0-based, n is 1-based (used for keywords) set n [expr $tmpPos+1] if { $tmpTdisp == "" } { # if the key doesn't exist, we get an error; catch this error catch { $fFile delNthKey "TDISP$n" } } else { $fFile putKwd "TDISP$n '$_editColWin_tdisp'" 1 } # change unit if { $_editColWin_unit != $_columnUnit($tmpPreSelectedPos) } { $fFile putKwd "TUNIT$n '$_editColWin_unit'" 1 } if { $_editColWin_comment != $_columnComment($tmpPreSelectedPos) } { $fFile putKwd "TTYPE$n '$_editColWin_newname' / $_editColWin_comment" 1 } # change name if { $_editColWin_newname != $_editColWin_name && \ $_editColWin_newname != "" } { $fFile putKwd "TTYPE$n '$_editColWin_newname' / $_editColWin_comment" 1 # table refresh calls Table::_readInTable which requires # correct _listPreSelectedColNames set _listPreSelectedColNames [lreplace $_listPreSelectedColNames \ $tmpPreSelectedPos $tmpPreSelectedPos $_editColWin_newname] } } $fFile changeFile # refresh refresh _updateRestDisps _drawTableFrame } itcl::body FitsTable::_checkTDisp {tdisp} { # illegal TDISP: w - width, m - minimum number of digits, d - number of didgets, # e - number of digits in the exp. # Aw # Lw # Iw.m # Bw.m (binary integers only) # Ow.m (Octal integers only) # Zw.m (Hexadecimal integer) # Fw.d # Ew.dEe # ENw.d # ESw.d # Gw.dEe # Dw.dEe # also allow lower case starting char if {($tdisp == "") || ($tdisp == " ")} return "" set typeIdx [string range $tdisp 0 0] set type $typeIdx set tmp1 [string range $tdisp 0 1] switch $typeIdx { a - A { if { [regexp {[Aa]} $_editColWin_type] == 0 } { error "Cannot format column to character type" return } scan $tdisp "$typeIdx%d" w } l - L { if { [regexp {[Ll]} $_editColWin_type] == 0 } { error "Cannot format column to logical type" return } scan $tdisp "$typeIdx%d" w } i - I { if { [regexp {[IJBijb]} $_editColWin_type] == 0 } { error "Cannot format column to integer type" return } scan $tdisp "$typeIdx%d.%d" w m } b - B { if { [regexp {[IJBijb]} $_editColWin_type] == 0 } { error "Cannot format column to byte type" return } scan $tdisp "$typeIdx%d.%d" w m } o - O { if { [regexp {[IJBijb]} $_editColWin_type] == 0 } { error "Cannot format column to octal integer type" return } scan $tdisp "$typeIdx%d.%d" w m } z - Z { if { [regexp {[IJBijb]} $_editColWin_type] == 0 } { error "Cannot format column to hexadecimal integer" return } scan $tdisp "$typeIdx%d.%d" w m } f - F { if { [regexp {[FEDGfedg]} $_editColWin_type] == 0 } { error "Cannot format column to float type" return } scan $tdisp "$typeIdx%d.%d" w m } e - E { if { [regexp {[FEDGfedg]} $_editColWin_type] == 0 } { error "Cannot format column to E type" return } switch $tmp1 { EN {scan $tdisp "EN%d.%dE%d" w d e; set type EN } ES {scan $tdisp "ES%d.%dE%d" w d e; set type ES } default {scan $tdisp "$typeIdx%d.%d$typeIdx%d" w d e} } } g - G { if { [regexp {[FEDGfedg]} $_editColWin_type] == 0 } { error "Cannot format column to G type" return } scan $tdisp "$typeIdx%d.%dE%d" w d e } d - D { if { [regexp {[FEDGfedg]} $_editColWin_type] == 0 } { error "Cannot format column to double type" return } scan $tdisp "$typeIdx%d.%dE%d" w d e } default {error "Unknown TDISP type"; return NO} } if { [info exist w] == 0 } { return NO } set type [string toupper $type] if { [info exist m] == 1 } { return "${type}${w}.${m}" } else { if { [info exist d] == 1} { if { [info exist e] == 1 } { return ${type}${w}.${d}E${e} } else { return ${type}${w}.${d} } } else { return ${type}${w} } } } itcl::body FitsTable::_updateHL {} { $_fatherFitsExtension updateHL DIMENSION [list $_numCols $_numRows] } ############################################## # # Select the Table columns to be displayed # itcl::body FitsTable::dispTable { extNum_ {cols_ {}} } { if { [llength $cols_]==0 } { _tableHighLight tkwait window .thl if { !$_isTableDisplayed } { itcl::delete object $this return } } elseif { [lindex $cols_ 0]=="-" } { set _listPreSelectedColNames {} for {set i 0} {$i < $_numCols } {incr i} { lappend _listPreSelectedColNames [lindex $_listColNames $i] } set _isTableDisplayed 1 } else { set _listPreSelectedColNames $cols_ set _isTableDisplayed 1 } makeTable $extNum_ } itcl::body FitsTable::_tableHighLight { } { global g_titleFont if { [winfo exists .thl] } { destroy .thl } # table highlight powToplevel .thl .dummy set fName $fileName set rName [urlTail $fName] # set dName [getFullDirPath $fName] wm title .thl "fv: Table Info of $rName\[[expr $currentHDU-1]\]" wm geometry .thl 300x300 # frame .thl.finfo -relief sunken -borderwidth 2 pack .thl.finfo -side top -fill both -expand 0 #Table Infomation label .thl.finfo.col -text "Total Columns: $_numCols" -font g_titleFont label .thl.finfo.row -text "Total Rows : $_numRows" -font g_titleFont pack .thl.finfo.col -side top -fill both -expand 1 pack .thl.finfo.row -side top -fill both -expand 1 #buttons iwidgets::buttonbox .thl.buttonbox -orient vertical pack .thl.buttonbox -side right -padx 0 -pady 0 -fill x -expand 0 .thl.buttonbox add makeTable -text "Display Table" \ -command " [itcl::code $this _makeColSelList] destroy .thl " -padx 0 -pady 0 -font g_titleFont .thl.buttonbox add selectAll -text "Select All" -padx 0 -pady 0 \ -command [itcl::code $this _selAllCol] -font g_titleFont .thl.buttonbox add clearAll -text "Clear All" -padx 0 -pady 0 \ -command [itcl::code $this _unselAllCol] -font g_titleFont .thl.buttonbox add cancel -text "Cancel" -padx 0 -pady 0 \ -command "destroy .thl" -font g_titleFont .thl.buttonbox add help -text "Help" -padx 0 -pady 0 \ -command {hhelp columnSelection} -font g_titleFont _selAllCol # column names iwidgets::scrolledframe .thl.fcolList \ -labeltext "Selected columns for display" -hscrollmode dynamic \ -vscrollmode dynamic -labelfont g_titleFont pack .thl.fcolList -side left -fill both -expand 1 set tmpSF [.thl.fcolList childsite] set j 0 foreach i $_listPreSelectedColNames { pack [checkbutton $tmpSF.$j -text $i \ -variable [itcl::scope _colSelState($j)] \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black \ -font g_titleFont \ -activebackground $fvPref::globalBgColor ]\ -anchor w -pady 0 incr j } } itcl::body FitsTable::_makeColSelList {} { set _listPreSelectedColNames {} for {set i 0} {$i < $_numCols } {incr i} { if { $_colSelState($i) == 1} { lappend _listPreSelectedColNames [lindex $_listColNames $i] } } set _isTableDisplayed 1 } itcl::body FitsTable::_selAllCol {} { for {set i 0} {$i < $_numCols } {incr i} { set _colSelState($i) 1 } } itcl::body FitsTable::_unselAllCol {} { for {set i 0} {$i < $_numCols } {incr i} { set _colSelState($i) 0 } } # # End column selection handlers # ############################################## ############################################## # # Handle Reading/Writing/Formatting of Data # itcl::body FitsTable::_writeTableData {col_ row_ val_} { set tmpNull [string trim "$_columnNull($col_)" '] set tmpForm $_columnForm($col_) set tmpType $_columnType($col_) set tmpName $_columnName($col_) if { [regexp L $tmpType] == 1} { if { ([regexp -nocase {[ftu]} $val_] == 0) || \ ([string length $val_] !=1)} { error "Logical column can only have value T, F or U" return } else { set val_ [string toupper $val_] } } set tmpStr [string toupper [string trim $val_ " "]] if { $tmpStr == "NULL" } { if { $_tableType == "ASCII Table" && [regexp A $tmpType] } { set val_ "NULL" } else { # float and double do not need a TNULL key for binary table if { $_tableType == "ASCII Table" } { if { $tmpNull == "NULL" } { error "\nNo NULL value is defined. Please write a\ TNULLn keyword in the header first." } } else { if { $tmpNull == "NULL" && \ ![regexp A|D|E|F|C|M|d|e|f $tmpType] } { error "\nNo NULL value is defined. Please write a\ TNULLn keyword in the header first." } } set val_ "NULL" } } _putRawData $col_ $row_ $val_ } itcl::body FitsTable::_readTableData {fCol_ fRow_ nCols_ nRows_} { # col/row is 0-indexed set tmpColList [lrange $_listPreSelectedColNames $fCol_ [expr $fCol_+$nCols_-1]] incr fRow_ incr fCol_ # table block data will be loaded into a 2-d Tcl array _tableData # this cannot be done as a FitsFile method because Tcl does not # allow arrays to be returned # the array must be created locally set fitsfile [$fFile cget -fitsfile] $fitsfile load tblock -noformat _tableData $tmpColList $fRow_ $nRows_ $fCol_ 1 } itcl::body FitsTable::_getFormattedData {col_ row_} { set val [_getRawData $col_ $row_] if { $val=="NULL" || $val==" " } { return $val } if { [regexp C|M $_columnType($col_)] } { foreach [list v1 v2] $val {} return [format "$_columnForm($col_), $_columnForm($col_)" $v1 $v2] } elseif {[regexp K $_columnType($col_)] } { # chai: return 64 bit integer without format return $val } else { regsub -all {%[0-9]*[iuld]*} $_columnForm($col_) "" result if { $result == "" } { # $_columnForm($col_) == "%i" || $_columnForm($col_) == "%d" || # $_columnForm($col_) == "%u" || $_columnForm($col_) == "%ld" # $_columnForm($col_) == "%xxi" || $_columnForm($col_) == "%xxd" || # $_columnForm($col_) == "%xxu" || $_columnForm($col_) == "%xxld" set token [split $val "."] set val [lindex $token 0] } return [format $_columnForm($col_) $val] } } itcl::body FitsTable::_getRawData {col_ row_} { set v $_tableData($col_,$row_) if { $v!="NULL" && $v!=" " } { if { [regexp E $_columnType($col_)] } { return [format "%.7G" $v] } elseif { [regexp D $_columnType($col_)] } { return [format "%.15G" $v] } elseif { [regexp C $_columnType($col_)] } { return [format "%.7G %.7G" [lindex $v 0] [lindex $v 1]] } elseif { [regexp M $_columnType($col_)] } { return [format "%.15G %.15G" [lindex $v 0] [lindex $v 1]] } elseif { [regexp K $_columnType($col_)] } { # chai: K for 64 bits return [lindex [split $v "."] 0] } } return $v } itcl::body FitsTable::_putRawData {col_ row_ val_} { $fFile putTable $_columnName($col_) 1 [expr $row_+1] [list $val_] _readTableData $col_ $row_ 1 1 } itcl::body FitsTable::_getRawDataBlock { fCol_ fRow_ lCol_ lRow_ } { # col/row zero-indexed set clipCols [lrange $_listPreSelectedColNames $fCol_ $lCol_] incr fRow_ incr lRow_ return [$fFile getcolblock $clipCols ${fRow_}-${lRow_}] } itcl::body FitsTable::_putRawDataBlock { fCol_ fRow_ data_ } { # col/row zero-indexed set nCols [llength $data_] set nRows [llength [lindex $data_ 0]] set range "[expr $fRow_+1]-[expr $fRow_+$nRows]" foreach cData $data_ { $fFile putTable $_columnName($fCol_) 1 $range $cData incr fCol_ } } # # End Data handlers # ############################################## fv5.4/ftools/guis/fv/class/NewExtension.tcl0000644000220700001010000000611510461476614020347 0ustar birbylheadevitcl::class NewExtension { inherit itk::Toplevel private variable fileName "" private variable _ext_type IMAGE private variable _selected 0 private method _select_type {} private method _go {} private method _close {} { itcl::delete object $this } constructor {args} { global checkBBgColor global g_titleFont option add *NewExtension.font g_titleFont # to fix a bug in iwidgets. The radiobox does not get cleaned when being # created. if an earlier radiobox exist, then the selection is still # valid even the radio box got distroyed catch {unset ::iwidgets::Radiobox::_modes} # if { [llength $args] == 0 } { itcl::delete object $this error "Empty argument list" } # to fix a bug in iwidgets. The radiobox does not get cleaned when being # created. if an earlier radiobox exist, then the selection is still # valid even the radio box got distroyed catch {unset ::iwidgets::Radiobox::_modes} # if { [llength $args] == 0 } { itcl::delete object $this error "Empty argument list" } set fileName [lindex $args 0] set args [lrange $args 1 end] component hull configure -borderwidth 0 iwidgets::radiobox $itk_interior.exttype \ -labeltext "Extension Type" \ -selectcolor $fvPref::checkBBgColor # pack $itk_component(exttype) -fill x -expand 1 -padx 2 # $itk_component(exttype) configure -labelfont g_titleFont # $itk_component(exttype) add IMAGE -text "Image" # $itk_component(exttype) add TABLE -text "Table" # $itk_component(exttype) configure -command [itcl::code $this _select_type] pack $itk_interior.exttype -fill x -expand 1 -padx 2 $itk_interior.exttype configure -labelfont g_titleFont $itk_interior.exttype add IMAGE -text "Image" $itk_interior.exttype add TABLE -text "Table" $itk_interior.exttype configure -command [itcl::code $this _select_type] itk_component add workspace { frame $itk_interior.workspace -height 50 } pack $itk_component(workspace) -fill x -expand 1 itk_component add sep { frame $itk_interior.sep -height 3 -relief raised -borderwidth 1 } pack $itk_component(sep) -fill x -expand 1 itk_component add bbox { iwidgets::buttonbox $itk_interior.bbox } $itk_component(bbox) add OK -text Create -command [itcl::code $this _go] -font g_titleFont $itk_component(bbox) add Cancel -text Cancel -command \ [itcl::code $this _close] -font g_titleFont $itk_component(bbox) add Help -text Help -command \ {hhelp createNewFITS} -font g_titleFont pack $itk_component(bbox) -fill x -expand 1 eval itk_initialize $args } destructor {} } itcl::body NewExtension::_go {} { $itk_interior.workspace.child go _close } itcl::body NewExtension::_select_type {} { set _ext_type [$itk_interior.exttype get] if { $_selected == 1} { catch {itcl::delete object $itk_interior.workspace.child} } if { $_ext_type == "IMAGE" } { NewImage $itk_interior.workspace.child $fileName } else { NewTable $itk_interior.workspace.child $fileName } pack $itk_interior.workspace.child -fill x -expand 1 set _selected 1 } fv5.4/ftools/guis/fv/class/NewFITS.tcl0000644000220700001010000000305710442112364017126 0ustar birbylheadevitcl::class NewFITS { inherit itk::Toplevel private common fileName "" private method _close {} { itcl::delete object $this } private method _go {} { if { [file exist $fileName ] == 1 } { promptMsg "File $fileName exists\n Do you want to overwrite?" \ [itcl::code $this _save] Yes No } else { _save } } private method _save {} { $itk_interior.image setFileName $fileName $itk_interior.image go if { [file exist $fileName ] } { openFitsFileWM $fileName 0 } _close } constructor {args} { global g_titleFont component hull configure -borderwidth 0 if { [llength $args]>0 } { set fileName [lindex $args 0] set args [lrange $args 1 end] } iwidgets::entryfield $itk_interior.fname -labeltext "File name:" \ -labelfont g_titleFont \ -textfont g_titleFont \ -labelpos w -textvariable [itcl::scope fileName] pack $itk_interior.fname -fill x -expand 1 NewImage $itk_interior.image $fileName pack $itk_interior.image -fill x -expand 1 itk_component add bbox { iwidgets::buttonbox $itk_interior.bbox } $itk_component(bbox) add OK -font g_titleFont -text Create -command [itcl::code $this _go] $itk_component(bbox) add Cancel -font g_titleFont -text Cancel -command \ [itcl::code $this _close] $itk_component(bbox) add Help -font g_titleFont -text Help -command \ {hhelp createNewFITS} pack $itk_component(bbox) -fill x -expand 1 eval itk_initialize $args } destructor {} } fv5.4/ftools/guis/fv/class/NewImage.tcl0000644000220700001010000000571310533604364017413 0ustar birbylheadevitcl::class NewImage { inherit itk::Widget private variable fileName private variable g_isNewFile 1 private variable _naxes 0 private variable _axis_list {} private method create_new_fits_image {} private method _close {} public method go {} public method setFileName {fname} constructor {args} { global g_titleFont if { [llength $args] !=0 } { set fileName $args } if { $fileName != "" && [file exist $fileName] } { set g_isNewFile 0 } itk_component add data_type { iwidgets::optionmenu $itk_interior.datatype \ -labeltext "Image data type:" -labelpos w \ -font g_titleFont -labelfont g_titleFont } pack $itk_component(data_type) -fill x -expand 1 $itk_component(data_type) insert 0 \ {Signed Byte (8)} {Unsigned Byte (8)} \ {Signed Integer (16)} {Unsigned Integer (16)} \ {Signed Long (32)} {Unsigned Long (32)} \ {Signed Long Long (64)} \ {Float (-32)} {Double (-64)} $itk_component(data_type) select 0 itk_component add axis_list { iwidgets::entryfield $itk_interior.axis_list \ -labeltext "Image dimensions:" -labelpos w \ -labelfont g_titleFont -textfont g_titleFont \ -textvariable [itcl::scope _axis_list] } pack $itk_component(axis_list) -fill x -expand 1 } destructor {} } itcl::body NewImage::setFileName {fname} { set fileName $fname } itcl::body NewImage::create_new_fits_image {} { global isMac if { $g_isNewFile ==1 } { set filemode 2 } else { set filemode 1 } if { [catch {set newfits [fits open $fileName $filemode]} err] } { error $err return } set data_type [$itk_component(data_type) get] if { ![regexp {^([^ ]*) .*\((.*)\)} $data_type dmy option bitpix] } { error "Bad data type value" } if { $g_isNewFile == 0} { $newfits move [$newfits info nhdu] $newfits put ihd $bitpix $_naxes $_axis_list } else { $newfits put ihd -p $bitpix $_naxes $_axis_list } if { ($option=="Unsigned" && $bitpix!=8) \ || ($option=="Signed" && $bitpix==8) } { # Write keywords to offset values switch $bitpix { 8 { set bzero -128 } 16 { set bzero 32768 } 32 { set bzero 2147483648 } } $newfits put keyword "BZERO $bzero Make values $option" $newfits put keyword "BSCALE 1 Make values $option" } $newfits close if { $isMac && $g_isNewFile } { file attributes $fileName -creator "fvEd" -type "FITS" } } itcl::body NewImage::_close {} { itcl::delete object $this } itcl::body NewImage::go {} { if { $fileName == ""} { error "Please give me a name for the file" } set _axis_list [join [split $_axis_list {, }]] set _naxes [llength $_axis_list] create_new_fits_image _close } fv5.4/ftools/guis/fv/class/NewTable.tcl0000644000220700001010000000327110461476614017422 0ustar birbylheadevitcl::class NewTable { inherit itk::Widget private variable fileName private variable g_isNewFile 1 private variable _table_type BINARY private method _close {} private method create_new_fits_table {type} public method go {} constructor {args} { global checkBBgColor global g_titleFont if { [llength $args] != 1} { error "Too many args in NewTable" _close } set fileName [lindex $args 0] if { [file exist $fileName] == 1 } { set g_isNewFile 0 } iwidgets::radiobox $itk_interior.type -labeltext "Table Type" \ -labelfont g_titleFont \ -labelpos nw -selectcolor $fvPref::checkBBgColor pack $itk_interior.type -fill x -expand 1 $itk_interior.type add BINARY -text "Binary" $itk_interior.type add ASCII -text "ASCII" $itk_interior.type select BINARY #$itk_component(tabletype) add BINARY -text "Binary" #$itk_component(tabletype) add ASCII -text "ASCII" #$itk_component(tabletype) select BINARY } destructor {} } itcl::body NewTable::go {} { set _table_type [$itk_interior.type get] create_new_fits_table $_table_type _close } itcl::body NewTable::create_new_fits_table {type} { if { $g_isNewFile ==1 } { set filemode 2 } else { set filemode 1 } if { [catch {set fitscmd [fits open $fileName $filemode]} err] == 1 } { error $err return } if { $g_isNewFile == 0} { $fitscmd move [$fitscmd info nhdu] } if { $_table_type == "ASCII" } { $fitscmd put ahd 1 0 {} {} {} {} "ASCIITable" 0 } else { $fitscmd put bhd 1 0 {} {} {} "BinTable" } $fitscmd close } itcl::body NewTable::_close {} { itcl::delete object $this } fv5.4/ftools/guis/fv/class/RemoteAccess.tcl0000644000220700001010000000703610442112364020265 0ustar birbylheadevitcl::class RemoteClass { constructor {args} {} destructor {} private variable address "" private variable userName "" private variable passwd "" private variable isOpen 0 private variable pwd "" private variable beginPwd "" public method openConn {add user pass} public method list {pwd} public method cd {dir} public method get {rFile lFile} public method pwd { {full 1} } private method closeConn {} } itcl::body RemoteClass::constructor {args} { } itcl::body RemoteClass::destructor {} { closeConn } itcl::body RemoteClass::openConn {add user pass} { if {$isOpen == 1} { FTP::Close set address "" set passwd "" set userName "" set isOpen 0 } set address $add set passwd $pass set userName $user FTP::Open $add $user $pass if { ! [FTP::isConn] } { error "Cannot open connection to $add, please check your user name and password" return } set isOpen 1 set beginPwd [FTP::Pwd] if { $beginPwd == "/" } { set beginPwd "" } } itcl::body RemoteClass::list {pwd} { if { $isOpen == 0 } return set contentList [FTP::List $pwd] set dln "" set fln "" set dls "" set fls "" set dld "" set fld "" foreach i $contentList { set name [lindex $i end] if { "d" == [string range [lindex $i 0] 0 0] } { if { [lindex $i end] == "." || [lindex $i end] == ".."} { # get rid of the . and .. ; } else { lappend dln $name/ lappend dls "(dir)" lappend dld [join [lrange $i 5 7]] } } elseif { "l" == [string range [lindex $i 0] 0 0] } { # Should we treat this as a directory or file? set link [lindex [split $name "/"] end] set name [lindex $i 8] set extLen [string length [file extension $name]] set lnkLen [string length [file extension $link]] if { $extLen<2 || $extLen>6 || $extLen==[string length $name] || \ $lnkLen<2 || $lnkLen>6 || $lnkLen==[string length $link] \ } { # Directory lappend dln $name/ lappend dls "(sym)" lappend dld [join [lrange $i 5 7]] } else { # File lappend fln $name lappend fls "(sym)" lappend fld [join [lrange $i 5 7]] } } else { lappend fln $name lappend fls [calcSizeStr [lindex $i 4]] lappend fld [join [lrange $i 5 7]] } } return [::list $dln $dls $dld $fln $fls $fld] } itcl::body RemoteClass::cd {dir} { if { $isOpen == 0 } return if { $dir == "" } return FTP::Cd $dir set pwd $dir } itcl::body RemoteClass::get {rFile lFile} { if {$isOpen == 0} return FTP::Type binary FTP::Get $rFile $lFile } itcl::body RemoteClass::pwd { {full 1} } { if {$isOpen == 0} return set dir [FTP::Pwd] if { $full } { return "ftp://${address}${dir}" } set crrntParts [split $dir '/'] set beginParts [split $beginPwd '/'] set same 1 set common "" set backup "" for { set i 1 } { $i < [llength $beginParts] } { incr i } { if { $same && [lindex $beginParts $i]==[lindex $crrntParts $i] } { set common "$common/[lindex $beginParts $i]" } else { set backup "/..$backup" set same 0 } } set dir "$backup/.[string range $dir [string length $common] end]" set netdir "ftp://${address}${dir}" return $netdir } itcl::body RemoteClass::closeConn {} { if {$isOpen == 0} return FTP::Close } fv5.4/ftools/guis/fv/class/Table.tcl0000644000220700001010000066741512562410237016761 0ustar birbylheadev# construct a FitsTable object # FitsTable FitsTableObjName FitsFileObjName currentHDU #------------------------------------------------------------------------------- # Modification History: # Ziqin Pan, Feb 18, 2004 # Add the following row selection functions # 1. Select rows by using the mouse # 2. Select all rows # 3. Invert selected rows # 4. Select rows from expr # 5. Delete the selected rows # 6. Do statistics on selected rows # 7. Do histogram on selected rows # 8. Calculate value on selected rows and column # 9. Keep selected rows after doing sorting # 10. Export selected rows and columns as text # 11. Export selected rows and columns as HDU #------------------------------------------------------------------------------- itcl::class Table { constructor {args} {} destructor {} public method makeTable { extNum_ } public method refresh { {doChildren_ 1} } public method calculateCols {colname_ colform_ formula_ selonly_} public method getCalcCols {} public method scplotCmd {{xyname_ {}}} public method delRowsWithCondition {cond_} public method selRowsWithCondition {cond_ fRow_ nRows_ seland_ selor_} public method delRowsFromList {entry_} public method selRowsFromList {entry_ seland_ selor_} public method closeCmd {} public method bringToFront {} public method setFileName { fName_ } public method addChild { child_ } public method freeChild { child_ } public method callHistogramDirectly { extNum_ fillFlag_ } public method getColInfo { name } { return [$fFile getColInfo $name] } # used by VectorTable public method getFatherFitsExtension {} public method getColumnInfo {name_ index_} # see protected sort methods below public method doSort { keys_ dirs_ unique_ } # called within VectorTable's constructor public method passParamsToVectorTable {} public method getnumRows {} public variable fileName "" public variable isFailedToCopy 0 public variable fFile public variable currentHDU public method trySaveASCII {} public method tryExport {} # protected protected variable _extNum 1 protected variable snum "" protected variable _overWriteImageValue protected variable _neverAskFlagValue "false" protected variable _overWriteImage no protected variable _frameXPos protected variable _endX 0 protected variable _valueTDIM protected variable _istart 0 protected variable _iend 0 protected variable _opCancel "false" protected method _determineOverWriteFlag {} protected method _openGroupFile { c r } protected method _plotVectorTableRow { c r } protected method _ds9MakeImage { fh colIdx slice xSize ySize } protected method _ds9MakePlot { rowNum_ fRow lRow xColumn_ yColumn_ {xeColumn_ ""} {yeColumn_ ""} } protected method _ds9MakePlot1 { rowNum_ range xColumn_ yColumn_ {xeColumn_ ""} {yeColumn_ ""} {inCurrGraph_ 0}} protected method _setOverWriteFlag { } protected method _setOpCancel { } protected method _drawTable {} protected method _plotCmd {} protected method _plotCols { xColumn_ xeColumn_ yColumn_ yeColumn_ \ {inCurrGraph_ 0} {whichRows_ -} {plotSelOnly_ 0}} protected method _drawTableFrame {} protected method _getDataForAxis { axis_ axisExpression_ rows_ } protected method _relocateDividLine {x_ index_} protected method _finalDividLine {x_ index_} protected method _startDividLine {x_ index_} protected method _setVScroll {args} protected method _setHScroll {args} protected method _setupTable { } protected method _redrawTable {prevCols_} protected method _addColsToTable {prevCols_ prevRows_} protected method _delColsFrTable {prevCols_ prevRows_} protected method _addRowsToTable {prevCols_ prevRows_} protected method _delRowsFrTable {prevCols_ prevRows_} protected method _addColsToFile {inWin_} protected method _addRowsToFile {inWin_} protected method _updateLast { } protected method _colMenu { hdr i colName colNum } protected method _updateUnViewedColumns {} protected method _moveColView { colName targetName option } protected method _addColView { colName_ addPos_ beforeAfter_ } protected method _delColView { colName_ } protected method _editColParamsWindow { { colNum0_ 0 } } protected method _isVScrollLocked {} private variable _isVScrollLocked1 protected method _scrollChildren { firstRow { currentRow -1} } ################ # Subclasses need to implement these methods... # all col/row params are zero-based protected method _getRawData {col_ row_} protected method _getFormattedData {col_ row_} protected method _readTableData {fCol_ fRow_ nCols_ nRows_} protected method _getRawDataBlock {fCol_ fRow_ lCol_ lRow_} protected method _putRawDataBlock {fCol_ fRow_ data_} protected method _putRawData {fCol_ fRow_ val_} # ################ protected method _jumpFrEnt {} protected method _jump {lineNum_} protected method _selRowsFrExpr {ifDelete_} protected method _copyCell {col_ row_} protected method _modifyTableCell {col_ row_ val_} protected method _writeTableData {col_ row_ val_} protected method _updateColSel {col_} protected method _resizeCan {x_ y_} protected method _layoutCan {x_ y_} protected method _getXYSize {x_ y_} protected method _refacing {} protected method _saveAs {} # exports to ascii file protected method _saveASCII {} protected method _export {} protected method _calXPos {fCol_ nCols_} protected method _reframe {} protected method _setScrolls {} protected method _getLastFirstCol {} protected method _closeFrWm {w_} protected method _realCloseCmd {} protected method _saveFile {} protected method _updateNumRows {} protected method _updateNumCols {} # protected method _addCols {} public method _addCols {{colindex -1 } {colname {} } {colformat {}} { colunit {}} {dispformat {}} } # protected method _delCols {} protected method _delCols {{collist_ -1 }} protected method _delRows {} protected method _delRowsRange {} # protected method _tryDelCols {} public method _tryDelCols {{collist_ -1 }} # protected method _tryDelRows {} public method _tryDelRows {{range_ 0}} # protected method _addRows {} public method _addRows {{rowindex -1} {rownum -1}} protected method _openVectorTable { colNum_ } # Ziqin Pan, Jan 2004 # Added functions for rows selection protected method _initSelRows {} protected method _selAllRows {} protected method _selRows {} public method _showselRows {} public method _showselCheck {} protected method _logicalWithselectedRows {rowlist_ seland_ selor_} protected method _setRowStartMark { row_} protected method _setRowEndMark { row_} protected method _unsetRowMark {} protected method _selInvert {} protected method _updateExportPanelState {} protected method _writeHist {ffile_ origName_} public method _parseToRowRange {start_end} protected method _saveTableToFile {win_ fitsFileName_ origName_} # # protected method _editCell {} protected method _selCell {} protected method _unselCell {} protected method _cellUp {} protected method _cellDown {} protected method _cellLeft {} protected method _cellRight {} protected method _pageUp {} protected method _pageDown {} protected method _jumpTo { colName } protected method _calculateCmd {} protected method _collapse {seed_ bed_} protected method _sortRange {bed_} protected method _sortCmd {} protected method _sortColumn {} protected method _calAbsXPos {} protected method _determineRealSlice { slice } protected method _getSortKey {key_} protected method _resetSKey {} protected method _cpyToCB {} protected method _cpyFrCB {} protected method _displaySlice { colIdx slice } protected method _createMovie { colIdx slice xSize ySize } protected method _getKeywordValue { keyword header } protected method _displayMovie { colIdx slice } protected method _makeHistogram { {extNum_ {}} } protected method _histoCmd {} protected method _changeUniqLabel {} protected method _statCmd {} protected method _statSelCmd {} protected method _makeJustification {} protected method _updateRestDisps {} protected method _saveTableToAscii {win_ asciiFileName_} protected method _setStartMark {col_ row_ {focus True} } protected method _buildMenus {} protected method _buildNewMenus {} protected method _postMenus {} protected method _updateHL {} protected common _colSel protected common _asciiColWidth 80 protected common _psortkey protected common _ssortkey protected common _tsortkey protected common _psortcheck 1 protected common _ssortcheck 1 protected common _tsortcheck 1 protected common _addcolname "" protected common _addcolunit "" protected common _addcolform "" protected common _addcoldisp "" protected common _isUniqMerge 0 # this explains the format for _numEntry, which contains what actually # shows up on the screen # set id ${c}_${r} # set _numEntry($id) $val protected variable _arrayDim protected variable _ttype protected variable _tType protected variable _numEntry protected variable _currentCol protected variable _currentRow protected variable _cellVar protected variable _cstartx "" protected variable _cstarty "" protected variable _oldcstartx "" protected variable _oldcstarty "" protected variable _cendx "" protected variable _cendy "" protected variable _insColNum "End of Table" protected variable _showRows 20 protected variable _showCols 6 protected variable _firstRow 1 protected variable _firstCol 1 protected variable _old_firstCol 1 protected variable _lastFirstCol 1 protected variable _droot "" protected variable _mBar # Ziqin Pan, Jan 2004 # Add variables to support row selection public variable _selectedRows protected variable _rstart "" protected variable _rend "" protected variable _selectAllRows 0 protected variable _statselonly 0 protected variable _plotselonly 0 protected variable _calcselonly 0 protected variable _exportsel 0 protected variable _exportselc 0 protected variable _exportcolsel 0 protected variable _fth 0 protected variable _ftp 0 protected variable _rowindex 1 protected variable _rownum 1 # # # what does DC stand for? protected variable _DC protected variable _xPos protected variable _yPos protected variable _absXPos protected variable _tableType protected variable _numCols protected variable _numRows # arrays from 0 to $_dispCols - 1 that keep information on vector info protected variable _cellPixWidth # cell width in characters protected variable _buttonWidth protected variable _cellWidth protected variable _columnName protected variable _columnType protected variable _columnComment protected variable _columnUnit protected variable _columnTDisp protected variable _columnForm protected variable _columnWidth protected variable _columnNull protected variable _columnDim protected variable _columnVecSize # a list (not an array) of column names protected variable _listColNames protected variable _unViewedColNames # _rowState is NEVER used...I only keep it here because of fitsTcl # (see fvTcl.c) -- Han protected variable _rowState # array of whether a column is chosen by the user ("notched" in the table display) protected variable _colNotchedState protected variable _tableData protected variable _anyColSelected 0 protected variable _anyRowsSelected 0 # _listPreSelectedColNames is the list of columns preselected by user to be # displayed using the right-mouse button on the Table button protected variable _listPreSelectedColNames protected variable _dispCols protected variable _startX protected variable _fatherFitsExtension protected common _graphIDhighest 0 protected variable _isDirPlot 0 protected variable _justStarted 1 protected variable _isBeingDestroyed 0 protected variable _myChildren {} protected method _readInTable { } protected method _setEndMark {col_ row_} protected method _unsetMark {} # used only in statistics menu, see Table::_statCmd protected common _colSName protected common _colMin protected common _colMax protected common _colMean protected common _colFMin protected common _colFMax protected common _colStd protected common _colRowRange protected common _colNumVal # only used in the file export menu, see Table::_saveASCII protected variable _exportRowRange protected variable _exportFirstRow protected variable _exportLastRow protected variable _exportFirstCol protected variable _exportLastCol protected variable _exportPrintRowNumbers protected variable _exportselRows protected variable _exportFormat protected variable _exportCSV protected variable _exportUserChooseChar protected variable _exportFixedFormat protected variable _exportCharBetweenCols protected variable _fitsFileLocationCol -1 protected variable _expandFlag false protected variable sortRowResultList } itcl::body Table::constructor {args} { } itcl::body Table::destructor {} { } itcl::body Table::getnumRows {} { return $_numRows } itcl::body Table::makeTable { extNum_ } { global g_charPix set _extNum $extNum_ set _DC(height) 20 # width in pixels required to display row numbers # set _DC(width) [expr ($_numRows !=0 )? \ # (int(log10($_numRows))+4)*$g_charPix : 100 ] set _DC(width) [expr ($_numRows > 10000 )? \ (int(log10($_numRows))+4)*$g_charPix : 8*$g_charPix ] set _DC(headroom) 80 set _DC(footroom) 40 set _DC(vscrollsize) 15 set _DC(hscrollsize) 15 # space to the right of the data set _DC(rightspace) 6 # space between lines set _DC(interline) 0 # top margin set _DC(tmar) 6 # left margin set _DC(lmar) 8 # Whether vertical scrollers are locked to parent's set _isVScrollLocked1 False #Read in all the needed data _readInTable #Draw the table _drawTable _buildMenus } itcl::body Table::_readInTable { } { #puts "readInTable start" global g_charPix set maxWidth [expr int([winfo screenwidth .]/$g_charPix)-10] set _dispCols [llength $_listPreSelectedColNames] for {set i 0} {$i < $_dispCols} {incr i} { set tmpName [lindex $_listPreSelectedColNames $i] if { [catch {set listOfListOneColInfo [$fFile getColInfo $tmpName]}] } { # error, so we won't display the column set _listPreSelectedColNames [lreplace $_listPreSelectedColNames $i $i] incr i -1 incr _dispCols -1 } else { set arrayColInfoLists($i) [lindex $listOfListOneColInfo 0] } } setarray _colNotchedState 0 [expr $_dispCols-1] 0 set thisHeader [split [$fFile dumpHeader] \n] for {set i 0} {$i < $_dispCols} {incr i} { set _valueTDIM($i) 0 set listOneColInfo $arrayColInfoLists($i) # in the listOneColInfo list. the elements are # Index 0 : column name # 1 : column type (TFORM) # 2 : column unit # 3 : column TDISP # 4 : column format # 5 : column width # 6 : is Zero # 7 : is Scaled # 8 : column null value #puts "listOneColInfo: $listOneColInfo" set _columnName($i) [lindex $listOneColInfo 0] # TFORM -- don't blame me, I didn't name this # Pan Chai: ignore everything after the vaild TFORM value # i.e., if TFORMn = 16A23:18/032 # TFORMn should be 16A23 only set tformData [lindex $listOneColInfo 1] regsub {^[0-9a-zA-Z]*} [lindex $listOneColInfo 1] "" restData if { [string length $restData] > 0 } { if { [string range $restData 0 0] == ":" } { set idx [string first $restData $tformData] set _columnType($i) [string range $tformData 0 [expr $idx - 1]] } else { set _columnType($i) [lindex $listOneColInfo 1] } } else { set _columnType($i) [lindex $listOneColInfo 1] } # TUNIT set _columnUnit($i) [lindex $listOneColInfo 2] set _columnTDisp($i) [lindex $listOneColInfo 3] set _columnComment($i) "" set idx [lsearch -glob $thisHeader "TTYPE*$_columnName($i)*"] if { $idx >= 0 } { set commentTokenList [split [lindex $thisHeader $idx] "/"] if { [llength $commentTokenList] > 1 } { set _columnComment($i) [string trim [lindex $commentTokenList end]] } } if { [regexp J $_columnType($i)] } { set _columnForm($i) "%.10G" } elseif { [regexp K $_columnType($i)] } { # chai: K for 64 bits set _columnForm($i) "%s" } else { set _columnForm($i) [lindex $listOneColInfo 4] } set _columnWidth($i) [lindex $listOneColInfo 5] if { [regexp K $_columnType($i)] } { # chai: using double data type width for the cell if it is K type set _columnWidth($i) 20 } set _columnNull($i) [lindex $listOneColInfo 8] # Check for TDIM keyword set colNo [lsearch $_listColNames $_columnName($i)] incr colNo if { [catch {set key [$fFile getKeyword TDIM$colNo]} err] } { set _columnDim($i) 1 set _valueTDIM($i) 0 } else { set key "[string trim [lindex [lindex $key 0] 1] {' ()}]" set _columnDim($i) [split $key ,] set _arrayDim($i) [split $key ,] set _valueTDIM($i) [llength $_arrayDim($i)] } if { ![catch {set key [$fFile getKeyword TFORM$colNo]} err] } { set key "[string trim [lindex [lindex $key 0] 1] {' ()}]" set testKey $key set value 1 scan $key "%d%s" value dataType if { $value > 1 && [string range $dataType 0 0] != "A" && [string range $dataType 0 0] != "C" && [string range $dataType 0 0] != "L" && [string range $dataType 0 0] != "M" && [string range $dataType 0 0] != "P" && [string range $dataType 0 0] != "X" } { if { $_valueTDIM($i) <= 0 } { set _valueTDIM($i) 1 } } else { set testSequence [split $testKey "()"] if { [llength $testSequence] != 2 } { set _valueTDIM($i) 0 } else { set idx [string first "P" [lindex $testSequence 0] ] if { $idx >= 0 } { regsub -all {[0-9]} [lindex $testSequence 1] "" result if { $result != "" } { set _valueTDIM($i) 0 } } else { set _valueTDIM($i) 0 } } } } if { ![catch {set _ttype [$fFile getKeyword TTYPE$colNo]} err] } { set _ttype "[string trim [lindex [lindex $_ttype 0] 1] {' ()}]" set _tType($i) [lindex [split $_ttype ,] 0] } # Determine vector size of column if { $_tableType == "Binary Table" } { # "PE(65)" means a variable vector table of max length 65 if { [string index $_columnType($i) end] == ")" } { # remove letters PE regsub -all {[A-Z]} $_columnType($i) "" _columnVecSize($i) # Pull out variable length from (65) if { ![regexp {\((.*)\)} $_columnVecSize($i) dmy val] } { set val 0 } set _columnVecSize($i) [expr -$val] } else { regsub -all {[A-Z].*} $_columnType($i) "" _columnVecSize($i) # most common scenario; e.g., "F4.2" or "I" if { $_columnVecSize($i) == "" } { set _columnVecSize($i) 1 } } if { [regexp A $_columnType($i)] && $_columnVecSize($i) != 0 } { set token [split $_columnType($i) "A"] regsub -all {[A-Z]} [lindex $token 0] "" testString if { $testString <= 1 } { set _columnVecSize($i) 1 } elseif { [lindex $token 0] == "" && [lindex $token 1] == "" } { set _columnVecSize($i) 1 } elseif { [lindex $token 1] == "" } { set _columnVecSize($i) 1 # set _columnVecSize($i) [lindex $token 0] } else { set _columnVecSize($i) [expr [lindex $token 0] / [lindex $token 1]] set _columnDim($i) [lindex $token 1] set _columnWidth($i) [lindex $token 1] } } } else { set _columnVecSize($i) 1 } if { ![info exists _cellWidth($i)] } { set headMax 0 foreach l [list xx$_columnName($i) $_columnType($i) $_columnUnit($i)] { set wdth [font measure g_titleFont $l] if { $wdth > $headMax } {set headMax $wdth} } # we now have header maximum in pixels set headMax [expr int( 1.0*$headMax/$g_charPix + 0.999 )] # we now have header maximum in characters set _cellWidth($i) [expr ($headMax > $_columnWidth($i)) \ ? $headMax : $_columnWidth($i) ] if { $_cellWidth($i) > $maxWidth } { set _cellWidth($i) $maxWidth } } } _calAbsXPos } ### why was this taken out? --Han ### I'm putting it back in (by uncommenting it) # itcl::body Table::_calAbsXPos {} { #puts "_calAbsXPos start" global g_charPix set _absXPos(0) [expr $_DC(lmar) + $_DC(width) +$_DC(rightspace)] # this is to determine the size of a button inside the entry if ![winfo exists .dummyTest] { button .dummyTest -text "WWWWW" -font [list Helvetica 10] } set _buttonSize [winfo reqwidth .dummyTest] for {set i 0} {$i < $_dispCols} {incr i} { set _cellPixWidth($i) [expr $g_charPix*$_cellWidth($i)+4] set _absXPos([expr $i+1]) [expr $_absXPos($i)+$_cellPixWidth($i)+$_DC(rightspace) + 3] if { $_valueTDIM($i) > 0 } { # set _absXPos([expr $i+1]) [expr $_absXPos([expr $i + 1])+$_buttonSize] } } } itcl::body Table::_drawTable {} { global isMac global g_titleFont set _droot ".[namespace tail $this]" if { [winfo exists $_droot] } { destroy $_droot } powToplevel $_droot .dummy wm geometry $_droot +50+[winfo pointery .] setFileName $fileName set _firstRow 1 set _firstCol 1 set _fitsFileLocationCol -1 _setupTable # Ziqin Apr 01,2004 frame $_droot.table bind $_droot +[itcl::code $this _closeFrWm %W] set can $_droot.table.can set hdr $_droot.table.hdr canvas $hdr \ -width $_DC(xsize) \ -height $_DC(headroom) -highlightthickness 0 canvas $can \ -width $_DC(xsize) \ -height $_DC(ysize) \ -relief ridge -borderwidth 5 bind $can +[itcl::code $this _resizeCan %w %h] bind $can [itcl::code $this _jumpTo 0] bind $can [itcl::code $this _cellUp] bind $can [itcl::code $this _cellDown] bind $can [itcl::code $this _cellLeft] bind $can [itcl::code $this _cellRight] bind $can [itcl::code $this _pageUp] bind $can [itcl::code $this _pageDown] bind $can "\ focus $_droot.usrEntry.sel_e; \ event generate $_droot.usrEntry.sel_e -when now \ -keysym %K -keycode %k" scrollbar $_droot.table.vscroll -width $_DC(vscrollsize) -orient vertical \ -command [itcl::code $this _setVScroll] scrollbar $_droot.table.hscroll -width $_DC(hscrollsize) -orient horizontal \ -command [itcl::code $this _setHScroll] if { $_numRows } { $_droot.table.vscroll set 0.0 \ [expr double($_showRows)/$_numRows] } else { $_droot.table.vscroll set 0.0 1.0 } if { $_listPreSelectedColNames == "" } { $_droot.table.hscroll set 0.0 1.0 } else { $_droot.table.hscroll set 0.0 \ [expr double($_showCols)/[llength $_listPreSelectedColNames]] } pack $_droot.table.hdr -side top -fill x -anchor w pack $_droot.table.vscroll -side right -fill y pack $_droot.table.hscroll -side bottom -fill x pack $_droot.table.can -side top -fill both -expand 1 frame $_droot.usrEntry -height $_DC(footroom) \ -relief raised -borderwidth 0 entry $_droot.usrEntry.goto_e -width 10 \ -relief sunken -bd 2 -font g_titleFont bind $_droot.usrEntry.goto_e [itcl::code $this _jumpFrEnt] button $_droot.usrEntry.goto_b -text "Go to:" \ -command [itcl::code $this _jumpFrEnt] -font g_titleFont label $_droot.usrEntry.sel -text " Edit cell:" -font g_titleFont entry $_droot.usrEntry.sel_e -width 22 \ -textvariable [itcl::scope _cellVar] -relief sunken -bd 2 -font g_titleFont bind $_droot.usrEntry.sel_e [itcl::code $this _editCell] if { ($_tableType == "Image") || ($_tableType == "Vector Table") } { checkbutton $_droot.usrEntry.lock -text "Lock to Parent " \ -font g_titleFont \ -variable [itcl::scope _isVScrollLocked1 ] \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black -activebackground $fvPref::globalBgColor \ -command {} } pack $_droot.usrEntry.goto_b -side left pack $_droot.usrEntry.goto_e -side left pack $_droot.usrEntry.sel -side left pack $_droot.usrEntry.sel_e -side left catch { pack $_droot.usrEntry.lock -side right } pack $_droot.usrEntry -side bottom -fill x pack $_droot.table -side top -fill both -expand 1 # draw the lines and entries ... _drawTableFrame # Bind window to menu events bind $_droot <> [itcl::code $this _postMenus] bind $_droot <> [itcl::code $this _saveFile] bind $_droot <> [itcl::code $this _saveAs] bind $_droot <> [itcl::code $this _export] bind $_droot <> [itcl::code $this _saveASCII] bind $_droot <> [itcl::code $this closeCmd] bind $_droot <> [itcl::code $this _cpyToCB] bind $_droot <> [itcl::code $this _cpyFrCB] } itcl::body Table::_setupTable { } { set lastCol [llength $_listPreSelectedColNames] if {$_showRows > $_numRows} { set _showRows $_numRows } if {$_showCols > $lastCol} { set _showCols $lastCol } if { $_firstCol > [expr $lastCol -$_showCols+1]} { set _firstCol [expr $lastCol -$_showCols+1] } if { $_firstRow > [expr $_numRows -$_showRows+1]} { set _firstRow [expr $_numRows -$_showRows+1] } # the - $_DC(rightspace)/2 appears to be a hack, so that the table looks prettier # and not so frayed at the right margin...taking it out will show you what I mean set _DC(xsize) [expr $_absXPos([expr $_firstCol-1+$_showCols]) \ - $_absXPos([expr $_firstCol-1]) + $_absXPos(0) \ - $_DC(rightspace)/2 ] if { $_DC(xsize) > [winfo screenwidth .] } { set _DC(xsize) [expr [winfo screenwidth .] - 20] } set _DC(ysize) [expr 2*$_DC(tmar) + $_showRows*($_DC(height)+$_DC(interline))] _getXYSize $_DC(xsize) $_DC(ysize) _getLastFirstCol _updateLast } itcl::body Table::_getLastFirstCol {} { # base on the size of the canvas, find out the beginning of the # last page of the table. set tmpWidth [expr $_DC(lmar) + $_DC(width) + $_DC(rightspace)] for { set i $_dispCols} {$i > 0} {incr i -1} { set tmpWidth [expr $tmpWidth+$_cellPixWidth([expr $i-1])+$_DC(rightspace) + 10] if { $tmpWidth > $_DC(xsize) } { break } } set _lastFirstCol [expr $i +1] } itcl::body Table::_buildMenus {} { #puts "_buildMenus start" global isMac global g_titleFont if { $isMac } { set _mBar .mbar.table } else { set _mBar $_droot.mbar } $_droot config -menu $_mBar if { ![winfo exists $_mBar] } { _buildNewMenus } } itcl::body Table::_buildNewMenus {} { #puts "_buildNewMenus start" global isMac isWin global g_titleFont menu $_mBar -font g_titleFont if { $isMac } { set evtWndw "" set cmdkey "Cmd" $_mBar add cascade -menu $_mBar.apple $_mBar add cascade -menu $_mBar.file -label File $_mBar add cascade -menu $_mBar.edit -label Edit $_mBar add cascade -menu $_mBar.tools -label Tools $_mBar add cascade -menu .mbar.wind -label Windows $_mBar add cascade -menu $_mBar.help -label Help buildAppleStyleMenu $_mBar.apple } else { set evtWndw $_droot set cmdkey "Alt" $_mBar add cascade -menu $_mBar.file -label File $_mBar add cascade -menu $_mBar.edit -label Edit $_mBar add cascade -menu $_mBar.tools -label Tools $_mBar add cascade -menu $_mBar.help -label Help } # FILE if { $isMac } { buildFileMenu $_mBar.file if { ($_tableType == "Binary Table") || ($_tableType == "ASCII Table")} { $_mBar.file entryconfig "Export" -label "Export HDU..." } $_mBar.file entryconfig "ExportAs" -label "Export as Text..." \ -state normal -font g_titleFont $_mBar.file entryconfig "Save As..." -state normal -font g_titleFont $_mBar.file entryconfig "Close" -state normal -font g_titleFont } else { menu $_mBar.file -tearoff False $_mBar.file add command -label "Save" -underline 0 \ -command "doMenuEvent <>" -accelerator "$cmdkey+S" -font g_titleFont if { ($_tableType == "Binary Table") || ($_tableType == "ASCII Table")} { $_mBar.file add command -label "Export HDU..." \ -command "doMenuEvent <>" -font g_titleFont } $_mBar.file add command -label "Export as Text..." \ -command "doMenuEvent <>" -font g_titleFont $_mBar.file add command -label "Close" \ -command "doMenuEvent <>" -accelerator "$cmdkey+W" -font g_titleFont } # EDIT buildEditMenu $_mBar.edit # TOOLS menu $_mBar.tools -tearoff False # HELP buildHelpMenu $_mBar.help tableDisplay "Table Display" # Configure the Post Commands if { $isMac || $isWin } { # The Mac and Windows post all menus at once, so we only need # to do the post on the top level $_mBar configure -postcommand "doMenuEvent <> $evtWndw" } else { # Unix has to post each individual menu $_mBar.file configure -postcommand \ "doMenuEvent <> $evtWndw" $_mBar.edit configure -postcommand \ "doMenuEvent <> $evtWndw" $_mBar.tools configure -postcommand \ "doMenuEvent <> $evtWndw" } } itcl::body Table::_postMenus {} { #puts "_postMenus start" if { [$fFile isFileChanged] && ![$fFile isReadOnly] } { $_mBar.file entryconfigure Save -state normal } else { $_mBar.file entryconfigure Save -state disabled } set clipType [lindex [fvClipBoard report] 0] if { ($clipType == "table") && !$isFailedToCopy } { $_mBar.edit entryconfigure "Paste" -state normal } else { $_mBar.edit entryconfigure "Paste" -state disabled } if { $_cstartx == "" } { $_mBar.edit entryconfigure "Copy" -state disabled } else { $_mBar.edit entryconfigure "Copy" -state normal } } itcl::body Table::scplotCmd {{xyname_ {}}} { global g_charPix set _DC(height) 20 set _DC(width) [expr ($_numRows !=0 )? \ (int(log10($_numRows))+4)*$g_charPix : 100 ] set _DC(headroom) 80 set _DC(footroom) 40 set _DC(vscrollsize) 15 set _DC(hscrollsize) 15 # space to the right of the data set _DC(rightspace) 6 # space between lines set _DC(interline) 0 # top margin set _DC(tmar) 6 # left margin set _DC(lmar) 8 set _listPreSelectedColNames $_listColNames # let the destructor know set _isDirPlot 1 # _readInTable # Ziqin Pan , Feb 18, 2004 # add to support row selection _initSelRows # # set argc [llength $xyname_] if { $argc<4 || $argc>6 } { _plotCmd } elseif { $argc>5 } { eval _plotCols $xyname_ } else { if { $argc==4 } { set flag 0 set range "-" set sel 0 foreach {x xe y ye } $xyname_ {} } elseif { $argc==5} { set range "-" set sel 0 foreach {x xe y ye flag} $xyname_ {} } else { set sel 0 foreach {x xe y ye flag range} $xyname_ {} } _plotCols $x $xe $y $ye $flag $range $sel } itcl::delete object $this } itcl::body Table::_plotCmd {} { #puts "_plotCmd start" set nameList [list RowNumber ElementNumber] set vecList [list 1 1] for {set i 0} {$i < $_dispCols} {incr i} { if { $_columnVecSize($i) > 0 } { # lappend vecList $_columnVecSize($i) lappend vecList $_columnDim($i) lappend nameList [lindex $_listPreSelectedColNames $i] } } if { [winfo exists .pltSel] } { .pltSel quitCmd } set _ftp [FitsPlotSel .pltSel $this $nameList $vecList [itcl::code $this _plotCols]] wm title .pltSel "Select Plot Columns" _showselCheck tkwait window .pltSel set _ftp 0 } itcl::body Table::_getDataForAxis { axis_ axisExpression_ whichRows_ } { if { $axisExpression_ == "RowNumber" } { set axisExpression_ "#ROW" set dataType 41 set nelem [range count $whichRows_ $_numRows] set dim 1 } else { if { [catch {set xinfo [$fFile getExprInfo $axisExpression_]} err] } { error "Cannot plot expression for $axis_.\n\n$err" } set dataType [lindex $xinfo 0] set nelem [lindex $xinfo 1] set dim [lindex $xinfo 2] if { $dataType!=41 && $dataType!=82 } { error "Cannot plot expression type for $axis_.\ Expression must evaluate to INT or REAL" } if { $nelem == -1 } { # Scalar constants could be applied to either nRows or nElems # so just return a solitary value and expand later as needed set whichRows_ 1 } elseif { $nelem < -1 } { # Treat vector constants as a regular vector column set nelem [expr -$nelem] } } set dataInfoForPOW [$fFile loadExpr $axisExpression_ NULL $whichRows_] set dataPtr [lindex $dataInfoForPOW 0] set dataType [lindex $dataInfoForPOW 1] set numElements [lindex $dataInfoForPOW 2] return [list $dataPtr $dataType $numElements $nelem $dim] } itcl::body Table::callHistogramDirectly { extNum_ fillFlag_ } { global g_histoParam set nameList $_listPreSelectedColNames set tmpName [namespace tail $this] # set ft [FitsHistoParam .his_$tmpName $fFile $nameList $this] set _fth [FitsHistoParam .his_$tmpName $fFile $nameList $this] if { $fillFlag_ == "true" } { # $ft insertDefaultValue $_fth insertDefaultValue wm title .his_$tmpName "fv: Histogram" tkwait window .his_$tmpName if { $g_histoParam == "" } return # _makeHistogram $extNum_ } else { wm title .his_$tmpName "fv: Histogram" tkwait window .his_$tmpName } set _fth 0 # Ziqin Pan # itcl::delete object $this closeCmd # } itcl::body Table::_histoCmd {} { global g_histoParam set g_histoParam "" set nameList $_listPreSelectedColNames set tmpName [namespace tail $this] set _fth [FitsHistoParam .his_$tmpName $fFile $nameList $this] wm title .his_$tmpName "fv: Histogram" _showselCheck tkwait window .his_$tmpName set _fth 0 if { $g_histoParam == "" } return # _makeHistogram } itcl::body Table::_setOpCancel {} { set _opCancel true destroy .di } itcl::body Table::_setOverWriteFlag {} { set _opCancel false set _overWriteImage $_overWriteImageValue destroy .di } itcl::body Table::_determineOverWriteFlag {} { if [winfo exists .di] { destroy .di } if [winfo exists .pow.pow] { powToplevel .di .dummy wm title .di "fv: Ask to Replace Selected Image" label .di.label -text "Replace current selected image?" -font g_titleFont label .di.empty -text " " -font g_titleFont radiobutton .di.yes -variable [itcl::scope _overWriteImageValue] -value "yes" \ -font g_titleFont -text "Yes" radiobutton .di.no -variable [itcl::scope _overWriteImageValue] -value "no" \ -font g_titleFont -text "No" checkbutton .di.check -text "Don't ask anymore on remaining \nsession of current FITS file." \ -onvalue true -offvalue false \ -justify left \ -font g_titleFont -variable [itcl::scope _neverAskFlagValue] button .di.ok -text OK -command [itcl::code $this _setOverWriteFlag] button .di.cancel -text Cancel -command [itcl::code $this _setOpCancel] grid .di.label -row 0 -column 0 -pady 5 -padx 5 -sticky news -columnspan 5 grid .di.yes -row 1 -column 1 -padx 1 -pady 1 -sticky news grid .di.no -row 1 -column 3 -padx 1 -pady 1 -sticky news grid .di.empty -row 2 -column 0 -padx 1 -pady 1 -sticky news -columnspan 5 grid .di.check -row 3 -column 0 -padx 1 -pady 1 -sticky news -columnspan 5 grid .di.ok -row 4 -column 1 -padx 1 -pady 1 -sticky nes grid .di.cancel -row 4 -column 3 -padx 1 -pady 1 -sticky nws if { $_overWriteImageValue == "yes" } { .di.yes select } else { .di.no select } tkwait window .di } } itcl::body Table::_ds9MakeImage { fh colIdx slice xSize ySize } { global g_backupDir set fCol_ $colIdx set filemode 2 set tmpfile ${g_backupDir}/ds9Temp.fit if [file exists $tmpfile] { file delete -force $tmpfile } if { [catch {set newfits [fits open $tmpfile $filemode]} err] } { error $err return } # command: fitsFile put ihd -p bitpix naxes axis_list # $newfits put ihd -p 32 2 {$xSize $ySize} set key [$fFile getKeyword TFORM[expr $colIdx + 1]] set datavalue [string trim [lindex [lindex $key 0] 1] {' ()}] scan $datavalue "%d%s" value dataType switch $dataType { "L" { set dataForm 8 } "X" { set dataForm 8 } "I" { set dataForm 16 } "J" { set dataForm 32 } "A" { set dataForm 8 } "E" { set dataForm -32 } "D" { set dataForm -64 } "B" { set dataForm 8 } "C" { set dataForm -32 } "M" { set dataForm -64 } "P" { set dataForm -64 } } #puts "value: $value" $newfits put ihd -p $dataForm 2 {$xSize $ySize} $newfits put keyword "NAXIS1 $xSize" $newfits put keyword "NAXIS2 $ySize" set datatList {} for {set i 1} {$i <= [expr $xSize * $ySize]} {incr i} { lappend dataList [$fh get vtable -noformat $_tType($colIdx) $i $slice] } catch { $newfits put image 1 1 $dataList } err $newfits close set err "none" catch {exec xpaaccess ds9} result if { [string range $result 0 1] == "no" } { # start DS9 if DS9 isn't there if { [catch {exec ds9 &} ds9pid] } { file delete $tmpfile if { [tk_dialog .saoError "DS9 startup error.. Cannot start DS9!\nUse POW instead?" \ question 0 Yes No] == 0 } { close $fFile return NO_YET } close $fFile return DONE } # wait till ds9 is up set flag 1 set nSecs 0 while { $flag } { after 1000 incr nSecs catch {exec xpaaccess ds9} result if { [string range $result 0 2] == "yes" } { set flag 0 } else { if { $nSecs > 10 } { file delete $tmpfile if { [tk_dialog .saoError "DS9 startup error.. Cannot start ds9!\nUse POW instead?" \ question 0 Yes No] == 0 } { close $fFile return NO_YET } close $fFile return DONE } } } } set displayName [format "%s\(%s\)" [file tail $fileName] $slice] exec xpaset ds9 fits $displayName < $tmpfile file delete $tmpfile return DONE } itcl::body Table::_determineRealSlice { slice } { if ![info exists sortRowResultList] { return $slice } return [lindex $sortRowResultList [expr $slice + - 1]] } itcl::body Table::_displaySlice { colIdx slice } { global g_titleFont global g_backupDir global xFactor yFactor global currgn powFirstTimeThroughFlag powPlotParam currimg global xCount yCount global powFitsHeader powFitsHeaderCnt powPlotParam global powWCSList powWCSLabel powWCSName powWCS global useWCSInfo powWCSInfo global powWCSToken if { [string first "ftp" $fileName] >= 0 } { set fileName [format "%s/%s/%s" $::env(HOME) $g_backupDir [file tail $fileName]] } set slice [expr $_firstRow + $slice] set slice [_determineRealSlice $slice] set xSize [lindex $_arrayDim($colIdx) 0] set ySize [lindex $_arrayDim($colIdx) 1] set fh [fits open $fileName 0] $fh move +[expr ${_extNum} - 1] regsub -all { } [urlTail $fileName] _ cleanFileName set graphHandle [format "%s\(%s_%s)_%s" ${cleanFileName} $_tType($colIdx) $slice $_graphIDhighest] # tempFile is now a temporary file created in backup directory fvtmp via fits_copy_cell2image set tempFile ${g_backupDir}/_[pid]_[clock seconds] if { $fvPref::imgDisplayer == "DS9" } { if { [catch {exec ds9 &} ds9pid] } { } } else { set tempFile "NONE" if { [winfo exist .pow.pow]!=1 } { powInit .dummy } set oldgn "" if { [info exists currimg] && $currimg!="NULL" && $currimg!="" } { if { $_neverAskFlagValue == "false" } { _determineOverWriteFlag if { $_opCancel == "true" } return } # the graph is not already on .pow.pow, if _overWriteImage is yes, then delete the previous # selected image. if { $_overWriteImage == "yes" } { if { $currgn != "powDef" } { set oldgn $currgn set xo $powPlotParam(xo,$currgn) set yo $powPlotParam(yo,$currgn) } set currgn "" } } } # set graphHandle ${cleanFileName}_[expr $currentHDU-1]_$_graphIDhighest # call fits_copy_cell2image to translate the keyword and wcs set result [$fFile translateKeyWords $_tType($colIdx) $slice DEFAULT $tempFile] if { $fvPref::imgDisplayer == "DS9" } { catch {exec xpaaccess ds9} result after 1000 exec xpaset ds9 fits $graphHandle < $tempFile return } # fitsObj load arrayRow set alist [$fh load arrayRow $_tType($colIdx) $slice [expr $xSize * $ySize] NULL 1] eval powCreateData $graphHandle $alist set wcsinfo [lindex $result 2] set powWCS($graphHandle) $wcsinfo set powWCS(${graphHandle}scope) $powWCS($graphHandle) set powWCS(imgobj_$graphHandle) $powWCS($graphHandle) set useWCSInfo(${graphHandle}scope) $fvPref::ifWCSInfo set useWCSInfo($graphHandle) $fvPref::ifWCSInfo #set result [$fFile getHeader2String] #set cntList($graphHandle) [$fFile getHeaderKeyWord [lindex $result 0] $graphHandle] set cntList($graphHandle) [$fFile getHeaderKeyWord [lindex $result 0] $graphHandle] set powFitsHeaderCnt($graphHandle) [lindex $cntList($graphHandle) 1] if { [lindex $cntList($graphHandle) 0] > 0 } { set powFitsHeader($graphHandle) [lindex $result 0] set powWCSInfo($graphHandle,DEFAULT) $powWCS($graphHandle) } else { set powFitsHeader($graphHandle) [$fFile assembleWcsHeader $graphHandle NOWCS] } set x_label "X" set y_label "Y" #puts "powWCS($graphHandle): $powWCS($graphHandle)" #puts "powFitsHeader($graphHandle): $powFitsHeader($graphHandle)" set powFitsHeader(imgobj_$graphHandle) $powFitsHeader($graphHandle) set powFitsHeaderCnt(imgobj_$graphHandle) $powFitsHeaderCnt($graphHandle) set useWCSInfo(imgobj_$graphHandle) $useWCSInfo($graphHandle) set powWCSName(imgobj_$graphHandle) 0 powCreateImage imgobj_$graphHandle $graphHandle 0 0 $xSize $ySize 1 1 1 1 $x_label $y_label value set powWCSList(imgobj_$graphHandle) {} if [info exist powWCSToken($graphHandle)] { for { set wi 1 } { $wi < [llength $powWCSToken($graphHandle)] } { incr wi } { # call fits_copy_cell2image to translate the keyword and wcs for other projection set dest [lindex $powWCSToken($graphHandle) $wi] set result [$fFile translateKeyWords $_tType($colIdx) $slice $dest $tempFile] set powWCSInfo($graphHandle,$dest) [lindex $result 2] #puts "powWCSInfo($graphHandle,$dest): $powWCSInfo($graphHandle,$dest)" #powDebugDataPrint "$graphHandle" [lindex $result 0] } lappend powWCSList(imgobj_$graphHandle) [llength $powWCSToken($graphHandle)]] lappend powWCSList(imgobj_$graphHandle) $powWCSToken($graphHandle) } else { lappend powWCSList(imgobj_$graphHandle) 1 lappend powWCSList(imgobj_$graphHandle) {} } set powWCSName($graphHandle) 0 set powWCSList($graphHandle) $powWCSList(imgobj_$graphHandle) set powWCSList(${graphHandle}scope) $powWCSList(imgobj_$graphHandle) #puts "powWCSList($graphHandle): $powWCSList($graphHandle)" set powPlotParam(graphType,$graphHandle) [string tolower [lindex [$fh info hdutype] 0]] set powPlotParam(graphType,${graphHandle}scope) $powPlotParam(graphType,$graphHandle) set powPlotParam(zoomed,$graphHandle) 0 set powPlotParam(zoomed,${graphHandle}scope) 0 set xCount($graphHandle) 0 set yCount($graphHandle) 0 set xCount(${graphHandle}scope) 0 set yCount(${graphHandle}scope) 0 set x_unit "pixels" set y_unit "pixels" set z_label "counts" #powDebugDataPrint "$graphHandle" $powFitsHeader($graphHandle) for {set wi 0} {$wi < [lindex $powWCSList($graphHandle) 0]} {incr wi} { set wcsCoord [lindex $powWCSList($graphHandle) 1] set wcsName [lindex $wcsCoord $wi] set appendStr "" if { $wcsName != "DEFAULT" } { set appendStr $wcsName } if { ![catch {set tmp [_getKeywordValue CTYPE1$appendStr $powFitsHeader($graphHandle)]}] } { set x_label $tmp if { $appendStr == "" } { set wcstmp_x [string trim [lindex [lindex $wcsinfo 3] 0]] if { $wcstmp_x != "" } { set x_label $wcstmp_x } } } if { ![catch {set tmp [_getKeywordValue CTYPE2$appendStr $powFitsHeader($graphHandle)]}] } { set y_label $tmp if { $appendStr == "" } { set wcstmp_y [string trim [lindex [lindex $wcsinfo 3] 1]] if { $wcstmp_y != "" } { set y_label $wcstmp_y } } } if { ![catch {set tmp [_getKeywordValue CUNIT1$appendStr $powFitsHeader($graphHandle)]}] } { if { $tmp != "" } { set x_unit $tmp } } if { ![catch {set tmp [_getKeywordValue CUNIT2$appendStr $powFitsHeader($graphHandle)]}] } { if { $tmp != "" } { set y_unit $tmp } } if { ![catch {set tmp [_getKeywordValue BUNIT$appendStr $powFitsHeader($graphHandle)]}] } { if { $tmp != "" } { set z_label $tmp } } set powWCSLabel(xlabel,imgobj_$graphHandle,$wcsName) $x_label set powWCSLabel(ylabel,imgobj_$graphHandle,$wcsName) $y_label set powWCSLabel(xunit,imgobj_$graphHandle,$wcsName) $x_unit set powWCSLabel(yunit,imgobj_$graphHandle,$wcsName) $y_unit set powWCSLabel(xlabel,$graphHandle,$wcsName) $x_label set powWCSLabel(ylabel,$graphHandle,$wcsName) $y_label set powWCSLabel(xunit,$graphHandle,$wcsName) $x_unit set powWCSLabel(yunit,$graphHandle,$wcsName) $x_unit } # Pan Chai - and we use DEFAULT wcs to construct first image/plot powCreateGraph $graphHandle NULL imgobj_$graphHandle \ $powWCSLabel(xunit,imgobj_$graphHandle,DEFAULT) \ $powWCSLabel(yunit,imgobj_$graphHandle,DEFAULT) \ $powWCSLabel(xlabel,imgobj_$graphHandle,DEFAULT) \ $powWCSLabel(ylabel,imgobj_$graphHandle,DEFAULT) \ [lindex $fvPref::graphDispSize 0] [lindex $fvPref::graphDispSize 0] if [info exists xo] { powMoveGraphTo $graphHandle $xo $yo .pow.pow foreach el [list xTop yTop xBot yBot xo yo graphWidth graphHeight xmagstep ymagstep] { unset powPlotParam($el,$oldgn) } powDeleteGraph $oldgn NOPROMPT powDeleteImage $oldgn $oldgn # set _graphIDhighest [expr $_graphIDhighest - 1] powReconfigureToplevel 1 } if { [info exists xFactor] && [info exists yFactor] } { #powStretchGraph $graphHandle $xFactor $yFactor } incr _graphIDhighest catch {$fh close} err set powPlotParam(zoomed,$currimg) 0 } itcl::body Table::_getKeywordValue { keyword header } { set k 0 set tokenStr "" for {set i 0} {$i < [string length $header]} {incr i 80} { set currentStr [string range $header $i [expr $i + 79]] set strToken [split $currentStr "="] set sKeyword [lindex $strToken 0] if { [string trim $sKeyword] == $keyword } { set tokenStr $currentStr break } incr k } set valueStr [lindex [split [string range $tokenStr 10 end] "/"] 0] regsub -all {'} $valueStr {} returnValue return [string trim $returnValue] } itcl::body Table::_displayMovie { colIdx slice } { global g_titleFont set slice [expr $_firstRow + $slice] set slice [_determineRealSlice $slice] set xSize [lindex $_arrayDim($colIdx) 0] set ySize [lindex $_arrayDim($colIdx) 1] set _istart 1 set _iend [lindex $_arrayDim($colIdx) 2] # image selection if { [winfo exist .fv_imgsel] == 1 } { destroy .fv_imgsel } powToplevel .fv_imgsel .dummy wm title .fv_imgsel "fv: Image Selection" label .fv_imgsel.label -text "The image has $_iend slices" \ -relief ridge -borderwidth 4 -font g_titleFont label .fv_imgsel.sl -width 5 -text "Start" -font g_titleFont entry .fv_imgsel.se -width 10 -textvariable [itcl::scope _istart] -font g_titleFont label .fv_imgsel.el -width 5 -text "End" -font g_titleFont entry .fv_imgsel.ee -width 10 -textvariable [itcl::scope _iend] -font g_titleFont button .fv_imgsel.anim -text "Animate" \ -command "[itcl::code $this _createMovie $colIdx $slice $xSize $ySize] destroy .fv_imgsel" -font g_titleFont button .fv_imgsel.cancel -text "Cancel" \ -command "destroy .fv_imgsel" -font g_titleFont button .fv_imgsel.help -text "Help" \ -command "hhelp 3D-ImageDisplay" -font g_titleFont grid .fv_imgsel.label -column 0 -row 0 -columnspan 4 -sticky "snew" grid .fv_imgsel.sl -column 0 -row 1 grid .fv_imgsel.se -column 1 -row 1 grid .fv_imgsel.el -column 2 -row 1 grid .fv_imgsel.ee -column 3 -row 1 grid .fv_imgsel.anim -column 0 -row 2 grid .fv_imgsel.cancel -column 1 -row 2 grid .fv_imgsel.help -column 3 -row 2 } itcl::body Table::_createMovie { colIdx slice xSize ySize } { global powWCS powFitsHeader powFitsHeaderCnt powPlotParam global xCount yCount global powWCSName powWCSTranslation powWCSLabel powWCSList global useWCSInfo global g_backupDir if { [string first "ftp" $fileName] >= 0 } { set fileName [format "%s/%s/%s" $::env(HOME) $g_backupDir [file tail $fileName]] } regsub -all { } [urlTail $fileName] _ cleanFileName # set imgHandle ${cleanFileName}_[expr $currentHDU-1]_$_graphIDhighest set imgHandle ${cleanFileName}_[expr $currentHDU-1] if { [winfo exist .pow.pow]!=1 } { powInit .dummy } # open the fits file set fh [fits open $fileName 0] # move down on HDU to get to the really data $fh move +[expr ${_extNum} - 1] set x_label "X" set y_label "Y" set x_unit "pixel" set y_unit "pixel" if { $fvPref::ifWCSInfo } { set result [$fFile getHeader2String] set cntList($imgHandle) [$fFile getHeaderKeyWord [lindex $result 0] $imgHandle] set powFitsHeaderCnt($imgHandle) [lindex $cntList($imgHandle) 1] if { [lindex $cntList($imgHandle) 0] > 0 } { #set powFitsHeader($imgHandle) [$fFile assembleWcsHeader $imgHandle] set powFitsHeader($imgHandle) [lindex $result 0] set powWCSInfo($imgHandle,DEFAULT) $powWCS($imgHandle) set wcsinfo $powWCS($imgHandle) set x_label [lindex [lindex $wcsinfo 3] 0] set y_label [lindex [lindex $wcsinfo 3] 1] if { $x_unit=="pixels" } {set x_unit NULL} if { $y_unit=="pixels" } {set y_unit NULL} } else { set powFitsHeader($imgHandle) [$fFile assembleWcsHeader $imgHandle NOWCS] set powWCS($imgHandle) [$fFile getWcs] } } else { set powWCS($imgHandle) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set powFitsHeader($imgHandle) "" set powFitsHeaderCnt($imgHandle) 0 } set powWCSList($imgHandle) {} set powWCSList(${imgHandle}scope) {} set imgList {} for {set i [expr $_istart - 1]} {$i < $_iend} {incr i} { # fitsObj load arrayRow set alist [$fh load arrayRow $_tType($colIdx) $slice [expr $xSize * $ySize] NULL [expr $i * $xSize * $ySize + 1]] eval powCreateData ${imgHandle}_$i $alist if [info exists powWCS(${imgHandle}_$i)] { catch { unset powWCS(${imgHandle}_$i) } } set powFitsHeader(${imgHandle}_$i) $powFitsHeader($imgHandle) set powFitsHeaderCnt(${imgHandle}_$i) $powFitsHeaderCnt($imgHandle) catch { set powWCS(${imgHandle}_$i) $powWCS($imgHandle) } set powPlotParam(graphType,${imgHandle}_$i) \ [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(graphType,${imgHandle}_${i}scope) \ $powPlotParam(graphType,${imgHandle}_${i}) set powPlotParam(zoomed,${imgHandle}_${i}) 0 set powPlotParam(zoomed,${imgHandle}_${i}scope) 0 set xCount(${imgHandle}_$i) 0 set yCount(${imgHandle}_$i) 0 set xCount(${imgHandle}_${i}scope) 0 set yCount(${imgHandle}_${i}scope) 0 set powWCSName(${imgHandle}_$i) 0 set powWCSName(${imgHandle}_${i}scope) 0 set powWCSTranslation 0 catch { powCreateImage ${imgHandle}_$i ${imgHandle}_$i 0 0 $xSize $ySize 1 1 1 1 pixels pixels value } err if [info exists powWCSList(${imgHandle}_${i})] { foreach name [lindex $powWCSList(${imgHandle}_$i) 1] { $fFile assembleWcsLabel ${imgHandle}_$i $name } } else { set powWCSList(${imgHandle}_${i}) {} lappend powWCSList(${imgHandle}_${i}) 1 lappend powWCSList(${imgHandle}_${i}) {} } set powWCSList(${imgHandle}_${i}scope) $powWCSList(${imgHandle}_${i}) lappend imgList ${imgHandle}_$i set powWCSLabel(xlabel,${imgHandle}_$i,DEFAULT) $x_label set powWCSLabel(ylabel,${imgHandle}_$i,DEFAULT) $y_label set powWCSLabel(xunit,${imgHandle}_$i,DEFAULT) $x_unit set powWCSLabel(yunit,${imgHandle}_$i,DEFAULT) $y_unit lappend imgList ${imgHandle}_$i } set powPlotParam(graphType,$imgHandle) [string tolower [lindex [$fh info hdutype] 0]] set powPlotParam(graphType,${imgHandle}scope) $powPlotParam(graphType,$imgHandle) set powPlotParam(zoomed,$imgHandle) 0 set powPlotParam(zoomed,${imgHandle}scope) 0 set xCount($imgHandle) 0 set yCount($imgHandle) 0 set xCount(${imgHandle}scope) 0 set yCount(${imgHandle}scope) 0 powCreateGraph $imgHandle NULL $imgList $x_unit $y_unit \ $x_label $y_label [lindex $fvPref::graphDispSize 0] \ [lindex $fvPref::graphDispSize 1] if { [info exists xFactor] && [info exists yFactor] } { #powStretchGraph $imgHandle $xFactor $yFactor } catch {$fh close} err # incr _graphIDhighest powMovie after 1 powPlayMovie } itcl::body Table::_makeHistogram { {extNum_ {}} } { global g_histoParam global g_histoFileID global g_backupDir global g_fitsFileMode set oldMode $g_fitsFileMode # Set Read-Only flag set g_fitsFileMode 1 set fileName "" set fileName [file join $g_backupDir histo.tmp$g_histoFileID] if ![file exists $fileName] { # eval $fFile makeHistogram $g_histoParam } set foundFlag false set fftmp [openFitsFile $fileName] incr g_histoFileID $fftmp plotHisto $fftmp changeFile if { $extNum_ != "" } { $fftmp plotData $extNum_ } set g_fitsFileMode $oldMode } # called by FitsPlotSel::_plotCmd # any of the input axes (x, xe, y, ye) can also be expressions # not just a column name # itcl::body Table::_plotCols { xColumn_ xeColumn_ yColumn_ yeColumn_ {inCurrGraph_ 0} {whichRows_ "-"} {plotSelOnly_ 0}} { global powWCS powFitsHeader powFitsHeaderCnt global xFactor yFactor powPlotParam currimg global powPlotColumnDataName global xCount yCount global powWCSName powWCSTranslation powWCSLabel powWCSList global useWCSInfo set xColumn $xColumn_ set yColumn $yColumn_ set cbCurrgn 0 if { $_ftp != 0 } { set cbCurrgn [$_ftp returnAddMyCurve] } if { $whichRows_ == "" || $whichRows_ =="-" } { set whichRows_ "1-$_numRows" } if { $plotSelOnly_ == 1 } { set selrange "" set tmplist [split $whichRows_ ","] set numlist [llength $tmplist] for { set k 0 } {$k <$numlist } {incr k} { set start_end [lindex $tmplist $k] if { $selrange =="" } { append selrange [_parseToRowRange $start_end] } else { append selrange "," [_parseToRowRange $start_end] } } set whichRows_ $selrange } set inputXcolumn $xColumn_ set inputYcolumn $yColumn_ if { $fvPref::imgDisplayer == "DS9" } { # display is for DS9 # if { $xeColumn_ != "" || $yeColumn_ != "" } { # tk_messageBox -icon error -type ok \ # -message "ds9 can't display either X error and Y error, try POW instead." # return # } # remove constraint of using all CAPs for column name # set xColumn_ [string toupper $xColumn_ ] # set yColumn_ [string toupper $yColumn_ ] set colIdx -1 foreach name $_listPreSelectedColNames { if { [string first $name $xColumn_] >= 0 } { set colIdx [lsearch $_listPreSelectedColNames $name ] break } } if { $colIdx < 0 } { foreach name $_listPreSelectedColNames { if { [string first $name $yColumn_] >= 0 } { set colIdx [lsearch $_listPreSelectedColNames $name ] break } } } if { $colIdx < 0 } { # both xcolumn and ycoloumn are not in the _listPreSelectedColNames tk_messageBox -icon error -type ok \ -message "Please select one of the following:\n\n$_listPreSelectedColNames" return } #puts $whichRows_ set flag "NOT_YET" # set flag [_ds9MakePlot NONE 1 $_numRows $xColumn_ $yColumn_ $xeColumn_ $yeColumn_] set flag [_ds9MakePlot1 NONE $whichRows_ $xColumn_ $yColumn_ $xeColumn_ $yeColumn_ $inCurrGraph_] if { $flag == "DONE" } return } if { $whichRows_ == "-" } { set nRows $_numRows } else { set nRows [range count $whichRows_ $_numRows] } regsub -all { } [urlTail $fileName] _ cleanFileName set graphID table_${cleanFileName}_$_graphIDhighest # # Analyze the expressions # foreach axis [list x y xe ye] { set axisExpression [subst \$${axis}Column_] #puts "axisExpression: $axisExpression" # for example: set exprData(x,expr) $xColumn_ set exprData($axis,expr) $axisExpression if { $axisExpression == "" || $axisExpression == "NULL" } { # No expression supplied. OK for errorbars, not allowed for x/y if { $axis == "x" || $axis == "y" } { error "[string toupper $axis] axis is empty" } else { # empty errorbar set exprData($axis,nelem) 0 set exprData($axis,name1) "NULL" } } elseif { $axisExpression == "ElementNumber" } { # Have to delay data creation until we know how big # the other axes are set exprData($axis,nelem) 1 set exprData($axis,name1) "NULL" } else { # nelem value will be -1 for scalar constants set eData [_getDataForAxis $axis $axisExpression $whichRows_] foreach p [list ptr type len nelem dim] v $eData { set exprData($axis,$p) $v set $p $v } } } # # Create the vectors # set nelem [getmax $exprData(x,nelem) $exprData(y,nelem) \ $exprData(xe,nelem) $exprData(ye,nelem)] if { $nelem == 1 } { # All parameters are scalars set nelem $nRows } elseif { $nelem < 1 } { # All parameters are constants or blank, plot just solitary point set nelem 1 } foreach axis [list x y xe ye] { if { $exprData($axis,expr) == "ElementNumber" } { set exprData($axis,cnt) 1 set exprData($axis,name1) ${axis}1_v_$graphID set exprData($axis,len) $nelem powCreateVectorEN $exprData($axis,name1) ElementNumber_$graphID \ $nelem 1 1 NULL set powPlotColumnDataNameTmp 1_v_$graphID } elseif { $exprData($axis,nelem) == -1 } { set val [ptr2lst $exprData($axis,ptr) $exprData($axis,type) 1] set exprData($axis,cnt) 1 set exprData($axis,name1) ${axis}1_v_$graphID set exprData($axis,len) $nelem powCreateVectorEN $exprData($axis,name1) ${axis}_$graphID \ $nelem $val 0 NULL fits free $exprData($axis,ptr) set powPlotColumnDataNameTmp 1_v_$graphID } elseif { $exprData($axis,nelem) != 0 } { # Test for vector-length compatibility amongst axes #puts "exprData($axis,len): $exprData($axis,len)" if { $exprData($axis,nelem) != $nelem && \ ($exprData($axis,len) != $nelem || \ $exprData($axis,nelem) != 1) } { error "[string toupper $axis] axis data length is\ incompatible with other axes" } powCreateData ${axis}_$graphID $exprData($axis,ptr) \ $exprData($axis,type) $exprData($axis,len) -1 set powPlotColumnDataNameTmp _$graphID set cnt 0 set offset 0 while { $offset < $exprData($axis,len) } { incr cnt set exprData($axis,name$cnt) ${axis}${cnt}_v_$graphID powCreateVector $exprData($axis,name$cnt) ${axis}_$graphID \ $offset $nelem 1 incr offset $nelem } set exprData($axis,cnt) $cnt } else { set exprData($axis,cnt) 1 } } # get the x and y units set xUnit NULL set yUnit NULL if { $_tableType != "Vector Table"} { for {set i 0} {$i < $_dispCols} {incr i} { if { $_columnName($i) == $xColumn_} { set xUnit $_columnUnit($i) if {$xUnit == ""} {set xUnit NULL} } if { $_columnName($i) == $yColumn_} { set yUnit $_columnUnit($i) if {$yUnit == ""} {set yUnit NULL} } } } if { [string range $yColumn_ 0 0] == "\$" } { set yColumn_ [string range $yColumn_ 1 [expr [string length $yColumn_] - 2]] } if { [string range $xColumn_ 0 0] == "\$" } { set xColumn_ [string range $xColumn_ 1 [expr [string length $xColumn_] - 2]] } set gColumnName $yColumn_ set gWhichRows $whichRows_ set lWhichRows [split $gWhichRows ","] if { [llength $lWhichRows] > 1 } { set gWhichRows "" append gWhichRows [lindex $lWhichRows 0] # append gWhichRows "," # append gWhichRows [lindex $lWhichRows 1] append gWhichRows "..." } if { $whichRows_ == "" || $whichRows_ == "-" } { set graphHandle ${cleanFileName}_[expr $currentHDU-1]_$_graphIDhighest } else { foreach name $_listPreSelectedColNames { if { [string first $name $gColumnName] == 0 } { set gColumnName $name break } } set graphHandle [format "%s\(%s_%s)_%s" ${cleanFileName} $gColumnName $gWhichRows $_graphIDhighest] } regsub -all { } $graphHandle "" graphHandle set oldplot "" if { (![info exists currimg] || $currimg=="NULL" || $currimg=="") && $cbCurrgn == 0 } { if { $_neverAskFlagValue == "false" } { _determineOverWriteFlag if { $_opCancel == "true" } return } # the graph is not already on .pow.pow, if _overWriteImage is yes, then delete the previous # selected image. if { $_overWriteImage == "yes" } { if { [powGetCurrentGraph] != "powDef" } { set currplot [powGetCurrentGraph] set oldplot $currplot set xo $powPlotParam(xo,$currplot) set yo $powPlotParam(yo,$currplot) } } } if { [winfo exist .pow.pow]!=1 } { powInit .dummy } set powWCSLabel(xlabel,$graphHandle,DEFAULT) $xColumn_ set powWCSLabel(ylabel,$graphHandle,DEFAULT) $yColumn_ set powWCSLabel(xunit,$graphHandle,DEFAULT) $xUnit set powWCSLabel(yunit,$graphHandle,DEFAULT) $yUnit # get the wcs info if it exists set useWCSInfo(${graphHandle}scope) $fvPref::ifWCSInfo set useWCSInfo($graphHandle) $fvPref::ifWCSInfo if { $_tableType != "Vector Table" && $fvPref::ifWCSInfo } { # Get the WCS info (if needed) and pass them to pow set RAColNum [lsearch $_listColNames $xColumn_] set DecColNum [lsearch $_listColNames $yColumn_] if { ($RAColNum != -1) && ($DecColNum != -1) } { incr RAColNum incr DecColNum # for now, wcsinfo at plot is set to none set wcsinfo [$fFile getWcs {} $RAColNum $DecColNum] if { [lindex $wcsinfo 4] != "none" } { set testCnt 0 foreach item [lindex $wcsinfo 4] { if { [llength $item] == 0 } { incr testCnt } } if { $testCnt != [llength [lindex $wcsinfo 4]] } { set xColumn_ [lindex [lindex $wcsinfo 3] 0] set yColumn_ [lindex [lindex $wcsinfo 3] 1] set xUnit "NULL" set yUnit "NULL" set powWCSLabel(xlabel,$graphHandle,DEFAULT) $xColumn_ set powWCSLabel(ylabel,$graphHandle,DEFAULT) $yColumn_ set powWCSLabel(xunit,$graphHandle,DEFAULT) $xUnit set powWCSLabel(yunit,$graphHandle,DEFAULT) $yUnit } } } } foreach axis [list x y xe ye] { set ${axis}i 1 set looping($axis) 1 } set curves "" set cnt 0 set powWCSName($graphHandle) 0 while { $looping(x) || $looping(y) || $looping(xe) || $looping(ye) } { incr cnt set curveName c${cnt}_$graphHandle set powWCSName($curveName) 0 set powWCSName(${curveName}scope) 0 set useWCSInfo($curveName) $fvPref::ifWCSInfo set useWCSInfo(${curveName}scope) $fvPref::ifWCSInfo if { [info exists wcsinfo] && $wcsinfo!="" } { set result [$fFile getDummyHeader2String {} $RAColNum $DecColNum] set powFitsHeader($curveName) [lindex $result 0] set powWCS($curveName) [lindex $result 2] set powWCSInfo($curveName,DEFAULT) $powWCS($curveName) set cntList($curveName) [$fFile getHeaderKeyWord [lindex $result 0] $curveName] set powFitsHeaderCnt($curveName) [lindex $cntList($curveName) 1] set wcsinfo $powWCS($curveName) } else { set useWCSInfo($curveName) 0 set useWCSInfo(${curveName}scope) 0 set powWCS($curveName) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set powFitsHeader($curveName) "" set powFitsHeaderCnt($curveName) 0 } set powPlotParam(wcsName,$curveName) "WCS" set powPlotParam(graphType,$curveName) [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(zoomed,$curveName) 0 set powPlotColumnDataName($curveName) $powPlotColumnDataNameTmp set xCount($curveName) 0 set yCount($curveName) 0 set powPlotParam(wcsName,$curveName) "WCS" powCreateCurve $curveName $exprData(x,name$xi) $exprData(xe,name$xei) \ $exprData(y,name$yi) $exprData(ye,name$yei) if [info exists powWCSList($curveName)] { foreach name [lindex $powWCSList($curveName) 1] { $fFile assembleWcsLabel $curveName $name } } else { set powWCSList($curveName) {} lappend powWCSList($curveName) 1 lappend powWCSList($curveName) {} } set powWCSList(${curveName}scope) $powWCSList(${curveName}) lappend curves $curveName foreach axis [list x y xe ye] { incr ${axis}i if { [subst \$${axis}i] > $exprData($axis,cnt) } { set ${axis}i 1 set looping($axis) 0 } } } set realGraphHandle $graphHandle # wcslist can be obtained from any one slice if [info exists powWCSList($curveName)] { set powWCSList($graphHandle) $powWCSList($curveName) set powWCSList(${graphHandle}scope) $powWCSList($curveName) foreach name [lindex $powWCSList($graphHandle) 1] { $fFile assembleWcsLabel $graphHandle $name } } else { set powWCSList($graphHandle) {} lappend powWCSList($graphHandle) 1 lappend powWCSList($graphHandle) {} } set powWCSList(${graphHandle}scope) $powWCSList($graphHandle) set powWCSName(${graphHandle}scope) 0 set powPlotParam(wcsName,$graphHandle) "WCS" set powWCS($graphHandle) $powWCS(c1_$graphHandle) set powWCS(${graphHandle}scope) $powWCS(c1_$graphHandle) set powFitsHeader($graphHandle) $powFitsHeader(c1_$graphHandle) set powFitsHeaderCnt($graphHandle) $powFitsHeaderCnt(c1_$graphHandle) set powFitsHeader(${graphHandle}scope) $powFitsHeader(c1_$graphHandle) set powFitsHeaderCnt(${graphHandle}scope) $powFitsHeaderCnt(c1_$graphHandle) set powPlotColumnDataName($graphHandle) $powPlotColumnDataName(c1_$graphHandle) set powPlotParam(graphType,$graphHandle) [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(graphType,${graphHandle}scope) $powPlotParam(graphType,$graphHandle) set powPlotParam(zoomed,$graphHandle) 0 set powPlotParam(zoomed,${graphHandle}scope) 0 set xCount($graphHandle) 0 set yCount($graphHandle) 0 set xCount(${graphHandle}scope) 0 set yCount(${graphHandle}scope) 0 if { $inCurrGraph_ && [powGetCurrentGraph]!="" } { powAddCurves [powGetCurrentGraph] $curves } else { if { $powFitsHeader($graphHandle) == "" } { set useWCSInfo($graphHandle) 0 set useWCSInfo(${graphHandle}scope) 0 } set errorFlag [ catch { powCreateGraph $graphHandle $curves NULL $xUnit $yUnit \ $xColumn_ $yColumn_ \ [lindex $fvPref::graphDispSize 0] [lindex $fvPref::graphDispSize 1] } err] if { $errorFlag } { catch { powDeleteGraph $graphHandle NOPROMPT powDeleteImage $graphHandle $graphHandle powDeleteCurve $graphHandle curve } set wcsinfo "" set powWCS($curveName) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set powFitsHeader($curveName) "" set powFitsHeaderCnt($curveName) 0 set powWCS($graphHandle) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set powWCS(${graphHandle}scope) $powWCS($curveName) set powFitsHeader($graphHandle) $powFitsHeader($curveName) set powFitsHeaderCnt($graphHandle) $powFitsHeaderCnt($curveName) set powFitsHeader(${graphHandle}scope) $powFitsHeader($curveName) set powFitsHeaderCnt(${graphHandle}scope) $powFitsHeaderCnt($curveName) set powPlotParam(FixedAspect,$graphHandle) "no" set xCount($graphHandle) 0 set yCount($graphHandle) 0 set xCount(${graphHandle}scope) 0 set yCount(${graphHandle}scope) 0 set errorFlag [ catch { powCreateGraph $graphHandle $curves NULL $xUnit $yUnit \ $xColumn $yColumn \ [lindex $fvPref::graphDispSize 0] [lindex $fvPref::graphDispSize 1] } err ] if { $errorFlag } { tk_messageBox -icon error -type ok -message "Can't plot graph" return } } } if { $xColumn_ == "ElementNumber" || $yColumn_ == "ElementNumber" || $xColumn_ == "RowNumber" || $yColumn_ == "RowNumber" } { powSetCurveOptions $graphHandle $curves pDisp No lDisp Yes } else { #puts "exprData(x,name1): $exprData(x,name1)" #puts "exprData(y,name1): $exprData(y,name1)" # we need to determine if xColumn_ or yColumn_ increased monotonic set key [$fFile getKeyword NAXIS2] set value "[string trim [lindex [lindex $key 0] 1] {' ()}]" regsub -all {[a-zA-Z]} $value {} lRow #puts "value: $value" # set lRow [string range $value 0 [expr [string length $value] - 2]] # set lRow $value set checkFlag PASSED set range "1-$lRow" #puts "_listPreSelectedColNames: $_listPreSelectedColNames" foreach name $_listPreSelectedColNames { if { [string first $name $inputXcolumn] >= 0 } { # if { $name != $inputXcolumn} { # set checkFlag FAILED # } set searchX $name } if { [string first $name $inputYcolumn] >= 0 } { # if { $name != $inputYcolumn} { # set checkFlag FAILED # } set searchY $name } } if [info exists searchX] { set dataX [$fFile getVectorTableAsRawList $searchX 1 $range] set dataY [$fFile getVectorTableAsRawList $searchY 1 $range] # first step, compare the first two elements foreach dataList [list $dataX $dataY] { if { $checkFlag == "FAILED" } break set tokens [split $dataList " "] set direction up set previousValue -99 if { [lindex $tokens 0] > [lindex $tokens 1] } { set direction down set previousValue 9999999 } set i 1 foreach value $tokens { incr i if { $direction == "down" && $value > $previousValue } { set checkFlag FAILED break } if { $direction == "up" && $value < $previousValue } { set checkFlag FAILED break } set previousValue $value } if { $checkFlag == "PASSED" } break } } if { $checkFlag == "FAILED" } { powSetCurveOptions $realGraphHandle $curves pDisp Yes lDisp No } else { if { $xeColumn_ != "" || $yeColumn_ != "" } { powSetCurveOptions $realGraphHandle $curves pDisp Yes lDisp No } else { powSetCurveOptions $realGraphHandle $curves pDisp No lDisp Yes } } } if [info exist xo] { powMoveGraphTo $graphHandle $xo $yo .pow.pow foreach el [list xo yo graphWidth graphHeight xmagstep ymagstep] { unset powPlotParam($el,$oldplot) } powDeleteGraph $oldplot NOPROMPT powDeleteImage $oldplot $oldplot powDeleteCurve $oldplot curve # set _graphIDhighest [expr $_graphIDhighest - 1] powReconfigureToplevel 1 } if { [info exists xFactor] && [info exists yFactor] } { #powStretchGraph $graphHandle $xFactor $yFactor } incr _graphIDhighest } itcl::body Table::_relocateDividLine {x_ index_ } { # note index_ is not used, but I don't know why --Han set dx [expr $x_ - $_startX] set _startX $x_ $_droot.table.can move tmpLine $dx 0 } itcl::body Table::_startDividLine {x_ index_ } { # note index_ is not used, but I don't know why --Han if { $x_ > $_endX } { set _endX $x_ } $_droot.table.can create line $x_ 0 $x_ $_DC(ysize) \ -width 4 -fill red -tag tmpLine set _startX $x_ } itcl::body Table::_finalDividLine {x_ index_} { # note index_ *is* used in this method #puts "finalDividLine start" global g_charPix $_droot.table.can delete tmpLine set dx [expr $x_ - $_xPos($index_)] if { $index_ == 0} { set moveX $dx set _DC(width) [expr $_DC(width)+$dx] $_droot.table.can move check [expr $moveX/2] 0 $_droot.table.can itemconfigure check -width $_DC(width) # _DC(width) is an important param. it will effect several other things. # Need to do extra here _calAbsXPos _calXPos $_firstCol $_showCols _getLastFirstCol } else { set prIndex [expr $index_ -1 ] set dx1 [expr $x_ - $_xPos($prIndex)] set prAbsIndex [expr $prIndex + $_firstCol -1 ] if { [expr abs($dx)] < $g_charPix} return if { $x_ < $_xPos($prIndex) } return set tmp $_cellPixWidth($prAbsIndex) set _cellWidth($prAbsIndex) [expr $dx1/$g_charPix ] _calAbsXPos set moveX [expr $_cellPixWidth($prAbsIndex) -$tmp] _calXPos $_firstCol $_showCols _getLastFirstCol $_droot.table.hdr itemconfigure tempColData_$prIndex \ -width $_cellPixWidth($prAbsIndex) $_droot.table.can itemconfigure entry_$prIndex \ -width $_cellPixWidth($prAbsIndex) $_droot.table.can move entry_$prIndex [expr $moveX/2] 0 if [winfo exists $_droot.table.can.tdim${prIndex}_0] { $_droot.table.can itemconfigure tdim_$prIndex \ -width $_cellPixWidth($prAbsIndex) $_droot.table.can move tdim_$prIndex [expr $moveX/2] 0 } $_droot.table.hdr move tempColData_$prIndex [expr $moveX/2] 0 } for {set i $index_} {$i <= $_showCols} {incr i} { $_droot.table.can move colLine_$i $moveX 0 $_droot.table.can move entry_$i $moveX 0 if [winfo exists $_droot.table.can.tdim${i}_0] { $_droot.table.can move tdim_$i $moveX 0 } $_droot.table.hdr move tempColData_$i $moveX 0 } _setHScroll [expr $_firstCol-1] set _endX 0 _reframe } itcl::body Table::_calXPos {fCol_ nCols_} { #puts "_calXPos start" set errExt [ catch {set key [$fFile getKeyword EXTNAME ]} ] if { $errExt == 0 && [string first "GROUPING" $key] >= 0 } { set errExt true } if { $errExt == "true" } { set _xPos(0) [expr [expr $_DC(lmar) + $_DC(width) + \ $_DC(rightspace)] * 2 + $_DC(width)/4] } else { set _xPos(0) [expr $_DC(lmar) + $_DC(width) + $_DC(rightspace)] } set tmpPos $_absXPos([expr $fCol_-1]) for {set i 0} {$i < $nCols_} {incr i} { set colIndex [expr $fCol_+$i] set _xPos([expr $i+1]) [expr $_absXPos($colIndex)-$tmpPos+$_xPos(0)] } } itcl::body Table::_colMenu { hdr i colName colNum } { catch { destroy $_droot.table.hdr.menu$i.menu } catch { destroy $_droot.table.hdr.menu$i.viewcolmenu } catch { destroy $_droot.table.hdr.menu$i.sort } if { [catch {$hdr.menu$i configure -text "Modify" -menu $hdr.menu$i.menu}] } { menubutton $hdr.menu$i -text "Modify" \ -relief raised -font g_titleFont -menu $hdr.menu$i.menu } menu $hdr.menu$i.menu -tearoff False $hdr.menu$i.menu add cascade -label "Sort" \ -menu $hdr.menu$i.menu.sort \ -underline 0 -font g_titleFont menu $hdr.menu$i.menu.sort -tearoff False $hdr.menu$i.menu.sort add command -label "Ascending" \ -underline 0 -command [itcl::code $this doSort $colName 1 0 ] \ -font g_titleFont $hdr.menu$i.menu.sort add command -label "Descending" \ -underline 0 -command [itcl::code $this doSort $colName 0 0 ] \ -font g_titleFont menu $hdr.menu$i.menu.showcol -tearoff False set ct 0 set columnbreak 0 foreach name $_unViewedColNames { $hdr.menu$i.menu.showcol add command -columnbreak $columnbreak \ -label "$name" -underline 0 -font g_titleFont \ -command [itcl::code $this _addColView $name $colName "after"] set columnbreak 0 incr ct if { $ct >= 20 } { set columnbreak 1 set ct 0 } } menu $hdr.menu$i.menu.jumpto -tearoff False $hdr.menu$i.menu.jumpto add command \ -label "Beginning of Table" -underline 0 -font g_titleFont \ -command [itcl::code $this _jumpTo 0] set ct 0 set columnbreak 0 set _otherColNameList {} foreach name $_listPreSelectedColNames { if { $name != $colName } { lappend _otherColNameList $name } } foreach name $_otherColNameList { $hdr.menu$i.menu.jumpto add command -columnbreak $columnbreak \ -label "$name" -underline 0 -font g_titleFont \ -command [itcl::code $this _jumpTo $name] set columnbreak 0 incr ct if { $ct >= 20 } { set columnbreak 1 set ct 0 } } $hdr.menu$i.menu.jumpto add command \ -label "End of Table" -underline 0 -font g_titleFont \ -command [itcl::code $this _jumpTo "end"] $hdr.menu$i.menu add cascade \ -label "Jump To Column.." -underline 0 -font g_titleFont \ -menu $hdr.menu$i.menu.jumpto if { [llength $_listPreSelectedColNames] <= 1 } { $hdr.menu$i.menu entryconfigure 2 -state disabled } menu $hdr.menu$i.menu.movebefore -tearoff False set ct 0 set columnbreak 0 set _otherColNameList {} foreach name $_listPreSelectedColNames { if { $name != $colName } { lappend _otherColNameList $name } } foreach name $_otherColNameList { $hdr.menu$i.menu.movebefore add command -columnbreak $columnbreak \ -label "$name" -underline 0 -font g_titleFont \ -command [itcl::code $this _moveColView $colName $name before] set columnbreak 0 incr ct if { $ct >= 20 } { set columnbreak 1 set ct 0 } } $hdr.menu$i.menu.movebefore add command \ -label "End of Table" -underline 0 -font g_titleFont \ -command [itcl::code $this _moveColView $colName "END" after] $hdr.menu$i.menu add cascade \ -label "Move Before.." -underline 0 -font g_titleFont \ -menu $hdr.menu$i.menu.movebefore $hdr.menu$i.menu add cascade \ -label "Show Column... " -underline 0 -font g_titleFont \ -menu $hdr.menu$i.menu.showcol if { [llength $_unViewedColNames] <= 0 } { $hdr.menu$i.menu entryconfigure 3 -state disabled } $hdr.menu$i.menu add command -label "Hide Column" \ -underline 0 -command [itcl::code $this _delColView $colName ] \ -font g_titleFont if { [llength $_listPreSelectedColNames] <= 1 } { $hdr.menu$i.menu entryconfigure 4 -state disabled } $hdr.menu$i.menu add command -label "Insert New Column..." \ -underline 0 -font g_titleFont \ -command [itcl::code $this _addCols [expr $i + 1]] $hdr.menu$i.menu add command -label "Delete..." \ -underline 0 -command [itcl::code $this _tryDelCols $colName ] \ -font g_titleFont $hdr.menu$i.menu add command -label "Parameters..." \ -underline 0 -command [itcl::code $this _editColParamsWindow $colNum ] \ -font g_titleFont } itcl::body Table::_moveColView { colName targetName option } { _delColView $colName _addColView $colName $targetName $option } itcl::body Table::_updateUnViewedColumns {} { set _unViewedColNames {} if { [catch { set tmplist $_listColNames }] == 0 } { foreach name $_listColNames { set tmpPos [lsearch -exact $_listPreSelectedColNames $name] if { $tmpPos == -1 } { lappend _unViewedColNames $name } } } } itcl::body Table::_drawTableFrame {} { global g_titleFont set hdr $_droot.table.hdr set can $_droot.table.can set _expandFlag false # calculate the _xPos _calXPos $_firstCol $_showCols #puts "tableType: $_tableType" #puts "showCols: $_showCols" set deleteFlag false if { ($_tableType == "Image") || ($_tableType == "Vector Table") } { for {set i 0} {$i < $_showCols } {incr i} { set tmpColName [lindex $_listPreSelectedColNames [expr $_firstCol-1+$i]] set tmpColNum [expr $_firstCol-1+$i] set tmpColWid($i) $_cellPixWidth($tmpColNum) set tmpColXPos($i) [expr $_xPos($i) + $_cellPixWidth($tmpColNum)/2 ] if [winfo exists $hdr.name$i] { destroy $hdr.name$i set deleteFlag true } checkbutton $hdr.name$i -text $tmpColName -font g_titleFont \ -variable [itcl::scope _colSel($this,$i)] \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black -activebackground $fvPref::globalBgColor \ -command [itcl::code $this _updateColSel $i] $hdr create window $tmpColXPos($i) \ [expr $_DC(height)/2] -width $_cellPixWidth($i) \ -window $hdr.name$i -tags tempColData_$i } # presumably more standard "Table" tables } else { set _fitsFileLocationCol [lsearch -exact $_listPreSelectedColNames "MEMBER_LOCATION"] _updateUnViewedColumns for {set i 0} {$i < $_showCols} {incr i} { set tmpColNum [expr $_firstCol-1+$i] set tmpColName [lindex $_listPreSelectedColNames $tmpColNum ] set tmpColXPos($i) [expr $_xPos($i) + $_cellPixWidth($tmpColNum)/2 ] set tmpColWid($i) $_cellPixWidth($tmpColNum) if [winfo exists $hdr.name$i] { catch { destroy $hdr.name$i } catch { destroy $hdr.type$i } catch { destroy $hdr.unit$i } catch { destroy $hdr.vecB$i } catch { destroy $hdr.menu$i } set deleteFlag true } checkbutton $hdr.name$i -text $_columnName($tmpColNum) \ -font g_titleFont -variable [itcl::scope _colSel($this,$i)] \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black -activebackground $fvPref::globalBgColor \ -command [itcl::code $this _updateColSel $i] label $hdr.type$i -text $_columnType($tmpColNum) \ -font g_titleFont label $hdr.unit$i -text $_columnUnit($tmpColNum) \ -font g_titleFont # Create column header menu _colMenu $hdr $i $tmpColName $tmpColNum if { $_columnVecSize($tmpColNum) > 1 || $_columnVecSize($tmpColNum) < 0 } { $hdr.menu$i.menu insert 0 command \ -label "Expand" -underline 0 -font g_titleFont \ -command [itcl::code $this _openVectorTable $tmpColNum] set _expandFlag true } $hdr create window $tmpColXPos($i) [expr $_DC(height)/2] \ -width $tmpColWid($i) \ -window $hdr.name$i -tags tempColData_$i $hdr create window $tmpColXPos($i) [expr $_DC(height)*3/2] \ -width $tmpColWid($i) \ -window $hdr.type$i -tags tempColData_$i $hdr create window $tmpColXPos($i) [expr $_DC(height)*5/2] \ -width $tmpColWid($i) \ -window $hdr.unit$i -tags tempColData_$i # CM Begin $hdr create window $tmpColXPos($i) [expr $_DC(height)*7/2] \ -width $tmpColWid($i) \ -window $hdr.menu$i -tags tempColData_$i # CM End # $hdr create window $tmpColXPos($i) [expr $_DC(height)*9/2] \ # -width $tmpColWid($i) \ # -window $hdr.vecB$i -tags tempColData_$i } } set _yPos(0) $_DC(tmar) # Ziqin # _updateNumRows _initSelRows if { $deleteFlag == "true" } { catch { destroy $hdr.lselAll } catch { destroy $hdr.selAll } catch { destroy $hdr.selInvert } } label $hdr.lselAll -text "Select" \ -font g_titleFont $hdr create window [expr $_DC(lmar)+25+[$hdr.lselAll cget -width]/2] [expr $_DC(height)*3/2] \ -width [expr [$hdr.lselAll cget -width]] -height [expr $_DC(height)-1] \ -window $hdr.lselAll -tags check checkbutton $hdr.selAll -text "All" \ -font g_titleFont \ -variable [itcl::scope _selectAllRows ] \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black -activebackground $fvPref::globalBgColor \ -command [itcl::code $this _selAllRows ] button $hdr.selInvert -text "Invert" \ -font g_titleFont \ -justify left \ -activeforeground black -activebackground $fvPref::globalBgColor \ -command [itcl::code $this _selInvert ] $hdr create window [expr $_DC(lmar)+25+[$hdr.selAll cget -width]/2] \ [expr $_DC(height)*5/2] -window $hdr.selAll \ -width [expr [$hdr.selAll cget -width]] -height [expr $_DC(height)-1] \ -tags check $hdr create window [expr $_DC(lmar)+25+[$hdr.selInvert cget -width]/2] \ [expr $_DC(height)*7/2] -window $hdr.selInvert \ -width [expr [$hdr.selInvert cget -width]] -height [expr $_DC(height)-1] \ -tags check set indexwidth 56 # puts $indexwidth # if { $indexwidth < $_DC(width) } { # set indexwidth $_DC(width) # } # puts $_DC(width) # # -width [expr $_DC(width)*2] -height [expr $_DC(height)-1] # $hdr create window [expr $_DC(lmar)+$_DC(width)] for {set j 0} {$j < $_showRows} {incr j} { set realRowNum [expr $_firstRow+$j] if { $_tableType == "Image"} { set rowIndex [expr $_numRows - $realRowNum+1] } else { set rowIndex $realRowNum } if { $deleteFlag == "true" } { catch { destroy $can.b$j } } label $can.b$j -text $rowIndex -font g_titleFont # Modify by Ziqin Pan , Jan 2004 bind $can.b$j [itcl::code $this _setRowStartMark $j] bind $can.b$j [itcl::code $this _setRowEndMark $j] bind $can.b$j [itcl::code $this _setRowEndMark $j] bind $can.b$j [itcl::code $this _unsetRowMark ] # Modify end set _yPos([expr $j+1]) [expr $_DC(tmar) + ($j+1)*($_DC(height) + $_DC(interline))] $can create window [expr $_DC(lmar)+$_DC(width)/2] \ [expr $_yPos($j)+$_DC(height)/2] -window $can.b$j \ -width $_DC(width) -height [expr $_DC(height)-1] \ -tags check # $can create window [expr $_DC(lmar)+$indexwidth/2] \ # [expr $_yPos($j)+$_DC(height)/2] -window $can.b$j \ # -width $indexwidth -height [expr $_DC(height)-1] \ # -tags check if { [catch {set key [$fFile getKeyword EXTNAME]}] == 0 } { if { [string first "GROUPING" $key] >= 0 } { if { $deleteFlag == "true" } { catch { destroy $can.button$realRowNum } } button $can.button$realRowNum -text "Open" \ -font [list Helvetica 10 bold] \ -command [itcl::code $this _openGroupFile $_fitsFileLocationCol $realRowNum] # create consistence OPEN button $can create window [expr $_DC(width)*2+$_DC(lmar)-10] \ [expr $_yPos($j)+$_DC(height)/2] \ -window $can.button$realRowNum \ -height [expr $_DC(height)-5] \ -tags open_$j } } } # set the row divide line size set _DC(xsize) [expr $_DC(xsize) + $_DC(width) + $_DC(lmar) + 12 ] set tmpHeight [expr $_DC(height) -1] for {set j 0} {$j < $_showRows } {incr j} { set tmpColYPos($j) [expr $_yPos($j)+$_DC(height)/2] for {set i 0} {$i < $_showCols} {incr i} { set id ${i}_$j if { $deleteFlag == "true" } { catch { destroy $can.e$id } } entry $can.e$id -width $_cellWidth($i) -state disabled \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -textvariable [itcl::scope _numEntry($id)] \ -relief sunken -bd 0 -justify right -font g_entryFont # -textvariable [itcl::scope _numEntry($id)] \ #hello bind $can.e$id [itcl::code $this _setStartMark $i $j] bind $can.e$id [itcl::code $this _setEndMark $i $j] bind $can.e$id [itcl::code $this _setEndMark $i $j] bind $can.e$id [itcl::code $this _unsetMark ] set _buttonWidth 0 if { $_valueTDIM($i) > 0 } { set slice $j #puts "_valueTDIM($i) = $_valueTDIM($i)" if { $deleteFlag == "true" } { catch { destroy $can.tdim$id } } switch $_valueTDIM($i) { 1 { button $can.tdim$id -text "Plot" \ -font [list Helvetica 10] \ -command [itcl::code $this _plotVectorTableRow $i $slice] } 2 { button $can.tdim$id -text "Image" \ -font [list Helvetica 10] \ -command [itcl::code $this _displaySlice $i $slice] } 3 { button $can.tdim$id -text "Movie" \ -font [list Helvetica 10] \ -command [itcl::code $this _displayMovie $i $slice] } default { button $can.tdim$id -text "Expand" \ -font [list Helvetica 10] \ -command [itcl::code $this _openVectorTable $i] } } set _buttonWidth [winfo reqwidth $can.tdim$id] $can create window $tmpColXPos($i) $tmpColYPos($j) \ -window $can.tdim$id \ -width $tmpColWid($i) \ -height $tmpHeight \ -tag tdim_$i } $can create window $tmpColXPos($i) $tmpColYPos($j) \ -height $tmpHeight \ -width $tmpColWid($i) \ -window $can.e$id -tags entry_$i set _xPos([expr $i + 1]) $tmpColXPos($i) } } _reframe } itcl::body Table::_redrawTable {prevCols_} { _calXPos $_firstCol $_showCols # Reposition/Resize the header/cells set minCols [getmin [list $prevCols_ $_showCols]] set idx [expr $_firstCol-1] for {set i 0} {$i < $minCols } {incr i; incr idx} { foreach {oldx oldy} [$_droot.table.can coord entry_$i] {} set entryExist true if ![info exist oldx] { set entryExist false foreach {oldx oldy} [$_droot.table.hdr coord tempColData_$i] {} } set dx [expr $_xPos($i)+$_cellPixWidth($idx)/2 - $oldx] if { $entryExist == "false" } { unset oldx } $_droot.table.can move entry_$i $dx 0 if [winfo exists $_droot.table.can.tdim${i}_0] { $_droot.table.can move tdim_$i $dx 0 } $_droot.table.hdr move tempColData_$i $dx 0 $_droot.table.can itemconfigure entry_$i -width $_cellPixWidth($idx) if [winfo exists $_droot.table.can.tdim${i}_0] { $_droot.table.can itemconfigure tdim_$i -width $_cellPixWidth($idx) } $_droot.table.hdr itemconfigure tempColData_$i -width $_cellPixWidth($idx) } # Reposition the last lines for {set i 0} {$i <= $minCols } {incr i} { foreach {oldx oldy} [$_droot.table.can coord colLine_$i] {} set dx [expr $_xPos($i)-$_DC(rightspace)/2-1 - $oldx] $_droot.table.can move colLine_$i $dx 0 $_droot.table.can raise colLine_$i } # Do we need to add/delete any columns? if { $prevCols_ > $_showCols } { _delColsFrTable $prevCols_ $_showRows } elseif { $prevCols_ < $_showCols} { _addColsToTable $prevCols_ $_showRows } } itcl::body Table::_setVScroll {args} { #puts "_setVScroll start" set old_firstRow $_firstRow # unselected the previously selected cell _unselCell # if { [llength $args]==1 } { set _firstRow [expr $args+1] } else { set stype [lindex $args 2] set snum [lindex $args 1] if {$snum == ""} return if { [string match "page*" $stype] } { set tmpjump [expr $snum*$_showRows] } elseif { [string match "unit*" $stype] } { set tmpjump $snum } elseif { $stype == ""} { set tmpjump [expr 1+round($snum*$_numRows)-$_firstRow] } else { error "unknown scroll command $stype" return } set _firstRow [expr $_firstRow+$tmpjump] } if {$_firstRow < 1} { set _firstRow 1 } if {$_firstRow > [expr $_numRows-$_showRows+1] } { set _firstRow [expr $_numRows-$_showRows+1] } _updateLast _refacing # reselect cell _selCell _showselRows # Check for locked children _scrollChildren $_firstRow } itcl::body Table::_refacing {} { #puts "_refacing start" if { $_numRows } { $_droot.table.vscroll set [expr double($_firstRow-1)/$_numRows] \ [expr double($_firstRow + $_showRows - 1)/$_numRows] } else { $_droot.table.vscroll set 0.0 1.0 } for {set j 0} {$j < $_showRows} {incr j} { if { $_tableType == "Image" } { set rowIndex [expr $_numRows - ($_firstRow+$j) +1] } else { set rowIndex [expr $j+$_firstRow] } $_droot.table.can.b$j configure -text $rowIndex # Add by Ziqin Pan , Aug 03, 2005 bind $_droot.table.can.b$j [itcl::code $this _setRowStartMark $j] bind $_droot.table.can.b$j [itcl::code $this _setRowEndMark $j] bind $_droot.table.can.b$j [itcl::code $this _setRowEndMark $j] bind $_droot.table.can.b$j [itcl::code $this _unsetRowMark ] # Add end } } itcl::body Table::_setScrolls {} { #puts "_setScrolls start" #horizontal if { $_listPreSelectedColNames == "" } { $_droot.table.hscroll set 0.0 1.0 } else { $_droot.table.hscroll set [expr ($_firstCol-1.0)/[llength $_listPreSelectedColNames] ] \ [expr ($_firstCol+$_showCols-1.0)/[llength $_listPreSelectedColNames]] } #vertical is set in _refacing } itcl::body Table::_setHScroll {args} { #puts _setHScroll set _old_firstCol $_firstCol set oldShowCols $_showCols set oldShowRows $_showRows # unselected the cell _unselCell if { [llength $args]==1 } { set _firstCol [expr $args+1] } else { set stype [lindex $args 2] set snum [lindex $args 1] if {$snum == ""} return if { [string match "page*" $stype] } { set tmpjump [expr $snum*$_showCols] } elseif { [string match "unit*" $stype] } { set tmpjump $snum } elseif { $stype == ""} { set tmpjump [expr 1+round($snum*[llength $_listPreSelectedColNames])-$_firstCol] } else { error "unknown scroll command $stype" return } set _firstCol [expr $_firstCol+$tmpjump] } if {$_firstCol < 1} { set _firstCol 1 } elseif {$_firstCol > $_lastFirstCol } { set _firstCol $_lastFirstCol } # determine how many cols and rows to display _getXYSize $_DC(xsize) $_DC(ysize) if { [expr $_firstCol+$_showCols-1] > $_dispCols } { set $_firstCol $_old_firstCol return } _redrawTable $oldShowCols # update the table entries _updateLast _updateUnViewedColumns if { ($_tableType == "Image") || ($_tableType == "Vector Table")} { for {set i 0} {$i < $_showCols} {incr i} { set tmpColNum [expr $_firstCol+$i-1] set [itcl::scope _colSel($this,$i)] $_colNotchedState($tmpColNum) set tmpColName [lindex $_listPreSelectedColNames [expr $i+$_firstCol-1]] $_droot.table.hdr.name$i configure \ -text $tmpColName -command [itcl::code $this _updateColSel $i] } } else { for {set i 0} {$i < $_showCols} {incr i} { set tmpColName [lindex $_listPreSelectedColNames [expr $i+$_firstCol-1]] set tmpColNum [expr $_firstCol+$i-1] set [itcl::scope _colSel($this,$i)] $_colNotchedState($tmpColNum) $_droot.table.hdr.name$i configure \ -text $_columnName($tmpColNum) -command [itcl::code $this _updateColSel $i] $_droot.table.hdr.type$i configure \ -text $_columnType($tmpColNum) $_droot.table.hdr.unit$i configure \ -text $_columnUnit($tmpColNum) # CM Begin _colMenu $_droot.table.hdr $i $tmpColName $tmpColNum if { $_columnVecSize($tmpColNum) > 1 || $_columnVecSize($tmpColNum) < 0 } { $_droot.table.hdr.menu$i.menu insert 0 command \ -label "Expand" -underline 0 -font g_titleFont \ -command [itcl::code $this _openVectorTable $tmpColNum] } } } # reselected the previously selected cell _selCell _showselRows # if { $_listPreSelectedColNames=="" } { $_droot.table.hscroll set 0.0 1.0 } else { $_droot.table.hscroll set [expr ($_firstCol-1.0)/[llength $_listPreSelectedColNames] ] \ [expr ($_firstCol+$_showCols-1.0)/[llength $_listPreSelectedColNames]] } # justify _makeJustification set _endX 0 _reframe } itcl::body Table::_addColsToTable {prevCols_ prevRows_} { set hdr $_droot.table.hdr set can $_droot.table.can _calXPos $_firstCol $_showCols if { ($_tableType == "Image") || ($_tableType == "Vector Table") } { #puts "prevCols_: $prevCols_" #puts "_showCols: $_showCols" for {set i $prevCols_} {$i < $_showCols} {incr i} { set absColIndex [expr $_firstCol -1+$i] set tmpColName [lindex $_listPreSelectedColNames $absColIndex] checkbutton $hdr.name$i -text $tmpColName -font g_titleFont \ -variable [itcl::scope _colSel($this,$i)] \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black -activebackground $fvPref::globalBgColor \ -command [itcl::code $this _updateColSel $i] $hdr create window [expr $_xPos($i) + \ $_cellPixWidth($absColIndex)/2] \ [expr $_DC(height)/2] -width $_cellPixWidth($absColIndex) \ -window $hdr.name$i -tags tempColData_$i for {set j 0} {$j < $_showRows } {incr j} { set id ${i}_$j if { [winfo exist $can.e$id] == 0} { entry $can.e$id \ -width $_cellWidth($absColIndex) \ -font g_entryFont -state disabled \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -textvariable [itcl::scope _numEntry($id)] \ -relief sunken -bd 0 -justify right bind $can.e$id [itcl::code $this _setStartMark $i $j] bind $can.e$id [itcl::code $this _setEndMark $i $j] bind $can.e$id [itcl::code $this _setEndMark $i $j] # bind $can.e$id [itcl::code $this _unsetMark] } $can create window \ [expr $_xPos($i)+$_cellPixWidth($absColIndex)/2]\ [expr $_yPos($j)+$_DC(height)/2] \ -height [expr $_DC(height) -1] \ -width $_cellPixWidth($absColIndex) \ -window $can.e$id -tags entry_$i } } for {set i $prevCols_} {$i <= $_showCols} {incr i} { set tmpx [expr $_xPos($i)-$_DC(rightspace)/2-1] if { $tmpx > $_endX } { set _endX $tmpx } $can create line $tmpx 0 $tmpx $_DC(ysize) -width 3 \ -tags colLine_$i $can bind colLine_$i \ [itcl::code $this _relocateDividLine %x $i] $can bind colLine_$i \ [itcl::code $this _startDividLine %x $i] $can bind colLine_$i \ [itcl::code $this _finalDividLine %x $i] } } else { if [winfo exists $can] { for {set c 0} {$c<=[llength $_listPreSelectedColNames]} {incr c} { for {set r 0} {$r<$_showRows} {incr r} { catch {destroy $can.tdim${c}_${r}} } } } _updateUnViewedColumns for {set i $prevCols_} {$i < $_showCols} {incr i} { set absColIndex [expr $_firstCol -1+$i] set tmpColName [lindex $_listPreSelectedColNames $absColIndex] set tmpColNum [expr $_firstCol-1+$i] checkbutton $hdr.name$i -text $_columnName($tmpColNum) \ -font g_titleFont \ -variable [itcl::scope _colSel($this,$i)] \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black \ -activebackground $fvPref::globalBgColor \ -command [itcl::code $this _updateColSel $i] label $hdr.type$i -text $_columnType($tmpColNum) -font g_titleFont label $hdr.unit$i -text $_columnUnit($tmpColNum) -font g_titleFont # Create column header menu _colMenu $hdr $i $tmpColName $tmpColNum if { $_columnVecSize($tmpColNum) > 1 || $_columnVecSize($tmpColNum) < 0 } { $hdr.menu$i.menu insert 0 command \ -label "Expand" -underline 0 -font g_titleFont \ -command [itcl::code $this _openVectorTable $tmpColNum] } $hdr create window [expr $_xPos($i) + $_cellPixWidth($absColIndex)/2]\ [expr $_DC(height)/2] -width $_cellPixWidth($absColIndex) \ -window $hdr.name$i -tags tempColData_$i $hdr create window [expr $_xPos($i) + $_cellPixWidth($absColIndex)/2]\ [expr $_DC(height)*3/2 ] -width $_cellPixWidth($absColIndex) \ -window $hdr.type$i -tags tempColData_$i $hdr create window [expr $_xPos($i) + $_cellPixWidth($absColIndex)/2]\ [expr $_DC(height)*5/2 ] \ -width $_cellPixWidth($absColIndex) \ -window $hdr.unit$i -tags tempColData_$i # CM Begin $hdr create window [expr $_xPos($i) + $_cellPixWidth($absColIndex)/2]\ [expr $_DC(height)*7/2 ] \ -width $_cellPixWidth($absColIndex) \ -window $hdr.menu$i -tags tempColData_$i # CM End # $hdr create window [expr $_xPos($i) + $_cellPixWidth($absColIndex)/2]\ # [expr $_DC(height)*9/2 ] \ # -width $_cellPixWidth($absColIndex) \ # -window $hdr.vecB$i -tags tempColData_$i for {set j 0} {$j < $_showRows } {incr j} { set id ${i}_$j catch {entry $can.e$id \ -width $_cellWidth($absColIndex) \ -font g_entryFont -state disabled \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -textvariable [itcl::scope _numEntry($id)] \ -relief sunken -bd 0 -justify right} bind $can.e$id [itcl::code $this _setStartMark $i $j] bind $can.e$id [itcl::code $this _setEndMark $i $j] bind $can.e$id [itcl::code $this _setEndMark $i $j] set _buttonWidth 0 if { $_valueTDIM($i) > 0 } { set slice $j # catch {$can delete tdim_$i} # catch {destroy $can.tdim$id} switch $_valueTDIM($i) { 1 { button $can.tdim$id -text "Plot" \ -font [list Helvetica 10] \ -command [itcl::code $this _plotVectorTableRow $i $slice ] } 2 { button $can.tdim$id -text "Image" \ -font [list Helvetica 10] \ -command [itcl::code $this _displaySlice $i $slice ] } 3 { button $can.tdim$id -text "Movie" \ -font [list Helvetica 10] \ -command [itcl::code $this _displayMovie $i $slice ] } default { button $can.tdim$id -text "Expand" \ -font [list Helvetica 10] \ -command [itcl::code $this _openVectorTable $i] } } set _buttonWidth [winfo reqwidth $can.tdim$id] $can create window \ [expr $_xPos($i)+$_cellPixWidth($absColIndex)/2]\ [expr $_yPos($j)+$_DC(height)/2] \ -window $can.tdim$id \ -width $_cellPixWidth($absColIndex) \ -height [expr $_DC(height)-1] \ -tag tdim_$i } $can create window \ [expr $_xPos($i)+$_cellPixWidth($absColIndex)/2]\ [expr $_yPos($j)+$_DC(height)/2] \ -height [expr $_DC(height) -1] \ -width $_cellPixWidth($absColIndex) \ -window $can.e$id -tags entry_$i set _xPos([expr $i + 1]) [expr $_xPos($i)+$_cellPixWidth($absColIndex)/2] } } for {set i $prevCols_} {$i <= $_showCols} {incr i} { set tmpx [expr $_xPos($i)-$_DC(rightspace)/2-1] if { $tmpx > $_endX } { set _endX $tmpx } $can create line $tmpx 0 $tmpx $_DC(ysize) -width 3 \ -tags colLine_$i $can bind colLine_$i \ [itcl::code $this _relocateDividLine %x $i] $can bind colLine_$i \ [itcl::code $this _startDividLine %x $i] $can bind colLine_$i \ [itcl::code $this _finalDividLine %x $i] } } _setHScroll [expr $_firstCol-1] } itcl::body Table::_delColsFrTable {prevCols_ prevRows_} { set hdr $_droot.table.hdr set can $_droot.table.can for {set i $_showCols} {$i < $prevCols_} {incr i} { $hdr delete tempColData_$i $can delete entry_$i $can delete tdim_$i catch {destroy $hdr.name$i} catch {destroy $hdr.type$i} catch {destroy $hdr.unit$i} catch {destroy $hdr.vecB$i} catch {destroy $hdr.menu$i} for {set j 0} {$j < $prevRows_ } {incr j} { set id ${i}_$j catch {destroy $can.e$id } catch {destroy $can.tdim$id } } } for {set i [expr 1+$_showCols]} {$i <= $prevCols_} {incr i} { $can delete colLine_$i } } itcl::body Table::_addRowsToTable {prevCols_ prevRows_} { set can $_droot.table.can _calXPos $_firstCol $_showCols for {set j $prevRows_} {$j < $_showRows} {incr j} { set realRowNum [expr $_firstRow + $j] if { $_tableType == "Image" } { set rowIndex [expr $_numRows - $realRowNum +1] } else { set rowIndex $realRowNum } label $can.b$j -text $rowIndex -font g_titleFont set _yPos([expr $j+1]) [expr $_yPos($j)+ $_DC(height) + $_DC(interline) ] $can create window [expr $_DC(lmar)+$_DC(width)/2] \ [expr $_yPos($j)+$_DC(height)/2] -window \ $_droot.table.can.b$j \ -width $_DC(width) -height [expr $_DC(height)-1] \ -tags check if { [catch {set key [$fFile getKeyword EXTNAME]}] == 0 } { if { [string first "GROUPING" $key] >= 0 } { button $can.button$realRowNum -text "Open" \ -font [list Helvetica 10 bold] \ -command [itcl::code $this _openGroupFile $_fitsFileLocationCol $realRowNum] # create consistence OPEN button $can create window [expr $_DC(width)*2+$_DC(lmar)-10] \ [expr $_yPos($j)+$_DC(height)/2] \ -window $can.button$realRowNum \ -height [expr $_DC(height)-5] \ -tags open_$j } } for {set i 0} {$i < $prevCols_ } {incr i} { set absColIndex [expr $_firstCol -1 +$i] set id ${i}_$j entry $can.e$id -width $_cellWidth($absColIndex) \ -textvariable [itcl::scope _numEntry($id)] -state disabled \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -relief sunken -bd 0 -justify right -font g_entryFont bind $can.e$id [itcl::code $this _setStartMark $i $j] bind $can.e$id [itcl::code $this _setEndMark $i $j] bind $can.e$id [itcl::code $this _setEndMark $i $j] # bind $can.e$id [itcl::code $this _unsetMark] set _buttonWidth 0 if { $_valueTDIM($i) > 0 } { set slice $j # catch {$can delete tdim_$i} # catch {destroy $can.tdim$id} switch $_valueTDIM($i) { 1 { button $can.tdim$id -text "Plot" \ -font [list Helvetica 10] \ -command [itcl::code $this _plotVectorTableRow $i $slice ] } 2 { button $can.tdim$id -text "Image" \ -font [list Helvetica 10] \ -command [itcl::code $this _displaySlice $i $slice] } 3 { button $can.tdim$id -text "Movie" \ -font [list Helvetica 10] \ -command [itcl::code $this _displayMovie $i $slice] } default { button $can.tdim$id -text "Expand" \ -font [list Helvetica 10] \ -command [itcl::code $this _openVectorTable $i] } } set _buttonWidth [winfo reqwidth $can.tdim$id] $can create window \ [expr $_xPos($i)+$_cellPixWidth($absColIndex)/2]\ [expr $_yPos($j)+$_DC(height)/2] \ -window $can.tdim$id \ -width $_cellPixWidth($absColIndex) \ -height [expr $_DC(height)-1] \ -tag tdim_$i } # set _xPos([expr $i + 1]) [expr $_xPos($i) + $width + 3] # set width 0 $can create window [expr $_xPos($i)+$_cellPixWidth($absColIndex)/2]\ [expr $_yPos($j)+$_DC(height)/2] \ -height [expr $_DC(height) -1] \ -width $_cellPixWidth($absColIndex) \ -window $can.e$id -tags entry_$i } # Pan - change the end X of horizational line $can create line 0 $_yPos($j) $_endX $_yPos($j) -tags rowLine_$j # $can create line 0 $_yPos($j) $_DC(xsize) $_yPos($j) -tags rowLine_$j } if { $_numRows } { $_droot.table.vscroll set [expr double($_firstRow-1)/$_numRows] \ [expr ($_firstRow + $_showRows - 1.0)/$_numRows] } else { $_droot table.vscroll set 0.0 1.0 } } itcl::body Table::_delRowsFrTable {prevCols_ prevRows_} { #puts "_delRowsFrTable start" if {$prevRows_ > $_showRows} { set can $_droot.table.can for {set j $_showRows} {$j < $prevRows_} {incr j} { catch {destroy $can.b$j} catch {destroy $can.button[expr $j+1]} $can delete rowLine_[expr $j+1] for {set i 0} {$i < $_showCols } {incr i} { set id ${i}_$j catch {destroy $can.e$id } catch {destroy $can.tdim$id } } } } _refacing } itcl::body Table::_updateLast { } { set insertButton false set can $_droot.table.can # Update visible cells with current values #puts "_firstCol: $_firstCol" #puts "_firstRow: $_firstRow" # _readTableData [expr $_firstCol-1] [expr $_firstRow-1] $_showCols $_showRows _readTableData [expr $_firstCol-1] [expr $_firstRow-1] \ [llength $_listPreSelectedColNames] $_showRows set col [expr $_firstCol-1] # command in fitsTcl # updateCell if [winfo exists $can] { for {set c 0} {$c<=[llength $_listPreSelectedColNames]} {incr c} { for {set r 0} {$r<$_showRows} {incr r} { catch {destroy $can.tdim${c}_${r}} } } } for {set c 0} {$c<$_showCols} {incr c} { set row [expr $_firstRow-1] set absColIndex [expr $_firstCol -1 +$c] for {set r 0} {$r<$_showRows} {incr r} { set id ${c}_${r} if [winfo exists $can] { set oldx 0 set oldy 0 foreach {oldx oldy} [$_droot.table.can coord colLine_$c] {} if { $_valueTDIM($absColIndex) > 0 } { set slice $r switch $_valueTDIM($absColIndex) { 1 { button $can.tdim${absColIndex}_${r} -text "Plot" \ -font [list Helvetica 10] \ -command [itcl::code $this _plotVectorTableRow $col $slice ] } 2 { button $can.tdim${absColIndex}_${r} -text "Image" \ -font [list Helvetica 10] \ -command [itcl::code $this _displaySlice $col $slice] } 3 { button $can.tdim${absColIndex}_${r} -text "Movie" \ -font [list Helvetica 10] \ -command [itcl::code $this _displayMovie $col $slice] } default { button $can.tdim${absColIndex}_${r} -text "Expand" \ -font [list Helvetica 10] \ -command [itcl::code $this _openVectorTable $absColIndex] # $can.tdim$id configure -state disable } } $can create window \ [expr $oldx+$_cellPixWidth($absColIndex)/2 + 6] \ [expr $_yPos($r)+$_DC(height)/2] \ -window $can.tdim${absColIndex}_${r} \ -width $_cellPixWidth($absColIndex) \ -height [expr $_DC(height) -1] \ -tag tdim_$absColIndex set _xPos([expr $c + 1]) [expr $_xPos($c)+$_cellPixWidth($absColIndex)/2] } } set val [_getFormattedData $col $row] if { [string length $val]>$_cellWidth($col) } { # set val "*" } set _numEntry($id) $val incr row } incr col } } itcl::body Table::_openGroupFile {c r} { set fileName [_getRawData $c [expr $_firstRow + $r - 2]] if { [string range $fileName 0 0] == "/" } { # full path set fullPathName $fileName } else { set token [split [wm title $_droot ] " "] set dName [lindex $token [expr [llength $token] - 1]] set fullPathName [format "%s%s" $dName $fileName] } if ![file exists $fullPathName] { foreach ext { gz Z z zip } { if [file exists $fullPathName.$ext] { set fullPathName $fullPathName.$ext break } } } set flagErr [catch { set result [FitsFile #auto $fullPathName 1] } err] if { $flagErr } { tk_messageBox -icon error -type ok -message $err } } itcl::body Table::_jumpFrEnt {} { #puts "_jumpFrEnt start" _jump [$_droot.usrEntry.goto_e get] } itcl::body Table::_jump {lineNum_} { #puts "_jump start" if { $lineNum_ == "" } { puts "Please give me a number" return } if { $lineNum_<1 } { set lineNum_ 1 } if { $lineNum_>$_numRows } { set lineNum_ $_numRows } if { $_tableType == "Image" } { set realRow [expr $_numRows-$lineNum_] } else { set realRow [expr $lineNum_-1] } _setVScroll $realRow if { [info exists _currentCol] } { _setStartMark [expr $_currentCol-$_firstCol+1] \ [expr $realRow-$_firstRow+1] } else { _setStartMark 0 [expr $realRow-$_firstRow+1] } } itcl::body Table::_selRowsFrExpr { ifDelete_ } { #puts "_selRowsFrExpr start" # never used, not even initialized # global g_rowselentry if { $ifDelete_ } { set cal ".cald_[namespace tail $this]" if { [winfo exist $cal] == 1 } { raise $cal return } # pick out the variable-length vector columns from the calculator set calList {} for {set i 0} {$i < $_dispCols} {incr i} { if { $_columnVecSize($i) > 0 } { lappend calList [lindex $_listPreSelectedColNames $i] } } FitsDelCalculator $cal $this $calList $cal configure -title "fv: Delete Rows" } else { set cal ".cald_[namespace tail $this]" if { [winfo exist $cal] == 1 } { raise $cal return } # pick out the variable-length vector columns from the calculator set calList {} for {set i 0} {$i < $_dispCols} {incr i} { if { $_columnVecSize($i) > 0 } { lappend calList [lindex $_listPreSelectedColNames $i] } } FitsSelCalculator $cal $this $calList 0 $_numRows $cal configure -title "fv: Select Rows From Expr" } } itcl::body Table::_addRows {{rowindex -1} { rownum -1} } { #puts "_addRows start" global g_titleFont set addWin .addRow catch {destroy .addRow} powToplevel $addWin .dummy wm title $addWin "fv: Add Rows" iwidgets::entryfield $addWin.after -textvariable [itcl::scope _rowindex] -labeltext "After row \#" \ -labelpos nw -width 10 -labelfont g_titleFont iwidgets::entryfield $addWin.number -textvariable [itcl::scope _rownum] -labeltext "Number of rows" \ -labelpos nw -width 10 -labelfont g_titleFont iwidgets::buttonbox $addWin.bb if { $rowindex !="" && $rowindex >-1} { if { $rownum !="" && $rownum > -1 } { set _rowindex $rowindex set _rownum $rownum _addRowsToFile $addWin return } } $addWin.bb add OK -text OK -command [itcl::code $this _addRowsToFile $addWin] -font g_titleFont $addWin.bb add Cancel -text Cancel -command "destroy $addWin" -font g_titleFont pack $addWin.after -fill x pack $addWin.number -fill x pack $addWin.bb -fill x tkwait window $addWin } itcl::body Table::_delRowsRange {} { set selrange "" set start_end "1-$_numRows" append selrange [_parseToRowRange $start_end] if { $selrange !="" } { for { set i 1 } { $i <= $_numRows } { incr i } { set _selectedRows($i) 0 } $fFile delRowsRange $selrange $fFile changeFile refresh _updateRestDisps } } itcl::body Table::_delRows {} { set ndeleted 0 for {set i 1} {$i <= $_numRows} {incr i} { if { $_selectedRows($i) == 1 } { set j $i while { ($j <=$_numRows) && ($_selectedRows($j) == 1)} { set _selectedRows($j) 0 incr j } set n0 $i set n1 [expr $j-1] set nn [expr $j-$i] $fFile delRows [expr $n0-$ndeleted] $nn incr ndeleted $nn if { $_firstRow >= $n1 } { incr _firstRow [expr -$nn] } elseif { $_firstRow >= $n0 } { incr _firstRow [expr -($_firstRow-$n0)] } else { } if { $_firstRow < 1} { set _firstRow 1 } set i $j } } set _numRows [expr $_numRows - $ndeleted] $fFile changeFile refresh _updateRestDisps # puts $_numRows } itcl::body Table::_logicalWithselectedRows { rowlist seland selor} { set sellist {} for {set i 0} {$i <= $_numRows} {incr i} { set tmpselrows($i) 0 if { $_selectedRows($i) ==1 } { lappend sellist $i } } # for {set i 0} {$i < [llength $rowlist]} {incr i} { # set j [expr 1+[lindex $rowlist $i]] # set tmpselrows($j) 1 # } foreach j $rowlist { set tmpselrows([expr $j+1]) 1 } if { $seland == 1} { # for {set i 0} {$i <= $_numRows} {incr i} { # set _selectedRows($i) [expr $_selectedRows($i) && $tmpselrows($i)] # } foreach i $sellist { set _selectedRows($i) [expr $_selectedRows($i) && $tmpselrows($i)] } } elseif { $selor == 1} { for {set i 0} {$i <= $_numRows} {incr i} { set _selectedRows($i) [expr $_selectedRows($i) || $tmpselrows($i)] } } else { for {set i 0} {$i <= $_numRows} {incr i} { set _selectedRows($i) $tmpselrows($i) } } _showselRows } itcl::body Table::selRowsWithCondition {cond fRow nRows seland selor} { #puts "selRowsWithCondition start" set rowlist [$fFile selRowsWithCondition $cond $fRow $nRows] _logicalWithselectedRows $rowlist $seland $selor # set sellist {} # for {set i 0} {$i <= $_numRows} {incr i} { # set tmpselrows($i) 0 # if { $_selectedRows($i) ==1 } { # lappend sellist $i # } # } ## for {set i 0} {$i < [llength $rowlist]} {incr i} { ## set j [expr 1+[lindex $rowlist $i]] ## set tmpselrows($j) 1 ## } # foreach j $rowlist { # set tmpselrows([expr $j+1]) 1 # } # if { $seland == 1} { ## for {set i 0} {$i <= $_numRows} {incr i} { ## set _selectedRows($i) [expr $_selectedRows($i) && $tmpselrows($i)] ## } # foreach i $sellist { # set _selectedRows($i) [expr $_selectedRows($i) && $tmpselrows($i)] # } # } elseif { $selor == 1} { # for {set i 0} {$i <= $_numRows} {incr i} { # set _selectedRows($i) [expr $_selectedRows($i) || $tmpselrows($i)] # } # } else { # for {set i 0} {$i <= $_numRows} {incr i} { # set _selectedRows($i) $tmpselrows($i) # } # } # _showselRows } itcl::body Table::delRowsWithCondition {cond} { #puts "delRowsWithCondition start" $fFile delRowsWithCondition $cond $fFile changeFile refresh _updateRestDisps } itcl::body Table::selRowsFromList {entry seland selor} { # get rid of all the white spaces regsub -all " " $entry "" tmpEntry # break it apart set tmpS [split $tmpEntry ","] # deal with different parts and make a list foreach range $tmpS { if { [regexp {^[0-9]+$} $range] == 1 } { if {$range <= $_numRows} { lappend rangeList [list $range $range] } else { lappend rangeList [list $_numRows $_numRows] } } else { if {[regsub -- "-" $range "," range1] == 0} { } else { set tmpPos [string first "," $range1] if { $_tableType == "Image"} { set n1 [expr $_numRows +1 - \ [string range $range1 [expr $tmpPos+1] end ] ] set n2 [expr $_numRows +1 - \ [string range $range1 0 [expr $tmpPos-1]] ] } else { set n1 [string range $range1 0 [expr $tmpPos-1]] set n2 [string range $range1 [expr $tmpPos+1] end ] } if { $n1 < 1 } { set n1 1 } if { $n2 > $_numRows } { set n2 $_numRows } if { $n1 > $n2} { lappend rangeList [list $n2 $n1] } else { lappend rangeList [list $n1 $n2] } } } } for { set i 0 } {$i <=$_numRows} { incr i} { set tmplist($i) 0 } foreach r $rangeList { set n0 [lindex $r 0] set n1 [lindex $r 1] for { set i $n0 } { $i <=$n1 } {incr i} { set tmplist($i) 1 } } if { ($seland !=1) && ($selor !=1) } { for {set i 0 } { $i <= $_numRows } {incr i} { set _selectedRows($i) $tmplist($i) } } elseif { $seland ==1 } { for {set i 0 } { $i <= $_numRows } {incr i} { set _selectedRows($i) [expr $_selectedRows($i) && $tmplist($i)] } } else { foreach r $rangeList { set n0 [lindex $r 0] set n1 [lindex $r 1] for { set i $n0 } { $i <=$n1 } {incr i} { set _selectedRows($i) 1 } } # for {set i 0 } { $i <= $_numRows } {incr i} { # set _selectedRows($i) [expr $_selectedRows($i) || $tmplist($i)] # } } _showselRows } itcl::body Table::delRowsFromList {entry} { #puts "delRowsFromList start" # don't delete if its an image extension if { $_tableType == "Image"} { error "Cannot delete rows in an image" return } # warning if { [llength $_listPreSelectedColNames] != [llength $_listColNames] } { if { [promptMsg "You are editing only part of the table. \n Do you want to delete rows from all the columns?" \ return Yes No] == "CANCEL"} { return } } # get rid of all the white spaces regsub -all " " $entry "" tmpEntry # break it apart set tmpS [split $tmpEntry ","] # deal with different parts and make a list foreach range $tmpS { if { [regexp {^[0-9]+$} $range] == 1 } { if {$range <= $_numRows} { lappend rangeList [list $range $range] } else { lappend rangeList [list $_numRows $_numRows] } } else { if {[regsub -- "-" $range "," range1] == 0} { } else { set tmpPos [string first "," $range1] if { $_tableType == "Image"} { set n1 [expr $_numRows +1 - \ [string range $range1 [expr $tmpPos+1] end ] ] set n2 [expr $_numRows +1 - \ [string range $range1 0 [expr $tmpPos-1]] ] } else { set n1 [string range $range1 0 [expr $tmpPos-1]] set n2 [string range $range1 [expr $tmpPos+1] end ] } if { $n1 < 1 } { set n1 1 } if { $n2 > $_numRows } { set n2 $_numRows } if { $n1 > $n2} { lappend rangeList [list $n2 $n1] } else { lappend rangeList [list $n1 $n2] } } } } # now merge the list chosen. set numRange [llength $rangeList] set leftList $rangeList set resultList "" while { $numRange > 1} { set seedRange [lindex $leftList 0] set leftList [lrange $leftList 1 end] set result [_collapse $seedRange $leftList] set leftList [lindex $result 1] if { [lindex $result 0] == 0 } { lappend resultList $seedRange } incr numRange -1 } lappend resultList [lindex $leftList 0] set resultList [_sortRange $resultList] # if deletion happens before the current _firstRow, then the current _firstRow will change. # foreach r $resultList { set n0 [lindex $r 0] set n1 [lindex $r 1] set nn [expr $n1-$n0+1] # really delete rows in the FITS file $fFile delRows $n0 $nn $fFile changeFile if { $_firstRow >= $n1 } { incr _firstRow [expr -$nn] } elseif { $_firstRow >= $n0 } { incr _firstRow [expr -($_firstRow-$n0)] } else { } if { $_firstRow < 1} { set _firstRow 1 } } refresh _updateRestDisps } itcl::body Table::_collapse {seed bed} { #puts "_collapse start" set flag 0 set numBedElem [llength $bed] set sLow [lindex $seed 0] set sHigh [lindex $seed 1] # | seed | # case 1 **|********|** # case 2 | **** | # case 3 *****|** | # case 4 | ***|** # * bed for {set i 0} {$i < $numBedElem} {incr i} { set eLow [lindex [lindex $bed $i] 0] set eHigh [lindex [lindex $bed $i] 1] # case 1 if { ($sLow > $eLow) && ($sHigh < $eHigh) } { set flag 1 # case 2 } elseif {($sLow< $eLow) && ($sHigh > $eHigh)} { set flag 1 set bed [lreplace $bed $i $i [list $sLow $sHigh]] # case 3 } elseif {($sLow>=$eLow) && ($sLow<=$eHigh) && ($sHigh>=$eHigh) } { set flag 1 set bed [lreplace $bed $i $i [list $eLow $sHigh]] # case 4 } elseif {($sHigh>=$eLow) && ($sHigh<=$eHigh) && ($sLow<=$eLow) } { set flag 1 set bed [lreplace $bed $i $i [list $sLow $eHigh]] } else { } } # flag = 1, _collapsed return [list $flag $bed] } itcl::body Table::_sortRange {bed} { #puts "_sortRange start" # # bed should be a list of ranges, and they are not supposed to have overlaps # overlap has been delt with in _collapse. # foreach i $bed { lappend idxList [lindex $i 0] } set sortedList [lsort -decreasing -integer $idxList] for {set j 0} {$j < [llength $sortedList] } {incr j} { set tmpIdx [lsearch -exact $idxList [lindex $sortedList $j]] if { $tmpIdx == -1} { error "Error sorting" return } else { lappend outList [lindex $bed $tmpIdx] } } # in a reversed order, since cfitsio should delete the last row first return $outList } # Changes contents of a table cell and writes # it to file if available. col_ and row_ are zero-indexed, indicating # true row/column of cell to change # itcl::body Table::_modifyTableCell {col_ row_ val_} { #puts "_modifyTableCell start" if { $isFailedToCopy } return _writeTableData $col_ $row_ $val_ set id [expr $col_ - $_firstCol + 1]_[expr $row_ - $_firstRow + 1] set _numEntry($id) [_getFormattedData $col_ $row_] $fFile changeFile } itcl::body Table::_updateColSel {col} { set realColNum [expr $_firstCol+$col-1] set _colNotchedState($realColNum) $_colSel($this,$col) } itcl::body Table::_resizeCan {x y} { #puts "_resizeCan start, $x, $y" set _DC(geoX) [winfo width $_droot] set _DC(geoY) [winfo height $_droot] set _DC(geoX0) [winfo x $_droot] set _DC(geoY0) [winfo y $_droot] # _unselCell # #puts "screen info: [winfo screenwidth .]" #puts "_DC(geoX): $_DC(geoX)" if {$_DC(geoX) < 350 } { set _DC(geoX) 350 set x 350 } # wm geometry $_droot [set _DC(geoX)]x[set _DC(geoY)]+[set _DC(geoX0)]+[set _DC(geoY0)] # Pan Chai - so Table will not jump during resizeCan wm geometry $_droot [set _DC(geoX)]x[set _DC(geoY)] set _DC(xsize) $x set _DC(ysize) $y $_droot.table.hdr configure -width $_DC(xsize) $_droot.table.hdr configure -width 10 $_droot.table.can configure -width $_DC(xsize) -height $_DC(ysize) $_droot.table.can configure -width 10 -height $_DC(ysize) _getLastFirstCol # determine number of rows and number of columns to display _layoutCan $_DC(xsize) $_DC(ysize) # to prevent _readTableData to be called twice if { $_justStarted == 1 } { set _justStarted 0 return } _reframe _refacing _setScrolls _updateLast _selCell _showselRows } itcl::body Table::_reframe {} { for {set i 0} {$i<=$_showCols} {incr i} { set _tempXPos($i) $_xPos($i) } _calXPos $_firstCol $_showCols for {set i 0} {$i<=$_showCols} {incr i} { if { $_tempXPos($i) > $_xPos($i) } { set _xPos($i) $_tempXPos($i) } } set tmpYPos [expr $_showRows*$_DC(height) + $_DC(tmar) + 1] for {set i 0} {$i<=$_showCols} {incr i} { set tmpXPos [expr $_xPos($i)-$_DC(rightspace)/2-1] if { $i == $_showCols } { set tmpXPos [expr $_xPos($i)-$_DC(rightspace)/2-1 + 10] } $_droot.table.can delete colLine_$i # Pan - change the end X of horizational line if { $tmpXPos > $_endX } { set _endX $tmpXPos } $_droot.table.can configure -width [ expr $_xPos($i) + 3 ] $_droot.table.can create line $tmpXPos 0 $tmpXPos $tmpYPos -width 3 -tags colLine_$i $_droot.table.can bind colLine_$i \ [itcl::code $this _relocateDividLine %x $i] $_droot.table.can bind colLine_$i \ [itcl::code $this _startDividLine %x $i] $_droot.table.can bind colLine_$i \ [itcl::code $this _finalDividLine %x $i] } for {set j 0} {$j<=$_showRows} {incr j} { $_droot.table.can delete rowLine_$j # Pan - change the end X of horizational line # $_droot.table.can create line 0 $_yPos($j) $_DC(xsize) $_yPos($j) -tags rowLine_$j $_droot.table.can create line 0 $_yPos($j) $_endX $_yPos($j) -tags rowLine_$j } _makeJustification } itcl::body Table::_getXYSize {x y} { for {set i $_firstCol} {$i <= $_dispCols} {incr i} { set tabXSize [expr $_absXPos($i) - $_absXPos([expr $_firstCol-1]) \ + $_DC(lmar) + $_DC(width) + $_DC(rightspace)/2 ] if { $tabXSize > $x } break } set _showCols [expr $i - $_firstCol] for {set j 1} {$j <= $_numRows} {incr j} { set tabYSize [expr 2*$_DC(tmar) + ($j)*($_DC(height) + $_DC(interline))] if { $tabYSize > $y } break } set _showRows [expr $j - 1] if { $_showRows < 1} { set _showRows 1 } if { $_showCols < 1} { set _showCols 1 } set lastCol [llength $_listPreSelectedColNames] if {$_showRows > $_numRows} { set _showRows $_numRows } if {$_showCols > $lastCol} { set _showCols $lastCol } if { $_firstCol > [expr $lastCol -$_showCols+1]} { set _firstCol [expr $lastCol -$_showCols+1] } if { $_firstRow > [expr $_numRows -$_showRows+1]} { set _firstRow [expr $_numRows -$_showRows+1] } } itcl::body Table::_layoutCan {x y} { set oldShowCols $_showCols set oldShowRows $_showRows set _old_firstCol $_firstCol _getXYSize $x $y if { $_showRows > $oldShowRows } { _addRowsToTable $oldShowCols $oldShowRows } elseif { $_showRows < $oldShowRows} { _delRowsFrTable $oldShowCols $oldShowRows } _calXPos $_old_firstCol $_showCols if { $_showCols > $oldShowCols } { _addColsToTable $oldShowCols $oldShowRows } elseif { $_showCols < $oldShowCols} { _delColsFrTable $oldShowCols $oldShowRows } } itcl::body Table::_updateExportPanelState {} { catch { if { $_exportsel == 2 } { .table_saveas.r.frow configure -state normal .table_saveas.r.lrow configure -state normal } else { .table_saveas.r.frow configure -state disable .table_saveas.r.lrow configure -state disable } if { $_exportselc == 2 } { .table_saveas.r.fcol configure -state normal .table_saveas.r.lcol configure -state normal } else { .table_saveas.r.fcol configure -state disable .table_saveas.r.lcol configure -state disable } } } itcl::body Table::trySaveASCII {} { _saveASCII } itcl::body Table::_saveASCII {} { global g_titleFont set t [urlTail $fileName] set r [file root $t] set e [file ext $t] if { [lsearch -exact [list .gz .Z .z] $e] != -1 } { set e [file ext $r] set r [file root $r] } set sugName "${r}_t[expr $currentHDU-1].txt" set asciiFileName [getSelectedFileName $sugName] if { $asciiFileName == "" } return if { [file exist $asciiFileName] == 1 } { set feedBack [promptMsg "File $asciiFileName exists.\n overwrite?" \ return Yes No] if { $feedBack == "CANCEL" } return } ##### saveas table options catch {destroy .table_saveas} set fileWin .table_saveas powToplevel $fileWin .dummy wm title $fileWin "fv: Export to file options" if { ($_tableType == "ASCII Table") || ($_tableType == "Binary Table") } { wm geometry $fileWin 460x420 } else { wm geometry $fileWin 460x420 } frame $fileWin.f iwidgets::feedback $fileWin.f.fdb -labeltext "Saved" -labelfont g_titleFont pack $fileWin.f.fdb -fill x iwidgets::buttonbox $fileWin.f.bb pack $fileWin.f.bb -side top $fileWin.f.bb add continue -text "Save" \ -command [itcl::code $this _saveTableToAscii $fileWin $asciiFileName] -font g_titleFont $fileWin.f.bb add quit -text "Cancel" \ -command "destroy $fileWin" -font g_titleFont ## reset these variables set _exportFirstRow 1 set _exportLastRow $_numRows set _exportFirstCol 1 set _exportLastCol $_dispCols set _exportPrintRowNumbers 0 set _exportCSV 1 set _exportCharBetweenCols " " set _exportFixedFormat 0 set _exportFormat "csv" frame $fileWin.r radiobutton $fileWin.r.all \ -text "All" -font g_titleFont \ -variable [itcl::scope _exportsel] -value 1 \ -command [itcl::code $this _updateExportPanelState] if { ($_tableType == "Image") || ($_tableType == "Vector Table") } { radiobutton $fileWin.r.range \ -text "From:" -font g_titleFont \ -variable [itcl::scope _exportsel] -value 2 \ -command [itcl::code $this _updateExportPanelState] } radiobutton $fileWin.r.sel \ -text "Selection" -variable [itcl::scope _exportsel] \ -font g_titleFont -value 3 \ -command [itcl::code $this _updateExportPanelState] $fileWin.r.all select label $fileWin.r.l -text "Rows:" grid $fileWin.r.l -column 0 -row 0 -pady 10 -padx 20 grid $fileWin.r.all -column 0 -row 1 -sticky w -padx 20 if { ($_tableType == "Image" ) || ($_tableType == "Vector Table") } { grid $fileWin.r.range -column 0 -row 2 -sticky w -padx 20 } grid $fileWin.r.sel -column 0 -row 3 -sticky w -padx 20 # not sure if member variables is the best way, or passing variables # along in a [itcl::code $this type args] way, if that's even possible if { ($_tableType == "Image") || ($_tableType == "Vector Table") } { iwidgets::entryfield $fileWin.r.frow -labeltext "" \ -textvariable [itcl::scope _exportFirstRow] \ -textfont g_titleFont -labelfont g_titleFont iwidgets::entryfield $fileWin.r.lrow -labeltext "To:" \ -textvariable [itcl::scope _exportLastRow] \ -textfont g_titleFont -labelfont g_titleFont grid $fileWin.r.frow -column 1 -row 2 -sticky w grid $fileWin.r.lrow -column 2 -row 2 -sticky w } pack $fileWin.r -side top # if user wants to choose columns, he should pre-select using right button if { ($_tableType == "ASCII Table") || ($_tableType == "Binary Table") || \ ($_tableType == "Vector Table") || ($_tableType == "Image")} { # don't allow user to pick column radiobutton $fileWin.r.allc \ -text "All" -font g_titleFont \ -variable [itcl::scope _exportselc] -value 1 \ -command [itcl::code $this _updateExportPanelState] radiobutton $fileWin.r.selc \ -text "Selection" -variable [itcl::scope _exportselc] \ -font g_titleFont -value 2 \ -command [itcl::code $this _updateExportPanelState] $fileWin.r.allc select label $fileWin.r.lc -text "Columns:" if { ($_tableType == "Image") || ($_tableType == "Vector Table") } { radiobutton $fileWin.r.crange \ -text "From:" -font g_titleFont \ -variable [itcl::scope _exportselc] -value 2 \ -command [itcl::code $this _updateExportPanelState] iwidgets::entryfield $fileWin.r.fcol -labeltext "" \ -textvariable [itcl::scope _exportFirstCol] \ -textfont g_titleFont -labelfont g_titleFont iwidgets::entryfield $fileWin.r.lcol -labeltext "To:" \ -textvariable [itcl::scope _exportLastCol] \ -textfont g_titleFont -labelfont g_titleFont grid $fileWin.r.lc -column 0 -row 4 -pady 10 -padx 20 grid $fileWin.r.allc -column 0 -row 5 -sticky w -padx 20 grid $fileWin.r.crange -column 0 -row 6 -sticky w -padx 20 grid $fileWin.r.fcol -column 1 -row 6 -sticky w grid $fileWin.r.lcol -column 2 -row 6 -sticky w } else { grid $fileWin.r.lc -column 1 -row 0 -pady 10 -padx 50 grid $fileWin.r.allc -column 1 -row 1 -sticky w -padx 50 grid $fileWin.r.selc -column 1 -row 3 -sticky w -padx 50 } } else { iwidgets::entryfield $fileWin.fcol -labeltext "First Column:" \ -textvariable [itcl::scope _exportFirstCol] \ -textfont g_titleFont -labelfont g_titleFont iwidgets::entryfield $fileWin.lcol -labeltext "Last Column:" \ -textvariable [itcl::scope _exportLastCol] \ -textfont g_titleFont -labelfont g_titleFont pack $fileWin.fcol -side top pack $fileWin.lcol -side top } checkbutton $fileWin.selcb -text "Use Selected Rows" \ -variable [itcl::scope _exportselRows] \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black -activebackground $fvPref::globalBgColor \ -justify left -font g_titleFont checkbutton $fileWin.cb -text "Print Row Numbers" \ -variable [itcl::scope _exportPrintRowNumbers] \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black -activebackground $fvPref::globalBgColor \ -justify left -font g_titleFont pack $fileWin.cb -side top -fill x -expand 1 iwidgets::radiobox $fileWin.rb -labeltext "Output Format" \ -selectcolor $fvPref::checkBBgColor \ -foreground black -background $fvPref::globalBgColor -labelfont g_titleFont if { ($_tableType == "ASCII Table") || ($_tableType == "Binary Table") } { $fileWin.rb add fixed -text "Fixed Width Columns" -font g_titleFont } $fileWin.rb add csv \ -text "CSV format (\"7\",\"8\"...format)" -font g_titleFont $fileWin.rb add userdefine \ -text "User-defined separator (specify below)" -font g_titleFont $fileWin.rb select csv pack $fileWin.rb -fill both iwidgets::entryfield $fileWin.ins -labeltext \ "Column Separator (for example: , or | ... default is \" \" ):" \ -textvariable [itcl::scope _exportCharBetweenCols] -textfont g_titleFont \ -labelfont g_titleFont pack $fileWin.ins -side top -fill x -expand 1 pack $fileWin.f -side bottom -fill x catch { .table_saveas.r.frow configure -state disable .table_saveas.r.lrow configure -state disable .table_saveas.r.fcol configure -state disable .table_saveas.r.lcol configure -state disable } } itcl::body Table::_writeHist { ffile_ origName_ } { global env global isWin set date [clock format [clock seconds] \ -format %Y-%m-%dT%H:%M:%S] if { [info exists env(USER)] } { set uname $env(USER) } elseif { [info exists env(USERNAME)] } { set uname $env(USERNAME) } elseif { [info exists env(LOGNAME)] } { set uname $env(LOGNAME) } else { set uname "???" } $ffile_ put history " File exported from $origName_ by user \'$uname\' with fv on $date" } itcl::body Table::_saveTableToFile {win_ fitsFileName_ origName_} { set firstrow 0 set delrows 0 set tdelrows 0 if { $_exportsel == 1 } { $win_.f.fdb configure -steps 1 set _exportLastRow $_numRows set _exportFirstRow 1 $fFile copyCHDU $fitsFileName_ if {[catch {$win_.f.fdb step}] == 1} { file delete $fitsFileName_ return } set outfFile [fits open $fitsFileName_ 1] if { $_tableType == "Image" } { $outfFile move 1 } else { $outfFile move 2 } _writeHist $outfFile $origName_ $outfFile checksum update # $outfFile close } elseif {$_exportsel == 2} { $win_.f.fdb configure -steps 2 $fFile copyCHDU $fitsFileName_ set outfFile [fits open $fitsFileName_ 1] if { $_tableType == "Image" } { $outfFile move 1 } else { $outfFile move 2 } set delrows [expr $_exportFirstRow -1] set firstrow 1 $outfFile delete rows $firstrow $delrows if {[catch {$win_.f.fdb step}] == 1} { file delete $fitsFileName_ return } set firstrow [expr $_exportLastRow - $delrows +1] set delrows [expr $_numRows - $_exportLastRow ] $outfFile delete rows $firstrow $delrows if {[catch {$win_.f.fdb step}] == 1} { file delete $fitsFileName_ return } _writeHist $outfFile $origName_ $outfFile checksum update # $outfFile close } else { $fFile copyCHDU $fitsFileName_ set outfFile [fits open $fitsFileName_ 1] # set outfFile [openFitsFile $fitsFileName_] if { $_tableType == "Image" } { $outfFile move 1 } else { $outfFile move 2 } set nblock 1 for { set i 1 } {$i <=$_numRows } { incr i } { if { $_selectedRows($i) == 1 } { set _selectedRows($i) 0 } else { set _selectedRows($i) 1 } } # set nblock [expr $_numRows/1000000] # if { $_numRows > [expr $nblock*1000000] } { # incr nblock # } $win_.f.fdb configure -steps $nblock # for { set i 1 } { $i <=$nblock } { incr i} { # set start [expr ($i-1)*1000000 +1] # set end [expr $i*100000] # if { $end > $_numRows } { # set end $_numRows # } # set start_end "$start-$end" set start_end "1-$_numRows" set selrange [_parseToRowRange $start_end] $outfFile delete rows -range $selrange if {[catch {$win_.f.fdb step}] == 1} { file delete $fitsFileName_ return } # } # for { set i 1 } {$i <=$_numRows } { incr i } { # if { $_selectedRows($i) == 0} { # incr nblock # while {$_selectedRows($i) == 0 } { # incr i # if { $i > $_numRows} { # break # } # } # } # } # $win_.f.fdb configure -steps $nblock # for { set i 1 } {$i <=$_numRows } { incr i } { # if { $_selectedRows($i) == 0} { # set firstrow [expr $i - $tdelrows] ## puts "first : $i" # while {$_selectedRows($i) == 0 } { # incr i # if { $i > $_numRows} { # break # } # } ## puts "last: $i" # set delrows [expr $i - $firstrow - $tdelrows] # # incr tdelrows $delrows # $outfFile delete rows $firstrow $delrows # if {[catch {$win_.f.fdb step}] == 1} { # file delete $fitsFileName_ # return # } # } # } # $outfFile put history " Exported from $origName_" _writeHist $outfFile $origName_ $outfFile checksum update # $outfFile close } set collist {} if { $_exportcolsel == 2 } { for {set i 1} { $i < $_exportFirstCol} {incr i} { lappend collist [lindex $_listPreSelectedColNames [expr $i -1]] } for {set i [expr $_exportLastCol +1]} { $i <= $_dispCols} {incr i} { lappend collist [lindex $_listPreSelectedColNames [expr $i -1]] } $outfFile delete cols $collist } elseif {$_exportcolsel == 3} { for {set i 0} { $i < $_dispCols} {incr i} { if {$_colNotchedState($i) == 0} { lappend collist [lindex $_listPreSelectedColNames $i] } } $outfFile delete cols $collist } destroy $win_ } itcl::body Table::_saveTableToAscii {win_ asciiFileName_} { # these vars are used # _exportFirstRow # _exportLastRow # _exportFirstCol # _exportLastCol # _exportCSV # _exportPrintRowNumbers # _exportCharBetweenCols set _exportFormat [$win_.rb get] if { $_exportFormat == "csv" } { set _exportCSV 1 set _exportFixedFormat 0 } elseif { $_exportFormat == "fixed" } { set _exportCSV 0 set _exportFixedFormat 1 } elseif { $_exportFormat == "userdefine" } { set _exportCSV 0 set _exportFixedFormat 0 } set collist {} set collistwidths {} # Note: all rows and cols are 1-based # this matches the $fFile print commands below use 1-based, so no # change is needed ################################################################ # set up the feedback bar set totalRowsPrint [expr $_exportLastRow - $_exportFirstRow + 1] # NOTE -- this is changed to 1000000000 rows # we will print 1000 rows at a time (or whatever is left) # numPrintBlocks = total blocks of 1000 or iterations in feedbar bar # if we have 2835 rows, we'll print: # 1 to 1000, (first block) # 1001 to 2000, (second block) # 2001 to 2835. (third block) # # tables are meant to be printed in standard row order set numPrintBlocks [expr $totalRowsPrint/1000000000] if { ($totalRowsPrint - $numPrintBlocks*1000000000) > 0 } { incr numPrintBlocks } $win_.f.fdb configure -steps $numPrintBlocks # create list of print widths set listPrintWidths {} for {set i 0} {$i < $_dispCols} {incr i} { lappend listPrintWidths [expr $_cellWidth($i) + 1] } set firstloop 1 if { $_exportsel == 1 } { set _exportFirstRow 1 set _exportLastRow $_numRows set totalRowsPrint [expr $_exportLastRow - $_exportFirstRow + 1] } if { $_exportsel == 3 } { for {set r 1} { $r <=$_numRows } { incr r } { if {$_selectedRows($r) ==1 } { set _exportFirstRow $r while { $_selectedRows($r) == 1} { incr r if { $r > $_numRows } { break } } set totalRowsPrint [expr $r - $_exportFirstRow] for {set n 1} {$n <= $numPrintBlocks} {incr n} { if { $n == 1 && $firstloop == 1} { # write into a new file and write column names set filePrintMode 0 } else { # append to that file and don't write column names set filePrintMode 2 } set fRow [expr 1000000000*[expr $n-1] + 1] if { $n == $numPrintBlocks } { set nRows [expr $totalRowsPrint - $fRow + 1] } else { set nRows 1000000000 } # shift by the first user-selected row set fRow [expr $fRow + $_exportFirstRow - 1] if { ($_tableType == "ASCII Table") || ($_tableType == "Binary Table") } { if { $_exportselc == 1 } { set collist $_listPreSelectedColNames set collistwidths $listPrintWidths } else { set collist {} set collistwidths {} for {set i 0} { $i < $_dispCols} {incr i} { if {$_colNotchedState($i) == 1} { lappend collist [lindex $_listPreSelectedColNames $i] lappend collistwidths [lindex $listPrintWidths $i] } } } $fFile saveTabToASCII $asciiFileName_ $filePrintMode \ $fRow $nRows \ $collist $collistwidths \ $_exportFixedFormat \ $_exportCSV \ $_exportPrintRowNumbers \ $_exportCharBetweenCols } else { error "Table Type unknown. Export as text not possible." return } # if user presses cancel, stop if {[catch {$win_.f.fdb step}] == 1} { file delete $asciiFileName_ return } } set firstloop 0 } } } else { for {set n 1} {$n <= $numPrintBlocks} {incr n} { if { $n == 1 } { # write into a new file and write column names set filePrintMode 0 } else { # append to that file and don't write column names set filePrintMode 2 } set fRow [expr 1000000000*[expr $n-1] + 1] if { $n == $numPrintBlocks } { set nRows [expr $totalRowsPrint - $fRow + 1] } else { set nRows 1000000000 } # shift by the first user-selected row set fRow [expr $fRow + $_exportFirstRow - 1] if { ($_tableType == "ASCII Table") || ($_tableType == "Binary Table") } { if { $_exportselc == 1 } { set collist $_listPreSelectedColNames set collistwidths $listPrintWidths } else { set collist {} set collistwidths {} for {set i 0} { $i < $_dispCols} {incr i} { if {$_colNotchedState($i) == 1} { lappend collist [lindex $_listPreSelectedColNames $i] lappend collistwidths [lindex $listPrintWidths $i] } } } $fFile saveTabToASCII $asciiFileName_ $filePrintMode \ $fRow $nRows \ $collist $collistwidths \ $_exportFixedFormat \ $_exportCSV \ $_exportPrintRowNumbers \ $_exportCharBetweenCols } else { error "Table Type unknown. Export as text not possible." return } # if user presses cancel, stop if {[catch {$win_.f.fdb step}] == 1} { file delete $asciiFileName_ return } } } destroy $win_ } itcl::body Table::tryExport {} { _export } itcl::body Table::_export {} { global g_titleFont set t [urlTail $fileName] set r [file root $t] set e [file ext $t] if { [lsearch -exact [list .gz .Z .z] $e] != -1 } { set e [file ext $r] set r [file root $r] } set origName "${r}.fits\[[expr $currentHDU-1]\]" set sugName "${r}_t[expr $currentHDU-1].fits" set fitsFileName [getSelectedFileName $sugName] if { $fitsFileName == "" } return if { [file exist $fitsFileName] == 1 } { set feedBack [promptMsg "File $fitsFileName exists.\n overwrite?" \ return Yes No] if { $feedBack == "CANCEL" } return } ##### saveas table options catch {destroy .table_saveas} set fileWin .table_saveas powToplevel $fileWin .dummy wm title $fileWin "fv: Export to file options" if { ($_tableType == "ASCII Table") || ($_tableType == "Binary Table") } { wm geometry $fileWin 400x350 } else { wm geometry $fileWin 400x350 } frame $fileWin.f iwidgets::feedback $fileWin.f.fdb -labeltext "Saved" -labelfont g_titleFont pack $fileWin.f.fdb -fill x iwidgets::buttonbox $fileWin.f.bb pack $fileWin.f.bb -side top $fileWin.f.bb add continue -text "Save" \ -command [itcl::code $this _saveTableToFile $fileWin $fitsFileName $origName] -font g_titleFont $fileWin.f.bb add quit -text "Cancel" \ -command "destroy $fileWin" -font g_titleFont ## reset these variables set _exportFirstRow 1 set _exportLastRow $_numRows set _exportFirstCol 1 set _exportLastCol $_dispCols set _exportPrintRowNumbers 0 set _exportCSV 1 set _exportCharBetweenCols " " set _exportFixedFormat 0 set _exportFormat "csv" frame $fileWin.r frame $fileWin.r.r frame $fileWin.r.c # Pan Chai: below is for itcl trace method only. # without using itcl, it will be # "trace variable _exportsel w _updateExportPanelState" # does not seems to do anything.. Do we even need this code? trace variable [itcl::scope _exportsel] w "itcl::code $this _updateExportPanelState" radiobutton $fileWin.r.r.all \ -text "All" -font g_titleFont \ -variable [itcl::scope _exportsel] -value 1 -command [itcl::code $this _updateExportPanelState] # radiobutton $fileWin.r.range \ # -text "From:" -font g_titleFont -variable [itcl::scope _exportsel] -value 2 \ # -command [itcl::code $this _updateExportPanelState] radiobutton $fileWin.r.r.sel \ -text "Selection" -variable [itcl::scope _exportsel] -font g_titleFont -value 3 \ -command [itcl::code $this _updateExportPanelState] $fileWin.r.r.all select # pack $fileWin.allrb -side top # pack $fileWin.rangerb -side top # pack $fileWin.selrb -side top label $fileWin.r.r.l -text "Rows:" grid $fileWin.r.r.l -column 0 -row 0 -pady 10 -sticky w grid $fileWin.r.r.all -column 0 -row 1 -sticky w # grid $fileWin.r.range -column 0 -row 2 -sticky w grid $fileWin.r.r.sel -column 0 -row 3 -sticky w # frame $fileWin.c radiobutton $fileWin.r.c.all \ -text "All" -font g_titleFont \ -variable [itcl::scope _exportcolsel] -value 1 -command [itcl::code $this _updateExportPanelState] # radiobutton $fileWin.c.range \ # -text "From:" -font g_titleFont -variable [itcl::scope _exportcolsel] -value 2 \ # -command [itcl::code $this _updateExportPanelState] radiobutton $fileWin.r.c.sel \ -text "Selection" -variable [itcl::scope _exportcolsel] -font g_titleFont -value 3 \ -command [itcl::code $this _updateExportPanelState] $fileWin.r.c.all select # pack $fileWin.allrb -side top # pack $fileWin.rangerb -side top # pack $fileWin.selrb -side top label $fileWin.r.c.l -text "Columns:" grid $fileWin.r.c.l -column 1 -row 0 -pady 10 -sticky w grid $fileWin.r.c.all -column 1 -row 1 -sticky w # grid $fileWin.c.range -column 0 -row 2 -sticky w grid $fileWin.r.c.sel -column 1 -row 3 -sticky w # iwidgets::entryfield $fileWin.c.fcol -labeltext "" \ # -textvariable [itcl::scope _exportFirstCol] -textfont g_titleFont -labelfont g_titleFont # iwidgets::entryfield $fileWin.c.lcol -labeltext "To:" \ # -textvariable [itcl::scope _exportLastCol] -textfont g_titleFont -labelfont g_titleFont # grid $fileWin.c.fcol -column 1 -row 2 -sticky w # grid $fileWin.c.lcol -column 2 -row 2 -sticky w # not sure if member variables is the best way, or passing variables # along in a [itcl::code $this type args] way, if that's even possible # iwidgets::entryfield $fileWin.frow -labeltext "First Row:" # iwidgets::entryfield $fileWin.r.frow -labeltext "" \ # -textvariable [itcl::scope _exportFirstRow] -textfont g_titleFont -labelfont g_titleFont # iwidgets::entryfield $fileWin.lrow -labeltext "Last Row:" # iwidgets::entryfield $fileWin.r.lrow -labeltext "To:" \ # -textvariable [itcl::scope _exportLastRow] -textfont g_titleFont -labelfont g_titleFont # iwidgets::entryfield $fileWin.rowrange -labeltext "Row Range:" \ # -textvariable [itcl::scope _exportRowRange] -textfont g_titleFont -labelfont g_titleFont # grid .fv_imgsel.label -column 0 -row 0 -columnspan 4 -sticky "snew" # grid $fileWin.r.frow -column 1 -row 2 -sticky w # grid $fileWin.r.lrow -column 2 -row 2 -sticky w # pack $fileWin.frow -side top # pack $fileWin.lrow -side top # pack $fileWin.rowrange -side top # grid $fileWin.r -column 0 -row 0 # grid $fileWin.c -column 1 -row 0 pack $fileWin.r.r -side left -padx 40 pack $fileWin.r.c -side right -padx 40 pack $fileWin.r -side top # pack $fileWin.c -side top # if user wants to choose columns, he should pre-select using right button if { ($_tableType == "ASCII Table") || ($_tableType == "Binary Table") } { # don't allow user to pick column } else { # iwidgets::entryfield $fileWin.fcol -labeltext "First Column:" \ # -textvariable [itcl::scope _exportFirstCol] -textfont g_titleFont -labelfont g_titleFont # iwidgets::entryfield $fileWin.lcol -labeltext "Last Column:" \ # -textvariable [itcl::scope _exportLastCol] -textfont g_titleFont -labelfont g_titleFont # pack $fileWin.fcol -side top # pack $fileWin.lcol -side top } # pack $fileWin.f -side bottom -fill x pack $fileWin.f -side bottom -fill x # grid $fileWin.f -column 0 -row 7 -columnspan 3 -pady 10 -ipadx 90 } itcl::body Table::_saveFile {} { # Save File $fFile save _updateHL } itcl::body Table::_saveAs {} { $fFile saveAs } itcl::body Table::_updateHL {} { # Override this function in descendents } itcl::body Table::_closeFrWm {w} { if { $w == $_droot && !$_isBeingDestroyed } { closeCmd } } itcl::body Table::closeCmd {} { foreach i $_myChildren { itcl::delete object $i } _updateHL _realCloseCmd } itcl::body Table::setFileName { fName_ } { # set fileName $fName_ if ![winfo exists $_droot] return set rName [urlTail $fName_] set dName [getFullDirPath $fName_] wm title $_droot "fv: $_tableType of $rName\[[expr $currentHDU-1]\] in $dName" # wm geometry $_droot 400x200 } itcl::body Table::_realCloseCmd {} { # let the winkeeper know it's gone if { $_isDirPlot == 0 } { .fvwinkeeper signoff $_droot } itcl::delete object $this } itcl::body Table::_updateNumRows {} { #Ziqin Apr 01,04 if { $_tableType == "Image"} { if { [llength [$fFile getImgInfo]] == 1 } { set _numRows [lindex [$fFile getImgInfo] 0] } else { set _numRows [lindex [$fFile getImgInfo] 1] } } else { set _numRows [$fFile getTableInfo nrows] } } itcl::body Table::_initSelRows {} { _updateNumRows for {set i 0} { $i <= $_numRows} {incr i} { set _selectedRows($i) 0 } } itcl::body Table::_updateNumCols {} { # Do nothing here. Override in subclasses } itcl::body Table::_addCols {{colindex -1 } {colname {} } {colformat {}} { colunit {}} {dispformat {}} } { # Init the variables set _addcolname "" set _addcolunit "" set _addcoldisp "" set _addcolform "" set addWin .addCol catch {destroy .addCol} powToplevel $addWin .dummy wm title $addWin "fv : add column info" wm geometry $addWin +[winfo pointerx .]+[winfo pointery .] iwidgets::entryfield $addWin.name -labeltext "Column Name" -labelpos w \ -validate "validColName %c" -fixed 68 -width 10 \ -textvariable [itcl::scope _addcolname] # the format list if { $_tableType == "Binary Table"} { set formatList {{1A - ASCII string} {1L - logical (T or F)} \ {1X - bit} {1B - 1 byte unsigned integer} \ {1I - 2 byte integer} {1J - 4 byte integer}\ {1K - 8 byte integer} \ {1E - 4 byte real} {1D - 8 byte double} \ {1C - 8 byte complex} {1M - 16 byte double complex} } } elseif { $_tableType == "ASCII Table"} { set formatList \ {{A10 - 10 chars ASCII string} {I10 - 10 digits integer} \ {F10.2 - 10 digits real with two sig digits} \ {E10.2 - 10 digits real with exp} \ {D20.10 - 20 digits double with 10 sig digits}} } else { set formatList { } } iwidgets::combobox $addWin.form -labeltext "Column Format" -labelpos w \ -textvariable [itcl::scope _addcolform] -completion 0 eval $addWin.form insert list end $formatList iwidgets::entryfield $addWin.unit -labeltext "Column Unit" -labelpos w \ -fixed 68 -width 10 -textvariable [itcl::scope _addcolunit] iwidgets::entryfield $addWin.disp -labeltext "Display Format" -labelpos w \ -fixed 68 -width 10 -textvariable [itcl::scope _addcoldisp] set tmpList $_listPreSelectedColNames set tmpList [lappend tmpList "End of Table"] # needs to be reset in case it was altered last time set _insColNum "End of Table" iwidgets::combobox $addWin.colist -labeltext "Insert Before" -labelpos w \ -editable 1 -textvariable [itcl::scope _insColNum] eval $addWin.colist insert list end $tmpList if { $colindex !=-1 && $colname != "" } { set _addcolname $colname set _addcolform $colformat set _addcolunit $colunit set _addcoldip $dispformat if { $colindex == "-" } { set colindex "End of Table" } set _insColNum $colindex _addColsToFile $addWin return } if { $colindex != -1 } { $addWin.colist selection clear 0 end $addWin.colist selection set $colindex } grid $addWin.name -row 1 -column 1 -sticky ew -padx 10 -pady 2 grid $addWin.form -row 2 -column 1 -sticky ew -padx 10 -pady 2 grid $addWin.unit -row 3 -column 1 -sticky ew -padx 10 -pady 2 grid $addWin.disp -row 4 -column 1 -sticky ew -padx 10 -pady 2 grid $addWin.colist -row 5 -column 1 -sticky ew -padx 10 -pady 2 iwidgets::Labeledwidget::alignlabels \ $addWin.name $addWin.unit $addWin.form $addWin.colist iwidgets::buttonbox $addWin.bb $addWin.bb add OK -text OK -command [itcl::code $this _addColsToFile $addWin] $addWin.bb add Cancel -text Cancel -command "destroy $addWin" grid $addWin.bb -row 6 -column 1 tkwait window $addWin } itcl::body Table::_addRowsToFile {inWin} { set rowIdx [$inWin.after get] set rowNum [$inWin.number get] regsub -all " " $rowIdx "" tmpIdx regsub -all " " $rowNum "" tmpNum # delete the input window destroy $inWin if { ($tmpIdx == "") || ($tmpNum == "") } { error "Please input number" return } elseif { $tmpIdx=="end" } { set tmpIdx $_numRows } # We asked for row "after", but CFITSIO inserts "before" incr tmpIdx # if { $tmpIdx > $_numRows} { # $fFile addRow $tmpNum # } else { # $fFile insertRow $tmpIdx $tmpNum # } if { $tmpIdx > $_numRows} { $fFile addRow $tmpNum for { set i 1} { $i <=$tmpNum } {incr i} { set _selectedRows([expr $i+$_numRows]) 0 } } else { $fFile insertRow $tmpIdx $tmpNum for { set i $_numRows } { $i >= $tmpIdx } { set i [expr $i -1] } { set _selectedRows([expr $i + $tmpNum]) $_selectedRows($i) } for { set i 0 } { $i < $tmpNum } { incr i} { set _selectedRows([expr $tmpIdx +$i]) 0 } } $fFile changeFile refresh _updateRestDisps } # Add an existing table column to the view itcl::body Table::_addColView { colName_ addPos_ beforeAfter_ } { if { $addPos_ == "END" } { set tmpIdx [llength $_listPreSelectedColNames] } else { set tmpIdx [lsearch $_listPreSelectedColNames $addPos_] if { $beforeAfter_ == "after" } { incr tmpIdx } if { ($tmpIdx == -1) } { error "No such column: $addPos_" return } } set _listPreSelectedColNames [linsert $_listPreSelectedColNames $tmpIdx $colName_] for {set j $_dispCols} {$j > $tmpIdx} {incr j -1} { set _cellWidth($j) $_cellWidth([expr $j-1]) } if { $j < $_dispCols } { unset _cellWidth($j) } refresh } # Remove the column from the view (but don't delete it from the table) itcl::body Table::_delColView { colName_ } { set tmpIdx [lsearch $_listPreSelectedColNames $colName_] if { ($tmpIdx == -1) } { error "No such column: $colName_" return } set _listPreSelectedColNames [lreplace $_listPreSelectedColNames $tmpIdx $tmpIdx] for {set j $tmpIdx} {$j < [expr $_dispCols-1]} {incr j} { set _cellWidth($j) $_cellWidth([expr $j+1]) } unset _cellWidth([expr $_dispCols-1]) refresh } itcl::body Table::_addColsToFile {inWin} { #puts "_addColsToFile start" set addPos $_insColNum # delete the input window destroy $inWin set tmpcolform [lindex $_addcolform 0] regsub -all " " $_addcolname "" tmpName regsub -all " " $_addcolunit "" tmpUnit regsub -all " " $_addcoldisp "" tmpDisp regsub -all " " $tmpcolform "" tmpForm if { ($tmpName == "") || ($tmpForm == "")} { error "Column name/form can't be blank" return } if { $addPos == "End of Table" } { $fFile addColumn $_addcolname $tmpcolform lappend _listPreSelectedColNames $_addcolname lappend _listColNames $_addcolname if { $tmpUnit != "" } { $fFile putKwd "TUNIT[llength $_listColNames] '$tmpUnit'" 1 } if { $tmpDisp != "" } { $fFile putKwd "TDISP[llength $_listColNames] '$tmpDisp'" 1 } } else { set tmpIdx [lsearch $_listPreSelectedColNames $addPos] set tmpIdx1 [lsearch $_listColNames $addPos] if { ($tmpIdx == -1) || ($tmpIdx1 == -1)} { error "No such column" return } $fFile insertCol [expr $tmpIdx1+1] $_addcolname $tmpcolform set _listPreSelectedColNames [linsert $_listPreSelectedColNames $tmpIdx $_addcolname] set _listColNames [linsert $_listColNames $tmpIdx1 $_addcolname] if { $tmpUnit != "" } { $fFile putKwd "TUNIT[expr $tmpIdx1+1] '$tmpUnit'" 1 } if { $tmpDisp != "" } { $fFile putKwd "TDISP[expr $tmpIdx1+1] '$tmpDisp'" 1 } for {set j $_dispCols} {$j > $tmpIdx} {incr j -1} { set _cellWidth($j) $_cellWidth([expr $j-1]) } unset _cellWidth($j) } # let the fFile know that the file has been changed $fFile changeFile # update the displayed table and children refresh _updateRestDisps } itcl::body Table::refresh { {doChildren_ 1} } { if ![info exists _DC(xsize)] return # Re-read table information _readInTable # Check the number of rows and columns in the table set oldNumCols $_numCols set oldNumRows $_numRows _updateNumCols _updateNumRows if { $oldNumCols != $_numCols || $oldNumRows != $_numRows } { _layoutCan $_DC(xsize) $_DC(ysize) _reframe } # recalculate the _firstCol of the last page _getLastFirstCol # redraw the table and more _setHScroll [expr $_firstCol-1] _refacing # Update any children of this table, if they exist if { $doChildren_ } { foreach child $_myChildren { $child refresh } } } itcl::body Table::_delCols {{collist -1}} { if { $_tableType == "Image"} { error "Cannot delete columns in an image" return } # clean the cell selection _unselCell set delColList {} set tmpList {} set j 0 # for {set i 0} { $i < $_dispCols} {incr i} { # if { $_colNotchedState($i) == 1 } { # lappend delColList [lindex $_listPreSelectedColNames $i] # } else { # lappend tmpList [lindex $_listPreSelectedColNames $i] # set _cellWidth($j) $_cellWidth($i) # incr j # } # } for {set i 0} { $i < $_dispCols} {incr i} { if { $collist == -1} { if { $_colNotchedState($i) == 1 } { lappend delColList [lindex $_listPreSelectedColNames $i] } else { lappend tmpList [lindex $_listPreSelectedColNames $i] set _cellWidth($j) $_cellWidth($i) incr j } } else { if { [lsearch -exact [string toupper $collist] [lindex $_listPreSelectedColNames $i]] !=-1 } { lappend delColList [lindex $_listPreSelectedColNames $i] } elseif { [lsearch -exact [string tolower $collist] [lindex $_listPreSelectedColNames $i]] !=-1 } { lappend delColList [lindex $_listPreSelectedColNames $i] } else { lappend tmpList [lindex $_listPreSelectedColNames $i] set _cellWidth($j) $_cellWidth($i) incr j } } } for {} {$j < $_dispCols} {incr j} { unset _cellWidth($j) } set _listPreSelectedColNames $tmpList # update the _firstRow : updateFirst is a fitsTcl command set _firstCol [updateFirst -c $_firstCol $_dispCols] # delete row in the file $fFile delCols $delColList $fFile changeFile # then update table info # _updateNumCols # refresh the table and children refresh _updateRestDisps # reselect the cell _selCell _showselRows } itcl::body Table::_tryDelRows { {range 0} } { if { $range !=0 } { selRowsFromList $range 0 0 } promptMsg \ "Table rows will be permanently deleted.\nAre you sure?" \ [itcl::code $this _delRowsRange] Yes No # [itcl::code $this _delRows] Yes No } itcl::body Table::_tryDelCols {{collist -1}} { promptMsg \ "Table columns will be permanently deleted.\nAre you sure?" \ [itcl::code $this _delCols $collist] Yes No } ######################################################## # # Row Selection # Ziqin Pan, Jan 2004 # itcl::body Table::_setRowStartMark {row} { set _rstart [expr $_firstRow + $row ] set _rend [expr $_firstRow + $row] _selRows _showselRows } itcl::body Table::_setRowEndMark {row} { set _rend [expr $_firstRow + $row ] _selRows _showselRows } itcl::body Table::_unsetRowMark {} { set _rstart "" set _rend "" } itcl::body Table::_showselCheck {} { set rowsel 0 for {set j 1} {$j <= $_numRows} {incr j} { # set realRowNum [expr $_firstRow+$j] if { ($_selectedRows($j) ==1) } { set rowsel 1 break } } if { $rowsel == 1} { if {$_fth !=0 } { $_fth turnsel 1 } if {$_ftp !=0 } { $_ftp turnsel 1 } } else { if {$_fth !=0 } { $_fth turnsel 0 } if {$_ftp !=0 } { $_ftp turnsel 0 } } } itcl::body Table::_showselRows {} { set rowsel 0 for {set j 0} {$j < $_showRows} {incr j} { set realRowNum [expr $_firstRow+$j] if { ($_selectedRows($realRowNum) ==1) } { $_droot.table.can.b$j configure -background yellow set rowsel 1 } else { $_droot.table.can.b$j configure -background $fvPref::globalBgColor } } _showselCheck } itcl::body Table::_selInvert {} { for {set j 0} {$j <= $_numRows} {incr j} { if { ($_selectedRows($j) == 1)} { set _selectedRows($j) 0 } else { set _selectedRows($j) 1 } } _showselRows } itcl::body Table::_selAllRows {} { if { ($_selectAllRows == 1 ) } { for {set j 0} {$j <= $_numRows} {incr j} { set _selectedRows($j) 1 } } else { for {set j 0} {$j <= $_numRows} {incr j} { set _selectedRows($j) 0 } } _showselRows } itcl::body Table::_selRows {} { if { $_rstart > $_rend } { set tmp_rstart $_rend set tmp_rend $_rstart } else { set tmp_rstart $_rstart set tmp_rend $_rend } if { ($_rstart == "") || ($_rend =="") } { return } elseif { ($_rstart == $_rend)} { if { ($_selectedRows($_rstart) == 0) } { set _selectedRows($_rstart) 1 } else { set _selectedRows($_rstart) 0 } } else { for {set i $tmp_rstart} { $i <= $tmp_rend} { incr i} { if { ($_selectedRows($_rstart) == 0) } { set _selectedRows($i) 0 } else { set _selectedRows($i) 1 } } } } ######################################################## # # Cursor Motion Selection # itcl::body Table::_setEndMark {col row} { _unselCell # if { $_oldcstartx == ""} return if { $_oldcstarty == ""} return set _cendx [expr $_firstCol + $col -1] set _cendy [expr $_firstRow + $row -1] if { $_cendx <= $_oldcstartx} { set _cstartx $_cendx set _cendx $_oldcstartx } else { set _cstartx $_oldcstartx } if { $_cendy <= $_oldcstarty} { set _cstarty $_cendy set _cendy $_oldcstarty } else { set _cstarty $_oldcstarty } _selCell _showselRows } itcl::body Table::_unsetMark {} { _unselCell set _oldcstartx "" set _oldcstarty "" set _cstartx "" set _cstarty "" set _cendx "" set _cendy "" } itcl::body Table::_setStartMark {col row {focus True}} { _unsetMark set _cstartx [expr $_firstCol + $col -1] set _cstarty [expr $_firstRow + $row -1] set _oldcstartx $_cstartx set _oldcstarty $_cstarty _copyCell $col $row if { $focus } { focus $_droot.table.can } } itcl::body Table::_copyCell {col_ row_} { _unselCell set _currentCol [expr $_firstCol+ $col_ -1] set _currentRow [expr $_firstRow+ $row_ -1] if { $_currentCol<0 } { set _currentCol 0 } elseif { $_currentCol >= $_dispCols } { set _currentCol [expr $_dispCols-1] } if { $_currentRow<0 } { set _currentRow 0 } elseif { $_currentRow >= $_numRows } { set _currentRow [expr $_numRows-1] } _selCell _showselRows } itcl::body Table::_unselCell {} { # individual cell if { [info exist _currentCol] } { set tmpCol [expr $_currentCol - $_firstCol+1] set tmpRow [expr $_currentRow - $_firstRow+1] if { ($tmpCol >= $_showCols) || ($tmpCol < 0) || ($tmpRow >= $_showRows) \ || ($tmpRow < 0) } { ; } else { set id ${tmpCol}_$tmpRow $_droot.table.can.e$id configure -disabledbackground $fvPref::globalBgColor set _cellVar "" } } # a block of table for {set i 0} { $i < $_showCols} { incr i} { for {set j 0} { $j < $_showRows} { incr j} { set id ${i}_$j $_droot.table.can.e$id configure -disabledbackground $fvPref::globalBgColor } } } itcl::body Table::_selCell {} { #puts "_selCell start" if { [info exist _currentCol] } { set tmpCol [expr $_currentCol - $_firstCol+1] set tmpRow [expr $_currentRow - $_firstRow+1] if { ($tmpCol >= $_showCols) || ($tmpCol < 0) || \ ($tmpRow >= $_showRows) || ($tmpRow < 0) } { $_droot.usrEntry.sel_e config -state disabled } else { $_droot.usrEntry.sel_e config -state normal set id ${tmpCol}_$tmpRow $_droot.table.can.e$id configure -disabledbackground yellow set _cellVar [_getRawData $_currentCol $_currentRow] $_droot.usrEntry.sel_e selection range 0 end } } # a block of table if { ($_cstartx == "") || ($_cstarty == "") || ($_cendx == "") \ || ($_cendy == "") } { return } else { for {set i 0} {$i< $_showCols} {incr i} { set tmpCol [expr $_firstCol +$i -1] if { ($tmpCol >= $_cstartx) && ($tmpCol<=$_cendx) } { for {set j 0} { $j < $_showRows} { incr j} { set tmpRow [expr $_firstRow+$j-1] if { ($tmpRow >= $_cstarty) && ($tmpRow<=$_cendy) } { set id ${i}_$j $_droot.table.can.e$id configure -disabledbackground green } } } } } } itcl::body Table::_cellUp {} { # if no cell is selected do nothing. if { [info exist _currentRow] == 0} return # if up to the first row do nothing. if { $_currentRow <= 0 } return # if the current row is on the last page scroll up if { $_currentRow < $_firstRow} { incr _firstRow -1 refresh 0 } # set tmpCol [expr $_currentCol - $_firstCol+1] set tmpRow [expr $_currentRow - $_firstRow+1] _scrollChildren $_firstRow [expr $_currentRow-1] _setStartMark $tmpCol [expr $tmpRow-1] } itcl::body Table::_cellDown {} { # if no cell selected, do nothing if { [info exist _currentRow] == 0} return # if down to the last row, do nothing if { $_currentRow > $_numRows } return if { $_currentRow >= [expr $_firstRow + $_showRows -2]} { incr _firstRow refresh 0 } set tmpCol [expr $_currentCol - $_firstCol+1] set tmpRow [expr $_currentRow - $_firstRow+1] _scrollChildren $_firstRow [expr $_currentRow+1] _setStartMark $tmpCol [expr $tmpRow+1] } itcl::body Table::_pageUp {} { _unselCell if { [expr $_firstRow - $_showRows +1 ] < 1} { set _firstRow 1 } else { set _firstRow [expr $_firstRow - $_showRows + 1 ] } refresh 0 _selCell _showselRows _scrollChildren $_firstRow $_currentRow } itcl::body Table::_pageDown {} { _unselCell if { [expr $_firstRow + $_showRows -1] > [expr $_numRows - $_showRows +1]} { set _firstRow [expr $_numRows - $_showRows +1] } else { set _firstRow [expr $_firstRow + $_showRows -1] } refresh 0 _selCell _showselRows _scrollChildren $_firstRow $_currentRow } itcl::body Table::_jumpTo { colName } { set colIdx 0 if { $colName != "0" && $colName != "end" } { set colIdx [lsearch -exact $_listPreSelectedColNames $colName] } if { $colName == "end" } { set colIdx [expr [llength $_listPreSelectedColNames] - 1 ] } _setHScroll $colIdx } itcl::body Table::_cellLeft {} { # if no cell is selected do nothing. if { [info exist _currentCol] == 0} return # if left to the first row do nothing. if { $_currentCol <= 0 } return # real move if { $_currentCol < $_firstCol } { _setHScroll [expr $_firstCol -2] } # set tmpCol [expr $_currentCol - $_firstCol+1] set tmpRow [expr $_currentRow - $_firstRow+1] _setStartMark [expr $tmpCol-1] $tmpRow } itcl::body Table::_cellRight {} { # if no cell is selected do nothing. if { [info exist _currentCol] == 0} return # if right to the last row do nothing. if { $_currentCol > $_dispCols } return # real move while { $_currentCol >= [expr $_firstCol+$_showCols-2] \ && [expr $_firstCol+$_showCols]<=$_dispCols } { _setHScroll $_firstCol } # set tmpCol [expr $_currentCol - $_firstCol+1] set tmpRow [expr $_currentRow - $_firstRow+1] _setStartMark [expr $tmpCol+1] $tmpRow } itcl::body Table::_editCell {} { if { [$_droot.usrEntry.sel_e cget -state]=="disabled" } return if { $_cellVar=="" } { # Reset value _selCell } else { _modifyTableCell $_currentCol $_currentRow $_cellVar } focus $_droot.table.can $_droot.usrEntry.sel_e selection range 0 end } # # End Cursor Motion Selection # ########################################################### itcl::body Table::getFatherFitsExtension {} { return $_fatherFitsExtension } # called by VectorTable to get details of the column that gave birth to the # VectorTable itcl::body Table::getColumnInfo {name_ index_} { return [set ${name_}($index_)] } itcl::body Table::_calculateCmd {} { set cal ".cal_[namespace tail $this]" if { [winfo exist $cal] == 1 } { raise $cal return } set calList [getCalcCols] FitsCalculator $cal $this $calList $cal configure -title "fv: Calculator" } itcl::body Table::getCalcCols {} { # pick out the variable-length and zero-lngth vector columns from the calculator set calList {} for {set i 0} {$i < $_dispCols} {incr i} { if { $_columnVecSize($i) > 0 } { lappend calList [lindex $_listPreSelectedColNames $i] } } return $calList } itcl::body Table::calculateCols {colname_ colform_ formula_ calselonly_} { if { $calselonly_ == 0 } { set selrange "1-$_numRows" set result [catch {set isNew \ [$fFile addColumnFrExpr $colname_ $colform_ $formula_ $selrange] } err] } else { set selrange "" set start_end "1-$_numRows" append selrange [_parseToRowRange $start_end] if { $selrange !="" } { set fileID [open out w 0600] close $fileID set result [catch {set isNew \ [$fFile addColumnFrExpr $colname_ $colform_ $formula_ $selrange] } err] } else { set isNew 0 set result 0 } } if { $result == 1 } { error "Calculation failed\n$err" } $fFile changeFile if { $isNew == 1 } { lappend _listPreSelectedColNames $colname_ } _updateNumCols _reframe refresh _updateRestDisps } itcl::body Table::_updateRestDisps {} { # Update any other windows attached to this extension $_fatherFitsExtension updateDisps $this } itcl::body Table::_sortCmd {} { global g_titleFont catch {destroy .fvsort} powToplevel .fvsort .dummy wm title .fvsort "fv: Sort" _resetSKey set [itcl::scope _isUniqMerge] 0 label .fvsort.label -text "Select column name for sorting" -font g_titleFont label .fvsort.lbl -text "Columns" -font g_titleFont listbox .fvsort.lb -yscrollcommand ".fvsort.sb set" -font g_titleFont scrollbar .fvsort.sb -command ".fvsort.lb yview" checkbutton .fvsort.fkeyc -variable [itcl::scope _psortcheck] \ -selectcolor $fvPref::checkBBgColor \ -font g_titleFont \ -activeforeground black -activebackground $fvPref::globalBgColor \ -width 0 checkbutton .fvsort.skeyc -variable [itcl::scope _ssortcheck] \ -selectcolor $fvPref::checkBBgColor \ -font g_titleFont \ -activeforeground black -activebackground $fvPref::globalBgColor \ -width 0 checkbutton .fvsort.tkeyc -variable [itcl::scope _tsortcheck] \ -selectcolor $fvPref::checkBBgColor \ -font g_titleFont \ -activeforeground black -activebackground $fvPref::globalBgColor \ -width 0 frame .fvsort.fsep -relief raised -borderwidth 2 -height 4 frame .fvsort.fsep1 -relief raised -borderwidth 2 -height 4 checkbutton .fvsort.merge -variable [itcl::scope _isUniqMerge] \ -selectcolor $fvPref::checkBBgColor -text No \ -font g_titleFont \ -activeforeground black -activebackground $fvPref::globalBgColor \ -width 0 -command [itcl::code $this _changeUniqLabel] label .fvsort.mlabel -text "Delete multiple rows that have the same sort column values?" \ -font g_titleFont button .fvsort.fkeyb -text "Primary Column" -command [itcl::code $this _getSortKey 1] -font g_titleFont button .fvsort.skeyb -text "Second Column" -command [itcl::code $this _getSortKey 2] -font g_titleFont button .fvsort.tkeyb -text "Third Column" -command [itcl::code $this _getSortKey 3] -font g_titleFont entry .fvsort.fkeye -textvariable [itcl::scope _psortkey] -font g_titleFont entry .fvsort.skeye -textvariable [itcl::scope _ssortkey] -font g_titleFont entry .fvsort.tkeye -textvariable [itcl::scope _tsortkey] -font g_titleFont label .fvsort.ascend -text "Ascending ?" -font g_titleFont label .fvsort.help -text "Select Column(s) for sorting" -font g_titleFont iwidgets::buttonbox .fvsort.bb .fvsort.bb add sort -text "Sort" -command [itcl::code $this _sortColumn] -font g_titleFont .fvsort.bb add clear -text "Clear" -command [itcl::code $this _resetSKey] -font g_titleFont .fvsort.bb add cancel -text "Close" -command "destroy .fvsort" -font g_titleFont .fvsort.bb add help -text "Help" -command "hhelp sortColumn" -font g_titleFont foreach i $_listPreSelectedColNames { .fvsort.lb insert end $i } grid configure .fvsort.lbl -column 0 -row 0 -sticky "snew" grid configure .fvsort.lb -column 0 -row 1 -sticky "snew" -rowspan 7 grid configure .fvsort.sb -column 1 -row 1 -sticky "snew" -rowspan 7 grid configure .fvsort.ascend -column 2 -row 0 -sticky "snew" grid configure .fvsort.help -column 3 -row 0 -sticky "snew" -columnspan 2 grid configure .fvsort.fkeyc -column 2 -row 1 -sticky "snew" grid configure .fvsort.fkeyb -column 3 -row 1 -sticky "snew" grid configure .fvsort.fkeye -column 4 -row 1 -sticky "snew" grid configure .fvsort.skeyc -column 2 -row 2 -sticky "snew" grid configure .fvsort.skeyb -column 3 -row 2 -sticky "snew" grid configure .fvsort.skeye -column 4 -row 2 -sticky "snew" grid configure .fvsort.tkeyc -column 2 -row 3 -sticky "snew" grid configure .fvsort.tkeyb -column 3 -row 3 -sticky "snew" grid configure .fvsort.tkeye -column 4 -row 3 -sticky "snew" grid configure .fvsort.fsep -column 2 -row 4 -sticky "ew" \ -columnspan 3 grid configure .fvsort.merge -column 2 -row 5 -sticky "snew" grid configure .fvsort.mlabel -column 3 -row 5 -columnspan 2 \ -sticky "w" grid configure .fvsort.fsep1 -column 2 -row 6 -sticky "ew" \ -columnspan 3 grid configure .fvsort.bb -column 2 -row 7 -sticky "snew" -columnspan 3 } itcl::body Table::_resetSKey {} { set _psortkey "" set _ssortkey "" set _tsortkey "" set _psortcheck 1 set _ssortcheck 1 set _tsortcheck 1 } itcl::body Table::_getSortKey {key_} { if { [catch {set curSel [lindex $_listPreSelectedColNames [.fvsort.lb curselection]]} \ err] == 1 } { error "Please Select a column name from left-hand window first" return } switch $key_ { 1 { set _psortkey $curSel } 2 { set _ssortkey $curSel } 3 { set _tsortkey $curSel } default { error "Unknown key" return } } } itcl::body Table::_sortColumn {} { set sortkey "" set sortcheck "" if { $_psortkey == "" } { error "You need to select at least the primary key for sorting" return } else { lappend sortkey $_psortkey lappend sortcheck $_psortcheck } if { $_ssortkey != ""} { lappend sortkey $_ssortkey lappend sortcheck $_ssortcheck } if { $_tsortkey != ""} { lappend sortkey $_tsortkey lappend sortcheck $_tsortcheck } doSort $sortkey $sortcheck $_isUniqMerge destroy .fvsort } itcl::body Table::doSort { keys_ dirs_ unique_ } { if { [catch {set rowlist [$fFile sort $keys_ $dirs_ $unique_ ]} err] } { error "Sort failed: $err" return } set rowlist [lindex $rowlist 0] set rowlen [llength $rowlist] for { set i 0 } { $i <$rowlen } { incr i} { set j [lindex $rowlist $i] set tmplist([expr $i +1]) $_selectedRows($j) } for { set i 1} { $i <=$rowlen } { incr i} { set _selectedRows($i) $tmplist($i) } set sortRowResultList $rowlist # _showselRows $fFile changeFile refresh _updateRestDisps } itcl::body Table::_cpyToCB {} { # if nothing is selected return if { $_cstartx == "" } return set colStart $_cstartx if { $_cendx=="" } { set colEnd $_cstartx } else { set colEnd $_cendx } set rowStart $_cstarty if { $_cendy=="" } { set rowEnd $rowStart } else { set rowEnd $_cendy } set clipType "table" set dx [expr $colEnd-$colStart+1] set dy [expr $rowEnd-$rowStart+1] set dataList [_getRawDataBlock $colStart $rowStart $colEnd $rowEnd] fvClipBoard register $clipType $fileName "${dx}x${dy}" $dataList } itcl::body Table::_cpyFrCB {} { # make sure the insert point is present if { [info exist _currentCol] == 0} { error "Please highlight the insert point" return } # get info from the clipboard if { [fvClipBoard hasRec] } { set cbinfo [fvClipBoard report] set clipType [lindex $cbinfo 0] set clipData [lindex $cbinfo 2] if { $clipType == "table" } { $fFile changeFile # Clip to Table size set nCols [llength $clipData] if { [expr $nCols+$_currentCol] > $_numCols } { set clipData [lrange $clipData 0 [expr $_numCols-$_currentCol-1] ] } set nRows [llength [lindex $clipData 0]] if { [expr $nRows+$_currentRow] > $_numRows } { set lRow [expr $_numRows-$_currentRow-1] set newData {} foreach c $clipData { lappend newData [lrange $c 0 $lRow] } set clipData $newData } _putRawDataBlock $_currentCol $_currentRow $clipData } else { error "The clipboard currently contains \"$clipType\" data. Cannot\ paste this into a table." } } refresh } itcl::body Table::_changeUniqLabel {} { if { $_isUniqMerge == 1} { .fvsort.merge configure -text Yes } else { .fvsort.merge configure -text No } } itcl::body Table::_statCmd {} { global g_titleFont catch {destroy .fvstat} powToplevel .fvstat .dummy wm title .fvstat "fv: Column Statistics" label .fvstat.lbl -text "Select column:" -font g_titleFont listbox .fvstat.lb -yscrollcommand ".fvstat.sb set" -font g_titleFont scrollbar .fvstat.sb -command ".fvstat.lb yview" foreach i $_listPreSelectedColNames { .fvstat.lb insert end $i } bind .fvstat.lb [itcl::code $this _statSelCmd] bind .fvstat.lb [itcl::code $this _statSelCmd] label .fvstat.namel -text "Column Name" -font g_titleFont label .fvstat.numl -text "Number of values" -font g_titleFont label .fvstat.minl -text "Min" -font g_titleFont label .fvstat.maxl -text "Max" -font g_titleFont label .fvstat.meanl -text "Mean" -font g_titleFont label .fvstat.fminl -text "First minimum in row" -font g_titleFont label .fvstat.fmaxl -text "First maximum in row" -font g_titleFont label .fvstat.stdl -text "Standard deviation" -font g_titleFont label .fvstat.rowrangel -text "Row range" -font g_titleFont checkbutton .fvstat.selonly -text "Use selected rows" \ -font g_titleFont \ -variable [itcl::scope _statselonly ] \ -selectcolor $fvPref::checkBBgColor \ -activeforeground black -activebackground $fvPref::globalBgColor \ -command [itcl::code $this _statSelCmd] set [itcl::scope _colSName($this)] "" set [itcl::scope _colNumVal($this)] "" set [itcl::scope _colMin($this)] "" set [itcl::scope _colMax($this)] "" set [itcl::scope _colMean($this)] "" set [itcl::scope _colFMin($this)] "" set [itcl::scope _colFMax($this)] "" set [itcl::scope _colStd($this)] "" set _colRowRange($this) "" entry .fvstat.namee -textvariable [itcl::scope _colSName($this)] \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -relief raised -borderwidth 1 -stat disabled -font g_titleFont entry .fvstat.nume -textvariable [itcl::scope _colNumVal($this)] \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -relief raised -borderwidth 1 -stat disabled -font g_titleFont entry .fvstat.mine -textvariable [itcl::scope _colMin($this)] \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -relief raised -borderwidth 1 -stat disabled -font g_titleFont entry .fvstat.maxe -textvariable [itcl::scope _colMax($this)] \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -relief raised -borderwidth 1 -stat disabled -font g_titleFont entry .fvstat.meane -textvariable [itcl::scope _colMean($this)] \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -relief raised -borderwidth 1 -stat disabled -font g_titleFont entry .fvstat.fmine -textvariable [itcl::scope _colFMin($this)] \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -relief raised -borderwidth 1 -stat disabled -font g_titleFont entry .fvstat.fmaxe -textvariable [itcl::scope _colFMax($this)] \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -relief raised -borderwidth 1 -stat disabled -font g_titleFont entry .fvstat.stde -textvariable [itcl::scope _colStd($this)] \ -disabledforeground black \ -disabledbackground $fvPref::globalBgColor \ -relief raised -borderwidth 1 -stat disabled -font g_titleFont entry .fvstat.rowrange -textvariable [itcl::scope _colRowRange($this)] -font g_titleFont bind .fvstat.rowrange +[itcl::code $this _statSelCmd] button .fvstat.ok -text Close -command "destroy .fvstat" -font g_titleFont button .fvstat.help -text Help -command "hhelp columnStatistics" -font g_titleFont grid configure .fvstat.lbl -column 0 -row 0 -columnspan 2 \ -sticky "snew" grid configure .fvstat.lb -column 0 -row 1 -rowspan 10 \ -sticky "snew" grid configure .fvstat.sb -column 1 -row 1 -rowspan 10 \ -sticky "snw" #add by ziqin pan grid configure .fvstat.namel -column 2 -row 0 \ -sticky "snw" grid configure .fvstat.numl -column 2 -row 1 \ -sticky "snw" grid configure .fvstat.minl -column 2 -row 2 \ -sticky "snw" grid configure .fvstat.maxl -column 2 -row 3 \ -sticky "snw" grid configure .fvstat.meanl -column 2 -row 4 \ -sticky "snw" grid configure .fvstat.fminl -column 2 -row 5 \ -sticky "snw" grid configure .fvstat.fmaxl -column 2 -row 6 \ -sticky "snw" grid configure .fvstat.stdl -column 2 -row 7 \ -sticky "snw" grid configure .fvstat.rowrangel -column 2 -row 8 \ -sticky "snw" grid configure .fvstat.namee -column 3 -row 0 \ -sticky "snew" grid configure .fvstat.nume -column 3 -row 1 \ -sticky "snew" grid configure .fvstat.mine -column 3 -row 2 \ -sticky "snew" grid configure .fvstat.maxe -column 3 -row 3 \ -sticky "snew" grid configure .fvstat.meane -column 3 -row 4 \ -sticky "snew" grid configure .fvstat.fmine -column 3 -row 5 \ -sticky "snew" grid configure .fvstat.fmaxe -column 3 -row 6 \ -sticky "snew" grid configure .fvstat.stde -column 3 -row 7 \ -sticky "snew" grid configure .fvstat.rowrange -column 3 -row 8 \ -sticky "snew" #add by Ziqin Pan, Feb 18, 2004 grid configure .fvstat.selonly -column 2 -row 9 \ -sticky "snew" -columnspan 2 -pady 10 # grid configure .fvstat.ok -column 2 -row 10 \ -sticky "s" grid configure .fvstat.help -column 3 -row 10 \ -sticky "s" } #Add by Ziqin Pan, Jan, 2004 itcl::body Table::_parseToRowRange {start_end} { set tmplist [split $start_end "-"] set tmplistlen [llength $tmplist] if {$tmplistlen <1 } { set start 1 set end $_numRows } elseif { $tmplistlen ==1} { set start [lindex $tmplist 0] set end $start } else { set start [lindex $tmplist 0] set end [lindex $tmplist 1] } if { $start < 1 } { set start 1 } if { $end < 1 } { set end 1 } if { $start > $_numRows } { set start $_numRows } if { $end > $_numRows } { set end $_numRows } set selrange "" for {set i $start} { $i <= $end} {incr i} { if { $_selectedRows($i) == 1} { for {set j $i} { $j <= $end} {incr j} { if { $_selectedRows($j) == 0} { break } } if { $selrange =="" } { append selrange $i "-" [expr $j - 1] } else { append selrange "," $i "-" [expr $j - 1] } set i $j } } return $selrange } itcl::body Table::_statSelCmd {} { set tmpindex [.fvstat.lb curselection] if {$tmpindex == "" } return set tmpName [.fvstat.lb get $tmpindex] # set _colRowRange($this) [string trim $_colRowRange($this) " " ] if { $_colRowRange($this) == "" } { set tmprange "1-$_numRows" } else { # set tmprange [split $_colRowRange($this) ","] set tmprange $_colRowRange($this) } if { $_statselonly == 0 } { set paramList [$fFile getColStat $tmpName 1 $tmprange] } else { set selrange "" set tmplist [split $tmprange ","] set numlist [llength $tmplist] for { set k 0 } {$k <$numlist } {incr k} { set start_end [lindex $tmplist $k] if { $selrange =="" } { append selrange [_parseToRowRange $start_end] } else { append selrange "," [_parseToRowRange $start_end] } } if { $selrange == "" } { set paramList {"" "" "" "" "" "" 0} } else { set paramList [$fFile getColStat $tmpName 1 $selrange] } } .fvstat.namee configure -state normal .fvstat.mine configure -state normal .fvstat.maxe configure -state normal .fvstat.meane configure -state normal .fvstat.fmine configure -state normal .fvstat.fmaxe configure -state normal .fvstat.stde configure -state normal set [itcl::scope _colSName($this)] $tmpName set [itcl::scope _colMin($this)] [lindex $paramList 0] set [itcl::scope _colFMin($this)] [lindex $paramList 1] set [itcl::scope _colMax($this)] [lindex $paramList 2] set [itcl::scope _colFMax($this)] [lindex $paramList 3] set [itcl::scope _colMean($this)] [lindex $paramList 4] set [itcl::scope _colStd($this)] [lindex $paramList 5] set [itcl::scope _colNumVal($this)] [lindex $paramList 6] .fvstat.namee configure -state disabled .fvstat.mine configure -state disabled .fvstat.maxe configure -state disabled .fvstat.meane configure -state disabled .fvstat.fmine configure -state disabled .fvstat.fmaxe configure -state disabled .fvstat.stde configure -state disabled } # column of string can be left or right justified. itcl::body Table::_makeJustification {} { for {set i 0} {$i < $_showCols} {incr i} { set tmpIndex [expr $_firstCol + $i -1] if { [regexp A $_columnType($tmpIndex)] == 1} { for {set j 0} { $j< $_showRows} {incr j} { set id ${i}_$j if { $fvPref::ifLeftJustifyString == 0} { $_droot.table.can.e$id configure -justify right } else { $_droot.table.can.e$id configure -justify left } } } else { for {set j 0} { $j< $_showRows} {incr j} { set id ${i}_$j $_droot.table.can.e$id configure -justify right } } } } itcl::body Table::bringToFront {} { if { $_droot == "" || ![winfo exists $_droot] } {return 0} if { ![winfo ismapped $_droot] } { wm deiconify $_droot } raise $_droot focus $_droot return 1 } itcl::body Table::_openVectorTable { colNum_ } { set fV [VectorTable #auto $colNum_ $this] $fV makeTable $_extNum } itcl::body Table::_ds9MakePlot1 { rowNum_ range xColumn_ yColumn_ {xeColumn_ ""} {yeColumn_ ""} {inCurrGraph_ 0}} { global g_backupDir global DS9plotName #puts _ds9MakePlot1 #puts "_listPreSelectedColNames: $_listPreSelectedColNames" #puts "xColumn_: $xColumn_" #puts "yColumn_: $yColumn_" set tmpfile ${g_backupDir}/ds9PlotTemp_[clock seconds].data #puts "tmpfile: $tmpfile" if [file exists $tmpfile] { file delete -force $tmpfile } if { [catch {set newDataFile [open $tmpfile "w"]} err] } { puts $err error $err return } # load the data with specific rowNum_ into the tmpfile # set range "[expr $rowNum_ - 1]-[expr $rowNum_ - 1]" #set range "$fRow-$lRow" set col 0 set totalCol 2 set colIdx -1 set colIdxY -1 foreach name $_listPreSelectedColNames { if { [string first $name $xColumn_] >= 0 } { set searchX $name set colIdx [lsearch $_listPreSelectedColNames $name] break } } foreach name $_listPreSelectedColNames { if { [string first $name $yColumn_] >= 0 } { set searchY $name set colIdxY [lsearch $_listPreSelectedColNames $name] break } } set findXColumn true if { $colIdx < 0 } { set findXColumn false } set findYColumn true if { $colIdxY < 0 } { set findYColumn false } if { $findYColumn == "true" && $findXColumn == "false" } { set colIdx $colIdxY set xColumn_ $yColumn_ } set key [$fFile getKeyword TFORM[expr $colIdx + 1]] #puts "key: $key" set value "[string trim [lindex [lindex $key 0] 1] {' ()}]" #puts "value: $value" # set value [string range $value 0 [expr [string length $value] - 2]] regsub -all {[a-zA-Z]} $value {} value #puts "after value: $value" if { $value == "" } { set value 1 } # take care x error or y error set errorIdxX -1 set errorIdxY -1 foreach name $_listPreSelectedColNames { if { [string first $name $xeColumn_] >= 0 } { set errorIdxX [lsearch $_listPreSelectedColNames $name] break } } foreach name $_listPreSelectedColNames { if { [string first $name $yeColumn_] >= 0 } { set errorIdxY [lsearch $_listPreSelectedColNames $name] break } } set findXerr true if { $errorIdxX < 0 || $xeColumn_ ==""} { set findXerr false } set findYerr true if { $errorIdxY < 0 || $yeColumn_ ==""} { set findYerr false } #puts "check value: $value, range: $range" set col 1 # for { set col 1 } { $col <= $value } {incr col} { set data [_getDataForAxis "x" $xColumn_ $range] #puts "data : $data" set tokens [ptr2lst [lindex $data 0] [lindex $data 1] [lindex $data 2]] if { $colIdxY >= 0 } { set data2 [_getDataForAxis "y" $yColumn_ $range] set tokens2 [ptr2lst [lindex $data2 0] [lindex $data2 1] [lindex $data2 2]] } #puts "data2 : $data2" if { $errorIdxX >=0 } { set errData [_getDataForAxis "xe" $xeColumn_ $range] set errTokens [ptr2lst [lindex $errData 0] [lindex $errData 1] [lindex $errData 2]] } if { $errorIdxY >=0 } { set errData2 [_getDataForAxis "ye" $yeColumn_ $range] set errTokens2 [ptr2lst [lindex $errData2 0] [lindex $errData2 1] [lindex $errData2 2]] } set monoflag 1 for { set i 0 } { $i < [llength $tokens] } {incr i} { if { $findXColumn == "true" && $findYColumn == "true" } { set finalStr [format "%s %s" [lindex $tokens $i] [lindex $tokens2 $i]] } elseif { $xColumn_ == "RowNumber" } { set finalStr [format "%s %s" [expr $i + 1] [lindex $tokens $i]] } elseif { $yColumn_ == "RowNumber" } { set finalStr [format "%s %s" [lindex $tokens $i] [expr $i + 1]] } else { if { $findXColumn == "false" } { set finalStr [format "%s %s" $col [lindex $tokens $i]] } else { set finalStr [format "%s %s" [lindex $tokens $i] $col] } } if { $findXerr } { set finalStr [format "%s %s" $finalStr [lindex $errTokens $i] ] } if { $findYerr } { set finalStr [format "%s %s" $finalStr [lindex $errTokens2 $i] ] } set finalTokens [split $finalStr " "] if { $monoflag == 1 } { if { $i ==0 } { set xval [lindex $finalTokens 0] } elseif { $i == 1} { set xval2 [lindex $finalTokens 0] } else { set xval3 [lindex $finalTokens 0] if { $xval <= $xval2 && $xval2 <= $xval3 } { } elseif { $xval >= $xval2 && $xval2 >= $xval3 } { } else { set monoflag 0 } #puts "1:$xval, 2:$xval2, 3:$xval3, mono:$monoflag" set xval $xval2 set xval2 $xval3 } } puts $newDataFile $finalStr } # } close $newDataFile set err "none" catch {exec xpaaccess ds9} result #puts "result: $result" if { [string range $result 0 1] == "no" } { # start DS9 if DS9 isn't there if { [catch {exec ds9 &} ds9pid] } { file delete $tmpfile if { [tk_dialog .saoError "DS9 startup error.. Cannot start DS9!\nUse POW instead?" \ question 0 Yes No] == 0 } { close $fFile return NO_YET } close $fFile return DONE } # wait till ds9 is up set flag 1 set nSecs 0 while { $flag } { after 1000 incr nSecs catch {exec xpaaccess ds9} result if { [string range $result 0 2] == "yes" } { set flag 0 } else { if { $nSecs > 10 } { file delete $tmpfile if { [tk_dialog .saoError "DS9 startup error.. Cannot start ds9!\nUse POW instead?" \ question 0 Yes No] == 0 } { close $fFile return NO_YET } close $fFile return DONE } } } } if { $rowNum_ == "NONE" } { set displayName [file tail $fileName] } else { set displayName [format "%s\(%s\)" [file tail $fileName] [expr $rowNum_ + 1]] } #puts "ready to call DS9" #puts "displayName: $displayName" if {$inCurrGraph_ == 1} { set ds9plotList {} catch {exec xpaget ds9 plot} result set ds9plotList [split $result " "] #puts "ds9plotList: $ds9plotList" if ![info exists DS9plotName] { set inCurrGraph_ 0 } else { #puts "DS9plotName: $DS9plotName" if { [lsearch -exact $ds9plotList $DS9plotName] < 0 } { set inCurrGraph_ 0 } else { if { $findXerr && $findYerr } { exec xpaset ds9 plot $DS9plotName data xyexey < $tmpfile } elseif { $findXerr } { exec xpaset ds9 plot $DS9plotName data xyex < $tmpfile } elseif { $findYerr } { exec xpaset ds9 plot $DS9plotName data xyey < $tmpfile } else { exec xpaset ds9 plot $DS9plotName data xy < $tmpfile } } } } if {$inCurrGraph_ == 0} { set DS9plotName ds9plot_[clock seconds] #puts "ready to print" if { $findXerr && $findYerr } { exec xpaset ds9 plot new name $DS9plotName $displayName $xColumn_ $yColumn_ xyexey < $tmpfile } elseif { $findXerr } { exec xpaset ds9 plot new name $DS9plotName $displayName $xColumn_ $yColumn_ xyex < $tmpfile } elseif { $findYerr } { exec xpaset ds9 plot new name $DS9plotName $displayName $xColumn_ $yColumn_ xyey < $tmpfile } else { exec xpaset ds9 plot new name $DS9plotName $displayName $xColumn_ $yColumn_ xy < $tmpfile } } if { $monoflag == 0 } { exec xpaset -p ds9 plot line discrete diamond exec xpaset -p ds9 plot view line no exec xpaset -p ds9 plot view discrete yes } else { exec xpaset -p ds9 plot view line yes exec xpaset -p ds9 plot view discrete no } # if { $totalCol > 2 } { # exec xpaset ds9 analysis plot $displayName $xColumn_ $yColumn_ \ # $totalCol < $tmpfile # } else { # exec xpaset ds9 analysis plot $displayName $xColumn_ $yColumn_ 2 < $tmpfile # } # file delete $tmpfile return DONE } itcl::body Table::_ds9MakePlot { rowNum_ fRow lRow xColumn_ yColumn_ {xeColumn_ ""} {yeColumn_ ""} } { global g_backupDir global DS9plotName #puts _ds9MakePlot #puts "_listPreSelectedColNames: $_listPreSelectedColNames" #puts "xColumn_: $xColumn_" #puts "yColumn_: $yColumn_" set tmpfile ${g_backupDir}/ds9PlotTemp.data if [file exists $tmpfile] { file delete -force $tmpfile } if { [catch {set newDataFile [open $tmpfile "w"]} err] } { error $err return } # load the data with specific rowNum_ into the tmpfile # set range "[expr $rowNum_ - 1]-[expr $rowNum_ - 1]" set range "$fRow-$lRow" set col 0 set totalCol 2 set findXColumn true set colIdx [lsearch $_listPreSelectedColNames $xColumn_] #puts "colIdx: $colIdx" if { $colIdx < 0 } { set findXColumn false } set findYColumn true set colIdxY [lsearch $_listPreSelectedColNames $yColumn_] if { $colIdxY < 0 } { set findYColumn false } if { $findYColumn == "true" && $findXColumn == "false" } { set colIdx $colIdxY } set key [$fFile getKeyword TFORM[expr $colIdx + 1]] set value "[string trim [lindex [lindex $key 0] 1] {' ()}]" set value [string range $value 0 [expr [string length $value] - 2]] if { $value == "" } { set value 1 } # take care x error or y error if { $xeColumn_ != "" || $yeColumn_ != "" } { if { $xeColumn_ != "" } { set errorIdx [lsearch $_listPreSelectedColNames $xeColumn_] set thirdCol $xeColumn_ } else { set errorIdx [lsearch $_listPreSelectedColNames $yeColumn_] set thirdCol $yeColumn_ } incr totalCol } #puts "value: $value" for { set col 1 } { $col <= $value } {incr col} { set data [$fFile getVectorTableAsRawList [lindex $_listPreSelectedColNames $colIdx] $col $range] set tokens [split $data " "] if { $colIdxY >= 0 } { set data2 [$fFile getVectorTableAsRawList [lindex $_listPreSelectedColNames $colIdxY] $col $range] set tokens2 [split $data2 " "] } if { $xeColumn_ != "" || $yeColumn_ != "" } { if { $errorIdx >= 0 } { set errRata [$fFile getVectorTableAsRawList [lindex $_listPreSelectedColNames $errorIdx] $col $range] set errTokens [split $errData " "] } } for { set i 0 } { $i < [llength $tokens] } {incr i} { if { $findXColumn == "true" && $findYColumn == "true" } { set finalStr [format "%s %s" [lindex $tokens $i] [lindex $tokens2 $i]] } elseif { $xColumn_ == "RowNumber" } { set finalStr [format "%s %s" [expr $i + 1] [lindex $tokens $i]] } elseif { $yColumn_ == "RowNumber" } { set finalStr [format "%s %s" [lindex $tokens $i] [expr $i + 1]] } else { if { $findXColumn == "false" } { set finalStr [format "%s %s" $col [lindex $tokens $i]] } else { set finalStr [format "%s %s" [lindex $tokens $i] $col] } } if { $xeColumn_ != "" || $yeColumn_ != "" } { if { $errorIdx >= 0 } { set finalStr [format "%s %s" $finalStr [lindex $errTokens $i]] } else { if { $xeColumn_ == "RowNumber" || $yeColumn_ == "RowNumber"} { set finalStr [format "%s %s" $finalStr [expr $i + 1]] } else { set finalStr [format "%s %s" $finalStr $col] } } } puts $newDataFile $finalStr } } close $newDataFile set err "none" catch {exec xpaaccess ds9} result if { [string range $result 0 1] == "no" } { # start DS9 if DS9 isn't there if { [catch {exec ds9 &} ds9pid] } { file delete $tmpfile if { [tk_dialog .saoError "DS9 startup error.. Cannot start DS9!\nUse POW instead?" \ question 0 Yes No] == 0 } { close $fFile return NO_YET } close $fFile return DONE } # wait till ds9 is up set flag 1 set nSecs 0 while { $flag } { after 1000 incr nSecs catch {exec xpaaccess ds9} result if { [string range $result 0 2] == "yes" } { set flag 0 } else { if { $nSecs > 10 } { file delete $tmpfile if { [tk_dialog .saoError "DS9 startup error.. Cannot start ds9!\nUse POW instead?" \ question 0 Yes No] == 0 } { close $fFile return NO_YET } close $fFile return DONE } } } } if { $rowNum_ == "NONE" } { set displayName [file tail $fileName] } else { set displayName [format "%s\(%s\)" [file tail $fileName] [expr $rowNum_ + 1]] } #puts "displayName: $displayName" #puts "tmpfile: $tmpfile" set DS9plotName ds9plot_[clock seconds] # if { $totalCol > 2 } { # exec xpaset ds9 plot new name $displayName $displayName $xColumn_ $yColumn_ \ # $thirdCol $totalCol < $tmpfile # } else { exec xpaset ds9 plot new name $DS9plotName $displayName $xColumn_ $yColumn_ xy < $tmpfile # } file delete $tmpfile return DONE } itcl::body Table::_plotVectorTableRow { colIdx rowNum_ } { if { $fvPref::imgDisplayer == "DS9" } { # display is for DS9 set flag "NOT_YET" # ds9 file start with 1 instead of 0 set rowNum_ [expr $_firstRow + $rowNum_ - 1] set flag [_ds9MakePlot $rowNum_ [expr $rowNum_ + 1] [expr $rowNum_ + 1] \ ElementNumber [lindex $_listPreSelectedColNames $colIdx]] if { $flag == "DONE" } return } # apparently, plot does not need to use sortlist after the row is sorted set rowNum_ [expr $_firstRow + $rowNum_ ] set selectCol [lindex $_listPreSelectedColNames $colIdx ] _plotCols ElementNumber {} $selectCol {} 0 $rowNum_ 0 } itcl::body Table::addChild { child_ } { lappend _myChildren $child_ } itcl::body Table::freeChild { child_ } { set pos [lsearch $_myChildren $child_] if { $pos != -1 } { set _myChildren [lreplace $_myChildren $pos $pos] } } itcl::body Table::passParamsToVectorTable {} { return [list $_numRows $isFailedToCopy $fileName $currentHDU] } itcl::body Table::_scrollChildren { firstRow {currentRow -1} } { set tmpRow $currentRow if { ($tmpRow == -1) && [info exist _currentRow] } { set tmpRow $_currentRow } # Check for locked children foreach child $_myChildren { catch { if { [$child _isVScrollLocked] } { $child _setVScroll [expr $firstRow-1] #puts "firstrow=$firstRow tmpRow=$tmpRow" # if { $tmpRow >= 0 } { # $child _setStartMark 0 [expr $tmpRow-$firstRow+1] False # } } } } } itcl::body Table::_isVScrollLocked {} { return $_isVScrollLocked1 } fv5.4/ftools/guis/fv/class/VectorTable.tcl0000644000220700001010000006644211077425364020144 0ustar birbylheadev# First draft 05/01/96 Jianjun #construct a VectorTable object # Vector VectorTableName FitsFileObjName currentHDU itcl::class VectorTable { inherit FitsImage constructor {args} { set _tableType "Vector Table" set _fatherFitsTable [lindex $args 1] set fFile [$_fatherFitsTable cget -fFile] set _fatherFitsExtension [$_fatherFitsTable getFatherFitsExtension] FitsImage::constructor $fFile $_fatherFitsExtension } {} destructor {} # all these override/specialize the parent (FitsImage) methods public method imagePlot {paramList_} public method showCell {col_ row_} public method setFileName { fName_ } private method _readInTable {} private method _drawTable {} private method _buildMenus {} private method _postMenus {} private method _realCloseCmd {} private method _powMakeImage {} ### data formatting private method _readTableData {fCol_ fRow_ nCols nRows_} private method _writeTableData {col_ row_ val_} private method _getFormattedData {col_ row_} private method _getRawData {col_ row_} private method _putRawData {col_ row_ val_} private method _getRawDataBlock { fCol_ fRow_ lCol_ lRow_ } private method _putRawDataBlock { fCol_ fRow_ data_ } private method _saveTableToAscii {win_ asciiFileName_} # all these are distinct to this class (not present in parent Table class) private method _makeVectorImage {} private method _plotAVectorRowWindow {} private method _plotAVectorRow {} # used in _plotAVectorRowWindow private variable _plotRowNum # _cellSize is gotten from _fatherFitsTable # and all _cellWidth($i) is set to _cellSize private variable _isVariableVec 0 # a vector table is based off a vector column in a father Table private variable _fatherFitsTable # all based on the _columnNull(i), _columnType(i)...of father table column private variable _colName private variable _colDim private variable _colNull private variable _colType private variable _colForm private variable _baseColNum } itcl::body VectorTable::constructor {args} { set colNum [lindex $args 0] # get some params from _fatherFitsTable set listFatherParams [$_fatherFitsTable passParamsToVectorTable] set _numRows [lindex $listFatherParams 0] set isFailedToCopy [lindex $listFatherParams 1] set fileName [lindex $listFatherParams 2] set currentHDU [lindex $listFatherParams 3] set _colName [$_fatherFitsTable getColumnInfo _columnName $colNum] set _colNull [$_fatherFitsTable getColumnInfo _columnNull $colNum] set _colForm [$_fatherFitsTable getColumnInfo _columnForm $colNum] set _colType [$_fatherFitsTable getColumnInfo _columnType $colNum] set _colDim [$_fatherFitsTable getColumnInfo _columnDim $colNum] set _cellSize [$_fatherFitsTable getColumnInfo _cellWidth $colNum] set _numCols [$_fatherFitsTable getColumnInfo _columnVecSize $colNum] #puts "_colName : $_colName" #puts "_colNull : $_colNull" #puts "_colForm : $_colForm" #puts "_colType : $_colType" #puts "_colDim : $_colDim " #puts "_colSize : $_cellSize" #puts "_colCols : $_numCols" # pick the variable length array. if { $_numCols < 0 } { set _numCols [expr -$_numCols] set _isVariableVec 1 } set _dispCols $_numCols set _justStarted 1 $_fatherFitsTable addChild $this # In FitsImage.tcl constructor, _dims is gotten from the fFiles, *from which* # we get _numCols and _numRows # Here we set _dims directly set _dims [list $_numCols $_numRows] } itcl::body VectorTable::destructor {} { .fvwinkeeper signoff $_droot set _isBeingDestroyed 1 destroy $_droot $_fatherFitsTable freeChild $this } itcl::body VectorTable::setFileName { fName_ } { Table::setFileName $fName_ .fvwinkeeper signoff $_droot .fvwinkeeper register $_droot "Vector Table" [urlTail $fName_] $currentHDU \ $this } itcl::body VectorTable::_drawTable {} { Table::_drawTable bind $_droot <> [itcl::code $this _plotAVectorRowWindow] bind $_droot <> [itcl::code $this _makeVectorImage] } itcl::body VectorTable::_buildMenus {} { global isMac global g_titleFont if { $isMac } { set _mBar .mbar.vtable } else { set _mBar $_droot.mbar } $_droot config -menu $_mBar if { ![winfo exists $_mBar] } { _buildNewMenus $_mBar.tools add command -label "Plot..." \ -command "doMenuEvent <>" -font g_titleFont $_mBar.tools add command -label "Make Image" \ -command "doMenuEvent <>" -font g_titleFont } } itcl::body VectorTable::_postMenus {} { Table::_postMenus if { $_isVariableVec } { $_mBar.tools entryconfig "Make Image" -state disabled } else { $_mBar.tools entryconfig "Make Image" -state normal } update idle } itcl::body VectorTable::_readInTable {} { global g_charPix set _DC(height) 20 set _DC(width) [expr (int(log10($_numRows))+4)*$g_charPix] # set _DC(headroom) 20 set _DC(headroom) 80 set _DC(footroom) 40 set _DC(vscrollsize) 15 set _DC(hscrollsize) 15 set _DC(rightspace) 6 set _DC(interline) 0 set _DC(tmar) 6 set _DC(lmar) 8 set _DC(tabspace) 0 # use fits command setarray to initialize the rowState # usage setrowstate totalNumOfRos startRow endRow status # (0:normal, 1:selected, 2: deleted) setarray rowState 0 [expr $_numRows-1] 0 setarray _colNotchedState 0 [expr $_dispCols-1] 0 set _absXPos(0) [expr $_DC(lmar) + $_DC(width) + $_DC(rightspace)] set _listPreSelectedColNames {} for {set i 0} {$i < $_numCols} {incr i} { set _valueTDIM($i) 0 set _colNotchedState($i) 0 set _columnName($i) [expr $i+1] set _columnType($i) " " set _columnUnit($i) " " lappend _listPreSelectedColNames [expr $i+1] set _cellWidth($i) $_cellSize set _cellPixWidth($i) [expr $g_charPix*(1+$_cellWidth($i))] set _absXPos([expr $i+1]) [expr $_absXPos($i) + $_cellPixWidth($i) \ + $_DC(rightspace) ] } } itcl::body VectorTable::_makeVectorImage {} { global g_hasSAOtng g_hasDS9 if { $fvPref::imgDisplayer == "SAOtng" && $g_hasSAOtng } { tk_messageBox -type ok -message "Vector columns cannot be\ displayed with SAOtng. Please use POW instead." } elseif { $fvPref::imgDisplayer == "DS9" && $g_hasDS9 } { tk_messageBox -type ok -message "Vector columns cannot be\ displayed with DS9. Please use POW instead." } else { _powMakeImage } } itcl::body VectorTable::_powMakeImage {} { global powPlotParam global xCount yCount # get the pow widget if { [winfo exist .pow.pow]!=1 } { powInit .dummy } # load the entire vector table set tmpStr [$fFile loadVectorTableToDataAddressForPOW $_colName] set dataAddressForPOW [lindex $tmpStr 0] set dataType [lindex $tmpStr 1] set dataSize [lindex $tmpStr 2] regsub -all { } [urlTail $fileName] _ cleanFileName set imgHandle ${cleanFileName}_c$_colName # the last param is for copying data powCreateData $imgHandle $dataAddressForPOW $dataType $dataSize 1 # free the data array $fFile freeVTable $dataAddressForPOW set powPlotParam(graphType,$imgHandle) [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(graphType,${imgHandle}scope) $powPlotParam(graphType,$imgHandle) set powPlotParam(zoomed,$imgHandle) 0 set powPlotParam(zoomed,${imgHandle}scope) 0 set xCount($imgHandle) 0 set yCount($imgHandle) 0 set xCount(${imgHandle}scope) 0 set yCount(${imgHandle}scope) 0 powCreateImage $imgHandle $imgHandle 0 0 $_numCols $_numRows 0 1 0 1 \ pixels pixels counts powCreateGraph $imgHandle NULL $imgHandle pixels pixels \ detector detector \ [lindex $fvPref::graphDispSize 0] [lindex $fvPref::graphDispSize 1] # register for the linkage to table display .pow.pow bind img_$imgHandle <> \ "+returnCurrentImageInfo_ForVectorTables $this $imgHandle %x %y" } itcl::body VectorTable::_realCloseCmd {} { $_fatherFitsTable refresh 0 itcl::delete object $this } ############################################## # # Handle Reading/Writing/Formatting of Data # itcl::body VectorTable::_writeTableData {col_ row_ val_} { if { [regexp L $_colType] == 1} { if { ([regexp -nocase {[ftu]} $val_] == 0) || \ ([string length $val_] !=1)} { error "Logical column can only have value T, F or U" return } else { set val_ [string toupper $val_] } } set tmpStr [string toupper [string trim $val_ " "]] if { $tmpStr == "NULL" } { # float and double do not need a TNULL key for binary table if { $_colNull == "NULL" && \ ![regexp A|D|E|F|C|M|d|e|f $_colType] } { error "\nNo NULL value is defined. Please write a\ TNULLn keyword in the header first." } set val_ "NULL" } _putRawData $col_ $row_ $val_ } itcl::body VectorTable::_readTableData {fCol_ fRow_ nCols_ nRows_} { # col/row is 0-indexed if { $_isVariableVec } { # Need to read/write entire row in Variable-length columns set fCol_ 1 set lCol_ $_numCols } else { incr fCol_ set lCol_ [expr $fCol_+$nCols_-1] } incr fRow_ for { set col $fCol_ } { $col <= $lCol_ } { incr col } { # table block data will be loaded into a 2-d Tcl array _tableData # this cannot be done as a FitsFile method because Tcl does not # allow arrays to be returned # the array must be created locally set fitsfile [$fFile cget -fitsfile] $fitsfile load tblock -noformat "_tableData" [list $_colName] $fRow_ \ $nRows_ $col $col } } itcl::body VectorTable::_getFormattedData {col_ row_} { set val [_getRawData $col_ $row_] if { $val=="NULL" || $val==" " } { return $val } if { [regexp C|M $_colType] } { foreach [list v1 v2] $val {} return [format "$_colForm, $_colForm" $v1 $v2] } else { regsub -all {%[0-9]*[iuld]*} $_colForm "" result if { $result == "" } { # $_colForm == "%i" || $_colForm == "%d" || # $_colForm == "%u" || $_colForm == "%ld" # $_colForm == "%xxi" || $_colForm == "%xxd" || # $_colForm == "%xxu" || $_colForm == "%xxld" set token [split $val "."] set val [lindex $token 0] } return [format $_colForm $val] } } itcl::body VectorTable::_getRawData {col_ row_} { set v $_tableData($col_,$row_) if { $v!="NULL" && $v!=" " } { if { [regexp E $_colType] } { return [format "%.7G" $v] } elseif { [regexp D $_colType] } { return [format "%.15G" $v] } } return $v } itcl::body VectorTable::_putRawData {col_ row_ val_} { if { $_isVariableVec } { # variable length vectors want to write the entire vector at # once so, build up list of values set tmpVecList {} set _tableData($col_,$row_) $val_ for { set i 0 } { $i < $_numCols } { incr i } { if {$_tableData($i,$row_) == " "} break lappend tmpVecList $_tableData($i,$row_) } $fFile putTable $_colName 1 [expr $row_+1] $tmpVecList } else { $fFile putTable $_colName [expr $col_+1] [expr $row_+1] [list $val_] } _readTableData $col_ $row_ 1 1 } itcl::body VectorTable::_getRawDataBlock { fCol_ fRow_ lCol_ lRow_ } { # col/row zero-indexed #puts "_colName: $_colName" incr fRow_ incr lRow_ set range "${fRow_}-${lRow_}" set data {} for { set col $fCol_ } { $col <= $lCol_ } {} { incr col lappend data [$fFile getVectorTableAsRawList $_colName $col $range] } return $data } itcl::body VectorTable::_putRawDataBlock { fCol_ fRow_ data_ } { if { $_isVariableVec } { set col 1 } else { set col [expr $fCol_+1] } set nRows [llength [lindex $data_ 0]] set nCols [llength $data_] for { set i 0 } { $i<$nRows } { incr i } { set rowData {} if { $_isVariableVec } { # Must insert start of row for { set c 0 } { $c<$fCol_ } { incr c } { lappend rowData [_getRawData $c $fRow_] } } foreach cData $data_ { lappend rowData [lindex $cData $i] } if { $_isVariableVec } { # Must append end of row for { set c [expr $fCol_+$nCols] } { $c<$_numCols } {incr c} { set v [_getRawData $c $fRow_] if { $v==" " } break lappend rowData $v } } incr fRow_ $fFile putTable $_colName $col $fRow_ $rowData } } # # End Data handlers # ############################################## itcl::body VectorTable::imagePlot {paramList_} { set imgPlotType [lindex $paramList_ 0] set imgPlotStart [lindex $paramList_ 1] set imgPlotEnd [lindex $paramList_ 2] set imgCurrgn [lindex $paramList_ 3] if { $imgPlotType == "row" } { set _plotXstart 0 set _plotXtotal $_numCols set _plotYstart [expr $imgPlotStart - 1] set _plotYtotal [expr $imgPlotEnd - $imgPlotStart] } else { set _plotYstart 0 set _plotYtotal $_numRows set _plotXstart [expr $imgPlotStart - 1] set _plotXtotal [expr $imgPlotEnd - $imgPlotStart] } _powMakeImage } # double click on image pixel displays the cell of the pixel itcl::body VectorTable::showCell {col_ row_} { if { $_droot == "" || ![winfo exists $_droot] } return if { [llength $_dims]==1 } { # Swap col_/row_ set tmp $col_; set col_ $row_; set row_ $tmp } _jump [expr $row_ - $_showRows/2] _setHScroll [expr $col_-$_showCols/2-1] update idletask _setStartMark [expr $col_ - $_firstCol] [expr $row_ - $_firstRow] } itcl::body VectorTable::_plotAVectorRowWindow {} { if { [winfo exist .vector_plotrow ] } { return } powToplevel .vector_plotrow .dummy wm title .vector_plotrow "fv: Select Row To Plot" set _plotRowNum "" iwidgets::entryfield .vector_plotrow.entry \ -labeltext "Choose a row to plot (between 1 and $_numRows):" \ -textvariable [itcl::scope _plotRowNum] iwidgets::buttonbox .vector_plotrow.bbox .vector_plotrow.bbox add plot -text "Plot" \ -command [itcl::code $this _plotAVectorRow] .vector_plotrow.bbox add cancel -text "Cancel" \ -command "destroy .vector_plotrow" grid configure .vector_plotrow.entry -row 0 -column 0 -sticky ew grid configure .vector_plotrow.bbox -row 1 -column 0 } itcl::body VectorTable::_plotAVectorRow {} { global g_backupDir powPlotParam global xCount yCount global powWCS powFitsHeader powFitsHeaderCnt global powWCSName powWCSTranslation powWCSLabel powWCSList if { $_plotRowNum == "" || $_plotRowNum < 1 || $_plotRowNum > $_numRows } { error "Row must be between 1 and $_numRows" return } #puts "plotRowNum: $_plotRowNum" # zero-indexed set tokens [split $_plotRowNum "-"] set firstRow [expr [lindex $tokens 0] - 1] set lastRow [expr [lindex $tokens 0] - 1] if { [llength $tokens] > 1 } { set lastRow [expr [lindex $tokens end] - 1] } set firstCol 0 set lastCol [expr $_numCols - 1] set xColumn_ "Column" set yColumn_ "Value" set numPixels $_numCols # not sure if we should get this as a formatted or raw block set listRowData [_getRawDataBlock $firstCol $firstRow $lastCol $lastRow] #puts "firstRow: $firstRow" #puts "lastRow: $lastRow" #puts "firstCol: $firstCol" #puts "lastCol: $lastCol" #puts "$listRowData" if { $fvPref::imgDisplayer == "DS9" } { # display is for DS9 set flag "NOT_YET" set tmpfile ${g_backupDir}/ds9PlotTemp.data if [file exists $tmpfile] { file delete -force $tmpfile } if { [catch {set newDataFile [open $tmpfile "w"]} err] } { error $err return } # load the data with specific rowNum_ into the tmpfile set range "$firstRow-$lastRow" set col 0 set totalCol $_numCols for { set col 1 } { $col <= $totalCol } {incr col} { set totalValue 0 for {set row 1} {$row <= [expr $lastRow - $firstRow + 1]} {incr row} { set data [lindex [lindex $listRowData [expr $col - 1]] [expr $row - 1]] set currentVal $data if { $data == "NULL" } { set currentVal 0 } set totalValue [expr $totalValue + $currentVal] } puts $newDataFile [format "%s %s" $col [expr $totalValue / ($lastRow - $firstRow + 1)]] } close $newDataFile set err "none" catch {exec xpaaccess ds9} result if { [string range $result 0 1] == "no" } { # start DS9 if DS9 isn't there if { [catch {exec ds9 &} ds9pid] } { file delete $tmpfile if { [tk_dialog .saoError "DS9 startup error.. Cannot start DS9!\nUse POW instead?" \ question 0 Yes No] == 0 } { close $fFile set flag INCOMPLETE_DONE } close $fFile set flag DONE } if { $flag == "NOT_YET" } { # wait till ds9 is up set stopflag 1 set nSecs 0 while { $stopflag } { after 1000 incr nSecs catch {exec xpaaccess ds9} result if { [string range $result 0 2] == "yes" } { set flag DONE set stopflag 0 } else { if { $nSecs > 10 } { file delete $tmpfile if { [tk_dialog .saoError "DS9 startup error.. Cannot start ds9!\nUse POW instead?" \ question 0 Yes No] == 0 } { close $fFile set flag NOT_YET break } else { close $fFile set flag INCOMPLETE_DONE break } } } } } } else { set flag DONE } if { $flag == "DONE" } { if { $firstRow == $lastRow } { set displayName [format "%s(%s_%s)" [file tail $fileName] Row $firstRow] } else { set displayName [format "%s(%s_%s-%s)" [file tail $fileName] Row $firstRow $lastRow] } exec xpaset ds9 analysis plot $displayName $xColumn_ $yColumn_ 2 < $tmpfile file delete $tmpfile } if { $flag != "NOT_YET" } return } # reset lastCol and numPixels if if { $_isVariableVec } { # find how large our row is for {set i 0} {$i < $_numCols} {incr i} { if {[lindex $listRowData $i] == "{ }"} { if { $i == 0 } { error "No data in row to plot" return } set lastCol [expr $i - 1] set numPixels $i break } } # get data of that one row, truncated before the last " " set listRowData [_getRawDataBlock $firstCol $firstRow \ $lastCol $lastRow] } # create list from 1 to $numPixels set listPixels {} for { set i 1 } { $i <= $numPixels } { incr i } { lappend listPixels $i } powCreateDataFromList "xData" $listPixels powCreateDataFromList "yData" $listRowData powCreateVector "xVector" "xData" 0 NULL NULL powCreateVector "yVector" "yData" 0 NULL NULL regsub -all { } [urlTail $fileName] _ cleanFileName set plotName ${cleanFileName}_${_colName}_row$_plotRowNum set curveName c${_plotRowNum}_$plotName set powWCSName($curveName) 0 set powWCSName(${curveName}scope) 0 if { [info exists wcsinfo] && $wcsinfo!="" } { set result [$fFile getDummyHeader2String {} $RAColNum $DecColNum] set powFitsHeader($curveName) [lindex $result 0] set powWCS($curveName) [lindex $result 2] set powWCSInfo($curveName,DEFAULT) $powWCS($curveName) set cntList($curveName) [$fFile getHeaderKeyWord [lindex $result 0] $curveName] set powFitsHeaderCnt($curveName) [lindex $cntList($curveName) 1] set wcsinfo $powWCS($curveName) } else { set powWCS($curveName) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set powFitsHeader($curveName) "" set powFitsHeaderCnt($curveName) 0 } set powPlotParam(wcsName,$curveName) "WCS" set powPlotParam(graphType,$curveName) [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(zoomed,$curveName) 0 set xCount($curveName) 0 set yCount($curveName) 0 powCreateCurve $curveName xVector NULL yVector NULL set curves [list $curveName] if { [winfo exist .pow.pow]!=1 } { powInit .dummy } set x_unit "" set y_unit "" set x_label "Pixel" set y_label "Data" set powWCSLabel(xlabel,$plotName,DEFAULT) $x_label set powWCSLabel(ylabel,$plotName,DEFAULT) $y_label set powWCSLabel(xunit,$plotName,DEFAULT) $x_unit set powWCSLabel(yunit,$plotName,DEFAULT) $y_unit set powPlotParam(graphType,$plotName) "binary" set powPlotParam(graphType,${plotName}scope) "binary" set powPlotParam(zoomed,$plotName) 0 set powPlotParam(zoomed,${plotName}scope) 0 set xCount($plotName) 0 set yCount($plotName) 0 set xCount(${plotName}scope) 0 set yCount(${plotName}scope) 0 # wcslist can be obtained from any one slice if [info exists powWCSList($curveName)] { set powWCSList($plotName) $powWCSList($curveName) set powWCSList(${plotName}scope) $powWCSList($curveName) foreach name [lindex $powWCSList($plotName) 1] { $fFile assembleWcsLabel $plotName $name } } else { set powWCSList($plotName) {} lappend powWCSList($plotName) 1 lappend powWCSList($plotName) {} } set powWCSList(${plotName}scope) $powWCSList($plotName) set powWCSName(${plotName}) 0 set powWCSName(${plotName}scope) 0 set powPlotParam(wcsName,$plotName) "WCS" set powWCS($plotName) $powWCS($curveName) set powWCS(${plotName}scope) $powWCS($curveName) set powFitsHeader($plotName) $powFitsHeader($curveName) set powFitsHeaderCnt($plotName) $powFitsHeaderCnt($curveName) set powFitsHeader(${plotName}scope) $powFitsHeader($curveName) set powFitsHeaderCnt(${plotName}scope) $powFitsHeaderCnt($curveName) # set powPlotColumnDataName($plotName) $powPlotColumnDataName($curveName) set powPlotParam(graphType,$plotName) [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(graphType,${plotName}scope) $powPlotParam(graphType,$plotName) set powPlotParam(zoomed,$plotName) 0 set powPlotParam(zoomed,${plotName}scope) 0 powCreateGraph $plotName $curves NULL $x_unit $y_unit $x_label $y_label \ [lindex $fvPref::graphDispSize 0] [lindex $fvPref::graphDispSize 1] powSetCurveOptions $plotName $curves pDisp No lDisp Yes destroy .vector_plotrow } ################################################################ itcl::body VectorTable::_saveTableToAscii {win_ asciiFileName_} { # these vars are used # _exportFirstRow # _exportLastRow # _exportFirstCol # _exportLastCol # _exportCSV # _exportPrintRowNumbers # _exportCharBetweenCols set _exportFormat [$win_.rb get] if { $_exportFormat == "csv" } { set _exportCSV 1 } elseif { $_exportFormat == "userdefine" } { set _exportCSV 0 } # Note: all rows and cols are 1-based # this matches the $fFile print commands below use 1-based, so no # change is needed ################################################################ # set up the feedback bar set totalRowsPrint [expr $_exportLastRow - $_exportFirstRow + 1] # NOTE -- this is changed to 1000000000 rows # we will print 1000 rows at a time (or whatever is left) # numPrintBlocks = total blocks of 1000 or iterations in feedbar bar # if we have 2835 rows, we'll print: # 1 to 1000, (first block) # 1001 to 2000, (second block) # 2001 to 2835. (third block) # # tables are meant to be printed in standard row order set numPrintBlocks [expr $totalRowsPrint/1000000000] if { ($totalRowsPrint - $numPrintBlocks*1000000000) > 0 } { incr numPrintBlocks } $win_.f.fdb configure -steps $numPrintBlocks # create list of print widths set listPrintWidths {} for {set i 0} {$i < $_dispCols} {incr i} { lappend listPrintWidths [expr $_cellWidth($i) + 1] } set firstloop 1 if { $_exportsel == 1 } { set _exportFirstRow 1 set _exportLastRow $_numRows set totalRowsPrint [expr $_exportLastRow - $_exportFirstRow + 1] } if { $_exportsel == 3 } { for {set r 1} { $r <=$_numRows } { incr r } { if {$_selectedRows($r) ==1 } { set _exportFirstRow $r while { $_selectedRows($r) == 1} { incr r if { $r > $_numRows } { break } } set totalRowsPrint [expr $r - $_exportFirstRow] for {set n 1} {$n <= $numPrintBlocks} {incr n} { if { $n == 1 && $firstloop == 1} { # write into a new file and write column names set filePrintMode 0 } else { # append to that file and don't write column names set filePrintMode 2 } set fRow [expr 1000000000*[expr $n-1] + 1] if { $n == $numPrintBlocks } { set nRows [expr $totalRowsPrint - $fRow + 1] } else { set nRows 1000000000 } # shift by the first user-selected row set fRow [expr $fRow + $_exportFirstRow - 1] set fCol $_exportFirstCol set nCols [expr $_exportLastCol - $_exportFirstCol + 1] if { ($_tableType == "Vector Table") } { $fFile saveVecToASCII $asciiFileName_ $filePrintMode \ $fRow $nRows $fCol $nCols \ $_colName \ $_exportCSV \ $_exportPrintRowNumbers \ $_exportCharBetweenCols \ $_isVariableVec } else { error "Table Type unknown. Export as text not possible." return } # if user presses cancel, stop if {[catch {$win_.f.fdb step}] == 1} { file delete $asciiFileName_ return } } set firstloop 0 } } } else { for {set n 1} {$n <= $numPrintBlocks} {incr n} { if { $n == 1 } { # write into a new file and write column names set filePrintMode 0 } else { # append to that file and don't write column names set filePrintMode 2 } set fRow [expr 1000000000*[expr $n-1] + 1] if { $n == $numPrintBlocks } { set nRows [expr $totalRowsPrint - $fRow + 1] } else { set nRows 1000000000 } set fCol $_exportFirstCol set nCols [expr $_exportLastCol - $_exportFirstCol + 1] # shift by the first user-selected row set fRow [expr $fRow + $_exportFirstRow - 1] #okbox "$asciiFileName_ $filePrintMode $fRow $nRows $fCol $nCols $_colName $_exportCSV $_exportPrintRowNumbers $_exportCharBetweenCols $_isVariableVec" $fFile saveVecToASCII $asciiFileName_ $filePrintMode \ $fRow $nRows $fCol $nCols \ $_colName \ $_exportCSV \ $_exportPrintRowNumbers \ $_exportCharBetweenCols \ $_isVariableVec # if user presses cancel, stop if {[catch {$win_.f.fdb step}] == 1} { file delete $asciiFileName_ return } } } destroy $win_ } fv5.4/ftools/guis/fv/class/WFPC2Image.tcl0000644000220700001010000002245011203345470017473 0ustar birbylheadev# First draft 06/27/96 Jianjun # constrct a FitsImage object # FitsImage FitsImageObjName FitsFileObjName currentHDU itcl::class WFPC2Image { inherit FitsImage constructor {args} { eval FitsImage::constructor $args } { #puts $args } # all these override/specialize their parents' (FitsImage and Table) methods private method _readInTable {} private method _saveTableToAscii {win_ asciiFileName_} private method _powMakeImage {} } itcl::body WFPC2Image::_readInTable { } { set _DC(height) 20 set _DC(width) [expr (int(log10($_numRows))+6)*$g_charPix] set _DC(headroom) 20 set _DC(footroom) 40 set _DC(vscrollsize) 15 set _DC(hscrollsize) 15 set _DC(rightspace) 6 set _DC(interline) 0 set _DC(tmar) 6 set _DC(lmar) 8 set _DC(tabspace) 0 # flag that the imageTable is being displayed set _isImageTable 1 if { $_imgType == 0 } { set _cellSize 8 } elseif {$_imgType == 1} { set _cellSize 8 } elseif {$_imgType == 2} { set _cellSize 16 } elseif {$_imgType == 3} { set _cellSize 16 } elseif {$_imgType == 4} { set _cellSize 20 } else { set _cellSize 8 } set _listPreSelectedColNames {} set _dispCols $_numCols set _tableType Image # use fits command setrowstate to initialize the rowState # usage setrowstate totalNumOfRos startRow endRow status # (0:normal, 1:selected, 2: deleted) setarray rowState 0 [expr $_numRows-1] 0 setarray _colNotchedState 0 [expr $_dispCols-1] 0 set _absXPos(0) [expr $_DC(lmar) + $_DC(width)/2] for {set i 0} {$i < $_dispCols} {incr i} { set _valueTDIM($i) 0 set _columnName($i) [expr $i+1] set _columnType($i) " " set _columnUnit($i) " " lappend _listPreSelectedColNames [expr $i+1] set _cellWidth($i) $_cellSize set _cellPixWidth($i) [expr $g_charPix*(1+$_cellWidth($i))] set _absXPos([expr $i+1]) [expr $_absXPos($i) + $_cellPixWidth($i) \ +$_DC(rightspace)] } } itcl::body WFPC2Image::_powMakeImage {} { global powWCS powFitsHeader powFitsHeaderCnt powPlotParam global xCount yCount global powWCSName powWCSTranslation powWCSLabel powWCSList global useWCSInfo # get the pow widget if { [winfo exist .pow.pow]!=1 } { powInit .dummy } regsub -all { } [urlTail $fileName] _ cleanFileName set imgIndex ${cleanFileName}_[expr $currentHDU-1] set imgHandle ${cleanFileName}_[expr $currentHDU-1] for {set i 1} {$i <=4} {incr i} { set ii $i set dataAddressForPOW [$fFile loadImageSlice $i [expr $i-1]] # the last param is for copying data powCreateData ${imgHandle}_$ii $dataAddressForPOW $_imgType \ [expr $_numCols*$_numRows] 1 # free the data array $fFile freeImage $dataAddressForPOW } # get the wcs info and pass them to pow # for WFPC images, the wcs info are stored in the second extension. # $fFile move +1 # set crval1 [$fFile get table crval1] # set crval2 [$fFile get table crval2] # set crpix1 [$fFile get table crpix1] # set crpix2 [$fFile get table crpix2] # set cd1_1 [$fFile get table cd1_1 ] # set cd1_2 [$fFile get table cd1_2 ] # set cd2_1 [$fFile get table cd1_1 ] # set cd2_2 [$fFile get table cd1_2 ] set x_0 1 set y_0 1 set incrx 1 set incry 1 set x_label "" set y_label "" set x_unit "pixels" set y_unit "pixels" # Get the WCS info (if needed) and pass them to pow set powWCSLabel(xlabel,$imgIndex,DEFAULT) "" set powWCSLabel(ylabel,$imgIndex,DEFAULT) "" set powWCSLabel(xunit,$imgIndex,DEFAULT) "" set powWCSLabel(yunit,$imgIndex,DEFAULT) "" $fFile moveToHDU 1 set powWCS($imgIndex) [$fFile getWcs] set powWCSName($imgIndex) 0 set useWCSInfo($imgeIndex) $fvPref::ifWCSInfo if { $fvPref::ifWCSInfo } { set result [$fFile getHeader2String] set cntList($imgIndex) [$fFile getHeaderKeyWord [lindex $result 0] $imgIndex] set powFitsHeaderCnt($imgIndex) [lindex $cntList($imgIndex) 1] if { [lindex $cntList($imgIndex) 0] > 0 } { #set powFitsHeader($imgIndex) [$fFile assembleWcsHeader $imgIndex] set powFitsHeader($imgIndex) [lindex $result 0] set powWCSInfo($imgIndex,DEFAULT) $powWCS($imgIndex) set wcsinfo $powWCS($imgIndex) set x_label [lindex [lindex $wcsinfo 3] 0] set y_label [lindex [lindex $wcsinfo 3] 1] if { $x_unit=="pixels" } {set x_unit NULL} if { $y_unit=="pixels" } {set y_unit NULL} } else { set powFitsHeader($imgIndex) [$fFile assembleWcsHeader $imgIndex NOWCS] set powWCS($imgIndex) [$fFile getWcs] set wcsinfo $powWCS($imgIndex) } } else { set powWCS($imgIndex) [$fFile getWcs] set powFitsHeader($imgIndex) "" set powFitsHeaderCnt($imgIndex) 0 } set powWCSList($imgIndex) {} set powWCSList(${imgIndex}scope) {} for {set i 1} {$i <=4} {incr i} { # position the frames # 2 1 # 3 4 switch $i { "1" { set x_0 [expr 1+$_numCols] set y_0 [expr 1+$_numRows] set incrx 1 set incry 1 } "2" { set x_0 1 set y_0 [expr 1+$_numRows] set incrx 1 set incry 1 } "3" { set x_0 1 set y_0 1 } "4" { set x_0 [expr 1+$_numCols] set y_0 1 set incrx 1 set incry 1 } } set ii $i set powWCSName(${imgHandle}_$ii) 0 set powFitsHeader(${imgHandle}_$ii) $powFitsHeader($imgIndex) set powFitsHeaderCnt(${imgHandle}_$ii) $powFitsHeaderCnt($imgIndex) set powWCS(${imgHandle}_$ii) $powWCS($imgIndex) set powFitsHeader(${imgHandle}_${ii}scope) $powFitsHeader($imgIndex) set powFitsHeaderCnt(${imgHandle}_${ii}scope) $powFitsHeaderCnt($imgIndex) set powWCS(${imgHandle}_${ii}scope) $powWCS($imgIndex) set powPlotParam(graphType,${imgHandle}_$ii) \ [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(graphType,${imgHandle}_${ii}scope) \ $powPlotParam(graphType,${imgHandle}_$ii) set powPlotParam(zoomed,${imgHandle}_$ii) 0 set powPlotParam(zoomed,${imgHandle}_${ii}scope) 0 set xCount(${imgHandle}_$ii) 0 set yCount(${imgHandle}_$ii) 0 set xCount(${imgHandle}_${ii}scope) 0 set yCount(${imgHandle}_${ii}scope) 0 set powWCSName(${imgHandle}_$ii) 0 set powWCSName(${imgHandle}_${ii}scope) 0 set powWCSTranslation 0 powCreateImage ${imgHandle}_$ii ${imgHandle}_$ii 0 0\ $_numCols $_numRows $x_0 \ $incrx $y_0 $incry $x_label $y_label counts if [info exists powWCSList(${imgHandle}_$ii)] { foreach name [lindex $powWCSList(${imgHandle}_$ii) 1] { $fFile assembleWcsLabel ${imgHandle}_$ii $name } } else { set powWCSList(${imgHandle}_$ii) {} lappend powWCSList(${imgHandle}_$ii) 1 lappend powWCSList(${imgHandle}_$ii) {} } set powWCSList(${imgHandle}_${ii}scope) $powWCSList(${imgHandle}_${ii}) set powRBmin(${imgHandle}_$ii) 0 set powRBmax(${imgHandle}_$ii) 1000 } # use one of the image list set powWCSList($imgIndex) $powWCSList(${imgHandle}_4) set powWCSList(${imgIndex}scope) $powWCSList(${imgHandle}_4) if [info exists powWCSList($imgIndex)] { foreach name [lindex $powWCSList($imgIndex) 1] { $fFile assembleWcsLabel $imgIndex $name } } else { set powWCSList($imgIndex) {} lappend powWCSList($imgIndex) 1 lappend powWCSList($imgIndex) {} } set powWCSList(${imgHandle}) $powWCSList($imgIndex) set powWCSList(${imgHandle}scope) $powWCSList($imgIndex) set powWCSName(${imgHandle}) 0 set powFitsHeader($imgHandle) $powFitsHeader($imgIndex) set powFitsHeaderCnt($imgHandle) $powFitsHeaderCnt($imgIndex) set powWCS($imgHandle) $powWCS($imgIndex) set powPlotParam(graphType,$imgHandle) [string tolower [lindex [$fFile getTableInfo hdutype] 0]] set powPlotParam(graphType,${imgHandle}scope) $powPlotParam(graphType,$imgHandle) set powPlotParam(zoomed,$imgHandle) 0 set powPlotParam(zoomed,${imgHandle}scope) 0 set xCount($imgHandle) 0 set yCount($imgHandle) 0 set xCount(${imgHandle}scope) 0 set yCount(${imgHandle}scope) 0 powCreateGraph $imgHandle NULL \ [list ${imgHandle}_1 ${imgHandle}_2 ${imgHandle}_3 ${imgHandle}_4] \ $x_unit $y_unit \ $x_label $y_label \ [lindex $fvPref::graphDispSize 0] [lindex $fvPref::graphDispSize 1] } itcl::body WFPC2Image::_saveTableToAscii {win_ asciiFileName_} { # setup the grouping set tmpWidth $_cellSize set tmpFirstCol(0) 1 set groupCount 0 for {set n 0} {$n < $_numCols-1} {incr n} { set tmpWidth [expr $tmpWidth + $_cellSize] if { $tmpWidth > $_asciiColWidth} { incr groupCount set tmpWidth $_cellSize; set tmpFirstCol($groupCount) [expr $n+2] } } incr groupCount set tmpFirstCol($groupCount) [expr 1+$_numCols] $win_.f.fb configure -steps $groupCount for {set k 0} {$k< $groupCount} {incr k} { set nCols [expr $tmpFirstCol([expr $k+1])-$tmpFirstCol($k)] $fFile saveImgToASCII $asciiFileName_ $k \ 1 $_numRows $tmpFirstCol($k) $nCols $_cellSize if {[catch {$win_.f.fb step}] == 1} { file delete $asciiFileName_ return } } destroy $win_ } fv5.4/ftools/guis/fv/class/XPA_access.tcl0000644000220700001010000015010012044266572017663 0ustar birbylheadev# # This file contains code which makes fv more scriptable either from # TCL or via XPA entry points # namespace eval fvCmds { variable currObj "" variable currHDU 1 variable winList {} proc open { args } { global g_listObjs variable currObj variable currHDU if { [llength $args]==0 } { # Return list of opened files set files "" foreach file $g_listObjs { append files "[$file getOrigName]\n" } return $files } foreach file $args { set errorFlag [ catch { set currObj [openFitsFile $file] } err ] if { $errorFlag } { error " Can't open file: $file.\n" } } set currHDU 1 } proc close { args } { variable currObj if {[catch {checkForCurrentFile } err ]} { exitCmd return } set argc [llength $args] if { $argc==0 } { $currObj closeCmd } elseif {[lindex $args 0] == "-1" } { set numexts [$currObj getNumHdus] for {set i 1} { $i <= $numexts} { incr i} { $currObj closeExtension $i } } else { foreach ext $args { if { $ext == "current" || $ext == "." } { set ext [expr $currHDU - 1] } set numexts [$currObj getNumHdus] if { $ext < 0 || $ext >= $numexts } { error "valid extension:0-[expr $numexts -1]\n" return } if {[catch {$currObj closeExtension [expr $ext+1] } err ]} { error "close extension error\n" } } } } proc help { args } { set displayList [list close create delete display export exporttable open opentool pow preference quit save select sort tcl minimize version] if { $args != "" } { set displayList $args } set result "" foreach func $displayList { switch $func { help { append result "close usage: xpaget help cmd..\n" } close { append result "close usage: xpaset -p fv close ..\n" } create { append result "create usage:\n" append result " file: xpaset -p fv create file \n" append result " image: xpaset -p fv create extension image \n" append result " table \n" append result " example of dimension: 20 30, 20 20 20\n" } display { append result "display usage:\n" append result " header: xpaset -p fv display header \n" append result " table: xpaset -p fv display table <->\n" append result " image: xpaset -p fv display image \n" append result " curve: xpaset -p fv display curve -rows|-cols \n" append result " curve: xpaset -p fv display curve \n" } export { append result "export usage: xpaset -p fv export

Making Histogram

Making a 1D or 2D histogram from a table:

Any type of numerical column can be used to make a histogram. In this window, X and Y are column names from which one makes histogram. If a "Weight" column is selected, then the value of each cell is incremented by the value of "Weight" column, otherwise by 1.

TLMIN and TLMAX are the keywords usually used in an event file and are critical to making correct histograms. "Data Min" and "Data Max" are minimum and maximum values of the selected column and are dynamically calculated.

One needs to supply Min, Max, Bin Sizes for both X and Y column (for 2D histogram, X only for 1D histogram). By default, TLMin and TLMax values are used for Min and Max.

One can select a range of rows in the table for making histogram by providing a "Row Range".

Or one can use selected rows in the table window for making histogram by checking "Use selected rows" checkbox.

"Make" button does the following procedures:

  • Create the histogram and save it in a temporary file as an image.
  • Write CTYPEn, CRPIXn, CRVALn, and CDELTn keywords to the image, for use in plotting the image with original axes.
  • Summary of the temporary file is then opened automatically.

1D histogram:

By selecting only the X column and/or Weight column, one can make a 1D histogram.

Note:

To retain the histogram, one must Save the file before closing it. fv will warn the user of this if the file has not been saved when closing it or exitting the program.


Go to About fv. fv5.4/ftools/guis/fv/doc/3D-ImageDisplay.html0000644000220700001010000000141410450541646020350 0ustar birbylheadev fv Help: 3D Image Display

3D Image Display

For an image which has more than 3 dimensions, slices (in the third dimension) of that image can be animated within POW. Any dimensions above 3 are ignored). The total number of slices are shown at the top of the window. Enter the starting and ending slice numbers (if not doing all slices) and press the Animate button. The images will be plotted in POW and the animation will start automatically. POW's Blink Images window will open.

A single slice can be displayed by entering the same slice number as both start and end values.

Image mosaics are not supported at this time.


Go to About fv. fv5.4/ftools/guis/fv/doc/3D-ImageTable.html0000644000220700001010000000065707043074070017776 0ustar birbylheadev fv Help: 3D Image Table Display

3D Image Table Display

For an image which has more that 3 dimensions, slices (in the third dimension, additional dimensions are ignored) of that image can be displayed as tables. The total number of slices is shown at the top of the window. Slice numbers start at 1.
Go to About fv. fv5.4/ftools/guis/fv/doc/SkyView.html0000644000220700001010000000705207176076274017154 0ustar birbylheadev Connect to Skyview

Connect to SkyView

    SkyView is a Virtual Observatory on the Net(at skyview.gsfc.nasa.gov) generating images of any part of the sky at wavelengths in all regimes from Radio to Gamma-Ray. This panel is used to select, download and store the images. The temporary image Fits files are nameed as skyview.tmp[n], where n is a integer. Users may rename and save these images later.
  • Coordinate or Source

      This field is used to determine the center of the field to be retrieved. If you specify coordinates these are used as the center. When equatorial coordinates are being used the RA may be specified as either hh mm ss or ddd.fff, i.e., in hours or in decimal degrees. The coordinate fields must be separated by a comma or sign of the declination.

      If any letter is used in this field the field is assumed to be an object name and is sent to the SIMBAD name resolver to be resolved.

      Examples:

      6 45 10.76 -16 41 57.82

      6 45 10.76, -16 41 57.82

      101.2948411 -16.6993947

      101.2948411, -16.6993947

      sirius

  • Choose desired survey:

      This selection box allows you to select data from a survey. The details of each individual survey can be found in the web site

      http://skyview.gsfc.nasa.gov/cgi-bin/survey.pl

  • Coordinate System

      Click on this field to choose among equatorial, galactic and ecliptic coordinates. The default is equatorial.

      You may select the equinox year to be used in Equatorial or Ecliptic coordinates. Any equinox year within about two centuries of the present may be used. The default is 2000.

  • Image width

      This field sets the size of the image in degrees. Enter the size of the sides of the image in the projected coordinates. Since there are distortions in the projection, the actual distance between corners of the image can be more or less than the specified size.

      Note that the default size for an image is 300 times the intrinsic pixel size of an image.

  • Image dimensions

      You may select the dimensions of the image to be produced in pixels. By default an 300x300 image is produced. In conjunction with the image-size field you can control the resolution of the image.

  • Retrive catalog of objects within image

      If this checkbox is set, a listing of objects in the image will be retrieved and returned as an additional FITS table.

  • Catalogs

      This selection box allows you to select catalog(s) from which the objects are retrieved. This is only valid when Retrive catalog is set. Use the left mouse button and click the desired catalog on the list box to select it. To deselect it, click it again. Multiple catalogs may be selected in this way.

  • Display image after retriving

      Determine whether to make a plot of image and objects after retrieving them.

  • Submit

      Pressing this button submits the request to be processed by SkyView. This button will be disabled during the HTTP transaction.

  • Reset

      Pressing this button resets the entries.

  • Cancel

      Pressing this button closes the dialog box. This button will be disabled during the HTTP transaction.

  • Help

      Pressing this button opens the help file.


    Go to About fv. fv5.4/ftools/guis/fv/doc/VizieR.html0000644000220700001010000000504007314674431016747 0ustar birbylheadev Connect to VizieR

    Connect to VizieR

      Fv supports access to the thousands of on-line astronomical catalogs and data tables in VizieR which are maintained by the CDS in Strasbourg, France. The main VizieR web site is located at:

      http://vizier.u-strasbg.fr/.

      Several mirror sites are also available around the world. The VizieR interface in fv allows the user to make simple queries of any table to find sources located within a given search radius of a celestial object or coordinate. The results are returned to fv in the form of a FITS format table, containing one row per object. Note that much more general queries of these tables (e.g., to retrieve all sources brighter than a certain magnitude) can be performed using the query tools at the VizieR web site.

      The latest complete list of catalogs available from VizieR may be viewed with a Web browser at:

      http://vizier.u-strasbg.fr/cgi-bin/vizHelp?cats/cats.htx

      For example, for documentation on the I/197A catalog from the main VizieR web site, go to:

      http://vizier.u-strasbg.fr/viz-bin/Cat?I/197A

      This same help file is available from the ADC mirror site at:

      http://adc.gsfc.nasa.gov/viz-bin/Cat?I/197A

  • Catalog ID:

      Enter the short name (e.g., I/239) of the catalog to be searched, or select from one of the catalogs listed in the scrolling selection box. About 100 of the most popular catalogs are listed. Refer to the VisieR web site at http://vizier.u-strasbg.fr/ for the latest complete list of available catalogs.

  • Cone Center:

      Enter the name of the object or the celestial coordinate at the center of the search area. Coordinates may be entered in 'hh mm ss' or decimal degrees format. Examples:

      6 45 10.76, -16 41 57.82

      6 45 10.76, -16 41 57.82

  • Search Radius

      Enter the radius of the cone search, in arc-minutes.

  • Maximum Number of Rows

      Enter the maximum number of rows per HDU to get from VizieR.

  • Submit

      Pressing this button submits the request to be processed by VizieR. This button will be disabled during the HTTP transaction.

  • Cancel

      Pressing this button closes the dialog box. This button will be disabled during the HTTP transaction.

  • Help

      Pressing this button opens the help file.


    Go to About fv. fv5.4/ftools/guis/fv/doc/aboutFv.html0000644000220700001010000003770612562416202017152 0ustar birbylheadev About fv -- FITS Viewer

    fv: FITS Viewer and Editor (Version 5.4)

    fv is a FITS file viewer and editor developed at the High Energy Astrophysics Science Archive Research Center (HEASARC) at NASA / GSFC.

    Project Scientist:
    Dr. William D. Pence (William.Pence@nasa.gov)
    Project Engineer:
    Pan Chai (Pan.S.Chai@nasa.gov)

    To learn of new releases and bug fixes, visit the fv web page at:

        http://heasarc.gsfc.nasa.gov/ftools/fv
    
    Please send your comments, questions or feedback via the ftools help desk web page at:
        http://heasarc.gsfc.nasa.gov/cgi-bin/ftoolshelp
    

    Version 5.4 August 2015

    New features/Bug fixes since V5.3 include:

    • Bug fixed: Displaying vector columns with ds9 generated a large temporary data file.
    • Bug fixed: Error after exiting Hera.
    • Bug fixed: Text dump of vector column was changing NULLs to non-zero values.
    • Bug fixed: Retain fv graph preference size.
    • Bug fixed: Adding arithmetic function in expression when plotting resulted in seg fault.
    • Bug fixed: fv summary information of primary extension name changed after closing header view.
    • Bug fixed: Print preview panel did not resize correctly.
    • Bug fixed: HDU export from fv was not working.
    • Bug fixed: Problems in graph options editing.
    • Bug fixed: Error messages about "missing rootx and rooty" and regarding Editing Objects initialization.
    • Bug fixed: WCS projection for vector image column.
    • Bug fixed: Errors when displaying or exporting slices of a data cube.
    • Bug fixed: For logical columns of a binary table, display 'U' (undefined) for illegal values (anything other than 'T', 'F', or 0) rather than interpreting the values as 'F'.
    • Bug fixed: Memory faults when trying to open a FITS file that has a binary table with non-zero variable length array columns but has no rows.
    • Bug fixed: Extra columns and incorrect row selections in ASCII output when saving from a binary table.
    • Bug fixed: Exported text file from vector columns in a binary table (was only showing the first element).
    • Bug fixed: Table "Edit Cell" function on x86_64.
    • Bug fixed: Plotting in ds9 was not correctly handling lower case column names.
    • Bug fixed: Scripting error in which the existence of a $HOME/.fv directory was assumed.
    • Bug fixed: Allow directory paths that contain parentheses.
    • Enhancement: Allow user to specify and store image size.
    • Enhancement: Allow user to increase/decrease font size.
    • Enhancement: New preferences menu for using or ignoring WCS keywords when displaying an image.
    • Enhancement: Increased precision in output ASCII file values and displayed table cells.

    Version 5.3 July 2009

    New features/Bug fixes since V5.2.1 include:

    • Bug fixed: Fix large FITS file crashing and displaying summary/header issue.
    • Bug fixed: Fix opening FITS files in read-only mode issue.
    • Bug fixed: Fix scale error on colorbar.
    • Bug fixed: Fix axial label and scale issue for image constructed from image table cells.
    • Bug fixed: Fix no plot in pow scope area when displaying/flipping contour map (on separate graph.)
    • Bug fixed: Fix grid displaying issue when flipping a plot.
    • Bug fixed: Fix crashing issue when Zoom and then Reset zoom of images constructed from an image table.
    • Bug fixed: Fix information missing when displaying movie from a 3-D image table.
    • Enhancement: Adding wcsfix routine to handle non-standard WCS keywords values in FITS header.

    Version 5.2.1 July 2008

    New features/Bug fixes since V5.2 include:

    • Bug fixed: correct FITS Header string to WCSLib overflow 80 characters limit per card.
    • Enhancement: denote -SIP projection to its counter-part (i.e. -TAN-SIP to -TAN projection.)

    Version 5.2 June 2008

    New features/Bug fixes since V5.1 include:

    • Bug fixed: file selection panel not been displayed during exiting fv/pow application when the FITS file is modified during the session.
    • Bug fixed: when editing plot/image information, new title string is not been updated in the graph bug.
    • Bug fixed: zoom/unzoom of plot/image cause labels and units of the graph disappeared.
    • Bug fixed: fv/pow crashes during rendering of graph/image if the FITS file consists of inconsistence coordinates or unsupported coordinates system.
    • Bug fixed: un-necessary X and Y labels displayed in POW window (no image/plot created yet) when xspec is invoked.
    • Enhancement: allow the selection of columns panel to remain visible during plotting.
    • Enhancement: allow renaming capability of created region files when running special analysis tools in Hera.

    Version 5.1 December 2007

    New features/Bug fixes since V5.0 include:

    • Passing Fits Header string and cnt to client to display wcs info correctly for Hera and POWplot operation.
    • Fix zoom in and out bugs on POW image.
    • Support displaying images that straddle the 24h = 00h boundary on the sky with WCSLIB.
    • Horizontal scrolling bug of 0 rows table.
    • Release memory when deleting/closing an image in POW (on-going).
    • Fix editing graph parameter values bug.
    • Fix "Duplicate Graph" casuing seg-fault bug.
    • Fix two identical file names from two directories overwrite each other in POW bug.
    • Fix image flipping bug with FITS keyword CDn_n.
    • Fix displaying linear WCS projection and coordinates image.
    • Add 2 new icons: Hera and Student Hera during installation for Microsoft Windows and Apple Mac OS X.

    Version 5.0 September 2007

    New features/Bug fixes since V4.4 include:

    • Overhauling POW world coordination calculation logics. Now fV/POW use standard WCSLIB library to generate world coordinates/pixel positions.
    • Allow generating of plots that retains its world coordinate projection information.
    • Allow limited editing capability on the property of graph objects (projection, rotation, etc) of a graph/image on the fly.
    • Allow switching between multiply world coordination system (i.e. WCSa, WCSx, etc.) on the fly.
    • Allow the flipping of image/plot of direction on X or Y or Both axes.
    • Allow display of 64 bits integers in fv data table and in POW imagery.
    • Fix white-wash grey-out POW imagery on Scientific Linux platform bug.
    • Fix saving 64 bits integer data to a text file bug.
    • "Run Ftools..." option is no long available. Users are encouraged to use the new "fgui" task that is distributed with ftools.
    • "Skyview..." catalog selection is now only available via "Catalog..." option.

    Version 4.4 July 2006

    New features/Bug fixes since V4.3.1 include:

    • Adding capability to re-order the display of FITS columns.
    • Expand capability to sorting/modification of FITS columns parameters.
    • Tracking parent window view via vector columns in "Expand"ed view .
    • Allow user to specify path for DS9 and XPA in Windows.
    • Fix Windows platform of printing countor map on image problem.
    • Modified how the rotation angle in region files is interpreted to be consistent with DS9 (angle is w.r.t. the North direction in the image).

    Version 4.3.1 May 2006

    New features/Bug fixes since V4.3 include:

    • Expand capability to run fv with more than 9 parameters.

    Version 4.3 April 2006

    New features/Bug fixes since V4.2 include:

    • Add capability to invoke future HERA modules.
    • Add capablity to calculate Flux on region.
    • Add capability to handle "Physical" attribute in region file.
    • Add capability to center (and resize) of ROI (region of interest) when the image is zoomed.
    • Add capability to allow parameters editor to stay until user decided to cancel.
    • Fix running FTOOLS tools not copying physical par file problem.
    • Fix sorting Fits table but displaying wrong slice image problem.
    • Fix rotation of coordinates results in wrong region specification problem.
    • Fix plotting of selected rows from FITS table problem.
    • Fix ploygon region handle placement and dragging mechanisms problem.

    Version 4.2 April 2005

    New features/Bug fixes since V4.1.4 include:

    • Add X axis range selection utility in POW.
    • Add capablity to display 4D table and image (movie).
    • Add capablity to create/display region on image.
    • Add XPA entry points for X axis range selection and region display.
    • Fix one dimension plot/image label problem.
    • Update logic for display CAR projection.
    • Rework background backup directory cleanup logics.
    • Fix ploygon creation problem, allow right mouse button to drag the existing vertex, left mouse button for creation and move the region.
    • Add color changes capability in Edit Region Panel.
    • Change vizier/skyview/catalog file naming scheme.

    Version 4.1.4 September 2004

    New features/Bug fixes since V4.1.3 include:

    • Correct background backup directory cleanup process.
    • Add capability to plot to existing graph in DS9.

    Version 4.1.3 July 2004

    New features/Bug fixes since V4.1.2 include:

    • Update calculator, calculator expression help files.
    • Add licence.
    • Fix interface to VizieR.
    • Add A4 paper size.
    • Rework print interfac.
    • Fix preview orientation.
    • Fix preview page layout.
    • Add XPA entry points to print/save image on POW.
    • Update profile help files

    Version 4.1.2 May 2004

    New features since V4.1.1 include:

    • Adding support for Cartesian projection.
    • Adding record capability for profile of FITS image.
    • Enhanced capabilities for printing and saving FITS image or plot, including the ability to preview the image before printing.
    • A row selection function was added to fv. User can select/deselect row(s) by clicking on the row index in the table with the mouse's left button (or clicking left button then right button to select row range). Row(s) also can be selected using selection condition and expression.
    • fv's plot, calculator, histogram and statistics tools now can perform on the selected rows.
    • Export command can export the selected rows and columns from a table to fits file or text file.
    • Delete command will now delete the selected rows and cols.

    Version 4.1.1 January 2004

    New features since V3.2 include:

    • Enhanced support for ds9 image display
              User can choose to display images or plots using either 
              DS9 or POW as the primary display tool.  
    • Added more XPA points for controlling fv from external processes, including
              create: create an image or table file or extension.
              export: export hdu(s) to a Fits file or a text file.
              opentool: open skyview, catalog, vizier, or ftools dialog panel.
              preference: set up FV preferences.
              See Scripting for more information 
    • Allow user to reverse the functionality of the left and right mouse buttons within the POW display via pow's preferences setting
       
              default: Left mouse button  - control zoom
                       right mouse button - control brightness/contrast

    Version 3.2 October 2002

    New features since V3.1 include:

    • New function buttons have been added to the File Summary window to provide short cuts to common operations:
              - 'Hist' - displays a histogram image of 1 or 2 columns in a table 
              - 'Plot' - plots table columns 
              - 'Table All' and 'Table Select'
                       - The first button displays all the columns in a table, whereas the 
                         second button allows the user to select which columns to display.  
    • Vectors or images contained within a single binary table cell may be plotted.
    • When displaying Hierarchical grouping tables, a new 'OPEN' button is available at the beginning of each row which can be used to open the corresponding group member file.
    • Can display and edit images that are compressed with the new FITS 'Tile Compression' algorithm.

    Version 3.1 July 2002

    New features since v3.0 include:

    • Hundreds of tables available in VizieR can be queried to retrieve objects near a given position
    • Column histogram tool can be limited to a specified row range
    • New tool for editing the name, units and display format of columns
    • 'Export as text' options can print row numbers, and print a user-specified character string between each columns value
    • Double Right-clicking inside a pow graph redraws the graph with the default 1:1 zoom factor
    • If an HDU contains a 1-D image, the 'PLOT' button on the summary window plots the pixel value vs. pixel coordinate instead of displaying a long, thin image
    • The Zoom/in Zoom/out and replot buttons have been moved from the POW canvas and up into the menu bar
    • Integer columns with the TSCAL and TZERO keywords are treated as doubles to prevent data truncation
    • Rows of a vector table, either fixed or variable length, can be plotted

    Version 3.0 November 2000

    New features since v2.6 include:

    • Search online SkyView database for images or objects located in a given region of the sky
    • Execute an Ftool from within fv (Unix only)
    • Plot vector columns and subsets of rows
    • Smooth image extensions with a boxcar filter
    • Symlinks to files supported
    • Copy/Paste works in all table views
    • More scripting commands
    • New image analysis tools: Ruler (measure distances in an image), Profile (plot a cross-section of an image), Probe (calculate flux and centroid data of image region)
    • New DS9 region files supported

    Version 2.6

    New features since v2.5 include:

    • Ported to MacOS
    • Improved window management and improved design of some windows
    • Replaced Options menu with a Preferences window which brings together and categorizes all of fv's user-controlled options
    • New Auto-Plot preference
    • Can turn off the Desktop Manager
    • Expanded scripting capabilities via XPA mechanism
    • File Selection window shows file sizes and modification dates
    • POW's information/scope windows can be positioned on any side of the window or turned off altogether
    • New Histogram Equalization color table for images
    • New Text Label handling on graphs
    • Full font control over graph labels
    fv5.4/ftools/guis/fv/doc/calculator.html0000644000220700001010000001610210077212313017654 0ustar birbylheadev FITS table file calculator

    FITS Table Calculator

    [See also the Calculator Expressions help file for more details on the expression syntax].

    The calculator tool can be used to perform spread-sheet type calculations on columns in a FITS table. The expression is evaluated on each row of the table and the result is written either to an existing column in the table (overwriting the previous values), or to a new column. If "Apply only to selected rows" is checked, then the calculation will only be applied to the selected rows that have the row number (in the first column) highlighted.

    Results Column

    The entry field on the left hand side of the "=" sign is used to specify the name of the column to which the results will be written. Click on the the 'down arrow' icon to bring up a selection menu with a list of all the existing columns in the table. Otherwise, a new column name may be entered, in which case a new column with that name will be created when the calculation is performed.

    Normally, when creating a new column, the column's data type will be the same as that of the expression. That is, an integer expression will create a 4-byte integer column (TFORM = 1J) and a real expression will create an 8-byte double column (TFORM = 1D). This can be overridden by placing the desired TFORM value within parentheses after the column's name. For example, specifying a column name NewCol(1E) will create a new column named 'NewCol' with a TFORM of '1E'. (The numerical value is optional and will be filled in with the vector size of the expression.) The expression's results will thus be converted to a 4-byte real when written to the column, even though the result could be of type integer or double.

    Formula

    The entry field on the right hand side of the "=" sign is for entering the expression for calculation. You can either type in the expression or use the buttons. To use a column in the calculation, one just inserts the column's name. Below are some sample expressions.

    1. Add 100.0 to column TIME and save it as a new column with name NEWCOL:

      NEWCOL = 100.0 + TIME

    2. Multiply the RATE column by 2.0, overwriting the old RATE column value:

      RATE = 2.0 * RATE

    3. Create a new column with all the element value = 0.0 and save it in the table. This can also be used to create a new ASCII column with a initial value, e.g. NEWSCOL = "string value". Be sure the string has the quote characters around it.

      NEWCOL = 0.0

    4. Conditional operations ( > , < , == , >= , <= , && , || ) are also allowed. You can perform conditional evaluations, such as

      NEWCOL = (COLUMN1 > 3.0) ? expr1 : expr2

      The result of the above expression is expr1 if values in COLUMN1 is greater than 3.0, otherwise, expr2.

    5. Individual elements of a vector column may be referenced by specifying the element number within square brackets, as in:

      NEWCOL = COUNTS[1] + COUNTS[3]

      which will create a new scalar column equal to the sum of the 1st and 3rd elements of the COUNTS vector column.

    6. The value in an ASCII character column (TFORMn = 'A') may be used in conditional calculation using the '==', '!=', '>', and '<' operators. e.g. if a table lists the declination of a set of objects in 3 separate columns, one for the sign ('+' or '-') and 2 integer columns giving the degrees and minutes values, the the declination value in decimal degree can be calculated by:

      Dec = (deg_sign != "-") * (degree + minute/60.) - (deg_sign == "-") * (degree + minute/60.)

      In effect, the conditional expressions evaluate to 1 if true and 0 if false when multiplied by a numerical value.

    7. The calculator can also be used to copy one column to a new column. e.g.

      NEWCOL = ASCIICOL

      NEWCOL = TIME

      Illegal operations such as divide by zero will result in a Null value.

      To access a table entry in a row other than the current one, follow the column's name with a row offset within curly braces. For example, 'PHA{-3}' will evaluate to the value of column PHA, 3 rows above the row currently being processed. One cannot specify an absolute row number, only a relative offset. Rows that fall outside the table will be treated as undefined, or NULLs.

      If a calculation involves a column with Nulls or NaNs for certain rows, then these rows in the result column will be Nulls. An exception is if the Null is encountered within an && or || construction whose value is determined by the nonNull value. For example, "TRUE || NULL" evaluates to TRUE. The calculator has several special functions which can be used to test for Null values in columns.

      Calculator pad

      The expression to be calculated may be constructed by clicking on the calculator function buttons in the left 1/3 of the the window. Alternatively, the expression may be typed in directly in the formula window.

      Column name listing

      All the column names are listed as buttons. Clicking on any of them will insert (replacing any selected text) the column name in the formula window. If the number of columns is greater than 24, the "Up" and "Down" buttons can be used to scroll through the column name list.

      Functions

      Below are lists of all the functions supported by the calculator. For detailed descriptions of its operations, see the Calculator Expressions help file.

      Arithmetic functions supported:

      • abs(x)
      • cos(x)
      • sin(x)
      • tan(x)
      • acos(x)
      • asin(x)
      • atan(x)
      • atan2(y,x)
      • cosh(x)
      • sinh(x)
      • tanh(x)
      • round(x) - round to nearest integer
      • ceil(x) - round up to nearest integer
      • floor(x) - round down to nearest integer
      • exp(x)
      • sqrt(x)
      • log(x)
      • log10(x)
      • min(x,y)
      • max(x,y)
      • i % j - modulus operator
      • random() - random number in range [0.0, 1.0)
      • b?x:y - if 'b' then 'x', else 'y'

      Vector functions supported:

      • min(x)
      • max(x)
      • average(x)
      • median(x)
      • stddev(x) - Standard Deviation
      • sum(x)
      • nelem(x) - size of the vector
      • nvalid(x) - No. of non-null elements

      Boolean functions supported:

      • circle(x0,y0,R,rot,X,Y)
      • ellipse(x0,y0,Rx,Ry,rot,X,Y)
      • box(x0,y0,Rx,Ry,rot,X,Y)
      • near(x,y,delta)
      • gtifilter("file",time,"start","stop")
      • regfilter("file",X,Y,"wcs")

      NULL functions supported:

      • isnull(x)
      • defnull(x,y)

      Type conversions supported:

      • (double)x or (float)x
      • (int)x

      Go to About fv. fv5.4/ftools/guis/fv/doc/catalog.html0000644000220700001010000000504007200120157017132 0ustar birbylheadev Connect to a Catalog

      Connect to a Catalog

        This tool establishes a connection to the NASA SkyView server (at skyview.gsfc.nasa.gov) and downloads a catalog of objects within a specified region of the sky. The positions of the retrieved objects can be automatically plotted on the current graph if desired.
    8. Coordinate or Source

        This field is used to determine the center of the field to be retrieved. If you specify coordinates these are used as the center. When equatorial coordinates are being used the RA may be specified as either hh mm ss or ddd.fff, i.e., in hours or in decimal degrees. The coordinate fields must be separated by a comma or sign of the declination.

        If any letter is used in this field the field is assumed to be an object name and is sent to the SIMBAD name resolver to be resolved.

        Examples:

        6 45 10.76 -16 41 57.82

        6 45 10.76, -16 41 57.82

        101.2948411 -16.6993947

        101.2948411, -16.6993947

        sirius

    9. Search width

        size of the square region in which the objects are extracted.

    10. Choose desired catalog(s)

        This selection box allows you to select the catalog from which the objects are extracted. Use the left mouse button and click the desired catalog on the list box to select it. To deselect it, click it again. Multiple catalogs may be selected in this way. For details, please refer to

        http://skyview.gsfc.nasa.gov/cgi-bin/survey.pl

    11. Coordinate System

        Click on this field to choose among equatorial, galactic and ecliptic coordinates. The default is equatorial.

        You may select the equinox year to be used in Equatorial or Ecliptic coordinates. Any equinox year within about two centuries of the present may be used. The default is 2000.

    12. Plot on the current graph?

        Checking this box plots the coordinates of selected objects on the current graph.

    13. Submit

        Pressing this button submits the request to the server. This button will be disabled during the HTTP transaction.

    14. Reset

        Pressing this button resets the entries.

    15. Cancel

        Pressing this button closes the dialog box. This button will be disabled during the HTTP transaction.

    16. Help

        Pressing this button opens the help file.


      Go to About fv. fv5.4/ftools/guis/fv/doc/columnSelection.html0000644000220700001010000000336511222454374020705 0ustar birbylheadev Column selection

      Column selection of a HDU

      In this window, you select the columns in a table extension you want to display. By default, all the columns in the table are selected. By clicking on the column name, you can select and unselect individual columns. The total number of columns and rows are listed at the top of the window.

      Copy and paste a column from one table to another

        1. Select the range of values in the first table by clicking on the first row of the column (that cell will then be highlighted) and then move to the last row of the column, and, click on it while holding down the 'Shift' key. The whole range should then be highlighted.
        2. Copy the selected values into the clipboard, under the Edit menu (or use the Alt-C or Crtl-C short cut.)
        3. Select the first row of the column in the 2nd table, then paste the clipboard into that column using the 'paste' item under the Edit menu, or use the Alt-V or Ctrl-V short cut key.
      This technique can also be used to copy multiple columns or rows of data from one table to another. First click on the upper left cell to be copied, then click on the lower right cell of the rectangular region, while holding the 'Shift' key.

      Buttons

      Display Table

        Open a table window showing the data from all the selected columns.

      Select All

        Select all the columns for display.

      Clear All

        Unselect all the columns.

      Cancel

        Destroy the column-selection window without opening the table.

      Help

        This help page.

      Go to About fv. fv5.4/ftools/guis/fv/doc/columnStatistics.html0000644000220700001010000000135210027626700021100 0ustar birbylheadev Column Statistics

      Column Statistics

      This window is used to display the maximum, minimum, mean, row numbers of the first maximum and minimum values, and the standard deviation of columns.

      Click on a column name in the list box to calculate its statistics.

      To calculate statistics for sets of rows of the table, enter the row range in the "Row range" entry field or select rows in table window and check the "use selected rows" checkbox.

       Example row range values: 
         1-10             first 10 rows of the table
         2,4,6,8,10       list of individual rows
         4-8,20-30,40-60  list of ranges
      

      Go to About fv. fv5.4/ftools/guis/fv/doc/connectToHera.html0000644000220700001010000000223710714626712020275 0ustar birbylheadev fv Help: Connect to Hera

      Connect to Hera

      Hera is the new computer service provided by the HEASARC at the NASA Goddard Space Flight Center that enables qualified student and professional astronomical researchers to immediately begin analyzing scientific data from high-energy astrophysics missions.

      By clicking on "Connect to Hera..", fv will start up a Hera session. There are two basic requirements to run Hera:

      • A direct broadband Internet connection, and
      • Any firewall, if present, must be configured to allow communication with Hera servers.

      After brief moment, a login panel will start. If you have an estiablished account, typing your user ID and password to start use Hera. If you are new to Hera, use the right side panel of the login panel to estiablsh a new Hera account.

      For more information, visit the Hera web site at

      http://heasarc.gsfc.nasa.gov/hera/


      Go to Connect to Student Hera.

      Go to About fv.

      fv5.4/ftools/guis/fv/doc/connectToStudentHera.html0000644000220700001010000000521310714626712021641 0ustar birbylheadev fv Help: Connect to Student Hera

      Connect to Student Hera

      Hera is an interface to software and data provided by the High Energy Astrophysics Science Archive Research Center at NASA/Goddard Space Flight Center. The data are from satellites which detect x-rays and gamma rays from objects such as black holes, neutron stars, galaxies, and supernovae.

      This interface has been adapted for use by students, educators, amateur astronomers and the general public, and allows them to use the same software that astronomers use on the same data sets that astronomers analyze. These data may be used for extensions of classroom lessons, science fair projects, research projects, etc.

      Student Hera guides students through a self-assessed series of activities, starting with practice interpreting light curves for binary systems. Students then install Hera access data from the Rossi X-Ray Timing Explorer satellite (RXTE). Students analyze the data and compare their results with results in the professional literature. A file of the assessment results can be electronically saved and submitted to the professor.

      There are different ways to start up a Student Hera session. But first, tare two basic requirements to run Student Hera:

      • A direct broadband Internet connection, and
      • Any firewall, if present, must be configured to allow communication with Hera servers.

      For fv running on the Microsoft Windows and Apple Mac OS X, as of fv release 5.1, the installation procedure will produce 3 icons for users, fv, Hera and Student Hera. To start up any of these operation, just double click on the icon.

      For fv running on the regular UNIX machine (like Linux), user can start up Student Hera by typing this command on the command line prompt:

      fv -student

      Regular Hera can also be started on the command line via this command:

      fv -hera

      After brief moment, a login panel will start. If you have an estiablished account, typing your user ID and password to start use regular Hera. For Student Hera, only the user ID is needed. If you already have try Student Hera before, the last user ID used will be populated for you on the login panel. Or if you prefer, click on "New" to create a brand new ID.

      For more information on Student Hera, visit the Student Hera web site at

      http://imagine.gsfc.nasa.gov/docs/teachers/hera/what.html


      Go to Hera Connection Help.

      Go to About fv.

      fv5.4/ftools/guis/fv/doc/createNewFITS.html0000644000220700001010000000215710533603177020144 0ustar birbylheadev Create A New FITS File

      Create A New FITS File

      To create a new FITS file with a primary image array, you need to specify the following parameters:
      • File name: If a full path is not specified, the file will be created in the current directory (as shown in the open file dialog box).
      • Data Type: The basic data types are
        • Byte : bitpix = 8
        • Integer : bitpix = 16
        • Long : bitpix = 32
        • Float : bitpix = -32
        • Long Long : bitpix = 64
        • Double : bitpix = -64
        The first 3 can be either Signed or Unsigned. BSCALE and BZERO keywords will be created to produce the non-standard Signed Byte and Unsigned Integer and Long data types.
      • Dimensions: Provide the size of the array with a comma- or space-separated list of its dimensions. For example, a 3-dimensional image could be specified with "10 20 30", producing in image with dimensions of 10x20x30.

      Go to About fv. fv5.4/ftools/guis/fv/doc/deleteRows.html0000644000220700001010000000166607733661042017665 0ustar birbylheadev Row Deletion

      Row Deletion

      To delete rows from the table, provide either a list of row ranges or a conditional expression.

      By range

      A row range is in the form of first_row-last_row. You can give a list of row ranges separated by commas, e.g
       
         1-20, 25, 30-100
      

      By condition

      Use the calculator and column buttons to create a boolean formula (or type one in directly), indicating which rows should be deleted. All the rows that satisfy the condition (expression evaluates to TRUE, or not equal to zero) will be deleted.

      When the "Delete" button (or <Return> key) is pressed, fv will ask for confirmation before actually deleting the rows.

      See the calculator help page for information on how to specify the conditional expression.


      Go to About fv. fv5.4/ftools/guis/fv/doc/deskTopManager.html0000644000220700001010000000625610450541647020452 0ustar birbylheadev Fv Desktop Manager

      fv Desktop Manager

      The Desktop Manager is a window created at the top left of the screen that lets you manage all the fv windows on your desktop. All the "File Summary", "Header display", "Table display", "Image table display", and "Vector table display" windows of all the FITS files which are currently opened can be hidden/activated from the list under each category. Also, you have direct access to the "File Dialog", "Clipboard", and "Help" windows.

      Closing the Desktop Manager's window will cause fv to exit. You will be given the opportunity to save any modified files, or cancel. The desk top manager window can optionally be hidden/turned off from the Preferences window.

      Note: The Desktop Manager is not implemented for MacOS. All its features are available from the menubar. In particular, the window management items reside in the Mac-only Windows menu.

      The commands in the Desktop Manager are:

      • New File: Allows the creation of a new FITS file.
      • Open File: Bring up the file selection dialog.
      • SkyView: Retrieve images of sky at all wavelengths (from Radio to Gamma-Ray) from the NASA SkyView server.
      • Catalog: Retrieve a list of objects in a region of sky from selected catalogs at the NASA SkyView server.
      • VizieR: Retrieve tables from the Strasbourg VizieR or mirror servers.
      • Run Ftool: Run a Ftool program if the HEASOFT or FTOOL packages are installed.
      • Connect to Hera: Run Hera module.
      • Display Device: Select default display device (currently available choices are DS9 and POW).
      • Hide All Windows: When activated, all fv windows will be hidden. To get them back, go through each category ("File Summary", "Header" ... ).
      • File Summary: Lists the summary windows of all the files which are currently opened. Selecting the menu item will hide/activate the indicated summary window.
      • Header: List of all the opened header windows.
      • Table: List of all the opened table windows.
      • Image Table: List of all the opened image table windows.
      • Vector Table: List of all the opened vector table windows.
      • Preference: Open Preference Edit window.
      • Clipboard: Brings up the clipboard window, which shows the information on its contents.
        • Type: table - block of data from a table; keyword - a single keyword record; HDUs - HDUs from a FITS file
        • info: the number of elements in the content or keyword name.
        • Source: file name of the file the content is from.
      • Help: Bring up this help file.
      • Quit: Will quit fv.

      Go to About fv. fv5.4/ftools/guis/fv/doc/displayDevice.html0000644000220700001010000000134410437371274020326 0ustar birbylheadev fv Help: Display Device

      Display Device

      Display Device allow users to select either the built-in POW image viewer, or the external DS9 image viewer. (DS9 is distributed by the SAO at http://hea-www.harvard.edu/RD/ds9/)

      When running fv on Windows, selecting DS9 will cause fv to prompt users to supply the path of DS9 and XPA binaries if entry for either of them has not been established.

      Users of Windows fv can also change the paths of DS9 and XPA directories in Preference panel (under Graphs tab). Refer to Preference for more information.


      Go to About fv. fv5.4/ftools/guis/fv/doc/displayFormat.html0000644000220700001010000000351407731631250020354 0ustar birbylheadev Column Parameters

      Column

      Select the column to be edited by clicking on the downward arrow button to the right. Note changes will not be made unless the Apply button is pressed.

      Column Parameters

      This changes the TDISP keyword in the header of the CHDU. If the TDISP keyword does not exist, the entry field appear blank. A new TDISP keyword will be inserted when a value is entered and the Apply button pressed. If the TDISP keyword field is blank when Apply is clicked, a pre-existing keyword will be deleted.

      The allowed forms of the TDISP keyword for standard FITS files are:

      • Aw -- character string
      • Lw -- logical (T, F or U (undefined))
      • Iw.m -- integers
      • Bw.m -- Binary integers
      • Ow.m -- Octal integers
      • Zw.m -- Hexadecimal integers
      • Fw.d -- Floating-points
      • Ew.dEe, ENw.d, ESw.d -- Exponential form
      • Gw.dEe -- In either Floating-points form or exponential form
      • Dw.dEe -- Double precision
      where w is the width of the displayed value in characters, m is the minimum number of digits to display (filled with leading 0s), d is the number of digits after the decimal point, and e is the number of digits in the exponent.

      Column Units

      This changes the TUNIT keyword in the header of the CHDU. If the TUNIT keyword does not exist, the entry field appear blank. A new TUNIT keyword will be inserted when a value is entered and the Apply button pressed. If the TUNIT keyword field is blank when Apply is clicked, a pre-existing keyword will be deleted.

      New Name

      This changes the TTYPE keyword in the header of the CHDU, only if the new name is different from the current one. A column name cannot be blank.


      Go to About fv. fv5.4/ftools/guis/fv/doc/expressions.html0000644000220700001010000004730410222027214020111 0ustar birbylheadev FITS file calculator expressions

      FITS File Calculator Expressions

        General Syntax
      
          The expression can  be an arbitrarily  complex  series of operations
          performed on constants, keyword values,  and column data taken  from
          the specified FITS TABLE extension.  For  the case of row filtering,
          the expression must evaluate to a single boolean  value for each row
          of the table.
      
          Keyword and   column data  are referenced by   name.  Any  string of
          characters not surrounded by    quotes (ie, a constant  string)   or
          followed by   an open parentheses (ie,   a  function name)   will be
          initially interpretted   as a column  name and  its contents for the
          current row inserted into the expression.  If no such column exists,
          a keyword of that  name will be searched for  and its value used, if
          found.  To force the  name to be  interpretted as a keyword (in case
          there is both a column and keyword with the  same name), precede the
          keyword name with a single pound sign, '#', as in '#NAXIS2'.  Due to
          the generalities of FITS column and  keyword names, if the column or
          keyword name  contains a space or a  character which might appear as
          an arithmetic  term then inclose  the  name in '$'  characters as in
          $MAX PHA$ or #$MAX-PHA$.  Names are case insensitive.
      
          To access a table entry in a row other  than the current one, follow
          the  column's name  with  a row  offset  within  curly  braces.  For
          example, 'PHA\{-3\}' will evaluate to the value  of column PHA, 3 rows
          above  the  row currently  being processed.   One  cannot specify an
          absolute row number, only a relative offset.  Rows that fall outside
          the table will be treated as undefined, or NULLs.
          
          Boolean   operators can be  used in  the expression  in either their
          Fortran or C forms.  The following boolean operators are available:
      
          "equal"         .eq. .EQ. ==  "not equal"          .ne.  .NE.  !=
          "less than"     .lt. .LT. <   "less than/equal"    .le.  .LE.  <= =<
          "greater than"  .gt. .GT. >   "greater than/equal" .ge.  .GE.  >= =>
          "or"            .or. .OR. ||  "and"                .and. .AND. &&
          "negation"     .not. .NOT. !  "approx. equal(1e-7)"  ~
      
          The expression may  also include arithmetic operators and functions.
          Trigonometric  functions use  radians,  not degrees.  The  following
          arithmetic  operators and  functions  can be  used in the expression
          (function names are case insensitive). A null value will be returned
          in case of illegal operations such as divide by zero, sqrt(negative)
          log(negative), log10(negative), arccos(.gt. 1), arcsin(.gt. 1).
      
          "addition"           +          "subtraction"          -
          "multiplication"     *          "division"             /
          "negation"           -          "exponentiation"       **  ^
          "modulus"            i % j      "absolute value"       abs(x)
          "sine"               sin(x)     "arc sine"             arcsin(x)
          "cosine"             cos(x)     "arc cosine"           arccos(x)
          "tangent"            tan(x)     "arc tangent"          arctan(x)
          "hyperbolic sine"    sinh(x)    "arc tangent (2)"      arctan2(y,x)
          "hyperbolic cosine"  cosh(x)    "hyperbolic tangent"   tanh(x)
          "exponential"        exp(x)     "square root"          sqrt(x)
          "natural log"        log(x)     "common log"           log10(x)
          "round to nearest int" round(x) "random # [0.0,1.0)"   random()
          "round up to int"    ceil(x)    "round down to int"    floor(x)
          "minimum"            min(x,y)   "maximum"              max(x,y)
          "cumulative sum"    accum(x)   "sequential difference" seqdiff(x)
          "angular separation"  angsep(ra1,dec1,ra2,de2) (all in degrees)
          "if-then-else"      b?x:y
      
      
          An alternate syntax for the min and max functions  has only a single
          argument which  should be  a  vector value (see  below).  The result
          will be the minimum/maximum element contained within the vector.
      
          The accum(x) function forms the cumulative sum of x, element by element.
          Vector columns are supported simply by performing the summation process
          through all the values.  Null values are treated as 0.  The seqdiff(x)
          function forms the sequential difference of x, element by element.
          The first value of seqdiff is the first value of x.  A single null
          value in x causes a pair of nulls in the output.  The seqdiff and
          accum functions are functional inverses, i.e., seqdiff(accum(x)) == x
          as long as no null values are present.
      
          The angsep function computes the angular separation in degrees
          between 2 celestial positions, where the first 2 parameters
          give the RA-like and Dec-like coordinates (in decimal degrees)
          of the first position, and the 3rd and 4th parameters give the
          coordinates of the second position.
      
          In the  if-then-else expression, "b?x:y",  b is an  explicit boolean
          value or  expression.  There is  no automatic type  conversion from
          numeric to boolean values, so  one needs to use "iVal!=0" instead of
          merely "iVal"  as the boolean  argument. x and  y can be  any scalar
          data type (including string).
      
          The  following  type  casting  operators  are  available,  where the
          inclosing parentheses are required and taken  from  the  C  language
          usage. Also, the integer to real casts values to double precision:
          
                      "real to integer"    (int) x     (INT) x
                      "integer to real"    (float) i   (FLOAT) i
          
          In addition, several constants are built in  for  use  in  numerical
          expressions:
          
             #pi           3.1415...         #e            2.7182...
             #deg          #pi/180           #row          current row number
             #null         undefined value   #snull        undefined string
          
          A  string constant must  be enclosed  in quotes  as in  'Crab'.  The
          "null" constants  are useful for conditionally  setting table values
          to a NULL, or undefined, value (eg., "col1==-99 ? #NULL : col1").
          
          There is also a function for testing if  two  values  are  close  to
          each  other,  i.e.,  if  they are "near" each other to within a user
          specified tolerance. The  arguments,  value_1  and  value_2  can  be
          integer  or  real  and  represent  the two values who's proximity is
          being tested to be within the specified tolerance, also  an  integer
          or real:
                          near(value_1, value_2, tolerance)
          
          When  a  NULL, or undefined, value is encountered in the FITS table,
          the expression will evaluate to NULL unless the undefined  value  is
          not   actually   required  for  evaluation,  eg.  "TRUE  .or.  NULL" 
          evaluates to TRUE. The  following  two  functions  allow  some  NULL
          detection  and  handling:
      
               "a null value?"              ISNULL(x)
               "define a value for null"    DEFNULL(x,y)
      	 
          The former
          returns a boolean value of TRUE if the  argument  x  is  NULL.   The
          later  "defines"  a  value  to  be  substituted  for NULL values; it
          returns the value of x if x is not NULL, otherwise  it  returns  the
          value of y.
      
        Bit Masks
      
          Bit  masks can be used to select out rows from bit columns (TFORMn =
          #X) in FITS files. To represent the mask,  binary,  octal,  and  hex
          formats are allowed:
          
                       binary:   b0110xx1010000101xxxx0001
                       octal:    o720x1 -> (b111010000xxx001)
                       hex:      h0FxD  -> (b00001111xxxx1101)
          
          In  all  the  representations, an x or X is allowed in the mask as a
          wild card. Note that the x represents a  different  number  of  wild
          card  bits  in  each  representation.  All  representations are case
          insensitive.
          
          To construct the boolean expression using the mask  as  the  boolean
          equal  operator  discribed above on a bit table column. For example,
          if you had a 7 bit column named flags in a  FITS  table  and  wanted
          all  rows  having  the bit pattern 0010011, the selection expression
          would be:
          
                                  flags == b0010011
          or
                                  flags .eq. b10011
          
          It is also possible to test if a range of bits is  less  than,  less
          than  equal,  greater  than  and  greater than equal to a particular
          boolean value:
          
                                  flags <= bxxx010xx
                                  flags .gt. bxxx100xx
                                  flags .le. b1xxxxxxx
          
          Notice the use of the x bit value to limit the range of  bits  being
          compared.
          
          It  is  not necessary to specify the leading (most significant) zero
          (0) bits in the mask, as shown in the second expression above.
          
          Bit wise AND, OR and NOT operations are  also  possible  on  two  or
          more  bit  fields  using  the  '&'(AND),  '|'(OR),  and the '!'(NOT)
          operators. All of these operators result in a bit  field  which  can
          then be used with the equal operator. For example:
          
                                (!flags) == b1101100
                                (flags & b1000001) == bx000001
          
          Bit  fields can be appended as well using the '+' operator.  Strings
          can be concatenated this way, too.
      
        Vector Columns
      
          Vector columns can also be used  in  building  the  expression.   No
          special  syntax  is required if one wants to operate on all elements
          of the vector.  Simply use the column name as for a  scalar  column.
          Vector  columns  can  be  freely  intermixed  with scalar columns or
          constants in virtually all expressions.  The result will be  of  the
          same dimension as the vector.  Two vectors in an expression, though,
          need to  have  the  same  number  of  elements  and  have  the  same
          dimensions.   The  only  places  a vector column cannot be used (for
          now, anyway) are the SAO  region  functions  and  the  NEAR  boolean
          function.
      
          Arithmetic and logical operations are all performed on an element by
          element basis.  Comparing two vector columns,  eg  "COL1  ==  COL2",
          thus  results  in  another vector of boolean values indicating which
          elements of the two vectors are equal. 
          
          Eight functions are available that operate on a vector and return a
          scalar result:
      
          "minimum"      MIN(V)          "maximum"               MAX(V)
          "average"      AVERAGE(V)      "median"                MEDIAN(V)
          "sumation"     SUM(V)          "standard deviation"    STDDEV(V)
          "# of values"  NELEM(V)        "# of non-null values"  NVALID(V)
      
          where V represents the name of a vector column or a manually 
          constructed vector using curly brackets as described below.  The
          first 6 of these functions ignore any null values in the vector when
          computing the result.
          
          The SUM function literally sums all  the elements in x,  returning a 
          scalar value.   If V  is  a  boolean  vector, SUM returns the number
          of TRUE elements. The NELEM function  returns the number of elements
          in vector V whereas NVALID return the number of non-null elements in
          the  vector.   (NELEM  also  operates  on  bit  and string  columns, 
          returning their column widths.)  As an example, to  test whether all 
          elements of two vectors satisfy a  given logical comparison, one can
          use the expression
          
                    SUM( COL1 > COL2 ) == NELEM( COL1 )
          
          which will return TRUE if all elements  of  COL1  are  greater  than
          their corresponding elements in COL2.
          
          To  specify  a  single  element  of  a  vector, give the column name
          followed by  a  comma-separated  list  of  coordinates  enclosed  in
          square  brackets.  For example, if a vector column named PHAS exists
          in the table as a one dimensional, 256  component  list  of  numbers
          from  which  you  wanted to select the 57th component for use in the
          expression, then PHAS[57] would do the  trick.   Higher  dimensional
          arrays  of  data  may appear in a column.  But in order to interpret
          them, the TDIMn keyword must appear in the header.  Assuming that  a
          (4,4,4,4)  array  is packed into each row of a column named ARRAY4D,
          the  (1,2,3,4)  component  element  of  each  row  is  accessed   by 
          ARRAY4D[1,2,3,4].    Arrays   up   to   dimension  5  are  currently 
          supported.  Each vector index can itself be an expression,  although
          it  must  evaluate  to  an  integer  value  within the bounds of the
          vector.  Vector columns which contain spaces or arithmetic operators
          must   have   their   names  enclosed  in  "$"  characters  as  with 
          $ARRAY-4D$[1,2,3,4].
          
          A  more  C-like  syntax  for  specifying  vector  indices  is   also 
          available.   The element used in the preceding example alternatively
          could be specified with the syntax  ARRAY4D[4][3][2][1].   Note  the
          reverse  order  of  indices  (as in C), as well as the fact that the
          values are still ones-based (as  in  Fortran  --  adopted  to  avoid
          ambiguity  for  1D vectors).  With this syntax, one does not need to
          specify all of the indices.  To  extract  a  3D  slice  of  this  4D
          array, use ARRAY4D[4].
          
          Variable-length vector columns are not supported.
          
          Vectors can  be manually constructed  within the expression  using a
          comma-separated list of  elements surrounded by curly braces ('{}').
          For example, '{1,3,6,1}' is a 4-element vector containing the values
          1, 3, 6, and 1.  The  vector can contain  only boolean, integer, and
          real values (or expressions).  The elements will  be promoted to the
          highest  datatype   present.  Any   elements   which  are themselves
          vectors, will be expanded out with  each of its elements becoming an
          element in the constructed vector.
      
        Good Time Interval Filtering
      
          A common filtering method  applied to  FITS  files is a time  filter
          using a Good Time Interval (GTI)  extension.  A high-level function,
          gtifilter(a,b,c,d),  is  available   which  performs this    special
          evaluation, returning a boolean result for each time element tested.
          Its syntax is
      
             gtifilter( [ "filename" [, expr [, "STARTCOL", "STOPCOL" ] ] ] )
      
          where  each  "[]" demarks   optional parameters.   The  filename, if
          specified,  can be  blank  ("") which will    mean to use  the first
          extension  with   the name "*GTI*"  in   the current  file,  a plain
          extension  specifier (eg, "+2",  "[2]", or "[STDGTI]") which will be
          used  to  select  an extension  in  the current  file, or  a regular
          filename with or without an extension  specifier which in the latter
          case  will mean to  use the first  extension  with an extension name
          "*GTI*".  Expr can be   any arithmetic expression, including  simply
          the time  column  name.  A  vector  time expression  will  produce a
          vector boolean  result.  STARTCOL and  STOPCOL are the  names of the
          START/STOP   columns in the    GTI extension.  If   one  of them  is
          specified, they both  must be. Note that  the quotes surrounding the
          filename and START/STOP column names are required.
      
          In  its  simplest form, no parameters need to be provided -- default
          values will be used.  The expression "gtifilter()" is equivalent to
          
             gtifilter( "", TIME, "*START*", "*STOP*" )
          
          This will search the current file for a GTI  extension,  filter  the
          TIME  column in the current table, using START/STOP times taken from
          columns in the GTI  extension  with  names  containing  the  strings
          "START"  and "STOP".  The wildcards ('*') allow slight variations in
          naming conventions  such  as  "TSTART"  or  "STARTTIME".   The  same
          default  values  apply for unspecified parameters when the first one
          or  two  parameters  are  specified.   The  function   automatically 
          searches   for   TIMEZERO/I/F   keywords  in  the  current  and  GTI 
          extensions, applying a relative time offset, if necessary.
      
        Spatial Region Filtering
        
          Another common  filtering method is  a  spatial filter using  a SAO-
          style region file.  The syntax for this high-level filter is
      
             regfilter( "regfilename" [ , Xexpr, Yexpr [ , "wcs cols" ] ] )
      
          The region file name is required, but the rest is optional.  Without
          any explicit expression for the X and Y coordinates (in pixels), the
          filter will search for  and operate on columns "X"  and "Y".  If the
          region file is   in "degrees" format  instead  of "pixels" ("hhmmss"
          format is not supported, yet), the  filter will need WCS information
          to convert the region coordinates to pixels.  If supplied, the final
          parameter string contains the names of the 2 columns (space or comma
          separated) which contain   the   desired WCS information.    If  not
          supplied, the filter  will scan the X  and Y expressions for  column
          names.  If only one is found in each  expression, those columns will
          be used.  Otherwise, an error will be returned.
      
          The region shapes supported are (names are case insensitive):
      
             Point         ( X1, Y1 )               <- One pixel square region
             Line          ( X1, Y1, X2, Y2 )       <- One pixel wide region
             Polygon       ( X1, Y1, X2, Y2, ... )  <- Rest are interiors with
             Rectangle     ( X1, Y1, X2, Y2, A )       | boundaries considered
             Box           ( Xc, Yc, Wdth, Hght, A )   V within the region
             Diamond       ( Xc, Yc, Wdth, Hght, A )
             Circle        ( Xc, Yc, R )
             Annulus       ( Xc, Yc, Rin, Rout )
             Ellipse       ( Xc, Yc, Rx, Ry, A )
             Elliptannulus ( Xc, Yc, Rinx, Riny, Routx, Routy, Ain, Aout )
             Sector        ( Xc, Yc, Amin, Amax )
      
          where (Xc,Yc) is  the coordinate of  the shape's center; (X#,Y#) are
          the coordinates  of the shape's edges;  Rxxx are the shapes' various
          Radii or semimajor/minor  axes; and Axxx  are the angles of rotation
          (or bounding angles for Sector) in degrees.  For rotated shapes, the
          rotation angle  can  be left  off, indicating  no rotation.   Common
          alternate  names for the regions  can also be  used: rotbox <-> box;
          rotrectangle <-> rectangle;  (rot)rhombus <-> (rot)diamond;  and pie
          <-> sector.  When a  shape's name is  preceded by a minus sign, '-',
          the defined region  is instead the area  *outside* its boundary (ie,
          the region is inverted).  All the shapes within a single region file
          are AND'd together to create the region.
      
          There are three functions that are primarily for use with SAO region
          files, but they  can  be  used  directly.  They
          return  a  boolean true   or  false  depending   on  whether a   two
          dimensional point is in the region or not:
      
          "point in a circular region"
                circle(xcntr,ycntr,radius,Xcolumn,Ycolumn)
          
          "point in an elliptical region"
               ellipse(xcntr,ycntr,xhlf_wdth,yhlf_wdth,rotation,Xcolumn,Ycolumn)
          
          "point in a rectangular region"
                   box(xcntr,ycntr,xfll_wdth,yfll_wdth,rotation,Xcolumn,Ycolumn)
          
          where 
             (xcntr,ycntr) are the (x,y) position of the center of the region
             (xhlf_wdth,yhlf_wdth) are the (x,y) half widths of the region
             (xfll_wdth,yfll_wdth) are the (x,y) full widths of the region
             (radius) is half the diameter of the circle
             (rotation) is the angle(degrees) that the region is rotated with
                   respect to (xcntr,ycntr)
             (Xcoord,Ycoord) are the (x,y) coordinates to test, usually column
                   names
             NOTE: each parameter can itself be an expression, not merely a
                   column name or constant.
          
      
          For  complex  or commonly  used filters,  one   can also  place  the
          expression into a text file and import it  into the calculator using
          the  syntax  '@filename.txt'.  The   expression can  be  arbitrarily
          complex and extend over multiple lines of the file.
      

      Go to About fv. fv5.4/ftools/guis/fv/doc/fileSelection.html0000644000220700001010000000512307043074071020317 0ustar birbylheadev File Browser

      File Browser

      Directory Navigation

      The top of the window consists of 3 buttons with which you can change the current directory. The first button displays the current directory name. Clicking on the button brings up a popup menu showing the entire directory hierarchy with the current directory at the bottom. Select one of the other directories to jump to that position in the hierarchy.

      The next button, showing a folder icon with an arrow, will move you up one directory level.

      The final button, initially reading "FTP...", will allow you to connect to an FTP server and browse its files. You will be prompted to enter a host name, user name, and password. If no user name is entered, fv will open an anonymous ftp connection. When connected, the button text will change to "Local...". Clicking it will return you to your local computer.

      File list box

      The file listing shows the names of all files which have the form specified in "File of type" field, their file sizes, and last modification dates. When the "List Fits files only" is selected, only FITS files are shown as well as all the compressed files. Double click a file name to open that file. Directories are listed with "/" (":" on MacOS). Double click a directory name to move to that directory.

      File name

      In the "File Name" field, the currently selected file name is shown. One can type a partial filename and press TAB to invoke automatic filename completion. One can also type a directory path to move quickly to another location without having to navigate all the intervening directories.

      File of type

      The file list will be filtered using the wildcard string contained in this entry field.

      Open as read-only

      To open the current file as read-only, enable the check button. If a file is opened as read-only, you will not be able to save any changes you make to the file. You will still be able to edit the file and save the modifications to a new file, though.

      List Fits files only

      To show only the FITS files in the "Files" list, enable the check button. Also, compressed files are listed.

      Open (or Save)

      Click this button to open the currently selected FITS file and bring up a overview of the FITS file. This button will instead read "Save" after selecting the "Save As" command.

      Cancel

      Quit from the file selection dialog.

      Help

      Bring up this help file.
      Go to About fv. fv5.4/ftools/guis/fv/doc/fileSummary.html0000644000220700001010000001054410042015373020023 0ustar birbylheadev Fits File Summary

      Summary of a FITS file

      This window lists information about all the HDUs (Header Data Units) in the opened FITS file. It includes:
      1. Index : Extension number (0 is Primary Image)
      2. Extension: Name of the extension.
      3. Type : Type of the extension.
        • Binary -- Binary table extension.
        • ASCII -- ASCII table extension.
        • Image -- Primary array or Image extension.
      4. Dimension: Size of each extension.
      5. View :
        • Header -- Display/Edit header.
        • Hist -- Displays a histogram image of 1 or 2 columns in a table
        • Image/Plot -- Display image or plot table column values. The default image display device (POW or ds9) may be selected under the Edit->Preferences->Graphs menu item.
        • Table -- Display a table. (If the extension is an image, then numerical values of the image are displayed as a table).

          All - displays all the columns in a table
          Select - allows the user to select which columns to display.

        • By clicking each button, users are allowed to display and edit the FITS file.

      Menus

      Several menu items operate on "selected" HDUs. One selects HDU's by clicking on the checkbutton next to the HDUs' index.
      • File
        • New File...: Create a new FITS file.
        • Open File...: Open another FITS file. See File Selection for details.
        • Save: Save any changes to the original file.
        • Save As...: Save file (with modifications) to a new file.
        • Export HDUs...: Save the selected HDUs into a new file.
        • Make HDU Listing...: Save Extension Name, Type and Dimension in an ASCII file.
        • Revert: Throw away any unsaved modifications and reopen the last-saved version of the file.
        • Close: Close the current Summary window and the opened file. If file has been modified, you will be given the opportunity to save the file before closing.
        • Quit: Quit fv. If any open file has been modified, you will be given the opportunity to save it before exitting.
      • Edit
        • Undo: Not support in summary windows.
        • Cut HDUs: Delete the selected HDUs. The deleted HDUs go to the clipboard.
        • Copy HDUs: Copy the selected HDUs to the clipboard. Only one item (could be a list of HDUs though, as long as multiple HDUs are cut/copied at once from a file) is kept in the clipboard.
        • Paste HDUs: All the HDUs in the clipboard are appended to the current file.
        • Clear: Not supported in summary windows.
        • Clipboard: Show the contents of the clipboard.
        • New Extension: A new empty extension will be appended to the current file. You can select whether to append an image, ascii table, or binary table.
        • Preferences: Bring up a window from which fv's behavior and appearance can be modified. See the Preferences help file for details.
      • Tools
        • Plot : Plot all the selected valid HDUs(images and tables).
        • Smooth Images: Smooth all the selected image HDUs. The two parameters, width and the height of the smoothing box, will be entered by users.
        • SkyView: Retrieve images of sky at all wavelengths (from Radio to Gamma-Ray) from the NASA SkyView server.
        • Catalog: Retrieve a list of objects in a region of sky from selected catalogs at the NASA SkyView server.
        • VizieR: Retrieve a list of objects in a region of sky from selected catalogs at the Strasbourg VizieR web site.
        • Run Ftool: Run a Ftool program if the HEASOFT or FTOOL packages are installed.
        • Help: A listing of all available help files.

        Go to About fv. fv5.4/ftools/guis/fv/doc/ftool.html0000644000220700001010000001227207176102257016665 0ustar birbylheadev Run Ftools

        Run Ftools

        This tool is the GUI client of console FTOOL programs. It takes advantage of the rich functionalities of FTOOL tools and integrates them into fv. With this utility, to run a FTOOL program, you no longer need to leave the fv and open the other console window. However, you need to install the FTOOL or HEASOFT package to use this utility.

        Menus

        There are four menus.
        • Ftool
          • Run :Run the selected tool program.
          • Cancel : Cancel the current running tool program.
          • tool help : Open the help file for the selected tool.
          • Clear Log : Clear Log window.
          • Dump Log: Dump the content of Log window to a log file.
          • Exit: Terminate this tool.
        • Packages
            Listing of the sub-packages of tools. When one of them is selected, its contents will appear on the tool window.
        • Favorite You can choose tools from different sub-packages and assemble them in your favorite group.
          • Go to... : Go to your favorite group.
          • Add...: Add current selected tool to the favorite group.
          • Delete...: Delete the selected tool from the favorite group.
          • Reset...: Delete every tool from the favorite group.
          • Configure Configure the tool path, parfile path, and help file path, whether to save the parameters automatically, and whether to clear the log window automatically.
        • Help :
          • About this program... : Open this help file.
          • About selected tool.. : Open the help file for the selected tool.

        Tool Window

        When you selected a sub-package from Packages menu button, a listings of tools in this sub-package and its brief description will appear in this window. To select the desired tool, click the left mouse button on it.
        • Add to Favorite : Add the selected tool to the favorite group.
        • Run : Run the selected tool. It opens the Parameter Dialog or Command Dialog depending on whether the task is parameter file based or a script.
        • Cancel : Terminate the Running tool.
        • tool Help : Open the tool help window.

        Log Window

        This window records the output of the tool when it is running.
        • Clear Log : Clear Log window.
        • Dump Log: Dump the content of Log window to a log file.
        • Exit: Terminate this tool.

        Parameter Dialog

        This window is opened when the Run Button is pressed. It displays the listings of parameters of the selected tool if it is parameter-based. It consists of three columns, name, description, and value. You can enter the parameter value or set the Yes/No radio buttons in the Value field. For a parameter asking file name(s), you can press the Browser button next to it to open a file selection dialog . All the mandatory parameters are shaded with green color.
        • Show hidden : Toggle between showing or hiding the hidden parameters.
        • Reset : Reset the parameter values to system default values.
        • OK : Accept the current values, close this dialog and start to run the tool.
        • Cancel : Close this dialog without running the tool.
        • Help : Open the help file of the tool.

        Command Dialog

        This window is opened when the Run Button is pressed if the corresponding tool is not parameter-based. The command is entered in the Command field. The Output Fits File field is optional. It tells the program the file name of the output Fits File, so it can open the File Summary after the command is successfully finished.
        • OK : Accept the command, close this dialog and start to run the command.
        • Cancel : Close this dialog without running.
        • Help : Open the help file for the command.

        File Selection Dialog

        This window is opened when the browser Button in the Parameter Dialog is pressed. To select a desired file, use left mouse to click on it then press either the Apply to... or Append to... button. The file name will be entered or appended on the Value field. When appending, a separator in the Separator field will be inserted before the file name is appended.

        The attributes of the selected file can also be selected by the radio buttons, Output and Input , and the check box Fits file . When both the Output and Fits file are set, a File Summary window will be opened after the tool successfully finishes its execution.


        Go to About fv. fv5.4/ftools/guis/fv/doc/fv_scripting.html0000644000220700001010000004647710450541647020254 0ustar birbylheadev fv Scripting

        fv Scripting Guide

        Because fv and POW are written in Tcl, they are inherently scriptable. So long as one knows the necessary data structures and function calls, everything fv does can be controlled by a user-created Tcl script running inside of fv. This, however, is a formidable task. Plus, fv's internal behavior and data are subject to change with each new release.

        To make scripting possible, then, a simplified (and hence limited) script interface has been added to fv. It consists of a small set of commands which perform the basic operations of opening FITS files and displaying their contents. Future versions should contain more capabilities.

        (Note: This method of scripting fv replaces an earlier method. Although the older method still can be used, it is deprecated.)


        Operational Summary


        There are several ways to access fv's scripting commands. The simplest is to write a Tcl script which uses the commands directly and then have fv execute it. Give the script a ".fv" filename extension so that fv can recognize it. This method requires the user to open the file interactively within fv (using the same method as opening a FITS file). This scripting method is useful for implementing macros which can perform certain common operations at the user's request.

        Alternatively, fv can be scripted by other programs, allowing those programs to make use of fv's capabilities remotely. These programs, however, do not need to be written in Tcl so long as they can communicate with fv. Currently fv supports XPA on unix platforms and AppleScript on MacOS for communication:

        The XPA messaging system (http://hea-www.harvard.edu/RD/xpa/) developed by the SAO/HEAD R&D group implements a method of communicating between two programs running on unix platforms. Communication occurs either through standalone programs (ie, xpaget and xpaset), a C subroutine library, or a Tcl extension. fv uses the Tcl extension to make its scripting commands available, but the calling program can use any of the XPA methods to access the commands. The XPA software is not distributed with fv and must be obtained and built by the user. (Use '--with-tcl=$FV/lib' when configuring XPA to have it build the tcl extension; if not installing XPA into the fv directories, using '--prefix=$FV', one must also set the LD_LIBRARY_PATH environment variable to point to the directory containing libtclxpa.so.)

        AppleScript (http://www.apple.com/applescript), the English-like language on all Macintosh computers (circa MacOS 7.5 and up), can also be used to control fv remotely. (Actually, any program on the Mac can control fv through the use of Apple Events.) Using the do script command, Tcl code can be passed to fv. Due to how Tcl's do script command and fv's scripting commands are implemented, fv commands must be prefixed with the fvCmds:: namespace specifier.

        Many scripting commands also can be used as inquiries. Inquiries and commands are implemented using the same syntax, differing only in that commands supply the necessary parameters to perform an action, whereas inquiries leave them off indicating fv should return the current settings. When used with XPA, inquiries must use the xpaget tool and commands the xpaset tool.


        Command Summary


        close ?extNum ...?
        Close the current file or one of its extensions. If no extension numbers are specified, the entire file will be closed, potentially exitting fv if no windows remain open. To close all extensions, but keep the file open, give an extNum of -1. Otherwise, specify the particular extensions which should be closed; this will close any windows (header or table) linked to that extension.
        create file fileName signed/unsigned bitpix dimension
        Create a file by providing fileName with keyword signed or unsigned and a value for bitpix (8, 16, etc). Also users need to provide value for dimension (11, 22 23, etc).
        create extension extName image signed/unsigned bitpix dimension
        Create an image extension extName in current opened FITS file with keyword signed or unsigned and a value for bitpix (8, 16, etc). Also users need to provide value for dimension (11, 22 23, etc).
        create extension extName table binary/ASCII
        Create a table extension extName in current opened FITS file with keyword Binary or ASCII to indicate what type of extension is going to be created.
        delete rows extNum rowRange
        Delete rows of extension extNum of the currently selected file. An example rowRange is 2-10,15-20.
        delete cols extNum colName(s)
        Delete columns of extension extNum of the currently selected file. Column names should be separated by the space.
        display header extNum
        Open a window containing the header keywords of extension extNum of the currently selected file. If extNum is current or ".", use the default extension (or zero if undefined).
        display table extNum ?columnName ...|frame?
        Open a window containing the extension data in a table format. If a real table extension, one can either supply a series of column names to display or "-" to display all the columns. Not specifying a number will pop-up a column selection box requiring user input. If the extension is an image, no arguments are required unless it has 3 dimensions in which case the desired frame must be specified. If extNum is current or ".", use the default extension (or zero if undefined).
        display image extNum ?start? ?end?
        Display the contents of the extension as an image using either POW or DS9, depending on fv's settings. If the image has 3 dimensions, the frames to plot must be specified. If both a start and end frame are supplied, the frames will be animated in POW. If extNum is current or ".", use the default extension (or zero if undefined).
        display curve extNum -rows|-cols start ?end? ?currGraph?
        Display a scatter plot of pixel intensity vs axis index from selected rows or columns in an image. If both start and end are present, the range of rows/cols will be averaged before plotting. currGraph is a boolean flag indicating whether this curve should be placed on the currently selected graph in POW. If false/zero (or absent), a new graph will be created. If extNum is current or ".", use the default extension (or zero if undefined).
        display curve extNum X xErr Y yErr ?currGraph? ?rowrange?
        Plot an X vs Y curve from a table. Errors for X and Y can optionally be displayed. Both error parameters must be present, although an empty place-holder ({}) can be used to indicate the absence of errors. Each of these parameters can be either a simple column name or a complex arithmetic expression evaluated using the extension's data. The optional parameter, currGraph, is a boolean flag indicating whether this curve should be placed on the currently selected graph in POW. If false/zero (or absent), a new graph will be created. The parameter, rowrange specify which rows' data will be plot. If extNum is current or ".", use the default extension (or zero if undefined).
        export hdu extNum ?fileName?
        Export a given extNum in the current fits file. The result file will be saved in the current directory and be opened after the exporting function is finished. The optional 'fileName' argument specify the output file name.
        export summary extNum ?fileName?
        Export the summary in a given extNum in the current file to a text file. The result file will be named with _hdu.txt at the end or 'fileName' and saved in the current directory.
        exporttable fileName option extNum
        Export the selected columns and rows from the table in a given extNum in the given fileName to a fits file or text file. The option will be hdu and text. The valid extNum will be 0, 4 and etc.
        insert rows extNum afterRow numRows
        Insert 'numRows' rows after row 'afterRow' in a given extNum in the current file.
        insert col extNum colName colFormat ?beforeCol
        Insert a column in a given table (extNum) at the end or before 'beforeCol' in the current file.
        help operation ...
        Display short help on UNIX command line. The valid value for operation, can be just one or a list of, are close, create, delete,display, export, ecporttable,insert,open, opentool, pow, preference, quit, save, select, sort, tcl, version
        open filename ...
        Open one or more FITS files. The full paths to the files should be specified since fv will probably have a different working directory than the caller (ftp/http urls are acceptable). Without a filename, a list of open files will be returned. (When used with XPA, inquiries must use the xpaget tool).
        opentool toolName
        Open available ftools dialog. The valid values for toolName are skyview, catalog, vizier, or ftools
        pow powCommand ...
        Execute one of POW's scripting commands. These commands are described in the POW Scripting Guide.
        preference parameter ?value?
        Set fv preference.
        preference parameter valid value
        open preference panel open N/A
        close preference panel close N/A
        minimize preference panel minimize N/A
        iconify preference panel iconify N/A
        select preference page page App, Keywords, Tables, Graphs, and Colors
        display File Selection fileSelection Open, Close
        color choice activebackground red, green, #cccccc, etc
        color choice activeforeground red, green, #cccccc, etc
        color choice background red, green, #cccccc, etc
        color choice checkbuttoncolor red, green, #cccccc, etc
        color choice foreground red, green, #cccccc, etc
        graph display displayer ds9, pow, saotng
        graph display graphsize 300x300, 500x300, 300x500
        500x500, 700x500, 500x700
        700x700
        desk topy help help N/A
        auto-plot primary image autoplotprimary 0 - deselect
        1 - select
        automatic format keys autoreformatkeys 0 - deselect
        1 - select
        automatic update
        checksum
        autoupdatechecksum 0 - never
        1 - if exist
        2 - always
        display Fits
        file only
        dispfitsonly 0 - deselect
        1 - select
        left justify string leftjustifystring 0 - right
        1 - left
        protect required keyword protectedkeys 0 - deselect
        1 - select
        show desktop manager usedesktopmanager 0 - deselect
        1 - select
        use WCS info wcsinfo 0 - deselect
        1 - selects
        write history key
        after modification
        writehiskey 0 - deselect
        1 - select
        Window Management winmanagement Keep, Hid, Close
        quit
        Quit fv.
        save ?fileName?
        Save current file. If fileName is specified, the file will be saved under that name. A pre-existing file of that name will be overwritten.
        select fileIndex|fileName ?extNum?
        Select an opened file for manipulation. One can specify it either as an index into the list of opened filenames returned by the open command or as a proper filename. fileName can be either a fully-specified pathname of the file or just the filename itself. The optional extNum can be used to select a default extension which can be used in some other commands. A fileName of current or "." can be used to modify the default extension of the current file. Without parameters, the full pathname of the default file will be returned. (When used with XPA, inquiries must use the xpaget tool).
        sort extNum ?-unique? ?-ascending|-descending? colName ?-ascending|-descending? colName ...
        Sort a table extension according to the supplied colNames. Each column can be sorted in either -ascending or -descending order. The default is ascending, but a column will inherit the order of a previous column, if not explicit set. If the -unique flag is set, duplicate rows which contain identical sorted values will be deleted, leaving only one such row per unique set of values.
        tcl
        Execute tcl code read from stdin (XPA support only).
        version
        Return fv version number. When used with XPA, inquiries must use the xpaget tool.

        Examples


        The following commands will open 2 files and display their contents in several ways.

          open ngc1316r.fit rate.fit       # open 2 files included with fv
          select rate.fit                  # select one of files
          display header 1                 # Open window of first extension's keywords
          display curve 1 time rate        # Plot a curve of time vs rate in POW
          pow bounds 720 -30 950 300       # Resize graph's bounding box
          select ngc1316r.fit              # Select other file
          display image 0                  # Plot image
          set x [version]                  # Get fv's version number
        
        Type the preceding lines (without the comments) into a text file, name it commands.fv, then run it: either put it in the command line when starting fv (eg, "fv commands.fv") or open the file with the Open File menu item.

        Using XPA from a Unix shell, one would do the following:

          xpaset -p fv open ngc1316r.fit rate.fit
          xpaset -p fv select rate.fit       
          xpaset -p fv display header 1            
          xpaset -p fv display curve 1 time rate   
          xpaset -p fv pow bounds 720 -30 950 300  
          xpaset -p fv select ngc1316r.fit        
          xpaset -p fv display image 0             
          xpaget    fv version
        
        The -p option tells xpaset to not read any data from stdin. One can instead use stdin to send a series of Tcl commands en masse, using the command...
          cat commands.fv | xpaset fv tcl
        
        This latter method allows one to insert real Tcl commands into the command sequence, whereas the individual xpaget/xpaset calls are restricted to the specific scripting commands.

        Finally, if using AppleScript, the commands are...

          tell application "fv"
            activate
            do script "fvCmds::open ngc1316r.fit rate.fit"
            do script "fvCmds::select rate.fit"
            do script "fvCmds::display header 1"
            do script "fvCmds::display curve 1 time rate"
            do script "fvCmds::pow bounds 720 -30 950 300"
            do script "fvCmds::select ngc1316r.fit"
            do script "fvCmds::display image 0"
            do script "fvCmds::version"
            set x to the result
          end tell
        
        Note that AppleScript will actually start fv if it isn't already running.

        Additional examples of scripting can be found in the sample_scripts directory within the fv distribution.

        fv5.4/ftools/guis/fv/doc/headerDisplay.html0000644000220700001010000000554207200120157020305 0ustar birbylheadev Header Display/Edit

        Header window

        This window lists all the header information.

        To edit a keyword entry, single click that keyword using the left mouse button. The entry will be copied into an entry box at the bottom of the window. Make your modifications there and then press <Return> to make the changes.

        After selecting a keyword, the right mouse button (Control-Click on MacOS) will bring up a menu for editing. You can insert a new keyword in front of the selected keyword or delete it. An Undo function is also available. These functions are also listed in the Edit menu.

        If the highlight for a keyword is brown, you have selected a mandatory keyword and can only edit its comment. You also cannot insert a new keyword within the initial set of mandatory keywords. This keyword protection can be deactivated from the Preferences window. Warning: modifying mandatory keywords can corrupt your FITS file and may cause fv to crash.

        The "Search for" entry box allows you to search for strings in the header. Type the string in the entry box and click "Find". Click the "Case sensitive" button to toggle between case sensitive and case insensitive searching mode.

        Menus

      • File
        • Save: Save current FITS file. If the current extension has not been modified, this menu item is disabled.
        • Export as Text: The contents of the header will be dumped to an ASCII file.
        • Close: Close the header window.
        If the "Write History Keyword" option is on (see Preferences help), then a HISTORY keyword is added to the file, listing the user name and date, when a modified extension is closed/saved.

      • Edit
        • Undo: Undo an action. Unlimited undos are available.
        • Cut: Delete the current keyword and copy it to the clipboard.
        • Copy: Copy the current keyword to the clipboard.
        • Paste: Insert the contents of the clipboard at the current position.
        • Clear: Delete the current keyword and insert a new one.
        • Clipboard: Display the contents of the clipboard.
        • Insert Key: Insert a new keyword before the currently selected one
        • Delete Key: Delete the currently selected keyword
        • Preferences: Open fv's preferences dialog box
      • Tools
        • Create Checksum: Create new checksum keywords
        • Verify Checksum: Check the validity of the checksum keywords, if they exist. If incorrect or nonexistant, correct values can be calculated.

      Go to About fv. fv5.4/ftools/guis/fv/doc/imageDisplay.html0000644000220700001010000000571110222027214020133 0ustar birbylheadev Fits Image Table

      Image Table display

      The table window presents a spreadsheet-like display of the
      contents of the given FITS image extension.  Row numbers run along the
      left side of the window and column numbers run along the top (below the
      menubar).  Single click on a data cell to copy the value to the "Edit
      cell" entry at the bottom of the window, where one can immediately edit the
      value. Press <Return> in that entry to finalize the changes.
      
      If the FITS image is simultaneously displayed in the POW image viewer, then 
      double clicking with the mouse on any pixel in the POW image will cause
      the corresponding cell in the table display to be highlighted.

      Menus

      • File
        • Save: Save current FITS file. If the current extension has not been modified, this menu item is disabled.
        • Export as Text: You will be able to specify which rows and columns to list, as well as any special separater character(s) to be inserted in between the values on each row. You may optionally choose which rows to be listed by highlighting the desired row numbers in the first column of the table.
        • Close: Close the table window.
      • Edit
        • Undo: Not supported in table windows.
        • Cut: Not supported in table windows.
        • Copy: To highlight a rectangular region of a table, first left-click on the table cell in one corner of the rectangle, then right-click on the cell in the opposite corner (Shift-Click on MacOS).
        • Paste: Paste the contents of the clipboard at the location of the current selection/region.
        • Clear: Not supported in table windows.
        • Clipboard: Bring up contents of the clipboards. If the type is listed as "table", its contents can be pasted into the table.
        • Preferences: Bring up the Preferences window.

      • Tools
        • Plot

          Display image data in user's prefered image device (see Preferences).

      • Help

        List of all the available help files.

      User entries

      Two entry boxes are located at the bottom of the Table window:
      • Go to: Scroll the window to display the row specified in the entry field. Either click the "Go To" button or hit <Return> to move to the indicated row.
      • Edit cell: Highlighting a cell in the table will copy the value to this entry, in which the value can be edited. To set a table element as undefined, one can enter "NULL" as the value (BLANK keyword must be present in the header for integer data types). Press <Return> to copy the new value into the table.

      Go to About fv. fv5.4/ftools/guis/fv/doc/imagePlot.html0000644000220700001010000000176707733661042017473 0ustar birbylheadev fv Help: Image Plot

      Image Plot

      Plots of the intensity profile through an image, averaged over specified rows or columns can be extracted from an image table by specifying the following information:

      Plot Rows or Plot Columns

      Select whether you want to plot row or column data from the table. The line plot will be the image data versus the row/column index.

      Row/Column Range To Plot

      List the row/column index to plot or, to plot an average of multiple rows/columns, list the index range in the form of "start-end".

      Add curve

      Indicate whether the resulting curve should be plotted in the currently selected graph in POW. If unset (the default), a new graph will be created.

      Note that the interactive 'Draw Profile" tool in POW can be used to display the intensity profile along a line drawn at any angle through the image


      Go to About fv. fv5.4/ftools/guis/fv/doc/license.html0000644000220700001010000000300410216356221017144 0ustar birbylheadev FV License -- License Agreement

      FV License Agreement

      Copyright (Unpublished--all rights reserved under the copyright laws of
      the United States), U.S. Government as represented by the Administrator
      of the National Aeronautics and Space Administration.  No copyright is
      claimed in the United States under Title 17, U.S. Code.
      
      Permission to freely use, copy, modify, and distribute this software
      and its documentation without fee is hereby granted, provided that this
      copyright notice and disclaimer of warranty appears in all copies.
      
      DISCLAIMER:
      
      THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND,
      EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO,
      ANY WARRANTY THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY
      IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
      PURPOSE, AND FREEDOM FROM INFRINGEMENT, AND ANY WARRANTY THAT THE
      DOCUMENTATION WILL CONFORM TO THE SOFTWARE, OR ANY WARRANTY THAT THE
      SOFTWARE WILL BE ERROR FREE.  IN NO EVENT SHALL NASA BE LIABLE FOR ANY
      DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT, INDIRECT, SPECIAL OR
      CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM, OR IN ANY WAY
      CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY,
      CONTRACT, TORT , OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY
      PERSONS OR PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED
      FROM, OR AROSE OUT OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR
      SERVICES PROVIDED HEREUNDER.
      
      fv5.4/ftools/guis/fv/doc/oldscripting.html0000644000220700001010000000511510077547325020244 0ustar birbylheadev fv scripting

      fv scripting

      What for?

      With an fv script, one can automate some of the interactive procedures in fv. e.g. using an fv script file, one can open a FITS file, and display the header of the third extension, or plot X and Y column in the table on the fourth extension, or do them both.

      Writing an fv script

      Fv scripting is designed in an object-oriented fashion. But you don't have to know much about OO to use it. The only thing you need to know is that you have to create a FITS object first, and then ask the FITS object to do the things you want it to do. All the commands need to be saved in an ASCII file with the ".fv" extension.

      Creating a FITS object

      To create a FITS object, use the command:
      	FVFile object_name
      
      where object_name is of your choice. The first two things you need to do after that are:
      • object_name setFileName file_name
      • object_name setFileMode file_mode
      where file_name is the name of the file and file_mode is an integer flag specifying how to open the file. The file name can be a simple path on your local machine, or a URL of a file on a remote host (see File Selection). To access files on a remote ftp site, you need to write file_name in the form of
            ftp://username:password@host.domain/directory/filename
      
      If the remote host is an anonymous ftp site, one can replace the username and password with "anonymous" and one's email address.

      The values and meaning of file_mode are as follows:

      • 0: open pre-existing file as read/write
      • 1: open pre-existing file as read only
      • 2: create a new FITS file

      Available actions

      The scripting capability is currently rather limited and is deprecated in preference to a newer, more powerful interface. Right now, you can only do the following
      • object_name setExtension ext_number
      • object_name displayTable
      • object_name displayImage
      • object_name setXColumn column_name
      • object_name setYColumn column_name
      • object_name setXErrorColumn column_name
      • object_name setYErrorColumn column_name
      • object_name plotTable # do the above four commands first (Only setXColumn and setYColumn are required).

      Go to About fv. fv5.4/ftools/guis/fv/doc/plotDialog.html0000644000220700001010000000505110027627003017623 0ustar birbylheadev Select Plot Data

      Select Plot Data

      This is a very general plotting tool that allows you to plot a set of X,Y points calculated from the columns of data in a table. For example you can:
        - plot the values in a single column versus row number in the table
        - plot the values in one column versus the values in a second column
        - plot the values calculated from a general expression that is a
          function of one or more columns of the table versus the values
          calculated from any other general expression.
      
      In each case, error bars in the X and/or Y coordinates may be plotted on the points. If the column name contains a space or a character which might appear as an arithmetic term, then enclose the name in '$' characters, as in '$MAX-PHA$' or '$RA(J2000)$'.

      List box

      All the displayed columns are listed in this box led by the RowNumber (row number index) and ElementNumber (vector element index).

      Axes

      Specify the X and Y axes, and X Error and Y Error (optional) for plotting. To link a column to an axis, select the column name in the left list box first and then click on the axis button. The linked column name will appear in the "Column" entry box. One can also type in an arithmetic expression (see the Expressions help file). To specify a single element of a vector column, append "[i]" to the column's name, where i is the element's index (indices run from 1 to N, the vector length of the column). When a pair of compatible vectors (vectors having the same length, with ElementNumber always compatible) are plotted against each other, a separate curve will be created and plotted for each row.

      Rows

      Indicate the row ranges to plot. If left blank, all rows will be plotted.
        Examples: 
         1-100         plot the first 100 rows
         20-40,60-80   plot rows 20-40 and rows 60-80
      

      Use selected rows

      Indicate to plot the data on the selected rows in the table.

      Add curve

      Indicate whether this curve should be plotted in the currently selected graph in POW. If unset (the default), a new graph will be created.

      Go

      Make the plot. After the plot is created you can then edit the style of the plot to change the size or color of the plot symbols, or connect the points with lines.

      Clear

      Clear all the selections.

      Cancel

      Cancel.

      Help

      Brings up this help file.
      Go to About fv. fv5.4/ftools/guis/fv/doc/preferences.html0000644000220700001010000001152611272362055020040 0ustar birbylheadev Preferences

      Preferences

      The Preferences window contains user-controlled options for how fv behaves and looks. Click on one of the labeled tabs to bring up one of the following sets of options...

      • App
        • List FITS files only: If turned on, only FITS file will be listed in the file-selection-dialog.
        • Show Desktop Manager: Turn desktop manger on/off.
        • Window Management: Select one of the following behaviors.
          • Leave existing windows open when opening new one
            All the opened windows will be kept on the desktop.
          • Hide existing windows open when opening new one
            Only keep one window of a kind on the desktop. e.g. if displaying a header, will hide all the other header windows. All the hidden windows are listed in the desktop manager.
          • Close existing windows open when opening new one
            Will close all the existing fv windows of the same kind. Will ask to save any change made.
          • Html Browser (Unix only)
            Web browser setting. User can specify which browser to use to display web pages. If it is required in fv or Hera operation and user has not specified his/her perference, "netscape" will be substitued in the entry provided. On Windows, this option will not be displayed since the default browser will be opened via Windows "start" command.
      • Keywords
        • Write History Keywords: If turned on, a HISTORY keyword (with date and user name) is written in the header unit when a change to the extension is saved.
        • Auto-reformat Keys: If enabled, all the keywords inserted/changed in the Header window will be reformatted to a fixed format. When disabled, keyword entries will be written exactly as you type them.
        • Protect required keys: If enabled, you will not be able to modify required keywords such as BITPIX, NAXIS, TFORM, etc, or insert keywords within the initial set of required keywords.
        • Checksum Updates: When turned on, fv will update checksum keywords in an extension's header when modifying the extension.
      • Tables
        • ASCII Column Justification: Choose whether you'd like ASCII columns to be left or right justified.
      • Graphs
        • Auto-Plot Primary Image: When on, the primary image of a FITS file will be automatically plotted when the file is opened.
        • Use WCS Info: fv can choose to either use or ignore any WCS (World Coordinate System) keywords in the FITS file when creating a graph. With WCS Info turned off, graphs will be created using pixel coordinates.
        • Image Viewer: Select whether images should be display using POW (included with fv) or or DS9 (products of the Harvard SAO/HEAD R&D group). When user selects DS9 on Windows platform, Preference will give user the ability to supply (or to correct) DS9 and XPA library path.
        • Graph Size: Select the default graph size to use (in screen pixels) when creating a new graph (image or curve) using POW. Sizes are given as "width x height".

          Click on "Configure..." to modify the graph size list.

          To delete one of more size(s), on the "fv: Graph Size" top panel, click the button in front of the selection (could click on more than one selection.) And then click on "Delete" to delete the selection(s).

          To add a new graph size, on the "fv: Graph Size" bottom panel, input new width and height. The new size (in width x height) will show up on top of "Available Graph Size" if it is a new one.

          Click "OK" or "Cancel" to exit.

      • Colors
        • Click on the appropriate button to change the color of the background/foreground/Active background/Active foreground/Check button.
        • Use Up/Down arrow to change the font size. Fv panels will be rendered with new font size once "Save" is clicked.

        Click the Save button to permanently save your preferences. Location of saved preference:

        • UNIX: saved in ~/.fvrc;
        • Windows: saved in <Installed fv Root>\lib\fv\fv.ini;
        • Mac OS: saved in the Preferences folder as fv Preferences.


        Go to About fv. fv5.4/ftools/guis/fv/doc/selectRows.html0000644000220700001010000000165410027627060017667 0ustar birbylheadev Row Selection

        Row Selection

        To select rows from the table, provide either a list of row ranges or a conditional expression.

        By range

        A row range is in the form of first_row-last_row. You can give a list of row ranges separated by commas, e.g
         
           1-20, 25, 30-100
        

        By condition

        Use the calculator and column buttons to create a boolean formula (or type one in directly), indicating which rows should be selected. All the rows that satisfy the condition (expression evaluates to TRUE, or not equal to zero) will be selected.

        When the "Select" button (or <Return> key) is pressed, fv will highlight the selected rows in the table.

        See the calculator help page for information on how to specify the conditional expression.


        Go to About fv. fv5.4/ftools/guis/fv/doc/sortColumn.html0000644000220700001010000000177207043074071017705 0ustar birbylheadev Sort Columns

        Sort Columns

        One can sort a table using up to three columns as sorting keys. All the available columns are listed in the left list box.

        Selecting keys

        Click on the desired column name in the list box then click on any of the "Primary Column", "Second Column", or "Third column" buttons on the right. The column name will be placed in the entry box for that sort key. Only the primary column is required.

        Ascending options

        Any of the columns selected as a sorting key can be sorted in the ascending or decending order by (de)selecting the associated checkbox.

        Logical type columns are treated as int arrays of 0/1, and the BIT type (X) columns are sorted by the first bit.

        Delete option

        If selected as "Yes", rows with identical sort key values will be deleted (i.e. only one row will be kept, the rest are removed from the file).
        Go to About fv. fv5.4/ftools/guis/fv/doc/startFv.html0000644000220700001010000000477111741102061017162 0ustar birbylheadev fv Help: starting FV

        Starting FV

        To start up fv on Unix workstations, enter 'fv' in a command window. You may optionally append the name of a FITS file, or multiple files, to be opened. For example, 'fv ngc1316o.fit' opens a single file, and 'fv ngc*' opens all the FITS files in the current directory whose names match the string. On PCs running MS Windows you may start fv either by double clicking on the fv desktop icon, or by dragging a FITS file from e.g. Windows Explorer onto the fv icon. It is also possible to set up your Windows or Unix environment so that you can just double click (in the File Manager or on an e-mail attachment) on a FITS file that has a standard extension like '.fit' or '.fits' and then have fv automatically start up and open that file.

        Environment Variable FVTMP

        The environment variable FVTMP defines the directory that fv will use to create temporary files. On Unix machines, you may set this variable in your .login file, or in a .[t]cshrc file as

          setenv FVTMP /temporary/directory/path
        or in a .bashrc as
          export FVTMP=/temporary/directory/path
        Under MS Windows, open the Control Panel and click on System and Environment tabs, and type "FVTMP" in Variable entry box and disk:\temporary\directory\path in the Value entry box.

        cmap Option

        Fv usually chooses an appropriate color map value by default, but it sometimes fails to recognize architectures supporting TrueColor mode and fails with a "X Error: BadMatch" message. The solution to this is to restart fv with the -cmap 2 option.

        Here is a list of available cmap options when starting fv (e.g., 'fv -cmap 2':

         cmap 0 - Default behavior.  I.e. choose the "best" colormap.
         cmap 1 - Force POW to setup a new private pseudocolor colormap (very safe)
         cmap 2 - Force POW to use truecolor mode (very safe, but looks bad on low 
                  color displays and runs slower than pseudocolor).  Note: this will
                  cause powSetupColormap to look for a truecolor visual; if it can't
                  find one, it will allow the main Tk code to pick a visual, but POW
                  will still use "truecolor mode" (i.e. the Tk photo widget) to 
                  display images.
         cmap 3 - Force use of the screen default colormap. This should be
                  reasonably safe now, but often won't be what you want.
        

        Go to About fv. fv5.4/ftools/guis/fv/doc/tableDisplay.html0000644000220700001010000001775710451023706020163 0ustar birbylheadev Fits Table

        Table display

        The table window presents a spreadsheet-like display of the contents of the given FITS table extension. Row numbers run along the left side of the window and column names run along the top (below the menubar). Single click on a data cell to copy the value to the "Edit cell" entry at the bottom of the window, where one can immediately edit the value. Press <Return> in that entry to finalize the changes.

        Below the column names are listed the data formats and (if present) the units labels for the columns. If an "Expand" button appears below the column information, the column is a vector column. Clicking on the "Expand" button will bring up a 2-D table, displaying all the vector elements.

        Menus

        Not all of the following menu items are supported in all table windows. Many apply only to tables of real table extensions, but not to vector tables.

        • File
          • Save: Save current FITS file. If the current extension has not been modified, this menu item is disabled.
          • Export HDU: The whole or partial table will be saved as a new fits file.
          • Export as Text: You will be able to specify which rows and columns to list, as well as any special separater character(s) to be inserted in between the values on each row. You may optionally choose which rows to be listed by highlighting the desired row numbers in the first column of the table or by using "Select Rows from Expr" under the Edit munu.
          • Close: Close the table window.
        • Edit
          • Undo: Not supported in table windows.
          • Cut: Not supported in table windows.
          • Copy: To highlight a rectangular region of a table, first left-click on the table cell in one corner of the rectangle, then right-click on the cell in the opposite corner (Shift-Click on MacOS).
          • Paste: Paste the contents of the clipboard at the location of the current selection/region.
          • Clear: Not supported in table windows.
          • Clipboard: Bring up contents of the clipboards. If the type is listed as "table", its contents can be pasted into the table. Data types could conflict and give incorrect results or errors.
          • Insert ->
            • Row: A new row information window will appear in which the number of rows and their insertion point are entered. Enter "end" as the insertion point to append rows to the table.
            • Column: You will be presented with a new column information window in which you can specify the column's name, its data format, its optional units label and display format, and where to place the new column. The name and format are required. Sample legal format for a binary table are 15A (string of 15 characters), 1L, 1X, 1B, 1I, 1J, 1E, 1D, 1C, 1M. A bintable column of type Xn is a vector of n elements). For ASCII tables, sample format types are A15, I10, E12.5, D20.10, F14.6, etc. Allowed formats for each table type are selectable in a popup menu.
          • Delete ->
            • Selected Rows: Delete all the selected row(s). Rows can be selected (unselected) by clicking mouse on the rows or by clicking Selected Rows From Expr button in Edit menu.
            • Selected Columns: Delete all the selected column(s). To select (or unselect) a column, click on the checkbox next to the column's name in the main window.
          • Select Rows From Expr...: Select rows from the table, provide either a list of row range or a conditional expression (see Selected Rows From Expr).

          • Column Parameters...: Change the display format of a column by adding/modifying the column's TDISP keyword. Select the column from the popup menu then type in a new TDISP value and click the "Apply" button. Leave the entry box blank to delete the TDISP keyword. Legal TDISP keywords have the format of: Aw Lw Iw.m Bw.m Ow.m Zw.m Fw.d Ew.dEe ENw.d ESw.d Gw.dEe Dw.dEe (see Column Parameter help file and FITS documentation for details). Example formats:
            • I6 : display as integers of width 6
            • F5.2: display as floating points of width 5 with 2 digits after decimal point.
          • Preferences: Bring up the Preferences window.

        • Tools
          • Plot

            Create a scatter plot of table data. A column selection window will appear, from which you can select the columns to plot. You can also enter arithmetic expressions. See Plot Dialog for details.

          • Sort Rows

            Sort the table. You can select from the dialog box, at most, three columns to sort on. The sorted table will replace the original table, so the FITS file must be opened as read/write. A "delete duplicates" option can be given to eliminate extra rows with identical sort keys. (See Sort Columns for more details.)

          • Calculator

            Perform a calculation with the table. You will be presented with a calculator-like dialog box in which you can enter an arithmetic expression to evaluate for each row of the table. You can store the results in either a new column or a pre-existing one. See the Calculator help file for more details.

          • Histogram

            Make a 1D or 2D histograms from column(s). The histogram dialog box gives you control over the histogram size, binning, and row range to use. See Histogram help file for details.

          • Statistics

            Calculate statistical information (mean, std. dev, etc) on a table's columns. See Column Statistics for details.

        • Help

          List of all the available help files.

        User entries

        Two entry boxes are located at the bottom of the Table window:
        • Go to: Scroll the window to display the row specified in the entry field. Either click the "Go To" button or hit <Return> to move to the indicated row.
        • Edit cell: Highlighting a cell in the table will copy the value to this entry, in which the value can be edited. To set a table element as undefined, one can enter "NULL" as the value (TNULLn keyword must be present in the header). Press <Return> to copy the new value into the table.

      Column Entries

      Select

      Selection will be highlighted in yellow.

      • All: Select all rows.
      • Invert: Counter-select of selected (if any) row(s). If no selection has been made, previously, all rows will be selected when this button is pressed.
      Modify
      • Expand: Expanding the column. This button only exists if the column is a 2-D array.
      • Sort: Sorting the column (thus the whole table) via two pull-down menu tabs (Ascending and Decdending),
      • Move Before: Moving the selected column to before one of the other columns, or end of the table.
      • Show Col: Show hidden column(s). It will be greyed out if there is no hidden column.
      • Hide Column: Hide current column.
      • Insert New Column: Open the insertion dialog panel for creating a new column on the right to current column.
      • Delete: Delete current column.
      • Parameter: Open column parameter editting panel.

      Go to About fv. fv5.4/ftools/guis/fv/mac/0002755000220700001010000000000012565673764014663 5ustar birbylheadevfv5.4/ftools/guis/fv/mac/MW_fvHeader.pch0000644000220700001010000000021607016575575017477 0ustar birbylheadev#pragma precompile_target "MW_fvHeaderPPC" #include "tclMacCommonPch.h" #include #include #include #include fv5.4/ftools/guis/fv/mac/fv.sit.hqx0000644000220700001010000071376507205037106016612 0ustar birbylheadev(This file must be converted with BinHex 4.0) :#8*eD@aN,R0TG!"6594%8dP8)3#3!`+SQ`#3"$cr8dP8)3!"!!+SQh*-BA8#8`# 3!aEGh5!J"8*eD@aN!*!D"E)*KJ%Y!#`"[3%l!*!$"`#3$iB!!!%1rj!%!q#edZ` PYMQR`J#3"4Z5!3#3"3+S&Irarr`!!-0!!!!#!5!J"fCTG(08Bf`!N"JiC3Q'!C) "!3)L!@!!N!-"!*!$&J!!0FF!N!-@!*!$pJ!!!3i!0J!"!q#dAbiHYMQRdJ#3"3' 5%J#3"M64rr(rr!!!`d!!!"Ei!!d*CQPdFe4ME#kj!*!@"d)*KJ#3$iB!!$9A!*! $KJ#3!`&069"b3eG*43%!VhJcrEBjP"F!N!8"NK)!N!Bcm3!!&H3!N!C+e3CiqYZ &RrZm2$GCb"k3!1A)3["X18i@9XGfDpaEf-)AYKPCMMblYHHhXUK-&qEaSdF@-U! %6chTiqRKmb,iMjfEhEjNC#',Nik6KE$Pb1l)BJ02`TH6E$*DM!`f@A3a[K`RNdd Qbj&pj$KC##r*,@6KC(GN)C[FBXDAiq5AimZ44BS9AYRDeANY%lC0cmhFH(),'@b bbA'bb5e2EL((bF*AFL[!H[CGQGFjk2c1Lh,2DqERe56+*l([c8RHpVbmhXl0cUk cehkc3IR0mc)[*bkk'#r*YNRm'RG'&T[BfpQEPjF0[2c)lV3'0V#6,"1bma)!#b" JI1m9[Yl2Uc@[6UjYRl!M2%J1NMd`eJ(`"B!!R*rR!1$DD4TlRMIQH50hH52[rB) hm[j4ch[G(H6F0M)k`Y&G5p*11"pN@C4QILY,em*f-FLeT5ce#2Y(2Hr3hhMHBBY (*M`h)X[YI#RlKpKeR9'hHKkE'cr2K5,[m&jERM[BkpLRUDcHlr&ZmVchE#SeGkS Ep8BSSE4-K*)QJFU5B&DGmUPLlK6a+"cjhKFEHQ*C4)hFYK`9q9`l[Lm-1Q(f(kh [cBQlDjSH4,cAH0lY*i,636d1mMc-Df["#aHjYY(bQr-rfE)EQ6C*qI2CR`S%!81 G*&c$[PC9BLTb&j&al1qJRkac05[jQA,cclImAl$i"GjhPHF,k6MV)XYIBZHH'8k @jm[+#BeipeUGbqdqbmTcA1!SE8c0#6f8P93cZiI(RpTdQRZVB0M1dHLk%q,PJ0$ "II6)QG*FN`E6*"T(dqVC'BS6f"N5'Mq'I5`ld(kbMG4ipJRX%pP2B6q9I4,lC2B Tl+Ha!b"6bjY'Vl5UM*@(XPr(rRVfel,I9ijVa2X`qm[CAmPq2rXlf6r)rQlVp4c f"[DCePpk#"Er(2X+pMHbYl%[C'pREf9[CJG#AXhq-qahPa!5mIDacl+1-!I-chc f+`fH,bJK)q,0XJ0'kpMI8miQ815#eYAXkpNhX&mMM02lGH`EfDpR[i&p%r[65jK b1rpQpXhX+pR[CAmE1e6L([DIC9p93P(%HiMpVHaAX-mVB5[LIC4p,[X@pNlfVHc Ef'pN[iPp1r[0l,H`hmS1YHYLhmQqLhfhBF)cf0pRXhda1f!0MS!&2mrq*[Dc$5Z Q'REX0FbCEAJ#2S!Yd`dRIXV`TBPpKUL0hKX0Dmi`M!*R`#L`jURXL`bV`*[hXVq +r9hXVf&IA%*da,ZlK&aJfU9APaP1,@@(JqjR[ihpQHbhXpr"ILIlXpLIcIiFpZH +5qRpqH`[B(mrq`X0+bpRr`$lLpMIcYj58SZ)pclfPl'[C[pTGSM,5pPrN[eTl#p QIiRKjIF@D$1)NTD89Hq0[(Qfk2Ke[jiQH4U(IRfUHFq4GApL@[Ji[#jQ,@Ue++I 1,m#lReMF*a9F0h*KC-qSS#5cP'$%R9l)L"9JkEY!&`EjZLj5h`bcPG#IkIq[q*+ D&DLP-c&pld*l2HT)ceNrfkTl0aXjM5a'594%34bG&EYiC'eDc)ZJ21cjlajY@Lc 3)$Kd48P3[(cp(*XZc&&UP98ARpHlT(f-Ua`NeQj*A8em!QhNcNJd,&KS)mZ225J kj'S2PVHeDVBaZEH4J)%l`m+Ih1M&DIDI`Paj,3YGfCC`icXBDJPE%"$dQPb5r@9 YqMpf+r9r`'kPrJrCV6I'@!EdIKIl$Ha[B&r,2TCpRACG`a"K"#fYLKkLS-G!`U& )V#cd*!+"X$T$!GKT&"Z$k`CkBSQ*+Kl8dZYU+cB'PfIVJjccUM(hkEccZ'`0@%m mR4+Y1CD[hL*l!6B4CbckbZFiBeH)[rCB4aB2,"Q*9T6)Q[)4pQ635QAcq#*lAE0 4mXMrCUm[6SAB0*4X&U1DBB)e3XR'F8+"ZUjMd-,4K(3rP@`K*kCjL-9#bESa*ST MaE$LM*eG6E&6U-m31qQqU-2pe*m61lQCRLB@9Hr'h4X@e)[+kM'HN!$Z693@M3P R`cT@NkJX,K2M5,f*bPTaLYA$`R*U8CqMIp&2%CY8a!p5+rSRa#C(5ChH4*mK0U9 Ha&K9BV+2R"Eh3f`L-9Pl6Srhc(+RQ'`a8qI#R(Saf9fQ6@3"&TLB,"TRc'8"pTL Bl%30Yj+SBmb0RMZdqpMRL@&EdE3ipLcR'CrBQ-5QimM+J@@&-F6QJj@&'"BJ,%I %X*Z)EFL4638l$$(X+pL6L(f+!cBGB[r#!IX1ikc[Dba'a,JReL4Lk,lB6SMT2KM E%M(X,0KIL'%2S[r%ISd$pLCLAq+!hBRB0cPJKk+eq!LBI@,B@HJR-D`Vf*q)B3X LPaKf)ba+a,"GBB%LpSFFX$S4qcX1f++!)1a#f+1)iB,!RN3-bili*j+b+"Pme$( X025C'&B[F*!!f-Fj8*2Bhh)!3i!e8"bl$c&Q$0X2-@`rl-6!31`la-!`E%,%8$f `8"(lA3jB`iKpMB2B5ZTPBF*U4B`C!dq)BIGK*iEPbI8V4[CSeTNGBYM4`'*LRq! !2K$l4`jBaB"IE&EJ,6'`!+XB-IU#CB`BZ)eeM"LiKB@-'2BbV'6%2XB"5aQaVh$ !@JDN-api4SL"(9M0L(&R-)3B0LJi"6%XA@!bXGrLJ)@-f$p`B%kK"[3-[N'-1`N 4(kfHBM%MaTf`QK($VSEPM"LBa$`5qbS(-"Q+J88-+aSaF!T,'M(Q!3j#$(X@@%3 -Haa@0@+rb8'%UK1rb!(E'P3&("9jBBaQLcNPaU`+9aZM(,#D',Br,',%i"aBaBK pJ3-B5`c2"pBak!r@0IT-$$`5*MG@IFG54Jb,)YBbBYM(k#'a2cAZ4Z`r14L[N!# Q89M@X*i4!fHaRa&M2Z&(a-M(9NB-karf-Q+rc`(m*+EGamD'TYI*`J!XDX6J%PM 6L)&If#L*-5GJ)c%XN!$J2$(QJ"i5qbX1@0cd'LF+L`f2'*b(QX6!5M#3!"LcLQf 6'2I"bNN-$S69NYKR1$"ha2kG!eC2[FE,kSF&NaLm!J`K"Ul"eiJa5eJkL@'2K2X 3JbYJm56'(-#,pCSJMJLq%B2r`$'*J6(J#6&Q&EXP-@TKZ55'BiaC)`CZF9qp*QU fM(UUBr!p-*NBq!er)3D@`CH*-60B9SPK%i9$%B2ABQNNpMmFi!jkR5)0J$V%i$r -$M&`%fXQ-HB@Ub)alJE1%)0cB)XP"Vr%BDlAUCU$Al3BI1qA,!E(q,$&`,KIYKK c"3i3!fYra@,-!AaCVdNb+[kUaH#ai$`aCZ[A,3CZrBE&k#ph)ICC$Z,)Qk6H`c[ dQLaHrGX@!l0raf,-%hb('0J(Gb2'h+*&%+-Ai!!aX"CX*2D[(2l!aDD)fm&ELA& AjS8BR212,!ERqD6&`(Si1c&`lBmYaRbLa4$MRQ!D-AM$ReMXhcM3Cle1Nrf9RK" $#f$fLF&,rpaLF,#rX"Mh4SXJ"MjqhQ,-m&pDM(jaAf*`063I[8iA2X(pLB%PB$J a1$pD$6%`qmX@JlrpYFAJ*r!TBZ!X[*)BQ2+!aHJT1%!-r)DEkc99("%GJ"MDcpp E$'j2IiL"jA"YB[3BANb-([q6aF!b-*`Bm`D1%H2mG4HE*RXZFdd-$'E@L)("hl! BFiaH4!b-TeI%k1Yr@!bmJiX4Bjlqbf,d'Ye-Vc2%Hp##L+&RS+83!c2!,Q,dp9X @Jd0qff,`R2qe'*KVA)3kT[[U5CTRd&I21GJ!6L[6raVJVpkc!3eS*FSX1`h`IqA H(BMid[(F0``L2Ra-QH@L!Aa5lSf#L!mQ+PQTLHRC8kD#RJN@+XdX-FhRP(Xc)E* 2GhAI3iMX3bp3XRJ6deaA#FH)k4P5XS!6dc1Na#q)D@a3XYi6dh1SC*rADcSj5KC bBTU2'Kf5Q-BK*FXh-FhKPEJ`-Fe[P0QRTm1[P,JK-Fd"P1cPa$41+GR,LHPC9HD 2RD%C`TT16'YK5TbGQ1Dq5RCcBTVl+R2ScS$V+Z%N-FfPP23rBKVAPA#-Q-B[CIT I)h1S62pV*%HCrYH)hU4-rfY%3p'[TVJacDZ8kAq0F'"PqPmMr%fCrYF)pLM6raS eSk,r06(Rb[5r*ZkJ62pVdYb)rYH%pU"-rfY#1e#QrcAT94,4rjVJAFVd[bBiJ0& qL@QF8UErc@5ZP1Pr-p(iP1Pr-p'BP1Pr-kApL[ih%hkZ62qE#Gp6T[r0K,FSdrp QJVR+p,pCB)%br@q@jP,d[eP`)'Akhb``@jRq0`ZHTdcrQ`829kErc4+HLIih#hk L62pMh*6TIl1CE@AkhfcZSdcrQid@TNcrQ`hA8DErcBEE+p2rCQY@42qE$4p6T[r 0KNXSdrrQJ(h+p,mj`M24rqC`"fAkhacd,fAkhaaKM1KrFq"54QmRTRQQ-[e[MM" 'p,qj`QE4rqBbrmVd[lRF6CRq0eGD[HKrFq%Cb[5rZA"eCIVIA,LI-[e[,Ma%QIi h$ea6T[r08mp%rjZ((UG-rjXR$"EpEaiDK$,pEajF9jRq0`r1TNcrQ`q[8+Erc3H EP1Prmp8cdIrQ`rQ8kArca5&%rjX2GeHQrmdA2SRqebcm%rf['Fa9T[me-m2+p,p Qq4T%rfZ'Sb[6rjV9-p(rQZ(`b[5rCMLN-[f[4A-XqPm,@+P-rfYKETATIbhSHXV d[aCd(fAkAiZiL1Kr,I"&CISI%+e-rfZ&YbM6reV"A'AkAkZiL1KrVF)*dIpDdIL 8kAqYD"[+p,p@cE6SIkhS"FVd[eEiUM,pE`%m6CRqYd"m6[5r"@#V-[e[!4LK62p E`#`CI`FaX&Ed[`A#@Y(r&JMA4IpEJ+DJ62pE!(p@T[qekGkLrl@*XiVqebBq*2T I'eLM62pVBcD8kApYk'h+p,mfq,%brDm0[8DCrYH'0U&-rfZ$Hb[6rpV&*d6rDaG 'L[lA$Kp3T[qeLaZ*rYI12#M6rpSj+p2rfX9I4IpV4p-aVcICP4Bm"2lK29d$Mi' Rq%rB`(2J-I!,rdQAi@GYi!E`)AJ"I-"l'XCl4XCl2JDH#Jq&6m)MiBr`@(JUr0& lkJHq"SH%1m)CiBT`4,JKR"!Z#!H%qm&h`fH!d'l3E,`RQ6`lY[md%`[YjrY20+% KCCpTF[e,k"ES&HJ8k"rS'a"Rp!Pd#I34p!pd#I3)G!Md"dJ0HJ-k!rS#ZJ*k!MS #qJ'k!AS"1JTD!4S"fS$@"1!cm"Mi#l`&[J*AJJ["9q!Tm"1i&$`)AJ4RJUI!6q! Pm"&i#2`$hJ(IJ'I!,q!9m!Pi"2`"hJ"I!0rKBI!&H!,m!&i!(i!(`*(KaR"LZ$! F'2i0[iB$`hhK[2"cZ$9F'ai1piAc`RAKZ("E1#eF&Ji,Gi@c`PAKU("61#PF&!i +ViGr`M[KQr"-q#@m%Xd&V3@0"@d&638p"ld'638Y"3d&[3HY"Zd'A3FY"3d&l36 0"+d%M34Y"%d%,330"1d$c31Y!id$E300!rk$9S5QJCD"KS&fJ@D"9S'1Khk(ESG HKdk(4SJ'L%k(2SFZKiD)rSFHL&D)2SFZKak($SIqKZk'hSE1KVk'VSDHKSk'ISC ZKPk'6SEfL%D'0SBQKKD'"QDd,c4pY(`dI,4E0([m![J"d1c4MY(Sm41JdH-0`$H !9Sp'Mik0*Sm@M`D2pSlQMYD1aSkfMUD1PSk'MRD1CSi2!EdFR4ap(+dB24`Gh01 SdDE4T0'LdF(4ZG'LdD$4RY(*dEM4[0($dD$4RY'FdCV4Q0'@dC64NY'3!,9f,!r V'BdBE4K0f'M"D%HD8k$rS[ZLpk,c'RdArJ[[aCm"jiAV`U(Kb("G2#ji@q$BH$A `IF#PmAcJFm'cJ8k1A`1[#aiA[#hi3,bRf2#ai1r!&i(h!mm+AK8m+ZMjq!IJk[K 4m$$JeF$cJ5D1r`50eRZ##rd$h31G"Hd%,F9l8JZY!bd'V38Y"Ed$R30p!ed$23- G!rd#h3+p!Td#I3*G!Md#(3,G"Jd#l3(03E3''m0DG(+f-AMK5Mp[&CQ+XVc`Cm1 9ESJEYm1CM&G'5hkMfdZcJKSV['CVrP*iF4$(DCVipi9acf[1qrAaqS%$VY"k[aA Nl5!ZSeH'Clh@j05PdKeAlQqZUbqb)je2XlK6Df2KAqRADa4VQ!VZ1K`Y(ZQmY8B rh,aj"ripFh1abMQ9f(UTj*ApT)Lk)FP5Uh0QYKCEmP@0Q3F@G#16Qfh1QPDpE%k Bj!m(iG3!5&!'J+MH&q9GEk%q-c@B!T1A(JT69$V,M91G6NA0D`Bh"Ze`Zp9qCrf UEMqp$1PRd,cHP24eHHUXqfCHbP@kYZ5&XkAVk1j4UII'j[fdBKTh@06VAET@H)2 -)fa,Jbk'lUhNl%T1KaP6%CQ+``dHJGh@bp*fQ1GTjKf2FT!!+8MTH2jC0qrbKDc ZBTRV5i@'j`T%MMk(A4fdF%q3!%9KIY5DkTfjB-HrcGDKLZ'%,)k5-LmcXi#DDH( ++&PR,TEdmb,Yq[H(lcb6CThF1pE@,'KSfVHDHh-",lF"qIZ++&R*B3#kdDZ#AUq -,Zj(FBHA-rCP3Hj0K%[pPC8`meh0L!1k*@Qh4dep642@Mr(ZG"GCfq++1m2BDjc bChTd6,pVXmFc3%a9PALU,(eMVTH'L4ZbQh1p$G1e9"C,0j@3!%C1pb`2rlS)+lI @I#0c5eePDC`ZFG0d+q4pfCC1((Y(,`@*,H-Y(Mh$ATSE@9G%F8jXAcYQ$U@%$Pk e'Q5K4RlIqPEHP[lbFTLTA1Fb6EJj9@4lf&l2qef&G'rf-)FkY$8lRDQ%K,T#j42 4cjC)C+p,fYD*LRDUGK$ChZNVFPX3,bjI$*KF!RHSCqIqk1+C,1JGh)ke@bmlpDK *TmFJZaGb!eX'%GVT4Y*PEKj%EKP%EKe%dVHJU@jNreE*r9Xepe[4@d0ekDBXlII +mqiJbm1-d2B)b0,RQl0J@Fh5SDkdimVYlP[(h!!GFb0dc)h3-6I#pGd)YhFMA0k 0T'r"$Gd))b@4G((61`P*HEFCHm+9+%d)J')lqq@0RYR1mllDSJ2l33`Gd4$5,(b 'DUjGh`TeaNGUGpIbe9KTU9$(d8E#@diliU$JFJ%d!I@AC#NBil-!Vi+Z$LFSP(G [f4N21%E,Sek[erkBLprK(Eh8*"*eh"!pID(XMIbfD8+8[3%dhR3K@fA&pRAF6-1 Q9VKmk9&$+qk[4-R9$UDDNd[`bUFD%I4F9qK+Lr6LZD@6JS#hED(kNQj(ifp3Ir8 @jMG-[$-*ZP&EYr*bh,HS@hVYeDdUX-GGrD`GqR0Cb$XR+CSN%kUl'6#0RRB'NfH Ljp81ZGiaKeF9rD9"CcY%0h5#UH9aL%f'NE[M+&81b0Qe66#Hd3pSaCf#a6e41l3 5FY1&lUE@YZAj2-cj`qrid*Xf0jmeVhkfL!9ZaEfafkp3Pql&1ll"1mAfK+9HZ,8 b"cTq*Hp0+ra&XC8m9Gr`)HNhV6UPcq-Md[m'-$jir&MLD6GH+ZmC3IaIRPm+ReI p@pc,!hLmY0GKLlaLH!*1k%b@pd2I(peaVNpm$Z*T0li&mE3ErmIBVcj9HXh`Bjb dY+B39p4pQbbVL2(,LkIGH-c(HjZEmQ,JJjU3!*B&M8pC21h'rbZHGZ1he9iC8`p IfL6[rHU0mD*1lT@p-9j1mE3EMk4ifT8m'DI(#-dkKRp#HfJZP1F)2mDd0hThb!H #Tq8-Cj4AmU`dF&'m12K+j%dV-hVLDBr+-bDHpLMjN6XI,9qaL-V,e958$YbS['i cahlKJrJpSTUj@Gfm`-m8PHp1Hh0LH#QLmPI-mHlUiQQ+bP-LR[DSI"hcdR-TrSU S2$Mc[BI2iDf+bMHMr6Y4I$[Q$5mmCGT2&00XLDFp*MqDH0TMmSq*TcdQ6jeifQ2 UKhMDBm)0mE6(j2%46hY-IKlaY-H%%1*TMmPM)jjf4h4+21f1CN)mlBjQ3McYMRS NRRC(hN$aY$[bqiQRhC&A89$2N8p421f1I)ELDAINC4&2Zb2rLAMD(APba02Zb#F MRRC(-b5HGNGq*['d1r)cLDIGN5p*21f1hYB36lXMRj!!H0VMQLhaY-IP$442Hea B)*lfZ$aqiQQ2DcE%dajA,m66(VrSCb5'Me)mlA&j-FA6(TI(8McYFAPca0-HPcp (21eaq@r%dakA[dJmlI(Y0khLmJU*TcfZ14"2Hebq,I'dai8ViQQ2bl-PR[Di-%B mlA(KRhMDir*8#8p+D1l&dji3jaC2Hd*i,ClfK(")21d*iCTifK2#'['d*c6riQP 2D#E&djl3R)LR2D(HLDFpS6Z)TcdK(kTifK2b0SQR25&[NhMD%r)ZLDFp)9q@H0S 6mQk*TcdK[j9ifK2b8BQR25%2PhMD%r+pLDFp)FqEH0S6`JraY#H%NH*T6mLh*Tl fK$aSiQP2bTmUR[DNZ*0ifT1L(Z*T6iTAL+Fp+H`86hYbqdfVT("321e*iC4ifT2 ##r'd*cA2iQP2DXE%djj8ImA6RY3paG1HP0p,21e*HER%dji8Ca*2He*c)*lfT,a qiQP2bTmRRREp4Bl8QeCeiSVLDDm60a02HjemXq*TVa11LkHp6KJUR[BkcEeifXd lG1*TVp0-LXqX6Vd66hZGFX66ALHIRAMDkp3cmE6AbCFSR[BkcDYifZ[N0a42Hjh Q96cYp5*piQNhlpQ*TleH1#G[@Y8,fq40UhVa((R6UPji*QpDe3[6j8fVHQ'L['P 9,pb40khU0D[bTP@pjN(HY+VARH90UhV0SVaT95mISEaT95rf+@pDeFY[+@pDeFX c+@pDeBX[bTY@pH)hmUD9e@,erFXNq`16p"p(E"4[QkEqIa,jRrqIQ+A"d5SM@CS abIk,*Ip,P0`A&8Mf[R)#"`[I$V!4I1I%pH+Ldm'$d823#q"fiIX"rVX"hhm[S2Z Y!%pM-3dIcck"I5,lC2BTl+HaRmiqPAdDqjRXdpPRX$Hb0l(2CTr$2TGp([YmpQE f&[C@pJAXEHcYl![Ccf)rQrdFpR2Ccf0r#RX(qrRX&l"Ib(i4qmAXr%GQ%IYLpLA XPl"IbRiCqe,fbpQAX5pRAm'qN[dkpShXel2I`2jdpXhX@pJlAGErqbQ0L`e[(h` 'KZAbLIXqqF66m+hGaX8XEHZ0JirKT((KrNmqmAG`kB4TFMDfY@ak%KbiCmUGlhT baPj4e+cQmjq+ajimpIMB[MGGb)ZX2rCNm`,a6iqpjAZHhZ2lYl(I52c,Br[Hr+@ hqmYT2qQ))F*I8A80fdFq-e)3lhCj9dBlqj!!,Sh"`d[b(SY)9l)KI',PHcm9UMX e-f-5Yl[Lpjjk`$6bb#e[`0D1N8rlKVIbq)*S*%Uc"D(,P)VGl2b*5,G*bjpJjr& fhQMRkqdmdFlAfDckph&ZaY#m,imN(CpPG5EEHBUG6l2ckADHDZGTGMl6cY2Y2-2 1MACZX[0X1mqame`lcl2cI$XhflR&cUefAQ$R0MZhfhQKREhqR@hRFqamVTh2Xr0 6l0aKjr2YI)'G,l6c4ADqf-j2YI-L1bqfma)lAf,R5qemQCfAf[Pb1bqcmh)lVl$ cCMY[XA1RRCpZjjAEFkYZifN!mFKUqbq6,0-peXlVl,c@cQrBVKkr!bfZG@lpZ3[ %V0!'1kHJrA-rEQ+`3(XUrZflaci[6DEYr,R(0jrDI1SpMb[qRErDr0YcRchSK2F kqpM8%D"%EQUd2i&T65Y3rP+3!#pIYjT@e8&fIN99"q,aUUdk"@J(1rAaD9Ye!YA 5[`rbpIhk`%Bfdbba-jJdT2Xh9Ida6pl%R6kciDAl)2qrTkS$PEUhkL-@KEF-Vkh MQNY0q''@BdYE3%CA`2XAGTHPkHbSNc-RMc8RDj-,jNS09prR4Z`Q5mLjr@ACBRj PGP"#c[raVeJVI)+[iiAA`X)#`I0KZHc`2E&FJH`$BlRdi-@aA$D[qRQ[Jq@6JqI #mKANrE"mV[H3!&M28'5I1L[QTaiakmNhEahej!92Sq@bm@2K4p#[64@65`dcf9F hrcA4I4h1Y6Ui$kAP5S42Y28A+,IEIm3YRc`iTTPRh[+j[2Y@51`IKq"PZ&afm&4 F,RXp(pbKRIhjYaqjjq[0*VQrPH4k(C0c3iQ1+hRp,2I5j#!`8k!-c'4AJ*N#!m" -HKQBb5i"XjGFRRL[3YqBH,Rj`6C$-3$-kI`#8TRmAQ!QV`c-C*H!1C9FDPJHQ%Q X!M-P+X#F+9"ZG`QB[H6"-Hd(CLmh"mbTa2ja+!-cf@9J*[X!-*0I!QB[ZEq92M$ h2&CD"1)D&"m#ib%iVJ&b&C+(3AN3PU[!I"#D$i*c'CjV!2dJR"i#e%13!&S&e@& B(36@!@LYJQX0AQX!@b8k0DSc3(B1JRF9[JF"r'%)4c!m"11Q6"A+6Bf$F'l+e#$ G&+R#ZUNa#1fT%PA85G8TM9'U3Qf8DP#IU6+!T'k9IXJhf9AB0c@'SGm81JMrITP Di`CT3+V%m&"@k%#U3S%5T0-(ClC+$8b0+Md`0BD!h&3C"208LF'Q(`,e3F+5,M& m$8eFmXq#jjK$S8T!(!SP3Yj3U*+P$B8D!@XSPR!I3cIcAVbSH8"pS)$21mS9!S3 VPj&C,aI`CV3iK&R1FD")#VQ,49c'88J1#%HKK)mj!a8'fcQ)1$f8TP!RC$59+Y@ am2P-ZF+KBFq`QA)"b-a!GQ9f!LT6+"%`Q8+*EL*6+1,cQ(+&5VF$fEr['`%jIP' S%[#,3SQ3!&m8UQ6j4D&'`#m+*Aab8+k3!([2[e!QmmTrS8"eJV,Ni%#4i1F"[89 FFP")c[jX)&r#*`F$&3EEkC'$3RB215M8bAfpi%#9kPMN[QQ3!+p`D0Ll[h43+1" pp+#BACQGJ"`85Z5qLY"6STXF&)Vij+"FSG,YJq6!B-(+)&RT"b[Ke4VK6af+Z*r kS82jTTHNl@rdJijGZY%1`8'G8EN3Z*hlK80jVNG+jGlE(jJE2F"G!8m(k4QXe(% KYFUEk2b"6dANH*bI'l!h2c(NE(jZPURjQ3%rma0$+-MRHT2M*rYd,X`,F$e-VSa %KYZ&D4l-""18jA%pU5QD%U5kR#fBR"6@q9NpQ*!!bdiKE5kc'b0bq8,kFRPpI3k KeXrYSAGqYNr%`Vc5Q0Dq`q'cXM!0,TE,k@eE`,[ma)"YqBRG(-Y2pCP9Q*FM(f' "5UFcM#a-#lYUIPG4!R8h1`rVEQSrX,[C"@KhFr2JlUEf`hYhGJM`ERSIa+FcmqL 46Lp09ET%pebP%iZ693"l2cN(pj+F"AbCU"cNZhPPd-rNjf!rNeX%rNb&EZM2C"B kh`rrERDC!,MjI43JR6N`aK8DN!!ZN4rMN!!+C,,b6Fc6!6Fe6`MFe#)PF*2l5%% kXd3,dL@U[HqP"ZR%lLl,cdAkfB'AhNF2[0`L2r$5m`6"5qjM#&jZN5,NdVXjJTI I5a,me$jimI2lCmb[N4db2l0rb[*-)CXG8S98GX!98Y-9NJ8[XF3@JJ)KA3L5#h` K+*%P$%&UF35+P-&,,h%'Vd![DI"6$ice!GVJebL-G6Ga#0)+[HbM$PjZ(hI`FJ[ N`F[ZC3pqDMppm'[8KU#(32LCBEIPLbmP#Z(PjcQ%Ppa2)Vcm!S[`X[-d`N[Zja' jr*!!5(J&qTL%Rj[((,p!DGlm)Yd$jkH@*Uj!*l,T16k45Xm5LY5Nj4L&PeQQ&%' &(+F)XSZN)UM4c5U#h2jCk1F9ARkC@(J9qTL&ReXCm`Uhm)X8acaN&d&HXD9jIZ% Pj`Q'PeaN'&jk(mA`FdXF`bmb0!fp,-02$EZHqG93L@Vi0I*d`br36cRm'JADi9I )8`qr3$rpb0F)+BKIT)q'K2PjM!U,P#Bc,03pR@&kC8),e+5R4)kH"#@b&#@Bc"a 0mE2,9#9A*8GAFK@+P#9ATjZfj2)2c%XrII&VP#Q-Ak@2aS6j3c"4S60KS3'B#'P 0,RHJhAPkiaI)8abr3*(Qq#AkU%kBAk)lBD%(*kDApS6TZDRSpHllZ3@Udq[6ph1 ,e#Edj2Z**5VMjqBS6,Ir2X`VB*%NPbFUDmB2dr)69+3N2AEl),@EJM!j2G6$-m) A+)HAh8-e[-aqLY(YdXrPpI@j4#AbIR`r1dmGq[cbBA*P62XS3XBmRm[TE9Z"#S6 fH$qa(rUlVI"KAKRUT8#Pdhh3hQfFpr1#hjH&%NL3!'bR@D0j'M6Q[RDLRp8pLDM haf),h1,0@2hEV1q8cbf$#pBiB2"`34rjf)R'"Hp2HlBhJ-MJ3TaRUT8qTYRKR3Q cpCbR%l5HXcQ6T#0'%[f6aCi[M&M+!#6$)dFjA("PZ[dprAV9jXBC-VJ3+h("iSB %fCA"K40-Ap#rhZaB#C13!1pVGRKXpMGF',10#eh"8$G-k-D&XIU3!&VZ"m6@e49 qKpI#XUabAK@cSYiY*e1FT!G@V0PX$3&JLMLPeNiZc0AXkjhpUqHViYR&Rf(-2DV JhI["mG`pA-[X!"%qaAf)j[MLlk2klp[9[Kqqaj+CKq`ESq@PrpC1BbXePX6jVZG cq"l,el,P'[YMIH8rM+[QkrEPeZ2cFHAX+I['kr&l')6CBVp+l8FBrh[ha@AZFC2 pE,@iH[rV(U`8FQi[ZUq#L,R(,6Y626chPJ%NlhS&2Y,pU()8[YRri$fX!-b#$d( @lPUE-qEqfUKRAmip2UrkBprb$GNI,R"a6jlYJ0R)29JYEAfSmRKIc6ek2f6jb*+ r!8GUCk-AFIa)2eap0I0X4,JDKNm`bPA0DIX%FAPTYDbKdC8MMGB@1lpQHKHT(Vb (0B!*VMjqiTX)['CqYapVTXY25eX!qQ'TB+C9,0H)jljE8TS1lalcp0&8+m!p"K[ bd$dU32l)2@U-i2!pYQhX0163XJdS#FIR(XA'-U!!9+G$pd2qAP!H02FHqMNK5m! pp#rfIc3IkEjfVPj$aSIZXIXkHkre0A82Hi"#XMHdceFrMQG@!+A&2U&Xk(H3!)I iSRk8D)KhlLhk3`,Z`@TK5"lVUrI4cCEr(a+M0k6IKbS8'69m3L'aR'M+pJ!'CjA 3AZd+5$kmKMbAdiCqD)+kYFA1(p8%brH`QlK$MQK`THNiTX%0h@0%JaZkaiJ'Gr! HKc@ifMhX(4TFXDmf"`fZ2'K(0EMD28BdZ1)e(YAJKZja4)-VA-4'S-%0eR!IY$a d$bX!ipj3RpRPHG4)U9A&@E0qD(NP3$ZQj3d`'9Z!PVIUa[-2iqV6$mbq1N%`(IZ %ZmJHi!UbREKRGZ``12hU,Fkpp0ZhfC9L1[B*&ml@F!L!dG5pah%%6M(hUJ,`hAl BEp`cqiB"2'qX(hYHH-MIIRdjA"1qc3Md45S6IB34$0eMK"%-h@-%b3rHic#5eqj K$d"bqi+@9qbVc8(,+`rD88C3ZmF))bKHie&'-(52)eTHi5+THe4P*Rd2mdVm%!l YfAQ"R8YXbdf81(!2+i#@al))q-AdPi!1e-NS0J1)VqqaDfRYfMe@,khYhN2Fqha ES%$K4RrVE49pLh+0Kpp@UGaMf+e58iXY"'k9apmJ56'G`fq3!&6Q`akJTMrm9NH T(mIHkUMdG9Lp(TjleXJE'j9qQ(XFIKYMm"lPIhVE'AifRZf'&HB2iGDm0A%!P3H r@fj$@qBpb@9*AL!JE0Dh4MTQSfk2IlqXAII[bPGrU0GV[h9i'KE8AIaF[Eq5pZ5 Uc@8X&ZhhplFDpERp`e@DRKb"'HMcTX8SLBSSL2R+c,%VE&U%984d+)RHeIVDX'% 1A9%5&#pIhj+`HJ(6hV+-V("38LJ,G6CG#FpfYTl8R(aE5IrTdpBb!2DjEbXPG$# 'AhaZPVQP(ak)G)-S'I)b"2EjThPb6qACB4l,q0(E0&,r"fr65(d,`0XdDRM0SdY D&e+[XbPSkF3aY-Im-GXA8#pQf3-qHA*dDVQja++mPXY65Hjc5CDA0@&rI@CLNYH b,MNf0k6Pd5bmpdqX+(a!1fDX!)YHf1A35@Z+6ai6RYLbS+iR$3aFAeZ6aR0F0HV )T(B4"+`b&G4e*R#mSUScNH2UUXjNMPG9GDC`A&[91BhMZUV1k4b[VZT-jELqUM1 0iiDUcTNFVk[U61HiXDScJq2e9Ce'MMG8GCSiEUVUc1DiTDU$GE@cUM1AipDU$Yr +f9E9QFraaUT1-mHEUMSY(,GAG9SjhPc9@F$aPUT1'mGEUcVY((G8G4Cbl+VUR-9 aCeARE)klUMTmpfCh9HGFMXqSkTc(F8p9jbNFpeCeH,9NAeARI)llUcSAF,bYUR- KafG@G5lLH(Y9"lrL(98GRKDqXkUcL11cUMTm(qhC94fqb[1FUJiI5AaZ9BGIb$b [UX1AEjjIe9R+m399RFXj[V#UXicMLkSkbcQqZ+V$&lTH8YA"2rX69ChV1,kjUV1 4ile9RHXj[U@UF`2(Ye9eq#(2qkSkr&,Sr98GA-3IU1V`3Ci2hULM!`r1QAfJMXe Q@8,H#V$cIR,Sb@1#$5V&JqT2(%rl5BHr"KF+QEGYq1GERA[$pcZEmif6%dNr(Zl b'T&GEU'p+Qr2-$JJ@$AEQ0cE5""fGiD&2lR4Lp2XjEI0Pr'YCFVUlbe[mlj6hK+ fpTpSc!eP'r[XLSjSL8`$Xl#r!F,fSZJG(4rA4cYEmRj5iemfVIclG'ZrAH6MDjh emB1eJq0mp(6[H0#,j#kfMbbEcFZSXGYY#TTj%lA[NkjSZ*Nh5Qd+bklj-ZVrrl, UZT%,)hY'cchA&jXFcXPk8J[aEXke(*ZfkJ35ZerR'Sk[[iN-(GY`@GPk`AE"UcL qr-CpG)!rTDmCS[*ZcT0a$,Gee,[PC*VX2%iCDcCE3`!S-dD*YC-,Fl9[+*bAaH' 'rL1VTl!cc22dbX@IIr%HGqcFBh'8TmP,&q%HbaRlbYF86cR@DJd"q,SI6pCU)GJ #S1abMb8c$khIU,0UhPGM+c@@a(Nq(1!HbpHbj4VlBhe&"PmeAjG6a3)`(eI1RT) caJ*`$i-`@eCh%%Crd'`A'(0j'&p9qH8H0qRai2*D'R6$HYS*rAUDR!icP+jXIJS jYaIG9d(%h!1fmrMF@`D3!,cV&IK)pk2+8Di-crlA2D`!c1,D4XZrFGIDR$(hedB p1DjqI!q@TV$lAjdaF(&2RZf!fFJp@#hY1,M'3SElDZja5r!+1c9fIqjaCr3LMKr TKr[MdA11h2me@YN`I)*4VQT1bh0B@IUVd!f0V[k)6'Z,R9mc[BY8$pl$'X!%9am rm8d%AM1rfimedqN3J*qQ@5bBD4A,0H)Y'DmI12$ekI$Z-8pqFL[!23BEmY!p+N$ qb$eUM1$`2E6rj)RCY`dS#FIR(XA'-U!!9+G$pf00N!#hJrLP3A2[XIQkU[A326U [6dKY2Y*pl9bpKS`2h@2hGICHkf[U([B!K@4[Z$)N!-qX!%U,I8,C'2kCi*V*U9h HZEIS$`Qi"kZ&)AQXVjLic6dH(a+M0aL&C&@BV9`e(B`D2U'3!&K10'9l!)1c5QL [GJ8N(ej$[k#H0[4$%p5Y,AEqU#CB[SIGa"eb4)-V6FFa$@lS(L-Dh0!p4M5iJrF iV-(9lQ([d1#+IE8jD($P36ZU`GAZ-D,"&DraU!BhG)mM'PcK)MB#$@k`KZl#SVa EhF-+`,Jhe'GfH4ie8QT9FGDX(eTH#G#1DAN$6-B@S1@YZ[%Kqh(ek3Id`Y12&dc (2Z%ZXJHiJQ`RlTNG1`aZL9qAFdmch+jH&,q!)LQQBjp`i@`0K`!B6Gel(%IJ&(1 [+J$IlBIpaMfcEpIU2V6@4mN2(r)hMYcc0H)diGZ-3&qN-Y&('-(328BB`G!p4T! !r1!p$L0jl4lf!#5h,fKjaElD(,5mmU!GC35eHi``JZ)e(Q8%3rFiSZ89,T+k4e9 Qd[I3a'(3Fq$HBp[e1H-5fh)6*3lF``UJjE%X!RkahMmUq#ZMf!`J[Vl(VU@eDrG B[E5fH`paleq5YUp5Z0(IHPY&hk*Fiq'h95Vh'(DVe04L#i&EjI%h5&*-jr!E**A jX!HSk3qre9(Ual'h1LTp(9D[KqHH0I,'4U8IjKk(hmDShU-cdS2SAAPaH@T2KFe 29&ihY-`R,kQmRFrR+EfD2jXmI4pr,D6HD,YIl%YEHBYjPEcHlZIR1@H)brhm[!f mYZrm6VFShA5Cei*MRq"`1hP-9#C2IB&$3lI),pG6)N,5*rpq&p1Rk0Zl[IabhZT (Z2GCh@,PFTr8KU"6hjYqCqjhmZpb1,eEa1RcH@XheGFedcPNm3rqQ)3cV0jA0FU l-p36GIm[%Z29IVh'm6UjdbMcSU2U-Drd-ardfA(e[["PB[)#fMMpFU(4j6e!EI2 U1hQm1Mr+jIfCHXmVlhUGmV-FAZ[b[U5AXRR9RERRp`M,AGirUiHmiUlA#@+0dUI B9iLYXlaA$rUN(Vb*K+YGhYJrhHV6YSm5@frcHMH(1YIAVrmKXHGC(M9'Zlb2UNG #I'1R"hPAK(p"l"f@pkl"rDli24'TqkdIr,EJ2*GhMhkZ3"hU[C!!`iNZEj6bhQe jVe)rZZ"D@Gb+rKD(ZlV"&IIQ@[dfB88h[c,hpCSR$fr56fqVlq1HScc$VA4HT2P 6+LqiPFQ,UNmHVQ6bVU"Hj-Z'+jNmp3%18pcFA2EEa2NYJ9jh8rqNclQm6Ap*(Vm Md1XqIJf3!2KZPhIhamRM0`4k[EI*4a9fZ,`YId3H[ar3+`NHUjYGhY1q5%bir%E Q1qDl['p`9b@FdHZ,(f3X6l+mHmRM0`2d5H0Sa1jpiIZ)kckB[!m2m#Pf'$a6KP[ Um5dmf2%KiS*ELYj%AZrbA[pVa!@hkM42#CIhmAmJ*VLPrSR$4HjqM3[%q@d!FdC Ij"k,H0PGf9pCa[kCZ)1EY`hZU0a641TYp#9ff19pK4P8`PKpE)DRa!h22[)Z%X4 EmaA0N!!l"l%Iq#`a9cG3Km#c@-[9qaUF3jQ,GV@iA,[,qaEDZA,[B+SIq3cc+[9 qNap4+-GReBqpNAZ-FhR[H)S%A[F(Kpl*BB[,q`3iTr5D2j!!3ErGqB[YIbpj[0l 2(-"Mh2Q,IJ61T24D2r9`2l[c&c[dpq5*RMrU9JiIFr8qUlk+5rV,(bBfbH9pmJH *D6aK,4+RZFrP[9TrSEl#H!bI%A(j426MHmPElISk"Tb-fYc[K#XC[XDp2meKZXY l+l1NIX,kT'ID`j9l`'CebZi(2a&F[)BC9HDG'N8[29cT!V19[8#l3ZUebiHL(e# Hm*Y0ch+iaH@Y8Tl`QqL[kM+D4c+h'4i`kUZ$HcZ2281UaJ6@ep!c")qG8@C![G[ PII2T!4ilRaBHJr2kZ2'A"hMXV++"+H0*QfmEi,(cVVmQj[)N0F+R@!52R49kUYc 2!04VQ!R"BfF[2`j3iKId'jb9Hlp-mrSLQbGiLSX(cQ0`)r8caUXQ$HE'Z40-8Q# )Z3Icl1+Smc$m@)(YV#hmTN6`f2PqiHj,V9iDMadIcF$`&rJ3FblhH+lkThN%rDZ $R`JH1frJH3SPRUAAjjP2`H2B%h"#pA-Zlk[d5I$B@IY0mPlKmPD#ii,(cVlI)2C +Glr9F#2"BfF8AUYqhZBER(Aaf$N[())R!L1k(i,(cPQiXS,rNRF0Fb*i(([Qdb5 ma[JLI-h&BqFaCP3*$qNh[d53!2PlLHETG6BIr%C"jZrhrS8mcAe-2I3CQEq&B*, k*CIh0amEi,&c(cN+h+!ISeir`'2R2*a%LAIVi`R-ZZ#am`M5RrS9kp0R"RJFqmG r*NrMZDRhU3%H1ihI*`(FdkY6[eCamGJj,2kNZCM*Jip*AkHMEDKIGhQIHh3,&dr p!r,d$*Tkc,h`M!I36Y4(h,e2P(lMiR(X#H%"qJ$hq1`!MjfIaRHJ(REe*R@BHjR ["p3rc6h*1`Pq)hRaGm0T$3r9kq3RK6GGkI0keIm"!*!$)5%&3R9TE'3!N"`*KJ% Y!#`"[3%l!*!(pJ#3"iB!N!B"$[q3"!2JYG,X*EBjTm)!N!8"NK)!N!BdBIrarr` !!-0!!!!Y*b!J!QCf!*!GM6!*KJ'K!UX#-3-+!*!$!3#3!iB!!',X!*!$&J!!0MF !!!%1!$B!J32JY'"&#EBjTlB!N!8"6j!!!*!',,8!$rrm!!$$3!!!+S)!$3aQGP0 SC@aXFbjYBh!!N"2TE!Q'!*!+J!#3!cA(!!"LI!!!0FF!N!-K68e3FN0A588"!,2 C!b1f1D9X!*!&!8q3!!#3"L[9!!$)e!#3"QK4"RM+)kc[M$`Rfb1cr@3PaipX2h2 P4hJQBER*(V!cEc1hkc%Pc11%mSi-'-&6`c2$-r'GEIaAej(Ej(MN0lRpj$Dj6AK (H'5INGXfN!$F*T[m*TY-1,Ppj$Djr@366JDFE,)PQq`MYjr`MMc[b1mMJddiZ6f 4M"K@+`$3bYD,(fdI'E!M4`PhkmD6)6mbff3Iq8fHVf46J(A@FA231BQ1l"YeR[e Q0C!!E[[BC[[B,AC5IQjQLqb@mqdmmiTYGTQEr6EV6&EAa!B1,*k,PjPfHAQGRj! $(fpJMI`QAQpRGPk)X21D#i!&%($PGeijk$XRrCE@,CT*&R),qAd5YJpJ)AL#"ci "I"rJl1Cj&NA4kk*SlZCSET(reNi8AIeq-,[QVTJMp,l0q8Db&KG&QKH06T'I5VV 91Da6jE-$dFdrjGb$`[bBla[iCjblMRr@ZHrMRh2ZYIcccVfIIm'j6r*[GHjIq,H jj%8%jcMh3))jcPe1F+jc6bDBkpbh%maclPD#qFkpM@#"Flp"F*jcId0`IXLP920 #jpB38$Zj4a!XGZiE#CBiGjKJUA2dq!,RIT5JhEQI)qK`MKjh1[FI"&dKPeDGc"5 jqa(d1$G%8(6Z'S*HjqKaRh-[*qKhlMD#CFjpJQ#jFrp%X#,N-TU6PFjG5,$+Z5d %Ujhl*J+`j*j"F*&c,b*J,XLpQ@#YFlp1-1$FAa'XFqkc"1Y$,UXjfH!F2HC2lY% %'jhE4h#aFmmKZ,pc2dc`!1IH33!2N!"MMZ%IFRp,F%R)jF3eJmia*`pf$XbPcZd NH)Kc0a!me,NA%$c-1EJ+,8$ZC`Jf1FGX2Gbj[bIB((*jc4CF3BjjHk4ci*N[FPF 6E(AZ@`LqeMRUIT4ce2eecYe1m2A1r3i"md,Z8`6`!a3+,erQ($`&0j*MYV@H-6P kr4MR`'ahlLU#BHHH6V$$ZHHDcmNaIipelTd%c!kj$a$XFSlH`)hNQ%8i"%UR0ip c$Vjq[(2`e"1FBmk[F)jH2p'j2342FZjT"&Fk"cI30h,I6l$EZGF3-&rNi!R1*rF aJVh1`B9`+4)$hN8lN!#$Mq!IFXc'8j`l4,$IZHF4S"I*[C(J@ZFq5($31IJ2lB0 X3BG`2MRip+R1`39S"h,dk)Kcm,S)bh-H*D$Rj0j$F,ecc"Pc5ZlI#H!ZrFf4CS# VbF&chq`F[B4Rb0'MCcVh[36IkYcV#*lPh)F)MMRh&`3hKYbjdQE2GJlp`!b5Jlq qc6RQLKk5q`i#rZ633prTh-m5I*GcIdS!cqK[VM6HGcY(IGrM((a+VmJafqJXFY6 *2*,l)B,R1rFq!VL8h1m4[0#jrbDi+H6QLA[3-Z6JGcL%(2aeXh2-fiZG!h1,Fcp *m!21r4V"5jaM9PiDF[1PJAr3163HXd`1I8+[b-'jD$GbF!SF5ijjH)9ck&Iqj1# !9cU(MRb9Fr$CMi6F![(VUjf$qq&$FZJ2CT!!($b1[L!(ec$lj*LV(h11q-HGJ`p Hlp`I%Vc"1HU'!r9hRZVq#HI32@pb$Kf&6L5(pRL,Fr5E15,(R,r91IU&6LF(6lc GZGmRq#RRi$biAArR5fqM4mLK#GrP(,AqY(2`,lUB((2qEZIS)c0&lKF)hZ[F(a2 !)ISc9J$kLaaD!Eq#((S&28J1V8@[b-'[k(ebF-h21mFX85-jk[P&jcj1J)BLacb K)r5h5*i&FdF1hI",cU%EIpNjY0#[1!GhrkTcF"#m4)kjqV"c(b(J6ql[#0$XqPX X,`BG63kri$HGSpD21SFHqbhRd"Zrl4bmL,BLajbM6FJa!r5@(22dZmlp*`'FV,m PmNI3dH63j(!D1I3Rmdi12IB(cU%hi"pbF1JI13F[8#-jjZ42R!1$[L$hV`4r&R* ,09YrlKaF"@q6`b2i5qIS!6U1(&ceemkKKI#,b$&Rk&abp)#C)XF-Smh*d9rm!A, r52!2)AH"Y-kRR@-12Z-FhJIRN!"$9m%*j*MeIhD1@FFI)`I(d&YbD)0rF`lHK#I *`50i6H5B+fD3!"aRr9I)YFXc3"q4`kr"Yb'Rr39VqE@MNj@6lFbLX[rAMMj4p[r Di90PrkmG[P$frpVTUE,red'Yb[jI"jk4X[rA!GmSqhmGk(PPrkm$,DVXrhA!hmV qA`Ik3GRrkf$ZPIfr$QCBfIrVj&aPrkm6MdcCrq[%-e,frcV4#XVqAbFkApRrkd5 l'Zq4R0CQb[jI*lT#fIrVK$H9rEp1CPlCrqZLMmVqAaIqNl,rei8H8[ErZ["%P2f r,[5rX[rAK9j9p[qkd%[+rPmA1N(CrqZ#%jAp[bjQ@pRrkpCXLIrAMCHRl2peDlE %rqZ'bjAp[fkm!1elHcQY4CAp[fidQ,,rekfkaIrV9YhLrhA$(mVqA`qcT1crp9# cX[rA!kFUqhmpq&2+rPm21PlCrqY"6bMlIchSI'ArV`GpUqcrpD$aP2fr([M-q-$ NY"j3p[pki$9Prkm),bMlId9Q5GRr+e+EX[pAa'Y6p[q+D'*Prkq)KP2friV`[E, r9d6c+rYr4A'2q(p&Y*qbreG%AbRlIdAdKl,r9i5lPIfrAR'$q(qpc,qbrpHVhSM re`Y'fIrVeEb+rpH,APIfrhVa#C6p[ejaX2Kr[@KMiif6BeE%rqY&,bRlIle`[E, re`Fr+[YrIH*)mIrkQ#9Prkq2HT6p[cim1fArV`q240Rrkm1l8IErqY!Lb[jIRc5 "q(ppk&*Prkm2[DIXrr@KLj6p[hidJl,re`qI+[YrrA#+X[rAcq`TqhrpR+[XrrA MH5RlIrhi'FVqAcpqLV,rebpZ%rq[(deZlJk3!)0,a2rV&jH)rlG-A#,qRq2P3kH Kcp"Pk$&d',S2ABF13hqKZqbp%$3HqJrpKHj#Ek'cd&IS+[381JVpK+j%0q+"iAh KHD&RmEM3fHKp2#km,6`L2$Im12`c[$@m,6`Y[#cVAH&CiI(J8H&0iGRKbD(Rm@h aD["TmBIJ!qBGIaCI&Mm@[S",Q(ei!Dm-2aCI%2m9(`5r&Cm9Ia9I&Ek"6r!1m!c `#[!)m!E`*I!Gm!E`"2!#m#M`(r!Gm#I`"2!#m!$3rQKqY$iD(lf1TXIhd,i'I!r 2`qr`1Rb1PN!V`1I`12b0eN!cS"A3&2!ir!e[`pI`02`-,m2(m$"D"5d#$m1rm#j m#mr#VqKpG$lk(Pe[p,cf%KKMp$`khZKhH&5$M&HJ239d22SGhBjH4kHMcp(Pk(' M`r%Um#,`pI$cm2(`lr$Ym!ca0[$Ym1[`kI!8m9r`"2%1mGI`kI$Rm1A`S[$Km0r `hI$Em+V`aY$6k'Md-lSC[B`q4hqMPp(*k'2d1pSH,Bj14bHMMp(&k'&d-2SAhB[ H4HHLrp(hfJY&ak*IdDhS9A3U'KN0M%j&Rk*,dG"SB63`@KPpLLj&Mk*$dCrS6[3 Q1K0pL3C(Bk0ed$KS'c30@JB0Jpq!ci#rJ+q!Ri#AJ9H"Ri#2J(q!ei&RJ9H"Ti' 2J(q!Ei"IJ%q!2i![J"q!$i"ABV`3I%Am4(a%r%0m3l`i2%Pm3ra#I%+m+,a*2%Q m5ra#I%,m3Aa"r$*m3(`UI$rm2[`d2%rd2$SHrBjZ4krM$k$rdH[SG23jrJ(H!Pi !2J%k(Af1,NH2Sm24hqKZp$Bk'rm"Ii(l#Ya6i(i#2Mch%I$mZ0q!6mdp"(ablNG `Gi)l#2L5h%2JrJ(h$VK[J#r(r3,mCMa5lK(Jfh&r!Uf0aNCESkR4dQKhY$PD'Jf 0GNEESr[4k@Ki0$6D'Ff-9NBMSih4a'KK0$$HJ'Kr"m&(rI#JR59Q$SjM&Y%mD#3 d&(S*MF@-`0[`0Ab,$N2ISHAJAZD&@@&1Q!rd'9S2h3IRSrIJIqB'IBHfBaDC0qD 5@E4c#Nr$ZHJ#jK)1K`23$'JcZ*cjC9kCGcL$Z@,@Q(Fd+[c#R#0Ld(A-)(-&4k" CQ8IdRG@1F!8mJSC%4c#(D%Dd*,S4ABSq4A0D2BUZJ#[J#6J#,N'hf2XPk&Si!cf $MN@h`J&`"PS#l3%(-2rS6lJ!E38A`RYS$c3+HJ`Z302!JfKdG!jmL)j(Uk"ji"f i#%k&0q!N0$2D#Rj"XeYH3SZMbp(JD(5d&YS([F9p$h3jA![(SSAKCM35h)T'$V9 eU+AK323dqJUH3iqMmp"eD(Si%mk'Rq%lr!+i$Yf"hi"1a)Z!qp%!eSY!Sk%RiAP d3h#2e1Jd[!Zd(4i&[JEq!ci&ZK9GKaC%Aq*6S1r%mh)iI-cbefMBpAmpraAmPr0 IaVqIrb,q#1d8rc6r,2mFrccr9[jYr1I`Am*r+Im1rPhmZrQ[j,q+rfVq&r+rL2m DrQ[j$r"ITjSTA#i!8"1FDAarKS9#8[[QaKF%2$BbYfZ`##c)fL3q5*m+YCSFA%) I&Sh,d$PQcp6)!0+J*6Xe`JMQeNjB)r4[VV)&08+lTJbMdCLAX!`Vf+)bV(S,bi" C64R)P9XdHQ%Ck"Gc&b`X!d&M,S)&C5!@M%Q'%M)h`-)6M3A'D!GM!(@E%p&'YfR f`m+Y-9BU``iUCqJr1AXD,%J1K3!E-Rl@XD1hX#"X##ZL'Q"@*Ke@K4eK9P3"c!Z l@KF2eN4Cb'f)XFqi+"5Urrddaqm3(UY#hbeM@+&PmTVR[GXH9rXfZ2LjTM0dN!" 1F3,GX$iMhD@MYTYdNXjBhp,U!lT)pqJL(@35k"i6JUj&kk)MVHk#4'!!1PMcM4` *RfjU&rp1rKhmfrN[i*rLRq%rRrrjr(2mmr`AmXrblqEI`jr*k`f6ac4XAekffbq d[[ABIEiZd(,0QcT&dXelJc4,0KT(NRJMNAT6LdZY"5Q&i+Md98[9ePTDbJ9)'@r 2kCkHNlefYC[G[VV9D+AV49bNLD6J("qda,%YS0ra-XI,(Dp36+XP2YpaZq-1ajf 1ZkB0D(XMPG[h'bJqjk)@1cC&)4JN,MVZGG`h,5ChlFS$CCAdAZKQ`3GP(DFGfd* 0YaP3bDphIUlMF!,cekdPXBEPi)X6Bf[,1elRZ-ZaQ3#%@e",iITM5CN2Lfj50Yl @Z([r9N-[@M$QFYK+akXF,hAFkRLYic@1,h*mSH0&MKFkeQaVEYqfA22-()k#ZA( EFXf[jh#$jS8Ee(LdfZ0V`cXd*2pqR*h1Kjk-hLk$G-H6$lhe-lr"Cp,XrG,4VGT MScYT335[PalSF,KmqZjrD3T%&)i26HddbBJ-LiT$3iKB%jd[jC9e2M3F+Y*%jm0 `GPcaKFcpmUalSF(SYj,1MfXd1Kr+$fY-G,iq`,F,V"FEP@&d2NSK,#24qIS!e'" *jmGP'*f2d!M,5(5q2J!a@G,j5*,`4([9*6`4D9R5qA(K4ZHMD2`bR$%8')i!"'G q"RDZ[BqjlEAM*lD$L0h@QIGe[G%DU[c)C`E6A%Kr+p6P-DD-)3m&KF3+FrT[iP3 V+rH)@L3Ee",@(VJNTJY[RaKaqXZ-FZpqiTl(FBEAqQ8&4p[h9Ph,U[$#fjkij`Z ijpIi9UU6lG-Xd0T1LXfNX6cmck0P$q2Ee1Qd4LSPdq$,IcfqpXT(hR2eP6H@MC% Q5CecNDHrNqH-5pSB15PqVIUEKrV6$U8[rqkS1-4mSF2DPFl'cIbrdaC0R2E%GrN &R[XqkTND1LG!P9-cjC!!Q3XR!Kp2IM9hSMb[C,PPaMRfT[FF2!EYhDEmXS*clK[ ABRPl9erpRRLmV1*L9XI$QkHe)cH5V[4*9rRYc1S0+!qrerKVR(qbhpFmk$FaVc2 qX1-MRX#MMTrQ0cL[prZE6rFj0lLHTijLqjERU5&hkAa1#"T6Bdjf!-bc#k+C,M1 1XLm$ZhNqGmhXD*9lcSRYaXhPbGX'JqiYicJmBZG5H54iM1D+Zlb"ZXh[3$S02[8 [0r,daheJ(4EpI,R@HGEX5mi"1'Gb6X1Nd)HJXES[e12,,Bh#3qLYcm'V@&kIJdH aVMk(bi8EkMkDHq+RcQ(`hm[p41r-FYfq(ka4h$GI2DQRS6ce1G`aIirV5Hr9Bpl 'D[EEelPbdI&jG4qjbAKcI3jA&9p@Rm-&a9[VFlJrIj2l[AKAN!$,'m)'bahlPrL F*A[RF!rrj6jRkGijA%ppYFqjB1mFl[-[VZH@1rpf$B!6jr!Z`1[VFhJhi)he1E` VF2[,r1f`qFlFdh'RIeSqY4eG2RU`[G"FZ0p2XXDIHHA95'`Gf2MH6rXI+EP,qT, KDSH4YD5r[GX,'m&GSZ6eHY(+aH!ZHAH$chkTIdp)Sc9ZK4Q02hf[CLMZ,UmdQ&E cf)TjjmDaqKdjqIL*l@L3!#@,AM,#[I*TMfe`YYbY9YidpL5bh@$')IGKfPmETpl fa0RbTALT&B*d"GcVGRam#fqDAckmF&2MTX-(9`m5EPZDAr9k$Dk8cdAK*ET[eG[ rM)XlillXd5dmr%f$`9)rVCVGk-$UeQehllqhQDAV`G`h'A2)jQ&4jNAC,%*kefl H2T1Umd-VVFCmNc++Lr(0GkA(pfrFdZ3G9Ph3dC2%)d"pi2CK[dTlLBS(BQVDNC4 UbY%Y*hCXRA[1GH!l8GA0TQIXcPl-A,jq5LIZcRD1(#5[ql[IA4hqb$!Z%Sl4KqQ (EBH(Jd&H9#TramQ#4kq1++@(BdpFa2eZ%[Ub1HqAHDC6cFZpbFZmbH1fGM+14&6 qQR%2Rc(+fYbJ"NrISc#0dIpVmbSIa`-EH6GDkPG*F5)16C!!3G,,P4h)LdlDjHD &(D206994'DS3SYXT+!2CXA@mIAKK8E1K@q$P$TF&6'"QaEE%M103dKpUh,d"dkm "lck8Ec`3"Nec@p"DUF5J,1D'maej4+YeMRi1T0fi5[1qf%22p1kX`@&H8hCRqjY h0XZ6fIUS4Al5UhKi0!LP-lQ-iN&hC`%lR2B`k)[-U-r"R$1djPES-cB[YZ'GPJ2 6Scb)Ge4TC$b8'4b[-HZ0-"h4j`k2*Pfr&&`DqU'e+4ISXfT0ShS$Y8dcL6eC*Y+ b1G0@Vd8DBZLMRYfrFp"qh9(`Fekh5RRGXHe*PX4PdMJd6,10k'#@09BU4R&hqF) iQ&R3M5NZp854TQ&$RE@Gp-2M,-[c2LpH(aLSkCY[RlreeR$3cNBR,VYa0XTZ6ak -1JZ,1dH(PA,e+kb8HIDVND483eEr0j@pk2ljjF9c*4PFU8,5BB@@"3E$bp[H(5C %LGaK5LieH3$cp&M,dEbI4*lb(8A#5'mHPPAHDpbE2(!k,cE+k'#AU6p#MikH,+2 9Q%120PD5UNVlQf@db+2JaABm')bbCZD+#fHU)LkM`mRkF(-c+FB8@3*i48!3j[( TV8PrP(Y%@XCPQI6@-hS%B'Z@Vc-@P`miIYq$"NN25GRpklaCfKbH+$rXY&l5lZ# S+8+'HNa,4c!-YR4b8HN!NY+$m5'Pap',T3AHf1SK1CKN1r-P#-2c'hDi9GMqk(" p4,k$L$HG-pV%X*d(&#fP&BU2(M`JI#!Uc2Q`B)$a$V)FS8%H$C@S8c0X'Hq6L-r 1%Gc`CCPY+F&2P34'U5a,IK(#Vc0Kim(!Aa(3&V@2#C!!F4MSG3I4%RP4)F`(DFS bI6GB6h9i5'rJ2*JrEe6Ncp5qDUcdT$UVIlhLpNpVdj,),fhrZ$)0dU@BUNTM[$H Y5LC$#al*S"`q-F9FcBaCCUPB3[P!pP*qQJQhjkHNC'V0fN!!00p2qk!M!AQN F4PNJYSd1#+56EP0TZ1KCK41UH$ZVpP(r[GYr&lGlYi1kUNMHdL2,!i1ZCRT`UFm l3JHbd3R9*Z`lR@iJ#6"I5Jh6Gp#D"fraPGT5mr4ChYde28%PNmS8Bd$P-[ccpEa kV)NBd-A$#K%JcRXc*Mc-'!Saa"@DSL(pMHH82[*DXTI&fqRQk##SC'IDhmK2Mlb C%@ThlhaZZ4XT*llrCBI5DqX$*0K1S(M99jpkE+H8r0IHm24Xf)[N)VaECVMF*$F AbFZHJ(Z')a`VRh2q+DVm$CrdY8Mp!R2r`dr[k)2m$4rcURY1NmmYCp1kFUrT@jd 8VYE)XlRf69K@cl+2Cl#-NH95&Rka+eHcj*9GZCVPQqcMi+``CeHZCR8a@ER8E"0 Q9f9ME6YCZG5X*#3VPjSe#QAP8V2kRkaFDPEhNj9,cGU,XR+T@H[3VPa0Af6P8V- qS+aFDPBDPC9,cGUJXR+T@GP69Lie+hM+NQ&QK8eCZG5XJ#NVPbUYD#FVPbVYSL3 VPbSYab-VPbUYA#FVPbSYD#3VPbUYQ5FVPl+XP&fj@QQC09Qj9'NG39Qj9'Pp39Q j9'R94eN&c)bUV&aUeXS@DCG5[f6PdT3`mT4#5Q[5bFUP+DdX*bZATV3HRDaFQY* #(V*bD8UVpXR+T5R0Y+aFQY*U6E*bD8V,,FR+T5RYQL3VPkBddl*bD8UVpXR+T5Q Yb#JVPkDd`U'XA*V5bT'bFQP+DdR+bU9TmB+XA*V@c)MAR4C'9Lj0D`dp@ENdV@Y YXR*T@Q[cbFUPDFfS2153!0DDIV*bD9UV0XR+T@PY[b3VPkDeSTjXmC*@rf5jRE3 i5Gk16+YrXR*T@[f6P8[6iL4CZ65Y050PjG+-q%Y@,Xf)1f6PdSaQ6eBZcDLRXR* T4QI*bU8CVBBRDaGQY2UIE0f9dIdI@ENdSrX3XR*T4V`V+jGQY&q8,''@d3TpXR* T4L[`bFUP'AP'XRjH4LY-bXUP'Dh8+#ZACV4DTUaFQK(AbXUP2)CY9kjQ)cblFR9 @r#XVPfE&Al*bD9EF)6j89P`J+jGQ0AYb,6'V2XV+T9QG+bZACMA6XU*E9[YCbFU P@FfdV&bDe9U%XR*T9LX4bXUPCUe[@ENdUcQ@P8Zc@JP59Ul1kQN4@ENkUa8j44q blCTGZ6SRM5%V9qI%YE*bG8jF,2HaFZ*"@ENk*ak424GbQLYCZ6URrXSGPTak)5Y AjmDVIj*MR84CZ6UR1CD9Uh25%,*bG8kV(-V+e6QYSbNV9qHd+U@XA*h6QT1bFR9 1+hr+Nr"jk3CjYM`[h5)V9qHP%f6PkVbi8PDZcSZ6C1AU['CH9Ul1DfCN-DLmkT' 9Ur0DI%Y@VXkVCl*bG9kF+LYAjl@QQDaFRGFUPl*bG9lVLXV+eAQY,#SV9aI%-E* bG8&D89DZ,QJ@CHAUJQC49UiZL'0NjHU#H&a@VMBVLX[+e3AaP+aFA4"hb-V9"Ff `V&aGd)c*bY8&p9&@VLkS0PQjZU$e&@APkS*@Dj59U`YD)P"@VLjS08eCZEUJIX[ +e39T#&QjZU"qbmV9"A'YV&cG+ZdY+eHh5J2,bY@YdTQbFR@Vp*LXA0dUr5-V9lG +!mM+eDfDA9QjZP@m*LYAYfUfCHAU9Xf*V&cG+Sk4PDYE0DqbFR@VeZq8PDYETAY NjHT@VC%U+eFEb5mV9lG*cm[+e@BeFPQjZNdk8eDZEP22C1AU0QNH@EQk66T!9Uj Z%kI,bY9YiNYCZET0FbNV9lGTRQAPkME0M+aFhDDqL%IH*VbXA1eNqP,4[X[h@6[ #`dpR2q3Q,`Qi!HSBDVIX%SarP@GCkYp3TfAhi#Yel*bI!E"k&hhG[R,X3S9IU'2 (`[fVcA8,m1BA2B(6r%`GiJ'-IY&l0a0eA'5hkkYe6$ENVMV'f[l&1LB+ZE112@F Z0H68CqUB(2ZCIL"T64e6h5JrEA5m(iGi,mJ48)GqE16,IF9ZXA@FB++lkMKN&qR rqZVA-I9q!%p3I@lZ*kC-fjAHie-6(bp66GHD[&iemZP(i#CQir5(MM'2ZcN"kM! 2XdapP8HikYm4[36N"+L$clb8pq82km`mm(AL8qefC`E!qa5BMmR$Br(A1I2$)p# YECaaMdF`ASFc`#1ir0!(IA0Pr+ZmGYIJMdIR-`!H)(+!H"CMdh'2Cc&6akaR-92 (V'GaXSil2)[T1Y`,RN@c(bA2BYBMD0CaVdF`ABG$30[[mFfD,hh1$ddqaN6hD2, MM1B+d15Q$VQR0-BITr5CU81rmAZI5,02$AL[j*kY)haBY2i9CNmi!)i+CHS%8!6 k4GC*efHfVfi&*MrpkEF50plC1,2rlSXHdk*AYEdZC')5cfMlQ6TQYIe-(E2DrQ3 GGfMlk6UZ6Rbcmd[IhGUqf3pIfdmSmXrAFABqr$Vd!mU1J2NiieNdqh'[Cc&Gaj3 Sd(9SSTj89PiGCSrTXBmLp*l5RJaZRV'[YI5+Kc['D2X`6DIVd%r$cp6"0q#ld[I e`p6K$[!DH+,@$G#2+FrLc[QiEYdh[-r@i@$TZG2ZF9X(l6SbqR-KE0MVd0JL8MD [p4qZrZcC2cerrX"`jiV"[kr[%+'MM5%LC,`q4!51GSQ)N!$aBK%4Z,aP4!509Sj S00"I0b)!PhH2U!!VLdK8d#0E5941m&H8U1$XXK$PH5N[,c'#p6HC+'1pY5BL6(A aL!JHEMf4!-HEAYq()MQKeR5l+8899*Z%D)H+#"RYEK%Z!e*PU3JGX95%M&NU!NF X&5&MPSV!CCD+S"&,04SS,"@"3jC+J0(!*ZKNB*-6C'!6R*h0mVb8@@S%kl08'HZ a9)5TXP3%$eNU!Bih[Fj5b3QeTPZ@US*UNa#a9)5-@#VB8U9+8L%iiUJ3'&08L)d B+J6'""9Lbr`8)L0kURG1f#R%KZ38ik)aMF(*P-B(b*!!aM!lMY'3!*4jU3VeD5Q #HU`83UUN&+*$6STaBlfZ-e*m`%L[,4mPQ*(q4f`8!L-bBRZ2+JXC9%3r"K(cMJ& &K'-3-G-B8*PL$#6LPR)MK&3-+'36(a#0PSp+CXT(bM$jH6XaAPr,9"&JI)l`-"i jQ&b9&3`XT!-I8'e@R3"mC0JX1r+PC0LjD-J0)TVZbK)me8'2$iKQ2JE(iarM)bD )`6%Ta2Jb2m6SL#V'ZLUX%H0$!UPKSr'X(C!!6'VY%"RD'Y51E$*3PHedk[$+YMU *9)PK9@++6`JjUSDGQ)FkFp81DFk$jE-kVMNR%F[&i)M`iLf2USbAR""4AS+115m jS,`$8Bb1@5mjS%al#6cL[I(Q#[%P"i6-9`G(Seir)CReqLNbl(@XRHVUE*ATViR hqDq+p`J``98C-$NLT-!kH()`kL4B2f9d-#`00S#M%a-4BB+1Q$"BEkT+JL%iiVm 3Q'cl&'!MeJZ"-H'&f$,AKFL)jZUG%iB,X5'jaEKSI'0`-VRa!6+d-Fb1C63NC3k V3RhkLU!HFi@3!#TTKHL3!+pLh&L[kb`9(c$5DmY0#@DNra%MKF#)M16NiSJ"(Tf @1mDTA[9Se)d(1Ql(Jflkm8$($AR3Siimf+BP$r6iTB))RPMfS"ZH[88fr@X,2fj Jfb-5"pX#UfkeQDa4ili%(R(Z$6LflJ'Gm1l"0malLccHr5RlhKj4lhl9`2G4pCP S@[K!'ajq`Pi4FXbS6lJV3SjCp9AQLU!0Xll1@`edl1A(V*8!'`lh''FP*m3HGma Bj@PU1[SMI&A'9Mcp"PY&m,UVAqHU"$hCp*Ua(a*9&95EK)DhRl#8E1G9*LJ,LVR *iL*DXU#BN5bZ6%B@&I'3!!8P&*3!KAdX,L5H%"10A`K-*Lm%bp#&%$YDrN58qD8 -mkR&KhQXBY093V()N!",3NbpMh8'#F'92PVHL2+9[NCXB8(0Lh0EYLq+FBdFeq) Dh*6L'MQZa$9i9)KVD&1(Dq4a'4kL%a@Z`3d4,X#Q#KAdF4%U*b3D9("9XFNdMHT [(cXL[m('kPYM6SK[$@pSE`'10he+HFX*YDCAGEF&e5DKUESeXL'kBj)+J@151kD S%$JQZ"1##T%0Z9fMTcSi&YX9FSTa$G8j5Nha!E(QV""60%&0Q9fPT3KD%GPe8JV 4GBPGSk3B20(VQVi1q#M"M25r)Dj(b'M[2fK)3dB)5+0LkY'3!"(5dDL%EM3Q*KS 0U9&-##Z4LdC9D%83mC!!#D`fAJ)Y$CB!J['Km`Paq+#3!$)!q@5KNh@Dd,J+33K LT'ZMT#$3U'X"%GKXe-0iq$8N8FVah!ZQTSlMb4G-64%RXbqJ4!AATMr'"FUh-[m "*"&qS``3B!1a9q%!1`9999YP!BXU+GNk$`J`9Ume*JK`SqfVD0@!$-*dZCZ*-Qh bJAR6,%(a'''PF8!HHDDEd"bpA'Zj-,#Mc3[H03`3CHkU0-%$K6dS)C)@P+"0*Jd D8!,BqPhShaaH#6TRY!M53KldAcaEEKYk(Srk,*m1fI0Emi*CSA9`[,RTaZBGc6X 1p1,Z!9kKdi'6M4I10bpSfm#a4J(6[*!!0brSLfZ'&pa[e'"jiG`*,eb6p*-LRHh '$B&HQ$[KK4Yia(N`iZG`q`*HQ$If&l`9U9e[+Y,bJ[DTfm`,HKpV&jaC(HL&`JX qYA@IR'h@C-!,jlh)#cT`ZK&$`!X,aVk6C35hQe%Gm-,m+5mii)cU`(GD1*Y14fT HX2IJ5VcJU`B6Z0YiSH)lZH,m5-d,ePr`HF(T*KG#APM!1M2+$qB-$eRcl(!ebmf 3!!ai)40iBEJe'qjTMS!AXYD43hQ4k*'a)l2Gq#(JKGcdrX*ZhJfl%KRTF&15!5m XiVdR9!2[2Ce$AZlG1pZ)SI+0[2INcRrAapklGmqphf,IkA$2[II81V2ZIRA)#`k jpaL#pjlFFrHVjmbXZdGllUblHl34,qLYF!r(46U,lHjNG)r@9AHrfYkMGFrGVrE [`6RRlPHI-d(TKFLha@@AM9[dVM(0Nld&cIAk0mHrZqUBA4Lp@FDp#k22e(&Sq,q qqR8i!9EM0h9-6*RHcYKXK$0jaUljjF@ADq@-,H1e[TXcSRFmRjL0djplB99r[8r 29&Ge(8H(-`,Ui(-$,-*q@Gj2AMT%YGZGIr,,b8rcINZ`&)0&LZ+[-q`$l3+Be8f $36BES)kKGZZ9*HTeDaYR$(9DPcRaFhAXR$mm'k#[HUIliX[R$(A@,[GM@bZrc'@ Rql&pjG*5r'IU-"VQUTFNAXZK1-[b[0miNQ5$LfHB1UDBeGGiBp0KkcLK&$pIaf4 $lUTMV1eIV'1LN!!lkpKcjP*$6RfQMXQaRqN(@iMIl4%dklMA)jLZ`b'JlIGX[MC RcJp02XC%pfMbiicQ#Y$NTSlV,Tec@TqC1[30R[Y%'R0Qk[M+d"SpAGTbV(&)BID %!q#S8+C1!%@JpfbEG(eQqqT@B2,6Rei$EH1GMHQqC['hk&9YV`ZCQ-3cfRkQMPP Y2e2(V,Br@FFGfRkkMUZ6%kp0p0hD[YN2ApY2+2,2eh&f2[`kp+jmMS$j110C02Y aVfFaAFH8+0"eQ(hYC[TkQ!d$Mhm8XDHd$'kHXDqep)U(1mCSqc"0TqZiI2h8j6V i"Z*C!2d`GEJ$[!Ep(T8MS"p6RX@Gmh(GqURAkNL&5dIU#NANp"*[`HFRp6Rker+ @I5"d3VmkRYijjpR6F`"f6qU*cJRVb4)@,j`6pLG(f&[ANbIXZh!1YGTcH,%b8rH l6HHH1QF1iE+k2mLC1C0c'+Gk[aF5VUM2@85id[1SYiR)A*c(aB6ckhU@%+jb2AT lZkL25"ClcP,#eI9FG"!ZV1HaLh"4I8ihiH+klKl#jpApjQl(cI8j[B3[UmrT)lb e2UHIm!@HXjj*jj+jA8CiLmmTlTfcR2!92UGhlj`9K,IjR,kpFeB5[VkHXe@%EkM 2@8hia[UF#`RI9*q$mRj(IFiD`RI@jk`PI&GpcJ$KqfUH@NGiHhh1HX,helVKc$N RkLj2Ze[q5dAl`Rf6B2I9q1ZBqA(MG1afm$dh6XIVF!EF1(9mh2!mIJIllPXJ-hA -hJ+CU@2f&XM*1Zkij6"GKh[KKQHc(k8ERM0er$m'j9@+PZJV2'H`+ZU9eDi+90` k2dqiLN0`2VLFF!Gh@HB$HU$"Ub2pq`RZqNGji1('8%H)Zi!kdX,T1J+FZ['lR0I 5UdE14(#e[qIEJ-("G3'ZmaX%mm(Yfm@pNq"SVmSdE3'ZkblUH'@[2(rHAM&kX9H 9Zh9IqM0G*TGq"&HpZrp)F+2l%H"k0"Hf(`'Z52pDMVJI!@ljQkIp#(#hrQlDM`# hkPXmUR&aVpVFRDG9HL9JELq[9%I`&CqRR6Gf@Q89[IkTh`+J$rVE`#X2UAId"LA RKAAdRe%aHLiVZ*j26($KYd'[AK4kZ$*Ph-@I)VLj&jphQ,TrV[-1&G+mflP*Vci 3F-Z%D`qiPc0ckNM!I4"q@[eF`-el"YbM2+rDcFYG(h"2IJ+Fk)jRmaV'dNF#lLd L&((p9Rb2A$lJh[!ZFZ+J(6M1I-m2Z,QFTGS"0d`2dSf!H`i[4+LMlY1R#+6ZaEK $DYPpr34"@m!Gh3)RXQ(PM`MQ"0bZAi*lM(%IeVakZ$A8TSkCeAH3!-X&h2Xq6fl Bjhf5i+%"GqeMi23jCZjKGUPM0bpMU2X#lS%r*2Gaicj$lV%"YqCCJUZ%1hEf,r4 5VEN1lXa)Abr@V1cbh$pVdYGRd8[e)CqRHF[fp9fmSDdq((!ETG8r&(#hIarFi`, ZNLq4@aT`0hfCh1-$ES[QkR8"pm`[JRY#`+e92`B#lVNr!(G&`1e'Ck4Fpi&2Jp2 cDhLG9bL%9pk$PP9k43)qdl0LH@A"4m(aHS2q2[eRcRa5`!fm'ab[2d$42)3MFh$ HNq!f"&dbJ#ka[2,m4`$Fcr9TR1@9TI#PHQI!EB)r-Q0HH4%iV6[i,S-[,DpF3Hm 8A'4i4IIBcYq,2`P1&0Yb[FSMmhIr[i*lS((QP4X2pb+Gpb$2*4*Iq'!629,h"0` kH0Mb5TrUN!#RlpI#UCCA1Ri+6Xq#UH-jNcU'VJ0hDF$G(phJmFUaXhri*VQ("0a kk8I$+lSI@U1SplU1&illHZcXXfK"p6lMAMhT+brU+&eqBq6E*hfpk9IJ0JAF!p! aPPHZ9`r%VaMmaB4AAJ[A+2XP$hjZ`LX2jU8Dj6YK!hUG4AMP%Xj3#`(h'1E0mXU Y(`FRGp(@UUpp!IFUZ&,CkPmPIT5qI[6(i-5Y@2Zj#GpFmMG`iKQXC5CXAiFr#di mL5h-BX[$!IGQR5GHeeETVDH%qMi'GbXldH[K&DmIamlqC"ZFH)IV9BIdib0S"Z9 l,"ZPLk3IIG*EiS&Yd+Y,dSrALCp%e`eVVU3I6aGrLmI`51P4d`rYCfZZ8@LFPZM r)5%&3R9TE'3!N"`*KJ%Y!#`"[3%l!*!'0MF!N!Bea`#3!iB!!!%1rj!%!q#edZ` PYMQR`J#3"3,KSJ#3"Q''rr(rr!!!`d!!!-"#)#!%DA4ME!#3'dMp#BB!d`)q!8J #S!#3!`%!!$A(!!#NJ3#3!aB!!'0F!!!"$J#3!i%$i,4J2,Qf1DID!*!&!I@[!*! '35Arjrrm!!$$3!!!-5S!$3pTG'0X6'PLFQ&bH5jYBh!!N"#q!`Q'!*!1BZ`!!+3 4!!"Ll!#3!`&069"b3eG*43%!Xh'ZQ,A5qc`!N!8"pDm!N!C!43!!XFX!N!Ci%3E iMPhHCThG`Qkr4lE,J0r+Ep&BqB3q[qAi5bMK#lmSTprETTFZc12R%Ej)MKqHHR) 2cehc#Ek,+lq&NadMJm@2(&q1AblQN8ffNB9IK*H%pf5ILf6KXEi'E*2pC,[`MLc ([d&qNLdP#e[ml-M#YJY2XPe1kaK@H)(BHLbkX#iA2ZSmYi3ZC$Nbi!3&#eQ1,)5 5``-IYI1kCRCE,h0JH6Pad#MR0V#cmrV0VVHmM$8aqii0HUr13GUXYl0ciGNl@0V RiR815[1J$L53!'`(m$cq5hX!j9HL`4lZ!GY$Z!G``cd!&Rr!q-jVQ1%Ej'ACGEf GC0H!r(l)1cb$q22m2,q[0"Ue+)U@4&(Ke+M`0hmC&IBq%N@Vlm$R[N+a`0Ak9M@ UbCBibp*'9LTRM5Z55V[MkjIbFFTjG450rh-8P@dh*U19ZI2*dC(jr461&C`V1@r J[*(cjC`[iR`ajbXiEe*`1CXi@cJl1$G`iP(AFk)H,q6Xj0c)H5,R,-ijR!Xjjh% HclQ*Xjec2HF,13p`6Z-F`0R)1C&c1ZF)cUfFkcMAF&Cc)Q[)@$2R$-i*6[)JcLA 1ikQFcq,F`VQ6Fa[RkMcA!KCb,ZBmMA-4jdM1dcQ[jA`ZjmfF8L['YC`[jGc&ZCY c$qGHcSXi,qDmK"0!XTrc8XlR"b`bMZ&m!@FEjeV1Ch,1j*c01CGc!HGmcM'FScL AFilPR-`Ci&c'fF"j(1G5c['FScR(F9l'H5cRjCa61+GbeR!1i3ab$Z9%E9r(q@c 1-cKV1BGcRXpj*HG,1+rLI!jR+qGf3D5F1cM2j$b,mfc1BCcRF)Bicq9m"ZFaR1I Pf'&%[mjj$HFNcK-ikaF&!+TE11mQCC*l%jaZLBV&mfq,PYqhiKfPk#h[+*lr`C[ bqN@G)B"jIpIpMe,h%qpqr$%@V2R!IF#PR6PV!CF!JmK`(mYrQrh2Yrh8(&h"*F! Z`"NXrqfqRjQM%6$4ZTq9Sc$`%kJ*r,6LR1[hl-M[FTVKa2I!IKQ5Ye!KMd$kj'E 'aK9@")q3!&Y%dK"b9LZH4X'(l$Eib3fGGq0$2KZ8*$PE#$-Zjaa`hd)FmpdD6'k Jf1'(M5-D1*G%-6P-pN2X35'*aUUa,CH1Y#Ze$8PF6E*b@@`M&5f58qZV&SA(Jkf (Kq1iQBrAb,D*mL"*(X0j(1FicV'F)cPV181FScM"S-!F6*TNFPB3h3'G,%M0$pN BAaN2eZ*@+fReA*f+pd@rddE+TBd$&iXr"93Jj[0aUHl8MFr,Cf'1"ATpA`5d")h 'F8lNR-4j!ZGNcLQF8cQRF8lRE14XiQ`@HNAaX"HAV1TX%$#D1"E$6c0k%[[kI-V TlF(k"'E6+`V#VLcq1D%UHCCA3$F`N3iL#d3Fj#'F-UJZY`JMV44B(b3Hb"k45#) JM"b,+q-6T8N8Yl-EXk@Ki3X[@PmkCkfNRm2IFVl@FKQjL(CYhE-B!,cJ2@(MbBA V#bZ+NL2Fl%2#m4IiRLBc6h'+hdDc1+I2fpFj-6+mHU6H6V*kdLi0ccCVM5b45[R VVcd*B9Z5@@Q"[QaI2jQ0b"f"43'%$SDHqJASY,B#GPC2BqBRr4eSF6"eGPcdRQ+ 3!$&4TrFlLN!JB$iRP-VA*,G(%3J%d#M3INQdAa+YPd6E*G(#5E4P%S"!Y&i5lDa %DbI4YNQdG",YRN6,,G'k5V3b%HfU4,XUdDj+0!d3lDS%$"(YUJ64)GT9LGC2SQ@ 9D&NP@P@*YP*k,qGV19r(+5fBp'l1[q6m+mlAFlk"mhE1ZcMrQ[0[10r)q5E10h1 qKI0[1Impjppa[TAclcRIa[Pfc[r!H5IR2h#qJr1GR1mLi@Jh4Jm&fR24iS[f9c3 ef1fcD2e&'bb)Q0dbM,i6Y"lEEFCS*dB,-PTYdI+,PQ'dU+,G&qh!k"9"#l$G&Sc @AlYY&@fhD+9&qa[DMY&5LeCNY"qMp4EYbQK*4XXc@Sl4pSbfBl6dSV8CEEeSEdC V,pUGdH+-pPkdqD*0$Qh2D$0'bc(DNk@Q$'V0S0B-DXfJTJaU#Qf["V9Q8'['ZcL P9JaUcU$@$'V0S0B-DXfJeJaUcD$@$'V0S0B-DXfJAJhUbU#Z$0A9ZcQPpJcUcGM 0LEEirmJT0@P3LmCGR1rK[*Ic2Xll14rJ4(I1IqEm4mjriRb3!&2Uef`C4X-3qQV 3pSX@C(39S@dDIA4SrdCl-PU-lICaZh8F,FGfAa(DUY&LMGCbY*5MjIF[1'rP"+9 q*HGYR+rLI$8R'LM4K!Q+MAj&%(I`F,3e3`T!bcJqZb8BMBeS`8C,00UKdFD-&P# d3+1Gh'jM4YXhfUr4$)Jq0E4+SH8D,99SahCESG%'MACUY%UM&4VN$'h3D"Y('c9 Dc0&HMGCVY,qMM4aYKEfYifM2GY[(JF@Ii2`NjkFi2mhj%Fk2Fhk'ml1FRq2m-1I (1$r2q3A1acLrb2NPcLpcrMI1Vh"qPI0VR&rR2-Mj$Fj[FRk8meZFhqEm$ZGh+3( "0JEE''aMX)h"0JBA'4aN-)l"1!EM',aNm*!!`8-'*aR-Bc#2`6`'maLmBr#1`6X 'laMXCR#@`98'JaN-CM#B`@#QITLkBZU5U8ZQ,TQkC1U5U@'QGTRkC'U6U8fQYTP DCQUCU@fQ9TPDC9VM'DaQ-*c"A!Dc'5aR-*l""!B,Q&TMDT@TBDDfQGTQDT[K'3c 2B(J'`bmBIX&`$BD6-$b$i4N-cf!i"-04')l#F"D'Gc#mJq%G$1pJH!I$1aMH`I! 1KRF`A)EK-Jaq-,M"i!D$'`aHX2$LICc[jr`!jhrPI*KD",pj,qHrF$l#q5MR3jc 5hNlL24rN,MNKFN,L2[r+q5&1`33$V$#SE30X--!-!b`a`")$,$%q5cc*&j%[)Pm NRL6BBB!G"YKKJ"f'-!Dm4A$&!%F-F-3!4`a`b"$ZJ-X!8k5qLISQm4R"&`0m-F! A!h`a`"F$E$(!&J0X-F!@ib&1B*GJ!9%64#f4q*b-Sc$qKI-RR2q6mlrM"qiRBcb -(h,qM22RR0rRr#'qi)V5-NR8*P',4#eD,F"@Yb1T6eQi!DPe86J$`4N)cN$L#Mr J,V91e$T4kd5Y%eK'B*b-$c%+B"Q"'`4@%CK(B"b"F35H%$K#i#1"M`3q%[K)i#1 "L`3Z%VK)i##"J`31%YK$B!k"835'%CK&m"3#(`KF)r#,`$`#m`J13q!DJ4X%rK( B3@!(JC8%&K*B5'!JJB%%"K+B4f!HJAN%jK'B4f!FJDX%VK+i5Z!U`GA3!dR8%F( A#*j'm#Z#aa&mMH"V"%mMH"bV6P"l`ZG)G5,F$C5)U&Zc#99i(-(M#"j(UN2KFJ5 A)lJFUlk%ca&mMUKAJY-4R)lJG!5R)rJFUaD&&a+mMZ"e4(fckPAi(F&e#4j+m&# LeJNZ5R"4JV-5(*AJT!3R*6JT`@PCp5+i3A"C!MX)RXUUHm%)9Zd,Cb8i+i'C"+k 3!$!9f#IibDT"`9B#GdNi)YK,B#q"[36H%RM,B!A"P3RF*@'Yi"),6`4R56L,-4b q"[)2@1f@mA'T&q%[X(lc4C)hm0@pUT`PPFCd-kdPe9*S3J@GT(8MSm2URRCL"CC 20'Db5L,rJIC[mAfLlj0m2m(hbEj2mAfUlp0mRqjlSqp0[MFII(I9LXe*Ur0b9J4 dj1Ypc-&)I$50a3fMk93@CfNH,H3SpRfFlb0pVr9pP1r(qMl@pp(Lr2K@,2RU(E@ NTa)005ScddQp[H3VIp#m-UNeQM)ZZ[c+XhV1l8pTj,8Z1j0kNU9Kh)-pR-&[lJ2 ,h"@RdR0mABT!%,JcbEBPTI%AfQB+AhJ@!!SU-$5kIQYP4eV9B#k-lc#@Hlc"5C8 Dh+#pRVE6Z*CHRDc,iQe#lN-[h(jTUae(ZPcm2j1qV2HIP'66D6eZ[rcmD,@B4"V D*$6,K*DCd$#KAb+HTerLp*HS93JZpQF2PiN0Xl!5(jePF'(m4&F-CKPdEVNNX%* kD[T0--baL2EM9U2XB"4$5fYlEHVJB!TR+)08FBHmr4L!-MUL3J[N#',SL*'9F5Z YG%CZG-l8fQRri%bVhCJZ[6'jDQFMUlDHLY&DJAGI8LV(lHe2"cJT"K2fP5D5GMZ YEhXk4K[b3X0Bh'`q&f(P6&UVdZHd,iZI$L$M34SdHQpY8Rr1IhAD%LMXQUV4+Z8 &k8MV1hlXESrdkkUA'B1RRdi@6,NNq`3VK-`(h2eFUPHY'q1KADlYQd[McABk$8( *2Jr)"rcG#`6Rr)XT0!1F-[D8Vc@9aF,icA%pU6d9CA2FUX5e&kY!Br58JF"U6d( $[e,3#&)SD,K[(Plh['qK8X5rY6Apid,BNPcpBK9X5qZEPH0#L"HX2HH&)S"r)Ep `Yh1SpiBFDc[5eZ0CREGfaf(!4i3#h-1p"2D)8)4kq"H!(ZjjQ,Hp#jKJKqLU'0X j@r0QG46K24+J'pA-!"PSKf-"f1'HKr@`GcjY@8L(CbqJ)dB*cTd)KE6RSGcf,KG Y$XCYja5)KcecG9%!F,JAi"[Z2H#0!(RSYVec'A9K@lc256[HNV--5-FM*%!klTi 'kAL%*%M(r4-J(AH2Jh6D1e([k4#4kNJl&kSM#G*G!9bd5J3)Jh6F-3(5FIFi5'H mmfPc3$VZf3A5m4KTN!$14LLN23l5DHpbdFC!1ZfX)*hac09&!U6MlJQ3!)klTd! k(L!1dQR[A%EM)1e!H$G)ab-8Q(3h5-FM&*Pd"U6MlRNQlB&d1N3AK8Q$G+)kLN` k#p+*!"NQR3(TZ(ZH5@G!1Z1HC0)jN!#1abJak@k3!%j%b$&T$k66)A*&QfA5DC! !6RPl6$S$dR(h(LDG"ZQdGbkMHC!!EKZB2!c5L&!!DELA3"S4LL!0r`*)`cd2dVC hSGlY%&h9B6XAUU-)dT%!h@KP"XL!0"`,)!hh2%L([I0Tbi)d2(Y"'M&+)1e%++3 p$p+fGlPSFb"Y1kG!1ZbCUiX#5-1p!0*`l`&T"-L$Y1fGbfJHT1h*Vlh+G#41!E! M38U`(BP6"1p)P!+%4i,NJ6`@Si!-X8"Ge43,8DQT)X!R`R6MR4-Q!rB4p`,N4i, d)R3N8JQRNh%UfFYMGLc'iIV-iAFX4!V&irlPqLdJHL4)!GI$l@Z(dE@X@8@#p+0 VVhi9L9*"ej+@&BY4UGiHA5X@SPLG&BdV%DB(Rh*k9m5pJUlp)P8N8MqkpJP@6T` bZKi5Vf+"b[9C40H5R"@088,AT,39QeSZjCV%e95%+++Qh"0BQSS33p'8Ia3r8qi ZFQDpSc@C$D(9Q(@fkbaG(6'%p!+%d58G`%,&P'-8$e2Z+54-a8KJB#j#)6mZlQ@ pbpAPB&h@'5MAlCQVZbLbTG`,Q"DHa&p'YNLF!Vj&JT43,K+RL(@4+!A%L`6*iei X4U%qBi'kUM3@)PZ46Nd9m6!4TKYeR$!CE)bi&a!b%U3A*b145QLCM&2*AKijBc% 1efF14@-K8PJDpbrAE`&A)d%Uk*V4Bl`i&A60k$&HR$jd6HSaAT!!AR6YdQ1+J3V 9Qp"MFMA9KkjT25BA*SqZ56h'#h)%A60k6$P1*AZpk0UPaa3$PHZcL+i*2DB3Si5 ZC6fQ$eI,L0U(TEdS@XE2%R)H`X`HY#cKC!8K+pLB3m8b([BMB4m'pU&I#IF1)9i 2eZ94VS4[C@3VBeUQL5d9SB"TQ5Df9)3LTL@Ef&,ZH8cVDQ,,KZLUZN36@lSkLTL @EQ*,"mKJ@V+*,HAHLfQCEV0FK%*qmTM@e@f@$C'VVLbQ*EV0ZV`p6%YfQq@%[!Y DMITK1D@YPS#525(FEX+H',hkMYeCk2R(Hq5m-'kRA$&'@E&bZqCbBNfjJNc#@UU J400d6icHI"3V+0d+l)ATVD"i@h!a4&iPcpG1$qk8%+H-0AQ8UH",#9Pk-+@%*L8 Fk8'3!"*fP&%MMaF9T#KK4!mk*($"C+FlTQDf`AqG1%R@lF@*FQm[5)+"Hh&L20b ,%QAMAK#ANaGM4,PM-C!!9P-a4+@QBPbp&#E-L(0K,0lZZ8ICZaI%"DqH',fTYB( -mdq*"9kNK'43MP-T%eFq+-Bi$!51P&!-!8'KalpF69&a`3X5P4Lm)(%DiB9ab83 a4MRhdA&XU+P$a-+,%b8@AT!!",(`iX5)K4FP5Lbm)#ka+-D)iNNaN!$@9$&%TDC La+)8*SbBZ6!@XI$FSm6##q)5LjiB[DQeLBARRb)@AU3%X5M(UC5*5bb+-3i$J8- XLL&!,(Vmbp88*4CHN!!SXI##a)Q&&mBP&X8BjG`R&)XfKJJrEd'ab-4*+KDC)"R &)K-RT9KNSL39Ldb3!)4LiF9)%P8[N!"$eV`3PCT++4Ej-&%UhK8QSPKNh*1+45C )3V()aHK0VDYBC2bcLN8Q8NDa+-5TP%P#XI"L(!D#Z',KKE!9LjarZCU5LN8Q5&+ ab!4*+aDC-!R&`SY4cRe#XHJR&PkFT',46bbm1#R&SN)X[#!*aH)`X5J'FXKD,l( )e94+X6K%,(*K)ST&K9Ki34++4B9Bp!44aH))XI!LC45,IQ+4La0A,!i6Lf+J-K# iLN8[X5M%L#N@&@,K"8NV&Vh%SKLMR(ZA@%K$@*P5T#*%b86+28%M8K&L"#,P(k8 1+AHA0'5pSbL4$D%eNR8Z9%H-((J"`RLA$Q!4JT4MP!UNh&d5d1fG6jX0r#R2&15 RBL6!2KHKN!"f&q#chZ@LG8!pk``ilrE-e888`P2Z8I"1ZFGK1aA!"HbXGbkMrId +CP9ha29Y-r'fj%A5&if5HB[TXc2*5J'qFh(D*XZ(09Um9cBaU@32'9ic@dR![$e edBNLMFUN*a-RPKk[(",Tm9K59hUm6SLeYFB8VqKV3)"I9c"2XIKPX0c,FZJKi,8 VVPH&3hPX-#0C,T9f&T60,r1968%Z8MS&AZAqXJUX[@ND*V1%T@3Ui,KPTXk$mT@ b1FPUKr%RqH!HZ(-Ih&AaN3GM2ik'LHfX@"0lSq1Ai2D1Dj681hi*0ZqiaQLmiaM PlijI-UXCA`9iapAPqh'h+'H-qbBK)1k[e#[ZCG-#YfTLR$rT'@DpVUI&mKf2&0& fR&ef((Ic8Yb&pA(r9)TYSTa`5@8p5SdG[bJR0[fXTAiZHa*eE-mZh,'G8mKMHhC KMqfF4KrE0B8rYQF@JC,H,JECcNN8FKe64HTkCm[8MH!@UZXAVFY`0DAa+1BE3k5 `Vi0*YNmh+YRZ59ab(I0*cf16'b'6p#Jq4CdbPC!!`LME-i95@pXc8mp`)rA-XL0 e6[-MpF`b*(A1F#4e6E-NpHcQ53R[+&05ja4AFKc69-,alLB66S3SRA$mBZc"VUB -DiVkaRQ6lHXb*rAaZ*1kTpL6ijK2HS&"14%b5Bqa+0FT8`PT*U@HH5i9PaDM[Uk UQ(4-5PE*##9JGN6*T&qD*@EbC(NQXa4abqBSiPqNYBRm4,bkDUmV2qUEbT!!ipL G)bG##6U5HA,mdU[TBq@KjcffYEFZdIQLfqrr`D2lppqDlqRXfrCGTmAEiVK`)lM `cr[hIdqlj2QhI5rAJR4aA(J&+r,,(RYcYAHNApXh%"LS#6Y5bZ+&3d!&,((S%rH ")2b#cpad&lMJ'`F-0Ll)94CY!biika,ZLL[pE--R&hmhA!JpJ3[@'Sd##qE&[`d ADSd,BDEJcmB6dVK3Ga!A`Nc"[`dE(&`B`(+-j(kZV620CL0V,qC''"`pXLEJ`YE 4rQKRNZeSd5mP-`(1bM3@3$Y9Yik@"KG,``S(&l!IU-dMX3[[@G!&(cI'i1$#i,# KIm,ErqFcpkRp`bUe2J&&(MU`!+cl"G4&krG5R&JVP[pVZ9MjC!2G!e*F8MGRCG[ diU,'ZM4VDCb"Y36[SVLR`F3aBH%0)p15Dl#bJ$&@h[+BH@9FUcAB8Q"G8QY'BeY +SErI$,50pQPc0KLXdZpZd$FI#ahI`0,SYe&XjY16kaqQGXecd`0c1!9Ue"6!DMA M'eX(apGemQ$k4G)#Xjd%XCP*f*V@DPFTcCH`Cl4M[,L99D+4HM[*,SmV#@Q3!*d 'pUNPhC!!AU(c'r!)ff99clbemI5Z(D*B5khl"(-`k&QRrR,DZlEkqNj)IC-i1fm +KpVq@#Lm,Z@CA!,1k1rZ$QcRAGc-[-GV-9i9L84&AlpeC2bLVATrh-21Ye2REVQ j+6$kReQYc&Zj,"X`K4N4[q3k$P)0fDd[['d`XJ&6Ei[ia31Qhj!!LTlbX#ShkE) fRNide8"''qbq-XP!*L-X#A&adX`D'Q+bKq@pV+8LA*F)N!"-25[p%BC%R#)e(rE T(VV[MFRb4Yjk8kj5ir'-J@DcPPCL$@J!q1Y5iE%9`eXh6B`F0#qDah$ADS+i,&U a1iL-%B3+ZcJ`V5@(U@9lk[hcd"pcYBR!)L1fIEHfVNQaJr"VBc"T[FQC4*)B8a1 G6*-F[KPEp-dG1C1B)a-If*)BC"NHV"FE@CZB!jZHpaSGXTkBhqV-+VARX6U6q5* c8j*c9*2M0k+$I9)$e#+$dN!)a@VNI@a5AUS`1r0%M2l1XY''JQbI5L[69F''D6e (qdf(MBlMMRT)V@er(XQ9SBZfH9I5hYlS4YZ9EX[B0pXfljP5eX2HHkCDM9V5GGm ECkf1FAmlV@%6XVLVd@imcM9AMii'[S9FUTq**GL4fXE$PMZMCV2brJ2*Ai4[Xi+ $J-*4l&S,BPR3dpHYKNM*Y'64[pZ&#cY$Bk65YXYZl5lIdUaX$iA9c2[-Gblk$l2 ed%Ac#6'Y#hV1#Vj)Mmj6XA)(H4J1CLbN5,feA'$&HZ&fHY4EiYVHlL2RK%IkTAi b3L4*-(eA2iIf4b8Q(jA29fi5L2Npd@(LQrj9hIb0"i1&X(eeRKp8hIcPkaG"+3# 1bU%2f3qQaA6%QX(aSH%eT69$!j-$A$H2$%kZ@EbP'+KidQec+JS6)kc[H-kUiNN hhmYp'QF!fdcZ#cLP)h1k@Q[AFYBihNQF`H**le[&r5c18,6XfhG`hm0CkaLAF)T 1DhlAFJiJhQEZYh%1M*EY[C[lAh-1FSahF`kf$Ej$L(Fepipa$Sf@I9Fjqa,RX0r B[kc*rAZFpIp!VZ6q2cL(Nm+ANekmH86)*4f2l4P11r*kM'hcZ)aFXZrZml#eB4[ &@a&[+cE%A)IYG1kMPAfalHCbR'0Ib@@-E5rM-MCDpJYUqAmeYR(+QpMHaRem9&L p'YXrBQXiQ8pXRm3QFbk*[0,$HGf0+i$1V,UD'0l%a$4HbcN9Qm3b6SN+1e0XU-I *j&YLm3AB&-"iDiMe4[cj#YG[!cENDIVD[VANQYq'V6(kq-2b3rdelGrr#$RQQl! e"acJ1lQhK(VRqlM2@(Vl3fr#pR9X-iYRhl0(%#'f@C5F-+XUiFIXN!#$+VeKMQe VZ-bel6PF6V6Y8LkS1pKH`Q8qqC!!ZUQk86JMq4L&lHqa,FacELcK[BEd2DQEULp `Aaab@r8YlP+haQRBIXapDFKKi#MZbj3VXD%18515Ni$b)Zr%f`2#X0D3!)2!T9a @f[Cm,UYXH`@AeEDpL3[b#4[U!eJ"fd2'3pJH#AKKfMl$TGffEh"CEpY2Z'`)YQV PUF-fj+R60Z4TSffiEl,YA#l!6GL!0mqdl3eFYYMf6Ll!,YJH0$l$KMSqfEB[F$R &YQpcf@EE6lN!3`$[!lNmbcEJh@Qf5DdC`N2B80Z##kB0YA5'EFJ,kKdfF!,8&fb lZ*aTfeAQ#l!"!l4IUHEYA-ka$60JNA2BrTE,$Y[ZiA+HE4rJXY1f6h!jhcCJP@# PDIX"&q!KE$rMmYaJ#iT[D%Yq%-`aP"rBJ,r!HGJ%id`Z!aX`"A`$0Y6c4EDK0V6 V*+JhJqr!"JPH4a%%hmTP[fhJ"m"!f0l)"CJ$fcZiU'`Ir$-ZPpRfce`ZY`fmi3V E8,[!GYKqcZ@&`4B5ld&p`6D5b`(E`#A!Sf"$AUqa$GJ(AJBEF13kfe#hepZ'A0p J'pjcSfh#X`cP&VBlZB"I`2CQ,UKVf-$REV,YB5ik#ccd45l!-GJHih+cEGrPJRI "KV`#Kq@V9EhkLkJe8'2!Sc!Y!Y`9$"2m,kKN)rPbSTE"%h!#Ne%$i-E#,B8,#`H @Xjj611q[[fUHlJXcEN5+E15c6I'2Im[j@XYPD"cYfLULqUF2l`NE6bjFAeK400b (88-Kh%IJkfZAF+%LK)TS(UEES0bASPAcRE,SpFqm)3%je3@p!mmaVCbMNQNehiH )i3"1E%NBS('8iTQ[SLIRV9Ka!+2(,X3"6ETX)3jSiZ8,F5!GAE%3Cc6A+lYaXU8 SAU$Jeh6MC,&EiN#1ZRBKcPLZYiJ&Q$Q)K3RMLrK#PVKak3(rI"b4NicIARMh%h' 3!*qV&r,Mma-R$-hLVq-0Hlkq1$XZ+1klVP3S92XFCd@dqr*9mq13!1k*lief*jG p#'SVlfR)ilJdi&X2c#Q'b*ZJZr+1(el6HEH+V8iL'jEXZqm-hR2hMN+dY&!SP[- ilU!K[,FRMhM[MJ-a'XMAhT!!$bG1f*mHM(C[Im0m2BP[U5l`[[-NfH*CEhHq)k` (Em1EVIIGS[IClj%"0H*[qcTId-'Ph9rS+bB$A"$AQ#(4PX9Kk&(IC`l+-[jr@TE erT15E*UC*rYHIMj%$KX9)Y88a5RUp!ciZRfG%b2$Ur-C0EZC#V0QYPPVC!RrNfp S6d,BPQ3fL46Ha``YmYrqM52ZK2"erFbH28YUpAe$JZ3(b@PAR,VVbEqP#(+HI5d 5'6RVYr01-bmSCDANkA8@SA8#E4&fCe&[9p&[1iZHR,eKEAccp-INf#p!*d3ZT&l U0Se['KJElKRHkRE2a'FZRi+L`X@qrkqmqFar2M!c5S4peADR12qI,pb+#6%M-$5 kIQYP4eV9-0CY%c3NqJ@`cIr0pEb%ar-Ka"cYGYIrY$e1iTJGkSILS10lcd)FQE* J0"IL61Ckd8)F6+5iH#'16+X`@JYa--PLhd)F6#IB[a#RNHZP#h'DZ$jr)3kQAVa J)3kQDP6D(hrpRX2YRViLFF*YM@,c)fYVp'2GL+)k@V*bIS*ikS1U%4d+iD03YFk VIHEQK6`""%*GTD-%LqqZdVi"-V(r`[L*hY[64XUPX5fAK,&@CX6rqeKrQmmRJJ, f0EcdYm3FIS@PFVM3JCiQq`[dlZpEfMGXZ6d3,EhN`Ej$rTZApUeE*HR&11hi2I* h(iMirLq)iNr`RGpZ0rYlHkq!,l5dCZSpE%XdJqdqcTeKTiJC9e4hp*lCFfC[Y9& TpFE0Y(FaN[cIrIU"laDLNbIkcSXq$6jCV'hDApf@i`r&b(!RI+6[a)['Fr`*RAL HIHk8ci`M0ma'+bjFNhZmZ10"'hX,+brH-a50l1Q0j$[jiaeIaRI3['rN*9Ai$Tl h[DVM'm"hb,c[f4hIDRb(c[ZfGAaVm"dqlcZpQcRaVCrh(GahiSBY[Ef&9m[DG%d H*E5K%Df5I3S[0Me'A0"Eq0P0GrhEa4[f6)k(b#GmNFKlSU8E'S@IPlhaZ$c5-BZ Pc%c*IDkBilSjEh)HiNI4Q0R6QU[1Jdhm(Um)[A8a8iUb4&-Pd6pMZk-GY)UG@c! 4&&-H!m@clp!i+d`cV&kqRJ98M1M$R$AYXBBQ2@)bCE!pP'V+*5BDKUUjMF3eDc' *p%NLNR@BC-+N1A&f`-i3!p-K"pS2%c%(cED2CTSSI8aT[M5(#lSIfj!!T*B`,C1 qKfdSi54RV"lHBECKiQTpH#YVQZI`NAE#P%[@T-J4l8D6UCfX+C[25!CU60GN6DJ pTP%I8$a-#4eC$AkBQMQ+a9ANh9AU`6KfYRdNp9#PLCLMUkpB6i`U6BXm,QN2NDF U6C-F-jR-+YlVXBeY(c9',UXqL@hFYQ1'&!r['kq09m5'r$A-d2dPCB8T[6SC0k! *SmIAU`P63!1D@$SaEDR-!UU25F@c(lS0fkZ`SAm*ITLJL4iPf$l+45IM"[3qp"U K90(EV*0aUc@eG[UP&CD*-Bj3r68@cpj,69C,PQk+PRd6JDjDpGdFm+$k9QcSiF% l-*Pi4X#$DNf[P-Qi`)-Dp9R2#RK3ScI2$RK3SiQKF`)He'K+kGb!"c9khiQK4QX d0A0HU2XDeH,mJ!FeQRLm`(lSaeJBm##SIV&&!3q#J[I&!3q#QX5k*'"!8*0$PpT f1lCPiDh"Zl!Y$hJ3e168&3%2JSpLNc[U,k5aFbX$(S3dJAG9`)13!+E%VJji%*, F+"[C!!p#HPpE`!0ckUG8!I!JT-R0k`)HK$5TYchJ3DeUFAh!JeTKiBD!"l@DHYX 4m+#@r*L6FD8(XPD64Z%V09C,Uidj'4HGJpJL&a+L%)jD68A&"&VdFU1[(400TEH p6Zp$MFZEkr3Hc)14bF9e`RP-aT84J(@DF!UF%Fb[dd4U6-D9lTbk6h%rpFLmTZX dH9U`0!#1$a!h1%eE'BPY2,E6YAq8f$#*q0RLG@)$,TkK(Ar%KUQXc`PUm3"0A0k Z*D,%"L(i61dI*EE2B3-(N!$k'b$F29XVk3JG!0Fi4rY(L3h[1jI3-T9lS+EalLL Hp&'D4JGU'Zajf%6F'LKFhfNED[&mfciLrL+6[d%aJ)XAB[Xi&!2prXr&*VJf5(e [cl-0GEA,0XLhZfh$p1JpYS'Al,80ll[)0NcQ[MMB"U[[k4,Ed+Hh,lalX+BNllF 0Z(JT0UQ$`CSHqrcL1@qQ6fL`TLq,K,$MkpJ`eIJbG[346"SXh,hm`VP"m(')T1- V0Xb0b)Eqb#XhcBh,"Ylf`XQjLf6$"1'V,TRl0GN`fIE!CA1aE1!S9emqYddf6(5 @bELS[b&khl@"IjJ5iA@"I`c901lVYAD3!0J`2IH'5VX%$aLU@Va4Z`Z*$EMl)Ld b*$EJiSZ6LCLTa8-e[4LjPASHUUR-0`Aq-946LPmDq-F`MD0m@H!I`c3&qqE!2iB *Mh3blM#pla@"I`alPr$4iKr$rK$EA`6q-8`6U@m0r'2B2Qb[$2bMAVKi@q!IpH) cV`UFS&l6U&mGH%DpJ1`eJAr8#hG[YamQQYm4q%Hp*[MH'IK([DC(haAiah"0NIr ,`$Q'DcVf[l-0NjGI'pikA2MaZX!rKUXQlJlmBrKIBrZVN!$M%F*Ae#CXi'bBG!d ETQ`$Rf%$2rJEfe!(Q+J-'bBS!cGJq`SAF#Y3AFbm!)q$$I`5Nk9K3ff"8m#'LFc JmV$GaH@YYJ'R-CNFYLpc35f!-U1H!+L`J91L"Q($C'KJ)f`3p-"2B81q-+NEY[G bHCGY`%YJ0HJ)H$$U!MCJ!+EU`iB*fTK!$K[U%M`10Z6p2EDpRmZpYJ&AlJZf8H, ZppX'A%50`)CDefD886G`!8q($AN"$i80Z!iH""ZQl!1(j6Y@("5B#4['[Q,#-fc !@NbZKJeB#li-'r+%R-1'@1qc$I@%[-Nh@T)8p"2B`1Ge5qM4HYqrf!CG"IJ''r3 'l@8F,B`!VX+''S"1!KY`"G2MB31("RE*Gjb`(,Q&$Hq$EJ!EhJIH#K[b*rc%Y!' E`*GK3leK)MGXm-%EB32(&Dk#Eib`(02JB30(rkaYQ'`1VJFETQ#$im-'[)!f!K[ H$`i#'hMj&i0YV(3Tm&$BJ+qS(GL!VjL+$a[U',J('r"#q+&T3akrCK[i*5DPbcG 1@SQdTjSfm'T-VBF0@2K0fi#&i"'`SIl"Y@($1l@KBVaQc%$[JJepeX!df-!M`6G KJck'V3GJ!dm&4X%'V2QKEFM,Mi+Y3H3,038E0#hJ$fc3Y$"4(cCJ!'S%0Z!Vq!K X`"VN'6EN#"2&jCZJZY6HeJP`F&XeR!#(XbA%#HJ"pNcH#A!!Hil["2##h+SdJ9b 3!1GTQCXGk'B-ai1[T&U!6E#3!$4h"cEKIZ60')k(5jKE+X!Qf%6L*V"*2C!!q,* m%p%Sb*Xa6&5HG$1'LHJ8*+d20UNR8eH%lCABS+[!*Pb#a1YK`rYdPXp%kT0i&lj *q*-hBjM%jJ(Nc4JQU88003+Ei!TTp$&X-ShGh+B"0Z%jT"('X1&pZKR$*,e2ZjT 282l!1f#6UI-N[J#EL#!Nc33fi4mNI3-fQ5"2`Q6BK,q4Z#4X8XINc4K1!-Y)'#M IC1U(V2p04PFJkhq6TCHUrMFClNR@rbBcLGlF!!)f[%pLQMEK-#5mJNd`P+5"b$H &'LEeim-Q15,VIe2!FR)EbK4TX0S80%@B)ANfEALIEXB`4Hr6c4LQ+(qk'F08X)1 m'F08kX(F5!)fdAMSA0YNb`,5"KD`LGj'iS1`[3kEEVic&H`NEFB!'r+(c4MNQ`D QN!$d)YJN[b60&ME4aFJY!G238bQIDb5f1l$TCJc6i)hNc4LQ`8R)BlfRJhhNc4L Q8eIN88R6dGA-,5TJ%ej1hSaK1PbI["R$G(JXH61'kI!PmQB-dm&LFKYP)hK"hSb KNIb50f0S4(FNEmE3##mKEmE3L%C1hSbK%Ij%hSbK8CYFk'B-MA!B8f1AVdNeSI- JQm!#mQB-6H51["P$%rb-["P$%aX4N!!hBfL#Vj!!0f0SJNZ60f0SJZqCQf,!"Nk JQc%dJk(Nc4LDK4Qk'81chUHE-66$rmLE-63VIlSC3c2mMp`8h!bh)@r'd!,fN6G MD+('b*XaY!LRG61'&[JIH6-'@CA-+(JcKKEi(hNcKKCi%ANcKKR5h(8cKKQU!fh 0RX&lb*Xac%#$06IJJ!eeV*Xac)#lN[[jC`SEG$1'QH!QZH9c*[9*hSaK*V(),5m cK3fk'F0-j8NhBjJ*6bC[aM",'+QE-Fa5[HTQ$,2%8A3cKPPkNlDqcN*[-lIcJ!d BTTXac))RNcGMQ#d-d-dBCS2GGT[XE(#"["R$E1+50f1BM9j,hSaK0YbA["R$E$J cH61'1H*5ZKR$((%GhBaKMVLDEXB`Khb40f1B)rc@c4MQS-@3!$GMQ!-r0cF+N@q Z0JI4c4MQJ[YNr@mZQ%,HM'%ZEjBC#jC0Y#fcC`3fF#ES!,!"ri3EiMY4HB,q"TY `$&)2"@b#6HEf)V"*hNPk'Qc#TdND*QaiNh!%d`DHKkdIj*X(Eb6T!l!*ab"Ym`% EF%khHCmRl[YDfm#R*IqQ663ANKi1'l"6pErjiJ'Urmf(Ej!!pErj`MR9rqD,ckR q0ampMUcrc4FI9Ie[2YS"@IpE!)mPkhm,i$CNr@m"1%M@raB)1eAr@b!1VIVI![3 DX[kh8)e(U[mY&1pAr@qKX&2e[iA+NqTr#i@GU[mY40FMkhm,aB&8reZ)0N(@raE T6DVr,B)MNI@r4HS*8[e[%I9*e[m@#HG8reZ%CN6@raDM4j!!pEr&m&@brVGBr%r e[mALIkVr,4Dr8Ie[XA"1pEr&D%pNr@q*&[TAr@m*2*QXrbf"Gj(e[b9`!,,qY`4 F)1Yr5hJ$@IpE)Za8r@qTYQ94r@mTA*HXrbf9(U2khe*aApArPJSl9IpEUMbTrVG 8f+Rkhc)d%E02#MEKff6pEaQmMUcr,G1E92pETYbVrVH-qL(VIm[%496r@kBD9Ie [ZI"*pErPF'qbrVGF1+Vkhh+p6r@rjH,@U[mYTfl*qYpbBB$UIm[4aFMkh`Vd'V, qYd*m3[@r&H*5U[qY%'kTrVG#@mqSrVF#2#,VIbZS!E,qY`)0M+crYHTpU[qeLJ1 TrYFU[&(pVaAH50Er@Z%cC2f[&C`PkhqYe,R-N!#aE1"BU[qY&%DUrVG5fSRUIbZ &NDVrV93IR1Tr+m8&9IpE+Ga9r@qPkNre[eALEDVrVC*HTIVI+MJm@IpE*GkQqYm Um*fXrkd5ReEpEl9iUZTrUkNYZme[0E@VNiL-)6JEfh%eH-h@reC6RfcpE`hjB1Y rDq"5jJBhX!R[BHYrDq!pE2e[$Ab!VIqY!AIBqYmDmXM@rpV3ZGMkAaZe`YErfT3 EeIrDi-"QVapX`[IBqPmE[-AF(!Ff`@@frYF'"V(e[cEUKkhrVHA1e[r@SJqapEq ek!TXr@qYHJP9reY,EE(e[lA8+e[r@`X[BZYrDm&kY[kh&RaNkhpVU@HfrVH12,, e[h9SF'cpEahBBfkl!jYS)QcpEahD!9[r@`IRBqYrkq#(E2e[(CM+e[r@JHpXr@m GH-6@rpT9VkVrYH2$e[rDdEEBqPmlh*UYrl@$hfcpVad1c0ErfZ&iE2f[(4jLEZ8 $'pkUqYpkkTbYrkdRMfcpEchmQ+hrV8Fr-[XdB40YKDhrVBIcXr@rp@!Y@rpE$pG KkhrV`AUfrVFHA'2VIaZSFlEqYi%mX[@r$F)5eImfU,C8rpZ!*X(@rcE!+GRkh`E P@2@r$I!ZY[kh!Il!e[mk`%5frYG"hE,e[`lP@2@r$[J@@rrV31YKkhmGHU[UIae `DEEqeb(m82f[!jl$e[p`CHYrRF)YeImkU5ZfrYG*A,Eqe`NhBZYrRHJTE2f[%qf !VIpe`UACqPmR2)QYrhA#IpMkhdCY@U6khdE9XHTr'kNhY[kh8CLKqYp'G#@frVG 419EpEb1FM+hrEB6hX[@rMH)6U[pYdY)@U[pY8MfTrVG*h%,e[dh8!&[rfk3FUrk h#Af+VIpY3K0KkhqEi'GXr@m6R*1YrrRLI%FI$MY)q0P-JJbXR&rQ0[9KK-mPZ2X `j+ClH&!XaP2E,Z$c8pLf`%GJDVFIb'Hf0[M2e)0rhBD-BB$`bIfHdB(++QE#fj2 JjB1#lYm'#[ERrc,He@G"lI+If(6$hbAh[J*KI'%r[eZ0)FmMr43BH1RlirKc2ef @l(If16f@Y4X[E-c8U`20(fh6BhlKcNe-"j)*40Lr"a[pE"[C0&5Id3aYhpM22dj EF$Z!Mai6p#Cle(hfbb`38pa--aV'l1%a[k-G"9R,Yq(66E`LRdr!MNEqYhX-qhr -NR[ULbl[0ZXYR,VUJERFfrHD6rShj-ZpMEqpLEr1MBliqa0p2M2,[Fhk30M9BRc VXKarh1AHJ$pq2-ZpFE4X8k2Z+HMGApAB@(N4J,(,D*%rDAMVC)mRXA[IPTRkj-4 %*8ZEclHfQqrBqk*@hEQP9%kbjf0JD4&Xf0J`QYCh2$Y9HN#*VbAfNLAGhrU"cD@ 4k@BMBmkePhRc(6Y66jMrr6Zf6'cf*J'rrc!ZhfHJ%Xp[6rp[h`"BT[N1F*a54D0 JHpjL[Q2A#f9fq2-23*L,@pRK+MY5VrKD+PS'mqRk-0paHIT-FmL4Gk"HV9dqC4m c$cl(KP8pr3!b,jdX2J"0+AK(jpLSph()Il*UQL*`IM(4c[+Sph6idcZf$AS2L+I cZZR#MGlrSP$4QlHmP)r0Sie&!$3Yj-0RJ+'FlG8EZVq9l,+f4mZrlDJpKfMp6%F 3EeA[i1QRrf3G9HXGMGjcimr[+#AN9qrS!I)Rhp(,#)km3hBeq(2Y@icbkAS0-mU pP4GHd[X1-$Ml(FA+rp8lr!!BTIQ1XKUcK@Ah$YIC*IQZM[r[%qQa*)mFqS$hrJ& -qC,YYCGic1EKG5raSAk0[rmGq&SSNMrQe4ED@l`e9!ir$[%mmaelQrp(pX++a*q +eZ6PTT*J,V#H$9+lq)55i-r"F2d99&Ar!)ELVm!)qMm,U6DA"aF[dE`NYGfCrkh QPAq(Ei$Qj61!`'GPL`$d0[JdD&@j+RY+UkUmih'YU[+1al@U[RFFdDTkhq'rS&9 ejq0h@PAh1hkR99AHi6qK9C9L5$TE@pkfc[Y1(4arLFFJ4PM9kDi4h`r0+iH-6fP H"B6e8p#mqZ[9I)H[K1De,DhrdPQPfEAR2+XNM2c2AYp08eFFb,Xm*4[M0i`bpiU R''AP(BmcbXSl(QH8IHmi`LKlhh&ZXJK!ipP[''9h2X+-XSF(2[Q1TqXMr)ipQ6I [qP0p2-'8Zr2a1kCFHBGr!&1Zi+)3Kj,bCEeMa`YF'BrBd6*ek)ja`HM)bmTK$KN [S$fYpahp2!CIbq(@a[jmQ1r`$f#Qf3%4rjD2-X2pCAhXQI*'QRpiad$'J06N3f- 'd@mm8#0NG%dk(lJ2Fi-`,-iFGJpFm)d$"KXAj"S+Z,")-h5XbkkidXpF)ERiZq' #a50GA0LCe*-X"4E-LhmE,J``,S5CJMmE6dMM3Ze"A!Jc"ImfE("`S3jPN[T$)ql @'6Tk,Qi[jNBB($d5LVAJ`YE4rQKRNZeSP5EDFEdDCe8DV-l1iZ`Uq6B-,TD'&3i ZN!#f8+hdlIZHIPJ48`M4rLQiN!"25`(ib[@UQ0q6QhEkSRp90hr$'lJ60PRfhH% (96Gr18bFpMIjr'-e-Zd9m'NT!$mkMFaIEUpIR386f-P&jmm%VZ1Lda`$(q#LUa% 'lZ5L8pB#Rq'beVC(Z+bcl60FfQhl"KHG%42i!4HG@eYp&"HGTPPp!TG1fqC`N5h q64[ZQfc$E#%Gc9*p,CGRf[B',PYXHbHAVEBpb%@h5UqqMm[*YRf"bbQfIC[,0YY qbZA8B+YCbH9CYKh(j66ETR-jhEDjA*jY@bZA-fa$ATjM'bEDE,F0XqYdb&M0QlR SY*ZDhq+LI4XeEqHLXfYUhXY&jbR9I*!!Lil2VGR04HG3eAbHLdjiV[NU&jfE922 hA#k`l3GFG'j-cEpbH@k`"BrQSN1,JUrKSV2eJVr)4EG%#Cl*4DIA"-rRSR1LJUV RLfa$EDLH&05EG6C4F*D,MKm+[T@,6Y3,[T2,TEDpN3X`"lChF%&-f"lJSM`pq&N Z1N)`q$8Z9pL'fVh5YTpcH@'`K9#l$08AE#1j(,"Y%KH-BS)0HEh'0Q$IYEB"4kk c$A9l[@h)p3ffi6fk#NRSGlJJYl$GbHA&YQ(0%Y3eE1rQFT0Y$h0jU@dIjJ)FJqd a,MIEpPdZH"GXb#Y`f'rN1bTGk0N65JJ0k2TLCl'TV#`TF5C`IGP#R#IHijm8Cra rebff(ERjTh&NXlNaA+pG9#A1@+jA(i'lf%BI8Ze9eiTmH)E191RjqZ,XZ+#illT 5S9$YFj`9dHl,9ahBE-rmlSR[MABRPhf)mTAh014ac,heG!RPEcd`TaJ(05I-L(M ($krT["[CMb@bBFQqqmlJ2AGV%bNU&-Yj(26XX6[hm0kH21+p1`l%D#"IHd-qR$K KIhS`fVhp$I2e*,kPZX$lcZX,lk(ER1p`ZXfhiFh@qfl4qqchl*FL'[Ce[U-PT$f 0l,eVr1If0+TEY'j2)hGr*hqj2Bd',X+rTp(4jmjm1k2R!@9i9kYpL*8H[&8V"BP I(-M'I%&MDX42Ge1c2cU9be6mG0meqlZ,rGd'qRe9,(eTIqpNRl,JV[!qeimS0jD I[-reUp+H12UqU0q2LGFdh@`GmVZ+[0D-6VHh(AVIC2*(ZmUMVADdj&H93qa$*0r !$kXBpQC`ZUVhr"kfjZ!hL$9r!L2"ld6YVpN5r%,D9c-3r)CS*k!C`@qBpSkE&2a UAS90Kb`-Ni*8&rbHVAhB&YX2HkcG'[aHT4K,JPrpDLlVFcqq4rLq02J&Y@YE`h5 lTETd0ZKmJ"hYUU2TGNj1(,plIiE,eIMK$BjI8&fN3r&$[6TqSH18[ehYQP$+m4Z SRGqd2Plr6@aDjk2BUFfZMkpSCcI&T$VYhUEeFG-4f(6IZAUer@KpI%NlhHN1F[A DjdlVij2D[8hhN4[jN@jpM&40kQjbSp3HEp9(e6[e*Ye6,U6Gm642RpCqF,SAA$e l`0PjH[MhFE"hK-0ZHTURqiKKl`YATjhMV$`&MRXGYYXF$fr52,h[5pL!&I)GFhm h6pri($EX9iImJ30EH3UNfRR[0Dirj#N8kR[Mam#NKID$B$3`pk-[J6(fZ-Nkj8R MVD6VK-cAkV6lRXEl,M91jSYeiX`Dlaj88(*r@*fi[4@26qDYj!k@1Z'+aR[,Ur( 6RIeD`%[lI6pi0hkk[pqA458Y[mjqGJ`NeeQcGXQERIYel+9fbAAfd0RNGR1)0a& Q4kkci)fGqZYF#Gk3!(Hd1kLk@4$HmHQr`%phY$ZSH)0#[*[Qm00pl9U%%mF(2rT Er,3ZQlAhi)MJGc)lhj(VmS2(GZUemj6Ia8rVmS2DXI$#m1k(94qh"eSbAl[j@IR ZZ&[[qkF3ll([Gr,GH3DB6GTh8+kel'GSjrX-F*fdSb&+$(45mrdfpK8NlD)RekA `$$[I"rm4KrpL2q#FjMX),Y+IZrk`ik(QqchXjNIDV9#qVf[r25[I(Gm"1dLi",m )MREH`Pk#T,U@kh$9JHElr6IJJ(hii#HmK&EPIXBZeIIhJpm)H*[YGa$XSBH$hmK 2`,2Q"Vp1pNXNeB9F4l-IB&A)Kr&cm!"ka(@-[)i1IVIU6F,M%+m"2QDpim$qKpP INAJ,r#Db6k,pML[!AASdq%e@4kZqBap[*Zf2#&a"RB@QkF+*mG%Dl4pifh4m5-5 K0Hc9@"h`lil0e+Zp#9B6qc"@[bRiE@,(43kFL-k%(bXHh(%#f-4K%bXkmrEZ1ri 1VXK,M4rbE[XGYI!!&LF5[hPrdRh(0HJ,[-ce,6*4S*MlcEX,E1)9)9iVqbfUhra MMmF2Ze`KeH!*`kFEMr2[QMXkZ%j[C$G)eVk*m2Y2hEVj0ZYqm6("l`B8X[Ur#r' Z*3FXrLMIQq$a0D(qk'hXhmL5q53IDpM2F&c!!bUr$cr`9MaCq")Y$hi2dr,"V`a qEk9RSpVa,SAMX6JbU$hUZb(iGB"K$!Fam`6HUAArLfrK"lb#hlFk2)a1BlG$&Qq &(h"%qFUaa'4aEH!"kR"`m0X,&f(KZA`$`!pD&[cH,Ze"DXU-GcHACF'[AANDE6r N8Gma&@l"iV$bh8iHk@["lrA#$pfSUe'mqqcJpaCi-dXV`$XqfmhVBlb"YEmCr)" ,QYG9j*5Y6`3IkZCe"lZhXDG!0)U$2KMm0LTriS[[$R')8F&[,Pb+6cC2`ZA0`Hm &m"[@RT(beEkR`j[TMpM,NS@6m[d$qcbbhhdk23TmLZX'qGd`hATF2kJ6rYVk"$L 0IKmREPLIF2bDa-9YIF,a#`V2E(h#mDX92jPVIF+0Kch!&1Hq!eDa1$[b!9h(`MR k&2S0Kj9#U8,mSIF'[KZi"6rS9q*h!+h3aVQ[h)AIY1$hQZ9GR(XAh*A"3(chLVX ScZf(ql)9jRm&"ffF1a2YJmm)IKpJIdNEjhC6HfbGbGbG8Yrp)hJf@fHU&Gp62(M ,ZILTcP5Rh'YG[[H6q#(rm%2(TB92A%!ABHeB+Gppm&l&19i+Rq1cJYp!p9!TcMd %jf6YrBPhJ*FUcV93Zk`p1qAl$$BEj`k5D`C,6Ci0R&+FZiGDBLZ1G9fFSar#8jN FQRl!-mhVKm3c&[JGf!G6mrTZY#'f,[+JGK"9R0Z1PXM@46l,($`Ejk",XA@ec`[ h&HFq"@GLkfThLAGC1-H[86eCZKVpTM"Hhld3,X,DXa-T!Yl8S6Y#0h&a$[c%aMR XZUNmmPC`)Sac%6rMAZ'BMA11AjhUbXBjamrFl60JR(2mQU9h@$JA[*(FXIZ'lP, G@MJA'Q028Fl(8JY@54dScJ9[NPD+(8R&Eapa&HH#leGU,6f*2[2Y$Xk&@U`5apD 62XmZS)Tc`8qc-bU(cPkkQPT4R!YY"B-il+G+[`*[9T`,A8@YXc[aQVr5`B2J(l1 I+AY[e@ET04BHK+i4jp!G9ZrL(BS(`Bq#UHap9ZqrTi02SE,`8[X1[J"Z+Fk&"Z! LE0hVIVhE`VRJAMJh@rGk3,a4hl%IMBDprqSA`6$&ZH#0D-rXA9Jr*RjPi9c`mh" epPkX$iJ[@AN0eF"QGY[!!m)ec@[MA[adApB(9'p@AN0RJ1RXh9QrTKe),C`,UEq 4`akYY"VqVcJA[!90K)-q4kp82LbF#ri6qj'bpEP(Y'qUKA2"liY2@lZfdV(`,F@ ji1G80lThkrh5e5`pU@S(0[B1VJq*leTjVES"6C'pMqXM!Jd,EkSq)CkUZlRHrkH G[&EYNYkJHlTq60U`kU2Ed9Bil1a+*dJhXI5R`'ZrMTrZlrS)H+2j#&c,$UlXA9i INBDUqEJAEX$Hkr94iEk9Mm!Q[8-Eq"i5$l6b%CK#-q$398)RL2GS2Vl$hUFFHM[ S"-h9Y2*4G41B`ZiGHI3lhIUi5c@N[8f2LMpV2ViS201a&SpT*eM0al2!-RD[f+1 U6kf2Ki86eN3@1P(iEq8MX"DGMd22%le1I%MVih6T6kDqmrm"!*!$)5%&3R9TE'3 !N"`*KJ%Y!#`"[3%l!*!'Be`!N!CLl!#3!iB!!!%1rj!%!q#edZ`PYMQR`J#3"36 A83#3"U-Err(rr!!!`d!!!#B%)#!$DA4V!*!F`J-*KJ'2!LX#"!++!*!$!3!!BZ` !!19@!*!$&J!!T2%!!!%1!*!$`32JY'!mbVBjTpB!N!8##--!N!C!C3"Trr`!!-0 !!!#YK3!0$QPdDdaTBR*KFRNZE@0`F!#3%+D$#BB!N!kNJ3!!j1B!!+5"!*!$J8e 08(*$9dP&!3#cFDkBYG,pd`#3"3))``#3"Mq&!!"e)`#3"XZp"[KUd#4@ANjUS,I b)cYZ&fZKckrcBS356KCq0,pIfDDAarAiHB6YM[$$XrANY*ATC&P2bSrb@rKLaL1 ,j"D22$qb5"B@fGBCfCfG6hDRYr$Pf'Ep3KDbF,+3!"hKYaLjK@cGRpQ!F"I0,K[ `AcMKaCIhNQ'&&iKkl1bk1[ljXHm)h@3KNdh'#lQ&,13@[T)&$haV!c[ZY21D86j eB*01Y0M*"m9[-GmFf#!APU9GEjIR0HKiCcDaYl2iG8+lIA"hl6SMb`NhP1ai`PH 2,1I$$IH9!`ihh($Al8ZiiBi[*cc*mRDGl3,'!XK#31DJL5`rZ$[cb)C(i%X15RM K'F%([!+2r,*BVeHL+&S54ERcSYcA(ijb6jd345II6FaMZCiFIm0[Flf8E)kEcA+ pQCpSeRFNaE3G'jIbkFhB4k2SLLp(dC6pjTL8"6m[1Mllrd2B$GK0f,GKhijp!2Y 'l*Z`Em'q%rXZl%pL(m5q"rYHl-2BpkN`Xr1arGJpf0hB3HcGf0GLQGGlX5r"$Q$ hBLr",XBZaDl%,X1HMGf(hBRGKAdPpXH`Em$q"2BLV-ekX!Tl$RBZGKEfFZ`1l&C X*jB1dpd&f)ABXc`3Nl&Vh21VX$q-[3al)rC+l*CX,JaBc+l'2Kql#MXEqb2Bef$ [`Ei$qeEXUl'hB&q1[4pl+rBql*Za"l'hB9q+[6hJ9A!LpQABEGMYf%ZaLl",X"G M9f#ABdr$cX'Zajk124rEJ9f(lF1HLPf,240l#[B-,1"f-[C1l!AB#l&Gf+RBEZ` dl-hB!pJAB&q)lF(1a0k%[3[lEZbVX+r(rMMf)Hb,X"Za9`Y5cHl([KKl$ICDl(6 XGGJNpRVXLGL6X$GN@"0%FpK$@,$RA1ajf"Q(J1S4V1&8caeKG*frqM&$*($r2lV RhcqlEpr(eH2F4e0Micj`('i#AS#IF!2`!M`%Vq!5i!Qm!0L!-i$4B#Ci#EEpp8F GI5VH,2J-jYfBG31q3LHUA#b-[p,a0pPr9GBeq!UGJTH%m9IlriZc6S1jiIpVXJk $ch3CI!lcA1pkpQIrcAUfc0r,m!YI&'6rS0Mi"DH0ak5-"eN@adqD%fHehVe2cY+ rT#UK)1UN0*Fa6GQ*pi&Q*iGN`@[(0PpG5'I@*h%TD8j-L)48UNjA%AkGSCHTmTL J2Sf$f628JM$ie"2Df5h$e!haGI&3*@keNPE[M@AaYpchr-*%IX2J9H*$(4S39j[ VH@TZiPm!YfFXD8iRqI(CreCEe[0YR*JBc@#JBhKdhCEL6,NN!HI+bFlXbl%ji1Z dD*N%(fBm('F()SC8CUGJTf+RBDH(QFp8'@&IqRmCq`l(Y)I"f4-fMBq,#DHKDIZ Q+b@2m2@H-Y&-L[9USea*5[Q!FG"P@9XB(9%V-lNkMTQXccD,LH)l(Aq'rdrarkR q2mhrTqr2RcKZ8p*U9k$+B2fIl2mcpQI5&@0a-6pDhYD-Qq91[CBPkImprMr6rfI jriRlUcKKa95aXP"&Yl1Fl2qRqVrVS[drhIp2mrmjrQq#`SBPAlblNLE9GMf*2hp 2Z`ZRq(r8TB6rHji6XTl$Aj1jH0!BS6j9F[-p6[(GE#((LhRl"LB,)bFADQR5V#9 TIQ5Z8DNh%kQ0IrRY6%,DrQ41fPiXfhH%c+EPMSkZ!%+(`U9$b5XHS(GQ1q2HqQ( &J48(T`(barprAZl@h(%p%Vc,A6l5iq-)"!)@Fd+TBNekHab"3!#$(1Z8`MUPX%S TV&%+kjR#QU8!#-)UTE#L+UaY#QZB`VUQX-STV0-+kkI#HUf`eLQXR`TVTm,5J," f+X#3!,"e)4!GB5e8@188eNq&G99K,90Bq44@,H@$f!pJE396@2N8eRVP3pLI`[j GV+hk#UZrmQ(X"l%I`[jpl)Ha2ihp'H`r`(i%ql2BIiLe98kj%rZ2XEBL,(GKIal l#pL2dR$@MGRQBH@@Y9e@@ePUL&CM@HGPa48L&Ud$XeE-HR'd3XbU-,XQV0'baXX D-)XfV2#biX[k,'ZpdDS[klc4#LSVYDc*XNl,+M(VXU`AXe,-@LfVb+`CXpE-'M' VcD`5Xkl,fM)VZk`ZXlE,+M2VbkcZXX,,ZM%VcD`1XdE-bM'VdUbefU`&c*TERfD GfQBZB0B#CXfY9E01E6-A-'X"XaB`D`'c&M"V!E-@-'X"XaB`D`'cjPCdEDi#jLV 3A2d6V-eH`,`&Zl'XaImLeQBbB"D$Hl%Iari5pM(X*l#2BrmCpTpMr`AfPl'Ia0V mZT9ReVKCHfD9Qj9XeTjCjf90Q09X9SGCdfCPQ$9Y9VfMpI&S(CVeD&E*@CZ1eXa CSfE9(%SGVCLcJXb+HA&9%q)1$ir@0&RGj)Y@JPQ-,+jZXR,*HM-ViY&D-LZ-V&D c+XeD%1[6V&1cem1UGADeQE9Q9U9CI@De'A,'@M1Vi+a&XcE1kM4VeDbfX`V1UMX VeUb#&eI!fB"#G'$eQM9Y9X&C(3H,r`hf#pKrLrdLpMH`6f(r(IC,f0r'rMVfYl$ r([XIX&r'IJ9Vkrhb#2BrBVq'r8rBVf0r&rXdp[H`[irp6H`hX2mCqeq`Ik!P-,1 'Y`VH+MLVi+b#Z3Sf+hLVi+f#Y`U@+PLYB,@#h3Vq+[LVi+q#[`Vq+[LVi+q#[`V q+TLZB,SbImVm+I1Rc*mbImUX+M1Uc+%bJmS-+M1Xc+`bXmS-+c1Tc+5b2UYJXS, 9#VBUf+aJYS,PbZ`V-kr-Q6*RbT`TFkE-Q6*M#RBVf+eJYi,G#RBVZ+rJ[),K#SB V'+l`!3A[&EaAH)##k3UQ+jLZB,U#j`UH+hLZi,R#643HSI!'CBk919EQ@-&#"51 4L46F82"%`4-&6a3m8AL)JLN+RLKiSZ#*`Nm86&!`4F%@"9F8A&&`4F%9"9F8A&& `4F%9"9F8AU2`'39h&6a@F&V"D3@R96Mp+HbRXCr"rN[XNm`l(1TAXCr&rL[Xjl" 2B(q&@,M9jrP[mbl-ZiKIr4VfAf-0G`,`+!!r![!R!*F#m#S!V`,`+VLII)B&!KB )@#$LBSC2!IJ8J%m"q"3)aq"'KPd"@"@!93&B&B"eJE!0[J4ZfB`*-bEL6)CK!4J @J'%"'"D!B3(i&B"I!IJ9J&r"%eM`dHC4`"X"Td5Fm8qaraAlhl"rK[dMiZ#AIi, plpK[BImFqiIBEa),(l9&2`(h"*`6F#lFjM2,NLLld-Br"&iLm"+"P`Lm4-4(rTM rKU-#MJSi+Z#SJ#F#cYJ6*8%12"%`5m!,!AF%R"&`4X!b!F-%M")`5X!S!D-%M"+ `5F!Q!CX%,"+`5-!L!IF%["2`8F"2!5m&,L4JVi#T!RB+H#[JVF#6"%`9-&R!AJ' A"9`@X%2!B3'("I`9m&I!A`&["E`9m&E!@`&["A`9m%R!,3&["(`5F%E!'@'1"+` 4Z+#!G`)'#Ca3i)3#&a6K)(2#l"P'LHE%q#'d5jKEYlTVA&(JLJ*A&-fKm8@",`T m869IaKN&cLM-Um!E"GiSm%D"0`UF86@,KS%#Ga5iSc$IURNe$LR`DB(V#PaAQ(@ "l`Tm9q$&!Jm@H+r!H`AH+r"QeE`BEJKm@F!1J3ZVjYi`3MAlaSX&ALaJTS!V)N` &q``r960Sf#VJVJK($(X&l"@`9m"E!@m9V"$iZ)#l)U`eA&,KLH'X#'Gj*L#ZiH[ f[UVYkpVLlmjD15h(PI+0bGTQ2&e0DYpEjElkkPBUiRa(h2bIGhE#qUp)QY9b,8k rAhlQUB,@N`,j4`'b6R3%4plGJb91UKKEpr9&HaQKqX*%C#1jSLj6r29(lAhL(fE 2b+S1faUqp4!Vp`&c"q+b*+NiPkm6[Qk[L25hYPHf9FU5pdUIXBmp#SpM'&!H[BM k9(l4)[8rFNEZ1!IfdAJT!HlV'Q6pb,ePm*,iQDdBhM)Bf,`e2"FKcckJd"f)@@i IplPhBH)3RLM*[cYcp1f*c"-MQq*@ZCLIiT'lDqYcqE(C5PSH'*TYTI9UrQh*$GI AQkA@XcNf&RR@ie"q)Nkh2jIJLTLQhj'I60+dA*Yq,XFfAL(T'iXEM4FbE*SY9dV X1Gh4M*p,X'cefr*kHQpl8RXKINZj*9!iX+h#UP3pbCjbEHDPm1K*[k&j@6LdDK9 GF+qUe%S)8pMlJ,Hqd1V0DmFSG#KdjkEmH#-Y9j&)DZ@"I!$-E@"-)hkNK5l"$id p'fX5bEl*I!#a`EL@9*l0-KLhLR(Pb"6i(+0MB-Jk1Y$%Y`HD*+f"*Ra`C1f,XDe *XIL0VHT,Jh"CFZ14+ELbA0ZN(VG5[',e*BH(J2K@I`Q2HZMrpf9BZkIFHVUVbeE 2(!9m-V6JR[!aX#I$#036h`*k`TX`(d@h-#&+-63a8A"YjYedM-"l1X%`UVN%9@J RX!AXK$GK24AGE&X0dSQF!(4bM-&j*N1Vl8dSMk,(KlB"ie&`'F46NBfjD!%ii5h i*R`8[%R3K1iSZY(4,'aEp(APGV6eV!V5K3a&N!!ZK&G!ZT!!S365KIJL5"I##b" GL5l1Hb9&HMSU`DhT+)(d8))X@K86T%#k%&J%k8*i!D5VdFffC8#k%$N%dS8F&C! !VQ9SYEd!dTASmD(0Jh3Pf)0d0E)a&d@3!#k%&d'k%&i'k8+#!NKASKXG,B"d"X+ (3EU3!+(&T)G"ZT!!BB4*9d'k%0jNdR@3!+kN'+)`&C!!,Nl(#*1ZJA3a3C9*9d' k%0jNdP@3!+k'PjKd!k3,1FDBp$")&c-dQ(3GT#XT'N0EBp)9N!!Z4pHCG"@N#q' M6,S#dTAS4NHE),eYF1SS5*1K"G+%Mi%d'8C!Q[J@5"2H"1NSZMA[8BUKkBL#@p- a!Y,T"-0Sj4*83CV!&NJ6hJ6T9(5cE6@3!#Cb!U6*-3E5Q3bYYMG"1SSH(pS'5%I "CC!!6N8fjU)&dS5h3*V`8C!!*N%6T+2S4NHE),ePC-f9kaD9kA5H&Q#RNic"GMV 2#(LRXl3J2*fN#H6j(#eNb#FDQUCmL[C-M3"m-Fd`hQA59-%q(Gk#r(55#B41CaV $k9+HG[HDQ*h2FA3q'rLG6e&'m8,mq2bf%$fGT)AVBC,$DP8k6aYG$bYAk6b(dA9 Fa8SRQ8$ACa5YI+,@p)kT@jQC1SbZED8VNkD*VZ1U9cV*-A3p,&@9mV5l0i'ZciK Aq86MmcQ#VQ0b9Ll(',U@T+e`[Y+,(,ZI`G9bKKbLPX1,@&V1N!"(dA*m$Mr,i9R NV%ARCV+@`NpM,6LDXmTdj"'bRL#&,T8%)5U@!h0i@!i[)f%j4a%$'aPDrFRLALe kI,Sb@&F,"Z@')aYcPd1fFRJ,db*D1B&Xk6`YI%XR'81jG*i4V%YRD5&H1NN6pr) j@[1C6c3dTIN8YBR-c03)(KE6$+01*Nd9'p2K,B4-*jR!bA5Q-E3Xj@PhViQFq4a (jl1"S[N8C5`Ya)r2E`YAddRDk&V9BqTjfZKDe@2UH3kMDdQ2U5HC30FK2@BN8@Y kLhT-BkB1SfY&MfQNDD*V5BqT*cQ'VP8pCMa2ZhX6k$UNai`N'Tr2%A3YkM'Y('2 S1Ul((-E9F83pM+86+$U1Rf2)q3aQMU,P'%kf%E+0M3e8(-I$)dKi'!-2SpmBlMf $H+0Bed5j-A`E4lCa6+XZXC8cY$#YZX4@cM##DD8PYR*i%p1'PYKU+BDQVVM%9TQ 1%8bV,,&9%P3aVE6%9JkI`,6UYPNM3kXr68`EfMDVT@K-9`h6LYYQ3p&e6#YYQc@ %[*YEpGT41@9E*3%P4e0NY`P(FdcS1p&QB6fqX#0A6j2GP"[*-DjBCEIQ'Q,0q!3 j`MSf3F@PkG%F%rdBQD$++R!pcF3%&GD#4e)d9I,Ql)cLcKMLM'00%fADq$+',+1 B-SBQBcJbLL"Mf$'1'NfmD#2&'%D-SN-4&a`lhEpYGKVqQmP6BYhe2$RZA8p5C1$ e2(NHAXq5Bq2e*&P12T)Maae(%[PT'NR4RUNm9ap,Nf,%M63KEkq(jpKl28N@[%C c6,3f!V*kI&NXU'FU5JEMHGTMNT824R)F"B+-P$#5!N&K0(jmQR,L3Me*6Q+S*bR 3L(UD,*NBb6(HqpacE-c8-m5LRLG(,1T*LX5LRLG2,1TCFX5LRL4,,%Cbj2"N**' IUC%8lCR+%iZa0#R%E+3*L88p2%FXkNQba')dad4V)f*4Mbm6LhUQ)V%Bcp-HNbb a'-Pa&!Jba')N"F4L0(jmQR,%STiN4bcU53V%STiQ5ba'FSch[UKBE1-CmapG9#b UH8U+469*9E'SjLNV&Y8X*F@LQU5S@04cP)KU29''V096Y'HUV&Jddq5Sq&#DY'* 4$5mT&Y8N4F@LN@1LY9R&SKTI8bbUQDU+45Y2Hdb+LN8pae%J+#J@p454BY')(jq QNQ*469*5,+T*+ST&08e4XDMR'1pp8E%i3LcUH8U+a4&L8Fp69LcDa++HT+KB(#8 @)iNbC'f#@$4QUUaB2%-X'QR5LN@E@056&"@,0V%B6H)9Lf2%STkTUPJF)4D02!A &iLLa'%Nd$J4Ca@+#@,4bj"@,0V'S*kNS&K2%BL6(H1qca-)@`XBT46P$MNb8`iX dST`K6b$+m6RU8!l2NSCDG!iPDLRmM05#@p14*`Ie"#QmUb3)#8%j-%F&bZ&C%M! Fh@aE"2cPb$,NPh-8`Ek4SGAf,-$ASXH(0J2UY@$JI$Lb-4Fj##q(jm#l(&k!lA+ #,'$ASKXG2E+[i+Ck6ebERSfRNb1N,jHP@SZ,Z6&TjJ0m0r*XQjSiUY&5ljCkmCA ZdH'YFm8%c$YB%jdBS9(9pP6cj0Y6(iGLHqSXDDJpp8f)lCAk0USi[)"!h&#bZQ, al@50bKVSBH"e)+k9K%00E(#C`T!!pMS,Br2YIY9Dd-K8D8&pFVmp"H&jTAe6cB4 V4G[JH0PXMB+DNc+B0#Y(mDG8m#MFC3XHQ[Kd`ABAKcq8p+k$4@B$Lq`q'j[MpGR !)U22aZDjI$Bbaq+cJDAQ$J9lS-r'CSPr-5l((S["*63S*[!dV"J@FB6F"189J(* SLJ6R3N2@R`dT-qpXG*B[&q-D[4l#rf+#5UmMqPb+UI3r4jQcJ6Qb61$Pf`NY3e% B9J@L-,)%3f&B&B6#b$)%KA%P!!V$KZ#R%*S"Rc#b#$hTU0)`TN1(4M%GRKR%G&" fj2bNP!%R'jL$'aqB"TX`S!BeB@`4D0*4`jeYJ%`k[06C,-"N)NUp,S&,'&D!PY5 &Z5@LNiNX!d`QZ)!aQFJbc'5#LdL6#5f!65DbJMI9k"6NC),cU&-),)aR)ESbSB8 -U5%Ya+@R-MY044!Ua@C`+"XE39%QTST'QI!m)"8#QddIKU9#KQV6dq"8$+T13J' L-T&P!R6(l(rb(k+'k!q"CIC$e"$j)E$#I3JV8aqLDX`R&jNP2J5@H%m89#B(8@5 0'd64@@S3aH4iJ*Z1#Z9*aq8CMi[,%"lm`hb(d",GLB*U$@f5R5Lkf0!Fe8N&&$Y F*MT%P4!NJTD#dT`0c@V-aEL5IPP--#S@C26TBPLCZ98k&!B@qj11'ZT11Vc&-3Z G53H9jUcD&Z*+ABQ#DNf*STY38'a*&"0e*0lZUj`2&+`Y0eXLI1%aE+[#mDS'Fhf &DU2H629`8$!fXIQ!He0FUG4j+fK(8QP%Bj[cJ5fj4&F#CQj$"kqaM!#'NNpGZ)- Q',$6I+lddK%QjBX[XZh"R@U"GrS@i!hT6l"PD(aYZ`mZ,Yd@h&%6c1HDF(Qj8VP "E6l8@ccJ[,h9,%EC4DBha-@%0YM,3RH)&0LYTR[Qf5j&4#'EHaHmmeCer&$(IPd ,jNY`klRAR2H@FYrUd[RYP,iQ#ml8P%TepB&89&H1,*hL%!ad6Y5+qQjKVZq&@5a -4E&4ZHS[,iaIZ8Ae&b+LIQIQ2$YZf4B%!mmI1&!rI+#@X)`CkEM5SeJf$E@heqT [XY85PQY,aa859QSSCbp(K*0E#YNH9a2a5b1CYekA0%'Q)$c9GA[5D0BPm4cN#Ih `DDpX5"T),VbSr'd-53HPCci9-rcd6AeCTEjiAYme+5qT"B104U9FM%@A!Aprmh[ qM[L0'bF,qpfV&M!mkh8JEXqGh6T`%+(6)4QBpL2(lY$"fX!#p1G$)b+`bSJGr3r I2LfcJe5eHCJ-DmVS288",kIEP9CJmqFfC-@jS[*@N!#qLZZNUI@fr1*iF4ZlXR@ GHqUNZ%@Gf4L1YU)cqh&TTDUdc9`54(*bChQ0+EfZ"#%dEc"36QHB,UmZCC@QB!$ RJNDM'1KBj[+hrNCaHl53!,Hr+Ir9FE1i28P[D#4J#rlVULA"$+k$QDVMRAHQj3S Z8fmc*9ch0&[F-MSD'"-)iZ-F'PJr$Y66HNGmFRIN44MAIdp%dclBlU,&,P!jG*& !miG*L9c4fjrGTfGYb6AM3,'aS#ic$&C(0!dZe&H",kcKLTQRQa"&d)CE$REKP[N Qh0,Z!32R2ERCFpkS6EG)fq*Hb(#@m&SGjSad,d[Rieab'T[Y+X9N1KQk`q,#VSB &Z5TX8U)b9Lh-NI1Zk,dSj+@I2QhBke@(-UGEMc1AeqBJ9A#QDll!TI2M3&E[M#( ml1K46M@m9@FJfTHkK,#5Ke-1Ee[-`lQ(,eh-`dQ)YbrQi@c%3iYjZ'IdcBYjZ,[ hrX8mh1hlqNkHfQ@&PSIEIPqpM$cQ1qR3!BMF-4cPiIEIecR2l*IbF"r`[FicTrY 1RZKMV2m(h`6qa9RNfApCck1hj(1j8VrcE)KfAh[5r)'5l[YBr*PSGh)0"cVh8Np IPLGlCHSh(YUV((E3,KK[GAccTREGK906EB$kPMcki!A8mqK-,PUDbr9-C(Q!2I9 CNG3lfNIUh6qISipqh4EkNFQ6LVHEN!!rY[hbK6Qff,'jS,iEG"-eCIfFqjeUYkZ 0QX2khUlkSRVFmC@Tf0bAS,RFkZ`QLi1M13bDNc06VH(Dk)I*FR)ik$Am1"ZD%kT 6Q5`"P-'9`Ch5h&bG+i0MT4mKbkN(bZ!#DbkccTB"3h&PF!SeTd[RbZ$HiRH3!1@ -!f9`f$4(6DFcT@lC,%!PQFfHKTf-RD''d&Zc*f*lX%RX61`XhISkqcZUpl0IkRa 0Zq,h+YeprB-[FlbShGjG1T+HITIB`!qqjS@hcad(QVm2eqI4Xqr8eFTFN4e46Ui $6r5Fr5%K*eH$Gq!$"EP`fHCpVV#0+mEG8EEfFC9iGmrC[bU'cC'mb@Mj9h@C0aG Lfd5lMqZ`Sb2hZDll"2*a'LRJ0bPDrM"A"VZV`$RLP)p,[e%!q)LG5MlQM!ZGTdA ,(e22Z,ajqXrX@bk8j9,Q'6!2$NAP-QDl&$QKbiUTH9ES*GFJZdZjD6Yp"BAaFGh il#@22X"9cPbk(,bH@XR(aHANj1TPVZ)q*4bIbbAUMKhL!kXpYq'UBm25VMG`S6- A'MZ&J'Z@Z9Mm6!jDjU*P,K$[1iF[[)LEDmV"$kj)YVNl3`2+eFIZDR0'dR+kUmk ja0TbfAARFVdZTfBHckIIPS[VYGfejq6M'R6,p5(LZDlDc5qACG1RZD[l9p0VeIA Lmk*22UNijQrq[Re2d@29YHCFJfiiS,UUR+[3VH2+0FG"hp*G6qLbDbk@AY4cmDG "9SJ-ek*hF+ed3[M"eHK!"c9`26SqVPrRLR4mA"A10HRiZ!kFZF2(*HA,kBI068+ AT+qJ(dCY%VVUR-ZTlE,SK*!!R)[6E@i5ZLDCbp1YY`PG@QecbfAV#9e&c9AY9Rq (MS,PkRDEJ`l0)60L2HP3Aka1DZm3KR%e04$(&H4F5Bf2Um8pT(ESQR1ZH-I(THV d%arc!9EJimTXDX((jGNf5mjR9f'lkplaFH%e&fVMifTVcfFke5HZIXG(RlMq(4p piNTYI0%em2Lie$`m+6CB*VcK1RKmA0A1CGViZ*BGl-,(TH[J-clQQ1[KmA("0PI %iq2LE#k*amIef'!)m!k,jl*iI1!G&mEMXePc9k,MBlB0&jb2@H,kFhcdKAR("bG J[["a26TAU12MqRCLmB%"AQrZdZAXA+H1Mk[Lk6NqVS2R5R9mA2r1YHViZ!+FDpA aFENh9k[M!kX-+jh2VV0f9kcMicTZVPQ(YY"MGaLcqD$6p!HIBBklFKdI1!@A`FI -HeEIVIRKqR9mp0'IJ0ZY[2!GI&`2leGLZp9M,Q2("mk"JILiA"l-`3HZZ"ZGcFH PmZ6(alALL!Ail#*`Ge8m2Ui("p[aJApF,`m&JkN`ArMS+p3H(hheI$8TM)(Gi`- Vi@Ai`#bZRmF(,U!Zi'2fZ))H(he(B-"(c9a&MimH`br`)4$JamF9q&a,MirVlVQ D(KmAfi0Mq1cDE(HD0$ki*pI8ik2Ii$!q,L4h%SAjQ'1``ViHm8a%#Ac`1LG1Q)p q1i(&I25E#qcaJ99`0(aJPC0@c!G115A&I1!#&qMMB`l46[$4DkHKQ)rDQ'9mA,N 2AKhlSUZdJrql5Y[pqIpADBIerlqVY!mRZ$d40%0K)hN"#T9J'3jD"6ahp&am0e6 838,R-H[B$!XL384A1PBAA!,[hHP`@4$,8Hc*8ZEM526J1&`fTKb@(Kb2bf$DdIB 6VJmjJ0K*MJ-U*XqP+i!hZ3[IP1Zb0R1JH2$DT**!16L'2$L*G0Bc$Um26VB2fMS Me-U4mm%TK664`I*!hkbdhJ"19+0rBM*B!5C902qNHQe3qD"DXdXK$XLD`dDCeCf 3!1afmPak2213!"$mRP)kGKdj%S+J8j0dQ$iP"-QR659cbJHmR*kH-%B[%aae(T` jIH+`mP(IQ9T&-arpkjYP[Fl'#UR$b`XGSQPRedS*9+T$Y18FA@CV2ZEMh*k,RlJ 6(p!)A",hmrba)pqGMm2S[Ec3SIT-AZ$VP$6KjB918Iqj9aICmJZ@DIlQp9cm-$2 C+3LG(ber"2VHUIPH%2#Jmf2iN!!AU!0jCf(!JdiG9@rb!RM3*4PNFF#$,Y@m*1" "PfMddS!(AD*k&`Fmk&*pPi3ClISS[Q9KlVXdLmX$(R4*0PVK1%6IP3%2ZN@p9`8 mk*C8X$VJ3EISl*U!!GfLAf[YJb+X#l9fLm+X$hM3,IUj)H""Y`kcYrr-Ae,dH92 !Jk4NM-d"$j+LfPX#(L4&k@a9%Ma)UVjY!3q5NX*X#X#$T15[(3%2NU*l1`-Hp'J @G`8mk"%@lJjid#2TB%r!Jaj4@q3&Sdq1`K"V-pD$RZrN"@k(jTKqj!@6cASN#d# 060IYP5b(['#5A+rUBmDYjPl9JlaJmNq[F"jj`Bk[la90"'F-mhXPkd%M65EV&D@ pk[KXTRXPhaQ@GS$M*iJE2&rVdZDciqb$YqYK!2-Kjla!I-4mi1),YAaV2UMYLi) UI)*NUkZeh@mqC+)Akf%!mpRKrFJ,c0m*`YeVY5YUG!#ZFCdH"M!Ip9e2DT-f*dR 5f0pcpKdFkMp*P2S'I#CY64+ZhfJIXhL6IEmKrQ,b+43$A(`*[UHJ'(DdIM#$ch" Y-SI`"aAlQ+X$pL%9h'SI&2+JII#5fqbM[TIDKlajHr"0N@4ab$kNQ$Y#h90%fqq d$eam'6kEJbQLi#r[ZH3Gb"C6*''p)PUHr"8qT+'l@*ie6*SLh(hPQVe$i1085DL [@Vqh)"mbj)pYh$XZ(lcYe90lVj32+H!e@rHqA6lNJEZ[f4[,"dHjjpUpdr)KLh& ![mhI90AhZX!rS'h"Z`,rQ#C*m`hD"cBImYZ2FcUbmB"TQX@Id&+aqF$GHl9KE$j `mBh*C)cd-dd5%,feHCiQDHZq`$qQ5HTjFq!Idm%LNaFFrjJZ+I%YJAp-&ajjH@' kkRYEi"r6*31m2I#2kC*PhK(iah6*HJm%rM&G%X3l!rqB)9am9q!I-m4RhKdi`3a *HJm'RM&$32DH`$pQ#(IIkcKNiBF#rjMa1Ac[#raMKL5iR`cmBkDNq)F$jjJTLI% 4qj!!VpiIDTdTr2K!i"mc0412"[iambra)EX!cq!VXiN2cSCFL!qT%Rc'"criS(h -`BIXHj`ri!DqVr%(EJA94EU%aq'$Ab,2i@1fi"6iN!#ei2,iN!"-IYBqF"Tj&pp AqF-X3*QC*`!9(jb5'F5(p!JfiN1qJTrLSer)RIKqP6mIY3qm"+ZK)r"JjJ)I'-" U!MjN513fI-`P2!iIIIqiICrQcbrC"kim&Raca0drB4qib)cJBpEpdXNFb9(`G(c d"4k+$eb("q&M93%FYZpNF9!`%arbmj2fJE9)BrM!@[Jb2[T%cr'4ke2f-8rdcEj 6Y*1$IS)22Jqr`dGpRl82A39m`iIHi"HQ6K&'J+[iQ!&d%RcJ#K)m2MJdf'AIUF* bHSZ2qY!0m&%I["8Ir60qiRaJ%h`C(r2'1J3qBUJ4(acAZ!VIDF*b*(9mF(4N3Ac )`h!pI%L*F(ami!AD#$lUKi2JJjGr*IK1Pbi&$m8([M)lq-"A9J[`-FIJ(Ml``[L Kmp((VpX([d4ZYZm-D5A)X[MJe8Mrq-$#hlF2,)4(i'2qiGViU01i*GqCZQmH[3[ I22k!DIMJNI"0I1KMV)lJJkH#8IM!QQrD4erq*2Mk4,kB+AaS@Z!22M3YeK,`J3( -#$l`&6k#$kbKcrMSdCm(heQD5lp!GaBF20)%ci,$44,R@HJ"d8EV@A!!mDlB@H# &L'rLXej)YQ"M8KAV-Akpk'c`963,q!`,KAe-jc2Z*ei[1KXZi9Cpm"NfLEJ*2TX (%9qfla`d#[&kd6RUNem[1JHG3U6eiE0jFVSL2T13!-8hj*m$Pa$aHRc8CqY&cQI c+G6&Gblai[@LFj'DaHY&jfS9M4R"ClJLNZ2aQD6Y9T,`'Fm4,HcLSckrAR5Zk[2 V4HHTIr!1I,Cf)q),q%`%%@NQq)arL230I#E$Lc!CRr%h%CI%Ch-XALmk$b`6BD" pjc-rB[h[I(3&XIjh[[45VrqG$rF8khrR)qHl05Tme'FjRFmiM!L[m"Q'LM33qbj JKN@V3ILX4f,pl`+`A2VX3i0e#jIQ!c1Xcmj(IAkpk!,9jpH,,P$rr(V4K9T&p1Y &&c)2EUd,RfNmmPElE&9&Y-D'cr3f%4r%p`&mk(,i$$Y&kdAik"rV4ICG"+D)p#* mePq4CS[2G$(aLZ"&k+QLp5*mYMSJALqk#0iSALqk#%iLALqD#rD*ei[Q-PILpD+ jk'TZ&3fImA,aHY&FZ,ji[@JZ2&DmAM3A[L4H,jS,&S[ALqD"&q,eSRRd9laH0!r G8EaH0!pH)Pi[QSG',Pi[QJGr%UmAcG-kR&m[QJH(F4UlII-e%hkpD$jB)&i[QNr [a1Y&mq&Ri[@LqDb9L0H,jX0Aa1Y&mq(5i[@LqI!pYfk($dlJeiX@J+(LpD)&`Jb rAV4!pIReSJA`2r&kd3,eckmA,B$rLGH,&X"Ya1Y&r@#IH,fSRaN6VaIe#kIpHP% rr%qmAQ42M33jVaIe`rr%kdApm#,aHY&#DHjq[@LKjX#[&bfN([&kd8)d@,G'L)m jpZY&#q'Zi[@L4F)'[ekd#0`8VaFYBMl&kd@,b#9He9JNE2$V4B[8*lpHY!LH,&i [@Lb-p1Y&Lc@[IVeSX6L+AbpDV*VmHY&Lp$DhiSJ2$22V4B[KbH,eSLA#!,pHY!6 XMYCKPi!,i[@L*H39VaFY3Dm9VaFYJIZ+eiZ@`*R&kd9,aDAmHY&5F4frAV48A-f [&bfPAq,eSUA#ElpHY"3Y4VaHY"4qlYBblEYBkjGq[HKLF&qXred-TSMALbkQCP[ N$RfQEEQG%Aa`*VpHG,(`ckmAAD)qqI@L5q!Bi[@L5m!QY`++crSZALqk"$iYALq k4$AjpD*,a22mHY%bH+0i[@JC(%1mAV4-11IALjD*qllI2[LdpGrj6(-4kH(i`%k [rbdA$r$khh,iKPMr@bkFmrVIF[%jVrmY4im6khr,a8HprVFFl8#Xrkf!aiVe[a9 `'l(qY`)F&1Yr+i5GA[pE)3lYpEm9k$9Lr@mPZS"ENF8(lrIkhdTKTpIr9UT2A[p E+HcdqYp+G$farVG5(-MVIb[4*X6khbV9j2@r9A!NXIkh5MY"A[pEaAb+pEp9`MQ [rke#-a,VIk[4)m6khfViUPMr@bhqjr@reH*rA[pE,AlMpEr9`MQ[rke'Ha,VIf[ 3-X6khaTiXPMr@`2[%ZYrDq!!B[e[$EJJe[r@8)0BreXMl26kheUY(([pEbeF9kc rVC8Hir@rYH+qA[pE+qcdqYpDpFRVIfZ&R9lr@iFQi[DNm"RI&ZYrkq"eB[e[R@V bqYmkpGlVIqZB(l(qYdjFa1Yrkc5MA[pE,hcbqYpkZ,GBreX[(2AkhhV9jr@rpH, @A[pEcpb+pEre`J#[rke(&a2VIa[3Dm6kh`Ea#DrrE4#Am[VI"Z'@ermfD(AFkhm E`#1arVH"'4$VIa[3`-6khdE9jr@rMH*!A[rE+,caqYp'H+0BrpX)Ra(VIa["@E( qYj%jYiFU3KmFbqYrQi54A[rE*1h%khqEK*&HrpZN26L[rfd5&r6khbEKVYIr0QR q[2kh@Ec0khqET9Gjr@mc(&kXrfd@Er2khfE`ADcrE4DIp[VI&[&8VrpYBEDL0Em Yc+jrcLBBKV1T!lH!efVpE`[cUGErYY)2YIkh&5lPeZ$a'Hp4khpEi6eUr@mVI%# Yrfd&Gp6kheEkU0ErYU&cUI@rEFb+@[rEKPkJe[qfJ5YZe`qIcBeDrp['h,[eHhb 'V@VpEa[BSGErN!"Pe2VIGR3kYIkh(Ba8khrE`A+erVFG$Ur@rlDVPelrf`j28qY rfm&,YIkhR6P6khrE`4HerVH$'9$VIcZdaZre[ahS8fVpEiIQcqYr1p!&e2VI$YA YpEmGUY[VIc[!8EAqY`0m9qYr1e5herpf-UYUr@mR29,VIc[4hG6khdid*VAqYe1 ckr@rR@J%D[e[*rLYe[pf`[h8qYp1cCRArhD#V@VpEbGBSpErGM&[D[e[&r@SpEp GQQq[rqf#PkMe[eeS*@VpEjGklr@rAI"HYIkh#bkPe[pf`8r8qYmZpGlVIdKUD[e [0r1Xe[pfddIh"!-qRP(`qYpZlAYkr@qhHZre[ph`HEAqYaYHUYErGX1ee2VIE[L !@[rE!hkTpEmpc+GDrpY$$@VpEipUpIVI(M"EVIrY3B03khplK*GHrpX$pe2VIh[ J4@VpEd$26hMpE`!m8ZYr!mb-@[mE3+G6khm$`M1[r`h!DG6kh`!DK&Vr'a#ZH2e [!+lSRUM!afajr@m[I%#Yrqd&%pAkhejQAUhrlDAAD[e[Vr$EkhpldE$8qYpHp!D erVFAc8+Yrqf&Kk[e[le`4EAqYaFHTGErpJP6[Ikh6jMUpEppkVhArrCT[VhqYim De2VI2M3epp`'2RVJpEppiK"HrpX(YeEVIr[%9lcqYdpci28r4NqYr`h#(p6khk" iPGIr"M8(A[mET'DerMH)jUA@r`E4HY6khk$QcqYrJm*eVrm0#PqprRHTHZre[d[ "qZL*Qd["2[Gd#$kEIlI[M)qk[IjhUE$0khqA`[[9qYqPD#KUrHp5p!@erKHEp#8 ARZlbAi*(Jf*IjS)Yjr6cdrrR5cdaaAT6ar$SZLh&QA**VmKH1FPE6*e52AKN+Aa X+D`kpI*5jXN%RVkb[h-kMrj94ME-JmjamQ)Hp)f$,cmfD(R3-ZjBc)21FHGLh@J J,e[-JclbmX8mD#Gh[I`BSRm"VIeSSN@KXcbXaraFEF12q9NXZXXMcY0ip-pLd@6 HY(3q[TN([HCYLre"bhQ(kckp+d!pUFF,arXB-j!!*`@amAQ2)@EVcrUbI6rk45r ,aETp!j1&NC1cer&[j6hkVA105VfCm2Y1$6Z6N!#f2jP,)U@2-81,jRIRKS)&l9M AckpNTErf3fqa1&m-`%0pF3#I)+S-@TZ1J4RT@5Z(aSG(9ZCA$Jp1$I*hX$!dj6f hZ*5[-eTb`S(E*bSIU`kj&l$M%cjCU,UM+`"D+I*YA)"15#pi&'r[q-E"XC(HN5h HfLYqEK(385Rl%rhrhjr9'XaT!lJ`$rIYf[102I[flI5$!M&YhirU"B%#,V`*A," Pc)5A@'2D[VH`-9E%KEIZf[00&TJlrD"&,0YRr,GdhNrXkTFqC1LZk-#"6c%URbQ rU`DL9+F"q4F[iYiqYRTMBGBlh'Y$EJlm'd4aFKplc!ILXYpVL@hj[VZ6I6K2I[I E&L1Qk[$Gc49GDhDSGdImM$$er-*%IQcce[!kNA50148R[ZD9Pb-)&'h8j&EKr10 [lZ[SfpHrY(r%lr&e4%Zh2Yjr+(j`DIrDNr4Q3r#Q(lK2mGN#b4m$-iHa"0p0DGS Bk1[E!9rSEmebk0c"DKph"9ir@daEI6Y+-hdApPlB9kSA@heaSqbAjH*&[NI2(h` X&jdcfApTp#R`+H38&hhKcJar*1EpM[-qdAr@PH-CrL62ZY3ale2-`Z2AcdA(V9Q C4Eba(5%EqR+[ZHUqiDK`AeqNf2-rfBj9BLF[a+BV54!lC5(f0HhB$Q+R,X4Hfil Y*(ED3ZbfGQ`AX6-ABZGf1QHa-aCLTr5IYAjcAerZ9(RRhj4P5Dk[Fm@*q5qJBKF akl+qh!pZ[2GE9kfrEfSmC$l[Ff3q'#eGAmrpX2cc6XmbRG3p4K!VM8$U`UY-C"c &BQDc(qN0bLNQIXGkPhTY+FmT*a(AQih%55ak6P1#Q$Jph6i3JiH2h!*`Z'm4%rG &Z'"r1`-ZZ--IlFmY!p@i1)$+E(pLhR!"DTV$K4Z6@Y)X!`[Z6i`E,N`pL![f*pB 0'$+i%1T1@9b)G515'9bBEPb)P)@B0PfKJJXc1VL3!#+3!$&Zf*!!`B@CmlJ3-FK i0m+3!-'&@IYa)3D1-'4`i85@SF6hKemqfp!Gmh&ZK#'clp39F1(bdB(SqU3jdq, 'l@YUTEKCQVrZ1la[25i0+c+ii&kFp6c5pV9[Lk%,-@k-)B-,8lZD[68G$h,KD[@ XkGUTdmFI$MG)a-YGUK#RF'h"rlh3)+ENFl!E2c-2F6(26RCbB,dp6R*j1V[YZjG M(#)qMQ&--r2`h@G)mppIRTr8VL9qpMZa$C8*MXQ+6XLb$`8p[Jd8SLrqjARA@,1 0Z$J!YH(iJ8&MD2,)Z)!R[@-%pNDX'G9pkl%HaHQbj,Lc,k-UpQaB8jqYP3BEhcl $dhfTV5NZh,#M`RLIKCHqVLaX(+l09Rc%F#cX&aqR,@5h1BiI%r3Qf5rlPcP4pB# B*R2+EFZC-r8GlbM)@[%+KkeQ2Rq*9rU,#EM4+2lfU,XiLPh2Q)-[GlcEiRGM2p` HK)kY6c6q)li[1qlYc&d0iX26mc,am84Ic-aaEiXrFQX@G'EVQJarXXHpJ6pa2-H pDE4mBlf@("l"a0MB4"H!CjI45+iBf6,9@cb5jl,CfY6NC,&CEVci0SfVilBM@[A !j[a%dR`a"dm!FQ(Mk0Qh*q6jqZ2C`jAZ'Yb8,e4em8@Y$$V[kVLaI1fVG9`fZ@R Se8PmFIH"5E`TVIl[hJ!Xdp8"aaQED!CfY"CAai($BhEdL`p!Q0YEcD06GQaHqIU ,1JEcZIP`GEbbr2abb,%kQ0I`b8plj,-1RkH(&chM!$T[Qb`a!%XTe$%`0VVQj6a fNSG(i1ElT3-6SfZl"04ajG"`Gi#qlPZc)IpbRS'*cDrdBh#dhJAJE9,k%62!8+l GIMM2TVK5UGGVqI9*j39%1m*d$2%fp`fY@[AG9f[$1ZDYkKC3aeK$rU+185$r6Kd 6M1"B(ADV`Gr1IXJSRj[A&+1mVALiNSNkB("4(516raGea!%`5PI(Z"Tc@A,MImh CS@6keANekA&-(RRQ!qrM!jMbSHf99hM-i-MD9rM3NEHDMp6"emq3!2a0Ab1K[Ep q*-m4RZIUX2Z%rSEXT45*(`bYiq9154K)QY22Lj!!2GdRP)4i$SBEVk#UaJF`P(J &4R$NDem+(rqKH9PVKc[rAFfV@8GXJ1B9-i$!ec5l!1`fa$4S9BdTqjj@eDlM@Df UAFHc@YAK1SjT940ea#pS9F2pq,j@09c(pl@UGKha%eV9@!jVjmC@p8L1UiE'Aq% aj%LT1X-c%[ZKH6@3!2&lQPF,BH-80+mMmqVUL*A3[+iXepjm8AjZp5AI84*Q,pb `-IcYflCM[Zp@5Lh(Ac(+4KAIBj6Y1TjPP1dkRQ@8KqXiaLJRkVJqk3+`H2CAM(+ i(bP'1FS$[e2(Fr14UZ0JXp3PB$lq*e-HlXIhQA+lM[J!TYc'45-1BmTA@-Iq`eb C)[Dh6"f'Fp`m@[LqFYK!aTYC6jZSi`L2iHXrZYTiT"qZM[J!CMTmkF[hqc(1F,m p(`HhlHJ#8-IrZ[)Pj[a,l*bcm#AiAYXi`!m51lX!#1Ka'&pie6aGjkVjm"VYZ"U SL'(jMSY8VTU2hm)&dGAIlAI5BNqrRHR-2!f+DaQ!@,PG@2FGIbDm+4)EUj&a,AQ -b`!FrcCSC-RfMF2CU6$C)2B&'1)S,K5,8cL3!#kfi45l5Xr6qik&ViFA)qh[V6h Y!qaUifTjcZ$[rBYjT[,hTBYjH'ElpX8mdrPlD$(2DIapmf+HdlrA4lXdFJjrApr *8a-m,-r*r(he-[+Blk4$%mC6f9'H8rMl1ZHCr9+H8rPlVr2-kEk6*i9j&ZrI""M $aKL,22X[khRdPR`Z9qThRJh4lQY2@Q#C(iXr%qe1V[Ni0-2UkF[bZ2XkrE(XhhK SVh)m(6$Hk[MQ6Hfk3F[m!28YHI6"#kMR89e-*lQHL5`2X+GQmp3lfNIUh6qISip qh4EkNFQ6LTI(SphE,eqBBiXGQ`[UZk%re#0hZYqTGV[DU$QXlqfU,kVR6MdFRiV 0I-HI1rHN(@FJh%m9AhF28AcGr96aGIH@aG(G6a@MI`p4r2kpCI(lpe-GIqkmRkZ dPh1Xr%P@m5lIV*9$im-M+r-VK`HR"[Nl@"LD@YPPC3,k(i*4"09@HNLKH2m$8A6 @1iNVN!#Ddcl,im[%hAS`6XlMciA%hA``lRA80mRe*Ikf%rFJHETGAcC1J&jeIGQ iK'i5mrAPi[k8I21VMGDKZ&rM*VQZd@SkIDLqhYqNaRXQ4PYTY13+pI$-%$H*1"1 3!'k(hbFqm)[i&S5ibCbbeP%)FCFmVKaKA2*@rR5%Z+Qk9fjKL*Yq"Ar1$A>q$ c$fj-PjVB'q*HF!DqeBklQcm2K,Kh+mHD%$H$rJ8EXMMpY,MHfK$AI40rqUTT5h1 C1AMZmAr3dlB(dSbSCZ+khXLIHiLMKQcFhq2201+BedcFZalNcraU@K&MbF40qS[ 1I2c8)rMmR-pj6fFq[[BZ!M`rkIeSCclZ@iE2AeNi3bYJIMjq4rI#[Faa2p+CMbr m%lkAKlMCRqM-afc0j#YF0dmPK214f+QDr'(8b5fG2RhahIMZGAe[k[6Tb9mKi)h 1Gd@R6iq4)j!!T49[D2HTir4c04Jq(cAj2RhUmrM!#[Y1fY2TdqrpL3$1p`mp*1a 64rP[m,h(FdbINQ'qppi&*Ued(1,KT#a12Jr'4%qEpkT22YmQ0T!!a0bppmFlqIk !'4GV"lh56hbqMk')LhF&HkAcK2Rd('S9Ec2e#PGm[TmqP6MUCC3-lk2kr[Mpa$d [a(e9XN)B0c"3)-l2fB,Ii-q5,'l2`mbZH-kHZ*MH$SCmjm$baA2@r8[Yq4Yi$AJ Mi!RIdjUE&D'1,riTFIFlMRb63lllpK,h&[F*R$Jla-QALI0cZ3"F$%i0FFpl,h& q,Mpr@RYH"hlNIF6jZIcm4i4KBGe2DMlH'fM*FYdD'2Clc`1UljG$[LrrFl[I!aH !fI+TN!#[jjj1[em)VXXI'6q3!"Cm[rr4)(&2KRaVi4P4[jrq4`+-IlNiF-lhZaY FP$rfr1hSp2[Mpa-(EY[hZlHhqlhRDf#(#*H)5q2S`)IrMMMQf[l1e"ciIRrk&`M iGFFC,j'6XVMJRCV[2`aaXflTa$d0pXL6)@lflm'c,Jja!rp'!(0KIdpjM,L`(m% 2`32N+FmaI6dPa$fJQSc(NDm22KE@FIHq*rqD!+Z&Z(-Q1h@m#Yb9Ei5imlAGl1Z iJjVPQmB9jLaCC5-VcdHlIPGBIL!q*1M*5Sjrl!cipp!QjM@k+R(q'(%[#((lISf iN!!6bB8IDq2"3fH#64UZrT-,GhAUq!KF8F1YN!$b9RKB9%F22%$&L5aZfHphkRJ Y@T-ZphbEC0M4Nm8YZaGX8XjL*0r'RfM(,6q0ZaC9G`0#M@dqJP1UpDIjGlG``Z2 kcr`1qH!ba$hDRKZp#[e1,AXm69p2A4rLIJ@1SZ,epMe&h9eKr[3HVNh@md-rYPl 0fC%K(ZLrd#0pNh(1q*)Fihc'06@SX&+%9hBkhhAVa0h$I"HGcRchKEKAJ'9UrYe pEa[2p(CiYTTrGfYq3akQ-ea+U1EIhA#&L0rm("LKf5f#&JGrR4,LRRLBZ-AQZpq L+9dKlN9S&(U4mk%CV!Yml[5I)QkTqmVmq$Uq"Gr9Yi5icr`FGA`Kj$YV+h('GrK k2X#IDd2FkLm4je@jAXeYf0G%VrUah2@a2HRlqJ4BTUZGMrqqVlr&hSLD,ekJZIp NL(XDV8A0&cr"h-[VV9YB,p9k`hc9rq'3!1qKVa$RpBC*QX13!$IVc9mJcZX0Rf@ qeAAI"bETMi@iGe*Vm-9UkfRpB**iHk42`'RmpeEbTI5*60b&iY142T'*5fUZ)Rd L%pHVPe$Q@*r)aM%h%Ame6089lSI0SXHja*ZjHe02$$Kd%rcQj2k3!1mMdT`XPVM AhY('ZF3%Q+&DEE#i$a!AiG`[#'r3CqcldNqfF5ja&Pa"AaIbh3Xrp$LAZ!hX8'P "p[dfqSA(ZF5jF$Q&DlXq`6pphC1&Sr!bjJ1Yb1X0"q',#NkkZ,-kH2#,D"qU2-5 "Qb%q*GB+[q'YpRd&()p`lR1D$flLC16j%q+FhLfFi!C1kJ![I"f,ITXiY"T+J)0 kR,X8VUkq8V*IZ"$LR(i*cUc5a-#E,hA`qmqq5K`hLP+IFFUSVqrLA81e$MIrL8j I(fC@e#rI22+e0XiPhX!jPDVqfrFl0$$#ZAZ%CfH(Z-p*E`Ta,Y%M(R#1q6TmhZY $bm4ld-HXK1QD19rh9k3TRQGF!GYkd4h466)iGk(fJ#+F#lQCUq0pi%3+jp*a`Bq +"dBiPiQl5(`[`VP-A,GdX3lMA#DZ9hT0L(2*Ii96UA3NkN1[#R%ZZIZRLI[Kd)r (rU#0FmPI&Pm"$bhZI[LralRN4M32PIjQFEm*ArFier-kHUl5PqclqXeYR%[Hcq` TI*!!I!m`dalRNMrrGH*H&1,@JS8Hjj+hS4NT2-,ekDNf(L4[3Bp4,pheLiq'H*! !["c03Vd*mU"iG6LAbDm`#qTpM!H&eb%q*AI"q66XHmKTD(XHjj)AJ5RUID3(K8F KcLAhD,lp8a32UZqqMXqJD@RBlj)cUG[MA-m+m4lrLXVMkPH)FmQGD*hU2DA(rl$ 6eje`5c82Irc21RepYrL"edFI4lZ+qVS1r8Q$2LV(5MX-F5kj'Ie$JdiKYk'EH*a ,lND,dE!(+kIrHK[RNYqLefTGrJRK6BKcbIHL5@MB3*%RKE@qlK[8Th$[5mkJ0ej 25V`2l&GiMH2(rl6Geik9F'AeRX$lIk[$Uaj'be$[)he5HPYBAq*5p()0kdGblXr b,p5I1PE3D`hEYA,l#I`,pDH10k)GU[AJ,dXAmrhi+V1S33q@ip#+SRkFLYDT33q @-p4Ihimr%[jj2IL6dTA#IR6`0'E3%eD4jA,0Mqr(r4mNcMJqF@ZdUKAf)r(hF'# 9,NTpk*@q(jm3rPQ0VKqQ#8@mlB[-K,iMa*h*l2TqG&`$pe2Tr239AF(2ae25Em+ l@1Ap`M1[(hp@[)Tj)Hl[G1EM!M3$"BH$k2m"!*!$)5%&3R9TE'3!N"`*KJ%Y!#` "[3%l!*!'T2%!N!DNJ3#3!iB!!!%1rj!%!q#edZ`PYMQR`J#3"3EJ&!#3"Z2`rr( rr!!!`d!!!"b[)#!$F'ph!*!FkJ-*KJ'S!--#1!%L!*!$!3!!T)%!!5'6!*!$&J! !jFB!!!%1!$B!332JY&mZ),BjTmd!N!8"q3-!N!BlcIrarr`!!-0!!!"&(J!0"A" [GbkjBR*KFRNZE@0`F!#3%$@I#BB!N!lP9J!")5-!!19@!*!$!8e08(*$9dP&!3# [H$2pYMQF2`#3"3(j!`#3"MVY!!$HP!#3"MV+"RLDL`1fm)@rqj)XK0[bh*8F,d) VeUf9@m)@&L@mC,CfG5Z,fVQC9l5&,jaX&TjkERTiH[KmJ[rBEhEN0YQ%,dGZ%pj jC'&&E[&kMp`LqAd0b#mmmX[a1VkB(5qbN!"0&XRbj(CN)3YC"Q3Kab1ljm[a44I M%Aip@FMYLf'&9fTIhX,GCh'bU*elAFJ[j(D5@mK#ET1&h$l#b@iPK`HQ0QKJhm! '2HZ8HcEe1kYcBI[0Lq9QH4hPATlm,,D[i`[EIRjkHCYpPiYN$q$[39l(1mY*ell 13Hr"IAQpR42Sb)1DfAQGRl1m2,J2kQAjCLICf9"J,)#!mCIA*!HG9djkXi9IK"r F4b#"j"BIXYX!I!()J$r2leY*%RQH0qaj3pZpSFIqd"[kTbFmlj)Yq0`qY'Q)hr# X6pV"[*pPBC*9QPQb(,5+RUm[jFJMRVH*rl9rkAPlc+kRk8IZ(,jlp(%XcGc6ZHI )fB,LSl89[%b4p*jQ-@C`cq4Zjjl&2CZEQMZ9Zi@lGGeq'[ITh(1jcq!qNrXXlV1 j(m$p31i(FFqc@22eH,hlZDmXhbfPlp"j&IFl5FY2ZR3iq`A1&0aBCLV`aLar`Ah kfH80m6DpXrKJElr,43PqY-aLj4fKrd20r`9QIeLCmF"lA9N0JIGMjVrHrLqaTfk fr`eP43AHrV+L!ZpQLh1T[@G6qDmq6cmYFqP['NAK8UM(@5LC**[6j)@[Uk4CjDY Pk2,'r*&QFZb@`'m(@E0C1`m5&H#)Lb9m8(M#218#2eLP'ND,I-"P%TPp3qJh[4& NLd&PT[Yr+2`)cXA0jP5Cp1D*UCX2YeE#YS"pabajE4(bjr-&P-dji"reDj'Ijd& HAIDcFkrD@@p@'[1h0belFMl()4`##ZlrE6Hqpr@R6rrMcjel5BJ'hVIc,IJ1%E) "j"%YfXTp2[GDlMRFflQAFUrQhX5pQIXblXZjqlL[i0j5dUN@EqKPDA+XfSkL*-k 6++M!!cSQTUE@RJbf(PL+&JB`e)[Sj@CV+r(9XTk0d+T+k)G2e+L+GqA!6jV1-E' 4D'-&H)pR[Lj$CMIEq0fadSa)SSJYjDMCNm2dA$#SfHEafmC,D2$!RElCqZ3VkR% 4C(&39#D2Te'5"Ip'jdI2TX#&l3U1"`2,B',X3%$DM,VdYk+'hkV(B4(k8AJLf*r jLjdJrNpjkYSMHH&lqYRr,6AVfL2J@2MqrL$VK,&Ir2IcRGJd6Tm+@4mrc36*P)( Z4b#3!+hQJ3##A41LB0L(mEeM@QU,AdfHDd'ib+8Zr,(rUiC1$@hHG2,T0ehhkRh lq$q[c&4iN!!c-rR5bp95m)1+RJNrm`RqRmlGmVhMl6Er2mAGfJcMJrcr+RHEhda #r[qBHeUMAJJ`rjjlHR%`b(NQ263c'N(FaABqYTP&,BQaAB@Y(C2Q8cVBCL9j3)Z ([!2El$#+C(XGYMQc5mNaE,q$lC4E`ME[NiHaRGT)MQ*V8Zj1ZcNSL0Gd0EE6-@P ZQLD`c6d4e"*XZl#G%BA+6G02BM[6iVd5feP&EBlm0IdQYV1,k$CL0IdCYJH%FBh F00'I&9aC+b,kKc,U$hT3e!hS+FTFMfeHY(Q@0f@QXCdc&q6%bbaM1hF#3Ubf(mB fIblc@pKSZZMi2Kc94YeShFPEXAd#f`,9P0VqJIq&(c`qHB65SpqSdm$S`I`X-YY fIKDE6@XU'$%EV8*,cIB,r#`cfr[j@@kf[q*RKE1em0lJ@V2acP9Q3l2X-T[Q)4J efahmp*MYjIb3!(pX[ml2'V0pQTpHXrdM2fZGV9Ap803q0TUjb#FfqU8HBME&"0I SKHe1IVl2E$r($re3f0l,cd20pN9q(ZCXE4,I(fkf$RiZ0"XY3bE4Ye'$)6kUlGR mN!"RE2q0(h!3fh[iX6DM0[@EJ5(!'LLq`@c8f+2-YT%IEQaJi+9Q!m-fQHder'` ffl[jZFaXImk2Y6&-9aG@RpQS-I!%faCqZ,%TPJDZe5IBV&URGV#pN4q`'0[lq!% IX2d&2rh10N1pEq!Y0V$JDV14PaeQ!lH[-4Zip@Lc[CDIR@ElEAiHBlBriHHacMC 6pI(pCJ-lIX"X["N-`ICNia6BAX%2Q)cYIr"Mc4Xc(q@(1S8DN!!cq!BfhQ4%[&d jIEcCH*2LV,2p"$mhQ3e-SKkaIB%I-"Q+3528,@B$TqM&a%Bp`%'`2BdIX!JE[AR +(jcY(IbB8$AV8r`mdGPQ#dG0ATLYfU*1X9'VaY9Qb`HXa[B5IQih'ja$ZBfcIBS I-"BE66Frj'acVZ+(2'-$Mic*c9(HRf+fjr(c9,2p%MrN%0Y(M,YKqaSrbMFiTkL Im6qE$Ccp,fDM2Z&(f2"rTYPqKTpRQHehq3%rXAf*(l"#ckR#J1HB$5laA,1"Acp L0ZS%E-6f!Rl!H@c8!6R%pKPqRZpXTiR#hQ8f1!maXB'9VM95EG6U#mh'HejN0MM 3LmhfKra3GpLqbXp,RHedpA2qZ0RJ&@!)0R$0QZ419bfpc'`rb`rF"aYF3AXiRBd kJ"IVQ5Z1#,jKJrr!-E'"-H!*0QVee@BMeNqE6IY#!p8D0R#,pqSj3l8&Mm!'h`1 6XB(Im"GXB"Pm'4XemhUcr6`rF#KXm0ShQ1fIq)%lk$P6'J"aX-&rU"eXi1B[QSf kIC2CH"XiJ`h1mFYQJeqqfGR18Kfma@c`[EHD$Bla0V1"F@mh'h8&$Q!$Dhr&E03 "I&R2fHSkr6@c`@2"H@c8eQqB$Gck6E14Apk#lF2m8&rBb$fm3mm$a+YrbfaJpV[ -"TH!lf#MAZ&Zf-!4Y!KXe")iJ)fhJBhBi25rClDri3IHUZH"bKreJJeFrhfcJ6e rB$Di(j`G'lcS!fDM9Y"LX)'$B"Sfm19$CU-Qb6-fhJRqBrXF2p3qYRrKjf21pL$ 9k-I0"Vk50fc`CqflGMEUpC0Q!f2J+GMJ!fJqf-![Z$mfkK`-adE0S09JicfI04X i38ldc"0hKdpKSlFDASN0c[GjXm'C`3&Xe'AB#almN!#i%$S!0M$[cm`'*X)PXB% 4F'eXe!1m'"XqIfNfq"BBVZFFF52bJ`dZrQ@c`EhS1mF'ek@ZXF(0[Q)f1!ak%6E `(Dk"$9cl@l04ch!aE06*hjQ0Yk'Ek6PAH)m@K!dp!bd&'hS(f)80V2TRXm'0U@Y XB0@rQJeZipSieDCB&8QDji*V8GIEZG4Ke$Pm,[N5Df5F$rH58N*8QfT4iMUqJfe `1l&qiIRS*Q)Y&r24#m4eK`IEi0+L[RYXb[h%90$je+@)ef066"IAV4jX!qr%GD) (fkKY8Amq0XfeU,pI6`FpqD)HI@bUEBQ`#jYLPDJA(T[b!#'1XbP[&rA`Be01kh4 )E-VC4$hpf*4ML1SGQf+a5(2$TMJPiSEBY$j&Z+6R22)Lk[h(GJifkr-r$ie-X$Z EkMiLE-HQfSGX-jYLPDL@X5P@L6JA0Z9i)[d2Qf+95-2%TKJYT[qG"eD*kAm,e+0 ZqYm#hL1Qrbe!cp#C%U%0lG6d[`AS1f,kh`,`@dcr@`"2%Y2r&X"laI5r"A!Q-Ie [!4a'62pES,Sdr@m"f#5QrbfNEXAd[iAN5%cr@iKQ*kEr,85IFYS[0X9[-Ie[)9J PT[mYK&H*kAm,iCpLqYp#Z*QBrVF3lL'Qrbd%+mAd[di`48crkk6Ha25r6YiTT[p eSKQ)kAqGm(XarDp6@V6TIjhS&f,kAbHmA%crka4@QIlA+D`brDm6VL+Qrh8+Udc r@`6@L1PrLi49T[mY%PkDrVG)f'$khb*d%6(pEa&DM*MqY`LG3Ncr@b6m0[e[%9a 662pE"(m6drm@`@h%p,r&B,'BrVGBG@Rkhf*U6%cr@mclaI5raDT,drm@#aY-reZ -VL'Qrbf'Ui[TIi[KSQ,khf*iP*MqY`6F&p2rPNMM0[e[LA$Dp,mPbVhTId[3`X6 d[bAS2Q,kha)d"M(pEiRiLZPr5j4[drq@`0R%p,qP`J$6rjBUhkEr,D9ZaI5rTH4 )62pEURHErVF8rFMe)'"6M80-reX+RaI6rjE#2mAd[fA`(c(pEjPiJ1Prbm"%-Ie [QAL!kAr,b+qBrVG-2-$d[f@UEp2rPJRc62pE"NF8drq@`3[&p,rPF#dar@qjF-l d[qA#@Y2rPJYV6IpE,KjQqYpb0$[k$C`0E$2pElNiN!$TIm[4#-6d[q@UDG2r9JK ,62pE!FF3drp@U+C0reX"[SMTIb[%[8cr@m'rQ2kh!Sh(pAGJSmj-reZ"pL'Qrkd 3cc$pEb@F8dcr@`RA%Y2r9X)Va25rPH#MQ2kh8[c'p,q9iRbQrke%)a(6reDL"iR TIbZ9Ep2r9U)GL1Pr+q(-B[VI+[LKQ2kh5Mc2p,p9UQr6reD"Df,khbTU6%cr@iA H*kErV8,c%Y2r9LRIT[qYdVY0ri0fLHPrAI"--If[5rNfrDp,Q'hkAaIB*kErG5R IT[peN5marDp,lcEpVdZFd[5r,Y@hkArGiT5Qrh8,cdcrkiDELHPrhFUhkArGi,Z BrYFY2$2pVjYk%p2rZ[NAdrqkdEr%p,pZY"iarDmEc8*-rqZ"Bi[TIch#8G2rHX6 E62rV%CkCrYHMI*[qeb-F0If[Kcb+kAmpk%pLqPm2qT5BrYFM6QrkhfTaHY2r9P1 !B[VIDMLBQ2kh'KiLT[qY9Vj0reX0(SRTIkZT26(pEc9[%p2r9Z[GT[qY4[F4drr @S&Q)kApVi1&LqYmDm4A6rpD)0jMqY`C-&p2reLMIT[qY8CfCrVF'I8Y-reXM,QM kAkrUfr5rAV3*-If[&iiYT[re#PG-rqZ&,iRTIlhLSkErp3T(6IrV&3FerDpAR-c d[ekpfr5rYAUhkApVKGqQrke&#a$6rpE#DFAd[lALS+ErV49[-2e[,IJPT[qY9@f CrZIa1I"91#MF'Gi,ei4l`M2KM[!Tq!aF#Si$Mi)r`@[J5r!Nq"(F"Mk%ISMHK,k &0SAHKbD(rS01K#D%4J5(K(I#rH(cD%[S6R"Qq$3F'6i-MiHc`mrKiQK%k'@QGER jA1L4k&GS3qK!k$rS5["&0#,d)c41p#ld)$3`Y%Ii+VUGkhA8'id3,SNqKEk)MSI qL2D*RSBZLIk(9SP1Kri("dHA4*0$Vd2[3kY$Nd6[3ap&Ed3E4@Z%&m1PdCr3RG" 'd4I41Z$5k#*S(I"E1$UF(6i2,iG(SaqK'k%AS41K$k%,S3HK!m'[dB$3IY"mi2" S!h"Y1$ED$jS2qJAF&ed#I33Y"'k,rSAZKEk(ESAZKGk&cS8qLXD&YSZq"6H(U+, 9SGZJpD#4`0r4NY"ld'I3NY#3!0#1d)c3LY#)6'2e2"cQEB&(6ZX'H*`iJ0S343# *ASPeVCX&&Ti)qZ*)qJ1dZ@H!9dic5*m"J,d+krNEc`!aRA)34cSamF`2-DiXREU @pCU1T,kpD&GU&4TphILQpIXEZrHX2$A"k9JZ9,fka[MlGdmbY%PaXG)E(DTN,SZ Qejmm#JmcTQHQaaZ6eFR$*L-A6k9cfcG`iJ+pH(UfhUY(,FCJIjMP4@8fF#-meVN Qmm[$K8UpNbCC3Bc,[%CcIX2m5*q"A([MbLe"P(U0q8TYY,CMK`ZdSp,dmjBIPGC Y`3Q[1EPr)r5kFqphcp@(l%lQNbaU9eZ-F,Lm8UX5V'1r[rf'm-LHpM99mK(kVGM aCFpGa4,rX@2h4XKYhEJ)1`(1&ZZkQGPUC-lEkc1($ZY&cMHI(%9JPjbL8eSFQ1- #-+-9!&Dp,milhZ(Dc2jH&6LrE&'iS*CCAKaR1VDkD4D2pe["HUV6c+C4`ha'(TE 2A2,+,YRR!Xb&Pd8Zfr9Xmb[@PXE4l"'Tr'+(pS0Z[1(L00ei9[%&#@ABk(GSk,m HRlhad5#M+S,p8A#F%DNhT&R5#[)mbEapB3ibj9c@289#SXIA[!V"NZGEK)ic!B+ a-pLeMK6Zpl-`b-FXUG%r$eah[VD14#a@b#2$Z24,DKC3FbQm2)aAU)[ehEa)1T9 EJcFI5l*flSfh9!X+63HAFQr1Kam#q3H,-&l-B3#Dk$ir68[V)lYKe'CbbX(-clf *B+'lZ"KN&4FcF%#h2ZQNa04R1V11UVh92D5rb40[$5+[IV!bNj)a(8kdhc0!M+1 D23j,hUMVM8(XLZcQA,1"pLb8`E**aD6)'IlE@0`3BHh9bMH59fU8M9'b`%Z691` p9[2MSl9ZGM5JA$([CG6,(MpGYHlTq(%l0q[qJ2&'D6$RF)PIq"[fMCQI,QdiE1V iLfFLANfUpQE1Bm04H0DP2&+6C1rFQ)8#$l8`dbQdA&@%NER[U-eL10L+CTIm,&# NUm1mHk5Pc"(#@@m-iL!,@kYQHiLclHlf6!I+&a4#(ebTGaDEB8Y4G,66"G@GeA+ NB[p+ck4C#0(4aM%5CjA3"b+&Xf+8qhF!44!FqeGki0EeS!H1[QE9iiHmXEQ9km5 lL,-[ECheM*i@HMVZJ9qF$ieFm(0!ICNPlVTSiq%m)[Zi*(&N*1F)(ifI6Ef&ldY U`Mfmi*NqIGhB@$eQZYEZb#r#*0l)@FNeH9E"0DSb82k5,%RVm3B"8'm&I*f[XVH EYB*UL@SZEH9A@(hQDR9Ve&d-il*-Xi@QXIDePPBak0UdM+'!X$GE+*(%461[k#' JT8jcZDRS4%I`SBkkJ+NJ6STJ)8P@5L-[Xrm0ECjL0ThIFR1`DYbf'*FQ[6@c9T, kk1ePKM[QXS"K-M%AX9U)m-D9Vcjr6e)NP%!K6ml"&G1k-lA[V"G8GlRkSq#h&pf &(KUX%pbU3a3V#dNBFh%9Km,)4(@fj1'aC4@KdSIhVKBqVc'M(r%`K&Gr1fhF[%U #e[)GZmF'qKr1lFHKaq1TDh(b`eB6!jVl[V8iY4'[*UVIf)rMjQ[BG0deCl9akfp d[[4f[-VLp2j(((SIRY,20rdBcqRRQjk0jrEM))Er5$m1[4mrfSp$ImLGr6MdN!! mVaq(2T2Rpq23Lh*1[hlS8hPK2`kp,+r3G-HmCkPZkAejpZ#h1-j[jX'C'HYk$mq dQ`mHXVEji1@[4"@qcXQ$ep1l3*F0F4p9RjUNCHXKkk&QA'j#3)G6)1K3De)Fd0$ L2@dph[6,R+D5K![@h61A5+V)qXkf*cc"rQqarphf[mIqElAr[IDrcrkID2rllIq !r4qdrp[XrhElIp*k,QCHJ[b3!15LeG+kfIi[Xrr,lEr2rUq`rbhVEfRE[#T#m4* A50$"*)*FLTjM)Sf+FHV4BP'ffrp5qlr5rMICrjce9c4[)@IGFbYIHFKDqcrIrYI BIkrpplrVEcGGpeLkkDDIG[0EhRAeqiBV2r1*5ajqprGXZZQq8rc2Nlq(B$jj2"3 q35`h1F@CECk+6qj!UrIib,*qPq1MQ,XDrTrF551aH@1@3I$I%U%@0+1ND85[8JK DQA2Yc"k&!NeHA@T6pX*`'pf4i1EHDJEr,rkrVfGJmE8e0Pc0i0pVA!FqP#@Z$*M NJ5P[*1Ia0Aq!3HS(#4#-M0B-BL4)Y*B3E6L9eB65q*9eK2#TMY(BHp*pDQ+85BF HV2I6Z"r#r36Z@lKhFqrK[T9l,rFqlLGblqFq`(f3!2XflYZjRk6iQV9`eCIJfm$ Q-1dl`1B`,IJ1X&9fG,PlKC4FMiV[j9KTJ%klcSKCSAMhiJrGq,0hRMlpUcB3bY0 fIN`6%JZim)S(r[5c2hMkp0YXF+LAlE5Ml,@962JdjYfdLe2DC&F2h)%JI*hMjL# "#piiB)K`3ApR1PaJP))2$K`5A!Kj**-heYN)R(8HP`F1&eM[bh"KMcrB$4-+Z$" R&4HZL`E"%BB%&djCa`82('&)F1&8pASaER'GGbc)9R,'2qVX[PeCHhAd',l-Qba -&['8S8HL8p-IUEMJ"QpZlkDDjHTc)``*,Q4+A2#i)8(q*,LJ`p!M2I)1f[RAH9a q1&bBXDil)5(XJNCkh*KNJJXc04ZJ00IEZhULXH-HPq19ki9eTiPK['l0$Kr-S+@ j)l@CLFQ4bXM%q0`i[e[VYER9$@%m,-HRX'4)EZd6IdZjHIM1'4YccHmR*TbB"dd rX#rTaQdYN!"52@lD+2--G@iL[4&I2ceIRjk)ZfcdiBXpEV8R0e(8qhBm",Y[IbZ m*qcFGU"qCSN16pYTBUHhD+NiabcmEi"`8e'NBk1MbqcZhj9h@3eUEfH8(FZZllD +I(5j[6*kIIAkdAE5bNIp0,5eB6dMjrKU+(kcirTaYiHGP)hCG"qCTIQ59R5`CAY pDbGcrpYY)9E"pU+(0[K"j[kl9RIAmE8FAmcUMr9H2cCbd0pR[,"8PFCKXFc,qR& Bj[2bIKbkC[VkF9J-pBTq(2BdfG+2`j+J@rYak!+kXKq([6fhpH-JB2Ihil"5dYA p1'`[XD-IKa9#GrEMX)MVBrTaf,[MXIdi,2"keH#&10T)cX+U3mZ%aFH,%BFPB[G V5aqe(9SUMB9LIr#&*FEdG(J[AGSb0"3AkPcVfAZl0aaHH@Si[+R*TVaXpB&rCe6 ZP(M4hU'KQ5R&8Ippkrlc$V)riN@lGRU[RdJQ&&q'EMTPmbRaApS+pZjp`rMNVEF fpafbple*m6A0(BS6VRYed9kHr`Mcrq$kqpM-)*ThkBlkrr@Drifr(DB,#5-[,aN Dm[Hkr$am#rjX,G+$reYkqiVB6L6*HdiC$PFq5EbH6pqT,VkQKiMh1Q*0QdlL#eY mC"U0jJ#!pK1'([42(TkV2YmY1,")C[j!$GdlE$(VS90H2l2dMXe)U#-$RFjd[2I %BDYFEDVd!(4*mSle-rIBiYb0SjZ2NYL4'1ZMh"EN2['1cF[CQkVFhmdV,D9pmc9 Em[a%I@bE2AKq&kK[[F-Kc10XMr%KK%QAEadmlKdhfLlPJkHm6@RZa-M*HSmRFq[ H3HI!bEVh$#$jRKIK)jZ2-Bl#%V56lr!#-)ZGpHC&j@UmcUMlR@&U5mkIU&GY"l( &elpp`-ApHAB"c+EH`HPU4@bAHL+[lKe2m&pNTlD0IP!p%6k,imIc%Fi*C2rG39V C-AL#8IBeTQcYrXBT,#&Fbrc@UBY)0IN1E`!6h,,[`0F41,p0FI9XR8S'!1`$kV& JTQ0BRYXSHH3G+l6HYaIJ(D-*ZIXG)d$qMAH--i*Mlp"HlZr9[Qp!56K4pbJfRJ% &B+`kmXY-$pI(2MBPpJ5m3aH`r8jpC20khG,AN!$alRIXHikpMqFeISFr3#%j%'K PH4m!RRN"P"ErK,*aG(rF`LVHeA1!pAAp!1rJG&%NhmeVe%,ApGdLFAU$8dMFCZb e)$-'6bJNRK00f4r!i,`5fUYI!FQ2RSRCiI-(IQL#eIdVAHE[e33Elr#EG)FFeq$ UeA'I"MIaMLN0EZ)G8aVFiAFFdq$'hq([d1!'mqTcd1!DKAD["MIqMLN0E[!Chp6 J*YjaA)1V2F4(S-'0aJMhX6rb$YBpRhqrYQM4MYZGe`l[IZ-p`pMPa1Z)m1LG([C qGY$2l,L$ZBqCfh#D*hrGN['UE8qq4CfR(J(QINeYjL*I*%DXHJh@V2G$%k`$ihf Di$!MmJ9SJRd[V%0a@QhUN!#@c2lr"mENRqK5mJGd&rP1ZR"fAf##1T1%$N#fefG KScScp8pdme`I$!"S@!hIF3+"B`9J6%RiYhciElT`$PjXQCmi1m,iYEXUarIXrRI L02HEM%!I-P,4aaR"a$ZQ'-(%1kD3!2c`1iiKqIJlr!&)lPr3"!IckR23""Z&GLm M'(r(&#-BI-Bh'F(%1ijVJV@(a1mBNjRd(8SF4RXA`RH%'mm2(4ja3fkLa+&hH!' d2)j(S1qXXRCcFK,&CKMap4el&c6&Uhkf,#aII)G0!EJNd6Ee&3VArSdC,IU+4Sa lCV5-[10SemZikZ`Kk(Sj1FXNCMV(CTQ-e)Fr3*@rCqC(24rhcI`BbHY4pITShA1 QCR@-j-1pipL-MG&hk(bVqim*bhZi`p6!'H9Qh+H8qiVjp[FjM[G`[@92GGID*Ui H1&b)pb&dZ1!fFI@jRI,qepShlS-M$*ApVd0Fm,d4KJ3ACThKNH(+TAiiA,#p`2G &hF8`hPAG1H#055Di-1dF,[MGQ'5##p(H[[Z5Bi2JQKKbHr[HIf$B#p`EZqIceP* jpEB8J(pZcfGG[-QQcE3-I%1#dQ'hTMhq!"HQ&*l5jY*qQ-P-eai*il!)r5JmF@' cURVm!iArl)5qSr&ea15H-2D,Ecdr,1-@ErJbHQe@Z8DXkJJq0RR,EI2Q6cLbrZT Tb,N+1VBPC3Jrdf6"l[#STE4%1e5fD&F`jjqm*`T`lD@DKbD#Y3X`2,1rEpP$qAe @IjqabIhK0-lNrR!DCh*r1)dcZ6qFaTRF(dlM61i2Th%QpiI61*2l`fQFbIhK0-l NrR!DCh*r1)dcZ6qFaTRF(dlM61i2Th(BpfeS,ld89r`KqllG6m$D#mi$GpcmjNd amc0h4hi4*[(BE0K*Sk!bYe,CRLpGPkDYD`DRB3'p5k@6BDDTpk8ZQK"3')CU!e( p,QIZ5'eQBR+N-M)a2MI1lpCkE@jNX%S"0!m%`)!QGUV3h4Qm!-HQ90l260MZmIl [""r5[GM1RLhD&DCQl)hcK&DRpIXEZrHX9#DQrQYi(0YdK,2Qj+f((aS%N!#5h%i J9`fG'YUmkH46%D4X"ABmEU)hmYKKc84pN9cHQ$r#&N2KMQI956F9pTLZ"p&@VY* EM%6()afP0"c6K2KBlQZjVqGQBL8$!al$r32F$%&P(3`DMHlJTMIfCQkDM'N"TX1 9%8bXh-%k(E3qXJE(ph26F%T$*AhB0*%chSBN-ZKZ!rH&h"Gcd`UkNIY5ELBbd5' kLEYI*DFh!jNfFc1k!KcSilk#H`XhrG0AFQrMCJ`2aEU$qaVZ4h2[j'EG(CEIDH2 @!8qZ&PMfC6Shc4icV5kS&BBpcH+Hc6f(QblF8lP2ickGQc8PcZ!qNrXXlV1j(m" 0HpB$Z4r%c@)5jh"hFLrLAXa0*`l`X*!!HbNhRAZXG6'IH`%hVISVZ9GaGh&hFrG `VqCH`ph,[CElI'lDYKr#c9SRjh&r(cH,(V'qbF1iriVlbparcIdhh&rKrM0ZhD) LH),lUparbre&lLparbAhRh0rMI[[Z2qHqaqirj(lRlMrQIYIZ2q9@pHX#-&*Eq3 ,V4QKPN3epVrjecS6kNbS-k'qK2S5kNYqLIYeh+rRrMRZ0h#rQ[YRZGr)rI2F[m$ p+ZlAFVq'qfHiIj(l6Gbra2h,h'rQIJ[h@lRIa[efl[r1r5[F[mVpDpbrc[dEh,r *rG2Flq"@+L!IjIiYlRGarcEjqMhZph+rMr[hZIq!@hf$Mh'rRrX$h"rNeTM"(h# rKr[Gh(r)r5(Z$h0rK2ZMh"rMrMMh*lMrL2Z6h*rLrQ2Z6h0rK[YrFRq@Yr-'h[m jl[r&r5IFRqIq![HIiUmi)q#-J$-#cJJi)f#5J%8#hJKi)f#0J&8#,JRi*'#9J$d #pJMB)eGa+lB)Q#0JK)!a![B)Q#4JNS"*!LB*@#4JNB"&!ZB*1#6JN!#!3`)1#6J Ni*!!8!Y#,3Lj&h)[j&kS(k&ZK"S3DN#S!D&1K$S5kNHS+k%QK*S3DN+S#D%QK*S 3DN+S#D%QK,S5kP"8'eS63Nd)05(8K&!6FKIh-lLIbIdXlQGc2iAlkG`rc2dFlZG b+c%6eLD"N!!*+kI)flPrP2Y1lZGa2jrl,ZiAF2mBp`ZjAm6pBZkAF,q8qmHjIi, l[h)V$JLVR-M2FlqFqbHjIiVl&Gb[j&D1)h!NJ6X*R%VJ9!,h%$L(`+d%EL9`+S' r#"a,i&3#*a%iPX#a"'iPm#Q"6`Pm5Z"6!Tm5q*6!T`3q*I!TJ8m*A%VJ8J+A%VL 0`+F%ALE`-S'A#H-XK$jhJ4-)I)#Yi!3q)2!"J6m)[%(J9J,R%ML5`#X%$L&`#B& A#*a,i')#4a-iQX$4")iQF$1"Q`RF61"N!Jm6H*L)B#X2%hLB`--%IL*`-B',#9a -i')#Ia2a0kfAJ(S*`18!I!r!rB#D#ULP!(`1`2N!(K"3F`'B(B$R!E8@J1N"2#! ![`0`2K#G9fi3`#8#Z%3!hJI`L3!q%F!R!RK%!)m)`2i!,K(!(3+i3`"h#1!1!68 F`"m#q%-!6`MJ!`%m)S"("1#PQqQKq"'!0`&i%fKZJ1+)@qG&X5F!H`+`*p$S%-@ I!2`*`*m!r!R!R`#m#F#E!,`*`*X![!R!Q`#m#F#E!,`*`*X![!NN)LMQ"'"1!1B %B)ihiIM-ePaUFfh3iRdlQ5k2hdQQbf2`R@6k!TTi5aMhlD,k[bF@)C&*QLHQEMl F@JREc5aCRTpYeJE%G+Ylp-iC2DLmrjM3+T9Erm[hFK`PM(RKp!2lNQlFCN@)@M6 Abd9$McDRX$(Bedr2ekFRiQid!'#M#'rSF9eGL+Gc0+(365kr)IrblP(-JHbE[pd 0,j@bNFllG[TQkj1[U-F)rlF'4@AbH"SPfIrXR,Z*r68)UhYXh1$pEhK2f,RY3&e Y[lkhdf3EF$SMc-,r"JJh&88k0MUU5GKGH6HZX[pk0i2CVqqfLRadZEdbHRheqP% QX4mBpG03VI1qNL0UUpI$3)*S(L`$"$+,HER"'i-'QSI$PKT1'46!YUL!+!-Ah2D rHKL@`#!%$J-HSS%)D+$6Yp*qVJIp9"[h(kIf2CTFClBRbrI4X0VHGSf"01ib+)& $)bi$%cJda-rjedq@`b3B,R$+`V*-$XY2pEDUGjkK!'kJ!MD'*C`Z16CX9!jHa3" l$8J6XKZd3!b'1c"`!4Z$+V3KhX9Mm-6ChYZ8'aUMJkeTQ4ZDa0d`"Q`dfc+8!4Y 0a[-L[d9H'5E!N!#'KkX*Q`EMFhr!fb,jLbErqCVU%$DXkdkEEX#$D%J#MI6D*1a +Mk%0P#&$)4MUJ%hpJeFrU*%"`5B0DeK8P-TbNiCC,"kqlfiDQ*Y8FdXkH8'$Gj- 'DfJ$ISEQi#Be$#rcYRGSmQj5Nc6$)BK0Sr++j'4#`h#6KK+Xp0jhNQEc*TVP'4E 44(0qNiBk-$4#K`CN9&Z'J"N0R&"rCf0!"--NX+(E8@[Bb!I$*E#"'q30'd-2`"" X$$L`A3%b3JL'6f"MB!4$+"cXk!q$+,"4%lCjG,0UJX%8f-J4!bU`-Ib$B4rB'1L "(4[$5'cL5V-'NGMUJXh8K4X@JShQE0Z9T9N0e6BCT9P0jVC&8l-D[idh0UZ'E0j mX`Bm-'`%'`-H'$U#M8%0e#Nf(@6K"SjJBqL&lFc4)Vbc363Y`K6bKSeK(J`N`8E H'8b#M6IBJJFY'UJ#pQ)$&F!dE$5Bfri`,@S50r@M4FhU0-pMS`QH)5MBb#X$6V$ 4)-qJ%f`-P@$J#6B'8c$i""X$*RJl0JD$8&rB'2$"N!!@U!(B$3jJJdq!XGJB5Q, Mm9Y9rlD'3+YUeEC9D&8Yf56l9Z84X-I'QkhpYeAqYS9'Uh*[Ql@eUX(HPLeS94- pJf@`JGQfa8+VH)EYQY#UTRlVe@J9jl$GIeSeX-0f9fl9B!i'd@"MU)EeJV3+)aP -JieG88eFE02!&j[khbEBYlER0JeZXFdRfS59B$8fX-QQEVF*#aL+JifDXCdLfT4 A@cUJ63hq0M'S6F-*'"b!$4aLX!!f1"-iJ!dFJR0K)fHfD%5EFQBl`8i6aM1N!"Y $D-"$E03ZJ`U`JI[`)'aJ0)-,X)&h$#h!4Ve5GpLS@iBBB+01''D!MC`be!!Elf' i!6D''F"CX$()J@%(f-Ja3`q`8D0`#Q`-@3(IX$%SKIMB')S#KQ0MB!feMihK-r" 02G2&8DNME2"!"LCJJqrDi)6TiLd-N!$!"NpJ`!3fF"NXa3Ef-9J#'eK$hV"4r`b T`%D0`51`N8HiQ!rUH'2hfGFY82ElfI1VUrK,6VM2rZ2$)TpV432K&Y[heqa%S8V XM1QCkI('C(Abm&GECjbUkUENk%rdrhq1(q'0RS[$5YjSJkiM(p(-#9Bk#M&Z58G "I#R@Y@japr$%mlkL52U$"1qHJHlTG+cd'BLH,m0krXBc8,@FQK9&ZRKkYYkER+T M8pI9ZRQ4G#Uh"QmqPQ6Yr1N!&lHdfj!!ER"dF1QmGlr2"TX(+l0"8B6ai[N!Mf+ PXBk'RkE2Z$qb'dCYHN%2CZc'92*QJf!fKYSBa-miAa,QDN$HXk#pbDS46!LUqM* Y56FC,aH&@hXTAXKXd(q(RmA2C0@0T,hXDEp0"bXcD4&f',T9ITAE`hY,YdLlje2 LR1X*FpjA0jjf62B-e4+q0BLH$Q'l16@bE3%Dk8C`UjFTcU0PQZKe99rGj@l3FDJ F`UhrKK+Zfri-CpZY'$AXcpCLp@3R+ie9ID1-fAp(LBkAKrRC('Vq4S'C!!eJaRX %Q!N`$-bi0i!ClcS`4mk0LSmL9-SNmUd@YLZ+B@$1qYH3!-VjPi%C[`B`ied(jYL jRV!U-1-i"Xb%'!(Q*%!MhA9JMTa(bh3)Q#2I%M$(MN2Pd!"Q["[!M2FKB-Dr$Xb 4me!U8f!1RBm!m6J8(`(M#6JH"q3a5$i+bU1`2!E-Kk(j-$Jhi(NFS#IKp!LJ(S( 8-9!p#UZM`$S-V@2J1Jk[i`!l4R6'UFi`f6N-hQ2`23VJpd!iZ`%FJA%ACJc+ABc $F1l#M%1k#c)'kbl'+,6()FC3*ij6,k-i`RJTM80p%Q8B5F-S3j!!llc(B0r&1!V p,Y"Kq%r$M#GZP!E%)Bi@j3JGL#28+%(@IE4QakL"Lc&'$eb-#5"h88E"2!iaQ[3 MS$j+@,)KMMj$L8YqXBJKjP#,NL-1Y4"&hP#,NUF0Y4JjeM!B)Ya1d0Ali%2GrS[ $!9,HdBL3!%1i4KLVp8D!U%B(Lc$213i&LC&l-%M)1'V11F*4#j&LcR#%dA51)Xi !TDR&+6+DN5KMCC(bQ8D%)m@HX*P'!-M-X2G)lH5S6#e%MXR83K5)6#e)bQ-D%8D bRC2p3jq1-j&+r+)@*FF[DL'+r+)@*Fm[DM&br+)@)L8(M3Jj['L%X3TU""LVS$` j1"3N4X(")#%jU$RRb%%Y4%S1KL1-TM-L"cA[!A*3Le-N"b04aXSL*3H0#%H+25% (M3#3!)0Klj(DbC'$@SJF1DL&+*!!JeU3!*3F0#+-C2X`1A"BF,NI,hCp9X@[aEJ N@1JZ,JCCa4'!)Gc[EcjA&Y%qRk2j)'-EMVF#F&!p4Ki%EQq-NJAJC4`fmCS+&5G l@cFQdP"0Z,V4!YlMafh9i%LF%&,(H"1C(mL4GYaA0+,),mrDc+R%dmb[`-c-+mr &c+P8mN@rZ$V--8IA%TmmCLH1p95RI#eaL@%MUSJ#*mZjCHP'j'Dm+kU%,&DC4lQ H8mmX3UCHaET1I515P[S8FeL#42-V8c$cc"'Pa+GDCMA85j`,C4CcSp4H5%fHrjK 6R['B8j(MQ&Z1e53q!k#I10HcQ$+Ja#A0QXlLVX)RILAia+N#RrJ0`#GH*IM%U3+ I1Em82R%X`QIN8kVVb,&D%C&c8K'45kNL"Z!ckjD$6qH@K8pA#6Ria+-'Rl&R$Mj MVc*maVi*I-Bqa4a@i"1r'RcL@B62b+GDCRAiM*`,CCE#Cf`[T+B%RcL9i"1R-Rc L9S62b+F+Rj&c2BX&q)aFdUcT[*FUI1*AJNqF+[#*h`"miP@#6j`Um*Rc5q%6ab* m4MkPZSiFUa8415F9%EQ8+Q)!2V0Z1IKdEPRiG*@3!)022'V`'A[Qi$2f+X0Rl*[ !Cqa6c'%&2['V`5HH4IL-I+TP9SI2b,P3CLPma[C#DNV`L9-*2R%U`bGZ4IL-I+V `'6RAXeL!cmJPb4Sl09IJdrN9iG-jPH(6qCAJdhN9iG-jPH%cljI!Th-X`'IX8kc Vf,&5%E&cYL*LPe*&P1!cF8[K-h5,i61XK"3qR8F92V1H+AaQ[3EJ-qZEKFqX6c' (CIKdIPAiG*i&q)apUQ8f"*qaFk(-%[M-fJZT+F+RFbV#Th-DJ%rR9S$2f+F#Rl& c2BYjq)aGNUbY)Q0$%"Vl&Q%dGLa$DHaEJY2BX`LTX@-C9JGm%fL0R3[`Q[-VeRl 1Z9)jZ3$CkXQj95ZS",N&ea4fXkiap'BV*iAIf+X+`AR[&)EcRJ03R2I2`R(HVj, R-Lc([P9SMVd,m*ccUjIT%%cR!T6,0)(V[%mjE8ABMKf,d"dl$X"hl&U!m*aI"FC c!8BbRBIcR&[+ilG'hF8`rSUQC+iP@FRm+XU5Z3k)5qCBdTI-Vb)a&9e6PFPmLd* 6iPB534,IUS+3!2JR)N,L9DQD!GdTjjQ6RL,2V2S898Y1J$+RQJD91ZGNU05aV%5 PlSNBPEU9deZ4T-beTNUCFe'B5Yb'bV)Z6bAq!f@CLP5Tbd#q5P+9qCA8+[-V#eE Q@G5X%VHUE*Ai(dT`3Ea+[0*X!JLkpRF&VFfeK0EQ9d&VFae!Dh-XSEAj9G#kk*U LYIN@d6Ta+m&#iPZYQX3rUCV%Ue)e!fLGmmbKGH5C4HZS@R*SE8ieY%kGFfLG1TE 41R92d$Te+kHhJYEQ@N0VFbkLGH)f9*CeY%lm"mSb4H[8C5"I*E3f[a*DQemCVFf cL0D*@a@Y%rp$#5kJGH*9l0$DRR5c&KZkl`q#-e5Xj'H6I"Z1JfdIcVI5qZ%F"pX rR'qe"F4j9YT!R103bdIH1GmRiRc,,5'aAk9I)ABH8[[M!(R&2hBVp#U%&94Y%dP FLkdLS@ZZAF5je(XbR(Hj,b2fUqIk8(p'(+#Fkd+I4YDRR2p+[iCcV24X1-GDhiC c,IGZa(j$r4YaJ*&-$r4aa'j49[fjTjhK`02+-F*R-Raj4MNah3H(#Zi`)*U0apa 3lR#5[LIZ4,LJ[kFiA&M("(dI($JNZ$$(F1%J@cIF'-4"&VE'2#lr'bkFZSi,Hrb "ETK3`)A69R(KPN&`G#(&KG2AF-%$4aG5A*LlKJYhU'Fji2,$iF)Cl2FLBihCU6( [@*!!VH5-l00qbefC@LkY-@[l&$e#0l!0(!e,eeIFT[5H-[4)qKIBqdCa)@bN[5e 0Nk`Bj%BB%Pc)P,MJF81#r%P`B6Ui-'dkS8[rd-Nd'Xd"!$Z&k@Z$ZFR$FpAR0mS 0Tr2[$pKKN8lZ[HFHcY*[lKeMUelC(J$eKr#1F"l"m-TNCjDVLTmmV)QR%``p!*[ dmSle-rIBaRH0dcGI8@*(BUb2FY[XlX3l0LpREkTbIcH[V"hF0eqcl342e-HffB1 fmH#*GcL%HC`Yi$H%-,ZL+!&M,JfLVfj9E1qidCB!($`Er8kJrR%Q,YmHC0S52RG Lj,bTk2`rL,KhX#[QbEVh$#$jRKIK)jZ2-BkL[Ih(hZ%&B"CX!6cqe[%kSqjhKUP YjhLLAR8"80[Bm0X(A0bICaI!E1SGR+k@YLJqN9IhM[)@aYmiYNCP8$d42S[Mar- 45Qr*0)lLk4Jm`5Ml'P1f,fEMU+MF8Hp)655eJjRI1R84U5EIi3eJJP[f(IJk!Qq G[jL2V92PIUFHJ(ai+TMT'*BViSAMB1V9%EeMKIEKp!+mBc3KGlpM"-LrmBja4R$ X(EUpmrGUhcHJ**bSHa3Eci!#-&BGQJrEek*4D1%lG%U6*q!GeceA)H2eNFhVG8Y I3mDlhl([1IBqRYIi(Ii!KH4!B(ZURX3c,i$5iTp30JiX44IjSSkTQZ#G"iVZJ)" hF,SSNZrQe4De$DVI,4+R0f3RKY@#c"JmSC!!H%idCAm!Jr0+D+pq"53rHLDfFjd rm%-6e031C[jH6E$a$Vp*GmKa$DjH(IGTF"2[Q0,J*YiaTF%GIXFa$@lm(Ii1$@i `Vci($Dj4D2GUF12[Q0,J"Tra63eZiKh(0EMD3h`%'YaSM($%kC&hk)bLB0[pkKc A2EChAMZmqihh$'1A%eT"r0%l2Hcpc,r0l,L$AD-cfV9lR[ae`r@VYMhj&Zf)l4& JlYI8CLlb4@,%UYGJcASr0-%k-0kR#3ic)Pq!*YMh`X,4Tp@Q$YN'jpmq-#Er4*H 52k#lb(I5KE2l!K28HFTd!'DR+ZG2c*Mm%pdme`F$!"T@`hHF31"B!4K6%[iY(rk E,Tb$&e[Q*ik1%HrG99QIkedmFlr*#23K)a9pR"&-['1+%8bmB`V*$lrM'*+2[m- IJ16q"8e`-+mq"df`8@Mh-S,aGd`aJX&RI*-46,cMZ#CBHdMmMM'C5GrKpJqB`+( pE-S`I(M%$EQ*%SIHi3A3mMJHJEicRAeh+%kLf!`M[VjMli*fb+kI,3[,&ppK8`$ B,k0'iGUr-D0&Ap')FFq-PT&h(1ek'9HG234G,bGRQF4-jpJXNj(km!HSm[I-r+M RilkC(b0j2DTH(kelcY5XMT&mZ(FFQl%aqSlbE[-HYZ2QSQk+m`,#X8X,GUbE$6X TDjcdVe5fjd[AT@RVQX&T@0#%8+"ii$l[bjNl8TZCQ"bTM%b-cihcZl9HQaXCV&) !%PrLHAZm6PkFCI4cImVcVT!!AejfN!#aR4UEURkhRRh)8Rk@iRIc8hjVH%Hl[5r c$f[K([0h'UFB[Lra#kiPAXEHPrTGL&rcAh5+XQ-l`5f4k288r'$EUGpRqHRS&2R CH)i-@jl5pc8Rq+lXT2PC[rk2ilZf8bbHcC2m%6qRm'lbREb[pCrjZDK64,`Rp9Y r"qqlU$R&$[I"armBKrR1Eijf,1P+-j4eZI@Gf&DChl@mHe2Tel6TJiTKH8)VDhE a2[8BYQk,YjUI6ZIhqA&X0VjdcL&qCMLrMkT@(ZVm6[pPIPlSr$lp%pJHCR92h-h 1ld[+)@f0HUErrPUH-Tr"aV[`qdS[6h,E5h#Jie(2E,h6mR6$,f$EiI`bpr)ccHA eblq,lHRQpa*qfThI1aAE40'-kMIdZb,i'fb[0EpAppjha@p*C(ZpjH01ILj`ILq r#YXE,0iGr-abIM2NpdEcHjEbX3GDR-HYTP[iHA((2cFKS1Q[qAPJqBlfqal!pLl RGmfA2'rV6ZIhYC-i8#pkpP22VDmUr@CYIcm1lhCq,prXHDrjGI1M,Rr(qE9p$YK SFqpiY@VT2Fi2L5Y6FI(@[`[MlcUrZclLH5rCi[`Z"-X$m-VPk@XUjY"[jepKHkr jSG1'H0$q+cq-lAe@"c0kGGEqJAGM!pr`1e2&(2Sp9l8,GZRT!32NTFl[19YaH,r &ka4BKqmq9lAb!I0l6HmGXkjm$EB21VmVrS4hI0+pijeIa%(YR#F60h1$LqGLIFM j23fmE((i-5[i!JiIGRlE(q3G9JF2PKlr%HIh$'SLdh4qZjr!iD1'SmJGDpbl[kT krCMcHcCBf1VLYArX!!iIGhjhJL1C9lThc(XBKdpBAYr-cq0F[+G+(2`MHpmC[IT VrlcUMjYi+20KrFdkSRGrbZ+"`9Cr,a2Z8MZ8c#1%*@'mXal(pQRRYj9mb"8ZhMZ 8SmmBIX!(AZImhUjD*eG!(,89i[HX'6!Q%$r5F`GFSFQpHeEc8cKmcR#8'PhJr(U 9#haj(fqe[,j99"P-*Ki618*FR(@TX1rcjNI(N!$PpF[L(-Vl1*ZNrBEmSreclm( fTmj[pC2m2-(j[H9ZE&pdIYh`[q#GRI`Xhj**-0K`SZd4DNAHiI`ZIE5(%fdII3- 1m!,plIYX$bHQ(4+'J@RkZi8h'8kd25T-HVlcfdCX`iPTZrm&Kl[-laNpR'Jlp6X i[-$jA3-H'8j-ZiBhbAdZ8HpH`qRQpm-pa2#q5EajGLFjajZ[&1j(r,9ecHqPm)B @chK`iRHPkZ3r'3p1r,CTmP6%8e1r*khce+bI[2E$DhRk!MJUaM0D9D0KIEIXJi1 *iaRbLq$V@3k(@L+QMSMM'G+QcShhY2`DQ#Z1CmK(VZlaRTDYF'A(Sk'F5Xb0pl6 %B)diRL&r$pidZhbd[%qBCccM-ZV!q&$ciq45M'HdLT1&lfjqK*b,mBa@j5[%hCB (i)YL2+09r#(%TjEhJ0PL2+09Z"RbPCDC+r!,HBEX)Br'HeVZ&GiBcqJ46`Tj6r2 R`6iaRY%cehY(mqrGMer)-f3I1SVaRZB[8'0L2+0(r#$N%bdld"[%H%D2-0AUkE( 6q"R2k*&rQ0IQ$m2KaAK'Mr$DmRSK'#b1CmL%H&l)*eVZKCZ+iaQb,'bc1Yi*raE M'9H)*i9mSZ8$Gq&R2'2$HhYmS[R2IabrN!"Rb+I")H-6c9rm$G0Ki!erS6bTlN) r3k+,E""HK$bMqIX2ifVmBi1dM6$IQ3q"r@,mibA59d)FDVk"QKEM(p[&rm0hCak p$,q3!(r)K2!Lj"R0@i4E)Iq3!1J92Ck4ZB[DPT*rr!F!)5%&3R9TE'3!N"`*KJ% Y!#`"[3%l!*!'jFB!N!EP9J#3!iB!!!%1rj!%!q#edZ`PYMQR`J#3"3MC&`#3"3% J,Irarr`!!-0!!!#@*b!J!h4ME!#3($J,#BB!I3!3!3d"P3#3!`8!!19@!!(f1!# 3!aB!!5)$!!!"$J#3!`%$i,3GFA1f1DIS!*!&#EeK!*!'e$Arj[rm!!$$3!!!L2S !$3p#6d&I9'0X8fKPE'ac,VN!N""q9`Q'!*!+J!!!!5'6!!&-E!!")C-!0J!"68e 3FN0A588"!,5K[,#ed[N,!*!&!KMB!*!'+IN!!+Yk!*!'@[m1q$U[lr+cmcU[0fr GjX$1LpCj$F`QQYpEp&*1[ddVhATV*UFRZrAbq2VamrGllS'IPpHCdl`F0l#,prC HfI&Eq%@JqKhKZAMf`Y[R`3fh[r$P[(6K&q5APm@!$UrihMU[[2cNY&0QR6hK!mL KH@6KRIN!$!)3i,amV`[)&`i($F2)0`c(4#22D4KjVSQ'-HU[%(1[)mq"UcUPi8C r[6FD$B5MENmd[06[LbGLp5JReRa0E5!8#ITR9CI8qB)cb[`0V8e0rULlTV8P(JM jX`rXkkldYM5eHT[mlPTr2"jSDBTPhjMUCPZjjrKEr&&[2""ZbEi`cBfQDqPkI$p h5@0MJ+pkJqlU#"dGMp5'@k-q[lXZk[Gh"*HfaZ,KN!$l#2q+%m,4aSli%Tr2(iZ j2GjiFdG`R6IDj)q[UqhX30$[V[*')Ph4XeS$`8ChqI*ie0X4R1JYP@-frS$T4jL 0JllTLLd,a,baQ$r8%24(ZakB%``h501%!LZl(kN-Y#cV$V8!-0Y38dSR68*T3K% 8[q0T&GlEd+@cUj!!A%FMeAR3JLhqB$CbR[Gi,l-0H9XD@Di1%$*IX("SEA59eeG GZkk0c6HU@q14eSjbQl%p[F$JXV#[0elPAH9(KhHAeq-Tl@eca[Dh14r)Y6NIk@j cKRV+Ckq0kbiTBNYLSHjUe[KA*T&"YIS'4Y(j5#HVk(bRJePd[T*L&jhKA3bMmk% dbqKm)--d1Yp)Xih1"c+-Sr100YE4q8+DHI6hSE#2cMGX"Y)6RiDRRNHb%0AcN!$ !9%qi"8PGcGI'5YBpd3m'`NkkQLl"8$UM1eK+lbX*TY,l3MYEkAe('%Y[r(2pNQ% ZR@pdX*I19f`'da1IJiNZ*Y2c8"p-@)bQ0lD[h'PQdrP!QYdJ!''ecIlJ'PCM"hH b'6ZqJmABd5RfBSGeX4ElJ64EX3-c,-@16E-61c$$5ZcB0MCL4kCC5&Hr#2Z`Bfh @NBP,`dJQ1!XIQ3F%0M*K&L5NQk506A5%GM@PX)GdFb4BJah9`4Dbd3Q@N!#0E'F (fAKK"GQicMTR@)!Gfi(qGV50qTQihMEY3[R-!f[De%,eE-bDXU94h!j-SlHml$E "Uc)3LaX+ipH!TafB!8ml0JfHGQ!'21hB0[#d)p2JD3GQb8CAX##V(GY*41ci$L* L4kH)L"h@486X"f`mcm5PJ5)6R!@+c!-#&*N`#a65IGZ'jafKAE892%rhD`,2lDJ 12-p'*r!m'pQ1jpPi`I0XA'HG-hKZahEJZ4eYihNQVVG0Zr!mmm#D0VA`2"ZcTQa T2,F$dhLH'85UTR(2$RUl"bMT"qbddS%fIdJ(C[+Y$l68X)'kbl&mqJ'p8el'PLr hq49fGJp@q8KZdXY(ZLHp$(eZpY&H[miRl"Vfa'IVf223ml1H9$el`MXCB(XYl9# lKTQiE1db$r3cee5Y-Q'GU0CH)c[8VP%Q,PZMc!2pD*bU85C-cl,YT+NpVE$(`ji !Zaaf"Ha+f!r#IJMf`l"Kf#MXLE!R`Dk#EB'0`C*#(!Il%GL2`Ri-pZ1`*m1H!RX Ul#GJci%p$ICdf%r#RJ&l*ZbRB$m0HaCX#$B#HahXpE#IKrd#l"GK[`5l'qcZX([ !BTr6f!GfApLTX00Jpi1G"&X-ZcrX!E!(`Zi&Zb[X&0LpBDI$(J3l!rCJf%0J$i8 p$2C`f,0KCm+@`-k#,B8YJbf(R3dl"hC2f-Q`Ri@p"2C5f-r"AJCl15ch6lPSQJH ,293$5kM'-0MKX#0JYiBG#9X)1a4f'pKYB8I"&NK[EJ8l"(Bdl(D`fm11J4d,Z`2 XMV!l`Ai'GKcXcV$MB5I!ZQ(I!lX,l(YKAE"&X1I"RJpl!Hb&X"I"AJaE!6X2pJM B5YJkf!@`li1YKed)@`eE!hX8l2YKMiDG$cXAYKEf50K&X"q!23Cf-H`5@#pX!k` 2pPcB4PJrl,'`6E$0X!(BTE$,B+YJ2E"A`&i*HaAXeE$A`&kV(F#r'f"[4BZK6pP @m2ZZ-CPbCD!K-54M&jYE`qLLNeE6NEfj(!leK1lP!'+5AB#@X+kU1q`'+8+%DF` ``Z),ahV46SEJeZjP[LT[HG8U3VT*8hep%C'`Skp9QFch%bqR#NTB6aC8mP3&9Bi 49I@,J5GcrGj'Il5if4``YaG8DT!!6-p%%l-j9)b,*++pGQX,bSIbc0[c*qi,BNT F%SN%!cjc!k!iDP5da2h4Bldq2`$3U+UYY0B1J)A&CC@9CJKHP+KL[K)-0)6#mE" 4K98)qP9D0IkBZ9D"R'E-3!Y-,jj@('X10R"HKPHLhQM!(bZq@9kVmmILa6ikfcc 9$8Z9%fpJL&AP$E6BIP5LSL9J[VF-%A-VbirhYm4ML5G+bZ[+83!I*QMKS,mi&Qp YB(!NNN4jd0kfQUVCSePC"PE95a`#9'LLR[+5@9@9li*i))Mm%1j@5b8apqjZUa0 L4P8p"R*5H[14T"H**%XL(9AF'2DTC2GQqb(+V%KT-EeVqT-KGFe4B%f-,PCC*EJ L-b$Z(,$DJdaNV8,GL(#c8K0McAXMS6d0C15Z#%A#dEJE14Zc[-&J10cLRZX24PK IY9r"5$JphTJ2idPk-Eihe'cI@&KD2AZfR30f!fbhPEXULhZLUP8kFhCKPDFqlEC b&kIN6QmU2p@q8PYQKb3R)ZNpJ9lFPdKY-+L!e1C*fdC`qfT3fbjGq`T3qpU2[HU 6AHr*V24dV[&dV1kNeRA@EMLhlmZfEF(Bfb$C$C!!VUf29*pBfahf4NGkLb1pZ@( ["f9hJVVfJ&)Gf,%9M*!!C3Q3!&03L3J6+JPrY3$mG$3$c'J,!$XI%&bhNL!25Er "J!3LTdEVk20SM'hI&!),-@CiLm2Bj$'I6!"VDLh(pNQVG-#Z"AiGN5CUTEG80(c RT8Q"0[eBXd3eNl5'TbT%%c2IlZJA$'+G(#1RQfAYiEk(R$lLe6iRedcJJMlQE0` Ei+j2[VPa8i"9SU&icX&e)hhF@Bf$Dlk*#c0QB(PJ4K1(Z3'IcJdPb#J%&j`TA!K jY@kBd)i,,JXAPZRJk%)#&c"Ib%[LJJD1,YLiN!#B,bbEX4bl5VSi(JPFF*)ac-$ fU"jZ*TR#"CI#"I9$@@Z%'l-kZ(NNF+%J`4GJ&jHU'rkr#lGSfH!KK3Z&U6Qe$a[ HAUdEAE"aS8K`S5SFpI2[JjMHEFk3!-+&)IcV+[[4KREeC,lLdE!FNaYUDB""hh, bM))F*pbTa12K[i4r1Ib-N!#rRHN"mULUUZ6IN!$pTrfVV+j6jDRNRj)kJ$cU5rP (T3DJVM@e0GdC[TC(AIR#ZZ)'IZfilU6r$ZXqCKlm1E,[T,mGkmpM%[m(e3,NXEi J,qI4@rErNdGr)LrPi9qq[L#$amaMIG[RkX'2-X`m0P5MlBHj[RT%m0'D*L!2Ahp P"qV+Mh1Y2*j$STIcL2$rhMIVQXKM``b1IrFphrFE[L#6rrrk$cm((-Jeqi(JQS1 [%rYlBp-KMiR'SK[Ba`YjQ*p%EMMYrb"f(AjKU3I)JmImAr,2KjrdcJp$rX*cae& 9jG%!c(Mj(E25eG!h-KlUaLRfVQrlH58edKYVdf#QCKj0!Ij2r*Fm0!0FZMNHHQY `NH"85p&'IHq!-l$4qR-am`MeYmIc4aq!V6c&[L$qNAblVQBH5lhpD$@3!)Ieb92 abX!!*mrPNIf"0(2'D6qQBKfr)9[GmGT8E&dHfS#T@2@XHIa4[IqdrdIEG6b9i4a lfe32cFH8VVFlATr5jI,B2+A,jE&j5VFaMaHQG!0jk"HQG0he5%lT0Nr&Z[0iBbS fN!#(4Q#DjDFkJEmFlFF8UKH*ATp#p5'D,Q!+CHC"R4,2iG!J2c2c`,m(Ej'da%6 LRDBeqA6UYqLZ8k5IQ!"S+TLT&S!4i22fpA21cAA9+b$jTJ0P-Y1QZP05B6*RZeH j24,Tlm3AZAdZMmhF2TI(CQkr-BmAZ2e!(Seq$F"Bp99Zhef2",I[Cq5[j2&fIb6 bJ0B#68"r[$Lck+l('c1,J6`fN!!#j'&+#-V903TT#Rf(58#6K+,"h@m%+LYHQH( f)PS!3p1"2#$[)TF(6r''`IfQHTKjk!0Q$94qS!HSaiDCa8[p%@kJHTDhmk"`%Mf -KKAlTr0A0Dad56jCJpQGNNq8`K0plYR1`QAp'a"SBdp5Kj)'KK'C$B"qf*VVYD9 F#SE-T$9,[Hq[m%$EdI[94-p"S9dZTGIQcA-iMPV(FDaDb-RZ1iIjE+Le&L$,p-N +MbVJ@-V@YT%8(P9S#KY,Y*aj,'%8eSM,8YXX8l+f*K@(+9SUqBk99,DV'CMIrBk G$l(31IJ1ajfZ`AFSakaJm"e+15XFV$G&B45j9)--DFq(-YUXGi")aT!!C$jV*B- JR2,4KREREEp$1@PE$Ej$k4V$"YqKCUrKJqp3lYU)`AFSL@hV`AHi#c*bm"e+DYY Qi"hYiFP)`#2R)*mJ9b!2)-B6[iR0RI,`hMV%2lIX*Qb$j)Q!@a12LGhN$H3%a(Y b&j&l3eT#)@X&j'AN8Z4Ga&c"8pE%V95QQ6j+eR1Ea%cjS&r2B@VcFiqijCkCf34 5('E)[&RKeTC'V*fZV9k#r$*0Y!Tr%+8'L[U+q@8YV4"5TBmpqMKH5`UTI6[e*6A 8CDN(2(VBa6S(*TGU(dB#UQSVU!&@mhDDir()M#P6q)YQFD`9BN6$S5Q4D,Lae4H 269RDZ'c+[XAl6X%[%l%ThNL!LR2e)`IV#i+)EE*EYA#('b3K+(69[63"GPZ8T%p Smrc2&"+,T'`S*hmM([(Y(9D0U+PG2VcXSP9TeEQ[+EjGTeF[XGATpS9E"r2TA2j -GB"jU&[CbS4DP+dAUG2C+L'e0&XmJ[U5,Hh,e*c-*5NHrY6%C5NHDTAQdK3208C cHBU(QTfY#6Me1(1CLSFDSLea`6I$FVQ+jfjB,PRar!pBDpRU89JZ1[%m$@XZ0D' NV!Ze1G2(@V#fp,'Ze1C-(h9&8k-cIIb6MeUGkD0HCP0F-Rc85NhYc[446c8e200 (2G68mN`I1j4kRZQMjQAUHUE[DlK3hc0pYq&#RFrdr3JAqCh@mB$d'RhrM![e2p2 h"ebS!jSYbET6$c9pc*QkUZQMCQVUUkD2[qC5Cc9pe2A-R5lkU1ZCfUITi`i@Y9A 6abdZq3FVMeUbUBfD2QUrTZCUqUJjQYUXkIX+,X+1mri'&fUjTZrlZ&$60Ahhid* Yer6p)bl8H%hI8i)KK"6f0ZY'(hY$rME+Cfl8INdIp9fc0qPMAe,l0AhX5p'KN8r pdG5#64rVacITSjCYDX1QMpUTU4'E2[DP,'IR%eIih6GpGq&#hGMdhBH,r+59cek 8Ri$bRm&&IL9f%XYNTZ3NMXL[adlf)E'42YD&'U[TBcbe@Y0(lGAb`jD6Fhrjdp, *Ad[P6dJR'3Me902(CA'q54meBa0[kD1QD[RBbRNM,ZahqVk$#r9HdhF(,Y4i6Gm pZ&!I0Rfr`)8kXHRl&ebS&jZqC`A$#Hr%'qV(TSmBa,kMMrdXq`SZpJ$eC00RkFL QMaUbU5HE2[k-4rbKMh9P,(fXUhbkk5)2N!#r`Pc8$#krG,PZad8$m1qL&ZGB'XS YrH6%$h)FiK&aL2K$h#(H@0V!b8@)"H3*a"Kb(h)riL&lRrK#,#&Z%"H)jF4(BJH adG*S6Uj$r#&qN!$2%ImYEHI%HH),Z5Nj#$N215Mj$rQ$T9HF[)*mP2b"I*@FMrc ,iV,N'13Uj%ENG13Uj%E%'A)9mKjb-H)MH54a,k-GR9K1$#Gh)Rk66a'lbG[)AmK 2b"(*(iQAj*X@9bAI)EFP(b9h)0qd&SM*"mP[b9RlIfh8'KcfM0+qLIY0pck0fN` 32TSmUIQ&cZe`qp`@a[c["mpA*ZGNCC9c&[U@"4ST%,Uq&VSRATZ0rHI-UfhkTBh j36(E(9TF2EQDqE-&h+)HZ8m6SIEdP-kZ![KTA43NkqI8)qY[rb2Gq,I)ZYpB-Q, (dTeP2E&P*k&D6)[`fAcU+Ef!hX81T@(+hB%%('#j#4@`@#405R&-M+&%GCKFFjV $m-lcQX2`#!0($fMr`MXXchD$lh"%[6e&0X'(pFHefVm3DfU%'U`M[dR1D34$&,m 5bfN%`c[m8MLR%3c[m-[KR%B`[-0[LA0D[I!12cc,DIr#1kBqUX&hq!eb6TXBhZ' hbMQ0B+*eDScf88[BLiIJe+Ncc2SkR*K-r#C'fYV%V#r'rjajNY#EA)eIT#XjB$e R"lcbA2b1U%j[2('HR)$mJCb*r)pFKcb'()AmJaK2[NIZ46j(VQEL1C6AM9&,G'j XdEP"B0d6e@kGb&[BH",I6aYEI@[dV6U!aYfSpbqI-KL%GQX#6[BRGJM!d%l!QBl K,&iFD!R%!pjJB19r5(jH[$J@prE+kphdIY`I$39D[2%h&8G$RD%LU4S!R(LhQ$U !8k5Yq4iC('q8-"L6[F5Dpij%I'Rf`ML,S3Kl`"lp3Ld!9pP`(#NZN`Ha$jcAD@% fa8E[89TG9Vk(HiqbNVS5A$d9TA@LXN5AF[6c(jdR2R6aH%UeV4qk[+1"4!Gbp(- IZZJ3GKU6KerP[h[bG!*kGT6+iD(cUqHA9*8APbrX9TYRLSdbNmE&ZVpaY$&LCA3 a`TpIdmV6#aYc@rlY`IQhZ'Y'6QKURZIU8XaM+VADXP%3JUZR&DfjCXpC"h4d%+[ "D'0--8GRp[La6'5[`Ci3L$@hEF'bqr8!'rX$e8N1mYS(HMS(q0%65!alpB[*Y2! c%jG0MC+Q1%P6PH64#-U$G@K`[hDPJ!Ef`VYj[%[N3,U`a9Qq2"#IkfeT$2ll$ZF ,*G6cb-R68Y4%-h2i)j26r+1T-#(e6#Zh$DRjPhUQH81$YL1i8,#P`5!"6N-Rp8` N`'RST1(e5B#VD2%&@a[p@MA!d2a,J11QT*kQ3r4b[kbVIc9f5DprUjmZGl[ThUH ,9UrqjEhk&ic3ZTchLUiC'aHm`!9mK(Rdp9ShA0J9S*!!i3X0a)A9UlpIV(A$"Il (P-'&Bi!,3eH[rZ+6'MG8d,[mR+d6dGD5kKmGVi`r(C!!I$9mkcM`pllpYlkb@JB *1mRMJd80A2FSA9@Qrb$c%br$Q'(+UM+-JcFVUP4If#9qVMYBjQmjr@9iKcpZj[5 Fi4fBM6V0m!LKE0b!hM5m`hmiA3-kea"&l9NjI@f)SMkYJX&mf'Xl8cFEI-0kG,- KLMUhFVVCm!iEGIaJhY6+0@(`(3*!6SFEhRPH[aVHS6D[R"if[%20AMQGDhL(rlM fk(#cklJ0VMNpE(KR@ecG!hfKj6[N&q3Lj!r%I1+[K5F%9H)LXCBi5Z`MVK&m6"e mX-4eBYKr(HDb2q`"X)XPJ1JfR*K-hN914G`P*b(I),D52j%ENIH3!013!&q3!$X 36`8V&k'+ijj,I*3)CA12Z1@HQCNNYLJ6")0U*jC1h[c`'N6h*(l)eh(6%hc3$bU Ge@kF%0,*6rIT-fGRM(`2l-j5T-5cYE"eQ5"5@iJ#0BUSjY-+fJPfqma,#f$IP`Q UKefB#6S+p[hY34bSX66rVcbC),-mb-GPeqbYmZJ("14S%T3NDJJ%j1J8YUmd$JS H%MfPTrKA29%Cma!M,6l!CV3'Y%fTR[XSV+@Vi6TBcYailS!eJ4ER9l$biiB*PZ3 )p$%rYHb!&X'&FcVk&Z'LPL%-aiG`iCb1[JYaiHb1[TYa%DfCMPrJ)K6'm63Z-V[ ,f`iASMGpqq%b5Rb%qG(L@iS,hk([ilLBR!1qDh%C)cl@FUciJ"V3QkN3K$f`SrK B5j)#qNT`N6PG2PFl6*i"hdQiM"IIjEK-%0phF4("P2N25Yr4phYF6&N6D$I@be3 h!GqqZ*JL*q#EMmYZiS[KXV[i2SZ,I&IK[!dAdErTC(iLDm2&2Ya,I,a2%KpcQLb q-#jlLqmFA'5(fh86,U,aa(8I,[Z)laPF@"p#!AYMU[MBhp2%ei`,qj'q8h(KV*3 qiJGRT[6GLFZ"i[X0,Y19Vj!!1(+3!2KBDrR5Ta#X"bXcbNFp$iH)lhaF$KAI0h! j6(`r)4L,l`qiQ+`#--AHBrr5arXXm4f,LiM5,ISd,QALql*J)hfXf@car4-ZFj4 [#(&YV[MB9aALihfHq!+i(#%qpJ6V5GrRF+N5hprL`YkNlkHi9)[[GlLSC5KM+,( b52'acf[%apS4pqJM[TSd&llPZ*!!Yp*h&LiQIiA["Pa)AHRl!5iQKBA[)9c)AZR l)biQL`9d%aq2&KrlR$R5ahliJ2JBFici9Z*LcXEK1aFA8p!6I&r(a5ZqZh&T%"r c*TD5'T!!3c5+MaJU!MH(%5rBTr5a[Z3Tp,AL3XbKl`aFf'[d%B1*rr4"diQa6(` ra%8833eM(iI%pb`ZSK9M1$N$XC%qiThSMKV1IMj1I+b&$(@'NbN6RqQl#"IKqF1 *5D`2IIa2jAMa2Bl,#FShJYb'I8SI-Af&q)JTl#2kf$mI&0q(F5&[SSri36ppa1` 6aIGpA-K(k#1R%5E2P34V&fTVFL(b1rU)@am6(fY-VN3Iqr"Nm6(Q&2&GJJYaM$l Qr3RaXEG1%pp[F6PGq8D5+hj5I13fl&2kL+eRLSrim5RaXGq)`r3a0f)AI9IJmKR ahB,,fH)MhT1rd%GH4Fc"fBCFm6caN314,p"(E,j!I-3AFNrk@#rf,heI`H9Lm4( lbERSHaJAeKpR@h+X5m9(2'BrdNGF[Naml&YL%Ah-Kc@NMr@l8R`raZ8UmC%2ADe mSmL(Va%Iq4Kj+hh%AI)TqSLjmLI,+',(jmA(2[Q#q,k+baI&p`qiI%Pma$pb!9h +iG4"E9,Q*rkceUJ8AhGc8VS)+(&03iF,i!Z1T"*08hUJS@G9SJRp9&$bSj99SUN c8idfH$L@Mc8(CB[KRE0PSk"h8RC2p@kR[U4'YKNeJ%F2qp@53e1V)9C6Sc`%Afl S@K4fC!qrLH35H[+2+J5N2mCkrBqU60"EIe6TjG5K%!%+DUUVj4mCG3VQe#b3!)p S$-F3UZLepN#,CPG8PZ20VH3q3Zj$j6j-lP[,IEMFYq%GHdmM8jRPMD`+am24F0$ VVJ`d4,e4rQQ4aiIiKkSml%SpQ$qXUPkH#[Mj#FX3HF4m&2F#HGbX"ZjQPC!!YC9 -[[M01raQ(0lC0T@NFcMVAH12K9ZM2M0,kl9#Z6[NEYI5Y49I6CE4bYMX&f6XNNb YrKQ5HVYJ00r'#PJ`i22'!q%@GfQiNAq9Q'@PhJUjGrlTThRE5Rcpb2pVQl*RqTD 9mhmrp#G2!,4KNrc00A)mAfRqKFL+1-XUjbcd,3XdHU,KTI@e([k&PBII-C&V(Qp j@bJ1fcrk@phP@TU6rNY0Tb(VKImF(bK6pZR#GMVN[+Mi3b6q82%I*MpQPmU8Y8c LI6*&+"IrE2(2NIYFq9fl3ME+jXNl4dKHPA+[N[MjmQkeh$d5Gk6maPdM'`&,c(L 9Qq&B[$M3%SJ([-(!5[PNplAclN"mmH+i2aS+Y(MMrj%qMVj'k4r3BNaY)"3*qYf BXlZj56)aeVah*1+6hm&6-h4M+rb1E2fAAkGE3&IGR#*"8iQ3!(@R#N%3RNFbMfJ %P&RS[BlH49PDRP%`2pbbRM%lUUSm'S#rD9NZVRCKJA(G9lG$h6M&A[RN[[[-+kP a9i5S!(PY'Xc8c+-T)$rmrbQ2QYSD8A,`Tm0rrHV+&pB90mG$EhfQaqrjc$ci)d, I1eKJCD2ejf,Q%HT[MqG20"B9T39[p`G2XBpEIfrAeFaMcGEJ+hPB#PH+9`DkIda m13re`r-"dirSJEeaDQUL!qJJl[EU!I+SUUS8(42V$RD3!!8j@GVZl["8LVk*Gr+ S,aAp&'rAYAV@20(0dGI4R[TF26b9B3h!$jfXKfD!@65)C)RZ-mXE$)DamchA(qa &0$12$9J1a#ZG8MTTdVVZX2+B*2T!hXeMI8&HcU-Ib&r*Bi!4[*!!KhrjqS)-(X8 ShqlA"+1-q2Sc'FL$ba4@(XperNYjE*Jfe2K&bXC!Im6mSZ[M6`FI$+dI4``HiV3 qJ#P[qL(B8cilaf0Lm9C03"ima@L5YqTUr9*4,#T*H[&MN!#IQAP!(raE*#daNAL RD8dqRG*id(@+p"-6!%d&-p8#-!*[*2*IQd(TZZS9N!"mde%)ir'8kNYQ6#KYGq9 IQc'Ybd-E-'25$##R0kS"Q,PV'QC$[9hfqQ`SPmIQf9!ZMmfcSBej[$!E'XK$[c! EkUl('l1KlMcHQ!d0j+%4Q!fYI`0P+)Q*QU1HXl#d1XFrq%CLLY*G@qh(M+NAd9k I-I8KSdjKaV5TAmdmY")cT[T!bl5TlZA6$qLC!'ch+S0$)Me[[-VJFRPXCR#j2$B cZ)ej[-$J"[*Sp'X!&UYHCA$Gp8J`Z(lHp8SHErG()Sp`9"4j[G-I,c,6lRUm`8` (mYL!imJ$3,eq3U6b-,q%l$e-`Km6LY,p4U#biT8*@bqL"E!f0C!!4hA$dP`H2-8 E9[FfeF2-3ar!")1"IJ,h8Mdf--UAqL2F)!V6rTa(RbC(2IXCiEa4e-iji,[PFTX IM("qAT3BkMjEA(rlH@"#dk`bpPmh+F8G1TQMRqN)ABcFA*fC#!+GVYEal5`PerS h)0$'RZ4-5!2$L-`'f$,i%*eBU(Dm0!!%83HafUQYNFpSEQP3P[k,VqRQK"`Qci2 $chlm([(G-q+J4Cl+"dB9cRpQkhmVH@EeIF22GMkir@4hdH8,jVI1ID6!1+VD(6C 'lK)f4NqHBS`GIq'%KBB$0JmfIkmaF@0*fECM4cVbCKUVQSEGkaMTQ,YUlUdr@V9 Ni[L2m#8cFQE6X(h'2$6hPc20b"(@klZ1HHMdAhldjcG10'T2RRGbblF@9PFqB#a KeL2GZmjd6cDFZ`mpIeA6c(QVMKdhDl*4Y-mKeepfhH`TZ&pai9@cEhcJIEGQkhV 1ckhI19(A)8CEA4r6Gp4ebI!cUB9'kRT`k+adAFriq"*Y4ef0iHF[qDY%ADI[heE AmjBE'SfkkMh1dC4)Q2!U56A(I2h+"@HZARhreAS9NU5A1B)*ZcP6Ia#PcNG5lh! Hi4eiC`XFi8"H8di#d%lk,3P!ZNRT2VNm20kBca[X+kc+`p[rkIc,H@JRT!4&)[h 5+JEUURH6*+4$&XDf438LLdRfF2[Q`IU229aGbcaB!cM(cH8Kqk(V#[[DrZa!(YU *ZI*,ql0V%p%$cUHhr$8%DQp4,ZcK'Sk*KM(@#-ALE5c3FF!6&*U)Z2B*`3ji,jp al4SZ*b#Z52,)rmGNh*R,+3K8j@((RB1i2-R$MYX$H6K(4U,J4)9IrM)VSH)Q6BG V(c1Z+2Sr%5"k+5B6dqY8h'M@8#3962jVA-j9FBHq$cl4"VBhfYNKq6e",DDL8E5 B",Y)aGeb0(a3-@V'-EmG94kRIKHq3SRlU''-'D[LLKlKfbUZr')m29VPm62Z[8' Y)mm4U191Re"acjk%J+%UVJQGk5K8H5cE$3'L+qQd45LP@m8eI3!"`e4Fmk'iU2b +&Nf&ElM%(FQF9(kA9F-h3Z*Bbf(U[EVMi0YDiMMR(+(LaPi'Rbba4+HK(J8U,XL iEH3pcM328rRpNBY1fkUif%'*2!T[[JUq83Sr'Rk1brdUMbVZ8Bb@2,k*ZNj9FG1 h4m"f+QlCSfK&eAp&)G)8aZ*%rMACVcrk$J,'U,J9&q+p4HUpeKmJB+c8MhJKqAf -kSaf8(%RrJkY+cJ4)+lXU1*1QBYk5$ppQ(fmNiSlid1i0+LmVfDpadQpjb6kVr$ [9X#hXm5ack6rVMd'[['5abq5rEFIpDP-82d4r30ZGdUGf)YUem34!mBi"&GQF5l `(K8A4cmCekZibHbCA55rIb)BUE`[*UDm9lhAHM)J8[,fX0Dl5Tdq4XJ,aFh*AqT Arq@)-eBKMP`b&EH#H$S5FB(f12EKc&!m5$D6M(0-Bid[#m@bl`([$AFS(Q[2qa) SKE$`rPF2))!BL(24*j*i[q`Z"1bZiLlq9K,[kdmJB9"aRb8q+V`[[2Y[i!12-1- Z6q"(dE(%UMe9h(M'#pjrR6LkPm54%bLm,lcKPb3H+ZjbU)'`m,i%f'a-9R(Ir'N #liY1*(E[VIVJ"m!M`IZL1@D2U[FZ4"m)hKGH4UiXQQ@qmqX%hKFq6J`9REMMqBE JcAeIK@pIL52'+,`TQ[%X-8rLb&HNlfGciJdm0q1)UB,h!IECILVZAZ#&i(hKlpN hqmYli$H#pd90Tm!R$()mqX$+SjL+i3j8FIq![K+m,lb8qK$!ehKZ!`Hbm(i"mB` pL(-(Z)@&pf-A)Q#'L[[HGFPqV5@'(UcL(VNLJIH&ebe!`#%UlNl`#3[[Ml`H2[) MT1$rjb6H(dE1FjKklpGr61"pi52%'Y%YHLIiKq"pNERh4FaR[FNYT,mRh!jILF3 4'`6[c`,@'M)r'BmqY[T[-[QIc'pq6"`9[$qC253lDMrqIK,[Pjp2!URLlRXSJIH &Me(9LHc'MIpp%ZrrL"SEj#-i2cNcLIHlh)F!m"UHZjj+iAe+Bm`pL%[JI5TZ4Ad +le0a2c`9Pb@#hhBF1G-K`J15FBjTl"Z,"k6HqpP&5E`rqaB%9+LiThk5a(X(-9( Q5%q3!)p*(jrm$4*T&IFdHEM`qpe[Jdmf)TlqE")rA2q#J#VK2H4UJ[F2h3RII"9 h*RQMi2hGe-9"lSccc"G"(98p#Qqr#3%b"[Vjjj0illN%!H6G52P4m!b,hcrcYiL S8Hmp")bam2kZcb#J9ZVkhj,mrK$1PHS%,hNAI(U+I81XBjf)li)hAq2-JM-0pMI l3I9piD-h`-IqC4c[`XXIrYr`%@0a(JC[XIMp8Dcp8I)H0ad%li2XA9%fGKFj[BA hi$S'H5l1BjJ,@(MrffmMJ*`))Hm"Vl$`[J!pEA"fJEM*`$$"qm*2N`13!,mJEPG `!UYI&ef$L-8UVK+pB[(licJl8#XfMYf16q"piGpc"U@QK)iMIj2%qc,b&6@VFa` &[,Eir95mBFJXm(paPL$mrUX2`LFcjVYZ61+pKr-Hf3#jklmRqGC-FLHCfIq3!"a 8F$G`2hbb2rBNF9(`IM%a5-fH(D13!)H&pcjb4H)McVm5b`A[VbBRNGRH)qalKIG &4a'$PkNm4Q-q*hKIq)A[)8,0k4blJ`mPm$iK,mC`6#*2X[!q'@HXB,dX[%qp0jQ i8LDiRSSlKM-f#pIYpkMiaH,hUEMYS5'aU$%8EfUIrcd"RQH-$BAM8RrV25rQ+Bj E2C@a1(Jf1C[m(3(C-%EHj&!NK[G5H6Kf*kj0a"ba,FiB4hi[FACqNmPA4iD`4G3 @&q8Fi8FKErY'P10l`-K%2k8djci1RT(STf5FBr+R8hf3!(V[,Xi`V$j,a6e"VS# *PpPRUEKaj"X+,jdI**q6HHXieP[a&HIpR-fTDE,MF1#"FkBCjpV[5iK3ZaH1-[" ri5[1+mj$"'H!L&Yj-rM+25VZ"kbCc(r(i5jmaAN(C`eUYm"arQRS!iA6,KFjUPS PF)5!9F*MR"mL*eDlMil,`Bf%ccQ2ZaX4a'f%619F9Z'dmhCb!q)RiJiJlLXqjlb 'h)cc)X4GJEH&(cL2i4[NF6JlmbjepC-2b6VAcZ$"JY21-mLE2bKa&b4`f[NiHi$ c2FBPqBhV%-id2kcbhJqi)cc*PFGCm)Rb([Q"iNQZA6#E0$M,CGa[NhP8BcCTVRN JKARJjm+6R)pp$4&+1i[M'[5"m#6R%jcPFGk#Z1["@B8R18pMAh)ZKlJERNcf`9, bjSqVZ+qJ0X+6A12*!cL,3*bIF`(*cdYH5dk%Z+q$&`P2FTl,ZT*6)1lEi0E#Nj` "pJ$QEc`Am'h&Nj`rBCm""makBijLpGrh@,r69GaiBT,U2pGmcQ-q+A(NmDVrA!G c4R+'bY[0RPBmbAN#CiVXAm3Y!Zm9RZ4mjQH)q*6`2qDNH*,c@A)UpJM1KDbPiNR 1*CbG+3hQMX@SKr!NCbhRFq6Jl!rbZC(J"m6*&(lrhF1ir96aV@RNZfHVZ0Xj'j1 icj&lRk2LlZ$-4Z,1*`Fk9m9pPhJYFDH`0X4HPTGcT9e8(hb$Xd@qccMb9G92VZ[ *(BKAj$I%%F(l*cNA)EB`$RX'9MmeJ'-CQ+X`EJ9jlGNUcRNTI(b(H-qjaP)9Gr& Mm*'ri0c'ZDR8ib&b4-id#2[N[9+2CH`PjX,h1-G8pA$p2ER-jb51mbDTabH*6G` G`2N9jke5Mb[**c!R-H-i-j!!HY5arc$I-rN3qBc8B`acZe*i-2&)kV%Rjpc%ECb RL-I5(lmKKaCY3dq`ck8H5cLlj'`"I6#"r&r9`rNlFSpV*Bic%UR(8H`"mP1f'lQ qe10`FR,L$q1)!9+2Rj&,B#jNeSPc#ZQ2lh)Qq!9jMfm,$[fDXaA-PjMh[LE'U2G 1BJh)h4#h2hQAe+1#1b5Fl4Mr(`#3!`d-6@&M9'0X)%e66#kjFbkj!*!3KhS*KJ# 3#S!!!!%L!`!"Cj8!!5'6!*!$B8e08(*$9dP&!3#dSD%rYG2d9!#3"[G-!*!''VN !!+fj!*!'h$B1q)qGfD80mc,lPBqmcSYHhhXGj@HRfHG(,ir6,hVm&[kd0E0VCEG 1q$VJY+ld+,p&YKaIl2KPPr'&hm)MLfF4[[!MalY1bA+F,1Dj(1(eNYhc1LrHe6l #ViX[jm#V8l)YmefdM`%G3-$i8TVI`-1cpr)jRZA9jEXB15LjK5qFm!6J#c!"F** [&NiQBiCK"!c$R'mBcjjY'&qrdM#+[JkIpDCP3V@P-YNDD3bPdp&N1PLE6Qk*K,0 jAcf+9)I#$H&BX,Uq+PKE@eQq+Y+5Dfq2T)0eZ83f'SrdqLm19S85lEP3Hb4B(mP QSiRf6'q)*8(@92$L5#+5$Q@Mb84[J,1#+,M%RY"R"bYD@k1-'BS&De)dp-@S6qE 5i8L`)4f*p2P@jM,CC$ai5H5kMQ5kYFqp)Kb1C$,"fP"fFjp[3bMG(XRZqp3ed9J N@"e+TIBiVma&Bkh"eGZbk9#IElkJl!4lhCHHHiNU&e6,(YG9d8`SNiR%@f+4p"l rLf2*&LQ9H26krKK9dF6@INqRhr9@89RPJJAiPAJ+RpiAf2Ef+VKb668bkkZHKPT 8A5)5kh9F(lSfa%cMS83V2kU[hkJ!6X[Ck`bIQ[TpGDY#e15bU9cI0b[AJ4+JlkT Nf(1hFkk1S+,lra@[9pCd(5aVqSq80@2dPc8pDeH[fH[@rjGi+c,arQqXLebrY`q Ja)FQ"IS26`S--63T-%$rT%$2N8Q"-Ea*JEi(*J@kHj-#I3p-#R6I0bR3fCX8ZJY Uek4!pi&*`A(e@SVM2pK5R"Ll@SVMZEYhU#VD0bPdHAX9['Y580@cCe+Jip#NN!! 2X'G5b$[[Ra6b)AC0#RRAJ4)i-#R3I@K5B)#"5F&a(5cVN8R"LG&IeVXRKEaErep kN`*pZbF&L4p8VE!UQZQE1H`b#kk*KAE9SHI,Z)h44"h,TAmbhAEZ8QrSSZ[UEH' )25Md$cZ--6*i-8Eri%A2JEVCrf[d([JeahA`ej`B)dfJrpFF6cd,kU@K%3F3$H+ ea&D*&rLTNPDmBm4f!pkaBRX[hL+ar3RHF@,l20jLXAd(lhK*FcD8#@)l"mT4BVX 8bN5aTD#8L1eAS%`5f`03*S[Y%e#QL1fIS%beE4ErD*VB6S)bA@`VS-`3ff93CSS Y#H9SXGd1CCEBhJq&IdAE*k%F)lD[3TPMf`,mkf2&GKU8Z@+l'-TaBQZ"FVcBESC bJYKq4fU0YNHJR#Lfcd$K[p(f$5JRflBaV)&6a(B'P&2&YKi+FkFY$Q@Hf'k$!Ya EfHk(FVVB2Jk&m@Rl#T3&YQdXrh+Kf*McQ@*E#D98E-e3bX6f*LL,a2DE8"D,l5% S5m6fGe$1%KYl!$"i5K&VNV92'h0E+VBU+-[%YJA+Z@,VK(+Hf1k#8Lkf$d%jAfb XQ`[%pMb8jECY(1[m3V(aMbi5@bd8pJ6DVS&5)ECIKF)rTqepdJ0TB`pB*ECrKV, DYK@cEki4'qZIY8mErfkYf"UJV"0E'a6@,'hX"jH)lEHJm2pTHaK+YGMiVa[%pPd S0ECY22X)rj!!0YB'qbGYc,91E'NSp@+l&3TpDAX3bNDaX8EC$fPl&NUMCQ#U1#c XCHaKl&hX@H`VV&Af%IB2pJhf+IB+pJhf#rB*pM(f42BNpL[@('Z"rB&pJIf!IB$ eclTRhE(Q@HZXFGBfDjUec"TQlE*2XJqbRPK(V"r@$HZ&GF*kjhc%ZBLc"QF@cLV Xcja01*1`Ph,'i8c#@B6pcTQ411p`&Z)X`Yl%fB-c"fF0cKLF,6K6X&q`Rh#1i2c !HZHm`$Q"m`&l0'F`cPMX)H`Gl"RX&H`4l!h5I`j+U#@CcMC(YN@cT@%M&)XP`p3 6Q@Kc'p#+$)hTD(BcGH"3D8CTb84#k6"G@R*YEC&dFc3*@cKXJh-dE3ij6X!YNV% )MI%3-`XMQ@Ji&'Y14pS*DMKZfHY5%HLYd65J#$Yf**e181Frf"k1aBkTV+NN[kJ YPJaPQq0!Dj[EBlP)+3!CH1%[3c&Q&@r*C02!r'L+a'fYZ5fA#$0f2*S*fqQP%(p *@iC1+@`206[98$$DQDH3!%bf$BCV-LJHk'Rlhc2K8)*ZQ@JlB'NDR,4YJjdQE0P N6-@M*DF#ACH**+k&J8LkSmShKa2CQ0Jbf9"@6,N%F,A@,Z-fae3)RFYQ%L'96rf kQSe0MQl$4IaQCDk1*(*jBbfr0T*fc)#Z@T-Gq4+$AUd+B@-fUK,Sk#VeMM!3GI@ YbU+qY5--S"Y&VLafKAIB&GL4Vk%1TfSkmYA5)9@`cDMB8,mZ5!5c*4e+ApH$ZI@ !@8CjH5S9[VI,U44K$Ec"GI%8kP5&A-R[5bD#Db1aP&(G',3aDT9-)`!fr%9-@B& R'MEHD649eUaCiqB!e03ePa-KGp11l8aESGbeMGeQ*h%a5Z+d&T)6H"cim8i8&`i &Y,jlbk&hVD&lMk&hF@(RTN,hDN,IFNI[FX+HlBjGkab&rBfp#aXpq`-p#`-Z00k (KHm&[`YeiX$E,TlG$@"h)pEZFNAI0XAHpBP#"ES,%V,9d!eLkc(&`Aq*C6Mi,r% *"rmPjZ$J[m4G(2bAq)b$E4"VFI"IiKF1rN[m42"IifUmJ[mDa&i&rc9q%DrJ[`D a5m&r$@+,J[mUV&R`Ai2BR1#r"R&!`Aq0Mq)9r0Gi!UrJ[mDAm!VqDa$R%[cAq"C H`Ap0eS$J[bEr4I"INrk#rjV%A36r0BP,#IjVmZm&rc@**`RqDa+A%IcAC"d)rQY H"8A`Aj1BS1#r*M%l`Ar0RiFLq+r*qK$meh`E&-&rc6ZJ#2jVhJ0&m&q6q,AJ[qB (S3MqDl)q"2meL@N+rQYq$SVJ[qC68!6r0Em'4I"ImrY3"2qe@-1#reUX$F&r,HB Xq+p&Im&r,@*`J[pDl!f#reV%e`6rY9J6J[pDl9!%rl@i$b$iVp8"4I"IkbBSJ[p DEi8Lq+re6ZP&Y,d,LZ#r&M&@`Am9[LriVd@m9I"Ike%SJ[pDr`"&m&q,282`AqY l8!6r$E#[#IiEB1m3r$I![L$i@i$e,2K[J28Jq'q!H3Vq'b$Z+[K[J2e!m0p!$SV J[fTr32$I!(F9"2m0["Z+i,q"$d!4r$I`%5L#r`Eq4[S`EAm24I$I!2FC"2m0%&m @r(F-rl9*E1arPiZ0rH8+XE&@IdjXr%IXebXEkjJ[ECZPjp2fCLMF)D#012XQXGd 0*55fqk"`Ci)fpUf`f2iD#RG3D2XXP)MB@+1X&pUHJF+q34[h$CJlC#cRNkMB1"Y `Yi!fpYDYBQ1[)9m!EDajlP,3aRT,L)ee`TP&2b+XCpBakjGeblTK[E"1@"qX#rB XkC'UMh"@BPpeXA$@$HG#eK[l#1ZHpFkCN!$ea(Q3!(f&X`2R+rBQpKMf&JG(jbc $1R2aG-i@R1rBBpJc@F2XGmi1"hXkC`l1HLkZlQ$Ll0[XSHcCV'AfDGBeHl+$Zl- AX3Hapl$RX0H`al#IXlmiZ$aR22ClpKN(QqIFa(Q*Fa,R)mipl-(XPAY`HrCHcR+ Fi6J[F6EM6-CCc0PhF2FF[,f'&r(p8A'QIEfEQ)CCAJliZL'5b3ER!bB9Z%$,*NA ,9R2I6M@&SQ8EERIRJk*Pb`@cdTU)Ji4#jp2&&+5-VPNA)kT)c$&S%e"(ScQB,H6 !i'RARUkL,qKMK!92(BM2AGc+0@lFdD009'A--Km$Q'D-2@@@Cm1aFUbR#BLVE40 fMKd3U!&d#,-FHh1kYijJLp-A-#pBGPq`1AYb+@j%DZ,k3S$l!heVXGT9k9Q%el' )`T*d0(e"ib+@863k%ajE89XV1jD[#"I&+P)Tf49m,BrUkLVC0Gd[2I`9Hk@kYNT f8(q@4f1Pl,LqpUpepA8DJ*Q%H65XEQSSEC%ecJ(T*[3B%*@(E**kdXd&-T6(!YQ CIMf2Jarb`ccfIIYrjM'8b!rbL'`lq#'qU$`1P[hSIh$4418ar"XlD9m1r%F+Y#L DJ$c#3cmlmUpFcR,b'1a%2m`Ma4hcrrRAI"l$'"`*G9kXqf'q&#(P'4)bpScNfXI UXeYDNq'KfMJNR'25QI6`p(%iMmcQQ1c'(kL2RH4%Hb@6c@N#mU#8SNKHr9FZF@p )JXjh8-cUkPS0!-E,9A'E*2J!C$`K##N0(5clp49e8K[pD6"6P8Gl9,J*AXP$-c" ,Eml'A`8ZmM29&T64J6LB'9KS3lQS21*$jI'Lk!0k+k8d(!2Vdf[rU[,B%KVU9L0 j1%Z5TGG(4fEbd6ckq-*kCDlf!aA$e`j8adp3XIejD!03XCU9kdHhThYii[C+E99 bG(Slp"qD$j4ZAh@mM0+0jR%%T4[0i`K+pd)HKe'kN6cd#bMG`(pdSA4(8,'"2(k +LShNS4&!Xb,#525+D$p3U(fGk'88kN"(d`@J8#U2BAkR3r1CbJ2lUUm1DAP%iQG &UqETVK-8qS-8kbF3!%h&C+S&Q!K!YAS3jccbVhU&6Rj)`"*meT*JiFU%ATRjipN HL3a9iNZcr@JH4fEld6b1c2B[j(&iYKr*Sc@L!B"9IccE$ra(IVBIQXKrP-GVpC( 2!mc)QS$kH!Qc'2L2Rf)@)hN-$`A)3efL-IU[D4"*(a!Q%FR)'$`3)eUelNFBlVk 1&J9S1T*(6FZ@d6`STF2!rD(r8(RS!l!'mS6V!IjM',2i3AdN@i3Cmhrc'+ZRS'l 5-3MZJZLU!U(&SQScL,N&`NMU8@i1lI&8X#3"Ym&qIfdkdJCbrlj*`dNMclPP@l8 d"'Ak1TRTp'Ap@b23aSTchS%@CL*5"B"kQ-cefNSZ"H-5PYe,[9HXU`e@0ejK)hS QbFfR!,8*#Jf03QeIc[`LL,f1BhBf#4([Um*mK[rDcC+RlE`ZcQN3BX@YI3VJ+T! !`bUEN!$T+LmZZY0`k8k'A4$*LheR6PSiB3H*Kk*bQS'qT3K`6i&p@KVZ6IR[&2, c"JYU$%NV*RhiQ-j*GIAE5PEGYFN`ZiC#4H4,8Xl$XTm@Z+[jmrL"&r)CPcp#C0G FfRZ1NA0q!Np1k$dhBFqT4Zk*4L-R'BfFBq5FG1#HXZ5HGV$R6)6H-jG'cMj`K5F JV*!!%@TjBAVI9b`k(QPZaX9&ZJIH@G-BCdr1'S"keN&mTR-3M'C'KKDQGRTb8UQ ALDP"-*'0FME0CA*@6D2i0iRrj@+r3XkdDCBGSdhL(a+p4A)0LpiUTpa%T'VE*%k lj,-j2lRT"c++L[m@LEY9p*MiaH@BR)6-2,DqXe)H+HQmMDHH8MijkD+eR9926Kq hiIR*relar)lr9h,MlBmF[6"Br*k0'h*VRbib,Um**SdT*b@0'3[,M0R(hhP#Nf( LYI!'cTL906DYQMClLSN6iMVE*cjQ6M(AGUjpj01GQqBIIa-M+Fm9l4-AcIVbfLq X8*k6R1LRc2Vb@lp`mqFIR'r8Eeqr2I("TTUU*ie0c(T+m*39`BA'Q0-Qh0(C[Q* pCp[FP3Z0iN8Ah2rZqpD83ErRcYpHmq#6PchLrL[R2$P*J3HX"MLaiqA+A4(HFAK jMpTi["2`(S@A&2`PH#IKRBah#YkTH+IKRBjh"YkCH)r'1`[[E,c(i*f$peLmFr% HKrGi[#IJ$H)p%Hp*H%r'H`VH8r'HKRFH*hUmTq-p!qm#[![aRSQh&'mChN9i&q0 GJ[FX['IM23I[8Vc,m*k,pcbmjAM2ahZ"QQejDSUTFP0rd)e+'&Frjf))ipH[61B 5V@!Lk'qSH6b8dcrk#8QP582IZ'l$UN3ZTJ'J,p#)LMjZ+mijd%VV*Sd9GA,bN`C 3p,#leLD3!&Y+[KP@ekq6Fp*dEV)jQdf9Pj@4@,NdNdZ8iTM1XP3kfCS,Cc0P@eU hPLdZA9`'iU&-@5J9P52X0#2#CKLSUkQ4)q9X#9aFYp'K5c)Rp4b$L5f#0HZU9L1 `+ESPHN$d-D+2&Ee)p('L&iXqA[3*SKmPqN645d5I*2TNdDH)2P9djcqQL6jGp,0 %Rb(k60'2&Rf@k,0&2dEd1D)I+rTFdBm6rAM46a!p+2U*STmNqXQLRb,kUD+I*[V CSTmMqP,4PiPqVZMRL9iZq[QLAb$kmN+j@K-hiLM4`Z8f6[(0%hfqk+H,ISES#d4 I@%JQ8*b)G+L$4'&dU[P-d8Y&,a0pNHL,FE&Q-*S)CNh,@Q&D3Cl'CeJP5e1"fHr DG'dNQ%d'`jXMiDe"qQ-A+6"YprQJVR"hj)9pHMe"EbaNc61DAKGVelESUfeE+Ga %lISCqjG@2[6B-cK3-GVGdl9V`XeXELJUrD&2IE0KaiirP'--GA6#'Ij`'%IAh*l SpJB%i3!hR9Z(k$r!lF"C+GT6k6NpAFFLqVN$h,3aa2rk@mV5m9Lca-$XVPN1Rd( 4*rU"0FbAFY%+6$Hlb6Te+)F9k`p%%d(@U81Jj(8Zl0H"P)ZQKJi8JPAd'39mXE) 8C2)pbqLDL&AdRa"#@cKmKIe4#l1J1@0HCFfUeI1#meC90&4!V9eAf8$'D+f+X'[ SkbJ$+Tc6XJYpiC+((R[Z0M#8N!#SAGmQ1kNN(RXH#2Y9`lF2DGbN%5p1(*Z!98A &M`ili$5HBA!RZE-K-1mp,@%r1U'MS0l"ldhB8,1KSRTekHUQ!3ijhYCK*`h&dIq rk%e1%&9j$!m6Kdj'9APS*BkrdqI[C4@1%bZ-Kc`R36L$m2BHGQ1$q5kM80GK0`8 R3I0-CqlH5GM8(8GY&2Ka1,8(r$MmbM&q(2iX$p8CLF-6+SVm10c4'HI(i3C-X4q ("dq-pq2`")`*IKb5ZKrPab&d-Y'2``-`5[`i2,ePNKq(jlP-pZ13!+TULKq(Clj -pH1S8f$m11TF'$q11LR'Mk21M[(MU00Nr$MUI"NrMMTaaSqMcU$aikK6DI`ikT` D2iikZFD2SmkbmH1Sdfhm11Um'cq11J((Mk21a2(MU&0br$MUh"`rMMT*aiqMcYE aikM6G[`ik[`G2iikNFH2SmlSmH1S8h[m11SF(cq11YR(Mk21q[(MU00rr$MU2#! rMMSKb)qMcJcbikK6K2`ikP`K2iikDFL2SmiHmZ1SdiMm11Tm)Mq11V()Mk21-2, MU&10r$MUR#-r$Nmq@Mi54jXKHT96RAU&GEc#ATG9YSY3$FcCUhX6Vi8hJ*HdRF$ DJ$X48b*H4#b)1!ma(1)ca&k)Ua!c)4j#V!1eJRFkhKPiCq)p'ZmXc[bFjcQVF`l RM-hjQE-ajel1Y*aA1BYbcZ3-bIQ3!,-IjcV1E*c(1'YaMZ+-a2Q(X`hR&XiNR$F i5h"1i!c!rXlHcEl-RXYqbPl*2UMU34I$#9%Ljl$paqQA"3HG'D1%IZBX2dF8li" DEU[3mKipqPr(,HS3Q'hd'E`RJm+Tj&+mG@mJ%mj+I@2`FCbE$SecA1I(jDhpjhA rJrH'IRr(MRXd$b3EQLI4+("BfdG"1YDaZI+",G4KdD)F'NiTZHNhb(V9rkqGYaS DMArYZaZ!FqM-ApBDGA5pKj!!!Vi6d`&iea986([ILI@#EhL-aLi[eb#MX4YRN!$ 4Z*IRbf-dGZ---KUlF3BCMGdiJic'ETa"4Q-hcL#MX4YRN!$4f)dcb'MXaKPN0(E M$$)DZh%''BhG1)1-aQkF38CM0miJSl%EKib*dr`iC&AdQ)rG1'4Hp*L2h6KNCr5 BMpdiC($dQ)rG1'4jp*L2h6KNJ[5BMpdiC)[dQ)rG1'58p*L2h6KNRI5BMpdiC+E dQ)rG1'5[p*L2h6KNZ25BMpdiC-(dQ)rG1#30p*L2h6KNdr5BMpdiC0cdQ)rG1'6 Pp*L2h6KNl[5BMpdiC2IdQ)rG1'3!pCL2h6L%m6hQBcF1@6dpjQ-h$YP'2HCM0`i C56hQBcF1@8XpjQ-h$TP02HCM0`lC6chQBcF1'9)pjQ-h$VIL21CM0`ia*irjf)e $(-pM2REMN!#ae@-qGZ13!0A9Bcjfij!!qG9M2REMN!!GeQ-qGZ13!%(@Bcjfij! !CGCM2REMN!#*eQ-qGZ13!+h@Bcjfij!!dGCM2REMN!$eeQ-qGZ13!2h@Bcjfibb (kM%IDb(fM%cdqBP'2*2YBFdVJGqB6[MeF"90[4makGGcCF4da#Z@2!*IkI)l&Rj &p%-HVYq*m,2SKcaF[j2K0hC+#S5aKRR[qlTUC$lkJER)pRZ!Ib)EIUH69,E"pM[ cZl$*(5bR2`cPREEIHpi'Qq$XCi!&d*6m[[0K1-JY%!YiBdLalAF*HHq)*p'2qFf arFlE#*YXN!!ZZ"NKQQbrDpFbYZfhq((ic9"qP[9VF#!qa*Eh0G6#,ADm@jL(MF! CpGIL2mECISpc0K-QP1Br`eF'EEqVih#`N6ZMiFe3l2a-`,mf[N1rYc-Rfqr*cm& '2)GqGc1flIF*RRG)r)Cqpc''lIIY$m%Qap*HRF&r&0PqlrKc&Vc%H`M+K9+AV$( L-I`RRUpYjf(0iL`YG`fe2SXm(KFrpR,L,FcM1IcV%MZ2A!dFL+p!QM"(MVAVccT Q$4b)Td#Z`RcNe1[GYm+"q!PNkeF4ldVEEmY(i8#mK2pA!8AbZiBc'2%4b$8ASh5 P6hb!-aca%-Jfe%G!kZQj6l&KfAiYAk4LriI*'B0i"rrlPr,eCmh"(8F+hk!Ikdc UlrYA`dBm!a,Q)SM8hbhr"K[a#dMEAd,j+pZ[r'1`#FPa1hU'1G[ffe604QRlhF! rZprfqk0EB#-H`IcBUdTY[hrjG6C3fqm*p#e,mRi,mbEH!(RU5VDHH$E&(PUB2m* 2dJ`re,rVe`SrB`VmH1Tb`@r,Ck"m-jk0%9FZq'epP(mCcfCkm[Z&*lVkpk2IJJ2 a#XKfpMZl,UfTV'pC-pcHR1rI9S#cZE#-ErrAVRj``cIBk'fr2hkQUkpmQl-*DaE bTm6!TDmrm(Nib+Q2$rp&9aj2A`m(B6[r''V,k5Y[jlB1jcc)4eM2NYpEVZ*-CrY pr%[j[Q,0B5qid2El0(UHdeI1B`d*jqD0U#0VEMcEhM-20Gr,@5'Hc2DF&2fQhd1 mcYUU60B`Vf+YV,2pEYS1[iAa9!Eah$bHiP`r(h09Mpqphq[bFkAjGcQla%1pR(5 ErjEe&`qT2P'3!#MkZ[&CpDr&iDGK@frlIC'pe[BEphhZ`-NTQ@(1'5ICpI&qeNf 9q,(r54mYiGc'AXHm(mM2@pEFQf$E)(lXmABrXqjJIA0fB&pN(hU(lGI%h13'RRr %R'TXXIf#0m$'2QRm(`!0%&4ME'&`F'aPFf0bDA"d,VN!N!pdN`Q'!*!+J!!!!8a X!!'*RJ!")C-!!!%K68e3FN0A588"!,5KU6Ued[N-!*!&!CDB!*!')CN!!$XZ!*! 'Xim1q+1M6UkAEFe"QEGZXp0LeeVjZGPQ$@*QCfI4JCYqdH1$MYfDZ@NV1mhiq[( cDL$G,M`c&lhXmPaBbrPHGRlAq@BArd@cpaE*,GV!##GX-FmVIJYI0-)l1l,2)rX PYpr)`J8kJ"2I@GIhp20N[LAhqpKe#pYN1A,lA2M#1J#f!(3kmNS$N8LVC9RCPQ9 2Xqcc'bhlhCf@0Ai+I$jQCpQikP-@D3ifq+248#6Um88MUi1"H-,AM(,U!khqp[E @B#`3$EA(keC9KTVQ,`SfGE5d"+1HfSkfH#JFl!PbM+I5hpE5i@m*HZU#mALSV5A @%fH@KbhQ@4*X#dEpm9#NV5I+E!qDX+drL6QHdZEQ%+2l@cdel66d"UU,G%3$38p p0"MX$9$@%BY(`Tk6JZ[1LN5EHf18"J,"@-cMmmGAp3DSpdGEJ['KZTH(@S1H+VM e4eMB%@TYpLaH'irkH`-NqP$Rfa0MlVb69)1K[rVp&i9LrPJX''jU$8ElJbaTM64 *Fi9$CkF$9BEDeU6G(4$YDEk5XZR68Dj`1jUM0`8GBK!-bXUVN!"SEp29qp#fEF( @(ZpPrM2pc$lXEfYQ'AZ"689aX'dJ3T8r8&-h"!%U6Ne([,fMYaf8rlCqBB"&NF" J$&f(UL!3)PekRkpX%#ES2`)6$,)$*KJS$40dpbdZ(r"0Pa[qTE&`ZY+e`E1h)S` #MM8CHL04Y[-E#C3K1"+QRq')rbM&N8KTML-4KNL1"%Qc()N`4(-Nb$DH)b(54'G c5rB`(3Nb3(AF!'N3Fk--SjJEU3I'A2pHV(,kF"[IkBSaK!dpM-IT[cl+)qiCcT- +ddGk8L%'@8mU8!rY538BE*`KiL0"-Xa(`Ja3(cI!GYJB*6pZT'f`d8Yr8XlEUTi Q3")KcB!32%0r'')lpf'8$2&KM(l@3qG4bX-`DEj$pb'b``KTTN2h)CV$#0Xi$[h 6"+HVihVB$5--8"[(1`e36SKKG(,#p%#6ip`,2DV0YR'CC)"dZrH`'09HI45'[KR qNSM44ei5rS2-*4'PKlBN[!HkBiL`-%+'V6$'!&9a[)GKB*5N1'(kBD#ARL3mq`Z F*LCdlf)PNS9(!@YP+0Blkp(0k#P[p@qPQZN)c$RYVM0X#,A9XZA5!mQemqB16Xl S[hKY)+MT5hS`a8!lTQF-P*kHdAf3!#%1&P9L$&69$6"F9MI56Q,FAeMAI`"I"X[ +!!-eGEb(#qU%'8A3rP)kcQD@Yb5'VT1&&e+mjeV@14YTf(+$T`jKHMPM8PeJDa1 [q21@LJ32p90ZKFVAYUC@0D`!9bJP9kK6A'&Td0mFM(TAP6P*54U*A'$)Y59(GA+ cV$b9QZ1JDU#6aCH6UYHjq&pK@40@@YC%EApSii0(4+bjKld0XA*+(l*bDLm`kr5 rEQR9E5NBN!$qGhX2NA5FAIf[aQ)lqeplZ4@3!%4erl[93P[[122REk(LahL2mFC @Y6CYm8diaJ1YDTa9kSeDDbfhSTK2@&9ePCkU"KNZ`d('IR46!`cae'jH4N5@Z%E pd9!`j[fL9B8jE5+ZTp`rE8jSaEcQSe5SLVCi-2S@Ii#*54Pdk(AHJ,@e`GS$Upb 5"A4GjhPR5`P85H&4&qq3!+5pVESUEZdpHJTYeDf,aB0KF(qTPi9`9c%i5fETm&F a%bQ,8de9IbNpCJ6H4C@9@eT#94LTKb2aL#i5%e(&F%UQLpAH(NMQ6'-UiFGR4Mh MPXF'&eXDAQHld0rD'SQdHCB'@pXYM2%XC15T#,G(SR'2kQaI3jHj`D0(`@,dq@- "6&0Sa9Ja&FR0JpNR!SY4!Y1UCiY@BeP0H5)$jCG-5!90cPM&jJkmYB-lqZak9l$ j&8(hQi&0,`5kh`0d6Iqh[+lB22arE!lF04P0[36B-[I[QI+l*8j0m$I0kcG0j`@ 8RhMSmGLc$[F44mq6MG6BHXZ3!,TR*1efS60Z6JfAZdE*a$F(fa4!(8hm*#J#a$C j`L-*Pj[`A)&Q-%D1NSa)Kd3qAH2LlR`H)`bQdH1-$Jl"haNG()XrpLHS8iUr-q( JZ%S0)R"UmFm6@`MrI,'GKcm'CZVm&IjMaABYrJ9LZaRr!m6fEIc(LHd"r![&pM$ q49)LjM0HE!IM8LbfQEK-%"[Vp$+a9H0bS0MmZ+JT''bXdd&LHaXZNm6fIP`QLqd bA,JVJVCVF*NUYZYaBHkdr4-Z,aIE"ZNGfRk-bb[%pRYF$Y@f,0Ed-,'p#KH2f&L r9iTY$Lk(LiepaMLdXFq1%0X+A&iYYM!ZVa%EDhQNf2i5PfPL@ir,8@+l'TIALZd cZ%`AfeG`Q5'ffh%j@QahiH)9fmp`+4%EkmUk%5,BPmH)M6dc5fbXd@ba%8YB@pT B9pTTmq%b9fcXdGH*l3aFjSRY,h"j[GJZ`@@qf$k-bh&LBbf2&a[lmJ5aXCBRLSf eI)2BL$%,a2BE`6ID(X9PSEEP%%GN0*[$hPXN0[E!BV(4TeaXV185XE'@5m9f*Li 9BRXR,X[%pKjFe0`2YJrK8LQf+h'T%YYRF5'1d8DmV"(EEEJ`ApUqKmXEaFBH*9E 3pJJZGGU@5fbY&aZaE,RBL"dR'`DBa"m2HimpaejM2l(Ha(2f2(ZG2FlHCNqcrZ` 0iJcaP0MUF"GL0hZ#p@HY@@2L%RN,FCIi3b`J"V#hfIr%-')4-BKB4Cj#,'CIN!! A%!H*Lm3PiL$j"2'1'%d14%j",N%14+`QrK)VL,hN0Z`riL"aP[e0lX$qBlm53iJ Ga!aL"6'#f%#X*Lk3!"m3!iNhj$V%9I)ImJcb#h)2mLhb+IBhH4Zj%MQEB2cSH@T 3E%ir$T[5Me(FGdE15aF66ErJ"8i1Re&e08[[NCN96jTiEAT2CTM!"A2-fIjZMT` m@l9j(NB013KRbqM+!(H)("YaF-e@Z'#-!`BA&c4IQ$mI$aIRKrd"daY!Z,L3!!Y 'DD$MNCJ[C#PFN!!Y4ahYI"0VFN-*&aHbq6iNp6$Dc(UHf)PJ@$P'Z4QM1YJM0-) *mdYp2RQ6q[c"pL'e)-B-N!"(E9fYXbVTrr+SApaBlfeD04LRDqP*he&j4)IbjEk 8c)R'SJ%c3&h0!AXTUL0BXlRYf&99[Z'kEcpmIUXhGqT&)$fR`)2MpAF-CV+XY&D f`25Q`8a9(LfKYlb8Kf%!JeE&`bm!)aq6U6a@Sih5FE",KidfQ)[+)ccB(MZ113$ ,H,aJlE(B[VUU2&El"p%UNiIcD-plGULI#cb9ajDe4*[2)HB*eP@3!bNE%3E1TSe 3[GhKUj40#5rQd9!QQaMfeE9Qi6,C`*(Zk1l99Mh(9aNa!,!ZJ`@l(FEbVPeIJhP -PddM,q8a9*!!Cr)B"2,GH@3B`FimJQZ(#M*k0+2Fekm*4XQ9HIqE"k5@*2,Be[P 2jf%%Q,+S2',"PTIkV$N5'"T(M"lLY&PKkV0Tm9l2L@&GQKNJ$ai[QZ5&ZXTU'mX E'BVc*$p6HH!pe!XN,6'4H,&T&CrH[)G`mc&r6!"3fUhGZQF#-*!!Kc&J!Q!BB0c 3N!$c8Lk'"ZEHhfA2-IH42(Bapj%mGM(hlARXC1kC2-`,c,f[(RZCHemHHjPl*Jq $!(-ILL%EBJF2emGQFYfbB[EaBrbB!23MfR-6J$3bQK3Q!%rfUmV$+$%"J*+&fE- mVS5%cHHJ23`1L@b0XBI"MH5aLm'0j,',`@h2BbH$bq64($3!2([C`q$kkT&JF)1 mDhFHqrSMN3IfB4X#qZ-TCYTAMlh-0*2(-)iM$b8jBk5Z8D`26amQ%B`*4HQ,%DU Xf$eKkdHd%"keC2+SD9SpNJH2GrKKeC2e8(QB!jJJ&h'E!HSac#LIlSp)dfS$3"k ')'d9@,@'SES@Ha$VSf'p63BG&--4M#T(03$kB6`I-CEak5AN1$cqG2,8#Km%2Tb UFGRQbYaF[cF#e6ar2Qr!dBmHl-j'mV-A$r-CVV84)-ZZiba%GeV*2[!*+3er1!K IU@)5kh)@95jT$+`*09-K38-GaPa*e4I5ZJD#*C6jLHA[END#aRD1if-l3G4*G"A FQ9V@D"`kCSXL2d(fr@#%3j*LEPLF6VlNNIP(Y[a*RqM#TC&F2HmTZ[A4'5RH9R4 6p4e'QZA0jVTcN!!cJc5r!B%apVLcMV(,&NBkfTUa@k!h9',fcLNchR9`$5NA&cG 89#pUkfJe!#`N-)JHFpaX`C&!C(3l$D@eTjVJ8-!3F-b`%fXEEk+d+NCaU+UV%-& @*VHc+Kj[Rep5`PA*hPK(QcF3#CHd4b20(B&iV'4emjS5U&XX`DU+@)Qr253ba`` M"a+e""'lhkSEi3jIZiApS6E$5a2dD1YdrG8qJkGIrCS%iMbaKf(r3%'dQEQLKdd bKfp&+Ck3!')-+Db3!*XY+0L3!+)1+BD3!))0+HU3!-X!+Fl3%A*)XBB83%JKKTc N8F3KK43q)5M4%B6)f3IeA@`@SjJ5D8KKKK5$5%'2Cq'r&[peq(1$l9[aG`3FFK% j&hJl)K3TX,%"rdEm+@#4!K92`Cp[INl$Ri)A+3#4BK%T$2&dr0q%rj[aTpK,lJc P-MlZMq)U25k`idT'L[6JkNUZY1I@-`VEj%Uk0IK6*#-hG&%8jY[aI`Iqjq$2c8X 8)HPX-1&XJ6[3+&D0JKST)*%L%rPkea'A5$'1&-a)mBZ1f%qq@U0B4NF!)m8b8S! MK6P5i#+&,P+J)PIb1S)9+GD43K`TZi%L'bQLND)C1AQKU%Dq++E`5fiFidT&EK3 c!#cDrI-ahmj,Rjf(2M(&('+m@MiIXCIbqI+0G6,T4$kINNRA3XR+)D1E9,Vp$J6 jI,*4fX5'&Phbq43Ze&@Di6L$L`[1I+%U%Je5$Vk4M5Adi%+Z1hI#LS&f[p&0K@8 +&r+5-Lc6iXq-TkGE%N0CHGAFHAbVD&)jjMNCPQ1YR+PE3"',L2kJ&L1K%m-BF,C Vjp$(+2"F(DQ-96Sd269r8K'58"#Le(*3l'24PkCf&YA@V5eFG0R+jpiUUT,Xccq )*6!"58V+eic5!0!q+eE%i[jqd9d'K3BBm63K$-!fE366@m%S&`Rfh+6iSLk44SQ BL)1IP6FDKiljSh')N@15FASRFr$LqSqaSrP`,9("D"bZ0$SJ)cB*FEL1D%58%Z* `"G+id6KFSe3i'SGVPBTbYASQ2$(XUZ0jEK`Z4hPMAaccJ,3TXqNK(q$C[!j0V4h #Rcb!'%rmjYmmF)Mh([dkJCJZb&k-HR"TfYBc!B'i$+rRN!$PN!$"N!#GN!"jN!! GN8Q4lC&KN!#P#D2M`MF25ijrS3&hi9P1BS@CdaABC$LKqrN@hQkC9TS#jFHVjSU f8$cNE`fG(5b2qP[#`6D$`Xa0jemIM)C$EIlirk4[+jCRTMRJJ4PTIbRTI[V20DU 0YaJ3DQ1l$a@cX1T8Efih`%cF*ajC9V0SmC'H)aH9eTILkUXSUqIZA12+FA#!ki1 Gi6*AiMS-MZYPRAFD(m$IQAKm#ApRaHhGq-Ym5+8M,-(QkPV1K'MMHQ#C#pPF`bY LEZ`,F1%NKlC2im**#fhIaS8VGQRl*5jFYFX5F9fZb$,-iTTLVYbPM@Z#ZAUA0Ul bj3THfLjRUi[Y*PbiJTHf1h(K+PlD(X@&+hPCGUlFj@THfVKUQ#YkDH2DB1C1fhY `iFTHfMk$LdbJX[m&&kl[THhAZ(#0,pZ(qA#G,feFQbaUfR1iVTJp3KYVaM@rY(d B&kllTHh,Z(!p-fhr,Rh+0Q42FYdcE9cE,0#9beA+-[(+*4[K+QED2SS,9ch64Xi KZP"clmH&UjVCcZaKjN)EIEJUQMDZBKDK&hPF1mc9dV4GLSZ`q,`EFH'UDGVZ`B8 VT`N,c)QVTfPMMEKkQMEfPQMpc1IkDUkLTZd5A,L#QMEL!AZFYQrK)JX"mRq&#eG 6%fVBcea464YA9(090@eF"ddlE9cM,!aSc0@iF(deEEIM`RkNl8&F4&RU@1+&U&N Gbaa%3r9BVTN@H54MZFCD0"+2CEpbl69YAm'&YDAY2h$KUQY#(r&8&+F@X#G&JhF "X9BdE"G`*6AYY,dI&kklTZecZ,!(DGZ!L`Jp,5!ZFJdfiC4iahACY,(hZ#+E0[S 3%fJM(R$00Qh%FUlETZekA,KfQcCL1GG[drBlA)LVK'MLSdM['FIqj$TZfZM20Gb dmE85eh(6GM%Zl"ID2Sm,qj%feNmN!Srl,5kLRE@3!&JX6r-,L4'LK,@3!(849E@ &l$QZmUEY-Pa%M@lKcEL)@[A#(q%L`NB9IH#UEpU)hD*#YBMeNh8D4Fa2T(B9F9f j+'-Z)Lq4+9l4Th!4,Da&a#%4p&Ad-eb)Kk3Rj#hb@QXm-958cSjRMmP8B$cALXZ Dl[(%BqC,'c'$Dp*TZ`mAVN[(+5CQF'dkEFa*"%!AXfEX"GSBPpb"Y[@iF)8jE9r %KD[-DIXq,XbG0R)GHIFbJ9b#f%JEXHpFE6-Q(5jUaV'0))2"2BF,i9ik@HlEd4H 2&PCD8&e6A9Uef,ZiX8rrMZ+-+QPFR2[HBiU4!,ZPFma!#a&-%%piKpVB,+!,I$r K3fDI'8kDQjD!X,!Me0Sm[bi8aRB3$jkMHDE&9KhGhKk3!,I,TV569ph-Gmi+&2+ U`lHNq%&HpHRbjYPSFXCXhTV$BhlCQS1*#B4L60V5"Gelhmd$UpfI+BrKEVI+8mI -)dV3YR1iTkp[3@MUb,BBR[6)bB`PG("r%%,SQKN1&rC,')5ZqAaPKPLKDm""mdS $Q1H%VZR0qrUP'qlAErMGZ)dE[b0EZ!edqTP-,TZ8H`TJKK&IJK@h594iA($D'+@ U5$RLAkKmE@YU9F-+F(&Xd@d0eLNZVMAGHPFjM0aj)*h)"BCFpIjDNU4`QMb9Q[X S@aRj!c,XN!$3"#qqdKk4U!3[1NiFM80i1@Jd$Km@6aU0Sq6ZC#3j)3kP,d`Hc3F GZeeU%q*35X@)e#BL-+iM8TX3KiXq4k3f)3l*k"4+D&+elkkMb!F3B6b3!%[4&bF KbFRSHKca013C"&[b!dFb8dT5%rN&X9PNN4J(MTeNfikJ*A)cmLjb&[)UFLEb)A) 6mJPb$r)&FJ'&mhm8UUB2"aB8*q)TZ[A4'DP+&0e8IBF"94b"L9FSjl0U9,[a9Bf IP$)I*FQ(@RbSa3Ab)A+K+8GaFG%rmeJLSVY2D4UL)"XPa!Dd2C%KeGJSDTYbSX3 B*4FSj8403NA)j`!p+p@(iS'8b+"8*#Ui8@TZ8Nk8Ek1Nh#5Fc$1L'8d)NK$0*N* GL*+8PN1T4b9l%#8V5mhqXGNk1EdkT'Z,QRkHFKLH-"f`FH1$9jKC%-SBFeiK-[T 5Z'!6&c"3T*!!)h2E194H"D9`)BY2(U(Rk@q-EVJJ"p[[45l9miGbF9j8R*2)imN 9`ll&jCk+-*G&FDY$EiaB[--3N!!(MaG0mN*G1F@UMV5*V+kqBeG9q3`!UbRilT1 24JBhA44`qZ,e$lApXY*DkBhH0*LTbU-P*","RXqMYUl@!,#6J0K4[lLahVXU(Rj "Ea!hfDSm+"SK(DHU`F0''ma&j4%HE)mGaab!V6aH,)1)LA#b2p99jI(iHk6GH6J EJleRKrT%*6f6Kel`-RIH59YKla$pAXN%d%&mZfX'b+1UUP+%d!fFbP#6`dj3fVl Zm&@+3,SAmfJS%`&fqqTDXh#C#1p,Gl5[BD3H[XU)!@$421YK''!@6D*jVZmXp,H f4L*YRUA"eRj%8hN-BcN3VkbNE2VdJHj`mTJZ!J0IbQ1S)-rN-3MNZr2)-)+GH36 A$K9Np'K'ZDpI%ibb26#B55B22S*dmYM@q8rR-6aYU!f+&Vj-Im5#)Jc`q@2mQ%, e)p&c8kJdSTN#TP!U$j&Cf)mISra-jB&eV5q3!$5cJ&Je23&36j4kJi`a6d`!$"A -e!M!#,"TE'M1ZDZZCJ8Nhh&-ZLq,6@GRrq"$&U*CA!CG0`)8&ejdXE1"iBkLim+ A90jlB(le)q-I,AeNirF+,l+,*mh`M,PLHAA(dTrN@DI8H#*@mH%4Dq+-%Q[+SHX 2Dl4Xr,2`chlYj,LeFY(,TK6E@3ZXcTCa'qaLHfRRdPZqflPbfU([C#6PZD"Ph-c *pbqpEi(b,(+L(c(jrJ[[1rHHkkCCGHpDpUkfIfbXUEcA@XQXLce(,2$-X(*H8h" TCmZ#CCe[1@6K$'[-c1-rHINej5@iIfcpamZ[ZrIN@eKCf32rhbXL%ES`Y3e5VBM F(%QYL%5NFF$preS4b9YfE8f0k2lA*hY*lA,RQE9GA,FZ&Jq'XC1N+HU2KS*FZM+ Q[+*b-6+fjCiPpfbjjmJpPhFZG*1lmXFpedd`kf$+Z06CVI2ifjSpGDYDXHZM,0, -&lKjNXSiZHI,[9"518$X6NRbh05b#j&D69fT*aETL!DBM5S)SSb9Za1pJ(IdJLS SlPQijRmqqh0LVTAlFVQI,2Fb8jXqp6mIB[T-HATiM&VZEPQcC(RlE,AFhE,QL2q aiMpAl+p6*-+bjNPYkZAqH['I,d[MMa1riq9qJ[LGU"E)ic@M%Pr!M98k[e,"X(+ a,j'i5q9HSBQ,Y8cb1%RL9+UmmcAM-!#dL`QLjCf9qqDCJfl2V0T2VG,AIqj$Db6 j04dFFpd`bI5LGX8d`4$0#$Nq@`[Rc#bmH,R$84iI-VjhTN&Mb0KGej@&lc[bN[k kAYbbdU"49kL%'9Q+q(,ceP*%dq3b`j%mI2jB`0qD,Uc1`jpH4VXl$q2%FXAfpX' &KTQkQYf@0*U3!&H&Q`dAKBkSM64r,+2[PmV`h0ae)!pM`0c9-)#FrUJ"J(%E'ZD ZD@%6HqDZ)hRXQVZ1j,&VlVSpMjeced`HjS@jDemppLk4lmYMlj`cNiG"B$ij&!0 P+)f&Kf)dPY@-m!r'b)Mq-#G*)P&j$#qMIl*I94j'L@Ad$D'ffE-mDqI0h6S"1'J 2Jd-L@f2XBA!MHHaLF#0jl'*`fr2BbH!bH63($3"Me6d-VUmH#3Bhb,Yfjl'[2a* j4+,0KS$qH)UCpY9M,c20j$'-imJ$3$dd)G*jU-dYrBG*"'0#8ITLK#SVGNrBqK% YK+H%Q6aUQPD2j-(M(4lF2eN2PBFjJ!PLGidKS"l$M2,TrSJdV6B!j*&iKjZH"jX rhZ'D@ZE""X!jlNJHmMjdS,$2[Tr0j''FQ#XrrAkf0a%ci(akrep$XYGqjF)lA-Z '*2U*9MJ@hm3#[rTEV1,[K0qQ#F'lEmAMAIUeGIY044jM*)rX"j*qVi4IMZ54mR[ e*j'lj*(b1j,aLYZMi%6CB`pMJE6Ip(N`cG4q0e&CYmJYQd&-VpGqjh2#)`*1CYb -b`HehhT#VQbq2KVYE%YqYl)Vp$CRbdZ#28ElRIF4f,3f!NZaUS1ehp6,BG2ES#h [ZAKmG)(f1rI['&[l[4kD#r)QDVq(I`N([ChDHJ-dJ,pFiJAR`%&V-l"1[4Veb0G q0lm0$L*ekZd68%U2p[[!cq!JJ[a2q``ZNTq22RVVYA8DqY)Ud(i&9'5K4&h!leZ -VIeqmd2BaS[IpaP$qhf"mdTja2+Q%1U4Trh1ZJ%1U)1+GcmZ*fUrVe"10B9Mi,b CD#CjP(,h0@9L))A&m,GrS2fZI49VTZ-&iCmp5rYpmk0`1%MlVF)+mecT[iR[Km- NlAFkeX`lrAVRHq%`@IZ&SAXMph6Y0qFAFaP'req%LqGhk$`3Ql4Ip&&TAF1) ,hf&2DlperiPk5$pG56bPpJh@pHfi0'QrFhi-'c%(Tj2LAb6HlH`P*I!FmHj0pPr cDf"$[kYiU+[6Ij%I`%C-3dQAXRqqUIfZiC4*[c@aPpk0ba6Ypa"jbbZeAmA$Z(e 5qrd#YEF1Pr`SbF1Vr6l0h0KVL,IX`i")bI[iIiE(%6VHLJC#AMLZ*RrZPZpQq&Q Gm#1A62N4*iVK"ecSm[X*kaU1Yl,r8hkrCLh$mGLQr$V[5H,kPHmK!G"qjk&h(9` r&Tc!BZq`RpM6dUr6lL-ad(lRXpm%ekqB"4[iJ[+l,SN69a(,MY*qNqN[Z&*#4[P DmCZC`2@XM4H3!'"S[iZ!Sm9hk(Krr585#Hhh8@#5JqXja&d+&dI+2X`i(&bIFaY l8I)$$hC`r46LLXMPZ4%eFh!pG$dF@!I#&rYBmM[ZHl#*b*`Ta!E"P3EQaTV6Mhd Rr6hRBl$0&Vqh*[(id[@`N@[JI1+U*+lIb$(!X4+2[5LiIYZ(B"1Q11AVb6`+eX* 'A-@j#BT2(&`ri`3iJ*IaA)h(M`kZ9l0ASA1Hje2JJ`kZRmEDc0GqRmAieHRA`M[ KF*cfqcB`fm(eVei)Kq1ehl@d5AiR%lqC1mi'p,U$kaEja)RDlbl-M"aF[i9B)US HV[Vl*+iIbCj6'JP3lhp0pYq'mf%V&EqI*[[["[)KQC0-)Fj*rjh1@$+RZCDm8h$ pM(q$6GkLh3`FFA#pKRdXNJfq6(r"p91r#*ZmJEZD[%j`rDHXf4+*pr-NVJIBUdZ ehhA!p`5ZZe)%Eb$Z1lLHm[Z%LqXT[j[B%i,I+Ep(L,@#pdNrH`+ap[*`E(-HG`- cFU@r[m8D9fLrqm'E(EbriH0`N!"jdBmrRm6lNmQPjE8'"!8Nm2i"FPajqI!6524 fm'-pZ4mj%HQNLrF2-lE54J1r*0jR,bIq85)0cJ2JlS,h@BrblBq-Hhi(I(,`rMl bD@)&8Pk$ZBL$pbIG#!mUS'&q,YjI4LaQ6*`,J3d1hPpq1fZXr5DjH(mhXA@jq,P iIb0c1&RmA,ar,rNSq4VpA,`[[K+f4Zhh$I5[JrIj$m(K&)RRi[hGj!BLUQf5LrF 4pZ*TfZqE`'m(lbpm-`QjlS0#p,Z$pc2rPX4EqaheY56HIj!!(*iaL42A*[ZeNdm [9QJr,qB6$YlILaMbP-BZB!p*IK1)%ASDD-m"Yh$`rLaU8Y!c1IXip)'$pe2*6@A QplP2*r(qpq6S-NZHj1,peH3pmY*MNS[h2fIrb@aqNS[h(b&hNRGLAbFh%Vcr,@F k-Q2q)6LPJrIH5q&!I-5jMl-6`IZ[XXBb`lZ)p4@mrc,jj4VYpb2JZi2h,b0heI- i1`Ij*r!q+9V+(XZk1(LIp,0Zj,c!`AXhAJ&Y-`AAAEmbeXE"p93mfKeqlrT0"*r *U`c(@lVRI(Baqqc!F#3Zp8rNY`'A"El+@0c+2[0LH-L1L)f`CFd)YmH),fiH%pP caCJAmNe"FUjJ&c2'02Keal-Q38kPijI+qm$IUcc`LUMEE`PjihI$rNd[SZb&a-% l9Iq0mGm&QjjlfY@FGBRI,H3-HUTVej!!FiYI(EQ8[)(S[!DA`j9IlMh%Z62%laX *(-SpQ,-r2BHe*p+Qq8VZ$mJlpBcI,QBmM3HjGj&IkT'qAFRCb3HdhpGBHrd'dDi LhekYr6l#fH'CN[FjbATF`4ip5rZY)*H9HPa-INPm)ik5%dXpaR%HZ8lmL'G5M`V 1jZ4Ce@fXZkj(cUrB%q3Tj#ANL&+2%mMY1I-NRfE0T"iea'R1hiL,ld[@Bq8lBAZ (q*%l5Mfma$E@NcbBFdqTafVf#QHrk!1E[5Mp8ImJE-`&IPRNNe+2Ga0M`%mYkrm "!*!$$3j8Bfa-D@*bBA*TCA-ZZ5kj!*!2d2X*KJ#3#S!!!!&RP3!"`kX!!5'6!*! $`8e08(*$9dP&!3#dSD1fYM#)cJ#3"3*mp!#3"MQG!!$8q`#3"QR@"[KB,Zal,EV `*jbfN!$MK)8RR($#cUeZqYA3-m1ATjB$6VV@cKAiTAmK#MP-mp@4VH(EV'm& rE011m19AIZ3B@B`[j*EMj(D%%hE,5BlIFQcKH3YCq$*Jbj%GiB6ANB@e[$eCb(, QXHh##&qm'+(,XHABGV'cYb-lAYcPC)F&[!UmRT66,VZ&acEC,Zcb#!#jK8cfNG( bC-,*Fra#+*j1HlXFj&4ZAZr%,MrcmcTYELIADp$Pa0k-mS[Pj6ISE@!1XM0cDTN $kqc-bdPHCqELfpNJc9ri`THciheqZQKc1l*S(lm%aJ,)Lq+IDRQGc#lDL@ICf41 HPj(E"cdp`MS!#J%)m#Lp"RRI,eQ@GBePC6UYCA1h@XZm3FZkk9IaH5#c,)2U[XP q`GhT")(R"rCii1pfme(,eilb9PEc6f@pfF!*pQdCG'GVaD)Ef"1e5Z59h5ARhHf X8bR@R+*V6lT4j&@+iC,r#&Y+UI4HYq)'6Z6jP5A[N6C&GXb&S+2XrN,"NfK,5RD Z+SDk!&9q,FLlpP6JZZFF*pI#b#rEplRl2Z3(KA1qjIQm'iEfZ"20RA1XGS+L'hh prkCj*GFHGDV9#jk6DPkTB!r04i&ccY'V&cH[d(Idj[XD"5(eN!$dQq+&6KLkjGQ 5'ea`RPlbCl8BPR[lh```ak[XHG20J&GB*--'0QlN'jCAqGbkN!#ZDd046KiH*D' kiUJHTjb1F8Y,AV1F[BjNYpbT&14EkJ"$H4[-U2HXF2+jbDqAS[+I9iZUYA2IUIc 5ricM&$rrPUqECi9,KDDqX(*mi+dbaDqT6(&Z,P-#T-S8YmUKi6Gm8YmQIZ9KqFd IQqrZ6bTkp1Bphd6[`$Q0hS&r2AS(hMjk"fi0k"d%#0%lF)c31r!0d6Y`M0!lm+e $lm!c41q'HY(S(IJ'k"hjKE!315GK)3UJB5&b-a!3&NNGHYHl0K5P4Zq`1$cd$Vc Ud6[TlD&hdM1"hNPrMGj*[r3r4qJGq0DMGq!GS(INee5Q$HJG"8L9U8([T%rUfd, d$Ka$p!E@Ur1Pb6Qm'mQhjlfHIAX"'ZQhjjlJhjjI%`(h)L3CZ1HCTZ#HFj+$Hjj T%Zijel0`cc9*`qY,aqIKRR0%a%2(*-8,[4XiAKM"*hQKAm$SDZZPRSdRI"YVe1I MYA85%R,2VC'4elQ(P,c10FA*k`,iT,c1XH($dl6FFflNjCjl4-a$a`ePfd60``M TXJh)HCe6q[H5p0cc62$cf@mMI1MGb0$p!'Q+lVZ((0hhbj!!G$p#JUAlR[8dhAG 1m(6IXjkSqmi48rGG%e3pA6SH9rHGkmKk`M&"!a2H+4kBL1!4`B4I,HX,kL9Ll%R IaKVe1(Y3*cjTpph5V$ebpfPlj*VNl9%!MlK(MJdIANrGIHFdGrIGkmKl`R&$f@E SHb*#ZQaV#AcNP2kp")Ah2C-F[LUUc9lUS3F"eM2j)%BMQ3mL*2Kmi0T%kB-J59B I1+H*IH#Ij2D"FjVH"rle$$r`6T,mKYVbHAlJ(e(pb$G*'k-!$F`a#Z+6amJeS)T K3G8crhVhTS,fqApB5'%,)2"Xl!)N)i50J+4hUKH3!)cKY`15[ZYV)Gd8#2`Eq`* "K+Je%2NfPhP6Jb!+NLRcS%f3!26,I'Qb@4!iKfc#,I90K#)9)mdT8Q(UD88UL-m X8Yi0j#)9*q3A+Iq)BU4#K#`Mj4m4M95)1Uk4#K$5M5H,6c119)L!G'6F3d$+a%K L8LD1KU@-Yd'JG-A9FC!!TJK29VpQ)ZP+mmK)bVQHMk`2iP'5p3%5V'4p'%e-eVY [,*1)RU4#e$189*!!J+4Nh&YJSB'UC1*XJ!9$@0DlE[MRN!#fT2cVCaQ@KY'P2NJ 3S'QL`Bq4'@V`)d4c$ElVKY%'2dMpG)2[h$$Ji2[AccMicJeM$VjrDY,"pkiIGNM A9M$[i2XR4ai5[[AYmd5!aJjk)NM34%qiKLhcS+"5%a"*pkD#$ZBJJN+U'iA`262 6%&'%ZS')b$Xp%a(&#-BL)YreYG!`(1(lCqBMr!M*%BQ%Eh1CEaL85!6*P(Ni,K( jCEkdIQM#G`lCK-kJY!'5Flc`h'bN@fkP`bARp5'9d$0XfLCM"N`QG%iaR84DYH0 Fp6rKrfM5f6JZmLS68VUTXG`60prpeM`UIP2Rmfj-Be*MS34SRNNP3'SQ&EIeID[ 82`AZd9p&[Jhr&3@*Hh'*IiYFdp0hLAm,A)-rLrb5ra8&D*iDp2mTFQZB)%S9PqF E99ESf&"@BB40!e#*JJVp'LBKNZANqpE98m)a99#*#*X'1F+55[KYl&XNrLX9)IL eM([blc*aYMCSr(r-H+pR6'Q3!2$GNcL4m'f%LN53!*J&4S#4F,@cE-f`LVaX0U5 JjeR@S80LH2[CmjTiZL&X,bpIUX#8LQhZ1F$#FXHVT,`83D'LSeF4@K@*PSLNK(* Ver"eV$@M1aq%iXp`RB)EG-m0[&PQ1Jd[&c(NCAL5LqZ6afBReaamKIN%CrP5,Rj 1IMMcBGDCTiV%@5jX-5b@aYFK-8R%*h1b6rcc&MVm[cLAekJF(6$%ZTAj15[+PqM iPjG+IVilVpE*FdkPCCaDfGZb64QED0QQ$C3,L9(D4*jaCL9bJeSe@R5S5Ba6jaH 0Frh)fl@[CCCQ88hb$99qINr,@-dXMfGF82(Q%q-DVp3bc[%GrCAbF&p&FjRNK-f d*RN9qNHZEI)H*rRfb9KdY[+aj5-YdmaXbe6a!fTbqf+eaURce5#f6R%LpI2UCZT HYk)r2RAHcGHD!@S,L1UCkc6rGlUVd@BiiCaDC"*K4I2ECPB+lRaZGRI6+X@f8Qh cQRTY6Fc-YG+NPfBXUk0@"V8P8`'9G#hmaQV0+UK4,fLP%i6kAj9lLQTBjBCZX,I TYUTC@T9qk-e24PSKBT!!J4B[%HTDHpCqfN*(A*ElJEZ,dPMGAI$ceU!Ad1f6+TM X9q8h+"TMUUT+&5k4ZTP@+r%jDk4`+SK2P09UQq+'Hb+r1PU8j$aRGpC*2&C(35A [K'kqV"p[3&%FMj!!86,ADliEqUAQ*`[LB'H@UaB0T1$)4f(!BAk"hcD4PlRcQTY %2DkNG9k9Em+Yi*S!b"+YM#-$B0U8aK%*%KiCU*FU`PVXQH-""8ZNK&D4kDV!&cm T0#QEUPUekJI52XAh-$j*4a&!FLe(-)PQ#[5if35aGFGBM#Ff`@+ZAj&38ZiN8P2 bh))G-iSX[UF8IT(9Q*bVL@e8QKUS@Gh9k#J[LHce1+jX)VEEdUe&F'eICC@mfE) Iq8eGSB##Zb1F[#YI@8'G+ldUfachNe'IXX&XYZ'LQ[EDVdcLM0XLI@4+k,#5636 P*,DK%P@bj2Z-kqe@A(qVid50AbQK*!pkkAi`&9ZF+hCUZK*86ie&(q'kUFceplN HTF01j`Hp"cFAhYI`pBUVYVC)eKdE&"BRMA(+T)ET3Ipc9-++iG%XpeQH2hN66)Q %JaMKV%-dmj)D))LDmP)@35f*9qQfXU#1UTP*`V9@92M-0eEPrpbC1cc&@1Q%H8B "X-Si9PBmVj8e2C!!'ajq,3HCq`V-EVlbR9'qUJ`UGbkC6FEDU$2'kQH&@@8eT[X $hH&F55$$YHUbVI@K%&6HRP@(m(`SM3"CC+V1RfYc(IajaVV*pF3%D$Ma'8eieNe dKK1Fb@RBD)3c23eE2rhU6lXf$Z)RCVcVjLQ$HF(NI'$$2+"I*fEH,jM[#qIjSVe (`9K3FTe,`q#22qZ6'1r*@KUP5k1qBYM6Tf![PXeRZS8l)%fMY#p5eKDV0`4TQYC MN!"QmN4@'612SYkqb!+e(B3X90X+C*(D6N)@UqhGb$CU@iYXUlB2)pZTl4CNLGV Z4,CAfle)dp[pT[iEliI)MQVl0E+6fKj(GYD[jLqkU'e(fR9#kUShrlUDf29' kUfd55Jqec82TUEB$8AUTE4P+El@Y41QMYVGS6@%l!k98EHHKN!!lYLY4qURYSbJ lUidkk+mfkQ#!fZj$f89Ye-'ZDRX)C6Her3*PS0TqMc)SYQ9,E3p@'lA%Rf2MIiH UMCc,e$BFCCMDaU0JacB9CAHe9D+-80Yq+#294Nf-8YZa+(ZSlHdSSpAf2K4U$4X GEh!'f`G4aUVYBbMMe2CTP,h8GMF+Ii,YkbJ6e2BpP,h9pM18IG6f1j5*X5e(m+" FEG3c0Bk0QY($(cRbGf!G0R,Jcl(03CQQ0M"JZYU14TQKYMHKc&6ED5Lce(BZbQb eABT#,YLZ3DP3fkdSFpAf'43`"a[r6DeKqiCL,lBIS-aAfb-S9E'0FBQX+E@"X`[ 8"[BY9"YiY%KYe2aLY9&Me$)fkQTrYI&hEe$E`5J(U)eDTaD`V9BZJ1fp+-6"pJ' 83p4'65p4'rppU0V!18fMF`A[$eFEpEe8E6p#18*YB$bj3drJ!%HU$IbY84YiGj6 D`"hU&"[ec*TfE2c[FV@"9AUD+Nrq$bk$M4S&fl(GJ8)FE&p'@D@fId(Krl'"ahS b0HqV+-I&YRc"i129"VFj3@e`L429"Jk")GM!`6HV$Eb!8f#MpZ"@f2MIYkU0Z'p 6fqNSi#ffme(HSECe+#HVl@U8GkU0ZMa&E@$2U@Ul"`8F``ER)#pX2dCjPpV!9cL 1[!,KLR!pE2#apkJ0RR1QfZ!5e"FfF2BXYB&Pm!*Xe2RCDU-fcP%EZB'Pf0k2!Tr #pK%8rKREE5JAU1f,+"HUl9p4,P)E0AUafRk*!LH9TfLXQX!4'cb*(,("MF"YE'! *Q)B0,R'CfX$@bp8'CPfK0V!!VSH01U3'XI'29kN0(Jch`ABcbSI8GMX+GBVY5bM %`IB!#Rq1lEXSB"5fRk,!*E%pKR*YE#X5cRbGfX!EkKdE[2&kYF(hEP!Er1T'YF% p1'(!$[+SE@UD@UD'`@C`Q&ULKUJGDSCDS4EJ$'!4H!MqJQIJ'2J&ES&Ai!iB$,D !"@!!@%b0J8rJ$2J#P`@,i&M8&r`+,)F$JE&J1M`*IJ6A![2!3$J'1!r(J52"8H" FF&2i,M`"IJXf`f[J6Z!2[!D-KK2!@F"Sc3N89`&[UAd`&H`(Tm"D1!Um!r`#Ym! VF!Tm!TIJ$f!5r!Mq"1q%Nm)jiCTJ($J&[X'T`8M`'!i&Ci0cJdI`0MJ#[4Tk02" 6HM,dBZ$Cp#ESaF$6iGVJ&Vd@1"kp&6JX[45i"Ed6-*TH#6d5F!hmSNF#Tk)2!Sl "#H'hp-$JbI5ji'Ad"H!Zp,FJ!I5fi,*`@(J!I5ck9h"(1$8mREi9r5Ui(2d8qLK `DA!8MJ0rTeG#2i%q#Id4qJ4`(RS%p!ESMF!Ei1*`2,J&A*ZH!2d4qL,`@ILjjQU [22RP2+IECf[3rlepH1AMirb98jp@9[RU)jp0%Ca8J#c$j`rNkJbY!`RD@Gl"$iD 4%k3m,143Sl"&mI)UQGhi@a)H[M%cQf[c5MlaAI8e%j2cEB1(CUb9m5LY`aL)RQf YF8V-NN`,R'+C88pl`Pqlq9Hl3CQCeMArNclX*rZr"UA$9p#D$UJ&bfGMfp1IIBC 'Ya8'UES0"E6RmS@IMYZbKD("F@8RVi-YeVB(9$l"%c9R%4H@aC2c0MGXm(%K0mB &LaX8K-r("GRS)lKJJ8-%prQiN!"22pE4"FjkiiX0MNG+hiNH[q"#96BGMM2iZ"$ dRGJfY#69M5i%Z+$l6Z0D1p,XEVc"ai8mQB&0EV+bVVjJPCkPj9RPCK,8blC@A1@ %2H0p!GXILc(+UeAGfl-pMiV4V1jpf[!5'b`EAX9i9[G"[CE(SJ(G0lApAqG26Pc -m-8mUSHQTlTRGD95jS8V2602jE&j1@+i$E3jMm'k[qce2$Cpb20j0(hlRr0S6Z5 j2'5lm1ZeVr,B92EaIl!X4H@aq6IU&VpZr)q9E$+e"13KQh"Iq9H@N!#B2*j%SZI c@+Pl`IlfVeiHQhY`V04pZZkEUdb@jlKVHCXI1hYEFNhZp8dpfIAFA"YE(caQ94L N!+aQ*3qeq(Ic5k`RERLV@44X"mL$TaCL[r*BKX3ZlqBJcZMSH!T!MjI991l*3aY EaX@bDDA-Z9cfXrSRY$BDdb"6PFFb6rF%rMd2b`#A2M)U[pZim$M98C64aMM#'5L djPa8(XX[PFI6cak!VEbbI)P&cG[r9H9aP(-*V9Vb-%YQbrCl9cKjR%GbaAIdHU9 qG-ANDc29m@*AE%-HeS#Zf,bYfhAllXD+VPXBhr!UXrj9pVEe2b`IAEUQkRLT5aI RXDe,&qHaV8Zh*BpRZR3YHGJAZR5CrkMYdQhVLQAbH,NVeT+(4D#EY95h!rrp@6q k8%e)p&)ADL1Lf3+k8#S2[@Zj#6qHiQFU$pPlm#T*mcS5Va@YiY1eYl3e"LP-RqJ !@#UBU4@!%FKe&*[kR0[qeDk!j&ZI(1SemLjlm9+Zk(Aj0VHA4*SVm9PZ(qHaMG[ (H@cMpP[bH)EEYq4aZ*X#d&Ep%lI2r)I(lCXCq3YjE+m2,`mjCX358"r2pL`brr& bck)PMmfN32*3&lA&rbSAp$`CJb5@KNU$-c&UXYZqeF0Y3V3DQUBYHFKa1A%H[,* h'[GErd2PB3rS0A#kL4hJ2cEh,*kVMa@cHUA#+hPBBmjP-kGi"EGe0ClLC8kZXJ2 YrVDP[5k+UE8JDS("6P8!8JrYC4aXXJbabEeCU5'drEH0Fal8rM%$G9*McM$3*pJ jrhH#R3eKeIq,#r+&J#H2GR-e15ILVkHlEFNmL'fr2444Pi*)F*9M&Z#ajZ32c[h Jl!r1!$'RIR$Q4h$L"hhXPV0&1&H%Xd8i@H5&Fd8i8i564FbT)V5PdbH&F%k)15@ %Xd)i(i5@S$N9K&03@-m8R*M#L5K`1kED1F@%"M%NLq&DcKPK@*Ic5MK0a*`P`SJ 9SdQF)F+T)j`b!R[Pc"214Z(N%h2ZL6PIK"0&p1P!$Bp683j4EV1rRVmSlEUXDi4 pUD-DT4C&&L#&#@9GLba'YN'b5VmGXJ6C(YN"Z31b)l)6XM1b#h*(C&GN0f4hC!p N6f3[C'pN(f4IC#Pb*f3rj-l)rXJ"b&f3!,XLGd-14!j#$NB133j&PL'()BFMGdH 13)j%MN,ZJ4b0h"-j"MN@13kj&h)mFJ*bEq3qb)R)FZ3Nj'6N&148j$6NG13-j%c N,14Xj"aN"A)ZFKkb%VN[FMkb'VN!Z4#j#&Q&A#`ep[m`cbl`b+G8%KIC$ZNJZ88 U&eQ-c%%@)I13!0a(9)JX3"+AX1lY41T3)KDZmC9F43-%RkF%qA`P["ISjefS0fG GT2iAUrpDY9qL0faGVRGRAD(q9kUq6QRe9DTr81rFqT!!hVKeYFEjX1Ec%G(Y'hJ 09S2C-9lcpb+aF3+3!*cT9)409GT0eRmZNV#C(GIL`U9MIDIHL5NREUqSM1IRhTK AFiFYr!0(e5'D'd#KY1fKeKc@r@[kRZh0,YbdFZcd$@Ik6jmphVEr9IZ@,R[9Nc[ 'DL-[Vl!Hb0QqeAklEphFe@1YAAI`YQNVJma'jYcC%9NcJcHZEFmXkl2UaGA(-Zf CNIV)d4IV-jhV(TC)bR0LFA9[akQ4Nhd0cj*Qp2iGTaipqFL*)jh@j)(Y"bV26HH b#pD-C0h"[U22lV+@VlrZmAUaEhYpekeEZka9[IFmmm66`chSk`iH(MkbF,mFX88 A`$*"6H4GSriIeEMAURkGqRe-6hDl2Mj@`beE#`"Zfb"!ba`PCjPj#SYcVRrY@XI 8ScHqC5E!6[!pIYEfJ6N*m2QeCf@BNi#P1ihZB1QD&mlSiAEZ+hNqpeLUlJ5ElHc jme*&flIkY8U"[5L0S6`@adb(G!PBFFm4(BZfM3e@Z#(ALSB@YTaRMqXYQ000V@j [8Ip%Fk,-r[IXX"eVKlPRRJH'&C2Ep0"FQpXl-SUU@hTkC-el@9MM,[J9jCjUi"G Uq5MXf9hBdl1THe-2Dp"@pcK96mmcYS`m066Ub!A$DQ[AjQIfYF[EZ#`PX@6&([( 2rYq%Aqe6!T[-XkrJJMhQ&EE1$[9I2J2SFT@paD8Se!5[)a1mhUAkU5IZFp)$&Jf rq$hqM1`'2'-"b0cF@2rS82I3p-A'KcVD@bf8%-AS,cmlh*QUkQbP+UpF,ENf`&M D'FkpReZHp+AXPV@AIqp[k5CJ"pZAicerRZmR[jb#8J$@f$21K!C@cE(Vfp*5!$D k-miU'bZlV$#c"jdh$13'KcEB'`ElTrT4+lF06-Pk6S[+i`$)eerfrhCU'jiM5mi FC$Bb"jQ,c%2Q)`Z3!)A))Q3aXJfb,E)GXJ6C(YN"Z31b)l)6XM1b#h*(C&GN0f4 hC!pN6f3[C'pN(f4IC#Pb*f3rj-l)rXJ"b&f3!,XLGd-14!j#$NB133j&PL'()BF MGdH13)j%MN,ZJ4b0h"-j"MN@13kj&h)mFJ*bEq3qb)R)FZ3Nj'6N&148j$6NG13 -j%cN,14Xj"aN"A)ZFKkb%VN[XJTCM9b!A)LFMeb%A+cl(4QXB4qNkSFGM93Ae-K @9Jm11%p#l8D40A2'LFVmFe3E`ZlZ[-DNN!#)VAFJ[(B'ZihhJS6@Bm,'1[[-*4f Y'i80IRqj8UE94,(cMkY`4$eB6J'5&jlZTZbeFCJ21-6%%C(P*((#&@*"(1B[$MA jF&A*B4Ic#Ik4kdd10hPcYFP5%iIl4Bi`FEMHC*QF6b5f0ZIMR,`BKqY6MM6jd2Q V5H)d$XIU+hf1-RA"05XhADNcLqXcP`J+blMNN!!BNKHNe9k,CTIEdj'A&V-TYUi %SS2+dNGBF@X54eS&aeKaG"N(QG&JiBLVcFGC+8lFFU!9f`APA"Z(%8@(`p%FVYC b1"c0iA!d4`j(ijTfMR,MMNc'(%p%FZ8@"mfq"AN5NZ8Cab2ILR`EmZe)"RFBF13 X,ZlMiZ!FD2ilNDFJ6d@HKM`Gq5iN&1)-j,Z4ld'HLA`[mLcNqj!!Cb124FSU$SH Me4b19R-i@XhKD$@(Sp8F19VY%mK2)Qp$IJV*+6fI4hi"H4IbLmJlN!#I4Ai*q@A N9j!!RdEHL[`FmM2)Id4q&ANhmQ[)Hj!!pb,[3rk6EN+q(rR2b!H3!2q#r&INej( rK[ahj1h)Ib#@(0,QF%LE3pdke,e$h6Y5pp("BqP$hQM"d!i*$RTcMfpbfaqd9&S 1I(XFfA,N'kdM$J#8Ih#`1H6)aK4(I-MaA14jb214&b!rJ,`-H6Rb#Z59b)Z4ldH Z3ek&r#$b)L5AN!"GLS3dIJKj0I,$b)mJVd&q&(NYmMS&bBmKVdIHJ,`4b8&I0b- rMV`&H5&b,E'N,KaU`+&Z(1V'S@iFUC[Sf,$d!A!F(XE"BDb%BA6S$8J1%Z0B-Bi 3ib#a!j!!"b)23Kk-j#4HEN4P&4XAR[i4bD@`h1c,I@&XP1('V"SNPj+bCBC$af4 3cD%f(@V6S6BGDY1K0KfTc@mJ[iRm&[)rN!$I4ck-r!(bKmJI)Eq,I!MjBq42N!! r4Ai(q5$b[j!!hd2q$2Pcj#q3!,p%XKlb%H5[NEq*leR,qJVb[j'r46k+r"hbpmJ r)2m(q@hNIa*,q)J$*h$J'JiFa"&Z!0Gi,%@!#cer-U*9Cr'iPHDCUS$j'-b"(CX 1-+K[PK[!9XhaCl!F`l*J)qljBLiV0-GkJEVZ1@)Z`h*2*P-SEdC5(@(eqP3p4jL )HbjC9NCB!b`2'i`BeS)0eU5A`M[#(Q&pf'#CX$pX)$dXN!![j9pJIpKJHl"!E13 0'm3'Uq&2X-&1B)IBB0U`4'b`0q*M)fqB#6EB,-`4Ql!)98H8$rm,Nm4'p`*'L3h QT@qBca'f"-2%a[)XQ#Bf'$f-%aY-N!"Z"MBB19d4E,!KZL2BB#DkAjBVrd@qf2K M[4Fj9pJDR4&X-#ppT9ZZG"Ed)9Uj`P*K-GMS!0"C`FBIkh'9A'&2j!888-pdC,$ aGh4QX,(13Hpdcj-rTP1$M5i(R4TXG#Vd"Eaj`QcTh'#Mid$("K[XMFi00[,@Dbl c"5rSj'#M"ZMSB+0E!hCKJj(5iF&'hRU0HElJPPT',MBB-edIE(3bp,h&qF)XpHf LE+96h5"Xe,-HmLU3!,r@Yr%A#*1Q5i30eJY$aNEAKhV("Z[AGaJA5'hTbmF,K0R Ubm%,K)R#KS&3-!YF`NBG`XDa%9F[25i89NeGBk0M"&[(4YF"KSk0,JrX(K[G&eJ q0TJ`E"q)"UYJrGLSIpJr0[jDRa9B*2@N"iL,T+X&,m"'pi)Z!$EUQ'i!0MT+a-3 QM&Pe"l#"9ISdmf,"6Ae4FV(JJPlJ@LarVHp$,TEZQ,ieZPLkAIVklf,TNZL,"BZ PFk9[K#q@lS#qBUpBf$LG"ZJ'2%(ICYa'F*!!cJ-fDPZ[''NMrd8R$aZeUmrXE#2 eT#p%EN1h5RAiX&&2G0Z`d6(3BrKYKCrSqjrE5MhTaAKY"52d(I*Yj8rT"Q+M%`K 'BD-$42F3'edkZSMBT+1QZSRBU&fkL[,D#5rLVl$"!HJZBJ2Mk$*LScl*%4ZjkE2 @fJR2d%0&lD36"BCJSjlS2Q+Mid%A%K[G(,U4mNU%,m%GX-%"k%jL!l2J6GLS*6U 9f)K&aa)EY8XYBk1lb$pJSf0$*a-EA)U1TVcfJ[I`"@cJ2GdbE2`aA6GXi!MG0fc m%6L2M3iDh6KXr#ZG-@adMX!ZH4f%hp+C``EANXkCXX%0e"L(f-J2$-G',G'Y`dD A$iN0E!!VX-&Gk2aKSi-%Yj+hJh!)Z#3fZ!fG3'cJ-Y`@'hK"2@,M(kNAE1!VI"! EA9SkK0MJ+rbc[)lbPh3-XF%$k4aL!qH)MifrP%kLXP(rm(GXj%aA%4YGAVU,f-" [ZScb1JRrTpZ)$4i,Km)'Ck2lL!fq34F5'rK)eaJEp8ch'4Za`$GXG2MJ+GM!',V 5mMS,2i"VBq2rk%"M!c[K80M!(HS1'c9!CaSEA@Ri-MDkJIbR[#l#GI6aH&f%9m& 6X-'l`!GXr"QGF'c82l@'M6q#Rf+MJ`efBD0,5)GFhSl5)k!(JJhH#kr%"NrM6l# "qh6-XB%lG-kam9pdd,'"Zh65XG%l!IrPGC@DSkZ1$Aj'h`-E08'A(4[i5lFG'l8 +6m&'2R"jE(4+q80jhD4I3cFH'jJ"GQ'$ae+Ef1"4F&9XB$6p"fcJ!PeCE2`[riD 0$LYi,Uqli$FG@Qcd'X!6E("MHN6Bb)m1,MCUQUiY0V!26SH01U6cLidF`$ejA)D U1X(Bi!GdK,'"hr`c0RJTR@&Xm#8`!4Xi6Vm)'jJ%Ym*'6G*c`'Bka[*kbPrU``* k5Kq%$M)f1$cm(4Yr#Ar""[qKUi`0c+@lM!fmJ$0LilrS0X[V*Id[m!3EY3Kh`!E AS3Z0$6i(MmB'2p4Gjel#Cm!+E(!!X"3E'+G'd-3QG@YDIVhi#p-flLd6,EVrej[ HKTN!l8fr`HaBl3f[C[*"fB3I-J'KE&*$6%)S'p-FZ[rA'ba3Na(BT!DB4Z$eN@N %hIrV)pechIrV!cpQ5N(CK*-cVD"X`[(8e!)fi5T-i5LEi#c61-SQH-&8MV**E6# G`qXV8c#krpHAhT!!QYE"*Kb&L30P)eIGrqX,GM+"S'c#cCK%8$EK!d`N+*YJN!# D6-!QpFDN$Dq8I*Li86CU52Ir5U@'G2q[&%l-*)kb#DG9%cRBK,X`"D0X`NqBKP% f`85QBRKF1FYdM,)aID$lIc[",G5d$$ET8c#GS'c#YjK58$EKG8`V+*Y`%UB@P%f `MHN&AMqCD0,p[hj`)dIlIpD5aiR1RM'ecV6ZK'Fjdm4BjHQc+kZLfQc+aGQ9`Ar qC@f8R1#HrrTTdrlUjDBIf$+ldV*mf@CfHZ`Qe(KqIAGG(L[E2M5ZAI(8fE((jDX T'QI(@LK@pMqe+(hM8D0c2pdiq$NR2P9CQKJ&kA)(5`!MlV*A33L&#q-i#'PFdDf iJCG2F`-*(aIJ3`BAPMZTETL3!-#&2&LZXb@qIUHU9Uhk3E4P4mAEk`DK8dTI3`Q $#p*IS)-8iB+FKV2+#6`h6(A$KC`B&kUbkA#Y*amA6(qK`JrFBDq8aXB4-VJJmcj HhdRfH+jdSP3hB2"a)IrYqBc@-XIj1+dQLQ0`,(((HY[PRNhK62Kf$5,Z@$H1lRb 3!#fGe@iBMEK1`3fkjh5Y[hRKDXYD(prANR0AKI3qFKYRfQkT$VflPlH4)+EVdJV acpDC`QG(X#"f2qjDB%9aCPq`$H&%i1G[*E(K[PEUbQ'rA2UR%G(FrfH4Hm`,,RF m[CA1f[+iDSGDH$d2'm5*4[EFl3IQaNh,c'-lJiALILQE`YiC'mAIffHQ9eqHX1, 3Ap%AAcaj[(@Nm#"FT6*f!"I6I-bl11k*XkqqXAf!Hb+MLq0XDjM4p&S"#"I(@Gl 3S2CY[MM1$SF,V3Q'Lq2NEQUh[9!j2Q"R[FSHpm,8Q[hdVDcQRj*VUpe62[94r(D 9Cj@lQPLpE'ZmXC,(#V16Sr1'JGcJd!Cl`f$r9$pUjED"+6f(hClbZ0$kZ+@e)Hi ZJT-qIZ`9GS51NS[dl@h["-!K`S8c`3@jP[mBVX+hZ,dhk5aeJ!YRIIcBPhDI2IX V#kPZZ"!mlr#5V%apZTi@N!$2TJK1+N#@iE-TV2pTc6mFQG)kq$Kh06NaD!HLLMD )HcL5#cBkY$h8QSkqImhhMG5c#cHY($Yp`jRqdfH2Ychd[[CEZZa96qiBUifm[-* k)'Il9[[Y[R9c9iqeGYh"fkDY$$)EQA0R4f60$0kiYMfcV-qU&eFIbl4R4ZSM4eq Xch5ZHeJL+Fq*aG@p(DG'6[Be2%ZDdIYhR(Vdj#-RMR4DN`Hf(kJm0jh,,PJcNR8 (qiiqZmYD[[kkaq[&[ZheAEGZlE*@pGlcc"02$rHJVcYiH2M)`[e(d`Y1emLkGL+ AQhV0UI$HL4ha2385S20ii-TkXjU5jaEXq#l6eH)iE9Yf5,l%$jDpNVeATCa`+VD 1kTqYHSlUHDVRUPkXHVlU"DSAU9kSqJkUYe'pVHV69'qRqMc95e4[VhU(aAr+ZIl HH)'drUZp0%Dek[09Ak$k3Y8RUflqYT2UR9A[S[U1URG9[C[Uh9A[SITdeAZUhN[ e'DVh9Vf2kRe9,e9p*pAlUEkck[e9(k$k,UV[VrUZUZqQqN$9"kNq@29p94qLqP$ 9be3IT[T`eAGA[9,e%DV[SIT)e8HT2P2eUDV28RffkU09Ak6kBY8V90p6p6QUce9 pM1TM&fXqYk1e`(')2G$BeeHkR[TREXYJd$M9$4k-9hf#kRZV[SrU%e8[9hf+kT- @mmklCA+1,9LPHErJN[!U0r4V3Gi9#&A3b,B2V@F[KXfr(QL5jA&QICD*8E`BSf! PrX[pb&r-4F'Xk,Q,F3TAMql89'SDL5Y-P5!+5d9A@#Zk`G3UY5ZX&PeKXqJ+Qd@ hLaa6BZFjS-CH8F-fQFH#+IHX"Y%rfI[K6`(H&VT6S(JfZi-D,'j3%,l`S!CEh@% QqDPe"cAS3bXXG!Fe")IFf181*l$C(9TKM6fSSGS0Sa6CJaVbV'YZB%3@6"`+,5` VHE1[Kf$hiTB0ePD#jbaQhCTrf$*YRcN'YA@MX(Alj80l4AT(RCDmF+EVY8JPcqF Hqhm8a4j[fpaKGBjXY9@S)1pSj$)FLVjMF@%fqfr9r)Gh6TQGC`1XP@!2ZC@Ld$K Ih!1#K-rI0kHEMHKUTA-"@kdc'p69GR'T'4226Ve*A@(RUj[8d@Ai4L8VZSSMZX) YFpcFHXCNQARCeSUV1k*kaVIaEAq()'A`e!)`3dSH&D2CV9IL!(Ncbl*9NkpYM&% aRKe1#FKMdF"J1X#rcTqFZ*MKLhP8$de2GFr1ABScb5Q9I,m#`AlMa@PJRFGKPr- 9C*rF-l"aicHV`q3aH'0D3"kE2Z6j2*UqrFpj0#IbA"j,jbprb&02jE'Tl12rS2' NmYMm'j*(T42QRG,E(q[QX83BRa8JMm-Zr@c,[h*`SmRM554k2Sq9YAIreFYMmdk qqHlqrklljLU6PNMP3(pB[KaMm8$Z+KmLaV4h'*%-6M6AaYB(MeN9"Zq`MfIb@$e AZV$P+PNI8krmUZ3KTaRE!I,JP9%NVriV[C@jIX@p&-3C(4e2!GMjb0QB$$NhVj! !,,CjCFlPXTr92k'edCJ'QDSmPRQlhX[$-X#PMic+lcBZ2%l&[0('1-)C+,6QA&3 Hbbq9ap22(S#Y[,+mc,p[reH94fTqrS8mc0"%fAl[#LH2mh#lBU-hhrF0f1Z9qY% 9Nkr09-H,AE%0H9J$ZQ,cYQkhVm5T'0pjp6mUXrj9pVEe2b`IAEUQkRLT5aIRXDe ,&qHaV8Zh*BpRZR3YHGJAZR5CrkMYdQhVLQAbH,NVeT+(4D#EYE6iATeC2lT368M d8KGU)k,C!VT3+Jp'J*l%SDIiQFT$lU"iPD4j(BRALPEaDG8"U(#$iX8Q@f(k4!I !8X&-V3#-B%QeHVR2ZHeIl3T)[[8YmLSIZ-ZHhhch0hT-AEl0l5@4jNTmPY[(H@c MpR%HflMpPMbHiIBYH4cZTJ#d9Ir%l62riA(lCNEq3KlEkm2,Bd935!QSMfGl&TR rH,PRdC,(CP)JH3K3Ef*@EKjUYVATNF658'P`*NC0GYZhHVK0L&C$dl3PMhQcZkr Q`5YlTh'rp6p8([D!AN0UCreIrf0ccq+jqPJaZrZp223L"fGCFlG'hBS)cbJ'eN& NQcMFX*9MiM!VR@[LX-!Kcm6*4mdhF@5&3pC+%iHVf3T0R#,8)K0(VZ,)ZXl%B4p +'a1(Hm(DQMMY80ZC1#@S*5C1Hp6f*JldVB1*X`2U$LC14p51*NiRe%iQ6QI8cLC 1&p3Z*Xk1U$ZD1&e4ZjSih9#lQ6MG8EZE1$e3HjJi29&lQMLp8(ZC1,e4HjXiI9$ lQ$Kp8IZD1-cZP*Si1k(ZC1,d3qeRiZb-ZV1*daqe[iNc!(@!LE-,kLiQ$LZQGM9 af"@lQiNc%(@JL6-)GC!!L80RCE#*``lE)5E1805K*NiCDTQ*`eDfB5E1F06K*Xl ZU,ZE1#034jJi)e&(QMLM8%HC1(ZJlQ(Ld'%BEH,XLEURL6-'GBb*-aCeV)R$05V M,XB*!Zk&ZTI*CccUH"0R!ZS%%fG[e,e0($EPlf2L-)`mdF3T4bdhFHJ26M*ak&G 10R'BdCaLiV!cFkU*`qcS0"0R1ZTd%fF'kJ`6CbEU6"1([ZJX%iFTTGNQ$K0!Fdb F#Y3+%fFZkP`6CalU2"1(YQQPLE-[kViQcRc8q5C1&@T9%SGfC!21X`QZfZ5c!(@ "LE-3GD'*X`KeNBQc'(@aLE-IDNd5Th&VRlLcfrZQ+rPB@&lVTH2HQeB6a6dhXN` (1)ch!NNFjJ2L[8!5Ki(GH#q3!-4KrL,H#b4af"m8l`@511`2L[F#54`4@rB#54$ f"m9lJ531qi2L[8!5Kre"m9iJL82R,pi,*((B(a6["C)il!q+p`**(2B(aAZ"*!l lJq+p3"+(fC!!H#q3!-4KIe#m&dMLX$mShJXNFGJI&1m&NMMX$iVh!NNFpJI&Hi% N$[Z$iVe!%SIp3I&H))R$rU"i,j!!a'&r8,`A51+`2bMH#b4af"m8l`@511`2L[F #54cf"m9lJ531qi2L[8!5Kre"m9iJLF2qS(J[N!$%BAp3["G)iV!r+0i,*((B(a6 ["C)il!q+p`**(2B(aAZ"*!llJq+p3"+(r8(aAL#*`rkJH#q3!-4KIe#m&dMLX$m ShJXNFGJI&1m&NMMX$iVh!NNFpJI&Hi%N$[Z$iVe!%SFZ3,`A51+`2bMH#b4af"m 8l`@511`2L[F#54cf"m9lJ531qi2L[8!5Kre"m9iJLF2qS(J[N!$%BAp3["G)iV! r+0i,*((B(a6["C)il!q+p`**(2B(aAZ"*!llJq+p3"+(r8(aAL#*`rkJH#q3!-4 KmM,H#b4af"m8l`@511`2L[F#54cf"m9lJ531qi2L[8!5Kre"m9iJL8120Yi,*(( B(a6["C)il!q+p`**(2B(aAZ"*!llJq+p3"+(r8(aAL#*`rkJH#q3!-4KIe#m&dM LX$mShJXNFGJI&1m&NMMX$iVh!NNF*YRL[8!5Kre"m9iJLF2qS(J[N!$%BAp3["G )iV!r+0i,*((B(a6["C)il!q+p`**(2B(aAZ"*!llJpDB1%r[$j)iGTcp3BHdII5 9*p9frjUl[rpSGZ'QP@1REcM6IrVXmEDIqD@C@lVX98rZ'+Z0[,c#HL"RqeEllEj eFeH2YAEG`GZQV3`b'jPcCdGNc3cHZ,BpXkc2UKGA(mZdCdEU)dGIV-pdVRYB)LR 2LFA9[4fR4Nlf06a,QY(lGjakp13M*ijd@T-(YKqS2$HGbbjB-j*e"rZ12V[,@Vl qZXIVaElYp9fhEZfb9[AHmm`66`rhS+mlH(Mib-,p4rNrJ1!Fj,RRrrKAEBHZEml ehlpQmhFrY[6(&jriFSV'(dHeHq+KjVdIpkrTHlChk9p2'%[6U0fkIehCpP-I5Ij el,A@dVqHrrPULXDr@Ze[aV*1h'KPpEZY5Z@aq8+%VI@UmV"+A,A5QMLj'D[eD(1 lXBcUb)d0rDeb'*eRJ6rl+cQc3r`5(B+(Id61)4'rBmlj$AP#cJ&ammMjfm4[$(j &QNIJ9ijIMZB4q-hi"mibk9!0i%6CQhjA2XMe'm60&8j[l0GIlTE35mB(bblikSD ImdQjad%[C4pm'1@#10i*FLq)[V9YcYI)3qFhqXG`i,B6rSqE%!TM[cdH`XBY*rK akd#2f'rN,f$MGK0jFlPTT-1RBlr&(jABVYp"*`MG1Ik2Hcq2!lHCb$[mRaPS2L1 10d(Zp1!@%hR[f-Gr&-6aERX9"heee4Qd*h,X10jjFKm"YjE`(qaDerRpA1BFj"q 8(c0faA'mGCr%aLdPq*dJXGeihjBBe!*qTdJ-0ek("@akL19dEVK`9X4q99*rh%B Llee5@h[(HAa'DSaE5-MMh#52f8pMirB4HHG5RmlRBVmVC6#+@dINRIaVr1Z)f1r GdXALYK&jDk%QHA(p1Cpp&JGU40kTIj28kdUjai(E4H4G4ShQr@!FldHb,jeE4H5 GpK88RGqNRm6'E5,bVRU*dR9a)[YlT)Di486HYIaV6Pa2fA[q'!GZ$q'r`GC$ir` Hh)Z0@d2i2qLEMVI`$l&a@`Kq&b6e0eci',H%i(GjUrkb+iflJefr#hi2jHlBVe3 iRTieZI!Rq1pZLR1I`)(E314Gp$'8Df+r9F,9Z!@%Iq,2bQ+r%jr"aZdImKkLBC5 YH4m[Z!*Q5QU2IVL"kfXDR6prbrHC2ihj(IMaGllI@9)R(I#V1HmRYh3iKA*8%ME Mqkf9Q`C+be&i2VmEi"ND[jh6dXcL9K"j0mU0!ESZChi*'lH"i!F'D2bqqMH`5Ac H6@#*aJ2R#h+A#,Grb,Z,ZMHi-ZQ(F1!Q#hPI)8q$+pm5[1%'#hRhF'Z(bH-@q9Y ZVT!!Gbmh8"KFH84`LaXVj$e!I@KFF9i5I1@Q#[bNrJbZ(2[EJT'ZhcHTCi-V5rm &"rGD[DaI"bIb01p("D1jh8(H6hifi6GM[i#$jY(AbapSIR1(e)IZBPm[H12@Kh0 -E,SMr022*(Lj8'UAfa[N$C!!qY(mCS$NaUd0q(%ML1BhFi3R`kFN"BGr-IbQVp5 ITX'Iq[N@[mRqS(!XEQF3U+Ric4DrF9lp86biPB(m*&I0El,[%GcL0JE+Aq)DIV1 Ih'8#EP$1abEif[rRX((l!RkR*IKD)VA%V3[iJI'Dhccf&$CZ@m$[dS5AR#0B!Xl )Q`,[02aQM@!ZA)"iF$ZAhf5h[i"0hcdfm19@(XjR2SIY$E(I9()er'D`i1X"FGe dj2B4Jd0VIab2!f1r,R5503jP6`P[1#Mfk`%R-r9kKA#2Jf1rRQ#B`D%(Am&$MaJ m4RdE(2VYhf&cZb51rHF*$R@51R"l&8iRYkFB(1SZZ+Kl)G2KmBEI2#bF42IB"[j V8Rq(rc!fh3%Ie,Ja521N8l(TRZ8JiAZDCe3,&Z[jQHRd$c5rFIlkF@bkphBc1', iMDT9X&IHam9ImjXeF23Xl@h-q-@%he`VR1VSf1qccbAmjS"IaN(h+El065R5Rh$ jMAqJaI[J99P0IZ2lR5dBE2K0i%HZ3j6Ie2Sj,dSIBA3j2"r2bFMI'plMq`d$'`b Zj`X@Zhd6Cj2%dlMqHF%EYb[NE*)DeEcRd[r!j[C3RE[Ji4l[H3J2F&*F4[j*JMF $[LL%dr8Ec5f-"Qr'cq2acYK[[*cET22iq8I`S!mJ,K2Je4T[XVqA(Nb@e,Mi6C* kdAMcQpm4JUhp"'-dhMJRrak2df1rQIbh`CXFi4C`!I%E6!r$p(9'dr13!*XJP&r P9j2k+2a(2-k,rHB,$p4ieND`JEr#lbe*IC`Mh!MZ)hj9p$8-MUSlB#j8rReY`RY 8iamXiP[qd1)pcN[#)5k1mcM`%`R[Q5'FF'hXG`aBE[SkRj0H`#8alaN"hTLqcM, T2F!6jAdI($#mCiP`AIL)Z&63Vc'mjc,"D(T(mXjSh*+Zq4qBHTRk`GXdlVj*F)9 q!RlFBU0jcje5Vm*VP"rm8r1H(-&+I8['aI!p`hX'5'd*hq5GpaFYhZ2m[Q!pR)Y bJc[U2"C)l`#Z*qpam-R`RVld%V,JJrcVfrJ2Jd2l5*m*$L*q*m-V$2qq4r#H2SE i,B4$QhVY+Tb"hT'iR%lG'0lcIHQedG-3[d9rPZ$3ek6'i'[LGbCFbZ$3Jm,RU(I a1jmDe6MNI&&kA[!)HAG*,@VHFqXrBB-EiXGIk[UEqUG#X,8IpDRVEih8)P`$2rj 4epq[K!2IU(M'V6qkVc0ED[+Qf+pDqTHDpj`Ph1pQjA2dMc6[Z9SiQ26(9(lSQ[H F*$h+@q)meT!!Nq%pAB66h"Vl,@kFUD9jMqjT+MbMKJc[#Ic!CF0l!Mp`-&Gj6q! (IKPqirYG6Nr1i2HE"ErT&BM,@Z%S'VpcT&Ge@qahK@#jaZpbk9d+Me0q`R8-(P6 q!4khahkI!Rm0VPca+6bq'[[Gm8F*[bQ3!0c%MYqGaa*qFlG`LDr&ITrR2`brQ5! FQlkCq(e&m&,RPbqp&H&6bNrZ&M&mqNETUC'lq0e(2p,`QaX%Xm%+H+(dP8arkd( TfG%V%*H[#ir9HCa#EcK,HX,iI6DTJf1%ri($31Z[NMViJ1!F-DANmm%RA3I1[d[ YJ[RL9r4m8JHRI4B2DP$m5Z"UTJiH&8i*eSPIHqV$e%&2i@#5,hjGj2BNA3I,"EH NAkhmT1pJkQ#-e!Up,2(V"HkB1MKGF[K0r(r(Jl2jfA*820r[2eYk6Th+IU4mhq$ (*A#eh,laE"KCbciQr8+i[rLYSpqGh9@ZKX6cmh#15eqTQ,N"Z&aYIp%j,[dAiqI cq(1N$RI$,j((5+P4l4HmXk9I8eKQbM$K"cHkS1bm2M&j[R##"aYe8,K2HJCrM2f HN!!DdRi(#-i*(kGZKJZ[eRjGkIAV,h31bMb!keG`q0p`F"fc0mQrkRMAJE[kZ*V X(Z%YfZmlF&CpM%jfYr5@A,qL,@#@Sh-2A`!R[,k&hjIpLI5"qLPrC4C"BrYGIjR `S8H%UqPjL-HPER5rF"LelZJma-2#,c3[D3Z[GH*j#-H5qB2cBVqjF#-RRSG`HS3 c(4AlIBGqTk2c%)m,jpEr88,[eG&jL-HP,[9rh!Gf1MS2mB4`5[dI*r1hMXj$2#B p@[dIUqN&1r%mK,0$jMcFrh#qaYmim6b%Xd0iKIi2lT*bG"lL$1QVk[mi(blRk2c "$2TYqMpblJ*A(*drZ%ALZ[q4XjAqQD2c"fG)hdIrak(8T+2c"hI+()$l(cQVkFd j1Rp`Lr4%pArX*c-CD[lJr`-!N!30#e4ME&0SC@aXFbkjFbkj,VN!N!r-T3Q'!*! +J!!!!BQH!!(eb!!")C-!N!-"68e3FN0A588"!,5Ka+QedrIC!*!&!TQa!*!'-Dd !!&MH!*!'!dN'H&Uc4HNYE"XM#pZ5j9NVDp'M,FIGDpdqZpK#&mP#Q$RJp0VVX69 1RmIFjh*5MUHHR#Ulp@h"IrXSPb`RSB[TF[Emb'DE,0Ua)h`KLbiRiBXA@CiXZV` 4[XKfC1(ACES-b(+Fm#iME#'him[aKI$&b#hN&di@b8+fl[Ha`RY8Udf2alC46Ql V46GCbA!jXL-$6Si[C*%-m!YCCje0XXqmcYXZkhl@`'h5QZ6!IHDCeb"MFYh5EV2 Xl)`fk,f1mR0,HE(YfF"+mjERR`[2[$VHq`Zrr-9%J3Y[a2EP1qRXE',f0Z[i,6` (Ljd(YchF`&J!H9(mS,21+c-lCB2X#9rBE@q4l-q,m!HJ#`!"cT%0,!G"cA'Fmab RCiHckGC6cUDIhqiiPah&jM-pQhVi1Qp582%1ZQ(S"f&Z-J`1HH@iE@Y(HBZDjEZ RrAUcjXf8Di-MhRaVBF%,Fe1Y4ZcA[9AcRA)&Yl(3FKHmh,3AahjM)9VeX(01"C@ lcQYiS4[l3@29ITFFaAE#'FHljSBU&9mHffUj8P1+JS[@S"@@[Ga-k(PVTT0D84c 8FkrhERPV%&E@V#H@bei8j5EGZ,TQ1Xd0&lcif@cZlpHmA0&Y0XrBlY[bDjAFk') FZQZQEK8jdH@YGp[cqU4)T%Dk,#IlN4Y&ARfqjS9Rc!qS"I1f30Vp)mqiQ1)h$Mp MD1!YAcVMKkqjKS5d0dPf`DeMh&1bNmD+K&8SQ@Q6&0S*AQh9lL$h,DkLE(FE&D@ S!#h+hU",Yffc@bj02eZSbX289YaXVD9A@CBcMqRNS,aZlF6El&("TB5f6!k[Pc' @I@@-qHSbaN@TM$&X'4hlZP8TL@)j-DSrNlp$[#0TeAG8RfX#!Z[Z(L"`8'`"!R1 [!`MX5Je!i#(!rm#b!2q"FB$qJ@8"r!2M%2X$d`$kbk@MN6m`pS%r-J`!)l+1m#, bS1%LXM1i%0C,L2PGYZ8DeBJIeSN,q)&C%Hq,jLlF&dhcD&pdS-'qD&K+H!(U!q- LdJIQ2Y"(KL[+YJ6cNBIZXM8JAc6UcPi!mB&PJ2"Ld&VeDQI3hEAX4REAZ)MUVUQ (k+j0#FeGk`$*ADX#LVZ'!B+l9JAdGJe$j(E0!Y3ZPS0'E0I34q[!+#Mj`$)Upm" DPhTJBbUkX`C#C-lE&HY-)h*RlPddGNf+5"bDZLJFQZ841$6@k"XD4FNXS+jV@%4 Fep4(fm#SA(BPP!fX#f9Rd$8d+'3S3&AA+N$8hIBFIUjT$XflX6Ad8!6Bd0j$fG# `",@KL`"[3p-#k)E@!I+'TJAi$De$$!jY!b$ZU5+0aU'e$mP&b`!JLZB45K4GD+J S'KTib*G1L0AGaMdPUe%lAc)ZG)Gf4IcZXRG"[-XfMq4G(M5FGeQ@-em!pY#kL1k K[3ra4FZq-Lk"IG&&UB`0l(GCPC)B0!#KDG!&1+@mXK')2(6h!T'6BMX3ZI!kJXL fe"4%AS+q),)ZY!D4Jk!lL+`,$8,N)1`4)[1J69K4CVT6L"cic8,*1!#DNSF)DdT H00b8E!ff&'XVl"ekl&I8YqiJLMAP0K'4DE'2+,Y`@iQbHEkE+$[4$8ACZ,FS#Qe &j+$B@83Zr1DLC,bUl%XY4XR,mV)hM8ECF(PQJhBMXJik$XEiBM60Lq*[l1XBiqA E1XDq[+YMV21E1XDXGdr(1)LfG)aKpik1XBdfG)aKphk1X5eZjaM,D$FRUKG[-mI B&[CbI,YSRF-h,Lecq!km93lIc&rCF)ZNZ)d6QTD+dY[%FBXMf--a9Z8YR-!kf-% *,,XfF!*lErmQX1[1FrIZME%YEpiBkm,HM@rA@kDp1cHqJkibpIGY!TZZY%@l0XB `3'rY1CH!ea3r@ThQ1c@8'kZj+c2A`#VU$J,VF-NR-!fR'*&ANkkqF'EiM5P9AfP Al&9lAVZq%)APISYPch3,T@dNA+aHLX*&D5N+`p*U4$jGJDfIVFJ`5PENBG9QKjH Ub#iD0HHcj0Vj'3U-SZ`%eLZQi9j@!T[b!#bIPY$Bcdh4-NT3dFAU-CkAUU*KEa1 G6ePNlfHYC"`PVZ4PcAc!5er*YVYpk-*@BeT!9YqZK+ZqJrkf*iqT[TQGC4RDc[S 5A%MJRhDFimHP121TeCpB1LjX,kqkTe-&FD2L+j*IhT-5bLa,"EAP!bCMrr2fjNf FR#`3cp,CT5b!9",2+Jra6)!SJeHI9%MFk5XHR+2020"c+ekBV`kI#9dANeY4SNM hm+5LG09*86RM3CP929e4K*6+m4T1A,l80c@pf$Yb[1PFX-Qjd!6XPl`Tp[MjD5! #Rb,jVAYV`0C0Ze-'A[`'DD`c6a9*r(a99P!XjGIieFVYLmNqNHFrY"pjk24FbZp N-r"T+MYSC1lHU83cGIi3bZ2pqAS3"rP+d0E&*KUa&plXPVf#2qm8fGVJ2f%3B0q "-AJ6ER4!KhK4XJr5&$V&k8*Z1#pcj95dV41P'fC2@qJe&Q-LmFMh*$Id[5Mr4cD NLFhQ4-2[T%NQ9A2h"C9E6,UQ980kL`kjCk6Pq$r&@8bp(qqANh8AR4-[jXQ&3Q) L6V595S0+l"lj9qHMDXe%THDRMUNcfFYKNGX499q*pELfP6*b*S$MP%cC96RHLmU Khia**j%f(l5"5M$q2C@6@r2,Q6-64-mN$%8j1'l950+T#e*X98'UY3T(SbT4JXU 0Z6ZZpHIf9(j`Y5E&eV&`5V[X5QI1q*Si5J(+a,#ee@`'BBa*8k#Nj***Xp+SID0 YFXZJd1%8$c*qe!@Z*VdQ`f%91L83e+)f848TMZDlSGX`F+4#GZ),BXA1$rDP+e@ X*jmqHMP!SK&4&EfS6(k#$B4Jb1r1eX2*G63)pJHZH4L4*)acL$3h89FPj96,qlU e@K!dFZ0HVDQbFED"X"4PLaZ9QI'LP@@6Q0P%LFd1PmE'9Q+3!%d@AkfblU3UM&r "P4FrU03mHI#dfQ4!+h8'd(T4SRCV5qI9fHlapQfmG4qYmhDQ`Jh9r!CCH"FL[bN @ESF&'f(4ePaK,DalFkki,HGYb*AAEI-lRZ(qPVr(&1dZPID9[*SaHdRq,P+`Ia6 X((8[C2ZEp0(ZI'PEhYZ2,bbfDLL4$N@"Tk[9))e0f*eiX1[h4!V0#eB5a%ljhGq `p3ap!$-Y9l6+4)XV$U5l8-f%(HDe)dp!RSKFK(`9mK6NUFJPb013!"h)2dHHMM` $H5Eb*#3ApKBMAiPNB(J@mYA)[d#q"RNfmVA)Fj!!hd+HLra,j&mKraTj([*mj!A )eb&IJ@5Jpb$bhj%r3Ii(mMq42dAq$I)Lj1Z4&b2IK(`cmLh)bj&A)#p&rKhb5Z6 I)kp#AS,NmYpP5-CZ9b2ILV`'H5hb1Z3r)0q'r%INRFLh)pq"I#IbAFKh)pq$I#r bIFJh)0q)r"Rbrb&rMR`)q3[N,mhS4BfBj!*K622#1Q3pXJ%j"-NNUJTCJab+()B FMXcBZUa&bZJiYJ8j!VNjFL4b&(),j*E)dFK[)XFJRiAF#[PRb"a5VKh'VN3q&mN %[aTj&r)lb1mL[iIm2[)(b!mJ2iMm%2,$b%mJ2iPFK[`8mY2)'j!!(d2q-r)cb-m Lr`RjIZ6(N4p&IJjj)r)Qj-h)@j!!Yb)rMr`#mY[)fj!!Ad4q#ANlmX[)Vb#rL[` DmRVN4j!![d,qIk3-4G8N5cjaeG2AN9XMYd&ZLp`1Z50b*q61b&f3!,XLYdFf)9q !h!fj1r*jb,()mFJGN!"l)2G%6N#q%2NLj&l)&b-CN!$IJG`(14'j,j*Tp@6NIXM pN3FJab'IMr`KmNI)Id(q+r*Zj$h)Pb!23Vi8+32mf!ab1[,Pb"R)3j&6NBFJCb) 23ak12"Kj),)9q6,N,134b#14Xj&()GZ3!(3aFj(I3-j$cNFHM6`'H5ab!A)KmMK N-l)&q@r)Hj%r4Yk(["rj3%C$pr()i0bHrVc0'ZICD"CHRRbcjk,B$6-H9RRM@UP beP,b@cUfQJ)h9F%dar6)6#'B*[(Sr!e@-UPM`X0M'QBQ5%abQ$$aQ+i`!H)aA@1 b4*K-STK!S@0L`Y3*(G-0*PESQ#S`Z8,(p)m*&MTLa6mk*NCkYbUZU3N6,A4-m*K XN8EXQA#KBrV#C!XGNa8QA1LBIM$T3NGHQALKBi,(j!XGH@8#KSiT%T-`G%`cQ)K 4*Z54U4JkmXTd$"f6'kCNk-JVpB@1#596-h4-%CQHS@-UaK30(C-VTQRSQ+!`5D) -U6FQ8ZL`B6+&MPLC8+%M9LC9k*LS-M9#aq55U43kmNUZd$%4BkU%MZN-p8+C8j0 -YG!4'j-XG'!$8c"d6)LBKU&M1XY8$"d65kCMk*Md-59$af51+4Nk*PG-bi!4m)@ T'6TUJfNC1[`b082(9)[T'6UQ6%c4d$(jCCU'MLNV8c9d6!UCVU%$*r3DDNE6A5C Y3"CB3$l4N@[`!4h6-ld[@U@*0C-iG%bBU69d6(M",R4-*TR3S@-#b630(6PQ+JF NJUe-jp#""H36(6NPAR4-iTLFS@2LM4iGNfiQGqL)QmND1UE%61c3-3PPXSH1U5[ 62(4-MCN%!XAJ)K0"G1!)Nd&de!B63R4-rTJ8SQ0+cU33(EN(-p'"*8`1dB&E6!c 4-Dh&2cTU$Ra!af5G55)Y!(M*4"%G1%9rJBkkeAX50FSGNdCde!'BKJlXC1U)MSN mddGdj)!T*$UQ[%`Md9&r6#A4-68(0fJpk#ZB8U)$4iN4(EA)PJ)kmNlYSf-lJDd &G03If`[SU(YU""d6C6B9d,&4`#D$[$V9R'k)ki5jE$#J!aIBG%"(6X&2G'`hX"Q "MMTM3`)GQ%fIJSjBb3Nk0J(!HARekRRBR%!(MY0$S30hf+4!4jhSPHYkq@@6!Ke E$Z!-1[,+CJ8kHK%f,0#49r"@AS2k!c!"(Id"YBN1I'6l!KejC3X$(I'cMB'1[,+ 9JBlT2pXCk*JXXk@"MLNafaVbKUK[C'X$(EM&KJ8kF*a0$A4J"aXEk-J&Qa[Sf,3 JYqM!*hS6G%bPkIAN05SqYMR38D0X@k#M4YAbY1M!$VBpd*&6F!!G@aeJ%6Uf%ZK 9d6'P*mrbKUShCQX%(A9*hiH1q0JH33H@X8@#MVTLQ`3G23eE*1MBLQ#E""hiLLd kYN$)JlaKkN[C-N&(IE"YJJjFTKE3J4eXRk!MGfbJS+0RBK-&(GXHE+5JBcZ#c44 j`i@AE+LJ)cjk%(6J*4XVk-!e0PI38A[J#6VXf3""4bm)EU1Mlk42P,HCqRq`$Kf aXU@"$PaK#`3GI39E)ZM!4,Bid&(cE)HJ)er8#cSf4FJY1VC4Q#'J)krJMl`4QJ@ `KB+1hT9Y&(6d6QbPS+0RB#X&(IJ)RU#McYP538Hq`!&dE+831cVLTNH6TmB1E+f JBkD!(h6d(fbaS+1ASjG%4pc8#cU`$8a'"aD`iB+1[$1M3!H1X['#MLdKHL*j)c8 ISGp(aqb!@3dkqQ4k#R6dJ@bqS+22!@I3d4X3&cS`JmdPG03d@)'1[,"pKBkj"9X imNCTEX&'%$TkAcD$d0'hdkZLSaHP4Y$4ml!aK)jBf4a#"hD!UqLS"lCJd"%Vfc$ bYY!XJEi2(6PQ1`BG26PE-ZMS2r'*MPMT"G$45c$E33HfXV'#M[S(Sp#4)lh"XS9 Q#Fbij'fT[TEq#"ep,I-SG-`8k(r4d3qaBBD1(JRrk1J"k024J@YXHD'MaZKEd@& $VbG[Y1C+e$8kCK2J2cVbbMB61[T!m!dGrB`kq5!k`@icmKX0GTJCk@KbTlDHj)e KCKGIR[rCM"iGG#UCV9E45'9dlN-2Z#aalpFmq5B6A,$'!320QXD&P-'&#Gb2Q,# J8`%,bPPZ)1(K3VU$#qeZTKXQj(%K`hCAh&imeSGcE($pJXbG1#NRZ0"Db)BE-AL iS1G1USqFbhfIYNbhGX(("60hDJj#6jH[1V,GqJB2&p,DlSj1VPPAAhLXdFVbV(+ l+ZV*jUHq*QcZKPMN(TZRlDj[EbaB@el9kJAk2laR$Lp*ZbUcQrd@rAJF`LlFC[h 0-cGr,$02kPVkRXDR6bk(El%I93hT!MEZNfb[)`qe9`VX"ZRak"NNZ#UM+!IBB1j NEGBrA"SClFreM`c0$2&YQ4LHXHH9E#R22RmVdaV$bm31a+r%KX#Sa1G-BXCVXqG mL&`XF'X`$2KYb-q-efE2`@+Mh@qim3[Kbc0m6MTCGEL6G8[Z'j%bZKNN*Vc1)BN &TL05"5$e-%48!5I94%qP)hr)IAS&kV#*59Md('D1,mHcc3J%b%RDEV*&hK1l+@D 1@mZa@YDeJ!-,`mV@iib`9M$"FQH,9J+#8peNSNbm4ASLe"K(i6NfhddaK#%c4fN j#QmSUR"3PJ2,((2RH$-([$R@c@)TaeF0*4'1,A1iRN2U(*(Qk$e(j(dk*"bKjjJ r4m-j[XiKFJi!Ff5G*3L1VE,H6V&c)*A$l4abjeJj4lBjAXqa@ilhFl!BiJ%FhHI )2d3)12E,8@-1GA-`PS2r(*rQN!!mah!j(-XKHBkKFeLFSl8FU+I@k%Fi6-b"Cbi )Fb5IJrXFBZqQE!*+F&bGiliFaqDB[U&P`MBE"qmjN!$,3@T)$KKD,p`Y-"4L1"M -BLIPUJrhUf,RJ$U(rb&P!!%$I9$rphJEdTHKcUJKDTVBU4YUK(ST8*YjjP&A18Y ILc`#8-4(,T5"`&IXBK(E-Kj"(DU20,P'3)Dk*qmCF8bAe(@'8[#U3K%[3AbP8(4 PQ1SM*,Y#XdP&jK5db!b5fm"TkCbVY@k5l$NXdY`AmLFcLc9$9KCVS%r9(i0ET!( l-KiJQ6-pSY)T*&*8("58dfGKVHML0#`hCEU'%mLNX%pN&TP+q*e*[BZX3YBLkj! !$FJKb%B,S)"b6ZJYFPL(!eTRbbG@UXh*pGhrj-k9CCf'%aFpYY**C[I[#eU0#T5 lbSAN0X+!Z)!VGiLiG$KMiX")S`A9,([XXmHY['M',ADh0f0SbR)iX3!q1q`LTCT [9bpc@rcpeT+l5U61'8`ZA$GE2ZaA4(Y`aM6$ApK-&FibjAP0*653!)mr[GB6RJU `%Dcff'p[qpPV,Z*YA&X8iP41)q-e,[k*&cC8G&1M9j!!V"3TYm`mB6aFZ4-qfLc A2[ABJS5&V4dJMZCL`E)$@r(b4&T,VhQbB&Q$24h(M'(,5ZbT["ib2E8HiFBiTSh 1cZ6R,I'ZRKF`Lqej+Jl0r@[j#dM*pXHa[@@jpN`FUa,b@"bpDIp0(2f"2"V(r-9 c#9Rl9"bVbVk5$mC0+Sl9f3MjjrEPBa(8Dbd"FF`pQpQ"[(*jcF5a%SNHLf14CBr fZlbkFDbqlJZchr9ehepPXQRZX!2ZIe!((SJeSKIFpB3cG(pYV([d-5G&iI2Gam0 a++kiUeqH*A(TG8"Ze`i3"dm4Url6ih,!`8(Mh!QlH,%iQ3(!qi&l!PaMkDF48D2 6IdhZZE)rD'M+eNBj$#*9F4cM@cCjIic$-Y",(a[A[c1iF(ZUKC44RarT'5LdrPK 8(1eRbf2pX`GJ+km*GXBGhq`reZ99aG&ek1Ia1-bU40-4Ik-RVm34FC)Z[$'C(e- a5@e2G@bFLUf)`aS`&CZkElrPD0PAd5&2lG*V+33C!0bI,5"6ZYlUf$5PUm5aB8T AL@2$P'j0(!p2k3ELX#p-kAVbd6QPfc!9kiRMLDRB3"`@J@R@I-XKmir2qM'&kN@ L691S2N5c"8bK9"bDN@F[IUcYce3F`SAVIjXdGb,aG0'UIYTM+&pkeGN6%`",4@G U"HJ)K2Vl(dje"hQe+b$jZMI$Elck9ER&2DppGXBdiVplH`QN[a)IkHdVF@cSl5Y aE1MYem6aF'mr%-Fm,`0JV2TI[Ae22YcH[VmMIcb1TqV$MH2%d(+rIESq(TPCp16 MLCR&3"bVQ`+*3i"k9@IPa$(rl!i13Fb2E"[Fif0"BH+rCVLpL,D!SHP!(&2R$hd V$Pl6mi2lGIP3FGJ$CJh(qfHlVdIcXATQm@KpR$K[Z3cr+Bj"b3Rrd)jUeJ[p8!X Gre"V$(1jN!!F##XDd8PTreUd+KSE,lFd'a#RUMal(013!'Mf--2&5XEa%a5BUa3 r)Q)ATRi8jjRSL4--0e[himG$6BrSqU(46(Ip+'C$Drh!ILMEc6G(aMFA-aY&0bL -jkb1(kJ)eDIaP+p[La9-La,VFIYq)"-La!-UIPJb6hEp+&C(Dre!C+GaSlkYT!p F"X2"AAS5%0!`TD)(--bSH)BM&$f%,H"j"rFPm!Ee*r4Np$hd)23ep&ld5r4@p"( d#1!rf+j`ZjGr@#IBVq+'j-E[&S6TBQ"5C6S"k(8Cap$p-Y`NS-Y&XI#JjQ@+!dT FKUN"9,SS-KlcFf,NF5l+X+FjcaBElr*1dEe6DG+kMb%02DhENHC)k,H4X'6LhC2 NfhRh)U%%CY),E6"df%"V$"e8[46a,0&"iSQFSi-H'$6)d%'M$#TIk-JIG-23RFi (fQ$S,ZB$b5ad9r1"pKHk$r'"rKHk@rK!U``G1G1h-12+%e6'd2f8$r6&+%2b$Z8 aG2LL"Y&"d`bUCHLi@NB1dA(G442U6BMX&M@2M[-iQQCEiRBq8#G$"fcSUcZ*hq- $G60dRq%$I6&dAqB$T6&dj!N+DHJHXMJ!4&$cd"C$4je!R``G-81Y$"djSll33F9 -daj,LJDD[U55&08bU++K)hpJ#lV6q1!IhEPmp#C#mNiq8%e$pcBq8$e$4me"p3c GTrP!e3cGPrKSNQr*cr,4p-U5Rq0$[D1lMiqqfj0mJSqq&C35PZNEU#R92&L(MPV 50eC6bK'j4BF00023N@0SXU%cP0E3F@0)Ap",[B12[N#A1QVa%pf9I+$-KJiXK'B E1V"3Rp&*r58IU,5KZj-2e0[3hFd(UQhS`"Ab!(46Ve#%3`IH3481(9J!eU'MIU! 1Kiim3Z80(6@UZHkNKB9J1lSPI+$,KZiF2[K"pdBqd'G$p`iqd'K$*r6Zc)QrY1M GkFY%D@'N[JQ82XP(haP+r`XIIE-Ur6JII88ZSjj%hrV+#02eVFQ-kP,ITXS)Dk! HKiikecGq-XSV1)11'Y#l24RCkr[UQEIadA`l-X*iI@NSmf%qqKCAjXrj3#X1h9e mp$JZ)laFIF[G%[%50(QDKpT+6Qd&Sdj1EAV#+2i0JcY92kTZI)md3UU!M%FH(C' U*-q)$ZeJfiG1YEeQLqd2AfElad1XIDZeRfEedfdrHTMY)3qhpV2Xr`JEjC(f2p[ fV%ICIVA0qTPMijPVrr2N6r*EMDa#eL$VFC94KN9@)l2)'Q3Y%YXkC"+C3LD3!,U 6,DCmm*M!Rh6`M8&8,fN)P"N`E*kHX)YK0VGhE"`h"`F'4"#S+@SemPaC(0m-JdU V(%F$KbU("hERG`p`3,pM`'hkGTh5-[)5V'SjCh!X-$hLC[h$TC(4rPcrb0$-%0q @LH%CZk&V5hQ2d0'cTVrkfrVYdB!iZKhhV[3(pEGYHc!$T3$N$%EDc3HYrk0Lcpk E3eFR[M5Vd`j22irjI-q,C`*%'6bE'FIrM53drHZ)9Kl#kaB#kV'$kabDRe9QkpS #X*jXJ9MEPh2p*((8qFZTp!KLb(0[2fL5!"@f+jS&`*CG2acD(lh"1N@X11LrR&A -%hi'L`M[54*(pIC-5N2ai"`me!ldh)SAjU[&VihRc4N2YcF9"B4L)R*DRDU-ZN# 48-&)*jf8''H68AUZp1+e)[G5%Deb5RZL$5FZAqUEQPlX(6QH6VMbp'3kr5Yk-SV TN!$$b8Df4+XbkqLaqV3QlA,d@"eDNjBh0!LI5kHh5*[@kDLYE-3hLl4T!eb3!2@ %Npc3cf+M4"V3TVA9dHQefG'QYGA4,-kNG(VllK4B6jpX,l9@[8`AKNlf16Up0S4 GZc`0A8X[$ph"B`*(2rX-(qI"`3GR3ENFUa(4%*Zhb$ffrpTGhj*!YlDmkX`D*SI `2*Gc"VRNRN&Z6pkbfr2IBMqU'Yi4YC!!RNrq+bCb#143NCkh(EaiKpPGpFV#YmF Ac8l!)QdM"cLTS,mp,X@CZXXAr!E"#Ha+3B#UU9*TCX8SFph8$F[-'q+AY*Y6dDE (*JUMq'b`rlMp*qarL2dR1a%N0KH$1!L$QYKNF3Ic&"PT4bRl6hFF*Lq&IS9l-P- -XYC*a[kVl(qSrGIDIjhqR"rR,peMd[j0N!#0R5"65G-Yj#a1E)AP*%U6%K8YlDc R,Id5HHY-RiQSf[T5Ip(Af`bN1Vic@q3E[Lm,bQlX`jpP8P$4f5j92*SlJh6dbC2 heXil@E"GIIc$jje-k@H`iBYHl"q`pKI+(p8LdVP`,[m2I2U,*aeRrS2C+K"Q'AT f(Jk9pSSDYXNmHU0G6jFU9eGMcZ"((MVe"FGTI5U$TQ*X+Zm&D[AcZ$"+Z2$VTii pN!$TKJZlY5FcREJ`bI3,8ckDkBB,HbD,IL%Z('6kKHpQSE"2YUNp5mc5ST!!V@k FpZ[0QTI6%(mlQ0+-qhB)iRI+m[+H(@"PE`hCDV8JD"Gi6c,0NC@m!C,D2JPY4eS CPKUp8DNN'@dm*Ip8RU1+(aB6NedrM"d6A6mXM'IArEK+m3-jU@G[N!#6%Mp9I*q clXH24ml(aAkJkdG3-2D+VKmj6"qlUZZ(Nd`9%PMLKl@@KQlpe22GTPXAkreBA4q dcF"Q"Ba$N63)G#FZmSj%EVjQ0!Cjh*V4EamVjKVRh6M!l'dY[DIPEcXkXTAfimK SVcep(cdGr4SpKmL8HM,k,ASIqL4k+[SEe81ip,Rlk$G8C5I4K,42d(XF(&R3-aD 1pID5#8![IIa0%i!9F9J$*J#@JBkl,F`!Q)KD'MVhhLVEe,PAiYM3Z9ILf0#jViR MiFjp)!ll3ZIHNimR1[HH1*lSh!ILX!KdlUYm5"SQ4[9c2JiG,RfVrm#(fq2fj0E k-3(S4E40%i!qC,3T6!$@eDZ+`bSa!4K8,Y$R$MKQmqa!h#`X%&c#+@1,#$&bCi( H5[2XFLHSE6@d%'bZMfYB9TK4M[f@6iUJi[#9di`Ge9FfQqA6eaQaXd$`*NNE!L, QHYhJ-iBfCpET1Eh'1@QXq$mN@q`0$&[!F@X!Kj!!VPY'P32V&T3hHmj[q,([e[` MjcJep2Trk[c2l$R),,6l$6Gq)AbRM'dLYicUNb6'RFZ+"qH!h'PH&)plEX8,mpA 93frGT0M5QhSZ0,f[cb,6i4LAhiQ'Q%XFq"Zc(Hi4@LrhJQ!$%h1Z6eM'b2&6VkM XAQ6PRZ3@*#R-*Y4,FUARq!@YI#lh)$!M*AiE$5FZAqUEQPlX(6RHr$Ep8+qN0!' @i4YFIX32d@8fZ1L)(`bhhq$8)hlS)%GhrF!KU-)e52c!)DM#d8ImF1'X`R&)r-! KU-+Y52b!lK9Z4H+(rC3+0b$a3pI3f+dcH-B-kFE6`(H(pAMF,[i42eE54pp!Md& I!2U"GBVIP%J`fqRH06FUNH!cf'X2L0i!V3rJ6Frc"aVr(Ij!p&6dII4#p$Rd-23 Rp"3LdqT"k12SdHMl9'pJVb&$E*Hl#fQ0Z30RMaJJbmKAk(IXYqM(ifkM8RZ@G9, IkdZKR@H5DamJA@h(SV,U%2eP[T,KNPfeqZ3*Q6-PBRGjcNdE33K`BF*JA+i0,RJ 0,r6,@@iS33ZPF3'bSJBAfYe-0dc)id+DX8"md*!!+fTY`IENT$J,VPq3!2N#1h! &A("jQG[A%-,$KH3CA"#YX`eXA`-'$aG5"KGD#pP`-dN2&p+GZC-F1&RNCVU0&ha Fb&KFD!j#Emb[CE(0&(T`S5VPf0V(pR*dpKEE5pXN5mY+(#eZ9(CVhdbX%dIE@3C EMm9KR@#0ZDKjPUIG3&lYEZ`cEFJFL2ZBCeGR*c(2EQXfrrFXT*pAq`5$l8(Q"XG @kc`hbpU2Iqmr'NdFhGM(9[U$fSqr6+fV&BDVkZ#CJq,KNp5,K-4,fXd(,p)ZiVR 8Lf)p5l1C!!X$DmKkaE-(eK*X0U6Z"eih2C[qEN4cdUJ34a)VSUm384)V-P!KQ#4 @6'*5'd5C4!&0&5'hCIb8L6H*3T'f'##L*1B3k+RUaJ-+99pJ#N5SH39qcZViJAK 2KI#6+#$R8pZ0'`SDG9drN!$kU4#)%R1)-P@)2)R9%,i9JNjLaI4R1H%R2cp$qAC Xe+-9mN%XLCj!!45JTGT2c64-[C()cGH-aL#2@c'#6lc)"$+*V%DQN!"Tj$"N"PQ &V%A@)aZ3!%13!%-h[qJB+A'cI#iGH)C*V-TFH4NpB(`6@!kcj*ebIIFrZA2&YZ( %4BpPd-bbK&j9jA#bpI3j$#,IDNK&#QXP#dX"U+2kGKTNX,Bm'RLR8@C@DCPlM&( EAEq4m9)%AH4,E8$2"X&A9-TBCUBe"dS(KSUMqG(CGDkpA19f)%!qj[rIXIU2ABr BYIUm3"peA@PhIIE3Cmq16pBLQ1`DQS4iCYV,U*60$HJ5XTPKD"+b,F%QK%ITl(H e)B%kC-,Nr@QU[0ERMXMR*d`)2DjUAB(%R1p(UR'0El3,FUG9)j-p+U@F[HFK&@Q *Kp1c0XmVdb2TD'aR9kcV,6r@h!j12RCaf9hX4e@c"$H5C@EBj**!1`"hhB'bppE Pl!2V@U'Pe@D4IG9,A+"G*0PNNjpK'!aK!djZ0e[-TVJJ!1F3D,'re*G9jJe@'!M !@HJ)IIRc"EXFS5mcAl$2%IT+*h2V9$+hVXV#Qe[Ei2#!ec1hYX[Y-rM%%Zebq`b Cr`G"l$1iGrEkL,*C6pqLC[PZHqI%eP)!pVNlH`Qi3(&Sc`V$rfDcrZ(5b'KrVRp ND'D)Em[%m%areNS*E)%mf*lpQ@S[,lBNHj!!-HIkj+kAX-[6pUh@ITV96cFAa'* [5QjqaC`EVIdXqcr#)Xb4pMrEA-)5pQi10i%fkfH1M@HZrFqcrZCE2dGEr6(fIkb e@j!!h"k,1BI-aZEMCk$8XFN9&rYGTIKCHE(Ipl2bBVr[Crh&I['crQ+rq&PrX9q FV,rB,hkSVFSPI['MlVfYM8IGK"ZiX#pqe0fiYA'Vfh*VrDMlFf[c`f'fRE[a$11 lr"+raF#2jI!0jKriAi9pd)kpGa3HXlVEqRlN%UI`m-XZ1[#Plhjbk%Y2IEEh2Hr Hp6dlFaIIGF1"e[MR,h6H@-S&cZBV!fI,cJ(RjGZ1A6(Vp#!6b132EBfGQdBZHrR QRNelRD@&5arUfG`c[M4qhfH@EYUal@IN59RZXh$TVUf2MMqb0l&X@2BqGZZM[rM )fcphc`jRqYEpYcEZR5d9(RCZ8Y50Z9IXcHedcVrkZpklY,"hrp,0hlG[Th2aVYG pk2dI("[JIq@a$icGmr!ElNXf+CpjL4FZFbm[XqkTGU(q@RV[r15$lIVErDTGIIq 1jVR'S2l1hlAF,erj"C*6e``KDPUlm'mBM&f,Gi`BM'aAMf+I8ID2[jk4-BUPS4l I,!ph2q2K5$jAe1-+G$8j'9em9h'b1[eMp6Mk@T5$'`8HAHcV@0rHM+'T0fA"SB! Pi0PK0b'%ZBQ`kC!!e5!$KXh6%q[d6@aUlpJiEJi1$"b#X@"6e'VN1G3e[KN'P9B jMJB193i2l-l[(S$-GFH!fr3(-NN+!$#XQLU9CPD--YG0hE"-36Yq#IGBFY09,aR 5CmBQ#U2iE,$rZ2dRl(q)r5IeCehELb5aZ4M%34M8A)iEc3RGm"BCDBFTqdph(#B [KBqiifT"`MGmU(9LXP#P[qa[Q(qeY60qDZfrcYVAk#qEqLTBf9j3@4+pqSYHfBN I&CrmkqdrDq0SY2iD1NP+LCG,$VEM*lE#FT)PNe,P9D++GlbPAb*[RHNhD9HC%em QJbTbf59*GAaRYXLhV&JFljIGf!mDZH'JiLd(,-j8-FTIlfA%&kpHBkQif2)rdDR E0"H`8HcEf"5iq0KGFVq'CXb+EDFVHYpeBKQ&EZ[ldIV4dpYQVl[UVJb0EE-`VaI f(Qf6cZ[+kr9(-hffk1`0$*YX1RLrNF54hD@@E"i[V0P2p,i[Ph#INRGEhjlAI,A IZH60pf9fp(%lpVl[B8Xr[LZ[Pfl,d0L'VZ4pm%5a84EVi5j0cZ%Z6IjkrB4lf@Y DLPhqfX[iUaQYBTGRM,NYGY8f$[mfcHe9AH4di[$YPX#"-5%lLF1hfq8hL+maZD4 6-l4&#A,XaT+2q+l%,[ZTIm"!clfhPZpTaYq)Dp$T@IFfVq0cXI&hlC2Sp$aic`m 4Ka0IpXZ'3BTkckB1BKHE1,BRCrVqEQblf#&ZDIapr)r41AGfBq-3H@amd2M,$-Z hBcH6IfD,XAYfJ)&c4cGf"h'-IUHa5r`R"XlphpMfrH5MbYM9+apkmMFE!SV*R)R lFlUhkY`0MPej24mGhpDI4ZIF"ijGUGfb'Z2[)Z@)@klBN32R-P(0e$&da),G%[P `r*dkMdlcLAc1,j!!Mica0eRea`eAHFpp&jmA'hpI98ebBa@l@pYae'bp'Ge`BlI l(a,(0iaGqZH8-mIZ"1*1[XVBcIee$%BBZeIm$U@SkfrA6f#JD$V'R,Gm*+hAGhd !!bJmbMX,0S6T(cGfjrm0"U1-hH*2mY(a2DZ1ML[-mPj,h9FCR-Kql)"UfS'rPi- A5902fEYr&S[40UphmTPMkqb,k+3H&3lYPGEI9VVb"#G)l+K,AAqIdJl99YEZm(E pC6p'$Q*A',Xj`UHE6"cMIJZGRYI2eIRN8FEI0m(#f(CM0draA'IXl[pT&DU1laJ q6FEZGY@6[NdelmrD&kQbJI$*Z8L9H#QePAEUF91ilXf&6KFRcDABX5MPfed[E"! lZ5MPfbhpDci[UXFeiB[[ldBq,ke(Drl1%X2+(*HTmR%Ir9!Ell1hU,Df0RCRJ0N DlfYq@,8Rr3A[9-@RkrK+p3(kU2MVEf[MIFhN&p'"jjK)A@RmU,RLpc(3C#c(hY( 'qqb[kF)DI$'aHh1+prF)dqNTj,fErX2Jr5MG!#1ImMljcMEHChp5GEb$XIX91'A `[ZjfeDKMYr#40YjR@m*Xh99Hm(L+pcISiKKp"fP(Tq2l#ViG*TaLpi-8EhkYI1p XlHj,mHCki5,d0,&l+-AlUe3cLTbSF0b85f-Dll1RK1Q+VkM3h#6('Zm[8AqJ+)a +Z9%6'ZrVMJMS0Hj+$JcH6e-Y+D+M-HH"[f[MIAEar@V!(,Y[F*e-ihhf,j3lcD2 J&[SP8kpl#a0ID1cZSQFbH2r"p`Kl(,YEKHmk[[Hp(4dB)Zq(i,("qqrrXR,Tf0e lGiVhPkZRd@3ife@h$YjR6rd91V94*1Qk-+frAbRA%fdGd*mip9G6)THaI6B1BY, peXcI4JIfBRGC'qqcAe&06MCf&p'hD,b[fDUDec1T8p4cD,arJl"XIiYr,#*V[,p E0AQ!XEXIR$CiIkH`i8"E(h)VcX9lEeIX5pLjH1rC,Ae["qppIh,K,RDYaA[2lJc eG3E[2E[E&Er"HmrZ3IUcY+h[VF45rLA'lZIJMHR[VrNR$+3[j[e#rC+ZilHI8Uc DMVcTr[i1DPUaij6h5hTIdbqH,maYYRdR@+[ajPerJSiHN!"kZME&qeX9me66&qD )`q$p%IGJi5afahH"C`E[EaBfdrH*hFP[D10ppREe4SHBq$ll+bRHAbTFD6Aq@ZK 0$GjIU0cTRIiPkLGeIlQ[HZ2T0RrdXKV[Ir$hk#4H9DrN@0Ipepq+ESDe!dmehYp %6aqE0ABrrGX8llqU[-kdrUKAMIHhU&r4ZbG,eE[V1#l6$)*q9Yl2k)mehQGrpD- Bc$*jhAdZaIZlPHmMM0f%GkIpr8*K+lF-a@l[ifQpRL%-%IrBlI1E+Glr821ESic G9ZVjG(mr@[F,ficGrL,*VZG!lF))HKDaDbDr"ZrIrJGUX*hmRIq9Y,mr9,QBCrX `G,VqTJ[[`3hk9qB&Z[iH8)r"V!0rc-edr5RIp10!1Vf1a[[[UYpPTL4fVG5@kHr [eqb'R)[*0''Ba[X[DeDed2Dep!3'lkPA48Sfe[0'qNZ$pqp4MT`jAIabiR(ahMY mIiEUbZ#pEhGA"qpp1rUr1S[hRYdGbZ0&&ZmllH*AI,k$pjlGE(SGJqXIISH!60I 0e5QZhk"D)8jaGC6U8q2kfBV*Z9%C[dRpTFD*"p4h[X,B[B9qaH$0#HSYk5R%lXS (8V`j62K(EbKfei$C*SjP6f$"c%G-VQ@[d1$0,i6&j%VXfS@,1VkIU$FqfpLpJrl 6i-d"LJ'F&,[hdbpU[+RC*0rR',XEL-r8`8H%j4FCZqQUA4h($Xc-BZT9aHkMQXI T1RJrXjbBHPiTqC(rR1E[#mc'BTTML0h,k3Y0(AaEmB%RBMH6QB6TXdqM&iPTTL4 ffrj8'XITMf*"(b4fEF`I64dX8ckB@C%2kPAMlM(U135ImAFdH'Ikl"Xe#hbEX@X rNGE"RTr"JYQ)a(%MpQDZXjGk,@)8Nj[8dqJk1%)cQJmCZjX9UjlVE+kCKFaKP0f b0(r[98kC8p&TGYC"cD"bala)l**T(G4X8ApcNl'VCLCNiRLeHTZEM9e@Fc+R$QT HUKkEANEXKUJIeAAf2G8614HldiMIe-(Rlm+#(P$XAJ2'QrlM%YNaNj'3!1I3AfB +pAKKG5kq9,NFAJpd*pClm4ZCkmA[Qba!Y59l6,hV(FCZ&RL3!0KCEbBAAldi,RL EqK@CVi1IRALFf#UX-RGS1rh&6kJ1YChrPUUZkZVZfYAA1c42HP2G6IU-cTGiXfC XAdrbAIf%X)fk&VYADSkTl@CUcX4m&6YkHQfh6,1hEaUl8h8"9pYG*cclPV&EFRr E,RZpHJAk3E%l5M-9lHp"c6VTDm!$q[$R*(D*3$faXcmFrm4rY2Zma$E0(*NjJ%r -Ejaj31*N#adc0l(lQ2SpTpp+r)6Qk&*ha$IlPi6PMYejQXdaHa'lXHVj&KUll`J ,`&La'kSq4qGMQ@Ed2l*fdKqEI,aEG82[JadiV[-a6rMKe'aLUr"8jq0VQSmk&i- 6iCIEqBJr,TYlM&f(-%rRieQDHA'PQ$k!ZE,1alRUlqqeG[6S1KpYp&)aFddidDr H51GM&"JFdlb4I)$A1KreIiU1rT'iQ8hUqTLL1CCcc6S4UbI6qCLPrZp"QIdI)5% &3R9TE'3!N"`*KJ%Y!#`"[3%l!*!&!F1V!*!&!5'6!*!$KJ!!!3lrN!3$i,A5l#@ f1DI#!*!&%TCi!*!&!I65rr(rr!!!`d!!!![2)#!#G'X!N"h9"!Q'!%i!$!$H!5! !N!-$!!%KN`!#U#X!N!-@!!(fU!!!!3i!N!0"!q#d(A&fYMQRiJ#3"3MlL3#3"V' $rqcrr!!!`d!!!*jP!!d09'Y-D@*bBA*TCA-ZZENZZ3#3$`1d#BB!N!U!!!!"pMJ !!MUK!!(f1!#3!`&069"b3eG*43%!Y+(TaVA6ppd!N!8$$1S!N!C$L3!!)Lm!N!B *lJEiUM-h)mbLK*pEEc'qX0D&CmGZRh5K9lNF)fa6ANB[mcLpS[N,1rPjP4&fH1V *9VBbIG[iRN8VFk(mb'CNm9bmY%X[YXr)SQ6K#bGEXTaN2p[NGNTf6aDf$)`X4fj j,lCGq1+6K41fBmZaE@3KZb2lb*j%f1ki@+d!VPqhD6Z68&kRpJ5!h%*Z)EFFZBA mFZ3@FS[N&YG0+%"ppVeGCN2I8'$6BVdjbLD8+pFkVk'C@fplAKHl,Zdcb+r1lcc SHCDMc)(A`1mF34e!$VICQ`dXAXHlK1He"hRa*LjfCZec%HTPE@!Xr!'h[YQ`5CH $$Xq[MLcR"*)PF[!hf39!)Ik!mc[2kmc%F5%)JL9"N!"D(h4mk863mCAP3A$CTiP j20@4iKKmbq0XY$0-NRbFT#H6H(q8U6CMh5MIJNdc$dl0M1@RNc!jf,FPQUlPFP' 5hPiV9I2&D#&mGRSX,19UB5j+liLUeA`T9eR)-#HYJQUl2LT&59M0ak@&q,PTLQh E0a225`pNXhPPh&")6j6P++ESLQY**NT2*9&d,R4jV9+0LqNESS1ha%RfA2656#D U90+6BAAIZG#eBC+,UNqqj[(j3T6H&TE,hiaG9XXAXZQKf@S5RJ[09&&`Zd,dJNd he)Y%DU35Z5*I#5Z9U$KGL**[KUmUa00@)&[cYhiVa5RjdXbh!Qel+j61c-'VVqC "YTCjl',D),LlC*F2Eq0DaC*C1dQKEBX+#h%RK3G#hA*V@-VULBUYaBqhhD8Dfa& Q*RBm@DKqKY@eDVPflRRpb2V,%lSLcLa'"rIYL+MJfS0f6JiZPM'4r@9-q*ib*N@ YM!RX("VqjkMD)dVNdNVa@qqh*VUe9I@APc2I33&4H"8&4"R++##+ck'!+,#'!U) 8H433K4C43"5G4`&4D"%&40%4#SKLmbLJZiS8"864)3SS4qEE4cQme$l++E4pP!0 YSbL86S3#UX(G*DXSS&!b'433aC943#8qJ`)UX3888-QJ++!5@Arj)JU)SXXS))S 288!jXVq-DbLJR+*@aKB&9+*UMjK(!9&S"39dl51i"`-%`Ad)))M[kIp"G+Rl"f( p[6p)81Rm3@#pl`HaPDiI"0ClIK"ElIK"C+AI&qSPhqf$f(+[cmC9@N3fZ,Y"C"2 Nfd-f,'S$@L69$Kq'eSSbhpfe1!Up2BMUkHbjk%*IcdA@ZRSZ2Yr6Fh(9Gklhmb# fTjX(dH9HRShV,G2q2Tj08#R6U)IRBLV29ZRI3@#qHdZGpRA[-,M1iQAMUaaH0MV 2i'A$Z[QlE))#HjF0,(0hfGJ#FjF0,20ffGJLDjH0,("fPAV*-(ECf)L[Lq)+0%m 8A#&jSJ3CLLF+be)jZ5)TXR6&d&T4CKLkA((Nq,PX9*@G+d6RZ,P#C)QC+m4RH,P #A2@GbjaF0VE+b'@M)ciZLZXYdfiZ,NT3+G-X$eH)U6aEJB2,"PDapa@ekHqJE`h [apqDS4H"Dh`CJf[J,K5Z+DSiA%1lNEK'9l'iKRDMFBfZiA'0V5,bBK9&Q&bM+kJ m&eN&I,R`(XLA5a'"[PaJ!H,CdURKmha`GmP''0f@6"'PDe`[6JrMLdJpM+eMp6" $K0E$b2V,Gb0fMHl&l"TI3Hfjb2ibhSAFFbPUC9a!lf&8l4'V#&j$mbJJ+'@LZh& !-8%9#44cP,&!-8-1$44$DhLJQ#52#)V"48a3M-qMJQ*`%4F8ib0N8)c1Bi2HfP* d8)`2m8%e0YpDUJP+cD@D40Y,0G5fNP*"48LK(YjEd)S@5S@8`3[&b$*LU'A)B)C DG!%ee()SEUM&pY4#%6X8im[SSCJKa!r9f0ePAX-3e56GC@ja4#fZqdRc@+)BA1% 8eND9kY162@'+2QiKc0,$,i3j5Ka$'0c2-i4T+Pa$'&lR'm)-&FiK$+rc$Q''+[F 3aPIiKeV&j6Q)-%1CKbK'9d"X-88hN!!YTXQ$f@*`"&hcC9EP*XS*qXXpce(Nbk[ !8i5a29a&+8H"VbM&ecL,8TBmEe'+lUZ11Rm4CZMK--)FC4kM',fR$I6c'F8d[@d JiM9+NEd2A1%h`[!m+Y&EY08EkbRjbKQ%8f8B5p&pK%+9Cba&pe%+0EDa&0j0+[3 `YhdC5Va$2lYE5V+,e#Pc[+AB2E41K5+Y"AH$iee%D5e,#4jAk0*b(qMK3HUND6Q qb)58U005k#iZT%DJeX0lfC!!#SeD$qiYLMj#T*G2,D@S8b)pV'SY`rkbVl%L"AU e(YMcXYh%5*9RMBBJJdTV'bk%#m0RqF"`G+1D8HqC$bfp3Z&'i8"fj8iKKLU&Vbj N4iZjEa-P8AL9+)NbP)L5+,a+P%3CbN4*&&mL5U,`'MA9R5,(T83CHXLV+%ZG[)T b&-LV+,LA[)V5&*QGFR3*dTG6e#"p18d1dTH$3q"Hk!YPCUHDS,m@FXa1S4rNQCd SYXlX9(,NQCe+I)ACU@6*-6Z9k,lUU$)l8BBkXa2Pf01jLm421AT2PqJPIXTTHVY %52a8)R[I[d6m41'&!G9,[J0DbZ(9V5lpS+8FAYhZXJZdP10,@elfJ*Eq&,PP-2Y "5cP,IE01,fJT"rGZf1N$,IASdQk6*d&,28eZadNID+RdKI,+QYfJTC)JZlUQ"l5 8BqXVE(D"PZlibLUE2Y$5(GeA(G@e0RY"5cP(LDMS!bhek$eGSRF,6LpSU3IEE6K pS+8@(@h&k3FYIUIBM9YU'@SFp@ld8XY3ikUI`$#e&'A1HKq5H5*,b&drK@GULES jl(j88i[[il*hBC[H"'9b-dBi[CP#NR-AcURhN3V([3IYe(2NZ1iqc&-,lqDmRd! qI5QUh2FZr01AB(IKe(M`r8#SPUC-kHk#3ld*pMH@2ZDm(aIeaQFBp&hSU#G"J8R IMC%L(RYG[V4Ge9!,hVPTiq,@0#*AcQBLelpV+mY)X@Gc'LPUQp-)V'p(+VaA&"b q9cQbp&lP&(Yf21AHUaaBh396HkdJY2a@fEMZPmSQf,h$T[4+fE$UaSY5"mL'4[8 Ia9@U2dU`He0([[+MX2T-IVf50,K55lR)RQV+TGLc@D"F8ER!hJQA`T19iX0AU`@ A(Uk@CIr`6ZljDV&pNi+eUJX6P#Z['0eGIF8d6mj#PUU`'0a(I&IH-8T3I-GbG1d GbfQHT2B,leJ1lZ2#+QLYlahVd6A8pZ3leY2dXRfPcVMR+@Xj5KdbIY$H6%q$p@+ hh2@b6SE[AZar`ViIHarfBpJra[iQpQABhmEHMEd(qaq`[ipp0rDcf2q#r66fipL 2BUr'rM[X3pJr`(i+qdVXlf*[`Yk-I5[fEGLhBkr#rJRf6l([a&k$I6Af$ZalX1r &rQIX*l&rL(d&pRhBjf*[`pk*[3[lkpMEXFr'ASEp(H`EX"684GKhB'r"ASkp!IX Ul!Z`fl%lX0GMAi2p2Ha,X+r&[K&l,[DPf-pKI`hl'H`IB9q2I3[f3H`Mf%pJRip p'2[[XEq&I6Rf4Z`(X2GM2iMp%2E$f!H`Em*q"2XLl%EXkl$r%AXVpPhB&f1[a$i (qd,XEf#hB3r#(S`p"(XSpM$XiGJMX%GL4f*(B8GMfl"MX'1ail$MX41`%l'6X*1 a'l"6X&1adl$6XHhB'GJ4f*RB@GMCf$RBZGKjf2RB"GL&f'GKMm)Z`[jAkbXXf8j L2HcC@0R&h6#$6@%EX@GKdpJQE$0@pR-h&,'$X-r$ASJGM"f#EF81a3l$(S!p"MX Fbil[!l&(Bir&(SGGM&f#23Gl(RBTGKPf1AB&GLAfI1caf&ABLl'EX5GJ6m5HK$d CH`Uf!hXUGM@f%lX@H`(f01`DE"If1Za1l,AB,GK0f$GM6mHHJ9f(ABmpFl(rmTk fAUJ9kS5kXA95V"(USeSAe!1em,12'Qr6TF@1`!l('Ub(6@#6f#(B3GKKf"3fM@h %(S"Y`VCJQl'Yf!0e$lR1jl'bEhd3[CVR%RplX1U+T9eAT(II[hqNG2Sciarqqpr ALr2`[2EVe98EIZEd`UNTj6)%44+i1)VPP(Y*-[R'$aY5Mc@TcQdlGdr0M%4K0NT kpZe6U4FqHih-AA`(GAbp#P,XjZ$#&*qpIX1&V*!!ppdf`,pTN!"!IXTA2rZqq4H 66%N&jV,hI&4fpLSpRpbMfI(B3PEr,aKi(0r5bFQaqNXPdhbY[lkk[$*rk@cR6pe FrUrk,&5AHq#pJl,X6j!!rfTpSH(VI3&dm&4IL2Z!PRVB"fbmE3$K0F-#FXGmcS) ZkD!SY*pd-RGG&h(49(jB&6"KYU"KJb!lq'#q,%5$HB4aiB2jJhRKJj'$JH'$lB5 *iIY[@"JCVJN$!c1$$`B0KJBI$*02IBJ2&K,'"Kr-)m`02Zj+IRb`JpU$M&JdCBE -&cR!l[#-a#[,ic8B1R``A$#$q'$@B!MamDi`KIKJ1'%-mI'Z-)IiB$9K%2&pL`0 -)QA#1m)SiZ0GB4Ea`D$"-1,MADN[I$#R-)liB%GK([("iX*!iS-YKBR%pjFFB#3 T3qS0CK+IC5Ma`G$"91+$UB1aa!GM#fZ*$dBCpK)I6#Y[KHm,('!cmIeh$Y3,C8k G`($LJp@%iF3(i`I6L3r@P9KmX-X`RrLi+``S2TKbQ&"mAq)!)iV[qaaJ4QNMe#% -+6lb`T,LJff%0F8(S`KcLSphKFh%"aX0diQ2GiAKa!GE$XZ*Mpi!kdQESPr!I1, MlHKeq'!ck3riH&IP1Y*LU@&%mF'3!&2Aq*J#S(IKSqG4JrMSHE`EEC!![JCELSm kK$A&4`cha8Hp8P2ik(Q`UIKJ4f&9mG'(B&Ia-9%!biU22J6,5TZPcm+fiU0h`,V LScCJC2("X-+iiS2PKhR&aa[$`1*M@S!mq*K@8%Dfq6%1p%amImF"YTU@6Tq&4FC (2f)D!"rhKPR'4elBC(``Ep3b2LB-`"IiQ%b!cFE([@(lmIdj"rSR2TJd'%IJ!rf D53Cmp"IU#"r[Ur6P)$(IX-hik"R806kQ#'$Cm6'a34jm6&$!VZ2l"JFQ#B!RB"X Q*[$4GkNGI,`a8aEiH(FQ*I$"c$-aJBr*$Q8E"fYLJ@N&I%b$N!!((fr-P!Hq(h# !+CG[L2SLdb,ik-AJ&(cd$TKdI,`G8aAiQ,k!DFI(C!Ip""rBJSN6I%bL8![i[XU "53pmh*X*#[PDKAqi#cjk1VdG(rf&53ame",6&rM)"Dl"4ppL#J-I8ae-b1"M3S8 T%AcIiF$8M(a$e6qB"X%(2U%AiD0h-e@$Mcl&T!JqkT!!#4Gmh*2T%Aa-VP"Vq*L XBES&hep`S-r)0dciPXNCI03a@!mIH)"T&Rcd,2S$2QV2jh2&4c`61[LBlU'qm$& a!`E"peFF`+Vb(5#Xa[3+2Zj+AH!$'i$lm0(lQ2M"4cdcqB12qi1Km$(K`b332[S 6%d(i(Z8!(T&[Z0k9pmF(jQ3k"Kr[bJ332RS`dd2ik%(d)Rc8#EdA(qr+9"%qTT, !![Ki9bD)j$Y31*a**hcJ62SR2ZU9b5Gmi!IZJSmqb#382ZUCpm6(IHK,q*LNBQ) *hppb!1r)0d)iRXNVI1"'*V$`dBHBa-*(c`@,iD0(d(2`F6r`)$lHNXNLI0rN!)F Jhd(L)jJd`JGfBH))(eL1U50mp&FQQ2$4im!Qq+K2X#dqmY,2mG(,QA6#"dkL&mP hX,J*kKFIH)A*,hbm*404q-!$["8qHKQp"4p[b8392Xl`!rM!Q[4cq3i4E`*(J3q X3%hK!`H#'I'"CqM$q1MGi&Cmp"dQc2"4*f"RI(!$1UPdL,!A%elb(DTqaZ3+2V! XHI#"am#*q1MMIfBqqJ[B(ap[LX)JI1"AkN@q`p4Ak'Rii"UqBMi`-$J&(lMVDqD MPhcGI23Jm"SqhZiamp&,k2rb(5kF3HhMSrlJ9I#"&qP[q+J2hJ3I@1@[c8FIr,E jH,qr-GrM(+K"qBj3IB0Vm-%V`$RJSrl)J`q-aj[J!iGmchcd1lJAI03*I32I$cR !NmKhT,!J'!dIlrIhjZ0qj-&(,r`(mi(CrSIjU'pr&N9mdYFXjAFNY@FChj'LIjA r'`NRaA#6la2Ha)jSM!5['12r4S)9MI&r)m%Ha[LrNI3iBrcI51V6'2mh#Ll%'2m h#Ll%'2mh#LaVM2mE"CBfa[q0SRmBirp'J9YmrK!Ipe2qEa6eE)cr'khh8rj[0"b F-Ij[0"M)'2mh'Jl#'2mhQ[S`a[q0"S-Cirp'drq-mAqMk92'q$q'[icaIfh`GmE i[cBi)f2mAaZmJc(qVdhh8rk[$8aSM2pV!m-BirrDk&A'q,mfHS%arQm-EfU-raX $*ME'rif"Nc,'rid"TaVMrmD!rihaIf2!UD,Q+I!*[M,'rifKla[MrmE3Dh`19Vk ae)!arQmX[*XarQmX'-iBrcH@[Q@-raX,"ME'rid&GaRMrmE5ZihaIq2S#mEi[h' mSc(qEacmPc(qEjaU4IQrFA!"a[LrF@")BrcI1,#1-Ij[((hC'2mhRVjJM2mEclX Birr'Jkf0mArMiBb-mArMi3Q-mArM`FE'q,rap(*Mr0pi-)!arQm#[FNBrcH"HM$ 'rdf!Dc2'rdd!LrMF06l")XEi[`PJ%@2mh`69Yr*r%qMla[LrLI3bBrcI40e2qEq *R)haIa2KTicaIa2")XEi[iPJ+@2mhd3`T$(qEk,U3rQr5I43BrcI*'VE'2mhL6X BirmQUGFUrcG*282j[dRJDQ2mhb5pRr*rNm!2a[LrbHU[b[p09Rp9rQmb(*`arQq bqTrbIj2"(mEi[mR#(mVr63EA'H2r*S0EM2&r8qLja[Lr+G5c2aH!6qjQM2qE!ZG NM2qES[kYr0m8X,darQq+HT,bIe29Nj6rQdS20FEr69929Ij[+[Faa[p0&Ij3rQq Um)IbIe2K!ScaIe0e2qArTQRL4IQrDF)(b[p0%cj3rQqDkN2j[fR`BXEi[fRJ5f2 mhc6`[$(qEaSBdKMr0edeSIcIG2UD-Ij[ZZkNr0pdp5(PrkEV6XVr69FG+rmh(6a TM2qE!5Baa[r0S%mCirpQ8$2'q,mCkMh+rmh3RC6rQ`(AB)crQ`&10XErYD[h+2r A6Ymha[qedeq-mArYh0mBrpHZfPAqVefp3IQrGM#m-Ij[T[UPmRmc`4['q,qCp$Y Mr0p-DXBBrcG6r8Ej[jP`-mEi[jPJDf2m(a$''2mh#paPM2qE4Dmha[r0%Yj9rQm @p@D-rjX&VfH-rjX&If5-rjX&2q,2UZ!6c'q-rjXY2+Imhfa`Pc(qEcEph4Mr0e[ p@2QrfDSjjIpQ`rdCirpQ#jXUrcFE[XBBrcFE[X!BrcG(I8,j[cNmXM(qEik`NI* rFqLYa[Lr1ATAjIrQm)l'q,mjm'M'q,mjm%I'q,mj`NR+rmd&fa[MrqB+jbRr0aG FC)crQkYHS[cIA(%'b[r0e9f9rjXV(+Rmheci*Q2mheaK$ZArjUPR+rmh$maQM2q E*abXr0mmHT`arQqH-,IbIr28XjArQ`I[imm3b6FIRX)BrcFI,'f-rjX2PM2'rmd (EaMMrqE6TicaIr0jAf2mhhci1'2mhhce3ZAr&UK[+Iqh3$K2qEm&i$&Mr0m#eCr bI`[S1mEi[`A#lXVr,9"I8Ij[!Eb2-Ij[S@T#qEq&`RE+rbd%UaMMrp`@(eJ8$!V f"(1#0F'BB%X`*9J5h!ZZ"8Z#)F'1i',`,EJ@r!Z'"$Z#'F'+B%5`)CJ3,!J'"2Z "qF"kB$b`(CJ1,!H'!hH$UkPMkTHkT9kT8lmqLjX(UYX&i-$JZ1#Nl+B"1b-(h`8 A"KI9[jh#jh6fEUL!Jk0hJG[T'B*4`#CJ%Kq,J'("VQ"@X#Ti%K`*IJ3hJKI"Tq" 2m#)i%A`)IJ8,JdA"UH"%m#'i%$`)$J6rJIX%lrNF&9J2M!Hf!p2Cc4jJ0c!Eq&M `,cJ%r!(Z!'q!-m!AB&U`,"J@l!TQ"DZ#8F'QB&,`-rJB6!S@"B1#Vm(*i'0`0&J 8$!Vf"(1#0F'BB%X`*9J5$!Pf"$1#&F')B%-`)9J3r!iqT`I6HqQjp&Tk,,d9lK2 1%ki6MK0Z%di6,K-1dqFZ`5a`NA"8p(rkJ[#`m+R`U2lF1hK3qJ-F*G`NR#4F*"` Nh#-F(l`MI#-m)r`L[#*m)MbLcar#Pp#@"%q"Sm"2i#E`NSq6l'BBF"9i+YbU!VB "di#K`%KJ'V!-')EFi$A`%PJ+,!1'!EZ!@HL&B"5`LCe&!)1!2F!Fc"S`Bm"X!6- &i$I`(9J8l#iF)G`JR#"F)"`Jh"qF(r`Nr#1F(e`I("rm*6`Nr#-m*9`I("rF(T` HA"iF(Y`GR"eF(4`Gh"bF(&`FN!2F'j`EA"[m+2`Rf!r-"pB$ii(YI%aAh2j5hH` LqIhjb($$#r`UA#eF+6`U2#Em*E`PI#8m*I`N[#4[4dq(LkaZAl'E9q"[HAI`,,b $m!M`"r!'2Pp3h-B#eeIFUJ*h#$F)P`H("hF(Y`K2#8m)K`L("hF(C`GA"dF(0`F R"ki#Hm$$`Er"ZpQ0-2"Vm'V`DA#AB#MK,Z!Xi#VJ+1!QI%i#VJD1"Qi'6JDX!Pm #6`)r!LpLjkc#68M`0(!qF#l`-ABcNYeBa0hJ1H!h`"I8)*`'A)EGIP6FcJ32"(D 5@2J-H!ci#hJ,RkpJlS9j&qCFQ'pK"SAC%fC1Q$9KaS4C$@C@Q$&KYS5C%QCHQ%& KISAC&QC,Q#PKPS3C%QC(Q"PK9J4qMal$I!Kc)Fb$-!I#r!Gc(mal-1I"6!fc#(# cp&+i'HREF"SqPk(c(crp-PYAA"K-J62b1mLQTE)VDa``[G-[!+Q(S9SQ[,bJjEd lH[D(0JQ4rFiDR8a[frN+0lPLJLAD"T4GaY+aBp6QDPaZhqCUYGcAflZI2Y*HUC9 k-R'aYjc%f9UQ@ZRGRjhT[DERQYjXR+RdKZ@m6D1j4EiVCPLe[5aI,BEPRSajVka @BbSKm#k2#h(5G&kC91DpPqE,dh'BC"X"+r*K)Fie[G[$@aUqiq05YH%lB@cS3&5 U9KVq%d[jCUbXjFrIU#-UeFli-NRA4$R@J&T[9bBT6$IIT5XU05mJkTZZbTHbm5h 0c,+-90`GZ@DkGF@'Cldfj3D*-JmfeeePDC)li"bL(X"h,1-HkXK86kjdPSHP!`0 *TZREi1k&DeNM(8lC0TVaXF-piqb-#`GEcQcfYG'XHaQFTeIcKDD6P`fFqF*FAXa DpN`T,ip,Hr0flfa*Vba9%hIPP8R5L+&8Y5)f@[NKDd$X&5aRmphE`k*lYP@$lVJ T,ND0Ukb+A2T956KYMLhZA8iXXSpH24FhDd*mUdD('kl1b@e0eqDi'YHG5"1k-*k eUYh5l!,brYPq%6UbR8LF&mkh0a&jB0mJN!!Ri,Xk`mb-Fe`DCPadCj`[0Gjl$GY J9am)AGe*jlQX8*J1A@KA9#$BGfA+&-Fb#9,)H'AGI2$@1,09i(ZhC52hX(Jl`X3 p"-keS5YBI*P+AjYB'@FD`4Rj5XhH*ZKd3ILfr'bpNqh-U!P3acZcVLTfjY5NGZE Y(AE@'MH4LPTCR)kDV66A0&C2lqFFEZQl2,02FCGQjl0dCF+#HeUZRr9+LKfaqE5 [CiUb-iQ!B,)RH%Z86EZll3K)dMBe%qbULad3-3Uq,S8Yp4LjTI6X$)639GHmBd- e8b#aV[+0%-b1RX3kIX&[Xfd2TQCqK'AllBAmG$#UdRmfV8#Lj5fZd2TbN5FXGG5 Ccl!lf!rV'QX)G#$YLV'aHSLrkPcMfT9(lV192YB`P5QiZfk"ZEKh(ZaX$rVkTQC fEpXb00b69*)-$a%ileAJaX+QRQYl+[X+dm&!Z4b&59Kbca,8qJkjr)AC'`[eUp[ XrQ0dl,5AN!"!PCeJVa5iJiX9hdeMFimI4,30KqYr0,pl8rC&pGLeqa,+eAm"D3r 5"VYUjA+FD'Yh3j3N*IAZ6(9RLTY#N!!9c&S*dP*bcV8cpBh3`GCiqk"qdf%EH+l aj!8&41[k`lAiiIVjD,Pl8DeCHHQiAj8c9!Gd"!PU'bhUGGY844f61mqiPi@&3Kb AH1&,bhV43!D%RfJGHkYhd!KpVdJeD%!+3TMD[kAY1lPE5NMf*ZV8Qq!0C#%dl"U F''jHair,hJihYm[d$h@'P8m)&H(IhMSeJ3fK*M)[&-Kdb'QT#!*b'KJL34i&l4e jQ4e&44f4H)km6Sk5*)k+5Xa3c%"*CQ40X%"1T%"fRAP"j899Z"4eR%e4eGK4PY1 48mj4%mN4bTBS+C5SLC()eCb9'"'UL5M*`FReYBf&CN(65D0)LI!MbDRG-KZGD4E D2fX*FJh%EkY48peB10Y4LU)&'XjVp*%E"2l-"3VZdNlhE%El+0A0lpNXBIX,kk% #R(`3Pi9PPN`k06b3!-r9bjlhG%pmfHh(ZRh4(iAhCq"ei$dcK-S!!LPqY[ik(%b eLa(G!k[5`cATd,4f9IVHpHJ-PpQ"1BEP'*SV$-cY'jClDMejZ*Dm1L`A$XQ&3h% d$!EL@%aK"q4d'B8Mi@291$AYY`BlX8N(b-bJ--Tl$H($Y(rC"YRCc8`Q58!lm(d -rZiNS(8q)fF'kZJ6YpP+d(IDfXphfDV1fff9jad@IkI&hfAqZfhXqEffc[0p&Rq rR6pSMrBK1hrBeSFqB+Y$2f*j(V6lh&Xr%q1%'9EE[`FjhGcHQLfA[X,jPj,U@h% Zf#-9pX6rZeUG,l0HAFDrepZ5NPpqh1H*$(B9LN2JFqN18lV1[Ka)EGkk1Dk9XY" ap93CP!C$*IMr4r92#*N6alH8DJ9EcZ@%rGaah)+Z6R@lIHX'YYXb6JIJjiCPV%e `d6mT*IVAlrcGP@UBY'R3U+9I+PLbI(jdZIV"Z1kIMA%6e&RZeP9*4,pB*24M86M 1p'r32DqejGS'hfqpr``q'(62DdbiJp2Nkj2kC89C"4P5(F(5Fk+Xh$8,)@A@ZE4 0`lRk4CYmR#bI3+9&*Mr$%IHa"MiMbXmepm'SE'8CSZ1P#(+UrV3U(#rPi!ViA"$ $*9,'9YbEBqD6lZDaAFSAY1L#DA8MeJe1E"PDPekhC@"UJ'2Rk1#8k40bTAaZZ+N NRc&FUa@l$VK@d2M*6c3N+iV[cp0Rm%(M*cpUFRUF*Tp$GS)Qf(MYD2RFFa-d,J3 jaPE%m!&1Id!J@D!cXkrR'r+@Ub+'ke+9-q(qafjPLqACP@cAVV)$f5CPYl'G%@) rX48%aFjK+jS95'"jGHJL&FhRlqG9dAbq`#Dlq3Q"2#UDcaI"Sk,jI'%l+TV2&hZ NS[PmS8C@Z#f#GUbFDS6TU'JqAbbJLZEc"IbTD$jI**q+j[0&l+PS2PqSP)VQmmA KU@JqAlbGLZEcaG@TD$jIj*b+j[2&aUPS2PrSQiVQm`@hU@JqAq#DLZEcaD@TD$j Ic*Q+j[2&NkPS2Pr%Q)VQmd@$U@LqM+!MI!K88Y&m4Z*mP*3f%ZqMS[Q-a2LSD$k M[EBUQXp6(DTS2NqeSD,j2,fALZEcG!F9cHGTclA+&2&8"bUDcp0HDKA0jfN2YBV Qml46@NAcH4*AT+,j2'e090&mRNB[965I*d&@+TV2Np!U&FhRU6HSD$j2)SN8FhN 52U5Lq6b*IP,4I*j%2kPS2NqLR93dRbGa3lUV`j1))4A0jdQ3!*!!LZC,U(qTD,k %qSL+jNZScP8dAd+eTq*H%RTh&FfAd$e90&p#[8&&mbA8'e3dAd)lYP8dAd+p38A c*G3E9$4I3Z+c9$4I3Z+49$4I3L+49$4I3JbELZC,5058LZC,U$HSD,k%HU5+jNY )q*'+jNY)p*'+jNYSIi#+jNY)R*'+jN-lX4A0QP6[90&m5I9ChG199%p8dAa*p5! 9cCG8RDYS[Z5mD0DNhPG&mb9e"aA0Pp5HG"A0Pa5,TR4#8PK"4I-PY5pH4I-Pe30 d6hQb)ImG(`+a9$4I8L+5&"3P*Hj+4I-P*B**4I-PK4Y80&p53TGd,fG5GD#Lq9, UN8ThTr6H+TS[T9kXfcpp-ENUQLqP2U9-B%VeVk,j8US6aB3Tj9A4I#N*'924I#P K!KA0Pj+J+"A0Pj*S+"e46ZQp964I5X+f9$4IUL&&(KqB3%AcT54-8dAcT56`58A cTB3$G&0dSc#5LZCV9+pAdAb0kP-UQUp4r8*&mc@UhP3dAk0U3dAc0HS1+TU[8Ie E4I2jJRC90&qMHTL+jQZ8H#N9cGHSpHmUQUp4lkHLq4U&D93dAk1`RBVQDj5B+08 3N!"@ceE4I'RK0aA0PaEQ8G&mD@%-&FfA9Zp@dAaTp839cCG@$e,4I'QpUiVQ5kZ Z9$4I@M@MS[R5HJX9cCI@'kYS[V5%k+PS[V5%LUPS[V4kXiVQ5kXRk9k2Y!4@U@L qY0jB4I1PeBG80&q6m,#+jQX5rP64I%h#D5UDVdRi3dAc03NRU'Lq*[9C&FhAT,k QS[QDe#080&q6DP*&mcATI98dAj2ZS+,jQY4I964INpj5@IiQB5`9cGFNm9JUQUp *JN&90&qc-)5+jQY@[e(4I-h#`bUDVeQp4dAc03ZrU@LqCZ%Z&FhA,*bMS[QDK3& 80&qcqUD+jQY@re,4I-fUCaA0ekaD8Y&mcAS,&FhA,%%"+TU[@@,29$4IXd4bU@L qC[91&FhA,'&E+TU[4Eb*LZCV%6HKS[PDK"G90&q,qT!!LZCV%6j3dA`Y`SSUQXm A&+bLq9V8He3dAiYkYiVQDe'r8p&m,HSA+TU[4I@TS[PDp+BUQUp&-5UDVd8i3%@ cYNLSPiTQ4Gfp&Fdk5(b(LQBG*#j!4E-1dTZTD0C"`R!UQR@3!,#CLQEp[jqE3PK hRbD!50#pNq,Gh$"MbHlE93DZ''%6GN'QL'e4T9JL-8[dcSMQU)Z,+*0b*e4MF2q e89,-Pm,UIemrK@M(R2UHlNZHmZeJYm%A,XL%92EqIC3m",+r@+1C(AEj4@kAfDS 2&m+)9R8*E(eYBC!!SUNjBTAl8P9eFjG,Vk"+[&4pR@1IiTIRi*m-Q'M'YQ!(B3G MKf"E&h)0klcpTBeaX8G@rX6)h0Ma5bmD2hAa%`1R6MrDHGYMACGeTjIGIq0iEH6 aTF(0%qNik,Sb$PCep`CVeKkqBKGcBZZ$$QcLaDZV`CiYPkcT5RAd"h1j&FG5ADQ 4ZC'MMmcY@Erf$QAb)jIN9QaBIA,N4(mpXV@4IIcUNhHGZ21a)qZ$(BHf(LSp['Y Ll(L`4lFHPVkU2ph0(%h,[A1jrUecHbrIh"dXfr#bKplelZ&HcMFGIQ$ib2'EM[i IKR,GIPB*jF!a3Hk1HdB4kX!E3rk2NeD2YQ0ZSEflC$iiXb+d+'CjXkdb$#ZJh!C C+'PB&V@3!'96l&r%Aa(*QT2@'La%bYh!#G0GUpe'd$KE&80j3MfIl86bp3pkZbN @8,PR+Rm`"C'Z,mKYBGYS8hZjPG'dbQ!Z8$D!q(eK8A@Q,qINTc[GHN5Z,b4EI@& Vf0kY*a6kJZclXReK*iViA'q0)GFA'ZYp`I(@$E*IVLqN@hMKbP*qYSdFAP!qNVj `BEjD$-Z9GR'm8h1M,f`XY)-M*'eIN!$j"@qq,cMJ#-PFAdLS-babHSLkDZ9bR&6 Ea1'&T1X,A@2Yi6M*A&r)c#m)MT3Kp-[$YQj`)H`,`Ic#SVjYF4)0j`Y4HcFk-Z` ,c#qiFcqlapSpXlreIbU)b!I2kMaiZ`QZN3dK5pkciHb'N!#GEp[34Q0$L$m0jJJ 4KUiD%2bAp%8ZLC3'8AkJ,pYDhlk3!+aVJ%NELK`)3@aI'+K46-fk$e4Y$4`69"% 0$$j8!$PM4&+lBN3JTi)P5#IZUYDQHpMPdIXUqer'5I#&dSRGZB*l['#TfkM316Q B(XZACU*[V2PVq%'(@Ale)DTICVmF!'0Fh+0MfpMQCr+FNTp1MaDe*)+RVHISQ"` EEK0`Mh@$dYc[!(MA06Zf,pl`*rGB1l4VUQGkhe0jPS@&3KbAdL04BA%J6qq"D[h qVf0RHV"hm1UVrk8kl$fQAGdZi"j22-JrhD2hfApfMpdAqFGlE*Sprb"2I[ipRLM lIHm"Y22[XHFej"kGB586&[leBB0lE+Ld#lM(aUGHGZql3S6BHqcU42pdMmYVhhh Ac$h+H#[rVBPZrEHkheeP$3'[X,452*pMrH$%XhL)(-FrMBL%$GeG'dppi*MYPH4 Tp2(d2Ci5mYijp-bVbMf%pR)$h)1[R5,jjEZbGII8Z"3pPF4XfcEjG(rCrmR+M!C Y!ZkK"rb[45X`fX2cCAr5`(DVMISeZ+PrMi[cHlph$mF!PYjF,AkAZ-KJ+SB)q[- )CU$3GYr&[mI@TmSMrY`"[C@[2D-PdEpk9rmHP5A6rh`25dZfhjTr"T2[ZdI!LLh BG-16EHr)YKqXQ$aYGhAmK"AVZiFcJ"9E[APVqTNm(C-lRhf2cV(i@I6fe(Xi2PL khZVi+8Zhlal2X(6ll[%-5lIr(NqcG([[i9jJkEVI)m[52F1+GGrMjkcBhRXi"0L X6ER[eCRcJiAUl83rCD(k1jSVJ)Ablh(Cq6a2i62r(V,@mjFJ,F0)r&[4qRMDC`$ m2A(e*%hY*aJ!4`8bG3)JJJhPmRQHmjPhG5YdmUHqGIR5Y5p*cflDq#6(G0"rBRZ jb1j+r$'fhhH2Cl$p[RXmJqhhhq0TE,rh(KG&E3"SeAr"pYh[NF(fZa(j2prM9r@ 4ZFGP5EC03(hmQ,2SISqIFaClll%(&-JpT&%rJDb#HfakDJD(5fbU'!cZcV&PE23 r10cHMVB&dR6[29C2lhrf(RcY6a2h6lf(I`ph!0I3-hMqXrIB`eRmBheF0Vfr$F! pqXHS(HfI#%IH0jI[22dZ,fFHG+YQ"0'l@3V!+5Hrb2pN+ED,jR06,"Pb@(j@l0V !-8'HK!Y)p*qEGQ%b3ZMqhqI0Bj0rqr+28GL4kb$Bq5U+%P['*mB(YJhe$1eDK!+ Xj`UH9`lfr+rIHi21q[Ppp5A9$F($GT0llBRZYlJ2@K&mb-iI4Y`Lh`2'UAr%mMa Bcq[Hf4hFf&4r'9548qkMH@i0mk8f,d933MGZ)2VG#D'Qe)!@1q[3a`Q$#NHX'jc B-V3Z[@l,`03!aml4`DPeE9AHAiL$ml!'kf%6@*L9&,B4QmDHM@h#0Q0EX)1`Jl& $X+hBSGKKf!1``l%(BNGJ$m)HM$d%HbMf-1cKf#1`4f*(BNGK4f2EX'1`Bl(MX11 a%l!6XC1`Nl&6X&1adl$6X61`lGLCf&RBfGJjf,RBHGMjf!ABKGLMX)Z`4f12`4k ,AB`p$VX%Za5l$,XFZ`+l%RXmGKAf"1b*f*1`*f02`ACJ6m@ZaRCL6m1Z`ACKef* 2ajk"ABGGMcd6HaEf(1bjf21a&f!hB#r%EX4HK0f%CFZ-m&%0Ee4GCJSeB1IHm-' 2Ir@(+CP[Y(rTfdkAllGT$X@qF2-(2rkPep0H2p2@V5qm!KUcf"IHpX&MAcPfq[5 MAf[MeKAS!XhE*bDQcJ3eAlrpaXCH+R2TC"**D+)SFEq)[BJEXP'LK@"QH(4--2L mq9bH9&Hd6FhJ1X6#E4V2cNNl*qamMTe6GQkdFpV1CpZjbFl0GQkamb!l$lEc*MX 2XA1VRBIDHCLG$l$cF$XID1F4mmqC@,BV24JALl')A[XJTp[j)MZIBHGeGPj[jc2 YI0EmKC,,VhH+B)-D1Gj5('6RJqeXDqG31apQjm2YI)5GMl6c5$Z2X[0S1lICHBb GapTjR*h(fhQ#R5IDHC+G*pYjSjfRf(QURDICHEUGCpKjPThEl6c6cV2Y2-I1Fqd mcmlclEc!cJ[Y[0R14pPjNCf2Y[1aGMl'cS[Y[-61apPjUCh2YI2jGPjQjq9fAQ( RPADfGAU"R9ICq33lEl$cKABqdFiRfIPN1jpLj`ilRfVReAEZY20TGPjMjbilVje [*DR,GZc65VL0F6C+[c$0NVl,DNQQ[UV2le4#![JY9mjqUj@ch`VPl,G#1IZY@-j qUj5cQEpHBdHp3rRG@d*6mk(TjdjP#QQfe@d2Ni0FIBF6V8VlefaqMjAci2QX6Fr KY56MP[S6qGeH-[MGAXjq&jHchphPl(Gh1DIREp#mFQF8cY5h4XRK3Ph$[U!2$Z6 X0h8jqmeFcL1kpUChlmk8#l@+l*!!D"CT"G[59`jHQAjejr1M8MEIMN"+MYYX,#, c$C!!-93I"Q1LJaYR'3hpiZR6ArL'5!(CbHaUrG*Z"ii$!#`k))B6G1$hNSl''Xa Sle('+AQBBEM8j`%aE29jQ(ECj[1`3ZHb9KkZ9mXM5hFDbSYj`[GQdG&crAeBK,4 p-8pQVBp%L3c'KSUr$f$T#Tm(2[0+R`GdpVa@R[S++XR$3ULVI*feFYaj)4(L'aU NcJiMh6#ICbM(UrfpQ9qjaZicH1%G-j06%R8!afXAhc[c#")eR10jrKd2j2KmAlF M1(lqQ6`1Y1pr$c(EL89r#PJ`aDCf2X2-GPM@I62-l,JBBQC&K)0NL0PH`Hr+dZ5 IhECMQ$Q(EEcPlrhB1qdZ,IIprlhZDPFM`B!bFmNY3R0%5Drpa5*[*dr9ZRIUaG% Q-0J&*,%JD)'hB'qeaA4E&ZG#"NB+(i#V630cB$(&BmrK0&PaV4rqSE[&ErM!6#) $[bZ,TIJT+KmifJJR(mJrL,mGf#LS&"V)2l#blTPpd30[$#ep#FNIb!TJkGJa1Y6 ZV5@)+Z8VUZ@qhPlYm'f[e%Spb!ZE@8lLE#e6VI6ZcmldAY0c65mlEREdKZ9mEeZ 5!XL,`iPmMK4002h2T9qkVU1[@"qqVJV4SG@#(B3GM"f#EF81r6k0JVdV46SjZ$E *SAT+dBEDm"(Xaq43-82qph(X*mi&ABHpKY6$,TbR+eq+pI@0KTNH`RlbA0!IB"m q&r3Tl"qH#9,*TEl["GLG",3f,bc1P['*mB&Y3ce$ZaDK#5)fJM&b1GMcclmU)rP r90AYl5ThGrlLj2[0pmM+M6pjG1ciT4H0RlViLB&6TarYI1HAhRpCGhVCr6H1edB HAaVF2*'1JkiVif"9Gfq`CZhK+hB&+Db(6EaiG6ABXq@509fTM[jJ,VIL@+SV06) hF[54Z6hVepkK6(lNNYb+$DY2MTcSVdHf0V+2AhhbVK0h2RCNIE$Md0C$TBGh6B` G$rESeX259r@RZi-,AVMmhVPFrpDj[CG[lJk@EAMC3qpkph![jjX12c"mj2K04kN 4&d",p2kRBR[+c%Aa)R@fffU,GIFSm3Zqkc[INDNM!2NH@ERTaqiqfdPIrjbj0KU GG$!2feMAqG[-JcB*65cUkk[1p1@FQY4&E@JkJ82PSq8&Zcd%5@6k`YD`[9Y2+23 &8+rfKChXIAHp0BCFAdLj[Z"iD`HC,pFA'PYiiFT5IVD0(&j)YrV#KIPU-5aAfXA a6KNqFQ1K(4`KDIZ#m06HI&p``"'5ZEk3!&"R@15N)A8jlH#11,b3!(4pS@ZX24` PQHX,bP2l1&*'MLm2flV"KE![@*kk)dkLiA`KDZp'4iCp)IepT)dL@jI#MZEpZkk IhVrXSYJ3l*DSSHUfBKG1AEPRpM5lIVCDZqMU`@Ah$Ea@&'8+1crNc5rp[2NH@AP GmHZDTelaUUif'TUR#SKhb&Z@IZcElhVMTU"YalYqZI2@Vc8@2$kbX[mp'mkqkp@ hIETYalZk4,4h1@HB&a5UJMUmaQ4T*&Feij3mBKSkI"jf5L4m(UDh8Mk2k-GVZ-$ R38pCSmq$0Vkdcb0683h,I*jQMXdq6`[(&Tq(5B0"2Jmkr`El2%-i$[&j@MQfqMb )q"[Umi#$K[Nm"h!m`1FCcR'ich-Ja`0pRK%F4rJm"h%mf1FjQ1-K2XmK(!reH3l PH*M2FaM(`hfH`cNHiI-F`I&)RqG)ML0pRT%F4rNmScL1pRP'FfccHGM(1mER'F0 aV-mcPZ-iRfFFar%qchL1%hbH#4`RqM`618lbH5CaR1cc61BiaHHC`R'Ucc19ic5 IKfeTdhfHk4aRq$`c1-ldHGSj(Z6c`$V1mRPQF@chH@CcR1hcc1%iaqHCbh'Zcc1 2icbICcl(q6i2@m-@q$`,15ldHBlLH*62Jdb846l2d4b2pRQ1iALXch-Xaf0mRX8 F&rXmc'-Ijr2!`bhaHCCbA1VcX-Y[QFr$EX(P2Jrle&Ii2-akV24jf20q[-qcLZ- URqF%MLIi2#Gb20(RBBIK56i2'i92pRRBeRZ+cp2"XF2R1CAMU6l2DSkVI4j@((E k2+Ga2-hR@F0aMFr6aE(,jeR,FDh2FcV(dhfH-cLHiI1XilM1jeR2FEh2FbE(-hd HCP,2mRR1jRLfch-1ah0mRR-jRZ[cR-Ia2*rRI)lRqc`X0ll!jf%Mk'DIKcfG@h` HpS*Hk21`IhD$cm1fk)dq$hYSRqAcX)[qFiYj"TJ*h`#&3D2D3$0QLr(!d8Dam`" h4QZZ##'0YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+NPMlUH5*YCp+RPM lUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5 *YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp +RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPM lUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5 *YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp +RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPM lUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5 *YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH5*YCp+RPMlUH4"qqNq6DH5"qfRqc5 G5Kl@j1h6G#Tjf#fe6p1Tj'(Mdcj0Tj+($92l0*e+(MDClG0d+RRB1rJbRiI0FAr FbJ1pAXZc5rZTbhk$bd!c4V0L!4N1HF[5MjRVNCAA&HmH1hlT4H1R,RjLi06T4c[ I[#QiV$Zpl2iEafXMMbm0ETj)ad(APA'`UVXh@,2fm"@lJK6@`bCH[,SDl0PbbCU Z9%Gr-*GEF5c9P4UC'cRkb0bHp@[[8#BrFNPZaBE9*dG1p0FM@a[CakmqHGH*1am lXMlBF@MVSG,$ZbE'MJGlG1YKkD[kdph""5pFIZpFVRrVh0l,0hF(bcDml+&h[AZ iPr00KamB2R,mTU-mV'cc15SS9US,5R"@2X(LUZZ*+m`FR(-l-qA%EIYkh#8rVm9 M`6d5Rfh&hF2@Q4Dl4aMh,1kGX(Z%FFXHj8eQP40ddCM2rMB"1Mfa3P[FeVUiBhm ,RiklVa$hmkTkR,G+QmpdqQ6&hh'2B5lIUCmLJ'eamPh%24)[FA%ADh-B@lcNZii Y%UPP,ZjNECKKDjGm&q1cpeMh+J,BdLAI#pQDN!"kTBZlA4Yif-T&Tf5,L0l[MTr &aaBZq9lb)HT'hqpMfUM'eLhbL45Ka#SAppaI))!Y@r+piRHjRpjlM@U6E8rb,EQ l94r[dJB2YM[*Yj4DY[9aJcE"X-f*HQ+E@9!IC[BZI'a[NZme[+0pepZdHB*Y6I) Gqa!(VB2A5Di-fjQ)ZeY[&X3pUJdHUS,Q-GlML"&AIiI6!rcY5r+pP[XhZRIeV[T (!YLf*&FqLNjka1YFh$#p(pZ9j,[QI35RhIf@2%k!SSJhXTdRNACaVp9EX$f*prJ N"kfE[rJi2VBP%IGR(&TFh$hDi%"Y%NH2'HcZ2IdB2VBK%IFiKeDAlclPC[Z4I-p RLiTCkZ+qT&TPfj&mLp@2&VZilfQML+TV@DcY*hU2eld0(pZ-j(X,IF*mbXAGV9j +Ej([)5CmE"pkk&I8%)1iKpQkBr[34l9*Jbe'mRfDE6+fASr@4K'T#ll2d2pX(rU 8hS!Y4I52'jYpb!ZS,AmVNAarmQZY2R5Z0NL`K8Lq,l'&d2DK4p9EJcQNKTI64aZ QAG`&fVK$Eb'1l4fDlfaY4'5V%((dUU$q["HT,P9EcZ,EQ[9Rh[i9I+TYjq9Lm$r TiPC+SirUGlZCHM0VA0aGHPIP)&lqCaaZGA%I8[fTEVMM9,[Y,Zi0fY$$eKrjhNS GHhE[Plk@!2UcK*a((a`4&+Ye&95j#DfVIP9ZL80A6bjZXGjp'(&EcXDC'YYlc&Z ,eB+8hH6bIIa[1,39Uj@&qlfGl5ffVcrV&J*i+rQqaY[E[[k&Rb0!YI4mrA#VVjr mYrK8bGEA2pIUkhHSTkJUV'r3Xl92H0er6S#m[rpq[p(Ukarp!$jk,h9$E39phHX @9Q(EMebK"B`br,-ZESKkRdVKH5I[Er[kI08%@%$bh81IdVjZ6UJhXle([[ZBAV0 prIX+B&Z2I2F,KfPI2ele35hc(ZMDdElb9hT[Y[(`IS)cE&qr@TL(l6[N%caUqrU iKr(4'fP6B-'J(hXplm8(aT([`q5fIIh42b5!E6VNSmGVAhp-2TdT@++mfYFrpdC mE-Z4ld(kM[Cel`@U,EEM5%ML%kfq[PhiNKiZF51jKqhV5i3YkCq8K[4GfpG[&6C Mfif%M'@EMHhVlpC'a8"QQ&QQYp(lR5PYPB&5)V2Z0eTpr3A#jS&H)G-VR+(ep,L `NqSKZ[XeVElqRMm4-0Eh"K0S[Zm+FkX+VL@5c+Aepel9KZU@@U+HU[heHDSceG$ fJ("Jd0Hp5hj*3$H)qaLparEe$F*Kp&2bJ3QdVkm6PP0p3mZ%4i1qlMe2'd%[FA' 2XKA5p[8IUPm'2)9jkqF&pE@[jeEL(+0lA'pp24GhV'V1p[8`MTjkJ[AeA0c9i)1 'IFA+3Mlc(1%NfqpcFI-qfHVV[hFI%3&[BMCU1kc@DpFAm!A+N!$-4[8,lH[I8Rm +*NA04R,B2[(Ap03'F4%5FYj(@[hQ!bH*Z-(&EIKUXppi&hb'L"HkZ'HV(qXpAUj qm'XZlYITTlEIR#Y-5ee,h'CYG98Ff5M-m#)Apj[8XHdh,pDE[GMb#3kdrHB04iL !!j'iVYG$cHLpArXA4)"2*HlYi!CE(fpk+a'[G(([82hVrHj@,iFE)Hlq9Rfm8*L 2R"*h#hM$[ZY&IdA%Ued"ES6(XVMR#hq*lc@'lm(rbQGm9(d)c#iY*I91+"YpMdI &0i#rj'VVhYl%2HB0iQ,%6lj4Ip6#28HVPRlAjC[$&Nq,Hkj42QTI3VD"BbhZHC( Lj,iqAUFIkrhZ9+ppSq&41"A&dm2%Klh*aEeDf&Tacb6eUMGEh*GDH1ApkYp[FIH H#epMFFpUBEQE$!H3!%pacmGe"hSep`"lk6fqV"TiUl[(Fm%$&[H-SpFfr,+,HrK h@RhSGq$`'KjdFAm%[f*acifkmcYFh+hJ%eZ[,e8[ZmA&IIBI@RhSlHU4p'f*Zdf mJYl[2(&fYlQiaqGacrhU[A!T%[I$HGcc![9QqMEiJqf[!HlaeU[fEVIhr[Y@rGf N2RH(LlY(@fS9prK8"KL(12Jea4mEK5(K@-!"E'p92Z0PUQ&i-iNlPrYBh20"e55 p%A`!eV'i"bi$E#lI4e6RbQHFV(IpICG["lb-a6hr)-cfEUX2Z@F'pbMA5GbGZVr &2EQiZp6l,Hi*im$d5F-pB4bmM-8hZELh#Em'rG*lVV!bA+Z%A#,1,kK,l`I%EAh HlX'EDIqq6r`%@)#i[f[eJq@kqaGGh1HiNqdV5p9Vk%X5pd@i60YAEP"Y8q-5pbM i`GlMcAURElZiVp$AE&qj6P`#[8[LlK&hTIKQL$K3X*M%23CZd,lL[84FeAGFh0q !-faIHHM,4(cAa6f22YSi9UcQ&RMZUp3l$bc'9F1jYQkZSaqRd)HjSaUN4X@G85m 5Gb-pfqXZPL[Nbph$@b,ZYJ@q($`BiP3ifXR%4IND6UU105lmVY%@l+BL5[S+FI$ 1VbU'#kS![CH$`c+me!q%)B*hqUji&qflhk5I'@e2Pq12a#GUIAr[S`43Ah+2im" &YLir!ppMe0XPEJRpfYEh,I4,)mj%iTE6&fapAmbQFU0hNlJ6rVTeMkrm-6liEBN l86K$krZ,i&(MH(d[*AlCiJD`5m$VHm*!&MIXS(mBaqYl0p&MY,kpDq%+MI(kRp# @pMqYak8IIa0aE(hQHH(GJVLQHhK,Sbh2FSqcaAGS[SIepZ!#L6Y6(*AQqcCFV(' m[[F+p550Ha$Zd$KHhhZPkPMM0Me#A-$VHbPK4)hl%Ef513lHifCi0+hAj21T*H0 iFI1!m(c`hSN(kIh'mH,QLm+q3EdQA`#Q-SiAphiFMNIV,2%"Z"cMH(([)2e(kc@ j3R8Fm-VHEHU[3EdQ4i6&!elCZd-eSIGi$#l"1&lCZr2$cAT0,Q'H`cKHf6`!IkE eQ[MF!3)#AYPl(A@VpCTF,5`Em-VHQqK2@Uq*2`@6'q19[bVX(Y4(FKUFCaarl#f ",l$eF6pie$4i42UVhZr,QSY4([%qm8eD(eq"fc+14r4qQVkJljVm!fD"M1-4[II a6VBq2J$Q-Sk(mcj!,p(k5&e1E4M(`hNISJrCHl`%6X3i(XjlZ-Ar*Hr6V)EbF!q UhqRp6S2V-Bk(mhkcKB16Sh!Ca[&`hNGD1$Mj$M#2F6bFGm([YHTM*Eh91,l0&1Q E@KqTpi"*c+[G[4H,e`MZPhSZf0k)cjI[rF+P3AfNAJ!Z-H)aj(jhJK2XZri3MY) ),dMF&qL$@KqT-@C"M11([12LRl4rI"11c)K6PEL[`T2U29+GUN[KNBMl'MPXIAb ,'3+MqJ8hCrY(DLrFX4%h+2Qq#5HYpC&k*E9LhZ$L[J12U2@4ZNRe!FFVFAqVrUM em9Re2qRjI0I5XaZZG(%2``8Bif1ZeEfecKk!%c,'ae`VRMlJQC*IKQ-`MSpTZ%d i+X$aU4GTeL(JBmb-q1jAZRaAJ"f0if0-36clFecFcI3NBhc-Mp5rp6hH#4GJ("r MTF36kh[F$IGR("rMTF3Mkh[m*9bc-6lQZq*AJ[G)(J"M'-I(H"hJ,IXHR`CI'XI (H(hLkr8pESHE-ik2mIV%cqPlr%!i,1!r[#AdF[XH0iVc#rJ2Vqr6VIIi2MbhFIb (e`I@Y2A4#IGJ(2rKADHk#GiMp6akVA(mKhHGF(E`(UQekU2[8GMr"`!!$3T8De0 SC@aXFbkjFbkjZ5kj!*!2I[F*KJ#3#S!!!!(fU!!#Q5i!!IBi!*!$B8e08(*$9dP &!3#dSNd[YG2hf!#3"39[D`#3"PiG!!!NP`#3"JIU"RKD6JJRc(*VDEI%)$mmj"G N[p@m'X8fA8a),`HF2PmE3(Ub6GY#RakH'Tk[$-r%GmC@Vd9f`GY&H4*1&Vm6h[k -,fbA4lC0i,j1PfHhi`IPN!!(Yl(Y,3T[%pj$PYh##5GmL5qX,lE`JjY!GI%J*pY hmGJ+G(L"k(Re+lm1FXU,3pCjC#A`b'ebb`R*`8f@b)C(q%*Z`81b!Ub@I8MSRAM FLGI!VN&HfXM[FT!!GQlfRGGhmBpYYMflf'"VRjf$l"`fb$-r,cqrLrIa@c`(DEh Afh@HAEac8%22aA1CQ*QGP`Fhh*HG(6!@`+$mcLk[3CI[m9%'H3Ej,CF%NZ@%E"m !K3!%i,am[mm%J@pCeQQ@eE$1@Y4cQV@SGlePV@Q$rBU'"3e`0@Gq-1Q11X@L&a6 YS@+`hFe%XljHPH-+BMcZV'alQrV4jpG`jf3l&AHGE&IJcXYf'qjkf4l!h5$Ehq* Z9*Mme8qfCMckblBl(J0N@iE(30PHMFFJfAiGMm'bhBV(%0Pq&iqKX[d&(X0NqeF mKKYEpLI`'#&E'aiMCGX2Me'b[3+2dE+p(SpYC,X1MfePqaJHa),Ypr%B)pYhm"K VE!&c0%kf&Y88YKIK-8'fir&SNZeX2+J&E*IKXEeX(m*MSQbIaf15E14iXV(TNT` L'c&-P8e`,X2BX9&2VE+p$SpTXPf+Kf#LYP&2-f6l!KicCIX'(Y3,*3m@c*+0r-k @E3iH1mLf')mGCD0fGj,Y(AMX,0Y0H,a!YXrJXBYX$q1aUfcrJXF,M5h21Yp00[* ,[0LS*h!$fl&il#(E'r(B8lDVm0K,Y[A#0'brK`FeJZdImCKVE2A%TRQb86rcC6X )MhePHcNHi!Dfeq""(V#p$BrpCEX4M`0N)mF(b[ERH"!,m!MQ[PJfF1&JfDL("E) YaH-3fGELFDKXEmCMS@`hi2%5f6k0ab,C[S)(pBMYIq#aa0JD@8q(b8D1$jH0R") [YPIL!@jJ1a12)f3$Rik8l4BmMT)0c(LTE&r&if@b%6IF!GJ(Piq@$D`j4MEb6[e L!i1T,fc%[9bf+r(!&pY(m&JK'cb$A'(l&Kl('9YrmJF`&KZiZ9)f-18%fDLI%fA $(lk)$IaB*4[mCV9XB13DfF"MkK(ERq!"eQ(l,KiR'GX!J[-kfH!2PPJ1)1DH)KX B"*r#4Uf#*pM)lfQbJGQ[PHe0H'$(GMdHTmYf&ajRb%BY8M[B(X,M,0RJ+2!D131 C'hJ(0[$J$E+"3q3I'cKdMQcJelQb8CrRb8CqcjF0R`YNHaFH&mT'h9`NffrMFE& Xe!hja%EGJ'Pb"T&r[N8fZ04ECB-[`3'a`6(!@fcJmYYPSfiZNBfBi4hBi"c`(@c hi!'1BIXl2#ihYX(NUqq8$9bNpV'"Lq!20Z)MYpLS$IJ&0MMLeE*p#SpVC+2qhLh EMr'ieYL'N!$Mm5FfZ!UeM!fFIBpXe2plC5-[[b%E["$-a`B1[8qfEq,aIQ-EbPa q3$D`pMGPJj2!6E#45qS#'lAl@l)4``GPqadmL"IEAq&aXl%0)jm(rl'"Vp3i0MJ B1J!fq-1(C32[ETH0qS5,BF2R$YRq&!q`(4[mlk2'0T`m(0k0$5jhTfc`$A!2'hM hFGQSb8r)KXmRCB-2h5hE2q&"RFSC36i2Em)'r`5MX&',j"mEZ!Q2`dCmRj@0()% Rf-#ccmRf3cbS66NMLDpS&0M!rRYPJpH"eGMJ'eq8MIUi6cEUlAlCm)([B2X(2"i dYP(82ViN'e`GESX0IS0'J3f1m3Hb%GmIbNEprj&Xj1Z2CIXk(Z46cQKb"@S6'aV $Pf@$-e06f1"eB"dfB[dcfF!Yq#!fm1*VXT&Vq$kf[mB$ALaR'h*Lp!eXD#Yr+4[ D!IL$MEcb*cBi(VR#"SEpM@aJ)YS&0V!!$3SEH3FRXF'(`(mjfe+(JMpL3krjHpQ )QeV$"UrqYQa`4Il("Qp"3m!'4X0PX"(hpf5MIZ$#f(k!arH0E6[bQrmT'cL0,cE i2aL#$Gi,AQ'$%ra)0[M22mX'[S1Cf-![Z!BfDJmG$"XqrfCXBi"j6[)E!ae(b6J 'YD@Nrie"E5RTIf2!GC6d[c(!2bApE`b`@fYkf!5EP25r-DK$*Ie[,1*4d[r'JJF VkApMS3%TkApMS8FSkApM`FQ9p,qai+*+qYpBm#XPr@mXilEkheMJPT,q0aDiSk6 rM8@G+1Prir"@d[r'J6XUkArM`'Z9p,pad##8p,pai0*+qYmiF$mPr@mF-%a*raX ($&25rmB"1j6d[r(-YpAraL01*Ie[21TE5ImE$mkUT2q0"ir4@LJfd4U8p,rai14 +qYpii+L5rMFHr%e*raX2$U1Nrid([L[TIq0CIeEr'irk9p,r*U!'P25r#H!+5[V I"'KB5[VI"'K!5[VI"'JC5[VI"2"r*Ie[!M(!kRm6@)Y@rjX!rU1Nrdd!jLRTIa1 !S8VkAa-eHD[r0D''PI5r*Y5$N[lA"*e'5IpVJMkNT2me3HY4d[qDJ)9D0mBQ1S+ 5rYF%,UfNrc@"0bVTIdhJ@NVkAa-iKT,qe`4F90,rQS%e5[TI-qTC5IpVCUeBrDm CIbRTImh3e*6d[fES1dVkAc2VeHTrcH#d5[TI-lL6N[lA$1a@d[qf"iiSkArE)dG +qYrfd&U8p,rYS@FSkArEJj-VkArE%iHXrVFp1)D5rMH4Q'Ie[iQS+bApEb+iQT, q0a'm@8RrQdKmYIVI4("QVF0M%jkQT2p0*+CDr@m5X&**rjZ%fP25rbC"qe25rbB 4-kcq0`PDKT,q0`Qm@NRrQ`6qTU6r63BI80,r*J1RP25rbDJ"*Ie[-[LPN[ih'CU 1N[ih'9aC5IqE$-kXT2p0*[CBr@m+kp[UIe1!MdVkha68[*,q0`8j9G,rTZ#YT2p 0J@kPT2p0JEDLT2p0JADJqa5`JAP@rjY#6Q$e[kRJ0NVkhe4`!bApEbT`8dRrQmS F@2e[+QT55IqE5KjQpEqTH#[TIe1KLbRTIe1K'5RTIe1KMbMTIe1K%5MTIe2"[CA d[kRJPNVkA`YiQT,qem,F@2f["ELXT2qe!1q8p,m@FM@Vrl8`0eErDd%ZP25r&[J SkAmYV&'Vrl@3!,YBrDm&fSb5rYG#lQ,e[aE`I#ApV`8m@8RrD`@(e$dJf)4(+HP rVH5[9[pVCAq2eIpDQ5HVrl@59eRpVj@BCr@r9Q+UeIpDbI1XrYI+2&RpVa8DNj, qe`Tp4%RrD`Ar9p,rTS&c+ZPrdm"cP25rDH3Z9[qE"Xa5d[qQNGYCr@mDiP(5rkD a*Ucq0`hFA8RrQ`D03%RrQ`i1V+6r65G'@[e[1[($kRr6JCY+qYpdBV$9rkD6YeR pEcUd15ApEcTjQpArTN2h8G,rTN2,80,rCK$$V2ihJpc)kRmc`"9e2`ifmQhe[aR %"U[rc8!p+qPr-q#[T2r0J+DPT2r0J%DMT2r0C+eEr@mQq+f5rMH6m9RpEbDjUGA rCK),VIih%cP9d[pQ3TY6d[pQXTkXrMF61SL5rYG'hQRe[cEb*+[rYB&V+HPrEH! 25[TI'h"65IpV3`dVkApYj1*@rfZ$TUDNrl9"5p)p5R*Q84Z`qYmXFR'Vrmd#VeE 5rfD"(bVTIl2)4Dcq0iYFa1TrXi#$5[VI,(*"Urr0BYa@rjY&hQre[pQX9k[rc3C R9Y,rCT0A@Ie[0RLDN[ih'ca%5IqE$Ca9d[pQ!lq8p$q2`%&l3R0#Dd*M3JG#rd( h3Hp"jd&A3MG#jd(I3GGaI@GS51K,k$[S1ZJjk$MS0qJfk$A`DcJJ'JhD$*S-@J` D$0S,QJYD#lS@I%L`(m`(km&iX&eM1R9!rY%pd6[4*0%Ld5$4(Y%Fd6M4-0%Fd4V 4'0(KU#Id6,41Y%Bd4V4&0%@d4$4%Y%24$$A24#p%*d3I4"G%$d3(42p$pd0MKC[ $'36[`$R`$9`$cq#'F%+i)"`3lJIRJq["mH"fm&"i*Y`16JHAJkI#0q'Cm&%i(9` 1$JGhJl2"eH"SF$-i'9`-$JEhJR2"YH"BF#Xi&6`BRJX'J6eJ$PJ$aQKXJEr"fq" Vm$5i&28'Gi)c`CAJCR![Z")F#@i%Gi-(`X2JD(!NZ"'F##i%"i,l`(RJ"I"kH!l m"Pi$Ri((`&rJ,I!9Z#(e,hl`'[J-2!Eq!Qp"Qd'63BY"Jd&l3A0"Dd&M39Y""d, R39Y"8d&,35G#ld(R33p#8d&,380"1d%c35Y")d%E38G!&d%233G"rd$h31p!jd$ I3)G#Ci)M`!hJ"(!"1)$'IR4#p%&d3I4!0$Zd1M3kY$Nd164!0$id1E3i0$Jd3[4 'p$kd3,3i0$Ld0c3hY$Bd0V3ep#Sd&I3dG$6d-h3cp$*d-[3aG$%d5$43U@Pi-2` AhJ[Ie6`AI4UY'Qi',3#(iB'#qqM%k-2SdHM0k-2S`ZM"@Um@l4[Y'9dDA4Jp'"d Br4IG&ldAR4Gp&pd'E4G0&bdA$4IY&Xd@V4D0&MdF[4XZ#!H%qm(ji(T`2+hGSZQ KjD(KSGfKVk'VSDHKSk'ISGHKak'ISCZKPk(RS3fLcD(ESCZKPk'6SBqKLk'(SB0 4pfK8D&pSAQKGD&aS@r!CkJjrp%+`52!2E3"0!#d!$3$ZMrk,lS[HLmk,[SZZLjk ,MSYqLpD-PSaqLfk,ASX@MDD-PScQM'k,ASY1Lck,,SXHL`k,rSS1K[D+jSV@LXD +YSUQLTD+KSV@MCB02iBA`iIK`I"IcA[4"Y!%d!,3!1$Tm(0i1A`F(Jl[KpI$`q( Im'jd!63'1$lm(ri0liC[`l2Kem3(R`BVdIAJd("R1$0i#8H''m1*iF,S$[!V0'j dA-N(@J3DK0BHi"2%!9p$$d5c3kY$Sd1E3j0$!d6M3j0$Ld1$3b0%Ed6[3`Y%Ld1 $3hY$Fd0V3f0$@i0rm4Gk'MSDqKQk'ASC1KRk',SB'L6F$Hd+VL-m"ad(rFET0V8 6!%$Kf,VA!m#RBb1lU''Q+F5J[eEQJ9IR")4TbFijbDp3F'f$Cdb"`mLC--3',pF a3N#Q`Q(dA)``#pd*%-IS8KXl"BL"-!VT5Rr9k4,hiA2aPG-P(k!`D"[84XZ'G3f ccNJ2KA5P-HTdLIZ3!,NBbqQ#3X#BFM0IZ#BDFk`#Urq"aHbN`355"0GiAccb$ij le2mKd$dVF5IZBGap)S6MQ)G6H2d,KlLE5)EJ42!abl9bN!#4`TaXS*'T8i&'@UB SB6MK1P3VNaq4,R8l4Hb%IURl+P`B(#GHKMp*E-5P8q68c#3-*fdQBG$6SAXjSK6 *TbB-"#[G#"1(JH+TZf"L*b3lh3i6aDBeYNSS8I"E3R&1[1U("`I9NfC1rCA$@p6 8*Q@ke!ZTF[AVlNee8IEM,38lA[B'[BIThDLhqfq!hL2elUrhk'U3!0NP+@mL&d4 8El,bcbR1A2@IB%8kilHNTfamGj*6p&a+1MTJq@LdhLk!`Aa6ZGBq41rKHJIbVp- lU!DD@c'b+icFh0&!kr@a#e"r,!'l$1GPEj*pN!$HF6R9V4ae(HC[pE%NZPKFM+2 d(L'r-ASh9f2*RcAXKN'TQ(&$HiepaDBTQd18a0'9j%#pKqTc9bNZ+&fLmYErLEU VN`!d@lq40q@TGpkflCT*kQ5I(%N28fqpem[iP`%jrULAkM)34+H)IUqrlfPd%Kb J,Uh#XHh&rVH6FY"%K2-L('*ZB[X5B#Fh,3eCfXL0B&3SCfjPCek8SqF,k!CRhGQ X@rGelk&ZD0DGc,32P-M"Gm[PmS0U2bmFEa`jb-CpK0NB@4`3de*$b`AY(E3DVYC 3[$8DI,G@`qTHV@&f*mPrRIa2P[d805QHVS&fCmMr(,h2&ADITrIj'U"hJBERADK r,P)mCqPpFE)+j[rLk,NM9EkJ"ad85)2ZCBBjZ1NRkA($$2dcKh,*cSk-I1`h$9b k[mi49rVCA&q8ki1LCjIq,`JaZK1pK26bdPY)[a6p9241ZAiVHX4Si+'fk4QM&i` H-[T+AEmRkLb8'Gf92P0i06SX8%!r)lehY28Jf+)Nd40&lb4pNI3jSX#LV5+k)YA #bHRiFIfRp!'58@E#d)Y10e2FUi@D5CmJ2CRdmG(24LmE2@hdXY'hj[VCk(HM[i` q0Y4*HTlTE31ak0HNPj!!RNRkC0()A,mCr@SSd-`Z!2(S4N+bTJm0$BeH0A3rCP' !HI5-d3Y0Vb*pKkirQYj#5"$pC[3B8Z#SEQML%'PkTk%Up$A50dd[+&5(AQVk3i& ,HNcTUkERNAj'HN2TGD5[NAipH[%J@I5PdRY,rb-b)VeMp1d"ar4BdL0*RaY0@[6 rdP0*[bVD2$))!%j2C@I[R*iK51mFrH$d@G+(4fma3J[8!**([cMpHr3-3K+3!1& 4fa(Ak5@QjjMHB*V#k"q%rY(A5RmV[B@ZAjfq@ASakEHMha9pQljBHK#C2F1-(DF ld(m,fD5h$*S(9d'CSXHG4MU)*cf,8%`D&1M(T4HA(RGkdZ`mP+d(0BUDlHP3Nhq Hk&#cUYEYPAmkQ+Tri"r[rdPRN!$!1H#cF&bi,0`-(JChUmiRLHH5a(0)(Mr%C3E i2L08k3HdYBQjNhXdNhCPh!,cqRM-Ar55@F-&fQ3C9*9(l3J[26CZd1hhf,L[QfU )bk&TqHH20$'q1UFj+,dd)Ae[R,P$3aaa`DJ4k+23hf8DYH-h+'!LYcDbEBQLh!2 M6#ZVXApd,$h9icU6EV&jQ`DlT5"Je+R)`E4hZal[U*eDHm@IHeEk-(j5PETdFT6 p(Z2YGU!MCk1Jk+V8,h(U&M3XML%RbV)&$L5,5&+T++$@!a@[$,mL0m)QQXVP*k( -)I*Y4QJ65K2CLY`8NC[#+Ak0r@iakpU$rafr(cNKYT1lR)dck$0RleQH'VkYmFf lpr`[*GMKT4l#C,i@X4!+TE-*pl*YUcUMm$#jXbpaR%+pf5$FE"66b0&$JBUN!GJ [D%e&68a(0lM2q6QR`hI#d!fEYcZDq9Fi4rB1fIfM9jZH55%I@dQ)U&mT[&6cD3Q Kl@)C23XfYSJJVlVE,!Y0A316$iDbM&ME-GMCYGCHfpQHEXGcB@p(@N08I5RRDF$ fTCrk#pmPX8l"GXRq1Aj3Iq&eQYRV06QLaLj`-S-MpY"34c`[BF9ch0jrHYB@-Km ImA)&hdeV2VChjBJZ0NG6jMeaTqjrY#pi8!k$9ieLl0ErmFJGi('9ifP9!Qr,NCD ER[kiRK2hcbe,""M6'AA&G9@ZIf!BD,hT`I%!m+@Mam,)+Ikr@T+4E5,NlEI6LhU Fr+6r)aR[fBkQ4cU6bZf"EZDZl[eNf)@1-Kl`9"[%kmBL*cmald,[4a!l-3"$,dI 31p'3!#BN[BE$TZ'q()Bak-8FBLHQ-HKY0CiC!kbRh06'!$-m3bpc8KkfQcSaHN& M@mr!B$fJ3bm)%6[4QD8hlR"1YU'c(qlqZ!IL(S4l-1kKZ)IKCJK"J,XH0qXl0H* QF),-i-SXaMdFp`MF)h'2LPYbE6ZEQrdP6bCNl-@Q2,QR(dG*0`Y-$`hkj5``TT( S$5ELRm!R23SkGQ*fLGjG)UVJNEJCK82VCJ2Z4YcpF,1Fd@$F3h%2`cdFpcDiYm8 0@V(m#YJfQXJP0kep!h#2`cd"GahZ21jkh'0`0mGYIa,iB#-i0Q()BJZ8GlZ[5Z% Xl3el$$&LM!Re3kSm$ih&a4j"-TZfe#8YLFb`P(XBlJEF)h%hiZk(ZcrZ!EJ(iKk +1iXlKhX)lZ'imlMVFBr!c4THSq,Z[LM3D+CF-$0A,U#(b8p)2[`c(FUHQUP1KYb iY[F3-X,1C4p"6lI-%!dE$ZCdZK1PE0BYfX1PI16Ph'2H1pJT*jmY1@KNAZa'NCI 2KXFqf$'H4YTdTCYhLdlN"IPMlM[Cf2CZpI2IlQbh6djkr1pBhaiXd&$kBA%mmV3 TAA3a16AaR&m+Sb"RAqAZHPY3R$cZ2$H$1DRVl#%RfREFFiQ$GZb6jp2i)JpND)& 6+$c[1UrNqC0femkSk"ch$%[(K&CdhQA69A&T5'98(2Ie3VBbVjUJ6P,fhYm2*P3 @UlaV[rH$EC3UqlQ9qSVe-UYMrAVNBP8"55jpDR`lDR4qGcpL+YA*NL(8eQVA2qC 'GcB4VS,d3h*+++,G(C!!Y,ZD$V#1bY3I5"2p@ZKm&FGD`[(F0mLmi'aL0EhjlCQ N$De@YMKZ+&Zm0jGYe0p@pP[BeIeGTfVfa(&ZQ2YHiKDjeeCU2'iTUL"miPe&q15 $#X)RlK(#*hieK%pq5"!qm8`42R&1%$la6"%qF5iLI1+D)(a(k9L%6jaMK#ml*P" 4pLj$4IN(#a9P2iF+aAST)RblEdH0@S3[eNQ)m)PE"H%VlL(#9ea,#&rj`#*maE' @m"6K%qF+`LIZ-F+A(6H8E3hKbcp8bpBKI-@TQVd%i422"1(AEAX*i'2R+Vl(rK9 iMldMG)rGDZ!HIj!!B([XQ%*ll*XJHqbB!R[X@m6ef$1"p9Up@&52I@036rd5F%L GbpL3!(jJS5&eFb#3!"4*%FmVVV@LY'LH&%F)jV&A"F[,hL'8Pce,5&lfYd"HpU[ Q1BAaf,H#iV&h$1+TAhHCeL!mrD#p6"f!PhhDdjE!GqbBS$I,&P4J@hY9m9Sl9S" DZd8)VHdeD0DH#5CVMa5-Y91#`YSMK9rY9-4GlC)!EM(&&QQe8`baS805Y+&AZ9T $6eZQSGh9SXPV%6mMRf+Y@-3dq3bK8TXV'&P`#m'ai&*#aB+MKF1#3j+S&!#e8`A jY&X-HD&$T@aU)"GkaQAMB+eJM,13!!#CpNJ3c*614JkDIP$&YI52#X5P2d4SPlV @J#rp*-(!e$Q&`p3r3FE813A*e,q)PkPh!ThGY@9402@2!EAUQi"%pB-bAP3rXG" 4GAA!85kS)JjhZ(FAY%ARFL'&3*ek9M#lpN-)hcA[%T,ArV#JA[2YUS88kP2r#ZU R2m3%S1UlUFaVY+$k5@HC1l*3mqY-D8)K8ZH%68JEfL,AGjh3Y@-NV0#*mJp92P( qT%)SbPp%M+,X@k-8j9m56P(f6NP&qB1%9C5p8eT4rU$)+mVZ#E(B8'D@@C3rL+P &c6N"RGS2CG5Tr@*KTqEVm+95@d9qdHQrSEiY`kM89%JabUi9MY(a48Jb1Ya,,+2 M%dXc1TblLb)P'Z82+NbMr%9-0@V1QmZq4MCU[h59[D-E(BjGQ8d)4pNlB4acIGm HLF!*PSI2NihBZFScB[m+aBLp)hB4Zp@)4Ia"`LPLaj41a,i*NiJG8a)4qaEj3qb C8)GD[9M@%2['K#(e5d!MG5lM4IU"KBV8cB&"8L4&AP"aV4@PC30*FB4%)2DUF)# bG`MrCFm5mTIp,HLArDTj6U%qpUfJI1`G!hcUeefQ09K22fJ[8`IQCCrfY#83(MZ @qpZ@6+AG-(UKZmhkG[@f@IH1cMEVA1TVXelGA@h@[pc6C[fU(@h@YGc2C[fUh@c @YG,,CKh,R@aTN84pE0Bel@+,h-V08*&[V48UmSmDS5+[Z12*98DPGbhaV&CKe,I Q+L,T@V01(6eVXA25X4BlY[HVaHj4YeVXeTlHDUHDGHhS8l21DCGDj0C9PYdGDT& rT5cMlV6BTC+[FQHDp8Z3!0Rqfa4$e-&H#*BZIj3)VA%T+f2DUbL(DCHb"UDp5X+ ApLQUAGUPSL3@hCcbTEeUSU,fE&F5Y9mX(fU($Xe3ZbCL@ZK4P&*#YiTq%VSkd54 d#!848eFP95ab+ZA+k9qQRJULPlDh+ed&[i+m9I"*0Df#Ta1b#Kl&M*8P+qh9VP0 T[d5F#MhDbkK$KJTGNc)+"DH#08P'89V5,JRZl9YdXPM2DYpL8,!a#QP&$I,Dr92 mDrmL!F0fra3CflmS`Q6l"`PQY[ZA!I542bbDYRp4KGEfEbSifrj*",VYhM8%E[m RKZ01p`481[mS)dcR2aCZ1VdGfP4aSSMRh6mm8K-@kD[i%-*qZh1&!h4p%K+#VJp +l+$V'dX9ZY`hPNP+)YUrU$#+pNpLHY(ThJ-,0H,4qFm'@(#8T-Ye3ji6XY,ZRc# AC)U%+EqQEYqTGHNRRR&MDq+S'`86Ml6[*h%ZDr5*GbcrP40MaBGL1*UA*5lYf8p M,)[Y9C'p,+jA4I@+Q&i@d@[0"P9&[D[aS+2KS04Sd0eJN!$Umc9G[PZ2,qR`UIl HVVZhkqf4cPl8ecYdpBUHhU@MTrTj@6H[kZ8G1RN&)dU#H8dSlaE)5m*i,)LR3RK C!0m)eNZpr$#c8[8pEG-9,mba`A'rR4RAB%*eNJ`rE*jP``r9@6EieBCDP$+9q-D C+MZ@-eAqBI0-MLK6CEpUqhiT8E&VR+I8VjbQp)00B`HL*+9Z58Yf+6RD*mj+k&" 14qMCd4NH*5#dGc9ePT+3!,V(qDMkPP06rD5h869+@0@eZd'XP,bbIjbpQR-jIE9 I(ZepLa*BmkffaT55&l['H8[pbLP,2pM8dK-P+R9VEa&SahRVQD*mj&E$q-MrNCk '%Vj(ANAj0LemlC48HqK4+I(3Y90-MSXjG0JScj55dIj$R*P1ph+D1[pjA)H+%YM T(628#JkPq0101pei8m+C*'BIm5N[C1N(@[,X9`28[3"(c@j`j(djE[qM3GApMd4 BVC9-CbAj#$DTmXAX+a"AR-m"UA`)qeR&5d`a[0i#LG+Q![S`I0kY`ZCG1-r[91@ Aff)+a+06i,rK-p```"1`hKK(PSc22),*rV,XT5CNf#ZRBc8`hC&85A*Y2lRrYB5 !R&%c'k4e(YB'Hm4r'l#%4rbh"C4[m2I1Vj[P090q[3L+PKF)+RaTCq4,1hrfc4* 13AAb`$!LYr'41iepQi05IV+p`(@SfdrBS89,Jqc2)k[9bk&piT!!cRc*jl+P[YM MMp0Dh,VRAVHcY(fB#p[l!BmI9X&A@-,2Y$eEK`8M[G`'d20fMSqL3QY,bhD-N!" S#d[jjNb3!'XT&)2*8LB+@lC26V9Fh(aabf53!!PER),(j4Vp)mGrZjfTfd[dk$% [Md(%arSBpIFIFIbUZIVSXFJYjVbm%re0q()%hiG9ek9FYfd$4Nd@0kBXV%Y*Qdl `K'Pj@TLdX#jPV&8pYdYTHB[5G*I5D"r&k$cFZ2dl-dYU2lLmHl@G1VKbbF$K-ik d(bird1Mpp#0R0pP,EpSb81TjI,(eeN%lX&CF%&KR0E9BjjbhqrbY9J2Z,1lJSP@ 40GjjjMNV'KDd@G2CC3FD9M6d62IXZhpkI0ejer%RlEP2GYR'9BGk(QZ,23I0r$j TeD&h2rD1KrHZXdCZk,XKIp[@`G4"Dja4$l&IefBh@3[AR(lMG,DYErUDeCZEV+8 Ehr6*$hfLZ`A[khGrY([[`EIX5l$C6G)[0rE*'c0G%'VV"kJ%(m6F%#%pK5`@"ad kSjQ#PIL@PZ[ea4`r`!l'AS+FH'F1Qa![QT%bp-R&YQ0Z[HqTRbbA2cbF3&-a2T@ cQ#X$Ph"KGq+#E(HX0hEfYTe4d(*6A$M1m)@lIbh4$4F1LeZ!LZGi`aI'ajYNHp[ 1i4!CDVM`Eq8Eieh,[@hReRK"F(F-Mlc0m)@MiTAH[@eR28D@92R#(YMKADpKlfF l!!+6[[BK8mKD$GT6D('T8!L+8@[+QbJk4Fm0ZDZrY`dAkJ`Z,%iPVf&!p85iN!# (8E@fY[B(4CF,DARB1%)R,Y3,&dl1q+dBel(@L4,GJ#(#K3B,`U54&k)paEbV*eU mc0G5!*SEHQG!`Hpbr,IcVA`afc`*0fMJ)N"0QjShcRp4QBf934Dm$V1aC"XRYm0 2BFL*IfC&JBE%QY@"%M*F@)c&3l!XQ-pX8CY#+92qV!"@VR8rbR(c)AdJ0DdT3IF @@+A"@FAK@3`G&#&"Mb9LFB%"Z!IL(S4l-'ki`R$FSi3D-@)3YSKd0'pN1&CJ'1i 4Z%IL(Sel'pcEiYi1paMFBh'2`cdHpi6r-p65qd$FSamm$X@HV[G&j9,&9#D96$9 5b93`9HP@I(-95bP4T93eP8S&ZkURiUPLU[h4BaBCNpqPGFHX-EDZHGX2UU9G"-P BPmcX+MESpRYXh0GpbL5VU9cqjQjV'6l+a3QVMlZ'E$ICLDeCVU+l-T-)eddQcb" CVT-N`JAQR9LqX-T*GZ-+*9bSUq$#DEihNI3'$"%ZZ#N'G+Yli!5'U&YGCTk%Z1# ")j)4,J6IRC,NKm-&1ch,3cFPbHP1rVNT5E(Zj*HENX6d,2r"KTdEpM$akqi5fIG -f,kcEr#aEDCIEJZrkY*fbC6*j,HeMIjG3l*90R3mi5m+#4SE1T,AqZ("`I4FHZZ [(0ibNekeN!#MU-8`U,XheF9YcRK,qmYif4[d(UChSplpp"kJpdLpqr-YjGE%Yi3 r3QrY,hl0qQGd03RC*GM0CP83"E4CrjcbN!#VrK1X5'Im&XcH$&Hj%DH"#R#S2Kb Y3&[eET'r$NcmAB#$qCE*M$T3X3r4HlMHJIcVp!kULFLY'0N94QlZ[b9#Ib`"Z%" e!1*AVlHZ+*PjUIm4ZkiS5BbVT,cXZS,%lLV6r6qmQSLkPD1Z`hTBID`SG-`5Jrj 6rKkPYkj'm4ZMGh-eP[aC`fiBP)SC0l6Af&GXQV)lJNNZ!1SJ3#GBhUl5A1*F8"S 5j1d5V*-JE`FT)qh6Im[#b(2e6V`R05cDr&kqaAi&hUIKr3'mC3LSZKP[fC!!8b8 KM%eYY"VQ4VV1lqkrBY09adDkpTc#b0I"hpkD#*!!X8FRdTZe1i&f+8Br`*%HqTk jr2(FIA0Rd1$["mMhPK-2YLdX)HJRhE64c!TQ1$+cJS@Cp+djCJAhD5!fE@aIkkS T!DC#MKlcmPlN1Ejh,9ZdrrhrV5Y!(6d@ZF@FPhHL[`RIP$&60V-rA*T-`'"`(dD Dc2HG-(6$jZh1FfYA(YNlC2H2AQhDfPf6UG[mL@$GrNRXRX3H5Hb3!-3rl*r%%%q hMa,!3iFeHbDjED'H2lkDRG!mVQIJ[Eq(d4BF"G[(#h2mB1#p@"l,Je)!rfm(Vh# 9-#&d#RFHGchZ"Yb0Z2[K(S+l2ql"Z!IK(SCl11ikh$RF@Ga$ifAD1S2mfI&',00 @Y+DVYD9IEYaDl0[r!C!!P$F0(6)-T@Zhf6&Q'XM@!a,+B'd2`)aXiPM3RpTmmKp T6'RUcE&(KG4fr,&J+0@G%"$(dSl1C)#m(VUjlj6FY@"Sp&3q&Sd-Gb3$j'0*epC dmm3,L1h12-IhJb"[plMqr04d'mIb9r+ke1jSk9LrrLqckZ+B[MiT))l0#IPT(0e TrppaE!VNk6K@l(`j)BmG(FIQXZr0"qUDMQ0,0L51K8kBFIbA%Q[L1*E6VV`!F5` rNGQH[$)1bFAa#",p0)keT9Ic'XDaC5IP4Hkerl2ZelRC[m-2'6@j+DH2(rM(5@( a&GE`C"cVY[N6*rpCf09pLPHYLdS*!A&`fP!N[mJVQ[FK3IjP59lep`mP!1`U,Cd C'HV`QeDIlXGYAGUFPm[qS2CKe8C('%5UicM1ZqE[i[!-F1$MSpbV`NA)KCM3Z[% I`AS+E9-X1Sj9*mVMLH-2`&C1@iBY'P[cUZ0SEr&i*Jkh1fVEYGj*,YdEKe(&p%) l(Cmd*%qSBTi+eFF,`%U2,46qEq04R&Hr!TYmr26ZP$ifm80hPG4fC[jChA9$(0i !hG8cJ*c(&K-!',HR3AIYVV+IkkkpF6bPZrE'mC6ZqQJF6qUZ2A(i&h6AcR`8G0H RG-l11*l61A[Lm!MSNj[rN!!dc!ec,rqaV'2`&2rJMe$*kmbYpd2Rl%DdRqZF'j( 4&k"ckMLB'2l,HY9ab0bDAp$h822kCG%5ae)[IqNPpXj09lbS!)cmD`BRJA6pm6- 'ea[(8`bZ0ikR'0bMF6c*i(VLH)@E!##VrSc"GHBMC(#EH0FcF@bYMc#10FA*K)$ kq!NclFc(Fmbd*iiY1#ja#&"[9SK-((SHIrFK#*QhEbK+jamV8lerTE"e)pT+Y", fa((Sa2C6FA$DAK(Z(mq(MX-I`!4PYUNR)"pE'1A6pE&QBRX#3"cqQSALI3KE"6i lQ84DVUrm)!hP(34C'EZ3!$CM+Uk4ADIYZ)e[hB+'aE8Pcp2eZFea3d`BDK)[d4f [3ml3%TEQVUj"cQVMEPhbH!eb&ZQZVN*H@)0FfV(m$%8[b4k"ZaQh`Md@Gi#l(RF $lNEFfq&Z`Md3pb$F3h!2a6d-pbMFSh&RFEIJEX8p%AF1plDikh$RFBr"23lh90c 6F%q2Um8,XkZ!QGZJV0IdMikPTp*Z'*RT$@hEDL5iZQa#iU!H`[f`C@hmAFZk62C -)BDZM,8MKM,42mfhIIQ((4i,Fb-p-)a)&d#Ii'1R5EX!R9S`dqQ9E$jAi)hbMeb CeB[J)BBK9X246I(H82d(ah'9H**riRMSTKKIMjYZf3RcmF4jT'qjU4ihIFl0mrq %JkrP(pd,r9Kqk*A1eIqK#9@kXA[rS@PeBMf2p'2hUmG$6hErqMpdCJbSr024ULj Hp)!2V-G$$rLJqMrdN`qZrd-rqH4kIZJjRb+F'S&e*,Y`LVld)I9ik&fIURK'(Dp (KRZiIqK[EkRRN4liBI9rk*'I9XFTqZkReq1Khhj'(9ISbCpCMiHqrECk226fhe[ (lfBmljrr*baLq@Gl2"qSjqH*Z&NQ8Tkl,jcjZBJABAh,2`$%6[9iF0bMrJmeI2Y m(TrlT`q"F2`6Nh!+'hVkHREd9!d,@8+2d8BheYS8h5-aq5Ibh,k,Vl$i*hLpH$h "kq@I*hLpr%1JHeEL6Yc$Z2Y%#-Fa$cHRcEp`L,Q*C!K1""q$Dm'M3S2i2V)fc0J %'NSIVP'cFCbrrf10'Pr,1(m2i"MqhMMXHLmE%[[XqM-pFAJReJ*iH[fCMN$mJ1X &q*!!ekMCZ&bBrf2*&3r,FQ%,8hql2d@B$prNNQ,HLDA!['c,I1NiYU`Nm6Jrdh& i*CCFm5%Z8Y@RA&LMCN!m$Bb"FhAa3XPkdHKI9)Y2l,K&Sq8Cc#bJI@*VcXNN[Z& $K!ZjkQ,LalPjYqJPZS&$Y*LiV,FIiS)(MM"%Z"!3'HDB"SI&*I4FR*6SYXPmK!X jJ`Z,8mP`dP1%#hALN3Z#SY[Yq@kBl)B2%5lNUrU#c,PIkb5kdFJB&qSjCEUhIp* lHTCki5ZGJ0k6ijAVBG*(eTUSFjU$(`m"ji5$`$-0deX6!8BIKdYNG4q92$"J@CB [++rJD&k&(4VM+D@P94b,b5QZhGKhjYK%8,MQB!lJRFqa`5[#lihp2E*hb1iI[GV -r&(rrd5aZk#SrJ[M,NS[6#IPL,8GJjeGDqfeRHhTGM`ApRDNebDV&!$E'RTT$X! SHaBpXH1Mr%-I6HqZMH+&BqqZL2)*I8UpZd#+&ih5[EXlLKFM9bI9rf((akkG[Z* r3)hH(4VP(hCml0fK8IjKamIHh4MP(a6bhYdBj4pfJHcGM9(q'BMRc[9rf"Rb"I@ kC@I)hYdBj4pkU(EKESckcmlG'-@,R5'lGQ1-if&Rb0lG'18IGSEF9A(,Q0AZZ&N PUQ[RaE#(6VcB'E*hKdEjKjdKZhCH$*[paBZG)AYh923S(9fC*CNJVX*iaca[`GC ddH3(cChFHrf"CmmSPimmYm+*&kk&aR0cjRIhBc@0'dDmA-&hde0*,!AJRa[AK"M LK9%@RPdZXe3`ITlp-Vd81I(-R,kMcFU!CME85p#HA*MGcb*`dR#erX$6ejI,IhE ieGVaITe&4dF3'9`iKVJJikXm!$d@AUqc@,2lBPcBhI#&6h`Jd3dA4S&%TVK`h+d (R[P@ZEchP6jKcpNj$!-bd`NSai-[R&XZIr-c5@f3!+$2i4L)fSN,0efDe!B*qLc &!0b84kidZ("q[1U8YqhFJS((9Ej`AVRmeIFNY8'#2VHLL5(P#lG"GrUaC8e`+)H rlDc([1)DAj!!ANS[bh"@Ama*9S`XG$e&h[kIFr4B'$RIlcAd*K6j3*Ab!266(q! kNfiaR1q3!+f@[-aQ[r+$0*3Al'19[X,AmGp+kJ6E)'6B"UPEB555m*2,F&pHFpS IpcYV6X`UZ+,Q4%*ZVMPGKI[Uf-NPTV6XReR3a2jAA2C2llG!!k$FV1FD(V%c"ck lU!'@h'PmZBT5e[,qdE(dP+QTMPPMeBVbcq`'p[cq5[*YBc`@SQR`aqX[KUX[!J- jcM`Ep*Qcpba2$Gr@q1EGHhk8%er-1SkZ6E+i5D2I!HRU$H"l!",JJk"bIS+p&qV S@pUmBF0+PG%[1m,@3X1JfqqaF9mhe4!6QkEPRcr5p)2jh[ld)j5LKac(j0F58p% PPqe,3-L0UY,NClF65(Uc2,`,F2Bp%eC'lGXSV%MDGk*BH&5Q3r5ZK1-p28ZQl'( AGjh3Y6HA2$m"B'%"$mIacbhqjkeCI*DC!!258fNhM1ae'*l8qYd[P[D'2@BQ!2X (88Kk(`2I`Nb!d+I`pZJX(qJK@028LlA3)+ZcQX'Mp4MJJF8MaiIG`%PjbP,!i-+ FD+Sejf35hr!K`JA,&qC%'6m*$KJLA'!STq!#X*!!QD#ZE%`H1&c)3bj5bA&bHc6 3@YCUYC0LSm@rrA%(2AU9iq86ASSJLhfHc14A$ib#2@*Yaf"ReeTlE@GlZKh2KEd GkE9*+eMJQcr##)Ge&TfX[FEZ,!B&1jhahHL(HbZ&[AXG!rEeqII*rfk`[0fAjd8 ,CSD)UKFiM2b$ic8RrqQc)j`JAV%M#jBM0PP"`V9H*SI00H4QGidXlL$HFD1i'iF (B%H3!04DdKAMAbYZQjG*S+'8GN&TpK"Khc31qU[`b,Y`UJfPhVR'3GY3kRAV&Sa 1dP$UVfXFp-)1FC[VqrC)j%4H*V&P@8Rrh"!hrfdcZFpXHcLrh*J!'F,df#K($mV aaDckjZ,UdcqX21@IfB5cEr#a!TChIVaXrBA[dVT+#VC,pXraJrS,VaY23#N!rqh N((r%I[)biPpQ2qqhdiYkR2bNlcihLErh2,XmGc(KrYcPZQ3fUD$dS5-f0QCV5RR jU4rKY2IcV#eN2Qlfa[1f&)"rEMDTcfcfSVpQG8Lrh%a+0Vm`5bIUprS$chbRA2l dVYSRAVMa$jaYFDq@#,j'(8PVBr6)@$ZSVXSj5IlVj(qbl+H`PdR1UH*PVa(l1%h [emV[G4`3+ZGdE0A#180aR#QQITEL18GqjqVrmr3qRdX,bEP!m9bSIbl5[aI(rp3 P8mMe2SEMRprQb"r46ZF$1&%+KAI#F`DFA'*,rN%%k9ef5rk"LVk[rJr8XhI*VMi 3`RQ8GY6(c)G6i%e&%[MmXR'qQ$Rr'kKdbE1maGG0D%m3Fe1jr1a'%XQHBSU,a5C 5&[,a,Uall3H!QP*d331`4rrJeYE63[*"Z#qP3D6Fm2r,F&mH1d9"lBrlR6@R&q1 qS[EpPEK[V[ed&HkVMcVj@&['UU"YcIkC+H4)IPiB2Z!68C,e#F!-"Z1YHjbf`kf *EN`6QFBh0RD+#18GZ$p5FrSSlSr9[Vm6pedeTaILhVAQ0"rhQfT1"q"qFmhT30a [U6NGLRX"XYQk5,02a$CmTP*Riji#Ka&9jj'XCQ`li0E0NA%iBh!2V6R4Alp,cBR KPPSQL*hHL[[ADdj[`rhfQK1bdX&)4mY-DZ6N*1drAT@48k%U)bII399'j9qSbXK *9fAm[@e'd1cUhEL[VF9f(Hi2eTcHJrY$YGKq!rF0af-M,NhThSrl!l8`IK2hME8 `4)r+h$cRC2XE5QT-&-B@05D+VD$'4$mpTFEijGUC"3%DqpeLeV8(Ik`lKc*UaqD YCIdMI(Yb*QmpUJp[U*RH[pX,p*M'h-GXf4jFhVhD6KeFZ@6Jm"P(fJqA(fMd2cp qGT1pp+BY!k@HaaGEEafd!f[&"B&e9P1,GFjjZmrIDMAJcZ)1,PS9@H1GCjkcSQ& "Qc@GAADJB89$ch62[[ZRapHGGaerdTllC*GYA(@Sjl'ff(23c1q69Kekpf2[H(M [1Q[NKViEmVGY(8`GY-BCp4$lG@efNl9`cHNh6QIEqUD[@Efjb9Ukm8fIr0!RZP[ `[Rlh4l[h(Rc,[VQm&M`m&!$MLfRk%'lD-1U&fqa0c948ULGFm&H2P`ZH`%1bX$" TS9[Mf9k-bKDUaEpZD3aH1e0*&DaGIIQHC!kXpF5FKX5D33%PR-JZBUY5EVCKLEI e029MraZ!Gbl@cHV4SG8`XhVVLDeC0qm@[@5hl9XV+pRkh,!J2T@9E1%,(VK0IBX VfBDiF*V[656)VA#FVklfl)%6'**9IEed+erV&G%&'HDB1HQ,5i9#8)`5i[K#cZ$ #iP3bR#3CiB,6R4B%4EIEmpd`f3dI)Pb)G5ICBfLYNqK')f0FU%mdQjp%EmU[6[C jI2L[K2KeYdAYHbEX9pXhq0JReQ`fTCH'd+-YD%Rfli#)Yq484ZhjjNEKb011fJ- @2'q3!+"2-QU286JH1%3`*aQT*TY)(",Nh53i92#j((B,ACIX8J$qZ3e$rEFlA-X 1%[d'"JIDqlZDZlE1Ybb*Z'+ASC'(HcphZYGBmX-X$q241fj1P(pQmbXrEIqP6f3 0X%lYS*MCKaYhA$dc)ZV"j4dAMapGJ@EY2BmND+a!ik@Bj"QYJF9+RE6f&KEr%JG C[k@`J*-rB['[*pBaLjhN`4#a,4ZALAASA,Sp"KZAPC`#J#!ik'ABZ%c#(MkAF[p !i8PmJfB5ZK[Z5f,R5"MF&rFlM[r)6R$rX4bEI$eN,TNHJP*PajaX['01A@A(((m !'[Zq6VAah6Zh5dbiBdiI%Q0R&2rY%!9T92,$M$$`+Fb5L)ZY2S&R$eJr"9Sp[q, mIfklAV$aIlMPX8IKq'*fG2AbV1lVNpZcf@Hf`C@SUchN-#CrPTL*T,)XD@&eiF` Z,H[r1X2He%+3!1QSSEll-&c"RShd2BT$k$,@&h(%K2C8,r`Vrq"icFPrqZ!)4fD pQ-jH[9QlT`d#C*[kYDA)l[DGE'J2"@&NTlcmP2ZF2Zi[1IX@RDbpaZiX"J8lRI( G"*B"erkjQGEHH@QVrY`VfSb`VQ$EHfL1(p5IZq'4"*3#+1bC`dVhCRb@Y`BVr#Z RMm+`CilTII64("r&f2)0qAK53qqlLfaM@d6"BaS,Api[fi2,ZeIE4aF$@[19m35 0aB"m$40fLqI4cTQIFK$h%j[FZ,MBAmI0ECe5cGi,F,[aik5Hp@SiKq(@@q$)@BA EG@HGMe['`ZPc*@kp0BqF'h!lcH9$Z1NHjh`Fpd$CIKFhqqK`IPrjiG",lfEBI4Z hhLp(cSpa$e0+LAqiE12`'#&E+aiMC@0ES&'blBl(D0PB)fFEf9k'alDb(BF(#rp J1`82GY["pJE9#cB@eL&HE*IM-9kfpq!a3EDEm@L5MC@!QQ@l"irYCIX$2#E+pMG i6*,Y4hK-&J43Np3Q0R*YjfpQ'8q,E$2a)1IBpX*MQQ`X"$4GYPr$BiCXG!E`*lE 6m'L6l4`ml(C@@HlH-eXfDTV&Il"4dc[+pRimGT+0KBCfPZdqB3Lf,q0"$@,l"Kj kX55aI4m2pKd#JX!Q9K(#4XhE9Y#!08E0BL2Q2@3MVh[+4Pl*1EEAi'%(*`CFQ8M MXpLZaQ1ZE,IK-8qfZr&J[5*XAm#$cBH`N6-,q3(VmN@bI3q2r@Al&ccB`JMB"1r )#6E`iL$CU-NAbdEH`4aXr+9h-K)EDY3KXTf!"rXDB6X$$c0r1E13!*XH[83fDR' 4E1r$Bl&Xj(@*E,mYV-B'TKiZfpI`@#VE0r&B*KZj2-,BkSMA9L'V)`iH*4Zime, CU(-`%aZe4!eLSdk1PShiMj%06$e@YP2aH,PXi-ebfF#E9mKf"4jf!&[GEq,a5YR BT)PBX&'lam['5-k9XMf!"h@%$3jaSQcrL)IYL+NMKi#rb-Q6#pQ4qRPbMc@bJH1 flbC2h(beE'#3!*d(PQHGf`PCHGD9(5DDCelJ$YM!9h+1l9`m`#KXPq'",lBEmAL YE1[aH*eXRmEMG0PJe@!#0ZVi60QqMXGCXS&2VcHfH[)d1dZkRY`'rS)0M[&'fF" FDK!EH%GqX)%AjmP'rF$[X*((#f3MjJYPZaL2Lf4l*alBX9'lHR8TXF(jp-C5BS2 ck8@Pa2B3([!TE0r#3bm#*6Bi%$Y!b@NJ9`3IX-&lp-T5BS0Ak%fPa!E1ALSEH%4 pB50rF$4Xe!$j`8BZ`"PXeq)"VQ+l"BphbICC2+k5l8Yi`#1`r6NHemJ'VVcEf"V *BiJ&'ccJ1YRJ90I,"Rq!*f)$ZpmV'rMe'l+"(I!XE03R1)q0r-+jX(d!$fjXRm5 $@X-'hS-Rf1$00aPE2qEQYf3$ecmS'eJ10mG'$F&EXB(Ae!)f-2G@fF!QZ!BfD[A $XP%EYmY'lX!aE15&YEL`XI#@ASp,E&r%!cc(pP8mp)CFBL0RF%NjrFPpq4-EA"d -`3D'I8)fH#Rja`DAJaGJJc[C8Ehpb6(!8QcJ,r`)'hM`1l+")jq4M4UMpV%4'j` G'lAe1GRq!Br2'pX!FJJ`$4YDaVfbJ9A`5Qa`#(+1$3i"4mC'cGd['a`-rZ)G18) T8CRkFJQ6KIhc0-C(-Eh(Tp$Yj+2)rIrGELAdm"0XjH#KD#lech5l2Vp&M9Ylde6 5fBdlRUKd5UBVP,jkkh5#4UHNV&rCZcG"[9QNBqZKR8L'iAJ!jYS3ak+4BA9qEBe M5GI@G21%'T%kccc(pi-JErHir[`N(a[(PMd$&VPU$0Ti6JU,kUMDQYGefhaeD@d p[9[LUrlqS35!r3UJTS$aTR80qYNiEBiDXcV23Hh$GQq1LreeK%'N1SlM2(@Pr9F FRJ%-1Ml+[3U-%&-G"c[mE[aR`DM03YX8LijMeBRbH1,i!l#-djBK6pZD9ae(1mp l*JiR!,4GkhfI#r`N$X1kGYPdeBZ`0cCjJR8Yk%qTphE$1GLE%(+5fXlU@*K56qi [ieMDSClIVANpG(1IHVdh9[6#d92j@*J+%J"BPmH#h@l"FN'mq5dGkpIrCA@i1+D VTreAF@a1b%rMf!6Ncm64``LHM'2&cTF6mYJaM(*V[BD-FQhQ4#3pFG$%l1*iT2+ IMX-,S,,S10DjkNArVb-VF@q@)aili,4I3I9Cf09pLXHXLdS*!A&`fP!N[mLV(D+ 3!'P@ChmhIMc'ch3FX[ET,dKDU%MmXQJeRpB+`-+KMZ35"8"5fe@Y2e-!0X6K$9! !2!1-qpKL!S!LkQPJlYe9pR2QhK[(8mbp0ikRQ2ZMF6c*h([Lm#m`pmjm2-IF1q0 iMVRha1%4B1kErj!!0-`004qQkbcV'$c&2rJMj,LGZI9q+!$GL2Cc"@!M-[S8&)$ (keA(iC93!*Ckq8X[XAGZZZ*&"@$NAc-i#D6VMjmaZ0iiRQ*`[A%maH!HMH0*"YF 6ab[F")#fPjmaZ-jmK!aZ%qpk*SkYp4('XDDS'9qrV)qI-021I$c(6([Lf),M%SF !p@D&b-5aiJ3h*BJ9S5K+jamV8lerTE"e)pT+0,Ada((Sa2C6FA$DAQQXHM`I1Jj r!"0mPAH#`$fGMbf-mZRk@$1KQAAr(BG-)HcYY[5HRVR*,dY2q1IfPr2IVT2YPe[ feqmb!mZAP2X0QIHl9-9rcPrcYpA5Fl08r@!VbrYRUY5R3#Km1Y6,Jh-m%AZIqh6 Ac"XTUD6[Q,#BB8%6mX!`)Pd!I4Z&44@IAbkKEq+`fQ+!M9kL&Z%&)lhc$B3qYA0 m&"9D@eUi*%GE@-ShCi*F5k%B6*Bb8GLbIA+UjH,QLeX`T("GLe2`Y%UKCq3!K[A $Ji0D0G#FqLZ(Ymb-9P3,4lf3!--j"hAhTVV3IU[iPQD"mE)hk$e-ldDpqqNp31q 4H[IR@jS'Q[L@m%ISVIh&VeRrM+iQ)EX%%aaA"4((-fEPRe-HFY9rJKATM0q5RX, `h*FARD)A6pmFV!#(kX24#V49laEjkm$%h`@Srj@"@cT3X3r4HcMI-Rj,&i5mAH) $r9HRGe"06'l&b+i`FR0(%k-$N!$!pFF5J!YF"b"qpAVV#T0!G5*N+U6q6radT8R #A)APCGH9*ACAX5k1iG@%e+dFG4h@bHTMaD*MPaMdRr,h+,eePBVI',fEUl(Ncm) 3dc@PBJDM6+GJfB)6lBjJNR-V(43-e0Y9S%ZF#dT$KEaeSLA"1JRbeP!MEeIU)bG 2EiNAJPb,0dYAqJ@DMp9X9i[TKFRqB$5&9flSe-P6@1&"qUB1c(X4KR62D8e2EF$ f%ASqV9lZ39[d,r0,a6!SKKL#Vmh,MYXGT)Tp`8M+lQK''%hGcVV,[,&0Nkp["QC ,3#G[`l[G86jF9-T(AXjPm,MSQ*Di)E0bmT3-5kCQSErYheT4aUrqXG`rCT'4YIb ih*rl8[+lh%H#6e4D&qmS188ArmcY`RmV-Y&)#E296iV`Tic@&AqC)Sq0('#cCD) CCTQjP4P6b$)bL2L'QH5p0VBkQkiiQI@Z%b+h*ShfVDF0(jM("Mq[G$*ZYB)b(B% I&)Hm$!DZZrUChm`S5Y88ZdL9@brYXQ4UV,qcUpX8KEATHI#Q4Pa+G"dZF2-Pe(9 D)TRdYU,V6)Ca[CUU@eJ--TZ$b9fQqL6N&8l4bC[NR6c9%H6$`'Hpb5$T9`4[Lhp H@mK8Dm1Q3RXjRp0U+GdhPCT&VPGj'5IbJMaa4p"JZ@rM-eIU,fbqY$RH+)!FKdB 6mH+iNJTrkSRlfR@jEhcRY)jiZB,[fLMcPR$E"MLhaUPB-+TNb#rcZrZjVNIbPr% aIaA+cRMTiR2*X5ik+cT"4BHQN4JrK+3@S%4'H4F34[kUCT+%D&HA5@eBiI[%3'G cC@!J,Q-LMaa`0cQ9(c9Q&D`kIp4lL"-8@1)!)'KiX,"XSXASbPTl42BSa"2RSMm 45b%8E$C2S9fUC*(VZdlSfTY,RMr*'Ea0)a%`BAPB$ETBS,Sk5`[kP2B[5CE65(C l%H0#*m`iIQaPkBI5+LP*U&)25DLJ6,*`4#%FV(EhKr)U#+9G&HDd'TA,PCf0Xlb 48AP"NhK6,MfYfd,-NU),2*PI#U-JCerPlRSE*Z@[XpScJ*aeb-r*fd)VlH$6Nqd 40iUmI$DdZMfNH)&6+-4@AAa0A6ZMSK0DRHj%+CYeLc1JAA!`3B"1@R6Chmh(YRf pN!#GCUXQI13)KrhpB!)PF@J"hkqm9NifKjL%D%"'-UD1jJHj!V*aNXa,R@)q6SS &CkR4`KFlf#NRRbdj@EH5bKhMC$3K'bZ+-C[)A&S*BQHlIA,5SjG0L,!BkM4-),B NJ6L8%aJ9)5BTD21fL65&,k@ff[ARUY4k@!)6m`0F!1X3Ic(D$h$4%'V!h&&0JAl hSF24kJG4%(0D'8E%V!apiH[)bIcN8%qF$"`9F&YcKYMId5N6XqBMa3md4"I"2JT #Iq&SPL9Y&ZDYaDCJhQ$lf"cl#9-LMNP@a&l-6"*lk6GM,Q4!M1,5RNEa#[-3*6V q6fb#SDpb`dc4+d5'S%81MSU@[M%--I(4b6MaZDr%6CS#UKmD)P(d#EqU&)C,GX9 6ClKB[Q&P5#N+(cM*bB,&lPX-#R4I!CFjVGpe1V38&8U4hHdl`&eKN!$L)lbHUHV 8q+(qC'mZ@d%VB`mC*rbam`Z(CUC%ZRk*B5r5`3cdlULb`,E$84L1*D9fAPr$bJ) @P$'[LR#GX&-$K8VjKkPB-$TQk1)"i18VL[%@%l(Bd`leN6U98[i5i6r%q6N['j- RU`HKcqbAlMUj0B[Rq8LA$MdJUV,bENG,L2a$GmQ%fAqb-f-CbrrJ11$N#Vhb$r0 XpTU2*db#r#0AjNheIeJ5[9mpMb`QhErq$mZG$kcr`q,TJqVrX+6hi2Sr6&,BHIk I10mXXrk#HTfa[253!2Sr,)kmpb,mSrp84q[-,R+YI9P5Zk@H4fEY$+[r`f,Y-qE V1jaj*2q`G2ZEP*rJH(lXFYRDPbA9(cJCYdIZK-YMEPaMF%cbeKU$[XRe!h[ML,U *0ZCM,ITU2!&aH#I@)9aE1,'!@%pHr@jV&IU3!*GlhEK5F80bdNV&dXcP!9LUblr !*KmrIFb0j6'p6DIqh#[D60H)JQh[SENCS[ARERJN!D8!r,F,+NDR6pfa2eAIL@) EU[+H`(iJUZL*k(0Yq0q,CRY5MPGZGkRrFc4UK#Z'RpfiiiRpmRa`HFI&ikQ$+jF -($lM52[KmJ101lC1RpeN,leTbd#Tjr(&ePX(lF"DF8&JRGA8BTechZlcYeS0Z,1 iJiY@4GCijjRRV'KBd'C0CjFGD&M4d$2GXqrqkI&ejeh(Rl6R2YPP'eFGkRQX,IB F022lT&@(h[hB1alHZmiDZD([K[aY@`G6"kea4Mh%IPfEh@3YA(2kMG2CYVlTDeC [EV+@ERc6*crdLHi@[+rIrG(Z[3IIXJrjbaSbb*S4,XpHQH1VB9-qem0f*ekDi`q JSdAk1EXariDEC(Y`HIGUqbM0A[@4M3ND0,ZBeeXDJpI1V-C5bH[UbrFNGZ3edaM m3Vb8ILf[+hr#5Zc)khFDJrdc)medAZ-i"QklpFpIM'0Ikp`fDfR,D5fR$paHlQb am$TNm%PVfH[lV)9pq2'iKB@'$qp1(9biG+$8I[M)iAZrMINV2f50I2UA"NVff!8 p"alFXpYI-($[RYd"AMZHXfIh03[hlarBRqljaemX2c9`,hiCd([B@V`Z24#2e*9 +qj'0[br!MQ+(&GS[`l),KapjUZIamcHqGI#h,MUHef-D#eqZb&KT[DljbRKL4ld qh,MMkTQ4""9jEZdpMb3rjC@G*b@(ZbqFbDmkfT%5VJdNrb$!l94CbkGMI56j"mI #ZNFErL(325Ya*qjah)ceZce"EadJlpi4&I'4pEP#Sr`$raNhcf[LIh!FAim(rP0 BakZ6*mNrm*qQHYbXcp8mrdmi'PAqBAfZI$drFQ8@e[pKIDkkqMqXXG@ehPIm$fY XGDhh&Ir$'PZpDiV*2i`mkPS$,)k(0EDkeJ#,rf'0VDie`1*r@'0VFMdr)r#F`V@ ip*p&rKfZa5@q)r(XA30-rKQ&CpGkAh&q4Z2CYGjAr-qfH%kVimTfH%k[ac-'cm+ kB"[`E#bH-q[aM-1cV4i2LdNG8SqR'Fr2erqCL1HppEMTk*YBrkF&cbr1ra2M3#Z HppArQBERrI@i'8$IY@jCAa4Kp+3rD(eXq8IrkcYD(lZ+B(Up4[GHAlS"BcKA2lI ZLaGZrT`rk34DH922A8$%e-UUhDY6(`B2S8BQ6RIJrNM0kD1i2eCcZK2hA6@R&q, HYHE%KLC[)N1Vik!XH`l!rHED6`ILIN[0k9$F#qDFl*+C1U'liEkNpL2,4ldMGLV X8)&16ip!jQ,FHKa*r#2U,8TjiM3(Ypi,*(CLZ0IHT*ea-Yq+qpGV2ld0ppYV6T! !0Edl9ZJNQclkN!$hKGZi4DIrBjXc$mX@R3Y6IlXS9*J2hq3fRYk*l6HpE&YVkML fl0ld1$r6FAJPYMRV'ieX$,NHNbA5U8l(hh*h'kD3!"fI!0#!j*8p5c9CdTaFE&Y jbk1(0TI,Ir6VL@kiF!['C9EiehYq&VL`rJ0*EC!!S-qYQX4YMZ%,YphbNBQIa$3 B*V[kfik[6UraQDf0j2pEMmKAFIUD-8[rpMeZ&YQ3!(lHAMei6%+A(Z`"e(&lieM SK"R(IbQa*SjM6l$6RmEKRG#9eaC1D,!pHI8$kY0pIie*((h-KB85fH$J*CJeAGJ Da'a5YZc@!dpIAblrfH&ADmIlG4CKGC*d`lCML!XCUbN"S-I#kh8@RrBm,ZaZq-) RNYdfmKX&%TRL`R'h(RMQ@qAbhPIkK$eRCmQLZ5em$#lX#Ej`,R$KIBPZZ(!BeR3 XEfTSF1'lRdPUJ`4p$PrbI9bikG+N0NM3TlBKV-'&ml'PPFIYe$D%&9`iVecqkRZ 5fL""RpU'X1##5*9A*,VK3Qe$@)-,kkD5fL""6KrQCXHFM4d(pFP*(3IqL8k"[T& &ThGIFU-2Yipa-eFhmc1rE9QA@EN`1Xi#e6VXeA8fr%S+lZK2BY!ZIUZ2ZJ@2raF LYSNMH+,LGpBJfR4Y(*&IjP,%%5L1f'q[,BKpGU%)6K4mk4IJB(G0h"[lA'A5aZq 8ABc-q[dT(TFD[lBrJFhZ[RV8Da((%1-hj4Nib0U+R1ZrLUph0(iMh`)(qBGc!pj e5f1rl*qI#iG4aZr'[cmE4rEq!4D!mEYT!rjlUI(llL0`f-EicIYT2'amqCq"M9M Nh2)Ze)h0hl3d(,BcIKpj'2NBBIcfa"qC[fImpN2pe5Prfj!!Yd`fITqpGlBqXJq 1`''+mE[d2eEUif,N,,2@q(f1Zh'CqXMZrbaX%TIfZka5(arC!BG@eDAiC8`G""p N,UFC[chq+h0Qr1jRAi4P30p$2BfdM0q0h#pfK[%lD*0P,9CHpfZ(Jp3,X()PDQA -1ddq(RiMBFbLV(3FU#@UqcI!BCEaH`Pb(0M'Eiph`Q'fmGZc%3mEhjM2`ED$mRF 0([f-hcA-kBlkVaQ2!FE[!6),Zh[JRRq"ab$MGbTcXE2a@`*1T4BE[pf!5CR,K8q bRPcQcFE[N!![`@D4GDmV+h%FaCVEeILp(ILU(M*qP`(c-UJ,kU!41A!iG2r2`S0 D%,m"[cb,3m(Vqq%aam6acAd9(2URhiI$lZDrSIpU&SH#m9YBU1DrGqkCaD(X(m@ *0[q0HVU#3amma-3C[r(SMh)ie(`6JGA%-IF-2&jZi[MarE$4jXi6VG2qpmVhmL2 V4qhDqV[q)`4%krHQ5[fGqJH`@9jl',(mAK2IejNcfeRa8Z#G1XImGpGq!U,a1q* Q2$jJr0j"I,++kPaL@*[aHaYU+-0kT!lq!K6#aRhNeq"`J-RhqDMr1LXAa4dUKAd f-pmJ[T`02cKej$IhihJ-JGr+Bhj(X0l@jL+IV#lbQd#F[6NAe[llhPei01@Lm(M F9rdUU)[&iqZ)%3HD2,@LcKhHIa@eRK'rrYDh+hMrh[0J-reYkL,Z['EarYr)$8` RMlS)1a8k["r#ZJGEU%Z*fq*ppY!BE(!Fm[h(&Ecr$2-K2)iiCJ!24UXZarjR!VI jlf[J&Jl[llk6`'hqqp(+@E`2,L!h@'6qH`HiRF2lUEm1"lL-R$Zr8F(lIFLei%V !#(+3!)e[fEF)($CremlL6IECXf#$dr(IT!VHY2`aE%[P4heER0kG8X`bihICK4@ m2iViHS6qHfX9lmR4NI)$0ddFfHq3!(mFCIbZr83&lpGpRN"QkQ!9m-cKr9Am#fi SIQZ4&iIhErNd21!#iRF+DY(9kpQXHfT6A%i&cMMHq6eLZK''94GjLmAlVe1R-1U *qUIh92$q`k`KSf'Skmq[i(f1H'!eNXYrGaE[Jc(LNpAHjT(Vf2q1*0EChVLjU&G AIhra,'a@bja(h,(epajbBpYCqmRA92$qKpaAf@TbRd+Y1,arrbr"!GcN2mL,aI[ EbBfYjR%iqB2&qlS(BE1lhRdDHS$&qq`ca$+MAkL[!8Y#[,ID!HHlhkcLIH3hlkN UhNGq4lkIQ'Ia2[+E3,adH&r`8bRb'iIhNGpqIeVKphZ5djMH%IAHJaApib$U(dC R8HmR$l0e2)`eC&3NpAl@VG8rTV!QM1DUGS-c1Eli,lm'$rJ4H2QE&Air#YLFNHj c12dYhVq!''dd4A8VkR2)I[&&1,b4%0AG9AkrR&cGG+3%a!q(pkF3AdmemId1--E LIIBEV-[A',qrKTlKm(i%pBr69(pS+MDql4k!M6SL6r")bbmr"Dc0U(eR'AH2YAK c*H[XG08Vr-(Lp0IH"pXCaZmE`#f(peIclc10hk99[&p$rR'@iJ!h,@qB6MldHZ2 hpq!r&ZqcId,X*ZILFKrU`1&pIh)XH,(i2IKS"Hm2I")HEc4qI`JZjHVe,cm&$pR ,'Emr!UBkI[p4eXDjaZmKmKmEhac'J$k'Rf#'`r[h-DrR'lqr")ik["qf'KjJLj` V[elKprp-6SR'3Vl"%I[I+2j"EH*(r,EqTP%$ZPKq`V0Yr@@2N!#M8UGb2J0Gd1( pha$,`ABjIdGm-RLIr80UFhDhblq&2Z(`IKCj*28SjehNQ4E[pm#UXCPrDI,D$&l Nq2eSFMZd##"AmKlLI@%IlX`rC$di[)rmTM!QKrHa(cTJJr#qi+Gf8kY`Z"ljr3# kLF2[UmL2i3[LmQhU&kBZX`m6Tp%Sa1q(M-[Lpd[)Emc1cHTCB*MMIjH4jk(,5DT h4CdjA,Q"1K1kK2MY$ZlVF+AI%ALBAAbccDJY&mI9a%3`8rcf!3BiA-Q`cY#Qa'm @p9$,)hp-$J4I%,rpJ$d@9l)2Nf[HD2`1"LpdZ()QH5VB*Ail3Y0eHXB&e1$@'lq Prkj5(m2*JHm`IXZ)%aDhA[H(X-("aHm)kNff2TB63cmU2p'L(&lq+l(`BkB!AdE G`GE"'iQ[GaUrZkPp@Rkc2cQ2f8NhHc8dihlL+bZ*dj)Ir!i&rh$mCM3aLrmPTFH !Li`4(cUI'ZiR6EfH50j[pBb@,c"J%mF+kYk@hpa#M"%GMr0CjYh'Yj,k"&S"hm) M,EifJJ[UfT6c6HSF&PprRcL0MS3Ip@Cjb6hNk'KVNSS[8Nqer1BZDMIN4-lhQ([ ,EiiP$lM(q(f,'Vb0Bb&eL-qCr%e$66Xpi`,@jHH0hjYKFcM8MlV[laUrYf(G@kH Mra@jd,h'lc,`9iG$Gc)1d5A`Za`kK-1KHkM&N!"$m9Y$[Q[M1i$rh@ImVJ+'1Ak 6*aHphrLp"rUhaD(X-p4qa%iG0%#IGRT'fh,Bd",PI)HkVkfr%ci-Qr"3cMmbEPY rrFNjIdpqk2Lfr[i@@P(Q2K2ILmN2$Em*eK1Vd%M&laZ)cqNC[d913`l&TB8mb[+ EAk2f!EF9[rf)jBEIC"pr($C`32*k2,$(mCYh8GG(ka!Aq(I)Em!9Hpj*,Zli6H3 hPhMUq%hNCilP0j(I&'L+kR,T'3@rl#@XImGl)Vm6X)1T`r[GIJFHp'@)hmfS'iI hRpS,MbmE[eZSEpSk2T,BSd9Um81rYhKr0lRP3mE[9ZMl$Mp1*JH9[JQ0Pm+R(Gl h)hF&5q@V4[)YJrIC*rJI@#TaR!)G[k&JrVZ9["QG3Ic1")pbH,q+R*1i*+A["qi k[0q1QMJm9q,l2Z[Ei[fGe"M!'BRM(2!3KrH(I43Hp+6)9a1T6pRieT%[SVQ"+r4 e@,bC4c`@ABMcA@+KdkhTA`%6`'piTmATfH6!TRFQfi,kXALIIC3p#R"2F6Q)@UR &qmZTFD#"Lpr"e-&Y(%2))Il1a(%qkYEKr4l85q"Pi[FMe)h$qpA%NVmhIMq'VZG ijh*L#&U"q(fTfPpb0V%5,LBKC#[kCI!&B[Thc(pIS#jMicZ)fMfkS[aAAp8[9l2 (!le1r!CApFZCX'ABRb)KVf3IKG8c0&6#BFNhZV$plpAN!GpAR9%rY[kZ*@HJAUK Ap"f,p`q4Di(KNUFGL+X@lqG4YkBfaHm`a"RU'G35@UMil8*rLrGA%KI0$[l+)eH fHXC&j$$`%IR[`YqVi(f1q!6AJ`q*[KrL[A!XGbkI`r[)EbljQm2lb#r"qmK[+VA Y&`[[#hlC%[8!KrH4hjHKAcKFEk@qLqB!2d#VX28kMcc*l(+FICLmbZ,k"DK[Zl* VpK(%kh$L$QVHaM&i(E3"KcFI"Sp8e$c&j368VF1EJa'V1Y2i638@ZMKHLpT6e$E &Emeh+RVj$a#EBSm!H)QZBH-E#ma9TJmX+%(hGhJc"6LK6"pBX!im`1&0)r4lT6k `ci-h$,Sj&f@2plI0*!qFQJXLkGKKREfEiX[#9"KCTbd&9LVf*FPT"@r*0Z8+)Ik ,iXKqQEM@$hebk(%&R5Rh8qce'5+rL,IYb$iPpep8hqqLGY)#[f*mbLFq@Eric'E rdT!!(+CpP2c!jUYcc[(*,X&Gd(3Y(Z3E`CQ9k4X,KZ)H$Z-h&(a1QEkai!r)Q`d Hj&HbemIdM39I3$hE1Ull4I3K+G-h&R`4I43@$qTDU5'C[U[J5q"U&JrUlS&'Sdc I9A$[MC8i6NF1P1Ql#Jj!&l0i82HRi$h+p&d&$l,A`FCh,AU$P1Ql#Kk%eQAaS1k pk+G4TZmU1!LZDI'JVJFj81UlfSIDLF0,@9RBR9hCcqI`1r+E3C[$lpJ2lZ[`1rC $bamJr)lmML6qZVS[q+NR@3qQ2[+r!5a4TPmUf`5HBIParTp6)c6p8X(&U%1VppH ["2G3TPmUf!+ph[,Mr"fSB@AkNqTH!fjRpIlmle"c-[e*f32!4FZ2mlF6Tder8[" 2S![E[SImek'*+01I&,3M9XZEmhH55jRqT+#[LLYr"YkT6(p5m-[SUh1imJ2N3TR qT1!$PAl(r'hS89'Q2bRi3)@2jKm!rLR6Rj4Y)JHeHAd)(%LCrL6ej!GRH@(qhG# CP1P28Np6BcEm,2m4F&pPqT1b'eL2KNrR[i"H1'AkNl)23`1`[$ar#l3hCIU6XK[ )c``[VhmMHL58k8r+EL"(Yh&m#eaIQIkNl023A5`[crmEr+9-Ie,Z2("3Li[jhdC Y+p1IP2X(i*3@&qZhXLj0Ie*Z$I3Q9`GR!,18k8r+V@8rLX(&r0I4XkG-Ie,`+p5 AEAaITHCUqT0b'r#(aFAm(F4Xdjq8Z`biDh'aIK0iX$,p5GNmp@A$bqY(f'YPqT1 bPe"MX29h$h+[6(p5GN1Pcb2r1I6!+01IP0e!rGV@hjRS09+Q2bPl(hYS$#q[AmX 9XNer8[C4D(L@PpGIq6(B6(p5pSr*r``[Vem-l&#Q2bRl"[Bq'PkHr`TA5cEp53& e2X[,mlq*hLmP[R3hGCBr-A(F!5a4TMp*AFMm@EmV8D[+p#GPra2e(Z[h!,39CAK 8VT-p!GE[jH5[TKr)p+aB[p(8`%`r8+k,[0$klBiq5fAkJA,Ge&@Yhf6bCY-2&2` ciUAefaHBSN`r8+k(23(@EaAVh[3$"Ep#rG(ijCmNAYSC!hZbEpEa'rUh,2ql%2T Tb'm+IYQ0c*2M0`@r6-Hb+Vq*r"*p)[+EcAjQahIMq!VkAm2lJ+R+p#GP,b&Z'Al 6k()eIGZIG!ad&k[r0E*(@CRqT1$6i%Q@hc6m)[S!P1P2UYX!h,6kAq-ESF%Tdjm 8G%'VXrbQm4VdP#M6Ra5m"h9JGG#'cl,q6(p5F"[lD`frD9c#9EC0Ie,36AhGm*[ 'jF"@TIkNPa(I$EifAJ"ZUNar8R!Pkp[`QmBGe1T-Ie,ZTk$l@ea[l%-0+Y1IP(d $Y5@Eebp"#e'Q2bQlNEKPm,@a#GUF-[e*fBLiDA#Zi3(d0bM6Rj50L'H'Pc3ZJim br8P",l8F`fmDRN)2NM,p5GQ)r-R`QmC0i*6+p#GP)q++LD0K,f*@TMmTk+FfB2K 0ib!iM$,p5EPr!Ibcr+E4)EkDrU6Fqk$*@Al6F"-d)@AkNh)hSMjF(E5KjT6T6mV p+[44bfmDQm!YPHP2#RV)@fam5i"*b[3RjAi$H'$j6F-Ab@0-Ie,ZBrMAmT['G[5 L+01IP(hSJPPqdlJ&A%HCrU5JLIdm"NFEVSI@S%ar8MDLrQ[Vm[[3&K9aA[c@X)r DeQ8MY'4PqSHb%I9%8jH0r`Lp0-Vd$`AVbH-0lfRX!dG5TRmSm-KG$1pTq0INpkC r+"JNAc+mTr(Yd1)9q"VaIBKkZZ%pM9PJLQ)[M2ah&hL,j6f0!qb*YlZ@cf"rNG- ,)cbqMjVhp[&rGHhN9I5Yi%IrLG9,cQB[#$`,2rS%$%lAE5GITaG$r'jQ6#EZZM1 *Pr555cjQNPpFB[cfCUm9mB+MD)dRb%rkq"@i(R&mKGUYcFITj*'fAqT,a'@RhiK 'Vp3[p4A@TFe('lL'8Vr82G5RE$j13bk9kCF+YM0ZNirFTcJV`[4,"@mRhYPm[*i iD[ZP[N)pe1CM$h"GTAkTVe'2X2Pi&64"46k,(hKXmT%lK,i@44iRIPmJ$l6jZ)M k"0Uba2efmL&E(`G!Qe(Xja@r5mLrE$jfSkj*(`(j3r1fq4J),9QC[UZJLAc$jZ- -r+9-heA`GZVi0Krr#LeEQEkVl%2%IC12h"h!8'AkVS,29[+4ZjmpMUE[+VLMQSm m0!aPqUk#RfI[JXP(l[FCRqQl#RU)FcBIVf8q60p9m228%ffpMJ0f+29G235ZiqT M'A8&dhF9h%'FXr9a$V3YCIUZJXq4EpTm)*XUdhF9h%QpcqEMDZT2TUmSZ*2kL-P (lJRd2LR69a6F@HQMcAd0rAc+p"8&hH32YMlH5r`fI8A"RH3KYMjq52h'p"8&Gj0 2Q(cNlSCQV8aI8A!AHi"X[9l!(Kh69a6F6GjLmr&aF&GPqSU#ZiQcYMlf!RG5TUm S'+)HBH[M9F"SCIU+JVYCYlBqGND2QM*p2-'rTdjRmh%EZ,L+qhMq2`#3!`d*9'Y I684&4LkjZA-ZZENZZ3#3$bIR#BB!N!U!!!!#1U%!!UHl!!(f1!#3!m&069"b3eG *43%!Y+(T3,A5pXJ!N!Cr0!#3"JiG!!#MY3#3"YDK$[LVcfYLmR0JRCH(hfbcVEI C5GBDl$0'+1'aU-a*(UIQEIVG'[q-YZE*9lE@qXCA,hkdNQaT(H'%acEC%m)*,ch #,m+r!GQ-F,,*EmNQR"`Rfpk,l,-c)rX)rij`XNH%l62##Brm2X+2E,)**lFCZDh !iKAI*,X@GY&0ZG%*Mh9Z,`ICNGYNNfHEE3D`$jJ!R"G3CRNK`iJTLP+L+1TU44N i9e&fKa@Pl#'+fDbk9,S+Dc$#HL#B5N@0P1C2'Iekb-V%bP'XHeH[Yl'TZDj4ldY ()RT+kd`RV'KFc`5ZepU$L8Jk'0'e,YfbSSQ)QBRGS)%q@SZHd&0"+fSN-T%E05* 9S[$B1c421"c&+m'BjN[#N3hZ-Y+TN!#ZGDGd24[8N!!f,51ZRDr[[Ya)KE0aRP" )0dh0(l4fCS1kJkQ)EKh+8A-dTQ[HB$*CL0U5MXE#@Y1!P3TQJc)F%&JbFHGX1Yp 101@j%0-B0B1QUFIlBRUU%0J5-rSibI(S&FAJpQKL9c(%+6bCa0FfV&e,N!$M58T HpLN40N+XKQB[JFJQ[0Y2e%MSX8a%@r#b)0$%JiN`i'I*E8Fkr"k+mJC$[Uj$G,* MI@NVQFkQbiiCcL'#'Sh35*c!jG@*BF8dqId0)c4$c"'D)A#-CJJZdJ`KrUEQ)Am a046M-H2&V(6U9f5Cb#pUGP&TMjVCY`8PY1CB-%H@3$64LC`@H6b`kCb44#1QD5# NLlTBc!'#aj+0i'+b%I+kQ(%%d4PdZYMh6U'IE224@FUq2MV,f(F9R62BG`1GjHc l!Td9l2XkR62Cpf-kCl([56TR-haJQm1qTA5CbljeG+PNAbYGjV([%VT8X@mhA8j MhdISFMVl2NZAqHblKbi,f2FJA4DblfGd@F5qTqP5,A`Zj')aqdJrfVb!Mh5NFLE lhN1A*Hb,dJ9jJqmDZTc&[Nr5C4Rl[NLAjHcl(Pddp[f#,QpKhe0d@5&m*H$%@pN (r#[CjkE,fpKA6jHcfEH0,U[B"qf,[-%h5*HhXqp6G&R$[Lr6C5hlN!#2'XQ+m-d DH)AkKlU(HZI8)Y3Je"l8(03De$E8,Y3De"M8&UIfSBkKaU('S,DJTU#@S)D!ZkJ CU"AJ,HS%kJ2U!ZS"kJ$i$pk$lkLYU*hJ0IJ-(S1ri#hc95CJYKacak*pLV@,I*! !$qk3!0+5-Y**EEdM+*5k1[Di8fBUT,4(ql6@H0*)@4U8TpFIb,Zh"'-a`dKS@r9 B8[%'0#&ElBF#*'c-%-NBH%PC+56*#NKXFCK6bB@q`(!rB+J2806r3lUrS2G(HKh $`Mm[q%H%rK'"RdYCAY!AKAa4`,0`,bM-JSk8+CUMrk&[(2d2$H2SIfJ94rp$PcM k(cd#4`-edZRSrbik(IfrJdj(rmFC)qcpG,,qYrX)V2q9Mp,*qPqjP8l@rhC2JI@ rmK8k@ImVhk'6pErGAf$pVca"*qYrjIGd1[SIZA2d[k29i)-'Brf[EU!,khqeK5k Xrp91ZV$q9pp(&pEr+[,+qPqpNLkXreAd!PMrUaqR#q[rJKh@Lq!DFJdq)Cq1IJ4 'm!&j46k4Gr!91AAi!ck#Hq!FX)0Mi"ab!Pk"0q#li,E$GQQmcGjl"rU4C#Vj[[4 8AKr-h[YTp"*P*qBSBEVMb2i8XTejYbc'E*+ST93Qk$VpQU2CbBi+6m%p@89GN!$ ('!L21h8HEVS*MUX1&Qpc+,l8TRNjI9-STHI8ZMVT$)ZN,BE+FC!!M+iPSLl8@E[ UiX'3!25Y2Z6U!ZX&e)8)rTG'j@ke)9FAbV*eBB#q,FRH"%1Z,XbJ6S-UM@X[C1S #pCfS+JLp%)V*i+T$VLk8i%r8b(p6kDSjrlXP,LD9qj0JQdZC-Dd*PhMmr[C632% TfT0-BNk("!#(epZqCHUGiXL')qEeYdp,J4Ga""V`&e`#N!"AhjBfRT(bR"9R6ab acUl1"MP!2VUEHVVGI6[(hbN-[aJe'dGS-UrjZ4RM10D1c`4j"FG%3Pl"-CEf[q% B"r)b$ReJ)L&r0K[("1fRmi'2McD1b@`-M8JjQSmN$6+4"1!)M@Gf+Uri%1cJH,i 5[B)MQ6k4e`b1b9iHKXqmb(Y6MjbU(f%M0*l6B`EpBFrHN3,J-(I'--0Vh)U$HBk BDD8P!6KJEL,*LEckkH``D,6GmkCk[Ai*3)mA)lI%h,bM,H0C'TNl1%(l0NmRFq0 C'%"UiiK%-HrXhcJN!aTiTa8rdEM)D+&qSY(4GkM@JfMM@'`FmA&k['MbJ0S+FiG L0#lUC&jY(2h"m@SeKF2jE1qq)MUPTDGaj-Bf2[Y)KAbL+bDTk2T)!93TM65E8$R (mbTA8*2(6&5Bh1M1B9XUrHLl8QT(-rpkhr8j(0+![UYNS(,5E196@#30IGFaPVh 4Gjh'FEc[1ShMH0re"4`[p9fRF-JAqUkMqFMfABrh18Ga[0RRR-)K%HK26V`KCKT 2[0(6i*[@(hJMdmNEcDhdSmmj9Y(Hk(-HVBbbJ$kRMF13!!(`eFD46"SRj(ZQjr8 IdJ)(MF[HZ%(,cE-HYS@[+6J#mUFhAP0`dcL1+lKT(-F9h!XiAP*`8cM#ZJ5JVIU DJK[04dE"MHZZ9h'Fj%F'"mdJPJ6`ibr+G$3IEbV6+4b6GCa`f(2YTr1DST(04`d JG*-PbZJEdIE@9cYXBa8Y5Pm*Th$iq[URFF$FNihlBrQ`FFJ$P##'GmX"mM'T+&r QKp(A,`(!JAQf8TL*HaAd2ed-@-bb333-cdLNPmL2@)60Y@12%FL"NB8R,M+D3CI b1P[)BdpPZK96GQE1QJK5'%9N%b!hjhTQfaBMR3M6rm0RhcZ2c(DJad`V('"8'BB E"PSl'K2TQ!6Jdk*%e14a[4E5Q[-`ZU!"!aGdmr$!K!YErCShF+(i,D(58KbZ1B9 GC[jZH&B1m%A4-H6#K3@,mYTCGQ"Pp+-![`8bRFZCBL%RfMlQRi#JA1h[qB"8LU% PPIG8*bZMm`IQAR4"8L$0I@,JYAG8@NI)6MRm9Ec!b'Qm)!V@(X&lr*HKdqIVcL0 @@cUh19pJe(*RB4f5fmfYl8hdSR0AXI+Ammh"fIb,-Z&XYZ)`)11!ARGPhrN[)k' Y+hF3-p"9'Rp,%kY@UFl+2%F5"HAP1U5)j8"kV,IAY)*MRfiP#DD+&C,3%XJa1Nr ZBiX*fHq9CVC)NVTCQfHlCjjAYe,'jATUPrR5J$9CRFPK1hkU8Q,r$mLd[leGV8f bYj+J+$XY+ePA@iZTV@icRA#(M(KY-Q@%db(,V1d2lkTGlejI5e00c0TJ-PSV*5% !EGE'l5TRrcQ*R%%SaB24K15&"19#,NS!'LJbL2kdXlZJI-C)pj42,Jf5q3USU$4 5$#F'N!$hh#G"b)fDq6l2RrMqZYXJGKqP,*AmNMmN`Rri3b,f,DaNA20B"4jk4m6 2jrJ&l&r)Qc)ZiZT5cB9b-Gr2i,JcH9['*E`&ie,'F4CrKPPQibR2l1DB,EI2&Gl Kb'&-brN&J@hSYIUj9hGJGeAB3jARE4eXhcqr[12!['Fm"`iq1RI2*qSAe@J9Yfh V5'ppBSCbJ8mcP+S9KV+JTPCC[1c'j6f+5UH,cT)eeCDbSr(da9@UUeiCM-aj4+e 5Y`jZ[Hq(JcY@,pZ$Pqc)qXLFGG@2EhfXhSkXG&jI@IhiKaklqZGhVPDkVQfl0R& hMkpp[l)$U+ZdPI9DM9*kpUcr'ic8Y`eHXR4,M9+alYapYhkqZCEZYpriQHBlpfq rMh,VjamR%TJHli*9$El'TPADUNC2YiHZrYD'EPiH9TjLU!'PK6&Uf$Q-0-jGMca 0Zp('[LCrU4&5&i1fJUUcle32(U!9EE(VU)c1K'BiDIrrcI9I4XQJQM@V`pIKm6D jQhT'2feJ*3`"QLl1r4pSD6IK8L9Z@X@a'f889i+iiXLL#ST6%9IXNml-i5MjG6C Z,YiE&$MbFCAlk))i`T'2QdI[P98P8c5j@,d&qbdc0aGX)YFk1mie(c[&FQGS)5E [GS[hVXH%@1kT,-4qX6H)Z!FqPfA()TSiS6+qGcq-4)ZiDSb[VK"a2m!1dV`6E6A `R5RL0%c$jIeSUkmQ@A'EL,XC1cPc[h%PlB!mBi')fiGH&Zp0ZiEQT#ljS)Ml(BC (m3ke6D44eA)4prh,+)"r`[E6U)`56F4GGa%&m'k`cIH$$#*Zr@p"-)kcpl)@FGG X"-%ilPGi@r$'KHND[(pY-hDhVK6[rH&Ej109-lE6$V2U$"(AMk%H[*GYmarTXPR JQ28iqAK(f`"fNQ8FMi+A[+rYaGmQ($m4F9GHL*b*Z"EL4-N'%IFNm2%HYffA%K@ CIfZr!D++1"rYKZh`932(H,pErejklldLlUYh8`$[HVX0Z4(iA,-q3$lHqlEh0qK lL[FfBYpFhJ%hJTiKmqQ@246!qq!'-)Hj6m6Tej'22lVhhTlPhdqarbl[L4Y!c@$ qhBrDa$[MpYk9iCrk,Y3RhKmhMYliJi`E1f2cRN5*cC6[aF`262hR[E+0lA6C*q) H"KGjafcM'EUi49`0DJh[QjdL[VNBpcH41pipZiIiAdESlIdTFVVRBY5&3BT$MF[ (I3beJH+`(hFq$PcAiTBjM10He-+i&F-XiPbF4IPe,BeEND)1k%9pQKNh,1$,@H# ld$MqGPV3A0f'QXIlFPp'qhZlDZ**Npl,i`MF6*I9T#H+F8RdJ6QZJ!meTL*11dF -a58aSZE$mH$`IKQA%QlP4cDIbZp&4jahpZl&EZ3Vl,LbPM[)abfi*(C`&A@LE2D 0b!((BBpKS5G+qm"jhZ[l8Y4V`GG5!cX(milI!p!Ie`XFUrH6MqH$$ab!5""a&d( If,Yrr`m!!#%K"8*eD@aN!*!F#BB",3!X!Ed"1`#3"3+C,J#3"3(f1!#3!iB!!!% 1rj!%!q#edZ`PYMQR`J#3"4Z5!3#3"3+QaIrarr`!!-0!!!"Xp5%K"8*eD@aN!*! F#BB",3!X!Ed"1`#3"3(f1!#3"aB!N!1'!!!"$[q3"!2JYG,X*EBjTm)!N!8ENJ% !N!8#TkArmIrm!!$$3!!!+I#3!"N!!!: fv5.4/ftools/guis/fv/mac/fvMacApplication.r0000644000220700001010000027120007034424074020245 0ustar birbylheadev/* * tkMacApplication.r -- * * This file creates resources for use in the Wish application. * * Copyright (c) 1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * SCCS: @(#) tkMacApplication.r 1.2 96/10/03 17:53:57 */ #include #include #include /* * The folowing include and defines help construct * the version string for Tcl. */ #define RESOURCE_INCLUDED #include "tk.h" #include "itcl.h" /* #include "itkPatch.h" */ #if (TK_RELEASE_LEVEL == 0) # define RELEASE_LEVEL alpha #elif (TK_RELEASE_LEVEL == 1) # define RELEASE_LEVEL beta #elif (TK_RELEASE_LEVEL == 2) # define RELEASE_LEVEL final #endif #if (TK_RELEASE_LEVEL == 2) # define MINOR_VERSION (ITCL_MINOR_VERSION * 16) + TK_RELEASE_SERIAL #else # define MINOR_VERSION ITCL_MINOR_VERSION * 16 #endif #define RELEASE_CODE 0x00 #define ITCL_LIBRARY_RESOURCES 3000 #define ITK_LIBRARY_RESOURCES 3500 resource 'vers' (1) { ITCL_MAJOR_VERSION, MINOR_VERSION, RELEASE_LEVEL, 0x00, verUS, ITCL_PATCH_LEVEL, ITCL_PATCH_LEVEL ", by Michael McLennan © 1993-1998" "\n" "Lucent Technologies, Inc." }; resource 'vers' (2) { ITCL_MAJOR_VERSION, MINOR_VERSION, RELEASE_LEVEL, 0x00, verUS, ITCL_PATCH_LEVEL, "ItkWish " ITCL_PATCH_LEVEL " © 1993-1998" }; #define ITK_APP_RESOURCES 128 #define ITK_APP_CREATOR 'fvEd' /* * The 'BNDL' resource is the primary link between a file's * creator/type and its icon. This resource acts for all Tcl shared * libraries; other libraries will not need one and ought to use * custom icons rather than new file types for a different appearance. */ resource 'BNDL' (ITK_APP_RESOURCES, "Itk app bundle", purgeable) { ITK_APP_CREATOR, 0, { 'FREF', { 0, ITK_APP_RESOURCES, 1, ITK_APP_RESOURCES+1, 2, ITK_APP_RESOURCES+2, 3, ITK_APP_RESOURCES+3 }, 'ICN#', { 0, ITK_APP_RESOURCES, 1, ITK_APP_RESOURCES+1, 2, ITK_APP_RESOURCES+2 } } }; resource 'FREF' (ITK_APP_RESOURCES, purgeable) { 'APPL', 0, "" }; resource 'FREF' (ITK_APP_RESOURCES+1, purgeable) { 'TEXT', 1, "" }; resource 'FREF' (ITK_APP_RESOURCES+2, purgeable) { 'FITS', 2, "" }; resource 'FREF' (ITK_APP_RESOURCES+3, purgeable) { '????', 3, "" }; type ITK_APP_CREATOR as 'STR '; resource ITK_APP_CREATOR (0, purgeable) { "ItkWish " ITCL_PATCH_LEVEL " © 1993-1998" }; /* * The 'kind' resource works with a 'BNDL' in Macintosh Easy Open * to affect the text the Finder displays in the "kind" column and * file info dialog. This information will be applied to all files * with the listed creator and type. */ resource 'kind' (ITK_APP_RESOURCES, "Itcl kind", purgeable) { ITK_APP_CREATOR, 0, /* region = USA */ { 'APPL', "ItkWish", 'TEXT', "Itcl/Itk Script", 'FITS', "FITS File" } }; /* This resource will be picked up by tkMacMenus.c, and used for the * "About" entry in the Apple Menu */ resource 'STR ' (2000,"AppleMenuAboutSTR") { "About Itkwishä" }; /* * The following resource define the icon used by Tcl scripts. Any * TEXT file with the creator of WIsH will get this icon. */ data 'icl8' (ITK_APP_RESOURCES + 1, "Itk Doc", purgeable) { $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ...ùùùùùùùùùùùùù */ $"FFFF FFFF FFFF 0000 0000 0000 0000 0000" /* ùùùùùù.......... */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ...ù............ */ $"0000 0000 00FF FF00 0000 0000 0000 0000" /* .....ùù......... */ $"0000 00FF 00F6 F6F6 F6F6 F6F6 F6F6 F6F6" /* ...ù.ñññññññññññ */ $"F6F6 F6F6 F6FF 00FF 0000 0000 0000 0000" /* ñññññù.ù........ */ $"0000 00FF 00F6 F6F6 F6F6 F6F6 F6F6 F6F6" /* ...ù.ñññññññññññ */ $"F6F6 F6F6 F6FF 00F6 FF00 0000 0000 0000" /* ñññññù.ñù....... */ $"0000 00FF 00F6 F6F6 F6F6 F6F6 F6F6 F6F6" /* ...ù.ñññññññññññ */ $"F6F6 F6F6 F6FF 00F6 F6FF 0000 0000 0000" /* ñññññù.ññù...... */ $"0000 00FF 00F6 F6F6 F6F6 F6F6 F6F6 F6F6" /* ...ù.ñññññññññññ */ $"F6F6 F6F6 F6FF F8F8 F8F8 FF00 0000 0000" /* ñññññùØØØØù..... */ $"0000 00FF 00F6 F6F6 F6F6 F6F6 F6F6 F6F6" /* ...ù.ñññññññññññ */ $"F6F6 F6F6 F6FF FFFF FFFF FFFF 0000 0000" /* ñññññùùùùùùù.... */ $"0000 00FF 00F6 F6F6 F6F6 F6F6 F6F6 F6F6" /* ...ù.ñññññññññññ */ $"F6F6 F6F6 F6F6 F6F6 F6F6 F8FF 0000 0000" /* ññññññññññØù.... */ $"0000 00FF 00F6 F6F6 F65F B3B3 B35F F6F6" /* ...ù.ññññ_ÑÑÑ_ññ */ $"5FB3 B3B3 B35F F6F6 F6F6 F8FF 0000 0000" /* _ÑÑÑÑ_ññññØù.... */ $"0000 00FF 00F6 F6F6 5F89 8989 8989 89B3" /* ...ù.ñññ_’’’’’’Ñ */ $"8989 8989 8989 B35F F6F6 F8FF 0000 0000" /* ’’’’’’Ñ_ññØù.... */ $"0000 00FF 00F6 F65F 3489 B3B3 B389 B389" /* ...ù.ññ_4’ÑÑÑ’Ñ’ */ $"89B3 B3B3 895F 89B3 5FF6 F8FF 0000 0000" /* ’ÑÑÑ’_’Ñ_ñØù.... */ $"0000 00FF 00F6 F634 8900 0000 0034 8989" /* ...ù.ññ4’....4’’ */ $"3400 0000 00B3 5F89 B334 F8FF 0000 0000" /* 4....Ñ_’Ñ4Øù.... */ $"0000 00FF 00F6 5F89 0000 0000 0000 3434" /* ...ù.ñ_’......44 */ $"0000 0000 0000 B389 895F F8FF 0000 0000" /* ......Ñ’’_Øù.... */ $"0000 00FF 00F6 8934 0000 0000 F500 0000" /* ...ù.ñ’4....û... */ $"0000 0000 0000 34B3 89B3 F8FF 0000 0000" /* ......4Ñ’ÑØù.... */ $"0000 00FF 00F6 B300 0000 F501 0100 0000" /* ...ù.ñÑ...û..... */ $"0000 0000 0000 00B3 89B3 F8FF 0000 0000" /* .......Ñ’ÑØù.... */ $"0000 00FF 00F6 8934 0000 00F7 0000 00F7" /* ...ù.ñ’4...ó...ó */ $"0101 0100 0000 3489 89B3 F8FF 0000 0000" /* ......4’’ÑØù.... */ $"0000 00FF 00F6 F6B3 3400 0000 0000 0000" /* ...ù.ññÑ4....... */ $"F701 F500 0034 B389 B3F6 F8FF 0000 0000" /* ó.û..4Ñ’ÑñØù.... */ $"0000 00FF 00F6 F6F6 8934 0000 0000 0000" /* ...ù.ñññ’4...... */ $"0000 F700 3489 895F F6F6 F8FF 0000 0000" /* ..ó.4’’_ññØù.... */ $"0000 00FF 00F6 F6F6 B334 0000 0000 0000" /* ...ù.ñññÑ4...... */ $"0000 0000 34B3 89B3 F6F6 F8FF 0000 0000" /* ....4Ñ’ÑññØù.... */ $"0000 00FF 00F6 F634 8900 0000 0001 0000" /* ...ù.ññ4’....... */ $"0000 0000 0089 3489 B3F6 F8FF 0000 0000" /* .....’4’ÑñØù.... */ $"0000 00FF 00F6 F689 0000 0000 F701 F500" /* ...ù.ññ’....ó.û. */ $"0000 0000 0000 8989 B3F6 F8FF 0000 0000" /* ......’’ÑñØù.... */ $"0000 00FF 00F6 F6B3 0000 0000 00F7 0000" /* ...ù.ññÑ.....ó.. */ $"0000 0000 0000 B389 B3F6 F8FF 0000 0000" /* ......Ñ’ÑñØù.... */ $"0000 00FF 00F6 F689 0000 0000 0000 0000" /* ...ù.ññ’........ */ $"0001 0000 0000 8989 B3F6 F8FF 0000 0000" /* ......’’ÑñØù.... */ $"0000 00FF 00F6 F6B3 0000 0000 0101 0000" /* ...ù.ññÑ........ */ $"F701 0101 0000 B389 B3F6 F8FF 0000 0000" /* ó.....Ñ’ÑñØù.... */ $"0000 00FF 00F6 F6B3 0000 0101 01F5 0000" /* ...ù.ññÑ.....û.. */ $"00F7 01F5 0000 B389 B3F6 F8FF 0000 0000" /* .ó.û..Ñ’ÑñØù.... */ $"0000 00FF 00F6 F689 0000 01F5 0100 0000" /* ...ù.ññ’...û.... */ $"00F5 F5F5 0000 8989 B3F6 F8FF 0000 0000" /* .ûûû..’’ÑñØù.... */ $"0000 00FF 00F6 F6B3 0000 F7F7 0000 0000" /* ...ù.ññÑ..óó.... */ $"0000 0000 0000 B389 B3F6 F8FF 0000 0000" /* ......Ñ’ÑñØù.... */ $"0000 00FF 00F6 F634 8900 0000 0000 0000" /* ...ù.ññ4’....... */ $"0000 0000 0089 5FB3 34F6 F8FF 0000 0000" /* .....’_Ñ4ñØù.... */ $"0000 00FF 00F6 F6F6 34B3 89B3 B3B3 B3B3" /* ...ù.ñññ4Ñ’ÑÑÑÑÑ */ $"B389 B3B3 8934 34F6 F6F6 F8FF 0000 0000" /* Ñ’ÑÑ’44ñññØù.... */ $"0000 00FF 00F6 F6F6 F6F6 F6F6 F6F6 F6F6" /* ...ù.ñññññññññññ */ $"F6F6 F6F6 F6F6 F6F6 F6F6 F8FF 0000 0000" /* ññññññññññØù.... */ $"0000 00FF F8F8 F8F8 F8F8 F8F8 F8F8 F8F8" /* ...ùØØØØØØØØØØØØ */ $"F8F8 F8F8 F8F8 F8F8 F8F8 F8FF 0000 0000" /* ØØØØØØØØØØØù.... */ $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ...ùùùùùùùùùùùùù */ $"FFFF FFFF FFFF FFFF FFFF FFFF 0000 0000" /* ùùùùùùùùùùùù.... */ }; data 'ics8' (ITK_APP_RESOURCES + 1, "Itk Doc", purgeable) { $"00FF FFFF FFFF FFFF FFFF FFFF 0000 0000" /* ..... */ $"00FF F6F6 F6F6 F6F6 F6F6 FFFF FF00 0000" /* .––––––––... */ $"00FF F6F6 F6F6 F6F6 F6F6 FFF8 FFFF 0000" /* .––––––––¯.. */ $"00FF F6F6 F6F6 F6F6 F6F6 FFFF FFFF 0000" /* .––––––––.. */ $"00FF F6F6 F6B3 B3F6 B3B3 B3F6 F6FF 0000" /* .–––„„–„„„––.. */ $"00FF F6F6 89B3 B3B3 B3B3 B3B3 F6FF 0000" /* .––â„„„„„„„–.. */ $"00FF F689 0000 F534 0000 00B3 B3FF 0000" /* .–â..ž4...„„.. */ $"00FF F6B3 00F7 01F7 0101 0034 B3FF 0000" /* .–„.—.—...4„.. */ $"00FF F6F6 8900 0000 F7F7 89B3 F6FF 0000" /* .––â...——â„–.. */ $"00FF F6F6 B300 0100 0000 F7B3 F6FF 0000" /* .––„.....—„–.. */ $"00FF F6F6 B300 F7F5 0000 00B3 F6FF 0000" /* .––„.—ž...„–.. */ $"00FF F6F6 B300 0100 F701 00B3 F6FF 0000" /* .––„...—..„–.. */ $"00FF F6F6 B3F5 F500 F7F5 00B3 F6FF 0000" /* .––„žž.—ž.„–.. */ $"00FF F6F6 B3B3 B3B3 B3B3 B3B3 F6FF 0000" /* .––„„„„„„„„–.. */ $"00FF F6F6 F6F6 F6F6 F6F6 F6F6 F6FF 0000" /* .–––––––––––.. */ $"00FF FFFF FFFF FFFF FFFF FFFF FFFF 0000" /* ... */ }; data 'ICN#' (ITK_APP_RESOURCES + 1, "Itk Doc", purgeable) { $"1FFF FC00 1000 0600 1000 0500 1000 0480" /* .ù½............Ÿ */ $"1000 0440 1000 0420 1000 07F0 1000 0010" /* ...@... ...ï.... */ $"107C FC10 10FF FF10 117F FF90 1083 0790" /* .|½..ùù...ùÍ.Š.Í */ $"1300 03D0 1200 01D0 1200 01D0 1200 01D0" /* ...‚...‚...‚...‚ */ $"1100 0390 1080 0710 1080 0710 1080 0590" /* ...Í.Ÿ...Ÿ...Ÿ.Í */ $"1100 0390 1100 0390 1100 0390 1100 0390" /* ...Í...Í...Í...Í */ $"1100 0390 1100 0390 1100 0390 1080 0710" /* ...Í...Í...Í.Ÿ.. */ $"107F F810 1000 0010 1000 0010 1FFF FFF0" /* ..Ø..........ùùï */ $"1FFF FC00 1FFF FE00 1FFF FF00 1FFF FF80" /* .ù½..ùú..ùù..ùùŸ */ $"1FFF FFC0 1FFF FFE0 1FFF FFF0 1FFF FFF0" /* .ùùø.ùù›.ùùï.ùùï */ $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" /* .ùùï.ùùï.ùùï.ùùï */ $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" /* .ùùï.ùùï.ùùï.ùùï */ $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" /* .ùùï.ùùï.ùùï.ùùï */ $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" /* .ùùï.ùùï.ùùï.ùùï */ $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" /* .ùùï.ùùï.ùùï.ùùï */ $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" /* .ùùï.ùùï.ùùï.ùùï */ }; data 'ics#' (ITK_APP_RESOURCES + 1, "Itk Doc", purgeable) { $"7FF0 4038 402C 403C 46E4 4FF4 5014 5014" /* .ï@8@,@. */ $"80F0 3801 8000 0001 FFFF FFFF 0000 0000" /* Ä•8.Ä....... */ $"0007 E000 001F F800 007F FF00 03FF FFE0" /* ..ý...¯.....ý */ $"0FFF FFF8 3FFF FFFE 7FFF FFFF FFFF FFFF" /* .¯?œ. */ $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* */ $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* */ $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* */ $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* */ $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* */ $"FFFF FFFF FFFF FFFF FFFF FFFF 0000 0000" /* .... */ }; data 'ics#' (ITK_APP_RESOURCES, "Itk App", purgeable) { $"07E0 1C3C 6007 8001 8001 80E1 8131 8101" /* .ý.<`.Ä.Ä.Ä·Å1Å. */ $"8101 8181 8101 8129 8919 9E71 8C61 FFFF" /* Å.ÅÅÅ.Å)â.ûqåa */ $"07E0 1FFC 7FFF FFFF FFFF FFFF FFFF FFFF" /* .ý.¸. */ $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* */ }; data 'ics8' (ITK_APP_RESOURCES, "Itk App", purgeable) { $"0000 0000 00FF FFFF FFFF FF00 0000 0000" /* .......... */ $"0000 00FF FFFF 05E2 E205 FFFF FFFF 0000" /* ....’’... */ $"00FF FF05 05E2 E2E2 E2E2 E205 05FF FFFF" /* ...’’’’’’.. */ $"FF05 05E2 E2E2 E2E2 E2E2 E2E2 E2E2 05FF" /* ..’’’’’’’’’’’. */ $"FF05 0505 0505 0505 0505 0505 0505 05FF" /* .............. */ $"FFE2 E205 E2E2 E205 1D1D 1D05 E2E2 E2FF" /* ’’.’’’.....’’’ */ $"FFE2 E205 E2E2 E205 1DE2 1D05 E2E2 E2FF" /* ’’.’’’..’..’’’ */ $"FFE2 E205 E2E2 E21D E2E2 E205 E2E2 E2FF" /* ’’.’’’.’’’.’’’ */ $"FFE2 E205 E2E2 E21D E2E2 E205 E2E2 E2FF" /* ’’.’’’.’’’.’’’ */ $"FFE2 E205 E2E2 1D1D 1DE2 E205 E2E2 E2FF" /* ’’.’’...’’.’’’ */ $"FFE2 E205 E2E2 E21D E2E2 1D05 1DE2 E2FF" /* ’’.’’’.’’...’’ */ $"FFE2 E205 E2E2 E21D E2E2 1D05 1DE2 E2FF" /* ’’.’’’.’’...’’ */ $"FFE2 E205 05E2 1D05 E2E2 1D05 1DE2 E2FF" /* ’’..’..’’...’’ */ $"FF05 0505 1D1D 1D05 0505 051D 0505 05FF" /* .............. */ $"FF05 0505 1D1D 0505 0505 1D05 0505 05FF" /* .............. */ $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* */ }; data 'icl8' (ITK_APP_RESOURCES, "Itk App", purgeable) { $"0000 0000 0000 0000 0000 0000 00FF FFFF" /* ............. */ $"FFFF FF00 0000 0000 0000 0000 0000 0000" /* ............. */ $"0000 0000 0000 0000 0000 00FF FF05 0505" /* .............. */ $"0505 05FF FF00 0000 0000 0000 0000 0000" /* .............. */ $"0000 0000 0000 0000 00FF FF05 0505 0505" /* .............. */ $"0505 0505 05FF FFFF 0000 0000 0000 0000" /* ............. */ $"0000 0000 0000 FFFF FF05 0505 0505 E2E2" /* ...........’’ */ $"E205 0505 0505 0505 FFFF FF00 0000 0000" /* ’............ */ $"0000 0000 FFFF 0505 0505 0505 E2E2 E2E2" /* ..........’’’’ */ $"E2E2 E205 0505 0505 0505 05FF FF00 0000" /* ’’’........... */ $"0000 FFFF 0505 0505 0505 E2E2 E2E2 E2E2" /* ........’’’’’’ */ $"E2E2 E2E2 E2E2 0505 0505 0505 05FF FF00" /* ’’’’’’........ */ $"00FF 0505 0505 0505 E2E2 E2E2 E2E2 E2E2" /* .......’’’’’’’’ */ $"E2E2 E2E2 E2E2 E2E2 0505 0505 0505 05FF" /* ’’’’’’’’....... */ $"FF05 0505 0505 E2E2 E2E2 E2E2 E2E2 E2E2" /* .....’’’’’’’’’’ */ $"E2E2 E2E2 E2E2 E2E2 E2E2 E205 0505 05FF" /* ’’’’’’’’’’’.... */ $"FF05 0505 0505 0505 0505 0505 0505 0505" /* ............... */ $"0505 0505 0505 0505 0505 0505 0505 05FF" /* ............... */ $"FF05 0505 0505 0505 0505 0505 0505 0505" /* ............... */ $"0505 0505 0505 0505 0505 0505 0505 05FF" /* ............... */ $"FF05 0505 0505 0505 0505 0505 0505 0505" /* ............... */ $"0505 0505 0505 0505 0505 0505 0505 05FF" /* ............... */ $"FF05 E2E2 E205 0505 E2E2 E2E2 E205 0505" /* .’’’...’’’’’... */ $"1D1D 1D1D 1D1D 0505 05E2 E2E2 E2E2 05FF" /* .........’’’’’. */ $"FF05 E2E2 E205 0505 E2E2 E2E2 E205 051D" /* .’’’...’’’’’... */ $"1DE2 E2E2 1D1D 1D1D 05E2 E2E2 E2E2 05FF" /* .’’’.....’’’’’. */ $"FF05 E2E2 E205 0505 E2E2 E2E2 E205 1D1D" /* .’’’...’’’’’... */ $"05E2 E2E2 1D1D 0505 05E2 E2E2 E2E2 05FF" /* .’’’.....’’’’’. */ $"FF05 E2E2 E205 0505 E2E2 E2E2 E205 1D1D" /* .’’’...’’’’’... */ $"05E2 E21D 1DE2 0505 05E2 E2E2 E2E2 05FF" /* .’’..’...’’’’’. */ $"FF05 E2E2 E205 0505 E2E2 E2E2 E205 1D1D" /* .’’’...’’’’’... */ $"05E2 E21D 1DE2 0505 05E2 E2E2 E2E2 05FF" /* .’’..’...’’’’’. */ $"FF05 E2E2 E205 0505 E2E2 E2E2 E205 051D" /* .’’’...’’’’’... */ $"1DE2 1D1D E2E2 0505 05E2 E2E2 E2E2 05FF" /* .’..’’...’’’’’. */ $"FF05 E2E2 E205 0505 E2E2 E2E2 E205 0505" /* .’’’...’’’’’... */ $"051D 1DE2 E2E2 0505 05E2 E2E2 E2E2 05FF" /* ...’’’...’’’’’. */ $"FF05 E2E2 E205 0505 E2E2 E2E2 E205 0505" /* .’’’...’’’’’... */ $"051D 1DE2 E2E2 0505 05E2 E2E2 E2E2 05FF" /* ...’’’...’’’’’. */ $"FF05 E2E2 E205 0505 E2E2 E2E2 E205 1D1D" /* .’’’...’’’’’... */ $"1D1D 1D1D E2E2 0505 05E2 E2E2 E2E2 05FF" /* ....’’...’’’’’. */ $"FF05 E2E2 E205 0505 E2E2 E2E2 E205 0505" /* .’’’...’’’’’... */ $"1D1D E2E2 E2E2 0505 05E2 E2E2 E2E2 05FF" /* ..’’’’...’’’’’. */ $"FF05 E2E2 E205 0505 E2E2 E2E2 E205 051D" /* .’’’...’’’’’... */ $"1DE2 E2E2 1D1D 0505 1D1D E2E2 E2E2 05FF" /* .’’’......’’’’. */ $"FF05 E2E2 E205 0505 E2E2 E2E2 E205 051D" /* .’’’...’’’’’... */ $"1DE2 E2E2 1D1D 0505 1D1D E2E2 E2E2 05FF" /* .’’’......’’’’. */ $"FF05 E2E2 E205 0505 E21D 1D1D E205 1D1D" /* .’’’...’...’... */ $"05E2 E21D 1D1D 0505 1D1D E2E2 E2E2 05FF" /* .’’.......’’’’. */ $"FF05 E2E2 E205 0505 1D1D E2E2 E21D 1D05" /* .’’’.....’’’... */ $"05E2 1D1D 1DE2 051D 1D1D 1D1D E2E2 05FF" /* .’...’......’’. */ $"FF05 E2E2 E205 0505 1D1D E2E2 E21D 1D05" /* .’’’.....’’’... */ $"05E2 E21D 1DE2 051D 1D1D 1DE2 E2E2 05FF" /* .’’..’.....’’’. */ $"FF05 0505 0505 051D 1D05 0505 1D1D 0505" /* ............... */ $"0505 1D1D 0505 1D1D 0505 0505 0505 05FF" /* ............... */ $"FF05 0505 0505 051D 1D05 051D 1D05 0505" /* ............... */ $"0505 1D1D 1D1D 1D05 0505 0505 0505 05FF" /* ............... */ $"FF05 0505 0505 0505 1D1D 1D1D 0505 0505" /* ............... */ $"0505 1D1D 1D05 0505 0505 0505 0505 05FF" /* ............... */ $"FF05 0505 0505 0505 0505 0505 0505 0505" /* ............... */ $"0505 0505 0505 0505 0505 0505 0505 05FF" /* ............... */ $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* */ $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ }; /* * The following resource define the icon used for FITS files. Any * FITS file with the creator of fvEd will get this icon. */ data 'icl8' (ITK_APP_RESOURCES+2, "FITS File", purgeable) { $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ... */ $"FFFF FFFF FFFF 0000 0000 0000 0000 0000" /* .......... */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 00FF FF00 0000 0000 0000 0000" /* .............. */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 00FF 00FF 0000 0000 0000 0000" /* .............. */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 00FF 0000 FF00 0000 0000 0000" /* .............. */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 00FF 0000 00FF 0000 0000 0000" /* .............. */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 00FF 0000 0000 FF00 0000 0000" /* .............. */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 00FF FFFF FFFF FFFF 0000 0000" /* ......... */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 0000 0000 0000 00FF 0000 0000" /* ............... */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 0000 0000 0000 00FF 0000 0000" /* ............... */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 0000 0000 0000 00FF 0000 0000" /* ............... */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 0000 0000 0000 00FF 0000 0000" /* ............... */ $"0000 00FF 00D8 D8D8 D8D8 D800 D8D8 D800" /* ....ÿÿÿÿÿÿ.ÿÿÿ. */ $"D8D8 D8D8 D800 D8D8 D800 00FF 0000 0000" /* ÿÿÿÿÿ.ÿÿÿ...... */ $"0000 00FF 00D8 0000 0000 0000 00D8 0000" /* ....ÿ.......ÿ.. */ $"0000 D800 00D8 0000 00D8 00FF 0000 0000" /* ..ÿ..ÿ...ÿ..... */ $"0000 00FF 00D8 0000 0000 0000 00D8 0000" /* ....ÿ.......ÿ.. */ $"0000 D800 00D8 0000 0000 00FF 0000 0000" /* ..ÿ..ÿ......... */ $"0000 00FF 00D8 0000 0000 0000 00D8 0000" /* ....ÿ.......ÿ.. */ $"0000 D800 00D8 0000 0000 00FF 0000 0000" /* ..ÿ..ÿ......... */ $"0000 00FF 00D8 0000 0000 0000 00D8 0000" /* ....ÿ.......ÿ.. */ $"0000 D800 00D8 0000 0000 00FF 0000 0000" /* ..ÿ..ÿ......... */ $"0000 00FF 00D8 D8D8 D800 0000 00D8 0000" /* ....ÿÿÿÿ....ÿ.. */ $"0000 D800 00D8 0000 0000 00FF 0000 0000" /* ..ÿ..ÿ......... */ $"0000 00FF 00D8 0000 0000 0000 00D8 0000" /* ....ÿ.......ÿ.. */ $"0000 D800 0000 D8D8 D800 00FF 0000 0000" /* ..ÿ...ÿÿÿ...... */ $"0000 00FF 00D8 0000 0000 0000 00D8 0000" /* ....ÿ.......ÿ.. */ $"0000 D800 0000 0000 00D8 00FF 0000 0000" /* ..ÿ......ÿ..... */ $"0000 00FF 00D8 0000 0000 0000 00D8 0000" /* ....ÿ.......ÿ.. */ $"0000 D800 0000 0000 00D8 00FF 0000 0000" /* ..ÿ......ÿ..... */ $"0000 00FF 00D8 0000 0000 0000 00D8 0000" /* ....ÿ.......ÿ.. */ $"0000 D800 0000 0000 00D8 00FF 0000 0000" /* ..ÿ......ÿ..... */ $"0000 00FF 00D8 0000 0000 0000 00D8 0000" /* ....ÿ.......ÿ.. */ $"0000 D800 0000 0000 00D8 00FF 0000 0000" /* ..ÿ......ÿ..... */ $"0000 00FF 00D8 0000 0000 0000 00D8 0000" /* ....ÿ.......ÿ.. */ $"0000 D800 00D8 0000 00D8 00FF 0000 0000" /* ..ÿ..ÿ...ÿ..... */ $"0000 00FF 00D8 0000 0000 0000 D8D8 D800" /* ....ÿ......ÿÿÿ. */ $"0000 D800 0000 D8D8 D800 00FF 0000 0000" /* ..ÿ...ÿÿÿ...... */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 0000 0000 0000 00FF 0000 0000" /* ............... */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 0000 0000 0000 00FF 0000 0000" /* ............... */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 0000 0000 0000 00FF 0000 0000" /* ............... */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 0000 0000 0000 00FF 0000 0000" /* ............... */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 0000 0000 0000 00FF 0000 0000" /* ............... */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 0000 0000 0000 00FF 0000 0000" /* ............... */ $"0000 00FF 0000 0000 0000 0000 0000 0000" /* ............... */ $"0000 0000 0000 0000 0000 00FF 0000 0000" /* ............... */ $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ... */ $"FFFF FFFF FFFF FFFF FFFF FFFF 0000 0000" /* .... */ }; data 'ics8' (ITK_APP_RESOURCES+2, "FITS File", purgeable) { $"00FF FFFF FFFF FFFF FFFF FFFF 0000 0000" /* ..... */ $"00FF 0000 0000 0000 0000 FFFF FF00 0000" /* ............ */ $"00FF 0000 0000 0000 0000 FF00 FFFF 0000" /* ............ */ $"00FF 0000 0000 0000 0000 FFFF FFFF 0000" /* ........... */ $"00FF 0000 0000 0000 0000 0000 00FF 0000" /* .............. */ $"00FF D8D8 D800 D8D8 D8D8 00D8 00FF 0000" /* .ÿÿÿ.ÿÿÿÿ.ÿ... */ $"00FF D800 0000 D800 D800 D800 D8FF 0000" /* .ÿ...ÿ.ÿ.ÿ.ÿ.. */ $"00FF D800 0000 D800 D800 D800 00FF 0000" /* .ÿ...ÿ.ÿ.ÿ.... */ $"00FF D8D8 D800 D800 D800 00D8 00FF 0000" /* .ÿÿÿ.ÿ.ÿ..ÿ... */ $"00FF D800 0000 D800 D800 0000 D8FF 0000" /* .ÿ...ÿ.ÿ...ÿ.. */ $"00FF D800 0000 D800 D800 D800 D8FF 0000" /* .ÿ...ÿ.ÿ.ÿ.ÿ.. */ $"00FF D800 0000 D800 D800 00D8 00FF 0000" /* .ÿ...ÿ.ÿ..ÿ... */ $"00FF 0000 0000 0000 0000 0000 00FF 0000" /* .............. */ $"00FF 0000 0000 0000 0000 0000 00FF 0000" /* .............. */ $"00FF 0000 0000 0000 0000 0000 00FF 0000" /* .............. */ $"00FF FFFF FFFF FFFF FFFF FFFF FFFF 0000" /* ... */ }; data 'ICN#' (ITK_APP_RESOURCES+2, "FITS File", purgeable) { $"1FFF FC00 1000 0600 1000 0500 1000 0480" /* .¸............Ä */ $"1000 0440 1000 0420 1000 07F0 1000 0010" /* ...@... ...•.... */ $"1000 0010 1000 0010 1000 0010 17EE FB90" /* .............Óšê */ $"1404 2450 1404 2410 1404 2410 1404 2410" /* ..$P..$...$...$. */ $"1784 2410 1404 2390 1404 2050 1404 2050" /* .Ñ$...#ê.. P.. P */ $"1404 2050 1404 2050 1404 2450 140E 2390" /* .. P.. P..$P..#ê */ $"1000 0010 1000 0010 1000 0010 1000 0010" /* ................ */ $"1000 0010 1000 0010 1000 0010 1FFF FFF0" /* .............• */ $"1FFF FC00 1FFF FE00 1FFF FF00 1FFF FF80" /* .ù½..ùú..ùù..ùùŸ */ $"1FFF FFC0 1FFF FFE0 1FFF FFF0 1FFF FFF0" /* .ùùø.ùù›.ùùï.ùùï */ $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" /* .ùùï.ùùï.ùùï.ùùï */ $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" /* .ùùï.ùùï.ùùï.ùùï */ $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" /* .ùùï.ùùï.ùùï.ùùï */ $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" /* .ùùï.ùùï.ùùï.ùùï */ $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" /* .ùùï.ùùï.ùùï.ùùï */ $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" /* .ùùï.ùùï.ùùï.ùùï */ }; data 'ics#' (ITK_APP_RESOURCES+2, "FITS File", purgeable) { $"7FF0 4038 402C 403C 4004 7FFC 626C 6264" /* .•@8@,@<@..¸blbd */ $"7A7C 624C 624C 637C 4004 4004 4004 7FFC" /* z|bLbLc|@.@.@..¸ */ $"7FF0 7FF8 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC" /* .•.¯.¸.¸.¸.¸.¸.¸ */ $"7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC" /* .¸.¸.¸.¸.¸.¸.¸.¸ */ }; /* * The following resource is used when creating the 'env' variable in * the Macintosh environment. The creation mechanisim looks for the * 'STR#' resource named "Tcl Environment Variables" rather than a * specific resource number. (In other words, feel free to change the * resource id if it conflicts with your application.) Each string in * the resource must be of the form "KEYWORD=SOME STRING". See Tcl * documentation for futher information about the env variable. */ /* A good example of something you may want to set is: * "TCL_LIBRARY=My disk:etc." */ resource 'STR#' (128, "Tcl Environment Variables") { { "SCHEDULE_NAME=Agent Controller Schedule", "SCHEDULE_PATH=Lozoya:System Folder:Tcl Lib:Tcl-Scheduler" }; }; /* * The following resources defines the Apple Events that Tk can be * sent from Apple Script. */ resource 'aete' (0, "Wish Suite") { 0x01, 0x00, english, roman, { "Required Suite", "Events that every application should support", 'reqd', 1, 1, {}, {}, {}, {}, "Wish Suite", "Events for the Wish application", 'WIsH', 1, 1, { "do script", "Execute a Tcl script", 'misc', 'dosc', 'TEXT', "Result", replyOptional, singleItem, notEnumerated, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, 'TEXT', "Script to execute", directParamRequired, singleItem, notEnumerated, changesState, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, {}, }, {}, {}, {}, } }; /* * The following two resources define the default "About Box" for Mac Tk. * This dialog appears if the "About Tk..." menu item is selected from * the Apple menu. This dialog may be overridden by defining a Tcl procedure * with the name of "tkAboutDialog". If this procedure is defined the * default dialog will not be shown and the Tcl procedure is expected to * create and manage an About Dialog box. */ data 'DLOG' (128, "Default About Box", purgeable) { $"002E 0026 011B 01E0 0001 0100 0100 0000" $"0000 0081 00" }; resource 'DITL' (129, "About Box", purgeable) { { {198, 278, 220, 362}, Button {enabled, "Ok"}, { 21, 205, 181, 442}, StaticText {disabled, "ItkWish" ITCL_PATCH_LEVEL " - an Object-Oriented Wish" "\n\n" "Michael McLennan" "\n" "Jim Ingham" "\n" "Lee Bernhard" "\n\n" "©Lucent Technologies, Inc. 1993-1998" "\n\n" "For more Info, see:" "\n" "http://www.tcltk.com/itcl"}, { 37, 22, 204, 182}, Picture {enabled, 128} } }; data 'PICT' (128) { $"46B2 0000 0000 00A7 00A0 0011 02FF 0C00" $"FFFE 0000 0048 0000 0048 0000 0000 0000" $"00A7 00A0 0000 0000 001E 0001 000A 0000" $"0000 00A7 00A0 0099 80A0 0000 0000 00A7" $"00A0 0000 0000 0000 0000 0048 0000 0048" $"0000 0000 0008 0001 0008 0000 0000 0157" $"9668 0000 0000 0000 8746 8000 00FF 0004" $"F800 FC00 F800 0066 F800 F800 F800 015D" $"F000 F400 F000 0000 F000 F000 F000 0000" $"E800 EC00 E800 01C1 E800 E800 E800 0000" $"E000 E400 E000 011E E000 E000 E000 01C3" $"D800 DC00 D800 0000 D800 D800 D800 0000" $"D000 D400 D000 0000 D000 D000 D000 0000" $"C800 C800 C800 0000 C000 C400 C000 0000" $"C000 C000 C000 0000 B800 BC00 B800 0000" $"B800 B800 B800 0000 B000 B400 B000 0000" $"B000 B000 B000 0000 A800 AC00 A800 0000" $"A800 A800 A800 0000 A000 A400 A000 0000" $"A000 A000 9800 0000 A000 A000 A000 0000" $"9800 9C00 9800 0000 9800 9800 9800 0000" $"9000 9400 9000 0000 8800 8C00 8800 0000" $"8800 8800 8800 0000 8800 8400 8000 0000" $"8800 A000 5800 0000 8000 8400 8000 0000" $"8000 9C00 5800 0000 7800 8C00 6000 0000" $"7800 7C00 7800 0000 7800 7800 7800 0000" $"7000 8000 6000 0000 7000 7400 7000 0000" $"7000 7000 6800 0000 7000 7800 5800 0000" $"6800 6C00 6800 0000 6800 6800 6800 0000" $"6000 6400 6000 0000 6000 6C00 5000 0000" $"6000 6000 6000 0000 5800 6400 5000 0000" $"5800 5C00 5800 0000 5800 5800 5800 0000" $"5000 5400 5000 0000 5000 9800 4000 0000" $"5000 5400 4800 0000 5000 A800 4000 0000" $"5000 5000 5000 0000 5000 8800 4000 0000" $"5000 B400 3800 0000 4800 7C00 4000 0000" $"4800 4C00 4800 0000 4800 4800 4800 0000" $"4800 C000 3000 0000 4800 6C00 4000 0000" $"4000 4800 4000 0000 4000 4400 4000 0000" $"4000 4000 4000 0000 4000 9000 3800 0000" $"4000 CC00 2800 0000 4000 8400 3800 0000" $"4000 9800 3000 0000 4000 7400 3800 0000" $"4000 5C00 3800 0000 3800 8000 3800 0000" $"3800 3C00 3800 0000 3800 3800 3800 0000" $"3800 6400 3800 0000 3800 A800 3000 0000" $"3800 3800 3000 0000 3800 5000 3000 0000" $"3800 C400 2800 0000 3000 D800 2000 0000" $"3000 4800 3000 0000 3000 3400 3000 0000" $"3000 BC00 2800 0000 3000 3000 3000 0000" $"3000 4400 3000 0000 2800 2C00 2800 0000" $"2800 3800 2800 0000 2800 E400 1800 0000" $"2800 A800 2000 0000 2800 2800 2800 0000" $"2800 CC00 2000 0000 2800 AC00 2000 4D61" $"2800 7000 2000 015D 2800 3800 2000 0001" $"2000 2C00 2000 015D 2000 D400 1800 0000" $"2000 B000 2000 015A 2000 9C00 1800 015A" $"2000 2400 2000 0000 2000 2000 2000 0003" $"2000 D800 1800 0066 2000 4C00 1800 025B" $"2000 B800 1800 0000 2000 A800 1800 0010" $"2000 8C00 2000 015D 2000 B400 1800 0000" $"1800 EC00 1000 0000 1800 E800 1000 015D" $"1800 C000 1800 0000 1800 3800 1800 0000" $"1800 1C00 1800 0000 1800 DC00 1800 0000" $"1800 8C00 1800 7400 1800 7400 1800 0159" $"1800 E000 1000 0000 1800 2C00 1000 0003" $"1800 1800 1800 0066 1800 CC00 1000 015D" $"1800 E400 1000 0004 1000 EC00 1000 0066" $"1000 F000 0800 015D 1000 E400 1000 0000" $"1000 9000 1000 0000 1000 2400 1000 01C1" $"1000 EC00 0800 0000 1000 3400 1000 011E" $"1000 E800 0800 01C3 1000 E000 1000 0000" $"1000 4C00 1000 0000 1000 2000 1000 0000" $"1000 1000 1000 0000 1000 5C00 1000 0000" $"1000 5800 1000 0000 1000 1000 0800 0000" $"1000 6400 1000 0000 0800 F400 0000 0000" $"0800 7000 0800 0000 0800 1400 0800 0000" $"0800 F400 0800 0000 0800 8000 0800 0000" $"0800 8800 0800 0000 0800 EC00 0800 0000" $"0800 0800 0800 0000 0000 F400 0000 0000" $"0000 FC00 0000 0000 0000 F800 0000 0000" $"0000 0400 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 5845" $"0000 0000 0000 015C 0000 0000 0000 0001" $"0000 0000 0000 015D 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0D09" $"0000 0000 0000 0000 0000 0000 0000 055E" $"0000 0000 0000 0106 0000 0000 0000 0054" $"0000 0000 0000 013B 0000 0000 0000 20F9" $"0000 0000 0000 005C 0000 0000 0000 0002" $"0000 0000 0000 20FC 0000 0000 0000 0064" $"0000 0000 0000 00E5 0000 0000 0000 015D" $"0000 0000 0000 0000 0000 0000 0000 067E" $"0000 0000 0000 0159 0000 0000 0000 0000" $"0000 0000 0000 0003 0000 0000 0000 0066" $"0000 0000 0000 015D 0000 0000 0000 0004" $"0000 0000 0000 0066 0000 0000 0000 015D" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 015D 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 5400" $"0000 0000 0000 6F64 0000 0000 0000 6573" $"0000 0000 0000 4B65 0000 0000 0000 0000" $"0000 0000 0000 5074 0000 0000 0000 4572" $"0000 0000 0000 646C 0000 0000 0000 6972" $"0000 0000 0000 6573 0000 0000 0000 7374" $"0000 0000 0000 7400 0000 0000 0000 7200" $"0000 0000 0000 7243 0000 0000 0000 6572" $"0000 0000 0000 6300 0000 0000 0000 6E74" $"0000 0000 0000 3064 0000 0000 0000 6F75" $"0000 0000 0000 6F6D 0000 0000 0000 0002" $"0000 0000 0000 6E64 0000 0000 0000 636F" $"0000 0000 0000 6572 0000 0000 0000 6567" $"0000 0000 0000 726F 0000 0000 0000 0720" $"0000 0000 0000 6550 0000 0000 0000 7900" $"0000 0000 0000 6374 0000 0000 0000 6F50" $"0000 0000 0000 6B53 0000 0000 0000 6F6E" $"0000 0000 0000 E86D 0000 0000 0000 6541" $"0000 0000 0000 696E 0000 0000 0000 0003" $"0000 0000 0000 7473 0000 0000 0000 1E74" $"0000 0000 0000 6D70 0000 0000 0000 D274" $"0000 0000 0000 6D00 0000 0000 0000 6F75" $"0000 0000 0000 4174 0000 0000 0000 7070" $"0000 0000 0000 6F6E 0000 0000 0000 CD77" $"0000 0000 0000 746F 0000 0000 0000 0000" $"0000 00A7 00A0 0000 0000 00A7 00A0 0000" $"000A 0000 0000 00A7 00A0 0481 00E1 0004" $"8100 E100 A27F 0000 0100 0100 0100 0100" $"0100 0100 0100 0100 0100 0100 0100 0100" $"0100 0100 0100 0100 0100 0100 0100 0100" $"0100 0100 0100 0100 0100 0100 0100 0100" $"0100 0100 0100 0100 0100 0100 0100 0100" $"0100 0100 0100 0100 0100 0100 0100 0100" $"0100 0100 0100 0100 0100 0100 0100 0100" $"0100 0100 0100 0100 0100 0100 0100 0100" $"0100 0100 0100 1F01 0001 0001 0001 0001" $"0001 0001 0001 0001 0001 0001 0001 0001" $"0001 0001 0001 009F FE00 7F01 0001 0001" $"0C22 2022 2022 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2018 2220 2220" $"2220 2220 2220 2220 2220 2220 2220 2220" $"2208 0001 01FD 0014 0200 0001 FC00 0020" $"818E F28E 0408 0606 0101 FE00 15FD 0000" $"01FE 0000 2281 8EF2 8E07 0C0A 0805 0101" $"0000 1708 0000 0100 0001 0002 2081 8EF2" $"8E07 1411 0C0A 0501 0100 16FE 0000 01FE" $"0001 0222 818E F28E 071F 1912 0C05 0401" $"0017 0800 0001 0001 0000 0220 818E F28E" $"0728 1F19 0F08 0501 0014 FC00 0301 0002" $"2281 8EF2 8E07 2F23 1B11 0905 0100 1708" $"0000 0100 0100 0002 2081 8EF2 8E07 2F28" $"1B11 0A05 0100 27FE 0000 01FE 0001 0222" $"C58E 0F5D 6578 6F5A 5254 5254 524E 5A78" $"7867 77BE 8E07 3828 1F12 0A05 0100 2B08" $"0000 0100 0001 0002 20C8 8E01 584B FD6C" $"0172 72FB 6C08 726C 726C 7260 4549 6DC2" $"8E07 3828 1C12 0A05 0100 26FD 0004 0100" $"0002 22CA 8E03 5060 6C6C F172 086C 726C" $"726C 7253 4449 C68E 0738 281C 120A 0501" $"0042 0200 0001 FD00 0102 20D3 8E21 5D78" $"5A4B 7868 6A66 6072 6C72 6C72 6C6C 3E22" $"1912 1213 141B 2547 726C 7272 6C72 6C72" $"FE6C 0572 6C54 6F65 77CB 8E07 3828 1C12" $"0A05 0100 3AFE 0005 0100 0100 0222 D58E" $"0250 5472 FC6C FC72 046C 726C 6C0C F700" $"0708 236C 6C72 6C72 6CFE 7207 6C72 6C72" $"6C72 545D CD8E 0738 281C 120A 0501 0047" $"0800 0001 0001 0000 0220 D98E 175D 6563" $"6C6C 726C 7260 3D60 6C72 726C 726C 726C" $"7272 471B 05F7 0013 081C 3872 6C72 6C72" $"6C72 6C72 6C72 6C72 6C4E 7877 D08E 0738" $"281C 120A 0501 0049 FA00 0102 22DA 8E01" $"5A72 FE6C 0E72 6C3E 0F01 0007 3E72 6C72" $"6C72 6C72 FE6C 0972 610C 0100 0100 0100" $"01FC 0011 1B72 6C72 6C72 6C72 281B 5172" $"6C72 6C72 6C41 D18E 0738 281C 120A 0501" $"0049 0800 0001 0001 0000 0220 DC8E 085D" $"536C 7272 6C6C 3E0F FC00 0301 0C51 6CFE" $"7200 6CFD 7203 6C72 2E03 F700 1201 1B6C" $"7272 6C72 6C60 0800 2351 6C72 726C 725A" $"D28E 0738 281C 120A 0501 004E FE00 0501" $"0001 0002 22DE 8E08 676F 606C 7251 2A14" $"04F8 0008 0419 386C 7272 6C72 6CFD 7208" $"4719 0300 0100 0100 01FD 0002 1051 6CFD" $"720C 6C12 0001 122E 6072 6C72 536F 75D5" $"8E07 3828 1C12 0A05 0100 5202 0000 01FD" $"0001 0220 DF8E 065A 6C72 6C72 1F01 FB00" $"0201 0001 FB00 020C 476C FE72 026C 726C" $"FE72 016C 0EFE 0002 0100 01FD 0004 012A" $"6C72 6CFE 7200 11FE 0007 0138 7272 6C6C" $"5377 D68E 0738 281C 120A 0501 0056 FD00" $"0401 0000 0222 E28E 0776 7854 6C72 6C22" $"05FB 0007 0100 0001 0001 0001 FD00 0E01" $"122E 6072 726C 726C 726C 726C 1F07 FC00" $"0001 FD00 131F 7272 6C72 6C72 2804 0000" $"0119 3E6C 6C72 724B 73D8 8E07 3828 1C12" $"0A05 0100 5608 0000 0100 0001 0002 20E2" $"8E05 4B6C 6C72 2A01 FB00 0301 0000 01FD" $"0000 01F9 001A 0138 7272 6C72 6C72 6C72" $"7246 0100 0100 0100 0001 0000 0122 7272" $"6CFE 7200 2AFD 0003 033E 7272 FE6C 0050" $"D98E 0738 281C 120A 0501 0059 FE00 0001" $"FE00 0102 22E3 8E05 4E6C 6C72 2801 FB00" $"0701 0001 0000 0100 01FE 0002 0100 01FB" $"0010 2E72 726C 726C 726C 7272 5108 0001" $"0000 01FD 0008 0123 6C72 6C72 6C6C 07FD" $"0007 0123 6C72 6C72 6C5D DA8E 0738 281C" $"120A 0501 0061 0800 0001 0001 0000 0220" $"E58E 0667 6372 6C2E 1901 FE00 0201 0001" $"FD00 0E01 0000 0100 0100 0100 0100 0001" $"0001 FE00 0C0F 2F6C 7272 6C72 6C72 726C" $"1A01 FD00 0001 FD00 0728 6C72 6C72 6C6C" $"1AFC 0007 1251 6C72 7253 7876 DC8E 0738" $"281C 120A 0501 005C FC00 0301 0002 22E7" $"8E05 6D60 7272 6C14 FC00 0901 0001 0001" $"0001 0000 01FD 0000 01FD 0002 0100 01FB" $"0006 0760 6C72 6C72 6CFE 7206 3D01 0001" $"0000 01FD 0003 6072 726C FE72 000C FC00" $"0203 2872 FE6C 0160 76DD 8E07 3828 1C12" $"0A05 0100 6708 0000 0100 0100 0002 20EC" $"8E09 4B60 6D8E 8E54 6C6C 600C FC00 0001" $"FC00 0701 0001 0000 0100 01FE 0002 0100" $"01FD 0000 01FC 0006 106C 7272 6C72 6CFE" $"7206 4703 0000 0100 01FE 000A 076C 7272" $"6C72 6C1C 0000 01FE 0006 0134 726C 726C" $"5ADD 8E07 3828 1C12 0A05 0100 66FE 0000" $"01FE 0001 0222 ED8E 0449 6C6C 495A FE6C" $"012A 0BFD 0000 01FE 0002 0100 01FD 0012" $"0100 0001 0001 0001 0001 0000 0100 0100" $"0100 01FE 000B 091F 6C72 6C72 6C72 726C" $"3803 F900 071F 726C 726C 7247 01FB 0002" $"0422 6CFE 7201 5A6D DF8E 0738 281C 120A" $"0501 006D 0800 0001 0000 0100 0220 ED8E" $"0049 FD6C 0272 5108 FD00 0E01 0000 0100" $"0100 0100 0100 0100 0001 FD00 0001 FD00" $"0201 0001 FE00 0201 0001 FD00 1E17 6C72" $"6C72 6C72 726C 6109 0000 0100 0100 0001" $"516C 7272 6C6C 2300 0001 0001 FE00 061F" $"726C 7272 6C5D E08E 0738 281C 120A 0501" $"0065 FD00 0401 0000 0222 ED8E 0149 6CFE" $"7201 380C FD00 0501 0001 0000 01FC 0007" $"0100 0100 0001 0001 FE00 0201 0001 FD00" $"0001 F800 0110 4FFE 7208 6C72 726C 3D05" $"0000 01FD 000A 0B6C 726C 7272 6C05 0000" $"01FD 0007 0119 516C 6C72 546A E18E 0738" $"281C 120A 0501 0070 0200 0001 FD00 0102" $"20ED 8E05 4372 6C6C 1B01 FE00 0001 FE00" $"0701 0001 0000 0100 01FD 0016 0100 0001" $"0001 0001 0001 0000 0100 0100 0100 0100" $"0100 01FE 0005 1072 6C72 726C FE72 0160" $"07FE 0000 01FE 0006 5172 726C 726C 12FD" $"0000 01FD 0006 0157 726C 726C 6DE2 8E07" $"3828 1C12 0A05 0100 6DFE 0005 0100 0100" $"0222 EE8E 0449 6C72 722A FB00 1001 0001" $"5146 1901 0000 0100 0100 0100 0001 FD00" $"0001 FD00 0201 0001 FE00 0401 0001 0001" $"FD00 1E01 2272 6C72 726C 726C 7247 0000" $"0100 0100 0051 6C72 726C 7212 0000 0100" $"0001 FD00 0019 FE72 016C 5AE2 8E07 3828" $"1C12 0A05 0100 6D08 0000 0100 0100 0002" $"20EF 8E05 656C 726C 7204 FD00 0901 0000" $"0100 5772 6C72 0AFD 0007 0100 0100 0001" $"0001 FE00 0201 0001 FD00 0001 FA00 0001" $"FD00 0812 6C6C 7272 6C72 7251 FB00 0301" $"5772 6CFE 7200 12FE 0000 01FE 0000 01FE" $"0006 1951 6C72 725A 76E4 8E07 3828 1C12" $"0A05 0100 73FA 0001 0222 F08E 0550 6C72" $"6C72 6CFE 0006 0100 0001 0000 01FE 7204" $"6C0C 0000 01FD 0018 0100 0001 0001 0001" $"0001 0000 0100 0100 0100 0100 0100 0100" $"01FD 001E 2572 726C 726C 6C57 0000 0100" $"0100 016C 7272 6C72 7211 0000 0100 0100" $"0100 01FE 0006 0157 6C72 7260 76E5 8E07" $"3828 1C12 0A05 0100 6E08 0000 0100 0100" $"0002 20F1 8E06 416C 726C 726C 72FD 000A" $"0100 0001 0001 7272 6C72 0BFE 0005 0100" $"0100 0001 FD00 0001 FD00 0201 0001 FE00" $"0401 0001 0001 FA00 071B 726C 726C 7272" $"51FE 000A 0100 0107 726C 7272 6C72 0CFC" $"0000 01FA 0005 1A72 726C 7278 E58E 0738" $"281C 120A 0501 0077 FE00 0501 0001 0002" $"22F2 8E11 5D6C 726C 4E6A 6C6C 0A00 0001" $"0001 0000 0101 FE72 0D6C 0C00 0001 0001" $"0001 0000 0100 01FE 0002 0100 01FD 0000" $"01FA 0010 0100 0100 0100 1072 726C 726C" $"7251 0000 01FE 001B 236C 726C 7272 6C01" $"0000 0100 0100 0001 0001 0001 0001 1F72" $"726C 6064 E68E 0738 281C 120A 0501 0073" $"0200 0001 FD00 0102 20F1 8E07 4B6C 5A8E" $"8E60 720C FC00 0801 0000 0172 726C 720C" $"FA00 2401 0000 0100 0100 0100 0100 0001" $"0001 0001 0001 0001 0001 0001 0001 0001" $"096C 7272 6C72 6C57 FD00 0201 0047 FE72" $"026C 7251 FD00 0701 0000 0100 0100 01FD" $"0001 2572 FE6C 0049 E78E 0738 281C 120A" $"0501 006F FD00 0401 0000 0222 F18E 1076" $"7877 8E8E 606C 0B00 0001 0001 0001 0001" $"FE72 0A6C 0B00 0001 0001 0001 0001 FD00" $"0001 FD00 0201 0001 FE00 0401 0001 0001" $"F900 1372 6C72 726C 722A 0000 0100 0005" $"6C72 6C72 726C 23FE 0003 0100 0001 F800" $"0005 FE72 026C 6C6A E88E 0738 281C 120A" $"0501 0074 0800 0001 0000 0100 0220 EC8E" $"0254 6C0F FE00 0001 FE00 0601 0172 726C" $"720C FE00 0201 0001 FE00 0201 0001 FE00" $"0201 0001 FD00 0001 FA00 0D01 0001 0001" $"0000 7272 6C72 726C 19FE 0020 0100 1172" $"6C72 6C72 7208 0000 0100 0001 0000 0100" $"0100 0100 0100 1972 726C 726C 5AE8 8E07" $"3828 1C12 0A05 0100 76FE 0000 01FE 0001" $"0222 EC8E 0B52 6C12 0000 0100 0001 0000" $"01FE 7204 6C0C 0000 01FD 0031 0100 0001" $"0001 0001 0001 0000 0100 0100 0100 0100" $"0100 0100 0100 0100 0001 6C72 726C 7272" $"0100 0001 0000 196C 726C 726C 6C01 FD00" $"1201 0000 0100 0100 0100 0100 0134 6C72" $"726C 7278 E88E 0738 281C 120A 0501 006B" $"0800 0001 0001 0000 0220 EC8E 1052 6C13" $"0001 0000 0100 0100 0172 726C 720B FD00" $"0401 0001 0001 FD00 0001 FD00 0201 0001" $"FE00 0401 0001 0001 F900 0672 6C72 726C" $"3801 FD00 0701 1C72 6057 473D 28FE 0000" $"01FE 0000 01F9 0007 1C6C 726C 6054 5276" $"E88E 0738 281C 120A 0501 006A FC00 0301" $"0002 22EC 8E02 5A72 17FE 0000 01FE 0001" $"0101 FE72 076C 0C00 0001 0000 01FE 0002" $"0100 01FE 0002 0100 01FD 0000 01FA 000C" $"0100 0100 0100 0572 726C 7272 12FE 0002" $"0100 00FE 01FB 0012 0100 0100 0100 0001" $"0001 0001 000C 7272 6C72 78E5 8E07 3828" $"1C12 0A05 0100 7008 0000 0100 0100 0002" $"20EC 8E10 4B6C 1900 0001 0000 0100 0001" $"7272 6C72 0CFE 0000 01FE 0028 0100 0001" $"0001 0001 0001 0000 0100 0100 0100 0100" $"0100 0100 0100 0100 000B 726C 3E2F 1201" $"0000 0100 01F8 0000 01FE 000A 0100 0001" $"0001 0001 0001 1FFE 7201 6C77 E58E 0738" $"281C 120A 0501 005F FE00 0001 FE00 0102" $"22EC 8E02 6F6C 1BFD 0004 0100 0100 01FE" $"720A 6C0B 0000 0100 0100 0100 01FD 0000" $"01FD 0002 0100 01FE 0004 0100 0100 01FB" $"0003 0101 0001 F200 0501 0001 0000 01FE" $"0000 01FB 0005 0C60 726C 545D E48E 0738" $"281C 120A 0501 0066 0800 0001 0000 0100" $"0220 EC8E 0578 721C 0000 01FD 0006 0101" $"7272 6C72 0CFC 0000 01FE 0002 0100 01FE" $"0002 0100 01FD 0000 01FA 0004 0100 0100" $"01F8 001E 0100 0100 0100 0100 0100 0001" $"0000 0100 0100 0100 0001 0001 0001 6072" $"6C6C 6DE3 8E07 3828 1C12 0A05 0100 6DFD" $"0004 0100 0002 22EC 8E02 786C 1FFE 0005" $"0100 0100 0001 FE72 236C 0C00 0001 0001" $"0000 0100 0001 0001 0001 0001 0000 0100" $"0100 0100 0100 0100 0100 0100 01FA 000C" $"0100 0100 0100 0100 0100 0100 01FE 0000" $"01FE 0008 0100 0001 0001 0001 3DFE 7200" $"66E2 8E07 3828 1C12 0A05 0100 6302 0000" $"01FD 0001 0220 EC8E 1078 6C2E 0000 0100" $"0100 0100 016C 6C72 7212 FE00 0501 0000" $"0100 01FD 0000 01FD 0002 0100 01FE 0004" $"0100 0100 01FB 0007 0100 0100 0100 0001" $"F600 0501 0001 0000 01FE 0000 01FD 0004" $"1972 726C 60E1 8E07 3828 1C12 0A05 0100" $"68FE 0005 0100 0100 0222 EC8E 0278 6C2E" $"FA00 0C01 0051 7272 6C12 0000 0100 0001" $"FE00 0201 0001 FE00 0201 0001 FD00 0001" $"FA00 0A01 0001 0001 0001 0001 0001 FE00" $"1C01 0001 0001 0001 0001 0000 0100 0001" $"0001 0001 0000 0100 002E 726C 7250 E18E" $"0738 281C 120A 0501 006C 0800 0001 0001" $"0000 0220 EC8E 1067 6C3D 0000 0100 0100" $"0100 0057 726C 7212 FD00 1D01 0000 0100" $"0001 0001 0001 0001 0000 0100 0100 0100" $"0100 0100 0100 0100 01FA 000C 0100 0100" $"0100 0100 0100 0100 01FE 0000 01FE 000A" $"0100 0001 0001 106C 6C72 6FE0 8E07 3828" $"1C12 0A05 0100 5FFA 0001 0222 EC8E 0267" $"7246 FE00 0201 0001 FE00 0051 FE72 0312" $"0000 01FE 0002 0100 01FD 0000 01FD 0002" $"0100 01FE 0004 0100 0100 01FB 0007 0100" $"0100 0100 0001 F600 0501 0001 0000 01FE" $"0008 0100 0007 6C6C 7272 6DE0 8E07 3828" $"1C12 0A05 0100 6A08 0000 0100 0100 0002" $"20EC 8E05 5D6C 6000 0001 FD00 0601 0057" $"6C72 7212 FE00 0201 0001 FE00 0201 0001" $"FE00 0201 0001 FD00 0001 FA00 0A01 0001" $"0001 0001 0001 0001 FE00 1201 0001 0001" $"0001 0001 0000 0100 0001 0001 0001 FE00" $"042E 7272 6C4B DF8E 0738 281C 120A 0501" $"006A FE00 0501 0001 0002 22EC 8E02 5D72" $"61FD 0005 0100 0100 0051 FE72 2214 0000" $"0100 0100 0001 0000 0100 0100 0100 0100" $"0001 0001 0001 0001 0001 0001 0001 0001" $"FA00 0C01 0001 0001 0001 0001 0001 0001" $"FE00 0001 FE00 0901 0000 010C 726C 724B" $"76DF 8E07 3828 1C12 0A05 0100 5C02 0000" $"01FD 0001 0220 EB8E 0F6C 7201 0000 0100" $"0100 0001 516C 726C 19FB 0002 0100 01FD" $"0000 01FD 0002 0100 01FE 0004 0100 0100" $"01FB 0007 0100 0100 0100 0001 F600 0501" $"0001 0000 01FE 0005 0100 2572 7253 DD8E" $"0738 281C 120A 0501 0062 FD00 0401 0000" $"0222 EB8E 026C 6C0B FB00 0201 0057 FE72" $"0519 0000 0100 01FD 0002 0100 01FE 0002" $"0100 01FD 0000 01FA 000A 0100 0100 0100" $"0100 0100 01FE 0018 0100 0100 0100 0100" $"0100 0001 0000 0100 0100 0100 0761 726C" $"66DD 8E07 3828 1C12 0A05 0100 6908 0000" $"0100 0001 0002 20EB 8E07 5472 1900 0001" $"0001 FE00 0051 FE72 0019 FE00 1E01 0001" $"0001 0000 0100 0100 0100 0100 0001 0001" $"0001 0001 0001 0001 0001 0001 FA00 0C01" $"0001 0001 0001 0001 0001 0001 FE00 0001" $"FE00 0701 0001 476C 726C 76DD 8E07 3828" $"1C12 0A05 0100 5EFE 0000 01FE 0001 0222" $"EB8E 0253 7222 FE00 0C01 0001 0000 576C" $"726C 1900 0001 FE00 0201 0001 FD00 0001" $"FD00 0201 0001 FE00 0401 0001 0001 FB00" $"0701 0001 0001 0000 01F6 0005 0100 0100" $"0001 FE00 040B 7272 6C41 DC8E 0738 281C" $"120A 0501 0065 0800 0001 0001 0000 0220" $"EB8E 054B 6C2E 0000 01FE 0002 0100 51FE" $"7205 1F00 0100 0001 FD00 0201 0001 FE00" $"0201 0001 FD00 0001 FA00 0A01 0001 0001" $"0001 0001 0001 FE00 1601 0001 0001 0001" $"0001 0000 0100 0001 0001 0000 2372 725A" $"DB8E 0738 281C 120A 0501 0062 FC00 0301" $"0002 22EB 8E02 4872 51FD 0000 01FE 0004" $"5772 6C72 1CFE 001E 0100 0100 0100 0001" $"0001 0001 0001 0000 0100 0100 0100 0100" $"0100 0100 0100 01FA 000C 0100 0100 0100" $"0100 0100 0100 01FE 0000 01FE 0004 0101" $"6172 53DA 8E07 3828 1C12 0A05 0100 5D08" $"0000 0100 0100 0002 20EB 8E12 4272 5100" $"0001 0000 0100 002E 7272 6C1F 0000 01FE" $"0002 0100 01FD 0000 01FD 0002 0100 01FE" $"0004 0100 0100 01FB 0007 0100 0100 0100" $"0001 F600 0B01 0001 0000 0100 0019 6C72" $"6FDA 8E07 3828 1C12 0A05 0100 62FE 0000" $"01FE 0001 0222 EB8E 0B49 6C72 0100 0001" $"0000 0100 2EFE 7200 1FFD 0000 01FD 0002" $"0100 01FE 0002 0100 01FD 0000 01FA 000A" $"0100 0100 0100 0100 0100 01FE 0015 0100" $"0100 0100 0100 0100 0001 0000 0100 010C" $"6072 6C73 DA8E 0738 281C 120A 0501 0064" $"0800 0001 0000 0100 0220 EA8E 026C 720C" $"FE00 2A01 0000 012E 7272 6C2A 0001 0001" $"0001 0001 0000 0100 0100 0100 0100 0001" $"0001 0001 0001 0001 0001 0001 0001 FA00" $"0C01 0001 0001 0001 0001 0001 0001 FE00" $"0001 FE00 0347 726C 48D9 8E07 3828 1C12" $"0A05 0100 59FD 0004 0100 0002 22EA 8E0A" $"6C72 1900 0001 0001 0000 2EFE 7203 2E00" $"0001 FE00 0201 0001 FD00 0001 FD00 0201" $"0001 FE00 0401 0001 0001 FB00 0701 0001" $"0001 0000 01F6 000A 0100 0100 0001 0E72" $"7253 76D9 8E07 3828 1C12 0A05 0100 5D02" $"0000 01FD 0001 0220 EA8E 0260 722F FC00" $"0601 002E 7272 6C2E FD00 0001 FD00 0201" $"0001 FE00 0201 0001 FD00 0001 FA00 0A01" $"0001 0001 0001 0001 0001 FE00 1301 0001" $"0001 0001 0001 0000 0100 0001 0025 726C" $"78D8 8E07 3828 1C12 0A05 0100 62FE 0005" $"0100 0100 0222 EA8E 0A60 6C2E 0000 0100" $"0100 012E FE72 222E 0000 0100 0001 0001" $"0000 0100 0100 0100 0100 0001 0001 0001" $"0001 0001 0001 0001 0001 FA00 0C01 0001" $"0001 0001 0001 0001 0001 FE00 0601 0001" $"576C 7264 D88E 0738 281C 120A 0501 0059" $"0800 0001 0001 0000 0220 EA8E 0254 7251" $"FE00 0001 FE00 0428 7272 6C2F FE00 0501" $"0000 0100 01FD 0000 01FD 0002 0100 01FE" $"0004 0100 0100 01FB 0007 0100 0100 0100" $"0001 F600 0801 0001 0000 196C 724B D78E" $"0738 281C 120A 0501 005A FA00 0102 22EA" $"8E13 546C 7200 0001 0000 0100 196C 7272" $"4700 0001 0001 FD00 0201 0001 FE00 0201" $"0001 FD00 0001 FA00 0A01 0001 0001 0001" $"0001 0001 FE00 1101 0001 0001 0001 0001" $"0000 0100 0007 6C72 6CD6 8E07 3828 1C12" $"0A05 0100 5D08 0000 0100 0100 0002 20EA" $"8E02 4E6C 72FD 0007 0100 0117 726C 7246" $"FC00 1C01 0001 0000 0100 0100 0100 0100" $"0001 0001 0001 0001 0001 0001 0001 0001" $"FA00 0C01 0001 0001 0001 0001 0001 0001" $"FD00 032E 7272 41D6 8E07 3828 1C12 0A05" $"0100 56FE 0005 0100 0100 0222 EA8E 065A" $"7272 0800 0001 FE00 0D19 6C72 6C46 0000" $"0100 0100 0100 01FD 0000 01FD 0002 0100" $"01FE 0004 0100 0100 01FB 0007 0100 0100" $"0100 0001 F600 0601 0001 086C 7254 D58E" $"0738 281C 120A 0501 005B 0200 0001 FD00" $"0102 20EA 8E03 5A72 720C FD00 0201 0017" $"FE72 0446 0001 0001 FC00 0201 0001 FE00" $"0201 0001 FD00 0001 FA00 0A01 0001 0001" $"0001 0001 0001 FE00 1001 0001 0001 0001" $"0001 0000 0100 1C72 726F D58E 0738 281C" $"120A 0501 005C FD00 0401 0000 0222 EA8E" $"068A 726C 1200 0001 FE00 0419 6C72 7251" $"FC00 1C01 0001 0000 0100 0100 0100 0100" $"0001 0001 0001 0001 0001 0001 0001 0001" $"FA00 0C01 0001 0001 0001 0001 0001 0001" $"FE00 033E 6C72 73D5 8E07 3828 1C12 0A05" $"0100 5608 0000 0100 0001 0002 20EA 8E03" $"786C 7219 FE00 1001 0000 0172 726C 6100" $"0001 0001 0001 0001 FD00 0001 FD00 0201" $"0001 FE00 0401 0001 0001 FB00 0701 0001" $"0001 0000 01F6 0005 0100 1772 7248 D48E" $"0738 281C 120A 0501 005B FE00 0001 FE00" $"0102 22EA 8E0A 786C 6C19 0000 0100 0100" $"01FE 7200 60FE 0000 01FC 0002 0100 01FE" $"0002 0100 01FD 0000 01FA 000A 0100 0100" $"0100 0100 0100 01FE 000F 0100 0100 0100" $"0100 0100 0001 3D72 7270 D48E 0738 281C" $"120A 0501 005C 0800 0001 0001 0000 0220" $"EA8E 0378 6C72 1BFC 0027 0101 7272 6C60" $"0000 0100 0001 0001 0000 0100 0100 0100" $"0100 0001 0001 0001 0001 0001 0001 0001" $"0001 FA00 1101 0001 0001 0001 0001 0001" $"0001 000E 7272 66D3 8E07 3828 1C12 0A05" $"0100 4FFC 0003 0100 0222 EA8E 0A67 6C72" $"1F00 0001 0001 0001 FE72 0060 FD00 0401" $"0001 0001 FD00 0001 FD00 0201 0001 FE00" $"0401 0001 0001 FB00 0701 0001 0001 0000" $"01F5 0002 226C 51D2 8E07 3828 1C12 0A05" $"0100 5908 0000 0100 0100 0002 20EA 8E03" $"6772 6C28 FE00 0A01 0000 0172 726C 6100" $"0001 FB00 0201 0001 FE00 0201 0001 FD00" $"0001 FA00 0A01 0001 0001 0001 0001 0001" $"FE00 0D01 0001 0001 0001 0001 0003 5772" $"6ED2 8E07 3828 1C12 0A05 0100 5CFE 0000" $"01FE 0001 0222 EA8E 0E64 6C72 2E00 0001" $"0000 0100 6072 7260 FE00 1E01 0001 0001" $"0000 0100 0100 0100 0100 0001 0001 0001" $"0001 0001 0001 0001 0001 FA00 1001 0001" $"0001 0001 0001 0001 0000 236C 725D D28E" $"0738 281C 120A 0501 0053 0800 0001 0000" $"0100 0220 EA8E 036D 726C 38FD 000F 0100" $"0060 726C 6000 0001 0001 0001 0001 FD00" $"0001 FD00 0201 0001 FE00 0401 0001 0001" $"FB00 0701 0001 0001 0000 01F7 0003 016C" $"726C D18E 0738 281C 120A 0501 0055 FD00" $"0401 0000 0222 EA8E 065D 6C72 4600 0001" $"FD00 0461 6C72 6C01 FB00 0405 0B04 0001" $"FE00 0201 0001 FD00 0001 FA00 0A01 0001" $"0001 0001 0001 0001 FE00 0C01 0001 0001" $"0001 0001 3872 6C58 D18E 0738 281C 120A" $"0501 0059 0200 0001 FD00 0102 20EA 8E03" $"766C 7251 FE00 0C01 0317 1961 726C 722E" $"5751 5761 FD72 1819 0000 0100 0100 0100" $"0001 0001 0001 0001 0001 0001 0001 0001" $"FA00 0E01 0001 0001 0001 0001 0001 0E72" $"6C54 D08E 0738 281C 120A 0501 0052 FE00" $"0501 0001 0002 22EC 8E0E 5D49 4872 726C" $"2E2E 5761 7272 6C72 6CFA 7204 6C72 6C72" $"19FE 0000 01FD 0002 0100 01FE 0004 0100" $"0100 01FB 0007 0100 0100 0100 0001 F800" $"031A 7272 6FD0 8E07 3828 1C12 0A05 0100" $"6008 0000 0100 0100 0002 20F1 8E08 785A" $"5260 6C72 6C72 6CFD 721A 6C72 6C72 726C" $"726C 726C 726C 726C 726C 726C 1B00 0001" $"0000 0100 01FD 0000 01FA 000A 0100 0100" $"0100 0100 0100 01FE 000B 0100 0100 0100" $"0100 3E72 6C73 D08E 0738 281C 120A 0501" $"005C FA00 0102 22F1 8E37 5472 6C72 6C72" $"726C 726C 726C 7272 6C72 6C72 726C 726C" $"726C 726C 726C 726C 721F 0001 0000 0100" $"0100 0001 0001 0001 0001 0001 0001 0001" $"0001 FA00 0D01 0001 0001 0001 0001 0017" $"7272 4ECF 8E07 3828 1C12 0A05 0100 5D08" $"0000 0100 0100 0002 20F1 8E1F 5372 726C" $"726C 7272 6C72 6C72 6C72 726C 726C 7272" $"6C72 6C72 6C72 6C72 6C72 6C1C FE00 0001" $"FD00 0201 0001 FE00 0401 0001 0001 FB00" $"0701 0001 0001 0000 01FA 0004 0C61 7260" $"6DCF 8E07 3828 1C12 0A05 0100 5EFE 0005" $"0100 0100 0222 F18E 0054 FE72 236C 726C" $"7272 6C72 6C72 6C72 726C 726C 7272 6C72" $"6C72 6C72 6C72 6C72 1F00 0001 0000 0100" $"01FD 0000 01FA 000A 0100 0100 0100 0100" $"0100 01FE 0009 0100 0100 0100 516C 7249" $"CE8E 0738 281C 120A 0501 005D 0200 0001" $"FD00 0102 20F1 8E1F 4E72 6C72 726C 726C" $"7272 6C72 6C72 6C72 726C 726C 7272 6C72" $"6C72 6C72 6C72 6C1F FD00 1301 0001 0000" $"0100 0100 0100 0100 0100 0100 0100 01FA" $"000B 0100 0100 0100 0100 0772 726C CD8E" $"0738 281C 120A 0501 005A FD00 0401 0000" $"0222 F18E 2348 6C72 6C72 726C 726C 7272" $"6C72 6C72 6C72 726C 726C 7272 6C72 6C72" $"6C72 6C6C 1B00 0100 01FD 0002 0100 01FE" $"0004 0100 0100 01FB 0007 0100 0100 0100" $"0001 FB00 031F 6C72 5ACD 8E07 3828 1C12" $"0A05 0100 5E08 0000 0100 0001 0002 20F1" $"8E1E 4372 6C72 6C72 726C 726C 7272 6C72" $"6C72 6C72 726C 726C 726C 513E 2E19 1901" $"01FE 0005 0100 0001 0001 FD00 0001 FA00" $"0A01 0001 0001 0001 0001 0001 FE00 0801" $"0001 0001 516C 6C6A CD8E 0738 281C 120A" $"0501 0058 FE00 0001 FE00 0102 22F1 8E17" $"496C 726C 726C 7272 6C72 6C72 726C 726C" $"726C 7272 6C72 0101 F800 1601 0000 0100" $"0100 0001 0001 0001 0001 0001 0001 0001" $"0001 FA00 0701 0001 0001 0001 0CFE 7200" $"76CD 8E07 3828 1C12 0A05 0100 5408 0000" $"0100 0100 0002 20F1 8E01 7653 FB60 0E6C" $"7272 2F2F 1F1B 1912 0C6C 6C72 6C01 F800" $"0301 0000 01FD 0002 0100 01FE 0004 0100" $"0100 01FB 0007 0100 0100 0100 0001 FD00" $"0403 516C 7249 CC8E 0738 281C 120A 0501" $"0068 FC00 0301 0002 22E9 8E03 496C 6C03" $"FB00 0360 726C 60FD 0004 0100 0100 01FE" $"0005 0100 0001 0001 FD00 0001 FA00 0A01" $"0001 0001 0001 0001 0001 FE00 0601 0000" $"1972 7248 FD8E 0058 FA3B 075C 648E 4D3A" $"3333 36FD 4D00 55F9 8E04 7631 545C 36F1" $"8E07 3828 1C12 0A05 0100 8108 0000 0100" $"0100 0002 20E9 8E03 4972 7211 FB00 0360" $"7272 60FE 001E 0100 0100 0100 0100 0100" $"0001 0001 0000 0100 0100 0100 0100 0100" $"0100 0100 01FA 0009 0100 0100 0100 3872" $"6077 FD8E 245E 6C60 2E2A 2328 2F6C 5965" $"462A 3E6C 303E 383E 723B 775A 484B 5A77" $"8E8E 6561 2828 5366 8E8E FD6C 0371 8E68" $"68FC 8E07 3828 1C12 0A05 0100 7FFE 0000" $"01FE 0001 0222 E98E 1049 6C72 1900 0001" $"0001 0060 726C 6100 0001 FA00 0301 0000" $"01FD 0002 0100 01FE 0004 0100 0100 01FB" $"0007 0100 0100 0100 0001 FE00 030C 726C" $"6FFC 8E02 5E6C 0CFD 0026 0572 5E8A 1800" $"1B72 304A 1900 6C4B 4E6C 6C2F 7266 8E8E" $"4B22 0000 084B 8E8E 6C00 0023 6C4B 6C6C" $"4DFD 8E07 3828 1C12 0A05 0100 8208 0000" $"0100 0001 0002 20E9 8E03 496C 7219 FE00" $"0601 0000 5772 7260 FD00 0401 0001 0001" $"FE00 0501 0000 0100 01FD 0000 01FA 000A" $"0100 0100 0100 0100 0100 01FE 0005 0101" $"3E72 7265 FC8E 025E 6C0C FE00 1801 0C47" $"5E6A 1F00 196C 304A 1500 7272 6C22 0100" $"114B 8E8E 5C08 FE00 063E 768E 6C00 0023" $"FD6C 005A FD8E 0738 281C 120A 0501 007F" $"FD00 0401 0000 0222 E98E 0649 6C72 1F00" $"0001 FE00 2546 7272 6000 0001 0000 0100" $"0100 0100 0100 0001 0001 0000 0100 0100" $"0100 0100 0100 0100 0100 01FA 0008 0100" $"0100 1F72 7253 76FC 8E03 656C 0C00 FC72" $"0C5E 8A2B 0011 8976 7E0C 0038 6012 FD00" $"034B 8E3A 3EFD 000B 2C3A 8E60 0000 1B11" $"0100 194B FD8E 0738 281C 120A 0501 0079" $"0200 0001 FD00 0102 20E9 8E03 496C 722E" $"FD00 0501 0046 7272 60FE 0000 01FB 0003" $"0100 0001 FD00 0201 0001 FE00 0401 0001" $"0001 FB00 0D01 0001 0001 0000 0100 0572" $"726C 58FB 8E05 786C 0C0C 6C54 FE3B 0B70" $"6A2E 000C 898E 7E0C 0025 09FC 0003 4E8E" $"4423 FD00 0323 318E 6CFB 0001 194E FD8E" $"0738 281C 120A 0501 007D FE00 0501 0001" $"0002 22E9 8E06 496C 722E 0000 01FE 000C" $"2857 5160 0000 0100 0100 0100 01FE 0005" $"0100 0001 0001 FD00 0001 FA00 0A01 0001" $"0001 0001 0001 0001 FE00 0317 7272 53FA" $"8E05 786C 0C0C 6C5A FD8E 098A 5400 1A89" $"8E7E 0C00 01FE 000E 0100 0052 6871 1F00" $"011F 001F 3B8E 60FB 0001 194E FD8E 0738" $"281C 120A 0501 007C 0800 0001 0001 0000" $"0220 E98E 0349 6C72 47FE 0002 0100 01F8" $"001C 0100 0100 0100 0100 0001 0001 0000" $"0100 0100 0100 0100 0100 0100 0100 01FA" $"0006 0100 002E 726C 6EFA 8E05 786C 0C0C" $"6C78 FD8E 0764 796C 6C8A 887E 0CFE 0018" $"0C0C 0001 0046 216C 0C00 2538 0017 3B8E" $"5300 000B 2807 0019 52FD 8E07 3828 1C12" $"0A05 0100 72FA 0001 0222 E98E 0449 6C72" $"6C01 FE00 0001 FB00 0201 0001 FB00 0301" $"0000 01FD 0002 0100 01FE 0004 0100 0100" $"01FB 000C 0100 0100 0100 0001 0772 6C72" $"77FA 8E05 786C 0C14 6C65 F88E 1E4D 6C01" $"0001 3872 720E 0000 4A30 7205 0972 6100" $"113B 8E3E 0000 1972 1B00 194E FD8E 0738" $"281C 120A 0501 0084 0800 0001 0001 0000" $"0220 FA8E 0065 F078 056C 6C72 1900 01FE" $"0015 0100 0100 0100 0100 0100 0907 0001" $"0000 0100 0001 0001 FD00 0001 FA00 1001" $"0001 0001 0001 0001 0001 0003 4672 6C66" $"F98E 0578 6C0C 196C 5EFE 8E24 3A48 4B48" $"4B52 246C 0000 1272 386C 2800 053E 574A" $"0022 6B81 0710 6E8E 4800 0025 7222 000E" $"52FD 8E07 3828 1C12 0A05 0100 7FFE 0005" $"0100 0100 0222 FA8E EE6C 0472 6C72 726C" $"FE72 256C 726C 726C 726C 726C 726C 721B" $"0000 0100 0001 0001 0000 0100 0100 0100" $"0100 0100 0100 0100 01F9 0003 2E72 7248" $"F88E 0567 7F0C 1972 58FE 8E24 336C 3E2E" $"3E86 8E7E 0100 1C72 276C 2E00 0C4A 6C28" $"0051 6F65 3860 6F8E 4800 002E 5125 000C" $"4EFD 8E07 3828 1C12 0A05 0100 9202 0000" $"01FD 0001 0220 FB8E 2950 6C72 6C72 6C72" $"6C72 6C72 6C72 6C72 6C72 6C72 726C 726C" $"7272 6C72 6C72 6C72 6C72 6C72 6C72 6C72" $"6C72 22FE 0000 01FD 0002 0100 01FE 0004" $"0100 0100 01FB 000A 0100 0100 0100 0372" $"726C 70F8 8E05 6787 0C2E 6C58 FE8E 2433" $"6C0F 001B 868E 7E01 002C 7224 722E 0011" $"4672 1900 725E 8A71 4B8E 8E48 0001 462E" $"2E00 0C4E FD8E 0738 281C 120A 0501 0090" $"FD00 0401 0000 0222 FB8E 3154 726C 726C" $"726C 726C 726C 726C 726C 726C 726C 7272" $"6C72 6C72 726C 726C 726C 726C 726C 726C" $"726C 726C 723D 1B03 0000 0100 01FD 0000" $"01FA 000F 0100 0100 0100 0100 0100 0019" $"6C72 5A88 F88E 058A 710C 2E6C 55FE 8E18" $"3372 0400 1B6F 8E63 0000 3E7E 6D6C 1900" $"1A46 720F 0572 4D8E 58FE 8E08 4800 0054" $"3A3C 1125 52FD 8E07 3828 1C12 0A05 0100" $"9108 0000 0100 0001 0002 20FC 8E2D 5D6C" $"7272 6C72 6C72 6C72 6C72 6C72 6C72 6C72" $"6C72 6C72 726C 726C 7272 6C72 6C72 6C72" $"6C72 6C72 6C72 6C72 6C72 7219 FE00 1101" $"0000 0100 0100 0100 0100 0100 0100 0100" $"01FA 0003 3872 6C65 F78E 056A 6C0C 2E6C" $"68FE 8E16 3351 0000 2351 243E 0000 7281" $"736C 1400 2E46 7208 0581 76FC 8E08 4800" $"006B 8E6B 6C72 5AFD 8E07 3828 1C12 0A05" $"0100 97FE 0000 01FE 0001 0222 FC8E 3565" $"6C6C 7272 6C72 6C72 6C72 6C72 6C72 6C72" $"6C72 6C72 6C72 726C 726C 7272 6C72 6C72" $"6C72 6C72 6C72 6C72 6C72 6C72 1400 0001" $"0000 0100 01FE 0004 0100 0100 01FB 000C" $"0100 0100 0101 6C72 6C77 8E8E 58FD 4908" $"678E 8E8A 6C0C 3872 68FE 8E15 333E 0000" $"2530 243E 0003 726C 5E6C 0C00 3D3D 6C00" $"0581 FC8E 0975 4800 006B 8E7E 6C35 55FD" $"8E07 3828 1C12 0A05 0100 9508 0000 0100" $"0100 0002 20FC 8E2D 786C 726C 7272 6C72" $"6C72 6C72 6C72 6C72 6C72 6C72 6C72 6C72" $"726C 726C 7272 6C72 6C72 6C72 6C72 6C72" $"6C72 6C72 6C10 FD00 0001 FD00 0001 FA00" $"0A01 0001 0001 0001 0001 0038 FE72 106C" $"6C72 726C 726C 725A 8E8E 6A6C 0C6C 6C68" $"FE8E 2133 3800 002A 2D27 3E00 056C 4478" $"6C04 0172 3072 0005 818E 785A 5A4E 3334" $"000A 4E8E 58FA 8E07 3828 1C12 0A05 0100" $"91FC 0003 0100 0222 FA8E 0148 6CFE 7229" $"6C72 6C72 6C72 6C72 6C72 6C72 6C72 6C72" $"6C72 726C 726C 7272 6C72 6C72 6C72 6C72" $"6C72 6C72 6C72 0900 0001 FE00 0E01 0001" $"0001 0001 0001 0001 0001 0001 FC00 140E" $"726C 726C 7272 6C72 726C 7272 4B8E 8E8A" $"710C 6C6C FD8E 1F33 2E00 002E 2432 3E00" $"0C6C 316E 3E00 0572 326C 0005 818E 6319" $"226C 242E 000C 4EF8 8E07 3828 1C12 0A05" $"0100 9108 0000 0100 0100 0002 20F9 8E29" $"7765 5A60 6C72 726C 726C 726C 726C 726C" $"726C 726C 726C 7272 6C72 6C72 726C 726C" $"726C 726C 726C 726C 7260 FD00 0401 0001" $"0001 FE00 0401 0001 0001 FB00 1801 0001" $"0023 7272 6C72 6C72 726C 7272 6C6C 4E8E" $"8E64 800C 6C71 FD8E 1F33 2E00 0038 2132" $"3800 0C81 7665 2500 0C6C 5A6C 0005 6B42" $"2D00 1251 242E 000B 4BF8 8E07 3828 1C12" $"0A05 0100 8CFE 0000 01FE 0001 0222 F58E" $"0258 526C FE72 256C 726C 726C 726C 726C" $"726C 726C 7272 6C72 6C72 726C 726C 726C" $"726C 726C 726C 2F00 0001 0000 01FD 0000" $"01FA 001E 0100 0100 0100 0100 0161 726C" $"726C 726C 7272 6C72 726C 548E 8E48 6C0C" $"6C6C 76FE 8E1F 332E 0000 461E 322E 0012" $"818E 7818 0012 6C78 6C00 006C 6C25 001B" $"3024 2E00 0C48 F88E 0738 281C 120A 0501" $"008F 0800 0001 0000 0100 0220 F38E 0149" $"54FE 721E 6C72 6C72 6C72 6C72 6C72 6C72" $"6C72 726C 726C 7272 6C72 6C72 6C72 6C72" $"6C72 11FE 0000 01FE 000E 0100 0100 0100" $"0100 0100 0100 0100 01FD 0039 1272 6C72" $"6C72 6C72 6C72 726C 7272 548E 8E48 6C0C" $"386C 3133 4D55 3323 0000 511E 322E 0012" $"6C8E 4B0D 0014 4478 6C00 0072 7219 001C" $"2B32 2E01 1148 F88E 0738 281C 120A 0501" $"008A FD00 0401 0000 0222 F28E 2B88 6478" $"4E6C 6C72 6C72 6C72 6C72 6C72 6C72 6C72" $"726C 726C 7272 6C72 6C72 6C72 6C72 5101" $"0000 0100 0100 0100 01FE 0004 0100 0100" $"01FB 0004 0100 0751 6CFE 7234 6C72 6C72" $"6C72 726C 7254 8E8E 4872 0C1C 2F3E 616C" $"3824 2500 016C 7671 2E00 194E 8E4E 0800" $"1B37 786C 0400 2C23 0100 2A21 322E 0019" $"6FF8 8E07 3828 1C12 0A05 0100 7F02 0000" $"01FD 0001 0220 EE8E 1D70 416C 726C 726C" $"726C 726C 726C 726C 7272 6C72 6C72 726C" $"726C 726C 726C 1BFB 0000 01FD 0000 01FA" $"0007 0100 0100 0100 0138 FE72 076C 7272" $"6C72 6C72 6CFE 7205 658E 8E4B 6C0C FD00" $"1572 3824 2500 056C 8E6C 2E00 1B37 8E60" $"0000 2333 786C 0CFC 0006 5476 3B2E 0019" $"5AF8 8E07 3828 1C12 0A05 0100 86FE 0005" $"0100 0100 0222 EC8E 205D 536C 7272 6C72" $"6C72 6C72 6C72 6C72 726C 726C 7272 6C72" $"6C72 6C72 0100 0001 0001 FE00 2001 0001" $"0001 0001 0001 0001 0001 0001 0000 036C" $"726C 7272 6C72 726C 726C 726C 5349 FE8E" $"0248 6C0C FD00 1572 6562 2500 0C4E 8E71" $"2E00 2333 8E6C 0000 2533 786C 19FD 0007" $"0B52 8E3B 2800 285A F88E 0738 281C 120A" $"0501 0082 0800 0001 0001 0000 0220 EA8E" $"236A 4B6C 6C72 726C 726C 726C 726C 7272" $"6C72 6C72 726C 726C 7260 1912 0900 0100" $"0001 0000 01FE 0004 0100 0100 01FA 000D" $"1972 6C72 6C72 726C 7272 6C53 6F6A FC8E" $"2948 7247 3E38 2E2E 6C8A 553C 1B23 523A" $"602E 1038 333A 6005 0F3E 3365 6C38 0000" $"010B 5766 883B 2F12 3E66 88F9 8E07 3828" $"1C12 0A05 0100 79FA 0001 0222 E98E 2049" $"6C72 6C72 726C 726C 726C 726C 7272 6C72" $"6C72 726C 726C 726C 726C 7251 3817 0B01" $"FE00 0001 FA00 1001 0001 0001 0038 7272" $"6C72 6C72 726C 4E49 F98E 244E 796C 6C71" $"6C6C 716A 7572 726C 484D 6C72 726C 5540" $"6C72 726C 3376 446C 382C 7272 6C4D 8E3B" $"FE72 0166 88F9 8E07 3828 1C12 0A05 0100" $"7408 0000 0100 0100 0002 20E8 8E1B 6C6C" $"726C 7272 6C72 6C72 6C72 6C72 726C 726C" $"7272 6C72 6C72 6C72 726C FE72 1A6C 573C" $"281C 1A12 0C01 0100 0100 0100 0100 0C6C" $"6C72 726C 7254 6E6A ED8E 1E55 6868 8E68" $"6258 584D 8E55 4878 6562 768E 8E73 648A" $"786A 768E 8E76 625E 7873 F88E 0738 281C" $"120A 0501 007A FE00 0501 0001 0002 22E8" $"8E19 5472 6C72 6C72 726C 726C 726C 726C" $"7272 6C72 6C72 726C 726C 726C FE72 026C" $"726C F972 0E61 3C23 1701 0000 013D 7272" $"6C72 7249 F58E 1C73 4E63 7F87 6C87 876C" $"8787 7F87 6C87 7F87 6C7F 877F 8772 877F" $"714E 6363 FE78 025A 634E FE63 0160 7FFE" $"8702 6C87 6CFC 8E07 3828 1C12 0A05 0100" $"5102 0000 01FD 0001 0220 E88E 2048 6C72" $"6C72 6C72 726C 726C 726C 726C 7272 6C72" $"6C72 726C 726C 726C 726C 726C 726C FC72" $"006C FE72 0B6C 726C 5138 2E72 726C 726C" $"50F4 8E00 5FD4 90FC 8E07 3828 1C12 0A05" $"0100 6BFD 0004 0100 0002 22E8 8E2B 496C" $"7272 6C72 6C72 726C 726C 726C 726C 7272" $"6C72 6C72 726C 726C 726C 726C 726C 726C" $"726C 726C 726C 726C 726C FA72 014E 73F3" $"8E00 5FFE 90FB 8C09 6C72 616C 616C 616C" $"616C F690 023C 3D72 FE90 056C 1F22 1F22" $"4FFE 90FC 8E07 3828 1C12 0A05 0100 6608" $"0000 0100 0001 0002 20E7 8E2B 6C72 6C72" $"6C72 6C72 726C 726C 726C 726C 7272 6C72" $"6C72 726C 726C 726C 726C 726C 726C 726C" $"726C 726C 726C 726C FE72 026C 7241 F18E" $"0356 9090 1FF2 0000 17F7 9003 8C00 0017" $"FE90 003D FD00 0017 FE90 FC8E 0738 281C" $"120A 0501 0065 FE00 0001 FE00 0102 22E7" $"8E30 606C 726C 726C 726C 7272 6C72 6C72" $"6C72 6C72 726C 726C 7272 6C72 6C72 6C72" $"6C72 6C72 6C72 6C72 6C72 6C72 6C72 6C72" $"6C72 4EF0 8E03 5F90 901F F200 001C F790" $"038C 0000 17FE 9005 803D 3E3E 0E00 FE90" $"FC8E 0738 281C 120A 0501 0071 0800 0001" $"0001 0000 0220 E78E 3054 726C 726C 726C" $"726C 7272 6C72 6C72 6C72 6C72 726C 726C" $"7272 6C72 6C72 6C72 6C72 6C72 6C72 6C72" $"6C72 6C72 6C72 6C72 6C73 F08E 035F 9090" $"3DFC 1F04 1A01 0001 19FC 1C00 38FE 9001" $"5128 FE1C 053E 908C 0000 17FA 9001 1700" $"FE90 FC8E 0738 281C 120A 0501 0065 FC00" $"0301 0002 22E7 8E00 5AFD 722A 6C72 6C72" $"6C72 726C 726C 726C 726C 7272 6C72 6C72" $"726C 726C 726C 726C 726C 726C 726C 726C" $"726C 726C 726C 48EF 8E00 56F9 9004 6100" $"0100 8CF9 9000 22FC 0005 6090 8C00 001C" $"FA90 0419 008C 9090 FC8E 0738 281C 120A" $"0501 006A 0800 0001 0001 0000 0220 E78E" $"2F6F 6C6C 726C 726C 726C 726C 7272 6C72" $"6C72 6C72 6C72 726C 726C 7272 6C72 6C72" $"6C72 6C72 6C72 6C72 6C72 6C72 6C72 6C54" $"76EF 8E00 66F9 9000 57FE 00F9 900C 3E01" $"0003 388C 8C90 908C 0000 1BFA 9004 1700" $"8C90 90FC 8E07 3828 1C12 0A05 0100 69FE" $"0000 01FE 0001 0222 E78E 2E78 6C72 6C72" $"6C72 6C72 6C72 6C72 726C 726C 726C 726C" $"7272 6C72 6C72 726C 726C 726C 726C 726C" $"726C 726C 726C 726C 7270 EE8E 0063 F990" $"033C 0100 00F9 9000 1CFE 0008 576C 8C90" $"9061 0000 1CFA 9004 1900 8C90 90FC 8E07" $"3828 1C12 0A05 0100 6908 0000 0100 0001" $"0002 20E7 8E2D 656C 6C72 6C72 6C72 6C72" $"6C72 6C72 726C 726C 726C 726C 7272 6C72" $"6C72 726C 726C 726C 726C 726C 726C 726C" $"726C 7254 ED8E 004E F990 033D 0100 00F9" $"9001 6003 FE00 0701 0C90 9061 0000 1BFA" $"9004 1700 8C90 90FC 8E07 3828 1C12 0A05" $"0100 6BFD 0004 0100 0002 22E7 8E2D 736C" $"726C 726C 726C 726C 726C 726C 7272 6C72" $"6C72 6C72 6C72 726C 726C 7272 6C72 6C72" $"6C72 6C72 6C72 6C72 6C72 6C6E ED8E 0063" $"F990 0357 170E 0EF8 9001 471A FE17 0623" $"9090 6100 001C FE90 0938 1C19 1903 008C" $"9090 88FD 8E07 3828 1C12 0A05 0100 5B02" $"0000 01FD 0001 0220 E68E 2C41 4E6C 6C72" $"6C72 6C72 6C72 6C72 6C72 726C 726C 726C" $"726C 7272 6C72 6C72 726C 726C 726C 726C" $"726C 726C 726C 725D ED8E 007F E490 038C" $"3D72 8CFE 9004 383C 3E72 6CFD 9000 73FD" $"8E07 3828 1C12 0A05 0100 49FE 0005 0100" $"0100 0222 E48E 0476 3F4B 6C6C FE72 216C" $"726C 726C 7272 6C72 6C72 6C72 6C72 726C" $"726C 7272 6C72 6C72 6C72 6C72 6C72 6C72" $"6CEC 8E00 87D4 9000 7DFD 8E07 3828 1C12" $"0A05 0100 4D08 0000 0100 0100 0002 20E0" $"8E05 5D78 785A 536C FE72 1C6C 7272 6C72" $"6C72 6C72 6C72 726C 726C 7272 6C72 6C72" $"6C72 6C72 6C72 6C48 EC8E 0078 ED8A F889" $"F68A 0365 7873 77FB 8E07 3828 1C12 0A05" $"0100 33FA 0001 0222 DA8E 1F43 6C6C 726C" $"7272 6C72 6C72 6C72 6C72 726C 726C 7272" $"6C72 6C72 6C72 6C72 6C72 50B9 8E07 3828" $"1C12 0A05 0100 3508 0000 0100 0100 0002" $"20D8 8E06 7765 6F4B 606C 6CFE 7212 6C72" $"6C72 726C 726C 7272 6C72 6C72 6C72 6C72" $"6CB8 8E07 3828 1C12 0A05 0100 30FE 0005" $"0100 0100 0222 D48E 1876 4160 6C72 6C72" $"6C72 6C72 726C 726C 7272 6C72 6C72 604B" $"4277 B88E 0738 281C 120A 0501 002A 0200" $"0001 FD00 0102 20D2 8E12 7748 6C72 6C72" $"6C72 6C72 726C 726C 7272 5443 49B4 8E07" $"3828 1C12 0A05 0100 23FD 0004 0100 0002" $"22CF 8E0C 6A5A 5472 6C6C 5352 5A78 786A" $"76B1 8E07 3828 1C12 0A05 0100 1A08 0000" $"0100 0001 0002 20CC 8E01 7758 A98E 0738" $"281C 120A 0501 0016 FE00 0001 FE00 0102" $"2281 8EF2 8E07 3828 1C12 0A05 0100 1708" $"0000 0100 0100 0002 2081 8EF2 8E07 3828" $"1C12 0A05 0100 14FC 0003 0100 0222 818E" $"F28E 0738 281C 120A 0501 00A2 7F00 0001" $"0001 0000 0213 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2022 2022 2022" $"2022 2022 2022 2022 2022 2022 201F 2220" $"2220 2220 2220 2220 2220 2220 2220 2220" $"2220 2220 2220 3B25 1F12 0A05 0100 16FE" $"0000 01FE 0001 0208 810A F20A 072E 281F" $"120A 0501 0019 0900 0001 0000 0100 0002" $"0481 06F4 0608 0430 281F 120A 0501 0013" $"FD00 0001 FC00 8102 F302 0738 281F 120A" $"0501 0015 0200 0001 FC00 0001 8100 F200" $"0738 251F 120A 0501 0038 FE00 0501 0001" $"0000 01F8 0000 03FD 0002 1214 07E3 0009" $"0307 080C 1214 112A 2E1F E300 0901 0A0C" $"0C07 0000 1722 1FD3 0007 3828 1C12 0A05" $"0100 4B07 0000 0100 0100 0001 F900 0903" $"2572 2A00 0014 6C6C 11F5 0008 0519 0C00" $"0003 0C0C 01FD 0005 031F 343E 6C72 FC6C" $"0334 2F6C 2FE4 0001 013E FE6C 0522 0000" $"6C72 2FD3 0007 3428 1F12 0A05 0100 97F9" $"002E 0100 0001 0001 0001 126C 7272 0A00" $"3D6C 6C1B 0001 051C 2F25 0B00 0119 6C60" $"6172 1B00 1260 6C6C 470C 0000 0105 6C72" $"6CFA 7261 2F47 6C34 0000 0100 0100 0B1B" $"1A14 0001 0001 000A 0A05 1C1A 0B00 0100" $"0100 0100 013D 6C6C 7272 2F00 056C 6C34" $"0000 0100 0105 1C13 0719 1C13 0300 0100" $"0100 0100 0100 0100 0100 0100 0100 0100" $"0105 0C0A 0100 0100 0100 0100 0100 3828" $"1C12 0A05 0100 A007 0000 0100 0100 0001" $"FD00 0901 0001 0014 7272 6C51 3CFE 720A" $"2500 1F72 6C6C 726C 2E08 25FE 720C 6C1F" $"2F6C 5125 1B51 6C17 0000 05FE 4703 516C" $"726C FE47 1923 6C6C 2A12 1F19 0500 256C" $"726C 7261 2F0A 003E 7272 6C72 6C51 0EFE" $"0044 0100 0019 7272 3822 2522 0007 7272" $"3E23 2F2A 1701 0C6C 726C 6C72 7219 0E28" $"3447 2F1B 070E 473C 1F25 1A2A 342F 0E00" $"0E38 6C6C 7238 0700 0100 0100 0100 0134" $"281F 120A 0501 008B FE00 0801 0001 0000" $"0100 0001 FD00 0213 726C FB72 172F 036C" $"7272 1414 6172 2A28 726C 3E07 1172 6C19" $"0828 7272 3EFB 0008 0C72 726C 0800 0001" $"6CFD 720D 6C6C 0719 382A 2A6C 726C 2E00" $"726C FB72 0804 0001 0000 012A 7228 FC00" $"0305 6C72 6CFE 7203 6C13 0C6C FD72 036C" $"146C 72FE 6C03 726C 236C FC72 FE6C 0808" $"7272 340C 1972 4701 FA00 0738 281C 120A" $"0501 0096 0200 0001 FC00 0001 FD00 2601" $"0000 1372 726C 726C 726C 6C60 0C72 6C19" $"0000 2E72 2F28 6C72 0A00 126C 7272 6C72" $"6C47 1700 0001 FE00 0B05 6C72 7205 0000" $"056C 7272 6CFE 7202 1900 1FFC 720A 6101" $"6C72 7247 1B47 6C72 11FE 0004 0100 2F6C" $"0CFE 0002 0100 07FE 7200 6CFE 7210 280C" $"7272 6C2A 0C11 1F72 380C 0C19 7272 34F8" $"7217 1B72 6C0F 0528 6C6C 0500 0001 0001" $"0000 3428 1F12 0A05 0100 9FFD 0003 0100" $"0001 FE00 6701 0000 0100 1372 6C3E 7272" $"5147 6C72 0A6C 7228 0C19 516C 2A25 7272" $"0000 0E72 726C 512F 3860 1A01 0000 0100" $"0100 6172 7205 0000 0772 726C 2A38 6C72" $"3C08 6172 120C 1F72 6C1A 6172 6C0B 0001" $"4772 1F00 0001 0000 2F6C 3813 131C 2E1F" $"0A6C 726C 1911 6C6C 5101 726C 72FE 001A" $"2372 1900 000B 726C 4672 6014 2E6C 720A" $"2E72 2F6C 7251 7261 383C 11FE 000B 0100" $"0100 3828 1C12 0A05 0100 9C08 0000 0100" $"0001 0000 01FE 0010 0100 0001 1372 7212" $"146C 0A34 726C 0C34 6CFE 7205 6C47 0328" $"6C72 FE00 0813 7272 6C6C 7272 5101 FE00" $"0E01 0000 4772 7205 0000 0B72 6C1B 0005" $"FE72 1105 6C6C 1B3C 726C 723C 4772 7205" $"0000 2572 2EFD 0001 0123 FA72 0C1B 726C" $"2500 001A 726C 1372 7260 FE00 1D19 6C72" $"382A 4F72 722E 7228 000C 726C 001B 722C" $"726C 726C 4751 6C1A 0100 01FE 0008 0134" $"281F 120A 0501 009D FE00 0001 FD00 1D01" $"0000 0100 0100 0011 4747 1100 0300 1F34" $"2F0C 0413 1B1B 1911 0300 1228 25FD 0006" $"081C 2825 2319 08FE 0000 01FE 0008 232F" $"3805 0000 0825 1FFE 002E 1222 1B08 0F38" $"473C 2A51 5728 3838 3403 0000 1728 0B00" $"0001 0000 031B 516C 7260 3823 142F 2A0C" $"0000 012A 280E 4760 2FFE 001A 0314 2F3E" $"4738 1F08 2F72 1900 081B 0F00 1323 0810" $"2A6C 7272 6038 0CFD 000A 0100 0038 281C" $"120A 0501 002F 0700 0001 0001 0000 01FB" $"0000 01DD 0003 0100 0001 DE00 0201 0001" $"EA00 0001 E400 0D01 0001 0001 0034 281F" $"120A 0501 0038 FC00 0801 0000 0100 0001" $"0001 E900 0201 0001 F800 0301 0000 01F8" $"0004 0100 0100 01F9 0000 01F9 0000 01C4" $"0000 01FD 0007 3828 1C12 0A05 0100 A204" $"0000 0100 01FE 0000 01FE 007F 0100 0001" $"0001 0001 0001 0001 0001 0001 0001 0001" $"0001 0001 0001 0001 0001 0001 0001 0001" $"0001 0000 0100 0001 0001 0001 0001 0000" $"0100 0100 0001 0001 0001 0001 0000 0100" $"0100 0100 0100 0001 0001 0001 0001 0001" $"0001 0001 0001 0001 0001 0001 0001 0001" $"0001 0001 0001 0001 0001 0001 0001 0001" $"0001 0001 0001 0001 0001 0001 0500 0100" $"0100 01FE 000A 0100 0134 281F 120A 0501" $"009C FE00 0001 FE00 0001 FE00 1901 0000" $"0100 0100 0100 0100 0100 0100 0100 0100" $"0100 0100 0100 01FC 0014 0100 0100 0100" $"0100 0001 0000 0100 0100 0100 0100 01FC" $"005B 0100 0100 0100 0100 0001 0001 0001" $"0001 0000 0100 0100 0100 0100 0100 0100" $"0100 0100 0100 0100 0100 0100 0100 0100" $"0100 0100 0100 0100 0100 0100 0100 0100" $"0100 0100 0100 0100 0100 0100 0100 0100" $"0100 0100 0100 3428 1C11 0A05 0100 3A08" $"0000 0100 0001 0000 01FD 0000 01E9 0002" $"0100 01F8 0003 0100 0001 F800 0401 0001" $"0001 F900 0001 F900 0001 C400 0001 FD00" $"0734 251C 110A 0501 003B FD00 0001 FE00" $"0801 0405 0B0E 1112 1714 EC17 0014 F617" $"0314 1717 14F8 1700 14FE 1700 14F9 1700" $"14F9 1700 14C4 170C 1417 1714 142E 2319" $"1108 0501 0038 0200 0001 FD00 0801 0308" $"0C12 1F23 2A2E EB2F 0034 F62F 0034 F52F" $"0034 FE2F 0034 F92F 0034 F92F 0034 C42F" $"0034 FE2F 082E 251C 190C 0804 0100 30FE" $"000C 0100 0100 0001 050A 0F14 191F 22DF" $"2300 22F1 2300 22F9 2300 22F9 2300 22C4" $"230C 2223 2322 1F1B 1411 0C05 0400 00A1" $"0400 0001 0001 FE00 7F01 0405 0B0F 1112" $"1414 1914 1714 1914 1914 1714 1914 1914" $"1714 1914 1914 1714 1914 1914 1419 1419" $"1414 1914 1914 1714 1914 1914 1714 1914" $"1914 1419 1419 1414 1914 1914 1419 1419" $"1414 1914 1914 1714 1914 1914 1419 1419" $"1414 1914 1914 1419 1419 1414 1914 1914" $"1419 1419 1414 1914 1914 1419 1419 1414" $"1914 1914 1419 1419 140B 1419 1419 1414" $"1914 1914 1419 FD14 0712 0E0C 0804 0100" $"007B FB00 0B01 0001 0105 080A 0C0C 0F0F" $"0EFC 0F00 0EFC 0F00 0EFC 0F00 0EFC 0F00" $"0EFD 0F00 0EFD 0F00 0EFC 0F00 0EFC 0F00" $"0EFD 0F00 0EFD 0F00 0EFD 0F00 0EFD 0F00" $"0EFC 0F00 0EFD 0F00 0EFD 0F00 0EFD 0F00" $"0EFD 0F00 0EFD 0F00 0EFD 0F00 0EFD 0F00" $"0EFD 0F00 0EFD 0F00 0EFD 0F00 0EFD 0F00" $"0EFB 0F08 0C0C 0A08 0501 0100 0087 0400" $"0001 0001 FD00 0601 0103 0505 0807 FE08" $"0207 0807 FD08 0007 FD08 0207 0807 FD08" $"0007 FD08 0007 FD08 0007 FD08 0207 0807" $"FD08 0007 FD08 0007 FD08 0007 FD08 0007" $"FD08 0007 FD08 0207 0807 FD08 0007 FD08" $"0007 FD08 0007 FD08 0007 FD08 0007 FD08" $"0007 FD08 0007 FD08 0007 FD08 0007 FD08" $"0007 FD08 0007 FD08 0007 FE08 0507 0505" $"0401 01FE 0099 FE00 0201 0001 FC00 FD01" $"7F03 0101 0301 0301 0301 0103 0103 0101" $"0301 0301 0301 0103 0103 0101 0301 0301" $"0103 0103 0101 0301 0301 0301 0103 0103" $"0101 0301 0301 0103 0103 0101 0301 0301" $"0103 0103 0101 0301 0301 0301 0103 0103" $"0101 0301 0301 0103 0103 0101 0301 0301" $"0103 0103 0101 0301 0301 0103 0103 0101" $"0301 0301 0103 0103 0101 0301 0301 0103" $"0108 0301 0103 0103 0101 04FD 01FD 0099" $"0200 0001 FE00 0001 FA00 7F01 0001 0100" $"0100 0100 0101 0001 0001 0100 0100 0100" $"0101 0001 0001 0100 0100 0101 0001 0001" $"0100 0100 0100 0101 0001 0001 0100 0100" $"0101 0001 0001 0100 0100 0101 0001 0001" $"0100 0100 0100 0101 0001 0001 0100 0100" $"0101 0001 0001 0100 0100 0101 0001 0001" $"0100 0100 0101 0001 0001 0100 0100 0101" $"0001 0001 0100 0100 0101 000A 0100 0101" $"0001 0001 0100 01FA 0010 FD00 0501 0000" $"0100 0181 00ED 0001 0100 150B 0000 0100" $"0001 0000 0100 0001 8100 F000 0201 0000" $"00FF" }; /* * Here is the custom file open dialog. This dialog is used instead of * the default file dialog if the -filetypes flag is specified. */ resource 'DLOG' (130, purgeable) { {0, 0, 195, 344}, dBoxProc, invisible, noGoAway, 0, 130, "", centerMainScreen }; resource 'DITL' (130, "File Open Box", purgeable) { { {135, 252, 155, 332}, Button {enabled, "Open"}, {104, 252, 124, 332}, Button {enabled, "Cancel"}, { 0, 0, 0, 0}, HelpItem {disabled, HMScanhdlg {130}}, { 8, 235, 24, 337}, UserItem {enabled}, { 32, 252, 52, 332}, Button {enabled, "Eject"}, { 60, 252, 80, 332}, Button {enabled, "Desktop"}, { 29, 12, 159, 230}, UserItem {enabled}, { 6, 12, 25, 230}, UserItem {enabled}, { 91, 251, 92, 333}, Picture {disabled, 11}, {168, 20, 187, 300}, Control {enabled, 131} } }; resource 'CNTL' (131, "File Types menu", purgeable) { {168, 20, 187, 300}, popupTitleLeftJust, visible, 80, 132, popupMenuCDEFProc, 0, "File Type:" }; resource 'MENU' (132, preload) { 132, textMenuProc, 0xFFFF, enabled, "", {} }; fv5.4/ftools/guis/fv/mac/fvStaticApplication.r0000644000220700001010000000564307153514335021004 0ustar birbylheadev/* * itkStaticApplication.r -- * * This file creates resources which bind in the static version of the * pkgIndex tclIndex and itk's Tcl code files. * * Jim Ingham for Itcl 2.2 * * Copyright (c) 1996 Lucent Technologies * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * SCCS: @(#) itkStaticApplication.r 1.5 96/10/03 17:54:21 */ #include #include #define TK_LIBRARY_RESOURCES 3000 #define POW_LIBRARY_RESOURCES 4000 #define FV_LIBRARY_RESOURCES 4500 /* * We now load the Tk library into the resource fork of the application. */ read 'TEXT' (TK_LIBRARY_RESOURCES+1, "tk", purgeable) "::tk:library:tk.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+2, "button", purgeable) "::tk:library:button.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+3, "dialog", purgeable) "::tk:library:dialog.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+4, "entry", purgeable) "::tk:library:entry.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+5, "focus", purgeable) "::tk:library:focus.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+6, "listbox", purgeable) "::tk:library:listbox.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+7, "menu", purgeable) "::tk:library:menu.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+8, "optionMenu", purgeable) "::tk:library:optMenu.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+9, "palette", purgeable) "::tk:library:palette.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+10, "scale", purgeable) "::tk:library:scale.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+11, "scrollbar", purgeable) "::tk:library:scrlbar.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+12, "tearoff", purgeable) "::tk:library:tearoff.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+13, "text", purgeable) "::tk:library:text.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+14, "tkerror", purgeable) "::tk:library:bgerror.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+15, "Console", purgeable) "::tk:library:console.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+16, "msgbox", purgeable, preload) "::tk:library:msgbox.tcl"; read 'TEXT' (TK_LIBRARY_RESOURCES+17, "comdlg", purgeable, preload) "::tk:library:comdlg.tcl"; /* * We now load the pow library into the resource fork of the application. */ /* #include "powMacResource.r" Lets put into a folder instead */ /* * We now load the fv library into the resource fork of the application. */ /* #include "fvMacResource.r" Lets put into a folder instead */ /* * We now put the initialization script into resource fork of the application. */ data 'TEXT' (9999,"itkwishrc",purgeable, preload) { "# Tcl init file\n" "package ifneeded Itcl 3.2 {source -rsrc itcl}\n" "package ifneeded Itk 3.2 {source -rsrc itk}\n" "package ifneeded Iwidgets 3.0.0 {source -rsrc iwidgets}\n" "package ifneeded http 2.3 {source -rsrc Http}\n" "set env(FITSVIEWER_LIBRARY) \"$env(HOME)fv Sources\"\n" "source $env(FITSVIEWER_LIBRARY):fvInit.tcl\n" }; fv5.4/ftools/guis/fv/sample_data/0002755000220700001010000000000012565673764016375 5ustar birbylheadevfv5.4/ftools/guis/fv/sample_data/TclScript.fv0000644000220700001010000000314107452425200020611 0ustar birbylheadev######################################################################## # # Sample Tcl script for fv 2.6 # # This script will open 2 sample files (available online and distributed # with the fv executables) and displays their contents in several forms... # header keyword list, a curve, and an image. # # USAGE: # # This file is run by fv itself... run it either from the command-line # as 'fv TclScript.fv' or "Open" it after fv starts. # # Another version of this script (TclScript.tcl) uses the XPA TCL interface # which allows other Tcl programs to control fv remotely. # ######################################################################## # # Check to make sure it is OK to start an FTP transfer # set ans [tk_messageBox -message "fv is about to download 2 FITS files (~150KB).\ This should take less than a minute over a modem." \ -type okcancel -default ok -icon warning] if { $ans=="cancel" } return # # Set a variable here which points to the fits files to be opened. # This is just to make it easier to specify files later. # set FitsDir ftp://heasarc.gsfc.nasa.gov/software/ftools/release/other/pdw # # Open 2 sample files # open $FitsDir/ngc1316r.fit $FitsDir/rate.fit # # Select one of the files and open a header window of extension #1 # select rate.fit display header 1 # # Plot a curve of Time vs Rate in POW and alter the graph's appearance # display curve 1 time rate pow bounds 770 -30 1070 300 pow curve pDisp No lDisp Yes lColor Blue # # Select the other file and plot an image, setting its colormap to histogram # select ngc1316r.fit display image 0 pow colormap scale histo fv5.4/ftools/guis/fv/sample_data/asciitab.fit0000644000220700001010000025630007452425200020637 0ustar birbylheadevSIMPLE = T / Standard FITS format BITPIX = 8 / Character information NAXIS = 0 / No image data array present EXTEND = T / There may be standard extensions ORIGIN = 'ADC ' / This file written at the ADC, NASA/GSFC DATE = '05/05/91' / Date file written (dd/mm/yy) END XTENSION= 'TABLE ' / Table extension BITPIX = 8 / Character data NAXIS = 2 / Simple 2-D matrix NAXIS1 = 52 / Number of characters per record NAXIS2 = 1455 / Number of records in the table PCOUNT = 0 / No "random" parameters GCOUNT = 1 / Only one group TFIELDS = 16 / Number of data fields per record EXTNAME = 'PLN ' / Strasbourg Galactic Planetary Nebulae AUTHOR = 'Acker et al.' / Catalog author(s) REFERENC= '1980 CDS Bull.' / Catalog reference(s) DATE = '03/10/88' / Date FITS table verified (dd/mm/yy) HISTORY Source Catalog Reference: Acker, A., Marcout, J. Ochsenbein, F. 1980, HISTORY Centre de Donnees Stellaires Bull. No.18, 84. HISTORY HISTORY A copy of "Documentation for the Machine-Readable Version of the HISTORY Strasbourg Catalogue of Galactic Planetary Nebulae", Hill 1983, HISTORY Doc. No. SSD-T-1-0338-0097-83 should accompany any computer-readable HISTORY version of the catalog. TTYPE1 = 'PK ' / Perek-Kohoutek (PK) number TBCOL1 = 1 / Start column TFORM1 = 'A9 ' / Fortran format TTYPE2 = 'RAH ' / Hours RA, 1950.0 TBCOL2 = 10 / Start column TFORM2 = 'I2 ' / Fortran format TUNIT2 = 'h ' / Units are hours TTYPE3 = 'RAM ' / Minutes RA, 1950.0 TBCOL3 = 13 / Start column TFORM3 = 'F5.2 ' / Fortran format TUNIT3 = 'min ' / Units are minutes of time TTYPE4 = 'DecSign ' / Sign Dec, 1950 TBCOL4 = 19 / Start column TFORM4 = 'A1 ' / Fortran format TTYPE5 = 'DecD ' / Degrees Dec, 1950.0 TBCOL5 = 20 / Start column TFORM5 = 'I2 ' / Fortran format TUNIT5 = 'deg ' / Units are degrees TTYPE6 = 'DecM ' / Minutes Dec, 1950.0 TBCOL6 = 23 / Start column TFORM6 = 'F4.1 ' / Fortran format TUNIT6 = 'arcmin ' / Units are minutes of arc TTYPE7 = 'V_Limit ' / '>' if V is a lower limit TBCOL7 = 28 / Start column TFORM7 = 'A1 ' / Fortran format TTYPE8 = 'V ' / Visual magnitude TBCOL8 = 29 / Start column TFORM8 = 'F4.1 ' / Fortran format TUNIT8 = 'mag ' / Units are magnitudes TNULL8 = ' ' / Null value TTYPE9 = 'Morph_Flag' / Morphology flag TBCOL9 = 34 / Start column TFORM9 = 'A1 ' / Fortran format TNULL9 = ' ' / Null value COMMENT Morph_Flag: '<' for star-like appearance, '>' for fainter spherical COMMENT Morph_Flag: envelope, or else blank. TTYPE10 = 'Diam ' / Angular diameter of brightest part TBCOL10 = 35 / Start column TFORM10 = 'I3 ' / Fortran format TUNIT10 = 'arcsec ' / Units are seconds of arc TNULL10 = ' ' / Null value TTYPE11 = 'RadVel ' / Mean radial velocity TBCOL11 = 39 / Start column TFORM11 = 'I4 ' / Fortran format TUNIT11 = 'km/s ' / Units are kilometers per second TNULL11 = ' ' / Null value TTYPE12 = 'StarMag_Limit' / '>' if StarMag is a lower limit TBCOL12 = 44 / Start column TFORM12 = 'A1 ' / Fortran format TNULL12 = ' ' / Null value TTYPE13 = 'StarMag ' / Central star magnitude TBCOL13 = 45 / Start column TFORM13 = 'F4.1 ' / Fortran format TUNIT13 = 'mag ' / Units are magnitudes TNULL13 = ' ' / Null value TTYPE14 = 'Var_Flag' / 'V' if central star is variable TBCOL14 = 49 / Start column TFORM14 = 'A1 ' / Fortran format TNULL14 = ' ' TTYPE15 = 'ExpVel_Limit' / ExpVel limit flag, '<', '>', or blank TBCOL15 = 50 / Start column TFORM15 = 'A1 ' / Fortran format TNULL15 = ' ' / Null value TTYPE16 = 'ExpVel ' / Nebula expansion velocity TBCOL16 = 51 / Start column TFORM16 = 'I2 ' / Fortran format TUNIT16 = 'km/s ' / Units are kilometers per second TNULL16 = ' ' / Null value END 118+ 2.1 0 05.0 +64 41. 125 119+ 6.1 0 09.9 +68 54. 18.3 44 19.9 120+ 9.1 0 10.3 +72 15. 10.7 > 37 - 23 11.6 28118- 8.1 0 16.0 +53 36. 5 - 55 14.1 119+ 0.1 0 17.2 +62 42. - 94 119- 6.1 0 25.5 +55 41.3 13.3 5 - 58 108-76.1 0 34.78 -13 58.7 +196 121- 2.1 0 35.8 +60 00. 39 18.0 121+ 3.1 0 35.92 +66 07.2 19 >20. 121+ 0.1 0 37.4 +62 35. - 39 122- 4.1 0 42.7 +57 41. 16.3 31 19.8 118-74.1 0 44.5 -12 09. 8.0 225 - 29 12.0 125-47.1 0 57.32 +15 28. 270 + 15 126+ 3.1 1 21.55 +65 23.0 < 12 127- 1.1 1 27.24 +60 15.9 < 5 130-11.1 1 34.2 +50 13. 6 - 45 130-10.1 1 39.2 +51 19. 12.2 > 65 - 23 15.9 10129- 2.1 1 39.25 +59 55. 194 131- 5.1 1 50.4 +56 10. - 59 130+ 1.1 1 54.0 +63 05. 13.6 13 - 71 15.8 129+ 4.1 1 54.79 +66 19.5 11 133- 8.1 1 55.5 +52 39. < 1 - 12 130+ 3.1 1 59.91 +64 43.2 12 132- 0.1 2 04.48 +60 31.8 11 131+ 2.1 2 08.4 +63 55. 18.2 60 17.6 132+ 4.1 2 22.49 +65 34.4 10 237-65.1 2 37.75 -34 45.6 144-15.1 2 42.2 +42 20. 16.7 22 19.3 141- 7.1 2 48.8 +50 24. >16. 128 20.3 136+ 4.1 2 54.7 +64 18. >15.5 185 18.3 255-59.1 2 55.16 -44 22.3 373 138+ 2.1 3 06.3 +61 08. 12.3 > 34 - 62 16.8 220-53.1 3 31.2 -26 01. 390 + 53 11.0 27142+ 3.1 3 32.01 +59 53.8 < 12 147- 2.1 3 38.0 +52 07. 4 - 32 159-15.1 3 44.3 +34 54. 12.4 7 - 14 15. 15149- 1.1 3 47.9 +51 20. 75 17.8 171-25.1 3 50.6 +19 19. 13.9 40 - 17 17.2 161-14.1 3 53.2 +33 43. 12.6 7 - 28 15.3 18144+ 6.1 4 02.7 +60 47. 13.3 52 + 35 14.2 284-39.1 4 03.32 -70 23.0 29 165-15.1 4 06.1 +30 39. 10. >114 + 81 9.4 147+ 4.1 4 09.2 +56 49. 12 - 7 151+ 0.1 4 09.63 +51 43.4 8 206-40.1 4 11.9 -12 52. 9.6 > 18 - 5 11.6 19153- 1.1 4 12.21 +48 42.2 2 151+ 2.1 4 15.9 +52 59. 215 13.9 149+ 4.1 4 16.68 +56 11.0 146+ 7.1 4 21.5 +60 00. 167- 9.1 4 33.37 +33 33.4 174-14.1 4 34.3 +24 57. 20 - 27 165- 6.1 4 36.46 +36 39.9 166- 6.1 4 39.56 +36 01.2 12 160- 0.1 4 43.12 +44 22.6 92 >20. 163- 0.1 4 51.00 +42 11.8 116 >20. 215-30.1 5 00.9 -15 40. 13.2 770 + 18 15.5 190-17.1 5 02.8 +10 38. 12.9 > 7 - 23 14.2 17167- 0.1 5 03.2 +39 04. 16.6 60 19.7 173- 5.1 5 04.9 +30 44. 132 + 19 18.2 169- 0.1 5 14.8 +37 33. 47 - 8 16.2 215-24.1 5 25.2 -12 44. 10.7 12 + 53 9.6 22172+ 0.1 5 25.6 +36 00. >18.9 37 >20. 178- 2.1 5 28.42 +28 56.5 11 + 62 197-14.1 5 29.1 + 6 54. 15.2 35 19.6 176+ 0.1 5 34.5 +31 57. 41 196-12.1 5 34.6 + 8 14. 17.1 32 193- 9.1 5 37.9 +12 19. 24 + 22 170+ 4.1 5 37.90 +39 13.6 + 24 196-10.1 5 39.4 + 9 04. 12.4 > 18 + 14 14.9 184- 2.1 5 43.8 +24 21.0 2 + 8 181+ 1.1 5 49.65 +28 05.8 + 39 >18. 166+10.1 5 52.6 +46 07. 11.2 > 8 - 36 10.5 20184+ 0.1 5 55.67 +25 18.5 2 + 25 286-29.1 5 58.83 -75 40.5 198- 6.1 5 59.6 + 9 39. 13.9 37 19.1 243-25.1 6 00.40 -37 25.4 52 204- 8.1 6 02.2 + 3 57. >16.0 154 18.8 197- 3.1 6 08.4 +11 47. >18.2 34 15.0 197- 2.2 6 10. +12 24. 35 184+ 4.1 6 10.79 +26 53.8 3 + 16 201- 4.1 6 11.85 + 7 35.5 40 >20. 197- 2.1 6 12.4 +12 23. 127 + 31 11.4 196- 1.1 6 13.0 +14 17. 325 158+17.1 6 15.38 +55 38.0 11.2 20 15.4 195- 0.1 6 16.0 +15 18. 68 11.5 221-12.1 6 19.40 -12 57.7 12.9 4 + 53 20204- 3.1 6 21.24 + 5 31.8 23 194+ 2.1 6 23.0 +17 49. 12.4 > 8 + 47 16.2 18247-21.1 6 23.84 -39 50.0 152 233-16.1 6 25.0 -25 21. 16.3 34 15.7 211- 3.1 6 33.18 - 0 03.1 < 5 189+ 7.1 6 34.3 +24 03. 29 - 29 201+ 2.1 6 37.15 +11 09.3 216- 4.1 6 39.11 - 4 59.7 15 18.2 153+22.1 6 39.3 +61 50. 15.9 148 17.4 210- 0.2 6 42.03 + 1 22.1 5 210- 0.1 6 42.04 + 1 22.7 208+ 1.1 6 44.42 + 4 40.6 221- 4.1 6 46.2 - 9 29. >18.5 44 19.9 204+ 4.1 6 49.8 +10 02. 414 18.2 210+ 1.1 6 50.9 + 3 16. 19 + 52 216- 0.1 6 53.7 - 2 49. 17.5 75 200+ 8.1 6 57.1 +14 41. 17.0 69 210+ 3.1 6 57.82 + 4 25. 232 226- 3.1 7 00.48 -13 38.1 242-11.1 7 00.93 -31 31.0 12 + 76 223- 2.1 7 01.0 -10 30. 79 16.8 212+ 4.1 7 02.7 + 2 52. +144 217+ 2.1 7 04.3 - 3 00. 225- 2.1 7 04.4 -11 41. 219+ 1.1 7 04.8 - 5 05. > 37 18.6 234- 6.1 7 04.8 -21 57. 65 >21. 215+ 3.1 7 06.83 - 0 43.5 > 55 + 42 11.1 232- 4.1 7 09.10 -19 46.0 + 14 229- 2.1 7 10.2 -16 03. 66 >21. 240- 7.1 7 12.82 -27 45.1 + 84 258-15.1 7 13.39 -46 52.9 225+ 0.1 7 13.77 -10 47.6 29 241- 7.1 7 14.55 -29 14.0 5 224+ 1.1 7 15.06 -10 05.2 62 16.4 247-10.1 7 16.41 -34 49.1 235- 3.1 7 17.21 -21 38.3 245- 8.1 7 17.23 -32 29.6 232- 1.1 7 19.03 -18 02.9 10 + 46 232- 0.1 7 19.03 -18 02.9 214+ 7.1 7 20.4 + 1 52. 16.3 64 15.7 242- 6.1 7 22.25 -28 53.5 189+19.1 7 22.4 +29 35. 13.0 > 55 + 20 14.7 221+ 5.1 7 24.11 - 5 15.7 13 + 95 247- 8.1 7 24.43 -34 50.9 235- 1.1 7 25.76 -20 07.2 +131 244- 6.1 7 26.03 -30 35.9 233- 0.1 7 26.04 -17 50.6 244- 6.2 7 26.09 -30 39.3 205+14.1 7 26.2 +13 21. + 40 197+17.1 7 26.2 +21 01. 9.9 > 15 + 79 10.5 54248- 8.1 7 27.07 -35 39.0 6 234- 0.1 7 29.62 -19 21.1 1 215+11.1 7 33.5 + 2 49. 15.4 87 19.1 256-11.1 7 33.81 -43 54.4 226+ 5.1 7 34.93 - 9 32.0 > 3 + 49 244- 4.1 7 35.40 -30 00.7 228+ 5.1 7 38.01 -11 25.5 3 +100 235+ 1.1 7 39.00 -18 52.3 249 8.5 231+ 4.2 7 39.54 -14 37.1 10.1 > 66 + 77 17.5 245- 3.1 7 39.62 -29 52.2 234+ 2.1 7 39.69 -18 05.4 10.8 > 14 + 61 15.2 24231+ 4.1 7 39.75 -14 14.1 32 + 18 19.1 246- 4.1 7 40.03 -31 39.3 249- 5.1 7 41.4 -34 38. 54 248- 4.1 7 44.88 -33 18.4 243- 1.1 7 45.39 -27 12.6 12.6 > 19 + 68 19.1 232+ 5.1 7 45.75 -14 00.2 232- 5.1 7 45.75 -14 00.2 264-12.1 7 46.01 -51 07.6 < 10 243- 0.1 7 47.62 -27 27.9 236+ 3.1 7 48.0 -19 10. 37 >21. 217+14.1 7 49.1 + 3 08. 13.6 >229 + 13 16.5 276-18.1 7 50.10 -64 08.0 27 268-14.1 7 50.33 -55 34.2 259- 9.2 7 50.94 -45 43.1 252- 4.1 7 51.13 -36 36.0 259- 9.1 7 51.20 -45 04.2 241+ 2.1 7 53.05 -23 30.3 14 + 74 164+31.1 7 53.9 +53 33. 14. 399 - 89 16.5 262-10.1 7 54.16 -48 41.7 251- 3.1 7 54.27 -35 34.1 259- 7.1 7 57.91 -44 35.7 261- 8.2 7 58.01 -46 53.8 269-13.1 7 58.11 -55 28.3 263- 9.1 7 58.95 -48 22.6 261- 8.1 7 59.87 -46 48.6 245+ 1.1 8 00.42 -27 33.5 7 + 64 262- 8.1 8 01.2 -47 49. 258- 6.1 8 01.5 -42 45. 251- 1.1 8 02.33 -34 07.5 29 224+15.1 8 04.2 - 2 43. 15.4 168 17.8 238+ 7.2 8 06.5 -19 05. 40 246+ 2.1 8 06.52 -27 32.4 265- 9.1 8 06.95 -50 23.9 238+ 7.1 8 06.99 -18 32.8 250+ 0.1 8 07.0 -32 31. 18.1 34 240+ 7.1 8 08.48 -20 22.6 8 252- 0.1 8 09.87 -35 12.3 264- 8.1 8 10.03 -48 34.3 12.4 46 258- 3.1 8 12.47 -41 33.3 251+ 0.1 8 12.62 -33 37.7 245+ 5.1 8 13.65 -25 49.3 251+ 1.1 8 13.92 -33 06.5 254+ 0.1 8 19.0 -36 03. 263- 5.1 8 19.06 -46 13.4 < 10 261- 4.1 8 19.40 -44 14.2 260- 3.1 8 22.0 -43 03. 262- 4.1 8 22.47 -45 17.1 257- 0.1 8 25.73 -38 43.8 258- 0.1 8 26.63 -39 13.7 < 10 257+ 0.1 8 29.06 -38 09.7 249+ 6.1 8 29.61 -27 35.3 252+ 4.1 8 29.8 -31 55. >17.9 49 >21. 239+13.1 8 31.08 -15 58.7 13.6 > 37 + 88 15.5 264- 3.1 8 32.83 -46 15.3 248+ 8.1 8 34.12 -26 14.1 < 10 255+ 3.1 8 34.32 -35 05.4 259+ 0.1 8 35.28 -39 15.9 65 259+ 0.2 8 36.1 -39 34. 158+37.1 8 37.7 +58 24. >14.6 284 16.1 244+12.1 8 38.0 -20 43. 14.3 393 17.8 254+ 5.1 8 38.65 -32 11.8 9 + 57 256+ 3.1 8 39.22 -35 51.9 265- 2.1 8 41.78 -45 55.8 < 5 267- 3.1 8 41.89 -48 43.9 208+33.1 8 44.0 +18 04. 15.6 109 14.3 268- 3.1 8 45.02 -49 10.2 263+ 0.1 8 46.85 -42 42.6 270- 5.1 8 49.3 -52 25. 266- 1.1 8 50.29 -46 06.7 < 10 270- 4.1 8 51.2 -51 30. 219+31.1 8 51.5 + 9 06. 12.2 >980 15.5 261+ 2.1 8 51.63 -39 52.2 20 269- 3.1 8 52.72 -50 20.9 < 25 261+ 4.1 8 54.33 -38 50.6 266- 0.1 8 54.89 -46 12.4 253+10.1 8 55.7 -28 45. 59 16.4 266+ 0.1 8 57.51 -45 23.8 266+ 1.1 9 02.4 -44 21. 270- 2.1 9 04.30 -50 07.1 264+ 3.1 9 05.25 -42 03.3 285-14.1 9 06.63 -69 44.4 11.5 8 - 24 273- 3.1 9 07.12 -53 07.0 < 25 + 40 266+ 2.2 9 07.2 -44 05. 261+ 6.1 9 07.27 -37 30.6 266+ 2.1 9 08.5 -44 12. 265+ 4.1 9 10.56 -42 13.3 13.5 11 + 14 277- 7.1 9 11.28 -58 38.1 39 275- 4.2 9 12.39 -55 15.8 < 10 279- 8.1 9 12.43 -60 33.5 275- 4.1 9 13.61 -54 40.2 < 10 227+33.1 9 13.8 + 4 06. >16.1 120 19.4 261+ 8.1 9 14.01 -36 25.2 13.0 38 + 8 268+ 2.1 9 14.34 -45 16.2 < 5 282-10.1 9 15.78 -64 45.6 275- 3.1 9 16.48 -54 26.8 5 278- 6.1 9 18.10 -58 59.3 < 10 278- 6.3 9 18.26 -58 51.1 278- 5.1 9 20.01 -58 05.9 9.7 11 + 8 14.9 275- 2.1 9 20.53 -53 56.8 < 25 278- 6.2 9 21.85 -58 39.1 272+ 0.1 9 22.4 -50 02.2 264+ 8.1 9 22.50 -38 23.7 275- 3.2 9 22.96 -54 33.6 275- 2.2 9 23.18 -54 23.3 20 277- 3.1 9 25.50 -55 53.4 120 + 4 >14275- 1.1 9 29.15 -52 56.7 < 10 278- 4.1 9 29.41 -57 23.6 40 274- 0.1 9 29.70 -51 54.0 24 277- 3.2 9 29.90 -56 04.4 110 266+ 8.1 9 30.73 -39 20.6 271+ 3.1 9 31.64 -46 21.3 268+ 7.1 9 32.7 -41 28. 282- 7.1 9 35.74 -62 13.6 274+ 1.1 9 36.2 -49 56. 238+34.1 9 36.6 - 2 34. 13.4 268 + 60 15.5 >30274+ 2.3 9 36.76 -49 32.2 281- 5.1 9 37.35 -59 51.9 11.3 < 25 + 33 277- 1.1 9 38.0 -54 40. 283- 7.1 9 38.65 -62 58.7 279- 3.2 9 39.31 -56 44.4 35 274+ 2.1 9 39.41 -49 09.0 < 10 274+ 2.2 9 39.81 -49 44.2 5 279- 3.1 9 41.84 -57 03.1 < 25 248+29.1 9 43.2 -12 56. 14.5 288 16.2 274+ 3.2 9 45.0 -49 09.7 285- 9.1 9 45.12 -65 29.2 221+45.1 9 45.25 +13 30.7 274+ 3.1 9 45.55 -48 44.2 30 274+ 3.3 9 46.37 -48 19.4 281- 4.1 9 46.82 -59 18.0 278+ 0.1 9 50.3 -53 20. 280- 2.2 9 51.35 -57 11.3 280- 2.1 9 53.07 -57 04.7 < 10 279+ 1.1 9 57.87 -53 13.8 285- 7.1 9 58.08 -64 29.4 24 284- 5.1 10 00.51 -61 42.8 282- 2.1 10 00.58 -57 59.3 280- 0.1 10 01.13 -55 35.0 283- 4.1 10 02.23 -60 29.2 < 25 - 23 275+ 6.1 10 02.87 -46 51.8 274+ 9.1 10 03.73 -44 04.2 48 289-11.1 10 04.70 -69 46.5 272+12.1 10 04.91 -41 12.0 8.2 > 47 - 7 8.8 13286- 6.2 10 05.46 -64 07.1 286- 6.1 10 05.91 -63 39.8 < 10 288- 8.1 10 07.47 -66 45.3 285- 5.1 10 07.78 -62 22.0 13.0 4 + 39 296-20.1 10 10.1 -80 37. 38 280+ 2.1 10 10.10 -52 24.3 278+ 5.1 10 11.30 -50 05.1 < 25 283- 1.1 10 13.83 -58 36.2 30 286- 4.1 10 16.21 -62 25.2 11.8 12 - 20 289- 8.1 10 19.62 -67 16.8 285- 2.1 10 21.40 -60 17.5 < 5 261+32.1 10 22.4 -18 23. 8.6 > 16 + 2 11.5 23286- 2.1 10 24.92 -60 40.3 285- 1.1 10 26.7 -58 48. 285- 1.2 10 27.47 -59 34.3 282+ 3.1 10 29.54 -53 18.0 30 283+ 2.1 10 29.61 -55 05.4 < 10 270+24.1 10 32.18 -28 55.7 283+ 3.1 10 32.31 -53 25.6 < 25 + 79 287- 2.1 10 33.79 -60 23.3 288- 5.1 10 34.04 -64 03.6 14.2 10 10285+ 1.1 10 36.50 -56 31.5 < 5 285+ 1.2 10 37.58 -56 50.6 < 10 285+ 2.1 10 39.33 -55 53.6 288- 2.1 10 42.64 -61 23.9 < 25 286+ 2.1 10 46.68 -55 47.3 < 25 288- 0.1 10 51.99 -60 10.7 72 10.5 288+ 0.1 10 52.56 -58 53.7 33 289- 1.1 10 54.0 -61 11. < 25 289- 0.1 10 54.16 -60 11.2 35 8. V 283+12.1 10 55.03 -45 54.4 24 288+ 0.2 10 57.60 -58 45.0 42 291- 4.1 10 58.40 -64 58.8 5 + 13 289- 0.2 10 58.9 -60 33. 289+ 1.1 11 01.15 -58 11.3 295-13.1 11 01.18 -74 37.1 39 290- 0.1 11 01.86 -60 19.8 28 288+ 5.1 11 04.32 -54 32.3 < 10 285+11.1 11 06.87 -47 46.6 286+10.1 11 08.30 -48 49.8 292- 3.1 11 08.45 -63 26.9 286+11.1 11 11.53 -47 49.2 216 148+57.1 11 11.9 +55 17. 12.0 194 + 5 13.2 41287+10.1 11 14.76 -48 55.7 295- 9.1 11 15.75 -70 33.1 < 10 288+ 8.1 11 15.87 -51 53.7 36 295- 9.2 11 16.1 -70 22. 292- 1.1 11 21.02 -62 03.9 289+ 7.1 11 21.69 -52 34.9 < 10 283+25.1 11 24.28 -34 05.7 181 28291+ 3.1 11 25.09 -57 01.4 < 10 + 72 292+ 1.1 11 25.67 -59 40.9 67 - 6 >18290+ 7.1 11 26.25 -52 39.6 > 25 + 28 292+ 1.2 11 26.50 -59 50.1 < 5 290+ 9.1 11 27.57 -50 58.8 292+ 1.3 11 28.5 -59 01. 289+10.1 11 29.05 -49 42.0 294- 4.1 11 29.51 -65 41.6 < 10 292+ 4.1 11 30.94 -56 49.7 < 10 293+ 1.1 11 32.84 -60 00.6 30 294- 0.2 11 35.73 -61 59.3 296- 6.1 11 36.89 -68 35.5 < 5 296- 6.2 11 37.0 -68 30. 294- 0.1 11 39.3 -62 12. 69 294+ 0.1 11 42.15 -60 55.0 293+ 5.1 11 43.25 -56 04.2 292+10.1 11 45.15 -51 11.5 296- 3.1 11 46.22 -64 51.9 < 5 294+ 4.1 11 47.82 -56 54.3 8.4 12 - 13 20293+10.1 11 50.55 -50 34. 82 - 17 295+ 6.1 11 53.7 -55 16. 295+ 4.1 11 53.78 -56 55.6 294+12.1 11 57.62 -49 09.3 297- 3.1 11 57.84 -65 30.8 294+14.1 11 58.17 -47 16.5 63 295+ 7.1 12 00.88 -54 07.8 298- 4.1 12 01.62 -67 01.6 75 + 12 >11298- 1.2 12 05.79 -63 55.5 < 25 298- 0.1 12 06.39 -62 59.4 < 25 297+ 3.1 12 06.54 -58 25.9 < 5 296+10.1 12 07.46 -51 29.8 298- 1.1 12 12.65 -63 22.5 < 5 297+13.1 12 13.87 -48 54.9 297+ 7.1 12 14.69 -54 19.1 275+72.1 12 15.8 +11 19. 690 17.7 299- 0.2 12 17.22 -62 38.7 299- 0.1 12 19.62 -60 00.6 < 10 299- 1.1 12 20.25 -63 45.2 < 25 299+ 2.1 12 21.14 -59 56.6 30 294+43.1 12 21.9 -18 31. 10.3 > 45 + 9 12.9 >23300- 2.2 12 25.78 -65 02.7 300+ 0.1 12 25.91 -61 49.0 < 25 300- 0.1 12 25.95 -63 28.0 - 44 300- 1.1 12 27.28 -63 36.4 < 10 300- 3.1 12 27.53 -65 57.8 18 300- 2.1 12 27.65 -64 35.5 < 5 299+18.1 12 28.18 -43 57.8 62 123+34.1 12 31.6 +82 50. 11.6 > 6 - 42 11.4 8301+ 1.1 12 32.05 -61 22.5 302- 5.1 12 40.29 -67 56.2 302- 0.1 12 42.81 -62 44.1 < 10 302+ 2.1 12 42.98 -60 03.8 12 302- 0.2 12 43.46 -63 08.1 302+ 0.1 12 45.47 -62 33.1 302- 0.3 12 45.50 -63 33.6 45 303+ 1.1 12 50.23 -61 29.9 303+40.1 12 50.9 -22 36. 12.0 709 - 6 49+88.1 12 57.0 +27 54. 16.0 -141 304+ 5.2 12 57.68 -56 37.5 36 304+ 5.1 13 02.75 -57 23.3 < 10 304- 4.1 13 05.45 -67 22.7 12.0 5 - 13 14305+ 1.1 13 06.45 -61 03.6 < 10 305- 0.1 13 06.87 -62 55.5 < 5 305+ 3.2 13 07.21 -59 29.2 305+ 3.1 13 11.37 -58 35.9 305- 3.1 13 16.11 -65 53.4 24 306- 0.1 13 19.23 -63 05.1 25 307+ 5.1 13 21.19 -57 15.7 18 310+24.1 13 22.75 -37 29.6 115 306- 0.2 13 22.86 -63 18.8 307+ 1.1 13 22.9 -61 00. 307- 1.1 13 25.24 -63 34.2 < 10 305-13.1 13 29.98 -75 31.1 72 307- 3.1 13 29.99 -65 43.2 10.3 153 - 9 14.1 31307- 1.2 13 34.20 -63 45.4 308+ 0.1 13 34.27 -61 32.8 309+ 6.1 13 35.70 -55 51.8 307- 4.1 13 35.92 -67 07.6 12.2 < 25 - 55 10308+ 0.2 13 36.94 -61 51.3 308- 1.1 13 37.55 -64 00.5 318+41.1 13 37.9 -19 38. 13.0 293 + 36 11.5 28309+ 0.1 13 39.2 -61 08. < 10 309+ 1.1 13 40.57 -60 34.6 73 310+ 6.1 13 40.73 -55 04.5 307- 9.1 13 41.38 -71 13.9 < 5 309+ 0.2 13 46.06 -61 16.9 312+10.1 13 47.86 -50 57.5 12.1 13 + 40 15309- 4.1 13 48.77 -66 08.6 25 - 2 310+ 2.1 13 50.00 -58 42.9 309- 4.2 13 50.19 -66 16.1 13.0 5 - 31 14.9 >40311+ 3.1 13 51.52 -58 12.6 < 10 311+ 2.2 13 52.3 -59 08. 68 311+ 2.1 13 54.77 -58 39.9 < 10 310- 3.1 13 56.6 -65 11. 317+19.1 14 00.25 -41 08.9 326+42.1 14 01.7 -17 01. 14.9 43 - 27 17.7 310- 2.1 14 01.85 -64 26.4 20 - 21 311- 0.1 14 05.09 -62 15.7 313+ 4.1 14 05.33 -56 50.3 311- 2.1 14 07.91 -64 03.3 315+ 9.1 14 08.55 -51 12.3 < 5 312- 2.1 14 10.38 -63 11.7 < 10 308-12.1 14 10.8 -73 59.0 35 308-12.2 14 10.89 -73 53.0 316+ 8.1 14 14.78 -51 56.8 < 25 - 8 12311- 6.1 14 14.93 -67 15.4 312- 1.1 14 14.95 -62 53.3 < 25 313+ 1.1 14 15.28 -59 38.8 315+ 5.1 14 17.33 -55 14.4 < 10 319+15.1 14 19.25 -43 55.8 10.6 > 28 - 36 14.7 6314- 0.2 14 27.32 -61 07.6 314- 0.1 14 29.3 -60 42. 315- 0.1 14 29.51 -60 36.4 30 - 6 22322+14.1 14 35.03 -44 00.0 48 313- 5.1 14 36.74 -65 38.0 319+ 6.1 14 37.03 -52 22.1 < 25 317+ 3.1 14 37.97 -56 02.3 45 318+ 3.1 14 40.1 -56 05. 333+32.1 14 42.07 -23 35.0 315- 4.1 14 48.51 -63 50.0 321+ 3.1 14 56.25 -54 06.2 324+ 9.1 14 58.23 -48 09.2 18 318- 2.1 15 00.16 -60 41.6 30 - 37 320+ 0.1 15 01.49 -57 20.0 147 318- 2.3 15 01.55 -60 37.2 321+ 2.1 15 01.57 -54 59.5 < 5 - 63 318- 2.2 15 02.01 -61 09.8 45 321+ 2.2 15 02.24 -55 47.6 < 5 - 29 327+13.1 15 02.92 -42 48.4 < 5 320+ 0.2 15 03.3 -57 36.8 318- 3.1 15 04.65 -61 32.6 42 339+29.1 15 05.44 -23 03.4 317- 5.1 15 06.41 -64 29.0 50 - 11 321+ 1.1 15 08.18 -55 28.5 30 - 14 331+16.1 15 09.64 -37 56.3 13.3 3 -129 >40327+10.1 15 13.42 -45 27.9 10.5 7 + 21 >40320- 1.1 15 14.2 -59 28. 320- 1.2 15 14.36 -59 27.2 321- 0.1 15 15.6 -57 11. 321- 0.2 15 17.20 -57 46.2 323+ 2.1 15 18.58 -53 57.4 < 25 - 12 342+27.1 15 19.38 -23 26.9 7 + 46 17.3 13322- 0.1 15 19.82 -56 58.7 < 10 324+ 2.1 15 19.87 -53 40.8 < 25 - 27 325+ 4.3 15 21.1 -51 26. 325+ 4.2 15 21.17 -51 39.3 < 5 325+ 4.1 15 21.49 -51 09.1 < 5 325+ 3.1 15 21.84 -52 40.1 < 10 321- 1.1 15 22.91 -58 48.2 319- 4.1 15 23.22 -62 20.7 21 322- 2.1 15 30.23 -58 59.1 12.5 > 26 - 33 315-13.1 15 31.88 -71 45.0 5 10.5 323- 2.1 15 33.98 -58 34.7 < 25 -131 324- 1.1 15 38.04 -56 26.8 < 10 330+ 5.1 15 38.66 -47 31.2 106 326+ 0.1 15 41.2 -53 53. 319- 9.1 15 42.50 -66 20.0 < 10 322- 5.1 15 43.44 -61 03.9 < 25 + 23 338+14.1 15 44.62 -35 19.3 328+ 1.1 15 45.77 -52 21.4 12 346+22.1 15 46.92 -24 16.5 326- 1.2 15 47.3 -56 12. 330+ 4.1 15 47.63 -48 35.9 330+ 4.2 15 47.71 -48 17.1 322- 6.1 15 47.82 -62 21.8 < 10 329+ 1.1 15 47.9 -51 22.5 329+ 2.1 15 47.94 -51 22.5 13.6 76 - 36 326- 1.3 15 49.0 -56 15. 335+ 9.1 15 49.80 -41 41.6 36 331+ 3.1 15 49.84 -48 34.5 326- 1.1 15 50.81 -55 20.8 < 10 329+ 1.2 15 51.1 -51 13.7 100 320- 9.1 15 51.33 -66 00.3 < 25 - 47 327- 1.2 15 54.17 -55 33.3 < 5 - 60 325- 4.1 15 55.03 -58 15.3 < 25 - 46 343+15.1 15 55.62 -31 51.8 326- 3.1 15 55.7 -57 21. 328- 0.1 15 55.73 -53 37.4 327- 2.1 15 55.98 -55 47.1 < 5 - 73 321- 9.1 15 56.72 -64 39.5 21 332+ 3.1 15 56.73 -48 07.1 327- 1.1 15 57.05 -54 57.2 < 25 - 35 341+13.1 15 58.13 -34 24.0 45 -125 336+ 8.1 15 58.80 -41 25.2 323- 7.1 16 00.09 -62 14.5 340+12.1 16 00.10 -35 52.6 59 64+48.1 16 02.7 +40 49. 13.3 > 23 + 3 13.6 332+ 1.1 16 03.25 -49 18.6 340+10.1 16 05.14 -37 00.9 79 339+ 9.1 16 05.14 -38 54.9 331+ 0.1 16 05.21 -50 54.1 < 25 345+15.1 16 06.58 -30 46.2 71 328- 2.1 16 06.71 -54 49.7 20 + 76 321-11.1 16 07.55 -66 31.4 18 331+ 0.2 16 07.95 -51 10.1 121 334+ 3.1 16 09.02 -46 29.9 342+10.1 16 09.69 -36 06.1 14.1 40 + 6 17.5 25+40.1 16 09.9 +12 12. 10.9 > 12 + 27 11.0 13327- 4.1 16 09.93 -56 51.9 < 25 343+11.1 16 10.22 -34 28.0 2 329- 2.1 16 10.44 -54 40.1 < 5 -113 329- 2.2 16 10.56 -54 49.5 12.6 27 - 29 19326- 6.1 16 11.42 -59 46.5 < 5 330- 2.3 16 11.43 -53 44.1 325- 7.1 16 11.49 -60 55.0 333+ 1.1 16 11.62 -49 05.9 < 5 - 63 321-11.2 16 12.25 -66 30.6 21 332- 0.1 16 12.94 -51 10.2 330- 2.2 16 13.00 -53 17.2 330- 2.1 16 13.32 -53 24.7 20 - 50 331- 1.1 16 13.39 -51 51.9 24 - 35 332- 0.2 16 15.69 -50 30.6 338+ 5.1 16 15.91 -42 08.4 < 25 - 27 333- 0.1 16 17.2 -49 54. 338+ 5.2 16 17.65 -42 16.8 < 10 331- 2.1 16 18.30 -53 33.8 < 5 13+32.1 16 18.5 - 0 10. - 87 14.4 327- 6.1 16 19.31 -58 12.4 < 5 - 39 346+12.1 16 20.1 -31 38. >15.7 92 - 12 20. 336+ 1.1 16 20.25 -46 35.4 12 - 76 330- 3.1 16 20.36 -54 29.1 < 25 - 86 331- 2.2 16 20.71 -53 15.6 < 25 - 98 334+ 0.1 16 21.2 -48 37. 331- 3.1 16 23.88 -53 54.8 < 5 327- 7.1 16 25.24 -59 03.1 < 25 - 45 47+42.1 16 25.5 +28 01. 13.7 170 15.6 332- 3.1 16 25.95 -53 16.6 < 25 - 77 331- 3.2 16 26.02 -54 02.9 35 - 18 337+ 1.1 16 26.81 -45 56.3 < 5 341+ 5.1 16 28.08 -40 08.7 11.5 25 + 28 336- 0.1 16 30.17 -48 00.6 300 - 52 6.8 335- 1.1 16 30.46 -49 15.0 < 25 346+ 8.1 16 30.78 -34 59.2 < 10 332- 4.1 16 31.37 -53 44.0 < 5 342+ 5.1 16 32.98 -39 45.6 < 10 331- 5.1 16 33.63 -55 36.4 < 5 338+ 1.1 16 34.86 -45 17.7 < 5 345+ 6.1 16 36.13 -36 28.3 < 5 339+ 0.1 16 37.91 -45 07.3 < 10 61+41.1 16 38.55 +38 47.8 352+11.1 16 38.6 -27 53. 344+ 4.1 16 39.15 -38 48.9 < 10 339+ 0.2 16 39.62 -45 55.1 < 10 326-10.1 16 40.00 -62 31.8 < 5 0+17.1 16 40.9 -18 51. 5 - 44 352+11.2 16 41.70 -27 58.6 339- 0.1 16 41.83 -46 05.6 43+37.1 16 42.4 +23 54. 9.3 > 14 - 36 12.0 20345+ 4.1 16 43.35 -38 31.6 347+ 5.1 16 45.58 -35 41.9 < 5 359+15.1 16 45.6 -20 56. 16.8 29 19.6 344+ 3.1 16 46.1 -39 15. 345+ 3.1 16 47.00 -39 03.2 351+ 9.1 16 47.10 -30 14.8 344+ 2.1 16 47.2 -39 58. 355+11.1 16 48.26 -25 55.4 341- 0.1 16 49.79 -44 47.9 < 10 325-12.1 16 49.82 -64 09.7 < 10 342+ 0.1 16 49.96 -42 34.5 16 351+ 7.1 16 50.40 -31 35.7 345+ 3.2 16 51.04 -38 39.3 353+ 8.1 16 52.61 -29 45.6 12.8 < 5 - 44 344+ 0.1 16 53.88 -41 33.3 5 347+ 3.1 16 54.1 -37 02. 313-21.1 16 54.22 -78 22.8 24 336- 5.1 16 55.68 -51 37.6 < 25 - 67 321-16.1 16 55.76 -70 01.6 < 10 337- 5.1 16 57.76 -50 18.7 < 10 + 58 349+ 4.1 16 57.79 -34 45.3 < 5 -184 0+12.1 16 58.57 -21 45.2 10.7 > 9 - 25 15. 15334- 7.1 16 59.00 -53 51.5 351+ 5.1 16 59.05 -33 05.8 5 - 98 351+ 4.1 17 00.51 -33 25.6 < 10 - 40 353+ 6.2 17 01.10 -30 49.3 < 10 - 76 347+ 1.1 17 01.16 -37 49.1 350+ 4.1 17 01.31 -33 55.2 5 - 20 345+ 0.1 17 01.68 -40 49.1 13.6 19 + 11 343- 1.1 17 02.0 -43 52. 353+ 6.1 17 02.03 -30 28.2 8 - 56 352+ 5.1 17 02.26 -32 28.1 4 + 32 336- 6.1 17 02.27 -52 26.0 < 10 - 46 358+ 9.1 17 02.7 -25 20. 342- 2.1 17 02.76 -44 09.2 20 10+18.1 17 02.8 -10 02. 4 10+18.2 17 02.88 -10 04.4 20 + 91 344- 1.1 17 03.42 -42 37.2 12 342- 2.2 17 03.88 -44 18.8 351+ 3.1 17 04.07 -34 01.3 336- 7.1 17 05.64 -52 09.3 345- 0.1 17 06.04 -41 32.4 345- 1.1 17 06.92 -41 49.1 8 352+ 4.1 17 06.96 -32 55.1 357+ 7.1 17 07.58 -27 05.1 < 10 +156 334- 9.1 17 07.62 -55 20.3 13.4 21 + 39 340- 4.1 17 07.71 -47 21.3 352+ 3.1 17 08.95 -32 34.2 358+ 7.1 17 09.56 -25 40.1 4 + 15 18+20.1 17 10.24 - 3 12.4 13.4 + 22 12.4 349+ 1.1 17 10.35 -37 02.7 12.8 50 - 40 8354+ 4.1 17 10.89 -31 16.3 4 - 75 9+14.1 17 11.25 -12 51.2 10.8 > 16 - 49 13. 352+ 3.2 17 11.43 -33 21.4 3 354+ 4.2 17 12.08 -31 30.7 336- 8.1 17 13.12 -53 33.1 21 356+ 5.1 17 14.1 -28 56. 333-11.1 17 14.70 -56 51.3 12 355+ 4.1 17 14.73 -29 58.6 348- 0.1 17 14.93 -39 16.1 354+ 3.1 17 15.63 -31 36.0 355+ 3.1 17 15.8 -30 51. 342- 4.1 17 15.84 -45 50.2 35 355+ 3.3 17 16.1 -31 08. 359+ 6.1 17 16.14 -25 14.2 10 - 67 338- 8.1 17 16.82 -51 42.2 12.2 14 + 15 356+ 4.1 17 17.38 -28 57.7 < 10 + 83 356+ 4.3 17 17.9 -29 19. 356+ 4.2 17 17.90 -29 00.1 < 25 -156 358+ 5.1 17 18.06 -27 08.6 16 + 2 2+ 8.1 17 18.28 -22 15.6 4 + 2 355+ 3.2 17 18.32 -30 17.9 < 10 >40337- 9.1 17 18.60 -52 43.7 18 349- 1.1 17 18.83 -38 26.2 48 - 74 17. 358+ 5.2 17 19.3 -27 06. < 10 + 37 354+ 2.1 17 19.6 -32 11. 357+ 4.1 17 20.24 -28 56.3 4 20. 331-13.1 17 20.70 -59 29.6 355+ 2.1 17 20.76 -30 59.2 359+ 5.1 17 20.93 -25 56.7 < 5 + 73 355+ 2.3 17 21.20 -31 40.6 357+ 3.1 17 21.39 -29 21.6 5 -191 355+ 2.2 17 21.46 -30 49.3 352+ 0.2 17 21.6 -34 39. 358+ 4.1 17 21.72 -28 03.3 5 + 95 3+ 7.1 17 21.8 -21 31. 4 >21. 356+ 3.1 17 21.91 -29 42.6 356+ 2.1 17 22.1 -30 38. 345- 4.1 17 22.57 -44 08.8 < 5 359+ 4.1 17 22.61 -26 55.2 359+ 5.2 17 22.62 -26 09.3 16 - 79 18. 357+ 3.2 17 22.81 -29 19.3 4 - 69 352+ 0.1 17 23.07 -34 59.2 7 358+ 4.2 17 23.8 -27 41. 357+ 3.4 17 23.82 -29 13.0 6 -250 358+ 4.3 17 24.04 -27 41.5 342- 6.1 17 24.07 -46 53.2 < 10 358+ 3.1 17 24.18 -28 25.4 3 - 97 357+ 3.5 17 24.22 -29 18.7 357+ 3.3 17 24.35 -29 00.4 358+ 3.2 17 24.39 -28 28.7 < 5 + 50 358+ 3.9 17 24.63 -28 08.6 1+ 5.1 17 25.0 -24 22.9 7 + 34 352- 0.1 17 25.12 -35 05.1 10 358+ 3.5 17 25.28 -28 36.2 < 10 358+ 3.3 17 25.5 -28 24. 358+ 3.1017 25.54 -28 24.9 1+ 5.2 17 25.55 -24 48.7 5 346- 4.1 17 25.6 -42 30. 357+ 2.5 17 25.64 -30 05.4 7 + 29 >21. 357+ 2.1 17 25.7 -29 05. < 9. 11+11.1 17 25.74 -13 23.9 < 10 +104 357+ 2.2 17 25.9 -29 12. 357+ 2.3 17 25.91 -29 41.0 6+ 8.1 17 26.01 -19 13.5 < 10 + 89 9+10.1 17 26.17 -15 10.7 17.2 12 16.1 357+ 2.8 17 26.27 -29 44.8 0+ 4.2 17 26.28 -26 23.8 < 5 2+ 5.1 17 26.29 -23 43.3 12.9 > 30 - 99 16. 0+ 4.1 17 26.34 -25 46.8 >21. 344- 6.1 17 26.39 -45 20.5 358+ 3.7 17 26.51 -28 38.1 < 5 + 1 357+ 2.4 17 26.53 -29 30.5 < 25 -204 356+ 1.1 17 26.8 -30 35. 358+ 3.4 17 26.89 -27 57.0 < 25 + 65 359+ 3.5 17 27.10 -27 28.1 358+ 2.2 17 27.2 -29 08. 358+ 2.5 17 27.34 -28 33.7 358+ 3.6 17 27.58 -28 01.9 4 +186 4+ 6.1 17 27.6 -21 26. 5 357+ 2.7 17 27.6 -30 15. 359+ 3.2 17 27.65 -27 03.8 < 10 356+ 1.2 17 27.75 -30 58.9 359+ 3.1 17 27.8 -26 57. 357+ 2.6 17 27.93 -30 08.3 358+ 3.8 17 28.00 -28 12.6 < 25 358+ 2.1 17 28.1 -28 22. 358+ 2.4 17 28.62 -28 40.0 16+13.1 17 28.8 - 8 17. 17.8 58 19.8 350- 2.1 17 28.95 -37 55.2 < 25 359+ 3.4 17 28.96 -27 56.2 359+ 3.3 17 29.0 -27 03. < 8 359+ 2.5 17 29.22 -28 12.4 348- 4.1 17 29.27 -40 56.4 358+ 2.3 17 29.29 -29 03.0 349- 3.1 17 29.39 -39 50.3 357+ 1.1 17 29.58 -29 58.2 3 - 72 351- 1.1 17 29.62 -36 41.8 359+ 2.2 17 30.0 -28 19. < 8 357+ 1.2 17 30.07 -30 24.5 339- 9.1 17 30.48 -51 00.6 359+ 2.1 17 30.56 -28 05.3 < 10 4+ 6.2 17 30.62 -21 44.3 9 350- 2.2 17 30.9 -38 07. 359+ 2.7 17 31.08 -27 54.0 358+ 1.2 17 31.09 -29 27.2 < 5 6+ 7.1 17 31.34 -19 07.4 < 10 +141 3+ 5.1 17 31.42 -22 51.3 4 0+ 3.1 17 31.80 -26 34.1 5 -200 343- 7.1 17 31.94 -46 57.9 < 5 358+ 1.1 17 32.06 -29 01.3 -292 >21. 359+ 2.4 17 32.1 -28 05. 358+ 1.3 17 32.17 -29 43.4 < 5 >21. 349- 4.1 17 32.17 -40 10.1 7+ 7.1 17 32.23 -18 32.5 13.3 9 + 14 341- 9.1 17 32.26 -49 23.8 < 5 5+ 6.1 17 32.37 -20 55.4 10 + 1 0+ 2.1 17 32.45 -27 22.2 359+ 2.3 17 32.66 -27 41.5 2+ 4.1 17 32.91 -24 23.6 350- 3.1 17 33.03 -39 20.1 18 355- 0.1 17 33.04 -33 24.3 359+ 2.6 17 33.09 -27 58.9 5+ 5.1 17 33.38 -21 29.4 6 + 21 358+ 1.4 17 33.8 -29 38. 7+ 6.1 17 34.43 -18 45.0 7 - 67 356- 0.1 17 34.5 -32 14. 7+ 6.2 17 35.23 -19 36.0 6 - 7 4+ 4.1 17 35.49 -22 06.9 5 + 33 359+ 1.1 17 35.5 -28 41. 346- 6.1 17 35.69 -44 08.0 < 5 + 35 8+ 6.1 17 36.02 -18 16.0 < 10 2+ 2.1 17 36.14 -25 36.5 359+ 1.2 17 36.2 -28 46. 5+ 5.2 17 36.92 -21 12.5 15 3+ 3.1 17 37.06 -24 24.1 < 25 >21. 1+ 2.1 17 37.09 -26 42.8 < 10 5+ 4.1 17 37.28 -22 17.7 5 354- 2.1 17 37.3 -34 29. 344- 8.1 17 37.33 -47 01.8 1+ 1.1 17 37.34 -26 59.6 40 19.7 358+ 0.1 17 38.38 -30 05.2 4+ 3.1 17 38.6 -23 33. 5+ 4.2 17 38.60 -22 11.6 < 7 3+ 2.1 17 38.81 -24 40.7 6 - 61 3+ 3.2 17 38.89 -24 09.8 < 25 - 35 358- 0.1 17 39.1 -30 26. 10+ 7.1 17 39.17 -15 54.8 350- 5.1 17 39.42 -39 35.0 8 45+24.1 17 40.4 +21 28. 48 6+ 4.1 17 40.49 -21 08.6 4 -116 357- 1.1 17 40.9 -32 00. 355- 2.2 17 40.91 -34 16.3 < 10 355- 2.1 17 41.03 -34 05.4 8 - 76 352- 4.1 17 41.68 -38 07.6 5 351- 4.1 17 41.79 -38 16.2 346- 8.1 17 41.81 -44 53.1 13.1 13 - 49 15 11+ 7.1 17 41.82 -15 44.0 345- 8.1 17 41.88 -46 04.0 10 - 84 351- 5.1 17 42.06 -38 38.6 < 10 355- 2.4 17 42.21 -34 32.7 < 5 + 86 328-17.1 17 42.24 -64 37.0 < 10 6+ 4.2 17 42.53 -20 57.0 4 +101 2+ 1.1 17 42.57 -25 38.8 4 5+ 3.1 17 42.58 -23 01.3 12 >21. 358- 0.2 17 42.75 -30 10.9 4 - 5 355- 2.3 17 42.79 -34 02.6 < 5 -188 358- 1.1 17 42.8 -31 03. 13 358- 1.3 17 42.81 -31 02.5 1+ 0.1 17 42.84 -26 57.0 2+ 1.2 17 43. -26 10. 51+25.1 17 43.0 +27 20. 43 19.7 8+ 5.1 17 43.3 -18 39. 7+ 4.1 17 43.3 -20 12. < 10 356- 2.2 17 43.47 -33 07.5 5 - 54 0- 0.2 17 43.86 -28 59.9 0- 0.1 17 44.00 -28 45.4 11+ 6.1 17 44.02 -16 16.4 5 + 4 356- 2.1 17 44.1 -32 49. 5 >21. 355- 3.1 17 44.51 -34 07.0 < 10 357- 2.1 17 44.52 -32 19.8 6+ 3.1 17 44.56 -21 46.4 6 6+ 3.2 17 44.62 -22 05.3 18 359- 0.1 17 44.73 -29 58.7 13.6 > 13 - 28 1- 0.1 17 45.08 -27 59.8 5+ 2.1 17 45.10 -22 45.8 11+ 5.1 17 45.44 -16 27.8 13.8 5 - 93 >18. 4+ 1.1 17 45.54 -24 15.6 5 6+ 2.1 17 45.60 -22 15.9 355- 3.2 17 45.64 -34 21.0 355- 3.3 17 45.91 -34 22.0 < 5 +160 4+ 2.1 17 45.96 -23 42.0 4 8+ 3.1 17 46.28 -19 59.7 13.2 > 34 + 16 19. 1- 0.2 17 46.4 -27 45. 353- 4.1 17 46.40 -37 00.6 < 10 1- 0.4 17 46.44 -27 39.9 356- 3.4 17 46.50 -33 31.2 356- 3.1 17 46.53 -33 59.8 5 358- 1.2 17 47.05 -30 56.7 359- 1.1 17 47.08 -30 34.1 7 - 62 0- 1.1 17 47.2 -29 24. 4 + 20 >21. 351- 6.1 17 47.27 -39 16.7 9 353- 5.1 17 47.34 -37 23.1 7 8+ 3.2 17 47.5 -19 52. 9+ 4.1 17 47.53 -19 02.3 < 10 355- 4.1 17 47.87 -34 54.6 10 6+ 2.2 17 48.00 -22 18.8 < 7 9+ 4.2 17 48.02 -18 46.0 359- 1.2 17 48.10 -30 23.2 4 - 89 357- 3.1 17 48.47 -32 54.3 < 10 358- 2.1 17 48.5 -31 35. 5 358- 2.4 17 48.50 -31 35.3 358- 2.3 17 48.50 -32 02.3 356- 3.2 17 48.54 -33 46.9 1- 0.3 17 48.6 -27 47. 355- 4.3 17 48.62 -35 22.7 359- 1.3 17 48.89 -30 04.6 6 + 32 10+ 4.1 17 49.17 -17 35.5 6 - 21 0- 1.4 17 49.2 -29 45. 357- 3.2 17 49.30 -32 45.2 5 +106 6+ 2.3 17 49.37 -21 50.6 0- 1.2 17 49.4 -29 06. 359- 2.2 17 49.54 -30 49.0 7 + 81 355- 4.2 17 49.65 -34 37.8 < 5 - 98 6+ 2.5 17 49.67 -22 21.3 < 25 7+ 2.1 17 49.7 -21 14. 358- 2.2 17 49.71 -31 18.7 359- 2.1 17 50.00 -30 17.4 357- 3.3 17 50.00 -32 40.1 7 >21. 356- 3.3 17 50.04 -33 55.4 < 5 - 50 0- 1.7 17 50.23 -29 16.5 357- 3.4 17 50.35 -32 58.2 < 5 - 3 358- 2.5 17 50.38 -31 25.0 0- 1.5 17 50.56 -29 43.2 6 - 45 6+ 2.4 17 50.6 -21 58. 4 1- 1.1 17 50.62 -28 26.7 4 0- 1.3 17 50.64 -28 58.7 36+17.1 17 51.2 +10 38. 14.7 156 14.7 0- 1.6 17 51.22 -29 35.7 < 25 + 75 356- 4.1 17 51.23 -34 21.8 13.9 < 5 -271 1- 1.2 17 51.42 -28 12.2 14+ 6.1 17 51.6 -12 48. 25 1- 1.5 17 51.69 -28 48.4 1- 1.4 17 51.69 -28 48.4 359- 2.4 17 51.86 -31 11.9 4 7+ 1.1 17 52.11 -21 44.2 6 + 12 15.0 0- 2.2 17 52.13 -29 57.2 359- 2.3 17 52.38 -30 33.1 +108 53+24.1 17 52.4 +28 00. 5 - 98 0- 2.1 17 52.86 -29 10.9 1- 1.3 17 52.88 -28 13.8 13+ 5.1 17 52.92 -15 02.2 348- 9.1 17 52.96 -43 02.9 < 5 9+ 2.1 17 53.0 -19 28. 358- 3.2 17 53.0 -32 37. 11 >21. 359- 3.1 17 53.20 -31 04.0 < 5 - 28 0- 2.3 17 53.21 -29 37.7 +145 11+ 4.1 17 53.44 -16 29.4 7 - 79 356- 4.2 17 54.00 -34 09.5 10 357- 4.1 17 54.12 -33 35.4 14.3 6 10+ 3.1 17 54.18 -18 06.4 < 25 7+ 1.2 17 54.26 -21 41.2 < 5 - 6 16.1 0- 2.5 17 54.6 -30 02. 358- 3.1 17 54.93 -31 42.7 4 357- 4.3 17 54.93 -33 47.4 < 25 + 76 0- 2.4 17 54.96 -29 44.1 < 10 -127 359- 3.2 17 54.97 -31 07.9 6 >21. 0- 2.6 17 55.11 -30 00.4 5 +158 357- 4.4 17 55.11 -33 04.1 2- 2.1 17 55.20 -28 14.6 < 10 + 4 1- 2.2 17 55.24 -29 20.6 357- 4.2 17 55.25 -33 28.4 5 - 92 1- 2.1 17 55.30 -28 33.5 2- 1.1 17 55.37 -27 36.9 5 >21. 358- 4.1 17 55.77 -32 21.6 < 10 - 18 345-11.1 17 55.87 -46 38.7 24 13+ 4.1 17 56.11 -15 32.1 5 - 41 2- 2.2 17 56.16 -28 13.7 < 10 + 55 358- 4.2 17 56.63 -32 59.1 359- 4.1 17 56.69 -31 54.3 6 >21. 352- 7.1 17 56.74 -38 49.7 11.4 < 25 + 5 340-14.1 17 56.96 -52 44.2 356- 5.1 17 56.98 -34 27.6 10 11+ 2.1 17 57.23 -17 40.7 < 5 1- 3.1 17 57.44 -29 21.7 < 5 +125 3- 1.1 17 57.99 -26 21.4 < 25 2- 2.3 17 58.02 -27 38.4 5 357- 5.1 17 58.08 -33 17.7 12 + 2 14+ 4.1 17 58.27 -14 30.3 1- 3.2 17 58.31 -29 19.5 358- 5.1 17 58.42 -33 15.4 9 2- 2.4 17 58.54 -28 25.7 < 10 +216 96+29.1 17 58.6 +66 38. 8.8 > 18 - 61 10.9 19356- 5.2 17 58.72 -34 27.7 8 +173 0- 3.1 17 59.10 -30 14.5 6 355- 6.1 17 59.15 -36 39.2 < 5 - 69 14.0 356- 6.1 17 59.18 -35 13.2 10 359- 4.3 17 59.51 -32 09.6 13 + 20 359- 4.5 17 59.82 -31 35.3 3- 2.2 18 00.07 -26 58.6 9 358- 5.2 18 00.12 -32 42.5 < 10 3- 2.3 18 00.17 -27 06.5 15 - 13 356- 6.3 18 00.40 -34 53.2 3- 2.1 18 00.53 -26 43.7 5 + 82 358- 5.3 18 00.61 -32 41.8 14.5 < 10 + 28 359- 4.2 18 00.64 -31 17.9 < 5 +182 357- 6.1 18 00.76 -34 28.8 5 + 24 359- 4.4 18 00.88 -31 39.4 2- 3.7 18 00.91 -28 28.1 349-10.1 18 00.92 -43 24.0 27 356- 6.2 18 01.15 -34 58.2 13 2- 3.2 18 01.30 -28 37.9 5 2- 3.1 18 01.33 -28 21.8 < 11 0- 4.3 18 01.50 -31 03.0 354- 7.1 18 01.52 -37 38.1 11 358- 5.4 18 01.66 -32 54.2 10 + 34 0- 4.1 18 01.81 -30 58.6 5 - 17 10+ 0.1 18 02.25 -19 50.8 12.5 > 9 - 5 10 2- 3.3 18 02.27 -28 22.4 < 25 +241 4- 2.1 18 02.84 -26 30.0 < 25 2- 3.4 18 02.85 -28 17.4 < 11 2- 3.5 18 02.92 -28 40.9 < 5 - 70 342-14.1 18 03.33 -51 01.9 11.9 35 + 45 22 3- 3.1 18 03.35 -27 44.8 4- 3.1 18 03.55 -26 55.3 5 -114 0- 4.2 18 03.88 -30 34.7 10 1- 4.3 18 03.90 -29 36.8 2- 4.1 18 03.93 -29 13.5 < 10 -116 356- 7.1 18 04.29 -36 06.8 < 10 1- 4.1 18 04.45 -29 41.8 < 5 + 52 15+ 3.1 18 04.68 -13 29.3 < 10 +128 1- 4.2 18 04.7 -29 45. 3 -106 5- 2.1 18 04.80 -25 24.5 10 +128 2- 3.6 18 04.9 -28 24. 0- 5.1 18 05.18 -31 37.9 13 >21. 8- 1.1 18 05.41 -22 17.3 5 - 32 341-15.1 18 05.48 -52 34.4 72 5- 3.1 18 06.12 -26 03.0 6- 2.1 18 06.44 -24 12.9 16 - 4 356- 7.2 18 06.46 -35 44.5 12 358- 6.1 18 06.58 -33 20.3 < 10 345-13.1 18 06.77 -48 26.4 352- 9.1 18 07.1 -39 54. 3- 4.2 18 07.32 -28 08.3 < 10 3- 4.1 18 07.58 -27 58.5 13 18+ 4.1 18 07.7 -10 30. 12 3- 4.6 18 07.86 -28 33.4 12 2- 4.2 18 07.90 -28 59.7 8 - 92 3- 4.3 18 08.34 -27 47.0 6 3- 4.7 18 08.42 -28 23.3 12 3- 4.5 18 08.71 -28 11.5 13.2 9 - 5 358- 7.1 18 08.73 -33 52.9 13.8 48 - 27 18. < 6 11- 0.1 18 08.87 -18 47.1 5 359- 7.2 18 08.90 -33 11.3 3- 4.4 18 09.25 -27 53.0 7 4- 4.1 18 09.28 -27 30.1 4 5- 3.2 18 09.3 -26 34. 14 20.0 351-10.1 18 09.35 -41 31.2 18+ 3.1 18 09.38 -10 43.8 3- 4.8 18 09.41 -27 59.0 < 10 +174 6- 3.1 18 09.49 -24 50.8 < 25 3- 4.9 18 09.63 -28 20.9 9 34+11.1 18 09.7 + 6 50. 9.0 8 - 9 >11. 16359- 6.1 18 10.03 -32 20.5 < 25 6- 3.3 18 10.17 -25 30.9 < 5 +150 5- 4.1 18 10.57 -26 09.5 8 350-11.1 18 10.79 -42 51.4 11- 0.2 18 10.80 -19 05.5 11.7 > 8 +120 19. 18 2- 5.1 18 11.37 -29 50.3 < 10 6- 3.2 18 11.40 -24 44.5 5 359- 7.1 18 11.57 -32 37.8 < 10 - 55 24+ 5.1 18 11.65 - 5 00.3 42 - 21 19.7 2- 6.1 18 11.89 -30 16.5 4 -112 1- 6.1 18 12.19 -30 32.9 14.0 < 10 9- 2.1 18 12.51 -21 36.4 < 10 19+ 3.1 18 12.52 -10 11.2 4 +174 4- 5.2 18 12.62 -27 54.8 < 5 1- 6.2 18 12.98 -30 53.2 12.0 < 5 - 17 11. 13 4- 5.1 18 13.05 -27 16.0 7 - 4 2- 6.2 18 13.11 -30 08.7 < 5 - 1 4- 4.2 18 13.16 -27 05.6 4 - 75 10- 1.1 18 13.30 -20 28.2 13.1 9 + 4 337-18.1 18 13.86 -57 12.4 < 10 30+ 8.1 18 14.0 + 1 52. 4- 5.6 18 14.18 -28 11.0 7- 3.1 18 14.21 -24 00.0 10 + 70 0- 7.1 18 14.36 -31 57.8 < 25 - 21 4- 5.3 18 14.5 -28 18. 10 3- 6.1 18 14.50 -29 09.5 13.0 7 + 98 7- 3.2 18 14.73 -24 03.8 348-13.1 18 14.82 -46 00.3 11.9 < 10 -123 10 6- 4.1 18 15.13 -25 39.4 6 38+12.1 18 15.2 +10 08. 12.4 5 + 4 13. 8- 3.1 18 15.35 -23 26.2 7 0- 7.2 18 15.44 -31 55.9 4- 5.5 18 15.48 -28 09.3 7 4- 5.4 18 15.6 -28 08. 11 5- 5.1 18 16.30 -26 36.7 8 - 66 7- 4.1 18 17.08 -24 16.4 < 17 +161 5- 5.2 18 17.86 -26 49.9 < 10 24+ 3.1 18 18.72 - 6 03.4 5 8- 4.1 18 18.96 -24 12.2 3 2- 7.1 18 19.35 -30 45.0 14 - 82 8- 4.2 18 19.47 -24 11.0 4 +157 5- 6.1 18 19.78 -26 50.9 15.0 5 + 71 12- 2.1 18 20.18 -19 18.7 < 10 +126 10- 3.1 18 20.48 -21 54.7 < 10 32+ 7.1 18 20.9 + 3 35. 19+ 0.1 18 21.35 -11 08.4 5 + 35 94+27.1 18 21.6 +64 20. 115 14.8 7- 6.1 18 21.86 -25 43.6 8 + 42 9- 4.1 18 22.06 -22 36.6 6 32+ 7.2 18 22.2 + 2 28. + 20 28+ 5.1 18 22.42 - 1 32.6 3 9- 5.1 18 22.67 -23 13.9 11.6 15 + 14 12.5 < 6353-12.1 18 23.18 -40 31.7 27+ 4.1 18 24.05 - 2 44.8 356-11.1 18 24.40 -37 17.9 104 31+ 5.1 18 24.6 + 1 13. 9 7- 6.2 18 24.89 -26 08.8 13.3 < 9 +115 16- 1.1 18 25.07 -15 34.8 > 11 43+11.1 18 25.5 +14 27. - 6 8- 6.1 18 25.78 -24 34.0 < 7 2- 9.1 18 25.95 -31 32.0 12.6 < 5 - 9 18 11- 5.1 18 26.18 -21 48.9 5 - 69 16- 2.1 18 26.47 -15 09.7 13- 3.1 18 26.55 -19 07.8 5 +140 13- 4.1 18 27.04 -19 42.7 5 + 32 15- 3.1 18 27.3 -16 47. 17.4 52 18- 1.1 18 27.38 -13 56.1 8 20- 0.1 18 27.5 -11 39. 285 13- 4.2 18 27.62 -19 16.9 32+ 5.1 18 28.5 + 2 23. > 12 8- 7.1 18 28.81 -24 48.5 < 25 55+16.1 18 29.2 +26 53. 15.6 > 60 15.1 34+ 6.1 18 29.3 + 4 03. 10 18 5- 8.1 18 29.35 -28 45.6 18 17.4 8- 7.2 18 29.50 -25 10.0 12.2 3 +194 37+ 7.1 18 29.8 + 7 12. 348-16.1 18 29.83 -46 17.0 21 21- 0.1 18 29.93 -10 08.1 >14.3 > 8 + 21 20.1 18- 2.1 18 30.23 -13 46.7 14- 4.1 18 30.42 -18 19.0 5 + 25 21- 0.2 18 30.50 -10 17.7 7 + 26 20.1 30+ 4.1 18 30.7 + 0 10. 26+ 1.1 18 30.70 - 5 00.4 120 + 18 21- 1.1 18 30.70 -11 09.7 < 10 + 3 38+ 7.1 18 30.77 + 8 16.1 20 10- 6.1 18 30.89 -22 41.0 13.3 3 -145 16.9 17- 2.1 18 31.12 -14 54.7 6 36+ 6.1 18 31.4 + 5 51. 19- 2.1 18 31.40 -13 14.8 28+ 2.1 18 31.62 - 2 30.0 6- 8.1 18 31.79 -27 08.8 14 10- 6.2 18 31.84 -22 45.7 7 35+ 5.1 18 32.4 + 5 02. 30+ 3.1 18 32.8 - 0 16. >20.9 15 20.4 15- 4.1 18 32.89 -17 38.7 6 + 63 16- 4.1 18 33.24 -17 02.5 14 - 38 11- 6.1 18 33.56 -21 51.6 < 25 14- 5.1 18 33.58 -19 22.0 14- 5.2 18 34.24 -19 05.0 16- 4.2 18 34.87 -17 08.4 < 10 + 88 28+ 1.1 18 34.99 - 3 08.6 8 +106 4-11.1 18 36.21 -30 43.4 13.1 8 + 51 7 27+ 0.1 18 36.72 - 4 22.6 6 >21. 22- 2.1 18 37.57 -10 42.7 8 +100 23- 1.1 18 37.67 - 8 46.6 44+ 8.1 18 37.8 +14 09. 17- 4.1 18 38.38 -15 36.6 17 + 71 17.9 23- 1.2 18 38.39 - 8 58.9 13- 7.2 18 38.96 -20 35.2 56+14.1 18 39.1 +26 52. 16 >21. 25- 0.1 18 39.4 - 6 44. 5 12- 7.1 18 39.56 -21 20.8 < 10 29+ 0.1 18 40.2 - 3 16. >18.7 42 31+ 1.1 18 40.49 - 0 19.6 23- 2.1 18 40.60 - 9 07.8 4 +104 19- 4.1 18 40.80 -13 47.4 + 76 4-11.2 18 41.03 -30 22.7 14- 7.1 18 41.07 -19 58.0 < 10 -128 22- 3.1 18 41.32 -11 09.9 6 + 60 21- 3.1 18 41.32 -12 16.0 17 >20. 9- 9.1 18 41.6 -25 23. 6 + 46 38+ 4.1 18 41.8 + 6 44. 37+ 4.1 18 42.3 + 6 04. 2-13.1 18 42.56 -33 23.8 11.7 8 + 19 15. 13- 7.1 18 42.61 -20 38.2 14 26- 1.2 18 42.8 - 7 00. 3 34+ 2.1 18 42.9 + 1 58. 26- 1.1 18 42.9 - 6 22. 19- 5.1 18 43.07 -14 30.8 + 32 11- 9.1 18 43.55 -23 30.0 < 5 25- 2.1 18 43.71 - 7 17.8 5 24- 2.1 18 43.85 - 8 31.3 5 + 83 26- 2.1 18 44.84 - 6 57.4 7 24- 3.1 18 45.07 - 9 12.5 6 9-10.1 18 45.12 -25 32.3 5 +172 34+ 1.1 18 45.8 + 1 40. 26- 2.2 18 45.90 - 6 44.6 27- 2.1 18 46.10 - 5 59.5 7 15- 8.1 18 46.19 -19 37.5 42+ 5.1 18 46.2 +10 32. 26- 2.3 18 47.05 - 7 05.1 4 12- 9.1 18 47.42 -22 37.9 4 + 34 28- 2.1 18 47.49 - 5 18.5 51+ 9.1 18 47.6 +20 47. 12.2 3 + 17 13.4 20- 5.1 18 47.91 -13 34.7 64+15.1 18 48.2 +35 11. 17 - 28 21- 5.1 18 48.69 -13 14.3 4 + 27 41+ 4.1 18 49.3 + 9 51. 11-11.1 18 50.23 -24 26.6 44+ 5.1 18 50.7 +12 12. 27- 3.1 18 50.8 - 6 33. 16.7 35 >21. 27- 3.2 18 51.35 - 6 30.1 13.4 +110 29- 2.1 18 51.52 - 4 42.7 24- 5.1 18 51.54 -10 09.0 21 + 19 25- 4.1 18 51.60 - 8 51.4 58+12.1 18 51.7 +28 28. 63+13.1 18 51.7 +32 58. 9.7 > 71 - 21 14.7 30 25- 4.2 18 51.9 - 8 54. 15.0 > 86 - 36 15. 38+ 2.1 18 52.3 + 5 58. 308 3-14.1 18 52.38 -32 19.7 10.9 4 - 68 18. 13-10.1 18 52.51 -21 53.5 39+ 2.1 18 53.9 + 7 04. 16 43+ 3.1 18 54.2 +10 48. 4 + 20 28- 4.1 18 54.61 - 6 03.9 8 356-18.1 18 54.93 -39 58.5 18 28- 3.1 18 55.16 - 5 31.7 8 35- 0.1 18 55.6 + 1 33. 33 16.0 32- 2.1 18 55.85 - 1 07.9 + 41 28- 4.2 18 56.2 - 5 26. 33- 1.1 18 56.29 - 0 37.1 52+ 7.1 18 56.9 +20 33. 32- 3.1 18 57.97 - 2 16.2 5 78+18.1 18 58.0 +48 24. 15.0 30 19.4 17-10.1 18 58.1 -18 17. 15.4 62 15.4 32- 2.2 18 59.02 - 1 23.5 36- 1.1 18 59.5 + 2 05. >107 13.8 32- 3.2 18 59.57 - 1 53.1 33- 2.1 19 00.05 - 0 31.4 10.8 6 + 42 16.0 21 47+ 4.1 19 00.4 +14 24. 7 42+ 1.1 19 01.2 + 8 40. 51+ 6.1 19 01.4 +19 17. 45 18.6 48+ 4.1 19 01.5 +16 22. 43+ 1.1 19 01.8 +10 06. 35- 2.1 19 02.1 + 1 18. 34- 2.1 19 02.3 + 0 16. 50+ 5.1 19 02.3 +17 53. 16.5 36 17.2 3-17.1 19 02.33 -33 16.3 13.4 5 -172 48+ 4.2 19 02.6 +15 43. 29- 5.1 19 03.25 - 6 04.2 12.5 20 - 36 12.9 40- 0.1 19 04.3 + 6 19. 16.9 31 20.3 341-24.1 19 05.63 -55 39.5 43 55+ 6.1 19 06.6 +22 54. 17.1 63 33- 4.1 19 06.82 - 1 14.0 45+ 1.1 19 07.1 +11 56. 44+ 1.1 19 07.4 +11 00. 3 33- 5.1 19 07.9 - 2 26. 15.4 41 19.2 37- 2.1 19 08.1 + 2 45. >18. 62+ 9.1 19 09.2 +30 28. 38 - 72 50+ 3.1 19 09.3 +16 47. 82 +202 11.1 37- 3.1 19 09.6 + 2 33. 48+ 2.1 19 09.8 +15 04. 6 32- 6.1 19 10.4 - 3 37. 22 >21. 37- 3.2 19 10.6 + 2 48. >15.5 188 49+ 2.1 19 10.8 +15 42. > 9 38- 3.1 19 10.9 + 3 20. 37- 3.3 19 11.0 + 2 13. 39- 2.1 19 11.1 + 4 33. 8 + 41 42- 1.1 19 11.1 + 7 22. 5-18.1 19 11.15 -32 39.5 38- 3.2 19 11.4 + 3 33. + 7 48+ 1.1 19 11.4 +14 54. 4 + 14 38- 3.3 19 11.8 + 3 30. 14 19.4 51+ 3.1 19 11.8 +17 26. < 10 33- 6.1 19 11.99 - 2 47.6 14.2 > 62 0 18.2 35- 5.1 19 12.1 + 0 08. 45- 0.1 19 12.1 +10 46. 61+ 8.1 19 12.5 +28 36. 16 37- 4.1 19 12.8 + 2 28. 48+ 1.2 19 13.2 +13 59. 27- 9.1 19 13.74 - 9 07.9 12.7 +151 19358-21.1 19 13.96 -39 42.2 7 + 15 13 40- 3.1 19 14.0 + 5 08. 58+ 6.1 19 15.0 +25 32. 17.5 37 17.4 38- 4.1 19 15.3 + 2 44. 26-11.1 19 15.55 -11 11.7 13.3 14. 37- 5.1 19 15.8 + 1 42. >18.8 40 34- 6.1 19 15.82 - 1 41.3 13.3 > 16 + 91 14.8 41- 2.1 19 16.0 + 6 27. 11.8 >109 + 6 16.2 49+ 0.1 19 16.3 +14 54. 53+ 3.1 19 16.5 +19 28. 17.2 86 25-11.1 19 16.5 -12 22. 15.7 76 17.9 52+ 2.1 19 16.8 +18 57. 56+ 4.1 19 17.5 +22 29. 77+14.1 19 17.7 +46 09. 14.4 190 17.3 43- 3.1 19 18.6 + 7 31. > 8 + 48 48- 0.1 19 18.9 +14 01. 6-19.1 19 18.97 -31 36.4 32- 8.1 19 19.3 - 4 19. 36- 6.1 19 19.9 + 0 07. 45- 1.1 19 20.1 +10 36. 37- 6.1 19 20.7 + 1 25. 10.2 7 + 43 10.5 22 37- 6.2 19 21.0 + 0 32. 55+ 2.1 19 21.3 +21 02. < 10 55+ 2.2 19 21.6 +21 01. > 6 45- 2.1 19 22.0 + 9 48. 12.7 - 71 59+ 4.1 19 22.0 +25 13. 9 31-10.1 19 24.35 - 6 41.2 5 + 37 55+ 2.3 19 24.5 +21 03. 5 46- 3.1 19 25.4 +10 18. 56+ 2.1 19 25.6 +21 24. 48- 2.1 19 25.9 +12 13. 320-28.1 19 27.5 -74 39. < 10 < 6 47- 3.1 19 28.0 +11 17. 50- 1.1 19 28.0 +14 41. 57+ 2.1 19 28.5 +22 58. 4-22.1 19 28.85 -34 19.4 < 10 46- 4.1 19 28.9 + 9 57. 11.3 6 + 13 14. 14 45- 4.1 19 29.2 + 9 07. 12.2 > 31 - 3 14.4 9-21.1 19 29.3 -29 31. 14 44- 5.1 19 30.2 + 7 21. 61+ 3.1 19 30.9 +26 46. 9 47- 4.1 19 31.0 +10 31. 14.8 156 18.2 57+ 1.1 19 31.0 +22 52. 59+ 2.1 19 31.7 +24 26. 42- 6.1 19 32.1 + 5 34. 13.8 - 68 17 64+ 5.1 19 32.8 +30 24. 9.6 8 - 32 10.1 26 53- 1.1 19 33.1 +17 06. 4 59+ 2.2 19 33.8 +24 48. 58+ 1.1 19 34.2 +23 33. 55- 0.1 19 34.3 +19 36. 4 + 46 50- 3.1 19 34.8 +13 34. 60+ 1.1 19 36.1 +25 09. < 25 52- 2.2 19 36.9 +15 50. 12.6 < 10 - 6 52- 2.1 19 37.0 +16 14. 56- 0.1 19 37.4 +20 12. 3 61+ 2.1 19 37.6 +26 24. < 10 + 55 19-19.1 19 37.6 -20 34. 140 18.7 55- 1.1 19 38.2 +18 42. 3 55- 1.2 19 38.7 +18 38. 51- 3.1 19 38.9 +14 50. 5 + 11 54- 2.1 19 39.3 +17 38. < 10 53- 3.2 19 39.69 +16 37.6 51- 4.1 19 39.7 +13 44. 53- 3.1 19 39.9 +16 58. 17.1 34 15.0 52- 4.1 19 40.0 +15 02. < 10 + 10 60+ 0.1 19 40.0 +24 23. 25-17.1 19 41.14 -14 16.4 9.9 > 17 - 16 15. 30 59- 0.1 19 42.0 +23 20. < 5 44- 9.1 19 43.2 + 5 27. 15.3 35 18.1 57- 1.1 19 43.2 +21 13. < 25 83+12.1 19 43.5 +50 24. 9.8 > 25 - 6 10.2 13 17-21.1 19 43.6 -23 16. 15.2 104 15.9 64+ 2.1 19 43.7 +28 31. 60- 0.1 19 44.1 +24 04. 7 54- 3.1 19 44.2 +16 54. 59- 1.1 19 46.3 +22 01. 8 57- 2.1 19 46.7 +20 00. 59- 1.2 19 46.72 +22 17.6 22 >20. 44-10.1 19 47.1 + 5 11. 69+ 3.1 19 48.1 +33 38. > 23 82+11.1 19 48.3 +48 50. 13.8 1 - 98 22 62- 0.1 19 48.4 +25 47. 8 64+ 0.1 19 48.4 +28 04. 66+ 2.1 19 49.0 +30 55. 57- 3.1 19 49.1 +19 50. 68+ 3.1 19 50.0 +32 52. < 10 63+ 0.1 19 50.1 +27 11. 60- 2.1 19 51.0 +23 06. 62- 1.1 19 52.1 +24 50. 69+ 2.1 19 52.1 +33 14. 65+ 0.1 19 53.0 +29 09. 13.6 50 - 5 16.2 68+ 1.1 19 54.6 +32 14. 19-23.1 19 54.6 -21 45. 14.9 251 16.9 75+ 5.1 19 55.3 +39 41.4 43-13.1 19 55.9 + 2 55. 16.0 66 18.3 68+ 1.2 19 57.3 +31 47. 22 - 47 60- 3.1 19 57.4 +22 35. 7.6 >348 - 58 13.8 30 60- 4.1 19 58.0 +21 35. 16.6 39 18.8 42-14.1 19 58.1 + 1 35. 28 69+ 1.1 19 59. +33 08. 99 70+ 1.1 19 59.8 +33 24.6 70+ 1.2 19 59.9 +33 24. 11.4 > 38 14.3 56- 6.1 20 00.3 +17 28. 67- 0.1 20 01.2 +30 24. 64- 2.1 20 01.3 +26 52. 84+ 9.1 20 02.53 +49 10.6 < 17 75+ 4.1 20 02.6 +39 26. 28 68- 0.1 20 02.8 +31 19. > 14 - 9 >21. 63- 3.1 20 02.9 +25 18. 63- 3.2 20 04.6 +24 52. 69+ 0.1 20 05.0 +32 08. 79+ 6.1 20 05.3 +44 06. 4 107+21.1 20 05.3 +74 18. 216 65- 3.1 20 06.98 +26 18.0 25 >20. 78+ 5.1 20 07.02 +42 21.3 22 79+ 5.1 20 07.4 +43 35. > 19 - 26 57- 8.1 20 08.2 +16 46. 13.0 5 + 40 15. 82+ 7.1 20 08.8 +46 19. 12.6 6 - 36 15.8 23 74+ 2.1 20 09.0 +37 16. 14.3 4 - 9 60- 7.1 20 09.7 +20 11. > 29 + 60 11.5 34 60- 7.2 20 10.5 +19 50. 12.2 4 - 35 18. 19 77+ 3.1 20 10.64 +40 36.4 13 72+ 0.1 20 10.9 +34 11. 68- 2.1 20 11.9 +29 25. < 10 54-12.1 20 12.8 +12 33. 11.7 > 14 + 46 11.1 77+ 3.2 20 13.60 +40 25.5 14 69- 2.1 20 14.4 +30 25. 14.4 > 42 - 58 17.5 74+ 1.1 20 14.6 +36 57. < 10 65- 5.1 20 15.2 +25 13. > 17 - 22 76+ 1.2 20 15.43 +38 40.9 7 77+ 2.1 20 15.6 +39 35.9 66- 5.1 20 17.5 +26 51. 5 58-10.1 20 17.9 +16 35. 11.6 2 - 66 14.6 35 76+ 1.1 20 18.1 +38 15. >20.1 22 >21. 71- 2.1 20 19.1 +32 20. < 5 -163 69- 3.1 20 19.9 +29 50. > 8 61- 9.1 20 20.2 +19 57. 11.9 > 39 - 8 13.9 27 81+ 3.1 20 23.5 +43 43. 64- 9.1 20 26.0 +22 41. 79+ 0.1 20 27.0 +40 14.7 7 78+ 0.1 20 27.50 +40 05.3 10 38-25.1 20 28.9 - 7 16. 14.3 43 18.4 86+ 5.1 20 30.32 +48 42.4 191 18.7 85+ 4.1 20 30.8 +47 11. 15.2 157 18.4 73- 2.1 20 33.11 +33 25.0 < 9 63-12.1 20 33.8 +20 00. < 12 88+ 6.1 20 34.1 +51 23. 25 18.6 75- 4.1 20 39.4 +34 33. < 10 78- 2.1 20 40.35 +37 29.7 21 84+ 2.1 20 41.20 +45 45.7 84+ 1.1 20 43.43 +44 28.3 28 88+ 4.1 20 43.82 +50 11.7 < 7 59-18.1 20 47.7 +13 22. 14.6 130 15.0 77- 5.1 20 49.04 +35 23.6 92+ 5.1 20 51.77 +53 34.3 12 86+ 0.1 20 54.02 +46 21.7 < 8 95+ 7.1 20 55.2 +57 15. >17.4 73 20.5 93+ 5.1 20 59.0 +54 21. 93+ 5.2 20 59.1 +54 21. 13.3 83 - 78 12. 80- 6.1 21 00.33 +36 29.7 37-34.1 21 01.5 -11 34. 8.3 > 25 - 46 11.5 21 89+ 0.1 21 04.6 +47 39. 12.7 21 - 41 14.8 41 84- 3.1 21 05.2 +42 02. 10.4 15 + 10 12.6 22 84- 4.1 21 05.77 +40 45.8 < 10 91+ 1.1 21 09.23 +50 34.8 25 >20. 89- 0.1 21 12.3 +47 33. > 35 19.1 88- 1.1 21 12.4 +46 04. 11.3 61 - 93 18. 72-17.1 21 14.6 +23 57. >12.2 831 17.1 87- 3.1 21 16.25 +43 36.0 35 89- 2.1 21 17.3 +46 06. 7 93+ 1.1 21 19.1 +51 41. > 6 - 77 83- 8.1 21 20.27 +37 54.4 < 11 101+ 8.1 21 25.2 +62 40. 17.0 57 17.4 98+ 4.1 21 26.0 +57 26. 50-36.1 21 27.5 - 3 01. 15.6 13 65-27.2 21 27.6 +11 57. < 10 65-27.1 21 27.6 +11 57. 14.9 3 -139 <17 96+ 2.1 21 28.4 +54 14. 6 93- 0.1 21 29.11 +49 46.9 < 24 95+ 0.1 21 30.2 +52 21. 89- 5.1 21 30.6 +44 22. 13.3 1 - 26 17.2 18 97+ 3.1 21 30.6 +55 40. 16.4 > 37 16.3 86- 8.1 21 31.1 +39 25. 12.7 5 + 10 81-14.1 21 33.4 +31 28. 16.0 101 12.3 96+ 1.1 21 33.7 +53 34. 94- 0.1 21 33.98 +50 40.8 < 9 66-28.1 21 34.5 +12 34. 95 - 24 13.6 93- 2.1 21 35.2 +48 43. 32 - 24 91- 4.1 21 36.92 +45 46.9 < 12 98+ 2.1 21 37.6 +55 32. 7 95- 2.1 21 41.5 +50 11. -134 104+ 7.1 21 44.6 +63 25. <13. 78 - 88 18.1 97- 2.1 21 55.9 +51 27. 4 -136 2-52.1 21 56.5 -39 37. 120 103+ 0.1 22 14.3 +57 14. > 41 - 11 353-55.1 22 18.10 -44 08.0 12 104+ 0.1 22 18.5 +57 59. 103+ 0.2 22 18.7 +57 21. 13 - 92 100- 5.1 22 21.9 +50 43. 12.6 6 - 99 15.4 18102- 2.1 22 24.4 +54 34. 15.8 > 59 17.6 36-57.1 22 26.9 -21 03. >769 - 22 12.7 13100- 8.1 22 29.6 +47 33. 1 -152 104- 1.1 22 30.4 +55 55. 14 - 62 102- 5.1 22 32.7 +52 11. 15.2 132 18.4 107+ 2.1 22 38.5 +61 01. 12.9 > 20 - 42 16.1 117+18.1 22 42.2 +80 11. 14.8 33 18.0 107- 0.1 22 46.58 +58 13.2 111+ 6.1 22 47.27 +66 45.8 15 108+ 0.1 22 48.89 +59 14.4 < 7 104- 6.1 22 49.5 +51 35. 106- 4.1 22 52.65 +54 40.0 10 107- 2.2 22 53.03 +56 26.5 < 7 107- 2.1 22 54.2 +56 53.3 14.0 8 - 56 114+10.1 22 55.0 +71 12. 42 113+ 6.1 23 05.7 +66 43.1 8 108- 5.1 23 07.1 +54 29. 113+ 5.1 23 07.2 +66 32.0 110- 0.1 23 10.04 +59 19.7 120 9.8 112+ 3.1 23 10.18 +64 23.0 < 9 111- 3.1 23 20.08 +57 29.6 140 107-13.1 23 20.6 +46 38. 13.9 5 - 63 112- 0.1 23 21.93 +60 41.0 13 106-17.1 23 23.5 +42 16. 9.2 > 12 - 10 12.5 26111- 2.1 23 24.0 +57 54. 14.0 1 - 31 15. 116+ 8.1 23 29.7 +70 06. 40 - 43 114+ 3.1 23 33.2 +64 36. 104-29.1 23 33.4 +30 11. 15.1 332 15.6 110-12.1 23 36.7 +47 56. 34 20.1 114- 4.1 23 43.4 +56 47. 15.2 95 13. 113- 6.1 23 44.3 +54 28. 17.6 40 >20.0 112-10.1 23 45.2 +51 07. 14.4 126 18.0 116+ 0.1 23 49.85 +62 14. 130 118+ 8.1 23 54.1 +70 32. >21. 118+ 8.2 23 59.0 +70 26. 16.7 63 >20. fv5.4/ftools/guis/fv/sample_data/datacube.fit0000644000220700001010000104720007452425200020626 0ustar birbylheadevSIMPLE = T / file does conform to FITS standard BITPIX = 16 / number of bits per data pixel NAXIS = 3 / number of data axes NAXIS1 = 64 / length of data axis 1 NAXIS2 = 64 / length of data axis 2 NAXIS3 = 30 / length of data axis 3 EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format defined in Astronomy andCOMMENT Astrophysics Supplement Series v44/p363, v44/p371, v73/p359, v73/p365.COMMENT Contact the NASA Science Office of Standards and Technology for the COMMENT FITS Definition document #100 and other FITS information. OBJECT = 'NGC6503 ' TELESCOP= ' ' INSTRUME= ' ' OBSERVER= 'WELL ' DATE-OBS= '12/04/83' DATE-MAP= '20/09/84' EQUINOX = 1.950000000E+03 / EPOCH OF RA DEC VELREF = 2706 />256 RADIO, 1 LSR 2 HEL 3 OBS ALTRVAL = 1.42027488200E+09 /ALTENATE FREQ/VEL REF VALUE ALTRPIX = 1.000000000E+00 /ALTENATE FREQ/VEL REF PIXEL RESTFREQ= 1.42040575100E+09 /REST FREQUENCY DATAMAX = 2.953770570E-02 /MAX PIXEL VALUE DATAMIN = -1.367387734E-02 /MIN PIXEL VALUE CTYPE1 = 'RA---SIN' CRVAL1 = 2.67490455508E+02 / CDELT1 = -3.333333414000000E-03 CRPIX1 = 3.225000000000000E+01 CROTA1 = 0.000000000E+00 / CTYPE2 = 'DEC--SIN' CRVAL2 = 7.01571384072E+01 / CDELT2 = 3.333333414000000E-03 CRPIX2 = 3.275000000000000E+01 CROTA2 = 0.000000000E+00 / CTYPE3 = 'FELO-HEL' CRVAL3 = 2.60000000000E+04 / CDELT3 = -1.030761914E+04 / CRPIX3 = 1.600000000E+01 / CROTA3 = 0.000000000E+00 / HISTORY -------------------------------------------------------------------- HISTORY /Begin "HISTORY" information found in fits tape header by IMLOD HISTORY BLOCKED = T /Tape may be blocked HISTORY -------------------------------------------------------------------- HISTORY /Begin "HISTORY" information found in fits tape header by IMLOD HISTORY BLOCKED = T /Tape may be blocked HISTORY -------------------------------------------------------------------- HISTORY /Begin "HISTORY" information found in fits tape header by IMLOD HISTORY BLOCKED = T /Tape may be blocked HISTORY -------------------------------------------------------------------- HISTORY /Begin "HISTORY" information found in fits tape header by IMLOD HISTORY BLOCKED = T /Tape may be blocked HISTORY -------------------------------------------------------------------- HISTORY /Begin "HISTORY" information found in fits tape header by IMLOD HISTORY / HISTORY OF INPUT MAP 1 HISTORY UVLOD / DATA BASE CREATED BY USER 548 AT 03-AUG-1983 14:32:45 HISTORY UVLOD OUTNAME='NGC6503 ' OUTCLASS='UVDATA' HISTORY UVLOD OUTSEQ= 1 OUTDISK= 3 HISTORY UVLOD SOURCE=' ' QUAL= -1 BAND=' ' HISTORY UVLOD /NUMBER OF VIS. POINTS = 32110. HISTORY UVSRT /********** START 03-AUG-1983 14:51:51 HISTORY UVSRT INNAME='NGC6503 ' INCLASS='UVDATA' HISTORY UVSRT INSEQ= 1 INDISK= 3 HISTORY UVSRT OUTNAME='NGC6503 ' OUTCLASS='UVSORT' HISTORY UVSRT OUTSEQ= 1 OUTDISK= 3 HISTORY UVSRT SORT = 'XY' / NEW SORT ORDER HISTORY UVMAP /********** START 03-AUG-1983 16:16:36 HISTORY UVMAP / MAP CREATED BY USER 548 AT 03-AUG-1983 16:16:36 HISTORY UVMAP OUTNAME='NGC6503 ' OUTCLASS='RMAP ' HISTORY UVMAP OUTSEQ= 1 OUTDISK= 3 HISTORY UVMAP SOURCE='NGC6503 ' HISTORY UVMAP CHANNEL = 1 /FREQUENCY CHANNEL HISTORY UVMAP CHANNEL1= 1 NOCH= 1 /FIRST AND NO. CHAN. HISTORY UVMAP IMSIZE= 512, 512 /IMAGE SIZE HISTORY UVMAP MAPFLD= 0.30720E+04, 0.30720E+04 /FIELD OF VIEW HISTORY UVMAP CELLSIZE= 0.60000E+01, 0.60000E+01 / CELL SIZE ARC SEC. HISTORY UVMAP FREQ= 0.1420274E+10 STOKES='RL ' HISTORY UVMAP SHIFT= 0.0000, 0.0000 HISTORY UVMAP UVTAPER= 0.00000E+00, 0.00000E+00 /UV TAPER KILOLAMBDA HISTORY UVMAP UVRANGE= 0.00000E+00, 0.10000E+16 /UV ANNULUS KILOLAMBDA HISTORY UVMAP UVWTFN=' ' , UVBOX = 0 /UNIFORM WEIGHT HISTORY UVMAP /CONVOLUTION FUNCTIONS - U: SPHEROID V: SPHEROID HISTORY UVMAP XTYPE = 5 XPARM = 0.30000E+01, 0.10000E+01, 0.00000E+00 HISTORY UVMAP , 0.00000E+00, 0.00000E+00, 0.00000E+00, 0.00000E+00 HISTORY UVMAP , 0.00000E+00, 0.10000E+01, 0.48828E+05, HISTORY UVMAP YTYPE = 5 YPARM = 0.30000E+01, 0.10000E+01, 0.00000E+00 HISTORY UVMAP , 0.00000E+00, 0.00000E+00, 0.00000E+00, 0.00000E+00 HISTORY UVMAP , 0.00000E+00, 0.00000E+00, 0.00000E+00, HISTORY UVMAP DOGRIDCR = 1 /GRIDDING CORRECTED HISTORY UVMAP /NUMBER OF VIS. POINTS USED = 32110. HISTORY UVMAP /FREQUENCY FACTOR = 1.000000000000D+00 HISTORY AXDEF INNAME='NGC6503 ' INCLASS='RMAP ' HISTORY AXDEF INSEQ= 1 INDISK= 3 HISTORY AXDEF CTYPE3 = 'FREQ ' / OLD AXIS TYPE HISTORY AXDEF CRVAL3 = 1.420274000E+09 / OLD REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.68800E+06 / OLD AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / OLD REFERENCE PIXEL LOC HISTORY AXDEF CTYPE3 = 'FREQ ' / NEW AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419493384E+09 / NEW REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.68800E+06 / NEW AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / NEW REFERENCE PIXEL LOC HISTORY RENAM INNAME='NGC6503 ' INCLASS='RMAP ' HISTORY RENAM INSEQ= 1 INDISK= 3 HISTORY RENAM OUTNAME='NGC6503 ' OUTCLASS='MAPS ' HISTORY RENAM OUTSEQ= 1 OUTDISK= 3 HISTORY / HISTORY OF INPUT MAP 2 HISTORY UVLOD / DATA BASE CREATED BY USER 548 AT 03-AUG-1983 14:32:45 HISTORY UVLOD OUTNAME='NGC6503 ' OUTCLASS='UVDATA' HISTORY UVLOD OUTSEQ= 1 OUTDISK= 3 HISTORY UVLOD SOURCE=' ' QUAL= -1 BAND=' ' HISTORY UVLOD /NUMBER OF VIS. POINTS = 32110. HISTORY UVSRT /********** START 03-AUG-1983 14:51:51 HISTORY UVSRT INNAME='NGC6503 ' INCLASS='UVDATA' HISTORY UVSRT INSEQ= 1 INDISK= 3 HISTORY UVSRT OUTNAME='NGC6503 ' OUTCLASS='UVSORT' HISTORY UVSRT OUTSEQ= 1 OUTDISK= 3 HISTORY UVSRT SORT = 'XY' / NEW SORT ORDER HISTORY UVMAP /********** START 03-AUG-1983 16:21:31 HISTORY UVMAP / MAP CREATED BY USER 548 AT 03-AUG-1983 16:21:31 HISTORY UVMAP OUTNAME='NGC6503 ' OUTCLASS='LMAP ' HISTORY UVMAP OUTSEQ= 1 OUTDISK= 3 HISTORY UVMAP SOURCE='NGC6503 ' HISTORY UVMAP CHANNEL = 1 /FREQUENCY CHANNEL HISTORY UVMAP CHANNEL1= 1 NOCH= 1 /FIRST AND NO. CHAN. HISTORY UVMAP IMSIZE= 512, 512 /IMAGE SIZE HISTORY UVMAP MAPFLD= 0.30720E+04, 0.30720E+04 /FIELD OF VIEW HISTORY UVMAP CELLSIZE= 0.60000E+01, 0.60000E+01 / CELL SIZE ARC SEC. HISTORY UVMAP FREQ= 0.1420323E+10 STOKES='RL ' HISTORY UVMAP SHIFT= 0.0000, 0.0000 HISTORY UVMAP UVTAPER= 0.00000E+00, 0.00000E+00 /UV TAPER KILOLAMBDA HISTORY UVMAP UVRANGE= 0.00000E+00, 0.10000E+16 /UV ANNULUS KILOLAMBDA HISTORY UVMAP UVWTFN=' ' , UVBOX = 0 /UNIFORM WEIGHT HISTORY UVMAP /CONVOLUTION FUNCTIONS - U: SPHEROID V: SPHEROID HISTORY UVMAP XTYPE = 5 XPARM = 0.30000E+01, 0.10000E+01, 0.00000E+00 HISTORY UVMAP , 0.00000E+00, 0.00000E+00, 0.00000E+00, 0.00000E+00 HISTORY UVMAP , 0.00000E+00, 0.10000E+01, 0.48828E+05, HISTORY UVMAP YTYPE = 5 YPARM = 0.30000E+01, 0.10000E+01, 0.00000E+00 HISTORY UVMAP , 0.00000E+00, 0.00000E+00, 0.00000E+00, 0.00000E+00 HISTORY UVMAP , 0.00000E+00, 0.00000E+00, 0.00000E+00, HISTORY UVMAP DOGRIDCR = 1 /GRIDDING CORRECTED HISTORY UVMAP /NUMBER OF VIS. POINTS USED = 32110. HISTORY UVMAP /FREQUENCY FACTOR = 1.000034379369D+00 HISTORY AXDEF INNAME='NGC6503 ' INCLASS='LMAP ' HISTORY AXDEF INSEQ= 1 INDISK= 3 HISTORY AXDEF CTYPE3 = 'FREQ ' / OLD AXIS TYPE HISTORY AXDEF CRVAL3 = 1.420322828E+09 / OLD REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.68800E+06 / OLD AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / OLD REFERENCE PIXEL LOC HISTORY AXDEF CTYPE3 = 'FREQ ' / NEW AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419542212E+09 / NEW REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.68800E+06 / NEW AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / NEW REFERENCE PIXEL LOC HISTORY RENAM INNAME='NGC6503 ' INCLASS='LMAP ' HISTORY RENAM INSEQ= 1 INDISK= 3 HISTORY RENAM OUTNAME='NGC6503 ' OUTCLASS='MAPS ' HISTORY RENAM OUTSEQ= 2 OUTDISK= 3 HISTORY SUMIM /********** START 04-AUG-1983 13:55:46 HISTORY SUMIM INNAME='NGC6503 ' INCLASS='MAPS ' HISTORY SUMIM INSEQ= 2 INDISK= 3 HISTORY SUMIM OUTNAME='NGC6503 ' OUTCLASS='C1 ' HISTORY SUMIM OUTSEQ= 1 OUTDISK= 3 HISTORY SUMIM / SEQ. NUMBER FROM 2 TO 4 BY 1 HISTORY SUMIM FACTOR = 3.33333E-01 / MULTIPLIER HISTORY SUMIM BLC = 1., 1., 1., 1., 1., 1., 1. HISTORY SUMIM TRC = 512., 512., 1., 1., 1., 1., 1. HISTORY SUMIM /********** START 04-AUG-1983 14:15:20 HISTORY SUMIM INNAME='NGC6503 ' INCLASS='C1 ' HISTORY SUMIM INSEQ= 1 INDISK= 3 HISTORY SUMIM OUTNAME='NGC6503 ' OUTCLASS='CONT ' HISTORY SUMIM OUTSEQ= 1 OUTDISK= 3 HISTORY SUMIM / SEQ. NUMBER FROM 1 TO 2 BY 1 HISTORY SUMIM FACTOR = 5.00000E-01 / MULTIPLIER HISTORY SUMIM BLC = 1., 1., 1., 1., 1., 1., 1. HISTORY SUMIM TRC = 512., 512., 1., 1., 1., 1., 1. HISTORY / END OF OLD HISTORIES HISTORY COMB INNAME='NGC6503 ' INCLASS='MAPS ' HISTORY COMB INSEQ= 1 INDISK= 3 HISTORY COMB IN2NAME='NGC6503 ' IN2CLASS='CONT ' HISTORY COMB IN2SEQ= 1 IN2DISK= 3 HISTORY COMB OUTNAME='NGC6503 ' OUTCLASS='LINE ' HISTORY COMB OUTSEQ= 1 OUTDISK= 3 HISTORY COMB USERID= 548 HISTORY COMB CTYPE= 1 /LIN.COMB HISTORY COMB C( 1)=0.10000E+01 C( 2)=-.10000E+01 C( 3)=0.00000E+00 HISTORY COMB C( 8)=0.00000E+00 C( 9)=0.00000E+00 C(10)=0.00000E+00 HISTORY COMB BLC= 1 1 1 1 1 1 1 / BOTTOM LEFT CORNER HISTORY COMB TRC= 512 512 1 1 1 1 1 / TOP RIGHT CORNER HISTORY SUBIM INNAME='NGC6503 ' INCLASS='LINE ' HISTORY SUBIM INSEQ= 1 INDISK= 3 HISTORY SUBIM INTYPE ='MA' USERID= 548 HISTORY SUBIM OUTNAME='NGC6503 ' OUTCLASS='LIJN ' HISTORY SUBIM OUTSEQ= 1 OUTDISK= 3 HISTORY SUBIM BLC = 129 129 1 1 1 1 1 HISTORY SUBIM TRC = 384 384 1 1 1 1 1 HISTORY SUBIM XINC = 1 YINC = 1 HISTORY MCUBE INNAME='NGC6503 ' INCLASS='LIJN ' HISTORY MCUBE INSEQ= 1 INDISK= 3 HISTORY MCUBE IN2SEQ = 32; IN3SEQ = 1; INTYPE ='MA' HISTORY MCUBE OUTNAME='NGC6503 ' OUTCLASS='LMFCUB' HISTORY MCUBE OUTSEQ= 1 OUTDISK= 3 HISTORY MCUBE AXREF = 1, 32; NPOINTS = 32 HISTORY MCUBE BLC= 1., 1., 1., 1., 1., 1., 1. / BOTTOM LEFT CORNERHISTORY MCUBE TRC= 256., 256., 1., 1., 1., 1., 1. / TOP RIGHT CORNER HISTORY CNVRT INNAME='NGC6503 ' INCLASS='LMFCUB' HISTORY CNVRT INSEQ= 1 INDISK= 3 HISTORY TRANS /********** START 05-AUG-1983 13:59:03 HISTORY TRANS INNAME='NGC6503 ' INCLASS='LMFCUB' HISTORY TRANS INSEQ= 1 INDISK= 3 HISTORY TRANS OUTNAME='NGC6503 ' OUTCLASS='FLMCUB' HISTORY TRANS OUTSEQ= 1 OUTDISK= 3 HISTORY TRANS BLC= 1., 1., 1., 1., 1., 1., 1. / INPUT IMAGE HISTORY TRANS TRC= 256., 256., 32., 1., 1., 1., 1. / INPUT IMAGE HISTORY TRANS TRANCOD='312 ' / OUTPUT AXIS ORDER HISTORY XSMTH /********** START 05-AUG-1983 14:26:11 HISTORY XSMTH INNAME='NGC6503 ' INCLASS='FLMCUB' HISTORY XSMTH INSEQ= 1 INDISK= 3 HISTORY XSMTH OUTNAME='NGC6503 ' OUTCLASS='FLMHAN' HISTORY XSMTH OUTSEQ= 1 OUTDISK= 3 HISTORY XSMTH BLC = 2., 1., 1., 1., 1., 1., 1. HISTORY XSMTH TRC = 32., 256., 256., 1., 1., 1., 1. HISTORY XSMTH OPCODE = 'SMOT' HISTORY XSMTH XPOINT = 31.0 / OUTPUT X DIMENSION HISTORY XSMTH CTYPE ='HANNING ' / CONVOLVING FUNCTION HISTORY XSMTH CWIDTH = 4.0 CSUPRT = 4.0 / WIDTH, SUPPORT (OLD CELLS) HISTORY XSMTH IXDIV = 500 / CONV FUNCTION EVAL IXDIV TIMES/CELL HISTORY TRANS /********** START 05-AUG-1983 14:35:02 HISTORY TRANS INNAME='NGC6503 ' INCLASS='FLMHAN' HISTORY TRANS INSEQ= 1 INDISK= 3 HISTORY TRANS OUTNAME='NGC6503 ' OUTCLASS='LINEHS' HISTORY TRANS OUTSEQ= 1 OUTDISK= 3 HISTORY TRANS BLC= 1., 1., 1., 1., 1., 1., 1. / INPUT IMAGE HISTORY TRANS TRC= 31., 256., 256., 1., 1., 1., 1. / INPUT IMAGE HISTORY TRANS TRANCOD='231 ' / OUTPUT AXIS ORDER HISTORY RENAM INNAME='NGC6503 ' INCLASS='LINEHS' HISTORY RENAM INSEQ= 1 INDISK= 3 HISTORY RENAM OUTNAME='NGC6503 ' OUTCLASS='LINH ' HISTORY RENAM OUTSEQ= 1 OUTDISK= 3 HISTORY SUBIM INNAME='NGC6503 ' INCLASS='LINH ' HISTORY SUBIM INSEQ= 1 INDISK= 3 HISTORY SUBIM INTYPE ='MA' USERID= 548 HISTORY SUBIM OUTNAME='NGC6503 ' OUTCLASS='DECUB ' HISTORY SUBIM OUTSEQ= 1 OUTDISK= 3 HISTORY SUBIM BLC = 1 1 1 1 1 1 1 HISTORY SUBIM TRC = 256 256 1 1 1 1 1 HISTORY SUBIM XINC = 1 YINC = 1 HISTORY APCLN /********** START 08-AUG-1983 15:23:53 HISTORY APCLN INNAME='NGC6503 ' INCLASS='DECUB ' HISTORY APCLN INSEQ= 1 INDISK= 3 HISTORY APCLN IN2NAME='NGC6503 ' IN2CLASS='BUND ' HISTORY APCLN IN2SEQ= 1 IN2DISK= 3 HISTORY APCLN OUTNAME='NGC6503 ' OUTCLASS='CL ' HISTORY APCLN OUTSEQ= 1 OUTDISK= 3 HISTORY APCLN OUTVER = 1 /CLEAN COMP. FILE VERSION NO. HISTORY APCLN NITER = 10000 /MAX. NO. CLEAN ITERATIONS HISTORY APCLN BITER = 0 /NO. OF PREVIOUS CLEAN COMP. HISTORY APCLN GAIN = 0.1000 /CLEAN LOOP GAIN FACTOR HISTORY APCLN FACTOR = 0.00 /SPEED-UP FACTOR HISTORY APCLN FLUX = 0.30000E-02 /MIN. CLEAN COMP. (JY) HISTORY APCLN BMAJS= 31.18640 BMINS= 14.96521 BPAD= -61.719 /CLEAN BEAM HISTORY APCLN NBOXES = 1 /NO. CLEAN WINDOWS HISTORY APCLN BOX( 1) = 65, 65, 191, 191 /CLEAN WINDOW HISTORY APCLN MINPATCH = 51 /MIN ALLOWED BEAM PATCH RADIUS HISTORY APCLN /TOTAL CLEANED FLUX DENSITY = -2.0547E-02 JY HISTORY APCLN /PEAK RESIDUAL = 2.9990E-03 JY/BEAM HISTORY AXDEF INNAME='NGC6503 ' INCLASS='CL ' HISTORY AXDEF INSEQ= 1 INDISK= 3 HISTORY AXDEF CTYPE3 = 'FREQ ' / OLD AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419493384E+09 / OLD REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.88208E+04 / OLD AXIS INCREMENT HISTORY AXDEF CRPIX3 = 0.000 / OLD REFERENCE PIXEL LOC HISTORY AXDEF CTYPE3 = 'FREQ ' / NEW AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419590844E+09 / NEW REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.88281E+04 / NEW AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / NEW REFERENCE PIXEL LOC HISTORY AXDEF INNAME='NGC6503 ' INCLASS='CL ' HISTORY AXDEF INSEQ= 1 INDISK= 3 HISTORY AXDEF CTYPE3 = 'FREQ ' / OLD AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419590844E+09 / OLD REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.88281E+04 / OLD AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / OLD REFERENCE PIXEL LOC HISTORY AXDEF CTYPE3 = 'FREQ ' / NEW AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419542076E+09 / NEW REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.88281E+04 / NEW AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / NEW REFERENCE PIXEL LOC HISTORY AXDEF INNAME='NGC6503 ' INCLASS='CL ' HISTORY AXDEF INSEQ= 1 INDISK= 3 HISTORY AXDEF CTYPE3 = 'FREQ ' / OLD AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419542076E+09 / OLD REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.88281E+04 / OLD AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / OLD REFERENCE PIXEL LOC HISTORY AXDEF CTYPE3 = 'FREQ ' / NEW AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419541564E+09 / NEW REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.88281E+04 / NEW AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / NEW REFERENCE PIXEL LOC HISTORY AXDEF INNAME='NGC6503 ' INCLASS='CL ' HISTORY AXDEF INSEQ= 1 INDISK= 3 HISTORY AXDEF CTYPE3 = 'FREQ ' / OLD AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419541564E+09 / OLD REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.88281E+04 / OLD AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / OLD REFERENCE PIXEL LOC HISTORY AXDEF CTYPE3 = 'FREQ ' / NEW AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419542460E+09 / NEW REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.88281E+04 / NEW AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / NEW REFERENCE PIXEL LOC HISTORY AXDEF INNAME='NGC6503 ' INCLASS='CL ' HISTORY AXDEF INSEQ= 1 INDISK= 3 HISTORY AXDEF CTYPE3 = 'FREQ ' / OLD AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419542460E+09 / OLD REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.88281E+04 / OLD AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / OLD REFERENCE PIXEL LOC HISTORY AXDEF CTYPE3 = 'FREQ ' / NEW AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419542460E+09 / NEW REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.88281E+04 / NEW AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / NEW REFERENCE PIXEL LOC HISTORY AXDEF INNAME='NGC6503 ' INCLASS='CL ' HISTORY AXDEF INSEQ= 1 INDISK= 3 HISTORY AXDEF CTYPE3 = 'FREQ ' / OLD AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419542460E+09 / OLD REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.88281E+04 / OLD AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / OLD REFERENCE PIXEL LOC HISTORY AXDEF CTYPE3 = 'FREQ ' / NEW AXIS TYPE HISTORY AXDEF CRVAL3 = 1.419542460E+09 / NEW REFERENCE PIXEL VALUE HISTORY AXDEF CDELT3 = 4.88281E+04 / NEW AXIS INCREMENT HISTORY AXDEF CRPIX3 = 1.000 / NEW REFERENCE PIXEL LOC HISTORY MCUBE INNAME='NGC6503 ' INCLASS='CL ' HISTORY MCUBE INSEQ= 1 INDISK= 3 HISTORY MCUBE IN2SEQ = 31; IN3SEQ = 1; INTYPE ='MA' HISTORY MCUBE OUTNAME='NGC6503 ' OUTCLASS='CLCUB ' HISTORY MCUBE OUTSEQ= 1 OUTDISK= 3 HISTORY MCUBE AXREF = 1, 31; NPOINTS = 31 HISTORY MCUBE BLC= 1., 1., 1., 1., 1., 1., 1. / BOTTOM LEFT CORNERHISTORY MCUBE TRC= 256., 256., 1., 1., 1., 1., 1. / TOP RIGHT CORNER HISTORY CNVRT INNAME='NGC6503 ' INCLASS='CLCUB ' HISTORY CNVRT INSEQ= 1 INDISK= 3 HISTORY RENAM INNAME='NGC6503 ' INCLASS='CLCUB ' HISTORY RENAM INSEQ= 1 INDISK= 3 HISTORY RENAM OUTNAME='NGC6503 ' OUTCLASS='CHFCUB' HISTORY RENAM OUTSEQ= 1 OUTDISK= 3 HISTORY ALTDEF RESTFREQ= 1.4204057510E+09 /REST FREQUENCY IN HZ HISTORY ALTDEF CRVAL3 = 2.600000000E+04 CRPIX3 = 160.000 HISTORY ALTDEF AXREFTYPE ='HELOPT ' /VELOCITY REF. TYPES HISTORY RENAM INNAME='NGC6503 ' INCLASS='CHFCUB' HISTORY RENAM INSEQ= 1 INDISK= 3 HISTORY RENAM OUTNAME='NGC6503 ' OUTCLASS='CB3115' HISTORY RENAM OUTSEQ= 1 OUTDISK= 3 HISTORY RENAM INNAME='NGC6503 ' INCLASS='CB3115' HISTORY RENAM INSEQ= 1 INDISK= 3 HISTORY RENAM OUTNAME='NGC6503 ' OUTCLASS='CB3115' HISTORY RENAM OUTSEQ= 1 OUTDISK= 3 HISTORY TRANS RELEASE ='15MAY84 ' /********* START 24-APR-1984 11:13:34 HISTORY TRANS INNAME='NGC6503 ' INCLASS='CB3115' HISTORY TRANS INSEQ= 1 INDISK= 3 HISTORY TRANS OUTNAME='NGC6503 ' OUTCLASS='TR3115' HISTORY TRANS OUTSEQ= 1 OUTDISK= 3 HISTORY TRANS BLC= 1., 1., 1., 1., 1., 1., 1. / INPUT IMAGE HISTORY TRANS TRC= 256., 256., 31., 1., 1., 1., 1. / INPUT IMAGE HISTORY TRANS TRANCOD='312 ' / OUTPUT AXIS ORDER HISTORY TRANS RELEASE ='15OCT84 ' /********* START 20-SEP-1984 15:25:50 HISTORY TRANS INNAME='NGC6503 ' INCLASS='TR3115' HISTORY TRANS INSEQ= 1 INDISK= 3 HISTORY TRANS OUTNAME='NGC6503 ' OUTCLASS='CU3115' HISTORY TRANS OUTSEQ= 1 OUTDISK= 3 HISTORY TRANS BLC= 1., 1., 1., 1., 1., 1., 1. / INPUT IMAGE HISTORY TRANS TRC= 31., 256., 256., 1., 1., 1., 1. / INPUT IMAGE HISTORY TRANS TRANCOD='231 ' / OUTPUT AXIS ORDER HISTORY AIPS IMNAME='NGC6503 ' IMCLASS='CU3115' IMSEQ= 1 / HISTORY AIPS USERNO= 548 / HISTORY AIPS CLEAN BMAJ= 8.6629E-03 BMIN= 4.1570E-03 BPA= -61.72 HISTORY AIPS CLEAN NITER= 0 PRODUCT=0 / DIRTY MAP HISTORY /END FITS tape header "HISTORY" information HISTORY -------------------------------------------------------------------- HISTORY IMLOD OUTNAME =' HISTORY IMLOD OUTSEQ = 0 INTAPE = 4 OUTDISK= 1 HISTORY IMLOD RELEASE = '15JAN91' HISTORY AIPS IMNAME='NGC6503 ' IMCLASS='CU3115' IMSEQ= 1 / HISTORY AIPS USERNO= 36 / HISTORY AIPS CLEAN BMAJ= 8.6629E-03 BMIN= 4.1570E-03 BPA= -61.72 HISTORY AIPS CLEAN NITER= 0 PRODUCT=0 / DIRTY MAP HISTORY /END FITS tape header "HISTORY" information HISTORY -------------------------------------------------------------------- HISTORY IMLOD OUTNAME =' HISTORY IMLOD OUTSEQ = 0 INTAPE = 1 OUTDISK= 2 HISTORY IMLOD INFILE = 'MYDATA:CUBE.FITS ' HISTORY IMLOD RELEASE = '15JUL90' HISTORY AIPS IMNAME='NGC6503 ' IMCLASS='CU3115' IMSEQ= 1 / HISTORY AIPS USERNO= 269 / HISTORY AIPS CLEAN BMAJ= 8.6629E-03 BMIN= 4.1570E-03 BPA= -61.72 HISTORY AIPS CLEAN NITER= 0 PRODUCT=0 / DIRTY MAP HISTORY /END FITS tape header "HISTORY" information HISTORY -------------------------------------------------------------------- HISTORY IMLOD OUTNAME =' HISTORY IMLOD OUTSEQ = 0 INTAPE = 2 OUTDISK= 5 HISTORY IMLOD RELEASE = '15APR91' HISTORY AIPS IMNAME='NGC6503 ' IMCLASS='CU3115' IMSEQ= 1 / HISTORY AIPS USERNO= 269 / HISTORY AIPS CLEAN BMAJ= 8.6629E-03 BMIN= 4.1570E-03 BPA= -61.72 HISTORY AIPS CLEAN NITER= 0 PRODUCT=0 / DIRTY MAP HISTORY /END FITS tape header "HISTORY" information HISTORY -------------------------------------------------------------------- HISTORY IMLOD OUTNAME ='NGC6503 ' OUTCLASS ='XMOM0 ' HISTORY IMLOD OUTSEQ = 0 INTAPE = 1 OUTDISK= 1 HISTORY IMLOD RELEASE = '15APR92' HISTORY AIPS IMNAME='NGC6503 ' IMCLASS='CU3115' IMSEQ= 1 / HISTORY AIPS USERNO= 36 / HISTORY AIPS CLEAN BMAJ= 8.6629E-03 BMIN= 4.1570E-03 BPA= -61.72 HISTORY AIPS CLEAN NITER= 0 PRODUCT=0 / DIRTY MAP HISTORY /END FITS tape header "HISTORY" information HISTORY -------------------------------------------------------------------- HISTORY IMLOD OUTNAME =' HISTORY IMLOD OUTSEQ = 0 INTAPE = 1 OUTDISK= 2 HISTORY IMLOD INFILE = 'MYFITS:VLACUBE.INT ' HISTORY IMLOD RELEASE = '15OCT92' HISTORY CNTR VERSION= 1 / plot file created 23-JUN-1992 15:29:05 HISTORY CNTR VERSION= 3 / plot file created 24-JUN-1992 09:30:21 HISTORY RENAM INNAME='NGC6503 ' INCLASS='CU3115' HISTORY RENAM INSEQ= 1 INDISK= 1 HISTORY RENAM OUTNAME='NGC6503 ' OUTCLASS='CU3115' HISTORY RENAM OUTSEQ= 2 OUTDISK= 1 ORIGIN = 'AIPSPrimate (NRAOCV IPX) 15JUL94' / DATE = '22/03/94' / File written on dd/mm/yy HISTORY AIPS IMNAME='NGC6503 ' IMCLASS='CU3115' IMSEQ= 2 / HISTORY AIPS USERNO= 36 / HISTORY AIPS CLEAN BMAJ= 8.6629E-03 BMIN= 4.1570E-03 BPA= -61.72 HISTORY AIPS CLEAN NITER= 0 PRODUCT=0 / DIRTY MAP END ÿô ÿïÿìÿ÷ÿôÿíÿìÿð ÿòÿóÿôÿìÿûÿöÿñÿ÷ ÿüÿúÿøÿìÿìÿí'ÿõÿìÿìÿìÿôÿìÿìÿþÿï ÿúÿìÿùÿúÿìÿìÿõÿüÿìÿü ÿðÿü ÿí ÿýÿìÿøÿìÿìÿìÿìÿìÿò ÿ÷ $ÿöÿìÿìÿòÿùÿûÿúÿìÿõÿõÿö ÿìÿð(ÿìÿìÿò'ÿðÿûÿü,ÿûÿÿÿìÿìÿìÿðÿøÿìÿûÿîÿìÿìÿì ÿüÿùÿñ 42ÿúÿìÿïÿùÿýÿúÿù3ÿì ; ÿòÿòÿì'ÿìÿÿ! &>"ÿÿÿûÿõÿõÿöÿóÿôÿìÿòÿùÿìÿô ÿìÿìÿìÿìÿÿÿõÿðÿø)ÿì ÿúÿõ $ ÿûÿìÿì  ÿþÿõ&ÿýÿìÿðÿñ"L 2+ ÿöÿ÷  ÿóÿþÿüÿýÿìÿìÿìÿì1ÿòÿþÿÿÿú$ÿìÿòÿìÿîÿÿÿþÿõÿõÿìÿìÿïÿûÿúÿôÿöÿìÿìÿô  ÿìÿï ÿîÿìÿìÿïÿõ ÿ÷ ÿíÿíÿú ÿìÿû ÿìÿìÿìÿïÿõÿòÿþ ÿùÿìÿìÿìÿý %ÿûÿìÿìÿìÿóÿùÿì ÿóÿüÿóÿìÿø ÿ÷%ÿì ÿôÿøÿôÿôÿìÿïÿìÿìÿùÿúÿúÿÿÿøÿñÿìÿìÿïÿì<4 ÿíÿûÿìÿñÿþÿìÿìÿýÿþÿðÿíÿö"11ÿï!ÿôÿú%ÿôÿô ÿüÿóÿì ÿú ÿìÿíÿûÿöÿý ÿôÿúÿöÿÿÿü ÿüÿýÿìÿôÿñÿìÿìÿìÿøÿî ÿüÿì ÿú ÿìÿìÿö5ÿìÿïÿüÿõÿÿÿôÿìÿôÿìÿìÿìÿòÿìÿÿ'ÿïÿîÿùÿû*ÿùÿüÿîÿöÿøÿìÿìÿöÿð""ÿìÿýÿö ÿûÿî ,ÿòÿì ÿìÿõÿì ÿùÿìÿùÿý ÿüÿøÿúÿîÿôÿøÿìÿöÿùÿîÿñ ÿøÿìÿìÿìÿìÿìÿìÿûÿùÿìÿìÿíÿý ÿîÿìÿì ÿúÿìÿû ÿÿÿïÿ÷ÿíÿôÿìÿìÿìÿì$ÿìÿìÿñ % "'ÿìÿì"4ÿþÿí)  ÿöÿìÿì ÿùÿþÿòÿü ÿü.ÿþ3ÿøÿìÿþÿþÿüÿñÿîÿð !ÿìÿìÿø%ÿ÷ÿüÿýÿûÿ÷ÿþÿìÿìÿõÿìÿìÿ÷ÿì *'ÿìÿûÿóÿðÿìÿì)ÿú 4ÿì ÿóÿîÿûÿìÿïÿüÿñÿû ÿì9 'ÿûÿõÿù-ÿôÿ÷ ÿðÿìÿýÿôÿìÿìÿìA2 ' ÿôÿìÿýÿøÿìÿî ÿìÿòÿúÿøÿìÿìÿÿ 0 ÿìÿú. ÿìÿìÿìÿìÿìÿíÿìÿìÿùÿ÷ÿð ÿîÿò*ÿïÿìÿóÿïÿó ÿúÿ÷ÿóÿùÿùÿóÿóÿóÿóÿõÿíÿþÿýÿÿÿðÿûÿìÿì % ÿûÿÿÿìÿìÿíÿÿÿòÿìÿìÿøÿÿÿìÿìÿüÿÿÿõÿìÿöÿöÿü +ÿüÿù ÿüÿõÿÿ ÿû ÿòÿö)ÿúÿì ÿüÿìÿûÿìÿìÿùÿî ÿ÷ÿìÿúÿùÿøÿý ÿõÿüÿî/"ÿôÿø ÿõ!ÿûÿìÿý ÿûÿ÷ ÿìÿìÿþÿÿÿÿ +ÿð') ÿøÿïÿìÿÿÿñÿìÿìÿìÿñ@ ÿì@4ÿìÿìÿìÿûÿþÿóÿìÿì/ ÿýÿíÿÿÿøÿ÷  ÿöÿí ÿüÿñÿìÿû*^" ÿì& ÿôÿìÿôÿùÿìÿýÿîÿì  =B<ÿìÿþ *ÿìÿìÿìÿúÿüÿøÿóÿùÿÿÿòÿìÿìÿìÿ÷ÿìÿõ(ÿìÿöÿþÿôÿüÿô +7ÿìÿìÿøÿøÿìÿöÿö ÿìÿìÿøÿìÿðÿðÿìÿöÿñÿúÿîÿìÿìÿìÿìÿì ÿóÿøÿìÿøÿÿÿúÿøÿüÿôÿîÿþÿìÿìÿ÷ÿø ÿìÿìÿóÿòÿý ÿìÿìÿôÿþÿúÿû&ÿÿÿì ÿþÿüÿü ÿìÿÿ,ÿýÿÿÿüÿýÿúÿìÿìÿì ÿøÿ÷ÿðÿì &-ÿùÿûÿô 2'ÿöÿìÿùÿþÿìÿíÿóÿìÿ÷ÿìÿþ  ÿúÿýÿñ  ÿøÿõ)ÿýÿì 5 ÿûÿì ÿì ÿÿÿïÿý&ÿùÿì0 *)ÿîÿó ÿñÿñÿìÿìÿìÿóÿûÿýÿù$#ÿúÿûÿöÿì ÿìÿìÿùÿìÿìÿïÿü ÿìÿìÿøÿðÿþÿô ÿÿÿýÿóÿ÷ÿóÿìÿìÿñÿì 5ÿüÿõÿôÿì ÿìÿìÿìÿìÿìÿîÿî ÿûÿîÿïÿìÿìÿþÿõÿìÿìÿÿÿø ÿìÿñÿôÿìÿì ÿñÿíÿú ÿùÿõÿúÿìÿìÿñÿìÿíU1ÿø ÿìÿö" ÿúÿíÿýÿùÿýÿöÿó ÿñÿùÿúÿúÿíÿìÿì(ÿîÿøÿüÿÿÿìÿìÿÿÿþÿöÿñÿì ÿìÿûÿýÿöÿù%ÿìÿøÿþÿüÿìÿìÿøÿ÷ÿìÿìÿïÿì  %+ÿìÿúÿûÿüÿüÿìÿìÿþ#S2ÿùÿîÿüÿöÿïÿöÿì'>ÿìÿìÿìÿì ÿÿ 5 ÿøÿìÿòÿýÿñÿì0+ÿó" % ÿö ÿ÷ÿîÿôÿìÿù'&ÿûÿìÿù"ÿôÿìÿñÿìÿìÿõ ÿìÿî"ÿ÷ÿíÿùÿûÿýÿìÿîÿúÿðÿøÿîÿøÿìÿýÿìÿôÿìÿöÿûÿìÿìÿìÿ÷ÿ÷ÿõ'ÿìÿìÿøÿýÿú%ÿòÿìÿö=ÿüÿüÿìÿîÿõÿúÿôÿí ÿìÿðÿðÿû#ÿû ÿìÿìÿðÿûÿñÿñÿìÿìÿñÿöÿìÿì ÿüÿû0ÿú ÿìÿìÿòÿûÿú ÿÿ (@/ÿûÿìÿì ÿõ#ÿöÿøÿïÿùÿþÿùÿìÿóÿöÿýÿ÷ÿöÿüÿòÿóÿôÿñÿòÿì "ÿýÿñÿîÿüÿñ (ÿöÿì"ÿìÿü" ÿìÿù.ÿüÿû$ÿù  ÿìÿÿÿüÿìÿÿ! ÿìÿðÿïÿøÿñ ÿÿÿýÿù   ÿðÿûÿóÿì ÿìÿìÿòÿìÿìÿü$ÿìÿìÿìÿ÷ÿì"ÿõÿþÿûÿõÿì!ÿý ÿì ÿøÿüÿïÿÿ ÿìÿì ÿþÿìÿìÿöÿìÿôÿ÷ÿûÿìÿúÿû!ÿìÿìÿúÿî1 ÿüÿìÿìÿôÿìÿìÿ÷ÿùÿìÿõ ÿüÿûÿìÿìÿýÿûÿýÿõ ÿìÿìÿöÿþ ÿûÿý ! ÿìÿÿÿñÿî.0ÿìÿìÿýÿìÿìÿìÿÿ$ ÿðÿìÿìÿìÿñÿûÿýÿùÿýÿìÿîÿñÿìÿõÿðÿøÿûÿì ÿð ÿòÿìÿìÿïÿöÿôÿõÿìÿìÿûÿ÷ÿìÿìÿþÿï ,ÿ÷ÿöÿì ÿò $ÿñÿìÿïÿíÿì!ÿòÿìÿì ÿüÿñ ÿÿÿìÿì ÿÿ ÿúÿûÿ÷ÿþÿìÿì ÿ÷ÿìÿðÿüÿìÿìÿòÿùÿïÿìÿïÿîÿóÿìÿ÷ÿìÿö  ÿìÿìÿõÿìÿôÿì  'ÿùÿõÿòÿìÿì ÿüÿìÿÿÿìÿôÿìÿöÿýÿìÿïÿìÿìÿìÿìÿîÿ÷ÿúÿóÿðÿìÿøÿÿÿþÿíÿìÿþÿýÿöÿòÿòÿôÿìÿù"Aÿü ÿóÿóÿì$"ÿìÿõ 6)  + ÿÿÿìÿï/5ÿðÿøÿöÿÿ ÿöÿøÿìÿ÷ÿìÿ÷ÿìÿìÿìÿð"ÿïÿìÿìÿþÿìÿì  ÿòÿìÿìÿýÿøÿðÿð ÿõÿìÿüÿðÿñÿö%ÿñÿú ÿú ÿÿÿîÿìÿöÿö  ÿþÿùÿÿ ÿìÿìÿôÿì>4$ÿìÿìÿûÿìÿþÿîÿù ÿ÷ÿô ÿÿÿóÿï2"ÿ÷ÿöÿìÿùÿúÿôÿï ÿúÿóÿìÿð+ÿó ÿòÿìÿïÿñÿìÿìÿö)ÿìÿìÿìÿìÿìÿøÿùÿüÿûÿì$ÿúÿÿÿìÿìÿ÷ÿòÿüÿðÿì ÿö ÿìÿù+ÿìÿñÿý&!ÿì% ÿìÿìÿüÿõÿìÿìÿõÿúÿìÿìÿøÿìÿìÿìÿìÿôÿõÿì ÿôÿò  ÿòÿùÿìÿøÿìÿøÿúÿóÿýÿöÿø ÿòÿìÿìÿìÿìÿôÿüÿîÿû,ÿø ÿ÷ÿìÿì ÿìÿìÿíÿîÿìÿìÿì #ÿþÿýÿýÿþÿòÿüÿìÿìÿìÿþÿú ÿþÿìÿìÿúÿú ÿû ÿìÿðÿóÿúÿùÿìÿñ)ÿÿÿóÿöÿïÿü ÿïÿìÿýÿôÿìÿìÿû# ÿìÿø "ÿýÿöÿúÿö#ÿïÿìÿóÿúÿúÿûÿúÿýÿíÿñÿìÿöÿð "4+ÿó' ÿòÿù ÿìÿíÿùÿö ÿìÿý- ÿîÿüÿ÷E ÿùÿúÿìÿìÿñ ÿýÿü 20ÿöÿìÿõ -%ÿòÿîÿýÿöÿìÿìÿøÿùÿíÿû,ÿöÿìÿìÿù ÿïÿ÷ÿ÷ÿìÿïÿïÿìÿìÿíÿòÿùÿþÿôÿì ÿÿÿõÿ÷!ÿìÿ÷ÿúÿìÿíÿõÿüÿó!5)  ÿúÿîÿøÿï ÿùÿïÿìÿûÿìÿìÿùÿ÷ÿþÿûÿìÿì&ÿ÷ÿì ÿðÿìÿìÿñÿüÿ÷ÿý ÿìÿìÿÿ  ÿýÿüÿìÿö0ÿùÿò ÿìÿìÿ÷ÿíÿîÿúÿþ ÿýÿì*!ÿõÿý,ÿì +ÿóÿö(8ÿíÿôÿîÿð ÿøÿòÿ÷ÿüÿìÿüÿñÿõÿïÿþÿó ÿìÿúÿìÿùÿðÿìÿìÿòÿìÿýÿôÿÿÿòÿù$ÿïÿìÿìÿìÿðÿ÷.ÿìÿýÿìÿü (:ÿìÿìÿúÿû ÿñÿïÿí&ÿìÿì ÿúÿýÿþÿîÿìÿìÿö(ÿïÿòÿìÿïÿøÿóÿôÿü)ÿôÿì!ÿùÿìÿñ ÿóÿùÿüÿìÿìÿìÿúÿñ&ÿñÿíÿîÿì#. ÿö ÿìÿìÿìÿñÿõÿí0 ÿÿÿìÿìÿôÿì$*ÿûÿ÷ÿìÿìÿþÿì%ÿìÿüÿýÿìÿìÿì$ÿìÿìÿ÷ÿþÿíÿóÿû ÿìÿìÿòÿôÿóÿìÿóÿ÷(ÿðÿïÿð,ÿû ÿì! ÿöÿôÿì!ÿû 4ÿðÿìÿìÿü ÿöÿíÿõÿìÿøÿøÿìÿìÿìÿø  ÿìÿìÿì ÿñÿìÿìÿÿ. ÿú ÿìÿôÿóÿìÿìÿöÿÿÿÿÿøÿþÿìÿìÿüÿìÿïÿìÿìÿòÿìÿì(ÿìÿìÿüÿû( ÿìÿìÿûÿûÿþÿìÿìÿöÿìÿìÿìÿì ÿö ÿíÿìÿìÿÿÿÿÿîÿìÿìÿòÿì ÿöÿúÿÿ  ÿìÿõÿì 'ÿìÿöÿîÿìÿìÿìÿú ÿúÿìÿìÿøÿþÿþÿþ ÿòÿü ÿìÿ÷ÿñÿìÿøÿìÿìÿí ÿõÿùÿî!ÿÿ ÿþÿì 5ÿìÿõ ÿýÿìÿìÿìÿõÿüÿñÿøÿúÿòÿøÿìÿìÿý6  !ÿì ÿí ÿìÿìÿöÿìÿí ÿìÿîÿøÿýÿö ÿúÿöÿü. ÿþ ÿòJÿìÿìÿìÿóÿìÿøÿìÿýÿñÿÿÿìÿðÿôÿì ÿðÿò ÿìÿúÿì ÿìÿìÿõÿùÿÿÿüÿïÿõÿö ÿùÿðÿìÿù# ÿðÿìÿòÿí ÿûÿûÿñÿþÿõÿìÿìÿíÿìÿìÿìÿòÿöÿï-ÿìÿúÿüÿòÿüÿìÿìÿö!ÿöÿìÿÿÿÿÿýÿþ>'ÿìÿíÿïÿüÿìÿìÿúÿóÿôÿìÿøÿìÿìÿìÿøÿÿ2ÿõÿìÿþ ÿòÿþÿÿ'%ÿìÿîÿìÿìÿìÿìÿýÿùÿñ0%ÿìÿöÿìÿìÿì ÿúÿûJÿûÿí  ÿü ÿøÿöÿôÿìÿìÿì ÿøÿþÿìÿì*F #2) ÿù $8ÿúÿìÿìÿìÿòÿìÿùÿ÷ÿõÿöÿÿÿìÿì. ÿ÷ÿìÿìÿïÿóÿÿÿìÿì#ÿýÿüÿìÿì,(ÿí ÿìÿñ ÿòÿìÿúÿìÿì ÿìÿì$ÿþ4ÿîÿì ÿìÿìÿìÿøÿò ÿþÿòÿõÿñÿìÿú ÿ÷ÿûÿÿ ÿýÿìÿü-ÿñÿì ÿìÿìÿìÿýÿüÿóÿùÿìÿìÿ÷ÿìÿöÿ÷ÿûÿöÿðÿüÿù$ÿüÿîÿþÿü ÿôÿôÿìÿì ÿíÿìÿ÷ÿõÿúÿø$ÿìÿî#ÿòÿïÿìÿôÿí1ÿìÿìÿìÿ÷ÿìÿýÿóÿí ÿìÿöÿúÿöÿìÿõÿÿÿöÿïÿð"ÿþÿøÿôÿìÿíÿìÿûÿü'ÿñÿìÿòÿìÿøÿì ÿìÿÿÿìÿôÿöÿÿÿìÿñÿóÿøÿñÿüÿî  $ÿù ÿìÿìÿøÿú)ÿìÿþÿìÿöÿìÿÿÿôÿìÿô ÿÿÿìÿñÿì ÿìÿùÿìÿõ ÿîÿù  *ÿõÿòÿù ÿôÿì ÿõÿìÿî ÿþÿîÿìÿìÿìÿîÿìÿì3ÿìÿìÿûÿùÿìÿì ÿñÿý$ÿìÿ÷ÿìÿøÿìÿì8 ÿøÿí ÿû(ÿÿ ÿì ÿòÿýÿîÿìÿìÿìÿðÿðÿóÿì ÿìÿþÿý ÿõ ÿù ÿûÿûÿìÿìÿ÷ ÿùÿñ&ÿõÿýÿùÿìÿì 5ÿûÿÿÿî&6ÿüÿñÿò ÿõÿìÿìÿüÿñÿíÿøÿì ÿúÿìÿìÿôÿö ÿÿÿì-ÿñÿòÿìÿìÿì ÿÿÿîÿì ÿíÿýÿõ8$ÿìÿóÿìÿìÿñ ÿìÿõÿìÿðÿìÿû)'ÿïÿô ÿøÿ÷ÿìÿì ÿ÷ÿìÿíÿïÿñÿïÿîÿìÿìÿúÿìÿï"ÿý ÿñÿý ÿñÿìÿÿ ÿøÿò ÿ÷ÿìÿôÿìÿòÿìÿüÿìÿùÿñÿö%ÿÿÿúÿüÿöÿïÿìÿìÿöÿì ÿð ÿüÿ÷ ÿðÿùÿ÷ÿòÿì ÿø4 ÿìÿúÿü2'ÿìÿñÿìÿìÿõÿðÿöÿûÿþ ÿúÿìÿìÿìÿýÿÿÿüÿìÿñÿûÿìÿìÿüÿø ÿ÷ÿû-ÿìÿìÿûÿïÿìÿõÿýÿìÿôÿôÿù ÿóÿìÿì'#"ÿìÿòÿòÿñÿìÿûÿìÿìÿô ÿøÿìÿìÿý/) %ÿý"ÿöÿõÿìÿùÿûÿôÿòÿþ$ÿïÿõÿýÿüÿøÿüÿì9ÿìÿì)ÿìÿòÿü  ÿìÿìÿð ÿìÿúÿìÿìÿìÿìÿõ ÿôÿúÿìÿôÿûÿ÷ÿûÿúÿìÿì ÿìÿùÿìÿìÿõÿì ÿý ÿöÿìÿìÿøÿìÿìÿÿ ( ÿì ÿìÿ÷ÿýÿìÿþÿòÿì ÿìÿì. ÿíÿûÿþÿï ÿìÿì '9ÿù #ÿýÿìÿüÿø 6ÿøÿìÿìÿíÿìÿìÿìÿùÿüÿù9ÿöÿìÿì ÿìÿüÿ÷ ÿîÿò ÿô%ÿôÿûÿìÿô ÿüÿì0ÿìÿìÿüÿìÿÿÿìÿìÿóÿìÿìÿøÿøÿìÿìÿö5(ÿóÿõ-ÿìÿöÿöÿúÿìÿò ÿô ÿìÿóÿì$9ÿìÿøÿúÿìÿíÿô <ÿì ÿóÿì$ÿ÷ÿìÿìÿìÿòÿó1.ÿìÿþÿìÿìÿìÿôÿìÿìÿþÿøÿìÿ÷ ÿì ÿñÿñÿúÿóÿõ'1ÿÿÿùÿìÿìÿìÿýÿðÿìÿ÷ÿòÿüÿÿÿì$ÿýÿóÿóÿÿÿýÿìÿøÿûÿø*ÿôÿùÿìÿðÿùÿýÿöÿô ÿìÿí#$ ÿúÿìÿÿÿõÿýÿõÿõÿÿÿúÿóÿùÿúÿõ ÿìÿô ÿîÿì $ÿðÿòÿì%ÿü#ÿþ+'ÿø- ÿìÿøÿî " ÿøÿðÿÿÿìÿúÿîÿìÿù&ÿõÿì ÿïÿöÿìÿôÿöÿûÿìÿì ÿùÿíÿðÿì,ÿû *ÿìÿúÿúÿÿÿÿ4ÿìÿÿ!ÿìÿìÿõ ÿû%ÿìÿìÿìÿü ÿýÿóH %ÿûÿûÿüÿïÿìÿìÿìÿì$ ÿìÿûÿüÿöÿóÿþ )ÿîÿîÿì'ÿîÿõÿúÿïÿìÿìÿó*ÿ÷ÿùÿýÿìÿÿ ÿÿ3 ÿì ,ÿýÿì ÿì ÿìÿì'" ÿì ÿýÿöÿìÿìÿùÿì(ÿì ÿìÿì ÿìÿìÿìÿðÿì0ÿìÿùÿìÿóÿÿÿìÿìÿîÿìÿì-ÿì ÿòÿìÿúÿñÿùÿìÿïÿøÿìÿìÿìÿìÿ÷ÿÿ ÿìÿÿÿïÿìÿìÿìÿðÿÿ ÿþÿìÿì ÿìÿì ÿìÿûÿìÿüÿü ÿñÿï!  Bÿþÿúÿì ÿðÿó  ÿì ÿ÷ÿöÿð ÿ÷ ÿì ÿö ÿûÿìÿ÷ÿìÿûÿùÿîÿìÿìÿöÿìÿìÿì+(ÿöÿþÿö ÿìÿîÿìÿüÿù!ÿì ÿìÿø ÿú ÿñÿìÿûÿìÿõÿòÿìÿöÿþ3ÿô #ÿñÿìÿï  ÿìÿõÿìÿìÿôÿ÷! 7ÿùÿïÿöÿìÿøÿìÿì>&ÿîÿñ ÿìÿðÿìÿìÿìÿì.ÿÿÿüÿôÿþÿóÿïÿìÿ÷ ÿìÿìÿì ÿð$ÿüÿìÿì0ÿìÿÿÿìÿò ÿìÿìÿìÿì ÿõ ÿñÿíÿì ÿìÿìÿø ÿüÿü ÿöÿ÷#ÿ÷ÿõÿìÿô ÿìÿìÿÿÿýÿó,* ÿðÿíÿõÿýÿúÿÿ ÿüÿüÿì ÿï ÿìÿìÿñÿìÿòÿìÿìÿý$ÿðÿ÷ÿìÿòÿö!ÿøÿ÷ÿÿÿü ÿóÿûÿþÿùÿìÿîÿìÿýÿìÿìÿìÿóÿó ÿì #!ÿòÿöÿþ ÿúÿìÿóÿîÿö5ÿìÿûÿìÿþÿûÿùÿì&ÿìÿøÿìÿõÿý ÿÿ ÿôÿÿÿíÿÿÿóÿüÿïÿìÿò ÿüÿÿÿöÿÿ#ÿúÿùÿì ÿð&ÿ÷ÿî%ÿìÿù(ÿ÷ÿìÿìÿýÿìÿðÿì ÿúÿï ÿõÿô ÿõÿìÿìÿôÿõ ÿíÿÿÿì  ÿíÿíÿìÿûÿóÿìÿìÿ÷ÿìÿúÿû<ÿóÿìÿÿÿüÿìÿì;"ÿþÿìÿñ(ÿýÿüÿìÿûÿñÿø $ ÿìÿóÿì ÿìÿùÿìÿûÿÿÿìÿúÿùÿìÿóÿïÿùÿöÿîÿÿÿû ÿøÿÿÿìÿñÿìÿìÿý%ÿõÿì- ÿõ%!ÿîÿìÿì ÿìÿìÿþ ÿúÿìÿìÿì ÿì ÿìÿìÿìÿìÿì ÿíÿìÿóÿîÿìÿ÷ÿìÿì ÿìÿìÿø'ÿùÿõ" ÿø *ÿòÿûÿþÿóÿìÿì ÿý0ÿûÿìÿòÿóÿûÿþÿì $/ÿí ÿûÿû% ÿõ ÿôÿìÿìÿð 0 ÿìÿì ÿóÿìÿìÿñÿíÿïÿñÿóÿüÿõÿì !ÿì%ÿìÿô ÿïÿìÿñÿìÿýÿñ ÿìÿìÿìÿìÿî$ÿìÿõÿñÿõÿÿÿþÿ÷ÿòÿóÿðÿÿÿìÿú* ÿìÿöÿìÿõÿþ ÿìÿòÿò5ÿöÿþÿòÿþ ÿþÿö ÿìÿö  ÿöÿüÿöÿõÿõÿîÿìÿîÿìÿÿÿóÿûÿìÿüÿîÿìÿýÿì ÿüÿìÿïÿì0ÿï ÿìÿìÿõ ÿñÿìÿìÿ÷ÿìÿìÿÿÿìÿïÿÿÿìÿìÿÿÿýÿý'ÿý(ÿÿÿõÿ÷ÿôÿñÿìÿòÿúÿöÿýÿì ÿï?ÿ÷6ÿõÿî ÿõ#ÿñÿìÿø !ÿôÿõÿþÿþÿûÿìÿðÿìÿñ*ÿùÿø,ÿðÿìÿýÿðÿðÿìÿìÿìÿìÿìÿ÷ÿÿÿì ÿìÿìÿýÿðÿìÿìÿìÿìÿûÿìÿõÿñÿýÿüÿõÿôÿì ÿõÿþÿì <ÿìÿìÿíÿþÿú$ÿìÿì ÿìÿñ'ÿÿÿïÿüÿðÿìÿïÿìÿìÿü;ÿñ ÿü ÿùÿûÿüÿùÿþÿûÿôÿõÿõÿøÿïÿÿ*ÿì9ÿì"ÿòÿùÿúÿìÿîÿø)ÿõÿìÿòÿÿ!% ÿõÿìÿìÿøÿìÿøÿöÿþÿùÿþÿüÿìÿþÿìÿøÿôÿìÿî ÿíÿõÿïÿþÿóÿûÿì3) ÿúÿïÿûÿîÿì ÿøÿìÿìÿô&ÿ÷ÿìÿøÿð ÿôÿ÷ÿþÿíÿì %ÿûÿìÿíÿøÿòÿôÿóÿì ÿíÿì(ÿìÿðÿìÿìÿì ÿìÿøÿý$ ÿìÿó ÿìÿüÿìÿùÿù ÿûÿìÿìÿîÿìÿøÿýÿðÿô!ÿìÿôÿÿÿìÿòÿîÿýÿùÿîÿóÿï($ÿì! ÿùÿòÿòÿùÿìÿìAÿøÿì ÿõÿóÿìÿì ÿôÿñ ÿôÿöÿñÿøÿùÿôÿïÿõÿìÿýÿìÿú#ÿùÿìÿñ ÿìÿìÿí0ÿì ÿìÿìÿì ÿìÿìÿùÿìÿìÿüÿíÿìÿìÿú ÿìÿý)ÿþÿì ÿÿÿÿ%ÿø ÿþÿìÿìÿïÿúÿìÿþÿìÿúÿÿÿýÿìÿðÿìÿìÿî ÿÿAÿôÿíÿìÿìÿìÿúÿì ÿìÿùÿ÷ÿìÿì ÿ÷ÿô"ÿúÿôÿõÿýÿþÿìÿÿ'ÿòÿøÿÿÿòÿìÿô  ÿìÿø ÿî ÿñÿíÿìÿùÿìÿýÿñÿïÿÿÿó ÿìÿìÿõ(ÿøÿûÿìÿÿÿôÿìÿìÿÿ* ÿìÿùÿìÿîÿíÿöÿÿÿýÿùÿòÿüÿïÿóÿó . %0ÿû#ÿóÿýÿì ( ÿìÿì ÿìÿìÿÿÿüÿì ÿþ ÿì ÿïÿýÿï ÿö&ÿý/ÿüÿìÿõÿìÿì! ÿöÿñÿì ÿòÿø/ÿìÿñÿìÿìÿð04ÿìÿìÿÿÿøÿìÿì ÿìÿôÿùÿì ÿìÿìÿõÿýÿþ)ÿðÿìÿìÿö!ÿìÿüÿìÿìÿ÷ÿíÿì /ÿìÿøÿì ÿýÿúÿÿÿìÿì +&ÿìÿûÿùÿóÿìÿöÿì ÿþÿìÿìÿì.ÿü ÿõÿìÿô-ÿï ÿìÿîÿöÿìÿìÿ÷ÿÿ ÿì ÿìÿô ÿû ÿìÿì /ÿù ÿïÿùÿì!ÿúÿì ÿûÿîÿö%ÿûÿì-ÿù "ÿìÿðÿô ÿìÿúÿúÿîÿý ÿôÿìÿìÿöÿìÿìÿõ2ÿþÿþÿì ÿþÿøÿõÿï ÿìÿùÿýÿÿÿý ÿý ÿìÿìÿöÿýÿìÿôÿíÿø ÿìÿþ#ÿì .%ÿîÿìÿìÿÿÿüÿ÷ÿû ÿøÿøÿð $ÿìÿþÿóÿìÿìKÿìÿü ÿñÿøÿî Lÿùÿûÿôÿìÿìÿù ÿþ ÿìÿð ÿüÿìÿøÿîÿìÿýÿ÷ÿþ ÿûÿìÿôÿüÿìÿþÿìÿúÿì(ÿïÿì ÿìÿìÿì ÿïÿíÿìÿõEÿì ÿþÿìÿóÿõÿìÿìÿÿ ÿîÿôÿô ÿìÿùÿÿÿìÿì&ÿìÿìÿìÿì ÿû 8ÿì  ÿìÿìÿìÿó+ ÿìÿ÷ ÿù ÿìÿíÿìÿì /#ÿþÿùÿ÷ÿìÿìÿì ÿìÿìÿò"&ÿ÷ÿìÿìÿùÿì ÿìÿìÿñÿù((ÿìÿùÿìÿüÿùÿì ÿñ ÿíÿìÿìÿðÿøÿìÿü$%+ÿìÿìÿîÿðÿü ÿì (ÿìÿïÿìÿìÿìÿì%2ÿÿÿî ÿÿ ÿüÿôÿìÿïÿì&ÿûÿþÿíÿö ÿ÷.ÿÿÿ÷ÿôÿúÿú ÿüÿþ ÿýÿì ÿìÿìÿìÿì !ÿõ ÿü4+ÿöÿìÿýÿìÿöÿýÿì ÿñÿìÿìÿøÿì(ÿüÿìÿôÿìÿó ÿõÿí ÿÿÿûÿûÿìÿôÿóÿõÿõÿìÿì ÿöÿìÿþ$ÿìÿíÿñÿìÿìÿúÿðÿðÿú% ÿìÿõÿìÿþÿûÿìÿîÿìÿÿÿÿÿúÿõÿüÿ÷ÿìÿüÿìÿìÿöÿóÿüÿÿÿõ!ÿóÿìÿìÿñÿòÿíÿ÷ÿõÿòÿþÿìÿûÿìÿýÿþ ÿìÿì ÿìÿìÿþÿìÿñÿò*ÿÿÿìÿìÿÿÿúÿìÿöÿüÿþ ÿÿÿóÿþÿìÿñÿìÿùÿÿ ÿõÿûÿóÿñ ÿÿÿì ÿìÿïÿìÿïÿìÿóÿìÿìÿìÿìÿøÿø ÿïÿìÿôÿñ,&ÿþÿüÿì ÿì$ÿÿÿìÿò  ÿüÿíÿð ÿïÿûÿôÿìÿìÿï ÿìÿûÿùÿüÿûÿìJ ÿíÿýÿí&ÿìÿøÿñÿìÿóÿì-ÿìÿõ ÿð%ÿðÿìÿî ÿìÿñ ÿÿÿþÿìÿøÿþÿó6 7"#ÿðÿðÿú ÿìÿÿÿþÿìÿþÿýÿìÿó+ÿì ÿì15 & *ÿýÿìÿü ÿíÿìÿìÿìÿî&ÿîÿöÿôÿð1ÿìÿïÿìÿì)ÿõÿìÿÿÿÿÿìÿõ)ÿö #ÿþÿÿÿìÿì%ÿìÿìÿþÿìÿì5,ÿýÿìÿìÿûÿíÿñÿì5ÿûÿìÿì+ÿü8ÿüÿìÿÿÿúÿìÿûÿîÿôÿøÿûÿóÿìÿöÿøÿùÿþÿôÿì! ÿìÿýÿõ ÿìÿìÿ÷ ÿíÿõÿúÿìÿðÿÿÿýÿìÿýÿøÿì ÿ÷ÿíÿìÿøÿòÿùÿìÿûÿìÿýÿìÿòÿôÿìÿôÿøÿì ÿîÿìÿù#ÿóÿðÿöÿðÿìÿì<*ÿìÿìÿìÿìÿì$ÿóÿì ÿìÿ÷ÿøÿÿÿì$ÿüÿüÿýÿìÿþ& ÿöÿýÿìÿôÿ÷ÿñÿì-ÿüÿö ÿìÿòÿì)ÿìÿôÿìÿø" +ÿì ÿöÿòÿôÿóÿø ÿöÿÿÿìÿÿ ,ÿúÿìÿûÿõ#+ 8ÿðÿùÿòÿöÿÿÿøÿõÿìÿì ÿøÿõÿ÷ ÿîÿôÿìÿìÿôÿòÿþÿþÿìÿöÿöÿú ) ÿøÿð3ÿþÿÿ ÿì ÿìÿì ÿÿÿíÿìÿìÿìÿó!&ÿìÿí ÿó 4 ÿìÿõÿüÿúÿöÿìÿìÿìÿïÿò1ÿóÿì%ÿüÿìÿøÿìÿìÿì'ÿïÿìÿõ ÿìÿû%ÿþÿø ÿóÿìÿýÿñÿìÿñÿþÿîÿì ÿ÷ÿõÿùÿþÿöÿö!ÿìÿìÿùÿôÿóÿýÿí(ÿøÿì; ÿìÿìÿì *ÿþÿöÿü ÿ÷>ÿîÿôÿüÿõÿìÿîÿìÿìÿÿÿñÿíÿý"ÿìÿì6ÿîÿì ÿìÿìÿþÿø ÿìÿì%ÿòÿøÿìÿìÿïÿì '!ÿ÷ÿì%ÿýÿìÿöÿúÿíOÿìÿõÿì ÿý ÿìÿüÿìÿìÿñÿýÿìÿìÿø"3ÿìÿì ÿì ÿì" ÿíÿìÿôÿû ÿùÿòÿìÿïÿìÿúÿúÿìÿì3ÿü ÿì ÿîÿù3ÿñÿïÿüÿüÿýÿìÿìÿìÿøÿõÿíÿìÿìÿöÿñÿì-ÿü ÿìÿùÿú ÿìÿò ÿîÿïÿÿ ÿì ÿì ÿû ÿìÿïÿö "ÿþÿìÿóÿ÷ÿùP;ÿôÿìÿì ÿìÿûÿîÿõÿú#ÿúÿìÿìÿýÿöÿöÿìÿûÿûÿì ÿöÿìÿìÿì)ÿî3-ÿõÿüÿìÿìÿìÿíÿìÿþÿøÿìÿì "ÿýÿì#ÿõÿì ÿýÿìÿìÿòÿìÿòÿùÿìÿìÿìÿìÿ÷)<-ÿì'ÿìÿìÿìÿìÿìÿý'"%ÿôÿóÿì ÿöÿñÿì-ÿïÿ÷ ÿðÿìÿþÿúÿñ(ÿúÿòÿìÿíÿíÿìÿìÿìÿìÿõÿÿÿü  ÿìÿìÿìÿì ÿû' ÿþÿñÿìÿðÿìÿìCÿìÿóÿìÿìÿõ&ÿùÿóÿõ! ÿîÿô ÿøÿìÿìÿôÿìÿìÿìÿüÿìÿú23ÿûÿìÿÿ3 ÿíÿôÿÿ ÿü1ÿìÿìÿóÿìÿìÿøÿó44ÿúÿìÿøÿñ (ÿìÿûÿîÿìÿùÿûÿîÿûÿü+ÿûÿìÿìÿõÿì#ÿìÿìÿù' )ÿìÿìÿì ÿúÿïÿìÿì(ÿþ ÿòÿûÿíÿìÿõ ÿìÿúÿïÿîÿìÿýÿô0Bÿì ÿúÿñ$!ÿìÿúÿõÿõÿöÿù& ÿô ÿìÿìÿöÿìÿþÿìÿì ÿòÿì+?ÿì ÿìÿüÿùÿùÿòÿìÿìÿô*ÿî ÿøÿìÿò ÿôÿìÿìÿíÿõ 'ÿù ÿìÿöÿìÿì-ÿìÿìÿýÿÿ %ÿì&ÿì3ÿìÿúÿö6ÿìÿüÿìÿôÿðÿúÿìÿìÿì2ÿìÿõÿøÿïÿòÿöÿ÷.ÿÿÿý ÿðÿìÿÿÿýÿìÿóÿô0ÿì"ÿúÿìÿì"ÿüÿùÿöÿì%ÿøÿùÿì$1"ÿ÷ÿîÿì,ÿìÿìÿìÿìÿòÿì(ÿúÿì(ÿï ÿìÿìÿìÿôÿûÿìÿûÿìÿó /ÿñÿìÿû ÿüÿù#ÿþ "ÿìÿï #$ÿì ÿìÿøÿùÿìÿì '!ÿìÿìÿì"ÿìÿúÿôI'ÿì ÿ÷ÿú!ÿþ ÿìÿîÿìÿìÿì C<ÿìÿìÿìÿÿÿöÿì ÿìÿþÿìÿí3ÿóÿïÿôÿìÿôÿþÿòCÿîÿìÿìÿìÿûF' ÿ÷ÿìÿì % ÿþÿì ÿìÿìÿðÿýÿìÿì#3 ÿüÿóÿìÿìÿ÷ÿùÿì*!ÿúÿìÿìÿöÿìÿìÿùÿì, ÿôÿñÿìÿùÿíÿûÿìÿìÿìÿìÿÿÿì /ÿìÿõÿþÿøÿíÿìÿì ÿùÿýÿìÿì#ÿì ÿìÿðÿÿÿøÿìÿìÿõÿüÿìÿð!ÿþÿìÿìÿòÿù"ÿìÿõ ÿðÿò ÿü%1ÿþÿìÿù>ÿùÿìÿóÿî2ÿüÿïÿõÿùÿó ÿìÿöÿúÿìÿìÿþ ÿùÿþÿÿ ÿùÿú ÿì$ÿìÿõ3$ÿôÿñÿìÿðÿÿÿìÿñÿìÿìÿì5ÿìÿûÿòÿìÿìÿì#ÿþ?. ÿì(ÿíÿøÿôÿìÿùÿôÿöÿñÿìÿóÿì2ÿîÿÿÿòÿø ÿìÿíÿìÿþ9ÿù?#ÿþÿìÿìÿóÿìÿùÿóÿñÿú *ÿìÿíÿø3ÿìÿð+ÿìÿó=+ÿìÿìÿñÿìÿúÿìÿìÿì<ÿòÿû$ÿîÿìÿþÿÿÿý2!ÿî ÿìÿì )ÿü"ÿìÿì+ÿðÿìÿÿÿô *ÿü$; ÿó%;ÿõÿìÿìÿì ÿü ÿùÿìÿíÿý)ÿøÿüÿìÿü ÿóÿì * ÿöÿþÿìÿìÿìÿìÿñÿúÿûÿÿAÿþÿìÿìÿìÿÿÿñÿôÿøÿì ÿõÿñ&ÿýÿþÿìÿìÿÿ,ÿÿÿþÿý ÿñ ÿòÿìÿìÿìÿîÿù ÿìÿö&ÿÿÿù ÿûÿìÿìÿìÿùMÿôÿóÿøÿìÿì ÿìÿìÿûÿìÿìÿìÿí ÿìÿóÿý( ÿø$ÿìÿóÿýÿù$ÿøÿì ÿìÿòÿüÿí0ÿöÿõ  ÿì"$ÿõÿìÿú ÿïÿðÿìÿûÿìÿíÿù ÿúÿúÿðÿüÿìÿñÿùÿùÿìÿþÿí  ÿìÿìÿíÿúÿìÿÿ&ÿñÿøÿúÿìÿöÿòÿìÿÿÿúÿìÿô ÿìÿìÿùÿìÿü ÿìÿò ÿýÿ÷ÿñ ÿìÿöÿì ÿìÿìÿìÿøÿðÿþÿôÿ÷ÿþÿø4ÿÿ*ÿ÷ÿõÿìÿì>ÿýÿöÿìÿùÿüÿìÿöÿöÿò% Gÿìÿìÿüÿì ÿó ÿóÿôÿ÷ÿìÿòÿìÿúÿîÿüÿí !ÿîÿîÿìÿìÿìÿýÿìÿñÿòÿü Cÿìÿúÿìÿôÿìÿõ ÿìÿìÿúÿü ÿúÿîÿú ÿíÿóÿ÷ ÿìÿøÿìÿìÿìÿì ÿþ 2ÿìÿìÿìÿìÿòÿûÿñÿðÿýÿÿÿìÿìÿýÿúÿþÿÿÿüÿð0ÿíÿìÿþÿÿ,ÿþÿìÿìÿì*ÿøBÿöÿûÿìÿ÷ÿûÿ÷ ÿÿ<ÿöÿýÿ÷ÿìÿìÿì ÿýÿìÿýÿûÿìÿðÿùÿìÿì0ÿìÿôÿìÿûÿóÿìÿÿÿìÿìÿì ÿöÿùÿúÿíÿìÿðÿì%:ÿìÿ÷ÿìÿì*ÿí 'ÿû+#ÿìÿìÿì $ÿì ÿì ÿóÿõÿøÿ÷ÿìÿô ÿìÿÿÿì" ÿü ÿìÿìÿìÿóÿìÿìÿð'ÿìÿûÿìÿìÿì$ÿýÿðÿì.ÿúÿìÿüÿìÿñ ÿìÿìÿìÿôÿìÿìÿõÿìÿøÿìÿì ÿðÿúÿìÿìÿöÿìÿòÿñ %)7ÿìÿìÿìÿìÿìQ"ÿÿÿìÿì ÿìÿì ÿï)5ÿú!4ÿþÿýÿì ÿìÿìÿøÿìÿíÿìÿõÿòL $3ÿüÿìÿìÿóÿô ÿ÷ ÿþ ÿóÿí ÿøÿö8 ÿìÿì=ÿìÿìÿìÿôÿìÿìÿìÿìÿí ÿ÷ ÿ÷ÿìÿóÿìÿìÿý0ÿöÿìÿìÿìÿðÿìÿìÿñÿóÿÿÿì!ÿôÿýÿìÿíBÿìÿì'ÿúE;ÿû+ÿÿ ÿïÿí=7 ÿòÿìÿìÿìÿìÿþ9ÿ÷ÿø)ÿìÿóÿ÷ÿÿÿôÿóÿôÿþÿí"Zÿì ÿì%ÿïÿì ÿìÿì'ÿÿÿþ ÿìÿú$ÿîÿúÿìÿìÿïÿøÿôÿ÷ÿüÿûÿúÿìÿöÿíÿìÿûÿì $ÿôÿìÿìÿùÿìÿý ÿû 4=! ÿíÿìÿÿÿÿÿÿÿïÿøÿô-ÿöÿíÿý)ÿõÿì ÿíÿîÿõÿðÿìÿùÿí ÿðÿþ)$ÿìÿÿ,%ÿìÿõÿì3., ÿ÷ÿôÿøÿõÿÿ ÿýÿìÿìÿìÿýÿþÿìÿ÷ÿÿ.ÿõÿþÿÿÿìÿñ ÿúÿýÿìÿìÿôÿìÿ÷ÿîÿìÿðÿïÿìÿðÿðÿòÿöÿì&ÿì"ÿì$ÿÿ ÿýÿìÿì ÿó ÿüÿìÿûÿìÿìÿûÿíÿý ÿì ÿóÿûÿõÿìÿìÿïÿï!ÿù ÿýÿìÿüÿ÷ÿîÿìÿì.ÿì ÿìÿìÿÿ ÿñÿìÿìÿïÿîÿõÿð ÿöÿûÿúÿì0ÿÿÿìÿð* ÿìÿûÿüÿôÿìÿìÿðÿì ÿü$ÿìÿóÿûÿìÿìÿù  ?ÿöÿòÿó ÿìÿø ÿñÿìÿì!ÿì:ÿûÿìÿìÿì ÿûÿúÿìBÿíÿìÿìÿìÿòÿÿ,ÿìÿ÷)ÿî ÿì ÿìÿñ ÿì#ÿù ÿðÿìÿìÿüÿìÿì56ÿûÿì&ÿýÿìÿõÿõ&%ÿìÿ÷ÿù ÿì ÿùÿìÿõÿóÿùÿôÿìÿòÿì'ÿúÿóÿþÿí ÿø ÿï-ÿìÿû"Hÿôÿìÿìÿìÿìÿìÿìÿì  ÿýÿíÿÿÿìÿòÿíÿðÿï!%ÿìÿñÿìÿìÿíÿû ÿìÿþÿù*ÿìÿøÿìÿìÿó3$6/ÿìÿò ÿñÿìÿìÿî ÿìÿöÿô)ÿüÿôÿìÿöÿÿÿìÿñÿìÿìÿü:ÿìÿìÿìÿù ÿì(ÿì $)ÿìÿøÿûÿî%ÿñ ÿú5 ÿüÿ÷ÿÿ ÿìÿÿÿìÿìÿìÿìÿí&ÿùÿìÿìÿþ#ÿüÿì:ÿìÿõÿüÿìÿìÿìÿñ ÿìÿø ÿûÿì &3ÿúÿì   ÿñ!ÿÿ ÿ÷ÿõÿóÿì< 6 ÿìÿìÿìÿúÿüÿòÿì!ÿìÿñÿì ÿó ÿìÿìÿóÿñÿìÿìÿìÿòÿìÿì)  ÿð5ÿ÷ÿõÿø.ÿûÿû ÿì1ÿñ $ÿìÿìÿøÿìÿìÿòÿûÿøÿì$ÿøÿý ÿûÿÿ ÿì+"ÿîÿìÿìÿóÿ÷ÿìÿüÿð ?ÿìÿýÿúÿûÿíÿúÿìÿú3ÿìÿìÿöÿóÿ÷ÿõ -Cÿþÿìÿóÿìÿìÿìÿíÿìÿøÿ÷&"ÿìÿþÿì + ÿùÿñÿì ÿó ÿìÿìÿõÿùÿóÿì&ÿð"ÿìÿÿÿîÿìÿøÿõÿíÿøÿîÿïÿú4ÿþÿóÿü ÿìÿìÿóÿï  .ÿï ÿúÿîÿì(&$ÿìÿìÿ÷ ÿóÿìÿìÿìÿùÿìÿøDÿì !ÿ÷ÿôÿö ÿìÿöÿìÿì/ÿì ÿþ ÿþ ÿìÿìÿìÿù!=#ÿðÿ÷ÿôÿìÿí* *ÿîÿûÿ÷5ÿúÿìÿ÷ÿìÿüÿìÿìÿøÿÿ ÿù+8ÿìÿñÿüÿìÿìÿîÿïÿìÿìÿìÿì ÿìÿü'ÿìÿîÿòÿîÿï"ÿì!2#ÿïÿúÿô) :ÿûÿì )=ÿì -ÿó   ÿìÿìÿùÿìÿì ÿìÿøÿìÿüÿüÿì  ÿìÿü4"ÿñÿùÿìÿìÿ÷ÿì ÿïÿî<Dÿù #ÿìÿóÿì ÿì ÿþÿìÿîÿî7ÿýÿìÿìÿüÿìÿþÿÿÿôÿìÿúÿöÿõÿìÿìÿìÿìÿþÿõÿóÿúÿì#ÿìÿúÿìÿíÿìÿû! ÿìÿìÿþÿìÿðÿþ# ÿì ÿìÿõÿòÿý-ÿö ÿìÿìÿì-ÿîÿìÿìÿõ ÿ÷ÿþÿñÿòÿþÿîÿìÿüÿìÿì ÿìÿõÿñÿìÿìÿþÿìÿìÿùÿìÿìÿì*ÿù ÿïÿõÿþÿìÿýÿúÿú.ÿúÿòÿìÿìÿìÿìÿìÿòÿö1ÿìÿìÿì%ÿîÿìÿìÿóÿùÿú,ÿÿÿìÿìÿñÿþÿûÿìÿûÿóÿý ÿì ÿøÿìÿþÿñ8ÿìÿìÿìÿïÿìÿì ÿìÿìÿû ÿìÿìÿ÷81ÿñ$>ÿïÿìÿîÿøÿìÿüÿ÷ÿð ÿìÿìÿýÿïÿõ,ÿ÷ÿúÿì 7 2ÿ÷ÿìÿìÿü ÿîÿïÿúÿíAÿì1ÿìÿìÿöÿóÿý ÿîÿì(ÿýÿìÿôÿùÿìÿìÿì! ÿìÿ÷ÿ÷ÿìÿìÿþÿìÿìÿþÿì?!(.ÿúÿÿÿíÿìÿìÿ÷ÿìÿì D 8ÿìÿõÿìÿì:,ÿü(ÿû ÿìÿìÿö.ÿ÷ÿìÿô.ÿìÿìÿý'ÿìÿìÿì3ÿÿÿìÿþÿìÿìÿö"ÿòÿìÿøÿùÿõÿø ÿù ÿìÿì,ÿì  ÿì ÿìÿì!&@:ÿÿÿìÿìÿìÿøÿìÿò;ÿìÿìÿñÿùÿì4ÿì%ÿþÿìÿôÿùÿöÿòÿûÿðÿöÿôÿø'ÿõ ÿðÿòÿì !ÿþ ÿìÿìÿì.ÿìÿìÿïÿøÿôÿüÿìÿíÿ÷ÿñÿÿÿì.ÿìÿùÿì#ÿðÿñ ÿì & ÿò ÿìÿìÿìÿì ÿìÿõÿìÿýÿüÿòÿìÿì>ÿðÿþ'ÿôÿìÿì?5ÿìÿîÿìÿìÿì"ÿìÿì ÿìÿïÿüÿÿ ÿìÿì0ÿøÿøÿü  !# ÿôÿíÿìÿì ÿû  ÿÿÿýÿþ5,ÿìÿûÿìÿìÿý5 !ÿõ, :ÿìÿìÿìÿÿÿ÷ÿìÿì*ÿìÿøÿðÿþÿúÿíÿìÿýÿì &ÿô "3ÿüÿì  ÿìÿìÿõÿõÿìÿìÿùÿò ÿïÿóÿïÿìÿûÿñÿõ ÿìÿì*+ÿì.ÿúÿðÿìÿì ÿìÿóÿìÿýÿýÿôÿìÿíÿìÿìÿì ,ÿùÿìÿýÿðÿìÿìÿìÿöÿìÿ÷@ÿí ", ÿñÿïÿþÿìÿìÿìÿîÿìÿüÿôÿõÿñÿìÿõÿìÿùÿì  ÿìÿüÿô"ÿìÿòÿõÿì ÿìÿýÿðÿöÿòÿìÿìÿìÿìÿì'ÿòÿóÿ÷ÿìÿì#ÿì ÿÿ(-ÿùÿÿÿý ÿùÿì(ÿíÿìÿì>ÿì ÿìÿýÿìÿøÿìÿìÿõÿì3 %+ ÿþ#Lÿÿ0ÿùÿóÿìÿõÿðÿìÿì ÿ÷ÿôÿìÿìÿìÿì/ÿìÿðÿôÿøÿûÿìÿìEÿìÿÿÿìÿö ÿìÿùÿìÿûÿöÿìÿñÿìÿìÿò5ÿì)ÿìÿìÿìÿì ÿìÿ÷ÿìÿ÷ÿüÿìÿìÿûÿìÿûÿìÿìÿìÿýÿíÿìÿûÿ÷ ÿíÿû )ÿö$.ÿñÿõÿûÿìÿìÿìÿüÿø*ÿÿÿüÿüÿòÿìÿìÿñÿïÿìÿûÿúÿúÿñÿìÿòÿìÿìÿþ ÿî ÿòÿñÿý& %ÿõÿöÿôÿõ$Cÿìÿøÿÿÿïÿìÿýÿÿÿìÿûÿöÿÿÿù &ÿúÿ÷ÿì ÿìÿø ÿìÿõ) ÿì)&ÿìÿì,ÿû--ÿìÿìÿì ÿíÿìÿñÿìÿøÿìÿúÿ÷ÿþÿ÷ÿôÿì ÿï"ÿìÿñÿìÿñÿìÿ÷ÿìÿù ÿ÷ÿ÷ÿìÿìÿìÿìÿìÿìÿý=ÿü"4ÿì ÿÿÿþÿòÿõÿóÿìÿþÿõÿûÿì ÿïÿì*ÿïÿìÿüE)ÿüÿûÿì ÿñÿì ÿñÿÿ!ÿìÿî ÿìÿì'&ÿöÿñÿîÿï ÿìÿìÿôÿìÿý ÿù(ÿíÿìÿõ1ÿìÿìÿñÿò -ÿþÿð (ÿï !ÿöÿìÿìÿõÿì<ÿîÿìÿìÿì'(7ÿþÿÿÿóÿýÿüÿì9ÿìÿìÿìÿìÿþ6ÿðÿì ÿð + ÿíÿîÿì ÿöÿñÿîÿìÿóÿìÿìÿìÿì&ÿôÿïÿì ÿýÿìÿþÿ÷7ÿòÿìÿì* ÿìÿì%ÿìÿòÿìÿù*ÿìÿìÿìÿïÿô.ÿòÿìÿïÿìÿòÿüÿþ 40ÿî/ÿú ÿøÿì ÿùÿì " ÿÿÿì ÿðÿìÿýÿìÿì ÿìÿý 5ÿìÿø.ÿìÿì ÿìÿìÿìÿ÷4ÿìÿïÿìÿì ÿì ÿ÷ÿìÿìÿ÷ÿø*ÿÿÿôÿìÿþÿøÿíÿì,ÿðÿìÿìÿü!ÿõÿï(ÿì!;ÿì 6ÿìÿò(ÿñ 5ÿìÿ÷ÿý ÿìÿì$ ÿõÿíÿì7ÿøÿì"ÿô#ÿìÿìÿþÿìÿìÿþÿû7ÿýÿíÿì ÿùÿìÿöÿì ÿìÿúÿþÿìÿìÿ÷ ÿùÿÿÿì ÿìÿö#ÿìÿüÿöÿìÿì'= ÿýÿìÿíÿûÿ÷ÿñ 5ÿìÿÿÿü ÿìÿìÿìÿìÿìÿìOÿõÿ÷ÿíÿì ÿìÿþÿó!0ÿþÿìÿìÿòÿìÿìÿìÿûÿì1ÿìÿõÿðÿûÿìÿìÿÿÿìÿì ÿýÿìÿìÿþÿìÿîÿþ20ÿüÿìÿùÿìÿó ÿ÷ÿ÷ÿñÿì ÿìÿ÷5Iÿñÿìÿôÿìÿôÿõ(ÿüÿîÿì 0ÿõÿî ÿú*ÿíÿ÷ÿñÿù ÿî' ÿìÿìÿìÿþ!,ÿÿtD/ÿì2ÿìÿìÿýÿúÿì ÿóÿìÿìÿì"$ÿìÿùÿðÿì =ÿôÿìÿÿÿìÿð(ÿöÿìÿö9ÿõ!ÿúÿôÿìÿðÿìÿîÿìÿìÿüÿì, ÿúÿû ÿü ÿýÿîÿìÿìÿìÿìÿì ÿìÿýÿþÿ÷ÿìÿìÿÿÿìÿõÿ÷ ÿõÿð ÿìÿì# ÿìÿùÿþÿìÿþÿøÿþÿòÿôÿüÿýÿìÿìÿüÿìÿûI ÿÿÿîÿø ÿìÿýÿ÷ÿìÿùÿøÿù ÿþÿÿ ÿìÿìÿíÿôÿûLÿþÿòÿòÿôÿòÿÿÿõÿùÿíÿìÿìÿìÿõ  ÿìÿìÿò >(ÿì)ÿìÿûÿì ÿûÿìÿùÿìÿðÿöÿìÿìÿìÿñ Y >ÿì&ÿýÿð ÿìÿìÿÿÿ÷ÿôÿìÿìÿìÿì4ÿíÿ÷ÿüÿî ÿìÿì<$ÿìÿìÿï ÿü ÿûÿðÿìÿìÿô,ÿìÿì&ÿìÿìI3ÿö ÿìÿì ÿþÿìÿìÿìÿìÿìÿöÿûÿðÿö#ÿì&,ÿýÿìÿìÿìÿì' ÿóÿÿÿì 5ÿò ÿìÿòÿìÿïÿì8ÿö ÿì ÿìÿìÿìÿìÿìÿö ÿ÷ÿìÿìOÿöÿìÿìÿì ÿìÿìÿþÿíÿìÿüÿìÿú"ÿðÿúÿìÿìÿìÿÿ 6ÿö .ÿþ (ÿòÿìÿìÿúÿìÿþÿìÿì/ÿìÿñÿúÿìÿìÿì!ÿìÿìd ÿìÿò ÿòÿòÿó ÿþÿìÿðÿÿÿúÿì(ÿôÿìÿìÿú ÿü ÿìÿìÿý@ ÿù ÿþÿøÿìÿðÿðÿüÿî 0ÿï/>ÿì ÿìÿòÿÿÿ÷ÿûÿú ÿüÿúÿùÿìÿìÿìÿì ÿìÿüÿìÿìÿöÿøÿõÿüÿìÿðÿõÿíÿÿÿìÿìÿí?ÿÿÿìÿî ÿìÿïÿìÿÿ ÿïÿìÿþÿìÿìÿù ÿû%ÿþÿìÿìÿì -ÿõ &+ÿïÿøÿþ ÿì)ÿìÿùÿì ÿìÿìÿÿÿìÿìÿïÿûÿÿ ÿìÿó ÿìÿì2ÿ÷ÿìÿì ?ÿÿÿïÿìÿý ÿì ÿìÿìÿó;Xÿìÿìÿì%!ÿìÿú 'ÿýÿýÿóÿìÿìÿøÿìÿñÿõÿìÿí0ÿìÿìÿìÿýÿòÿúÿ÷ÿì ÿî+ÿìÿüÿþÿíÿìÿÿ!)%ÿìÿìÿö!ÿóÿì ÿô  ÿìÿìÿìÿìÿíÿìÿþ/$ÿîÿõ3ÿìÿìÿìÿð ÿñÿî ÿïÿìÿðÿÿÿùÿìÿûÿùÿûÿî ÿïÿì& ÿíÿìÿì ÿúÿú Gÿöÿíÿïÿÿ "ÿû'ÿì5ÿöÿìÿñÿùÿìÿìÿóÿÿÿøÿìÿóÿðÿùÿÿÿù ÿóÿì!ÿñÿìÿì ÿðÿìÿþ ÿìÿìÿìÿì ÿì1ÿìÿû,ÿú# ÿìÿù ÿì"ÿû Fÿìÿìÿôÿì5 ÿìÿì$1ÿìÿþ% ÿðÿìÿñÿø ÿöÿì ÿîÿìÿóÿù0ÿìÿñÿìÿìÿìÿðÿö '!ÿíÿúÿùÿñÿìÿô# ÿýÿïÿüÿøÿìÿì!Oÿìÿìÿìÿòÿìÿìÿìÿîÿü.ÿìÿìÿýÿóÿìÿìÿìÿì82 ÿì71ÿìÿìÿìÿìÿðG{FI ÿìÿìÿýÿúÿìÿöÿó ÿô ÿÿÿúÿìÿíÿìÿìÿìÿìÿúÿì'ÿîÿõÿþKÿùÿôÿìÿÿ#ÿøÿìÿõÿþÿúÿôÿñÿì!$ÿýÿúYEJgÿìÿïÿð8ÿìÿìÿøÿÿÿìÿìÿì ÿûÿìÿìÿþÿþÿðÿìÿìÿìÿù3ÿýÿðÿìÿöÿü ÿìÿîÿüÿûÿìÿì .ÿìÿúNÿìÿÿÿþ J%#rŠ…eY1ÿùÿôÿìÿõ:?9'ÿùÿìÿïÿÿÿìÿò'"ÿíÿò'ÿìÿ÷ÿðÿíÿîÿîÿøÿÿ ÿìSÿìÿùÿì3ÿ÷ÿì,CMM|a[j  %  ÿóÿý (ÿý!ÿþÿþÿý#ÿìÿøÿìÿìÿì 4ÿìÿìÿþÿòÿìÿìÿìÿóÿú % Tˆ™ÂRI$ ÿü+ ÿóÿì ÿýÿìÿìÿì ÿþÿòÿùÿìÿì%ÿõÿúÿìÿìÿöD-(ÿùÿìÿìÿì6SvptRI8,$ ÿù ÿì%#ÿðÿìÿìÿìÿóÿÿÿíÿì&ÿìÿôÿüÿþ ÿìÿì ÿþÿ÷ÿìÿìÿøÿýÿìÿïÿùÿìÿìÿô ÿìÿôÿì)9+9*aK#&ÿñÿý ÿúÿÿÿðÿôÿðÿù ÿôÿôÿì ÿì4ÿìÿìÿì ÿï$ÿìÿ÷ÿìÿìÿì ,*EW%!-<L7ÿíÿìÿìÿìÿóÿþÿì$ÿìÿñ ÿíÿìÿ÷$ÿôÿúÿýÿôÿìÿì#ÿýÿñÿõÿìÿìÿìÿì.ÿï!!ÿìÿìÿüÿìÿìÿìÿõ$I\ŸnPE+ ÿù '  ÿì:ÿó ÿìÿì  ÿìDÿìÿìÿøÿìÿìÿþÿì ÿúÿì "ÿú4ÿúÿ÷ÿìÿì 2a@9 ! .&LS45&ÿûÿì6ÿúÿíÿñÿìÿì' .Eÿìÿþÿþÿì-ÿõÿìÿìÿ÷ÿìÿðÿìÿóÿöÿþÿû ÿü ÿÿ(=)nb4;e_ÿòÿöÿýÿïÿìÿìÿìÿìÿó ÿýÿøÿøÿìÿìÿõÿòÿìÿìÿî5&ÿìÿìÿí"ÿìÿòÿìÿìÿûÿíÿôÿÿÿúÿìÿø 1L…jCSNJÿìÿìÿûÿì ÿìÿúÿîÿúÿôÿô*0ÿìÿìÿûÿìÿõÿìÿì ÿýIÿú.ÿìÿì ÿó ÿìÿì?ÿì#Bÿûÿûÿ÷ ÿ÷$!*%:ÿÿ ÿòÿð ÿùÿìÿðÿìÿìÿìÿõDÿúÿÿÿùÿìÿõ ÿòÿìÿì=ÿìÿüÿóÿìÿìÿöÿìÿòÿìÿñÿüÿìÿìÿþÿû)Iÿìÿþ-IA#H#*4ÿýÿðÿìÿÿ$ÿøÿì+O %ÿòÿìÿìÿìÿïÿìÿù ÿÿÿìÿìÿòÿøÿìÿýÿìÿìÿîÿìÿìÿìÿìÿìÿòÿôÿì$5>-QA!=>7' ÿýÿòÿìÿô'ÿìÿô ÿì7 8@+6ÿíÿìÿíÿìÿðÿôÿìÿúÿìÿú ÿñÿùÿ÷ ÿü& ÿðÿ÷ÿï$>+,R5ÿìÿìÿúÿì ÿìÿìÿìÿÿÿì%ÿìÿü.ÿÿÿñÿìÿî ÿìÿøÿóÿøÿìÿìÿøÿø8ÿìÿìÿùÿìÿìÿí&E)& ÿÿ* ÿìÿì-ÿÿÿìÿìÿü!ÿìÿì 'ÿóÿûÿìÿûÿøÿùÿý ÿì ÿÿÿòÿûÿìÿìÿõ6& ÿò ÿôÿì(,@W5ÿìÿüÿüÿìÿìÿòÿðÿìBÿìÿþÿì ÿüÿíÿóÿøÿí"ÿìÿîCÿò!ÿÿÿ÷ÿÿÿø ÿìÿìÿî(ÿìÿûÿó&F++1ÿïÿñÿ÷ÿý%ÿìÿìÿì ÿìÿìÿì ÿìÿíÿð ÿîÿìÿïÿìÿúÿðÿìÿìÿìÿöÿìÿ÷ÿøÿþÿýÿÿ 6ÿòÿöÿõ2ÿú$ÿùÿöÿì#:ÿì"Cÿì)*ÿïÿöÿð ÿøÿìÿöÿìÿòÿìÿì ÿüÿìÿìÿöÿþ'ÿìÿûÿø 3 ÿùÿñ3!1'ÿìÿìÿì  ÿìÿü*ÿìQÿ÷ÿô ÿìÿó ÿìÿùÿìÿÿ ÿùÿÿÿî'ÿìÿìÿøÿìÿìÿøÿÿ(ÿúÿìÿþÿìÿìÿìÿìÿìÿìÿýÿìÿìÿí ÿõÿìÿõÿì ÿìÿòÿòÿìÿñ ÿìÿì&ÿöÿÿ&ÿìÿï%ÿìÿñÿ÷ÿþÿìÿì15ÿùÿìÿíÿüÿìÿòÿíÿìÿí ÿ÷ÿûÿöÿìÿìÿúÿðÿìÿóÿìÿìÿìÿì#ÿöÿìÿìÿì ÿìÿô%ÿÿ>ÿìÿìÿìÿìÿíÿìÿý)ÿîÿìÿìÿú&#ÿóÿìÿìÿòÿóÿíÿöÿìÿì2ÿìÿìÿô(ÿúÿûÿùÿð ÿìÿìÿü !ÿìÿïÿý4ÿìÿîÿñÿ÷ÿìÿöÿìÿìÿñÿúÿîÿìÿì #ÿó:"ÿìÿìÿìÿîÿïÿýÿüÿøÿì! ÿìÿðÿûÿíÿú<ÿìÿíÿì"E- ÿï ÿìÿöÿìÿø'ÿûÿý %+6$ÿ÷.'ÿöÿúÿûÿó ÿüÿìÿúÿìÿìÿþ0ÿìÿìÿô,ÿüÿõÿìÿòÿùÿùÿñÿìÿñÿüÿ÷ÿìÿìÿ÷6 ÿï)ÿô &ÿìÿìÿìÿñÿñÿìÿìÿþ.*ÿñÿìÿôÿõÿì*ÿí ÿîÿü%ÿìÿþÿþÿìÿöÿþÿú'ÿìÿìÿì+ÿôÿìÿì,ÿìÿõÿøÿ÷ÿöÿìÿñÿïÿïÿúÿ÷ $ÿöÿóÿì9ÿüÿîÿôÿì# ÿìÿò(7ÿìÿì!ÿìÿìÿý=ÿìÿûÿì8 ÿìÿìÿðÿúÿú ÿìÿóÿôÿþÿïÿ÷ÿõ ÿþÿó*ÿìÿü'ÿðÿìÿìÿíÿïÿò& ÿü-ÿìÿìÿóÿü G"ÿìÿìÿüÿíÿø 8&ÿíÿö ÿüÿìÿì)ÿõÿñ  ÿüÿðÿìÿì ÿôÿìÿñ)ÿïÿõ+(ÿòÿìÿì;ÿìÿìÿìÿìÿìÿñÿû ÿìÿ÷ÿþ ÿôÿì$ÿðÿñÿîÿïÿú  3ÿÿÿì" +ÿîÿúÿì%$ ÿúÿóÿîÿÿÿìÿì ÿìÿìÿ÷ 9ÿù ÿö05ÿìÿìÿìÿø ÿòÿì-ÿôÿî,ÿìÿûÿíÿýÿñÿüÿì"ÿìÿÿ'ÿþÿì/ÿìÿòÿìÿìÿìÿù ÿóÿù!ÿøÿìÿìÿñÿûÿì ÿìÿì."ÿìÿó,ÿûÿìÿìÿìÿìÿìÿìÿî"ÿðÿìÿìÿýÿì ÿñÿì2ÿúÿõ, &ÿìÿìÿìÿìÿìÿìÿì6ÿñ4 Hÿ÷ÿñÿìÿí*ÿøÿÿÿìÿìÿøÿìÿöÿì2*"ÿòÿìÿìÿ÷#ÿìÿþÿì"ÿîÿóÿûÿöÿìÿïÿìÿìÿìÿìÿìÿð(ÿìÿùÿùÿìÿú ÿû/ÿì ,4ÿ÷ÿôÿïÿüÿýÿìÿÿÿìÿìQÿõ*ÿìÿþÿýÿì# ÿìÿìÿ÷ÿñ5ÿì )'# 8ÿò-ÿûÿ÷ÿìÿìÿü'ÿíÿìÿúÿûÿúÿìÿìÿìÿìÿìÿì$ÿóÿ÷(ÿüÿìÿìÿ÷ÿôÿìÿì@ÿìÿñÿÿÿüÿïÿõÿÿÿìÿìÿì ÿýÿì)ÿìÿüÿìÿì(ÿýÿìÿì ÿîÿì ÿìÿòÿì ÿûÿìÿìÿ÷ÿìÿìÿõÿüÿìÿìÿìÿìÿìÿóÿì)ÿìÿñÿùÿý#ÿì(ÿó  ÿøÿìÿìÿÿ ÿìÿìÿ÷ÿíÿñÿúÿìÿìÿìÿðÿìÿÿÿìÿìÿìÿòÿìÿÿ& <ÿú  ÿì /ÿôÿíÿòÿòÿù)ÿìÿñ ÿìÿôÿýÿìÿìÿû ÿòÿìÿõ$ÿìÿüÿìÿùÿìÿþ ÿì2'ÿìÿìÿó ÿú+ÿöÿìÿìÿìÿîÿúÿìÿì(ÿî ÿýÿìÿõÿòÿüÿþ#ÿö ÿìÿøÿ÷ÿìÿìÿðÿì"ÿúÿì ÿìÿÿ ÿ÷ÿìÿì Rÿìÿó Cÿìÿý#ÿìÿò% ÿìÿîÿìÿýÿûÿñÿì#ÿøÿìÿì/ÿìÿì 5#ÿî3ÿóÿþÿõ ÿì1ÿû"ÿì ÿýÿìÿì5-ÿÿÿìÿôÿíÿùÿìÿ÷'ÿïÿìÿì ÿìÿûÿìÿñÿìÿì%+ÿñÿñ4ÿì ÿüÿñ(ÿì:#+%ÿìÿìÿûÿìÿì 8-ÿû2ÿü!ÿìÿûÿîÿìDÿúÿìÿôÿìÿìÿìÿìÿú% ÿìÿìÿýÿì8ÿìÿìÿíÿìÿòÿùÿíÿøÿþÿìÿìÿìHÿùÿïÿúÿìÿôÿþÿüÿì5ÿñÿìÿì9'ÿìÿìÿìÿþÿôÿì%ÿìÿìÿìÿ÷ÿþÿûÿ÷ ÿìÿìÿÿÿìÿìÿùÿì ÿì#ÿüÿû/ÿü ÿøÿì ÿüÿòÿìÿ÷ÿìÿì!ÿíÿìÿôÿþÿÿÿíÿõÿñÿô(ÿì ÿìÿìÿøÿÿÿìÿì >ÿñÿúÿì ÿúÿìÿüÿì ÿìÿì$ÿùÿì*ÿìÿüÿì#ÿíÿìÿìÿþÿìÿì4ÿÿÿìÿù4ÿýÿ÷- ÿóÿì2ÿõ(ÿòÿôÿìÿôÿû)ÿþ ÿñÿíÿø1Fÿìÿì,ÿìÿìÿìÿøÿñ ÿð' ÿöÿìÿíÿìÿìÿøÿôÿìÿðÿùÿìÿìÿìÿìÿìÿÿÿø ÿìÿõÿì ÿóÿì ÿìÿøÿó#0ÿùÿüÿýÿòÿÿÿìÿ÷ÿøÿì ÿìÿûÿìÿìÿìÿì ÿ÷ÿò$R ÿü ÿîÿì#ÿùÿìÿìA>ÿÿÿûÿ÷ÿìÿüÿìÿìÿì%ÿòÿì)4(ÿì &ÿÿÿùÿù;ÿì"ÿìÿòÿñÿìÿúÿû ÿìÿìÿïÿ÷ÿìÿì4#ÿíÿìÿòÿìÿòÿýÿìÿìÿìÿñÿþ&<"#ÿìÿì6ÿðÿìÿì+ 9ÿüÿø -ÿïÿìÿò2, ÿì2ÿìÿìÿú'%ÿÿÿýnC' ÿùÿì?ÿïÿìÿìÿìÿì ÿöÿðÿûÿÿÿìÿì".ÿìA "ÿìÿìÿý) ÿøÿìÿúÿüÿìÿÿ4ÿìÿìÿò6ÿþÿìÿúÿìÿüÿüÿìÿìÿóÿð  (ÿìÿìÿìÿì  ÿìÿìÿóÿìÿìÿìÿøÿóÿìÿøÿùÿÿ ÿðÿìÿìÿìÿöÿí ÿìÿìÿðÿíÿìÿñÿûÿìÿù ÿìÿì# 9ÿÿ ÿûÿî)),ÿìÿì$-ÿýÿìÿìÿûÿð,ÿìÿìÿõÿôMÿìÿõ ÿüÿìÿöÿìÿìÿýÿûÿìÿì 'ÿñÿì ÿì9ÿìÿ÷ ÿùÿìÿì .ÿùÿìÿìÿòÿìÿìÿú ÿúÿìÿùÿì#P6ÿìÿû ÿìÿùÿûÿìÿôÿóÿìÿìÿìÿìÿ÷'1ÿìÿìÿîÿòÿìÿìÿùÿì:ÿõÿó ÿìÿþÿ÷ÿ÷ÿ÷ ÿìÿïÿòÿü+ÿìÿìÿöÿù!ÿöÿð*ÿì+,ÿìÿìÿú ÿûÿìÿìÿì!ÿìÿìÿì ÿìÿì ÿìÿ÷ÿìÿùÿîÿìÿñÿóÿôÿìÿþÿûÿùÿÿ%ÿîÿû ÿìÿì"ÿûÿìÿðÿòÿýÿíÿìÿþÿì ÿìÿìÿõÿìÿï!ÿìÿìÿìÿÿ>ÿôÿìÿìÿïÿüÿÿÿìÿùÿìÿìÿìÿî  ÿøÿìÿìÿìÿù@(ÿìÿó5ÿøÿìÿì#ÿóÿòÿóÿôÿìÿøÿò);ÿìÿõÿìÿò!ÿòÿìÿìMÿíÿìÿñÿûÿü ÿûÿóÿìÿì ÿù.)ÿõÿìÿìÿî ÿý ÿìÿü * ÿòÿüÿìÿìÿøÿìÿí 'ÿìÿí"ÿì ÿìÿñ ÿïÿõÿôÿìÿìÿÿÿúÿüÿüÿþÿìÿóÿìÿìÿì%1ÿì ÿìÿÿÿìÿìÿìÿíÿìÿüÿìÿóÿýÿìÿìÿìÿÿÿìÿì0ÿ÷ÿþÿýÿÿÿìÿòÿðÿì ÿìÿìÿþÿðÿü ÿì1ÿìÿìÿì=/ ÿìÿÿÿì2ÿìÿìÿì ÿìÿìÿìÿìÿìÿú ÿüÿýÿìÿìÿûÿìÿüÿþÿìÿì2Jÿüÿìÿìÿóÿ÷ÿìÿìÿì8< ÿìÿì&ÿïÿúÿöÿÿ ÿ÷ÿî ÿí ÿíÿþ! ÿðÿó2ÿìÿìÿì'# ÿöÿúÿìÿ÷ÿìÿÿÿóÿìÿì 1(ÿìÿìÿüÿþ ÿ÷ÿûÿì- ÿþÿûÿìÿ÷ÿÿÿòÿ÷3/ÿü-ÿìÿìÿì ÿöÿöÿõ(< ÿòÿîÿìÿÿÿõÿôÿìÿìÿûÿóÿìÿùÿï  ÿìÿìÿþÿìÿÿ0ÿüÿñÿìÿìÿì"1ÿõÿñÿöJÿúÿìÿõ ÿìÿìÿìÿü ÿìÿìÿïÿöÿìÿì ÿýÿíÿð#ÿìÿîÿìÿý 0 ÿìÿìÿìÿìÿüÿï(ÿöÿìÿìÿò ÿì1ÿôÿõ&ÿòÿöÿì Kÿìÿìÿòÿô'>ÿìÿì 1ÿìÿì$ÿÿÿûÿðÿûÿìÿýÿìÿì&ÿìÿì 2ÿ÷ÿìÿìÿìÿìÿùÿýÿöÿìÿì'2-ÿð ÿúÿìÿì.ÿíÿìÿò ÿó1T ÿìÿìÿìÿöÿìÿìÿì %ÿìÿì') ÿöÿþÿúÿìÿìÿì"ÿí62ÿìÿì($ÿìÿìÿìF§†p,ÿìÿìÿìÿìÿìÿìÿûÿìÿûÿìÿìÿìÿìÿìÿôÿìÿó'ÿú.ÿîÿìÿôÿöÿìÿîÿìÿìÿúÿìÿìÿìÿìÿì:ÿýÿûRs£²nr‰"ÿì ÿìÿìÿí ÿìÿìÿìÿðÿìÿôÿþÿïÿþÿõÿìÿû+ÿõÿìÿñÿÿ ÿþ-ÿìÿøÿöÿíÿí ÿì(ÿì 8ÿì OJR¬ÂÎÀœt ÿõÿí13V5ÿìÿì ÿìÿ÷"ÿíÿõ## )ÿ÷ÿ÷ÿ÷ÿìÿìÿìÿìÿìÿìEÿìÿðÿì>ÿìÿîÿìÿñ7=‚£¥ÙÆŸ·P/+#  $&3'ÿþ $ÿô*ÿýÿü+ÿôÿüÿìÿø,ÿìÿìÿîÿìÿìÿì+,ÿìÿìÿóÿúÿìÿñÿíÿñÿû&,)‹ÐêüÑ™¡dJ-/ ÿöÿìÿìÿòÿìÿìÿöÿý%' ÿõÿùÿìÿô ÿó ÿìÿìÿì .ÿñÿìÿôÿùÿú/ÿùÿñÿüÿøÿìÿì ÿìÿûÿ÷ CÍÒ¾š’‡{wG+ÿûÿì ÿõÿìÿìÿìÿìÿìÿì.0ÿìÿöÿì) ÿìÿìÿîÿð#ÿñ ÿûÿìÿìÿíÿõÿìÿöÿìÿì|¹›|p“|cT882! ÿøÿüÿìÿùÿìÿñÿìÿìÿìÿó6ÿìÿìÿìÿþÿì*!#ÿñ ÿìÿìÿüÿúÿüÿìÿì]‰¤u_Pjf^5ÿìÿüÿì@ ÿðÿðÿîÿþÿþÿìÿìÿù"ÿì )ÿûÿì #ÿôÿìÿìÿìÿì&!ÿï)!ÿìÿì ÿìÿìÿìW©ú»|„sk?(J\) ÿþÿìÿ÷ÿìÿìÿýÿìÿø!ÿìÿûÿìÿìÿìÿøÿì ÿïÿìÿì*ÿù3ÿùÿì$ÿì*.Zf—r[Rd£‡^UC&HN/Aÿùÿ÷3ÿìÿìÿ÷ÿìÿì #!C+ÿìÿöÿÿÿùÿðÿì6 ÿ÷ÿìÿ÷ÿìÿìÿñÿì?ÿìÿìÿú (ÿÿ Fc€°À¿ΧSA.ÿ÷ÿýÿÿÿìÿùÿí# ÿýÿøÿñÿìÿìÿñÿìÿìÿî:!#ÿì ÿìÿì ÿìÿìÿìÿìÿìÿü ÿøÿïÿìÿûÿì5]ˆ±˜˜z.ÿõÿìÿý&3ÿì!ÿìÿî $)ÿìÿïÿúÿì)ÿ÷ÿìÿìÿì7Dÿìÿì ÿìÿì5ÿî ;ÿìÿì#9ÿù351=kVE7Iÿðÿúÿìÿìÿýÿýÿñÿìÿñÿÿÿìÿì( ÿÿÿñÿòÿìÿñÿïÿìÿìÿì'ÿì 'ÿìÿìÿìÿìÿüÿìÿûÿöÿòÿìÿò!f,ÿì*iab)Hm@8MKÿìÿìÿìÿÿÿòÿì([5 ÿìÿîÿìÿìÿìÿî ÿüÿìÿìÿô ÿìÿ÷ÿõÿìÿìÿ÷ÿíÿìÿìÿìÿìÿðÿòÿì'78iraVCcXRU0"ÿùÿìÿôÿìÿì ÿìÿìÿÿÿì#-H/ÿ÷,ÿì=-ÿìÿòÿüÿïÿðÿìÿìÿìÿìÿì  ÿöÿñÿì %(\P/I.0t`HpMN3ÿîÿìÿÿÿïÿìÿì ÿìÿúÿ÷ ÿì 2ÿìÿíÿ÷(ÿòÿìÿìÿüÿìÿû ÿìÿìÿÿ=ÿôÿìÿìÿìÿìÿñ$X0J@Rg?!* &T $ÿìÿìÿý $ÿìÿì!29ÿïÿú.ÿñÿùÿó ÿúÿì1 ÿýÿôÿìÿìÿô#Fÿìÿìÿìÿø J‚{•b>:ÿî ÿìÿìÿðÿìÿìÿìÿý ^ÿìÿð ÿûÿìÿû ÿò" ÿìÿì+ÿì;< ÿõÿìÿìÿìÿýÿìÿìÿñ<KYZR]ÿìÿïÿûÿþ ÿìÿì ÿì$ÿ÷ÿöÿóÿì ÿôÿì'ÿøÿìÿìÿí ÿúÿìÿìÿîÿíÿìÿúÿìÿìÿìÿôÿìÿõÿðÿòÿþÿìÿì3.+HW/ÿìÿùÿô6ÿíÿìÿñ9ÿýÿì/ÿýÿìÿìÿûÿìÿì ÿõÿì ÿôÿìÿüÿìÿìÿòÿìÿøÿüÿø ÿìÿúÿöÿÿÿÿÿøÿð&33MH>ÿ÷ $ÿìÿô%(ÿì5ÿûÿïÿìÿîÿìÿïÿ÷ÿùÿìÿìÿôÿýÿüÿí=ÿìÿìÿìÿìÿì ÿïÿþ ÿîÿîÿìÿìÿìÿìÿõÿíÿö  ÿøÿîÿìÿíÿìÿ÷ÿìÿðÿõ8 ÿìÿ÷ÿì #ÿìÿùÿ÷ÿ÷ÿì#* ÿìÿìÿöÿìÿ÷ÿïÿìÿï ÿíÿì ÿì !ÿòÿîÿìÿþÿìÿì(ÿüÿòÿþÿìÿì*ÿúÿìÿö*ÿìÿì#ÿû.ÿìÿìÿìÿìÿìÿîÿúÿìÿìÿì 24ÿýÿìÿïÿþÿ÷ÿóÿìÿøÿúÿìÿìÿìÿì$ÿûÿìÿì ÿìÿì6(ÿü)ÿòÿòÿï&ÿìÿüÿìÿìÿúÿîÿìÿîÿìÿóÿÿÿ÷ÿõ<ÿìÿìÿìÿó ÿòÿîÿì$ÿìÿø5ÿðÿþÿì1. #ÿýÿø ÿìÿòÿì8ÿîÿòÿì.8,1)ÿü"8ÿûÿìÿìÿì ÿóÿìÿð(ÿìÿìÿû4ÿþÿõÿìÿûÿô/ÿìÿïÿôÿÿÿùÿì>ÿìÿÿ1ÿûÿûÿöÿþÿøÿõÿìÿìÿìÿìÿýÿúÿìÿì!ÿìÿìÿïÿþÿì3ÿõÿøÿìÿìÿñÿø ÿìÿìÿì5 ÿìÿÿÿìÿìÿìÿøÿúÿÿÿøÿìÿíÿìÿìÿÿÿüÿò ',ÿìÿìÿõÿì-ÿì1 ÿìÿîÿìÿìDÿõÿìÿû&ÿì #ÿõÿÿÿìÿí ÿìÿìÿÿ ÿðÿìÿìÿì"ÿüÿìÿïÿøÿñ# "ÿìÿû%ÿðÿìÿìÿùÿìÿìÿìÿôÿóÿì*,ÿûÿôÿòÿìÿì# M ÿñÿþÿìÿó5ÿýÿõ6ÿìÿý ÿìÿìÿìDÿó#ÿ÷ÿû1ÿðÿóÿö ÿúÿì$,ÿõÿñÿøÿìÿìÿìÿìÿìÿôÿîÿìÿûÿìÿñÿìÿÿ"ÿóÿñÿôÿü (ÿúÿìÿüÿ÷ÿþÿó/ÿÿ!ÿóÿìÿì ÿì ÿüÿì$ÿìÿôÿûÿþ:ÿùÿÿÿí&/ÿìÿìÿìÿíÿìÿìÿó$ÿüÿòÿìÿì ÿì#ÿìÿìÿþÿìÿþ5 ÿïÿøÿìÿìÿöÿöÿóÿì"%ÿóÿìÿìÿì ÿô ÿìÿõÿìÿï(ÿù0ÿìÿïÿóÿì ÿìÿì ÿìÿì ÿñÿì2ÿùÿìÿìÿìÿìÿö ÿöÿöÿû/-ÿìÿìÿìÿõÿìÿíÿðÿì""%ÿø. .ÿÿÿÿÿ÷ÿìÿìÿìEÿìÿìÿíÿìÿï"ÿùÿìÿì0.ÿú)ÿìÿìÿìÿÿ'ÿü ÿóÿì+ÿùÿì& ÿîÿìÿùÿðÿìÿìÿìÿòÿì ÿì9 ÿð%ÿì$)ÿôÿöÿòÿö$ÿìÿýÿÿÿìÿìOÿîÿîÿñÿ÷ÿì!ÿìÿìÿóÿù5ÿì.%ÿýÿì 0ÿôÿìÿìÿð"ÿìÿìÿìÿù ÿìÿìÿìÿìÿìÿìÿþ ÿøÿìÿðÿìÿþÿì.ÿòÿì2ÿ÷ ÿþÿïÿö $ÿÿÿüÿìÿìÿ÷!ÿýÿì*ÿìÿìÿóÿì!"ÿÿÿü%ÿÿÿìÿìÿõÿõÿôÿìÿñÿìÿòÿüÿÿÿîÿìÿìÿìÿ÷ÿìÿýÿìÿ÷ÿìÿìÿõÿìÿÿÿìÿñÿì ÿùÿñÿö/ÿìÿôÿú ÿìÿûÿïÿìÿóÿùÿõÿú!,0%ÿìÿìÿõÿúÿýÿðÿìÿøÿìÿíÿí ÿûÿîÿôÿìÿÿÿìÿìÿìÿì ÿì !1ÿì! ÿýÿìÿû7ÿúÿìÿìÿìÿøÿõÿïÿ÷ÿõÿìÿîÿìÿìÿÿÿÿ%ÿôÿðÿÿÿìÿî8ÿì ÿìÿì$ÿóÿìÿþÿì ÿì0ÿìÿìÿìÿðÿùÿì1ÿÿÿÿÿúÿìÿìÿì ÿòÿìÿìHÿòÿï ÿþ ÿú)ÿìÿòÿìÿø ÿìÿìÿ÷ÿì,ÿýÿìÿöÿúÿõ ÿõÿìÿì Hÿÿÿ÷ÿñ2ÿíÿõÿùÿþÿìÿð.(ÿùÿìÿìÿüÿìÿìÿïÿóÿì#&ÿòÿï,' ÿì'ÿùÿøÿú ÿ÷ÿó&'ÿìÿì$ÿöÿì%* ÿìÿþÿûÿôÿìÿì*ÿìÿìÿìÿì  ÿì ÿìÿ÷ÿø&ÿì ÿ÷!ÿìÿìÿóÿý,'"!ÿíÿðÿøÿ÷ÿî (.ÿû@ÿ÷ÿìÿüÿóÿìÿì8ÿìÿðÿðÿ÷ÿìÿôÿìÿõÿú#ÿìÿûÿüÿì 'ÿìÿì ÿïÿúÿìÿüÿýÿìÿý,ÿóÿôÿìÿôGÿì ÿìÿõÿýÿý ÿøÿì&ÿõÿìÿìQ ÿìÿì ÿìÿò ÿðÿþÿìÿþÿøÿìÿìÿìÿÿ2!ÿìÿì ÿïÿìÿìÿìÿì5ÿîÿìÿìÿü%ÿïÿûÿì ÿìÿðÿìÿìÿöÿìÿì 'ÿûÿìÿø(  ÿì ÿ÷ ÿì ÿìÿìÿù*%ÿõÿì @ÿì 5ÿõÿüÿìÿìÿõ ÿôÿìÿì ÿì*ÿì ÿýÿìÿì4ÿüÿìÿöÿíÿìÿòÿû:ÿìÿìÿñÿìÿ÷ ÿñ ÿì* 4)ÿóÿðÿïÿüÿìÿöDÿøÿöÿìÿì?B ÿìÿì$ÿìÿüÿó ÿóÿìÿì%ÿóÿìÿìÿì)ÿöÿø ÿìÿù$ÿøÿðÿìÿìÿìÿìÿýÿì ÿìÿìÿòÿìÿìÿýÿìÿî#"ÿìÿøÿòÿì ÿöÿüÿøÿìÿÿÿìÿìÿì ÿì/5"! ÿúÿìÿì ÿòÿìÿì+ÿïÿûÿûÿþÿìÿìÿìÿì6ÿíÿìÿ÷(#ÿì1;ÿ÷ÿ÷ ÿõ2ÿúÿúÿóÿòÿìÿìÿüÿø ÿìÿìÿóÿøÿíÿÿÿÿ!&ÿøÿú!ÿúÿú ÿìÿÿÿìÿóÿøÿìÿò+J Eÿò ÿìÿìDÿùÿìÿì@/ÿìÿ÷ #ÿûÿìÿì9!ÿüÿì ÿöÿüÿìÿó#2ÿÿR. ÿ÷34ÿòÿìÿýÿìÿì"ÿìÿìÿóÿýÿúÿìÿìÿì/ ÿì 3ÿìÿì ÿüÿüÿý ÿûÿì ÿúÿìÿüJÿìÿìÿüÿüÿûÿìÿúÿÿÿýÿì ÿîÿìÿóÿü 1ÿøÿìÿïÿìÿì ÿìÿðÿôÿìÿüÿìÿìÿìÿí!ÿìÿùÿì ÿìÿìÿíÿìÿì$ÿôÿúÿÿÿíÿìÿòÿìÿõÿìÿìÿûÿìÿìÿìÿóÿìÿì ÿõ1ÿöÿý"ÿþ *ÿó:ÿìÿì :ÿûÿð<ÿìÿü6ÿûÿûÿìÿìÿðÿìÿÿPÿùÿîÿìÿü8ÿîÿùÿþ*ÿõÿìÿì ÿüÿíÿì!*ÿöÿìÿì/ÿìÿìÿòÿìÿõÿñ ÿìÿìÿïÿ÷ÿìÿ÷ÿõÿìÿ÷ÿð ÿìÿþÿÿÿìÿì)P!4ÿìÿì* ÿûÿìÿ÷ÿõÿìÿìÿìÿìÿìÿøÿì6ÿìÿìÿìÿûÿùÿìÿýÿìÿøÿìÿïÿ÷ÿüÿû ÿìÿì ÿìÿì ÿúÿûÿì7ÿìÿìÿ÷ÿìÿõ;ÿüÿúÿþÿöÿìÿìÿìÿþÿúÿìÿìÿõÿìÿïÿìÿìÿìÿì&ÿìÿôÿìÿìÿìÿìÿìÿò7ÿìÿìÿýÿïÿúÿìÿì$ÿùÿõÿìÿìÿìÿïÿïÿöÿüÿõ ! ÿìÿìÿôÿí-ÿýÿìÿî ÿìÿìÿöÿïÿìÿìÿìÿìÿì ÿó<ÿìÿïÿìÿõ 0ÿìÿó%ÿìÿìÿìÿñÿõÿÿÿìÿìÿø  ÿì&*ÿìÿù(ÿìÿü+(ÿìÿù.ÿìÿýÿì  2ÿü.ÿíÿìÿìÿì ÿó7ÿöÿöÿìÿð ÿôÿìÿú%ÿìÿìÿìÿìÿìÿþÿìÿìÿ÷ÿìÿøÿìÿûÿìÿìÿìÿøÿìÿì ÿíÿüÿûÿìÿüÿìÿóÿý<.ÿìÿì0 ÿìÿìÿ÷ÿìÿìÿüÿìÿìÿìÿñÿì "ÿìÿìÿìÿìÿúÿíÿìÿì ÿõÿìÿìÿô("ÿöÿìÿì"ÿø *ÿìÿìÿöÿï,ÿìÿìÿìÿìÿìÿïÿìÿìÿøÿìÿìÿìÿöÿôÿìÿì&Lÿþÿñÿìÿìÿïÿìÿìÿìÿþÿì+ÿìÿì$ÿóÿüÿøÿìÿøÿõ ÿì ÿþ -2ÿüÿìÿì"$ÿóÿô# ÿìÿìÿòÿóÿÿÿìÿì$ ÿú !*ÿìÿôÿþ  ÿùÿì )ÿõÿìÿü(!&ÿìÿì+ÿô&ÿîÿü*ÿôÿìÿì ÿðÿöÿôÿî3W ÿìÿìÿìÿÿÿìÿì ÿúÿúÿûÿûÿöÿôÿïÿöÿïÿìÿì ÿòÿìÿìÿìÿøÿþ#ÿùÿþÿñCÿìÿì ÿóÿìÿì ÿìÿìÿïÿúÿô ÿÿÿìÿô)ÿùÿð ÿìÿï?0 3 ÿòÿìÿúÿ÷ÿ÷8ÿìÿôÿøÿúÿì ÿõOÿìÿìÿüÿìHÿþÿïÿìÿô*Aÿþÿýÿìÿñÿì ÿõÿúÿôÿìÿó0ÿìÿì ÿúÿñ+ÿíÿìÿûÿìÿìÿðÿöÿýÿü(*ÿìÿìN?>ÿìÿì" ÿþÿìÿðÿýÿÿ :ÿìÿìÿìÿòÿìÿìÿì (ÿìÿìA#ÿöÿÿÿìÿìÿýÿì&&ÿìÿìÿìÿìÿð ÿòNÚ¸ŒX/2ÿýÿìÿìÿìÿóÿûÿìÿò ÿöÿìÿìÿìÿìÿùÿ÷ÿìÿìÿò# ÿìÿùÿõÿõÿìÿýÿìÿì ÿìÿìÿìÿìÿþTÿô#s­±©¦³M1ÿöÿìÿìÿìÿýÿìÿìÿîÿòÿìÿìÿìÿûÿòÿúÿìÿìÿí ÿì)ÿñÿöÿìÿìÿìÿìÿì$ÿòÿòÿýFYrŒ¿×¼žJK&ÿï>&S* ÿðÿìÿÿ(ÿìÿìÿðÿóÿìÿì#0%ÿì ÿýÿìÿìÿñÿìÿìÿðÿì0/ÿì8ÿìÿùÿìD"ÿþÿìÿìÿìL}œry¿À|–RB>Q<Mÿù01.. ÿû(ÿù ÿìÿîÿðÿôÿøÿîÿûÿìÿöÿìÿìÿø"ÿìÿìÿìÿíÿöÿìÿìÿìÿÿ+ÿìÿìÿïÿüÿôH{¤™§˜~n˜zr\T5Dÿ÷ÿìÿòÿ÷ ÿì?3ÿùÿøÿþÿïÿíÿì " ÿÿÿìÿìÿì ÿìÿìÿüÿùÿì ÿìÿìÿ÷/ÿýÿùÿìÿìÿýÿìÿðÿï#yÅÚÀ~‰uy†~aE)  ÿôÿÿÿþÿìÿìÿ÷ÿñ ÿì.F#ÿìÿì!Nÿìÿìÿö"ÿ÷"ÿì ÿÿÿìÿìÿïÿìÿòÿìÿì3´å¦k[aDUm~za0B8;ÿýÿýÿþ ÿùÿìÿìÿ÷ÿìÿúÿí ÿìÿìÿìÿñÿì& ÿìÿìÿõÿô7ÿí ÿùÿò ÿìÿìÿì%‚Ñ®p[J9]QINK]c+=.G'ÿõ#ÿìÿìÿìÿìÿö)ÿìÿþ  ÿóÿì (ÿò ÿíÿì ÿÿ+ÿôÿì ÿíÿö"/ÿìÿõÿì5J’›x¡JVrލ‘Ša",%$'ÿì )ÿìÿìÿì ÿûÿìÿìÿìÿö ÿìÿîÿìÿìÿø ÿìÿìÿìÿìÿþ%ÿòÿí#ÿýÿì =OnnXUDFD‘çûÃU26ZV!Gÿüÿî ÿìÿùÿ÷ÿìÿü#, ÿìÿìÿìÿûÿìÿîÿìÿðÿìÿì ÿì-ÿíÿïÿì '2Lityw˜ž­¯°–_YF#ÿíÿìÿìÿý% ÿìÿì ÿõÿìÿì ÿöÿìÿõ5 ÿìÿìÿìÿòÿìÿìÿìÿìÿûÿìÿìÿñÿìÿõ 4B_ikVYy|]  ÿþ0"7ÿì$ÿìÿìÿìÿüÿôÿìÿüÿìÿì ÿì*ÿñ8ÿìÿì ÿþÿìÿï )ÿïÿìÿýÿìÿìÿì7d3?M1$-~Y?:Jÿûÿìÿì%ÿìÿüÿìÿïÿïÿìÿýÿïÿìÿüÿìÿøÿïÿìÿì&ÿì-#(ÿìÿìÿûÿìÿìÿöÿï ÿÿÿìÿì$B’P d|LM(C%3PK" ÿôÿìÿìÿ÷ÿ÷ÿì"Xÿõÿñÿ÷ÿìÿìÿî ÿñÿìÿì-ÿþÿø ÿìÿ÷ ÿÿÿìÿìÿþ ÿìÿìÿíÿìÿò[}_–…]y:2I@AN2)ÿüÿìÿðÿøÿîÿì ÿìÿ÷ÿì)+?" ÿÿÿð,@.ÿòÿì ÿñÿìÿíÿìÿìÿìÿì9ÿûÿô ÿì 33K”€;, /QC:J);'ÿìÿìÿìÿþÿðÿìÿïÿìÿìÿìÿì $ÿìÿøÿí.ÿÿÿìÿìÿõ ÿìÿì ÿìÿù,ÿü(ÿøÿìÿìÿìl9<cehR' 44ÿ÷ #ÿøÿìÿþ "#ÿìÿì .0ÿìÿìÿóÿþÿñ#ÿìÿíB ÿïÿôÿì ÿìÿìÿóÿì#ÿúÿìÿìÿì2%(6.m›„”j>/ÿì ÿìÿìÿ÷ÿìÿòÿï-`ÿìÿò ;ÿú&ÿÿÿýÿõÿýÿìÿìÿþ;0ÿìÿìÿìÿýÿìÿìÿòÿìÿìÿì!0%*\_g¡qQ`ÿìÿ÷ ÿìÿìÿì  ÿ÷ ÿìÿìÿì#ÿû?ÿûÿìÿø"ÿì ÿöÿìÿúÿüÿìÿîÿ÷ÿìÿìÿ÷ÿíÿìÿìÿìÿ÷ÿüÿôÿóÿìÿì,=IriGZV/6ÿìÿðÿ÷%ÿý-ÿüÿìÿìÿöÿüÿì!ÿìÿìÿìÿì(ÿìÿì ÿîÿñÿì ÿìÿöÿìÿìÿýÿüÿñÿ÷ÿìÿü ÿíÿþÿìÿìÿïÿ÷ÿï$UYEhSFÿû 0ÿïÿö6ÿí ÿó ÿìÿìÿìÿìÿìÿìÿùÿû-ÿìÿú-ÿîÿìÿíÿìÿÿ&ÿìÿñÿìÿì ÿ÷ÿ÷ ÿìÿìÿìÿìÿìÿô 2@)ÿìÿìÿòÿí ÿìÿìÿõÿû#ÿòÿìÿîÿìÿýÿìÿõÿÿÿòÿ÷ÿóÿÿÿù5ÿüÿìÿìÿóÿïÿøÿüÿ÷ÿýÿìÿ÷ÿùÿõ!6ÿí ÿì5ÿìÿðÿôÿìÿìOÿû ÿìÿøÿìÿì= ÿìÿì"ÿýÿìÿ÷ÿôÿó ÿìÿìÿ÷ÿíÿìÿìÿìÿü ÿìÿìÿï3#ÿìÿìÿûJÿïÿü% ÿìÿð ÿìÿìÿòÿì+ÿìÿìÿì&ÿýÿìE1 ÿþÿú ÿÿÿì $ÿúÿìÿì,ÿîÿìÿþÿìÿìÿø&ÿðÿô**ÿûÿìÿìÿù,>ÿóÿûÿì 6ÿì&ÿõ<ÿôÿõ%ÿùÿü ÿï/ÿø#4ÿüÿíÿì0=$ÿÿ2" ÿüÿìÿìÿô  ÿúÿ÷ÿþÿ÷5 ÿúÿð%ÿñ ÿíÿôÿì$ÿì ÿìÿð ÿûÿþÿïÿï ÿó8ÿôÿóÿîÿû ÿìÿìÿû&ÿïÿìÿì ÿûÿöÿüÿìÿîÿøÿð  ÿìÿûÿìÿìÿñÿòÿõÿóÿìÿìÿì,ÿìÿìÿìÿìÿì$ ÿìÿìÿìÿìÿìÿûÿí, !ÿú ÿì$*ÿ÷ÿúÿìÿíAÿìÿòÿ÷ÿìÿíÿïÿìÿìÿì7ÿöÿþÿì ÿïÿþÿìÿîÿìÿü ÿôÿìÿìÿþÿìÿìÿìÿï"ÿúÿìÿìÿüÿìÿìÿìÿìÿìÿìÿþÿìÿìÿì -ÿíÿìÿï ÿîÿôÿõÿìÿÿÿì:@ÿôÿöÿï% ÿìÿì ÿý(ÿìÿìÿìÿì<ÿìÿí!ÿûÿÿÿõ#ÿñÿýÿø ÿúÿì)()ÿòÿìÿìÿìÿìÿìÿôÿÿÿìÿìÿø$ÿìÿì4!ÿî,ÿì ÿóÿîÿôÿþÿïÿìÿù(ÿìÿþÿò ÿíÿì"ÿìÿìÿìÿýÿì/ÿòÿöÿìÿîÿý-;ÿý ÿùÿì%ÿ÷ÿðÿìÿøÿ÷ ÿüÿñÿìÿì! ÿÿÿìÿìÿùÿðÿñÿñÿìÿìÿøÿìÿìÿíÿøÿöÿì&-ÿìÿÿÿõÿìÿì ÿìÿõÿòÿü ÿì ÿþÿò@ÿöÿôÿðÿìÿìÿìÿîÿìÿìÿìÿìÿíÿìÿòÿôÿìÿì ÿþÿÿÿú5 ÿìÿìÿìÿýÿìÿïÿìÿìÿí ÿì$ÿìÿ÷ÿìÿì^ÿùÿìÿìÿóÿôÿì% 6ÿøÿöÿìÿìÿòÿìÿìÿý/ÿðÿìÿì!ÿýÿñ+ ÿìÿìÿñÿúÿúÿðÿìÿôÿìÿöÿìÿîÿìCÿìÿúÿìÿøÿìP-ÿìÿø50ÿûÿÿÿüÿìÿìIÿõÿìÿûÿì ÿÿÿìÿìÿñÿì:ÿì .ÿîÿìÿìÿú/ÿìÿìÿì ÿìÿìÿíÿöÿóÿìÿìÿìÿìÿÿÿîÿìÿúÿìÿìÿúÿìÿö$ÿòÿì&ÿõÿùI #ÿìÿìÿô ÿì0ÿìÿìÿöÿüÿî8"ÿìÿòÿìÿìÿùÿìÿìÿôÿìÿùÿìÿìÿìÿïÿìÿýÿìÿÿÿìÿùÿì ÿö ÿûÿõÿìÿìÿø7ÿìÿò)ÿìÿìÿ÷ÿìÿý ÿìÿìÿöÿìÿÿ* ÿùÿûÿÿ ÿìÿóÿìÿóÿìÿöÿìÿìÿðÿìÿìÿìÿìÿñÿòÿìÿòÿùÿûÿó=ÿúÿìÿìÿìÿðÿôÿñ(ÿìÿöÿìÿìÿòÿî!ÿòÿì ÿìÿìEÿï ÿìÿì.ÿì!ÿìÿì4ÿìÿìÿøÿõÿõJ-ÿóÿý ÿýÿøÿìÿïÿô ÿìÿî'+ÿúÿì  ÿó  ÿìÿòÿïÿìÿìÿìÿìÿì$ÿìÿôÿì ÿìÿõÿî ÿøÿú"ÿìÿìÿìÿþ"!&ÿúÿìÿìÿìÿó,ÿòÿìÿïÿôÿìÿì ÿûÿóÿì(ÿðÿô6(ÿì ÿìÿý ÿøÿìÿìÿì7? ÿþÿìÿì+ÿùÿñÿì!ÿö ÿì1ÿíÿ÷ÿíÿû*ÿìÿõÿûÿñÿò05ÿïÿõ*ÿìÿìÿì ÿìÿîÿìÿü ÿìÿÿÿìÿñÿþÿú(ÿþ* ÿì ÿþ ÿóÿúÿî -ÿó1ÿúÿìÿü/ÿì"ÿìÿìÿðÿîÿìÿ÷ÿÿ'ÿìÿïÿñÿ÷ÿìÿìÿøÿìÿñÿþÿìÿõ!Eÿìÿýÿóÿìÿì=ÿòÿìÿþÿõÿöÿòÿìÿò> ÿìÿì.ÿì 'ÿìÿìÿìÿìÿñÿìÿìÿìÿìÿì:Tÿìÿì!ÿïÿìÿìÿìÿ÷5ÿìÿìÿìÿýÿûÿìÿóÿìÿìÿìÿì!ÿì ÿûÿö+ &ÿì'ÿìÿÿÿõ3 ÿìÿì/'ÿìÿì.@ÿìÿì7ÿìÿ÷ÿìÿí#ÿîÿðÿìÿì(ÿøÿìÿì$ÿìÿü9ÿìÿìÿìÿûÿñ0ÿþÿìÿìÿîÿìÿôÿüÿÿÿì>MÿðÿìÿìÿõÿúÿùÿþHÿì'ÿì2  ÿìÿì ,ÿöÿ÷ ÿóÿìÿõÿíÿó ÿìÿì0ÿùÿõÿðÿ÷(ÿô ÿìÿìÿìÿìÿìÿìÿìÿìÿú%ÿñÿðÿìÿì%4ÿìÿïÿþ(ÿì ÿñÿÿÿö+ÿìÿìÿíÿþ&*')ÿñÿôÿìÿîÿíÿùÿðÿìÿìÿõÿìÿìÿìÿìÿõÿîKÿíÿìÿì-ÿì 56ÿÿÿÿ&ÿìÿùÿì ÿùÿìÿìÿìÿùÿÿÿíÿöÿþ 'ÿ÷ÿìÿòÿò" ÿÿÿìÿùÿôÿìÿø2SÿýÿûLÿìÿÿÿìÿïWÿìÿì A ÿìÿìÿø5ÿû 5ÿìÿï ÿþÿúÿì ÿìÿñÿúÿìÿìÿì1ÿþP7  -ÿìÿì ÿôÿì0ÿìÿìÿøÿüÿì+ÿìÿì' ÿìÿýÿìÿúÿù ÿ÷ÿìÿìÿìTÿìÿìÿòÿìÿìÿìÿúÿìÿìÿ÷  &5ÿìÿìÿûÿùÿìÿìÿöÿìÿùÿùÿìÿÿÿíÿì(ÿø)ÿìÿóÿìÿüÿþÿìÿüÿúÿûÿìÿìÿÿÿóÿìÿìÿìÿúÿìÿüÿìÿìÿìÿìÿúÿïÿìÿì :ÿî .ÿò>ÿìÿìÿìÿý%ÿýÿñ/ÿî0ÿìÿòÿìÿìÿïÿô NÿöÿøÿìÿòNÿûÿøÿìÿúÿýÿöÿüÿí"ÿìÿìÿìÿìÿìÿø#ÿýÿøÿÿÿìÿìÿò ÿûÿõÿø ÿì ÿï ÿìÿ÷ÿõÿìÿì(3W1ÿìÿì3ÿýÿìÿìÿìÿøÿìÿìÿìÿìÿìÿìÿÿWÿùÿñÿòÿìÿìÿìÿìÿìÿý ÿõÿì ÿ÷ ÿì!"ÿõÿôÿþ  ÿìBÿìÿûÿì::ÿôÿì( <ÿüÿìÿìÿìÿþÿìÿü ÿü ÿìÿìÿþÿìÿýÿìÿøÿûÿìÿþÿöÿì#ÿí$ÿìÿìÿ÷ Eÿìÿìÿî ÿ÷ÿñÿþÿöÿñÿìÿì4ÿìÿìÿìÿìÿóÿòÿûÿùÿïÿìÿóÿò ÿìÿì'ÿìAÿ÷ÿùÿùÿòÿìÿñÿòÿþÿøÿìÿþÿøÿìÿìÿì #Dÿìÿìÿìÿ÷ÿõÿö ÿîÿíÿìÿìÿöÿóÿìÿïÿýÿùÿùÿüÿùÿì.-ÿì#ÿìÿì24ÿìÿ÷7C2ÿì/ÿþ&ÿí ÿìÿú5ÿñÿìÿìÿì"ÿìÿì ÿìÿïÿïÿìÿì ÿü 3 ÿìÿìÿìÿì1ÿìÿì ÿìÿìÿìÿìÿìÿöÿ÷ $ÿìÿóÿÿÿìÿìÿòÿìÿñÿóÿì)$ÿìÿó+ÿþÿìÿìÿìÿù+ÿìÿìÿìÿùÿöÿìÿöÿö ÿý Lÿùÿìÿõÿüÿìÿìÿìÿû ÿõ ÿùÿÿÿõÿìÿóÿíÿìÿô1ÿ÷!)ÿðÿìÿìÿø)ÿìÿìÿìÿì'ÿíÿþÿìÿì: ÿìÿóÿìÿìÿ÷4ÿìÿîÿìÿìÿì /ÿýÿìÿìÿÿÿõ +ÿìÿì$,ÿìÿïÿìÿìÿìÿìÿ÷ÿÿÿûÿûÿÿÿúÿìÿìÿõ2ÿìÿìÿìÿï ÿìÿîÿì ÿìÿìÿìÿìÿìÿì&*ÿìÿô7ÿìÿýÿýÿþÿþÿìÿìÿýÿìÿì ÿòÿìÿìÿõÿìÿì ÿìÿì ÿú ÿìÿìÿì*/ÿìÿìÿìÿöÿõÿìÿì ÿõÿìÿðÿüÿìÿìÿ÷ÿìÿìÿúÿìÿìÿì )&ÿîÿìÿìÿÿÿ÷ÿ÷:ÿìÿì ÿþÿüÿìÿ÷!ÿìÿìÿ÷ +!ÿìÿìÿú*ÿÿÿìÿìÿì)>! ÿìÿ÷5ÿòÿýÿÿÿð I/<ÿîÿìÿþÿìÿìÿþ*U ÿüÿìÿø0ÿü, ÿìÿ÷ÿòÿÿ$ÿøÿù ÿìÿùÿìÿìÿøÿøÿõÿôÿìÿùÿì0ÿìÿìÿìÿýÿìÿìÿý"ÿûÿó&$ÿ÷rZK-ÿìÿïÿðÿìÿú$*ÿîÿìÿíÿ÷ÿìÿìÿìÿû'ÿìÿìÿú@ÿìÿìÿþÿìÿ÷ÿì ÿìÿôÿõÿìÿìÿìÿóoÏ¥ŽtfQ<20ÿúÿõÿþÿõÿìÿìÿìÿìÿúÿöÿöÿìÿú8)ÿü4ÿìÿìÿìÿîÿìÿìÿõÿì ÿùÿìÿþÿýÿþ5ÿìÿìN˜‚“ÀÑwBl'ÿìÿîÿýÿíÿìÿûÿìÿìÿöÿîÿìÿìÿì,ÿí ÿîÿìÿìÿÿÿîÿüÿõ!' ÿìÿì 0ÿðÿú"ÿìÿìÿòd]l]G€±yYvK"d=K*ÿìÿò8 ÿù ÿìÿì ,ÿìÿìÿìÿìÿìÿìÿòÿì#ÿñ9ÿíÿõP #ÿõ r“4"ayE]KfjXX‡ ;T52ÿûÿìÿìÿý ÿìÿòÿìÿÿ ÿýÿìÿìÿìÿüÿìÿüÿ÷ÿüÿþÿìÿìÿìÿô'ÿìÿüÿìÿø-\š‹QIA??XamqjrŠ0 ,/ÿì"ÿûÿìÿìÿöÿìÿù ÿìÿìÿìÿìÿìÿìÿúÿìÿìÿù.ÿîÿìÿìÿìÿö M”·¡x>);)Dp•n[N-"6B9!ÿìÿôÿüÿùÿû(< ÿúÿìÿñ/O6ÿöÿìÿì ÿìÿîÿì% ÿòÿíÿìÿýÿýÿù? ¥g85#P{eYnyCA6/"ÿúÿùÿìÿìÿì ÿí ÿìÿìÿì ÿñÿì#ÿþÿìÿí 4ÿì :ÿìÿ÷A“U7ÿþ&(M`~c3)!7PAÿð ÿü ÿíÿìÿì=ÿìÿìÿìÿìÿþÿþÿìÿò/ÿÿÿñÿñÿõ ÿìÿìÿì,%ÿìÿÿÿþZkyZ<85 KY˜‚N<1;S ÿìÿö0ÿìÿìÿÿÿ÷ÿìÿìÿìÿìÿìÿìÿìÿúÿì$ÿûÿöÿìÿøÿòÿùÿÿ ÿìW‰†^( B…•{J,&*O](Pÿù ÿìÿöÿúÿøÿì! !ÿïÿìÿìÿýÿíÿìÿìÿìÿìÿøÿîÿìÿù!ÿñÿþ ÿì+,?raL7,'H4-ED5'4 ÿìÿìÿì,ÿüÿòÿì ÿ÷ÿìÿìÿù+ ÿì Nÿüÿì0ÿìÿì ÿîÿìÿì ÿýÿìÿìÿìÿó)ÿöÿù-'4,)F3 ÿìÿ÷ÿù>ÿþÿì ÿíÿìÿð! ÿìÿü ÿìÿìÿîÿìÿì5ÿôÿìÿõÿý+ÿìÿ÷ÿìÿìÿìÿ÷ÿõ(Z^##5 ÿ÷ÿìÿþF3#44ÿôÿì'Dÿì4ÿìÿìÿýÿùÿ÷ÿìÿìÿýÿøÿì"ÿì!ÿìÿì ÿïÿìÿú1ÿô ÿîÿìÿìA†´bIQ*-ÿùÿõ/?ÿïÿûÿöÿíÿïÿì.ÿüÿìÿ÷ÿùÿóÿÿÿüÿí ÿûÿìÿìL ÿì ÿöÿìÿöÿìÿìÿýÿòÿìÿì2€•XXI=V ÿü ÿñÿìÿ÷ÿõÿþ ÿûÿòÿì6=&ÿìÿú ÿÿ (ÿý-ÿìÿìÿýÿíÿìÿíÿìÿíÿù4ÿìÿìÿý #0ÿìÿì),"6H.^X ÿÿÿì ÿî.ÿìÿìÿìÿüÿþÿìÿúÿì+ÿìÿìÿô"ÿñÿíÿì"ÿìÿìÿìÿþÿìÿì&ÿìÿô, (ÿìÿìÿó(FxP9Y:, ÿïÿôÿìÿúÿìÿúÿýÿò&%ÿìÿüÿì/ÿï/ÿíÿìÿÿÿüÿî$ÿìÿì)ÿÿÿþÿìÿìÿùÿìÿìÿïÿìÿîÿìH'&.<WFDT8fJÿþÿìÿìÿøÿìÿìÿïÿÿ ÿý*DBÿ÷ÿüÿð1ÿìÿñÿóÿòÿìÿìÿìÿþÿìÿìÿìÿìÿüÿðÿìÿìBGK >@`=$m=ÿýÿìÿìB9ÿìÿìÿìÿô$ÿÿÿìÿì/6$ÿñ ÿôÿìÿïÿìÿìÿìÿøÿïÿïÿ÷ÿìÿìÿìÿûÿìÿìÿìÿüÿó8C<^‡¢_!G<ÿì'8'ÿìÿìÿì1ÿìÿìÿìÿì ÿñÿìÿìÿìÿì>ÿìÿÿÿøÿìÿìÿÿÿíÿöÿìÿìÿìÿìÿìÿúÿìÿíÿìÿì ÿìÿÿÿóÿìÿø!*LjqeK)ÿý=ÿúÿÿ0ÿúÿò*ÿðÿóÿìÿòÿìÿìÿì<ÿìÿì/ÿñÿìÿòÿìÿùÿóÿøÿìÿìÿîÿþ ÿñÿðÿìÿð618"2! ÿíÿì ÿôÿíÿûÿì ÿñÿìÿù ÿìÿìÿìÿì ÿìÿóÿÿ #"ÿò*1ÿûÿòÿù 7.ÿüÿýÿìÿðÿìÿìÿþÿõÿÿ ÿì ÿì9* )ÿì'ÿìÿìÿ÷ÿøÿì5ÿú77ÿóÿñÿìÿì1ÿðÿð+ÿúÿìÿìÿûÿìÿìÿìÿüÿòÿìÿìÿøÿìÿú  ÿìÿìÿìÿìÿìÿì $!Eÿì?- ÿð%ÿõÿìÿì ÿì.ÿìÿìÿìÿì6ÿü!+"ÿ÷ÿôÿ÷ ÿìÿìÿìÿî *$ÿñÿìÿìÿìÿìÿì+5ÿòÿìÿíÿìÿìÿð&7 ÿøÿÿ#"ÿüB3ÿìL'ÿúÿíÿõÿì ÿòQ %ÿì#>!$.ÿÿ+1"ÿìÿìÿìÿìÿÿÿþÿìÿöÿøÿý ÿü ÿû<))+ ÿìÿìÿìÿìÿùÿì(ÿìÿì ÿíÿìÿý,ÿìÿìÿìMÿùÿñÿîÿü ÿøÿìÿðÿì%ÿìÿðÿì>ÿìÿìÿùÿ÷ÿôÿòE8)ÿìÿìÿöÿìÿìÿó'ÿìÿìÿìÿìÿì%ÿþÿðÿìÿûÿìÿì#ÿìÿì*ÿôÿìÿì ÿìÿõ.ÿû33ÿÿÿõÿìÿìbÿþÿòÿìÿìÿûÿìÿìÿìÿüÿ÷ ÿó#ÿóÿõÿì+ÿìÿùÿìÿøÿì ÿôÿìÿìÿìÿ÷ÿ÷ÿìÿìÿìÿí+ÿìÿìÿòÿþÿìÿì#ÿìÿì ÿýÿíÿìÿìÿìÿì'ÿðÿìÿìÿìÿúÿöÿìÿìÿì+,ÿÿ" ÿý ÿøÿìÿò4"ÿò!ÿìÿúÿìÿìÿìÿí"ÿîÿøÿïÿìÿÿ ÿýÿòÿöÿøÿÿÿõ ÿì 70ÿìÿ÷ÿþ ÿìÿïÿìÿìÿì%ÿìÿìÿÿÿýÿìÿìÿñ,# ÿì+ÿìÿíÿìÿìÿìÿìÿû;ÿì &ÿìÿüÿóÿü "Rÿìÿóÿìÿó!ÿ÷ÿì#ÿñÿìÿìÿìÿì75  (5ÿìÿýÿüÿòÿõÿì =ÿìÿýÿ÷ÿþÿýÿì ÿòÿüÿü-ÿúÿðÿìÿíÿìÿìÿø ÿì(ÿú3Pÿùÿøÿ÷ÿ÷%" &ÿøÿúÿìÿìÿøÿìÿìIÿö ÿôÿ÷ÿìÿñÿìÿìÿóÿìÿíÿñÿìÿõ!ÿìÿñ ÿú ÿì$ÿýÿìÿìÿìÿìÿìÿìÿì)ÿüÿìÿõ3ÿó ÿíÿøÿìÿìmÿìÿüÿìÿðÿí%ÿõÿùÿìÿîÿü ÿÿÿìÿõÿÿ0ÿüÿìÿìÿìÿðÿø!ÿÿÿòÿìÿìÿö ÿòÿôÿûÿûÿìÿìÿîÿìÿÿÿìÿìÿì,!ÿìÿöÿìÿìH/ÿóÿùÿì$ ÿõ ÿøÿìÿì:(ÿöÿìÿìÿì3ÿìÿìÿíÿ÷ÿ÷ÿì+$ ÿú ÿìÿìÿì ÿìÿõÿíÿìÿöÿùÿìÿìÿìÿîÿøÿìÿûÿôÿòÿõÿóÿìÿìÿì2&6Dÿùÿóÿôÿìÿíÿì*ÿý 42ÿìÿìÿöÿìÿýÿóÿìÿ÷ÿñ& ÿìÿìÿì ÿìÿìÿýÿìÿìÿìÿøÿìÿýÿþÿïÿùÿìÿöÿôÿö $Bÿûÿìÿìÿìÿò  "ÿìÿôÿøÿì&ÿöÿì ÿìÿûÿù!)ÿìÿúÿìÿüÿìÿðÿñÿìÿìÿðÿìÿôÿíÿìÿò/ÿìÿõÿìÿñÿð ÿìÿõ+ÿìÿìÿíÿìÿì ÿìÿìÿì ÿõÿôÿìÿðÿìÿì-ÿìNÿì$/ÿìÿóÿì61ÿìÿìÿýÿôE+ÿìÿýÿÿÿõÿý ÿìÿþÿì ÿìÿöÿì ÿî  ÿìÿìÿìÿìÿìÿíÿðÿì1ÿÿÿì ÿùÿìÿû ÿýÿìÿñÿï(ÿúÿüÿíÿìÿúÿý ,5 *ÿìÿìÿì(ÿìÿûÿìÿìÿïÿìÿìÿ÷ÿìÿìÿìÿì*ÿþÿìÿúÿ÷ÿü)ÿìÿóÿì ÿìÿìX;ÿúÿóÿíÿñ 4ÿýÿìÿìÿý ÿìÿîÿö'ÿùÿìÿô *=-ÿìÿÿ I)ÿìÿìÿì$ÿ÷!ÿôÿìÿìÿýÿòÿøÿìÿûÿô''Iÿøÿì ÿòÿìÿþÿöÿú ÿìÿðÿóÿúÿðÿìÿý+ÿì%ÿïÿì,ÿìÿûÿìÿ÷ÿúÿ÷ ÿìÿüÿìÿì"3 ÿÿÿì !%ÿìÿì ÿõÿü2Lÿìÿõÿìÿì,ÿþÿìÿö+ÿìÿìÿõ ÿþÿìÿì3ÿìÿüÿìÿðÿìÿòÿìÿñÿìÿì7Yÿÿÿìÿì9ÿíÿìÿìÿýÿóÿíÿìÿìÿìÿìÿðÿìÿìÿöÿûÿì- ÿô,&ÿìÿÿÿúÿì #ÿìÿìÿô5*ÿìÿðÿþÿìÿí@ ÿìÿìÿì)ÿìÿÿÿìÿìÿî(ÿò* ÿìÿ÷ÿì95ÿùÿóÿì ÿìÿü ÿìÿùÿìÿûÿôÿõÿò=ÿìÿì Lÿÿÿìÿìÿøÿø'ÿü) ÿï#ÿìÿìÿôÿìÿì " :ÿø#ÿûÿìÿøÿ÷ÿìÿìÿýÿù ÿìÿûÿì&ÿ÷ ÿìÿðÿïÿúÿìÿïÿñÿìÿìÿõ ÿü/!)ÿìÿñÿìÿìdÿìÿõ ÿóÿýÿì ÿñÿì.ÿìÿìÿÿÿø.%ÿþÿùÿòÿìÿìÿì ÿìÿõÿôÿñÿìÿð0ÿìÿýÿòÿïÿìÿúCÿîÿì&Hÿì#ÿì$ÿþÿð0ÿû!ÿõ ÿìÿûÿíÿÿÿìÿøÿìÿì ,  ÿìÿöÿìÿìÿö5ÿïÿìÿÿ8ÿöÿì7/ ÿìÿýÿìÿìNÿüÿîÿû6ÿìÿìÿìÿî1ÿú6ÿìÿòÿúÿìÿøÿúÿñÿìÿìÿì ÿî]M; ÿìÿìÿìÿóÿìHÿìÿì )'ÿì((ÿìÿì*ÿìÿì ÿìÿÿÿõÿìÿòÿìÿì7ÿì ÿìÿìÿìÿúÿÿÿûÿìÿìÿúÿì ÿþÿïÿôÿìÿí ÿìÿì%ÿüÿìÿìÿìÿìÿûÿîÿìÿö ÿìÿìÿìÿìÿúÿ÷ÿì ÿôÿìÿîÿìÿûÿó ÿìÿÿÿìÿùÿýÿìÿòÿøÿíÿìÿì ÿý 9ÿï-ÿò"(ÿôÿìÿöÿíÿÿÿûÿþÿìÿìÿð"ÿìÿì ÿö.2ÿìÿðÿÿÿìÿùÿüÿìÿìÿìÿøÿøÿìÿìÿñÿû!   ÿñÿøÿìÿìÿìÿðÿìÿìÿþ* ÿóÿìÿìÿýÿþÿû ÿýÿì ÿûÿõ,ÿÿÿýÿì-+7ÿö+ÿìÿì!ÿøÿò ÿìÿìÿìÿìÿìÿìÿìÿï#eÿìÿìÿìÿìÿìÿÿ-ÿóÿì ÿùÿÿÿÿÿì*< ÿôÿì,Oÿìÿúÿì 82ÿøÿì9ÿìÿìÿìÿñÿò  ÿìÿûÿìÿïÿú"ÿÿÿìÿóÿìÿì!ÿî8ÿôÿìÿìÿ÷'ÿúÿìÿì#ÿñÿôÿùÿìÿìÿì$ÿíÿìÿìÿìÿ÷ÿý ÿòÿíÿìÿìÿõÿö"ÿìÿì&ÿÿ>ÿýÿñÿôÿì ÿ÷ÿí ÿüÿðÿì&ÿñÿôÿì ÿì  4#ÿìÿìÿìÿíÿðÿùÿÿÿüÿìÿûÿõÿûÿùÿüÿû  ÿòÿìÿìÿõ&ÿì ÿìÿì,,ÿìÿð45=ÿì .# ÿûÿì$ ÿúÿúÿìÿìÿí% ÿíÿôÿì! ÿìÿìÿìÿñÿìÿô"$ ÿôÿìÿìÿóÿìÿì"ÿìÿìÿìÿìÿÿÿì ÿðÿþÿöÿìÿìÿìÿöÿìÿìÿìÿø ÿòÿìÿì ÿþÿìÿø .ÿòÿùÿòÿñÿì%ÿüÿìÿðÿöÿüHÿìÿìÿíÿÿÿóÿïÿìÿíÿôÿìÿúÿîÿì ÿì!ÿìÿì 1ÿìÿìÿìÿÿÿì ÿìÿòÿþÿìÿì"ÿü ÿþÿüÿðE(ÿû ÿôÿòÿø#ÿõÿìÿóÿð ÿîÿú"ÿóÿìÿõÿøÿì!ÿôÿìÿì!5ÿìÿìÿýÿìÿíÿìÿìÿìÿö ÿìÿìÿýÿÿÿìÿìÿìÿìÿìÿöÿõ%ÿñÿìÿìÿðÿüÿòÿìÿìÿþÿìÿüÿî(ÿì ÿïÿíÿì0ÿìÿÿÿô!ÿüÿð ÿñÿìÿìÿôÿöÿìÿ÷ÿùÿÿÿìÿø ÿìÿì ÿìÿìÿüÿÿÿìÿìÿìÿúÿìÿìÿìÿìÿìÿìÿì&ÿìÿìÿÿÿø ÿìÿù ÿîÿìÿõÿýÿþ'ÿøÿîÿì&ÿì " ÿìÿìÿñÿÿÿõ.ÿúÿýÿìÿì!ÿìÿì!ÿìÿìÿìÿüÿòÿìÿ÷ÿìÿìÿþ#ÿûÿü#ÿìÿ÷$ÿþÿø 8,+dK,ÿîÿì ÿýÿñÿý Rÿìÿý 83!ÿúÿì ( ÿö ÿøÿôÿïÿìÿìÿö ÿüÿìÿìÿìÿìÿìÿìÿýÿìÿìÿóˆs=^;(.# ÿì%*ÿìÿì ÿíÿìÿì ÿìÿì8ÿìÿìÿìÿû7Fÿøÿìÿûÿýÿìÿúÿþÿìÿöÿúÿó ÿìÿð<Š“n‚d9GqdH<< ÿì &ÿìÿìÿìÿìÿìÿìÿ÷ÿì%Iÿ÷6.ÿìÿûÿìÿìÿìÿþÿôÿýÿìÿ÷ÿìÿ÷ÿûÿôÿôÿì ÿì „¬SCV_¨±rfœ[F*ÿüÿìÿþÿìÿìÿìÿìÿðÿü 3ÿì ÿìÿìÿøÿò'ÿõÿù ÿôÿò%#AÿìÿûDÿìÿ÷ÿìÿó JŠzXH*SyPD:|jE<‘qWA#ÿõ!0+ÿþÿúÿìÿù-ÿò*ÿìÿìÿìÿìÿóÿíÿöÿþÿöÿñÿð=ÿùÿø? $0G£Ž]- 5I9P$g{H[¯])cR5<ÿÿ*ÿöÿïÿìÿì ÿûÿþÿíÿìÿóÿöÿôÿõÿñÿìÿìÿìÿìÿüÿìÿú<ip6"-8;GHU`cqZ 8+"ÿì ÿüÿìÿì ÿìÿðÿôÿòÿôÿòÿì$ÿìÿò- ÿîÿìÿìÿìÿìÿìÿì ÿì.t‹aR/+ &BxdNJK7VZ9&+ ÿÿ)ÿùÿû ÿìÿï43$ÿìÿô ÿøÿûÿ÷ÿìÿòÿì ÿõ)ÿì)+V_ ÿú4(ÿýK8<ft$&J6-9 (ÿìÿú ÿúÿú#ÿì#ÿìÿìÿðÿì(ÿóÿìÿøÿîÿù)"ÿÿÿô= ÿý3"QrU ÿìÿìÿì0A?!ÿìÿìÿûSNÿìÿýÿüÿìÿì5ÿìÿìÿûÿìÿôÿìÿù ÿïÿìÿîÿïÿýÿìÿñÿúÿöÿì)ÿì!#F@Cÿï (299ÿû CW ÿìÿìÿìÿï#ÿø ÿìÿì3ÿìÿìÿìÿìÿì  ÿõÿòÿìÿô3ÿìÿþÿöÿì'S_E! ,ÿì#/ +J)#Rÿ÷ÿûÿïÿðÿì*& ÿøÿõÿìÿìÿì-ÿìÿìÿòÿüÿùÿýÿì( "&F:O^(ÿú  ÿì#ÿìÿìÿìÿìÿìÿìÿìÿì ÿþÿìÿòÿÿÿþÿì ÿ÷ÿì/ÿìPÿþÿôÿò=ÿìÿìÿìÿíÿìÿûÿÿ ÿðÿì0E&7B4)ÿì 9ÿïÿìÿì ÿû4ÿù ÿìÿìÿú ÿìÿòÿìÿïÿì#ÿÿÿìÿíÿìÿðÿì)ÿ÷ÿÿ*ÿ÷ÿûÿõÿìÿìÿ÷ÿýÿì[rr]ÿîÿøÿìÿìÿî  ÿðÿì!%@ÿì2ÿýÿìÿøÿþ'ÿìÿìÿðÿö" ÿìÿìÿì)0ÿóÿ÷)ÿìÿõ ÿì#a‡™Oÿùÿø#!ÿìÿìÿø$Nÿòÿÿÿì#ÿìÿÿÿìÿúÿúÿìÿðÿðÿÿÿöÿì ÿì ÿõBÿûÿìÿøÿìÿ÷ ÿìÿì(ÿýÿìÿìÿì,D;WhN#8ÿÿÿõÿìÿìÿÿ /ÿìÿù ÿùÿìÿî@ÿú%<ÿôÿíÿó(ÿùÿìÿùÿì ÿîÿì ÿþÿñÿóÿù$ÿúÿìÿø!ÿìÿì$@QI3'ÿþÿìÿìÿì"ÿì6ÿìÿìÿìÿ÷>ÿõ1ÿìÿìÿúÿìÿíÿì ÿìÿìÿìÿøÿìÿì ÿìÿû ÿÿÿìÿì(LlX5"$ÿúÿñÿìÿõ ÿìÿüÿìÿîÿìÿì&ÿìÿïÿì)ÿðÿìÿìÿì ÿìÿö,"ÿìÿìÿóÿìÿìÿìÿì!9 ÿìZB>Q6 #ÿìÿìÿìÿì ÿìÿóÿìÿúÿýÿûÿì$7. "ÿøÿöÿìÿðÿýÿìÿìÿìÿìÿöÿýÿÿÿìÿìÿñÿóÿïÿìÿÿÿôÿó ÿìÿñkcMÿú%4 ÿì2ÿìÿìÿøÿìÿì%^Cÿýÿìÿì $ÿþÿõÿùÿÿ ):ÿý ÿüÿüÿíÿóÿìÿìÿüÿìÿìÿý ÿúÿðÿòÿøÿÿÿïÿì ÿþÿð ZE-Dbo=ÿú/ÿì$*ÿîÿòÿìÿìÿìÿüÿøÿôÿÿÿîÿìÿïUÿ÷ÿì$ÿüÿìÿìÿöÿìÿìÿìÿìÿ÷ÿìÿìÿìÿòÿìÿñÿìÿì" ÿì  6;-AIM90 ÿì* ÿù ÿøÿì ÿîÿìÿì ÿýÿûÿìÿìÿìÿÿ?ÿìÿìÿÿÿøÿì ÿð ÿìÿìÿóÿì ÿ÷ÿìÿÿ 6EJ:)( ÿøÿöÿìÿýÿìÿðÿìÿìÿøÿòÿþ ÿüÿýÿñÿóÿôÿìÿôÿíÿìÿó ÿøÿû/ÿì $ÿìÿíÿì*' ÿø ÿìÿü ÿúÿì.?3( (ÿí ÿìÿìÿìÿìÿì 5$ ÿìÿìÿþÿú)#ÿìÿìÿìÿìÿì ÿìÿúÿþÿìÿìÿìÿðÿìÿýÿìÿþÿìÿìÿìÿ÷ ÿö$/H9B#ÿìÿìÿø'ÿ÷ÿìÿìÿì ÿì 4ÿîÿòÿñÿìÿÿÿìÿìÿõÿìÿîÿìÿìÿóÿìÿú/ÿ÷ÿì+ÿóÿìÿìÿú%'Uÿî dQ \ÿ÷RÿìÿìÿöÿìÿøÿðD ÿì>4''ÿü =) ÿîÿìÿîÿìÿìÿîÿì ÿõÿìÿìÿì%ÿÿÿôÿð2>6ÿìÿìÿì ÿóÿìÿïÿñÿð %ÿýÿûÿìÿ÷ÿúÿô@ÿðÿíÿþÿìÿð6ÿôÿïÿöÿ÷ÿìÿü&$ÿì ÿþÿì8ÿìÿìÿö' ÿý#75/ÿþÿìÿ÷ ÿìÿìÿþ2ÿìÿùÿýÿìÿìÿþÿìÿü ÿìÿì&ÿöÿó ÿúÿìÿìÿì&ÿþ03!ÿÿÿüÿòNÿùÿú ÿü ÿìÿìÿìÿø ÿìÿì ÿìÿìÿïÿì(= ÿïÿìÿðÿõÿ÷ÿñÿõÿìÿìÿìÿðÿüÿìÿúÿìÿì!6ÿøÿìÿûÿìÿì-ÿô ÿóÿûÿìÿìÿìÿùÿìÿïÿýÿðÿïÿì!ÿþ#ÿðÿíÿþÿìÿõAÿí ÿîÿìÿìÿìÿìÿü ÿþÿøÿóÿìÿìÿìÿõÿöÿöÿý%ÿóÿìÿþ37ÿìÿóÿï  ÿíÿìÿìÿý5ÿø ÿøÿìÿõ ÿôÿõÿõ+ÿì.ÿìÿôÿìÿñÿöÿìÿÿÿðÿìÿôÿìÿþG/ÿìÿî"ÿìÿì -"Aÿìÿìÿìÿôÿóÿöÿìÿìÿìÿì*!" ;ÿô,2ÿùÿì ÿì2ÿì ÿýÿþÿü&ÿíÿûÿþÿûÿú)ÿìÿìÿìÿö"ÿìÿìÿú#6ÿìÿì<f ÿöÿîÿÿÿþ9(ÿú= ÿíÿûÿìÿìÿìÿì1ÿ÷ÿôÿìÿì&ÿìÿìÿÿÿì*%ÿÿÿôÿìÿÿÿøÿü ÿí +ÿì-ÿòÿõ' ÿìÿìÿìÿ÷*ÿïÿìÿÿÿìDÿóÿü (ÿñ2ÿüÿøÿö ÿìÿìUÿìÿúÿñÿö ÿö8ÿì"ÿìÿÿÿìÿîÿô ÿìÿþ5ÿñÿïÿôÿüÿùÿöÿìÿìÿìÿìÿýÿïÿìÿìÿìÿìÿøÿìÿîÿì+ÿìÿüÿì0$ÿìÿþÿùÿóÿìÿó ÿìÿõÿ÷ÿìÿì!ÿìÿìÿìÿì>ÿõÿìÿùÿúÿì%ÿøÿìÿïÿì)ÿì (ÿú2ÿì )ÿìÿùÿìÿìÿìÿòÿìÿüÿø'ÿóÿìÿìÿñÿìÿìÿì(!Dÿì5ÿìÿùÿì-ÿì#  ÿü2 ÿìÿìÿúÿìÿõÿ÷ ÿì +ÿì" ÿìÿìÿìÿîÿíÿìÿùÿö ÿøÿýÿûÿìÿöÿìÿìÿìÿðÿôÿó)-ÿíÿôÿì  %ÿ÷ÿúÿôÿý!"ÿùÿú'ÿìÿìÿìÿû%ÿì0ÿîÿòÿìÿø%ÿòÿìÿòÿìÿòÿüÿìÿìÿìÿùÿøÿìÿüÿìÿþÿóÿýÿïÿíÿì ÿìÿìÿìÿòÿ÷ÿø ÿÿÿìÿöÿìÿüÿìÿþÿòÿô1-ÿìÿí5ÿúÿõ9ÿó$&ÿóÿìÿôÿòÿìÿìÿìÿýÿð-ÿø ÿýÿìÿìÿìÿìÿì ÿìÿþÿìÿñÿìÿ÷ÿôÿðÿïÿìÿúÿìÿìÿìÿìÿþÿìÿü ÿì*ÿìÿìÿû" ÿì+ÿõÿð(ÿóÿò ÿìÿûÿ÷ÿûÿõÿïÿñK,Jÿ÷ÿìÿì8"ÿð ÿùÿìÿþÿìÿìÿìÿìÿìÿðÿìÿôÿüÿøÿìÿòÿü ÿì8ÿôÿì ÿúÿðÿìÿìXÿøÿòÿøÿñ' ÿìÿì ÿìÿì'ÿúÿÿÿì ÿìÿùÿþ O(ÿì +%ÿîÿì8ÿì ÿì ÿüÿì $-Eÿì8 "ÿìÿìÿìÿøÿ÷ÿ÷ÿìÿôÿüÿìÿòÿõÿðÿìÿó "ÿì%1ÿüÿì "ÿìÿñÿìÿõÿìÿûÿìÿìÿì:*ÿì;ÿìÿì ÿìÿî15ÿúÿýÿø!ÿý ÿÿÿìÿï4ÿñÿìÿï ÿìÿìÿìÿì ÿøÿóÿì ÿñÿþÿ÷ÿì- 1@ÿõÿìÿì>ÿöÿìÿòÿüÿìÿíÿìÿì"ÿìÿóÿõ*ÿì ÿñÿúÿì.ÿíEÿìÿñÿìÿì ÿìÿìÿû5% ÿìÿìÿýÿÿÿì Gÿìÿìÿì ÿìÿýÿìÿùÿì- ÿýÿùÿÿ ÿìÿô9ÿì$=ÿìÿìÿìÿúÿùÿûÿþÿúÿ÷ÿì ÿøÿýÿý"ÿìÿìÿ÷ÿìÿòÿý$ÿöÿìÿïÿì ÿî*ÿìÿùÿð ÿìÿìÿìÿôÿíÿó )ÿîÿìÿì*ÿûÿì+ÿõÿì ÿìÿôÿþÿÿ ÿôÿûÿì)ÿøÿñÿùÿûÿöÿîÿìÿìÿíÿöÿöÿû!:!ÿìÿìÿìÿìWÿìÿì'ÿìÿü ÿùÿöÿìÿöÿìÿìÿø2ÿÿÿìÿíÿìÿìÿïÿýÿíÿì ÿìÿüÿúÿ÷ÿì$ÿöÿþ 1Qÿìÿ÷ÿì(ÿøÿþ-ÿìÿ÷ÿî&ÿõÿì ÿìÿô ÿìÿì,"7 ÿÿÿìÿõÿÿÿìÿìÿì(ÿôÿìÿû5ÿðÿì$, ÿö@ÿìÿöÿóÿìCÿóÿìÿìÿîÿ÷ÿì+ÿÿÿìÿöÿøÿìÿÿ  ÿìÿìÿìÿì\;=ÿìÿõ ÿðÿìÿìÿì 'ÿìÿìÿô;ÿðÿì!ÿìÿùÿÿÿíÿìÿýÿõÿìÿìÿíÿìÿìÿð  ÿöÿìÿöÿúÿìÿðÿìÿìÿýÿìÿù ÿñÿý ÿñÿìÿïÿìÿìÿìÿìÿìÿ÷ÿìÿýÿìÿìÿìÿùÿÿÿöÿìÿìÿì+ÿìÿì ÿöÿïÿì'ÿìÿöÿìÿìÿúÿìÿïÿö$ÿþÿìÿ÷ÿùÿíÿñÿÿÿþ!ÿþÿìÿìÿìÿø)ÿÿÿìÿúB)7ÿüÿí6 ÿì ÿõÿìÿúÿìÿì&ÿðÿòÿì:<&ÿñÿìÿðÿìÿìÿüÿìÿýÿìÿìÿüÿìÿûÿìÿìÿì-0 )#7ÿõÿÿÿìÿìÿìÿþÿìÿñÿöÿìÿöÿì   ÿø ÿò$I&ÿìÿö&""ÿì%'ÿõÿì ÿúÿìÿìÿíÿìÿìÿìÿìÿóÿü&eÿìÿì ÿìÿïÿìÿù"ÿñÿìÿì  ÿý-ÿó"ÿý6Eÿìÿô ÿì$ÿìÿìÿì ÿõÿý$ ÿìÿøÿìÿìÿõ:ÿì ÿñÿì % ÿì-ÿó'ÿìÿû  ÿìÿìÿìÿîÿìÿúÿóÿìÿìÿì(ÿõÿìÿì ÿúÿñÿùÿìÿìÿñ ÿóÿìÿüÿöÿý*ÿøÿòÿìÿøÿ÷ÿì ÿ÷ÿûÿìÿìÿì+ÿìÿìÿìÿìÿì ÿìÿìÿìÿì! ÿóÿìÿì ÿõÿø "ÿìÿòÿìÿüÿÿÿìÿÿÿöÿìÿì'ÿìÿí<3ÿì#ÿíÿø+ÿìÿì &ÿîÿùÿ÷ÿìÿìÿÿ>#ÿòÿ÷ÿðÿìÿþÿìÿìÿìÿìÿì%-$ÿìÿìÿ÷ÿ÷ÿìÿõÿüÿìÿíÿì ÿìÿìÿïÿûÿìÿì ÿñ ÿóÿîÿöÿìÿìÿì ÿóÿìÿì 1ÿôÿùÿÿ #ÿìÿ÷ÿìÿì .) ÿîÿóÿìÿúJÿøÿìÿìÿðÿòÿò ÿðÿòÿìÿýÿñÿúÿì )ÿìÿô ÿûÿý/ ÿñÿìÿþÿì ÿìÿþÿõÿýÿÿÿìÿì6 ÿüÿîÿüÿïL, ÿì3ÿìÿìÿìÿúÿÿÿì *ÿøÿôÿì ÿùÿìÿì &ÿìÿìÿùÿý'ÿýÿìÿìÿþÿûÿìÿóÿìÿôÿìÿïÿìÿì-ÿýÿìÿöÿìÿî ÿþÿìÿùÿìÿï,-ÿñÿ÷ ÿýÿ÷3ÿìÿóÿÿÿíÿøÿü ÿÿÿìÿìÿð-ÿúÿìÿìÿþÿì ÿìÿôÿì  ÿìÿìÿìÿþ ÿôÿìÿìÿìÿì /)$ÿô!ÿìÿì ÿìÿûÿÿÿõÿìÿðÿý+ÿòÿì?ÿì4 ÿìÿìÿûÿð+$)ÿñÿÿÿôÿí 2ÿìÿìÿì ÿü#ÿìÿìÿìÿþÿìÿìÿì"ÿìÿìÿì ÿìÿìÿñ&JM{f4 ÿõ#+<2@)"ÿöD9 ?,"ÿö "$ÿÿÿìÿþÿüÿýÿìÿìÿì (2ÿìÿìÿì"ÿìÿûÿìÿì ÿúÿìÿìÿúÿý 8‘†g‡h&0FfAL/ÿì$5ÿìÿ÷ÿìÿìÿìÿø# ÿìÿì";ÿìÿìÿìÿý7Jÿìÿìÿóÿìÿì ÿìÿìÿüÿÿn‚p\vhr]QHu‰cNC2$ ÿöÿóP1ÿ÷ÿðÿìÿìÿìÿìÿòÿøÿì,)ÿûÿì'$ÿìÿìÿìÿìÿì ÿïÿìÿíÿìÿîÿìÿì ÿìÿüÿì ÿúÿòF‚)&3y|p`“}~*3P& *ÿìÿìÿîÿíÿø'ÿñ !6ÿòÿìÿìÿï?ÿöÿìÿì ÿùÿû*/ÿìÿÿIÿîÿö&n˜‡2"4eA<kŒ|S †`F%((! ÿûÿøÿùÿì-ÿì''ÿìÿì4ÿôÿìÿìÿõÿì*ÿó(ÿì*ÿþ2bxµz* %+<ÿö1Z8D§o-.W5ÿ÷$ZG2  ÿìÿì ÿïÿøÿñÿì ÿïÿúÿìÿìÿñÿìÿìÿì(ÿöÿòÿìÿý# 25c> ("D.$1,+T2ÿìÿó-9+' ÿþÿìÿöÿìÿìÿìÿùÿï# ÿþÿì 5ÿì7 !ÿìÿìÿìÿÿÿìÿóÿìÿìÿìQ‰r'!ÿü!$%*G<"1=R0((ÿì&ÿùÿý&ÿü*ÿ÷ÿìÿú-'ÿÿÿìÿìÿúÿìÿýÿþ%ÿìÿìÿöÿ÷ÿþÿì;kE5#7ÿìÿìÿì ÿó&$7_  ÿø,4:ÿìÿðÿüÿø ÿì-7ÿìÿìÿìÿýÿì#ÿïÿìÿìÿìÿì#'ÿþÿõ:I#<Pbÿüÿìÿìÿìÿûÿúÿþÿìÿìÿìÿì=Fÿúÿìÿì ÿìÿìÿöÿï ÿìÿ÷ ÿôÿóÿìÿìÿïÿù"ÿòÿìÿì 5=5!9 ÿìÿïÿìÿìÿúÿòÿü<ÿýÿìÿü ÿñÿì ÿìÿòÿ÷,ÿìÿóÿìÿìÿìÿìÿüÿìÿìÿÿÿ÷ P<ÿìÿùAP2ÿò)ÿì&ÿô%M8ÿý%1# ÿìÿìÿòÿð2%#"ÿð ÿìÿìÿì)ÿï ÿìÿìÿýÿí(:#$@SdL0ÿïÿìÿìÿþÿý  ÿìÿìÿìÿìÿìÿìÿìÿöÿìÿôÿöÿîÿñÿîÿì,ÿ÷ÿì  =ÿüÿïÿðÿìÿì ÿìÿöÿìÿìÿìÿù,"3]<`T!ÿýÿìÿ÷ #2ÿìÿìÿ÷+ÿìÿìÿìÿðÿì ÿìÿó)ÿôÿìÿìÿùÿìÿìÿõÿì ,ÿì ÿìÿìÿìÿì ;C(`T/'ÿìÿìÿóÿîÿìÿ÷ÿúÿÿÿý0ÿìÿýÿìÿô-ÿüÿðÿìÿìÿìÿìÿìÿìÿì2<ÿûÿìÿü5ÿìÿý',ÿú!3`iT$ÿìÿì&ÿøÿìÿìÿôÿô#6ÿõÿþÿìÿþ$ÿìÿð-ÿîÿýÿìÿñÿùÿìÿø ÿì;ÿíÿìÿíÿïÿùÿìÿìÿüÿóÿõÿö8^MJA+ÿìÿíÿìÿñÿìÿìÿìÿì ÿþÿìÿü %ÿìÿíCÿì+ ["ÿöÿð.1ÿöÿîÿì ÿû*ÿõÿñÿñÿìÿ÷ÿþÿøÿû ÿýÿõÿñ3_I7$ ÿìÿìÿìÿìÿìÿì>ÿìÿìÿì ÿöÿöV ÿìÿìÿýÿìF ÿìÿìÿúÿìÿìÿìÿùÿôÿþÿìÿîÿü+,B<G&  ÿùÿìÿì ÿóÿìÿìÿùÿìÿì 0ÿìÿíÿì ÿóÿúÿìÿìÿý ÿìÿøÿúC("!ÿìÿìÿüÿìÿìÿìÿì+[ÿþ L=7ÿìÿñ+"ÿñÿó ÿîÿìÿì  ÿìÿìÿìÿïÿïÿì. 'ÿìÿôÿìÿìÿìÿìÿìÿìÿïÿìÿîÿîÿôÿöÿìÿðÿóÿÿ ÿìÿøaY8ÿìÿìÿìÿìÿüÿý ÿýÿìÿì#O3ÿìÿúÿõÿîÿÿÿý)ÿÿC ÿì ÿìÿìÿìÿòÿîÿìÿìÿòÿí!ÿìÿþ ÿû6X )&ÿìÿý ÿîÿðÿìÿîÿû  =ÿüÿüÿìÿøPÿõÿì!ÿøÿûÿóÿöÿðÿñÿìÿñÿìÿûÿùÿï ÿø3ÿì0%2*/8ÿú ÿìÿõÿûÿüÿì $)& ÿùÿìÿüÿþ ÿìÿìÿö4ÿòÿìÿþÿÿÿì ÿùÿ÷ÿìÿþÿÿ'&ÿì ÿìÿô,:Pÿþ ÿýÿóÿÿÿðÿìÿìÿø ÿìÿìÿìÿìÿíÿý&ÿ÷ÿö.!ÿøÿüÿîÿì ÿúÿõ.ÿýÿìÿíÿïÿ÷  ,ÿì2ÿùÿì,33 ÿìÿìÿìÿìÿìÿìÿùÿÿÿìÿìÿùÿüÿýÿìÿúÿÿÿìÿìÿðÿüÿìÿøÿìÿùÿûÿìÿïÿìÿìÿ÷ÿñ$ÿì ÿì**3E/)ÿþ! ÿìÿìÿìÿìÿì$ÿì ! ÿø ÿî ÿÿÿìÿÿÿóÿìÿìÿìÿôÿøÿìÿìÿöÿìÿìÿìÿü*ÿúÿì (ÿìÿìÿìÿøÿú=qÿø]L MÿìSÿìÿì3 ÿìÿìÿìÿöÿûÿìÿö&ÿì+"ÿò B ÿýÿüÿîÿìÿìÿìÿìÿìÿúÿìÿìÿìÿì7ÿìÿìÿì.ÿüÿô-ÿìÿìÿì$ÿìÿùÿù.ÿìÿì /ÿôÿùÿûÿñÿ÷8ÿöÿìÿõÿ÷ÿì ÿìÿú /"ÿôÿì&ÿõÿìÿ÷&ÿìÿì!ÿüÿó  ÿüÿñÿìÿ÷ÿìÿì=ÿïÿìÿõÿìÿóÿóÿìÿûÿñ ÿúÿî+ ÿüÿìÿû,ÿü6"ÿôBÿûÿôÿìÿìÿì ÿìÿõÿôÿì"0Bÿóÿìÿîÿüÿÿÿûÿôÿîÿòÿïÿìÿìÿûÿõÿìÿìÿ÷-ÿìÿ÷ÿï+ÿó"ÿìÿìÿûÿìÿìÿì8ÿðÿìÿíÿóÿìÿì"ÿìÿì'ÿú"ÿÿ1ÿì ÿìÿþÿì*ÿìÿþÿîÿð ÿñÿìÿìÿöÿìÿýÿðÿìÿòÿìÿì!ÿìÿìÿõ,,ÿíÿìÿùFB5ÿöÿðÿìÿìÿìÿû6ÿìÿíÿñÿìÿìÿöÿìÿó6"ÿì ÿ÷ÿìÿìÿ÷ÿó-ÿõÿòÿþ!ÿìÿìÿüÿìÿìÿìIÿìÿþÿøÿìÿìÿû3$ÿù ÿìÿøÿüÿöÿîÿìÿìÿìÿìÿìÿì"ÿõÿô*ÿòÿû.+ÿøÿìÿì'ÿìÿöÿìÿöÿì"ÿìÿì.ÿìÿòÿì ÿìÿìÿìÿûÿìÿí-<ÿíÿì)\ÿôÿðÿõ4.ÿòÿìÿþÿìÿìÿõÿìÿìÿÿÿ÷ÿôÿîÿÿÿøAÿìÿìÿûÿì+ ÿóÿìÿòÿì#ÿìÿì9 ÿý&G/ÿïÿìÿìÿÿ ÿì ÿóÿì, ÿï  ÿìÿì'ÿüÿì ÿñÿõ Bÿü !ÿìÿíÿùÿìÿó ÿì)! ÿí ÿõÿþ",ÿìÿòÿüÿì"ÿüÿÿ ÿðÿìÿì ÿøÿó9"ÿùÿì ÿì#  ,&ÿìÿùÿ÷ÿìÿì ÿìÿìÿïÿì ÿìÿÿÿìÿì()ÿìÿý(ÿìÿì,ÿÿÿìÿöÿìDÿóÿì"ÿì*92ÿìÿúÿì)ÿòÿ÷ÿìÿìÿìÿìÿìÿíÿøÿþ3ÿìÿìÿìÿþÿìÿ÷ÿìÿìÿù ÿô ÿì!ÿìÿì ÿïÿöÿþÿüÿìÿÿÿóÿ÷ÿìÿÿ7 ÿìÿùÿìÿìÿìÿô !ÿôÿìÿìÿìÿìÿìÿìÿõ$ÿöÿöÿðÿõÿìÿõÿ÷ÿþÿìÿì+ÿìÿÿÿìÿüÿôÿú ÿú$ )ÿþÿìÿìÿóÿöÿïÿôÿ÷ÿò5 ÿû$ÿìÿìÿìÿþÿìÿýÿì.ÿìÿìÿíÿìÿìÿþÿìÿìÿîÿüÿ÷ÿìÿþ ÿìÿïÿûÿìÿíÿìÿìÿìÿìÿü  ÿòÿòÿøÿñÿóÿûÿïÿìÿúÿûÿóÿþHF'ÿùÿý#ÿìÿòÿìÿø+3ÿìÿðÿìÿìÿñ5ÿìÿÿÿø-'ÿìÿì ÿìÿìÿìÿìÿðÿìÿìÿïÿþÿìÿìÿìÿíÿüÿùÿìÿìÿìÿøÿìÿìÿõÿìÿùÿì2ÿìÿîÿü4ÿÿÿÿÿì3ÿ÷ÿìÿìÿþ,ÿúÿÿÿñÿýÿìÿìÿî>6ÿôN%ÿì?ÿ÷ÿûÿÿÿìÿìÿìÿìÿìÿù ÿíÿìÿì ÿì:ÿìÿýÿ÷ÿíÿý ÿüÿñG ÿ÷ÿìÿìÿì$("ÿ÷ÿì3ÿìÿìÿíÿþÿòÿû&ÿìÿö&ÿùP+ÿìÿøÿû"ÿøÿì0*ÿÿ ÿìÿóÿõÿýÿì ÿì ÿí?ÿþ. ÿìÿìÿìÿìÿñÿìÿìÿô ÿðÿìÿøÿìÿþÿóÿðÿï Eÿíÿì$<ÿöÿìÿìÿò*ÿìÿìÿù:)ÿì35ÿúÿ÷ ÿü%ÿü ÿìÿï$ÿüÿ÷ÿðÿìÿÿÿìÿìÿì ÿûÿìÿôÿ÷ÿìÿüÿùÿïÿìÿú0ÿõ?"ÿýÿìÿì"Cÿìÿì#ÿøÿ÷ÿü 0ÿÿÿìÿþÿñ<ÿï  ÿý ÿþÿìÿìÿý-%ÿòÿø)*+ÿìÿìÿìÿìÿìÿìÿìÿö$ÿìÿì*ÿì 7ÿìÿìÿöÿýÿüÿþÿìÿðÿì %ÿÿÿïÿûÿìÿúÿñ4ÿì*ÿìÿìÿìÿìÿûÿþÿìÿñÿìÿþÿóÿìÿìÿìÿìÿìÿö'ÿõÿöÿÿÿìÿìÿôÿì(ÿþÿìÿøÿýÿìÿïÿìÿÿÿìÿìÿñÿúÿìÿìÿì ÿì.ÿ÷ÿìÿìÿì4ÿÿÿýÿìÿüÿìÿìÿï+ÿúÿý'ÿøÿñÿïÿì ÿìÿùÿìÿýÿù .ÿÿÿìÿìÿì8ÿì  *ÿíÿìÿìÿìÿì&*ÿì= ÿìÿóÿóÿìÿøÿû'ÿìÿñÿùÿ÷ÿìÿùÿ÷ÿìÿýÿð ÿîÿûÿìDÿìÿýÿýÿì?ÿôÿîÿìÿû8ÿìÿöÿíÿìÿìÿýÿù:ÿï3ÿðÿìÿìÿñÿìÿìÿìÿÿÿì!ÿìÿì5ÿùÿìSÿìÿðÿì2ÿìÿ÷ÿýÿþÿõ ÿó+ÿþÿÿÿìÿìÿþ$ÿøÿ÷ÿì +ÿóÿìÿú3,ÿìÿô>2'ÿóÿìÿð"0ÿñÿìÿïÿðÿÿÿùÿìÿþÿì ÿìÿìÿìÿìÿûÿüÿì#ÿüÿíÿùÿìÿìÿíÿûÿì ÿôÿñÿíÿúÿìÿì2ÿýÿúÿüÿîÿüÿìÿñ ÿìÿì ÿìÿ÷ÿìÿÿÿïÿìÿüÿñÿìÿôÿì ÿìÿì ÿøÿìÿòÿìÿìÿìÿôÿûÿñÿìÿì)ÿìÿìÿìÿì+ÿïÿîÿì ÿóÿîÿìÿìÿì ÿùÿìÿóÿ÷ÿìÿü(ÿìÿô(ÿùÿìWÿÿ' 3"ÿï:ÿüÿì#ÿúÿþÿìÿÿÿì-ÿõÿìF65ÿôÿìÿìÿìÿò ÿì ÿìÿìÿùÿðÿìÿðÿó3 ÿï,Hÿìÿìÿìÿ÷ÿþÿû"ÿýÿìÿ÷ÿô ÿøÿü#ÿÿÿìÿÿÿüA#ÿìÿì+ÿö4Gÿìÿì ÿÿÿñÿìÿîÿìÿìÿîÿìÿìÿùÿòWÿì#ÿïÿýÿìÿûÿíÿòÿìÿìÿì!ÿþ. 0ÿûÿñÿõÿð(6ÿìÿýÿùÿìÿù= ÿþÿìÿìÿì  +( ÿíÿòÿì ÿìÿìÿì'ÿì! ÿìÿì +ÿì-.ÿìÿìÿóÿ÷ÿ÷ÿìÿìÿìÿüÿûÿûÿìÿìÿòÿìÿìÿì@ÿìÿðÿøÿìÿïÿûÿìÿòÿþ( ÿþÿóÿöÿìÿíÿìÿìÿñÿïÿùÿìÿøÿûÿìÿìÿìÿìÿìÿì!ÿóÿì ÿíÿìÿìÿìÿø' ÿø ÿìÿì/ÿûÿýÿìÿìÿì ÿñÿúÿí!ÿìÿúAÿþ$ÿìÿõÿï) ,ÿþÿìÿìÿìÿðÿìÿìJÿìÿìÿìÿû*'ÿìÿìÿìÿì )5ÿþ#ÿìÿìÿïÿìÿìÿüÿí0ÿìÿìÿüÿøÿìÿìÿïÿòÿìÿúÿú0ÿþ,ÿ÷ÿÿÿìÿì+ÿòÿõÿìÿìÿúÿì"ÿüÿøÿÿÿìÿõÿþÿñÿü ÿþÿøÿìÿì8ÿìÿìÿðÿûÿÿÿíÿý ÿìÿìÿìÿøÿìÿöÿðÿú%/ÿìÿù&ÿìÿìÿóÿòÿø ÿïÿì 13 ÿìÿüÿñÿóÿùÿþD ÿùÿìÿ÷/ÿÿÿøÿûÿþÿþÿì ÿìÿì ÿþÿìÿìÿú ÿì'&ÿìÿøÿþÿìÿìÿì4ÿùÿì'ÿõÿì(ÿì ÿìÿìÿÿÿô'ÿûÿóÿõ"Eÿìÿìÿÿÿðÿö ÿ÷ÿöÿüÿôÿùÿñÿúÿìÿÿ&ÿìÿõ?+ÿðÿìÿì""ÿïÿìÿüÿìÿìÿ÷ ÿñÿìÿìÿìÿìÿõÿÿ D?#ÿôÿîÿìÿìÿüÿþÿìÿìÿûÿðÿøBlM,C>ÿ÷ÿô852ÿìÿù#"ÿÿ2ÿöÿìÿìÿìÿÿÿöÿì5ÿìÿìÿöÿìÿìÿì)ÿñÿìÿò<!ÿìÿìÿìÿù*ÿõÿóÿìAJ‰ˆkD>]`†q7*J?B)sr,(ÿýÿõ 'ÿì ÿïÿìÿöÿìÿìÿì&&$ÿìÿìÿûBÿì ÿìÿûÿìÿìÿÿÿø J-Yf‰Ž“O?So’qpF NB1-&4]ÿìÿìÿìÿìÿû4 ÿýÿÿÿìÿì3ÿìÿìÿíÿü &ÿïÿì ÿÿÿÿÿì ÿìÿìÿ÷ÿöÿÿ8€sRANFICY(J†lC?NT5ÿý g?ÿìÿûÿüÿìÿíÿìÿìÿðÿìÿýÿìÿðÿìÿìÿìÿìÿìÿìÿìÿìÿøÿøÿù ÿúÿí$r˜Y  Zie+Yo6COA9 &/&ÿõÿìÿìÿì$ÿìÿìÿö ÿûNÿùÿìÿìÿùÿþÿøÿì. 9ÿô X œQ,IIN ?i~<}YX7ÿì+ÿþ(ÿòÿîÿìÿìA2ÿôÿì0ÿìÿìÿ÷ ÿôÿìÿìÿìÿìÿì"ÿþ,}‰ˆTÿúÿò 7ÿì ,fM00/ÿì?) ÿ÷ÿùÿý"ÿúÿìÿìÿìÿùÿì"ÿìÿòÿìÿìÿì/ ÿîÿú :DEÿÿÿð 1 ÿöÿûÿýÿìÿì)Fÿíÿöÿþ ÿìÿôÿüÿìÿþÿÿ-(ÿñÿùÿìÿþ/ÿì-ÿòÿìÿìÿìÿìÿì&ÿþ7fbH(," ÿì 8%ÿûÿìÿí&-%ÿöÿìÿð/*ÿìÿì ÿìÿýÿìÿì !ÿóÿìÿìÿøÿøÿìÿòÿø$ rB; ÿìÿìÿìÿ÷ÿùÿ÷-ÿð,Nÿøÿ÷ÿìÿñ#ÿø'ÿìÿþÿùÿìÿìÿñ,Eÿûÿìÿö%*ÿìÿì ÿòÿìÿì$ÿ÷`6EE9+Mÿÿÿüÿìÿìÿìÿìÿìÿì ÿìÿìÿìÿìÿó)ÿù  ÿìÿì ÿìÿìÿø0ÿìÿìÿìÿìÿìÿìÿùÿùÿõÿìÿì9(ÿýÿìO=&<6ÿðÿìÿìÿìÿìÿòÿìÿûÿþÿì!ÿñÿüÿïÿóÿüÿù ÿðÿìÿìÿíÿþÿìÿðÿø ÿûÿúÿìÿìÿìÿû$ V@ÿì=T;Q?ÿíÿìÿìÿì %ÿõ > $ÿÿ#2  ÿðÿìÿðÿõÿì *ÿìÿÿ"ÿìÿôÿì ÿýÿìÿ÷ÿìÿõÿì @( ;~“hAÿÿÿðÿìÿìÿ÷ÿý ÿìÿîÿöÿøÿìÿìÿúÿìÿìÿõ ÿìÿñÿöÿúÿïÿñ@ÿìÿòÿÿ7ÿõÿìÿþÿïÿï!ÿìÿ÷ÿìÿìÿìL2 .=`77 ÿùÿîÿìÿì 9ÿíÿî ÿõBÿüÿîÿì)ÿóÿ÷ÿìÿù)!ÿìÿþ ÿþÿóÿìÿìÿþÿì$ÿû-.ÿÿÿìÿóÿöO,9ÿý<2 ÿîÿì ÿìÿìÿýÿðÿì.ÿìÿùÿô ÿõÿó ÿìÿìÿñÿõÿì$ÿìÿìÿì!4ÿöÿìÿñ 8ÿì -0=E7ÿìÿì/ÿô ÿìÿìÿï"ÿìÿòÿìÿíÿï&ÿì Cÿìÿÿÿþÿìÿí,ÿý&ÿûÿùÿì;ÿïÿìÿôÿìÿìÿìÿìÿì ÿó!-2C$,5)ÿìÿìÿìÿìÿòÿìÿóÿìÿíÿøÿìÿìÿï)ÿìÿìCÿìBÿþÿìL9ÿþÿúÿìBÿñÿíÿóÿí ÿÿÿþ8+'\/ ÿìÿìÿìÿìÿìÿü.ÿìÿìÿñÿïÿñ ÿøÿï_ ÿìÿìÿì6 ÿüÿûÿìÿìÿí ÿðÿìÿòÿõÿìÿóÿþ-,K "<8$!9ÿûÿìÿõÿõÿôÿòÿìÿðÿìÿö ÿÿÿìÿòÿô ÿìÿûÿÿÿìÿø ÿúÿì ÿÿÿì%ÿ÷Bÿøÿìÿìÿìÿýÿýÿìÿì$b.$ 1- ÿìÿìÿøÿùÿÿ4ÿöÿöÿìÿýÿìÿìÿìÿùÿóÿû(< ÿï ÿÿÿìÿôÿìÿûÿìÿöÿìÿìÿõÿü)ÿøÿì )'/ÿóÿöÿò+ ÿì D-ÿìÿï ÿ÷ÿøÿìÿìÿó9ÿúÿïÿì!"ÿðÿìÿìÿì"ÿñÿÿÿø<ÿí.ÿì7ÿìÿø ÿûÿìÿìÿìÿüÿïÿìÿïÿìÿì ÿì  ))S,3ÿì ÿìÿôÿìÿûÿþÿìÿý K ÿì ÿóRÿì ÿõ #ÿìÿì'ÿìÿìÿ÷ 1*Dÿì-7ÿõ . ÿîÿìÿî,ÿì&8,=Kÿìÿÿÿñ0ÿìÿìÿóPÿì  ÿøÿïÿù'ÿì,ÿðÿó#9ÿý9$ÿì 1ÿø ÿòÿìÿýÿìÿìÿìÿì ÿôÿÿÿñÿìÿìÿû >ÿþ0 ÿþÿìÿï+ ÿîÿìÿúÿýÿíÿõÿý ÿö-.ÿõ ÿö+!,ÿð ÿì:ÿíÿìÿìÿîÿìÿì7ÿôÿìÿìÿìÿïÿìÿùÿõÿìÿôÿòÿìÿîÿíÿìÿìÿîÿìÿÿÿìÿöÿúÿìÿíÿ÷(ÿ÷ÿìÿìÿýÿì+ /ÿûÿìÿìÿì#)ÿýÿìÿì 0ÿìÿÿÿôÿìÿìÿ÷ÿìÿ÷ÿìÿûÿðÿðÿìÿøÿóÿùÿìÿìÿìÿìÿñ"ÿó ÿìÿìÿìÿì$Vÿ÷ÿö! !ÿìÿþ Fÿìÿì%*ÿìÿìÿó ÿìÿìÿÿÿô%&ÿì"ÿ÷;ÿñÿìÿìÿìÿìÿìÿìÿìÿ÷=Eÿìÿìÿìÿó$ÿûÿøÿó ÿòÿóÿíÿìJÿðÿì'ÿìÿõÿùÿüÿòÿõ ÿìÿì ÿìÿì ÿìÿì< ÿöÿï'ÿìÿìÿõ(ÿìÿìÿÿ ÿòÿú ÿìÿïÿìÿùÿì ÿûÿ÷ <ÿìÿìÿÿÿì ÿûÿüÿùÿôÿùÿöÿø$#(&"ÿþÿü#ÿì+ )ÿìÿûDÿùÿìÿìÿì  ÿõÿìÿú* ÿòÿìÿì2*<ÿòÿìÿôÿøÿðÿü ÿþÿìÿüÿìÿôÿìÿìÿìÿ÷"ÿìÿðÿñ+ÿôÿüÿìÿì$:ÿõÿìÿùÿñÿíÿíÿö%(ÿìÿì+ÿüÿÿ;ÿìÿóÿóÿì ÿìÿìÿìÿñÿðÿÿÿìÿìÿìÿìÿìÿüÿóÿþÿûÿîÿìÿìÿìÿÿÿìÿì!ÿõÿöÿøÿûF2/ÿþÿì ÿøÿìÿìÿìÿìÿìÿùÿìÿì ÿìÿò ÿìÿò. ÿìÿïÿìÿó ÿìÿìÿúÿì1ÿîÿìÿò(ÿìÿøÿì ÿìÿìEÿì ÿìÿìÿðÿúÿìÿõÿøÿìÿñÿþÿìÿÿÿìÿìÿúÿìÿìÿìÿú-. ÿìÿìÿì.ÿìÿñ;3ÿðÿÿÿìÿï'ÿìÿìÿì ÿìÿì ÿìÿì2 ÿìÿþÿð%ÿðÿìÿìÿñÿìÿìÿöÿû$ÿì0ÿíYÿõÿìÿì(ÿüÿìÿìÿ÷ÿúÿì ÿìÿìÿòÿüÿùÿõÿì ÿìÿì-ÿìÿì ÿì ÿñÿóÿüÿìÿìÿì!ÿìÿì7 '@ÿìÿìÿÿÿõÿø ÿìÿìÿì2;,ÿÿ&ÿú +'ÿÿÿìÿúÿö#ÿì!$ ÿîÿÿ-ÿúÿìÿøÿùÿüÿì'ÿðÿðÿð6 ÿíÿüÿøÿìÿñ$3ÿìÿìÿúÿìÿìK$ÿõÿìÿì&ÿóÿöÿòÿìÿû(ÿ÷ÿïÿìÿìÿì"ÿñÿþÿìÿöÿõ+ÿìÿð'ÿìÿì$ ÿõÿðÿì<ÿýÿìÿì$9'ÿðÿòÿùÿî&ÿìÿìÿìÿìÿìÿø?ÿöÿìÿìÿìÿìÿì ÿóÿöÿýÿìÿìÿìÿìÿôÿû"$ÿìÿ÷  ÿÿÿìÿìÿìÿìÿìÿìÿìÿì%'ÿìÿì'ÿìÿìÿò"ÿüÿï ÿòÿìÿìÿìÿüÿíÿòÿìÿòÿõÿòÿîÿìÿìÿìÿì0ÿïÿìÿÿÿñÿñÿìÿìÿìÿÿÿûÿìÿñÿþ/ÿÿÿìÿìÿøÿü=K*ÿøÿìÿìÿøÿïÿìÿýÿìÿýÿì/ÿïÿíÿìÿìÿ÷ÿìÿìÿøÿ÷ÿûÿìÿøÿì$ ÿìÿíÿ÷ ÿìÿüÿì ÿíÿþÿþÿÿÿûÿìÿö ÿ÷ÿþ0.ÿð9ÿðÿÿÿìÿôÿõÿù&1ÿìÿñ ÿìÿìÿû(ÿì 0, ÿû7ÿøÿû ÿìÿìÿìÿìÿìÿì ÿûÿìÿìÿìÿìÿû ÿóÿìÿìÿü ÿìÿìÿì(ÿñÿÿÿñ8ÿìÿú Nÿ÷ÿì"ÿúÿìÿø7ÿûÿýÿìÿÿÿìÿìÿì<3%ÿð!5ÿýÿ÷ÿü  ÿúÿùÿìÿìÿþÿìÿìÿî:6ÿìÿì "ÿìÿìÿìÿó ÿõÿÿÿïB ÿìÿìÿì%ÿòÿîÿìÿî=ÿìÿìÿìÿöÿøÿ÷ÿðÿýÿòÿìA;ÿìÿìÿï&ÿïÿìÿì$8ÿñÿÿÿìÿìÿø-ÿô+ÿûÿìÿ÷ÿì%/ÿìÿìÿìÿìÿìÿð ÿì( ÿüÿìÿùÿü ÿìÿö0ÿìÿìV ÿìÿðÿìÿì7ÿìÿì/& ÿðÿìÿÿ#Aÿüÿûÿý*ÿûÿìÿìÿìÿì ÿþÿìÿìÿúÿòÿïÿõÿìÿì ÿ÷ÿìÿì7ÿì" /ÿìÿìÿû"ÿí- ÿìÿì%Cÿìÿìÿýÿìÿùÿõÿù(ÿìÿöÿìÿ÷ (ÿìÿìÿìÿïÿðÿìÿì%9)ÿìÿìÿìÿìÿùÿìÿìÿúÿõ$ÿìÿô.3ÿîÿîÿûÿìÿì.#ÿìÿîÿìÿõ%ÿì &ÿì $ ÿì ÿô)ÿìÿìÿõ2ÿìÿþ %ÿûÿí ÿù ÿìÿûÿñÿìÿìÿíÿìÿì>ÿïÿïÿìÿíÿùÿì ÿìÿìÿÿÿÿÿìÿìÿìÿì)ÿìÿí 'ÿìÿìÿ÷ÿîÿì" ÿî ÿîÿìÿùÿýÿüÿîÿìÿðÿìÿõ/&ÿìÿúÿøÿÿ ÿôÿìÿò#ÿ÷!5ÿìÿìÿìÿìÿûÿùÿìÿìÿìDÿð  ÿòÿþÿìÿìÿõÿìÿì("ÿì4ÿìÿôÿìÿ÷(ÿìÿó5ÿòÿìÿì ÿòÿõÿìÿìÿìÿìÿúÿÿÿìÿÿÿìÿìMÿì#/ÿúÿúÿÿÿìÿì@ ÿùÿì& ÿìÿìÿúÿìÿìÿñÿì+ÿø ÿìÿìÿìÿïÿìÿìÿìÿì ÿùÿìÿí1ÿýÿïLÿóÿìÿìÿì ÿìÿÿ.ÿøÿóÿú ÿñÿì 8ÿüÿú ÿó "ÿðÿúÿý+ÿìÿì%7 ÿìÿìÿìÿüÿìÿí ÿñÿìÿìÿøÿøÿíÿì*ÿìÿìÿîÿìÿùÿý% ÿìÿòÿìÿìÿýÿìÿìÿÿ( ÿøÿì ÿöÿòÿö ÿìÿì ÿúÿô1ÿþÿì ÿìÿìÿìÿìÿõÿìÿõÿíÿì#ÿþÿìÿìÿìÿñÿìÿì ÿùÿìÿìÿì ÿýÿìÿìÿìÿì ÿìÿýÿìÿüÿìÿìÿùÿìÿì#ÿìÿì#ÿìÿîÿö)ÿìÿùÿ÷_ÿì 1 ÿì"!ÿù ÿûÿì ÿì-* ÿÿ@,5ÿñÿìÿ÷ÿø )ÿï ÿìÿûÿìÿù ÿþÿìÿìÿúÿðÿÿÿû"ÿýÿì,ÿìÿìÿöÿô7ÿìÿïÿùÿìÿø%ÿùÿòÿìÿìÿïÿøÿÿÿìÿû& ;Uÿìÿì&ÿÿÿõ ÿüÿìÿìÿìÿìÿìÿìÿìÿùÿôÿì Oÿû1ÿìÿíÿìÿìÿìÿìÿò#ÿìÿìÿì,# ?Aÿïÿìÿö #ÿüÿìEÿìÿò!ÿøÿìÿìE ÿìÿìÿì&$ÿüÿìÿñÿìÿìÿô*ÿìÿì>ÿìB# ÿìÿìÿìÿð*ÿìÿìÿìÿìÿòÿûÿìÿïÿìÿðÿûÿìÿìK(ÿìÿö$ÿýÿïÿìÿöÿìÿú ÿùÿìÿûÿìÿìÿõÿôÿìÿìÿüÿóÿìÿûÿïÿìÿìÿ÷ÿñÿ÷ÿì2,ÿôÿìÿìÿïÿîÿìÿîÿñÿøÿó ÿîÿì ÿìÿìÿý*7ÿóÿìÿ÷ÿùÿìÿìÿì'$ÿôÿú7ÿüÿñ-ÿþÿìÿø(ÿìÿúÿî%>ÿìÿõÿóÿñÿìÿì ÿìÿìLÿíÿòÿïÿþ +!(ÿìÿüÿìÿìÿñ&;G# ÿðÿìÿìÿì ÿìÿì,ÿïÿì ÿìÿìÿìÿñÿü#ÿìÿòÿø-ÿø #ÿ÷ÿûÿþÿñÿì0ÿìÿôÿì ÿìÿíÿï ÿì.ÿìÿò ÿÿÿôÿùÿìÿîÿú5ÿì ÿñÿíÿÿÿîÿìÿìÿì!ÿìÿìÿìÿìÿøÿìÿì ÿñ $ÿìÿüÿô*$ÿôÿû ÿìÿ÷ ÿìÿóÿöÿÿÿï+ÿìÿìÿìÿì  ÿÿ ÿì"2ÿî ÿìÿíÿùÿìÿìÿü0'ÿüÿìÿîÿùÿþÿí +ÿÿ&(ÿôA;ÿì)#ÿõÿù%#ÿíÿþÿìÿìÿú ÿùÿïÿìÿö+#ÿðÿúÿð.Dÿõ$ÿþÿîÿõÿóÿìÿì,ÿÿÿìÿí%ÿìÿü Cr<ÿìÿû3 ÿì-$ÿìÿìÿ÷ÿìÿý ÿüÿÿÿùÿìÿõÿìÿóÿüÿó4ÿìÿìÿûÿìÿìÿú,4ÿìÿð7ÿùÿñi‹q>fU$kz/PC$ÿô!E0ÿõÿóÿìÿìÿöÿìÿì<ÿìÿì ÿðÿì* ÿîÿìÿù1 ÿìÿìÿì ÿù?G—‚š–w–‰??6hC.+i] % ÿîÿìÿÿÿü4ÿïÿìÿñÿìÿìÿìÿìÿì)ÿõÿôÿýÿü.ÿìÿìÿìÿìÿì ÿúK?VTjtu=flgpŒ{T$WA@+_ ÿì%ÿìÿùÿÿÿöÿõÿìÿì +ÿôÿìÿìÿìÿìÿì#ÿõÿìÿîÿì ÿíÿÿ ÿì!Dx^D3.'/2<8VR+><P( ÿúÿûNÿìÿ÷+ÿìÿðÿõÿìÿøÿþÿïÿý! ÿõ ÿì ÿìÿìÿìÿìÿìÿìÿìÿìÿìÿòÿÿÿìV˜ˆ ÿú Se4ÿù$=/ 7!ÿìÿìÿòÿìÿì'ÿôÿý ÿìÿìÿõ(%3ÿýÿìÿùÿìÿüÿöÿì6 ÿìÿñ”Á‚2 ÿø+F35"#X+;ÿìÿûÿíÿì"ÿò2'ÿùÿìÿþÿìÿì1.ÿøÿì ÿîÿóÿñÿúÿîÿøÿöÿì)ÿìÿõÿìÿó/ ,|dRIÿòÿïÿõÿü"ÿôÿìÿìF7, )ÿý"ÿù4$ ÿì ÿîÿ÷ÿìÿìÿþÿûÿì ÿõÿì ÿìÿðÿì$ ÿìÿû $+?4( ÿìÿìÿõÿìÿìÿìÿìÿì 0 ÿô ÿîÿí ÿþ!ÿô ÿìÿû !ÿôÿìÿùÿìÿìÿÿÿì)ÿöÿþÿìÿìÿìÿõ ÿíÿî%NJwZ! !7 ÿñÿìÿìÿìÿìÿìÿìÿûÿì68ÿôÿì%5ÿüÿìÿñÿìÿìÿîÿûÿøÿìÿîÿìÿìLZ˜x(Bÿóÿìÿìÿìÿñÿð3ÿìÿü1D ÿìÿìÿ÷ÿñÿñÿõÿìÿïÿì,"ÿîÿòTB ÿìÿó&ÿì ÿùÿò ÿì ÿøÿö†„Z=7ÿûÿõÿìÿìÿîÿìÿì, ÿìÿìÿìÿìÿìÿüÿìÿì$ ÿìÿûÿþÿ÷ÿÿÿì0ÿíÿðÿøÿïÿìÿìÿüÿìÿôÿìÿìÿøPIÿìrk3$ÿñ ÿý ÿìÿìÿìÿìÿì ÿìÿøÿìÿíÿÿÿý4ÿìÿõÿöÿÿÿìÿì/ÿìÿìÿðÿìÿ÷ÿìÿ÷ÿìÿÿÿìÿìÿì >%F=ÿì"[‡T2ÿìÿìÿìÿúÿìÿì ÿñÿÿÿì/&ÿìÿìÿðÿìÿìÿï*3ÿøÿì"ÿìÿìÿû ÿþÿÿÿìÿûÿïÿöÿì<N; PŠzE3ÿöÿñÿìÿìÿö& $ÿìÿìÿìÿîÿìÿìÿòÿìÿìÿìÿù ÿìÿìÿíÿòÿûÿïÿìÿò4ÿìÿïÿìÿõ ÿì/ÿìÿìaI/,+1ÿì% ÿöÿñÿìÿì3ÿøÿõÿøÿöTÿÿÿòÿìÿìÿìÿì!9ÿõÿýÿòÿñÿñÿìÿýÿìÿòÿþÿì4ÿú(ÿìÿì+F-/-Nÿìÿìÿì(ÿìÿïÿì ÿþÿøÿìÿìÿü*ÿì *ÿïÿ÷ÿö ÿú!ÿïÿöÿòÿùÿøÿùÿì)ÿìÿìÿí'ÿìÿìÿñ J#@4 ÿö<ÿìÿöÿùÿìÿìÿìÿì ÿìÿìÿï2 ÿìÿì'Gÿïÿôÿìÿìÿòÿï*/ &ÿìÿùÿìÿì0ÿìÿìÿñÿìÿìÿò ÿûÿì (0=5:ÿú ÿìÿìÿìÿìÿì%ÿùÿù"ÿóÿóÿüÿìÿìÿì ' ÿìÿìÿì8ÿøÿøÿïÿìK&ÿÿAÿìÿì\1ÿÿÿú ÿôÿþ6;2hL7  ÿìÿìÿìÿîÿýÿíÿì ÿìÿì ÿöÿìÿúÿûW!ÿìÿì"ÿì ÿõ(ÿöÿìÿìÿ÷ ÿìÿì ÿÿ $ 0E7H+(;+ÿþ"ÿøÿûÿðÿöÿìÿìÿíÿìÿìÿîÿïÿ÷ÿìÿöÿüÿìÿþÿìÿðÿìÿö)ÿì"ÿüÿô" ÿòÿø% ÿôÿìÿìÿúÿïÿñÿìÿö!O#ÿý93ÿìÿì ÿöJÿïÿöÿìÿìÿìÿìÿý/\Pÿûÿüÿìÿñÿìÿõÿì ÿüÿÿÿì7#ÿ÷ÿì4'#/ÿú8 ÿìÿíÿóÿìÿì,ÿø.ÿìÿìÿü#ÿìÿìÿìÿì,ÿï7Lÿì(ÿü4ÿìÿýÿïÿüÿôÿùÿìÿì ÿìÿìÿöÿìÿì ÿòÿì ÿ÷A/ ÿòÿìÿìÿÿÿìRÿöÿìÿû ÿìÿòÿò ÿìÿìN ÿì,!ÿìÿø+ÿöÿþÿìÿìÿõ!;ÿì6,ÿìÿýÿüÿìÿìÿì$ÿìÿò<ÿþ +ÿóÿìÿü$'8Cÿûÿìÿûÿì ÿìÿìÿøkÿì ÿìÿìÿò ÿýÿìÿôÿÿÿ÷ÿìÿû+ÿô;ÿìBÿî2ÿùÿìÿìÿÿÿìÿìÿóÿôÿþ$ÿìÿìÿìÿó 0ÿòÿõÿõ3ÿúÿüÿøÿù1ÿ÷(ÿõÿøÿúÿìÿô/ÿüÿðÿõ /B ÿì % *ÿúÿù"ÿö=ÿýÿìÿîÿìÿì<ÿùÿìÿìÿìÿìÿìÿðÿìÿì$ÿìÿñÿìÿìÿòÿüÿôÿì#ÿüÿìÿþÿýÿìÿìÿì ÿìÿìÿû(/ ÿìÿøÿì" ÿ÷ÿìÿÿÿï/ ÿìI-ÿûÿôÿì*&ÿìÿýÿìÿìÿÿFÿìÿìÿïÿìÿìÿîÿì+ÿô!ÿÿÿìÿìÿó ÿìÿìÿô  ÿýÿìÿìÿìÿþÿÿ)ÿìÿð!ÿýÿþÿìÿô /ÿìÿìÿìÿìÿù ÿìÿìÿýÿìÿì+ÿì-ÿù ""%ÿóÿìÿìÿìÿìÿï ÿøÿû0?=ÿýÿôÿðÿìÿýÿõÿÿÿì#ÿþ ÿìÿì/ÿÿÿöÿ÷ÿòÿðÿúÿöÿïÿïÿì&#ÿìÿùÿö.ÿðÿìÿì1ÿýÿýÿúÿÿÿìÿøÿìÿñÿìÿìÿöÿì ÿìÿý& ÿôÿìÿìÿìÿõÿìÿü ÿìÿú'ÿìÿì ÿìÿùÿþÿûÿìÿì!+ÿõÿìÿòÿìÿñ 1ÿì"ÿñÿìÿñ. ÿ÷ÿûÿìÿìÿìÿôÿøÿì(ÿìÿìÿï#$ÿìÿì=+ÿìÿ÷ÿíÿì% ÿì6ÿñÿô ÿìÿìÿùÿï*ÿ÷ÿôÿì ÿÿ@ÿìÿìÿóÿìÿì! ÿìÿìÿûÿôÿþ!(ÿìÿì,ÿÿÿðÿúÿó5ÿìÿìÿìÿì! ÿüÿûÿìÿìÿöÿìÿìÿìÿìÿì 2 ÿùÿìÿìÿöÿðÿð)ÿô ÿðÿñ#,% ÿìÿì'ÿ÷ÿìÿìÿì ÿìÿìÿ÷ÿöÿîÿÿÿìÿïÿöÿÿ ÿìÿìÿýÿô ÿìÿíÿûÿì$ÿòÿþ$ÿìÿüÿìÿÿ)-ÿÿÿþ ÿìÿÿÿöÿüÿìÿì ÿìÿüÿñ&,ÿìÿìÿúÿíÿùÿú ÿìÿìEPÿïÿÿ"ÿìÿìÿì%ÿìÿôÿüÿìÿì .ÿóÿìÿû4 ÿÿÿùÿðÿìÿìÿðÿì ÿòKSÿìÿìÿìÿìÿñÿíÿûÿøÿ÷ ÿìÿíÿì ÿìÿì ÿùÿìÿøÿüÿìÿìÿîÿöÿíÿð7ÿì 7ÿ÷ ÿìÿìÿíÿìÿìÿìÿì *! "ÿÿ ÿöÿü +ÿö$ÿì2ÿìÿìÿì& ÿìÿòÿô$ÿì&ÿðÿìÿì ÿìÿýÿùÿï * ÿýÿìÿìÿì$#* ÿìÿìÿÿÿýÿì@ÿìÿìÿùÿì ÿíÿîÿûÿôÿìÿú ÿìÿì ÿìÿìÿìÿõ- ÿìÿüÿìÿî*ÿìÿóÿö ÿìÿì! ÿìÿúÿíÿò ÿþ'ÿì"ÿìÿù7ÿìÿìÿìÿì = ÿõÿìÿìÿû 'ÿüÿìÿì ÿìÿöÿó% ÿùÿ÷ÿì;ÿ÷ÿø2ÿìÿìÿõÿìÿú#ÿñ5ÿóÿìÿüÿìÿìÿõ 3ÿìÿìÿìÿþÿìÿìÿì ÿìÿì(ÿìÿì#ÿìÿò ÿÿ(ÿöÿùÿì,$ÿõÿìÿìÿðÿûÿìÿÿ</ÿîÿìÿìÿðÿü)O+ÿþ 'ÿýÿíÿìÿðÿïÿìÿìÿìÿò +ÿìÿóÿóÿüÿìÿìÿìÿðÿøÿþÿì ÿìÿì*# ÿûE*ÿ÷ÿò'ÿûÿìÿìÿôÿûÿïÿöÿóÿìÿì ÿìE3ÿìÿìÿýÿìÿì1ÿìÿì ÿì"ÿìÿì'1ÿñÿìÿìÿì'$ÿìÿóÿìÿý% ÿìÿìÿìÿìÿþÿû ÿìÿìÿì/ÿìÿìÿì ÿñ& ÿìÿþ+Oÿþÿìÿòÿìÿó(ÿÿÿòÿìÿìÿìÿîÿìÿì5ÿìÿöÿî #ÿðÿòÿîÿþ 'ÿìÿìÿðÿìÿì%ÿì#8Bÿòÿù (ÿìÿ÷ÿì#ÿûÿìÿ÷?$ÿøÿìÿûÿøÿîÿìÿìÿì-ÿìÿìÿ÷ÿìÿóÿìÿíÿý! ÿûÿì)(ÿìÿìÿî ÿÿÿìÿìÿì!ÿòÿìÿìÿì ,ÿø/ÿÿÿìÿÿ8 %!ÿ÷ÿýÿñÿóÿþÿì(ÿûÿìÿìÿøÿü&ÿÿÿõÿöÿìÿìÿþIÿìÿñÿîÿý,5ÿìÿî('ÿìÿì 3ÿìÿó1ÿ÷ÿö ÿüÿìÿì   ÿìÿõÿí! ÿì ÿ÷ÿìÿìÿìDÿìÿìÿìÿìÿîÿûÿþÿþÿìÿì !ÿìÿìÿïÿö ÿìÿîÿìÿìÿñ&ÿì ÿ÷ÿìÿù<ÿûÿðÿìÿîÿìÿîÿó ÿìÿì Q4ÿìÿìÿìÿìÿÿ   ÿì *ÿì ÿ÷ÿÿÿìÿì ' ÿñÿìÿî(ÿìÿì#&ÿìÿìÿù ÿò ÿòÿìÿìÿú$ÿì#ÿìÿ÷ÿÿ ÿì?7ÿìÿìÿìÿìÿõÿìÿþÿûÿý#ÿìÿíÿìÿòÿìÿìÿì#3ÿì!ÿìÿì( ÿìÿôÿõÿüÿÿÿíÿ÷ÿûÿìÿ÷% :#ÿìÿìÿìÿ÷ ÿþÿìÿì2 -ÿú)Pÿîÿìÿìÿìÿì;ÿìÿ÷ÿìÿû<ÿú ÿÿÿóÿöÿýÿõÿìÿìÿùÿ÷ÿìÿìÿì5.ÿùÿúÿìÿì$ÿøÿýÿìÿìÿìÿì% ÿìÿìÿìÿ÷ÿïÿìÿþÿûÿíÿì \ÿûÿìÿùÿì$ÿ÷ ÿù&ÿð ÿùÿìÿóÿùÿì1 ÿìÿìÿòÿöÿÿÿìÿìÿìÿìÿ÷ÿìÿìÿñ,Cÿïÿìÿðÿìÿìÿñÿûÿú#4ÿþ ÿìÿõÿ÷ÿûÿýÿì &ÿ÷ÿìÿîÿü ÿþ/ÿìÿì3ÿìÿìÿìÿìÿïÿìÿìÿñ. ÿìÿûÿì*ÿ÷ÿìÿìÿóÿóÿîÿø 5ÿìÿìÿìÿìÿóÿìÿï+ÿù ÿìÿó ÿìÿóÿìÿôÿùÿìÿù 5ÿþÿìÿñÿìÿìÿïÿìÿìÿìÿüÿ÷4ÿìÿìÿìÿìÿöÿìÿòÿöÿó ÿþÿþÿìÿìÿì ÿìÿûÿóÿóÿûÿìÿìÿìÿ÷ÿõ"ÿöÿìÿìÿý ÿìÿìÿð#ÿìÿú\ÿìÿú$ÿìÿý(ÿîÿõ ÿóÿùÿõÿìÿíÿì.0:ÿìÿüÿìÿùÿ÷ÿïÿñÿìÿþ"ÿìÿÿÿûÿì ÿý ÿîÿì ÿüÿìÿúÿò ÿì!ÿìÿìÿýÿû!ÿìÿïÿùÿìÿìÿìÿìÿìÿìÿùÿû(ÿý "ÿìÿù . )*?ÿìÿìÿìÿì ÿôÿìÿûÿìÿÿÿìÿìÿìÿìÿð^8 ÿûÿìÿìÿìÿì!ÿô )ÿìÿì#!ÿö ,ÿþÿìÿùÿô0ÿì#]ÿìÿïÿöÿìÿì>ÿì'ÿìÿõÿþ% 6( ÿìÿòÿìÿìÿìÿü+ÿìÿìÿìÿ÷- ÿì+ÿìÿìÿìÿïÿìÿìÿóÿìÿüÿñÿì ÿìÿìÿìBÿûÿð ÿìÿòÿíÿìÿñÿì ÿìÿìÿðÿìÿìÿìÿü , ÿìÿöÿìÿìÿþÿû ÿûÿìÿïÿÿ ÿ÷*ÿ÷ÿò'ÿ÷ÿìÿìÿùÿìÿòÿìÿìÿì+. ÿþÿìÿìÿìÿìÿüD.ÿì7ÿþÿýÿìÿìÿìÿìÿô"? ÿìÿìÿìÿìÿìÿðÿìÿìÿ÷ /Oÿòÿìÿíÿó40=ÿðÿôÿíÿø/54 ÿìÿìÿìÿìÿíÿì ÿúÿìÿìÿðÿúÿìÿìÿû-ÿï -ÿÿÿìÿí ÿûÿõB ÿìÿõÿìÿìÿì6%ÿö6,*+'ÿ÷ÿìÿúÿùÿþÿìÿÿÿþHÿôÿÿÿ÷ÿìÿôÿìÿìÿìÿìÿìÿüÿìÿìÿý' ÿìÿò&#+#;0ÿþB5  ÿÿ ÿîÿìÿò"ÿì ÿìÿï ÿí*)ÿü ÿìÿìÿìÿì)ÿòÿîÿýÿï ÿî^GpVE#8a7ÿþAÿøÿì,, "ÿõÿìÿìÿøÿîÿúÿìÿö*ÿøÿñ ÿÿ7ÿìÿþÿìÿýÿþÿì)ÿüÿì&7SWb“Œ\2\Q!ÿì! ÿìÿìÿûÿõÿðÿø  ÿìÿô ÿðÿìÿìÿìÿìÿúÿôÿÿÿìÿì-ÿù&ÿîB%"mˆ¡nhN€}.6hY;-&ÿìÿòÿúÿìÿìÿöÿþÿïÿìÿìÿóÿìÿý*$ÿúÿì ÿòÿìÿïÿøÿìÿìÿñÿì ÿûÿý'7?gck}ᢎlDEk<5N^ÿþ#ÿõÿú(ÿðÿíÿþÿòÿüÿìÿõ ÿïÿìÿìÿìÿìÿìÿüÿþ"ÿì ÿôÿöÿìÿìÿìÿï ÿìWHVO)*G5PCA:ZC?!:%?ÿÿÿìDÿüÿìÿüÿì ÿìÿì"-ÿìÿìÿìÿìÿìÿîÿì) ÿòÿöÿý ÿñ _pG42 54ÿÿ- ÿìÿìÿìÿî5ÿ÷ÿûÿõÿìÿõÿûÿòÿìÿì/- ÿïÿìÿùÿìÿìÿìÿìÿìÿöÿñÿÿÿïÿøÿì+s±vÿû+@-ÿöÿòÿòÿóÿþ!ÿñÿù ÿìÿìÿìÿì7ÿ÷ÿþÿÿ ÿõÿìÿì'ÿôÿìÿÿÿø ÿôÿìÿìÿö3ÿþÿìn«\/ ÿì =ÿüÿû ÿìÿì!P!A,ÿìÿúÿôÿìÿüÿ÷ÿû ÿòÿñÿûÿìÿýÿñÿïÿîÿíÿìÿì ÿì%ÿðÿýÿì3*(lz;PLÿöÿíÿû ÿ÷,ÿì ?(ÿ÷ÿïÿþ+ ÿñÿìÿöÿîÿïÿöÿúÿÿ " #ÿöÿìÿìÿìÿôÿõÿìÿò%^q_)ÿ÷ ÿþ  ÿúÿìÿìÿöÿíÿìÿìÿüÿïÿìÿþÿú $ ÿù ÿìÿìÿþÿìÿì"ÿ÷ÿñÿìÿòÿïÿü ÿòÿðP}|<ÿú (*ÿìÿð)ÿìÿìÿìÿó %ÿö ÿìÿìÿî *(ÿø ÿì( ÿìÿì ÿø ÿ÷ÿõ$ ÿöÿì ÿìÿìDckn@. ÿìÿìÿûÿøÿì&#ÿìÿÿÿù"ÿôÿôÿìÿöÿüÿôÿì ÿìÿó?2ÿûÿìÿúÿüÿì(ÿð ÿíÿð 5xo ÿø!$ÿóÿí ÿìÿìÿÿÿÿÿìÿì;ÿìÿìÿìÿý,ÿìÿì>Iÿìÿõ  ÿì ÿþÿ÷ÿìÿìÿìÿì'ÿìÿìÿøT?'ÿû.x\ÿì ÿïÿì&ÿìÿìÿïÿìÿìÿôÿ÷ÿûHÿûÿìÿö!ÿðÿû ÿìÿì Uÿìÿìÿðÿóÿÿÿìÿïÿìÿøÿó%%ÿóÿìÿì2HISAl\3ÿûÿúÿóÿñÿøÿìÿóÿìÿìÿìÿñÿì" ÿ÷ ÿìÿìÿìÿìÿìÿùF) ÿïÿð ÿìÿìÿìÿìÿøÿìÿû ÿý$Q}H.HPD.' ÿíÿìÿìÿø*5 +ÿìÿìÿóÿíÿìÿìÿìÿìÿ÷ÿõÿú&ÿìÿìÿì 5(ÿìÿìÿ÷ÿìÿì/2 ÿìÿúÿìÿòÿüÿî/ÿù(SO9#ÿúÿìÿì ÿìÿìÿþÿùÿÿ5ÿüÿúÿìÿî7 ÿÿ<ÿþÿìÿìÿì 8 ÿìÿìÿûÿíÿìÿïÿü ÿû ÿìÿï!ÿìÿìÿìae78''ÿìÿðÿíÿðÿìÿìÿïÿì ÿ÷ÿìÿìÿî ÿìÿù$ÿøÿìÿîÿìÿÿ (ÿìÿìÿìÿíÿý ÿõÿõ0ÿöÿøÿüÿìÿìÿû 68sB,8&ÿòÿþÿÿ+ /ÿìÿõ ÿøÿþÿìÿóÿýÿùÿíÿíÿì/ ÿìÿò;ÿ÷ÿìÿìÿíÿîÿùÿî&ÿõÿíÿòÿìÿìÿñÿìÿýÿìÿìÿÿ(!?2?"! -ÿìÿúÿûÿíÿìÿìÿìÿûÿöÿìÿìÿìÿþ ÿìÿìÿùÿìHÿû ÿìÿì+ ÿ÷7 ÿìÿìG3ÿ÷ÿìÿï)CGfY2 8ÿýÿõÿþÿìÿìÿýÿóÿÿ ÿìÿûÿìÿûÿïÿì Aÿû!ÿôÿû(ÿì ÿîÿÿÿû ÿñÿìÿìÿìÿì %,$GMC ÿÿÿþÿøÿý3+ÿõÿìÿíÿìÿðÿðÿìÿìÿñÿùÿìÿìÿûÿìÿì ÿìÿìÿìÿìÿô7ÿì#ÿïÿú ÿùÿóÿóÿìÿõÿùÿì!1G ÿõ),ÿìÿìÿþÿô#:ÿí)ÿìÿìÿÿÿìÿþÿõÿì(VRÿï'ÿìÿìÿùÿìÿìÿìÿìÿôÿõÿîÿýÿðÿù%2ÿìÿì!ÿüÿÿÿýÿñÿì ÿìÿìÿù ÿìÿì4%ÿìÿì%ÿøÿö ÿìÿìÿìÿìÿíÿì>3ÿì. ÿþ9ÿíÿÿÿöÿÿÿìÿÿÿìÿìÿì ÿìÿìÿîÿýÿìÿìÿûÿûÿì ÿú2ÿìÿìÿìÿìnÿìÿôÿóÿðÿöÿóÿìÿò# &ÿóDÿôÿì!+ÿÿ ÿýÿìÿù ÿïÿìÿìÿìÿìÿìÿì1'ÿìÿìÿìÿìÿìÿî ÿìÿì ,ÿóÿì(ÿìÿÿ ÿìÿì% ÿôÿíÿìÿòÿìÿúÿìÿìÿìÿìNÿüÿì ÿìÿìÿøÿöÿìÿõÿìÿÿÿìÿìÿö.<ÿï4ÿì9ÿö7 ÿíÿìÿì ÿÿÿïÿìÿôÿìÿìÿôÿìÿìÿóÿïÿìÿñÿìÿì/ÿöÿÿ+6ÿÿÿþ ÿìÿìÿì9"ÿúÿü0)ÿìÿìÿúÿñ7ÿìÿì ÿùÿì5ÿùÿìÿìÿìÿìÿìÿìÿìÿì$ÿìÿôÿíÿìÿìÿúÿìÿìÿì#ÿôÿîÿìÿìÿûÿ÷ÿìÿÿ%:ÿìÿô ! 'ÿþÿì!ÿùÿì9ÿýÿìS2 ÿó4ÿì8ÿìÿó @"ÿýÿìÿñÿì"ÿü,ÿìÿìÿþÿìÿìÿñ$ÿóÿûÿó/ÿìÿôÿìÿí'ÿøÿìÿö ""1ÿÿÿïÿùÿòÿýÿìÿõÿìÿþÿìÿðÿìÿì-ÿìÿð ÿôÿìÿì#ÿì#0 ÿóÿÿ/# ÿîÿìÿìÿú Dÿìÿþÿìÿùÿöÿúÿì!"ÿþÿì ÿøÿñÿìÿñÿìÿù"  4ÿñ#ÿìÿÿÿû"ÿòÿìÿìÿõ5ÿñÿôÿìÿìÿìÿøÿûÿìÿðÿñÿì  ÿìÿî1ÿø ÿìÿ÷ÿì ÿñÿìÿìÿíÿì21ÿìÿìÿìÿìÿîÿôÿøÿóÿìÿìÿì)ÿúÿòÿìÿìÿìÿûÿò ?ÿìÿìÿìÿìÿíÿúÿìÿîÿìÿìÿ÷ÿìÿÿÿüÿìÿø/)ÿìÿì:ÿþ8ÿïÿì+ÿìÿì#1ÿùÿì >ÿõÿìÿùÿñÿìÿìÿ÷%ÿÿÿìÿþÿöÿõÿìÿñÿÿBÿìÿìÿìÿðÿìÿíÿþÿÿÿõÿô+ÿìÿì ÿ÷ÿìÿì ÿì+0ÿìÿìÿì  ÿþÿìÿìÿþÿìÿìÿìÿìÿì%=ÿìÿìÿí ÿü!ÿùÿì+ÿþ*ÿð ÿìÿì)!ÿìÿð&0ÿùÿìÿìÿì#/ÿìÿûÿöÿîÿîÿðÿøÿò .ÿìÿñ ÿñÿþÿìÿÿ ÿöÿó<6ÿñÿ÷ ÿõÿì 4'ÿüÿìÿìÿûÿúÿìÿóÿÿ8Gÿìÿìÿû ÿíÿùÿù ÿïÿìÿ÷AHÿö$ÿÿÿìÿìÿñÿïÿíÿìÿìEÿüÿì ÿôÿï ÿñÿùÿðÿüÿùÿôÿü:ÿù%>ÿìÿìÿüÿìÿöÿþÿøÿö ,  ÿìÿõÿìÿôÿóÿö  ÿì ÿûÿíÿÿÿúÿìWÿìLÿìÿø ÿïÿìÿìÿ÷ÿìÿìÿøÿìÿìÿò- ÿýPÿíÿð ÿùÿìÿìÿïÿìÿúÿõÿì 2ÿìÿíÿõÿì ÿüÿìÿìÿñÿýÿì ÿôÿõÿìÿìÿì%'ÿìÿìÿïÿï0ÿìÿì!ÿúÿìÿìÿ÷:ÿ÷ÿíÿìÿòÿì ÿìÿóÿù!ÿ÷ÿì ÿùÿû(ÿíÿìÿìÿòÿìÿøÿ÷ÿìÿì#ÿìÿìÿþÿòÿì#3ÿî ÿìÿû9*) ÿôÿìÿì0ÿìÿìÿì ÿîÿìÿì ÿìÿíÿøÿüÿïÿì:ÿòÿòÿù)%ÿóÿðÿìÿôÿòÿì ÿìÿìÿúÿìÿìÿø$ÿùÿî"ÿìÿìÿÿÿìÿìÿìÿòÿü ÿìÿìÿø ÿÿÿì#ÿþÿ÷ ÿõ$ÿò1*ÿóÿìÿýÿ÷ÿìÿìÿðÿó 1Dÿÿÿíÿìÿìÿñÿì%Bÿóÿìÿìÿôÿüÿìÿöÿìÿì 9 ÿìÿþÿðÿìÿìÿìÿìÿïÿìÿ÷ÿìÿû#ÿõÿìÿö.2ÿû "ÿìÿìÿì ÿì$#ÿñÿìÿìÿìÿì&ÿìL "ÿìÿîÿì0'ÿìÿì+ÿ÷ÿìÿþÿì8ÿ÷ÿüÿÿÿìÿìÿìÿÿÿüÿìÿú/2ÿöÿõÿî$ÿý/ ÿìÿìÿìÿúÿüÿì 2ÿìÿìÿì%ÿìÿõÿìÿ÷ÿìÿø'1ÿöÿðÿóÿìÿõ ÿüÿìÿìÿðÿìÿìÿðÿðÿü!ÿìÿôÿð1ÿñÿüÿòÿöÿþ@ÿìÿòÿìÿô"ÿì. ÿõÿìÿñ2 ÿìÿìÿì2ÿìÿ÷ 3ÿìÿú ÿñÿøÿìÿìÿì$ÿýÿöÿñ ÿïÿõÿì ÿîÿõ ÿìÿÿÿþÿìÿý ÿïÿìÿìÿìÿìÿìÿíÿìÿì ÿ÷ÿìÿìÿì <ÿþ)ÿìÿìÿì&0($ÿìÿì ;  ÿì($ #ÿïÿìÿì/ ÿìÿì2ÿúÿôÿõ#, ÿìÿõÿì%ÿìÿì(ÿìÿì1ÿñ"ÿõ( ÿÿÿìÿüÿùÿðÿÿÿ÷ÿìÿìÿî)ÿÿÿô)" ÿðÿìÿìÿóÿùÿì!;ÿïÿìÿìÿÿ ÿìÿìÿö%ÿýÿùÿüÿöÿìÿìÿÿÿìÿìÿìÿìÿì ÿø ÿìÿñÿò ;ÿìÿìÿìÿìÿÿÿìÿîÿïP)ÿöÿìÿìÿðÿì ÿúÿìÿî% 5 ÿÿÿîÿìÿìÿþÿþ ÿìÿõ ÿì$ÿìÿôÿñÿûÿìÿý ÿìÿì ÿìÿñ  ÿñÿõÿìÿìÿý!ÿúÿÿÿñ(" ÿý!*0ÿìÿìÿìÿìÿû ÿý/ÿüÿìÿìÿõÿþÿöÿìÿìÿì2#ÿìÿò%0$ÿúÿìÿìÿúÿöÿöÿìÿó9ÿìÿîÿì,ÿìÿì6-!-ÿìÿìÿìÿìÿìB+ÿì ÿõÿî,ÿîÿú ÿþÿùÿñÿìÿûÿìÿÿÿì ÿÿÿïÿìÿöÿþ8Iÿþÿìÿøÿïÿìÿìÿìÿìÿì# ÿôÿìÿìÿîÿìÿìÿ÷ ÿöÿïÿìCÿý$&ÿì!ÿûÿì'ÿþÿ÷ÿýÿì :ÿù<ÿìÿìÿì ÿóÿìÿì" ÿìÿìÿíÿìÿì#*ÿð6ÿýÿìÿü0ÿìÿì ÿí 6(.ÿüÿðÿìÿìÿì>ÿùÿìÿìÿúÿÿ ÿú ÿô*ÿì:!ÿ÷ÿìÿìÿï% ÿìÿïÿìÿìÿì ÿìÿúÿìÿÿ&ÿì*Lÿþÿìÿøÿìÿìÿüÿÿÿìÿìÿý8ÿïÿìÿìÿöÿì ÿìÿìÿõÿìÿìÿìÿð6ÿìÿì $ ÿóÿìÿûÿûÿòÿìÿô ÿìÿìÿîÿðÿû9ÿìÿóÿì<ÿìÿûÿì#ÿÿÿðÿìÿì,0ÿìÿþÿì#ÿìÿìÿóÿõÿîÿöÿôÿñ ÿñÿøÿñÿóÿì ÿìÿíÿõ ÿí+Lÿì ÿíÿìÿìÿì 8 ÿìÿòÿù ÿìÿ÷ÿû(9ÿìÿú+*ÿîÿ÷ÿðÿìÿúÿüÿíÿøÿìÿì  ÿìÿìÿÿÿøÿìÿìÿìÿïÿÿÿì ÿìÿìÿìÿþÿðÿìÿìÿñÿö0ÿ÷ÿÿÿìÿì ÿüÿ÷ÿòÿþÿì%ÿñ3@ÿìÿì ÿø'ÿìÿìÿøÿìÿìÿûÿòÿðÿðN'"ÿøÿìÿìÿð# ÿìÿìÿúÿûÿòÿïÿøÿøÿýÿûÿî 1ÿìIÿìÿìÿý<ÿìÿòÿýÿì ÿú)+' ÿìÿðÿøÿìÿìÿìÿùÿüÿì& ÿðÿìÿìÿìÿýÿôÿþÿûÿìÿìÿóÿ÷ÿðÿìÿïÿðÿìÿìÿì( ÿìÿì6ÿóÿì"ÿìÿü&ÿïÿìÿìÿì"ÿñÿìÿìÿìÿì#%ÿìÿìÿôÿì!ÿüÿìÿû ÿìÿõÿòÿì$)ÿìÿì ÿü%7ÿì0-ÿìÿõÿïÿìÿìÿìÿìÿý%ÿòÿÿÿúÿôÿúÿøÿðÿì ÿìÿì!@ÿôÿìÿ÷ÿìÿìÿó ÿõÿìÿìÿö+=ÿìÿìÿî* C4T!* ÿõÿúÿìÿì#ÿìÿõ ÿïÿð''ÿóÿì ÿìÿìÿì3ÿì(ÿìÿìÿì ÿùÿìE)$ÿúÿû 8/DF1-E*#?<ÿöÿìÿóÿþ3ÿñ ÿþÿìÿÿÿñÿì ÿìÿñÿñÿïÿûÿìÿõÿìÿùÿñÿý ÿìÿùÿì*$EOmB:N@S5RG&"6 ÿìÿì#ÿìÿÿÿìÿì" ÿðÿôÿìÿ÷ÿìÿìÿÿ ÿí"ÿùÿð#0;•“¹]=3]*ÿì Iÿýÿìÿì..ÿìÿñÿìÿíÿìÿþ ÿìÿû%ÿ÷ 9"ÿìÿó ÿì ÿì#ÿö%0Y°ke”n„}Z*>Y1ÿì ÿìÿìÿïÿùÿìÿøÿì!ÿìÿüÿöÿìÿòÿìÿì ÿþÿô & ÿóÿìÿî$'#,# Yƒ|¹‰xbNNR& ><ÿý$ÿóÿõÿôÿùÿïÿþÿìÿìÿóÿìÿúÿîÿùÿìÿýÿìÿì ÿôÿìÿüÿïÿíÿï ÿìÿìÿìÿþÿö ,Z^svEN¨e$=''&ÿñÿìÿúÿíÿíÿù)ÿýÿúÿñÿï ÿþÿìÿõÿîÿôÿìÿì0ÿìÿöÿüÿðÿìÿüÿìÿìÿìÿø=„R5> )2ÿìÿì!&ÿìÿì":ÿÿÿî +*ÿì ÿìÿì1*ÿõÿùÿìÿìÿñÿöÿìÿì)ÿìÿìÿòÿÿ:‚y, ÿó&ÿþÿîÿìÿóÿîÿìÿìÿì"ÿìÿóÿìÿìÿþÿìÿì3?ÿúÿìÿí7 ÿìÿìÿùÿìÿìÿñÿõ$#ÿþÿû a˜–v+ -5ÿñÿøÿüÿðÿìÿðÿì % ÿìÿöÿìÿìÿìÿì Dÿ÷ÿìÿùÿÿÿìÿì5ÿøÿìÿÿÿìÿõÿÿÿìÿìÿì0 OÂ(; ÿûÿîÿìÿìÿìÿøÿì2T_ÿõÿìÿíÿ÷+ÿìÿí,ÿùÿìÿÿÿûÿøÿìÿìÿìÿîÿñÿôÿì ÿ÷ÿð.U‹ÇŠ(>4ÿüÿìÿìÿì/ ÿùÿóÿù 5, ÿù ÿúÿìÿìÿìÿñÿûÿùÿü4 ÿìÿðÿò ÿí ÿòÿìrȹp8ÿûÿì ) ÿüÿðÿíÿìÿúÿìÿìÿïÿìÿì $ ÿìÿü ÿûÿö=ÿìÿìÿìÿùÿñÿôÿìÿø~Äd2 ÿíÿû!ÿìÿý/ ÿüÿìÿìÿþÿûÿñ ÿüÿìÿìÿùÿìÿìÿì ÿù ÿòÿìÿûÿìÿô ÿõÿôÿö )QW$'ÿìÿìÿùÿûÿì ÿîÿìÿø%ÿìÿðÿìÿì ÿìÿìÿõÿì &ÿìÿù,ÿìÿìÿñÿíÿôÿÿÿù ÿð%;2.7.Bÿìÿ÷ÿý<ÿìÿìÿìÿìÿüÿóÿìÿíÿìÿìÿô8ÿìÿì9Q'ÿìÿìÿì  ÿìÿìÿì ÿìÿìÿìÿïÿìÿì ÿìJP9V8ÿì ÿìÿø"$(2ÿðÿìÿúÿýÿúÿìÿìÿìÿðÿì)ÿìÿì ÿìÿõÿüÿñÿìÿïÿÿ<ÿìÿìÿ÷ ÿþÿ÷ÿìÿù)+ÿìÿìÿô HdP 6sEÿöÿùÿñÿìÿìÿóÿùÿúÿîÿìÿøÿìÿòÿì! ÿìÿþÿìÿíÿìÿìÿîÿÿ7#ÿýÿóÿìÿìÿþÿñÿøÿÿÿì "DUg 6 ÿò ÿìÿìÿò !+ÿýÿ÷ÿìÿ÷ÿîÿìÿìÿï3ÿùÿì: ÿìÿìÿø'ÿïÿý-) 6ÿûÿúÿíÿìÿüÿñ.;?DC"ÿìÿíÿìÿì&(ÿìÿìÿ÷ÿíÿô3ÿõÿìÿìÿýÿþ ÿì ÿòÿóÿúBÿúÿìÿì0+ ÿñÿíÿòÿìÿìÿôÿò ÿìÿì #ÿþDju "ÿûÿìÿíÿìÿþÿïÿòÿòÿìÿö ÿì ÿì$ÿìÿìÿìÿìÿûÿ÷'ÿìÿìÿìÿïÿî ÿìÿõ%ÿïÿö"ÿÿÿí"6QtN $ ÿð ÿû.!ÿ÷ÿìÿõ* ÿðÿîÿðÿýÿô ÿìÿöÿìÿýÿý@ÿüÿóÿìÿðÿìÿìÿõÿìÿúÿûÿûÿíÿðÿòÿò ÿüÿì,%'F"$8 ÿô ÿñÿìÿì !ÿìÿìÿìÿì  ÿìÿìÿüÿñ$&ÿìÿøÿì" ÿìÿì&ÿúÿîÿôP//-T)ÿìDÿûÿìÿöÿìÿì ÿûÿì;ÿúÿðÿìÿìÿ÷ÿø9ÿö ÿöÿû ÿñ ÿíÿìÿìÿìÿùÿìÿþ ÿì"3*809ÿìÿìÿøÿü&<ÿÿÿöÿùÿìÿìÿìÿìÿìÿìÿìÿìÿìÿðÿï ÿìÿþÿì ÿìÿÿ"ÿõ ÿì ,ÿïÿüÿòÿìÿìÿìÿóÿø 6Mÿýÿþÿø ÿïÿþÿû(ÿø ÿýÿì#ÿýÿöÿìÿ÷ÿýÿùÿìÿõ#F;ÿì 0ÿöÿìÿðÿíÿûÿìÿìÿñÿöÿ÷ÿñÿîA ÿì%ÿïÿúÿò ÿì ÿñÿì ÿìÿôÿì ÿìÿì ÿìÿìÿþ ÿüÿìÿÿ ÿìÿò ÿù1*ÿì,ÿô."ÿôÿò(ÿöÿìÿñ ÿì ÿìÿôÿìÿìÿù ÿìÿõÿÿÿóÿÿÿò : ÿôÿìÿìÿìBÿìÿý!ÿùÿù ÿñÿþ ÿìÿìÿ÷ 7ÿî5ÿìÿó ÿúÿùÿìÿü ÿóÿòÿìÿìÿì7ÿìÿìÿí1 ÿìÿöÿûÿíÿùÿûÿñÿìÿñÿòÿÿÿôÿì ÿíÿì "ÿöÿõÿñÿñÿ÷ÿõÿõÿìÿìÿñÿìÿüÿì.ÿñÿìÿìÿìÿìÿìÿûÿüÿ÷ÿìÿìÿþLc1ÿñÿìÿõÿÿ(- ÿîÿìÿìÿ÷ÿõ ÿ÷ÿòÿì ÿìÿìÿö<#ÿî +ÿûÿìÿüÿùÿí! ÿìÿþÿÿ ÿñÿìÿì>' ÿýÿð &ÿì& $ÿýÿìÿô Oÿìÿìÿìÿìÿïÿì(ÿóÿìÿìÿìÿìÿðÿìÿì'ÿùÿ÷ÿìÿî ÿìÿðÿìÿì.ÿòÿìÿìÿðÿþÿì ÿõÿìÿìÿì"&ÿì ÿï -ÿøÿýÿìÿô ÿýÿõÿÿÿìÿìH9!ÿôÿô:ÿì7 ÿìÿìÿüÿì ÿì ÿùBÿìÿì"ÿìÿìÿý&ÿì 6ÿìÿìÿìÿì%ÿìÿò&ÿî$/= ÿíÿìÿøÿøÿöÿìÿìÿìÿì ÿù$ÿùÿîÿø3ÿìÿì #ÿý%%ÿí%  ÿìÿìÿì*ÿûH ÿúÿìÿï7ÿþÿ÷ÿì  ÿû ÿìÿÿÿìÿì ÿóÿö"U)ÿôÿ÷ÿìÿîÿîÿþÿìÿì2ÿð ÿì ÿöÿûÿÿ$ÿ÷ÿìÿìÿþ+&ÿú ÿìÿÿÿìÿìÿìÿìÿìJ%ÿìÿìÿô ÿìÿìÿúÿìÿìÿìÿðÿò  ÿîÿìÿðÿøÿìÿúÿì +ÿìÿìÿì%ÿìÿì' ÿìÿìÿõÿúÿì ÿìIÿìÿì +ÿý ÿìÿû5ÿíÿûÿôÿí'ÿìÿíÿìÿìÿíÿîÿó!ÿóÿì "ÿìÿì ÿìÿìÿìÿñÿìÿìÿì ÿðÿìÿìÿìÿì#ÿùÿìÿìÿì9ÿìÿìÿìÿìÿì ÿóÿò ÿóÿìÿð ÿïÿìÿ÷ÿüÿìÿì8ÿøÿí%ÿü:ÿøÿìÿì ÿìÿñ-ÿìÿíÿìÿì'Jÿìÿþÿôÿìÿìÿìÿó ÿôM$ÿ÷ÿì ÿý!ÿñÿþ $Cÿüÿüÿþÿýÿì ÿì(ÿÿI ÿü ÿûÿùÿìÿìÿýAÿìÿìÿø ÿìÿìÿñ ÿìÿò*ÿìÿìÿìÿìÿîÿÿÿìÿì 3ÿüÿìÿì %ÿûÿìÿòÿìÿì !ÿìÿòÿì+ÿìÿìÿï*-ÿìÿõ ÿüÿíÿí> ÿìÿìÿöÿìÿô  ÿúÿìÿüÿ÷ÿó ÿùÿòÿìÿìFÿì? ÿì ÿñÿìÿðÿîÿìÿûÿìÿìÿûÿò& ÿôÿø- Sÿõÿì ÿïÿñÿ÷ÿì ÿìÿÿÿìÿì)ÿíÿìÿôÿõÿîÿìÿì!ÿüÿìÿìÿùÿìÿüÿìÿîÿìÿì ÿìÿíÿìÿöÿìÿìÿì$6ÿìÿìÿì Qÿüÿì ÿöÿïÿìÿüÿÿÿýÿô ÿô ÿìÿúÿþÿþÿìÿìÿìÿôÿì!  /ÿìÿìÿìÿì+ÿþ ÿ÷ÿìÿú<" *ÿìÿôÿì:ÿþ7ÿìÿìÿõÿõÿìÿìÿìÿìÿ÷ÿìÿÿÿøE ÿìÿô ÿìÿìÿìÿïÿò+ÿÿ ÿÿ ÿìÿìÿóÿìÿìÿÿ ÿòÿöÿø/ÿìÿìÿýÿìÿìÿìÿìÿ÷ÿ÷ÿìÿìÿìÿøÿìÿÿÿüÿìÿùÿò0ÿýÿìÿø ÿìÿìÿì# :5ÿïÿìÿûÿìÿýÿýÿì,B ÿöÿûÿúÿì ÿìÿìÿìÿìÿúÿü0ÿïÿùÿìÿìÿìÿìÿìÿìÿì ÿìÿôÿú-ÿÿÿù ÿìÿìÿì  ÿìÿìÿîÿìÿø5 ÿì%4ÿóÿìÿïÿúÿìÿû8"ÿìGÿÿÿþÿîÿûÿìÿþ ÿöB=ÿìÿìÿï ÿÿÿü ÿìÿì?ÿú ÿíÿóÿìÿñÿìÿìÿûÿìÿì0# ÿìÿìÿýÿö6 ÿìÿìÿìÿóÿöÿìÿú *ÿìÿìÿùÿïÿìÿöÿý ÿìÿñ ÿìÿóÿðÿìÿìÿïÿñÿðÿíÿìÿìÿýÿìÿý+A$ÿúÿìÿìÿìC+ÿøÿ÷ÿìÿôÿý%ÿìÿþ ÿòÿìÿìÿì' ÿìÿìÿì/ÿìÿø" ,ÿð ÿìÿùÿôÿõÿÿÿòÿìÿì ÿûÿíÿøÿïÿìÿÿÿìÿ÷ ÿì ÿìÿìÿìÿì$ÿðÿìÿñÿìÿìÿìAÿõÿìÿìÿì/ÿìÿìÿìÿòÿø%(/ ÿ÷'ÿìÿìÿ÷ÿùÿúA ÿÿÿìÿì *ÿñÿìÿú (+ÿì(8ÿ÷ÿ÷ ÿîÿìÿìÿì#0ÿìÿì++ÿìÿìÿñÿì ÿò*7ÿþÿìÿþÿìÿìÿï &ÿôÿìÿìÿìÿìÿóÿó%ÿñÿùÿìÿóÿì$.ÿìÿîÿñ$ $ÿùÿìÿúÿÿ ÿðÿìÿì ÿÿÿõÿôÿìÿìÿìÿìÿì ÿìÿìÿôÿù!ÿìÿìÿûÿÿÿì(ÿþÿñÿìÿìÿìÿþÿì0,ÿìÿìÿîÿùÿû:ÿìÿì$,Jÿÿÿìÿìÿìÿìÿìÿï;ÿïÿþÿì5 ÿø ÿìÿìÿòÿìÿìÿìÿúÿìÿî ÿìÿìÿìÿì ÿìÿðÿûÿü)ÿìÿìÿìÿö!ÿüÿìÿìÿìÿüÿìÿøÿìÿñ #ÿó # ÿýÿìÿìÿìÿõ&*(ÿøÿìÿìÿý:ÿîÿü  ÿÿÿìÿìÿðÿì)ÿìÿô,ÿìÿôÿô ÿìÿþ ÿì ÿìÿìÿü(Lÿøÿôÿð1ÿìÿìÿìÿìÿìÿìÿýÿöÿìÿìÿôÿóÿìÿìÿðÿìÿì#ÿì(Cÿìÿì ÿìÿñÿìÿ÷C%ÿìÿôÿï ÿúÿÿ!ÿôÿì Nÿøÿìÿìÿìÿùÿìÿì,ÿ÷ ÿìÿñÿìÿìEÿì&ÿì $ÿìÿì,ÿì#! 'ÿþ&ÿûÿìÿìÿì Cÿðÿìÿïÿòÿì" ÿìÿ÷ ÿìÿýF!ÿìÿìÿï ÿìÿïÿìÿìÿìÿûÿìÿì ÿú<@ÿìÿóÿìÿìÿìÿîÿì+ÿ÷ÿìÿìÿ÷ÿö ÿìÿíÿ÷ÿ÷(ÿÿÿìÿìÿùÿñÿìÿö(ÿìÿì ÿìÿìÿì ÿôÿîÿîÿìÿìÿúÿì.ÿöÿñÿìÿì 'ÿì#& ÿì( ÿìÿõÿó@3ÿöÿì8ÿüÿìÿìÿÿ (ÿìÿÿ  ÿìÿìÿóÿìÿõ ÿòÿñ,0ÿì  ÿüÿìÿú 3ÿýÿìÿìÿø":ÿìÿ÷K ÿÿÿöÿì ÿûÿôÿýÿìÿìÿì 0(&ÿúÿìÿñÿ÷ÿîÿìÿóÿúÿìÿìÿþÿìÿìÿì"ÿìÿìÿöÿìÿìÿüÿø+ÿüÿìÿì%9/*% )ÿïVSÿìÿì 4ÿìÿìÿÿÿìÿùÿìÿìÿþÿòÿì?$ÿøÿøÿóÿ÷ÿùÿýÿüÿìÿòÿìÿìÿì ÿþÿïÿíÿì6*"ÿï.ÿøÿø;ÿìÿóÿìÿû  6 + ÿìÿìÿýÿýÿìÿÿÿìÿñÿüÿìÿûÿöÿìÿïÿìÿüÿþÿìÿìÿìÿìÿ÷ÿìÿíÿìÿìÿìÿý!%"ÿìÿìÿóÿíÿì=!ÿìÿìÿî ÿóÿòÿìÿìÿìÿ÷ÿ÷ ÿöÿìÿìÿì"ÿø .ÿüÿì  ÿìÿìÿôÿì20ÿìÿì ÿúÿóÿûHC.ÿþA(ÿû-!ÿìÿñÿìÿíÿ÷$ÿûÿìÿìÿ÷ÿú&  ÿì ÿìÿì.ÿúÿîÿìÿìÿìÿûÿìÿì 2ÿüÿìÿú%(;6oYL+$ ÿü  ÿìÿòÿìÿìÿú"ÿìÿóÿìÿì%"2ÿúÿðÿÿ ÿíÿìÿì,ÿìÿöÿùÿ÷ÿÿÿýÿí .!9FGSBNBB30ÿýÿîE 3ÿìÿø# ÿì ÿìÿÿ3ÿìÿìÿþÿìÿìÿìÿùÿìÿìÿìÿìÿüÿúÿì ÿì ÿõÿø5ÿìÿìÿñÿð8/6BM‚‡aZW(5*ÿí# 2 %:ÿþÿìÿì'ÿìÿöÿýÿìÿþÿìÿïÿóÿöÿýÿìÿìÿìÿúÿú7ÿú2 ÿú I^hx’’ž|>&U#ÿìÿìÿìÿùÿì ÿìÿïÿìÿíÿù ÿðÿöÿü @ÿìÿìÿþÿðÿìÿì )!9bØ „n/5 ÿü+ ÿñ"ÿñÿòÿìÿìÿ÷ÿìÿìÿìÿì!(ÿìÿïÿì ÿñÿìÿìÿõÿí"ÿÿÿìÿóÿÿ5ÿÿ8w’r’WL: ÿõÿûÿôÿðÿý<ÿìÿîÿúÿùÿöÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿîÿìÿòÿÿÿøÿøÿýÿí ÿí ÿï*[i`b:'c ÿìÿìÿöÿôÿÿÿñÿýÿìÿð -$"ÿ÷ÿô  ÿúÿìÿìÿñÿìÿìÿð&8$ ÿìÿõÿïÿì ÿìÿìÿì7o†<7ÿöÿüÿìÿýÿÿÿìÿìÿì!*ÿìÿì&ÿÿÿû&Hÿýÿùÿìÿìÿøÿôÿìÿì5ÿìÿìÿóÿìÿÿ*ÿìÿì26‰›hÿ÷ÿìÿôÿþ 'ÿì ÿûÿìÿìÿòÿìÿìÿìÿ÷"> ÿì -5ÿûÿíÿìÿì -ÿïÿìÿìÿìÿìÿöÿý-(7.™ cN ÿûI1ÿüÿìÿìÿìÿìÿóÿìÿìÿøÿìÿìÿìÿìÿý#ÿïÿìÿï' ÿìÿìÿì2ÿìÿöÿû!ÿìÿìÿì&% ÿíÿìA0@°]+ "ÿý ÿõÿìÿìÿðÿüÿîÿíVKÿðÿìÿìÿìÿì!ÿúÿì 1%ÿìÿìÿóCÿïÿö ÿìÿìÿìÿî!ÿõÿý ÿìÿì*gާ®`%'ÿûÿõÿìÿøÿìÿîÿò ÿùÿú$0!ÿûÿýÿúÿìÿìÿõÿì, ÿìÿùÿî2ÿúÿîÿìÿÿÿìÿô(ÿûR¢ÍœLÿýÿì ÿúÿõÿùÿþÿ÷ÿüÿìÿìÿìÿûÿü$2@ÿüÿóÿí ÿìÿìO+$ÿúÿì ÿî ÿûÿÿÿüÿþÿúÿì!. @w ÿôÿðÿÿÿñÿìÿûÿóÿÿ+ÿûÿìÿìÿýÿñÿìÿìÿöÿòÿüÿõÿ÷ÿó ÿûÿìÿì ÿùÿìÿìÿìÿìÿÿÿìÿò=>Z:GHDÿìÿìÿìÿûÿìÿìÿñÿóÿîÿÿÿüÿì8&ÿôÿìÿìÿìÿöÿöÿì"!#ÿìÿþ@ÿïÿì!ÿîÿì ÿñÿü%#Mc^6D#ÿòÿìÿìÿì5"ÿûÿü ÿìÿìÿìÿìÿìÿíÿìÿìÿìÿó(ÿþ,9Dÿìÿìÿìÿþÿìÿì ÿìÿþÿìÿì ÿöÿý#ÿì%ÿìXh8ÿý='ÿìÿöÿìÿü$!"-ÿÿ)-ÿìÿìÿðÿìÿìÿìÿõÿóÿòÿôÿìÿìÿóÿìÿýÿì ÿìÿú+ÿîÿô  ÿþÿìÿð ÿøB\.ÿý \1ÿìÿìÿìÿìÿìÿíÿûÿìÿúÿìÿþÿìÿô"!" $ÿóÿñÿûÿôÿìÿ÷ * &ÿíÿìÿìÿì  G3=+ÿìÿö"ÿ÷ÿõÿöÿìÿï"ÿ÷ÿúÿÿÿùÿíÿìÿìÿìÿôÿìÿý /$ ÿÿÿì,ÿìÿíÿìÿù&ÿì0ÿìÿøÿüÿì  V@CC?1ÿûÿìÿì !*ÿõÿìÿûÿýÿ÷ÿý#ÿùÿ÷ÿìÿòÿ÷ÿóÿìÿìÿìÿì$ÿöÿü9-%ÿìÿòÿðÿìÿìÿïÿìÿûÿùÿî%@0#%7Uÿïÿìÿô&ÿì"ÿ÷+ÿ÷ÿìÿíÿòÿîÿÿ-ÿìÿìÿìÿì ÿìÿÿÿìÿïÿìÿó*ÿìÿìÿìÿ÷ÿ÷ ÿìÿìÿìÿô 4%.90(61ÿý ÿûÿì+%ÿìÿìÿþÿÿÿõÿð ÿûÿöÿìÿýÿøÿøÿÿ$Fÿüÿìÿìÿïÿþÿ÷ÿìÿõÿðÿøÿìÿþÿìÿþ!-ÿýÿìÿì !#!-ÿìÿú ÿøÿìÿì+ÿ÷ ÿìÿýÿìÿìÿì' ÿì ÿì , ÿÿ ÿì3ÿìÿì ÿ÷ÿòJÿø.ÿñÿñÿ÷/#ÿò ÿìÿïÿøÿìÿìÿï .ÿì4ÿìÿìÿì ÿì*/ÿüÿîÿó ÿö ÿþÿúÿïDÿìÿìÿìÿìÿíÿìÿþ+ÿì=+.ÿìÿì >ÿìÿì"ÿø#ÿìÿìÿóÿìÿìÿóÿìÿìÿìÿì ÿøÿñÿòÿöÿ÷ÿì!$ÿìÿî ÿì ÿì ÿìÿþ&ÿìÿûÿì1ÿìÿìÿîÿðÿø ^ÿóÿìÿþÿýÿùÿì$ ÿ÷:ÿöÿìÿõÿìÿùÿöÿìÿìÿùÿýÿö O3ÿì&ÿûÿïÿìÿýÿìÿûÿñ ÿìÿ÷ÿø* ÿì'ÿìÿÿÿñÿìÿì ÿóÿìÿìÿøÿõÿìÿìÿûÿìÿóÿíÿìÿòÿÿÿûÿîÿóÿðÿìÿù.ÿìÿïÿüÿì'2ÿì ÿìÿú+ÿþ# ÿüÿð$%ÿðÿìÿð)ÿìÿýÿìÿìÿñÿ÷ÿíÿú ÿùÿ÷'ÿöÿìÿìÿìÿìÿôÿöÿô'ÿõÿì ÿøÿôÿìÿìÿìÿø1ÿì0ÿüÿìÿó ÿû ÿñÿÿÿìÿìÿðÿôÿìÿ÷*ÿì ÿìÿìO"ÿìÿôÿì ÿìÿü ÿìÿìÿó4ÿü ÿóÿûÿïÿúÿìÿïÿìÿìÿþ"4ÿìÿìÿìÿìÿüÿýÿõÿìÿíÿìÿñÿì$Vÿ÷)ÿïÿìÿ÷ÿ÷ÿìÿüÿûÿðÿíÿùÿüÿìÿìÿöE"ÿùÿñÿìÿø ÿìÿüÿì ÿìÿì ÿø6ÿìÿþÿôÿüB#ÿûÿì 5 2&ÿÿÿóÿÿ8 ÿþÿõÿìÿìÿìÿì$ ÿìÿñÿìÿì7ÿÿÿìÿì%*ÿñÿÿÿùÿîÿìÿöÿìÿì"ÿìÿðÿñÿñÿìÿìÿìÿøÿì ÿìÿýÿì! ÿì ÿúÿìÿóÿõÿìÿùÿòÿýÿì3,&ÿòÿø2ÿìÿìÿìÿ÷ÿøÿïÿõ ÿìÿøSÿòÿù)ÿøÿøÿû.ÿìÿì#ÿì'ÿìÿõÿìÿìÿìÿïÿö 0"ÿôÿúÿ÷ÿìÿþÿìÿñ+ÿï ÿü%ÿì> ÿìÿý$ÿì6ÿõ ÿý%ÿìÿìÿì*# ÿûÿìÿíÿìÿü&Kÿÿ ÿø& ÿìÿìÿìÿìÿøÿùÿüÿì@&ÿì ÿìÿ÷ÿíÿìÿìÿó ÿì ÿì!ÿöÿý )ÿìÿñ ÿì 3+ÿò ÿøÿìÿöÿîÿìÿùHÿùÿìÿÿÿìÿþÿì ÿìÿòÿøÿÿÿîÿìÿì(ÿòÿìÿð$ÿòÿìÿìÿö#3 ÿüÿì39 ÿìÿìÿìÿûÿì #'D ÿîÿì4 ÿõÿû6ÿì  ÿÿÿøÿìÿìÿìÿìÿõÿìÿü7/ ÿì+ &ÿì$ÿöÿìÿìÿìÿíÿìÿìÿìÿü #(ÿîÿðÿìÿíÿð&ÿìÿí ÿôÿìÿîÿ÷4ÿõÿìÿìÿìÿì%ÿýÿìÿü,ÿøÿì ÿì ÿøÿÿÿìÿìÿþÿúÿíÿì#,:ÿøÿü ÿìÿìÿõÿòÿõÿùÿìÿì ÿìÿìÿìÿò 7ÿìÿì ÿíÿïÿðÿìÿô6%ÿìÿû2ÿ÷ÿì4ÿùÿ÷ÿìÿìÿì &ÿìÿì= ÿþÿìÿì*ÿþÿì . ÿìÿì%ÿô  ÿìÿìÿüÿì ÿùÿÿÿìÿìÿìÿìÿÿÿì ÿýÿñ#ÿìÿì%ÿõÿóÿõÿìÿì%ÿìÿìÿì5ÿìÿìÿò+ÿíÿì$ ÿÿÿð@ ÿøÿìÿö ÿþÿìÿûÿýÿìÿ÷ÿìÿöÿùÿìÿìÿìÿìÿø%ÿý-ÿñ(ÿùÿöÿìÿìÿìÿìÿÿÿíÿìÿìÿì#& &ÿþÿï  ÿì2@ ÿìÿðÿýÿó ÿþÿìÿøÿýÿìÿøÿú)ÿûÿìÿìÿüÿõÿìÿìÿìÿ÷3#2ÿùÿìÿìÿôÿîÿð&ÿìÿìÿìÿìÿî$ÿñÿìÿð>ÿì ÿìÿôÿï0ÿìÿìÿìÿíÿì#ÿîÿü ÿúÿûÿüÿìÿø ÿüÿû>&ÿìÿìÿí ÿìÿÿÿìÿì2 ÿñ"ÿïÿþ ÿìÿìÿüÿ÷ÿì!ÿöÿì&ÿìÿ÷ÿì@ÿì'ÿìÿì(ÿìÿìÿìÿøÿìÿìÿñÿòÿó;ÿìÿð"ÿìÿìÿìÿìÿùÿðÿû.""ÿòÿìÿì,ÿìÿò+ÿìÿìÿì"ÿîÿîÿìÿìÿÿÿìÿúÿìÿìÿòÿý"  ÿö!)ÿìÿùÿõÿìÿì4 ÿìÿìÿöÿî ÿíÿó<# *ÿóÿóÿíÿì/ÿìÿìÿðÿìÿì')ÿìÿìÿìÿìÿíÿìÿìÿìÿü ÿìÿòÿñ.ÿìÿ÷ ÿøÿìÿìÿõ#ÿöÿñÿìÿõCÿøÿì2ÿìÿðÿôÿõÿý)%A4ÿì9#ÿìÿùÿìÿïD<ÿùÿìÿìÿó%ÿìÿì!ÿìÿü ÿìÿìÿìÿìÿìÿìÿìÿöÿðÿìÿìÿüÿù)ÿôÿìÿìÿìÿìÿüÿìÿüÿìÿìÿí ÿìÿî% ÿüÿíÿýÿöÿöÿý ÿì ÿìÿìÿõÿñÿ÷ÿøÿóÿ÷. ÿìÿø$*ÿìÿìÿìÿìÿù+$ÿúÿìÿìÿì/ÿõÿìÿìÿìÿíÿìÿðÿü&ÿûÿú ÿþ0 ÿìÿìÿÿÿøÿÿ ÿóÿúÿîÿìÿíÿïÿìÿòÿûÿüÿôÿñÿñ4ÿìÿöÿìÿìÿì;ÿìÿìÿìÿìÿìLÿñÿôÿûÿìÿðÿöÿôÿòÿøÿù2ÿô'ÿüÿìÿìÿìÿìÿïÿìÿì ,ÿõÿì  ÿ÷ÿì )*ÿí9S ÿùÿí'ÿÿÿñÿôÿìÿìÿòA ÿì%ÿìÿìÿ÷ÿð ÿó(*ÿîÿìÿöÿöÿõ .ÿíÿìÿìÿûÿìÿüÿìÿöÿðÿû!&ÿìÿùÿì7ÿìÿòÿìÿìÿþ-ÿõ$'ÿÿÿï#%ÿìÿì$ÿÿÿøÿðÿìÿôÿûÿìÿýÿ÷ÿöÿìÿìÿ÷ÿý ÿìÿüÿì= 4ÿñÿìÿñÿìÿìÿöÿì>ÿìÿòÿì ÿü/ÿìÿì -ÿìÿìÿøÿìÿìÿò Aÿòÿñÿø ÿìÿìÿ÷ÿì #ÿóÿüÿû&ÿìÿïÿì1* ÿì,#ÿìÿñÿð'ÿìÿîÿìÿñÿìÿ÷ÿìÿù /ÿôÿñÿìÿì'ÿ÷ÿì ÿóÿì*ÿûÿÿÿõÿöÿ÷ ÿõ< ÿñÿ÷ÿìÿïÿìÿì'ÿúÿìÿìÿìÿþ?ÿþÿüÿì ÿó ÿõÿì$$ :ÿìÿõÿìÿì ÿìÿìÿìÿû 1ÿþÿÿÿðÿð%ÿìÿùÿìÿìÿôÿóÿøÿøÿð& ÿìÿìÿôÿìÿíÿì ÿìÿìÿì$ ÿì<!-ÿþÿìÿüÿì9ÿñÿìÿîÿýI$ÿì&ÿõÿìÿìÿò.ÿôÿì'ÿòÿìÿòÿ÷)+ÿìÿìÿì"ÿûÿüÿìÿóÿìÿìNÿýÿìÿúÿþ2ÿþÿìÿù( ÿðÿöÿþ$ÿõÿì)) ÿìÿì/ÿïÿý ÿìÿñÿìÿõÿüÿìÿü8ÿìÿìÿõÿóÿøÿìÿìÿìÿùÿì ÿì.ÿìÿôÿìÿì?ÿì#ÿõÿìÿìÿñ!2 ÿìÿì ÿìÿòÿïÿû ÿôÿìÿòÿüÿñÿïÿîÿÿÿìÿìÿýÿþÿìÿì ÿñÿìÿôÿöÿìÿìÿùÿì $2 ÿìÿìÿìÿýÿì & ÿì,ÿì )#"ÿø 5 ÿìÿöÿìÿ÷!ÿø 2ÿûÿûÿõÿï6ÿìÿì#$ÿì ÿûÿýÿúÿüÿî"ÿÿ ÿøÿìÿì 4ÿúBTK+7ÿú ÿîÿîÿïÿìÿì/ÿúÿìÿÿ3) ÿúÿìÿìÿõÿíÿì ÿðÿîÿô ÿìÿìÿìÿìÿìÿøÿôÿìÿýÿòÿî2ÿï04 ÿö+*N2$029;ÿðUPÿìÿì ÿ÷$ÿìÿìÿìÿüÿîÿìÿóÿúÿìÿìAÿ÷,ÿïÿúÿõÿôÿìÿíÿìÿðÿôÿìÿìÿìÿûÿþÿíÿù$$PQ="ÿ÷ÿì'%ÿìÿðÿìÿî, "ÿýÿÿÿòÿðÿóÿýÿìÿþÿô ÿòÿïÿü3ÿìÿìÿî ÿïÿìÿìÿìÿý,…rBÿ÷ÿí)ÿøÿìÿþ6ÿþ-ÿìÿìÿÿ ÿôÿìÿìÿíÿìÿû ÿúÿ÷ ÿìÿìÿðÿì%ÿìÿýÿìÿõÿìÿì #ÿù$ÿìÿú"&ÿúW^)ÿì/ÿúÿø ÿýÿìÿìÿì0ÿüÿìÿ÷6 9ÿïÿì%!ÿøÿì")ÿó ÿðÿìÿòÿöÿÿ5ÿýWfOJezMÿñ/"ÿìÿ÷@ÿìÿìÿìÿì ÿìÿô ÿõÿì$$ÿï&-ÿìÿû ÿìÿìÿüÿíÿìÿì ÿìÿíÿìÿí ÿùÿöÿó)Aq}‚]D2 ÿùÿìÿìÿô.ÿÿÿð8ÿìÿì) ÿìÿìÿì!ÿìÿìÿìÿñÿùÿìÿìÿûÿìÿìÿìÿìÿüÿìÿù9(ÿìÿì ImkeHTd,63ÿìÿøÿìÿì  ÿüÿýÿü ÿìÿüÿíÿìÿìÿìÿìÿýÿüÿìÿ÷ 4ÿìÿìÿì )ÿìÿý&(ewotSOZ."ÿô,ÿìÿìÿûÿìÿÿÿð&ÿùÿÿÿìÿì ÿìÿì ÿï'ÿîÿù$+ÿìÿîÿû$ÿîÿìÿìÿíbij™s_; ÿìÿüÿì &ÿù$ÿñÿðÿì$ÿöÿúÿìÿìÿÿ *ÿ÷ÿìÿøÿìÿìÿìÿìÿ÷ÿü.ÿðÿìÿì!/ÿùÿì7ÿìÿ÷ÿþ9Qv{PH #ÿøÿìÿõÿí ÿø4ÿúÿìÿñÿì ÿõÿìÿìÿþÿìÿðÿìÿìÿõÿìÿì ÿôÿðÿìÿôÿý ÿìÿìÿüÿìÿúÿíÿôÿýÿ÷ÿò1) IceT65ÿðÿìÿìÿôÿðÿì ÿûÿìÿìÿÿ'"% ÿìÿíÿôÿìÿì ÿìÿìÿî"1? !ÿïÿíÿì ÿìÿìÿþ <f|O 9. ÿìÿôÿìÿð ÿõÿýÿúÿìÿì0ÿìÿìÿì ÿìÿü (ÿüÿõÿìÿì ÿìÿìÿìÿì-1ÿûÿìÿìÿìÿñÿü ÿïÿì0kN†Ç‹,ÿÿÿìÿìÿìÿìÿó#ÿ÷%ÿýÿìÿö @!ÿìÿì#ÿþÿìÿìÿìÿû;ÿôÿì'&ÿñÿìÿìÿóÿìÿì&ÿìÿì 1J[d•…8ÿî6"O3 ÿòÿúÿðÿìÿõÿí ÿõÿìÿìÿô!ÿûÿìÿìÿìÿìÿìÿìÿì3ÿþÿìÿìÿì($(ÿðÿìÿìÿö9%(ÿýÿî0^VawU*$ÿùE!5ÿÿÿþÿðÿì ÿíÿýJ1ÿìÿìÿõÿö ÿüÿì&ÿ÷ÿìÿìÿúÿø&8(ÿôÿìÿì ÿö,ÿûÿú"* Vgž£\K"ÿó&ÿìÿíÿìÿîÿú +ÿìÿìÿö&# ÿòÿì9 ÿÿÿõÿ÷ÿýÿìÿì2ÿõÿì-$ ÿì ( ÿìÿ÷ ÿìÿý ÿõÿïCI<Q[@9)ÿìÿúÿöÿìÿìÿì%ÿÿÿìÿýÿîÿìÿìÿò,ÿòÿÿÿþ@<ÿùÿì*ÿìÿìC3 ÿõÿìÿìÿ÷ÿþÿî3ÿÿ<9+J[ÿìÿìÿô ÿúÿù ÿìÿöÿìÿì%ÿõÿìÿìÿìÿìÿìÿîÿøÿìÿîÿìÿìÿì  ÿúÿìÿñ ÿìÿìÿìÿÿÿýÿôÿ÷ÿìÿüA@.<KL/,ÿìÿìÿìÿì ÿìÿì ÿìÿìÿî3ÿû5ÿþ ÿõÿõÿûÿìÿìÿúÿìÿøÿìÿø )' "ÿìÿõ 6ÿìÿûÿþ ÿ÷*G2>VL14ÿìÿìÿìÿþ& ÿìÿïÿÿÿìÿò%ÿìÿìÿìÿì( &@ÿìÿìÿìÿòÿìÿìÿÿÿóÿìÿìÿõÿû ),#YN.N#ÿìRg+ÿøÿîÿìÿûÿìÿú$ÿýÿì$ÿìÿìÿìÿö ÿìÿìÿì##ÿìÿìÿ÷ÿìÿìÿìÿòÿýÿïÿì ÿòÿìÿø:NKU' ÿþ,Cÿý";ÿìÿøÿÿÿìÿìÿí ÿùÿóÿõÿïÿì  /4- ÿî ÿùÿö 9!ÿíÿìÿì ÿýÿì*]5*1ÿôÿìÿÿ ÿìÿìÿì%ÿìÿôÿìÿìÿìÿìÿïÿìÿì>ÿúÿìÿðÿìÿìÿþÿìÿøÿýÿô50ÿìkT? ÿù "ÿìÿìÿìÿù-ÿì ÿìÿýÿíÿûÿìÿìÿø ÿìÿìÿì ÿô+%ÿìÿò ÿùÿñÿìÿìÿìÿìÿìÿþÿõ67ÿì!ÿìÿì ÿìÿì3 ÿôÿìÿìÿþ(ÿìÿìÿò+ÿÿ ÿìÿìÿñÿüÿìÿöÿóÿìÿìÿûÿú*ÿìÿìÿìÿüÿûP-ÿú@E)ÿü#ÿôÿìÿÿÿõ&3ÿìÿìÿìÿýÿÿÿóÿý%ÿìÿìÿÿÿûÿì%ÿüÿí ÿñÿì ÿìÿìÿîÿþÿìÿøÿìÿøÿî3ÿýÿý'$ ÿôÿÿÿìÿìÿý)ÿïÿþÿûÿøÿìÿì*ÿìÿìÿýÿõÿìÿúÿì* ÿð' 0 ÿó ÿüÿþ#Cÿìÿìÿýÿì ÿøÿüÿýÿýÿöÿìÿÿÿñ ;ÿìÿ÷ÿì  ÿñÿìÿì !ÿìÿìÿìÿûÿðÿø'  ÿìÿõÿý/  >ÿöÿìÿìÿðÿïÿðÿï4ÿì=5+ ÿñÿì&ÿþ.ÿìÿõ7 ÿìÿìÿìÿìÿìÿì*ÿï ÿìÿìÿúÿúÿòÿýÿìÿì 4ÿ÷ÿì ÿïÿ÷ÿìÿìÿúÿü ÿîÿúÿðÿïÿÿÿìÿüÿìÿýSÿìÿìÿø Cÿøÿöÿìÿðÿôÿ÷ÿìÿìÿôC*ÿöÿìÿñÿìÿìÿìÿìÿìÿøÿìÿ÷ ÿì  ÿ÷ÿìÿñÿö!ÿì-ÿìÿìÿòÿìÿìÿìÿìÿìÿìÿìÿòÿì#ÿ÷ÿìÿüÿìÿû& ÿìÿìÿôÿì!+ÿìÿì 2ÿöÿì'ÿïEÿðÿìÿõ(ÿìÿñÿìÿìÿýÿÿÿìÿïÿúÿ÷ÿýÿì* ÿþÿìÿìÿùÿìÿìÿüÿòÿùÿìÿþÿúÿüÿñÿìÿìÿìÿïÿì8ÿìÿì ÿìÿøÿíÿ÷ÿøÿìÿìÿì"ÿìÿòÿ÷.ÿ÷ÿìÿôÿìÿüK4ÿü"ÿìÿìÿü* ÿì5 ÿõ)ÿõÿî  2ÿþÿþÿìÿöÿìÿìÿì! ÿû%ÿìÿøÿìÿì ÿì ÿìÿìÿìÿ÷F ÿì(ÿý$0"ÿìÿöÿìÿôÿÿ ÿìÿó ÿôÿôÿüÿìÿìCÿì ÿóÿìÿûÿôÿùÿìÿðÿìÿì ÿö #ÿì !ÿùÿì8ÿìÿìÿôA%ÿìÿþ ÿõ(3ÿðÿ÷ÿÿÿìÿüÿóÿì ÿó ÿõÿõÿìÿì@ÿìÿú#/ÿì ÿ÷ÿùÿùÿìÿìÿÿÿóÿõÿïÿúÿôÿìÿì(ÿúÿûÿòÿüÿìÿñ'ÿùÿìÿîÿøÿìÿïÿì.ÿ÷ÿìÿìÿíÿó%ÿøÿìÿñÿóÿöÿñ Zÿóÿìÿþÿìÿï7<ÿÿ=ÿíÿìÿíÿìÿøÿùÿìÿì!ÿü!ÿíÿìÿìÿüÿø$+ÿì4ÿìÿìÿñ 9ÿ÷ &ÿìÿì ÿìÿì ( ÿïÿìÿì-"ÿìÿñÿòÿìÿÿ&@ ÿòÿìÿìÿí1ÿìÿüÿõÿþ%ÿúÿì$ÿõ&ÿìÿìÿìÿìÿìÿìÿùÿì ÿìÿóÿùÿì ÿóÿïÿíÿ÷ÿõÿì'ÿìÿÿ 4! ÿì  ÿìÿð4' ÿûÿìÿýÿì ÿõ ÿòÿý'ÿðÿìÿ÷)ÿï ÿó.ÿûÿõÿìÿï0&ÿò+ÿìÿìÿìÿþÿì?ÿì=!ÿ÷ÿø H ÿþ ÿì/ÿìÿìÿìÿìÿìÿìÿìÿìÿüÿùI )ÿ÷ÿì8"ÿýÿìÿìÿìÿìÿìÿðÿî"ÿþÿìÿìÿìÿð M9ÿìÿì &ÿòÿìÿìÿìÿöÿì ÿø ÿï*ÿìÿìÿïÿñÿìÿìÿýÿìÿì&+'ÿòÿðÿìÿýÿüÿìÿìÿì ÿñÿìÿüÿìÿíÿþÿìÿõÿì"ÿù,ÿìÿüÿþ&ÿñÿìÿôÿìÿüÿôÿú&ÿõÿûÿóÿìÿìÿü"ÿû'!ÿþÿì0,ÿùÿìÿìÿø) ÿì  ÿÿÿìÿÿÿìÿô .ÿïÿìÿì ÿìÿþ ÿðÿì ÿúÿðÿìÿìÿì &ÿòÿìÿìÿü ÿïÿîÿîÿúÿôÿìÿìÿìÿì/+!ÿñÿìÿõ Gÿöÿñ'ÿìÿì5$ÿì#Aÿûÿô+ÿìÿì( ÿðÿìÿìÿð.ÿùÿÿÿì  ÿìÿíÿùÿìÿ÷ÿÿ/)D ÿý'ÿìÿìÿìÿìÿöÿôÿïÿõÿøÿì  ÿìÿì(ÿìÿìÿÿÿð1ÿüÿøÿì$ÿìÿðÿÿÿò ÿì ÿìÿì ÿõÿìÿìÿì4#=ÿìÿìÿùÿíÿôÿìÿìÿìÿóÿì1ÿøÿì7ÿúÿìÿìÿøÿìÿôÿí#ÿìÿ÷ ÿù/ ÿôÿõÿìÿìÿìÿì#ÿõ@&ÿôÿì ÿìÿìÿìÿï!ÿø5 ÿùÿìÿìÿìÿìÿì0@ÿðÿõÿùÿìÿì&ÿìÿôÿì ÿòÿûÿìÿóÿìÿìÿõÿûÿûÿÿ ÿú -ÿìÿìÿô ÿùÿõÿüÿóÿìÿì2&ÿí(ÿõÿìÿøÿþ /ÿìÿìÿì8ÿìÿìÿìÿìÿþ ÿìÿìÿøÿìÿì ÿïÿõÿòÿñÿø&ÿõÿùÿìÿì ÿôÿüÿþÿìÿöÿøÿìÿîÿì$# ÿôÿìÿìÿìÿíÿìÿìÿüÿìÿóÿìÿìÿìÿìÿóÿìÿøÿìÿÿÿìÿìÿìÿìÿòÿûÿþÿìÿì) ÿì9ÿì ÿþ9ÿìÿì ÿìÿì ÿÿÿ÷ ""/*ÿìÿü0ÿìÿû ÿòÿñ#;ÿìÿôÿü$ÿìÿùÿÿ ÿõ*2ÿÿÿòÿìÿìÿøÿìÿÿÿûÿìÿìÿõÿóÿìÿì ÿõÿìÿìÿìÿîÿïÿìÿÿÿìÿóÿìÿð!ÿìÿñE ÿùÿîÿìÿì$ÿÿ* ÿùÿò ÿùÿìÿìÿìÿóÿþÿÿ&/ ÿìÿìÿÿ ÿìÿìÿìÿì#* ÿìÿìÿð ÿì ÿìÿóÿí ÿù ÿì3ÿüÿïÿõ ÿñ@&ÿìÿíÿñÿì ÿìÿð ÿìÿòÿø ÿÿÿøÿö5ÿòÿìÿìÿìÿö3ÿìÿìÿìÿûÿõKÿî ÿôÿö  ÿíÿìÿìÿöÿïÿü)ÿùÿýÿìÿìÿûÿñÿï"<ÿöÿïÿìÿôÿôÿìÿîÿú 0ÿìÿù'Jÿöÿìÿì 3 ÿðÿóÿìÿì ÿð / '!ÿúÿðÿò!ÿð)ÿòÿìÿìÿï"ÿìÿìÿóÿð ÿìÿýÿìÿ÷ÿìÿíÿï8 ÿìÿïÿì  ÿùÿú6*ÿï,D ÿöÿü*ÿûÿì1ÿþÿïÿìÿùÿìÿíÿìÿìÿû :ÿðÿøÿû)1Gÿüÿìÿïÿìÿìÿ÷ÿì2ÿì ÿüÿÿÿìÿìÿìÿý ÿìÿìÿñÿüÿõÿþÿìÿøÿïÿõ &ÿøÿþÿüÿüÿó ÿÿÿúÿü-ÿò)&ÿÿÿì!.ÿìÿì4 4ÿõÿÿÿúÿíÿîÿìÿíÿìÿñ6ÿðÿìÿìÿì5ÿùÿìÿìÿùÿÿÿýÿüÿñÿìÿôÿ÷ÿì$ÿìÿøÿìÿìÿìÿì$ÿïÿìÿìÿìÿô3 ÿìÿù,7 ÿìÿÿ'%B&)ÿö+ÿ÷ ÿìÿìÿõÿóÿìÿìÿì.ÿì) ÿúÿóÿò ÿìÿìÿì/ÿþÿþ)'ÿìÿúÿìÿìÿìÿìÿüÿìÿì)ÿì!,5 /ÿíÿõ*ÿîÿò-7ÿõÿý ÿìÿìÿøÿìÿí(ÿòÿì ÿì ÿìÿú ÿìÿìÿìÿûÿñÿìÿìÿôAÿìÿìÿñ'/ÿ÷:0ÿøÿìÿìÿúÿõÿü ÿñ S ÿìÿì5!ÿõÿìÿñÿòÿðÿö0ÿöÿìB ÿìÿì ÿìÿîÿùÿöÿìÿì%ÿì"ÿìÿóÿïÿìÿìE ÿìÿì ÿýÿì ÿò)F5&ÿøÿìÿìÿý%ÿìÿõ ÿîÿíÿìÿîÿóÿ÷ÿýÿìÿìÿìÿìÿõÿìÿì$ÿìÿìÿÿÿóÿóÿìÿìÿì*,ÿûÿìÿìÿ÷ÿÿÿíÿû4ÿü->9,0 %ÿýÿíÿìÿìÿøÿó ÿü 0ÿïÿî ÿì2ÿìÿìÿù-ÿô<ÿì ÿöÿòÿô ÿÿÿìÿþ ÿìÿìÿìÿóÿû*E 7K?Y4ÿó ÿìÿìÿùÿìÿìÿìÿý'$ÿìÿìÿüÿÿÿûÿìÿóÿöÿú! ÿìÿ÷ÿìÿù ÿóÿìÿüÿýÿìÿì *ÿýÿü#%4*,, ÿþ-,58* ÿû35ÿìÿì ÿúÿì*ÿìÿíÿìÿûÿóÿñÿôÿô9ÿìÿü ÿìÿìÿìÿøÿïÿûÿìÿìÿõÿîÿí"ÿüÿðÿì"ER\pG&ÿþÿìÿü0ÿìÿí&ÿìÿìÿíÿìÿÿÿìÿìÿõÿìÿöÿìÿþÿ÷ÿñÿîÿöÿøCÿù1+ÿúÿ÷ÿ÷ 8ÿùÿìÿþ,+6Žt5ÿìÿì ÿû(+ÿýÿ÷Gÿìÿìÿúÿöÿúÿó0 ÿîÿìÿôÿìÿÿÿñÿ÷ÿöÿìÿìÿû ÿìÿûÿìÿô5( ÿú 9b(:> ÿìÿì ÿìÿì ÿóÿì,ÿû, ÿì##ÿì '"ÿïÿì,$ÿìÿî & ÿùÿìÿóAQ;U’k;BT-ÿ÷ÿúÿìÿû Hÿìÿú5ÿìÿìÿìÿì%ÿìÿõÿð#(ÿì/ÿìÿìÿùÿìÿìÿì ÿïÿóÿìÿìÿìÿìÿìÿð ÿñÿúÿøLt…‰“zw.ÿìÿìÿìÿìÿìÿþÿïÿìOÿìÿì#ÿòÿîÿìÿøÿìÿíÿìÿñÿìÿù ÿìÿì ÿìÿìÿìÿìÿîÿìÿíÿøÿí ÿìÿ÷"f‘g1 +ÿûÿìÿóÿíÿðÿìÿñ"ÿìÿìÿ÷ ÿìÿìÿúÿì.ÿíÿìÿôÿìÿìÿú  ÿìÿîÿÿÿìÿìÿó&ÿÿÿñÿôÿôBRqs50)#/ÿû(ÿóÿ÷ÿìÿìÿù ÿöÿùÿìÿþ+ ÿô ÿìÿìÿñÿìÿû ÿí ÿûÿû *!ÿìÿìÿü#ÿÿ &&ÿìÿù"9@ˆZ4;+4'ÿôÿìÿûÿì*ÿìÿì ÿÿÿìÿ÷ÿìÿìÿú2 ÿôÿìÿìÿìÿìÿìÿý) ÿöÿìÿìÿþ ÿí#.ÿìÿô#ÿó ?[dD'ÿìÿñÿïÿìÿìÿìHÿìÿìÿìÿô 2ÿìÿì ÿÿÿìÿìÿñÿïÿìÿìÿìÿìÿìÿìÿîÿìÿíÿ÷ÿíÿìÿìÿìÿô =:!@EZ=60&ÿìÿìÿìÿþÿìÿìÿúÿÿ0ÿìÿìÿñÿðÿíÿð!,Pÿìÿìÿ÷ÿïÿûÿóÿøÿìÿöÿýÿìÿì .7ÿíÿìÿìÿìDKq„r@ .ÿùÿîÿìÿìÿÿÿüÿìÿûÿìÿú.,&ÿìÿìÿóÿì ÿìÿùÿ÷ÿûÿìÿì#ÿìÿìÿìÿì"2ÿìÿìÿóÿíÿø$G™•¤P!ÿóÿìÿìÿìÿì ÿìÿïÿìÿìÿîEÿìÿìÿòÿï ÿ÷'"ÿ÷ÿìÿñÿìÿìÿïÿ÷ÿìÿìÿó 0<Pj~kRÿðF,L-ÿìÿôÿìÿìÿø$- ÿùÿìÿì ÿìÿìÿìÿì5ÿìÿìÿýÿÿÿûÿìÿìÿì"ÿüÿðÿîÿ÷ÿùÿÿ.-M`|NaU) %ÿï3ÿì> ÿúÿùÿòÿõÿóÿû>43ÿìÿìÿÿ 2 ÿíÿþ ÿþ  ÿìÿìÿúÿøÿý$" $4W->Šmik)+ÿìÿôÿìÿìÿìÿìÿþÿûÿì ÿìÿì!ÿñ ÿìÿþÿìÿì Hÿìÿì.+!+ÿþÿûÿÿÿúÿì '7M?3"ÿý4*ÿüÿù ÿìÿìÿìÿìÿìÿì"ÿìÿöÿúÿìÿÿLÿþÿîÿüÿðÿÿ ÿöÿì&ÿìÿì-)ÿÿÿìÿýÿúLH5MI:ÿì /4ÿìÿøÿöÿûÿÿÿí ÿìÿÿÿìÿìÿìÿìÿìÿû&ÿìÿìÿõÿìÿìÿõÿìÿìÿ÷ÿíÿþÿù ÿðÿìÿïÿÿÿþ =F>bSA/ÿøÿïÿì ÿìÿìÿìÿìÿòÿû,ÿÿÿìÿìÿì ÿóÿò: ÿúÿíÿìÿòÿùÿìÿú!ÿìÿð&=1ÿøÿì&ÿùÿýPRQPE ÿô ÿïÿìÿìÿõ ÿìÿìÿìÿð$$ ÿìÿìÿìÿì$ ÿóÿõÿðÿìÿñÿìÿìÿüÿòÿóÿï ? dY=8ÿûÿìÿóJTÿìÿìÿìÿìÿìÿìÿýÿù5ÿùÿìÿìÿý ÿìÿìÿìÿìÿîÿì &ÿìÿúÿì ÿìÿìÿð ÿÿÿ÷ÿìÿìfgTDÿü'8ÿ÷ÿîÿïÿìÿìÿ÷ ÿí ÿíÿìÿþ ÿì 2ÿù%"ÿòÿìÿõÿ÷ÿþÿôÿù8 ÿþ4ÿìÿñÿóÿì$>ÿ÷(2ÿõÿì  "ÿìÿþÿòÿìÿïÿìÿìÿìÿìÿìÿìÿìÿüÿ÷$ÿöÿõÿõÿðÿìÿìÿÿÿüÿì ÿþÿì.VI ÿóÿðÿýS3ÿì!ÿï7ÿÿ!ÿìÿìÿì (ÿì ÿÿÿìÿóÿìÿìÿìÿû%ÿöÿìÿüÿùÿûÿûÿì!ÿ÷ÿìÿìÿìÿìÿìÿìÿì$17ÿúÿì ÿì ÿíÿìÿì/ÿúÿïÿìÿþÿì ÿõÿìÿìÿù6ÿîÿìÿþ4"ÿìÿì ÿî"ÿìÿÿ ÿìÿõÿûÿì(ÿìÿöÿï ÿíPÿìÿìÿìÿìÿð!(8!ÿìÿõÿìÿøÿÿ  ÿí#ÿûÿìÿì ( ÿþÿìÿï ÿñÿìÿìÿðÿìÿìÿí $ÿúÿìÿìÿóÿ÷(*ÿìÿú% ÿñÿùÿõÿìÿò ÿîÿìÿìÿìÿý ÿï(ÿìÿìÿì$ÿõ#- 0!ÿòÿóÿô$ÿìÿì !ÿîÿøÿõ ÿìÿõÿìÿöÿìÿóÿôÿì <!ÿìÿìÿðÿûÿìÿì ÿðÿì!ÿìÿìÿùÿúÿùÿï" ÿúÿìÿúÿöÿùÿìÿìÿì$8ÿì@5,ÿôÿì ÿù*ÿøÿìÿõ)#ÿìÿìÿìÿìÿì/ÿøÿìÿì ÿùÿôÿîÿìÿû8ÿÿ ÿú ÿòÿìÿï!ÿìÿûÿýÿôÿÿ ÿ÷ÿìÿìÿìÿô<ÿìÿìÿì*/ÿúÿý6ÿ÷ÿíÿìÿìÿìÿìÿìÿð " ÿì ÿìÿì ÿìÿöÿìÿìÿÿÿ÷ÿõÿóÿôÿó ÿüÿýÿìÿì?(ÿì<'ÿìÿì'ÿ÷ÿöÿìÿìÿòÿìÿìÿìÿìÿþ-ÿìÿø ÿñÿìÿðÿìÿì ÿìÿì9ÿìÿîÿøÿ÷ÿìCÿóÿìÿ÷ÿìÿ÷ÿìÿìÿùÿìÿóÿóÿöÿì-ÿÿ6!ÿì ÿìÿìÿýÿìÿì*ÿï ÿôÿìÿìÿìÿõÿìÿìÿì.ÿüÿìÿõÿñÿõÿøÿìÿìÿì ÿìÿìÿÿÿõÿìÿûÿìÿð0ÿì&ÿì 'ÿöÿìCÿüÿì#ÿøÿû1$ÿö)-ÿúÿìÿìÿöÿìÿìÿìÿüÿïÿíÿÿÿì'ÿìÿìÿìÿôÿûM  ÿìÿû"ÿò %+&ÿñÿûÿìÿìÿüÿ÷ÿìÿìÿíÿúÿÿÿìÿì$1ÿì ÿìÿóÿõÿîÿì ÿ÷ÿìÿûÿì"ÿñÿìÿìÿìÿì0#ÿìÿùÿø ÿøÿìÿñ+ ÿòÿòÿôÿìÿìÿìÿìÿìÿì&ÿìÿï8ÿøÿþ" ÿ÷ÿ÷ÿ÷ÿì ÿìÿú ÿþÿïÿì6ÿýÿøÿô (ÿìÿô(ÿìÿíÿìÿûÿìÿû4ÿìÿì#ÿòÿùÿýÿìÿðÿùÿ÷/ ÿô3ÿýÿöÿþÿó ÿìÿõ&3 ! ?ÿìÿìÿìÿìÿ÷ÿúÿìÿú&" -ÿìÿõÿñÿìÿþ(ÿõ ÿþÿí=ÿìÿìÿìÿì'ÿÿÿì ÿùÿù'ÿõ%ÿÿÿìÿîÿúÿõÿì! !ÿöÿôÿî!)ÿìÿìÿöÿóÿìÿ÷+ÿìÿìÿìÿì!ÿøÿñÿü ÿÿÿóÿô/ÿü'ÿÿÿìÿìÿìÿìÿìÿìÿìÿíÿìÿìÿìÿìÿìÿõÿîÿíÿìÿ÷ÿìÿÿÿìÿý4*ÿÿÿì5ÿýÿúÿìÿìÿúÿþÿñ  ÿüÿùÿö  ÿü!ÿðÿì ÿø9ÿõ+ÿìÿì#ÿùÿì ÿð ÿìÿìÿìÿìÿí$1 ÿì,ÿÿÿÿ ,Pÿíÿðÿõÿìÿ÷ÿìÿí#ÿìÿìÿìÿìÿìÿíÿÿ8 ÿýÿìÿìÿðÿìÿöÿìÿòÿö#ÿì&ÿ÷ÿìÿíÿ÷4Q$ÿìÿìÿþ" #ÿøÿì6ÿìÿìÿüÿû " ÿìÿÿÿö&ÿìÿù%ÿì ÿì" ÿìÿðÿì ÿ÷ÿìÿì ÿýÿñÿìÿþ" ÿìÿìÿìÿì$(:ÿìÿí ##ÿìÿõ ÿôÿýÿìÿìÿÿÿþÿý( ÿìÿì,ÿ÷ÿþ ÿöÿì;4(ÿ÷ÿøÿìÿù ÿìEÿíÿìÿóÿüÿì ÿìÿì:ÿìÿìÿìÿìÿòIÿðÿì ÿìÿìÿñÿîÿìÿòÿìÿîÿìÿôÿù" ÿòÿìÿøÿðÿñÿíÿìÿìÿñFSÿ÷ÿìÿø7ÿö>ÿï'ÿìÿìG.ÿõÿìDÿïÿì3ÿìÿìÿì>ÿûÿðÿìÿì&ÿöÿî ÿîÿìÿ÷&*Aÿó !&ÿìÿìÿìÿìÿ÷ ÿóÿîÿìÿì !ÿìÿì./ÿìÿìÿùÿì3%ÿùÿì ÿìÿì)ÿùÿøÿìÿìÿìÿû ÿøÿìÿø4#ÿî9ÿïÿìÿüÿ÷ ÿöÿñÿìÿìÿì ÿùÿïÿìÿìÿøÿýÿìÿìÿðÿì"ÿñ1ÿìÿô4ÿÿÿðÿøÿìÿóÿì " ÿìÿìÿì,ÿìÿìÿøÿü)ÿÿÿï8 ÿìÿìÿìÿúÿìÿì/ÿí#ÿìÿì ÿìÿì ÿïÿÿÿø ÿìÿìÿìÿìÿùÿüÿÿÿýÿï2<ÿìÿìÿìÿìÿûÿìÿðÿìÿù ÿõÿîÿóÿñ ÿø  ÿìÿìÿøÿìÿìÿòÿõÿìÿìÿìÿìÿðÿüÿìÿìÿìÿìÿìÿìÿýÿÿÿìÿúÿ÷ÿì ÿú$ÿñ ÿòÿìÿïÿþ ÿþK< ÿûÿóÿìÿìÿöÿì ÿìÿìÿìÿìÿòÿìÿìÿìÿìÿöÿì  ÿìÿìÿìÿìÿìÿöÿ÷64ÿìÿòÿíÿìÿìÿõ ÿòÿì ÿùÿð) ÿìÿõ' ÿñÿíÿõ61 ÿìÿì ÿø ÿìÿïÿú9ÿìÿìÿìÿïÿîÿúÿóÿìÿïA ÿìÿìÿýÿìÿìÿìÿýÿìÿìÿðÿìÿò$ÿìÿì 3 ÿìÿì*ÿûÿøÿìÿó ÿ÷ÿïÿìÿüÿû *ÿìÿìÿì'ÿìÿìÿìÿñBÿðÿ÷ÿìÿìÿõÿìÿìÿì&ÿùÿöÿñ%4ÿìÿì <" ÿìÿû ÿðÿì/ÿÿÿìÿìÿÿ! ÿíÿò <ÿýÿûÿóÿòÿìÿðÿìÿîÿïÿìÿþOÿÿÿì8- ÿõÿ÷ÿìÿôÿ÷ÿõÿìÿ÷ ÿìÿú ÿîÿìÿû ÿï;ÿóÿïÿìÿþÿñÿôÿìÿýÿìÿìÿìÿûG ÿïÿù"/ÿìÿìÿúÿôÿõÿìÿÿÿì'ÿþ 2 C0ÿýÿý )ÿî&ÿüÿìÿìÿþÿì  ÿìÿòÿòÿðÿñÿìÿýÿìÿÿÿìÿìÿì4ÿùÿìÿìÿìÿì"ÿýÿöÿì.,/ÿûÿì%/ÿöÿìÿúÿÿÿùÿìÿø ÿöÿìÿìÿõ":ÿìÿõÿíÿ÷ÿù'&Gÿöÿìÿÿÿöÿì ÿì8ÿ÷ÿì ÿòÿîÿìÿìÿðÿøÿùÿìÿìÿõÿìÿöÿöÿý$%ÿùÿü ÿúÿôÿÿÿøÿð ÿì ÿù/ ÿú!ÿìÿìÿ÷&ÿûÿì'$+&/ÿì ÿðÿìÿì "ÿìÿì/ÿòÿìÿïÿøÿð$ ÿìÿìÿûÿÿÿì ÿúÿìÿþÿíÿìÿöÿòÿ÷ÿý 0ÿüÿÿ ÿìÿìÿì&ÿ÷ÿð4ÿúÿû(CPÿú ÿôÿý. &)ÿûÿòÿõÿõÿìÿóÿï5ÿì/,ÿì ÿûÿþÿìÿñÿìÿìÿì ?$42ÿ÷ÿìÿìÿìÿîÿø&$ÿöÿö6ÿó'R'*&ÿí ÿøÿìÿìÿñÿìÿì&ÿúÿìÿì$"ÿÿÿúÿìÿôÿûÿìÿìÿøÿìÿì &ÿìÿìÿü13ÿïÿìÿì &ÿú#<uB $ÿìÿìÿò#%ÿìÿìÿîÿìÿìÿùÿòÿ÷8ÿì C#ÿìÿì! ÿíÿþÿìÿöÿì ÿìÿð ÿó-ÿìÿìÿõÿì(ÿý!ÿÿÿì1YY6ÿìÿû ÿìÿí ÿòÿìÿöÿìÿìÿòÿìÿìÿìÿìÿì ÿüÿìÿìÿûÿìÿì)) ÿìÿÿÿöÿìÿìÿì. ÿóÿìÿìÿìÿö ÿì@2Zc;! ÿì ÿìÿìÿòÿìÿìÿíÿü. (''ÿüÿøÿì7ÿìÿñÿïÿö1ÿ÷ÿì* ÿìÿò ÿì ÿñÿìÿìÿìÿìÿð)=lK%,3P ÿûÿìÿìÿþÿìÿì3ÿìÿìÿìÿõÿýÿìÿúÿìÿì1ÿìÿìÿì*ÿþÿìÿìÿòÿöÿìÿìÿì # ÿ÷ÿûBFVG05ÿí  ÿðÿïM#ÿøÿìÿüÿöÿôÿÿ ÿõÿôÿì#7ÿìÿìÿìÿìÿìÿøÿýÿìÿìÿõÿì8+ÿÿÿì_|gSgÿñÿì ÿñÿîÿ÷ÿíÿì ÿûÿìÿìÿìÿîÿýÿÿÿìÿì ÿý ÿìÿôÿîÿöÿìÿìÿìÿüD ÿþ$ÿþ?)%QsIaK# ÿìÿì ÿì1-ÿì Tÿì&ÿì  ÿìÿüÿùÿî4ÿûÿìÿì ÿñ ÿîÿóÿìÿñÿìÿôÿìÿìÿúCJ=2-`b%ÿû ÿìÿìÿûÿû ÿìÿìÿûÿüÿøÿÿÿì1 %ÿìÿìÿðÿùÿì!ÿòÿúÿþÿüÿìÿûÿó$ÿòÿøÿõÿö!/P‹wTgi]0 ÿôÿòÿðÿóÿñJ(ÿìÿÿÿìÿìÿì!ÿìÿú!ÿô%ÿìÿðÿìÿìÿìÿìÿìÿìÿìÿóÿì*ÿíÿìÿìÿìÿûÿìÿìÿþKŒ²}Z_\Xÿìÿì ÿïÿìÿìÿìÿì%ÿìÿö=ÿíÿìFÿìÿôÿìÿûÿìÿìÿìÿìÿì ÿýÿìÿìÿþÿìÿìÿìÿìÿìÿìÿþÿñ$; Wz#ÿìÿüÿì ÿì ÿøÿì# ÿìÿì*ÿñÿì'ÿþÿìÿì ÿìÿìÿìÿòÿúÿõÿìÿú ÿúÿìÿìÿõÿùÿý ÿìÿõÿòÿï 1<rwaR ÿø 1ÿùÿìÿìÿìÿìÿìÿìÿìÿìÿø$ÿìÿìÿì % ÿìÿóÿñÿüÿõÿìÿìÿô1<+3Tp­l/, &ÿÿÿÿÿìÿì$ÿìÿì ÿüÿõ ÿïÿìÿúÿì:ÿìÿùÿÿÿìÿìÿóÿìÿìÿöÿþÿúÿìÿóÿìÿìÿðÿøÿì 0.ÿ÷<"ÿÿ LxO4ÿõÿìÿõÿìÿìÿñÿð8ÿìÿùÿìÿì 'ÿùÿìÿìÿìÿòÿ÷ÿðÿìÿìÿìÿïÿìÿìÿôÿôÿòÿöÿìÿìÿöÿìÿú .VSETA'+$ ÿìÿìÿìÿìÿì%/ÿìÿøÿìÿìÿô&A'ÿìÿìÿöÿóÿýÿìÿìÿù(ÿüÿð/ÿú  yš¤v<ÿïÿúÿìÿìÿìÿðÿø ÿýÿì),ÿìÿìÿìÿìÿ÷-ÿøÿîÿö ÿýÿûÿöÿú ÿñÿìÿñÿì-8ÿìÿì@LMOb–xZR'ÿùÿ÷ÿúÿöÿíÿìÿìÿì5ÿýÿí ÿýÿìÿüÿñÿì D&ÿøÿìÿìÿìÿñ22ÿí#ÿóÿó0 ÿñÿìÿìÿìÿíÿì/" #Kblh…e@ ÿìÿý/U"ÿøÿìÿìÿìÿì A- ÿìÿìÿñÿìÿìÿì9ÿìÿìÿìÿìÿìÿï 6ÿìÿîÿì / >f;Eyl4N5(ÿìÿÿÿìÿì< ÿøÿòÿüÿù ÿì9.ÿìÿìÿðÿüÿù ÿöÿõÿüÿõÿúÿìÿû#>Q9,I0FO--VG*ÿìÿÿÿôÿìÿõÿôÿìÿìÿìÿþÿì"ÿìÿùÿõÿôÿìÿðÿôÿí ÿìÿø ÿïÿìÿÿHÿì! ÿùÿù *A[DD8>A.ÿþÿý .ÿöÿú ÿíÿòÿìÿìÿìÿî&(1ÿì!ÿñÿìÿîVÿìÿìÿìÿìÿòÿôÿíÿìÿì ÿü/":"3,/Omi"6@.ÿþÿô!(ÿìÿþÿ÷ÿìÿùÿì ÿüÿìÿöÿìÿìÿþ ÿõÿìÿø5ÿì#ÿúÿìÿìÿìÿì ÿøÿìÿù8+8ÿî ''.Ehf;VVE ÿûÿìÿìÿìÿìÿþÿðÿìÿñÿìÿÿ ÿìÿ÷ÿ÷%Aÿóÿòÿìÿíÿüÿìÿÿÿìÿò !/6ÿìÿû)ÿì ÿøÿ÷(ob== , ÿýÿìÿìÿì)ÿðÿìÿì ÿìÿüÿìÿìÿò ÿùÿìÿùÿúÿìÿìÿìÿùÿîÿþÿðÿôÿö ÿìÿúÿìÿì ÿõÿò!>ÿì9*ÿú ÿìÿìÿì-*ÿìÿñÿìÿìÿìÿø '3ÿìÿðÿìÿìÿð#ÿîÿîÿìÿìÿó ÿÿÿÿ + % ÿû#ÿóÿìÿúÿùÿòÿìÿìÿýÿþÿüb_ÿîÿìÿúÿòÿîÿìÿýÿøÿìÿìÿÿÿýÿìÿìÿìÿì )ÿôÿìÿìÿìÿó ÿïÿì&ÿï&!ÿìÿ÷ÿþÿìÿìÿìÿüÿíÿôÿì7ÿöÿñÿìÿþÿîÿõÿìÿìÿìÿìÿñÿìÿìÿì ÿõÿý(#ÿìÿôÿìÿìÿìÿøÿï"ÿìÿõ/4ÿüÿúÿíÿì)ÿøÿì$ÿúÿì<ÿòÿìÿì!ÿì  ÿìÿìÿì(ÿìÿñÿìÿì%ÿúÿöÿúÿì)ÿìÿìÿìÿìÿùÿìÿòÿî B#ÿìÿìÿöÿìÿ÷ ÿì ,ÿì  ÿîÿ÷ÿìÿìÿì"ÿìÿô= .ÿøÿìÿþF0ÿìÿó, ÿìÿö&ÿòÿúÿìÿùÿì ÿìÿðÿ÷#ÿõÿý? ÿìÿìÿìÿý ÿìÿìÿìÿì .-ÿìÿñÿìÿþÿöÿìÿìÿìÿïOÿùÿôÿìÿìÿìÿìÿìÿìÿõ %ÿìÿìÿì(ÿôÿðÿóÿúÿøÿý-ÿíÿñÿìÿôÿìÿìÿþÿÿÿìÿì&! ÿñÿìÿìÿüÿÿÿì&ÿøÿø ÿì  ÿìÿõ+ ÿõÿò ÿð ÿþÿìÿì7* ÿïÿì ÿÿÿìÿü ÿìÿñÿìÿìB.ÿìÿìÿ÷*)ÿýÿìÿõÿñÿìÿì$ ÿìÿü"ÿú, ÿì ÿìÿñ"ÿòÿìÿìÿð$0ÿõ /5)ÿÿ ÿìÿôÿüÿõÿö ÿìÿìÿìÿì0-ÿý4 ÿìÿìÿó ÿó ÿó>ÿö ÿûÿìÿìÿïÿþÿôÿõ"ÿðÿôÿìÿì)ÿìÿôÿìÿðÿý'ÿöÿì2ÿìÿìÿìÿìÿþÿìÿìÿø ! ÿõÿüÿö ÿìÿÿÿìÿìÿõÿïÿìÿìÿì %ÿöÿîÿð 7ÿì<9ÿìÿì7ÿþÿìÿìÿôÿìÿíÿìÿý ÿìÿì&ÿìÿóÿñÿìÿúÿìÿìÿì3*ÿüÿýÿï,ÿìÿìÿìÿìÿìÿìÿÿ4ÿìÿïÿú ÿìÿìÿüÿîÿìÿìÿýÿì<ÿý2%ÿì ÿöÿìÿíÿ÷ÿìÿû ,!* ÿøÿì ÿìÿìÿìÿïÿÿÿì ÿíÿìÿìÿî &ÿóÿÿÿ÷ÿìÿìÿþÿìÿìÿíÿìÿìÿìÿìÿìÿìÿöÿò"ÿûÿíÿì/ÿÿÿìÿú" ÿùÿùÿí, ÿû8ÿìB@ ÿìÿìÿ÷'ÿìÿì ÿñ ÿôÿñÿý+ÿðÿì ÿìÿüHÿìÿìÿòÿìÿò3ÿìÿ÷ÿìÿìÿôÿìÿìÿì ÿðÿüÿóÿìÿì' ÿü  ÿô ÿñÿìÿíÿîÿìÿÿÿõÿòÿìÿì*ÿþÿý ÿìÿìÿûÿøÿìÿìÿüÿñ ÿìÿìÿì ÿõÿìÿþÿìÿì0ÿöÿíÿìÿìÿü3 ÿú ÿü!ÿï ÿôÿøÿì ,ÿþÿþ. ! ÿõÿñÿìÿö ÿìÿìÿìÿìÿì$ÿÿÿìÿìÿöÿìÿùÿìÿìÿìÿøÿü6ÿùÿûÿìÿö)ÿü%+%ÿìÿìÿíÿì ÿÿÿøÿìÿì,8ÿô ÿû&ÿìÿò.ÿö ÿøÿúÿûÿõÿ÷ÿ÷ÿì)ÿìÿñÿöÿù &ÿù+ ÿìÿìÿøÿüÿì-5ÿó ÿøÿí 'ÿìÿýÿúÿìÿìÿüÿø ÿôÿìÿìÿñÿìÿþ ÿöÿìÿìÿì .ÿôÿýÿìÿõÿìÿøÿìÿîÿìÿìÿìÿðÿìÿíÿüÿöÿ÷ ÿì+ÿÿÿìÿì-ÿøÿüÿø)(ÿÿÿôÿìÿþÿìÿðÿïÿí ÿìÿüÿö ÿõÿï ÿü/'.ÿìÿì"ÿûÿöÿïÿìÿûÿìÿìÿìÿìÿî$ÿýÿìÿùÿø5ÿìÿìÿöÿìÿúÿýÿõÿìÿø ÿîÿìÿìÿúÿÿÿðÿöÿðÿþÿìÿï(ÿú"ÿìÿòÿìÿìÿìÿöÿõ"ÿôÿýÿýÿõ20ÿñÿñ+ ÿóÿò30ÿìÿÿ3 ÿþÿù$ÿ÷ÿì ÿðÿûÿüÿùÿòÿ÷ÿóÿþÿýÿò ÿõÿþÿõ-ÿìÿìÿûÿìÿï"ÿü ÿýÿüÿ÷ÿòÿìÿí,ÿìÿìÿìÿì0ÿì#/1 ÿì!Cÿìÿýÿíÿì ÿòÿý ÿòÿïÿì"ÿìÿì ÿìÿìÿü4ÿìÿîÿþÿñÿì9ÿìÿìÿìÿì,ÿìÿìÿî ÿìÿì&Zÿóÿìÿòÿìÿì ÿìÿþÿòÿìÿþÿøÿìÿõ  ÿìÿüÿìÿìÿì#F9ÿìÿîÿüÿìDÿìÿÿÿÿÿìÿì;ÿìÿì!ÿìÿì1)ÿýÿìÿì?ÿöÿìÿì ÿñÿõÿîÿìÿìÿôÿìÿðÿ÷-ÿýÿì .ÿùÿìÿìÿìÿù+ÿòÿìÿì)ÿ÷%ÿìÿì-4ÿñÿì ÿùÿì-).ÿôÿìÿùÿìÿì8ÿú 2 #ÿüÿìÿìÿìÿòDÿð-2ÿý ;ÿþÿìÿìÿìÿü!ÿìÿìÿìÿì#ÿöÿìÿìÿïÿï $ÿìÿìÿîÿì"ÿñ2ÿó  ÿðÿì(ÿþÿøÿûÿùÿìÿîÿþÿïÿìÿõ ÿìÿì ÿìÿì ÿÿ6ÿì#ÿ÷ÿóÿìÿõÿôÿìÿìÿû'ÿï(ÿìÿìÿøÿì # ÿìÿü( ÿìÿìÿìÿìÿì( ÿõÿìÿõÿö;4ÿìÿìÿìÿìÿìÿìÿì  ÿü'ÿìÿìÿìÿì ÿíÿö# ÿìÿìÿõ ÿùÿìÿùÿþÿîÿ÷ÿì ÿûÿù ÿùÿìÿìÿìÿùÿìÿìÿìÿ÷%+ÿì ÿü$ÿöÿóÿú ÿÿ^aÿìÿìÿøÿìÿïÿíÿú ÿìÿìÿñÿìÿìÿìÿ÷ ÿòÿíÿìÿì # ÿðÿìÿìÿüÿóÿìÿì#+ÿìÿõÿøÿÿÿìÿìÿüÿýÿìÿìÿìÿûÿý!:ÿñÿüÿîÿì%(ÿòÿìÿô %!ÿñÿïÿò' ÿìÿüÿïÿóÿï?$ÿìÿìÿîÿüÿìÿôNÿìÿì+ÿôÿìÿìÿìÿüÿîÿúÿìÿþÿøÿìÿìÿïÿìÿòÿûÿ÷ÿìÿñÿìÿôÿñÿíÿï$ÿðÿìÿíÿü$)ÿûÿìÿìÿìÿóÿìÿñ!ÿìIÿìÿïÿìÿîÿìÿþÿüÿìÿìÿð"-ÿþ)< , ÿðÿ÷ÿô,;*ÿò ÿûÿì)ÿù)ÿñÿö8 ÿþÿìÿõÿü:ÿìÿûÿö ÿìÿìÿúÿìÿðKÿþÿý'3?ÿüÿþÿýÿìÿìÿíÿòÿöÿìÿì ÿýÿõÿìÿôÿøÿöÿúÿúÿðÿðÿí" ÿðÿï ÿíÿìÿìÿìÿìÿìÿóQÿìÿì +ÿùÿøÿï ÿóÿõÿó ÿö/!ÿìÿö(44ÿö +ÿû.ÿöÿ÷ÿÿÿìÿìÿõÿíÿý.'ÿìÿìÿìÿúÿÿÿìÿìÿîÿìÿüÿìÿìÿøÿìN ÿìÿìÿì ÿìÿö3ÿúÿöÿìÿÿ' !) ÿøÿñÿóÿì ÿòÿìÿûÿìÿþÿïÿìÿì )ÿìÿìÿìÿìÿù#ÿìÿ÷ ;ÿìÿðÿî+ÿöÿúÿìÿø ÿìÿì ÿìÿø''Hÿøÿì&ÿòÿìÿòÿþÿòÿùÿûÿýÿûÿóÿìÿðÿøÿõÿú)$ÿúÿùÿòÿìÿìÿýÿó 8#'& ÿï "ÿñÿ÷ÿõÿþÿòLÿÿÿíÿìÿñ ÿóÿìÿþ)ÿì ÿû & ÿìÿýÿì +.ÿìÿì ÿïÿ÷@7&ÿôÿñÿìÿì$ÿìÿý-ÿí(:Jÿôÿìÿì"+2<ÿÿ ÿï  ÿþÿöÿ÷ÿüÿüÿìÿìÿí!ÿíÿîÿìÿìÿìÿì"=1ÿìÿì ÿìÿìÿó#:ÿù  ÿý&4\( 91& ÿìÿú ÿïÿìÿüÿìÿìÿ÷ÿö ÿì ÿîÿìÿøÿìÿì ÿìÿò"ÿìÿìÿîÿùÿìÿìÿùÿü."">; `[2ÿìÿìÿìÿìÿòÿìÿùÿúÿìÿóÿøÿþÿìÿú4ÿýÿìÿì$#ÿì)ÿðÿÿÿóÿì ÿìÿð$  ÿúÿìÿì ÿìÿì)<%=K%  'ÿûÿì ÿìÿìÿìÿøÿÿÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìÿìH.ÿìÿùÿôÿìÿìÿøÿìÿìÿóÿìÿìÿìÿìÿìÿì XYAzn(ÿùÿöÿïÿìÿìÿõÿìÿìÿï/ÿþÿìÿì , ÿô,>ÿýÿþÿùÿöÿï6ÿïÿþ(ÿìÿû( ÿìÿì2)8ÿþÿúÿîÿìÿìÿðÿù=PT )4*ÿÿÿìÿíÿíÿì# ÿìÿìÿû +ÿìÿìÿìÿ÷ÿõ$ÿõÿûÿöÿìÿìÿôÿìÿíÿì =ÿðÿþ)ÿòÿìÿì &2$Z[J8&ÿû +/ÿûÿÿ *2 ÿì[:ÿì ÿýÿùÿìÿìÿúÿì#Kÿïÿúÿìÿòÿìÿìÿþÿöÿøÿûÿìÿý ,B'&Q€ˆ92ÿõÿôÿíÿñÿìÿúÿôÿìÿìÿ÷ÿóÿïÿìÿøÿþÿìÿìÿì !'ÿôÿìÿíÿþÿýÿìÿìÿõÿìÿìÿìÿû-!ÿì ÿïÿì %+//:GLc.;2ÿì ÿìÿôÿøÿì#ÿì Lÿìÿþÿìÿô ÿïÿìÿì/ÿûÿìÿþÿþÿì'ÿþÿìÿìÿìÿìÿìÿìÿì)4@|P-K?ÿìÿìÿ÷ÿìÿìÿþÿýÿþÿðÿôÿþÿóÿìÿýÿíÿõ!!ÿìÿìÿü(ÿõÿì3ÿíÿìÿì ÿÿ ÿýÿõÿÿÿú-D}»l!,ÿø ÿù ÿòÿìÿýÿï3@& ÿìÿøÿðÿìÿûÿù/ÿìÿûÿôÿîÿìÿìÿïÿìÿìÿñÿ÷2$ÿðÿò ÿöÿìÿðÿõ ÿñÿì!€¦ŸE 'ÿìÿì ÿúÿìÿìÿí,ÿìÿô*ÿïÿñBÿìÿìÿìÿö ÿìÿìÿûÿì ÿìÿìÿñ' ÿïÿìÿðÿ÷ÿøÿùÿìÿÿ ÿú(C#*-išŒTÿîÿìÿûÿìÿþÿìÿý ÿìÿøÿìÿöÿìÿò*ÿðÿû%0ÿìÿìÿòÿìÿìÿõÿìÿïÿìÿïÿìÿìÿ÷ÿðÿòÿø ÿó$#ÿú &2W]h!$ÿ÷ ÿì% -ÿÿÿìÿìÿìÿìÿìÿò3 ÿìÿì4 ÿìÿòÿ÷ÿÿ-ÿìÿì/ÿÿÿíÿñ( !ÿìÿìÿõÿò ?#0!ÿúÿÿPx¡\(ÿþÿìÿùÿìÿìÿøÿðÿìÿìÿúÿîÿìÿöÿìÿìÿìÿìÿì"ÿìÿì ÿøÿìÿÿÿøÿôÿìÿîÿþÿìÿìÿìÿúÿì>%!6ÿóYw1ÿìÿì#ÿìÿìÿóÿýÿì ÿíÿìÿìÿûÿìÿìÿìÿÿ ÿïÿøÿôÿñÿüÿìÿö#ÿí ÿø%<\igS^Eÿú ÿüÿþÿìÿìÿñÿìÿì 3ÿôÿÿÿôÿì+36ÿý  "ÿû ÿûÿìÿõÿìÿìÿú>+ ÿïÿì!2(.(!>Ÿº¢£t2ÿûÿóÿòÿìÿìÿûÿìÿöÿöÿÿÿìÿìÿìÿìÿíÿìÿì#ÿìÿìÿíÿíÿíÿóÿì ÿìÿø/MLÿõ .#BttkuhŠO#()ÿìÿìÿü ÿúÿüÿìÿïÿì=ÿìÿìÿìÿøÿï!./ÿýÿìÿñ ÿí +ÿíÿì ÿÿÿõ ÿîÿìÿóÿó 8 WI!8bsO4iA ÿïÿìÿû)(Aÿìÿðÿøÿìÿìÿû6"ÿìÿìÿì.ÿøÿìÿìÿìÿóÿøÿìÿìÿô &BK7ÿö ?=,]=/HEUf0 /Cÿìÿñÿýÿíÿø1ÿý ÿìÿÿÿûÿì%+ÿõÿñÿô# ÿõÿìÿôÿýÿòÿöÿû ÿü* G`ZL_kA0ÿ÷ÿøÿìÿìÿøÿìÿìÿìÿý ÿì*ÿìÿóÿüÿìÿóÿìÿïÿìÿðÿñ-ÿì ÿìÿÿ4+JQffI>ÿñÿìÿìÿì"ÿíÿìÿÿÿìÿì#.=@ÿì'ÿìÿìÿìO!ÿìÿìÿìÿì ÿìÿìÿìÿùÿìÿì!'ÿýÿü:&JIV`fDDIÿúÿõÿñ ÿú. ÿìÿìÿìÿìÿì! ÿìÿìÿüÿì10ÿôÿìÿìÿìÿìÿóÿìÿìÿïÿðÿìÿì ÿñÿøÿù8:=*ÿì+:CB$:F &*  ÿìÿìÿìÿì ÿóÿîÿôÿîÿìÿìÿðÿñÿì*G7Uÿïÿôÿòÿóÿü"ÿìÿòÿ÷ÿìÿìÿ÷ 6:ÿò +ÿìÿø!9' 'ÿþÿìÿïÿýÿõÿìÿìÿìÿìÿìÿûÿúÿöÿìÿìÿíÿîÿì+ÿìÿî) ÿýÿùÿìÿúÿôÿìÿìÿìÿìÿìÿ÷ÿõ, 'ÿûÿìÿöÿì ÿìÿì ÿîÿìÿøÿìÿìÿì !(ÿìÿìÿìÿó ÿôÿìÿìÿúÿì/ÿø 1 ÿìÿÿ)ÿìÿöÿùÿìÿìÿìÿìÿûÿîIÿôÿñÿìÿöÿìÿòÿìÿôÿøÿìÿìÿìÿìÿìÿóÿûÿõÿìÿùÿýÿìÿïÿìÿü&ÿþÿøÿý!(ÿùÿùÿõÿùÿøÿìÿìÿìÿñÿøÿóÿìÿïÿóÿðÿ÷ÿì ÿòÿì 3ÿïÿòÿíÿï ÿÿÿû ÿõÿøÿìÿìÿíÿü5 ÿúÿúÿøÿìÿì(ÿø$ÿüÿû"& ÿîÿìÿì$ÿìÿìÿìÿùÿì ÿìÿìÿìÿúÿìÿìÿùÿìÿû5:ÿöÿìÿì($ÿìÿùÿñÿìÿì ÿìÿìÿìÿø7ÿõÿü,ÿøÿìÿìÿì4ÿì'ÿöÿìÿìÿóÿðÿìÿø"ÿìQÿìÿô'ÿì3ÿìÿîÿìRÿÿÿîÿìÿøÿìÿìÿì&ÿû/ÿøÿìÿìÿìÿìÿðÿø ÿìÿìÿìÿíÿíÿòÿÿ ÿñÿúÿì..ÿìÿýÿóÿìÿü4ÿÿÿñÿìÿíÿìÿÿÿìÿìÿõÿöÿøÿô$ÿóÿìÿìC ÿìÿíÿìÿì.ÿîÿòÿìÿôÿúÿö ÿì( ÿùÿì ÿìÿìÿìÿïÿöÿìÿÿÿìÿõÿùÿð ÿì ÿøÿô ÿìÿì;' ÿìÿõÿûÿìÿúÿìÿì I$ÿìÿüÿìÿõÿúÿìÿì&ÿìÿô("ÿý ÿìÿì#/ÿì ÿòÿìÿ÷ÿøÿñÿìÿìÿøÿì ÿù*(ÿõ ÿìÿì # ÿþÿìÿìÿìÿöÿì'Eÿìÿñÿìÿÿ#ÿûÿó ÿþ;ÿýÿöÿìÿñÿìÿìÿòÿýÿìÿ÷)ÿìÿì"ÿì ÿìÿì -+ÿìÿìÿ÷ÿìÿõ0 ÿìÿúÿóÿüÿìÿìÿìÿìÿý! ÿùÿÿ $ÿôÿñÿìÿìÿûÿìÿñÿìÿìÿýÿüC!ÿýÿóÿì ÿï,0ÿìÿì7ÿïÿúÿúÿìÿìÿïÿöÿìÿö ÿüÿìÿìÿìÿìÿÿÿìÿì 5ÿú #ÿûÿñ ÿòÿìÿìÿìÿì!ÿìÿýÿù ÿìÿìÿìÿìÿ÷ÿìÿîÿì2 ÿ÷ÿìÿ÷ÿìÿìÿìÿìÿü ÿìÿì+ ÿìÿìÿìÿöÿìÿìÿÿÿìÿìÿì1ÿü#ÿ÷ÿù ÿõÿìÿïÿìÿìÿìÿìÿìÿìÿìÿìÿìÿîÿ÷ÿúÿöÿóÿú&ÿìÿíÿû,ÿù+ÿðÿì0)ÿüÿìÿîÿð @ÿñÿì$ÿü ÿñÿöÿðÿì&39ÿìÿìÿìÿìÿý ÿì'ÿìÿìÿìÿíÿíÿìÿìÿì5ÿþÿïÿñ$ÿìÿö2 ÿìÿøÿù(ÿõ ÿïÿöÿý$%ÿìÿïÿìÿìÿìÿõÿø, ÿÿ" ÿìÿìÿðÿìÿìÿìÿöÿìÿÿÿðÿøÿ÷ÿìÿì 1ÿìÿíÿìÿøÿìÿìÿìÿõ&ÿýÿýÿñ < ÿîÿû(1ÿìÿì **!ÿöÿûÿïÿìÿÿ ÿ÷ÿñÿïÿûÿìÿìÿìÿîÿìÿì%ÿìÿìÿùÿò ÿïÿùÿø,ÿñ.ÿìÿþ ÿùÿìÿî1')ÿìÿì (!ÿþÿìÿìÿ÷- .6ÿìÿïÿìÿìÿû1ÿÿÿ÷ÿÿÿìÿìÿìÿþÿìÿ÷ÿóÿÿ.@ÿüÿï$ÿìÿìÿìÿ÷ÿñÿì'ÿìÿì ÿ÷ ÿìÿìÿñ!ÿìÿø"ÿìÿì ÿìÿúÿìÿìÿìÿìÿì ÿûÿìÿìÿìÿìÿö ÿðÿìÿðÿüÿýÿìÿìÿùÿü ÿí !ÿü ÿóÿø/ÿýÿìÿí& #ÿðÿÿÿòÿó9"ÿúÿô  ÿìÿøÿø ÿìÿùÿÿÿùÿìÿì$ÿìÿ÷ ÿìÿìÿñD+ÿìÿìÿú ÿìÿñÿøÿ÷ÿüÿøÿìÿì"ÿÿÿï#* ÿý ÿôÿìÿìÿýÿðÿìÿúÿìÿìÿ÷ÿòÿìÿìÿúÿìÿóÿì ÿú8<ÿíÿìÿû.ÿìÿóG'ÿì ÿìÿìÿðÿ÷ÿó2ÿÿÿìÿøÿüÿí &ÿú.%(ÿìÿû(ÿûÿï( ÿòÿìÿì ÿóÿìÿìÿìÿ÷ÿñÿìÿòÿìÿìÿøÿøHÿúÿìÿìÿìÿìÿü(ÿóÿúÿñÿìÿì ,ÿòÿìÿ÷ÿüÿì ÿó:3ÿìBÿìÿñÿÿÿÿÿôÿìÿõÿñÿìÿìÿìÿìÿïÿÿÿìÿì'ÿìÿìÿòÿû#ÿû.ÿìÿìÿì( ÿìÿìÿüÿìÿñFÿðÿì ÿìÿìÿüÿìÿìÿö ÿìÿñÿì *ÿï ÿìÿõÿòÿìÿï2,ÿîÿìÿö ÿìÿì%ÿì *ÿìÿï0ÿûÿíÿûÿöÿìÿ÷ ÿìÿìAÿð ÿìÿìÿþÿóÿ÷ÿìÿìÿìÿìÿìÿìÿþ ÿúÿìÿô=ÿìÿñÿýÿú ÿúÿì ÿû'ÿìÿù&ÿñÿìÿý%ÿìÿì1! ÿìÿüÿìÿì*,ÿüÿìÿÿÿýÿìÿì%ÿÿ ÿý8ÿòÿñÿìÿìÿìÿÿ6ÿì 63ÿìÿñÿìÿìÿü)ÿì ÿìÿìÿì-ÿòÿìÿìÿôÿõ 'ÿìÿìÿìÿì ÿúÿìÿî ÿþÿìÿìÿýÿìÿñÿìÿìÿïÿúÿíÿ÷ÿì ÿóÿìÿìÿíÿìÿìÿì7ÿ÷ÿìÿýÿìÿòÿìÿìÿìÿ÷ÿìÿÿÿî$ ÿòÿþÿðÿýAÿìÿìÿìÿìÿìI3ÿøÿìÿóÿì/'ÿòÿìÿìÿø 1ÿìÿ÷ ÿìÿìÿÿ ÿú/+(ÿ÷ÿðÿìÿìÿôÿþÿöÿìÿìÿö ÿìÿìÿûÿì  ÿù ÿñÿìÿìÿìÿìÿì1 ÿìÿì%ÿýÿì(ÿúÿì ÿñÿñÿí0LOÿìÿûÿñÿìÿþ ÿìÿìÿò"ÿì ÿðÿíÿìÿìÿöÿìÿüÿðÿíÿìÿì$ÿôÿìÿìÿìÿö ÿ÷ ÿìÿìÿùÿìÿìÿìÿî)6ÿúÿü#ÿþÿì$$&ÿû? ÿïÿìÿþÿðÿþÿìÿì A"ÿðÿìÿïÿì 9ÿþÿôÿìÿì9ÿìÿøÿÿ. ÿõÿìÿùÿìÿìÿì ÿìÿÿÿó(ÿìÿì ÿó"ÿúÿìÿì#ÿøÿìÿìÿìÿôÿï$4ÿìÿó)ÿìÿîÿìÿúÿìÿìÿñÿò9ÿûÿóÿöÿìÿìÿýÿôÿ÷ 4+ÿü$$5ÿû ÿñÿÿÿïÿì ;ÿìÿìÿð ÿì 2ÿìÿúÿÿ2ÿîÿ÷ÿî(.ÿö!ÿþÿù ÿüÿìÿìÿóÿì R(&<,; ÿüÿìÿìÿíÿìÿíÿìÿìÿû-ÿìÿîÿíÿìÿõÿòÿôÿìÿð%ÿ÷ÿìÿìÿýÿðÿìÿ÷Hÿýÿìÿì(3 !,ÿìÿóÿóÿýÿï!=  !ÿð) ÿøÿ÷+ÿñÿìÿìÿìÿì6.ÿîÿìÿïÿúÿìÿòÿúÿìÿìÿìÿì'ÿìQÿïÿìÿý ,ÿíÿñÿì,H/ 'ÿöÿúÿìÿìÿìÿþÿúÿú ÿìÿìÿì &ÿïÿþÿìÿõ !ÿñÿùÿìÿò@ÿìÿøÿìÿô ÿìÿþÿìÿì< ÿø D6Ddÿôÿìÿ÷ÿþÿöÿúÿöÿôÿüÿìÿýÿìÿìÿðÿýÿìÿì ÿìÿìÿõ ÿìÿþÿõÿú >%ÿôÿõÿìÿø B /_ÿýÿìÿìÿÿÿìÿì*ÿûÿìÿú @ÿûÿìÿìÿì& ÿìÿìÿìÿì5:1ÿìÿÿÿïÿìÿ÷ÿù3I(ÿìÿü-%ÿúÿìÿï8Y11- ÿðÿÿ ÿùÿîÿîÿîAÿþ ÿóÿöÿúÿðÿòÿìÿìÿìÿô#=#ÿìÿìÿïÿìÿìÿýÿðÿíÿý!"ÿô*$+70C$ÿý$+!ÿóÿìÿô"ÿ÷ ÿòÿì ÿóÿìÿìÿûÿñÿõÿü$ÿìÿüÿìÿñÿìÿìÿï ÿù@ÿìÿìÿìÿþÿðÿ÷ÿøÿìÿìÿùÿõ ÿìÿþ-A/1ÿú+ABÿüÿìÿìÿìÿìÿìÿû ÿôÿíÿöÿì ;ÿøÿìÿì . /ÿìÿìÿì% ÿùÿìÿûÿìÿíÿïÿöÿ÷ ÿìÿìÿìÿì8RD7B3ÿòÿö "ÿ÷ÿõÿìÿìÿìÿý&ÿìÿðÿìÿíÿìÿìÿýÿýÿðÿìÿìÿìR'ÿòÿìÿþÿìÿìÿõÿìÿÿÿìÿìÿòÿÿÿìÿìÿìÿúÿìÿì-g‚_bAÿìÿìÿìÿìÿì ÿöÿìÿì* ÿìÿìÿøÿìÿìHÿøÿìÿüÿìÿùÿ÷ÿíÿìÿú 6ÿìÿôÿìÿì8H%&@7XGO0 ÿñ/7 ÿ÷ ÿóÿðÿõ,!ÿíÿùÿì ÿÿ4#ÿìÿìÿìÿïÿîÿþÿüÿìÿìÿûÿìÿìÿì 8ÿýÿïÿïÿì+-?dM2IH..)ÿþÿÿÿìÿý0*ÿý#  ÿðÿìÿòG1ÿñÿìÿïÿöÿì ÿíÿì ÿð Cÿýÿìÿùÿìÿì,<Iÿó  +DN[bICÿÿÿìÿìÿìÿìÿìÿìÿì ÿìÿìÿðÿìÿðÿìÿýÿÿÿ÷ÿìÿì1ÿìÿîÿìÿóÿìÿìÿìÿì ÿ÷))ÿìÿìÿñ*ÿýÿìÿìÿìÿìÿý=2&03ÿùÿø$  ÿñÿòÿìÿúÿìÿðÿóÿñÿû0ÿìÿì ÿì ÿý6ÿìÿì!ÿìÿòÿ÷ÿìÿòÿÿÿìÿìÿìÿìÿìÿìÿìÿìÿü"/Mr6 (ÿìÿìÿì ÿú ÿþÿìÿýÿìÿøÿû ÿìÿî " ÿðÿìÿð9ÿôÿì2ÿþ&ÿï ÿó ÿöÿìÿì -ÿÿ ,p“.ÿìÿì,ÿÿÿöÿ÷ÿìÿü ÿý &&ÿøÿìÿì ÿüÿòÿþÿìÿìÿì )ÿò ÿùÿïÿìÿìÿñÿî ); ÿð ÿûÿìÿì@d¾ŠQ ÿöÿøÿìÿÿÿìÿìÿìÿñÿýÿÿ$ ÿìÿÿ&ÿý%ÿì ÿìÿöÿìÿúÿôÿìÿìÿì ÿìÿìÿìÿìÿìÿìÿì  LŸ¹{Nÿùÿòÿìÿìÿö ÿïÿþÿüÿúÿÿÿìÿìÿÿÿ÷ÿì"ÿöÿìÿúÿìÿòÿìÿðÿìÿìÿìÿìÿ÷)+ÿìÿð ÿì ÿ÷$!  0Uj<ÿõÿñÿþÿû ÿó"ÿìÿìÿì"ÿìÿì:ÿþÿìÿúÿìÿìÿìÿòÿìÿìÿï2ÿþ ÿõÿü&.=ÿô#ÿþ, '8'ÿòÿìE–¡„:ÿôÿìÿìÿùÿìÿìÿìÿìÿþÿìÿìÿìÿõÿñÿìÿýÿìÿì ÿñÿöÿíÿò;ÿüÿìÿýÿûÿú#ÿùÿòÿìÿî6 ÿù5&P+'A4ÿì%WC ÿòÿñÿõ)*ÿìÿìÿõÿ÷ÿüÿì ÿìÿó ÿÿ ÿìÿì #ÿìÿìÿùÿðÿìÿ÷ÿýÿù ÿü)ÿöÿö?:D5&0$)C42^–vRe6ÿÿÿÿ ÿôÿöÿûÿìÿð&ÿìÿìÿìÿì2/ ÿ÷$ÿîÿûÿÿÿøÿöÿìÿì:4. '3FVN5:>(0F˜µ¢qL*ÿÿÿ÷ÿìÿñÿñÿìÿìÿì ÿïÿìÿôÿûÿõÿì% "ÿìÿìÿìÿìÿìÿìÿìÿìÿòÿõÿìÿñ):`W#4SJ@ik?;3a&ÿøÿÿ. ÿúÿö ÿìÿìÿì8ÿïÿìÿö ÿìÿíÿì( ÿòÿ÷5#ÿ÷ÿò=ÿóÿìÿ÷ÿíÿÿ BL!F= 492ÿôÿÿCÿú%ÿûÿöÿì ÿñÿìÿí*ÿìÿìÿì3ÿìÿðÿìÿìÿõÿìÿì*ÿó!?7T-78NA':^9$</*ÿúÿÿ12ÿóÿüÿûÿñÿì ÿì2ÿðÿì+%ÿõÿðÿó45ÿòÿï#ÿñÿìÿýÿõÿÿ ÿü=0:HPDR[Oÿì8ÿüÿòÿøÿîÿíÿìÿìÿùÿó ÿïÿìÿÿÿìÿìÿõÿìÿìÿìÿìÿì%ÿûÿø.&ÿìÿì%&57R/ÿöÿìÿìÿíÿìÿìÿ÷ÿìÿì -ÿîÿøÿìÿìÿì)BJÿðÿóÿôÿìÿìÿþ&<ÿìÿòÿìÿì!ÿìÿìÿì%ÿøÿìÿì08ÿìÿìÿìÿû%)*(FTÿìÿìÿñÿñÿîÿù' ÿõÿúÿìÿìÿìÿìÿóÿþ2 ÿìÿùÿíÿî/"$ÿðÿìÿìÿìÿþÿôÿìÿÿÿòÿìÿðÿìÿì ÿìÿùÿíÿìÿü(6/ÿýÿô% ÿìÿÿÿóÿöÿìÿì'ÿìÿìÿüÿúÿìÿîÿìÿñÿìÿýÿóÿìcL:ÿýÿñÿ÷ÿïÿòÿðÿñÿõÿìÿì(+4ÿì 05ÿð%ÿþÿõÿô ÿñÿì% ÿýÿûÿìÿìÿìÿìÿôÿìÿó ÿíÿìÿñ ÿû ÿìÿíÿìÿìAÿýÿìÿò@'ÿùÿìÿíÿþÿú ÿøÿñÿìÿìÿìÿ÷ÿð' ÿìÿìÿø%ÿìÿöÿì)ÿìÿìÿõÿóÿñÿìÿòÿúÿìÿìÿìÿ÷ ÿïÿìÿóÿóÿôÿõ! ÿìÿì ÿôÿòÿÿÿôÿì%ÿòÿóÿìÿìÿìÿìÿìÿìÿõ*ÿ÷ÿû(ÿìÿòÿüÿïÿìÿîÿìÿìÿÿÿìÿùÿìÿìÿì+ÿìÿóÿû,ÿòÿöÿìÿì ÿìÿùÿìÿú ÿì'ÿ÷ÿìÿþÿýÿìÿìÿìÿìÿôÿìÿöÿìÿìÿú ÿþ ÿô"ÿüÿýÿïÿ÷8ÿìÿùÿìÿìÿûÿø ÿõÿìÿü$ ÿô3 ÿìÿìÿìÿìÿÿÿùÿýÿìÿú 0$ÿüÿøÿìÿìÿìÿò&%ÿìÿìÿñÿìÿì ÿìÿìÿìÿìÿìÿû ÿòÿùÿì*)ÿþÿìÿìÿú ÿòÿò ÿìÿìÿóÿìÿìÿìÿìÿìÿÿ ÿõ ÿìÿìCÿüÿì#ÿìÿìÿþÿöÿþÿüÿìDÿì ÿüÿýÿìÿìÿï &ÿìÿý!ÿúT$(ÿìÿìÿîÿìÿý6ÿ÷) ÿìÿì;ÿìÿìÿùÿìÿìÿþÿîÿìÿôÿìÿ÷ÿúÿì04ÿñÿúÿ÷ÿöÿþÿìÿóÿìÿìÿýÿìÿòÿîÿìÿì!#ÿùÿì:ÿìÿì1ÿñÿìÿì*ÿìÿìÿì&ÿìÿÿÿìÿöÿ÷ÿüÿìÿìÿýÿì ÿìÿìÿìÿí ÿöÿóÿÿÿôÿÿ ÿìÿì."ÿìÿì'ÿìÿóÿÿÿìÿü."ÿìÿùÿì7ÿì *ÿìÿîÿôÿìÿþÿøÿñÿìÿìÿìÿöÿñÿôÿìÿì-ÿõÿìÿÿÿìÿìÿõ#ÿõ ÿìÿìÿøÿûÿì ÿìÿô  ÿìÿìÿì )ÿö ÿìÿìÿìÿûÿûÿìÿøÿù# ÿøÿðÿöÿïÿíÿìÿý$ÿì ÿìÿìÿóÿìÿìÿìÿóÿìÿ÷ÿóÿìÿìÿì ÿõÿìÿìÿø!<8ÿñÿìÿìÿìÿì-*ÿú ÿìÿúÿòÿíÿìÿì ÿüÿòÿóÿìÿìÿìÿìÿìÿíÿüÿüKÿðÿìÿìÿì ÿìÿìÿìÿý;ÿùÿõ ÿôÿìÿ÷ÿì ÿøÿþÿûÿìÿìÿìÿìÿíÿðÿûÿðÿìÿìÿð9+ & ÿù ÿìÿìÿõÿìÿþÿóÿùÿöÿìÿîÿìÿûÿìÿ÷ÿïÿì.!ÿìÿíÿþÿ÷ÿì!ÿìÿù ÿùÿþÿõÿìÿîÿ÷ÿìÿðÿìÿîÿöÿìÿíÿì 38ÿú% ÿìÿìÿõÿìÿíÿì ÿñÿìÿì;)ÿðÿìÿìÿýÿñ4ÿùÿìÿìÿìÿý ÿü%ÿíÿìÿòÿñÿö Mÿìÿö%ÿýÿøÿü ÿýÿüÿôÿìÿõ-5-= ÿìÿïÿøÿõÿìÿìÿìÿìÿò ÿú)ÿì ÿòÿüÿñ &ÿýÿìÿñ ,ÿ÷ÿü% ÿìÿìÿì*ÿø ÿìÿþ6 ÿìÿìÿïÿìÿìÿðÿõÿðÿìÿîÿìÿøÿïÿì ÿìÿõÿüÿþÿôÿìÿìÿûÿí ÿìÿîÿìÿìÿìÿìÿûÿìÿìÿìÿì ÿôÿìÿî0ÿùÿ÷$0ÿìÿì- (ÿøÿûÿþÿõÿîÿõÿþÿõÿìÿÿÿüÿìÿòÿôÿìÿìÿôÿì.0ÿìÿì /ÿûÿþÿòÿü)ÿìÿö#ÿñ*ÿöÿú+/ÿ÷ÿ÷ÿÿ ÿöÿìÿóÿô%ÿÿ>*ÿìÿíÿóÿô ÿò ÿìÿìÿû..ÿìÿ÷ÿôÿýÿìÿ÷ ÿû ÿïÿöÿìÿìÿîÿð &ÿôÿûÿìÿì&'- *ÿìÿìÿìÿûÿøÿìÿìÿûÿðÿþÿìÿìÿìÿì-ÿñÿíÿù!ÿìÿ÷"ÿðÿîÿôÿìÿñ ÿìÿíÿïÿìÿìÿð8 ÿü ÿðÿüÿòÿù:+ÿû ÿíÿìÿðÿõÿúÿý %ÿüÿüÿìÿôÿìÿð* ÿ÷ ÿ÷ÿìÿì !ÿþÿïÿóÿòÿòÿø ÿìÿì"ÿîÿñÿøÿìÿì 4ÿù,ÿìÿìÿÿÿìÿûÿìÿöÿùÿ÷ÿøÿüÿù19 ÿýÿñÿò ÿíÿìÿì ÿìÿíÿóÿÿÿìÿìÿðÿìÿîÿìÿì EAÿòÿìÿìÿî*ÿìU,ÿúÿúÿì ÿìÿì!ÿýÿìÿì ÿðÿì ÿù/6ÿì+ÿþÿü(ÿùÿùÿö &ÿð ÿüÿìÿì"ÿìÿì#ÿõÿì'ÿýÿòÿûÿìÿîÿìÿýÿúÿû'ÿìÿìÿûÿì ÿìÿ÷ÿðÿ÷%ÿÿÿüÿùÿðÿì"ÿìÿìÿú ÿþÿì ;,!ÿìÿìÿû$ÿñÿõÿìÿõÿõÿöÿì ÿöÿýÿì7ÿñÿòÿíÿüÿü&ÿìÿìÿì*'ÿîÿìÿìÿì$ ÿìÿì ÿìÿìÿþ-ÿñ&ÿìÿû# ÿïÿñÿôÿðÿûÿõÿìÿì:ÿìÿïÿþÿöÿìÿìÿÿ''ÿùÿìÿìÿðÿóÿì ÿì"Pÿ÷ÿù$ÿòÿùÿý ÿøÿìÿøÿìÿó8ÿíÿì ÿìÿìÿìÿìÿìÿÿÿìÿì!ÿøÿìÿüÿìÿüÿòÿìXÿìÿûÿòÿÿÿýÿìÿúÿþÿÿÿìÿ÷2ÿöÿùÿìÿìÿì*ÿïÿô/  ÿìÿìÿì ÿöÿì !ÿìÿù# 5ÿìÿìÿþÿÿÿô# ÿýÿ÷ÿìÿì6 ÿõ ÿìÿìÿíÿìÿìÿìÿìDÿìÿù ÿõ$-ÿøÿïÿìÿìÿõ ÿìÿöÿú'ÿìÿìÿñ ÿì?ÿìÿìÿìÿìÿóÿùÿìÿìÿøÿìÿôÿìÿìÿìÿìÿìÿõ$ÿíÿìÿÿÿýÿìÿóÿìÿûÿìÿ÷ÿñÿìÿðÿøÿñ2ÿîÿìÿîÿóÿì/ ÿìÿðÿöÿóÿìÿìG%ÿþÿõÿüÿì%$ÿìÿìÿìÿü-&ÿìÿõÿûÿìÿì ÿì5>'ÿúÿîÿøÿìÿìÿïÿûÿöÿìÿìÿìÿí ÿüÿñÿõÿì ÿìÿìÿìÿìÿòÿì<(ÿøÿìÿöÿìÿôÿõ@ÿõÿùÿìÿõÿìÿìÿì*3*ÿûÿóÿõÿìÿìÿì ÿûÿîÿì@ÿíÿìÿôÿìÿìÿìÿìÿìÿÿÿøÿúÿïÿìÿûÿì"ÿì$ÿìÿìÿì ÿûÿìÿôÿõÿìÿìÿ÷$ÿìÿìÿ÷&"#6%ÿì! 2<ÿõÿì+ÿþ ÿìÿý)ÿìÿìÿìÿìÿóÿì#ÿíÿìÿìÿì= ÿõÿìÿìÿì'ÿìÿì/!ÿõÿìÿíÿìÿìÿùÿìÿì ÿìÿþ1+# ;ÿÿ ÿîÿìÿüÿúÿ÷ ÿìÿüÿìÿú&ÿõÿìÿìÿìÿøÿîÿòÿìÿìÿ÷/&*ÿïÿìÿìÿòÿì ÿìÿøÿþMÿøÿÿ ÿñ7)$/. ÿìÿùÿì ÿìÿûÿìÿþ'ÿöÿòÿìÿì ÿì@ÿìÿøÿöÿó ÿìÿìÿì ÿúÿû1ÿñÿóÿìÿìÿìÿì`J.**ÿøÿøÿìÿìÿìÿðÿì$8ÿìÿÿÿìÿìÿïÿìÿíÿìÿö ÿü& ÿìÿûÿìÿüBÿìÿìÿì'0@'ÿù 6_D)ÿò!0ÿÿÿì+ÿöÿöÿìÿìÿùÿý5B ÿìÿìÿò ÿìÿñÿöÿôÿìÿöÿüÿþ0ÿì6ÿúÿì$( ÿóÿú77QO2=(ÿîÿñÿìÿìÿìÿìÿù#ÿìÿì ÿìÿì7!ÿýÿîÿø4ÿìÿü,0ÿ÷ÿì$ÿì ÿøÿúÿó,ÿìÿìÿìÿìÿìK%ÿ÷ÿþQ4\Mÿûÿþ ÿú ÿóÿìÿõ*ÿîÿìÿüÿñÿìÿóÿìÿìÿúÿìÿìÿöÿôÿó,ÿì ÿìÿì4-ÿìÿìÿûÿüÿìÿì ÿö.#6ÿúÿìÿìÿýÿìÿû ÿìÿìÿð(ÿñÿì)ÿìÿìÿìÿÿÿìÿìÿù ÿìÿì%'ÿìÿìÿìÿþÿö/F<ÿôÿú ÿôÿì ÿôHZÿìÿúÿü ÿóÿ÷ÿïÿì ÿìÿìÿìÿú8$ÿþ$ÿõÿþ!ÿï ÿìÿìÿìÿü)60ÿìÿìÿìÿìÿìÿøÿñÿìÿïÿúÿú9,(dN.+ "ÿìÿìÿì-5ÿì ÿìÿìÿìÿìÿùÿñÿõ'ÿöÿìÿöÿì ÿìÿìÿìÿïÿìÿùÿõÿõ%Jÿóÿìÿìÿìÿîÿòÿÿÿöÿìÿìÿìÿ÷ÿöÿþÿûP~2ÿþÿïÿû/ÿìÿíÿìÿìÿìÿìÿý ÿìÿø#ÿøÿìÿÿÿì?ÿþÿìÿì1ÿì@ÿíÿìÿìÿì ÿìÿìÿìÿìÿì$ ÿï-bT9(*&ÿüÿð $ÿìÿì ÿìÿìÿìÿþ ÿóÿìÿø#ÿìÿîÿöÿìÿìJÿôÿûÿìÿì ÿì ÿúÿðÿýÿìÿîÿì 0;5Z~7-' ÿìÿìÿþÿü ÿûÿðÿì!ÿìÿÿÿúÿìÿì?ÿÿÿùÿíÿìÿþÿìÿùÿïÿìÿðÿìÿìÿÿÿìÿøÿìÿÿ #ÿõC<9\GNN! ?1 ÿòÿõÿù *0 ÿìÿìÿìÿìÿíÿñÿ÷ÿøÿìÿìÿìÿìÿìÿó ' ÿôÿíÿÿÿìÿìÿü0\LjšP* ÿÿ  ÿíÿì ' $ &ÿúÿìÿì%ÿùÿìÿöÿöÿìÿìÿìÿìÿìÿì"ÿúÿòÿìÿû ÿí.O>VX\^2ÿðÿõÿþÿöÿõÿðÿìÿìÿì ÿõÿìÿýÿðÿìÿò+ ÿìÿì 5ÿì ÿïÿìÿüÿîÿìÿíÿìÿÿ$! ÿíÿìÿìÿìÿìÿîÿìÿìuh, ÿìÿìÿìÿñ&ÿ÷ÿì ÿìÿìÿìÿýÿíÿò ÿüÿúÿùÿõÿð ÿóÿìÿýÿì+ÿïÿì)A ÿìÿõÿïÿìÿôÿ÷ÿþÿðÿìÿìÿóÿìÿìÿì!ÿñPZG+ÿûÿ÷ÿìÿìÿìÿìÿû ÿùÿìÿì.ÿýÿìÿùÿíÿì ÿøÿìÿì "ÿö   ÿï ÿìHP¨u)ÿìÿìÿÿÿü ÿíÿìÿìÿìÿþ"ÿûÿðÿìÿìÿÿÿòÿìÿìÿì ÿìÿõ ÿýÿîÿìÿìÿìÿñ. ÿú ÿì;@“Ñ[ÿîÿõÿìÿìÿìÿìÿð #ÿìÿð.ÿùÿ÷ÿìÿìÿðÿìÿüÿþÿûÿì ÿìÿìÿìÿìÿòÿõÿìÿì  ÿÿr†_<ÿýÿìÿìÿ÷ÿý;ÿòÿìÿ÷%ÿÿÿ÷ÿÿÿòÿôÿôÿ÷ÿìÿïÿìÿìÿìÿöÿÿÿìÿìÿìÿñ +0ÿô  ÿþ(Xwaÿìÿðÿó(ÿì ÿìÿðÿì#&ÿìÿ÷%ÿìÿ÷"#ÿõÿìÿìÿìÿ÷ ÿìÿõÿì ,  '3h/,3K@5-7/:$ÿÿÿøB‰g4ÿìÿìÿýÿìÿüÿðÿìÿìÿì ÿìÿðÿìÿõ> ÿøÿìÿì"ÿí9ÿìÿìÿû #(,ÿð B'>1VdI<P?0Oc\O376 ÿíÿ÷-&ÿìÿîÿö"ÿþÿìÿì+"ÿþÿìÿìÿõÿìÿìÿìÿþÿìÿìÿ÷ÿú-5ÿó%5UKNTL7.-JU@|«»ŠUb- ÿú ÿìÿô  ÿì/ÿìÿì ÿìÿì ÿô' ÿûÿöÿïÿ÷)5<cPXKCOM,"@$83cb\B+&ÿýÿüÿìÿïÿìÿìÿìÿõ ÿìÿìÿì@%ÿ÷#ÿíÿìÿì&ÿìÿù ÿîÿò$ÿùÿòÿìÿõ,:@TP4 ,:8$1M8ÿ÷ÿìÿúÿôÿíÿü#ÿíÿìÿøÿøÿìÿì %ÿóÿñ!ÿý:ÿïÿì6ÿÿÿì ÿòÿõ )E>ÿûÿöÿøÿíÿö ÿùÿí !ÿìÿì'ÿøÿî.ÿîÿìÿì"+!ÿìÿìÿðÿúÿìÿöÿìÿìÿîÿõ'ÿìÿìÿø"ÿð"  J)$51 61ÿÿ(5ÿìÿî-ÿìÿì!ÿóÿìÿìÿìÿìÿìDÿìÿû ,ÿòH@ÿúÿì+ÿñÿì ÿûÿì' . + 8D"ÿùÿìAÿìÿõÿìÿì ÿû ÿþÿöÿüÿõÿìÿþÿìÿì!ÿö!ÿìÿûÿì ÿúÿî=&ÿì#ÿìÿìÿñ!ÿõÿý<ÿúÿðÿìÿìÿú ÿìÿìÿìÿìÿìÿù!ÿìÿýÿøÿûÿô16ÿìÿìÿìÿìÿíÿöÿìÿìÿìÿì ÿìÿìÿì*"ÿìÿüÿðÿìÿïNÿø!ÿíÿìÿðÿûÿöÿûÿýÿõÿìÿ÷ÿîÿì<0 ÿõÿì  ÿìÿìÿïÿó ÿüÿöÿì"ÿìÿìÿì&ÿüÿì  ÿìÿýÿÿÿüÿù( ÿ÷ÿìÿìÿìÿìÿíÿòÿðÿö,ÿìÿìÿìÿì ÿìÿìÿôÿðÿìÿùÿôÿøÿìfB!ÿó*ÿóÿìÿý ÿìÿì(ÿþÿîÿú$3,ÿõ;ÿìÿóÿõÿìÿûÿùÿìÿì ÿìÿìÿìÿûÿìÿòÿìÿòÿóÿ÷ÿìÿÿÿ÷ÿü #ÿìÿúÿöÿì 3ÿìÿì *ÿìÿîÿùÿüÿìÿó% ÿìÿìÿõÿìÿì! ÿìÿñ)ÿìÿñ ÿì12ÿðÿì ÿìÿìÿû 'ÿ÷ÿóÿìÿÿÿìÿñÿìÿñÿöÿøÿöÿìÿìÿìÿìÿìÿÿ ÿóÿì ÿìÿìÿìÿ÷ÿìÿîÿÿÿñÿìÿÿ ÿì"ÿìÿìÿÿÿÿÿìÿìÿì 9ÿìÿìÿþ ÿþ ÿÿÿðÿìÿöÿõÿôÿ÷ )ÿìÿþÿìÿìÿìÿý ÿìÿò'ÿùÿòÿóÿñÿìÿìÿìÿì ÿìÿïÿìÿì ÿ÷ÿòÿò +1ÿ÷# ÿíÿòÿìÿûÿõÿìÿìÿìÿõ ÿ÷ÿ÷ÿñÿùÿ÷$ÿþÿø&ÿõÿþÿìÿìÿìÿõÿíÿìÿíÿô 0" ÿìÿìÿìÿìÿñ ÿõÿìÿìÿÿ ÿìÿìÿìÿìÿìÿûÿúÿù -ÿúÿìÿìÿõÿñÿîÿìÿîÿòÿìÿøÿì ÿìÿìÿìÿòÿìÿ÷ÿõÿ÷ÿúÿïDÿì,ÿìÿùÿîÿúÿòÿìÿúÿìÿìÿý4ÿìÿýÿúÿøÿìÿìÿì ÿì-ÿô'ÿû1# @#ÿì ÿîÿìÿüÿì)ÿÿÿìÿì ÿìÿòÿìÿìÿìÿýÿìÿìÿýÿø9ÿìÿþ0ÿÿ()ÿòÿö ÿìÿòÿûÿýÿýÿìÿìÿñ ÿþÿì ÿòÿìÿìÿû,&ÿðÿü.ÿò,ÿìÿì) ÿýÿì,ÿì%ÿýÿìÿìÿìÿð,ÿìÿóÿìÿíÿüÿíÿôÿìÿùÿìÿìÿñ" ÿìÿðÿúÿûÿìÿøÿìÿì3ÿíÿú!ÿü ÿì.ÿìÿìÿû ÿìÿìÿì2ÿìÿñ! ÿïÿìÿú"ÿìÿíÿ÷ÿìÿùÿìÿìÿìÿìÿ÷ÿì'ÿìÿñÿû$ÿ÷ÿúÿðÿìÿûÿûÿìÿü+ ÿìÿ÷ÿñÿìÿìÿð+ ÿìÿý/ÿìÿìÿùÿìÿìÿôÿûÿöÿìÿùÿýÿìÿìÿõ ÿþÿûÿìÿúÿìÿìÿýÿíÿìÿì ÿóÿìÿìÿñÿìÿìÿì!*ÿìÿìÿìÿ÷ÿüÿî"ÿùÿìÿì*ÿìÿìÿì ÿõÿøÿÿÿîÿóÿöÿõÿìÿìÿñÿìÿìÿìÿô41ÿðÿðÿì)ÿüÿðÿöÿìÿìÿìÿù9ÿìÿÿÿñÿñÿìÿûÿì ÿöÿðÿìÿìÿìÿúÿìÿþÿìÿìÿíÿì%/'ÿþ%ÿìÿìÿõÿì!ÿû"ÿñÿòÿìÿ÷ÿýÿìÿìÿìÿíÿðÿì%ÿóÿï ÿþÿì ÿüÿð ÿðÿöÿíÿìÿìÿì (ÿìÿñÿì. (## ÿîÿì ÿÿÿðÿìÿùÿìCC ÿúÿìÿü6!ÿìÿìÿóÿìÿïÿûÿôÿÿÿìÿìÿíÿñÿìÿìPÿìÿìÿìÿìÿìÿû+ÿì<+) ÿúÿìÿÿ/ ÿòÿìÿìÿøÿìÿò ÿìÿõÿìÿì1ÿìÿú!ÿÿ ,ÿøÿîÿôÿìÿýÿþÿì!Aÿ÷ÿüÿõÿìÿðÿ÷ÿüÿìÿñ ÿó% ÿûÿìÿìÿýÿúÿüÿøÿôÿì ÿóÿóÿûÿìÿìÿþÿìÿìÿìÿì.ÿìÿìÿøÿìÿñ ÿòÿýÿìÿì  ÿìÿì ÿùÿìÿìÿýÿìÿìÿõÿÿÿìÿùÿûÿñÿìÿ÷ÿìÿì7?ÿì: ÿíÿìÿü1ÿìÿìÿìÿöÿñÿì% ÿôÿøÿóÿì$%ÿìÿï:ÿìÿîÿìÿü ÿìÿð ÿüÿýÿùÿìÿù"$#ÿì ÿìÿûÿì+ ÿìÿþÿðÿì ÿìÿî+*) *ÿìÿìÿìÿîÿìÿì ÿûÿùÿì ÿìÿìÿô:ÿïÿùÿù'ÿíÿüÿÿÿìÿ÷ÿì ÿñÿìÿúÿìÿþÿìÿï-$!ÿìÿìÿúÿîÿö! ÿ÷ ÿíÿìF ÿüÿìÿìÿöÿî1ÿöÿôÿûÿû ÿìÿìÿìÿþÿì ÿüÿùÿøÿì-ÿì -ÿúÿýÿòÿíÿíÿìÿìÿìÿñÿûÿûÿóÿìÿìÿöÿìÿì$ ÿìÿìÿî !ÿøÿïÿìÿìÿìÿñÿû2* ÿôÿõ ÿóÿìÿìÿì$ÿñÿ÷ÿõ ÿìÿìÿýÿòÿì 2-ÿõÿì ,2ÿòG3ÿóÿìÿìÿýÿìÿìÿìÿìÿì&4ÿöÿìÿù1#ÿì*ÿìÿìÿô <ÿìÿûÿìÿì4ÿíÿô%ÿìÿìÿúÿýÿúÿðÿýÿìÿþÿì$ÿýÿìÿìÿÿ!ÿõÿíÿì&ÿý# ÿøÿöÿúÿì,ÿÿÿìÿóÿí ÿìÿîÿþ""ÿï ÿìÿñÿòÿìÿìÿìÿìÿìÿþÿúÿìÿì.ÿòÿô5ÿìÿìÿöÿõÿùÿìÿì#ÿìÿþÿìÿìÿìÿìÿò ÿìÿì ÿìÿì)2ÿî!ÿìÿì ÿúÿìÿ÷,ÿìÿ÷?ÿìÿðÿ÷ÿíÿì:-ÿôÿìÿöÿì.ÿìÿìÿì0[ÿøÿìÿõÿö ÿìÿìÿìÿòÿúÿõÿìÿìÿìÿìÿìÿþÿìÿìÿìÿíÿìÿðÿìÿð Qÿìÿöÿôÿóÿìÿûÿÿÿìÿþÿìÿìÿì+ÿÿ!ÿôÿìÿð/ÿìÿìÿìÿÿÿìÿì ÿìÿð ÿìÿú$ÿúÿþÿï$ÿùÿìÿìÿ÷ÿûÿö ÿüÿìÿìD0ÿì ÿôÿý" ÿìÿíÿõÿõÿìÿù.ÿõÿìÿìÿìÿîÿìÿíÿìÿìÿìÿìÿþÿþÿðÿõÿìÿìÿüÿüÿúÿûÿõÿý ÿöÿíÿìÿõÿýÿìÿì%ÿü ÿøÿðI*ÿïÿìÿìÿöÿì ÿñÿüÿûÿìÿìÿú ÿòÿìÿìÿôÿÿÿñÿÿÿö&ÿíÿìÿùÿí+)A# ÿòÿûÿìÿò ÿðÿì ÿþÿìÿùÿÿ ÿòÿú$ÿìÿìÿìÿìÿõÿíÿìÿüÿíÿìÿþ"ÿýÿì ÿìÿòÿì7ÿþÿìÿüÿìÿ÷ÿìÿìÿìÿò7.8&ÿìÿìÿìÿìÿõÿìÿîÿò%ÿíÿñ ÿìÿìÿøÿýÿíÿìÿìÿñÿýÿü ÿòÿìÿìÿúÿøÿó( ÿìÿùÿþÿùÿìÿï ÿìÿìÿìÿìÿì#E,/!ÿì +ÿüÿìÿ÷ÿìÿì ÿÿÿì, ÿìÿìÿìÿñÿøÿìÿôÿùÿìÿìÿìÿô ÿìÿìÿòÿùÿìÿì'ÿøÿìÿúÿïÿðÿìÿô!-F4Dÿü ÿñ ÿüÿúÿüÿíÿ÷ÿþÿüÿìÿú 1ÿøÿôÿõÿÿÿìÿîÿìÿìÿñ&=)" ÿôÿìÿìÿîÿûÿìÿøÿìÿþ( Kÿñ %Ia?5# ÿìÿðÿ÷ÿùÿù$%ÿìÿìÿ÷ ÿýÿùÿûÿïÿìÿúÿùÿìHÿìÿìÿì ÿþBÿìÿôÿîÿìÿì ÿöÿú6ÿöÿìÿìÿý#ÿÿ  8eRK $ÿõÿÿÿòÿì$ÿõÿøÿþ,ÿóÿûÿÿÿïÿþÿüÿìÿìÿô#:ÿö#&ÿñÿíÿúÿúÿù-ÿíÿìÿìÿìÿì%:I%.5gko*ÿí%9 ÿöÿìÿï#ÿìÿõÿìÿíÿìÿüÿì '$Dÿìÿìÿìÿìÿìÿìÿìÿöÿì!ÿòÿõÿô ÿï%ÿõÿôÿù%ÿÿ ÿþ =PM=?R03ÿúÿìÿì ÿõÿìÿìÿøÿýÿ÷ ÿìÿìÿüÿíF ÿìÿìÿìÿø?3 ÿìÿý%ÿþÿìÿìÿïÿûÿîÿòÿì"'ÿñÿìÿìÿìÿþL$ÿõÿìCÿüÿþÿûÿø!ÿìÿì ÿìÿü ÿï ÿì ÿöÿøÿìÿñÿìÿûÿü,ÿô ÿìÿì/ÿì$"!ÿìÿìÿöÿóÿø, $ÿöÿø ÿõÿñÿùÿìÿì ÿì ÿìÿìÿÿÿúÿìÿìÿíÿüÿìÿìÿúÿìÿìÿìÿôÿýÿúÿíÿùÿìÿìÿðÿñ(1ÿò0$0Bÿôÿìÿìÿíÿòÿüÿûÿüÿîÿüÿìÿòÿìÿìÿúÿù8ÿýÿïÿüÿìÿíÿìÿöÿþÿö1Bÿìÿìÿìÿìÿñÿìÿþ ÿìÿìX'.[>/ÿþÿý ÿìÿìÿì#ÿÿ ÿúÿòÿýÿì ÿðÿï!ÿì ÿûÿìÿõÿì3ÿìÿìÿïÿìÿìÿì=Cÿúÿìÿìÿìÿìÿò ÿìÿìÿì 3Pg"ÿôÿûÿþÿïÿì ÿìÿìÿôÿìÿóÿþÿóÿìÿìÿí%'ÿø,ÿøÿì ÿìÿïÿì/ÿìÿìÿúÿì%&ÿìÿìÿìÿì " <+.9O: ,ÿï ÿìÿìÿîÿùÿ÷ÿðÿìÿóÿìÿì(ÿìÿì3ÿûÿ÷ÿï7 ÿíÿìÿö ÿü%ÿóÿýÿùÿõÿì6Mz`$5G%ÿìÿìÿìÿýÿóÿûÿìÿìÿÿÿðÿì#ÿïÿì "ÿñÿì"ÿìÿíÿúÿìÿîÿú  ÿìÿ÷ÿþÿìÿÿÿìÿû' !!Qws`" (7 ÿý *ÿóÿóÿú#ÿì&ÿù ÿìÿìÿìÿì+ÿìÿì# ÿìÿîÿ÷ ÿìÿìÿìÿõÿùÿúÿÿÿõÿð W©}l“ ÿïÿìÿìÿìÿ÷ "ÿô ÿìÿÿÿõ7ÿìÿí+ÿõÿì ÿöÿìÿìÿÿÿìÿìÿìÿìÿì ÿïÿì ÿþÿìÿý ÿõ-ÿñÿþ>šoG7ÿþÿíÿìÿìÿñ  ÿðÿìÿìÿìÿ÷ÿì,ÿìÿìÿó#ÿìÿìÿí& ÿìÿÿÿøÿìÿìÿÿÿö%ÿñÿðÿìÿìÿì ÿìÿì&ÿÿÿì+’t"ÿíÿìÿùÿþ( ÿóÿýÿìÿïÿìÿìÿîÿûÿìÿ÷ÿôÿûÿìÿìÿìÿìÿýÿû0L ÿ÷ÿìÿòÿìÿòÿìÿìÿíÿìÿìÿ÷ÿù;+C†h ; ÿúÿìÿúÿüÿìÿø ÿì! ÿìÿì$ÿþÿüÿóÿÿÿìÿìÿìÿô <#ÿü% + ÿþÿý ÿî=I–8ÿìÿô  ÿìÿñÿóÿõÿìÿìÿìÿì ÿô ÿú ÿìÿìÿìÿìÿû  ÿùÿöÿÿ8#ÿõÿö ÿìÿíV¢›3ÿìÿìÿöÿìÿìÿìÿý ÿì90ÿìÿõ.ÿðÿì.ÿìÿìÿöÿùÿì ÿó,ÿö01 ÿòÿìÿì .$DŒ<0ÿìÿóÿõÿì ÿøDÿìÿìÿñÿìÿúÿþÿù!!ÿìÿðÿõ ÿ÷ÿìÿìÿøÿìÿÿ;F>0),75 ;€yT ÿìÿìÿì ÿìÿûÿþÿñÿÿÿìÿü"ÿúÿðÿ÷ÿìÿìÿìÿìÿìÿñÿì :?48!]YsN>7UcqQL]|U:&nˆT;"ÿìÿìÿìÿðÿüÿìÿøÿìÿðÿñÿì 5*ÿòÿì&' <ÿìÿò $29/6670OCf`PCd{„‡‰œ€g[1ÿÿ "ÿòÿòAÿìÿìÿôÿì ÿüÿì*7!ÿñÿñÿìÿìÿìÿüÿìÿìÿìÿðÿú"-A N]I9=L>:BY…ަ€PB%ÿþÿòÿõÿìÿìÿöÿö'$=ÿìÿìÿìÿð!ÿ÷ÿñ ÿþÿìÿì.-. -'TMC9)."ÿð# / ÿñÿñÿì%ÿìÿòÿðÿóÿìÿíÿì6ÿó$ÿìÿìÿïÿì%ÿìÿñ ÿìÿÿÿûÿïÿôÿð 025(ÿï 7ÿöÿìÿü'ÿìÿìÿþÿÿ ÿÿ ' ÿ÷ÿìÿóÿìÿý.>ÿìÿû ÿìÿì)&ÿøÿìÿíÿüÿìÿôÿìÿìÿüÿÿL:ÿìÿìÿìÿìÿìÿìÿõÿõÿóÿñ ÿì ÿôÿöÿïÿìÿî0#ÿôÿöÿì ÿìÿì,>3ÿóÿìÿîÿüÿöÿìÿüÿìÿìÿì.ÿìÿï) /ÿÿÿûÿðÿö*ÿü# ÿ÷ ÿìÿìÿì ÿìÿìÿùÿìÿìÿì!ÿþWÿôÿìÿÿ0ÿì$Cÿìÿìÿü% ÿìÿìÿóÿúÿì ÿìÿìÿñÿÿ ! ÿûÿì2ÿýÿì!2ÿìÿÿÿúÿìÿî ÿöÿìÿùÿì+ÿìÿìÿìÿìÿÿ ÿôÿîÿìÿüÿ÷ÿø,ÿì#ÿõÿÿÿìÿô##ÿìÿìÿì!ÿøÿìÿ÷ÿìÿöÿìÿòÿìÿñ ÿ÷ÿüÿìÿìÿüÿóÿúÿüÿüÿî ÿìÿì ÿïÿìÿìÿìÿìÿìÿÿÿìÿìÿìÿì!ÿüÿí ÿôÿïÿòÿøÿìÿûFÿø'ÿîÿ÷ÿìÿòÿðÿ÷ÿòÿì ÿöÿìÿìÿìM;ÿ÷ÿöÿìÿûÿþ ÿìÿì  ÿýÿì ÿìÿìÿùDÿÿÿì ÿì ÿóÿìÿì ÿü<ÿïÿóÿìÿþ ÿìÿì  ÿìÿðÿìÿìÿìÿïÿóÿìÿü ÿìI)%-ÿüÿì4ÿìÿìÿû$ÿôÿì ÿú !ÿì/(ÿøÿìÿöÿìÿýÿì ÿñÿìÿñÿ÷ÿìÿñÿóÿöÿìÿìÿõÿìÿûÿìÿìÿìÿóÿì-ÿìÿîÿìÿï ÿîÿìÿøÿø ÿó ÿöÿì ÿïÿìÿöÿìÿì 'ÿì ÿì2ÿòÿìÿúÿìÿûÿüÿû2ÿýÿìÿðÿòÿìÿÿÿ÷ ÿîÿ÷ÿÿÿýÿú ÿìÿìÿìÿìÿö 0ÿìÿìÿìÿìÿñ+ ÿóÿìÿþÿõÿýÿì-ÿìÿìÿôÿöÿñ ÿóÿìÿì7ÿìÿì1ÿìÿþÿìÿïÿòÿìÿîÿì)ÿöÿìÿìÿìÿø ÿìÿìÿôÿøÿõÿ÷ ÿóÿìÿìÿùÿÿÿì"ÿìÿó ÿñ ÿìÿ÷ÿü:/ÿù  ÿìÿìÿìÿìÿøÿúÿìÿìÿûÿøÿìÿìÿìÿúÿìÿí ÿøÿù!ÿýÿìÿìÿìÿìÿìÿìÿìÿö%ÿìÿð!ÿô ÿìÿìÿìÿìÿø ÿùÿìÿìÿìÿøÿìÿîÿüÿõÿìÿöÿì.Gÿüÿìÿìÿñÿìÿìÿìÿìÿüÿì ÿìÿúÿóÿì ÿð ÿïÿíÿìÿõLÿìÿûÿÿ8ÿìÿìÿðÿîÿõÿìÿìÿîÿìÿìÿóÿìÿìÿí ÿõÿìÿì-ÿûÿì)>(ÿìÿîÿôÿñÿìÿìÿìÿü-ÿìÿìÿýÿô 5$ÿìÿïÿì ÿìÿìÿöÿþ<ÿñÿî '#ÿìÿìÿþÿìÿì ÿï! ÿïÿìÿìÿìÿìÿì(ÿì>/#ÿìÿøÿýÿîÿý+ÿìÿìÿìÿÿ'ÿôÿðÿúÿìÿõÿìÿìÿìÿùÿïÿìÿìÿùÿöÿÿÿìÿóÿìÿýÿõ ÿìÿöÿÿÿûÿìÿòÿýÿì2ÿú ÿþ ÿì ÿÿÿìÿìÿü ÿÿÿïÿìÿÿÿþ #6ÿìÿï $ÿúÿìÿðÿøÿý%ÿîÿú!ÿìÿìÿìÿôÿì ÿì :ÿõÿÿÿôÿô ÿðÿìÿì92ÿìÿó 6ÿóÿôÿÿ5ÿû ÿìÿìÿì%ÿýÿìÿñ(ÿî ÿìÿøÿø#ÿìÿìÿþÿìÿìÿóÿóÿì ÿìÿìÿòÿìÿìÿìÿì' ( ÿþÿìÿì ÿìÿú ÿíÿìÿì+ÿôÿñ$ÿþÿ÷ÿüÿùÿùÿùÿìÿì ÿìÿìÿì"ÿõÿìÿìÿø).ÿðÿõÿõÿýÿþÿìÿìÿìÿìÿìÿð+-*3*ÿñ'4ÿöÿðÿîÿòÿìÿý:ÿóÿìÿüÿìÿìÿô)ÿôÿñ.ÿù ÿìÿìÿìÿ÷ÿìÿìÿòÿòÿìÿìÿíÿì  ÿøÿñÿ÷ÿðÿú#%ÿìÿøÿÿÿìÿíÿûÿìÿíÿíÿöÿìÿìÿíÿó$ÿïÿì ÿùÿôÿìÿúÿòÿøÿì ÿôÿõÿöÿõÿþÿîÿìÿóÿì%<ÿìÿþ  %ÿô- ÿïÿìÿìÿìÿöÿì  !ÿüÿìÿûÿþBÿìÿõ"ÿìÿìÿüÿöÿìÿìÿì )ÿÿÿìÿíÿìÿìÿøÿ÷1ÿúÿì ÿì ÿì+ÿô ÿ÷!(ÿìÿùÿìÿù#ÿþÿîÿìÿóÿì ÿñÿìÿýÿìÿìÿìÿôÿó3 ÿìÿ÷,0 ÿïÿìÿòÿìÿü ÿõÿì!I ÿìÿ÷ÿìÿÿÿìÿîÿìÿõ)#"ÿýÿö ÿìÿùÿùÿðÿÿÿþÿ÷ÿìÿî ÿýÿìÿ÷ÿÿÿìÿìÿû"ÿìÿìÿîÿìÿü+ÿìÿöÿìÿî' ÿìÿõÿòÿìÿý ÿñÿøÿìÿì2 ÿìÿøÿÿÿúÿÿÿòÿÿ ÿì ÿúÿì0ÿúÿìÿý,Bÿùÿìÿì "ÿìÿìÿúÿìÿôÿìÿøÿ÷"ÿòÿíÿýÿìÿìÿòÿì)!ÿìÿì*ÿÿÿýÿþÿìÿö(ÿìÿõÿìÿø'ÿì% ÿðÿðÿú/ÿìÿþÿì )/ÿø ÿúÿ÷,ÿòÿìÿìÿôÿìÿí2ÿøÿï!ÿìÿìÿìÿìÿü4ÿïÿò ÿõÿö $)ÿýÿìÿìÿìÿòÿìÿìÿìÿìÿò#%ÿìÿìÿüÿìÿö- ÿìÿì8ÿû (ÿìÿìÿ÷'$ÿðÿòÿüÿìÿîÿø3 1ÿìÿúÿìÿüÿìÿìÿóÿûÿôÿ÷ÿì!ÿôÿ÷ÿþ*ÿûÿìÿùÿîÿìÿìÿùÿì ÿðÿñÿñÿþ ÿöÿìÿì ÿûÿì0ÿöÿìÿìÿø5ÿþÿûÿìÿýÿùÿùÿõÿýÿû1ÿõ ÿõÿôÿøÿó ÿöÿìÿì$ ÿìÿüÿìÿìÿìÿíÿû(4ÿüÿ÷'#* 7 7/ÿìÿì ÿðÿüÿì"ÿìÿðÿìÿû,Kÿÿÿöÿìÿì(ÿìÿìÿðÿì2ÿì ÿõÿíÿîÿì-)ÿðÿðÿìÿìÿìÿþÿô ÿìÿìÿì-ÿø "ÿüÿì"ÿúÿúÿì .ÿìÿýÿÿÿü ! ÿìÿúÿýÿìÿøÿø ÿõÿ÷ ÿìÿöÿìÿòÿìÿìÿïÿôÿìÿìÿÿÿìÿðÿö!ÿìÿì7:ÿþÿì1ÿìÿìÿïÿñÿúÿìÿìÿñÿùÿùÿìÿíÿóÿìÿìÿîÿüÿìÿíE ÿíÿúÿñÿùÿûÿìÿöÿý ÿðÿìÿì #ÿìÿì9$ÿîÿìÿí( ÿìL+ÿìÿñ -.ÿíÿì'9 6ÿýÿòÿÿ,ÿïÿìÿìÿó ÿÿÿìÿìÿìÿõÿð ÿìÿìÿìÿùÿìÿìÿì 6ÿì.ÿüÿìÿÿÿòÿì ÿìÿôÿóÿìÿþÿú#ÿì+ÿìÿì ÿìÿìÿìÿúÿùÿìÿìÿìÿøÿÿÿîÿùÿìÿìÿìÿì3Fÿþ ÿùÿöÿìÿó ÿþÿïÿìÿþÿúÿìÿìÿ÷AJ ÿúÿï! ÿðÿìÿìÿð,ÿúÿìÿÿ ÿû,ÿìÿð ÿøÿîÿöÿôÿýÿìÿìÿìÿìÿìÿìÿ÷ ÿìÿÿÿûÿìÿì ÿúÿú,&ÿìÿìÿîÿìÿìÿì$ÿþ"ÿìÿñHÿüÿìÿìÿøÿìÿùÿÿÿíÿìÿì+ ÿò ÿìÿìÿìÿì2ÿìÿìÿüÿùÿøÿìÿìÿÿ,  1-ÿõÿìÿîÿþÿÿÿì ÿûÿû1ÿì&ÿïÿìÿìÿì ÿìÿòÿòÿìÿþÿöÿìÿùÿìÿöÿì3ÿúÿúÿì ÿõÿìÿìÿÿÿ÷ÿûÿìÿìÿý@LOFÿìÿíÿìÿìÿÿÿìÿìÿúÿíÿÿ ÿìÿìÿí ÿÿÿïÿìÿìÿîÿõÿõÿöÿìÿìÿìÿì -ÿìÿö ÿíÿþÿìÿìÿìÿúÿìÿìÿùÿðÿìÿì 7Eÿï4 ÿìÿìÿìÿùÿìÿöÿûÿì,ÿìÿìÿÿÿíÿúÿïÿìÿìÿøÿîÿì ÿïÿûÿò-ÿüÿìÿî(ÿúÿö%"74& ÿüÿÿÿþÿÿÿìÿüÿìÿìÿýÿöÿýÿõÿøÿìÿì ÿþÿôÿðÿöÿ÷/$ ÿìÿðÿìÿñ ÿ÷ÿöÿÿÿÿ 8 QyQÿõÿíÿìÿû ,9ÿìÿì 1* ÿìÿìÿðÿíÿìÿì0 ÿìÿìÿìÿýÿü Kÿìÿìÿø.ÿüÿòÿì!ÿõ#K](,ÿðÿù,ÿðÿþÿí ÿðÿøÿô ,ÿìÿìÿóÿìÿì7"#ÿùÿýÿñÿúÿìÿôÿìÿì$ÿìÿô"7Dÿí  "[`\ÿöÿÿÿì!ÿýÿýÿðÿìÿìÿþ ÿÿÿìÿìÿô- ,3ÿóÿìÿúÿìÿìÿìÿìÿöÿõ8ÿìÿñÿý ÿñ ÿìÿòÿì ÿúÿï!?*\IF=7ÿòÿìÿìÿìÿì ÿìÿìÿìÿîÿó ÿñÿôÿòJ ÿìÿìÿìÿì$ÿ÷ÿìÿö0ÿûÿìÿì ÿüÿÿ ÿìÿìÿì#ÿðÿìÿí7ÿÿÿìÿíÿþÿìÿôÿõÿÿ6ÿìÿìÿò#ÿìÿïÿñÿ÷ ÿöÿì ÿõÿñÿì*ÿüÿìÿì5ÿù&* ÿ÷ÿð ÿø#ÿìÿìÿìÿøÿìÿìÿûÿíÿö ÿøÿìÿì# ÿì!ÿìÿïÿð ÿòÿìÿôÿìÿüÿìÿìÿþÿìÿïÿìÿìÿìÿúÿÿÿìÿìÿìÿïÿìÿñ*ÿ÷)4* )&ÿìÿìÿìÿìÿüÿúÿñÿìÿýÿñÿñÿõÿìÿñÿô02ÿìÿõÿøÿñÿøÿ÷ÿìÿôÿì ÿÿÿÿÿõ%@ÿìÿìÿìÿìÿìÿìÿúÿìÿý=nFR2/)ÿÿÿñÿîÿþÿøÿïÿøÿüÿïÿìÿïÿðÿûÿìÿõÿìÿóÿòÿì ÿíÿö ÿìÿìÿì*ÿ÷ÿìÿìÿì5>ÿúÿìÿìÿóÿìÿí-lhP68"ÿ÷ÿø ÿìÿñÿöÿîÿî ÿìÿìÿñÿìÿìÿÿÿú ÿì ÿìÿóÿìÿìÿûÿõ!ÿøÿ÷ÿìÿì =i; ÿóÿóÿü;ÿìÿÿ ÿìÿìÿþÿìÿìÿøÿðÿ÷ÿì ÿìÿùÿôÿì)ÿôÿøÿð)ÿøÿïÿìÿìÿìÿþÿðÿÿ*"ÿý 'E\fÿ÷" ÿìÿìÿìÿìÿìÿüÿìÿìÿúÿíÿìÿù ÿóÿìÿÿÿü 3ÿùÿì$ÿìÿìÿúÿìÿÿE&ÿîÿìÿüÿìÿó&#25p~^*ÿþÿöÿõÿñ5! ÿøÿö$ÿòÿý ÿìÿì)ÿù! ÿìÿ÷ÿüÿñ+ÿìÿìÿ÷ÿÿÿìÿúÿú &Ên29ÿìÿìÿìÿìÿìÿì%ÿüÿìÿìÿì;ÿìÿþ-ÿìÿìÿñÿìÿõÿìÿìÿóÿìÿìÿìÿìÿìÿì ÿ÷ ÿì %ÿð"ÿì ÿõÿì g§W ÿùÿþÿùÿìÿìÿíÿû"ÿìÿìÿìÿì ÿì%6)ÿìÿìÿø#ÿôÿìÿì)%ÿýÿìÿìÿìÿìÿü)ÿþ,ÿÿÿ÷ÿòÿòÿìÿòÿì0 ÿþM‘d O$ÿìÿöÿùÿúÿðÿìÿì ÿöÿþÿìÿìÿûÿìÿìÿìÿý &5ÿúÿòÿìÿú"ÿìÿìÿïÿûÿó#+—¬Lÿíÿ÷:ÿýÿóÿìÿìÿõÿó ÿìÿì9<ÿ÷ÿìÿøÿìÿù$.ÿüÿìZ?,.&C;ÿîÿûÿü-|qTÿìÿìÿþÿñÿíÿí2ÿþÿõÿìÿì0ÿîÿì!1ÿìÿìÿìÿì& &ÿú, # _^/(ÿöÿñÿïÿìÿì]ˆm!ÿìÿìÿúÿíÿìÿì 'ÿï ÿì.?ÿì8ÿìÿìGÿìÿìÿíÿ÷ÿñÿì0 /EIHA`\9ÿñ2 .%,„˜z6% ÿìÿìÿüÿìÿîÿìÿøÿýÿìÿìÿì+ÿìÿìÿìÿìÿòÿþÿì 5'*07Zu\EAaeP2!2(97%).*oÆt8ÿìÿìÿì ÿì4,ÿìÿïÿö=ÿñÿìÿìÿìÿìÿð ÿôHTEC3*acjL3@L;41YŒ°ž~M6K¢ŸD!ÿñÿìÿø ÿìÿòÿìÿìÿî ÿì!ÿôÿì 6 ÿÿ:ÿøÿìÿùÿþ 9%1 J;#,C;)XµÓµ©À™nƒD ÿì ÿö ÿóE$ÿìÿìÿóÿìÿöÿõÿì13ÿìÿìÿìÿìÿ÷ ÿóÿìÿ÷+ÿòÿì: GW%"-ÿõ-ZqqŽd#0"ÿìÿóÿìÿìÿöÿìÿúÿùÿì 20ÿìÿìÿìÿð' ÿîÿþÿìÿþ%ÿðÿìÿð ,&ÿû3 --(%ÿóÿîÿìÿìÿ÷ÿùÿìÿì"ÿì ÿûÿìÿôÿìÿìÿ÷ÿì#ÿîÿìÿìÿìÿì2ÿÿ#ÿøÿýÿðÿýÿüÿìÿì ÿìÿì ÿüÿìÿìÿìÿîÿ÷ÿõ%ÿñÿìÿîÿü ÿùÿìÿñ 2"ÿìÿôÿíÿìÿì 4Hÿìÿìÿìÿìÿúÿì5  ÿüÿíÿìÿþÿìÿþÿÿÿòÿõÿìÿìÿó8=ÿüÿìÿïÿúÿìÿ÷ÿ÷ÿÿÿìÿø-ÿýÿûÿìÿì -ÿÿ(ÿöÿòÿìÿîÿìÿì9J0ÿüÿì ÿìÿì ÿìÿìÿì$ÿìÿì#ÿöÿþÿú0ÿÿ ÿôÿìÿìÿúÿôÿó" ÿîÿì ÿý ÿöÿìÿì-Bÿÿÿìÿî%ÿôÿüY!ÿìÿìÿì+ÿìÿì$ÿ÷ÿì4ÿì ÿîÿì1ÿúÿúÿìÿìÿôÿüÿì,ÿõÿìÿþ!ÿøÿú# ÿìÿòÿì&"ÿüÿìÿìÿýÿûÿú ÿìÿìÿÿÿþÿüÿôÿûÿìÿü ÿì ÿì?ÿìÿìÿìÿíÿìÿíÿð ÿñÿøÿìÿìÿøÿìÿùÿìÿìÿÿÿì)ÿìÿûÿùÿü$ÿìÿìÿö!ÿìÿìÿýÿìÿìÿøÿò ÿìÿñÿìÿð5ÿóÿ÷$ÿìÿúÿì8ÿôÿì ÿìÿúÿìÿîÿíÿìÿìÿÿ ÿì ÿôÿöÿìÿñÿìÿîÿìKLÿìÿ÷*ÿí ÿ÷ÿì%ÿøÿõ ÿóÿóÿíÿîÿìÿîÿìKÿûÿô&ÿìÿÿÿìÿýÿìÿû2 #ÿøÿìÿö)ÿôÿìÿìÿóÿðÿìÿìÿìÿõÿõÿì,!Aÿø 1ÿúÿý ÿìÿìÿìÿîÿìÿìÿôÿìÿýÿì  ÿìÿôÿìÿóÿõ 6 ÿìÿì ÿùÿþÿìÿì/ÿì ÿì ÿòÿì ÿìÿìÿì ÿìÿïÿýÿì"ÿûÿùÿìÿì #*#ÿìÿø ÿùÿòÿ÷ÿìÿñÿïÿìÿíÿþÿì(ÿþÿíÿì9ÿìÿíÿùÿøÿÿÿì! ÿìÿÿ!ÿìÿìÿìÿùÿô, ÿþÿú %ÿìÿóÿìÿìÿî $ÿìÿïÿìÿì(ÿìÿìÿì ÿíÿíÿñÿì /ÿìÿì'ÿÿÿîÿþ ÿìÿûÿìÿìÿðÿìÿìÿìÿðÿùÿó5ÿýÿì"ÿìÿîÿøÿüÿôÿóÿìÿìÿìÿìÿò ÿïP&ÿìÿ÷ ÿýÿÿÿ÷ÿìÿð ÿîÿûÿÿÿìÿìÿùÿóÿñÿôÿìÿóÿùÿïÿìÿìÿýÿìÿí7ÿõÿìÿþÿÿÿìÿøÿøÿôÿìÿìÿìÿìÿí ÿùÿøÿìÿìÿûÿþÿìÿìÿìÿì ÿðÿìÿðÿìÿóÿìÿõ ÿì&ÿïÿòÿì*=ÿïÿìÿõÿÿÿìÿìÿîÿìÿ÷ÿùÿóÿìÿìÿö&$6ÿþÿìÿìÿú Dÿìÿô0ÿìÿìÿìÿìÿìÿìÿýÿìÿìÿþ- ÿîÿîÿìÿî ÿì (ÿìÿú"ÿú"ÿìÿû*ÿð7 ÿìÿìÿöÿìÿîÿìÿìÿý9ÿîÿö 8/ÿÿÿþÿþÿ÷ÿìÿìÿìÿö1 ÿôÿñ)ÿìÿìÿöÿìÿì ÿ÷/ÿìÿòÿ÷ÿìÿìÿìÿ÷ÿúÿõ;:#ÿìÿûÿñÿí<ÿþÿìÿñ'ÿìÿìÿøÿÿ 3ÿ÷ÿìÿõ ÿìÿìÿìÿìÿì ÿýÿòÿìÿìÿìÿþÿìÿìÿìÿÿ ÿñÿì! ÿóÿÿ ÿìÿì2+ÿñÿûÿì ÿ÷ 8ÿÿÿìÿøÿìÿìÿì2ÿì%ÿý(ÿúÿìÿõ#ÿì ÿôÿñ6ÿþÿì(ÿìÿì-ÿþÿûÿìÿî2ÿìÿúÿìÿì ÿìÿì 0*ÿì3Bÿõ*ÿÿ% ÿòÿìÿîÿíÿïÿìÿî'ÿÿÿì&ÿýÿùÿìÿù/ÿ÷ÿì ÿóÿí&ÿúÿìÿìÿìÿìÿìÿì)ÿìÿìÿìÿìÿðÿìÿôÿöÿúÿì#*ÿì ÿùÿðÿöÿìÿöÿìÿìÿþ%ÿìÿìÿìÿòÿúÿìÿñ>ÿíÿóÿô ÿìÿîÿìÿòÿÿÿýÿìÿìÿú2")/"ÿÿÿüÿðÿöÿì./ 4ÿìÿìÿ÷ÿìÿô,ÿðÿôIÿöÿì' ÿîÿìÿìÿìÿüÿìÿðÿìÿì$ÿþÿõ"ÿì ÿìÿìÿðÿïÿð'ÿìÿñ ÿîÿìÿìÿìÿøÿìÿîÿðÿ÷ÿõ ÿòÿþÿíÿõÿòÿìÿìÿì ÿìÿï ÿÿÿìÿìÿøÿìÿþ*0ÿì,ÿö'ÿùÿþ ÿìÿìÿðÿÿÿúÿìÿü$ÿìÿìÿö ÿì'ÿìÿ÷ ÿõVÿìÿ÷ÿì.ÿÿÿì ÿìÿìÿñÿö&ÿì& ÿìÿúÿñÿìÿìÿì&ÿûÿùÿìÿþÿôÿûÿÿÿöÿì+. ÿìÿìÿòÿìÿìÿýÿûÿì&ÿìÿôÿðÿìÿñÿûÿð ÿìÿì ÿì$0ÿÿÿìÿì? ÿô ÿîÿìÿïÿìÿôÿð ÿìA ÿñÿÿÿüÿîÿðÿíÿìÿìÿ÷.  ÿñÿùÿù3ÿîÿÿÿöÿìÿô,ÿ÷ÿìÿïÿÿÿìÿ÷ÿìÿìÿìÿì ÿúÿöÿìÿìÿì ÿìÿïÿì ÿöÿì% .ÿíÿ÷ÿìÿìÿìI4ÿôÿ÷ÿöÿìÿì ÿòÿüÿí"ÿìÿì39ÿìÿìÿò,ÿþÿìÿìÿþ 1ÿøÿ÷ÿìÿúÿöÿìÿìÿú ÿóÿì%/ÿÿ%ÿìÿì  ÿôÿò  ÿýÿðÿìÿìÿõÿ÷ÿôÿþÿõÿìÿüPÿìÿì" ÿûÿöÿù$ÿóÿìÿìÿûÿìÿìÿÿ Iÿö ÿìÿìÿïÿöÿô ÿìÿì ÿìÿö/(-ÿìÿìÿîÿþ ÿúÿìÿìÿìÿüÿþ*ÿìÿúÿìÿó ÿü ÿ÷ÿìÿì$ÿìÿòÿö ÿùÿìÿï"ÿì ÿìÿþÿöÿøÿýJ ÿïÿì ÿñÿðÿýÿÿÿõ ÿùÿùÿìÿù ÿûÿôÿóÿìÿïÿìÿìÿìÿìÿýÿìÿüÿíÿùÿöÿöÿìÿîÿø.ÿìÿ÷ÿìÿìÿì'ÿøÿìÿïÿìÿíÿû ,$ÿìÿýÿóÿóÿþÿúÿìÿû ÿíÿì ÿìÿú)ÿôÿùÿõÿìÿúÿìÿð %ÿÿ'2'ÿòÿí%ÿõÿì-"ÿò=ÿú ÿøÿì+ÿì!ÿìÿìÿìÿìÿòÿýÿÿÿõÿì #ÿüÿìÿìÿù6,ÿôÿì ÿôÿìÿì!ÿïÿì!ÿì ÿìÿþÿìÿìÿìÿö  ÿïÿìÿìÿìÿíÿý 2ÿì ÿìÿì+ÿúÿîÿìÿìÿìÿöÿìÿò ÿìÿòÿ÷ÿì7ÿìÿø*@ÿþÿì ,ÿìÿìÿîÿìÿì ÿìÿú ÿìÿïÿìÿõ/ 6ÿìÿìÿøÿòÿôÿðÿù.1 ÿòÿìÿì  ÿïÿìÿìÿìÿì & ÿñÿì%3ÿõÿìÿñÿø ÿìÿì$(-(ÿôÿþÿþÿì ÿð* ÿìÿìÿìÿó/+ÿíÿìÿïÿÿÿüÿýÿòÿìÿóÿóÿþÿúÿìÿìÿì)*ÿí*ÿìÿìÿî#ÿíÿò ÿìÿì2ÿì&&"ÿô%ÿüÿí ÿô ÿî%ÿýÿìÿìÿìÿô(ÿ÷ÿìÿýÿñÿùÿìÿìÿìÿìÿì*Eÿúÿìÿó ÿìÿôÿüÿìÿìÿì ÿìÿïÿÿÿþK=!ÿöÿüÿì ÿîÿìÿìÿùÿôÿùÿÿ!ÿï& ÿþÿíÿìÿüÿìÿìÿìÿìÿì'ÿ÷ÿþÿìÿò / ÿîÿì"ÿòÿìÿìÿöÿìÿì'ÿüÿìÿþ&ÿ÷ÿìÿìÿùÿö  ÿýÿìÿìÿìÿìÿì(!ÿì ÿìÿìÿìÿø 8 ÿîÿùÿïÿòÿìÿìÿö "ÿùÿð5Bÿôÿøÿìÿò-ÿùÿõÿìÿóÿüÿöÿýÿíÿû ÿõÿóÿìÿìÿóÿìÿôÿ÷ÿìÿù$ÿúÿïÿõÿì&ÿìÿì1ÿùÿüÿó.ÿûÿîÿõÿñÿïÿìÿì=XC)ÿìÿìÿ÷ÿìÿìÿìÿìÿìÿüÿñ ÿ÷ÿìÿüÿìÿìÿðÿòÿìÿìÿïÿìÿîÿìÿìÿìÿìÿì#ÿìÿíÿìÿñÿïÿìÿìÿì ÿìÿìÿì!+>$ ÿÿÿø?ÿì ÿìÿðÿôÿôÿìÿì ÿ÷ ÿúÿÿ ÿûÿüÿôÿìÿð ÿìÿì'ÿýÿìÿìÿì ÿì.Bÿû > , ÿõ$&ÿ÷ÿóÿûÿìÿìÿôÿíÿíÿìÿì2ÿúÿõÿùÿìÿì ÿùÿìÿïÿòÿì)ÿú ÿìÿøÿì ÿþ ÿö #ÿý)E#A<)ÿóÿìÿü  ÿì +75ÿóÿýB1 ÿìÿì$ÿìÿìÿì ÿûÿìÿø-ÿþ C#ÿóÿýÿì+ÿìÿöÿñÿÿ" ÿüÿóÿü,P ÿûÿìÿûÿþ,ÿïÿøÿðÿÿÿìÿ÷ÿþ ÿú%ÿù ÿìÿìÿüÿìÿì ! - ÿìÿìÿñÿïÿûÿì'ÿìÿì.-(ÿþÿì  JUÿìÿÿÿìÿýÿìÿûÿìÿìÿìÿì*0 ÿì ÿì 6 ÿøÿìÿìÿúÿñÿø>ÿìÿìÿòÿìÿ÷ÿíÿîÿîÿìÿüÿì :-0 8():ÿì ÿìÿìÿøÿ÷ÿóÿôÿõÿìÿìÿìÿìÿï)ÿìÿ÷ÿöH ÿìÿñÿìÿìÿìÿì ÿþÿíÿö1 "ÿìÿüÿôÿöÿìÿìÿþ ÿî#ÿôÿîÿìÿìÿõÿ÷ÿúÿþ%ÿíÿóÿì +ÿìÿìÿÿÿúÿì'4=ÿìÿìÿñÿìÿìÿì%ÿìÿìÿìÿù,ÿö/ÿþ 6$ *ÿìÿìÿîÿýÿìÿðÿìÿìÿÿÿìÿìÿðÿ÷ÿì A ÿúÿùÿìÿìÿì ÿìÿìÿíÿ÷+ÿìÿð)ÿðÿìÿìÿìÿìÿìÿì2: ÿïWb"ÿø)&ÿòÿíÿìÿìÿýÿìÿï ÿì ÿìÿìÿüÿìÿí"+834ÿìÿõÿùÿöÿìÿýÿñÿñÿìÿìÿìÿìÿìÿìÿìÿìÿîÿð/†žK("ÿÿÿüÿùÿóÿìÿÿÿìÿìÿðÿú ÿòÿìÿûÿìÿìÿôÿìÿìÿðÿìÿýÿó0ÿóÿÿÿöÿìÿìÿìÿì# ÿìÿìÿì#,Kÿþÿìÿìÿìÿ÷$ Uo‡c # ÿðÿ÷ ÿöÿìÿì$  ÿì ÿìÿìÿìÿìÿìÿì ÿì'ÿõ ÿìÿì !ÿðÿìÿÿÿóÿýÿò!L""6hŠSÿþÿìÿì 5ÿìÿìÿì ÿöÿÿÿñÿýÿü ÿûÿìÿìÿûÿþÿìÿìÿöÿòÿøÿìÿô2!ÿöÿìÿìÿïÿìÿðÿûÿì ÿþ  ;Q_S4ÿôÿìÿíÿü ÿìÿìÿõÿì ÿìÿìÿÿÿìÿìÿñÿþ"ÿì * ÿìÿöÿìÿìÿì H-ÿìÿõÿþÿö ÿìÿì%8"DP`}Kÿóÿíÿìÿì / ÿì "3ÿìÿìÿûÿÿ $'ÿöÿìÿïÿø% ÿìÿó!5"F‹—5ÿüÿôÿìÿìÿìÿìÿóÿì ÿúÿúÿõÿòÿìÿìÿì8 ÿì 1 ÿìÿìÿìÿì#ÿøÿð ÿìÿïÿõÿûÿì!I4'ÿû 'ÿó ,$NŽSÿìÿòÿöÿøÿòÿóÿõ+ÿíÿîÿóÿìÿúÿí ÿõÿ÷ÿøÿýÿøÿóÿìÿì7ÿïÿì ÿìÿöÿí:UL5P: ÿìÿûÿìH76j8ÿîÿù7.ÿóÿðÿìÿìÿìÿì ÿÿÿìÿì )#ÿìÿìÿüÿìÿùÿõÿìÿì * D-Jÿù9G=#ÿó ÿøÿøÿý": ‚ÿìÿì! ÿìÿìÿÿÿìÿôÿýÿìÿì 83 ÿìÿì#ÿìÿõ.ÿö2!3"3&ea=#)OWlbI2 ÿì, HwI;ÿìÿòÿÿÿìÿõÿìÿý1ÿÿÿýÿìÿì!ÿî8,ÿì.5ÿüÿìÿì)ÿøÿøÿì ÿô +9:+;'1}¢b5@ÿì3?QJ9!ÿñÿíÿÿ!ÿìÿìÿì%ÿõÿìÿÿ ÿì9ÿìÿìÿùEÿìÿìÿôÿìÿìÿü -,)?MntJ-98M:5(@\šL*1ÿìÿìÿöÿìÿìÿõÿìÿùÿý%ÿìÿìÿì9ÿìÿìÿì ÿìÿì7& 4-3LIGJh\7 PLrˆ}YLSˆÕaÿúÿúÿíÿìÿìÿïÿì4)ÿìÿýÿìÿýÿûÿð=ÿìÿìÿ÷ÿöÿìÿìÿì)/" 07[W=ÿìN‡·ÈÏ xx«>ÿþ ÿþÿìÿíÿìÿñÿìÿìÿó %ÿøÿìÿìÿìÿð:ÿõÿüÿï ÿìÿìÿìÿìÿûÿÿÿô ÿö6ÿìÿîÿôÿñ2ÿõ 6‰ ª®¹§„‚@ÿìÿñÿîÿôÿì+ ,ÿìÿìÿìÿì%ÿìÿý ÿìÿÿ#3ÿìÿüÿøÿõÿìÿôÿìÿì!ÿìÿû+ÿö(;ÿú( ÿý3H]GL2"ÿìÿì!ÿìÿìÿùÿìÿì)ÿìÿô$ÿùÿñÿø ÿìÿìÿþÿì ÿìÿûÿíÿì  % ÿö$7 ÿðÿû ÿüÿì!ÿúÿì-,ÿìÿø*ÿùÿìÿóÿûÿìÿõÿø!ÿóÿ÷ÿìÿìÿìN)ÿìÿì ÿüÿìÿì ÿúÿìÿÿÿìÿìÿú ÿìÿìÿìÿìÿõÿÿÿì ÿìÿìÿìÿìÿ÷0ÿìÿìÿùÿìÿìÿúÿø!@ÿìÿìÿì ÿóÿìÿìÿìÿì  ÿîÿìÿìÿì ÿÿÿÿÿñÿìÿì/0ÿùÿüÿûÿúÿùÿìÿì<)ÿõÿì *ÿìÿö ÿñÿìÿìÿìÿì,J!!ÿýÿìÿîÿìÿõÿô ÿìÿðÿúÿýÿïÿìÿûÿìÿìÿþÿìÿìÿü (ÿñ ÿõÿþ ÿù   ÿì$ÿùÿø ) ÿìÿð(ÿ÷ÿ÷M'ÿìÿìÿîÿïÿìÿì- ÿìÿùAÿì ÿóÿì 3/ÿìÿìÿì ÿóÿìÿõ ÿñÿìÿì!ÿñ3ÿì$ÿøÿìÿìÿô ÿìÿóÿì:ÿùÿìÿóÿîÿìÿôÿí ÿìÿìDÿúÿìÿìÿìÿ÷ÿ÷ÿïÿìÿýÿúÿîÿìÿìÿöÿìÿìÿìÿ÷ÿøÿì1ÿìÿúÿ÷ÿìÿÿ ÿìÿìÿí"ÿìÿðÿüÿôÿì#ÿõÿì.ÿõ6ÿþÿôÿìGÿôÿúÿìÿîÿùÿíÿìÿìÿìÿì ÿúÿòÿýÿìÿðÿìÿìÿýÿìÿìÿö/Lÿ÷"+ÿìÿìÿìÿì ÿõÿîÿìÿìÿõÿóÿìÿì@ÿõ >) ÿì!&ÿìÿîÿìÿ÷  .ÿúÿÿÿìÿ÷$ÿìÿìÿøÿýÿõÿìÿôÿì%ÿì ÿôÿì- !ÿûÿû ÿýÿîÿòÿøÿìÿìÿìÿÿ$ÿìÿì#ÿõÿìÿìÿîÿìÿó7ÿòÿì ÿ÷ÿð ÿìÿì4ÿìÿùÿøÿúÿì#ÿõÿìÿì ÿì ÿüÿøÿìÿì ÿìÿìÿòÿö ÿÿÿìÿÿÿì%%ÿìÿùÿìÿùÿîÿÿÿøÿìÿõÿ÷ÿìÿì ÿì ÿìÿìÿì7!ÿìÿòÿíÿþÿì-ÿýÿìÿ÷ ÿìÿìÿìÿì*#ÿóÿÿÿíÿòÿðÿìÿìÿìÿìÿò ÿìÿúÿñÿìÿô2ÿìÿì' ÿúÿ÷ÿì%ÿìÿðÿü,ÿòÿîÿÿÿõÿñÿìÿìÿ÷ ÿû0ÿùÿì -ÿõÿûÿíÿøÿì'ÿòÿïÿù,ÿþÿ÷#ÿìM"ÿôÿìÿð ÿúÿìÿìÿùÿì ÿîÿûÿìÿì ÿðÿì ÿìÿöÿìÿìÿìÿìÿñÿìÿì8ÿòÿìÿìÿì ! ÿìÿìÿìÿìÿì4ÿîÿìÿìÿìÿ÷ÿöÿìÿìÿì&ÿìÿìÿóÿìÿìÿüÿìÿì6ÿîÿýÿöÿì56ÿíÿìÿì (ÿíÿìÿîÿìÿú(ÿìÿìÿõ = ÿìÿî<ÿìÿð(ÿíÿìÿìÿüÿìÿìÿìÿìÿìÿù( ÿìÿìÿùÿìÿì'ÿìÿôÿü'ÿìÿù ÿì!>ÿìÿìÿìÿîÿþÿ÷!ÿì$ÿðÿûÿþ,1 ÿìÿúÿìÿìÿìÿóÿìÿì ÿúÿñ)ÿÿÿìÿìÿïÿþ ÿì+ÿìÿìÿìÿìÿìÿýÿñÿî5ÿýÿø ÿìÿòÿìMÿìÿìÿìÿìÿðÿì&ÿöÿðÿùÿìÿìÿìÿîÿìÿï ÿÿÿì(ÿìÿõ&ÿìÿú. -ÿñÿì#ÿïÿÿÿøÿì% ÿì ÿìÿýÿðÿï @ÿîÿìÿûÿìÿìÿì@ÿì %ÿíÿú ÿø ÿüÿ÷ÿôÿû8ÿûÿìÿùÿìÿôI ÿìÿì$ÿõÿì#ÿñÿìÿìÿ÷ÿûÿìÿìÿùÿó.5ÿðÿýÿýÿú +ÿÿ$ÿìÿìÿìÿìÿìÿò)ÿüÿì #)ÿìÿÿÿøÿí-ÿóÿý$ÿþGÿïÿìÿöÿü ÿìÿýÿì$ ÿþÿò  ÿìÿìÿìÿö ÿõÿì!6ÿìÿîÿóÿúÿì ' ÿìÿõ!#ÿùÿìÿìÿìÿìÿì ÿíÿìÿúNÿìÿ÷ÿø ÿùÿìÿùÿìÿû ÿìÿì)ÿýÿýÿìÿñÿúÿû ÿì/5ÿìÿþÿìÿìÿìÿï/ÿìÿì* ÿìÿì ÿóÿìÿþ(ÿìÿýÿìÿì ÿìÿì ÿìÿìÿìÿì ÿìÿì ÿîÿìÿìÿìÿýÿìÿøÿúÿôÿì ÿþÿðÿíÿìÿìÿ÷$ÿø ÿì)ÿðÿîÿúÿìÿìÿûÿìÿ÷%ÿùÿì -)ÿì ÿðÿ÷3$ÿìÿìÿìÿìÿú ÿðÿìÿìÿìÿø.ÿôÿì!ÿþJ+ÿû ÿõ0ÿìÿòÿóÿòÿó*ÿì %ÿ÷ÿì 0ÿì ÿýÿìÿüÿìÿìÿìÿüÿîÿìÿìÿÿ&# ÿìÿóÿìÿì ÿòÿìÿìÿþÿûÿìÿòÿìÿûÿúÿì%ÿðÿìÿîF ÿìÿóÿýÿùÿùÿìÿì- ÿúCÿñÿùÿùÿóÿõÿìÿìÿìÿ÷/)ÿõÿóÿò ÿþ5ÿìÿýÿúÿìÿøÿö:ÿìÿìÿìÿì ÿ÷ÿð" ÿìÿî ÿïÿôÿòÿìÿì/ÿ÷ÿìÿì ÿìÿìÿùÿìÿÿÿû-%)ÿìÿú ÿõÿûÿì $ÿ÷ÿüÿì ÿì0ÿýÿìÿìÿíÿìÿúÿì? ÿìÿì)ÿüÿì!ÿþ#)ÿìÿìÿ÷ÿìÿìÿø#ÿýÿîÿðÿìÿì $ÿñÿï  $ÿ÷ÿõÿûÿ÷ÿÿ ÿìÿìÿìÿþ ÿìÿìDÿý,ÿìÿìÿúÿýÿîÿúÿüÿþÿìÿìÿïÿìÿì63)ÿùÿìÿþ ÿòÿìÿìÿì#ÿìÿð.ÿõ"?,ÿùÿìÿûÿù "ÿøÿíÿìÿõÿðÿìÿì ÿþÿñÿîÿôÿìÿïÿìÿìÿøÿðÿö#ÿðÿìÿìÿùÿìÿôÿðÿûÿÿL)ÿüÿìÿì+ÿñÿì2(ÿöÿýÿìÿìÿð%ÿ÷ÿì ÿýÿíÿìÿîÿìÿñ!ÿìÿð ÿóÿþÿòÿý2ÿòÿ÷ÿþ ÿüÿí3ÿúÿìÿÿÿîÿìÿìÿìÿìÿì ÿì86ÿìÿ÷ÿìÿìÿóÿû2ÿìÿý ÿïÿô%* ÿìÿì$ÿîÿìÿìÿì*4ÿü. ÿìÿðÿÿ ÿìÿö%&ÿíÿìÿìÿì Dÿìÿùÿìÿì"ÿìÿöÿìÿì ÿðÿùÿìÿüÿú Aÿûÿì"S!ÿìÿñÿìÿúÿìÿìÿì+ÿùÿìÿÿ "ÿìÿìÿóÿñÿûÿú ÿìÿìÿìÿù ÿú B%ÿì"ÿìÿú)ÿñÿìÿìÿìÿýÿíÿð ÿîÿùÿìÿùÿô=*ÿýÿìÿùÿûÿïÿìÿìÿôÿðÿÿÿì ÿì7*<&ÿìÿìÿìÿï 0ÿì&ÿìÿì%$ÿìÿìÿìÿóÿìÿüÿöÿì%ÿìÿý ÿõÿìÿìÿû0ÿú$ÿôÿþÿó"ÿýÿù$ÿ÷ÿüÿîÿøÿìÿìÿìÿì 0ÿìÿìÿìÿíÿì ÿúÿì ÿûÿìÿìÿì1ÿì(ÿïÿìÿì"ÿìÿü- ÿì8ÿì1/ ÿó ÿÿÿí' ÿþÿìÿìÿìÿìÿÿÿ÷ÿìÿúÿûÿìÿòÿìÿìÿì5ÿþÿì! "ÿìÿìÿìÿìÿìÿðÿì4ÿÿ:ÿìÿõÿüÿìÿþÿ÷ÿúÿìÿìÿìÿìÿþÿð ÿ÷ÿì45ÿí$ÿôÿóÿýÿìÿìÿíÿìÿìÿìÿìÿõÿìÿî#(0 *ÿ÷ÿìÿìÿùÿòÿûÿù,ÿôÿûÿûÿìÿ÷ÿìÿìÿü +ÿó ÿìÿìÿìÿúÿú #+ÿìÿîÿìÿý$1ÿõÿöÿìÿìÿñÿì %$ 3G9ÿõÿìÿì ?ÿÿÿìÿìÿþ ÿìÿìÿú ÿìÿñÿÿÿìÿüÿíÿõÿïÿù ÿìÿìÿüÿìÿì ÿðÿìÿì6ÿìÿìÿìÿì>ÿì%"ÿÿ%@,ÿìÿìÿìÿìÿüÿìÿìÿìÿìÿñÿôÿó ÿìÿìÿúÿÿ ÿìÿìÿìÿùÿþÿýÿîÿóÿìÿùÿìÿìÿìÿìÿ÷ÿì/ÿóÿìÿìÿøÿþ ÿìÿìÿì ÿì# ÿýG. ÿìÿð50ÿûÿì ÿì  ÿìÿìÿýÿÿÿûÿì "#ÿõÿì ÿïÿíÿþ)ÿìÿìÿìÿüÿì"1ÿÿÿû'ÿìÿìÿÿK5ÿþÿ÷8%ÿïÿ÷ÿû ÿìÿìÿúÿñÿìÿìÿì&ÿùÿ÷ÿÿÿðÿóÿõÿüÿý4ÿì ÿüÿûÿì ÿöÿôÿò!(ÿö -Cÿñÿýÿíÿì#3 ÿì *7 ,ÿï"ÿÿÿþÿïÿìÿìÿÿÿì?ÿûÿù9ÿñÿìÿì$ ÿíÿìÿù ÿîÿûÿþÿø /ÿ÷ÿìÿìÿíÿþ ÿ÷ÿüÿúÿìÿìÿýÿ÷ÿû /ÿõÿìÿìÿìÿüÿóÿòÿïÿíC&ÿìÿðA(!!#ÿíÿò0/ÿõÿì ÿñÿìÿì ÿìÿìÿìÿü, ÿì&ÿðÿüÿð-ÿìÿì B*Aÿìÿìÿìÿöÿî ÿÿÿøÿìÿö/_Eÿÿÿìÿþ<'ÿìÿìÿìÿì ÿìÿìÿöÿîÿìÿìÿìÿìÿþÿìÿì  ÿý7ÿíÿìÿñÿìÿìÿìÿû( ÿìÿõÿúÿùÿíÿì##A ÿðÿü ÿìÿì .ÿìÿìÿí ÿìÿõÿüÿû ÿìÿìÿñÿøÿù& 0/0ÿìÿüÿìÿôÿñÿìÿÿÿïÿìÿìÿ÷0ÿí?. &#$ !8Jÿìÿìÿìÿóÿôÿöÿìÿìÿóÿòÿìÿþ!ÿíÿì"'ÿý  ÿìÿìÿï%ÿìÿí"ÿìÿòÿìÿì4ÿì/ÿìÿìÿìÿìÿìÿîT[ 2`Oÿüÿú8&ÿìÿìÿù ÿìÿüÿÿÿýÿú ÿìÿðÿìÿì 12ÿîÿìÿìÿûÿíÿð ÿôÿìÿìÿó ÿìÿìÿìÿìÿìÿþ >(Jst6 ÿÿÿùÿúÿí ÿÿÿìÿþÿìÿì ÿïÿìÿîÿñÿìÿìÿìÿìÿóÿì!ÿìÿðÿìÿìÿõÿìÿì$)ÿî&Iÿìÿì ^7W’aXÿìÿûÿíÿïÿúÿòÿðÿìÿý#ÿìÿìÿ÷ÿõÿûÿüÿìÿì)ÿìÿõÿïÿì'ÿû% ÿñÿðÿìÿòÿìÿùÿò<NbcKDÿìÿìÿìÿìÿìÿï7ÿìÿì)ÿðÿìÿìÿð !ÿôÿìÿìÿìÿìÿìÿìÿüMÿìÿìÿìÿìÿñ K4 ÿÿÿöÿüÿöÿìÿôÿîÿì ÿûÿú Nna8ÿûÿíÿí ÿòÿø),ÿòÿìÿìÿ÷ÿìÿìÿì ÿìÿìÿìÿþÿì ÿìÿìÿìF 8#$Wÿìÿì/ÿüÿÿ'iSagSBÿþÿøÿîÿþÿðÿìÿì5 ÿø 5ÿôÿìÿìÿìÿì%ÿõ&ÿìÿì ÿò$/:>1Bÿìÿì .ÿÿ%@%"NaMÿüÿ÷ÿìÿôÿìÿõÿìÿîÿì ÿìÿðÿíÿìÿøÿõ43ÿìÿóÿìÿìÿìÿû4ÿñ( 0 ÿìÿþ+$LnNW/,":!0=K2 K% ÿÿÿì ÿìÿõÿóÿùÿìÿìÿìÿì ÿø )ÿõÿìÿìÿìÿìÿ÷0ÿõÿì'.)CpcBan744ÿö P_ÿþÿþÿùÿóÿôÿìÿìÿþÿýÿñÿïÿñÿìÿðÿì (ÿ÷ÿìÿìÿôÿìÿùÿìÿìÿô 6"D3\='%Dna[>ÿò */9Z, ÿîÿìÿþ ÿìÿìÿý-ÿìÿð%#( ÿì*$ÿìÿû= ÿü#(<$W\D#2GewzlhYPÿìÿï/U{r/,ÿìÿöÿìÿìÿìÿìÿìÿûÿíÿìÿìÿì')ÿì$5ÿùÿìÿó1ÿïÿìÿì ÿóÿìÿìÿðÿû(, ( 4+`„V!H`_D;w\8#ÿþÿÿÿì ÿöÿòÿì ÿðÿìÿìÿìÿûÿìÿÿ'ÿìÿìÿï4 ÿìÿìÿìÿìÿþ,ÿýÿîÿì(ÿðÿöÿ÷ÿ÷-?U@-ÿü!`IfgQKT|ŸšY? *'ÿìÿîÿìÿÿÿíÿüÿú )ÿìÿìÿí:ÿìÿðÿì %ÿìÿìÿìÿìÿüÿíÿòÿø1 0G,-C>¢®‰‘¼Ç7ÿìÿìÿðÿìÿìÿì ÿìÿò $ÿðÿìÿþÿùÿìÿìÿì/ 9*ÿìÿìÿ÷ÿìÿíÿìÿüÿìÿìÿïÿöÿìÿÿÿìK[ÿúÿì .?}¤ÒϨ¤´~ÿìÿìÿÿÿìÿìÿôÿìÿìÿöÿñÿì4ÿñÿìÿôÿìÿìÿì ÿüÿì,ÿìÿìÿôÿìÿüÿìÿìÿìÿìÿì"ÿðÿö/Sxs‚” q'ÿöÿõÿøÿö+)ÿðÿìÿìÿì$ÿõÿìÿóÿí! %ÿôÿù ÿôÿõÿìÿìÿôÿìÿìÿî,ÿì ;ÿ÷ ÿñ  <@Fÿó ÿúÿìÿìÿìÿìÿìÿìÿù*7ÿì ÿìÿì&ÿìÿì ÿìÿìÿðÿìÿôÿôÿúÿìÿìÿì ÿñ%ÿñ(#ÿ÷% ÿìÿìÿõÿò'ÿöÿì>@ÿöÿìÿýÿìÿþ ÿìÿüÿùÿû+ÿìÿìÿìÿûI'ÿíÿì ÿìÿìÿôÿÿÿÿÿðÿìÿýÿìÿìÿìÿìÿñÿìÿôÿúÿó ÿðÿìÿú!. ÿì ÿìÿýÿìÿìÿìÿìÿìÿìÿïFÿøÿìÿìÿþ ÿøÿìÿìÿìÿìÿìÿìÿõÿìÿì,ÿüÿìÿùÿìÿõÿýÿìÿöÿìÿìÿì3ÿïÿî ÿúÿïÿíÿì ÿìÿìÿì-)ÿò ÿüÿì,ÿûÿùÿìÿì#Gÿõÿüÿìÿì ÿìÿñÿìÿôÿì ÿìÿìÿì ÿùÿñÿþÿì ÿìÿÿÿÿÿó"ÿüBÿìÿõÿóÿì* ÿìH)ÿûÿîÿì).ÿñÿìÿìÿìÿòÿìÿí ;ÿì ÿìÿì ÿîÿì!ÿ÷ÿìÿûÿìÿìÿì ÿóÿô@ÿì!ÿòÿø# ÿìÿìÿì%ÿ÷ *ÿòÿìÿì ÿõÿìÿýÿ÷ÿü ÿþ3ÿùÿøÿìÿðÿüÿìÿùÿìÿìÿìÿìÿìÿìÿìÿ÷ÿö!ÿóÿò.ÿö##ÿì%ÿìÿìÿó ÿìÿìÿíÿìÿòÿüÿìÿì1ÿøÿúÿø 3ÿìÿìÿì+ ÿõÿò)ÿùÿìÿöÿòÿðÿìÿìÿìÿÿÿìÿýÿìÿìÿìÿó/&ÿìÿûÿø&ÿøÿìÿìÿþ"ÿì ÿìÿìÿìÿìÿø"ÿìÿìÿì=ÿ÷I/ÿìÿõÿìÿôÿìÿî ÿþ) ÿñÿùÿüÿóÿòÿï$ÿìÿìÿñÿì ÿóÿìÿñÿì ÿÿÿý<ÿõÿñÿùÿýÿð ÿìÿìÿðÿÿÿìÿúÿìÿñÿìÿì$B ÿì*ÿìÿìÿìÿï * ÿôÿù ÿòÿìÿýÿìÿì*ÿýÿýÿý<( ÿöÿì=ÿöÿìÿúÿýÿóÿìÿìÿ÷ÿìÿìÿìÿóÿìÿùÿõ ÿìÿìÿìÿìÿú ÿì'ÿìÿìÿìÿìÿü0ÿñÿìÿøÿìÿì4ÿøÿìÿì ÿîÿùÿìÿìÿøÿîÿìÿõÿóÿð*ÿüÿì)1ÿìÿìÿù%ÿìÿìÿíÿðÿìÿì)ÿì ÿþÿì5Pÿìÿìÿ÷ÿúÿìÿì$%ÿìÿø-J ÿôÿì4ÿÿÿìÿìÿöÿìÿì ÿô ÿìÿ÷/ $ÿìÿùÿöÿìÿìÿìÿï$ÿûÿõÿüÿìÿìÿÿÿìÿìÿîÿì ÿìÿ÷ÿõÿì ÿïÿìÿìÿìÿíÿýÿøÿñÿìÿìÿòÿìÿìÿÿ+ÿìÿìÿòÿì.ÿíÿìÿöÿìÿì 'ÿüÿõÿú ÿìÿì+ÿìÿìÿó ÿìÿôÿô0 ÿì/ÿìÿú%1ÿì ÿðÿùÿîÿüÿ÷ÿìÿìÿþÿÿ)ÿöÿýÿì,,ÿÿÿö ÿÿ1$ÿîÿöÿìÿì$ÿ÷ÿìÿìÿìÿìÿúÿû"*ÿúÿìÿöÿ÷ÿðÿôÿñ%ÿìÿö#ÿüÿìÿôÿö!/ÿìÿìÿþ ÿüÿì ÿì ÿìÿì!ÿô/<. ÿìÿìÿì ÿó*ÿìÿìÿìÿìÿúÿìÿì# ÿýÿìÿ÷ÿìÿûÿìÿñÿìÿõÿÿÿìÿó)ÿú+ÿþÿìÿûÿì+)ÿúÿìÿì ÿüÿìÿì)ÿï!ÿûÿú ÿñ ÿìÿìÿìÿìÿöÿÿÿüÿì- ÿìÿù1ÿûÿò:ÿð ÿñÿñÿíÿìÿìÿì ÿúÿìÿùÿì%ÿìÿøÿìÿóÿþÿì$ ÿðÿìÿüÿ÷ÿìÿþÿù0ÿìÿìÿìÿìDÿì ÿìÿï!&* ÿì&ÿþÿìÿìÿìÿìÿìÿùÿöÿñ ÿó ÿìÿìÿìÿìJ!"ÿôÿìÿìÿñÿìÿüÿìÿí ÿìÿóÿìÿõÿü'ÿú&ÿõCÿìÿìÿÿÿìÿí ÿìÿû, ÿý!ÿô ÿóÿìÿì ÿíÿì5ÿîÿ÷ÿîÿîÿì&ÿìÿø ÿùÿìÿìÿìÿíÿìÿìÿôÿþÿû%ÿñN ÿìÿûÿúÿóÿìÿìÿìÿøÿù &ÿòÿ÷ÿî'ÿôÿðÿìÿùÿìÿûÿìÿí.ÿõÿóÿì#ÿìÿìÿþÿì ÿòÿìÿô ÿì"ÿñÿïÿìÿìÿùÿì ÿìÿóÿìÿìÿ÷ÿúÿ÷ ÿìÿðÿï ÿöÿÿ ÿû ÿýÿìÿöÿýÿìÿìÿì&8ÿùÿû)ÿìÿõÿïÿíÿûÿìÿì%($ÿõ"ÿì*"ÿôÿìÿìÿìÿì ÿìÿñÿìÿì)ÿìÿð#ÿìÿ÷, 6ÿö#ÿìÿìÿðÿö ÿóÿòÿóÿô&ÿì) ÿì!+ÿìÿúÿìÿü ÿìÿìÿìÿìÿýÿìÿîÿûÿìÿùÿö $ÿíÿøÿìÿìÿìÿúÿìÿì ÿÿÿìÿðÿìÿÿÿìÿîÿüÿö/ÿìÿÿÿó1ÿò 4ÿìÿìÿñÿìÿì;# BÿðÿöÿìÿúÿôÿþÿñÿúÿøÿìÿîÿîK+)ÿì"ÿìÿüÿüÿìÿöÿóÿõÿìÿýÿìÿìÿöÿôÿìÿìÿúÿìÿöÿòÿìÿò3ÿñÿìÿìÿóÿðÿì ÿìÿìÿõÿî& %ÿìÿôÿì.ÿìÿþ  ÿö& ÿìÿìÿìÿ÷ÿìÿöE ÿ÷ÿýÿì #1ÿõÿó ÿìÿìÿìÿì6 ÿìÿìÿìÿìÿïÿü! ÿì ÿñÿø 1ÿìÿùÿìÿìÿíÿìÿö#) ÿìÿì8! ÿìÿìÿøÿî"?ÿýÿìÿöÿýÿìÿìÿûÿì?6 ÿÿÿþÿì ÿúÿìÿüÿóÿð ÿþ"'2ÿôÿùÿþ%3ÿøÿì ÿìÿîÿüÿìÿìÿòÿìÿÿÿý!ÿôÿì$ÿðÿìÿñ,ÿðÿìÿ÷ÿòÿõÿó$ÿìÿïÿìÿìÿþ ÿûÿìÿìÿìÿñÿø</ÿúÿìÿñÿì$ÿìÿì4ÿùÿúÿìÿø@ÿÿÿí ÿìÿìÿø$ÿìÿì#ÿøÿìÿìÿì$ /ÿùÿ÷/.ÿùÿýÿíÿì ÿì+.ÿþÿìÿìÿýÿðÿó8ÿìÿýÿû2 ÿùÿìÿ÷ ÿýÿïÿìÿìÿìÿýÿìÿü%ÿñ "ÿüÿìÿñ ÿìÿìÿí ÿôÿìÿùÿîÿìÿñÿì/ÿìÿûÿòÿöÿùÿüÿýÿ÷ÿìÿì#ÿñÿìÿöÿùJ ÿì&hÿìÿìÿìÿìÿóÿûÿø8ÿýÿ÷ÿ÷ÿï=ÿûÿñÿÿÿ÷ÿîÿý.ÿìÿìÿìÿìÿÿÿþÿò ÿô,ÿì"ÿ÷ÿñÿùÿýÿùÿöÿîÿðÿï Sÿìÿì #ÿýÿôÿìÿù#ÿì0ÿý"ÿðÿì2/.ÿìÿìÿìÿøÿüÿìÿ÷ÿþÿïÿìÿìÿì ÿòÿ÷ÿìÿøÿìÿìÿî! ÿì ÿìÿù'ÿìÿìÿìÿû@ÿíÿøÿñÿõÿí ÿð?ÿìÿìÿðÿþÿýÿìÿúÿøÿó)ÿøÿìÿì ÿùÿþÿì ÿý ÿúÿìÿìÿì -*ÿìÿúÿìÿï ÿóÿì$ÿü9!ÿì ÿûÿöÿìÿö&ÿìÿìÿûÿìÿýÿìÿìÿì ÿüÿøÿôÿ÷ ÿìÿì ÿóÿðÿìÿÿÿü ÿü!&ÿìÿìÿíÿìÿì ÿñÿòÿõ2ÿþÿþ ,ÿôÿÿÿïÿìÿõÿì ÿûÿùÿó ÿìÿìÿþÿìÿìÿö ÿò$)!ÿìÿìÿúÿþÿìÿúÿøÿìÿìÿìÿïÿùÿóÿù  ÿì$ÿîÿî:ÿüÿìÿïÿ÷ÿìÿìÿûÿûÿýÿúÿìÿöÿìÿì1 ÿóÿìÿõJÿøÿüÿôÿóÿóÿì0ÿÿ1 ÿú3ÿìÿñÿó;ÿÿÿóÿðÿì ÿì&%*!+GB2 ÿøÿìÿì)ÿúÿìÿìÿìÿùÿìÿì % ÿìÿì ÿÿÿý ÿìÿ÷ÿïÿì ÿýÿìÿìÿíÿíÿìÿìAÿìÿì3ÿìÿì< &ÿý-Y6 "" 4ÿìÿìÿíÿìÿôÿöÿìÿìÿìÿìÿìÿìÿì0 ÿñÿìÿìÿìÿûÿìÿúÿù  (ÿôÿþÿþÿìÿìÿìÿð!ÿþÿìÿì4ÿìÿìÿùÿìÿìÿìÿú<ÿìÿì)1ÿðÿøÿîÿì ÿÿÿþÿìÿø# ÿìÿìÿüÿöÿìÿþÿìÿìÿûÿìÿìÿÿÿóÿôÿú ÿìÿîÿì !ÿìÿìÿìÿìÿÿÿøI2ÿû7ÿðÿþ ÿìÿúÿúÿìÿìÿîÿìÿýÿûÿò ÿþÿ÷ ÿôÿõÿìÿü7ÿìÿÿÿìÿìÿì ÿïÿì9ÿý0$ÿìÿó#$ÿùÿûÿìÿìÿìÿì'"ÿþÿì$#ÿý ÿõ ÿïÿò#ÿìÿìÿù"ÿõÿì ?ÿüÿ÷&ÿìÿüÿýÿÿ5ÿû;=-!ÿôÿìÿþ ÿý ÿìÿìÿøÿìÿý ÿôÿõ ÿï ÿþ ÿìÿ÷ÿìÿû ÿìÿûÿìÿì ÿûÿîÿìÿìÿìÿÿGDÿþI€k/#ÿìÿìÿú4ÿúÿì.ÿìÿìÿìÿþÿìÿìÿìÿìÿøÿþ ÿî ÿ÷ÿì!'ÿüÿúÿÿÿìÿì8ÿìBÿìÿìÿýÿìÿø9_F=H.ÿòÿìÿìEÿìÿìÿÿÿìÿìÿï#ÿóÿõÿóÿó ÿýÿí ÿìÿìÿïÿðÿìÿìÿìCÿìÿüÿûÿìÿìÿì"ÿø 2 ÿôÿìÿõ"ÿì;KCC'ÿÿÿìÿîÿì ÿìÿìÿñÿìÿÿÿìÿñÿöÿìÿì ÿÿÿìÿðÿõÿìÿõ+ÿøÿï ÿìÿúÿìÿùÿì&$ÿöÿòÿì&N&ÿù(RW>0;ÿøÿöÿïIGÿìÿìÿíÿìÿìÿìÿìÿìÿì  ÿìÿì5ÿì ÿùÿù$ÿîÿì$ÿìÿí'ÿìÿìÿìÿì(&*ÿì ÿìÿì!Amf4F;%?* +4ÿöÿìÿøÿìÿüÿîÿìÿýÿìÿøÿìÿìÿÿ+ )ÿñÿìÿïÿìÿìÿøÿýÿìÿìÿì A ÿìÿìÿìÿìHMpP9:7 ÿìÿì ÿþÿòÿòÿìÿòÿìÿùÿþÿìÿòÿìÿìÿìÿ÷ÿìÿìÿìÿìÿðÿìÿìÿöÿìÿìÿìÿìEN, '3<ÿìÿìÿì'2B‡bSf>0ÿöÿìÿìÿøÿìÿìÿþÿüÿõÿþÿìÿð ÿìÿì ÿöÿ÷ÿúÿõÿÿ ÿü)ÿñ#ÿìÿîÿìÿìÿý"ÿü7ÿüÿö5!ÿÿÿýNkY‚a ÿìÿìÿìÿìÿüÿìÿü Gÿìÿø)ÿìÿìÿìÿûÿúÿùHCÿìÿìÿìÿìÿìÿìÿì`ÿìÿíÿìÿì \\&$ÿ÷ÿø 0>?(/4-R]. ÿþÿüÿìÿîÿìÿø >=ÿìÿìÿöÿõÿìÿìÿìÿøÿìÿìÿÿÿû ÿÿÿöÿú ÿî.ÿôÿì/&u\&OB.j+ÿîÿþ<f0,:W`”^bT$ÿìÿóÿì ÿìÿìÿìÿìÿô=*/ÿìÿì-ÿüÿìÿïÿð$ =ÿóÿñ ÿì ÿìÿìM=HD3^,'QM/,"Ik64(46ÿòÿìÿì ÿ÷ÿìÿìÿóÿôÿí ÿóÿìÿðÿü(48 ÿìÿñÿìÿìÿìÿìCÿñÿìÿì%'3ÿÿÿìÿì$OnTkoi^tl8HD<ZT7,ÿóÿñÿô ÿìÿõÿ÷ÿì ÿø*ÿüÿìÿìÿìÿìÿìÿô ÿü6ÿþÿðÿìÿì+ÿõÿìÿìÿùÿì4! (:KAatXPv\ 9J-?gkÿìÿõÿìÿìÿïÿìÿìÿ÷ÿìÿìÿìÿìÿñÿöÿþÿøÿôÿð %ÿìÿìÿìÿýÿìÿì 5+ /ET{25ÿò"?F/0 ÿôÿúÿìÿþÿü=ÿúÿÿ&" 5ÿì*)ÿìÿì6ÿù ÿìÿì$D5<#46S]XfytƒAÿòÿû%(Uƒ‚`ÿóÿìÿúÿìÿìÿòÿìÿýÿìÿôÿìÿìÿñÿìÿìFÿðÿìÿìÿìÿþ ÿìÿìÿìÿìÿì*ÿùÿî% 6.-2yˆgA&-}¦j ÿÿÿ÷ÿöÿì ÿóÿõÿñÿíÿìÿìÿõÿì ÿìÿìÿö8ÿýÿìÿìÿñÿìÿð?"ÿì'ÿìÿìÿúÿì/ÿòÿìÿìFAŽtds´ÙŠ#?)?ÿìÿìÿ÷ÿìÿîÿïÿú ÿíÿìÿö/ÿìÿïÿîÿø ÿìÿìÿìÿìÿìÿôÿÿÿþÿôÿÿÿô"  $1:ÿï.Y‡¤¬ªÛì ÿìÿìÿì+ÿöÿý$$ÿþÿìÿîÿìÿì+ÿöÿõ6/ÿìÿìÿñÿñ ÿðÿìÿìÿðÿìÿìÿøÿþÿìÿûÿì$9H?ÿüÿóÿþÿòÿùCd–Äž¦žT"ÿìÿìÿÿÿìÿìÿïÿõÿì ÿð ÿöÿí3ÿóÿ÷ÿìÿùÿìÿì ÿì+!ÿÿÿìÿùÿùÿìÿ÷ÿôÿÿÿìÿûÿìÿìÿõÿì0?,Igˆ@ÿìÿìÿôÿìÿìÿø"2ÿìÿñÿì"ÿøÿ÷ÿï!ÿì4 ÿûÿÿÿìÿïÿìÿìÿìÿìÿìÿó! ÿö ) ÿõÿüÿó ÿî"/ÿìÿì $ÿíÿìÿöÿìÿìÿìÿì9ÿì ÿìÿì8 ÿìÿòÿó0ÿðÿìÿìÿüÿìÿìÿúÿþÿÿÿìÿìÿñÿöÿó$ÿíÿî*ÿüÿìÿìÿìÿôÿì<XÿþÿìÿìÿñÿìÿìM&ÿö+ÿíÿì ÿìÿìÿõ"!ÿöÿôÿìÿìÿìÿìÿíÿóÿìÿñÿñ ÿöÿúÿúÿìÿìÿù ÿöÿìÿô#ÿòÿ÷ÿñÿîÿôÿöÿìÿìÿìÿü3ÿìÿìÿìÿþ ÿõÿíÿìÿìÿöÿìÿûÿìÿôÿñÿí ÿìÿ÷ÿìÿõÿìÿìÿìÿìÿí ÿíÿìÿü ÿìÿìÿìÿìÿìÿøÿÿ$$ÿïÿí4ÿðÿìÿýÿì>7 ÿìÿìÿíÿìÿô&ÿìÿüÿìÿì ! ÿì ÿìÿìÿðÿì ÿþÿôÿì#ÿþÿøÿìÿúÿÿPÿìÿì&ÿóÿ÷ÿðÿì%C2ÿì5ÿìÿìÿúÿìÿìÿìÿøÿþ (ÿýÿþÿûÿþÿìÿì ÿì) ÿì&ÿìÿìÿúÿìÿì ÿõÿìEÿìÿýÿìÿìÿìÿùÿìÿìÿýÿ÷ ÿòÿìÿüÿþ5$ÿðÿìÿÿ ÿñÿûÿÿ ÿÿ *ÿÿ9 ÿìÿìÿìÿûÿìÿÿÿøÿìÿìÿôÿþÿìÿìÿìÿøÿû ÿ÷*ÿþ2ÿþÿìÿìÿìÿû ÿìÿìÿìÿìÿìÿìÿìÿì ÿöÿùÿýÿïÿï'ÿøÿìÿ÷ÿì ÿìÿóÿò ,ÿìÿìÿùÿìÿì ÿìÿìÿöÿì ÿíÿìÿú"ÿìÿôÿ÷ ÿìÿìÿìÿøÿõ%ÿþ ÿïÿìÿìÿìÿì ÿûÿøÿì2ÿìÿô.*ÿìÿìÿì ÿýÿìÿì+ ÿù)ÿôÿîÿó ÿíÿùÿìÿìÿìÿìÿìÿõÿì ÿì ÿ÷! ÿüÿýÿö+ ÿìÿñÿýÿúÿì ÿìÿìÿì$ÿû Iÿö/ÿìÿüÿòÿî'ÿðÿìÿì ÿïÿìÿì0ÿÿÿïÿö7ÿöÿÿ*Kÿþ ÿì+ÿùÿø ÿûÿìÿìÿìÿì ÿðÿì.ÿì ÿöÿõÿõÿìÿñ ÿì ÿìÿì*ÿýÿìÿó.ÿìÿì ÿîÿìÿú!L ÿìÿìÿìÿìÿõÿì&ÿðÿúÿì ÿìÿì5ÿìÿìÿõÿìÿìÿñÿ÷72ÿò"ÿþÿì8?ÿìÿìÿüÿìÿîÿìÿì%ÿìÿìÿìÿÿÿøÿü1ÿìÿýÿíJ ÿìÿì ÿüÿóÿì ÿü ÿìÿü5&ÿý&&ÿìÿù &ÿüÿìÿìÿìÿìÿû&'ÿìÿó3ÿì ÿÿÿìÿìÿò)'ÿìÿìÿÿÿíÿìÿüÿõÿíÿìÿûÿùÿìÿìÿìÿúÿþÿìÿþÿõÿòÿìÿõÿìÿù#! ÿìÿýÿìÿì)8ÿöÿìÿìÿìÿôÿÿÿýÿýÿùÿ÷ÿøÿìÿì 4#ÿìÿìÿûÿøÿð ÿìÿö'ÿÿÿìÿì  ÿìÿ÷ÿìÿðÿìÿì ÿìÿú ÿì ÿóÿÿ85ÿîÿîÿô(ÿóÿìÿð"ÿüÿìÿìÿìÿìÿüÿì Aÿúÿìÿìÿíÿíÿ÷ÿìÿò ÿöÿìÿþ  ÿì'ÿìÿìÿõ ÿìÿì.?ÿñÿûÿþ:!ÿìÿ÷ÿìÿìÿìÿìÿíÿìÿì0&ÿìÿî'ÿìÿú- &ÿì ÿîÿôÿìÿìÿñ ÿìÿï%ÿìÿôÿìÿõÿì%)ÿì*ÿìÿìÿïÿì'!,%" ÿõÿìÿìÿìÿìÿìÿì*ÿìÿõÿñ%ÿþÿì:ÿì#ÿì*ÿìÿì$ÿðÿìÿúÿìÿöÿìÿìÿìÿüÿì%ÿìÿïÿñÿó0 ÿþÿìÿø"ÿþÿñÿìÿìÿì9 ÿþ ÿìÿì#(ÿìÿì@ÿì ÿì 6ÿìÿñ($ÿìÿìÿìÿìÿìÿìÿìÿü-ÿûÿìÿý ÿìÿìÿìÿì91"ÿûÿõÿúÿìÿüÿôÿìÿíÿíÿì ÿòÿûÿîÿìÿî5ÿì5ÿì-ÿìÿôÿìÿìÿõÿõÿýÿîÿõEÿìÿìÿÿÿìÿìÿð ÿúÿìÿì (ÿð ÿîÿìÿøÿìÿì"ÿõÿýÿìÿìÿìÿìÿìÿìÿìÿì6ÿöCÿó: ÿòÿÿÿìÿðÿìÿìÿòÿúÿìÿì#ÿú 4ÿìÿðÿñÿõ  ÿøÿìÿóÿÿÿì ÿöÿøÿìÿìÿìÿìÿùÿû,' ÿìÿìÿþÿÿ%ÿì*ÿìÿìÿìÿìÿìÿîÿìÿì!ÿìÿìÿÿÿìÿ÷5-ÿøÿüÿõ ÿÿÿìÿìÿü ÿì ÿìÿñ5 )ÿý,ÿýÿìÿìÿìÿìÿÿ!ÿñ ÿì'1$ÿì-ÿíÿìÿìÿìÿÿ*ÿîÿõÿìÿì$"ÿìÿòÿìÿñÿìÿüÿìD-!ÿìÿìÿìÿýÿõ#ÿö5ÿìÿì!ÿìÿîÿìÿóÿþÿì ÿìÿìÿò#ÿìÿðÿüÿì ?ÿÿÿ÷ÿì/ÿÿÿìÿþÿìÿìÿìÿùÿì&!ÿìÿìÿñ#ÿìÿöÿñÿìÿîÿò5 ÿìÿöÿìÿþ-ÿìÿúÿìÿì 0) ÿû7ÿñÿöÿìÿüÿñÿì ÿìÿøZ ÿì!ÿì ÿùÿúÿìÿíÿìÿìÿôÿìÿìÿìÿìÿíÿìÿìÿøÿ÷ÿùÿò&ÿÿÿúÿìÿïÿþÿìÿü (8ÿÿ &ÿìÿ÷ÿì"8 ÿþÿü&ÿÿ ÿúÿìÿôÿìÿøÿìÿò9 ÿøÿìÿôÿøÿì ?ÿôÿõÿó(ÿì ÿþÿìÿìÿìÿíÿü$"ÿñÿòÿýÿìÿöÿìÿìÿìÿìÿôÿìÿý ÿìÿôÿî:ÿûÿïÿì ÿïÿìÿúÿìÿþÿìÿì Oÿìÿìÿî ÿìPÿüÿì&ÿÿÿìÿîÿìÿì>$)ÿìÿìÿþÿìÿù%ÿó? *ÿóÿìÿì,6ÿìÿì ÿìÿöÿí ÿÿÿúÿìÿôÿìÿ÷ÿì1ÿìÿùÿìÿì+ÿìÿì ÿøÿîÿìÿ÷ÿ÷ÿìÿìÿìÿìÿìÿìÿìÿû!$ÿöÿÿÿñÿïÿìÿìÿì4ÿù ÿð$ÿõ #!ÿúÿì&ÿ÷ÿìÿÿÿì(ÿüÿìÿìÿìÿì 0 ÿ÷ÿòÿþÿö $,ÿóÿìÿì5ÿüÿöÿöÿñÿìÿþÿùÿìÿïÿìÿìÿì ÿïÿì"ÿúÿîÿô2ÿìÿþÿìÿìÿìÿìÿìÿö ÿìÿì  ÿó&#ÿîÿ÷ÿñÿúÿìÿïÿì,.ÿìÿíÿ÷ÿóÿú ÿìÿïÿüÿõÿõÿöÿúÿìÿó ÿý* ÿþÿöÿì4ÿì_ÿôÿìÿûÿùÿìÿìÿøÿõ% ÿòÿóÿïÿøÿÿT#ÿõÿìÿïÿü.ÿùÿò ÿìÿìÿìÿïÿö ÿìÿìÿíÿì ÿñÿúÿì ÿúÿð ÿìÿÿÿûÿýÿúÿþ A!ÿóÿì ÿìÿðB+ÿöÿî++'ÿìÿì ÿô ÿïÿ÷ÿìÿìÿóÿõÿï ÿüÿìÿï ÿìÿýÿðÿÿÿûÿðÿôÿìÿìÿì ÿ÷ÿûÿñÿíÿþ ÿ÷ÿìÿìÿøÿü  ÿìÿþÿìÿì&(ÿïÿì,ÿìÿòÿþÿîÿÿÿìÿìÿì ÿóÿìÿì ÿøÿìÿìÿìÿìÿó* ÿÿ#ÿìÿì ÿüÿóÿì "ÿìÿøÿïÿúÿôÿöÿìÿôÿìÿûÿùÿôÿìÿóÿìÿìÿìÿìÿøÿÿÿÿÿóÿìÿìÿüÿì ÿìÿñÿíÿì ;$ÿìÿìÿýÿþÿìÿìÿï%ÿíÿíÿì)8ÿüÿñÿìÿøÿòÿìÿíÿíÿ÷ÿìÿýÿôÿ÷#ÿìÿìÿõÿöÿìÿóÿìÿìÿìÿúÿúÿüÿí ÿþÿñ ÿìÿï,ÿýÿü 'ÿüÿìÿìÿìÿ÷ÿìÿûÿìÿìÿî&ÿýÿúÿìÿì2ÿíÿìÿìÿôÿìÿø0ÿý& ÿú>ÿ÷ÿìÿì/%ÿòÿìÿúÿì(2.D7ÿîÿìÿìÿì, ÿ÷ÿìÿñÿôÿòÿûÿìÿìÿî) ÿìÿøÿîÿüÿòÿìÿíÿ÷ÿïA ÿìÿìÿûEÿõÿìÿþ2ÿì @dGÿøÿþ Eÿõÿìÿìÿìÿíÿýÿìÿìÿìÿìÿïÿìÿó=ÿ÷ÿìÿìÿù ÿìÿïÿõÿô1&ÿìÿýÿîÿ÷ ÿìÿì%ÿìÿì ÿìÿìÿõÿüÿÿÿüÿò,ÿìÿìÿð'ÿüÿôÿìÿì33ÿøÿøÿùÿìÿì /ÿúÿòÿò ÿïÿïÿìÿôÿñÿïÿõÿìÿìÿõÿìÿìÿìÿùÿÿÿìÿýÿìÿìÿùÿñÿìÿìÿþÿôÿì /ÿö6ÿøÿìÿÿÿìÿúÿøÿñÿîÿìÿíÿìÿøÿð ÿôÿìÿÿÿìÿôÿìÿì#;ÿìÿìÿìÿìÿî ÿìZ7 ÿìÿì ÿìÿìÿóÿìÿìÿìÿìÿìÿõ $%ÿìÿìÿö#7ÿìÿìÿÿÿíÿö ÿøÿö*ÿìÿì9ÿòÿñÿú0,O' (`A&"ÿýÿìÿôÿìÿø ÿìÿì#ÿìÿìÿìÿ÷ÿþÿüÿýÿìÿìÿñÿúÿôÿìÿüÿìÿð ÿíÿò ÿì#,ÿöÿþÿìÿìÿþA]=(fŒx&"ÿöÿðÿý"ÿù ÿìÿìÿìÿúÿìÿìÿìÿþÿõÿõ ÿ÷ÿìÿìÿìÿóÿî(ÿø:*ÿôÿìÿìÿìÿþ.ÿ÷ÿìÿû,.ÿìÿì  :Q@$6kb@5ÿðÿìÿìÿô3ÿìÿìÿòÿìÿìÿì+ÿöÿìÿìÿó!ÿìÿìÿìÿôÿìÿøÿìÿì_!ÿìÿóÿùÿïÿìÿìÿù  Mÿñÿî :CM/ %,TJ ÿðÿìÿìÿì ÿöÿìÿðÿì*ÿûÿìÿìÿìÿìÿìÿð" ÿìÿìÿôÿìÿì)ÿøÿìÿôÿðÿìÿìÿìÿø,ÿùKP' Dw\#HDG:#ÿýÿìÿûÿõ'5ÿõÿìÿìÿìÿìÿìÿìÿìÿìÿù!ÿìÿì59ÿìÿì ÿúÿó+ÿûÿòÿìÿúÿìÿìÿìÿ÷B9> -$-@.$@;- ÿú ';ÿöÿìÿðÿìÿîÿìÿìÿù ÿì ÿìÿù7 ÿìÿðÿýÿûÿìÿìÿìÿìÿó277&dEHQWr2+* ÿìÿø &4ÿõÿõÿòÿìÿìÿìÿì ÿúÿìÿìÿìÿñÿþÿï ÿòÿì ÿìÿöÿúÿìÿïÿìÿï ÿìÿì CrH>4AdoÿûMEWiH6"ÿôÿìÿìÿìÿì ÿùÿíÿð ÿÿ ÿìÿí ÿúÿïÿùÿìÿìÿüÿö*ÿì(ÿìÿìÿìÿüÿô!97+-2ƒo'!%3PˆZPk0ÿñÿðÿìÿìÿìÿìÿûÿìÿì2Gÿõÿì9ÿ÷ÿõÿìÿûÿì 62ÿìÿìÿùÿíÿ÷ÿìÿì#ÿöHÿýÿìÿò&ÿìÿü;Z& )<R'BieV€s76Nÿìÿì ÿýÿõÿìÿì%2ÿþÿôÿö8ÿùÿìÿìÿìÿÿ%ÿìÿìÿôÿìÿ÷ÿýÿìÿñ ÿîÿì beI4^@%*S‹lf€¢“5B ÿôÿìÿìÿìÿýÿìÿñÿóÿìÿì (" ÿòÿì ÿìÿûÿî !Kÿìÿüÿ÷ÿìÿì'E2ÿø?DObžŽs{u€mi6ÿìÿð ÿìÿìÿìÿìÿìÿï ÿþÿìÿìÿì 00ÿòÿøÿìÿìÿìÿìÿøLÿîÿìÿì ÿìÿìÿìÿò0U@Z{yx°ši_t„ˆ‹< ÿìÿò%ÿìÿìÿìÿõ ÿøÿõ 0ÿìÿìÿíÿìÿìÿì!ÿô+8ÿûÿìÿìÿì&ÿìÿìÿìÿòÿí$ÿùÿòÿìÿú%F2NR6H„kFq{AD^iMÿîÿî"ÿìÿìÿìÿíÿìÿìÿýÿúÿìÿìÿóÿìÿþÿþÿìÿìÿìÿö*ÿìÿìÿìÿìÿùÿîÿýÿù ÿñÿýÿì%bq8QqA 1Q‚b + ÿúÿóÿñÿíÿì -(!'ÿìÿì-/ÿîÿìÿÿ/ ÿôÿìÿì"33% ÿì,5,4C[Š`1.mtp?<ÿìÿïÿü ÿöÿõÿìÿðÿ÷ÿö ÿìÿðÿøÿìÿû3 ÿì->ÿðÿìÿöÿìÿôÿìÿìÿûÿìÿìÿñÿùÿì 8 ÿýI^ReSYk•ˆA ÿøÿìÿìÿìÿïÿìÿìÿìÿüÿÿÿìÿñ ÿì"ÿìÿì.ÿìÿò ÿì+ÿìÿìÿüÿöÿï$ÿõ# #ÿìÿöÿìÿìh“ÂÊäÊY 6#5ÿìÿ÷ÿìÿýÿìÿìÿìÿìÿðÿìÿóÿìÿüÿö ÿõÿùÿìÿìÿìÿðÿþÿ÷ÿîÿô ÿ÷ &7 **ÿú5ÿìÿìÿì2_«ÐÅìÍ\ÿüÿ÷ÿô"ÿþ$ÿÿ%ÿöÿìÿóÿöÿì+ÿìÿí"ÿñÿîÿýÿøÿüÿøÿøÿìÿìÿúÿûÿ÷!<K#ÿìÿ÷ÿóÿýÿìÿìÿý 9ouo„[ÿôÿìÿìÿøÿýÿìÿöÿìÿ÷5ÿìÿìÿìÿìÿñÿï#ÿûÿóÿþÿìÿìÿîÿîÿíÿ÷ÿíÿìÿòÿÿÿûÿìÿúÿýÿìÿì ÿõÿìÿý)ÿü*]Sÿÿÿìÿìÿõÿýÿìÿìÿìÿð /ÿìÿ÷ÿìÿìÿì ÿìÿ÷#  ÿíÿïÿìÿìÿìÿìÿúÿìÿìÿòÿñÿí'ÿóÿìÿìÿìÿíÿüÿìÿìÿôÿìÿìÿóÿìÿøÿìÿìÿþ.ÿþÿùÿ÷7ÿðÿìÿìÿðÿìÿìÿÿÿñ #ÿôÿìÿì%ÿùÿûÿìÿìÿõÿü4 ÿóÿìÿìÿìÿìÿì <ÿìÿìÿòÿì@"ÿì$ÿìÿì ÿûÿìÿÿÿìÿø(ÿüÿðÿúÿìÿìÿìÿìÿîÿìÿñÿùÿÿ ÿìÿï ÿüÿùÿóÿüÿóÿìÿþÿìÿó ÿöÿíÿîÿíÿìÿìÿìÿüÿìÿíÿìÿìÿüÿñ$ÿìÿìÿíÿóÿìÿìÿìÿìÿùÿûÿìÿþÿðÿúÿûÿóÿìÿìÿìÿïÿþÿÿÿìÿìÿìÿôÿ÷ÿìÿìÿìÿì %ÿÿÿø0ÿìÿñ=ÿý(ÿìÿì !ÿú4)-ÿìÿìÿìÿü;ÿüÿúÿòÿìÿøÿï&ÿÿÿïÿìÿùÿø"ÿìÿìÿøÿð )ÿìÿðÿý4ÿìÿì%, ÿÿ>ÿìÿüDÿñÿíÿì&ÿóÿþ ÿìÿîÿì ÿôÿþ&ÿúÿìÿø&ÿ÷&ÿõÿúÿú!ÿìÿìÿíÿî ÿìÿïGÿìÿðÿìÿüÿôÿìÿôÿîÿìÿñÿûÿìÿü2ÿü#ÿ÷ÿ÷ÿìÿõ?ÿî. ÿøBÿúÿì ÿìÿìÿðÿìÿüÿñÿìÿøÿ÷ÿóÿùÿìÿìÿðÿì#(ÿìÿýÿôÿìÿìÿ÷ÿìÿìÿìÿúÿì ÿíÿìÿìÿìÿìÿúÿüÿìÿì&ÿÿÿûÿùÿìÿìÿòÿõ/ÿìÿþ(ÿìÿì ÿ÷ÿñÿìÿúÿìÿüÿöÿìÿýÿþÿîÿóÿí%ÿìÿûÿìÿìÿñÿî(ÿñÿìÿÿ ÿúÿúÿìÿì.ÿü-:ÿìÿì*ÿûÿÿÿìÿüÿìÿ÷ÿüÿìLÿýÿò4ÿìÿòÿñ"ÿúÿìÿîÿìÿìÿìÿìÿìÿóÿû&ÿìÿûÿö3ÿø'ÿóÿþ ÿðÿóÿþÿìÿìÿóB ÿþB&ÿìÿýÿìÿì 8ÿìÿìÿþÿìÿìÿì ÿ÷ÿìÿì? ÿÿ3ÿùÿìÿîÿùÿì0?ÿìÿì ÿï ÿîÿñÿìÿì ÿìÿìÿùÿøÿ÷ÿìÿúÿù ÿìÿì#8ÿìÿì ÿøÿìÿì ÿ÷ÿìÿì6Sÿÿÿìÿìÿùÿìÿìÿöÿûÿìÿüÿìÿïÿìÿîÿì ÿ÷ÿìÿì ÿìÿò3N%ÿ÷ÿì0"ÿìÿì0ÿìÿìÿõÿ÷ÿìÿþ%ÿýÿìÿì ÿìÿôÿì)ÿúÿõÿù*ÿÿ ÿþÿì#!!# &ÿìÿõ(ÿðÿìÿìÿìÿì ,ÿìÿì86!ÿûÿìÿì'ÿìÿìÿþÿï5 ÿøÿþ"ÿýÿìÿìÿòÿìÿìÿìÿìÿìÿìÿíÿþ(ÿìÿòÿìÿðÿìÿó ÿìÿìÿì$ÿìÿì ÿðÿíÿìÿìÿìÿìÿïÿìÿì7,ÿìÿìÿûÿìÿìÿúÿìÿìÿò ÿìÿí ÿðÿÿÿîÿøÿìÿø6ÿþ ÿþÿû ÿóÿó"&ÿìÿòÿ÷ÿì ÿïÿþ 'ÿðÿìÿí2ÿíÿïÿî+ÿÿÿìÿ÷ÿýÿøÿìÿìÿìÿô?ÿìÿûÿùÿö ÿïÿìÿóÿúÿôÿüÿ÷ÿìÿìÿïÿì ÿìÿ÷ÿ÷ÿ÷6 ÿú ÿÿ$ÿìÿìÿì20ÿöÿí 1ÿìÿüÿðÿìÿìÿìÿòÿùÿîÿóÿìÿìÿì3ÿôÿìÿìÿìÿûÿî- ÿìÿûÿíÿþÿõÿñÿìÿü&ÿìÿìÿüÿí ÿìÿôÿìÿúÿï3 ÿì#?ÿðÿìÿûÿøÿì!$)+*ÿúÿõÿìÿìÿúÿïÿìÿì0ÿìÿì)ÿøÿýÿïÿì3:ÿïÿì/ ÿìÿìÿþÿì ÿì ÿì#*/ÿìÿõÿì / ÿìÿìÿìÿò4ÿýÿìÿì ÿù ÿïÿÿÿìÿìÿìÿìÿùÿû>1ÿÿÿì-# ÿì%ÿìÿüÿìEÿúÿìÿþ+ÿúÿìÿìÿìÿìÿìÿì /ÿì&"6ÿïÿìÿìÿì#90ÿïÿì$,ÿöÿòÿôÿìÿóÿ÷ÿìÿì ÿìÿþÿûÿõÿìÿö- ÿì:ÿïÿìÿü!ÿìÿìÿìÿòÿî%ÿìÿì#*$ÿìÿûÿìÿìÿì1#ÿðÿìÿìÿöÿüÿö ÿìÿìÿîÿíÿìÿì3ÿþÿóÿìÿìÿöÿøÿìÿìÿì4ÿÿÿùÿìPÿûÿìÿõÿïÿìÿíÿì ÿìÿñÿò$.ÿìÿìÿ÷ÿìÿíÿð5#ÿýÿì ÿüÿìÿöÿìÿìÿýÿïÿúÿüÿü !ÿøÿí ÿìÿìÿòÿúÿò:ÿóÿìÿõÿñ ÿìÿìÿìÿìÿûÿìÿý%ÿðÿì #ÿûÿôÿûÿñÿû4ÿìÿìÿùÿìÿóÿî ÿûÿìÿìÿÿÿìÿì 76,ÿû ÿø$ÿ÷ÿìÿìÿìÿì:ÿìÿì ÿû"ÿý ÿì.ÿìÿìÿì:ÿïÿìÿìÿì$ÿðÿìÿðÿöÿìÿóÿìÿìÿó"ÿúENÿûÿìÿòÿùÿñ8ÿöÿ÷ÿô%ÿìÿðÿìÿìÿúÿìÿìÿûÿìÿÿÿì"H-Gÿì ÿôÿïÿìÿìÿûÿìÿò ÿìÿûÿïÿþ+5ÿìÿúÿïÿþÿü!ÿ÷ÿì, " ÿÿÿíÿ÷ÿü5/ ÿøÿóÿúÿþÿíÿ÷ ÿõÿîÿüÿóW ÿòÿìÿî(ÿõÿì ÿöÿòÿòÿîÿìÿýÿôÿîÿö!ÿì ÿîÿìÿþÿíÿìÿðÿüÿìÿõÿöÿïÿø!ÿìÿÿÿìÿ÷ÿÿÿñ!(ÿìÿþÿÿ="ÿìÿìÿì&ÿùÿó ÿþ ÿìÿìÿìÿòÿìÿúÿìÿù! 2*ÿ÷ÿþÿìÿï ÿìÿì Nÿìÿìÿî(ÿìÿìÿûÿýÿì/ÿì&1ÿóÿ÷ÿöÿüÿöÿìÿìÿìÿðÿì")ÿÿ )ÿìÿî,ÿ÷ÿìÿìÿìÿìÿýÿõÿô ÿþÿþÿôÿû*ÿìÿì$ÿìFÿìÿì ÿìÿýÿðÿþ&ÿúÿûÿìÿìÿìÿùÿõÿõ<ÿìÿì4ÿú* ÿîÿìÿìÿðÿìÿìÿýÿìÿúÿýÿøÿìÿíÿõÿìÿøÿûÿìÿì*ÿìÿì ÿìÿûÿùÿìÿìÿìÿìÿìÿìÿôÿìÿì!ÿùÿìÿðÿìÿì1ÿôÿìÿý('ÿû &ÿìÿöÿÿÿîÿúÿýÿìÿõÿñÿòÿìÿìÿúÿÿ#ÿìÿìÿðÿþÿñÿìÿÿ 0ÿüÿþÿìÿìÿì+ÿûÿÿÿìÿìÿñ ÿìÿìÿöÿýÿìÿìÿùÿìÿì1ÿõÿìÿõ"6 ÿìÿñ ÿìÿìÿìÿì ÿó/ÿ÷ÿìÿüÿíÿþÿìÿìÿìÿðÿû- ÿ÷ÿó ÿì1Bÿþÿì ÿú ÿ÷ ÿìÿ÷ÿù ÿìÿìÿìÿìÿìÿðÿõ ÿì" ÿõ8Bÿøÿíÿî ÿþÿìÿìÿÿÿìÿøÿû6Yÿðÿô ÿìÿøAÿìÿõ/ÿìÿìÿìÿìÿúÿñÿþ71ÿìÿìÿñ#ÿóÿîÿ÷ÿðÿü0&ÿìÿì ÿøÿúÿòÿü ÿþ'ÿìÿþÿð%ÿìÿì9ÿñÿò ÿì7ÿúÿû ÿòÿôÿþÿõ ÿóÿìÿôÿñÿý "&ÿùÿþÿìÿìÿû ÿúÿìÿþÿðÿìÿìÿþÿôÿì ÿó%ÿüÿìÿìÿìÿìÿìÿúÿñÿìÿì ÿ÷ÿìÿõÿùÿðÿì ÿóÿíÿúÿìÿñ#ÿòÿíÿìÿì!)ÿìÿìÿðÿþÿìÿìÿû ÿìÿì  $ÿíÿì#ÿìÿö"ÿìÿìÿþÿìÿìÿü*( ÿìÿìÿõÿìÿìÿìÿìÿ÷ÿòÿìÿìÿìÿýÿìÿû ÿ÷ÿìÿìÿìÿìÿìÿì  2$ÿõÿüÿìÿÿÿìÿìÿðÿìÿûÿ÷ÿìÿìÿì%5 ÿìÿìÿð ÿôÿìÿìÿø%ÿúÿðÿ÷ÿð ÿúÿýÿûÿì ÿøÿùÿìÿøÿìÿìÿìÿìÿòÿì#ÿñÿþÿìÿó"ÿì )ÿóÿü&&ÿìÿìÿì'ÿõÿìÿúÿìÿìÿ÷ ÿûÿôÿúÿõÿý#ÿìÿìÿìÿìÿìÿìÿìÿìÿóEÿöÿîÿìÿõÿÿÿøÿïÿì-ÿøÿû71ÿñÿìÿì%6 ÿìÿìÿìÿúÿóÿûÿûÿñÿì*ÿí ÿìÿýFÿöÿìÿõÿìÿì "ÿûÿì '..&ÿýÿì3,,ÿìÿìÿìÿìÿì ÿìÿìÿìÿöÿñÿüÿìÿÿ ÿõÿìÿñÿìÿòÿñÿìÿô5ÿì ÿùÿïÿìÿìÿìÿìÿîÿò$ÿìÿìÿùÿìÿìÿì+(ÿìÿìÿì ÿïÿìÿì 99ÿþÿìÿú"ÿìÿìÿìÿóÿìÿìÿì ÿýÿöÿøÿìÿïÿìÿìÿùÿÿÿìÿìÿìÿøÿìÿì ÿøÿìÿùÿþÿô# (ÿì8 ÿì ÿìÿì ÿìÿìÿìÿìÿìÿìÿìÿïÿìÿì ÿìÿñÿìÿì5:ÿìÿìÿóÿñ 4 ÿì<ÿì#  ÿþÿìÿóÿðÿìÿìÿÿÿìÿìÿìÿí ÿóÿø ÿø 1ÿúÿìÿþ%Z'ÿìÿïÿó"ÿìÿìÿý ÿÿÿó#ÿóÿìÿû!4ÿöÿî ÿú ",P3:3 ÿøÿøÿìÿìÿûÿüÿì ÿñÿì"ÿìÿìÿîÿìÿûÿìÿóÿþÿìÿìÿìÿý +ÿþÿìÿý# !ÿ÷ÿùÿìÿì 4]Y@FWC ÿûÿìÿìÿùÿìÿûÿýÿìÿïÿúÿûÿñÿìÿìÿ÷ÿìÿÿ8ÿï F4ÿòÿìÿûÿìÿìÿì 6ÿóÿð%ÿìÿìDBG‰I@e:" ÿÿÿûÿìÿìÿì ÿòÿìÿôÿöÿìÿìÿïÿìÿì2ÿõÿìÿìÿìÿõÿìÿìUÿìÿõÿíÿìÿìÿìÿýlÿöÿì6?)DdZ. !*0 ÿûÿîÿìÿòÿý ÿî6ÿúÿì!ÿûÿìÿìÿìÿìÿóÿìÿø ÿñÿìÿ÷ ÿìÿì ÿôÿìÿìNEÿìÿìÿì <ÿì+S?25€k*#ÿîÿì ÿÿ7 ÿõÿíÿûÿÿÿìÿìÿøÿìÿôÿìÿó2!ÿìÿì?'"ÿìÿìÿþÿû  ÿìÿóÿûÿìÿì ÿý05HCG<N+ÿùÿìÿþÿóÿìÿøÿùÿöÿîÿìÿðÿìÿìÿøÿìÿìÿìÿ÷ÿõÿþÿì(ÿìÿûÿú*ÿø ÿìÿð ÿìÿü0 AJTGmU#.0>^6!ÿô *ÿú)ÿìÿ÷ÿìÿìÿìÿìÿì0 ÿýÿîÿìÿì ÿìÿó&ÿì ÿïÿìÿòÿìÿìÿì<9T<>†A!V5DEÿúÿ÷ÿìÿìÿó ÿúÿì ÿìÿì ' ÿíÿìÿ÷ÿûÿðÿìÿìÿì&'ÿïÿìÿþÿìÿïÿìÿì+  6$L¡‰G?69N~C(JÿìÿìÿñÿìÿìÿìÿìÿìÿìALÿíÿì F#ÿ÷ÿì +ÿý ÿìÿýÿ÷ÿïÿìÿì)ÿùÿûÿìÿû-ÿìÿú+ ÿöÿøEcPM|w[YHÿÿ1ÿïÿúÿûÿòÿûÿøÿìÿìÿûFÿüÿìÿìÿì,ÿìÿïÿìÿþÿïÿì %ÿúÿõÿìÿÿ;K5ÿì* 5gntŠ•—k2ÿú .'"ÿüÿìÿìÿìÿìÿìÿñÿîÿì /ÿøÿþÿì ÿø"ÿÿÿòÿì0Kÿõÿî *ÿìÿì'"ÿìÿõÿì!)O‹‰ˆ°½¨Rÿìÿìÿî?ÿìÿú$ÿì ÿìÿðÿìÿìÿø) ÿûÿìÿìÿì/(1ÿ÷ÿûÿìÿìÿìÿöFÿýÿóÿñ ÿþ ÿìÿüÿìÿðÿû2%6B?<{€sy™œ‹,ÿüÿìÿì-Bÿìÿìÿì$+ÿþÿìÿøÿüCÿìÿìÿòÿìÿìÿìÿÿ,#&ÿ÷ÿïÿìÿöÿìÿìÿìÿìÿøÿðÿìÿìÿñ !6<EUXkzPZxJÿìÿì1ÿìÿïÿôÿÿÿìÿìÿüÿþÿìÿòÿû ÿìÿìÿÿÿìÿì#ÿðÿìÿøÿõÿìÿìÿìÿõ$ÿö"ÿöÿîÿìÿìÿïÿû*J6O`:%:]€Aÿì-% ÿøÿöÿì& ÿíÿýÿþÿìÿþÿûÿû,"ÿìÿí $-ÿì;ÿì0ÿìÿü'71 ÿì ÿþ ÿõ"@I+i·ž•G 1ÿÿÿýÿì ÿìÿìÿíÿûÿìÿì1)4&ÿøÿìÿô ÿìÿüÿìÿìÿìÿýÿìÿüÿü ÿùÿìBÿõÿìÿò ,V‘³–ŽJÿíÿíÿõÿûÿìÿóÿýÿì ÿòÿòÿìÿìÿð ÿúÿì ÿ÷ÿì/ÿìÿìÿïÿìÿíÿìÿýÿìÿîÿìÿòÿøÿü$0ÿõÿøÿìÿìÿõL¦Ö{"ÿôÿ÷ÿìÿøÿñÿìÿìÿìÿýÿì%ÿìÿìÿü*ÿÿÿý * ÿìÿíÿìÿúÿìÿì'ÿúÿÿ+ -ÿìÿìÿì 3®ËƼ„.ÿÿÿöÿìÿ÷ÿúÿû" ÿõÿìÿìÿüÿÿÿò#ÿìÿì#ÿøÿìÿðÿìÿìÿìÿìÿìÿøÿñÿñ 45'ÿïÿûÿìÿìP/83 $ÿô ÿþÿúÿñÿí ÿìÿìÿùÿì#ÿòÿì ÿíÿñÿìÿìÿìÿðÿöÿòÿìÿðÿìÿíÿîÿì !ÿñÿìÿò8ÿì=ÿìÿìÿìÿöÿìÿûÿìÿüÿÿÿìÿìÿõÿìÿìÿìÿìÿþÿùÿûÿìÿìÿìÿìÿùÿìÿìÿìÿîÿí;@ ÿýÿìÿìÿû ÿìÿüÿìÿìÿôÿìÿì ÿìÿöÿìÿìÿû ÿìÿð#ÿì ÿì  ÿú*ÿìÿì ÿ÷ ÿìÿû.ÿìÿì/ ÿôÿðÿÿ +ÿôÿñÿìÿìÿì'ÿìÿìÿìÿûÿìÿìÿìÿõÿùÿì"ÿîÿïÿìÿìÿý( ÿûÿøÿìÿìÿìÿì ÿñÿñÿò ÿþÿþÿôÿìÿû ÿöÿìÿúÿìÿî2ÿÿÿùÿôÿìÿìÿíÿìÿúÿìÿýÿìÿýÿòÿìÿöÿüÿì*ÿìÿìÿìÿúÿìÿìÿìÿûÿìÿñÿìÿì"ÿìÿìÿìÿìÿóÿôÿù ÿìÿìÿìÿì,ÿìÿìÿì!!ÿþÿðÿòÿûÿÿÿìD&-ÿìÿìÿö- &<ÿôÿìÿì &ÿûÿìÿøÿõ,&ÿý ÿøÿñ ÿôÿóÿì ÿóÿøÿìÿñÿúÿìÿì)ÿúÿìÿì :)&ÿÿÿï 3ÿìÿûI ÿíÿì 0ÿìÿì ÿìÿðÿìÿîÿóÿì :ÿüÿúÿþ ÿó ÿìÿì. ÿü5ÿýÿþÿîÿìÿþÿ÷)ÿñÿîÿô2(ÿû ÿì4ÿìÿìÿìÿûÿñÿìÿìÿò#ÿñ(ÿöÿø ÿòÿìÿþÿñ7ÿì *ÿúÿì!ÿìÿõÿìÿÿÿò ÿìÿìÿìÿþÿóÿïÿìÿìÿïÿþÿìÿìÿþ ÿìÿìÿìÿìÿì3ÿõÿìÿì6ÿìÿìÿìÿìÿþ3ÿý ÿïÿ÷)ÿýÿí,ÿìÿìÿìÿìÿïÿìÿìÿì ÿìÿøÿôÿ÷&ÿìÿÿ $ÿìÿìÿìÿûÿü%ÿìÿìÿú! ÿñÿìI! SBÿìÿìÿíÿûÿìÿìÿÿÿì Oÿì4 ÿìÿüÿì! ÿìÿûÿìÿìÿìÿìÿìÿìÿ÷ 1 ÿìÿìÿÿÿü-`ÿî-ÿú ÿúÿñÿìÿõÿýÿìÿìE'ÿõ+ÿìÿ÷#ÿñÿìÿìÿíÿí5 ÿñÿöÿìÿõÿìÿíÿìÿõÿìÿì0ÿìÿúÿÿ(ÿòÿìÿ÷ÿì0ÿìÿó)ÿõÿÿÿÿÿì ÿì ÿýÿúÿþÿþÿìÿìÿöÿìÿìÿôÿíÿöÿûÿìÿìÿì%ÿ÷ÿøBÿìÿìÿÿÿìÿìÿìÿîÿìÿì>5ÿìÿìÿì ÿìÿìCÿìÿò  ÿýÿýÿì ÿöÿìÿÿÿýÿýÿðÿìÿìÿò#ÿýÿíÿíCÿÿÿìÿô=ÿìÿìÿñ1 ÿìÿìÿòÿ÷ÿì >ÿüÿì(ÿüÿì7ÿìÿì8 ÿðÿÿÿì&ÿóÿò!$ÿöÿ÷$ÿìÿþ)ÿìÿìÿìÿøÿìÿìÿìÿõÿì2>.ÿìÿì1ÿòÿîÿìÿìÿû#ÿþÿý9ÿìÿìÿìÿìÿìÿìÿîÿïÿüÿþ 6ÿìÿôÿõÿïÿì9ÿðÿì0ÿó%ÿìÿìÿïÿì ÿìÿìÿìÿì4!ÿìÿì,)ÿìÿìÿúÿìÿìÿìÿìÿìÿì& ÿìÿìÿìÿÿÿìÿþÿðÿìCÿø#ÿìÿíÿì*:ÿìÿûÿìÿü ÿõÿïÿó  ÿìÿìÿï5ÿìÿìÿìÿöÿì 'ÿûÿìÿïÿìÿìÿò +ÿìÿìÿ÷ÿýÿôÿìÿìÿî1ÿúÿöÿüÿîÿìÿú*ÿìÿî#ÿíÿùÿíÿìÿì#ÿþ ÿÿ 8ÿñÿìÿü(ÿþÿí$ ÿí ÿöÿìÿìÿìÿìÿðÿþÿî ÿöÿùÿõ"ÿìÿìÿìÿðÿì2ÿøÿõÿø-ÿìÿìÿìÿñ,ÿñÿìÿð#ÿþÿü7 ÿþ6ÿóÿìÿö#3ÿøÿìÿïÿòÿñÿìÿðÿýÿìÿöÿïÿÿÿìÿìÿì ÿõÿüÿìÿìÿ÷ ÿùÿñÿûÿì!$ ÿì25ÿìÿì?ÿìÿìÿìÿôÿìÿîÿý ÿøÿíÿìÿìÿî3. ÿì9-ÿñÿì#ÿúÿþÿì<ÿíÿþÿþÿìÿìÿìÿóÿìÿìÿìÿìÿìÿø2$2 ÿïÿìÿì$86 ÿöÿì;,ÿìÿó ÿôÿðÿìÿøÿìÿùÿúÿìÿìÿì+ ÿìÿøÿìÿþÿìÿíÿüÿìÿïÿì5ÿîÿúÿù(=ÿòÿìÿíÿðÿìÿø,- ÿìÿìÿûÿ÷ÿñÿìÿìÿìÿìÿì8+ÿ÷ÿýÿìÿìÿóÿìÿì&"ÿì+ÿìÿÿÿìÿîÿìÿìÿî2ÿìÿì ÿìÿñÿýÿìÿþÿøÿìÿþÿ÷ÿþÿû ÿìÿìÿôÿìÿñÿìÿùÿìÿìÿýÿìÿìÿìÿð;ÿïÿì ÿûÿìÿìÿùÿìÿì ÿìÿõ ÿìÿìÿïÿìÿý ÿìÿìÿíÿìÿòÿøÿì ÿó ÿîÿìÿüÿì>3ÿíÿìÿïÿìÿìÿìÿì %ÿþÿì%ÿìÿì ÿíÿì!#ÿìÿìÿì%!ÿ÷ÿüÿìÿìÿ÷ÿìÿìÿöÿúÿì ÿìÿìDgÿìÿù)/ÿøÿìÿò"ÿÿÿìÿúÿìÿõÿìÿú ÿþÿìÿìÿìÿìÿø ÿìÿìÿì9?*&ÿìÿï 6ÿõÿìÿìÿþÿìÿìÿíÿû'ÿùÿúÿþÿðÿìÿÿ#* ÿô:% ÿÿ ÿñÿöÿõÿöÿþÿîÿñ Cÿÿÿþÿýÿú##ÿìÿùÿìÿ÷ÿìÿ÷ÿòÿñÿô ÿìÿìÿòÿîÿìÿìÿÿÿìÿìÿñ ÿô!ÿìÿì/ÿìÿÿÿìÿìÿöÿïÿò(ÿÿÿìÿþÿü1Aÿìÿìÿìÿì %-+ÿùÿÿÿýÿÿÿìÿìÿìÿìÿí ÿìÿþ ÿô /ÿïÿùÿìÿì/ÿñ Wÿïÿô,ÿöÿþÿóÿìÿìÿòÿìD- 1 ÿõÿìÿìÿìÿìÿý'; '18ÿøÿìÿøÿÿÿðÿìÿïÿþÿöÿìÿòÿ÷ÿýÿìÿúÿôÿîÿòÿýÿì=ÿüÿö ÿìÿìÿüÿüÿþÿÿÿþÿìÿìÿìÿìÿí :ÿìÿó8 ÿúÿì ÿñÿìÿìÿô ÿìÿìÿìÿì " ÿ÷ÿøÿì ÿìÿìÿóÿúÿìÿõ%ÿúÿìÿõÿìÿúÿìÿìÿöÿïÿìÿìÿì ÿìÿò ÿùÿìÿöÿóÿìC6 ÿìÿì"ÿûÿìÿöÿïÿþÿñÿì ÿ÷ÿñÿòÿôÿóÿÿÿìÿþÿìÿì%ÿý"-ÿìÿìÿõÿïÿìÿù ÿ÷ÿóÿü%ÿü$ÿìÿì)ÿìÿìÿýÿ÷ÿìÿìÿòÿìÿø-ÿìÿìÿìÿì!ÿúÿìÿìÿó!ÿÿ )ÿìÿìÿìÿý5ÿìÿõÿòÿôÿì Iÿìÿì ÿ÷-ÿìÿóÿìÿóÿüÿìÿìÿ÷ÿñÿìÿìÿìÿì ÿðÿÿ&ÿìÿ÷ÿú1< ÿìÿýÿùÿôÿïÿìÿìÿïÿì0vÿðÿø2ÿýÿì!ÿìÿîÿõ02ÿô ÿîÿìÿìÿýÿìÿóÿòÿñÿöÿüÿðÿýÿúÿñ1ÿìÿõ ÿûÿõÿøÿõÿòÿûÿü" ÿìÿùÿû&ÿìÿì#ÿùÿñ#ÿì &ÿúÿï ÿýÿóÿìÿô 6Cÿò ÿìÿìÿìÿìÿì ÿìÿõ ÿ÷ÿÿÿìÿùÿùÿìÿöÿø&ÿìÿüÿíÿðÿìÿìÿûÿôÿì.ÿóÿìÿùÿìÿíÿìÿìÿþÿìÿìÿöÿìÿý;0ÿøÿøÿîÿõ $ÿðÿìÿÿÿúÿùÿìÿìÿïÿòÿñÿï ÿìÿì "2ÿìÿõ ÿìÿìÿóÿõÿü ÿþ7ÿìÿìÿìÿìÿíÿìÿìÿüÿÿÿìÿöÿìÿìÿìÿüÿôÿìÿìÿìÿìÿ÷ÿì!ÿíÿìÿó#ÿìÿìÿïÿìÿìÿì ÿìÿìÿì ÿìÿìÿþÿìÿìÿìÿïÿìÿì ÿòÿñÿþÿùÿü ÿïÿûÿûÿþÿìÿóÿìÿìÿìÿìÿìÿì 2ÿûÿìÿì1,ÿï 3ÿôÿö!ÿùÿìÿìÿì<ÿìÿ÷ÿ÷ÿìÿì ÿþÿìÿóÿì $ÿõÿìÿô ÿ÷ÿìÿìÿì !9ÿü5ÿìÿøÿìÿúÿþÿúÿòÿýÿìÿó ÿðÿì07ÿìÿì=:ÿòÿìÿü ÿúÿí ÿìÿþÿîÿõ #ÿþÿì!=ÿõÿþÿòÿýÿìÿìÿÿÿúÿì F:ÿìÿìÿíÿìÿî ÿìÿú ÿû&ÿìÿìÿìÿìÿìÿï% ÿôÿñÿùÿþÿìÿòÿìÿìÿìÿþÿìÿìÿøÿìÿú ,ÿìÿþ ÿòÿì1ÿìÿì7!ÿùÿìÿìÿú ÿìÿìÿìÿï,  ÿþ.ÿìÿìÿôÿìÿõÿìÿìÿô3% ÿî$ÿìÿîÿøÿìÿóÿöÿìÿìÿì ÿìÿì(ÿùÿù ÿì% 'ÿü-ÿìÿûÿþÿìÿìÿõÿìÿìÿìÿìÿõÿìÿìÿûÿìÿìÿìÿì$'ÿìÿì ÿì ?ÿóÿýÿìÿó ÿôÿýÿì!ÿýÿõÿðÿÿÿîÿìÿìÿíÿìÿû#ÿö$7 D+ÿþÿ÷#ÿíÿìÿôÿìÿû'ÿìÿð(6ÿñÿ÷ÿñ83ÿñ) ÿýÿìÿìÿøÿúÿìÿìÿìÿìÿïÿöK7ÿìÿìÿüÿöÿìÿì ÿòÿõÿíÿíÿòÿìÿì(ÿöÿì0ÿìÿúÿøÿîÿìÿìÿþ.+ÿ÷ÿûÿûÿþÿõ ÿýÿüÿô ÿö "ÿòÿìÿòÿîÿúÿîÿì'ÿìÿìÿì(ÿÿÿìÿù>ÿîÿðÿÿÿìÿìÿü ÿù#ÿí+;CG:$O7! ÿùÿöÿôÿìÿñÿüÿûÿûÿìÿñÿìÿìÿñÿûÿöÿñ ÿìÿìÿûÿõ(ÿì'ÿýÿìÿ÷ÿòÿøÿì/ÿìÿìÿìÿïÿìÿ÷Jÿìÿî;/ .1ÿìÿý. ÿúÿí ÿü ÿóÿìÿìÿðÿòOÿìÿòÿòÿìÿìÿíÿõÿîÿüÿìÿùÿìÿôÿïÿùÿìÿìÿìI9ÿìÿóÿõÿñ -ÿì/ÿì+f2ÿï %ÿýÿì!ÿì ÿûÿûÿìÿìÿìÿì"ÿìÿì ÿìÿúÿðÿìÿíÿýÿû ÿìÿìÿúÿú&ÿü ÿô(8 ÿìÿðÿûÿìÿìÿþÿìÿìÿûÿìÿòÿìÿìÿìÿìÿì ÿôÿìÿìÿìÿìÿìÿúÿìÿì(ÿÿ ) ÿì"ÿìNÿø&2WE6ÿø"G ÿìÿìÿìÿôÿý&ÿüÿ÷ÿþ ÿìÿõÿìÿìÿìÿï6ÿø ÿìÿìÿìÿöÿõ#ÿúÿöÿìÿù ÿìÿìÿùK?6d>ÿþ8.%ÿùÿüÿ÷ÿìÿù ÿñÿóÿó ÿìÿìÿþÿþÿîÿöÿìÿìÿì"ÿñÿìÿúÿì ÿìÿìÿùÿ÷ÿùÿýÿúÿú/"5K=!ÿþÿþÿì ÿìÿìÿìÿìÿüÿì36ÿìÿì8"ÿì#%ÿìÿú ÿìÿøÿìÿýÿìÿìÿý3ÿ÷#ÿìÿìÿûÿîÿîÿì DE*:]6 ÿüÿìÿð  ÿìÿþÿìÿì#ÿìÿó5ÿìÿùÿìÿì ÿìÿðÿì + ÿíÿîÿì0ÿüÿðÿìÿìÿïÿþ)ÿìÿùÿìÿì D5%WZM+ (ÿÿÿìÿìÿìÿìÿìÿþÿìÿùÿìÿù'ÿðÿìÿìÿøÿüÿóÿìÿþÿì ÿìÿîÿû.Jÿïÿö(7ÿõÿìÿýÿùÿìÿÿÿìÿóKA'XqHÿïÿìÿìÿìF-ÿîÿþ ÿìÿìÿúÿìÿì < ÿøÿìÿìÿñ$ÿñ0ÿñÿõÿìÿìÿû)ÿòÿôÿíÿñÿø ÿì ÿìÿûÿóÿù%C@GT24/ÿýÿìÿìÿïCWÿìÿìÿìÿôÿÿ:$ÿìÿöÿ÷:ÿìÿìÿìÿìÿò ÿð  ;ÿìÿìÿìÿìÿûÿÿÿìÿüÿûÿìÿìÿöÿöÿû %)ÿþÿø++/4.E ÿìÿô",ÿìÿñÿóÿìÿùÿýÿì" 'ÿúÿüÿìÿì)ÿìÿûÿìÿìÿüÿìÿö'ÿì"'*ÿÿÿ÷ÿüÿìÿìÿðÿñ".:ÿûÿì%ÿúÿðÿñÿù!ÿìÿô #ÿì ÿö ÿö ÿõ32 ÿîÿìÿö"ÿì *9.ÿù  ÿùÿìÿüÿý$ K’gL ÿï(ÿÿÿûÿû ÿìÿìÿìÿìÿìÿ÷ÿþÿøÿù ÿì #, ÿô ÿìÿìÿìÿíÿóÿìÿþÿì-ÿìÿðÿíÿÿÿö(ÿìÿìÿú (b“hTÿìÿìÿìÿùÿìÿìÿøÿìÿìÿí % ÿòÿìÿóÿìÿì"ÿìÿíÿðÿìÿìÿì# ÿ÷  ÿì0ÿìÿó3ÿó ÿúÿìÿú ÿýiÆÑ‰2ÿùÿõÿìÿöÿþÿìÿõÿ÷ ÿìÿï ÿý)ÿõÿìÿô!ÿóÿì ÿýÿøÿìÿõÿì/ÿûÿôÿìÿþÿìÿøÿó}‚sfL)ÿûÿìÿìÿìÿ÷ÿÿ0ÿìÿøÿÿÿóÿìÿìÿìÿö ÿìÿðÿì2ÿúÿôÿìÿíÿìÿìÿìÿõÿìÿìÿþÿõÿñÿìÿü# "ÿý ÿìÿò 4ÿþ0) ÿì+&ÿõÿøÿìÿìÿìÿõ(ÿìÿìÿ÷ !&ÿûÿìÿìÿìÿìÿüÿìÿõÿìÿìÿøÿüÿûÿì(ÿ÷ÿìÿì3)ÿìÿõÿùÿìÿìÿò ÿþ#ÿìÿùÿìÿìÿïÿ÷ÿûÿùÿðÿì ÿûÿû ÿÿÿìÿìÿìÿìÿõÿìÿìÿøÿð:4 ÿùÿìÿüÿôÿìÿôÿìÿìÿî ÿìÿ÷ ÿìÿúÿìÿìÿòÿñÿò#ÿðÿõ&ÿìÿì6ÿðÿü(ÿõ ÿð' ÿìÿìÿö!ÿõÿìÿû# ( 'ÿùÿìÿÿÿìÿìÿôÿìÿôÿòÿìÿìÿþÿìÿôÿ÷ÿìÿì 0ÿìÿìÿìÿôÿø#ÿðÿñÿìÿìÿúÿóÿìÿñÿùÿõ ÿ÷ÿìÿì ÿôÿù8ÿ÷ÿýÿÿÿì ÿì.ÿì ÿóÿíÿÿ ÿìÿîÿìÿìÿùÿìÿìÿìÿìÿîÿûÿìÿìÿìÿýÿøÿûÿìDÿìÿìÿìÿôÿìÿþÿþÿìÿþÿìÿì:ÿïÿì ÿúÿÿ%ÿìÿìÿìÿöÿì7ÿüÿìÿí5%ÿö#ÿõÿìÿÿÿîÿìÿ÷N'ÿøÿí ÿùÿó4 ÿõÿôÿìÿìÿøÿìÿìÿøÿøÿìÿôÿìÿýÿö%ÿûÿð=ÿì H ÿìÿô@ÿìÿþÿïÿìÿìÿì:ÿïÿì ÿï$ÿìÿìÿ÷<ÿô)ÿìÿìÿøÿìÿðÿìÿõÿýÿû ÿìÿìÿñÿì ÿ÷-ÿìÿì 9 ÿìÿìÿõÿóÿìÿñÿùÿìÿðÿÿÿôÿðÿì& ÿû$ÿìÿìÿúÿì ÿöÿõ-ÿìÿñÿìÿìÿòÿîÿñ"ÿìÿòÿùÿô ÿþÿþÿîÿìÿì()ÿüÿìÿìÿìÿìÿì=ÿìÿìÿ÷ÿì1ÿúÿó %8ÿì ÿìÿ÷ÿ÷ÿìÿìÿìÿóÿìÿìÿì ÿí ÿóÿíÿþÿìÿúÿö)ÿûÿò)ÿìÿìÿþÿúÿüÿÿÿöXÿÿÿý& ÿìÿìÿìÿñÿðÿóÿìÿò2 ÿþÿø ÿìÿì ÿÿÿíÿìÿìÿïÿìÿðÿùÿÿ.ÿìÿì 5M ÿúÿþ$ÿùÿìÿýÿìÿìÿþ ÿì/ÿìÿùÿü06ÿòÿìÿíÿí" ÿõÿûÿìÿýÿìÿôÿö!ÿìÿìÿì ÿìÿñ!ÿìÿö/ÿíÿöÿð ) ÿýÿì!ÿìÿøÿì ÿóÿ÷ÿöÿþÿìÿìÿìÿìÿìÿõ)ÿìÿøÿþÿìÿìÿô'$ ÿðÿïÿòÿìÿúÿìÿôÿü#ÿìÿìÿìÿïÿì5ÿòÿõ ÿôÿìÿìÿÿÿì/ÿøÿöÿìÿìÿì'ÿøÿìÿìÿõÿìÿì4ÿöÿìÿìÿòÿõÿïÿìÿüÿì?ÿÿÿì0ÿþÿìÿð0ÿñÿì1 ÿöÿìÿìÿû ÿì ÿì # ÿìÿìÿþÿì 0ÿûÿúÿìÿìÿìÿ÷ÿ÷ ÿìÿ÷(*ÿúÿìÿìÿìÿìÿýÿóÿì ÿý% ÿúÿíÿìÿìÿøÿìÿþ%ÿþ ÿìÿìÿó' ÿüÿíÿì %ÿü 'ÿìÿùÿìÿþÿìÿìÿìÿìT9 ÿìÿìÿý 3 ÿìÿìÿüÿìÿìÿøÿðÿìÿìÿû ÿìÿìÿøÿÿÿìÿì4ÿþÿö1ÿìÿòÿì3 +ÿìÿôÿý ÿìÿ÷ÿö$ÿìÿóÿìÿÿÿìÿôÿìÿìÿìÿìÿõ&" ÿìÿìÿýÿûÿì(ÿúÿìÿìÿì3 ÿûÿþÿì0ÿìÿíÿü#&ÿòÿøÿìÿìÿ÷ÿìÿû#;ÿìÿì(ÿõÿìÿì$2ÿû%ÿìÿùÿìÿìÿõÿðÿùÿî( ÿìÿîÿìÿìÿòÿìÿì)ÿù2ÿìÿø ÿñÿúÿýÿ÷ÿùÿôÿìÿìÿìÿù2ÿôÿúÿýÿû;1$ÿìÿìÿú(ÿìÿìÿûÿý ÿìÿúÿõ ÿìÿúÿìÿì'ÿì ÿìÿìÿö ÿìÿìÿôÿìÿøÿíÿìÿð+/ÿöÿìÿìÿ÷ÿìÿûÿì  ÿúÿÿÿìÿú(ÿÿ*' ÿìÿì4ÿõÿìÿñÿöÿþÿüÿýÿþÿìÿïÿìÿðÿìÿìÿìÿþ ÿôÿó  ÿ÷#) ÿíÿì6 ÿìÿùÿúÿîÿù+ÿìÿìÿüÿïÿþÿú,0ÿìÿõÿìÿý ÿìÿøÿì6ÿï ÿÿÿìÿõÿìÿìÿþÿò ÿ÷ÿìÿú ÿñÿìÿìÿïÿý. ÿúÿ÷ÿøÿì ÿôÿþÿìÿîÿìÿúÿìÿô#ÿøÿì ÿí2ÿï'-ÿïÿõÿþÿó ÿñÿìÿõÿìÿîÿûÿòÿ÷ÿìÿìÿ÷ÿü ÿÿÿúÿøÿõÿð ÿìÿüÿìÿõÿöÿ÷ÿìÿìÿìÿ÷ÿðÿì!ÿôÿúÿìÿñÿìÿìÿìÿì ÿìÿóÿìÿþÿì ÿüÿìÿìÿìÿõÿøÿñÿñÿûÿúÿüÿìÿìÿþÿìÿôÿì-ÿ÷ÿìÿûÿðÿìÿìÿ÷ÿóÿîÿïÿìÿý ÿòÿ÷ÿí ÿìÿì0+$ÿìÿöÿóÿþ ÿìÿìÿñÿìÿþÿõÿöÿôÿñ%ÿî0Dÿóÿï ÿöÿîÿìÿìÿìÿìÿò ÿìÿÿÿú ÿìÿöÿ÷ÿì,ÿìÿïÿì&ÿöÿý!ÿòÿò1ÿìÿìÿôÿìÿüÿþÿìÿìÿúÿÿÿì ÿìÿìÿìÿìÿñ-"ÿþ-ÿõÿöÿöÿüÿù ÿöÿìÿøÿìÿöÿí ) ÿì)ÿìÿìÿìÿìÿìÿòÿøÿöÿò!ÿìÿìÿìÿì ÿûÿòÿóÿì@ÿøÿñ-ÿïÿóÿìÿìÿì ÿô#2!ÿíÿìÿú8 ÿìÿóÿìÿìÿðÿ÷",$ÿÿ:ÿóÿùÿòÿýÿôÿìÿøÿø$&ÿìÿòÿúÿìÿì/ÿÿ 7ÿô5ÿõ ÿîÿìÿì;3# ÿîÿìÿìÿìÿìÿõ /ÿòÿù,ÿì ÿú' ÿñ ÿúÿìÿï$ÿþÿïÿýÿð ÿðÿìÿóÿõÿüÿôÿìÿõ!ÿìÿìÿùÿìÿìÿñÿòÿðÿÿÿôÿöÿì ÿìÿøÿú&ÿóÿþ1ÿý ÿô ÿþÿìÿìÿìÿòÿûÿìÿìÿóÿìÿìÿüÿüÿï ÿýÿîÿìÿìÿøÿìÿûÿìÿì ÿìÿíÿüÿì#ÿìÿìÿìÿìÿìÿìÿìÿìÿüÿÿÿìÿ÷ÿô ÿôÿì$ÿì2) ÿìÿìÿ÷ ÿöÿìÿõÿþÿþÿìÿìÿí ÿúÿð,ÿóÿìÿ÷ÿìÿô& ÿð"ÿûÿìÿö" ÿõ"ÿìÿìÿó  ÿöÿîÿì%ÿíÿïÿöÿúÿì)ÿòÿìÿïÿìÿÿÿþÿþ 9ÿ÷ÿìÿðÿìÿûÿñÿìÿï !ÿö ÿõ ÿôÿûÿìÿîÿîÿþ/ÿìÿûÿìÿû6ÿìÿì  ÿìÿüÿìÿùÿòÿîÿòÿïÿìÿìÿì ÿì9ÿìÿìÿï> ÿìÿþÿùÿöÿìÿöÿöÿøÿÿÿìÿì]ÿìÿì!#ÿò ÿìÿìÿó"0ÿþÿìÿì ÿø ÿûÿòÿîÿùÿþÿúÿúÿìÿý#ÿìÿì  ÿùÿ÷ÿìÿÿ%ÿø.ÿö ÿüÿùÿì"ÿýÿíÿüÿðÿ÷ÿíÿìÿñ ÿþÿÿÿüÿü)ÿìÿñÿìÿìÿìÿìÿìÿíÿìÿðÿóÿîÿúÿìÿúÿôÿýÿì!ÿì ÿûÿû ÿõ ÿüÿìÿõ8ÿö ÿüÿíÿþÿìÿìÿõÿìÿðÿûÿìÿ÷2!ÿø ÿðÿÿ ÿì ÿûÿìÿìÿòÿÿÿìÿúÿüÿïÿõÿúÿìÿìÿûÿÿÿôÿíÿùÿìÿþÿìÿìÿýÿÿÿõ *ÿ÷ÿìÿôÿìÿìÿûÿìÿì ÿóÿìÿìÿù ÿøÿöÿìÿïÿòÿöÿúÿöÿì!ÿýÿìÿìÿûÿùÿòÿíÿì ÿòÿüÿìÿýÿù ÿìÿìÿìÿûÿûÿìÿìÿýÿìÿ÷ÿñÿìÿìÿøÿìÿñÿúÿýÿìÿòÿöÿúÿðÿìÿùÿìÿýÿÿÿìÿì(ÿþÿ÷ ÿõÿìÿíÿìÿÿ4ÿÿÿùÿìÿúÿì  ÿìÿòÿõ9ÿúÿîÿô ÿìÿì )(,ÿúÿÿÿìÿõÿôÿúÿìÿøÿü ÿúÿìÿì ÿöÿì" ÿìÿì*ÿðÿì  ÿûÿðÿÿÿìÿÿÿøÿìÿúÿü&ÿôÿýÿöÿùÿìÿìÿ÷ ÿøÿõÿÿ ÿì 7ÿîÿïÿíÿí ÿúÿý ÿóÿõÿýÿúÿü*ÿñÿìÿúÿ÷ÿñ ÿøÿúÿóÿùÿìÿöÿýÿìÿìÿõ ÿìÿìÿùÿìÿìÿñÿìÿúÿýÿõÿÿÿìÿì$ÿüÿùÿñÿìÿì ÿþÿìÿìÿìÿõ  ÿý>ÿöÿìÿüÿ÷ÿöÿìÿìÿì 6 !ÿóÿìÿìÿðÿýÿìÿìÿìÿöÿøÿìÿû,ÿû"ÿìÿþÿìÿìÿòÿìÿìÿñÿìÿìÿíÿ÷ÿì ÿúÿý ÿ÷ÿíÿìÿÿ ÿÿÿìÿì ÿú"ÿþÿý ÿìÿðÿìÿòÿò+ÿí ÿöÿìÿìÿû$ÿìÿð!ÿú)/ ÿù  ÿð ÿìÿù ÿìÿý/5ÿðÿï.ÿûÿ÷ÿì">ÿõÿõ!'ÿìÿùÿìÿ÷ÿöÿøÿü ÿìÿíÿ÷ ÿ÷90ÿìÿîÿíÿìÿì  ÿòÿîÿÿÿõÿðÿìÿì ÿ÷ÿìÿìÿìÿý ÿÿÿìÿìÿìÿõÿöÿôÿöÿøÿÿÿýÿþÿôÿöÿøÿûÿþÿñÿýÿ÷ÿïÿìÿìÿòÿ÷ÿÿÿìÿìÿìÿïÿíÿóÿü)ÿøÿì ÿñÿìÿòÿÿÿõ ÿÿ' ÿø ÿô(* ÿôÿìÿòÿìÿìÿìÿúÿìÿìÿôÿÿÿìÿì ÿìÿìÿìÿóÿþÿì ÿóÿïÿìÿìÿþÿìÿ÷ ÿì.&ÿðÿÿÿìÿñ 1ÿôÿöÿûÿìÿìÿìÿðB)ÿû ÿüÿìÿìÿòÿöÿùÿøÿìÿùÿõ1ÿÿÿõÿìÿì /ÿìÿüÿìÿìÿï 'ÿìÿùÿôÿìAÿý (ÿö ÿô !$ÿñ ÿ÷ÿúÿøÿñÿìÿìÿþÿø1ÿí ÿðÿìÿì ÿìÿýÿì ÿóÿìÿìÿïÿñÿþÿòÿþ ÿüÿüÿìÿìÿìÿì. ÿùÿìÿðÿìÿüÿìÿìÿîÿñÿýÿóÿìÿìÿìÿìÿìÿìÿí ÿìÿý ÿì ÿì ÿì/ÿìÿì$ÿò -#ÿû%! ?!ÿîÿìÿúÿôÿõ!ÿìÿìÿìÿìÿøÿüÿõÿð ÿþÿìÿìÿïÿìÿì ÿì !ÿîÿìÿ÷ÿóÿóÿìÿüÿìÿïÿðÿìÿùÿðÿìÿñÿùÿô@!11ÿíÿ÷ÿúÿõ$ÿïÿóÿñÿû ÿÿ & ÿó ÿýÿõÿì ÿòÿîÿìÿìÿì,ÿõÿìÿöÿôÿìÿø ÿíÿîÿîÿìÿúÿÿ ÿ÷ÿöÿïÿìDÿ÷ÿìÿ÷ÿì ÿìÿõÿ÷ÿìÿìÿìÿýÿîÿñ &/ÿìÿüÿìÿì#ÿîÿìÿü ÿìÿì36.ÿöÿì ÿìÿüÿÿÿöÿìÿô')ÿôÿüÿûÿÿ 52-ÿì%ÿìÿìÿû-ÿì ÿíÿìÿóÿîÿùÿìÿùÿìÿìÿìÿìÿìÿôÿìÿð ÿþÿû ÿìÿìÿñÿìÿûÿñ(ÿýÿþÿìÿìÿÿÿìÿóÿüÿìÿñÿìÿðÿøÿðÿýÿöÿìÿìÿûÿïÿø ÿþ)7 3&ÿìÿì  ÿìÿìÿýÿîÿìÿö#ÿý2 ÿÿÿôÿóÿìÿìÿÿ*+ ÿò"ÿìÿýÿìÿûÿô(ÿýÿìÿø ÿì ÿóÿóÿìÿìÿìÿû ÿìÿìÿíÿùÿûÿþ ÿù ÿìÿìÿðÿ÷ÿìÿì ÿôÿìÿíÿ÷ÿíÿìÿì.>ÿøÿîÿìÿìÿýHÿìÿìÿõ&ÿöÿìÿóÿýÿòÿíÿì"ÿïÿñ.ÿìÿø!ÿúÿìÿóÿìÿÿÿì ÿÿÿìÿûÿìÿþÿÿ ÿýÿìÿìÿìÿ÷ÿúÿÿÿö (ÿòÿÿ ÿùÿìÿð/ÿóÿìÿìÿ÷ÿì ÿïÿôÿü ÿìÿìÿþÿñÿöÿýÿìÿùÿìÿìÿýÿòÿî ÿìÿìÿþÿù'ÿòÿìÿûÿòÿñÿìÿú" ÿóÿû $ ÿì+ÿüÿòÿïÿ÷ÿþÿó %ÿøÿïÿñÿóÿö!9 ÿð(ÿÿÿþÿì*ÿöÿìÿóÿýÿòÿüÿìÿùÿüÿý" ÿì%ÿó ÿìÿìÿìÿ÷ÿíÿøÿôÿì ÿìÿìÿ÷ÿÿÿ÷ÿøÿÿ 2" ÿìÿüÿðÿüÿóÿõÿìÿþÿìÿìÿö! ÿÿÿìÿìÿìÿôÿõÿìÿúÿìÿìÿ÷' ÿüÿì)ÿìÿñ#%'ÿìÿí,ÿìÿñ+-B70ÿöÿýÿîÿòÿ÷ÿìÿìÿýÿìÿì  ÿøÿýÿìÿñÿ÷-ÿøÿì ÿìÿìÿýÿýÿþÿì ÿíÿíÿôÿìÿìÿúÿíA ÿýÿðÿìÿúÿù*ÿûÿóÿíÿÿÿðÿìÿìÿìÿý ÿìÿûÿõÿì&"ÿìÿîÿù ÿìÿìÿùÿþÿìÿìÿìÿúÿìÿì+ ÿû ÿøÿýÿþÿõÿôÿõ4ÿÿÿì2ÿüÿÿ ÿìÿïÿûÿì-ÿüÿìÿìÿú<ÿüÿìÿìÿìÿùÿýÿðÿõÿîÿôÿþÿúÿìÿðÿìÿôÿ÷<&ÿìÿìÿì ÿþÿí%ÿîÿîÿìÿìÿúÿø ÿì ÿìÿø&$ÿõÿìÿìÿò)' ÿû  ÿõÿýÿòÿì ÿ÷ÿñ ÿìÿìÿìÿõÿìÿó ÿûÿîÿùÿûÿìÿì.ÿî*ÿìÿì,ÿøÿøÿö )ÿö ÿûÿ÷  ÿìÿùÿìÿìÿô ÿóÿìÿôÿì ÿìÿõÿöÿïÿìÿìÿôÿìÿúÿòÿúÿìÿúÿö ÿìÿì ÿò#ÿ÷ÿøÿþ%ÿìÿìÿöÿìÿîÿìÿúÿúÿìÿìÿì0ÿóÿñÿðÿìÿý ÿìÿýÿøÿîÿìÿùÿÿÿì ÿìÿì ÿìÿí ÿì ÿõÿöÿúÿóÿì ÿìÿìÿ÷ÿóÿìÿìÿþÿíÿûÿìÿú,ÿõÿó ÿö  ÿìÿìÿìÿóÿìÿþÿìÿÿ)ÿìCÿìÿìÿÿÿõÿøÿÿÿìÿðÿùÿ÷<2ÿì ÿÿ  ÿýÿþÿìÿìÿìÿò ÿìÿùÿìÿþÿí ÿîÿì ÿì6ÿõ% ÿìÿú ÿí"!ÿìÿûÿìÿú ÿìÿûÿôÿþÿñÿý0ÿôÿìÿìÿì ÿïÿìÿòÿýÿûÿü# ÿì ÿìÿüÿðÿìÿþ *ÿìÿòÿúÿìÿìÿ÷ÿýÿïÿìÿóÿùÿö ÿìÿìÿñ ÿîÿì-ÿþÿû3ÿð#ÿùÿìÿùÿö#ÿìÿïÿìÿðÿû$ÿìÿîÿìÿìÿü ÿûÿíÿôÿì ÿ÷ÿìÿìÿì ÿðÿó&ÿìÿìÿòÿÿÿôÿ÷/ÿìÿúÿìÿïÿìÿìÿýÿîÿìÿìÿìÿñÿú"ÿìÿìÿìÿ÷ÿ÷ )ÿìÿíÿ÷9ÿì ÿó"ÿìÿìÿìÿþÿüÿý ÿì ÿìÿóÿùÿìÿýÿò!ÿí ÿìÿìÿüÿìÿìÿòÿðÿðÿþÿÿ ÿý ÿì/ÿñÿü-ÿì ÿúÿì ÿû -ÿúÿî ÿìÿÿÿìÿøÿìÿÿÿìÿìÿõÿü%ÿìÿìÿýÿñ$ÿìÿì; ÿìÿú$1ÿìÿÿ ÿìÿðÿìÿüÿíÿÿÿøÿìÿòÿöÿìÿò ÿìÿìÿù!ÿûÿò  ÿìÿþ'ÿòÿï ÿü ÿìÿúÿì ÿíÿú ÿô !' ÿìÿìÿìÿÿ -ÿïÿìÿìÿìÿú $ÿìÿøÿþÿìÿðÿìÿøÿîÿñÿþÿÿÿìÿìÿýÿÿÿûÿî ÿöÿþ  ÿì+ÿöÿìÿû(ÿìÿìÿìÿìÿòÿìÿìÿüÿõÿì ÿíÿìÿøÿì6ÿý$ÿìÿòÿíÿìÿüÿòÿúÿøÿìÿìÿìÿìÿñÿðÿ÷ÿìÿì9 ÿ÷ÿìÿòÿìÿìÿøÿìÿø.ÿüÿûÿÿÿìÿìÿîÿöÿòÿì ÿì ÿþÿðÿý$ÿùÿýÿÿÿìÿñÿì=%ÿìÿìÿö+ÿìÿìÿìÿì ÿìÿì ÿÿ ÿùÿÿ ÿìÿöÿìÿìÿþÿïÿ÷ ÿì ÿì"0ÿì'ÿõÿìÿòÿûÿìÿìÿìÿìÿìÿðÿøÿÿÿü ,ÿðÿìÿìÿïÿìÿôÿ÷ÿñÿìÿì ÿì(  )ÿìÿìÿïÿ÷ÿì ÿô8ÿì(!!ÿóÿûÿõ,ÿ÷ÿý% ÿìÿìÿùÿìÿþÿÿ#ÿìÿìÿñ ÿøÿìÿîÿìÿì ÿõÿøÿÿ   ÿ÷ÿúÿñÿìÿðÿì$ÿñÿìÿìÿîÿïÿù#ÿñÿìÿþ ÿö7+ÿìÿìÿûÿìÿÿÿìÿôÿì ÿöÿûÿì ÿÿ ÿÿÿÿ%ÿìÿûÿìÿöÿìÿìÿóÿø ÿþÿì*ÿï.ÿìÿò ÿìÿìÿùÿî ÿìÿìÿôÿìÿìÿú<$ÿû ÿìÿú#ÿúÿöÿìÿì4ÿìÿþÿìÿùÿö ÿøÿýÿþÿðÿìÿìÿðÿìÿú ÿôÿðÿò ÿøÿòÿüÿóÿìÿì ÿó'ÿúÿôÿîÿþÿîÿÿ4ÿû9ÿìÿôÿüÿì ÿýÿúÿì$ÿô ÿìÿì ÿíÿìÿìÿýÿí ÿîÿø ÿô ÿìÿñÿîÿîÿðÿíÿû ÿþÿýÿì( ÿüÿíÿñÿóÿì/ÿñÿíÿìÿõ#ÿòÿ÷"ÿö17ÿì ÿìÿìÿïÿÿÿìÿìÿìÿþÿìÿñÿÿÿô+ÿþÿøÿìÿð ÿý3ÿÿÿõÿñÿð*ÿìÿîÿÿ ÿîÿìÿõÿ÷ÿõ (ÿìÿì ÿùÿûÿìÿüÿìÿýÿì%8ÿùÿíÿüÿò!,ÿìÿìÿö'ÿìÿøÿðÿìÿÿÿýÿüÿìÿìÿÿÿìÿÿ(ÿôÿìÿð ÿöÿìÿïÿïÿñÿü ÿìÿìÿìÿõÿú4- ÿìÿðÿøÿìÿôÿìÿìÿì ÿùÿû ÿóA' ÿìÿþ ÿþÿûÿìÿìÿòÿìÿìÿöÿì ÿù ÿù ÿïÿì3/ÿìÿìÿôÿþÿöÿÿ ÿÿÿìÿìÿùÿò ÿùÿìÿìÿì #ÿ÷ÿìÿðÿì .ÿÿÿðÿïÿìÿôÿÿÿþÿûÿï ÿüÿøÿì ÿúÿÿÿìÿýÿûÿð ÿôÿý  ÿì%ÿìÿìÿøÿùÿúÿûÿÿÿîÿø!.ÿìÿìÿøÿìÿì; ÿíÿïÿù) !ÿú < ÿö ÿôÿìÿì(ÿîÿïÿ÷ÿìÿðÿù"ÿì ÿìÿõ ÿþ  ÿýÿòÿï*! ÿìÿøÿìÿìÿì ÿÿ (ÿì8.$ ÿüÿþ! ÿôÿð"4ÿîÿìÿìÿìÿíÿôÿòÿúÿîÿöÿÿÿìÿùÿý"ÿö ÿìÿþÿÿ'(ÿñÿþ,ÿÿÿôÿì ÿìÿìÿñÿñÿóÿíÿïÿìÿüÿüÿìÿìÿíÿò?0ÿðÿüÿìÿìÿí ÿü ÿûÿìÿöÿù ÿøÿöÿüÿóÿîÿìÿìÿüÿþÿìÿìÿøÿìÿìÿìÿìÿþÿ÷ÿìÿòÿýÿïÿúÿîÿúÿ÷ÿøÿì ÿìÿð ÿóÿì"ÿìÿìÿìÿùÿýÿìÿìÿìÿóÿø ÿìÿìÿöÿï2ÿì ÿìÿÿÿùÿìÿí ÿìÿöÿóÿñÿìÿòÿþÿþÿö#ÿøÿì ÿ÷ÿìÿóÿñÿø ÿì ÿîÿÿÿúÿìÿìÿúÿïÿìÿì+#ÿìÿìÿìÿðÿýÿìÿþÿìÿìÿìÿô ÿóÿýÿ÷ ÿõÿÿÿüÿìÿôÿþÿìÿúÿì,ÿïÿøÿìÿÿÿùÿìÿì%ÿ÷ÿìÿ÷ÿï+ÿøÿñ  ÿúÿüÿñ$ÿöÿìÿìÿì 'ÿüÿìÿÿÿì,%ÿúÿì ÿôÿìÿô$ÿøÿìÿöÿûÿøÿðÿðÿìÿûÿù&:ÿìÿì%ÿýÿîÿøÿìÿì& ÿö ÿóÿîÿìÿí,ÿþ ÿþÿìÿìÿìÿ÷ÿøÿî ÿì ÿî ÿøÿìÿóÿúÿðÿîÿíÿìÿìÿýÿõ'ÿýÿùÿøÿôÿì ÿìÿôÿðÿñÿïÿîÿìÿýÿþÿöÿìÿìÿìÿìÿìÿôÿý %ÿïÿìÿôÿìÿû ÿì+ ÿõÿí, ÿøÿýÿóÿ÷ÿíÿñÿõÿ÷ÿì ÿò%ÿøÿô#ÿìÿìÿý ÿýÿìÿìÿøÿøÿò ÿì ÿìÿìÿüÿùÿíÿòÿôÿìÿìÿõÿìÿüÿøÿìÿö ! ÿìÿìÿùÿîÿìÿìÿìÿîÿõÿöÿïÿóÿõ!ÿñ ÿì  ÿíÿì ÿñÿõ ÿðÿìÿíÿøÿ÷ÿùÿÿ%'ÿìÿùÿüÿøÿûÿìÿîÿóÿìÿìÿþÿýÿûÿìÿìÿôÿìÿðÿôÿö ÿùÿÿ ÿôÿìÿöÿìÿìÿô ÿìÿ÷ÿìÿü*ÿþÿòÿìÿøÿð&2ÿòÿìÿôÿú$ÿìÿøÿì# ÿìÿì!ÿûÿìÿð ÿø ÿñ("ÿüÿòÿ÷ÿóÿìÿñÿõÿÿÿþÿìÿòÿð ÿìÿö#ÿìÿì!ÿò, %ÿüÿñÿúÿò"ÿìÿìÿòÿìÿîÿìÿìÿüÿìÿìÿíÿýÿôÿîÿôÿþÿôÿÿ" $ ÿìÿìÿìÿõÿþÿôÿò  ÿíÿìÿìÿò ÿ÷ÿõÿôÿüÿþÿìÿÿÿðÿíÿìÿúÿìÿïÿþÿìÿ÷ÿûÿõÿþÿìÿìÿìÿìÿõÿý ÿìÿìÿòÿýÿúÿ÷ÿí ÿÿ ÿý ÿôÿó ÿýÿìÿí  ÿöÿÿÿþÿìÿì0ÿìÿìÿìÿìÿò%ÿûÿ÷ÿòÿøÿì%ÿõ"*ÿþ ,ÿìÿìÿûÿìÿìÿþÿìÿìÿìÿÿÿý ÿü ÿìÿúÿöÿûÿíÿïÿìÿûÿïÿòÿüÿòÿì ÿìÿìÿþÿøAÿìÿõ%ÿìÿõ ÿÿÿÿ  (ÿìÿþÿò ÿñÿóÿöÿìÿí  &ÿûÿïÿ÷ÿìÿüÿø!ÿì..ÿþÿôÿìÿô;ÿþÿÿÿù&ÿõÿûÿì(ÿìÿðÿìÿüÿö."ÿìÿõÿíÿìÿìÿõÿýÿìÿìÿìÿõÿôÿöÿôÿìÿìÿìÿÿÿõÿì ÿîÿúÿý %4 ÿù ÿîÿñ ÿìÿìÿûÿúÿìÿýÿðÿìÿûÿôÿøÿõÿñÿðÿíÿòÿóÿìÿ÷0ÿìÿó&ÿìÿìÿòÿóÿì$ ÿôÿðÿìÿìÿÿÿø!ÿìÿìÿúÿìÿô=ÿìÿô ÿðÿìÿÿÿ÷ÿìÿõÿðÿìÿìÿì ÿÿÿì ÿðÿìÿìÿó ÿòÿîÿìÿÿ%ÿì ÿìÿõÿòÿìÿì/ÿó ÿôÿìÿìÿøÿñ ÿùÿõÿ÷ÿöÿûÿúÿüÿìÿì "ÿðÿì0ÿ÷ÿöÿúÿìÿìÿñ*ÿðÿìÿø ÿõÿì !ÿòÿì ÿõÿõ ÿûÿìÿû  ÿìÿìÿùÿü 6ÿüÿì ÿìÿüÿó ÿùÿþÿõ ÿþÿüÿóÿø"ÿõ ÿðÿìÿöÿôÿìÿìÿì"5ÿìÿþÿìÿýÿúÿìÿûÿûÿìÿÿÿìÿìÿóÿÿÿìÿóÿóÿíÿþÿìÿìÿõ ÿí ÿìÿý(ÿýÿìÿûÿ÷ÿÿ -ÿùÿúÿñÿýÿìÿìÿýÿüÿöÿùÿüÿìÿîÿúÿöÿôÿìÿþÿõÿÿÿñÿìÿ÷ÿíÿòÿñÿî ÿìÿíÿò &ÿðÿþÿùÿòÿìÿüÿìÿìÿîÿûÿìÿð1ÿù)(ÿìÿìÿòÿìÿöÿòÿóÿìÿöÿìÿì (ÿìÿìÿ÷ÿìÿïÿôÿþ ÿìÿí!ÿöÿìÿîÿîÿìÿìÿìÿûÿìÿûÿûÿìÿìÿì#ÿìÿüÿíÿìÿìÿÿ ÿìÿñÿ÷ÿù ÿþ*ÿìÿí ÿú1ÿìÿûÿìÿí ÿÿ ÿúÿþ#"-ÿøÿìÿüÿúÿÿÿöÿìÿùÿìÿìÿôÿö!'!ÿì"ÿ÷ÿúÿó ÿôÿö!ÿùÿìÿðÿìÿûÿþÿÿÿóÿýÿîÿìÿìÿÿÿïÿìÿüÿìÿ÷ÿóÿðÿìÿ÷ÿîÿìÿý ÿøÿôÿúÿ÷ÿÿ ÿþÿüÿù ÿñ ÿüÿöÿüÿýÿñ ÿ÷ÿýÿõ ÿú ÿþÿú # ÿòÿó$ÿìÿì ÿôÿì ÿÿÿóÿ÷ÿìÿìÿþ+ÿô ÿõÿñ " ÿïÿûÿúÿìÿõÿúÿíÿìÿôÿìÿïÿùÿúÿùÿñÿìÿìÿûÿìÿó  ÿðÿûÿìÿöÿìÿò ÿøÿòÿ÷ÿìÿí' ÿì)ÿìÿì  ÿñÿòÿî ÿìÿì4$ÿüÿìÿìÿø ÿúÿÿÿûÿíÿìÿíÿòÿìÿìÿîÿòÿì"ÿìÿìÿøÿøÿöÿïÿöÿüÿ÷ÿìÿïÿÿÿìÿì,-!ÿðÿìÿöÿôÿõÿûÿô ÿìÿì#ÿìÿìÿõ6ÿøÿìÿýÿíÿöÿìÿì ÿõÿûÿìÿìÿî ÿü ÿüÿîÿìÿúÿöÿìÿú ÿúÿìÿù ÿþÿò1ÿúÿôÿñ ÿî"ÿìÿú ÿøÿþÿü  ÿì ÿöÿõ ÿñÿûÿìÿñÿ÷ÿöÿì ÿì ÿõÿîÿõÿìÿö  ÿó  ÿöÿõ2ÿòÿìÿõÿìÿïÿìÿì#ÿìÿþÿýÿüÿôÿìÿü ÿìÿìÿíÿìÿìÿö ÿþÿûÿìÿìÿìÿþÿþÿ÷ÿøÿÿÿ÷ÿû ÿúÿüÿþÿþÿñÿ÷ ÿìÿôÿìÿõÿüÿì ÿñ ÿïÿúÿöÿöÿìÿõÿòÿì'ÿì$ÿúÿíÿÿÿùÿòÿñÿìÿø ÿìÿìÿìÿìÿíÿ÷ÿ÷+ÿìÿì !ÿû 3 ÿþÿüÿìÿû)ÿ÷ÿöÿì ÿìÿìÿùÿì ÿþÿýÿì ÿóÿì+ÿòÿòÿì ÿìÿîÿ÷ÿø ÿðÿìÿýÿïÿø ÿùÿû*ÿöÿìÿýÿÿÿì ÿìÿìÿÿÿìÿì 02ÿòÿìÿüÿõ ÿìÿÿÿîÿóÿï!ÿúÿþÿþÿìÿì ÿõÿüÿþÿðÿìÿíÿòÿð%ÿþÿì#-ÿùÿí: ÿìÿûÿú ÿñÿìÿöÿòÿüÿìÿìÿö ÿõÿý2 ÿìÿö ÿüÿì ÿý ÿìÿìÿìÿìÿìÿÿÿõÿúÿì ÿñÿñ (ÿ÷ÿóÿìÿìÿù0.ÿùÿõÿû'ÿòÿÿÿý ÿøÿïÿúÿìÿü,ÿüÿýÿìÿìÿøÿìÿôÿö%ÿìÿ÷ÿùÿìÿì! ÿÿÿõÿúÿìÿóÿöÿîÿöÿúÿ÷ÿì!ÿÿ!ÿìÿñÿûÿìÿöÿñ ÿúÿö ÿìÿì ÿìÿìÿ÷ ÿìÿì ÿìÿÿÿþ ÿì ÿù ÿþÿ÷ÿóÿì  ÿîÿìÿÿÿúÿì ÿì ÿìÿøÿìÿöÿïÿì  ÿ÷ÿý"ÿýÿúÿìÿöÿìÿìÿìÿðÿì ÿÿ  ÿùÿüÿìÿìÿùÿìÿöÿíÿïÿþÿìÿìÿøÿøÿìÿþÿì ÿûÿüÿþÿõ ÿìÿñÿõ ÿì>ÿÿÿÿÿï"& ÿïÿùÿõÿÿÿò  ÿù! ÿóÿìÿ÷ÿù ÿì#ÿ÷'ÿ÷ÿóÿ÷ÿìÿìÿïÿìÿôÿûÿìÿöÿýÿîÿô' %ÿìÿì ÿýÿôÿóÿö ÿúÿòÿûÿúÿöÿö ÿû ÿþÿÿÿõÿìÿþÿìÿìÿöÿìÿð%ÿìÿÿÿìÿìÿý %ÿìÿõÿõÿìÿìÿÿÿùÿì ÿì! * ÿöÿõ ÿìÿ÷ÿýÿùÿòÿüÿýÿú- ÿøÿô  ÿìÿì ÿîÿõ ÿì ÿìÿìÿìÿìÿùÿú ÿþÿöÿì ÿìÿìÿì ÿûÿ÷ÿúÿöÿðÿìÿõÿì ÿô ÿìÿìÿüÿìÿìÿìÿ÷ÿìÿìÿüÿì*ÿüÿìÿÿÿðÿìÿþÿÿ ÿìÿìÿìÿìÿð! ÿþÿùÿîÿðÿñÿóÿñ ÿì ÿìÿûÿýÿìÿùÿðÿý( ÿø ÿíÿìÿìÿïÿìÿôÿûÿôÿþ ÿìÿì'ÿìÿùÿóÿíÿüÿïÿôÿÿ ÿô ÿóÿì ÿðÿìÿìÿÿÿþ ÿìÿöÿùÿóÿì'ÿýÿîÿþ?ÿý(,ÿþ.ÿûÿÿ'ÿýÿûÿïÿúÿìÿóÿìÿþÿîÿîÿóÿ÷ ÿìÿìÿôÿùÿù #ÿô ÿûÿû ÿì ÿÿÿðÿýÿòÿìÿýÿ÷ÿì -ÿõ %ÿìÿìÿìÿì  ÿþÿù$ÿì  ÿïÿòÿìÿïÿì+ÿðÿìÿù ÿðÿùÿó ÿÿÿÿÿøÿüÿìÿñÿìÿìÿìÿöÿøÿìÿðÿþÿïÿïÿýÿúÿìÿñÿ÷ÿó % ÿìÿþÿ÷ÿÿÿøÿìÿìÿìÿìÿìÿòÿíÿôÿìÿ÷!ÿìÿìÿìÿïÿÿÿûÿüÿö)ÿõÿìÿüÿóÿìÿìÿüÿýÿìÿìÿòÿðÿó ÿîÿîÿÿÿòÿìÿìÿùÿðÿïÿûÿìÿìÿìÿì ÿúÿüÿìÿú ÿòÿîÿìÿñÿíÿìÿþÿìÿüÿìÿì ÿ÷ÿì ÿûÿúÿñÿñÿíÿýÿî ÿöÿîÿìBÿìÿïÿìÿìÿùÿîÿüÿñÿúÿìÿìÿòÿöÿîÿþÿðÿìÿþ'ÿñÿì"ÿÿ(ÿóÿìÿü +ÿìÿþÿõÿí 1 ÿýÿûÿôÿýÿîÿìÿîÿì ÿìÿðÿìÿöÿìÿý ÿòÿìÿðÿìÿ÷ÿøÿìÿìÿôÿð#ÿóÿìÿî ÿìÿìÿóÿìÿûÿìÿüÿì ÿöÿìÿìÿõÿì ÿî #ÿþ ÿìÿñÿïÿì#ÿìÿðÿìÿýÿúÿø ÿòÿòÿìÿùÿøÿìÿîÿï)ÿñÿú ÿüÿì ÿöÿìÿÿÿïÿýÿûÿÿÿìÿì!3 ÿõÿø ÿîÿìÿðÿúÿíÿì%%0ÿüÿì'ÿìÿíÿ÷ÿñÿ÷ÿìÿíÿìÿòÿ÷ÿìÿÿÿìÿì3ÿóÿüÿñ'ÿ÷ÿìÿöÿùÿì ÿìÿüÿï7ÿú!ÿõÿìÿîÿì7ÿì=ÿì ÿðÿìÿìÿûÿóÿÿÿì ÿìÿúÿôÿðÿøÿùÿìÿüÿìÿóÿû" ÿòÿìÿòÿìÿøÿþÿìÿü,ÿìÿùÿð::ÿùÿüÿñÿñÿóÿì6ÿöÿìÿìÿÿÿüÿïÿôÿùÿòÿìÿì,ÿì6ÿöÿìÿöÿìÿûÿðÿìÿöÿþ ÿüÿò 1ÿìÿìÿÿ ÿøÿôÿìÿì!ÿìÿì -ÿìÿìÿôÿì ÿòÿø ÿïÿöÿûÿìÿóÿìÿì' #ÿö ÿÿ ÿìÿìÿì$ ÿý ÿþÿóÿìÿìÿþÿìÿì  ÿìÿó.<ÿìÿìÿìÿïÿîÿôÿþ ÿøÿì ÿøÿìÿÿÿþ ÿìÿûÿìÿìÿÿÿôÿðÿì ÿìIÿñÿðÿìÿþÿüÿìÿìÿì ÿòÿòÿù ÿöÿÿÿûÿô ÿì#ÿìÿôÿìÿôÿõ ÿøÿÿÿøÿìÿû ÿðÿìÿû "ÿù ÿóÿìÿïÿüÿþÿòÿìÿôÿì#ÿì ÿÿÿìÿüÿîÿôÿùÿó ÿÿÿúÿìÿóÿò+ÿûÿýÿýÿüÿýÿøÿý  ÿñÿðÿù ÿî%ÿ÷ÿñÿøÿóÿü"ÿî ÿúÿìÿù>ÿ÷ÿðÿþÿõÿô#ÿóÿð*ÿÿÿôÿì+ $ÿìÿñÿü0ÿìÿþÿÿÿì ÿòÿûÿïÿóÿìÿì ÿøÿîÿôÿøÿîÿþÿìÿôÿý+ÿðE ÿôÿì&ÿûÿú =ÿìÿìÿìÿìÿìÿùÿþ(ÿþÿìÿóÿú ÿõÿúÿìÿÿ ÿü ÿö ÿùÿìÿ÷ ÿñ'ÿúÿôÿîÿöÿì ÿìÿùÿúÿìÿìÿìÿü'ÿ÷ ÿìÿï@!ÿøÿìÿðÿì ÿìÿìÿìÿõÿ÷ ÿìÿÿÿì ÿì ÿÿÿìÿÿÿøÿìÿìÿì ÿôÿñÿìÿþ%ÿúÿìÿýÿìÿþÿìÿþÿìÿ÷ÿøÿìÿìÿþÿìÿìÿøÿö ÿþÿìÿïÿì&ÿú"ÿì ÿü ÿìÿù$ÿ÷ ÿìÿìÿ÷ ÿñÿìÿüÿðÿùÿþ$ÿìÿì ÿùÿüÿùÿòÿõ ÿìÿìÿìÿìÿô &ÿòÿï ÿìÿöÿòÿìÿöÿì"ÿì ÿøÿûÿþ ÿíÿö ÿüÿýÿìÿ÷ÿìÿì ÿ÷ÿíÿìÿöÿúÿîÿðÿìÿì+ÿìÿù $ÿóÿý #ÿìÿüÿìÿìÿìÿîÿúÿüÿìÿì ÿùÿðÿöÿìÿýÿ÷ÿþÿìÿôÿü 5ÿì ÿóÿìÿìÿõÿìÿòÿÿ fv5.4/ftools/guis/fv/sample_data/ngc1316o.fit0000644000220700001010000103400007452425201020312 0ustar birbylheadevSIMPLE = T / file does conform to FITS standard BITPIX = 16 / number of bits per data pixel NAXIS = 2 / number of data axes NAXIS1 = 440 / length of data axis 1 NAXIS2 = 300 / length of data axis 2 EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format defined in Astronomy andCOMMENT Astrophysics Supplement Series v44/p363, v44/p371, v73/p359, v73/p365.COMMENT Contact the NASA Science Office of Standards and Technology for the COMMENT FITS Definition document #100 and other FITS information. COMMENT FITS (Flexible Image Transport System) format defined in Astronomy andCOMMENT Astrophysics Supplement Series v44/p363, v44/p371, v73/p359, v73/p365.COMMENT Contact the NASA Science Office of Standards and Technology for the COMMENT FITS Definition document #100 and other FITS information. OBJECT = 'NGC 1316' TELESCOP= 'Optical ' INSTRUME= ' ' OBSERVER= ' ' DATE-MAP= '24/03/94' EQUINOX = 1950.0 / EPOCH OF RA DEC DATAMAX = 1.037890381E+03 /MAX PIXEL VALUE DATAMIN = -5.450668335E+00 /MIN PIXEL VALUE CTYPE1 = 'RA---SIN' CRVAL1 = 5.01966661513E+01 / CDELT1 = -1.944444492E-03 / CRPIX1 = 2.260000000000000E+02 CROTA1 = 0.000000000E+00 / CTYPE2 = 'DEC--SIN' CRVAL2 = -3.73856168315E+01 / CDELT2 = 1.944444492E-03 / CRPIX2 = 1.470000000000000E+02 CROTA2 = 0.000000000E+00 / HISTORY -------------------------------------------------------------------- HISTORY /Begin "HISTORY" information found in fits tape header by IMLOD HISTORY BLOCKED = T /TAPE MAY BE BLOCKED HISTORY /-------------------------------------------------------------------- HISTORY /BEGIN "HISTORY" INFORMATION FOUND IN FITS TAPE HEADER BY IMLOD HISTORY /END FITS TAPE HEADER "HISTORY" INFORMATION HISTORY /-------------------------------------------------------------------- HISTORY IMLOD OUTNAME ='NGC1316 ' OUTCLASS ='OPT ' HISTORY IMLOD OUTSEQ = 1 INTAPE = 3 OUTDISK= 1 HISTORY IMLOD RELEASE = '15APR89' HISTORY TRANS RELEASE ='15APR89 ' /********* START 17-FEB-1989 08:47:28 HISTORY TRANS INNAME='NGC1316 ' INCLASS='OPT ' HISTORY TRANS INSEQ= 1 INDISK= 1 HISTORY TRANS OUTNAME='NGC1316/G ' OUTCLASS='OPT ' HISTORY TRANS OUTSEQ= 1 OUTDISK= 1 HISTORY TRANS BLC= 1., 1., 1., 1., 1., 1., 1. / INPUT IMAGE HISTORY TRANS TRC= 2001.,1401., 1., 1., 1., 1., 1. / INPUT IMAGE HISTORY TRANS TRANCOD='1-2 ' / OUTPUT AXIS ORDER HISTORY CNTR VERSION= 1 / PLOT FILE CREATED 17-FEB-1989 14:03:52 HISTORY CNTR VERSION= 2 / PLOT FILE CREATED 17-FEB-1989 14:07:08 HISTORY CNTR VERSION= 3 / PLOT FILE CREATED 17-FEB-1989 14:08:35 HISTORY PUTHEAD CTYPE1 =' ' / OLD HISTORY PUTHEAD CTYPE1 ='RA--TAN ' / NEW HISTORY PUTHEAD CTYPE1 ='RA--TAN ' / OLD HISTORY PUTHEAD CTYPE1 ='RA---TAN' / NEW HISTORY PUTHEAD CTYPE2 =' ' / OLD HISTORY PUTHEAD CTYPE2 ='DEC--TAN' / NEW HISTORY PUTHEAD CRVAL1 = 0.000000000E+00 / OLD HISTORY PUTHEAD CRVAL1 = 5.019667053E+01 / NEW HISTORY PUTHEAD CRVAL2 = 0.000000000E+00 / OLD HISTORY PUTHEAD CRVAL2 = -3.738555908E+01 / NEW HISTORY PUTHEAD CRPIX1 = 1.00000E+03 / OLD HISTORY PUTHEAD CRPIX1 = 7.02000E+02 / NEW HISTORY PUTHEAD CRPIX1 = 7.02000E+02 / OLD HISTORY PUTHEAD CRPIX1 = 9.97000E+02 / NEW HISTORY PUTHEAD CDELT1 = 1.00000E+00 / OLD HISTORY PUTHEAD CDELT1 = 3.05600E-02 / NEW HISTORY PUTHEAD CDELT2 = -1.00000E+00 / OLD HISTORY PUTHEAD CDELT2 = 3.05600E-02 / NEW HISTORY PUTHEAD CDELT2 = 3.05600E-02 / OLD HISTORY PUTHEAD CDELT2 = 5.09333E-04 / NEW HISTORY PUTHEAD CDELT2 = 5.09333E-04 / OLD HISTORY PUTHEAD CDELT2 = 5.09333E-04 / NEW HISTORY PUTHEAD CDELT1 = 3.05600E-02 / OLD HISTORY PUTHEAD CDELT1 = -5.09333E-04 / NEW HISTORY PUTHEAD CROTA1 = 0.00000E+00 / OLD HISTORY PUTHEAD CROTA1 = 3.00000E-01 / NEW HISTORY PUTHEAD CROTA1 = 3.00000E-01 / OLD HISTORY PUTHEAD CROTA1 = 0.00000E+00 / NEW HISTORY PUTHEAD CROTA1 = 0.00000E+00 / OLD HISTORY PUTHEAD CROTA1 = 3.00000E-01 / NEW HISTORY PUTHEAD CROTA1 = 3.00000E-01 / OLD HISTORY PUTHEAD CROTA1 = 5.00000E+00 / NEW HISTORY PUTHEAD CROTA2 = 0.00000E+00 / OLD HISTORY PUTHEAD CROTA2 = 5.00000E+00 / NEW HISTORY PUTHEAD CROTA1 = 5.00000E+00 / OLD HISTORY PUTHEAD CROTA1 = 0.00000E+00 / NEW HISTORY PUTHEAD CROTA1 = 0.00000E+00 / OLD HISTORY PUTHEAD CROTA1 = 0.00000E+00 / NEW HISTORY PUTHEAD CROTA2 = 5.00000E+00 / OLD HISTORY PUTHEAD CROTA2 = 0.00000E+00 / NEW HISTORY PUTHEAD CROTA1 = 0.00000E+00 / OLD HISTORY PUTHEAD CROTA1 = 1.00000E+00 / NEW HISTORY PUTHEAD CROTA1 = 1.00000E+00 / OLD HISTORY PUTHEAD CROTA1 = 0.00000E+00 / NEW HISTORY PUTHEAD CROTA2 = 0.00000E+00 / OLD HISTORY PUTHEAD CROTA2 = 1.00000E+00 / NEW HISTORY PUTHEAD CROTA2 = 1.00000E+00 / OLD HISTORY PUTHEAD CROTA2 = 3.00000E-01 / NEW HISTORY AIPS IMNAME='NGC1316/G ' IMCLASS='OPT ' IMSEQ= 1 / HISTORY AIPS USERNO= 51 / HISTORY /END FITS tape header "HISTORY" information HISTORY -------------------------------------------------------------------- HISTORY IMLOD OUTNAME =' HISTORY IMLOD OUTSEQ = 0 INTAPE = 1 OUTDISK= 3 HISTORY IMLOD RELEASE = '15JUL94' HISTORY SUBIM RELEASE ='15JUL94 ' /********* Start 24-MAR-1994 10:58:33 HISTORY SUBIM INNAME='NGC1316/G ' INCLASS='OPT ' HISTORY SUBIM INSEQ= 1 INDISK= 1 HISTORY SUBIM INTYPE ='MA' USERID= 100 HISTORY SUBIM OUTNAME='NGC1316/G ' OUTCLASS='SMOOTH' HISTORY SUBIM OUTSEQ= 1 OUTDISK= 1 HISTORY SUBIM BLC = 1, 1, 1, 1, 1, 1, 1 HISTORY SUBIM TRC = 2001, 1401, 1, 1, 1, 1, 1 HISTORY SUBIM XINC = 4 YINC = 4 HISTORY SUBIM OPCODE = 'AVE ' HISTORY HGEOM RELEASE ='15JUL94 ' /********* Start 24-MAR-1994 10:59:29 HISTORY HGEOM INNAME='NGC1316/G ' INCLASS='SMOOTH' HISTORY HGEOM INSEQ= 1 INDISK= 1 HISTORY HGEOM IN2NAME='FORNAX ' IN2CLASS='I ' HISTORY HGEOM IN2SEQ= 2 IN2DISK= 1 HISTORY HGEOM OUTNAME=' ' OUTCLASS='Optic ' HISTORY HGEOM OUTSEQ= 1 OUTDISK= 1 HISTORY HGEOM BLC = 1, 1, 1, 1, 1, 1, 1 HISTORY HGEOM TRC = 501, 351, 1, 1, 1, 1, 1 HISTORY HGEOM IMSIZE = 512, 512 / Output image size HISTORY HGEOM / Interpolation order used was BiCubic HISTORY HGEOM / Indeterminate pixels filled with magic values HISTORY HGEOM / 74383 Pixels blanked due to memory limits or geometry HISTORY HGEOM / 0 Pixels blanked due to input blanked pixels ORIGIN = 'AIPSGorilla (NRAOCV IPX) 15JUL94' / DATE = '24/03/94' / File written on dd/mm/yy HISTORY AIPS IMNAME='NGC1316/G ' IMCLASS='Optic ' IMSEQ= 1 / HISTORY AIPS USERNO= 100 / END  $0;J{²Y_diou}…“›¦¯¹ÁÀÄÇÈÈÈÈËÌÌÏÏÏÓÓÑÒÓÓÕÖÕÖ×ØØØÙÚÚÛÚÜÝÝÜÛÜÝÜÝÝßáÞßàßßáàßàááâáÝàáâäçèéëæååääãããæäéäâãäãääââãåãããããäãááàßàáàáâääååääåææççéìíïììëèçæçèçæåäåæååäåãååãèåãâåçããäãäåçæçèççèææçèæèáãèèææææèèæçæååååäçåææææéæäåäåååæåäææåååæææåçæææçææçåçèèèèççééææååæéèæéèçèèçæååçèæåãäååäääåääãäåäãââäãàáâáààáâããâãããããäãääååäâåèýçâãäâãââãàßâãäààààÞààáßàÞààÝÝÞàáàààßÞßåõÜÞÞÞÞÜÞÞÞÝÛÛÞßÝÜÜÛÚÚÙÝÙØØØ×Ø×Ö×ÖÕÓÔÖÔÓÑÒÓÊÊÊÊÇÆÅÅý·°¦Ÿ—‡}wrnhc`[VN ".9EVZc^chnsz€‰’𥱷»ÁÅÅÇÈÉÊÊËÌÎÎÑÐÓÓÒÒÒÔÕÕÖ××ÙØÙÚÙÚÝÝÞÜÞÝÝÜÝÞÞÞßßÝàæáÞàáÞàààáãáãâáâêêåçääåâââáãáâáãããââäãâãããââãââãâáâáààâãâããããäääåååçééèêêééèççççéèèéæåååææåææçòçäâãæääääæçèççèççéçèçëçãVæççççççæççæçéææææçæææåæçååæååææåæååçååèèççæçéèççèèçèéêèééèççæéèæåëìçøöééæççæååååçåååæåääæååååçäããããåãâãäáâãâääãäæåäääåæææäåäååßãâãääãããðøìâåæáââáàâàáàßßàÞõôÞáààáàßßßÞÞßáÞÞÝÞÞßÝÝÜÞâáÞÝÜÛÝáßÛÚÚÚÙÙÙ×ÜÙØÖÖáâ×ÓÓ×ÍÍËÊÉÊÈÌÈý¶®¥•‡‚|vrmgb^ZT*6AJSUXbflsx~†–œ¡¬´¹¿ÃÆÇÇÈÌËÏÓÜÑÐÑÑÖÔÓÔÔÔÕÕÖ×ÖרÚÚÚÛÜÛÞßÞÝÜÜÝÞßàÞÜÝÞÞßÞàáßàààââáâââáâãããããããäâããâáâãâãããääääãããããââÞããâåäããæäââäããååååæèééèééééèéêéèéèèéçæææççåççèíçæåäåæææææçèèèèèçèíèèèèåþçèçæçéèæææçæéèççæççææææççççåææåççæêçæåèéçèèéééèèèééèêîïéèçèçêéìèææëíéèéíñëèæçæçæåçåæçææåæææåãäååãääååâääääääçèäæéçåæææçæèååæååæãããääååãÿR8ÜäãâããâáäâáàÞàáÞù÷ÞààßààààßÝàßàÞÞßÞÞÞÝÝÞàáßÞÝÜÜÝáßÜÚÜÜÛÚØ×ÛÙØ×ÚáßÖÔÓ×ÏÍÌÌËÊÈÉÇÄÁº³«¢›”†€zvusfb^Y '4?GNUZ_flrw}„Œš¡¦²º¿ÄÅÆÈÉÉÊËÎÏÒÓÑÑÒÖÕÕÖÕÕÖØàâÙÙÚÚÛÝÜÜÝÝáßÜÜÝßÞÞÝÞßßßßßÞßàáááâãäâââããããããääãâãäääãââãããæææææåãäåääãëåãâéæåãâããääääåååæèêççèèèéèéêêèææççåææåææçææççêèæçèèæèèçæåæèèèèëçê íèééèãæééèçæçèæçççççèçææææççççææææææææèççèæçéçèèèçèéççèèèèéìëëêéçèèééëèèççççèå;èæææçææåäåææåçæåææåäääääääåäååäåææçéæäææåæææååæååæååæääääãäéåðVOÙäããäãââãâááßàáàßàááààààáàáàÞàßàßàßßßßÞÞÞâàÜÝÝÞÞßßÝÝÛÝÜÜÜÛÛÛÚÙÙÛÛØÖÕÔÔÒÎÍÍËÊÉÈÇÆÃÀ¹²ª¡š“‹„zwvkgb^ #.;EMSX^cjov{ƒ‹’œ¤ºÀ½ÄÆÆÇÊÊÉËÍÎÏÎÐÑÒÒÖÕÔÕÖÖÖÖßãØÙÚÛÜÜÛÜÝÝÞÝÝÝÞÞÞÝÝÝßßàßßßàßàáâäâáââãããääããçêääâããâãââããäæåææåäãããäåäùSåãâçääãâããäãäæåäæççéçæçèçëêéèéççæçæåææåääçææçéíìèççèæèèææççééèèêçêýìéêéèèèãåéêéèéèèçççæççææçêèçèçææååæææææçççéêééçêéèìêçèèèèèêìêèêçêèêêéêèéçèèçççîöñéççççææååèçåäæååççåååæçèåååææççåææåççåäæææèéççæææèæåæåååæåäèèäÞÞåäååçæäãâááâáàáàááààààááááàáßáßààààààààßÞááÞÞßßàßßÝÞÞÞßßßßÞÜÛÛÛÚÚÙ××ÔÓÔÒÏÍÍÊËÊÈÈÆÃ¾·±¨ ™‘Œ†~yvojfa  +7BKQW\chntzˆ‘™£¬»ÂÃÆÇÈÌÏÊËÌÎÑÐÐÏÔÕÔÕÖÕÖÖÕÖØÛÚÙÛÜÜÝÚÛÜÞßßÞÞÞßàÞÝÞÞÞßààßßàââááâáâäèåããååãããâããããâäæãåääääääääåäääåææéûåäãäääãååäåååççæèéæçèçççéíîèèèççèçççççæïÿæèèèêêìéèæææèèççèèêéèêééêæèêêîóë:åêééêëéèèçèçèçèçêéçèçææíîççèçæçèçèééêéìëéóïèèéééêëêéçèéêéëèèçèèêëéèèèçèèèèçççéèæåççèççååçèçææçèèææçóééææäççææææçççææçæååææææåæääææääåååååäåæççåããáâáãââááááááàáááâàáàáßáàßáááßáàßààßÞàßàßßÞßààãâáàßßÞÝÜÛÜÛר×ÖÔÓÑÏÎÌËÍÊÉÈÆÂ¼¶®¦Ÿ—‰ƒ}wtnjd (3?HOTZagmsx€†Ž˜ ©³ºÂÆÈÊËËËÉËÍÏÓÒÒÑÖÙ×ÕÙØÖÛÜÙÚÛÛÝÛÛÛà ðÞÝÞÞÞÞßßßßßàààáàáààçâáãâããáòêáãææããääååäåãåäîåãäåææååæååæååææåäåæçåãääåæçæççæææççèèèèæççèèééèèèççééèçèåøæêèéèéêééèçåçéèèéêêêéêéêìéèééøB æéçèêëéééêééééççèèèèèêéììææèéçèççèèèéëéëêîìééééêëééééèééééêèéçèëêèèéçèèççæèèêççææèçççææçèççëìæäææäé íèèæäåæççæççççææåæçåååçìåäåääåæææååææåæçäåååãáãããââáááááâââââââááááâààáâáààáãáßàßßßàßàáàââäãäãàââàßßßÝÙØØÙÖÓÓÑÑÎÍÍËËÉÈÅÁ»´­¥œ“‡|yrmh $0<FNSX^ejqw~†Œ•ž§¯¸¿ÆÊÈÉÊËÎÌÎÎÏÒÔÓÓÔ×ÖÕÚÙ×ÜÝÙÚÛÛÜÛÛÜÞìçáßàßÝÞßÞáààãâßàßàáàáââäááãåæäâãååååääãääåããäææäåäåææææåäæçæææææçæêçäåèææçæççççççççèëæèèèèèééèééèèéèçççæì÷èèèèçéééèéíøðééêìêêëëêêêìéééöû% ÷óíêéèéìíéêííêêééèèéêéééïíèèççèèèèéèëëêêìêêëëéèéêêëëéêêêéééêèëêéèééééèèèéèèèéèçççèçççèéèçæèèèçèéæçèéìçéëçêèæååéèæéëëêææçåæåååçôëçæåæèççæåæææåææææååãããåäãâáâãáâäãâãááââáâááààáâàààâåãàâáááááâãããäæåçåääåäââàÞÜÛÚÚØ×ÖÓÒÏÎÍÌÍËÉÐËÀ¹³¬£›“Œ‡€|wpk  +8CKQW\cinu}ƒŽ“›¤­¶½ÃÌÏÌÌÊÌÏÎÑÏÐÔÚÕÕ××ÕÖÚÙØÚÚÚÛÛÜÜÛÜÞàÜÞàßáßðæßàâáßèõìàáâäââáãâãæäæäããääååæåæåæôõäåçååååæææöñãåææçæçæèææççççèåæèçççççæççççéîçèëééêèéêééèçèèçèèèèééèéçèèëêééò øèëììèîöìêííëêëêûð÷õìêëëëëêìíéêíìéêêéêèéìêééíìéééèèèéèèêìëêíìëëëêééééëìêêëëëëêêëñéèééèéééèéêêêêíèèèççèççèèèçèèçæææçæåççéèèèçéççèçççæçêêéçåæåæççæèêíççåææåæææççææçææåäåããååãâââãããääããââáâáâáâááâãáàááâââââãââããäæäéêçèèéèèçåãâáßÝÜÜßâØÔÒÑÏÎÍÌËÊÒÏĽ¸±©¡™‘Œ…zuq '3?HOU[`gms{ˆ’™¢ª³»ÂÆËÎÔÕÌÌÌÏÐÏÑÕØÕÔØ×Ö×ÛÛÚÙÙÛÜÜÜÜÛÝßßßåèáààçãááááÞð üâããäââââãâæäããåããääåääåååèìíåèåäåæåçïìæåååìðåææææççæèèéíêèèéèççèéçèèèçççêééééèèèèèèèèçèéèééééééééðêëééëêêììéçöìéîóëëëëéëëêêêéêëìëééêééêèêëêéééêéèéêêêééèéëéêëééëììëêëêêëëééëêéêêëëëééí¶)ìçêëèèêêèèêêèéëèèêìéèçææèçççççèèèçæçççæçççêéææéèççèèéèèéèæçèçèæêèêçæçæåæåäåæææäæèæææääããääâãâááâããââãäãâãâááââàâãâááâáâãáâäãâääæçæìëêìííåçìêçåäâàßÞâçØÔÔÒÑÐÍÌÌËÌËÉüµ¯¦ž–Šƒ}yw ".<FMSX^djpw…Œ”ž¨±¸¿ÆÇÇÊÑÒËÌÍÎÎÏÑÒÒÕÕÖ×רÛÛÙÚÚÜÝÝÜÝÞÞÞÞÞéëáàáßßàáááàçñíââãããâáããâääãäæääääååäåæèååðçèååãåæççææççæççåèêèæææèêéâÃOéæèèççèèèèèéçèéèìéèèéééèéêèèèèéêêêêêéêçèéêééêéêëëëêéðúëéíôëñíìëìëëêééêêëëêéêéãêêëêêêêéêéééêêééééêìèêëçèìììîëêêëëêêêéòúîëêëëêéíYëéëêèèééééêéèéêéçêíóèèæçèæåèèèéêêèççéîæèêééèççèéêèççèéèèçææèèççççéçççææçæææææææçèçææåääååääãâãââääâáããâãääãæââââââáââããããââèðææêêéëíïðôú ññìèèåäâàÞÞ×ÕÔÒÒÒÏÍÌÌËËÊÇÁ»µ­¥•އ‚~z *6CLQV[ahmtz‚Б𤮶½ÃÆÇÈÊÊÊËÍÏÏÏÐÑÐÓ×ÖÖרÙÛÝÙÙÜÝÝÞÞÝÞÞßáåãçáàâááááááçíçáãâãæäâããäãâýóäçåäæåçêèççääæåæäæååèìèååææææçéçéçèççèìå`%ëèèèèèèççèèèééèèééèèêëééëêéèêìéêééééêêéêêìêêéêêêëëêëëëììííìøîììììðìéëíêéëëéê$éëìêêêìëìëêêëëëìëêêêêêéêìììíðîííììëëìéóþñëêëìïëêßëëëììéêêêëëêêéêêéééêîéèèééèçèéééêêèèéèêçèééêêéèèéèééèèèèèèèçèéêçèæèèèèçééèéèææçèééççèæåäåãääæääåäâãäââãâäæãããââââââáâãååäääãñ æéëíîñôô÷û ™XõöúþòêèãàßÝÙ×ÕÒÓÒÐÍÍÌÌËÉÈÅÀ»³«¤›”Œ†‚} &2>HOUZ`gmsy€‡Ž˜¢«³»ÂÇÈÉÊËËÌÍÎÑÒÑÒÒÓÕרØÙÛÛÛÝÛÜÝÞàÞßßàáæáäâäãâââäåäçìèäæååçåèäæäääôïåææææçèééçæåååçææçæçééèîìæçèçèèèèèèééììêéôðëðîéééééêèéêéêéêëêêêêììïøñêëíîêéêìéêîééêêéêëííìëììëìîíîíëíëîííòîíùòëìîöõêììéjèêëëëìïîìëëëìëìíëëìëìíìíîíîîíîîíîíëëîíëïîëëëìïëìíììëëìêééêëêéééééééèééèèèéèééèèèèèççêëçèèèèëéèèèèëêèééèçèèçççèçéèçïõëèèèèééèèèçèçééççççæåæääãåãåìèâãäåäâããäãââáááâããââãåæääääçìèéìîñõøúý wMþÿðëæáàÜÛÙÕÕÔÒÐÎÍÍÌËÊÊÈÅÀ¹±ª¢š‘Š…€ ".;EMRX_dkry~…—Ÿ¨±¸ÀÆËËÉÊËËÎÐÐÐÑÑÓÕÔÖÙÛÚÛÜÛÛÜÛÝÞÞßáááààáâáâæãããâäæçåäåååäåçåçåæåääæååæåæçççæææææçææçåååæææææééææçæçèçèèçèèçèèèåççþöèéèèéêèéêéèèèêééêêéèêëêêëêêêéééìêèéééêðíë÷ñêêëëëêêéêëéëéîêíðóîìïîêì  èììììëìéêìëîííëìêêééëëíïïííîîìïðîîîííííðïìîïêêëëëëëëëíîìëëêêêêéêêééééèéëééêéçéèèéêééééêèíòêíçèèèéêèèèèèëéççèèçèèçççæçèçè6¿áèèêèèèçççèèêèèçèèååæäãäåãáíøîâããäââãâãáâáäáâåæäãäåääææåæèêìïñõüþ  þôîéâàÜÚÛרÔÓÒÐÏÎÍÌÌËÉÉÆ¾·±¦Ÿ–ˆƒ )6AIPUZagnt{„Š“¢®®¶¾ÃÆÎÌÈÊÌÌÎÑÏÐÐÓÖÔÔÖØÚÚÚÚÚÛÝÝÝÞÞßÞßááæààááàáããâããâäåäãåååååæäãååäãäääåæååæççåæåçèçæçæääåæçææææçççççççéèççèéèéèèèèèîìëêèéééééèëëîëêêêëêêêêéëëêêêëëëëêêìëëêæLíëëëëëíìêëëëêëëðëììííîëðïëìíììëììëëëêëëìíìëëëêíëëëìñöóðîîïñòîíïííïê'èìîîëëëëëëìííëêëëëëêééêéêéèêéëééëèèééèêëêêêéêéìïëêéèéíêéééééééééèééééééì÷èéééé/÷çêéêïæãéèéèééêêééèèæåääååääæèççèääääääããååäããëçäååäåææèçèëîîñõúÿ (01) ÷ðêåáßÜÛÛÚÖÕÓÑÑÐÏÎÍÍÌËǾ¸¬¥•ŽŠ $1=GOUY_flsy‡’™¦¾·ºÂÅÆÉÊÊÌÍÍÏÏÏÒÒÔÚ֨רÚÚÛÛØÙïüéÜÞÞßààáçáâáâáâãâáãääããâäèéèêææååäääæåäåæååææççèèçèèçæççååæççèééèçììçèêíéèéèéçéèçéééêêòðêéçêêééêîíëëêéêêëéëëêêëëëëìëëììëëëëêéòôïìëììììëëííëëìíòìììíïíììîíìììëëìëëëìëëììíìëëëìòðìííïððòðïïõñîîðïñóî=èìðòìëëìíìíìëêìðíìêêëëëéëèåëëëêêêéééééêêêìëééèèéìëéêìñëëëééééééêêêéééêêìðééêêêêäéìëëê鹩âèéêêëîììççèèçæåæçåååääåææääæãããããæçäãäååååååçèêìêìíñôúý !-@WjgQ=*úóîêæãßÝÛÚØÕÕÓÓÒÐÏÍÌÌËÉÅÁ»³©£›”‘  ,9DLSY^ekpw~…– ¨°½ÁÅÈÉÍÍÍÍÎÐÏÎÒÓÔÓÕØÚØÙÚÜÛéì#ýÛßàááááâäâáâäãããããäääããåéêèêæèæçåååçåååååæçççèéèèèççææççæèéèèéêéèêëééîóêêééèéììéêêêëëðîéþ ðììëëìíéêëêêéëêëíëëìííìíìíììììíëìëìïíìîîíìëìîìììííîííííî ÷ëìïïîííìíììììììììííìëëììðïîïðòðïïíïïïëíïññññôóíêëíííìííìííììëëêîóïìêëììëêèþìêìíëéíêéèééêêêêêéèèèêìéêëìêëêèåèééèèëìêéèéêêééêêéêêëéêêéêè‚sçéééééìëïþëèæééçåååäåååæäãääããããåååäâáãåååååççæèêëîñöü&WžÐüí´p8 ýôîìçââÜÛØ×ÕÕ×ÙÓÎÎÎÍÌËËÈľ·°¨ž™” '4@KRV]cjou|‚Š“¥¯·¾ÆÈÌÌËÌÍÏÐÐÙåÙÔÔÖ×ÙÚÙÜÛÛÚúIÛãààààâââââããâäåäãäääåååääåååææåææææçæææåæåæçèèççèèçççççéèèíéèêèçêëêèéêéìðêééèèéêëééêêéêëëÜæçëêêééêééêêêìëëíìêëìîîëëììêìíìíìëêëììíîîíìííìëëëìñðòîììíñïíììíëíîëììîëëëîêëëëêëííìííîñòïîîîííðíííïññîíííììîíííììîìììëëëëðííìëëëìëêæ 0íéëîêëðìêéêêêéééêêèèééêéêêééêéêûèêééëëêééêêêéééêèêêìêíìëêêÿþêééêéêêå ¤óæççççáâäãåååååãê÷ããäâååääääæååææçèèèéííðóùþ8s)Õ0f¨F%ÿðìçáÞÜÛÚØÕÖÕÒÑÐÏÎÎÎÌÌËȽ¸®¤• #.:FMRX`gmrx€‡˜¡«µ¼ÂÆÇËÌËÌÎÎÏËý5åÓÕ×ÚÙØÙÜÜÛÜÜÚÜßááàáàáäââáàãâäãäããæåææååääåääæåååæçéæççæèææçèççææéèçççèîêéîéçééçéëêèééêëëééêéëéêéééêéèéêêã5eëîêêéèëéèêêëëëìïíêêìîíëìëììíïøîíìììëìïñòïííîîïîíòöõóñîðìïøõíììíïíëííììíéêëëêëìíïñøõðññðïïðïìíîïðóððîìíííìíîííííëííõììîìïìëëëëëìëêëïîëêêëëíîìëêëêèèééêêééêêëììêêêêéë.ÿçêêêêêééêëéìóéêéèëêêéëêééêææêééêêêêéþ„Iïçèçæä ãäååååäãèíæåäãäåâäåæçååèèæççâ Z ïôû 'K¦ ’ãÃÞÏX+ùñìçâÞßÝÚØ×ÖÓÔÓÑÐÏÏÎÍÌÍËÇÁ¼²«¤›)6BJQW]cluw}„•Ÿ§°»ÂÆÉÈÉËËÏÑÐÑÑÕÙÕÕÖ×ÙØÛÚÛÜÝÞÞÞÝÞããáããàááãââäãâãäääêèçåäåäääääææåèèèèçèççèçæççèçææèèçèèèëêèçèèèìêéêêëëééëìééêêêêêêéééèééééëåßéìíìéêéêêéêêêêêëíìëêëîìëêëìíëíñìëëìíììðöúøñîòóððîöðîòðïîîíòòíêêîðíîíëíìëêèïìêéìììëíïðïîîíîïîííîíòôëîíìëìëìíìììïòëìïìí÷ðëìëìîíëêêêíîéëëêêëêëêëëëëëìêééêêééêíñðéêêëêêôïëêëêêëêêêëêíóëëêëéêêêééèëëêëêéêëëêììíéèéêéèçã0äåææååååææçæååäåäääææçççèçèééóõîö ,U½Ô½õÆßÍX-ûñìèäßßÜÚÙØÖÔÓÓÒÐÐÐÐÎÏÏÍÊÄ¿¸°º¢$1<FNT[agnsz‰‘›¥±¶¼ÃÇÈÈÊÍÎÍÎÐÏÑÓÓÓÔÕØØÜåÞÛÛÞßßßßßââàâááßÛâåäæãââããåæåååäääääååååæëéèæçèëèææççèçççèéèæäçèçéçèéåçíêéêéëìíëêìêêééèéêëêêééééèèëìëêêëìëêêêíëëêêêêêëëëëìëìëêëìíììêëììììïüëïDLéîðòðïðúž ðíîîîòôïìëíïìîïîíìêëììííëëìíïññîîïðïíîîîîïïïíîìîîîíìííîîðòîîìííìííñìïîííììííìííîîìëìíêêìêìíìîòïìêêëêêêíðñéìêëëíòïìëëêêììêêëëëêëëììîíëëëïëëêéëêêêêêêëëëêëéêéççåþöååææååææååææççååççææåæççåæççêéèíðõû *L§£uš8]–E"ùðìåâáÞÝÚÙÙ×ÔÔÔÑÏÏÏÏÏÎÍÍÌÉÅÁ³«¤+7CLRX^dkqw€ˆŽ™¢ª´¼ÂÇÈÉÉÌÐÔÐÏÑÑÑÒÔÕÖØÚÛñþæÝÞÞßàßßàãåããâàìþñ åãåãäèåääääååææääåçææçëèêèèîòëçççêìéçèèèçîééééçêéâæèçèèðóíííêéêêêêêéêêêëëêêéèéëìëëêêììëêëíëëëêììììëëìëêìíìîîëììêìììííñüó•Í-êîïïðïïóGÐ5îìñðîîðîíîîîìíííìêéêììíîìíííîïïððîíîïîîïïïíîîðïîíîîîíííëý ñðîíìíìëìëììííììííìííïðìëìîíêêìêëëëëïðìéëêêêëêëëîíííëððéêëêëëìëëíëéëëëìíðñëéëïëèéêêéêêéêêêêêêìîëéççêçååççåååæåååååççååææèæååææååèéèêëïïõ÷þ%>‰Yj#¼h0ÿøðëåâàÛÛÚ×ר×ÖÓÒÐÏÏÏÍËÌËÊÊÇÀ·±ª&2?IOV[ahnu{‰˜’ž§¯¸ÀÅÇÉÉÌÌÏÔÔÑÑÑÒÔÔרØÙÚÜÝÞÞÞÝÜÝßààããáâáÙG!.Mæäãåãïéäåååæççååäåæææèççòìçòêèëéìñëçççèæö)íêìèèéêêééêêéîéêëêêêêêêèéêêìëêêêééëìëëëêëëìêììëëììíîììëëëêëëíìííìììëììííííñó øïîîïðîðñŒ ïíñîíîðïîðïííííìëéééíìîíëîîîïîíïïîïñðïîïïñïïñðîìîîìëëìíìõÿóññììíììììíìíîíððíííí÷ýëìëìîìêìëëêêñîëëêêëêêìëêíõïïïêíöîêòïëëìììííëéêëìëìêïêêêéééêêêêêêêëêêéêééíêèççêéçæêêæåååçêçæååææåææçæååèéçæéìéëìîðóöý9Yr“{X=%úõîëèãá@ïØØ×××ÖÓÔÒÐÑÏÍÌÊËÉÊÇý·± ,:EMTY_ekrz€‰“™¥¬´ÄÃÇÉÉÊÎÍÍÏÑÐÑÒÒÔÖÖ×ÙÙÜÜÞÝÝÝÜÜÜâåãååãââÞ*Àäååäääåèæååäåçæåæææçæåææçíêéîìêèóïæççèèçèééêëéíèèêëééêìêìêèêëëéèêëêééëëëëëêêêéíîëëëëëëíìíììîç÷ììëëëëëìëìììïîìììíììííìíïìêîïíîðñïïññàñóïïîíîïîîðïíííííìëéëíííìîíìííììííïðñòðïîòñïîììíìííìëìííìíîïðïíìííìîìíîíîîíìíïðîý ëíííîìíìëëëìðîìëëëëêëììêëîììëëëïíëùìììíìëëëêêêëëêëêéììêéêêêêéêëêêêëêêêéêêééèçééèêéæçççèìèççæææåçèçæååèèççéìêêëîðó÷û +17?A:, øóîêæãáÿäÚÚØ××ÖÔÔÓÒÑÐÍÍÌÌËËÈÆÃ»´'4@KRW^dipv}…Œ– ©²¹ÇÈÈÊËËÍÍÎÐÒÑÑÓÔ֨רÚÚàÝßàÜÛÛÜßâã ðãæåäèðéäãääãäåäåæääåååååççèçççççìéèççççéééççéèèéëééìëìéêêêéëëëëêêêëêêììêêëìêëëîììëìëëëíòôñììììîïìïííòùììëëëììììíïíïîëììïîíííôòððïïîíîîñðïñòððóðïîïîïññððïîîïîîìììïîìëíííííòñììîïîïððñðîìíîïíìîíììííîííîïððîíîííïïïîïîïîîïîððìíîîñìííìíìëëîìíîíííìíííîììñììîíîííïý÷íììíîíëëëêëìîíìëëëììììììëêéëëëêëêëëêêëéêéèêëêèçèéèèèèçééçççææçèçççççæèéééêëíîò÷ú $! ýõðëèäãàÝÜÛÛ×ÖÕÕÖÖÕÓÑÐÎÎÍÍÎÏÉÉÆÀ¸.<GOUZagmtz‰“ž¥¯¼¿ÅÉÉÊÍÌÍÏÑÒÑÒÓÓÔÖרØÞÛÝáéÛÜÜÞàßàêñëääæäåáåååãæçìêææææææçæåêñïìçççèëçêçèèèèèéêèèéèéééëêéìëêìêëëíìëìëðòìíìììíïëììëìñíìììííìñôôôíîííïïíïïîúýqóëíííìììììíðííííììîîîíîóòïïîîîîîîñòíïñïïñòñòñðñññò÷õïïïîïîíííîíìîíïïïñðíííîîîòóðïïðíîîìíííîííîíííðóïîîîîîïîïíïïîïïíííîîîðôìîííïìíííëìììííîíììííîìííììíìííìîîííììîîíëêëìêìïìêëëëëìììììëêèêëìëêéêêëëêéìêééééèèêëèéèææçéçççèæææêéæçæåæèèèêìììîóùÿ þû÷òð÷èâáßÝÛÚÚØÖÕÔÔÕÕÓÒÑÐÐÍÑÏÎËÍËÆ½5CLRW^dkqw}…˜¢ª´¾ÂÈÌØÎÌÎÎÏÑÒÒÔÕÔÕרØÙÛÛÝÞðàÜÞßàààßáåçæãåæäåæåäääææåèçæèçæææææçèçççæçéêéçæçèéèèéééêêéèéêééîìëêííëëììëé ëîíëìó÷ïíìííííîîìîïîîíëìîîíííîîîðïüN—÷îðííííííììîîíìíìíííííîíïïîîîïïïïñðîîñîïïòòòðïððñóõõñðîïïððïíîíîîîîîðîííííîîïïïîííðîîíííìîîíìëýíïïðîïïîîïïðíîïóóðîîîïïîîîííííìëëëíïíìëëììëëìííðîííëíìíííììíííîíìîìêêëëëëëëíëêëëëêëëêëêéêêëëêéëêëëêéîëêéçèéèèêéêççæççççæéææåëéåææææèèèêíìììðõùÿ  üøõñîðüéâßÞÛÛÚÚÙØ×ÖÕÔÓÕÖÒÛþúÑÏÎÌÍËÈÂ>HOU[bhov{‚Š“¨°¸¿ÇÍÌÕÍÌÏÐÐÑÒÔÕÔÕרÚÚÛÜÜÞÜÛÚÜßâääßÞáãåæãäåäåçãääæçøææåæææææçæçççèèçèïíéèèçêêèééèéíîêêêèéèéêëëïðíìíìëë÷ùìíðíëîùóëëðíîíîíìîîíìëíîîïíîîîðîðïôìðóõñîîîîíïîîïïíííííìîíííîððîïïïðïïïïïïòòðïðððððññññððòðïñðññðîîíïïññïîîííîïðïñöóîíîíïîîíîîîòðìëòíîððììðïîðîîîðòñïïðîîïîìïñîîîìëìííììîîíííìëìííîííëîîîííîíîîîîííìììììîìíìêëîììëêììíìííëììëëëëëìëìììéëêëêéêêéèéééééçççæçèêèçæçèçæçéçéëìêìîííïòó÷úüþÿþþû÷õñîëêíçãáÞÜÜÚÛÚÚØ××ÔÔÖ×ÕØöÏÎÏÍÔÑËÇDLRW]emsy€†Ž™¦®µ¼ÄÒÌËÌÍÍÏÐÑÒÒÔÔÔÖ×ÙÛÛÜÞÞßâÚÚÜáâäâíéáãæåâäæäçæãåãéçõëåçèèçæççççææçæèçèçèèèêèæççééçðùñêéêììéêêëìí ûîïñîííìììëìíìëëêíîîïîìíííííííîððïïîîïðîïïððïïððñðïîîïïïðïîíîîîííïïïïððóóïïðððïñïïòôñóòðñóóòòñòóóòòóññññññïïððñòòðïïïïðñïñôôñöðîðïïïïòòòðîî÷üòðñîÿO7ôïñðïðñóóñúùïïðñîðîïðïñïïîïîîïïîîííîïñïïîïðíïóñïïïîïððïîîíìíîíîîììîííììîïïíïðìììíëìëìììììììéêëììêêêêêêéêéèèèèèéêêêçæçççééèèëïêêíìíîíïõööøùùù÷õóñïìçñæãáÞÝÜÙÙÙÙØ×ÖÖÕÕÕÔÒØÝÏÏÐÎÖÑÍÊIQW\aiqx~…Œ”Ÿª³ºÁÉÒËËÌÏÏÑÒÓÔÕÕÖ×רÚÛÝÝÝÜë áÛÞàããàçæãäççäææææææçåæçåæææééèèééèèçæôíéëêéééïëëêééééíïéêìíëìíîîñïîü÷öóðïííîîîíîìíïìíôîïîîîïïîîîïïðñññíñððððòòñïòòóñðððïïðððïïïïñïïððïðññûüïððïððññðñññóóôôõõóòòóôôóôôññððððððððïðóñïïïðñðððïññóðïïîîïïñðððîïðñðððë Ì¿öîðïñððòñð÷÷ïðññöúïïïïïîóðîììïííîîîíîîíîïîîîñîíïïîïïîðñðïïïîììíííìëíîíììììíîîíìëëêêëìëìêêëëêëééêéêéèèéëêèèèéççççèèéêèæææçèééçèêéééìëìëïññòóóôôñïîìëìèð åâàßÝÜÙÝÚרר×ÖÕÔÓÒÒÐÏÐÐÏÑÏÓÎNTZ`fmt{ƒŠ’›¶Ò·¿ÅÉÊÊËÍÎáÙÔÔÕÖØÙÙÙØÚÛÜÝáôèûáàßßáààáãååèéæåååæçäåæççæçææçèçæçèèéèéðêèéèèèéìêéèèèèéêéééêëëëëìíïîïó øóòîïñîïîííîíìí%úëíïððîíîïððïîòdùïòððñòððððððððððïïðððððîñðïïññððòúúñðïððñññððïðñòöõóõôòòòòñóòòòõðóòîñîðïïïðïîïïððïïïïïðîïîðîïððïðïððïðïððïïüA@óððïñððòñðòñððððñðïïïîðîððîíìîîîîððîïïîîñðòòðïïðïïïïîîïðöòîìîððíììíîìíîíîîíìëìíìêëëìëëëëìëêéêëëéêêééëíêéçèèèççèèçíêçæææèééêèèéèéëëëìîìíïïïñïíìêèèìëçáâáàßÜÛÙÞÛ××××ÙØÖÖÕÔÓÒÑÑÐÐÑÐÓÐQU\bjpw~…–¤Ìë»ÃÈÊËÊÌÎÏáÙÓÕÕÕØÚÙØØÙÛÜÝãõàÛÞáßßàÞàâååæèéçåæçäêüææçææççææåäéêçèéééééèééçèêéééééèéêééëëìîììíîììòðñóžËëòñïïîîïîñíñîîîñöïíîîîññðïðññî÷ÅñóòñóòñòòñðññïîòôñððòñõðñññððöóñóòòôñññòññòñðññòõõôóòôôòòòòóòñòöòôòðñïïïïïïîððïïïïîîïïððïððïññòñðïïòòïððñññðçëññððñòñðïððñòðïïïðïïïîïîïïñîüîîîïðîíïîîðñðñïïððîïòñïïòæW:ûäîíîïîìíëîììïíîñîíðïîìíìêëììëëêñîìêéëëéêêèééëíèèèíêéêçèéûïæèççççêëèçèçéëéëìëêìííìíììïìæçèèçæáàßÞÜÚÚÚÚÙ×××ÚÚ×ÖÕÕÔÔÓÑÑÑÒÐÐÐUYbiot{‚‰’œ«ÀÃÁËÊÌËÌÔÐÐÏÒÔ×ÙØ×ÙÚÙÙÚÝÞÞàãáàßßßàààâãåååçèèäæçäçõêêæçæçæååäãæèçèèéêéèçèêèéêêèééëêéêêêëëìïìíîíëíïïñöwŽqîòðñóñîðîïïîîíïîîîðïïðòñïïðñòðóøðññññññññðñññðîôüòððñóòñòòðôôñòññòñòòòôôòññóóòõóôôó÷öòòòòóññððóóîðòñðïïïððððïððïððñðñòðòððòðóóñðïòòððððññïðóòðñôôôóñòñðòòñññïððïðñîðòññíñðïððïïïîîððððòïñðïïðñððñí •~ìðîïïííîïïîíïîîîííððíîïîîìììíëëîïíëêêëëëêçèëìêèéêñééìèèçòìèêéèçèéèçèéêêîééìêèììëëëéëðíåååäååáààÞÞÜßÝÛÚÚÚÙÚÙÖÕÕÕÕÔÓÒÒÑÑÏÏÑWaluux†—¢«³¼ÈÑÊËÊÍ×ÒÏÑÒÔÖÚÙÖØÚÛÛÜÜÜÞáààááãâÝàãååäæçåçéæäãäääìíèççèáâååååèêéééêêêéìêêéêëîëéëëêëììííìîíðîììíïïñöEHöòððïïðïïðïîíðïñóñïïïïðððïðôóñóõôôñðõóóôóòñððñòòñðññòñóòøñòóóñòòõõññòôòóôòóóñòõöóòòòóóóóóôóóññòñòõððòññðïððððððððñòñòññóñòòñññññðððïðñññðññððòòñóôóôôóóòñòòòòòððïðïñïððóïîúñððñðïîîîîñïñðñðïðïïîïïðððöóîîîðîïîïôõðîíîííìíîëóýõ÷ìëììêêéìêééêêëëêëìëêééêêêèèèèèèêëéèèéêèççèéêéðééêçèêëêéèèêééîëåääâáãàÞßÞìæÛØÜÛÙØÖÖÖÖÕÔÓÓÒÒÑÒÐÏÐZhp~}|ƒŠ”§°¹ÁÆÊÊËËÎÏÐÐÑÒÕÕÖÖØÙÙÚÛÜÛÜÞáßßàâæéøëáåæåæéêêèåâãäääèéèçççûãæçèéèéìéêêêêìêêéìëïëééêëìëéììêîïíìîðñý÷ðïôõóñïîïïïïîïðððîðññïðððñðïðñðððòòññòòòò÷ôñðððñóóññòñóöóññððóòòòòòöôðòóòóóòóóóòöóòóóòññññòòòòôóòóòóñññðïïððððïðððññðñòñññññòñòòñññððïïïïððòóññññðñññòññôóóóòñññòñðòõòðïñòðïòððîîðððïïïïðïððîðñððïðïîïïïîïððíìððíîïîîííï÷ñííïïîìííëìè¤_êìëêìëêëééèéêïðéêéêéèèèééèéçèéèêêééëêæçèéççèèççèèçèçéççéèèåíûòãããáâíàÝÜÝëèÛÙØØØ×ÕÔÕÕÕÔÔÔÓÒÑÒÑÑÑ^gs†Ž™£­µ¾ÄËÉÊËËÎÏÐÑÓÔÔÕרØÙÚÜÛÜÝãçÞàààáäëš7ééæåäíòêæãäææåæååçèçæÿâèííèæèëéêêêììììêëììëêêêëéòêõêíïíïíïó%õôóññóñðïîîïñïïïïïðôòñðïïðòðïïðñðññòòñôõóóõôõôòòôôññòóóòñòòòñòòôôòòóóññòóôôòóóóôôôõóóòòññóòòòòóòòóôòòññòîïïïðññðððñòòñòóòñíôòòóòòððððñïïïðññòòòðòòöñóòñòòóòòóòðñòòðòööòðññóðéëðñððððïïïïððñðïïðòïðïïïððïðððñðïîïñîïðîïííîï ùëíîîììîîíêôíìêëîëììêëëëêñòêêêêééèèêèíêèççæèççòöèèèççèçççèççææèðíéçåæäããäãáâäöâÝÜÞÙØÙÚÚÙØ××ÖÕÔÕÕÔÕÕÕÖÓÕÖÔbhry~„‹”ž©²ºÄÌÒÊËÌÍÏÎÐÒÔÕÕÖÜÛØØÚÝÞÜÞèòßßàááãçµ»§/Þæåëíæçäæèèíëæåæêéçîéåèîîèççèêëêêìëìììëíëëëêììéûñììéìíîíðìíñøññõùîðñïîïðñððòñïðñòóóòððññððñòòòòñóøóÿõóúüõñòóõôóôòòòóññòóôóòòóóôýùó÷÷ôøúóôõöõõóôóñòóòóôóòññòñòòóóòñðóïñðïðñòñðñòóóñòòò ?ôóôöõññðñðñððñòõôñññðòóÿòóóòóóòòñòòñòóñòö÷óòòòñòðK:üîòñððððððñðññðñññðððñññðððððñïðññððïïïððïîîøñìðïððííëø òìíïíììïììêëêíìëíìíðíìëêçèéèðèèéèêëêêæ+•dìéèéèèæééèæççææãææåååäâââãäëââàáÞæÞÙÚÚØ×ÚÛÖÖÖÕÔÕÙØÛÕÚÙ×ek|‰…†™£­¶¾ÅÊËÍÍÍÏÑÐÑÑÒÔÕ×ÚÚÙÙÚÜÝÝÞßÞáßâãããåÎXÚæäãäççåæçèðìæçíêééæâæèèêêçèéëëëëìëìììììëíîìììíìëîîííííîïîðîððññðõúïðïîñòòïðñññðòóòòóòòñððòóóóóññô÷óöõóõ üñóôõõôóóóòòóòôóóó÷öôø òicîôöøþõöõôôôôôöõõõôóòóóôôóñòóýòûòññòñïðóòñòñòòï#§òòóõòñòòóòðïñòô÷öñòóðñóüòñóôóóóóòóôóóòñóõóóòóòñòðL<üîòòññðïïðññððññòðññðññðïïðððññðòññòïïîððîíîíîíîïððïîíðöñïîîíìììììëêëëëêêìîîíêéèééééîèéèèéïîëéíøûõéçåçæçééææçéçäãäääéêäâäãàâëòëßÛáìÙÛÙØ×ÚÛÖ××ÕÖØÖ×ÔÔØÔ×io‘°™‰•Ÿ©²ºÂÉËÌÏÐÏÏÒÑÓÒÕÖÕíéÙÚÚÜÞßßßßßàáãâããäèêèèçìûäçéçäççååçêôëèêêýöçèêêèêëëêëììííìðíììîðíëïñííïîîïíîïîîðîðððñòóõþúïðððóñððñðñòòòññóõôòñññóóóôóññòôóóôòóúøòóõôòñòóôóòóòóôôôôôóôõôô÷ò`iìóòóõóõóõóôõôóóôôóôôóóôôóòòòóõóòðñòòôòñûüññòóôõðõóòóïñòõôóòïðòòóóñô÷óóññòñóõôòòóòòóóõöôóóóóñïòóôïñññòñññðððïðññðñññðññññññõôòòññòñðïññððïðððïîîïîîîïïïïïîìðûõîííìììëëëëéêëëîîîíëîêéêëèìêéëéèêééèçèèèèçæçæçêêèååçååæçæååæçååâãäáàåñçÞÜèàÜÛÙÙØ×ØØÖ××ÖØÛ×ÙÖ×ÕÔ×kp —‡š¤¯·¾ÄËÌËÍÐÐÓÑÒÖÔÔ×ÓÕÙÚÛÜÝÞÞàâáââáãäææçææåó#âçééåæçäàæéëééêð'ççççéëììëíìíïîëðïíìììììððíîïïðïîïííîíïðïïðòññóòðñðñòðñññòñòñòòóôôòññòóôóòóòòôñóóõôóôõöõôôôôóñòóóôóóôõôôõôóóôóôôóóöÿÿóóòôóóóóóòô÷ôóóòôò ÷óòóõôóóôõóòóòôóûí!(ðôöò÷ùôóóóññòöõòñïðóóòòòó÷÷ôôóòôôôöóòóòòóò÷üøõôóöûóóöñññòòññññòòðñòñññóñóòññòññôôóòññòøÿðòöñððññïïïîððïïîòóîïïïøîíîíìììëëêêêìíííìëêëëêéèéééêìêèçèçæçèçèééæççèçèæåæåææææåããääããäãáââáßÞßÝéàÜÛÛÛÚÙÙÙ××Ö×רØÚÛÞÛ××qv…Œ•žª´»ÄÉËÌÍÎÐÐÔÓÒÓÖØ××ÖØÜÞÞÝÞààààáâââäãæçäåååææååçééëæåçòêééëëéðêèèéëìíîíîíïððîíïïîíìíîíîðîîïðîîðíîíîïðññðòñòóòòñòóðñóóòóòóóóôóóóóôôôõöóóôôôõôóóöö÷ôôö÷õôôôóòôõõôóôõþõõö÷ôôôôõôõöõïð÷ôóôöôõõôòôõóôóô÷ö÷øõôôööôõöõóóó÷òòóôóòõõôôõó÷ôóõööòòóõôòòòòóóòòóôõ÷øóô÷õóùôòóòóôôóö÷õõó÷Góóðóòòòòóòòóòññòòðñðñôôóóññòòñïðòñðððü5LëòóðððñððñïññóòïïññïñòîïöïîííðììëêëëêìíìëëëééìéêèêééëéêéèçççñöêèçèçæèèèæåäåäåæåääääâáâããâããâáâßßÝÝÝÜÚÛÜÛÚÚØ×ØØÙÙÜÛÙÜàÛ×Ösz‡“𤝏¿ÆËÌÌÎÑÐÐÒÒÓÓÕ×ØØØØáìèÝçñàââáãâââäååååååæçæææçêíèèé fïèêêëêéçèêêëìííííïììîîñïîíîîííîîîñòðîîïïïðîîîðððòñðñòòóòòñòóñòôòóóôóóòóòóóóôôôôôóóôôõõôóôôôõôõöõôôôóöùõõôôôõô÷÷õôõõìïþûóôí%¶©ëôóôôóôõõóóôòòòôööõôõõõööôõþöóò ûòóóòòôóóôõôõööõõô÷óòòòóòóôóòòóòòôôõöôôõôôôóóóóóóôôôóóôôóô Ióôòóòòóñòòòòõùõñ÷þòòñòôñòñòòóòððñðñòí<:ìñïðïðñòòñðõôôòïïððñóôñîíîîîíïíìëêëêêëëëêêêèéíëêëêêëëêìëèçèã ,èíéçãþ‡ðååååååæçåååäâáãåãâããáàààÞÝÝÞÝÜÚÛÝÛÚÙרÙÙÛäèÜÜÚÙØ×v}˜ž™Ÿ©²»ÃÉÌËÍÐÏÑÑÒÔÓÔÕÙÙÙÚÛÛÜßàáçàâááãäââããååæåæçççæççèëçééëëéêêêêêëëêëìíîïííîðíììíííîîîîîíîîîððñðïîïðïïïðððòòððñòóóòòòòóóóôóóôõóôóóóôóóõöôôõõõôôööõôöôõõõø÷õóóóðó÷ôõ÷÷ööõõöõõ÷øñóøøôôðŒíôôõôõûööõóôõóÿû÷ôûõ÷õ÷÷ôõô÷õôõôôóôõõõôóöøõõõöõ÷õöõõóòóóóôòóôõõõõöööõùõööööõööõõôôõôóôôóôôîõõôõôóôòñòóòùÿðû óõòòòóòòòñóòðññòóóðþëññðññññññðñöôòðóóïòõôòóïïîïîìîíìëêêêêêééëêééééééëëêêééêéèèèæóüðèêæåäð(ëçäçääåòíäääææâêòâãáááààáÞÞÜÝÜÛÚÜÛÛÛÚÙÙÛÚßðíÜáÛÙ×Ö€€Œ”𥝷¿ÇÌÐÎÎÏÑÑÓÓÔÔÕÖÚÛÚÚÜÝáãÞÞááäâäéæåäåååæåæçéèçèèèêïééèêïêêëëëêëìììííñõðííîïïíîëçïñðïïîíîððïðððïðñðñòñððòòðñòòôôôóóóôôôõõõöøöõöôôôõ÷ø÷öõ÷÷÷õö÷ööõöõþö÷õôóúñôöûþ÷õööööö ú÷õööõõýõööö÷÷øööôôõôöùùø÷öøø÷øö÷öõôóõóú÷ôôõõõöõôõõõõôüôöõööõôõõõöõõöõôôôõõ÷÷ùúøøø÷öõÿúõööôõöôóóôõôõõõóóôóòòóóòóõÿÿòòñóóôòñòòñòòóòðòñòóòòóòòññðòòððïïïðòñðïôõïïòòïðïôïðîëïìëêéêêéêêèééèèéèççêêêéìéèéééççæãæççæãäåèçåãåäääèæääãääàïÿáááááÞàáßÝÞßÜÜÜÜÛÚÚÚÙØÙÚÞááÚÜÚÙÙØ€„Œ”¡«²¼ÄÉÎÐÏÏÏÐÑÒÒÕ×Ö×ÙÙÚÛÝßàààáàâåáãäñæååæçææææçççèèèêðêééêîêììëêêêìíìëëîòðìîîïïïï-ûîôñïïîïñïïððïïðññðòñïðïññòòóóòóôôôôöõöøööú÷õõöõõøþúõ÷÷÷÷÷úûõõöõõöüôöôôóø òõöùûöõööõ÷õÿüøõõõõöõòò÷õö÷øñòùöõõõôõõõõõööö÷öõõõõôóôóõöõôô÷ö÷öôöõóõõõùöôõõôôóõôôóôõôôôõ÷øùúúúúú÷÷ûöôõôõôóòó÷õõöôòóòóòòòóòóóòñññòõòòôñòññòóóóòñòñññòóóñññððôðíííîíîïðððððïîðòïíðôïðîìïîììëêééçèééëêèéèççêíèèìéêêéççççæåæçæäããååäåææåããääåäããâæêâàááàáóåáâàÞÜÜÜÛÛÛÚÚÙÙÚÛÝÝÛÙÛØÙÙÙ‚ˆ›¦´¼¿ÆËÍÎÎÎÎÐÐÑÐÕÖ֨רÙÛÜÜÞßßààáâââæõçäçåéæççææçççèèéêêèéêëêêëëëêêììëëìîíìíïíðîðïžæþóðïïðïïðñðïðñòñóòñðïðñòòóòòôôõ÷õ÷÷÷ûøôöõ÷õööö÷üùõö÷÷ö÷ýüõõõõöõõòõöù÷ôóóóòõõõö÷õôööõ÷ö÷øøöôôõõööõõöö÷ô ÷âòõõöõôõöø÷ö÷öööõõôõóôóöôõõôôõö÷öóò.óõöõööõõôöõööõîIJööö÷öõ÷úýÿûøôõ÷öõôõ 6ôôõõ÷óôóóòóôòóôóõõóóóòõúôóôóôóòõóòôóôóòññòòóòïïññôðîïïïííïññññðïðòôñïñðïòïîùòîííëéèö÷çîòêëêéêéêìéêêéêêèçèèçææææçåãåææçæååååääååääääãâäääãàßåâàåàÝÝÝÜÜÝÜÛÛÛÚÝßãßàÜÜÜÜÚÙ…‹”¢ª¶¿ÂÉÌÌÍÏÒÐÒÒÒÿÚÕ××ÙÙÝÝÜÝÝßßßàááââãææåæäååéèåæççèèèèéëèêíëêéêëêêìêëìëïòíìîïïîððï öî ÷îïððïïðòðððñòñôòóòóóñòòòòóôôöø÷÷ùùúúüøøøöýúõôôõõööõöø÷öööööõõööøù÷õôôõöôõö÷ø÷÷ö÷÷ööö÷ööõõöõööõööööõ ôçôööõöööõõ÷÷÷ö÷öööõõöõôõõööõõøûöò/ôø÷øõööøõö÷øøøöÿýõö÷øùûüþùöõõööôúøýõõöööôöõôóóóöõóóóôôóõöôóôõôùúõôôóñòôóòñóóôóóüöòðñðñòðîíîðððððïïññðïïîðòïîûòðíìëêç çîñêíêéëééèêêëëêéèççççççææçæäååååååääåãããääããáßãåãéæàßÞÞÞÝÞÞÝÜàßÜÛÚÛÛÛÜÜÜÜÜÚÚÝàÚÚ‰›¦°¸ÀÇÌÍÍÎÐÓÔÔÒÕóÚÖ××ÚÚáàÝáàãèâáââããåãçèæåææçååçèèèéèèêíéêëëëëêëìêëëììëììîïîïîíîðòïðð÷óðïððõõððòôñððóòðòòñùþõòòóóõöõõöøúûþþ~)ýöööþ÷÷öö÷÷÷öö÷÷÷÷ö÷÷öö÷õ÷õôöõôõööõ÷öøø÷÷øøöõôöööööùú÷öõöùûô÷þ21ÿ÷ööööööôþÿõ÷øøûöööõöööõõõö÷öõõööõõûÿõööøõööööõöö÷öõóõöö÷ùú 1PQ/þøöôôõööó7ùõöôõööõôôóóòóóòóóóóòòóôóóòôôòôóòòþõ÷õòòóóñûúñîîïðòðîííïðïððïïðñðïîíððïíííïîìëêèúýéêéêêêééèèçèééëêèèëëèçæææçæææääåäåääãäâããããããáßããâæäáâßÞßÞßÞÝÝßÞÛÛÙÚÛÜÝÜÛÜÝÛÛßÝÛÛŒ”Ÿ©³¼ÃÊÌÍÎÎÐÑÕÓÔÕÙ×ÙØØÙÚÞÞÞáááäâáâáäãääåææçìéæææççèéêééëîéééëìéL èìììëëìííííîïîïððððñï÷îðððïïïðððôñññòïïññ÷øóóòòóõöõöøùþ   ýTÿóöø÷øø÷÷øøùùö÷ö÷÷÷õö÷÷öõõôôõööõö÷÷õööù÷öö÷÷ööõöõõööúû÷õööøÿúøòòøù÷öööööõ÷ù÷÷øúÿ÷öõõööôöööööùøöõõõöõõöõö÷÷÷öö÷ö÷öö÷÷÷öö÷øúþ $V¸ÿ©Aúööõôõõö÷üüöøö÷ôööôôõôôõôóóôõôôøùôõóôóõûô#óóóìWDûóôòòôòñôüùòïïïóòðïíïððññððññòóñïîïïôïîìììíîìêííéëìêèêêçéèéèéèêêèèìòòêæçæçææçåææåæãåääãããããããââäãâãâáàßßÞßßÞÞßÞÜÜÛÚÛÜÜÜÛÜßÞÛÚÜÝÚÜŽ™£­¶ÀÇÊÌÎÏÏÐÑÓÓÔÔÓ×ÙØÚâÞÜßÞßàààààââããääãääåçæçëêçèéêêéêìîèéëíêêõììììíîïîííîîîîïïìñððïñïòòñððððððððñðñóÿ ôòñññòòòõöõööøû_ŠHüüûñö÷ö÷÷÷÷øùø÷÷ø÷÷öö÷÷÷ö÷öööõöõö÷÷øùùø÷ùø÷öö÷öööøøö÷÷÷ö÷÷÷÷ö%ýø÷ö÷øø÷÷ø÷÷öøúø÷øùú÷öø÷÷öõö÷ö÷÷øø÷øöõöøùúüú÷ùøö÷÷÷øøøøøøøøøúþZÙWv+ þüøöõõõ÷÷õöõö÷ööõõõöûôôõõõõõôõõù÷÷ôõöõöùöõôôñ15òôòóóòñòñòòðïïòòïïîïññññððððñòóðñïïòóðíìììîîìëëëìëêéêêæééêéêééêééçîóëçèççæåçèçæåæäåääæäãääãáâããââãááßßÞÞÞÝÞßÞÝÜÜÝÜÛÜÜÜÜÞÞÝÜÜÝßÛܨŸª³»ÃÊÌÍÐÒÑÑÒÔÔÔÕÔרÙÛàÞÝßÞÞßáåëéääãääåääåæççæïïçéééêçæìîêéëêìììíííííîðñðîîííïððòðóðñòñðñòóñðú÷ðððñññø‘ ðôõôóóõõõöýÿþW™[×þûöùùøù÷÷øøøøøøøø÷ù÷øøøøøøøúø÷÷÷÷øùûüû÷ø÷øö÷÷ö÷öøüùøø÷öøùøøöûö÷øøùúøùúù÷ùúùùúùùùù÷ùùû÷÷÷÷øúùøùùù÷ úùûüúùøøùø÷ùùùøøøøùúúûÿ 'rÍÑv1úùøöö÷÷øøööö÷÷÷öõõõ÷÷öö÷õö÷õ÷öçµ óöõõöööôööõôõöôóõöôóôóòòòòòóòïîîïðïïðôùöñòòññòóòòòñððññïîììíëêëëëíêéêêéêééëééèèèééèçççæççææåæèçèæääããåèÛÚääèôõãááââáàßßÞÞÞÞÞÞÝÝÝÝÜÜÛÛÛÛÜßÝÛÜÜÝÝÛÛò¯¸ÀÇÌÏÏÑÓÓÓÕÕÕÖ×ÞÝÚÚÚÛÜÝÞßßâåæêéåääåäæçåæçèèæêëèêêä(­ièõîëëëîíííííððíîïðïñôïïðòñðññðñðòóóóóòôõòóòòóóôô ùóôöõóôöööô*üd߈êþúúúùøùøøùøøùøøøùúùøöøùú÷øøùøøø÷÷÷ö÷øúøø÷øö÷ööøö÷úù÷øù÷øùùùøøôøùùùúúøùùùùúúùùùøùúú÷÷øúø÷÷öøùùúùøø÷ÿøøùùùùùøúùøøøúø÷÷øøüþû?V> þù÷÷÷÷÷÷ö÷÷öö÷õõõôöõ÷õôöõõöøõõöõ!0ýöõôõöôöôôõôôôöõóóõóô÷óñòóðñòòññîîîîññý ðôóòòòòòóñòïðïïîíìììêëëêéêêêìëêìêêëéêéèçèéééçæææçææçååèèçããâãäâsyþÞìãàããáááßßßâßßßÞÝÝÝÞÝÝÝÝÜÜÝÞÝÚÝÝÝÝÝÛð ²»ÄËÏÐÐÐÒÒÓÔÔÕ××ßÞÚÙÚÜÝÝÞàáãäââããåäæëçèçææçççæçéêëè]8êðíêêìîìëìííïíìíîïîïðïïïðñïîòñðñððòòññððñóóññóòóòðóôóòõôôõôùö&F÷ü*r–= ýùø÷øø÷øøøøúûö÷øøùùú÷÷öø÷öö÷÷÷öööõö÷÷ö÷øøú÷÷÷÷úø÷÷ööøøøøøùøøù÷ùûøøø÷øøùúûùøùø÷ùøøøø÷÷÷ø÷øøøøøùøøùø÷÷øøøùúúúùùüúùùúúùøùøþûÿýûúø÷÷÷ö÷ööøøöö÷÷÷õöö÷öôöööýúõöøõôø÷öôö÷ööõö÷õöö÷÷ô÷øûõôôóóóóôóýôñðòôóô ïóóòóóòòóôôòòðïïîííëêììëëëêëìêëéêêééééèèèçííèæçèççæçåæåäåæäãäãßòÝèòòããåäâââáààäáßßãáÞÞÝÞÞÞÝÝÝÝÞÝÜÝÞÝßÞÜŸ¯¶¾ÇÎÐÐÐÐÑÒÒÓÕÖÖØØÙÚÛÛÜàãâßàáâáâãääååìæççèççèçæçéêìíëèéìëîëëëììîíííïííííîïïïïïññòñïñññòðñòòññññóõñòñóóóòóóôôóôóõõôöù÷ü  þýúøùùùøúûùùø÷÷÷ùøøùöø÷÷ø÷ö÷øùøö÷÷öö÷øøøøþùøüúûúøøøøøøùùøø÷÷ùøúúøøùøøùúûù÷øûüýûùùúøùøùúúùùùúùùùúûùùúúúúúýüüüüüûüüûüûûúúþþüÿþüüúùùøøùøøø÷÷øøùú÷ø÷÷÷û÷øøùø  ö÷÷÷÷÷ø÷÷ý÷÷÷õ÷øö÷÷ôÿó÷ööôóóôóóòôõòòòóòðòóóóóôôôôööööôúõññïíììììììëëêëìëíêêëêêééêêéçíîèççèçèåçæèåååèæãäåç<KãäââããääããââáàáàààæãÞßßßÞÝÝÝÝÞßßßÝÞÞßßÞ¦±ºÄÌÐÐÑÐÑÓÔÔÕ×ÙרØÚÜÛÜÝâçãàáââãáÛåäæèçæèéèèèèèèéêíêæëëêìíðìììíîîííîîïïïíïòïïððòòóòðñòòòóóòòóòòòóôòòòóõõõóôóôôôö÷ööøûûùûþþýüúùúùùøùûù÷øøøùùúøùûøøøøúø÷øøúù÷úû÷÷øúúþ÷øùùùøùøùùøùùùùùùùøøøùùúùùúùùùúúúüú øùúûùúùûúüøýüûúúûûüûûüýüüþÿüýúþüüýýüüüüûûûýÿþüûý÷úùùùùùùùùøúýûùûøø÷÷øûûøø÷÷ùú1/øùø÷ùøúøù÷÷úøõöøöûü÷õõóóõóòôôõôôõóôõôóôôõöôôöö÷úúøøöõóóóñïðîíîîîííëêëìêíêêêëîìéèéêèèèéèçèèçèçæçäååçåääåçàÝãåääãââãããåâáàâáàáàáßÞßßßÞÝÝßÞßßàÞÝßàààÞ«µ¾ÆÎÒÒÒÒÔÔÕÖÕÑØÞäÞÛÜÜÞßàáááâãâáý/ãåçèæèèêèééèèéêëâUÖLæëììïëíîïîíííîîîîííðóòðððññòññïõ÷óòòòòôõòòóóñóòóô÷ùóôõôôôõõõ÷øöùýùüüüýüûüüùùûúùúûúùøùûúúùùüúùøûúøøøùùøø÷öûü÷ùùúùúøøùøùùùøùùøùúùúúøùùùùúùúûùùùùúúúøPFòøúüúùùúúùúùýúúúûüüûüüüûþþûþ, îõýýûûûûúûúüþýýüüúÿ×Aû÷úùùùùùøúûùùùø÷öøø÷ùøø÷÷÷÷÷  ùø÷÷÷÷÷÷÷û÷ý4 ÷öõõõôôôôõýóóòôóôõ÷óóóôôñòôóòóóöøúþø÷õõðñðïîëìíììêééëëêèêêêèééééççèèéëêçåæçæèåææåäåäääääåãâãäåãââáââãåâáßáàáàßÞÞßßÞÝÝÝÝßßßßÝÝÝÞßàÞݯ¹ÃÄÈÐÒÑÓÖÔÖÕÚúÙäñäÝÜÝàÞÞßààâãâÞ\ãåçäæçççèêêèèèéêàdóSäêìëðììéîíìîðîíïðîíïñðððïðñòññöññòòòóóòñôóòòóòóõôóôóôôõõõõõ÷÷øùøúüûûúúýüúúüúùúúùøúùùøøøùùúøù üøøûüùøøøøøùùøøøùøùù÷÷ùùùùùùøùûüüùùúùùúúøÿøùùùúüüùŠ}ïøøûüþúùúùúúùúýýùúúüýüûûúüüýýûý=X ûüûûûúûüûüüüüûúüúÿÎAûøùùùùùúùùøö÷ùø÷÷øøööøúøùøøù÷ö÷÷øøø÷ùú÷øûøû þ÷÷ööööööõõóóõøôöõôóôòô÷ôôôóóôöøüû÷ôòòððïîííñ÷òéêëìêêìòìêêééíêççéêêèæçççåæææååäæåääääããããääââââââáâáâßàßáàßßßàßÞÞÞÞÞÞààÜÞÞÞÞÝßÞÞ³¼Ã âÏÒÓÓÔÕÔäFÞØÙÚÞÝÝÝÝÞßááâãâãçëçäçèçæçççèéééèèéìñôòêêìëðììéìííïðîíðñðïðòïïðïðððñðûòòñòññòòòôöòúòòôóòñóóöõôóôõõõö÷ööøùùûúùùúúúúùúúÿûùùù÷ 'ùûùúùøùøøùùùøø÷øùùüúøúùøùùùùüúøúúûú÷øúùùùùûûúùùüüûúûúúúúúõöüúúúûûüûüùüûúúûùúúúûûûûûûüüüÿýýýû(ºùýýûûûûüüüûúûúùúúþøúûúüþüùùùúúþûø÷÷÷ùù÷øùúùùùøùùùøøøûùùø÷øö÷÷õ÷ø÷øöõöööôóùþóóõýõõôóóòòóôôôóôõöúÿ'¥ýaüöóòñðîïîìëëëééêéìñêêèééìééêèççççèçåæççæååçãââåäããããâãææäââááâââááâáààááàßßßßßßßâàáççò ëáÞÞÞßßß·À¹ñÊÒÓÕÕÖÖØéÛÜÛÞÝÝÞÝßááãäâãããåêæåçìéæçèèèééêëëëëëìïëêëêîìëììîîîîîíîððððòòòðððïïðñððòóòññòñòòóóñûñóúóôùöôöõõôõôôõööõö÷úøùøùøùûüúùùöøúùùùúøùúùùøý÷üøúúøøø÷øúøùúúýúøùùúúúúùúúûûúúûüûúùùú ÿúùùýýùùûûûûûüûüüýþûûüûúúúúùûûûûûüüûûüþþþýþY? üýýûûûüýýüúüþûúûûüùùûûþÿüûûúûûÿû÷øùÿúøúúùùúúúùøøùúùûÿúøöøøøýûýùøø÷ööö÷öôôóòóõõöúôòôõôôóóóõõó÷ûøûýdÕ•øõòòðùíîíììëêëëëêêìêììíìêêëëêêèèééèæèçæåæåæäæäääåääãòôäãããâáãçâáäãááäãäâáááàßààßìí € ëâàààáà¼ÅÍîöÜÓÒÓÔÔÖÙØÖØÛÚÝÜÜÞÞßâââãããäåäåèæçæåææçèéèèéìïíéíðìíðëëîïëìíîííïïîïñïïïðôôññðìïïòññõôòòóôóôòðñóøûóôøóõùøõôöõõöôõöõö÷÷öùûùùùùùúýúùøT2óùùùúûüøøúýüüûüøýüúùúûúùùùùûúùúûûùùøøûþþûùúûü ùûúûúûúûÿ þúúùüúûüüüýþýüüüýüýþüúúúúûûüýýüýýüýþþþÿùùÿþýýüüýýýûûüýÿüýúüúûûûûúùûýüúûüûýþüùúûúûúúúüüûüûùùúûûúøûúøúùúüûûøøúù÷÷÷÷÷ööõõöõõóñôôôöõôóóôõõôõ÷÷ýU^䮸ôòòðõñíïïñòíëêêêêêééîìéêéééêëêèæèéèèççæååçåææéååæäãäæåãååäáâãæâáááàáçããâààáààáâåòéû^ óæáßßàßÁÈÎÑÒÓÖØÖÖ×רÙÙÚÜÛàÞÞßßááâãâäåææèëíèçéçççèèéèééêëìëêíìôëìíñîíîîîîðïïñðïïïòõñññô ñïòòòöôòóôôõõóòôöõòôôôô÷ôöõôõöõöõõöõö÷÷öùúùúùùùúûùùøf?óúùùúúúúûüýýùúûúüÿúúúüûûûûùúûüýûúüúúûûüýûûúüùúúüýýüüüüüûüûþþüüýýýþýÿüýýýûýýüûüüüþýüþþýþþÿþÿýÿþþþýÿþþýûýýüüüüþûûýÿþýùüûûüúúûûûûüýûúúúûúûúûüúûûþýûûûûûüûûùúúúùúùûøùø÷øûýùöø÷÷ø÷öõõõõõòô÷õõôóòõõôôóôö÷ú"]r,üöôññðîîíííîíìëéêêêêêíêðêèéèèêèèèççêéçææåæææçåèèååäãåääååäâââââãâãââãããàááááááàáïðãùááåèåæåãâáÃËÐÑÒÓÔÕÕÕ×ÚØÙÙÛÛÝÝßàßàáâããããåååæéåæçêéêéééêéêêéìîìëìëôëìëòïîîïîîîïððïïððñòððïôñõóóôóòòóóóôôóóôôôõóóôõ÷ôôôõõõõõôõõö÷õ÷öøøúýúúùúúùùù øúùùøüúùûúùøùùúúþÿýûûûûüúùùúúûüüúüûúúúüüûûûûûüüúúûüúûýûûüýûúüýýüýþþýýüýÿþýýýüüþýþýüýþþýþþÿýþþÿþþÿþýýüüüüûüýýýþûýýýýþûüüûûúúûúûüûûúúüûûúûûûýüýüûúúûüüúúûúùøùùùúùùûûøøúøö÷ö÷øõõõõôõôòó÷ôõóóóõôóôôõúþúüÿþþ÷õòòïñóïìíîíëìêêëìééèêéìèèéèçéèæèçæçååååäæåäææçèæäããäâãäââãäãâáããäãââåâàáàááàààßæõðàìáßäáàèëçãáÈËÐÑÒÓÕÖÕÖØßÙÙÙÝÛÜÝÞßààáââäåãäãæéäæææçêèèèçêéêêéêììêìëêéìììóîíìííîîîïïîðñððñññïîìïøöñóóòññòóóõôóòóóõö÷óóôõôôõõõõôõõõ÷÷õùü÷÷ùûùùøùùøøùúööúùø÷ýùùùùùøúùùüúûûúúùúûúûûúúúüüþüþùûûúûûûûûýþýüüýüýüûûüûúüýþþþþýýýþþþüþþþýýûûûûþýüüüÿÿþýÿÿÿýþüþþýüýýüÿýýýüýÿýÿþ%úüûûûûûûüýüüüüûúüüûûþüýüýþüÿþûüüúûûúúùúùúùúùüýù÷÷öùùööþôõõõööøôöôõõôôõõôôõ÷üùùúûúøöôòòðñóïíïïîíììììîêêêìêééíêéééèéèëîéçæêõæçæåååççæååæçæäãäåãäçãâãäæåãäíåàááåêæàààßÞßàÞßààààãããââÈÏÕÕÒÓÖÖÕÖÙÛÙÚÚßÝÝÞßÞààáâãäääãäåçææåçææééèééèéêêéóùííìììîîñ÷íííîïîïïðò÷õðññòòñïîïðð÷òïñòòòóôóõõòòóóôø÷óôõõôôñô÷öôõõ÷ø÷øúüø÷øø÷ùùøøøøùùúûûùøø ÷úúùùúùùùúúùûûúüûúüûûûûûûýüþü  þúüýþýûüø? üýýþþþþýýýüýþ  ýýþþÿÿÿþþýþþÿþýýüýÿÿÿÿÿÿþýýþþþþþÿþþþþÿýÿ4üüýüüýýûþÿýüýüýýýýýþýýþýûûüüûúúûúûúúúùúûúúúø÷úú÷öþýöõöööüöõõõõõõôôôõö÷øûþùûùöõöõõòòòñððñðîíììíìììëìëíêêêìêëêëéééìóïççìøççæåååæçæåéïëæåãåçåââãæââããããæãáâáååââááàààáÞÞàßàáâàßàâÑÓÓÓÖØÕÕ×ÙÚÙÚÙÞÞÝÝÞßßààâãäääããååæèíóéèèèêëêéèêëêëíðíëíîíîîòñíìïðñððóòøðóóòñððîïðòôñïòóôóôõôôóóôôóôôõøööõôô÷øõõö÷÷øúùøúùûúùùúúùúúùùúûûúùúûûùúûûúúúúûúúûþýüüüüüýüûýþþüýüýþüýüþþüýüýþþþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿþþÿþþþýýýþþþÿÿýþûüüýüþýüüüýýþüüýýþýýþüýýþþýýýýýüûüüûûúúúûúùúùùúúúùø÷÷øö öõööóøõöööôôôóóôôôõõõö÷÷öôöôóóòññðïïïïíìììììíéêëëììêêêéééêëéèéêéçæçêååææåäåæååë:ÝããäåäâáâæããáâáâáâààßááàßßààßâààÞÝàßååàßßàÐÒÒÔÖÖÕ×רÚÚÛÛÞÜÞÞààßááâããååååæåäì(sòéèèéëêêêêêêëììíîïðîíïíñîïïñññòóòñðñòóóóòòññð÷óöñïôõóø÷ôôôóôôõóôõ÷þþ÷öõõ* ó÷÷ö÷ø÷øù÷øúùýûúøùúúûûúùúúúúúúúùúüúúúúùûüûúûüþþüûýýûüÿþüûüûýýýüýüüýýþþýú ÿýýýÿÿýýÿÿÿþÿþÿþÿýÿþýýÿ ÿÿýþÿÿþýýýýýþþþÿþÿþþýýýþüüüýýýþþüûüýþýþýüþýþþþþýþþýþýûýþúûúûûüøúûùùùùýû÷ö÷ø÷ýõõôøõôöõöõôôóôôóóôôõõôóóóõòòññðððïîííìììììíìëêêëéìééêïìéêëéèèæææææææååçææææåääöâãâãâââááââááââââáàáäãàáâàßßßáßßßÞàßæäàààßÒÒÒÕÕÔÖרØÙÙÚÜÝÞßÝàáààáâããããäæåååçïõèçéèëéêéééééêìììíîîîîìíðñðíïðòòððñððððòôòòñðñ ôôñðòóòóôôóóôôóôõõô÷õöö÷öõööö÷ø÷÷ùø÷ùøúùùùøùùúúùùúûûûûøòöúûùùúøùúûúûûûüýýüüýûúþûûüüüÿþýþþþýýýþþþÿþþþÿþþÿÿÿþÿþþþÿÿþÿþÿÿÿÿþýýýÿÿÿþþÿÿÿÿÿýýýýýýýýüýþþüþþýýþÿÿÿþþþÿÿþþýýþÿýûùûþüúúúùúùùúù÷÷÷øøöõööö÷ öõöõõõööôôôõöõôóõôõöôôòòñññðððïíïïìíîíìììëëìêììðìðíêêëêéèçèèççèèçêçèèçææåäâãæåãäããââáâáââäãåââáâåäââááàÞßâàááààÞæâÞããáÔÓÓÕÔß娨ÙÚÚÜâåßßÞáââââããããääåååæéæåèèèéêêìêêìëéëëëìíîïîííîîòïïððïðñòòññòòóõôóñïñùôòòòóóõöõôôõôôöõõööõõôööõöö÷ø÷öøø÷÷÷øù÷ùùùùûüùùùùúúùûüüüù=ùúûúùùüüûúüüüüüþþýýüþþÿþýýþýüÿÿÿþþþÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿþ ÿÿÿþÿÿÿþÿûûýûüüûûúûüûúùùúù÷øø÷öøûõôööùöö÷ööööõ÷øõôóôôõøõôóòòñòñððñðñðíîîíííëììëìí÷ûïìëêêêéêêèèçéëéèèéééèçæèçææåæåååääãããäâäääåæåâãããääâáááààáßàßáàßâãâââáÓÓÕÖÖÜÞÙÙÛÜÜÝßáßàáááâââãääåæååççæèêèèîéêìïñïìíëÿëíîîõðððñïôðïññðññòòñòôõôóôôôóòöõôóô÷öõööõõöõö÷øöø÷ö÷ö÷÷÷ø÷ùûù÷úûøøøøùúùúûýúùúûúúûûûúûûûö$x=úýýý þýþþüüùúýüþÿþÿýþÿÿþýÿýýþÿÿ(ÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýüýüûüýýýýüýþüûûúùøø÷÷ö÷ù÷÷ù÷÷öö÷öö÷øöõôõöóòóóîðòóòóðñðïðñðóòîíëìíìëëëêêìôõíëêéêêéêêèççéêççèèééçççèæåçèæåæåãåäãââáåäããäãâäãáãäãâááàààààààáààáâááâÓÓÕ××רÚÚÛÜÝÞÞààááâáäãâäåææææçççèèèéêëêëìëëðîííððíîîïïóðññññõñðñòòòòòóóòòóóóôõôõòõôõøôõõöööõööööõö÷ø÷ö÷÷õöø÷÷ùøøø÷øøøøùùûúúûýúûûüüûûüüüüûüûýþûh üüþüûýþþýþþþþüýþþþþþÿÿÿÿÿJiÿÿÿ ÿþÿÿÿÿÿþþþþþüÿýûþþüýüüûùøùúüø÷ø÷ö÷üøõö÷õõöøøöõôõöôóôùýòñòñððõóñðîóôîìëëëìëëëêêëêéêëëééêéèéêèèèççèççèèæçççæäëëææååäåäãåéáãâââããâãâåäâääáààáààâááßáààáââãÔÕÙÚ××ÙÚÚÛÜÞÞÞßááâàáãâãååççåææææçççèêèéêëêíîìëîíëìíîîïïðððððôðòòñòññ÷þøÿóôôõûöóôöóó÷ôõöõööööö÷øõøýõ÷õõúööøøùùø÷÷÷øøøøùùûùúúûüûûüüûüüûûûüýþýúüüû‡ úüüü&úþþþýþþýþýýþþýþÿÿÿÿÿþþÿÿ"À>ÿ  ÿÿþýýüüýüþýýþüýýýüûúùú÷ùùøøø÷øøøúøóò÷øööõõõôö÷Zòñññðð ÿòôôïíïîííëíëìëêìëêëëìëëêééèéëèéééèéíéçèçççççæêéæçåæåäääæèãäâããåäããâéçâãâââââáãâââáââââããâÕÖÙÙרÙÚÙÚÜÝÞÞÞáâááâââããäåååæææçèèèéëêêéêêìíìíîîííîîîïïñðïñðóòòñòòòòóõò*ôóõö÷õööôóö÷÷÷÷ö÷÷ø÷ö÷øõ÷öø÷÷üù÷÷øøùúùùøøø÷ùúúûþúûûýüüüüüüüüýüûüüýþýýÿÿþõýýýüýýûýÿþþÿþþÿÿýþþþþÿ0°ñÿ  = ÿþþÿÿþþÿÿÿÿüüýûûûù÷øùøùøüùøùüö÷÷÷÷öõóùôòóòóòñõûõîððïîììíîìëìíëìììëëêììéêêééêêçéîëèèèçèçéèæçèçæèæäåääåääããææääããæåããââããááãáââáâáãããããÖ×רÚÚÚÛÛÜÞÞààáâãâãääåäääååçèæçéêéèêëëìëìïîîðïîîïïïïðòòñððñòôóóòóóóóôôôü÷õö÷÷õ÷öööÿ üö÷÷øøùúùùùøúûøùù-ùüûúûúúùùùùúúúúú ûûýûýýýýüûýþýüüüýþþÿÿþÿÿÿÿÿÿÿÿÿÿþþÿ  ÿýþÿÿþþÿþþþþýÿÿúùúùùøùøøûûøøóiÞiõ÷öõöö÷õóòñòôòóñóòññðïòóðîîîîíííïëëêëêëëìêêêîíèêêêéêêéééèèèçççäåææèéâÜåèååäãäãâæãååââããââááááââßàááàâáàáâââããרÙÚÛÜÜÜÝÞßàâááâäæåäåææååææèéèéêëêëíêëëìíïïíïîíîððïïðòôðòñññõôòõôóôóôôôóóõõ÷øö÷öö÷üúýù÷øøøøùùø÷øùùøùùùûúúýûúúúùøøùùùûüúùúúüúüüûûûûûüüûüûüüüýýýÿþþþþÿýþÿþþÿþþÿÿþÿÿÿþÿ#  ý*jÿþþþÿÿÿþýýüüûùúúúøûøøüù÷ùûw&Œéõôõõöøôóôòóòðñòòòòññððñðííííììëììëëêêêëëêêêêéèéëèéëêêèèçèçççèú÷äçâ4)äçåãâãâäçããäâàâãâáàâèéâáßáááßââáããâââãÖרÙÚÛÜÜÝÞÞßáááââæåãääååæçææéìééìëëìêëëëììíííííðîêððïðòñðððïòõòóóóóóôôôõôôôöööúöö÷þø÷÷øþÿù÷÷ö÷÷÷øöøùøøùøùùøùøøùùùùûú÷øùúüúùøûùúüûúúûûüüüûûþþýýþÿýýþþþþþþþÿÿþÿþþÿÿÿÿÿÿÿ  !     %!/ þýýþûüûûúúùúüúùùþÿú÷öõôõõøÿüùóóôòúõòòòóòðïïîíîîíëëìïììëêëëêììêêêèêìêééééèééèèçèèSáèÜ}sßæåäããããäããßJ&éáâáàãíîâáßáááááäãåæäãâãÕØÙÙÙÚÜÜÝÞÞßßáâáâáäääääæçæææéìééìëêëëëìëìììíîííð;f òñññððððññõóñóôòôõôôöõôôö÷øùö÷÷ùøùùùýüþýùøùøøùùúøùøøøùúûùùùùûüûúûýýúûûüýýüûûûüýüûûüýýýýÿþþÿÿÿÿÿÿþÿÿÿÿþþÿþÿþ                     ÿÿþüþþüúùûùùøöøúúúùø÷öö÷öõöûøóõôóùôóóóóñðïïïîíìíëììïëíìëìëêêêêêîîèéêééééèééçéééèî+ ãèå#h*ãååæäããââäãÞ^6êàâáàâååâààáááââäãååäããäÖØÚÚÚÛÜÝÞßßààããâóìãåæææææèééçééêêéêêëëìíìíîïíîñ>pôðððïðññññõóõõôòóôôôõ÷õõö÷øø÷øøùøùùúøúûúùúûùøùúúøøùøùüúúúúûûýýûûû øûüúûüüúúûýûûûûûûýýýþþÿþ&$# ÿÿþÿÿÿÿ                                             ÿþýþûúùùùúø÷øøøø÷÷÷ù&ôöõôõõõõóóññòõóòñððððííîëìëíìëíìëëììëëëéþêêêééêëèçèèéêéêçãæèçéïëáæååååäãâãåãåàÞàââáââáàààààáßáãäãäãâããäרÙÚÜÝÝÞßßààáâáãþñãåæéèææèêêèééììëêëííñîîîîîïñòýÿóððññññøòòöó÷öýùôôõöööööõø÷ùùøúûùúúûûúúúúúúúùúúúùüúúùûûúûûüýýüúúûýÿûûüýüþýüùK#üüüüýþþýýýþÿÿÿ>ÿ6ú                                                          ÿþþýýýûúúøùøø÷ö÷ö÷÷ö÷ø ôôôóóóòóòòòòðòóòøöððîíðòîííìëëííëìììëêñðóÿøíêêèéêéèèéëèçëéèèèçççååæååæèæâãäääããâáåäáâááààáàßáìááâãàáèæãåØÙÚÛÝÞÞÞÞÞááâââãäãæèææëéæçèçèééêìíìììíîñîîííìïðððïñññòõñðñ÷ôòõôöôýúóôö÷õö÷÷öùøúùÿûúùúúûûùøýÿùùùùúúúúúúùúûûüûûûúûûùûùûûüúýûûûø2ÿûüüýþüüüýýýÿÿ %! ÿÿÿÿÿ                  @7                         !G               ÿþüûúúûùøùúøø÷ö÷÷÷ùø÷÷õõöôôôôôòóóöõóôõóòòðïñóôðîïíìííììííììëñòëíñîëëéëêêéêéìêèîðëçêéèèçæææååêæããåãåãâãâêçàáâââáàáàäöâáâàïïêåæ×ÚÛÜÝÝÞÞÝÞßáâäâãåãææææçççèççèèéëééëëêëìëííììíîïïïïðñññóñïñïòñõôôóôôôôööõö÷÷ø÷ùùøþûûùùüüúúúüÿýùùúúûþúúùûúûúûüúúûúûûúûýþúüüúûûûûÿýüüýýýýýýýþýÿÿÿþþ                 ]S                 !E             þüüüûúûúúùøøøö÷÷öøøõõöôóõóõóóôòóööôôôòòòñïîîíîðíîðíììííîïìîîíìëìíëêêìêìêêéèêéîöíçììçèéæäååäççääãääâááâããááâãåáßßáâáãââßüèåååØÙÚÞáÝÞÞßààáâãããéåååæåæçççèééèéêêëëêëìíìííííîïïïïðññóññòññðôòöõôôóóôõöõõö÷øøøøøøùúüüûüüüüüúúûûúûýûúûýúûûùûúüüüûûþþûûüýüüüþýüÿûûüýýýýýýýþÿÿÿÿ                                                 ÿýýýüûüûúûúøùùø÷øø÷õõôôõôóóôôõôôõõõóóóóñðññóòðòîíðïíííîíìíììîíìëìëëêêëñéëìêêéèéêéééêéèçååæååæåååçãââááââäãàáãááàââãæããââçæåææÙÚÜÞàÞÞáßàâââãåçéæåæçççççèéèéêéêììíìëìîííîîîïïïðñòóóôõóòòòò÷ôôõóóóôöøöõ÷÷÷øøøøùøúúüýûúüüüüûüüüûûûûûüüûúúûûûüüüüüýýûüýýüýýýþÿþþÿþýþþýýýýþÿ ÿÿ                     ÿýþýýûüûüúøùøøøøøöõöøõôôôóõõõôôóööôóóòòññòññðððîïíìïîíìíííîíìëëëëìëêëëééìêêéèééééêéèèèçææçæçæååæãäãââââááàßãéãáãâäåäæããäçêéçÙÛÜÜÞßÞààâæáãâåèèèçêêéçæçèéééëêêîëíîìíìíïíïïîîïñòóôôóöôóòòòóôôõþùóôøøõö÷÷÷ùúûùùøúúûüýüýüýüûýýýüüüûûüüýþüýüúûûûüüüûüûüüüýýþýýþýýÿýýýÿÿþþýþÿÿ            ?B       ÿÿþýûüüúúùøøùøø÷÷ö÷ùõöõöôõööõôôö÷öóòòòðòóðïïïðïîìíïîìîîìíîîìêìíìììëëëëëéêëêèéêéééèèçççææçèèåäãâãääãâââáãäàëúßàáâãäçæãääåçèåÛÜÝÝßåèßàãããåäãååèêééèêëéçêëééëëíëìííììíîîðïïïðñòòóóòòôóòóôôôóõ ÿóôõõõööööùûþùùÿûûûýÿþÿþþýüüýüüüüýüýüþÿüþûüüúúüýüüüüüüýþýþýýüýýýýÿþþÿþþþÿÿÿýþ  $:            Š7Ü@           ýþýüûûùøùùùùøøøö÷ö÷ööõö÷õôôôôöõóòóòññññïðððïïîíïîííîííïïíììííìíëëìðììëììêêêéêéèèéèçæèéèçääåãäæãââããâæçããàááâççäåãääåååçèÜÝÝÞßãæàâââãåääåæêéèèéî æëìêêêëëìíòïíîîîïðððððñòóòòóôôóõôö÷õô÷ôôööõõö÷ö÷øùúûúüþýÿÿþý þýýþýýüýýþýüüûûüýûúüýýýýüýýþÿþþþþýþþýþÿÿÿÿ( â3              /!"(âE               ÿþþüýüùøùùøøø÷÷øùøøööôööõóôõóôôòóóòòòñòóñïïïïïîîîîíííííííííîîêëëííííëìììêëèù÷çèéèèèèçççåäãäåäååããããââáâãàáááåöáããããäææéêÜÝÞßàààáäâââääæåççúðççëÿÿïòíëîëìëíììíïïîïïïðððñòòòóòóõóóõõô÷øõøõô÷øöö÷ö÷úùùûûúûýþÿ þÿþýÿþþýþþþþýüüüüüûûþýþýþÿþÿÿÿÿþþÿÿÿ!  ‚C                        ýýúüûùùøøøø÷ö÷ùú÷÷öõôõõõôóôóôõóóòòòñï'ðïñðîîïíîíëþëííìííììêêìïêëîëëîìëìêîïêêéèèèèæåéæääãåâèêçåäããâááàáâãâââãâãäååìëèèÝÝáãàâãæäâãååæ îéçéèèèêëêîòíñþííìîîíïðòðîðððññòòòôóóôõôó÷úöõõôù÷õõõö÷øøøúûúüûúüýÿÿýþþþþþÿÿÿþþüüýûûûþüýþþÿþþÿþþþýýþþÿÿ                           þýûúúùùùùù÷÷øøö÷÷öõöõöõòóõõõôóòòñòðüðïñðñïîîîíìúøïïïîîíìêêêëîëííëíòïìëëëëìêéêëéêæçéæäæäæêåçóìããââããáàáãçåâåããèôéçéççÝÞßàààáããâãäãäìææçççççèçèêëêëìêêîñ ÷íõõóððïðòññòóòóõóóôõúóõô÷÷õööö÷ö÷÷ùúúúúúûþýþþþÿÿÿþþþþþÿþÿüüüüûüüýÿÿúõÿþÿýþþüüýýýþÿ            /""!          þýûúúúùùø÷ø÷÷÷÷ööõöõõöôóõõóòóóòñòñðíñðððõðïîîííìíîîïîíííëëíëììííìîïîëëïîêêééêêééæèçæçåææêåäçäååââàî$àæëääãããäèçåççæÜÞààââãâââãããåäæäéêèèééèèéëêèëëìîðòøîðîïôñïïðñññôôôõóôõöûõõõöùù÷ö÷÷ö÷øøùúûúúûþÿÿÿÿÿÿÿýûýÿþýýÿû÷üû9† ÿÿÿÿþýýþ       "  !!!! !#!    !   5       +n¹O ÿþûúùùøùù÷ùø÷÷÷õõõööôöõõõôóóóóóòòòõðððððòðîíîííííííîîíîííìïíìììíìììîíëïîììêêéèèéçççæèæçäææåãäæåäåàñM~âéäãæãâââååæææèÜßáááåèåãäâãåäæç ôçéééêéééé9èëìðôîïìíïïïïðññòôõôôõôóôôôõøóõõø÷ù÷öööø÷÷øùûûüüýüþþÿÿÿþÿþýÿþþþú'Fò{ÿþÿÿÿ     ‰îZ !'(  "+' !""#$%##!"#"""#   "!"#  !!!  "'              ?AAÎþþýýûùùùùúù÷øø÷÷÷ööö÷÷ôôýûöôõõóóóóñòôñññðñïîîîöñîîïïííîîîîîîîíììëìíëëíìëììëëêééèçéççæçææåääææäåêèääãæ÷ãâááâãâ íãäåæçèÝÞßààäéäããâãæèæçþîæèèèèéééêèëìîîõîùðíîðïïòòòóôôôóóõôóôöôöõõ÷÷ùøøùùúú÷øùùýýÿÿ    ÿÿþòtÊJúÿÿÿ        “~A0!!(%"(& "$%#"#$%$$'%$%##$$$" ! !""""#$$$"#"               CDÏ ÿþþüûúúúúùùù÷ø÷øöõöööö÷õüöôõôóòóóñððóóñòóòîîïöñïïïîíîîíìíîïííììììîëëìììëìêåèëééèêèçæèæçååæååäåæåäãããßÞäââáãåâþëâþöèççÞÞßááâäãäåîææçæèéççéééèééêêìïêëñìïí&÷íïðððððòóóôôôóôõõóôôôùöõöúú÷úûøø÷øùø þÿ$:5 ÿÿÿÿÿÿÿ ÿ          9S:,%#+5*"#$!"$#$%%&!Hi,%%&&$$$##!"  "##$%&&&%&%#""!#!                "Jd*ÿþýüúúûûúûúøø÷ø÷öõ÷ö÷ø÷öõõõõóóóòòòñòòòñòõòððïïïïïîíîïïîìîíîííëìíìíìììííëë" éêëêëêèæèçæææçççåååäãäææäååâãáââäçåäùôèéëÞßâãâââääæìæååæìçæçèèéêêëêêêêìëîöìíîÿñîïðïïïïòôòóóôøõõôõôöõõúöõüû÷÷øøøøùøúúÿþ  ¬12  ÿÿÿÿÿÿ            !+cF'#%$*,(&&&')%Jt;&(('&&%&&"($!$%&'((')(&%%%%"             ÿýûûüüûúúùøøù÷÷÷ö÷ö÷ööõ÷öõõôõõòóòòóòðòò÷ñòññïîïïîîíîïïîîìííîììììëííììììæ+¹‰áëëêéééççæçæçéèæææåæçæåäãäãâãâããäãäåèèæëìßàáâáâãäãåäæååæìèèèæçèéêêìíëëíîíëíîîìôñïðîïðñóóöøóõøõôôøôôõööûøøøùúúúûúüüüþ  ‡Ï8 ÿZÿÿÿÿ          !%4$)D6*''$TH%)))*@O80***('''(&$%$%'&'())+.))'&'&##!                 þýüþùøùø÷úùøøøø÷õööö÷öõõõõõôóóõóóòóñöòñððîîïïïííîîïïïìííîíìëììííëìììès[åëêééèçèèæçåæêçäæçåèçããâããâãæâäâäæåäåäåèéààááâåääãåæççèçéèèèèééêêëëìëëìëîìîññïöñðððñòòòóøûô÷üøõõ÷õú÷üûúúùùùúúúüýþÿÿ g¸Š#  *             !"!!  #*2&&%)+)*(?T:)+,-.77(+,,,*))))'&&'))()++****+*()'$$#             ÿþýþ÷øùøø÷÷øù÷øü÷ö÷úöõõõõóôöòòõóóóóòðñðïïïîîííïðïïïîîììííïíëìììëëíìëìêáâíêêééçæèéçæææçêçææäçïîãããâââåâãáãååææææçéààáâãäääããææçèèçèèéééêêëììëëíôüïðîðïîðñððñññòòñóöõ÷û÷õõõõþ÷÷øùúúùøøúúü ýÿÿÿ   Hq<                   !%$!"!#')&*'(**,,,*(,.../0.+-,..-.-,+*+**)++*+-+***+,+)+)()&                 ýÿÿýúúúøùúøø÷ö÷÷÷ø÷öõöøõõõôõôóòòóóóòñðòòñððððîïîìôõïïîïíììîîïîíìîíìëìëëêëëëìëêêéççèèçèççåíëæåååíïåääãââäãâããääæçççêìßààâãããäçõåçæèèççéêèèéíìëíìëì<ìðíîîîîñôöôòñòòóóòõõöõõö÷ôø÷ö÷øûúøùùúúüýÿÿÿ                    "%##%#&()*++*-,11000210122123.0//10.----.,,-,--,,,,,,,-+)))&"!          ýýúúùùùúùùøøø÷øùùø÷÷ùõõö÷÷õöõôóóóòóòòôòñòóòòñðïóóðïîïññîïîîîîìðïîíììëëëëìîòëìêêèèèèéæææééæåååäåççääãääãâãçåææçèêììàááâåçâãì åçèêèèçééìëêííëëìíìÿ'ìîíîîïðòõúøòðòôöôòôõôôõö÷ýõ÷øøø÷ûúøúûüüûüýÿ                  !""%%$%%&)+.-+--2/24545775665445122142200000//////.-.---,,,,,*(%#               ýþüüûüüûúûûúùù÷ù÷÷öøúø÷÷öø÷ö÷ôóóôôòòòóñ÷ôóòòòðððððïïîñøíïíîììíìîîíìììëììëîóíëêëêèéééççæåææåäååäíóâäåæääããçäæåæèêëëáâããåçääìøæçèèééçééííëëëììíîíëèïðñðñïñòóøöñóõõõôôôôôõööö û÷øøùùùüýûüüüüþþ                      " ""#$%%%'('),37.//2:2246679;:9877776664645544312211000//.0..7L..**'$#!              ÿþþþþûüûúúúùùýùûûüùû÷ø÷õø÷÷ù÷÷ùøóòòóõòòòóòò÷õòòñññððñðïïîïîíïíîííìíîîíìììëëîððëëìëëéééééçéçææææææåäìòãåäåääãååáäæçèéêëâãääääæååäçèèèéééééêëëëëííìííîíïñòðñïïññóòñ÷ø÷÷ôôóôôö÷öõôöùø÷øøøüüûüüüýþþ     1                 !$$$%&&'())*-48141593467889<<<<<<:;;<:9989:86697454211200100<b0/-+)&&#              (³Bÿÿÿýüüüüûûûúùúúùùøûüøøùùùùù÷÷øø÷ø÷ôôóóôõóóòóóòòñòòðïñññðïðïîñðòîìíïîíïîíîìííëêí÷ùëëëëêééèéèèèçææææææååäãååäääääååõìèêëééëââáâäåæååææççèèçêêéêëëêéìíìííííîïïðïðððññòòõöøøóøüô÷ùõõööûù÷øøøýýúûûýþýþ    ’^               !)#"!!$%$&'%')((+--10162433689:;==>@?@B@<>?==<===;::=;8865323211214D0..,)*'$!             K ÿÿþþýüüûûûúúúùùùûùúøøùúø÷÷ööúøôúûóôôñóõñóòññòðñòñðîðñðïðïîïïïïðïîîïïîíííííííìëìíìëêëêëéèèèèææååæååææççäæçìåääääãýçïîêêëãáâäæêéèèçæèéèèèééêêëìêêëíîíîííîïïñðññðñòòóóóôôóùýõúúôóõöùûùøö÷þþúúûýýýÿ      E0                 !!###$%%'((()**-0/1.24456679:>@BAABBBEF@@@B?>?>?@?>=<<<97655432341/1/--++(%"            ÿÿýûúúûúúûüûùúüûúúùùûøøøø÷ûùöøùöôõõùùöóôóôóññòóòòñññðððïîîîïðñòïïïîïîïïííííëìíêëëéêìëêéèççççææææçèðôäåçðääæäæã ùèíìêììâáâäåêôïåçæèèçèèìêéêêëêêìïðìíííïðïòððôõóòóóôòñôôôõöøù÷ø øö÷þüþúýüüýþþÿ #%%"                            +8  " ! !!#$*'%%%())++,--.4513876789;<<GDCDDEFGEDDCCDACCABDBAB?>>;9867554553340//.,(%"!            ÿÿÿü  øúûüýüýúþ  ûùùøø÷÷ö÷ø÷÷÷öõõöøýööõõôóññññïðññððððïðïíïððñîîïïïîïïîíììììëëëììéêêëéêéèçççååååææôüäåääääéäåæäæéééêíîãâãäåæåèæèçèêéèêíìëíííììïïîïîìðîññðððøúôòóóòñôõ÷ùø÷øüûøøþý(ùþÿýþþ  !"+4651+(                              |¹  #" !!!#&&)&''()*/0--.09?16@876:;>@>FDCDEFIJGGIGFDEHHDCEEDDB?><<<9765464365211.-)%#!#            ÿýÿÿýY1õûüýüòaDtþüûúøù÷÷øø÷÷øööõôöööõôôöôîòòññññññññðññðîíðïðñíîïïíîïîíííììììëëëìêëëêëëëéèçæçççææçæåæççåäæçäåççèéëëëëìäããääæçæçéèèèèêèéêíîëëìîðííñïòïïïñðïðñóòñì@Qíôôõõõöõöô÷ùøûúýúþþüþÿÿ  (;HR]WK?/"                            % ;#!# !'+"&&$$%#&%&())*+**,../01<F4788<;<?@AA@BEGIJKKIKMJFGHKIIFGGGEEC@>AIE789<65574322/,)&%""        ÿþÿ#úüüüûõJlùúúûûùø÷ø÷÷øøø÷÷öôôõõõõôõŽ íñðññðïññïïðñïïïñïîïîïïííïîîìëììíïðêëìêëëéêíêéèèéèæææææåæéçäæäæäåçççèéêêëëìâçêääêöëèèçêçééêêëëëììììííê÷K‰íðïïóóñðñòòôôðñ÷öööõöö÷ö÷÷øùøøøùúûþþüþÿ  !1Y‡¾äÑ”W7(                          ""  "##$)2&%&'(((),0-,-/0/002336888::>B@ABCDEGIJKKKKKKHIKMLKLJJHHGEC@EQL;<AN87744211.,*&%$         øúþýüûüþ +ÿûûúùùø÷ø÷÷øøøø÷öõôõõööõõjîòóóóñðóóðïñóòððòðîïïððïïïïïîîííììììëìëëêêêîëêêèééçèèçèææçååçåæççëèêëëíììììàçäæçèçéðëëêèïíìììëìííïïîîïïðõóñðóòòóóôõöõóõööööøøøøøøùùùúúüüýþÿþýýÿ    "$+@pþ¸½mB0#   Zzû       Ýà1 ³Y“            (!##$$$%(+*(*),,-+,,31,MI/333468;::=<=>@CCDGHIKLKLNLKLKKMMNOOOMKJGHHFEB><>BJ:86554100,+'$#!       þþýþýûüÿûôøþûýúøùù÷øøøøøøø÷ööõõô÷õöööùñóóòññññòñññòðñóòòððïððððïïïîîíììëëëìëëëëìêêéêèèééèèêéææèçææåèçççèêîðñòóóðíâèååçèèëîíëëëëëëììíïïîíîîïóþïðòòóòòõøóóõöôõöõ÷øúøúøùùúûúýüþýýþþ   $1L‡£ tAG1$   Rp n      3ABùäà              1!#%&'((''((,*+*,,+02//<A;6288479:;<<=?BBCFGHHJLKLMJIKNNMNPQPPOPOKJHFE@Yk>AF;98553116+('""! #        ÿþýþüúûûúúûúúûù÷÷úúùøøøø÷øø÷÷öôóöøöõõöôñôòñððïóôññððïðòïîïîïððïðîíîíìíìëëìëìêìêêéêééèêêèççèëëæåæèèçæåååäèðòóóñøõîîäôüææçéëëéêëôïìêëííííììíííïðñóððòòôóóôöôôôôôôööõö÷÷ùùùùùúýûúüüüýþý   #2L—ŽÓ?#wC.#      ý }       z‚#e¸R        ! '&$$%&'')*(((,,+,---10/002/UŒh687:===ABABFFFEJKJKKLKJINQOORQQRPQQQMJHFE;—Ú:Mi:;9553101.*'$#%$              þþýüúûýüúúúûùùøü÷úùøøøøøøøøù÷öõôöúöôõóóòóòðïïïðòðïøöðððîïîîïðïðïïîìììììììëìëëêëéééèèééèèèééèçæçççåççåæççìêéêéøúðñåççææçéêéêêëöïëìëììíííìíîíïñððòóðóóôöòóóôôõõóõ÷ø÷÷öøùøøúúþûúûüüüüÿÿýþÿ   #/E€ºåf½]8+"         û                    #$$$%&()+1)*,,,.-.//0020250Cj`7:9;?>AABACFGEEJKJIJHFIMQRRSTSRSRQORQLKIGGHFA?<<?<96510/,+)&$+)               ÿýýýûúüþýüûûûùûùúùøøùøøøøøùøööõõõ÷õôôóóòñðïïñðïòñïÿùññïïððïñöòñóóøøöïëíëëëëéîêéêèèêéèééééèçèèæçåëççèèéëéêëê÷øïîæååççéíêêìêëíëëìêêìíííííïîîïðïññóòòøñûùõõôõööøøöøùøùùùýûúûþþþÿÿ );_†«²iG/$          :J           % !!!"$%&&),++,),---.../001223547>>989C_ABCCCDJJIHIJJKIGKRTTUUVUUTTVTSRRRPLIHFDCAA<?<96631/.,)('%!             ÿþþýüüûûûüüûûùùûùûúùøúø÷÷÷øøöõõöùõôôôöõôóñðððððñóòì(tþïòôïîòñðôññðø28 ïîììììêëêðêéëëêééèéèéêéçèèèæçëçèééêêêëëëíîîîåæççèêëêêêêëëëíëòëìíïîîîîðððñóññòøøôõõõõõõö÷÷÷ùüøùùøùúüþýýýüþþýÿ &2:FSUJ;3)                #5              -( ""!"%%')16,,,,,./---.158323335668::=?FBCCDEGHIIGJKIHHJPSUUX[WVUSTTVUTRSQLKJIIEA?><;7642/.+),*'$                 þþýýýüûúúûûúûþúúùüúûúøùùø÷÷÷ö÷õô÷ûõöôô÷õôõòñòóñïñóòð=øïóõðïòòððñðïô ûìííììëêìëëêêëëëêééèèèééééééçèèèçéèêêêêëëëííîäåæççééééêêêìëíëûûïëìðóïïðïððóòôðñññññ÷ûöôõõ÷÷÷øùùýùøùûüþ˜Eùûýþþ  $'-22.*'!           "                !"""$%%&).0,-.-,/--//14665455689:;;=?ABCFEFGJJLGEGIKMNQVWZZ[_Z\WVUTUUXWSSQNNKIGEBA?<;9410.,+,+(&"          ÿýþýûüûûûùûúøûúúüúùøúùøøøø÷öõö÷õ÷ôóõ÷ôòñòóòññòòóðéðñòñòòññðïððñðìëííîîíììëêìëëéèéèöïçééèééèèèéêéñèççèçééêêêëíîîíãìñççéëéèêêêëëííîíìììîðïîðïðñóôõññóòôöúúöõ÷÷÷÷ùüýøùúúýW¦ üþþþÿ  !#""                             !  "#""**')++*,..-,--./0246666877;<=>=@CCEEEHIIKLMMIHGLSUUVZ]`b_]\[YWUUUVUSRQOOOKIGEA@=<;4321.,*((&" (0        ÿþýüüüüûúúúüúùüýùüùøøüÿüúúù÷ö÷÷ôõôóóôöñòòòñòòòñòóóññòòñòóñññðïññðïîîîîíîîííëììëêéééñíèééééèèèçééèìèèçæéèéëêëìíîïïäéíççéëéëëìëëëííííííííïøúîððñòòûûõòóôóóò  ùö÷öøøùýùùúüúý>ÿÿýýÿÿ                                 P{3!+" !#"#%*)')**,,-./-,/0*03469887gf8?ABCEJJIKLNLLONNPQMLRVZ[YZ`de`_^[ZYWTTVUTTRPNOKLIDCC@=;7430-+*((&$!  «ÊD        ÿþþýýýýüûûüûûúûüüøùùøùýÿûüúùøù÷ôöôôôõóóòóôóòòóòòòóóòòóòòñòòòñ üññïïïïîííîîìììììêëêêêééèçèëëééèçèèèéèèçèÜçééêìíîîïñääåçæçêíìììëìììíîîïîîîïóõïðññóóõóôôõóòòôÿÿøöûÿúùøúùúùûûüýôøýüÿýþÿÿ                                 ¦ ^ $/' !"#"#&%%&&(*,,,.////2cA5889;;:WX=BFHIJPPORSURTRRSSUSTZ]]^``cfedb_^\\YVUUSSSSVSMKKJFER¾ÉJ54200-*('&%"    !       ÿÿýüýûüûûüüúüüûøùøøøùùùùùûùü ôöõõôõôôóò÷õóóòóòñòóòòôñññðñóð ýñðïïïïîííííìëëìëëêêëééèèèêíìèéèçèèèèèèèéæãèëêëîîîïðåæèéèèéìëììììíííîîîïîîîîîðñòòóõôóòõöóóóõõõööúýúøùùùúúúûúûûüüýþýýýý    a.             ,7         ^—<-# ! !#""#%&'(.2*+-/0012¨^88:;=>?=>DHLOPQSUU[\ZXYVXXXXXY]`^`dfggfehaa_]ZWXYURQQSSOLJJJIS ZY27432.,+)''%             þÿþýýüüýþþúþúùúûúùùùøøúøùúø÷öþõõõôôôòóóóööôòñòóóóõòñòñññññòñîðóòïïïîïîííìììëìêêêëëêêéèêëëêèèèèèèççéèèéëåçëêëïîìíîåèééêéèéëìïîíððíîïðïîïðððñòóòòôòóòööõõôõöö÷øøøúúùùøûûúûýýüýýýýþÿÿþÿ    1              0Þ+          "5-$"#$%'((03*,-10012sT99;=?BDELQPSTWWXYZ_^]\]^_^^]]]^`bfhkjhigjeb`_]ZXXUSRPRUPLPMIGIsˆE88655/.-*))&"        ÿþýþýûüûùûùúùúúúùûùù÷÷øøùùùø÷øóôõõõôüøùõóôõ÷ôòôõôôòõòòòòñòðòññïïöôïïïïïïïíììíìëêêìëêêêéëìëéèèéèéèèèçêêèêèéêìëìîîîîîåçèéêéééììîîîñðïïðóóïñóððñóòóòóôó÷ôõõõõ÷÷øøùùúúùùùûúûûûüüüýûþÿÿY     ,            4ï>     !"" !#G7'%((')*+,+,.,0/236/;;>?ACHKLV[VZ\]^c__afcbbcdcceddegiloonkkijgedalbXUTSQPSRMLNPQFC=9=876641/.,*''%            ÿþþüüýûüûüúûùùøÿùùùùúûùùùúýõöööööý&ñôôõôó÷øóòòôóóóòòòóóòòñðõóððïðððïíììíìëëììëëìëêíìêêèèèéééêéíìêñëêëìììíîîîîïåèéèééêéíììííïïñññôôñòóññòôôôôôõô÷õöööö÷÷÷øùùúüüùúúüýüûûûüüüýÿR                             "C! "#$#%%#&%&'%&''-+*,-..//0/0136;;=@ABVUORUY\]aebdiefgnkhhhijklmlorqqrrrqlkkjgechbZ\ZURPOMKKHJJCB@@=:7420.-.,)('%!         ÿÿýýýüûûûûüûúûûøúúúúúùþÿùùøøøøù÷ø÷ö÷ùL ðóôõôôóòñòóóôôôñóñöôóòððôòððïïîíííììíìêëìììëîëêêêêêéèèéééìéíëéöëêëëëëìíîîíïêééêìêììïîíííðñóòòòòòóòòóôõöôõö÷öõöö÷÷øø÷ùùøúúúüüúúûüüüûüýþÿýüýþ       +:-                            p.!!#&'%&&$%'''&'((*+,-..-00211247?=?BED__SX]^_cfihjijnlopoooopqrstuy{wvttvxolljff`^\_^XTOLKIGEDA@@<=;8730-++*))(17!          ÿþýýýýûúúúûûúûüùýûùùúúúúúù÷ùþûø÷ù÷÷ö÷óõôóôôôôóòñòóòóôùòóòòòòñððïðñððïîííîîííìëêëììëëëêêéêêééêéèéëéçèêìéêêëëëëìîîíîùåèëñêîíïðïðððòòññòòòóôóóóóöõõ÷øù÷öö÷øøøøøùùúûúùúúûüûûûüýýýÿþýþÿÿÿ        !àW.                               ""!!!(-"!"#$''(%&%$%%%''&)(()+./-./0234348>@ADGJLPU\bdfgilnnosvwxy{||yxxxyyz~}}ywv|tomljgc_^[ZYSNJIFBBA?=<><:5530-+**)('19"           ÿýýýýýýýûûúúúúúúøùúùùúÿøûû÷ý÷÷öõõô÷ôôóôõôóòóòñòóòòòòòòóòñòðñðïñóðððïïðïîíïñìëêìêëêëêêéêéèééèçèêéçèéçèêéêíïíìïîîïÿåéééëìííïîïðñóòòòòóôôôôóôôõöõùöú÷÷÷÷ø÷öøýýúúúûúûûûûûýûüýüüþþþþþþÿ     $$ír(+                        %)!!###!$#  "$'($#&'&%%%%&%%&'*+-..//.0355579>@BGLORW\adhllortvz~‚‡Š‹‘“‘މ‘„„‚~xvusqmigeacjncUNJFMW>==:9=;:7300-,,*)('(+$"     þþÿþýüûüüüûúúüüýùúúúûûûúùúûúøûýùøöööô÷ôôóôóóôóóòó÷øòóòóñòóòñòòðððòñðððïððïíìð÷ííëìììëêêééééèéêéèçèèçèééèéèéìððïòðîðçéèéêíííííîððñôöõôôõõõöôõõöõõõúøøø÷ö÷øùú÷)+öùùúúûúûûüýûûüþþþüýþýþÿ      h›hC>"#&&"/b[                     "$$$##"!""   !!#&%&&%'&+$%&'%''()*,./012137577<<ACFMQTY_dilnqtx}†‹Ž” žœ¡¦¨¨©™¤¢Š‹‰ˆ†„„|xvtoihfch1Y¬OOKFMW<:::99776363///,)(('%%$!!        ÿÿÿþþþþýüüüúûûýýùøúûúþÿûùúüûùøùúúùö÷ööúöóôôóóóõõôõóöüòóôôôóòñóòðñôõòïïïîíîíîïîîðíìîíëëêêéêêééêééèéèççééééêéëìïððïíîéêééêíìîíîððòòó÷÷óöùöõöööö÷÷÷ö÷÷øøø÷ø÷ûþ÷=Aôùùûüüûûûûüûýýþþüýþþþþ        9+9IQR;%yî‰     8                   !##"""!"!   #%')((&#$%%&&''&&&*,+-12342479;89EBEGLQV\afjotux~…‰•Ÿ¤¹ª£¨©¬®¬¦Ÿ˜——’‘Ž‹Šˆ…yvpkigdlÉÉKNNNB><:8:;75311?90//-+*++&.<!!        þþÿÿüþûüþüûùþùúûüûúúûúùúùùùüø÷öõøõóóôôõõôôóöúóóóòôóôõóóóôóññòóñïðïðññîîïíòïíîìëìêêééêêééèéèéèééêçéêêêëìíííîíïéêêëîïïïðñöôóôõöúù÷÷øùùúúúøøûùøùùù÷øøùúúûööüûûüüýýüüüüýþþþþýþþþþÿÿÿ         1{SŽåT(G|A     M                !"%#$" "" $(((,-%&&'%&''.*'*-.013555;@?R=?BGLORV\aioru}‚„Žš¤¥¨«±²±¸Ìºµ¶¸µ°ª¥¥¢››™–“‹„|wsnkhfo±½zRMON@>;:7696321075//.,,,,,&,8         þþþýýüûûûûùÿûúúûûúûûûùùùøúùø÷öõ÷úõòóöõôóóóï /ùôóòóóóòòòñóóòððññðððóüùíîííòïììíëììëêéëìêêêêéèêêêèýðêêëëìíîïîíïìëìíííðîñòóóóõööüüúûûûûüüûûúúúúùùúùøùûûûûûûûûýÿüüûýýþüþÿþþþþþþþÿÿÿ       ,C";ÕgÓe^+       !                !""""! !   #'))*'%$$''''''))*,/233699::<?@CF]^TW_biou{€™›¤ºÌµ¼½ÁÄÈÓNãÂÄÄÁ¼·°¬ª§¤¡›˜–“Œ„}urmhfh^VVSMIC?><964543310--.--,--++,)!"       ÿÿþþþüýüüüüûúûûúüüûüüûûûûùùûúóö÷øùõôóõôóóôôóùýöõôóóòôöòòóû÷òòðñòññðîïïîîîïòíìíîííìëêéïñéëììíëëêìé2éêìíìïðñðìíêëôöííîñðóóõõ÷øùúýþýþþýþûýÿûúûøùùùùøøùûüþýüüýýüüÿýýýüþþþýþþþÿÿÿ          "=Íû8Q(#                     $x'   !"!!98# #&'''(%'&&)''(*-/-/02458::;=@BFIMU]]adiow€‰´Å¯¸¾ÇÈÌÒÚÜâêqýØÖÐÍɼ¹´²²­¨£¢žš–ƒytniea^ZTPLHC?><8542021//---31,--,-..&$!!       6  ûÿÿÿýþýýûüûüûûûúûûúûüüûüúúúùùøû!˜öùöõôôôôõóñóõôòôôôõóòòôóòòôóòñððñðððïïððîððïíííìëìëëëéëìéêéêîìéêîòêéëììììììííííëìñùôîîïñòôö÷ùúûýþÿÿýýüüûûûüûûûúüþÿÿþüüüÿþþþþÿþÿÿþþÿ          ˜ñ!C&3kÆÁs7""                      fÑi   ! !**!#%"#&('&&'(&()(()--../23469;=?ABFIPRZ^fikqz…𤭷ÀÊËÒÙÞéî÷øùóï#úáÝ×ÒÌÆÁ¼»¹µ¯¨§ ”Š€vpic`]YRMJEB?<97331.//-,+,*A=,.-.-)('$"     T Q#ÿÿÿýýþüüûûûûúûúüûúúýýûúúüþüùøú Aý÷ù÷ôñô÷öôòñóôôôóóóôóóòóñóôòñòðïððïïðïðïîîïíííîíìëëëííîîéèèèêëîêêëìêêëëëëìíììííîëìíîííîññóõöùýýÿüþûúûýûúúûýþýýÿþüýýýþþþÿþþþþÿþÿ        'X%(<90+$                   J!H !"! #%&&&%'''&'(,*-,,022359<<=@DFIOW]cgnrv}Š•£©®ºÆÏÒÙâéôÿ öëãÜÚÕÍÊÆÁ¾¹±¬¦¡™†zqpf_^[RKIEB?=:841/-/--,+++<8,----+'%#"      # Š;þÿÿþýýýýûüûûúúúûúúúûýýüûúúùùúùøòöøøöóòôõôóòòòôõôöõòòôôòñòóðññññðððïïïïðïïîïíííîííìííìííêéééêêêëîêêéëëêéëìììîïîíîëëëëîîðñóôö÷øþÿ     þüûûûüýûûÿþüýýüýþýýÿÿýÿÿýýýýþþÿ         0&                      &8 !%'&'&%''''((***-/99569<??CHEINS^hmp‚…Ž™¡ª²½ËÙäéïø !,178/"õíéãÜØ×ÔÆÀº³®¨Ÿ”Œ€qŒv^^[QIGE@=>:74/.-/,+++*++,++,,-+)&$$!     9ÿÿþýþþüüýüûúúûûúûüúûýýüúøùúûøøö÷øø÷ôóòóôóóôôõ÷ö÷ùôòôôóóòJìññððñññðñðïïïïîïîîííìíîíìëêêêéëíëêìêêìììììíïïîððïïîêêëìîîðñóôöøúý    ÿÿûûûûüüúüüýýþÿÿÿþÿþýþÿþÿþþÿÿÿÿÿÿÿ                              $9 "&('%&'&'&&%(**+-.3459;=>AFIHMSYenuz‡‹•ž¦­¶ÄÓßê÷$+1;ISYVPA. ùôíæáÛÎÊǽµ«£™…xohb^WPKFC@=;874/.,,.,*)**,-,+,-,,*''$#         ÿÿÿÿþüýüþüúüüûûüýüüüýüûúûûúùùùùøøøöõôõ÷öõööõøøööõóõõõôóüïòòññññòôðððððîîîîííìíîííìëëêêéêìîììëëëììììððïððîïðïêêëíñõòòôõ÷øú !),*# þüýþþüüþþþþÿÿÿÿþÿÿþÿýþÿþ ýý            +              !  !$&&&()(')/&),--12138;<>ACFJNS[alu{„‘˜¦®²»Êáíó '.5@KWeqx{zn^L:*öîæÜÑÊ»±«¢—‹|rkd[TOIDCA=7446/---0-)),,+,+,.-*+)(+&$!          þÿþýýýýýýûúûþþýüýþýûûûúùúøúøúùø÷÷öö÷÷õõ÷ö÷öõôôôõõõõôòòòññññññðñôïñðòïðïïðîîììëëíììëéêìììîîëêêêìííììííííîððîëìíîðòôóõöøúÿ.BZfZE2 ÿþüûýþþÿÿÿÿþþÿÿÿÿÿÿ                      #%')())(+2)+,-.23489;?@CFHMSY`hox—¢¯»ÅÑàïú'1<GUdtƒ™Ÿ›‹ufYE5'îåÚÎǼµ¬£™€ricZTNHCA@=8;12--4,,++)-,++)*,*))(''%"!     0ÿÿÿþþÿþþüüýÿüúûþþüýüþþûûú÷øù÷ùùùú÷ûùõôõööõö÷öõõôôóõùþõòòòòññòñðððððïðïððïïîîïïíìëëêëììëéëëìïëêìëêìííîîíëìïïîïïììîïïòòôõöùý&NJš?# þýüüþÿÿÿþþýýýþþÿÿÿ                           .!  "&'('')((++,,-.1568:<?ADHKPW]dks|‡”¡¬ºÆÖæõ2@KWg{ª¸¾¿¾¸§‘|p^N?*$gðëàÓÆ¾¸¯¤›‘„tkdZSMHC@?=:=0.,,.+)21+10+**+*''''%&%"!     (þþÿþüýýýúýýûúüûûýüüþûýþøøøøùøø÷þûöòïôø÷öõö÷øõôôõùûõòóóòòòòðòóñ÷üîïïïïðíêïîíîííìëìëêëêëêëíëëêëëëëìíííîîîîîíîëìîïïñòóõûùü/jEI˜ÿÞN(ÿýüüþÿ    ÿýþýüüüýýüýþÿ                            5$  !%''(()')),-+..0579<=@DGKNSZahpw€œª·ÆÓçü )9K\kz¥¸ÅÕáêãÝ×Ä­–…rbS@-.)úñàÑÇ¿¸¯¦ž’…ymd]TLGB==<844/-,,,,-,)((),-,*'&%&&%#"          ÿÿþþÿÿþþüûûüúûûüþþýýûþ úøøúùùøøüûö2õø÷õ÷úûùõõöõöõôôóòóóòòóóò÷ûñòðñïï÷ ôìííîííîíëëììììêëíìöííììíîííððïïïïîìíîîîïñòôùù5œÍ RìT) ÿÿýý TŒ_ þýýþþþýþÿÿ                                        $!"$&''(()(++---.0159;<?AFJNRX_flu{…”¨µÃÓäù!2CTg}’§ÃÛíýöãʳˆuaO: ñàÓÇÀ¸®¥ž’‡{maYRLGC?;::44//.,-,+,*(()**)(')(''%$$# @2        ÿ Hýÿþüüûüýþÿþýüüýüûùúûùûùùùùùúö'O!ó÷÷÷ùüúù÷õøö÷õõõóòòóóóóñòòñõùðñðîõòíííìììíëêëëëëììïìëñíííìîíîîîïïîïðïíîïïððòôö÷ÿ 2zK)M ´G%  ÿýUSYu¼÷ÿþþÿþþ ÿ                                *   !!)"!   #%&'(((()+*-,//136:<>ACFKPV]djqw~‹Ÿ³ÀÑã÷ 3H]sˆ¡¿Úö &7FROE0êÒ¸„nYB&òãÕǽ¶­¤œ•ˆzk`WOIDA>:8642/1./.-++)'+-)('&%'+$%$"#"!           þþ© ûûûýýüüýýýýüûûûúûùúýúúùø÷øøùúúúûù÷ööùþüöøö÷úöôõôóóóóòòòòòñðóõïïðïíìîíöòìëììêêíñðëììíëëëíííìííííîîîïîïïíîîïðñòôõ÷þ *Y« ¹h5 ÿþÿþ %ñ 3Lû&ÿþþ                                      "$(#$*   O-! !#%((())()++,/02369=@CEHMSX`iou{…’§¼Íßù.F_x—´Ïð "<Yhv{yr]>% íί‘w^E+ñãÕÆº³«¡™”ˆzl_UNGB?;9742/..064,)''&')(&$#"#$&$"""!!     $  ÿÿþûýýûûþýüüüýýýüûüüúúùúûúúúùøøøùùù÷÷ùø÷ö÷þý÷ù÷÷ûõôõôôôöôòññõóçëñïïïððîîîíöòíëìëéëîðïëëëëëëììíìíìíííïîîïîïðìíîïññõôô÷øüÿ "3CORD4%  ÿþýþÿU€Lûöÿ ÿÿ         <                    +,"! ! z;!  !"&+))),1(,,-/0348;?BEHLPV]cksz‚¡®ÄÜï-A]z–¸Ùþ%:Pm…“œŸœ”…hH%ãž}aH/ýîßÏÁº±©Ÿ˜’†yl_UMFA>;87630/-.0H1('&&'('%"""#$%$!'%"!     þÿÿþþÿþýÿþýþýþþýýüÿÿýúøúúúùûúúûùùúùøøøù÷÷øøø÷ø÷ø÷öõöôôóõôòòòñ d2íïïðïñîïïïíííììññììëêëëìììììëëëììîîîïïððððñìíïðññöôõ÷ùûþ  &'# þýýþþ   ÿÿÿ           I                    ! $(  &! "!!""!#&)+,)-<*..-22469<ACFJNSX`fmwˆ”ª·Íéþ&=Ts‘²Õö$Sm™©´·»¹°£ŒgAôÒ©cI1þêÛξ´­¥•„yk^TMF@=:865401,,+2-)&'((&%$""!!$$' $!""         ÿþÿþüÿþýüüýüûûþûûûùûùùøûûúûúùùùùøùø÷÷÷÷ööù øø÷öööõôôóóóòê?Ñxêïñîîðîðïïíìíìëõûòìëëêììëëíìëêëìììíïïïðððïðíîïððòóóõøúûþ     ÿþþþÿÿÿbXÿÿÿ      /%       O             "!   " "   !!!"""%)*)**,0,-./4679:>ADGKPVZ`js|‚Ž›ª¿Øò 5Kf„¥Ïû"Q{™§´½ÈËÌʶ¤ƒ[,ܱ„bF.þæ×ʼ®§ œ’ƒwk^TLE?;<>532..,+*(((&&&%$#""  !"" ! ##"     Mÿ ýüüûþþüûùùûûúûþûùøøùùùùúùúúøøø÷öö÷öõù'øôõõô÷öôôóòòòò&!ïñòîíïîðïíììììêîõóìëëëììëëììëëìíìëíîîðñððïñîîîïðóóôõ÷ùûý       [þþýþÿþûVOýÿ       *"                  "! %$    5$!!!#$#$&()*))*-....568:<?BFJMQV\dpz‰“¤³Êâü.D\x•½ð#S€¡´¹ÃÌÕØ×ÓÌô”k7ßµƒ\A' ùãÑÆº¬¥œ˜žuh]TLD?;:;531/-,*))('&$$$"!!! !&   )$     ThEÿ ÿüÿþýýýýûýýüùøúùúûúùùùøúúûúùûûùøø÷÷÷ööö÷ôöõõõööôõôòòòòóóïíòðððïñîïîïîííëëììîïííììîîìíëììííííîîîòôñðëììîïïñòóóõöøúüýÿÿlÿýüýþþýþöùÿÿ                              &$ ###!   !"#%&$&)+++*-,../257:<?BFIMRYahtŠ“›¬¾Ôí#9Ok‰ª×BsŸ¼ÆÆÏÚßàÞÚÓʼp;Ù¯U;#ñÞθª¤š“¢‘€sdZRJD?<85320.-+*()(&%$$#"!    (""    f  þýÿýüüþýüýüüýüýûûýúûùüúùùûûýûùúûûùûûø÷öö÷÷ùõö÷÷÷÷÷öóòôôóóôóòòñïðïñðïïðñððîîîìñóîïíéðíííìîîîíïîîðïðñïø+íïïðñòóóõöøúüûüþÿÿ÷ýþþþýþþýýþÿÿÿÿÿÿ Rª                              %#  !#!  !#$$#%&&&(+,-,-//20249=@BDHLQW]fmy…“ž¦¶Éßù/KazœÃô)_Œ²ÎÕÖÝáââàÝ×Ì»œm5ФwO5 ìÚ̽´¨¡˜“ŒrdXOHD@;8532/.-+,(((''&%%#"!!       Fn  þþþýÿÿÿþÿþþýû %ûûûûúûùúùùùüüûûûúúøùúø÷÷÷÷÷÷÷õ÷÷ö÷öôôôôôóôôóòòñðïòñððïôñððîîíìííì[ïëíìîîîîïðïïððïîìü7Eíîïïññóôõøùùúúûüýþþÿþÿÿþýøúýþýýþÿÿÿÿ[Ö             """    !'$##+)&(')+())+-1./802368<@BDHLOUZ`it‡‘—¢®ÀÔê$=es‡®ÛFx¡¾ÏÚÞáãããáÞ×Ë·”c+ó—nH.æØÌº²¦œ”‡„}pbWOIA;:8400..+**'%)&&%#$"!         Z|ÿýûýýýüýþýüúùùùùùùùùøùúúúûûùøøøø÷÷õõôôõøö÷ø÷õõøõòóòòñòòñððñððïïîíîíîîìííììëéCåìììëííìíîðîîîîïîíðòìïïðïñòõõõøøøûüûúüüýþþþÿüþýýý ÿýýþþþþÿþF    &                !!! !$#"#%%&%$&)))(+-,..11335:=>@EJNSW[ak­²¯µÄ×ó *G[w—½êV‡«ÄÔÜáããããáÜÓÅ­†Qᯅ]<#úÞÐÈ´®¢™Žˆ…zm`TOIMM65>U--+))&%%&$###!         ,3ÿÿýýüý"ýýýüüüúúúøùùúûùøûúùùùøøøù÷õööõöõ÷öø÷úû÷ôôôôôóóññðñðñôïïîîíîíííííííîíìíñöîìììíííîðïîîîíïïííîïïññððòôòôõûùùùùúúúûûüüûüûüÿüûûúŠMûýýýýýýüý ÿÿ        "/,             "$!!" !!#$$$&*+(')**+..-./11458;?CEKQTW^ep¶Â¢ªºÌâú0Leˆ§Éö,bŒ°ÇÔÝáâãâàÝ×ͺ›n9ýÇšrM/÷ØÈ»±¬ –ˆ„vk_TNOdb43Bc-,))('%%####"!      + ÿþýýýýýû?Føüüüüüûøúøúúûûùøùùúùøøøøøù÷öõ÷öøõöøö þõôôôôóòóòóõññððïïðîïîíìììììíïîíííîííïîííîîîíîïîïîïñðïîïñññòõóõõ÷ö÷÷÷øøùúúúúúüûý ûüüùV/ûþþÿÿýüýÿýþÿÿ           !)"       !!!&#  !!"#$$$,.('')++-.../33568;ADINSZ_bjuƒ›¥°½Óç9SmŒ¯Ôþ1dްÈÓÚßááÜ×ÕÐÁ©}Mᬂ\;$ÿçÑŹ²§”ކ„~vj^TKS[E540,-+)''&&$$$""""!'PO      ÿÿýýþýþýüýüüüüüúûúúûûúùùøùúúúûûùùøøø÷öøù÷øù÷øúöööøùôóóóóôùòñïñïïïïïñïîîîíìîîîîìîîìíøðîìíìîîîïîîîðóñíîðïðóóòôõôõõö÷øúûúúùùúùúøûüûüþüøùûüþýýþþþþÿÿÿB            !!#"  !!%&$$$$'*+))+++-10//04468:=@EJOTY_gv~‚‘©µÃÕó!<Yt“¸Øý/c«ÃÏ×ÛÜÛÕÊý©ˆX+üÅ“iF,óßËÁ¶­¤š“‹„}uh\RKE=8323.+**&&$$#"#""#!!!:í      ÿÿýÿþüýýù úüüûúûûûùùúùúùùùûúùúøûý÷÷÷÷øøø÷÷øõöõôôôôôôòòòòðññòðïïîîîíîíìííííííìììíììðîîíëìëîïìïðîíîîîîïðïïñòòóôõö÷ø÷øúùûüùøúúúûûùûüÿüüûüþþýýýÿÿþÿ 7        2=      "$%#!#**'()++*,-///25558:?CFIMRY_gqy„• «·ÆÙñ &A\u’¸Úú#S|›´ÂÌÑÑÏÌ»¢ŽoX,Ô¤vQ5 ûêÖĺ¹« ˜”ˆ}zuk[OIA<7234.*)+%%%"!!""  !-Áâ    ÿÿþþþýþýüüúûüúûûûùùúùùúüýûûúøùøûþø÷÷÷÷÷÷÷÷÷öööú÷óõõóòòòòððñðïïñïïíîîîíìííëìíììëìëëíîíìíìììîìùÿòìïîíîîððïðòòóõööööõ÷÷÷øøø÷÷÷ø÷ýûûùûúúúúúúüüýýüýþýþþÿÿÿÿÿþ     0       $*      $# 3.&(&')**+,+1D055:79;@DIKNRY`emw‡˜¦¯¼Ëà÷+C]z–µÓó?h…›«¹¼Á¿®”€QF1ÿÖ®ƒ];"ôãο·³« œ’„}{uwv_MH@:630//*)'&%'" "!          ÿþýýýþþþýýýüýüûûüüùúûýúùúüûúúùùøùûùø÷øø÷÷úú÷õõöõõöõóòòðóóòñððððïððîîîîîíììììíìììììíñíìíììíìííííîîîíîïîðïòòòñòóôôõöõöø÷öøùö÷øþúÿþøùùùúúûûûüýüüüûüþÿþÿÿþÿ       O#              !"!     "#!,)%')/2++,.21936:<=<<@FILPV[`gnu†š¦´¿Íäû-F^x’®Ëè$Gj„Ž”–w^V&&üÖ³kE&ùëÜǼ³®ª œŽ{zvl^RMIA:73/.*)('&&$"!        ÿÿÿþýýýýþþÿþþþüüüüý ýúÿûùúùúúùùùùùøù÷ùø÷øùúûýûýúõöôôóòòóòòòòðñððïïíîïîíííîììíìííííóüîìîííììíïîííííîîïðñðôøóõôôóôõõõ÷÷öõö÷÷ùüýøúüùúúùùúúúûýþýüýÿýýÿÿÿ        !      !#" ! #'!""#(/+'*./,--0201568;<=>BGMPQV\ad‡Â›·´¿Ïäû+E[sŒ£º×ö BduupWK=濨ŽkM2 ùîäÒ¿··¯¨£—‰ywsgZOIF@;72/..**&%$$$"!!    ÿÿÿÿþþþþþýýýüüüýýûúûúúúüþûúùøøøúúüùûùûøúýùùøõõõóóóðòòòñòññððòïîïïîíìíîííîîîììííîííîìëëìîîííîîïððïðñððôóôô÷õôôõõöööö÷÷úúøøùüøùúùüùùúûüüüýýþþþý ÿ     "#("!#"   DR%  '   !!!1)"$#$)0-(13*.0.0/235689<>@DHMPSX]dlœ‘œ²·ÁÎâø &@Wn„—©¾Ùíý6FPKN3# áɰ‡lN5!ñèÚɺµ²±ªÃ—…~xuqcTLFC?852...)('$"$!        ÿÿÿÿÿþÿýýþþþýüýûñùýü ýÿúûûûúûÿûù÷ùúùùûøùúùø÷÷öööõôöõ÷0ïóóòòñòòñòïîîîîîìïðíîíïñïìîìììîíìïïîîîïñòíîîîðððññòóôöõõôõ÷öõ÷ööö÷øø÷úûúùùùùüüÿýûüüûÿýýþÿÿýÿ     ""%)))*((&$# ^w- /!  !!!-"!"#%%'('.1*05...1449;9<?ADIMQUY^fntz‡œ¯ºÃÐÞô  7Pew‡—©ºËÙé! ôؼ¡|cI2!õäÞÒûº²­§¨Â˜xti]QHC?;73/--.(&%$#%        ÿÿÿÿýýþÿýýþýþþýùpþüúþüýüûüúûúúüþüúøúúùøø÷÷øùø÷÷ö÷÷öõö÷öðóôóòñò÷ñññïððñðîïîííîîòðëîííîîííóóïíîïïîîîîîñðïñòòòóôóø÷öõõö÷öö÷ööö÷÷ø÷úùøúùùûúûýþýýýüýþþýþÿÿ     !##%),.2230.,)&"!         "   !   #$%%&')++-0.-.0538;<A@AFJNSW\agmt~ˆš­¹ÆÑáð0F\mxƒ‘ ¬¹Ç×âæìêÝÅ®—€lY@,üêÞØÉĸ¸´¯¦˜¯œ€wodVMGB=9640.,+/''#"!"!       ÿÿÿÿþþÿÿþÿÿþþ÷©+þýýüûüýüüúùúûúüýúùùùùùøù÷øøûú÷ööõõõôõôññõôôôòóðôòòüõñððïîîíìîïîïðîîíîííìííîíííííîïïîîòôñòóôóòôõöõõôôõöõö÷ö÷÷÷÷ùùùøøùûùùúûüýýþýûüýýþÿÿ!  ""%),28;>>=;;3/+)(#     ! ## !  "%'&()*,,++./21456:=BBDGKOSZ`cipv€Šš¬¹ÆÒáîþ(9M_hpy‚œ«¶´¸º´¦—ƒpZI7(þóâÕËÁ½··°«¥‰‚ysj_TLFA=842/-,*)''$!! (&     ÿÿÿÿÿþÿÿþþýûûýüüûûüüþüüüûüÿüûùúùúùøýùøøûùøööôôôôóóóõ÷óõóñôððñò÷óîîîîíììììîîîîíïîîííììììììíîíîîïïïóöñòóóóóôôõôõõõöõõö÷öö÷÷øùùøøùúúùùúúüüüüûûüüþþÿÿÿ*    $)+07<@BIIGGC=850*$!    !!"$"!%'()))+,+-.2;64569;?BDGKOT\bdiqw‹˜ª¹ÇÒÞìø )>NV[^er~‹Žˆ}oZI:,"  øíÜÐļ·´²­¥˜Š~yri`VOIC?<830.+*'(%$#!         ÿÿÿÿÿÿÿþý  ÿýûûüüüüþüýýûÿ ýûûúùùûúùüúøùøøø÷ööõõôôóóóôñôòñóõòñòðïîíííììðòíîïíîíïîîìîíììììîîîîîïïððñóñôòòòóóóõôõöö÷öõõõöõööø÷øøø÷øøøúúùúüüûûüüüýþþþþ   '(%-4:@FKOVVTQLHE@5-($ !    !#%'$#(()+)),--/23<85579FABDGKOT\adjqw€‹˜§¹ÆÑÛçðÿ +9BGHNYfoomed_UF9,"þñåØË¿¸µ³®¬Ž†~tkb[ULFA=974/.,((&$'#"          ÿÿÿÿþþ ýþýüüüýýÿýüüüþýüùúúùùùùøøùø÷øøø÷÷õööõõôòòòñ÷ôñôøóòñðîîïîíììðóíïðíïíîîíùõîíííííîïïîîïïîòñòóòòóôóôôõö÷÷ööööõöö÷÷÷÷øüøþúøùûüüüüûüþþüýþþÿþÿ    "&*1=JJQ\glrle[ZVG;3.'! "!!"! !$&(&$41)++,++/14224579<YGBEHMPT]ceksyŠ˜§·ÃÑØáéõÿ "+38=DLSTOHC;0( üõòîåÙÏÈÁ»·´ª¡ˆ‚ymd_VOGC@<742.+)('$##$        2-ÿÿÿþýÿÿüüþþýüüüüüýýüûüûúúýü ùúúúøø÷ùøùø÷ø÷öööööõõóòóòòüòòòôòñðïîîïðîîííîîïïîîíïïìøôîëëììëîïîîíîïîòòòòòô÷ôôöõõõ÷÷õö÷öö÷÷÷÷÷øøû÷þûùùûüýþüüýýþýþþþÿ    #'/9EN^iyŠ”œ©†zq]NB71*" !""""$!%&(&$72*+++/1,02144458=QFCEINQT^dfls{‰–¤¯¿ÎÖßåìóü $+-34321*$  øóîèàÚÕÚÝËÄÀ¸® ‘‹…rg^XQJGE@;62/,*(%%#$"!         yþÿý ÿÿýþþýýþýþýýüûüýüüüüüûûûõ>øùùùøùùûúúùøù÷öö÷öõôõýÿóòòøòóñððòóñîîïïîïðíïððîîíîîîíîîìíëëìëíííííîïðñòóóóóùôôõõôõööööööø÷÷÷÷ø÷ø÷ö÷øùùúúúüüüûüþÿþýûÿÿ    "$*3@KXm‘¯ÊðéÃ¥~dVJ>3,'!$ ""$  !$%%''')*)*5:-031544779<AEFHKPUY^emry€ˆ”ž³¹ÇÏÛßáçîô÷ú  ûôëäÞØÑÌÅâòþ»´§–‹‡{kaYTNGEC?:410-(&%$$"""       ÿÿÿÿÿþýþýýþüýýþþüûýüüüüúúúúúø÷ùøøùøûùúúøøùúøøôñó÷õõóôóóôòòòñò÷ôîíîðñîíïïïïîîîïíîíîììîìëëìììîòðîïïòòóóóóôóôóôõúú÷õõõ÷÷öö÷÷÷öù÷ö÷÷÷ùùúûúûüüþþýü %ýÿþÿ   "(0:GSe² e¹Ôš1È‹lZMA5-' !%("! !!$"$)+**+*+,/4/13467::;?ADGJLQTZ`elt{~‡’š¶±»ÄÒÚÚÝãåæêïõúþ  õêãÜÔÎÈÇÄ»ÊÒ¸¸µ¬œ””•‰ve\VQLFB@<831.+'&'%$#!!             ÿÿÿÿýýþÿýþÿüüüýüýûùùûûúúùùúøùÿùø÷ùøùúú÷ ÷÷ôõóôöóôóóòññòôóïîíðòíêîíîïïìíîëíëíìììíìëêëìîñïììíòòóóôõôôôôôøþýøõõõ÷÷öö÷÷÷÷ùøøøø÷øùúúúûýÿþýýþ )þþþýÿ  Z$#*3>JXq™äk6™¨i›ñ¢x`RG;0)#  ###%$""%&'*/-++,-15145569;;==ABIKMPTZ_ektz~†Ž”œ¦±ÅÉÑÔ×ÚÜÝßäèêìïóöøùóöðòßÓÌÊÆÁ½¾º´¯«±³«Ÿ“–”†rbXRLIDA>:62/,)&'%$$"!2F         ÿÿÿþýüýýýþýýþýüûüýüûûûûûûúøøûøøúùøùùø÷÷øð[Á[îõõòóóóôøôóòðññòñððïîïííïîîïðíííììêìíëëììêîîëìëììëëóóôôôõõõõõö÷÷ö÷õôõö÷ö÷÷ööø÷ù÷øøøøùüûýþýýþþÿþÿþÿ c) #,4?N^|µÀªâæ·Ö±“jOC8.&!"     "&%&&&(',3/,--.002354789:<=?BFIMORW]cmwu|ƒ‹–œ¦ÇÂÅÌÑÔÙ××ÜÝÞÞàâåãâßÖÕÍÇÁż¹¶³³¯«¯µ°¤š‘™Â˜Š€p`UNIFCA?;72.+)(($#""!  )!             ÿÿþþüüþÿÿÿÿÿýýýýýýüúûüûúùùùûúþøýûùøøùïj˜ê÷öôôóôôööõóñññòòððñññðññïïðïñïíïììíîìëëëêññììëìíìëôóôôôóóôóôóóöø÷õõõö÷öôõõõöö÷öøø÷øøþ ùûýüþÿÿþþÿÿ   "$+3@Q`‚¿È¹å桽ª†eNB6,% &3 ",, (  #'&'(&''(*-.,/312256889<<??@BEGJNQV[`q~qx~…ˆŽ–¦°½ÆËÎÛØÏÒÓÓÑÓÖÔÏÎÉÄû¶µ¾°®­ªª§¢³ØÌ’Œ—ËŸˆ‚r`RJFDBA?<72-,+)(##!"" #3(        ÿÿþÿýþÿÿÿþýþýýþýýýûûüúùûúùùùúúúúûýÿüø÷öõõòóòõö÷õõòóòññóóòòññïîïððòðîïííìííëìíìíììíìììììöôôôôôôôôõôõ÷÷ö÷öõõöùôõöö÷ö÷øøùùøøý ùûýú—ÿÿÿ       #)2@Q`€ªë‹P—…%iÙ—s\RD4,$ x9"%&'%'(*+++-/1443359:9:=?AABCEHKMQUZ_ciqtzƒ„“›¦´»ÄÇÏÏÊÊÈÆÇÆÇÄÀ½·²¯«©§  ¢   £ž¤ËƉ‡„|‹‚‚r^PGCB?>=951.-+()%"!  +S=%           þþÿÿÿþÿþþÿÿþýþýüûüýýýûûûúùùûùù÷øøùø÷öøùøöôöóôõóòòòóðñðððññôóññññïîîîððîíòñîëììêêìììíííìììííôôôõôóóõôõõõôôööõõõõõõöööö÷÷ø÷øúùùúúúûûýù!Åþÿ     !(1=L\vÀÂ¥[°}hVNA1("$E"$&'')1-*,,-011238;;;=@>AAADEILMQUWZ_ejrvy}†‰‘›©´¼ÀÂÅÇľºº¹·±²ª¦¡ ¡Ÿ›™˜˜™•š…€~‚{zvomnfWKEA><;9632.+(&'% &P>        ÿÿþÿýÿþþÿþÿÿýûÿþúûüþýûúüüûúùúøùúøøù÷ööõõôôóôôòòòòôðñññññðïðððòñïïïïîïîí÷öíììíëìíìíîííëëîíïòôóôóòóôõôôóôöøöôõóôôööõõö÷ö÷ø÷÷ùùùùùúûÿ!2ÿÿÿþÿþÿ   !&-7CPcz–·ÚúëÇ­ŒkYKC9-&!!#&'5.**+.../1125::;I„ODC@@DHIKMPVXW]egnruw{€‚‡’¢¶¹¸¹½½¸µ±°¯§›™—˜™˜•“’•˜„ƒ|{{{wtskfa`XOGB=986410/,(&#"!          ÿþÿþÿÿÿÿüûúúùûüüýüýûúûúúúùùøø÷ø÷ööõõôóóòòóôóòòòòóòóòñññïïðïïïðñöíïîîìëííììëìíííííëëìííîòóóõôôôòóòòòòõ÷õôôôôôôôõõù÷÷ùû÷øùùúúùûüüþþýþÿÿÿþþÿ      %+3<FUgp~™”‡wl^NE:0*%! !"#&*)*++../123369:<wÞ|=BCBDGIJPWVTV^gdiotstx|}‡”¤©¯°³´°«§¢˜“’’‘’Ž‘‡…‚{xxwvtttqnjb\YSOKF@9541/,*)'&%#""   /gD         ÿÿÿþýþÿÿÿûùøøøøøùûúÿüúúúùüú÷öúû÷ö÷õôóóóóóôóòñññôðñ÷õñððððïîìíîíîîììíìíìêëìííììëëìëëëôóôõóóôóóóòô÷õôôóóóõöõöõôøøøøùùøùùúûüýýþýýþÿÿýÿ       "*5;@NRWbimjd[TOHA4+&"   ""!%&'&D@,-/23359::=M‘PDCDFFEGJLUYTUY^aemmnrtzxz~‰•šœž¯®—–”Œ‡ˆŠ‹ŠŠ‰„„~vrponmmnopjfa\_RMIEB>830-*11%&%$$!! 0mI          ÿÿÿÿÿÿÿþýÿÿÿüúüûù÷ö÷ùúúýûúøùùúøøùø÷÷÷ööõóóòòòôòñññóõ÷óñï òïððñòðíîïîîîíííííëìîíììëìììíìëëõóòóõóóòöóó÷öõôòóôôõõôöõöõöúú÷ùøøøøûúûüüýüýýÿÿ      %%/68@DJORTQPJFB=7/'" 6   ##!$%%2;2+,.13568:;>@7@EBDFEEIJKNRSTWZ\_ghpmmpqtw{€…ˆˆ …‚‚„†„ƒ‚€~{zwpokigeeghfef`ZXXvNMTG?=81-+$EM!##"!             ÿÿþþúúýýûùøöûüúûúûûù÷ùùøø÷÷ø÷õõôóóôôòññóòñòóóôóòòñîïòñîîîïðîîîðîíîîòðëëìííîîëíêòóóóöóóóöóüòóôóóôôüûõõùõöö÷úúøøùúúúúúúûüþþpýþþK    @1"%(.4:>ABDDC@<71-+& 2  "  ##&(&,+)-/014779;<AAAADFFFFGHJMOQRTVY^bbejmlnqruvwx|€…‹†~~~}~~xvpkhedhe_^_`b_\[VSRQNrÜf<<?7.*'-/$#"!                ÿþþÿþÿÿýúùûüÿýööøüüý ûýùùúùù÷ö÷øøøõôõööôòòòóñòñòðïñòñððòðîîîîîìììëìíìîíîíìììììëëëêííêëéôòòóóóòôóòôôôôóóôôôõ÷öôõ÷ööøøù÷÷øùúùúûüýüýýýþþýÿþ9     $$&+/2379;843/+(%#     "#$%,3,'+-./1467;<>@BBDKHEGGFHJLNPSVWY^_deiljnppqruv{}zzz}yxuvwxxrjdfc`]cbYUTVVURPNLJGHŽˆ‰3982,(%#!!=G              ÿÿÿþþÿÿÿû÷úüÿõö÷úüûùùøøøùù÷öþüööööõõôòóôòôòðñððñññðñðîïïîííîïíìëëìîîíììììììëëëëêéëëëóôññðôòòññòøõñòóóòûòóôõõõùõö÷÷÷÷ùûûù úüþÿüýýýÿÿþÿÿ         #$'),./-+*'%"    !!!(/*&()+-/2788:<>BCDGGFHGGIJLMQWXVY[^cdfmjjmnpqsszzssuvtsplsøvaa_V£†TVTPOPQQKHIGDFGEF<751/-)%#"  Yx             þÿÿüøûþÿû÷÷ùúüüþÿÿùúúøøúûúø÷÷÷÷öõõòôô÷ôóôòòòñôóññïïïíïííëðêìììííëëííììîòòëëíïêëñòñòñóòòñòòòñññòóóøúóôóôõõ"üóõ÷÷÷øùûûúýüûýþÿýþþþÿÿ:þ      $%&&&&&$$"  !  "$%%%(+-.15789<=ABCEFEFFGIJKMQVUWY[^bceiiklnnpqqrsstpmlkhghŠˆbc\YVƒnOPMNLTvyFCCC@=>;87420.,'#!"!              ÿþþÿÿÿýûûüúùùùúûûûüþüûúûûøùýû÷ûû÷÷øøööõóóôøóòóñòóñõóððïïîíõùïíëìïëëñëëìëëëëìììíìêéêëêéóòñññ÷òòññòñòñðñòóõóóóóó÷öþýþõøøøøøúüüûúúþýýýüþýÿ    ()"!##"   %a/!! !#'%$(*,-/2479:;=@BDBPKEFHHILOSUWY]^_bbeghhjkllllmooljgedb`]ZYYWVSVRLIHHGIQOC??<:7766721-+)&# !               ÿÿþýÿþýüüûúúúúúûúüüúùøüúúùúøúùö÷÷øüúõõôôôóóóóñòóòóòïððîîíííìììêëêêìêêëêéèéêêëìêèèèêééññïîïòðððñññòñðñññòòòòóóôôóùøõö÷ööøøøÿúûüûûý ÿþÿþ        /,       &$0úM !!"%$#&(((-.01688:=>A@JGDFDGIJMPSUX[[[\^`abcdffjjijikleda`_\ZYVVTRPMKHDCDDCB?=<;9665432/.+)'$ !              ÿþÿÿþýýüüüûûûûúüúúøøüøúùø÷úùö÷÷øúùõõõö÷òóóóòòòòòñùøðïîíííìëìëêêëéééêëéèèèèêëêçèëèééîîíííîïîïñððññððñññòññòñòòôôõôôôôõö÷÷÷úûùúúûüýþþþÿÿþ        ¹‚&            '!(¿H  !#%''(.7GP3779:;>@>?ABJLGIKMPRUUVXXZZ\]```befddefea_^ZYYYXVTSLLKHECBBAA@?=86534340.,*('$""!!.    (       ÿÿþþüýþýüüüÿþüüúûûùúùùø÷ùø÷øùøöööõö÷ôõôõôóóòòñ÷öòñïïïíîìîîëììééééêêéèüüêëéèèëçèéìííîìíïïïððððòñðñññóñòòðòóôõóôõõõ÷øøøøøúûüûûûûýüýþþÿ        64         ™c"H%! !"%')-6EZ[35889;<>????KMFHHKMOPRSUVWWXY\]``_``_`aa_[e]VVUSQXpWEEECBB@?><:76533920+)(&%&#!!          ÿÿÿÿþþþýýýüüýõüúûúùøùú÷þÿù÷øùùööøþ÷ùöúöõôóóóññòòóòðïïíîîïüììéèèéééèééòñéèççèèçççííîïïíïïððññðñòñññòóòôóôóóõö÷øõõ÷øùøøùøúüýûýüüýýýÿÿþ          #   bZ      /» .€!##$)5<;&5476899<??>>CEDDFIIKLOSQQRTRTVW[\]\]^Z\\[Xbˆ\STRPMN^OCCB@?><:;964431230-(%$+'"!             ÿ $\Z ÿÿþþÿþýýýýýýüüûú Húûúúùöøø÷þ÷÷÷øøööùøúøûöóòóòóòðñññòðïïðîîìôìêéêèééççèéèçèççççèæææíîîîîìîîïðððïððððñòññóóôõóôôöõóôõ÷øøø÷÷øúúûûûûûûüþþþþÿ      !‡}       ,5       !! $*dÕA424767:<;<<>@ABDEEHIKONMNRaXRRTVZYYYVVWXVY^VQQONQNFCBA@?=;97654311..-.)&;,"#              |x;ÿýüûüýýýüûüýù…úûúûúú÷øùø÷÷÷÷öö÷÷øñ÷ù÷öóùóñóóòñððóòîîðîíëêëêêëêèèééêêêêèèèèççææåìîîííìíîîïïïðððïïïñññòóòóóòóóóôôôõö÷÷ø÷øùùúúûûþüþýûúþÿÿ         i_           "!(²ÂN323566899;;<>>ACCCFGHGJJJOd[QQQQSTSSTUWVUWVTSKNNOMIFCA@>=;8763221/-.-+(%?.        –æÝO   üüüýüýýüüýýûú÷úúüûøøøøø÷÷÷öööõõkø÷ôõõüøòõóñðïñòíííîïëìêëîêéèèêêìëììèççççææçåëíîííìïîîðððñðððñõõññòóñòñòóóóõöôõ÷÷ùóìøúúùûúü! ü ýÿ                         #$)S´=20234466799:<=?BBBCEEEEEFHKONNMMOOOPRUWSSTTUWMOMJGHFB?=;;97651//1/,,+)'%*%            /jj þþýýýþýýýûüüúúúúúùýû÷úø÷øø÷÷÷ööõõ)¹ööôôôòýóõóññïîîîîîïïëìêëîëééêééêéêêçèçæææåææêêìíêìïíïïîîîïððòøöïððñðòññòôôõöõõööîkÜ+öúùüûüüüÿÿÿÿ                                       .%!$(.""../12245456778:<????CCBBCDDGHIIHIJKLNOQRPQPUXYVTOLHDA><:988:92/--10,*)'%"'                 ÿýüýþýûûüûüüûûúúùùûúø÷øùø÷ø÷÷÷ööøøù÷öõöõôóñõóòñðñðïïïñóïíìíëìëëêëëêééééççééçæçææçêêêëëíììîíìííîðððñðïïïïðñððñôõôõöõõöízý/õúùüûú÷ùûüÿÿÿþþÿþ                                                  ##%#"'*-..1323344576678:==ABAA@ACBFFGFEGIJKLMNQRU[[\]\XSMFB><;98:<:31/-//-*(&#! "2               þüüýüûüüýüüüúüúýûûúøøùùúùùøùúøùû÷÷ööõ÷ööõôóòñþððððïðòïíìíìíëëêíêëëëëéèèçèèçææåæììëëìììììíîïïíïððïðòñïðððððòóòóõööö÷ø ûùùúûúùûûûüûüþþÿÿÿþÿ                                                "!! %%&*///013112333577:?=>?@?>@@oUCFDDFHJJKLOTX\]^ba`][VNFA><99:85343-.,,)(%"! '             ûUCÿ üýüúûûûüþûúúúýýúùùùùùùøûüúüúùõõôø÷ööôóóïðïïïîíííîðîííëëëìëîíìêèêéèççæääãåìêêêêêëëëììòñîîîîîðððîñïïððòòòóôõö÷ö÷öô÷ùùùúùùüúúúûýþþþÿþ                                             (%*)+,,/////01003446;9:=>>>@>·j>CBBEHJJKPWZ]bdfhgfd_ZUMF@<:9755332/.**)&#!                    ùeZ øw‘(÷ýûûýýüýüüúûüÿüûúúúùûú÷ýþûûÿûùø÷ú÷õôõôñññððððïîíòöðííííîîðïïîêéêéèçæææååæëìéèêêêêêêìíìîîììíïîîïðïðïðòñòòôôööõõöøøøùøøùúúúûùûþýýýýýÿÿ                                          #! !$'()(),--..-.1311233587<<==?:AA@ADHJJLRX^eluz~}zulbZXWMB=;99751.0/*)(%%"                 !"  ÿþýýýýýûüûýÿýýûúüüüüÿûýþþþþþB3ÿüûüú÷÷÷õôóòññððïîïïïïñïïîïñóïîðíêêêêéèçèçæåëùêéééêéêëëëëìììììîîîîðòòðññòòóóóööõö÷ùù÷øúøøúúùûûüýýýþþþþþ                                         !"%&'()*,,,.0005B?/123358<;=>?AAABCGMMKOXam~™¡¥¢ž•„vgi–xDB=>?951.--))'&'"                        ÿþýþþüûûûûûýÿüûûùüüüüûûýÿÿÿüýû÷õõ÷õñïïïîîííîîðìíìíîðîîíëéèéêèççèéåãèéêéëêëêëëìììíìíïïîîïïòòôòñðóóôôóõõö÷øùø÷øüùùúûúüýþýüýÿÿþþþÿþÿ                                                   "!"$%()'((),00.2MO+0/012487;:COC>DFHLMOWarŠ£¹ÇÒÑÌÅ»²£ŽzxÉ—EH@<:961/,*)&%'#                     ÿÿÿÿþýýþûûúúùûÿúüúûûýÿýüüüþÿý4|$òõõùøñïïðïïíìíîðíííïííîîîëìíéêèçééèäãéééçéèçèééééêêëìíìííïï÷ïïððññòóóôôôõõö÷÷ö÷øùùûøùúüýüüüüýþþþÿþþÿÿ                                           !"%&-+(''),,23-.--.01284889<==?GKLNOVat‘«ÈÞðþøïìÜÆ¹®™}bTQLE>::72/-*(&#$$ "                        ÿÿþþþþþýüüûûûýùúøûûüýþýüÿ        ÿ+ÑIî÷öõòòðïñðîííîíìëïïìëììììëûýççæçéèéäåéèèèçééêéçèìíëìííííìïïðïðôññòóóôõõõôõõøù÷÷øøùù÷ùùûúüüüüýýþÿÿþÿþþþþ                                             ' "##&(''&(***,++,,,..293479<>?@CMQOU`p‹®Ðè':6" ñÙǽ±”w`TPKC;853/,)&%#" +                     K”>ÿþÿÿýýýüýýþüûüüüüýýýÿ  ('033)  ûúøõóòóðïððïíîððîîïîíîîíìëëëëéèççèèçææèéèâXèòïåìíðííìíîîïïóòðñðñòóóôôôõôõööø÷øøøøùùùúûüýüüýýþýýþþþÿÿ                                         Œê !!!!!"$%&&'(''())+-....1265BF;;=@FQUSarƒ¨Êê Dq‰‚g?ùÞĺªp\RNH?952/))&"#!  Z                      ,Mí#þþýýüüûüüûûûýýýþÿÿ'<<EObg[J<2<$ ÿÿýúøöõòðñðñîîîóðîííìëëìííëëêëëéèèèæçæçèèéìôêëëêîðïïîííîïïðïñóñïòóòòôôôôõõõõööøøùøøùúüûûûýýýüüýþþþÿÿ                                            Ð !#!"#$$'(('''(*++,.-,/013F;68;?JW[Zbw–»ã0y¶ÝäË–Qð×´ž~bRNJA:610+('"! "#                           +òÚ%ÿÿþþýûýüüýûýûúùüýüÿÿ":S^m†°·›€cItj% þüùôóóññðîîðñíìíìíêééëëëëêëêéèèèæçéææèèèççëêêêéêììììíîîîòíðïòòñòòóôôôôôôõööö÷ù÷øøúûúúûûûýýûýýüþþøþÿþÿÿÿÿ                                        -&0! .#"!"$&&&'%%'()))**+-0/16457:>JX^fo¦ÉíM í.E+â•=á̸¦ŽmVQMB95/-*'$""hn.!                      ÿÿþH”Aÿþþÿÿþýûüüûüýûùýýýþÿÿ"1[}‚´:' ù¼ŠfR0üúþýõôôòñðîïñîëëíììêééëìëêëëêìéçéçææææçççèçèèèéêéêëëëìíííïìêïðïïïñóôôôôóóõöù÷÷÷úö÷øùøùúûúûüúùùûýüüýýþýýÿÿ                                        $.%%" !"$%%%%))'''(+''*,.-/0348;>IZdmy޲Ñî Q·"‹©·kÈSé×Á©’sZOKD93/,''!"# ¥<              "             ýùùùþþ ýüýüûýýýÿÿþÿ $/E¹×5Ä¥ž=겂J3"ýûùõôóóòóññðíîìíììëëëíìëëëëëëéêèêìçäååçççèèççééêëëëëëïîíîííðïïðïðòòðòõôõ÷÷øö÷õöøûùúûúù ÷ùúûþÿüýþþýýÿ                                  -$%!!!""'&%%'('&&(5=&)*+,-/25579>K]nw—¹ÔóR¿NÁ×ÜÂwòÞÅ©’xaSMG=5/+'%"#$!"!                           ýøööøúøþüýýüûþþÿÿüþÿÿþ (7R“Ý%¢' ùƒ/ÚÂc4# þú÷õóóòññððíðíííììêëëìëêéêëèééééçèçäåæççèèéèéêêëììëëìîîîïïòïñðññòñóóøûöõõõøù÷øùö÷øùùúùûû øúûüüüþÿþÿÿþþÿÿÿ   5C                                      +$  !"%"'&%%%#)/+/$'(*5--03347=I\r†˜µÍçE¦FÎÜÛÈ42÷ßÅ¥Œu_OJE<5,(&#"      ,+                      øõ÷ùûú÷ùÿÿþÿÿþýýüýþýüûûþüýÿþþ %8uÇã—nNº_úò1 ýúøöõôòñññðïïîîíììëëëëëëêêêéêëëèçèçäæåååæèèçèéééëììëëíïíîíðîïïïðñóóòòóôôôôöøöøøö÷úùøøøùùúûúúúúùúüþÿýÿÿÿÿ                            & "!"#"#%$(/*"#%&((0*--13989FYl~‰–®Èåý1|ñ–Ì¿Ÿ§@üâÅ¡„mZLHD80+&$$#   XJ     H1Ë»              ýööúÿþúõþý ÿÿýÿÿÿÿþüüýýûüüüüýþýþ$4hÈöãBÇ4QUÎoé‚0 ýù÷õôòòòðñïðîòñíëìêêëëíìêêëìêèééçççäåååãåæçææçèèéëìëëìîíîìíîîîîîðññòòòñòóõøý÷÷÷ø÷øùøøøùù÷ùúúûûúûüüþýþþþþþÿ                   !%"'  !/*#$"(+$$$%'''''+,/2679BSbs…•¨ÂàóU¥afAð™=ûàÀ–vbSHC@6/)&#%! rn%%     ."{y                    þùõ÷üúöøý9 þÿÿýüüûûûüþýþýýÿ#4D~ÚîÿX°éû’3öÏv, ü÷ûûóóóòðñðñïððîììëëëêìíìëëëééëéêææãäääéèäåçæéêèèêììëêìîôîíïîîïðïõõñòññòóô÷ø÷öø÷ôøø÷÷øøø÷øûùøúùùûúüüýþýýýýþS2û                      '$  E<"!!##$$"$%%&&%'),/258=L\i{ŸºØê*e§â÷æ½}3ûÚ²‡hVLE@;2-'$""!!-*                               þùöøû úúýÿ?þþÿþýüûûûûþþÿþÿÿ *9N…ÉÛNjZ%Ò½µ] û÷øùóôóñððððïîïîííìíìêëììëììéêéèèçéèãããéæäåæçééçéêëììëëíñî òððïïõõòòòóôôõõõ÷ö÷ö ú÷øùùùù÷øö)öúúûüúüýýÿÿþýþ þÿ                   72!!""!""##$'&%$&(*-2569DTcsƒ–®ÈÚð -T˜›~SôÈšsZLEA<6.)&%"  #                                   ÿü÷÷úýÿù÷ûþýÿÿÿÿÿÿÿþÿýýüýûûûüýÿÿÿ ,BSqºíò̼Ž{x5  þù÷õôõôóòñðññðñðîîîììììíìììëìëëéêççéèââãäãäæåæççèéêëììììííîòòòñññòóòòóóòñôùøöö÷ úøúúúùùúú÷ öúýûûûûþýþýÿý         ¨?             !#  ""##$&$#%)+.1357=IYfs‰Ÿ¸Êãõ5LQt<ب}aNA<;82+'%$"                                 ÿú÷øöøûø÷ýÿÿþþýýþþþüûûýüþþþÿ -=N`n‰¨‚mXE0 û÷öõôôóòòòñòððððîîíîííììëêëêëêëêéèèçáâáãääååååççèéìììíëììíîíØëñø÷òïññòóññüù÷öö÷û÷÷øøøùúùùù÷øùúüûüüþþýýýÿÿþüüo4         f,         2#'     !#!"#!##+c,'*-03457?NXdv§¼ÍÚéú®AÛ«‚dQB8563/(%$! "+P8                                  +ÿýúöôöùõøþÿþþþþÿýýýþýýúûüüûûüýýþ 1BCKWJ=* ýùõôôóòóôññðñðòððîíîîîîììëêëëêêêêéèçæâåæääååååæççèêëêêìêëêìîýÓ@ðóõðïññòòñìl3óõööööö÷÷øøúùøúûúûùúûúûÿýüýüüþÿþTP e.                   ¯[;I  ""! ! $"1ˆ5('*.13426CPYbuŠ¡¯¿Í×ÜããCô¥€cSD7122/*&$" #!7)                                ÿþûøùþþÿÿÿþýüüþûüþüüýüýþþÿ   þúø÷õõôóô÷òñññòóòñïððîîïíîïìëëêëêééèæçáåèåãääæåäåæçéééééêìëìïJeðîðððñññññï Eòööøö÷öùø÷ùúøùúúúûûûûûúøûüüüüÿþþÿÿ;9                „¹"(  !! !"$#%,1,()+.23108EPV^l™¡ª®±µ±—ˆt`PE91/00,&'-!              &(                 ÿÿþÿýÿýþüýüûüýÿÿÿ    þûø÷÷öõôòóõóóòòóôòñðððïíïööïìëêêéêèéèèèßââãâääçæäæêêèêêëìêìëîðøB ððððñóòññòõóëðö÷÷ùø÷üøøùúúùúúúûüûüû7ýþþÿÿÿÿ                              !! !!###$L=*'))-110019ENQWf|zƒ‡ˆ†zndVLB70.//-(%'+!                                      ÿÿÿÿýüýýþýüúúúûúûýÿÿÿ þüù÷ööôôôóóóôòóñòóñòñðîîîìíöõìììêêééëêééçâäåããåæåæåçðïèêêëïìëìïïðçìïïïïðóóñòóôôõõööù÷öüøùúúûûûüûûûüþü/ýÿþÿÿþÿ                           !""#%J:)'((*+..--07AIKOV[dda^WOJE=5.+,,+(%$#                                  ÿ ÿþÿÿÿüþþýûýüûûûüüûüýýþÿÿÿþýÿÿýýüúøöõöõóóôõôòñòòññòïðïïîîíììëëììíêêëéíêééåßãåããçæåæääæççéêéëîíëììîíîïïïïïðððñóòóôóôõ÷øü÷÷÷úúùúûûúúûûýüþüûüüþþþÿþÿÿÿÿ                     $JM"!  ##"#%$&')%%'(+-,-./3:@DGKQSPLFB=81-**++($#"! (                       /M        ‹‡ ÿÿþþýÿüüüýúúûûûúúûúúüüüýýýýÿþþþûûûûüùøøøõööôóóõöóòððððñðïîîïîíííëëíêéìéêëéêéèæåßàáäâããääãäååæèèèééëêìëëëìîîîïïïïððñòóóòôöõ÷úõ÷ø÷øùùûúúúúûûýþûüüýüýýÿÿþÿÿ                        ;D"#'!!!$!$&&'(%%$'))*+.//047;@DGHD>71-,)()**%#"  ,                         #8   HIÿÿþþþþýÿÿýûûúúûûûùúúúùùûûûûûüüüýýþüúùø÷øøùøöõöõôóññòõöððïñððïïïîíîîìììùýéëêëééèèææßâßâáàâãããääåççèèêêìêìîìëìïóòïïðïðïïòôóóõôôöõööùùøøø  úüûúùûûûúúúüüýþýýÿÿÿÿÿÿÿÿú                   C\&'!"#%'(&#"##%'((*,*,--/02468:60+*)&&&))$"!                                §¨+þ ÿþþþþýüûüüûûüúùþüùùúùúúûüûûûúûúùûùööøùôõôôôóóòñþõððòðòñïïíìíííìë$7çëêéééèçææßßßßáàáááââãååæêèééëêéëêêëðû÷ðîííîîïòòòóôóô÷øööûøøùùùúýýûúúüûûûûûûüýþþþþÿÿþÿ ;                 $$" #!""#&!$&&'%$%$#$**&'**++-0.1/5183,+)'&&%'(# !  +"                           Èæ=ûÿÿÿþþÿÿýþ  üÿüýýûýüúûúúùùúúúúúûúùøúûùùÿýøùùøöõü÷õõóòòóõ÷óùïïñðïñïïíììëëíë%ëêêééèçæçæàßààáááââãäåäåçèééêêëéêììëîíîïïîîïñðïðôóôõõ÷ú÷÷ùøøùùúûüüûûûüýüûûûûüýýþþÿþÿÿý¯0            *     !  !$"&&$%'%"#$%'()()*,->5A-..*('(&##$! $                      %G         EJ þþ_ÿÿÿþÿýûüÿüüÿÿûûûúùùùúúùúùøøøùúøøýýù÷÷÷õôüÿ÷óø÷òóöùúñòôððððîïîîîììììììéçêêééèåççææâÝÞÞäãáááãääääåçèèèééèêêëëììîîííîðññïðóóôôõöù÷÷ùøøùúúúûûûüúûþüûúüýüüýýýÿÿ‚-û        F^     "!!!$%&%'%"!! "$')%&'')@S*$&&(''%#"!!! "                        (J        ýÿþCÿÿþýüüüûûüþþûþûûúûûùùûúùùùúùøøø÷ø÷öõõöþøóõôóö÷ñòòòòðññïïðñïîìììêëëëêèéëêïíææçàÜÝÞßßßááâããääåççææéëèêêéììëííìíïðððïîðòôôôõöõö÷÷øøö÷ùûüýýýüüúûüýþûüüýÿÿÿÿÿ ý4¤      "7      !   ##%*)%"!! !#&'""#$$&'%$#%$##"!                                           ÿÿÿýþÿÿýûûüüýüüúÿùùúúúùøúúúøøöøøöõõõôôôôóôõññôòñòññðïïñîìíííìëëëììêêêã ÅèæçÜÜÜÞÝßààáâããäæææçççèêçéééêëìììííîïïïîîñòóõó÷ùöõö÷ùù ÿûýþÿÿÿþüýüþüýýüýÿþÿÿ3                 !  !!"##)&#"#"! !"#!!"#!"""!!   U%                                     ÿþýÿþþþýþýýùûúûþüüûþüÿÿüúúûûùùùúù÷÷ùýöôôôõôóôóòôõññòñïðððîòùðííëëìëêêéëììëééêîêççæÜÞßßßàààäåâæèäååæçèçéêêêëëìííîîîííïðîòõòõóõôõõö÷øøí|ˆúÿýþüüýþüýýÿÿÿþÿÿÿÿÿ                    !+'$$%! $#!! !  !  !                                      ÿÿÿþþýþýúûûüüûùüûýýûüüüûûøùüüûûùøøøøö÷øùöôôø÷õòóôòòòòôõðððïïò€B)åîîììëëêééêééêéçéóèçåÜÝÖÝàßßßââáäåäæçåçèçéëêêëîõëîîìëêêìîñòòóõóôôõõö÷÷ùýþ'/þýüýüûüüýþþýþÿþþÿÿÿÿÿÿþÿÿÿÿÿ         #      _’%  # #%$#žÁR"&   $#                                   ÿ ÿÿþüúúûüûúùüýýüûûûùúúúùúúùùù÷øø÷ùù÷ö÷öó ÿööõôóññòòóñðïïîð6‹ éïìêìììëéèêèêïêçèñèäåÚãxÝÞßßààááâãäååçæèèíééêìðîìííìêêëéíòñòôõòõöôõõöøùùùûþg=PO þþýûýýüþýþÿþýþÿþÿÿþÿþÿÿÿÿþÿ       "      Lu" "  !!ï5z%4i*%%                                    ÿÿÿþÿÿþýüüüýýüûüýýúüûûøúúúùøøøùùøøùù÷÷ø÷õýù÷÷õóóòóòòóòóõññðöûóîðíììëëêêêëìëëëéèêéèèÛëUØÜÞßàááâáâåæäæææèèèèêêêëìîíìíììììïòðòòòóôôôõöö÷ùüýÿÏ{Zw þýýüüüûüüýüýýýÿýþþýýþýÿÿÿÿÿ                     !$f|@ ! jd]                    2          # '/ ÿÿþþýüþÿýüüüüöùûüúúúûûùùùøùøøùùö÷úùöôõ÷ööõóòóóóòöóñòðíëïîîîììììêéêëêêêëêêéçèçÜßH ÛÝßàáááââãåçæåæççéèéíìêìííìììîñòïîññðõõóóôôõöööúüý aüñ3 ýýüüûüüüýþþþþþÿÿþÿýÿÿÿþÿÿþÿ  $                !$"   !Kž9#                          ^`  t™ÿþüýÿþýýüü/ ùÿùùúüúùùøùøøùú÷÷øøõõööõùøóóòòóòù ðóñîïîîîîîììíìêêëëêêêééêìèôéÚØËÖÞÝÞàçêäââãäææååçæêééììììíííëìðññïîñòñóóôõõõöö÷ùùúüÿ$ ÿþýüüýûüûüýþÿþÿÿþÿÿÿþÿÿÿýþþþÿ lH                   #%"$                       Wa >g     þÿýýþüûDJ öÿþøùúúùøù÷øøøùù÷÷öõõõõõõ÷õóòòñññóúðóïíîîíîîíëëëêêëíëëéèèèèéç ðÚÚÚÛÝÝÞàïöèáââãæçêæçèéééëëëìííìëìðñðñøñòñóòóóôö÷öøùùúýÿÿþûþýýüüÿÿÿý ÿÿÿÿýÿÿÿÿ   S; C>           %        QY               GU        ýýûüüýû #ùúùúùúúùùøùøøøøùú÷÷õôõõõõôóóõõòòòññïñòïîïïîîííìëëëéêëëéèéêèëéèñêÙØÛÛÜÝÞßèìåáâãåäåéåçèëééëëðïíîíëìíïîîòðñòóóòÿö÷öõ÷úûüýþÿýþýÿûûûüþýüüýþÿÿÿþÿÿÿÿ þÿÿþÿþ Á°ü              1!19,$ 2  p                             ÿ ÿÿüýýýüùöùûûúúúùùúúùøøø÷ø÷øøöõöôõõôôôóööóòòòññòñïïñîïîííìêëëíîêëéééêèéèèæèÛÙÛÛÜÝÝÞßßáááãäãäåæçæêêëêêïîìííìììííîîóðñòòòûùõööööùúûýüüüýýýûýûÿûýÿüüüüýþþþþþþýýÿÿÿÿÿþ                   .6" -%   !                  !   ÿþþþüüýüüúúúúùøøúùùùùùùùù÷÷÷÷õ÷ö÷ö÷õóòóôõõôóòòòññðððïðîîðîìëîîëîðíêêêééèççæçæÞÛÙÚÛÜÞÞÞßßßßááãåäæææèéêééìëîõòìììììïðòððòòññòôôô÷÷÷ùùùúûûúúúùüûþøûüûûûûøúüüüýüüüýÿþÿÿÿÿÿÿÿýÿ                   ! "                      0    ÿÿýüýýüûûúùúûúùúüûùúúùøü÷öø÷öö÷øöøúõòóóõõóòóóññðîðïîïîíïíììïîëëììéêêéèèæçåæåÙÚØÙÚÛÞÝÞßÞÞàááäåãåæçççééêëêîôñìííííðñðñòòññòóôôôö÷÷øüýúúúúùøùûüûùúúûûüù(!øüüüüüýþþýÿþþÿÿÿÿ                   *(&                                   ÿÿÿýÿüüûüûûúúýûúøúüúùúùøûÿ÷ö÷öõõööõôú÷óôôôóòñòòñððððïîîîíììììëëêêêééêêêèèæååäåÙØØÚÙÛÛÛÝÝÞßàááââãäååççèêëêêêëííìíîïïðïðñññòñòóõöõõ÷øûûøøøùùøùûûøùüúùùúú ùûûüüüûýþûýýþÿþþþþþþÿÿþ                !                                    ÿÿÿþýûýûüüúþûøøøùúøùø÷÷÷ö÷öõõõõõõóö÷ôýûóóñòòðñðïòððïîîíëììëëìëéêêèèêéèççæåååÛ×ÖÙØâãÜÛÜÞÞÞàãàáâáääçççéééêêêíììíîïîîïïðññóñòòõõôõöøø÷øùûúøøúúúùôùúùùúûøùûúûüüûûýþýþýþÿþÿÿÿþ               /pc                            ÿþÿüûûüüýûúùùùøøøøøø÷÷ö÷÷ööõôõóõóõöóñòññòñòñðñïïïîííìëìëëìëêêíïèééççæçæçäÔÖÖØ×ëíÝÚÜÝÝÞßãàáááããæåæèèèêêêëììíîïïïðððñðòòóóóõöö÷÷÷÷øùúúø÷÷ùùø úøøúüûùúûúúúúûüýýüýýý üýÿþüŠ·5                   "$4…x               ÿÿÿþÿÿþýüûûüýÿüúùúùøøø÷÷ùú÷÷÷ô÷õõôôóôóó÷õ÷÷ñðññòòññïðïîïíîíììëêëëëëæýMRäìèææååæãÓÕÕ֨רÚÛÛÝÞßÞÞßàáãããääåçççèèèéëëëìííîïðïñññòóóóüùõö÷÷öõö÷øøöö÷÷÷ø÷÷ùûûùùûúúúúúûþýþýýýý ÿ <Q             N>_ÄY                   ÿÿÿÿÿÿüüþûýýüüüùüúøøùøö÷÷÷÷øöõööôõôóôõôýñòñðñòðñððððïîðîîîííììëêëìæwŒâíéææåäåãÑÔÕÖ×רÙßâÝÝÞßàßÞààâäãäãåææçççéêêëìòöíîïðñññóòòóüøóôööõôõ÷öööõõõùöøøùùøùøøúùùúúùúüÿûþýüþø“ùýÿÿ               :1ÙÀ                        )wSÿþýþüúýýýüúûûúøúûúøøø÷÷ûø÷ööõõôóô÷÷öóòòóóñññððððïîððîîîîíîîìéìîêêæäéççæææäååÎÒÔÕ×××ÖìóÙÚÚÜÞßßßßáäãåäååæèèçéëëëíøííðïðñðòñòòòóôõööõôö÷õõöõöõûøøùùøøùøøùùùùúúúûÿýÿýýþ´iûþÿ                 €)z                       :' ÿýüýüûûûþüûüüø÷øøøø÷øøøööööôóôóôôö÷õòòòòòòòñðððîïíîîííííìììëéééèêêéèæçæåæäãäÌÒÔÕÚÙ×ÙÙÚÛÛÛÝÞààààâããåæçéèççèêëíííììïîðïòòñóóòóõõôôõ÷÷õöö÷öøø÷÷ôøùøøøøøùùùùùùùûûûùüÿþýýýðöÿÿÿ                                       ø  ! ÿ   ÿýýýýýûûúûüüûûúüúùùøø÷ø÷ýõõõõõõõôóô÷õòòóööññññññðððíîîîíìíììëééèéêééèçççæååäããÈÏÓÔÖÖÖÖØÙÙÚÛÜÞÝÞßàáââçèêðêåæçèêíîëëíïðïïðïïñòñóôóòóôõõôõõöõ÷ö÷÷÷÷øø÷÷ööùûùøùøùûüûþùúûüüüüþþÿÿÿ!                "! !"                  >´           ÿþýýûúûûüûûüûûûúùùúûù÷÷öøøû÷õûô÷ôòôôôôôóòñòòñððððîíîîíìíìíìêêéèêëéèçéçäåæåäããÆÍÑÓÕÖ×ÙØ×ØØÚÛÝÞÞßàßáâââääçççèçèëëêêììïîïôðïðñòòóóòôöõôôôöõõõô÷ö÷øø÷÷÷÷ö÷úúùùùùúúøúúüüüûüýüþÿÿþþÿÿÿÿÿ                   ',"(*'# )0          2'          ka3  F%U*   þþþýüüüúûüúúúùùúøöø÷÷÷øöøþöõûøôùõóô÷ùûúõóñðððððððíïíïíìíìëëëëéèêêééæèçæåæääããÁËÐÓÔÕÖÖÖÙÙÚÚÚÛÝÞÞààáàãããåæèéééêêêêëííìïñðññðñòññòóõõôôôõôôôôõøöö÷÷ø÷÷÷÷øùúøùúöùúùûþûûüüüüüüýÿþÿþÿÿ ÿþþþýþ               '8GJA,PC          kQ          9¸'  IK¨5    ÿÿýüýÿüûýúúùùõõ÷ùøöõöööø÷õùöôôôóõóóòíI °ñòóðïðïïííìïòïëëêéêëêèçéêí÷åååääåâãââ¿ÈÏÒÓÕÕÕÖÚÜÚÚÛÝÝßßàââááäãçèèéìíééëíìëíïïððñðòôôóóóóøùôôôôõõöõ÷õöõ÷øøøø÷øøùùøù(øûúúþúüûüýüûûýýýýþþýÿÿþÿ0]þÿÿþþþýÿ            !/’|]”/                         ûü  %tš#  ÿþþÿýüüûúûõZU õ÷÷÷öö÷÷÷ööõöõòöòóóòíLnõñòññïððîíîîòðíììëêëììéèéééçåææååæäãââºÁÊÐÒÓÓÓÕÖרÙÙÚÛÛÜàáààáâããääæèèêíêëêëììíìîïòññòóóòóôóòòóô÷ôõóóõõööõö÷ø÷÷øøøöó+sõüøúýùùúúûûüüûýÿýüýüüÿÿ:}%þÿÿýþþþÿ           !3ŠOÐ*                  ]     ÿÿþÿýûþûûùû÷;Iôö÷÷öö÷öõõöööõóøóòòòóA/öòòññðïïïîíìíììêêêêëëéèèéëîêæåæäãåâäâ⵿ÈÎÑÓÔÓÔØØÖåÙÜÛÝßààáàáãääåçèèêìêëììììííîîöðñóôóóóóóôõõôõóóóõõüõõ÷÷øø÷÷ùú÷öôúýøÿüûùúúûûûûüþþüý * ýþþýþÿ          4¾«s“-                   ,Ø    ÿÿþþÿüúúúÿ÷÷÷÷öõõööôõôôôóôõóòòóñêîóñððïïïïïîííìíïìëêëëéêìêççèèçæååãââãâá²½ÆÌÐÑØØÑÝöóÙåÙÚÚÞÝÞàßâãããääæçæîõôÿëíëííïíîððïòòóôõõóóôôóòòòòôôô÷÷õôõõõöö÷ø÷ö÷ùûüùøúûù÷øúúùúüüûüüû þýþÿÿÿýýþýþ       ,L}j>'+                                )     !#"  ÿÿþûúúù÷õøùø÷ùøö÷öõõôóóóóóôôòù÷ñññòòðïïîïïïîíííííììêêêèèêêçåææåääåããááá᮹ÂÉÏÐÓÔÒÖàá×ÙÙÚÛÞÜÝßßáääããåææçéëñþêëíïðîíîóòñöùùü÷ôõôóóôóóóóôóõóõôôõöö÷ùùøøùýþúüøùüøøùúùùúýýûüüûþÿýüýýþþþýýþÿÿÿÿ          $""                                   $)#'.23/(" ÿÿÿþýþýûúúùùôõ÷ø÷÷ùøö÷õôôôôôôòóòòñúøñððððððïîîîïííìíìììêêêèçèéíîåååååãåââààêæªµ¿ÆËÏÐÑÒÒÓÕ××ÙÚÛÜÜÜßààâãããäèéçèéêòéêìîíìíïðñïðò#0îòòòôòóóóôóóôüöóôõöööøú÷÷øøøúûûýÿùùúûùøùúúûûüüüûýýþÿÿÿþþþþÿÿÿþÿ                            - .7BPTI=5( ÿþÿþýüýüûùøö õ÷õö÷öõôôóóóóóôòóñññóòððïîîïïîïñîííëêëìëëêêêèèèèèçäååããããâçâáäâÒ¼ºÃÉÎÐÐÑÒÔÕÕרÛÜÚÛÝÞßßßáääãçèçèèéëîêêéìëìíîîîïðõùðññõþóòóòòñóôôôóóôõôõ÷÷ö÷øû÷÷ùøúúùüøùùùüûüýûûúûýþþýûýþÿþÿþþÿ               Hê                   l“7  )'8W¯¾›pL1   üøþýüýüüùøöõ÷ö÷ùøõõõõôôòòòóôòðñïïððïïîîîîïðîîíìììììëëëééêêéæåäæåäãåãâäââãâŶ·ÀÇÍÏÐÒÓÖÙÕÖÙÝÚÛÛÝÞÞßààâããäåææèèèèèéìëëëìììîîïòýýñññïýôòòðñòóôóóóôõõöö÷ø÷õöö÷÷øûùüúøùùøúýüúüýüúûüýúüüýüýýÿ$          &+0(     -ƒ                 úzŽþ$=%.Hƒ ºV¿[3#  v„ýýýüüúúùúö÷ø÷÷÷ø÷ööõõôôóòòòóóñðïîðñðïîîðîíìíîëìíìëëêêéëëëëçéïêääãääââààáá✪µ¾ÄÊÍÐÒÒÕÖÑÙÙÛÙÛÛÜßëâÞàèæâãäåççèêèèêìëëëìíîïïîïíîñññðôûòòòññóóòþõòôöõõõøú÷÷÷÷øùùúøüøøùüúúúÿûûûûûûþûüüýüýýþÿÿÿ          *«rÒ?                             Jn4e½"4X¹¸¡Çj:& û+ê"ÿþüûûûûúøøùù÷ø÷ööôööóôöóôòòñòññðîîððïïîîïîîíìíëìììëêîìéééééåéòíãäââââãàààáá•¢±»ÂÈÌÐÏÏÎðq‘ÓרÚÚÛÞçáÞàåäáãåæçççèèîìêìéëìíîîîîîîïððòñðïñòñòòòñòöôóóóûûõööö÷ööøøø÷÷ýúøùùùúûûüýûùûûúýûüûýüüûýþ                 2#’YJ  $W                                'K&:`ÙñÀÙ1p='  8dþüüûûüúùøûù÷÷õõö÷ú÷õô÷òóòñóóðððïððððîîîîíîîíìíìììëëîìéçèèæååééäãâãâãâáàßááÇɵ¶ÀÆÌÏÐÐÎòwŠÓØ×ÙÙÚÜÜÞÞßààâãäåååææèñëêìêêëëìîíîîîîðñðïðððññòùñïóòóóóô÷öööôõöõõöö÷ö÷ûúöøùøùúúüüûúúúûüúúüûûùýþþÿÿÿÿÿÿ                       .ăÒ9''   @Ô                                               #2Uª…gŸÊ^7% üýûûûýûúúúûù÷üûõöùü÷÷óóóòòñóóñðððñðððïîïðîíîîíîíìíëëêêéçèèçæåääåäããããâàààáàûð·³¾ÅËÏÑÑÓÔÔÌ×ØØØÙÛÛÜÝÞßÝÜáãåèèèææéïéèêéêëííííïðïññññððññòòó÷òñøóòôô÷÷öö÷÷÷öööø÷÷÷øúúúùúùúúûúúûúúüýüúûüüûüÿÿþ    ;         ".       $26+   *                                           -F~ÓîqÍxG,   ÿýûüûüúùùùøøö ôööõõõôóóñòñòññððïðñðïïïïïîíìììïíììëêêéèéèèèæåããäããââçããàáàßµµª³¿ÅÊÏÑÑÒÓÔÕÖרÛÚÛÜÛÝÞßöðáåçéèææíîêýëéëíîîíîððîñòðñòññòòòóóôóöúõööõõöö÷÷öõ÷ø÷ùøøúüûûùùúûúúúùúûúøúüûûüþÿû.‚Yø      #"                           $                                           &6H`’„_G5&   ÿþýüûúúùøùøø÷÷õóõôóôõóñòòòðòðñðïïïòñîîîîìíîììëîîëëêêéèèèççèæãâãããââáæâçààßߊ”¢¯¼ÄÈÎÒÒÑÓÓÔÕÖØÛÚÙÚÛÝÞÙ:pÜãäääéðìëéÿëêìíííìíïîíïñðïññðòðòüýôöôÿòõöôôõôõöõõõööùö÷øýûüüùøøùøúûûûüùùùúüúúüüýÿÿÿÿ þ                                           ,                                           &(,6?<6+$ ÿüýûüùúù÷úøûùö÷÷ööööôòôóñòñïððñóñïðïñðíìíîìëíììëëîëëêêéççæåæçåââããâááàâàãßÞß߈‘ª¶ÀÇÌÐÒÐÑÑÓÔÕ×ÖÙØÙÚÚÜ×4dÜâäãåîùçéèæèêëìíííííðñïïïîïïðñðñûûñôòþúóóôôôõõõööõõöööö÷øûú÷øúùùøøúúúúûùùùûûûúüûüþþýþÿüý!¡Aü                                                                                        "   #&.% ÿþüüûüúúù÷øøûüùøù÷õöõóòóòñóòññðîòñïïîîîìììíòñëëëìêêëêéèèèççæææäââãããáààáßßÞÞÝÞ…™§³½ÆÊÑÖÐÒÒÓÔÔÕÕ×ÙØÙÚÛàÜØÝááãåæëñèèçéèëêëííîîìðòîïðïïîïïïïòóððððóóóóôôõõö÷õõö÷÷öúøøüø÷øøùùøùúùùùùøùøùþüûûûüþýýþÿ%ÈOú                                            %%                                                 ÿüþûûüûøøøøùüùöúùôööôòòñòóññïðïïðïïîîíìííïüêëîëëëëêèçèéçæçæåæåãããããáâáàààÞÞÞ‚Š” ®ºÃÈÓÜÐÐÑÒÔÕÔ×ÖרÙÙÛßâáßàáäæçäßçæçééêêêíïïîìíííïòñðïðïïïðùòðïðñòóóôôôôõ÷õöö÷öúû÷÷û÷÷÷÷øøö÷ùùùøø÷øøùûûýùûýþýþþþÿþ )                    "                                                                          ÿþþüûûûûùùùùøùù÷öúùõööõôóòñöòñòðïïîîïðïîííîíöììîëêëëêéèçèçææååææãããâáááááááßßß~…›©µÀÉÍÍÐÐÑÐÓÓÕÛ×ÖØÙÙÚÜÝÛÞâââäåïåææéééêëïòñïíìîîîðñðïðñïððýóôññññòòôõôôôõö÷õööúúøùýù÷øøòó÷÷÷øùùùùøøúøùüûüÿÿÿþþþÿÿÿüÿ                    B                     Q,                                                         þýúûüûûùøøøùøøùùøöö÷ööö÷õñòïððòïîîîííðñïííííîìëëíëééêéèççæçæääåäãããââáàßÜÕßàÞÞÝz‹˜¥±¾ÈÍÎÏÏÑÑÒÔÖÕ××××ÙÚÛßêéÞàâââNäèæéèëêëëëííííîîïïïïïïñðïñ÷òöóññññòôôóôôôõ÷öõööø÷ùýùöøô)*þõööøùúøøùúù þýþþþþý ÿÿÿÿÿ                                       vT                                       ÿÿ       ÿÿýúûùþúúûøøøøõö÷öôôöõóõùôòôîñòûñîîîîííîîîïðííðìëìêééèèæçæåååäæçääãáâââáä&ëÞÞÝÝt}‡’ž¬¹ÄÊÍÍÎÐÒÒÓÔÔÜØ××ØÙØì+×àâáäû äååçëêèééëêéëíííîîîîïïîïîïïñðïñññôöôññóôóôõõôõõöõöù÷ö÷ñ11þôö÷ö÷÷÷÷øøú ýüþüýýþþÿÿþþþÿ                                     &     $#                                      ýûûþ úûûúøø÷q?óöõõöõõôõóóôñõòöñïïþöííîîîïîíìííìîíêéèéèçèçæåæçåäåæâáàáâõb&×ÝÝÝoyƒ‹ž±·¾ÈÊËÎÏÐÑÐÒÕÓÔÖרÙÙâõíÛÞàÞê>Šáæææõêçèéêêêëííîñïìíííîíïïïòðïððñøøñûþòóóóóôôõöõõõøøø÷÷óóøøöøö÷úø÷ùøùúúûüüþýþÿþþÿÿÿ                                                      !n                                   ÿÿÿþþýûþ ùùúùù÷÷²ñóóõõôóôóññòðñòðññíîíîíííìïõïëëëêëëéèèèèéîöëãããããäâáâáàáù˜ÚÝÞÝmu~‰—¦°¿ÌËÌÍÏÎÐÒÒÓÕÕÔÖØØØÚÜÝÝÞßàâçæåäçæééèéêëêìíííìííìíííïîîïïíïñðððòñíñôõ÷ôôôôõôôö÷ùøø÷ööùù÷÷÷úøùúùúûúûüýýýþÿÿÿÿÿÿÿÿÿ                                                            <                            ÿÿÿÿþýýüüÿûÿ÷øúø÷ø÷ûE+öõôôõóòóñòðððððïîîëìììîíìíîðïëêìêêèçççæææäíêãâââââãæáâàÞààÝßÞÝÝÝjs}…œ©¸ÃÉËËÍÎÐÏÐÔÓÕÕÕרÙÙÛÝÝÝÞàáäääåæååçéççêêéêëëëíîííïïðïììï÷òîñðïïòóñðòóøÿòóôóõùý÷õ÷÷ööö÷÷÷÷÷÷ùýøøøúùûúúüüüüüüý"/ ÿÿÿýÿÿþ 18+3!                                        )                                      þÿÿÿþýüúÿ úúùøûù÷øø÷îòø÷õö÷óñòòñññïðïïïîìíìììëëëìíííêëììèéèçççæææçåââââáâãáààÞÞÞÝßÞÝÜÝgu{~ˆ”¢°½ÆÉÊËÍÎÎÏÒÑÔÓ××ÖØÙÚÚÛÜÜàäâáâãæåäåçëéèèéëëëëìíììíóííìíôøëõòíïõöòññòôõòóóôôúóööõõõö÷÷öööööøø÷ùùúøùúûûüûûü%8þþþýÿÿÿÿÿþ ,.# WB                                                                             ÿÿÿÿÿÿÿÿÿÿýþÿûüûúù÷÷÷øöö÷öõõööóòòóòóððïñððîîîííííìëëììííëììêêéèççæçåìîåâââââàááàÞÝÝÜÞÞÝÝÝdmu|„ª¸ÂÉÏÍÌÐÓÒÒÒÓÔ×ÖÖØÙÚÚÚÜÞàáäëâãäãåã Q áïéëììììîíìíìíîðñîíîîðòðîïòññòóóóõóõöóøöõõõ÷÷öö÷ø÷øøùøøøùûúúûýüüüýü÷ûþýþÿþýþþÿüýÿ   (#                                                                                 þÿþýÿþþÿÿýüýûúüüùùö÷÷öõööõôõõôóóòóóóñðñðïïîíîíííìììëììììëëêèéêèçæåäåæåãæëæààßÞàáÝÞÛÜÜÜæßÛ]gpx€Š—¥²¾ÇÌÊËÏÏÐÏÐÑÔÔÓÕרÙÙÛÝÜÝÞàäááãâääí÷ìßFDõèëëëìììíìíëëîïîííîîîïðïðïññòóóóóóõòôòó÷öõõõööõõõöøùù÷÷÷ùùûûûþýúúüýþýüüýÿþþþþþýþ þÿ                                                                  #'    þ$þüümœ(ÿÿÿÿþþýýýþýûüýùúùùøùùø÷ööõôôôôôóóóòòñññðñïíïïìííììëëìëêêêêëêéèééææçæååääãåëèàßßÞÞÝßÞÜÞÜÜÝÛÚXakr{„ž­¹ÃÉÊËÌÍÎÏÓÒÓÔÔÕÕ×ÙÚÛÜÝÝÞáâàãâäååææççóóëëëëëëëììíïíëíîíëîïîíðððððððñóóòôòôòóóò÷÷õõööööö÷÷øøøø÷÷ùùÿûûûúúúûüüýþ ýÿþþÿýþýB÷ÿÿÿþ                                                                 -  ÿþÿÿÿ,þþÿø¸Cüþþÿÿÿÿþÿýýüüüýýýýüúûøùù÷ùù÷õöõôôôóóóóóòñòðððïðíïîììîíëëëìííêêêìëéïèéçææææææåääããáßßÞÝÞßÞÞÝÜÜÚÛÚS[dmv‰—¥³ÁÆÈÊÊÍÍÏÐÐÒÓÓÓÔ×ÙÙÙÚÛÜÝààßàáâãããæççææèêëëëêììëëëëííìììîîíîïííîðñðñòòóõòöòóóóôôóõöõõõôõö÷÷õõöøøøüúûûúùúûüüý#5ûýüþÿþþÿþþýªP÷ÿÿÿÿÿþÿ "                                                         3$              ÿÿ4w ýÿÿ*þÿÿþþÿÿÿþüûûýþüüúúûúúù÷÷ú÷ôõõôó÷÷òóóñññòñïïíðïííííììëëììììëëëêêéëçççååææåäããâáâààÞÞÝÝÝÝÝÜßèÞÚÙPW_ir|†‘«ºÂÈÊÊÌÍÐÛÔÑÒÓÔÕØÚÙÙÚÛÝÝÞßßßããããåææææçèðñéëëííìííîïîìíííõóïîïïðñðïðòòôõóõôóòñöõôôôöø÷öööööö÷÷öùùúùüûûûúúûýýûûýýÿýþþýþ÷üÿýýþýÿ                                                         þÿÿþÿþþ ÿýÿÿÿÿÿþÿþÿÿÿþüûüûþûûûùûúú÷øöø÷õôõôôúûôóòññóñðððòðïîíííìëëììëëììêëêéèèêèèçéèæåääääääàââÞÞßÜÜÜÜÜäÞÚÚLS[dmw€‰•£±½ÅÉÉËÌÏÖÓÐÐÒÓÔרØÙÚÛÜÜÞÞÞßááâããäóïèçèêëêêëëííîííìëíììòüøðîîîïðððïðñôññóóñññ÷õôóòôõôööööõ÷ø÷öø÷ùùúûúúûúúûûùûýþýýüýþýþÿÿÿÿýüüþýþ                          5                                    ÿþÿÿÿÿÿÿÿýÿÿþüûûþþýþþÿþûúúùùø÷÷÷÷õööôõõö÷óððòòòòïóùúðíííìììëëëëêêëêêíèèèèêèèèéæååäääãããááâÞÞßÝÝÝÜÛÜÛÚÚFNW_iqz„ª·ÁÈÉÊÌÎÎÑÑÒÒÓÕרØÙÜÝÝÜÝÝàààââãäæëêèèééééêëëíìëìîíííîïòòðïïîðòòñóññòòòóóôòòôö÷÷õõöõö÷ùûüøþøøøøúúùþýüûüüûúûüþþÿýþÿþþþüþÿÿþ                           )                                 ÿþÿÿÿþÿþý ÿÿþþÿÿüüþüüýýýýüúüüúüÿüûþùú÷÷÷õööøøõö÷öõóòñôüùññðððòø÷ïíìíìììììêëëêêêêïèçèéççççæäããããâáááßßÞÝÜÝÜÜÝÜÛÛÚÚÚ?JS[cluŠ•£±¿ÉÉÉËÌÍÎÏÑÒÒÔÖØØØÚÜÝÝÜÜßÞâáàâçæääæèèèèéëêëëíêêëîîîîíîííîîîïïîðòñðñòòøòòòòòóöõòòóóõõôôôú÷÷÷÷øùùúúúûúúúùùüüýýþýÿþýýýþþýþÿþþÿÿ                                             ÿÿþÿÿÿþþÿþþþþÿÿþÿÿþþýüüýûûûüûüýüüûúúùúù÷÷øøøøöõ÷ùùõôôöôòóñùþïððïðððîîìììííëëìëëìêêêêêèçèéçææååäãâãâáàáàÞÞÜÝÛÜÚÚÛÝÚÚØ×Ø8GSX]gpyƒŽš®ÛÞÆÈÊËÌÌÍÏÑÓÔÔÖ×רÚÛÜÛÜÝÞâàßáääååæèççéíìèëêìëëêëììííìíííñòîìíðóñðñññóñòòñòòôôóòòôôóý öþ#÷øùû÷ùùõ- ÿúûúúûûûûüýüýþþýþüýÿþÿþÿÿÿÿþþÿÿ             #                         ÿþÿÿþýþþýþþýüüþþþþÿÿÿÿþüþþûýúûúüûúúúûûúûûùøø÷øö÷÷øööõö÷ôóóóòòòñôøòðïðïïðñîîíìëííìëëëëêééêêçççççæææååäãâââàààßÞÜÜÝÜÜÜÚÚÛØÚØ××1ANTYclt}ˆ“¥Õ×ÎËÉÊËÍÎÏÐÒÓÓÔÕרÚÚÚÚÜÝÞÞßàáâääååææçèëêééèêêëðïêìíìëíïððííîòùòðñññûóñòòòôóòòòõöô÷ùöüüøýøø÷øøùÿüüûúúúúúûüüüüýþþþýþÿýýþüûþÿþþþÿþþÿ            )                       ÿUÓhúÿÿÿþþÿüýþýÿýýþýýþýüýþþýüüüüüýýüüúûüúúúúúúúûùùø÷ùù÷÷÷÷÷ôóóòòù÷òòòñððñóïðïîïîííííìììíìëëëêèèééèæææææçæäääâááâàßßßßÞÝÜÜÚÛÚÚØ×Ø×××'5BNW^gnx‚˜£°ÌÌÈÈËÍÏÏÐÑÓÔÓÕÖØÚØÚÛÜÞßÞàáâãåäåååææççéééêêêï¯çììñîíîòôèãïðóññððñ÷ùòñòòïóôòóóôôóôôõ÷ô÷ùöööøøýúùýýûûûúûüüûûüýüýýþÿýþýýüýþþÿÿÿÿÿÿÿÿ 4  )                                >³^ÿÿ&' þþÿÿÿþþýþÿþþþýüýýüüüüýþüýþüüýýüüþüüüýüüûúùùùúúøùûùøöööøõõóôõõòñúùòñòñðïðòïïîîííìííìììëìëêêêêèçèèæææææææäãâãâààáßÝÝÞÞÝÜÚÛÙØÙØ×Ø×ÕÖ× .;JSXais}‡‘ ¯¸ÃÈÈËÌÍÎÎãåÕÓÔÖØØØÙÛÝÝÞÞâáâáããäååææççèèêìëêîlýêíìòñîíîéTzëîîððððñòññòñõ ÿòòôôôô÷úõôôõôöõõöøøúùÿúúûúùûýüúùûûýýýüüüüýýýýýþþþþþýÿÿÿÿ6X)                      'þ-Qûþþÿÿþþÿÿþþþþýýýþýüýþýýýüûüýüýüúüüüüûüüûúúúùøøøûúøú÷õöõôóô÷û÷õóòòóóòñðððñïñíîîîìîìíëëëìëééééçççææçæçååääãááãâááßÝÝÝÝÛÚÚÚØ×ØØÖ×ÖÕÕ×&4AKS\dmwŒš¬²½ÆËÌËËÍÌéêÒÒÔÕÖÖרÛÜÜÜÞáàààááâäåæççèéëìêëééèÜéìííîîíìíèFlìîîïîðïðððññðôýóòòóôö÷÷ôóõóõõõõõõøø÷ûüúùùùøúûùúøøøøûüüýûûüýüýþþþþýüýÿþÿÿÿÿÿ                  ÿ  ýýþýýþÿýûüüýýüûüüûûüþþýýýýýþýüúûûûúøúúüúùùùù÷öøø÷÷÷öøöôõòóòóóòññðñòññðñòïïîíîïííìíëêëëëíîêèçççæéæççäãããâááäåááàÜÜÜÜÚÙÚØÙ×ÖÖÕÔÕÖÕÖ,=INV_gp|†žª¶ÀÎÌÉÊËÍÍÎÑÒÔÕÖÖØØÚÚÛÛÝÞÞÞßááâãåèéèçêìëèéééêéêìììëëïñïîõøïíîîîñîïðððððñóõõòòñòõöõóôõõóõõõõööö÷úúùùù÷÷ùúøö÷÷øùùúõûüüüüýýþÿýûüýþýþýÿÿÿ                þþÿþýüþþþþþüüýÿÿüüüüüþýýýýýýýþüûûúøûûüüúùûúøø÷úÿúöö÷÷õõõóóöõòòññóóòñòòòððîïïïíìíìëëìëêóôèèèææçêæçæåãäãâáàãçãßßßÝÛÚÚÙÛØØ××ÕÕÔÕÖÕÓ$2@HQYajt~ˆ”¢¯ºÄÇÎÏÌÌÏÒÒÑÓÔÕÖ×ÙÚÚÚÛÜÝÝßßàáããæêêèçèçééééêêéêíìëìëõöîííííîïïîñïîðððñññðôõóñûÿòôôóôö÷õõõöõööö÷ùúùùùùùúúøøúúùùøx÷ýüüýýýúûüþþþÿþÿ                                   ÿþþþþýýüüüÿýüýüûûÿýýûüüüþûüûüüûúùùøøùùø÷÷÷ø÷ö÷ùû÷õöôõóóóóòøúöóññðñòñðïïðîîîíïìëìëêêêêêéééèèçæææåæåäãäâááÞâæàÜÞÞÝÚÙÚÚÝ××ÖÖÔÖÖÕÔÓÍ ,9DLU]foyŽ™§´ÀÅÜÜÐÎÑÖÔÐÒÔÔÖØÙÚÚÚÚÝÜßàáááââäæææçççêééçêèèêëëìììñðìíîîíîðïîðóþòïïðññðôôòñüòôñòôõõõôõ÷öööö÷ùùùùùùùùø÷øúûúøø‰÷üüüüûüûþÿýþþÿþüÿÿþ       ÿÿþþþýþÿÿýþüüýüûúûûýÿýûüûûûúûüûüûüúúùùùúøøøöõõö÷÷÷÷øöõõõõôôóññòõõõóóñïðïîîïíîïïëøðíìêêêéèéééèèçèèæçåååäãâãâàáíçêîáÛÛÚÙÚÚÚÞ×ÖÕÕÔÖÙÕÓÐÈ"0=GNW`js{…‘Ÿ«¸ÂÇÉÌÌÍÏÏÐÑÒÔרÙÙÛÙÜÜÛÞÞãâàááãäååæçèéçççèçèéééêëìêíîëìíìíîîîïø"ôïïðððïòóóñóóòõòòóôóôôõöõõ÷÷÷ùùøúúøøøöõøøùûú÷ùúûüýüûûüþýüýüüýüÿþÿÿÿÿ       ÿÿÿþýýýþþýþýÿüûûûûúüýúüûüüúûüúùûúúøúøùø÷÷÷÷ööööö÷öõõõöõôôóóòñõóðñòòððððñðòíííõïñîíêééêëêééèçççèèèçæäããääãâßä/  #ðÚÛÚÛÚÚÚØ×ÕÖÕÖÕÔÓÒÌ &5BJRZdlv‰˜¥²¼ÅÈÉËËÌÏÐÐÑÒÔÖÜÙÙÙÝÛÜÜÝÞßàáâãäääççèéèççèçéêéééëêëôóêìíììííïîõñîðñðïðñôóñññóôóóóôóôõõõöõ÷÷÷øøùúú÷øù÷õööøùúúøóùüûûûüýüýþüúüüüýüÿþüþÿþÿÿÿ   ÿÿþþþþýþþÿýþüýüüÿüþýüýýýýüüýûûýûúúúúùø÷øùùùùöö÷÷÷ööööôôöóôóõøõòòòòòññïððïîîñúûîëììêëêêííëëèçèææèçæåääãäåâàáøÝààÞÜÜÜÛÛÙØØÖÙÕ××ÔÓÐÆ¼ ,9DLV^foxƒ«¶¿ÆÉÉËÍÎÐÐÐÒÝåרØÚÛÛÜÛÝÞÞÞàãåääæèèçèèèçèçèèéèéëëíñïëíîííîíîïðìðïïòñððñõôòóõöôôóóôôõõõöù÷÷÷÷ùøùúùùøúûöòöö÷ùüüüùýüüüýþÿþþýýýýþÿÿÿ* ÿ        þþÿÿÿþýýþýþýûþüúýýýýüýüüüüûüúûûúùúùøø÷øøø÷÷öõ÷öööõõõôõòóóõôôóñòñïïîîñïîíîîðìëíìêìëêêëêêèæææåæñîãâããââàéçàÝÜÜÝÛÚÙÙÙÙØ×Õ×ÕÔÔÔÓÐÊ¿´ &2?IR[glt‰”¢¯ºÄÊÌÍÍÏÑÓÔÛùÕרÜÝÜÝÜÝÞàáãååææèéèèéëêèêêêçéêêëëðïìëíîíîíîïïõòïïñðññññõõóôôõôõôôõôöõö÷õ÷÷øøøùúùøøúúõQõõö÷ûûý9ùûýþþÿÿýýýüüýýÿÿÿÿÿ  )  ÿþþÿÿÿýüûüüüüûûùúþþüûûûûûúûúùúûùúøùøùøùøö÷úøõõöööôõóóóôòòñóóòððñðïë ,úíðìíììíîîíëëêéêêéèèçææåæåäãââäâàßàÞÝÝÛÚÚÛÚÙÙÙ×ÖÖÖÕÔÔÓÒÐʸ¬ )6CLVienw‚™¥±¼ÅÊËËÌÎÏÑÕÓÕÖÖØÛÜÛÜÜÞÞßàáâäåçéêéèéèèèèëìíèèèêëêêêéêëêëëìîíîðîïòðïðððóòðóðìòôõòôóõôöõñõ÷÷ööøùù÷÷úùóTõõø÷ûúúS2ùýýýýýüüüûûûüÿýÿÿÿýÿÿ      ÿÿÿþþþýþýüüûûûüüûûùúýÿýûúúúúúûùúúúùùùø÷øùûùö÷úøõõõöõôôóôóóòñòññòñðððíêòíïïñôýïìëëëëêèçèêéæççæäõ!èåãáâáßàÞÞÝÝÜÜÜÜÚØØØÙÕÖÕÔÔÒÓÑÍÄ»¯¤ !/=GOY_ir{„œ©µÁÈËÌÌÍÎÏÏÒ××ÖØÙÙÚÜÝÝÝÞßâäæèêëêêèçèééççíîçéìñîééêëêêêêêîîïðïïïïðñððòòññ "õõôóòóóôõ÷÷÷÷öö÷øø÷ö÷øüôî÷ùúùüúù( ùüýþþýüûüüûüýýýþÿþþÿÿÿÿÿÿ          ÿþ ÿÿÿýÿþüüýüüüüüúúûûûúúúùúûùúúúúùùø÷÷úüùööö÷öõôõõóóôôóòòòñðñññððïîïö÷íìíîñ÷ÿñìëëíëéèççêïñëççßýåäáââàßáàÝÜÜÜÛÛÚØØ×ÖÔÖÔÔÔÔÒÐÉ¿´§œ&5@JQZcou~ˆ”¢®ºÃÊÌÍÏÎÐÐÒÔ×××ØÙØÚÜÞÞßáâåëñõóðêèèéêæçèçççèéèéèééêêçèêêëîííîïðïîîððñóôóéE³5ðõôóôóóóö÷ø÷÷ö÷øùøöõõùý÷øøüùøúøúõúþüüÿýüûüüûüýþýþýýýþÿÿý m    ÿÿþþÿÿþþüûüüûûúûúüýüýüúúûúúùùøøøúúøøøø÷øùú÷öõôöõôóôôóóóôóòññïðñðññïïððìììììíïñïëëêìééèéèçêíêæçâõ/ìâááààßáâßÜÝÜÙÙÙÚ×ÖÖÔÕÕÒÒÓÑÐÌø«ž” ,9DNU^koxƒ›§´¿ÆÊÌÍÏÐÒÓÒÔÙ×רÚÛÛÖHQÿáèú1S$ùíèèèææçééèèééèççèéêéèéêéëìííîîððïîïððóôòì2‚%ïòóñóòôóôö÷÷ö÷÷ø÷÷÷ööø÷øùõ÷ööø÷öPøüûûûûûúúüýþýýùüýýþÿÿ  þ  Z7e ,7ÿ[  ÿÿÿÿþýüýýÿýüûüûûûùúûýÿýúùúúûûúøøù÷øúùùøøø÷ööúùùøôõõôóôôòòôöóòðñððñððóóïîîîíìëìììëììëêêêêéêéçççæåæåâ×ààààßàßàßÜÛÝÜÚÙØØ×ÖÖÕÔÓÑÑÔÑËĺ¯£—Ž"/<HOWair{†‘«¸ÂÇÉÌÎÎÐÒÒÔÔÖÖ××ÚÛÕMMøáâ:”=Úîêçåçççèîééèèçæõõèçèèèèèéìîìííííîîïïïñøöðòòïòòñññòòôóõõõ÷÷ööõõö÷õõöõöúþ÷÷óA¼Eñúúúùùùùúúûûýüüûýýüþþþÿþ)5( ) ÿþþÿÿÿÿÿþþýþþþýüþüýüþüûûûúúúüýüúûüúúûúøùúøøúøùøø÷÷÷÷ø÷ùùõôõôõôôóóôöòõóòððððñòñðííîíììíîíêëïìêêêêééèçæææåääääááááààÞÞÝÝÜÜÚÚÚØ×ÖÕÕÕÔÒÑÑÑÍż³¦›‘ˆ &4@JRZdlt‰”¢°»ÃÈËËÍÎÐÒÒÔÔÕÖרÚÛííããã6bÜ‘ìéçæèèæèóéççëëç çæèéèèèéëìíîìíòðïðïïóýûñòôôòòôññðôóóôôõ÷öö÷÷÷öööõöõôÿ/úøø' øùûûùúûûùûüûüüûüýüüüýýýüýÿÿAn üþ    ÿÿþþýþþÿÿÿÿþþýýýýýüþûûûüýûúûûúúûûûûýüúúùùùúùøúûø÷ø÷üø÷÷öööøøõõôôôóôóôòñôòñññðóóïîïîíììëíëíîêëíêëêêééèççæææåãããäâáàâáßÞÝÝÝÜÛÚÙÙØÖÖ×ÕÓÒÑÐÒÏÉÀ¶ªž”‹‚ +8DMT]fnxš§³¿ÇÈÊÌÍÍÐÐÓÔ×ÖÖ×ÚÛØÚÞáè@Sîæìåæäæççèçççèíëéèçèêééèêëììííîïîïîïðñòòðòõñòóõôòòóóöõôõööõùùõööôóôóúùøùúøùúúúùøúþý÷ùûûüþûüþüûûüüüüýýýþþÿÿ7   ÿÿþþýþüþýýÿþþýýýüüüýûûûüüúúúúùúûúúüüùùûúùùûøøüú÷÷ø÷ ý÷øööö÷þþôôóôôôòóñòðñðñññöôîîïîíììëñííìëêéëêëééèæææåäåäããáãàßààÝÜÜÜÛÚÚÚÙ××ÖÖ×ÔÖÒÑÑÐËź®¡–Ž„} #0>GOV`jq{†’ž«·ÁÈÊÍÎÌÏÐÑÒÖÕÖÙÚÚÛÜÞàåëçäèéæçîååäåæçææçèéççêéææçééêêéëìííîìîîïðñðòóññððñóóöòóõôôöõõöõõö÷÷õõõõóóôõööõöýûúøøúýúøø÷ù÷÷÷ùúúûûüûüýüüýþþþþÿÿÿþÿþ ÿü  þýÿþüýýýÿÿýÿþüúûüþþüüúûùøúøùúúùùûûù÷ùúûúùøøûùùøù÷ü÷÷ööõóÿòóóôôòòòñòòóòððñóòîîííìíìëòñêìêêéêêêééèåææåãäåââáâßÞÞßòéßÜÛÚØ×××ÖÕÔÔÓÓÒÐÏÌÆ¼°¥˜Ž‡~x'6AIQZdlt~‰•£¯ºÄÉÌÌÍÎÎÐÑÓÔØÚÙÚÚÚÝàâããääãäãâäæäääæççééèçèèèçæçèèêìéëëììíëëìñòððóóðïðñððñòôúóóóòôõöõôõ÷÷õôööô÷õóôöö÷ûúøø÷øøö÷÷÷øø÷÷øùúúú$üúûûüüþýùûÿÿýÿýþÿÿÿÿýý    ÿÿþÿÿþÿýþþýþþþÿüüýýýýüýýüûûûúùúü÷øûúøùúúùøùùùùø÷÷ùøøöö÷ö÷öööõõôö÷ôóòòôñòñðñòððñðïïîîíîíììêëìòîèééèéééèç÷ôåæåääâãâáààßÞÝÙx£ÔÚØÛäâÖÔÔÔÓÓÒÑÑàÎÀ³¨œ‘‡€ys ,;DLU]gm…Ž˜¦²½ÆËÊËÍÏÐÒÓÓÕÖÖØÙÚÞÞßààáááâãáâæäääååçéêææêêççæçèéêìèëêëêéëëëïðîïòòïïñòððñóóóóöôóòù÷ôóõöõõúýõõõôôôôö÷ø÷÷÷÷÷ööõö÷ø÷÷ùùùûþûúùùúýýþþþþýüÿþÿþÿÿþÿ   þþÿÿÿÿÿþýýþýÿþüþýûúüüýÿýûúúúúøùú÷ùüüúúùùùùùøøúüûø÷ø÷÷õöõööõööõôôööôòóòòòòóññîïðïîîîïîîïîîðêêééçééèéééèæùöåæææåáââàààÞßÝÙ_”ÔÚØÚâßÕÕÔÔÓÒÒÑÐíߺª •‹‚{un>$1>GPW`h}‡†«¸ÀÉÉËÌÍÏÑÒÓÓÕÕÖØìõåÛÞßßßááâááâãäåååææçææçèçèèçèéêéîëêéìëëêëììîðòòïðððï÷ ññóÿÿõòòóôõôôõ÷ûôôöõôóóõö÷øùøø÷ø÷ö÷÷÷ùøöúüûùúùüÿûúûùD¿|öþýþýþþþÿýÿýþþýÿÿò ÿÿýýþýÿþÿþýúüÿÿþþýúúûûûüøüùøúûúúúøúÿýøøùøûû÷øøöõöõööööööõõôóóóóóòóñóñïïðïîîîîîííîîøðêëñèêéêééèéèçæåæçæåàâáààßÞÝÝÞÞãÞÚÙØ×ÖÔÖÖÔÓÒÑÑÐÌÓ̱¢˜…}vphP&5AKRZdks}ˆ”¢°ºÄÈÊËËÍÏÐÑÒÓÓßßæëáÛÝÞßààáààáâáåååæååæå÷õçéééèèéëéëêêéëíîíëëëíðòòðððïòøùòòóúùóòóóóõôôõõõùýôôóõõúõõõ÷þú÷øö÷øø÷ö÷÷÷ø÷ùøùùúùûùùüûúóh"Åïýþþýýþþþÿþþÿþÿÿÿÿÿ Ý(ÿÿþþüþýýÿüúýýûüýþþúøùúøúùúúùøùúúø÷õ÷ø÷ùüü÷öõ÷þùööööõõôóóôóóòóòñòððððïðîíîïîííííèú õêêöéêèèèéçæææåååäãâààààßÝÞÝÝÝÛØÙÛÙØØÖÔÕÕÔÒÐÐÎÍȺ¯¦š†xpib,:EMU]fox‚Œ—¥²¼ÄÉÉÊÍÎÏÏÑÐÒÝÝ××ÙÛÜÞÞàßßààáááäååääåæã äççèéëéêééêéèèêíííëêîòóòïïïðòôóñññòòñòôóòôôóôøùõôóóôöõõööõ÷ûúø÷÷ùù÷÷ööööøúùøùúùøúùúúúúüþýýûýÿÿþýÿþþÿÿþÿÿÿ 5ÿÿÿÿÿÿÿÿÿÿþüþüüüþþüüþýýýúüþüùúüúúùúûúùùùùúùùúûùùùù÷÷ùöù÷õUñöùøöõóóóòòóññóóòñðïïïííîîïðíìðôêééééêèééèëêèèæåæååäãâáâåâàÞÝÝÜÜÜÛÚÚÛØØ×ÔÓÓÒÒÑÐÏËÈÀ´©“Š€ysjc]$1<GOW_irz„Ž›§´¾ÆÈÊÌÍÍÐÚßàÖÔÖ×ÙÚÛÜÝÞÝÞßßàßáâäåããäåäöôäçèçèèèèèééèéèéëëìëêíðññîïððïðñððññòñòóóòôôôõôôôóóóóõöôõ÷öúø÷÷ø÷ùù÷öõõö÷÷øø÷øùù÷øùøùúþÿþýýþÿþûûýþÿþþþþÿÿÿþÿÿÿÿÿÿ  ÿþÿþÿÿÿÿÿÿÿþþüüýûûúþÿþþýûûûûúûúüüüûùúùøþúûûùúûúúùýþöøùø÷õ÷÷ø÷öõú÷õöø÷ööóñññòòññòôñòïîííîíîîíííìïòêêìêéêêçèêöìçççèçääåäãàãëäàÞÞßÛÜÝÜÛÙØØ×ÕÕÔÓÒÑÐÐÏÉÁ·«¡•Œ„{unh`X(4?IRZcjr{†’ž«·ÁÆÊËËÌÏÛæå×ÓÖרÙÙÚÛÜÛÜÞÞÞÞÞàâääââäåããåçççéåæççéèèèçêêêêéëîíîòïîïîïïïððññòñòóóóôóóóóôôóòðôóóõõöøúùþúöö÷øøøöôôõ÷ôöö÷÷øøøøøùùúûüûù+þüüüÿþþþþþþþþýÿþÿÿþþÿÿÿÿÿÿÿÿþÿÿþýþýüþþÿýûûüüûûüüýûûúúøøþúúúúûúúùøöøúùùøøø÷ööööõõõõööõôòóóòóòóòôôóñðîïîîñðïîîîìííëëëééêèèëùìæçèçæäääååááâààßààÜÝÜÜÜÚÚÙ×ÕÔÔÓÒÑÏÎÌĸ®¢˜Ž…}vogkaQ +7COV\emvŠ–¡¯ºÂÉÉÊÎÍÎÓÔÓÔÕÖ×ÙÚÚÛÜÜÝÝÞßßßààãäââäååæççææéçççèééêêèêééêéìöõîòðîïððñññòòóôóòóóóòòóõöõõõõôõôôõõ÷ú ÿ÷øøøø÷õôóô÷ô÷ùúøùøúùúúúüýýýüûûÿýýÿÿÿÿÿþÿÿÿÿÿÿÿÿ ÿÿÿÿÿþÿÿþþþþÿÿýýýÿýüüûûûûüüûúûùùúúøúùúúúûúûúùúú÷øûúø÷÷÷øööõû÷õõóóôôóòóóòòóóñòñððïñðïðòðíìììììëêéééêéèçëéæåçæäåäääããááááßÞÝÞÛÛÚÙÚÞÜ×ÕÔÓÒÒÒÐÏÌÄ»²­¨‘‡~vokbdZH "0=LRW`hpy‚™¦±½ÅÊÌÍÍÏÏÑÓÔÕÖרÚÚÛÜÜÜÝÝÞáâàßáããååååççææçéçèèèéêëìêéééêëìôôîððïððïñññòòóóññðòòññòôõõôôôõôõõóõõùt¼A÷÷øùùøõóôöõõõø÷ùùù÷úùúúùû  ûþüûüýþüüþýþþþþÿÿþþýþÿþþþÿ  ÿþþþÿÿÿÿÿÿÿÿÿÿþþÿÿþþþþþþüÿüþýýüûüýüûûûûúúúúüùúùúøùøúùúùùùùøøøùùø÷ùø÷ö÷÷÷ôööûøôü÷ñòòòñòòòòóóñññïðîïîîïîîîîìëìêéééèçéæççæåæäããäääãâááàßÞßÞÛÜÜÙÛÛØ×âÝÕÕÔÒÑÑÑÏÎǽ²¬³²ypijaTKAfv5.4/ftools/guis/fv/sample_data/ngc1316r.fit0000644000220700001010000103400007452425202020316 0ustar birbylheadevSIMPLE = T / file does conform to FITS standard BITPIX = 16 / number of bits per data pixel NAXIS = 2 / number of data axes NAXIS1 = 440 / length of data axis 1 NAXIS2 = 300 / length of data axis 2 EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format defined in Astronomy andCOMMENT Astrophysics Supplement Series v44/p363, v44/p371, v73/p359, v73/p365.COMMENT Contact the NASA Science Office of Standards and Technology for the COMMENT FITS Definition document #100 and other FITS information. COMMENT FITS (Flexible Image Transport System) format defined in Astronomy andCOMMENT Astrophysics Supplement Series v44/p363, v44/p371, v73/p359, v73/p365.COMMENT Contact the NASA Science Office of Standards and Technology for the COMMENT FITS Definition document #100 and other FITS information. OBJECT = 'NGC 1316' TELESCOP= 'Radio ' INSTRUME= ' ' OBSERVER= 'INA ' DATE-OBS= '07/10/86' DATE-MAP= '06/09/88' EQUINOX = 1.950000000E+03 / EPOCH OF RA DEC OBSRA = 5.01966661513E+01 /ANTENNA POINTING RA OBSDEC = -3.73856168315E+01 /ANTENNA POINTING DEC YSHIFT = 7.105427358E-15 /NET SHIFT OF PHASE CENTER INY DATAMAX = 1.233247221E-01 /MAX PIXEL VALUE DATAMIN = -3.888696432E-03 /MIN PIXEL VALUE CTYPE1 = 'RA---SIN' CRVAL1 = 5.01966661513E+01 / CDELT1 = -1.944444492E-03 / CRPIX1 = 2.260000000000000E+02 CROTA1 = 0.000000000E+00 / CTYPE2 = 'DEC--SIN' CRVAL2 = -3.73856168315E+01 / CDELT2 = 1.944444492E-03 / CRPIX2 = 1.470000000000000E+02 CROTA2 = 0.000000000E+00 / HISTORY -------------------------------------------------------------------- HISTORY /Begin "HISTORY" information found in fits tape header by IMLOD HISTORY BLOCKED = T /Tape may be blocked HISTORY -------------------------------------------------------------------- HISTORY /Begin "HISTORY" information found in fits tape header by IMLOD HISTORY BLOCKED = T /TAPE MAY BE BLOCKED HISTORY /-------------------------------------------------------------------- HISTORY /BEGIN "HISTORY" INFORMATION FOUND IN FITS TAPE HEADER BY IMLOD HISTORY BLOCKED = T /TAPE MAY BE BLOCKED HISTORY PUTHEAD OBSRA = 4.991666615E+01 / OLD HISTORY PUTHEAD OBSRA = 5.019666615E+01 / NEW HISTORY PUTHEAD OBSDEC = -3.736666683E+01 / OLD HISTORY PUTHEAD OBSDEC = -3.738561683E+01 / NEW HISTORY CNTR VERSION= 1 / PLOT FILE CREATED 08-SEP-1988 12:22:10 HISTORY GREYS VERSION= 2 / PLOT FILE CREATED 12-SEP-1988 19:08:19 HISTORY GREYS VERSION= 3 / PLOT FILE CREATED 13-SEP-1988 11:44:07 HISTORY GREYS VERSION= 4 / PLOT FILE CREATED 13-SEP-1988 12:40:37 HISTORY GREYS VERSION= 5 / PLOT FILE CREATED 13-SEP-1988 12:42:34 HISTORY GREYS VERSION= 6 / PLOT FILE CREATED 13-SEP-1988 12:44:28 HISTORY GREYS VERSION= 7 / PLOT FILE CREATED 13-SEP-1988 12:59:18 HISTORY GREYS VERSION= 8 / PLOT FILE CREATED 13-SEP-1988 13:03:15 HISTORY GREYS VERSION= 9 / PLOT FILE CREATED 13-SEP-1988 13:07:23 HISTORY GREYS VERSION= 10 / PLOT FILE CREATED 13-SEP-1988 13:25:50 HISTORY GREYS VERSION= 11 / PLOT FILE CREATED 13-SEP-1988 13:26:20 HISTORY GREYS VERSION= 12 / PLOT FILE CREATED 13-SEP-1988 13:32:00 HISTORY GREYS VERSION= 13 / PLOT FILE CREATED 13-SEP-1988 13:57:57 HISTORY GREYS VERSION= 14 / PLOT FILE CREATED 13-SEP-1988 14:00:53 HISTORY GREYS VERSION= 15 / PLOT FILE CREATED 13-SEP-1988 14:28:51 HISTORY GREYS VERSION= 16 / PLOT FILE CREATED 14-SEP-1988 12:00:40 HISTORY GREYS VERSION= 17 / PLOT FILE CREATED 14-SEP-1988 12:13:51 HISTORY GREYS VERSION= 18 / PLOT FILE CREATED 14-SEP-1988 12:15:36 HISTORY GREYS VERSION= 19 / PLOT FILE CREATED 15-SEP-1988 07:52:43 HISTORY GREYS VERSION= 20 / PLOT FILE CREATED 15-SEP-1988 08:11:42 HISTORY GREYS VERSION= 21 / PLOT FILE CREATED 15-SEP-1988 08:18:17 HISTORY GREYS VERSION= 22 / PLOT FILE CREATED 15-SEP-1988 08:44:40 HISTORY GREYS VERSION= 23 / PLOT FILE CREATED 15-SEP-1988 21:02:47 HISTORY GREYS VERSION= 24 / PLOT FILE CREATED 15-SEP-1988 21:09:45 HISTORY GREYS VERSION= 25 / PLOT FILE CREATED 15-SEP-1988 21:19:53 HISTORY GREYS VERSION= 26 / PLOT FILE CREATED 15-SEP-1988 21:28:01 HISTORY GREYS VERSION= 27 / PLOT FILE CREATED 15-SEP-1988 21:32:44 HISTORY GREYS VERSION= 28 / PLOT FILE CREATED 15-SEP-1988 21:38:55 HISTORY GREYS VERSION= 29 / PLOT FILE CREATED 15-SEP-1988 21:40:20 HISTORY GREYS VERSION= 30 / PLOT FILE CREATED 15-SEP-1988 21:42:44 HISTORY GREYS VERSION= 31 / PLOT FILE CREATED 15-SEP-1988 21:49:18 HISTORY GREYS VERSION= 32 / PLOT FILE CREATED 15-SEP-1988 21:53:40 HISTORY GREYS VERSION= 33 / PLOT FILE CREATED 15-SEP-1988 22:09:40 HISTORY GREYS VERSION= 1 / PLOT FILE CREATED 16-SEP-1988 14:54:15 HISTORY GREYS VERSION= 2 / PLOT FILE CREATED 16-SEP-1988 14:55:07 HISTORY GREYS VERSION= 3 / PLOT FILE CREATED 17-SEP-1988 17:17:18 HISTORY GREYS VERSION= 4 / PLOT FILE CREATED 17-SEP-1988 18:29:54 HISTORY GREYS VERSION= 5 / PLOT FILE CREATED 17-SEP-1988 18:30:43 HISTORY GREYS VERSION= 6 / PLOT FILE CREATED 17-SEP-1988 18:33:27 HISTORY GREYS VERSION= 7 / PLOT FILE CREATED 17-SEP-1988 18:35:44 HISTORY AIPS IMNAME='FORNAX/NOBL ' IMCLASS='I ' IMSEQ= 1 / HISTORY AIPS USERNO= 51 / HISTORY AIPS CLEAN BMAJ= 3.8889E-03 BMIN= 3.8889E-03 BPA= 0.00 HISTORY AIPS CLEAN NITER= 21 PRODUCT=4 / POINTS HISTORY /END FITS TAPE HEADER "HISTORY" INFORMATION HISTORY /-------------------------------------------------------------------- HISTORY IMLOD OUTNAME =' ' OUTCLASS =' ' HISTORY IMLOD OUTSEQ = -1 INTAPE = 3 OUTDISK= 2 HISTORY IMLOD RELEASE = '15JAN89' HISTORY RENAM INNAME='FORNAX/NOBL ' INCLASS='I ' HISTORY RENAM INSEQ= 1 INDISK= 2 HISTORY RENAM OUTNAME='FORNAX ' OUTCLASS='I ' HISTORY RENAM OUTSEQ= 1 OUTDISK= 2 HISTORY PUTHEAD CRVAL3 = 1.384000000E+09 / OLD HISTORY PUTHEAD CRVAL3 = 1.510000000E+09 / NEW HISTORY AIPS IMNAME='FORNAX ' IMCLASS='I ' IMSEQ= 1 / HISTORY AIPS USERNO= 51 / HISTORY AIPS CLEAN BMAJ= 3.8889E-03 BMIN= 3.8889E-03 BPA= 0.00 HISTORY AIPS CLEAN NITER= 21 PRODUCT=4 / POINTS HISTORY /END FITS tape header "HISTORY" information HISTORY -------------------------------------------------------------------- HISTORY IMLOD OUTNAME ='FORNAX/NOBL ' OUTCLASS ='P ' HISTORY IMLOD OUTSEQ = 1 INTAPE = 1 OUTDISK= 2 HISTORY IMLOD RELEASE = '15OCT92' HISTORY AIPS IMNAME='FORNAX ' IMCLASS='I ' IMSEQ= 1 / HISTORY AIPS USERNO= 51 / HISTORY AIPS CLEAN BMAJ= 3.8889E-03 BMIN= 3.8889E-03 BPA= .00 HISTORY AIPS CLEAN NITER= 21 PRODUCT=4 / POINTS HISTORY /END FITS tape header "HISTORY" information HISTORY -------------------------------------------------------------------- HISTORY IMLOD OUTNAME =' HISTORY IMLOD OUTSEQ = 0 INTAPE = 1 OUTDISK= 1 HISTORY IMLOD INFILE = 'FITS2:FORNAXI ' HISTORY IMLOD RELEASE = '15JUL94' ORIGIN = 'AIPSGorilla (NRAOCV IPX) 15JUL94' / DATE = '24/03/94' / File written on dd/mm/yy HISTORY AIPS IMNAME='FORNAX ' IMCLASS='I ' IMSEQ= 1 / HISTORY AIPS USERNO= 100 / HISTORY AIPS CLEAN BMAJ= 3.8889E-03 BMIN= 3.8889E-03 BPA= 0.00 HISTORY AIPS CLEAN NITER= 21 PRODUCT=4 / POINTS END ÿÿÿÿÿÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿýÿýÿþÿþÿþÿþÿÿÿÿÿÿ    ÿþÿýÿûÿûÿüÿûÿûÿûÿýÿüÿüÿýÿýÿûÿüÿýÿüÿüÿûÿúÿüÿýÿüÿúÿùÿúÿûÿûÿþÿþÿúÿúÿýÿýÿûÿùÿùÿùÿùÿûÿýÿüÿúÿýÿÿÿþÿþÿýÿùÿúÿüÿûÿüÿþÿüÿüÿþÿýÿýÿþÿþÿýÿýÿüÿýÿÿÿýÿûÿýÿýÿýÿýÿüÿûÿþÿÿÿüÿüÿýÿþÿÿÿþÿþÿÿÿÿÿÿÿþÿÿÿýÿüÿþÿþÿÿÿþ ÿÿÿþÿÿÿþÿýÿþÿÿÿþÿþÿþÿÿÿýÿþÿþÿýÿýÿýÿüÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿþÿþÿÿÿÿ    ÿþÿýÿüÿüÿüÿüÿýÿüÿüÿüÿüÿþÿýÿûÿûÿüÿûÿúÿûÿýÿþÿýÿûÿùÿøÿùÿûÿüÿþÿûÿüÿýÿüÿúÿøÿùÿúÿüÿýÿüÿüÿüÿþÿÿÿþÿüÿûÿüÿýÿüÿùÿùÿûÿÿÿýÿüÿþÿþÿýÿýÿýÿýÿýÿýÿþÿýÿüÿûÿþÿþÿüÿþÿýÿüÿüÿüÿüÿþÿþÿýÿÿÿýÿþÿþÿýÿÿÿýÿÿÿÿÿüÿÿÿþÿþÿÿÿûÿûÿÿÿþÿÿÿþÿÿÿÿÿÿÿûÿýÿýÿûÿÿÿüÿüÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿ    ÿþÿýÿýÿüÿüÿýÿüÿüÿûÿüÿüÿûÿúÿûÿûÿúÿûÿýÿþÿþÿþÿûÿùÿùÿúÿûÿÿÿýÿüÿþÿýÿúÿúÿúÿüÿýÿüÿûÿüÿþÿýÿûÿûÿûÿûÿûÿüÿþÿüÿùÿûÿþÿÿÿþÿþÿÿÿýÿüÿýÿÿÿþÿüÿûÿýÿþÿúÿûÿÿÿÿÿüÿýÿÿÿüÿüÿüÿýÿþÿþÿýÿþÿÿÿýÿþÿÿÿýÿþÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿûÿýÿÿÿþÿþÿþÿÿÿþÿÿÿúÿþÿýÿÿÿýÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿ     ÿÿÿýÿýÿþÿþÿýÿüÿýÿüÿüÿûÿùÿúÿüÿûÿûÿýÿýÿûÿûÿýÿûÿúÿûÿüÿûÿÿÿÿÿüÿýÿýÿûÿúÿûÿûÿüÿüÿúÿüÿþÿýÿüÿúÿùÿúÿýÿýÿûÿûÿüÿüÿÿÿÿÿþÿÿÿüÿúÿüÿüÿûÿüÿüÿüÿþÿÿÿþÿþÿÿÿþÿüÿþÿþÿüÿûÿúÿþÿÿÿüÿýÿþÿýÿüÿÿÿüÿÿÿýÿýÿþÿÿÿýÿÿÿÿÿþÿÿÿþÿýÿÿÿþÿþÿÿÿþÿýÿþÿÿÿþÿþÿûÿüÿýÿÿÿþÿýÿýÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿþ     ÿÿÿÿÿÿÿÿÿýÿüÿüÿüÿüÿúÿùÿûÿüÿüÿüÿûÿüÿüÿüÿûÿùÿùÿûÿüÿûÿÿÿþÿüÿüÿüÿýÿüÿýÿüÿüÿýÿýÿýÿûÿúÿüÿÿÿþÿûÿûÿýÿÿÿÿÿþÿÿÿþÿþÿþÿüÿûÿþÿüÿúÿûÿüÿüÿÿÿüÿýÿþÿþÿýÿúÿøÿúÿþÿþÿýÿþÿüÿüÿþÿþÿÿÿÿÿþÿýÿþÿÿÿýÿýÿýÿûÿþÿÿÿüÿþÿþÿþÿÿÿþÿüÿüÿýÿýÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿþÿÿÿýÿþÿÿÿýÿþÿýÿýÿþÿýÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿÿ      ÿÿÿýÿüÿüÿûÿùÿøÿùÿûÿüÿûÿúÿûÿüÿýÿýÿýÿùÿ÷ÿøÿùÿþ4ÿþÿýÿüÿûÿþÿþÿþÿþÿýÿûÿüÿüÿúÿüÿÿÿþÿüÿýÿþÿÿÿüÿúÿýÿþÿüÿüÿýÿüÿüÿüÿûÿýÿýÿýÿüÿüÿÿÿþÿýÿýÿúÿúÿüÿýÿüÿþÿþÿûÿýÿþÿþÿÿÿþÿÿÿýÿýÿÿÿýÿýÿþÿÿÿÿÿýÿýÿÿ ÿÿÿþÿþÿþÿýÿþÿþÿÿÿþÿüÿþÿþÿûÿùÿþÿþÿÿÿÿÿüÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿýÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿ       ÿÿÿýÿüÿûÿúÿùÿúÿûÿúÿùÿùÿûÿüÿûÿüÿýÿûÿúÿúÿú&8ÿþÿûÿúÿúÿýÿüÿüÿýÿûÿúÿûÿûÿûÿýÿþÿýÿþÿÿÿÿÿýÿúÿúÿüÿþÿüÿûÿûÿûÿúÿúÿûÿüÿýÿýÿþÿþÿýÿÿÿÿÿþÿüÿûÿüÿüÿýÿüÿüÿÿÿÿÿýÿüÿþÿþÿýÿþÿÿÿÿÿÿÿýÿüÿÿÿþÿýÿÿÿþÿþÿýÿÿÿÿÿÿÿüÿÿÿþÿûÿüÿÿÿÿÿûÿüÿþÿýÿüÿýÿýÿÿÿýÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿþÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿ     ÿþÿýÿüÿüÿûÿúÿúÿùÿùÿúÿüÿûÿüÿüÿúÿùÿûÿûÿþÿÿÿüÿûÿüÿûÿýÿüÿûÿùÿùÿúÿúÿûÿúÿúÿûÿüÿüÿýÿþÿûÿùÿüÿýÿûÿúÿüÿüÿùÿøÿûÿüÿýÿüÿûÿýÿþÿÿÿÿÿÿÿýÿúÿûÿþÿûÿûÿýÿþÿþÿþÿþÿÿÿþÿþÿþÿûÿýÿÿÿÿÿþÿýÿüÿÿÿýÿÿÿþÿþÿýÿþÿÿÿþÿþÿÿÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿýÿûÿþÿÿÿÿÿþÿýÿþÿþÿþÿýÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿþÿýÿýÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿ     ÿÿÿÿÿþÿýÿüÿûÿýÿýÿüÿúÿûÿüÿüÿýÿýÿúÿùÿúÿûÿýÿþÿüÿýÿüÿúÿúÿüÿýÿüÿýÿüÿúÿùÿùÿùÿúÿüÿúÿúÿüÿûÿúÿûÿúÿúÿüÿüÿúÿùÿûÿüÿûÿûÿüÿýÿüÿüÿýÿýÿÿÿÿÿþÿÿÿÿÿÿÿûÿûÿþÿüÿøÿúÿþÿýÿýÿýÿþÿýÿüÿþÿþÿûÿþÿÿÿýÿþÿþÿÿÿÿÿýÿýÿýÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿýÿýÿÿÿÿÿÿÿþÿýÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿüÿüÿÿÿÿÿþÿÿÿÿÿýÿýÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿþÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿýÿÿÿÿÿÿÿÿÿÿÿÿ   ÿÿÿÿÿÿÿýÿüÿýÿÿÿþÿûÿûÿüÿûÿüÿüÿüÿüÿüÿüÿüÿûÿûÿýÿûÿúÿûÿûÿûÿüÿûÿùÿûÿúÿùÿúÿûÿûÿûÿÿÿþÿüÿüÿúÿúÿýÿýÿüÿýÿüÿüÿûÿûÿýÿýÿüÿúÿüÿþÿÿÿþÿþÿÿÿüÿûÿýÿüÿùÿùÿûÿüÿüÿüÿüÿûÿûÿüÿüÿüÿýÿþÿüÿýÿþÿÿÿýÿüÿÿÿþÿþÿþÿþÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýÿþÿÿÿþÿþÿþÿþÿüÿþÿþ ÿþÿÿÿÿÿþÿþÿþÿþÿÿÿþÿûÿûÿÿÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿýÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿýÿþÿþÿýÿþÿþÿþÿþÿþÿÿÿÿÿþÿÿÿþÿýÿýÿþÿÿÿÿ  !  ÿÿÿÿÿÿÿþÿþÿþÿýÿüÿüÿûÿûÿüÿýÿûÿüÿýÿüÿüÿûÿúÿúÿûÿûÿüÿýÿýÿüÿûÿúÿûÿûÿùÿùÿûÿûÿûÿþÿÿÿþÿþÿüÿüÿþÿýÿúÿûÿýÿýÿþÿþÿýÿüÿùÿùÿüÿüÿüÿþÿþÿþÿÿÿÿÿüÿüÿüÿûÿùÿùÿúÿúÿúÿúÿûÿüÿüÿûÿüÿýÿýÿþÿÿÿýÿüÿÿÿþÿýÿýÿþÿþÿÿÿþÿýÿýÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿþÿÿÿý ÿÿÿÿÿþÿÿÿýÿüÿüÿüÿÿÿüÿüÿÿÿÿÿÿÿÿÿþÿýÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿþÿÿÿþÿýÿþÿþÿþÿþÿþÿþÿþÿþÿýÿýÿÿ   ""    ÿÿÿÿÿþÿþÿÿÿÿÿþÿýÿüÿüÿüÿþÿþÿüÿüÿüÿúÿûÿúÿùÿùÿûÿüÿýÿþÿýÿýÿüÿûÿúÿùÿúÿûÿúÿûÿýÿþÿþÿýÿüÿüÿÿÿÿÿüÿúÿúÿúÿüÿþÿýÿüÿúÿøÿûÿüÿøÿùÿüÿþÿþÿýÿýÿýÿýÿüÿúÿúÿùÿúÿûÿûÿúÿûÿüÿüÿüÿÿÿÿÿýÿýÿþÿÿÿÿÿýÿýÿÿÿÿÿüÿûÿþÿÿÿþÿþÿýÿýÿÿÿÿÿýÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿ ÿþÿÿÿþÿÿÿýÿýÿÿÿþÿÿÿÿÿþÿþÿþÿýÿÿÿÿÿþÿþÿüÿüÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿþÿþÿÿÿþÿþÿþÿýÿÿÿÿÿÿ   "!"#""! !!  ÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿýÿüÿýÿýÿýÿüÿüÿûÿúÿûÿùÿúÿüÿýÿýÿþÿþÿýÿûÿúÿøÿøÿùÿûÿûÿûÿüÿýÿýÿýÿüÿúÿûÿýÿýÿýÿýÿûÿûÿûÿûÿûÿùÿøÿúÿúÿøÿ÷ÿúÿýÿýÿúÿüÿýÿûÿúÿúÿùÿúÿüÿýÿýÿûÿúÿüÿüÿþÿÿÿýÿüÿýÿþÿþÿÿÿýÿýÿþÿÿÿûÿüÿþÿÿÿþÿÿÿþÿÿÿÿÿýÿüÿýÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿ+)ÿýÿûÿýÿþÿÿÿÿÿþÿüÿýÿÿÿþÿÿÿÿÿþÿþÿüÿýÿþÿýÿüÿýÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿþÿþÿÿÿþÿÿÿþÿþÿþÿÿÿÿ   "#$$#"    ÿÿÿþÿÿÿÿÿýÿýÿÿÿÿÿýÿýÿüÿüÿüÿüÿûÿúÿûÿûÿûÿùÿûÿýÿýÿýÿýÿþÿýÿùÿ÷ÿøÿûÿüÿúÿüÿüÿûÿüÿþÿýÿûÿûÿúÿúÿûÿüÿüÿüÿüÿûÿýÿûÿøÿûÿûÿ÷ÿøÿúÿüÿýÿþÿûÿúÿüÿûÿúÿúÿùÿùÿûÿúÿüÿÿÿûÿùÿþÿþÿüÿüÿýÿüÿþÿÿÿüÿýÿþÿþÿüÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿüÿýÿüÿþÿÿÿÿÿÿÿþÿÿÿþ*(ÿþÿþÿüÿþÿþÿüÿúÿþÿþÿþÿÿÿþÿýÿþÿÿÿýÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿýÿþÿÿÿþÿýÿþÿÿÿþÿþÿþÿýÿþÿÿÿÿÿÿ    "!"#$#!    ÿÿÿÿÿþÿþÿÿÿÿÿýÿüÿüÿüÿýÿüÿüÿûÿúÿúÿúÿüÿûÿûÿüÿûÿûÿûÿüÿúÿùÿûÿýÿüÿúÿûÿþÿýÿúÿüÿþÿýÿüÿûÿùÿûÿüÿûÿúÿúÿûÿþÿþÿûÿûÿüÿúÿùÿùÿúÿüÿüÿþÿþÿþÿýÿüÿüÿúÿùÿùÿ÷ÿùÿþÿþÿùÿûÿÿÿþÿýÿýÿýÿûÿúÿýÿþÿþÿþÿýÿýÿýÿýÿýÿþÿüÿýÿÿÿþÿþÿÿÿÿÿýÿýÿýÿûÿÿÿþÿÿÿÿÿÿ  ÿÿÿþÿÿÿûÿúÿüÿþÿþÿüÿþÿÿÿýÿþÿþÿýÿþÿÿÿþÿþÿÿÿÿÿþÿþÿþÿþÿÿÿþÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿýÿþÿþÿþÿþÿýÿýÿþÿÿÿþÿþÿþÿÿÿÿ   "#"!!     ÿÿÿþÿÿÿþÿýÿûÿûÿûÿüÿüÿüÿúÿúÿúÿûÿüÿûÿûÿúÿùÿùÿùÿúÿúÿûÿýÿýÿûÿúÿûÿüÿûÿûÿûÿýÿýÿüÿûÿüÿýÿþÿýÿûÿúÿûÿýÿüÿüÿûÿøÿùÿúÿøÿøÿúÿûÿÿÿþÿüÿúÿùÿöÿ÷ÿüÿÿÿüÿûÿüÿüÿüÿþÿýÿüÿûÿüÿüÿûÿþÿþÿûÿüÿþÿÿÿþÿûÿûÿÿÿÿÿþÿýÿÿÿþÿþÿÿÿþÿýÿýÿÿÿÿÿýÿÿÿÿ ÿýÿùÿùÿûÿýÿþÿþÿþÿÿÿÿÿÿÿÿÿþÿýÿþÿýÿýÿýÿþÿþÿýÿýÿþÿþÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿþÿÿÿÿÿÿÿþÿÿÿÿÿþÿýÿþÿýÿþÿþÿþÿþÿÿÿÿ  "!    ÿÿÿþÿýÿýÿýÿüÿûÿûÿûÿúÿúÿúÿûÿüÿûÿùÿùÿúÿúÿúÿúÿûÿüÿûÿúÿùÿûÿüÿúÿùÿúÿúÿúÿüÿüÿûÿûÿûÿüÿüÿüÿüÿüÿûÿüÿýÿûÿùÿùÿùÿùÿøÿøÿøÿûÿÿÿÿÿþÿüÿúÿ÷ÿöÿøÿüÿýÿýÿþÿüÿúÿüÿþÿþÿüÿüÿþÿýÿûÿûÿýÿûÿúÿýÿÿÿþÿüÿûÿþÿÿÿÿÿþÿþÿþÿÿÿýÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿþÿÿÿþÿýÿýÿüÿþÿûÿýÿÿÿþÿÿÿþÿýÿýÿþÿþÿþÿþÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿþÿþÿÿÿþÿþÿþÿþÿþÿþÿþÿÿÿÿ !"       ÿþÿýÿþÿþÿýÿýÿýÿûÿúÿúÿúÿúÿûÿúÿùÿúÿüÿýÿýÿýÿüÿûÿúÿúÿùÿúÿûÿúÿúÿúÿøÿúÿûÿûÿûÿûÿùÿùÿúÿûÿüÿûÿüÿþÿüÿúÿüÿúÿøÿúÿùÿ÷ÿøÿýÿþÿþÿþÿûÿùÿõÿ÷ÿûÿüÿûÿýÿþÿûÿûÿýÿýÿýÿýÿþÿýÿúÿûÿüÿûÿüÿýÿýÿýÿýÿûÿûÿþÿÿÿÿÿýÿüÿÿÿþÿþÿüÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿþÿÿÿÿÿÿÿÿÿþÿýÿÿÿÿÿþÿþÿýÿüÿþÿÿÿþÿÿÿþÿýÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿýÿþÿÿÿÿÿþÿþÿþÿþÿþÿÿÿÿ  !!"   ÿÿÿÿÿÿÿþÿþÿýÿýÿüÿûÿûÿûÿúÿûÿúÿúÿûÿüÿýÿûÿûÿûÿúÿøÿøÿúÿúÿúÿúÿúÿùÿøÿ÷ÿùÿúÿûÿüÿûÿùÿøÿùÿûÿúÿùÿûÿüÿúÿûÿýÿøÿøÿúÿøÿ÷ÿøÿýÿÿÿùÿõÿ÷ÿüÿûÿùÿûÿýÿýÿüÿþÿýÿüÿþÿþÿûÿúÿúÿúÿúÿýÿÿÿüÿüÿýÿýÿûÿüÿýÿÿÿÿÿÿÿþÿýÿýÿþÿþÿþÿýÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿýÿüÿþÿþÿýÿÿÿþÿþÿÿÿýÿþÿþÿÿÿþÿþÿÿÿþÿýÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿþÿÿÿþÿýÿýÿýÿýÿþ ! !"#"     ÿÿÿÿÿÿÿÿÿÿÿýÿüÿüÿüÿýÿýÿýÿûÿûÿüÿüÿûÿùÿùÿùÿùÿùÿøÿúÿûÿúÿøÿøÿøÿ÷ÿøÿúÿúÿûÿûÿúÿùÿùÿûÿúÿùÿùÿùÿùÿùÿúÿûÿùÿøÿúÿúÿ÷ÿôÿûÿþÿôÿóÿúÿýÿûÿûÿüÿúÿýÿýÿýÿýÿýÿÿÿûÿøÿúÿûÿúÿûÿþÿýÿûÿýÿýÿüÿüÿüÿýÿþÿÿÿÿÿýÿþÿþÿÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýÿþÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿþÿþÿþÿþÿÿÿÿÿýÿüÿýÿýÿýÿÿ  ""##"      ÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿþÿýÿüÿúÿùÿúÿûÿýÿûÿúÿûÿûÿüÿûÿùÿøÿùÿúÿúÿúÿûÿúÿúÿúÿùÿùÿúÿûÿúÿùÿùÿùÿøÿùÿúÿüÿùÿøÿúÿûÿöÿõÿøÿþÿúÿòÿöÿúÿøÿúÿüÿüÿüÿþÿûÿûÿýÿýÿüÿùÿúÿüÿûÿüÿýÿýÿýÿþÿþÿýÿþÿýÿüÿüÿýÿþÿÿÿÿÿýÿþÿýÿþÿýÿÿÿþÿþÿÿÿÿÿÿÿýÿÿÿþÿþÿÿÿþÿýÿüÿþÿÿÿýÿýÿÿÿÿÿýÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿýÿýÿþÿþÿýÿþÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿþÿþÿþÿþÿÿÿÿÿýÿüÿýÿþÿÿ  !!  ""##!    ÿÿÿÿÿÿÿÿÿþÿÿÿýÿþÿýÿûÿúÿúÿüÿýÿþÿüÿüÿüÿûÿûÿúÿúÿúÿûÿûÿúÿùÿùÿùÿúÿûÿüÿùÿøÿùÿøÿùÿùÿùÿ÷ÿùÿûÿúÿ÷ÿöÿöÿ÷ÿùÿöÿôÿÿÿôÿôÿøÿ÷ÿöÿûÿúÿúÿüÿüÿûÿüÿûÿùÿúÿúÿûÿûÿûÿüÿüÿþÿÿÿÿÿÿÿüÿýÿýÿüÿýÿþÿÿÿýÿýÿþÿþÿüÿÿÿþÿýÿüÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿþÿýÿýÿýÿûÿÿÿþÿýÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿýÿýÿþÿýÿÿÿÿÿüÿýÿÿÿþÿýÿýÿþÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿýÿþÿÿÿÿÿÿÿþÿýÿýÿþÿþÿÿÿÿÿþÿþÿÿÿþÿýÿýÿþÿÿ !$&'$! "##!    ÿÿÿýÿüÿüÿþÿþÿþÿþÿüÿûÿýÿýÿýÿüÿûÿûÿüÿüÿúÿùÿùÿúÿùÿùÿùÿøÿøÿøÿùÿûÿüÿûÿøÿ÷ÿ÷ÿøÿúÿúÿùÿùÿúÿúÿøÿ÷ÿöÿôÿ÷ÿùÿöÿõÿùÿöÿõÿ÷ÿúÿýÿúÿùÿúÿûÿýÿüÿùÿùÿûÿüÿûÿúÿûÿûÿüÿþÿþÿþÿýÿÿÿýÿûÿýÿýÿþÿþÿÿÿþÿÿÿýÿýÿþÿûÿûÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿüÿþÿÿÿÿÿþÿÿÿþÿþÿýÿýÿýÿÿÿþÿýÿÿÿþÿýÿüÿýÿþÿþÿýÿÿÿÿÿýÿýÿþÿÿÿÿÿþÿýÿþÿÿÿÿÿÿÿþÿýÿÿÿþÿÿÿþÿýÿýÿþÿÿÿÿÿÿÿþÿýÿýÿýÿþÿþÿþÿþÿþÿþÿþÿýÿýÿÿ  #'*+($!!$$"     ÿÿÿýÿýÿýÿþÿÿÿÿÿþÿüÿýÿþÿýÿýÿýÿüÿûÿüÿüÿûÿùÿùÿùÿ÷ÿ÷ÿùÿùÿúÿùÿúÿûÿúÿùÿ÷ÿøÿøÿúÿûÿúÿûÿúÿùÿùÿúÿùÿùÿøÿøÿùÿùÿ÷9½˜ÿøÿøÿûÿüÿüÿûÿûÿúÿûÿüÿúÿúÿüÿüÿüÿüÿûÿúÿûÿýÿýÿýÿþÿýÿÿÿÿÿüÿüÿýÿþÿÿÿÿÿÿÿýÿÿÿþÿýÿüÿûÿüÿþÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿýÿþÿþÿÿÿþÿýÿüÿþÿÿÿþÿüÿýÿÿÿýÿýÿýÿýÿþÿÿÿÿÿþÿþÿþÿýÿþÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿýÿýÿýÿþÿÿÿÿÿþÿýÿýÿþÿÿÿýÿýÿþÿýÿþÿþÿþÿþÿÿ !%(+,+&!"$$%%$"   ÿÿÿÿÿÿÿÿÿÿÿýÿýÿýÿþÿÿÿþÿÿÿþÿüÿûÿûÿûÿûÿûÿûÿùÿùÿúÿûÿûÿûÿúÿúÿúÿúÿùÿøÿùÿúÿúÿúÿúÿùÿùÿùÿúÿúÿûÿùÿúÿüÿø›xBÿüÿüÿûÿüÿûÿüÿûÿúÿúÿûÿüÿüÿûÿüÿüÿúÿúÿûÿüÿýÿþÿþÿýÿþÿýÿüÿûÿýÿþÿþÿüÿýÿþÿÿÿýÿüÿüÿûÿþÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿýÿþÿÿÿÿÿþÿýÿüÿýÿþÿûÿýÿþÿûÿüÿÿÿÿÿÿÿýÿÿÿÿÿþÿÿÿÿÿÿÿÿÿýÿüÿýÿþÿýÿýÿþÿÿÿÿÿþÿþÿþÿýÿÿÿÿÿÿÿÿÿýÿüÿþÿÿÿÿÿÿÿÿÿþÿýÿþÿþÿþÿþÿþÿþÿÿÿÿÿÿ   !#%)-/,&! ""!#&'&$$"!  ÿÿÿÿÿÿÿþÿþÿüÿüÿüÿüÿþÿþÿýÿüÿüÿûÿûÿûÿûÿûÿûÿüÿûÿùÿùÿúÿúÿûÿúÿùÿùÿùÿùÿúÿùÿùÿùÿûÿùÿ÷vÝ”%ÿúÿüÿýÿüÿûÿúÿúÿúÿûÿüÿûÿûÿüÿýÿûÿúÿúÿûÿûÿüÿþÿþÿÿÿþÿüÿüÿýÿüÿûÿþÿýÿûÿûÿýÿþÿüÿüÿýÿüÿûÿþÿþÿþÿÿÿþÿþÿþÿþÿþÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿýÿýÿþÿþÿþÿÿÿýÿþÿýÿþÿþÿþÿþÿüÿüÿÿÿÿÿÿÿýÿüÿÿÿþÿþÿþÿÿÿÿÿüÿýÿþÿþÿþÿþÿýÿþÿþÿþÿþÿýÿýÿþÿÿÿÿÿÿÿÿÿþÿýÿýÿþÿþÿÿÿÿÿÿÿýÿüÿýÿþÿþÿýÿþÿÿÿÿ  ! "$$#%(+.-*%! !$%$ !"!"$%%%! !""  ÿÿÿÿÿýÿþÿÿÿþÿüÿýÿþÿþÿýÿýÿýÿüÿüÿüÿûÿüÿûÿüÿýÿüÿûÿùÿúÿúÿúÿúÿùÿùÿùÿøÿøÿùÿ÷ÿ÷ÿúÿùÿú ÿúÿùÿÿÿüÿûÿüÿúÿùÿûÿüÿûÿüÿýÿüÿüÿûÿûÿúÿüÿýÿüÿýÿüÿýÿýÿûÿüÿüÿûÿüÿþÿüÿûÿýÿþÿûÿúÿýÿþÿüÿûÿýÿþÿýÿþÿÿÿþÿýÿýÿýÿÿÿþÿÿÿýÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿþÿýÿþÿýÿüÿþÿÿÿýÿÿÿÿÿüÿýÿýÿþÿÿÿÿÿýÿüÿüÿÿÿþÿÿÿýÿýÿÿÿþÿÿÿÿÿÿÿþÿýÿþÿþÿýÿÿÿÿÿÿÿþÿþÿþÿþÿþÿÿÿþÿüÿþÿÿÿþÿþÿÿÿþÿýÿþÿÿÿÿÿþÿýÿýÿþÿþÿýÿþÿÿÿÿ   $&%%&(*)((&$%%')'#  "" #%&'#!  !"##""%'&%#    ÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿþÿþÿýÿþÿþÿþÿýÿýÿýÿþÿýÿûÿüÿýÿüÿûÿûÿùÿøÿùÿùÿùÿúÿùÿøÿøÿ÷ÿöÿ÷ÿøÿûÿÿÿ÷ÿòÿøÿüÿùÿøÿúÿüÿüÿýÿûÿùÿúÿûÿûÿüÿþÿüÿúÿûÿúÿúÿüÿþÿþÿýÿýÿüÿûÿûÿûÿûÿûÿüÿüÿüÿýÿþÿþÿýÿüÿûÿýÿþÿüÿüÿþÿþÿýÿþÿþÿýÿþÿþÿýÿÿÿÿÿÿÿþÿýÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿÿÿÿÿþÿÿÿüÿûÿþÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿüÿýÿþÿþÿþÿþÿþÿýÿÿÿÿÿþÿýÿÿÿÿÿþÿþÿÿÿþÿþÿÿÿÿÿýÿüÿþÿþÿþÿÿÿÿÿýÿýÿþÿÿÿÿÿþÿþÿþÿþÿþÿþÿÿ  !$%$"#$$#&()+-,+'""$$%%$$&()(%#"!"$%&&'(*)(&# ÿÿÿþÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿþÿýÿýÿþÿýÿüÿýÿüÿúÿûÿûÿúÿùÿùÿùÿùÿúÿùÿùÿøÿ÷ÿøÿøÿüÿÿÿøÿ÷ÿøÿöÿ÷ÿúÿúÿøÿùÿüÿüÿùÿøÿúÿûÿýÿýÿüÿúÿúÿúÿúÿûÿýÿýÿüÿüÿüÿýÿüÿûÿúÿúÿûÿüÿüÿüÿþÿýÿüÿüÿüÿüÿýÿýÿýÿþÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿþÿýÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿýÿþÿþÿÿÿþÿþÿþÿþÿÿÿÿÿþÿÿÿþÿÿÿþÿûÿþÿþÿþÿþÿýÿþÿÿÿÿÿþÿýÿÿÿÿÿþÿþÿþÿþÿþÿþÿþÿýÿýÿýÿþÿÿÿþÿþÿýÿýÿýÿþÿÿÿÿÿþÿþÿþÿþÿþÿÿÿÿ   !""!  $'*./-)%#&))'(()*++*'$%%%%'))+-+(&$   ÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿþÿüÿúÿüÿýÿüÿüÿýÿüÿûÿüÿüÿüÿûÿúÿùÿùÿùÿøÿùÿùÿùÿùÿûÿÿÿýÿùÿùÿûÿöÿôÿøÿûÿûÿúÿúÿùÿùÿùÿøÿûÿüÿýÿüÿûÿûÿúÿùÿüÿýÿûÿûÿûÿúÿûÿýÿûÿûÿúÿúÿúÿûÿüÿýÿýÿüÿüÿýÿüÿüÿýÿþÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿýÿÿÿÿÿþÿþÿÿÿþÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿýÿýÿþÿþÿþÿýÿýÿÿÿÿÿþÿþÿÿÿþÿýÿýÿþÿþÿþÿþÿýÿýÿÿÿÿÿþÿþÿýÿýÿþÿþÿþÿþÿýÿýÿþÿÿÿÿ   ! !#&)+*(%$%),+)))+-.--+((**((,..-*'%!  ÿÿÿÿÿþÿýÿþÿÿÿÿÿþÿþÿüÿûÿûÿüÿüÿýÿþÿýÿýÿýÿþÿýÿüÿûÿúÿúÿúÿøÿøÿúÿùÿ÷ÿúÿýÿúÿøÿûÿüÿ÷ÿöÿøÿøÿùÿýÿüÿùÿùÿúÿûÿúÿûÿûÿúÿûÿûÿúÿúÿüÿüÿúÿúÿüÿüÿüÿüÿüÿûÿúÿúÿúÿúÿüÿýÿüÿüÿþÿÿÿþÿýÿýÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿýÿýÿÿÿþÿýÿýÿýÿýÿþÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿýÿþÿþÿþÿþÿÿÿÿ  !  !""#$%'&# !$&*,+*++-/0//.---,*),00,'%#   ÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿüÿüÿýÿýÿþÿþÿþÿýÿþÿþÿþÿýÿüÿûÿúÿúÿúÿùÿûÿüÿøÿ÷ÿúÿùÿ÷ÿúÿüÿúÿùÿùÿøÿøÿúÿüÿûÿûÿüÿûÿúÿûÿúÿùÿúÿüÿûÿùÿûÿüÿúÿúÿüÿüÿüÿýÿýÿýÿûÿûÿûÿúÿúÿüÿûÿûÿýÿÿÿÿÿýÿýÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿþÿþÿÿÿþÿýÿÿÿÿÿþÿþÿýÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿüÿýÿýÿþÿþÿþÿþÿýÿýÿýÿþÿÿÿÿÿÿÿÿÿýÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿ  !#"!!!"#$$"!"'++*+-..010/--/.++*+--*&$#  ÿÿÿþÿÿÿÿÿýÿýÿýÿýÿþÿþÿýÿýÿþÿÿÿþÿýÿüÿüÿúÿúÿúÿûÿüÿúÿúÿúÿøÿ÷ÿùÿûÿúÿúÿùÿöÿõÿ÷ÿùÿûÿüÿýÿüÿúÿùÿùÿùÿúÿüÿûÿúÿûÿüÿûÿûÿüÿüÿûÿüÿüÿüÿüÿýÿýÿüÿùÿùÿúÿúÿýÿþÿþÿÿÿþÿüÿýÿÿÿÿÿÿÿÿÿýÿýÿþÿþÿþÿÿÿþÿýÿþÿþÿþÿþÿüÿþÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿýÿþÿÿÿýÿÿÿÿÿþÿÿÿÿÿÿÿÿÿýÿþÿýÿûÿûÿþÿþÿýÿýÿþÿþÿþÿýÿýÿþÿÿÿÿÿÿÿÿÿþÿýÿþÿýÿýÿÿÿÿÿÿÿÿÿþÿþÿÿ !! "$%#"! "#"$*+)()-..010/.---+*++++)'&# ÿÿÿþÿþÿþÿþÿþÿýÿüÿüÿýÿþÿýÿýÿþÿþÿýÿüÿúÿúÿúÿûÿúÿùÿûÿúÿ÷ÿ÷ÿúÿúÿùÿùÿøÿöÿöÿ÷ÿöÿøÿûÿüÿüÿüÿúÿøÿøÿúÿûÿûÿúÿúÿúÿúÿûÿüÿûÿûÿûÿûÿûÿûÿüÿþÿÿÿüÿúÿùÿùÿûÿýÿýÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿþÿþÿþÿþÿÿÿþÿýÿýÿýÿþÿÿÿÿÿþÿþÿüÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿþÿýÿýÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿýÿûÿýÿýÿüÿüÿþÿþÿýÿýÿýÿþÿþÿÿÿÿÿÿÿÿÿýÿýÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿ !##"##$%$"  !! !).+''),,.23100...+**++,*'%"  ÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿýÿüÿýÿýÿýÿýÿýÿüÿüÿüÿýÿûÿûÿûÿüÿûÿùÿúÿûÿøÿõÿøÿûÿùÿùÿøÿ÷ÿ÷ÿ÷ÿöÿöÿøÿøÿûÿýÿûÿùÿùÿúÿúÿúÿùÿøÿøÿùÿúÿûÿüÿüÿüÿûÿûÿûÿýÿþÿÿÿþÿýÿûÿúÿûÿüÿüÿüÿýÿþÿÿÿÿÿþÿÿÿþÿþÿþÿþÿþÿýÿýÿýÿüÿýÿýÿüÿýÿþÿþÿþÿþÿýÿüÿüÿýÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿýÿýÿÿÿÿÿþÿþÿÿÿÿÿÿÿýÿþÿÿÿÿÿÿÿþÿÿÿýÿþÿÿÿýÿûÿýÿþÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿüÿþÿÿÿþÿþÿÿÿþÿüÿüÿýÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿýÿþÿþÿþÿÿÿÿ   !! #''%%%$$%%$"""!"""" #)./,)+--+.34311000-***++(%#! ÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿýÿüÿüÿýÿþÿþÿýÿüÿüÿüÿýÿüÿûÿüÿýÿýÿüÿûÿûÿúÿøÿùÿúÿùÿúÿúÿùÿøÿøÿöÿ÷ÿøÿ÷ÿøÿûÿüÿúÿúÿúÿúÿúÿúÿùÿøÿøÿùÿúÿúÿüÿýÿüÿûÿüÿüÿþÿÿÿýÿþÿýÿûÿûÿüÿüÿüÿüÿüÿýÿýÿýÿýÿýÿþÿÿÿÿÿþÿþÿýÿýÿüÿüÿþÿýÿûÿýÿÿÿþÿýÿüÿýÿýÿûÿþÿÿÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿýÿýÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿýÿýÿþÿÿÿþÿüÿþÿÿÿþÿýÿþÿÿÿþÿþÿýÿþÿÿÿýÿýÿýÿþÿþÿþÿÿÿÿÿþÿþÿþÿýÿþÿþÿþÿÿ !$$$&'(+-+('&&&&'''&%##$%%#"(.0/---..-.1322442/.+))('%##"   ÿþÿýÿþÿÿÿÿÿþÿüÿüÿýÿüÿüÿýÿýÿýÿýÿþÿýÿüÿüÿüÿþÿÿÿýÿûÿúÿùÿúÿûÿúÿùÿúÿøÿøÿùÿ÷ÿ÷ÿøÿøÿøÿùÿúÿûÿüÿûÿúÿúÿúÿúÿúÿúÿùÿøÿùÿúÿüÿûÿûÿûÿûÿýÿþÿüÿüÿýÿüÿûÿûÿúÿûÿüÿûÿüÿýÿûÿüÿýÿüÿýÿÿÿþÿýÿþÿýÿüÿýÿþÿÿÿýÿûÿýÿÿÿþÿüÿüÿüÿüÿýÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿýÿþÿÿÿÿÿþÿþÿýÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿûÿþÿÿÿþÿþÿþÿÿÿþÿüÿýÿþÿþÿþÿþÿþÿþÿþÿýÿÿÿþÿþÿþÿþÿÿÿÿÿÿ   #%'((*,./0.,*(''(())*)'$##%''',110//-,./00/02573/-*('&%##"!   ÿÿÿÿÿþÿþÿþÿþÿýÿýÿýÿýÿûÿûÿüÿüÿüÿýÿþÿþÿüÿüÿýÿüÿýÿýÿüÿûÿúÿùÿùÿùÿøÿùÿúÿùÿùÿùÿøÿøÿøÿøÿøÿ÷ÿúÿüÿüÿûÿúÿúÿúÿúÿúÿúÿøÿøÿùÿùÿùÿûÿüÿúÿüÿþÿýÿüÿüÿüÿûÿûÿúÿúÿûÿûÿûÿýÿüÿüÿýÿüÿüÿýÿýÿýÿþÿþÿýÿýÿþÿÿÿÿÿýÿýÿþÿþÿýÿüÿüÿýÿýÿýÿþÿþÿÿÿÿÿþÿþÿþÿþÿýÿýÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿýÿýÿÿÿÿÿÿÿþÿÿÿýÿþÿýÿüÿýÿþÿþÿýÿýÿþÿÿÿÿÿÿÿþÿþÿÿ   !$%&),-./011/,+**+***+*)($""#&+./232100-,-032/.14651.*(('$##! ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿüÿüÿüÿýÿþÿþÿþÿþÿýÿýÿýÿýÿüÿüÿþÿýÿüÿúÿùÿúÿûÿúÿúÿûÿûÿúÿøÿùÿøÿùÿøÿöÿ÷ÿúÿüÿûÿúÿùÿùÿúÿúÿùÿøÿ÷ÿùÿùÿùÿúÿüÿüÿûÿüÿýÿýÿüÿûÿûÿûÿûÿûÿûÿûÿúÿüÿüÿûÿüÿüÿûÿüÿüÿüÿýÿýÿýÿýÿýÿþÿþÿÿÿÿÿÿÿþÿþÿþÿýÿýÿýÿýÿüÿýÿþÿþÿÿÿÿÿþÿþÿýÿüÿýÿÿÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿþÿýÿþÿÿÿüÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿýÿýÿýÿþÿþÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿÿ   !"#" !%*+*+/12321/,+++-..,,,)&#!!"%)/24541//0.+,14311478753/+*)%$$" ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿÿÿþÿýÿþÿÿÿþÿýÿýÿýÿýÿüÿüÿþÿþÿýÿûÿúÿûÿüÿüÿûÿûÿúÿùÿùÿùÿùÿùÿùÿøÿ÷ÿøÿúÿûÿüÿùÿøÿûÿúÿùÿùÿùÿùÿùÿùÿûÿüÿûÿûÿûÿûÿüÿýÿüÿûÿûÿûÿüÿûÿûÿûÿüÿüÿüÿýÿüÿûÿüÿüÿüÿýÿýÿüÿüÿýÿýÿýÿþÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿüÿüÿýÿýÿýÿýÿÿÿþÿýÿýÿýÿþÿþÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿþÿþÿþÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿýÿýÿþÿþÿýÿþÿþÿÿÿþÿýÿýÿþÿÿÿÿÿÿ   #$%%%%&+/0/.134210.,-./010.,*(&#"$&)-14541/..//./243248;==:730-*(&%$! !  ÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿþÿþÿþÿýÿýÿüÿûÿúÿûÿûÿûÿýÿýÿüÿüÿúÿúÿûÿûÿûÿùÿùÿúÿûÿúÿùÿúÿûÿùÿøÿùÿùÿúÿûÿúÿùÿúÿûÿùÿùÿùÿùÿøÿùÿúÿüÿüÿûÿûÿúÿúÿüÿüÿûÿúÿúÿûÿüÿûÿûÿüÿüÿýÿþÿýÿýÿýÿüÿýÿýÿýÿýÿþÿýÿýÿýÿþÿÿÿþÿýÿþÿÿÿþÿþÿþÿýÿüÿýÿþÿýÿüÿýÿÿÿÿÿýÿýÿþÿþÿþÿýÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿþÿþÿýÿýÿþÿþÿþÿþÿýÿþ !#"!! #'(''()+/12223542210/023553/+''((((+.036530///0133332259=@@;6320-+)'%$"  !!"#! ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿüÿýÿýÿüÿýÿüÿûÿûÿûÿûÿüÿûÿûÿýÿüÿúÿúÿúÿúÿûÿùÿùÿüÿüÿûÿúÿûÿûÿúÿùÿùÿúÿûÿûÿûÿúÿùÿùÿúÿúÿùÿøÿøÿùÿûÿûÿûÿüÿûÿúÿúÿûÿûÿûÿûÿúÿûÿúÿûÿüÿûÿüÿÿÿþÿýÿýÿüÿûÿþÿýÿýÿþÿÿÿýÿýÿýÿýÿýÿýÿþÿÿÿþÿþÿþÿþÿýÿýÿýÿýÿýÿüÿýÿÿÿþÿüÿýÿþÿýÿýÿýÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿýÿþÿýÿýÿýÿýÿþÿÿÿþÿýÿþ #%#"#""'****+,.11233442221013446640+(()-.-/01465321221123431269<?>:4221/,*'%$"! !$%$""!   ÿÿÿÿÿÿÿÿÿþÿýÿýÿþÿÿÿÿÿýÿüÿüÿûÿûÿýÿþÿüÿûÿûÿüÿüÿûÿýÿþÿýÿûÿúÿûÿüÿûÿûÿûÿûÿúÿúÿûÿûÿûÿûÿùÿùÿùÿûÿýÿýÿúÿøÿùÿûÿùÿ÷ÿ÷ÿùÿûÿúÿùÿûÿüÿúÿúÿúÿúÿûÿüÿûÿúÿùÿûÿüÿûÿûÿýÿþÿýÿýÿýÿûÿüÿýÿüÿþÿÿÿþÿýÿýÿýÿüÿüÿýÿÿÿÿÿþÿþÿýÿýÿþÿýÿýÿþÿýÿüÿýÿþÿþÿýÿýÿýÿüÿýÿýÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿþÿþÿÿÿÿÿþÿýÿþÿþÿýÿýÿÿÿÿÿþÿþÿÿ "$$#%&&),-,,-.12112232/01//1343330.+**,/0//11244333431001232258;=<8520/.,)'&$!"#" !!$&(&###"!   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿýÿüÿüÿüÿýÿýÿûÿúÿüÿüÿúÿûÿþÿþÿýÿûÿúÿüÿýÿüÿüÿûÿûÿûÿûÿûÿûÿûÿûÿúÿùÿùÿüÿþÿûÿúÿúÿúÿúÿùÿøÿøÿûÿûÿúÿúÿûÿûÿúÿúÿùÿúÿüÿüÿûÿúÿúÿûÿûÿúÿûÿüÿýÿþÿýÿüÿüÿüÿûÿýÿÿÿþÿþÿýÿüÿüÿüÿüÿýÿÿÿþÿýÿýÿýÿþÿýÿýÿþÿþÿýÿüÿýÿþÿþÿýÿüÿýÿýÿýÿýÿþÿÿÿÿÿÿÿþÿýÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿýÿýÿþÿÿÿþÿÿÿÿÿÿ "! !#%'()*+-0/-.134101210.././13442/,***+,.///1233444552/010122226:;:641.,))(&'&##$" "#$%'('%$##"!   ÿþÿþÿþÿýÿÿÿÿÿÿÿþÿþÿýÿüÿüÿýÿþÿýÿüÿüÿýÿýÿûÿúÿüÿýÿþÿýÿüÿûÿüÿýÿýÿýÿüÿüÿüÿûÿûÿûÿúÿüÿüÿùÿúÿüÿûÿúÿûÿúÿúÿúÿúÿùÿùÿúÿûÿûÿûÿúÿûÿûÿúÿùÿûÿüÿüÿüÿüÿúÿúÿúÿûÿüÿüÿþÿÿÿýÿüÿüÿûÿûÿüÿýÿýÿýÿüÿûÿûÿüÿüÿüÿþÿýÿüÿýÿþÿýÿýÿýÿþÿÿÿýÿýÿþÿÿÿþÿýÿüÿþÿýÿüÿýÿÿÿÿÿþÿþÿþÿþÿýÿþÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿýÿþÿÿÿÿÿÿÿÿÿÿ !##!  #%(+,---/33102443111/.--..145541.*))))*+-..1345556751/12000121367630/.+(''&''&$#! !#$&'&%&'&$$$#"  ÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿýÿþÿýÿüÿüÿýÿýÿþÿýÿýÿÿÿþÿüÿüÿýÿýÿþÿþÿýÿûÿûÿüÿýÿýÿýÿüÿüÿûÿûÿüÿüÿüÿüÿûÿùÿûÿûÿûÿüÿûÿùÿúÿûÿúÿùÿùÿûÿüÿûÿùÿúÿûÿûÿûÿûÿûÿûÿüÿüÿúÿùÿûÿüÿûÿüÿýÿýÿþÿýÿüÿûÿûÿûÿûÿýÿýÿüÿûÿûÿûÿüÿûÿüÿýÿýÿüÿýÿýÿýÿýÿýÿÿÿÿÿýÿþÿÿÿþÿþÿýÿýÿýÿýÿüÿýÿÿÿÿÿýÿýÿÿÿþÿýÿþÿþÿýÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿüÿýÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿþ !!""""""#%&*.11/035753344432/../001477520/,**(&'*,,.12455679620120/012233441.--,+)'''('%##$%&'()(&&&&&&%$#  ÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿýÿüÿüÿýÿýÿýÿýÿýÿþÿýÿûÿüÿþÿÿÿþÿþÿýÿüÿüÿüÿüÿþÿþÿýÿüÿûÿûÿüÿþÿþÿûÿúÿúÿûÿûÿûÿýÿüÿúÿùÿúÿûÿúÿøÿúÿüÿüÿúÿùÿùÿúÿûÿûÿûÿúÿûÿüÿûÿúÿúÿûÿüÿüÿýÿüÿüÿýÿýÿüÿûÿûÿûÿüÿýÿüÿüÿüÿûÿüÿûÿûÿûÿýÿýÿûÿûÿüÿýÿýÿýÿÿÿÿÿþÿÿÿÿÿýÿýÿýÿýÿýÿýÿüÿþÿÿÿþÿýÿýÿþÿþÿþÿþÿýÿýÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿüÿûÿüÿÿÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿÿ !$# #$#"#$&+/45345677667666410124568;93///,'''%&*,-/1244478874221//122444552/,,,-+)(()((('(***)))(('&((&#! ÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿýÿýÿüÿüÿþÿþÿþÿþÿþÿýÿýÿþÿÿÿþÿþÿþÿýÿýÿýÿýÿþÿÿÿþÿýÿüÿûÿüÿýÿýÿüÿúÿúÿûÿûÿûÿýÿýÿûÿúÿúÿûÿûÿúÿúÿüÿüÿûÿüÿúÿùÿùÿúÿûÿûÿùÿûÿüÿûÿüÿûÿúÿüÿýÿüÿüÿýÿýÿýÿüÿúÿúÿüÿüÿûÿûÿüÿüÿüÿüÿûÿûÿüÿüÿüÿüÿûÿüÿýÿýÿýÿýÿþÿþÿþÿþÿýÿýÿýÿþÿþÿýÿþÿÿÿþÿüÿüÿüÿýÿþÿþÿþÿþÿþÿýÿýÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿýÿÿÿÿÿýÿýÿýÿüÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  #&'%#$&%#"#$',0688::99::;;:::854568:<=?:3../+%$%$&),0211224897653330/1344446740.-,.-+*+,+,,**,--+*))*)'''%"   ÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿþÿþÿþÿÿÿþÿþÿÿÿþÿýÿüÿþÿÿÿÿÿýÿýÿÿÿþÿþÿþÿýÿýÿþÿÿÿþÿýÿüÿüÿýÿüÿûÿûÿûÿûÿûÿüÿýÿýÿüÿýÿüÿûÿúÿúÿûÿüÿüÿüÿýÿûÿùÿùÿúÿúÿûÿúÿùÿûÿüÿûÿûÿúÿúÿüÿüÿûÿüÿýÿþÿþÿüÿúÿûÿüÿúÿûÿüÿüÿüÿüÿûÿûÿüÿüÿûÿûÿüÿýÿýÿýÿüÿüÿüÿýÿþÿýÿþÿýÿýÿýÿþÿþÿþÿþÿþÿþÿüÿüÿüÿüÿþÿÿÿÿÿþÿýÿüÿýÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿýÿýÿÿÿÿÿÿÿþÿýÿýÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿ !&)*(''((%$$&(+/379<@@@@@??????=:9:<>>?BC>7/./-(&'(*,/3300125776544453114533566410.-.--,,-,..-,,---,**,,)&$#"!!  !  ÿÿÿÿÿÿÿýÿýÿýÿýÿýÿþÿÿÿþÿþÿÿÿÿÿþÿýÿÿÿÿÿÿÿþÿüÿýÿþÿþÿþÿýÿýÿýÿýÿüÿûÿüÿüÿúÿûÿþÿþÿýÿýÿüÿûÿûÿüÿüÿýÿüÿüÿýÿýÿûÿúÿúÿûÿûÿúÿùÿùÿúÿûÿûÿúÿúÿúÿüÿýÿüÿûÿýÿÿÿþÿýÿüÿüÿûÿúÿûÿüÿüÿüÿûÿúÿûÿüÿüÿûÿûÿüÿýÿýÿûÿûÿûÿüÿýÿþÿþÿýÿýÿýÿýÿþÿýÿýÿýÿþÿþÿýÿüÿüÿýÿÿÿÿÿþÿýÿýÿýÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿþÿÿÿýÿûÿüÿÿÿÿÿÿÿÿÿÿÿÿ  (-.+'(*)'&%')+.258;ADDFEDEEEFFCA@?@ACBBEFB;411.,,,-/02431123333443355543345566531/-,,,,++,,-/.,++*+-,*+,*'$$%#!! "# !! ÿþÿýÿþÿþÿýÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿýÿýÿÿÿÿÿþÿýÿýÿýÿüÿüÿýÿþÿýÿüÿûÿýÿþÿþÿþÿýÿûÿûÿýÿýÿýÿýÿýÿüÿüÿýÿýÿýÿüÿüÿûÿúÿúÿùÿùÿúÿûÿúÿúÿúÿüÿüÿüÿüÿýÿÿÿþÿüÿûÿûÿüÿûÿüÿüÿûÿúÿûÿûÿüÿýÿüÿüÿüÿüÿüÿûÿúÿúÿûÿýÿþÿþÿýÿýÿüÿýÿþÿýÿýÿþÿÿÿþÿýÿýÿüÿþÿÿÿþÿýÿýÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿþÿýÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  %,01/+*,,*('')-/147:@EGHHGGJLLMMJFEEEGHHGHGC=863000//023565432/./243466665457876431.,,+++*,+,./-*)))*,+)()*(&&%$""" "#"!  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿýÿþÿþÿýÿýÿýÿýÿüÿüÿýÿþÿýÿýÿýÿþÿýÿüÿþÿþÿüÿüÿýÿýÿýÿýÿýÿýÿüÿüÿþÿÿÿþÿýÿüÿûÿûÿúÿùÿùÿúÿûÿùÿùÿûÿüÿüÿýÿýÿþÿýÿûÿûÿûÿüÿüÿüÿûÿúÿûÿûÿûÿýÿþÿýÿüÿüÿýÿüÿúÿùÿùÿûÿýÿýÿþÿýÿûÿüÿýÿýÿýÿþÿÿÿÿÿþÿþÿýÿýÿÿÿþÿþÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿ  $)-48631/010-+)),1447:>EIJKKIKNPRTSOLJIKNPOLKHC?<;96642003579:851.,-144578888778754442.,,,+**+*,.-+)))*++**('(*)&%%%%%#""##$$"   ÿÿÿÿÿÿÿþÿþÿþÿÿÿþÿüÿüÿüÿýÿýÿýÿýÿþÿýÿýÿüÿýÿþÿýÿýÿýÿýÿýÿýÿýÿýÿýÿþÿþÿýÿýÿýÿÿÿÿÿþÿüÿüÿüÿüÿûÿúÿúÿûÿúÿùÿúÿûÿûÿüÿüÿüÿÿÿþÿüÿûÿûÿûÿûÿûÿûÿûÿúÿúÿüÿüÿüÿþÿýÿûÿüÿýÿüÿúÿøÿùÿüÿýÿþÿýÿûÿûÿüÿüÿüÿýÿþÿþÿÿÿþÿýÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿþÿýÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿ  %+16;@A;8777652/..1568<?DJNNNPPPRSVZXUROPSUVTRPMGC@?=<;9754579;;:720..14456779;:99633442.,+*))*('*+)())(*,+++*('**'%'(''&##$%%%#!   ÿþÿþÿÿÿþÿýÿýÿýÿýÿýÿýÿýÿþÿýÿýÿþÿýÿüÿþÿþÿþÿÿÿÿÿýÿüÿýÿþÿþÿÿÿþÿþÿþÿýÿþÿÿÿþÿýÿüÿüÿüÿüÿûÿûÿûÿûÿûÿûÿúÿüÿüÿüÿþÿþÿýÿüÿûÿûÿûÿüÿûÿûÿúÿúÿúÿúÿüÿüÿüÿþÿýÿûÿüÿüÿüÿûÿùÿùÿüÿÿÿüÿûÿüÿüÿûÿüÿýÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿýÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿ  #&*+.5;AFHD><>>=97643369;>BFKORRRTUVXZ\^^[XVVX[\YWVSMIFB@><;;:999::::9632344234568:;:8522210.+)('((&%(*(&()''*****('()(&())**&$$%%$""!  ÿÿÿÿÿþÿýÿþÿþÿýÿþÿþÿüÿýÿþÿþÿýÿýÿüÿýÿÿÿÿÿÿÿÿÿÿÿþÿýÿþÿþÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿþÿýÿüÿýÿþÿýÿüÿüÿüÿüÿüÿûÿûÿüÿýÿþÿþÿüÿûÿûÿúÿúÿúÿûÿûÿúÿùÿøÿùÿúÿûÿüÿýÿýÿýÿüÿüÿüÿüÿûÿúÿúÿýÿýÿýÿüÿûÿüÿýÿýÿýÿÿ   ÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿ "'+-1469>EJMKEA@@A@;88888:=ADHLORUWWVX]_abbba^[Z\`b_\ZWSOKEBA=<<<>=;::9::9767862234468:96422110-+*(&&((())('''%%''((((%%''&'(*,,*'%%%%"!! ÿÿÿþÿþÿþÿýÿýÿþÿþÿýÿþÿÿÿþÿüÿýÿýÿüÿþÿÿÿþÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿýÿýÿþÿÿÿýÿýÿþÿýÿüÿûÿüÿüÿýÿþÿþÿüÿûÿûÿúÿûÿúÿùÿûÿûÿùÿøÿøÿùÿúÿûÿüÿýÿýÿýÿýÿüÿýÿüÿûÿûÿüÿþ ÿþÿýÿýÿýÿýÿýÿþÿÿ  ÿÿÿÿÿþÿÿÿÿÿþÿýÿþÿÿÿÿÿÿÿþÿýÿþ ")-147;<?BGLOOKHGFDC@=;;;=??@EILQSSUXYZ]adfggfda__`cfda_\XTNIEB????A@>>=<;;;;;:986422236774212221.-,*'&(+,*(())'%$%%&((&$%&&%&(+,+)(&$%%"   ÿÿÿÿÿÿÿÿÿýÿýÿýÿýÿþÿÿÿÿÿýÿûÿüÿýÿþÿþÿýÿýÿýÿýÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿþÿüÿüÿýÿýÿýÿýÿýÿüÿüÿûÿûÿûÿúÿûÿûÿúÿøÿøÿùÿùÿûÿûÿýÿýÿýÿüÿýÿüÿüÿüÿüÿüÿý-ÿÿÿþÿþÿþÿÿ     ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿüÿþÿÿÿþÿÿÿÿÿÿÿÿÿþ #'-378:>BCEHNRQONMMLJFB@??@DFEFJNPTWWWX[`egkoomkfbaaadggfdb^YTPKECBAACCCDC@><=>>=<<;61111245311233210.+))*,/,*+,+)&$#"%''%%&&%$'*,+*('%#$%# ÿÿÿþÿüÿüÿþÿÿÿýÿüÿüÿýÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿþÿþÿþÿþÿÿÿÿÿÿÿþÿþÿþÿÿÿþÿýÿýÿýÿýÿüÿüÿûÿúÿúÿûÿúÿùÿùÿùÿùÿúÿûÿüÿýÿþÿýÿüÿýÿýÿüÿýÿýÿüÿÿ ',      ÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿýÿüÿýÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿ  $(+/49;=?CFGJMQUSQQPNNLHEFFEFIKKMPRUXZ]\[_ekpuyxtoieca`cgiihfc^ZXSMJHDCFGHHHEA>>>=>@@=84321013333123220.,+,-.0/..,*)'%""$&&%%&&%$%)+)'&%$##$$!  ÿýÿýÿþÿÿÿþÿýÿýÿþÿÿÿÿÿþÿþÿþÿýÿýÿýÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿýÿýÿýÿüÿûÿûÿúÿúÿûÿúÿúÿúÿúÿûÿûÿýÿýÿýÿýÿþÿýÿýÿþÿýÿþ       ÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿýÿþÿÿÿÿ %,0359<>BDHIJLORTSRQMKLKIIKMLKJLNQTVZ\]_a`cjqw{}}yqiedbbdgjigeca^\YUQNJIKKKLLID@><<?BB@;974332235412431/.,,.012000,(('%#"$&&%%$$%%%(*(%#"#%%#$$" ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿýÿüÿûÿûÿüÿûÿûÿûÿúÿúÿúÿûÿüÿýÿýÿýÿþÿÿÿþÿþÿÿ       ÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿýÿÿÿÿÿþÿüÿþÿÿÿÿ #*168:?ADIJKMLMORSRPOKIJKKLOPPNLMQUWY\^_adefmty||{wogdddfhhifcccb_][ZVTRQPOPQPMHB=;<ADDCA>;87863245446520.-.0343110,)'&$""#$$$$$#$&&')(&$"#&'$"!   ÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿþÿüÿüÿüÿüÿüÿüÿûÿúÿúÿúÿúÿûÿüÿýÿþ        ÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ #*06:;>DGINOOPPOPQQPNKHHIKMOPQPPPRUXZ\_`adhkknsy}zuphbaceilkiebbbb`]\ZXXXVSQSSPNKD=;>BFFGGD@>=;842465576320/0344200.*'%$" """"#%$#&(((('&%$%&$    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿýÿüÿýÿþÿýÿûÿúÿúÿúÿûÿüÿýÿþ          ÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿýÿÿÿþÿþÿþÿÿÿþÿÿÿþÿÿÿÿÿÿ #)07<>?BEINQQPPONPPNLJGFGJKMPRQPRTUVY\`ccdgknpprxzunf^Z]cgkmlkhebaa_^\YXYXUSQPQMJIFA>AEGHKMLHD@>;74465576442245331/-)&$#" "$#!"%&$$'('&%&&%%%"     ÿþÿÿÿþÿýÿþÿþÿüÿüÿûÿúÿúÿüÿýÿÿ           ÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿýÿýÿþÿþÿýÿýÿþÿÿÿÿÿÿÿÿ !$'.5;?ADFFKQSONNLKNNKIGFGHILOQQPPUXXXZ^adfgiknsuturle^VTZbgkmkkjhdb`^\ZXWXVRPLKLIFEEDCCGIJLPQOJDA@;6577666764576310.+&$###! !%&" #&%$&'&&%'('%$!       ÿÿÿÿÿÿÿÿÿÿÿþÿýÿþÿýÿûÿûÿüÿýÿþ         ÿÿÿÿÿÿÿþÿþÿþÿýÿþÿÿÿþÿþÿýÿþÿþÿþÿÿÿÿ "$)2;@CEHJIKOOKJLJIJJHGGGHHHJMOOOQV[\\^_adgikknsuurld]XSRX`ejjhikkiea_]ZYYYVPMIHGDBBCDEFGIJLOQRNIEC@;::9857:989:863/,)&$###"!!!$%$"#&(''((''())'$"""!      ÿÿÿÿÿÿÿþÿÿÿÿÿþÿüÿüÿýÿþ       ÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ  !$,8BFHHJJIIIGEGIJHFEEEGGGGFGJMNPRVZ^`baafjlnnprttqkbZURRX_dgfegkmkhdba_^^\WSPLJFA@BAAEHHGHKMNPPMJHE@?>:978;;<=;996/*'&%#""##"#%&'&&*,)'()*(()))&#$%$!      ÿÿÿÿÿÿÿÿÿþÿþÿÿ          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ !#'1<DHJIGFFFFDCEIJHECDFGGHGFGIKMPUWY^accdhloqrsuvurlc[WUVZ`eecegijkkjgda`_\XVUQMHDCBAADGHGHKLMOPOMLKGDB>==>?@@A?;96/*''&$####$%'((**,.+'(++))***(%$$#         ÿÿ           ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !%*3;AGIGDDFGFEEGJJHECDGGGHGFGJKLPVY[]`ddeimqtvy|}ytmd]ZZ\^adcbdeffgjkiea]\YUTTSOKJJHGFEHIIJLNPQSRPQQNKHEDEFFEEDA>83.*)''&$##%%&()*,,,-,++,+()*+)('$"!                     ÿÿÿÿÿÿ  $+3:@EFDCEFEEFGIJHFEBCEFGHGHJKLMQWY\^bdcdhlpux{zskb[Y\^^_`^^^`a__cedb_\ZVSQQQNKLOPOLKLMLLNQSUVUTWXTQNJIKKIHGD@=94.**('&#"%''(*,-..-,,+***(()*(&%#"                ÿÿÿÿÿÿÿÿÿÿÿÿ   !$*2:@BDDDEDACEFHHFDDCCEFHHHJJKKMQUX[_cdcdgknrvy||vnf_XWZ\\[YWXXZ\YVY\\[ZZXTQOLLJHKOQQPORQOOPSVXYXY\\YURONMLJIGB><:5/+*))&$%&)+-/0//00-*((((''))(%#"!                 ÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþ  !#$*2:?@DEEFECCDFHHFCCCDFHJHHHHHIMQTW[^abcefjnquxyupia\YXXYYVSRSTWWTQRUWVVVSPNKIHGFJNQRPPTURQQUY[]]___\ZWSRPONKGD@=;61.,,,)'((*.122//11-*((('&&(**'#"!                   ÿÿÿþÿÿÿÿÿÿÿÿ "##$&,4:>@DGGGFEFHIJIEBBCDFIJHFFFGHMSUZ]^`aceginsuxvplf_\[YXVUSPOQSUTRQQQRRSRNKIIIGEGKOQQPPRTSQRVZ]_ceb`_^]ZWVTROJHFB=840.//+)+--/1220.01-+*)())))*)&#"              ÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿþ  $$$#'-4;@BEHIGFFHKLKHCAABCEGIIGEFHIOSWZ^`aacfhintutqmic]\[XUSRRPORUURQQRQOOPMIFEGHGFIMPRPOPPQRSTWZ\^cgecbba`^\YVTQNKGA:50/0/-+.1111122100.++,++,,,*&#"               ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿýÿÿ #&%$',3<BCFIGEGHIJKIE@>???CFGHHFFGJOSXZ]abadhjkotusolga^\ZWTRRSRQUWURQQSSQPOJDA?@DFHKNRTRRRRSVY[[[\]`deffeddca^\ZWTPJE>8410//..0133222320.,./.---,*&"!!"!         !"!#&&#"#"!     ÿÿÿÿÿÿÿÿÿþÿýÿþÿÿÿþÿþÿÿ #''&(+2<@BEGEEGGFFHFB><<<?DEFGHGGILPU[]_bbbejlnsuusmieb_\ZXVTTTSUYYVTSSTTUSOIC?<<?CGKNSWVUVVX[`cb_]^_^adefffeeca_\ZWPIC>;73011100355433321011/-,+)(%#" !!!! !         !#"!  ! !$$  "!"$"#&'(*,++-,--*)*)'%$$   ÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿ !$()))+2;@ACFFHHEDEGFB>>==ADEGHGIKNORV[]`abcgklostspjddda\YXVVWVVY\[XVUVUUVTNGC@><<>CHLRUUUUWZ^cghea`_\\]^`cceebaaa_]WPGC@;7334432477654334100-++)'&$"" "#!          %+,)(%#!!" !"#%''$ #%&%&''(()++-0257898976420110.+)(%   ÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿý "$')*+-2;ACEGHJIDEGFD@??>?BDGIHHKOQRSVXY\_cehklmpqokgbcea\ZXUVVXZ\]\YVUVWVURMGCA@>=>BEIORRQORX[`eiigc`_^[Z[\^abbbcdca]WNHD?;964566789755332/-,*()'%$"! !! """          ###$%'+..+($"!#"#$%&''&##&)-,+.../1357;?CEEEEDB?<;99998301/,&"   ÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿü !#%&(+-3:AEHJJJGDFGFB@?@@ACEHJIILPSSTY[[]aefgikmlligebdeb^ZWUUVX[^]\[XUUWXTOKHDBCCAACDFJMNLKNQSX^dggd```]\\\\_befeffdb_YRLFB@<7788999754431/,*('&&%"!!  ! !"""#          ! #())+-,---*&#!!%%&(()('(&&(-1323447:<>AFLPPPPONMIEB@@A@@:67640+)'#  ÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿý#$$%)+-4<BGLONLHFEEECAAAACDFIJKJKOTUV[_`beihffijhgeeeegfb]YVVWXY\a`_^[XWXYTNIHGGHGEDCAACFIJJKLLPV[_ba]\[Z\]^^`cgjjjkiggd]UNJFB>=<<<;::987432/,(''('$!!"! ! !" !#$###  !           $$%+.,./-,-+('&#  !"!"'*++,,**+,,.38;9779>ADHKNTXXXYWTTQMIFFFGFA<<:9610/,($     ÿÿÿþÿÿÿÿÿþ "&&%',-.6?EJPQPOKHEDDCCB?@BDGKLLLLOUXY\`cdhlifefgffeeffhga[WTTX[\_bccb`][\\WPKJJJJFDDA=;=@CGIHGHMPRV[\ZWSRVX[]^bglnnonklmf\UOIGFCBBA?>===:98641+())('$"$$"!#$#""%$###! !       !$&',.-./,*,)%')%! !!!"%%$$%*..--../2677;>AA?=?DHLQUVX\\[ZXSRRQOMKKMLHED?<:6552.*&"   ÿÿÿÿÿÿÿÿÿÿ  $''&(-.07?ELQTQNKGEDDCCA?@BCGLMNOPSVZ\^aegjljhfefggeefghgaZTQRV\_`bccdfca`^ZUPONLIEDB>:78<?BEECEJKMQUVURNLPSTUY]billnqqqrmd\UOLKIFFFEDBA@==<:84.+*(&''&&&%$&'%" ""!"$#"#$#"       #$&),.-./,*+($&)&#$%$%%&(+*()+/2111346:@B@BEIMKHJORTX\\[[[XVTOLMPRTRQROLLKC?>;8731/,($##"   ÿÿÿÿÿÿÿÿ #%&(*-.17?GNSUPIEDBCDDDB@BCDIKMOQTVW[^`dhklljjigfihffghhf`XQPSW\_abbdgkkhd`]ZUSQNKHEA>:547;?@BBDHIJMOPQPMJKOPORV\cgjmrxxwslc]WRPNJGHJHFFDA@>=:62.+(&''''&''''&$#%&%""###%%$"        "%$&+,-../-++(&(+)&'(('(*,///2699899:=?BFIIKOSWWUX\][\_^\ZXUSRPLLOTXYXWSPPNFBA?<84310-*'(($!   ÿÿÿÿÿþ  "%(+-./18AKRVWPGA?=>BEECACEIKLOPQTVW[_bfilmlklkhiljghiifd`YSRVZ^`bceiloqnic`]YVROLJFA>;5259=>@CFIIIKLLMNNKILNLLPU]cinsy|yupib\VRPMJJLKIIHECB?=:60-*('&&'((((((''*)&" !$&#!      !#%&(.//1//.,+*),-,)(***,/1368>BCA@?ACEEFINPSWX[\[^ba^_`]YWSQPQPOOPU[]^\XUTPIEDC@=97432.,,*'%$    !%')-//.07BLRWWPF?:7:?CDCCDGKLNQPQUVW\aehkllkklkklmjghhheda\WVY]`bdglpqstsoid`ZUROKIFB?;7569;>@DGIIIJKJJLOMJKKJLMPV]elquyxtpkf`YSPNMKKKKLKIHGEB?831.*(((()****)((*)&!!"     !$%'*022320/.--.0/.,+-./0148<@EIGDCCFJKIHKPTUVWYZY\^`^\[XTPKIJKJKNOTY\__^]YSNKJHFEB>;85320-+*(%!   "')*-0/-06?IPTSME>759<@CCEFGJLOPPSVWX]afklkkklmmllkgfghiihe_[Y[_dfjotuvvvvuqkd[TPNKIFCA<:::;<>AEHHHINPLIKPOLMJILKJMT]emrvwtqmhc\TOLMNLKLMMKJKJHC;630-+*)))*-0,''((&$ ! !  "&"!%&),0334312224565110122127=@CFIGDEFJNOMKMQTRRRRSTVY\[VSRPJC@BDBCFHMRUY\_`]XUSQNLLJFD@;996431.+&$##" ÿÿ  $(**+--,07?HORQKD=747;@EEFFHKKNOPSVVZ_bgkiijkmomkjgfhjjlmlhb][[`fkotyzyzzyxvph`VOMLJFDDA>>@@?@CGIJJMX^ULMQPMMJHJGCEKS]hptxvspkf]TNKLNOMLMKIIJKJF>8511.)))))-.+)(('%" !  $%! $'&##$!!$'+.0345436769<=<97655446<ADDFFEFGHKNPQPRSRQPNKJMOSYXSQPMF?=>>=>?@DHJNTY\]ZYWUSQRPMLJDBB?=;853.*('%" ÿÿÿÿÿÿ #'**)*++-19AJORRME>:68>CHHGGJLKMNNQTUZ`dhjhgjmppnkigfjmnnnlhc]Z[`gmpty{{}}{xqh`XQNNMJGEEEEFGFEFHKMMQ`i^OMRQNKIHGC?@EKUcmrvwvtoh]SMJHJNNLKHDEGHIF>:7640,,,+)((*,+)(&""#  !#!! !#"$'())'%#$'),/377659<:>ABC@><9779<@CFGHFFGHJMNQTSTSRRSOJIMNQVWVUQLFA>====>?ABBDJPUXVUTSSSTTQPOLKJGEC?=;72-)&$!  ÿÿÿþÿÿÿÿÿÿ #&++*+*,.3:CJMPQLD><9<BHLKJJLMKKLNOQUZ`eijhhkoqpnkihgknoonjgb]Z\binprux{|€}zpe]UQQRTPIEIKIHJLKJLNNMOXa\PLOPMIGHGCABDGO]jqvwwvrh^TMHFHKLIFC@@CFHD>:8:8521.,(%',-*('%  "    ! !  #&%&()*)''&&'')-1578:>BBBDEHFDDA<:<?@CEGIHGGHMQQSTQRSRUWTNNSTVZ[\YRMIEBA@A@>?AB@@EJPTPNNNOPRTSRPNONKKJGDB?93-)(&#"! ÿÿÿþÿþÿþÿÿÿÿÿþÿý #'+,-,*-03;DJLOOIA<:;>EKNNMNNNKJLOPRV[`ceffglpqqnjihjmnnoligd`^`ekrrrqty{}}|xnb[TPQQSPIIMNLKLOONMMMKJMTVPLKMLIHIIHGFFHMYgqvwwvqg]UNIHIJJGB?>>@DIHC;9;;962-)&%(-,'$$"      !#'*((*,*())))*)*.1259?DGIGFHLNNMJFBABBCCCGHEDGNRQQQPQTUX\XSTY\]``_[TOLJHFDDB?@BDCCFHLNKJIFGIMPRPNNONMMNLIHE?94/-*('%"!"!  ÿþÿþÿÿÿÿÿÿÿþÿþ #)*+..,.25<DILONH?:9;@EJMMNOOMMNPRSUW[_``bcflonomihilpoopmkkidbdgmsrqpptwxwuqjb\WRSXVMINQONOMLNOMKKKHKSUPKIIJJIKLLKGFJPYgpuvvuncYRMIHIIJGC@?>>BINJ?:;;751,(&')*($#$"!!        "%),+*-/,+-+*,--04667<DIKNMKOU[]YUQMJIIFCDGHCAFKONMPTWY[_c_ZZ_dcba^[VRONKHECCBBEGFGJIIHEFE@@CGJLJHIKLMMOPMLJD?;730-+($"#""!  ÿþÿþ   %))*-.-/37>EHLOMH@;:<@EHKLMNMLNQRSTVX[]]^acejjijkiilpssstrpolheeflpponmorspmjfb^ZU[lbJGOROPPMIJNNKJJHLSSMHGGIIJMNMLHGKPXenrttrgZQMIGFFGHGEDB@>BKROC;9852.+)'(*'#"#$$#"       !"$*/,,00..-+*.116;<<=BJOPTUTYaefb]ZVOMLHFJKICADGLMOU\`behkiedgjgc`\ZXUSPKGDBDEEGJIIKKKGBDD?=>ACDCABCGJKORPONHDB?;840+'%#$&%#" ÿÿÿýÿþ  "'*+,./.049@EIMNLH@;;=AEFILMKLLOSTTTVWZ[[\_adfffiiilptuuuusqomjebaekljijjlmjgeaa`]WXkbFFNPNOPOKIKOMIIHJLJFDDEFGHLOONKJMPValpqqmaTLHFEEFGGGGFDAAGOSOD;7641,*)''(&#"!"$%$        "%%+0.0320/-+,167<@@ACIPWY[\\`egge_\XOJIHILLIDBDHMQU\bgilnqrolmnjge_\[XTPKGFDFGGIKKLNQQNGEFB>=====>?@BEGMQQQQLGGEA?;61,)'(**(%! ÿÿÿþÿÿ $),-/11036:?DJMLKH@;:<CFEFIJIJMPTUWVVVWXXX[_ccdhkkkmprrrsqomkkhb^]_dfbaccfhecbaba_Xc’‰RFNNNOQQOKJMLIHHHGDAACCDFGJNPNJKNQV_imooi]RKEDEFHHGGHFBAEJQSME=7662,)'&&'&$"""$'&"        #&&*0136740/.17<=@EDCFLU]`]^`acdcb\XVNGHJIJIGEDGMQU[cgjmnorusppommke`]WRPNKHGGIIJMOPRVXVPKID@>==<<?BB@@ELPONPNJIGDCB=82/.//-+&#! ÿÿÿÿÿþ#(*,/22147:>CILKKH?:9<BEDEEEFIMPQTWWUVWWWXZ`efhkllmnnmnnnmkheec_\ZY[\YWZ\`b`_`ccccg¡êzMPRPQSRQOLJIJJHHHE@@BBDEFJMNLIINRV^fkonf[QJEDFHIIGFFC>@GMQQMG?8762,'$%'('#"#%%&&$"!    !"%(+146:;73016<@??DEEGMW^`[[]]_a_\XSSNJLLIHIHGGKRVY^fjlnlnsutrqnoonic\UPPPMJJKJJKOSTVY\\XRMFCA??==BFFBAEMRPMMLIIHGHGB>965420-)'$"#! ÿÿÿÿÿÿÿÿÿÿ"%')-22357:?DHKKKG?:9<@CCCBBDGKMNQTUVYYXX[^dhjmnlkklkjklljgd`^\ZYVSTURRVX[]\]`ccdk†Ê ëŽ]WYUSTSRQNJHKMJIIFCABCEEEHKMLJIKQV\elpmeZPIGGGIJIGDBA?AGLNMLH>764.)%#$&&'%"$'&&'%#!       ""%*.369<=93139=>=<?BDGLV[ZVSTVYZXWUQQPNNKHHJJKMPVY[`hmnpmnstsrpnppmicZTRQOLKLMLLMPTVWZ^^[UPKGECA?ADGHHFHMRPMLIFEGHKKFB@>;7420-*'$$$   ÿÿÿÿÿÿ $')-01579<@EHKKKH@;9;?AA@@ABDHLNQSUWY[Z[^chhknmkifggghikhda]XUTSQOQPPRWY[]]_adcgt‹œ–†wf_`\XVTRPNLKMOLHFEECBDFFEEHLMKIJPW^emoke[QJGIIKKJHD@@ABDFGIJF=752,&$$#$%%$$'(&')'%#!     " !$"$).269<=94468<;;;=@BFLRTQOMNPPPQSTQPSRMIIIILPRTXY\bkrrrpoqqppnnpplf_YXWURMMPPPPPPQSUX]\YVSOKIHFEGIJKMLKLONLMLHDDFJJGEEC@=8410-'"  !  #').0037;>@EHJLKF@<:<>@AA@@ACGKNQSTUVZ[]`ehfgihgeacefefhfb`[TOMMMOQOQUX\`bbdefgmureTWbccb`^YVRPPOOOOLHEDFFDDFGGEGLLIHIQ[bglnje]SJGIJMLIGB>?@>>@BGJE<641*&%$#%%#!#&'&(*'%&#     ! !%%"#%$%(+/26:954877::99<?BHLNNKKLLMJJOQQOOSSMLOMLPSTUY[^fowvuronmllkknpkb\[]\ZXSSUVTRRPNPSWZYWWWSONMLMNONNNNNMMLKNQOJGFGGEFGEDC>853.'! ÿÿÿÿÿÿÿÿÿþ !"#&-0/27<?ACEHIHE?;:<>ACCA@BEHKMNOQRSWXZ]bfdddba^^befdefc_^ZSNKJLOQQTXY]bdfihikmme\Z^cec``_[YVRQPQPNMKGEHJIGGIIFFKJHFHR^eijkjd\SJGJKMLGC><?@<9;AFIC932/*''%%&'%#$$%'))&$%#    ! !"#$&'%$%&'(*./3972489799779=BILKKJKLKKHHNQOMMQQOPTSSUUUX]aeltzyvrnkihhfjpqi_[]`_^\XWXXUSTSRVXXXVSVZXUSQNPRRRPMMNMNMMPVVQLJHEDDDDEFB?=7.)%" ÿÿÿÿÿÿÿþÿý "! $+.048<>?ADGGGEA;89=BDCAADGIKLKLMNRUVX[acbca]^^^adedfgc_]YSPMLMPRUX[[^dehjjiiige`[\chfa^^][XVSQRRPNMKHHKMMKKKFEHIIGHS`fihhgbYQIHKLMLF@=<@A>:;@DE?5/..+))(&'))('&&)*(&$"!       !#"#%&'('$&((()--/551378789768<AHKGGIJKKJHGKMMKKNPPSXYYZY[_chnty|zuqmjgfefmtrh][]__^[WWWVUVZ\^bb]XSOSY[YVSPRUVTSPPQPOOPSX[WSQLGC@?>ADDCB<3-*&  ÿÿ#(,058<=?BEGIHGD;78;@A@@BEGIJJJKLNRUW[_bb`b`]`a_`dghjkif`YUSQPQSUY]^_bfghhgfbaaa]ZZ^dge`^_^ZWTRTTRPONMKJMQOLJGDEIKIKUbghgfc]VNJJLNMJD?>>@A=:;@B@:2--.-+**)()**))(((&%#""      "$$$$&),*%'**)*,-+/1.045457768?BEGCCEFIJIFDFIIHKNQTY\]]^_behmtz{{{vojgfdglsvqf]\]^_]YUUWWX\bdhljd]UOQVXWUTTW\_^ZXXZXTSTVZ_^ZXRJC?<;<?ACC?:61*" "&)/59;>BDFJKJHF>88:>?>?CFGHIIIILPUVY^bdcabbaa`_bhloqqnkf^YXVVVUX\_aaehgfeb^ZWY[ZZZ[^cec``a^ZURUVTSQPPNJKPPNKHEFJLKOZdihgeaZSMKLMONHB?<<?>967=A=70-00-++,,,***)**(&%$#$$!        !  ###%(+/.()--,--.++-+,00/1455:ABCDA@BCEGFBBDFHJNRUZ^`a`cgiknrwzyxwsjdbcdjqvvnd]]]^^\XUWXY]cfgjnmhaZSRSRQPQTYajkgcbdc]XYZ\`a_]WOGA?=;:<@B?<:6.%  ! !&).6:;?BDGKLKJH@98;>?@@ADFHHGGINSXZ\`dfddeec`^`flptwvrnjea^[ZZY[_abcegfc`\VSPRVWXWXZ^bbaadb]XTVXWWUQONKJMQRNGFHKLMT_ehhfd`ZRMMNNOOJB>;;><5237;;60/11.---.//-+,,*)'&%%%%!         !#&)+..*+21-../,)+))+)*-036<@DEEDBBCEFECCDGLQVY]`accdkrsrtxzywtoic^^aemtwume_]^_^ZXXZZZ`fgfhlmib[TQOLKLMOS]imkihigb_`a`bc`^[ULFC@<99=?>>;7/("   ÿÿ "(+/59<?AAEIKJJHA:7:=?@@@BFHHHIKQW\`abefeefd`^^agnuyywtrnkhc][\]`cefeggd_YTPPOQSTVVVWY\^^aca\XVWYZYVRONMLMPTPHEINMOZdfffdb^XPMQSQONJB<:<?<61038:83221/....020.0/,*(&%&&$"        #$&*--,-230.-/-*))((%&*-05:@EHHHGFGIJJIHGLSX\_dhghknw~~{z}}yvpf`][[_emrsqkfb__^\XVX[[[`gheehkibZSNKIIJJKOV]__`bcbbeghhgea_^ZSLGB?<;===?>7.)%#! ÿÿ !"$*.169;>@@BEIIHGB<88;<=?@BGIJLMOUY^dddddccca^^adiqy}{vtspole_\]_cfihgjjd]UONOQRRQRRSUUUY[]_]XUUWXYXURQPONLNRQJEGNOTagggfc`\VPOTXTOKF@97;=;83027:843530./11354320.,)&%%%$"          "!#'+**,/220.//,+,+*''*,/39?DHIIIHHLNONKLRY]`dkrrsy}ƒˆŠ…‚xrlb\ZYY]cimmkifca^[XUSVZ]_bghgfhmle\TNLKKJJMSWWWUUWY\`fkmmkfb``\WRLFB@>>>>?>7.)'&$  !"#&*/3689;>>@DHIJHE@;9:9:>@CGJLORUY[`ddaaa___``adgls{}wtspome_[\`dgigfjjf_VPNOPQOMMNORRPSUWXYWUTUWWUSQQQNLKMOOLEEMSZeiihda^ZTQSVXUOID>87:=;852379854541/135777630.-)&%#""!           ! !"!!$(')++.0////.-..-,*+-049=AGGGGDDKPQOLNU^cfmsxz|€ƒˆ’އ„ulga][YY\`dggggfc_[WTQQTX`ehjihhkpqj`XSRRPONT[\[[XVY[_bcgjljfb__\XSOKGD@==?@>8/)((%   !#$&*/2479:;;?DHIJJHD>;978=@CHIKPTX[]ab_]\]\\]`bdghmt|€~yvsomjd_Z[aeggeeijgbXRPOQPMJJJLPPNMNQSUVVUTTUTROONKKLNMLIEGPYbjkjid`]XRRTVVTOIE@;9<?=:744688753311357:;;951/,'%$"!            "#" ""!!$%(+),.-.0/---/0.*,/269=ADBBDBBJRSQQSXahmtwx{}€‚ˆ‘•’Šƒ}rgc`_^]\^acffeffb\VTQPQTYcjmnkihkqsph`\[\YVW\`_^_]_cgigccdffdb_^[VRONMJDAABBA<4-*)# ÿÿ "%(+/2358:9:>CFHIJJF?:966;>BGHIOTW[^a`\ZXYZ\^abeggmv~{vpliea_\]dghgddijhc[TQQQNLIGGHLONKKMORSRTSQTUROMKJKLNNJHHMWainmljeb]WTTUWVURLHC>=??><843577643202578:==830.*&$##           !$" !%'***-../...-/1.+/236:>CB@BDBBKTUUWY\ckquvvy|~‚ˆ“‘ˆxoe_``a``bdfgfded`YSQQTUX_iprqnjikprrniffhebbfea``agnqpkfdbbbbba^ZVROPQOKJJIHFA91,'!  "%)+-023567:>BEGIKKG@:855:>@EHJNRW[]^\ZWVWZ]abbeghpx‚xpjgda_`_ahigfdcfhhe^WTRLIHECDEGKOMLLLOOORTSUUSQOJFHKMNKJNU]flnnliea\WVWXYYWSOLGB@@@@=8423433320/2567;<83/-+)'%%"        "%$ "('(*),//-./.-/10/4548=CEBAEFCCLRUXZ]`emrssux{~†Š†|rjb^_``acfhihgeec`YSRV\^ckpvwvsonprssqqrtutrpojeccfnuvrmjhc`^_`ba^ZURRRRPPPNKJF<3,&! ! "$%'+./12358<@CGKLKID>:65:>@DHLNQV[[ZXVUUX\_bb`bflt{€€{qhdca_\]^_efdddddeffaYUPGDC?=?BDGMPPNMNLLQUWVTQQOJEFJKKKMSZbjnnmiec^YVWYZZYWSOLIEBABD@941100010..1457:940-*)('&$       #"$$!$)'&((+/.,.0001344788<CHHB@EGCCHMQX\`dglrppuy|~€ƒ‡ŠŒ‡ykd`]]_bdfiihhiigeb^XW^ejqvx|}{{xxzzyxwx}€‚…†voighlqwyvsplf`^^_cec^YVUTSRQQOLKG>4,&"   #" !#$%),/14557:=@FJJIIGB?;9=>?CGKLOSXZXWWWX\^^^_^_fow|}{ulecb`]XXZ[^``adfefggc\UMFB?;9:=@CIMPOONJJOUWVTRQNLIHKLLNRV]gnppngc`\XVWZZZXVRMIFDABDD@:41/--,,,+,.246861-*(('&%"     " !" "'(')),.-,.2345767:<<@GLJCAEGCBDGLV_cghkoqrw{}€ƒˆ‡wga`^_cfjkjhhknonkhd^^enu}€‚‚‚ƒ‚ƒ‚€…ˆ‰–Žunlnoqvzzxupida_aehhb\ZYVTSRPNLKF?7/*%   !#$! "$%)-12588:==@FHGDEFDDCBA?@BEIKNPSXYYZ\\]\[\_`ahrxyxxtkfec_ZUVYYZ\\]bghijje]UMFB>:768;@FKMOQMIJOTVWXUQOOLJLNPTWY`jqqpmfa]ZXWYZZWVVSMIFDBCEB=84/-++)(((*.23454/+(('&'%       !   $'(+,-.-./368;:9;=?BEJNMHEGGDCBCIT`eghintwy{|~€…Œ‘†wibcdfjlonhinsvyxtnjfhnvˆŠˆˆ‰ŠŠˆ‰ˆˆ‹‹‰ŠŒ‹‹“›–ˆ}tqrpquwwxvpkgb_bgkkga^\ZVSRPMMKE?:5/)%  "#!!#&).11369>AABFGD@ADFHIIFCDCEHKNPRW[[\__][[]abciqvuuwuokid]VRUXXY[[[`fiklle]VPJD?94357<CIKNPLHKQVWXXVSPPLILPUYZ]dkqqmid_ZXYYZ[ZUSUSNJIHHHEA;73.+**(&''*.212441-*(&&&#      ! "&%(,.../037:>=>BCCGJKNPKIJHGFBBHS`fgikouxxxy{‡”’‰|oghlprqplinw~ƒƒ|urquy€Š‘“’’”•“‹ŒŽ“•“’‘•™”Œƒzurpopqtwvollgbcimlifb`\XUSPNNKF@;72-(!     " !$'+/1026<ACCDEFD@?CGLNNLJJHGILQTUY]^^bb__`abdfjquuuxxtqlcZRORTUWZ[[_eijlmg_YSLE?:54668>FKNNJFIPTUVUSSQOJHLRW[]bhlpqmgd_YVXYZZYURSRNKKJJJD>:73/+)(''('),.,.342-*''&#       !" !! "$"#(*,-/026;?ACHHGLONPQMLMKIGCAGR`gjnpruwuvy}‚Š’˜—†{qquwwrljpzˆŒ‡~{}‚†Œ•š›ž›–ދޓœ ž›š˜———“Œ†~vpkhhlswuqrtohgkmljhgd_ZWTRPPNH@:73/*$  !" !$&).3545:?CDEFFFFA>BGLPSSRROMNPTWX[_`adddffffilnuxyz|}ztj_XQORRSUXZ\`fjikmhb]WPGA<88867<CILLGDFLSSQNKMPNIJOSW]cillmomgd_XUWZZXVSQRQMKLIFFA;973/,,*((('*,*'(-11,(''%" !       "  !# ! "# "$&)+.14:?ADKLLPTUTRQQQMJHCBHS`impsttwwwz„Œ“šš•Ž…~|~|xrmq~‰”—˜—‡„‡“™Ÿ£¥©¨¢š’‹Š–¢««¨¥¡™—”‡ulebdjpuvuwxtmijkjjjjhd^[YURPOIA:62/-("  ! #""%(),38:9:=@CEGHGGFB@CGJOTWXXVUWWXZZ\^`_`diklkkorsxz|€€}vj^XRQSRSSTX\bjljmnje`\UJC?<><77=BEIJGEDGTWLDBGLMKLQTY`gnokkkige_ZVVZZWTRQQPONMHDB>:983.,.,++*)++(%&)-0-('&%%! !       $#!#$#!!  ! "&,149>?CJLNRXZYVUUSPNLFDIS_kqsttuyzyz}ƒ‹’–—•І„„€zxxŽ™ž¡¢¡–Ž“˜ž¤©¬¯±®£–Œˆ‹—¥³·²®©¢œ™•ކ}tkdbdhmrxxutsnjkjgghhhgb_]YSOMH@:41//,'!  !""#%%&(+/37;==>@BCDGHGGFDFHIKOSVY[[[\\]_``_^[\bjopopsttvwz€‚~xncYSQQRSPQW\dmonpokgc_YPHB@@>9;?ABDFFFDBP[K>?DHKMNQX^ciookhfeffa\XXZZWTSRQQQPNJD@=;9850..-,--+++'%'*,/.)&&&&#"#    !" #$#"" !*049=?CFGIOVZZYZZWTSPKGJQ\jsvvuwz|zy{‚‹‘“•”ŽŠŠ‹Š†ƒ…‡Ž›¥¨©¨¥Ÿ™–˜Ÿ¤«²¶·µ³¯¡“Šˆ’𩹽¸³®¦ ˜†}vojgghkqvvrqqonmhdcefgheb`]VQNJC<6200/*" !#$&())(,38;?@ABEGFDEGGGFEHKMPSTVX[]]^^`ccc`\Z[ahnrqqrsrqsw}~{th\TQQSSPRX^fnrssqoieb\TLFB@??ACCAAAACDGlƒ^@BEGKPRU]cfjnnlgddefd]Z[[ZXTSRQPPPMID?=<:863/./.---,)&%(+..,'$&)(%"    "!  '-27<?ABABIPVYZ]^[WURNIKQZhrvwy{}~{z}ƒ‹‘“••“”’‘”—𣫬ª¨¦¡žŸ¤«°¹ÀÂÁº²ª‘Љޕ ±¿Â½·°©¥¡›‘ˆ‚|upnkimqstrqqqqohdcehijjifb]VQNHA;5100*"   !#%),,++-39>ABBCEHJHFFFGGEGKPQRTTVZ^_`a`abba][]bgmqpnopppsw{€‚~ynaXUTUTSU[bjorvusrlgd]SKHEBBCDEEBA?=AD\§Õ—SFHIMSX]cgjmlmlhedcdb^]^[XURPOONLLLHC@?=;;94000..//,)&%(+-.-'$'+(%    !! !!%)/5:=>?=?EKRWZ^^\ZVTPKLS^iqtw|‚€~„‰Ž‘”–””˜›žž¢¥¥ª®®ª§¨¦¤¨¯¸½ÄÊËÉ¿³§™Š‹˜¦¸ÃÅ»³­¨£œ”Œ‡vrromptsrsrqrtqlhfhjklmpojd]UQKE?70./+"   !#&*-.-,.27<??@BDFIIHFDFHGHLPPOQRTY^acdaaccb^]`deiljklnoqty}€„„|sg]YXWVUW[bimptsqqnic[QKIGEDDCDDBA>;@If¯êÅuQNNPU[bginplmlifa``^^_]YTPOMLNOIHLHBBB?>><74310121-*'%'+,./+*++(#     "" "#%$#',15:=>=AEIPUZ\\[[YWRLLT`kswx}„‡…„‚ƒ‡‰Œ’•š £§ªª­±°°±°«¨©©ª°¸¿ÃÇÍÎÌô¤–Ž’œ«»ÅÇÄ¿·­¥Ÿš–ˆ~sopoosurpqpoqttpmjiikklrvqkd[UME?70..*#  !%),-,+-169:<>ACEEFGFEGHIJMPPOQSTX^acecdedb^^`bbdffgijmprw~„†ƒ~wpf_\\YWWX^flprqoqpkd]RKIGC@ABBA@@?=BM\y¢¨~\UTUY_eilqqmlkhd\Z[\^^ZWQNMLKOQIGJGCCCAAA?:8534540,)'%'*-/001/+'!      !" !$')'#"$%',28<>@CFHMSX[[ZYWWTNMS_ktyy{‚‡…„‚€ƒ‡ˆˆŠŽ•¦¬²·¶·»¸µµ²®«ª«®µ»½ÀÇÌÏÏÆ¶£”‘“—¡°¿ÈÊÈÁ·©ž˜—–‡{nkllnqqommkjkpsrnkhfgghqvtog_XND>70.-(#  "&(+*).489:<=?BDDDGGGHIJLNONOQTUW]acffecb`^^_____`bdejops{€‚……ƒ~woeaa^YVV\enqqrqqpkf_SJFEC@AB@>>>?AGMQT_kg][]^bgiloqpomif_XVVY]ZWTPNNNNPPLIIGEFDBCCA=:74452,('&&'*.0013/*' ÿÿ   !!#&)(%$%$%*17:=@BEGKPTVVWVUUSONT_kswwx~ƒƒ€‡Œ‹Š‹–Ÿª²¹ÀÁÀÀ½¼¼¸³¯¬­±·¹·»ÆÎÑÑ˼¦–‘”™Ÿ©¹ÇÎÍÉÁ³¢˜•––‘ˆ{okllmmjiihffgjprnjhedbdlstpjd\RG?80-*&#    !%&((*179:<>=>ACDEGHHIJLMLLLMOQSW]aehgda`][[[Z[ZY[]`cjoorw|€ƒ†ˆƒ{sjeeb[WY_gprstsqnje`UKGGGEDDA=<<@ELPPNNSZ^adgknnoonlonhd]VTTXZVTQMLNOPQPMKJIHHGFFEB?;6210-)()()+,-.000.+& ÿÿ   #%''&&&'*057:>@CEILPQQRSTUTQPVbnsuvw{€€}}ƒ‘‘”𣮵ºÁÃÃÃÂÄÆÀ¹´¯¯±¶¶³ºÈÕØÖÏÀ«›”–Ÿ©´ÃÏÒÎÈ¿° ––—–‘ŠwqpomidbcdeffhmqojgfdaagnssojcYMC8/+(%%!  #%%&(-3689<>>>@BDEGHJKKLLKJIKMORX]`dggdb`\XWVUVWXZ]adjnptvy~ƒ‡‰…|tmihe_]`ejqtuvtpnjf`WOKLMLJIE@=>BIPSQOPU_fhgjqrponkjmkhc[VTSVWROMIILOOONLJIKJIHIIFA<852/-,*+,++--,,.11.)#    !&'&'((*.248<>ADHJKMOPPRVWUUZfqsuwx{}}yy„“•——š ª³µ·¼¿ÁÅÈËÎȾ·±¯±´·¹ÀÐÝÞÚÑÁ¯ ˜˜¢°½ÊÒÒÍǾ¯ ™š™”‘Œ‡€yvqle_\^adfginqoifdbbbbhqtrng_UJ;0,'%$! !"##'-1259;====>@CEGILLKKJIHJLNQW\_cfedbb_ZVSRSX[\`cgkmqwxy…ˆˆ…~vomkgddgkouxxwronkg`XQOPRRQNKEBBDIPRPQTZdnpllqtspmijhff_WVUTTSNKKIIJLKJJIHHJKHHJHC>84210/.,-/-,---+-23-'!    $&%'()+-.159=@DHIIKNNOQUXXY_iqsuwxzyxtuƒŽ’–š›ž¤¯µ²±·¾ÂÉÏÓÕÏĺ±¯³·½ÃËØááÛѲ¥œš£³ÂÌÑÏÊù­¢žš“‹†|vnd\WZ^`adhmpoida`bc`bkpomhd_SB5.($"!!""    %+/15:;;<===@BDEGIIIJJIHHJNPTZ_dgfcacb]XTRSX\_cgjmotzz{€…‡‡„~umnmjhikotyzyupnmke_XRQRTUVTPKHFEHMOQSW^htztqsuvskgga__XSTWWTNJKKJJJHFEHJJIIJIGGC?<841110/.011/...,-11,&     #%$&(*,+*,17<AEIIHJLLNPSXY[ajqtuvwxvtrtˆŒ“™Ÿ¤®³¯­³½ÆÍÓØÙÓɾ³°¶½ÄÊÐØßßÙÐÄ·­¥£ª¸ÄËÍÊŽ´ª£ ž˜‘І€{rg^XY^_\^cglnjdaadea`fjjihge]N?3*$"!!"#!  &+/368::;;=@BDEEEGGFGIJIHIMQTY`ehgbadc_[XUTW\`eimpqtxyz~‚„ƒ€zpikliilpsvxxwspnmke^XTRTVWVUSQPOLKNQTUX_gt~zvwuutkgd\YVQQRUWTNJKKKKIGFEILLKIIHEC@<985221/0243330/-+,/.*%    ÿÿ "$#$'+-)(*-4;AFIHGJKMNORWZ\bjsvuuuvurqs{„Œ•œž ¨¯¯®±»ÇÍÒÙÚÔËÀµ²¸ÂÉÌÏÓØØÒËļµ²±¶¾ÆÊÉÅÀ·¬¥¡ž™”‹‹ŒŒˆƒ~vme__cb^]`bfihdbdghecgigdccee[K:-%#! !!!  %*/2479;;;<@BEGFEHIIHHIIJKNQRW^cfebceda^ZWUW]bgknqqqsuwz~}{ulfikilrvxyyxwtrrnid\WVUVYXUTTTUXVTTWYZ[_bisxxxvurlhc[VPNQSUWUNJIILKIFFIKKKKJHEB@?;86644322443232/,*+-.+%     "##&,-)(++09AFHGGJKMNPRW\`eltxwututpnpu{€‡‘—›¤¬¯®°¸ÂÆÌØÛÕÎøµ¹ÁÈÊÍÐÐÏÉÃÃÀ½¼½¾ÄÉÊÆÀ¸­£žš”Žˆ†‡‰‹‰†‚zrkgfffcaabcefeegjljhije_\\aheVB1'#! "#! #',.05:<???ACEGGFHKLKJHIJLOPPTY]`cdffeda\WVY`ekmorqoqsvx{{zytlhlpoqw{{|{yyvusmgaZTUVX[[XVUVX\\[]`a`_`ackruwwvslga[TMOSVXXTMHEGKJGEGKMKHIJIEBA?;767754301311341-*+-0.'!! ÿÿÿÿ !%%&-.*)**/8@EGGIJIJORUY`dgnvywvssrmlnrv|†•™ž£©««¬³»½ÅÕÝÙÑÅ»¸¹¿ÅÈÌÍÊÈÿÂÂÀÀÁÂÇËɹ®¤œ˜—•ˆ‚†‰‹Š†~tmihhhigecdfgjlmorronke\WV\fh_O>-$"""! !  !%(*-27<ABABBBEFFHJKLJHIKLOQRTWY\behhgfb]YY]cinopsqpquwxz{|}yrptxxxz}||yvvtsqjd_XQQTWZ[ZYYXWY[]adgfdcfkmorsrttnf]YRMRVXXVPLGCFJIFGIMPLGHKJGCB?;867863/+-112430-*,130*$!   ÿÿÿÿÿÿÿÿ !&&&-0,**)-6>DGHJJGGLSX\bfipwyxwtqokmsusv”™Ÿ¤§¨¦§¬²µ¾ÐÛÙÐżº»¿ÃÇÊÊÆÃÀ¿ÁÁ¿ÀÃÆËÌÆ½³§Ÿ™“ŽŒ‡€}€…ˆ‹ƒyqlklmmkhffhimooswz{wof[TSV_ec[L8*'%#!! "%(,159>?<=><>BEFFGIHGIKMORTUWX[aehiigb^[[^djmnpsrpquxz|~€€{y|~|~~|ytrqnmjd_[VQPQTXZYYYWSSUY^aehhimqqpqomptpeZVQOUWVTQLJGEFHIIJKNPLIIIIFC?;:965542-*,.0120-*)-352.&"!   ÿþÿþÿÿ !'('.3/+*(*2;BEFIJGDIRX]djmsz|{xsolls{zsr{‰’˜ §©¨¥¤¦©®¸ÊÕÕÎÆ¾º»¿ÂÅÇÇÄÀÀ¿¿½¼ÀÆËÍËÁ¹°¦•‰ˆ‰‡ƒ€€ƒˆ“Š‚{vuusrpnkhfegiinu}}sgZSQPV^a_UD4-($"!  #&+045896798:=ACDEFFFHJLOQSTWY[aehikid_\[_eiklnrrppsvy}€€‚~~~}}~}{vpnlgdb^YWVSQPQVXWXXUQNPV[]aejnpqrrqnlopk`XTQRWYUPMIGEHHGKNMLNMLMKHECA=98976420,*,-/00/*&',1310)$"#   ÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿ  (**052.,((-6>@BHKHEIQX^elpv~~{sljox€~uu€”™¢«¬¨¤¡ŸŸ£¯ÀÎÒÏÈÀº¹¼ÁÆÇÆÃ¾¾¾»¹ºÁÉÍÌÆ¾¸±¥™ˆ„„†‡†…„„‰“š™”Žˆƒ}yvvtoia^_`bfny€}reYSPLMT[^ZM>4+&%!   !!"&)-124434679;=@CDEFEEGJNPQQUXZ_ehknmhb^`dijkloqrqopruy|}~€|zzyy{{zumjga]\ZWUTRPOPUVUWWUQLNW[\`fmssrtqnmmnkd\VTTTVVQKGEDCHIHMRQNNMMOMHCA@?=;:9962/+)+-/01/*%$*00..*%#" ÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿ "(+-3630-*(*29<?GLJIMS[bglqw~€~ujhoz‚€z}ˆ’™Ÿ§­«¥Ÿœ™•—£³ÂÍÎÆ½º·¸ÀÆÇÆÂ¼»»¸·¼ÄÊÌÇÀ¼¸±¤–‹ƒ€€‚‡‹ŽŽŒ‘›£¤¡›”އ‚~zyxskb\[]`cit}{pdYROIEJSZ\TG;/(&#  !!"%'*.0001025668<@CEFCBCGLONNSWY]eimqpkebdhmnpqrsqpnnptvxy{}wtvvvxzzunjf_[XWUSQOOOPSSTWVSOLNW[\bipvvssnklkjgb[XWXUQKGD@@ABHJIMRRSRONNNJFA@@@@=:9511.--..01-'$$*//.,(%$  ÿÿÿÿÿþÿýÿÿÿÿÿÿ $))-2452.+*,16:>EKLNPV_filou{}~vien}„„…Œ“¥ª¬©£œ˜”ŽŽ—¥´Àľ¸¶µ·¾ÅÇÅÀ»»º¸·¾ÇÌʽºµ­¢–‹ƒ€ƒ‹“™›šž¦¬®¬§Ÿ—އ‚}zvrld^^adjt}{qf[TOFACHQYWNC4)#    "%%')**,.--/1126;?AB??ADJMMMQUX\cimppmheehosvwuurpnnqtuwy|{ursttwyzvnje_ZVUTQPQRRQRSTVSOMLOVY\cjptsqojjlifc^ZYZYRIA>==>BGKKKMOQUUSOMMKGCA??B@<831110/--..+&$%*/.-*('$  ÿÿÿÿÿÿÿþÿýÿýÿþÿÿÿÿ $(*.1475/,-/25:>BHLPRVahikotz}~vhdo~†ˆ‰ŠŽ•ž¦ª«¨¢œ—’ŒŠ‘›¦±¶´±³´·½ÃÅý»¼»¸¹ÀÉÎÊÀ»·¯§ž•Œ‡…„Š“›£§§ª®²´²®¨ž•Œ…‚€}{{wmecfjpv||tjaZQF@@CJTWTK:)   "%#"###'+*)*,./049==<<=BHKLLNSWZ`gkoolhfejrvyywusqnnqruy{ytqpqsuxyunie`\WVUSSTUTTUUUVQNLLNTY^eilmllkgikhd^WVWZVKB;78;@EKOOPPOQVWTOMLJHEC@AA?;74320.----,)'&',/-,)''" ÿþÿþÿÿÿÿÿýÿüÿÿÿþÿýÿÿ #'+015983///259>BFKQTZcihinv{~€}sgdp‡‹Ž’—ž¤¨©§ š—“ŽŒ—ž¥ªªª®²¶¼Á¼¶¶º¹¹½ÅÍÐÊÁ»µ¬¢˜‘Š‰Šš¤¬¯®°³¶¶²­¨¢š‘ˆƒ~umlosvx|}ulhaUJDCDHPUWQA-   !"&'()*--,.379:<<@EFGIKPUY]djmmjfedkvyyyxuromprsx|~‚€wtqooqtuwvqkgc`][YWTRQRRUVVUQONMPW^eijkjiigfhheaYTTUWRF?956<BIOSTTUTTXWRONKJIFDCC?;844441--..-+('),./-+(&$  ÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿþÿþÿÿ "',114996200259>BGLRX_gljjnuz}}xndco€ˆŒ‘•™¡¤¦¥–•“‘“˜œŸ¡ŸŸ¤¬´º¾¼´­¯´µ¹ÀÉÑÒË»´«Ÿ“ŽŽ‹Œ“§°³±±´¶³¬¤ ™‘‰‚€~‚ztvyzzy{{tlie\QLJGGKPTRF4& ""!  !$&&(+,+),1469<<>AABEIMRW[`fkkgeddkvyyzyvqoquvw{„ytppppstvwuojhfc`\YTONNOSSSSOMMPU]fmnmjiihgghda]USSQSLB><99?DJQVWVXXXYVRPOLLJFDEB;8644653000/-*('*.0.,)'%! ! ÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿþÿÿÿþÿþÿÿ $)-0038;743247;?DIMSZ`flmmosvyxsjban~‡‰’˜›œŸ¢¢›“‘“••˜›š•”›¥°·¹µ­©ª¯²·¿ÊÒÒÌú³ª’““Ž”œ£¬±°°²³®¥œ˜˜”†€€„„€|}€}xwxtnkhbYTQLGFHMNH</% !##!   $&&(+,,+.24579:;>??CFINTWZaggcbdhmstwyxtpqx{{|~€‚€ztoppqtuuvvqmkjhc^ZUPNOPRQQPKJKQXbmrrnhefffhe`]WRROLLG@?@>>BEIOVYWXYYWTRQPOMIECC@;96469742210,(&'*.0.+*($   ÿÿÿÿÿýÿýÿÿÿþÿþÿÿÿÿ &*-1128<:6656:=AGLNRY^bhkmoqsutoha`k{„ˆ“—˜—™œ ¢›“’•˜šŸŸ—Ž•ž©³µ¯ª§¥©®´½ÇÍÎËú±§›”–™–““—›ž¤©¬°²³¯§˜–’Ї‡‰ŠŠ‹‰…„†ˆ‚zwxxvsojc^ZRIDCFJID9,%" !"!  #&&)+,./13335789<>?BDFKQTX^cecadimoqsutqosz}~‚~~|wtpqppuvtuurnkjgb_]XRPNOQOOMJJLQYdnsrnhfdcdea]ZUSRMIHD?>AACFFHMTXWYYXWSQQQOKGCA?>=;647:745531,(&(),/.*+(!!    ÿÿÿÿÿýÿþÿþÿýÿþÿþ  &*-2338<;8888;@BGLPRU[aceiloprrnhaajxƒ‰•–”•˜œ¡¤Ÿ˜—˜› ¢¢Ÿ˜ŽŒ’œ§°±¬¨¤ £ª±»ÃÇÈÆÁ·¬¢š˜›œ˜–˜›œž£«²¶¸¸±¥œ—””—˜—˜™˜—”Ž’‹ƒ€zvqljeZOGCDHKKC3($"!!  !$&*,-0111124779;<?BCEJPRV\adcachknprrpopty|~„…~{ywvtroottqrsokgdc_]]ZURONOPOMLNPT]fmpolkjgdcb_[XVTOLJIE>=BDGIIKOSUVXXXWSQQQNIECA>==<8688535751+'')((,-+*% ÿÿÿÿÿÿÿýÿýÿþÿýÿýÿþÿþÿÿ "&*-1347;:9999=ACEJPQQX`acfilmpqnjfgozƒ‰•–•™ ¥©¥Ÿ›š›ž¢¥¥£›‘’ž«²±«¥ Ÿ¥­·¾¿¿¿¼´¨žš›š›Ÿ¢¢žž¤®¹¿Ãý¯¤œ™› ££¤¦¦¤ œ™™š–‘‰†‚|wurpj]QKGGJLMI:-'#! "%*,-01/./13579:;=?AEJMOTZ]_^_chlmoqqnmpuy|~ƒ…ƒ€{xxxwsnorplnnid_\[ZYZZYWTQPRSPPTVZbgjliijjhfd`^[VVSKJKKG@?FIJLKLNRTUVVVVTSRPMHEDC?==<<;;942354/*'')('*,,*#  ÿÿÿÿÿÿÿýÿþÿþÿÿÿþÿþÿþÿÿÿÿÿÿ !!!$'+-0368;=<;:;?BDEHOQPU^``dhkkmnllknt{‡’–˜›¡¤©­ª¤ œœ¡¦©«§‘–¤°´±©¡›¢©±·¸···°¥›šž žŸ¦©§¥¥¬·ÁÊÏÏǸ«£ ¡¤¦¦¨­¯­©¤Ÿžžžœ”Œ†}xvtqi\RONLLKNL@2)#  $')+-.-,.0256899;<?CEHJPWYYY[agklmnnkknsy|}€‚€|wvvxxrmmmjhhgd_[WUTUWXZZXUSTVTW\]biihgefhhffe_\[UTQJIKLIEDHLNNLLKNRTWWVURRRNLIDCCBA?>>>>921343-('')('(**)$ ÿÿÿúÿþÿýÿÿÿÿÿÿÿþÿýÿþÿþÿÿ """"!#%(+/148;>@?==>@CDDEKPQT[__bhkllklmnrv{„Š‘—™š §­¯¬©¦¡¡¥©¬°«ž“‘«³´¯¦ šœ¢¨­±²°°°ª ˜™ ¢  ¦¬­­®±¹ÂÉÐÕÖÐÁ±§¤¥§¨©¬±³±­¨¤¡¡¢¥¤–ƒ{xuof]VSRPLJNNA1'!   $(**+*+../355579:=@ACFJRUUVX\aeghhhffjpuwyzxurposwvpklkgedcb_\WSPPQTXYWUSTXZ]bekpmhfdcefdcc^[[VROKKNNLKKKNQQOLJLPTXXVROPPNOKEBCDECABB@910320*&&'))'')*&$     ÿûÿöÿúÿÿÿþÿüÿþÿÿÿþÿþÿþÿÿ  !$&%#"#&*-146:>CEA?@AADFCBFMPSX]^bgkonmnmotz~‚„‰“šœ›¡ª±²°®¬©§©¬¯±¬¢™š¦±´³¬¤Ÿžœ£©®°®«©§¡™”™¡¤¤§®²²¶»ÁÈÌÎÐÓÖÒĵ¬«««­°´·¶³®¨¥¥¥§¨§¢•Šztkc]YURPJGKK@0$    &)*)(*,+,/002577:=?ABFMRQRTX\`b```adhmppqrnllklputokmlhfedda]VOKIJMRUTSTWZ^agjnrpljheeda_^]\ZVQMLOQQPPROOQSRLILQUYXSONOPQQLEA@CGFEEC@;410.+($#%'('&)+'"    #1,ÿÿÿýÿúÿøÿýÿÿÿÿÿÿÿÿ  "%&%$$&+/258<@GIEBABDGHDACINRVZ]aelqqppnnu|ƒ‡†ˆ’œ¢£¥­´¶´´²¯¬¬¯°¯ª¤ ¤­³³±ª£ Ÿž¤«¯¯ª¦£Ÿ™“’˜¢§«±··ºÁÇÎÒÑÐÎÍÏÌÁµ±´·¸·¹½¾¹²©¤¤¦©««©£—Ž…|rh^XTQPNHDGG>0$    #()''*+))++-03558<?ABELQQQSUY^]ZYX\adgjjkljiloorutqopnjhijgb]VOIFEDGMPQV\^aeknnqpljigea^\[]ZUSQMNRRRRSUQNORQJGKQU[YRPPPPONKD=;@FIJHA><851-)(%#$%%$%),(!    +=IFCW^Bÿóÿòÿüÿÿÿÿÿÿÿÿ  #&&&&&).27;=BIIGEBDHJJFCDHMPSX]`dlrsqpnnt|„ˆ††—£©«®²´¶·¶²°¯¯®¬§¡Ÿ¦®±±­§£¢ Ÿ ¦ª®®¨¢ž™”‘‘—¢«²»¿¾ÀÆËÐÒÐÍÊÇÇÆ¿¸¸½ÃÆÄÁÁÀ»°¥ ¢¦¬¯­©¢›”Œ…|rf[SMLKIGDDD=0#   !%'&'**((*)+/1357;?BEGKQSRRTXZYWTTW[^`ehikklpvwxywutsqnlmnic_YSMHC?@GOSW]`djoqppoifdeb^][[\WPPPNQUTSQQRQMMONHFJPU\ZSRRRPKJJD<9=DILJB;99850+)&%&%#!$(,)!   #5BOqÈ›2¡zÿüÿüÿÿÿÿ  "%%%''),07;=CKJHECFIJJHDCFLOQV]`dkqsrqonry‚……†‰žª®®¯±²µ´²²±®ª§¡œ› §­¯ª¤¤¥¤¤§ªª«¬§Ÿ˜“’’’– ¬·ÁÄÁÁÅÊÎÎËÈÅÁÃÇÄ¿¿ÃÇÉÆÂÀ½¹±§¢£©¯°¬§ ˜‘‰ƒ}sg\RLHFEFD@A<0"   #%')))'&''),.269;>BFHKOPQQSVWWVTTVY[^cgiloqu{~}}yvvusqppnhda]WQKE?@HSXXZ_fmrronlgcbb_\\YXXSOPOOSURPNMNONMMLHGLRX[XSQQQPJFEC=8;@FKKB944662,*(''&$#&)+*"  &2H"ÑÊ]5 ÿÿ   !!#$$&'(*-06;>CJJFDDHHHKJGEGLOPT[`cinrtsplnu}ƒ‡‰˜¦­«ª¬®¯¯¯¯®¬§¡œ˜–˜ž§¬ª¦§ª©©®­«­®§œ’”•– ¯¼ÃÄ¿¾ÃÉËËÈÄÀ¾ÂÈÊÆÄÅÆÄÀ½½¼¹µ¯¨¦¬²²­¥œ•މ„wk`VOJFDFEBA<0"     #$&**)(%$$&(*07;;=ADGKLKMORVWXZXXY[\`dhkmqsu{}}}yuuttrrqlgbba]UNHEFOX[XX_fmrqnmkfcdc]XWTRPMLNOQTROKJKMNMLLIFGNVZYUQPMLLJE@=<:9=CHHB:2/241-+*'''%&&&))"   ’ÀˆÛ E5    !"#$$%&&'*.28=@DHHDCFHGGIIIIIKMMQY_cgjotspkjov|†‰‹”¡¨¥¤¦¨©©««©¦¡œš–‘’—Ÿ§ªª¬®¬­±¯­±±¦˜Œˆ–™š£´ÁÆÅ¿¾ÄÉÈÅÁ½ºº½ÃÈÇÃÁÁ¿¼¹¼¿¼¹²©¦¬³µ¯£—Žˆync\UOJGFHHD=0#      ##$()('%##$&(.68:=>@CFGFIMPUWZ\\[ZZZ^cfjmrstxz{|xtsttrqnifcfgb\VQOPV[ZXZ`ekpomljgeec[TQNLKIJMPTSNKHHJKKLMLGDHQVZZTNLHFHIF=7679<@DD@;4.-0/+*)%&'&%$#&("    -•dø›ë¡g/ ÿÿ  "!#$&&&),048?ADGGCCGHFFHFHKJHIJNW^cefmtsnkjkqy†ˆ‹’œ¢ŸœŸ¢£§¨¦¡›š˜“Ž‘˜¢©­¯¯®°±°®³µ§•ˆ„‹–š§ºÆËÉÃÂÅÆÀ¹µ³³´¶»À¾ºº½¿¾»¾ÂÀ¹°¦¢©³·±£•މvmd^WQNLJKLH?2$    !!!%%$$$#"$&(-369;<<>ADFHLNRUX[\[ZYY[`dhkprswyz{wsrrrolhfeejjc__^]\^^[[_bejlklkiihd_ZTPLLLJLNPTQLIHHIHILONHFMUXZ\UKGCABCB<5/08<>@>;94.,,+)(&%'((('%&%!     !e²®––\(  #%%')-359?ACFGDDHIFFGFIMJFEGNU[addkssnlkjnw€…‰Œ˜š–“•™œŸ¤£ž›š˜‘ŠŠ“¦¬®®®®°°´ÃƯ˜‰ƒ‹•™Ÿ¬¾ËÏËÆÄÄ¿¶¬¨«®®¯³¶²®´¼ÀÀ½ÀÄÁ¸¬£ž£®³® “‹Š‹‡|qic]VQQRQRRMB4&   ""!"###%(*-148<=<=BFGILNQVZ[[ZXXY[`dgimoqvxyyupnlljfdgefjicaegffhe`bfggiihijjljd]YVRNOONOPPROLIHJIIILONIHOWXY[UKE?<;<=:3--29<:974/++*))&$%()+-,'#    6;/3-     "$$$',359>@CEFEFIHFFGFJONIFGNSX_dflqqppnkls{‡‹Ž•™–Œ‘“–››š›œ˜ˆ†ˆŽš¤ª­­«¬±»ÌàÜ»ŸŽ‡Œ”˜¡°ÂÏÑËÆÄÀ¸­£ ¤©ªª««§¦°»ÀÁÀÁÅù¬£Ÿ£©ª£˜Žˆ…†ƒynf`ZTPQSTWYSF7) !""#$$#$()+/39>@??CGGGJMRY^]ZWUVWZ^begikmsvutqlgefebcfffhgffikikmiejmjggfeghkmid_YURPOPOQRQPOOJJMNNMKJJGHOTVVWRKD=879;610//366642-()+,)$&*+*+,*$    %     !"###"%,15;>AEGEEGHFDEEFIMOMIJPTW^dinpprtrporx}ƒˆ—š•Œ‡ˆŠŒ“‘”˜—ˆ„„œ§ª¬­««´ÈÜåÙ¿§–•™¢´ÇÒÒËÆÃ¼°¦ Ÿ£¥¢  Ÿ¡ª¸ÁÄÃÂÅÆ¾±§¦©ª£™‘‹‡‚~|tja\VOKMOQVXTH:, !"!"$$!!%'*/49>A@@DHIFFJS[^[WSSUTVZ^cffhjotsrqkdaccaadeddehkmlikliglmgddccghjkfb_ZWUROOPSUSPOQMMQSSOHCCFJNQSTQLGC<669842210.03222-)())'(+-,***%          #&((%$$$&+.3=ACHHEFHFBBCEFGJLLKMRUW[ahmnpsuutruzƒ‰’›œ”‰„ƒ„†Š‹ˆ‡Š‘•‘‡…¡««¬®¬ª°¿ÊËź«œ“”˜›¤¶ËÕÓÌÅ¿¶©££ œ˜•—š¨¹ÂÅÅÂÃÅ·­«­«£š’Š„|tmdZTPJFGHKPSQH=/    ""  #'.49=@?BGKKHEJSY[XTQRUTSW[adceglrssrldaba``cc``cimmkjkljhjica`^bhhghc_]ZYZXSRTUUSQQRQPRTSMC=@GLMOQQLFCA;45755532/,./03/,+()*)**(),*%           #(,.-(&&%'*+0;ACFHFGIE@@BEEDGJKLMRVVY]bfinsvvvuv}‚‡Œ”ž”ˆ}ƒ…„€†Ž“”’Œ‰‘¢­««­«¥¦¬±µ·´©˜™œ£µËÖÓËø­¤¢¤¤Ÿš•‘–œ«½ÆÇÆÃÁÂÁ¹¯ª©§¢žš—“ŠtjaWOKGDBADJMKF>1#  %+07=??CHKJHHMSVYXSPPRQNQV]a_`dhnqrqlgca_]_````dknlkjklkihe`][Z_hgdb^ZYWWZZWWXWVTTSTTRPONF=:>FJKMPNID@>:42344342-,+,10.-**,*++'%(,'        $)./,*('&()*/7<@DGGGGEBABDCCGJLMNRUVY\^`ekqvwyww{…Š“ •‰€{|€€~{|‚‹‘”•Œ“¢«¬«ª§¡Ÿ¤ª¯´±¨Ÿœžž¢±ÆÔÓ̲¤žŸ¢£ ™‘Šˆ‹‘š¬ÁÌÌÉÆÂÂÁ¹¯¦¢ Ÿ ¡Ÿ˜‚wkbYQIFDA>AFECA<2&    !$',2:?@CHJIIMQRUYWRNMNLHJPVZYY]afkonliea[X[]_acgkmkjhijjieba^ZZ_dd`\WUUSTVVUUUUVVVTTROKIHA99=CFHMOMID@=:5102100/,*(*-00*)0+)/* $*'          #'+,+,*(()*+06;?BFFDEDCBBBBDHLOQPRUVX\]^ckpuwxxwx{€†œ¡˜Œƒ|{}|zyyˆ”–“•¡©­®«¦ Ÿ¦­²´°¨¢    ¤¯¿ÍÑÌò¢›šŸ›•Žˆ„†Œ˜­ÃÐÑÍÈÆÅÁ»±¨¡žŸ¡Ÿ˜ƒynf^TKGFB@CD@=<:3(   !#&+06=ADIKKLOQRTVUQMLMJGHKORTTWZ_fknnkgb\WY^bdfffgffehjkjeaba]]_`_\XTTTQPQOLLMMRSSRPMIEBC=68<@BEKNLIC?>;61/001.+)))%&00)$*65&"'        $)++,*((*+.4:?@BDDCCBAAABCEKOSUSRSSW[\^cinrssuwxx|„Ž›¢œ‘†}|xvwz‰’—™—”–Ÿ§¯´±ª¤£©±¸¸²©£¢¢¡¡¦¯»ÆÌÊõ§—™›–‘Š…‚ƒ‹›±ÆÒÔÏËÉÆÂ½¶¯¨£Ÿž—ŽƒyrkbWNKIFEFC=8540'   !$).39?CHKMNMMQSSTRNNOMIGILNQTVY^cinnlid^ZZafggc`__acillke`bb_^][ZZXWWWQNMIEFFEJKJJIHEA??:57:=?CILKF@==:6/,-12.)(*(!!(/. #CD"        #())*''*,.28=@?@CBABAA@ADFGKQVWTQPPSWZ^cgimnmqvyy{‚›¢ —‹…‚xsv{‚Œ•šœ˜˜¦°¶µ°ª©®µ»»³¨ Ÿ   ¥®¶¿ÇÆÀ¸®¢™™›˜‘‰ƒ‚…¢¶ÈÒÔÐÍÊÇÅý·°©¡ž¡¡™ŽxrldZSONNNJC;3.,)#     !$',27<@DHMOMMQQRUTPMMLIEFIKOTXZ^cgkkjgb]Z[cgec`][Z^djkigc`bc`\YWXZZZZYRNMGDFFCDCBCEDBA@=:789<>CILHA=;:95,(+01,&')% ",*"!S„S         !%)))($%+-/27;==?A@>?BB@AFHHLQVWTQPOQTX^bdgjkjovxyzŠ™£¤”މƒzsu|„Ž”—››™›Ÿ¤¬³¶´¯®²·»¹±¦œ™šž ¢©°¸ÁÂÀ¼´¨Ÿž›–††Œ™ª»ÇÎÑÑÎËÉÈÈĽ´«¤¡¥¥›€vokf^VRSVVNE<2*'$     "&'+05:>AELQPOPOQTSNIIIGDDEHNRUX\adgiie_[Y\aa^\[[YY^digdcaacb^ZWTUXZ[[XQNMGCGIGEA?BEDA@@><;:;=>AHLD><9883*(*-/+$$&$ #%&@ÜET       #'+,,*&&),-.148<>?><>CC?@FGIMRVVSQONORX_bcdfgipvwxz}†”¢¨£›—…}vv{„Ž’’•–—œ £¨­²²°°µ»¾¹¯¢—‘”›žŸ¤¬´»¿ÁÁ»°©¤¢Ÿš“ŒŽ—¥´ÀÇÊÎÐÎÊÈÈÉÇÀ·¯©§¨¦ŽwplicZUW[XOF=3)$!    %().37;@DKPPNOOPPNIEFGFDCDGKNORW]adhkha[YZ\YUTVWVX_ceb___aa^ZWTQRUWY[WPOOHCFIIHDCEFEB????>==>>@EIB<;7650+)))+)$!!! "k°Ý’      $(,,-,'&'()*,05:=<;;?DB<>DFINSUSOMJJMRY`ccabdiquvxz|ƒ¡©¤š’ˆƒ~y{„Ž‘”™œž¡¦ª¬¬°¹ÀĽ®Ÿ‘‹˜œ¡ª²¸½ÃÆÂ»µ°ª¥Ÿ˜“˜¤³¾ÇÊÊÌÍÊÇÆÇÈž¸´²¯­©Ÿ‚{uqlf`\\\VKC=5*#!     #'(-359>CHNLMPOMMKGDDFFEEFFHJKNRW\_ciic]XVVRMNRSSX^_^\[[\_]YUQOLNSUVZVOPQJFGGGGGGGGGD?>>?>>>?@ADGA;9630..,*(''$!Yr\         #'*,++*%##$&(+/37:::;?B@=>CGJNRRPLIGGKQX_bb``chmruwwyŒŸ§£™“‹†}ƒŽ‹Œ‘––—›Ÿ¢¥¨°»ÄÈÁ³¢‘Š–œ §¯µ¼ÄÊÊÇÆÁº³«¤¡§´¾ÆËÍÌËÈÆÆÅÄÇž»¹·³°«¡‘„|vpkeb`\SG@<5,&"        %).259=@EJKNQMJJHEDCCDEEEDDGIJJMSVZaca]VQOKHJNPTYZXWWXZ[\[WQLJHJORTXUPQOIHJIGFGJIIJF@=<====@DEDE@;96/+-1/,*'&%"#0<:2$      "&)*+)(&"  #'+/368;<<?BBA@CHMPQQPLIFEHNU\_bbacgjnsutuzˆ›¤£Ÿ™“Ž‹„~ˆ‘””•˜›œ ¥®»ÆÈÄ»©—‘˜ ¡¢§¯¹ÅÎÒÕÖÓÍÇ¿º¸»ÂÆÊÍÎÍÌÇÅÇÅÄÇÆÁ¾¾»µ°¬¢”Їƒ}ysjdc_UF>;5,&"     !(.036:?CFKOOJIHEBA??ADCA@BEGFCDIMQUYZXPJHGHJNRVWUUSSWZZYYWQJHFFJLOTTSRLHHJKJFGJJKMIA<:;;:;@DFCB?:73,(+0/-+&%$!        $((''&%" #'+/368;=>AEECABHNQQPPMHECEJPW\bdbcfgjostuz…• £¢›“ˆ‚‚ˆ••””–˜˜™›œ ¥¯½ÆÈÆÀ°¡œœž¢¤¡Ÿ§´ÃÐØÝààßÛÖÑÍÌÍÍÎÎÌÌËÆÆÊÊËÌÉÅÂÂÁ»´®¤š”“ˆ„|pgdaXI?;5+$!    $+-/16<>AHMLHFFC?=<;=@@>=?CDC@@CGJLPRPJDADJMQUVSOQQPSWWVVWRKGFEEGKOQSRJGGGJJHHJKMPMGA<:97:>ACA@=630+*-/-+($"!        "%$"$%%$! "%'+/1578<@CEFB@BFJNONOMHDACHLQX^a`addekqtwz‚˜¡¢œ•’މ‰Ž–ž››››œŸ¤ªµÂÊËËÌÀ¯ª©§§§¡›™Ÿ¬½Ì×ÝâèëëèáÚÖÓÑÏÌÊËÈÄÆÌÏÐÏÌÈÅÅÆÃ»²©£ žš“ƒthc_YMB<5,%!   %&)-169=DJJGDDC?<;87::8:=@@?>=>ADGJIHFA=AJNRUTPKLNMPSTSSUQKIGECDHKLOOJFDEGHHIJLNQQNIB<87:=?@>=;1,-+.1/,(%# !          ""#!!"$%$$%%'*/1577=CEEDCAACEILMNLHCBDGJOUZ^_`cegkptwy†’Ÿ¥ ™”’””‘”œ¤§¦£ž›ŸŸ¢¨±¼ÉÐÒØãÙ¿µ³¯¬©¢™—›¤²ÂÍÕÜåîðïêâÛÕÒÏÌËÍÉÅÈÌÎÐÏÎËÆÄÆÅÀ¸¯«¨¤Ÿ˜’‡uhb^ZRF<4.("       #(,26:BGHGDDEA=;632348<=<;989=ADECCEA<?HLNPPNIJMNOQRQQRPKHGGDDFGGHIGDBCFGIJIJMPRRME?;;<>@?;96-'(,13.*&#!      "$#! "$&&&(((+/49:;?DFDEEB@BCFJLLIFCCFJLQW]abcehknrvvw|Œž¨¦¡œ˜˜™—–—¦««§¡Ÿ ¡§®·ÂÍÓ×áëßȼ¹µ°¬¤š˜œ ©´¿ÈÏØáåèçãÝ×ÕÔÑÐÑÌÈÉÌÏÑÐÍÌÇÃÃÃÁ»´²®¨£•ˆxib]ZUK>61,%        "(069?BEFDEGEA<72/027;;985348?A??CFC=<CGIJJJIJNONOPOOPPKHGHHGFDCBCBA@CFEILKKMPQPLF?=?ABC?:72+&'-33-&#!   $!      !$#  %('(**+-29>>?ADEDFGD?@DGIJIFDDEILORXafhjlnqrvwutvz…–¤¨¨§£Ÿœž£©«¨¤£¥¥¦®¸ÀÉÎÑÕÚØÐŽ¹·³­¦ž ¢¥«´½ÆÍÓØÛÝßÞÙØÙ×ÕÓÎËÌÏÓÔÑÎÍÉÅÃÄü·µ±«§¢˜Šzkb^ZWQE:4.&         $+26:=@DEEGFD?94..0389865106>?=>BFC<:?DGIGHIJLMLLLNOMNLJKJJIFB@??@@>@DDIMMNQPNMLG@>ADDB>830,)*041)!  #      "" #''),+,/4;?@BDFGGGHE??DFFHHECCEHKNPT^gmrtwxxzztnmr}›¤ª­«¥¡£¥£ ¡¦¨¦¦ª®®¯·ÄÍÑÒÐÐÎÉÆÃ¼·¶³­§£¤¥¦¥§¬·ÃÎÔØÛÜßàÜØÙØÖÓÑÑÒÔÓÐÏÏÏÌÆÄÅü¸¹¶¯«¦šˆykc_\[VJ>60("     !%)-158=BCCDDD@<71./047653128=<=?@B?<<>CHKIHKJJKJJJLMKKKKLJGFC=:;;>?>?CDHLMPRPLKKIC?BEC>93.-+*-12+"          $$! "%&*-,,/4;>?CGIIKJHD?>BDDGHDAACEHKNRZeovy}~~|tjfkv…“ž§¯¯©¤¦©§¥¤¥¥¥©¯³µºÂÍÕÚÚÖÑÍÉÇž·¶µ®§¦§©ª¨¥¨²ÀÎ×ßääääÝÖÕÖÕÔÓÔÖÕÐËËÎÐÌÆÃ¿»¹¼¼·°¨™…vjb^\ZWNB;4+$      "&)+.137;?@@?AA=;74434764237:;;?A?>==>@CFKLKLMMKJKKJJJIIIIHC@<6478:=>@DDDILPSPKHHHECCCA;5/**)*-/-$            "&'%! #$%)+,,/5<=>BHJJKLHC>=?BEHGC@@BCEGLQYdnux|€€zpfcfn|‰•¡¬±®§¥¨ª«©¦¤¥«³·¼ÃËÒØÝßÝÛÖÎÇÅÁº¶´¯©¦¦ª­¬¨©°»ÇÑÜääååÞÕÒÓÓÓÑÒÔÒÍÈÈÌÎÊþ»¸µµ»¿»³¨™…sg_ZWVUPIA90'!    $&(,-.15:>=<?@@A?=;9898546:<==ADB?==?ABCINMKKKJJNMHGFCEFDDB>822467;=@DDCHLPTQKHFFFFD@=83-)((*,*&             "*+($!!#$&***-17<>?AGKJKMIB>>?BGJHC@@ADDCHQZdkorx}~th`_bhr~Š˜¤®³®©ª®­ª§¦§­·¾ÃÉÎÓÖÜßÞÞÜÔÊÇÆÀº¶°ª¦¥¨¬­¬«­´¾ÇÒÜßãæßÕÐÐÐÎÍÐÒÐËÇÅÈÉļ¶³°­¯¶»¸¯¦œˆrd\VRRQQNG?7-#     #%)*,/17;<<=@ACCB@=;98768=@@?@CCA>=@BABIMKGEGHJONHDA>@?=>><6//3669<=@CEIKOSOLKGDFHE>94/*'&''(#          %..(#"$'+*).48;>ACHMMMMICABADILJGDBADEEIQ[bfhkrvyyob\\]ajv™§±³²°¯¬¨¨©¬±¹ÀÄÉÏÓÕÙÝÝÝÝØÏÍÍÈý¶¬¦¦¨ª¬­«©¬µ¿ÉÓÜåçáØÓÔÑÌÌÑÓÏÉÄÀÁÁº²­ª¨¥¨¯³°©£›ŠscZTPONNMJD=2'      #&(+-/3689;>@AABA?;7887:?BA?>@BA>>BDBDIKIFDGLLNKEA>=<988860++0567:9<AEJMMOONKGCEFA;4/*&#"! !            #"#(--'""%'))).5:=@CFJNPPNIEEGDEJNMKIGFFFINSZbdcelpsumb][Z[coz„Ÿ«±¶´®©¦¦ª¯²¶¼ÁÇÐÖ×ÙÝÞààÚÕÒÒÐËŽ´«©ª«¬­¬©ª°¹ÁÊÙçéåßÚÙÖÐÎÑÑÌÅ¿»¸µ­§¤¡šœ¢¦¦¤ ˜‰sbYRNLLKJIGA6,"    "#&)*+/3556:<=?A@<75789<@CB?=>A?<=CHGGIJJHFIOOKFB?=<962220+()-46788;ADILLNNMJD@@?;5.*&!         #%%),+)&"  !"$'&&(+059=AEHLNPPOLHHJHFJNONNNLHGKQU[bc_bjmnpkd^ZXY_ir}Š˜¥­³³®§££§®²³·½ÄÍÕØÛßâçæàÛ×ÕÓÍÆÃ¾µ°­­®°°¯±µº¾ÅÔâççãÝÚÖÑÌÉÆÄ¿ºµ°©¡œ˜”‹Œ’˜–‡tbXQKIKKJHHD:0(    !"%''(+0211489<>;62259=ACDB=<>@=:=AHJIHIKKGFLNJD@><852../,)*+.4767;@DFIKKLJJGA=<;6/(%!         "&(')-+'%#! "" !#$%')'&)-379;@EHLNOOPOMLMLJLPQRUVQKIMSW]cb^ajllmke_[Z[_fnx…”¡©¯±­¤žŸ¥­³µ·º¿ÇÐÖÜàäëìéåÞÚÖÏÉÈÅ¿ºµ±²´µµ¸¼ÀÀÅÒÞããàÜØÒËü¸·¶µ²«£˜’Œ†ƒ€ƒŒ•˜’„sdYRKGHJKIIE=6/&   """$&%&'*./.0678962015:@DFD@;;>>;;?AFJIHHJKGCHMIC>=:520./0-+-./2656>FGGIKJIFDA>9760)#       !$'*)(**(%#"! !"#$&(*++('+06:<?BDGLOQQRSSQPOOQRTVZ^YQOSY^cea]`ilkkjfa^^`cgku‚‘ž¤ª®ª ˜š¡®º¼»»½ÄÌÒÙÞãèëîîçàÛÕÏÎËÆÄÁº¶·¶µ·¼ÁÂÆÏÚßàßÛÕÍÆ¾·±®¯±¯©¢Ÿ–†€|{}ƒŒ‘‹}nbYRMIGIKKHC=:5-$      "" !$%'&&*./0577421148<@DEA=<=>=;>CBEIHGGHGEDGKG?9971.0//10,-//0346?FGEGJHHD=<:30.'"        #'()(&'*)'%"!!!!!#&*.//.))/5:>ADFGJMPRTUWYVSRTUSTW\`^YW\aeif_Z`ijiigec`bfhhjs€Ž™Ÿ£¨¤™‘™¯Äľ¾ÀÅÉÍÒÙßáäëîíèâÝØ×ÓÎÍ˼¹¶³µ¹¾ÁÃÉÓÚÜÚÖÐÍËÆ¾µ®­®­¨££¢›†xwxz‚ˆ‚tg^UNKJHHJKGA<;90'!    ! #()(*-/0255113579<?AA><<>?=<?BAACDBBCBCFFGD<852.+-..11-,/01248>CEBCEEEA:85.*'!         %)&%%$(*)(&#""##"$',000.,.5=BFGGHJLNPSTV[]XTTVXUSV[^_^]befhd\Ybjifdcdddfijhiq}‰’—œ œ‘‰‡Ž¦»À¼½ÀÄÆÈÍÒ×ÙÛáçëëéæãáÞÚØÔÌÄ¿»º¹º¿ÂÁÄËÏÑÏÎÏÒÓÎǼ³­­®ª¤££œ†~wtstzzmbZPIGGFEHKIC><;4+%       " ")-,+-02134236888:<=?=<<>><<>A?<==;;?ABDDDB<851.+,-043..15448;>@BAABB?<730,(&      !&%!"%)))(&%$""#$'*/110/27>CHNPMKKMPTVWY_b\WXZ[YVUY\``^beeda\\digdcbdfgihiijpz…Œ•™•Œ„…’Ÿª±·ÀÉËÉÊËÌÏÓØÝâäèéééèåáÝÖÍÆÅÅÄÃÆÆÃÄÆÆÆÆÉÏÓÒÎÈ¿·°¯°­¦£¢œ‘†~yvtuxzti_WMFEECADIJE>;:72+#     !$# !&-1/.056433468:979;;=<;<>=;;>B>;;:9:?BAA@@A<863/,/2596224778<?@<<??@?841-*)(%      &(#!&)),+('%#"!#(,056448>CGLSWVROQTVY\_dgc^^_^[XVW[`a`adfea_`deeggfghihefghnxˆ‘““Œ…€ƒŠ”Ÿ­ÅØÓÇÄÄÂÄÊÎÓÖÙÞâæéêèäáÝÔÍÍÎÌÊËÊÇÅÅÄÃÃÇÍÑÐËü·±®¯­¨¥¢šŽƒ}zzyyzyqg_XNGED@>@FJF>98760&      #$%$(/22248:8445578747;:;99=A><>AB?=<99=BB?@@>>:653//38;<977789;=>?:7:;<92.-+('%"       !%(&#%)+,+(''%$"")/38:78=BINT[][XUVXYZ^bgkicbb`]ZXXZ^`bcgkgcaacdejkjlljfcbceku~„Вއ€||€ˆ‘£ÁÓʽºº¹»ÂÆÈËÏÓ×ÝàáâàßÝÖÐÐÐÍËÍÎËÆÄÅÆÆÉÍÎÍȾµ±®­­­«¦ –‰yy{|}}ypga\UMHC?=?EJI@9642.(!     #%('(.24467886563121/267899=@==BCA>@>76<@@>@A><74310259==<<<::>>=<<9778630.,+)&"       ÿÿÿÿÿÿÿÿ  !$$$&)./*&%$%%"#,26998;@GOV\cfb]Z[^^]aeilkgddc`][Z[]_chlnhcbcefglnmnomhcbaelsy†ŠŽˆyst~Š—¨±°®¯¯®±¸¼¾¿ÃÈÌÑÒÔÖÕÖÖÑÎÐÐÌËÎÑÐÈÆÉÌÍÍÌËȹ¯¬­¯±²¯§’†{vwz}~yoe`^YPID@>@EJJB;73/+(%     !!#$$())-/1455556772-++++.049:;<:=CDA?A=437:=>??=;51222568<>ACD@?BA>=:855542/-+*)#      ÿÿÿÿ !#$)+,25.'$$%$#'.37879>DLTZ_ejidbbeedgkmonkgffb^^]\\]cjmlhedfhhjqrppqpkfdeimpu{ƒ‰ŽŠƒzpnv€‡Ž•œ£§¨¥¥ª®¯±µ»ÀÄÆÇÉÉÉÉÉÌÐÑÎÎÑÔÓÌÌÐÓÔÑÌÇýµ®¬°´¶·±§œŽƒytvz}~ynb\\XPIC@@CEGGA=82-)'%!     "#%#!'))++,000112660*''('(,279:;9:@DBBA=5236:=<98852356888<AEHIFCC@><8410121+)))'          ÿÿÿþÿÿÿÿÿÿ "$%+/0253,''))),/26879?FOX^adikiijjiimqstrokiid_`_\[\bhihghijlmqvussusmgfgkmosz‚ˆŽŽ‰ƒzuvxz€‰”¢£ žŸ¢§¬³¸»¾ÀÀÁ¿ÂËÑÔÓÓÖØÖÑÓØÙÙÕÍÆÀ»¶±¯³¶¶²­¦›Žƒyttw|€|ob\YTNIC?CFFED@<70*%"     !%##((&'&(*((++-1/+'%%&%',158:;:;ADEFC>73349=;6576667;=<<@DFFFECA<9972..020($&&$      ÿÿÿÿÿþÿþ  "$)/0/13/*(+./1248::<AHPZ`acikloqolmqtvxvtqnlhcbaaa`cfgefjlnqtwxwuvwtmgeghjmqx~„Œ‘’‰ƒ€{xy‚šžž™•’’•™ž¤«±µ¸»¿¾ÀÉÑÕ×ÙÚÚÙØÜàÞÛ×Ñʽ¸´³³²°«¨¥‘†|usv|€}qe^ZRLHDADGGDC?950)"   "$%(%##!"&%#$%'*(%$%%%&)*-159;=AEFGHD>85569>=8799;<=@CCBCGEBCB?;63650--263' ""      ÿÿÿÿÿÿ  !$*..-/34/**.157:<<>CHMSZ_`cjkmtwtqptwzz{zxsplgegopfdggehlpuxyzzyxwwrjccddejoty~†ŒŽ‘•–’Ž‹†|‚Œ—›™˜–’‹‹‘—ž¥¬²ºÁÂÃÈÎÒ×ÛÜÛÝàäçäßÚÕÐÈÁºµ³¯««©§§¡”‰€yvx}€zqg`ZSMIFDDEECC?841)       "## !!#%" "%'()*((+07=CHIHGFA=:89:<AB=<==>ADEGHFEGECC@951///-''282&       ÿÿ $&*,,,16873./369>><AIPUY]abdijlsxxvuy‚€}xvrljmwuhcfgilqv{{{{{{yvsmd^^`aejnpty†‰‹““‘‘†„ˆ“—–”’‹‡……ˆŽ–¥«µ¿ÅÇÈÊÍÒØÛÜßäèéçãÞÚÕÌÄ»´°ª©ªª¨§¢—Š‚{xz~xqiaZTNKJGCBBAB?:95+!       !%)+,+('*/7?EJKJHGA=<=@BCGIDBBAAFJIIIGEFECA;30-*'''"$;QL3        " $&(**.59;=;5357:=>@FMU[]`degjjlptwy}ƒ‰‹ˆ†}{xronnkeccflqtz}||}~}ysnh_[]aejnopsx{€‚‚†‘‘’Šˆ‰‹‘•”ŽŒ‰„‚ƒ…Œ“𠤬¸ÂÅÅÇÊÎÓÖ×ÚßãææåãÞ×ÎÅ»´¯ªª¬¬¨¥¡˜ƒ|xy|€yri`[VPNNICAA@@>==:/#       %(*,.-)).28?DHIHHHD??CHIILNJFFFHLPNLLHDDC?;4,*)%! "!3o§•T'       ÿÿÿÿÿÿÿÿÿÿ$0%!%'***06;?@=:769<>AFKRY_`adfknnnquw|„Œ”˜—”ˆ€~{wrlhfedehpvy~}}€yqlhb`djnrsrsuxz|}}ˆ‘’‘Ž‹Œ’–’ŒŠ‰†‚‚„‹”šŸ¦¯·»ÀÆÉËÎÏÎÐÕÚßâääàÚÒȽ¶±­«­¬§£Ÿ—Ž…~zy{~~yrf]ZWROOKD@>=<;;;8/%      #)*)+-,*,259>CGGFDED@BFKKJMNKIJLPSTQNOJD@<85-$"# #DšÙ²]*       ÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿ *% !#%(**+.4<A@>>=:;?DHLQX]`addekpqruy|€†œ¢¢ ™Ž…€~{tnljjjkow}†ˆ…€~yqonjgkpuyvrrtxyz{|~ƒŒ’•—™™•’”•Šˆˆ…‚…•šš¤©¬°¹ÂÇÉÉÈÇÈÌÑØÞââàÞØÍ»·³°®¬¦¡–Ž…€€~}}|zre[XWTQPLE>9776431-&     %*(&')*,1688<@FHFBABABGJJJMMJJKOTVUROMJE>62/'!&@n…g;!     ÿÿÿþÿþÿþÿýÿÿÿÿÿþÿþÿÿÿþÿþÿÿ  $! ! !$$%()**,2<CCA@A@@CHMSW]`abeghkptvzƒˆ‹”£ª«©¡–‡„wqomosux~„‰‹‹‰ƒ„‚{rqrnkmpuzuoqtxz{|~|€‹”š£¤ž™–•‹‰‰†……†Š‘–˜—™ ££©²»ÃÃÂÃÄÅÆÉÐ×ßàÝßÝÓÉÁ¼¹¶²¬§ š–‚€ƒƒ}{tg]XWUTRNF=6331..0-(#  ÿþ  #&)'$#%)-38;:;>BFD@?BBBEGIJLLJIJMQTROMKFB=50-&! ',.)"    ÿþÿþÿþÿýÿýÿÿÿÿÿýÿþÿÿÿÿÿÿÿþÿþÿþÿÿ  !! !!!"%'(+,-,-2=GJHCCGJKNSX]abadghjlqvy}‚‰’–Ÿ­³³°ª¡—‰ƒxqpqsv|„ˆ‹Š‰ˆƒ‚„{tqonmmmqtqoqtx|~ƒ€‚Œ–šž¥§£˜”‘ŽŒ‹‹ŒŒ’’““–›Ÿ¥­µ»»»½ÁÂÀÂÆÏÚÜÛßÞ×ÏÈÀ»ºµ­¦Ÿš•Œƒ„ƒƒ€{sia\XVTQKB93120-.00-)%       %(*'#"$*/28=>>>@B@??CCACFILMLIHIILOMKIEA=951-(#$%     ÿÿÿýÿýÿþÿýÿüÿþÿþÿýÿýÿÿÿþÿþÿþÿþÿþÿÿ   "$%&&).--///4?JQOGGNRSUZ^adddgjikmptz}‰•œ¦³º¹´­§‘‹…|wwxxy†ˆ‰‹Š‰ˆ‚€yuqoqpooppooruzƒ‡‰…„Š“—ž¡¡ž™”““““‘’”–š›œ¡¦¬±´¶¸»»º½ÀÉÖÚÚÝÜ×ÓΞ»·®¥™•‹‚ƒ„„…„{qje_YUSOG<2/.11.,.130)"       "'*,(#"$)/5;@@@A@???@@AACFKMNLGGHGILHFB=:631,)'#       ÿÿÿÿÿÿÿýÿüÿþÿþÿýÿýÿýÿýÿýÿþÿþÿýÿýÿþÿÿÿþÿÿ   "%''',0-*-/29CMVUMKPTVY_efgihhhgjmmpvyzŒ—¤±¹¹´­§Ÿ”Œ‡‚‚|~…ŠŠŠ‹ŒŠˆ‚‚~yvsswussrpopru{ƒˆ‰…‚„†ˆŒ‘”˜˜•”•—˜˜—”““”””—˜˜š˜–™£ª°²±±²³¶»ÆÔÚÜÛÚÙÕÐÈ¿º·°¦™”Œ†………†ˆ†|rlgb\VRMC80-.11-*-253+#       !&*--)%#$)18=???@>=<;;;>@CGIJJGCCEGGEA=842,**&""       ÿÿÿþÿþÿþÿþÿþÿýÿýÿýÿþÿþÿþÿÿÿýÿýÿþÿþÿþÿþÿÿ   #)++/1.*+18?IS[[UOORW\afijkkifdgjjlsvuw€Žž­´µ³®©£™’‹Œˆƒ„‹ŒŠ‹ŒŠˆ………‚}zxy{xvsqpnoqty|~‚€~}„†‰’‘’–™š›™›œšš›˜•“Ž‘—ž¦«©§¦§©­¶ÃÐÚÝÛÚÙÕÎŽ¸¸¶¬ ™•Šˆ‡ˆŒ‡}smhc]WQJA831010,-/343+#      !$ %)-1/+('(-48;==<;::6356:?DFEEC@?@BC>962,(&!!#!    ÿÿÿÿÿÿÿþÿýÿýÿýÿüÿýÿÿÿÿÿþÿüÿüÿþÿþÿýÿþ   #"$*15410/-4AHNY__[WTU[befilmmlgefgikprqqx‡™¨±³³°¬¥—““’Ž‹ŠŒ‰‰ŠŠŠ‰‰‰‡‚}|zvtpmkklmquvwy{{yyz}‚…‰Ž’˜š ¢£¡ŸŸœ›–Љ“™ ¢›Ÿ ¤®¼ÉÖÝÚÖÔÑÊÁ¹µº¼´¨œ˜•Šˆ‹‰€uke`ZTNG>853220.02331+$       %"!&*/33/*+.389;=<:8762/037>CB@A?=<;;92-*&     ÿÿÿþÿýÿþÿýÿûÿüÿþÿþÿüÿûÿüÿüÿýÿþ    #')),4;80056;GPV\`]\\Z]cimkknnnomiggilkkmpv„–¥¯µ´±¬£œ™–•’ŽŠ‹‰…†‰‹ŽŽŠ…‚|xuqmjhgginrstwxvuuvy‚ƒƒˆŽ“™ ¢¤¦¥¡ Ÿž›•Љ‹Ž’–—““—šš§´ÂÑÚ×ÒÍÊÅ¿¸¶¼¿¹­¡›™”‰‘Šuib]VPJD>833220/2233.($       ##"%).252-/248;==:87640,.28?B>=>=:850-)$   ÿÿÿÿÿÿÿþÿûÿûÿýÿþÿýÿýÿýÿýÿýÿýÿþÿÿ"    %)+,06:7229ADJV^_][ZZ\agmqpoprssrojghihfkqx…—§²¸¶°«£œ˜–”Ž‹‹‰†‡Š‡ƒ…‰’“ŽŒ†‚{xurnheddgloruvvsqqrv|€€}‰•›  ¢¦¦£¢¡Ÿœ—”’Œ‰‰Š‹ŒŒ’••˜¤°½ËÓÒÏÉÄ¿»º¾¿¹°¤›—‹Œ†sg`[TOJD=60000./1134-&!    ###&*.2102559>=;:7541/-/5;@A>:984/,'"!     ÿÿÿÿÿÿÿþÿÿÿÿÿüÿüÿýÿþÿþÿþÿýÿýÿþÿþÿýÿýÿþÿÿ)2.!  "(+,,2:=956>GLOYaa\[[Y[ahmprtvwzzwrmhefffkt~‰˜¨´¸µ¯©¤Ÿ™–’‹‡‡‡‡‡‡†„„ˆ••Ž‹…€}yxusmfdddgkmpttspnnptw}~z|…Œ‘š Ÿ¡¥¥¢£¢ ™˜”މ‡‡‡…†‡ŠŽ‘—£®¸ÂÈÌÍÉÃÂÁ¾¿Á¿»´¨žš—‘‹Š‰†‚znc]XRNKD:1,,....-.22-%     ##!#%(,,.256:=:8851///049<>>:741,&#  ÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿýÿýÿþÿýÿüÿüÿüÿüÿüÿüÿýÿþÿÿÿÿÿÿ #170#  #(+,.5>C@:8AJPUZ_b^\]\]fmnnqw|{|€|smifedgmv„™¦±³°®©¤¢–‘І…‡Š‰ˆ‡„ƒ‡Ž””‘Žˆ‚€}yvspkfeeegijnqrqpnnqstxzy{„Œ’šŸ ¢¥£¡¢¢ œš•Ї‡†„„ˆŽ‘– ª²¸¿ÆËÊÅÅÃÁÂÃÀ½¸¬ ˜”‹†ƒƒui`[VPLJB7/++,,,+*,..+$           !"$&*-158:9443.,.038;::830.*&  ÿÿÿþÿýÿþÿþÿþÿþÿÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿüÿûÿûÿûÿüÿýÿýÿþÿþÿþÿÿ #/1+! !&+/39@DFB>BJT\]\`a^^_cjooptz~~|slhhgfjpx†•Ÿ¨­¬ª«©¦£Ÿ™‘Œ‰‡‰‹Šˆ‡ƒ‚‡’•”‡‚}yupmiggefgfhlnoopqrttstuw|„Œ“™ ¤¦£¢¢ œœ—’‹ˆ‡ˆ‰Ž••’‘•¦¬±¸ÁÇÇÆÆÃÁÁÀ½¼¹­Ÿ”Œˆ‚€‚~sh`\WQLJC80+++)'')+.-(         #&'+34570--,+.2799532-*(%" ÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿýÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿýÿüÿûÿûÿüÿüÿýÿýÿþÿþÿþÿÿ "$! !%,38>BFIJKIJVcaY[cd`agkmorx‚‚ƒ€xqkfghhmqy†–¤¬ª¥¤¥¦¤£ š”ЉЉˆ†ƒ‚ˆ•—–“‹†zwrnljhgeefehlmmoqqsutsrsw{ƒ‹’—œ ¤¥¤£¡ž››œ˜”‘‰‡‰‘••’”›¢¨®´»ÁÂÃÅÁ¿¾»º¼¸­Ÿ“Œ‡~~}ui`[WRNKD8/*((&%')+.+"       "$*00/2.*,./157741/-*&#!  ÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýÿýÿÿÿÿÿþÿþÿþÿþÿÿÿþÿüÿüÿýÿþÿüÿüÿûÿüÿýÿýÿüÿýÿÿÿÿÿÿ   $).4<@CHILRROT_`ZYdlgcinnpuz€‚‚~smiccejnqzˆ•£ª¤ŸŸ¡¡  ™—“ŒŠ‰ˆ†„‚‡”––“‰xuqlkjgeefggilmmprqqrrrruy{‚Š‘—¢£¤¦¦¡›™››—“‹‡„†ˆŒ“šž¥¬°³¸»¿Á¾½»¹º»·­Ÿ“Š‚{zzzztjaZUQLH?5,&%%%'++,-'     #)--+--+.44587200,(%     ÿþÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿýÿýÿÿÿþÿÿÿÿÿýÿþÿþÿþÿüÿüÿýÿýÿýÿýÿýÿûÿüÿýÿüÿþÿÿÿÿ   $(,06<>?CGKPTUSSX\]ckkhjoqsy~€~}ypkf`_ckqs{‰–¡§¡ŸŸžš—˜—‘ŒŠˆ„‚‚€€„‰‰‡xupkihgddfhjklnnqrqpprrty|~„Š•›£¥¥©¨¢ž›™š™•‹ˆ„€…‰Œ“—š §©«®²¸»ºº¸¸ººµª›†}wstutoicZTNHA70*$#"$*//-*#     !&*+,--+0654650-,(#  ! ÿþÿÿÿÿÿþÿþÿþÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿýÿþÿþÿþÿýÿýÿýÿýÿþÿýÿýÿþÿÿÿÿÿÿÿÿ  #'+-/5:;<?DLPSVURT\aaciponsy}€‚}zunhb_afmrv}‰” ¥ œ˜˜››œ˜–—–‰…„|~}~ƒ†‰Š‡ƒ‚~zvojhghffhjllnppqrqpprsvz}‚‡‹”œ£¦¦©§¢ œšš—“‹†€zy}‚†‰ŒŽ‘•˜ž£¥¥¦«²´··´·»º²¤”‰woknqohe`WQLE:0+($! #+10,&     $&)--+)-21//.,)&$    ÿÿÿÿÿÿÿÿÿÿÿýÿþÿÿÿþÿýÿþÿÿÿÿÿÿÿÿÿýÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿþÿÿÿÿÿþÿýÿüÿüÿüÿþÿþÿýÿüÿþÿÿÿþÿþÿÿÿÿÿþÿÿÿÿ   $(,.147:>AGMQTVVXZ_ddcjvxsw‚‚€|wpje`_dkpsv~‡‘¢Ÿš””—™š—•“‘Œ…€}yvy{yz€„†ˆ†‚||ypjijjjkkkmmosrstsqnorvy~ƒˆŒ–Ÿ¤§¨¨¦¢¢Ÿž—“Œ„|wvz€‚„ˆ‹‘—¡¢¡¢©¯°´µ´·ºµ«ƒxoheinmf`[SMIA5+&%" "*/-)"     #%(++(&(,+))(&#    ÿÿÿÿÿþÿþÿÿÿþÿþÿÿÿþÿýÿýÿÿÿÿÿÿÿÿÿÿÿþÿýÿýÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿÿÿÿÿþÿüÿýÿþÿþÿýÿýÿÿÿÿÿþÿýÿüÿûÿýÿÿÿýÿûÿüÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿ   "'+-0478:>CJOQUYWX\bfhhoz}|‚€}{xrjfb__emsuv{†’œŸž›—–—››—“Œ‡|xqptxxz€„‡‰ˆ„€~{rlkmlmppnooqttuxvqlmswy…ˆŒ‘˜¡¦ªª©§¤£¢£¡›–‘‹„{wvx{‚…ˆ‰“™œœ ©®¯°²´¶µ­£˜‹}skcaflle]VQLE;1(#" $*-+% ÿÿ      #$%%$"!#&&$#!    ÿÿÿýÿýÿÿÿÿÿÿÿÿÿýÿýÿþÿÿÿÿÿÿÿÿÿþÿþÿýÿüÿÿÿÿÿþÿýÿþÿÿÿþÿþÿÿÿýÿüÿþÿÿÿþÿþÿÿÿÿÿþÿþÿþÿþÿþÿþÿýÿýÿþÿþÿþÿÿÿÿÿþÿþÿþ  !##"#(.026::9<BJPSTX[Z[ahnprz‚{|}zwunfc_^afmqsty„’ž›šš›ž—”‘Œ†}xsllrvyƒ…ˆ‰ˆ„‚|tnlllnstrstttuxzyspquy|ƒˆ‰Œ‘™¢©­¬«©¤£¥¦£ž™’‹…}ywwy~„†‡ˆ‰Ž•˜—–œ¦¬¬¬¯²±«£–‡yrj`^ejibZTPJB90& "(+-*! ÿÿÿÿ     "#!    ÿÿÿÿÿÿÿþÿýÿþÿþÿÿÿÿÿÿÿþÿýÿýÿÿ ÿÿÿÿÿÿÿþÿþÿþÿÿÿþÿýÿÿÿÿÿýÿüÿþÿÿÿþÿþÿÿÿþÿýÿþÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿþÿüÿþ  #%%%%&'*.148:98:AIPTTW^abchswux‚€{zzxvrlgb^]`flkmsyƒš›š™™›œŸž˜”’…|uoklqw~…‡ˆ‰‰‡ƒ€€{upljkosutuwvuvy{yvuuw{€‡‹”¦¬¯¬«©¤¥¨©£ž™’Œ†zxy{„†‡‡ˆŒ‘”“‘—¡§§©¯°©Ÿ˜–’„vpj^[bge_YSNG>7/# %*+*% ÿÿ        ÿÿÿþÿÿÿÿÿýÿýÿþÿþÿýÿþÿÿÿþÿüÿüÿýÿÿÿþÿÿÿÿÿþÿýÿýÿþÿþÿþÿÿÿÿÿÿÿÿÿþÿýÿÿÿþÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿþÿýÿýÿþÿþÿþÿýÿþÿÿ #()'&&)-12248978<AIPSUX^dhgiqwyy{~{ywumhfa\\^dhhlu|„”••™™˜™Ÿš•’…|tonmqz„Š‹‹ŒŠ‡…‚~{upljlpssstvvwwz}{wvvw{ˆŽ‘“— ª¯¯­¬¨¥¦©¨£ž—’‡€{yz~ƒ…‡‡‰Œ‘–Ÿ¢£¨®­¢•Œ‰€uoh^Y^dd^XSME=6-"!(+(# ÿÿ         ÿþÿÿÿþÿþÿþÿþÿýÿüÿþÿÿÿüÿûÿüÿüÿýÿÿÿþÿýÿýÿþÿÿÿÿÿýÿþÿÿÿþÿþÿþÿþÿþÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿýÿþÿþÿþÿÿÿÿÿþÿþÿþÿþÿþ   !#%'&&'(+154358758?CIOSVZ^dghkpty{{}‚‚}yuricb^[\`dfhnw€‡‹•—““˜›™•”‡~vutpr{†ŒŒŠˆƒ|ytpnmmprqqsvvwyz~}yvvwz‚Š”–—ž©°±¯«¦¦¨¨¦¢œ–’‰|{{~‚…††‡‹‹ŠŽ‘“˜Ÿ¡¥©¦šŽ…€~ztnf]Y[ac`ZTLD>5+!#)*% ÿÿ         ' ÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿýÿüÿýÿÿÿþÿüÿûÿüÿýÿýÿþÿþÿýÿýÿÿÿÿÿÿÿÿÿýÿýÿþÿþÿÿÿÿÿÿÿþÿÿÿþÿýÿýÿýÿþÿÿÿþÿþÿþÿþÿþÿÿ "%&'(((*,0330/4876;BFJOTX[`fghowxvy}}ƒztnie`]\]begjpyƒŠŒ‹ˆ‡‹Ž‘“‘‘Šƒ|zxtv~‡ŒŒ‹‰…€{wsqommnpposwwwyz|}zvuwzƒ’”–˜Ÿ©°²°ª¦¨ªª§¢š“ˆ~~}„‡†„…ˆ‡ˆŒ’—™™› œ‡~wsrqlb\Z[`daZTIA<3(!#)*%   ÿÿ            !6'ÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿüÿýÿþÿýÿýÿýÿüÿüÿýÿþÿýÿýÿþÿþÿÿÿÿÿÿÿýÿýÿÿÿÿÿþÿþÿÿÿþÿþÿþÿþÿÿÿÿÿþÿýÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿýÿýÿþÿÿ  !%$%(+,-/231..4879BFGLSY]_dikkpy~{y~}ytmihc]\^behkr{ƒˆ‰‰…‚ƒ†ˆŠ‰ˆ‰‰ˆ„|xwzŠŒ‹ŒŒŠ†‚|wsrolmoqqrtwxxyyzzxvuv{…•••š¢ª¯²°ª¨¬®­ª¤™‹ˆ…‚~€…†…‚‚ƒ„‰Œ‘•”“••”…ypjiljc\[\`eaYQG?90'##%(,(  ÿÿÿÿ            & ÿÿÿÿÿþÿþÿýÿüÿþÿþÿÿÿþÿÿÿÿÿþÿýÿýÿüÿýÿýÿüÿýÿýÿûÿûÿüÿüÿüÿüÿýÿýÿþÿÿÿþÿýÿÿÿýÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿÿÿþÿýÿÿÿþÿýÿþÿþÿþÿþ !#$%'*-...0138;::CIILT]_bgimpqv}€€‚ƒyutoifb]Y]bfjmqy„„†„„‰‹ˆ†…„‚|zww|ƒ‘Œˆ„vrspnoqsuwwxyyvuwxvvvv|ˆ“—–˜¤¬±³±«ª¯±®«¥›‘‹‡†…‚€€„†…‚€~‚‡Œ’”’“”‘Š|{umedgga\[\`ca[QH@7-'&')+*$  ÿüÿþÿÿ         ÿþÿþÿþÿþÿþÿþÿýÿÿÿÿÿÿÿþÿýÿþÿþÿþÿýÿþÿýÿüÿüÿüÿüÿüÿüÿüÿüÿüÿüÿüÿüÿüÿýÿÿÿýÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿÿ   """#&*+))-246;=<@FJMTZ]bghmtxxw|€}~}wutqjb^[WZagknpv}€‚‚†‡………‚}{{zyvxˆ‘ŽŽŠ†~upqppoptxzyxxxuruwwxxw}Š•˜˜›Ÿ¦­²µ³­«®¯¬¨¤œ“ŒŠ‰ˆ…ƒ€€„‰‰„‚€~ƒ‰“•–”„|xtnhd``^YVWZ^``\SJA5+(*+++'!  ÿÿÿÿÿÿ      ÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿþÿþÿÿÿþÿýÿüÿüÿþÿþÿýÿþÿýÿüÿýÿüÿúÿûÿýÿýÿþÿþÿüÿûÿûÿüÿýÿýÿþÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿþ  #$$'('(,00159<BGJOVZ]cijlryztt{}zywuvvqja\[[\aillmsy~€~}}}|~ƒ……ƒ‚€{y{{zx|…Ž•“‘•—“މƒ{tpoponosxzyxxwtruvwyzy~Š•˜š¡§­±´³¯«¬¬¨¥¢œ’‹ŒŒ‰‡ƒ†Œ‹†‚}ˆ‹Œ‘•–ˆ{xoea`\XVTSTW]_^ZRIA4,,.-+'"        ÿÿÿþÿýÿýÿþÿýÿþÿÿÿþÿýÿüÿýÿþÿýÿüÿýÿýÿýÿþÿüÿûÿûÿýÿýÿþÿüÿûÿüÿüÿüÿýÿýÿüÿýÿÿÿÿÿÿÿþÿýÿþÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿþÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿ "#%''%'-11136;DJLRY^aekmlotwtruyywvtutoga^^`cfkomlqw}}|{z{|ƒ…†ƒ€}{}~~~ƒ‰–•”–œ˜Ž…ztqpponnrwzyyxvtsttuy{}‚‹•šœ ¨­¯±±°«ª©¤ ž™‘ŽŽŒŠ…„‰Œ‹†|~€„ˆ‹”’‹ƒ|ywla]ZURQSTTV\_^YPG=2.12/&          ÿÿÿýÿýÿýÿþÿþÿþÿýÿüÿüÿþÿýÿûÿüÿýÿþÿþÿüÿüÿüÿüÿýÿþÿýÿûÿûÿüÿûÿüÿüÿüÿüÿüÿýÿÿÿÿÿþÿýÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿýÿÿÿÿÿþÿþÿþÿýÿýÿþÿþÿýÿýÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  #&'&).3568;?FKNTZ`dehlmlpuustvwy{yvrmfbb_^ciknonry}{zyxy}€„†ƒ€€}}‚†‰Œ–—˜›žžšŽ‚}yussrpoprwzyzzxvutsuy|‡Ž•›žž¢©«­°²±¬¨¦Ÿš˜”‘’’Œ‰†‡Š‹‰„|y~‚ƒ†‹’…€yvrh_[VRPPQRRTZ_^XOE9/044-!        ÿÿÿþÿÿÿÿÿþÿþÿýÿþÿþÿýÿüÿûÿýÿýÿýÿþÿþÿýÿþÿþÿýÿüÿüÿýÿÿÿÿÿÿÿþÿýÿûÿûÿüÿüÿüÿýÿýÿÿÿÿÿÿÿÿÿþÿþÿýÿüÿýÿþÿýÿýÿýÿýÿýÿÿÿÿÿþÿþÿþÿÿÿýÿüÿþÿýÿüÿüÿþÿÿÿþÿþÿþÿþÿýÿýÿþÿþÿÿÿþÿÿÿÿÿþ !#$)0336<@BGMORW\`deglonotvtuww{~xrmgdc`[_filoqty|yvwx{~…ˆ…€‚€}…‹‘“–šœ›–‹€|xuvwtrrtvxz{||zyxutux}„Š’—œ ¢¦««¬±´²¬¦¡š•’’‘Ž‹‡„…‰Š‰†zw{€…‹‰}xtmd]XTSRRQMNTZ_^WMA60241(          ÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿýÿþÿýÿüÿýÿýÿýÿýÿþÿýÿüÿýÿþÿþÿýÿýÿþÿþÿýÿüÿüÿüÿûÿüÿýÿÿÿþÿýÿüÿýÿþÿýÿüÿüÿüÿüÿýÿüÿþÿÿÿþÿýÿýÿýÿþÿþÿüÿýÿþÿþÿüÿûÿûÿüÿüÿüÿýÿüÿüÿýÿþÿþÿýÿýÿþÿÿÿÿÿÿÿþÿÿ "" !"$*2867AHHKQTVX\`ccekqsqqttuxz|}zwqicbcc_`dimoqvzzwutz‚…‡‰Œ‹‡„„„ƒˆŽ”˜™›ž ž›™’†|xwyyxwvx{|~~}{ywuwvv~‡Ž•šž¢¥«®­¯³µ²«£œ•‰‰ŽŠ‚†Œ‹ˆ„}wvx{}‚‰Ž‡€{wslf_WRRRRPNPX]_^WJ>8421,$  ÿÿ       ÿþÿþÿÿÿÿÿþÿþÿþÿýÿüÿüÿýÿýÿýÿýÿýÿýÿýÿüÿüÿüÿýÿþÿþÿýÿüÿüÿýÿÿÿýÿüÿûÿüÿüÿüÿýÿÿÿþÿýÿýÿýÿþÿýÿüÿûÿüÿýÿþÿþÿþÿýÿýÿýÿüÿýÿþÿþÿÿÿþÿýÿýÿýÿýÿýÿüÿûÿúÿûÿüÿýÿüÿûÿüÿüÿýÿýÿüÿýÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ !"!!&+18;>DIKNQTSRV^a^`gmstrpruvy|{vrmd\[`cdefkqrsx|ywwuy‚†‰Œ’“Šˆ‡‡Š’šž ¡ Ÿœ˜•…~{z{{{|{|€‚ƒ€}{xuuwvvŠ‘˜ £¨¯±²´·¶²ª ™‘І…‰Œ‡‚‰ŽŒˆƒzstvwy‡Ž†|vqnibXPNMLKNV_ddaYK@<82-'         ÿþÿþÿÿÿÿÿýÿýÿýÿüÿûÿüÿþÿýÿüÿüÿüÿýÿýÿüÿüÿüÿýÿýÿûÿûÿúÿûÿþÿÿÿþÿüÿúÿúÿüÿýÿýÿþÿÿÿÿÿýÿýÿÿÿýÿûÿûÿüÿýÿýÿþÿÿÿþÿýÿýÿýÿþÿÿÿþÿýÿüÿýÿþÿþÿýÿüÿüÿüÿüÿûÿýÿþÿûÿúÿûÿüÿüÿüÿýÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿþÿÿÿÿ !!!'/67:BHJKORRMKQ[_^]bhntspqttv{yrmhb[X\`eijlruv{|yywzƒˆŠ•˜˜•‘ŒŽ’™ž¡££Ÿ™’ŽŠ„}~€€€€ƒ„„„‚{xvvwvy‚Œ’šžŸ£©±µ·¶µµ²©Ÿ˜‘‹ˆ„„†ˆ‰ƒ}ˆŒŠ‡ƒyrrttw€ˆŒŠ†„wpni`TLIFCENZgnmf[L@<80)!          ÿÿÿÿÿÿÿÿÿüÿüÿýÿüÿüÿýÿþÿþÿýÿüÿüÿþÿþÿüÿüÿýÿüÿüÿûÿúÿúÿýÿÿÿýÿýÿûÿûÿüÿýÿþÿþÿþÿþÿÿÿÿÿýÿûÿüÿýÿýÿûÿüÿÿÿþÿþÿþÿýÿýÿþÿþÿýÿýÿýÿýÿýÿüÿýÿýÿýÿýÿüÿüÿýÿþÿûÿùÿûÿüÿüÿüÿýÿÿÿÿÿýÿýÿþÿÿÿÿÿÿÿþÿýÿÿÿþÿþ !!"##$',2::9>HNLKNQOMQZ``^]bioqonpqsuqlgc_]_acgknorwz‚€}zx|„ˆ‹’™Ÿž›—–˜˜™ž ¡¤¡œ˜Š†ƒ‚€ƒ…†„‚„‡…‚‚‚~xuvuvzƒ•œžž¡¨±¸»¸²±±«¢™Š„€ƒ„……€~†‰†„wqpqqw€‡Šˆ‡…yqmh\OIF@=BPaovshYI>71)!   ÿÿ         ÿÿÿÿÿþÿþÿýÿüÿþÿýÿüÿýÿýÿýÿÿÿþÿýÿýÿþÿýÿüÿüÿýÿýÿüÿüÿüÿþÿÿÿþÿüÿüÿüÿüÿýÿþÿýÿþÿþÿýÿÿÿÿÿþÿÿÿÿÿýÿüÿýÿþÿýÿüÿýÿÿÿþÿþÿþÿýÿýÿýÿüÿýÿýÿýÿüÿýÿüÿüÿüÿýÿþÿýÿüÿýÿýÿüÿûÿüÿýÿýÿýÿýÿþÿýÿüÿüÿþÿþÿþÿÿÿþÿþÿÿÿÿÿÿÿþÿÿ  $%&()),278;?@DIKIINQQSY_b`^afjkjjlpplgfc^]_dfhklossu|ƒ„‚}}…Š—ž¢¥¥¤¡ ¡  ¤££¤ ››™“Œ†‚‚…†……†ˆŠ‡ƒ„‡…‚„yusqt{…˜ ¡žŸ§±¹¾º³±²¯¦›Ž†€~€€ƒ‡ˆ…€zuolnrz€„‡ˆˆ…ysmg]NGD><DVlxzscPB80(!   ÿÿÿÿ    ÿÿÿÿÿþÿýÿþÿÿÿÿÿþÿýÿþÿÿÿþÿýÿþÿýÿþÿÿÿþÿþÿþÿüÿûÿüÿýÿþÿýÿýÿýÿýÿþÿþÿüÿûÿûÿüÿýÿýÿýÿýÿýÿûÿûÿþÿÿÿþÿþÿÿÿþÿüÿüÿüÿýÿýÿþÿýÿýÿþÿþÿüÿýÿýÿýÿÿÿýÿûÿûÿýÿÿÿþÿþÿþÿÿÿÿÿþÿýÿýÿýÿýÿüÿýÿþÿýÿýÿüÿüÿýÿýÿüÿýÿþÿþÿýÿýÿÿÿÿÿþÿÿÿÿÿþÿÿ  %'(*,,.5:9;BFECDEEGLPRSYabacdeeefillfacb^^bdfjoopsrs{…‡…‚…‡Š˜ ¥¨¨§¦¥¥¥¥¨­«§¦Ÿ™šœ—ˆ†…ˆ‹ŒŒŠŠŠ‰†††„ƒ…‚{upnt}ˆ’𢤡 §±º¿¼¶´¶³©›Ž„€‚}{}‚…ˆ‡ƒzunknu}…††ƒ}wsog\OFB>@Ndw|p\F7/(!   ÿÿ      ÿÿÿýÿýÿþÿÿÿÿÿÿÿþÿþÿþÿýÿþÿþÿþÿþÿýÿüÿüÿýÿýÿýÿþÿüÿüÿýÿýÿüÿüÿýÿþÿýÿýÿþÿþÿýÿüÿûÿûÿüÿþÿþÿþÿþÿýÿüÿûÿüÿüÿýÿýÿûÿûÿýÿýÿýÿýÿüÿýÿþÿÿÿýÿüÿûÿüÿýÿþÿÿÿÿÿþÿÿÿýÿûÿüÿüÿüÿýÿýÿýÿýÿÿÿýÿüÿýÿþÿþÿþÿþÿþÿýÿýÿþÿþÿÿÿÿÿý   !!#%%'*-015:;<?DGEBA@BGLNNPX]^]\]^_`befc__`_adfhlqssttuzƒ‰Šˆˆ’š¢§ªª¨¥¥¤¤¥§­²±¬©¢˜‘Œ‹‹“’Œ‹Š‰ˆ†„‚ƒ„{uonuŠ”¤¥¤£§°¹¾¼¸¶¸¶«œ…€ƒ‚{z}…ˆ‡ƒzuoknw~€ƒ†‡„€|wsndYMD@AKau€€yjT=.'        ÿÿÿþÿýÿÿÿÿÿþÿýÿýÿüÿýÿþÿÿÿþÿûÿûÿýÿþÿýÿýÿüÿüÿüÿüÿüÿýÿþÿÿÿþÿþÿþÿþÿþÿüÿûÿûÿüÿÿÿþÿþÿþÿýÿûÿúÿûÿüÿýÿþÿûÿùÿûÿþÿýÿüÿüÿüÿüÿýÿþÿþÿýÿûÿûÿüÿýÿþÿýÿýÿþÿÿÿÿÿýÿüÿýÿüÿûÿûÿýÿýÿÿÿÿÿþÿüÿýÿþÿýÿþÿþÿýÿûÿûÿûÿûÿüÿþÿÿÿýÿý !###%#"%),0249;;;=CECA?@GLMMLMRVSRUVVVX[^^\]]^bfhkoststwy|€†‹Œ‘•œ£§§¨¨¥¢¢¡  ¤©®¯®¬¨¤¢ž™“‘“”–˜–’ދЉ‡‡ƒ~zunov€‹–Ÿ¥§§¦¨¯·¹¹ºº¹¶«‘‡‚‚€}zx}ƒ…‡†‚}yuqmqz‚‡‹‰ˆ„}{xrjaWKCCK\s‚ƒ|p]F3)"   ÿÿÿÿ   ÿÿÿÿÿÿ ÿýÿýÿÿÿÿÿþÿþÿþÿýÿüÿüÿýÿþÿÿÿÿÿþÿýÿüÿüÿýÿþÿýÿüÿüÿýÿýÿüÿýÿþÿÿÿþÿýÿýÿþÿþÿýÿûÿüÿüÿýÿþÿþÿÿÿþÿüÿüÿüÿûÿüÿþÿýÿüÿûÿûÿüÿýÿýÿüÿüÿüÿýÿþÿÿÿýÿüÿýÿýÿüÿûÿúÿüÿÿÿþÿýÿþÿýÿüÿûÿüÿýÿþÿÿÿýÿýÿüÿüÿüÿýÿýÿûÿúÿûÿüÿüÿýÿüÿüÿüÿýÿýÿýÿþ !##! %*.1227;<;;<=?AA@DILMMJKOPOOONNQTWWY^^]afjmoqqpqv{}‚…ˆŽ’– §¦¥¥¤¡Ÿš™™œ¡¦ª¬¬«ª¦¡˜•—™™š›š•‹‰‡‡„€}zxsnox‚Œ— ¥¨©©¬¯³µ¶»½»´©œ’‰ƒ||zy€„†‰‡ƒ}ywurwƒ‹‘Іzxwqg_UJFLXj}…‚xeM7*#      ÿÿÿÿÿÿÿþÿþÿÿ ÿýÿýÿÿÿÿÿýÿþÿþÿýÿýÿÿÿýÿþÿýÿýÿýÿýÿýÿþÿþÿýÿýÿþÿþÿýÿüÿýÿþÿþÿÿÿþÿüÿýÿþÿþÿýÿýÿüÿüÿþÿþÿýÿýÿüÿüÿüÿþÿýÿýÿýÿüÿûÿýÿþÿýÿüÿüÿüÿþÿþÿþÿÿÿþÿýÿýÿýÿüÿýÿÿÿþÿýÿûÿüÿüÿüÿýÿþÿþÿþÿýÿüÿûÿüÿýÿýÿûÿûÿüÿýÿýÿýÿýÿýÿþÿþÿþÿþÿÿ  "! $(.44249=>=;88<>@@BEHIHHLNOMKJJMPQRU\`abejnllpqqtx{~€„“—£¢¡ š˜•‘‘’—¡¦¨§ª­¨¢Ÿœ™™œœœœ˜“‘‰…ƒ‚}ytnlr{ƒ— ¥§¨ª®°°±¶¼¾»³§œ‘Šƒ|z|}~…‡‹Ž‹…€|{yy‚Ž“•”Š‚{uutoe\SKNXcq~ylV<)         ÿÿÿÿÿÿÿÿÿýÿüÿþÿÿÿÿÿÿÿÿÿÿÿþÿýÿýÿþÿþÿüÿüÿþÿÿÿýÿüÿýÿþÿýÿýÿýÿýÿýÿÿÿþÿýÿþÿÿÿþÿþÿýÿûÿüÿÿÿÿÿüÿüÿýÿüÿûÿýÿþÿþÿþÿüÿûÿýÿÿÿýÿýÿýÿýÿþÿÿÿþÿþÿýÿýÿýÿüÿþÿÿÿÿÿÿÿþÿüÿýÿþÿüÿüÿþÿÿÿþÿýÿýÿýÿþÿýÿýÿýÿýÿýÿýÿüÿûÿüÿþ  " #%%)04348;<<<9767<???ADGILOOLJJKLMLNRW_effilllpsssux|‚†•—˜›œ™”““‘ŽŠŠšžž¡¡Ÿ¢§¥žšš™˜›žœ™”‘Œ‰ƒ‚€|sjku~…𣧍¨©¬®¬¬²º¼»´¨›Š„|y|€…‹Ž‘”‘Š„~†‘™™™•‰~uqqpjaYQNT_jtxtk]G/       ÿÿÿþÿýÿüÿþÿÿÿþÿÿÿÿÿÿÿýÿÿÿýÿüÿûÿýÿþÿüÿþÿýÿüÿþÿþÿüÿýÿþÿþÿþÿþÿþÿþÿþÿüÿüÿþÿþÿýÿýÿþÿýÿûÿûÿüÿþÿþÿÿÿýÿüÿýÿþÿÿÿÿÿþÿýÿýÿýÿýÿþÿÿÿþÿþÿýÿüÿýÿÿÿþÿýÿüÿüÿýÿþÿýÿûÿûÿüÿýÿþÿýÿüÿÿÿÿÿýÿüÿüÿýÿýÿüÿûÿûÿüÿþÿÿ !$"!$''(,0258989977647<??@DIJMPPMLMNNKJMRV\dhijkmoqqrstv{€„ˆ‘””’’‘Š‰ŽŠŠ’œœš››——›œ—”•”“—œ—‘ˆˆ…€€~sjmyƒ‰’ž§¬®¬ªª©¦¥¬¶¹¸´«‘‹„}z|ƒ‹‘•˜™—ކƒƒŠ—¡¢ž›’…yqmnlf^XTU[eosng`S=(  ÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿþÿÿÿýÿþÿýÿýÿþÿýÿþÿýÿýÿÿÿþÿüÿûÿýÿÿÿþÿýÿýÿþÿüÿüÿýÿþÿýÿþÿÿÿþÿýÿýÿüÿýÿýÿþÿÿÿþÿüÿüÿýÿÿÿþÿüÿûÿýÿþÿþÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿýÿüÿþÿþÿüÿûÿúÿúÿûÿýÿþÿýÿûÿýÿýÿýÿýÿýÿüÿúÿúÿûÿüÿüÿýÿþÿþÿþ  $&$#%&(,///2668504876:=@BFIKLMPQPONNMLNTX[afiklmnooqsqpv}„ˆ‰ŒŽˆ†‡†‡‰ŒŽ“˜–”––’‘’“ŽŽ’™œ™“Š„ƒ‚€€€~{rko|…‹”Ÿ¨¯³²­©£ ¡¦°µµ±« •ކ€~†”šœœ—…„Œš§¬§¡›Ž~qjhjib\ZY\binmd]WK8&      ÿÿÿþÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿþÿýÿÿÿþÿÿÿÿÿÿÿþÿüÿüÿýÿýÿþÿýÿÿÿÿÿüÿûÿüÿýÿþÿýÿüÿþÿþÿþÿþÿýÿþÿÿÿþÿýÿüÿýÿýÿýÿþÿþÿýÿüÿýÿþÿþÿÿÿýÿúÿúÿýÿÿÿÿÿþÿþÿþÿýÿýÿþÿþÿýÿÿÿýÿüÿýÿûÿûÿýÿÿÿüÿüÿüÿýÿýÿüÿüÿûÿùÿúÿüÿýÿýÿýÿýÿÿ  $'&&&#%,/-*,./32.0799;<@CDFLOOPQSRONONOVZ[_dgikmmlmrtqmow~‚†‡„€}|‚‡†ˆŒ”“ŽŽŽŒŠ‰ˆˆ‡‡•››•‘Šƒ€€~~~}xqmr|„‹“ž©±¶´°©ŸœŸ£ª°°¬¨ ™”Œ‡†‡Œ‘”›žš“І‰˜¨°°ª£šˆugbbdd^XZ]bhigc\VOD3$       ÿÿÿÿÿþÿýÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿþÿþÿýÿÿÿÿÿÿÿýÿýÿýÿüÿýÿüÿüÿþÿÿÿþÿýÿýÿýÿþÿÿÿþÿüÿýÿÿÿþÿýÿýÿýÿýÿÿÿüÿûÿüÿýÿýÿýÿþÿýÿýÿþÿþÿüÿûÿüÿýÿþÿýÿýÿýÿýÿüÿüÿþÿþÿþÿÿÿþÿüÿýÿþÿýÿüÿþÿÿÿþÿýÿýÿýÿýÿþÿýÿûÿûÿüÿþÿþÿþÿýÿýÿÿÿÿÿÿ !$$#&)$"(,+)*,+,-/14689:@EDEJPSSPRTRPPQSY[\_acfjkkjkorromptwz~|{yx}„…„†Š‹Œ’Œˆ‰Š‡„‚ƒ„ˆ‘—˜“‘‘ƒ~|{}|wqpv„Š‘ž«´¸µ°¦›™ ¤§¦¥£ŸŸœ•’’‘”››•Œ–¤¯²°¬¤”}ka\]__[XZ`eif_ZWSL?/"      ÿýÿüÿýÿýÿýÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýÿýÿÿÿÿÿþÿþÿýÿýÿüÿýÿþÿþÿþÿþÿÿÿÿÿÿÿþÿÿÿÿÿüÿýÿÿÿþÿüÿýÿüÿûÿýÿýÿúÿüÿþÿÿÿýÿþÿüÿûÿýÿÿÿÿÿÿÿýÿüÿÿÿþÿûÿýÿþÿýÿÿÿÿÿÿÿÿÿýÿüÿýÿüÿýÿýÿüÿýÿþÿþÿþÿüÿûÿýÿþÿýÿþÿþÿýÿýÿýÿüÿüÿýÿÿÿþÿý "!!$#"$(+*++*(*/322468=BCEHKNOOPQOPTUX\]\^abeiihikkkmljjmprwxwttx{~€€€„ˆ‰‹Š†‡ˆ†ƒ€€€‰’’’““ƒ~}|yxyzurt{‚†Œ“ ­µ¹·°¤›šŸŸœžŸ¤¤ž™š›–‘“™™“”›¤­°±°«ž‡re^ZZ[\[\aegf_XUUSL>-       ÿÿÿÿÿÿÿýÿýÿýÿýÿþÿþÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿþÿýÿþÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿýÿþÿÿÿÿÿÿÿýÿþÿýÿýÿÿÿýÿÿÿÿÿÿÿÿÿþÿþÿÿÿýÿûÿüÿýÿüÿýÿþÿüÿûÿýÿþÿýÿýÿýÿüÿûÿýÿþÿýÿþÿÿÿýÿýÿÿÿÿÿÿÿþÿüÿþÿÿÿþÿþÿÿÿÿÿþÿýÿþÿÿÿüÿûÿþÿÿÿþÿûÿûÿýÿýÿýÿþÿýÿúÿùÿúÿûÿüÿýÿýÿýÿþ    "$),,(&&(*.233359;=BCDDEHLMJLTWXZ]\\`adggdfjhefgffijlnpspovzyx{|~‚…†‹ŽŠ…†ˆ‡…‚~…‘‘‘‘‘‹|{yvsturrw~ƒ‰–¢­²¸¸¯£žŸ ˜˜™™Ÿ¦§£ ¤¤š’’—™––§­¯®®¬£yja\ZWXY[agjic[TRSPI=,    ÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿþÿþÿýÿüÿýÿÿÿþÿÿÿÿÿþÿÿÿþÿþÿýÿþÿÿÿþÿüÿýÿþÿþÿýÿþÿÿÿüÿúÿûÿýÿýÿýÿýÿýÿýÿþÿýÿýÿýÿýÿþÿÿÿþÿÿÿþÿûÿýÿÿÿÿÿÿÿþÿüÿüÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿþÿýÿüÿüÿýÿúÿøÿúÿüÿûÿüÿýÿûÿûÿý   !%)(%%%%&'-11/169;>>>>?BFHHJORTVYZ[\]_bdbcedbdedddddeionlpvxvwzz{~ƒˆ‹‰†……†‡„‚€€‡“’“’Žˆyxwuqoonqy†‹’™¤«¯µ´«£    œ——˜˜ž¥¤¢¥ªª£œžžŸ¦­¬¨¦£Ÿ•‚nd^ZXUTW\bghe`YSQQKD;+   ÿþÿÿÿÿÿÿÿþÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿýÿýÿþÿÿÿÿÿÿÿýÿûÿýÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿþÿýÿüÿþÿÿÿýÿýÿýÿþÿÿÿþÿüÿúÿúÿüÿýÿûÿüÿþÿüÿúÿýÿþÿýÿüÿýÿþÿþÿüÿüÿüÿýÿÿÿýÿûÿüÿþÿþÿýÿÿÿÿÿþÿÿÿþÿüÿýÿÿÿÿÿþÿýÿûÿúÿûÿûÿüÿþÿýÿýÿüÿûÿúÿûÿýÿÿÿþ !!####%&'*.269;=<;;>BCCEHKMQTWYYZYZ\]^`_]_bcbbba`aglmlkowxvwvuw~„††‡‡„„‡ˆ‡……‹’’•”‘‰xwxwpjijs}…‹Ž”œ¤ª®²¯¦ ŸžžŸ™˜™šŸ£¡¡¥«¬­¯²°«¨¨©§¢›—…vib\YWSQU^bdd_ZTPPOI@6'    ÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿüÿýÿÿÿþÿþÿþÿÿÿýÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿýÿýÿþÿþÿþÿýÿýÿüÿýÿýÿüÿüÿüÿüÿýÿýÿüÿüÿüÿûÿýÿÿÿýÿüÿüÿýÿüÿüÿúÿûÿýÿüÿþÿþÿþÿþÿÿÿÿÿÿÿýÿýÿþÿþÿýÿýÿüÿûÿúÿüÿþÿþÿýÿüÿüÿýÿþÿýÿüÿüÿýÿÿ   ""$&$&-25789;<;=@ABDFGLQSTVVWYXVUW\[Z\^^_bba_agjlljkruvusqsy…ˆ…„…ˆ‰‰‹Ž“–”’‘Œ„|yxulfejv…‹•¥¬¯¯«¤ŸžŸ ™™šž   £¨¬µ½ÂÀ¹±©¢š“‘‘Šulfb]YVRPT[bdb_VMLNME<2&     ÿþÿÿÿÿÿÿÿÿÿÿÿýÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿþÿþÿÿÿÿÿþÿüÿýÿÿÿþÿýÿüÿýÿþÿýÿýÿüÿýÿþÿÿÿýÿûÿüÿþÿÿÿþÿýÿüÿýÿýÿúÿøÿüÿÿÿþÿýÿüÿýÿÿÿÿÿþÿýÿÿÿÿÿþÿýÿýÿüÿýÿþÿþÿýÿþÿþÿýÿýÿÿÿÿÿþÿþ   !"%))(*,15579;<===AFFFKPPNOPSWVSQSTTWYZ[^a`_^afgijkklostqqrvy{ƒ…„„ƒƒ‡ŠŽŽ“–“‘Œˆ{vqhdelv~„Š–¦¬¯¬§¢¡Ÿž¡£ š™™™™›ž¡¦¬¶½Á¿µ©”Š……ƒ{qkgda_\VSQRV^ba`WNMNJA:1'      ÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿýÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿýÿýÿþÿÿÿÿÿýÿýÿÿÿþÿþÿþÿþÿþÿþÿþÿüÿýÿýÿýÿýÿýÿþÿþÿýÿÿÿÿÿýÿüÿÿÿþÿúÿùÿýÿÿÿþÿÿÿÿÿûÿüÿþÿþÿýÿÿÿþÿþÿÿÿýÿýÿÿÿÿÿþÿþÿÿÿÿÿýÿýÿþÿýÿþÿÿÿÿ  !! !#'(*)(-13678:;;:=DEEHKJHGFKRTQOOMNSTUX\]\ZZ_bcdehjihnrpopstx}€ƒƒ……„‡Œ’•”’Œˆƒ{uohehnv}„‹‘–ž¥«¬¨¤¡££ ¡¥¦ ™˜–““–› ¦­²³±«ž‘‰ƒ}{yslgeba_]\XTSRTY^_]XRQPI?9/$   ÿÿÿÿÿÿ ÿþÿþÿÿÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿýÿþÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿýÿýÿýÿÿÿýÿüÿþÿÿÿÿÿÿÿÿÿÿÿþÿüÿýÿÿÿÿÿÿÿýÿûÿýÿþÿýÿýÿþÿþÿÿÿÿÿþÿüÿüÿþÿýÿûÿýÿÿÿýÿüÿÿÿýÿüÿþÿÿÿýÿýÿýÿýÿþÿÿÿýÿüÿýÿÿÿþÿþÿýÿýÿÿÿþÿýÿÿÿþÿþÿþÿýÿýÿÿÿÿÿýÿüÿþ  !"!!$%&(+-.25645657>BCDFFDBAEMQOMMMNNNRVXYYVVZ\^`acggeinnlmoptx}ƒ‡Šˆˆ’‘’–—•‘Œ‡ƒ{snjjmqw}ƒŒ‘•¦«ª¦£¢¥§¤¢¥§ ™—”‘•𠧬«¤˜yvussphc`^]\[Z[WTSSTVYZZWTRNIA9."  ÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿýÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿýÿüÿþÿÿÿÿÿýÿýÿþÿÿÿÿÿþÿüÿüÿýÿþÿÿÿÿÿÿÿÿÿÿÿýÿûÿýÿþÿþÿýÿûÿýÿþÿþÿýÿþÿýÿþÿýÿúÿûÿþÿþÿýÿüÿýÿýÿýÿýÿþÿþÿýÿüÿýÿÿÿýÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿýÿýÿÿ   !   &***-450/2348>ABCDBAACIMLIJLNLKPUTVZWUWYZ\_acfffikjhjosuzƒˆŒŒŠŽ‘‘“––•‘‹†‚ztomortx}‚ŠŽ’¨¬ª§¥¥§©¥Ÿ¡¥¡š–’“˜œŸ¤¤›~skijlllha][YXXXYZWSRRSSTTUUTRLHB9-"   ÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýÿþÿÿÿþÿÿÿÿÿþÿþÿÿÿýÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿûÿûÿþÿýÿüÿýÿÿÿþÿýÿüÿþÿþÿüÿüÿýÿþÿýÿüÿüÿüÿýÿýÿüÿúÿúÿüÿýÿþÿýÿýÿþÿÿÿÿÿýÿüÿüÿýÿþÿýÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿýÿüÿýÿÿ  ! $(++,01.-0446;?@@?>@CBDHIGFHKLLPTQRXYWWYXY\]_dgeefgefmuvz~…ŠŒŽŽ‘‘”“’Š…€zuqnruvy~ƒˆŒ‘žªª¨¨§§¨¤ž›Ÿ¢Ÿš•’‘•œžžœ“‚sicacdffd_YVUTTTVXXURQPSSQPPPSRMH@6,!       ÿÿÿþÿÿÿÿÿþÿýÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýÿýÿþÿÿÿýÿþÿýÿþÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿûÿúÿÿÿüÿúÿûÿýÿÿÿÿÿþÿüÿüÿþÿýÿþÿþÿýÿüÿûÿüÿýÿýÿýÿýÿúÿúÿüÿýÿýÿüÿüÿþÿþÿþÿýÿüÿüÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿüÿüÿþÿÿÿÿ !"$&%%),./.,*-2347:;<:8<@?@BDEEDGKNQTSQTVVUWXXWY\`eebadefkrv{~ƒ‡‰Œ’“’””’އ„€xsqpswz~‚…ˆŒ’œ¦©¦¦¨¨¥˜š¡£ ›•’‘—œ˜}k_[YZ]_a^ZWRNMMOPTVTTTPNQPNNLKOPLG>4*   ÿÿÿÿÿþÿþÿþÿÿÿþÿÿÿýÿþÿÿÿÿÿÿÿüÿýÿþÿþÿÿÿýÿÿÿÿÿÿÿþÿýÿýÿÿÿÿÿþÿýÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýÿþÿþÿþÿÿÿÿÿýÿüÿýÿüÿþÿÿÿþÿýÿüÿüÿûÿýÿÿÿþÿýÿüÿþÿþÿþÿýÿýÿþÿþÿþÿþÿýÿþÿûÿúÿþÿÿÿýÿüÿûÿüÿþÿýÿüÿþÿýÿûÿýÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿýÿþ  !#&&##'.2/+'(,./2677658;<==>CDCDGKPSTSTUTSTUVTUY[`ccacehmquyz~ƒ…ˆŒŽŒ‘–––—”ކƒ~vrrrru{€…‡ˆ‹’›¢§§¦¨§ ™•˜¡¢ž›—’“™š–k]VRQRSVYUONLHEGLNSURSUOJKKJJIHKLID<2)   ÿýÿûÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿÿÿýÿüÿýÿþÿÿÿþÿþÿþÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿþÿüÿýÿÿÿþÿþÿýÿûÿýÿÿÿüÿüÿüÿüÿþÿÿÿþÿýÿþÿþÿüÿýÿþÿÿÿÿÿÿÿþÿýÿúÿüÿþÿþÿþÿþÿýÿýÿþÿýÿüÿýÿúÿùÿýÿÿÿþÿüÿûÿüÿýÿþÿÿÿÿÿÿÿÿÿþÿýÿýÿþ    !##"%.21.)%'+,-3764369;;9;@DCCEGJMOSX\]YTSSSVZ]_cggffjqtvwvy†‰ŒŽŽ‘•——–•އƒ}xutsqty~…ˆ‡‰’£¦§¨©¦—•—ž———”—›–Žƒo^TNKLMLMPLHIHCAEKNQSQPRLFFEEFEDFHGA7/(   ÿþÿÿÿý ÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿýÿýÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿÿÿýÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿýÿþÿýÿüÿÿÿÿÿÿÿÿÿþÿýÿþÿýÿüÿýÿýÿþÿþÿüÿýÿÿÿþÿýÿþÿþÿýÿÿÿýÿýÿýÿýÿúÿúÿüÿþÿÿÿþÿüÿúÿûÿúÿúÿûÿüÿþÿÿÿüÿúÿûÿûÿýÿþÿÿÿþÿþÿþÿýÿÿ   "&((,011-(&(+-0355359;<88>CDDFEDEINXdh_USTY^bdfhknmkntvxywx†‹’•œ•“Žˆ„|zxuuxz{‡‡Š“ž£¤§ªª£š•”˜›—““’”˜š“ˆwcUKEDFGFGHFCDDA@EKLLLLKKGCBBBBAACCC@5+%   ÿÿÿÿÿþÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýÿüÿþÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýÿþÿþÿþÿÿÿþÿþÿýÿþÿÿÿþÿýÿýÿüÿýÿþÿýÿþÿÿÿüÿýÿþÿûÿûÿüÿþÿÿÿýÿþÿÿÿýÿýÿþÿýÿüÿûÿûÿüÿþÿÿÿýÿûÿùÿùÿûÿüÿûÿýÿþÿüÿûÿüÿþÿþÿýÿýÿÿ    &+,,,.11.++-00037779<=98=ABDDB?AEJS`bYSTY_hlnnmnstrrvy{yx|‚†‹’’” Ÿ“‰„}xy~~}‚ˆ‹Ž”¢¢¦«©¡™–•™›–““’•”€mZNE?=>=>AB?>@@>@FJHFGGEDB@A@??==>=>=3*& ÿÿÿþÿýÿýÿþÿÿÿÿÿþÿýÿÿÿÿÿÿÿÿÿþÿÿÿýÿþÿþÿÿÿþÿþÿÿÿÿÿýÿýÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿýÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿþÿþÿÿÿýÿýÿýÿýÿþÿýÿüÿþÿÿÿÿÿÿÿþÿýÿüÿýÿÿÿÿÿÿÿþÿûÿúÿþÿÿÿÿÿþÿþÿüÿüÿýÿýÿûÿûÿýÿÿÿþÿÿÿýÿùÿøÿúÿüÿýÿþÿýÿûÿüÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿ  %+,++.1221112457;;;<;;=@?>@B@?BGIOUVSPT\aipstqqv{zvw}€}{€†ˆŠ•–’‘£¦”‹†ƒ„„€}}€ƒˆ‹”˜Ÿ£¢¤©ª£œš˜šœ—”“‘’‘ŒƒveTJB;:857<;9:::<@FGCBDB?>>=?><<;:;986/)(" ÿÿÿÿÿÿÿÿÿþÿýÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿüÿþÿÿÿÿÿþÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿþÿýÿþÿþÿûÿüÿÿÿÿÿýÿüÿýÿýÿÿÿþÿþÿÿÿþÿþÿýÿùÿúÿüÿýÿýÿüÿüÿüÿûÿýÿþÿÿÿþÿúÿøÿûÿýÿþÿþÿþÿþÿýÿýÿüÿûÿþÿÿÿþÿþÿþÿþÿÿ  $+..,-010..0589<?@=:;>BA?@BBCGIHJOTTQS[ahouvuwy~~zy|€‚€‚†‡‰—˜—“žÏ×§ŽŽŒˆ†„‚‚‡‹”™œ¡£¢¤¨ª¤ žœ˜””“’‡{jZNE?;:756753667;?BA>?@=;;::;98:;;9620+%#  ÿÿÿÿÿþÿþÿÿÿýÿþÿýÿþÿÿÿÿÿÿÿþÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿÿÿþÿþÿýÿþÿþÿþÿÿÿÿÿýÿýÿÿÿþÿþÿÿÿÿÿÿÿþÿÿÿþÿþÿýÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿûÿúÿýÿþÿüÿüÿÿÿÿÿÿÿýÿùÿúÿýÿýÿþÿþÿýÿýÿüÿúÿúÿýÿýÿúÿ÷ÿúÿýÿþÿýÿýÿüÿüÿþÿýÿûÿûÿüÿýÿýÿþÿýÿþÿþÿÿÿÿÿþ   (./,+,+*)*,/48<?AA=:;?ABEECEIIFHNUVTV\bhnux{}|{€‚„…‰•™™—¸½“‘‹…ƒ‚ƒ…„„ˆŒ–Ÿ  ¡¤¦¤žŸŸ›–””“ŠƒuaRIC?<:74331/1469=>;9;;767788537:974/+'!  ÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿþÿýÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿþÿþÿþÿýÿûÿýÿýÿúÿûÿýÿüÿüÿÿÿÿÿþÿüÿýÿþÿþÿþÿÿÿÿÿýÿûÿúÿûÿþÿÿÿýÿûÿûÿüÿûÿüÿýÿûÿüÿüÿùÿùÿüÿýÿûÿûÿûÿýÿþÿûÿüÿÿÿþÿúÿùÿüÿþ   $')*,.+***)+.38;>AA=;<<?EGCCJLIJQWXX[_ekqw|ƒ‰‰…}}~…‰Ž‘–˜œ»èä´—•–ƒ‚……†ˆˆ‡Š’—žžŸ¢¡›—šœš”Šƒ|o]PGB>9630.//-0578<<97762002553037532.'"  ÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿýÿýÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýÿýÿÿÿþÿýÿýÿÿÿÿÿþÿþÿÿÿþÿþÿýÿÿÿÿÿÿÿÿÿÿÿýÿüÿÿÿþÿÿÿüÿùÿúÿúÿúÿüÿÿÿýÿýÿþÿÿÿþÿûÿúÿüÿýÿÿÿýÿûÿüÿýÿÿÿýÿûÿûÿýÿûÿùÿûÿüÿüÿüÿûÿúÿýÿýÿûÿýÿÿÿüÿúÿûÿüÿÿ  !#$&+/--/--...49:=@@=<;;@CBDKQQPU]`bcejpu}ƒ‹‘‰‚„ƒ„…„ˆ‘‘”šž¦©¤œ——˜ƒ†‰Š‹Œ‹Œ‘“—œ›œ™•”—š™–‹‹‰‡„}ugZOC<8530-+,..1699<=:7530,+-.///15420*$ ÿþÿþÿýÿþÿÿÿýÿþÿÿÿÿÿýÿþÿýÿÿÿÿÿýÿüÿüÿþÿþÿþÿÿÿþÿþÿþÿýÿþÿþÿýÿþÿÿÿÿÿþÿÿÿþÿþÿþÿýÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýÿþÿÿÿÿÿÿÿþÿÿÿýÿýÿþÿûÿúÿúÿúÿü ÿÿÿÿÿÿÿþÿýÿýÿþÿýÿüÿüÿýÿýÿüÿýÿÿÿÿÿýÿþÿþÿüÿúÿûÿüÿûÿûÿüÿýÿýÿûÿúÿûÿûÿûÿüÿþÿþÿýÿýÿýÿþÿÿÿþÿýÿþÿþÿÿ  ""#(*)+00./..28:9<=;;;;>@BFNTXWX^fknnpuz‚‡“’ˆ‡Œ‹ŒŒ“™œœš–•———•‡‚…ŒŽŽ‘’•šš›œš—”’’”•“’‰†„„€xo`TJ>5322/+*+,/258:=?<8640+(((()-0331.'"  ÿÿÿÿÿþÿüÿüÿüÿýÿÿÿÿÿþÿþÿþÿÿÿýÿþÿÿÿÿÿþÿÿÿÿÿþÿýÿýÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿýÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿþÿýÿûÿüÿýÿþÿÿÿþÿüÿýÿþÿüÿúÿûÿýÿÿ ÿþÿüÿýÿÿÿüÿýÿýÿýÿþÿüÿûÿüÿüÿüÿýÿýÿþÿþÿüÿúÿùÿúÿúÿúÿûÿüÿþÿþÿúÿøÿúÿúÿúÿúÿûÿþÿþÿûÿüÿÿÿþÿûÿûÿüÿüÿÿ    #$$#'-.**+,.466799868=??DLSWXW[ckpqrv}„†Š‘Œ’’ŽŒ‹•žžžœžŸ™”ˆˆŽ‘‘Ž“—™›š•‘ŽŽŠ„€}~{rgZND9200.,*)*+.1359=>:6530+&%&&(-000/+&#    ÿúÿþÿÿÿþÿÿÿýÿýÿýÿýÿÿÿþÿþÿÿÿÿÿÿÿþÿüÿÿÿÿÿþÿþÿÿÿýÿÿÿýÿýÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿýÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿþÿÿÿÿÿþÿÿÿþÿûÿüÿýÿûÿýÿýÿþÿþÿüÿûÿýÿÿ ÿýÿûÿþÿþÿüÿýÿýÿüÿþÿþÿûÿûÿýÿýÿýÿþÿþÿýÿûÿûÿúÿúÿûÿúÿúÿüÿýÿüÿûÿùÿøÿøÿùÿøÿøÿùÿúÿüÿýÿûÿûÿýÿýÿüÿûÿý    "!!$')*)(+--,/344325779=BIOQTV[bfikpy‚ƒ„‰ŽŽŽ‘’‘Ž‹‹Œ‹‹Œ–ž ¡¡ ¡¤ž—“’’‘“’’‘‘‘“—˜˜”Ž‹ˆ‡‰‰……‡ƒ}yvvtj^SI?61//,)*)''*-025896210-)%$'(+/0/.+'$#   ÿýÿÿÿýÿþÿþÿþÿþÿþÿþÿþÿýÿþÿýÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿüÿýÿþÿþÿþÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿýÿýÿÿÿþÿÿÿýÿýÿÿÿüÿÿÿýÿÿÿþÿüÿýÿüÿûÿûÿüÿÿÿÿÿûÿùÿûÿûÿûÿúÿúÿüÿýÿûÿúÿúÿùÿùÿüÿûÿøÿùÿúÿøÿúÿüÿûÿýÿþÿüÿûÿýÿÿÿÿÿþ  "(++,.-)*/-*+-11/378=DIMPTY\]`enx{|‚‰‹ŒŽ‘Ї…‡ŠŒ“›  Ÿ£££¥ ˜””–˜˜”‘“”˜š™•Žˆ„€„ƒ}xuromjcXMC:420/,)*'""&),-.153.-+'%$$()+...-($"    ÿÿÿÿÿýÿþÿþÿþÿþÿþÿÿÿÿÿþÿþÿýÿýÿÿÿþÿýÿÿÿþÿþÿÿÿÿÿýÿýÿÿÿþÿÿÿýÿþÿÿÿÿÿþÿÿÿþÿþÿþÿÿÿþÿýÿÿÿÿÿþÿýÿýÿÿÿÿÿþÿþÿüÿýÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýÿûÿþÿýÿüÿþÿüÿúÿûÿþÿÿÿýÿüÿûÿûÿûÿùÿùÿøÿúÿýÿüÿúÿúÿúÿùÿûÿþÿýÿúÿúÿûÿûÿúÿøÿûÿþÿüÿûÿýÿþÿþÿüÿþ  !! '+,,.-,-)%%)./-.147:?EIMRTUW[blqtx}…ˆŒŒŠˆ„€|…ˆ”šœ£¦¦¥Ÿ–’’“—˜•‘ŽŽ’”˜ŸŸ›—އ}}|zunmmjea]UJ?742.,*)(##'))*,22,)&"!#$'),-,+*&#! ÿÿ ÿÿÿÿÿýÿýÿþÿþÿÿÿÿÿýÿþÿÿÿÿÿýÿþÿÿÿÿÿþÿýÿþÿýÿþÿÿÿÿÿþÿýÿþÿþÿþÿÿÿýÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿýÿÿÿýÿÿÿþÿÿÿÿÿÿÿúÿûÿÿÿþÿýÿÿÿÿÿþÿÿÿÿÿÿÿþÿüÿýÿþÿýÿÿÿþÿýÿþÿþÿûÿüÿüÿüÿûÿýÿúÿûÿûÿûÿûÿúÿúÿúÿüÿüÿúÿúÿùÿúÿýÿþÿüÿûÿûÿûÿüÿýÿýÿüÿûÿùÿúÿþÿþÿûÿûÿýÿþÿÿÿÿ  -'#'*)(*--*('(./-+,0434;@DHJNSV[bgkmmry~„„‚€|ywwz†Š–›Ÿ¢¤£–’‘”““’‘”–›¢£ ›‘‰„€~|yuojgee_\ZSH=862-**'#  %()+,,00+'$ #%&+/,**(#!   ÿþÿÿ ÿýÿþÿÿÿÿÿÿÿþÿýÿþÿÿÿÿÿþÿÿÿþÿýÿþÿþÿþÿþÿþÿÿÿþÿÿÿÿÿÿÿþÿýÿÿÿÿÿýÿÿÿÿÿÿÿþÿýÿÿÿÿÿÿÿþÿÿÿÿÿýÿýÿþÿþÿþÿýÿüÿþÿÿÿüÿüÿþÿýÿþÿþÿþÿýÿýÿüÿûÿþÿüÿûÿýÿÿÿýÿúÿüÿüÿûÿüÿýÿþÿûÿúÿùÿùÿùÿùÿûÿýÿüÿúÿúÿûÿüÿûÿúÿýÿÿÿýÿûÿýÿþÿýÿûÿüÿüÿýÿþÿþÿþÿÿÿÿÿÿÿÿ   !,#!$()&#"$()**+./,*)+.--148=@ELPUZ^decfouyzywvuusps{}Œ•š  œ–’‘‘Ž’““”—£¥£œ“‹ˆ„}wtrmg`^_ZXWRG<872..,'#""%+--00--.+(" $%(-.*))%!    ÿþÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿþÿþÿþÿÿÿþÿþÿýÿþÿÿÿýÿýÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿýÿþÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿþÿÿÿþÿýÿþÿýÿýÿÿÿÿÿüÿýÿÿÿÿÿýÿùÿúÿþÿþÿýÿýÿýÿýÿúÿüÿþÿúÿùÿùÿùÿùÿúÿùÿøÿøÿúÿüÿýÿüÿûÿúÿúÿüÿÿÿÿÿüÿüÿýÿûÿúÿûÿûÿûÿüÿþÿÿÿýÿûÿûÿüÿþÿÿ     #&&#"!&)**+,+)()+))**.38=?AIRW\`_bhmorqooopokkops~‰’–š›–Œ‹ŠŒ‘–•“–¡£¡š”’‘‹ƒzrnmibZXZUQPMF;65310/*''(,01221.,,)$ #%',-)''%!    ÿýÿý ÿþÿýÿÿÿÿÿÿÿþÿÿÿþÿýÿüÿþÿÿÿûÿþÿüÿþÿþÿüÿÿÿþÿýÿþÿþÿÿÿÿÿþÿÿÿÿÿýÿÿÿÿÿÿÿþÿþÿÿÿýÿþÿþÿþÿþÿþÿÿÿýÿþÿÿÿÿÿÿÿÿÿþÿýÿþÿþÿÿÿÿÿÿÿþÿüÿýÿüÿüÿÿÿþÿþÿþÿýÿýÿþÿüÿûÿÿÿþÿýÿÿÿÿÿþÿþÿüÿúÿûÿûÿýÿýÿúÿøÿ÷ÿ÷ÿøÿùÿûÿúÿûÿûÿûÿúÿúÿûÿúÿøÿøÿúÿùÿøÿøÿùÿûÿüÿüÿüÿüÿýÿÿÿþÿüÿüÿÿÿÿÿÿ     "  !''&('%&(((('&'')0655<GQY^_`cgkkihgfggffghms{…Š••–‘ЉЉЕ•“”™›œ™–”‘‡|tnjgd_WTVQLHE@733320/-,,.113651.--& !%'*.-($#!    ÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿüÿûÿýÿÿÿÿÿÿÿÿÿûÿýÿÿÿÿÿþÿýÿýÿÿÿÿÿýÿýÿýÿýÿþÿþÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿýÿþÿþÿüÿýÿÿÿýÿÿÿýÿüÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿýÿþÿþÿÿÿþÿÿÿþÿÿÿþÿüÿüÿýÿþÿþÿýÿþÿÿÿÿÿÿÿüÿüÿýÿýÿûÿûÿùÿùÿúÿúÿüÿûÿùÿúÿüÿûÿúÿüÿûÿ÷ÿøÿùÿúÿùÿ÷ÿ÷ÿùÿûÿûÿûÿøÿùÿýÿÿÿÿÿþÿþÿýÿüÿÿ    !!!$#!''$$%%%$$).136<HTZZ\`dhhfeba``acdfilpx~„ˆ”•ŒŠ‰ŠŒŽŽ’••“ŽŠ€tnlgcb]VQPNIC?:20222///..0104740..-%  $&+-+'"  ÿÿÿÿ  ÿý ÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿþÿÿÿþÿüÿýÿÿÿþÿþÿÿÿüÿýÿÿÿþÿþÿÿÿþÿþÿýÿýÿÿÿÿÿþÿýÿþÿÿÿÿÿüÿþÿýÿþÿþÿþÿÿÿþÿÿÿÿÿþÿÿÿýÿýÿÿÿÿÿüÿüÿþÿÿÿþÿþÿÿÿÿÿýÿúÿûÿÿÿýÿþÿÿÿþÿþÿþÿýÿÿÿÿÿþÿýÿþÿýÿþÿÿÿûÿûÿýÿþÿþÿýÿýÿÿÿþÿýÿÿÿüÿúÿúÿüÿýÿýÿüÿüÿýÿüÿúÿûÿûÿúÿûÿûÿùÿùÿûÿúÿûÿûÿùÿùÿûÿúÿøÿùÿøÿùÿúÿûÿûÿýÿýÿüÿýÿÿ    !$&! ""#$$'*.356;GPRV]adghea_]\_bcdfhkpv|„Œ‘”“Œ‰…ƒ‡…‚†ˆ‹Š‡ƒ€wnkiecc]VPLID?<70./11//00/0/0350,,*(&"!##&(&#"!   ÿÿÿüÿÿ  ÿÿÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿýÿüÿÿÿþÿþÿÿÿÿÿÿÿþÿÿÿýÿÿÿÿÿþÿÿÿÿÿüÿýÿÿÿýÿüÿþÿþÿÿÿÿÿþÿþÿþÿýÿÿÿÿÿýÿûÿþÿûÿüÿþÿÿÿýÿþÿüÿùÿüÿÿÿýÿÿÿþÿÿÿþÿÿÿþÿýÿþÿþÿýÿÿÿûÿúÿûÿüÿþÿÿÿüÿüÿþÿûÿûÿýÿüÿüÿÿÿþÿüÿûÿüÿüÿúÿúÿûÿýÿþÿþÿûÿùÿûÿüÿúÿøÿøÿùÿúÿúÿùÿùÿúÿüÿýÿüÿúÿûÿûÿúÿýÿüÿúÿùÿùÿúÿýÿÿÿÿ     ""  %&(*-/2217BINW\aegd^]\[`dcbdgjnsvy‚†’‘Œ†}|€{~€{xumgigba`ZRJEB=9750-,.0..//.0/034-(*&#%$!"#""##   ÿüÿþÿÿ  ÿþÿþÿûÿüÿÿÿýÿýÿÿÿýÿüÿþÿþÿýÿÿÿþÿüÿüÿÿÿýÿýÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿüÿÿÿÿÿþÿýÿüÿýÿþÿÿÿüÿýÿüÿÿÿÿÿþÿÿÿýÿýÿüÿùÿûÿÿÿÿÿüÿûÿûÿÿÿÿÿúÿüÿÿÿýÿúÿýÿüÿúÿþÿýÿúÿúÿûÿùÿøÿ÷ÿúÿþÿþÿûÿ÷ÿøÿüÿüÿùÿùÿùÿùÿùÿúÿúÿúÿúÿûÿúÿøÿùÿûÿûÿüÿþÿýÿüÿûÿûÿûÿüÿÿÿÿÿÿÿþÿþÿþ       "$')*,,,07>FNT[aa`\[\]aed`aehmoosyyx€…ˆŒ…}y{{yyxxywrlgeeb]\YTKA><9521-+,-..-+**-/132)$&$ #&""%$"!   ÿÿÿýÿþÿÿÿÿÿýÿÿÿýÿý ÿÿÿÿÿÿÿþÿÿÿÿÿþÿûÿþÿþÿüÿýÿÿÿþÿÿÿþÿýÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿýÿüÿúÿÿÿýÿÿÿüÿüÿÿÿýÿûÿúÿýÿÿÿþÿþÿþÿþÿÿÿûÿúÿÿÿþÿùÿûÿýÿûÿüÿüÿþÿþÿûÿùÿùÿûÿûÿùÿùÿùÿøÿûÿýÿùÿùÿúÿùÿøÿùÿúÿûÿüÿúÿ÷ÿõÿöÿøÿ÷ÿùÿüÿüÿúÿûÿýÿþÿýÿýÿþÿþÿþÿþÿþÿþÿþÿÿÿÿÿÿ    #&(*.15>DIRYY[[XY\^aba``agjjmonlosyƒƒ}xtuxwwusttnhfea[VURME;9961.,))**,-)'&%',11,$!!"% %$    ÿÿÿþÿù  ÿýÿþÿÿÿýÿÿÿÿ ÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿüÿýÿüÿþÿþÿþÿÿÿÿÿþÿýÿþÿýÿýÿÿÿÿÿþÿþÿýÿþÿÿÿÿÿýÿþÿÿÿüÿüÿÿÿþÿýÿûÿüÿþÿûÿÿÿüÿüÿÿÿÿÿþÿÿÿþÿýÿüÿüÿþÿþÿþÿýÿþÿýÿüÿüÿþÿúÿ÷ÿúÿúÿûÿýÿúÿùÿøÿöÿõÿøÿùÿøÿùÿúÿùÿúÿúÿùÿùÿøÿùÿúÿûÿúÿúÿüÿûÿüÿþÿþÿûÿüÿýÿýÿüÿýÿÿ   !%)*+/69>HPRVXTSVXZ]``^]`bfjgddeflvwutqprsusnlkhed`[TPOJE@9762.*))'$%)*&$$$$(,+&! "" ÿýÿÿÿ÷ÿùÿÿ ÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿýÿþÿüÿüÿþÿÿÿþÿýÿþÿþÿÿÿýÿýÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿÿÿÿÿüÿùÿþÿþÿüÿûÿýÿÿÿÿÿüÿüÿÿÿþÿýÿýÿþÿÿÿüÿüÿûÿúÿûÿüÿûÿûÿûÿýÿýÿûÿüÿúÿùÿùÿ÷ÿ÷ÿúÿúÿúÿúÿùÿùÿùÿûÿýÿüÿùÿøÿøÿúÿýÿüÿûÿúÿúÿüÿþÿýÿúÿùÿûÿüÿûÿý   "#&&&).2:AGJOQNNOPSVZ^`_^_adb_`aabilmpqmkmpngcb__^XSNLJD?:642/+'')& %&$%%$#$'&!   ÿÿÿþÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿýÿûÿþÿÿÿÿÿÿÿþÿýÿÿÿþÿüÿþÿÿÿÿÿýÿýÿ÷ÿùÿýÿýÿüÿþÿþÿÿÿÿÿüÿýÿüÿüÿÿÿýÿüÿþÿÿÿþÿüÿýÿüÿúÿùÿüÿýÿûÿùÿüÿüÿøÿøÿøÿöÿùÿþÿþÿýÿûÿúÿüÿüÿúÿúÿüÿûÿùÿùÿûÿýÿûÿúÿúÿûÿûÿûÿüÿúÿùÿûÿûÿüÿýÿÿ   !%%$%&(+16;?BHLJIKLKNU[^^]__`_\\][Z_cfmqjeggea_]WVWQKGGD=8641,+(%%&$ "!!$%" """     ÿÿ ÿÿÿÿÿüÿþÿþÿÿÿþÿýÿûÿüÿþÿþÿþÿüÿýÿÿÿþÿüÿÿÿýÿüÿþÿÿÿþÿÿÿÿÿüÿþÿÿÿýÿýÿüÿþÿÿÿüÿúÿþÿÿÿÿÿÿÿûÿûÿþÿýÿûÿÿÿÿÿýÿþÿþÿÿÿþÿüÿþÿüÿøÿùÿýÿüÿùÿøÿúÿûÿûÿýÿÿÿüÿùÿùÿüÿþÿýÿûÿúÿûÿüÿüÿýÿúÿøÿúÿüÿúÿùÿùÿúÿúÿûÿûÿúÿüÿýÿüÿýÿýÿþ   !#&(&%),.024:?EHFEFFFHPVXY[^_``\XWVV[_bjohab`]^][SOOMF@@;4222.(%%#!!! ! ## !"      ÿÿÿûÿüÿÿÿþÿþÿûÿýÿþÿÿÿýÿþÿþÿýÿþÿÿÿÿÿÿÿýÿüÿýÿÿÿÿÿÿÿüÿþÿÿÿþÿþÿÿÿÿÿþÿüÿÿÿþÿýÿÿÿÿÿÿÿþÿûÿúÿûÿÿÿÿÿùÿùÿüÿÿÿýÿûÿûÿûÿýÿýÿøÿøÿúÿþÿþÿþÿýÿýÿýÿýÿûÿùÿùÿüÿþÿûÿùÿúÿøÿøÿüÿýÿûÿøÿøÿúÿüÿûÿøÿùÿûÿûÿùÿøÿúÿúÿúÿúÿúÿûÿýÿüÿúÿûÿüÿþÿÿÿÿÿþÿýÿÿ     $&%$',.//06=ABAA??BDFNTVY]_ac`YTSUZ\^dkf_^[XXWVNHFD@<;60.//+&###$!!      ÿý  ÿÿÿþÿýÿþÿÿÿÿÿÿÿýÿþÿýÿüÿþÿþÿýÿüÿþÿÿÿüÿÿÿÿÿýÿÿÿþÿÿÿýÿýÿÿÿþÿÿÿþÿýÿÿÿÿÿÿÿþÿýÿøÿ÷ÿÿÿÿÿüÿøÿûÿþÿùÿ÷ÿöÿýÿÿÿÿÿûÿöÿ÷ÿûÿýÿûÿýÿÿÿþÿûÿýÿûÿùÿúÿüÿüÿÿÿþÿúÿúÿüÿûÿûÿüÿûÿúÿøÿùÿùÿùÿøÿøÿúÿûÿøÿøÿúÿúÿùÿøÿøÿùÿùÿûÿûÿúÿüÿýÿýÿýÿþÿüÿüÿþ   !"$%(*,-048<<=:7;>>EOSTY\]`a[TUWXWX]a`\ZUROMLIB;87785/,-,(%$## "!  ÿÿÿÿ      ÿÿÿýÿþÿÿÿýÿþÿþÿýÿýÿÿÿýÿÿÿþÿþÿÿÿýÿÿÿýÿýÿþÿýÿÿÿþÿÿÿüÿÿÿÿÿÿÿþÿÿÿÿÿýÿýÿþÿÿÿþÿÿÿþÿÿÿÿÿüÿùÿýÿþÿùÿûÿÿÿûÿøÿöÿøÿþÿýÿüÿüÿüÿþÿþÿýÿúÿ÷ÿûÿÿÿÿÿüÿûÿüÿþÿÿÿÿÿýÿúÿúÿýÿýÿüÿûÿûÿûÿüÿýÿþÿüÿùÿùÿúÿúÿùÿ÷ÿùÿûÿûÿûÿûÿùÿ÷ÿöÿøÿøÿ÷ÿøÿúÿûÿüÿýÿüÿúÿüÿüÿýÿþÿÿÿÿÿÿ      "!!$'(').379747::?FLNQVXZ]\XWVTRTUUUTSNIGDDB:311232-***'#"""!!  ÿÿÿÿÿÿÿþ    ÿÿÿþÿüÿüÿþÿÿÿÿÿÿÿýÿüÿÿÿþÿÿÿÿÿÿÿþÿÿÿüÿþÿþÿÿÿþÿýÿþÿÿÿüÿüÿÿÿÿÿýÿþÿþÿÿÿÿÿÿÿÿÿýÿþÿþÿýÿùÿúÿþÿûÿûÿýÿþÿûÿúÿúÿýÿüÿûÿûÿùÿõÿöÿüÿýÿûÿüÿÿÿÿÿýÿýÿüÿûÿûÿþÿüÿúÿûÿúÿûÿüÿýÿüÿøÿ÷ÿüÿÿÿúÿöÿúÿþÿýÿüÿùÿ÷ÿùÿúÿúÿùÿùÿûÿüÿûÿùÿúÿûÿúÿúÿúÿýÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿ     "!"',25436878;AGJNSWXY[YVTSQPMKIHDA@><91+,...-*'(+)"!%! ! ÿÿÿÿÿÿÿÿÿû ÿþ ÿÿÿüÿÿÿýÿüÿÿÿÿÿþÿÿÿÿÿýÿÿÿþÿþÿþÿýÿüÿýÿÿÿþÿÿÿþÿþÿþÿÿÿÿÿýÿÿÿýÿúÿýÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿÿ ÿþÿþÿýÿùÿúÿýÿþÿûÿýÿþÿþÿüÿ÷ÿõÿùÿùÿõÿöÿúÿüÿüÿüÿýÿüÿüÿüÿùÿ÷ÿúÿýÿÿÿþÿúÿúÿþÿýÿüÿúÿùÿùÿùÿúÿüÿþÿûÿûÿþÿþÿüÿûÿ÷ÿ÷ÿúÿûÿûÿúÿûÿýÿüÿúÿúÿûÿúÿúÿúÿúÿûÿûÿûÿýÿþÿÿÿÿÿÿÿýÿþ  "%+10.141149?AELSTTWWVVTPKHD@><;:63/(%')**+*'),)!#'"! !"  ÿÿÿÿÿÿÿÿÿûÿ÷ÿÿÿÿ ÿÿÿýÿþÿÿÿýÿÿÿþÿþ ÿþÿþÿýÿýÿýÿþÿüÿûÿýÿÿÿýÿýÿþÿÿÿÿÿÿÿýÿúÿúÿýÿýÿÿ ÿýÿþÿýÿÿÿþÿþÿûÿüÿþÿöÿùÿýÿûÿûÿüÿúÿÿÿüÿþÿúÿøÿùÿûÿûÿúÿúÿüÿþÿøÿ÷ÿúÿûÿýÿýÿûÿùÿûÿýÿüÿûÿûÿûÿüÿþÿüÿûÿúÿüÿþÿûÿúÿúÿûÿüÿüÿýÿüÿûÿúÿøÿùÿüÿüÿúÿúÿúÿùÿüÿýÿûÿûÿüÿýÿûÿúÿúÿüÿþÿÿÿþÿýÿþ      "()'),+,0698;CJMNRSSTQMGB?<::72.,(##$$%&(*))+'##''# "$!"! !    ÿÿÿÿÿÿÿÿ ÿýÿøÿô  ÿÿÿþ ÿüÿÿ ÿÿ ÿüÿüÿýÿýÿýÿþÿüÿûÿÿÿþÿüÿüÿÿÿýÿùÿúÿýÿýÿþÿþÿÿÿþÿýÿÿÿÿÿÿ ÿÿÿþÿÿÿÿÿþÿýÿøÿ÷ÿýÿþÿüÿûÿûÿþÿýÿýÿþÿüÿûÿþÿÿÿýÿúÿýÿúÿûÿþÿýÿûÿýÿþÿüÿùÿøÿúÿúÿüÿþÿýÿùÿ÷ÿùÿüÿýÿþÿüÿøÿøÿüÿýÿýÿüÿüÿüÿûÿûÿùÿùÿûÿûÿüÿüÿûÿùÿøÿúÿüÿýÿûÿûÿúÿúÿûÿûÿüÿýÿþÿÿÿþÿþÿýÿüÿþÿÿÿþÿÿÿÿÿþ      #%&'&'+2645<@CIPQPLHHE?;:994-+*%"$""##%'()*&&*+%"$'%! $%"!!  ÿÿÿÿÿÿÿþ ÿûÿøÿû   ÿûÿùÿþÿýÿþÿüÿüÿÿÿÿÿûÿüÿÿÿýÿúÿÿÿþÿþÿþÿÿÿÿÿüÿþÿþÿþÿûÿþÿûÿöÿüÿúÿüÿÿÿþÿþÿûÿúÿþÿýÿúÿøÿøÿùÿùÿùÿúÿúÿùÿúÿûÿüÿýÿýÿþÿüÿúÿúÿüÿüÿûÿûÿûÿùÿúÿûÿûÿýÿþÿýÿýÿûÿøÿ÷ÿøÿúÿûÿýÿýÿûÿüÿüÿüÿûÿûÿüÿþÿþÿþÿþÿýÿýÿÿÿþÿýÿþÿþÿýÿÿ     %((#!%,44258;CLPMF@BB;66661,-,'&%"#$##%(**'*//(#(+&""%$! !   ÿÿÿýÿûÿþ ÿÿ  ÿþÿÿÿÿ ÿþÿýÿýÿÿ ÿþÿü ÿÿÿÿ ÿÿÿýÿþÿÿÿýÿþÿÿÿüÿúÿÿÿüÿüÿÿÿõÿ÷ ÿúÿüÿÿÿÿÿÿÿüÿþÿÿÿüÿþÿþÿùÿ÷ÿøÿùÿøÿùÿýÿüÿûÿûÿûÿüÿüÿûÿýÿýÿüÿûÿûÿüÿùÿøÿûÿþÿÿÿýÿùÿ÷ÿöÿùÿûÿûÿûÿüÿýÿþÿþÿýÿúÿúÿûÿûÿüÿüÿüÿüÿþÿüÿüÿýÿþ  !(*$!'/0./16=DGEB>>>70144/-0-*)'%''&%(*))*-01,&)+'!"!    ÿÿÿþÿþÿûÿý  ÿü ÿýÿÿÿÿÿÿÿÿÿþÿÿ ÿÿÿþÿÿ ÿýÿÿÿüÿüÿüÿýÿøÿøÿûÿùÿÿÿùÿüÿÿÿüÿüÿúÿýÿþÿûÿùÿúÿûÿüÿýÿûÿùÿûÿýÿýÿûÿúÿüÿûÿúÿüÿûÿûÿûÿüÿýÿüÿùÿøÿûÿûÿúÿüÿûÿüÿÿÿÿÿüÿúÿøÿøÿúÿúÿûÿýÿþÿýÿýÿþÿûÿùÿûÿûÿùÿûÿüÿûÿüÿÿÿÿÿýÿüÿþ #'%""%*,+*,29=<;==<;602441-/.**))++)(,,&%'(*-+%&(&   ÿÿÿÿÿýÿýÿÿÿÿÿÿÿûÿý   ÿþÿÿÿþÿüÿþÿþÿýÿÿÿÿÿþÿýÿýÿÿÿÿÿþ  ÿÿÿþÿü ÿþÿúÿûÿÿÿþÿþÿüÿ÷ÿüÿùÿ÷ÿþÿþÿöÿôÿ÷ÿýÿýÿûÿüÿúÿùÿúÿùÿôÿôÿûÿÿÿüÿüÿüÿúÿûÿúÿ÷ÿöÿùÿûÿüÿýÿüÿüÿûÿûÿüÿûÿúÿúÿúÿùÿûÿþÿþÿüÿüÿüÿùÿøÿúÿúÿùÿùÿùÿúÿýÿþÿýÿþÿýÿþ   #&%$$&++()/5766::;:635541++,*+----(&(("""  ÿÿÿÿÿýÿýÿÿÿÿÿþÿÿÿýÿýÿü   ÿþÿþÿýÿü ÿÿÿÿ ÿüÿþÿþÿúÿüÿþÿýÿÿÿþ   ÿþÿûÿþÿúÿýÿýÿþÿûÿøÿþÿþÿûÿúÿùÿøÿùÿùÿ÷ÿ÷ÿ÷ÿúÿþÿýÿþÿýÿüÿýÿþÿüÿûÿüÿúÿùÿüÿýÿýÿúÿúÿûÿüÿûÿúÿúÿøÿùÿýÿþÿüÿüÿýÿûÿúÿûÿúÿùÿøÿøÿùÿüÿüÿüÿýÿüÿýÿÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿ  %&%#%+*&'.101599:7456321**-**-+))# ÿÿÿÿÿÿÿýÿýÿÿÿÿÿþÿþÿÿ   ÿÿÿúÿýÿÿÿþÿÿÿþÿþ ÿþÿþÿýÿþÿÿÿúÿÿÿþÿýÿÿÿþÿû  ÿÿÿÿÿûÿÿÿýÿÿÿÿÿýÿüÿþÿþÿùÿøÿûÿüÿûÿúÿúÿùÿøÿøÿùÿùÿúÿüÿÿÿÿÿþÿþÿüÿûÿúÿùÿúÿûÿùÿùÿùÿúÿýÿýÿúÿ÷ÿøÿþÿüÿúÿýÿþÿÿÿýÿûÿûÿúÿúÿúÿúÿúÿüÿýÿüÿýÿþÿÿÿüÿûÿþÿÿÿÿÿÿÿþÿýÿýÿþÿÿÿÿÿþÿýÿÿ  #%&%$()&'-/,069675157301,+.($$"   ÿþÿÿÿÿÿýÿÿÿÿÿÿÿÿÿþÿÿ ÿþÿüÿýÿúÿÿÿÿÿþÿþÿþÿüÿþ ÿÿÿýÿýÿþ  ÿüÿÿÿýÿÿÿþÿýÿ÷ÿ÷ÿ÷ÿûÿüÿúÿýÿþÿüÿûÿùÿùÿÿÿüÿûÿþÿýÿöÿõÿùÿüÿùÿöÿ÷ÿüÿýÿúÿüÿüÿüÿÿÿýÿúÿúÿúÿúÿúÿúÿüÿýÿüÿøÿ÷ÿúÿýÿýÿûÿúÿüÿýÿýÿüÿúÿûÿúÿúÿúÿúÿûÿûÿûÿýÿþÿþÿÿÿÿÿþÿýÿýÿüÿüÿüÿýÿþÿþÿþÿÿÿþÿýÿýÿþÿÿÿÿÿýÿþÿüÿúÿûÿþÿÿÿþÿýÿýÿüÿþÿÿ  "$&%#%((),.-1551241473..+('!     ÿÿÿÿÿþÿþÿýÿÿÿþÿþÿÿÿþÿÿ ÿýÿþ ÿýÿýÿýÿþÿþÿý ÿþ ÿüÿüÿÿÿþÿúÿøÿõÿýÿýÿýÿþÿùÿõÿöÿüÿúÿùÿüÿùÿôÿöÿûÿþÿýÿúÿùÿúÿùÿøÿüÿþÿÿÿÿÿûÿüÿüÿúÿúÿúÿûÿüÿüÿùÿöÿöÿúÿüÿûÿúÿùÿûÿüÿúÿùÿùÿùÿøÿùÿúÿúÿüÿüÿüÿüÿýÿþÿÿÿÿÿÿÿýÿûÿýÿüÿûÿûÿûÿûÿÿÿÿÿýÿýÿýÿüÿýÿýÿþÿþÿüÿûÿüÿþÿÿÿþÿúÿùÿûÿÿÿþÿüÿüÿüÿüÿþÿÿ  "$%%&(+..-01.-/2123/(&%!     ÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿþ  ÿþÿþ ÿÿÿþÿýÿþÿþÿÿÿÿÿÿÿüÿýÿÿÿÿÿÿÿþÿüÿþÿýÿùÿ÷ÿöÿúÿýÿøÿùÿùÿ÷ÿõÿ÷ÿøÿùÿýÿþÿþÿÿÿûÿøÿùÿüÿþÿúÿøÿýÿûÿùÿúÿùÿøÿûÿþÿýÿúÿøÿùÿûÿüÿúÿöÿøÿûÿûÿûÿùÿ÷ÿøÿûÿûÿûÿûÿüÿþÿþÿýÿýÿÿÿþÿÿÿüÿûÿûÿüÿûÿùÿûÿÿÿÿÿüÿüÿýÿüÿûÿýÿýÿýÿÿÿýÿúÿúÿüÿþÿüÿúÿúÿüÿþÿýÿüÿüÿýÿþÿþÿý $()()+/.,.-)*-00.,*%""     ÿþÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿý ÿþÿþ ÿþÿÿÿÿÿþÿþÿþÿüÿÿÿþÿÿÿÿÿÿÿüÿÿÿýÿøÿûÿÿ ÿüÿþÿýÿýÿûÿúÿûÿþÿûÿöÿ÷ÿûÿüÿøÿøÿøÿúÿýÿüÿûÿüÿüÿúÿùÿûÿýÿûÿûÿýÿùÿùÿúÿûÿûÿüÿþÿþÿýÿüÿùÿùÿûÿúÿ÷ÿøÿúÿüÿûÿøÿøÿúÿüÿúÿúÿüÿýÿÿÿÿÿÿÿÿÿþÿþÿýÿûÿýÿýÿýÿýÿüÿüÿÿÿÿÿûÿüÿþÿúÿùÿüÿüÿûÿþÿþÿüÿûÿüÿýÿüÿúÿûÿüÿüÿüÿýÿüÿþÿÿÿþÿþ  $(+----,**)'(*./+)*($$!     ÿýÿüÿÿÿÿÿÿÿþÿþÿÿÿþÿýÿþÿÿ ÿÿÿÿ ÿüÿüÿÿÿûÿûÿÿÿÿÿÿÿÿÿÿÿûÿþÿÿÿÿ ÿÿÿþ ÿÿÿþÿûÿýÿþÿüÿõÿøÿüÿøÿöÿ÷ÿýÿúÿøÿüÿýÿüÿúÿùÿøÿüÿÿÿþÿÿÿÿÿþÿýÿûÿúÿúÿýÿÿÿþÿüÿûÿüÿùÿøÿùÿùÿøÿùÿùÿûÿûÿùÿ÷ÿùÿûÿüÿùÿùÿüÿÿÿÿÿþÿþÿýÿûÿûÿþÿýÿüÿýÿýÿýÿþÿþÿûÿûÿüÿûÿüÿûÿúÿüÿýÿüÿüÿüÿüÿýÿûÿùÿúÿúÿüÿþÿýÿýÿýÿüÿþÿÿÿÿ #(-12/*('%%'(,/-+*)''%      ÿþÿýÿþÿýÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿ  ÿþÿÿ ÿþÿþÿýÿûÿÿÿúÿûÿÿ ÿû ÿÿÿùÿÿÿüÿûÿüÿýÿÿÿùÿõÿúÿûÿùÿúÿøÿùÿûÿùÿùÿùÿøÿùÿûÿüÿüÿÿÿüÿüÿüÿüÿüÿýÿýÿûÿúÿûÿüÿüÿýÿüÿûÿøÿøÿúÿûÿúÿ÷ÿøÿüÿüÿúÿûÿüÿüÿýÿûÿûÿüÿýÿÿÿÿÿýÿüÿüÿüÿüÿüÿüÿýÿûÿúÿûÿüÿüÿúÿùÿúÿüÿþÿüÿûÿþÿýÿüÿüÿûÿüÿþÿûÿùÿúÿûÿüÿýÿýÿþÿýÿüÿýÿþÿÿÿÿ !%*042,(%!"&'+-.-(&&((      ÿüÿüÿÿÿþÿÿÿÿÿþÿÿÿþ  ÿÿÿüÿþÿþÿûÿýÿÿÿÿÿÿ ÿýÿÿÿþ ÿÿÿüÿùÿþÿýÿýÿûÿýÿüÿùÿøÿùÿûÿùÿ÷ÿøÿýÿýÿûÿûÿýÿûÿøÿùÿùÿûÿþÿýÿüÿúÿøÿúÿúÿúÿüÿüÿüÿúÿúÿúÿüÿþÿúÿ÷ÿúÿüÿýÿþÿüÿüÿüÿýÿþÿýÿýÿþÿýÿÿÿÿÿüÿûÿýÿýÿûÿûÿýÿýÿüÿûÿüÿûÿúÿùÿùÿúÿüÿþÿÿÿÿÿýÿüÿýÿýÿûÿûÿüÿûÿúÿýÿþÿþÿýÿüÿüÿþÿýÿüÿýÿÿÿÿÿþ   #%(-34.)# $%(*+,(%'(%     ÿÿÿÿÿþÿüÿýÿÿÿûÿÿÿþÿþÿþ  ÿÿÿþÿÿÿþÿÿÿüÿýÿùÿúÿýÿÿÿÿÿüÿþ  ÿýÿûÿþÿþÿÿÿÿÿýÿúÿûÿûÿÿÿýÿûÿúÿûÿúÿøÿ÷ÿÿÿÿÿýÿúÿ÷ÿúÿýÿüÿýÿÿÿþÿüÿûÿûÿüÿüÿûÿùÿùÿúÿûÿûÿûÿýÿýÿþÿýÿüÿþÿÿÿÿÿþÿýÿýÿüÿüÿüÿýÿýÿûÿüÿþÿþÿüÿúÿùÿùÿûÿþÿÿÿýÿüÿýÿýÿüÿüÿüÿüÿûÿûÿýÿþÿýÿþÿþÿýÿüÿýÿüÿýÿþÿÿÿÿÿþÿÿ !$',02/+%"$"%(()((+(       ÿÿÿþÿþÿþÿþÿÿÿýÿýÿþÿûÿþÿÿÿýÿÿÿþÿþÿýÿÿÿÿÿÿ  ÿþÿÿÿýÿüÿýÿÿÿÿÿùÿúÿÿÿÿÿüÿ÷ÿûÿýÿÿÿýÿüÿüÿúÿùÿøÿüÿþÿûÿøÿùÿúÿúÿüÿýÿüÿýÿþÿûÿùÿúÿûÿùÿøÿúÿüÿþÿüÿüÿþÿÿÿýÿþÿþÿýÿþÿýÿûÿüÿüÿûÿûÿüÿüÿüÿûÿùÿúÿþÿÿÿüÿúÿûÿýÿýÿüÿüÿýÿüÿüÿýÿýÿüÿüÿýÿÿÿþÿûÿúÿþÿþÿþÿÿÿýÿÿÿÿÿÿ  $),,,+(%&'$'(&'&*.(      ÿÿÿýÿÿÿþÿþÿüÿûÿÿÿþÿÿÿýÿüÿþÿýÿüÿÿÿÿ ÿþÿþÿýÿþÿøÿÿÿþÿþÿÿÿúÿûÿþÿüÿûÿúÿüÿÿÿüÿ÷ÿøÿùÿûÿùÿûÿüÿûÿüÿúÿûÿüÿøÿôÿõÿøÿ÷ÿöÿùÿþÿÿÿýÿüÿüÿÿÿýÿýÿüÿúÿûÿýÿüÿýÿþÿüÿýÿþÿÿÿþÿýÿýÿýÿþÿýÿýÿýÿüÿýÿýÿüÿûÿùÿúÿûÿüÿûÿüÿüÿüÿþÿýÿúÿûÿþÿþÿüÿüÿþÿþÿþÿýÿüÿýÿüÿýÿýÿýÿþÿþÿþÿýÿüÿýÿÿÿþÿýÿþ   &((('((*+)**'$#(+& ÿýÿýÿÿÿþÿýÿüÿþÿÿÿÿÿÿÿýÿüÿýÿþÿþÿÿÿþÿüÿûÿþÿÿ ÿýÿöÿÿÿúÿÿÿþÿýÿþÿüÿûÿùÿ÷ÿûÿýÿùÿúÿýÿûÿøÿøÿúÿúÿ÷ÿ÷ÿúÿúÿ÷ÿøÿúÿúÿúÿúÿûÿüÿÿÿÿÿþÿþÿýÿûÿüÿüÿüÿüÿüÿûÿûÿüÿýÿþÿýÿüÿûÿýÿüÿúÿýÿþÿþÿýÿýÿüÿûÿûÿúÿúÿýÿþÿüÿüÿþÿýÿüÿüÿýÿýÿüÿüÿýÿþÿüÿüÿýÿýÿýÿýÿÿÿþÿýÿüÿûÿûÿüÿýÿýÿþÿÿ $'''&&'+.-,+'# $(#    ÿÿÿÿÿÿÿÿÿûÿüÿÿÿýÿþÿÿÿþÿÿÿüÿÿÿÿÿüÿþÿÿÿýÿÿÿÿÿûÿýÿýÿþÿþÿþÿüÿþÿüÿúÿ÷ÿ÷ÿýÿÿÿÿÿÿÿþÿûÿùÿ÷ÿ÷ÿûÿýÿþÿÿÿüÿüÿýÿüÿüÿüÿýÿÿÿÿÿþÿúÿúÿûÿüÿûÿúÿúÿüÿüÿüÿþÿýÿýÿýÿþÿþÿþÿüÿûÿÿÿýÿüÿýÿüÿýÿþÿÿÿýÿüÿýÿüÿûÿüÿýÿýÿþÿüÿûÿýÿþÿýÿûÿûÿûÿýÿþÿýÿüÿûÿûÿýÿÿÿÿÿþÿþÿÿÿþÿüÿüÿüÿûÿüÿþÿÿÿÿ !%&(*&$',/-+'$ #("   ÿÿÿÿÿÿÿüÿüÿþÿÿÿþÿþÿÿÿÿÿÿÿþÿÿÿþÿþÿþÿþÿÿÿÿ ÿÿÿÿÿþÿúÿùÿüÿüÿýÿþÿýÿýÿýÿùÿùÿüÿýÿÿÿüÿûÿýÿýÿûÿþÿþÿþÿþÿÿÿýÿüÿüÿþÿÿÿýÿûÿýÿüÿùÿùÿúÿûÿûÿûÿûÿüÿýÿÿÿÿÿÿÿüÿûÿüÿýÿûÿûÿþÿýÿþÿýÿüÿüÿüÿÿÿýÿüÿýÿýÿüÿýÿýÿüÿýÿüÿüÿüÿýÿüÿüÿûÿúÿüÿþÿýÿüÿûÿüÿþÿÿÿþÿþÿþÿýÿýÿýÿýÿüÿýÿýÿþÿþÿÿÿÿÿÿ  %),)%%)-+(%%#%)"    ÿþÿÿÿýÿÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþ ÿþÿûÿüÿýÿúÿûÿûÿûÿúÿûÿúÿøÿýÿýÿûÿùÿûÿýÿýÿþÿýÿýÿýÿþÿþÿþÿÿÿüÿøÿûÿþÿþÿýÿúÿøÿùÿúÿùÿûÿþÿüÿúÿüÿþÿþÿýÿþÿþÿûÿúÿûÿþÿýÿýÿýÿýÿýÿüÿþÿüÿýÿýÿúÿüÿþÿýÿüÿüÿüÿüÿýÿüÿúÿüÿýÿûÿüÿþÿüÿûÿüÿþÿÿÿýÿþÿÿÿþÿûÿûÿýÿýÿþÿÿÿþÿþÿþÿþÿÿÿÿÿþÿÿ #&('%((')&#&%),$!!   ÿýÿÿÿÿÿþÿÿÿþÿýÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿ fv5.4/ftools/guis/fv/sample_data/pow.reg0000644000220700001010000000020107452425203017646 0ustar birbylheadev# Region created by POW Mon Feb 12 17:22:50 EST 2001 # filename: ngc1316o.fit_0 fk5 +circle(3:21:33.51, -37:23:52.22, 5.323729') fv5.4/ftools/guis/fv/sample_data/rate.fit0000644000220700001010000027720007452425203020020 0ustar birbylheadevSIMPLE = T / file does conform to FITS standard BITPIX = 8 / number of bits per data pixel NAXIS = 0 / number of data axes EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format defined in Astronomy andCOMMENT Astrophysics Supplement Series v44/p363, v44/p371, v73/p359, v73/p365.COMMENT Contact the NASA Science Office of Standards and Technology for the COMMENT FITS Definition document #100 and other FITS information. ORIGIN = 'NASA/GSFC/XTE/MIT_c' / Origin of FITS file TELESCOP= 'XTE ' / Mission Name INSTRUME= 'ASM ' / Instrument Name OBJECT = 'grs1915+105' / Common Object name RA_OBJ = 288.80 / Object right ascension in degrees DEC_OBJ = 10.95 / Object declination in degrees EQUINOX = 2000.00 / Equinox for R.A. and Dec. RADECSYS= 'FK5 ' / World coord. system for this file (FK4 or FK5) CONTENT = 'Light Curves' / Content of the files ANL_TYPE= 'DEFINITIVE' / Type of analysis (QUICKLOOK or DEFINITIVE) MJDREFI = 49353 / Reference MJD - integer part (integer) MJDREFF = 6.965740760000000E-04 / Reference MJD - Fractional part (8 byte real)DATE-OBS= '06/01/96' / Date of earliest observation included in file (TIME-OBS= '08:56:00' / Time on Date of earliest observation included iDATE-END= '08/01/96' / Date of latest observation included in file (ddTIME-END= '01:51:21' / Time on Date of latest observation included in DATE = '03/09/96' / FITS file creation date (dd/mm/yy) CREATOR = 'mk_asm_infits' / Name of program which produced this file CHECKSUM= '0ggV1ggT0ggT0ggT' / encoded HDU checksum updated on 26/09/96 DATASUM = '0000000000000000' / data checksum updated on 03/09/96 END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / 8-bit bytes NAXIS = 2 / 2-dimensional binary table NAXIS1 = 16 / width of table in bytes NAXIS2 = 5371 / Number of rows PCOUNT = 0 / size of special data area GCOUNT = 1 / one data group (required keyword) TFIELDS = 3 / number of fields in each row TTYPE1 = 'TIME ' / label for field 1 TFORM1 = 'D ' / data format of the field: 8-byte DOUBLE TUNIT1 = 'd ' / physical unit of field TTYPE2 = 'RATE ' / label for field 8 TFORM2 = 'E ' / data format of the field: 4-byte REAL TUNIT2 = 'counts/s' / physical unit of field TTYPE3 = 'ERROR ' / label for field 9 TFORM3 = 'E ' / data format of the field: 4-byte REAL TUNIT3 = 'counts/s' / physical unit of field EXTNAME = 'RATE ' / name of this binary table extension ORIGIN = 'NASA/GSFC/XTE/MIT_c' / Origin of FITS file TELESCOP= 'XTE ' / Mission Name INSTRUME= 'ASM ' / Instrument Name OBJECT = 'grs1915+105' / Common Object name RA_OBJ = 288.80 / Object right ascension in degrees DEC_OBJ = 10.95 / Object right ascension in degrees EQUINOX = 2000.00 / Equinox for R.A. and Dec. RADECSYS= 'FK5 ' / World coord. system for this file (FK4 or FK5) CONTENT = 'Light Curves' / Content of the files DATE-OBS= '06/01/96' / Date of earliest observation included in file (TIME-OBS= '08:56:00' / Time on Date of earliest observation included iDATE-END= '12/03/97' / Date of latest observation included in f TIME-END= '06:18:34' / Time on Date of latest observation inclu DATE = '03/09/96' / FITS file creation date (dd/mm/yy) CREATOR = 'mk_asm_infits' / Name of program which produced this file MJDREFI = 49353 / Reference MJD - integer part (integer) MJDREFF = 6.965740760000000E-04 / Reference MJD - Fractional part (8 byte real)TIMESYS = 'TT ' / System used to define the time TIMEUNIT= 'd ' / Unit of time for TSTART and TSTOP TIMEREF = 'LOCAL ' / LOCAL,SOLARTIME,HELIOCENTRIC or BARYCENTRIC TASSIGN = 'SATELLITE' / Specified where the time assignment is made(SATTIERRELA= 'Timing error as a rate' / Relative timing error (expressed as rate) TIERABSO= 'Absolute timing precision' / Absolute timing precision CLOCKCOR= F / Has the time been corrected to UT? BACKAPP = T / Background correction applied (True/False) VIGNAPP = T / Vignetting correction applied (True/False) TSTARTI = 735 / Integer portion of time of the earliest observaTSTARTF = 3.71525425922E-01 / Fractional portion of the time of the earliest TSTOPI = 1166 / Integer portion of time of the last obse TSTOPF = 2.62197425924000E-01 / Fractional portion of the time of the la TIMEZERO= 0.000000000000000E+00 / Zero time to use when calculating absolute tiCHECKSUM= '5KA98H865HA65H56' / HDU checksum updated 1999-04-22T18:07:46 DATASUM = '3339642929' / data unit checksum updated 1999-04-22T18:07:46 END @†úùóyÿ€A¼ÁÒ?§›V@†úü9õåA¾ÌÚ?ÂV@‡‚ŒÂALÌó?w¥ô@‡„*ã"€Aá Œ?ÂR¤@‡†S9‚ÀAæ¶d?ÅüÊ@‡ˆ{LÇ@Aá…„?Æ© @‡Š£` ÀB¹ç?ÏŸ©@‡ŒË¶lAßct?Å–Ñ@‡Žô Ì€AÞ?Ľì@‡‘ AÚÃ?Ƽ@‡“D3U€AÞ%?Ç„¡@‡•l‰¶Aë?Ƕ_@‡—”œú€Aã§š?Ç>´@‡™¼óZÀAÙ†,?Ì@‡›åŸ@AÕïÃ?Æ$«@ˆ|KÞÿ@Aýf?õöw@ˆ}j6RÂAñ¥w@?ò@ˆ}l|Χ€B õ?ÿº@ˆ}ùóyÿ€AÕóæ?£r6@ˆ~ŠràèB¦=@5«ï@ˆ~Œ¹ŸéA‰#?ÃÞè@ˆ¡ö}ÀB”’?þ–@ˆ¤<ù¥€B/ɹ?öÆ‚@ˆ€,Å®ëB>˜¾?ð¦ @ˆ€µN!BZ$Ç@šª@ˆ€·”œú€Béf?Û‘@ˆ=Ö“?B+`c@fí@ˆ@$@B]À™@ã›@ˆÎ·;‹B¸„Ö@OÇÚ@ˆÐý·pA›5?¿su@ˆ„Ôg´dB[Ö?@ „Â@ˆ…_—ãÖÀBt+Š@!ƒõ@ˆ…aÞ_¼A¯Õ ?䔚@ˆ…ö‰À'€BXÌ?âË–@ˆ…øÐ< B‹xš@AË!@ˆ†ŠràèBŒ¬@QGí@ˆ†Œ¹ŸéBML¡@ÞL@ˆ‡JÍ£€B( @Zû@ˆ‡‘IˆÀB›ñe@4ª¨@ˆ‡£zýB/+Ã?ê@ˆ‡¥Áxû€Búê@ F@ˆˆ-‡«z@Aè _?¯xš@ˆˆ¶`ÀBaÈ‘@Ø'@ˆ‰˜ÒêAÅ–?¶—á@ˆŠÍôûßÀBƒJÄ@M~A@ˆŠÐ¸As”?Ãx`@ˆfÌUÎ@BZÁ?²­@ˆiѳ€B2V@ 3/@ˆŽ‚|/E@BH{?ñö¡@ˆ´‡{€BŸ¯û@0F€@ˆ£zýA%ü?±B@ˆ,o@BÎ1?¿b@ˆ´í"Í€Aëlç?´ù#@ˆ¹z˜B{UD@·é@ˆ‘Cè _ÀB§en@e)c@ˆ‘F.†EAžäJ?™T@ˆ‘HuEF@BY¶@9 ‰@ˆ‘J} ^€BI|@[Ñ@ˆ‘Ô)P{B£³@Fðö@ˆ”Úê!€Bªó½@Kg¡@ˆ•cÃÝYÀAùþæ?Ëfs@ˆ•j—Q ÀBWƒ•@a$@ˆ•õÇ€|€Aÿ“â?Ëk@ˆ•úTxGAË:@_@ˆ•ü›7H@B¢uÛ@Qç›@ˆ–‡Ë#ŸA Æ?®QU@ˆ–ŽžÚkB,½Ü@ëæ@ˆ—BA–Ú?¥1U@ˆ—ÈßB&?(@³@ˆ—¤<ù¥€A¾Ý?ÍÓÌ@ˆ—¦ƒuŠ€B¾ ’@`  @ˆ—«°qAÚ)Ô?Þ«½@ˆ˜,Å®ëA­ë?ÓÖà@ˆ˜/ *ЀBf#@ð@ˆ˜3™"›B ½Š?õíJ@ˆ˜¶Ò]O@B8MT?ô:@ˆ˜»_˜5ÀBQ&@7‡Y@ˆ˜½¦A©þ`?Õ%¢@ˆ™El‰¶B½Æ@|[@ˆ™G³›Aúa¼?Ô8C@ˆšÄyÊçB1} ?àâÊ@ˆšÆÀFÌ@A²­n@ø˜@ˆšÈí€B¿•@\ÄÁ@ˆœÝ£ù@AÏ8?ÏÜœ@ˆœäUZÅB3¯p@P¾@ˆlÐ`BSv¹@Åv@ˆnbLE@B¬½z@bG@ˆrïDBÓ>@=y@ˆu5¿õB-˜@Ve@ˆù1}p@Be¯’@¸R@ˆžñ @B… a@5ã´@ˆžžíÂ/€Aú¨^?Æy@ˆŸ/ *ЀBN¢Ø@.:@ˆŸ1R¦µÀAÍl?¹$@ˆŸ½¦AÂÜí@å@ˆ¢38$S€Bœ 4@\0@ˆ¢5~ 8ÀB^Äâ@í @ˆ¢: Û€A‹í?ÓpÅ@ˆ¢@ˆ©;ñ¡@Bg"Ü@ƒ@ˆ©>7Ô¢€AÊèI?É9ó@ˆ©@~P‡ÀBnÄP@v«@ˆ©¶q_€B£Ì?Åhƒ@ˆ©¸·ÚíBv«ñ@3ï$@ˆ©ºþVÒ€B·Ì?÷®X@ˆ¬ÙUªv@Bb·?èã¬@ˆ¯‘IˆÀB]c@ìÌ@ˆ¯×ÅnA¥3 ?Í3@ˆ¯×ÅnB-/@ @ˆ¯AS€B²®@PõZ@ˆ¯­ÎùÀB>U@ f'@ˆ¯¿‹‘¹A§©?½Ã@@ˆµ| vÁB^ûM@ït@ˆµ‚Ý-BUì@ ¿º@ˆ¶B¸¥?ñ€»@ˆ¶£Z€BqF“@7ºs@ˆ¶éÏ\AÊæu?ÇÇq@ˆ¶žíÂ/€BŽ­@2÷ù@ˆ¶£zýAz›?ë^ú@ˆ¶¥§…4€BQzß@Kà@ˆ¼UZs3A¯>Ì?ã®Å@ˆ¼ê‚€A•jú?´@ˆ¼î’ËiBcÒ@ ·@ˆ½y»0€Bž[?äLà@ˆ½}²û@BeâÄ@ .¡@ˆ¾ ¡oBÉ´?ðA¼@ˆ¾ KT€B@ÿ²@,å—@ˆ¾‘™:BCªõ@ Fé@ˆ¾ØX;BVpN@‡Ê@ˆ¾ŠràèBaÓ@%’@ˆ¿‘™:AÞb@â@ˆ¿ØX;Bt-@,x@ˆ¿—¹ BU´@FD(@ˆ¿™ÿ‰€AÔzš?êš@ˆÀÈßA­¥í?Ìš=@ˆÄeH”Bx%T@ò@ˆÄgŽ•y€B=@ ®2@ˆÄiÕTz€Bµ^ã@Ts@ˆÄlÐ`A§{¬?òQÒ@ˆÅitBm‘a@jÆ@ˆÅkºŽü€B ê²@(Û4@ˆÅñ›†ù€AÐ7?Óñk@ˆÅóâÞÀBÊÂA@b®>@ˆÅö(~ÄB¿i@-ù@ˆÅønú©€B‚½?õ7†@ˆÆ¦ËCB».J@e×4@ˆÆ´*ã"€AÅ¥è?î‘:@ˆÆ¶q_€Bzªm@°S@ˆÇ1R¦µÀBŸ%@•@ˆÇ3™"›B‡ù@&#t@ˆÈ/ *ЀA˜úù?§íR@ˆÊÔqü€AÑ¿?¤¥Q@ˆÊ‚íâBŠœ€@IKM@ˆÌb?^€BÌcŠ@“ë@ˆÌd…ÙéB¹@ êF@ˆÌiѳ€B!|@C@ˆÌkYµAÎYQ?Ûë@ˆÍjøOQ€AÆ­?¦¨@ˆÍm?R€B«Ó%@SFÔ@ˆÍo…Š8B‰A@1s£@ˆÍõ@Ñ€B¸N#@E†¡@ˆÍ÷KÿÒ€BYóò@ÎÈ@ˆÍù’{¸AŸ?Á*0@ˆÏ ^ûBV{i@±`@ˆÏC‡ AÌŽŠ?Ç¥"@ˆÏHâÀB»±ù@c•@ˆÏJZÈA”ý?x«@ˆÐ®Û«¬€B*k@-`ö@ˆÐ±"'’Aï,o?÷\}@ˆÓ KT€A‰M?eœ¿@ˆØ¥`z´Bu"É@*ºõ@ˆØ§¦ö™@A¼¤Ç?ʈ@ˆÚ€–±§€BŸø@3Ü@ˆÚ‚Ý-B›}{@K£@ˆàì­MË@B™é‘@@ @ˆâ…åé@BY2?ÉŸ@ˆâˆ,e€Aâ²—?À¦¹@ˆäaÞ_¼Bea@SGk@ˆäd$Û¡€B;õ€?üp @ˆècÃÝYÀB ÷Â?ǰŠ@ˆèf Y?Aôgÿ?ç¸V@ˆépGÉãB‚ûñ@5a@ˆéñ›†ù€BNÄ?û¶=@ˆê„«*€AŸub?„!Ñ@ˆîºÁQ€AïVD?Í€E@ˆî§EøQ€BOÞ@ °@ˆî©Œt7B­?à‡f@ˆðb \K@B8pn@¤Æ@ˆðdæØ0€B¯¿?ÏsŽ@ˆñïU BŒÍ°@5µž@ˆññ›†ù€B‹H@$Fx@ˆò„k€B‹Ê#@@šV@ˆò†FçeBy,W@ªÎ@ˆôgŽ•y€Bg”@2r@ˆôiÕTz€AÑþ9?ébA@ˆôúTxGA¾ÓË?¯fb@ˆõˆ¦fBŸCÏ@Iו@ˆõŠÔ"K€Brë@ü&@ˆ÷I7„ñ@B—•£@I¾#@ˆ÷K~Ö€A–³Í?–ºØ@ˆ÷Ñ¿÷@Bp @œ0@ˆ÷Ôs€BKUÇ@ ±@ˆùðÙGN€AŽK?޽@ˆú€–±§€B Û@L†@ˆú‚Ý-B+Ó ?ã0Ï@ˆûÒhBX@7T@ˆüw|~ö€A¿¬;?ŸÄ~@ˆýofBÁد@g«;@ˆý{G7A†m?•û@ˆþª¯²)€B"Þø?åÐÈ@ˆþ¬ö.B¿ú9@vŒ@ˆÿÜ¿§jB+‡?Úx§@‰cb›ö@B¼Wö@hÖ^@‰e©Û€A¦JZ?®q@‰cb›ö@B«z @G¦]@‰e©Û€B£l©@e'³@‰õÇ€|€BŽ¥¶@AòÜ@‰ø üaÀB¬Çd@Jmç@‰÷‹<A³ ?«"@‰ÅþJ=B”œ@1uæ@‰HâÀAý?éÓ¢@‰JZÈB.¦õ@.©@‰Øô¬.€B¾>ù@Q7°@‰ dæØ0€BÊÊ@aÍ}@‰ g-—1ÀBÐr@æ@‰ ÷KÿÒ€Aï½Z?É+,@‰ ù’{¸BJ)5@.¤+@‰ ‚Ý-BÏœ@cæ@‰ …#©r@B3É>@!-¶@‰ ˆø€B—ß@,Â7@‰ S¹€Bn,@d@‰ šÁȬ€B``ù@*Çq@‰ ‡­ÀB¡©?ÖŽ @‰ÁÒ žBJ2?ýt?@‰c®ÀAÁÉ ?Ó.{@‰eH”BLsÀ@ bN@‰<†B<ý0?ú&Õ@‰"vYAÀAˆÌf?ÀÄç@‰#šç—@BÉXÿ@Pƒ@‰#¢¸½kBÀ×@Y@‰#¤ÿ9P€B8=Ä?óV*@‰1r-G€€B ÿX?ËJ^@‰3šTÊ@B-_e@ @‰3àЯ€Bµ¦{@J"ò@‰3žíÂ/€B’ ?ÖTÎ@‰3¡40ÀB«¬#@\¹^@‰40/hÃB®}O@;Jˆ@‰5:lÙgB!d?ßËO@‰5<³UL@Bº(@Zcõ@‰7C‡ B`×ã@L@‰;‡­ÀB«¿†@Fôä@‰;ŸO“BD¢ä@ p@‰<'×u½B¸¸ü@Rºä@‰<*ñ¢€B޵i@'7~@‰<°_ççB2ÿ‹?ýU?@‰<²¦cÌ@BÂÒ @V’X@‰=-èìÝÀB1Ž?í%Ì@‰=0/hÃB¼}@a¿@‰CûåÞÀBÁå¿@jÐò@‰C BaÄB¿¿t@]‹ô@‰Cž+‚„€BÑþœ@l]-@‰C rA…ÀBÒmœ@yø@@‰D¬”ì«€B ˜?Π@‰D±"'’AÏâH@°’@‰E;/B‡Ñ@6õí@‰E=u”÷€Bñ–@1xu@‰EBŒÂB|÷?Þk@‰J|˶lBÁ3ã@mœ9@‰J2Q€B¾² @žÎÍ@‰K½ânB²à@]?@‰K•Ó~€B¯Ì@Dd@‰Kœ§FJ@B¸—@_Í@‰L AÂbB›dÊ@2n"@‰L'6Bg¢‰@% °@‰L¢W|€B`-@"@‰L¤ž;ÀB‡Ô(@^…”@‰L¦ä¶îBÈà-@e¼¶@‰P[ ¨ðB¹’{@_§ @‰P]Q$Õ€B¿—Ò@“l@‰P_—ãÖÀBBË?öÇã@‰Qe©Û€B¬pÄ@9_å@‰QëŠØ€BÒÃø@r¤ß@‰QíЋ¾B†íþ@t:y@‰Qð£@B¥l¬@5ë@‰Rz…:†ÀB4α@ ÷w@‰R2Q€B¶¸@GO@‰Sµiù€B¼µ@h ó@‰SûåÞÀB«bµ@A·é@‰SÂ]€B¹^¦@H0@‰TJÍ£€B¾n8@LÂì@‰TžíÂ/€B]¨’@ jQ@‰T¡40ÀB¨Ëÿ@WÙ@‰VÍ2¼4ÀBN#?Ñ”B@‰VÏÜÀBÁ¨º@…W@‰XEl‰¶B¡1¿@0P@‰YïU Bܾ7@h¨Æ@‰Yñ›†ù€BÁ a@rŸõ@‰Zy»0€B±×¯@•(@‰Z{G7B¬E@gO@‰Z}²û@BªŒ@5–:@‰[éÏ\B¶V@câq@‰[0KAB„¤É@RD@‰[vÇ&€Aëk¾@f@‰[½C ÀBÅÖ;@f2‡@‰[Ž=Ü#€B(íŸ@2¶á@‰[„XÀBÝ ¼@~SÚ@‰\ÆNM@Bôª©@–±u@‰\ Ê2€Bæba@‚éW@‰\¡•x€BcõP@YÜM@‰c,uÉ€A—?˜Bc@‰c,uÉ€A sP?±;@‰cwfˆ€B™Ü"@1_…@‰cŒ´çó€BºNO@Rà@‰c΀B¬np@3Šç@‰c΀BÊC@ƒS“@‰dÆNM@B5L@jè@‰d Ê2€B¦H½@.•¯@‰d Ê2€BÏÜ@…ˆ@‰jy»0€B¯d¥@D†Æ@‰k›¤U€B¾k@‹º`@‰kó*N€B½1ã@W+à@‰k‹–Ú€B·6Ò@S”¸@‰kÜšÀBÉì@Š“0@‰lÏ Ý€BÀÚý@†’j@‰n(8t€BÏ7@w¸²@‰n(8t€BѼ@€È@‰n*3ÀB¹Ž%@A†±@‰n*3ÀBÕ6@o–À@‰pÑ^µ·ÀBÐØ+@|Ã@‰pÓ¥t¹B¥Y9@‡L @‰pÕëðž@BÂÒ'@Q¨~@‰p×·½ÀB¼1@›áþ@‰sT(–BŒS&@š„@‰sŠâ €BÙq§@œñC@‰sŒX^…€B²òf@BŠ @‰sŽBSM±@@‰‰z#ù#@B¥n¢@6&9@‰‰z#ù#@B²Zk@DdÃ@‰ŠKm€Bˆ}»@œ•@‰ŠKm€B˜\@32ß@‰Š‘èëB”Ô¢@HKË@‰ŠŠÔ"K€Bž ð@&,@‰ŠŠÔ"K€B°S{@B’>@‰‹\”u@BšÛ[@"Òé@‰‹\”u@B¨D~@AZÑ@‰‹£Z€B™'@O4ç@‰‹œFæÀB†^4@3‹@‰‹žŒÃèBœä½@'îš@‰‹žŒÃèBš™X@,ò¶@‰Œ(/BoØ?@O%@‰ŒnîB“î¥@M Ì@‰ŒnîB“F@1º¦@‰Œµiù€B’N¡@"¤±@‰VoÂBŸò`@L·»@‰Xbë§€BŒe‚@1ƒÜ@‰Xbë§€B’¸Ë@<ób@‰ZŒ‘“B‘Ô@+vÿ@‰˜iѳ€B‘Z®@D²@‰˜iѳ€B”ÝC@,Â×@‰˜kYµBrµú@ V@‰˜î’ËiB¿Á‘@u"l@‰˜ðÙGN€B¦sÃ@?F$@‰˜ðÙGN€B°§@M„<@‰˜ó O€B‡é@ ÷ @‰™vYAÀA¡6H?½}é@‰™xŸ¼éAW³?¡•š@‰™xŸ¼éAq·Ï?ÇSÖ@‰™zæ8΀Aká‡?ŠRÎ@‰™ÿB±u@C"ìŠ@¨Ò@‰š‰pv€BâÕI@oh'@‰š‰pv€Bßv%@’ˆ@‰šÏì[ÀB°Ã@P;@‰š‡Ë#ŸB›*€@5à @‰šŠâ €Byù @õ8@‰šŠâ €BƒLS@P›þ@‰šŒX^…€B¡R @@vÞ@‰›SØåC÷@‹Õ;@‰›šTÊ@Bì;µ@wä¸@‰›šTÊ@C"@¡Ú£@‰›àЯ€BÁev@]4‡@‰›| vÁB¿<Ý@TsK@‰žßÈÞ€BÚe9@€q@‰ŸlÝÌïBr/Õ@() @‰Ÿo$HÔ€BÁÍ@Hë«@‰Ÿo$HÔ€BÒso@a-•@‰ŸêfÑæB Ö@Îd@‰ŸêfÑæB¥½—@BùÛ@‰Ÿì­MË@BŸÙ@LFN@‰ rïDBu­Ñ@ 4ƒ@‰ rïDBŠ<ª@7Ž @‰ u5¿õB«}¯@VP@‰ u5¿õB±l–@N[:@‰ í.ÀB@°@‰ í.ÀB›tœ@G›t@‰ ïU B“³@?]Ì@‰ ïU BšïÉ@9j{@‰¡sPBW€BÏÕ¨@nÝ<@‰¡u—X€A­ÙG?\@‰¡u—X€Aµz3?¦9X@‰¡ûØ÷@B—A¾@;{ @‰¡þs‚€B¿Ú`@IK¾@‰¡þs‚€BÊÎÍ@X•@‰¦ÌѽíBƒÍò@0>«@‰¦Ù¶¨¾AÐÃ÷?ß„M@‰¦Ûýg¿BoR|@1ø@‰¦Ûýg¿BxÔ1@6‰œ@‰¦ÞC㤀CÜV@…È8@‰§^d€€AÓ'}?»:Å@‰§^d€€AÌW?ÞÔ@‰§`YàfBî>‹@uíÄ@‰§`YàfBýLÎ@†Ó@‰§ë)‘B—ݘ@"4+@‰§ë)‘B¥@3Ÿ@‰¨q ÆrBŲð@Kú]@‰¨q ÆrBÑY[@_Êæ@‰¨÷KÿÒ€BÙÒ@@]âï@‰¨÷KÿÒ€Bë4¤@w%¯@‰©},´³ÀBÂD @H\@‰©},´³ÀB‰Ã@P33@‰ªµiù€B݃@^¦a@‰ªµiù€BáŒs@j=«@‰ªrïDB‡À@6,s@‰ªyÂúÛÀBÎà´@_è6@‰ªþs‚€BBXì@{c@‰«eïhC4©@µçÕ@‰«ó*N€B¾¦@Vö@‰«9¦3ÀA­" @ :T@‰«Ž=Ü#€B¹°[@w@‰«„XÀC]@ŠBç@‰¬”°Q‹ÀBé°#@sà7@‰¬”°Q‹ÀBò~p@…½º@‰¬–÷Bͪ]@aΣ@‰¬–÷Bõu%@‡ê‰@‰­8õ€BÔ±@Zë@‰­8õ€Bγh@Ò@‰­‚·B±Ý÷@>ý*@‰­‚·B¾÷!@UJo@‰­¥Áxû€Bìp@e@‰­¥Áxû€Bõ!™@‘vj@‰­¨ôàÀBÖð°@`Ï_@‰­¨ôàÀBâ0@uÔ@‰®.Ië%€B"È @ i@‰®0ª&€CYÎ@€ïe@‰®0ª&€CÞ @ˆN)@‰®¶Ò]O@B’šÒ@B$1@‰®¹P€Bš#²@$+€@‰®¹P€BžÂØ@3rÒ@‰¯@ß‘ë@BµH@;ƒà@‰¯@ß‘ë@B´ 4@E§­@‰¯C& ЀB²Ë±@x“B@‰¯î1Š€BžQ8@'å‚@‰¯î1Š€B *j@4ö^@‰¯ðxIÀBŒ‰Æ@W·@‰°rŽEÈ@BòU@l/@‰°rŽEÈ@B‚}Û@FJ@‰°÷KÿÒ€B¤¤,@=^t@‰°÷KÿÒ€B§…,@Yud@‰°ù’{¸BŠqO@E„@‰°ù’{¸B‘’{@,G„@‰±}îô^ÀB›x@+ð¿@‰±}îô^ÀBšHl@:©—@‰±€5pDB¯oÒ@EL@‰±€5pDB»{‡@Z „@‰²wfˆ€A²çs?›&l@‰²wfˆ€A¼Lø?¼´@‰²½ânBñ@€h2@‰²½ânCÌË@’ Å@‰²΀CôŠ@Y.@‰²΀C ­È@¢Ë@‰²‘F—³ÀBðì@w£Ï@‰²‘F—³ÀCá@ˆ×@‰³ePÀBªÎ2@0º@‰³ePÀB®Êª@>]W@‰³¡ö}ÀB–?@ ‰z@‰³¡ö}ÀBš¡@.†@‰´-‡«z@BÊ÷¨@YüÂ@‰´/Îj{€Bz^˜@­¸@‰´/Îj{€B|ìê@Rƒ@‰µ"é<BɈí@P]@‰µ"é<Bàû‚@qm½@‰µ«°qBÜ.@™=@‰µ«°qBŸ“´@6µ @‰¶3úcþ€B”kà@ D@‰¶3úcþ€B¥%l@;s@‰¶6@ßäB5²@N¸Ã@‰¶¼!×áB‰¶Û@÷@‰¶¼!×áBž”3@;N@‰¶¾hSÆ@B©ú@Sn@‰·DªJ ÀBŸàE@-@‰·DªJ ÀB¯dç@j’@‰·FðÅðB—u‰@:ö¶@‰·FðÅðBº™@(ï1@‰·Í2¼4ÀBÔZð@\†‡@‰·Í2¼4ÀBð›â@“}@‰·Ïy8B:õ–@Þ@‰·Ïy8BBíÏ?ÿl@‰¸w=“BŸU@)ß@‰¸w=“B»®‹@`¶³@‰¸ya¹x@Bgý°@­}@‰¸úµ¹ª€B°p@8AW@‰¸úµ¹ª€BȬõ@kè@‰¸üü5B¹Oá@Tí$@‰¹ƒŸ*B£ @,0º@‰¹ƒŸ*B»ð@^Û@‰¹…åé@B©˜¡@H @‰º Æá@A¡¡7?…/ @‰º Æá@A·0‚?̤@‰º \ÿ€Bû·@!œ@‰º„XÀB›_ã@5’}@‰º’Ë B˜Á]@(½­@‰º’Ë Bœñ@.@‰»ÒhBĘ@Yâz@‰»ÆNM@B–ƒá@&øÂ@‰»ÆNM@B¢ü@4 @‰»¡40ÀB”Êv@#$@‰»¡40ÀB¬R@f<â@‰»£zýBÃÉa@cÁè@‰»£zýBÌzÃ@^¤{@‰¼/ *ЀB’O‡@&ÑÄ@‰¼1R¦µÀB–qV@-]W@‰¼1R¦µÀBšâ»@-øÏ@‰ÁIn@BÃí½@]}³@‰ÁˆÑδB»Ô@²-@‰Ã©ÀBª{+@zl<@‰Ä¶`ÀBɺè@d4 @‰ÅÂwwO€B§‹¤@hI¡@‰ÆK~Ö€B…Œ÷@(¥‡@‰Æ]Æc@Bè…5@‡¡q@‰Æ×Ñn<Bî!$@ƒ“@‰Ç`YàfBª(@PÞv@‰Çb \K@BÐÕE@l/@‰ÏW?­´ÀBÔø"@¥7*@‰ÏY†l¶B»¾‚@b¯@‰Ï[Ìè›@BÕÄ@_Š@‰Ð^d€€BŒêv@‰”@‰Ð`YàfBàŸø@qF@‰ÐåÙ–ÿ€B§Ç@/Xó@‰Ðè V€B¾áq@R²S@‰ÑnbLE@Bê@)g®@‰Ñp¨È*€BÐåb@{9T@‰Ñp¨È*€BÚo©@ga@‰Ñã“BÜù=@jpC@‰Ñã“Bí!@\ä@‰ÓePÀB¯W¯@8ô@‰Ó«ËëB³Æ¸@Dœ @‰Ó¤ž;ÀBÀD÷@V)A@‰Ó¦ä¶îB¸„y@JÅ @‰Ó¦ä¶îBõ4@XR@‰Ó©+2Ó€B­_X@j @‰Ô38$S€B¬øN@JÇe@‰Ô5~ 8ÀBµŽ@Bß×@‰Ô5~ 8ÀBÉÈá@f–@‰Õ®zjIB¼!y@DÅ@‰Õ®zjIBÑù‡@w¬¸@‰Õ°Àæ.€BÄ#"@aŸÃ@‰ÖÁÒ žB¿†n@‰Øb \K@BÙ)´@~gè@‰ØdæØ0€B¾)@[À©@‰Øíov€BÀÜf@T‰L@‰Ú ¬^¸Bºu¿@LéÍ@‰ÚòÚ@B½”š@M’`@‰ÚòÚ@B¼õw@N±³@‰Úë)‘B·á[@Cö²@‰Úë)‘BÓ°•@‚P7@‰Úíov€B·‹@N0ˆ@‰Úíov€BÅêŒ@X:m@‰ÛžíÂ/€Bº®½@?æ2@‰ÛžíÂ/€BÎO@aõº@‰Û¡40ÀBË»Ü@y¼º@‰Ü9¦3ÀB°îV@VQ@‰Ü €"Bºd<@D~Ø@‰Ü €"B¿7\@Mz}@‰Þ@$@B³#@BUÒ@‰Þ@$@B·´6@Ií5@‰ÞBcÎ%€BÁ#2@WK@‰ÞÉhB¿¿­@bÔ„@‰ÞÉhBÂ%@Z¾×@‰ÞË®ú€Bºož@DoÛ@‰ÞË®ú€BÎ¥£@’æª@‰à(/B®›À@>[S@‰à(/B²SQ@Eß¹@‰ànîB¿L$@QDV@‰ànîBºüj@Z{ @‰ávº?K@BËîé@j ³@‰áy»0€B¹c@~Ò|@‰á{G7B¿–9@Nyæ@‰á}²û@BË]r@ƒ'@‰áþá³-€BÎ# @jüƒ@‰â(/BÉ—×@†Õ*@‰ânîB·C¥@GN”@‰âµiù€BÈÔ¨@„Ò·@‰âˆ,e€Bʽ@gÞ"@‰âŠràèB²Ÿ@x@‰âŒ¹ŸéBÃn[@Qá3@‰â΀BÁqÞ@VA@‰ã'L•BËA~@hêÍ@‰ãn –B¶òë@|ò=@‰ã´‡{€B¨d¯@:3Î@‰ãû`ÀBÂ$!@~Oã@‰ã rA…ÀB”K@$0­@‰ã¢¸½kBž)ê@H{@‰ã¢¸½kB©- @Bý@‰åÌp¿¥€B°—ú@J’Ñ@‰åη;‹B§;‰@6õ„@‰åη;‹B±¯ @Bˆ"@‰ægïÖÝB±' @:¼@‰ægïÖÝBÇø,@m€í@‰æj6RÂB¸m‚@W£@‰æñü…AB‘—û@ô@‰æñü…ABªÎe@R™ö@‰æôC&€B·,6@UfÏ@‰øhPÕ$€BÈÃ@h*@‰øj—Q ÀB§«ì@.Üj@‰øj—Q ÀB¿!@cš=@‰øê‚€BŸoù@=Ü”@‰øìLOƒ€BªGy@9N]@‰øìLOƒ€B·=ý@L(,@‰ù‚íâB¢¢æ@5_J@‰ù†¨(È€BÀIÊ@~àë@‰úKm€B® @@aMr@‰ú‘èëB³ü›@G‹Ê@‰ú #Ñ€BÄÌd@a 9@‰ú‘F—³ÀB®ýA@@±æ@‰ú•Ó~€BÃCø@`t—@‰ú˜ cÀBÇÒâ@ŒÅ@‰ý$YÏŸB»ÇÆ@‰§@‰ý°_ççBÀJY@MsÅ@‰ý²¦cÌ@BÆ Ž@t! @‰ý´í"Í€B¹wç@`-b@‰þKÞÿ@B¹[ê@|]§@‰þN%{€BÜoH@žrX@‰þÔg´dBÁ^î@p…@‰ÿ\-æãB¿œ@†ôq@‰ÿ^tbÈB¹åè@‚¿]@ŠpGÉãBÀq~@}ma@ŠrŽEÈ@BÅzÓ@“ö›@ŠtÔÁ­€B¥V‘@T‚à@Šùóyÿ€B¸Iµ@ez1@ŠE͇ý€B¿%Z@Xœ®@ŠHâÀB¢A@7yî@ŠHâÀB¡…¶@j“¸@ŠJZÈB§ú¼@F¨/@ŠQ.6”Bœøé@F@ŠStõ•B¦…û@2Œ@ŠStõ•B©+ÿ@;{@Š }îô^ÀBª@¸@8‹~@Š ‚|/E@BµH÷@O—@Š ¸·ÚíB­ì-@;.©@Š ¸·ÚíB¯3~@Cm;@Š ºþVÒ€B¨ï½@F‹r@ŠkYµBÁE§@sÞ@Šm  šBÀI@`€Z@Šo戀B¢°U@.ï@ŠÊ*CÀBŸ«e@)èW@ŠÊ*CÀB­¯¤@PÉ@ŠÌp¿¥€Bš@LcI@ŠÌp¿¥€B¤÷Ÿ@H÷8@Š+¢-Ü€Bi°h@ •l@Š-èìÝÀBrè{@-qÉ@Š-èìÝÀBqOÖ@&Ť@Š0/hÃBŒÝ@>”ò@ŠáLŸ4ÀB“·z@M~¿@Šã“B“A2@:ÌG@Š夣B€sZ@±h@ŠÈÅ@Š&:ÎÊ€B³$µ@F5@Š&:ÎÊ€B¶Ø¬@Zpø@Š&=–¯ÀB´¸õ@F®`@Š&=–¯ÀB·÷¢@M (@Š&nÃJŒÀB¾M,@Q…^@Š&q ÆrB°‹@Gý±@Š&sPBW€B©™þ@IÜU@Š&Ç‚†w€B­_¨@fMj@Š&ÉÉ\ÀB«!¢@7<Ú@Š&Ì~BB°›@F^ @Š&ðxIÀB©Å&@TkH@Š&ò¾ÄìB´qo@CH@Š&õ@Ñ€B¼"@Sæ£@Š-&´7Ê€Byq@(lÓ@Š-&´7Ê€B©ëá@<‹@Š.o戀B¾}@¿@Š.È¥ÄjBÃäq@NÌÞ@Š.È¥ÄjBÊ @^Vü@Š.Êì@O€BºäP@X3ì@Š.Êì@O€BÀÂ$@euÚ@Š/L¡>É@B»J@[Ã@Š/L¡>É@BŶ@z>p@Š/N纮€B±×@=J©@Š/N纮€BµÖz@FôE@Š0ë)‘B¥f'@,n@Š0ë)‘B Ì@0uê@Š1r-G€€B®D@4f¾@Š1r-G€€B­Ÿ¢@;ò@Š1ó O€B²é}@;É@Š1ó O€B«ß@:¶@Š4´*ã"€BÁäÝ@ŽÒÈ@Š4¶q_€B±e @pªø@Š4¸·ÚíBŸ!Â@ÊÜù@Š5µ¯bx€B¯žö@5£@Š5µ¯bx€B¶C¼@Cþ@Š6q ÆrBÀá@uG@Š6rº ö€BÉž @™Íu@Š6ÀMÑdBºr+@[•@Š6”MI@B¸ <@Rê@Š6ÄÚÉ.€Bζæ@wpÚ@Š6Ç!EBÅ=í@sï@Š7KBµ–(@^MË@Š7Mc~t€BÜ~Õ@zÐ@Š7O©úY€BÚ$ˆ@‹ì@Š7Ò‚6Æ@BÄ:@t}·@Š7ÔȲ«€B¼UÚ@M·»@Š7×.‘BÜZ´@Š@Š7ÙUªv@BÛÌ@y{@Š8ëë @B±³î@7Ac@Š8ëë @B³ö@?A5@Š9s±ƒ»B±öC@9ne@Š9s±ƒ»B³o1@@Ÿ@Š:‰O¢õ@BªDû@;ýv@Š:‹–Ú€B¢±ù@>åÚ@Š:‹–Ú€B¥F@;â—@Š<(8t€BÂŽ$@jõ@Š<*3ÀBÄvŽ@OxÍ@Š<*3ÀBÒŽx@p|@Š<,Å®ëB¼ñ@`ò@Š=à€þ€B´Ê@¤v@ŠD™ÿ‰€B¿\g@]á]@ŠDœFæÀBÂð@@T”Ñ@ŠDœFæÀBÅó@aÁ¹@ŠDÍ“ý˜Bº @T¸E@ŠDÍ“ý˜BÇ>:@oüß@ŠEJZÈB¬– @>ñ@ŠEJZÈB·ú@XB)@ŠEL¡>É@B±Ž€@De@ŠEL¡>É@Bºng@Y~,@ŠEêÇÐ-€BÌÖ$@€¹¦@ŠEí.ÀBÚq@†&¯@ŠEïU B©5~@Jñs@ŠFC‡ B*Þ@+aA@ŠFC‡ B¥ÎÄ@?5ß@ŠFE͇ý€B¦“h@GQ@ŠFE͇ý€B®²@SýP@ŠG_øâ@Bœ/È@,ï…@ŠGd…ÙéB§—É@IPa@ŠGfÌUÎ@B¯û@ް˜@ŠHðÙGN€B¥^ë@1%1@ŠHðÙGN€B«™0@CÉy@ŠHó O€B¤)š@Gí¦@ŠHó O€B° ¢@V•6@ŠLÇ‚†w€B¬†À@K¬ó@ŠLËòëd@B¥_m@V&@ŠM­W,V€BžCk@'Þ‹@ŠM­W,V€B»zw@†—@ŠM¯ëWÀB¬>½@C¾#@ŠNBcÎ%€B£K@S Ý@ŠNDªJ ÀB¥2@2À@ŠNDªJ ÀB±Ê™@}=6@ŠNFðÅðBµfU@O‡”@ŠN¾hSÆ@B‰Û§@1]@ŠNÀ®Ï«€B [@%š¿@ŠNønú©€BŸ³T@CÝß@ŠNúµ¹ª€B ˆ»@‚ù‰@ŠNüü5BŠì@%‡@ŠNÿB±u@B†V‚@F:¨@ŠO×Ñn<B¢ÿ@Qî@ŠOÚê!€B ïf@+¦@ŠOÚê!€Bš]‡@-;Ú@ŠPfkW†ÀBšXÆ@"•y@ŠPfkW†ÀB•Ô<@&<¸@ŠS΀B­fa@qÁÆ@ŠS‘F—³ÀB¤1g@D¶ò@ŠS“™B›¨@/_J@ŠS•Ó~€B—Tñ@1@ŠS˜ cÀB¨Ÿ@Rüµ@ŠT=–¯ÀB¶¿€@p @ŠTÌp¿¥€Bµ½ô@axS@ŠTΚe‘@B›¥„@0Pø@ŠUVÞ¯mB«Â@<_@ŠUVÞ¯mB«Ü˜@FÁ@ŠWKB¶:ƒ@A]@ŠWMc~t€BÃ'Ó@sƒŒ@ŠWO©úY€B’ç_@‡ï@Š[n –B§¹O@M6@Š[ŠràèBŸÄ@\‰ã@Š[Œ¹ŸéBšú@=\F@Š\Ê„=B¨_s@<Ô‰@Š]AS€B¬œ)@>gì@Š^ºXŠÀB•À@ ªü@Š^¼ãÔpB¥Œ@?¢×@Š^¿*“q@B¿ðÃ@ˆ½@Š_JZÈBHŠ@Vz@Š_L¡>É@B›Ÿ @7ÑW@Š_N纮€B¹ @†R@Š_Ü¿§jBœO1@'hŒ@Š_ß#O€B ]3@8Îî@Š`f Y?B‰ÛW@9{)@Š`lÝÌïB#-@3e@Š`o$HÔ€B•Û@k—á@ŠdÃVŒô€Bv¹¥@|J@ŠdÅÙ€Bw­b@_žV@ŠdÇã„¿BwÓ”@tF$@ŠeJZÈB}®q@!{@ŠeL¡>É@B~Ó¶@$ô(@Šeܺït€Bléx@ U@Šfiѳ€B…³´@`Q@ŠfkYµBXßS@^%@ŠgK~Ö€B†Y@k±@ŠgMÄ|¼Bv„@3ˆ"@ŠgMÄ|¼B„F@g>G@ŠgP ø¡@B ‡@8Rç@Šj‡ 'B„„@( @Šj‰O¢õ@B‡¦›@c€@Šj‹–Ú€B‰vš@%E¢@Šk‰pv€B~(Û@7(¢@Šl¦"wCB¼• @ˆa¿@Šl¨hó(€B¯cŸ@KSÊ@Šlª¯²)€Bž]Å@k‡@Šm0/hÃB²{E@ƒÑl@Šm2u䨀B¢ r@@eª@Šm4¼£©€B¶¾¡@€&¢@Šm¸·ÚíB²t@ƒOÿ@ŠmºþVÒ€B¦=g@C^S@Šm½EÓ€B³W1@|¢¥@ŠnA@2ÀB©¢M@~̧@ŠnC‡ B¥÷¥@B–@ŠnE͇ý€B´{ã@zqÒ@ŠnÅ;ÇvB±£@S~V@ŠnÇ‚†w€B¯ 3@V²@ŠoÍ2¼4ÀB¤Ð¥@MZ@ŠoÏy8B©û~@MÕ0@Šs«ËëBñ¾@9Üý@ŠsòGЀB©“L@<6r@ŠsòGЀB¥îù@9 ³@Šs¨Ê4ŒB¨qï@Bßì@Šs«°qB®þÚ@@C@Šs«°qB©»Q@;}·@Št¿‹‘¹B˜!k@3ãm@ŠtÁÒ žB›ÈH@.Þ@ŠtÁÒ žB›w™@-Þ+@ŠwÞ¥%B´ëj@V›é@Šwàë íB¶¨@C‡ƒ@Šwàë íBʺ}@c©Ê@Šwã2Ò€BÓµ@„þ@Š}ç¿B¥Ž^@/åG@Š}ç¿Bµ!@lø@Š}ê‚€B¹¼#@RòV@Š~ÅÙ€B£'²@XÀ{@Š~Çã„¿B¥7Å@F|g@ŠÐ;ºáB’ôË@9ÅÚ@ŠÒ‚6Æ@B‘A-@:¶@Šá­|€BŠ{|@3¥ @ŠãôaÀBãH@;47@ŠƒÏ Ý€B“£ñ@%\–@ŠƒÏ Ý€BšM@/ú'@ŠƒÈßBx@,Èó@ŠƒÈßB !@^­@Šƒ¢W|€B™É/@*Äü@Šƒ¢W|€BŸ2‰@3Yó@Šƒ¤ž;ÀB‹y!@'§ç@Šƒ¤ž;ÀB=3@\ÙI@Š…ëŠØ€B±]"@S¸c@Š…íЋ¾B‘މ@É@ІÇ!EBµÝG@X™ª@ІÉhB¥!@N ò@ЇÓD3U€B•v@3ÂÆ@Š‡ÕŠ¯:ÀB¥ËR@z.'@ЇâÑ‹B‘©F@4:@ŠˆäUZÅB†5/@ Ô0@ЉúTxGBÌ’@/‰P@Š‹¶`ÀBsµØ@fb@ŠŒ=Ö“?B`·@nÆ@ŠŒ@$@BT‡@„¶@ŠŒ@$@B`fc@^‚ˆ@ŠŒBcÎ%€Bo)ç@55@Šé¤’;BY†E@K{@Šëë @Bbõð@ ±ò@Šëë @Boô@(ã"@Šî1Š€BwЀ@þ @Š“´‹ájBX Ó@Šr@Š“¶Ò]O@BZÆ@)«Ò@Š“¶Ò]O@Bc¹@!€BkO@7z@Š•d$Û¡€Bb›d@  @Š•fkW†ÀBzxÞ@k{@Š•ê‚€BdÜã@ i¶@Š•ìLOƒ€BgÜë@©~@Š•î’ËiBdð}@ ÑB@Š–|j¸$€B©¡â@WçŽ@Š–~±4 B½…@;@Š–~±4 B¥(q@OŽ@Š–€÷¯ïB‘†@Ka¢@Š›«qñÔ€B?û«?ãrç@Š›«qñÔ€BM»Æ@e@Š›­¸mºBPí@î@Š^ÕaÀBWæ‡?úà@Š^ÕaÀBg½@Ñš@Šíov€BCäÒ?ôÁ3@Šíov€B[¶@ ­@Šï¶ [€BP¤Ë@ uŠ@Šž}îô^ÀB€Â°@  @Šž}îô^ÀBŒ’(@&¯@ŠŸT(–B\À@¦@ŠŸT(–Bl³x@eÃ@ŠŸšç—@BR÷n?ÿ¸å@ŠŸšç—@Bt.b@5:É@ŠŸÜšÀB_XZ@&%ê@ŠŸÜšÀBex¼@Æv@ŠŸ#YÁB`è¤?þãç@ŠŸ#YÁBiš!@#w>@Ф@ß‘ë@Bžš/@J%–@Š¦Ç‚†w€B‡~@!ƒñ@Š¦Ç‚†w€B…S­@Tx!@ЦÉÉ\ÀBˆ@8£D@Ч“™BšÅS@Nö<@Ч•Ó~€Bs›@Eçd@Ч˜ cÀBDð@$}@Ѝ´‡{€Bª¾¤@û @Ѝû`ÀB¢ÕQ@?Z @Ѝ AÂbB‘o@š¢@Ѝ¤ž;ÀB§Š?@Wy @Ѝ¦ä¶îB§@N†Û@Ѝ©+2Ó€B“lU@! @ŠªDªJ ÀB°­û@PŽã@ŠªFðÅðB›Ñ@CM<@ŠªFðÅðB¬[Ç@b³@ŠªI7„ñ@Bžwø@-6@Š­ñ›†ù€Bœf¡@LÀ@Š­óâÞÀBŠ@†j@Š­óâÞÀBœ)"@?÷@Š­ö(~ÄBŽX@Gœ»@Š®|j¸$€Bˆ¶l@%âø@НeïhBM„ü?ùu2@Н¬kM@BXkA@uâ@Н¬kM@B_FR@™@Нó*N€Bn.œ@<» @Нˆî¤­€BKAC?÷@б+¢-Ü€Bhl@ç@б-èìÝÀBPL?øè@г¾U~€B›a×@'Œ@г¾U~€B˜õ3@+û@Š´E͇ý€Bùc@0-Ü@Š´HâÀB˜Ù@8FÌ@Š´HâÀB¤T@C@Š´JZÈB©-‹@P§@еc®ÀB“`@ ÒV@еc®ÀBû¦@%\ö@еeH”B—ÈÔ@Dšt@еðÙGN€B ô(@;—@еðÙGN€B¢qå@=õ¾@еó O€B’ ˆ@%€é@еó O€Bœè@QíW@Š·µiù€B’øú@Y9@Š·ûåÞÀBžxÄ@Jô@Š·ûåÞÀB±sØ@rØb@Š· BaÄB8@0à@Š·‹÷`>B¬Jb@6kH@Š·‹÷`>B¦µ@7&Ð@Š·Ž=Ü#€B¢^@Mk@ЏÒhB¡aÂ@,C@ЏÒhBŸ5ƒ@0K4@ЏÆNM@B–!Ç@Aä@ЏšÁȬ€Bš¹r@'Ö @Џ‡­ÀB¬i¹@Aðg@ЏŸO“B¦ß@\Q@Š»¡ö}ÀBÃVX@¨ x@мã2Ò€B“»õ@L#@мã2Ò€Bž0@1@ŠÂCè _ÀBŒõB@)Ó1@ŠÂF.†EB‘¼@é£@ŠÂÁqV€B§!ü@>Ÿä@ŠÃ¼!×áB§j@D»Ç@ŠÃ¾hSÆ@B‡o`@ 9@ŠÃ¾hSÆ@B¥@O è@ŠË[ ¨ðBž@6âÒ@ŠÍh±ÓlB‘Ó1@,]B@ŠÍh±ÓlB¡VM@;t%@ŠÍjøOQ€B•?Ô@(\Ù@ŠÍjøOQ€B ^@\ @ŠÍïU B¤ùI@@”â@ŠÍñ›†ù€B£oó@<N@ŠÍóâÞÀB£iE@A¤@ŠÎqkÕ€B´þÀ@]@ŠÎs±ƒ»B¥¿œ@OjÓ@ŠÎù’{¸B *]@]X@ŠÎûØ÷@B—2ø@R N@ŠÏ‚íâB“«Ò@}_@ŠÏ„aiÇB”ù¨@?îö@ŠÐ £` ÀB›ª‹@—@ŠÐ éÛñBæÙ@;Û¾@ŠÐ”OSDBŒ©d@8O¾@ŠÐ–•Ï)€BœíÄ@ˆËÞ@ŠÑû`ÀB‚J@+?O@ŠÑ¦ƒuŠ€B“Ô@)¶@ŠÓa}X€B‚°@!M'@ŠÓ¿*“q@B{“c@H\«@ŠÓÁqV€Buþ‡@$P@ŠÓÁqV€BSã@e g@ŠÓ÷‹<Bn”#@p@ŠÓÞ¥%B“éG@nKf@ŠÓàë íBŠ+€@'Òž@ŠÓã2Ò€B…ô@z@ŠÔHÖCŽBo[œ@,s@ŠÔKB…m§@& j@ŠÔMc~t€B†¯@=@ŠÕa BTïq@*Ê:@ŠÕcb›ö@BR @nÖ@ŠÕe©Û€BRÔ @ïþ@ŠÕ餒;BLó@r@ŠÕëë @BNŠE?ý.@ŠÕî1Š€BCh@&D(@ŠÖm  šBA%Œ@+M×@ŠÖr-G€€BZ¹ê@(h˜@ŠÖtsÃfBx£@V@ŠÖö(~ÄBW–‹@$ñ²@ŠÖúµ¹ª€BVZÔ@6@ŠÖüü5BGÒš@0¸@Š×~±4 BEH^@.Éq@Š×ƒ>+Ô€BrµÛ@5"÷@Š×…„§¹ÀBJÊK@Qç@ŠØ9¦3ÀBKî@3/M@ŠØ Æá@BbÁ§@/$Õ@ŠØ \ÿ€B]#@I*é@ŠØÂ]€BZEx@,{ž@ŠØ”OSDBhO@ApH@ŠØ–•Ï)€BWw‹@1ñ·@ŠÙvÇ&€B_ ´@aˆ˜@ŠÙ½C ÀBbaŽ@)Χ@ŠÚÂõK‘B?Êã@÷@ŠÚÂõK‘B+ñ|?哼@ŠÛK~Ö€B@­U?öRÎ@ŠÛK~Ö€BGÙ"?üÖÃ@ŠÛ¿*“q@BAº@?ï8Þ@ŠÛÁqV€B?v@ Lì@ŠÛÁqV€B:-ß?ñ÷@ŠÜÏÚy}€B\«@ žþ@ŠÜÒ õcBJ)`?ÿ®O@ŠÜÔg´dBQ–­@›@ŠÝh±ÓlBS‹û@ ;Ž@ŠÝjøOQ€BOA§?ÿH,@ŠÝjøOQ€B_Y@¹@ŠÝm?R€BQ@@)U\@ŠÝã“B2>?Ò ™@ŠÝã“BQë@Ú{@ŠÝåÙ–ÿ€B= Þ@Z§@ŠÞlÐ`B\öH?÷X@ŠÞlÐ`Bx§9@)€|@ŠÞnbLE@Bj^w@Ûn@ŠÞô¤B‰ÀBKhÅ?è @ŠÞô¤B‰ÀBvW.@)¯â@ŠÞöê¾oBd ‘@iË@Šß},´³ÀBOÏa?ì-ù@Šß},´³ÀBp@'@Šßs0™Bc£ @CÈ@Šà \ÿ€B\@%ü@ŠàÂ]€Be-h@2»€@Šà–•Ï)€B‚/—@:sK@Šá8õ€Bwß@‚Ue@Šá‚·B•@·@S`@Šâ8è,€BL †?ìý]@Šâ;/BRב@½f@ŠãIù€€BKà}?ÿç!@ŠãL?ýfBBüu?ýÒ¦@ŠãL?ýfB?@r?ø…@ ê@Šè KT€BXU@nØ•@Šè‘™:BBØ@$¿±@Šè•Ó~€BSŒù@?»Ë@Šè˜ cÀBC¼@;£@Šé$m»åB+'e@R“@ŠêÂ3O€Bu£Ÿ@ É@ŠêÄyÊçBvî@+¤@ŠêÄyÊçBvó@æK@ŠëJ»Á+€B\M!@«@ŠëM=Bunp@)Î}@ŠëM=Bu”ÿ@ç¸@Šëê‚€B‰´R@\åO@ŠëìLOƒ€B‰5@!ÝÎ@ŠìÑ¿÷@B<«?ì@ê@ŠìÔs€BKº@ Ö„@ŠìÔs€BOÄ@@Ô¢@ŠíZHiEB0C?ÛX—@Ší\Žå*€B@í@-o@Ší\Žå*€B;·Þ?óåC@ŠíâÑ‹B=l@Ó[@Šíåšp@BAT?ûaö@Šíç^U€BH¬6@µ@Ší餒;BQj%@(ŠÒ@ŠîkºŽü€ByÆù@ð@ŠînMý€BPØ ?î±-@ŠînMý€Bdñû@'f@Šîö(~ÄBN›Æ@Y@Šîønú©€Bbÿ4@>A%@ŠîÿB±u@BI w@)Í«@Šð9¦3ÀB:vÊ@ag@Šð €"B0LX@+Ê£@ŠðSØåB= @ ñ|@ŠðÂ]€B$E@ì%@Šð˜ÜKB9:º@½˜@Šñ(ú³¯€BC[@3˜@Šñ+A/•B!õo?Ç2@Šñ+A/•B::À@‘›@Šò=–¯ÀB\ @ ±1@ŠòÂõK‘B|Ì¥@ Hí@ŠòÅ;ÇvB‰¦“@#ߨ@ŠóK~Ö€B„:®@¹Z@ŠóMÄ|¼Bˆûr@"¾D@ŠôIù€€BŽ’œ@Ý/@ŠôL?ýfBRô@7@ŠôL?ýfB {@3÷U@ŠôÒã5B @Ùb@ŠôÕ)°ó@B—*™@0Ø@Šõ[k§7ÀB”1í@"bJ@Šõ[k§7ÀB””/@%F¦@Šõ]²f9BÀ@7ŸV@ŠõãôaÀB–(í@ @Šõæ:ØcB¡öŠ@9r—@ŠöwÝ}>B¸w%@ na@Šùû`ÀB‘ @V@Šù AÂbB‹½@(g@Šù"ˆ>G@B‰Kb@¡@Šù$κ,€B|ö@VÒ@Šù'6BŸ6>@-;O@Šù)[±÷@B…å¿@²Ý@Šù+¢-Ü€B’®¤@"då@Šù-èìÝÀB²Õ@,ú@Šù0/hÃB™ë[@*b@Šù2u䨀BŽmL@£ô@Šù4¼£©€B‹Po@lð@Šù7B¬9@;˜¿@Šù?[•B’ר@%|J@ŠùA¡Žz€BŠ©@=q@ŠùCè _ÀBŒUº@ã@ŠûL¡>É@B‘ñi@&:÷@ŠûL¡>É@B–‰@'E@ŠûN纮€Bö@'}þ@Šûì­MË@BÇÜ@*¨—@ŠüI7„ñ@B„ E@(‹ @ŠüI7„ñ@B‰qí@,™·@ŠüK~Ö€B„ÝÊ@ìî@ŠüK~Ö€B‚Ç!@ ’£@ŠüÏ9Ò€Bˆr“@*E€@ŠüÑ^µ·ÀB|©µ@#B@ŠüÑ^µ·ÀB‡`!@?²@ŠüÓ¥t¹BTd@-,(@ŠýW ï@B„ ‡@% „@ŠýYçjý€Bƒ™J@ƒM@ŠýYçjý€Bˆa@?“d@Šý\-æãBŒD@43Y@ŠýâoÝ'€B`i@úœ@ŠýâoÝ'€BnÞi@ *Ü@Šýä¶œ(€Bl»Á@ ›@‹0šò@BBÕÙ?äò@‹w×€BETä?øÀ”@‹΀BMN?ò'k@‹ª’Ü0Bw!Ø@H4@‹Ñ^µ·ÀBn¥é@+†@‹Ó¥t¹BnPÞ@Ìâ@‹j—Q ÀBpð @xÿ@‹ó O€Btkq@ R@‹ó O€BmY£@¦ƒ@‹{¨xy€Bjt[@¬K@‹{¨xy€Bd\­@ëê@‹ñü…AB]ñ'@—ú@‹ôC&€BNSf?ñKñ@‹z…:†ÀBiYŒ@ ;\@‹|˶lBaÎÜ@?@‹™žŠºB\w@)<Ú@‹›åŸ@BSKÅ@5Åi@‹ ½C ÀBou@/ì@‹ !¾ñB`Õ'@8ó¶@‹ ª¯²)€Bמ@;X.@‹ Ïy8B$¬@9:@‹ =Ö“?Btýæ@,¯Ä@‹ =Ö“?B‡*Ï@·J@‹ @$@Bv^’@ HÜ@‹ ÄÚÉ.€B“sˆ@-H|@‹ Ç!EB}ÈT@Ò@‹ Ç!EB…±ø@J"@‹ ÉhB~Pœ@<’Ÿ@‹ N†¼gB_Ý@ÿ@‹ N†¼gB“.4@%·®@‹ PÍ8L€B…fB@-%J@‹ vº?K@B„ñe@0K'@‹ vº?K@BŠ ì@4óE@‹ y»0€B{:D@ ËÕ@‹ y»0€Bál@¥±@‹ äUZÅBq0…@Ç—@‹ äUZÅBi“•@ wÕ@‹ á­|€B‹JÏ@/5Ê@‹ ãôaÀBFó?ăw@‹ ãôaÀBjF±@¦Ò@‹j6RÂBž?›@L”Š@‹l|Χ€Bˆ7@„@‹l|Χ€B˜è·@4†º@‹ò¾ÄìBÌÝÊ@v{È@‹õ@Ñ€B¡žé@(Ƚ@‹õ@Ñ€B³•@M”Ù@‹ûåÞÀB´S@9Þ @‹ûåÞÀB±ï?@Aîx@‹žíÂ/€B°~I@Q l@‹¡40ÀB§~M@; ú@‹£zýBœ~U@.¤Â@‹¨ôàÀB’@PßD@‹À®Ï«€BÑ2Õ@„´ô@‹UZs3B©(@Yn/@‹2×& BÄ¿å@e˜N@‹MÄ|¼B»jŒ@WJM@‹P ø¡@B´ #@=8@‹P ø¡@B¿ ©@cRH@‹wÝ}>B±-7@F'¯@‹wÝ}>B³—R@J‡ð@‹z#ù#@B¶aŸ@BÕé@‹z#ù#@Bºõ&@Wæ\@‹âÑ‹BÉé~@NI@‹âÑ‹BÀ0Ò@L¬â@‹kYµB¬ I@3µž@‹kYµB§[Þ@6(¿@‹¬3îdBÚÿÀ@„Û4@‹´×,€BÏw[@X¬`@‹´×,€BÒð@\q2@‹ûSBÔ½1@oý/@‹'6BÒ ô@s©¹@‹)[±÷@BÉùN@YA«@‹+¢-Ü€Bž®@-›$@‹-èìÝÀB¬t@>‚ñ@‹0/hÃBÙ¨¨@z¨@‹®Û«¬€BçªB@{p"@‹±"'’B¢’S@4ö@‹q ÆrC ô—@¥»I@‹õ@Ñ€C&A·@©í@‹÷KÿÒ€BØæ @^Dk@‹}²û@C"õS@¦@‹Ôqü€C!ëh@ *Ì@‹ (8t€CDô@¯&ß@‹ *3ÀC Y¹@’R[@‹ ,Å®ëCøV@Š0@‹ / *ЀB½¶;@Iái@‹ 1R¦µÀBå¤"@pÐå@‹ 3™"›Bï3Ü@…× @‹ 5ßž€€C ¼Î@©qú@‹!-èìÝÀCJµ@×þ@‹!0/hÃBå@p¿<@‹!2u䨀Cú@ˆW@‹!4¼£©€Bîn@xT@‹!7BÛM@r¢‡@‹!9I›t@CEš@˜>@‹#N%{€Bë6@€Ž@‹#N%{€Bì¾´@޲@‹#¼ãÔpC 0_@Š69@‹#¼ãÔpC `@Š¥[@‹$El‰¶Cço@†/ @‹$El‰¶Bùä@€Š½@‹$âÑ‹C;û@“¥a@‹%m?R€Bسy@m2n@‹%o…Š8B¨È¾@23r@‹%o…Š8BÇ•6@€wÑ@‹%õÇ€|€BØ:Ž@l£Ó@‹%ø üaÀB—Ÿè@"] @‹%ø üaÀB­ é@h´@‹'{¨xy€C*R`@À´ß@‹'}îô^ÀBñÿ@xÑ_@‹'}îô^ÀCwQ@Œ @‹'€5pDBçz¯@„yb@‹( ác|€C.@°È@‹*Ìp¿¥€C!?Ÿ@ª¨Æ@‹*η;‹C ì@–!˜@‹*Ðý·pCFWE@ê«å@‹*ÓD3U€C3-Ù@»€@‹+*à1M€C À"@šÎ¸@‹+-&­2ÀC$1Ú@§ ‹@‹+/m)C7¡™@Ã9e@‹+»_˜5ÀC9΢@¶‡Â@‹+½¦C0u(@½fs@‹,Cè _ÀC£Õ@— @‹,Cè _ÀC•@•ê@‹,F.†EC"RÀ@°1­@‹/9¦3ÀCDO#@Í \@‹/ €"C$Çæ@¢Ó$@‹/ €"C9°@¿ùµ@‹/ Æá@C6Þ@È?@@‹3R²µêC[ðJ@Ý·A@‹3R²µêC^;c@î`¯@‹6eïhCF@˜Ü@‹80ꣀCC³Ã@Ð~.@‹8wfˆ€Có9@¤¶=@‹9"ˆ>G@BÖ×@jà~@‹9)[±÷@Ca.@ð[@‹9+¢-Ü€C[”@úË@‹;2u䨀C4aÞ@é]@‹;2u䨀C:âŸ@ƽy@‹;4¼£©€C"³@¡ @‹;4¼£©€C%X¨@«T&@‹;SÕóÜÀC"„ï@°S;@‹;ºþVÒ€C/b@½í|@‹;ºþVÒ€C7xP@ÃT5@‹;½EÓ€CG’w@ÂÊÃ@‹;½EÓ€CB=•@ÅœE@‹=úµ¹ª€CuŠ@ž|i@‹=üü5CMº@Ë â@‹? #Ñ€C\±¥@é]‡@‹? eŸ¶ÀC‚#@‘œë@‹@)¼óZÀC)¯Ï@¬Z@‹@,o@Bþ¼±@’‚¬@‹A<³UL@CFµ@Ä@‹BI7„ñ@AêÙÒ?²Þ@‹BK~Ö€Aõg£?¿†ô@‹BMÄ|¼B¥X@Ïú@‹D}²û@C1õ)@­;ä@‹F€÷¯ïBÆùÅ@OÛè@‹GSØåC4 p@¿}€@‹GàЯ€Bí[@M<@‹G'L•BÖšË@ˆÖñ@‹G€5pDBÅ2˜@IXX@‹G€5pDBÅæö@Oå@‹H ác|€Aé.$?²Çó@‹H ác|€Aöæ¡?Õè›@‹H±äg=BtÁ?°œÜ@‹H±äg=AøPà?àw@‹JÈ¥ÄjBÔX@nžR@‹JÈ¥ÄjBÛpÑ@й(@‹JÊì@O€Bñ-Œ@x(á@‹JÊì@O€BñÊr@~Wi@‹K[k§7ÀBßI@kÃz@‹K[k§7ÀBå@…^r@‹K]²f9BSÔµ@&ö@‹K]²f9BS’€@ Wu@‹LÕ)°ó@BÂxº@[ÛI@‹Mo$HÔ€BÃ+y@Ys´@‹MqkÕ€B6§@—»@‹M÷¬þBþù@‡æÇ@‹Mùóyÿ€CU@Žtï@‹N#YÁCéÕ@¯]×@‹N’iÕ¦€CbT@«Ÿ@‹N–÷BûXƒ@†‘Þ@‹N™=Œr@Cùó@£>@‹Owfˆ€Bûþÿ@‚Ô@‹O½ânB÷]@˜O:@‹Oª¯²)€BW?è$@‹O¬ö.B~<æ@/ºÃ@‹Pn –BX†?æóE@‹P´‡{€B9pö?ï³§@‹Pû`ÀBƒ¬@Nw@‹P AÂbB;[??íø¡@‹P"ˆ>G@B–7@!Nb@‹P$κ,€BÈJ@tô4@‹PŽ=Ü#€B †?ÿJ@‹P¶q_€BPܤ@÷D@‹P¸·ÚíB[Mh@’«@‹PºþVÒ€B‹„æ@!î@‹P½EÓ€B·„å@E@‹P¿‹‘¹BÀ±@V¢Ó@‹PÁÒ žB––°@A/+@‹QO©úY€B\úû@¤ø@‹QÊ*CÀB<Žã@LQ@‹QÌp¿¥€BZ :@n@‹Qη;‹Bœ¸¹@,xŽ@‹QÐý·pB½ûQ@K;G@‹QÓD3U€BÛ5š@nù@‹QÕŠ¯:ÀC%°@•ZI@‹RFðÅðB8¶z@mã@‹RI7„ñ@BAéA?óŸË@‹RK~Ö€Bän@"/^@‹RMÄ|¼B¬Ü@•›@Äï$@‹n Æá@C'úG@¬ÅÒ@‹nšTÊ@Bïî?@“£”@‹nå™lC-¦¿@·Võ@‹n“,Q€C.1¤@Ä‘@‹n—¹ C?þ@ù®@‹o‹÷`>BÆÍ@„1/@‹p‡­ÀBŽ£b@†'_@‹pŸO“BÍxê@rÅ@‹qTù1Ï€BÐÖ•@lÝU@‹qÍ“ý˜B¶…@^BJ@‹r<³UL@Bˆö@@L¦“@‹r>úM€B¨D²@{E@‹uj6RÂB`“ÿ@S@ž@‹ul|Χ€BP~ö@&Ã?ë[ÿ@‹}‡j%W€B-§ª?Üð9@‹}‰°¡=B&¶•?ø Õ@‹}‰°¡=B#AK?çè’@‹~ƒ>+Ô€B.â§@V“)@‹~…„§¹ÀB#GL@Cé@‹~ŒX^…€BF÷?ñ€Ë@‹~ðxIÀB!Ï@Cá@‹«qñÔ€BGe@ Gé@‹­¸mºBJÛ@G@‹€/Îj{€B [#?ÈYÉ@‹€2æaB&Y?Òº@‹€4[bFB68?âùn@‹€6¢!G€B'>¶@‰L@‹€8è,€B0’0@!ù/@‹€¬ö.B¯?Õàr@‹€¯<©ô@B]²?Ô—)@‹€±ƒhõ€B2W?ôhE@‹€³ÉäÚÀB-œ^@ÙI@‹€¶`ÀBÀ@YÕ@‹=–¯ÀBP?Íîª@‹?[•B*/?ç9T@‹A¡Žz€BÌw?åüü@‹Cè _ÀB)hÈ@/w@‹F.†EB/µÒ@#îž@‹É±€B ?Ô_È@‹ËM>—B¯O?ߣ@‹Í“ý˜B/T9?ó/@‹ÏÚy}€B3jÉ@`‘@‹Ò õcBNÍZ@.} @‹‚K~Ö€BýÓ?ØrÁ@‹‚MÄ|¼B&¦‡?ä½Ë@‹‚P ø¡@B+¦L?ïq—@‹‚RQt†€B%®@G^@‹‚T—ðlBK˜ô@-4n@‹‚`ºÞ­€B*æm@…ì@‹…µiù€BVÆÒ@K®°@‹…ûåÞÀB_&Ô@2à½@‹… ˆÝ©€B*Ù?óøÛ@‹…jøOQ€BQ¯ø@$–Ý@‹…o…Š8BJ9;@ Ô|@‹…qÌBO¼.@9ˆn@‹…ò¾ÄìBe³&@FZ!@‹…õ@Ñ€Bv)@?x:@‹…ù’{¸BJ¢ý@Ð @‹†‚|/E@B4Ük@J!Ñ@‹†„«*€BT'o@=Új@‹†‹–Ú€B4N(@|Ý@‹†êÇÐ-€B0\Q@¾U@‹‡BB\¸?Ö§@‹‡ˆø€Bå”?ÛNf@‹‡Ï Ý€B%à ?óvî@‹‡ÈßB"¤Æ@+¡@‹‡sPBW€AþŒ@ ·R@‹‡Ê„=B©O?Äîé@‹‡ "@B¢?ßVK@‹‡¢W|€B!#>?ïı@‹‡¤ž;ÀBš;@ Úà@‹‡ûØ÷@Bÿó@ è´@‹ˆ7dÖ€AýI#?ó@‹ˆ9ª™¼B U?ѧ@‹ˆ;ñ¡@BdÊ?é š@‹ˆ>7Ô¢€B•<@ ý@‹ˆ¯þéŸ@B?Ç>æ@‹ˆ²Ee„€B ®¯?Ó4@‹ˆ´‹ájBÏK?Û®@‹ˆ¶Ò]O@B š@G=@‹‰=Ö“?BKñ?È€k@‹‰@$@B?Õeˆ@‹‰BcÎ%€B&6?èë@‹‰DªJ ÀB(|5@=@‹‰¿‹‘¹B2C@Å]@‹ŠFðÅðB-ù@%¤+@‹ŠK~Ö€B0@?ÚC@‹ŠMÄ|¼B5èž@N@‹ŠÐý·pB1¥Z@=:@‹Œì­MË@Bb“Ò@ªq@‹ya¹x@BFZ ?ìs@‹÷¬þB7¥®@B•æ@‹ùóyÿ€BTÜ]@T¯À@‹ŽÇ0Ë€BBÀ1@ Õ$@‹Ž‡­ÀBDç?ôŸè@‹ŽŸO“B^)“@kQ@‹ŽŸO“BV™Ý@–d@‹&´7Ê€BWå¬@i@‹(ú³¯€BsýZ@ @‹(ú³¯€BbV_@ ~@‹$κ,€B•à€@+aú@‹'6BN@,Ò_@‹)[±÷@B‹™ì@4}R@‹®Û«¬€B¦`O@:·®@‹±"'’B¦>Ê@?˜ @‹³h£w@B¯¥@TXæ@‹‘?[•BÃ¥3@T@–@‹‘A¡Žz€B‰Û°@'ÜÓ@‹‘Cè _ÀB„3ù@.+Ø@‹‘Ë®ú€B®“@Aó@‹‘ÍôûßÀBŒðc@* @‹‘Ð;ºáB‡s¶@/‹ø@‹’N%{€Bz“4@`¿@‹’PköéBÎ1@)Pr@‹’R²µêB‹gu@2pß@‹’ÙUªv@B³Ú†@fg®@‹’Ûœ&[€B²Oþ@Jíg@‹“È¥ÄjBŽù@3\O@‹“Êì@O€BçŒ@ZUÒ@‹•lÝÌïBÎ~ë@„ó‚@‹•s±ƒ»BøVé@¿”@‹•u÷ÿ @Bº*Å@g€V@‹•ûØ÷@BÍ(Y@Qek@‹•ûØ÷@BÝ 2@rp@‹•þs‚€B•# @~@‹–ŽžÚkBøæÏ@€`L@‹–ŽžÚkCq‘@˜u@‹–å™lC @“§å@‹–å™lBïòB@‹ Z@‹—Ï Ý€Bërô@tá±@‹—Ï Ý€Bò »@ôè@‹—ÈßB´R @Q u@‹—ÈßB…í^@:&À@‹—šÁȬ€Cr@“¹g@‹—‡­ÀBïXX@ƒ2{@‹—ŸO“C @«XI@‹˜$κ,€B­òº@D§7@‹˜'6B Ûb@@Ýè@‹˜)[±÷@Bì&ì@’4¨@‹˜°_ççC @œU®@‹˜²¦cÌ@C)2Ù@°ŒJ@‹™@~P‡ÀCÑ=@ŒôX@‹™BÄÌmC6AÁ@»––@‹™E ‹n@C‡™@¢5¨@‹™Í2¼4ÀB×M@iïÈ@‹šPköéC&¼·@³{H@‹eïhCg`@ˆ²J@‹¬kM@Böô@‚Áø@‹‡Ë#ŸB®@UU;@‹Šâ €Bªfh@8A @‹Šâ €BÑ`F@†B@‹ŒX^…€B½“à@V Ü@‹™ÿ‰€C "@–äe@‹ž9V‚€B²R @N“Ñ@‹žÒhB·2À@l©X@‹žˆ,e€Cü=@¦2+@‹žŠràèC`^@™®Þ@‹ŸÏYŽÀC«@‹¼¬@‹ŸC @˜˜ü@‹Ÿ¤ÿ9P€B R0@^éy@‹ $ z€Bó•0@ƒµ1@‹ &S9‚ÀBëiN@t„@‹ ±äg=B¢ù@@˜Ä@‹ ´*ã"€B¤Éó@].@‹¡5¡ñ@B¯ì?@SÂe@‹¡ÁÒ žBìbk@…&@‹¢KBž¸Ý@E@‹¤}²û@AÂMtAðñ@‹¤Ôqü€B«H)@ôw@‹¥ûåÞÀBÏ@§@‹¥#YÁB¿,@È¢@‹¥’iÕ¦€B¿q @Θ@‹¦‘IˆÀBžLw@¶z³@‹¦×ÅnBsiŸ@eq†@‹¦¥`z´B›\@´·@‹§-èìÝÀBy%@˜ih@‹¨: Û€B&œy@—#Ù@‹¨@ã@‹´ë)‘BVG@g®@‹´ë)‘BIÂÄ@'@‹´íov€BuF@¶x@‹´íov€Bn÷@0ý&@‹µzæ8΀BstÝ@ Ëâ@‹µzæ8΀BŒOð@`»8@‹µ},´³ÀBkrÂ@ oÆ@‹µ},´³ÀB]^·@”Ù@‹¸JÍ£€BNÄ^@x«@‹¸×ÅnBYCÞ@9@‹¸AS€Baô@"Ný@‹¹¼!×áBžaD@»¸9@‹»íЋ¾BÅna@€_Ù@‹»ò]Ƥ€Bž'W@Cž @‹¼…„§¹ÀB¬£î@;uŸ@‹¼‡Ë#ŸBæj@†m@‹¼Šâ €BÒܺ@{x¸@‹¼ì­MË@Byà@Z@‹¼îô Ì€Bšy?@>òV@‹¼îô Ì€B¥èº@Zµ@‹¼ñ:ˆ±ÀB»¾4@Z÷Â@‹½ÜšÀB„ÊÆ@/œÐ@‹½#YÁB¡{õ@5>-@‹½’iÕ¦€B‰5l@%d®@‹½Ÿ“+áBÖÔ,@¢Õ,@‹ÂÆ_H„ÀB<îg@dU@‹ÃXbë§€Bnÿ@I@‹ÃXbë§€BwŒ«@Då@‹Ãa}X€Bf¡ê@›@‹Ãa}X€Bú8@! @‹ÃÕŠ¯:ÀBf*@U¨@‹ÃÕŠ¯:ÀBuU@xÄ@‹Ä`ºÞ­€Bod@<£@‹Ä`ºÞ­€Bz6ƒ@<@‹Äî1Š€BoÕk@$Ù@‹Äî1Š€ByÄÞ@C @‹ÄðxIÀBup@P@‹ÄðxIÀB?@"éy@‹Æ$κ,€Bƒ@“À@‹È#«|:BIú @G@‹È(8t€B@‹@-¶@‹È*3ÀBO¦ @~ú@‹È¨Ê4ŒB8d¸@ßD@‹È«°qBF÷™@Ü@‹È­W,V€BV @ Ln@‹È±äg=BDÓ¾@C<ª@˜@@‹ÖŽ=Ü#€C ¬F@«Ôµ@‹Ö„XÀC š@•ê÷@‹×nîB«ë@{`@‹Ø)[±÷@BÛé8@l0@‹Ø+¢-Ü€Bê=Ã@t”È@‹Û\Žå*€@ìˆl@0c@‹Ûá­|€@¿@.w’@‹Ýwfˆ€Bü‡2@¯†@‹âHuEF@C'ð@»?@‹â×Ñn<B”¶õ@J@‹ã_øâ@BâõH@›x+@‹ãèTH@B²çÚ@{_Ô@‹ä€–±§€B®¿ @Œ Z@‹åç8¨€Bôà®A^¯@‹å2Q€B¹*ä@œ)A@‹çžŒÃèCö7@ÌÜ@@‹êJ»Á+€CÒ•@†ÜM@‹êJ»Á+€C ˜@‘ ö@‹êÇ‚†w€BzDü@Z¸@‹í ¡oB‹e›@ˆ‹¿@‹ó_—ãÖÀBmrº@jÈ~@‹óè V€B‚á@KH@‹ô|j¸$€Bz¨´@FÓ³@‹ûb \K@BP)@hK@‹ûdæØ0€@ɈÌ@@à @Œ¤<ù¥€CéZ@ª]ö@Œ¦ƒuŠ€CŒ®@©²Ó@Œï¶ [€BhKú@fø@Œñü…AAG9-@I7¬@Œ£zýBðk@—u£@Œ¥Áxû€BaW@>®@Œ gïÖÝBŒ1x@ƒƒŠ@Œ s0™B̈]@©N@@ŒšTÊ@BU,@”º¸@ŒàЯ€B¨ÂY@rv@Œm  šBŒeÈ@{ý¬@Œo戀A“ü@`ɼ@Œó—B Sº@(Ð@ŒõÇ€|€B Æ@5š@ŒJ»Á+€Bfz)@Bÿ2@ŒäUZÅB®ÿ›@v®>@ŒlÝÌïBr~Q@IÃv@Œò]Ƥ€B£Á3@sÏ@Œô¤B‰ÀA¨›Q@e˜Ð@Œ€5pDBu@ˆ±¯@Œ´*ã"€BÃî$@ D@Œ:ÎÊ€B_ìA@.ˆð@ŒÂõK‘Bo9@9yp@ŒÔs€Cå@¦Í×@Œ ÆNM@B‡"@@Â@Œ  Ê2€B!}@Mh@Œ \Žå*€B‘G¾@GêB@Œ åx˜¸C s¤@Ÿ~Ì@Œ!lÝÌïAÆÆÎ@N¯2@Œ!o$HÔ€B¦ò@cM@Œ!¸·ÚíB³&;@cÇ~@Œ#ñ:ˆ±ÀAÅzë@iÌÿ@Œ%-èìÝÀB =’@Mâó@Œ([k§7ÀB¹@–d°@Œ(á­|€BL ?ûqT@Œ+nEvK€B¶ï@»%@Œ,_øâ@B¨)@=,M@Œ,b?^€B(@\ú@Œ,èTH@BRíõ@K@Œ,êÇÐ-€BÒ>¿@G@Œ-qkÕ€BËÙx@]½˜@Œ-s±ƒ»Bøòs@¤}±@Œ.5ßž€€Bx d@p @Œ.¿‹‘¹B!ß"@¦Î@Œ0UZs3Bn}u@ª@Œ1+¢-Ü€B¤h`@•” @Œ1qkÕ€B‚ªš@7%_@Œ1ü›7H@B¯ ¬@\<Í@Œ3ó O€B’Ú@0²}@Œ3÷¬þBˆÆ‚@·Ø®@Œ3ùóyÿ€B²C@šÌ8@Œ8 Ó?Í€Bˆ¤E@K3@Œ8£»²€B‹0Ê@o¶Ø@Œ9kYµBÊoG@œx£@Œ<0ꣀB[¶ü@qï5@ŒA´í"Í€B9ÛÈ?÷ø]@ŒA¹z˜BNOÚ@žõ@ŒC˜ cÀB‰+@6Õ4@ŒCønú©€Bƒ[q@.´‘@ŒDíov€Bnª§@(~N@ŒDï¶ [€BAÓY@~@ŒE'v4Y€Bƒ×@b®°@ŒE)¼óZÀB}ñ@!tK@ŒE,o@BVŽ@ õ@ŒEü›7H@B]„³@&5@ŒGN纮€B‡Z»@9Z†@ŒGQ.6”B•á@2¢{@ŒI½¦B»4Q@fõM@ŒI¿ìÓ€B±£"@JmU@ŒIÂ3O€BiYŒ@ Ü@ŒIÄyÊçBˆ¾h@·€@ŒIÆÀFÌ@B~Ë@$¶=@ŒIɱ€B¦ý@C÷ˆ@ŒJ„aiÇBŠÆ@~1Y@ŒJÆ_H„ÀB<@›@!O@@ŒLfkW†ÀB˜aD@UúÎ@ŒNМ¹(€B†Î—@!m@ŒQ>úM€Bïk@/YÉ@ŒQ>úM€B‰~@i(‰@ŒQlÐ`B‰xÓ@pU?@ŒR餒;B^vÚ@ÔÇ@ŒR餒;Bu[q@Yä@ŒRëë @BI,a@§H@ŒRëë @Bgvê@$=Ù@ŒSStõ•BˆT@L2@ŒSU»qz€B—ˆù@‹Ó"@ŒSû·òBåW@+Òú@ŒSû·òBƒä£@_ð®@ŒSý]vó€B–õA@/Úº@ŒSý]vó€B•d@EÒ@ŒTf Y?BW<ˆ@E¹@ŒXñ›†ù€BÂ@:ÐF@ŒXóâÞÀBˆV,@38ë@ŒYu÷ÿ @B? @/³§@Œ[ eŸ¶ÀBÅË@ŸM@Œ\¡40ÀBAŸË@,Cö@ŒcX®6ÀBvI{@:xÿ@Œk‚Ý-B—rº@kY§@ŒlûSBJµ@,™B@ŒlBB*F@7Û@Œm*3ÀBˆÃ @4å‚@Œm,Å®ëB˜îË@OþX@Œm/ *ЀBnÅ|@ §;@Œn;Y€B‡ow@3e@Œn=Ö“?B€® @8b@Œn@$@BˆÔ@žo@Œq÷‹<B-™è@€à@ŒtŽ=Ü#€AÎîù?¤Ä¤@ŒuŸO“AÖÜ?­àr@Œv°_ççAå=¡?µ5"@Œv°_ççAÎäå@1©@ŒxpGÉãBÍ“@8Äz@ŒzgïÖÝAï2÷?äÆz@Œzj1šÌ€Aà@6¬@ŒzûwùU€A¤í‡@&õ8@Œzý¾u;Aë¨ë@o ¿@Œ{nÃJŒÀAàkO@¶k@Œ{q ÆrA¼¤`?ºÂz@Œ{sPBW€AÇ|Ý?›Åi@Œ|œ§FJ@AÎ<Ø@ Ì@Œ|£zýA½ÿ @ùð@Œ}¯þéŸ@Aô+X?äW:@Œ}²Ee„€Aûj?ËŸÜ@Œ}²Ee„€AôR©?ïZ@Œ}´‹ájB|]?ÏñZ@Œ~ÁÍóAë5@Œˆ\Žå*€B…‰æ@UÁƒ@Œˆa B6’@™¦@Œˆ²Ee„€B:9é@áô@Œˆ´‹ájBP5Ò@Chf@Œ‰o$HÔ€Bh17@¨ît@ŒŠ‚|/E@B“OŸ@&Ó‰@ŒŠ„«*€B«L.@3g@Œ‹qÌBvc_@%h©@Œ‹tÅ€Boûº@âÁ@Œ‹tÅ€B†*2@.š|@Œ‹vYAÀBç‹@–t@ŒŽÐœ¹(€B?øÏ@9@ŒŽÒã5B22@'@ŒŽÕ)°ó@BMm»@&cI@Œßg!—BT¸c@d™@Œá­|€Bˆ¦J@E‡©@ŒãôaÀBƒR@ˆÌ`@Œæ:ØcBxÒ©@-sÍ@ŒåÙ–ÿ€BPmO@.§7@Œè V€B?Nï@.šJ@Œì­MË@B)ó¦?óW&@Œ’íov€Bþ?Ú`g@Œ’íov€Bëu?äWd@Œ–Úy+„ÀB‡ƒ,@}~@Œ—Y%+R€BxÔé@E$y@Œ—[k§7ÀB0ÚW@ çæ@Œ—]²f9BI1®@I:@Œ™€÷¯ïB܉Ô@¡›Ô@Œ™ƒ>+Ô€Bsø1@$E @Œšž0ÀB¼S@]nD@Œš‘§•û€B·.Û@Z0@Œš“îàÀB £t@N[%@Œœˆ¦fB&#v?à&x@Œœˆ¦fBLö)@ô4@ŒœŠÔ"K€Bx¥;@ü"@Œ˜ cÀBY=@Fí@Œ˜ cÀB[æÝ@žþ@Œš`ÊeB9ÜX?éU@ŒŸÓD3U€B„¨@iZ@ŒŸÕН:ÀB€y\@6ˆ@ŒŸÚê!€B“¦Œ@,ë…@ŒŸÜ^f€Bdë@YÛÓ@Œ¢ BaÄBqµ¤@&œÐ@Œ¢ ˆÝ©€B7Ò~?ëna@Œ¢õ@Ñ€BŠÆä@)67@Œ£u÷ÿ @BÙå@\È@Œ£¦ƒuŠ€BÊŠ›@½Ý@@Œ£¨Ê4ŒBD£0@#¼b@Œ£þ€qÊB¿Ë@±SL@Œ¤Ç0Ë€B RQ@"ôo@Œ¤ ¬°€B¼ƒ@^¿H@Œ¤T(–BQ@Hü@@Œ¥Ô €B1{@"Åœ@Œ¥¾U~€B~"@Tu@Œ¦,Å®ëBr‹ã@={·@Œ¨^ÕaÀBO@šØ@Œ¨a Br­@ ¥ƒ@Œ¨a B•‹]@]?-@Œ¨cb›ö@B‰^ò@+Ô€B’.®@9J@Œªƒ>+Ô€B§¶@@ò|@Œª…„§¹ÀB”"Æ@%TÊ@ŒªèTH@BÇc@6\@ŒªêÇÐ-€B’êÑ@- @ŒªêÇÐ-€B¦9N@L¥@Œªí.ÀB€ö@4JÃ@Œ«„aiÇB…Ç@= @Œ¬JÍ£€Bšcð@[ã@Œ­n[GB§Ÿm@9‘ï@Œ­´×,€B­# @5•Ž@Œ­¦ƒuŠ€Bgê@A¿Æ@Œ­¨Ê4ŒB"uî@AF@Œ­«°qBW›š@J–t@Œ®û`ÀB‚‘Í@Å#@Œ® AÂbB¨4Ï@TúL@Œ®$κ,€B°÷µ@G$À@Œ®'6BàYË@Ÿãõ@Œ®ª¯²)€B™Û$@2~V@Œ¯5~ 8ÀBŒ »@“³¹@Œ¯7ÅBtÈÇ@>I@Œ±ßg!—B™HÔ@€ßa@Œ±á­|€B‹ˆ›@OÂ7@Œ±û·òBÀ4ó@^[@Œ²ên¾BB•ô@Ù”@Œ²iѳ€C E`@š@@Œ²kYµBF¦I@€÷\@Œ²o戀B×@2ØÇ@Œ²–÷C'xp@ô#¾@Œ²™=Œr@C+‘¡@½±Ä@Œ´SØåBèÁh@«å“@Œµ—¹ B²&ƒ@a–h@Œµ™ÿ‰€B›•¹@“Bß@ŒµžŒÃèB¦Þ¶@?âÖ@Œ¶¯<©ô@BÂs@Ÿ$ã@Œ¶¶`ÀBÈd¶@¦æÿ@ŒÂðÙGN€BšR5@AXK@ŒÂ÷¬þB—6Y@9¿@ŒÃya¹x@B}X‡@*à*@ŒÃ€5pDBoB @@ŒÃªNpÆBzÞF@rí|@ŒÄ‘™:Bya;@d¼ @ŒÄ«ËëBV.—@% @ŒÄ˜ cÀBB·@%9@ŒÅ'L•B@Á3@Pn@ŒÅ AÂbB=á|@r"@ŒÆ+A/•Beåk@[ì‰@ŒÆ4[bFBi;ÿ@)§@ŒÆ¯þéŸ@BŸy@B]ò@ŒÈ»_˜5ÀBâ”@¡sA@ŒÈ½¦C³¾@²á@ŒÉÏy8B»P@q°Õ@ŒÊ…åé@C ?@‘(@ŒÊ…åé@C“F@ªÜý@ŒÊˆ,e€C«@•äC@ŒÊ÷KÿÒ€B“‘@ƒ‰µ@ŒËšCl@Öüë@ŒË$m»åBmÝ!@L&@ŒËsPBW€B¾à˜@P°@ŒËu—X€Bâ‡ã@i,„@ŒËwÝ}>C RŠ@žfu@ŒÌ eŸ¶ÀC Ím@Ò‹v@ŒÌ9V‚€Bò’è@«á¦@ŒÌ‹5 “Cø™@£3Ä@ŒÍÔ €B¶@ò@[§µ@ŒÍ©ír~€B’DÌ@†˜ @ŒÍ°Àæ.€BWô@‹ÚG@ŒÎF.†EB`¯ @#v@ŒÎ´í"Í€Bv6¶@M%ê@ŒÐL¡>É@BQÑ@½E@ŒÒm  šB[ÿƒ@UíÀ@ŒÓ~±4 BUtX@`M@ŒÓ‡Ë#ŸB>0©@&O@ŒÔ £` ÀB=±@/Õí@ŒÔ΀B1a>@R<Ž@ŒÔ˜ cÀB2ó¿@Òk@ŒÕJÍ£€B6Wé?àõí@ŒÕ«°qB†ç6@¬x–@ŒÕ±äg=BF¼y@0ûß@ŒÖ"'?ÿ€B:»@2H@ŒÖ$m»åB8v€?ç@ŒÖ$m»åBh¡@1OH@ŒÖ&´7Ê€BEsm@ö+@ŒÖ°_ççBxØ¡@ƒó!@ŒÖ·3ž²ÀBYÁy@q×@ŒÖ¹z˜B[‚§@)†@ŒÙrŽEÈ@B4ó›@Љ@ŒÙß#O€BL @dç@ ¢Œ@ŒÚeïhB:¸Ã@Ô@ŒÚd$Û¡€B1Ç|@!0º@ŒÚì­MË@BW¡<@Rº•@ŒÛu5¿õBc¼ü@VÕ$@ŒÛý¾u;BÈ8è@›‰á@ŒÜñ @B¼&R@Vµ@ŒÜ£»²€B•.Ø@5Y)@ŒÜ¥`z´B–º@"©"@ŒÜ¥`z´BŸG(@V•W@ŒÝ)[±÷@BŸ‚ƒ@^bV@ŒÝ+¢-Ü€B¥@;=Õ@ŒÝ-èìÝÀB”Ç@!òÔ@ŒÝ•r‘7BŠuÙ@&¡E@ŒÝ—¹ B‚Óž@™Ð@ŒÝ—¹ Bž]@Y»¥@ŒÝ™ÿ‰€BŒû¹@-:É@ŒÞ8õ€Bdµ+@%]@ŒÞ‚·Bl¿ð@ŸŒ@ŒÞ‚·B6@"°â@ŒÞ!Åþœ@BpïØ@ €€@ŒÞ¬3îdB[P½@ ö@Œß>˜ÒêBHB@N#@ŒßÚÚ)Ì€B\|@=gb@ŒßÝ ¥±ÀB8úð@Ü/@Œßßg!—BQš¼@FÐ@Œçà)aBB_”@:“@ŒçâoÝ'€B9ùI@þ@Œçä¶œ(€BYly@w%@Œél|Χ€BA s@Dg@ŒénÃJŒÀB@4?@ 5ü@ŒénÃJŒÀBT¢@ ÏÕ@Œéq ÆrB3_|?å)ª@ŒéúTxGB:±«@â.@Œéü›7H@BEìÊ@©Ò@Œéü›7H@BZD@@ñ(@Œéþá³-€BCüÇ?ÿ>-@Œê‹–Ú€BR ’@¾×@Œî,d°£€Bq’f@"u›@Œî´‹ájB}µE@'3ã@Œï;ñ¡@B¼]é@ecc@Œï>7Ô¢€BÆa@…V6@ŒïÄyÊçB¤ƒ¿@VÌh@ŒïÆÀFÌ@B«&Š@lö@ŒðMÄ|¼B~VÜ@-þ]@ŒðÖ®0I€Bp>ÿ@' @Œò Æá@B7ÔÛ@/Â@Œô éÛñBKÔz@ ¡@Œô”OSDBSb@uC@Œô–•Ï)€B{<@8òI@Œõû`ÀBP@ T7@Œøønú©€BWt<@P?Ý@Œùu÷ÿ @B:ì—?õK@Œý¡40ÀBX˜è@‹e@Œý£zýBç_@?iD@ŒþT—ðlB´@%Ft@ŒþÜ¿§jB.«@;œÐ@Œÿî1Š€Bò©@&Š@üü5B…Œ@@£f@€–±§€BLy¶@Büü@”OSDB,“è@D @¼!×áBÊ4@JäÍ@´‡{€B·{@ HÇ@Â]€B˜@ßv@’”CB=o?Æû@”OSDB-Ò@ `@Ôs€B&ª.@ 5½@ÖLîæBöð?ÝÎt@Ø“­çBw@%@vÇ&€Bc?Ô~·@½C ÀB+Ù÷@ s†@^tbÈBX@{@`ºÞ­€B¼o?êIw@ëŠØ€BA×Ï@\“@íЋ¾B&9š@T4Û@¹ïš@AúêL@Š;@þ€qÊBHš@!E¿@ •r‘7AìR±@!üL@ hABÏ@€Z@ \ä&€Bun?É=d@ £` ÀB·Š@Û@ JZÈB*ñâ@ˆÛ@ L¡>É@Büã?Ú{³@ N纮€B$ý@—È@ ‘F—³ÀBmL?Ûài@ “™BuO?ñ˜@ ÕŠ¯:ÀB£í?îcc@ ×Ñn<B%è@ š @vÇ&€B}6?áWŠ@^tbÈBÛ?ÿ+E@`ºÞ­€B%l’?ÿž@fkW†ÀB.¨@;9´@î’ËiBÓã@6Q @JZÈB_'@Rð@L¡>É@Bšé?ÒéÍ@N纮€B Â@5@}îô^ÀB"6×@ûY@€5pDB—Ô?Ù%W@ÓD3U€B!TA@ ˆ‹@ÕŠ¯:ÀByÁ?ÏÀÊ@×Ñn<B@9~@Ïì[ÀB ýî?æ+é@hABèp@ÜD@œ§FJ@B’Û?ëDš@žíÂ/€BÕ?׎°@¡40ÀB,—Ü@ã¨@›åŸ@B†Š@»ˆ@ž+‚„€B%q3?Ùr?@$m»åBRƒ@ Ñc@&´7Ê€BmC?Ó(ò@™žŠºB%?Öý~@›åŸ@B®?Í.b@ž+‚„€BL@©Ö@"ˆ>G@BŸ@¤n@$κ,€B%l@ïN@$κ,€B$€ž?ì·ö@'6Bž'?ɾ˜@µ¯bx€B–“@6Á@ßg!—B¢0?ù&ž@á­|€Bèm?õ±¯@ºXŠÀB eÙ@Ú@¼ãÔpB"ç@@"!@¼ãÔpB-¼—?õäq@¿*“q@Bb’?ÎŽ‚@¬kM@BÇ@»8@ó*N€B?ß5ü@9¦3ÀBG7@ºA@UZs3B·"?à¾ð@W ï@Bø;?Ū‹@qÌB(Ly@"3@tÅ€B!%(?à´@vYAÀB£S?À;@ ¬°€BT?þýÛ@ ¬°€B3Xb?øé@T(–BYž?ÍJ@œFæÀBâ@ô@œFæÀB+“¬?û¼º@žŒÃèBOL?Ê(‰@(ú³¯€Bìô?ÒãP@+A/•BÕÏ?µ@y@±"'’Býì?åîš@³h£w@BT˜?Í¡U@³h£w@B0 #@-@µ¯bx€B…í?õE9@8&]€B³@.@:lÙgB!¨?é$ @<³UL@B0p?ÂG²@³¥/€By?Ê"£@µN!Bÿ?Çum@·”œú€B$f§@ á@"ˆ>G@B&05@"¸E@$κ,€B#YŠ?䙦@'6Bª“?Â…Ó@µ¯bx€Ba)@>y@ÎV=C@Bôà?Ó©L@М¹(€B¥Å?À‘C@!|j¸$€Bµr?óçŸ@!~±4 BÕ@ê@!€÷¯ïBè«?ãå¸@$"'?ÿ€B]Ç@ 5L@$$m»åBŠ @ÃL@$&´7Ê€Bÿ?ç³§@$˜ cÀBVBì @} @(û·òB÷7?ÿ!£@)ya¹x@B&vÝ@7+‘@)€5pDB&¤ø@/¯u@)‚|/E@B1/˜@ú@* BaÄB£@þz@* ˆÝ©€B"Ãu@"í@*ý]vó€B;Ÿ @Dp†@+\”u@B&=£@rè2@+…åé@B.Êð@>Ã@+Œ¹ŸéB ? @(¶@+΀B%Ÿ@@+›åŸ@B*ÿ¹@e?@+¢¸½kB-C@$Ä@+¤ÿ9P€B"Ö—@(oÎ@,w×€B6ˆ @>…ì@,JÍ£€B õg@*‘h@,‘IˆÀBŠœ@,^@,å™lB_/@IqÖ@-¼‚Ö(€B °G@-Ãe@.-&­2ÀBÉd@()¢@.µ¯bx€B 9Þ@(ž,@/?¼Ü€Bšú@+_@/Û;(B¤/@+’h@12Q€B· ?ËÄÊ@1X®6ÀBÒ?Ø™@2½ânBc^?áò@2 ¡oB9ç\@B¡n@3"'?ÿ€Aìà½?ß4a@3$m»åB 7@!a@5×.‘Bà?ì‡@5ÙUªv@BÜÓ@ Ä@6´‡{€B*•@'`Ì@6[k§7ÀB*·&@s@6]²f9B )!?îV@6ãôaÀB)F±@ 9@6æ:ØcB ‘ý?íj/@7nÃJŒÀB À‹?ïJ¡@8u÷ÿ @A»í«@ 9@;œFæÀB,ˆ÷?þ1@@<;Y€B d7?üÞ@<…åé@Aÿ†Ò?Ü`ö@<ˆ,e€BéŽ?á û@<Ê*CÀBÓê@Ò€@<Ìp¿¥€B²†@ø¾@= Æá@B‰@ý~@=K~Ö€B9ï@P”@=MÄ|¼Aÿ_?å-4@=P ø¡@B[Y@%Ë%@=Ôs€B d\Žå*€B m›?óž@>^ÕaÀB‹@Ĥ@@lÐ`BK¬@Ùf@@nbLE@AüRz?á!@CSØåB.¿?äiQ@CàЯ€B'zM@GÍ@C'L•Bj;@ž(@CAS€Bß=?á·|@C#«|:BXP@'ž@C%ñø@B!$0@&CÝ@C’iÕ¦€B¶?×Ìâ@C–÷BGCl@La_@C™=Œr@Bª{?ÿZ2@D%ñø@B:é?ÎÇ@D(8t€B"k?ô_À@D*3ÀB½Œ@j×@D¨Ê4ŒBËå?Í¡˜@D«°qB¤ñ?òí‰@D­W,V€Bè®@Y@EÓ¥t¹B õ?ñ$@EÕëðž@B¡o@b9@F]Q$Õ€Aû ?ÞÑB@F_—ãÖÀB-¦@"Qœ@Fåšp@BçI?èaò@Fç^U€B€>@ ®†@J—¹ Bj·?òõ™@K¨Ê4ŒBŒM@!ÆÒ@K«°qBã„@¦×@L0ª&€BŽ@"žØ@L2×& BëO@²_@L±ƒhõ€B^k?ÐZ@M=–¯ÀBÂ@ ܺ@M?[•BÀx?ذâ@MÇã„¿BÕ?Ë­Ž@N$κ,€B,@1{p@N'6Bjï?í @N-èìÝÀBwÒ@G¿@N²Ee„€B x?îÒ@N´‹ájB’:@$™R@N¹P€B2ˆ @h@N»BÂ<@B)ºô@Ed®@NÛýg¿BI)@ þ;@NÞC㤀B ´p@37*@NâÑ‹BëÅ?öµî@Nåšp@B;@~1@O[k§7ÀBÙ¬@Ö@O]²f9B2}y@F×ä@Ob?^€Bä†?ô`F@Od…ÙéB›@ò¶@OæýBºË@e¶@OéC“ó@Bõ!@;7X@OíЋ¾B;?ê—ž@Oð£@BǬ@d@R˜{LÇ@BÃX@5íÀ@RšÁȬ€BýÌ@Û@S!d½8ÀB%›Ý@[‰ @S#«|:B+˜@1ð@S*3ÀB¦È?ëÒ@S©+2Ó€BìŠ@9eg@S­¸mºBþ@-*à@T(™µhB§æ?Âwî@T*à1M€BÈë?ìYS@T-&­2ÀBó @0ö@T¥Áxû€B¢8?Åžé@T¨ôàÀBìâ?ïk@TªNpÆBzY@+9@U¤ž;ÀBÀ+?þ¦3@U«qñÔ€B0°Ç@¶å@V1R¦µÀB š?ç›ö@Vµ¯bx€B+²ï@#@V·õÞ]ÀB% @@ð‘@W=–¯ÀB X?ÝŠ‡@[(8t€Bž¤@ ¬°@[¯þéŸ@B Ÿr@Á@@[²Ee„€B Ä@3ã@\"é<Bn?ó0Ï@\%/¸t@BÏÁ@ÿ?@\'v4Y€B •Í?Ňb@\¥Áxû€BÀ‰?솶@\¨ôàÀB Õ@ Þ@\ªNpÆB p?ÁO”@]1R¦µÀBή?ö{š@]3™"›B$Þ´@ ü‡@]5ßž€€B BÇ?Ã3L@]¹Û[û€BjØ?òØV@]¼!×áB#¨™@ t@]¾hSÆ@BÒæ?Ì’@^DIKÃBtÓ?ðe@^FǨ€B" @À@^HÖCŽB ™K?ÃÓ‰@^Ë®ú€B$Vä?çÍ-@^ÍôûßÀB¥B?Ù@_R²µêBA?Í{…@_Tù1Ï€B"?î5P@_Ü^f€BH`?Ëý@_Þ¥%Bçø?í#@b\ä&€BA0@ ò$@b £` ÀBP@5@c eŸ¶ÀA%›_@¶=O@c ¬^¸Aøˆ.@WÍ@còÚ@B ¨*@+f²@dÈßB"3Õ?Û<ÿ@d\DÄ@BA4?ÿ¦7@d\DÄ@B)@ú@ §@d ¢À©€B§ö?ýag@d§EøQ€B?½Œ @d©Œt7B¦‹?Ýíá@d«Òð@BÈ_@,Óx@fR²µêB úC?Äêd@fÛýg¿B c?¿Ný@gaÞ_¼BEC?öþ@k1R¦µÀB"Œ"@@I™@k¹z˜BT @D±@lA¡Žz€BP@B~@n-‡«z@B!?ô…ý@n¯þéŸ@BAú?ùjè@o:lÙgBÿ†@#–ê@o<³UL@Bß @W&@sn –BÁ?öÆ @s AÂbBþâ@fþ@s"ˆ>G@Bj…@› @sºXŠÀBMg@@$Ì@s¼ãÔpBW™@Çy@t‘™:B¡á?õ°Š@tØX;BXÝ@o—@t¥Áxû€BNj?ÁÊm@t¨ôàÀB5Æ?âí>@tªNpÆBsš@5?Ä@u.Ië%€B¹*?Ã@u0ª&€Biù?Ø•[@u¶Ò]O@BU?Èa@u¹P€B ÷—?×Ïx@v7dÖ€BÖQ@ö²@v9ª™¼B#ª@ äç@vÕëðž@B  @éê@vÜ¿§jBëw@ v@vß#O€B)ÂÑ@á @zûåÞÀBN@çï@z BaÄB2ò@#æ@z€÷¯ïB+Ç|@ >–@zù’{¸B#‚ë@" ©@zûØ÷@B'Xæ?ê|ò@{eïhB!Ê@ê[@{ˆ,e€B¿ö@ƒ@{ŠràèBŧ?á–Ñ@{΀B#˜6@:`@|BŒÂB @¿­@}&S9‚ÀBû?Õ²‰@}*à1M€B*@@}-&­2ÀBïY@!nz@}ºþVÒ€BC{?Åá±@}½EÓ€B ¤G?×Ñ$@~I˜ƒ9Büa?ÊJÏ@~KÞÿ@B [;?×îÌ@~Ì~BB5x?½a»@~ÎV=C@B%hÑ?óŒ¹@~М¹(€B ³@ô®@Ïy8BIY@)òà@‚¤<ù¥€BªV?ÈÐF@ƒ Æá@B1î?âïÝ@ƒ \ÿ€B®,?ùI¶@ƒSØåB"LP?ö8É@ƒ5ßž€€B!9ò@)Ú@ƒ™ÿ‰€B û?ù#@ƒœFæÀB ø®?㬊@ƒžŒÃèBÕx?áÑx@„(8t€B!ùç@m@@„*3ÀB(Ä?è||@„,Å®ëBß?߉¾@„°Àæ.€BpH?ú5­@„³¥/€B!‹³?âÜý@„µN!B$?Ýuó@„ÎV=C@B6Á?Î%@„М¹(€Bh†?ò6@…9I›t@BGZ?üln@…;Y€B&}Õ@‹ ¬°€Bu®?Í b@‹ ¬°€B#. @Âð@‹T(–Bº§@ ’@‹ŠÔ"K€Bßu@”­W,V€B Ÿ¼?æ&Ý@•*ñ¢€BÖú?ä¡@@•,d°£€BàC?Èãï@•,d°£€B&PÖ@ s½@•.«,‰B V—?òq@•¼‚Ö(€BPx?Ù»A@•¾ÉR ÀB ?Ú«@•¾ÉR ÀBou?ò(å@•ÁÍóB±ƒ@  4@–OHüBé?×8P@–Qw÷€Bž?Ø%t@–Qw÷€Bd?ó›@—BÄÌmB$Ò?Û²î@—E ‹n@BIK?Г–@—E ‹n@B"“e?÷¦“@—GRS€B UÏ@­@™]²f9B/x?ô—ê@™åÙ–ÿ€BÅ ?Ù/f@™è V€B¨4?ÕŽ"@™è V€B®?îˆÎ@™êfÑæB 9Å@ÁÊ@šqkÕ€BM?êq@šs±ƒ»B÷4?Óv@šs±ƒ»B&ÒÂ@ ÅÚ@šu÷ÿ @B LA?õ©@›Ç0Ë€Bõ„?åÁ@› ¬°€BÈQ?Ö‚®@› ¬°€B&¼Ã@ Œü@›T(–Bë‚?þç6@›ÜšÀB‡?ëZ–@›#YÁB„©?Ñ&À@›#YÁB.T¥@ô@›’iÕ¦€B ì @Ó•@œQ¾BÈ ?çFN@œJÍ£€BÚ”?Íœ(@œJÍ£€Bèt@ŒX@œ‘IˆÀB^~?þ @œžŒÃèB«î?åQi@œ Ó?Í€B2?Î@œ Ó?Í€B'·@ Ä@¢‡­ÀB{í?ùÃa@¢ŸO“B)É@B^¯?ÐŽ¤@§N纮€BCî?ÙÅi@§N纮€B d?Ûúf@¨cb›ö@B G@?ñ…@¨cb›ö@B)m?Õpç@¨ëë @B Qu?î«P@¨ëë @BÈ´?ÙIÏ@¯MÄ|¼BVZ?¿ÄL@¯MÄ|¼B!Ûº@([@°b?^€Bî¤?ù@°b?^€B Ø¿?Üî•@±_6¢s@B+Ä™@O@³Ê„=BÕ@)r;@´B-"‹@AÝ@´\”u@B<“?Ð$@´£Z€BÂÁ?Úið@´œ§FJ@B±ü?ôC‘@´žíÂ/€BæC?ÐLƒ@´¡40ÀBÛp?à, @µ/ *ЀBg¶?ñ°£@¸gŽ•y€B£†@Là@ÀXbë§€Ba@ ¯B@ÀZ©gŒÀAöm%?Ô…#@À_6¢s@B#©C@3Üý@Àa}X€A÷÷P?㛑@ÀcÃÝYÀBö‹?ûæ@Â2Q€BÔ%@dg@ÂX®6ÀB.'Œ@1Ç@ˆ,e€AÚDi@ ÄÎ@Ã'v4Y€B"K?ü)c@Ã'v4Y€B†«@ äï@Ã)¼óZÀB"-®?Í @Ã)¼óZÀB*Œ'?æ¤Û@Ã5~ 8ÀB·Q?¹¦ç@Ã5~ 8ÀB '?ÈÄÆ@ÄâÑ‹Bdü@ )@ÊQ¾BœÑ?øq7@Ê£zýB (˜?áfØ@Ê¥Áxû€B-œÒ?îþ&@ʨôàÀB?b@Eú@ˉpv€B)¿½?Ó2@ËÏì[ÀB3_1@ U;@ËhABxÃ@Û@ˇj%W€B'm²?út@Ì´×,€B'"×?è5ø@Ì´×,€BB27@$¿M@ÌûSB')€?û5¨@Ôš`ÊeBê¨?Ýá"@ÔßÈÞ€B3cÄ?îÃ;@Üa}X€B:Z%@nÛ@áu—X€BUW¬@V #@âÇ0Ë€B,Š„@07‹@â9¦3ÀB)Ùæ@"Õ@â €"BA° @MÑ @ãå™lBCm@7 @ã“,Q€B6c_@ç§@ã•r‘7Ba?ÜËK@ë’iÕ¦€BJ ?ð^h@ë”°Q‹ÀBRX@.@ë–÷BA+ô@#íN@ñ'×u½BB@@K4@ñÂ]€B0\"@%@òû`ÀB€¼@W“@ò AÂbBda@[>@òœFæÀBc:ç@÷@ò Ó?Í€B~ ÷@`@ò£»²€BHZ%@h@óKBX}§@"=À@óɱ€BÕǯ@lM@óËM>—BÙD\@g$-@óËM>—BÂq@Te@ôR²µêB¡ªm@0 @ôTù1Ï€Be]@Báz@ôTù1Ï€B–[@,a@ôÛ;(BšKÙ@)7z@ôÝ£ù@B®%Ô@QIs@ôÝ£ù@B•Ôð@*›c@õñ›†ù€B©”½@c´@õóâÞÀB”}Ð@6,^@õö(~ÄB°C´@c4@öz…:†ÀBÁD@vŸ™@ö2Q€B¹Õk@j¾ù@÷¬kM@BƒSÐ@AÁã@÷ó*N€Ba9å@=â@÷9¦3ÀBp@9Uu@÷ˆî¤­€B¸Ï@wÒc@÷‹5 “B§ ä@IwÑ@÷{œx€B±DÌ@[@øw×€B³Uœ@s­¸@øQ¾B¾Î@gÏ@ø¤ÿ9P€Cæ@®OÑ@ùž0ÀBÆêÃ@©‘Þ@ùaBÚfÜ@ˆ4@ú¢W|€CD¶@½ J@ú¤ž;ÀBŽ\Ã@]m+@üe©Û€BÖ¯¶@¡XE@üg†ûQ@BÙJ¾@Dª@üàë íCØ@žîå@ýnÃJŒÀB|@9p @ýsPBW€Blz@bwÀ@ý÷KÿÒ€BOÐê@†Œ@ýù’{¸BN²@|J@ýûØ÷@Bké@L¬›@þÔqü€BCň@&³@þ‚íâB6-Œ@@þ„aiÇBboË@49@ÿ\ä&€B:²Z@~Ð@ÿ £` ÀBÿ2?öhõ@ÿ éÛñBNZ@/ýÊ@ÿ‰°¡=B=å%@i@@ÿ‹÷`>B,¿…?ÿé§@ÿŽ=Ü#€B<Ä@k@ލhó(€B}aµ@#Ÿý@ލhó(€Bqj@2Œø@Žª¯²)€B€”.@é@Žª¯²)€B|ý†@a»@Ž5¡ñ@B†~K@_«@Ž5¡ñ@B|¯\@¶Ã@ŽÅ;ÇvBž÷Þ@-¢Û@ŽÅ;ÇvB£ê¨@<*,@ŽÇ‚†w€B¥-@?êâ@ŽÇ‚†w€B¨eŠ@RW›@ŽèTH@BnÕ@.Š@ŽêÇÐ-€B;#$@ï5@Ží.ÀBg‹)@5®«@Žq ÆrBSP÷@(•-@ŽsPBW€B2]@ã~@Žu—X€Bf-Î@1ŸZ@Ž(/BlhÕ@Dm@ŽÒhB9ÀS@ um@ŽN†¼gBKéº@'·c@ŽŠràèB@·@~@ŽŒ¹ŸéB%\¨?ù«@Ž΀BJ‘g@#H|@Žê‚€BMc¹@$­ï@ŽìLOƒ€BJFM@.²@Ž r-G€€BtDS@;û@Ž úµ¹ª€BnÇæ@CF@Ž n[GBiC“@A7@Ž ´×,€Bq™?@!pX@Ž ¾hSÆ@BMO\@63@Ž eH”BÎÐ@/ެ@Ž íЋ¾Bpz’@"Ý@Ž vYAÀBnŽæ@$sÒ@Ž ý]vó€BpÓ›@)½@Ž ÿ£òØÀBv„o@a²@Ž0ꣀBw¸N@,É~@Ž…åé@B]ë@j@Žˆ,e€B~³ @bÌ2@ŽŒ¹ŸéBp/@)¸_@Ž0šò@Bp”°@8¿4@Žw×€BŠs·@Dô@Ž™=Œr@BŒLW@3È´@ŽûØ÷@Bý'G@^@Žþs‚€BòŸÚ@…,é@Ž‘™:Bž¥@fÚä@ŽØX;B}º@?»s@Ž«qñÔ€Bµç@Bi@Ž«qñÔ€B¬<@Dæy@Ž­¸mºB¸a@Qæh@Ž­¸mºBÅÇ@j·þ@Ž5~ 8ÀB¹»@N)|@Ž5~ 8ÀBºf\@\Ò¿@Ž7ÅBÀÖT@OX£@Ž7ÅBΖ<@e Ô@Ž¿ìÓ€B¦kÌ@0y@Ž¿ìÓ€B›oV@-(@Žê‚€B’]@Љ @ŽìLOƒ€Bð@œOv@ŽrŽEÈ@BÁ~N@”}€@ŽtÔÁ­€Bˆ“@vŽï@Žû·òC/Û@Üf´@Ž0ꣀB²\Ã@Bœ„@Ž‹–Ú€BÕ¢µ@h×@ŽÜšÀBµ´L@rÅ‹@Ž0šò@BŒ|¬@4ªÅ@ŽQ¾Bû³œ@ƒ‹@Ž–•Ï)€BÊÄ@{Ëh@Ž˜ÜKBâ3@‘QF@Ži…õ€BÆWÅ@v[Ý@Ž£Z€CJ@œô@ŽéÏ\CƒQ@¸Ã±@Ž×p,Ø€BèœK@“ù@ŽÙ¶¨¾CÐ<@Œ›Î@ŽÛÈsÁ€CPd@”g@Ž_øâ@Bàµ@Ž¢”@Žb?^€Bß @uòÐ@Žd…ÙéBóuA@y,à@Ž Æá@B¾PÒ@‹ÆA@Ž \ÿ€BÎ?ÿ@w’@ŽàЯ€Bתa@f.@Ž•’ï@C#&8@ÉÓÔ@Ž—XÔ€C"0–@± ¹@Žž+‚„€BÂÌŒ@RŠ"@Ž «ËëBÝà@‘|ò@Ž òGЀBìœù@«¬@Ž ‚·Bé`F@Ü@Ž !Åþœ@Bî@€ü¨@Ž þ€qÊB^c@'³t@Ž!Ç0Ë€BdÖ@!¹@Ž"šTÊ@BËt@:‚4@Ž#ÖLîæBÅj>@|:@Ž#Ø“­çBÊ{@t–·@Ž#ÚÚ)Ì€BÆQ7@cû@Ž#Üën˜@BÊÈ@t†@Ž$^ÕaÀBó^§@‘©“@Ž$a Cþ@“1@Ž$cb›ö@CÏ«@Œ¹ @Ž$e©Û€B÷“@†ãA@Ž%r-G€€C*®t@·gõ@Ž%vº?K@C+2@´!@Ž%y»0€B×D”@j2ä@Ž%úµ¹ª€ClÊŽ@÷¾I@Ž%ÿB±u@B—¯ @H‹Ò@Ž&‰pv€BéEÿ@ö@Ž&‚|/E@BÝV?@ƒZd@Ž&„«*€C•h@ªëû@Ž&‰O¢õ@C½d@žM@Ž&‹–Ú€C¦'@¤µ-@Ž' eŸ¶ÀBÑ—O@“J:@Ž' ¬^¸BÁ´ý@h™@Ž'9V‚€BÒî @Š––@Ž'ÒhBí0@WLË@Ž'”OSDB‘õò@hž@Ž'–•Ï)€B‰>{@4ƒ4@Ž'êÇÐ-€B^ˆ@Xâß@Ž'í.ÀB‚êœ@1:û@Ž+L?ýfBÆç¿@•ܸ@Ž+”MI@B”n@\ܱ@Ž+ÄÚÉ.€B‹g@?¦@Ž,KBp–T@W•-@Ž,O©úY€Beݳ@bŠ&@Ž-nbLE@B4 ‰@!9›@Ž-p¨È*€B^ ‰@2Šã@Ž-u5¿õBP¸@@Ž-ý¾u;BR(@l@Ž.ñ @BjÖd@ É@Ž6r-G€€Bk©€@.[@Ž6tsÃfBjÅ@CHõ@Ž6ý¾u;BU.õ@ =@Ž7‡j%W€B^œe@I#ž@Ž7‰°¡=B+ƒÖ@³@Ž8‘™:BZ§Y@.fÓ@Ž8ØX;BUÒ@.m@Ž8˜ cÀBŠRŒ@UG€@Ž8š`ÊeBr@4­°@Ž9£Ûû]ÀBP“ª?íß @Ž9£Ûû]ÀBGiŸ?úÁÛ@Ž:*3ÀB‚×è@)YK@Ž:*3ÀB|ä°@<´J@Ž:,Å®ëBrp@ ÚË@Ž:,Å®ëBp… @ÐÈ@Ž:µN!B?a?à%á@Ž:µN!B.3¿?å{1@Ž;KÞÿ@B?ëñ@ýP@Ž;N%{€B>¹÷?ñqT@Ž;Ôs€B%Å?îW@Ž;ÖLîæB4üß?ãX—@Ž<\ð&ŽB"‹3?ë’K@Ž<_6¢s@B!áG?Õ?Ù@Ž>wÝ}>Bˆ!@:îš@Ž>z#ù#@B‘:@Lë–@Ž?Ç0Ë€B‘“Ç@Uˆœ@Ž? ¬°€B–p;@N½@Ž?ŠràèBr²(@3θ@Ž?Œ¹ŸéB™1@@…Ë@Ž@àЯ€B†C@6üß@Ž@'L•B¡¨@jÂç@Ž@ "@Býeï@–ä•@ŽA±äg=BFBî@€@ŽA´*ã"€C/Ê@Œ!§@ŽA¶q_€BÃÎ@d5@ŽBÏ Ý€B£òc@-âC@ŽEô¤B‰ÀB¹+…@hÒ¦@ŽEöê¾oB¬³@^ˆQ@ŽF},´³ÀB§ß@[Yê@ŽFs0™B¦Þ‘@Yн@ŽGSØåBŠ×¯@4„ˆ@ŽGž+‚„€BþÊç@›±£@ŽI)¼óZÀB$œV@Œß@ŽI,o@BæÃ!@ˆñR@ŽJòGЀB²Û@EÎÑ@ŽLÇ!EBñG @iî@ŽMO©úY€Bœ·@NQ@ŽP¦"wCB™dó@VD@ŽP¬ö.Bß!H@sfÃ@ŽP¯<©ô@BÜ#å@ŽÁ@ŽQ2æaB¬Üõ@_†@ŽQ4[bFBÀLá@’;‚@ŽQ8è,€B¼Ç‚@a-@ŽQ;/B¶¤Z@V|‘@ŽQ´‹ájB5ö×@8»V@ŽQ¶Ò]O@B£â@ˆ°à@ŽQ»_˜5ÀB˜•ì@DH¿@ŽQ½¦B•Iæ@<¼”@ŽSÍ“ý˜BpƒÒ@"Ó,@ŽSÒ õcBœhè@-©z@ŽWåšp@BÇð~@v0<@ŽWç^U€BÅ%@jš@ŽW餒;B»Á¿@RßL@ŽX!¾ñB ™G@H”Ÿ@ŽX'×u½B´É†@Eâz@ŽX¤ž;ÀBäL@„ô@ŽX«qñÔ€Bó"@€Vù@ŽY1R¦µÀB]Æâ@’8P@ŽY3™"›CÂ@˜äA@ŽY8&]€CÙã@žz @ŽY:lÙgCj@‹ÒY@ŽY¶`ÀB4'@l8L@ŽYºXŠÀB~©@$¶¿@ŽY¼ãÔpB„¢ë@;G@Ž\N%{€CVM@’œC@Ž\PköéC 5@“ò¬@Ž\PköéC&8@žq@Ž\ÖLîæCp{@‘éò@Ž\Ø“­çC•B@›&@Ž\Ø“­çC1‚@«)Ð@Ž^„aiÇBù%@ƒí$@Ž^„aiÇCÇÕ@”I`@Ž_ç¿BÝâY@vØ@Ž_ê‚€BÙ°K@t“`@Ž`¤ž;ÀBç?Z@“­(@Ž`©+2Ó€Bê”w@…ˆ1@Ž`«qñÔ€Bá;@í¦@Ža3úcþ€C»ª@¨˜š@Ža8‡[É@CÍ@§ã@Ža:ÎÊ€CžJ@ŸJQ@Ža¼!×áBä‹€@v•%@Žeù’{¸B{Šz@'WÉ@ŽeûØ÷@C%²@® ë@ŽeûØ÷@C7‹3@½¢6@Žeþs‚€BçïÔ@r^ú@Žgƒ>+Ô€BR)@!}@Žgƒ>+Ô€BI¾=@,¿@Žg…„§¹ÀB² @C»Ï@Žg…„§¹ÀB¶ép@MY@Žhû`ÀB_´û@-”«@Žh"ˆ>G@Bé„0@…²@@Žh$κ,€B¤k1@Dm@Žh¥`z´BÈô¿@rŠ@@Žh©ír~€CZ¤@|ò@Žh¬3îdB§D'@A@Ži38$S€BÝ ·@†—Î@Ži: Û€B¾û @MóI@ŽiºþVÒ€CN‚@ŠõE@Ži½EÓ€C q~@¯µ@Žj¶`ÀBÖçô@\I@Žk>˜ÒêB¹8Q@AÖ@Žk>˜ÒêB¶¡Ò@G_¢@ŽkÅÙ€B–z@ò™@ŽkÅÙ€B€Ç@)(·@ŽkÇã„¿B•¨é@3€ú@ŽkÇã„¿B–!@2L@ŽlMc~t€B¾@b@ŽlO©úY€BÓâ^@Zéâ@Žlæ:ØcB½,­@IgQ@ŽlèTH@BǧE@_AÌ@ŽmnMý€BáP¬@s‹T@ŽmpGÉãBüœ@‚Œ@ŽmpGÉãC ÿŒ@¡EÌ@Žoe©Û€BÂÙ@ÎÄ@ŽogïÖÝBïý@£H@Žož0ÀBR ì@4y«@Žo“îàÀB½´V@Nš,@Žp£Z€B¶ÑZ@r/”@ŽpvÇ&€Bd€¸@ 7 @Žp¤<ù¥€BÄ»@„Bµ@Žp¦ƒuŠ€Cm›@Å0Í@Žp«°qB’@*!î@Žq4¼£©€B¶íž@dò•@Žq9I›t@Bó‘·@‡_ƒ@Žq;Y€C Ô0@˜æù@Žq¼‚Ö(€B“ŒB@(@ŽtÂõK‘BÝÐÔ@võZ@ŽuL¡>É@C*ô@±Ñ@ŽuÝâå\ÀBÀ(@\†ì@ŽvgïÖÝB¤÷ @;Z«@Žvô¤B‰ÀB’á*@463@Žw’”CBº®@–ÕÒ@Žw”OSDB”¸@Ws&@Žw˜ÜKB´Žj@J@Žw›# Bæ*‘@”¨ @Žx AÂbBŒ|2@83]@Žx$κ,€BRC@@Ò1@Žx'6B‘X@1k{@Žx¥Áxû€B¡Â"@M @ŽxªNpÆBèII@Ž-G@Žx¬”ì«€Bs>4@XŽ@Žy3™"›BµI@).@Žy5ßž€€B¦»Ô@uÝÓ@Žy:lÙgB±t<@A«"@Žy»ÀÙ™@Bwú3@;[@Žy¾U~€BŒéÌ@'ƒE@Ž{Øô¬.€BƒZQ@9¤@Ž|a B»­Ø@kþz@Ž|cb›ö@BªMÀ@:€c@Ž|cb›ö@B°JÎ@Lq†@Ž|e©Û€BHm¦@Q;@Ž€‚·BBó@%ê@Ž€!Åþœ@BŠH/@]†@Ž€&S9‚ÀBªdñ@:n@Ž€§EøQ€Bv¶´@-î@Ž€«Òð@B¶‰o@N‰µ@Ž€®l€Bå}þ@Žô*@Ž5¡ñ@BíÇ@Ï–@Ž7dÖ€B¶tÚ@‘äZ@Ž;ñ¡@BÏL6@_—@Ž¿‹‘¹Bö"å@ì«@Ž„Õ)°ó@C¥˜@•?@Ž„Õ)°ó@C7ë@§´@Ž„×p,Ø€ChH@’Ž@އ΀B¯ƒÙ@YCá@އ“™Açøü?ÚØÓ@އ•Ó~€B{ß?ð9X@Žˆ‚·B‰¡ƒ@5Ñá@Žˆ$ z€Bfd1@Ê@Žˆ&S9‚ÀBªøƒ@Q1@Žˆ§¦ö™@B‰DJ@Jš@Žˆ©ír~€Bs¾@nGé@Žˆ¬3îdB…Ë@Kõb@Žˆ®zjIB­¥¥@B=@މ6¢!G€B¾á@kV@މ;/B‘C®@8%@މ=u”÷€BÈD6@_&á@މÁÍóBígó@záø@މÃVŒô€BNŒ@0Ñt@ŽŠB‹]€@.À@ŽŠ£Z€B6‘]?åBÄ@ŽŠ™žŠºB ŽÉ?ãÆã@ŽŠ›åŸ@BI¡{@r@ŽŠž+‚„€BhHE@ ‘û@Ž‹"'?ÿ€B8ù@J0@Ž‹$m»åBA†Ê?ê†@Ž‹ª¯²)€BˆôÙ@<¢Ï@Ž‹¬ö.BÕµ@]/@ŽŒdæØ0€B§ú*@1qÉ@ŽŒg-—1ÀB…ì\@4†@ŽŒíov€B9v?ÈÚÂ@ŽŒíov€Bé?Ü;6@ŽŒï¶ [€B1‡?òÅm@ŽŒï¶ [€B8Œ @ø@ŽsPBW€B«ãç@2ú @ŽsPBW€B©G@B—5ù@5Q@Ž ¬3îdB„‚á@# ¦@Ž ®zjIBŠøg@%ù3@Ž °Àæ.€BóI@0!\@Ž¡6@ßäB•Ié@JJw@Ž¡8‡[É@BŸb¯@Gƒà@Ž¡:ÎÊ€B‘$²@"y%@Ž¡ÄyÊçBƒò^@ap@Ž¡ÆÀFÌ@B‰@2*5@Ž£^ÕaÀBëÿ@mŠz@Ž£ç^U€BüA-@ʲ@ޣ餒;C Íð@”O@ޣ餒;Ce`@¤•ƒ@ޤnbLE@Bò>f@z<>@ޤp¨È*€C:ä@ˆk{@ޤp¨È*€CÒu@›(x@ޤðxIÀBér@k @Ž¥êfÑæB©bŠ@V‰]@ަ Æá@BŸ†î@'0¡@ަ Æá@B•WU@&Ôí@ަƒ>+Ô€B´éû@FH®@ަƒ>+Ô€B©áJ@N§ð@ަ…„§¹ÀBºÂ¶@K€A@ަ…„§¹ÀBÆ6‘@\åÍ@ާ Æá@Bš¡/@:ºä@ާ Æá@B”’Ò@K@ާ \ÿ€B˜øƒ@&¢@ާ \ÿ€B˜7Š@-‚ä@ާ“îàÀB¡@+•@ާ“îàÀB›@7}‘@ާ–4ÐâB¬Ô@@GªÒ@ާ–4ÐâB¬Ý(@Uæh@ލ¯ëWÀBã]@o„×@ލ±äg=Bÿ}@ŠóÇ@Ž©Çã„¿BØøÇ@c±S@Ž©Çã„¿Bða@Žlè@Ž©Ê*CÀBÞŠ8@y#£@ŽªÑ¿÷@C)'@ÃoÎ@ŽªÔs€B£G]@Fu÷@Ž«^tbÈB•xø@;)_@Ž«`ºÞ­€BÈÏ@þ@Ž«c®ÀBá¨0@ix1@Ž«Øô¬.€B[Ol@¿w@Ž«Û;(BÍ‹T@pÒF@Ž«Ý£ù@BÞãb@mŒa@Ž«íov€BÔ„§@s@û@ެcÃÝYÀCÇ@ Ì@ެf Y?Bн @`œé@ެu÷ÿ @B­ûú@P<@Ž®÷¬þCQ@Šz+@Ž®÷¬þCÈt@Ž7E@Ž®ùóyÿ€C%_~@©Y”@ްªNpÆB€Oï@4f@ްªNpÆBQ¦“@  @ް¬”ì«€BoZ@ Úƒ@ޱ9I›t@BØ?ß´å@ޱ9I›t@B‡ú?ÝD‘@ޱ;Y€B.„@ Ši@ޱÇ!EBZ\€?ü'·@ޱÇ!EBUî@+*Z@޲Òã5AòB§?ÃÌ@޲Òã5Aü6³?Ö—À@޲Õ)°ó@Aí”Ä?ãÔ9@޳_øâ@Bø*Ü@‚e¡@޳b?^€Cµ@ éŠ@޳Û;(BSy@œª@Ž³Ý£ù@B:”b@I4@޳ßÈÞ€B[c¬@Û@Ž´`ºÞ­€B²k9@nÁÓ@Ž´c®ÀB¢F@ASi@Ž´eH”BoAœ@ eõ@Ž´wÝ}>BѦò@\;i@Ž´z#ù#@BÏf½@€d»@ޏ«Òð@BôZš@+ @ޏ®l€BõĈ@Š[@޹8&]€BI\@ Øñ@޹:lÙgB)³@ƨ@޹:lÙgB€™@]…­@Ž¹È¥ÄjBÛã#@€0â@Žº¿ìÓ€B´%\@Wú@ŽºÂ3O€BÓãW@[”u@ŽºÂ3O€BÛmž@Š] @Ž»\Žå*€B­9+@aUë@Ž»^ÕaÀBëÒö@y¥×@Ž»^ÕaÀBôž@…ÜÍ@Ž»a Bß“]@s8¤@޼E͇ý€A¦ip?¦Ü@޼HâÀAä5?¢Š@Ž¼Ê‹BÀB¾ ~@Ç4@޼ÌѽíB¯'@Jê’@޼Ï9Ò€BÙ*@eK@޽lÐ`B°h@ˆW{@޽Û;(B°†J@9M@޽Û;(BÏpé@€‚=@޾cÃÝYÀB¿Fâ@J¡Q@޾cÃÝYÀBÖG@yœˆ@޾f Y?BàD®@~i#@ŽÀ´*ã"€BtB@é:@ŽÁ>7Ô¢€B¹- @b‚Ï@ŽÁ@~P‡ÀBͱç@VÖA@ŽÂâÞàB°\Á@Mš,@ŽÂâÞàB·$ª@c”@ŽÂäUZÅB¯Ø{@;ì–@ŽÂäUZÅBË¿@9š,@ŽÃ[k§7ÀB¨,b@2IŒ@ŽÃñ›†ù€B˰)@Yý @ŽÃóâÞÀBðø'@„ÉX@ŽÄb \K@Bª!Î@+Ô€BÅ©Ê@V;@ŽÊSÕóÜÀC'D@‘‹¹@ŽÊã2Ò€C!Ãä@¢Ù@ŽÊåx˜¸Cc@ Ó@ŽËitCßî@Šl'@ŽËitCÇÌ@;@ŽËkºŽü€CW£@”u@ŽËÊì@O€B·;ì@mµ9@ŽËÍ2¼4ÀBà›ž@‚tª@ŽËÏy8BÀ®Ú@Püœ@ŽËÑ¿÷@B»\-@i*@ŽÌHâÀB·C@dªa@ŽÌJZÈB¡8O@9ºZ@ŽÌJZÈB¹Iæ@[Á@ŽÌL¡>É@B¬!Ê@D‹Î@ŽÌÌ~BB @=÷b@ŽÌÎV=C@Bãs@oó®@ŽÌÎV=C@CÖÉ@–é@ŽÌМ¹(€Bðf…@„ñC@ŽÍT—ðlBª‹ð@NÛ@ŽÍVÞ¯mC>@£¿'@ŽÍY%+R€B¹çM@Pwl@ŽÍÝ ¥±ÀB²˜@U7~@ŽÍßg!—B¸½n@L/º@ŽÍßg!—BÐø&@oöà@ŽÍá­|€BµV3@J8ï@ŽÎ`ºÞ­€B±™Œ@U<´@ŽÎc®ÀB¹Ã¥@M_ò@ŽÎc®ÀBЋ`@o{x@ŽÎeH”B»Gò@OÀƒ@ŽÐ+A/•C K:@™³@ŽÔ‚íâCW=@ŠA@ŽÔ„aiÇC*”@ŠòË@ŽÔ„aiÇC6T@¤@ŽÕ BaÄCùï@¨€@ŽÕ’Ë C9ª¾@Õ ¦@ŽÛr-G€€B©f@1íá@ŽÛtsÃfB•lÏ@+åÖ@ŽÞ{¨xy€B¤ýî@,m@ŽÞ{¨xy€Bšv¬@.C@Žá¶Ò]O@BºýÖ@Wq‚@Žá¹P€B¡†—@:ª—@Žá»_˜5ÀB¥‹@I.à@Žâ+¢-Ü€B {|@gÜô@Žâ-èìÝÀB¹ßB@wÚº@Žâ2u䨀Bºá@UL@Žâ4¼£©€BÎÊ@‰M@ŽâÃVŒô€B¶)Á@b¯Š@ŽâÅÙ€B¨Ìu@9¬@ŽâÅÙ€B¡á@O&È@ŽâÇã„¿B«°{@mo3@ŽãI˜ƒ9BÓ£@\Û @ŽãÖ®0I€BÀ4?@X‹ü@ŽãØô¬.€B®iW@8H@ŽãØô¬.€B·¢E@{@ŽäJ»Á+€B™|‡@^q;@ŽäM=Bê™Ï@§k@ŽäQw÷€B¢L@<ˆD@ŽäSÕóÜÀBÚäO@`å@Žäî1Š€BŸ3„@-Œï@Žåd…ÙéBš•@2¯@ŽåfÌUÎ@B¬ºp@GT½@Žåiѳ€B¹ûX@Pî•@ŽætÅ€BZ6ö@èq@ŽæxŸ¼éC=Ñe@Ô÷@Žæzæ8΀Bó±Þ@‚¤j@Žê:lÙgBÂÀË@J›@Žê:lÙgBÛüo@ Ü@Žëq ÆrB²•¬@;H|@ŽídæØ0€Bš…r@m¢”@Žíg-—1ÀB¬Ùþ@cv%@ŽíkºŽü€B´TÛ@M¿@ŽínMý€BÕ#1@‰Ç@Žï‹5 “Bµ—F@U®q@Žï{œx€BeÉ@+ê@ŽïÂ]€BÓÛª@]O¹@Žðû`ÀB·QO@l@Žð AÂbB¯GV@>ɧ@Žð"ˆ>G@Bœ.À@úM€Aȉ@CÔ@ŽúA@2ÀA™í=?”ƒ@ŽúÅ;ÇvA¤Wl?À;¬@ŽúãôaÀB»xð@F÷/@ŽûÙ¶¨¾BÅ@Na·@ŽûÙ¶¨¾BÒ E@k¦ƒ@ŽûÛýg¿Bºn@W“)@ŽûÛýg¿B¯3Q@ZB @ŽüêÇÐ-€AÙbS?›Y@ŽüêÇÐ-€AÙÖ?º±‰@Žüí.ÀA˜d†?ëä¬@ŽýûØ÷@BŸNƒ@)Ê@ŽýûØ÷@Bª±@Aàã@Žýþs‚€Bª)›@iÜ'@Tù1Ï€Bºpu@@k¥@¾U~€B¥]ø@,jw@¾U~€B“ß@'Ñ@HuEF@B‘Âx@/‰¹@HuEF@Bg‚@:áC@J»Á+€Aº›«?œ6m@J»Á+€A¾Ç¤?¿\:@Ö®0I€B¤uè@0çÕ@Ö®0I€BžJ @3@Øô¬.€B·Ð@WÙË@Øô¬.€B¯ôð@n=Þ@"'?ÿ€BÀõ¼@Zl7@ nMý€B¨Ñ½@4­Ú@á­|€BÞÿÜ@j2v@ãôaÀBº}@Y)@ãôaÀBضn@s?À@æ:ØcBŸ>«@I¬u@ŠràèB¥þ+@@fs@Œ¹ŸéB¼ ê@N|Ù@Œ¹ŸéBÆ"±@n[`@Ÿ°Ú€B©¿@:r@¡ö}ÀBœÑû@>ln@¡ö}ÀB¤ª„@DÉ÷@¤<ù¥€B’éë@?rÞ@»ÀÙ™@BÈFù@N¾@G³›B®ä@9ï@G³›B¢"Õ@7eÃ@Iù€€B·¡å@X‹n@Iù€€B¹'@s“Ù@%h±ÓlB£Â÷@J›(@%jøOQ€B¾—@‚Õg@%m?R€BªŒM@;{…@%o…Š8BÒ^£@„d`@(°Àæ.€BÅ”|@c@S@(µN!B×\é@báã@*U»qz€Bš t@Aâ&@*Xí_ÀB©+¨@o×4@*ZHiEB¥ê@5ž^@+Ê*CÀB§ft@=¢è@+Ìp¿¥€B²°I@J­}@+Ìp¿¥€BƼ@jÍÝ@+η;‹BŽx@6§Æ@,Û;(B¹Â.@U]}@,Ý£ù@Bœ1@/Óg@,Ý£ù@B°.Ï@k¡@,ßÈÞ€BœN@7¤U@-âÞàB™ê@KH@0¶`ÀBf ÿ@Ö@0·Ùd@B3G@dÇ@1œFæÀB°fž@8šØ@2æýBÒ F@m€€@3Ê*CÀB™^Ù@(‚@3Ìp¿¥€B­)G@W'ö@3η;‹B†c8@7Î@4Û;(BÑÊÙ@fc²@4Ý£ù@B»ý¬@R!Ž@4ßÈÞ€B¢ ×@@+ @5qkÕ€BÃê@_·@5qkÕ€BÃ`@oz:@5s±ƒ»B¾Ú‚@I&³@5s±ƒ»BºW¯@QÄç@5õÇ€|€BÚ(å@^2@9ÖLîæBçêÊ@xãP@9Ø“­çB꩘@‹/@9Ø“­çC„4@¢GÇ@9ڌԯBµG`@eý @:&´7Ê€BÝ:>@…¢@:(ú³¯€BÕ=@^#l@:¶q_€BÎê@Rl@:¶q_€Bë%g@ˆ_ @:¸·ÚíB¶ @\ë@:æ›Öª€BÐYŒ@`Sa@:èâ•«€BÕs@i=C@;?¼Ü€BÞH(@e%c@;BŒÂBêÅ@…š@;sPBW€BÍð£@UoÆ@;sPBW€BÖ‡'@tü@;u—X€B¯8}@i@%@;ÈDÆ"€BÕQ²@\Ȭ@;Ê‹BÀB¿(j@cYÉ@=lÝÌïBÙ5¨@}`Ù@=o$HÔ€BÛ;¿@b±@=o$HÔ€Bàc›@x6@=qkÕ€B¹¼¬@v´F@=餒;BÝ“@rˆ+@=ëë @BÕÉ™@cK @=î1Š€BÜá@˜3 @A¡40ÀBVÍ@-@A¡40ÀB¨ @bo @A£zýB†OÖ@,Ú@B*3ÀB¶ÙÅ@Ký‚@B,Å®ëB”D·@(t@B,Å®ëBŠÆë@&y@C=Ö“?B°$@Bn@C@$@BªbU@@Ú@@Eö(~ÄB¾bÒ@DÅ—@I¬3îdB¥A–@/X@J)[±÷@B§Xô@D*ˆ@J+¢-Ü€B² @@Bž™@J+¢-Ü€BÁ³@xMj@LUZs3B¬È5@8†@LUZs3B³Ñ@nŸõ@Nz#ù#@B›f%@Gdž@R(8t€A‰|u?€â @X´‡{€BÇåÐ@x˜@Y‘IˆÀBúV\@‘†I@Y×ÅnB÷}@›¯`@ZHÖCŽB @³å@ZHÖCŽB›qX@D^@ZÑ^µ·ÀB¸ñ@?B@ZÑ^µ·ÀBËš@dÇ;@[Yçjý€AÖ?š×@[Yçjý€AçÖì?ljz@[Çã„¿AàÛÜ?©^@[Ê*CÀA¨Î?Êüz@[Ê*CÀA“ ?›Ê2@` Ê2€B«È@OS@`S‰4B²ì@?W¼@aÊì@O€BM?÷…/@aÍ2¼4ÀBqP@ñ=@aÍ2¼4ÀBiÜ›@ÿ@b÷KÿÒ€B rž@-“@b÷KÿÒ€Bš @1Æ@g’”CBŒ„*@o‹@g’”CB”‘@G@B¤ õ@I^B@h£Ûû]ÀBœ>5@Dýr@h¦"wCB8à¼?äÇÒ@h¦"wCB! Í?÷þü@h¨hó(€B¨ä‹@cHZ@iÛ;(B–Ã@)ºZ@iÛ;(B‘º«@, ³@iÝ£ù@BŽ›˜@'Χ@iÝ£ù@BŒNl@@o¨@lW ï@BÝM@+u÷@l^tbÈB‡V°@FvÅ@q¼!×áB{•@ú@qÍ2¼4ÀB›|ÿ@(2j@qÏy8BvÊ¡@?÷@qÚy+„ÀB”xÜ@.Q@qÜ¿§jB™H‚@1ìá@qÜ¿§jB›9ž@GfØ@qß#O€B ¿Ì?ýÚQ@r_—ãÖÀA‰:6?†±î@raÞ_¼AƒJV?Ÿæ@tVÞ¯mAóL@ k­@t]²f9A«)U?Çôª@x¤<ù¥€AÀYÞ?›ÈŸ@x¤<ù¥€A¦«?Ÿ½j@x¦ƒuŠ€AÁ:©?º „@{È¥ÄjA¦ð@Lð@{Êì@O€A =ý?çlÎ@|’iÕ¦€Bg½¨@N­@|’iÕ¦€BYš@$й@€¬ö.B°l@\°:@€¯<©ô@BŸWÑ@*!@€¯<©ô@B«ä@MM@¯<©ô@AÏÄÇ?Êìú@±ƒhõ€B“wþ@6òk@³ÉäÚÀBïI@Ÿù@‡ÜšÀBä@&ò„@‡#YÁB–®@Oœ™@‡’iÕ¦€B¡æÕ@Q_l@‡”°Q‹ÀB¢/ð@iö@ˆ*3ÀBŒ¸µ@+8v@ˆ*3ÀBvuh@Gþ@ˆ,Å®ëBÙ ê@b†ì@ˆ,Å®ëBõp€@É@ˆ¯ëWÀB¡Ê”@LØí@ˆ¯ëWÀB޵ @6âz@ˆ±äg=B¬Ò×@6AÕ@ˆ±äg=BÀ»ò@_ö×@‹Ó¥t¹Bž4ÿ@1Ä@‹Ø2lƒ€B@<þi@‹Ú\U‹Bpbo@o l@íov€B¨Õ@Z^l@å™lB¼ì@I"â@•r‘7AøcX?êÌ@¯ëWÀBÐ}R@V¬÷@±äg=C |)@œ¿˜@‘°_ççBåß@s @‘·3ž²ÀBÆÞ¶@Œ¤Â@—¤ÿ9P€Br[?áÜ8@—§EøQ€BÆ«@Lšþ@™-&­2ÀB¨@8«`@™í.ÀB§H´@hÕ9@™ïU B¯Çñ@Sài@™ïU B¶f¥@PÑ@š8‡[É@B”^Á@0Ï@š:ÎÊ€B¿,¡@O}š@š:ÎÊ€BÏ£@|LÛ@š=–¯ÀBŒÓ@/•!@.Ië%€Bš3@Eã"@¶Ò]O@BØ­?@ŠûÆ@Ÿ£»²€BI9¶@@Ÿ¥`z´Bö;Ô@w@5@Ÿ¥`z´C }0@œ]À@¡î’ËiAÊã;@ ¤ð@£•Ó~€A­it?Î0@£•Ó~€A¹w?¦­¼@¥/ *ЀB å@?Î%@±m  šB‹û@Ä @±o戀B“‹@DŸ®@±o戀B€b@)G@±r-G€€B¹¦ù@iw@»½ânBÂØ»@NÂÂ@»½ânBŨ{@{5@» ¡oBû9@ˆåà@» ¡oBí?%@‚÷ù@¼¢W|€B›5 @+\p@¼¢W|€B¢i@iS@¼¤ž;ÀB‡Îû@&åâ@¼¤ž;ÀBŽ„ž@,¥ß@½*à1M€A¼†ˆ?‘\t@½*à1M€A»CØ?á´¢@½-&­2ÀAÙ¾?Ññ|@Ǩhó(€B4{@5Ü¥@Ǫ¯²)€BÓG@Ýì@Ý*ñ¢€BMá"?ý»•@Ý*ñ¢€BZ1©@ƒ^@Ý,d°£€BpÞÁ@5r@Þ<³UL@BœPF@57Å@Þ>úM€B¡Šw@+a@ÞÄyÊçAÍDQ?¹87@ÞÆÀFÌ@Aå“7?³J@Þɱ€B 8Û?ß©m@ßL?ýfB¹ãö@d‡@ßN†¼gBÀ“R@bÄç@ßN†¼gBȤ;@lÆm@ßPÍ8L€B¼¢x@I¸@ßÓ¥t¹BÜÖ?ö0D@ßÕëðž@BAöñ@R?@ߨ2lƒ€B˜× @&ù@àj6RÂBªY?»x£@àåÙ–ÿ€Aâ ?§LM@àåÙ–ÿ€AÀ€?¨vÉ@àè V€A÷ÜÆ?Ò5ø@â{G7B Åè@8r@â{G7B–9R@=ö^@â}²û@B»ˆü@Jî|@â}²û@B¶8@UÎ}@ã0ꣀB«±7@A @ã0ꣀB£‰ˆ@IZ)@ãwfˆ€B´Í@CË÷@ãwfˆ€B´¥•@S])@ãŒX^…€B¥:8@4#F@㎞ÚkB™&d@eåX@ãå™lB˜£Ä@=!y@äBBªŸ@9,R@äˆø€B¢1t@l¿ƒ@äÏ Ý€Bâl@BBS@äi…õ€B©d÷@8†@䟰Ú€B¤@nÉ@ä¡ö}ÀB§Â‚@I­Á@å%ñø@BÀÇ?@i¬¨@å(8t€B°‹@Ad@å*3ÀB÷5@>Q‹@å®Û«¬€B«H€@W¾è@å±"'’B£:@5Ë@å³h£w@B—c«@9<¼@æÉ±€B®Ÿ¶@A"Ž@æËM>—Bœ°K@?Ø¥@æÍ“ý˜B¡ªV@fž¡@çQw÷€BÀˆe@YÐ @çSÕóÜÀB‹ÑL@.UÅ@éw|~ö€BœEˆ@<Â@ê}‰>!€B“—z@'~@ê}‰>!€BŠ@)°-@êò¾ÄìB›ýþ@%¸‘@ë{G7B¡å@*ë@ìQ¾B­]l@; ú@ìJÍ£€B§V@R÷@ì‘IˆÀB²Pk@c¢Ó@í&´7Ê€B OÑ?Æb@í(ú³¯€BD=@0/s@í+A/•B+O?ùÞø@í°_ççBš@+½@í²¦cÌ@B«ïÈ@‚Kd@í´í"Í€B¢W@;º@î9ª™¼B Ó¼@4¸Ç@î;ñ¡@B¦Üj@N@@îÃVŒô€B³Ø7@NÔ,@îÅÙ€B³X@IáÎ@îÇã„¿B3ƒ@/IÃ@ïÔg´dB¨×@ZqÖ@ïÖ®0I€BÁä@P§&@ïØô¬.€B¢[+@C®@ïÛ;(BÂJÕ@€d@ñy»0€B–†û@3\î@òkYµBL\?è×¥@òkYµBÜ+?Õós@òñ:ˆ±ÀB^kZ@w¼@òñ:ˆ±ÀB8}˜@ òE@òó—Bu×Ë@q@òó—BpÑ@W@óyÂúÛÀBN*ý@µ@óyÂúÛÀB+~O@c@ó| vÁB[Sg@¤ø@ó| vÁBKe»@-@ôÆNM@B†¸@p½@ô Ê2€Bˆ@~@:Ž@ôS‰4Bš1@>ÓØ@ôœ§FJ@B`lü@å~@ôžíÂ/€B|Ép@(@ô¡40ÀB`¤f@™ö@õ¯ëWÀCi@¦¾@õ±äg=C4ßë@´œç@õ´*ã"€BÊZ@hI@õ¶q_€BÕHC@†Eo@ö:ÎÊ€B&/B?Ør†@ö=–¯ÀB:þ\@3@ö?[•BAÄú@§]@÷L¡>É@BVÖ ?ýÛn@÷N纮€Bf@°@@}@÷Q.6”B^Lc@Aö@÷Ôs€B]ȱ@ ´@÷ÖLîæBz¨Ñ@„×@÷Ø“­çBNõ´@ ”§@ùz#ù#@B÷ƒ@.6@ùìLOƒ€B†Þv@:¿4@ùî’ËiB»™?ÍÒ@ùðÙGN€AÃ?Фã@útÔÁ­€BÈ“@Y@úw=“B/<ò?æa·@úya¹x@B"÷=?ûyò@úý]vó€B>„¶@²’@úÿ£òØÀBTŽ@d@ûên¾B3Žš@RÖ@û΀B<(’?è\æ@û‘F—³ÀBC”@ öÏ@û“™BH‚Å@3©@üi…õ€BŸ¼?Ê;›@üŸ°Ú€B jf?éw@ü¡ö}ÀAã©?Ã@W@ý&´7Ê€C<Á@‹bH@ý(ú³¯€BØKÚ@…ÈŸ@ý°_ççB›+@)Î@ý²¦cÌ@B :ê@%‚@ý´í"Í€AÍÆ?ÁTv@þ: Û€B*û?ß³B@þ˜ÒêB9õx?ü4‡@þÅ;ÇvBÈ\m@UX§@þÇ‚†w€Bí{@Ž­@ÿKB°î@@#S@ÿMc~t€B¶?Å@jïg@ÿÕŠ¯:ÀBªÆ¿@8`€@ÿ×Ñn<B¦¯B@‚vÓ@ÿÚê!€B”io@1Ûä@½Ô<<ÀBuF£@#[@ƒœÓàB¥T@5¡Z@Çá .ÀBžˆÝ@6v´@ÉJ!€B²G÷@RÏš@Ê'©¢B{˜l@b·@OFaôB©b@?ï¢@PiŸæÀB¬;½@M@¼@QŒÝÙ@Bzî@@’øü B¡®¡@D“É@”:@B–‘²@.0±@•?™‚àB…—Z@'Ó¿@–b×u€B±=“@v˜@×mÕÖ@BŽ¡q@(@Ø‘ÉB•ñß@8bg@Ù´Q» BzŒ1@.@C­ä B£´q@E1D@g e@B¬Í™@Aµ @ŠKWàB…âm@'n/@­‰J€B¬ÏY@tû@aÛÅžB®Õé@TMô@bÿ%€B³æ,@GV@d"c@B‹‹µ@1Cc@eE¡àB³" @q\î@¤ÌAœ€B†0@0À@¥ï B£a…@8ž@§½ÀB„/å@+•á@¨5ût€B”­%@W§H@뇗H€BœW­@AvO@ìªÕ; Bœ‡8@+¢@h~Û¸B«/Ë@CÓÔ@i¢ªÀB±@Amv@¬’•©@B@7@­µÓ›àBÂê›@Q•Ý@ñhE€B‘˜ª@––@ñhE€B‘PÐ@@Eþ@ò‹Í8 BF3ó@ ÂÊ@5¬ÈZ€B¯˜²@8fŒ@5¬ÈZ€B¥@OØA@6ÐMBÁxð@^åë@yño`BÂ}@IP‡@yño`BÂ’·@j{Ý@{?bBƘ¯@`M/@¾5\@BiÞá@DÃ@¾5\@B`ªÜ@"› @¿XšBµ É@P–ž@Q°àBÍd@Yù@tíø€BÇ É@qü@4Xé¶B~±£@”)@5|'¨ÀB…@z@/cE@5|'¨ÀBf{@gGà@6Ÿ‡)@Bs•@ ,Ø@|h€BUë@#S@ 5¬ÈZ€BÏMI@Wíò@ 5¬ÈZ€BØ9ý@ŒÀè@ 6ÐMBêM´@ƒÐÂ@ zR!DàB„×M@½Ï@ zR!DàBˆB"@Q ¢@ {u_7€BˆLW@/uq@ {u_7€B{Ò@ý&@ KhqB¦¯Æ@2‘ê@ KhqB•à~@-k¥@ ‘Õ¾Bœuç@7Õ9@ ‘Õ¾Bœ‚†@Hƒ¥@ ×Îõ«àB†Q£@Òé@ ×Îõ«àB€–u@ àÆ@ øŠÐ B[#@€þ@ êQ@Bfÿ@ ‹n@ êQ@BE0Œ@ö”@ _4)ã B›ÿf@6ùß@ `WgÕÀB¬Á¯@>ak@ az¥È€B¸³@ƒÆÅ@ ¤ÌAœ€B‰IC@O”@ ¤ÌAœ€Bˆl@hК@ zãÀ>@Bf?ÿŒë@ |þ0àB óœ?Í|@ |þ0àBk1@¥œ@ }*<#€B7]Ë@Ÿs@ ¿ê8þ@BZŸö@x%@ ñhE€Bt1™@ü@ ò‹Í8 B‡Ü™@"?@ 5K¨„àBsÜ@?£@ 5K¨„àBŽ =@VNý@ 6næw€B uB?ôK#@ 6næw€AÿÒ?ÂV¬@ y'ÀB7È?ÝYO@ y'ÀB4b'@)Ah@ z³A€BPM@f8@ z³A€B7©?î @”‰€Bä”ú@xêK@·w BãP/@p,Œ@Cå‘Ï€B?&Q?ýuÉ@EñP@B å?¬ŽÞ@’g]@B·±L@GB>@“Š› BÆso@q/Q@ÓAºÅ@Bdpo@’ @ŸÿÀAø6á?å«Á@6Ýò€BïQ?æ­%@6Ýò€BË)@yê@Zå@B5ä†?ó|»@`éÏBý÷@õ@b fOÀB¸é?Þöñ@b fOÀB"k2?ô÷4@c/¤B`B6Nž?òe@2Bìô€Bþ9@®Z@3f*ç B¾‹W@\+¶@çö-àBBÍ?ùÌ@çö-àAÑA–?Ñì@ƒ 4 €Bu?»½@@ƒ 4 €B#Ò@Üœ@Q°àB¡j @9Â@Q°àB¤Ø?@OŠ@tíø€Btl@“£@tíø€BoëD@È*@JéÇ¿@AßUÅ?™äz@JéÇ¿@Aº»f?¦Æz@ð@@AëGF?¤Õ„@ð@@Aðól?¼ÅÊ@Õ'8cBB¬x?äñ=@Õ'8cB8Ýè?ø“ó@—Ü: B¼Ê@Gf4@—Ü: Bȶ.@tÉ`@»,ÀBÒ¦ @xià@Uéx AÙ¯q?®Ž@W ¶ÀAü3??¬ÎF@W ¶ÀBÖà@.@È ¬ÀB¶×¦@G57@È ¬ÀB½¶´@_Ÿ@žëIŸ€B¶^Ú@M´³@íþ³ß€B ?¿Æe@ï!ñÒ@B7§®@–@ï!ñÒ@B# –@"ùQ@ðE/ÄàB'²@œc@6næw€Bø?Ï*|@7’$j@B%od@ý@8µƒêÀBZ«ð@'ƒØ@:Ë€¬@AàŸ©?äv@;BÚc?½éâ@;B/ª4@.<@|ù¼ÿÀAèù?î"`@~úò€BSÛ?¸A%@~úò€B ?ö÷ý@6l³€Aç%Ð?Ç9Ÿ@Yª¦ AÑÒŽ?œwš@az¥È€AÚÍ?ÉÞ7@bã»Aôø›?ªGN@bã»BTô@ŒL@¦â>^B™ˆ<@Sl@êdYUÀA¥Õò?Ý“@뇗H€Aè°ø?ŸÝ3@뇗H€AõÓí?ÐŒ‹@/Ëñë`Bsý±@F™@/Ëñë`B†c@%¡f@ucèÀB±±V@8”Ý@ucèÀB¿~ù@YOã@»î¾ŸBžƒh@'u@»î¾ŸB¯ÿ1@Kq\@ĸ;@B¬%@3•)@ĸ;@Bºu@TÚ@EñP@BªÎ\@3"¯@EñP@B¹úŒ@_âÁ@ˆ»‹kÀB¥×§@5…¡@‰ÞÉ^€B§ h@>Y«@ÌÿÄ€ÀB‹ó«@Q+@Î#s`BoU£@!-@¦þ³AñS@ ë…@§C^3€B%ÆD?Ì+0@§C^3€B" W?ðbö@î/3@B °˜@c´J@ïR’„B±"Ï@9v´@5¬ÈZ€Bx×Ê@BQ@6ÐMB _Þ?³ÈÁ@6ÐMB^?Øÿã@ûÖ B*Ã?çµB@üù¼ÿÀB nÍ?ÕüL@þúò€B$ãã@|³@DwRVÀAðõ¯?¿b@DwRVÀAÁi?¬ðt@EšI€B8À?ÅW@îñr®`BL|?þë’@îñr®`B›¼?äk'@ð°¡BP€Þ@ÙE@ 5K¨„àB87€?ì-¾@ 5K¨„àBX?ÚÛ@ 6næw€BG…?ÿ“Š@ ®Gr•@B„y@&“Ÿ@ ®Gr•@BU6@1èd@ ðuÐv€B>v?âþ7@ ñ™i@B:Àe@)(@!Ln%‡€B_@¹¡@!Ln%‡€BM±@ ¾@!~úò€B':?íhà@!~úò€B&•æ@Õõ@!ÂaU•@BÞ‰?ÝÛ@!ÂaU•@B92?ôj±@#X/óó€B½?ûqÁ@# ÐÇ=@B…á?³˜l@$b<ås€Aý• ?Õ‡r@$c`#f BÅ?ëöË@$dƒaXÀB,]C?ïâ‹@%KJç”ÀB`«@Rð@%KJç”ÀBVp@ Àè@%Ln%‡€Bl®M@€E@%¸µƒêÀB3¨ ?îç`@%¹ØÁÝ€B,Ë`?íû@'¨5ût€B“¥´@4ð@'©YZõB™þ@'z¼@'©YZõB”ÛÛ@PÃ@'ðuÐv€B¡_@.ÁQ@'ñ™i@B4¯@<¡ˆ@(6Ÿ‡)@B‹†w@<ñ@(6Ÿ‡)@Bp p@"8ï@(7ÂÅBv @ ½@(7ÂÅB{¨@&¿º@(|h€B8EÁ@ô™@)vèEßBÏv@S[y@)», àBÉ€?ÂE@)», àBÈS?Ú;q@*ĸ;@B›Se@$a9@*EñP@B¸Ü€@?c$@*‰M*e B‚ˆ–@5 @*‰M*e BŽÇ{@)©@*Í‘…Bס@Z¬Ú@+tžG€BÆ•G@KÊæ@+tžG€BÏñ@cº€@+ôqJÕÀB³ â@déš@,®Gr•@BiG&@Q~@,¯j°‡àB‚¯–@[´@,¯j°‡àB†ŒO@HV´@,°Ž€B‡E@"³5@-²ÏÛ`B3ã‹@Ar—@- «A@BhœM@0@-KhqB9ˆÇ@;Ùà@-N„CÖàBUùq@˜@-Ž;c“@Bq|$@KOã@-^¡…àBŒ´í@ƒEÒ@-‘¥k@B‰2û@l‘6@-’È|ëÀB‚ùˆ@(Š@@-ÓÓ{L BzøÂ@IÐ_@-×=5$€B•"@4P/@.\+nRÀB¦ @BÜr@.]N¬E`Bót@:#Í@. oÈõ BqÎ@;{[@.¡“è@Bœ*‰@8®É@/®Gr•@B¨k@9Xæ@/¯j°‡àB¸í•@bÂÊ@0õõ‡ B¼ìw@Há/@0õõ‡ BÏK@rö¶@0÷ÅÀB¨ü@J{î@1: b@B²,Ä@>ã?@1: b@BÀEâ@dæ!@1;, àB˜q~@;±¼@1B5¿ÀB&F•?ÌÍ…@1sߊN€B©(Ï@3ô@1sߊN€B»Òÿ@g¤8@1·ÂÅAöD‹?ñâ@1¸æ€Bp‹?Å.Ø@1¸æ€B#M@ ^È@1þúò€Aïõ¨?ë¦z@1ÿ@8åB pê?»NM@1ÿ@8åBÑí@7ô@2BaU•@By?÷/ˆ@2C„“ˆB4³w?ÛŒë@2C„“ˆBM̵@ ÷@2†¥Žª@BJ‰@J{@2‡ÈÌB$;?Ím]@2‡ÈÌB=£@gý@2É– ¨ÀB"¡¶@$ÿ@2ʹH›€BR'‡?õhù@2ʹH›€BY…Á@yO@3£xbøB²‹@<4”@3£xbøBÂã@iµ@4±P.% A±Oï?Ë=d@4õõ‡ BIÎË@Ï)@4÷ÅÀB]à?¶5œ@4÷ÅÀAð€#?îƒ@5:j`ÖÀAÞÂØ?ܾƒ@5;žÉ€B+ß?È…@5;žÉ€B!Z@_=@5¹Á@B®/ˆ@9E9@5¹Á@B¾ÐW@i^ @5¾–ZYàB‚Ýæ@/…^@5¿¹˜L€B¢+¢@-û©@5¿¹˜L€B¾´ª@fßÂ@5þ®»yÀBuçÎ@(˜@5ÿÑùl`B :@´ú@5ÿÑùl`Bœ @HAÿ@6BÂSÜàBo×^@&Cö@6Cå‘Ï€B5ÊÝ?Ý:y@6Cå‘Ï€BGò5@Š@6妟K€BH} ?ùwS@7Š› Aöç?ºá½@7¤:¢£ Bt%Š@ u!@8hÝp€BßE@Ž]p@8jdYUÀB¿!Ö@HÇ@8õ«ÀAÌ’=?Яæ@8ÄØPž€AÖ\š?¶'¦@9 M*e BÇúó@vÈÅ@9 phWÀB»Î/@r2#@9 “¦J€BʱÕ@V®C@9M‘…BfÐß@!Íd@9N´ÂúÀB{c[@-Õc@9N´ÂúÀBlrR@NÌW@9OØí@BŽ„@%7›@9“)œÁ`B E?î¿4@9”LÚ´B/®Æ?ò>@9ħÑz AÈ#?Ã2@9ÅËm@Aô½°?·ö4@9ÆîM`Að¾?ïw}@9üh€BÁ=—@_)Ì@:B0´ã€BÌ]@Z¾ƒ@:CTd@BÊC÷@g/Ü@:…Q°àBÊï?Òƒ^@:†tíø€BÊl?Ög@:‡˜My B+–§?ÿ-@;¤üÀÀ@BÜ‚@u×^@;¦þ³BÍVu@SÑÝ@;î/3@BAOd?ö´·@;ïR’„B]ƒÙ@žs@<»žÉ€BÇ(ï@^û@<¼°Ü¼ BÎ@b=Ñ@<½Ô<<ÀB£Â=@EI @<ù_bvBbO?Ø0U@<ú‚ hÀB)Ž,?â¹g@<û¥ÿé@B94$@ 3©@=ð±¾@B¸È”@Cü@=>ÆÙ} B¿S-@Nù@=?ê8þ@BÒU>@ry¼@=I4êÓ@Bjl?Æ@Ñ@=€õ7_BH¨ @þT@=‚uQÀB€Ü@+g@=ƒ;³D@B‚1Œ@)«G@=Œ†e@Bk@­û@=·ÂÅB]÷ @ŽÉ@=¸æ€BwÚÎ@|_@=º b@B„Äà@(ùÏ@=Ôúp`BdÚÉ@§ @=Õ'8cB[zª@S@=Õ'8cBlk-@™é@?]-!€B?؈?÷ý?@?]-!€B7š«@ =â@?¨|P B]T¥@yp@?©(ºC@BfˆÜ@(…Ï@?©(ºC@BDl@iÛ@@}ZÜÕ@B'ýS?Ó@@ºûÿÐ BCR$?í`ž@@¼_PÀBL¡@›€@@¼_PÀB$ŒŽ?î|¯@A^ñ7BZwI?û¡<@AIJ!€B‚ÇI@%´@AJ'©¢Bƒnš@oø@AJ'©¢Bƒ¼@=éŠ@A^¡…àB¡Ri@,:Ž@Bãp B“{@# Ù@BL ±àBÜŽ@‹Pü@BNS£% B¶(™@?Ð @Bßx€B2J@RÁ@B‘¥k@B37i?æÜ]@B’È|ëÀB,»Ý@ Is@BÏváÀBŸT?ä²@BК@˜`B;IB?üEþ@Bѽ~‹B.êf?øû@Cb fOÀBDp?ì4@Cc/¤B`B54d?û§T@C¨—JBm"Y@þ¨@C©ºzÊ€B~@Ž2@C©ºzÊ€Bk5Í@—À@CªÝ¸½@Bh¯@GP@Dwª…ŠBµ@CvÉ@DxÍÃ|ÀB¬@NHí@D¿‰(ÀBàß@Â]@DÀ¬W`B…¯@.°`@DÀ¬W`B_ø•@'@E9¨!+ÀB˜;>@4ô@E9¨!+ÀB•Æ@F/ý@E:Ë€¬@BŒª’@ð(@E:Ë€¬@Bd‹ê@-f@E~®»yÀB!ö1?Äfª@E~®»yÀB?Í$¯@E‹ÄFü@BºÆm@Hµg@EŒç„îÀB¯Óˆ@NÓ5@EÒ°=ZB­›?Ñ´@EÓÓ{L B#J?û š@EÓÓ{L Aü K?Ó‚V@F$õ’ÀBtRœ@ S@F[8¯ƒÀB>i?ß<›@F…ãp B7©?ù@F‡®ÀBI½š@HZ@F‡®ÀBDe6@Þ+@Gb fOÀB¦j@N‹e@Gc/¤B`BÒ»@{)þ@Hu3hóBΞÊ@YHª@H¿ê8þ@B­Šs@:áÚ@I 4 €Aë-/?ÒP@I.r@Aè†ñ?¼š€@IQ°àAßV?Ì}í@IJ¹H›€BŸá"@>jQ@IK܆ŽB‘Çå@%Ög@ILÿÄ€ÀB…v @#¡Q@I‘D# B°ì@EçÍ@IÕˆX8€B–?É€N@JÌ‘M€B£Fy@39u@Kaz¥È€B®8Ü@N&@Kbã»B¢¼@5ªø@KcÁC;ÀBwôC@š@L6ÐMBgó@ ŠU@L7óD?ÀBˆIm@/õ@L7óD?ÀBnšm@ Ô@L¿(á B†Gë@«Ò@L¿(á BzG¿@Ž‚@LÀKXÓÀBCÄ@^tó@M.r@B”<½@éK@M.r@Bˆ>5@ Rœ@MQ°àB”Q÷@d'ú@MKJç”ÀB˜Ù¹@+Eg@MKJç”ÀB‘„@2s@MLn%‡€BDQ@(²@MLn%‡€B}üµ@'À@NŒç„îÀB}+@f@NŒç„îÀBrÄÎ@ Ä@NŽ äo€BÉ[@!|@NŽ äo€B€ìÅ@5™@NÐiŸæÀBmà~@@NÑŒÝÙ@BŠj¥@$¨‚@NÒ°=ZB‹ˆæ@-È@Pj”Øy BgR@¾²@Pk¸l@Bâ3œ@q¥/@PlÛT_B¸Û@Wå2@P¯›Q9 B€ÊS@&w`@P°¾,@B U’@/[@Pýì{ΠAÑU?´‘*@Pýì{ΠAЀÄ?õÝ@QGîÀB¡þ‰@6¯!@QHB,`B›sï@6¶¿@QHB,`B¢Á”@JCÙ@QÏváÀB†™N@>O@QК@˜`BUgÎ@ „Ó@R^¡…àAÖ—?ÂÃ"@Rßx€AÕ³³?Å3@R¥k@AÄS?Ãß]@RGOm5€B¢ @G[Ä@RHr̶Bd"@'Û@RI– ¨ÀB‘@'Lì@RJ¹H›€Bd×ÿ@SLÂ@R…²ÏÛ`B°ÚÎ@UW°@R†Ö/\Bš}Ç@* ì@Rà&è²B³ÿ@>R@Rà&è²BÝ>@™@Tx<$ƒ`BS_?üQÛ@Tx<$ƒ`B@YP?ü$O@Ty_bvB`Žv@Љ@Ty_bvBA=@$¸ @T¼€]˜@B&xJ?̓Q@T¼€]˜@B>b?̆ƒ@U^ñ7BþÅ@¥e@U^ñ7By׉@â“@U‚P·€Bw-@éÑ@U‚P·€Bc‚•@}@UJ'©¢BckÇ@ îÙ@UJ'©¢BVþ¤@ ¹²@UN´ÂúÀBdð[@(@UN´ÂúÀB[9`@)bJ@UOØí@Be,…@ŠY@UOØí@BQ®O@~@UŽý°`B,!?Ì|c@UŽý°`B¹~?Ñ¢ƒ@UÓcðz@BC`a?ÿ?}@UÓcðz@B:ÁÂ@JZ@VŽý°`B†;@>Ä@VŽý°`BVŠ@ðþ@V á1Bq÷œ@|=@V á1Btêç@Nœ@WðuÐv€BZ ê?ýmÛ@WðuÐv€B:4 ?õ([@Xò‹Í8 BXœ¿@-R@XôÒI€BÏw@mcª@Xõõ‡ B¾„m@_*@Y7óD?ÀB8$@¹s@Y:9á³BaJ@ a@YP€ Bî¾?è%@Y|7}TÀB@t¬@Y~~ÈBsz“@å—@Y¡Xº BxJà@G!@YÃTd@Bfh¹@Ùs@YÄwRVÀB.§f?ô‹Á@\iAc BV>@Z@\jdYUÀBo 8@3I@\jdYUÀB@ƒ<@%^h@\k‡—H€BcC¹@³-@\®xGBQ @+²@\¯›Q9 Bd½@Vë@\¯›Q9 B;ëí@Còo@\°¾,@B^h@ 2ø@\ól1€B·ë@LY@\ô@ª$ AÅÐ}?ÖðZ@\õcèÀAÓ”÷?¢£¥@]8Td@B»’®@ux÷@]:šßú€B¿Ã[@Iµ•@]|˜¾¸ B½\Ï@v-@]}»üªÀB–°^@@™ @]~ß:€B‰S'@ŒÅ@]ÃTd@B²?@DÅï@]ÄwRVÀB¾M@[ê:@]ÄwRVÀBÊ¡b@‰ôä@^ ç„îÀB[‹å@£ð@^K܆ŽB¶ð@@Q¶þ@^LÿÄ€ÀB¥ž1@;Å@^ŒUåõ€B±¤.@Akµ@^y#è@BÆoÛ@lÒ@^y#è@BÍ.Ø@~ÈÒ@^Ñ+¾ÀAÛ]&?¥H€@b% €B‹@Ú@ˆ@eEšI€B^$c@7@eEšI€BW^>@Œï@e}‹[ùB…[g@¸J@e~®»yÀB7@Ax@eÂÂSÜàBc˜£@Ò@fNS£% B^¹@.K@fOváÀBCÕ?ü®@f“Š› BŒÏ¥@5%B@g¢$¥á€B)¾I@Sw@ht¡Éù B\õ+@™5@huÅì@B=Ϲ@7a@huÅì@B?Ç«@"f²@hvèEßB8 Î@ =û@hº9á³BZsö?þ!Ÿ@h»]¥ BJ_o@Þj@hÿ¡Xº B@ü?æä@iĸ;@B2F@…Q@içö-àBe¡@BÌ2@iCå‘Ï€BX”l@ï@iEñP@BUZ›@!Mù@iEñP@BWwE@úø@iF,/BÀB$el@@jì,€B8ü{?ñ’Ÿ@j j@B;Ò@ æÉ@jLÏE]BIÓ@QÃP@jMòƒO Bu]Á@3Õ@jOÁB@B_ÅŒ@¥n@j‘Õ¾B_ëo@ Ûè@j’øü B\Û@2@@lnñr®`B¡>@2…ù@lp°¡Bµ9_@a­‚@lp°¡BÄÐ?@yï·@l¹G"ä B j#@at@lºj`ÖÀB EZ?ÅÉ£@lþß:€Bš‡Y@(0@mx Bµàø@\¹Ç@mC#s²€B8¹}?ê§ß@mDFÓ3BbÃr@$î@mDFÓ3Bdã)@.Ëh@m‡®ÀB~6Ž@1Z`@mˆ)ìr€By?¾Rð@mÇîÀAä^ß?é ö@mÈB,`AÚÛØ?­”)@n ÄFü@B˜\‘@.·=@n ç„îÀBЏk@-@nLn%‡€B»±?Ï“@nM‘…B!ˆ#@ض@nM‘…B.nM@zá@nŒç„îÀBH˜?úe|@nŽ äo€AÔ3{?ÛÖ¿@nŽ äo€AÞ0?øÀ¥@pmÎ-ÀB”m–@5!S@pnñr®`B~Œã@ð@p¹ØÁÝ€B”¸T@*ùv@pºûÿÐ Bn‰W@ä@pþúò€B@'œþ@pÿ@8åB†êˆ@)wÍ@qBaU•@Bp¼q@b„@qC„“ˆB;#¢@cé@q‡˜My B1ö ?íÜH@qˆ»‹kÀBJ^@ Ø@q‰ÞÉ^€B¡â@@@Iª@qÇá .ÀB¯o×@>á¨@qÉJ!€BŸúk@L‚¶@qÉJ!€B¤oÊ@[ÇC@r c'& AÉÿ'?Ý|=@r †e@AÌ2ì?¦8;@rK܆ŽAÿ¶?öª@rLÿÄ€ÀBøî?ÀƒÃ@saÛÅžB)¼@'•Ž@||˜¾¸ B%rs@ÿ@|}»üªÀAâö@‹–è@}Q`TÀB6Q—@8@€ËJç”ÀB%Tc@¢@ ©ÀB :Ê@Cš@„sMëU@A =¬@L¦@@„°¾,@A×ëŽ?ùE·@…~M›¤ AÝE?»&…@…6l³€AÊ·$@—l@…ÅšI€Aã½?÷†f@…áz¥È€AïQ]@™»@ˆ/Ëñë`A¯t¿@C’¸@ˆr‹Í8 AÜÒ¬?Õ6ç@ˆ¶ÐMAî5?ÜqÎ@ˆïäï@Aã@,Sa@ˆóMëU@AÕ1o?¬Á@‰6ÐMAƒ}?õþ@‰{¥ÿé@A¹‰Â@68@‰¹Á@A½Ã±?©lH@‘ ©ÀA´Þá@-*Ü@‘²^œ`B.›@1yÿ@‘œ.ÀÀAê<.@è@‘ß4)ã AÓiÝ@Y^9@‘àWgÕÀBª¨@,Q¤@’#xbøA×Á®@LÊŠ@’$›Âx Aìœ@)ÿë@’gí<¾ÀAÒœì@/{x@’iz±€AÀrY@GÿX@•Q`TÀA¤üë@íÙ@•tžG€BÆ@Ir~@•V÷2Aóx–@\Ž@•W=5$€Bø@@Uƒ @•š^QÔÀAÜ“ƒ@Â@•›Ç€BüÔ@Tþø@•Þ¢ŠéÀAÇU@ @•ßÅÈÜ€B'Õ%@W5e@–"æÃþÀAÁK@´@–$ ñ`B´Ì@OZ@–g+¡ B$Ì@@–hN\”@B/v@YX@™ŸÿÀBÿš@*5@™ÝàlÌ A§‚Á?ù’Ž@š"$¥á€AbB>@hè@šfhÞö€A‡/I@þë@š¬ö¯àARõ¢@S;@œ>÷z/`AÙÍ´@$1@œƒ;³D@AÀþ­@ W@œÊX(ÅàAü¡Ê@”O@tžG€AñJ@(§L@9G"ä BB?ߢQ@U¸øê@AÐ@"^¦@ž"…Å· A²ó@p@ž#©©ÀAªô‰@?p;@žfÉþÌAÈñ¢@ M@ =ü‘ A²é@fR/@ >5\@AÑ$±@ ñ(@ V5¦ AÆF¾@fÛ@ ‚y•'@Aí”@ $@¡âÿN A¹*¯@ÃD@¡Ý+i@AÐS\@|@¢!Æ A»û?ú,E@¢fÉþÌA§‰?þ†@@¢­$4¢€A¬Ž¾@b=@¢ñhE€AÎ]µ?ýg@¤<€]˜@AÆ´\@2@¤=£›‹Aò /@Gí9@¤V5¦ Aà`|@6ÉT@¤‚y•'@AÛÝ!@7ê[@¤Ê¹H›€A“M¾@`4 @¤Ë܆ŽA™™G@˜@¬=BC`AÀv"@¡º@¬>eÛ6A—+â@²d@¬?‰(ÀAúÔ½?ç¡Ü@¬@¬W`AßYî?Ö™é@¬NåB€A‘`?Â¥@­`‡æù€AÒ~Á?³H@­¤ÌAœ€AÜŠò?¸A_@­çí<¾ÀA¿š?ø&>@­éz±€AÒdG?½û@­ê3Ú2A9f/@"Ù@®·’$j@Aøz’@â@±^QÔÀB .@½º@±Ç€BÁ!?óæ6@Ð á1A¦ù@2q@ÐD# A˜N@@£@Ð:9á³A¼¤„?Ãàµ@Ð;]¥ AÃüT@Ž@Ð~~ÈAÏD8?Ù @СXº AÓ‹?ùÞ@ÐÂòôŽ AÌbê@Æ@ÐÄ2@AÅ—?Îeù@Ñ)ìr€AºÒá?º±î@ÑLžÆ9 AÕeû?Ý_5@ÑMÂ+ÀA¾î†?ò$@ÔAŸê@A“›è@°Š@ÔEñP@AǶŒ?Ø÷@Ô…ãp Ax„Í?úg@Ô‰M*e AÒ½?Ùö˜@Õç+¡ B-l@˜@Ö&â>^Aíì@0EJ@ÖlIÖó€A¶°@FÖ@ÖnRØàBçõ@,·È@Ö¬ö¯àAË’Õ?ý_Ý@Ö¯j°‡àB;@¡Z@Ö°Ž€BzM@ …/@Ö÷ÅÀAÃq¹@.+@×=sg@BŠå@àÖ@ØG° Aí“ ?ý×@Ø‹ôç®B  ç@é@ØÐ9 ÂàBÛH@íþ@ÙàéÏAÀ$¶@ŒL@Ùâ fOÀBB"@G¸@ÙäRâ5¿i×?­¢œ@Ùåv 'ÀÀk}$?PG²@Ú&PŸd Aµ!o@S¨@Ú)ºzÊ€@e™?|>u@Úk‡—H€A†Râ@VÖ@Únñr®`>›o?†õE@Úp°¡?á{)?ÃzN@Ú¯Ëñë`AêN@•@Ú³5«Ã`?Øýã?‰?@Ú´Xé¶@Bêp?Å¿@Úô+@AŠM@e¥@Ú÷zf@@É?—z@ÚøDXà¿›J?Á‹@Û:Ë€¬@A܈@+Ö¡@Û;Aó­@äT@Û>5\@Àhƒ?Æ”Š@Û?Xš¿Y6?Œë¢@ßµ¬ÈZ€A‹®“?ÜS¨@ßú!€“@AdÉ ?Ù…¶@à>5\@A,õù?ØA5@à‚ªKA6÷+?Ñu@àÆ½Î<@A)xÒ?Ù›@á ?é4Ayõü?èþÅ@áLn%‡€AÚƒ9@ã@áM‘…B!Z@€V@áâÿN Aù-@9"š@á’=@ÀA¶÷Ÿ?ÿ¸,@ã>»`€A–¡G?åâ›@ãqú °àAŒÏÞ@ “@ãsl1€Aß7À@`=@ã¶>gSÀAJJÌ?ûN@ã·a¥F`A§Ä@é÷@ãú‚ hÀAzá@ m@ãû¥ÿé@A“ÃI@ éò@ä>ÆÙ} A³íü@ [B@ä?ê8þ@A¡``@Õ4@äƒ 4 €A„ @¬ó@ä„.r@A‡PÞ@¤ @äÇOm5€AÈUá@ Ï’@äÈr̶AŸ1±@:T@åN#s`A¬RÕ@¥‡@åOFaôAäŠÿ@›ú@å‘Õ¾AGÁ@ô@å’øü AµS@.8@æçŒé@Ap6²?ÛX*@ç=£›‹AâŸ~@+¨@ç>ÆÙ} A2Š?òYŽ@çr[N@A¿C@{W@çs~ŒA•üW@Þ@@ç¶Ÿ‡)@AÀí×@|@ç·ÂÅA¹J&@ ÔÔ@çúãÀ>@A¤& @Sz@çüþ0àAŒÓ€@ R@ê¼€]˜@AõÑ@-`³@ê½£›‹AÀí(?÷¦@ë>5\@A®˜‚@?<:@ë?XšA¸tý?î¡Ï@ë@{×÷€AéN-@ É@ëAŸê@AõÍ ?݇{@ër¼L\Aá4@Š@ësߊN€A¼²#@¢Ë@ëuÈA@Aô d?ç¡@ë·¦þÀAÃ;Z@&‡@ë¸#äñ€AÉ2@i@ë¹G"ä B˜­@¬@ëûDàÀAÓãå@"¼@ëüh€A¸O½@å—@ëý‹[ùAø1(?ø@ëþ®»yÀAÅMy@0ð@ì?‰(ÀAÙ{H@(æ@ì@¬W`AÂZG@ ›Z@ìAÏ•AÊ ô?ÿÏ’@ìBòôŽ AÌFg@¥±@îÕLÞBUé@ Åœ@îøŠÐ Aå ?áT@ðÏÁB@A±‚â@ +c@üXò3ž€AÞðO@ÅT@üZq‘@Aå*E?öÇÚ@ü˜´a€AàR@W@ü™:òT@Aó"š?÷ãü@üÜŒŽ(@A·Åí@ö@üݯÌàA¼™À@ ñÇ@üá§€ÀAÀF“?Òë@ý ÐÇ=@A²qX@ ÀD@ý!ô/àAÕWß@!ƒ@ý$:¢£ B é@È“@ý%]à•ÀAÞ7V?êE@ýfhÞö€AçØ@9©@ýgŒé@Aª?þ–@ýjõøO Açiq?Ô-{@ýßÅÈÜ€B>Ô@<ðA@ýàéÏA¤ØÎ?óþë@ýäRâ5AÛGú?ÑÖ@þ4(j’@A· ë?ñs°@þ7’$j@Aäx?Ø×A@þuÈA@A·â?÷•@þxl£§@AúÖ,?ä0Û@‘áz¥È€AÛÚq@%«2@‘6l³€A½ ”@yd@‘fÉþÌAr÷?ì@‘j3Ú2A«&:?ïÑF@‘«oW¶€Ašë#?èBÈ@‘®Ù3€A͇?úß@‘ðÖξ@AÏ!“@<2v@‘ól1€AØtî@ ¯:@‘4º ‹€A®`-?ÿýY@‘8#äñ€AÂ5?Ì x@‘r‹Í8 A|-.?æmµ@‘uõ‡ A·!?Ô,Ã@‘Œ%fÑÀA£{Q?òâÁ@‘H¤Ä`A£=@c @‘ ©ÀAñá@HE@‘²^œ`AÏ®Ñ?ãܾ@‘ËJç”ÀAÓýø@F@‘ TeFA«Ùy?ÕäÞ@‘ V«–+@AÛ‚Œ?î¾@‘ WÎõ«àAÜè§?͆]@‘" ‡’ A©Ë*@rë@‘"!1çÀA˜á•?ó£@‘"#xbøA®?¾!Ž@‘"$›Âx A±½E?óeg@‘"h¯ZÛàA¸l@Ç&@‘"iÒº\€A–õ_?ólj@‘"l6AÀA¢]U?¸)Ø@‘"m<•Â`Aų?ù^@‘EVÜ6ÝA·m8@c@‘EWÿtÏ A©æ•?ÜÐW@‘F±áî¬àAÌPç@ð»@‘PN#s`A§æ˜?£’K@‘PPiŸæÀ?”e?­´@‘\BòôŽ A¸2@?ëµ…@‘\D2@A£e?dà@‘\E9ptAz]€?ê6@‘\F\Ïô€AYŠè?ÆeR@‘`M0e2€A›$š?ËÍÝ@‘`ÕˆX8€AS! ?¦i×@‘bh¯ZÛàA@´$?ÀÂH@‘b®Ù3€A‘Q?ýÍ>@‘b¯üq A†KÜ?â0@‘ból1€A“ŵ?ù¥"@‘bô@ª$ A•ò±?ã‚4@‘c…Q°àAD@Ì?¼à@‘d‚P·€Ayb ?­¤œ@‘d¥Žª@A§Õ—?ÀîB@‘dÈÌA›‰8?Ö6ã@‘dì,€A‡ ?âTÖ@‘d‹ÄFü@AMÝÕ?È @‘dŽ äo€Az§«?³DÝ@‘fiz±€AlÚ?ÁïR@‘k{¥ÿé@A†U?˜IM@‘k}ì{ΠA\m˜?±q~@‘l:òT@Aƒˆ?ÄZ@‘r±áî¬àA©@ V@‘r³,Ÿ€A¤N?Û3v@‘xâŽA>Ž@C@‘xíÀA’1/?ÓA@‘x)+‚@A’!?¼À@‘xLiuAŽî·?¬Ê@‘z²¤ ÊAë?¿Q½@‘|¤Íº A–ô?í J@‘|È ¬ÀAÃû?Ñ£]@‘|ëIŸ€A’H?¦µx@‘| ‡’ A¥<Ñ@‘‰s~ŒAŸï?f•@‘‰s~ŒA™¾›?§ø@‘‰¸µƒêÀA‹a?Àü@‘‰¹ØÁÝ€A«\¨?ká¹@‘‰¹ØÁÝ€A”ÅW?“^@‘‰üù¼ÿÀA Ž³?šº@‘‰þúò€A›SÜ?…‹ @‘‰þúò€Aš¼œ?Yÿ@‘ŠlÛT_A›˜?àbÌ@‘Šmþ³ß€A«t@Ü©@‘‹tžG€A‘R@²·@‘‹—Ü: A£‰î?§ZŽ@‘‹»,ÀA›}?º‹@‘‹Þy­`AÊ+?ŠÂß@‘‹GOm5€A¸¹p?ÈÛ'@‘‹Hr̶A•õi?ˇ­@‘‹I– ¨ÀAœ›{?’íÝ@‘‹©ÄšA¥©§?È1”@‘‹ŽÍŒ€A›ñ?ÍÎ!@‘Œ^QÔÀA’Pž?ÂC=@‘ŒÇ€AŒië?Ì6¹@‘Œ¤Íº A›l?“îÝ@‘ŒÈ ¬ÀA-x?Âyh@‘Œèßû A¡ß?eB @‘Œèßû A“Eu?®@‘-$4¢€A–ÚU?c0@‘-$4¢€A C?”8ó@‘s~ŒA¦Fè?kjb@‘s~ŒA±œÍ?˜Ë@‘¹G"ä A Ž¨?hš$@‘¹G"ä A­ç¢?•g@‘ý»üªÀACS?¤ªÁ@‘þß:€A¨Õ?|¤±@‘þß:€A«kü?”€k@‘ŽÌn%‡€A½~´@K@‘ŽÍ‘…AµJÃ?°@‘ŽÎ´ÂúÀA¥6´?¿Ì@‘ŽÏØí@A®ÿ®?ŽJ{@‘²^œ`A©˜†@Íò@‘Õ¾A¯¡y?­“@‘øü A¯ÈŸ?È’«@‘:@Aª?‹âç@‘FO`Aœ3¬?µÖ@‘G° A˜¢Ã?ò@‘HÓÊýÀA›V­?‰ß@‘I÷ð`A«yï?óL¡@‘Žkâ·A•;‡?¼ïå@‘Ì‘M€A˜DF?¾ÌO@‘^ëð€A¡É?£œ„@‘_4)ã A•ËF?`@‘`WgÕÀA£ó?²Ti@‘èÝp€A­Íï?bù@‘èÝp€A¥Œè?˜Š7@‘‘-$4¢€A±èá?cCc@‘‘-$4¢€AŸU‡?•]@‘‘t@ª$ A²Óö?bºŒ@‘‘t@ª$ A¨Æø?˜ûÛ@‘‘·a¥F`Aµ"Ò?Ä5a@‘‘¸„ã9A§VŸ?kU›@‘‘¸„ã9A·Zg?•@‘‘þ~ÈA½‚Ò?ÐD@‘‘ÿ¡Xº A°²_?o.Ï@‘‘ÿ¡Xº A¶¹Ú?•é:@‘”[i.§ A¯øU@Ç‚@‘”\ŒŽ(@A¸|j?§eÜ@‘”]¯ÌàAªÉ?ˆË¸@‘”^Ó €AÄì?Ø¡­@‘”æ8_ÒÀAÃêÂ?༮@‘”ç[Å€A¹ù?{Cc@‘”ç[Å€A£°‹?›ô@‘•-$4¢€A»‰?hq@‘•-$4¢€A™Á+?Ÿ¯â@‘•s~ŒA¬ ?_³ê@‘•s~ŒA‘Gë?œ²S@‘•¶Ÿ‡)@A‹Ä¡?üib@‘•·ÂÅA±¦î?y÷s@‘•·ÂÅA‡ñ‰?™gÜ@‘•ý»üªÀA•C¯@ó„@‘•þß:€A´œ˜?wII@‘•þß:€AŒi?™Õ¢@‘–ËhqA£h_?¢Š&@‘–Ì=¦c A»v?¢V½@‘–Í`äV@A»;¸?¶‘@‘— ÄFü@AÄ…ì@*@‘—Q`TÀA¬Y?ï#æ@‘—tžG€A«Ê\?‚ûã@‘—Ej%ÀAªÂå?ô´ @‘—FO`A°îö?¬Âa@‘—G° A¸?H?…+@‘—HÓÊýÀA¸{?äÆG@‘—ŽœaÚÀA¶1?õi@‘—¿Á[€AºÁË?­ëÙ@‘—âÿN A»­Å?‰~í@‘—’=@ÀA®>ª?èŠ@‘—Òà¼}ÀAÙbv?ÿÛ@‘—Ôúp`AÀg„?®{F@‘—Õ'8cA»2?…ê³@‘—ÖJvUÀAžq?à«.@‘ž¸æ€AŸú4?¹üÛ@‘žº b@A®ä­?—T@‘ŸF½Î<@AÃ}d?­¬@‘ŸGá .ÀAgÔ?ÓfÏ@‘ŸGá .ÀA¹=?ÅbZ@‘ŸIJ!€AÀ U?…¯@‘¢ƒœÓàA¼¤§?¤½Ü@‘¢„À €A®ÛB?¬=>@‘¢„À €A±ýÉ?ö¦v@‘¢…ãp A©=?£l@‘¢¸#äñ€A¢î?œ @‘¢¹G"ä A¦lÙ?§@‘¢¹G"ä A¬#{?ò¢Û@‘¢ºj`ÖÀAÕ3?“4a@‘¢ÄFÓ3A¦Rl?Ÿ|@‘¢Åj%ÀA”š?¥¡@‘¢Åj%ÀA›¨€?ð£Ï@‘¢É4êÓ@Ašº´?ŽÀð@‘¢ÊX(ÅàA 1?tÏá@‘£^ñ7A¶òå@ÿ†@‘£ M*e A¡ª?±<‚@‘£G€ ç@A»÷Ê@„Ï@‘£G€ ç@A›Ã!?¤F9@‘£H£KÙàAD³?²?h@‘£’6Ýò€Am?óO×@‘¦…!0âA¼Ï?‡Zd@‘¦†DnÔÀAns?ÒÊ@‘¦·a¥F`A¬f?´ ¢@‘¦ÐÊ¿¼@A²›7?®3µ@‘¦Ñíý®àARå?úþ‚@‘¦Ô4y”@@o‹?…pz@‘§)œÁ`A¹¼$?·ä@‘§p¦ÀAšSÅ?­«e@‘§“V™`A~71?ÎyÝ@‘§NS£% A¯9Ø?¹ÏW@‘®ƒ;³D@A°‘u?ž‚(@‘®„^ñ7A¦5…?z W@‘®¹ØÁÝ€A¢ÚÁ?÷GÐ@‘®ºûÿÐ A¥^`?ŽDú@‘®¼_PÀA¦ü­?ucÜ@‘®Â0´ã€A…“?ÕÈT@‘®Ì ±àA«•½?tÛŒ@‘¯%¶‚ÀA±ß}?¸»@‘¯Hôu€A³^m?~¸é@‘°V{€A§ªð?’é`@‘°WžTú A¦]r?t¤ã@‘³Î#s`A§©)?tÅü@‘³Î#s`A’WR?‚.ì@‘³ÏFaôA†9Ù?Ò!¸@‘´}Y×ÀAä?jÉŸ@‘´}Y×ÀAš^-?‚j©@‘´ —Ê€A˜ ý?Јœ@‘´XÁ´zÀAŽ Ã?oR¹@‘´XÁ´zÀA™¹™?„@ê@‘´Yäòm`A”ôÈ?Ó\û@‘¶|h€A™YÉ?ÆC@‘¶|h€At‹?ŒNð@‘¶}‹[ùA‹;¥?Ù¶$@‘¶„.r@A§D?qÀ@‘¶„.r@AÀP?Pe@‘¶…Q°àAˆ»?Ò—á@‘¶ÀÜ÷Í A¨?xЫ@‘¶ÀÜ÷Í A‡°‡?Œ{¢@‘¶Â5¿ÀA‚t&?؆@@‘·ÍsË A‘ÕÉ?ƒTÒ@‘·ÍsË AƒpÖ?Œ:\@‘·ð±¾@AŠ­)?ä2@‘·H¬à€Až?tÙ¥@‘·H¬à€Ao/Ó?]š@‘·I4êÓ@Ar´M?Ò+0@‘·ŒUåõ€Aœ1É?wÔ@‘·ŒUåõ€A}As?ƒ«@‘·y#è@A~^?ÐÍ:@‘·Ðš@˜`A‰¸?rÀ@‘·Ðš@˜`AŽ?ƒ‹@‘·Ñ½~‹A\;?Ø×8@‘¸Þy­`AŽÜ?hËÑ@‘¸Þy­`As~L?¼Ü@‘¸· A=?ϸ@‘¸UWÙÀA‚!'?[u§@‘¸UWÙÀAƒ;ò?‘hj@‘¸›²ë@A}/?_ºº@‘¸›²ë@A ?“& @‘¸ßöiŽ@Ax•ü?h|@‘¸ßöiŽ@Aw·?“äX@‘º‹ÄFü@AœI³?§ú‡@‘ºŽ äo€A£M?àß@‘º."b A„ع?¼;’@‘ºÑŒÝÙ@A“û ?¤áP@‘ºÓÓ{L AŽâ?›s@‘ºÔö¹?@A‰Â?½Vü@‘»ÃÕ½ AŸÂ·? ê@‘»‡˜My A’°£?‰r@‘»ˆ»‹kÀAwxQ?©‹ð@‘¼e¦ŸK€A¥^å?•=\@‘¼fÉþÌA™?‹á@‘¼fÉþÌAYV?ïþë@‘¼gí<¾ÀA„B½?@‘½r*­b€A—Ò¡?¿JÓ@‘½sMëU@Ax·ä?ó»Œ@‘½ö‡G—`Afx?¸6Ê@‘½÷ª…ŠA”/°?Œ x@‘½÷ª…ŠA›Æà?Dþ@‘½øÍÃ|ÀAØR?—¨Ö@‘¾7óD?ÀAŸÎ ?²r@‘¾…²ÏÛ`A«‹?‘ݱ@‘¾†Ö/\A’ñ‚?u`é@‘¾º b@A”~3?ž¸R@‘¾», àA¢)?ƒÏ’@‘¾», àA”½ ?·¤¥@‘¾¼OÞt€A|‚›?±É.@‘¾ý*<#€A”D?ŒB…@‘¾þM›¤ A“lÏ?‡B@‘¾ÿpÙ–ÀAН”?¤½Ó@‘¿Ö/\A–š?|#1@‘¿Ö/\A”Q?ë#-@‘¿ùmN Aƒô?ÞÉŽ@‘À´a€A‚î¼?ž×Ï@‘ÀV{€A’??}Ť@‘ÀV{€AˆòJ?žË)@‘ÀWžTú A”î³?³2ƒ@‘À™œ)ÀAš‚ÿ?€@‘À™œ)ÀA…îB?¿¯@‘Àš¿P`A‚Zª?Îøð@‘ÁõÅì@AŸâ;?‡/ˆ@‘ÁöèEßA‹,?Öˆj@‘ÂH¤Ä`A“Ä?ƒ2@‘ÂŽkâ·A¥ÜÔ?y~@‘ ©ÀA–˜å?Åüë@‘¸#äñ€A¯µï?¦Án@‘ÂÑíý®àA¥/Ì?ÃÆ@‘ÂÓ;¡€A-Ó?Õç\@‘ÂÔ4y”@Aˆv·?Å[î@‘ÂÕWÙÀA¦Õ?—Mœ@‘Âüh€Až ? (_@‘Ã@¬W`A¢V†? å‚@‘ÃŒ†e@AŸâk?ú¶@‘éĚAœ!*?‡Í>@‘éĚA±Zã?Œ°Ñ@‘ÃŽÍŒ€Ašo\?¤.@‘ÃÐÊ¿¼@A½6ò@®£@‘ÃÑíý®àA–H?Ñ»@‘ÃÑíý®àA¯jgSÀA²P®?㘖@‘Ñ8„ã9A±3q?š[}@‘Ñx ƒÑ A°\E?ö•)@‘Ñy.ãR@A¹&ã?¼’’@‘Ñ{u_7€Aµx}?£í@‘Ñ|˜¾¸ A”JY?ÛåÁ@‘ѽü‘ AÁg?·À˜@‘Ѿ5\@A–Jê@Ä“@‘Ñ¿XšA¢ãô?ì:@‘ÑÀ{×÷€A²»g? Ï[@‘ÒÚ´üÀA¹N&?¬± @‘Ò!0âA¢Q}?ÈRÎ@‘ÒDnÔÀA¿G'?©~F@‘ÒH£KÙàAĆI?¶É@‘ÒIƉ̀A‰_¦@€E@‘ÒJéÇ¿@A³þ\?í›@‘ÒL ±àA´ÀÆ?Ÿ û@‘ÒÚC½ÀA¯ÆÝ?äÅT@‘ÒŽý°`A–2a?¶i¶@‘Ò á1Aœæ¾?Ð3è@‘Ò‘D# AŸˆ?“6Y@‘ÒÕ'8cA§)ú? ~Ø@‘Ò×mÕÖ@A° ?½'@‘ÔT•™iÀA©‹Ý?¶²È@‘Ôõõ‡ A´Øs?‰L@‘Ô÷ÅÀA¯K’?Š+Œ@‘Ôø<$ƒ`A› ?§¬@‘Õû¥ÿé@A®.·?”9 @‘ÕüÉ=ÜA±ˆ$?§Õo@‘Õýì{ΠAgA¼?ûÕþ@‘Ø(|P A¾r#?¡ò¡@‘Ø)(ºC@A· è?ò æ@‘Ø)(ºC@A¹¼?çã@‘Ø*Kø6A´îµ?ŒŠ½@‘ØlªÕ; A¥¢?Ábc@‘ØmÎ-ÀA <~?§ôý@‘Ønñr®`A¢%Ç?„%–@‘ذ¾,@Aª—m?š¯>@‘رáî¬àA¹³„?å¡4@‘رáî¬àAší?æÓR@‘س,Ÿ€A¡Í?ŠYó@‘ØôÒI€A´CÊ?¥BN@‘Øõõ‡ A§*ù?¼”Ä@‘Ø÷ÅÀA›]?y1@‘Ù9G"ä AËW?²Lƒ@‘Ú^ñ7A’Mï@#¿+@‘Ú‚P·€A¤'b?‚?@‘݈‹ HA©]ñ?kƒ@‘݉®J: A¦}e?©Û4@‘݉®J: A¯.Z?|;@‘ÝÀKXÓÀA€í?Î77@‘ÝÁn–Æ€AŸo??­JV@‘Þð±¾@ARÕL@+–-@‘Þï±A‘˜ô?Š˜@‘ßéAc A®i]?°·Ô@‘á|˜¾¸ AžDÜ?÷N@‘á~ß:€A©. ?œÿÚ@‘â²ÏÛ`A¶ÒÈ@" û@‘ä,1uÓÀAÄæ?”ë@‘ä,1uÓÀA¬ý@E‰@‘ä-T³Æ`A¤ÆË?§rç@‘ä6næw€Aœ•??šqz@‘ä6næw€A£¬•?°XŠ@‘äy.ãR@A´¥?|Æ@‘äy.ãR@A½Rq?Þo @‘äzR!DàA­Ó3?"@‘æMÂ+ÀA°>Ö?|,,@‘ëaJ&¤ A•Qa?°Y–@‘ì)êùî`A¥“>?•£<@‘ì+7áA˜û'?›þã@‘ì+7áA$?ø½º@‘ì,1uÓÀA„A?‘ž•@‘ìp°¡AfA•?Ù?@‘ìq7î“ÀA–„¶?’B1@‘ìr[N@AŒCZ?o‹@‘ìù_bvA¨ˆ~? ‘@‘ìú‚ hÀA‘7?~ek@‘ìû¥ÿé@At?ÈZ>@‘í=ü‘ A£!u?“œ®@‘í>5\@AèG?•@‘í>5\@A{„Á?î)é@‘í?XšA4s?‘|³@‘í}ì{ΠA€á%?ÕA @‘í¹Á@Ašz?•rÅ@‘í€2÷´A¼?l”O@‘íÂ5¿ÀA™Ê(?ÝßÒ@‘íÃ#s²€A{¯±?“ã@‘íÄFÓ3A…¾?nˆj@‘îÈÌA’Ö?Í@‘îì,€AŽXq?Åõ@‘îì,€A˜Ëµ?ÊG@‘î j@A‘_u?ýß@‘îJ¹H›€AkIÁ?í¦Y@‘îK܆ŽA²H½?Ίß@‘î^¡…àA‘.?²8Ò@‘ïN#s`A”Q'?›ð‘@‘ïOFaôA†~ú?±@‘ïOFaôAX‘s?ÌcR@‘ïPiŸæÀA”³(?†»@‘ï“Zå@Ad?Žtó@‘ï”}Y×ÀAŠ&)?x(€@‘ïÖ{€Aš]ï?ÍåÉ@‘ïמTú A‰*?“­â@‘ïØÁ´zÀA†Gú?gIk@‘ïíÎ-ÀA‹¤{?ˆ†œ@‘ïîñr®`Aš$?‡7Á@‘ïð°¡A’;?±ÆÉ@‘ð.Gr•@Aª°™?žÏž@‘ð/j°‡àA€e ?³ @‘ð/j°‡àAˆ?Í£©@‘ð0Ž€AŒ½ë?‚’O@‘ðr[N@Aš¾Ù?‡² @‘ðs~ŒA>?pû¹@‘òŽý°`AšÅ€?ñ&@‘ò á1Aœ«¯?¾5­@‘ûQíý®àApku?«8@‘ûS;¡€A’‹’?‰Y¼@‘ûS;¡€A[Ÿs?øka@‘ü¸#äñ€AŒs?µÄ‡@‘üùÀ‚K€AŽÞÏ?¡Y @‘üúãÀ>@AZú‰?ÃÓg@‘üý*<#€Aw F?Ÿ@‘ý(Ç»ûÀA›2§?qQ@@‘ý)êùî`A¦lZ?‰ÈÉ@‘ý¿(á AžZ?«`(@‘ÿ»‹kÀA‰‚Æ?Ÿ33@‘ÿ %fÑÀA?±[«@‘ÿO§É€A“Ñ}?çv>@‘ÿPÊ¿¼@A©7ð?ɸ@‘ÿS;¡€AqÍ?²R?@‘ÿT4y”@ARóŽ?ÅËG@‘ÿ”:@A‰°Î@ ú @‘ÿ•?™‚àA” 4?¸„ù@‘ÿ—†h@A”8ì?ÓÌu@‘ÿ˜©SZàA•Ï4?°Q@‘ÿÙƒÒ—ÀA‘l@?¶ˆè@‘ÿÚ§Š€ARŒ³?ðk@‘ÿÜí­ýÀAªd2?™Ec@’µ|'¨ÀA”‹5?¯8“@’¶Ÿ‡)@Aˆ8 ?Ë‹r@’§½ÀAƒØ?¦Cþ@’¨5ût€A¨u?’™¦@’©YZõA¥Ç¦?¨Ÿ8@’ª|˜çÀA”Tv?ËAl@’妟K€A¢,ª?ð€@’b fOÀA€W/?‘Gà@’c/¤B`AoS;?ÇÐ)@’ ©ÀAˆæÍ?~B)@’²^œ`A‡W?²fõ@’²^œ`A‚ºx?¶N@@’ &ˆ€A]W"?ƽU@’ &ˆ€A˜¿*?Ãå—@’ '¤~ A‡º]?KÇ@’ zãÀ>@AeW?rǨ@’ |þ0àAyˆÈ?©‘¼@’ }*<#€AÀøN?ùó(@’ À{×÷€A`Ô?ƒ~V@’ ÁŸê@Aˆ,›?Ï5+@’ ÁŸê@AvS¸?ÎŽX@’ ÂÂSÜàA›òô?˜=÷@’ ^QÔÀA‚™ó?slð@’ _d©àAšÏl?y¬½@’ `‡æù€A‡Ñz?±ä´@’ a«Fz@A–ù?©vO@’ ¥¿k@A•ó€?ƒr&@’ ¦â>^A‘µ‹?âô@’ ¦â>^AŠÒŒ?Æ:Á@’ ¨|P Aù?™At@’ '½ÀAŒ¥ ?ƒ§ @’ (5ût€At|ý?ÂŽ@’{DàÀA€Ñ?„Ú@’À¸"A‡mâ?Ä{‰@’Á>¢ AŽÊº?‚Xæ@’ÂaU•@AŽ-Ú?X@’Ä“ˆA€Ç?ó8 @’p¦ÀA‹Ã?¼Ò@’“V™`A„“þ?ÙøÛ@’“V™`Ahí?˜î9@’¶”ŒAvx?‚·$@’dä.`Arð_?»@‰@’Ç€AŠ€'?¥ˆ@’¤Íº A’ŽÕ?‡@’¤Íº A€$–?â–@’'Ôý,ÀAŸÛ"?sNf@’|þ0àA—Qô?޽E@’À¸"A„ú¯?–´@’Á>¢ A†vŒ?Žƒ™@’Á>¢ A…Õ2?æ®Ñ@’ÂaU•@A‘EA?‹Ýº@’^ñ7A”9?¶€@’‚P·€A†£?¾TÞ@’‚P·€A„–ƒ?ªÞü@’¥Žª@A–¯|?1¡@’^Ó €A˜†?s•_@’_öiŽ@AsÔ?¥Ç›@’_öiŽ@A—ð?ÖÍ@’a§€ÀA‹¾?Ÿp@’(—JA’tK?q#@’À¬W`A­oV?ˆ ú@’À €A‘Ïñ?¥@’aÛÅžAaÓQ?¡ü"@’iqš‡AŽñ÷?›4‹@’iqš‡Atä,?Ø,M@’j”Øy AŠ×:?u™ª@’«oW¶€A£5?€Œa@’«oW¶€Až¹?]­ë@’¬’•©@A”ÜB?׿¬@’òìËÀAŒJ€? vŽ@’òìËÀA¡5?j ˆ@’ô+@A–ã¯?Âß‹@’J¹H›€AŸPf?–-Q@’K܆ŽA’5×?¦{î@’LÿÄ€ÀA§R”?’i@’bã»A†{H?Ë«Ò@’妟K€AœÀ[?ŠPY@’妟K€A¨w?Žxu@’ ]+i@?†iœ?É!Þ@’ _ÅÈÜ€¾í…?†…n@’ _ÅÈÜ€??•‚@’ `éÏ?d˜?T”’@’ b fOÀ@KÜ?©¾©@’ j9€@A•‹?‹•æ@’ j9€@A™Õ?ƒ0ð@’ k&wsA‡ß*?‰½è@’ k&wsA•ô+?«ú‡@’"%¶‚ÀA” Þ?“GÇ@’"ˆì,€A’¨°?†zS@’"‹2¨àAÓÌ?ž%J@’"Í0e2€AŠiÐ?…Î@’"ÏváÀA›1u?“cÃ@’#K{ˆF€A‹¸„?‹Ï¼@’#LžÆ9 A–l¥?ÿ­@’#LžÆ9 AŒñÕ?ß×@’#MÂ+ÀA²ÐÜ?Š@’#–2XQÀA•à®?xö¾@’#—U–D€Až"m?•@’#˜xÔ7A¦­ø?Þ·_@’#Ù"²Â@A?œ?À¯6@’#ÚEðµAœ*t?l8 @’#ÚEðµA¡G?ª(@’#Ûi.§ A‡§Ö?ï@’$^QÔÀA‚d?Šâ@’$Ç€A’ZÕ?…‚@’$Ç€A› È?‚ûô@’$¤Íº AÄþ@x@’%úR!DàA˜sÚ?sŒ@’%úR!DàAn?ž¨Ê@’%ûu_7€A‹æ?Ðv¸@’&?(á A‰4ð?µ‚V@’&?(á A™Ì?ƒ´_@’&@KXÓÀA‚Ó?{†@’'J¹H›€A¥jM?ÃMŒ@’'úR!DàA½èÂ?Èþ @’'úR!DàA§¿r?¬÷@’'ûu_7€A¥?\?p@’'ûu_7€A‹º?Ë!÷@’(C­ä AªNN?Ò³>@’(g e@A°Ä=?tdE@’(g e@Aµ V?Œ®ó@’(ŠKWàAœk_?±‡H@’)ö·Æ»@AŸ„?xÍê@’*ƒlSöAY?Åë@’*„‘èÀA¨­Ó?¶@’*„‘èÀAlf?‘Ú@’*…²ÏÛ`A£J;?··9@’+™Ì‘M€A‹OS?‰S¬@’+™Ì‘M€AŒ}á?’º8@’+šïÏ@@A…¾´?užù@’+šïÏ@@A†!Š? @’,`&è²AŽÏ ?o×@’,aJ&¤ A‰Ùp?ÅÌŸ@’,aJ&¤ A¡R¾?‡‰/@’,bmd—@A††?ø­’@’/¿P`AcÊ‹?ÌDÐ@’/âŽAˆn5?v{-@’0?XšAŒÜÇ?PBS@’0?XšAŽ?nÉÁ@’0@{×÷€AxûÌ?«Ë@’0@{×÷€A~X÷?ÀÁ@’0d´ €Aƒyä?”ÆÎ@’0d´ €A_[©?¢©‚@’0e×?ý@A“†?gÓ@’0e×?ý@A’á?ƒòå@’0ƒÍsË A†Ê–?Xÿ@’0ƒÍsË A“g? °@’0„ð±¾@AqA”Ñ"õ€Ç¿%A”Ñ# kÀ s\:+A”Ñ#ñÀÐN7S A”Ñ#7 ` ¯Q!J w A”Ñ#Jm@± ”A”Ñ#]¶  æi"âA”Ñ#u„€>+å8A”Ñ#‹CÀöG’| A”Ñ#Ÿ¦@öÐ(ÔA”Ñ#¼÷à·ô-daA”Ñ#ÑN@–)ò® A”Ñ#èë ™ ´&Ã'ýPrA”Ñ#úCà{ j꩘òA”Ñ$zÀœZ:'·?XA”ÑS¼o 4 â3"T!A”ÑSÓd`³ f#š$ANoA”ÑSâˆÀZ D$*cA”ÑSñ@F ,D,K.@A”ÑSþ¥à}ŽQ ´JfA”ÑT¦`Ë{‚ÌA”ÑT(ë@ Ét(|/bA”ÑT:½€K3 Õ½A”ÑTKë n½œ+¡5JA”ÑT]N`'é &FA”ÑTlÎÀÈVU(aNoA”ÑT„ > _$…(A”ÑT—À ³!ü=VA”ÑT¨Ÿ p†µ®A”ÑT¼~`â½-€7MA”ÑTÖe€°¶*“,Ú ,A”ÑTçû Qê3A”ÑTù€@ s&¸µA”ÑU à¢;+œ2$#A”ÑUÅ èW!T/8NA”ÑU&n Ql)”A”ÑU9Ê`±J ™ *A”ÑUJ, ɘ+'7A”ÑUXy D !©A[A”ÑUfT  XÑ)¥i A”ÑUz²À£É¨ A”ÑUý *2¹ A”ÑU«A¸Ÿ sª^‰A”ÑU¾Ü ($Ê A”ÑU·@I ß$P#ÏA”ÑUã‚`; ö$A”ÑUýBM %3,N1CA”ÑVX€4X#2è A”ÑV ûÀ(í"£â:PA”ÑV2? Ž !fwUvA”ÑV@ßà1n"s)A”ÑVVÿ   ?:QA”ÑVc} ­ƒ1m*ò A”ÑVuU`' +¦*A”ÑV‰ ¡&G/EA”ÑVœ’ÀG#*#%!A”ÑV©t ) áä1¿:RA”ÑVÀÁ !#Ä# A”ÑVÔb øh4ÄA”ÑVã, õ+‘ú):A”ÑV÷3À êi[!Ò A”ÑW ‰ ñ' Ò } A”ÑWz H¨ä!ú"1A”ÑW6@ 4"4QA”ÑWF`ÕŠÇÍ A”ÑWX¬ —¯ Ä#1A”ÑWq  Ç,¯0n%4A”ÑW„, Ïã· y A”ÑW•KÀud.M A”ÑW£q` «0|…A”ÑWµÓ€–°•6A”ÑWÊc@¯ž5±-A”ÑWØ·`Š 0ã ªA”ÑWê@ kä/ñ A”ÑX¼à J"§$A”ÑXi`á R¹%׃ÂA”ÑX%W J pÁ1DA”ÑX5–`0î)3IA”ÑXLÖ 5& „LjA”ÑX_Î@×t.kA”ÑXylÀ”5Ù A”ÑX… o± Í " A”ÑX– sš=- A”ÑX®Ç È# A”ÑXÄœY)àþA”ÑXÙ-À! ®ìA”ÑXäZ@±z(î!A”ÑX÷Öà²2+š A”ÑY‰@ Ø•zMoA”ÑY&=€ Áÿ+ôJA”ÑY:»@hO¾4ÍA”ÑYI` ²s#X!A”ÑY_:€Õ sã)« A”ÑYv½  Š ×:çA”ÑYŠ5 §„%‰y A”ÑY›@íY ("«,>A”ÑY©‹ H#D( A”ÑYà D ì d ^A”ÑYÏe CÚ"½ß!-A”ÑYãÔ:†x"/A”ÑYò@ bAe2ë A”ÑZ›Às€ G&A”ÑZ; õ i3•l£A”ÑZ*R€ ²C,ÎDA”ÑZ< Ñ^/.2ÖƒÈA”ÑZTl€¤Þ3z*[A”ÑZaf`V153˜ A”ÑZoÀ µä$ü¡¡óA”ÑZ·ÀÛ›ãvA”ÑZ˜]À X&ÿA”ÑZ©] ¼´t8ïA”ÑZ½)À Í&ó þ A”ÑZÏu@[ €.i A”ÑZàuà b67A”ÑZ÷;F—%É) A”Ñ[Éàì ˜–5JA”Ñ[E ’Í9!ù A”Ñ[&IÀY Ù x¡ A”Ñ[7î ˜ø+ã±A”Ñ[Q ÀHo 3A”Ñ[a˜ ¯ù ‘A”Ñ[uuà<ï#õ4ŠA”Ñ[Œ4@–b¥&A”Ñ[ž¥  ‚$(,=A”Ñ[¸‹€^n˜3+A”Ñ[Êä  ¼ !å5Ù A”Ñ[Þ× ¤ .?+A”Ñ[óàà´íÉ)¡A”Ñ\À ¥ l/·IhA”Ñ\A`É*L¶A”Ñ\&ÎàpŒƒ'I$2A”Ñ\8À`ª R-¡#/A”Ñ\Jl`e'.+ A”Ñ\\Å  ~4"2å%A”Ñ\t€’È§Ó A”Ñ\„&આ\"A”Ñ\”ÌÀ 5÷$È2 D^A”Ñ\¬¥àý0m`A”Ñ\ºë Ä‚÷$'A”Ñ\Í· À˜*8 ]…A”Ñ\Ùª ü . "6lžA”Ñ\ëd ¶ ˆ.ý A”Ñ\üÀ¡ƒ-¤f A”Ñ] Ú „¡+Ž*;A”Ñ]À F‹*A”Ñ](À6î!¥"¹7LA”Ñ]96€_ kû A”Ñ]Ir N{3“ A”Ñ]XN£ž#º$l A”Ñ]n`… ì,,8 A”Ñ]ƒ ¤$±1Z A”Ñ]’¯ aí•!sA”Ñ]¨Vl Þ,ü ~1DA”Ñ]¸~½ eF#© A”Ñ]ǦÀò Ú.ƒO A”Ñ]Þƒ %@ x,Ý'A”Ñ]ò¥ ;"*K A”Ñ^À öw#øA”Ñ^ì@æê©0xA”Ñ^'å  ÁUð(O A”Ñ^8· d l¾1A”Ñ^Hë€úWÄ5©A”Ñ^V ÿ„!-± A”Ñ^a‹ kÚ4 C A”Ñ^v; / o„ A”Ñ^‰:€ ´ê¨A”Ñ^žÃ@~m3˜&T©A”Ñ^­a l ]Ð$` A”Ñ^¼Ÿ ‚ O ZÚA”Ñ^É» Ae0'e A”Ñ^ÞŸ f 2ëA”Ñ^í}  H™å˜0CA”Ñ^þ>À„%Î*fA”Ñ_ é ¬(˜+B_A”Ñ_!i€§‹ó!Ã!A”Ñ_5XÀ ¸ —h: A”Ñ_HíÈœ&p±A”Ñ_[g`Ç3(µ.& A”Ñ_jÛ€ã*#q 3FA”Ñ_}% Üש'A”Ñ_–=à $ òm"ÇA”Ñ_¦: = ]3ÄA”Ñ_»–àýÇ1Ü… A”Ñ_ÊŠ€¥ÀÑ æ A”Ñ_à¡€Éû$™&®A”Ñ_íw@ ”%£3Þ$1A”Ñ_þƒàæz(ý.ØA”Ñ`õÀõ"ªA”Ñ`|æs¿'€A”Ñ`+ð` ¬ ð-àX+N`9µ¢{ A”ÑbNþ€ ›€†7^ãxA”Ñb_$ÀÂ{ÉUyA”Ñbo]€ žê#BáA”Ñb„º@Ÿ<×+| A”Ñb’Tà µXR`!A”Ñb¡—@–ÉÌÊ A”Ñb±ì€Œ2•  A”ÑbÁï + Ü&È3  A”ÑbÓD€ÖZsá?VA”ÑbäßÀ*Í û A”Ñbòå`t5""›A”Ñcoàml)i$,!-A”Ñc† / 5& A”Ñc'Ö`²¯+ú-ÙA”Ñc1*À ¼,rÑ A”Ñc@kï.ï;8NA”ÑcQ[@=Ãè A”Ñc`ëàõ€$þ hA”Ñcl—à% 0 y1EA”Ñc{WL›2Ñ JiA”ÑcŒ€àͬä A”Ñc™ µ¸0Å…?YA”Ñc¬I|ëÌ A”Ñcº² ú¾,Ð+‹ A”ÑcÌ” Ø @"Ï A”Ñcá6@B ‰“—A”Ñc캠­ 7A”Ñcün@µ–^ЧA”Ñd?àX‰#W- A”Ñd÷€é1À)Y4IA”Ñd19€×P EA”ÑdBäà·û"âã A”ÑdS&Àù÷d3e A”Ñd`Þ`sIš A”ÑdoÀFÆø6s A”Ñdƒ“€ ï²)jê%3A”Ñd”åà`D¼ ê A”Ñd¦€jsô6;+;A”Ñd·€Kí C$FC_A”ÑdÂ`[ s5½A”ÑdÖK€ ƒ7#® A”Ñdâµ „ 4‰eA”Ñdî€ šË(ƒÃC\A”ÑdûÙ€V¶%O(µA”Ñe £€³ÝŽ#oA”Ñe`“ n·u A”Ñe-b`ý?Z A”Ñe9ù Zœ /*%4A”ÑeIu@² MoA”Ñe]` ކ!Í¡A”ÑemÊ ©u!©n\A”Ñeñ °6T-@A”Ñe‘¹À ‹[5W|A”Ñež"@‡ Æ%;"A”Ñe±lÀ |xÄ A”Ñe¼1@ mk‡< A”ÑeÊv  ü¤VA”ÑeÛ€  Rý%kw A”Ñeë `kn Ì)8&A”Ñeý^ Ó S4ÒA”Ñf€ƒ¬X$BJkA”Ñfš ´ k/~A”Ñf0?`›>"djA”ÑfCj€T}(A”ÑfNq€SgÇ(BB^A”Ñf]û`v Ë$\ BA”ÑfkÙ •;'ýO A”Ñf}O`¼%Å1A”ÑfŒ_` »7{A”Ñf› æ o:QA”Ñf¨å@®d©Ö A”Ñf¸Êà ®f*À%(A”ÑfËÿà7 BJA”ÑfÚ¢àOÝ(âŒA”Ñfí¯à·8ÿ A”Ñgê`á ³A”Ñgˆ ;Ñ<A”Ñg+ìà?)ð2“#A”Ñg;``²g!YôA”ÑgI÷€ Ï ¶ã A”ÑgZÛàjÕ}#ä9NA”Ñgj[@È î" %_…A”Ñgy ‡N&Q(ŸA”ÑgŠOà: á?¦ A”Ñgœ)@ ‡Î(ŽA”Ñgª’@” }(µ!øA”Ñg» @û /(!MA”ÑgÉ‘  ˜³4À!¨#A”ÑgÙT@… ›0  A”Ñgî§¿&~ A”Ñh“+\3rÂA”Ñh˜à  aÈ5KA”Ñh)]F%(.Ò A”Ñh>™À×)f!A”ÑhQ@— Ã)*'6A”Ñhaé`Kg) A”Ñhqð@« @-pA”Ñh‚ËH6( … A”Ñh—‚s$µ.A”Ñh¦q Ù`5r A”ÑhÀñÀ .,4ƒ®A”ÑhÖ=à ßô_‹A”ÑhéÞ` ´{"k#|A”Ñhúª€U ÿ'Ç#™A”Ñir 7 ¢+\A A”ÑiÏ@ö !š à4GA”Ñi-s@) `ã^ A”Ñi@æ@ã×5YA”ÑiP¹€³HP)nDbA”Ñil6À ²G" A”ÑiyG€y #ùÆ A”Ñi‰éÀlÛ ¢D`A”Ñiœÿ°–9 A”Ñi­ú û3 ¸:,A”Ñké.ÀW ’2)M"A”ÑkùK`f¯'76% A”Ñl À Öê6µ"f)A”Ñl%` ˜ßö!A”Ñl-Q` PÛ Î+lšA”ÑlC#`—!ª(g A”ÑlS`w ½#Õ A”ÑlaÑ¡.!##A”Ñlt K #“$A”Ñl†›@ÃÜ q A”Ñl–p@˜À"¢ A”Ñl¨]` Ë sÉ…A”Ñl¶‘€ ç˜,—1”A”Ñlű@c%¹©'A”ÑlÖß`#!j$K A”ÑlìÀ' /& V A”Ñlþ‚`ô³6"›A”Ñm iå0OpA”Ñm+O€=7–%ˆA”Ñm@Š€æ `„&é4IA”ÑmW   Ùõ5Ð6MA”ÑmfZ Á *!&A”ÑmtÀ¡/, ˆ A”Ñm†±¼, AOnA”Ñm†ÀÉh,ã2æ A”Ñmžé`Zÿ*í*7A”Ñm´+Å»'«A”ÑmÄà 2Îí«HcA”ÑmÜk` ãs%K'm8NA”Ñmèú`ê Œ9B A”Ñmø àÏ+¼#l A”Ñnð@” <%_FA”ÑnþÀ°äî%A”Ñn)å@ ¦C%ñ)o(7A”Ñn<àV H-g A”ÑnRCÀ ´çB]A”Ñna`  /} A”Ñnn‚ ,FRA”Ñn‚Z —6)*MkA”Ñn“ à;P"_é".A”Ñn©@T9+íA”Ñn¹2 Ùu'$A”ÑnÍ#àÅ ²"ø A”ÑnÜ  •Ön â@\A”Ñní`³åÖ × A”Ño× Õ(Ñ  A”ÑoTÀlH$.¯A”Ño* `äåÛˆ A”Ño>Ùy1" 0#A”ÑoQ‰ ‹2}&´A”ÑoksàA 1( ‰ A”ÑoyéŠ2²8A”Ño‹Œàüö $ ãA”Ño¡Á s^¡`p¢A”Ño¹›  Öø ç5ÂA”ÑoÖã$û$ŸõA”Ñoéb (Ñ"ÐA”Ñoÿô€™û …)‘ A”Ñp~àÌ µ#È›#A”Ñp#Z @åY( A”Ñp3X@ å ©&5 A”ÑpCç Þÿ'XJhA”ÑpV>À l RLÁ"A”Ñpg,À ò"Y!14GA”Ñpz E œ†o A”ÑpŽÖ  üF-Sà A”Ñp¡-Àu±* _A”Ñp³Ï@h\(“A”Ñp¿â@<3çCA”ÑpÏä`Vb^{A”Ñp߇ ÉÀ r³BZA”Ñpøö •Á»,‡ A”Ñq ^  ·A£ØA”Ñqj@ *x1," A”Ñq-qÆ þ ikA”Ñq>Á Òè$Ï”;SA”ÑqNB“Ø)d#0A”Ñq`b€ð¿¬'W_‰A”ÑqrT — q * A”ÑqÏ`Ù ˆr A”Ñqc *¿7! A”Ñqœè ¸ Ù šÆ4A”Ñq°0à&Ýò/ßA”ÑqÃ@ ¨ #N3m A”Ñq×j€%E+Z´ A”ÑqäÌ€yi)ùA”ÑqøSà öb= CA”Ñr Ä„ ì"Ã8NA”Ñr` ¸ ×A”Ñr+”  ð~K5§&5A”Ñr8-@ ªéð!â(A”ÑrH)Àâ—V"YA”Ñr[í6 2íb¥ýA”Ñrj€ Øb%±Ú A”Ñr|°€*ñ5¦:TA”ÑrŠù .À#†4¯+:A”Ñr™tÀ÷%— A”Ñr¬gò '"Å /AA”Ñr¾iy­(' A”ÑrÌ&œ Ê0` A”ÑrÝê ¸˜|$6ÒA”ÑrðJ@ ü à'‹¡ A”Ñs  S}À'A”Ñs ^kª,“ A”ÑsÜÀw)­¸A”Ñs6V _n/j A”ÑsI[ &pµ(ØA”ÑsX…€I F0Ç)ú A”Ñsp`r (A”Ñs„ C Cù)ØpªA”Ñs—6 á ×'×6¨A”Ñs¦y ƒE3”%q A”Ñsºù`® Ð+Å%æ!A”ÑsÐU  ‘;A”Ñsä€ ô•'k æ3GA”Ñsø“ ¾1(Û"`h•A”Ñt ç P 3#ÛA”Ñt µ ¸ç5A”Ñt+n Êå,HA”Ñt<ààœ-,×A”ÑtS_ *'á%qA”Ñtaã Ð [$š- A”ÑtrÕÀTY%k½ A”ÑtùÀ#>1A”Ñt›  ˜ImA”Ñt­g WN7ÕA”Ñt¿¿`«ˆ(R1‡ A”Ñtؽ€f™+%åA”ÑtåÊ W ÝÙÈ A”Ñtÿ@ ¸Þ*¨'–"A”Ñuÿ V ú IA”Ñu$ ¢=#<<TA”Ñu3IižuIA”ÑuLt T 5JA”Ñua9` ŒþF3 A”Ñuwà Ž»"Þ-@A”Ñu†ý€· ß'> ->A”Ñu™>ÀS)` A”Ñu¯Ôsó"º6¬A”Ñu½·`¹¨$Ž&A”ÑuΜ ¬ X µA”ÑuâÀ Þ<N#0A”ÑuöŠé<ÑáhA”Ñvaà D7k A”Ñv"Ó ‘Ÿ7A”Ñv9r+%œ1÷A”ÑvPbà·¶0N˜A”Ñvfô€U] I ~A”Ñvz—ÀÅGð%?[A”Ñv‹Ù€’ TC#A”ÑvšaÀ Ë «#´)2 A”Ñv­¸ÀNO&Ò$A”ÑvÁ­ }õãHgA”ÑvÛ`QCN#ð!A”ÑvïvÀ À x,‹ A”Ñw1àbÇ{ïA”Ñw–Àp+B3Â?XA”Ñw/` H?(¾-¢%A”Ñw?΀Õ·ûÍ>A”ÑwW: SÞ,-)8A”Ñwg€Ñôé#*:A”Ñw|$€ ú#@A”Ñw‹Å€·Õ/ A”Ñw¤=à  þnA”Ñw°< •Ä %ˆA”Ñw€© íãý*A”ÑwÕ×À7‹ J ‚MoA”ÑwæZqº+yúA”Ñx `æt°c A”Ñxé Ž_}þ"A”Ñx1h eR!‚ A”ÑxGá Ñ €6†#– A”Ñx]µ  Ô  ¼A”Ñxr%À ·ã(:RA”Ñx‰s¶–/¯!‚ A”Ñx™™  m­$A”Ñx¬â < ž®#A”ÑxÀ„ÀHš¯*ü A”ÑxÕ«à·O'²A”Ñxç£À e Ñ. ±A”Ñxúõ@ú#ïØ&A”Ñyñ5H˜0‚ A”Ñy%< ±ÜXA”Ñy9Ø ?,ó*;A”ÑyN@ÇZ, £A”Ñyhš€vÆ0¥%: A”ÑyzR _ Ú ,Ê A”ÑyŠºïñ$Á2o A”ÑyœŠ = 5_ A”Ñy±… ©Ï'ŽA”ÑyÍ/àË e* dA”ÑyÛS`- Œ4LA”Ñyï Ð®A A”Ñyü{@ &J æ6 A”Ñz2 ƒm' 6™.?A”Ñz#‚Àu“A”Ñz82 …åA”ÑzG  ÃøŽ/ôA”Ñz`•À ˜ìy ë A”ÑzpK` žQ.Í]ˆA”Ñz{ú ‚š uA”ÑzD@«Ò i½%4A”Ñz™W@On,l/@A”Ñz«ÊÀ27þ ` A”Ñz»Þ`ƒ *A”ÑzÏì ·!—5 A”Ñzà`‹=-úšNnA”Ñzóï·'¶9PA”Ñ{yàt¶ ² ¼ A”Ñ{ƒ m¿'Ü úA”Ñ{.5à( h - A”Ñ{< @˸F (7A”Ñ{Lu ñEr¬ A”Ñ{a‘À‘x,v A”Ñ{q<@ -Ö ’ A”Ñ{ƒÎà ž*Ôh˜A”Ñ{˜:à %N A”Ñ{­3 Þ U#©QQoA”Ñ{½M ®~ÁzQtA”Ñ{ÎÌbÝ *K A”Ñ{Þ¥ €à!uA”Ñ{ðà K ð7$ÊA”Ñ|¥  J 6!Á ¢8NA”Ñ| e t.º˜A”Ñ|3ŒÀò‘ü(ƒ$A”Ñ|Gi ¿ Ô5ÕãA”Ñ|]IÀ¨Þ! A”Ñ|w Pú#&3A”Ñ|‰ # Ï+÷ H A”Ñ|œ“€Lˆ'ÌÐ&A”Ñ|°2 I’,j! A”Ñ|¾Ý€J Rò7A”Ñ|ÖÚ@Ñ ]/A”Ñ|ã¥ànª#ɲk˜A”Ñ|ö΀#²”A”Ñ} ²€¡_—!õU{A”Ñ}!u` ¡ ."»A”Ñ}3–@ÓJÚA”Ñ}Gu è$<6LA”Ñ}aá  º ð&-ÚA”Ñ}t™€Üú//UA”Ñ}‡? ‰º04"˜OqA”Ñ}–[ \ ,- ' A”Ñ}«ç y BU A”ÚlÄt  –r'5C_A”ÚlÚ€ © *Å'6A”Úlë` • ¶] A”Úm®@ {Ç+”ËA”Úm ¤ñ ž' A”Úm$”`l “+uA”Úm3€ S‡ W"Ä"A”Úm?ðþ ã,M/À1EA”ÚmQ?`¸A!CK?XA”Úmd`\„!lxA”ÚmsW€ù/üÙ=TA”Úm‡] # Ç&7#A”Úm–:  "yA”Úm¥¼€ Ä,þ'RA”Úm¶R k êÜ0ÿ A”ÚmË+ £ã%o­ A”ÚmÞÑ â ¿( A”ÚmïÀ@ê#‰ðA”Ún– R±å+Â]‚A”Ún†@ É¿'‘€ A”Ún(â d&<Œ +A”Ún4kÀ-i1Q9OA”ÚnCÆB)*:4ðA”Ún[óàº; &šNpA”ÚnkÄ õ ‡P#4A”Ún}l °Œ0ËaŠA”Ún›@ Ý´™ A”ÚnE€ Nˆ!e Î4IA”Ún°¡À0ʆA”ÚnÇñ  Èn&p©sªA”Únßö@mU-(5õ"A”Únð¶@(¤ d ÛA”Úo=«Ô7AA”Úo±À `-<u)A”Úo/æÀÅG*“Ú +A”ÚoCÓÀÍÛ”A”ÚoZ¾àž9#!$' A”Úop]€S ­#j A”Úo„ÎÀ5) Õ5.AA”Úoš0 éž4%Ê!A”Úo¬r€O 80È(Ÿ9OA”ÚoÅ/ oÛ Š!A”ÚoÕ(@Ž“ H%3A”ÚoìÁ ¿’â A”Úpð@ 0wJ&LkA”Úpâ@Z ú"žÑ$A”Úp*Äài”(HA”Úp<}€ ¼ >0F9NA”ÚpTvÀ±’z,ê A”Úpe— 9T s#1A”ÚpxÙàeŒ')]„A”ÚpŽÀFT ‰ÁA”Úp¢»`ÊäY3 A”ÚpµÖ`¾ 'F*A”Úpȶ࿨2-=VA”ÚpÞd@Êø ‘dA”Úpð" ÙIÚ.'A”Úq` ¯Á£$:QA”Úqw€" ³%Ó A”Úq5V ÙUœ/BA”ÚqK‘€Ã%Ç× A”Úqj?à/ù&£A”Úq…ŽD '¤ [RsA”Úqžô@» öï Èp¢A”Úq·€ ã½#Æ2Ë A”ÚqÈȳIà A”ÚqèØ` "„3xSwA”Úrƒ` ®±*‰|#1A”Úr6,TÄ•A”Úr)­ R;!4&E A”ÚrA%à> úD ³5KA”ÚrSŽà ùrA”ÚriÅà (ù‘hFdA”Úr{` Ï&¹{ A”ÚrÀ¾Ñ´éSxA”Úr ì€WX[ 1·A”Úr´L Lr)˜%A”Úr„ Á$LfA”ÚrÝþ ‰:9+£ -A”Úr÷â` G e!a(8A”ÚsÀ@Hi+ö0¯A”Ús0)ÀÍj ˆHA”ÚsM`ï*¦"„ A”Úsb]Ý ³!¢’ A”Úsz] ë= º. A”Ús’Åळ&8¯f“A”Ús¨@¹F¾îg–A”Ús¿ó€ô‡6Bµ0EA”ÚsÕ# IB!Q -A”Úsór` È0µ)¨ A”Út%ÀOT,W”A”Útž` ýÁ&5A”Út5 Û‹ÇÃA”ÚtMàœ/$XA”Úta ø/Œ)_4GA”ÚtvÀzÈ'·OA”ÚtŒ Sö&ƒ A”Út¤Éà ¹²Õ3 A”Út¼+`؈Œ A”ÚtÎ{  ì# "P A”ÚtäjÀH °5!¢ A”Úu¤Àí/… A”Úu·`³Tõ*ÊA”Úu8rà à y$cÊ;QA”ÚuSÒ@à’#P%ãA”Úug—€) _#Š1ûA”Úuu|`¢å ©sA”ÚuŠºÀåÏ$Ý)A”Úu¥L 4>#«'ò$A”Úu¶¢ÀL )&å  A”ÚuÓ €~³ *:A”Úuç Ð|A”Úuûy€ž¹ºUA”ÚvŠ€æõ#r.Ôk˜A”Úv'‰  F0$ò A”Úv8õ@R ÌÄk A”ÚvP´Å‚,«$Á A”Úvbž ¤ WŽV}A”Úvsh` Ëå#L5˜ØgA”Úv„@  m A”Úv *W±4—8OA”Úv¸±n÷*'EA”ÚvÊ €8Ë6A”Úvêä Ó.%í. A”Úw€Œ6#ï)å-?A”ÚwÃ@»)¯A”Úw3 @ î I A”ÚwBvr#$ã1DA”Úw[ð@ â •ûs A”ÚwvààAO*A”Úwˆ·À)A0AèlœA”Úw™À2,k1DA”Úw­€‹ 04Ø‘ßA”ÚwÅ· K˜® ž0BA”ÚwÝgaÕÁ%ÙIhA”Úwôé^ ”*F Õ#A”Úx`É› é$| A”Úx"d à  A”Úx6 Úë?YA”ÚxH­ 5æ &A”Úx]ZE*D2Ø A”ÚxrÅ€VÐ4Ð~ A”Úx‹ . VA”ÚxžÀ a1XÕ A”Úx±`«™6. A”ÚxÇÀK& :ŠA”Úxו€tèIÂ1A”Úxî6àb[/€= A”Úy™`$w!!.ŒGcA”ÚyS€Gôÿ%%5A”Úy)ú  Ð~7j}´A”ÚyAÙ &Ë!] <r£A”ÚyZÞ€" °$wù,=A”Úyr)€| ‚%A”Úyí Q*+…$ðA”Úy”vÀ% ÄþJ:PA”Úy¦à ôe€$E A”ÚyºKÀ z¿A”ÚyÍ@0g.ö"A”ÚyâòÀåf –’A”Úyü Ø1õ + ,A”Úz [ xc%W+˜(7A”Úz$Ì€ó,&¸ãdA”Úz9è`Ñ 7,É“"/A”ÚzL‹´)/«Â*A”Úz_ü@­°*{ ,A”Úzu`%¬¥A”ÚzŒhÊx)’„ÅA”ÚzÌ@Á ‰0Í3 A”Úz²I€Œ2+1ó6LA”ÚzÂC`e”# › A”ÚzÓ߀ƒŒ.x A”ÚzìƒàÝ 0– A”Ú{Æ€ý |.ëŒÒA”Ú{© ÅQ ænA”Û#gÝàCt(zÄ A”Û#û@=å #Á9PA”Û#“\ KLœA”Û#¢Ø ªïÜ)Î!A”Û#¶ö`_ E*Û” A”Û#ÌÅà0f(19PA”Û#ã…ÛæE8‚ A”Û#ÿ( ˆª*y1÷ A”Û$8`]‚ô+j/CA”Û$3z€ æø0PH(6A”Û$Ku`œÒ"› -A”Û$^: n}'Õk@ZA”Û$rÚ`Ñ¿Ö4HA”Û$޵ ×,Û#A”Û$£àJ @¨u¦A”Û$´•€Za Å A”Û$Ɔ ¥• 50Ë A”Û$æÄ@A”Û$õ£@ ÀÕ ÿ?YA”Û%.À k/¢*.A”Û%z€L¥-Ž A”Û%1 Àï#ôjGdA”Û%Cñ  .ÕÍA”Û%Rf *wl1Ò&5A”Û%c¦à vý©$* A”Û%w€. ²ó/A”Û%‘àÄÀ"š4A”Û%¥†ØR%=&5A”Û%»—`+ ß o*A”Û%Ôà oÁ)A”Û%ç¨àø#    A”Û%ÿi Tªc A”Û&ñ@i/ A”Û&0¨ 9. î.&A”Û&A”Û(´œÀ <@)^A”Û(Ç`\Tƒ’ A”Û(án ŽŸ"®A”Û(ùÀ Ó ÿ \! &6A”Û)Jàôl(µ^ A”Û) Ÿ€´‚ ² A”Û)6ÈÀI+kLkA”Û)M+mä ê A”Û)\G { y+YA”Û)s£ Ò A;(Æ A”Û)„˜  ¶ ó4ôA”Û)—éÀ d!­ A”Û)­ E‘ ã A”Û)¿ “&TcDaA”Û)Ô÷ ¿)! 44 A”Û)ëà~{.œ A”Û)ü\€ „? É"A”Û*­€ `5`ÕA”Û*'À\\ \$“ A”Û*> Á ý!‡.W->A”Û*RÌ`̰"G(A”Û*kó€U ò< A”Û*€³ c50û A”Û*•L $B)ä-ðRuA”Û*¨ˆ .²Ê W A”Û*¼o © 8ð§÷A”Û*ÑUà ²§­ A”Û*瀠 ¹(GFA”Û*ø `T Ü ö A”Û+ ¹@‹±A”Û+"F`Å_ÈRvA”Û+9j@IŽ/A”Û+J& -&DÜA[A”Û+]ÐÀ žÿ9C A”Û+q—€‰fO†ÁA”Û+€½€43 e A”Û+“ãÆÀ/²"D_A”Û+¥.ÀÛ Ò ï$t­A”Û+¾r@5øòA”Û+Õ¯ y/. A”Û+ðkàHÊ Ø A”Û,q@q$é$î A”Û,À: ¤§1 A”Û,"ú€ p¶ )m A”Û,?cÀ„ k!«1Ñ A”Û,Mž`êÖþ­A”Û,`€ iK .0B^A”Û,qõ@sÐÑ ¤ A”Û,…ý@ Ê´",ïA”Û,—÷€{4,h-‡$A”Û,ª àÿW%ø,R A”Û,¿©¬K$i  A”Û,Öo k ¿3NA”Û,ëH@–È$3  A”Û,üK`Í 'ßc'A”Û- ÚàE×(i%ñA”Û-:@ƒ ^Ð&ÅEA”Û-+¤€¤"27¸ A”Û-CöÀ¤Ø/a‹A”Û-U逼 ̆3/BA”Û-k³` ÿ u(î A”Û-~ËÀ æ ®S*;A”Û-•«`"Õ A”Û-¬Çà± ¢/-h>VA”Û-¨@a˵Ê8NA”Û-Ó‚`×IíIB]A”Û-è”`·é&Ѐ A”Û-ûE`>à+65 A”Û. à3z3‚!% A”Û.%À: ¾ ô0A”Û.8²`¦û6`¯T…A”Û.IÛÀ Ó¸qQrA”Û.^ú  ñÆ œ A”Û.|ùàåÃX/BA”Û.Áà Î"Ò ‚2EA”Û.«|`Ä&ÂA”Û.À¯ž®P6?æˆA”Û.Ó6ªÐ!¤ i A”Û.à£Õþ…57'6A”Û.òÀ8yU2Õ A”Û/ ` ð=g g A”Û/  ‚¹Ä#å A”Û/*h — ÷,ä%4A”Û/Bì å>&¹/Ž ,A”Û/UÂ,2ð÷ A”Û/jRàh"Hœv©A”Û/yQ €‹•A”Û/Ž' ’²)G€ A”Û/¥H Å²øA A”Û/Äà&‘5.â¢A”Û/ÙµàôñÝf/AA”Û/ðÕäw2ܳ!A”Û0Ü 4,¢"A”Û0 ¶àš¨Ê« A”Û03·` fw A”Û0MÎ ×-ÓIA”Û0aÖ ]Š&Ù A”Û0r`‰ Z0\—ëA”Û0Š^ õÖ$Ü1EA”Û0 üàC Ï'Q A”Û0·àƒ !2Ð'WA”Û0Î~@E ±g$Ê A”Û0åÀ :5pVzA”Û0þ2àKü y¶A”Û1q€½T PüA”Û1%šàN¦-G A”Û16߀ ªn/åºz¸A”Û1EnàHã$æ‹A”Û1Zj`ºÓ cô A”Û1oøÀ{2#"ÁA”Û1„€¨…#w'¶­A”Û1™àÀ ³6 A”Û1±˜  ©ßB6uA”Û1Î0à ¯G§!bA”Û1öC@ ËD(-6®6KA”Û2 €á%5K A”Û2$ € \ë œ&è A”Û25+à  Iº%4A”Û2QˆÀ¶ #.Ò A”Û2j¦€ˆÆ-@ A”Û2…CÀ®êêK0AA”Û2š[@ñÎ0ÕKhA”Û2ºCàù v3T(EA”Û2Ì ùÆ+Dí)A”Û2ã´@©fô'3¢A”Û2ÿê æ ì%œ@A”Û3 €L¸*à õÂ?A”Û3+9¥~!® A”Û3:h | îì)$2A”Û3TI`_3 #åKiA”Û3hW€ü -F(ÜA”Û3E@k$“A A”Û3’䀀ŜA”Û3¦êX#É'A”Û3¿‚À( }Ø "OqA”Û3Ô¹ÀtRÎA”Û3ìÑ ¶%Ã3ô A”Û4‚@ ½1I#Q A”Û4Rà± Ü’ A”Û40!€Fn(s Æ A”Û4J‘`{ÚT /BA”Û4YÆ ‚Áý¤ A”Û4pÁ` í·){é$A”Û4‹–àJ09#×A”Û4›m ³ éŠ'A”Û4®öÀ ÛÆ!™6¡œéA”Û4Åý@‹4¾( A”Û4ê_@ °‚ o–A[A”Û4ýs€º2Ƨ?XA”Û5@]Ý×4Î0DA”Û5(I 1"15'Ñ A”Û58ûàzrÇb"/A”Û5J7 à%A”Û5e³ säÙ Â A”Û5wÚ€Õ4}¤QxA”Û53 "K)TÍA”Û5«7 O q(œ” ,A”Û5½i ä £­['6A”Û5Ö³`לÁ2› A”Û5ðê€ £ÆK<A”Û62  ÐŒ!ÔÚA”Û6$¾ ç!Ò)Öh•A”Û6:ŒàŽÕ'€ûA”Û6Mh`¹§+ÿ ÝA”Û6]›À—Fq.p A”Û6pp€ ¥&#DA”Û6‚³ d j!’9SuA”Û6”¨ 8d*,yA”Û6§Oà ’*C-|A”Û6·7à xÃ$€  A”Û6̦`eÂ3t A”Û6ÝÍ€ u)—:E`A”Û6ðŽØÝ-E¹-?A”Û7Rà “3O,5JA”Û7P€·LÌ.ø?XA”Û7+U $Ì A”Û7=Àļ{è]ƒA”Û7ZW€ ’8dì A”Û7t™š Æ"A”Û7‰‰`Ð ² ’QA”Û7œÃ 7t<,u A”Û7®)€ '#‚’A”Û7ö@¡³5•_A”Û7ÚYà«{ ®¤=VA”Û7öæ sžIA”Û8 Oà=á%Û+vA”Û8#»€ðY¯#Ç'A”Û8;â` p Ä'QA”Û8Q>@Ù 1K)Õ A”Û8n‡€c^d¶A”Û8ˆ º3! A”Û8¡Õ@ ºz%|-(A”Û8¹&ÀXà {,?A”Û8ÊÇ@})¾4 A”Û8îrà!, ¡t¯A”Û9æ` ÚK2R+÷A”Û9Ë )ã' A”Û91›`  ñ’SA[A”Û9OŸ@‡Ë v A”Û9j!€“ &¦)î3GA”Û9†² $p¤/5 A”Û9—V€ Ô4t@YA”Û9±£€ Ë´ šA”Û9ÌOà â#!Oö A”Û9æàVQ6ñ.DA”Û9ôï ±Ì½> A”Û:ÂVç'FbA”Û:"ÿöT)œÌ%4A”Û:9*`„&{ ¼UxA”Û:N@/ Í 0Z A”Û:iêàW$¨4ÇA”Û:‚0qŽ÷$àA”Û:žª`m 2ücQrA”Û:¶Ô@pù A”Û:Ìn $ é"]#Î.@A”Û:à î 5 Û+åA”Û:óà·÷'ìA”Û;àlB Ô A”Û;T  …ÒŠ¤PpA”Û;+« Òj0L)Æ ,A”Û;<§À([¾ pPpA”Û;V¥`[v.¨cA”Û;l>`å"m¢<UA”Û;‡ @­E(.ÁA”Û;Ÿà~sç+™ A”Û;¶ãà†PáÐ A”Û;Ík ‚C þ} A”Û;æ=Àj Ó3 A”Û;öÖà ;ð!˜$ž1CA”Û< L` @%(A”Û< f€ )2w A”Û<8ð€ 3 —A”Ûj †A”Û=õÓ@2§Õ&¶g—A”Û> 8€† L(E1A”Û>%`Ù ¶ï4IA”Û>4S€R ï ™ A”Û>Eª  N+ê A”Û>\‡ S $§+üA”Û>wq l*] A”Û>ûÀ¸Ä {-?A”Û>¦,@++ ¡(A”Û>À@Ü·/Å"À A”Û>Ö_€4 *Y)A”Û>ëÓ 8 qÂA”Û?a`Y7!65• A”Û?î ¥Ä$ a$1A”Û?*A š Ù"C#ÃA”Û?<ä€A !2Ú-™ A”Û?TûÀ”í j' A”Û?g!`÷ “;|A”Û?z} ]J.ð¾A”Û?•*àá%ëA”Û?®}€ áʺ A”Û?¿¸À fTÉ!ŸA”Û?ÙN Ï × .o¬A”Û?è`¡O*1þ4IA”Û?û& ÆÑ6tÓA”Û@“ ¹ñ½d2HA”Û@. “Ј¿:QA”Û@@x ¤$Y3-=UA”Û@]èÑO ¨t5KA”Û@vDŽ )¦ A”Û@u 2¡'ŠA”Û@žÖÀD¨ Â1[€A”Û@±jRts4†A”Û@Î÷ +N"ï}#A”Û@ä àkœ Z A”Û@üu d ±RA”ÛAØ pÌ&›,&A”ÛA%€À¡$9  A”ÛA>+ ŽJ Ó!¹A”ÛAU3À@ œ!Ín$1A”ÛAf €ƒn` INoA”ÛAy™@¸þçÂA”ÛAW øß(µT A”ÛA¦T  È‚ð&A”ÛA½@óÕ 66KA”ÛAÕoÞ*„*PA”ÛAé¯@ŸšZu A”ÛAû7€ ™ž!Ú*ð*9A”ÛBÊ íÑ6`A”ÛB(¶ <+¤7LA”ÛBB§@ Âõ( A”ÛBX`ÔÁ a(Ò1FA”ÛBj =!ÒfA”ÛB„ž@Æç$e™ A”ÛB˜. Ë€f A”ÛB«Û z¸ 'Ï A”ÛB˺  ø6%‰A”ÛBÙë Ø ”7 '6A”ÛBïÀ@ Q ŒRuA”ÛC ™ |[.£‹A”ÛC& kùüA”ÛCB8±h”! A”ÛCYƒ Ž%4A”ÛCq$`ð˜.‡ A”ÛCˆ@žû9-Ä A”ÛC¢Ä•R)<)ù4IA”ÛC¹. ÙÙ‘A”ÛCÓR šÈë A”ÛCév Ü;2ó3GA”ÛCúWàúlß„A”ÛDqà þÇ+®X*:A”ÛD)%€ù-4°-C6KA”ÛDA `Ϫ$û+Þ A”ÛDUÐ`E$é6 A”ÛDn}@ÇÜ"`'X{A”ÛDà€p ñ)Á¾ A”ÛD•²Èpɳ A”ÛD«Ã  ¸,†)ú+;A”ÛDÀä@ Ï ¤2ƒA”ÛDÕ~àÒ8A”ÛDéQ  ±2/‡ªA”ÛEä 3k':.ð2FA”ÛE/`â+'zA”ÛE/Öà  û˜0„/CA”ÛEH„ Â˜X,<SA”ÛE^½À “Ã&O!ðÛZA”ÛEsë`J ô?XA”ÛE޶à p ¯  A”ÛE¢÷€ @þ0¥ ÅA”ÛE¼í`/&‰,ñA”ÛEÐ$@ÿä'=3` A”ÛEæ¤` bØYA”ÛEù~ ˾!Š)%A”ÛFUÀ¢ #K1Å+A”ÛF'*%V Ö'A”ÛF<› Ô A+!¸ A”ÛFWú`‹ P4H!x A”ÛFh] 8 ïÔÓ A”ÛF|BÀ ©h*Æ0A”ÛFü`i¢Y$zA”ÛFªß€ Ò ³½ A”ÛFÂúÀ †i'T&ÉOpA”ÛF×o3 ± dÁ A”ÛFë~ÀŽš­|A”ÛGÜ@ !´& !.A”ÛG u€›v A”ÛG7» ÙA8RA”ÛGOÀ Ý ¢ A”ÛGnÎÀ Õ&çˆ#0A”ÛGˆ¢@¸ 33GA”ÛG ÞÀzq4Öj A”ÛGº{@£,é"áA”ÛGÌX œ 2(\t ,A”ÛGâ* 5×C¹A”ÛG÷Õ€ î¶2Áu A”ÛH +àzĵ½A”ÛH#ÉÀpõ*ì21AZA”ÛH9Ú ig="Ru«A”ÛHRv õ ª2%‘ A”ÛHii`Ú Ñ É10A”ÛH€L`Ù°!X A”ÛH•,€vü'äU A”ÛH«þ€í ù)**;A”ÛHÀ E Ñë A”ÛH×r`™» Þ ª A”ÛHïä`ä%0š7MA”ÛI€Ö|E.:]ˆA”ÛIà ªI" 2ÉA”ÛI/T8A”ÛI=\ 7“&ú1£ A”ÛIXנ̃œ!/A”ÛIxŒ€P++"¬ A”ÛIŠ¿ÀÇ Zâ/wA”ÛIŸí (Ô ?õA”ÛI¯¸ "ò.% ‘A”ÛIÄb l3q&6LA”ÛI܉`× i/ A”ÛI🠠ñÞ-›‚A”ÛJ@ÃT A”ÛJµÀW6a%Ö A”ÛJ)ò H _.êáD]A”ÛJAð x†øƒA”ÛJ\ öû A”ÛJq ãN0A# #A”ÛJ…‡` d-­-A”ÛJš.à:%15_ A”ÛJ½ÿ '=![FA”ÛJÒ2`.!Óá A”Û|# £ ®PoA”Û|s®%0+B\A”Û|+Æ€óu1 A”Û|B–`/ÍŒ2¹A”Û|U& [íÓxA”Û|f什 k'A”Û|y¼@  =«! A”Û|kZè-70CA”Û|¨  0X,´ A”Û|ºÔ@YZ"eA”Û|Êb@ Ô/7ðƒA”Û|Üà |•"•3^ A”Û|ó¶à¸¨%SA”Û}` Å ‡FA”Û}À O$‹.A”Û}96à3å†#W{A”Û}Kà  ~ ”½$·E`A”Û}`-J E!A Õ1EA”Û}qË@Y2Œ A”Û}ˆ†àï6* A”Û} Àld„ -A”Û}¶5 )ä _$2A”Û}̲@ &¸ A”Û}ݘ ð]*³;SA”Û}ó b *+A”Û~2Àþ ë òæA”Û~áÀÙÿ%Ãë>VA”Û~,pºY-S!'6A”Û~@ì& ÿ.ŠL"/A”Û~VV ™.&: z*A”Û~e@˜;#hV{A”Û~vKq Ýv0. A”Û~‰”@ <$_ ¿ A”Û~ ºÀvâ 'NA”Û~¶=ÀÙ 4)G(E A”Û~dž Ý ‡ç>XA”Û~Ô€€ Ñ. ÛáA”Û~ëª9&'ê á A”Û3€¿ ç¥%3A”ÛA@^ü5G!?A”Û)üàÀ ó4‹ù8QA”ÛArà=þ&»A”ÛVÊ B Ù·IHeA”Ûm‹ hq))© A”Û‚ËÀúó È"i A”Û›9À 8+NNJgA”ۯР’.ÜÐ!-A”ÛÄf ˆÇŽ 2 A”ÛÓÀ È2V[€A”Ûèz€ `ñ&3| A”Ûú›@hŸ3K A”Û€K iÎs ÃA”Û€ •` <! <UA”Û€6ý€ »^ñ5w0DA”Û€Kˆ­ z#2A”Û€`Z V Ë*V• A”Û€w†À.½R7CÞuA”Û€‡€wp$Ý  A”ۀƠf‰ Ö@ A”Û€²Ö Äd$!"/A”Û€Í k O«é8NA”Û€áE€­´,@ZA”Û€üd@| €"к1A”ÛÃà± Õ.}Ï A”Û+²`Ƨ[', A”ÛCèà L O.2A”ÛUAÀ­}àÉA”Ûj] »4"Á z A”ÛŒàâtL-VzA”ÛŽ~ }kw6À A”Û¡€‡> à&9)A”ÛºÀ4 çt'‹A”ÛËè  – ’w²A”Ûæw—)Å!A”Û‚b€ J ß =IgA”Û‚ßÀQq;#â A”Û‚+å` § ¶‚+„ A”Û‚@&`†l#¿P, A”Ûš`ü, -P(8A”Û-] O‹(4iA”Û>œ`g–,' ïlÖ  A”ÛV™à‡t Î.@A”Ûp·À¥Þ!lËX}A”Û†À3V. (ˆA”Û™„@æ )ª"›!A”Û±Ô`÷ k,0; A”Û¿`áN ÕGdA”ÛÜ, ãÁ æ*"1EA”Ûù-Ç¢ÏA”Û‘ Ú å ÌP A”Û‘¾À´R6#1EA”Û‘0ä° EÒ$¼ A”Û‘M4€ … þ %> A”Û‘c®@v,ÌÜA”Û‘w ­º$• $ A”Û‘_À® œ,§í A”Û‘¤!@œ‹&šZ A”Û‘¿ `m“°AA”Û‘Ö@ -$•àA”Û‘ñ5„Õ uA”Û’S€  ò)´AZA”Û’©@Çœ‚ñHeA”Û’.»@ :¡b)9A”Û’Dg Y*Ý ¬ A”Û’W!`¯À&C5JA”Û’sDÀ Š û   A”Û’†±@|ï$¶oA”Û’£™à4æo,ÎNlA”Û’º@`Dµá&t A”Û’Ï=  ‚ ¯ ïA”Û’ëÀ ¥  A”Û“ÝàØ*èòA”Û“®€!ße# A”Û“5ž`  W4T6p¨A”Û“Kí +aÊ$×A”Û“f¹r Þ( w A”Û“{(` sð!Ì3ÍA”Û“‘"„çìY A”Û“ Å` ÿ#¶)E`A”Û“·«þ™ó ~° A”Û“Íý îo--->A”Û“ã÷@Ä©/#/ßA”Û“÷「‚P› A”Û”`à áV.»-Ö A”Û”$E`k³/ÊaA”Û”:"d;u(A”Û”R—à ¬î#x2z(A”Û”lý@"ù(Ð A[A”Û”+6̳'6A”Û””ÚÀBÜ5â!A”Û”«ó€¬ 4ôA”۔ó ƒš8H A”Û”à×` ƒû6È!ª=VA”Û”óÀ@Ô ZÈA”Û•!` j»3‰™àA”Û•$àÇtœ 6!,A”Û•7Ú@Ϲ Ù0sA”Û•Qò !áá/_A”Û•a à ïê'6 "/A”Û•tåà £"™3=VA”Û•‘- äc+º5IA”Û•±…ûü%B A”Û•Àå–ìÂ$/ A”Û•ÖtÀ »ØTw­A”Û•é·À x%­A”Û•üá‰å!d¥&A”Û–Å ë§+­ ÅA”Û–,á`_!QA”Û–Cd@ú .$‰ A”Û–^S€› 4@LkA”Û–på`H*$< A”Û–‹ÔÁ  Â A”Û–ž¦ Y!‹D*:A”Û–¶Ã€ ã%6 » A”Û–Ç%`ñu!{$`C]A”Û–ãUÀŠ õ3)’ A”Û—@–$)‡ ¡A”Û—ñ@ _68#A”Û—.gÀ¸.5Bª7NA”Û—JÁÀßb*<<VA”Û—_ð  Ø ¶1ùRtA”Û—}@„]j2 A”Û—šÒ gV 0Û A”Û—­ Pí=A”Û—ÈK@ sD  Fd‘A”Û—â0Éf'#® A”Û—ö` c./!·ÓA”Û˜î  #[5ŠA”Û˜€@+'w%3A”Û˜.’ 2 "4+² A”Û˜FCN%1-#A”Û˜[C ÌT.­A”Û˜o£À # ´%þ;TA”Û˜ˆ@… ®(M&A”Û˜œÿ è_f)…#A”Û˜¸@ ÈÔ÷ üY{A”Û˜ÕïÀoŒ.Œ¾/AA”Û˜înÀH„1³+É A”Û™À°úv=UA”Û™á û°.%O A”Û™2j ' °¥A”Û™Dñà´ƒ– A”Û™Yô 2Ð+ù#_A”Û™uÝà î$Ü-£A”Û™ŽŒ ¶ø ^ ]UyA”Û™ª•  ž = ÀA”Û™À`h¡ (ö A”Û™ÓjÀ i ¾øFbA”Û™çþ ‡ $ºA”Û™ÿr‡ D  !A”ÛšL@¿p%Ï2EA”Ûš*ÈàÄ 1t A”ÛšC[à é f4ÎA”Ûš\´àÈ/6£A”Ûšv0Àab Ð/»W{A”Ûšˆ! í¤ x ¯A”Ûš›~àúl*FA”Ûš¬~@ß$9*EaA”ÛšÊüÀÙŠ()‰A”ÛšêËÀÚ¨V3B A”ÛšýbÀ",6€A”Û›§ ð)ê2XNpA”Û›.W€ ) á-@A”Û›C{  K$jœ A”Û›\%`½¥ ­8A”Û›sN ¿ˆ/b A”Û›‹ú€ þ ð‡7MA”Û›Ÿ®À Y‡&ª A”Û›·yÀX‘ ¯(F>WA”Û›ÒŽ nÒÃA”Û›ã`R²!Ÿ$ÿA”Û›öWà`  ³ A”Ûœ þ`…À Í,A”Ûœ!°àoa(<KkA”Ûœ:¸ U n8ËA”ÛœX±à µé Æ A”Ûœg¦ Öo-j”A”Ûœúêî,b*´X~A”Ûœ™1€\× ß#A”Ûœ¶Ñ` š §,XA”ۜϑ 7 >3Äu«A”ۜᮠ ô’ rÆ A”Ûœúè@NÜ*JTA”Û ^ ãž4ó)¤#A”Û$^€€+ ƒ<A”Û96à¿'#¢+›A”ÛOõ`K ¹½„½A”Ûj< üƒ/÷ …8MA”Ûd ºÚ û zA”Û“× µ!| A”Û©‰ ´ ‘ì JA”Û¿-àFÍ”* A”ÛÕ @Æ) 3 Ù A”Ûð>@XË$\=VA”Ûžßà‹A+ÚtA”Ûž€´ Ÿðq A”Ûž')  ÓŒ-¶á ,A”Ûž:ûàâÐz A”ÛžR÷@ìh#A“!A”ÛžqœÀ‡7!$A”Ûž‡3 Y*dÛA”Ûžœº` Ìm»]†A”Ûž¹L óã<« A”ÛžÚs ¿2…&ŽA”Ûžìƒ` ½ à!£ ÷A”Ûžú"`à£)’A”ÛŸ%@á·2îW}A”ÛŸ'š@°N#¶¿A”ÛŸ>ù@— À p*A”ÛŸYä@»&#¸*A”ÛŸp  ‰ T+m_/@A”ÛŸ†²àÜ…3U%ëA”ÛŸæ`à / ¥NlA”ÛŸ¶Ÿ`*='Ÿ3žmœA”ÛŸÑ1€Î¦ ÷!A”ÛŸí€ &p*ÜA”Û  ó{ _e'A”Û ¬@M\¿=*;A”Û .‚@ ‚ønžA”Û F)Àr³)X{A”Û _©àÖ Û¼,!A”Û w}€ dÛ"I A”Û ¦ÿ.+Í2¨ A”Û ¦Ð`¦`2è—o¡A”Û »UàÖç& A”۠ш”Í4¦[ A”Û ëY`’ö&è6 A”Û ÿï¨0h+A”Û¡;Nb%>¾.@A”Û¡.ó Ü™1»#²$A”Û¡L5@] Y“ÿ,1DA”Û¡¢÷ § ¥4ÐÜA”Û¡»ÖÀ5hÜ A”Û¡ÅÚà ùh,©!* ,A”Û¡Ýv€‚ FŒ¥ A”Û¡ì±à=n\!®AZA”Û¢À* -Ø ±¤öA”Û¢ ÿ •Ì•C_A”Û¢0°H&¿*ñA”Û¢C¼à’›/Ê}A”Û¢aL ¹µ$2¹1DA”Û¢{÷à¹Ñ+b«A”Û¢•X Ñ"*/Ê A”Û¢§ú@ðô–)Ð A”Û¢ºìÀ­ Ë%Î A”ۢ˃€ÛŸX'ùh”A”Û¢ÛÔY ` «5, A”Û¢îHÑu0z “a‹A”Û£ë~œ8âA”Û£ ï >Iç§Ó`A”Û£58@ /P8ý—çA”Û£O àR- j›A”Û£h怷–¡8…+A”Û£ëâufA”Û£–ê é`1"sA”Û£ªÎÀý #ë1A”Û£Àh€/Çzv€¸A”Û£Ó¹À €“$ˆ A”Û£ê àW B/ÐùA”Û£ý½OH, .OnA”Û¤8@2¡ ] A”Û¤)«€ V©1q#_#A”Û¤A– l S-Z Ü A”Û¤Wá|ö/ y A”Û¤lÐ`Ô. %MA”Û¤~-O -å)8A”ÛÔ24`-™7c®#3A”ÛÔI†`bÎ-'B A”ÛÔ^Ê@4 D–°f‘A”ÛÔxJ€×ÿA*öA”ÛÔŠ\` AÆ04 A”ÛÔœŒü@õ0) A”ÛÔ«ø`—? 6) 1EA”ÛÔ¿€Ð tìj A”ÛÔÔ+@ ±Ä4&+þ!A”ÛÔç7@|‡1 (6MA”ÛÔùs@ Ï…C t+A”ÛÕÀs#%/0] A”ÛÕ'@Så`7 A”ÛÕ1› ‡\}A”ÛÕADöy • A”ÛÕ`-`R¿%0+\ A”ÛÕu$ÀéI4EbA”ÛÕ†@ §¬B A”ÛÕ™^À S› RrA”ÛÕ®/ Ó’œ%Š%A”ÛÕÁ°€ú 4¨A”ÛÕÜ7À—‚"*$æ%3A”ÛÕò“@î ¦óœ*:A”ÛÖ\`÷ÀA”ÛÖ¯` XQ%=,A”ÛÖ0\À s*I.n A”ÛÖDÛàåí˜ OB]A”ÛÖ]6 b³f(T+A”ÛÖs¨ ; *4%A”ÛÖ„Ê@«”FaA”ÛÖžw  •&sŠÕA”ÛÖ­C  Ü è+2A”ÛÖÃnà%8 ð!X A”ÛÖÜȲQ!ÿ.T A”ÛÖíâÀÀ&"> aA”Ûד ´ „ƧA”Û×$ j!i * A”Û×0K  Å 6’×A”Û×E@@ ÷Åb-@A”Û×W @_!öW A”Û×fs` …#;TA”Û×{ 'žA”Û×’ß Þ ÐHÅ A”Û×£àlc"'WY|A”Û׸>g Ìœ š A”Û×Ñ›  ö ‡4¥¸ A”Û×èã@…º0 A”Û×ú§À¦ Ï ;#öA”ÛØ> · a ¥+Å A”ÛØ/ à{:ÚA”ÛØAÊ@ Mž–i˜A”ÛØV1 à›w A”ÛØj€ jÈå! A”ÛØw²À \ ¤»+´A”ÛØ€  *a¢<SA”ÛØ¯'€M N0 oA”ÛØÂ@Íu«$ëA”ÛØÓ˜À 0 #^.@A”ÛØìÀÚ ,#¿%èc‹A”ÛÙJÀ áø$A”ÛÙŸ °¾2ÃA”ÛÙ*¡@d/$« A”ÛÙ<Ù v Ž!"à A”ÛÙQm ¡ B`A”ÛÙk\` Rö+‰A”ÛÙ~µÀO$ÿ5GcA”ÛÙ”×`©¸%ûö-?A”ÛÙ­`À8x)¨=A”ÛÙ»k Z²-w  A”ÛÙÏŸÀ> ‡ë2†/AA”ÛÙç’ Õ¾6 A”ÛÙýàóÍ °#º(8A”ÛÚ”@ ut3ç}A”ÛÚ.? ZW$½ A”ÛÚCÓ€Ó _!ø1EA”ÛÚTÁ€sœ"£ A”ÛÚiÀeû>-?A”ÛÚ~i€ Ž!'–A”ÛÚ’p€w rnjA”ÛÚ¦7 “ãø q A”ÛÚ¶ºÀ £"A)È5JA”ÛÚÈ‚À\ d ¤% A”ÛÚÔu@É €(M>WA”ÛÚ룠} eîj A”ÛÚúH@p%­+4GA”ÛÛ ˜ Ô¡Q3ƒ#1A”ÛÛ"  ôÎ1u)¼ A”ÛÛ6€GÂw A”ÛÛGR@}i =WA”ÛÛUìÀ!F!XA”ÛÛd¨-84–&,C]A”ÛÛu­À5 Z0„.ú[~A”ÛÛ¼À’Ùm+´>WA”ÛÛžË` yØ!ñ=VA”ÛÛ³-à éü!&oA”ÛÛÂÕÀè )æõA”ÛÛØ] #U%0«!A”ÛÛíp`[©)ŸHGbA”ÛÜZ@R­+'v°A”ÛÜëà dÊ%¿4Y A”ÛÜ+Á Ó:0ê*§A”ÛÜAµ \¸&ƒ"š,„  ½Å«*6LA”ÛèV¯ Œ[0ä UvA”ÛèfÙ ‘„!ŠY~A”Ûèzu x ÒPpA”ÛèŽÓ` /,#3x A”Û誂`NWr*[A”ÛèÁ‘À! ¯ Æ ¦GdA”ÛèÔg %/)·4öA”ÛèêÁŒ#Ç-g0BA”ÛéÁà\×7_› A”Ûé± ½£P Z"/A”Ûé0º@Gû€+A”ÛéCä€ ‡"%úA”ÛéUè@‘ S2g$ð A”Ûéh˜`Á WÑ7=$A”Ûé€B ¶ê$.F A”Ûéó`k ˆ*e A”Ûé¢ Ó ˜Ï*xGdA”Ûé»×€³ =' Y A”ÛéÍ  C^c"A”ÛéßB€ ' p/¸NA”ÛéöÕà^øp!a)9A”Ûêp ’ H)Á`(A”ÛêTÀë ÷(U!BA”Ûê5n r$S*+!A”ÛêIv@rá.çäA”Ûêf™@NŒ¹- A”Ûêx¶<i* ÓJiA”ÛêŽÉ€@ t)| A”Ûê£â s R!Ê0i A”Ûê¼®àóx(¨!A”ÛêÐL  E2B^A”ÛêÞ€å'òðA”Ûêî  I g5~ªZŽA”ÛëEàò ×- A”Ûë<€r{69%A”Ûë,¾À¤§/zª A”ÛëCß`¹Ÿ …) A”Ûë^É€”Ý'f $2A”Ûëwïš 4¡TuA”Ûëˆt £ý ¾þ6MA”ÛëB@„«20ËA”Ûë¶Ð ÕÍç CA”ÛëÌoÀ –å(ùA”Ûëæ À: øÎ A”Ûëû¢à4²"úœ A”Ûì É`uÑà1Êe’A”Ûì'×`p%3%3A”Ûì5âs C®3 A”ÛìLú€múšC]A”Ûìg³àÝQÚ e%4A”Ûì€{ œk&¿0EA”Ûì› ¨ ð1Û,¯"/A”Ûì°Ž`ãs&Ë#¸A”ÛìÇn`u ã'iD`A”ÛìÙ@Y‹ }k\…A”Ûìëœy~cQA”Ûíßà lzÁA”Ûí– ô8c†*A”Ûí3ƒ`èocwA”ÛíF€Bé+½"ÜA”Ûí]iÀÈ c…"~A”Ûís3 lÀ1qP A”Ûí“/ÀRÓ H''PsA”Ûí­‘ ­ &+nHeA”ÛíÄ€˜O ÙA”ÛíÜLàÔ°*ùA”Ûíò  \ ó‡-€¸A”ÛîÀ½§º A”Ûî"òà ?«-× A”Ûî7è€ÎŠ0è<SA”ÛîH0àf«)~±A”ÛîUÜãZ"½,¼0DA”ÛîkÞ"å,F A”ÛîˆÀÈ]*;EUvA”ÛîJ`ô] 'ÀA”Ûî³Ä`  á-8$ì A”ÛîË@¼  ‚.FA”Ûîß¹ Yì{-!2FA”Ûîü 3'ƒ(IfA”Ûï ä ö*‡*O A”Ûï)L€nö&ÕA”ÛïC¯ § à*ÏA”Ûïb8 ·ou*BA”Ûïxü™ƒ# !A”ÛïŠQ Ùs3ýg/BA”Û洞 zI@ñ^…A”Ûï¾÷à „!³.G A”ÛïÓp€Ž& 9PA”Ûïì2À (  b -A”ÛðC ­ ¹A”ÛðÍ`¹"Î(¥A”Ûð-Ç@wî'È-ø%3A”Ûð@ààÍ%! A”ÛðWó5#%nA”Ûðn¾åš+’:A”ÛðŒ¼À(äJ Ú5IA”Û𣙀 ÇJ&p A”Ûð»4À8 ÿŽ(i A”ÛðÏ@ R#….è A”Ûðëu8!2‹!eA”Ûðþ°€ j£S A”ÛñÌÀöf ˆ®9PA”Ûñ'J~ § û A”Ûñ=W (l®A”ÛñRs@ Î !A”Ûñgà ûßšh>XA”Ûñ‡cÀLà A”Ûñ¢„€ z1uý ,A”Ûñ¿+ V˜%®+Ín›A”ÛñÚy µ.#’4A!-A”ÛñòàÚÈ€#A”Ûò:qî ‰+©^†A”Ûòø€ê·…& A”Ûò1 à í R öA”ÛòF« z!(Ó© A”ÛòcÀwŠ¡±3GA”Ûòyž`;Ù ¿ŒA”ÛòŽ}PA0ööA[A”Ûò¤„àA_üŠ×A”Ûò¿€ç  ³"A”Ûò×€ Éf áå@\A”Ûòëà $©\ƒA”Ûòþ‰€é´®,+A”Ûó@ÔÍ-“x½'A”Ûó)ãÀÛÖ$ý#ÿ->A”Ûó<1 ‚ %Ñ-¶?XA”ÛóN|` t°*ò Á A”ÛóeàQ9A”Ûóz¿  #Â8 ,A”Ûó•^À„¬’"¬A”Ûó¬a   ÌÉ'A”Ûó½"À› 80¤'A”ÛóØ9 ·_2uA”Ûóó˜à 芸ä@\A”Ûôè@ ®ê(|8A”Ûô!!@’5ŠlA”Ûô>ÕÀ Gi'õ'~A”ÛôR@\ %nø A”Ûôd|€Í]- ñA”Ûôt5 T¥fh A”Ûô‡‹@ ‡Ør3Ê3IA”Ûô Ãà ¨Ü)!sA”Ûô»à …±yå A”ÛôÐó ‰vz{ A”Ûôå­@ •µQØ^‡A”ÛôùÀ¯iÉ$&HdA”Ûõç@" †+¡A”Ûõ(WÀÉX,W3£A”Ûõ=ì‹D"5„A”Ûõ[†`?xº!]A”Ûõl¤ “ e6A”Ûõ€NÀ<*$â'|5IA”Ûõ˜°Q ò.Rw A”Ûõ±|à•0e0%!A”ÛõÆ{ šà1'=VA”ÛõÜ”€ Øœ+,/2EA”Ûõõž@Þ'Ý? A”Ûö<Às.—A”Ûöé€ ¡–"Ī+;A”Ûö7R`S’)²lA”ÛöMç {'Í0¼X~A”ÛödjÀ튗#D_A”Ûöyà j](1ù!/A”Ûö‰z€JE b&J A”Ûöšìàm ¹$”.“bŒA”Ûö®0àwÂ!ÂA”ÛöÅw` Ö 3$ò A”ÛöÔÚÀ ' ¹ A”Ûöì߀¸s $ åA”Û÷§@NÜ#5A”Û÷&g žÐ&„œQrA”Û÷:p7®Ã Ò A”Û÷P- Ò Ã/Éí$2A”Û÷`™€X‘%°ÀA”Û÷~¿‡ Ȥ A”Û÷™o¨ó \/@A”Û÷ªS@ 4A A”Û÷½‹î—0+v A”Û÷Ì=@ KB b#s A”Û÷ã8 Š 'ŠH A”Û÷ýDAg*}A”Ûø ˆ,J Ä!A”Ûø-ž1O×" NnA”ÛøN“H ±fÉ#A”Ûøe ¬)‰ dC_A”Ûø|û`°]#νEaA”Ûø”é)#v.k A”Ûø¤® m%"rÕ#/A”ÛøºŠS}¸ A”ÛøÌ^€ 2q!W A”Ûøä'à ´*hAA”Ûøöû€{b&^ åJjA”ÛùPÀ•‚ôð A”Ûù"€ `R&  y(7A”Ûù>À¼à7@%A”Ûù[†  fÚ451DA”Ûùpô@Ì„ŠÄ>VA”Ûùˆ  ËØië A”Ûù±J@ù»2úq#0A”ÛùÎòà+ü k A”Ûùé] ý[)ÂQ A”Ûùû¤Ú)8 ? A”ÛúàÀµ>& 4 A”Ûú$Éà& b1B^A”Ûú9 €ÍÇ5 *¿,>A”ÛúP’à‰øí XGdA”Ûúbé€ J3%Ñ6§&4A”Ûúv‹ n’%(7c A”Ûú‡ß 80A”Ûúš"·’"y/¼'7A”Ûú­¥ fæA”Ûú¿n b€*1õ A”ÛúØÎ@‡ˆ Ê*¢ A”Ûúñwà† 2|A”Ûû 8€œ ñ EA”Ûû!W@4Ï h† A”Ûû;¨@ãFö? A”ÛûT•Þ@q-ÿ A”ÛûhX@ ?Z VEA”Ûû„`ÇälD_A”Ûû¦@ i¼·%W A”Ûû­À P 2Â*ìA”ÛûÆÑ`…qž` A”ÛûÞ `VamP A”Ûû ("¢2¼ A”ÛüwÀ »©A \A”Ûü%Œ@ MÎ Ã* A”Ûü;Ø@r žÚ',A”ÛüMÁ€¨ Œ A”Ûü]S`a3 ã $A”Ûüse ÒZ A”ÛüˆFÀ\*É  A”Ûü›Œ TX ‰ £B\A”Ûü¯Í ’À¸+nA”ÛüÁ´Àͼ¾\ A”ÛüÞ6` ü%4.Õ A”ÛüóB¦…¯&Ù$3A”Ûýn) üPxA”ÛýU€`³0ä=†ÂA”Ûý/p@ÈLè A”ÛýMO@ òü ZA”Ûýe¹@ °}õEaA”Ûýwd@ í%Z’A”ÛýŽó gš$Æ.{ A”Ûý§{ ¹hÝ/UŒÙA”ÛýÃÕ  ù!"A”ÛýÙn€Í¼.)Y!A”Ûýó^P¼W XA”Ûþ:`=Í3m2A”ÛþVÀ¡.X3{o A”Ü‘K¦  žâ.¥2\ A”Ü‘Z§@qx5A(A”Ü‘h’`b€3H( -A”Ü‘r‡À¢A1 c A”Ü‘„P@»§!hÏ +A”Ü‘’› Qm!q0½ A”Ü‘¤Æ ¨ê#f­ A”Ü‘³¡À^-/ô A”Ü‘À ).{0n;SA”Ü‘Óê ´7¿ ÑA”Ü‘æ Ô> ¬)„A”Ü‘÷€¡ ½í ?A”Ü’¶`±™)Th”A”Ü’.À+ ä.­ôi™A”Ü’ ™ÀKe?YA”Ü’1­,(VR A”Ü’=`wx!W%®4HA”Ü’L8`t c× õRwA”Ü’Z ¡ì2+ ½A”Ü’jžÀ² ºØ A”Ü’y× ¯5­87PA”Ü’ˆßàW*Ú3ÈA”Ü’šû Ò: $ A”Ü’©› E •-Î,>A”Ü’¸;`&ê-x Á ,A”ܒƤ J zø!A”Ü’Üe æÚ[n".A”Ü’çþ:Ý÷4KA”Ü’û[€v ê-ÝA”Ü“ [ kÍ"„).8OA”Ü“¦ 7 É#A”Ü“(@!&,µ#i A”Ü“6¯þ „(û1 A”Ü“B¿ Eh ƒ2K%A”Ü“P²à·:v(E4IA”Ü“`š² ˆ"û&2A”Ü“mË` y`< A”Ü“zŸÀ ÿA”Ü“‡ìÀÛê A”Ü“˜Ð`­}+.@A”Ü”lð  Ø4Q  A”Ü”z€€sœ$2E`A”Ü”ˆÀ8³— ü A”Ü””ÆÀ. Ì)W A”Ü”¤ µ µ$üi/CA”Ü”± ÀW&% A”Ü”½„ w Ü!þ2ªA”ܔȲ Ö”ÒY A”Ü”ÙÁ Ñ0e % A”Ü”èû ÷7-M A”Ü”ú@ Ñ/¡Ï:QA”Ü• B Åþq5õ A”Ü•  Bª6ƒT A”Ü•2{Àñ´#$( A”Ü•Dò ; è+Ÿ1× A”Ü•T¿ ³Ëu0× A”Ü•b…@ @@Ê A”Ü•s†€ o27@ A”Ü•èÀ ƒ%A”Ü•‘Ò r\#Û2, BLjA”Ü—ÝåÕ A”Ü—% H2!Ð.} A”Ü—4æÀÜ0ÂA”Ü—B}€ ‚s” â A”Ü—Q¶À Ô):¤A”Ü—`á Ûém'‡ A”Ü—vý@Ü ÿ¡’PrA”Ü—†'@h;6§|:UA”Ü—•ç€7 M,# A”Ü—¡ï ‰8jA”Ü—¯øà C]"a5< A”Ü—¿æÀ¯v/ƪ A”Ü—ÕV€°ˆ"X¹'5A”Ü—ãZ ûâ$(DMlA”Ü—öÅà “ ­! A”ܘûÀ”Ö0:÷1BA”ܘèç$H cf”A”ܘ(g û, .rA”ܘ;£À çjxA”ܘKù …Ùà,)9A”ܘ^Ó@’¦)˜ A”ܘoÍÀ n À+ŽTyA”ܘW@2ñ%† A”ܘï`¶ dÄ,>A”ܘŸ ¥*Û A”ܘ±´å#R5JA”ܘÁâàºv2!i3FA”ܘÑ:¢ ~nW A”ܘå(` ¢52ôãA”ܘ÷ É€… A”Ü™<à 0·UvA”Ü™T@ %¯$!A”Ü™+8€28MA”Ü™=³€ ËÙ5SxA”Ü™P@±,*¥3'6A”Ü™b`ù@¢+€"/A”Ü™nè€ \(¡20CA”Ü™€YÀ^ F3ƒ A”Ü™”~Àúyy#cA”Ü™¢ à 5"Ø$Œ?XA”Ü™²c Ú G/X‹<TA”Ü™ÃÀaŒ$ 0« A”Ü™Ô=€å±/þ#Â'A”Ü™åtà ܃$HA”Ü™ø!à r øâ*ý}¹A”Üš‰à W>›"{A”Üš·`E ™¦1EA”Üš"†@œz x%Èe•A”Üš06 ž!c¤ A”Üš=6i­,$²A”ÜšS öá K!7A”ÜšiÆ`Ô þH-£ A”Üš{ì  ˜e)Ë A”ÜšŠgÀ éˆ3§ A”Üš˜r@Ÿ Ó"å,«B]A”Üš«Õlî%°g˜A”Üš¹5€ ,  Ü ÿ6LA”ÜšÅÑÁ¡Ÿ0)D_A”ÜšÔô@ú)n¦%A”Üšâ€AÔY"þB]A”Üšô} h —Ýe?XA”Ü›Ë`óÊ Ž…ÇA”Ü›™àÃö 1!"0A”Ü›,@ Ð Âç A”Ü›B4@•…%©-¾,À>Ω'ì1FA”Ü ò †>  A”Ü®àÖ\Á+–TwA”Ü5@ G¨ò*k A”ÜF‹€Ù T$Ñ#7NlA”ÜTÁ@ ¬/ .€ A”Üe ä( ª!÷A”Ür ë ©¢lA”Ü~g€ #€$T/iA”ܳ€](å ! A”ÜžB ‚t×.@A”ܱl~C ‹ G#A”ÜÇhÀ’9#º1FA”ÜÕÅ€e Ü ?2 A”Üê•` cNnA”Ü÷è  ±¤#Ú(8A”Üžv § ÚÌ8p¡A”Üž¨àô/4*· A”Üž(0 %1› A”Üž9`ëBÈ8A”ÜžLg ©Ï‹7ú"/A”Üž]ä€ r,«^A”Üžl«~)%±!·>TA”Üž|’ ² DmÙA”Üžw Ù˜¢QA”Üž¡ `@ +…9PA”Üž­èà M'#ÿA”ÜžÀ_€· '%º#wA”ÜžÍãàÊ 'g--=A”ÜžÝB`ÞtÃo=TA”Üžê`Ûž$#ˆA”Üžõpà; Ã*D`A”ÜŸ”  qù& A”ÜŸÈ€1 ‘ *rKkA”ÜŸ!Và gè&Ž› A”ÜŸ29ê}4IfA”ÜŸAž` ³"M,úA”ÜŸPª )6 A”ÜŸb†€M Q$á!²A”ÜŸqÀ¿ Ü O$x A”ÜŸ ¾*ú/ A”ÜŸ’` Z Z&A”ÜŸ£À  8 A”ÜŸ¶h … ¨)€ A”ÜŸÁz@ ™Î4HA”ÜŸÏ(` áÝé4- A”ÜŸÛ{@ ®c$+3rnŸA”ÜŸîÙ ¬;0*+:PA”ÜŸý~‹øL14A”Ü Ò  ‹0£+CA”Ü #×Â$" A”Ü 4Cà ¬ è»5L A”Ü F Ÿ Z'A”Ü RÜà ë¯#u,@A”Ü fœ æÆ!ŽŒ A”Ü y5@„ ™$>XA”Ü ˆÀ£ z1P A”Ü ™ê ®{† A”Ü «8ÔcŸ°-?A”Ü Á~ ;E/"h!-A”Ü Ð:ÀÔ $ ,¼ A”Ü á¾À»N Q1FA”Ü ï1 ²‘>É%A”ܡƮæ _#A”Ü¡N M ¸##¬¤ A”Ü¡*X Ô -/øFcA”Ü¡AØ@&$æ+v(A”Ü¡R¾ Í z +0BA”Ü¡a§ EÉ Þ A”Ü¡rF@ ûÆCÑZ€A”Ü¡c ¦$+°øA”Ü¡“¼@  æ2FA”Ü¡§‡àGû3&@A”Ü¡¶4 n [2¯$iA”ܡ˷ C ep-8 A”Ü¡ÙËÀ ¶M6X*:A”Ü¡îú  ç. ŒA”Ü¢6¬´.i A”Ü¢ÜàV!¤/A”Ü¢#Y i„!å1N A”Ü¢9P@f”+ÓcA”Ü¢I"Oü$ð|A”Ü¢\ `&1Ç*Ž3FA”Ü¢u5g%kt8MA”Ü¢† Àe²¾3HA”Ü¢‘¡  z!#Þ$WwA”Ü¢¢˜¶™(¤ A”Ü¢°W`È+ .Æ*A”Ü¢À·À›‚l5JA”Ü¢Ò–à¶'`¨/BA”Ü¢áÝÀ¹A6KA”Ü¢ô@à (µ*„!-A”Ü£g@ j.*ÚfA”Ü£2àÊÈ¥(¢A”Ü£'À ‡ 5.Æ$Î+WA”ܤD²€ñ Å îò'A”ܤRÌ`RL! ¹ A”ܤ_• Xo(›†]ˆA”ܤqT ÒÎ~#A”ܤ‚yÀ èm¡$M<VA”ܤ’KÀ ˜Ë,Í4IA”ܤ£P Öø1 ” ,A”ܤ°×€D‡ -# A”ܤÁì ” A”ܤÎÀ ˜×)N Y +A”ܤÝö€þo ÷¢HfA”ܤë¹`X !u$x<SA”ܤú„àk ç[*%4A”Ü¥J`x ¦áõMmA”Ü¥ÿàËßô5Á A”Ü¥)w  ^_&œ6KA”Ü¥<†`&Á‚¨1EA”Ü¥K5 ò¡^A”Ü¥_­à çÊ#6 A”Ü¥t$`î ¯#,Ç A”Ü¥ƒ×(,âØ, ]‚A”Ü¥ã à” ¸w0uA”Ü¥ôî½$!a(A”ܦE  à(9A”ܦM` j ÓUJ$A”ܦ+y  Ãu&`3$ A”ܦ?VÀ-H³A”ܦM ÀÄ&#< A”ܦ_F  *ËA”ܦsy  ß é A”ܦ‚•À>¹G,ÖA”ܦ[€ÀÓË""/A”ܦŸ$ Ú þÆA”ܦ´;` ¿N!² Š A”Ü¦Ä `ÙF1 šA”ܦÔàð JÄs-?A”ܦã@×¢ÏKlžA”ܦöã` ÀÙ20.A”ܧ‘@ î9–PsA”ܧ±2Âa@(6A”ܧ'Š~'e"·PqA”ܧ8= À t›"W A”ܧH_` Q-ÃJ A”ܧSJ`7w'A”ܧcõ` Ö®0¿ A”ܧuûà­d Ö>WA”ܧР¾ â*~*;A”ܧŸE ê•'q9OA”ܧµä@ f +¨)8A”ܧř@Œ!äA#A”ܧÝ`v“¶ý A”ܧñ[À›2/‹*1)8A”ܨú€pU D+7A”ܨ€@˜Èö ß#1A”ܨ*£à K§6}S,AA”ܨ=/ » ^  ¯ A”ܨPc ƒ7"»+2EA”ܨ`ccÅ»ÝA”ܨt‡à9µ­"³ A”܍Р` ® >`"8PA”ܨ™¥À¢6 ×A”ܨ³€ „€$¹=TA”ܨÃH€) ® —ÅA”ܨÕî ¬S.˜(Œx«A”ܨ䑀yÀv(w A”ܨõl@U Íá! ):A”Ü©2à žT$\fA”Ü©ÚÀ 2-&+¸.?A”Ü©+–àfXï"§#A”Ü©6Èà R3]+¯A”Ü©EÉ`ª ê^Æ;A”Ü©VHÀ”[ ›Ó A”Ü©p{ fT1y*µ%A”Ü©}ž¤Ê#BA”Ü©CòÔ ­$1A”Ü©Ÿ+  Šs )2A”Ü©³A  Þ0­(ž A”Ü©ÄÀ5 .ÔA”Ü©Õ/` Tª"¤ A”Ü©ã\£­&<fMkA”Ü©ñÔ`]ÄÔ7A”ܪA@ß³#A”ܪ} ú Ú¢%¯HfA”ܪ)G ° ΃ 0DA”ܪ:I u,5 A”ܪQæïñ#l R A”ܪaÖÀ°µ#3#A”ܪu6À"vðÀA”ܪ‰¾`ᯠÚú A”ܪ™¿àY+{4'A”ܪ­’@™bÍ3Š$2A”ܪŽÀî( ‰+OA”ܪÛ,@- ¹2éQA”ܪíe çm(Ö'ÖA”Ü«‰  Þ#z/n A”Ü«ˆ€ÕÍ$ÅA”Ü«$# í -Ç0ý)8A”Ü«6àWž6 È A”Ü«Dg‹È3,A”Ü«W vè y A”Ü«jƒ›-º$¡C_A”Ü«zí  Ç$³A”Ü«G€ þ !;A”Ü«£] w~4]A”Ü«¸›ÀN¬%n&+;A”Ü«ÍLÀà ‰ ESA”Ü«ÜA BQ- ¥%A”Ü«ì¹@?ŸO A”Ü«ü†à·û"PxªA”ܬD kÀü A”ܬ ä Óž25 A”ܬ9À@ QÃ'¥ D<TA”ܬR ¥ë™’A”ܬiC × 5`A”ܬz `eV;SA”ܬ’· }±õ 9w´A”ܬ©“` S ü½(á/CA”ܬà  Ö( ? A”ܬջ@ BŒ#ö&g!A”ܬê„`€ ç,"w A”ܬ÷SÀ– g|Ñ&5A”Ü­l@Sx“dA”Ü­"œ€øo< MA”Ü­5Ù€ ßI0:y¯A”Ü­FZ—¯Z0ŽLiA”Ü­U‰`µ]®$æA”Ü­e¢àõ Ü´)ZA”Ü­xû` è°ø A”Ü­’¸À Û:z A”Ü­§®` {"2LÆd’A”Ü­¼Ç€ò”0k+À+1 A”Ü­èƒ „ó1 A”Ü­ÿÖ K#Ó1› A”Ü®àèð¨+±Û_A”Ü®"Ý€pnnE A”Ü®7S`.S#¥A”Ü®G» f "d¸ A”Ü®b°“ "PA”Ü®uì`Æ3l#Ž A”Ü®‡`­ Ð.à A”Ü®£T §’±Á2EA”Ü®·"à Ðî#ß)ï A”Ü®Çpél='ÄA”Ü®à  ? U?2B A”Ü®ðŽ  =œ ÀA”ܯp Ì3'ƒ A”ܯ˜ ü Ò%]¥A”ܯ0ÄÀ–Ñ. bA”ܯEѬN#£ Ù^ƒA”ܯ^‹€¯!p ªA”ܯq—àÎ Õ ‚ A”ܯ‰ Ü%1Ç÷n¦A”ܯ¡°`cs’–A”ܯµÿ —x"cA”ܯÊ9€ t 5%)9A”ܯÛtÀ‡/»4|.@A”ܯï Ò1f/BA”ܰq ùå"# è A”ܰ½`ä}›Z‚A”ܰ5=€ <„¯1&A”ܰHA ¯Z#Ã,=A”ܰ\Œ ` & ? 2o A”ܰw=@š·M$øLnA”ܰ‰A@˜ ˜, A”ܰJ¼HüA”ܰºi Cʳ%Â0CA”ܰԠ  ö ù)VîA”ܰì߀ † ¯:RA”ܱ) þIH"°!-A”ܱº  ‚©$A”ܱ*¾ ô ›y‡"A”ܱ;+€ÝÍ!`&4A”߬x¥`Y —-® A”߬ˆë ø±å#Ô?YA”߬œ¸ W ˜1¸+A”߬¬›Àö f&Ï'ÑA”߬À¦ — v#—Ó?XA”߬ÕqÀ©B6Ed1HA”߬éƒuØ#‡(RtA”߬úÔÀ¯ ¤1M"<+;A”ß­Z€K #"p A”ß­&)@¥ Åt'ï#0A”ß­6ÿ`K HY¦ÙA”ß­CL  Þ Ú(`A”ß­U`J 6*ÔA”ß­g‘Àã‡æ7T(7A”ß­x_@ ²â)v|¸A”ß­’ ] ´‘ A”ß­¡±@ë!/Vø5IA”ß­´˜@f#£! A”ß­È=À ÀI'6A”ß­ßéÀxG JA”ß­ú%àW¹#QUu§A”ß® –à&r"ë%(0BA”ß®€" ³"7í)A”ß®1„ „Ñ/æ%ÐA”ß®Ds@Ô ÀY/Ç*:A”ß®U‘` Ê–#R-ÒA”ß®eñ@ŠK0ˆêIeA”ß®{ºÀZ›A”ß®Œ# G TxA”ß®¡(  ½o0"z&5A”ß®²ˆ`Ç• \ A”ß®ÏØ ÏÅ*A”ß®æï  Þ Z#×A”߯^€ŒI&ÿI A”߯§àUZ,½Á A”߯%Rà´Ò&R#eNmA”߯5*€’ áZ!.A”߯H±À j5O A”߯^wàja¯+3GA”߯tRà JÍÀŠA”߯‰`bm s#A”߯š<¿$B/i A”߯­`£.)E5E`A”߯Á8à¨Ô²Ž:RA”߯Ö8€J2ý$l8NA”߯ñéàó ýu ,=A”ß° ï&çg.À`‹A”ß°ð@ .…A”ß°0› óIt\›âA”ß°G® ºü/+R A”ß°\ò ÇÒ$Ã5?VA”ß°nâ @nÒ5û/AA”ß°‡8  é¬&oc”A”ß°˜Ó  ï$åÛ-?A”ß°ª÷  Ë/) ‡ A”ß°¼a —(/¡4HA”߰϶  eðà A”ß°â:  º|'æ#°"0A”ß°ôàÀ~ }$P't A”ß± kÀe ¥ ò3A”ß±”€’ew u A”ß±2F rhE3™2EA”ß±LÓ@¾&#ìŠ#A”ß±l`æD,3 Û A”ß±€&@p=P¢#1A”ß±˜d@ Œó¹Ç A”ß±±• Õø+*âA”ß±Å&@" 5 A”ß±Ôì ov Õ A”ß±îÀŸ $ 3GA”ß²z « N+ÛÁ A”ß²ò ÌË9É6LA”ß²39`Bä*—uA”ß²HtÀ Å#U A”ß²` À× â ÖC]A”ß²y @ éq%\A”ß²—s࣠Ï)%UA”ß²°¢ÀA L(ûÞA”ß²ÂÀ// Q`:QA”ß²Öý`Qn$Ò$ A”ß²ë¯À› ͽ A”ß³Ô$|&ž æA”ß³ŒÀN#°'šA”ß³(#à2 ‡"Ú.– A”ß³=ï Né$ÊPA”ß³R˜À•>5Õ*;A”ß³mÙÀÀ ÞÔ_D]A”ß³‚'àZ%Y ˜>VA”ß³”è - wÝ"©v°A”ß³­1@ ) q%S${³A”ß³Àú cÿ)x h A”ß³Ú¯€, }°A”ß³îE€+ã&*;[„A”ß´8 A iݼA”ß´{À šy#.–A”ß´.ÂàÖ{´Í A”ß´E´ ¯œUA”ß´\9À jb3Û\ A”ß´qL-4æA”ß´†m \´-=.(A”ß´ï@ k*WNmA”ß´²c'yN-b(8A”ß´Çô` sàD ôA”ß´àŸÀ’…Pj A”ß´÷Q´ƒ.¾A”ßµæ` ³Qh- A”ßµ)†€óu #)A”ßµA«€ì…*C A”ßµRIà™¨*u A”ßµk÷À ¶ í·A”ßµ}½€·8!28® A”ßµŽ, ŸÃØ/¾QuA”ßµœ¸ pzÆ$æ A”ßµ´ˆ`’ ^"Ä`A”ßµÌÚÀFa ì( !A”ßµÜh  C+#T A”ßµí· ÿ.‹fA”ß¶l u ª O&5A”ß¶†`Ôÿ W A”ß¶;Ø@Äeë=WA”ß¶S!À ÑÂ/× A”ß¶eº@ í!ò ÿu¦A”ß¶€‰` ¬+Y-A”ß¶áÀ¬&&‘ A”ß¶´¥@Y5eÕA”ß¶ÌAÀ¨ D©A”ß¶ãX º "#2A”ß¶öV ©¦)¯$A”ß·b€ æ!A!X0BA”ß·Ú@þ 7' =A”ß·0h€5 o —–{¶A”ß·Bõ`T¨êÎ/AA”ß·Q0@ f¾ U.@A”ß·d° ¡ða*EaA”ß·wÆ`ˆ°W èA”ß·‹á@4]õ#]#1A”ß·œO` m ÆÌ í@ZA”ß·²` gx ¾ A”ß·ÆW^Î&É4ˆ +A”ß·Øò 5T$ u;RA”ß·ñb >è.Þ-ÉA”߸ » áj Èÿ#1A”߸e "£÷,² A”߸. ¼< »œ A”߸?ô}Ô.urA”߸Yw€Dú =".A”߸rˆ  ÇÙ-Ô0MA”߸„E 3 <" A”߸’$à ³#âTwA”߸¦JëQ!p#BbA”߸¸Ù€Y »À A”߸È iÌ0CA”߸Ý#อÝ0A”߸ï2på2ï*0 A”ß¹ F`AH žA”ß¹ àÒÌkš A”ß¹;»`ù **€ A”ß¹RV * о+ #include #define NXPA 1 /* * This function just cleans up any messages returned from fv * after each XPA call and flags any errors. */ void PostProcessCall( int got, char **names, char **messages ); main() { int i, got, len, stat=0; char *buf,*fitsDir,cmd[255]; char *names[NXPA]; char *messages[NXPA]; /* * Set a variable here which points to the fits files to be opened. * This is just to make it easier to specify files later. */ fitsDir = "ftp://heasarc.gsfc.nasa.gov/software/ftools/release/other/pdw"; /* * Open 2 sample files */ sprintf(cmd, "open %s/ngc1316r.fit %s/rate.fit", fitsDir, fitsDir); got = XPASet(NULL, "fv", cmd, "", NULL, 0, names, messages, NXPA); stat = PostProcessCall(got, names, messages); /* * Select one of the files and open a header window of extension #1 */ if( !stat ) { sprintf(cmd, "select rate.fit"); got = XPASet(NULL, "fv", cmd, "", NULL, 0, names, messages, NXPA); stat = PostProcessCall(got, names, messages); } if( !stat ) { sprintf(cmd, "display header 1"); got = XPASet(NULL, "fv", cmd, "", NULL, 0, names, messages, NXPA); stat = PostProcessCall(got, names, messages); } /* * Plot a curve of Time vs Rate in POW and alter the graph's appearance */ if( !stat ) { sprintf(cmd, "display curve 1 time rate"); got = XPASet(NULL, "fv", cmd, "", NULL, 0, names, messages, NXPA); stat = PostProcessCall(got, names, messages); } if( !stat ) { sprintf(cmd, "pow bounds 770 -30 1070 300"); got = XPASet(NULL, "fv", cmd, "", NULL, 0, names, messages, NXPA); stat = PostProcessCall(got, names, messages); } if( !stat ) { sprintf(cmd, "pow curve pDisp No lDisp Yes lColor Blue"); got = XPASet(NULL, "fv", cmd, "", NULL, 0, names, messages, NXPA); stat = PostProcessCall(got, names, messages); } /* * Select the other file and plot an image, setting its colormap * to histogram */ if( !stat ) { sprintf(cmd, "select ngc1316r.fit"); got = XPASet(NULL, "fv", cmd, "", NULL, 0, names, messages, NXPA); stat = PostProcessCall(got, names, messages); } if( !stat ) { sprintf(cmd, "display image 0"); got = XPASet(NULL, "fv", cmd, "", NULL, 0, names, messages, NXPA); stat = PostProcessCall(got, names, messages); } if( !stat ) { sprintf(cmd, "pow colormap scale histo"); got = XPASet(NULL, "fv", cmd, "", NULL, 0, names, messages, NXPA); stat = PostProcessCall(got, names, messages); } } int PostProcessCall( int got, char **names, char **messages ) { int i, status=0; for(i=0; i 1000 #pragma once #endif // _MSC_VER > 1000 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include // TODO: reference additional headers your program requires here //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) fv5.4/ftools/guis/fv/win/fv.cpp0000644000220700001010000000761007211035517016015 0ustar birbylheadev// fv.cpp : Defines the entry point for the application. // #include "stdafx.h" #include #include "tkInt.h" #include #include #include int Tk_AppInit(Tcl_Interp *interp); void setargv_fv (int *argcPtr, char *** argvPtr); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { char **argv; int argc; char buffer[MAX_PATH+1]; Tcl_Interp *interp; char *p; setlocale(LC_ALL, "C"); setargv_fv(&argc, &argv); interp = Tcl_CreateInterp(); GetModuleFileName(NULL, buffer, sizeof(buffer)); argv[0] = buffer; for (p = buffer; *p != '\0'; p++) { if (*p == '\\') { *p = '/'; } } #ifdef TK_LOCAL_MAIN_HOOK TK_LOCAL_MAIN_HOOK(&argc, &argv); #endif // don't pass arguments to Tk, only fv needs them. Tk_Main(0, argv,Tk_AppInit); return 0; } int Tk_AppInit(Tcl_Interp *interp) { char **argv; int argc; char cmd[512]; int i; char *p; int hasquote; if(Tcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } if (Tk_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_StaticPackage(interp, "Tk", Tk_Init, Tk_SafeInit); // if {Tcl_SetVar(interp, "tcl_rcFilename", "C:/fvtest/lib/fv/fvinit.tcl", // TCL_GLOBAL_ONLY); // Get the fv.tcl path Tcl_Eval(interp, "info nameofexecutable"); strcpy(cmd,interp->result); i = strlen(cmd); p = cmd + (i-3); strcpy(p,"tcl"); for (p = cmd; *p != '\0'; p++) { if (*p == '\\') { *p = '/'; } } if (Tcl_EvalFile(interp, cmd) == TCL_ERROR) { return TCL_ERROR; } // pass arguments with quotes to fvInit setlocale(LC_ALL, "C"); setargv_fv(&argc, &argv); sprintf(cmd," fvInit "); for (i = 1; i < argc; i++) { p = argv[i]; if (*p == '\"') { hasquote = 1; } else { hasquote = 0; } for (p = argv[i]; *p != '\0'; p++) { if (*p == '\\') { *p = '/'; } } strcat(cmd, " "); if (hasquote == 0) strcat (cmd,"\""); strcat (cmd, argv[i]); if (hasquote == 0) strcat (cmd,"\""); } if (Tcl_Eval(interp, cmd) == TCL_ERROR) { return TCL_ERROR; } return TCL_OK; } void setargv_fv (int *argcPtr, char *** argvPtr) { char *cmdLine, *p, *arg, *argSpace; char **argv; int argc, size, inquote, copy, slashes; cmdLine = GetCommandLine(); /* INTL: BUG */ /* * Precompute an overly pessimistic guess at the number of arguments * in the command line by counting non-space spans. */ size = 2; for (p = cmdLine; *p != '\0'; p++) { if ((*p == ' ') || (*p == '\t')) { /* INTL: ISO space. */ size++; while ((*p == ' ') || (*p == '\t')) { /* INTL: ISO space. */ p++; } if (*p == '\0') { break; } } } argSpace = (char *) Tcl_Alloc( (unsigned) (size * sizeof(char *) + strlen(cmdLine) + 1)); argv = (char **) argSpace; argSpace += size * sizeof(char *); size--; p = cmdLine; for (argc = 0; argc < size; argc++) { argv[argc] = arg = argSpace; while ((*p == ' ') || (*p == '\t')) { /* INTL: ISO space. */ p++; } if (*p == '\0') { break; } inquote = 0; slashes = 0; while (1) { copy = 1; while (*p == '\\') { slashes++; p++; } if (*p == '"') { if ((slashes & 1) == 0) { copy = 0; if ((inquote) && (p[1] == '"')) { p++; copy = 1; } else { inquote = !inquote; } } slashes >>= 1; } while (slashes) { *arg = '\\'; arg++; slashes--; } if ((*p == '\0') || (!inquote && ((*p == ' ') || (*p == '\t')))) { /* INTL: ISO space. */ break; } if (copy != 0) { *arg = *p; arg++; } p++; } *arg = '\0'; argSpace = arg + 1; } argv[argc] = NULL; *argcPtr = argc; *argvPtr = argv; } fv5.4/ftools/guis/fv/win/fv.dsp0000644000220700001010000001066407207033563016030 0ustar birbylheadev# Microsoft Developer Studio Project File - Name="fv" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=fv - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "fv.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "fv.mak" CFG="fv - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "fv - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "fv - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "fv - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c # ADD CPP /nologo /W3 /GX /O2 /I "C:\fv\lheasoft\src\tcltk2\tcl8.3.2\generic" /I "C:\fv\lheasoft\src\tcltk2\tcl8.3.2\win" /I "C:\fv\lheasoft\src\tcltk2\tk8.3.2\generic" /I "C:\fv\lheasoft\src\tcltk2\tk8.3.2\win" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib tcl83.lib tk83.lib /nologo /subsystem:windows /machine:I386 /libpath:"C:\Program Files\Tcl\lib" !ELSEIF "$(CFG)" == "fv - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "C:\fv\lheasoft\src\tcltk2\tcl8.3.2\generic" /I "C:\fv\lheasoft\src\tcltk2\tcl8.3.2\win" /I "C:\fv\lheasoft\src\tcltk2\tk8.3.2\generic" /I "C:\fv\lheasoft\src\tcltk2\tk8.3.2\win" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib tcl83.lib tk83.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"C:\Program Files\Tcl\lib" !ENDIF # Begin Target # Name "fv - Win32 Release" # Name "fv - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\fv.cpp # End Source File # Begin Source File SOURCE=.\StdAfx.cpp # ADD CPP /Yc"stdafx.h" # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\StdAfx.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # Begin Source File SOURCE=.\ReadMe.txt # End Source File # End Target # End Project fv5.4/ftools/guis/fv/win/fv.dsw0000644000220700001010000000076207207033563016035 0ustar birbylheadevMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "fv"=.\fv.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### fv5.4/ftools/guis/fv/win/fv.ncb0000644000220700001010000000004607207033542015772 0ustar birbylheadevMicrosoft C/C++ program database 2.00 fv5.4/ftools/guis/fv/win/fv.opt0000644000220700001010000000000607207033564016032 0ustar birbylheadevÐÏࡱfv5.4/ftools/guis/fv/win/fv.plg0000644000220700001010000000327607207033564016026 0ustar birbylheadev

      Build Log

      --------------------Configuration: fv - Win32 Release--------------------

      Command Lines

      Creating temporary file "C:\WINNT\RSP130.tmp" with contents [ /nologo /ML /W3 /GX /O2 /I "C:\fv\lheasoft\src\tcltk2\tcl8.3.2\generic" /I "C:\fv\lheasoft\src\tcltk2\tcl8.3.2\win" /I "C:\fv\lheasoft\src\tcltk2\tk8.3.2\generic" /I "C:\fv\lheasoft\src\tcltk2\tk8.3.2\win" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"Release/fv.pch" /Yu"stdafx.h" /Fo"Release/" /Fd"Release/" /FD /c "C:\fv\lheasoft\src\tcltk2\fv\win\fv.cpp" ] Creating command line "cl.exe @C:\WINNT\RSP130.tmp" Creating temporary file "C:\WINNT\RSP131.tmp" with contents [ /nologo /ML /W3 /GX /O2 /I "C:\fv\lheasoft\src\tcltk2\tcl8.3.2\generic" /I "C:\fv\lheasoft\src\tcltk2\tcl8.3.2\win" /I "C:\fv\lheasoft\src\tcltk2\tk8.3.2\generic" /I "C:\fv\lheasoft\src\tcltk2\tk8.3.2\win" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"Release/fv.pch" /Yc"stdafx.h" /Fo"Release/" /Fd"Release/" /FD /c "C:\fv\lheasoft\src\tcltk2\fv\win\StdAfx.cpp" ] Creating command line "cl.exe @C:\WINNT\RSP131.tmp" Creating temporary file "C:\WINNT\RSP132.tmp" with contents [ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib tcl83.lib tk83.lib /nologo /subsystem:windows /incremental:no /pdb:"Release/fv.pdb" /machine:I386 /out:"Release/fv.exe" /libpath:"C:\Program Files\Tcl\lib" .\Release\fv.obj .\Release\StdAfx.obj ] Creating command line "link.exe @C:\WINNT\RSP132.tmp"

      Output Window

      Compiling... StdAfx.cpp Compiling... fv.cpp Linking...

      Results

      fv.exe - 0 error(s), 0 warning(s)
      fv5.4/ftools/guis/fv/win/fv.tcl0000644000220700001010000000073507207034110016007 0ustar birbylheadevglobal env global auto_path set fullname [info nameofexecutable] set home [file dirname $fullname] set env(FV_HOME) [file dirname $home] set libdir [file join $env(FV_HOME) lib] set env(FITSVIEWER_LIBRARY) [file join $libdir fv] set env(FV_HELPDIR) [file join $env(FITSVIEWER_LIBRARY) doc] # Add auto_load path lappend auto_path [file join "$env(FITSVIEWER_LIBRARY)" class] # Add pathes for help files. set env(FV_HELPDIR) [file join "$env(FITSVIEWER_LIBRARY)" doc] fv5.4/ftools/guis/powclient/0002755000220700001010000000000012565673764015514 5ustar birbylheadevfv5.4/ftools/guis/powclient/Makefile0000644000220700001010000000100710547315755017137 0ustar birbylheadevHD_COMPONENT_NAME = ftools HD_COMPONENT_VERS = HD_LIBRARY_ROOT = powclient HD_LIBRARY_SRC_c = PowClient.c PowCreateData.c PowDataCommands.c \ PowDataUtils.c HD_CFLAGS = ${HD_STD_CFLAGS} ${XINCLUDES} HD_INSTALL_LIBRARIES = ${HD_LIBRARY_ROOT} HD_INSTALL_HEADERS = powdata.h HD_INSTALL_EXTRA = install-pow-extras include ${HD_STD_MAKEFILE} POWCLIENT_EXTRAS = POWplotClient.tcl install-pow-extras: @for extra in ${POWCLIENT_EXTRAS}; do \ ${HD_INSTALL} $$extra ${HD_LIB}/pow/$$extra ${HD_CP_P}; \ done fv5.4/ftools/guis/powclient/POWplotClient.tcl0000644000220700001010000006113311130706166020701 0ustar birbylheadevproc _getDataForAxis { filehandle axis_ axisExpression_ whichRows_ } { if { $axisExpression_ == "RowNumber" } { set axisExpression_ "#ROW" set dataType 41 set nelem [range count $whichRows_ $_numRows] set dim 1 } else { if { [catch {set axis_info [$filehandle info expr $axisExpression_]} err] } { error "Cannot plot expression for $axis_.\n\n$err" } set dataType [lindex $axis_info 0] set nelem [lindex $axis_info 1] set dim [lindex $axis_info 2] if { $dataType!=41 && $dataType!=82 } { error "Cannot plot expression type for $axis_.\ Expression must evaluate to INT or REAL" } if { $nelem == -1 } { # Scalar constants could be applied to either nRows or nElems # so just return a solitary value and expand later as needed set whichRows_ 1 } elseif { $nelem < -1 } { # Treat vector constants as a regular vector column set nelem [expr -$nelem] } } set dataInfoForPOW [$filehandle load expr -rows $whichRows_ $axisExpression_ NULL] set dataPtr [lindex $dataInfoForPOW 0] set dataType [lindex $dataInfoForPOW 1] set numElements [lindex $dataInfoForPOW 2] return [list $dataPtr $dataType $numElements $nelem $dim] } proc powDebugDataPrint { title string } { puts "$title" set k 0 for {set i 0} {$i < [string length $string]} {incr i 80} { set currentStr [string range $string $i [expr $i + 79]] puts "<$currentStr>" incr k } puts "count: $k" } proc assembleWcsLabel { filehandle img flag {selection "DEFAULT"} } { global powWCSLabel set target $selection if { $selection == " " || $selection == "DEFAULT" } { set target "DEFAULT" set selection "" } set powWCSLabel(xunit,$img,$target) "" set powWCSLabel(yunit,$img,$target) "" set x_label "" set y_label "" set x_unit "pixels" set y_unit "pixels" if { $flag == "image" } { set powWCSLabel(xlabel,$img,$target) "" set powWCSLabel(ylabel,$img,$target) "" if { ![catch {set tmp [getKeyword $filehandle CTYPE1$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_label [string trim $v {' }] set powWCSLabel(xlabel,$img,$target) $x_label } if { ![catch {set tmp [getKeyword $filehandle TTYPE1$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_label [string trim $v {' }] set powWCSLabel(xlabel,$img,$target) $x_label } if { ![catch {set tmp [getKeyword $filehandle CTYPE2$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_label [string trim $v {' }] set powWCSLabel(ylabel,$img,$target) $y_label } if { ![catch {set tmp [getKeyword $filehandle TTYPE2$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_label [string trim $v {' }] set powWCSLabel(ylabel,$img,$target) $y_label } if { ![catch {set tmp [getKeyword $filehandle CUNIT1$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_unit [string trim $v {' }] set powWCSLabel(xunit,$img,$target) $x_unit } if { ![catch {set tmp [getKeyword $filehandle TUNIT1$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_unit [string trim $v {' }] set powWCSLabel(xunit,$img,$target) $x_unit } if { ![catch {set tmp [getKeyword $filehandle CUNIT2$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_unit [string trim $v {' }] set powWCSLabel(yunit,$img,$target) $y_unit } if { ![catch {set tmp [getKeyword $filehandle TUNIT2$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_unit [string trim $v {' }] set powWCSLabel(yunit,$img,$target) $y_unit } } else { set i 0 set findUnit 0 while (1) { incr i if { ![catch {set tmp [getKeyword $filehandle CTYPE${i}$selection]}] } { set v [lindex [lindex $tmp 0] 1] set label [string trim $v {' }] if { $label == $powWCSLabel(xlabel,$img,$target) } { set powWCSLabel(xunit,$img,$target) "counts" if { ![catch { set tmp [getKeyword $filehandle CUNIT${i}$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_unit [string trim $v {' }] set powWCSLabel(xunit,$img,$target) $x_unit } incr findUnit } elseif { $label == $powWCSLabel(ylabel,$img,$target) } { set powWCSLabel(yunit,$img,$target) "counts" if { ![catch { set tmp [getKeyword $filehandle CUNIT${i}$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_unit [string trim $v {' }] set powWCSLabel(yunit,$img,$target) $y_unit } incr findUnit } if { $findUnit >= 2 } break } elseif { ![catch {set tmp [getKeyword $filehandle TTYPE${i}$selection]}] } { set v [lindex [lindex $tmp 0] 1] set label [string trim $v {' }] if { $label == $powWCSLabel(xlabel,$img,$target) } { set powWCSLabel(xunit,$img,$target) "counts" if { ![catch { set tmp [getKeyword $filehandle TUNIT${i}$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_unit [string trim $v {' }] set powWCSLabel(xunit,$img,$target) $x_unit } incr findUnit } elseif { $label == $powWCSLabel(ylabel,$img,$target) } { set powWCSLabel(yunit,$img,$target) "counts" if { ![catch { set tmp [getKeyword $filehandle TUNIT${i}$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_unit [string trim $v {' }] set powWCSLabel(yunit,$img,$target) $y_unit } incr findUnit } if { $findUnit >= 2 } break } else { break } } if { $findUnit < 2 } { puts "not enough information to plot" exit } } set z_label "counts" if { ![catch {set tmp [getKeyword $filehandle BUNIT$selection]}] } { set v [lindex [lindex $tmp 0] 1] set z_label [string trim $v {' }] } set powWCSLabel(zlabel,$img,$target) $z_label } proc getWcs {{dest {}} {RAColNum_ {}} {DecColNum_ {}} } { global filehandle if { $RAColNum_ == "" || $DecColNum_ == "" } { if { [catch {set wcs [$filehandle get wcs -m $dest]}] } { return "" } else { return $wcs } } else { set wcs [$filehandle get wcs -m $dest $RAColNum_ $DecColNum_] return $wcs } } proc rotationSend { str img } { global powHeaderWcsKeyWord powWCSInfo powWCSToken powWCS set rotationRate 80 set i 0 while { 1 } { set currentStr [string range $str $i [expr $i + [expr $rotationRate - 1]]] incr i $rotationRate if { [string trim $currentStr] == "" } { if { $i > [string length $str] } break continue } ::powCmds::wcsHeader $img $rotationRate $currentStr continue } } proc getHeaderKeyWord { str img } { global powHeaderWcsKeyWord powWCSInfo powWCSToken powWCS if [info exists powHeaderWcsKeyWord($img,DEFAULT)] { foreach letter [list a b c d e f g h i j k l m n o p q r s t u v w x y z] { if [info exists powHeaderWcsKeyWord($img,$letter)] { unset powHeaderWcsKeyWord($img,$letter) } } if [info exists powHeaderWcsKeyWord($img,NONE)] { unset powHeaderWcsKeyWord($img,NONE) } if [info exists powHeaderWcsKeyWord($img,END)] { unset powHeaderWcsKeyWord($img,END) } if [info exists powHeaderWcsKeyWord($img,DEFAULT)] { unset powHeaderWcsKeyWord($img,DEFAULT) } unset powHeaderWcsKeyWord } set i 0 set numCard 0 set numCoord 0 set numCardInCoord 0 set powWCSToken($img) { DEFAULT } while { 1 } { set currentStr [string range $str $i [expr $i + 79]] incr i 80 if { [string trim $currentStr] == "" } { if { $i > [string length $str] } break continue } set currentStrToken [split $currentStr "="] set header [string trim [lindex $currentStrToken 0]] incr numCard if { [llength $currentStrToken] == 2 } { switch -regexp -- $header { {CTYPE[0-9][A-Z]?} - {CUNIT[0-9][A-Z]?} - {CRVAL[0-9][A-Z]?} - {CRPIX[0-9][A-Z]?} - {CD[0-9][_][0-9][A-Z]?} - {CDELT[0-9][A-Z]?} - {CROTA[0-9][A-Z]?} - {TTYPE[0-9][A-Z]?} - {TUNIT[0-9][A-Z]?} - {TCTYP[0-9][A-Z]?} - {TCUNI[0-9][A-Z]?} - {TCRVL[0-9][A-Z]?} - {TCRPX[0-9][A-Z]?} - {TCDLT[0-9][A-Z]?} - {TCD[0-9][A-Z]?} - {TCROT[0-9][A-Z]?} - {OFFSET[0-9][A-Z]?} { incr numCardInCoord set lastChar [string toupper [string range $header end end]] regsub {[A-Z]} $lastChar {} testChar if { $testChar == "" } { set headerLength [string length [lindex $currentStrToken 0]] set newHeader [string range $header 0 [expr [string length $header] - 2]] set newStr [format "%-${headerLength}s=%s" $newHeader \ [lindex $currentStrToken 1]] if { ![info exists powHeaderWcsKeyWord] || \ ![info exists powHeaderWcsKeyWord($img,$lastChar)] } { incr numCoord set powHeaderWcsKeyWord($img,$lastChar) $newStr set powWCSInfo($img,$lastChar) [getWcs $lastChar] lappend powWCSToken($img) $lastChar } else { set powHeaderWcsKeyWord($img,$lastChar) \ [format "%s%s" $powHeaderWcsKeyWord($img,$lastChar) $newStr] } } else { if { ![info exists powHeaderWcsKeyWord] || \ ![info exists powHeaderWcsKeyWord($img,DEFAULT)] } { incr numCoord set powHeaderWcsKeyWord($img,DEFAULT) $currentStr } else { set powHeaderWcsKeyWord($img,DEFAULT) \ [format "%s%s" $powHeaderWcsKeyWord($img,DEFAULT) $currentStr] } } } default { if { ![info exists powHeaderWcsKeyWord] || \ ![info exists powHeaderWcsKeyWord($img,NONE)] } { set powHeaderWcsKeyWord($img,NONE) $currentStr } else { set powHeaderWcsKeyWord($img,NONE) \ [format "%s%s" $powHeaderWcsKeyWord($img,NONE) $currentStr] } } } } else { switch -glob -- $header { "END*" { set powHeaderWcsKeyWord($img,END) $currentStr } default { if { ![info exists powHeaderWcsKeyWord] || \ ![info exists powHeaderWcsKeyWord($img,NONE)] } { set powHeaderWcsKeyWord($img,NONE) $currentStr } else { set powHeaderWcsKeyWord($img,NONE) \ [format "%s%s" $powHeaderWcsKeyWord($img,NONE) $currentStr] } } } } if { $i > [string length $str] } break } if { $numCoord > 0 } { set numCardPerCoord [expr $numCardInCoord / $numCoord] return [list $numCard $numCard] } else { return [list 0 $numCard] } } proc assembleWcsHeader { img {selection "DEFAULT"} } { global powHeaderWcsKeyWord # regular header if { $selection == "NOWCS" } { return [format "%s%s" $powHeaderWcsKeyWord($img,NONE) \ $powHeaderWcsKeyWord($img,END)] } else { return [format "%s%s%s" $powHeaderWcsKeyWord($img,NONE) \ $powHeaderWcsKeyWord($img,$selection) \ $powHeaderWcsKeyWord($img,END)] } } proc getKeyword {filehandle keyword} { # get $keyword $filehandle get keyword ^$keyword\$ } set helpMsg "Usage: POWplotServer ?-display client? ?fitsimage? client: XPA entry point of form IP_Address:portNumber, pointing to a remote POW session to which plot commands should be sent" global env set ppFitsDataType(8) 0 set ppFitsDataType(16) 1 set ppFitsDataType(32) 2 set ppFitsDataType(-32) 3 set ppFitsDataType(-64) 4 # # Load libraries # puts "POW_DISPLAY $env(POW_DISPLAY)" set POWLIB "$env(POW_LIBRARY)/.." set env(POW_HELPDIR) $env(POW_LIBRARY) package require Itcl load [glob $POWLIB/libfitstcl.{s\[ol\]*,dylib}] load [glob $POWLIB/libpowclient.{s\[ol\]*,dylib}] # load [glob $POWLIB/libtclxpa.{s\[ol\]*,dylib}] #if install colormap set instPos [lsearch $argv "-cmap"] set colorCode 0 if { $instPos != -1} { if { [catch {set colorCode [lindex $argv [expr $instPos+1]]}] == 1} { puts $helpMsg exit } if { ($colorCode != 0) && ($colorCode != 1) && ($colorCode != 2) \ && ($colorCode != 3) } { puts $helpMsg exit } set argv [lreplace $argv $instPos [expr $instPos+1]] incr argc -2 } # Look for client/server flag set instPos [lsearch $argv "-display"] if { $instPos != -1 } { set client [lindex $argv [expr $instPos+1]] set argv [lreplace $argv $instPos [expr $instPos+1]] incr argc -2 ::powCmds::remote $client } else { # None specified, so ask POW for default value set client [::powCmds::remote] } set instPos [lsearch $argv "--"] if { $instPos != -1 } { set argv [lreplace $argv $instPos $instPos] incr argc -1 } set plotFlag [lsearch $argv "-plot"] if { $plotFlag >= 0 } { set argv [lreplace $argv $plotFlag $plotFlag] incr argc set plotFlag true } else { set plotFlag false } ::powCmds::init 30 $colorCode if { $plotFlag == true } { if { $argc < 5 } { puts "usage: POWplot -plot ??" exit } set filename [lindex $argv 0] set extension [lindex $argv 1] set xColumn_ [lindex $argv 2] set yColumn_ [lindex $argv 3] set range "" if { $argc == 7 } { set token [split [lindex $argv 6] "-"] if { $token != 2 } { puts "Range specified in format:\n\nstart-end" exit } set range [lindex $argv 6] } regsub -all {[^a-zA-Z0-9.]} [file tail $filename] "_" gname set filehandle [fits open $filename 0] # find extension while (1) { set errorFlag [ catch { $filehandle move +1 } err ] if { $errorFlag } { break } else { set currentHDU [split [$filehandle get keyword EXTNAME] " "] set checkExt [string tolower [string trim [lindex $currentHDU 1] "{'}"]] if { $checkExt == [string tolower $extension] } { break } } } set wcsinfo [getWcs] if { [lindex $wcsinfo 4] != "none" } { set x_label [lindex [lindex $wcsinfo 3] 0] set y_label [lindex [lindex $wcsinfo 3] 1] } set x_unit "counts" set y_unit "counts" set _numRows [$filehandle info nrows] if { $range == "" } { set range [format "1-%s" $_numRows] } set graphName ${gname}_plot set curveName ${gname}_curve set result [$filehandle get header2str] set cntList($graphName) [getHeaderKeyWord [lindex $result 0] $graphName] set powFitsHeaderCnt($graphName) [lindex $cntList($graphName) 1] set powFitsHeaderCnt($curveName) [lindex $cntList($graphName) 1] set powWCSName($graphName) 0 set powWCSName(${graphName}scope) 0 set powWCSName($curveName) 0 set powWCSName(${curveName}scope) 0 if { [lindex $cntList($graphName) 0] > 0 } { set powFitsHeader($graphName) [lindex $result 0] set powFitsHeader($curveName) [lindex $result 0] } else { set powFitsHeader($graphName) "" set powFitsHeader($curveName) "" } set currentStr $powFitsHeader($graphName) ::powCmds::wcs $graphName $wcsinfo ::powCmds::wcsHeader $graphName 0 NONE start set idx 0 set headerLen [string length $currentStr] if { $idx + $headerLen <= 3000 } { ::powCmds::wcsHeader $graphName $headerLen $currentStr continue } else { rotationSend [lindex $result 0] $graphName } ::powCmds::wcsHeader $graphName 0 NONE done ::powCmds::wcsHeaderCnt $graphName $powFitsHeaderCnt($graphName) set currentStr $powFitsHeader($curveName) ::powCmds::wcs $curveName $wcsinfo ::powCmds::wcsHeader $curveName 0 NONE start set idx 0 set headerLen [string length $currentStr] if { $idx + $headerLen <= 3000 } { ::powCmds::wcsHeader $curveName $headerLen $currentStr continue } else { rotationSend [lindex $result 0] $curveName } ::powCmds::wcsHeader $curveName 0 NONE done ::powCmds::wcsHeaderCnt $curveName $powFitsHeaderCnt($curveName) if ![info exists powWCSList($graphName)] { set powWCSList($graphName) {} lappend powWCSList($graphName) 1 lappend powWCSList($graphName) DEFAULT } foreach name [lindex $powWCSList($graphName) 1] { # plot is against columns input set powWCSLabel(xlabel,$graphName,$name) $xColumn_ set powWCSLabel(ylabel,$graphName,$name) $yColumn_ assembleWcsLabel $filehandle $graphName "plot" $name ::powCmds::wcsLabel $graphName "xlabel" $name $powWCSLabel(xlabel,$graphName,$name) ::powCmds::wcsLabel $graphName "ylabel" $name $powWCSLabel(ylabel,$graphName,$name) ::powCmds::wcsLabel $graphName "xunit" $name $powWCSLabel(xunit,$graphName,$name) ::powCmds::wcsLabel $graphName "yunit" $name $powWCSLabel(yunit,$graphName,$name) ::powCmds::wcsLabel $graphName "zlabel" $name $powWCSLabel(zlabel,$graphName,$name) ::powCmds::wcsLabel $curveName "xlabel" $name $powWCSLabel(xlabel,$graphName,$name) ::powCmds::wcsLabel $curveName "ylabel" $name $powWCSLabel(ylabel,$graphName,$name) ::powCmds::wcsLabel $curveName "xunit" $name $powWCSLabel(xunit,$graphName,$name) ::powCmds::wcsLabel $curveName "yunit" $name $powWCSLabel(yunit,$graphName,$name) ::powCmds::wcsLabel $curveName "zlabel" $name $powWCSLabel(zlabel,$graphName,$name) } set x_unit $powWCSLabel(xunit,$graphName,DEFAULT) set y_unit $powWCSLabel(yunit,$graphName,DEFAULT) set powWCSList(${graphName}scope) $powWCSList($graphName) set powWCSList(${curveName}scope) $powWCSList($graphName) # value set wcsliststr "[lindex $powWCSList($graphName) 0]" foreach name [lindex $powWCSList($graphName) 1] { set wcsliststr [format "%s|%s" $wcsliststr $name] } ::powCmds::wcsSetList $graphName $wcsliststr ::powCmds::wcsSetList $curveName $wcsliststr set data [_getDataForAxis $filehandle "x" $xColumn_ $range] set xcol_data [ptr2lst [lindex $data 0] [lindex $data 1] [lindex $data 2]] set data [_getDataForAxis $filehandle "y" $yColumn_ $range] set ycol_data [ptr2lst [lindex $data 0] [lindex $data 1] [lindex $data 2]] # set xcol_data [lreplace $xcol_data 2000 end] # set ycol_data [lreplace $ycol_data 2000 end] set sendBlockSize 200 ::powCmds::create data xdataName NONE Start if { [llength $xcol_data] <= $sendBlockSize } { ::powCmds::create data xdataName $xcol_data continue } else { while { [llength $xcol_data] > 0 } { set currentBatch [lrange $xcol_data 0 [expr $sendBlockSize - 1]] set xcol_data [lreplace $xcol_data 0 [expr $sendBlockSize - 1]] ::powCmds::create data xdataName $currentBatch continue } } ::powCmds::create data xdataName NONE Done ::powCmds::create data ydataName NONE Start if { [llength $ycol_data] <= $sendBlockSize } { ::powCmds::create data ydataName $ycol_data continue } else { while { [llength $ycol_data] > 0 } { set currentBatch [lrange $ycol_data 0 [expr $sendBlockSize - 1]] set ycol_data [lreplace $ycol_data 0 [expr $sendBlockSize - 1]] ::powCmds::create data ydataName $currentBatch continue } } ::powCmds::create data ydataName NONE Done ::powCmds::create curve $curveName xdataName ydataName ::powCmds::create graph $graphName $curveName NULL ::powCmds::size 300 300 ::powCmds::graph -name $graphName \ xlabel $xColumn_ \ ylabel $yColumn_ \ xunits $x_unit \ yunits $y_unit ::powCmds::curve -name $curveName pDisp No lDisp Yes ::powCmds::select graph $graphName $filehandle close } else { foreach filename $argv { regsub -all {[^a-zA-Z0-9.]} [file tail $filename] "_" gname set filehandle [fits open $filename 0] set imghandle [$filehandle load image] set dims [$filehandle info imgdim] set n1 [lindex $dims 0] if { [llength $dims]==1 } { set n2 1 } else { set n2 [lindex $dims 1] } set data_type [lindex [lindex [$filehandle get keyword BITPIX] 0] 1] set data_type $ppFitsDataType($data_type) if { ([catch {$filehandle get keyword BZERO}] == 0) || ([catch {$filehandle get keyword BSCALE}] == 0) } { set data_type 4 } # powCreateData ${gname}_data $imghandle $data_type [expr $n1 * $n2] 0 set lstData [list $imghandle $data_type [list $n1 $n2] ] ::powCmds::array $lstData ${gname}_data PTR $tcl_platform(byteOrder) # Try to get WCS (or scaling) information set x0 1 set y0 1 set xinc 1 set yinc 1 set x_label "" set y_label "" set x_unit "pixels" set y_unit "pixels" set wcsinfo [getWcs] if { [lindex $wcsinfo 4] != "none" } { set x_label [lindex [lindex $wcsinfo 3] 0] set y_label [lindex [lindex $wcsinfo 3] 1] set x_unit "deg" set y_unit "deg" } set result [$filehandle get header2str] set cntList(${gname}_img) [getHeaderKeyWord [lindex $result 0] ${gname}_img] set powFitsHeaderCnt(${gname}_img) [lindex $cntList(${gname}_img) 1] set graphName ${gname}_img set powWCSName($graphName) 0 set powWCSName(${graphName}scope) 0 if { [lindex $cntList($graphName) 0] > 0 } { set powFitsHeader($graphName) [lindex $result 0] } else { set powFitsHeader($graphName) "" } set currentStr $powFitsHeader($graphName) ::powCmds::wcs $graphName $wcsinfo ::powCmds::wcsHeader $graphName 0 NONE start set idx 0 set headerLen [string length $currentStr] if { $idx + $headerLen <= 3000 } { ::powCmds::wcsHeader $graphName $headerLen $currentStr continue } else { rotationSend [lindex $result 0] $graphName } ::powCmds::wcsHeader $graphName 0 NONE done ::powCmds::wcsHeaderCnt $graphName $powFitsHeaderCnt($graphName) ::powCmds::create image $graphName ${gname}_data $n1 $n2 if ![info exists powWCSList($graphName)] { set powWCSList($graphName) {} lappend powWCSList($graphName) 1 lappend powWCSList($graphName) DEFAULT } foreach name [lindex $powWCSList($graphName) 1] { assembleWcsLabel $filehandle $graphName "image" $name ::powCmds::wcsLabel $graphName "xlabel" $name $powWCSLabel(xlabel,$graphName,$name) ::powCmds::wcsLabel $graphName "ylabel" $name $powWCSLabel(ylabel,$graphName,$name) ::powCmds::wcsLabel $graphName "xunit" $name $powWCSLabel(xunit,$graphName,$name) ::powCmds::wcsLabel $graphName "yunit" $name $powWCSLabel(yunit,$graphName,$name) ::powCmds::wcsLabel $graphName "zlabel" $name $powWCSLabel(zlabel,$graphName,$name) } set powWCSList(${graphName}scope) $powWCSList($graphName) # value set wcsliststr "[lindex $powWCSList($graphName) 0]" foreach name [lindex $powWCSList($graphName) 1] { set wcsliststr [format "%s|%s" $wcsliststr $name] } ::powCmds::wcsSetList $graphName $wcsliststr ::powCmds::graph -name $graphName \ xlabel $x_label \ ylabel $y_label \ xunits $x_unit \ yunits $y_unit ::powCmds::create graph $graphName NULL $graphName $filehandle close } } if { $client != "" } { exit } fv5.4/ftools/guis/powclient/PowClient.c0000644000220700001010000000365507240046147017552 0ustar birbylheadev#ifdef __WIN32__ #include #endif #include "powdata.h" int Powclient_Init(Tcl_Interp *interp_instance); /* globals linked with tcl variables */ int tty = 0; int Pow_Done = 0; /* current method for event handling, will change */ int pixelSizes[5] = {1,2,4,4,8}; Tcl_HashTable PowDataTable; Tcl_Interp *interp = NULL; /* Interpreter for application. */ int Powclient_Init(Tcl_Interp *interp_instance) { Tcl_DString pow_env; char *charptr; char temp[1000]; Tcl_DStringInit(&pow_env); interp = interp_instance; charptr = Tcl_GetVar2(interp,"env", "POW_LIBRARY", TCL_GLOBAL_ONLY); if( charptr == NULL ) { puts("Could not find defaults."); puts(" Set your POW_LIBRARY environment variable."); return TCL_ERROR; } else { Tcl_DStringAppend(&pow_env,charptr, -1); } /* Brackets needed around %s to prevent Windows-style paths */ /* ... eg, c:\fv... from getting converted to control chars */ /* when doing the GlobalEval. */ sprintf(temp,"lappend auto_path {%s}; powXPA::init",charptr); if( Tcl_GlobalEval(interp,temp) == TCL_ERROR ) return TCL_ERROR; Tcl_InitHashTable(&PowDataTable, TCL_STRING_KEYS); Tcl_CreateCommand(interp,"powCreateDataFromList",PowCreateDataFromList, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp,"powCreateDataFromChannel", PowCreateDataFromChannel, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp,"powCreateDataFromPtr", PowCreateDataFromPtr, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp,"powCreateStrFromPtr", PowCreateStrFromPtr, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); return TCL_OK; } fv5.4/ftools/guis/powclient/PowCreateData.c0000644000220700001010000000641107240046147020322 0ustar birbylheadev#include "powdata.h" /* Initializes a PowData structure and adds it to powTable */ void PowCreateData(char *data_name, void *data_array, int *data_type, int *length, int *copy, int *status) { PowData *array_instance; Tcl_HashEntry *entry_ptr; char *str_ptr; char *orig_ptr,*cpy_ptr; int new = 0; int i; entry_ptr = Tcl_CreateHashEntry(&PowDataTable, data_name, &new); #ifdef DEBUG if (!new) { printf("Reusing data name: %s\n",data_name); } #endif array_instance = (PowData *) ckalloc(sizeof(PowData)); if(array_instance == NULL) { *status = TCL_ERROR; fprintf(stderr, "Couldn't ckalloc array structure space"); Tcl_DeleteHashEntry(entry_ptr); return; } Tcl_SetHashValue( entry_ptr, array_instance); str_ptr = ckalloc(strlen(data_name)+1); strncpy(str_ptr,data_name,strlen(data_name)+1); array_instance->data_name = str_ptr; array_instance->data_array = data_array; array_instance->copy = *copy; array_instance->data_type = *data_type; array_instance->length = *length; if (array_instance->data_type >= 8 || array_instance->data_type <= -8) { switch (array_instance->data_type) { case 8: array_instance->data_type = 0; break; case 16: array_instance->data_type = 1; break; case 32: array_instance->data_type = 2; break; case -32: array_instance->data_type = 3; break; case -64: array_instance->data_type = 4; break; default: *status = TCL_ERROR; fprintf(stderr, "Unknown data type\n"); Tcl_DeleteHashEntry(entry_ptr); return; } } if( *copy > 0 ) { /* copy data: If *copy<0, don't copy but free pointer in DestroyData */ orig_ptr = (char *) data_array; array_instance->data_array = (void *) ckalloc(*length * pixelSizes[*data_type]); if(array_instance->data_array == NULL) { *status = TCL_ERROR; fprintf(stderr, "Couldn't allocate space for copy of data."); Tcl_DeleteHashEntry(entry_ptr); return; } cpy_ptr = (char *) array_instance->data_array; for (i=0; i < *length * pixelSizes[*data_type]; i++) { *(cpy_ptr++) = *(orig_ptr++); } } } void PowDestroyData(char *data_name, int *status) { Tcl_HashEntry *entry_ptr; char errormsg[1024]; PowData *data_ptr; entry_ptr = Tcl_FindHashEntry(&PowDataTable,data_name); if (entry_ptr == NULL) { *status = TCL_ERROR; sprintf(errormsg,"Can't find POWData Object %s to destroy",data_name); Tcl_SetResult(interp,errormsg,TCL_VOLATILE); return; } data_ptr = Tcl_GetHashValue(entry_ptr); /*free the data if it's ours*/ if (data_ptr->copy != 0) { ckfree(data_ptr->data_array); } /*Delete the entry from the master POWData Hash*/ Tcl_DeleteHashEntry(entry_ptr); /*free the PowData memory itself and the string holding the name, although this is small change*/ ckfree( (char*)data_ptr->data_name); ckfree( (char*)data_ptr); } void PowRegisterData(PowData *dataptr,int *status) { int new = 0; Tcl_HashEntry *entry_ptr; entry_ptr = Tcl_CreateHashEntry(&PowDataTable, dataptr->data_name, &new); #ifdef DEBUG if (!new) { printf("Reusing data name: %s\n",data_name); } #endif Tcl_SetHashValue( entry_ptr, dataptr); return; } fv5.4/ftools/guis/powclient/PowDataCommands.c0000644000220700001010000001767307240046147020674 0ustar birbylheadev#include "powdata.h" /* on some system , e.g. linux, SUNs DBL_MAX is in float.h */ #ifndef DBL_MAX #include #endif #ifndef DBL_MIN #include #endif #ifdef macintosh #include #endif int PowCreateDataFromChannel(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[] ) { /* usage: powCDFC channel data_name bitpix byteOrder */ Tcl_Channel channel; char buffer[1024]; char *data, *cName, *dName, *bin, *bout; int done=0, copy=-1, status=0, i, j; int nPts, datasize, bitpix, byteOrder, bytesRead, len=0; if( argc!=5 ) { Tcl_SetResult(interp, "usage: powCreateDataFromChannel chanName " "data_name bitpix byteOrder", TCL_VOLATILE); return TCL_ERROR; } cName = Tcl_GetStringFromObj( argv[1], NULL ); dName = Tcl_GetStringFromObj( argv[2], NULL ); Tcl_GetIntFromObj( interp, argv[3], &bitpix ); Tcl_GetIntFromObj( interp, argv[4], &byteOrder ); if( bitpix<0 || bitpix>4 ) { Tcl_SetResult(interp, "Unsupported bitpix value", TCL_VOLATILE); return TCL_ERROR; } channel = Tcl_GetChannel( interp, cName, NULL ); if( channel==NULL ) { Tcl_AppendResult(interp, "Unable to find channel ", cName, NULL); return TCL_ERROR; } switch (bitpix) { case 0: datasize = 1; break; case 1: datasize = 2; break; case 2: datasize = 4; break; case 3: datasize = 4; break; case 4: datasize = 8; break; } while( !done ) { bytesRead = Tcl_Read( channel, buffer, 1024 ); if( len==0 ) { len = bytesRead; data = (char *) ckalloc( bytesRead * sizeof(char) ); } else if( bytesRead>0 ) { len += bytesRead; data = (char *) ckrealloc( data, len * sizeof(char) ); if( bytesRead<1024 ) done=1; } else if( bytesRead==0 ) { done=1; } else { /* ERROR */ if( len>0 ) ckfree( data ); Tcl_AppendResult(interp, "Error reading channel", NULL); return TCL_ERROR; } if( byteOrder>0 || datasize==1 ) { memcpy( data+len-bytesRead, buffer, bytesRead ); } else { bin = buffer; bout = data+len-bytesRead; nPts = bytesRead/datasize; for( i=0; i4 ) { Tcl_SetResult(interp, "Unsupported bitpix value", TCL_VOLATILE); return TCL_ERROR; } switch (bitpix) { case 0: datasize = 1; break; case 1: datasize = 2; break; case 2: datasize = 4; break; case 3: datasize = 4; break; case 4: datasize = 8; break; } if( byteOrder>0 || datasize==1 ) { copy = 1; } else { bin = (char *)data; bout = (char *)ckalloc( nPts * datasize * sizeof(char) ); for( i=0; i 4) { interp->result = "usage: powCreateDataFromList data_name list_o_data ?stringflag?"; return TCL_ERROR; } if (Tcl_SplitList(interp,argv[2],&largc,&largv) != TCL_OK) { Tcl_SetResult(interp,"Couldn't split input data list",TCL_VOLATILE); return TCL_ERROR; } if (argc == 4) { if (Tcl_GetBoolean(interp,argv[3],&string_flag) != TCL_OK) { Tcl_SetResult(interp,"Couldn't convert stringflag to boolean", TCL_VOLATILE); return TCL_ERROR; } } if (string_flag) { i=0; j=STRING_DATA; PowCreateData(argv[1],(void *)largv,&j,&largc,&i,&status); } else { data = (double *)ckalloc(largc * sizeof(double)); counter = largv; datacounter = data; for (i=0;icopy = 1; /*Return the string representation of the PowData pointer */ sprintf(ptrString,PTRFORMAT,data_instance); Tcl_SetResult(interp,ptrString,TCL_VOLATILE); return TCL_OK; } int PowCreateStrFromPtr(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[] ) { Tcl_Obj **dList; char *data, *dPtr, *dName, *bin, *bout; int done=0, copy=-1, status=0, i, j; int nPts, datasize, bitpix, byteOrder; if( argc!=4 ) { Tcl_SetResult(interp, "usage: powCreateStrFromPtr " "address bitpix naxes", TCL_VOLATILE); return TCL_ERROR; } dPtr = Tcl_GetStringFromObj( argv[1], NULL ); if (sscanf(dPtr,PTRFORMAT,&data) != 1) { Tcl_SetResult(interp,"Couldn't parse data address into an integer", TCL_VOLATILE); return TCL_ERROR; } Tcl_GetIntFromObj( interp, argv[2], &bitpix ); /* Read NAXES list and calculate data length */ if( Tcl_ListObjGetElements( interp, argv[3], &i, &dList ) != TCL_OK ) { Tcl_AppendResult(interp, "Bad naxes parameter", TCL_VOLATILE); return TCL_ERROR; } for( nPts=1; i; ) { Tcl_GetIntFromObj( interp, dList[--i], &j ); nPts *= j; } if( bitpix<0 || bitpix>4 ) { Tcl_SetResult(interp, "Unsupported bitpix value", TCL_VOLATILE); return TCL_ERROR; } switch (bitpix) { case 0: datasize = 1; break; case 1: datasize = 2; break; case 2: datasize = 4; break; case 3: datasize = 4; break; case 4: datasize = 8; break; } Tcl_SetObjResult( interp, Tcl_NewStringObj( data, nPts * datasize ) ); return TCL_OK; } fv5.4/ftools/guis/powclient/PowDataUtils.c0000644000220700001010000000107607240046147020221 0ustar birbylheadev#include "powdata.h" #include /* on some system , e.g. linux, SUNs DBL_MAX is in float.h */ #ifndef DBL_MAX #include #endif #ifndef DBL_MIN #include #endif PowData * PowFindData(char *data_name) { Tcl_HashEntry *entry_ptr; PowData *data_ptr; if(data_name == NULL || strstr(data_name,"NULL") != NULL) { return (PowData *) NULL; } entry_ptr = Tcl_FindHashEntry(&PowDataTable,data_name); if (entry_ptr == NULL) { return (PowData *) NULL; } data_ptr = (PowData *) Tcl_GetHashValue(entry_ptr); return data_ptr; } fv5.4/ftools/guis/powclient/README.INSTALL0000644000220700001010000000032207240066655017461 0ustar birbylheadev1) To install, ./configure --prefix=your_root_install_directory make make install 2) To clean, make distclean (Makefile is also deleted) or make clean (only delete the .o files) fv5.4/ftools/guis/powclient/install-sh0000755000220700001010000000421207240046150017466 0ustar birbylheadev#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5; it is not part of GNU. # # $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $ # # This script is compatible with the BSD install script, but was written # from scratch. # # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" instcmd="$mvprog" chmodcmd="" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; *) if [ x"$src" = x ] then src=$1 else dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` fi # Make a temp file name in the proper directory. dstdir=`dirname $dst` dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp # and set any options; do chmod last to preserve setuid bits if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; fi if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; fi if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; fi if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; fi # Now rename the file to the real destination. $doit $rmcmd $dst $doit $mvcmd $dsttmp $dst exit 0 fv5.4/ftools/guis/powclient/powdata.h0000644000220700001010000000460707240046150017302 0ustar birbylheadev#define POWDATA #ifndef _POWDATA_H #define _POWDATA_H #include "tcl.h" #include "tk.h" #include #include #ifndef MAC_TCL # include #endif # include #include # include #include #if !(defined(__WIN32__) || defined(macintosh)) #include #include #include # include #endif #define BYTE_DATA 0 /* unsigned char */ #define SHORTINT_DATA 1 #define INT_DATA 2 #define REAL_DATA 3 #define DOUBLE_DATA 4 #define STRING_DATA 5 /* on some system , e.g. linux, SUNs DBL_MAX is in float.h */ #ifndef DBL_MAX #include #endif #ifndef DBL_MIN #include #endif /* Sun4s do not support %p, so switch to %lx */ #ifdef HEX_PTRFORMAT #define PTRFORMAT "%lx" #else #define PTRFORMAT "%p" #endif extern int pixelSizes[5]; /* Typedef for a PowData structure. This is the main way of getting data into TCL */ typedef struct PowData { char *data_name; /* The identifier for this data known to TCL and the calling program. Also the hash key. */ void *data_array; /* The array full of data. */ int data_type; /* The actual type of the data Byte-0,2 Bytes-1,4 Bytes-2, 4 Bytes Real- 3, 8 Bytes Real- 4 (not fully supported for images), String - 5 (currently supported as the "z-vector" for a curve only. */ int copy; /*if non-zero, indicates that the data pointer "belongs" to POW (i.e. the data was copied at creation time) and may thus be 'ckfree'd */ int length; /* The number of elements in the array. */ } PowData; extern int pixelSizes[5]; extern int Pow_Done; extern int tty; /* extern int isatty _ANSI_ARGS_((int fd)); */ extern Tcl_Interp *interp; /* Interpreter for application. */ extern Tcl_HashTable PowDataTable; void PowCreateData(char *, void *, int *, int *, int *, int *); void PowRegisterData(PowData *,int *); void PowDestroyData(char *, int *); PowData * PowFindData(char *); int PowCreateDataFromChannel(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowCreateDataFromPtr(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowCreateStrFromPtr(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowCreateDataFromList(ClientData, Tcl_Interp *, int, char **); #endif fv5.4/tcltk/0002755000220700001010000000000012565674053012344 5ustar birbylheadevfv5.4/tcltk/pow/0002755000220700001010000000000012565674033013147 5ustar birbylheadevfv5.4/tcltk/pow/About.html0000644000220700001010000000075110072774337015107 0ustar birbylheadev About Pow

      About Pow

      POW is a curve plotting and image display interface tool written and distributed by the HEASARC at NASA/GSFC.

      The current version of POW is 3.0 and it is still under active development. POW features a very flexible developer's interface and a "friendly" end user GUI interface. POW is a Tcl/Tk extension and can be called from standard C or FORTRAN main programs.

      fv5.4/tcltk/pow/Blinking.html0000644000220700001010000001102210072774337015563 0ustar birbylheadev Blink Images/Graphs

      Blink Images/Graphs

      Within POW, multiple images can be examined for differences by the common technique of overlaying them and blinking them in rapid succession. Pow provides two methods for doing this.

      Blink Images...

      Multiple images can be placed within a single POW graph. This can be achieved by merging the contents of several graphs into a single one (via POW's Merge Graphs or Edit Graphs menu items), or, if the data is part of a 3-D data cube, by using an outside tool (eg, fv) to produce a graph with each 2-D slice of the cube treated as a separate image. After the graph containing all the desired images has been created and selected, select Blink Images from the Edit menu. A dialog box containing information about the current graph and controls for the blinking behavior will be displayed.

      At the top of the dialog box is the name of the selected graph followed by the number of images in the graph and the image number currently in the foreground. The Prev and Next buttons immediately below this information step through the images, bringing each one to the foreground in turn. It is possible to either blink all the images in order or in a specified sequence. The Add to List button appends to this sequence list the image currently in the foreground. The sequence List entry box consists of a comma-separated list of image numbers and/or ranges (e.g., 1-3,5,8-10,14). A pair of radio buttons determines with the sequence list is used or all the images are blinked in order. Two checkbuttons control whether blinking is Looped--repeated indefinitely--or stopped after the last image is displayed, or blinked in Reverse order. A slidebar controls the Speed at which blinking occurs. All these controls can be modified while images are being blinked and will take effect immediately. To have a new list of frames take effect, though, one must reselect the List radio button.

      When the controls are set to their desired values, press the Blink Images button to begin blinking. The button changes to Stop Blinking.

      If the selected graph is changed while the dialog box is open, press the Reload Info button to update the dialog with the new information.

      Blink Graphs...

      It is not always possible to put all one's images into a single graph--images may lack a common coordinate system for automatic alignment--preventing the previous blinking method from being used. The Blink Graphs menu item allows individual graphs to be blinked. There is no "natural order" with which to blink graphs, so the user is presented with a list of all Available Graphs and must specify which graphs to blink and in which order. The Add and Insert buttons append to the end or insert at the current selection point of the Blink Order list the highlighted graphs from the Available Graphs list. A graph may appear multiple times in the Blink Order list. The Delete button removes all highlighted entries from the Blink Order list. As in the Blink Images method, a slidebar controls the speed of the blinking.

      Blink begins when the Blink Graphs button is pressed. Blinking is always in the specified order (no reverse option) and will repeat indefinitely until the Stop Blinking button (same as the Blink Graphs button) is pressed.

      As graphs normally don't initially overlap and will likely need to be repositioned, the graphs in the Blink Order list can be moved from within the dialog box. A compass labeled Shift & Align Graphs is present in the center of the dialog box. Clicking on the center of the compass aligns all the graphs in the list according to the top right corner of the first graph. Clicking on any of the arrows shifts the highlighted graphs 10 pixels in that direction. Shift-clicking an arrow shifts the graphs 1 pixel at a time. The graphs continue to move in these increments until the mouse button is released or the cursor leaves the compass arrow. (Note: if an individual graph is present several times in the Blink Order list, each instance of it in the highlighted selection will experience the shift.) Graphs can be repositioned with the compass while blinking.

      If graphs are added to the POW canvas while the dialog box is open, press the Reload Info button to create a new list of Available Graphs.

      fv5.4/tcltk/pow/Color.html0000644000220700001010000000634310072774337015116 0ustar birbylheadev POW and Color

      POW and X Colormaps

      POW allows some interactive manipulation of the Colortable used to display grayscale images. POW has detailed X Colormap handling options. There are four different ways of dealing with colormaps. The powColormap options are available in fv by using the "-cmap" command line argument to fv. The different options are:

      • 0 - let POW attempt to determine the optimum colormap setup for you. This is the default.
      • 1 - Force POW to setup a private colormap. POW will setup this colormap to minimize (but not eliminate) flashing.
      • 2 - Force POW to use truecolor. If you have a 16 or 24 bit truecolor visual available, this looks very nice, and allows different colortables for different images, but interactive changes to the image colortable are slow. If you only have 8 bit truecolor, this will look pretty bad.
      • 3 - Force POW to use the screen default colormap. This guarantees no flashing, but may force truecolor image mode to be used with an 8-bit visual which looks really awful.
      Generally, if you experience colormap problems, mode 1 is probably the most robust unless you don't have any pseudocolor visuals (e.g. a Linux machine running in 16 or 24 bit mode).

      The POW Color Menu

      The POW Color menu has four parts:

      1. The top section contains three hierarchical menus listing a bunch of colortables from which to choose. They are divided into Continuous (colors vary in a smooth manner), Ramps (colormap is divided into separate colors within which the intensity varies from dark to bright), and Steps (colormap is divided into blocks of a constant color/intensity).
      2. You can reverse the "dark to light" direction of your colortable by checking the Invert Colortable button.
      3. There are four scalings of the colortable available in the next section. The first three linear, sqrt, and log apply the indicated function to the color table. The next item -- Histo Equalize -- will compute a histogram of an image (within a user-configurable range) and attempt to distribute colors equally amongst the pixels. The Rescale Image command allows the user to define what intensity range over which to apply the color table. The window which comes up contains the original and current intensity range and a histogram of the current image. A new range can be either typed in directly or selected using the histogram.
      4. The final item -- Create Colorbar -- will create a new graph containing a colorbar for the current image.

      You can interactively change the contrast and brightness of the current image's colortable by dragging the left mouse button across the image.

      fv5.4/tcltk/pow/Contours.html0000644000220700001010000000656510072774337015662 0ustar birbylheadev Contour Creation

      Contour Maps

      Selecting Make Contour Map from the Edit menu brings up a dialog box which allows one to specify how the contour map will be created for the current image in the current graph (indicated by the green bounding box)...

      Image Range: Minimum and maximum pixel values of the selected image.

      Contour Range: Minimum and maximum values to contour over. The values are initially taken from a "clean" approximation of the min and max pixel values of the image, but the user can change these values to whatever is desired. (Note that the min value need not be less than the max value.)

      # Contours: Number of contour levels to produce between the range points. One can either click on the < or > buttons to decrease/increase the number or type in a new number directly.

      Scale: Scaling method for interpolating contour levels. The linear method will space the contours over a constant interval from the min and max range. The other two options -- sqrt and log -- do much the same thing but based on the square root or logarithm of the min and max values. These latter options bring out the finer details at the lower contour levels in images with a large dynamic range.

      Contours: This is the actual list of contours to draw. The previous contour items update this list each time they are clicked, but the list may be customized prior to clicking the Make Contours button.

      Resolution: This determines how detailed (and accurate) the contours will be. At high resolution, contours will be produced based on the value from each pixel of the image. Low resolution will produce contours using the average pixel value in 3x3 sections, resulting in a lot few points to be plotted and, therefore, faster performance. Medium resolution uses 2x2 sections. Using high resolution when the contour intervals are similar in size to the image noise will create an enormous number of points, significantly slowing down POW.

      Separate Graph: If this box is checked, when the contours are created, the contours will be placed in a separate graph by itself. Otherwise, the contours will be placed on top of the current graph along with the original image.

      Click on the Make Contours button to build and draw the contours. After a set of contours is created, its parameters can still be modified in this dialog box and the contours recreated (replacing the previous version) with the Make Contours button. Contours are created as a POW curve, so one can control its display features (color, line style, etc) from the Edit Graphs dialog box.

      If the original image contains WCS information, the contours will be created in terms of celestial coordinates. (Without WCS information, contours will be drawn in pixel coordinates.) As a result, one can place the contours made from one image into a graph containing another image (with its own, possibly different, WCS information) and the contours will be positioned appropriately for the new graph. This can be used to compare observations of the same object at different wavelengths (eg, radio and optical).

      fv5.4/tcltk/pow/DefaultOptions.html0000644000220700001010000002030410072774337016771 0ustar birbylheadev Preferences

      Preferences

      The Preferences... item in the Edit menu, brings up a dialog box in which one can set the default display behavior for new graphs. One can control the tick frequency, grid line colors, and scaling for graph axes; color, point styles, and line types for scatter plots; and colormaps and scaling of images. The window has a paned format in which the options affecting each part of the graph has a pane which can be brought forward by clicking the appropriately labeled tab.

      • POW
        
             This pane sets the application level preferences for how POW
             looks and behaves.  Cursor sets the image to use as the
             mouse cursor when in POW's main window.  POW's "GUI" consists of
             the 3 pixel readouts, the Scopebox, and the Zoom In/Out buttons
             usually located at the top of the window.  The GUI
             Position option allows you to move these to any side of the
             window or turn them off altogether.  Scopebox Size alters
             the size of the scopebox -- the window showing a small overview
             of the current graph -- or hides it altogether.  Resize
             Window determines whether the POW window will get bigger or
             smaller (as far as possible) whenever you change the objects in
             the main POW window, so as to show you everything currently
             displayed in the main POW window without scrolling.
             Using the color grid or button, Background Color will set
             the color to use for the background of all of POW's windows.
      • Graph
        
             This pane has been modified, containing a pair of entry
             boxes labeled Size, a set of buttons labeled
             Scaling and new control to choose functionality for
             right or left mouse buttons [More options are available when 
             editting a real graph (see Edit Graphs).]  Enter
             into the Size boxes, the default width and height to use
             when creating a new graph.  When a graph is created by another
             program (such as fv), it determines the size of the graph, so
             these options are usually overridden.  The Scaling buttons
             activate logarithmic graphs.  The first row of linear and
             log buttons cause each axis to be drawn in either linear
             or logarithmic format.  This does not affect the data, just how
             the graph coordinates are interpretted and labeled.  You can
             control the logarithmic conversion of individual curve data from
             the Points and Lines panes.
        
             The mouse control button can be clicked to switch the functionality
             of mouse buttons. Default will be left mouse button to control image
             zoom factor, and right mouse button to control brightness/contrast.
      • Fonts
        
             This pane controls the appearance of text in the graph.  One can
             independently set the font, size, style, and color of the Title,
             Axis Labels, Tick Labels, and default Text Labels.
             The Text Label value is used only for the initial text label.  All
             subsequent labels inherit their values from the previous label.
      • Ticks
        
             This pane controls the appearance of the tick marks and
             associated grid lines.  Use the slidebars to indicate
             approximately how many tick marks should be drawn (and labeled)
             on each axis of the graph.  At the far left, no tickmarks will be
             drawn on each axis.  At the far right, about 30 may be drawn.
             The X Ticks and Y Ticks options control whether the
             X and Y tickmarks are drawn inside or outside the graph's box and
             whether they are labeled on the left and bottom axes.  The
             Tick Labels option selects between Decimal and Base 60
             (degrees minutes seconds) numerical formats.  Base 60 is only used
             when a graph contains WCS information.  If the Grid Lines
             checkbox is selected, lines will drawn on the graph, tracing the
             path of each tick mark coordinate.  One can control the
             Color and line Style (solid, dashed, etc) of these
             lines.
      • Points
        
             The checkbox at the top of this item indicates whether the
             individual points of the curve should be drawn.  The points can
             be drawn as any of the 7 listed shapes.  The size
             of the points (except Dot which is always 1 point) can either be
             fixed at a constant size indicated by the slidebar, or
             drawn with widths/heights indicating the X and Y error
             bars.  If there are X/Y error bars but the points are drawn
             in a fixed style, the error bars will be indicated by
             horizontal/vertical lines centered on the point.  Points can be
             Filled or just drawn in outline.  Finally, select the
             desired color from the displayed colorbar.  This can be a
             different color than selected in the Lines pane.
        
             At the bottom are a pair of LogX/logY checkbuttons labeled
             Transform (This is the same option as in the Lines pane).
             Checking these will cause curves to have the logarithm of their
             data plotted instead of the data itself.  This does not
             automatically result in logarithmic axes, which are turned on
             from the Graph pane.  Unless you will always want your data to be
             converted to a certain logarithm format, these options should be
             left unset.
      • Lines
        
             The checkbox at the top of this pane indicates whether data
             points will be connected with a continuous line.  The line can be
             of several patterned styles or widths.  The points
             can also be connected directly (Normal) or in a
             stair-step pattern (Histogram).  In the latter mode, the
             Fill Boxes option draws the histogram as a series of solid
             boxes instead of an outline.  Finally, select the desired color
             from the displayed colorbar.  This can be a different color than
             selected in the Points pane.
        
             At the bottom are a pair of LogX/logY checkbuttons labeled
             Transform (This is the same option as in the Points pane).
             Checking these will cause curves to have the logarithm of their
             data plotted instead of the data itself.  This does not
             automatically result in logarithmic axes, which are turned on
             from the Graph pane.  Unless you will always want your data to be
             converted to a certain logarithm format, these options should be
             left unset.
      • Image
        
             This pane controls the appearance of images.  Most of the pane
             consists of a bunch of different colormaps.  They are grouped in
             the same sequence as listed in the Color menu: smooth, continuous
             colormaps, followed by ramps, then the step functions.  The
             Invert option will reverse the order of the colormap when
             turned on.  The Scaling option controls how the colormap
             is applied to the image.  For Linear scaling, each
             colormap level corresponds to a constant intensity range in the
             image.  Square-Root scaling changes the mapping such that
             the intensity range covered by each color level increases as the
             square-root function, producing higher contrast at lower
             intesities.  Logarithmic scaling uses the logarithmic
             function for colormapping, giving even more contrast at low
             intensities than sqrt.  Histo Equalize scaling computes
             a histogram of the image and tries to distribute colors equally
             over the number of pixels.

      Clicking the Reset button will revert the options to their values when the dialog box was initially opened, undoing any modifications. Clicking the Save button will make the current settings the defaults for new graphs and save them in your .powrc file. The Get Current button grabs any available options from the current graph. Its current image (if present) will be used for the default image options and its first curve (if present) for the default curve options. Exitting will also make the new settings the current defaults, but won't save them.

      fv5.4/tcltk/pow/Edit.html0000644000220700001010000000553410072774337014726 0ustar birbylheadev The POW edit menu

      The POW edit menu

      • Edit Graph: This sequence of dialogues allows you to change the curves and images displayed on a graph, and to define new curves and new images from existing data. The ability to read in new data will be available soon.
      • Add Text Label: You can add an arbitrary text label to a graph. One can control the font used for each label. Labels can be attached either to the graph's geometry (eg, legends) or to its coordinate system (eg, labeling objects).
      • Choose Graph Size: You can resize the currently selected graph to given dimensions (in pixels).
      • Duplicate Graph: Make an exact duplicate of the current graph.
      • Delete Graph: Permanantly remove a graph. The objects within the graph are not destroyed, however, and are still available from the Edit Graph window.
      • Merge Graphs: Selecting a graph from the hierarchical menu will cause the contents of that graph to be copied into the currently selected graph.
      • Hide Graph: This allows you to remove any graph from display on the POW canvas. The graph may be replotted later.
      • Replot Graph: This allows you to restore a previously hidden graph to the POW canvas. Replotting a graph will cause POW to recalculate the x and y limits of the graph to allow you to see all of the defined items on that graph; that is all the points of all the curves and all of the images will be visible.
      • Axes Transforms: Select the type of logarithmic/linear axes to use for the current graph. Any curves present will be remapped to the appropriate axes. POW will attempt to maintain the current axes bounds.
      • Tick Labels: You may choose decimal or Base 60/degree (WCS) formats for the axis labels on your graphs and for what shows up in the Coordinate tracker. "Base 60" axes only apply to graphs which contain images or curves with WCS coordinate information.
      • Grid Line Options: You can toggle the grid on or off and choose dashed and colored grid styles for the currently selected graph. More options are available from the Edit Graphs dialog box.
      • Preferences: Set default behaviors and appearance for POW, curves, images, and graphs. See Preferences.
      fv5.4/tcltk/pow/EditGraphs.html0000644000220700001010000002145110072774337016067 0ustar birbylheadev Edit Graph

      Edit Graph

      A POW Graph consists of a number of Curves and Images drawn within a given rectangular region. The Edit Graph item in the Edit menu brings about a dialog box from which one can control what objects are drawn, how they are displayed, and how the graph itself is drawn...

      The dialog box consists of 3 major regions. The top portion controls the contents of the current (or new) graph. The box on the left lists the objects currently in the graph. The box on the right lists all the available objects which are not in the graph. In both boxes, the type of each object (image or curve) will be indicated in parentheses after the objects' names. The Add and Remove buttons in between allows one to move the selected objects between the two lists. The name of the graph being editted is given below the left box. This can be changed if one wants to create a new graph rather than modify the current one. The Edit Objects button under the right box opens up another dialog box which allows one to edit the data structures which define Curves and Images.

      The second region, below the graph contents section, contains the editable display options for the graph and graph objects. It has a paned format. At its top are a series of labeled tabs. Click on one of the tabs to view and edit that set of options. Each tab and its options are described below...

      • Graph

        This pane contains the highest-level options affecting a graph's appearance. The first entry box contains the graph's title string. By default it is the graph name used internally by POW, but it can be any string or even blank. The entry boxes list, for both the X and Y axes, the Label to be written, the Min and Max values of the axis (actually, the lower-left and upper-right bounds of the graph's display region), the Units label of the values (printed within parentheses after the axis label), and the Size of the graph on the screen in pixels. Any or all of these may be NULL which tells POW to use the default values. In the case of the bounding box (Min/Max), default values will be determined by the minimum values required to display all the graph's contents. For Units, a NULL value will indicate not to list any units in the label axes. Clicking the Reset Min/Max button at the bottome sets all the bounding box values to NULL.

        Below the entry boxes are a set of buttons labeled Scaling. These activate logarithmic graphs. The first row of linear and log buttons cause each axis to be drawn in either linear or logarithmic format. This does not affect the data, just how the graph coordinates are interpretted and labeled. The Scale curve data to axes check button determines whether the curves in this graph will be converted to the same axis format. Do not check this if any of your curves already contain logarithmic values (instead of the true values) and you only need to change how the axes are displayed, not how the curves are plotted. You can control the logarithmic conversion of individual curve data from the Points and Lines panes.

      • Fonts

        This pane controls the appearance of text in the graph. One can independently set the font, size, style, and color of the Title, Axis Labels, Tick Labels, and default Text Labels. The Text Label value is used only for the initial text label. All subsequent labels inherit their values from the previous label.

      • Ticks

        This pane controls the appearance of the tick marks and associated grid lines. Use the slidebars to indicate approximately how many tick marks should be drawn (and labeled) on each axis of the graph. At the far left, no tickmarks will be drawn on each axis. At the far right, about 30 may be drawn. The X Ticks and Y Ticks options control whether the X and Y tickmarks are drawn inside or outside the graph's box and whether they are labeled on the left and bottom axes. The Tick Labels option selects between Decimal and Base 60 (degrees minutes seconds) numerical formats. Base 60 is only used when a graph contains WCS information. If the Grid Lines checkbox is selected, lines will drawn on the graph, tracing the path of each tick mark coordinate. One can control the Color and line Style (solid, dashed, etc) of these lines.

      • Points

        The checkbox at the top of this item indicates whether the individual points of the curve should be drawn. The points can be drawn as any of the 7 listed shapes. The size of the points (except Dot which is always 1 point) can either be fixed at a constant size indicated by the slidebar, or drawn with widths/heights indicating the X and Y error bars. If there are X/Y error bars but the points are drawn in a fixed style, the error bars will be indicated by horizontal/vertical lines centered on the point. Points can be Filled or just drawn in outline. Finally, select the desired color from the displayed colorbar. This can be a different color than selected in the Lines pane.

        At the bottom of the pane is a pair of LogX/logY checkbuttons. Checking these will cause this curve to have the logarithm of its data plotted instead of its true values. If the data is logarithmic already, leave these options unchecked, but select the appropriate Scaling mode in the Graph options (see above).

      • Lines

        The checkbox at the top of this pane indicates whether data points will be connected with a continuous line. The line can be of several patterned styles or widths. The points can also be connected directly (Normal) or in a stair-step pattern (Histogram). In the latter mode, the Fill Boxes option draws the histogram as a series of solid boxes instead of an outline. Finally, select the desired color from the displayed colorbar. This can be a different color than selected in the Points pane.

        At the bottom of the pane is a pair of LogX/logY checkbuttons. Checking these will cause this curve to have the logarithm of its data plotted instead of its true values. If the data is logarithmic already, leave these options unchecked, but select the appropriate Scaling mode in the Graph options (see above).

      • Image

        This pane controls the appearance of images. Most of the pane consists of a bunch of different colormaps. They are grouped in the same sequence as listed in the Color menu: smooth, continuous colormaps, followed by ramps, then the step functions. The Invert option will reverse the order of the colormap when turned on. The Scaling option controls how the colormap is applied to the image. For Linear scaling, each colormap level corresponds to a constant intensity range in the image. Square-Root scaling changes the mapping such that the intensity range covered by each color level increases as the square-root function, producing higher contrast at lower intesities. Logarithmic scaling uses the logarithmic function for colormapping, giving even more contrast at low intensities than sqrt. Histo Equalize scaling computes a histogram of the image and tries to distribute colors equally over the number of pixels. The Range entry boxes at the bottom list the intensity range over which the colormap should be applied. Initially, they will contain the full intensity range of the image. The Reset button resets these values to the full range of the image.

      At the very bottom of the dialog box are 3 buttons. Apply will update the selected graph using the modified parameter values. The Reset button will reset the parameter options and object lists based on the currently selected graph (for when one either wants to revert to the original parameters, or if one selected a new graph, or if new objects were created). The Exit button closes the dialog box. Any changes will be lost if not Applyed before exitting.

      fv5.4/tcltk/pow/EditObjects.html0000644000220700001010000000764210072774337016242 0ustar birbylheadev Edit Objects

      Edit Objects

      The Edit Objects dialog box has much the same layout as the Edit Graphs dialog box. It is divided into 3 regions...

      At the top of the dialog box are two list boxes. The box on the left lists all known display objects (curves and images). The box on the right lists all known data objects. The number following the data objects' names indicates the number of values contained within each object. (The NULL data object is used to specify no data for certain elements of Curve objects.) The name of the display object being editted is indicated by the entry box below the left box. New objects are editted by simply entering a unique name. (Note that curves and images are treated separately, so one can have both a curve and image with the same name.) The Edit Data button on the right currently does nothing. In a future release, one will be able to edit old and create new data objects.

      The middle portion of the dialog box lists the parameters defining the selected object. Using the pair of radio buttons at the top of this region one can alternate (or convert) between editting the object as a Curve or Image...

      • Curve:

        A POW Curve is formed by specifying up to 4 data objects: X, Y, X-error, and Y-error. To assign data to the curve, highlight one of the data objects in the top right box and then click on the appropriate button in the curve parameter list. Either X or Y must be specified, but the others are all optional. If an X or Y data object is given as "NULL", POW will generate a simple integer count instead.

        A curve can contain WCS information which allows it to be plotted in celestial coordinates instead of pixels. Enter (or edit) the values at the bottom of the parameter list and select the WCS Info check box.

      • Image:

        A POW Image is created from a single data object; highlight the desired data object and click on the Data button. The NULL data object cannot be used for an image. The Units entry box lists the units of the array values (not the X/Y coordinates). A data object is one-dimensional, so the image needs to know how to convert the data into a 2-D array. This is done by entering the X and Y Dimensions of the image in the first pair of entry boxes. Below them are the 3 image scale parameters. Origin specifies the coordinates of the center of the bottom left pixel of the image. By convention, FITS images have an origin of (1,1) when specified in pixels. The Pixel Size specifies the linear scale of the pixels (in units/pixel) and Units specify the physical units used for the Orign and Pixel Size.

        An image can contain WCS information which allows it to be labeled in celestial coordinates instead of pixels. Enter (or edit) the values at the bottom of the parameter list and select the WCS Info check box. WCS information overrides the image scale parameters (origin, pixel size, and units).

      At the bottom of the dialog box are 3 buttons. Create Object creates the indicated object. If the Object Name is unique, a new object will be created otherwise, it will replace the old version. (Note than a curve and image can have the same name and but will still be considered unique.) Creating/Editting an object does not immediately affect the graphs in which that object already exists, so it is necessary to update them manual from the Edit Graphs dialog box. Reload Info will reset the parameter list and update the object/data boxes with the current list of known objects. The Exit button closes the dialog box. Any changes will be lost if an object wasn't created before exitting.

      fv5.4/tcltk/pow/File.html0000644000220700001010000000075310450557573014717 0ustar birbylheadev The POW File Menu

      The POW File Menu

      There are two actions on the POW file menu:
      1. Print/Save Plot will call up the POW print controller window.
      2. Close Pow will shut down POW. Most applications that use POW will be unaffected by this and allow you to launch POW again later when needed.
      fv5.4/tcltk/pow/HOWTO0000644000220700001010000000351406771505632013773 0ustar birbylheadevThe only really tricky part about using POW from TCL is getting a pointer to your data passed to it. This must be done through the clientData argument when you call Tcl_CreateCommand for whatever command is going to read the data. The file readpha.c is an example in the current POW distribution. The routine for the command that's going to create/read the data will have the standard look for a TCL command written in C: #include "pow.h" int readpha(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { Now define a pointer to pointer to use to do the "pointer pass": int **databuff You'll also presumably have a pointer to the actual data you want to "create" in POW: void *imagebuff Now do whatever you need to to get imagebuff to point at the array you want to "create" in POW, and then: databuff = clientData; *databuff = (int *)imagebuff; You probably want to have your TCL command return the things that powCreateData is expecting (i.e. a data type and the number of elements in the array, something like: sprintf(interp->result,"%i %i", array_type, width*height); array type can be either a string or an integer: BYTE 0 SHORTINT 1 INT 2 REAL 3 DOUBLE 4 You can now do: eval [concat powCreateData mydata [readpha filename]] So the high level TCL commands which work now are: %powCreateData data_name data_type length %powCreateImage image_name data_name xoffset yoffset width height xorigin xinc yorigin yinc xunits yunits zunits %powCreateGraph graph_name curves images xunits yunits xlabel ylabel xdimdisp ydimdisp There are actually more, but they can all be accessed through the POW GUI, so I'm not going to describe them right now. fv5.4/tcltk/pow/Labels.html0000644000220700001010000000575010072774337015243 0ustar birbylheadev Text Labels

      Add Text Labels...

      Users can add short text strings to a graph in a number of fonts, sizes, and styles. To add a label, select the graph to be used, then choose the Add Text Labels command in the Edit menu. The Annotations window will come up.

      Type in the string to be created in the top entry box and select the appropriate display options. Only a small subset of commonly-used font families are included in the font listing. Click the color button to specify a color. (Note: For the first label created, the default font values found here are obtained from the Edit Graph/Set Default Options settings for Text Labels. For all subsequent labels, though, the values are inheritted from the previous label created.)

      The Position entry boxes list the coordinates at which the label is to be placed; the position corresponds to the bottom left corner of the text string. The values are interpretted based on the following option.

      The Attach To radiobuttons determine how the Position values are interpretted and how the text handled. The Graph option will make the label a graph object which will be placed at a fixed position relative to the graph but independent of the axes values (like the title or axis labels). The lower-left corner of the graph is position 0,0 and the top-right corner is 1,1. The label can be placed outside the graph as well as inside. Zooming has no effect on it, but resizing the graph will move the label so that its relative position is the same. This option is good for adding notes or legends to the graph. The Coordinates option will make the label a plotted object which will be placed according to the graph's axes. If the indicated position is not within the current bounds -- due to zooming or panning -- the label will not be displayed. This option is good for labeling objects in images or parts of curves. The Position values will be converted between these two coordinate systems when the option is changed.

      The Add button creates a new label. The Delete button removes the current label from the graph. And the Apply button modifies the current label.

      Once created, labels can be repositioned by dragging them with the left mouse button. If a label is attached to a graph's Coordinates and you drag it outside the graph, the label will disappear when dropped. The label still exists, but is just positioned outside the graph's axes range. Alter the axes to display the labels new position.

      Double-clicking a label will bring up the Annotations window, if it doesn't already exist, with the label's information. When this window is open, a single-click is sufficient for selecting a different label for editting.

      fv5.4/tcltk/pow/Makefile0000644000220700001010000000616412153467703014611 0ustar birbylheadevHD_COMPONENT_NAME = tcltk HD_COMPONENT_VERS = HD_LIBRARY_ROOT = pow HD_LIBRARY_SRC_c = PowCanvCurve.c PowColormap.c PowCommands.c \ PowCreateCurve.c PowCreateData.c PowCreateGraph.c \ PowCreateImage.c PowCreateVector.c \ PowEventHandlers.c PowGrid.c PowInit.c PowUtils.c \ PowWCS.c Visu_colors.c Visu_generic.c Visu_Init.c \ Visu_lut.c Visu_shared_colors.c Visu_tkImgPict.c # unused: orbit.c PowDrvr.c readpha.c tclShared.c tkAppInit.c HD_CFLAGS = -I${TCL_DIR}/../generic -I${TK_DIR}/../generic \ ${XINCLUDES} ${HD_STD_CFLAGS} \ -DVISU_LIBRARY=\"${HD_LIB}/pow\" HD_INSTALL_LIBRARIES = ${HD_LIBRARY_ROOT} HD_SHLIB_LIBS = ${HD_LFLAGS} -l${CFITSIO} -l${TCL} -l${TK} ${XLIBS} HD_INSTALL_SHELL_SCRIPTS = POWplot HD_INSTALL_HEADERS = pow.h tkpict.h HD_INSTALL_EXTRA = install-pow-extras default: build-libpow all: default publish include ${HD_STD_MAKEFILE} # Get cfitsio source files and prepend ${CFITSIO_DIR} prefix to each filename. CFITSIO_OBJ_TMP = ${shell if [ -f ${CFITSIO_DIR}/Makefile ]; then ${MAKE} -f ${CFITSIO_DIR}/Makefile cfitsioLibObjs; fi | grep buffers} CFITSIO_OBJ = ${shell if [ "x${CFITSIO_OBJ_TMP}" != "x" ]; then echo ${CFITSIO_OBJ_TMP}; fi | sed "s: : ${CFITSIO_DIR}/:g" | sed "s:^:${CFITSIO_DIR}/:"} ${CFITSIO_OBJ}: @for file in ${CFITSIO_OBJ}; do \ if [ ! -f $$file ]; then \ echo "Cannot find CFITSIO object $$file"; exit 1; \ fi; \ done # Get wcslib source files and prepend ${WCSLIB_DIR} prefix to each filename. WCSLIB_OBJ_TMP = ${shell if [ -f ${WCSLIB_DIR}/makedefs ]; then cd ${WCSLIB_DIR}/C; ${MAKE} echo_modules FLAVOUR=${WCSFLAV} WCSTRIG=WRAPPER; fi | grep fitshdr} WCSLIB_OBJ = ${shell if [ "x${WCSLIB_OBJ_TMP}" != "x" ]; then echo ${WCSLIB_OBJ_TMP}; fi | sed "s: : ${WCSLIB_DIR}/C/:g" | sed "s:^:${WCSLIB_DIR}/C/:"} ${WCSLIB_OBJ}: @for file in ${WCSLIB_OBJ}; do \ if [ ! -f $$file ]; then \ echo "Cannot find WCSLIB object $$file"; exit 1; \ fi; \ done build-libpow: @if [ "x${CFITSIO_OBJ}" = x ]; then \ echo "CFITSIO_OBJ macro is empty"; exit 1; \ fi @if [ "x${WCSLIB_OBJ}" = x ]; then \ echo "WCSLIB_OBJ macro is empty"; exit 1; \ fi ${HD_MAKE} pow HD_LIBRARY_ROOT=pow \ HD_LIBRARY_OBJ="${HD_LIBRARY_SRC_c:.c=.${OSUF}} ${CFITSIO_OBJ} ${WCSLIB_OBJ}" POW_TCL = html_library.tcl notebook.tcl Notifications.tcl \ PowCmdsClass.tcl powEdit.tcl powImgProbe.tcl \ powMovie.tcl POWplot.tcl powProfile.tcl powRgn.tcl \ powRuler.tcl powScript.tcl pow.tcl RegionList.tcl \ Region.tcl Shape.tcl visu_widgets.tcl tclIndex \ powXRange.tcl POW_HTML = About.html Blinking.html Color.html Contours.html \ DefaultOptions.html EditGraphs.html Edit.html \ EditObjects.html File.html Labels.html \ Moving_Graphs.html Options.html Overview.html \ POWAPI.html Probe.html Profile.html Regions.html \ ROI.html Ruler.html Scripting.html Tools.html \ PrintControl.html XRange.html POW_EXTRAS = mhh7.gif stretcharrow.xbm # pow.def pow.dsp pow.dsw powMacResource.r pow.pch pow.sit.hqx install-pow-extras: @for extra in ${POW_TCL} ${POW_HTML} ${POW_EXTRAS}; do \ ${HD_INSTALL} $$extra ${HD_LIB}/pow/$$extra ${HD_CP_P}; \ done fv5.4/tcltk/pow/Makefile.develop0000644000220700001010000000160206202215327016225 0ustar birbylheadevCFLAGS = -g -I../local/include/itcl -I../visu-2.0/src -I../fitsTcl/cfitsio LDFLAGS = -g -L. -lpow -L../fitsTcl/ -lcfitsio -L../visu-2.0/src -lVISU2.0 -L../local/lib/itcl/ -ltk4.1i -ltcl7.5i -lX11 -lm SRC = PowCommands.o \ PowCreateCurve.o PowCreateData.o \ PowCreateGraph.o PowCreateImage.o \ PowCreateVector.o PowEventHandlers.o \ PowInit.o PowUtils.o \ readpha.o all: libpow.a libpow.so $(CC) $(CFLAGS) tkAppInit.c -o powwish $(LDFLAGS) libpow.a: $(SRC) rm -f libpow.a ar r libpow.a $(SRC) libpow.so : $(SRC) rm -f libpow.so ld -shared -o libpow.so $(SRC) install: libpow.a libpow.so cp libpow.a ../local/include cp libpow.so ../local/lib cp pow.tcl ../local/lib clean: rm -rf *.o *~ powwish *.a *.so .f.a: $(FC) $(FFLAGS) -c $*.f $(AR) $(ARFLAGS) $@ $(> TAGS rm CTAGS powLibObjs: @echo ${OBJECTS} orbit.o # This target actually builds the objects needed for the lib in the above case objs: ${OFILES} orbit.o .c.o: ${CC} -c ${CFLAGS} ${DEFS} ${IFLAGS} $< fv5.4/tcltk/pow/Moving_Graphs.html0000644000220700001010000000271510427676401016577 0ustar birbylheadev POW Graph Movement

      POW Graph Movement and Stretching

      Any graph in POW can be moved to any position in the main POW window. Just left click and drag either the graph's Title at the top of the graph or the yellow bounding box of the currently selected graph. Clicking anywhere inside a graph's region (the area within the yellow box when selected) will select the graph. You may drag your cursor outside the POW window on your desktop (at least it works with the X window managers we've tried so far).

      To change the displayed size of a graph, left click and drag the double headed arrow at the lower right corner of the graph. This preserves the aspect ratio of the plot by default. To independently change the length of the X or Y axis, hold down the 'shift' key while dragging the mouse." You can also set the graph size directly using the Choose Graph Size item from the Edit menu. Note: resizing images to large dimensions can rapidly consume all of the memory on your machine, resulting in lots of swapping and/or crashing. To zoom in on just a portion of an image, see Zooming in on a Region of Interest.

      fv5.4/tcltk/pow/Notifications.tcl0000644000220700001010000001744010442112556016455 0ustar birbylheadev######################################################################## # # class: Notifications # # purpose: Provide a message distribution center for special events. # Any number of objects/users can ask to be notified when # a given event occurs. # # usage: To create/access the notification center: # set newObj [gNotifications] # or # set oldObj [gNotifications default] # where the first example creates a new notification center # and the later returns pre-existing one of an unknown # name (or creates a new one if one doesn't already exist). # In most cases, an application should have only one # notification object, so either create one and store it in # a global variable, or always access it through the "default" # method. # # To send a message: # NotificationObj postMessage object message ?args? # where "object" is the object to which "message" applies, # usually the sending object. "message" is a string # describing the event which has just taken place... # eg, "graphHasFinishedDrawing". "args" contains extra # information observers may use. # # To register to receive messages: # NotificationObj addObserver observer cmd object message # where "observer" is the object (or function name) to be # called when "message" is posted by (or for) "object". "cmd" # is either the observing object's method to be used or a # extra/dummy argument passed to an observing function. An # observing object needs to implement the method: # body observer::cmd { object message opts } {...} # while an observing function implements the procedure: # proc observer { cmd object message opts } {...} # where opts is an optional list of additional information # sent by the object. # # To unregister: # NotificationObj removeObserver observer ?object? ?message? # where "observer" is the same as before. An observer can # unregister for all messages or just ones from particular # objects and messages. # ####################################################################### itcl::class Notifications { constructor {} {} destructor {} public { method addObserver { observer cmd object message } method removeObserver { observer {object ""} {message ""} } method postMessage { object message args } method registerRemote { rNotes } { set remoteNotes $rNotes } } private { variable lookup variable remoteNotes "" method locateObserver { observer observerList } } } ####################################################################### # # gNotifications ?default? # # Use this procedure to create/access instances of Notifications in # the global namespace # ####################################################################### proc gNotifications { args } { if { [llength $args]==1 && [lindex $args 0]=="default" } { set args "" set gNote [lindex [itcl::find objects ::* -class Notifications] 0] if { $gNote != "" } { return $gNote } } return [uplevel #0 Notifications #auto $args] } ######################################################################## # # addObserver cmd object message # # Use this method to register an object/procedure as an observer for # a particular object/message # ######################################################################## itcl::body Notifications::addObserver { observer cmd object message } { set object [string trimleft $object :] if { $cmd=="-" } { set cmd $message } if { $remoteNotes != "" \ && $object != "" && $object != "*" && [itcl::find object *::$object] != "" \ && [$object isa DistantObject] && $message != "connectionHasClosed" } { # Looking for a message not sent by a DO, so pass registration # to remote Notification center. $remoteNotes addObserver $observer $cmd $object $message return } if { [info exists lookup($message,$object)] } { set currentObservers $lookup($message,$object) if { [locateObserver $observer $currentObservers]==-1 } { lappend currentObservers [list $observer $cmd] } } else { set currentObservers [list [list $observer $cmd]] } set lookup($message,$object) $currentObservers } ######################################################################## # # removeObserver observer ?object? ?message? # # Use this method to remove an object/procedure from receiving # certian notifications # ######################################################################## itcl::body Notifications::removeObserver { observer {object ""} {message ""} } { set object [string trimleft $object :] if { $remoteNotes != "" \ && $object != "" && $object != "*" && [itcl::find object *::$object] != "" \ && [$object isa DistantObject] && $message != "connectionHasClosed" } { # Looking for a message not sent by a DO, so pass registration # to remote Notification center. $remoteNotes removeObserver $observer $object $message return } if { $object!="" && $message!="" } { if { ![info exists lookup($message,$object)] } return set currentObservers $lookup($message,$object) set idx [locateObserver $observer $currentObservers] if { $idx == -1 } return set lookup($message,$object) [lreplace $currentObservers $idx $idx] } else { foreach key [array names lookup] { foreach [list o m] [split $key ","] {} if { ($object=="" || $object==$o) && \ ($message=="" || $message==$m) } { set currentObservers $lookup($key) set idx [locateObserver $observer $currentObservers] if { $idx != -1 } { set lookup($key) [lreplace $currentObservers $idx $idx] } } } } } ######################################################################## # # postMessage object message # # Use this method to send a message to all observers # ######################################################################## itcl::body Notifications::postMessage { object message args } { set object [string trimleft $object :] ########### # # Build list of ... # set allObservers {} # # ... observers of fully-resolved object-message, ... # if { [info exists lookup($message,$object)] } { eval lappend allObservers $lookup($message,$object) } # # ... observers of all messages from this object, ... # if { [info exists lookup(*,$object)] } { eval lappend allObservers $lookup(*,$object) } # # ... observers of this message from all objects # if { [info exists lookup($message,*)] } { eval lappend allObservers $lookup($message,*) } # # Now send notifications to each observer # foreach observer $allObservers { foreach [list obs cmd] $observer {} # DebugStr "... notifying \"$obs\" of $message" if { [catch {$obs $cmd $object $message $args} res] } { # DebugStr "*** Notify error: $obs $cmd $object $message" # DebugStr "$res" } } } ######################################################################## # # Private methods... # itcl::body Notifications::locateObserver { observer observerList } { set idx 0 foreach oldObserver $observerList { if { $observer == [lindex $oldObserver 0] } { return $idx } incr idx } return -1 } fv5.4/tcltk/pow/Options.html0000644000220700001010000000022710072774337015466 0ustar birbylheadev The POW Options Menu

      Superceded by Preferences dialog and Edit menu. fv5.4/tcltk/pow/Overview.html0000644000220700001010000000373510450557573015651 0ustar birbylheadev POW help

      POW Help

      Overview

      The main displayed object in POW is a graph. A graph is defined by a list of curves and images that belong to it. When a graph is selected (by clicking anywhere within its bounds) a thumbnail version of the whole graph will be displayed in the scope window at the upper right showing all of the curves and images that belong to that graph. The displayed version of the graph, in the main POW window, lower left, will only display those members of the graph that fall within the X and Y ranges for the current region of interest.

      The most important thing to remember when using pow is that all actions, such as dragging out a region for GTI selection in Xselect, or choosing a region of interest to zoom in on refer to the currently selected graph. The currently selected graph is surrounded by a yellow box in the main POW window, it is displayed in the scope window, and its name is shown in the yellow box above the scope. So remember to click on the graph you're interested in before dragging your mouse.

      Menu

    17. File: Printing; Closing POW
    18. Edit: Changing the parameters of a graph, and creating new graphs.
    19. Color: Modifying image colortables and screen colormaps.
    20. Tools: Blinking/animation, creating region files and image contours, analyzing images and create X ranges.
    21. Zoom: Zooming in on a Region of Interest
    22. Replot: Replot or unzoom the current selected plot/image to zoom factor of 1.
    23. fv5.4/tcltk/pow/POWAPI.html0000644000220700001010000010567207173651420015037 0ustar birbylheadev
      
      POW works in terms of objects (although at the moment, it's not written 
      using object-oriented TCL).  Each of these objects has a name (just an 
      ASCII string).  Once an object is "constructed", you use the name
      to refer to it in the various things you want to do to it ("methods").
      The main objects are:
      
      PowData - this object is an array (in the C sense) in memory somewhere
                along with info on data type and the length of the array.
                At creation, you can specify that POW should make it's own copy
                of the data, allowing you to "free" your copy, or you can save
                space by allowing POW to use your copy of the data, just don't
                free or change it unless you destroy the PowData object first.
      
      PowVector, PowImage - these are your choices for what you can create using
                your PowData, they give "physical" meaning to the data by specifying
                units and, for images, dimensions.  You can make any number of 
                Images and Vectors from one chunk of Data, and you can specify 
                offsets so as to use only part of the Data.
      
      PowCurve - This is a collection of 1 to 6 vectors which represent a curve in
                 space and its associated errors. Currently, nothing is done
                 with the z and z-error vectors, but suggestions are welcome.
      
      PowGraph - This is the only *displayed* object in POW.  I.e. you can display
                 your Images and Curves only by creating a Graph with them as 
                 members, or by plotting them on an existing Graph (at which
                 point they become part of that Graph).  One Image or vector
                 can, of course, appear in any number of Graphs.  
      
      
      The TCL interface:
      
      *arguments in angle brackets are optional
      
      
      "Constructors"
      powSetupColormap  toplevel free_cells ?force_cmap? ?options? -
      	You should call this to create the first toplevel window for your
      	application unless you really want to do your own colormap 
      	management.  This proc will use the default colormap if it can
              allocate enough colors or will allocate a Private pseudocolor colormap
              with an	attempt to minimize flashing.  If this fails to find any
      	pseudocolor visuals, it will use the default colormap and disable
              pseudocolor images in POW.
      
      	toplevel - this is the name of the toplevel you want to create.
      	           it should probably be the first toplevel your application
                         creates (e.g. .mytop)  and all subsequent toplevel creation
                         statements should include a "-colormap .mytop" option.
      
      	free_cells - the number of colors your application will need in 
      	             addition to what POW allocates for itself.  If you get
      	             BadColor errors (or the like) in your application, try 
      	             making this number bigger.  If you keep getting a Private
                           colormap when your Default colormap is full, try making 
      	             this number smaller.
      	
      	force_cmap - Forces different colormap behaviors.  You might want 
                           to give your users a way to set this themselves.: 
      	           0 - Default behavior.  I.e. choose the "best" colormap.
      	           1 - Force POW to setup a new private pseudocolor colormap 
                             (very safe)
                         2 - Force POW to use truecolor mode (very safe, but 
                             looks bad on low color displays and runs slower than
                             pseudocolor).  Note: this will cause powSetupColormap
                             to look for a truecolor visual; if it can't find one,
                             it will allow the main Tk code to pick a visual,
                             but POW will still use "truecolor mode" (i.e. the
                             Tk photo widget) to display images.
                         3 - Force use of the screen default colormap. This should
                             be reasonably safe now, but often won't be what you
                             want.
                             
       
      	options - a string of extra options to hand to the toplevel creation
                        command, if you need them.
      	
      	See comments under powInit for more details.
      
      
      powInit ?XColormapWindow? ?container? ?powGUI? - creates the .pow toplevel 
      	window, all the user interface buttons and the .pow.pow
              canvas.  The second optional argument is the pathname of a 
      	container window for POW if you want to embed POW in your own
              toplevel (only works for Tcl/Tk8.0 and later versions). 
      	The first optional argument is the name of a window in your
      	application and tells POW to use the same X colormap as that
              window;  this will allow your user to reliably see both POW
              and your application in the proper colors at the same time.
              Note, if you give an argument to powInit, that window should 
      	have a pseudocolor visual with at least 60 free read-write 
      	colorcells (call powSetupColormap first) or POW will disable 
              pseudocolor images.  The third argument indicates wether you 
              want POW to wrap its main canvas in an enduser GUI. Unless
              you're embedding POW in a specialized application, you'll
              want to leave this at the default of 1; a value of 0 removes
              the GUI.
      
      	If you call 'powInit none' (or with no argument) pow will handle 
      	its own colormap needs, but if it creates a private colormap, you 
      	will see serious flashing between your application's windows and 
      	the POW window.
      
      	Usually, the window you specify for powInit would be the toplevel
              window for your application and you should use powSetupColormap
              to avoid excessive flashing and Xlib induced crashes.  Make sure 
      	you create any other toplevels with the same colormap. Unfortunately,
              Tk has a stupid default behavior for picking the visual of a 
              new toplevel when it's colormap is specified, so it's recommended
              that you use powToplevel to create all your toplevels (sorry folks,
              this one's not my fault). Ok, since this is probably confusing, 
        	here's an example.
      
      	Suppose (for argument) your application uses 10 colors (for 
      	backgrounds highlights, etc) and your application's main window
      	is '.mytop'.  And you want the background of your application to
              be pink and you want it to be 100 pixels wide.  
      	When you create .mytop instead of calling 'toplevel', instead do:
      
      	powSetupColormap .mytop 10 0 "-background pink -width 100"
               
              Invoke POW with:
      
      	powInit .mytop
      
              If you create any other toplevel windows, be sure to create
      	them with:
      
              powToplevel .mydialogbox .mytop
      
      	If you need to pass other options to "toplevel", put them 
              all in one string like:
      
              powToplevel .mydialogbox .mytop "-class \"My Extra Window\" -bg blue"
      
      powToplevel topwin refwin ?option_string? -
      	This is a replacement for the Tk toplevel command.  The Tk toplevel
              command with a "-colormap" argument but no "-visual" argument 
              *doesn't* use the visual of the given colormap to create the new 
              window; instead it uses the screen default visual and then dies
              if they're not compatible.  Why? Who knows? 
      
        topwin  The name of the toplevel you want to create.
      
        refwin  The window whose colormap you want to use.
      
        option_string  Any other options you want to pass to the "toplevel" command.
                This needs to be a single string.
      
              If you don't want to call powToplevel, doing this yourself is simple.
              Here's the code for the powToplevel proc:
      
      proc powToplevel {topwin refwin {options ""}} {
      #this implements what *should* be default behavior.  Apparently the evil
      #of Xlib colormap handling is contagious.
      
          eval "toplevel $topwin -colormap $refwin -visual \"[winfo visual $refwin] [winfo depth $refwin]\" $options"
      
      }
             
      
      
      powCreateData data_name data_pointer data_type length ?copy? -
                 This "constructs" a PowData object.  The other ways
                 to create PowData at present are with the powCreateVectorEN
                 or the powCreateDataFromList commands, see below.
      
        data_pointer  This argument will probably be the return value from either:
                      $fitsfile load image
                         or
                      $fitsfile load column
                      See fitsTcl documentation for details.  Or you can write your
                      own TCL command to make data.  Just have it return a void
                      pointer formatted with:
                      sprintf(interp->result,rstring,"%p",(void *)dataptr);
      
        data_type     This is one of the strings (or an integer):
                        "BYTE"     or  0  or   8                   1 byte
                        "SHORTINT" or  1  or  16                   2 bytes
                        "INT"      or  2  or  32                   4 bytes
                        "REAL" or "FLOAT" or 3 or -32              4 bytes
                        "DOUBLE"   or  4  or -64                   8 bytes
      
                      Note: 8 byte integers are not supported at this time
      
           
        copy          If copy is a positive integer, POW makes its own copy of the 
                      data array and uses that, freeing it when the object gets
                      destroyed.  If copy is zero, POW uses the supplied
                      data_pointer directly (no copy), but does not try to free
                      it when destroyed.  If copy is negative, POW takes ownership
                      of the data_pointer, using it directly and freeing it when
                      the object gets destroyed.  In this last case, the
                      data_pointer *must* have been allocated using TCL's
                      ckalloc() function (always true for data from fitsTcl). 
                      The default value is 0.
      
      
      powCloneData new_data_name old_data_name ?offset? ?length? ?copy?
              This creates a new PowData object from an existing PowData object.
              !!Use this function with caution unless you are specifying 
              a copy flag > 0 or you could wind up with POW Data objects that
              point to invalid areas of memory if you destroy one of the 
              partners of the clone but not the other!! 
             
              Returns the length of the new POW Data object.
      
        offset    Specifies an offset to the starting point of the data
                  in memory. Default is 0.
      
        length    How much of the old data do you want to use?  If you specify
                  "NULL" the new data will have the same endpoint as the
                  old data.  If you specify a length that ends beyond the end 
                  of the previous data, the length will be adjusted to match
                  the endpoint of the old data. Default is "NULL".
      
        copy      If copy is a positive integer, POW makes a new copy of the 
                  old data array and uses that, freeing it when the object gets
                  destroyed.  If copy is zero, POW uses the old data pointer
                  (plus offset) directly (no copy), and does not try to free
                  the memory when the new data object is destroyed.  If copy is 
                  negative, POW will flag the new_data_name as the "owner" of
                  the data array so destroying the old_data_name will not
                  free the associated memory, but destroying the new_data_name
                  will.  If you specify copy < 0 and offset != 0, powCloneData
                  will return an error.  The default value of copy is 0.
      
      powCreateDataFromList data_name list_o_data ?stringflag? -
      	This creates a PowData object using the contents of a TCL list.
              The data object will be of type DOUBLE unless stringflag is
              is Yes.  String data should only be used as the "z" vector
              of a PowCurve object, in which case, the specified string will
              be plotted at the position given by the corresponding x and y
              values.
      
      powRegisterData powdata_pointer
              If you have an application that creates it's own PowData objects (like
              the LHEA orbit library or the internal routines in TAKO), you must
              "register" them in the main PowData hash table in order to use
              them in plotting functions.  Naturally, if the PowData objects
              aren't properly or fully created, you could run into trouble.
              The pointer is a string created the same way as described above for 
              the data_pointer argument to powCreateData, except that it should
              be a pointer to a PowData structure rather than to a simple array.
      
      powCreateVector vector_name data_name offset length units - 
                 Creates a PowVector. If length is "NULL" uses the length
                 of the Data.
      
      powCreateVectorEN vector_name data_name length start increment units -
                 Creates a vector and the data to go with it.  This is nice
                 for generating test data among other things.  You *can*
                 make a PowImage using the data this generates, by the way.
                 (EN stands for Ex Nihilo)
      
      powCreateImage image_name data_name xoffset yoffset width height xorigin \
      xinc yorigin yinc xunits yunits zunits - 
                 Creates a PowImage.  The xorigin and xinc arguments are the origin
                 and pixel size in the units specified in the xunits and yunits 
                 arguments.
      
      powCreateCurve curve_name x_vector x_error y_vector y_error ?z_vector z_error?
               - Creates a PowCurve (displayable).  All but one of the component
                 vector arguments can be the string "NULL" and POW will deal with 
                 it in a hopefully sensible default manner. The length of the 
                 curve will be the length of the first non-null vector (I might
                 change this to be length of the shortest vector present).
                 I'm also thinking of allowing scalar errors indicated by an 
                 "=" sign in the argument (but this isn't done yet).
      
      	   POW curves are now implemented with a new canvas item type.
      	   For a curve named ACURVE displayed on a graph named BGRAPH,
                 the powCurve item has a tag "ACURVEBGRAPH".  powCurve supports
                 most of the options available for the Tk native "line" type.
                 So to change the fill color of ACURVE to blue and make it a dashed
                 line (5 pixel dashes) do:
      
                 .pow.pow itemconfigure ACURVEBGRAPH -fill blue -dash 5
      
                 The only use of z_vector so far is if the z_vector is
                 created from STRING type data (e.g. using powCreateDataFromList),
                 then the strings will be printed at the positions given by the
                 corresponding x and y elements.
      
      
      powCreateGraph graph_name curves images xunits yunits xlabel\
               ylabel ?xdimdisp ydimdisp xmin ymin xmax ymax?	 -
      	 This is the main one that actually draws on the .pow.pow canvas. 
      	 See discussion of powStartNewRow below to see how POW decides 
      	 where to place incoming graphs.  Some details (hopefully the
      	 rest is self-explanatory):
      
        curves, images - these are Tcl "lists" of PowImages and PowCurves to plot
        
        xunits, yunits - These are the physical units associated with an axis
               and will be printed next to the label.
      
        xlabel, ylabel - An optional label for each axis.  The y-axis label will
               be printed horizontally at the top of the y-axis since the Tk 
               canvas does not allow rotated text at this time.
        
        xdimdisp, ydimdisp - the "maximum size" for the display of the graph in
                screen pixels. The graph will be shrunk or expanded from its
                "natural" size to fit into an area of the canvas of this requested
                size.  If "NULL" is passed, a default value will be used.
      
        xmin ymin xmax ymax - the bounding region for the displayed area of a 
                graph.  These are in the units of each respective axis.  Parts
                of images or curves falling outside this box will not be plotted.
                Each of these arguments can be a list if more than one y or x axis is
                present.
      
      powGraphOptions graph_name option value ?option value option value ...? -
      	This function was added to allow easy customization of several
              (more every day :) additional options that would have been too 
              unweildy to add to the already too long powCreateGraph call.
              Specify as many option value pairs as you like.  Boolean values
              should have values of Yes/No if one wants POW's menus to properly
              reflect the new values.  In addition to all of the arguments to
              PowCreateGraph, current options are:
      	
      	bgcolor - A background color for the whole graph
      	
      	xmargin - The amount of space around a graph (in pixels by default)
      	ymargin - This will only affect subsequent operations on the graph
                        (chain alignments, replottings, etc.), it doesn't move
                        the graph immediately.
      
              handletext - Change the text that normally says:
      	           "Select/Move: graphname"
              handleanchor - Change the anchor point of the handletext. Default
                         is "sw".
              handleposition - Change where on the graph's bounding box the 
                         handle is anchored to.  Choices are:
      	           t - midpoint of top
                         l - midpoint of left side
                         b - midpoint of bottom
                         r - midpoint of right side
                         Combine to get corners.  Default is "tl".
      
              xNumTicks   - An integer number used to indicate how many ticks to
                            place on the X axis.  3-6 are reasonable values.
              yNumTicks   - An integer number used to indicate how many ticks to
                            place on the Y axis.  3-6 are reasonable values.
      	xTickLength - 4 element list indicating how long to draw the x
                            tick marks on each of the 4 sides of the graph.  Order
                            is {left right top bottom}.  Negative values cause
                            tickmarks to be drawn inside the graph box.
      	yTickLength - Same for y tick marks.
      	xLabelTicks - 4 element boolean list indicating whether the x tick
                            marks should be labeled along each side of the graph.
                            Order is {left right top bottom}.
      	yLabelTicks - Same for y tick labels.
              xTickScal   - Scaling method for the X tick marks.  Valid values
                            are "linear", "wcs" (for celestial coordinates/right
                            ascension), or "log" (for logarithmic scaling).  Tick
                            marks and labels will be drawn accordingly.  WCS scaling
                            occurs only if WCS information exists for the graph.
                            Logarithmic scaling *does not* affect the drawing of
                            curves (ie, curve data are assumed to be in logarithmic
                            format).
              yTickScal   - Same for y ticks.  WCS scaling assumes declination
                            values for the y axis, though.
              GridLines   - A boolean value indicating whether to draw grid lines
                            connecting the graph's tick marks
              GridColor   - The color of the grid lines
              GridDash    - Dash value of the grid lines.  Formats are:
                              " "    - Solid line
                              "10"   - 10 pixel dashes and spaces
                              "15 5" - 15 pixel dashes, 5 pixel spaces
                              "15 10 5 10" - Dash-dot
                              etc.
              useSixties  - A boolean value indicating whether to attempt to use
                            base 60 tick marks (works only with WCS data).
      
      powSetCurveOptions graph curve ?option value option value ...? -
              This function allows one to set the display parameters for a curve
              in the indicated graph.  If this function is not called *prior* to
              creating the graph, a curve will be assigned default values.  When
              called after the graph is created (and curve plotted), this function
              will update the appearance of the curve in both the main graph and,
              if it is the current graph, the scopebox.  The allowed options and
              values (boolean values should be Yes/No) are:
      
                 Option Name    Value Type    Option Meaning
                   pDisp     -->  boolean  -->  Display Points?
                   pShape    -->  string   -->  Point shape (Cross, Diamond, Box,
                                                   Octagon, Triangle, "Inv. Triangle")
                   pSizeErr  -->  boolean  -->  Draw point the size of errorbars?
                   pSize     -->  integer  -->  Size of point
                   pFill     -->  boolean  -->  Fill in point, if an outline
                   pColor    -->  color    -->  Color of points (any color name
                                                   or #RRGGBB value)
               	       	    	     	  
                   lDisp     -->  boolean  -->  Display line?
                   lStyle    -->  dash     -->  Dash style of line (" " is solid, 
                                                   "20" is 20-pixel dashes,
                                                   "15 10 4 10" is Dash-dot, etc)
                   lWidth    -->  integer  -->  Width of line
                   lStep     -->  boolean  -->  Draw line as histogram?
                   lBoxFill  -->  boolean  -->  Fill histogram boxes?
                   lColor    -->  color    -->  Color of line (any color name
                                                   or #RRGGBB value)
      
              If no option/value pairs are given, this function will return all the
              defined options.  If the curve has been drawn already, all the options
              will be defined.
      
      powSetImageOptions graph image ?option value option value ...? -
              This function allows one to set the display parameters for an image
              in the indicated graph.  If this function is not called *prior* to
              creating the graph, an image will be assigned default values.  When
              called after the graph is created (and image plotted), this function
              will update the appearance of the image in both the main graph and,
              if it is the current graph, the scopebox.  It will also update a
              colorbar (or if changing a colorbar option, the original image).
              The allowed options and values (boolean values should be Yes/No) are:
      
                 Option Name    Value Type    Option Meaning
                   colormap  -->  string   -->  Which colormap to use
                   invert    -->  boolean  -->  Invert colormap?
                   scale     -->  string   -->  Scaling law to use to create the
                                                   colormap (linear, sqrt, log)
      
              If no option/value pairs are given, this function will return all the
              defined options.  If the image has been drawn already, all the options
              will be defined.
      
      
      "Destructors"
      
      powDestroyX  Xname  - Destroys the named POW Object.  "X" can be:
                            Graph, Curve, Image, Vector, or Data.  Be careful,
                            don't destroy a low-level object (e.g. data) before
                            destroying a high-level one that depends on it (e.g.
                            Graph or Curve); the destructors don't (yet anyway)
                            search through all objects to handle these dependencies,
                            it's up to you to keep track of them if you need to.
                            The POWData destructor *will* free the associated 
                            memory if the Data object was created with the 
                            copy flag set.
      
      
      "Methods" 
      
      powPlotCurves graph curves ?canvas?- adds the list of Curves to an existing
                                           Graph on the Canvas (default .pow.pow)
      
      powAddCurves graph curves - adds the list of Curves to an existing Graph,
                                  updating the scope box as necessary
      
      powPlotImages graph images - adds the list of Images to an existing Graph
      
      powMagGraph graph xMagstep yMagstep - resize a Graph to the given X and Y
                    magsteps (magstep = 1 is the "natural" size of the graph).
                    Magsteps can be any real value and X and Y may be different.
      
      powStretchGraph graph xFactor yFactor - shrink or grow a Graph by the given
                       X and Y factors.
      
      powStretchGraphToSize graph xDim yDim - Set the size of the Graph to the
                       given X and Y dimensions (in pixels).
      
      powStartNewRow - POW displays incoming graphs are placed to the right
                       of all existing  material in the current "row".
      	         A "row" is defined by an (invisible) line on the graph.
                       Initially this boundary line is 10 pixels from the
                       top of the canvas.  powStartNewRow moves this line to
                       just below all material currently displayed on the
                       canvas.  To make a 3x2  "grid" of graphs do:
      
      	         %powCreateGraph graph1 ...
      	         %powCreateGraph graph2 ...
      	         %powCreateGraph graph3 ...
                       %powStartNewRow	
      	         %powCreateGraph graph4 ...
      	         %powCreateGraph graph5	 ...
      	         %powCreateGraph graph6	 ...
                        
                       If the end-user moves or resizes something during
                       this process, you won't get a strict rectangular
                       grid, but new graphs will not land on top of existing
                       ones.
      
      
      Note:  %x and %y return cursor positions in X coordinates, to turn
             these into canvas coordinates, use '.pow.pow canvasx %x' etc.
      
      
      General Interface Concepts
      
      The general way for a developer to get back info from
      his users would be to bind the left mouse button on the .pow.pow
      canvas to whatever you want it to do (the only things on the canvas
      that are currently bound to the left mouse button are the "purple"
      handles, so this should be safe).  Once you've got a coordinate (or
      set of coordinates) use '.pow.pow canvasx' and 'powCanvasToGraph graph
      X' to find out what physical coordinates your user is interested in.
      powWhereAmI can tell you which graph they appear to be inside of if
      you need to know that easily.
      
      If you set the global variable powClickCallback, <ButtonPress-1>, 
      <Double-Button-1>, <ButtonPress-2>, or <ButtonPress-3> events on the
      main POW canvas will fire your callback with the arguments "graphname
      x y binding" where: 
      
      graphname - is the graph the user clicked inside of, if they click outside of
                  all graphs, nothing happens
      x and y - are the graph (i.e. "physical") coordinates of the point they 
                clicked.
      binding - is the X event which fired the callback currently the only strings
                returned are "B1", "B2", and "B1D" (for double clicking button 1)
                but if you'd like to see more bindings,  let me know ("B3" is 
      	  currently in use for Region of Interest zooming).
      
      If you set the global variable powPreScrollCallback or powPostScrollCallback,
      when the user manipulates a scrollbar on the main .pow.pow canvas,
      your callback will be fired with the same arguments as would be
      recieved by the function specified in a '-command' argument to the
      scrollbar creation command.  See the Tk scrollbar documentation 
      for details.  The "Pre" form will fire your callback *before* the
      .pow.pow canvas is scrolled and the "Post" form will fire *after*.
      Combinations of the two should hopefully allow any custom behaviors
      you want.
      
      POW has general canvas and/or image bindings for changing the
      colortable of an image and for dragging out a Region of Interest
      (ROI).  By default, these are bound to B1 and B3 respectively (on 2
      button mice under Windows these are the two available buttons).  If
      you need to move these bindings to other buttons (to make way for your
      application's own behavior) you can set $powLutButton or $powROIButton
      to a different number after loading libpow.so but before calling
      powInit.  You can also disable either function entirely by setting 
      the corresponding variable to "0" or "NULL". For example, to move
      colortable "diddling" to button 2 and disable ROI dragging do:
      
      load libpow.so
      set powLutButton "2"
      set powROIButton "0"
      powInit .someWindow
      
      
      powGraphToCanvas graph x y ?canvas? -  takes physical coordinates
                   and returns a two element list giving the corresponding position
      	     on the specified canvas (.pow.pow by default).
      
      powCanvasToGraph graph x y ?canvas? - takes a canvas coordinate 
                   and returns the corresponding physical coordinates.
                   Optional argument specifies the canvas (.pow.pow by default). 
      
      powWhereAmI x y - takes an (x,y) pair of canvas coordinates and returns
                   which graph (or subgraph) they are inside of. If they are outside
                   of all graphs, returns "NULL".
      
      powFindCurvesMinMax curves X|Y|Z - takes a list of curves and an axis 
                  (X,Y, or Z) and returns the minimum and maximum values.
      
      
      Provided Interface Routines
      
      There will be more of these as I get feedback on what people need/want.
      
      powDragRange X|Y tag color callback - This will set up a binding on the
      left mouse button so that the user can click and drag a range in either
      Y or X for the *selected graph*.  He will see a line joining the current
      cursor position and the start position.  When he releases the LMB, all
      of the graph points that fall in the selected range will be tagged
      with the "tag" argument and will appear with the chosen "color".  The
      "callback" routine will be called with arguments graphname, X0 and X1 
      (or Y0 and Y1), specifying the edges of the user selected range in 
      *graph* (i.e. physical) coordinates.  To remove a  previous selection,
      just execute the Tk commands: 
      ".pow.pow itemconfigure $tag -fill black; .pow.pow delete $tag" 
      
      This could be used to implement an "undo" feature.
      powDragRange will also select the congruent range on all graphs with axes
      linked to the chosen axis in the current graph.
      
      powDragRect tag color callback -  This works the same as powDragRange, but
      the user chooses a rectangular region of the selected graph.  And the
      callback routine recieves 5 arguments (graphname X0 Y0 X1 Y1). Also, 
      powDragRect ignores linked axes because it's not clear what "should"
      happen to the unlinked axis. If someone wants to make a case for a
      different (or selectable) behavior here, feel free.
      
      Linked Axes
      
      POW allows you to "link" any number of axes on different graphs together.
      The resulting set of linked axes is called a "chain".  Each axis can only
      be a member of one chain.  Linking an axis from one chain to an axis in 
      another chain has the effect of merging the two chains.  Zooming on a
      region of interest on one graph will affect the linked axis on any other
      graph.  There are several utility routines.  Also, the GUI allows the
      user to view links as light pink lines connecting linked axes.
      
      powLinkAxes graph1 axis1 graph2 axis2 - The axis can be specified with a
                  capital 'X' or 'Y'.
      
      powBreakLink graph axis - removes the specified axis from its chain.
      
      powAlignChain graph axis orientation ?gap? - orientation can be H 
      	(for horizontal) or V (for vertical).  This routine will move
      	all graphs belonging to the same chain as the specified graph 
      	so that they are aligned on the canvas.  I.e.  it "stacks" the
      	graphs up in a column or lines them up in a row on the users screen.
      	The optional "gap" argument determines how much blank space (in 
      	pixels to leave between graphs).
      
      
      
      "Useful Stuff that should be safe to access"
      
      The name of the pow canvas is ".pow.pow"
      
      The tag for the axis box for a graph is:
      ${graphname}box
      When multi-axes are done, it will be:
      $graphname$xunits${yunits}box
      
      Everything belonging to a graph is tagged with the graph name.
      
      
      
      
      
      Do bugs still exist.  You bet!  Still too many to make a list yet, really; 
      you'll know 'em when you see 'em.  Known bugs in the latest release are
      listed on the "fv known bugs list" web page: 
      
              http://heasarc.gsfc.nasa.gov/ftools/fv/fv_bugs.html
      
      
      Some info on the FitsTcl functions:
      
      
      I checked in the new fitstcl with the function you need to load a column
       in a table into memory.
      
      Usage : FitsObj load column $colName $nulValue
      	where  	colName - column name
      	 	nulValue - the default Null value you want to set
      
      it returns "$address $dataType $numElements"
      	where 	(1) data can be recovered by "sscanf(address, "%p", &databuff)
      			with void *databuff
      	        (2) dataType 0 - byte
      			     1 - int
      	 		     2 - long
      		             3 - float
      	 		     4 - double
      	       	(3) numElement : size of the array
      
      Thanks
      
      Jianjun
      
      
      
      C Interface:
      
      All of the functions do the same thing as their TCL counterparts.  I'll
      list the definitions below.  The parallels should be obvious.  The one
      thing you will need is an event handler (i.e., when you call Pow, your
      program has to stop and let the user play with his or her graph).  To 
      do this you call an Event Handler.  When the user activates the "Close Pow"
      button, control returns to your program.  Eventually you'll be able
      to fork off the Event Handler etc., but for now, this is it.
      
      Only the "Constructors" are available from C, for now.  All of the "Methods"
      are written in TCL, so rather than creating Oroburos code with C calls
      TCL calls C calls ..., if you want to use any of them, just call
      
      Tcl_VarEval(proc,argument,argument,...,NULL);  - Note: all arguments
                                                       are STRINGS ! 
      
      (see Ousterhout for details). 
      
      
      Event Handlers
      
      void PowHandleEvents( )  Your program stops, when the user closes POW
                               your program begins again.
      
      void PowWishHandleEvents( ) Your program stops, until the user closes the POW
                                  GUI she can type in TCL commands at a wish
                                  prompt.  Useful for debugging and probably
                                  in production code as well. When the user closes
                                  POW, your program begins again.
      
      "Constructors"
      
      All of the POW functions have a status argument rather than just returning 
      the status.  Yes I know it's awkward, but it makes FORTRAN happier, of course
      noone's actually calling it from FORTRAN, but it was in the requirements....
      
      
      void PowInit(char *powSetupColormapArgs, char *powInitArgs, int *status)  - 
            Call this before calling any other POW functions.  PowInit first calls
            the general POW initialization routine (in the TCL version, this gets
            called when you load libpow.so).  Then it calls powSetupColormap if
            you've specified anything in the powSetupColormapArgs argument.  Then
            it calls the TCL proc powInit with any powInitArgs you've specified.
            See above for descriptions of how powSetupColormap and powInit work.
      	Example:  To force truecolor when you have no additional windows
                        to create and your application will be using no more than
                        10 non-POW colors do:
      
              PowInit(".dummy 10 2",".dummy ",&status);
      
              Tcl_VarEval(interp,"wm withdraw .dummy",(char *)NULL);
      
      
      
      void PowCreateData(char *data_name, void *data_array, int *data_type,
      		   int *length, int *copy, int *status) 
      
      
      void PowCreateVector(char *vector_name, char *data_name, int *offset,
      		     int *length, char *units, int *status) 
      
      void PowCreateVectorEN(char *vector_name, char *data_name, 
      			     int *length, double *start, double *increment, 
      			     char *units, int *status) 
      
      void PowCreateImage(char *image_name,char *data_name, int *xoffset, 
      		    int *yoffset, int *width, int *height, double *xorigin, 
      		    double *xinc, double *yorigin, double *yinc,char *xunits,
      		    char *yunits, char *zunits, int *status)
      
      void PowCreateCurve(char *curve_name, char *x_vector, char *x_error,
      		    char *y_vector, char *y_error, char *z_vector, 
      		    char *z_error, int *status)
      
      void PowCreateGraph(char *graph_name, char *curves, char *images,
      		    char *xunits, char *yunits, char *xlabel, char *ylabel,
      		    int *xdimdisp, int *ydimdisp, double *xmin_in, 
      		    double *ymin_in, double *xmax_in, double *ymax_in, 
      		    int *status)
      
      
      
      
      fv5.4/tcltk/pow/POWplot0000755000220700001010000000077707240042501014431 0ustar birbylheadev#!/bin/sh # # (if [ "x$POW" = x ] ; then \ POW=$FTOOLS; \ export POW; fi; \ POW_LIBRARY=$POW/lib/pow ;\ export POW_LIBRARY ;\ unset TCL_LIBRARY; unset TK_LIBRARY; unset TCLLIBPATH ;\ unset ITCL_LIBRARY; unset ITK_LIBRARY; \ LD_LIBRARY_PATH=$POW/lib:$LD_LIBRARY_PATH ;\ export LD_LIBRARY_PATH ;\ if [ "$POW_DISPLAY" != "" ] ; then \ $POW/bin/tclsh $POW_LIBRARY/POWplotClient.tcl -- $1 $2 $3 $4 $5 $6 $7 $8 $9; else $POW/bin/wish $POW_LIBRARY/POWplot.tcl -- $1 $2 $3 $4 $5 $6 $7 $8 $9; fi; \ exit) fv5.4/tcltk/pow/POWplot.tcl0000644000220700001010000006532311130706071015207 0ustar birbylheadevproc _getDataForAxis { filehandle axis_ axisExpression_ whichRows_ } { if { $axisExpression_ == "RowNumber" } { set axisExpression_ "#ROW" set dataType 41 set nelem [range count $whichRows_ $_numRows] set dim 1 } else { if { [catch {set axis_info [$filehandle info expr $axisExpression_]} err] } { error "Cannot plot expression for $axis_.\n\n$err" } set dataType [lindex $axis_info 0] set nelem [lindex $axis_info 1] set dim [lindex $axis_info 2] if { $dataType!=41 && $dataType!=82 } { error "Cannot plot expression type for $axis_.\ Expression must evaluate to INT or REAL" } if { $nelem == -1 } { # Scalar constants could be applied to either nRows or nElems # so just return a solitary value and expand later as needed set whichRows_ 1 } elseif { $nelem < -1 } { # Treat vector constants as a regular vector column set nelem [expr -$nelem] } } set dataInfoForPOW [$filehandle load expr -rows $whichRows_ $axisExpression_ NULL] set dataPtr [lindex $dataInfoForPOW 0] set dataType [lindex $dataInfoForPOW 1] set numElements [lindex $dataInfoForPOW 2] return [list $dataPtr $dataType $numElements $nelem $dim] } proc powDebugDataPrint { title string } { puts "$title" set k 0 for {set i 0} {$i < [string length $string]} {incr i 80} { set currentStr [string range $string $i [expr $i + 79]] puts "<$currentStr>" incr k } puts "count: $k" } proc assembleWcsLabel { filehandle img flag {selection "DEFAULT"} } { global powWCSLabel set target $selection if { $selection == " " || $selection == "DEFAULT" } { set target "DEFAULT" set selection "" } set powWCSLabel(xunit,$img,$target) "" set powWCSLabel(yunit,$img,$target) "" set x_label "" set y_label "" set x_unit "pixels" set y_unit "pixels" if { $flag == "image" } { set powWCSLabel(xlabel,$img,$target) "" set powWCSLabel(ylabel,$img,$target) "" if { ![catch {set tmp [getKeyword $filehandle CTYPE1$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_label [string trim $v {' }] set powWCSLabel(xlabel,$img,$target) $x_label } if { ![catch {set tmp [getKeyword $filehandle TTYPE1$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_label [string trim $v {' }] set powWCSLabel(xlabel,$img,$target) $x_label } if { ![catch {set tmp [getKeyword $filehandle CTYPE2$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_label [string trim $v {' }] set powWCSLabel(ylabel,$img,$target) $y_label } if { ![catch {set tmp [getKeyword $filehandle TTYPE2$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_label [string trim $v {' }] set powWCSLabel(ylabel,$img,$target) $y_label } if { ![catch {set tmp [getKeyword $filehandle CUNIT1$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_unit [string trim $v {' }] set powWCSLabel(xunit,$img,$target) $x_unit } if { ![catch {set tmp [getKeyword $filehandle TUNIT1$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_unit [string trim $v {' }] set powWCSLabel(xunit,$img,$target) $x_unit } if { ![catch {set tmp [getKeyword $filehandle CUNIT2$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_unit [string trim $v {' }] set powWCSLabel(yunit,$img,$target) $y_unit } if { ![catch {set tmp [getKeyword $filehandle TUNIT2$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_unit [string trim $v {' }] set powWCSLabel(yunit,$img,$target) $y_unit } } else { set i 0 set findUnit 0 while (1) { incr i if { ![catch {set tmp [getKeyword $filehandle CTYPE${i}$selection]}] } { set v [lindex [lindex $tmp 0] 1] set label [string trim $v {' }] if { $label == $powWCSLabel(xlabel,$img,$target) } { set powWCSLabel(xunit,$img,$target) "counts" if { ![catch { set tmp [getKeyword $filehandle CUNIT${i}$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_unit [string trim $v {' }] set powWCSLabel(xunit,$img,$target) $x_unit } incr findUnit } elseif { $label == $powWCSLabel(ylabel,$img,$target) } { set powWCSLabel(yunit,$img,$target) "counts" if { ![catch { set tmp [getKeyword $filehandle CUNIT${i}$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_unit [string trim $v {' }] set powWCSLabel(yunit,$img,$target) $y_unit } incr findUnit } if { $findUnit >= 2 } break } elseif { ![catch {set tmp [getKeyword $filehandle TTYPE${i}$selection]}] } { set v [lindex [lindex $tmp 0] 1] set label [string trim $v {' }] if { $label == $powWCSLabel(xlabel,$img,$target) } { set powWCSLabel(xunit,$img,$target) "counts" if { ![catch { set tmp [getKeyword $filehandle TUNIT${i}$selection]}] } { set v [lindex [lindex $tmp 0] 1] set x_unit [string trim $v {' }] set powWCSLabel(xunit,$img,$target) $x_unit } incr findUnit } elseif { $label == $powWCSLabel(ylabel,$img,$target) } { set powWCSLabel(yunit,$img,$target) "counts" if { ![catch { set tmp [getKeyword $filehandle TUNIT${i}$selection]}] } { set v [lindex [lindex $tmp 0] 1] set y_unit [string trim $v {' }] set powWCSLabel(yunit,$img,$target) $y_unit } incr findUnit } if { $findUnit >= 2 } break } else { break } } if { $findUnit < 2 } { puts "not enough information to plot" exit } } set z_label "counts" if { ![catch {set tmp [getKeyword $filehandle BUNIT$selection]}] } { set v [lindex [lindex $tmp 0] 1] set z_label [string trim $v {' }] } set powWCSLabel(zlabel,$img,$target) $z_label } proc getWcs {{dest {}} {RAColNum_ {}} {DecColNum_ {}} } { global filehandle if { $RAColNum_ == "" || $DecColNum_ == "" } { if { [catch {set wcs [$filehandle get wcs -m $dest]}] } { return "" } else { return $wcs } } else { set wcs [$filehandle get wcs -m $dest $RAColNum_ $DecColNum_] return $wcs } } proc rotationSend { str img } { global powHeaderWcsKeyWord powWCSInfo powWCSToken powWCS set rotationRate 80 set i 0 while { 1 } { set currentStr [string range $str $i [expr $i + [expr $rotationRate - 1]]] incr i $rotationRate if { [string trim $currentStr] == "" } { if { $i > [string length $str] } break continue } ::powCmds::wcsHeader $img $rotationRate $currentStr continue } } proc getHeaderKeyWord { str img } { global powHeaderWcsKeyWord powWCSInfo powWCSToken powWCS if [info exists powHeaderWcsKeyWord($img,DEFAULT)] { foreach letter [list a b c d e f g h i j k l m n o p q r s t u v w x y z] { if [info exists powHeaderWcsKeyWord($img,$letter)] { unset powHeaderWcsKeyWord($img,$letter) } } if [info exists powHeaderWcsKeyWord($img,NONE)] { unset powHeaderWcsKeyWord($img,NONE) } if [info exists powHeaderWcsKeyWord($img,END)] { unset powHeaderWcsKeyWord($img,END) } if [info exists powHeaderWcsKeyWord($img,DEFAULT)] { unset powHeaderWcsKeyWord($img,DEFAULT) } unset powHeaderWcsKeyWord } set i 0 set numCard 0 set numCoord 0 set numCardInCoord 0 set powWCSToken($img) { DEFAULT } while { 1 } { set currentStr [string range $str $i [expr $i + 79]] incr i 80 if { [string trim $currentStr] == "" } { if { $i > [string length $str] } break continue } set currentStrToken [split $currentStr "="] set header [string trim [lindex $currentStrToken 0]] incr numCard if { [llength $currentStrToken] == 2 } { switch -regexp -- $header { {CTYPE[0-9][A-Z]?} - {CUNIT[0-9][A-Z]?} - {CRVAL[0-9][A-Z]?} - {CRPIX[0-9][A-Z]?} - {CD[0-9][_][0-9][A-Z]?} - {CDELT[0-9][A-Z]?} - {CROTA[0-9][A-Z]?} - {TTYPE[0-9][A-Z]?} - {TUNIT[0-9][A-Z]?} - {TCTYP[0-9][A-Z]?} - {TCUNI[0-9][A-Z]?} - {TCRVL[0-9][A-Z]?} - {TCRPX[0-9][A-Z]?} - {TCDLT[0-9][A-Z]?} - {TCD[0-9][A-Z]?} - {TCROT[0-9][A-Z]?} - {OFFSET[0-9][A-Z]?} { incr numCardInCoord set lastChar [string toupper [string range $header end end]] regsub {[A-Z]} $lastChar {} testChar if { $testChar == "" } { set headerLength [string length [lindex $currentStrToken 0]] set newHeader [string range $header 0 [expr [string length $header] - 2]] set newStr [format "%-${headerLength}s=%s" $newHeader \ [lindex $currentStrToken 1]] if { ![info exists powHeaderWcsKeyWord] || \ ![info exists powHeaderWcsKeyWord($img,$lastChar)] } { incr numCoord set powHeaderWcsKeyWord($img,$lastChar) $newStr set powWCSInfo($img,$lastChar) [getWcs $lastChar] lappend powWCSToken($img) $lastChar } else { set powHeaderWcsKeyWord($img,$lastChar) \ [format "%s%s" $powHeaderWcsKeyWord($img,$lastChar) $newStr] } } else { if { ![info exists powHeaderWcsKeyWord] || \ ![info exists powHeaderWcsKeyWord($img,DEFAULT)] } { incr numCoord set powHeaderWcsKeyWord($img,DEFAULT) $currentStr } else { set powHeaderWcsKeyWord($img,DEFAULT) \ [format "%s%s" $powHeaderWcsKeyWord($img,DEFAULT) $currentStr] } } } default { if { ![info exists powHeaderWcsKeyWord] || \ ![info exists powHeaderWcsKeyWord($img,NONE)] } { set powHeaderWcsKeyWord($img,NONE) $currentStr } else { set powHeaderWcsKeyWord($img,NONE) \ [format "%s%s" $powHeaderWcsKeyWord($img,NONE) $currentStr] } } } } else { switch -glob -- $header { "END*" { set powHeaderWcsKeyWord($img,END) $currentStr } default { if { ![info exists powHeaderWcsKeyWord] || \ ![info exists powHeaderWcsKeyWord($img,NONE)] } { set powHeaderWcsKeyWord($img,NONE) $currentStr } else { set powHeaderWcsKeyWord($img,NONE) \ [format "%s%s" $powHeaderWcsKeyWord($img,NONE) $currentStr] } } } } if { $i > [string length $str] } break } if { $numCoord > 0 } { set numCardPerCoord [expr $numCardInCoord / $numCoord] return [list $numCard $numCard] } else { return [list 0 $numCard] } } proc assembleWcsHeader { img {selection "DEFAULT"} } { global powHeaderWcsKeyWord # regular header if { $selection == "NOWCS" } { return [format "%s%s" $powHeaderWcsKeyWord($img,NONE) \ $powHeaderWcsKeyWord($img,END)] } else { return [format "%s%s%s" $powHeaderWcsKeyWord($img,NONE) \ $powHeaderWcsKeyWord($img,$selection) \ $powHeaderWcsKeyWord($img,END)] } } proc getKeyword {filehandle keyword} { # get $keyword # _isOpen $filehandle get keyword ^$keyword\$ } set helpMsg "Usage: POWplot ?-cmap code? ?-display client? ?fitsimage? code: 0 Chose the best colormap 1 Force to install private pseudo colormap 2 Force to use truecolor colormap (if don't have it will crash!) 3 Force to use screen default colormap client: XPA entry point of form IP_Address:portNumber, pointing to a remote POW session to which plot commands should be sent" global g_backupDir tcl_platform global powFitsHeaderCnt powFitsHeader global powHeaderWcsKeyWord powWCSInfo powWCSToken powWCS global powWCSName powWCSList powWCSLabel global filehandle if { $tcl_platform(platform) == "windows" } { set fvTmp "fv_tmp" } elseif { $tcl_platform(platform) == "macintosh" } { set fvTmp "fv_temp_folder" } else { set fvTmp ".fvtmp" } set g_backupDir $env(HOME)/$fvTmp if ![file exists $g_backupDir] { file mkdir $g_backupDir file attributes $g_backupDir -permissions 00775 } set ppFitsDataType(8) 0 set ppFitsDataType(16) 1 set ppFitsDataType(32) 2 set ppFitsDataType(-32) 3 set ppFitsDataType(-64) 4 set instPos [lsearch $argv "-cmap"] set colorCode 0 # if install colormap if { $instPos != -1} { if { [catch {set colorCode [lindex $argv [expr $instPos+1]]}] == 1} { puts $helpMsg exit } if { ($colorCode != 0) && ($colorCode != 1) && ($colorCode != 2) \ && ($colorCode != 3) } { puts $helpMsg exit } set argv [lreplace $argv $instPos [expr $instPos+1]] incr argc -2 } wm withdraw . update idletask set plotFlag [lsearch $argv "-plot"] if { $plotFlag >= 0 } { set argv [lreplace $argv $plotFlag $plotFlag] incr argc set plotFlag true } else { set plotFlag false } # # Load libraries # set POWLIB "$env(POW_LIBRARY)/.." set env(POW_HELPDIR) $env(POW_LIBRARY) package require Itcl package require Itk package require Iwidgets load [glob $POWLIB/libfitstcl.{s\[ol\]*,dylib}] load [glob $POWLIB/libpow.{s\[ol\]*,dylib}] # Look for client/server flag set instPos [lsearch $argv "-display"] if { $instPos != -1 } { set client [lindex $argv [expr $instPos+1]] set argv [lreplace $argv $instPos [expr $instPos+1]] incr argc -2 ::powCmds::remote $client } else { # None specified, so ask POW for default value set client [::powCmds::remote] } if ![info exists g_titleFont] { if { $tcl_platform(platform) == "windows" } { set isWin 1 set isMac 0 font create g_titleFont -family Arial -size -12 font create g_notebookTitleFont -family Arial -size -14 } elseif { $tcl_platform(platform) == "macintosh" } { set isWin 0 set isMac 1 font create g_titleFont -family system -size -12 font create g_notebookTitleFont -family system -size -14 } else { set isWin 0 set isMac 0 font create g_titleFont -family Helvetica -size -12 -weight bold font create g_notebookTitleFont -family Helvetica -size -14 -weight bold } font create g_entryFont -family Courier -size -12 set g_charPix [font measure g_entryFont m] } set globalBgColor #cccccc set globalFgColor black set activeBgColor #eeeeee set activeFgColor black set checkBBgColor #ff3366 option add *Background $globalBgColor option add *Foreground $globalFgColor option add *HighlightBackground $globalBgColor option add *activeForeground $activeFgColor option add *activeBackground $activeBgColor option add *selectForeground $activeFgColor option add *selectBackground $activeBgColor option add *selectColor $checkBBgColor ::powCmds::init 30 $colorCode if { $plotFlag == true } { if { $argc < 5 } { tk_messageBox -icon error -type ok \ -message "usage: POWplot -plot ??" exit } set filename [lindex $argv 0] set extension [lindex $argv 1] set xColumn_ [lindex $argv 2] set yColumn_ [lindex $argv 3] set range "" if { $argc == 7 } { set token [split [lindex $argv 6] "-"] if { $token != 2 } { tk_messageBox -icon error -type ok \ -message "Range specified in format:\n\nstart-end" exit } set range [lindex $argv 6] } regsub -all {[^a-zA-Z0-9.]} [file tail $filename] "_" gname set filehandle [fits open $filename 0] # find extension while (1) { set errorFlag [ catch { $filehandle move +1 } err ] if { $errorFlag } { break } else { set currentHDU [split [$filehandle get keyword EXTNAME] " "] set checkExt [string tolower [string trim [lindex $currentHDU 1] "{'}"]] if { $checkExt == [string tolower $extension] } { break } } } set wcsinfo [getWcs] if { [lindex $wcsinfo 4] != "none" } { set x_label [lindex [lindex $wcsinfo 3] 0] set y_label [lindex [lindex $wcsinfo 3] 1] } set x_unit "counts" set y_unit "counts" set _numRows [$filehandle info nrows] if { $range == "" } { set range [format "1-%s" $_numRows] } set graphName ${gname}_plot set curveName ${gname}_curve set result [$filehandle get header2str] set cntList($graphName) [getHeaderKeyWord [lindex $result 0] $graphName] set powFitsHeaderCnt($graphName) [lindex $cntList($graphName) 1] set powFitsHeaderCnt($curveName) [lindex $cntList($graphName) 1] set powWCSName($graphName) 0 set powWCSName(${graphName}scope) 0 set powWCSName($curveName) 0 set powWCSName(${curveName}scope) 0 if { [lindex $cntList($graphName) 0] > 0 } { set powFitsHeader($graphName) [lindex $result 0] set powFitsHeader($curveName) [lindex $result 0] } else { set powFitsHeader($graphName) "" set powFitsHeader($curveName) "" } set currentStr $powFitsHeader($graphName) ::powCmds::wcs $graphName $wcsinfo ::powCmds::wcsHeader $graphName 0 NONE start set idx 0 set headerLen [string length $currentStr] if { $idx + $headerLen <= 3000 } { ::powCmds::wcsHeader $graphName $headerLen $currentStr continue } else { rotationSend [lindex $result 0] $graphName } ::powCmds::wcsHeader $graphName 0 NONE done ::powCmds::wcsHeaderCnt $graphName $powFitsHeaderCnt($graphName) set currentStr $powFitsHeader($curveName) ::powCmds::wcs $curveName $wcsinfo ::powCmds::wcsHeader $curveName 0 NONE start set idx 0 set headerLen [string length $currentStr] if { $idx + $headerLen <= 3000 } { ::powCmds::wcsHeader $curveName $headerLen $currentStr continue } else { rotationSend [lindex $result 0] $curveName } ::powCmds::wcsHeader $curveName 0 NONE done ::powCmds::wcsHeaderCnt $curveName $powFitsHeaderCnt($curveName) if ![info exists powWCSList($graphName)] { set powWCSList($graphName) {} lappend powWCSList($graphName) 1 lappend powWCSList($graphName) DEFAULT } foreach name [lindex $powWCSList($graphName) 1] { # plot is against columns input set powWCSLabel(xlabel,$graphName,$name) $xColumn_ set powWCSLabel(ylabel,$graphName,$name) $yColumn_ assembleWcsLabel $filehandle $graphName "plot" $name ::powCmds::wcsLabel $graphName "xlabel" $name $powWCSLabel(xlabel,$graphName,$name) ::powCmds::wcsLabel $graphName "ylabel" $name $powWCSLabel(ylabel,$graphName,$name) ::powCmds::wcsLabel $graphName "xunit" $name $powWCSLabel(xunit,$graphName,$name) ::powCmds::wcsLabel $graphName "yunit" $name $powWCSLabel(yunit,$graphName,$name) ::powCmds::wcsLabel $graphName "zlabel" $name $powWCSLabel(zlabel,$graphName,$name) ::powCmds::wcsLabel $curveName "xlabel" $name $powWCSLabel(xlabel,$graphName,$name) ::powCmds::wcsLabel $curveName "ylabel" $name $powWCSLabel(ylabel,$graphName,$name) ::powCmds::wcsLabel $curveName "xunit" $name $powWCSLabel(xunit,$graphName,$name) ::powCmds::wcsLabel $curveName "yunit" $name $powWCSLabel(yunit,$graphName,$name) ::powCmds::wcsLabel $curveName "zlabel" $name $powWCSLabel(zlabel,$graphName,$name) } set x_unit $powWCSLabel(xunit,$graphName,DEFAULT) set y_unit $powWCSLabel(yunit,$graphName,DEFAULT) set powWCSList(${graphName}scope) $powWCSList($graphName) set powWCSList(${curveName}scope) $powWCSList($graphName) # value set wcsliststr "[lindex $powWCSList($graphName) 0]" foreach name [lindex $powWCSList($graphName) 1] { set wcsliststr [format "%s|%s" $wcsliststr $name] } ::powCmds::wcsSetList $graphName $wcsliststr ::powCmds::wcsSetList $curveName $wcsliststr set data [_getDataForAxis $filehandle "x" $xColumn_ $range] set xcol_data [ptr2lst [lindex $data 0] [lindex $data 1] [lindex $data 2]] set data [_getDataForAxis $filehandle "y" $yColumn_ $range] set ycol_data [ptr2lst [lindex $data 0] [lindex $data 1] [lindex $data 2]] #::powCmds::create data xdataName $xcol_data #::powCmds::create data ydataName $ycol_data set sendBlockSize 200 ::powCmds::create data xdataName NONE Start if { [llength $xcol_data] <= $sendBlockSize } { ::powCmds::create data xdataName $xcol_data continue } else { while { [llength $xcol_data] > 0 } { set currentBatch [lrange $xcol_data 0 [expr $sendBlockSize - 1]] set xcol_data [lreplace $xcol_data 0 [expr $sendBlockSize - 1]] ::powCmds::create data xdataName $currentBatch continue } } ::powCmds::create data xdataName NONE Done ::powCmds::create data ydataName NONE Start if { [llength $ycol_data] <= $sendBlockSize } { ::powCmds::create data ydataName $ycol_data continue } else { while { [llength $ycol_data] > 0 } { set currentBatch [lrange $ycol_data 0 [expr $sendBlockSize - 1]] set ycol_data [lreplace $ycol_data 0 [expr $sendBlockSize - 1]] ::powCmds::create data ydataName $currentBatch continue } } ::powCmds::create data ydataName NONE Done ::powCmds::create curve $curveName xdataName ydataName ::powCmds::create graph $graphName $curveName NULL ::powCmds::size 300 300 ::powCmds::graph -name $graphName \ xlabel $xColumn_ \ ylabel $yColumn_ \ xunits $x_unit \ yunits $y_unit ::powCmds::curve -name $curveName pDisp No lDisp Yes ::powCmds::select graph $graphName $filehandle close } else { foreach filename $argv { regsub -all {[^a-zA-Z0-9.]} [file tail $filename] "_" gname set filehandle [fits open $filename 0] set imghandle [$filehandle load image] set dims [$filehandle info imgdim] set n1 [lindex $dims 0] if { [llength $dims]==1 } { set n2 1 } else { set n2 [lindex $dims 1] } set data_type [lindex [lindex [$filehandle get keyword BITPIX] 0] 1] set data_type $ppFitsDataType($data_type) if { ([catch {$filehandle get keyword BZERO}] == 0) || ([catch {$filehandle get keyword BSCALE}] == 0) } { set data_type 4 } # powCreateData ${gname}_data $imghandle $data_type [expr $n1 * $n2] 0 set lstData [list $imghandle $data_type [list $n1 $n2] ] ::powCmds::array $lstData ${gname}_data PTR $tcl_platform(byteOrder) # Try to get WCS (or scaling) information set x0 1 set y0 1 set xinc 1 set yinc 1 set x_label "" set y_label "" set x_unit "pixels" set y_unit "pixels" set z_unit "counts" set wcsinfo [getWcs] if { [lindex $wcsinfo 4] != "none" } { set x_label [lindex [lindex $wcsinfo 3] 0] set y_label [lindex [lindex $wcsinfo 3] 1] set x_unit "deg" set y_unit "deg" } set result [$filehandle get header2str] set cntList(${gname}_img) [getHeaderKeyWord [lindex $result 0] ${gname}_img] set powFitsHeaderCnt(${gname}_img) [lindex $cntList(${gname}_img) 1] set graphName ${gname}_img set powWCSName($graphName) 0 set powWCSName(${graphName}scope) 0 if { [lindex $cntList($graphName) 0] > 0 } { set powFitsHeader($graphName) [lindex $result 0] } else { set powFitsHeader($graphName) "" } set currentStr $powFitsHeader($graphName) ::powCmds::wcs $graphName $wcsinfo ::powCmds::wcsHeader $graphName 0 NONE start set idx 0 set headerLen [string length $currentStr] if { $idx + $headerLen <= 3000 } { ::powCmds::wcsHeader $graphName $headerLen $currentStr continue } else { rotationSend [lindex $result 0] $graphName } ::powCmds::wcsHeader $graphName 0 NONE done ::powCmds::wcsHeaderCnt $graphName $powFitsHeaderCnt($graphName) ::powCmds::create image $graphName \ ${gname}_data $n1 $n2 if [info exists powWCSList($graphName)] { foreach name [lindex $powWCSList($graphName) 1] { assembleWcsLabel $filehandle $graphName "image" $name if { $name == " " } { set name "DEFAULT" } ::powCmds::wcsLabel $graphName "xlabel" $name $powWCSLabel(xlabel,$graphName,$name) ::powCmds::wcsLabel $graphName "ylabel" $name $powWCSLabel(ylabel,$graphName,$name) ::powCmds::wcsLabel $graphName "xunit" $name $powWCSLabel(xunit,$graphName,$name) ::powCmds::wcsLabel $graphName "yunit" $name $powWCSLabel(yunit,$graphName,$name) ::powCmds::wcsLabel $graphName "zlabel" $name $powWCSLabel(zlabel,$graphName,$name) } } else { set powWCSList($graphName) {} lappend powWCSList($graphName) 1 lappend powWCSList($graphName) {DEFAULT} } set powWCSList(${graphName}scope) $powWCSList($graphName) # value set wcsliststr "[lindex $powWCSList($graphName) 0]" foreach name [lindex $powWCSList($graphName) 1] { set wcsliststr [format "%s|%s" $wcsliststr $name] } ::powCmds::wcsSetList $graphName $wcsliststr ::powCmds::graph -name $graphName \ xlabel $x_label \ ylabel $y_label \ xunits $x_unit \ yunits $y_unit ::powCmds::create graph $graphName NULL $graphName $filehandle close } } bind . <> { exit } if { $client != "" } { exit } fv5.4/tcltk/pow/PowCanvCurve.c0000644000220700001010000021674612076355402015704 0ustar birbylheadev/* * powCanvCurve.c -- derived from * tkCanvLine.c -- * * This file implements powCurve items for canvas widgets. * * Copyright (c) 1991-1994 The Regents of the University of California. * Copyright (c) 1994-1995 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ #include "tkInt.h" #include "tkPort.h" #include "tkCanvas.h" #include "pow.h" void outDebugStr(char *title, char *str); /* * Information used for parsing configuration specs. If you change any * of the default strings, be sure to change the corresponding default * values in CreatePowCurve. */ static Tk_CustomOption stateOption = { (Tk_OptionParseProc *) TkStateParseProc, TkStatePrintProc, (ClientData) 2 }; static Tk_CustomOption tagsOption = { (Tk_OptionParseProc *) Tk_CanvasTagsParseProc, Tk_CanvasTagsPrintProc, (ClientData) NULL }; static Tk_CustomOption dashOption = { (Tk_OptionParseProc *) TkCanvasDashParseProc, TkCanvasDashPrintProc, (ClientData) NULL }; static Tk_CustomOption offsetOption = { (Tk_OptionParseProc *) TkOffsetParseProc, TkOffsetPrintProc, (ClientData) (TK_OFFSET_RELATIVE|TK_OFFSET_INDEX) }; static Tk_CustomOption pixelOption = { (Tk_OptionParseProc *) TkPixelParseProc, TkPixelPrintProc, (ClientData) NULL }; static Tk_ConfigSpec configSpecs[] = { {TK_CONFIG_CUSTOM, "-activedash", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(PowCurveItem, lOutline.activeDash), TK_CONFIG_NULL_OK, &dashOption}, {TK_CONFIG_COLOR, "-activefill", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(PowCurveItem, lOutline.activeColor), TK_CONFIG_NULL_OK}, {TK_CONFIG_BITMAP, "-activestipple", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(PowCurveItem, lOutline.activeStipple), TK_CONFIG_NULL_OK}, {TK_CONFIG_CUSTOM, "-activewidth", (char *) NULL, (char *) NULL, "0.0", Tk_Offset(PowCurveItem, lOutline.activeWidth), TK_CONFIG_DONT_SET_DEFAULT, &pixelOption}, {TK_CONFIG_CAP_STYLE, "-capstyle", (char *) NULL, (char *) NULL, "butt", Tk_Offset(PowCurveItem, capStyle), TK_CONFIG_DONT_SET_DEFAULT}, {TK_CONFIG_STRING, "-pointtype", (char *) NULL, (char *) NULL, "Cross", Tk_Offset(PowCurveItem, pointType), 0}, {TK_CONFIG_PIXELS, "-pointsize", (char *) NULL, (char *) NULL, "3", Tk_Offset(PowCurveItem, pointSize), 0}, {TK_CONFIG_BOOLEAN, "-pointdisplay", (char *) NULL, (char *) NULL, "1", Tk_Offset(PowCurveItem, pointDisp), 0}, {TK_CONFIG_BOOLEAN, "-pointfill", (char *) NULL, (char *) NULL, "0", Tk_Offset(PowCurveItem, pointFill), 0}, {TK_CONFIG_BOOLEAN, "-pointerror", (char *) NULL, (char *) NULL, "0", Tk_Offset(PowCurveItem, pointError), 0}, {TK_CONFIG_BOOLEAN, "-linedisplay", (char *) NULL, (char *) NULL, "0", Tk_Offset(PowCurveItem, lineDisp), 0}, {TK_CONFIG_BOOLEAN, "-stairstep", (char *) NULL, (char *) NULL, "0", Tk_Offset(PowCurveItem, stairStep), 0}, {TK_CONFIG_BOOLEAN, "-boxfill", (char *) NULL, (char *) NULL, "0", Tk_Offset(PowCurveItem, boxFill), 0}, {TK_CONFIG_BOOLEAN, "-curvetopoint", (char *) NULL, (char *) NULL, "0", Tk_Offset(PowCurveItem, curveToPoint), 0}, {TK_CONFIG_BOOLEAN, "-hidden", (char *) NULL, (char *) NULL, "0", Tk_Offset(PowCurveItem, hidden), 0}, {TK_CONFIG_COLOR, "-lfill", (char *) NULL, (char *) NULL, "Black", Tk_Offset(PowCurveItem, lOutline.color), TK_CONFIG_NULL_OK}, {TK_CONFIG_COLOR, "-pfill", (char *) NULL, (char *) NULL, "Black", Tk_Offset(PowCurveItem, pOutline.color), TK_CONFIG_NULL_OK}, {TK_CONFIG_BOOLEAN, "-logx", (char *) NULL, (char *) NULL, "0", Tk_Offset(PowCurveItem, logX), 0}, {TK_CONFIG_BOOLEAN, "-logy", (char *) NULL, (char *) NULL, "0", Tk_Offset(PowCurveItem, logY), 0}, {TK_CONFIG_INT, "-LOD", (char *) NULL, (char *) NULL, "0", Tk_Offset(PowCurveItem, LOD), 0}, {TK_CONFIG_CUSTOM, "-dash", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(PowCurveItem, lOutline.dash), TK_CONFIG_NULL_OK, &dashOption}, {TK_CONFIG_PIXELS, "-dashoffset", (char *) NULL, (char *) NULL, "0", Tk_Offset(PowCurveItem, lOutline.offset), TK_CONFIG_DONT_SET_DEFAULT}, {TK_CONFIG_CUSTOM, "-disableddash", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(PowCurveItem, lOutline.disabledDash), TK_CONFIG_NULL_OK, &dashOption}, {TK_CONFIG_COLOR, "-disabledfill", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(PowCurveItem, lOutline.disabledColor), TK_CONFIG_NULL_OK}, {TK_CONFIG_BITMAP, "-disabledstipple", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(PowCurveItem, lOutline.disabledStipple), TK_CONFIG_NULL_OK}, {TK_CONFIG_CUSTOM, "-disabledwidth", (char *) NULL, (char *) NULL, "0.0", Tk_Offset(PowCurveItem, lOutline.disabledWidth), TK_CONFIG_DONT_SET_DEFAULT, &pixelOption}, {TK_CONFIG_JOIN_STYLE, "-joinstyle", (char *) NULL, (char *) NULL, "round", Tk_Offset(PowCurveItem, joinStyle), TK_CONFIG_DONT_SET_DEFAULT}, {TK_CONFIG_CUSTOM, "-offset", (char *) NULL, (char *) NULL, "0,0", Tk_Offset(PowCurveItem, lOutline.tsoffset), TK_CONFIG_DONT_SET_DEFAULT, &offsetOption}, {TK_CONFIG_CUSTOM, "-state", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(Tk_Item, state), TK_CONFIG_NULL_OK, &stateOption}, {TK_CONFIG_BITMAP, "-stipple", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(PowCurveItem, lOutline.stipple), TK_CONFIG_NULL_OK}, {TK_CONFIG_CUSTOM, "-tags", (char *) NULL, (char *) NULL, (char *) NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, {TK_CONFIG_CUSTOM, "-width", (char *) NULL, (char *) NULL, "1.0", Tk_Offset(PowCurveItem, lOutline.width), TK_CONFIG_DONT_SET_DEFAULT, &pixelOption}, {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL, (char *) NULL, 0, 0} }; /* * The structures below defines the powCurve item type by means * of procedures that can be invoked by generic item code. */ Tk_ItemType tkPowCurveType = { "powCurve", /* name */ sizeof(PowCurveItem), /* itemSize */ CreatePowCurve, /* createProc */ configSpecs, /* configSpecs */ ConfigurePowCurve, /* configureProc */ PowCurveCoords, /* coordProc */ DeletePowCurve, /* deleteProc */ DisplayPowCurve, /* displayProc */ TK_CONFIG_OBJS, /* flags */ PowCurveToPoint, /* pointProc */ PowCurveToArea, /* areaProc */ PowCurveToPostscript, /* postscriptProc */ ScalePowCurve, /* scaleProc */ TranslatePowCurve, /* translateProc */ GetPowCurveIndex, /* indexProc */ (Tk_ItemCursorProc *) NULL, /* icursorProc */ (Tk_ItemSelectionProc *) NULL, /* selectionProc */ PowCurveInsert, /* insertProc */ PowCurveDeleteCoords, /* dTextProc */ (Tk_ItemType *) NULL /* nextPtr */ }; /* *-------------------------------------------------------------- * * CreatePowCurve -- * * This procedure is invoked to create a new powCurve item in * a canvas. * * Results: * A standard Tcl return value. If an error occurred in * creating the item, then an error message is left in * the interp's result; in this case itemPtr is left uninitialized, * so it can be safely freed by the caller. * * Side effects: * A new powCurve item is created. * *-------------------------------------------------------------- */ int CreatePowCurve(interp, canvas, itemPtr, objc, objv) Tcl_Interp *interp; /* Interpreter for error reporting. */ Tk_Canvas canvas; /* Canvas to hold new item. */ Tk_Item *itemPtr; /* Record to hold new item; header * has been initialized by caller. */ int objc; /* Number of arguments in objv. */ Tcl_Obj *CONST objv[]; /* Arguments describing powCurve. */ { PowCurveItem *powCurvePtr = (PowCurveItem *) itemPtr; char *crv, *grph; /* * Carry out initialization that is needed to set defaults and to * allow proper cleanup after errors during the the remainder of * this procedure. */ Tk_CreateOutline(&(powCurvePtr->lOutline)); Tk_CreateOutline(&(powCurvePtr->pOutline)); powCurvePtr->canvas = canvas; powCurvePtr->pointType = NULL; powCurvePtr->curveToPoint = 0; powCurvePtr->capStyle = CapButt; powCurvePtr->joinStyle = JoinRound; if (objc < 2) { Tcl_SetResult(interp, "Usage: canvas create powCurve curve_name graph_name ?options?", TCL_STATIC); goto error; } crv = Tcl_GetStringFromObj( objv[0], NULL ); grph = Tcl_GetStringFromObj( objv[1], NULL ); if( (powCurvePtr->curveObjectPtr = PowFindCurve(crv)) == NULL ) { Tcl_SetResult(interp,"Couldn't find curve: ", TCL_STATIC ); Tcl_AppendResult(interp,crv,(char*)NULL); goto error; } if( (powCurvePtr->graphObjectPtr = PowFindGraph(grph)) == NULL ) { Tcl_SetResult(interp,"Couldn't find graph: ", TCL_STATIC ); Tcl_AppendResult(interp,grph,(char*)NULL); goto error; } powCurvePtr->pCoordPtr = NULL; powCurvePtr->lCoordPtr = NULL; if (ConfigurePowCurve(interp, canvas, itemPtr, objc-2, objv+2, 0) != TCL_OK) { goto error; } if (PowCurveCoords(interp, canvas, itemPtr, objc, objv) == TCL_OK) { return TCL_OK; } error: DeletePowCurve(canvas, itemPtr, Tk_Display(Tk_CanvasTkwin(canvas))); return TCL_ERROR; } /* *-------------------------------------------------------------- * * PowCurveCoords -- * * This procedure is invoked to process the "coords" widget * command on powCurves. See the user documentation for details * on what it does. * * Results: * Returns TCL_OK or TCL_ERROR, and sets the interp's result. * * Side effects: * The coordinates for the given item may be changed. * *-------------------------------------------------------------- */ int PowCurveCoords(interp, canvas, itemPtr, objc, objv) /* This routine calculates a list of canvas coordinates for * the points in the PowCurve object, these are then used to * display/scale/etc the item. */ Tcl_Interp *interp; /* Used for error reporting. */ Tk_Canvas canvas; /* Canvas containing item. */ Tk_Item *itemPtr; /* Item whose coordinates are to be * read or modified. */ int objc; /* Number of coordinates supplied in * argv. */ Tcl_Obj *CONST objv[]; /* Array of coordinates: x1, y1, * x2, y2, ... */ { PowCurveItem *powCurvePtr = (PowCurveItem *) itemPtr; double *pCoordPtr, *lCoordPtr; /*From the old PowProcessCurve command */ char **bboxptr; double x0 , x1, y0, y1; double rx0 , rx1, ry0, ry1, ry, rx; int n, xoff, yoff, xeoff, yeoff; PowCurve *curve_ptr; PowVector *x_vector, *y_vector, *x_error, *y_error, *z_vector; PowData *x_vect, *y_vect, *x_err, *y_err, *z_vect; PowGraph *graph; double xmagstep, ymagstep, oldx, oldy, modx, mody; double x,y,xe[5],ye[5],xp,yp,histX,histY,pX[12],pY[12]; int len; char *idxStr; const char *graphType; int zoomed; int xCount, yCount; int coordSel; double WCScdeltX, WCScdeltY; double p1; double q1; int nPts; int dflag=0,pflag=0,lflag=0,eflag,pType=0,pSize=0,logX=0,logY=0; int lasti; char *graphName; char *tagstring; Tcl_FreeProc *freeProcPtr; int pts_per_pt, allocPts, usedPts; int i,seg; int LOD=0; double nsum, rx_LOD, rxsum, rysum, rx2sum, ry2sum, sigmax, sigmay; double LODthresh=0.0, rxm, rym; int LOD_summing, LOD_summed=0; char xstring[30]=""; char ystring[30]=""; static struct { char *Name; int nLines; struct { double x, y; } lines[16]; } pointShapes[] = { { "Cross", 5, { /* These 99s should be DBL_MAX, but */ /* Borland C++ (Windoze) complains */ { 1, 0}, {-1, 0}, {99.0, 99.0}, { 0, 1}, { 0, -1} } }, { "Diamond", 5, { { 1, 0}, { 0, 1}, {-1, 0}, { 0, -1}, { 1, 0} } }, { "Box", 5, { { 1, 1}, {-1, 1}, {-1, -1}, { 1, -1}, { 1, 1} } }, { "Octagon", 9, { { 1.000, 0.000}, { 0.707, 0.707}, { 0.000, 1.000}, {-0.707, 0.707}, {-1.000, 0.000}, {-0.707, -0.707}, { 0.000, -1.000}, { 0.707, -0.707}, { 1.000, 0.000} } }, { "Triangle", 4, { { 1, 1}, { 0, -1}, {-1, 1}, { 1, 1}, } }, { "Inv. Triangle", 4, { { 1, -1}, { 0, 1}, {-1, -1}, { 1, -1}, } }, { "Dot", 1, { { 0.0, 0.0} } }, { "", 0 } }; /* objc should be 0*/ lasti = 0; x_vect = NULL; y_vect = NULL; z_vect = NULL; x_err = NULL; y_err = NULL; x_vector = NULL; y_vector = NULL; x_error = NULL; y_error = NULL; z_vector = NULL; tagstring = Tk_CanvasTagsPrintProc((ClientData) NULL, Tk_CanvasTkwin(canvas), (char *)itemPtr, 0, &freeProcPtr); curve_ptr = powCurvePtr->curveObjectPtr; if ((curve_ptr->x_vector)!= NULL ) { x_vect = (curve_ptr->x_vector)->dataptr; x_vector = curve_ptr->x_vector; } if ((curve_ptr->x_error)!= NULL) { x_err = (curve_ptr->x_error)->dataptr; x_error = curve_ptr->x_error; } if ((curve_ptr->y_vector)!= NULL){ y_vect = (curve_ptr->y_vector)->dataptr; y_vector = curve_ptr->y_vector; } if ((curve_ptr->y_error)!= NULL) { y_err = (curve_ptr->y_error)->dataptr; y_error = curve_ptr->y_error; } if ((curve_ptr->z_vector)!= NULL){ z_vect = (curve_ptr->z_vector)->dataptr; z_vector = curve_ptr->z_vector; } xoff = 0; yoff = 0; xeoff = 0; yeoff = 0; if (x_vector != NULL) xoff = x_vector->offset; if (y_vector != NULL) yoff = y_vector->offset; if (x_error != NULL) xeoff = x_error->offset; if (y_error != NULL) yeoff = y_error->offset; /* get the canvas coordinates for the axes box */ Tcl_VarEval( interp, Tk_PathName(Tk_CanvasTkwin(canvas)), " coords ", powCurvePtr->graphObjectPtr->graph_name,"box", (char *) NULL); Tcl_SplitList(interp,Tcl_GetStringResult(interp),&n,&bboxptr); /* (x0,y0) -- lower left */ /* (x1,y1) -- upper right */ Tcl_GetDouble(interp,bboxptr[0],&x0); Tcl_GetDouble(interp,bboxptr[3],&y0); Tcl_GetDouble(interp,bboxptr[2],&x1); Tcl_GetDouble(interp,bboxptr[1],&y1); len = strlen(powCurvePtr->graphObjectPtr->graph_name)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "graphType", powCurvePtr->graphObjectPtr->graph_name); graphType = Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY); ckfree(idxStr); len = strlen(powCurvePtr->graphObjectPtr->graph_name)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "zoomed", powCurvePtr->graphObjectPtr->graph_name); zoomed = atoi(Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY)); ckfree(idxStr); xCount = atoi(Tcl_GetVar2(interp,"xCount",powCurvePtr->graphObjectPtr->graph_name,TCL_GLOBAL_ONLY)); yCount = atoi(Tcl_GetVar2(interp,"yCount",powCurvePtr->graphObjectPtr->graph_name,TCL_GLOBAL_ONLY)); graph = powCurvePtr->graphObjectPtr; graphName = powCurvePtr->graphObjectPtr->graph_name; strcpy(curve_ptr->WCS.graphName, graphName); coordSel = atoi(Tcl_GetVar2(interp,"powWCSName",graphName,TCL_GLOBAL_ONLY)); /* Chai 06/29/2007: We are not actually fliping the coordinates on the canvas. If tk allows this, then there is no need to do the following. What the logic below is to trick pow to think that the point on the canvas has been flipped. The xCount and yCount indicate if the graph has been flipped before. So if X has been previously flipped, the next flipping occurs on Y, the logic inside ..Count % 2 will make sure the information on previous flip still exists. */ /* Chai 06/29/2007: At this point, graph already know if it has been flipped. xleft/xright ybot/ytop value(s) has already been swapped and x0, y0, x1, y1 have all been taken care of. */ rx0 = graph->xleft; ry0 = graph->ybot; rx1 = graph->xright; ry1 = graph->ytop; ckfree((void *)bboxptr); xmagstep = graph->xmagstep; ymagstep = graph->ymagstep; logX = powCurvePtr->logX; logY = powCurvePtr->logY; LOD = powCurvePtr->LOD; lflag = powCurvePtr->lineDisp; pflag = powCurvePtr->pointDisp; eflag = (x_err || y_err); /* Identify the point shape, if points plotted */ pType = 0; if( pflag ) { while( pointShapes[pType].Name[0] ) { if (!strcmp(powCurvePtr->pointType,pointShapes[pType].Name)) break; pType++; } if( !pointShapes[pType].Name[0] ) pType = 0; pSize = powCurvePtr->pointSize; if( powCurvePtr->pointError && eflag ) { eflag = pSize = 0; /* Don't draw errorbars... just the points */ } } /* Allocate enough space to hold every point although some may not be visible on the graph */ if( pflag || eflag || LOD) { pts_per_pt = 0; if( pflag ) pts_per_pt += pointShapes[pType].nLines + 1; if( eflag || LOD) { if( graph->WCS.type[0] ) pts_per_pt += 8; else pts_per_pt += 6; } allocPts = curve_ptr->length * pts_per_pt * 2; pCoordPtr = (double *) ckalloc(sizeof(double) * allocPts); if( !pCoordPtr ) { Tcl_SetResult(interp, "Unable to allocate memory for curve", TCL_VOLATILE); return TCL_ERROR; } } else { pCoordPtr = (double *) NULL; } powCurvePtr->pCoordPtr = pCoordPtr; /* Be more conservative in allocating memory for line coords. */ /* Can range from 0 to 2 x/y pairs/pt, depending on clipping frequency. */ /* Assume an average of 1.5 pairs per point, then realloc as needed. */ /* Another factor of 2 will enter if drawing stair step style (histo). */ if( lflag ) { allocPts = curve_ptr->length * 3 + 30; if( powCurvePtr->stairStep ) { allocPts += allocPts; if( powCurvePtr->boxFill ) allocPts += allocPts; } lCoordPtr = (double *) ckalloc(sizeof(double) * allocPts); if( !lCoordPtr ) { Tcl_SetResult(interp, "Unable to allocate memory for curve", TCL_VOLATILE); return TCL_ERROR; } } else { lCoordPtr = NULL; } powCurvePtr->lCoordPtr = lCoordPtr; /*Keep track of wether we're really doing LOD summing during any given */ /*iteration so we can ignore LOD processing if we aren't */ LOD_summing = 0; /*This should make sure the first point always gets plotted */ rx_LOD = DBL_MAX; nsum = rxsum = rx2sum = rysum = ry2sum = 0; dflag = 0; oldx = oldy = pX[0] = pY[0] = DBL_MAX; /* if Level of Detail averaging is chosen, set the threshold for binning */ if (LOD) { LODthresh = fabs(rx1 - rx0)/ (double) LOD; } if ( graph->WCS.type[0] != '\0' && strcmp(graphType, "binary") == 0 && (xCount % 2 != 0 || yCount % 2 != 0) ) { curve_ptr->WCS.haveWCSinfo = 0; graph->WCS.haveWCSinfo = 0; } for (i=0;ilength;i++) { if (x_vect != NULL) { rx = PowExtractDatum(x_vect,i+xoff); } else rx = i + 1; if (y_vect != NULL) { ry = PowExtractDatum(y_vect,i+yoff); } else ry = i + 1; if (LOD) { if (rx < rx0 || rx > rx1 || ry < ry0 || ry > ry1 /*ignore points off graph*/) { /* LOD may be accumulating, but this point is NULL or off the graph */ /* so don't do anything with it*/ continue; } if (fabs(rx - rx_LOD) < LODthresh) { /* we haven't reached the edge of the LOD bin yet, keep acumulating */ rxsum += rx; rysum += ry; rx2sum += rx*rx; ry2sum += ry*ry; nsum++; LOD_summing = 1; LOD_summed = 0; continue; } else if (LOD_summing) { /* we've reached current LOD, calculate mean value and continue */ rxsum += rx; rysum += ry; rx2sum += rx*rx; ry2sum += ry*ry; nsum++; rx_LOD = rx; rxm = rxsum/nsum; rym = rysum/nsum; sigmax = sqrt(rx2sum/nsum - rxm*rxm); sigmay = sqrt(ry2sum/nsum - rym*rym); rxsum = 0; rx2sum = 0; rysum = 0; ry2sum = 0; nsum = 0; rx = rxm; ry = rym; LOD_summing = 0; LOD_summed = 1; } else { /* just a normal point and we haven't done any LOD. Reset "mark" */ /* for LOD averaging */ rx_LOD = rx; LOD_summed = 0; } } if( logX && rx<=0.0 ) rx = DBL_MAX; if( logY && ry<=0.0 ) ry = DBL_MAX; if( rx==DBL_MAX || ry==DBL_MAX ) { x = y = DBL_MAX; } else { /* Shouldn't need to do this if( curve_ptr->WCS.type[0] ) { rx--; ry--; } */ if ( graph->WCS.type[0] != '\0' && strcmp(graphType, "binary") == 0 && (xCount % 2 != 0 || yCount % 2 != 0) ) { if (xCount % 2 != 0) { WCScdeltX = graph->WCS.wcs[coordSel].cdelt[0]; graph->WCS.wcs[coordSel].cdelt[0] *= -1.0f; } if ( yCount % 2 != 0) { WCScdeltY = graph->WCS.wcs[coordSel].cdelt[1]; graph->WCS.wcs[coordSel].cdelt[1] *= -1.0f; } } if( PowPixToPos( (logX ? log10(rx): rx), (logY ? log10(ry): ry), &curve_ptr->WCS, &x, &y) != TCL_OK ) return TCL_ERROR; if( PowPosToPix( x, y, &graph->WCS, &x, &y) != TCL_OK ) return TCL_ERROR; if ( graph->WCS.type[0] != '\0' && strcmp(graphType, "binary") == 0 && (xCount % 2 != 0 || yCount % 2 != 0) ) { if (xCount % 2 != 0) { graph->WCS.wcs[coordSel].cdelt[0] = WCScdeltX; } if ( yCount % 2 != 0) { graph->WCS.wcs[coordSel].cdelt[1] = WCScdeltY; } } if ( graph->WCS.type[0] == '\0' && strcmp(graphType, "binary") == 0 && xCount % 2 != 0 ) { /* at this point, in graph and curve WCS, the right x is the original left x. */ x = x0 + (-1.0 * x) * xmagstep; } else { x = x0 + x * xmagstep; } if ( graph->WCS.type[0] == '\0' && strcmp(graphType, "binary") == 0 && yCount % 2 != 0 ) { y = y0 - (-1.0 * y) * ymagstep; } else { y = y0 - y * ymagstep; } } /***************************************************************/ /* If we have string data for "z" create the canvas text */ /***************************************************************/ if (z_vect != NULL && z_vect->data_type == STRING_DATA && (x >= x0 && x <= x1) && (y <= y0 && y >= y1) ) { sprintf(xstring," %lf ",x); sprintf(ystring," %lf ",y); Tcl_VarEval( interp, Tk_PathName(Tk_CanvasTkwin(canvas)), " create text ",xstring,ystring," -text ", ((char **)(z_vect->data_array))[i], " -tags {",tagstring,"}", (char *) NULL); } /*************************************************************/ /* DRAW THE POINT AND ERRORBARS FOR THIS POINT */ /*************************************************************/ if (pflag && (x >= x0 && x <= x1) && (y <= y0 && y >= y1) ) { /* Load xe/ye[0] with real error value... fill in [1-4] with vector offset in each of 4 directions */ if( x_err || y_err || LOD_summed) { if (x_err != NULL) { *xe = PowExtractDatum(x_err,i+xeoff); } else { *xe = 0.0; } if (LOD_summed) { *xe = sigmax; } if (y_err != NULL) { *ye = PowExtractDatum(y_err,i+yeoff); } else { *ye = 0.0; } if (LOD_summed) { *ye = sigmay; } if( *xe || *ye ) { if( graph->WCS.type[0] ) { /* In non rectilinear coordinates... must do all 4 sides */ PowPixToPos( rx+xe[0], ry , &curve_ptr->WCS, xe+1, ye+1 ); PowPixToPos( rx , ry+ye[0], &curve_ptr->WCS, xe+2, ye+2 ); PowPixToPos( rx-xe[0], ry , &curve_ptr->WCS, xe+3, ye+3 ); PowPixToPos( rx , ry-ye[0], &curve_ptr->WCS, xe+4, ye+4 ); for( seg=1; seg<5; seg++ ) { PowPosToPix(xe[seg], ye[seg], &graph->WCS, xe+seg, ye+seg ); xe[seg] = x0 + xe[seg] * xmagstep - x; ye[seg] = y0 - ye[seg] * ymagstep - y; } } else if( logX || logY ) { #define LOG10(x) ( (x)>0.0 ? log10(x) : -300 ) PowPixToPos( (logX ? LOG10(rx+xe[0]): rx+xe[0]), (logY ? LOG10(ry+ye[0]): ry+ye[0]), &curve_ptr->WCS, xe+1, ye+2 ); PowPixToPos( (logX ? LOG10(rx-xe[0]): rx-xe[0]), (logY ? LOG10(ry-ye[0]): ry-ye[0]), &curve_ptr->WCS, xe+3, ye+4 ); PowPosToPix(xe[1], ye[2], &graph->WCS, xe+1, ye+2 ); PowPosToPix(xe[3], ye[4], &graph->WCS, xe+3, ye+4 ); xe[1] = x0 + xe[1] * xmagstep - x; ye[2] = y0 - ye[2] * ymagstep - y; xe[3] = x0 + xe[3] * xmagstep - x; ye[4] = y0 - ye[4] * ymagstep - y; ye[1] = xe[2] = ye[3] = xe[4] = 0.0; } else { /* In rectilinear coords... do one corner and copy */ PowPixToPos( rx+xe[0], ry+ye[0], &curve_ptr->WCS, xe+1, ye+1 ); PowPosToPix( xe[1], ye[1], &graph->WCS, xe+1, ye+1 ); xe[3] = - (xe[1] = x0 + xe[1] * xmagstep - x); ye[4] = - (ye[2] = y0 - ye[1] * ymagstep - y); ye[1] = xe[2] = ye[3] = xe[4] = 0.0; } } } #define CLIP(x,min,max) ( (x)<(min) ? (min) : ( (x)>(max) ? (max) : (x) ) ) if( eflag || LOD_summed ) { /* Draw error bars */ if( graph->WCS.type[0] ) { if( *xe ) { *(pCoordPtr++) = CLIP(x + xe[1],x0,x1); *(pCoordPtr++) = CLIP(y + ye[1],y1,y0); *(pCoordPtr++) = x; *(pCoordPtr++) = y; *(pCoordPtr++) = CLIP(x + xe[3],x0,x1); *(pCoordPtr++) = CLIP(y + ye[3],y1,y0); *(pCoordPtr++) = DBL_MAX; *(pCoordPtr++) = DBL_MAX; } if( *ye ) { *(pCoordPtr++) = CLIP(x + xe[2],x0,x1); *(pCoordPtr++) = CLIP(y + ye[2],y1,y0); *(pCoordPtr++) = x; *(pCoordPtr++) = y; *(pCoordPtr++) = CLIP(x + xe[4],x0,x1); *(pCoordPtr++) = CLIP(y + ye[4],y1,y0); *(pCoordPtr++) = DBL_MAX; *(pCoordPtr++) = DBL_MAX; } } else { if( *xe ) { *(pCoordPtr++) = CLIP(x + xe[1],x0,x1); *(pCoordPtr++) = y; *(pCoordPtr++) = CLIP(x + xe[3],x0,x1); *(pCoordPtr++) = y; *(pCoordPtr++) = DBL_MAX; *(pCoordPtr++) = DBL_MAX; } if( *ye ) { *(pCoordPtr++) = x; *(pCoordPtr++) = CLIP(y + ye[2],y1,y0); *(pCoordPtr++) = x; *(pCoordPtr++) = CLIP(y + ye[4],y1,y0); *(pCoordPtr++) = DBL_MAX; *(pCoordPtr++) = DBL_MAX; } } } /* Draw the shape */ if( powCurvePtr->pointError && pSize==0 ) { xp = 0.5*(xe[1]-xe[3]); yp = 0.5*(ye[2]-ye[4]); } else { xp = yp = pSize; } for( seg=0; seg< pointShapes[pType].nLines; seg++ ) { if( pointShapes[pType].lines[seg].x==99.0 ) { *(pCoordPtr++) = DBL_MAX; *(pCoordPtr++) = DBL_MAX; } else { p1 = x + xp * pointShapes[pType].lines[seg].x; q1 = y + yp * pointShapes[pType].lines[seg].y; *(pCoordPtr++) = CLIP(p1,x0,x1); *(pCoordPtr++) = CLIP(q1,y1,y0); } } *(pCoordPtr++) = DBL_MAX; *(pCoordPtr++) = DBL_MAX; } /*************************************************************/ /* DRAW THE LINE AND ERRORBARS FOR THIS POINT */ /*************************************************************/ if( lflag ) { /* Check lCoordPtr length */ usedPts = (lCoordPtr - powCurvePtr->lCoordPtr); if( allocPts - usedPts < 30 ) { printf( "Must realloc lCoordPtr: used=%d alloc=%d\n", usedPts, allocPts ); allocPts += (curve_ptr->length>>2) + 30; lCoordPtr = (double *)ckrealloc( (char*)powCurvePtr->lCoordPtr, sizeof(double) * allocPts ); if( lCoordPtr ) { powCurvePtr->lCoordPtr = lCoordPtr; lCoordPtr += usedPts; } else { /* Memory error!!! */ printf("Couldn't allocate enough memory for PowCurve coords\n"); ckfree( (char*)powCurvePtr->lCoordPtr ); powCurvePtr->lCoordPtr = NULL; powCurvePtr->numLines = 0; return TCL_ERROR; } } if( powCurvePtr->stairStep ) { if( powCurvePtr->boxFill ) { if( pX[0]==DBL_MAX || pY[0]==DBL_MAX ) { nPts = 0; /* Setup to draw inital box on next pass */ PowPixToPos( 0.0, 0.0, &curve_ptr->WCS, pX+1, pY+1 ); PowPosToPix( pX[1], pY[1], &graph->WCS, pX+1, &histY ); histY = y0 - histY * ymagstep; if( histY>y0 ) histY=y0; if( histYx1 ? x1 : pX[1]) ); pY[1] = histY; pX[2] = pX[1]; pY[2] = ( pY[0]>y0 ? y0 : (pY[0]x1 ? x1 : histX) ); pY[3] = pY[2]; pX[4] = pX[3]; pY[4] = histY; pX[5] = DBL_MAX; pY[5] = DBL_MAX; if( pX[1]!=pX[3] && pY[1]!=pY[2] ) { for( nPts=1; nPts<=5; nPts++ ) { *(lCoordPtr++) = pX[nPts]; *(lCoordPtr++) = pY[nPts]; } } if( i==curve_ptr->length-1 && x!=DBL_MAX ) { histX = x + x - histX; pX[1] = pX[4]; pY[1] = pY[4]; pX[2] = pX[1]; pY[2] = ( y>y0 ? y0 : (yx1 ? x1 : histX) ); pY[3] = pY[2]; pX[4] = pX[3]; pY[4] = histY; pX[5] = DBL_MAX; pY[5] = DBL_MAX; if( pX[1]!=pX[3] && pY[1]!=pY[2] ) { for( nPts=1; nPts<=5; nPts++ ) { *(lCoordPtr++) = pX[nPts]; *(lCoordPtr++) = pY[nPts]; } } } nPts = -1; } } else if( pX[0]==DBL_MAX || pY[0]==DBL_MAX ) { nPts = 0; /* Setup to draw inital box on next pass */ PowPixToPos( 0.0, 0.0, &curve_ptr->WCS, pX+1, pY+1 ); PowPosToPix( pX[1], pY[1], &graph->WCS, pX+1, &histY ); histY = y0 - histY * ymagstep; } else if( x==DBL_MAX || y==DBL_MAX ) { nPts = 3; /* This point terminates histogram. Close box. */ pX[1] = pX[0]+pX[0]-histX; pY[1] = pY[0]; pX[2] = pX[1]; pY[2] = histY; pX[3] = DBL_MAX; pY[3] = DBL_MAX; } else { histX = 0.5*(pX[0]+x); if( nPts==0 ) { /* Initial box needs to be drawn */ nPts = 2; pX[1] = pX[0] - histX + pX[0]; pY[1] = histY; pX[2] = pX[1]; pY[2] = pY[0]; } else nPts = 0; nPts++; pX[nPts] = histX; pY[nPts] = pY[0]; nPts++; pX[nPts] = histX; pY[nPts] = y; if( i==curve_ptr->length-1 && x!=DBL_MAX ) { histX = x + x - histX; nPts++; pX[nPts] = histX; pY[nPts] = y; nPts++; pX[nPts] = histX; pY[nPts] = histY; } } } else { nPts = 1; pX[1] = x; pY[1] = y; } pX[0] = x; pY[0] = y; for( n=1; n<=nPts; n++ ) { x = pX[n]; y = pY[n]; if( x==DBL_MAX || y==DBL_MAX ) { if( dflag ) { /* Terminate line segment. Go to next point */ dflag = 0; if( powCurvePtr->stairStep && oldx!=DBL_MAX ) { *(lCoordPtr++) = oldx; *(lCoordPtr++) = oldy; } *(lCoordPtr++) = DBL_MAX; *(lCoordPtr++) = DBL_MAX; } } else if( (x >= x0 && x <= x1) && (y <= y0 && y >= y1) ) { if( !dflag && oldx!=DBL_MAX) { /* Last point off graph... Find entrance point */ if( oldxx1 ) { oldy += (y-oldy)/(x-oldx)*(x1-oldx); oldx = x1; } if( oldy>y0 ) { oldx += (x-oldx)/(y-oldy)*(y0-oldy); oldy = y0; } else if( oldyx1 ) { mody += (mody-oldy)/(modx-oldx)*(x1-modx); modx = x1; } if( mody>y0 ) { modx += (modx-oldx)/(mody-oldy)*(y0-mody); mody = y0; } else if( modyx1 && x>x1) || (oldyy0 && y>y0) ) ) { if( oldxx1 ) { oldy += (y-oldy)/(x-oldx)*(x1-oldx); oldx = x1; } if( oldy>y0 ) { oldx += (x-oldx)/(y-oldy)*(y0-oldy); oldy = y0; } else if( oldy=x0 && oldx<=x1) && (oldy<=y0 && oldy>=y1) ) { modx = x; mody = y; if( modxx1 ) { mody += (mody-oldy)/(modx-oldx)*(x1-modx); modx = x1; } if( mody>y0 ) { modx += (modx-oldx)/(mody-oldy)*(y0-mody); mody = y0; } else if( modynumPoints = (int)((pCoordPtr - powCurvePtr->pCoordPtr)/2.0); if( powCurvePtr->numPoints==0 ) { ckfree( (char*)powCurvePtr->pCoordPtr ); powCurvePtr->pCoordPtr=NULL; } powCurvePtr->numLines = (int)((lCoordPtr - powCurvePtr->lCoordPtr)/2.0); if( powCurvePtr->numLines==0 ) { ckfree( (char*)powCurvePtr->lCoordPtr ); powCurvePtr->lCoordPtr=NULL; } ComputePowCurveBbox(canvas,powCurvePtr); return TCL_OK; } /* *-------------------------------------------------------------- * * ConfigurePowCurve -- * * This procedure is invoked to configure various aspects * of a powCurve item such as its background color. * * Results: * A standard Tcl result code. If an error occurs, then * an error message is left in the interp's result. * * Side effects: * Configuration information, such as colors and stipple * patterns, may be set for itemPtr. * *-------------------------------------------------------------- */ int ConfigurePowCurve(interp, canvas, itemPtr, objc, objv, flags) Tcl_Interp *interp; /* Used for error reporting. */ Tk_Canvas canvas; /* Canvas containing itemPtr. */ Tk_Item *itemPtr; /* PowCurve item to reconfigure. */ int objc; /* Number of elements in argv. */ Tcl_Obj *CONST objv[]; /* Arguments describing things to configure. */ int flags; /* Flags to pass to Tk_ConfigureWidget. */ { PowCurveItem *powCurvePtr = (PowCurveItem *) itemPtr; XGCValues gcValues; GC newGC; unsigned long mask; Tk_Window tkwin; Tk_State state; XColor *color; tkwin = Tk_CanvasTkwin(canvas); if (Tk_ConfigureWidget(interp, tkwin, configSpecs, objc, (const char**)objv, (char *) powCurvePtr, flags|TK_CONFIG_OBJS) != TCL_OK) { return TCL_ERROR; } newGC = powCurvePtr->pOutline.gc; color = powCurvePtr->pOutline.color; powCurvePtr->pOutline = powCurvePtr->lOutline; powCurvePtr->pOutline.gc = newGC; powCurvePtr->pOutline.dash.number=0; powCurvePtr->pOutline.width=1; powCurvePtr->pOutline.color=color; /* * A few of the options require additional processing, such as * graphics contexts. */ state = itemPtr->state; if(state == TK_STATE_NULL) { state = ((TkCanvas *)canvas)->canvas_state; } if (powCurvePtr->lOutline.activeWidth > powCurvePtr->lOutline.width || powCurvePtr->lOutline.activeDash.number > 0 || powCurvePtr->lOutline.activeColor != NULL || powCurvePtr->lOutline.activeStipple != None) { itemPtr->redraw_flags |= TK_ITEM_STATE_DEPENDANT; } else { itemPtr->redraw_flags &= ~TK_ITEM_STATE_DEPENDANT; } mask = Tk_ConfigOutlineGC(&gcValues, canvas, itemPtr, &(powCurvePtr->lOutline)); if (mask) { gcValues.cap_style = powCurvePtr->capStyle; mask |= GCCapStyle; gcValues.join_style = powCurvePtr->joinStyle; mask |= GCJoinStyle; newGC = Tk_GetGC(tkwin, mask, &gcValues); gcValues.line_width = 0; } else { newGC = None; } if (powCurvePtr->lOutline.gc != None) { Tk_FreeGC(Tk_Display(tkwin), powCurvePtr->lOutline.gc); } powCurvePtr->lOutline.gc = newGC; mask = Tk_ConfigOutlineGC(&gcValues, canvas, itemPtr, &(powCurvePtr->pOutline)); if (mask) { gcValues.cap_style = powCurvePtr->capStyle; mask |= GCCapStyle; gcValues.join_style = powCurvePtr->joinStyle; mask |= GCJoinStyle; newGC = Tk_GetGC(tkwin, mask, &gcValues); gcValues.line_width = 0; } else { newGC = None; } if (powCurvePtr->pOutline.gc != None) { Tk_FreeGC(Tk_Display(tkwin), powCurvePtr->pOutline.gc); } powCurvePtr->pOutline.gc = newGC; if ((state==TK_STATE_HIDDEN)) { ComputePowCurveBbox(canvas, powCurvePtr); return TCL_OK; } ComputePowCurveBbox(canvas, powCurvePtr); return TCL_OK; } /* *-------------------------------------------------------------- * * DeletePowCurve -- * * This procedure is called to clean up the data structure * associated with a powCurve item. * * Results: * None. * * Side effects: * Resources associated with itemPtr are released. * *-------------------------------------------------------------- */ void DeletePowCurve(canvas, itemPtr, display) Tk_Canvas canvas; /* Info about overall canvas widget. */ Tk_Item *itemPtr; /* Item that is being deleted. */ Display *display; /* Display containing window for * canvas. */ { PowCurveItem *powCurvePtr = (PowCurveItem *) itemPtr; Tk_DeleteOutline(display, &(powCurvePtr->lOutline)); if (powCurvePtr->pOutline.gc != None) { Tk_FreeGC(display, powCurvePtr->pOutline.gc); } if( powCurvePtr->pCoordPtr ) ckfree( (char*)powCurvePtr->pCoordPtr ); if( powCurvePtr->lCoordPtr ) ckfree( (char*)powCurvePtr->lCoordPtr ); } /* *-------------------------------------------------------------- * * ComputePowCurveBbox -- * * This procedure is invoked to compute the bounding box of * all the pixels that may be drawn as part of a powCurve. * * Results: * None. * * Side effects: * The fields x1, y1, x2, and y2 are updated in the header * for itemPtr. * *-------------------------------------------------------------- */ void ComputePowCurveBbox(canvas, powCurvePtr) Tk_Canvas canvas; /* Canvas that contains item. */ PowCurveItem *powCurvePtr; /* Item whose bbox is to be * recomputed. */ { double *coordPtr; int i, intWidth; double width; Tk_State state = powCurvePtr->header.state; Tk_TSOffset *tsoffset; if(state == TK_STATE_NULL) { state = ((TkCanvas *)canvas)->canvas_state; } if (state==TK_STATE_HIDDEN || !(powCurvePtr->pCoordPtr || powCurvePtr->lCoordPtr) ) { powCurvePtr->header.x1 = -1; powCurvePtr->header.x2 = -1; powCurvePtr->header.y1 = -1; powCurvePtr->header.y2 = -1; return; } width = powCurvePtr->lOutline.width; if (((TkCanvas *)canvas)->currentItemPtr == (Tk_Item *)powCurvePtr) { if (powCurvePtr->lOutline.activeWidth>width) { width = powCurvePtr->lOutline.activeWidth; } } else if (state==TK_STATE_DISABLED) { if (powCurvePtr->lOutline.disabledWidth>0) { width = powCurvePtr->lOutline.disabledWidth; } } if( powCurvePtr->pCoordPtr ) { powCurvePtr->header.x1 = powCurvePtr->header.x2 = (int) powCurvePtr->pCoordPtr[0]; powCurvePtr->header.y1 = powCurvePtr->header.y2 = (int) powCurvePtr->pCoordPtr[1]; } else { powCurvePtr->header.x1 = powCurvePtr->header.x2 = (int) powCurvePtr->lCoordPtr[0]; powCurvePtr->header.y1 = powCurvePtr->header.y2 = (int) powCurvePtr->lCoordPtr[1]; } /* * Compute the bounding box of all the points in the powCurve, * then expand in all directions by the powCurve's width to take * care of butting or rounded corners and projecting or * rounded caps. This expansion is an overestimate (worst-case * is square root of two over two) but it's simple. Don't do * anything special for curves. This causes an additional * overestimate in the bounding box, but is faster. */ for (i = 0, coordPtr = powCurvePtr->pCoordPtr; i < powCurvePtr->numPoints; i++, coordPtr += 2) { if( *coordPtr!=DBL_MAX ) TkIncludePoint((Tk_Item *) powCurvePtr, coordPtr); } for (i = 0, coordPtr = powCurvePtr->lCoordPtr; i < powCurvePtr->numLines; i++, coordPtr += 2) { if( *coordPtr!=DBL_MAX ) TkIncludePoint((Tk_Item *) powCurvePtr, coordPtr); } width = powCurvePtr->lOutline.width; if (width < 1.0) { width = 1.0; } tsoffset = &powCurvePtr->lOutline.tsoffset; if (tsoffset->flags & TK_OFFSET_INDEX) { double *coordPtr; if( powCurvePtr->pCoordPtr ) { coordPtr = powCurvePtr->pCoordPtr + (tsoffset->flags & ~TK_OFFSET_INDEX); if (tsoffset->flags <= 0) { coordPtr = powCurvePtr->pCoordPtr; } if (tsoffset->flags > (powCurvePtr->numPoints * 2)) { coordPtr = powCurvePtr->pCoordPtr + (powCurvePtr->numPoints * 2); } } else { coordPtr = powCurvePtr->lCoordPtr + (tsoffset->flags & ~TK_OFFSET_INDEX); if (tsoffset->flags <= 0) { coordPtr = powCurvePtr->lCoordPtr; } if (tsoffset->flags > (powCurvePtr->numLines * 2)) { coordPtr = powCurvePtr->lCoordPtr + (powCurvePtr->numLines * 2); } } tsoffset->xoffset = (int)(coordPtr[0]); tsoffset->yoffset = (int)(coordPtr[1]); } else { if (tsoffset->flags & TK_OFFSET_LEFT) { tsoffset->xoffset = powCurvePtr->header.x1; } else if (tsoffset->flags & TK_OFFSET_CENTER) { tsoffset->xoffset = (powCurvePtr->header.x1 + powCurvePtr->header.x2)/2; } else if (tsoffset->flags & TK_OFFSET_RIGHT) { tsoffset->xoffset = powCurvePtr->header.x2; } if (tsoffset->flags & TK_OFFSET_TOP) { tsoffset->yoffset = powCurvePtr->header.y1; } else if (tsoffset->flags & TK_OFFSET_MIDDLE) { tsoffset->yoffset = (powCurvePtr->header.y1 + powCurvePtr->header.y2)/2; } else if (tsoffset->flags & TK_OFFSET_BOTTOM) { tsoffset->yoffset = powCurvePtr->header.y2; } } intWidth = (int) (width + 0.5); powCurvePtr->header.x1 -= intWidth; powCurvePtr->header.x2 += intWidth; powCurvePtr->header.y1 -= intWidth; powCurvePtr->header.y2 += intWidth; if (powCurvePtr->curveObjectPtr->length==1) { return; } /* * Add one more pixel of fudge factor just to be safe (e.g. * X may round differently than we do). */ powCurvePtr->header.x1 -= 1; powCurvePtr->header.x2 += 1; powCurvePtr->header.y1 -= 1; powCurvePtr->header.y2 += 1; } /* *-------------------------------------------------------------- * * DisplayPowCurve -- * * This procedure is invoked to draw a powCurve item in a given * drawable. * * Results: * None. * * Side effects: * ItemPtr is drawn in drawable using the transformation * information in canvas. * *-------------------------------------------------------------- */ void DisplayPowCurve(canvas, itemPtr, display, drawable, x_reg, y_reg, width_reg, height_reg) Tk_Canvas canvas; /* Canvas that contains item. */ Tk_Item *itemPtr; /* Item to be displayed. */ Display *display; /* Display on which to draw item. */ Drawable drawable; /* Pixmap or window in which to draw * item. */ int x_reg, y_reg, width_reg, height_reg ;/* Describes region of canvas that * must be redisplayed (not used). */ { PowCurveItem *powCurvePtr = (PowCurveItem *) itemPtr; XPoint staticPoints[100]; XPoint *pointPtr; XPoint *linePtr; XRectangle tmpRect; double *coordPtr, *dPtr; int i, j, numPoints, numLines; struct { double x1,y1,x2,y2; } clipbox, bbox; int clipped; Tk_State state = itemPtr->state; Pixmap stipple = powCurvePtr->lOutline.stipple; if( powCurvePtr->hidden && (powCurvePtr->numPoints + powCurvePtr->numLines)>10000 ) return; if (drawable == None) { return; } if (powCurvePtr->lOutline.gc==None) { return; } /* printf("Draw...%s %3d %3d %3d %3d : %6d %6d\n", powCurvePtr->graphObjectPtr->graph_name, x_reg, y_reg, width_reg, height_reg, powCurvePtr->numPoints, powCurvePtr->numLines); */ clipbox.x1 = x_reg - 1; /* include a +-1 pixel border */ clipbox.y1 = y_reg - 1; clipbox.x2 = x_reg + width_reg + 1; clipbox.y2 = y_reg + height_reg + 1; tmpRect.width = tmpRect.height = 1; if(state == TK_STATE_NULL) { state = ((TkCanvas *)canvas)->canvas_state; } if (((TkCanvas *)canvas)->currentItemPtr == itemPtr) { if (powCurvePtr->lOutline.activeStipple!=None) { stipple = powCurvePtr->lOutline.activeStipple; } } else if (state==TK_STATE_DISABLED) { if (powCurvePtr->lOutline.disabledStipple!=None) { stipple = powCurvePtr->lOutline.disabledStipple; } } /* * Build up an array of points in screen coordinates. Use a * static array unless the powCurve has an enormous number of points; * in this case, dynamically allocate an array. For smoothed powCurves, * generate the curve points on each redisplay. */ /* Use staticPoints for drawing the Points & Errorbars since each */ /* instance will be very short. But might allocate for lines */ pointPtr = staticPoints; numLines = powCurvePtr->numLines; if (numLines <= 100) { linePtr = staticPoints; } else { linePtr = (XPoint *) ckalloc((unsigned) (numLines * sizeof(XPoint))); } /* * Display powCurve. * If we're stippling, then modify the stipple offset * in the GC. Be sure to reset the offset when done, since the * GC is supposed to be read-only. */ /* Do Points/Errorbars first */ Tk_ChangeOutlineGC(canvas, itemPtr, &(powCurvePtr->pOutline)); clipped = 1; numPoints = 0; for (i = 0, coordPtr = powCurvePtr->pCoordPtr; i < powCurvePtr->numPoints; i++, coordPtr += 2) { if( *coordPtr != DBL_MAX ) { /* Test if this point is inside clipbox */ if( clipped ) { if( coordPtr[0]>=clipbox.x1 && coordPtr[0]<=clipbox.x2 && coordPtr[1]>=clipbox.y1 && coordPtr[1]<=clipbox.y2 ) { clipped = 0; } else if( numPoints==0 ) { bbox.x1 = bbox.x2 = coordPtr[0]; bbox.y1 = bbox.y2 = coordPtr[1]; } else { if( bbox.x1 > coordPtr[0] ) bbox.x1 = coordPtr[0]; else if( bbox.x2 < coordPtr[0] ) bbox.x2 = coordPtr[0]; if( bbox.y1 > coordPtr[1] ) bbox.y1 = coordPtr[1]; else if( bbox.y2 < coordPtr[1] ) bbox.y2 = coordPtr[1]; } } numPoints++; } if( numPoints && (*coordPtr==DBL_MAX || i==powCurvePtr->numPoints-1) ) { if( clipped ) { /* None of points inside clipbox. Does bbox intersect clip? */ if( !(bbox.x2 < clipbox.x1 || bbox.x1 > clipbox.x2 || bbox.y2 < clipbox.y1 || bbox.y1 > clipbox.y2) ) { clipped = 0; } } if( !clipped ) { dPtr = coordPtr - (numPoints+numPoints); if( *coordPtr!=DBL_MAX ) dPtr+=2; for( j=0; j < numPoints; j++, dPtr+=2 ) Tk_CanvasDrawableCoords( canvas, dPtr[0], dPtr[1], &pointPtr[j].x, &pointPtr[j].y ); if( numPoints>2 && powCurvePtr->pointFill ) XFillPolygon(display, drawable, (powCurvePtr->pOutline).gc, pointPtr, numPoints, Convex, CoordModeOrigin); else if( numPoints>1 ) XDrawLines(display, drawable, (powCurvePtr->pOutline).gc, pointPtr, numPoints, CoordModeOrigin); else { tmpRect.x = pointPtr->x; tmpRect.y = pointPtr->y; XFillRectangles( display, drawable, (powCurvePtr->pOutline).gc, &tmpRect, 1 ); } } numPoints = 0; clipped = 1; } } Tk_ResetOutlineGC(canvas, itemPtr, &(powCurvePtr->pOutline)); /* Now do the lines */ Tk_ChangeOutlineGC(canvas, itemPtr, &(powCurvePtr->lOutline)); clipped = 1; numPoints = 0; for (i = 0, coordPtr = powCurvePtr->lCoordPtr; i < powCurvePtr->numLines; i++, coordPtr += 2) { if( *coordPtr != DBL_MAX ) { /* Test if this point is inside clipbox */ if( clipped ) { if( coordPtr[0]>=clipbox.x1 && coordPtr[0]<=clipbox.x2 && coordPtr[1]>=clipbox.y1 && coordPtr[1]<=clipbox.y2 ) { clipped = 0; } else if( numPoints==0 ) { bbox.x1 = bbox.x2 = coordPtr[0]; bbox.y1 = bbox.y2 = coordPtr[1]; } else { if( bbox.x1 > coordPtr[0] ) bbox.x1 = coordPtr[0]; else if( bbox.x2 < coordPtr[0] ) bbox.x2 = coordPtr[0]; if( bbox.y1 > coordPtr[1] ) bbox.y1 = coordPtr[1]; else if( bbox.y2 < coordPtr[1] ) bbox.y2 = coordPtr[1]; } } numPoints++; } if( numPoints && (*coordPtr==DBL_MAX || i==powCurvePtr->numLines-1) ) { if( clipped ) { /* None of points inside clipbox. Does bbox intersect clip? */ if( !(bbox.x2 < clipbox.x1 || bbox.x1 > clipbox.x2 || bbox.y2 < clipbox.y1 || bbox.y1 > clipbox.y2) ) { clipped = 0; } } if( !clipped ) { dPtr = coordPtr - (numPoints+numPoints); if( *coordPtr!=DBL_MAX ) dPtr+=2; for( j=0; j < numPoints; j++, dPtr+=2 ) Tk_CanvasDrawableCoords( canvas, dPtr[0], dPtr[1], &linePtr[j].x, &linePtr[j].y ); if( powCurvePtr->stairStep && powCurvePtr->boxFill ) { if( linePtr[0].xlOutline).gc, &tmpRect, 1 ); } else { XDrawLines(display, drawable, (powCurvePtr->lOutline).gc, linePtr, numPoints, CoordModeOrigin); } } numPoints = 0; clipped = 1; } } Tk_ResetOutlineGC(canvas, itemPtr, &(powCurvePtr->lOutline)); if( linePtr!=staticPoints ) ckfree( (char*)linePtr ); } /* *-------------------------------------------------------------- * * PowCurveInsert -- * * Insert coords into a powCurve item at a given index. * * Results: * None. * * Side effects: * The coords in the given item is modified. * *-------------------------------------------------------------- */ void PowCurveInsert(canvas, itemPtr, beforeThis, string) Tk_Canvas canvas; /* Canvas containing text item. */ Tk_Item *itemPtr; /* PowCurve item to be modified. */ int beforeThis; /* Index before which new coordinates * are to be inserted. */ char *string; /* New coordinates to be inserted. */ { PowCurveItem *powCurvePtr = (PowCurveItem *) itemPtr; int length, argc, i; const char **argv = (const char **) NULL; double *new, *coordPtr; Tk_State state = itemPtr->state; if(state == TK_STATE_NULL) { state = ((TkCanvas *)canvas)->canvas_state; } if(!string || !*string) { return; } if ((Tcl_SplitList(((TkCanvas *)canvas)->interp, string, &argc, &argv) != TCL_OK) || argv == NULL || !argc || argc&1) { Tcl_ResetResult(((TkCanvas *)canvas)->interp); if (argv != NULL) { ckfree((char *) argv); } return; } length = 2*powCurvePtr->numPoints; if (beforeThis < 0) { beforeThis = 0; } if (beforeThis > length) { beforeThis = length; } new = (double *) ckalloc((unsigned)(sizeof(double) * (length + argc))); for(i=0; ipCoordPtr[i]; } for(i=0; iinterp,argv[i], new+(i+beforeThis))!=TCL_OK) { Tcl_ResetResult(((TkCanvas *)canvas)->interp); ckfree((char *) new); ckfree((char *) argv); return; } } for(i=beforeThis; ipCoordPtr[i]; } if(powCurvePtr->pCoordPtr) ckfree((char *)powCurvePtr->pCoordPtr); ckfree((char *) argv); powCurvePtr->pCoordPtr = new; powCurvePtr->curveObjectPtr->length = (length + argc)/2; if ((length>3) && (state != TK_STATE_HIDDEN)) { /* * This is some optimizing code that will result that only the part * of the polygon that changed (and the objects that are overlapping * with that part) need to be redrawn. A special flag is set that * instructs the general canvas code not to redraw the whole * object. If this flag is not set, the canvas will do the redrawing, * otherwise I have to do it here. */ itemPtr->redraw_flags |= TK_ITEM_DONT_REDRAW; if (beforeThis>0) {beforeThis -= 2; argc+=2; } if ((beforeThis+argc)x1 = itemPtr->x2 = (int)(powCurvePtr->pCoordPtr[beforeThis]); itemPtr->y1 = itemPtr->y2 = (int)(powCurvePtr->pCoordPtr[beforeThis+1]); coordPtr = powCurvePtr->pCoordPtr+beforeThis+2; for(i=2; iredraw_flags & TK_ITEM_DONT_REDRAW) { double width; int intWidth; width = powCurvePtr->lOutline.width; if (((TkCanvas *)canvas)->currentItemPtr == itemPtr) { if (powCurvePtr->lOutline.activeWidth>width) { width = powCurvePtr->lOutline.activeWidth; } } else if (state==TK_STATE_DISABLED) { if (powCurvePtr->lOutline.disabledWidth>0) { width = powCurvePtr->lOutline.disabledWidth; } } intWidth = (int) (width + 0.5); if (intWidth < 1) { intWidth = 1; } itemPtr->x1 -= intWidth; itemPtr->y1 -= intWidth; itemPtr->x2 += intWidth; itemPtr->y2 += intWidth; Tk_CanvasEventuallyRedraw(canvas, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); } ComputePowCurveBbox(canvas, powCurvePtr); } /* *-------------------------------------------------------------- * * PowCurveDeleteCoords -- * * Delete one or more coordinates from a powCurve item. * * Results: * None. * * Side effects: * Characters between "first" and "last", inclusive, get * deleted from itemPtr. * *-------------------------------------------------------------- */ void PowCurveDeleteCoords(canvas, itemPtr, first, last) Tk_Canvas canvas; /* Canvas containing itemPtr. */ Tk_Item *itemPtr; /* Item in which to delete characters. */ int first; /* Index of first character to delete. */ int last; /* Index of last character to delete. */ { PowCurveItem *powCurvePtr = (PowCurveItem *) itemPtr; int count, i, first1, last1; int length = 2*powCurvePtr->numPoints; double *coordPtr; Tk_State state = itemPtr->state; if(state == TK_STATE_NULL) { state = ((TkCanvas *)canvas)->canvas_state; } first &= -2; last &= -2; if (first < 0) { first = 0; } if (last >= length) { last = length-2; } if (first > last) { return; } first1 = first; last1 = last; if(first1>0) first1 -= 2; if(last1= length-2)) { /* * This is some optimizing code that will result that only the part * of the powCurve that changed (and the objects that are overlapping * with that part) need to be redrawn. A special flag is set that * instructs the general canvas code not to redraw the whole * object. If this flag is set, the redrawing has to be done here, * otherwise the general Canvas code will take care of it. */ itemPtr->redraw_flags |= TK_ITEM_DONT_REDRAW; itemPtr->x1 = itemPtr->x2 = (int)(powCurvePtr->pCoordPtr[first1]); itemPtr->y1 = itemPtr->y2 = (int)(powCurvePtr->pCoordPtr[first1+1]); coordPtr = powCurvePtr->pCoordPtr+first1+2; for(i=first1+2; i<=last1; i+=2) { TkIncludePoint(itemPtr, coordPtr); coordPtr+=2; } } count = last + 2 - first; for(i=last+2; ipCoordPtr[i-count] = powCurvePtr->pCoordPtr[i]; } powCurvePtr->curveObjectPtr->length -= count/2; if(itemPtr->redraw_flags & TK_ITEM_DONT_REDRAW) { double width; int intWidth; width = powCurvePtr->lOutline.width; if (((TkCanvas *)canvas)->currentItemPtr == itemPtr) { if (powCurvePtr->lOutline.activeWidth>width) { width = powCurvePtr->lOutline.activeWidth; } } else if (state==TK_STATE_DISABLED) { if (powCurvePtr->lOutline.disabledWidth>0) { width = powCurvePtr->lOutline.disabledWidth; } } intWidth = (int) (width + 0.5); if (intWidth < 1) { intWidth = 1; } itemPtr->x1 -= intWidth; itemPtr->y1 -= intWidth; itemPtr->x2 += intWidth; itemPtr->y2 += intWidth; Tk_CanvasEventuallyRedraw(canvas, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); } ComputePowCurveBbox(canvas, powCurvePtr); } /* *-------------------------------------------------------------- * * PowCurveToPoint -- * * Computes the distance from a given point to a given * powCurve, in canvas units. * * Results: * The return value is 0 if the point whose x and y coordinates * are pointPtr[0] and pointPtr[1] is inside the powCurve. If the * point isn't inside the powCurve then the return value is the * distance from the point to the powCurve. * * Side effects: * None. * *-------------------------------------------------------------- */ /* ARGSUSED */ double PowCurveToPoint(canvas, itemPtr, pointPtr) Tk_Canvas canvas; /* Canvas containing item. */ Tk_Item *itemPtr; /* Item to check against point. */ double *pointPtr; /* Pointer to x and y coordinates. */ { double width; Tk_State state = itemPtr->state; PowCurveItem *powCurvePtr = (PowCurveItem *) itemPtr; double *powCurveLines; double bestDist; int numLines; bestDist = 1.0e36; if (!powCurvePtr->curveToPoint) return bestDist; if(state == TK_STATE_NULL) { state = ((TkCanvas *)canvas)->canvas_state; } width = powCurvePtr->lOutline.width; if (((TkCanvas *)canvas)->currentItemPtr == itemPtr) { if (powCurvePtr->lOutline.activeWidth>width) { width = powCurvePtr->lOutline.activeWidth; } } else if (state==TK_STATE_DISABLED) { if (powCurvePtr->lOutline.disabledWidth>0) { width = powCurvePtr->lOutline.disabledWidth; } } numLines = powCurvePtr->numLines; powCurveLines = powCurvePtr->lCoordPtr; if (!numLines || itemPtr->state==TK_STATE_HIDDEN) { return bestDist; } else if (numLines == 1) { bestDist = hypot(powCurveLines[0] - pointPtr[0], powCurveLines[1] - pointPtr[1]) - width/2.0; if (bestDist < 0) bestDist = 0; return bestDist; } /* Deleted a lot of code not needed by PowCanvCurve... for now */ return bestDist; } /* *-------------------------------------------------------------- * * PowCurveToArea -- * * This procedure is called to determine whether an item * lies entirely inside, entirely outside, or overlapping * a given rectangular area. * * Results: * -1 is returned if the item is entirely outside the * area, 0 if it overlaps, and 1 if it is entirely * inside the given area. * * Side effects: * None. * *-------------------------------------------------------------- */ /* ARGSUSED */ int PowCurveToArea(canvas, itemPtr, rectPtr) Tk_Canvas canvas; /* Canvas containing item. */ Tk_Item *itemPtr; /* Item to check against powCurve. */ double *rectPtr; { PowCurveItem *powCurvePtr = (PowCurveItem *) itemPtr; int result; double radius, width; Tk_State state = itemPtr->state; if(state == TK_STATE_NULL) { state = ((TkCanvas *)canvas)->canvas_state; } width = powCurvePtr->lOutline.width; if (((TkCanvas *)canvas)->currentItemPtr == itemPtr) { if (powCurvePtr->lOutline.activeWidth>width) { width = powCurvePtr->lOutline.activeWidth; } } else if (state==TK_STATE_DISABLED) { if (powCurvePtr->lOutline.disabledWidth>0) { width = powCurvePtr->lOutline.disabledWidth; } } radius = (width+1.0)/2.0; /* Delete some code not needed by PowCanvCurve... for now */ result = -1; return result; } /* *-------------------------------------------------------------- * * ScalePowCurve -- * * This procedure is invoked to rescale a powCurve item. * * Results: * None. * * Side effects: * The powCurve referred to by itemPtr is rescaled so that the * following transformation is applied to all point * coordinates: * x' = originX + scaleX*(x-originX) * y' = originY + scaleY*(y-originY) * *-------------------------------------------------------------- */ void ScalePowCurve(canvas, itemPtr, originX, originY, scaleX, scaleY) Tk_Canvas canvas; /* Canvas containing powCurve. */ Tk_Item *itemPtr; /* PowCurve to be scaled. */ double originX, originY; /* Origin about which to scale rect. */ double scaleX; /* Amount to scale in X direction. */ double scaleY; /* Amount to scale in Y direction. */ { PowCurveItem *powCurvePtr = (PowCurveItem *) itemPtr; double *coordPtr; int i; for (i = 0, coordPtr = powCurvePtr->pCoordPtr; i < powCurvePtr->numPoints; i++, coordPtr += 2) { if( *coordPtr!=DBL_MAX ) { coordPtr[0] = originX + scaleX*(*coordPtr - originX); coordPtr[1] = originY + scaleY*(coordPtr[1] - originY); } } for (i = 0, coordPtr = powCurvePtr->lCoordPtr; i < powCurvePtr->numLines; i++, coordPtr += 2) { if( *coordPtr!=DBL_MAX ) { coordPtr[0] = originX + scaleX*(*coordPtr - originX); coordPtr[1] = originY + scaleY*(coordPtr[1] - originY); } } ComputePowCurveBbox(canvas, powCurvePtr); } /* *-------------------------------------------------------------- * * GetPowCurveIndex -- * * Parse an index into a powCurve item and return either its value * or an error. * * Results: * A standard Tcl result. If all went well, then *indexPtr is * filled in with the index (into itemPtr) corresponding to * string. Otherwise an error message is left in * the interp's result. * * Side effects: * None. * *-------------------------------------------------------------- */ int GetPowCurveIndex(interp, canvas, itemPtr, string, indexPtr) Tcl_Interp *interp; /* Used for error reporting. */ Tk_Canvas canvas; /* Canvas containing item. */ Tk_Item *itemPtr; /* Item for which the index is being * specified. */ char *string; /* Specification of a particular coord * in itemPtr's powCurve. */ int *indexPtr; /* Where to store converted index. */ { /* Function not supported */ /* * Some of the paths here leave messages in the interp's result, * so we have to clear it out before storing our own message. */ Tcl_SetResult(interp, (char *) NULL, TCL_STATIC); Tcl_AppendResult(interp, "bad index \"", string, "\"", (char *) NULL); return TCL_ERROR; } /* *-------------------------------------------------------------- * * TranslatePowCurve -- * * This procedure is called to move a powCurve by a given amount. * * Results: * None. * * Side effects: * The position of the powCurve is offset by (xDelta, yDelta), and * the bounding box is updated in the generic part of the item * structure. * *-------------------------------------------------------------- */ void TranslatePowCurve(canvas, itemPtr, deltaX, deltaY) Tk_Canvas canvas; /* Canvas containing item. */ Tk_Item *itemPtr; /* Item that is being moved. */ double deltaX, deltaY; /* Amount by which item is to be * moved. */ { PowCurveItem *powCurvePtr = (PowCurveItem *) itemPtr; double *coordPtr; int i; for (i = 0, coordPtr = powCurvePtr->pCoordPtr; i < powCurvePtr->numPoints; i++, coordPtr += 2) { if( *coordPtr!=DBL_MAX ) { coordPtr[0] += deltaX; coordPtr[1] += deltaY; } } for (i = 0, coordPtr = powCurvePtr->lCoordPtr; i < powCurvePtr->numLines; i++, coordPtr += 2) { if( *coordPtr!=DBL_MAX ) { coordPtr[0] += deltaX; coordPtr[1] += deltaY; } } ComputePowCurveBbox(canvas, powCurvePtr); } /* *-------------------------------------------------------------- * * PowCurveToPostscript -- * * This procedure is called to generate Postscript for * powCurve items. * * Results: * The return value is a standard Tcl result. If an error * occurs in generating Postscript then an error message is * left in the interp's result, replacing whatever used * to be there. If no error occurs, then Postscript for the * item is appended to the result. * * Side effects: * None. * *-------------------------------------------------------------- */ int PowCurveToPostscript(interp, canvas, itemPtr, prepass) Tcl_Interp *interp; /* Leave Postscript or error message * here. */ Tk_Canvas canvas; /* Information about overall canvas. */ Tk_Item *itemPtr; /* Item for which Postscript is * wanted. */ int prepass; /* 1 means this is a prepass to * collect font information; 0 means * final Postscript is being created. */ { PowCurveItem *powCurvePtr = (PowCurveItem *) itemPtr; char buffer[200]; char *style; double width; XColor *lcolor, *pcolor; Pixmap stipple; Tk_State state = itemPtr->state; if(state == TK_STATE_NULL) { state = ((TkCanvas *)canvas)->canvas_state; } width = powCurvePtr->lOutline.width; lcolor = powCurvePtr->lOutline.color; pcolor = powCurvePtr->pOutline.color; stipple = powCurvePtr->lOutline.stipple; if (((TkCanvas *)canvas)->currentItemPtr == itemPtr) { if (powCurvePtr->lOutline.activeWidth>width) { width = powCurvePtr->lOutline.activeWidth; } if (powCurvePtr->lOutline.activeColor!=NULL) { lcolor = powCurvePtr->lOutline.activeColor; pcolor = powCurvePtr->pOutline.activeColor; } if (powCurvePtr->lOutline.activeStipple!=None) { stipple = powCurvePtr->lOutline.activeStipple; } } else if (state==TK_STATE_DISABLED) { if (powCurvePtr->lOutline.disabledWidth>0) { width = powCurvePtr->lOutline.disabledWidth; } if (powCurvePtr->lOutline.disabledColor!=NULL) { lcolor = powCurvePtr->lOutline.disabledColor; pcolor = powCurvePtr->pOutline.disabledColor; } if (powCurvePtr->lOutline.disabledStipple!=None) { stipple = powCurvePtr->lOutline.disabledStipple; } } if (lcolor == NULL || ( (powCurvePtr->numPoints<1 || powCurvePtr->pCoordPtr==NULL) && (powCurvePtr->numLines<1 || powCurvePtr->lCoordPtr==NULL) ) ) { return TCL_OK; } if (powCurvePtr->numPoints==1) { sprintf(buffer, "%.15g %.15g translate %.15g %.15g", powCurvePtr->pCoordPtr[0], Tk_CanvasPsY(canvas, powCurvePtr->pCoordPtr[1]), width/2.0, width/2.0); Tcl_AppendResult(interp, "matrix currentmatrix\n",buffer, " scale 1 0 moveto 0 0 1 0 360 arc\nsetmatrix\n", (char *) NULL); if (Tk_CanvasPsColor(interp, canvas, pcolor) != TCL_OK) { return TCL_ERROR; } if (stipple != None) { Tcl_AppendResult(interp, "clip ", (char *) NULL); if (Tk_CanvasPsStipple(interp, canvas, stipple) != TCL_OK) { return TCL_ERROR; } } else { Tcl_AppendResult(interp, "fill\n", (char *) NULL); } } if (powCurvePtr->numLines==1) { sprintf(buffer, "%.15g %.15g translate %.15g %.15g", powCurvePtr->lCoordPtr[0], Tk_CanvasPsY(canvas, powCurvePtr->lCoordPtr[1]), width/2.0, width/2.0); Tcl_AppendResult(interp, "matrix currentmatrix\n",buffer, " scale 1 0 moveto 0 0 1 0 360 arc\nsetmatrix\n", (char *) NULL); if (Tk_CanvasPsColor(interp, canvas, lcolor) != TCL_OK) { return TCL_ERROR; } if (stipple != None) { Tcl_AppendResult(interp, "clip ", (char *) NULL); if (Tk_CanvasPsStipple(interp, canvas, stipple) != TCL_OK) { return TCL_ERROR; } } else { Tcl_AppendResult(interp, "fill\n", (char *) NULL); } } if( powCurvePtr->numPoints<=1 && powCurvePtr->numLines<=1 ) return TCL_OK; /* * Set powCurve-drawing parameters */ style = "0 setlinecap\n"; if (powCurvePtr->capStyle == CapRound) { style = "1 setlinecap\n"; } else if (powCurvePtr->capStyle == CapProjecting) { style = "2 setlinecap\n"; } Tcl_AppendResult(interp, style, (char *) NULL); style = "0 setlinejoin\n"; if (powCurvePtr->joinStyle == JoinRound) { style = "1 setlinejoin\n"; } else if (powCurvePtr->joinStyle == JoinBevel) { style = "2 setlinejoin\n"; } Tcl_AppendResult(interp, style, (char *) NULL); /* * Generate a path for the powCurve's center-line (do this differently * for straight powCurves and smoothed powCurves). */ { TkCanvas *cnvs = (TkCanvas*)canvas; double *coordPtr; char buffer[200]; int nPts, i; if (Tk_CanvasPsColor(interp, canvas, pcolor) != TCL_OK) { return TCL_ERROR; } coordPtr = powCurvePtr->pCoordPtr; nPts = 0; for ( i=0, coordPtr=powCurvePtr->pCoordPtr; i < powCurvePtr->numPoints; i++, coordPtr += 2) { if( *coordPtr!=DBL_MAX ) { if( nPts ) { sprintf(buffer, "%.15g %.15g lineto\n", coordPtr[0], Tk_PostscriptY(coordPtr[1], cnvs->psInfo)); } else { sprintf(buffer, "%.15g %.15g moveto\n", coordPtr[0], Tk_PostscriptY(coordPtr[1], cnvs->psInfo)); } Tcl_AppendResult(interp, buffer, (char *) NULL); nPts++; } if( nPts && (*coordPtr==DBL_MAX || i == powCurvePtr->numPoints-1) ) { /* * Stroke out the point/error bar. */ if( nPts>2 && powCurvePtr->pointFill ) { if (stipple != None) { Tcl_AppendResult(interp, "clip ", (char *) NULL); if (Tk_CanvasPsStipple(interp, canvas, stipple) != TCL_OK) { return TCL_ERROR; } } else { Tcl_AppendResult(interp, "fill\n", (char *) NULL); } } else if ( nPts==1 ) { if( *coordPtr!=DBL_MAX ) nPts=0; sprintf(buffer, "%.15g %.15g 0.5 0.0 360.0 arc fill\n", coordPtr[-2*nPts], Tk_PostscriptY(coordPtr[-2*nPts+1], cnvs->psInfo)); Tcl_AppendResult(interp, buffer, (char *) NULL); } else if (Tk_CanvasPsOutline( canvas, itemPtr, &(powCurvePtr->pOutline) ) != TCL_OK) { return TCL_ERROR; } nPts = 0; } } if (Tk_CanvasPsColor(interp, canvas, lcolor) != TCL_OK) { return TCL_ERROR; } coordPtr = powCurvePtr->lCoordPtr; nPts = 0; for ( i=0, coordPtr=powCurvePtr->lCoordPtr; i < powCurvePtr->numLines; i++, coordPtr += 2) { if( *coordPtr!=DBL_MAX ) { if( nPts ) { sprintf(buffer, "%.15g %.15g lineto\n", coordPtr[0], Tk_PostscriptY(coordPtr[1], cnvs->psInfo)); } else { sprintf(buffer, "%.15g %.15g moveto\n", coordPtr[0], Tk_PostscriptY(coordPtr[1], cnvs->psInfo)); } Tcl_AppendResult(interp, buffer, (char *) NULL); nPts++; } if( nPts && (*coordPtr==DBL_MAX || i == powCurvePtr->numLines-1) ) { /* * Stroke out the powCurve. */ if ( powCurvePtr->stairStep && powCurvePtr->boxFill ) { Tcl_AppendResult(interp, "fill\n", (char *) NULL); } else { if (Tk_CanvasPsOutline(canvas, itemPtr, &(powCurvePtr->lOutline)) != TCL_OK) { return TCL_ERROR; } } nPts = 0; } } } return TCL_OK; } void outDebugStr(char *title, char *str) { char *p; char currstr[90]; p = str; fprintf(stdout, "Title: <%s>\n", title); fflush(stdout); while (1) { if ( strlen(p) <= 0 ) break; strncpy(currstr, p, 80); currstr[80] = '\0'; fprintf(stdout, "currstr: <%s>\n", currstr); fflush(stdout); p += 80; } } fv5.4/tcltk/pow/PowCmdsClass.tcl0000644000220700001010000001333311130706071016177 0ustar birbylheadevproc gPowCmdsClass { args } { return [uplevel #0 PowCmdsClass #auto $args] } itcl::class PowCmdsClass { constructor {} {} destructor {} public { method helpPage { args } method binFactorTool { args } method regionTool { args } method getRegion { args } method getXRange { args } method regions { args } method regionName { args } method setRegionFormat { args } method xrangeTool { args } method xranges { args } method xrangeName { args } method add { objType objName } method array { dchan dName {bitpix "LIST"} {byteOrder ""} } method axes { xscale yscale } method bounds { args } method calculate { newData args } method colormap { args } method close { args } method create { objType objNam args } method contour { args } method cursor { } method curve { args } method delete { args } method draw { args } method graph { args } method init { ncolors colorMode } method position { args } method refresh { args } method remote { args } method remove { args } method scope { {dx ""} {dy ""} } method select { obj name } method size { args } method version { } method wcs { obj wcs } method wcsHeader { gn strlen {str} flag } method wcsHeaderCnt { gn cnt } method wcsLabel { gn label name value } method wcsSetList { gn {list} } } } itcl::body PowCmdsClass::destructor {} { } itcl::body PowCmdsClass::helpPage { args } { return [eval ::powCmds::helpPage $args] } itcl::body PowCmdsClass::setRegionFormat { args } { return [eval ::powCmds::setRegionFormat $args] } itcl::body PowCmdsClass::regionName { args } { return [eval ::powCmds::regionName $args] } itcl::body PowCmdsClass::regions { args } { return [eval ::powCmds::regions $args] } itcl::body PowCmdsClass::getRegion { args } { return [eval ::powCmds::getRegion $args] } itcl::body PowCmdsClass::getXRange { args } { return [eval ::powCmds::getXRange $args] } itcl::body PowCmdsClass::binFactorTool { args } { return [eval ::powCmds::binFactorTool $args] } itcl::body PowCmdsClass::regionTool { args } { return [eval ::powCmds::regionTool $args] } itcl::body PowCmdsClass::xrangeName { args } { return [eval ::powCmds::xrangeName $args] } itcl::body PowCmdsClass::xranges { args } { return [eval ::powCmds::xranges $args] } itcl::body PowCmdsClass::xrangeTool { args } { return [eval ::powCmds::xrangeTool $args] } itcl::body PowCmdsClass::add { objType objName } { return [eval ::powCmds::add $objType $objName] } itcl::body PowCmdsClass::array { dchan dName {bitpix "LIST"} {byteOrder ""} } { return [eval ::powCmds::array $dchan $dName $bitpix $byteOrder ] } itcl::body PowCmdsClass::axes { xscale yscale } { return [eval ::powCmds::axes $xcale $ycale] } itcl::body PowCmdsClass::bounds { args } { return [eval ::powCmds::bounds $args] } itcl::body PowCmdsClass::calculate { newData args } { return [eval ::powCmds::calculate $newData $args] } itcl::body PowCmdsClass::colormap { args } { return [eval ::powCmds::colormap $args] } itcl::body PowCmdsClass::close { args } { return [eval ::powCmds::close $args] } itcl::body PowCmdsClass::create { objType objName {args} } { return [eval ::powCmds::create $objType $objName $args] } itcl::body PowCmdsClass::contour { args } { return [eval ::powCmds::contour $args] } itcl::body PowCmdsClass::cursor { } { return [eval ::powCmds::cursor] } itcl::body PowCmdsClass::curve { args } { return [eval ::powCmds::curve $args] } itcl::body PowCmdsClass::delete { args } { return [eval ::powCmds::delete $args] } itcl::body PowCmdsClass::draw { args } { return [eval ::powCmds::draw $args] } itcl::body PowCmdsClass::graph { args } { set errorFlag [ catch { set returnValue [eval ::powCmds::graph $args] eval ::powCmds::scope 0 } err ] if { $errorFlag } { return $err } return $returnValue } itcl::body PowCmdsClass::init { ncolors colorMode } { return [eval ::powCmds::init $ncolors $colorMode] } itcl::body PowCmdsClass::position { args } { return [eval ::powCmds::position $args] } itcl::body PowCmdsClass::refresh { args } { return [eval ::powCmds::refresh $args] } itcl::body PowCmdsClass::remote { args } { return [eval ::powCmds::remote $args] } itcl::body PowCmdsClass::remove { args } { return [eval ::powCmds::remove $args] } itcl::body PowCmdsClass::scope { {dx ""} {dy ""} } { return [eval ::powCmds::scope $dx $dy] } itcl::body PowCmdsClass::select { obj name } { return [eval ::powCmds::select $obj $name] } itcl::body PowCmdsClass::size { args } { return [eval ::powCmds::size $args] } itcl::body PowCmdsClass::version { } { return [eval ::powCmds::version] } itcl::body PowCmdsClass::wcs { obj {wcs} } { set wcsList {} lappend wcsList $wcs return [eval ::powCmds::wcs $obj $wcsList] } itcl::body PowCmdsClass::wcsHeader { gn strlen {str} flag } { return [eval ::powCmds::wcsHeader $gn $strlen [list $str] $flag ] } itcl::body PowCmdsClass::wcsHeaderCnt { gn cnt } { return [eval ::powCmds::wcsHeaderCnt $gn $cnt] } itcl::body PowCmdsClass::wcsLabel { gn label name value } { return [eval ::powCmds::wcsLabel $gn $label $name $value] } itcl::body PowCmdsClass::wcsSetList { gn list } { return [eval ::powCmds::wcsSetList $gn $list] } fv5.4/tcltk/pow/PowColormap.c0000644000220700001010000005713112167106723015554 0ustar birbylheadev#include "pow.h" extern XColor lut_colorcell_defs[256]; extern PictColorTable *PowColorTable; int PowSetupColormap(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[] ) { /* This routine creates a toplevel window with a colormap for that window which has the specified number of cells free in addition to those needed by POW. If force_cmap is non-zero: 0 - Default behavior. Choose the "best" pseudocolor map with enough colorcells available. 1 - Force a new private pseudocolor colormap. 2 - Force truecolor mode. Note, the *images* are truecolor, the visual associated with the POW colormap may be anything, "toplevel -visual best" is used to choose the visual. 3 - Force screen default colormap (WARNING: this may crash application if the default colormap is pseudocolor, or not if you're lucky, or VISU may barf at image startup, you getting the idea that I don't recommend this option; if it's truecolor, this should work as well as option 2 does. ) Returns toplevel path name. All of an application's windows should then use the colormap of this toplevel. */ #if !(defined(__WIN32__) || defined(macintosh)) Tk_Window dotwin; Tk_Window tkwin; Screen *screen; Display *disp; Colormap cmap; int i; XColor *colors; int colormap_size; int screenIndex; unsigned long *pixels; unsigned long *plane_masks; XVisualInfo *visual_info; int ncolors; Status status; Bool tfGotColors; /* True if we got colors from X */ int powCells; #endif char *toplevel; char *options; int free_cells; int force_cmap; if (argc == 2 && (!strcmp(argv[1],"none") || !strcmp(argv[1],"NULL"))) { /* do nothing */ return TCL_OK; } if (argc > 5 || argc < 3 ) { Tcl_SetResult(interp, "usage: powSetupColormap toplevel_name free_cells ?force_cmap? ?options_list?", TCL_VOLATILE); return TCL_ERROR; } toplevel = ckalloc(strlen(argv[1])+5); strcpy(toplevel,argv[1]); Tcl_GetInt(interp,argv[2],&free_cells); if (argc >= 4) { Tcl_GetInt(interp,argv[3],&force_cmap); } else { force_cmap = 0; } if (argc == 5) { options = ckalloc(strlen(argv[4])+1); strcpy(options,argv[4]); } else { options = ckalloc(1); *options = '\0'; } #if defined(__WIN32__) || defined(macintosh) /*In WIN32/mac, just create the toplevel. Pseudocolor mode isn't supported in WIN32/mac because the necessary Xlib calls are missing.*/ Tcl_SetVar(interp,"powPseudoImages","0",TCL_GLOBAL_ONLY); return Tcl_VarEval(interp, "toplevel ",toplevel, " -visual default ",options,(char *)NULL); /* return Tcl_VarEval(interp, "toplevel ",toplevel, " -visual best ",options,(char *)NULL); */ #else if (force_cmap == 2) { Tcl_SetVar(interp,"powPseudoImages","0",TCL_GLOBAL_ONLY); return Tcl_VarEval(interp, "toplevel ",toplevel, " -visual default ",options,(char *)NULL); /* return Tcl_VarEval(interp, "toplevel ",toplevel, " -visual best ",options,(char *)NULL); */ } /* find out some things about the screen*/ dotwin = Tk_NameToWindow(interp,".",Tk_MainWindow(interp)); screen=Tk_Screen(dotwin); disp = Tk_Display(dotwin); screenIndex=DefaultScreen(disp); if (force_cmap == 3) { /*Force default visual. */ return Tcl_VarEval(interp, "toplevel ",toplevel," -visual default ", options,(char *)NULL); /* We want to know if the default visual is pseudocolor. Finding this out in Xlib is stupidly complicated, so we'll let Tk do it for us */ Tcl_Eval(interp,"string match \"pseudocolor\" [winfo screenvisual .]"); if (Tcl_GetStringResult(interp) != "1") { Tcl_SetVar(interp,"powPseudoImages","0",TCL_GLOBAL_ONLY); } return TCL_OK; } visual_info = get_visual(disp); if (visual_info == NULL) { /* Is this really an error??? (void)fprintf (stderr,"powSetupColormap: toplevel created with non-pseudocolor visual. \n"); */ Tcl_SetVar(interp,"powPseudoImages","0",TCL_GLOBAL_ONLY); return Tcl_VarEval(interp, "toplevel ",toplevel," -visual default ", options,(char *)NULL); /* return Tcl_VarEval(interp, "toplevel ",toplevel," -visual best ", options,(char *)NULL); */ } plane_masks = (unsigned long *) ckalloc(MAXPLANES*sizeof(unsigned long)); pixels = (unsigned long *) ckalloc(MAX_COLORS*sizeof(unsigned long)); if (plane_masks == NULL || pixels == NULL) { (void)fprintf(stderr, "\n Unable to allocate storage for PowSetupColormap\n"); return TCL_ERROR; } tfGotColors = False; /* Will be set True when we succeed */ if (force_cmap != 1) { /* Try default Colormap first */ cmap = DefaultColormap(disp, screenIndex); ncolors = 212; /* why not 256, I don't know, but since we have to match whatever VISU does and I don't want to mess with that.... */ while (ncolors > 10) { status = XAllocColorCells(disp,cmap,True,plane_masks,0,pixels,ncolors); if (status != 0) { tfGotColors = True; /* Success. Break out of the while loop */ break; } ncolors -= 10; /* Failure. Decrement request and try again */ } /* End of while loop */ } Tcl_GetInt(interp,Tcl_GetVar(interp,"powMinColorcells",TCL_GLOBAL_ONLY), &powCells); if(force_cmap != 1 && ncolors >= powCells + free_cells) { /* enough colors , use default map */ /* First free the colors we got */ XFreeColors (disp, cmap, pixels, ncolors, 0); ckfree((void*)plane_masks); plane_masks = NULL; ckfree((void*)pixels); pixels = NULL; return Tcl_VarEval(interp, "toplevel ",toplevel, options,(char *)NULL); } else { /* not enough colors */ /* Free the colors we did get */ if(tfGotColors == True) { XFreeColors (disp, cmap, pixels, ncolors, 0); } tkwin = Tk_CreateWindowFromPath(interp,dotwin,".powCmap",NULL); if (tkwin == NULL) { (void)fprintf(stderr, "\n Couldn't create dummy window for PowSetupColormap\n"); return TCL_ERROR; } /* This prevents a seg-fault from occuring at a 'winfo class' command */ Tk_SetClass( tkwin, "PowCmapDmy" ); colormap_size = DisplayCells(disp,screenIndex); colors = (XColor*)ckalloc(colormap_size*sizeof(XColor)); for(i=0;ivisual , AllocNone); if (!cmap) { printf ("ERROR in PowSetupColormap: XCreateColormap returned %x\n", (unsigned int)cmap); return TCL_ERROR; } /* Not too sure of the purpose of all this... but it seems to be reserving part of the windows private colormap. Visu later grabs the necessary colors for the colormaps. So, for greater color range, need to reserve as little as possible here. That is what free_cells should be doing. (PDW 10/23/00) */ /* colormap_size = 212 - powCells - free_cells; */ colormap_size = free_cells; XAllocColorCells(disp,cmap,True,plane_masks,0,pixels,colormap_size); XStoreColors(disp,cmap,colors,colormap_size); ckfree((void*)plane_masks); plane_masks = NULL; ckfree((void*)pixels); pixels = NULL; ckfree((void*)colors); Tk_SetWindowColormap(tkwin,cmap); return Tcl_VarEval(interp, "toplevel ",toplevel, " -colormap .powCmap ",options,(char *)NULL); } #endif /* __WIN32__ || macintosh */ } int PowTestColormap(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[] ) { /* This routine returns the number of free colors in the colormap of the specified window */ #if defined(__WIN32__) || defined(macintosh) /* This routine does nothing in WIN32 or MacOS */ return TCL_OK; #else Tk_Window tkwin; Display *disp; Colormap cmap; unsigned long *pixels; unsigned long *plane_masks; char *window; int ncolors; Status status; Bool tfGotColors; /* True if we got colors from X */ if (argc != 2 ) { Tcl_SetResult(interp, "usage: powTestColormap window", TCL_VOLATILE); return TCL_ERROR; } window = ckalloc(strlen(argv[1])+1); strcpy(window,argv[1]); plane_masks = (unsigned long *) ckalloc(MAXPLANES*sizeof(unsigned long)); pixels = (unsigned long *) ckalloc(MAX_COLORS*sizeof(unsigned long)); if (plane_masks == NULL || pixels == NULL) { (void)fprintf(stderr, "\n Unable to allocate storage for PowTestColormap\n"); return TCL_ERROR; } /* find out some things about the screen*/ tkwin = Tk_NameToWindow(interp,window,Tk_MainWindow(interp)); disp = Tk_Display(tkwin); tfGotColors = False; cmap = Tk_Colormap(tkwin); ncolors = 256; while (ncolors > 0) { status = XAllocColorCells(disp,cmap,True,plane_masks,0,pixels,ncolors); if (status != 0) { tfGotColors = True; /* Success. Break out of the while loop */ break; } ncolors -= 1; /* Failure. Decrement request and try again */ } /* End of while loop */ /* First free the colors we got */ if (tfGotColors == True) { XFreeColors (disp, cmap, pixels, ncolors, 0); } ckfree((void*)plane_masks); plane_masks = NULL; ckfree((void*)pixels); pixels = NULL; sprintf(Tcl_GetStringResult(interp),"%i",ncolors); return TCL_OK; #endif /* __WIN32__ || macintosh */ } int PowSetupPhotoImages(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[] ) { int ncolors=256; int lut_start=0; int color_def; /*We're going to use the Colortable routines in VISU to setup our colortables and fake out the X stuff */ for (color_def=lut_start; color_defwidth; height = powImage->height; in_data = (powImage->dataptr)->data_array; data_type = (powImage->dataptr)->data_type; dithered_data_array = (unsigned char *)ckalloc(sizeof(char)*width*height); convert_block_to_byte(in_data,dithered_data_array,width*height,data_type, &disp_min, &disp_max); photo_image_array = (unsigned char *)ckalloc(3*sizeof(char)*width*height); inptr = dithered_data_array; outptr = photo_image_array; for (i=0; i> 8; *outptr++ = lut_colorcell_defs[col].green >> 8; *outptr++ = lut_colorcell_defs[col].blue >> 8; } } ckfree(dithered_data_array); photoBlock->pixelPtr = photo_image_array; return; } int PowGetHisto(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { /* usage: powGetHisto imageName */ PowImage *powImage; void *in_data; int data_type; int i; int histo1[MAX_LOOKUP], histo2[256], totalPix, level; double min, max; Tcl_Obj *list, *val; if(argc != 4) { Tcl_SetResult(interp, "usage: powGetHisto image min max", TCL_VOLATILE); return TCL_ERROR; } powImage = PowFindImage( Tcl_GetStringFromObj(argv[1], NULL) ); if( !powImage ) { Tcl_AppendResult( interp, "Unable to find image ", Tcl_GetStringFromObj(argv[1],NULL), (char*)NULL ); return TCL_ERROR; } Tcl_GetDoubleFromObj(interp, argv[2], &min); Tcl_GetDoubleFromObj(interp, argv[3], &max); totalPix = powImage->width * powImage->height; in_data = (powImage->dataptr)->data_array; data_type = (powImage->dataptr)->data_type; /* Calculate histogram */ convert_block_to_histo(in_data, totalPix, data_type, &min, &max, (unsigned int *) histo1); for( i=0; i<256; i++ ) histo2[i]=0; for( i=0; incolors, PowColorTable->lut_start, False, PowColorTable->red,PowColorTable->green,PowColorTable->blue, PowColorTable->intensity_lut, PowColorTable->red_lut,PowColorTable->green_lut, PowColorTable->blue_lut, interp, lut); } (*f)((Display*)NULL, (Colormap)0L, PowColorTable->ncolors, PowColorTable->lut_start, False, PowColorTable->red,PowColorTable->green,PowColorTable->blue, PowColorTable->intensity_lut, PowColorTable->red_lut,PowColorTable->green_lut, PowColorTable->blue_lut); return TCL_OK; } int PowPhotoCmapStretch( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[] ) { int cwid,clen; int x_lut[MAX_CLUT_LEN]; int y_lut[MAX_CLUT_LEN]; int i,j; int lut_size, nElem; int *p_lut; Tcl_Obj **lutElem; if( argc != 4 ) { Tcl_AppendResult(interp, "wrong # args: should be \"", Tcl_GetStringFromObj(argv[0],NULL), " cwid clen {x1 y1 x2 y2 ... }\"", (char *)NULL); return TCL_ERROR; } p_lut = PowColorTable->intensity_lut; lut_size = PowColorTable->ncolors; if( Tcl_GetIntFromObj(interp, argv[1], &cwid) != TCL_OK || Tcl_GetIntFromObj(interp, argv[2], &clen) != TCL_OK ) { Tcl_AppendResult(interp, "bad lookup table : should be \"", Tcl_GetStringFromObj(argv[0],NULL), " cwid clen {x1 y1 x2 y2 ... }\"", (char *) NULL); return TCL_ERROR; } if( Tcl_ListObjGetElements( interp, argv[3], &nElem, &lutElem ) != TCL_OK ) { Tcl_SetResult(interp,"Error reading LUT", TCL_VOLATILE); return TCL_ERROR; } if( nElem&0x1 ) { Tcl_SetResult(interp,"LUT must have an even number of elements", TCL_VOLATILE); return TCL_ERROR; } i = 0; j = 0; while( incolors, PowColorTable->lut_start, False, PowColorTable->red,PowColorTable->green,PowColorTable->blue, PowColorTable->intensity_lut, PowColorTable->red_lut,PowColorTable->green_lut, PowColorTable->blue_lut); return TCL_OK; } int PowImageScale( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[] ) { int x_lut[MAX_CLUT_LEN]; int y_lut[MAX_CLUT_LEN]; int i,j; int nElem; Tcl_Obj **lutElem, *values[2], *minmax; char *type; double scale, min, max; PowImage *powImage; void *in_data; unsigned int totalPix; int data_type; extern double lastLookupMin, lastLookupMax; if( argc < 2 ) { Tcl_AppendResult(interp, "wrong # args: should be \"", Tcl_GetStringFromObj(argv[0],NULL), " lut ?options ..?\"", (char *)NULL); return TCL_ERROR; } /* Reading a string LUT descriptor */ type = Tcl_GetStringFromObj( argv[1], NULL ); if( !strcmp(type, "linear") ) { for( i=0; iwidth) * (powImage->height); in_data = (powImage->dataptr)->data_array; data_type = (powImage->dataptr)->data_type; equalize_histo( in_data, data_type, totalPix, &min, &max ); lastLookupMin = min; lastLookupMax = max; values[0] = Tcl_NewDoubleObj( min ); values[1] = Tcl_NewDoubleObj( max ); minmax = Tcl_NewListObj( 2, values ); Tcl_SetObjResult( interp, minmax ); } else if( !strcmp(type, "model") ) { /* Reading a LUT array */ if( Tcl_ListObjGetElements( interp, argv[2], &nElem, &lutElem ) != TCL_OK ) { Tcl_AppendResult(interp, "Error reading LUT", (char*)NULL); return TCL_ERROR; } if( nElem<4 || nElem&0x1 ) { Tcl_SetResult(interp,"LUT must have an even number of elements >= 4", TCL_VOLATILE); return TCL_ERROR; } i = 0; j = 0; while( i=MAX_LOOKUP ) x_lut[i] = MAX_LOOKUP-1; if( y_lut[i]<0 ) y_lut[i] = 0; else if( y_lut[i]>255 ) y_lut[i] = 255; } build_lookup( x_lut, y_lut, j ); lastLookupMin = lastLookupMax = 0.0; } else { Tcl_SetResult(interp,"Unrecognized LUT type", TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowReditherPhotoBlock (ClientData clientData, Tcl_Interp *interp, int argc, char *argv[] ) { PowImage *image_instance; Tk_PhotoHandle photo_handle; Tk_PhotoImageBlock photo_block; double min, max; if (argc != 4) { Tcl_SetResult(interp, "usage: powReditherPhotoBlock imageName min max", TCL_VOLATILE); return TCL_ERROR; } if ((photo_handle = Tk_FindPhoto(interp,argv[1])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[1], "\" doesn't exist", (char *) NULL); return TCL_ERROR; } Tcl_GetDouble(interp, argv[2], &min); Tcl_GetDouble(interp, argv[3], &max); /* Tk_PhotoGetImage(photo_handle, &photo_block); */ image_instance = PowFindImage(argv[1]); PowDitherToPhoto(image_instance, &photo_block, min, max); photo_block.pixelSize = 3; photo_block.width = image_instance->width; photo_block.height = image_instance->height; photo_block.pitch = image_instance->width * 3; photo_block.offset[0] = 0; photo_block.offset[1] = 1; photo_block.offset[2] = 2; Tk_PhotoPutBlock(interp, photo_handle,&photo_block,0,0,image_instance->width,image_instance->height, TK_PHOTO_COMPOSITE_SET); ckfree(photo_block.pixelPtr); return TCL_OK; } fv5.4/tcltk/pow/PowCommands.c0000644000220700001010000025743012153447565015554 0ustar birbylheadev#include #include "pow.h" /* on some system , e.g. linux, SUNs DBL_MAX is in float.h */ #ifndef DBL_MAX #include #endif #ifndef DBL_MIN #include #endif #ifdef macintosh #include #endif typedef struct { double x,y; } Point; extern int Pow_Allocated; extern PictColorTable *PowColorTable; int PowCleanUp(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { #if !(defined(__WIN32__) || defined(macintosh)) /* Tcl_HashEntry *entry_ptr; Tcl_HashSearch search; PowData *data_instance; */ unsigned long *pixels; int i,j; #endif /*free the data arrays that belong to POW */ /* Actually, we're going to comment this out for now. With the hide/show graph capability, we never really dispose of a graph until the parent exits. So we'd better not trash the data */ /* for (entry_ptr = Tcl_FirstHashEntry(&PowDataTable,&search); entry_ptr != NULL; entry_ptr = Tcl_NextHashEntry(&search)) { data_instance = (PowData *)Tcl_GetHashValue(entry_ptr); if (data_instance->copy ) { ckfree(data_instance->data_array); } } */ #if !(defined(__WIN32__) || defined(macintosh)) if (Pow_Allocated != 0) { /*free the colorcells we snarfed up */ pixels = (unsigned long *)ckalloc(PowColorTable->ncolors* sizeof(unsigned long)); if( pixels == NULL ) return 0; for(j=PowColorTable->lut_start,i=0;incolors;i++,j++) pixels[i] = j; /* free colors */ XFreeColors(PowColorTable->display,PowColorTable->colormap, pixels,PowColorTable->ncolors,0); ckfree((void*)pixels); Pow_Allocated = 0; } #endif /*__WIN32__ || macintosh */ return TCL_OK; } int PowListGraphs(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { Tcl_HashEntry *entry_ptr; Tcl_HashSearch search; if (argc == 2) { if (Tcl_FindHashEntry(&PowGraphTable, argv[1]) != NULL) { Tcl_SetResult(interp,"1",TCL_VOLATILE); } else { Tcl_SetResult(interp,"0",TCL_VOLATILE); } return TCL_OK; } for (entry_ptr = Tcl_FirstHashEntry(&PowGraphTable,&search); entry_ptr != NULL; entry_ptr = Tcl_NextHashEntry(&search)) { Tcl_AppendElement(interp, Tcl_GetHashKey(&PowGraphTable, entry_ptr)); } return TCL_OK; } int PowListCurves(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { Tcl_HashEntry *entry_ptr; Tcl_HashSearch search; if (argc == 2) { if (Tcl_FindHashEntry(&PowCurveTable, argv[1]) != NULL) { Tcl_SetResult(interp,"1",TCL_VOLATILE); } else { Tcl_SetResult(interp,"0",TCL_VOLATILE); } return TCL_OK; } for (entry_ptr = Tcl_FirstHashEntry(&PowCurveTable,&search); entry_ptr != NULL; entry_ptr = Tcl_NextHashEntry(&search)) { Tcl_AppendElement(interp, Tcl_GetHashKey(&PowCurveTable, entry_ptr)); } return TCL_OK; } int PowListImages(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { Tcl_HashEntry *entry_ptr; Tcl_HashSearch search; if (argc == 2) { if (Tcl_FindHashEntry(&PowImageTable, argv[1]) != NULL) { Tcl_SetResult(interp,"1",TCL_VOLATILE); } else { Tcl_SetResult(interp,"0",TCL_VOLATILE); } return TCL_OK; } for (entry_ptr = Tcl_FirstHashEntry(&PowImageTable,&search); entry_ptr != NULL; entry_ptr = Tcl_NextHashEntry(&search)) { Tcl_AppendElement(interp, Tcl_GetHashKey(&PowImageTable, entry_ptr)); } return TCL_OK; } int PowListVectors(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { Tcl_HashEntry *entry_ptr; Tcl_HashSearch search; if (argc == 2) { if (Tcl_FindHashEntry(&PowVectorTable, argv[1]) != NULL) { Tcl_SetResult(interp,"1",TCL_VOLATILE); } else { Tcl_SetResult(interp,"0",TCL_VOLATILE); } return TCL_OK; } for (entry_ptr = Tcl_FirstHashEntry(&PowVectorTable,&search); entry_ptr != NULL; entry_ptr = Tcl_NextHashEntry(&search)) { Tcl_AppendElement(interp, Tcl_GetHashKey(&PowVectorTable, entry_ptr)); } return TCL_OK; } int PowListData(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { Tcl_HashEntry *entry_ptr; Tcl_HashSearch search; if (argc == 2) { if (Tcl_FindHashEntry(&PowDataTable, argv[1]) != NULL) { Tcl_SetResult(interp,"1",TCL_VOLATILE); } else { Tcl_SetResult(interp,"0",TCL_VOLATILE); } return TCL_OK; } for (entry_ptr = Tcl_FirstHashEntry(&PowDataTable,&search); entry_ptr != NULL; entry_ptr = Tcl_NextHashEntry(&search)) { Tcl_AppendElement(interp, Tcl_GetHashKey(&PowDataTable, entry_ptr)); } return TCL_OK; } int PowProcessCurve(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* calculate the list of points for powPlotCurve */ const char **bboxptr; const char **rbboxptr; double x0 , x1, y0, y1; double rx0 , rx1, ry0, ry1, ry, rx; double t_rx0 , t_rx1, t_ry0, t_ry1; /* to avoid point lossage due to roundoff errors on points that are near axes */ int n, i, xoff, yoff, xeoff, yeoff; PowCurve *curve_ptr; PowVector *x_vector, *y_vector, *x_error, *y_error; PowData *x_vect, *y_vect, *x_err, *y_err; double xmagstep, ymagstep, xinc, yinc, oldx, oldy; char PlotCommand[1024]; double x,y,xe,ye; int p1,p2,p3; int q1,q2,q3; int dflag,pflag,lflag; int lasti; lasti = 0; x_vect = NULL; y_vect = NULL; x_err = NULL; y_err = NULL; x_vector = NULL; y_vector = NULL; x_error = NULL; y_error = NULL; if(argc < 10 ) { Tcl_SetResult(interp, "usage: powProcessCurve curve bbox rbbox xinc yinc magstep tags canvas", TCL_VOLATILE); return TCL_ERROR; } curve_ptr = PowFindCurve(argv[1]); if ((curve_ptr->x_vector)!= NULL ) { x_vect = (curve_ptr->x_vector)->dataptr;} if ((curve_ptr->x_error)!= NULL) {x_err = (curve_ptr->x_error)->dataptr;} if ((curve_ptr->y_vector)!= NULL){ y_vect = (curve_ptr->y_vector)->dataptr;} if ((curve_ptr->y_error)!= NULL) {y_err = (curve_ptr->y_error)->dataptr;} xoff = 0; yoff = 0; xeoff = 0; yeoff = 0; if (x_vector != NULL) xoff = x_vector->offset; if (y_vector != NULL) yoff = y_vector->offset; if (x_error != NULL) xeoff = x_error->offset; if (y_error != NULL) yeoff = y_error->offset; Tcl_SplitList(interp,argv[2],&n,&bboxptr); if(n != 4) { Tcl_SetResult(interp, "bbox malformed", TCL_VOLATILE); return TCL_ERROR; } /* (x0,y0) -- lower left */ /* (x1,y1) -- upper right */ Tcl_GetDouble(interp,bboxptr[0],&x0); Tcl_GetDouble(interp,bboxptr[3],&y0); Tcl_GetDouble(interp,bboxptr[2],&x1); Tcl_GetDouble(interp,bboxptr[1],&y1); /* ckfree((void *)bboxptr);*/ Tcl_SplitList(interp,argv[3],&n,&rbboxptr); if(n != 4) { Tcl_SetResult(interp, "rbbox malformed", TCL_VOLATILE); return TCL_ERROR; } /* (x0,y0) -- lower left */ /* (x1,y1) -- upper right */ Tcl_GetDouble(interp,rbboxptr[0],&rx0); Tcl_GetDouble(interp,rbboxptr[3],&ry0); Tcl_GetDouble(interp,rbboxptr[2],&rx1); Tcl_GetDouble(interp,rbboxptr[1],&ry1); /*ckfree(rbboxptr);*/ Tcl_GetDouble(interp,argv[4],&xinc); Tcl_GetDouble(interp,argv[5],&yinc); Tcl_GetDouble(interp,argv[6],&xmagstep); ymagstep = xmagstep; if (rx0 <= rx1) { t_rx0 = rx0 - 3.0 * xinc; t_rx1 = rx1 + 3.0 * xinc; } else { t_rx1 = rx1 - 3.0 * xinc; t_rx0 = rx0 + 3.0 * xinc; } if (ry0 <= ry1) { t_ry0 = ry0 - 3.0 * yinc; t_ry1 = ry1 + 3.0 * yinc; } else { t_ry1 = ry1 - 3.0 * yinc; t_ry0 = ry0 + 3.0 * yinc; } pflag = 0; lflag = 0; if (strstr(argv[8],"Points")) { pflag = 1;} if (strstr(argv[8],"Line")) { lflag = 1;} if((x_err == NULL && y_err == NULL) || lflag ) { /* just draw a bunch of line segments */ dflag = 0; if (x_vect != NULL) { rx = PowExtractDatum(x_vect,xoff); } else { rx = 1.0; } if (y_vect != NULL) { ry = PowExtractDatum(y_vect,yoff); } else { ry = 1.0; } if (rx != DBL_MAX) { oldx = (rx - rx0)*xmagstep/xinc + x0; } else { oldx = DBL_MAX; } if (ry != DBL_MAX) { oldy = y0 - (ry - ry0)*ymagstep/yinc; } else { oldy = DBL_MAX; } for (i=0;ilength;i++) { rx++; ry++; if (x_vect != NULL) { rx = PowExtractDatum(x_vect,i+xoff); } if ((rx >= t_rx0 && rx <= t_rx1) || (rx >= t_rx1 && rx <= t_rx0) ) { x = (rx - rx0)*xmagstep/xinc + x0; if (y_vect != NULL) { ry = PowExtractDatum(y_vect,i+yoff); } if ((ry >= t_ry0 && ry <= t_ry1) || (ry >= t_ry1 && ry <= t_ry0) ) { y = y0 - (ry - ry0)*ymagstep/yinc; if (pflag) { /* if drawing points, make a little 7 pixel cross */ p1 = (int)(x + 3); p2 = (int)(x - 3); p3 = (int)(x); q1 = (int)(y + 3); q2 = (int)(y - 3); q3 = (int)(y); sprintf(PlotCommand," %d %d %d %d ",p2,q3,p1,q3); Tcl_VarEval(interp,argv[9]," create line ",PlotCommand,"-tags {",argv[7],"} ", (char *) NULL); sprintf(PlotCommand," %d %d %d %d ",p3,q2,p3,q1); Tcl_VarEval(interp,argv[9]," create line ",PlotCommand,"-tags {",argv[7],"} ", (char *) NULL); } if (dflag && lflag) { /* don't draw lines from points off the graph */ sprintf(PlotCommand," %.0f %.0f %.0f %.0f ",oldx,oldy,x,y); Tcl_VarEval(interp,argv[9]," create line ",PlotCommand,"-tags {",argv[7],"}", (char *) NULL); } dflag = 1; oldx = x; oldy = y; /*update every 100 points */ if (i - lasti > 100) { Tcl_Eval(interp,"update idletasks"); lasti = i; } } else { /* don't draw lines from points off the graph */ dflag = 0; } } } } else { /* plot points */ rx = 0.0; ry = 0.0; for (i=0;ilength;i++) { rx++; ry++; if (x_vect != NULL) { rx = PowExtractDatum(x_vect,i+xoff); } if ((rx >= t_rx0 && rx <= t_rx1) || (rx >= t_rx1 && rx <= t_rx0) ) { x = (rx-rx0)*xmagstep/xinc + x0; if (x_err != NULL) { xe = PowExtractDatum(x_err,i+xeoff)*xmagstep/xinc ; } else { xe = 0.0; } if (y_vect != NULL) { ry = PowExtractDatum(y_vect,i+yoff); } if ((ry >= t_ry0 && ry <= t_ry1) || (ry >= t_ry1 && ry <= t_ry0) ) { y = y0 - (ry - ry0)*ymagstep/yinc; if (y_err != NULL) { ye = PowExtractDatum(y_err,i+yeoff)*ymagstep/yinc ; } else { ye = 0.0; } p1 = (int)(x + xe); p2 = (int)(x - xe); p3 = (int)(x); q1 = (int)(y + ye); q2 = (int)(y - ye); q3 = (int)(y); sprintf(PlotCommand," %d %d %d %d ",p2,q3,p1,q3); Tcl_VarEval(interp,argv[9]," create line ",PlotCommand,"-tags {",argv[7],"} ", (char *) NULL); sprintf(PlotCommand," %d %d %d %d ",p3,q2,p3,q1); Tcl_VarEval(interp,argv[9]," create line ",PlotCommand,"-tags {",argv[7],"} ", (char *) NULL); /*update every 100 points */ if (i - lasti > 100) { Tcl_Eval(interp,"update idletasks"); lasti = i; } } } } } return TCL_OK; } int PowSetGraphMagstep(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { int status = TCL_OK; PowGraph *graph_ptr; if(argc != 4) { Tcl_SetResult(interp, "usage: powSetGraphMagstep graphname newxmagstep newymagstep", TCL_VOLATILE); return TCL_ERROR; } graph_ptr = PowFindGraph(argv[1]); if (graph_ptr == (PowGraph *) NULL) { Tcl_SetResult(interp, "Couldn't find graph.", TCL_VOLATILE); return TCL_ERROR; } status = Tcl_GetDouble(interp,argv[2],&(graph_ptr->xmagstep)); if( status==TCL_OK ) status = Tcl_GetDouble(interp,argv[3],&(graph_ptr->ymagstep)); return status; } int PowGetImageOrigin(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { PowImage *image_ptr; char longStr[1024]; if(argc != 3) { Tcl_SetResult(interp, "wrong # args", TCL_VOLATILE); return TCL_ERROR; } image_ptr = PowFindImage(argv[1]); if (image_ptr == (PowImage *) NULL) { Tcl_SetResult(interp, "Couldn't find image.", TCL_VOLATILE); return TCL_ERROR; } switch (*argv[2]) { case 'X': sprintf(longStr,"%le", image_ptr->xorigin); Tcl_SetResult(interp, longStr, TCL_OK); break; case 'Y': sprintf(longStr,"%le", image_ptr->yorigin); Tcl_SetResult(interp, longStr, TCL_OK); break; default: Tcl_SetResult(interp, "No such image axis (must be X or Y)", TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowGetImageOtherend(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { PowImage *image_ptr; char longStr[1024]; if(argc != 3) { Tcl_SetResult(interp, "wrong # args", TCL_VOLATILE); return TCL_ERROR; } image_ptr = PowFindImage(argv[1]); if (image_ptr == (PowImage *) NULL) { Tcl_SetResult(interp, "Couldn't find image.", TCL_VOLATILE); return TCL_ERROR; } switch (*argv[2]) { case 'X': sprintf(longStr,"%le", image_ptr->xotherend); Tcl_SetResult(interp, longStr, TCL_OK); break; case 'Y': sprintf(longStr,"%le", image_ptr->yotherend); Tcl_SetResult(interp, longStr, TCL_OK); break; default: Tcl_SetResult(interp, "No such image axis (must be X or Y)", TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowGetImageUnits(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { PowImage *image_ptr; char longStr[1024]; if(argc != 3) { Tcl_SetResult(interp, "wrong # args", TCL_VOLATILE); return TCL_ERROR; } image_ptr = PowFindImage(argv[1]); if (image_ptr == (PowImage *) NULL) { Tcl_SetResult(interp, "Couldn't find image.", TCL_VOLATILE); return TCL_ERROR; } switch (*argv[2]) { case 'X': sprintf(longStr,"%s", image_ptr->xunits); Tcl_SetResult(interp, longStr, TCL_OK); break; case 'Y': sprintf(longStr,"%s", image_ptr->yunits); Tcl_SetResult(interp, longStr, TCL_OK); break; case 'Z': sprintf(longStr,"%s", image_ptr->zunits); Tcl_SetResult(interp, longStr, TCL_OK); break; default: Tcl_SetResult(interp, "No such image axis (must be X or Y or Z)", TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowGetImageZ( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[] ) { char *imgName; PowImage *image_ptr; int x,y; double datum; #ifdef __WIN32__ __int64 datumL; #else long long datumL; #endif Tcl_Obj *res; char longStr[1024]; if(argc != 4) { Tcl_SetResult( interp, "usage: powGetImageZ image X Y", TCL_VOLATILE ); return TCL_ERROR; } imgName = Tcl_GetStringFromObj( argv[1], NULL ); image_ptr = PowFindImage( imgName ); if (image_ptr == (PowImage *) NULL) { Tcl_AppendResult(interp, "Couldn't find image: ",imgName, NULL); return TCL_ERROR; } Tcl_GetIntFromObj(interp,argv[2],&x); Tcl_GetIntFromObj(interp,argv[3],&y); datum = PowExtractDatum(image_ptr->dataptr,y * image_ptr->width + x); if ( image_ptr->dataptr->data_type == STRING_DATA ) { if ( datum >= DBL_MAX ) { datumL = PowExtractDatumLong(image_ptr->dataptr,y * image_ptr->width + x); if (datumL >= LONGLONG_MAX || datumL <= -1 * LONGLONG_MAX) { res = Tcl_NewStringObj( "NULL", -1 ); } else { #ifdef __WIN32__ sprintf(longStr, "%I64d", datumL); #else sprintf(longStr, "%lld", datumL); #endif res = Tcl_NewStringObj( longStr, -1 ); } } else { res = Tcl_NewDoubleObj( datum ); } } else { if (datum >= DBL_MAX || datum <= -1 * DBL_MAX) { res = Tcl_NewStringObj( "NULL", -1 ); } else { res = Tcl_NewDoubleObj( datum ); } } Tcl_SetObjResult( interp, res ); return TCL_OK; } int PowTestMacMemory( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[] ) { int enoughMemory = 1; #if !(defined(__WIN32__) || defined(macintosh)) int npixels; long dmy, appMem, appBlock, tmpBlock, tmpMem; #endif #ifdef macintosh /* This routine makes Mac-specific tests for the amount of memory left */ if(argc != 2) { Tcl_SetResult( interp, "usage: powTestMacMemory npixels", TCL_VOLATILE ); return TCL_ERROR; } Tcl_GetIntFromObj(interp,argv[1],&npixels); PurgeSpace( &appMem, &appBlock ); tmpBlock = TempMaxMem(&dmy); dmy = MaxBlockSys(); if( dmy>tmpBlock ) tmpBlock=dmy; tmpMem = FreeMemSys() + TempFreeMem(); dmy = tmpMem + tmpBlock; if ( appMem + tmpMem < 12*npixels + 2048000 || ( tmpBlock < 6*npixels && appBlock < 6*npixels ) ) { enoughMemory = 0; } #endif Tcl_SetObjResult( interp, Tcl_NewIntObj( enoughMemory ) ); return TCL_OK; } int PowPutZoomedBlock(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* calls the VISU routine Tk_PictPutZoomedBlock or Tk_PhotoPutZoomedBlock*/ /* this is a low level routine */ /* don't call it yourself, unless you're rewriting POW */ /* usage: powPutZoomedBlock imageName graphName x y width height zoomX zoomY */ /* Note, the x and y refer to the source, not the target block */ char imageName[1024] = "",graphName[1024] = "",dispImageName[1024] = ""; int xpix, ypix, width,height; double x,y; double zoomX, zoomY, Xoff, Yoff; Tk_PhotoHandle photo_handle, photo_disphandle; Tk_PhotoImageBlock photo_block; int pseudoImages; PowImage *image_instance; #if !(defined(__WIN32__) || defined(macintosh)) Tk_PictHandle pict_handle, pict_disphandle; Tk_PictImageBlock pict_block; #endif Tcl_GetInt(interp,Tcl_GetVar(interp,"powPseudoImages",TCL_GLOBAL_ONLY), &pseudoImages); if (argc != 9) { Tcl_SetResult(interp, "usage: powPutZoomedBlock imageName graphName x y width height zoomX zoomY\nYou probably shouldn't be seeing this.", TCL_VOLATILE); return TCL_ERROR; } strcpy(imageName,argv[1]); strcpy(graphName,argv[2]); Tcl_GetDouble(interp,argv[3],&x); Tcl_GetDouble(interp,argv[4],&y); Tcl_GetInt(interp,argv[5],&width); Tcl_GetInt(interp,argv[6],&height); Tcl_GetDouble(interp,argv[7],&zoomX); Tcl_GetDouble(interp,argv[8],&zoomY); if( pseudoImages ) { #if !(defined(__WIN32__) || defined(macintosh)) /* use Pict widget (Visu) */ if ((pict_handle = Tk_FindPict(imageName)) == NULL) { Tcl_AppendResult(interp, "image \"", imageName, "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } xpix = (int)(x+0.5); ypix = (int)(y+0.5); Xoff = (xpix-x+0.5) * zoomX; Yoff = (ypix-y+0.5) * zoomY; Tk_PictGetImage(pict_handle,&pict_block); pict_block.pixelPtr = pict_block.pixelPtr + ypix * pict_block.pitch * pict_block.pixelSize + xpix * pict_block.pixelSize; strcat(dispImageName,imageName); strcat(dispImageName,"disp"); strcat(dispImageName,graphName); if ((pict_disphandle = Tk_FindPict(dispImageName)) == NULL) { Tcl_AppendResult(interp, "image \"", imageName, "\" doesn't", "have a displayed instance on graph \"", graphName, "\"", (char *) NULL); return TCL_ERROR; } Tk_PictPutScaledBlock(pict_disphandle,&pict_block,0,0,width,height, zoomX, zoomY, Xoff, Yoff); return TCL_OK; #else Tcl_AppendResult(interp,"You should not see this",NULL); return TCL_ERROR; #endif /*__WIN32__ || macintosh*/ } else { /* use Photo widget */ if ((photo_handle = Tk_FindPhoto(interp,imageName)) == NULL) { Tcl_AppendResult(interp, "image \"", imageName, "\" doesn't exist", (char *) NULL); return TCL_ERROR; } Tk_PhotoGetImage(photo_handle,&photo_block); strcat(dispImageName,imageName); strcat(dispImageName,"disp"); strcat(dispImageName,graphName); if ((photo_disphandle = Tk_FindPhoto(interp,dispImageName)) == NULL) { Tcl_AppendResult(interp, "image \"", imageName, "\" doesn't", "have a displayed instance on graph \"", graphName, "\"", (char *) NULL); return TCL_ERROR; } image_instance = PowFindImage(imageName); xpix = (int)(x+0.5); Xoff = (xpix-x+0.5) * zoomX; y += (height-1)/zoomY; ypix = (int)(y+0.5); Yoff = ( (y+0.5) - ypix ) * zoomY + 1.0; if( Yoff>zoomY ) Yoff = zoomY; photo_block.pixelPtr = photo_block.pixelPtr + (image_instance->height - 1 - ypix) * photo_block.pitch + xpix * photo_block.pixelSize; Pow_PhotoPutScaledBlock(photo_disphandle,&photo_block,0,0,width,height, zoomX, zoomY, Xoff, Yoff ); return TCL_OK; } } int PowDestroyData_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powDestroyData data_name*/ int status=0; if (argc != 2) { Tcl_SetResult(interp,"usage: powDestroyData data_name",TCL_VOLATILE); return TCL_ERROR; } PowDestroyData(argv[1],&status); if (status != 0) { /* Result already set to error message by PowDestroyData*/ return TCL_ERROR; } return TCL_OK; } int PowCloneData(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /*usage: powCloneData new_data_name old_data_name ?offset? ?length? ?copy?*/ int data_type,length,status = 0; void *databuff; int copy, offset; PowData *old_data; if(argc < 3 || argc > 6) { Tcl_SetResult(interp, "usage: powCloneData new_data_name old_data_name ?offset? ?length? ?copy?", TCL_VOLATILE); return TCL_ERROR; } old_data = PowFindData(argv[2]); if (old_data == NULL) { Tcl_SetResult(interp,"Couldn't find data: ",TCL_VOLATILE); Tcl_AppendResult(interp,argv[2],(char *)NULL); return TCL_ERROR; } if (argc > 3) { Tcl_GetInt(interp,argv[3],&offset); } else { offset = 0; } if (argc <= 4 || strstr(argv[4],"NULL") != NULL ) { length = old_data->length; } else { Tcl_GetInt(interp,argv[4],&length); } /* don't allow the new data object to run off the end of the old */ if (length + offset > old_data->length) { length = old_data->length - offset; } if (argc > 5) { copy = Tcl_GetInt(interp,argv[5],©); } else { copy = 0; } if (copy < 0 && offset != 0) { Tcl_SetResult(interp,"Can't clone data with nonzero offset!",TCL_VOLATILE); return TCL_ERROR; } data_type = old_data->data_type; databuff = (void *)((char *)old_data->data_array + offset * pixelSizes[data_type]); PowCreateData(argv[1],databuff,&data_type,&length,©,&status); if(status != 0) { Tcl_SetResult(interp,"powCloneData failed",TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowCreateDataFlip_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* this is the TCL wrapper for the PowCreateDataFlip routine. */ /* the pointer to the data should be converted using sprintf(PTRFORMAT,pointer) */ int status = 0; char *direction; int height, width; if(argc < 3) { Tcl_SetResult(interp,"usage: powCreateDataFlip data_name direction height width",TCL_VOLATILE); return TCL_ERROR; } direction = argv[2]; Tcl_GetInt(interp,argv[3],&height); Tcl_GetInt(interp,argv[4],&width); PowCreateDataFlip(argv[1], direction, &height, &width, &status); if(status != 0) { Tcl_SetResult(interp, "Couldn't flip data.", TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowCreateCurveFlip_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* this is the TCL wrapper for the PowCreateCurveFlip routine. */ /* the pointer to the data should be converted using sprintf(PTRFORMAT,pointer) */ PowGraph *graph; int status = 0; char *direction; char *graphName; const char *canvas; double x, y; Point bbox_ll, bbox_ur; int i; char cmdLine[1024]; const char **list; if(argc < 3) { Tcl_SetResult(interp,"usage: powCreateCurveFlip data_name canvas direction",TCL_VOLATILE); return TCL_ERROR; } graphName = argv[1]; canvas = argv[2]; direction = argv[3]; graph = PowFindGraph(graphName); sprintf(cmdLine, "%s coords %sbox", canvas, graphName ); if ( Tcl_Eval(interp,cmdLine)!=TCL_OK ) { Tcl_SetResult(interp,"Couldn't get bounding box", TCL_VOLATILE); return TCL_ERROR; } strncpy(cmdLine,Tcl_GetStringResult(interp),256); Tcl_SplitList(interp,cmdLine,&i,&list); Tcl_GetDouble(interp,list[0],&(bbox_ll.x)); Tcl_GetDouble(interp,list[1],&(bbox_ur.y)); Tcl_GetDouble(interp,list[2],&(bbox_ur.x)); Tcl_GetDouble(interp,list[3],&(bbox_ll.y)); ckfree((char *) list); PowPixToPos(bbox_ll.x, bbox_ll.y, &graph->WCS, &x, &y); PowCreateCurveFlip(graphName, direction, &status); if(status != 0) { Tcl_SetResult(interp, "Couldn't flip Curve data.", TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowCreateData_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powCreateData data_name data_pointer data_type length ?copy? */ /* this is the TCL wrapper for the PowCreateData routine. */ /* the pointer to the data should be converted using sprintf(PTRFORMAT,pointer) */ int data_type,length,status = 0; void *databuff; int copy; if(argc < 5) { Tcl_SetResult(interp,"usage: powCreateData data_name data_pointer data_type length ?copy?",TCL_VOLATILE); return TCL_ERROR; } if(strstr(argv[3],"BYTE") != NULL){ data_type = BYTE_DATA; } else if (strstr(argv[3],"SHORTINT") != NULL) { data_type = SHORTINT_DATA ; } else if (strstr(argv[3],"INT") != NULL) { data_type = INT_DATA ; } else if (strstr(argv[3],"REAL") != NULL) { data_type = REAL_DATA ; } else if (strstr(argv[3],"FLOAT") != NULL) { data_type = REAL_DATA ; } else if (strstr(argv[3],"DOUBLE") != NULL) { data_type = DOUBLE_DATA; } else { Tcl_GetInt(interp,argv[3],&data_type); } Tcl_GetInt(interp,argv[4],&length); if (sscanf(argv[2],PTRFORMAT,&databuff) != 1) { Tcl_SetResult(interp, "Couldn't parse data address into an integer", TCL_VOLATILE); return TCL_ERROR; } if (argc == 6) { Tcl_GetInt(interp,argv[5],©); } else { copy = 0; } PowCreateData(argv[1],databuff,&data_type,&length,©,&status); if(status != 0) { Tcl_SetResult(interp, "Couldn't create data.", TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowFindData_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /*This is a wrapper on PowFindData to see if image data exists */ PowData *powdatabuff; if (argc != 2) { Tcl_SetResult(interp,"usage: powFindData data_name",TCL_VOLATILE); return TCL_ERROR; } powdatabuff = PowFindData(argv[1]); if (powdatabuff == (PowData *)NULL ) { return TCL_ERROR; } return TCL_OK; } int PowRegisterData_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /*This is for people who create their PowData objects outside of pow */ /*(e.g. users of the LHEA orbit libraries) but then want to import them */ /*into POW. */ PowData *powdatabuff; int status=0; if(argc != 2) { Tcl_SetResult(interp,"usage: powRegisterData PowData_pointer",TCL_VOLATILE); return TCL_ERROR; } if (sscanf(argv[1],PTRFORMAT,&powdatabuff) != 1) { Tcl_SetResult(interp, "Couldn't parse powdata address into an integer", TCL_VOLATILE); return TCL_ERROR; } PowRegisterData(powdatabuff,&status); if (status != 0) { Tcl_SetResult(interp,"Couldn't register powdata.",TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowDestroyImage_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powDestroyImage image_name*/ int status=0; if (argc != 2) { Tcl_SetResult(interp,"usage: powDestroyImage image_name",TCL_VOLATILE); return TCL_ERROR; } PowDestroyImage(argv[1],&status); if (status != 0) { /* Result already set to error message by PowDestroyImage*/ return TCL_ERROR; } return TCL_OK; } int PowCreateImage_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powCreateImage image_name data_name xoffset yoffset\ */ /* width height xorigin xinc yorigin yinc xunits yunits zunits */ /* this is the TCL wrapper for the PowCreateImage routine. */ int xoffset,yoffset,width,height,status=0; double xorigin,xinc,yorigin,yinc; if(argc != 14) { Tcl_SetResult(interp, "usage: powCreateImage image_name data_name xoffset yoffset\\\n width height xorigin xinc yorigin yinc xunits yunits zunits", TCL_VOLATILE); return TCL_ERROR; } Tcl_GetInt(interp,argv[3],&xoffset); Tcl_GetInt(interp,argv[4],&yoffset); Tcl_GetInt(interp,argv[5],&width); Tcl_GetInt(interp,argv[6],&height); Tcl_GetDouble(interp,argv[7],&xorigin); Tcl_GetDouble(interp,argv[8],&xinc); Tcl_GetDouble(interp,argv[9],&yorigin); Tcl_GetDouble(interp,argv[10],&yinc); /* fprintf(stdout, "PowCommands before calling PowCreateImage\n"); */ /* fprintf(stdout, "xoffset: %f\n", xoffset);*/ /* fprintf(stdout, "yoffset: %f\n", yoffset);*/ /* fprintf(stdout, "width: %f\n", width);*/ /* fprintf(stdout, "height: %f\n", height);*/ /* fprintf(stdout, "xorigin: %f\n", xorigin);*/ /* fprintf(stdout, "yorigin: %f\n", yorigin);*/ /* fprintf(stdout, "xinc: %f\n", xinc);*/ /* fprintf(stdout, "yinc: %f\n", yinc);*/ /* fprintf(stdout, "argv[11]: %s\n", argv[11]);*/ /* fprintf(stdout, "argv[12]: %s\n", argv[12]);*/ /* fprintf(stdout, "argv[13]: %s\n", argv[13]);*/ /* fprintf(stdout, "status: %d\n", status);*/ PowCreateImage(argv[1],argv[2],&xoffset,&yoffset,&width,&height, &xorigin,&xinc,&yorigin,&yinc,argv[11],argv[12], argv[13],&status); /* fprintf(stdout, "xoffset: %f\n", xoffset);*/ /* fprintf(stdout, "yoffset: %f\n", yoffset);*/ /* fprintf(stdout, "width: %f\n", width);*/ /* fprintf(stdout, "height: %f\n", height);*/ /* fprintf(stdout, "xorigin: %f\n", xorigin);*/ /* fprintf(stdout, "yorigin: %f\n", yorigin);*/ /* fprintf(stdout, "xinc: %f\n", xinc);*/ /* fprintf(stdout, "yinc: %f\n", yinc);*/ /* fprintf(stdout, "argv[11]: %s\n", argv[11]);*/ /* fprintf(stdout, "argv[12]: %s\n", argv[12]);*/ /* fprintf(stdout, "argv[13]: %s\n", argv[13]);*/ /* fprintf(stdout, "status: %d\n", status);*/ /* fprintf(stdout, "done calling PowCommands\n"); */ if(status != 0) { Tcl_SetResult(interp, "Couldn't create image.", TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowDestroyVector_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powDestroyVector vector_name*/ int status=0; if (argc != 2) { Tcl_SetResult(interp,"usage: powDestroyVector vector_name",TCL_VOLATILE); return TCL_ERROR; } PowDestroyVector(argv[1],&status); if (status != 0) { /* Result already set to error message by PowDestroyVector*/ return TCL_ERROR; } return TCL_OK; } int PowCreateVector_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powCreateVector vector_name data_name offset length\ */ /* units */ /* this is the TCL wrapper for the PowCreateVector routine. */ int offset,status=0; int *length; if(argc != 6) { Tcl_SetResult(interp, "usage: powCreateVector vector_name data_name offset length units", TCL_VOLATILE); return TCL_ERROR; } Tcl_GetInt(interp,argv[3],&offset); if ( strstr(argv[4],"NULL") == NULL ) { length = (int *) ckalloc(sizeof(int)); Tcl_GetInt(interp,argv[4],length); } else { length = NULL; } PowCreateVector(argv[1],argv[2],&offset,length,argv[5],&status); if(status != 0) { Tcl_SetResult(interp, "Couldn't create vector.", TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowDestroyCurve_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powDestroyCurve curve_name*/ int status=0; if (argc != 2) { Tcl_SetResult(interp,"usage: powDestroyCurve curve_name",TCL_VOLATILE); return TCL_ERROR; } PowDestroyCurve(argv[1],&status); if (status != 0) { /* Result already set to error message by PowDestroyCurve*/ return TCL_ERROR; } return TCL_OK; } int PowCreateCurve_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powCreateCurve curve_name x_vector x_error y_vector y_error\ */ /* */ /* this is the TCL wrapper for the PowCreateVector routine. */ char *z_vector, *z_error; int status=0; if(argc < 6 || argc == 7) { Tcl_SetResult(interp, "usage: powCreateCurve curve_name x_vector x_error y_vector y_error ", TCL_VOLATILE); return TCL_ERROR; } if(argc == 6) { z_vector = ckalloc(sizeof("NULL")); strcpy(z_vector,"NULL"); z_error = ckalloc(sizeof("NULL")); strcpy(z_error,"NULL"); } else { z_vector = argv[6]; z_error = argv[7]; } PowCreateCurve(argv[1],argv[2],argv[3],argv[4],argv[5],z_vector,z_error,&status); if(status != 0) { Tcl_SetResult(interp, "Couldn't create curve.", TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowCreateVectorEN_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powCreateVectorEN vector_name data_name length start increment units */ /* this is the TCL wrapper for the PowCreateVector routine. */ int length,status=0; double start,increment; PowData *data_instance; char ptrString[40]; if(argc != 7) { Tcl_SetResult(interp, "usage: powCreateVectorEN vector_name data_name length start increment units", TCL_VOLATILE); return TCL_ERROR; } Tcl_GetInt(interp,argv[3],&length); Tcl_GetDouble(interp,argv[4],&start); Tcl_GetDouble(interp,argv[5],&increment); PowCreateVectorEN(argv[1],argv[2],&length,&start,&increment,argv[6],&status); if(status != 0) { Tcl_SetResult(interp, "Couldn't create vector.", TCL_VOLATILE); return TCL_ERROR; } data_instance = PowFindData(argv[1]); /*Return the string representation of the PowData pointer */ sprintf(ptrString,PTRFORMAT,data_instance); Tcl_SetResult(interp,ptrString,TCL_VOLATILE); return TCL_OK; } int PowDataPtr_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { /* usage: powDataPtr data_name */ PowData *data_instance; char ptrString[40]; if(argc != 2) { Tcl_SetResult(interp, "usage: powDataPtr data_name", TCL_VOLATILE); return TCL_ERROR; } data_instance = PowFindData( Tcl_GetStringFromObj( argv[1], NULL ) ); /*Return the string representation of the PowData pointer */ sprintf(ptrString,PTRFORMAT,data_instance); Tcl_SetResult(interp,ptrString,TCL_VOLATILE); return TCL_OK; } int PowCreateHisto_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powCreateHisto histo_name x_vector y_vector */ /* this is the TCL wrapper for the PowCreateHisto routine. */ int status=0; if(argc != 4) { Tcl_SetResult(interp, "usage: powCreateHisto histo_name x_vector y_vector", TCL_VOLATILE); return TCL_ERROR; } PowCreateHisto(argv[1],argv[2],argv[3],&status); if(status != 0) { Tcl_SetResult(interp, "Couldn't create histo.", TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowDestroyGraph_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powDestroyGraph graph_name*/ int status=0; if (argc != 2) { Tcl_SetResult(interp,"usage: powDestroyGraph graph_name",TCL_VOLATILE); return TCL_ERROR; } PowDestroyGraph(argv[1],&status); if (status != 0) { /* Result already set to error message by PowDestroyGraph*/ return TCL_ERROR; } return TCL_OK; } int PowCreateGraph_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powCreateGraph graph_name curves images xunits yunits xlabel\ */ /* ylabel xdimdisp ydimdisp */ /* this is the TCL wrapper for the PowCreateImage routine. */ int xdimdisp,ydimdisp,*pxdimdisp,*pydimdisp,status=0; double rxdimdisp,rydimdisp; double xmin,xmax,ymin,ymax; double *pxmin,*pxmax,*pymin,*pymax; char *whichPowCanvas; Tcl_DString errMsg; pxmin = &xmin; pxmax = &xmax; pymin = &ymin; pymax = &ymax; pxdimdisp = &xdimdisp; pydimdisp = &ydimdisp; if(argc < 8) { Tcl_SetResult(interp, "usage: powCreateGraph graph_name curves images xunits yunits xlabel\\\n ylabel ?xdimdisp ydimdisp xmin ymin xmax ymax? ", TCL_VOLATILE); return TCL_ERROR; } if( argc > 8 && strstr(argv[8],"NULL") == NULL ) { if( Tcl_GetDouble(interp,argv[8],&rxdimdisp)!=TCL_OK ) { pxdimdisp = NULL; } else { xdimdisp = (int) ceil(rxdimdisp); } } else { pxdimdisp = NULL; } if( argc > 9 && strstr(argv[9],"NULL") == NULL ) { if( Tcl_GetDouble(interp,argv[9],&rydimdisp)!=TCL_OK ) { pydimdisp = NULL; } else { ydimdisp = (int) ceil(rydimdisp); } } else { pydimdisp = NULL; } if (argc >= 11 && (strstr(argv[10],"NULL") == NULL)) { Tcl_GetDouble(interp,argv[10],pxmin); } else { pxmin = NULL; } if (argc >= 12 && (strstr(argv[11], "NULL") == NULL)) { Tcl_GetDouble(interp,argv[11],pymin); } else { pymin = NULL; } if (argc >= 13 && (strstr(argv[12], "NULL") == NULL)) { Tcl_GetDouble(interp,argv[12],pxmax); } else { pxmax = NULL; } if (argc >= 14 && (strstr(argv[13],"NULL") == NULL)) { Tcl_GetDouble(interp,argv[13],pymax); } else { pymax = NULL; } /* set global whichPowCanvas variable (only used internally to implement "scope" window, *not* for public usage at this time) */ if (argc >=15 && (strstr(argv[14],"NULL") == NULL)) { whichPowCanvas=(char *) ckalloc((strlen(argv[14])+1)*sizeof(char)); strcpy(whichPowCanvas,argv[14]); } else { whichPowCanvas=(char *) ckalloc(sizeof(".pow.pow")); strcpy(whichPowCanvas,".pow.pow"); } /* This can take a while, so set POW's cursor to a watch */ Tcl_GlobalEval(interp, "powSetCursor watch"); PowCreateGraph_internal( argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], pxdimdisp, pydimdisp, pxmin, pymin, pxmax, pymax, whichPowCanvas, &status); if( status ) { Tcl_DStringInit(&errMsg); Tcl_DStringGetResult(interp, &errMsg); } Tcl_GlobalEval(interp, "powSetCursor reset"); ckfree(whichPowCanvas); if( status ) { Tcl_DStringAppend( &errMsg, "\nCouldn't create graph", -1 ); Tcl_DStringResult( interp, &errMsg ); return TCL_ERROR; } return TCL_OK; } int PowTestImage(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[] ) { /*******************************************************/ /* Test new image with old graph for WCS consistency */ /*******************************************************/ PowGraph *graph; PowImage *image; double xorigin, yorigin, xotherend, yotherend, xcorner, ycorner; if( argc != 3 ) { Tcl_SetResult( interp, "Usage: powTestImage gn image", TCL_VOLATILE ); return TCL_ERROR; } graph = PowFindGraph( Tcl_GetStringFromObj( argv[1], NULL ) ); image = PowFindImage( Tcl_GetStringFromObj( argv[2], NULL ) ); if( graph==NULL || image==NULL ) return TCL_ERROR; /*************************************************************/ /* Convert origin and otherend info into pixel coordinates */ /*************************************************************/ if( PowPosToPix( image->xorigin, image->yorigin, &graph->WCS, &xorigin, &yorigin ) ) return TCL_ERROR; if( PowPosToPix( image->xotherend, image->yotherend, &graph->WCS, &xotherend, &yotherend ) ) return TCL_ERROR; if( (graph->WCS.type[0]!='\0') != (image->WCS.type[0]!='\0') ) { Tcl_SetResult(interp,"WCS state of graph and image differ", TCL_VOLATILE); return TCL_ERROR; } /*************************************************/ /* We are in pixel coordinates, so they should */ /* ALWAYS go from left->right */ /*************************************************/ if( xorigin > xotherend || yorigin > yotherend ) { /* fprintf(stdout, "-------> xorigin: <%20.15f>, xotherend: <%20.15f>\n", xorigin, xotherend); fprintf(stdout, "-------> yorigin: <%20.15f>, yotherend: <%20.15f>\n", yorigin, yotherend); fflush(stdout); */ Tcl_SetResult(interp,"New image does not point in same direction", TCL_VOLATILE); return TCL_ERROR; } /***************************************************/ /* Images must project to an unrotated rectangle */ /***************************************************/ if( PowPixToPos( -0.5, image->height-0.5, &image->WCS, &xcorner, &ycorner ) ) return TCL_ERROR; if( PowPosToPix( xcorner, ycorner, &graph->WCS, &xcorner, &ycorner ) ) return TCL_ERROR; if( fabs( xcorner-xorigin ) > 1.0 || fabs( ycorner-yotherend ) > 1.0 ) { Tcl_SetResult(interp, "Graph and image have different rotation angles.", TCL_VOLATILE); return TCL_ERROR; } if( PowPixToPos( image->width-0.5, -0.5, &image->WCS, &xcorner, &ycorner ) ) return TCL_ERROR; if( PowPosToPix( xcorner, ycorner, &graph->WCS, &xcorner, &ycorner ) ) return TCL_ERROR; if( fabs( xcorner-xotherend ) > 1.0 || fabs( ycorner-yorigin ) > 1.0 ) { Tcl_SetResult(interp, "Graph and image have different rotation angles.", TCL_VOLATILE); return TCL_ERROR; } return TCL_OK; } int PowFetchCurveInfoHash(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powFetchVectorHash curvename */ /* used by the vector edit window to fetch component vector names */ PowCurve *curve_ptr; if(argc != 2) { Tcl_SetResult(interp, "usage: powFetchVectorHash curvename", TCL_VOLATILE); return TCL_ERROR; } curve_ptr = PowFindCurve(argv[1]); if (curve_ptr == (PowCurve *) NULL) { Tcl_SetResult(interp,"Couldn't find curve.",TCL_VOLATILE); return TCL_ERROR; } Tcl_SetResult(interp,"X",TCL_VOLATILE); if (curve_ptr->x_vector) { Tcl_AppendResult(interp," ", (curve_ptr->x_vector)->vector_name,(char *)NULL); } else { Tcl_AppendResult(interp," NULL",(char *)NULL); } if (curve_ptr->x_error) { Tcl_AppendResult(interp," XE ", (curve_ptr->x_error)->vector_name,(char *)NULL); } else { Tcl_AppendResult(interp," XE NULL",(char *)NULL); } if (curve_ptr->y_vector) { Tcl_AppendResult(interp," Y ", (curve_ptr->y_vector)->vector_name,(char *)NULL); } else { Tcl_AppendResult(interp," Y NULL",(char *)NULL); } if (curve_ptr->y_error) { Tcl_AppendResult(interp," YE ", (curve_ptr->y_error)->vector_name,(char *)NULL); } else { Tcl_AppendResult(interp," YE NULL",(char *)NULL); } return TCL_OK; } int PowFetchDataLength(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powFetchDataLength data_name */ /* used by the data edit window to fetch data structure fields */ PowData *data_ptr; char length_str[22]; if(argc != 2) { Tcl_SetResult(interp, "usage: powFetchDataLength dataname", TCL_VOLATILE); return TCL_ERROR; } data_ptr = PowFindData(argv[1]); if (data_ptr == (PowData *) NULL) { Tcl_SetResult(interp,"Couldn't find data: ",TCL_VOLATILE); Tcl_AppendResult(interp,argv[1],(char *)NULL); return TCL_ERROR; } sprintf(length_str,"%d",data_ptr->length); Tcl_SetResult(interp,length_str,TCL_VOLATILE); return TCL_OK; } int PowExprDataInfo(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[] ) { /* usage: NONE! This is a callback function to be used in */ /* conjunction with the fitsTcl vector expression calculator. */ /* It locates the powData object being referenced and returns */ /* A pointer to the data, the datatype, and the data length. */ PowData *data_ptr; Tcl_Obj *res[4]; char ptrStr[16]; if(argc != 2) { Tcl_SetResult(interp, "usage: powExprDataInfo dataname", TCL_VOLATILE); return TCL_ERROR; } data_ptr = PowFindData( Tcl_GetStringFromObj(argv[1],NULL) ); if (data_ptr == (PowData *) NULL) { Tcl_SetResult(interp,"Couldn't find data.",TCL_VOLATILE); return TCL_ERROR; } sprintf(ptrStr, PTRFORMAT, data_ptr->data_array); res[0] = Tcl_NewStringObj( "-ptr", -1 ); res[1] = Tcl_NewStringObj( ptrStr, -1 ); res[2] = Tcl_NewIntObj( data_ptr->data_type ); res[3] = Tcl_NewIntObj( data_ptr->length ); Tcl_SetObjResult(interp, Tcl_NewListObj(4, res) ); return TCL_OK; } int PowFetchVectorInfoHash(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powFetchVectorInfoHash vector_name */ /* used by the vector edit window to fetch vector structure fields */ PowVector *vector_ptr; char length_str[22]; if(argc != 2) { Tcl_SetResult(interp, "usage: powFetchVectorInfoHash vectorname", TCL_VOLATILE); return TCL_ERROR; } vector_ptr = PowFindVector(argv[1]); if (vector_ptr == (PowVector *) NULL) { Tcl_SetResult(interp,"Couldn't find vector.",TCL_VOLATILE); return TCL_ERROR; } Tcl_SetResult(interp,"data",TCL_VOLATILE); Tcl_AppendResult(interp," ", (vector_ptr->dataptr)->data_name,(char *)NULL); sprintf(length_str,"%d",vector_ptr->length); Tcl_AppendResult(interp," length ", length_str,(char *)NULL); Tcl_AppendResult(interp," units ", vector_ptr->units,(char *)NULL); return TCL_OK; } int PowFetchImageInfoHash(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powFetchImageInfoHash image_name */ /* used by the image edit window to fetch image structure fields */ PowImage *image_ptr; char tmp_str[22]; if(argc != 2) { Tcl_SetResult(interp, "usage: powFetchImageInfoHash imagename", TCL_VOLATILE); return TCL_ERROR; } image_ptr = PowFindImage(argv[1]); if (image_ptr == (PowImage *) NULL) { Tcl_SetResult(interp,"Couldn't find image.",TCL_VOLATILE); return TCL_ERROR; } Tcl_SetResult(interp,"data",TCL_VOLATILE); Tcl_AppendResult(interp," ", (image_ptr->dataptr)->data_name,(char *)NULL); sprintf(tmp_str,"%d",image_ptr->width); Tcl_AppendResult(interp," width ", tmp_str,(char *)NULL); sprintf(tmp_str,"%d",image_ptr->height); Tcl_AppendResult(interp," height ", tmp_str,(char *)NULL); sprintf(tmp_str,"%lg",image_ptr->xorigin+0.5*image_ptr->xinc); Tcl_AppendResult(interp," xorigin ", tmp_str,(char *)NULL); sprintf(tmp_str,"%lg",image_ptr->yorigin+0.5*image_ptr->yinc); Tcl_AppendResult(interp," yorigin ", tmp_str,(char *)NULL); sprintf(tmp_str,"%lg",image_ptr->xinc); Tcl_AppendResult(interp," xinc ", tmp_str,(char *)NULL); sprintf(tmp_str,"%lg",image_ptr->yinc); Tcl_AppendResult(interp," yinc ", tmp_str,(char *)NULL); Tcl_AppendResult(interp," xunits ", image_ptr->xunits,(char *)NULL); Tcl_AppendResult(interp," yunits ", image_ptr->yunits,(char *)NULL); if (strcmp(image_ptr->zunits, "") != 0 ) { Tcl_AppendResult(interp," zunits ", image_ptr->zunits,(char *)NULL); } sprintf(tmp_str,"%lg",image_ptr->xotherend+0.5*image_ptr->xinc); Tcl_AppendResult(interp," xotherend ", tmp_str,(char *)NULL); sprintf(tmp_str,"%lg",image_ptr->yotherend+0.5*image_ptr->yinc); Tcl_AppendResult(interp," yotherend ", tmp_str,(char *)NULL); return TCL_OK; } int PowFindCurvesMinMax_Tcl(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { /* usage: powFindCurveMinMax curves axis */ /* this is the TCL wrapper for the PowFindCurvesMinMax routine. */ double min, max; char outstring[1024]; if(argc != 3) { Tcl_SetResult(interp, "usage: powFindCurveMinMax curves axis", TCL_VOLATILE); return TCL_ERROR; } min = 6.66e100; max = -6.66e100; PowFindCurvesMinMax(argv[1], argv[2], &min, &max, 0); sprintf(outstring,"%g",min); Tcl_AppendElement(interp,outstring); sprintf(outstring,"%g",max); Tcl_AppendElement(interp,outstring); return TCL_OK; } int PowCreateDataFromChannel(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[] ) { /* usage: powCDFC channel data_name bitpix byteOrder */ Tcl_Channel channel; char buffer[1024]; char *data, *cName, *dName, *bin, *bout; int done=0, copy=-1, status=0, i, j; int nPts, datasize, bitpix, byteOrder, bytesRead, len=0; if( argc!=5 ) { Tcl_SetResult(interp, "usage: powCreateDataFromChannel chanName " "data_name bitpix byteOrder", TCL_VOLATILE); return TCL_ERROR; } cName = Tcl_GetStringFromObj( argv[1], NULL ); dName = Tcl_GetStringFromObj( argv[2], NULL ); Tcl_GetIntFromObj( interp, argv[3], &bitpix ); Tcl_GetIntFromObj( interp, argv[4], &byteOrder ); if( bitpix<0 || bitpix>4 ) { Tcl_SetResult(interp, "Unsupported bitpix value", TCL_VOLATILE); return TCL_ERROR; } channel = Tcl_GetChannel( interp, cName, NULL ); if( channel==NULL ) { Tcl_AppendResult(interp, "Unable to find channel ", cName, NULL); return TCL_ERROR; } switch (bitpix) { case 0: datasize = 1; break; case 1: datasize = 2; break; case 2: datasize = 4; break; case 3: datasize = 4; break; case 4: datasize = 8; break; } while( !done ) { bytesRead = Tcl_Read( channel, buffer, 1024 ); if( len==0 ) { len = bytesRead; data = (char *) ckalloc( bytesRead * sizeof(char) ); } else if( bytesRead>0 ) { len += bytesRead; data = (char *) ckrealloc( data, len * sizeof(char) ); if( bytesRead<1024 ) done=1; } else if( bytesRead==0 ) { done=1; } else { /* ERROR */ if( len>0 ) ckfree( data ); Tcl_AppendResult(interp, "Error reading channel", NULL); return TCL_ERROR; } if( byteOrder>0 || datasize==1 ) { /* fprintf(stdout, "memcpy\n"); */ memcpy( data+len-bytesRead, buffer, bytesRead ); } else { /* fprintf(stdout, "else\n"); */ bin = buffer; bout = data+len-bytesRead; nPts = bytesRead/datasize; for( i=0; i4 ) { Tcl_SetResult(interp, "Unsupported bitpix value", TCL_VOLATILE); return TCL_ERROR; } switch (bitpix) { case 0: datasize = 1; break; case 1: datasize = 2; break; case 2: datasize = 4; break; case 3: datasize = 4; break; case 4: datasize = 8; break; } Tcl_GetIntFromObj(interp, argv[2], &bytesRead); len = bytesRead; /* fprintf(stdout, "PowCreateDataFromBuffer: size of data= %ld\n", len); */ /* fprintf(stdout, "PowCreateDataFromBuffer: byteOrder = %d\n", byteOrder); */ /* fprintf(stdout, "PowCreateDataFromBuffer: datasize = %d\n", datasize); */ data = (char *) ckalloc( bytesRead * sizeof(char)); if ( byteOrder>0 || datasize==1 ) { /* fprintf(stdout, "PowCreateDataFromBuffer: memcpy\n"); */ memcpy( data, Tcl_GetByteArrayFromObj(argv[1], NULL) , bytesRead ); } else { /* fprintf(stdout, "PowCreateDataFromBuffer: else\n"); */ bin = Tcl_GetByteArrayFromObj(argv[1], NULL); bout = data; nPts = bytesRead/datasize; for ( i=0; i4 ) { Tcl_SetResult(interp, "Unsupported bitpix value", TCL_VOLATILE); return TCL_ERROR; } switch (bitpix) { case 0: datasize = 1; break; case 1: datasize = 2; break; case 2: datasize = 4; break; case 3: datasize = 4; break; case 4: datasize = 8; break; } if( byteOrder>0 || datasize==1 ) { copy = 1; } else { bin = (char *)data; bout = (char *)ckalloc( nPts * datasize * sizeof(char) ); for( i=0; i 4) { Tcl_SetResult(interp, "usage: powCreateDataFromList data_name list_o_data ?stringflag?", TCL_VOLATILE); return TCL_ERROR; } if (Tcl_SplitList(interp,argv[2],&largc,&largv) != TCL_OK) { Tcl_SetResult(interp,"Couldn't split input data list",TCL_VOLATILE); return TCL_ERROR; } if (argc == 4) { if (Tcl_GetBoolean(interp,argv[3],&string_flag) != TCL_OK) { Tcl_SetResult(interp,"Couldn't convert stringflag to boolean", TCL_VOLATILE); return TCL_ERROR; } } if (string_flag) { i=0; j=STRING_DATA; PowCreateData(argv[1],(void *)largv,&j,&largc,&i,&status); } else { data = (double *)ckalloc(largc * sizeof(double)); counter = largv; datacounter = data; for (i=0;icopy = 1; /*Return the string representation of the PowData pointer */ sprintf(ptrString,PTRFORMAT,data_instance); Tcl_SetResult(interp,ptrString,TCL_VOLATILE); return TCL_OK; } int PowCreateStrFromPtr(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[] ) { Tcl_Obj **dList; char *data, *dPtr; int i, j; int nPts, datasize, bitpix; if( argc!=4 ) { Tcl_SetResult(interp, "usage: powCreateStrFromPtr " "address bitpix naxes", TCL_VOLATILE); return TCL_ERROR; } dPtr = Tcl_GetStringFromObj( argv[1], NULL ); if (sscanf(dPtr,PTRFORMAT,&data) != 1) { Tcl_SetResult(interp,"Couldn't parse data address into an integer", TCL_VOLATILE); return TCL_ERROR; } Tcl_GetIntFromObj( interp, argv[2], &bitpix ); /* Read NAXES list and calculate data length */ if( Tcl_ListObjGetElements( interp, argv[3], &i, &dList ) != TCL_OK ) { Tcl_AppendResult(interp, "Bad naxes parameter", TCL_VOLATILE); return TCL_ERROR; } for( nPts=1; i; ) { Tcl_GetIntFromObj( interp, dList[--i], &j ); nPts *= j; } if( bitpix<0 || bitpix>4 ) { Tcl_SetResult(interp, "Unsupported bitpix value", TCL_VOLATILE); return TCL_ERROR; } switch (bitpix) { case 0: datasize = 1; break; case 1: datasize = 2; break; case 2: datasize = 4; break; case 3: datasize = 4; break; case 4: datasize = 8; break; } Tcl_SetObjResult( interp, Tcl_NewStringObj( data, nPts * datasize ) ); return TCL_OK; } int PowGraphToCanvas( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { PowGraph *graph; Tcl_Obj *list, *elem[4]; double x, y, xorig, yorig; double xorig_curr, yorig_curr; char *canvas=".pow.pow"; char *graphName; int len; char *idxStr; const char *graphType; int zoomed; int xCount, yCount; int graph_is_scope; if( argc < 4 || argc > 5 ) { Tcl_SetResult(interp,"usage: powGraphToCanvas graph x y ?canvas?", TCL_VOLATILE); return TCL_ERROR; } graphName = Tcl_GetStringFromObj( argv[1], NULL ); graph = PowFindGraph( graphName ); if( graph==NULL ) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "Graph ",graphName," does not exist", NULL); return TCL_ERROR; } Tcl_GetDoubleFromObj(interp, argv[2], &x); Tcl_GetDoubleFromObj(interp, argv[3], &y); if( argc==5 ) canvas = Tcl_GetStringFromObj( argv[4], NULL ); Tcl_VarEval(interp, canvas, " coords ",graphName, "box", NULL); list = Tcl_GetObjResult(interp); Tcl_ListObjIndex(interp, list, 0, &elem[0]); Tcl_ListObjIndex(interp, list, 1, &elem[1]); Tcl_ListObjIndex(interp, list, 2, &elem[2]); Tcl_ListObjIndex(interp, list, 3, &elem[3]); if( elem[0]==NULL || elem[3]==NULL ) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "Unable to find bbox for ", graphName, " in ",canvas, NULL); return TCL_ERROR; } Tcl_GetDoubleFromObj(interp, elem[0], &xorig); Tcl_GetDoubleFromObj(interp, elem[3], &yorig); len = strlen(graphName)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "graphType", graphName); graphType = Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY); ckfree(idxStr); len = strlen(graphName)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "zoomed", graphName); zoomed = atoi(Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY)); ckfree(idxStr); xCount = atoi(Tcl_GetVar2(interp,"xCount",graphName,TCL_GLOBAL_ONLY)); yCount = atoi(Tcl_GetVar2(interp,"yCount",graphName,TCL_GLOBAL_ONLY)); /* Chai 06/29/2007: We are not actually fliping the coordinates on the canvas. If tk allows this, then there is no need to do the following. What the logic below is to trick pow to think that the point on the canvas has been flipped. The xCount and yCount indicate if the graph has been flipped before. So if X has been previously flipped, the next flipping occurs on Y, the logic inside ..Count % 2 will make sure the information on previous flip still exists. */ /* fprintf(stdout, "powGraphToCanvas xorig, yorig (%20.15f, %20.15f)\n", xorig, yorig); fflush(stdout); */ if (strcmp(graphType, "binary") == 0 && xCount % 2 != 0) { Tcl_GetDoubleFromObj(interp, elem[2], &xorig_curr); } if (strcmp(graphType, "binary") == 0 && yCount % 2 != 0) { Tcl_GetDoubleFromObj(interp, elem[1], &yorig_curr); } if( PowPosToPix( x, y, &graph->WCS, &x, &y ) != TCL_OK ) return TCL_ERROR; idxStr = strstr(graphName, "scope"); graph_is_scope = 0; if (idxStr != (char *)NULL) { graph_is_scope = 1; } /* fprintf(stdout, "graphName: <%s>, graph_is_scope: <%d>\n", graphName, graph_is_scope); fflush(stdout); */ if ( strcmp(graphType, "binary") == 0 && xCount % 2 != 0 ) { if ( graph->WCS.type[0] != '\0' ) { /* previous flip */ x = xorig + x * graph->xmagstep; } else { x = xorig + (-1.0 * x) * graph->xmagstep; } } else { x = xorig + x * graph->xmagstep; } if ( strcmp(graphType, "binary") == 0 && yCount % 2 != 0 ) { /* previous flip */ if ( graph->WCS.type[0] != '\0' ) { y = yorig - y * graph->ymagstep; } else { y = yorig - (-1.0 * y) * graph->ymagstep; } } else { y = yorig - y * graph->ymagstep; } elem[0] = Tcl_NewDoubleObj(x); elem[1] = Tcl_NewDoubleObj(y); list = Tcl_NewListObj(2,elem); Tcl_SetObjResult(interp, list); /* fprintf(stdout, " return x, y (%20.15f, %20.15f)\n", x, y); fflush(stdout); */ return TCL_OK; } int PowCanvasToGraph( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { PowGraph *graph; Tcl_Obj *list, *elem[4]; double x, y, xorig, yorig; double xorig_curr, yorig_curr; char *canvas=".pow.pow"; char *graphName; int len; char *idxStr; const char *graphType; int zoomed; int xCount, yCount; int graph_is_scope; if( argc < 4 || argc > 5 ) { Tcl_SetResult(interp,"usage: powCanvasToGraph graph x y {canvas}", TCL_VOLATILE); return TCL_ERROR; } graphName = Tcl_GetStringFromObj( argv[1], NULL ); graph = PowFindGraph( graphName ); if( graph==NULL ) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "Graph ",graphName," does not exist", NULL); return TCL_ERROR; } Tcl_GetDoubleFromObj(interp, argv[2], &x); Tcl_GetDoubleFromObj(interp, argv[3], &y); if( argc==5 ) canvas = Tcl_GetStringFromObj( argv[4], NULL ); Tcl_VarEval(interp, canvas, " coords ",graphName, "box", NULL); list = Tcl_GetObjResult(interp); Tcl_ListObjIndex(interp, list, 0, &elem[0]); Tcl_ListObjIndex(interp, list, 1, &elem[1]); Tcl_ListObjIndex(interp, list, 2, &elem[2]); Tcl_ListObjIndex(interp, list, 3, &elem[3]); Tcl_GetDoubleFromObj(interp, elem[0], &xorig); Tcl_GetDoubleFromObj(interp, elem[3], &yorig); len = strlen(graphName)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "graphType", graphName); graphType = Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY); ckfree(idxStr); len = strlen(graphName)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "zoomed", graphName); zoomed = atoi(Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY)); ckfree(idxStr); xCount = atoi(Tcl_GetVar2(interp,"xCount",graphName,TCL_GLOBAL_ONLY)); yCount = atoi(Tcl_GetVar2(interp,"yCount",graphName,TCL_GLOBAL_ONLY)); if ( strcmp(graphType, "binary") == 0 && xCount % 2 != 0 ) { Tcl_GetDoubleFromObj(interp, elem[2], &xorig_curr); } if ( strcmp(graphType, "binary") == 0 && yCount % 2 != 0 ) { Tcl_GetDoubleFromObj(interp, elem[1], &yorig_curr); } idxStr = strstr(graphName, "scope"); graph_is_scope = 0; if (idxStr != (char *)NULL) { graph_is_scope = 1; } /* Chai 06/29/2007: We are not actually fliping the coordinates on the canvas. If tk allows this, then there is no need to do the following. What the logic below is to trick pow to think that the point on the canvas has been flipped. The xCount and yCount indicate if the graph has been flipped before. So if X has been previously flipped, the next flipping occurs on Y, the logic inside ..Count % 2 will make sure the information on previous flip still exists. */ if ( strcmp(graphType, "binary") == 0 && xCount % 2 != 0 ) { /* previous flip */ if ( graph->WCS.type[0] != '\0' ) { x = (x - xorig) / graph->xmagstep; } else { x = (xorig - x) / graph->xmagstep; } } else { x = (x - xorig) / graph->xmagstep; } if ( strcmp(graphType, "binary") == 0 && yCount % 2 != 0 ) { /* previous flip */ if ( graph->WCS.type[0] != '\0' ) { y = (yorig - y) / graph->ymagstep; } else { y = (y - yorig) / graph->ymagstep; } } else { y = (yorig - y) / graph->ymagstep; } if( PowPixToPos( x, y, &graph->WCS, &x, &y ) != TCL_OK ) return TCL_ERROR; elem[0] = Tcl_NewDoubleObj(x); elem[1] = Tcl_NewDoubleObj(y); list = Tcl_NewListObj(2,elem); Tcl_SetObjResult(interp, list); return TCL_OK; } int PowResetWcsStructure ( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { PowGraph *graph; PowGraph *scopegraph; PowImage *image; PowCurve *curve; double refpix_1, refpix_2, xoff, yoff; char *graphName, *operation, *direction; int wcsStatus; const char *WCSstring; char powWCS[7]="powWCS"; char curveName[512]; char scopeName[1024]; int coordSel; if( argc != 5 && argc != 6 ) { Tcl_SetResult(interp,"usage: powResetWcsStructure <-g/-r graph refpix1/xoff refpix2/yoff> or <-d direction refpix1 refpix2>", TCL_VOLATILE); return TCL_ERROR; } operation = Tcl_GetStringFromObj( argv[1], NULL ); graphName = Tcl_GetStringFromObj( argv[2], NULL ); sprintf(scopeName, "%sscope", graphName); graph = PowFindGraph( graphName ); scopegraph = PowFindGraph( scopeName ); if( scopegraph==NULL ) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "graph Object ",scopeName," does not exist", NULL); return TCL_ERROR; } if( graph==NULL ) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "graph Object ",graphName," does not exist", NULL); return TCL_ERROR; } Tcl_GetDoubleFromObj(interp, argv[3], &refpix_1); Tcl_GetDoubleFromObj(interp, argv[4], &refpix_2); if (!strcmp(operation, "-g")) { graph->WCS.haveWCSinfo = 0; PowPosToPix( graph->xleft, graph->ybot, &graph->WCS, &xoff, &yoff ); graph->WCS.refPix[0] = refpix_1 + xoff; graph->WCS.refPix[1] = refpix_2 + yoff; graph->xoff = xoff; graph->yoff = yoff; } else if (!strcmp(operation, "-r")) { /* user refpix_1 and 2 for storage only, purpose is to reset xoff and yoff back to 0.0 */ graph->xoff = 0.0; graph->yoff = 0.0; } else if (!strcmp(operation, "-d")) { if (graph->WCS.haveWCSinfo == 0) return TCL_OK; image = PowFindImage ( graphName ); if( image == NULL ) { curve = PowFindCurve( graphName ); if ( curve == NULL ) { sprintf(curveName, "c1_%s", graphName); curve = PowFindCurve( curveName ); if ( curve == NULL ) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "Curve ", curveName," does not exist", NULL); return TCL_ERROR; } } } direction = Tcl_GetStringFromObj( argv[3], NULL ); Tcl_GetDoubleFromObj(interp, argv[4], &refpix_1); Tcl_GetDoubleFromObj(interp, argv[5], &refpix_2); coordSel = atoi(Tcl_GetVar2(interp,"powWCSName",graphName,TCL_GLOBAL_ONLY)); if (!strcmp(direction, "X")) { graph->WCS.wcs[coordSel].cdelt[0] *= -1.0f; scopegraph->WCS.wcs[coordSel].cdelt[0] *= -1.0f; } else if (!strcmp(direction, "Y")) { graph->WCS.wcs[coordSel].cdelt[1] *= -1.0f; scopegraph->WCS.wcs[coordSel].cdelt[1] *= -1.0f; } else if (!strcmp(direction, "B") || !strcmp(direction, "U")) { graph->WCS.wcs[coordSel].cdelt[0] *= -1.0f; graph->WCS.wcs[coordSel].cdelt[1] *= -1.0f; scopegraph->WCS.wcs[coordSel].cdelt[0] *= -1.0f; scopegraph->WCS.wcs[coordSel].cdelt[1] *= -1.0f; } graph->WCS.haveWCSinfo = 1; graph->WCS.refPix[0] = refpix_1 + graph->xoff; graph->WCS.refPix[1] = refpix_2 + graph->yoff; /* fprintf(stdout, "X graph->xleft (%20.15f), graph->xright (%20.15f)\n", graph->xleft, graph->xright); fprintf(stdout, "X graph->ybot (%20.15f), graph->ytop (%20.15f)\n", graph->ybot, graph->ytop); fflush(stdout); */ wcsStatus = TCL_ERROR; if ( image != NULL ) { image->WCS.refPix[0] = graph->WCS.refPix[0]; image->WCS.refPix[1] = graph->WCS.refPix[1]; image->WCS.wcs[coordSel].cdelt[0] = graph->WCS.wcs[coordSel].cdelt[0]; image->WCS.wcs[coordSel].cdelt[1] = graph->WCS.wcs[coordSel].cdelt[1]; WCSstring = Tcl_GetVar2(interp,powWCS,image->WCS.graphName,TCL_GLOBAL_ONLY); if( (WCSstring != NULL) && strcmp(WCSstring,"") ) { wcsStatus = Tcl_VarEval(interp, "powWCSInitImage ", image->WCS.graphName, " ", WCSstring, (char *) NULL); } FillinWCSStructure (&image->WCS); refpix_1 = image->WCS.refPix[0]; refpix_2 = image->WCS.refPix[1]; } else { curve->WCS.refPix[0] = graph->WCS.refPix[0]; curve->WCS.refPix[1] = graph->WCS.refPix[1]; curve->WCS.wcs[coordSel].cdelt[0] = graph->WCS.wcs[coordSel].cdelt[0]; curve->WCS.wcs[coordSel].cdelt[1] = graph->WCS.wcs[coordSel].cdelt[1]; WCSstring = Tcl_GetVar2(interp,powWCS,curve->WCS.curveName,TCL_GLOBAL_ONLY); if( (WCSstring != NULL) && strcmp(WCSstring,"") != 0 ) { wcsStatus = Tcl_VarEval(interp, "powWCSInitCurve ", curve->WCS.curveName, " ", WCSstring, (char *) NULL); } FillinWCSStructure (&curve->WCS); refpix_1 = curve->WCS.refPix[0]; refpix_2 = curve->WCS.refPix[1]; } } graph->WCS.refPix[0] = refpix_1; graph->WCS.refPix[1] = refpix_2; strcpy(graph->WCS.graphName, graphName); strcpy(graph->WCS.curveName, "\0"); FillinWCSStructure (&graph->WCS); strcpy(scopegraph->WCS.graphName, graphName); FillinWCSStructure (&scopegraph->WCS); return TCL_OK; } int PowPixelToGraph( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { PowImage *image; PowCurve *curve; Tcl_Obj *list, *elem[2]; double x, y; char *objName; if( argc != 4 ) { Tcl_SetResult(interp,"usage: powPixelToGraph image|curve x y}", TCL_VOLATILE); return TCL_ERROR; } objName = Tcl_GetStringFromObj( argv[1], NULL ); Tcl_GetDoubleFromObj(interp, argv[2], &x); Tcl_GetDoubleFromObj(interp, argv[3], &y); image = PowFindImage( objName ); if( image ) { if( PowPixToPos( x, y, &image->WCS, &x, &y ) != TCL_OK ) return TCL_ERROR; } else { curve = PowFindCurve( objName ); if( curve ) { if( PowPixToPos( x, y, &curve->WCS, &x, &y ) != TCL_OK ) return TCL_ERROR; } else { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "Object ",objName," does not exist", NULL); return TCL_ERROR; } } elem[0] = Tcl_NewDoubleObj(x); elem[1] = Tcl_NewDoubleObj(y); list = Tcl_NewListObj(2,elem); Tcl_SetObjResult(interp, list); return TCL_OK; } int PowGraphToPixel( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { PowImage *image; PowCurve *curve; Tcl_Obj *list, *elem[2]; double x, y; char *objName; if( argc != 4 ) { Tcl_SetResult(interp,"usage: powGraphToPixel image|curve x y", TCL_VOLATILE); return TCL_ERROR; } objName = Tcl_GetStringFromObj( argv[1], NULL ); Tcl_GetDoubleFromObj(interp, argv[2], &x); Tcl_GetDoubleFromObj(interp, argv[3], &y); image = PowFindImage( objName ); if( image ) { if( PowPosToPix( x, y, &image->WCS, &x, &y ) != TCL_OK ) return TCL_ERROR; } else { curve = PowFindCurve( objName ); if( curve ) { if( PowPosToPix( x, y, &curve->WCS, &x, &y ) != TCL_OK ) return TCL_ERROR; } else { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "Object ",objName," does not exist", NULL); return TCL_ERROR; } } elem[0] = Tcl_NewDoubleObj(x); elem[1] = Tcl_NewDoubleObj(y); list = Tcl_NewListObj(2,elem); Tcl_SetObjResult(interp, list); return TCL_OK; } int PowPixelVToGraphV( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { PowImage *image; PowCurve *curve; WCSdata *WCS; Tcl_Obj *list, *elem[2]; double x, y, xorig, yorig; char *objName; if( argc != 4 ) { Tcl_SetResult(interp,"usage: powPixelVToGraphV image|curve dx dy}", TCL_VOLATILE); return TCL_ERROR; } objName = Tcl_GetStringFromObj( argv[1], NULL ); Tcl_GetDoubleFromObj(interp, argv[2], &xorig); Tcl_GetDoubleFromObj(interp, argv[3], &yorig); image = PowFindImage( objName ); if( image ) { WCS = &image->WCS; } else { curve = PowFindCurve( objName ); if( curve ) { WCS = &curve->WCS; } else { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "Object ",objName," does not exist", NULL); return TCL_ERROR; } } x = WCS->cdFrwd[0][0] * xorig + WCS->cdFrwd[0][1] * yorig; y = WCS->cdFrwd[1][0] * xorig + WCS->cdFrwd[1][1] * yorig; elem[0] = Tcl_NewDoubleObj(x); elem[1] = Tcl_NewDoubleObj(y); list = Tcl_NewListObj(2,elem); Tcl_SetObjResult(interp, list); return TCL_OK; } int PowGraphVToPixelV( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { PowImage *image; PowCurve *curve; WCSdata *WCS; Tcl_Obj *list, *elem[2]; double x, y, xorig, yorig; char *objName; if( argc != 4 ) { Tcl_SetResult(interp,"usage: powGraphVToPixelV image|curve dx dy", TCL_VOLATILE); return TCL_ERROR; } objName = Tcl_GetStringFromObj( argv[1], NULL ); Tcl_GetDoubleFromObj(interp, argv[2], &xorig); Tcl_GetDoubleFromObj(interp, argv[3], &yorig); image = PowFindImage( objName ); if( image ) { WCS = &image->WCS; } else { curve = PowFindCurve( objName ); if( curve ) { WCS = &curve->WCS; } else { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "Object ",objName," does not exist", NULL); return TCL_ERROR; } } x = WCS->cdRvrs[0][0] * xorig + WCS->cdRvrs[0][1] * yorig; y = WCS->cdRvrs[1][0] * xorig + WCS->cdRvrs[1][1] * yorig; elem[0] = Tcl_NewDoubleObj(x); elem[1] = Tcl_NewDoubleObj(y); list = Tcl_NewListObj(2,elem); Tcl_SetObjResult(interp, list); return TCL_OK; } int PowGetImageClipbox( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { PowGraph *graph; PowImage *image; Tcl_Obj *list, *clip[6]; char *graphName, *imageName; double xorigin, yorigin, xother, yother, gWidth, gHeight; double xscale, yscale, xleft, ybot; /* FILE *fp; */ if( argc < 3 || argc > 4 ) { Tcl_SetResult(interp,"usage: powGetImageClipbox graph image ?canvas?", TCL_VOLATILE); return TCL_ERROR; } graphName = Tcl_GetStringFromObj( argv[1], NULL ); graph = PowFindGraph( graphName ); if( graph==NULL ) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "Graph ",graphName," does not exist", NULL); return TCL_ERROR; } imageName = Tcl_GetStringFromObj( argv[2], NULL ); image = PowFindImage( imageName ); if( image==NULL ) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "Image ",imageName," does not exist", NULL); return TCL_ERROR; } /* fprintf(fp, "PowCommands: image->xorigin: %f\n", image->xorigin); */ /* fprintf(fp, "PowCommands: image->yorigin: %f\n", image->yorigin); */ /* fprintf(fp, "PowCommands: image->xotherend: %f\n", image->xotherend); */ /* fprintf(fp, "PowCommands: image->yotherend: %f\n", image->yotherend); */ PowPosToPix( image->xorigin, image->yorigin, &graph->WCS, &xorigin, &yorigin ); PowPosToPix( image->xotherend, image->yotherend, &graph->WCS, &xother, &yother ); PowPosToPix( graph->xright, graph->ytop, &graph->WCS, &gWidth, &gHeight ); if( xother<=0.0 || yother<=0.0 || xorigin>=gWidth || yorigin>=gHeight ) { Tcl_SetResult(interp,"clipped", TCL_VOLATILE); return TCL_OK; } /* fprintf(fp, "PowCommands: xother: %f\n", xother); */ /* fprintf(fp, "PowCommands: yother: %f\n", yother); */ /* fprintf(fp, "PowCommands: xorigin: %f\n", xorigin); */ /* fprintf(fp, "PowCommands: yorigin: %f\n", yorigin); */ /* fprintf(fp, "PowCommands: image->width: %f\n", image->width); */ /* fprintf(fp, "PowCommands: image->height: %f\n", image->height); */ xscale = image->width / (xother - xorigin); yscale = image->height / (yother - yorigin); /* fprintf(fp, "PowCommands: xscale: %f\n", xscale); */ /* fprintf(fp, "PowCommands: yscale: %f\n", yscale); */ if( xorigin < 0.0 ) { xleft = - xorigin * xscale; xorigin = 0.0; } else xleft = 0.0; if( yorigin < 0.0 ) { ybot = - yorigin * yscale; yorigin = 0.0; } else ybot = 0.0; /* fprintf(fp, "PowCommands: xleft: %f\n", xleft); */ /* fprintf(fp, "PowCommands: ybot: %f\n", ybot); */ if( xother > gWidth ) xother = image->width - (xother-gWidth) * xscale; else xother = image->width; if( yother > gHeight ) yother = image->height - (yother-gHeight) * yscale; else yother = image->height; /* fprintf(fp, "PowCommands: xother: %f\n", xother); */ /* fprintf(fp, "PowCommands: yother: %f\n", yother); */ /* fprintf(fp, "***************************\n"); */ PowPixToPos( xorigin, yorigin, &graph->WCS, &xorigin, &yorigin ); clip[0] = Tcl_NewDoubleObj(xorigin ); clip[1] = Tcl_NewDoubleObj(yorigin ); clip[2] = Tcl_NewDoubleObj(xleft -0.5); clip[3] = Tcl_NewDoubleObj(ybot -0.5); clip[4] = Tcl_NewDoubleObj(xother -0.5); clip[5] = Tcl_NewDoubleObj(yother -0.5); list = Tcl_NewListObj(6,clip); Tcl_SetObjResult(interp, list); /* fclose(fp); */ return TCL_OK; } int PowWCSexists( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { PowGraph *graph; Tcl_Obj *result; char *graphName; if( argc != 2 ) { Tcl_SetResult(interp,"usage: powWCSexists graph", TCL_VOLATILE); return TCL_ERROR; } graphName = Tcl_GetStringFromObj( argv[1], NULL ); graph = PowFindGraph( graphName ); if( graph==NULL ) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "Graph ",graphName," does not exist", NULL); return TCL_ERROR; } result = Tcl_NewBooleanObj( graph->WCS.type[0]!='\0' ); Tcl_SetObjResult(interp, result); return TCL_OK; } int PowWCSisSwapped( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { PowGraph *graph; Tcl_Obj *result; char *graphName; if( argc != 2 ) { Tcl_SetResult(interp,"usage: powWCSisSwapped graph", TCL_VOLATILE); return TCL_ERROR; } graphName = Tcl_GetStringFromObj( argv[1], NULL ); graph = PowFindGraph( graphName ); if( graph==NULL ) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "Graph ",graphName," does not exist", NULL); return TCL_ERROR; } /* for the unknown WCS type, always set the swap to zero */ if (graph->WCS.type[0]=='\0') graph->WCS.RaDecSwap = 0; result = Tcl_NewLongObj( graph->WCS.RaDecSwap ); Tcl_SetObjResult(interp, result); return TCL_OK; } /* Get the centroid and flux */ int PowGetRegionStatistics( ClientData clientData, Tcl_Interp *interp, int argc, char **argv ) { char *imgName; PowImage *image_ptr; char *descr; char *cPar; char *shape; char *sign; char *regionFile; double *dataPar; const char **argvPtr; int i, numPars; int plen; double cent[2], cstd[2],flux, npix; double mean,dmean; double a,b,c,d; char results[512]; int ix,iy; char *ptr; int rect[4]; int status; int good; if(argc != 6) { Tcl_SetResult( interp, "usage: powGetGetRegionStatistics image regionFile/NONE descr shape sign", TCL_VOLATILE ); good = 0; return TCL_ERROR; } imgName = argv[1]; image_ptr = PowFindImage( imgName ); if (image_ptr == (PowImage *) NULL) { Tcl_AppendResult(interp, "Couldn't find image: ",imgName, NULL); good = 0; return TCL_ERROR; } regionFile = argv[2]; descr = argv[3]; shape = argv[4]; sign = argv[5]; plen = strlen(descr); /* parse the parameters */ cPar = (char *)malloc ((plen+1)*sizeof(char)); strcpy(cPar,descr); ptr = cPar; while ( *ptr!='\0') { if( *ptr == ','|| *ptr == '(' || *ptr == ')' ) *ptr = ' '; ptr++; } if(Tcl_SplitList(interp, cPar, &numPars, &argvPtr) != TCL_OK ) { good = 0; return TCL_ERROR; } dataPar = (double*) malloc(numPars*sizeof(double)); for (i=0; idataptr, iy * image_ptr->width + ix); cent[0] = dataPar[0]; cent[1] = dataPar[1]; good = 1; } if (!strcmp(shape,"Line")) { good = 0; } /* Find the binding box for circle, box, ellipse, and polygon */ if (!strcmp(shape,"Circle")) { rect[0] = (int)(dataPar[0] - dataPar[2] + 0.5 -1) ; rect[1] = (int)(dataPar[1] - dataPar[2] + 0.5 -1) ; rect[2] = (int)(dataPar[0] + dataPar[2] + 0.5 +1) ; rect[3] = (int)(dataPar[1] + dataPar[2] + 0.5 +1) ; } if (!strcmp(shape,"Box")) { a = sqrt(dataPar[2]*dataPar[2]+dataPar[3]*dataPar[3])/2.0; rect[0] = (int)(dataPar[0] - a + 0.5 -1) ; rect[1] = (int)(dataPar[1] - a + 0.5 -1) ; rect[2] = (int)(dataPar[0] + a + 0.5 +1) ; rect[3] = (int)(dataPar[1] + a + 0.5 +1) ; } if (!strcmp(shape,"Ellipse")) { a = sqrt(dataPar[2]*dataPar[2]+dataPar[3]*dataPar[3]); rect[0] = (int)(dataPar[0] - a + 0.5 -1) ; rect[1] = (int)(dataPar[1] - a + 0.5 -1) ; rect[2] = (int)(dataPar[0] + a + 0.5 +1) ; rect[3] = (int)(dataPar[1] + a + 0.5 +1) ; } if (!strcmp(shape,"Polygon")) { a = dataPar[0]; b = dataPar[1]; c = dataPar[0]; d = dataPar[1]; for (i = 0; i < numPars/2; i++) { a = a > dataPar[2*i] ? dataPar[2*i] : a; b = b > dataPar[2*i+1] ? dataPar[2*i+1] : b; c = c < dataPar[2*i] ? dataPar[2*i] : c; d = d < dataPar[2*i+1] ? dataPar[2*i+1] : d; } rect[0] = (int)(a + 0.5 -1) ; rect[1] = (int)(b + 0.5 -1) ; rect[2] = (int)(c + 0.5 +1) ; rect[3] = (int)(d + 0.5 +1) ; } status = 0; PowCalRegion(image_ptr, regionFile, rect,dataPar, numPars, shape,sign, cent, cstd, &flux, &npix, &mean, &dmean, &status); if(status == 0) good = 1; else good = 0; sprintf(results,"%d %g %g %g %g %g %g %g %g",good,cent[0],cent[1],cstd[0], cstd[1], flux, npix, mean, dmean); Tcl_SetResult( interp, results,TCL_VOLATILE ); free(dataPar); free(cPar); return TCL_OK; } /*---------------------------------------------------------------------- * * Pow_PhotoPutScaledBlock (formerly Tk_PhotoPutScaledBlock) -- * * This procedure is called to put image data into a photo image, * with possible zooming of the pixels. * * Results: * None. * * Side effects: * The image data is stored. The image may be expanded. * The Tk image code is informed that the image has changed. * *----------------------------------------------------------------------*/ void Pow_PhotoPutScaledBlock(handle, blockPtr, x, y, width, height, zoomX, zoomY, Xoff, Yoff) Tk_PhotoHandle handle; /* Opaque handle for the photo image * to be updated. */ register Tk_PhotoImageBlock *blockPtr; /* Pointer to a structure describing the * pixel data to be copied into the image. */ int x, y; /* Coordinates of the top-left pixel to * be updated in the image. */ int width, height; /* Dimensions of the area of the image * to be updated. */ double zoomX, zoomY; /* Zoom factors for the X and Y axes. */ double Xoff, Yoff; /* Offset into initial pixel data */ { int greenOffset, blueOffset, alphaOffset; int wCopy, hCopy; unsigned char *srcPtr, *srcLinePtr; unsigned char *destPtr, *destLinePtr; int pitch; double xRepeat, yRepeat; int blockXSkip, blockYSkip; Tk_PhotoImageBlock destBlockPtr; if( (zoomX <= 0.0) || (zoomY <= 0.0) || (width <= 0) || (height <= 0) || (x < 0) || (y < 0) ) return; if( (zoomX == 1.0) && (zoomY == 1.0) ) { Tk_PhotoPutBlock(interp, handle, blockPtr, x, y, width, height, TK_PHOTO_COMPOSITE_SET); return; } Tk_PhotoExpand(interp, handle, x+width, y+height); Tk_PhotoGetImage(handle, &destBlockPtr); /* * If this image block could have different red, green and blue * components, mark it as a color image. */ greenOffset = blockPtr->offset[1] - blockPtr->offset[0]; blueOffset = blockPtr->offset[2] - blockPtr->offset[0]; alphaOffset = blockPtr->offset[3]; if ((alphaOffset >= blockPtr->pixelSize) || (alphaOffset < 0)) { alphaOffset = 0; } else { alphaOffset -= blockPtr->offset[0]; } /* * Copy the data into the destination's 32-bit/pixel array. */ destLinePtr = destBlockPtr.pixelPtr + (y * destBlockPtr.width + x) * 4; pitch = destBlockPtr.width * 4; srcLinePtr = blockPtr->pixelPtr + blockPtr->offset[0]; blockXSkip = blockPtr->pixelSize; blockYSkip = blockPtr->pitch; yRepeat = Yoff; for (hCopy=height; hCopy > 0; hCopy--) { destPtr = destLinePtr; srcPtr = srcLinePtr; xRepeat = Xoff; for (wCopy=width; wCopy > 0; wCopy--) { if (!destPtr[3]) { destPtr[0] = destPtr[1] = destPtr[2] = 0xd9; } if (!alphaOffset || (srcPtr[alphaOffset] == 255)) { *destPtr++ = srcPtr[0]; *destPtr++ = srcPtr[greenOffset]; *destPtr++ = srcPtr[blueOffset]; *destPtr++ = 255; } else { if (srcPtr[alphaOffset]) { destPtr[0] += (srcPtr[0] - destPtr[0]) * srcPtr[alphaOffset] / 255; destPtr[1] += (srcPtr[greenOffset] - destPtr[1]) * srcPtr[alphaOffset] / 255; destPtr[2] += (srcPtr[blueOffset] - destPtr[2]) * srcPtr[alphaOffset] / 255; destPtr[3] += (255 - destPtr[3]) * srcPtr[alphaOffset] / 255; } destPtr+=4; } xRepeat--; while( xRepeat <= 0.0 ) { srcPtr += blockXSkip; xRepeat += zoomX; } } destLinePtr += pitch; yRepeat--; while( yRepeat <= 0.0 ) { srcLinePtr += blockYSkip; yRepeat += zoomY; } } Tk_PhotoPutBlock(interp, handle, &destBlockPtr, x, y, width, height, TK_PHOTO_COMPOSITE_SET); } fv5.4/tcltk/pow/PowCreateCurve.c0000644000220700001010000002320712076355402016204 0ustar birbylheadev#include "pow.h" void PowCreateCurve(char *curve_name, char *x_vector, char *x_error, char *y_vector, char *y_error, char *z_vector, char *z_error, int *status) { /*Until we see a problem with this, the length of the curve is the length of the x-vector (or y-vector if x-vector is null) or z- vector if y-vector is null)). If any of the other non-null vectors are shorter than this, the command returns an error.*/ PowCurve *curve_instance; Tcl_HashEntry *entry_ptr; int new = 0, wcsStatus; char *str_ptr; int length = 0; const char *WCSstring; char powWCS[7]="powWCS"; entry_ptr = Tcl_CreateHashEntry(&PowCurveTable, curve_name, &new); #ifdef DEBUG if (!new) { printf("Reusing curve name: %s\n",curve_name); } #endif curve_instance = (PowCurve *) ckalloc(sizeof(PowCurve)); if(curve_instance == NULL) { *status = TCL_ERROR; fprintf(stderr, "Couldn't malloc curve structure space"); Tcl_DeleteHashEntry(entry_ptr); return; } Tcl_SetHashValue( entry_ptr, curve_instance); str_ptr = ckalloc(strlen(curve_name)+1); strncpy(str_ptr,curve_name,strlen(curve_name)+1); curve_instance->curve_name = str_ptr; length = 0; if ((curve_instance->x_vector = PowFindVector(x_vector)) != NULL) { length = (curve_instance->x_vector)->length; if ((curve_instance->x_error = PowFindVector(x_error)) != NULL) { if ((curve_instance->x_error)->length < length) { *status = TCL_ERROR; fprintf(stderr, "x_error vector too short\n"); Tcl_DeleteHashEntry(entry_ptr); return; } } }else if ((curve_instance->x_error = PowFindVector(x_error)) != NULL) { /*we've got an x_error but no x_vector */ *status = TCL_ERROR; fprintf(stderr, "Can't have an X error without an X vector\n"); Tcl_DeleteHashEntry(entry_ptr); return; } if ((curve_instance->y_vector = PowFindVector(y_vector)) != NULL) { if(length == 0) { length = (curve_instance->y_vector)->length; } else { if( length > (curve_instance->y_vector)->length) { *status = TCL_ERROR; fprintf(stderr, "Y vector shorter than X vector\n"); Tcl_DeleteHashEntry(entry_ptr); return; } } if ((curve_instance->y_error = PowFindVector(y_error)) != NULL) { if ((curve_instance->y_error)->length < length) { *status = TCL_ERROR; fprintf(stderr, "y_error vector too short\n"); Tcl_DeleteHashEntry(entry_ptr); return; } } }else if ((curve_instance->y_error = PowFindVector(y_error)) != NULL) { /*we've got an y_error but no y_vector */ *status = TCL_ERROR; fprintf(stderr, "Can't have a Y error without a Y vector\n"); Tcl_DeleteHashEntry(entry_ptr); return; } if ((curve_instance->z_vector = PowFindVector(z_vector)) != NULL) { if(length == 0) { length = (curve_instance->z_vector)->length; } else { if( length > (curve_instance->z_vector)->length) { *status = TCL_ERROR; fprintf(stderr, "Z vector too short.\n"); Tcl_DeleteHashEntry(entry_ptr); return; } } if ((curve_instance->z_error = PowFindVector(z_error)) != NULL) { if ((curve_instance->z_error)->length < length) { *status = TCL_ERROR; fprintf(stderr, "z_error vector too short.\n"); Tcl_DeleteHashEntry(entry_ptr); return; } } }else if ((curve_instance->z_error = PowFindVector(z_error)) != NULL) { /*we've got an z_error but no z_vector */ *status = TCL_ERROR; fprintf(stderr, "Can't have a Z error without a Z vector\n"); Tcl_DeleteHashEntry(entry_ptr); return; } /* do final sanity checking */ if(length == 0) { *status = TCL_ERROR; fprintf(stderr, "Invalid curve, no non-zero vectors.\n"); Tcl_DeleteHashEntry(entry_ptr); return; } else { curve_instance->length = length; } /* if a vector not named "NULL" comes back NULL, it probably doesn't exist */ /* error out */ if ( x_vector != NULL && (strstr(x_vector,"NULL") == NULL ) && (curve_instance->x_vector == NULL)) { *status = TCL_ERROR; fprintf(stderr, "Vector %s doesn't exist.\n",x_vector); Tcl_DeleteHashEntry(entry_ptr); return; } if ( x_error != NULL && (strstr(x_error,"NULL") == NULL ) && (curve_instance->x_error == NULL)) { *status = TCL_ERROR; fprintf(stderr, "Vector %s doesn't exist.\n",x_error); Tcl_DeleteHashEntry(entry_ptr); return; } if ( y_vector != NULL && (strstr(y_vector,"NULL") == NULL) && (curve_instance->y_vector == NULL)) { *status = TCL_ERROR; fprintf(stderr, "Vector %s doesn't exist.\n",y_vector); Tcl_DeleteHashEntry(entry_ptr); return; } if ( y_error != NULL && (strstr(y_error,"NULL") == NULL ) && (curve_instance->y_error == NULL)) { *status = TCL_ERROR; fprintf(stderr, "Vector %s doesn't exist.\n",y_error); Tcl_DeleteHashEntry(entry_ptr); return; } if ( z_vector != NULL && (strstr(z_vector,"NULL") == NULL ) && (curve_instance->z_vector == NULL)) { *status = TCL_ERROR; fprintf(stderr, "Vector %s doesn't exist.\n",z_vector); Tcl_DeleteHashEntry(entry_ptr); return; } if ( z_error != NULL && (strstr(z_error,"NULL") == NULL ) && (curve_instance->z_error == NULL)) { *status = TCL_ERROR; fprintf(stderr, "Vector %s doesn't exist.\n",z_error); Tcl_DeleteHashEntry(entry_ptr); return; } /* Call WCS init procedure if applicable */ wcsStatus = TCL_ERROR; WCSstring = Tcl_GetVar2(interp,powWCS,curve_name,TCL_GLOBAL_ONLY); if( (WCSstring != NULL) && strcmp(WCSstring,"") ) { wcsStatus = Tcl_VarEval(interp, "powWCSInitCurve ", curve_name, " ", WCSstring, (char *) NULL); } if ( wcsStatus == TCL_ERROR ) { /* Set WCS structure to defaults... The Identity transform */ PowInitWCS( &curve_instance->WCS, 2 ); } } void PowCreateHisto(char *histo_name, char *x_vector, char *y_vector, int *status) { /*create 2 new vectors (named "histo_name"_histo_x and "histo_name"_histo_y) if x_vector is NULL or "NULL" create the x vector with integral numbered bins. Then use these vectors to create a curve "histo_name" */ PowVector *X,*Y; int i; double *dummy_X,*dummy_Y,*counter; double a,b,halfwidth; char *xname,*yname; int dtype = DOUBLE_DATA,copy = 0, offset = 0; int newflag; int histo_length; xname = ckalloc(strlen(x_vector) + 9); strcpy(xname,histo_name); strcat(xname,"_histo_x"); if ((Y = PowFindVector(y_vector)) == NULL) { fprintf(stderr,"You must specify an existing Y vector."); *status = TCL_ERROR; return; } yname = ckalloc(strlen(x_vector) + 9); strcpy(yname,histo_name); strcat(yname,"_histo_y"); /* create Y histo data */ dummy_Y = (double *)ckalloc((Y->length * 2 + 2) * sizeof(double)); counter = dummy_Y; *counter++ = 0; for (i=0; i < Y->length; i++) { a = PowExtractDatum(Y->dataptr,i); *counter++ = a; *counter++ = a; } *counter++ = 0; if ((X = PowFindVector(x_vector)) == NULL) { newflag = 1; } else { newflag = 0; if (X->length < Y->length) { fprintf(stderr,"X vector too short."); *status = TCL_ERROR; return; } } /* create X histo data */ dummy_X = (double *)ckalloc((Y->length * 2 + 2) * sizeof(double)); counter = dummy_X; if (newflag) { *counter++ = 0.5; for (i=1; i <= Y->length; i++) { *counter++ = i - 0.5; *counter++ = i + 0.5; } *counter++ = i + 0.5; } else { a = PowExtractDatum(X->dataptr,0); b = PowExtractDatum(X->dataptr,1); halfwidth = (b - a)/2.0; *counter++ = a - halfwidth; *counter++ = a - halfwidth; *counter++ = a + halfwidth; for (i=1; i < Y->length; i++) { b = PowExtractDatum(X->dataptr,i); halfwidth = (b - a)/2.0; *counter++ = b - halfwidth; *counter++ = b + halfwidth; a = b; } *counter++ = b + halfwidth; } histo_length = Y->length * 2 + 2; PowCreateData( xname, dummy_X, &dtype, &histo_length, ©, status); PowCreateVector( xname, xname, &offset, &histo_length, "NULL", status); PowCreateData( yname, dummy_Y, &dtype, &histo_length, ©, status); PowCreateVector( yname, yname, &offset, &histo_length, "NULL", status); PowCreateCurve( histo_name, xname, NULL, yname, NULL, NULL, NULL, status); return; } void PowDestroyCurve(char *curve_name, int *status) { Tcl_HashEntry *entry_ptr; char errormsg[1024]; PowCurve *curve_ptr; entry_ptr = Tcl_FindHashEntry(&PowCurveTable,curve_name); if (entry_ptr == NULL) { *status = TCL_ERROR; sprintf(errormsg,"Can't find POWCurve Object %s to destroy",curve_name); Tcl_SetResult(interp,errormsg,TCL_VOLATILE); return; } curve_ptr = (struct PowCurve *)Tcl_GetHashValue(entry_ptr); /*Delete the entry from the master POWData Hash*/ Tcl_DeleteHashEntry(entry_ptr); /*free the PowCurve memory itself and the string holding the name, although this is small change*/ ckfree(curve_ptr->curve_name); ckfree((char*)curve_ptr); return; } void PowCreateCurveFlip (char *graphName, char *direction, int *status) { PowCurve *current_curve; PowVector *Xvec, *Yvec; double xdatum, ydatum; int i, j; char curveName[1024]; sprintf(curveName, "c1_%s", graphName); status = 0; current_curve = PowFindCurve(curveName); Xvec = current_curve->x_vector; Yvec = current_curve->y_vector; for (i = Xvec->offset, j = Yvec->offset ; i < Xvec->offset + current_curve->length ; i++, j++) { xdatum = PowExtractDatum(Xvec->dataptr,i); ydatum = PowExtractDatum(Yvec->dataptr,j); if (strcmp(direction, "X")) { /* PowPutDatum(Xvec->dataptr, (double)i, i); */ } else if (strcmp(direction, "Y")) { /* PowPutDatum(Yvec->dataptr, (double)j, j); */ } } } fv5.4/tcltk/pow/PowCreateData.c0000644000220700001010000001675312076071117015777 0ustar birbylheadev#include "pow.h" /* Initializes a PowData structure and adds it to powTable */ void PowCreateData(char *data_name, void *data_array, int *data_type, int *length, int *copy, int *status) { PowData *array_instance; Tcl_HashEntry *entry_ptr; char *str_ptr; char *orig_ptr,*cpy_ptr; int new = 0; int i; entry_ptr = Tcl_CreateHashEntry(&PowDataTable, data_name, &new); #ifdef DEBUG if (!new) { printf("Reusing data name: %s\n",data_name); } #endif array_instance = (PowData *) ckalloc(sizeof(PowData)); if(array_instance == NULL) { *status = TCL_ERROR; fprintf(stderr, "Couldn't ckalloc array structure space"); Tcl_DeleteHashEntry(entry_ptr); return; } Tcl_SetHashValue( entry_ptr, array_instance); str_ptr = ckalloc(strlen(data_name)+1); strncpy(str_ptr,data_name,strlen(data_name)+1); array_instance->data_name = str_ptr; array_instance->data_array = data_array; array_instance->copy = *copy; array_instance->data_type = *data_type; array_instance->length = *length; if (array_instance->data_type >= 8 || array_instance->data_type <= -8) { switch (array_instance->data_type) { case 8: array_instance->data_type = 0; break; case 16: array_instance->data_type = 1; break; case 32: array_instance->data_type = 2; break; case -32: array_instance->data_type = 3; break; case -64: array_instance->data_type = 4; break; case 64: array_instance->data_type = 5; break; default: *status = TCL_ERROR; fprintf(stderr, "Unknown data type\n"); Tcl_DeleteHashEntry(entry_ptr); return; } } if( *copy > 0 ) { /* copy data: If *copy<0, don't copy but free pointer in DestroyData */ orig_ptr = (char *) data_array; array_instance->data_array = (void *) ckalloc(*length * pixelSizes[*data_type]); if(array_instance->data_array == NULL) { *status = TCL_ERROR; fprintf(stderr, "Couldn't allocate space for copy of data."); Tcl_DeleteHashEntry(entry_ptr); return; } cpy_ptr = (char *) array_instance->data_array; for (i=0; i < *length * pixelSizes[*data_type]; i++) { *(cpy_ptr++) = *(orig_ptr++); } } } /* Initializes a PowData structure and adds it to powTable */ void PowCreateDataFlip(char *data_name, char *direction, int *height, int *width, int *status) { PowData *array_instance; char *start_ptr; char *orig_ptr, *cpy_ptr; int data_type = 0; int i, j, k; int cIdx, whichset; long value, maxValue, minValue; void *tmp_array; array_instance = PowFindData(data_name); if (array_instance == (PowData *) NULL) { *status = TCL_ERROR; fprintf(stderr, "Couldn't locate data_name, %s.", data_name); return; } data_type = array_instance->data_type; orig_ptr = (char *) array_instance->data_array; tmp_array = (void *) ckalloc(array_instance->length * pixelSizes[array_instance->data_type]); if (tmp_array == NULL) { *status = TCL_ERROR; fprintf(stderr, "Couldn't allocate space for copy of data."); return; } cpy_ptr = (char *) tmp_array; switch (*direction) { case 'X': cIdx = 0; for (i=0; i < *height; i++) { whichset = i; maxValue = whichset * (*width) + (*width) - 1; minValue = whichset * (*width); for (j = 0; j < *width; j++) { value = maxValue; maxValue--; start_ptr = orig_ptr + value * pixelSizes[array_instance->data_type]; for (k = 0; k < pixelSizes[array_instance->data_type]; k++) { *(cpy_ptr++) = *(start_ptr++); } cIdx++; } } break; case 'Y': cIdx = 0; whichset = *height; for (i=0; i < *height; i++) { maxValue = whichset * (*width) - 1; minValue = whichset * (*width) - (*width); for (j=0; j < *width; j++) { value = minValue; minValue++; start_ptr = orig_ptr + value * pixelSizes[array_instance->data_type]; for (k = 0; k < pixelSizes[array_instance->data_type]; k++) { *(cpy_ptr++) = *(start_ptr++); } cIdx++; } whichset--; } break; default: break; } start_ptr = (char *) array_instance->data_array; cpy_ptr = (char *) tmp_array; /* copy the result data back to array */ for (k = 0; k < array_instance->length * pixelSizes[array_instance->data_type]; k++) { *(start_ptr++) = *(cpy_ptr++); } ckfree(tmp_array); } void PowCreateVectorDataFlip(char *data_name, int *length, int *status) { PowData *array_instance; char *start_ptr; char *orig_ptr, *cpy_ptr, *pixel_ptr; int data_type = 0; int i, k; void *tmp_array, *pixel_array; array_instance = PowFindData(data_name); if (array_instance == (PowData *) NULL) { *status = TCL_ERROR; fprintf(stderr, "Couldn't locate data_name, %s.", data_name); return; } data_type = array_instance->data_type; orig_ptr = (char *) array_instance->data_array; tmp_array = (void *) ckalloc(array_instance->length * pixelSizes[array_instance->data_type]); if (tmp_array == NULL) { *status = TCL_ERROR; fprintf(stderr, "Couldn't allocate space for copy of data."); return; } cpy_ptr = (char *) tmp_array; for (i=(array_instance->length) - 1; i >= 0; i--) { pixel_array = (char *) ckalloc(pixelSizes[array_instance->data_type] + 1); pixel_ptr = (char *) pixel_array; start_ptr = orig_ptr + i * pixelSizes[array_instance->data_type]; for (k = 0; k < pixelSizes[array_instance->data_type]; k++) { *(cpy_ptr++) = *(start_ptr); *(pixel_ptr++) = *(start_ptr++); } ckfree(pixel_array); } start_ptr = (char *) array_instance->data_array; cpy_ptr = (char *) tmp_array; /* copy the result data back to array */ for (k = 0; k < array_instance->length * pixelSizes[array_instance->data_type]; k++) { *(start_ptr++) = *(cpy_ptr++); } ckfree(tmp_array); } void PowDestroyData(char *data_name, int *status) { Tcl_HashEntry *entry_ptr; char errormsg[1024]; PowData *data_ptr; entry_ptr = Tcl_FindHashEntry(&PowDataTable,data_name); if (entry_ptr == NULL) { *status = TCL_ERROR; sprintf(errormsg,"Can't find POWData Object %s to destroy",data_name); Tcl_SetResult(interp,errormsg,TCL_VOLATILE); return; } data_ptr = (PowData *)Tcl_GetHashValue(entry_ptr); /*free the data if it's ours*/ if (data_ptr->copy != 0) { ckfree(data_ptr->data_array); } /*Delete the entry from the master POWData Hash*/ Tcl_DeleteHashEntry(entry_ptr); /*free the PowData memory itself and the string holding the name, although this is small change*/ ckfree( (char*)data_ptr->data_name); ckfree( (char*)data_ptr); } void PowRegisterData(PowData *dataptr,int *status) { int new = 0; Tcl_HashEntry *entry_ptr; entry_ptr = Tcl_CreateHashEntry(&PowDataTable, dataptr->data_name, &new); #ifdef DEBUG if (!new) { printf("Reusing data name: %s\n",data_name); } #endif Tcl_SetHashValue( entry_ptr, dataptr); return; } fv5.4/tcltk/pow/PowCreateGraph.c0000644000220700001010000002375212076355402016166 0ustar birbylheadev#include "pow.h" void PowCreateGraph(char *graph_name, char *curves, char *images, char *xunits, char *yunits, char *xlabel, char *ylabel, int *xdimdisp, int *ydimdisp, double *xmin_in, double *ymin_in, double *xmax_in, double *ymax_in, int *status) { char whichPowCanvas[9]=".pow.pow"; PowCreateGraph_internal(graph_name, curves, images, xunits, yunits, xlabel, ylabel, xdimdisp, ydimdisp, xmin_in, ymin_in, xmax_in, ymax_in, whichPowCanvas, status) ; } void PowCreateGraph_internal(char *graph_name, char *curves, char *images, char *xunits, char *yunits, char *xlabel, char *ylabel, int *xdimdisp, int *ydimdisp, double *xmin_in, double *ymin_in, double *xmax_in, double *ymax_in, char *whichPowCanvas, int *status) { /* xdimdisp and ydimdisp are the *displayed* size of the new graph it will be zoomed or shrunk by an integral or 1/integral factor to come as close as possible to filling this requested space. If xdimdisp and ydimdisp are both 0, the graph will appear at Magstep 1 */ PowGraph *graph_instance; Tcl_HashEntry *entry_ptr; int new = 0; double xmin,xmax,ymin,ymax,xdim,ydim,tmp; int xmargin,ymargin; double xoff, yoff; char bbox[128]; char extraparams[256], *pPtr; char *str_ptr; char *aspect="no"; int in_limits; int x_points_right,y_points_up; int len; int zoomed; char *idxStr; const char *graphType; int xCount, yCount; const char *WCSvalue; char errormsg[512]; in_limits = 1; entry_ptr = Tcl_CreateHashEntry(&PowGraphTable, graph_name, &new); if ( new ) { graph_instance = (PowGraph *) ckalloc(sizeof(PowGraph)); if(graph_instance == NULL) { *status = TCL_ERROR; Tcl_SetResult( interp, "Couldn't ckalloc graph structure space", TCL_VOLATILE ); Tcl_DeleteHashEntry(entry_ptr); return; } Tcl_SetHashValue( entry_ptr, graph_instance); /* Copy graph_name into graph's structure */ str_ptr = ckalloc(strlen(graph_name)+1); strcpy(str_ptr,graph_name); graph_instance->graph_name = str_ptr; } else { #ifdef DEBUG printf("Reusing graph name: %s\n",graph_name); #endif graph_instance = (PowGraph *) Tcl_GetHashValue( entry_ptr ); /* Free up old string pointers */ ckfree(graph_instance->xunits); ckfree(graph_instance->yunits); ckfree(graph_instance->xlabel); ckfree(graph_instance->ylabel); } if (xmin_in != NULL && xmax_in != NULL && *xmin_in > *xmax_in) { x_points_right = 0; } else { x_points_right = 1; } if (ymin_in != NULL && ymax_in != NULL && *ymin_in > *ymax_in) { y_points_up = 0; } else { y_points_up = 1; } graph_instance->WCS.haveWCSinfo = 0; PowWCSInitGraph( graph_instance, curves, images, x_points_right, y_points_up); /* FillinWCSStructure ( &graph_instance->WCS ); image_instance = PowFindImage(images); FillinWCSStructure ( &image_instance->WCS ); */ /* Do we need to keep a fixed Aspect ratio? */ if( graph_instance->WCS.type[0] || ( images != NULL && strstr(images,"NULL") == NULL ) ) aspect = "yes"; /* * If any of the min/max values are not specified, search * the graph's contents for its bounding box. */ if( xmin_in==NULL || xmax_in==NULL || ymin_in==NULL || ymax_in==NULL ) { if( PowFindGraphBBox( graph_instance, images, curves, &xmin, &xmax, &ymin, &ymax ) != TCL_OK ) { *status = TCL_ERROR; Tcl_AppendResult( interp, "\nError locating curves' bounding boxes", NULL ); ckfree( (char *)graph_instance->graph_name ); ckfree( (char *)graph_instance ); Tcl_DeleteHashEntry(entry_ptr); return; } } /* Now apply supplied bounding box values */ if (xmin_in != NULL) xmin = *xmin_in; if (xmax_in != NULL) xmax = *xmax_in; if (ymin_in != NULL) ymin = *ymin_in; if (ymax_in != NULL) ymax = *ymax_in; if (xmin == xmax) { if(xmin == 0) { xmax = 1; } else { xmin *= 0.9; xmax *= 1.1; } } if (ymin == ymax) { if (ymin == 0) { ymax = 1; } else { ymin *= 0.9; ymax *= 1.1; } } len = strlen(graph_name)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "graphType", graph_name); graphType = Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY); ckfree(idxStr); len = strlen(graph_name)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "zoomed", graph_name); zoomed = atoi(Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY)); ckfree(idxStr); xCount = atoi(Tcl_GetVar2(interp,"xCount",graph_name,TCL_GLOBAL_ONLY)); yCount = atoi(Tcl_GetVar2(interp,"yCount",graph_name,TCL_GLOBAL_ONLY)); if ( graph_instance->WCS.type[0] == '\0' && strcmp(graphType, "binary") == 0 && xCount % 2 != 0 ) { graph_instance->WCS.cdFrwd[0][0] = 1.0; } if ( graph_instance->WCS.type[0] == '\0' && strcmp(graphType, "binary") == 0 && yCount % 2 != 0 ) { graph_instance->WCS.cdFrwd[1][1] = 1.0; } if( PowSortGraphMinMax(graph_instance,&xmin,&xmax,&ymin,&ymax,&xdim,&ydim) ) { /* Bounding box is invalid. Force default bounding box. */ PowFindGraphBBox( graph_instance, images, curves, &xmin, &xmax, &ymin, &ymax ); PowSortGraphMinMax(graph_instance,&xmin,&xmax,&ymin,&ymax,&xdim,&ydim); } WCSvalue = Tcl_GetVar(interp,"powWCSTranslation",TCL_GLOBAL_ONLY); if (WCSvalue[0] != '0') { sprintf(errormsg, "\nError translating WCS information. error:<%s>.", WCSvalue); *status = TCL_ERROR; Tcl_AppendResult( interp, errormsg, NULL ); Tcl_DeleteHashEntry(entry_ptr); return; } /* Chai 06/29/2007: We are not actually fliping the coordinates on the canvas. If tk allows this, then there is no need to do the following. What the logic below is to trick pow to think that the point on the canvas has been flipped. The xCount and yCount indicate if the graph has been flipped before. So if X has been previously flipped, the next flipping occurs on Y, the logic inside ..Count % 2 will make sure the information on previous flip still maintained. */ if ( graph_instance->WCS.type[0] == '\0' && strcmp(graphType, "binary") == 0 && xCount % 2 != 0 ) { /* previous flip */ tmp = xmin; xmin = xmax; xmax = tmp; } if ( graph_instance->WCS.type[0] == '\0' && strcmp(graphType, "binary") == 0 && yCount % 2 != 0 ) { /* previous flip */ tmp = ymin; ymin = ymax; ymax = tmp; } graph_instance->xleft = xmin; graph_instance->xright = xmax; graph_instance->ybot = ymin; graph_instance->ytop = ymax; PowPosToPix( xmin, ymin, &graph_instance->WCS, &xoff, &yoff ); graph_instance->WCS.refPix[0] -= xoff; graph_instance->WCS.refPix[1] -= yoff; graph_instance->xoff -= xoff; graph_instance->yoff -= yoff; str_ptr = ckalloc(strlen(xunits)+1); strncpy(str_ptr,xunits,strlen(xunits)+1); graph_instance->xunits = str_ptr; str_ptr = ckalloc(strlen(yunits)+1); strncpy(str_ptr,yunits,strlen(yunits)+1); graph_instance->yunits = str_ptr; str_ptr = ckalloc(strlen(xlabel)+1); strncpy(str_ptr,xlabel,strlen(xlabel)+1); graph_instance->xlabel = str_ptr; str_ptr = ckalloc(strlen(ylabel)+1); strncpy(str_ptr,ylabel,strlen(ylabel)+1); graph_instance->ylabel = str_ptr; sprintf(bbox," %#.17g %#.17g %#.17g %#.17g", graph_instance->xleft, graph_instance->xright, graph_instance->ybot, graph_instance->ytop); if( xdimdisp && *xdimdisp<=0 ) *xdimdisp = (int)xdim; if( ydimdisp && *ydimdisp<=0 ) *ydimdisp = (int)ydim; xmargin = 80; ymargin = 60; sprintf(extraparams," %#.17g %#.17g ", xdim, ydim ); /* Handle possible NULL value of dimdisp's */ pPtr = extraparams + strlen(extraparams); if( xdimdisp ) sprintf(pPtr, "%d ", *xdimdisp); else sprintf(pPtr, "NULL "); pPtr += strlen( pPtr ); if( ydimdisp ) sprintf(pPtr, "%d ", *ydimdisp); else sprintf(pPtr, "NULL "); pPtr += strlen( pPtr ); sprintf(pPtr, "%s %d %d ",aspect, xmargin, ymargin); if ( Tcl_VarEval(interp, "powInitGraph ", graph_name, bbox," {", xunits,"} {", yunits,"} {",xlabel,"} {",ylabel,"} ", whichPowCanvas, extraparams, (char *) NULL) == TCL_ERROR) { *status = TCL_ERROR; Tcl_AppendResult( interp, "\nError initializing graph.", NULL ); Tcl_DeleteHashEntry(entry_ptr); return; }; if( images==NULL ) images="NULL"; if( curves==NULL ) curves="NULL"; if ( Tcl_VarEval(interp, "powBuildGraph ", graph_name, " [list ", images," ] ", " [list ", curves," ] ", whichPowCanvas, (char *) NULL) == TCL_ERROR) { *status = TCL_ERROR; Tcl_AppendResult( interp, "\nError building graph.", NULL ); Tcl_DeleteHashEntry(entry_ptr); return; } if ( !strcmp( whichPowCanvas, ".pow.pow" ) ) { if ( Tcl_VarEval(interp, "powSelectGraph ", graph_name, (char *) NULL) == TCL_ERROR) { *status = TCL_ERROR; Tcl_AppendResult( interp, "\nError selecting graph.", NULL ); Tcl_DeleteHashEntry(entry_ptr); return; } } } void PowDestroyGraph(char *graph_name, int *status) { Tcl_HashEntry *entry_ptr; char errormsg[1024]; PowGraph *graph_ptr; entry_ptr = Tcl_FindHashEntry(&PowGraphTable,graph_name); if (entry_ptr == NULL) { *status = TCL_ERROR; sprintf(errormsg,"Can't find POWGraph Object %s to destroy",graph_name); Tcl_SetResult(interp,errormsg,TCL_VOLATILE); return; } Tcl_VarEval(interp,"powUnmapGraph ",graph_name,(char *)NULL); Tcl_VarEval(interp,"powFreeGraph ", graph_name,(char *)NULL); graph_ptr = (PowGraph *)Tcl_GetHashValue(entry_ptr); /*Delete the entry from the master POWData Hash*/ Tcl_DeleteHashEntry(entry_ptr); /*free the PowGraph memory itself and the string holding the name and labels, although this is small change*/ ckfree(graph_ptr->graph_name); ckfree(graph_ptr->xunits); ckfree(graph_ptr->yunits); ckfree(graph_ptr->xlabel); ckfree(graph_ptr->ylabel); ckfree((char*)graph_ptr); return; } fv5.4/tcltk/pow/PowCreateImage.c0000644000220700001010000002126112153447565016150 0ustar birbylheadev#include "pow.h" void PowCreateImage(char *image_name, char *data_name, int *xoffset, int *yoffset, int *width, int *height, double *xorigin, double *xinc, double *yorigin, double *yinc, char *xunits, char *yunits, char *zunits, int *status) { /* xinc or yinc == 0 will mean count by integers */ PowImage *image_instance; PowData *dataptr; #if !(defined(__WIN32__) || defined(macintosh)) Tk_PictHandle pict_image_handle; Tk_PictImageBlock pict_block; PictMaster *masterPtr; #endif Tk_PhotoHandle photo_image_handle; Tk_PhotoImageBlock photo_block; Tcl_HashEntry *entry_ptr; int new = 0; char *str_ptr; int pseudoImages; double min,max; char smin[30]; char smax[30]; double datum; int i, wcsStatus; const char *WCSstring; char powWCS[7]="powWCS"; Tcl_GetInt(interp,Tcl_GetVar(interp,"powPseudoImages",TCL_GLOBAL_ONLY), &pseudoImages); entry_ptr = Tcl_CreateHashEntry(&PowImageTable, image_name, &new); if (!new) { /* fprintf(stdout, "Reusing image name: %s\n", image_name); */ #ifdef DEBUG printf("Reusing image name: %s",image_name); #endif #if !(defined(__WIN32__) || defined(macintosh)) /* zero out the data ptr field so VISU won't throw away our data */ /* when you reuse an image name, VISU calls ImgPictDelete on it */ /* this frees the data pointer. We don't want that.... */ if( pseudoImages ) { masterPtr = (PictMaster *)Tk_FindPict(image_name); if ( (unsigned char*)masterPtr->data == masterPtr->bytedata) { masterPtr->bytedata = NULL; } masterPtr->data = NULL; } #endif } image_instance = (PowImage *) ckalloc(sizeof(PowImage)); if(image_instance == NULL) { *status = TCL_ERROR; fprintf(stderr, "Couldn't malloc image structure space"); Tcl_DeleteHashEntry(entry_ptr); return; } Tcl_SetHashValue( entry_ptr, image_instance); str_ptr = ckalloc(strlen(image_name)+1); strncpy(str_ptr,image_name,strlen(image_name)+1); image_instance->image_name = str_ptr; image_instance->xoffset = *xoffset; image_instance->yoffset = *yoffset; image_instance->width = *width; image_instance->height = *height; image_instance->xorigin = *xorigin; image_instance->xinc = *xinc; image_instance->yorigin = *yorigin; image_instance->yinc = *yinc; str_ptr = ckalloc(strlen(xunits)+1); strncpy(str_ptr,xunits,strlen(xunits)+1); image_instance->xunits = str_ptr; str_ptr = ckalloc(strlen(yunits)+1); strncpy(str_ptr,yunits,strlen(yunits)+1); image_instance->yunits = str_ptr; str_ptr = ckalloc(strlen(zunits)+1); strncpy(str_ptr,zunits,strlen(zunits)+1); image_instance->zunits = str_ptr; /* Now set up the image */ if (pseudoImages != 0) { #if !(defined(__WIN32__) || defined(macintosh)) /* use Pict widget (Visu) */ if (Tcl_VarEval(interp,"image create pict ",image_instance->image_name,(char *) NULL) == TCL_ERROR) { *status = TCL_ERROR; fprintf(stderr, "%s\n", Tcl_GetStringResult(interp)); Tcl_DeleteHashEntry(entry_ptr); return; } pict_image_handle = Tk_FindPict(image_instance->image_name); if(pict_image_handle == NULL) { *status = TCL_ERROR; fprintf(stderr, "%s\n", Tcl_GetStringResult(interp)); Tcl_DeleteHashEntry(entry_ptr); return; } image_instance->image_handle = (void *) pict_image_handle; #else fprintf(stderr,"You should not see this. Pict images disabled in Win32.\n"); return; #endif /*__WIN32__ || macintosh*/ } else { /* use Photo widget */ if (Tcl_VarEval(interp,"image create photo ",image_instance->image_name,(char *) NULL) == TCL_ERROR) { *status = TCL_ERROR; fprintf(stderr, "%s\n", Tcl_GetStringResult(interp)); Tcl_DeleteHashEntry(entry_ptr); return; } photo_image_handle = Tk_FindPhoto(interp,image_instance->image_name); if(photo_image_handle == NULL) { *status = TCL_ERROR; fprintf(stderr, "%s\n", Tcl_GetStringResult(interp)); Tcl_DeleteHashEntry(entry_ptr); return; } image_instance->image_handle = (void *) photo_image_handle; } /* Get the data address out of the hash table */ entry_ptr = Tcl_FindHashEntry (&PowDataTable, data_name); if(entry_ptr == NULL) { *status = TCL_ERROR; fprintf(stderr, "%s\n", Tcl_GetStringResult(interp)); Tcl_DeleteHashEntry(entry_ptr); return; } dataptr = (PowData *) Tcl_GetHashValue(entry_ptr); /*Setup displayed min and max stuff */ min = DBL_MAX; max = -DBL_MAX; for (i = 0; i < image_instance->width * image_instance->height; i++) { datum = PowExtractDatum(dataptr,i); if (datum != DBL_MAX) { min = (datum < min) ? datum : min; max = (datum > max) ? datum : max; } } if( max==-DBL_MAX ) min=max=0.0; sprintf(smin,"%.17lg",min); sprintf(smax,"%.17lg",max); Tcl_SetVar2(interp,"powRBmin",image_name,smin,TCL_GLOBAL_ONLY); Tcl_SetVar2(interp,"powRBmax",image_name,smax,TCL_GLOBAL_ONLY); image_instance->dataptr = dataptr; /* notice that the "offsets" are not implemented here yet*/ /* this will require some serious tweaking to pixelPtr and skip fields */ if (pseudoImages != 0) { #if !(defined(__WIN32__) || defined(macintosh)) /*Pict*/ pict_block.datatype = dataptr->data_type; pict_block.pixelPtr = (unsigned char *) dataptr->data_array; pict_block.width = image_instance->width; pict_block.height = image_instance->height; pict_block.pixelSize = pixelSizes[dataptr->data_type]; pict_block.pitch = pict_block.pixelSize; pict_block.skip = 0; pict_block.copy = NO_COPY; Tk_PictExpand(pict_image_handle,image_instance->width,image_instance->height); Tk_PictPutBlock(pict_image_handle,&pict_block,0,0,image_instance->width,image_instance->height); #else fprintf(stderr,"You should not see this\n"); return; #endif /*__WIN32__ || macintosh*/ } else { PowDitherToPhoto(image_instance,&photo_block,min,max); photo_block.pixelSize = 3; photo_block.width = image_instance->width; photo_block.height = image_instance->height; photo_block.pitch = image_instance->width * 3; photo_block.offset[0] = 0; photo_block.offset[1] = 1; photo_block.offset[2] = 2; Tk_PhotoExpand(interp, photo_image_handle, image_instance->width, image_instance->height); Tk_PhotoPutBlock(interp, photo_image_handle, &photo_block, 0, 0, image_instance->width, image_instance->height, TK_PHOTO_COMPOSITE_SET); ckfree(photo_block.pixelPtr); } /* Call WCS init procedure if applicable */ wcsStatus = TCL_ERROR; WCSstring = Tcl_GetVar2(interp,powWCS,image_name,TCL_GLOBAL_ONLY); if( (WCSstring != NULL) && strcmp(WCSstring,"") ) { wcsStatus = Tcl_VarEval(interp, "powWCSInitImage ", image_name, " ", WCSstring, (char *) NULL); } if( wcsStatus == TCL_ERROR ) { image_instance->xorigin -= 0.5*image_instance->xinc; image_instance->yorigin -= 0.5*image_instance->yinc; image_instance->xotherend = image_instance->xorigin + image_instance->width*image_instance->xinc; image_instance->yotherend = image_instance->yorigin + image_instance->height*image_instance->yinc; memset(image_instance->WCS.type, '\0', 6); image_instance->WCS.nAxis = 2; image_instance->WCS.refVal[0] = image_instance->xorigin; image_instance->WCS.refVal[1] = image_instance->yorigin; image_instance->WCS.refPix[0] = -0.5; image_instance->WCS.refPix[1] = -0.5; image_instance->WCS.cdFrwd[0][0] = image_instance->xinc; image_instance->WCS.cdFrwd[1][1] = image_instance->yinc; image_instance->WCS.cdFrwd[0][1] = 0.0; image_instance->WCS.cdFrwd[1][0] = 0.0; image_instance->WCS.cdRvrs[0][0] = 1.0/image_instance->xinc; image_instance->WCS.cdRvrs[1][1] = 1.0/image_instance->yinc; image_instance->WCS.cdRvrs[0][1] = 0.0; image_instance->WCS.cdRvrs[1][0] = 0.0; } return; } void PowDestroyImage(char *image_name, int *status) { Tcl_HashEntry *entry_ptr; char errormsg[1024]; PowImage *image_ptr; entry_ptr = Tcl_FindHashEntry(&PowImageTable,image_name); if (entry_ptr == NULL) { *status = TCL_ERROR; sprintf(errormsg,"Can't find POWImage Object %s to destroy",image_name); Tcl_SetResult(interp,errormsg,TCL_VOLATILE); return; } image_ptr = (PowImage *)Tcl_GetHashValue(entry_ptr); /*Delete the entry from the master POWData Hash*/ Tcl_DeleteHashEntry(entry_ptr); /*free the PowImage memory itself and the string holding the name, although this is small change*/ ckfree(image_ptr->image_name); ckfree(image_ptr->xunits); ckfree(image_ptr->yunits); ckfree(image_ptr->zunits); ckfree((char*)image_ptr); return; } fv5.4/tcltk/pow/PowCreateVector.c0000644000220700001010000000570212076071117016360 0ustar birbylheadev#include "pow.h" void PowCreateVector(char *vector_name, char *data_name, int *offset, int *length, char *units, int *status) { PowVector *vector_instance; PowData *dataptr; Tcl_HashEntry *entry_ptr,*data_entry_ptr; int new = 0; char *str_ptr; entry_ptr = Tcl_CreateHashEntry(&PowVectorTable, vector_name, &new); #ifdef DEBUG if (!new) { printf("Reusing vector name: %s\n",vector_name); } #endif vector_instance = (PowVector *) ckalloc(sizeof(PowVector)); if(vector_instance == NULL) { *status = TCL_ERROR; fprintf(stderr, "Couldn't malloc vector structure space"); Tcl_DeleteHashEntry(entry_ptr); return; } Tcl_SetHashValue( entry_ptr, vector_instance); data_entry_ptr = Tcl_FindHashEntry(&PowDataTable, data_name); if(data_entry_ptr == NULL) { *status = TCL_ERROR; fprintf(stderr, "Couldn't find data: %s\n", data_name); Tcl_DeleteHashEntry(entry_ptr); return; } dataptr = (PowData *) Tcl_GetHashValue(data_entry_ptr); str_ptr = ckalloc(strlen(vector_name)+1); strncpy(str_ptr,vector_name,strlen(vector_name)+1); vector_instance->vector_name = str_ptr; vector_instance->dataptr = dataptr; vector_instance->offset = *offset; if (length == NULL) { vector_instance->length = dataptr->length; } else { vector_instance->length = *length; } str_ptr = ckalloc(strlen(units)+1); strncpy(str_ptr,units,strlen(units)+1); vector_instance->units = str_ptr; } void PowCreateVectorEN(char *vector_name, char *data_name, int *length, double *start, double *increment, char *units, int *status) { double *array; int data_type; int offset; int i; PowData *data_instance; array = (double *) ckalloc(*length * sizeof(double)); for (i = 0; i < *length; i++) { array[i] = *start + *increment * (double) i; } data_type = DOUBLE_DATA; i = 0; PowCreateData(data_name, (void *) array, &data_type, length, &i, status); data_instance = PowFindData(data_name); /*Since this data was made by us, we'll mark it as a POW copy so that PowDestroyData will free it.*/ data_instance->copy = 1; offset = 0; PowCreateVector(vector_name, data_name, &offset, length, units, status); return; } void PowDestroyVector(char *vector_name, int *status) { Tcl_HashEntry *entry_ptr; char errormsg[1024]; PowVector *vector_ptr; entry_ptr = Tcl_FindHashEntry(&PowVectorTable,vector_name); if (entry_ptr == NULL) { *status = TCL_ERROR; sprintf(errormsg,"Can't find POWVector Object %s to destroy",vector_name); Tcl_SetResult(interp,errormsg,TCL_VOLATILE); return; } vector_ptr = (PowVector *)Tcl_GetHashValue(entry_ptr); /*Delete the entry from the master POWData Hash*/ Tcl_DeleteHashEntry(entry_ptr); /*free the PowVector memory itself and the string holding the name, although this is small change*/ ckfree(vector_ptr->vector_name); ckfree(vector_ptr->units); ckfree((char *)vector_ptr); return; } fv5.4/tcltk/pow/PowDrvr.c0000644000220700001010000001034107446135643014714 0ustar birbylheadev/************************************************************************ * * POW C socket/XPA driver * * Use this code to make an XPA connection to a POW process and * send pow scripting commands. * ***********************************************************************/ #include #include #include #include #include #include int openPowConnection ( void ); void closePowConnection ( void ); int sendSetCmdToPow ( char *cmd, char *buf, int buflen ); int sendGetCmdToPow ( char *cmd, char **rtnBuf, int *bufLen ); int postProcessCall ( int got, char **names, char **messages ); #define NXPA 1 static XPA powConnection = NULL; static char *powAddress = NULL; int openPowConnection() { extern XPA powConnection; char *rtnBuf; int bufLen; if( !powAddress ) { powAddress = getenv( "POW_DISPLAY" ); if( !powAddress || strlen(powAddress)==0 ) { /* POW_DISPLAY not defined, must depend on a name server */ powAddress = "pow"; } } powConnection = XPAOpen( NULL ); if( sendGetCmdToPow( "version", &rtnBuf, &bufLen )<0 ) { system("POWplot &"); sendSetCmdToPow( "scope 0", NULL, 0); sleep(3); if( sendGetCmdToPow( "version", &rtnBuf, &bufLen )<0 ) { sleep(3); if( sendGetCmdToPow( "version", &rtnBuf, &bufLen )<0 ) { return 1; } } } free( rtnBuf ); return 0; } void closePowConnection() { extern XPA powConnection; XPAClose( powConnection ); powConnection = NULL; } int sendGetCmdToPow( char *cmd, char **rtnBuf, int *bufLen) { int got, stat=0; char *bufs[NXPA]; char *names[NXPA]; char *messages[NXPA]; int lens[NXPA]; extern XPA powConnection; extern char *powAddress; /* Flush 'sendSet' command cache */ stat = sendSetCmdToPow( NULL, NULL, -1 ); if( !stat ) { got = XPAGet(powConnection, powAddress, cmd, "", bufs, lens, names, messages, NXPA); if( got==0 ) stat = -1; else stat = postProcessCall(got, names, messages); *rtnBuf = bufs[0]; *bufLen = lens[0]; } return stat; } int sendSetCmdToPow( char *cmd, char *buf, int buflen ) { int got, len, stat=0; char *names[NXPA]; char *messages[NXPA]; extern XPA powConnection; extern char *powAddress; static char *cache = NULL; static int cachePos = 0; static int cacheSize = 0; switch ( buflen ) { case -2: /* Free the cache */ free(cache); cache = NULL; cachePos = cacheSize = 0; break; case -1: /* Flush the cache */ if( cachePos ) { len = cachePos; cachePos = 0; stat = sendSetCmdToPow( "tcl", cache, len ); } break; case 0: /* No data, so just cache command */ len = strlen(cmd); if( cachePos + len + 2 > cacheSize ) { cacheSize += 4096 + len; if( cache ) { cache = (char*) realloc( cache, sizeof(char) * cacheSize ); } else { cache = (char*) malloc( sizeof(char) * cacheSize ); } } cache[cachePos++] = '\n'; strcpy( cache+cachePos, cmd ); cachePos += len; if( cachePos>60000 ) { /* Flush the cache */ stat = sendSetCmdToPow( NULL, NULL, -1 ); } break; default: /* Data being sent */ if( cachePos ) { /* Flush cache first */ stat = sendSetCmdToPow( NULL, NULL, -1 ); } if( !stat ) { got = XPASet(powConnection, powAddress, cmd, "", buf, buflen, names, messages, NXPA); if( got==0 ) stat = -1; else stat = postProcessCall(got, names, messages); } break; } return stat; } int postProcessCall( int got, char **names, char **messages ) { int i, status=0; for(i=0; iWCS.type[0]!='\0'); /***********************************/ /* Get the bounding box of graph */ /***********************************/ sprintf(cmdLine, "%s coords %sbox", canvas, gn ); if( Tcl_Eval(interp,cmdLine)!=TCL_OK ) { Tcl_SetResult(interp,"Couldn't get bounding box", TCL_VOLATILE); return TCL_ERROR; } strncpy(cmdLine,Tcl_GetStringResult(interp),256); Tcl_SplitList(interp,cmdLine,&i,&list); len = strlen(gn)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "graphType", gn); graphType = Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY); ckfree(idxStr); len = strlen(gn)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "zoomed", gn); zoomed = atoi(Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY)); ckfree(idxStr); xCount = atoi(Tcl_GetVar2(interp,"xCount",gn,TCL_GLOBAL_ONLY)); yCount = atoi(Tcl_GetVar2(interp,"yCount",gn,TCL_GLOBAL_ONLY)); Tcl_GetDouble(interp,list[0],&(bbox_ll.x)); Tcl_GetDouble(interp,list[1],&(bbox_ur.y)); Tcl_GetDouble(interp,list[2],&(bbox_ur.x)); Tcl_GetDouble(interp,list[3],&(bbox_ll.y)); /* Chai 06/29/2007: We are not actually fliping the coordinates on the canvas. If tk allows this, then there is no need to do the following. What the logic below is to trick pow to think that the point on the canvas has been flipped. The xCount and yCount indicate if the graph has been flipped before. So if X has been previously flipped, the next flipping occurs on Y, the logic inside ..Count % 2 will make sure the information on previous flip still exists. */ /* Chai 07/19/2007: When reverse axis for a plot with WCS, the CDELT value was changed (i.e. * -1.0) in pow.tcl powFlipImage routine and reset in powResetWcsStructure C code. That is enough to flip the axis so there is no need to recalculate the value. Just call routines in this file the normal way. */ if ( (graph->WCS.type[0] == '\0' && zoomed == 0) && strcmp(graphType, "binary") == 0 && xCount % 2 != 0 ) { /* previous flip */ Tcl_GetDouble(interp,list[0],&(bbox_ur.x)); Tcl_GetDouble(interp,list[2],&(bbox_ll.x)); } if ( (graph->WCS.type[0] == '\0' && zoomed == 0) && strcmp(graphType, "binary") == 0 && yCount % 2 != 0 ) { /* previous flip */ Tcl_GetDouble(interp,list[1],&(bbox_ll.y)); Tcl_GetDouble(interp,list[3],&(bbox_ur.y)); } BotLft.x = bbox_ll.x; BotLft.y = bbox_ll.y; TopLft.x = bbox_ll.x; TopLft.y = bbox_ur.y; TopRgt.x = bbox_ur.x; TopRgt.y = bbox_ur.y; BotRgt.x = bbox_ur.x; BotRgt.y = bbox_ll.y; Tcl_GetDouble(interp,list[0],&(BotLft_real.x)); Tcl_GetDouble(interp,list[3],&(BotLft_real.y)); ckfree((char *) list); resultLen = 1024; result = ckalloc(sizeof(char)*resultLen); result[0] = 0; /*************************************************/ /* Create an array of grid points around graph */ /* and use it to obtain the list of tick marks */ /*************************************************/ nGrid = CreateGridPts(graph,zoomed, graphType,xCount,yCount,BotLft_real, BotLft,TopRgt,&Grid); nTicks = GetTicks(nGrid,Grid,useWCS,tickScal,numTicks,&TickList,&TickAxis); for( i=0; i0 && k=2 ) { char *line,*cmd; int loc=0; line = ckalloc(sizeof(char)*nSegs*60); for( k=0; kWCS.type[0] != '\0' && strcmp(graphType, "binary") == 0 && (xCount % 2 != 0 || yCount % 2 != 0)) { which = 'r'; } */ InitGridPt(Grid[0],BotLft.x,BotLft.y,left,which); InitGridPt(Grid[1],BotLft.x,TopRgt.y,top,which); InitGridPt(Grid[2],TopRgt.x,TopRgt.y,right,which); InitGridPt(Grid[3],TopRgt.x,BotLft.y,bottom,which); InitGridPt(Grid[4],BotLft.x,BotLft.y,none,which); for (i=0;i<4;i++) { GridOrder[i]=i; CalcCoeff(graph, Grid+i,Grid+i+1,NULL,zoomed,graphType,xCount,yCount); } GridOrder[4] = 4; nPts = 5; start = 0; /**************************************************************************/ /* No need to look for extra points around graph if using linear coords */ /**************************************************************************/ if( graph->WCS.type[0] ) { Point midpt,testpt,testPt; GridPt *currGrid,*newlGrid,*newrGrid,*nextGrid; double diff,dist,bnds; for( i=0; iscrnPt.x + nextGrid->scrnPt.x ); midpt.y = 0.5*( currGrid->scrnPt.y + nextGrid->scrnPt.y ); InitGridPt(*newlGrid,midpt.x,midpt.y,currGrid->side,which); /* PowPixToPos( midpt.x, midpt.y, &graph->WCS, &testPt.x, &testPt.y ); PowPosToPix( testPt.x, testPt.y, &graph->WCS, &testpt.x, &testpt.y ); */ testPt = CalcXY( graph, midpt, currGrid, zoomed, graphType, xCount, yCount ); GraphToCanv(graph, zoomed, graphType, xCount, yCount, BotLft,testPt,BotLft_real, &testpt); diff = fabs(midpt.x-testpt.x) + fabs(midpt.y-testpt.y); dist = fabs(currGrid->scrnPt.x-nextGrid->scrnPt.x) + fabs(currGrid->scrnPt.y-nextGrid->scrnPt.y); if( diff>4.0 && dist>4.0 ) { /* Chai: 07/20/2007: These codes will not be used anymore after WCS lib routines are installed. */ /*************************************************/ /* Not too good, must add a new point to array */ /*************************************************/ CalcCoeff(graph, currGrid,newlGrid,NULL,zoomed,graphType,xCount,yCount); CalcCoeff(graph, newlGrid,nextGrid,NULL,zoomed,graphType,xCount,yCount); if( dist<=9.0 && ( fabs(currGrid->coeff[0])>40.0 || fabs(newlGrid->coeff[0])>40.0 ) ) { /***************************************************/ /* Seems the problem is that we are crossing the */ /* 0/360 position of right ascension. Create an */ /* extra point to eliminate discontinuity. */ /***************************************************/ newrGrid = newlGrid+1; if( fabs(currGrid->coeff[0])>40.0 ) { bnds = (currGrid->imgPt.x < newlGrid->imgPt.x) ? 360.0 : 0.0; newlGrid->imgPt = SolveXY( bnds, 'x', newlGrid); GraphToCanv( graph, zoomed, graphType,xCount,yCount,BotLft, newlGrid->imgPt, BotLft_real, &newlGrid->scrnPt ); *newrGrid = *newlGrid; newlGrid->imgPt.x = 360.0 - bnds; } else { bnds = (newlGrid->imgPt.x > nextGrid->imgPt.x) ? 360.0 : 0.0; newlGrid->imgPt = SolveXY( bnds, 'x', currGrid); GraphToCanv( graph, zoomed, graphType,xCount,yCount,BotLft, newlGrid->imgPt, BotLft_real, &newlGrid->scrnPt ); *newrGrid = *newlGrid; newrGrid->imgPt.x = 360.0 - bnds; } CalcCoeff(graph, currGrid,newlGrid,NULL,zoomed,graphType,xCount,yCount); CalcCoeff(graph, newrGrid,nextGrid,NULL,zoomed,graphType,xCount,yCount); newlGrid->side = none; for (j=nPts-1; j>i; j--) GridOrder[j+2]=GridOrder[j]; GridOrder[i+1] = nPts; GridOrder[i+2] = nPts+1; nPts += 2; start = (i+=2); } else { CalcCoeff(graph, currGrid,newlGrid,nextGrid,zoomed,graphType,xCount,yCount); for (j=nPts-1; j>i; j--) GridOrder[j+1]=GridOrder[j]; GridOrder[i+1]=nPts; nPts++; i--; } if( nPts+3>nGrds ) { nGrds += 25; Grid = (GridPt *)ckrealloc( (char *)Grid, nGrds*sizeof(GridPt) ); GridOrder = (int *)ckrealloc( (char *)GridOrder, nGrds*sizeof(int) ); } } else { CalcCoeff(graph, currGrid,newlGrid,nextGrid,zoomed,graphType,xCount,yCount); } } } /*************************************************************************/ /* Copy grid points in order to the return grid array. Use the */ /* 0/360 discontinuity as the start/end of array if it was encountered */ /*************************************************************************/ *rtnGrid = (GridPt *)ckalloc( nPts*sizeof(GridPt) ); for( i=start,j=0; i maxX ) maxX = Grid[i].imgPt.x; if( Grid[i].imgPt.y < minY ) minY = Grid[i].imgPt.y; else if( Grid[i].imgPt.y > maxY ) maxY = Grid[i].imgPt.y; /* Note that the 0-element will never be a discontinuity */ if( useWCS && ( Grid[i].imgPt.x<0.000001 || Grid[i].imgPt.x>359.999999 ) && Grid[i].side==none ) nBreaks++; } if( nBreaks % 2 ) { /* Crossed 0/360 boundary odd times, so must have a pole present */ if( (maxY+minY)>1.0 ) maxY=90.0; else if( (maxY+minY)<-1.0 ) minY=-90.0; nBreaks = 0; } else if( nBreaks ) { /* Crossed 0/360 boundary even times, so must find -180,180 min/max */ double val; minX = maxX = 0.0; for( i=0; i180.0 ) val -= 360.0; if( val < minX ) minX = val; else if( val > maxX ) maxX = val; } } /**************************************************************************/ /* Get the values of the tick marks and copy them to the returned array */ /**************************************************************************/ nx = GetTics( minX, maxX, numTicks[0], 100, tickScal[0], xlist ); ny = GetTics( minY, maxY, numTicks[1], 100, tickScal[1], ylist ); n = nx+ny; *ticks = (double *)ckalloc(sizeof(double)*n); *axis = (char *)ckalloc(sizeof(char)*n); for(i=0;ia2 ) { value = a1; a1 = a2; a2 = value; } adiff = a2 - a1; a1 -= 1e-6 * adiff; a2 += 1e-6 * adiff; /* Identify the scaling method */ if( !strcmp("ra",tickScal) ) { diff = log10( (adiff/15.0)/nlabel ) / log10(60.0); iexp = (int)floor(diff); amant = diff - iexp; if( iexp<-2 ) { /* This is the sub-second level... resort to base 10/3600 steps */ diff = log10( (adiff*3600.0/15.0)/nlabel ); iexp = (int)floor(diff); amant = diff - iexp; if ( amant < .15 ) num = 1; else if( amant < .50 ) num = 2; else if( amant < .85 ) num = 5; else num = 10; step = num * pow(10.0, (double)iexp) * 15.0 / 3600.0; } else if( iexp<0 ) { if ( amant < .10 ) num = 1; else if( amant < .21 ) num = 2; else if( amant < .30 ) num = 3; else if( amant < .36 ) num = 4; else if( amant < .43 ) num = 5; else if( amant < .46 ) num = 6; else if( amant < .60 ) num = 10; else if( amant < .70 ) num = 15; else if( amant < .79 ) num = 20; else if( amant < .92 ) num = 30; else num = 60; step = num * pow(60.0, (double)iexp) * 15.0; } else { if ( amant < .10 ) num = 1; else if( amant < .20 ) num = 2; else if( amant < .30 ) num = 3; else if( amant < .40 ) num = 4; else if( amant < .46 ) num = 6; else if( amant < .55 ) num = 8; else num = 12; step = num * pow(60.0, (double)iexp) * 15.0; } } else if( !strcmp("dec",tickScal) ) { diff = log10( adiff/nlabel ) / log10(60.0); iexp = (int)floor(diff); amant = diff - iexp; if( iexp<-2 ) { /* This is the sub-second level... resort to base 10/3600 steps */ diff = log10( (adiff*3600.0)/nlabel ); iexp = (int)floor(diff); amant = diff - iexp; if ( amant < .15 ) num = 1; else if( amant < .50 ) num = 2; else if( amant < .85 ) num = 5; else num = 10; step = num * pow(10.0, (double)iexp) / 3600.0; } else { if ( amant < .10 ) num = 1; else if( amant < .21 ) num = 2; else if( amant < .30 ) num = 3; else if( amant < .36 ) num = 4; else if( amant < .43 ) num = 5; else if( amant < .46 ) num = 6; else if( amant < .60 ) num = 10; else if( amant < .70 ) num = 15; else if( amant < .79 ) num = 20; else if( amant < .92 ) num = 30; else num = 60; step = num * pow(60.0, (double)iexp); } } else if( !strcmp("log",tickScal) ) { static int logTicks[][10] = { { 1, 10 }, { 1, 3, 10 }, { 1, 2, 5, 10 }, { 1, 2, 4, 6, 10 }, { 1, 2, 4, 6, 8, 10 }, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } }; double logDiff, base; int i, idx; if( fabs(a1)>300 || fabs(a2)>300 ) { return 0; } base = pow(10.0, floor(a1) ); a1 = pow(10.0,a1); a2 = pow(10.0,a2); logDiff = adiff / nlabel; if( logDiff < 0.15 ) { value = a1; do { diff = log10( value*pow(10.0, logDiff) - value ); iexp = (int)floor(diff); amant = diff - iexp; if ( amant < .10 ) num = 1; else if( amant < .45 ) num = 2; else if( amant < .80 ) num = 5; else { iexp++; num = 1; } base = pow(10.0, (double)iexp); step = num * base; off = (int)floor( value / step ) + 1; do { value = step * off++; if( value>=a1 && value<=a2 ) { list[n++] = log10(value); } if( ((int)(value/base))%10 == 0 ) break; } while( value<=a2 && na2 ) return n; } while(1); } if ( logDiff < 0.19 ) idx = 5; /* 1, 2, 3, 4, 5, ... */ else if( logDiff < 0.24 ) idx = 4; /* 1, 2, 4, 6, 8 */ else if( logDiff < 0.30 ) idx = 3; /* 1, 2, 4, 6 */ else if( logDiff < 0.45 ) idx = 2; /* 1, 2, 5 */ else if( logDiff < 0.75 ) idx = 1; /* 1, 3 */ else idx = 0; /* 1 */ if( logDiff > 1.8 ) step = pow(10.0, floor(logDiff+0.2) ); else step = 10.0; i = 0; do { do { value = logTicks[idx][i] * base; if( value>=a1 && value <=a2 ) { list[n++] = log10(value); } } while( logTicks[idx][i++]<10 ); base *= step; i = 1; } while( value1000.0 ) value = 0.0; list[n++] = value; value += step; } while( value<=a2 && ngraph_name)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "graphType", graph->graph_name); graphType = Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY); ckfree(idxStr); len = strlen(graph->graph_name)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "zoomed", graph->graph_name); zoomed = atoi(Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY)); ckfree(idxStr); xCount = atoi(Tcl_GetVar2(interp,"xCount",graph->graph_name,TCL_GLOBAL_ONLY)); yCount = atoi(Tcl_GetVar2(interp,"yCount",graph->graph_name,TCL_GLOBAL_ONLY)); /* when zoom, the flipping of axis is already done. So right X at zoomed = 0 will now be at left X */ if ( graph->WCS.type[0] == '\0' && strcmp(graphType, "binary") == 0 && xCount % 2 != 0 ) { if ( zoomed == 0 ) { pt.x = (pt.x - Pt0.x) / graph->xmagstep; } else { pt.x = (Pt0.x - pt.x) / graph->xmagstep; } } else { pt.x = (pt.x - Pt0.x) / graph->xmagstep; } if ( graph->WCS.type[0] == '\0' && strcmp(graphType, "binary") == 0 && yCount % 2 != 0 ) { if ( zoomed == 0 ) { pt.y = (Pt0.y - pt.y) / graph->ymagstep; } else { pt.y = (pt.y - Pt0.y) / graph->ymagstep; } } else { pt.y = (Pt0.y - pt.y) / graph->ymagstep; } errFlag = PowPixToPos( pt.x, pt.y, &graph->WCS, &Pt->x, &Pt->y ); return(errFlag); } int GraphToCanv( PowGraph *graph, int zoomed, const char *graphType, int xCount, int yCount, Point Pt0, Point Pt, Point Pt0_real, Point *pt ) { int errFlag; errFlag = PowPosToPix( Pt.x, Pt.y, &graph->WCS, &pt->x, &pt->y ); /* WCS Flag ? */ if ( graph->WCS.type[0] == '\0' && strcmp(graphType, "binary") == 0 && xCount % 2 != 0 ) { if ( zoomed == 0 ) { pt->x = Pt0.x + pt->x * graph->xmagstep; } else { pt->x = Pt0.x + (-1.0 * pt->x) * graph->xmagstep; } } else { pt->x = Pt0.x + pt->x * graph->xmagstep; } if ( graph->WCS.type[0] == '\0' && strcmp(graphType, "binary") == 0 && yCount % 2 != 0 ) { if ( zoomed == 0 ) { pt->y = Pt0.y - pt->y * graph->ymagstep; } else { pt->y = Pt0.y - (-1.0 * pt->y) * graph->ymagstep; } } else { pt->y = Pt0.y - pt->y * graph->ymagstep; } return(errFlag); } int PtBtwnPts(Point pt, Point pt1, Point pt2, char fixed) { double x, x1, x2, y, y1, y2; if( fixed!='x' && fixed!='l' && fixed!='r' ) { x = pt.x; x1 = pt1.x; x2 = pt2.x; if( x1=x2 ) return 0; } else { if( x=x1 ) return 0; } } if( fixed!='y' && fixed!='t' && fixed!='b' ) { y = pt.y; y1 = pt1.y; y2 = pt2.y; if( y1=y2 ) return 0; } else { if( y=y1 ) return 0; } } return 1; } Point CalcXY ( PowGraph *graph, Point pt, GridPt *G, int zoomed, const char *graphType, int xCount, int yCount ) { /* Chai: 07/19/2007: This function is no longer used. */ Point XY; double ds; int errFlag = 0; /*********************************************************************/ /* Calculate the graph cordinates of pt using the info in GridPt G */ /*********************************************************************/ errFlag = PowPixToPos( pt.x, pt.y, &graph->WCS, &XY.x, &XY.y ); if( G->side==left || G->side==right ) { if ( strcmp(graphType, "binary") == 0 && yCount % 2 != 0 ) { ds = pt.y - G->scrnPt.y; } else { ds = G->scrnPt.y - pt.y; } } else { if ( graph->WCS.type[0] == '\0' && strcmp(graphType, "binary") == 0 && xCount % 2 != 0 ) { ds = G->scrnPt.x - pt.x; } else { ds = pt.x - G->scrnPt.x; } } XY.x = G->imgPt.x + G->coeff[0]*ds + G->coeff[2]*ds*ds; XY.y = G->imgPt.y + G->coeff[1]*ds + G->coeff[3]*ds*ds; return XY; } Point SolveXY ( double Val, char axis, GridPt *G) { double a,b,c,ds,ds1,ds2,quad; Point XY; /*************************************************************/ /* Calculate the full graph coordinates of where the given */ /* tick value, Val, intersects the graph's bounding box. */ /*************************************************************/ if( axis=='x' ) { a = G->coeff[2]; b = G->coeff[0]; c = G->imgPt.x-Val; } else { a = G->coeff[3]; b = G->coeff[1]; c = G->imgPt.y-Val; } if( a==0.0 ) ds = -c/b; else { quad = sqrt(b*b-4.0*a*c); ds1 = (-b-quad)/(2.0*a); ds2 = (-b+quad)/(2.0*a); if( ds1>ds2 ) { ds = ds1; ds1 = ds2; ds2 = ds; } if( G->side==top || G->side==right ) { if( ds1<0.0 ) ds = ds2; else ds = ds1; } else { if( ds2>0.0 ) ds = ds1; else ds = ds2; } } if( axis=='x' ) { XY.x = Val; XY.y = G->imgPt.y + G->coeff[1]*ds + G->coeff[3]*ds*ds; } else { XY.x = G->imgPt.x + G->coeff[0]*ds + G->coeff[2]*ds*ds; XY.y = Val; } return XY; } void CalcCoeff( PowGraph *graph, GridPt *G1, GridPt *G2, GridPt *G3, int zoomed, const char *graphType, int xCount, int yCount ) { double dX,dY,ds; double dX2,dY2; /********************************************************************/ /* Calculate the linear or 2nd-order polynomial coefficients which */ /* fit the dependency of graph coordinates on canvas coordinates */ /********************************************************************/ if( G1->side==left || G1->side==right ) { ds = G2->scrnPt.y - G1->scrnPt.y; } else { ds = G2->scrnPt.x - G1->scrnPt.x; } dX = G2->imgPt.x - G1->imgPt.x; dY = G2->imgPt.y - G1->imgPt.y; if( G3==NULL ) { G1->coeff[0] = dX/ds; G1->coeff[1] = dY/ds; G1->coeff[2] = G1->coeff[3] = 0.0; } else { dX2 = G3->imgPt.x - G1->imgPt.x; dY2 = G3->imgPt.y - G1->imgPt.y; G1->coeff[0] = (4.0*dX-dX2)/(ds+ds); G1->coeff[1] = (4.0*dY-dY2)/(ds+ds); G1->coeff[2] = (dX2-2.0*dX)/(2.0*ds*ds); G1->coeff[3] = (dY2-2.0*dY)/(2.0*ds*ds); } } /***********************************************************************/ #define MAXCONTOURS 50 typedef struct { int xdim, ydim; double **rows; char *usedGrid; long nPts, nAlloc; double *X, *Y; } Contours; int BuildContours( int nCntrs, double *levels, int xdim, int ydim, double *image, int *nPts, double **X, double **Y ); int TraceContour ( Contours *Info, double cntr, int xCell, int yCell, SideVal side); int PowCreateContour(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { char *contour, *image; double *imgData, levels[MAXCONTOURS], *lvlPtr; double xfrac, yfrac; double *X, *Y; int nPts; int nContours, xdim, ydim, res, status=TCL_OK; int i, j, xbnds, ybnds; long nelem, elem; PowImage *img; const char **list; if( argc != 5 ) { Tcl_SetResult(interp, "usage: powCreateContour contour image levels res", TCL_VOLATILE); return TCL_ERROR; } /********************************************************/ /* Convert parameter arguments to useable C variables */ /********************************************************/ contour = argv[1]; image = argv[2]; Tcl_GetInt (interp,argv[4],&res); if( res<1 ) res = 1; if( Tcl_SplitList(interp, argv[3], &nContours, &list)!=TCL_OK) { Tcl_SetResult(interp, "Contour levels not a valid list", TCL_VOLATILE); return TCL_ERROR; } if( nContours > MAXCONTOURS ) { Tcl_SetResult(interp, "Too many levels selected", TCL_VOLATILE); ckfree( (char*)list ); return TCL_ERROR; } lvlPtr = levels; for( i=0; iwidth + res - 1) / res; ydim = (img->height + res - 1) / res; nelem = xdim * ydim; imgData = (double*)ckalloc( nelem*sizeof(double) ); if( !imgData ) { Tcl_SetResult(interp, "Could not allocate memory for image", TCL_VOLATILE); return TCL_ERROR; } /* Rescale image to desired contour resolution */ for( elem=0; elemwidth - img->width%res; ybnds = img->height - img->height%res; yfrac = 1.0/res; for( j=0; jheight; j++ ) { if( j == ybnds ) yfrac = 1.0/(img->height - ybnds); xfrac = 1.0/res; for( i=0; iwidth; i++ ) { if( i == xbnds ) xfrac = 1.0/(img->width - xbnds); imgData[(j/res)*xdim+(i/res)] += xfrac * yfrac * PowExtractDatum( img->dataptr, j*(img->width)+i ); } } status = BuildContours( nContours, levels, xdim, ydim, imgData, &nPts, &X, &Y); if( !status ) { /* Must use pointers to pass data to PowCreateXXX... ICK!!! */ int datatype = DOUBLE_DATA; int length = nPts; int copy = 1; int offset = 0; int sLen; char str1[256], str2[256]; for( elem = 0; elemWCS.type[0]=='\0' ) { X[elem] = (X[elem] - 0.5) * img->xinc + img->xorigin; Y[elem] = (Y[elem] - 0.5) * img->yinc + img->yorigin; } } sLen = strlen(contour); if( sLen>245 ) sLen=245; strncpy(str1,contour,sLen); str1[sLen]='\0'; strncpy(str2,contour,sLen); str2[sLen]='\0'; strcpy(str1+sLen,"_Xdata"); strcpy(str2+sLen,"_Xvec"); PowCreateData( str1, X, &datatype, &length, ©, &status ); PowCreateVector( str2, str1, &offset, &length, "NULL", &status ); ckfree( (char *)X ); strcpy(str1+sLen,"_Ydata"); strcpy(str2+sLen,"_Yvec"); PowCreateData( str1, Y, &datatype, &length, ©, &status ); PowCreateVector( str2, str1, &offset, &length, "NULL", &status ); ckfree( (char *)Y ); strcpy(str1+sLen,"_Xvec"); PowCreateCurve( contour, str1, NULL, str2, NULL, NULL, NULL, &status ); } ckfree( (char *)imgData ); if( status ) Tcl_SetResult(interp, "Unable to build contours", TCL_VOLATILE); return status; } int BuildContours( int nCntrs, double *levels, int xdim, int ydim, double *image, int *nPts, double **X, double **Y ) { int i, j, c, status = TCL_OK; double cntour; long nelem, elem; Contours Info; Info.xdim = xdim; Info.ydim = ydim; Info.nPts = 6; Info.nAlloc = 2000; Info.X = (double*)ckalloc( Info.nAlloc * sizeof(double) ); Info.Y = (double*)ckalloc( Info.nAlloc * sizeof(double) ); if( !(Info.X && Info.Y) ) return TCL_ERROR; Info.X[0] = Info.Y[0] = 0.0; Info.X[1] = 0.0; Info.Y[1] = ydim-1; Info.X[2] = xdim-1; Info.Y[2] = ydim-1; Info.X[3] = xdim-1; Info.Y[3] = 0.0; Info.X[4] = 0.0; Info.Y[4] = 0.0; Info.X[5] = Info.Y[5] = DBL_MAX; nelem = xdim*ydim; Info.usedGrid = (char *)ckalloc( nelem*sizeof(char) ); if( ! Info.usedGrid ) { ckfree( (char *)Info.X ); ckfree( (char *)Info.Y ); return TCL_ERROR; } Info.rows = (double **)ckalloc( ydim * sizeof(double*) ); for( j=0; j=0 && !status; i-- ) if( Info.rows[j][i+1]=0 && !status; j-- ) if( Info.rows[j+1][i]nPts; done = (i<0 || i>=Info->xdim-1 || j<0 && j>=Info->ydim-1); while( !done ) { flag = 0; a = Info->rows[j][i]; b = Info->rows[j][i+1]; c = Info->rows[j+1][i+1]; d = Info->rows[j+1][i]; if( init ) { init = 0; switch( side ) { case top: X = (cntr-a) / (b-a) + i; Y = j; break; case right: X = i+1; Y = (cntr-b) / (c-b) + j; break; case bottom: X = (cntr-c) / (d-c) + i; Y = j+1; break; case left: X = i; Y = (cntr-a) / (d-a) + j; break; } } else { if( side==top ) Info->usedGrid[j*Info->xdim + i] = 1; do { if( ++side == none ) side = top; switch( side ) { case top: if( a>=cntr && cntr>b ) { flag = 1; X = (cntr-a) / (b-a) + i; Y = j; j--; } break; case right: if( b>=cntr && cntr>c ) { flag = 1; X = i+1; Y = (cntr-b) / (c-b) + j; i++; } break; case bottom: if( c>=cntr && cntr>d ) { flag = 1; X = (cntr-d) / (c-d) + i; Y = j+1; j++; } break; case left: if( d>=cntr && cntr>a ) { flag = 1; X = i; Y = (cntr-a) / (d-a) + j; i--; } break; } } while (!flag); if( ++side == none ) side = top; if( ++side == none ) side = top; if( i==xCell && j==yCell && side==origSide ) done = 1; if( i<0 || i>=Info->xdim-1 || j<0 || j>=Info->ydim-1 ) done = 1; } /* Make sure there are at least 2 more Pts available to allocate */ if( npts+2 > Info->nAlloc ) { ptr = (double*)ckrealloc( (char *)Info->X, (Info->nAlloc+1000) * sizeof(double) ); if( ptr ) { Info->X = ptr; ptr = (double*)ckrealloc( (char *)Info->Y, (Info->nAlloc+1000) * sizeof(double) ); if( ptr ) Info->Y = ptr; } if( !ptr ) return TCL_ERROR; Info->nAlloc += 1000; } Info->X[ npts ] = X; Info->Y[ npts ] = Y; npts++; if( done ) { Info->X[ npts ] = DBL_MAX; Info->Y[ npts ] = DBL_MAX; npts++; } } Info->nPts = npts; return TCL_OK; } fv5.4/tcltk/pow/PowInit.c0000644000220700001010000004717212153447565014716 0ustar birbylheadev#ifdef __WIN32__ #include #endif #include "pow.h" #include "stretcharrow.xbm" /* *---------------------------------------------------------------------- * * DllEntryPoint -- * * This wrapper function is used by Windows to invoke the * initialization code for the DLL. If we are compiling * with Visual C++, this routine will be renamed to DllMain. * routine. * * Results: * Returns TRUE; * * Side effects: * None. * *---------------------------------------------------------------------- */ #ifdef __WIN32__ int WINAPI dllEntry(HANDLE hDll, DWORD reason, LPVOID reserved) { return TRUE; } #endif int pixelSizes[6] = {1,2,4,4,8,8}; char *WCSpih_Message[] = { "Success.", "Null wcsprm pointer passed.", "Memory allocation failed.", "Linear transformation matrix is singular.", "Inconsistent or unrecognized coordinate axis types.", "Invalid parameter value.", "Invalid coordinate transformation parameters.", "Ill-conditioned coordinate transformation parameters.", "One or more of the world coordinates were invalid." }; char *WCStrans_Message[] = { "Success", "Null wcsprm pointer passed", "Memory allocation failed", "Linear transformation matrix is singular", "Inconsistent or unrecognized coordinate axis types", "Invalid parameter value", "Invalid coordinate transformation parameters", "Ill-conditioned coordinate transformation parameters", "One or more of the pixel coordinates were invalid", "One or more of the world coordinates were invalid", "Invalid world coordinate", "No solution found in the specified interval", "Invalid subimage specification", "Non-separable subimage coordinate system"}; /* globals linked with tcl variables */ int tty = 0; int Pow_Done = 0; /* current method for event handling, will change */ # extern int Pow_Allocated; Tcl_HashTable PowDataTable; Tcl_HashTable PowImageTable; Tcl_HashTable PowVectorTable; Tcl_HashTable PowCurveTable; Tcl_HashTable PowGraphTable; Tcl_Interp *interp = NULL; /* Interpreter for application. */ Tk_Window mainWindow; /* The main window for the application. If * NULL then the application no longer * exists. */ /*This stuff currently lives here for plugin purposes */ #ifdef PLUGIN extern int singleBarFastGen(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]); extern int singleRollMe(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]); extern int c_given_RADecMJD_return_Roll(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]); #endif /*PLUGIN */ int Pow_Init(Tcl_Interp *interp_instance) { Tcl_DString pow_env; const char *charptr; char temp[1000]; Tcl_DStringInit(&pow_env); interp = interp_instance; if (Visu_Init(interp) == TCL_ERROR) { return TCL_ERROR; } #if defined(MAC_TCL) && defined(PLUGIN) strcpy(temp,"source -rsrc html_library\n"); strcat(temp,"source -rsrc notebook\n"); strcat(temp,"source -rsrc pow\n"); strcat(temp,"source -rsrc powEdit\n"); strcat(temp,"source -rsrc powRgn\n"); strcat(temp,"source -rsrc powMovie\n"); strcat(temp,"source -rsrc powScript\n"); strcat(temp,"powInitGlobals\n"); if( Tcl_GlobalEval(interp,temp) == TCL_ERROR ) { return TCL_ERROR; } #else charptr = Tcl_GetVar2(interp,"env", "POW_LIBRARY", TCL_GLOBAL_ONLY); if( charptr == NULL ) { puts("Could not find defaults."); puts(" Set your POW_LIBRARY environment variable."); return TCL_ERROR; } else { Tcl_DStringAppend(&pow_env,charptr, -1); } /* Brackets needed around %s to prevent Windows-style paths */ /* ... eg, c:\fv... from getting converted to control chars */ /* when doing the GlobalEval. */ sprintf(temp,"lappend auto_path {%s}; powInitGlobals",charptr); if( Tcl_GlobalEval(interp,temp) == TCL_ERROR ) return TCL_ERROR; /* Lets try using auto_path instead of all these sources.... Tcl_SetVar(interp, "powsrcdir",Tcl_DStringValue(&pow_env), TCL_GLOBAL_ONLY); Tcl_DStringInit(&pow_script); Tcl_DStringAppend(&pow_script,Tcl_DStringValue(&pow_env),-1); Tcl_DStringAppend(&pow_script,"/html_library.tcl",-1); if( Tcl_EvalFile(interp,Tcl_DStringValue(&pow_script)) == TCL_ERROR) { fprintf(stderr, "%s\n", interp->result); return TCL_ERROR; } Tcl_DStringFree(&pow_script); Tcl_DStringInit(&pow_script); Tcl_DStringAppend(&pow_script,Tcl_DStringValue(&pow_env),-1); Tcl_DStringAppend(&pow_script,"/notebook.tcl",-1); if( Tcl_EvalFile(interp,Tcl_DStringValue(&pow_script)) == TCL_ERROR) { fprintf(stderr, "%s\n", interp->result); return TCL_ERROR; } Tcl_DStringFree(&pow_script); Tcl_DStringInit(&pow_script); Tcl_DStringAppend(&pow_script,Tcl_DStringValue(&pow_env),-1); Tcl_DStringAppend(&pow_script,"/pow.tcl",-1); if( Tcl_EvalFile(interp,Tcl_DStringValue(&pow_script)) == TCL_ERROR) { fprintf(stderr, "%s\n", interp->result); return TCL_ERROR; } Tcl_DStringFree(&pow_script); Tcl_DStringInit(&pow_script); Tcl_DStringAppend(&pow_script,Tcl_DStringValue(&pow_env),-1); Tcl_DStringAppend(&pow_script,"/powEdit.tcl",-1); if( Tcl_EvalFile(interp,Tcl_DStringValue(&pow_script)) == TCL_ERROR) { fprintf(stderr, "%s\n", interp->result); return TCL_ERROR; } Tcl_DStringFree(&pow_script); Tcl_DStringInit(&pow_script); Tcl_DStringAppend(&pow_script,Tcl_DStringValue(&pow_env),-1); Tcl_DStringAppend(&pow_script,"/powRgn.tcl",-1); if( Tcl_EvalFile(interp,Tcl_DStringValue(&pow_script)) == TCL_ERROR) { fprintf(stderr, "%s\n", interp->result); return TCL_ERROR; } Tcl_DStringFree(&pow_script); */ #endif /* MAC_TCL and PLUGIN*/ Tcl_InitHashTable(&PowDataTable, TCL_STRING_KEYS); Tcl_InitHashTable(&PowImageTable, TCL_STRING_KEYS); Tcl_InitHashTable(&PowVectorTable, TCL_STRING_KEYS); Tcl_InitHashTable(&PowCurveTable, TCL_STRING_KEYS); Tcl_InitHashTable(&PowGraphTable, TCL_STRING_KEYS); Tk_DefineBitmap(interp, Tk_GetUid("stretcharrow"), stretcharrow_bits, stretcharrow_width, stretcharrow_height); #if !(defined(__WIN32__) || defined(macintosh)) /* Keeps track of whether Pow has allocated its PseudoColor cells or not */ strcpy(temp,"Pow_Allocated"); Tcl_LinkVar(interp,temp,(char *) &Pow_Allocated,TCL_LINK_INT); #endif Pow_CreateCommands(interp); Tk_CreateItemType(&tkPowCurveType); return TCL_OK; } /* initialization only for Unix standalone */ int Pow_InitExec(Tcl_Interp *interp_instance) { Tcl_DString pow_env; #if !(defined(__WIN32__) || defined(macintosh)) char temp[1000]; #endif Tcl_DStringInit(&pow_env); interp = interp_instance; if (Visu_Init(interp) == TCL_ERROR) { return TCL_ERROR; } #if defined(MAC_TCL) && defined(PLUGIN) strcpy(temp,"source -rsrc html_library\n"); strcat(temp,"source -rsrc notebook\n"); strcat(temp,"source -rsrc pow\n"); strcat(temp,"source -rsrc powEdit\n"); strcat(temp,"source -rsrc powRgn\n"); strcat(temp,"source -rsrc powMovie\n"); strcat(temp,"source -rsrc powScript\n"); strcat(temp,"powInitGlobals\n"); if( Tcl_GlobalEval(interp,temp) == TCL_ERROR ) { return TCL_ERROR; } #else #endif /* MAC_TCL and PLUGIN*/ Tcl_InitHashTable(&PowDataTable, TCL_STRING_KEYS); Tcl_InitHashTable(&PowImageTable, TCL_STRING_KEYS); Tcl_InitHashTable(&PowVectorTable, TCL_STRING_KEYS); Tcl_InitHashTable(&PowCurveTable, TCL_STRING_KEYS); Tcl_InitHashTable(&PowGraphTable, TCL_STRING_KEYS); Tk_DefineBitmap(interp, Tk_GetUid("stretcharrow"), stretcharrow_bits, stretcharrow_width, stretcharrow_height); #if !(defined(__WIN32__) || defined(macintosh)) /* Keeps track of whether Pow has allocated its PseudoColor cells or not */ strcpy(temp,"Pow_Allocated"); Tcl_LinkVar(interp,temp,(char *) &Pow_Allocated,TCL_LINK_INT); #endif Pow_CreateCommands(interp); Tk_CreateItemType(&tkPowCurveType); return TCL_OK; } /* Create the Pow Commands */ int Pow_CreateCommands(Tcl_Interp *interp) { Tcl_CreateObjCommand(interp,"powWCSInitImage",PowWCSInitImage, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp,"powWCSInitCurve",PowWCSInitCurve, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powWCSexists", PowWCSexists, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powWCSisSwapped", PowWCSisSwapped, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powGetImageOrigin",PowGetImageOrigin, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powGetImageOtherend",PowGetImageOtherend, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powGetImageUnits",PowGetImageUnits, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powDestroyData",PowDestroyData_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powDestroyImage",PowDestroyImage_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powDestroyVector",PowDestroyVector_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powDestroyCurve",PowDestroyCurve_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powDestroyGraph",PowDestroyGraph_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powCreateImage",PowCreateImage_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powCreateGraph",PowCreateGraph_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powFindData",PowFindData_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powFindCurvesMinMax",PowFindCurvesMinMax_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powFetchDataLength",PowFetchDataLength, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powFetchCurveInfoHash",PowFetchCurveInfoHash, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powFetchVectorInfoHash",PowFetchVectorInfoHash, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powFetchImageInfoHash",PowFetchImageInfoHash, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powCreateVector",PowCreateVector_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powCreateVectorEN",PowCreateVectorEN_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powCreateCurve",PowCreateCurve_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powCreateHisto",PowCreateHisto_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powCreateDataFlip",PowCreateDataFlip_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powCreateCurveFlip",PowCreateCurveFlip_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powCreateData",PowCreateData_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powCloneData",PowCloneData, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powRegisterData",PowRegisterData_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powCreateDataFromList",PowCreateDataFromList, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp,"powCreateDataFromBuffer", PowCreateDataFromBuffer, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp,"powCreateDataFromChannel", PowCreateDataFromChannel, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp,"powCreateDataFromPtr", PowCreateDataFromPtr, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp,"powCreateStrFromPtr", PowCreateStrFromPtr, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powSetGraphMagstep",PowSetGraphMagstep, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powProcessCurve",PowProcessCurve, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powListGraphs",PowListGraphs, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powListCurves",PowListCurves, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powListImages",PowListImages, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powListVectors",PowListVectors, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powListData",PowListData, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powCleanUp",PowCleanUp, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powSetupColormap",PowSetupColormap, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powSetupPhotoImages",PowSetupPhotoImages, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powTestColormap",PowTestColormap, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powPutZoomedBlock",PowPutZoomedBlock, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powPhotoColorTable",PowPhotoColorTable, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powReditherPhotoBlock",PowReditherPhotoBlock, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp,"powTestMacMemory",PowTestMacMemory, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp,"powPhotoCmapStretch",PowPhotoCmapStretch, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powImageScale", PowImageScale, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powGetHisto", PowGetHisto, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp,"powGetImageZ",PowGetImageZ, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp,"powWorldPos",PowWorldPos, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp,"powXYPx",PowXYPx, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powGraphToCanvas", PowGraphToCanvas, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powCanvasToGraph", PowCanvasToGraph, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powGraphToPixel", PowGraphToPixel, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powPixelToGraph", PowPixelToGraph, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powResetWcsStructure", PowResetWcsStructure, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powGraphVToPixelV", PowGraphVToPixelV, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powPixelVToGraphV", PowPixelVToGraphV, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powGetImageClipbox", PowGetImageClipbox, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powExprGetData", PowExprDataInfo, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powDataPtr", PowDataPtr_Tcl, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "powTestImage", PowTestImage, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powDrawGridLines",PowDrawGridLines, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powCreateContour",PowCreateContour, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powGetTics",PowGetTics, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp,"powGetRegionStatistics", PowGetRegionStatistics, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL); #ifdef PLUGIN Tcl_CreateCommand(interp_instance,"singleBarFastGen", (Tcl_CmdProc*)singleBarFastGen, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL); Tcl_CreateCommand(interp_instance,"singleRollMe", (Tcl_CmdProc*)singleRollMe, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL); Tcl_CreateCommand(interp_instance,"c_given_RADecMJD_return_Roll", (Tcl_CmdProc*)c_given_RADecMJD_return_Roll, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL); #endif /*PLUGIN */ return TCL_OK; } void PowInit(char *powSetupColormapArgs, char *powInitArgs, int *status) { /*call this one from a standalone C or FORTRAN main (as opposed to a tkAppInit file) */ if (*status != 0) return; if (interp == NULL || Tcl_InterpDeleted(interp)) { /* the test condition above should ensure that we only create a new interpreter if we don't have one already */ interp = Tcl_CreateInterp(); if (Tcl_Init(interp) == TCL_ERROR) { *status = TCL_ERROR; fprintf(stderr, "%s\n", Tcl_GetStringResult(interp)); return; } if (Tk_Init(interp) == TCL_ERROR) { *status = TCL_ERROR; fprintf(stderr, "%s\n", Tcl_GetStringResult(interp)); return; } tty = isatty(0); Tcl_SetVar(interp, "tcl_interactive", tty ? "1" : "0", TCL_GLOBAL_ONLY); Tcl_LinkVar(interp,"Pow_Done",(char *) &Pow_Done,TCL_LINK_INT); /* currently used for event handling */ *status = Pow_Init(interp); if (*status != 0) return; } if (Tcl_RegExpMatch(interp,powSetupColormapArgs,"[^ \t\n\r\f]") == 1) { /*if user supplied args for powSetupColormap are not pure whitespace...*/ if(Tcl_VarEval(interp, "powSetupColormap ", powSetupColormapArgs, (char *) NULL) == TCL_ERROR) { *status = TCL_ERROR; fprintf(stderr, "Error initializing POW.\n%s\n", Tcl_GetStringResult(interp)); } } if(Tcl_VarEval(interp, "powInit ", powInitArgs, (char *) NULL) == TCL_ERROR) { *status = TCL_ERROR; fprintf(stderr, "Error initializing POW.\n%s\n", Tcl_GetStringResult(interp)); } } fv5.4/tcltk/pow/PowUtils.c0000644000220700001010000011405212164346033015071 0ustar birbylheadev#include #include #include "pow.h" #include "powRegion.h" #include "wcslib/wcstrig.h" /* on some system , e.g. linux, SUNs DBL_MAX is in float.h */ #ifndef DBL_MAX #include #endif #ifndef DBL_MIN #include #endif #define NCOORD 1 static int Pt_in_Poly( double x, double y, int nPts, double *Pts ); int PowFindCurvesMinMax(const char *curves, char *axis, double *min, double *max, int filter) /* Sets min and max to the minimum and maximum values found in the "axis" vector of each member of the list of curves. Initial values for min and max are whatever they are when the routine is called. (i.e. if *min == 0 upon entry and there are no negative values in the curves, *min will == 0 upon return). */ { PowCurve *current_curve; PowVector *current_vector; PowData *current_data; int curve_index,curveArgc; const char **curveArgv; double datum; int i; if(curves == NULL || strstr(curves,"NULL") != NULL ) return TCL_OK; if(Tcl_SplitList(interp,curves,&curveArgc,&curveArgv) != TCL_OK) { return TCL_ERROR; } for (curve_index = 0; curve_index < curveArgc;curve_index++) { current_curve = PowFindCurve(curveArgv[curve_index]); switch (*axis) { case 'X': current_vector = current_curve->x_vector; break; case 'Y': current_vector = current_curve->y_vector; break; case 'Z': current_vector = current_curve->z_vector; break; default: Tcl_SetResult( interp, "Axis must be X, Y, or Z.", TCL_VOLATILE ); ckfree( (char *)curveArgv ); return TCL_ERROR; } if(current_vector != NULL) { current_data = current_vector->dataptr; for (i = current_vector->offset ; i < current_vector->offset + current_curve->length ; i++) { datum = PowExtractDatum(current_data,i); if( filter && datum <= 0.0 ) /* Positive data only (for logs) */ datum = DBL_MAX; if (datum != DBL_MAX) { *min = (datum < *min) ? datum : *min; *max = (datum > *max) ? datum : *max; } } } else { *min = ( 1.0 < *min) ? 1.0 : *min; *max = (current_curve->length > *max) ? current_curve->length : *max; } } ckfree((char *) curveArgv); return TCL_OK; } int PowFindCurvesBBox(char *graph, char *curves, double *xleft, double *xright, double *ybot, double *ytop, WCSdata *BaseWCS) { PowCurve *current_curve; PowVector *Xvec, *Yvec; int curve_index,curveArgc; const char **curveArgv; double xdatum, ydatum, xmin, xmax, ymin, ymax, tmp; double lxmin, lxmax, lymin, lymax; int i,j, logX, logY; const char *optVal; if(curves == NULL || strstr(curves,"NULL") != NULL ) return TCL_OK; if(Tcl_SplitList(interp,curves,&curveArgc,&curveArgv) != TCL_OK) { return TCL_ERROR; } /* Search through curve list for bounding box information */ /* Skip any curves which raise errors, but don't abort! */ for( curve_index = 0; curve_index < curveArgc; curve_index++ ) { current_curve = PowFindCurve(curveArgv[curve_index]); Xvec = current_curve->x_vector; Yvec = current_curve->y_vector; optVal = PowGetObjectOption( graph, curveArgv[curve_index], "logX", "curve" ); if( !optVal || Tcl_GetBoolean( interp, optVal, &logX )==TCL_ERROR ) { logX = 0; } optVal = PowGetObjectOption( graph, curveArgv[curve_index], "logY", "curve" ); if( !optVal || Tcl_GetBoolean( interp, optVal, &logY )==TCL_ERROR ) { logY = 0; } xmin = ymin = DBL_MAX; xmax = ymax = - DBL_MAX; if( Xvec==NULL || Yvec==NULL || (current_curve->WCS.type[0]=='\0' && current_curve->WCS.cdFrwd[0][1]==0.0 && current_curve->WCS.cdFrwd[1][0]==0.0 ) ) { lxmin = lymin = DBL_MAX; lxmax = lymax = - DBL_MAX; PowFindCurvesMinMax( curveArgv[curve_index], "X", &lxmin, &lxmax, logX ); PowFindCurvesMinMax( curveArgv[curve_index], "Y", &lymin, &lymax, logY ); if( logX ) { if( lxmin<=0.0 || lxmax<=0.0 ) { return TCL_ERROR; } else { lxmin = log10(lxmin); lxmax = log10(lxmax); } } if( logY ) { if( lymin<=0.0 || lymax<=0.0 ) { return TCL_ERROR; } else { lymin = log10(lymin); lymax = log10(lymax); } } xmin = (lxmin < xmin) ? lxmin : xmin; xmax = (lxmax > xmax) ? lxmax : xmax; ymin = (lymin < ymin) ? lymin : ymin; ymax = (lymax > ymax) ? lymax : ymax; if( PowPixToPos( xmin, ymin, ¤t_curve->WCS, &xmin, &ymin ) ) continue; if( PowPixToPos( xmax, ymax, ¤t_curve->WCS, &xmax, &ymax ) ) continue; if( PowPosToPix( xmin, ymin, BaseWCS, &xmin, &ymin ) ) continue; if( PowPosToPix( xmax, ymax, BaseWCS, &xmax, &ymax ) ) continue; if( xmin>xmax ) { tmp=xmax; xmax=xmin; xmin=tmp; } if( ymin>ymax ) { tmp=ymax; ymax=ymin; ymin=tmp; } } else { for (i = Xvec->offset, j = Yvec->offset ; i < Xvec->offset + current_curve->length ; i++, j++) { xdatum = PowExtractDatum(Xvec->dataptr,i); ydatum = PowExtractDatum(Yvec->dataptr,j); if( xdatum != DBL_MAX && ydatum != DBL_MAX ) { if( PowPixToPos( xdatum, ydatum, ¤t_curve->WCS, &xdatum, &ydatum ) ) continue; if( PowPosToPix( xdatum, ydatum, BaseWCS, &xdatum, &ydatum ) ) continue; xmin = (xdatum < xmin) ? xdatum : xmin; xmax = (xdatum > xmax) ? xdatum : xmax; ymin = (ydatum < ymin) ? ydatum : ymin; ymax = (ydatum > ymax) ? ydatum : ymax; } } } if( xmin < *xleft ) *xleft = xmin; if( ymin < *ybot ) *ybot = ymin; if( xmax > *xright ) *xright = xmax; if( ymax > *ytop ) *ytop = ymax; } ckfree((char *) curveArgv); return TCL_OK; } int PowFindImagesBBox(char *images, double *xleft, double *xright, double *ybot, double *ytop, WCSdata *BaseWCS) { PowImage *current_image; int image_index,imageArgc; const char **imageArgv; double xorigin,xotherend,yorigin,yotherend,xcorner,ycorner; if(images == NULL || strstr(images,"NULL") != NULL) return TCL_OK; if(Tcl_SplitList(interp,images,&imageArgc,&imageArgv) != TCL_OK) { return TCL_ERROR; } /* Search through image list for bounding box information */ /* Skip any images which raise errors, but don't abort! */ for (image_index = 0; image_index < imageArgc; image_index++) { current_image = PowFindImage(imageArgv[image_index]); /* Convert origin and otherend info into pixel coordinates */ if ( PowPosToPix( current_image->xorigin, current_image->yorigin, BaseWCS, &xorigin, &yorigin ) ) continue; if ( PowPosToPix( current_image->xotherend, current_image->yotherend, BaseWCS, &xotherend, &yotherend ) ) continue; /**************************************/ /* Test the images for consistency: */ /**************************************/ if ( BaseWCS->type[0] && !current_image->WCS.type[0] ) continue; /* We are in pixel coordinates, so they should */ /* ALWAYS go from left->right */ if ( xorigin > xotherend || yorigin > yotherend ) continue; /***************************************************/ /* Images must project to an unrotated rectangle */ /***************************************************/ if( PowPixToPos( -0.5, current_image->height-0.5, ¤t_image->WCS, &xcorner, &ycorner ) ) continue; if( PowPosToPix( xcorner, ycorner, BaseWCS, &xcorner, &ycorner ) ) continue; if( fabs( xcorner-xorigin ) > 1.0 || fabs( ycorner-yotherend ) > 1.0 ) { continue; } if( PowPixToPos( current_image->width-0.5, -0.5, ¤t_image->WCS, &xcorner, &ycorner ) ) continue; if( PowPosToPix( xcorner, ycorner, BaseWCS, &xcorner, &ycorner ) ) continue; if( fabs( xcorner-xotherend ) > 1.0 || fabs( ycorner-yorigin ) > 1.0 ) { continue; } /**************************************/ /* End of consistency tests */ /**************************************/ if ( xorigin < *xleft ) *xleft = xorigin; if ( yorigin < *ybot ) *ybot = yorigin; if ( xotherend > *xright ) *xright = xotherend; if ( yotherend > *ytop ) *ytop = yotherend; } ckfree( (char *)imageArgv); return TCL_OK; } int PowFindGraphBBox( PowGraph *graph, char *images, char *curves, double *xmin, double *xmax, double *ymin, double *ymax ) { /* xmin, etc, are initially in graph's "pixel" coordinates */ *xmin = DBL_MAX; *xmax = - DBL_MAX; *ymin = DBL_MAX; *ymax = - DBL_MAX; /* Test any curves that are present */ if( curves != NULL && strstr(curves,"NULL") == NULL ) { if( PowFindCurvesBBox( graph->graph_name, curves, xmin, xmax, ymin, ymax, &(graph->WCS) ) == TCL_ERROR ) { return TCL_ERROR; } } /* Test any images that are present */ if( images != NULL && strstr(images,"NULL") == NULL ) { if( PowFindImagesBBox( images, xmin, xmax, ymin, ymax, &(graph->WCS) ) == TCL_ERROR ) { return TCL_ERROR; } } else if( *xmin!=DBL_MAX ) { double xdim, ydim; /* Only plots in graph... expand by 10% for margins around points */ xdim = *xmax - *xmin; ydim = *ymax - *ymin; *xmin -= 0.05*xdim; *ymin -= 0.05*ydim; *xmax += 0.05*xdim; *ymax += 0.05*ydim; } /* Convert bounds back into graph coordinates */ if( *xmin!=DBL_MAX ) { PowPixToPos(*xmin, *ymin, &(graph->WCS), xmin, ymin ); PowPixToPos(*xmax, *ymax, &(graph->WCS), xmax, ymax ); } else { /* Failed to find any valid bounding box. Try just 1 pixel wide around reference pix */ PowPixToPos( graph->WCS.refPix[0]-1, graph->WCS.refPix[1]-1, &(graph->WCS), xmin, ymin); PowPixToPos( graph->WCS.refPix[0]+1, graph->WCS.refPix[1]+1, &(graph->WCS), xmax, ymax); } return TCL_OK; } int PowSortGraphMinMax( PowGraph *graph, double *xleft, double *xright, double *ybot, double *ytop, double *xdim, double *ydim) { double tmp; int len; char *idxStr; const char *graphType; int zoomed; int xCount, yCount; len = strlen(graph->graph_name)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "graphType", graph->graph_name); graphType = Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY); ckfree(idxStr); len = strlen(graph->graph_name)+15; idxStr = (char *) ckalloc( len*sizeof(char) ); sprintf(idxStr, "%s,%s", "zoomed", graph->graph_name); zoomed = atoi(Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY)); ckfree(idxStr); xCount = atoi(Tcl_GetVar2(interp,"xCount",graph->graph_name,TCL_GLOBAL_ONLY)); yCount = atoi(Tcl_GetVar2(interp,"yCount",graph->graph_name,TCL_GLOBAL_ONLY)); if ( PowPosToPix(*xleft, *ybot, &graph->WCS, xleft, ybot) ) return TCL_ERROR; if ( PowPosToPix(*xright, *ytop, &graph->WCS, xright, ytop) ) return TCL_ERROR; if ( zoomed == 0 && strcmp(graphType, "binary") == 0 && xCount % 2 != 0 ) { } else { } if ( zoomed == 0 && strcmp(graphType, "binary") == 0 && yCount % 2 != 0 ) { } else { } if ( *xleft>*xright ) { tmp=*xleft; *xleft=*xright; *xright=tmp; } if ( *ybot >*ytop ) { tmp=*ybot; *ybot =*ytop; *ytop =tmp; } *xdim = *xright - *xleft; *ydim = *ytop - *ybot; /* Convert bounds back into graph coordinates and return */ if ( PowPixToPos(*xleft, *ybot, &graph->WCS, xleft, ybot) ) return TCL_ERROR; if ( PowPixToPos(*xright, *ytop, &graph->WCS, xright, ytop) ) return TCL_ERROR; return TCL_OK; } PowCurve * PowFindCurve(const char *curve_name) { Tcl_HashEntry *entry_ptr; PowCurve *curve_ptr; if(curve_name == NULL || strstr(curve_name,"NULL") != NULL) { return (PowCurve *) NULL; } entry_ptr = Tcl_FindHashEntry(&PowCurveTable,curve_name); if (entry_ptr == NULL) { return (PowCurve *) NULL; } curve_ptr = (PowCurve *) Tcl_GetHashValue(entry_ptr); return curve_ptr; } PowImage * PowFindImage(const char *image_name) { Tcl_HashEntry *entry_ptr; PowImage *image_ptr; if(image_name == NULL || strstr(image_name,"NULL") != NULL) { return (PowImage *) NULL; } entry_ptr = Tcl_FindHashEntry(&PowImageTable,image_name); if (entry_ptr == NULL) { return (PowImage *) NULL; } image_ptr = (PowImage *) Tcl_GetHashValue(entry_ptr); return image_ptr; } #ifdef __WIN32__ __int64 PowExtractDatumLong(PowData *data, int element) { __int64 datum; return *((__int64 *) data->data_array + element); } #else long long PowExtractDatumLong(PowData *data, int element) { return *((long long *) data->data_array + element); } #endif double PowExtractDatum(PowData *data, int element) { double datum; switch (data->data_type) { case BYTE_DATA : datum = (double) *((unsigned char *) data->data_array + element); if (datum == UCHAR_MAX) { datum = DBL_MAX;} break; case INT_DATA : datum = (double) *((int *) data->data_array + element); if (datum == INT_MAX) {datum = DBL_MAX;} break; case SHORTINT_DATA : datum = (double) *((short int *) data->data_array + element); if (datum == SHRT_MAX) {datum = DBL_MAX;} break; case REAL_DATA : datum = (double) *((float *) data->data_array + element); if (datum == FLT_MAX) {datum = DBL_MAX;} break; case DOUBLE_DATA : datum = *((double *) data->data_array + element); break; case STRING_DATA : /*don't use PowExtractDatum on string data */ datum = DBL_MAX; break; case LONGLONG_DATA: datum = DBL_MAX; break; } return datum; } int PowPutDatum(PowData *data, double datum, int element) { switch (data->data_type) { case BYTE_DATA : *((unsigned char *) data->data_array + element) = (unsigned char) datum; break; case INT_DATA : *((int *) data->data_array + element) = (int) datum; break; case SHORTINT_DATA : *((short int *) data->data_array + element) = (int) datum; break; case REAL_DATA : *((float *) data->data_array + element) = (float) datum; break; case DOUBLE_DATA : *((double *) data->data_array + element) = (double) datum; break; } return TCL_OK; } PowVector * PowFindVector(char *vector_name) { Tcl_HashEntry *entry_ptr; PowVector *vector_ptr; if(vector_name == NULL || strstr(vector_name,"NULL") != NULL) { return (PowVector *) NULL; } entry_ptr = Tcl_FindHashEntry(&PowVectorTable,vector_name); if (entry_ptr == NULL) { return (PowVector *) NULL; } vector_ptr = (PowVector *) Tcl_GetHashValue(entry_ptr); return vector_ptr; } PowData * PowFindData(char *data_name) { Tcl_HashEntry *entry_ptr; PowData *data_ptr; if(data_name == NULL || strstr(data_name,"NULL") != NULL) { return (PowData *) NULL; } entry_ptr = Tcl_FindHashEntry(&PowDataTable,data_name); if (entry_ptr == NULL) { return (PowData *) NULL; } data_ptr = (PowData *) Tcl_GetHashValue(entry_ptr); return data_ptr; } PowGraph * PowFindGraph(char *graph_name) { Tcl_HashEntry *entry_ptr; PowGraph *graph_ptr; if(graph_name == NULL || strstr(graph_name,"NULL") != NULL) { return (PowGraph *) NULL; } entry_ptr = Tcl_FindHashEntry(&PowGraphTable,graph_name); if (entry_ptr == NULL) { return (PowGraph *) NULL; } graph_ptr = (PowGraph *) Tcl_GetHashValue(entry_ptr); return graph_ptr; } const char *PowGetObjectOption(char *graph, const char *obj, char *option, char *objType) { char *idxStr, gn[255]; const char *res; int len; len = strlen(graph); if( len>5 && !strcmp(graph+len-5,"scope") ) { strncpy(gn,graph,len-5); gn[len-5]='\0'; } else { strcpy(gn,graph); } len = strlen(gn)+strlen(obj)+strlen(option)+10; idxStr = (char *) ckalloc( len*sizeof(char) ); if( !strcmp(objType,"curve") ) { sprintf(idxStr,"%s%s,%s",option,obj,gn); res = Tcl_GetVar2(interp,"powCurveParam",idxStr,TCL_GLOBAL_ONLY); if( res==NULL ) { sprintf(idxStr,"%s,powDef",option); res = Tcl_GetVar2(interp,"powCurveParam",idxStr,TCL_GLOBAL_ONLY); } } else if( !strcmp(objType,"image") ) { sprintf(idxStr,"%s%s,%s",option,obj,gn); res = Tcl_GetVar2(interp,"powImageParam",idxStr,TCL_GLOBAL_ONLY); if( res==NULL ) { sprintf(idxStr,"%s,powDef",option); res = Tcl_GetVar2(interp,"powImageParam",idxStr,TCL_GLOBAL_ONLY); } } else if( !strcmp(objType,"graph") ) { sprintf(idxStr,"%s%s,%s",option,obj,gn); res = Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY); if( res==NULL ) { sprintf(idxStr,"%s,powDef",option); res = Tcl_GetVar2(interp,"powPlotParam",idxStr,TCL_GLOBAL_ONLY); } } ckfree(idxStr); return res; } int PowPosToPix( double xpos, double ypos, WCSdata *WCS, double *xpix, double *ypix ) { char powFitsHeader[14]="powFitsHeader"; char powFitsHeaderCnt[17]="powFitsHeaderCnt"; int i, relax, HDRcnt, ctrl, nreject=0, nwcs=0; const char *HDRstring; /* input */ int nelem; double pixcrd[NCOORD][4]; /* output */ double imgcrd[NCOORD][4], world[NCOORD][4]; double phi[NCOORD], theta[NCOORD]; int stat[NCOORD]; int statFix[NWCSFIX]; int coordSel; int useWCSInfo; const char *str = NULL; if ( WCS->graphName[0] != '\0' && strcmp(WCS->graphName, "NULL") != 0 ) { str = Tcl_GetVar2(interp,"useWCSInfo",WCS->graphName,TCL_GLOBAL_ONLY); } else if ( WCS->curveName[0] != '\0' && strcmp(WCS->curveName, "NULL") != 0 ) { str = Tcl_GetVar2(interp,"useWCSInfo",WCS->curveName,TCL_GLOBAL_ONLY); } /* str = Tcl_GetVar(interp,"useWCSInfo",TCL_GLOBAL_ONLY); */ if ( str != (char *)NULL ) { useWCSInfo = atoi(str); } else { useWCSInfo = 0; } /* useWCSInfo = 1; */ if ( useWCSInfo == 1 ) { /* using WCS information */ char errormsg[512]; Tcl_Obj *listObj; Tcl_Obj *wcsname[27]; int status; if ( WCS->haveWCSinfo == 0 ) { /* no wcs info yet */ if ( WCS->graphName[0] != '\0' && strcmp(WCS->graphName, "NULL") != 0 ) { HDRstring = Tcl_GetVar2(interp,powFitsHeader,WCS->graphName,TCL_GLOBAL_ONLY); HDRcnt = atoi(Tcl_GetVar2(interp,powFitsHeaderCnt,WCS->graphName,TCL_GLOBAL_ONLY)); } else if ( WCS->curveName[0] != '\0' && strcmp(WCS->curveName, "NULL") != 0 ) { HDRstring = Tcl_GetVar2(interp,powFitsHeader,WCS->curveName,TCL_GLOBAL_ONLY); HDRcnt = atoi(Tcl_GetVar2(interp,powFitsHeaderCnt,WCS->curveName,TCL_GLOBAL_ONLY)); } else { Tcl_SetResult(interp, "Can't construct WCS information." ,TCL_VOLATILE); Tcl_SetVar(interp,"powWCSTranslation", "1" ,TCL_GLOBAL_ONLY); return TCL_ERROR; } relax = WCSHDR_all; ctrl = 2; if (status = wcspih(HDRstring, HDRcnt, relax, ctrl, &nreject, &nwcs, &(WCS->wcs))) { sprintf (errormsg, "Couldn't construct WCS information: %s", WCSpih_Message[status]); Tcl_SetResult(interp, errormsg ,TCL_VOLATILE); Tcl_SetVar(interp,"powWCSTranslation", WCSpih_Message[status] ,TCL_GLOBAL_ONLY); return TCL_ERROR; } listObj = Tcl_NewObj(); for (i=0; iwcs[i].alt,-1); } /* This is just a debug statement */ /* powDebugDataPrint(HDRstring, HDRcnt, WCS, nwcs, WCS->graphName); */ Tcl_ListObjAppendElement( interp, listObj, Tcl_NewIntObj( nwcs ) ); Tcl_ListObjAppendElement( interp, listObj, Tcl_NewListObj(nwcs,wcsname) ); if ( WCS->graphName[0] != '\0' && strcmp(WCS->graphName, "NULL") != 0 ) { Tcl_SetVar2Ex(interp,"powWCSList", WCS->graphName, listObj, TCL_GLOBAL_ONLY); } else if ( WCS->curveName[0] != '\0' && strcmp(WCS->curveName, "NULL") != 0 ) { Tcl_SetVar2Ex(interp,"powWCSList", WCS->curveName, listObj, TCL_GLOBAL_ONLY); } WCS->haveWCSinfo = 1; } if ( WCS->graphName[0] != '\0' && strcmp(WCS->graphName, "NULL") != 0 ) { coordSel = atoi(Tcl_GetVar2(interp,"powWCSName",WCS->graphName,TCL_GLOBAL_ONLY)); } else if ( WCS->curveName[0] != '\0' && strcmp(WCS->curveName, "NULL") != 0 ) { coordSel = atoi(Tcl_GetVar2(interp,"powWCSName",WCS->curveName,TCL_GLOBAL_ONLY)); } WCS->wcs[coordSel].crpix[0] = WCS->refPix[0]; WCS->wcs[coordSel].crpix[1] = WCS->refPix[1]; /* fprintf(stdout, "---PosToPix graphName: <%s>, coordSel: <%d>\n", WCS->graphName, coordSel); fflush(stdout); */ nelem = 2; world[0][0] = xpos; world[0][1] = ypos; world[0][2] = 1.f; world[0][3] = 1.f; status = 0; status = wcsfix(7, 0, &(WCS->wcs[coordSel]), statFix); status = wcss2p(&(WCS->wcs[coordSel]), NCOORD, nelem, world, phi, theta, imgcrd, pixcrd, stat); if ( status ) { sprintf (errormsg, "Couldn't translate WCS coords to pixels: %s", WCStrans_Message[status]); Tcl_SetResult( interp, errormsg, TCL_VOLATILE ); Tcl_SetVar(interp,"powWCSTranslation", WCStrans_Message[status] ,TCL_GLOBAL_ONLY); return TCL_ERROR; } else { *xpix = pixcrd[0][0]; *ypix = pixcrd[0][1]; Tcl_SetVar(interp,"powWCSTranslation","0",TCL_GLOBAL_ONLY); } } else { xpos -= WCS->refVal[0]; ypos -= WCS->refVal[1]; *xpix = WCS->cdRvrs[0][0] * xpos + WCS->cdRvrs[0][1] * ypos; *ypix = WCS->cdRvrs[1][0] * xpos + WCS->cdRvrs[1][1] * ypos; Tcl_SetVar(interp,"powWCSTranslation","0",TCL_GLOBAL_ONLY); *xpix += WCS->refPix[0]; *ypix += WCS->refPix[1]; } return TCL_OK; } int PowPixToPos ( double xpix, double ypix, WCSdata *WCS, double *xpos, double *ypos ) { char powFitsHeader[14]="powFitsHeader"; char powFitsHeaderCnt[17]="powFitsHeaderCnt"; int i, relax, HDRcnt, ctrl, nreject=0, nwcs=0; const char *HDRstring; /* input */ int nelem; double pixcrd[NCOORD][4]; /* output */ double imgcrd[NCOORD][4], world[NCOORD][4]; double phi[NCOORD], theta[NCOORD]; int stat[NCOORD]; int statFix[NWCSFIX]; int coordSel; int useWCSInfo; const char *str = NULL; if ( WCS->graphName[0] != '\0' && strcmp(WCS->graphName, "NULL") != 0 ) { str = Tcl_GetVar2(interp,"useWCSInfo",WCS->graphName,TCL_GLOBAL_ONLY); } else if ( WCS->curveName[0] != '\0' && strcmp(WCS->curveName, "NULL") != 0 ) { str = Tcl_GetVar2(interp,"useWCSInfo",WCS->curveName,TCL_GLOBAL_ONLY); } if ( str != (char *)NULL ) { useWCSInfo = atoi(str); } else { useWCSInfo = 0; } /* useWCSInfo = 1; */ if ( useWCSInfo == 1 ) { /* using WCS information */ char errormsg[512]; Tcl_Obj *listObj; Tcl_Obj *wcsname[27]; int status; if ( WCS->haveWCSinfo == 0 ) { if ( WCS->graphName[0] != '\0' && strcmp(WCS->graphName, "NULL") != 0 ) { HDRstring = Tcl_GetVar2(interp,powFitsHeader,WCS->graphName,TCL_GLOBAL_ONLY); HDRcnt = atoi(Tcl_GetVar2(interp,powFitsHeaderCnt,WCS->graphName,TCL_GLOBAL_ONLY)); } else if ( WCS->curveName[0] != '\0' && strcmp(WCS->curveName, "NULL") != 0 ) { HDRstring = Tcl_GetVar2(interp,powFitsHeader,WCS->curveName,TCL_GLOBAL_ONLY); HDRcnt = atoi(Tcl_GetVar2(interp,powFitsHeaderCnt,WCS->curveName,TCL_GLOBAL_ONLY)); } else { Tcl_SetResult(interp, "Can't construct WCS information." ,TCL_VOLATILE); Tcl_SetVar(interp,"powWCSTranslation", "1" ,TCL_GLOBAL_ONLY); return TCL_ERROR; } relax = WCSHDR_all; ctrl = 2; if (status = wcspih(HDRstring, HDRcnt, relax, ctrl, &nreject, &nwcs, &(WCS->wcs))) { sprintf (errormsg, "Couldn't construct WCS information: %s", WCSpih_Message[status]); Tcl_SetResult(interp, errormsg ,TCL_VOLATILE); Tcl_SetVar(interp,"powWCSTranslation", WCSpih_Message[status] ,TCL_GLOBAL_ONLY); return TCL_ERROR; } listObj = Tcl_NewObj(); for (i=0; iwcs[i].alt,-1); } /* This is just a debug statement */ /* powDebugDataPrint(HDRstring, HDRcnt, WCS, nwcs, WCS->graphName); */ Tcl_ListObjAppendElement( interp, listObj, Tcl_NewIntObj( nwcs ) ); Tcl_ListObjAppendElement( interp, listObj, Tcl_NewListObj(nwcs,wcsname) ); if ( WCS->graphName[0] != '\0' && strcmp(WCS->graphName, "NULL") != 0 ) { Tcl_SetVar2Ex(interp,"powWCSList", WCS->graphName, listObj, TCL_GLOBAL_ONLY); } else if ( WCS->curveName[0] != '\0' && strcmp(WCS->curveName, "NULL") != 0 ) { Tcl_SetVar2Ex(interp,"powWCSList", WCS->curveName, listObj, TCL_GLOBAL_ONLY); } WCS->haveWCSinfo = 1; } if ( WCS->graphName[0] != '\0' && strcmp(WCS->graphName, "NULL") != 0 ) { coordSel = atoi(Tcl_GetVar2(interp,"powWCSName",WCS->graphName,TCL_GLOBAL_ONLY)); } else if ( WCS->curveName[0] != '\0' && strcmp(WCS->curveName, "NULL") != 0 ) { coordSel = atoi(Tcl_GetVar2(interp,"powWCSName",WCS->curveName,TCL_GLOBAL_ONLY)); } /* fprintf(stdout, "PixToPos graphName: <%s> coordSel: <%d>\n", WCS->graphName, coordSel); fprintf(stdout, " WCS->refPix[0]: <%20.15f> WCS->refPix[1]: <%20.15f>\n", WCS->refPix[0], WCS->refPix[1]); fflush(stdout); */ WCS->wcs[coordSel].crpix[0] = WCS->refPix[0]; WCS->wcs[coordSel].crpix[1] = WCS->refPix[1]; /* using WCS information */ nelem = 2; pixcrd[0][0] = xpix; pixcrd[0][1] = ypix; pixcrd[0][2] = 1.f; pixcrd[0][3] = 1.f; status = 0; status = wcsfix(7, 0, &(WCS->wcs[coordSel]), statFix); status = wcsp2s(&(WCS->wcs[coordSel]), NCOORD, nelem, pixcrd, imgcrd, phi, theta, world, stat); if ( status ) { sprintf (errormsg, "Couldn't translate pixels to WCS coords: %s", WCStrans_Message[status]); Tcl_SetResult( interp, errormsg, TCL_VOLATILE ); Tcl_SetVar(interp,"powWCSTranslation", WCStrans_Message[status] ,TCL_GLOBAL_ONLY); return TCL_ERROR; } *xpos = world[0][0]; *ypos = world[0][1]; Tcl_SetVar(interp,"powWCSTranslation", "0" ,TCL_GLOBAL_ONLY); } else { xpix -= WCS->refPix[0]; ypix -= WCS->refPix[1]; *xpos = WCS->cdFrwd[0][0] * xpix + WCS->cdFrwd[0][1] * ypix; *ypos = WCS->cdFrwd[1][0] * xpix + WCS->cdFrwd[1][1] * ypix; *xpos += WCS->refVal[0]; *ypos += WCS->refVal[1]; Tcl_SetVar(interp,"powWCSTranslation", "0" ,TCL_GLOBAL_ONLY); } return TCL_OK; } /* Routine to determine whether a point is in the region */ int PowIsInRegion( double* pos , double *parReg, int nParReg, char *shape, int* status) /* The pos and parReg list should be converted to pow pixel before passing into this routine */ { char tmp_shape[10]; char *ptr; double x,y,k,b,x1,y1; int i; double *polygon_vertex; int result; *status = 0; ptr = tmp_shape; strcpy(tmp_shape,shape); while(*ptr != '\0') { *ptr = tolower(*ptr); ptr++; } if (!strcmp(tmp_shape,"point")) { if(nParReg != 2) { *status = 1; return 0; } if (pos[0]==parReg[0] && pos[1] == parReg[1]) return 1; else return 0; } if (!strcmp(tmp_shape,"line")) { if(nParReg != 4) { *status = 1; return 0; } x = parReg[2] >= parReg[0]?parReg[2]:parReg[0]; if (pos[0] > x) return 0; x = parReg[2] <= parReg[0]?parReg[2]:parReg[0]; if (pos[0] < x) return 0; y = parReg[3] >= parReg[1]?parReg[3]:parReg[1]; if (pos[0] > x) return 0; y = parReg[3] <= parReg[1]?parReg[3]:parReg[1]; if (pos[0] < x) return 0; if(parReg[2] != parReg[0]) { k = (parReg[3] - parReg[1])/(parReg[2] - parReg[0]); b = parReg[1] - k * parReg[0]; y = k*pos[0] + b; if ( pos[1] == y) return 1; else return 0; } else { if (pos[0] == parReg[0]) return 1; return 0; } } if (!strcmp(tmp_shape,"polygon")) { polygon_vertex = (double *)malloc((nParReg + 1) * sizeof (double)); for (i=0; i < nParReg; i++) { polygon_vertex[i] = parReg[i]; } result = Pt_in_Poly(pos[0], pos[1], nParReg, polygon_vertex); free (polygon_vertex); return result; } if (!strcmp(tmp_shape,"circle")) { if(nParReg != 3) { *status = 1; return 0; } b = (pos[0]-parReg[0])*(pos[0]-parReg[0])+ (pos[1]-parReg[1])*(pos[1]-parReg[1]); if (b <= parReg[2]*parReg[2]) return 1; return 0; } if (!strcmp(tmp_shape,"box")) { if(nParReg != 5) { *status = 1; return 0; } /* The width and height of the box is in pixels! Ugly! */ x = pos[0] - parReg[0]; y = pos[1] - parReg[1]; b = parReg[4]/180.0*3.1415926; x1 = x*cosd(b) + y * sind(b); y1 = -x*sind(b) + y* cosd(b); if ( x1 >= parReg[2]/-2.0 && x1 <= parReg[2]/2.0 && y1 >= parReg[3]/-2.0 && y1 <= parReg[3]/2.0 ) return 1; return 0; } if (!strcmp(tmp_shape,"ellipse")) { if(nParReg != 5) { *status = 1; return 0; } x = pos[0] - parReg[0]; y = pos[1] - parReg[1]; b = parReg[4]/180.0*3.1415926; x1 = x*cosd(b) + y * sind(b); y1 = -x*sind(b) + y* cosd(b); k = x1*x1/parReg[2]/parReg[2] + y1*y1/parReg[3]/parReg[3]; if (k <= 1.0) return 1; return 0; } *status = 3; return 0; } /* Caculate statistics inside the region */ int PowCalRegion( PowImage* image_ptr, char *regionFile, int *rect, double *parReg, int nParReg, char *shape, char *sign, double* cent, double* cstd, double* flux, double* npix, double* mean, double* dmean, int* status) /* The pos and parReg list should be converted to sao pixel before passing into this routine */ { int i, j; double datum; double sx,sy; double sx1,sy1; double sx2,sy2; double sxx,syy; double flux2; int flag; int ix,iy; int regionInputFile; double pos[2]; double absflux; int statusN = 0; /* status must always be initialized = 0 */ SAORegion *Rgn; int xmin,ymin,xmax,ymax, signflag; regionInputFile = 0; if (strcmp(regionFile,"NONE") != 0) { fits_read_rgnfile(regionFile, 0, &Rgn, &statusN); regionInputFile = 1; if ( statusN ) { Tcl_SetResult( interp, "Could not read region file.\n", TCL_VOLATILE ); return TCL_ERROR; } } *npix = 0; if(strchr(sign,'+')!= NULL) { signflag = 1; xmin = rect[0]; ymin = rect[1]; xmax = rect[2]; ymax = rect[3]; } else { signflag = 0; xmin = 1; ymin = 1; xmax = image_ptr->width; ymax = image_ptr->height; } if ( regionInputFile == 1 ) { signflag = 0; xmin = 1; ymin = 1; xmax = image_ptr->width; ymax = image_ptr->height; } *flux = 0.0; flux2 = 0.0; absflux = 0.0; sx = 0.0; sy = 0.0; sxx = 0.0; syy = 0.0; sx1 = 0.0; sy1 = 0.0; sx2 = 0.0; sy2 = 0.0; cent[0] = 0.0; cent[1] = 0.0; if ( regionInputFile == 1 ) { for (j = ymin; j <= ymax; j++) { pos[1] = (double)j; iy = (int)(pos[1] - 1 + image_ptr->yoffset); for (i = xmin; i <= xmax; i++) { pos[0] = (double)i ; ix = (int)(pos[0] - 1 + image_ptr->xoffset); flag = fits_in_region(i, j, Rgn); *status = 0; if (flag) { datum = PowExtractDatum(image_ptr->dataptr, iy * image_ptr->width + ix); if ( datum==DBL_MAX ) { continue; } *flux += datum; flux2 += datum*datum; datum = datum >=0 ? datum : -datum; absflux += datum; sx += pos[0]*datum; sy += pos[1]*datum; sxx += pos[0]*pos[0]*datum; syy += pos[1]*pos[1]*datum; sx1 += pos[0]; sy1 += pos[1]; sx2 += pos[0]*pos[0]; sy2 += pos[1]*pos[1]; (*npix)++; } } } } else { for (j = ymin; j < ymax; j++) { pos[1] = (double)j; iy = (int)(pos[1] - 1 + image_ptr->yoffset); if (iy < 0 || iy >= image_ptr->height ) continue; for (i = xmin; i < xmax; i++) { pos[0] = (double)i ; ix = (int)(pos[0] - 1 + image_ptr->xoffset); if (ix < 0 || ix >= image_ptr->width ) continue; if(*status) *status = 0; flag = PowIsInRegion(pos,parReg,nParReg,shape,status); if (signflag && flag ) { datum = PowExtractDatum(image_ptr->dataptr, iy * image_ptr->width + ix); if ( datum==DBL_MAX ) { continue; } *flux += datum; flux2 += datum*datum; datum = datum >=0 ? datum : -datum; absflux += datum; sx += pos[0]*datum; sy += pos[1]*datum; sxx += pos[0]*pos[0]*datum; syy += pos[1]*pos[1]*datum; sx1 += pos[0]; sy1 += pos[1]; sx2 += pos[0]*pos[0]; sy2 += pos[1]*pos[1]; (*npix)++; } if (!signflag && !flag && *status == 0) { datum = PowExtractDatum(image_ptr->dataptr, ix * image_ptr->height + iy); if ( datum==DBL_MAX ) { continue; } *flux += datum; flux2 += datum*datum; datum = datum >=0 ? datum : -datum; absflux += datum; sx += pos[0]*datum; sy += pos[1]*datum; sxx += pos[0]*pos[0]*datum; syy += pos[1]*pos[1]*datum; sx1 += pos[0]; sy1 += pos[1]; sx2 += pos[0]*pos[0]; sy2 += pos[1]*pos[1]; (*npix)++; } } } } if (*npix == 0 ) { *status = 1; return 1; } if (absflux != 0.0) { cent[0] = sx/(absflux); cent[1] = sy/(absflux); cstd[0] = sqrt(fabs(sxx/(absflux) - cent[0]*cent[0])); cstd[1] = sqrt(fabs(syy/(absflux) - cent[1]*cent[1])); } else { cent[0] = sx1/(*npix); cent[1] = sy1/(*npix); cstd[0] = sqrt(fabs(sx2 - *npix*cent[0]*cent[0])/sqrt((*npix))); cstd[1] = sqrt(fabs(sy2 - *npix*cent[1]*cent[1])/sqrt((*npix))); } *mean = *flux/(*npix); if ( *npix==1 ) *dmean = 0.0; else *dmean = sqrt(flux2-*npix*(*mean)*(*mean))/sqrt((*npix-1)*(*npix)); return 0; } /*---------------------------------------------------------------------------*/ static int Pt_in_Poly( double x, double y, int nPts, double *Pts ) /* Internal routine for testing whether the coordinate x,y is within the */ /* polygon region traced out by the array Pts. */ /*---------------------------------------------------------------------------*/ { int i, j, flag=0; double prevX, prevY; double nextX, nextY; double dx, dy, Dy; nextX = Pts[nPts-2]; nextY = Pts[nPts-1]; for( i=0; iprevY && y>=nextY) || (yprevX && x>=nextX) ) continue; /* Check to see if x,y lies right on the segment */ if( x>=prevX || x>nextX ) { dy = y - prevY; Dy = nextY - prevY; if( fabs(Dy)<1e-10 ) { if( fabs(dy)<1e-10 ) return( 1 ); else continue; } dx = prevX + ( (nextX-prevX)/(Dy) ) * dy - x; if( dx < -1e-10 ) continue; if( dx < 1e-10 ) return( 1 ); } /* There is an intersection! Make sure it isn't a V point. */ if( y != prevY ) { flag = 1 - flag; } else { j = i+1; /* Point to Y component */ do { if( j>1 ) j -= 2; else j = nPts-1; } while( y == Pts[j] ); if( (nextY-y)*(y-Pts[j]) > 0 ) flag = 1-flag; } } return( flag ); } void powDebugDataPrint (char *header, int headerCnt, WCSdata *WCS, int nwcs, char *graphName) { int k = 0; int i; char currentStr[81]; char *ptr; ptr = header; fprintf(stdout, "graphName: <%s>, headerCnt: <%d>\n", graphName, headerCnt); fflush(stdout); for (i= 0; i< strlen(header); i+=80 ) { memset(currentStr, '\0', 81); strncpy(currentStr, ptr, 80); fprintf(stdout, "<%s>\n", currentStr); fflush(stdout); k++; ptr += 80; } fprintf(stdout, "final count: <%d>\n\nnumber of wcs: <%d>\nwcsname: ", k, nwcs ); fprintf(stdout, "wcsname: "); fflush(stdout); for (i= 0; i< nwcs; i++ ) { fprintf(stdout, "<%s>", WCS->wcs[i].alt); } fprintf(stdout, "\n"); fflush(stdout); } fv5.4/tcltk/pow/PowWCS.c0000644000220700001010000011010012076355402014415 0ustar birbylheadev#include #include #include #include "pow.h" #include "wcslib/wcstrig.h" #define DEG2RAD 1.745329252e-2 #define NUM_WCS_TYPES 27 static char wcsProjections[NUM_WCS_TYPES][5] = {"-AZP", "-SZP", "-TAN", "-STG", "-SIN", "-ARC", "-ZPN", "-ZEA", "-AIR", "-CYP", "-CEA", "-CAR", "-MER", "-COP", "-COE", "-COD", "-COO", "-SFL", "-PAR", "-MOL", "-AIT", "-BON", "-PCO", "-TSC", "-CSC", "-QSC", "-HPX"}; void PowInitWCS( WCSdata *WCS, int n ) { int row, col; WCS->RaDecSwap = 0; WCS->nAxis = n; for( row=0; rowrefVal[row] = 0.0; WCS->refPix[row] = 0.0; for( col=0; colcdFrwd[row][col] = (row==col?1:0); WCS->cdRvrs[row][col] = (row==col?1:0); } } memset (WCS->type, '\0', 6); memset (WCS->graphName, '\0', 1024); memset (WCS->curveName, '\0', 1024); wcsini (1, n, WCS->graphName); WCS->haveWCSinfo = 0; } int FillinWCSStructure ( WCSdata *WCS ) { char powFitsHeader[14]="powFitsHeader"; char powFitsHeaderCnt[17]="powFitsHeaderCnt"; int i, relax, HDRcnt, ctrl, nreject=0, nwcs=0; const char *HDRstring; int status; int coordSel; Tcl_Obj *listObj; Tcl_Obj *wcsname[27]; /* no wcs info yet */ if ( WCS->graphName[0] != '\0' && strcmp(WCS->graphName, "NULL") != 0 ) { HDRstring = Tcl_GetVar2(interp,powFitsHeader,WCS->graphName,TCL_GLOBAL_ONLY); HDRcnt = atoi(Tcl_GetVar2(interp,powFitsHeaderCnt,WCS->graphName,TCL_GLOBAL_ONLY)); } else if ( WCS->curveName[0] != '\0' && strcmp(WCS->curveName, "NULL") != 0 ) { HDRstring = Tcl_GetVar2(interp,powFitsHeader,WCS->curveName,TCL_GLOBAL_ONLY); HDRcnt = atoi(Tcl_GetVar2(interp,powFitsHeaderCnt,WCS->curveName,TCL_GLOBAL_ONLY)); } else { Tcl_SetResult(interp, "Can't construct WCS information." ,TCL_VOLATILE); Tcl_SetVar(interp,"powWCSTranslation", "1" ,TCL_GLOBAL_ONLY); return TCL_ERROR; } relax = WCSHDR_all; ctrl = 2; if (status = wcspih(HDRstring, HDRcnt, relax, ctrl, &nreject, &nwcs, &(WCS->wcs))) { char errormsg[512]; sprintf(errormsg, "Can't construct WCS information: %s", WCSpih_Message[status]); Tcl_SetResult(interp, errormsg ,TCL_VOLATILE); Tcl_SetVar(interp,"powWCSTranslation", WCSpih_Message[status] ,TCL_GLOBAL_ONLY); return TCL_ERROR; } listObj = Tcl_NewObj(); for (i=0; iwcs[i].alt,-1); } Tcl_ListObjAppendElement( interp, listObj, Tcl_NewIntObj( nwcs ) ); Tcl_ListObjAppendElement( interp, listObj, Tcl_NewListObj(nwcs,wcsname) ); if ( WCS->graphName[0] != '\0' && strcmp(WCS->graphName, "NULL") != 0 ) { Tcl_SetVar2Ex(interp,"powWCSList", WCS->graphName, listObj, TCL_GLOBAL_ONLY); } else if ( WCS->curveName[0] != '\0' && strcmp(WCS->curveName, "NULL") != 0 ) { Tcl_SetVar2Ex(interp,"powWCSList", WCS->curveName, listObj, TCL_GLOBAL_ONLY); } if (nwcs > 0 ) { if ( WCS->graphName[0] != '\0' && strcmp(WCS->graphName, "NULL") != 0 ) { coordSel = atoi(Tcl_GetVar2(interp,"powWCSName",WCS->graphName,TCL_GLOBAL_ONLY)); } else if ( WCS->curveName[0] != '\0' && strcmp(WCS->curveName, "NULL") != 0 ) { coordSel = atoi(Tcl_GetVar2(interp,"powWCSName",WCS->curveName,TCL_GLOBAL_ONLY)); } WCS->wcs[coordSel].crpix[0] = WCS->refPix[0]; WCS->wcs[coordSel].crpix[1] = WCS->refPix[1]; } WCS->haveWCSinfo = 1; return TCL_OK; } int PowParseWCS( Tcl_Interp *interp, WCSdata *WCS, int argc, Tcl_Obj *const argv[] ) { /* Known coordinate types (from worldpos below) */ double xinc,yinc,rot; double refVal[MAX_WCS_DIMS],refPix[MAX_WCS_DIMS]; double cdFrwd[MAX_WCS_DIMS][MAX_WCS_DIMS],cdRvrs[MAX_WCS_DIMS][MAX_WCS_DIMS]; double norm; Tcl_Obj **listElems; int row, col, nElem, nDims, dim; char *type; int swap=0; PowInitWCS( WCS, MAX_WCS_DIMS ); if( argc>7 ) { Tcl_GetDoubleFromObj(interp,argv[0],refVal+0); Tcl_GetDoubleFromObj(interp,argv[1],refVal+1); Tcl_GetDoubleFromObj(interp,argv[2],refPix+0); Tcl_GetDoubleFromObj(interp,argv[3],refPix+1); Tcl_GetDoubleFromObj(interp,argv[4],&xinc); Tcl_GetDoubleFromObj(interp,argv[5],&yinc); Tcl_GetDoubleFromObj(interp,argv[6],&rot); type = Tcl_GetStringFromObj(argv[7],NULL); if( argc>8 ) Tcl_GetBooleanFromObj(interp,argv[8],&swap); cdFrwd[0][0] = xinc * cosd( rot * DEG2RAD ); cdFrwd[0][1] = -yinc * sind( rot * DEG2RAD ); cdFrwd[1][0] = xinc * sind( rot * DEG2RAD ); cdFrwd[1][1] = yinc * cosd( rot * DEG2RAD ); nDims = 2; } else { nDims = 1; Tcl_ListObjGetElements(interp,argv[0],&nElem,&listElems); if( nElem>MAX_WCS_DIMS ) nElem = MAX_WCS_DIMS; if( nDims < nElem ) nDims = nElem; for( row=0; rowMAX_WCS_DIMS ) nElem = MAX_WCS_DIMS; if( nDims < nElem ) nDims = nElem; for( row=0; rowMAX_WCS_DIMS ? MAX_WCS_DIMS : dim ); if( nDims < nElem ) nDims = nElem; for( row=0; rowRaDecSwap = swap; WCS->nAxis = nDims; if( *type && refVal[0]<0.0 ) refVal[0] += 360.0; for( row=0; rowrefVal[row] = refVal[row]; WCS->refPix[row] = refPix[row]; for( col=0; colcdFrwd[row][col] = cdFrwd[row][col]; WCS->cdRvrs[row][col] = cdRvrs[row][col]; } } if ( *type ) { strcpy(WCS->type,type); } /* PowDumpWCSstructure(WCS); */ return TCL_OK; } void PowDumpWCSstructure ( WCSdata *WCS ) { fprintf(stdout, "**********************************\n"); fprintf(stdout, "WCS->graphName : <%s>\n", WCS->graphName); fprintf(stdout, "WCS->curveName : <%s>\n", WCS->curveName); fprintf(stdout, "WCS->type : <%s>\n", WCS->type); fprintf(stdout, "WCS->RaDecSwap : <%d>\n", WCS->RaDecSwap); fprintf(stdout, "WCS->nAxis : <%d>\n", WCS->nAxis); fprintf(stdout, "WCS->refVal[0] : <%20.15f>\n", WCS->refVal[0]); fprintf(stdout, "WCS->refVal[1] : <%20.15f>\n", WCS->refVal[1]); fprintf(stdout, "WCS->refPix[0] : <%20.15f>\n", WCS->refPix[0]); fprintf(stdout, "WCS->refPix[1] : <%20.15f>\n", WCS->refPix[1]); fprintf(stdout, "WCS->cdFrwd[0] : <%20.15f,%20.15f>\n", WCS->cdFrwd[0][0], WCS->cdFrwd[0][1]); fprintf(stdout, "WCS->cdFrwd[1] : <%20.15f,%20.15f>\n", WCS->cdFrwd[1][0], WCS->cdFrwd[1][1]); fprintf(stdout, "WCS->cdRvrs[0] : <%20.15f,%20.15f>\n", WCS->cdRvrs[0][0], WCS->cdRvrs[0][1]); fprintf(stdout, "WCS->cdRvrs[1] : <%20.15f,%20.15f>\n", WCS->cdRvrs[1][0], WCS->cdRvrs[1][1]); fprintf(stdout, "WCS->rot : <%20.15f>\n", WCS->rot); fprintf(stdout, "WCS->haveWCSinfo: <%d>\n", WCS->haveWCSinfo); fprintf(stdout, "**********************************\n"); fflush(stdout); } int PowWCSInitImage( ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[] ) { /* Fills in the origin, increment, and otherend fields in the specified image using the WCS info provided. This is mainly used by powCreateImage and by the callback proc for the trace on powWCS */ double xpos,ypos; char *imageName; PowImage *image_ptr; int n; if( argc < 6 || argc > 11 ) { Tcl_SetResult( interp, "usage: powWCSInitImage image xref yref xrefpix " "yrefpix xinc yinc rot type ?swap?\n" " or: powWCSInitImage image {refVal} {refPix} " "{matrix} {type} {proj}", TCL_VOLATILE ); return TCL_ERROR; } imageName = Tcl_GetStringFromObj(argv[1],NULL); image_ptr = PowFindImage( imageName ); if (image_ptr == (PowImage *) NULL) { Tcl_SetResult( interp, "Couldn't find image.", TCL_VOLATILE ); return TCL_ERROR; } PowParseWCS(interp, &image_ptr->WCS, argc-2, argv+2); /* add image name to WCS structure */ strcpy (image_ptr->WCS.graphName, imageName); image_ptr->WCS.haveWCSinfo = 0; for( n=0; nWCS.nAxis; ) { image_ptr->WCS.refPix[n++]--; /* Makes pixels zero-indexed */ } if( !image_ptr->WCS.type[0]) { /* Tcl_SetVar2(interp,"powWCS",imageName,"",TCL_GLOBAL_ONLY); */ } /* image_ptr->WCS.xref = (swap?yref:xref); image_ptr->WCS.yref = (swap?xref:yref); image_ptr->WCS.xrefpix = xrefpix - 1; image_ptr->WCS.yrefpix = yrefpix - 1; image_ptr->WCS.xinc = xinc; image_ptr->WCS.yinc = (swap?-yinc:yinc); image_ptr->WCS.rot = (swap?90-rot:rot); */ if( PowPixToPos( -0.5, -0.5, &image_ptr->WCS, &xpos, &ypos ) ) { Tcl_SetResult( interp, "Couldn't translate pixels to WCS coords for image " "initialization", TCL_VOLATILE ); return TCL_ERROR; } image_ptr->xorigin = xpos; image_ptr->yorigin = ypos; if( PowPixToPos( image_ptr->width-0.5, image_ptr->height-0.5, &image_ptr->WCS, &xpos, &ypos ) ) { Tcl_SetResult( interp, "Couldn't translate pixels to WCS coords for " "image initialization", TCL_VOLATILE ); return TCL_ERROR; } image_ptr->xotherend = xpos; image_ptr->yotherend = ypos; image_ptr->xinc = ( xpos - image_ptr->xorigin ) / image_ptr->width; image_ptr->yinc = ( ypos - image_ptr->yorigin ) / image_ptr->height; return TCL_OK; } int PowWCSInitCurve(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { /* Fills in the WCS structure if info exists. This is mainly used by powCreateCurve and by the callback proc for the trace on powWCS */ PowCurve *curve_ptr; char *curveName; int str_len; char *p; if( argc < 7 || argc > 11 ) { Tcl_SetResult( interp, "usage: powWCSInitCurve curve xref yref xrefpix " "yrefpix xinc yinc rot type ?swap?\n" " or: powWCSInitCurve curve {refVal} {refPix} " "{matrix} {type} {proj}", TCL_VOLATILE ); return TCL_ERROR; } curveName = Tcl_GetStringFromObj( argv[1], NULL ); curve_ptr = PowFindCurve( curveName ); if (curve_ptr == (PowCurve *) NULL) { Tcl_SetResult( interp, "Couldn't find curve.", TCL_VOLATILE ); return TCL_ERROR; } PowParseWCS( interp, &curve_ptr->WCS, argc-2, argv+2 ); /* add curve name to WCS structure */ strcpy (curve_ptr->WCS.curveName, curveName); p = strstr(curveName, "_contour"); if ( p != (char *)NULL ) { /* input is contour curve, grab its graph handler */ str_len = strlen(curve_ptr->WCS.curveName) - strlen(p); strncpy(curve_ptr->WCS.graphName, curve_ptr->WCS.curveName, str_len); curve_ptr->WCS.graphName[str_len] = '\0'; } if ( curve_ptr->WCS.type[0] == '\0' ) { /* for some reason, this has to be done for Windows. */ /* curve_ptr->WCS.refPix[0] = 0.0; curve_ptr->WCS.refPix[1] = 0.0; */ } FillinWCSStructure(&curve_ptr->WCS); if ( curve_ptr->WCS.type[0] == '\0' ) { const char *WCSstring; WCSstring = Tcl_GetVar2(interp, "powWCS", curveName,TCL_GLOBAL_ONLY); /* Tcl_SetVar2(interp,"powWCS", curveName, "", TCL_GLOBAL_ONLY); */ } return TCL_OK; } int PowWCSInitGraph( PowGraph *graph, char *curves, char *images, int x_points_right, int y_points_up) { PowCurve *current_curve; PowImage *current_image; int index,Argc; const char **Argv; char *p; graph->WCS.type[0] = '\0'; graph->xoff = 0.0; graph->yoff = 0.0; if(images != NULL && strstr(images,"NULL") == NULL ) { if(Tcl_SplitList(interp,images,&Argc,&Argv) != TCL_OK) { return TCL_ERROR; } for( index=0; indexWCS.type[0] ) { graph->WCS = current_image->WCS; ckfree( (char *)Argv ); return TCL_OK; } } /* Failed to find a WCS image. Grab first image's WCS structure anyway... It could still contain linear scaling. */ graph->WCS = PowFindImage( Argv[0] )->WCS; /* wcsini (1, 2, graph->WCS.wcs); */ p = strstr (images, "imgobj_"); if ( p != (char *)NULL ) { p += strlen("imgobj_"); strcpy(graph->WCS.graphName, p); } else { strcpy(graph->WCS.graphName, images); } strcpy(graph->WCS.curveName, "\0"); ckfree( (char *)Argv ); return TCL_OK; } if(curves != NULL && strstr(curves,"NULL") == NULL ) { if(Tcl_SplitList(interp,curves,&Argc,&Argv) != TCL_OK) { return TCL_ERROR; } for( index=0; indexWCS.type[0] ) { graph->WCS = current_curve->WCS; strcpy(graph->WCS.graphName, "\0"); strcpy(graph->WCS.curveName, curves); ckfree( (char *)Argv ); return TCL_OK; } } ckfree( (char *)Argv ); } PowInitWCS( &graph->WCS, 2 ); if( !x_points_right ) { graph->WCS.cdFrwd[0][0] = -1.0; } if( !y_points_up ) { graph->WCS.cdFrwd[1][1] = -1.0; } return TCL_OK; } int PowXYPx(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { /* Calls the pow_xypx WCS routine, returns list of 2 image pixels*/ double xpix,ypix,xpos,ypos; Tcl_Obj *res[2]; WCSdata WCS; if(argc < 11 ) { Tcl_SetResult( interp, "usage: powXYPx xpos ypos xref yref xrefpix yrefpix " "xinc yinc rot type", TCL_VOLATILE ); return TCL_ERROR; } Tcl_GetDoubleFromObj(interp,argv[1],&xpos); Tcl_GetDoubleFromObj(interp,argv[2],&ypos); PowParseWCS( interp, &WCS, argc-3, argv+3 ); if( PowPosToPix(xpos,ypos,&WCS,&xpix,&ypix) != 0 ) { Tcl_SetResult( interp, "Couldn't translate WCS coords to pixels", TCL_VOLATILE ); return TCL_ERROR; } res[0] = Tcl_NewDoubleObj( xpix ); res[1] = Tcl_NewDoubleObj( ypix ); Tcl_SetObjResult(interp, Tcl_NewListObj(2, res) ); return TCL_OK; } int PowWorldPos(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *const argv[]) { /* Calls the pow_worldpos WCS routine, returns list of 2 graph coords*/ double xpix,ypix,xpos,ypos; Tcl_Obj *res[2]; WCSdata WCS; if(argc < 11 ) { Tcl_SetResult( interp, "usage: powWorldPos xpix ypix xref yref xrefpix " "yrefpix xinc yinc rot type", TCL_VOLATILE ); return TCL_ERROR; } Tcl_GetDoubleFromObj(interp,argv[1],&xpix); Tcl_GetDoubleFromObj(interp,argv[2],&ypix); PowParseWCS( interp, &WCS, argc-3, argv+3 ); if( PowPixToPos(xpix,ypix,&WCS,&xpos,&ypos) != 0 ) { Tcl_SetResult( interp, "Couldn't translate pixels to WCS coords", TCL_VOLATILE ); return TCL_ERROR; } res[0] = Tcl_NewDoubleObj( xpos ); res[1] = Tcl_NewDoubleObj( ypos ); Tcl_SetObjResult(interp, Tcl_NewListObj(2, res) ); return TCL_OK; } /*--------------------------------------------------------------------------*/ int pow_worldpos(double xpix, double ypix, double refVal[], double refPix[], double matrix[][MAX_WCS_DIMS], char *type, double *xpos, double *ypos) /* PDW 03/00: Add -CAR projection support */ /* PDW 02/00: Change interface to use more general matrix/vector notation */ /* LEB 11/97: change the name of the routine from 'ffwldp' to 'pow_worldpos' rexmoved 'status' argument, convert to (0,0) based images to match POW convention. */ /* WDP 1/97: change the name of the routine from 'worldpos' to 'ffwldp' */ /* worldpos.c -- WCS Algorithms from Classic AIPS. Copyright (C) 1994 Associated Universities, Inc. Washington DC, USA. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA. Correspondence concerning AIPS should be addressed as follows: Internet email: aipsmail@nrao.edu Postal address: AIPS Group National Radio Astronomy Observatory 520 Edgemont Road Charlottesville, VA 22903-2475 USA -=-=-=-=-=-=- These two ANSI C functions, worldpos() and xypix(), perform forward and reverse WCS computations for 8 types of projective geometries ("-SIN", "-TAN", "-ARC", "-NCP", "-GLS", "-MER", "-AIT" and "-STG"): worldpos() converts from pixel location to RA,Dec xypix() converts from RA,Dec to pixel location where "(RA,Dec)" are more generically (long,lat). These functions are based on the WCS implementation of Classic AIPS, an implementation which has been in production use for more than ten years. See the two memos by Eric Greisen ftp://fits.cv.nrao.edu/fits/documents/wcs/aips27.ps.Z ftp://fits.cv.nrao.edu/fits/documents/wcs/aips46.ps.Z for descriptions of the 8 projective geometries and the algorithms. Footnotes in these two documents describe the differences between these algorithms and the 1993-94 WCS draft proposal (see URL below). In particular, these algorithms support ordinary field rotation, but not skew geometries (CD or PC matrix cases). Also, the MER and AIT algorithms work correctly only for CRVALi=(0,0). Users should note that GLS projections with yref!=0 will behave differently in this code than in the draft WCS proposal. The NCP projection is now obsolete (it is a special case of SIN). WCS syntax and semantics for various advanced features is discussed in the draft WCS proposal by Greisen and Calabretta at: ftp://fits.cv.nrao.edu/fits/documents/wcs/wcs.all.ps.Z -=-=-=- The original version of this code was Emailed to D.Wells on Friday, 23 September by Bill Cotton , who described it as a "..more or less.. exact translation from the AIPSish..". Changes were made by Don Wells during the period October 11-13, 1994: 1) added GNU license and header comments 2) added testpos.c program to perform extensive circularity tests 3) changed float-->double to get more than 7 significant figures 4) testpos.c circularity test failed on MER and AIT. B.Cotton found that "..there were a couple of lines of code [in] the wrong place as a result of merging several Fortran routines." 5) testpos.c found 0h wraparound in xypix() and worldpos(). 6) E.Greisen recommended removal of various redundant if-statements, and addition of a 360d difference test to MER case of worldpos(). */ /*-----------------------------------------------------------------------*/ /* routine to determine accurate position for pixel coordinates */ /* returns 0 if successful otherwise: */ /* 1 = angle too large for projection; */ /* (WDP 1/97: changed the return value to 501 instead of 1) */ /* does: -SIN, -TAN, -ARC, -NCP, -GLS, -MER, -AIT projections */ /* anything else is linear */ /* Input: */ /* f xpix x pixel number (RA or long without rotation) */ /* f ypiy y pixel number (dec or lat without rotation) */ /* d xref x reference coordinate value (deg) */ /* d yref y reference coordinate value (deg) */ /* f xrefpix x reference pixel */ /* f yrefpix y reference pixel */ /* f xinc x coordinate increment (deg) */ /* f yinc y coordinate increment (deg) */ /* f rot rotation (deg) (from N through E) */ /* c *type projection type code e.g. "-SIN"; */ /* Output: */ /* d *xpos x (RA) coordinate (deg) */ /* d *ypos y (dec) coordinate (deg) */ /*-----------------------------------------------------------------------*/ { double dx, dy, dz, x, y, z; double sins, coss, dect, rat, dt, l, m, mg, da, dd, cos0, sin0; double dec0, ra0; double geo1, geo2, geo3; double pi = 3.14159265358979323846; double cond2r= pi/180.0; double deps = 1.0e-5; int itype; /* Apply Transform Matrix */ dx = matrix[0][0] * (xpix-refPix[0]) + matrix[0][1] * (ypix-refPix[1]); dy = matrix[1][0] * (xpix-refPix[0]) + matrix[1][1] * (ypix-refPix[1]); /* find type */ /* WDP 1/97: removed support for default type for better error checking */ for( itype=0; itype1.0) return( 501); coss = sqrt (1.0 - sins); dt = sin0 * coss + cos0 * m; if ((dt>1.0) || (dt<-1.0)) return(501); dect = asind(dt); rat = cos0 * coss - sin0 * m; if ((rat==0.0) && (l==0.0)) return(501); rat = atan2d(l, rat) + ra0; break; case 1: /* -TAN tan */ x = cos0*cosd(ra0) - l*sind(ra0) - m*cosd(ra0)*sin0; y = cos0*sind(ra0) + l*cosd(ra0) - m*sind(ra0)*sin0; z = sin0 + m* cos0; rat = atan2d( y, x ); dect = atand( z / sqrt(x*x+y*y) ); break; case 2: /* -ARC Arc*/ if (sins>=pi*pi) return(501); sins = sqrt(sins); coss = cosd(sins); if (sins!=0.0) sins = sind(sins) / sins; else sins = 1.0; dt = m * cos0 * sins + sin0 * coss; if ((dt>1.0) || (dt<-1.0)) return(501); dect = asind(dt); da = coss - dt * sin0; dt = l * sins * cos0; if ((da==0.0) && (dt==0.0)) return(501); rat = ra0 + atan2d(dt, da); break; case 3: /* -NCP North celestial pole*/ dect = cos0 - m * sin0; if (dect==0.0) return(501); rat = ra0 + atan2d(l, dect); dt = cosd(rat-ra0); if (dt==0.0) return(501); dect = dect / dt; if ((dect>1.0) || (dect<-1.0)) return(501); dect = acosd(dect); if (dec0<0.0) dect = -dect; break; case 4: /* -GLS global sinusoid */ dect = dec0 + m; if (fabs(dect)>pi/2.0) return(501); coss = cosd(dect); if (fabs(l)>pi*coss) return(501); rat = ra0; if (coss>deps) rat = rat + l / coss; break; case 5: /* -MER mercator */ /* dt = yinc * cosr + xinc * sinr; */ /* Calculate the declination change for a (1,1) offset from refpix */ dt = matrix[1][0] + matrix[1][1]; if (dt==0.0) dt = 1.0; dy = (refVal[1]*0.5 + 45.0) * cond2r; dx = dy + dt / 2.0 * cond2r; dy = log (tand(dy)); dx = log (tand(dx)); geo2 = dt * cond2r / (dx - dy); geo3 = geo2 * dy; geo1 = cosd(refVal[1]*cond2r); if (geo1<=0.0) geo1 = 1.0; rat = l / geo1 + ra0; if (fabs(rat - ra0) > pi+pi) return(501); dt = 0.0; if (geo2!=0.0) dt = (m + geo3) / geo2; dt = exp (dt); dect = 2.0 * atand(dt) - pi / 2.0; break; case 6: /* -AIT Aitoff */ /* dt = yinc * cosr + xinc * sinr; */ /* Calculate the declination change for a (1,1) offset from refpix */ dt = matrix[1][0] + matrix[1][1]; if (dt==0.0) dt = 1.0; dt = dt * cond2r; dy = dec0; dx = sind(dy+dt)/sqrt((1.0+cosd(dy+dt))/2.0) - sind(dy)/sqrt((1.0+cosd(dy))/2.0); if (dx==0.0) dx = 1.0; geo2 = dt / dx; /* Calculate the right ascension change for a (1,1) offset from refpix */ /* dt = xinc*cosr - yinc* sinr; */ dt = matrix[0][0] + matrix[0][1]; if (dt==0.0) dt = 1.0; dt = dt * cond2r; dx = 2.0 * cosd(dy) * sind(dt/2.0); if (dx==0.0) dx = 1.0; geo1 = dt * sqrt((1.0+cosd(dy)*cosd(dt/2.0))/2.0) / dx; geo3 = geo2 * sind(dy) / sqrt((1.0+cosd(dy))/2.0); rat = ra0; dect = dec0; if ((l==0.0) && (m==0.0)) break; dz = 4.0 - l*l/(4.0*geo1*geo1) - ((m+geo3)/geo2)*((m+geo3)/geo2); if ((dz>4.0) || (dz<2.0)) return(501); dz = 0.5 * sqrt (dz); dd = (m+geo3) * dz / geo2; if (fabs(dd)>1.0) return(501); dd = asind(dd); if (fabs(cosd(dd))1.0) return(501); da = asind(da); rat = ra0 + 2.0 * da; dect = dd; break; case 7: /* -STG Sterographic*/ dz = (4.0 - sins) / (4.0 + sins); if (fabs(dz)>1.0) return(501); dect = dz * sin0 + m * cos0 * (1.0+dz) / 2.0; if (fabs(dect)>1.0) return(501); dect = asind(dect); rat = cosd(dect); if (fabs(rat)1.0) return(501); rat = asind(rat); mg = 1.0 + sind(dect) * sin0 + cosd(dect) * cos0 * cosd(rat); if (fabs(mg)deps) rat = pi - rat; rat = ra0 + rat; break; case 8: /* -CAR Cartesian */ rat = ra0 + l; dect = dec0 + m; /* Should do some sperical wrapping, but can't get it to work, yet if( dect > 0.5*pi ) { dect = pi - dect; rat += pi; } if( dect < -0.5*pi ) { dect = -pi - dect; rat += pi; } */ break; default: /* fall through to here on error */ return(504); } /* return ra in range */ /* Oh let's not. LEB */ /* if (rat-ra0> pi) rat -= pi + pi; if (rat-ra0<-pi) rat += pi + pi; if (rat < 0.0) rat += pi + pi; // added by DCW 10/12/94 */ /* correct units back to degrees */ *xpos = rat / cond2r; *ypos = dect / cond2r; /* Do bounds check in degree space since values are exact */ if ( *xpos < 0.0 ) *xpos += 360.0; else if( *xpos >= 360.0 ) *xpos -= 360.0; return 0; } /* End of worldpos */ /*--------------------------------------------------------------------------*/ int pow_xypx(double xpos, double ypos, double refVal[], double refPix[], double matrixF[][MAX_WCS_DIMS], double matrixR[][MAX_WCS_DIMS], char *type, double *xpix, double *ypix) /* PDW 03/00: Add -CAR projection support */ /* PDW 02/00: Change interface to use more general matrix/vector notation */ /* LEB 11/97: change the name of the routine from 'ffxypx' to 'pow_xypx' removed 'status' argument, convert to (0,0) based images to match POW convention. */ /* WDP 1/97: changed name of routine from xypix to ffxypx */ /*-----------------------------------------------------------------------*/ /* routine to determine accurate pixel coordinates for an RA and Dec */ /* returns 0 if successful otherwise: */ /* 1 = angle too large for projection; */ /* 2 = bad values */ /* WDP 1/97: changed the return values to 501 and 502 instead of 1 and 2 */ /* does: -SIN, -TAN, -ARC, -NCP, -GLS, -MER, -AIT projections */ /* anything else is linear */ /* Input: */ /* d xpos x (RA) coordinate (deg) */ /* d ypos y (dec) coordinate (deg) */ /* d xref x reference coordinate value (deg) */ /* d yref y reference coordinate value (deg) */ /* f xrefpix x reference pixel */ /* f yrefpix y reference pixel */ /* f xinc x coordinate increment (deg) */ /* f yinc y coordinate increment (deg) */ /* f rot rotation (deg) (from N through E) */ /* c *type projection type code e.g. "-SIN"; */ /* Output: */ /* f *xpix x pixel number (RA or long without rotation) */ /* f *ypiy y pixel number (dec or lat without rotation) */ /*-----------------------------------------------------------------------*/ { double dx, dy, ra0, dec0, ra, dec, coss, sins, dt, da, dd, sint; double cos0, sin0, dRA; double l, m, geo1, geo2, geo3; double deps=1.0e-5; double pi = 3.14159265358979323846; double cond2r= pi/180.0; int itype; /* find type */ /* WDP 1/97: removed support for default type for better error checking */ for( itype=0; itype pi ) dRA -= pi + pi; else if( dRA <= -pi ) dRA += pi + pi; /* compute direction cosine */ coss = cosd(dec); sins = sind(dec); cos0 = cosd(dec0); sin0 = sind(dec0); l = sind(dRA) * coss; sint = sins * sin0 + coss * cos0 * cosd(dRA); /* process by case */ switch (itype) { case 0: /* -SIN sin*/ if (sint<0.0) return(501); m = sins * cosd(dec0) - coss * sind(dec0) * cosd(dRA); break; case 1: /* -TAN tan */ if (sint<=0.0) return(501); if( cos0<0.001 ) { /* Do a first order expansion around pole */ m = (coss * cosd(dRA)) / (sins * sin0); m = (-m + cos0 * (1.0 + m*m)) / sin0; } else { m = ( sins/sint - sin0 ) / cos0; } if( fabs(sind(ra0)) < 0.3 ) { l = coss*sind(ra)/sint - cos0*sind(ra0) + m*sind(ra0)*sin0; l /= cosd(ra0); } else { l = coss*cosd(ra)/sint - cos0*cosd(ra0) + m*cosd(ra0)*sin0; l /= -sind(ra0); } break; case 2: /* -ARC Arc*/ m = sins * sind(dec0) + coss * cosd(dec0) * cosd(dRA); if (m<-1.0) m = -1.0; if (m>1.0) m = 1.0; m = acosd(m); if (m!=0) m = m / sind(m); else m = 1.0; l = l * m; m = (sins * cosd(dec0) - coss * sind(dec0) * cosd(dRA)) * m; break; case 3: /* -NCP North celestial pole*/ if (dec0==0.0) return(501); /* can't stand the equator */ else m = (cosd(dec0) - coss * cosd(dRA)) / sind(dec0); break; case 4: /* -GLS global sinusoid */ if (fabs(dec) >pi*0.5) return(501); if (fabs(dec0)>pi*0.5) return(501); m = dec - dec0; l = dRA * coss; break; case 5: /* -MER mercator */ /* dt = yinc * cosr + xinc * sinr; */ /* Calculate the declination change for a (1,1) offset from refpix */ dt = matrixF[1][0] + matrixF[1][1]; if (dt==0.0) dt = 1.0; dy = (dec0 + 90.0 * cond2r) * 0.5; dx = dy + (dt * 0.5) * cond2r; dy = log (tand(dy)); dx = log (tand(dx)); geo2 = dt * cond2r / (dx - dy); geo3 = geo2 * dy; l = dRA * cosd(dec0); dt = dec * 0.5 + pi * 0.25; dt = tand(dt); if (dtpi) return(501); /* Calculate the declination change for a (1,1) offset from refpix */ /* dt = yinc * cosr + xinc * sinr; */ dt = matrixF[1][0] + matrixF[1][1]; if (dt==0.0) dt = 1.0; dt = dt * cond2r; dy = dec0; dx = sind(dy+dt)/sqrt((1.0+cosd(dy+dt))/2.0) - sind(dy)/sqrt((1.0+cosd(dy))/2.0); if (dx==0.0) dx = 1.0; geo2 = dt / dx; /* Calculate the RA change for a (1,1) offset from refpix */ /* dt = xinc*cosr - yinc* sinr; */ dt = matrixF[0][0] + matrixF[0][1]; if (dt==0.0) dt = 1.0; dt = dt * cond2r; dx = 2.0 * cosd(dy) * sind(dt/2.0); if (dx==0.0) dx = 1.0; geo1 = dt * sqrt((1.0+cosd(dy)*cosd(dt/2.0))/2.0) / dx; geo3 = geo2 * sind(dy) / sqrt((1.0+cosd(dy))/2.0); dt = sqrt ((1.0 + cosd(dec) * cosd(da))/2.0); if (fabs(dt)0.5*pi) return(501); dd = 1.0 + sins * sind(dec0) + coss * cosd(dec0) * cosd(dRA); if (fabs(dd) The POW Print Control

      The POW Print Control

      When Print button is selected, POW will create a preview image of the entire POW main image screen. There are several button choices available on the top the preview window:

    24. Print: Brings up the print dialog window (see Print Dialog)
    25. Fit to Page (or Original Size): Zoom the image to fit the desire paper size or unzoom the image back to original fize
    26. Page Setup: Bring up the output page setup window (see Page Setup)


      Print Dialog

      Select the destination of output

      Printer

        Printer Command: specify the command to send the image to printer. In Windows, this field is been updated with WinPrint.exe package that came with the installation.

      File

        File Name: specify the output file name of the saved image. The extension of the file will change via the selection from the pull down menu next to the word format:

        format: specify the format of the file of the saved image. The extension in the file name will change via the selection from pull down menu

        Directory: specify the destination directory for the image file to be saved. User can type in the directory or use Browse button to bring up a directory nagivation window to choose the destination directory.

        Print/Save Range: specify the range of pages to be saved or print. Choices are All pages, Current Page, or Page No.

      Note: if selection is File and there are more than one page to be saved, the files will be saved in manner of

        <File Name>_0.<format extension>,
        <File Name>_1.<format extension>,
        <File Name>_2.<format extension>, etc.

      Page Setup

      Select the paper type as well as orientation of the image on the paper.

        Paper Size: Select from the pull down menu of available paper size to output.
        Orientation Size: Select either Portrait or LandScape orientation of image on the output.
        Placement: determine way of output. Choices are
        • Fit on one page: Fit every image/plot into one page.
        • Best Fit on multiple pages: Allow system to determine the best way to fit images/plots onto muliple pages. This is a good choice if the user is concerning about saving paper.
        • One graph per page: Just output one image/plot per pages.
      fv5.4/tcltk/pow/Probe.html0000644000220700001010000000572110072774337015106 0ustar birbylheadev Image probe

      Image Probe

      Overview

      Given a probe, this tool calculates the its centroid coordinates and region statistics such as total number of pixels, total sum of the pixel values (flux) and mean pixel value (mean flux). When the image probe dialog box is open, POW is in the "probe" mode. To go back to the normal mode, user can just simply press the Exit button and return to the normal mode.

      Creating and manipulating probe

      A probe basically is a region. Its shape can be selected by clicking the Probe Shape button. The available shapes are Circle, Box, Ellipse, and Polygon. To create a new probe, place the mouse at the desired location in the graph and click-and-drag with the right mouse button down (Command-Click on Mac-OS). For Circle and Ellipses, the initial mouse location is the center of the probe and the final location is its radius or width and/or height. For Boxes, the mouse movements traces out opposite corner of the rectangle. For Polygon, the mouse locations determines its verteces. To add extra segments to the Polygon, let up on the mouse button, press it again without moving, and drag it to the next vertex.

      To move a probe, simply put cursor inside the probe, and click-and- drag it to the new position with the left mouse. The left mouse is also used for changing and rotating probe. To change the shape, click- and-drag the "change" handle (a small green box) on the probe. To rotate the probe, click-and-drag the "rotation" handle (a small green triangle). The rotation only applies to the shape of ellipse and box.

      For details of creating and manipulating the probe, please refer to the Regions help file.

      Calculating the coordinates of centroid and statistics

      Whenever the probe is created, changed, moved or rotated, the coordinates of centroid and statistics are calculated and shown in the Image Probe dialog box.

      The coordinates of centroid are presented in two ways, in pixel in the Pixel field, and in the graphical coordinate in the Coordinate field. The format of graphical coordinate is either in decimal or hms, determined by the Coord. Format button.

      The statistics of a probe includes total number of pixels ( the N Pixels field), total flux (the Total Flux field) and mean flux (the Mean Flux field). The mean flux is defined as the average flux per pixel inside the probe.

      Saving the coordinates of centroid and statistics

      To save the coordinates of centroid and statistics of current probe to a disk log file, click the Record button. For the first recording or after closing the current log file, you have chance to enter the log file name through a opened file dialog box. To close the current log file, press the Close Log button.

      fv5.4/tcltk/pow/Profile.html0000644000220700001010000000351010072613761015422 0ustar birbylheadev Drawing Profile

      Drawing Profile

      Overview

      The Profile tool can display the cross-section of pixel intensity values (the "Profile") along any line (baseline) across an image. When the profile dialog box is open, POW is in the "profile" mode. In this mode, the user can create, move, rotate, and stretch the baseline with the mouse, and the corresponding "Profile" plot is displayed in the separate panel. The coordinates of the starting and stopping points of the profile are also displayed in the dialog box.

      Creating profile

      The Baseline can be drawn on the image by placing the mouse at the desired starting location and click-and-drag with the right mouse button held down to the end location. When the mouse button is released, a "profile" plot will appear in the separate panel.

      Manipulating profile

      The position of the current profile can be manipulated using the mouse by grabbing and moving either of the end point handles, or the baseline itself.

      To rotate and stretch the baseline, position the mouse over the endpoint you want to move. Press either mouse button, drag it to the desired new position, and release it. The profile plot will be updated.

      To move the whole baseline, position the mouse over any part of the baseline except two ends. Press the left mouse button, drag it to the new position, and release it. The profile plot will be updated.

      Saving profile

      By clicking the "Record" button on the dialog box, one can save the coordinates of the profile plot to an ASCII text file. The data in the saved file contains 4 elements per line: the X and Y graph coordinates of each point, the Pixel Index number (starting with 1), and the intensity value of the image at that position.


      fv5.4/tcltk/pow/ROI.html0000644000220700001010000000401110450557573014460 0ustar birbylheadev Pow ROI Zooming

      Pow ROI Zooming

      To look more closely at a section of a graph, you need to pick a region of interest (ROI) for that graph. The current region of interest is shown by a blue box in the scope window. If there is no blue box, the ROI is an area large enough to display all of the elements (curves and images) of the selected graph and coincides with the enclosing black box in the scope.

      There are four ways to change your region of interest:

        Right click (Command-click on MacOS) and drag in the scope to create a new ROI.
        Left clicking and dragging in the scope will "drag" the current ROI box. The main graph will be replotted using the new ROI when you release the left mouse button.
        Use the Zoom option buttons (see Zoom).
        Right click (Command-click on MacOS) and drag in the main POW window.
      If the ROI does not overlap the current graph (ie, you are dragging out an ROI on an unselected graph), the ROI selection will be applied to the top graph overlapping the ROI. If the ROI does not overlap any graph, the ROI will be applied to the current graph.

      Right double click (Command-double click on MacOS) in the main POW window or scope window. This will replot the graph and undo any previous zooming.


      Zoom Option

      Allow user to zoom in/out on the image/plot.

        Zoom in (2x): Zoom in on the current perspective of the image by factor of 2.
        Zoom out (2x): Zoom out on the current perspective of the image by factor of 2.
        Zoom in 1x (2x, 4x, 8x, 16x, 32x): Zoom in on the original image size by factor of 1 (2, 4, 8, 16 or 32).
        Invert X Axis: Flip the image on its X axis.
        Invert Y Axis: Flip the image on its Y axis.
        Invert Both: Flip the image on its X and Y axis.
        Undo Invert: Un-flip the image.
      fv5.4/tcltk/pow/Region.tcl0000644000220700001010000004765611203345412015076 0ustar birbylheadev######################################################################## # # class: Region superclass: Shape # # purpose: Assign a shape to a graph and perform coordinate transforms # between SAO region descriptions and the canvas. # # usage: Create a new region normally through the RegionList class # which allows the user to draw regions using the mouse. # # To create a region programmaticly: # set rgn [gRegion graph canvas] # Once created, the region's graph and canvas cannot be # changed. The essential parameters for a region are its # sign, geometric shape, shape descriptor, and rotation. # Set these individually using Shape's setShape and # setRotation and Region's setGraphCoords and setSign. Or, # if you have the SAO representation in a list, use # setFunction. # # To obtain the coords of a region, use "getGraphCoords" for # a list of points on the graph making up the shape. Typically # the format is "X0 Y0 X1 Y1" where (X0,Y0) is the object center # and (X1,Y1) is a corner point. Rotation is obtained separately # through "getRotation". Use "getFunction" to get the SAO # region parameters... center, width, rotation. # # The user can move and resize a region. When this occurs, # the region notifies its "owner", via the Shape superclass. # Become the owner of a region using Shape's "setOwner" method. # # WARNING: The setFunction/getFunction routines may change a Circle # region to an Ellipse region if the pixel->graph translation # is asymetric (ie, pixel scale is different on the two # axes)... the shape must be converted to an ellipse to # retain its proper dimensions. # ######################################################################## itcl::class Region { inherit Shape constructor { graph canvas } {Shape::constructor $canvas} {} destructor {} public { method setSign { sign } method getSign { } { return $itsSign } method setSignColors { pos neg } { set signColors [list $pos $neg] } method setOutlineColor { color } { setColor $color } method setBoundaryColor { color } { setBoundaryClr $color } method setHandleColor { color } { setHandleClr $color } method setLineWidth { width } { setLineW $width } method getOutlineColor {} { return [getColor] } method getBoundaryColor {} { return [getBoundaryClr] } method getHandleColor {} { return [getHandleClr] } method getLineWidth {} { return [getLineW] } method setStaticFlag { axis } { set static_axis $axis ; setStatic $axis} method getGraph { } { return $itsGraph } method getFunction { units } method setFunction { units descr } method getPropertyOrder { } { return $propertyOrder } method setPropertyOrder { order } { set propertyOrder $order } method notify { obj msg opts } # Override Shape's implementations to handle new coord system method getCoords { } method setCoords { coords } method setGraphCoords { coords } method getGraphCoords { } method draw {} method finishModification { } method click {} } private { variable itsSign "+" variable itsGraph variable grphCoords {} variable coordState "" variable signColors [list lightblue red] variable static_axis "" variable propertyOrder "Source" method processParameters { shape descr units } } } ######################################################################## # # gRegion graph canvas # # Create a new region in the global namespace. # ######################################################################## proc gRegion { args } { return [uplevel #0 Region #auto $args] } ######################################################################## # # # ######################################################################## itcl::body Region::constructor { graph canvas } { global powPlotParam global powRotation set itsGraph $graph if { [powWCSexists $itsGraph] } { if { [info exists itsGraph] && [info exists powRotation($itsGraph)] } { setRotation $powRotation($itsGraph) } } eval setClip [$itsCanvas coords ${itsGraph}box] setScale $powPlotParam(xmagstep,$itsGraph) $powPlotParam(ymagstep,$itsGraph) addTags [list ${itsGraph}region] set NC [gNotifications default] $NC addObserver $this notify $itsGraph graphHasResized $NC addObserver $this notify $itsGraph graphHasMoved $NC addObserver $this notify $itsGraph graphHasFinishedDrawing $NC addObserver $this notify $itsGraph graphHasBeenSelected $itsCanvas bind "$itsTag" <> [itcl::code $this click] } itcl::body Region::destructor {} { [gNotifications default] removeObserver $this } itcl::body Region::notify { obj msg opts } { global powPlotParam switch -- $msg { "graphHasBeenSelected" { # Redraw graph handles in new locations if { $isSelected } select $itsCanvas raise $itsTag } "graphHasMoved" { # Must force recalculation of canvas coordinates set coordState "graph" $itsCanvas move $itsTag [lindex $opts 0] [lindex $opts 1] $itsCanvas move rgnHandle$itsTag [lindex $opts 0] [lindex $opts 1] } "graphHasFinishedDrawing" - "graphHasResized" { # Must force recalculation of canvas coordinates set coordState "graph" setScale $powPlotParam(xmagstep,$itsGraph) \ $powPlotParam(ymagstep,$itsGraph) draw # Redraw graph handles in new locations if { $isSelected } select } } } itcl::body Region::draw {} { if { !$ignoreClip } { eval setClip [$itsCanvas coords ${itsGraph}box] } Shape::draw } itcl::body Region::click {} { #puts "itsGraph: $itsGraph" #puts "currentGraph: [powGetCurrentGraph]" #puts "allTags: $allTags" # If region is dragable without activating the graph, don't if { $itsGraph != [powGetCurrentGraph] && [lsearch $allTags DragAble]==-1 } { powSelectGraph $itsGraph } if { [lsearch $allTags DragAble]!=-1 } { select } } itcl::body Region::setSign { sign } { if { $static_axis == "" } { if { $sign=="+" } { setColor [lindex $signColors 0] } elseif { $sign=="-"} { setColor [lindex $signColors 1] } } set itsSign $sign } itcl::body Region::finishModification { } { # Make sure grphCoords are up-to-date getGraphCoords Shape::finishModification } ##################################################################### # # Convert Coordinates between various formats # ##################################################################### itcl::body Region::getCoords { } { if { $coordState == "graph" } { # Convert graph to canvas coords set canvCoords {} foreach [list X Y] $grphCoords { foreach {x y} [powGraphToCanvas $itsGraph $X $Y] {} lappend canvCoords $x $y } Shape::setCoords $canvCoords set coordState "" } return [Shape::getCoords] } itcl::body Region::getGraphCoords { } { if { $coordState == "canvas" } { # Convert canvas to graph coords set grphCoords {} foreach [list x y] [Shape::getCoords] { foreach [list X Y] [powCanvasToGraph $itsGraph $x $y] {} lappend grphCoords $X $Y } set coordState "" } return $grphCoords } itcl::body Region::setCoords { coords } { Shape::setCoords $coords set coordState "canvas" } itcl::body Region::setGraphCoords { coords } { set nelem [llength $coords] if { [expr $nelem%2] } { error "Shape coordinates must contain an even number of elements" } set grphCoords $coords set coordState "graph" } ######################################################################## # # Convert between shape-specific functions and internal graph coords # ######################################################################## itcl::body Region::getFunction { units } { # Convert parameters to the shape specific graph-based description. global powPlotParam global powRotation global regionParam if { [llength $units]==1 } { switch -- $units { "pixels" - "image" { set posUnits "pixels" set sizUnits "pixels" } "linear" { set posUnits "linear" set sizUnits "linear" } "saotng" { set posUnits "degrees" set sizUnits "pixels" } "pixel2pos" { set posUnits "degrees" set sizUnits "degrees" } default { set posUnits "degrees" set sizUnits "pixels" } } } else { set posUnits [lindex $units 0] set sizUnits [lindex $units 1] } set cnt 0 foreach [list x y] [getCoords] [list X Y] [getGraphCoords] { set x$cnt $x set y$cnt $y set X$cnt $X set Y$cnt $Y incr cnt } set dx [expr abs($x1-$x0)/$xScale] set dy [expr abs($y1-$y0)/$yScale] if { [info exists itsGraph] && [info exist powRotation($itsGraph)] } { set rot [expr [getRotation] - $powRotation($itsGraph)] } else { set rot [getRotation] } set shape [getShape] set descr [list $X0 $Y0] switch $shape { Box { lappend descr [expr $dx+$dx] [expr $dy+$dy] $rot } Circle { lappend descr [expr sqrt($dx*$dx+$dy*$dy)] } Ellipse { lappend descr [expr 1.41421356*$dx] [expr 1.41421356*$dy] \ $rot } Polygon { for {set i 1} {$i<$cnt} {incr i} { eval lappend descr \$X$i \$Y$i } } Line { lappend descr $X1 $Y1 } Point { } } # # descr is now in the Graph's prefered decimal coordinate system # ... graph positions, pixel sizes, degree rotations # #################################################################### # # Convert description to desired coordinate system if necessary # if { [powWCSexists $itsGraph] } { set WCS 1 } else { set WCS 0 } set wcsObj $powPlotParam(currimg,$itsGraph) if { $wcsObj=="NULL" } { set wcsObj [lindex $powPlotParam(curves,$itsGraph) 0] } set newD {} if { $shape=="Line" || $shape=="Polygon" || $shape=="Point" } { # These objects consist of just pairs of coordinates foreach [list x y] $descr { if { $posUnits=="pixels" } { foreach [list x y] [powGraphToPixel $wcsObj $x $y] {} set x [expr $x + 1] set y [expr $y + 1] if { [info exists regionParam(format)] && $regionParam(format) == "Physical (Pixels)" } { set result [powConvertImage2Physical $x $y] set x [lindex $result 0] set y [lindex $result 1] } } elseif { $posUnits=="degrees" && !$WCS } { error "Cannot code region in degrees, since graph\ lacks WCS information." } lappend newD $x $y } } else { # Remaining objects consist of center, sizes, and rotations # Parse the center position foreach [list x y] [lrange $descr 0 1] { if { $posUnits=="pixels" } { foreach [list x y] [powGraphToPixel $wcsObj $x $y] {} set x [expr $x + 1] set y [expr $y + 1] set image_x $x set image_y $y if { [info exists regionParam(format)] && $regionParam(format) == "Physical (Pixels)" } { set result [powConvertImage2Physical $x $y] set x [lindex $result 0] set y [lindex $result 1] } } elseif { $posUnits=="degrees" && !$WCS } { error "Cannot code region in degrees, since graph\ lacks WCS information." } lappend newD $x $y } # Parse remaining size parameters (given in image pixel coords) if { $shape=="Circle" } { set radius [lindex $descr 2] if { [info exists regionParam(format)] && $regionParam(format) == "Physical (Pixels)" } { set radius [powConvertRadiusImage2Physical $image_x $image_y $x $radius] } if { $radius == 0.0 } { } elseif { ($sizUnits=="degrees" && $WCS) || ($sizUnits=="linear") } { foreach [list dx dy] [powPixelVToGraphV $wcsObj $radius 0] {} set degWidth [expr sqrt($dx*$dx+$dy*$dy)] foreach [list dx dy] [powPixelVToGraphV $wcsObj 0 $radius] {} set degHeight [expr sqrt($dx*$dx+$dy*$dy)] set ratio [expr abs($degWidth/$degHeight-1.0)] if { $ratio > 0.1 } { # Degree Height and Width aren't the same... change to # and ellipse... set shape "Ellipse" setShape $shape lappend newD $degWidth $degHeight # Set radius to rotation value, 0.0 set radius 0.0 } else { set radius [expr 0.5*($degWidth+$degHeight)] } } elseif { $sizUnits=="degrees" && !$WCS } { error "Cannot code region in degrees, since graph\ lacks WCS information." } lappend newD $radius } else { set width [lindex $descr 2] set height [lindex $descr 3] set rot [lindex $descr 4] if { ($sizUnits=="degrees" && $WCS) || ($sizUnits=="linear") } { foreach [list dx dy] [powPixelVToGraphV $wcsObj $width 0] {} set width [expr sqrt($dx*$dx+$dy*$dy)] foreach [list dx dy] [powPixelVToGraphV $wcsObj 0 $height] {} set height [expr sqrt($dx*$dx+$dy*$dy)] } elseif { $sizUnits=="degrees" && !$WCS } { error "Cannot code region in degrees, since graph\ lacks WCS information." } lappend newD $width $height $rot } } set descr $newD return $descr } # descr must consist of pure numbers; no unit/formatting allowed itcl::body Region::setFunction { units descr } { global powRotation set shape [getShape] foreach [list shape descr] \ [processParameters $shape $descr $units] {} if { $shape != [getShape] } { setShape $shape } # # descr is now in the Graph's prefered decimal coordinate system # ... graph positions, pixel sizes, degree rotations # #################################################################### # # Convert the shape specific description to standard 2n parameters # rot & x0 y0 x1 y1 (... xn yn for polygons) in *canvas* coords # Must use canvas coords because widths/heights of objects cannot # be calculated simply in degree space set cnt 0 foreach p $descr { incr cnt set p$cnt $p } set rot 0.0 foreach {x0 y0} [powGraphToCanvas $itsGraph $p1 $p2] {} if {$cnt>2} { set dx [expr $p3*$xScale] if {$cnt>3} { set dy [expr $p4*$yScale] if {$cnt==5} { set rot $p5 if { [powWCSexists $itsGraph] } { if { [info exists itsGraph] && [info exists powRotation($itsGraph)] } { set rot [expr $powRotation($itsGraph) + $rot] } } } } } set newParams [list $x0 $y0] switch $shape { Box { lappend newParams [expr $x0+0.5*$dx] [expr $y0+0.5*$dy] } Circle { lappend newParams [expr $x0+$dx/1.41421356] \ [expr $y0+$p3*$yScale/1.41421356] } Ellipse { lappend newParams [expr $x0+$dx/1.41421356] \ [expr $y0+$dy/1.41421356] } Polygon { foreach {x y} [lrange $descr 2 end] { foreach {x y} [powGraphToCanvas $itsGraph $x $y] {} lappend newParams $x $y } } Line { foreach {x1 y1} [powGraphToCanvas $itsGraph $p3 $p4] {} lappend newParams $x1 $y1 } Point { lappend newParams $x0 $y0 } } setRotation $rot setCoords $newParams } itcl::body Region::processParameters { shape descr units } { global powPlotParam if { [llength $units]==1 } { switch -- $units { "pixels" - "image" { set posUnits "pixels" set sizUnits "pixels" } "linear" { set posUnits "linear" set sizUnits "linear" } "saotng" { set posUnits "degrees" set sizUnits "pixels" } default { set posUnits "degrees" set sizUnits "degrees" } } } else { set posUnits [lindex $units 0] set sizUnits [lindex $units 1] } # Convert description to the graph's coordinate system if necessary if { [powWCSexists $itsGraph] } { set WCS 1 } else { set WCS 0 } set wcsObj $powPlotParam(currimg,$itsGraph) if { $wcsObj=="NULL" } { set wcsObj [lindex $powPlotParam(curves,$itsGraph) 0] } set newD {} if { $shape=="Line" || $shape=="Polygon" || $shape=="Point" } { # These objects consist of just pairs of coordinates foreach [list x y] $descr { if { $posUnits=="pixels" } { foreach [list x y] [powPixelToGraph $wcsObj \ [expr $x-1] [expr $y-1]] {} } elseif { $posUnits=="degrees" && !$WCS } { error "Region coded in degrees, but graph lacks WCS information." } lappend newD $x $y } } else { # Remaining objects consist of center, sizes, and rotations # Parse the center position foreach [list x y] [lrange $descr 0 1] { if { $posUnits=="pixels" } { foreach [list x y] [powPixelToGraph $wcsObj \ [expr $x-1] [expr $y-1]] {} } elseif { $posUnits=="degrees" && !$WCS } { error "Region coded in degrees, but graph lacks WCS information." } lappend newD $x $y } # Parse remaining size parameters... to current image's pixel dims if { $shape=="Circle" } { set radius [lindex $descr 2] if { $radius == 0.0 } { # Do nothing (prevent divide by zero in next block) } elseif { ($sizUnits=="degrees" && $WCS) || ($sizUnits=="linear") } { foreach [list dx dy] [powPixelVToGraphV $wcsObj 1 0] {} set pixWidth [expr $radius/sqrt($dx*$dx+$dy*$dy)] foreach [list dx dy] [powPixelVToGraphV $wcsObj 0 1] {} set pixHeight [expr $radius/sqrt($dx*$dx+$dy*$dy)] set ratio [expr abs($pixWidth/$pixHeight-1.0)] if { $ratio > 0.1 } { # Pixel Height and Width aren't the same... change to # an ellipse... set shape "Ellipse" lappend newD $pixWidth $pixHeight # Set radius to rotation value, 0.0 set radius 0.0 } else { set radius [expr 0.5*($pixWidth+$pixHeight)] } } elseif { $sizUnits=="degrees" && !$WCS } { error "Region coded in degrees, but graph lacks WCS information." } lappend newD $radius } else { set width [lindex $descr 2] set height [lindex $descr 3] set rot [lindex $descr 4] if { ($sizUnits=="degrees" && $WCS) || ($sizUnits=="linear") } { foreach [list dx dy] [powPixelVToGraphV $wcsObj 1 0] {} set width [expr $width/sqrt($dx*$dx+$dy*$dy)] foreach [list dx dy] [powPixelVToGraphV $wcsObj 0 1] {} set height [expr $height/sqrt($dx*$dx+$dy*$dy)] } elseif { $sizUnits=="degrees" && !$WCS } { error "Region coded in degrees, but graph lacks WCS information." } lappend newD $width $height $rot } } return [list $shape $newD] } fv5.4/tcltk/pow/RegionList.tcl0000644000220700001010000012124011476214201015713 0ustar birbylheadev######################################################################## # # class: RegionList # # purpose: Manage a collection of regions and allow drawing of new # regions on a graph. # # usage: To create a region list: # set rgnLst [gRegionList graph canvas] # The region list will overlay a polygon on the graph which # will capture right-mouse clicks which will create a new # region. Use "setDefault" to assign the default sign and # shape to use for new user-created objects. # # To create regions through code, use "addRegion". # # To access information about the region list, use "count" # (number of regions in list), "selected" (index of selected # region), "rgnAtIndex" (an individual region in list), and # "regions" (the full list of regions). # # To delete a region, use "deleteRegion" with the index of # the region to be deleted. # # To disallow drawing of additional regions by the user, # use "setIsDrawable" with a 1 or 0 value. # # To allow only a single region to exist at a time, use # "setAllowsMultiple" with a value of 0. # # To learn when the region list changes, make yourself the # owner of the list using "setOwner", passing the function # name or object and method to be called after a change. # The function or method should accept 2 arguments: obj and # msg. The former is a reference object (either the region # list object or a region object) and the latter is a one- # word string describing the change. See the "notify" method # for the messages passed to the owner. # ######################################################################## itcl::class RegionList { constructor { graph canvas } {} destructor {} public { method selected {} { return $selected } method count {} { return [llength $itsRegions] } method rgnAtIndex { i } { return [lindex $itsRegions $i] } method indexOfRgn { r } { return [lsearch $itsRegions \ [namespace tail $r]]} method regions { } { return $itsRegions } method filename { } { return $filename } method bfilename { } { return $bfilename } method determineIfToDraw { x y flag } method createNewRegion { x y flag } method regionProperty { } method dragNewRegion { x y } method finishNewRegion { } method changeShape { shape } { set defaultShape $shape } method setOutlineColor { color } { set outlineColor $color } method setBoundaryColor { color } { set boundaryColor $color } method setHandleColor { color } { set handleColor $color } method setLineWidth { width } { set lineWidth $width } method setStaticFlag { axis } { set static_axis $axis } method addRegion { sign shape descr fmt } method modifyRegion { sign shape descr fmt } method createRegion { sign shape descr fmt } method deleteAll { } method deleteRegion { i } method selectRegion { i } method drawAll { } method setOwner { owner } { set itsOwner $owner } method getOwner { } { return $itsOwner } method getObj { } { return $this } method notify { obj msg args } method setDefault { sign shape } method writeToFile { fName fmt property } method readFromFile { fName } method readFromStr { fileContents } method parseRegionStr { descr {defUnits "default"} } method buildRegionStr { rgn degFormat } method drawOverlay { } method setIsDrawable { flag } method setAllowsMultiple { flag } { set allowsMultiple $flag } method activate { } method deactivate { } method setCoordSys { coordSys } method getCoordSys { } method getAllFormats { } { return $availFormats } method getPlainFormats { } { return $plainFormats } method flushBufferedRegions { buffer defUnits } method setValueFormat { format } { set valueFormat $format } } private { variable itsCanvas variable itsGraph variable itsOwner "" variable itsRegions {} variable selected -1 variable isDrawable 1 variable isActive 1 variable allowsMultiple 1 variable drawId "" variable static_axis "" variable donotDrawDeletePortion "false" variable filename "" variable bfilename "" variable defaultSign "+" variable defaultShape "Circle" variable defaultSys "FK5 (J2000)" variable outlineColor "blue" variable handleColor "green" variable boundaryColor "red" variable lineWidth 1.0 common availFormats [list \ "Image (Pixels)" \ "Physical (Pixels)" \ "Linear" \ "FK4 (B1950)" \ "FK5 (J2000)" \ "Galactic" \ "Ecliptic" \ "ICRS" \ "Degrees (SAOtng)" ] common plainFormats [list \ "image" \ "physical" \ "linear" \ "fk4" \ "fk5" \ "galactic" \ "ecliptic" \ "icrs" \ "saotng" ] common unitsFormats [list \ "pixels" \ "pixels" \ "linear" \ "degrees" \ "degrees" \ "degrees" \ "degrees" \ "degrees" \ "degrees pixels" ] variable valueFormat "%.7g" method setupBindings { } method requestNewFormat { possibleFmts rgnDescr } method guessFormat { shape descr units fmt } method parseSize { size } method parsePosition { xPos yPos } } } ######################################################################## # # gRegionList graph canvas # # Create a RegionList object and attach it to "graph" on "canvas" # ######################################################################## proc gRegionList { args } { return [uplevel #0 RegionList #auto $args] } ######################################################################## # # # ######################################################################## itcl::body RegionList::constructor { graph canvas } { global powRegionListGlobal global currentRegionObj set powRegionListGlobal [linsert $powRegionListGlobal 0 $this] set currentRegionObj $this #puts "this: $this, powRegionListGlobal: $powRegionListGlobal" set itsGraph $graph set itsCanvas $canvas catch { activate } err catch { setupBindings } err [gNotifications default] addObserver \ $this notify $itsGraph graphHasFinishedDrawing } itcl::body RegionList::destructor {} { global powRegionListGlobal global currentRegionObj set idx [lsearch $powRegionListGlobal $this] if { $idx >= 0 } { set powRegionListGlobal [lreplace $powRegionListGlobal $idx $idx] } if { [llength $powRegionListGlobal] > 0 } { set currentRegionObj [lindex $powRegionListGlobal 0] # event delete <> powBindBtn <> "$itsCanvas bind DrawRegion" \ "global currentRegionObj ; [itcl::code $currentRegionObj createNewRegion %x %y false] ; " \ "[itcl::code $currentRegionObj dragNewRegion %x %y] ; set_tracker_info %x %y $itsCanvas ; " \ "[itcl::code $currentRegionObj finishNewRegion]" powBindBtn <> "$itsCanvas bind DrawRegion" \ "global currentRegionObj ; [itcl::code $currentRegionObj createNewRegion %x %y true] ; " \ "[itcl::code $currentRegionObj dragNewRegion %x %y] ; set_tracker_info %x %y $itsCanvas ; " \ "[itcl::code $currentRegionObj finishNewRegion]" } else { set currentRegionObj "" } #puts "pop top is currentRegionObj: $currentRegionObj" foreach rgn $itsRegions { catch { itcl::delete object $rgn } } if { [winfo exists $itsCanvas] } { catch { $itsCanvas delete $drawId } } [gNotifications default] removeObserver $this } itcl::body RegionList::setIsDrawable { flag } { if { $flag } { if { !$isDrawable } { set isDrawable 1 drawOverlay foreach rgn [regions] { $rgn addTags DrawRegion } } } else { set isDrawable 0 $itsCanvas delete $drawId foreach rgn [regions] { $rgn removeTags DrawRegion } } } itcl::body RegionList::drawOverlay { } { if { $isDrawable && $isActive && [$itsCanvas find withtag $drawId] == "" } { foreach {x1 y1 x2 y2} [$itsCanvas coords ${itsGraph}box] {} set drawId [$itsCanvas create polygon $x1 $y1 $x1 $y2 $x2 $y2 $x2 $y1 \ -fill {} -tags "$itsGraph DrawRegion"] } $itsCanvas raise $drawId $itsGraph $itsCanvas raise shape $itsGraph } itcl::body RegionList::setupBindings { } { global currgn currimg global powLutButton powROIButton global powLutButton_old powROIButton_old tcl_platform global currentRegionObj # set powLutButton_old $powLutButton # set powROIButton_old $powROIButton powBindBtn <> "$itsCanvas bind DrawRegion" \ "global currentRegionObj ; [itcl::code $currentRegionObj createNewRegion %x %y false] ; " \ "[itcl::code $currentRegionObj dragNewRegion %x %y] ; set_tracker_info %x %y $itsCanvas ; " \ "[itcl::code $currentRegionObj finishNewRegion]" powBindBtn <> "$itsCanvas bind DrawRegion" \ "global currentRegionObj ; [itcl::code $currentRegionObj createNewRegion %x %y true] ; " \ "[itcl::code $currentRegionObj dragNewRegion %x %y] ; set_tracker_info %x %y $itsCanvas ; " \ "[itcl::code $currentRegionObj finishNewRegion]" #powBindBtn <> "$itsCanvas bind DrawRegion" \ # "global currentRegionObj ; [itcl::code $currentRegionObj regionProperty] ; " \ # {} \ # {} powBindBtn <> "$itsCanvas bind DrawRegion" \ "powSelectImage $currgn $currimg" \ "powBoundDiddleLut $currgn $currimg %x %y" \ {} } ######################################################################## # # (de)activate: Make region (de)active following graph (de)selection # ######################################################################## itcl::body RegionList::activate { } { drawOverlay foreach rgn [regions] { if { $isDrawable } { $rgn addTags [list DragAble DrawRegion] } else { $rgn addTags DragAble } } if { $selected!=-1 } { [rgnAtIndex $selected] select } set isActive 1 catch { setupBindings } err } itcl::body RegionList::deactivate { } { $itsCanvas delete $drawId foreach rgn [regions] { $rgn removeTags [list DrawRegion DragAble] } if { $selected!=-1 } { [rgnAtIndex $selected] deselect } set isActive 0 } ######################################################################## itcl::body RegionList::setDefault { sign shape } { set defaultSign $sign set defaultShape $shape } itcl::body RegionList::deleteAll { } { global currentRegionObj set allRgns $itsRegions set itsRegions {} set selected -1 foreach rgn $allRgns { itcl::delete object $rgn } if { $itsOwner != "" } { $itsOwner $currentRegionObj regionsHaveChanged } } itcl::body RegionList::deleteRegion { i } { if { $i < 0 } return set rgn [lindex $itsRegions $i] itcl::delete object $rgn if { $i<$selected } { incr selected -1 } selectRegion $selected } itcl::body RegionList::selectRegion { i } { set nRgns [count] if { !$nRgns } { set selected -1 return } if { $i >= $nRgns } { set i [expr $nRgns-1] } elseif { $i < 0 } { set i 0 } [lindex $itsRegions $i] select } itcl::body RegionList::drawAll { } { foreach rgn $itsRegions { $rgn draw } if { $selected != -1 } { [lindex $itsRegions $selected] select } } itcl::body RegionList::notify { obj msg args } { global currentRegionObj global CpowXRangeX0 CpowXRangeX1 CpowXRangeY0 CpowXRangeY1 global TpowXRangeX0 TpowXRangeX1 TpowXRangeY0 TpowXRangeY1 if { $itsOwner == "powXRangeOwner" } { set CpowXRangeX0 $TpowXRangeX0 set CpowXRangeX1 $TpowXRangeX1 set CpowXRangeY0 $TpowXRangeY0 set CpowXRangeY1 $TpowXRangeY1 } else { catch { unset CpowXRangeY0 } err } switch $msg { "graphHasFinishedDrawing" { drawOverlay } "shapeHasChanged" - "shapeIsBeingModified" { set idx [lsearch $itsRegions [namespace tail $obj]] if { $idx==-1 } return if { $itsOwner != "" } { $itsOwner $obj $msg } } "shapeHasDied" { set idx [lsearch $itsRegions [namespace tail $obj]] if { $idx==-1 } return set itsRegions [lreplace $itsRegions $idx $idx] if { $itsOwner != "" } { $itsOwner $currentRegionObj regionsHaveChanged } } "shapeIsSelected" { set idx [lsearch $itsRegions [namespace tail $obj]] if { $idx==-1 } return if { $selected != $idx } { if { $selected != -1 && $selected<[count] } { [lindex $itsRegions $selected] deselect } set selected $idx if { $itsOwner != "" } { $itsOwner $obj "selectionHasChanged" } } } } } itcl::body RegionList::modifyRegion { sign shape descr fmt } { if { $selected == -1 } { set rgn [addRegion $sign $shape $descr $fmt] } else { set rgn [lindex $itsRegions $selected] $rgn setSign $sign $rgn setShape $shape $rgn setFunction $fmt $descr $rgn finishModification $rgn setStaticFlag $static_axis } } itcl::body RegionList::addRegion { sign shape descr fmt } { global regionParam if { ! $allowsMultiple && [count] } { deleteAll } if { [info exists regionParam] && [info exists regionParam(format)] \ && $regionParam(format) == "Physical (Pixels)" } { set tokenList [split $descr " "] set phy_x [lindex $tokenList 0] set phy_y [lindex $tokenList 1] set phy_radius [lindex $tokenList 2] set result [powConvertPhysical2Image $phy_x $phy_y] set img_x [lindex $result 0] set img_y [lindex $result 1] set img_radius [powConvertRadiusPhysical2Image $phy_x $phy_y $img_x $phy_radius] set descr [format "%s %s %s" $img_x $img_y $img_radius] } set rgn [createRegion $sign $shape $descr $fmt] lappend itsRegions $rgn $rgn finishModification return $rgn } itcl::body RegionList::createRegion { sign shape descr fmt } { global currentRegionObj global powRotation set rgn [gRegion $itsGraph $itsCanvas] if [info exists powRotation($itsGraph)] { catch {$rgn setRotation $powRotation($itsGraph)} err } catch {$rgn addTags [list DrawRegion]} err catch {$rgn setOwner [itcl::code $currentRegionObj notify]} err catch {$rgn setSign $sign} err catch {$rgn setShape $shape} err catch {$rgn setFunction $fmt $descr} err catch {$rgn setStaticFlag $static_axis} err catch {$rgn setOutlineColor $outlineColor} err catch {$rgn setBoundaryColor $boundaryColor } err catch {$rgn setHandleColor $handleColor } err catch {$rgn setLineWidth $lineWidth } err return $rgn } ######################################################################## # # The following routines display region property # ######################################################################## itcl::body RegionList::regionProperty { } { global regionParam set rgnIdx [$regionParam(rgns) selected] set rgn [$regionParam(rgns) rgnAtIndex $rgnIdx] #puts "[$rgn getSign]" #puts "$regionParam(currSign)$regionParam(currShape)$regionParam(currDescr)" } ######################################################################## # # The following 3 routines handle dragging out a new region # ######################################################################## itcl::body RegionList::createNewRegion { x y flag } { global currentRegionObj global insideExistGraph set donotDrawDeletePortion false if { $flag == "true" } { if ![info exists insideExistGraph] { set donotDrawDeletePortion true return } else { if { $insideExistGraph == "false" } { set donotDrawDeletePortion true return } } } set x [$itsCanvas canvasx $x] set y [$itsCanvas canvasy $y] if { ! $allowsMultiple && [count] } { set rgn [lindex $itsRegions end] } else { set rgn [gRegion $itsGraph $itsCanvas] $rgn addTags [list DrawRegion] $rgn setOwner [itcl::code $currentRegionObj notify] lappend itsRegions $rgn } $rgn setDrawDeleteFlag $flag $rgn setSign $defaultSign $rgn setShape $defaultShape $rgn setOutlineColor $outlineColor $rgn setBoundaryColor $boundaryColor $rgn setHandleColor $handleColor $rgn setLineWidth $lineWidth $rgn setStaticFlag $static_axis $rgn setCoords [list $x $y $x $y] $rgn beginModification } itcl::body RegionList::dragNewRegion { x y } { if { $donotDrawDeletePortion == "true" } return [lindex $itsRegions end] adjustPt 1 $x $y } itcl::body RegionList::finishNewRegion { } { if { $donotDrawDeletePortion == "true" } return [lindex $itsRegions end] finishModification if { ! $allowsMultiple } { while { [count]>1 } { deleteRegion 0 } } } ######################################################################## # # These two regions Read/Write regions from the given file # ######################################################################## itcl::body RegionList::writeToFile { fName degFmt property } { global powRotation if { $property == "Source" } { set filename $fName } else { set bfilename $fName } set writeFile $fName set base [string tolower [lindex $defaultSys 0]] set freg [open $writeFile w+] puts $freg "# Region created by POW [clock format [clock seconds]], $property" puts $freg "# filename: $itsGraph" if { $base=="degrees" } { # Writing SAOtng format if { [string tolower $degFmt] == "hhmmss" } { puts $freg "# format: hms" } else { puts $freg "# format: degrees" } } elseif { $base=="pixels" } { # Writing SAOtng format puts $freg "# format: pixels" } else { # Writing DS9 format puts $freg $base } for {set i 0} {$i<[count]} {incr i} { set rgn [rgnAtIndex $i] set propertyOrder [$rgn getPropertyOrder] if { $propertyOrder == $property } { foreach [list sign shape descr] [buildRegionStr $rgn $degFmt] {} set rot [lindex $descr end] if { [string first "(pixels)" [string tolower $defaultSys]] > 0 && \ [info exists itsGraph] && [info exists powRotation($itsGraph)] } { if { ([string tolower $shape] == "box" || [string tolower $shape] == "ellipse") && [llength $descr] >= 5 } { set rot [expr $rot + $powRotation($itsGraph)] set descr [lreplace $descr end end $rot] } } set descr [join $descr ", "] puts $freg "$sign[string tolower $shape]($descr)" } } close $freg } itcl::body RegionList::readFromFile { fName } { global readRegionFile set readRegionFile true # Read contents of file set filename $fName set freg [open $filename r] set fileContents [read $freg] close $freg readFromStr $fileContents set readRegionFile false } itcl::body RegionList::readFromStr { fileContents } { global regionParam # Identify what formats are possible for this graph if { [powWCSexists $itsGraph] } { set fmt [list image fk5 saotng] set defaultUnits "unknown" } else { set wcsObj $::powPlotParam(currimg,$itsGraph) if { $wcsObj=="NULL" } { set wcsObj [lindex $::powPlotParam(curves,$itsGraph) 0] } foreach [list x y] [powPixelToGraph $wcsObj 3 5] {} set diff1 [expr abs($x-4) + abs($y-6)] # Do it again for a different point in case we just happened # to hit an intersection of pixels and scale with first point foreach [list x y] [powPixelToGraph $wcsObj 4 6] {} set diff2 [expr abs($x-5) + abs($y-7)] if { $diff1 > 0.0001 || $diff2 > 0.0001 } { # Image scale is not the identity set fmt [list image linear] set defaultUnits "unknown" } else { # Only pixel values allowed set fmt [list image] set defaultUnits "pixels" } } set bufferedRegions {} set newregions [split $fileContents "\n\r|;"] foreach reg $newregions { if { [string index $reg 0] == "#" } { # Handle leading comments... property (source/background) and format are supported here set reg [string tolower $reg] set tokenList [split $reg " "] set property [lindex $tokenList end] if { [string first "format:" $reg]!=-1 } { if { [string first "degrees" $reg]!=-1 } { set fmt "saotng" } elseif { [string first "pixels" $reg]!=-1 } { set fmt "image" } elseif { [string first "hhmmss" $reg]!=-1 } { set fmt "saotng" } elseif { [string first "hms" $reg]!=-1 } { set fmt "saotng" } if { [llength $fmt]==1 } { set idx [lsearch $plainFormats $fmt] set defaultSys [lindex $availFormats $idx] set defaultUnits [lindex $unitsFormats $idx] } } } elseif { [string length $reg] != 0 } { set idx [string first # $reg] if { $idx != -1 } { incr idx -1 set reg [string range $reg 0 $idx] } set parts [split $reg {;}] foreach part $parts { set part [string tolower $part] set idx [lsearch $plainFormats $part] if { $idx != -1 } { # Is a format specifier set fmt $part set regionParam(format) [lindex $availFormats $idx] set defaultUnits [lindex $unitsFormats $idx] set defaultSys [lindex $availFormats $idx] } else { if { [string first = $part]!=-1 } continue if { [catch {\ set newDescr [parseRegionStr $part $defaultUnits]\ } errMsg] } { error "Could not decipher $part\n$errMsg" } lappend bufferedRegions $newDescr if { [llength $fmt]!=1 } { # Format not found yet... try to guess format foreach {sign shape descr units} $newDescr {} set fmt [guessFormat $shape $descr $units $fmt] if { [llength $fmt]==1 } { set idx [lsearch $plainFormats $fmt] set defaultSys [lindex $availFormats $idx] set defaultUnits [lindex $unitsFormats $idx] } } if { [llength $fmt]==1 } { flushBufferedRegions $bufferedRegions $defaultUnits set bufferedRegions {} } } } } } # # If we never identified the file format, ask user for help # if { [llength $fmt]!=1 && [llength $bufferedRegions] } { set newFmt [requestNewFormat $fmt $fileContents] if { $newFmt==-1 } return set fmt [lindex $plainFormats $newFmt] set defaultSys [lindex $availFormats $newFmt] set defaultUnits [lindex $unitsFormats $newFmt] } # Flush any remaining buffered regions flushBufferedRegions $bufferedRegions $defaultUnits } itcl::body RegionList::flushBufferedRegions { buffer defUnits } { foreach d $buffer { foreach [list aSign aShape aDescr aUnits] $d {} # Need to apply default units to this region if { [lindex $aUnits 0]=="unknown" } { set aUnits [lreplace $aUnits 0 0 \ [lindex $defUnits 0]] } if { [lindex $aUnits 1]=="unknown" } { set aUnits [lreplace $aUnits 1 1 \ [lindex $defUnits end]] } if { $itsOwner == "powRegionOwner" } { if { $aSign == "+" } { set outlineColor blue set handleColor green } elseif { $aSign == "-" } { set outlineColor red set handleColor yellow } powRegionResetPanelColor $outlineColor $handleColor } addRegion $aSign $aShape $aDescr $aUnits } } itcl::body RegionList::guessFormat { shape descr units fmts } { set posUnit [lindex $units 0] set sizUnit [lindex $units end] if { $posUnit=="unknown" || $sizUnit=="unknown" } { if { $posUnit=="unknown" } { if { $shape=="Line" || $shape=="Polygon" } { set posArgs $descr } else { set posArgs [lrange $descr 0 1] } foreach [list x y] $posArgs { if { $y<-90.0 || $y>90.0 || $x<-360.0 || $x>360.0 } { # Coords should be in degrees, but x/y out of range. # Parameters must be in pixel coordinates. set fmts [removeElements $fmts [list saotng fk5]] } } } if { $sizUnit=="unknown" } { switch $shape { "Circle" { set rad [lindex $descr 2] if { $rad > 90 } { # Radius cannot be this big and be in degrees set fmts [removeElements $fmts [list fk5]] } } "Ellipse" - "Box" { set dx [expr abs([lindex $descr 2])] set dy [expr abs([lindex $descr 3])] if { $dx > 90 || $dy > 90 } { # Sizes cannot be this big and be in degrees set fmts [removeElements $fmts [list fk5]] } } } } } elseif { $posUnit=="degrees" && $sizUnit=="degrees" } { set fmts "fk5" } elseif { $posUnit=="degrees" && $sizUnit=="pixels" } { set fmts "saotng" } return $fmts } itcl::body RegionList::requestNewFormat { possibleFmts rgnDescr } { global powDWP set w ${powDWP}rgnFmt ::iwidgets::dialogshell $w -title "Region Format" -modality application \ -background $::powbg $w add OK -text "OK" -command "$w deactivate OK" $w add Cancel -text "Cancel" -command "$w deactivate Cancel" $w default OK set wc [$w childsite] label $wc.msg -bg $::powbg -justify left -wraplength 300 -text \ "Region file lacks explicit degree/pixel designation.\ Please select the default format in which to interpret\ the following regions:" ::iwidgets::scrolledtext $wc.rgn -visibleitems 40x4 -background $::powbg \ -wrap none -textbackground white $wc.rgn insert end $rgnDescr $wc.rgn configure -state disabled set allFmts [list image fk5 saotng linear] set allFmtStrs [list \ "Pixel Positions and Sizes" \ "Degree Positions and Sizes" \ "Degree Positions, Pixel Sizes" \ "Linearly Scaled Positions and Sizes" ] ::iwidgets::optionmenu $wc.fmt -labeltext "Format:" -labelpos w \ -background $::powbg eval $wc.fmt insert 0 $allFmtStrs if { [llength $possibleFmts]==0 } { set possibleFmts $allFmts } set idx 0 foreach fmt $allFmts { if { [lsearch $possibleFmts $fmt]==-1 } { $wc.fmt disable $idx } incr idx } $wc.fmt select 0 pack $wc.msg -pady 5 pack $wc.rgn -pady 10 -expand 1 -fill both pack $wc.fmt -pady 5 $w center set btn [$w activate] set ans [$wc.fmt index select] itcl::delete object $w if { $btn == "Cancel" } { set idx -1 } else { set idx [lsearch $plainFormats [lindex $allFmts $ans]] } return $idx } itcl::body RegionList::setCoordSys { coordSys } { set idx [lsearch $availFormats $coordSys] if { $idx != -1 } { set defaultSys $coordSys } else { set idx [lsearch $plainFormats $coordSys] if { $idx != -1 } { set defaultSys [lindex $availFormats $idx] } else { error "Unrecognized coordinate system: $coordSys" } } } itcl::body RegionList::getCoordSys { } { return $defaultSys } ######################################################################## # # Take a string representing a region and parse it into # sign shape params units # ######################################################################## itcl::body RegionList::parseRegionStr { descr {defUnits "default"} } { global powRotation global regionParam set sign $defaultSign set shape $defaultShape if { $defUnits=="default" } { set idx [lsearch $availFormats $defaultSys] set defUnits [lindex $unitsFormats $idx] } set defPosUnits [lindex $defUnits 0] set defSizUnits [lindex $defUnits end] # Split description up into its various parameters set items {} foreach item [split $descr "(), "] { if { $item != "" && $item != "\t" } { lappend items $item } } set idx 0 # Look for shape/sign in first 1 or 2 elements set item [lindex $items $idx] set firstChar [string index $item 0] set firstIsAlpha [string is alpha $firstChar] set firstIsSign [string first $firstChar {+-!}] # After this block, idx should point to first numerical value if { $firstIsAlpha } { set sign "+" set shape $item incr idx } elseif { $firstIsSign!=-1 } { if { [string length $item]==1 } { # Standalone sign; next item must be the shape incr idx set sign $item set shape [lindex $items $idx] incr idx } else { # Is sign part of shape or first value? set tail [string range $item 1 end] if { [string is alpha $tail] } { # It is a shape; set sign and shape set sign $firstChar set shape $tail incr idx } } if { $sign=="-" || $sign=="!" } { set sign "-" } else { set sign "+" } } set shape [string totitle $shape] set descr [lrange $items $idx end] # Make sure there are the correct number of elements in descr set nelem [llength $descr] switch $shape { Box {set nparam 5} Ellipse {set nparam 5} Circle {set nparam 3} Polygon {set nparam [expr 2*int($nelem/2)]} Line {set nparam 4} Point {set nparam 2} default {error "Unrecognized shape: $shape" } } if {$nelem!=$nparam} { error "Wrong number of parameters for $shape!" } # Parse any unit formatting of parameters and identify units. # Raise error if a degree format is used for a nonWCS graph if { [powWCSexists $itsGraph] } { set WCS 1 } else { set WCS 0 } set newDescr {} set allUnits "" if { $shape=="Line" || $shape=="Polygon" || $shape=="Point" } { # These objects consist of just pairs of coordinates foreach [list x y] $descr { foreach [list xVal yVal unts] [parsePosition $x $y] {} if { $unts=="unknown" } { set unts $defPosUnits } if { !$WCS && $unts=="degrees" } { error "Region coded in degrees, but graph lacks WCS information." } elseif { $WCS && $unts=="linear" } { error "Graph coded in degrees,\ but region specified in linear coordinates" } if { $allUnits=="" } { set allUnits $unts } elseif { $unts != $allUnits } { error "All position parameters do not use the same units" } lappend newDescr $xVal $yVal } } else { # Remaining objects consist of center, sizes, and rotations # Parse the center position foreach [list x y] [lrange $descr 0 1] { foreach [list xVal yVal unts] [parsePosition $x $y] {} if { $unts=="unknown" } { set unts $defPosUnits } if { !$WCS && $unts=="degrees" } { error "Region coded in degrees, but graph lacks WCS information." } elseif { $WCS && $unts=="linear" } { error "Graph coded in degrees,\ but region specified in linear coordinates" } set allUnits $unts lappend newDescr $xVal $yVal } # Parse sizes/rotations if { $shape=="Circle" } { set radius [lindex $descr 2] foreach [list radius unts] [parseSize $radius] {} if { $unts=="unknown" } { set unts $defSizUnits } if { !$WCS && $unts=="degrees" } { error "Region coded in degrees, but graph lacks WCS information." } elseif { $WCS && $unts=="linear" } { error "Graph coded in degrees,\ but region specified in linear coordinates" } lappend newDescr $radius lappend allUnits $unts } else { set width [lindex $descr 2] set height [lindex $descr 3] set rot [lindex $descr 4] if { [string first "(pixels)" [string tolower $defaultSys]] > 0 && \ [info exists itsGraph] && [info exists powRotation($itsGraph)] } { if { ([string tolower $shape] == "box" || [string tolower $shape] == "ellipse") && [llength $descr] >= 5 } { set rot [expr $rot - $powRotation($itsGraph)] } } foreach [list newWidth wUnits] [parseSize $width ] {} foreach [list newHeight hUnits] [parseSize $height] {} if { $wUnits != $hUnits } { error "Size arguments have mixed formatting: $width $height" } if { $wUnits=="unknown" } { set wUnits $defSizUnits } if { !$WCS && $wUnits=="degrees" } { error "Region coded in degrees, but graph lacks WCS information." } elseif { $WCS && $wUnits=="linear" } { error "Graph coded in degrees,\ but region specified in linear coordinates" } lappend newDescr $newWidth $newHeight lappend allUnits $wUnits foreach [list rot unts] [parseSize $rot] {} if { $unts=="unknown" } { set unts "degrees" } if { $unts != "degrees" } { error "Rotation coded in something other than degrees: $rot" } lappend newDescr $rot } } if { [lsearch $allUnits "linear"]!=-1 \ && [lsearch $allUnits "degrees"]!=-1 } { error "Cannot mix linear and degree formats" } if { [info exists regionParam(format)] && $regionParam(format) == "Physical (Pixels)" } { return [list $sign $shape $descr $allUnits] } return [list $sign $shape $newDescr $allUnits] } itcl::body RegionList::buildRegionStr { rgn degFmt } { global currgn currimg set units [lindex $unitsFormats [lsearch $availFormats $defaultSys]] set posUnits [lindex $units 0] set sizUnits [lindex $units end] set descr [$rgn getFunction [list $posUnits $sizUnits]] set shape [$rgn getShape] set sign [$rgn getSign] set newD {} if { $shape=="Line" || $shape=="Polygon" || $shape=="Point" } { # These objects consist of just pairs of coordinates foreach [list x y] $descr { if { $posUnits=="degrees" && $degFmt=="hhmmss" } { lappend newD [powHourRA $x "%d:%02d:%05.2f"] [powDegDec $y] } else { lappend newD [format $valueFormat $x] [format $valueFormat $y] } } } else { # Remaining objects consist of center, sizes, and rotations # Parse the center position foreach [list x y] [lrange $descr 0 1] {} #set coord [powGraphToPixel $currimg $x $y] #set icoord [powPixelToGraph $currimg [lindex $coord 0] [lindex $coord 1]] #set x [lindex $icoord 0] #set y [lindex $icoord 1] if { $posUnits=="degrees" && $degFmt=="hhmmss" } { lappend newD [powHourRA $x "%d:%02d:%05.2f"] [powDegDec $y] } else { lappend newD [format $valueFormat $x] [format $valueFormat $y] } # Parse remaining size parameters (given in image pixel coords) if { $shape=="Circle" } { set radius [lindex $descr 2] if { $sizUnits=="degrees" } { if { [expr abs($radius)]<1.0 } { set radius [expr $radius*60.0] if { [expr abs($radius)]<1.0 } { set radius [expr $radius*60.0] lappend newD "[format $valueFormat $radius]\"" } else { lappend newD "[format $valueFormat $radius]'" } } else { lappend newD "[format $valueFormat $radius]d" } } else { lappend newD [format $valueFormat $radius] } } else { set width [lindex $descr 2] set height [lindex $descr 3] set rot [lindex $descr 4] if { $sizUnits=="degrees" } { foreach p [list $width $height] { if { [expr abs($p)]<1.0 } { set p [expr $p*60.0] if { [expr abs($p)]<1.0 } { set p [expr $p*60.0] lappend newD "[format $valueFormat $p]\"" } else { lappend newD "[format $valueFormat $p]'" } } else { lappend newD "[format $valueFormat $p]d" } } } else { lappend newD [format $valueFormat $width] \ [format $valueFormat $height] } lappend newD [format $valueFormat $rot] } } set descr $newD return [list $sign $shape $descr] } itcl::body RegionList::parseSize { size } { set lastChar [string index $size end] if { [string first $lastChar {drpi'"}]!=-1 } { # in [num]x format set size [string range $size 0 end-1] set foundUnits "degrees" if { $lastChar=="d" } { set val $size } elseif { $lastChar=="r" } { set val [expr $size * 180.0 / 3.1415926535] } elseif { $lastChar=="'" } { set val [expr $size / 60.0 ] } elseif { $lastChar=="\"" } { set val [expr $size / 3600.0 ] } else { set val $size set foundUnits "pixels" } } else { # Use default set val $size set foundUnits "unknown" } return [list $val $foundUnits] } itcl::body RegionList::parsePosition { xPos yPos } { foreach axis [list x y] { set pos [subst \$${axis}Pos] ##### # Strip off and record the sign of the position ##### set sign 1.0 if { [string index $pos 0] == "-" } { set sign -1.0 set pos [string range $pos 1 end] } ##### # Parse position ##### set lastChar [string index $pos end] if { [string first : $pos]!=-1 || $lastChar=="s" } { set parts [split [string trimright $pos s] {dhms:}] if { [llength $parts]!=3 } { error "Bad format for position: $pos" } foreach [list d m s] $parts {} set d [string trimleft $d 0]; if { $d=="" } { set d 0 } set m [string trimleft $m 0]; if { $m=="" } { set m 0 } set s [string trimleft $s 0]; if { $s=="" } { set s 0 } set val [expr $d + $m/60.0 + $s/3600.0] if { $axis=="x" } { # RA needs to be scaled to proper degrees set val [expr $val * 15.0] } set foundUnits "degrees" } elseif { [string first $lastChar "drpi"]!=-1 } { # in [num]x format set pos [string range $pos 0 end-1] if { $lastChar=="d" } { set val $pos set foundUnits "degrees" } elseif { $lastChar=="r" } { set val [expr $pos * 180.0 / 3.1415926535] set foundUnits "degrees" } else { set val $pos set foundUnits "pixels" } } else { # Use default set val $pos set foundUnits "unknown" } set ${axis}Val [expr $sign * $val] set ${axis}Unt $foundUnits } if { $xUnt != $yUnt } { error "Size arguments have mixed formatting: $xPos $yPos" } return [list $xVal $yVal $xUnt] } proc removeElements { mainList removeList } { foreach l $removeList { set idx [lsearch $mainList $l] if { $idx!=-1 } { set mainList [lreplace $mainList $idx $idx] } } return $mainList } fv5.4/tcltk/pow/Regions.html0000644000220700001010000002040710403643727015437 0ustar birbylheadev Pow Region Manipulation

      Pow Region Manipulation

      Overview

      POW provides the user with the ability to create and edit standard region files through the Region File menu item under POW's
      Tools menu. The Region File dialog window consists of a list of regions available for manipulation; a set of buttons and an entry box which are used to modify the currently selected region; and, at the bottom, buttons which open/save regions in a file and delete all the regions. Region types supported are Box, Circle, Ellipse, Polygon, Line, and Point.

      Creating Regions

      When the region dialog box is open, a new region can be created by placing the mouse at the desired location in the graph and click-and-drag with the left mouse button down (Command-Click on Mac OS). The shape of the region created is determined by the current shape button in the dialog box. For Circles, and Ellipses, the initial mouse location will be the center of the region and the final location its radius or width and/or height, as appropriate. For Boxes, the mouse movement traces out opposite corners of the rectangle. For Polygons and Lines, the mouse movement locations define the start and end of a line segment. To add extra segments to the Polygon, let up on the mouse button then press it again, without moving, then drag out the next side of the polygon, repeating as necessary. For a Point shape, the final mouse position defines its location. When the mouse button is released, the new region is appended to the list of available regions and made the current region.

      Current Region and Manipulation

      The current region is the one highlighted in the dialog's list of regions and "tagged" on the graph (see below). Upon selection (clicking the left mouse button on a region in the list or on the graph itself) or creation, the definition of the current region is placed in the current region portion of the dialog box.

      A region consists of 3 parts: a sign indicating whether it defines a region to be added (source) or subtracted (background) from the data (these are indicated on the graph with blue or red region outlines, respectively); a shape; and the parameters defining its location, size, and possible rotation. The sign and shape of the current region are represented by a pair of buttons. The sign button toggles between "+" and "-" and the shape button brings up a popup menu of the 6 available shapes to choose from. The region parameters are placed in a final text entry box and can be modified by hand. When changing shapes, POW does its best to translate the current parameters into appropriate values and format for the new shape. For example, in going from a circle to polygon, the parameters change from a circle's (X,Y,R) format to a list of points tracing out the circle's outline. Changing the current region information in the dialog box does not actually affect the current region until the Apply button is pressed. Prior to pressing Apply, the region information can be restored by reselecting the current region. (Note: the values initially placed in the entry box are rounded off after 6 significant digits, so pressing Apply may result in minor changes in the shape's size and location even though the values were not modified.)

      Although the sign and shape of a region can only be modified via the dialog box, the location, size, and rotation of regions can be changed either in the dialog box (yuck!) or through direct manipulation of the region on the graph with the mouse. The current region is "tagged" with 2 types of handles: a rotation handle (green triangle) and one or more resize handles (green squares). Circles, Polygons, and Lines cannot be rotated, so they have only one or more (as appropriate) resize handles. Boxes and Ellipses have one of each type, but Points have neither. A shape is rotated or resized (for Polygons and Lines, it is more a matter of repositioning points) by clicking the relevant handle with the left mouse button and dragging it to a new location. When the mouse cursor is over one of the handles, the cursor changes to a double-arrow, indicating that point can be dragged. When the mouse button is released the dialog's list of regions and current region information are updated with the new information. On the polygon, to drag a vertex, use Shife-Left Mouse button to drag the intended vertex to new location.

      To move a region, simply click the left mouse button inside the region and drag it to the new location. Because clicking on a region makes it the current region, moving a region can be performed on any region, not just the current one. When inside a region, the cursor changes to a 4-sided arrow and the region's outline thickens. The current region can also be moved via the keyboard. When the POW window is in the foreground, shift-arrow will move the current shape one screen pixel in the arrow's direction. Control-arrow moves the shape 10 pixels.

      Polygons can be modified in two additional ways. Points can be deleted by dragging a point onto one of its adjacent points. A point can also be inserted by clicking and dragging one of the handles with the left mouse button (Command-Click on Mac OS). This inserts the new point before the one clicked. If this is incorrect, immediately drag the new point back onto the first to delete it (no need to release the mouse button) and then click and drag on the next point. Vertex can be dragged by click and drag with right mouse button.

      The Delete button in the Region dialog deletes the current region, and the next region in the list (or previous region if deleting the last region) becomes the current region. All the regions can be deleted with the Clear All button.

      Coordinate Systems

      Region parameters can be displayed in one of several formats selectable by a popup menu just below the list of regions in the Region dialog. The first is Image format wherein positions and size parameters are reported in the pixel coordinates of the image. If the image has a linear scaling, the Linear format will report coordinates in this scaled coordinate system instead of pixels. If WCS information is available for the graph, region parameters can be displayed in celestial coordinates as degrees. The formats FK4, FK5, Galactic, Ecliptic, and ICRS each report region positions and sizes as degrees, but POW currently does not convert between these formats; the user must specify the appropriate system which will then be written to the region file when saved. Finally, the Degrees format signifies a mixed style used by SAOtng wherein positions are in degrees, but sizes are in pixels.

      The final 2 elements of the popup menu select the formatting to use when displaying degree values. Decimal Degrees format shows values as ordinary decimals with RA ranging over 0-360 and Declination over -90 to +90. HHMMSS Degrees instead displays decimals in hour:minute:second format.

      Statistics Calculation

      3 entries indicate the statistics of a region selected (or combine of regions). The statistics include number of pixel enclosed, total flux and mean flux in the region(s).

      For statistic of 2 or more regions on the image, number of pixels is determined by several factors, such as if a region intersects with one another, the sign of region (+: include, -: exclude). Pow calls CFITSIO routine and pass the region(s) descriptions to determine if a given pixel is part of the ROI (region of interests). And if so, that pixel's value is been recorded to be part of calculation of total flux and mean flux of the ROI.

      Saving/Opening Region Files

      At the bottom of the Region dialog are a pair of Open and Save buttons which will read and write region files in the standard format, compatible with SAOtng. If regions already exist when opening a region file, the user will have the option of deleting the old regions or appending the new ones to the list. When saving regions, the parameters will be written in the coordinate system currently selected in the Region dialog.

      fv5.4/tcltk/pow/Release_Notes0000644000220700001010000000210607201570205015602 0ustar birbylheadev November 9, 2000: Release of POW (as part of fv3.0) * Scripting: added delete, remove, graph, contour, remote, wcs, init, cursor, and "colormap add"; expanded curve command to allow setting default parameters for curves not yet plotted/created. * Printing: fixed printing of line plots in color; image printing on Windows and Mac OS fixed with upgrade to tcl/tk 8.3.2; background no longer printed (was printed as white) and UI elements no longer obscure graph contents. * Tools: Added Ruler, Probe, and Profile tools... Ruler: Measures the distance between to points on a graph Probe: Calculates flux and centroid values for a region of an image Profile: Extracts an image cross-section and plots its intensity. * Redesigned region file handling to support new DS9 formats. * Make use of WCS transform matrices. * Added user-selectable default graph size and made this argument optional for powCreateGraph function. * Tick labels on graphs with celestial coordinates adjust their precision according to current range. fv5.4/tcltk/pow/Ruler.html0000644000220700001010000000134310072774337015124 0ustar birbylheadev Measure the distance

      Measure the distance

      User can use this simple tool to measure the distance between two points in pixels or angle. When the measure dialog box is open, POW is in the "Ruler" mode. The user can place the mouse at the first point and click-and-drag to the second point with the right mouse button down. When the mouse button is released, the measured values will be shown on the dialog box. The user can also change the position of either end or move the whole ruler by click-and-drag the middle mouse with the left mouse. When the dialog box is closed, pow will return to the normal mode. fv5.4/tcltk/pow/Scripting.html0000644000220700001010000006031410227017355015770 0ustar birbylheadev POW Scripting

      POW Scripting Guide

      Because fv and POW are written in Tcl, they are inherently scriptable. So long as one knows the necessary data structures and function calls, everything POW does can be controlled by a user-created Tcl script running inside of POW. This, however, is a formidable task. Plus, POW's internal behavior and data are subject to change with each new release.

      To make scripting possible, then, a simplified (and hence limited) script interface has been added to POW. It consists of a small set of commands which perform the basic operations of creating and modifying graphs. Future versions should contain more capabilities.


      Operational Summary


      There are several ways to access POW's scripting commands. The simplest is to write a Tcl script which uses the commands directly and then execute it within POW's powCmds namespace. As POW has no file capabilities nor command console of its own, this currently can be done only if implemented within an application containing POW, such as fv. (See fv's Scripting Guide for details on executing POW commands within fv.) This scripting method is useful for implementing macros which can perform certain common operations at the user's request, such as setting specific graph options.

      Alternatively, POW can be scripted by other programs, allowing those programs to make use of POW's capabilities remotely. These programs, however, do not need to be written in Tcl so long as they can communicate with POW. Currently POW supports XPA on unix platforms and AppleScript on MacOS for communication:

      The XPA messaging system (http://hea-www.harvard.edu/RD/xpa/) developed by the SAO/HEAD R&D group implements a method of communicating between two programs running on unix platforms. Communication occurs either through standalone programs (ie, xpaget and xpaset), a C subroutine library, or a Tcl extension. POW uses the Tcl extension to make its scripting commands available, but the calling program can use any of the XPA methods to access the commands. The XPA software is not distributed with POW or fv and must be obtained and built by the user.

      AppleScript (http://www.apple.com/applescript), the English-like language on all Macintosh computers (circa MacOS 7.5 and up), can also be used to control POW remotely. (Actually, any program on the Mac can control POW through the use of Apple Events.) Using the do script command, Tcl code can be passed to POW. Due to how Tcl's do script command and POW's scripting commands are implemented, POW commands must be prefixed with the powCmds:: namespace specifier.

      POW's scripting capabilities closely mimic the interface described in POW's Developer's Guide. In general, one first creates a data object from which either a curve or image is produced. One then creates a graph onto which a series of curves and/or images is placed. The graph size, position, and viewing region can then be modified as needed. Once plotted in a graph, curves and images can be displayed using different point shapes, line styles, or colormaps. In most cases, commands operate on the currently selected object (as appropriate).

      Many scripting commands also can be used as inquiries. Inquiries and commands are implemented using the same syntax, differing only in that commands supply the necessary parameters to perform an action, whereas inquiries leave them off indicating POW should return the current settings. When used with XPA, inquiries must use the xpaget tool and commands the xpaset tool.


      Command Summary


      add curve|image objName
      Add a curve or image to the current graph.
      array channel dataName bitpix ?byteOrder?
      Imports data into POW from a TCL channel. When run using XPA, channel is dropped and the data is read form stdin. bitpix indicates the data format of the binary data (eg., 8, -32, INT, DOUBLE, etc) and byteOrder indicates whether the data is stored in bigEndian or littleEndian format. The default value of byteOrder is whichever is native for the platform. FITS and IEEE are synonyms for bigEndian. If bitpix has the string value LIST, the data is read treated as an ASCII stream with double values. If dataName has a singular element, all values in the table are placed into a single data object with the supplied name. If dataName is instead a list, the stream will be considered as a columnar table with each column going into a corresponding data element of dataName.
      axes xscale ?yscale?
      Sets axes as log or linear. If only one value applied it will be applied to both axes.
      bounds xLft yBtm xRgt yTop ?wcs|pixel?
      Set the bounding box of the current graph in either wcs (default) or pixel coordinates.
      bounds reset
      Reset the current graph's bounding box to its default values.
      bounds zoom xMag ?yMag?
      Increase or decrease the bounding box by the given magnification factors.
      calculate newDataName expression
      Perform a calculation on existing data objects
      close
      Close/Exit POW
      colorbar create
      create a colorbar of the current graph
      colorbar delete
      delete a colorbar of the current graph
      colormap cmap
      Set the colormap of images in the current graph
      colormap add cmap R G B R G B ...
      Add a custom colormap named cmap. The RGB values are given in triplets of integer values ranging over 0 to 255. Any number of triplets can be provided and will be scaled to the number of colors available on screen.
      colormap invert Yes|No
      Invert colormap of images
      colormap scale ?mode? ?min max?
      Set the colormap scaling mode and range of images
      contour ?-res n? ?-image imgName? crvName level1 ?level2 ...?
      Create a contour map of the current (or imgName) image. The result is a single curve object named crvName outlining regions of the image with intensities level1 etc. If -image is used to specify the image, the image does not need to be plotted in the current (or any other) graph. The -res option gives the image resolution to use in calculating the contour (default is 1); the image will be smoothed over this number of pixels square. The curve contour will not be plotted automatically; use add curve crvName to add it to the current graph.
      create data dataName dataList
      Create a data object with the supplied values.
      Note: to avoid hitting the limit on the command line length, use piped stdout command:
      echo dataList | create data dataName
      create curve curveName xDataName ?xeDataName? yDataName ?yeDataName?
      Create an X/Y curve object with or without errors from the supplied data objects.
      create image imageName dataName width height
      Create an image object of given dimensions and data object.
      create graph graphName curveList imageList ?width height?
      Create a graph with the given curves and images. width and height give the screen size of the graph in pixels (default is set in the Preferences panel). Either of the lists can have a value of NULL if no objects of that type are being used.
      cursor
      Wait for the user to click on the current graph then return the graph coordinates and mouse button pressed: x y button. A keypress will also be captured and returned in the place of button as its negative ASCII value (ie, -65 for A).
      curve ?-name crvName? param value ?param value? ...
      Set curve options. The currently-selected curve will be used if the -name option isn't specified; otherwise set options for the indicated curve. The curve crvName does not have to exist prior to executing this command, so options can be set before a curve is created and drawn. If crvName is "default", the value will apply to all curves not yet plotted. The available parameters and value types are:
             pDisp     -->  boolean  -->  Display Points?
             pShape    -->  string   -->  Point shape (Cross, Diamond, Box,
                                             Octagon, Triangle, "Inv. Triangle")
             pSizeErr  -->  boolean  -->  Draw point the size of errorbars?
             pSize     -->  integer  -->  Size of point
             pFill     -->  boolean  -->  Fill in point, if an outline
             pColor    -->  color    -->  Color of points (any color name
                                             or #RRGGBB value)
         	       	             	  
             lDisp     -->  boolean  -->  Display line?
             lStyle    -->  dash     -->  Dash style of line (" " is solid, 
                                             "20" is 20-pixel dashes,
                                             "15 10 4 10" is Dash-dot, etc)
             lWidth    -->  integer  -->  Width of line
             lStep     -->  boolean  -->  Draw line as histogram?
             lBoxFill  -->  boolean  -->  Fill histogram boxes?
             lColor    -->  color    -->  Color of line (any color name
                                             or #RRGGBB value)
      
      delete ?-propogate? graph|image|curve|data objName
      Delete an object from POW, freeing any memory it occupied. Deleted curves and images will be removed from all graphs in which they are displayed. With the -propogate option, the contents of the object are also deleted, meaning all the curves and images in a graph, and the original data within an image or curve. Data which is still being used by a curve or image object, however, will not be deleted.
      graph ?-name graphName? param value ?param value? ...
      Set graph options. The currently-selected graph will be used if the -name option isn't specified; otherwise set options for the indicated graph. The graph graphName does not have to exist prior to executing this command, so options can be set before a graph is created and drawn. If graphName is "default", the value will apply to all future graphs. The available parameters and value types are:
             bgcolor         -->  color     -->  Color behind graph (any color
                                                    name or #RRGGBB value)
             xmargin         -->  integer   -->  Intergraph spacing; affects
             ymargin         -->  integer   -->     placement of new graphs
             xdimdisp        -->  integer   -->  Screen dimensions of graph;
             ydimdisp        -->  integer   -->     affects size of new graphs
             FixedAspect     -->  boolean   -->  Force identical horizontal
                                                    and vertical scales for graph
                                                    (defaults to yes if any
                                                     images present)
      
             xlabel          -->  string    -->  Label for X axis
             ylabel          -->  string    -->  Label for Y axis
             xunits          -->  string    -->  Optional unit value for X axis
             yunits          -->  string    -->  Optional unit value for Y axis
             titleString     -->  string    -->  Title for graph
             titlePosition   -->  direction -->  Position around graph to place
                                                    title... value is a string
                                                    containing the letters n, e,
                                                    w, s (for north, east, etc)
             titleAnchor     -->  direction -->  Position in title to place at
                                                    the titlePosition... value is
                                                    a string containing n, e, w, s.
      
             xNumTicks       -->  integer   -->  Scaling parameter for number of
             yNumTicks       -->  integer   -->     tick marks on each axis
                                                    (default, 3; not 1-to-1)
             xTickScal       -->  string    -->  Scaling of tick marks along
             yTickScal       -->  string    -->     each axis: "linear" or "log".
                                                    Graphs with WCS information
                                                    ignore this and use ra/dec.
             xTickLength     -->  list      -->  Length of tick marks for each
             yTickLength     -->  list      -->     axis on each side of graph.
                                                    Order is [lft rgt top bot]
                                                    (default: "10 10 10 10")
             xLabelTicks     -->  list      -->  Boolean indicating whether ticks
             yLabelTicks     -->  list      -->     should be labels for each
                                                    axis on each side of graph.
                                                    Order is [lft rgt top bot]
                                                    (default: "Yes No No Yes")
             tickLabels      -->  string    -->  Format for labeling ticks on
                                                    graphs with WCS information:
                                                    "degrees" or "decimal"
             tickFormatCmdX  -->  string    -->  Tcl command used in formatting
             tickFormatCmdY  -->  string    -->     tick values into labels
                                                    (default: "format %.6lg")
      
             GridLines       -->  boolean   -->  Draw grid lines?
             GridColor       -->  color     -->  Grid color (any color name
                                                    or #RRGGBB value)
             GridDash        -->  dash      -->  Grid dash pattern
                                                    (" " is solid, "20" is
                                                    20-pixel dashes, "15 10 4 10"
                                                    is Dash-dot, etc)
      
      helpPage ?file?
      Open and display help file in html format. Two ways to do this:
              1. xpaset -p pow helpPage file 
                      - if file is not a full path file name, then it is assumed to be one
                        of the installed POW help file.
                      - else, user needs to supply the full path name to the file.
              2. cat file | xpaset pow helpPage
      
      init ?nColors? ?cMode?
      Open and initialize pow's graphing window. If the window is already open, this does nothing.
      print ?-file filename? ?-landscape? ?-stretch? ?-multipage?
      Send all images on POW canvas to printer. Save all images if -file is supplied.
              -file        : result file name. The extension of file name should indicates valid saved format
                             (i.e. filename.jpg).  Current valid formats are bmp, jpg, ps, ppm, png, pnm, and tiff.
              -landscape   : print/save result in landscape mode (default is portrait). 
              -stretch     : stretch the image to fit the page (default is no).
              -multipage   : one image per page (default is print/save on the same page/file)
      
              Note: The image needs to be displayed in POW in order to print or save.
      position ?offset? x y
      Moves current graph around the canvas. When offset is present, x and y are relative offsets from the current position.
      refresh
      Redraws current graph
      regionName region file name
      Set output region name, should be used after Region Edit Panel is opened.
      regionTool ?-open? ?-close? ?-wait?
      Open the Region Edit Panel on POW.
                -open  : open the region edit panel
                -close : close the region edit panel
                -wait  : wait for region edit panel to close. Return save means data has been saved.
                                                              Return unsave means otherwise
      
      regions
      Open Region Edit Panel (if not opened already), displays input Region of Interest (ROI) on POW image and update entry in the Region Edit Panel.
              example of usage: 
                 cat file | xpaset pow regions
      
      remote ?clientXPA?
      Set the XPA access point of a client POW session to which all subsequent commands should be sent. Send an empty clientXPA to have commands executed locally. If the environment variable POW_LIBRARY is defined, its value will be used for clientXPA.
      remove ?-name graphName? curve|image objName
      Remove an object from the current graph or graphName.
      scope width ?height?
      Sets scope window size. If only one value is given, the scope window will be a square.
      select curve|image|graph objName
      Select a curve/image/graph for manipulation
      size width height
      Set graph size
      size stretch ?to? xMag ?yMag?
      Stretch graph size by the given magnification either relative to current magnification or an absolute magnification.
      tcl
      Execute tcl code read from stdin (XPA support only).
      version
      Return POW version number
      xrangeName file name
      Set output file name to save x axis ranges, should be used after X axis Range Edit Panel is opened.
      xrangeTool ?-open? ?-close? ?-wait?
      Open the X axis Range Edit Panel on POW.
                -open  : open the x axis range edit panel
                -close : close the x axis range edit panel
                -wait  : wait for x axis range edit panel to close. Return save means data has been saved.
                                                                    Return unsave means otherwise
      
      xranges
      Open X axis Range Edit Panel (if not opened already), displays input X axis Ranges of Interest (XROI) on POW image and update entry in the X axis Range Edit Panel.
              example of usage: 
                 cat file | xpaset pow xranges 
      
      wcs objName wcsData
      Set (or get) WCS information for the given object (can be a curve or image). The wcsData is a list of the form of either
      • xrval yrval xrpix yrpix xinc yinc rot ctype ?swap?
      • refVals refPix matrix types projections
      If WCS information has not already been provided for objName the "get" version of this command will return an empty string. (See fitsTcl documention for more information.)

      Examples


      The following commands will create a graph in pow and plot 2 curves in it.

        create data d1 1 2 3 4 5 6 5 4 3 2 1     # Create data object d1
        create data d2 1 4 9 16 20 16 9 4 2 1 1  # Create data object d2
        create curve c1 d1 d2                    # Create curve of d1 vs d2
        create graph g1 c1 NULL                  # Draw graph containing curve
        size 200 150                             # Resize graph to 200x150
        calculate d3 'd1*2'                      # Calculate new data object
        create curve c2 d3 d2                    # Create curve of d3 vs d2
        add curve c2                             # Add curve to graph
        bounds reset                             # Reset bounding box
        select curve c1                          # Select first curve
        curve pFill Yes pColor Blue lDisp No     # Set display options
        select curve c2                          # Select second curve
        curve pDisp No lColor Red lStyle 20      # Set display options
      

      Using XPA from a Unix shell, one would execute the above commands by doing the following:

        xpaset -p pow create data d1 1 2 3 4 5 6 5 4 3 2 1
        xpaset -p pow create data d2 1 4 9 16 20 16 9 4 2 1 1
        xpaset -p pow create curve c1 d1 d2
        xpaset -p pow create graph g1 c1 NULL
        xpaset -p pow size 200 150
        xpaset -p pow calculate d3 d1*2
        xpaset -p pow create curve c2 d3 d2
        xpaset -p pow add curve c2
        xpaset -p pow bounds reset
        xpaset -p pow select curve c1
        xpaset -p pow curve pFill Yes pColor Blue lDisp No
        xpaset -p pow select curve c2
        xpaset -p pow curve pDisp No lColor Red lStyle 20
      
      The -p option tells xpaset to not read any data from stdin. One can instead use stdin to send a series of Tcl commands en masse by putting all the POW commands into a text file and pass them to POW, using the command...
        cat commands.txt | xpaset pow tcl
      
      This second method allows one to insert real TCL commands (providing access to the entire POW API) into the command sequence, whereas the individual xpaget/xpaset calls are restricted to the specific scripting commands.

      Alternatively, if using AppleScript, the commands are...

        tell application "fv"
          activate
          -- Because POW is available only as part of POW on Macs, the following
          -- line is needed to open POW's window, if it doesn't already exist
          do script "if { ![winfo exist .pow.pow] } { powInit .dummy }"
          do script "powCmds::create data d1 1 2 3 4 5 6 5 4 3 2 1"
          do script "powCmds::create data d2 1 4 9 16 20 16 9 4 2 1 1"
          do script "powCmds::create curve c1 d1 d2"
          do script "powCmds::create graph g1 c1 NULL"
          do script "powCmds::size 200 150"
          do script "powCmds::calculate d3 d1*2"
          do script "powCmds::create curve c2 d3 d2"
          do script "powCmds::add curve c2"
          do script "powCmds::bounds reset"
          do script "powCmds::select curve c1"
          do script "powCmds::curve pFill Yes pColor Blue lDisp No"
          do script "powCmds::select curve c2"
          do script "powCmds::curve pDisp No lColor Red lStyle 20"
        end tell
      
      Note that AppleScript will actually start fv if it isn't already running.

      Now that the graph is created, one can make inquiries with the following commands using XPA...

        xpaget pow bounds         # Get the bounding box of current graph
        xpaget pow select graph   # Get name of the currently selected graph
        xpaget pow position       # Get position of the graph
        xpaget pow curve          # Get display options of current curve
        xpaget pow version        # Get pow version number
      
      ... or, using AppleScript...
        set x to (do script "powCmds::bounds")
        set x to (do script "powCmds::select graph")
        set x to (do script "powCmds::position")
        set x to (do script "powCmds::curve")
        set x to (do script "powCmds::version")
      
      ... or, using an as-yet-missing interactive console...
        bounds
        select graph
        position
        curve
        version
      

      Additional examples of scripting can be found in the sample_scripts directory within the fv distribution.

      fv5.4/tcltk/pow/Shape.tcl0000644000220700001010000011262511130706071014701 0ustar birbylheadev######################################################################## # # class: Shape # # purpose: Draw a geometric shape on the canvas and allow the user # to drag or reshape it. # # usage: To create a shape on a canvas: # gShape canvas # To set its options use "setShape", "setCoords", "setColor", # and "setRotation", or the convience method "setFullShape". # # To have the shape use additional tags to which you can bind, # use "addTags". # # Messages will be passed to the shape's owner (via a callback) # when the shape changes. Become the shape's owner with the # "setOwner" method. Messages currently passed are: # shapeIsBeingModified (when user changes shape/coord/rot) # shapeHasChanged (when a series of changes ends) # shapeIsSelected (when a shape becomes selected) # ######################################################################## itcl::class Shape { constructor { canvas } {} destructor {} public { method draw {} method select {} method deselect {} method clippedPolygon {} method beginModification { {x 0} {y 0} } method finishModification {} method setClip { x1 y1 x2 y2 } method setScale { mx my } method setFullShape { shp crds rot} method setCoords { coords } method setShape { shape } method setRotation { rot } method setColor { clr } { set itsColor $clr } method setBoundaryClr { clr } { set itsBoundaryColor $clr } method setHandleClr { clr } { set itsHandleColor $clr } method setLineW { width } { set itsLineWidth $width } method getTag {} { return $itsTag } method getCanvas {} { return $itsCanvas } method getColor {} { return $itsColor } method getBoundaryClr {} { return $itsBoundaryColor } method getHandleClr {} { return $itsHandleColor } method getLineW {} { return $itsLineWidth } method setOwner { owner } { set itsOwner $owner } method getItsOwner {} { return $itsOwner } method getShape { } { return $itsShape } method getCoords { } { return $itsParams } method getRotation { } { return $itsRotation } method setStatic { axis } { if { $axis != "" } { set ${axis}StaticFlag "true" } } method addBoundaryLine { coords } method setDrawDeleteFlag { flag } { set drawDeleteRegionFlag $flag } method insertPt { index } method adjustPt { index x y } method rotatePt { x y } method shift { dx dy } method drag { x y } method setStartPoint { x y } method getPolygon { } method drawHandles { } method addTags { tags } method removeTags { tags } method notifyOwner { args } method enterLeaveShape { mode } } protected { variable itsParams {} variable itsRotation 0.0 variable itsShape "Circle" variable itsCanvas variable bumpDetect "false" variable drawDeleteRegionFlag "false" variable reverseFlag "false" variable xScale 1.0 variable yScale 1.0 variable itsBoundTag "" variable itsTag "" variable allTags "" variable itsOwner "" variable itsColor "black" variable itsBoundaryColor "red" variable itsHandleColor "green" variable itsLineWidth 1.0 variable itsIds {} variable isSelected 0 variable isBeingModified 0 variable itsRotationOffset variable clipRect {} variable ignoreClip 0 variable startX 0.0 variable startY 0.0 variable tmpIds {} variable yStaticFlag "false" method CircleToPoly { x0 y0 dx dy } method EllipseToPoly { x0 y0 dx dy angle } method BoxToPoly { x0 y0 dx dy angle } method PolyToPoly { descr } method PointToPoly { x0 y0 } } private { variable tmpAdjustPoint -1 method checkPolygonPoint { index } } } ######################################################################## # # gShape canvas # ######################################################################## proc gShape { args } { return [uplevel #0 Shape #auto $args] } ######################################################################## # # # ######################################################################## itcl::body Shape::constructor { canvas } { set itsCanvas $canvas set itsTag shp[namespace tail $this] $itsCanvas bind "$itsTag && DragAble" \ [itcl::code $this enterLeaveShape Enter] $itsCanvas bind "$itsTag && DragAble" \ [itcl::code $this enterLeaveShape Leave] $itsCanvas bind rgnHandle$itsTag \ "$itsCanvas configure -cursor sizing" $itsCanvas bind rgnHandle$itsTag \ "$itsCanvas configure -cursor \$powcursor" powBindBtn <> "$itsCanvas bind \"$itsTag && DragAble\"" \ [itcl::code $this beginModification %x %y] \ [itcl::code $this drag %x %y] \ [itcl::code $this finishModification] set allTags [list $itsTag shape DragAble] } itcl::body Shape::enterLeaveShape { mode } { global powLutButton powROIButton insideExistGraph if { $isBeingModified } return if { $mode=="Enter" } { set insideExistGraph true for { set i 0 } {$i < [llength $itsIds]} {incr i} { set currId [lindex $itsIds $i] set width [$itsCanvas itemcget $currId -width] if { $width == 1.0 } { $itsCanvas itemconfig $currId -width 1.9 } else { $itsCanvas itemconfig $currId -width $width } } $itsCanvas configure -cursor fleur event delete <> event delete <> set shape [getShape] if { $shape == "Polygon" } { event add <> } else { event add <> } event add <> event add <> event add <> event add <> } else { set insideExistGraph false for { set i 0 } {$i < [llength $itsIds]} {incr i} { set currId [lindex $itsIds $i] set width [$itsCanvas itemcget $currId -width] if { $width == 1.9 } { $itsCanvas itemconfig $currId -width 1.0 } else { set width [$itsCanvas itemcget $currId -width] } } if { $yStaticFlag == "true" } { set drawDeleteRegionFlag false } $itsCanvas configure -cursor $::powcursor event add <> event add <> # event delete <> # event delete <> # event delete <> event delete <> event add <> event add <> event add <> event add <> } } itcl::body Shape::destructor {} { if { [winfo exists $itsCanvas] } { if { [llength $itsIds] } { $itsCanvas delete $itsTag $itsCanvas delete boundary1$itsTag $itsCanvas delete boundary2$itsTag } if { $isSelected } { $itsCanvas delete rgnHandle$itsTag } } notifyOwner shapeHasDied } itcl::body Shape::notifyOwner { args } { if { $itsOwner!="" } { eval $itsOwner $this $args } } itcl::body Shape::clippedPolygon { } { set coords [getPolygon] if { ![llength $coords] } { return "" } if { $ignoreClip || ![llength $clipRect] } { return [list $coords] } # Find bounding box of polygon set xMin [lindex $coords 0] set yMin [lindex $coords 1] set xMax $xMin set yMax $yMin foreach [list x y] [lrange $coords 2 end] { if { $x < $xMin } { set xMin $x } elseif { $x > $xMax } { set xMax $x } if { $y < $yMin } { set yMin $y } elseif { $y > $yMax } { set yMax $y } } # Is polygon clipped by clipRect? foreach [list x1 y1 x2 y2] $clipRect {} if { $xMin > $x2 || $xMax < $x1 || $yMin > $y2 || $yMax < $y1 } { # poly is fully outside rectangle so is fully clipped return "" } elseif { $xMin >= $x1 && $xMax <= $x2 && $yMin >= $y1 && $yMax <= $y2 } { # poly is fully inside rectangle so no need to clip return [list $coords] } else { # poly overlaps rectangle bounds, so needs to be clipped set clipPoly [list $x1 $y1 $x1 $y2 $x2 $y2 $x2 $y1 $x1 $y1] return [powClipPolys $coords $clipPoly] } } itcl::body Shape::draw {} { global staticY regionParam set coords [clippedPolygon] if { $coords=="" } { catch { $itsCanvas delete boundary1$itsTag } err catch { $itsCanvas delete boundary2$itsTag } err $itsCanvas delete $itsTag set itsIds {} return } set newIds {} for { set i 0 } { $i < [llength $coords] } { incr i } { set coord [lindex $coords $i] set id [lindex $itsIds $i] if { $yStaticFlag == "true" } { incr i 3 set coord [lreplace $coord 1 1 $staticY] set coord [lreplace $coord 3 3 $staticY] if { [llength $coord] > 4 } { set coord [lreplace $coord 4 4 [lindex $coord 0]] set coord [lreplace $coord 5 5 $staticY] } } if { $id == "" || [$itsCanvas find withtag $id]=="" } { if { $yStaticFlag == "true" } { lappend newIds [eval $itsCanvas create line \ $coord -fill $itsColor -width $itsLineWidth \ -joinstyle miter -tags \$allTags] } else { lappend newIds [eval $itsCanvas create polygon \ $coord -outline $itsColor -fill {{}} -width $itsLineWidth \ -tags \$allTags] } } else { set width [$itsCanvas itemcget $id -width] eval $itsCanvas coords $id $coord catch { $itsCanvas itemconfigure $id -outline $itsColor } lappend newIds $id } } while { $i<[llength $itsIds] } { set id [lindex $itsIds $i] catch { $itsCanvas itemconfig $id -outline {} } lappend tmpIds $id incr i } set itsIds $newIds } itcl::body Shape::addTags { tags } { foreach t $tags { if { [lsearch $allTags $t]==-1 } { lappend allTags $t if { [llength $itsIds] } { $itsCanvas addtag $t withtag $itsTag } } } } itcl::body Shape::removeTags { tags } { foreach t $tags { set idx [lsearch $allTags $t] if { $idx != -1 } { set allTags [lreplace $allTags $idx $idx] if { [llength $itsIds] } { $itsCanvas dtag $itsTag $t } } } } itcl::body Shape::deselect {} { $itsCanvas delete rgnHandle$itsTag set isSelected 0 } itcl::body Shape::select {} { global currentRegionObj global currentSelectXRange global regionParam global propertyOrder drawHandles $itsCanvas raise $itsTag $itsCanvas raise rgnHandle$itsTag if { ! $isSelected } { set isSelected 1 notifyOwner shapeIsSelected if { [$currentRegionObj getOwner] == "powRegionOwner" } { powRegionResetPanelColor [getColor] [getHandleClr] } } else { if { [$currentRegionObj getOwner] == "powXRangeOwner" } { if {[info exists currentSelectXRange] && \ [getShape] != "Point" && $currentSelectXRange == [powGetCurrXRange] } { powXRangeResetPanelColor [getColor] [getHandleClr] [getBoundaryClr] [getLineW] unset currentSelectXRange } } else { } } if { [$currentRegionObj getOwner] == "powRegionOwner" } { set rgnIdx [$regionParam(rgns) selected] if { $rgnIdx >= 0 } { set rgn [$regionParam(rgns) rgnAtIndex $rgnIdx] set propertyOrder "Source" catch { set propertyOrder [$rgn getPropertyOrder] } } else { set propertyOrder "UNDEFINED" } if { $propertyOrder == "Background" } { $itsCanvas itemconfigure $itsIds -dash - } else { $itsCanvas itemconfigure $itsIds -dash {} } } } itcl::body Shape::drawHandles { } { global staticY handleColor global powRotation currimg readRegionFile $itsCanvas delete rgnHandle$itsTag set coords [getCoords] set shape [getShape] set rot [getRotation] if { $shape == "Point" } return if { $shape=="Polygon" || $shape == "Line" } { if { [info exists currimg] && [info exists powRotation($currimg)] } { if { ([info exists readRegionFile] && $readRegionFile == "true") || \ ([info exists itsRotationOffset] && $itsRotationOffset == "on") } { set itsRotationOffset "on" } else { set rot [expr $rot - $powRotation($currimg)] } } } if { $shape=="Line" || $shape=="Polygon" } { set start 0 set end [expr [llength $coords]-1] } else { set start 2 set end 3 } set x0 [lindex $coords 0] set y0 [lindex $coords 1] if { !$ignoreClip && [llength $clipRect] } { foreach [list bx1 by1 bx2 by2] $clipRect {} } else { foreach [list bx1 by1 bx2 by2] [list -32000 -32000 32000 32000] {} } # Create Move Point Handles if { $yStaticFlag == "true" } { set coords [lreplace $coords 1 1 $staticY] set coords [lreplace $coords 3 3 $staticY] if { [llength $coords] > 4 } { set coords [lreplace $coords 4 4 [lindex $coords 0]] set coords [lreplace $coords 5 5 $staticY] } setCoords $coords } set ptNum [expr $start/2] foreach {x y} [lrange $coords $start $end] { foreach {x y} [poly_rotate $x0 $y0 $rot [list $x $y] ] {} if { $x<$bx2 && $x>$bx1 && $y<$by2 && $y>$by1 } { set x1 [expr $x-2] set y1 [expr $y-2] set x2 [expr $x+2] set y2 [expr $y+2] set id [$itsCanvas create polygon $x1 $y1 $x1 $y2 $x2 $y2 $x2 $y1 \ -outline $itsHandleColor -fill {} \ -tags "rgnHandle$itsTag rgnMovePt rgnHandle"] powBindBtn <> "$itsCanvas bind $id" \ [itcl::code $this beginModification %x %y] \ [itcl::code $this adjustPt $ptNum %x %y] \ [itcl::code $this finishModification] powBindBtn <> "$itsCanvas bind $id" \ "[itcl::code $this beginModification %x %y]; [itcl::code $this insertPt $ptNum]" \ [itcl::code $this adjustPt $ptNum %x %y] \ [itcl::code $this finishModification] } incr ptNum } # Create Rotate Region Handle... only for Box and Ellipse if { $shape=="Box" || $shape=="Ellipse" } { set dx [expr [lindex $coords 2]-$x0] if { $shape=="Ellipse" } {set dx [expr 1.41421356*$dx]} set x [expr $x0+$dx] set y [lindex $coords 1] foreach {x y} [poly_rotate $x0 $y0 $rot [list $x $y] ] {} if { $x<$bx2 && $x>$bx1 && $y<$by2 && $y>$by1 } { set x1 [expr $x-2] set y1 [expr $y-2] set x2 [expr $x+2] set y2 [expr $y+2] set id [$itsCanvas create polygon $x1 $y2 $x2 $y2 $x $y1 \ -outline $itsHandleColor -fill {} \ -tags "rgnHandle$itsTag rgnRotate rgnHandle"] powBindBtn <> "$itsCanvas bind $id" \ [itcl::code $this beginModification %x %y] \ [itcl::code $this rotatePt %x %y] \ [itcl::code $this finishModification] } } if { $shape=="Polygon" } { event delete <> event add <> } else { event delete <> event add <> } } itcl::body Shape::setClip { x1 y1 x2 y2 } { if { $x1 > $x2 } { set tmp $x1 set x1 $x2 set x2 $tmp } if { $y1 > $y2 } { set tmp $y1 set y1 $y2 set y2 $tmp } set clipRect [list $x1 $y1 $x2 $y2] } itcl::body Shape::setScale { mx my } { set xScale $mx set yScale $my } itcl::body Shape::setShape { shape } { set itsShape $shape if { $isBeingModified } { notifyOwner shapeIsBeingModified } } itcl::body Shape::setRotation { rot } { set itsRotation $rot if { $isBeingModified } { notifyOwner shapeIsBeingModified } } itcl::body Shape::setCoords { coords } { global powDrawOriginalFlag set nelem [llength $coords] if { [expr $nelem%2] } { error "Shape coordinates must contain an even number of elements" } set itsParams $coords if { $isBeingModified } { # Pan, prevent infinit nesting via powDrawOriginalFlag if { ![info exists powDrawOriginalFlag] || $powDrawOriginalFlag != "true" } { notifyOwner shapeIsBeingModified } else { set powDrawOriginalFlag "false" } } } itcl::body Shape::setFullShape { shp crds rot } { setShape $shp setRotation $rot setCoords $crds } itcl::body Shape::insertPt { index } { # Can only insert points into a Polygon. Ignore all others if { [getShape] == "Polygon" } { set start [expr $index*2] set coords [getCoords] foreach {x y} [lrange $coords $start [expr $start+1] ] {} setCoords [linsert $coords $start $x $y] } } itcl::body Shape::adjustPt { index x y } { global xrangeList_onG staticY currentRegionObj bumpList bumpSelf splitList global powRotation currimg if { $bumpDetect == "true" && $drawDeleteRegionFlag == "false" } { return } set tmpAdjustPoint $index set origX [$itsCanvas canvasx $x] set origY [$itsCanvas canvasy $y] set start [expr $index*2] set end [expr $start+1] set coords [getCoords] set rot [getRotation] if { abs($rot)>1e-10 } { set x0 [lindex $coords 0] set y0 [lindex $coords 1] if { [getShape] =="Polygon" || [getShape] =="Line" } { if { [info exists currimg] && [info exists powRotation($currimg)] } { set rot [expr $rot - $powRotation($currimg)] } } foreach {x y} [poly_rotate $x0 $y0 \ [expr -$rot] [list $origX $origY]] {} } else { set x $origX set y $origY } switch [getShape] { "Point" { set coords [list $x $y $x $y] } "Box" { # Drawn/Sized to keep one corner fixed, so becomes complicated foreach {x0 y0 x2 y2} $coords {} set x1 [expr $x0-$x2+$x0] set y1 [expr $y0-$y2+$y0] if { abs($rot)>1e-10 } { foreach {x1 y1} [poly_rotate $x0 $y0 \ $rot [list $x1 $y1]] {} } set x0 [expr 0.5*($x1+$origX)] set y0 [expr 0.5*($y1+$origY)] if { abs($rot)>1e-10 } { foreach {x y} [poly_rotate $x0 $y0 \ [expr -$rot] [list $origX $origY]] {} } set coords [list $x0 $y0 $x $y] } "Circle" { # Need to set second point at 45 deg angle set x0 [lindex $coords 0] set y0 [lindex $coords 1] set dX [expr ($x0-$x)/$xScale] set dY [expr ($y0-$y)/$yScale] set dR [expr sqrt( 0.5*($dX*$dX + $dY*$dY) )] set x [expr $x0 + $dR*$xScale] set y [expr $y0 + $dR*$yScale] set coords [lreplace $coords 2 3 $x $y] } default { set coords [lreplace $coords $start $end $x $y] if { $yStaticFlag == "true" } { if { $start == 4 } { set coords [lreplace $coords 0 1 $x $y] } if { $start == 0 } { catch { set coords [lreplace $coords 4 5 $x $y] } } } } } set currMin [lindex $coords 0] set currMax [lindex $coords 2] set currDirection toRight if { $currMin > $currMax } { set currDirection toLeft set tmp $currMin set currMin $currMax set currMax $tmp } set bumpDetect false if { [info exists xrangeList_onG] && [$currentRegionObj getOwner] == "powXRangeOwner" } { set n 0 foreach checkRgnList $xrangeList_onG { set checkRgn [lindex $checkRgnList 1] set checkMin [lindex $checkRgn 0] set checkMax [lindex $checkRgn 2] set checkDirection toRight if { $checkMin > $checkMax } { set checkDirection toLeft set tmp $checkMin set checkMin $checkMax set checkMax $tmp } if { [llength $coords] <= 4 } { set coords [lappend coords [lindex $coords 0] [lindex $coords 1]] } if { $checkMin < $currMin && $checkMax > $currMax } { set bumpDetect true # even though we are using bumpSelf variable, the value is actually the one that is been bump into. set bumpSelf [list $n $checkRgn] set splitList $coords } elseif { $checkMin < $currMin && $checkMax > $currMin && $checkMax < $currMax } { # case 3: the new region is portion overlapping boundary of any previous region if { $drawDeleteRegionFlag == "true" } { set coords [lreplace $coords 2 2 $checkMax] set coords [lreplace $coords 5 5 $checkMax] set bumpSelf [list $n $checkRgn] set splitList $coords } else { if { $currDirection == "toRight" } { set coords [lreplace $coords 0 0 $checkMin] set coords [lreplace $coords 4 4 $checkMin] } else { set coords [lreplace $coords 2 2 $checkMin] set coords [lreplace $coords 5 5 $checkMin] } } lappend bumpList [lindex $checkRgnList 0] set bumpDetect true } elseif { $checkMin > $currMin && $checkMax > $currMax && $checkMin < $currMax } { # case 4: the new region is portion overlapping boundary of any previous region if { $drawDeleteRegionFlag == "true" } { set coords [lreplace $coords 2 2 $checkMin] set coords [lreplace $coords 5 5 $checkMin] set bumpSelf [list $n $checkRgn] set splitList $coords } else { if { $currDirection == "toRight" } { set coords [lreplace $coords 2 2 $checkMax] set coords [lreplace $coords 5 5 $checkMax] } else { set coords [lreplace $coords 0 0 $checkMin] set coords [lreplace $coords 4 4 $checkMin] } } lappend bumpList [lindex $checkRgnList 0] set bumpDetect true } incr n if { $bumpDetect == "true" } break } } setCoords $coords draw } itcl::body Shape::checkPolygonPoint { index } { set coords [getCoords] set npts [llength $coords] # Keep at least 2 points if { $npts <= 4 } return set start1 [expr $index*2] foreach [list x1 y1] [lrange $coords $start1 [expr $start1+1] ] {} set start0 [expr $start1-2] if {$start0<0} {set start0 [expr $npts-2]} foreach [list x0 y0] [lrange $coords $start0 [expr $start0+1] ] {} set dx [expr $x1-$x0] set dy [expr $y1-$y0] set r [expr $dx*$dx+$dy*$dy] if { $r<16 } { setCoords [lreplace $coords $start1 [expr $start1+1] ] } else { set start0 [expr $start1+2] if {$start0>=$npts} {set start0 0} foreach [list x0 y0] [lrange $coords $start0 [expr $start0+1] ] {} set dx [expr $x1-$x0] set dy [expr $y1-$y0] set r [expr $dx*$dx+$dy*$dy] if { $r<16 } { setCoords [lreplace $coords $start1 [expr $start1+1] ] } } } itcl::body Shape::beginModification { {x 0} {y 0} } { global xrangeList_onG bumpSelf currentRegionObj global currentSelectXRange set reverseFlag false if { $drawDeleteRegionFlag == "true" } { set color $itsColor set itsColor $itsHandleColor set itsHandleColor $color set reverseFlag true } set coords_b [getCoords] set currMin [lindex $coords_b 0] set currMax [lindex $coords_b 2] set currDirection toRight if { $currMin > $currMax } { set currDirection toLeft set tmp $currMin set currMin $currMax set currMax $tmp } set x [$itsCanvas canvasx $x] set y [$itsCanvas canvasy $y] if { [info exists xrangeList_onG] && [$currentRegionObj getOwner] == "powXRangeOwner" } { set n 0 foreach checkRgnList $xrangeList_onG { set checkRgn [lindex $checkRgnList 1] set checkMin [lindex $checkRgn 0] set checkMax [lindex $checkRgn 2] set checkDirection toRight if { $checkMin > $checkMax } { set checkDirection toLeft set tmp $checkMin set checkMin $checkMax set checkMax $tmp } if { $checkMin < $x && $x < $checkMax } { set currentSelectXRange [powGetCurrXRange] } if { $checkMin < $currMin && $checkMax > $currMax } { set bumpDetect true set bumpSelf [list "new" $coords_b] } incr n } } set startX $x set startY $y set ignoreClip 1 set isBeingModified 1 } itcl::body Shape::addBoundaryLine { coords } { global CpowXRangeY0 CpowXRangeY1 global CpowXRangeX0 CpowXRangeX1 if [info exists CpowXRangeY0] { catch { $itsCanvas delete boundary1$itsTag } catch { $itsCanvas delete boundary2$itsTag } set x0 [lindex $coords 0] set x1 [lindex $coords 2] if { $x0 > $CpowXRangeX0 && $x0 < $CpowXRangeX1 } { set idX0 [$itsCanvas create line $x0 $CpowXRangeY0 $x0 $CpowXRangeY1 \ -fill $itsBoundaryColor -tags boundary1$itsTag -width 1.0] lappend itsBoundTag $idX0 } if { $x1 > $CpowXRangeX0 && $x1 < $CpowXRangeX1 } { set idX1 [$itsCanvas create line $x1 $CpowXRangeY0 $x1 $CpowXRangeY1 \ -fill $itsBoundaryColor -tags boundary2$itsTag -width 1.0] lappend itsBoundTag $idX1 } } $itsCanvas raise rgnHandle$itsTag } itcl::body Shape::finishModification { } { global CpowXRangeY0 CpowXRangeY1 bumpList bumpSelf xrangeList_onG splitList currgn staticY global currentRegionObj if { $tmpAdjustPoint != -1 && [getShape]=="Polygon" } { # If adjusted point is too close to an adjacent point, delete it checkPolygonPoint $tmpAdjustPoint } if { $yStaticFlag == "true" } { set coords [getCoords] if { [lindex $coords 0] > [lindex $coords 2] } { set tmp [lindex $coords 0] set coords [lreplace $coords 0 0 [lindex $coords 2]] set coords [lreplace $coords 2 2 $tmp] setCoords $coords } if { [lindex $coords 0] == [lindex $coords 2] } { # one click set drawDeleteRegionFlag "false" if { $reverseFlag == "true" } { set color $itsColor set itsColor $itsHandleColor set itsHandleColor $color } set bumpSelf [list "new" $coords] set bumpDetect true } } set tmpAdjustPoint -1 set ignoreClip 0 draw select foreach id $tmpIds { $itsCanvas delete $id } set tmpIds {} set isBeingModified 0 catch { notifyOwner shapeHasChanged } err if { [info exists splitList] && $drawDeleteRegionFlag == "true" } { set currentRegion [lindex [$currentRegionObj regions] end] powDeleteCurrXRange $currentRegion set coords [lindex $bumpSelf 1] catch { unset bumpList } catch { unset bumpSelf } set drawDeleteRegionFlag false set x0 [lindex $coords 0] if { [lindex $splitList 0] > [lindex $splitList 2] } { set x1 [lindex $splitList 2] } else { set x1 [lindex $splitList 0] } set x0_onG [lindex [powCanvasToGraph $currgn $x0 $staticY $itsCanvas] 0] set x1_onG [lindex [powCanvasToGraph $currgn $x1 $staticY $itsCanvas] 0] set firstList [format "%s %s" $x0_onG $x1_onG] catch { xrangeReadDataStr $firstList } err if { [lindex $splitList 0] > [lindex $splitList 2] } { set x0 [lindex $splitList 0] } else { set x0 [lindex $splitList 2] } set x1 [lindex $coords 2] set x0_onG [lindex [powCanvasToGraph $currgn $x0 $staticY $itsCanvas] 0] set x1_onG [lindex [powCanvasToGraph $currgn $x1 $staticY $itsCanvas] 0] set secondList [format "%s %s" $x0_onG $x1_onG] catch { xrangeReadDataStr $secondList } err # get rid of the original x range set n [lsearch -glob $xrangeList_onG [list * $coords]] if { $n >= 0 } { powDeleteCurrXRange [lindex [lindex $xrangeList_onG $n] 0] } catch { unset splitList } set currentRegion [lindex [$currentRegionObj regions] end] set n [lsearch -glob $xrangeList_onG [list $currentRegion "*"]] powSelectXRange $n } else { if { [info exists bumpList] && $drawDeleteRegionFlag == "false" } { for {set i 0} {$i < [llength $bumpList]} {incr i} { powDeleteCurrXRange [lindex $bumpList $i] catch { $itsCanvas delete boundary1shp[lindex $bumpList $i]} catch { $itsCanvas delete boundary2shp[lindex $bumpList $i]} } unset bumpList } set bumpDetect false if { [info exists bumpSelf] && $drawDeleteRegionFlag == "false" } { powDeleteCurrXRange -1 set coords [lindex $bumpSelf 1] if [info exists xrangeList_onG] { set n [lsearch -glob $xrangeList_onG [list * $coords]] if { $n >= 0 } { powSelectXRange $n } } unset bumpSelf } else { if { $yStaticFlag == "true" && $drawDeleteRegionFlag == "false" } { set coords [getCoords] addBoundaryLine $coords } if [info exists xrangeList_onG] { set coords [getCoords] set n [lsearch -glob $xrangeList_onG [list * $coords]] powSelectXRange $n } } } if { $reverseFlag == "true" } { set color $itsColor set itsColor $itsHandleColor set itsHandleColor $color for {set i 0} {$i <[llength $itsIds]} {incr i} { catch { $itsCanvas itemconfigure [lindex $itsIds $i] -outline $itsColor } err } catch { $itsCanvas itemconfigure rgnHandle$itsTag -outline $itsHandleColor } err } } itcl::body Shape::drag { x y } { set x [$itsCanvas canvasx $x] set y [$itsCanvas canvasy $y] set dx [expr $x - $startX] set dy [expr $y - $startY] shift $dx $dy set startX $x set startY $y set drawDeleteRegionFlag "false" } itcl::body Shape::setStartPoint { x y } { set startX $x set startY $y } itcl::body Shape::shift { dx dy } { global xrangeList_onG staticY currentRegionObj bumpList if { $bumpDetect == "true" } { return } set newParams {} set prevParams [getCoords] foreach [list x y] [getCoords] { set x [expr $x + $dx] set y [expr $y + $dy] lappend newParams $x $y } set currMin [lindex $newParams 0] set currMax [lindex $newParams 2] set currDirection toRight if { $currMin > $currMax } { set currDirection toLeft set tmp $currMin set currMin $currMax set currMax $tmp } set bumpDetect false if { [info exists xrangeList_onG] && [$currentRegionObj getOwner] == "powXRangeOwner" } { set selfIdx [lsearch -glob $xrangeList_onG [list * $prevParams]] set n 0 foreach checkRgnList $xrangeList_onG { # xrangeList_onG has the format of [list [list of coords]] set checkRgn [lindex $checkRgnList 1] set checkMin [lindex $checkRgn 0] set checkMax [lindex $checkRgn 2] set checkDirection toRight if { $checkMin > $checkMax } { set checkDirection toLeft set tmp $checkMin set checkMin $checkMax set checkMax $tmp } if { [llength $newParams] <= 4 } { set newParams [lappend newParams [lindex $newParams 0] [lindex $newParams 1]] } if { $selfIdx == $n } { set newRegionList [lindex $xrangeList_onG $n] set newRegionList [lreplace $newRegionList 1 1 $newParams] set xrangeList_onG [lreplace $xrangeList_onG $n $n $newRegionList] } elseif { ($checkMin < $currMin && $checkMax > $currMin && $checkMax < $currMax) } { # case 3: the new region is portion overlapping boundary of any previous region if { $currDirection == "toRight" } { set newParams [lreplace $newParams 0 0 $checkMin] set newParams [lreplace $newParams 4 4 $checkMin] } else { set newParams [lreplace $newParams 2 2 $checkMax] set newParams [lreplace $newParams 5 5 $checkMax] } lappend bumpList [lindex $checkRgnList 0] set bumpDetect true } elseif { $checkMin > $currMin && $checkMax > $currMax && $checkMin < $currMax } { # case 4: the new region is portion overlapping boundary of any previous region if { $currDirection == "toRight" } { set newParams [lreplace $newParams 2 2 $checkMax] set newParams [lreplace $newParams 5 5 $checkMax] } else { set newParams [lreplace $newParams 0 0 $checkMin] set newParams [lreplace $newParams 4 4 $checkMin] } lappend bumpList [lindex $checkRgnList 0] set bumpDetect true } incr n if { $bumpDetect == "true" } break } } setCoords $newParams draw } itcl::body Shape::rotatePt { x y } { set x [$itsCanvas canvasx $x] set y [$itsCanvas canvasy $y] set coords [getCoords] set dx [expr $x-[lindex $coords 0]] set dy [expr $y-[lindex $coords 1]] setRotation [expr -atan2($dy,$dx)*180.0/3.1415926535] draw } itcl::body Shape::getPolygon { } { set cnt 0 set coords [getCoords] foreach {x y} $coords { set x$cnt $x set y$cnt $y incr cnt } if { $cnt==0 } { return {} } if {$cnt>1} { set dx [expr $x1-$x0] set dy [expr $y1-$y0] } set rot [getRotation] switch [getShape] { Box { set coords [BoxToPoly $x0 $y0 $dx $dy $rot] } Circle { set coords [CircleToPoly $x0 $y0 $dx $dy] } Ellipse { set coords [EllipseToPoly $x0 $y0 [expr 1.41421356*$dx] \ [expr 1.41421356*$dy] $rot] } Polygon { set coords [PolyToPoly $coords] } Line { set coords [list $x0 $y0 $x1 $y1 $x0 $y0] } Point { set coords [PointToPoly $x0 $y0] } } return $coords } itcl::body Shape::CircleToPoly { x0 y0 dx dy } { global powPlotParam regionParam set xRad [expr $dx/$xScale] set yRad [expr $dy/$yScale] set radius [expr sqrt($xRad*$xRad + $yRad*$yRad)] set xRad [expr $radius*$xScale] set yRad [expr $radius*$yScale] set points "" foreach {x y} [circle] { set x [expr $xRad*$x+$x0] set y [expr $yRad*$y+$y0] lappend points $x $y } return $points } itcl::body Shape::EllipseToPoly { x0 y0 dx dy angle } { set points "" foreach {x y} [circle] { set x [expr $dx*$x+$x0] set y [expr $dy*$y+$y0] lappend points $x $y } if {[expr abs($angle)] < 1e-10} {return $points} return [poly_rotate $x0 $y0 $angle $points] } itcl::body Shape::BoxToPoly { x0 y0 dx dy angle } { set points "" foreach {x y} [square] { set x [expr $dx*$x+$x0] set y [expr $dy*$y+$y0] lappend points $x $y } if {[expr abs($angle)] < 1e-10} {return $points} return [poly_rotate $x0 $y0 $angle $points] } itcl::body Shape::PolyToPoly { descr } { lappend descr [lindex $descr 0] [lindex $descr 1] return $descr } itcl::body Shape::PointToPoly { x0 y0 } { global powPlotParam regionParam set halfxMag [expr 0.5*$xScale] set halfyMag [expr 0.5*$yScale] if {$halfxMag<1} {set halfxMag 1} if {$halfyMag<1} {set halfyMag 1} set x1 [expr $x0-$halfxMag] set y1 [expr $y0-$halfyMag] set x2 [expr $x0+$halfxMag] set y2 [expr $y0+$halfyMag] return "$x1 $y1 $x1 $y2 $x2 $y2 $x2 $y1 $x1 $y1" } ######### # # Object coordinates for primitive shapes # # generate a list of points for a circle. every 12 degrees should do set circle_points "" set cnvt [expr -3.1415926535 / 180.0] for {set i 0} {$i <= 360} {incr i 12} { lappend circle_points [expr cos($i * $cnvt)] lappend circle_points [expr sin($i * $cnvt)] } # return coords of unit circle, radius 1 at the origin proc circle {} { global circle_points return $circle_points } # return coords of square (bounding box of unit circle) proc square {} { return "1 1 1 -1 -1 -1 -1 1 1 1" } # rotate a polygon around x0 and y0, return new coordinates proc poly_rotate {x0 y0 angle coords} { set st [expr sin(-3.1415926535 * $angle / 180.0)] set ct [expr cos(-3.1415926535 * $angle / 180.0)] set result "" foreach {x y} $coords { lappend result [expr $ct*$x - $st*$y + $x0*(1.0 - $ct) + $y0*$st] lappend result [expr $st*$x + $ct*$y + $y0*(1.0 - $ct) - $x0*$st] } return $result } # # # ######################################################################## fv5.4/tcltk/pow/Tools.html0000644000220700001010000000236010450557573015134 0ustar birbylheadev The POW tool menu

      The POW tool menu

      • Blink Images/Graphs: Through these two dialog boxes, you can blink (animate) multiple images in a single graph or multiple graphs on the POW canvas.
      • Region Files: Through this dialog box, you can create and edit region files using the mouse.
      • Contour Maps: Through this dialog box, you can create and edit contour maps of the current image.
      • Profile: Select a slice through an image and plot the pixel intensity along the slice.
      • Ruler: Measure the distance between two points in an image.
      • Image Probe: Select a region of an image and calculate flux and centroid data.
      • X Range: Select range to to restrict the analysis to only those photons that were detected within certain time intervals.
      fv5.4/tcltk/pow/Visu_Init.c0000644000220700001010000000364312076355402015221 0ustar birbylheadev/* * Visu_Init.c * * This file contains interpreter initialization * functions. After the tkUnixInit.c file in the Tk4.1 distribution. * * Copyright (c) 1995-1996 Sun Microsystems, Inc. * Copyright (c) 1995-1996 The Regents of the University of California * Copyright (c) 1996 Pierre-Louis Bossart * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ #include "tkpict.h" /* globals linked with tcl variables */ int Private_Colormap = 0; int slice_nb = 0; int nb_slices = 1; /* * Default directory in which to look for libraries: */ #if !(defined(__WIN32__) || defined(macintosh)) static char defaultLibraryDir[200] = VISU_LIBRARY; #endif /* * The following string is the startup script executed in new * interpreters. It looks on disk in several different directories * for a script "visu.tcl" that is compatible with this version * of Visu. The visu.tcl script does all of the real work of * initialization. */ static char *initScript = "" ; int Visu_Init(interp) Tcl_Interp *interp; /* Interpreter for application. */ { #if !(defined(__WIN32__) || defined(macintosh)) const char *libDir; #endif #if !(defined(__WIN32__) || defined(macintosh)) /* create pict image format */ Tk_CreateImageType(&tkPictImageType); /* least current files first */ Tcl_LinkVar(interp,"has_plb_segment",(char*)&has_plb_segment,TCL_LINK_INT); #endif Tcl_LinkVar(interp,"slice_nb",(char*)&slice_nb,TCL_LINK_INT); Tcl_LinkVar(interp,"nb_slices",(char*)&nb_slices,TCL_LINK_INT); Tcl_LinkVar(interp,"Private_Colormap",(char*)&Private_Colormap,TCL_LINK_INT); #if !(defined(__WIN32__) || defined(macintosh)) libDir = Tcl_GetVar(interp, "visu_library", TCL_GLOBAL_ONLY); if (libDir == NULL) { Tcl_SetVar(interp, "visu_library", defaultLibraryDir, TCL_GLOBAL_ONLY); } #endif return Tcl_Eval(interp, initScript); } fv5.4/tcltk/pow/Visu_colors.c0000644000220700001010000002713306613671103015616 0ustar birbylheadev/* * colors.c -- * * A source file for Pict images * * Copyright (c) 1995 The Regents of the University of California. * * Author: Pierre-Louis Bossart * Date: November 17, 1995 * * Derived from tkImgPhoto.c in the tk4.0b2 distribution * copyrighted as follows: * * Copyright (c) 1994 The Australian National University. * Copyright (c) 1994-1995 Sun Microsystems, Inc. * * Author: Paul Mackerras (paulus@cs.anu.edu.au), * Department of Computer Science, * Australian National University. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ #include "tkpict.h" extern XColor lut_colorcell_defs[256]; extern int ncolors; extern int lut_start; static int Default_Shared_Allocated = 0; static int Default_Screen_Allocated = 0; static int Default_Private_Allocated = 0; int Pow_Allocated = 0; static PictColorTable *DefaultSharedColorTable; static PictColorTable *DefaultScreenColorTable; static PictColorTable *DefaultPrivateColorTable; extern PictColorTable *PowColorTable; /* *---------------------------------------------------------------------- * * DitherInstance -- * * This procedure is called to update an area of an instance's * pixmap by dithering the corresponding area of the master. * * Results: * None. * * Side effects: * The instance's pixmap gets updated. * *---------------------------------------------------------------------- */ void DitherInstance(instancePtr, xStart, yStart, width, height) PictInstance *instancePtr; /* The instance to be updated. */ int xStart, yStart; /* Coordinates of the top-left pixel in the * block to be dithered. */ int width, height; /* Dimensions of the block to be dithered. */ { PictMaster *masterPtr; PictColorTable *colorTable; XImage *imagePtr; int nLines; int i, c, x, y; int xEnd, yEnd; int bitsPerPixel, bytesPerLine, lineLength; unsigned char *srcLinePtr, *srcPtr; unsigned char *destBytePtr, *dstLinePtr; pixel *destLongPtr; #ifdef DEBUG printf("DitherInstance\n"); #endif masterPtr = instancePtr->masterPtr; colorTable = instancePtr->colorTable; /* * First work out how many lines to do at a time, * then how many bytes we'll need for pixel storage, * and allocate it. */ nLines = (MAX_PIXELS + width - 1) / width; if (nLines < 1) { nLines = 1; } if (nLines > height ) { nLines = height; } imagePtr = instancePtr->imagePtr; if (imagePtr == NULL) { return; /* we must be really tight on memory */ } bitsPerPixel = imagePtr->bits_per_pixel; bytesPerLine = ((bitsPerPixel * width + 31) >> 3) & ~3; imagePtr->width = width; imagePtr->height = nLines; imagePtr->bytes_per_line = bytesPerLine; imagePtr->data = (char *) ckalloc((unsigned) (imagePtr->bytes_per_line * nLines)); if( imagePtr->data == NULL ) { (void)fprintf(stderr,"DitherInstance: ckalloc failed \n"); return; } lineLength = masterPtr->width; srcLinePtr = masterPtr->bytedata + (yStart + height - 1) * lineLength + xStart; xEnd = xStart + width; if (bitsPerPixel > 1) { /* * Loop over the image, doing at most nLines lines before * updating the screen image. */ for (; height > 0; height -= nLines) { if (nLines > height) { nLines = height; } dstLinePtr = (unsigned char *) imagePtr->data; yEnd = yStart + nLines; for (y = yStart; y < yEnd; ++y) { srcPtr = srcLinePtr; destBytePtr = dstLinePtr; destLongPtr = (pixel *) dstLinePtr; for (x = xStart; x < xEnd; ++x) { c = srcPtr[0]; srcPtr += 1; if (c < 0) { c = 0; } else if (c > 255) { c = 255; } i = colorTable->redValues[c]; switch (bitsPerPixel) { case NBBY: *destBytePtr++ = i; break; case NBBY * sizeof(pixel): *destLongPtr++ = i; break; default: XPutPixel(imagePtr, x - xStart, y - yStart, (unsigned) i); } } srcLinePtr -= lineLength; dstLinePtr += bytesPerLine; } /* Update the pixmap for this instance with the block of pixels that we have just computed. */ XPutImage(instancePtr->display, instancePtr->pixels, instancePtr->gc, imagePtr, 0, 0, xStart, yStart, (unsigned) width, (unsigned) nLines); yStart = yEnd; } } ckfree(imagePtr->data); imagePtr->data = NULL; } /* end DitherInstance */ int GetColorTable(Tk_Window tkwin, PictColorTable **colorTable, XVisualInfo **visInfoPtr) { Display *disp; Colormap cmap; int ncolors; int lut_start; char colormap_level; char atom = 0; static int gave_message=0; disp = Tk_Display(tkwin); (*visInfoPtr) = get_visual(disp); if ((*visInfoPtr) == NULL) { (void)fprintf (stderr,"GetColorTable: No PseudoColor visuals found . \n"); exit (0); } colormap_level = Private_Colormap; /* first make sure the default Display is PseudoColor */ if( ((*visInfoPtr)->visual != DefaultVisual(disp,DefaultScreen(disp))) && (colormap_level < DEFAULT_PRIVATE_COLORMAP) ) { (void)fprintf (stderr, "ERROR: Default Display is not PseudoColor \n Allocating a Shareable Private Colormap instead \n"); colormap_level = DEFAULT_PRIVATE_COLORMAP; } /* shared colormap */ if(colormap_level == READ_SHARED_COLORMAP) { if( Default_Shared_Allocated == 0 ) { if( !init_colors(disp,&cmap,(*visInfoPtr), &colormap_level,&ncolors,&lut_start,&atom,tkwin) ) { (void)fprintf (stderr, "ERROR: no shared colormap exists.\n"); (void)fprintf (stderr, "Using the default colormap instead \n"); colormap_level = DEFAULT_SCREEN_COLORMAP; } else { if( !AllocateColorTable((PictColorTable **)&DefaultSharedColorTable, disp,cmap,colormap_level,ncolors,lut_start,atom) ) return 0; else { Default_Shared_Allocated = 1; *colorTable = DefaultSharedColorTable; } } } else { /* use existing color table */ DefaultSharedColorTable->refCount ++; *colorTable = DefaultSharedColorTable; } } /* end shared colormap*/ /* default screen colormap */ if(colormap_level == DEFAULT_SCREEN_COLORMAP) { if( Default_Screen_Allocated == 0 ) { if( !init_colors(disp,&cmap,(*visInfoPtr), &colormap_level,&ncolors,&lut_start,&atom,tkwin) ) { /* from deway garett: eliminate multiple messages on stderr:*/ if (!gave_message) { gave_message=1; (void)fprintf(stderr,"ERROR: not enough colors in screen Default Colormap\n"); (void)fprintf(stderr,"Creating a default private colormap instead \n"); } colormap_level = DEFAULT_PRIVATE_COLORMAP; } else { if( !AllocateColorTable((PictColorTable **)&DefaultScreenColorTable, disp,cmap,colormap_level,ncolors,lut_start,atom) ) return 0; else { Default_Screen_Allocated = 1; *colorTable = DefaultScreenColorTable; } } } else { /* use existing color table */ DefaultScreenColorTable->refCount += 1; *colorTable = DefaultScreenColorTable; } } /* end default screen colormap */ /* shared private colormap */ if(colormap_level == DEFAULT_PRIVATE_COLORMAP) { if( Default_Private_Allocated == 0 ) { if( !init_colors(disp,&cmap,(*visInfoPtr), &colormap_level,&ncolors,&lut_start,&atom,tkwin) ) { (void)fprintf(stderr,"init_colors failed \n"); return 0; } else { if( !AllocateColorTable((PictColorTable **)&DefaultPrivateColorTable, disp,cmap,colormap_level,ncolors,lut_start,atom) ) return 0; else { Default_Private_Allocated = 1; *colorTable = DefaultPrivateColorTable; } } } else { /* use existing color table */ DefaultPrivateColorTable->refCount += 1; *colorTable = DefaultPrivateColorTable; } } /* end shared private colormap */ /* private colormap */ if(colormap_level == NEW_PRIVATE_COLORMAP) { if( !init_colors(disp,&cmap,(*visInfoPtr), &colormap_level,&ncolors,&lut_start,&atom,tkwin) ) { (void)fprintf(stderr,"init_colors failed \n"); return 0; } else { if( !AllocateColorTable((PictColorTable **)colorTable, disp,cmap,colormap_level,ncolors,lut_start,atom) ) return 0; } } /* end private colormap */ /* POW colormap */ if(colormap_level == POW_COLORMAP) { if( Pow_Allocated == 0 ) { if( !init_colors(disp,&cmap,(*visInfoPtr), &colormap_level,&ncolors,&lut_start,&atom,tkwin) ) { (void)fprintf(stderr,"init_colors failed \n"); return 0; } else { if( !AllocateColorTable((PictColorTable **)&PowColorTable, disp,cmap,colormap_level,ncolors,lut_start,atom) ) return 0; else { Pow_Allocated = 1; *colorTable = PowColorTable; } } } else { /* use existing color table */ PowColorTable->refCount ++; *colorTable = PowColorTable; } } /* end POW colormap */ /* change default back to screen colormap. This is useless in visu, since the scripts always check for the colormap level of the current image. This might be useful in the future though */ /* Private_Colormap = DEFAULT_SCREEN_COLORMAP;*/ /* set window attributes */ if( Tk_SetWindowVisual(tkwin, (*visInfoPtr)->visual,(*visInfoPtr)->depth, (*colorTable)->colormap) == 0 ){ /* window already exists. See if the new colormap can be installed */ /* if(((*visInfoPtr)->visual == (((Tk_FakeWin *)(tkwin)))->visual) && ((*visInfoPtr)->depth == (((Tk_FakeWin *)(tkwin)))->depth)) { */ /*Let's try not doing any testing, HPUX barfs if we do*/ Tk_SetWindowColormap(tkwin,(*colorTable)->colormap); /* } else { (void)fprintf(stderr,"Window already exists with Visual class %d and depth %d. Change the Tk script to create image widget with PseudoColor 8 visual\n", ((Tk_FakeWin *)(tkwin))->visual->class, ((Tk_FakeWin *)(tkwin))->depth); return 0; } */ } else { /* The visual was set, but the colormap needs to be installed. The window managers should do it but for now let's do it ourselves */ /* Tk_SetWindowColormap(tkwin,(*colorTable)->colormap); */ } return 1; } int DisposeColorTable(PictColorTable *colorTable) { unsigned long *pixels; int i,j; /* if still instances using colorTable *or* if using POW Colormap, don't do this. pict images in POW use the POW windows colormap. Once allocated, the POW colorTable should remain (as far as VISU is concerned). The Pow colorTable is handled in PowCleanUp if POW is exitted. */ if(colorTable->refCount != 0 || colorTable->colormap_level == POW_COLORMAP) return 0; /* destroy atom */ if(colorTable->atom == 1) deinit_disp(colorTable->display); if(colorTable->colormap_level > READ_SHARED_COLORMAP) { pixels = (unsigned long *)ckalloc(colorTable->ncolors* sizeof(unsigned long)); if( pixels == NULL ) return 0; /* create pixel array */ for(j=colorTable->lut_start,i=0;incolors;i++,j++) pixels[i] = j; /* free colors */ XFreeColors(colorTable->display,colorTable->colormap, pixels,colorTable->ncolors,0); ckfree((void*)pixels); /* free colormap */ XFreeColormap(colorTable->display, colorTable->colormap); } if( colorTable->colormap_level == READ_SHARED_COLORMAP ) Default_Shared_Allocated = 0; if( colorTable->colormap_level == DEFAULT_SCREEN_COLORMAP) Default_Screen_Allocated = 0; else if( colorTable->colormap_level == DEFAULT_PRIVATE_COLORMAP ) Default_Private_Allocated = 0; ckfree((void*)colorTable); colorTable = NULL; return 1; } /* end DisposeColorTable */ fv5.4/tcltk/pow/Visu_generic.c0000644000220700001010000003637112076071117015734 0ustar birbylheadev#include "tkpict.h" extern Tcl_Interp *interp; PictColorTable *PowColorTable; XColor lut_colorcell_defs[MAX_COLORS]; int byteLookup[MAX_LOOKUP]; double lastLookupMin=0.0, lastLookupMax=0.0; static int convert_block( void *in, int npts, int in_type, double *dispmin, double *dispmax, unsigned char *out, unsigned int *histo ); /***************************************************/ /* Wrappers to convert_block which will either */ /* convert the image data to bytes (translated */ /* using byteLookup[]) or calculate a histogram */ /* of the image data (of length MAX_LOOKUP). */ /***************************************************/ int convert_block_to_byte( void *in, unsigned char *out, int npts, int in_type, double *dispmin, double *dispmax ) { if( (lastLookupMin==0.0 && lastLookupMax==0.0) || (*dispmin==0.0 && *dispmax==0.0) ) { return convert_block( in, npts, in_type, dispmin, dispmax, out, NULL ); } else { return convert_block( in, npts, in_type, &lastLookupMin, &lastLookupMax, out, NULL ); } } int convert_block_to_histo( void *in, int npts, int in_type, double *dispmin, double *dispmax, unsigned int *histo ) { return convert_block( in, npts, in_type, dispmin, dispmax, NULL, histo ); } /***************************************************/ /* Internal routine called by above wrappers */ /***************************************************/ static int convert_block( void *in, int npts, int in_type, double *dispmin, double *dispmax, unsigned char *out, unsigned int *histo ) { register int i; double scale; unsigned char *ptr_out; double holder, maxLookup; if( histo ) for( i=0; i max ) max = *ptr; else if( *ptr < min ) min = *ptr; } *dispmin = min; *dispmax = max; ptr = (unsigned char *)in; } if( (*dispmax-*dispmin) == 0.0 ) { if( histo ) histo[ MAX_LOOKUP>>1 - 1 ] = npts; else if( out ) for( i=npts; i--; ) *ptr_out++ = 127; } else { scale = maxLookup / (*dispmax - *dispmin); for( i=npts; i--; ) { holder = scale * (*ptr++ - *dispmin); if( holder > maxLookup ) holder = maxLookup; else if( holder < 0.0 ) holder = 0.0; if( histo ) histo[ (int)holder ]++; else if( out ) *ptr_out++ = byteLookup[ (int)holder ]; } } } break; case WORD: { short *ptr = (short *)in; short min, max; if( (*dispmin == 0.0) && (*dispmax == 0.0) ) { min = max = *ptr++; for (i=1;i max ) max = *ptr; else if( *ptr < min ) min = *ptr; } *dispmin = min; *dispmax = max; ptr = (short *)in; } if( (*dispmax-*dispmin) == 0.0 ) { if( histo ) histo[ MAX_LOOKUP>>1 - 1 ] = npts; else if( out ) for( i=npts; i--; ) *ptr_out++ = 127; } else { scale = maxLookup / (*dispmax - *dispmin); for( i=npts; i--; ) { holder = scale * (*ptr++ - *dispmin); if( holder > maxLookup ) holder = maxLookup; else if( holder < 0.0 ) holder = 0.0; if( histo ) histo[ (int)holder ]++; else if( out ) *ptr_out++ = byteLookup[ (int)holder ]; } } } break; case LWORD: { int *ptr = (int *)in; int min, max; if( (*dispmin == 0.0) && (*dispmax == 0.0) ) { min = max = *ptr++; for (i=1;i max ) max = *ptr; else if( *ptr < min ) min = *ptr; } *dispmin = min; *dispmax = max; ptr = (int *)in; } if( (*dispmax-*dispmin) == 0.0 ) { if( histo ) histo[ MAX_LOOKUP>>1 - 1 ] = npts; else if( out ) for( i=npts; i--; ) *ptr_out++ = 127; } else { scale = maxLookup / (*dispmax - *dispmin); for( i=npts; i--; ) { holder = scale * (*ptr++ - *dispmin); if( holder > maxLookup ) holder = maxLookup; else if( holder < 0.0 ) holder = 0.0; if( histo ) histo[ (int)holder ]++; else if( out ) *ptr_out++ = byteLookup[ (int)holder ]; } } } break; case REAL: { float *ptr = (float *)in; float min, max; if( (*dispmin == 0.0) && (*dispmax == 0.0) ) { min = max = *ptr++; for (i=1;i max ) max = *ptr; else if( *ptr < min ) min = *ptr; } *dispmin = min; *dispmax = max; ptr = (float *)in; } if( (*dispmax-*dispmin) == 0.0 ) { if( histo ) histo[ MAX_LOOKUP>>1 - 1 ] = npts; else if( out ) for( i=npts; i--; ) *ptr_out++ = 127; } else { scale = maxLookup / (*dispmax - *dispmin); for( i=npts; i--; ) { holder = scale * (*ptr++ - *dispmin); if( holder > maxLookup ) holder = maxLookup; else if( holder < 0.0 ) holder = 0.0; if( histo ) histo[ (int)holder ]++; else if( out ) *ptr_out++ = byteLookup[ (int)holder ]; } } } break; case DOUBLE: { double *ptr = (double *)in; double min, max; if( (*dispmin == 0.0) && (*dispmax == 0.0) ) { min = max = *ptr++; for (i=1;i max ) max = *ptr; else if( *ptr < min ) min = *ptr; } *dispmin = min; *dispmax = max; ptr = (double*)in; } if( (*dispmax-*dispmin) == 0.0 ) { if( histo ) histo[ MAX_LOOKUP>>1 - 1 ] = npts; else if( out ) for( i=npts; i--; ) *ptr_out++ = 127; } else { scale = maxLookup / (*dispmax - *dispmin); for( i=npts; i--; ) { holder = scale * (*ptr++ - *dispmin); if( holder > maxLookup ) holder = maxLookup; else if( holder < 0.0 ) holder = 0.0; if( histo ) histo[ (int)holder ]++; else if( out ) *ptr_out++ = byteLookup[ (int)holder ]; } } } break; case LONGLONG: { #ifdef __WIN32__ __int64 *ptr = (__int64*)in; __int64 min, max; #else long long *ptr = (long long*)in; long long min, max; #endif if( (*dispmin == 0.0) && (*dispmax == 0.0) ) { min = max = *ptr++; for (i=1;i max ) max = *ptr; else if( *ptr < min ) min = *ptr; } *dispmin = min; *dispmax = max; #ifdef __WIN32__ ptr = (__int64*)in; #else ptr = (long long*)in; #endif } if( (*dispmax-*dispmin) == 0.0 ) { if( histo ) histo[ MAX_LOOKUP>>1 - 1 ] = npts; else if( out ) for( i=npts; i--; ) *ptr_out++ = 127; } else { scale = maxLookup / (*dispmax - *dispmin); for( i=npts; i--; ) { holder = scale * (*ptr++ - *dispmin); if( holder > maxLookup ) holder = maxLookup; else if( holder < 0.0 ) holder = 0.0; if( histo ) histo[ (int)holder ]++; else if( out ) *ptr_out++ = byteLookup[ (int)holder ]; } } } break; default: (void)fprintf(stderr,"Unknown data type %d\n",in_type); return(0); } return(1); } /* end convert_block */ void equalize_histo( void *in_data, int data_type, unsigned int totalPix, double *min, double *max ) { unsigned int histo[MAX_LOOKUP], excess; int color, level, done; double bin, pixbin, lvl; int bottBin, topBin; /* Calculate histogram */ done = 0; do { convert_block_to_histo(in_data, totalPix, data_type, min, max, histo); pixbin = (double)(totalPix - (totalPix>1?1:0)) / 256.0; if( pixbin>1.0 ) { /* Reduce the excessively abundant levels to a single binwidth */ pixbin *= 3.0; excess = 0; for( level=0; levelpixbin ) { excess += (unsigned int)((histo[level]-pixbin-0.5)); histo[level] = (unsigned int)(pixbin+0.5); } pixbin = (double)(totalPix - (totalPix>1?1:0) - excess) / 256.0; if( pixbin < 1.0 ) pixbin=1.0; } /* Create new color table */ bin = 0.0; for( level=color=0; level=pixbin && color<255 ) { bin -= pixbin; color++; } } while( level 5 ) bottBin = level-1; if( topBin < 0 && byteLookup[level] > 250 ) topBin = level; } if( topBin - bottBin < MAX_LOOKUP>>3 ) { if( bottBin > 0 ) bottBin--; if( topBin < MAX_LOOKUP-1 ) topBin++; lvl = (*max-*min)/(MAX_LOOKUP-1.0); if( topBin-bottBin>2 || lvl>1e-6*fabs(*min) ) { *max = topBin * lvl + *min; *min = bottBin * lvl + *min; } else done = 1; } else { done = 1; } } while( ! done ); } void build_lookup( int *x_lut, int *y_lut, int nbpts ) { int j; double slope; int curr_pt; curr_pt = 0; slope = 0.0; for( j=0; j 255 ) byteLookup[j] = 255; } else { byteLookup[j] = y_lut[curr_pt]; if( byteLookup[j] < 0 ) byteLookup[j] = 0; else if( byteLookup[j] > 255 ) byteLookup[j] = 255; /* remove vertical ramps */ while( curr_ptdisplay = disp; (*colorTable)->colormap = cmap; (*colorTable)->colormap_level = colormap_level; (*colorTable)->ncolors = ncolors; (*colorTable)->lut_start = lut_start; (*colorTable)->atom = atom; (*colorTable)->refCount = 1; color_nb = ncolors-1; for( i=0; iintensity_lut[i] = i; } /* load linear red green blue lookup tables */ for (i=0; ired_lut[i] = i; (*colorTable)->green_lut[i] = i; (*colorTable)->blue_lut[i] = i; } for (i = 0; i < MAX_COLORS; ++i) { r = i*color_nb/(MAX_COLORS-1)+lut_start; (*colorTable)->redValues[i] = lut_colorcell_defs[r].pixel; } /* Load the gray color pattern */ gray(disp,cmap,ncolors,lut_start,False, (*colorTable)->red, (*colorTable)->green, (*colorTable)->blue, (*colorTable)->intensity_lut, (*colorTable)->red_lut, (*colorTable)->green_lut, (*colorTable)->blue_lut); return 1; } /* end AllocateColorTable */ fv5.4/tcltk/pow/Visu_license.terms0000644000220700001010000000362106416745775016665 0ustar birbylheadevThis software was partially funded by the U.S. Department of Energy under Contract No. W-7405-ENG-48. Release of this unclassified code was approved by LLNL ADPR&I Office under Code Release No. 960012. This software is copyrighted by the Regents of the University of California, Sun Microsystems, Inc., and other parties. The following terms apply to all files associated with the software unless explicitly disclaimed in individual files. The authors hereby grant permission to use, copy, modify, distribute, and license this software and its documentation for any purpose, provided that existing copyright notices are retained in all copies and that this notice is included verbatim in any distributions. No written agreement, license, or royalty fee is required for any of the authorized uses. Modifications to this software may be copyrighted by their authors and need not follow the licensing terms described here, provided that the new terms are clearly indicated on the first page of each file where they apply. IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. RESTRICTED RIGHTS: Use, duplication or disclosure by the government is subject to the restrictions as set forth in subparagraph (c) (1) (ii) of the Rights in Technical Data and Computer Software Clause as DFARS 252.227-7013 and FAR 52.227-19. fv5.4/tcltk/pow/Visu_lut.c0000644000220700001010000010571611136113256015121 0ustar birbylheadev/* * lut.c -- * * A source file for Pict images * * Copyright (c) 1995 The Regents of the University of California. * * Author: Pierre-Louis Bossart * Date: November 17, 1995 * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ #include "tkpict.h" #include "wcslib/wcstrig.h" static int random_walk(int *color); void linear_lut(int *lut, Display *disp,Colormap cmap, int ncolors,int lut_start,char overlay, int *red,int *green,int *blue, int *intensity_lut,int *red_lut,int *green_lut, int *blue_lut) { int i,j; for (i=lut_start,j=0; j= lut_size ) lut[j] = lut_size-1; } else { lut[j] = y_lut[curr_pt]; if( lut[j] < 0 ) lut[j] = 0; else if( lut[j] >= lut_size ) lut[j] = lut_size-1; /* remove vertical ramps */ while( curr_pt 255) { /* Reflect off 255 */ *color = (2*255) - *color; } return( *color & 0xff ); } /* end random_walk */ void lut_ramp(int *lut,int begin,float beginv,int end,float endv) { int intensity, i ; float increment, value ; if ((begin < 0) || (begin > 255)) return; if ((end < 0) || (end > 255)) return; if ((beginv < 0.0) || (beginv > 1.0)) return; if ((endv < 0.0) || (endv > 1.0)) return; if (end == begin) { intensity = (int)(beginv * 255 + 0.5); lut[begin] = intensity ; return; } increment = (endv - beginv) / (end - begin) ; value = beginv ; for (i=begin; i<= end; i++) { intensity = (int)(value * 255 + 0.5); lut[i] = intensity ; value += increment ; } } /* end lut_ramp */ void set_hls(int *red,int *green,int *blue) { float H,L,S ; int r,g,b ; int n ; /* set background blue ... n=0 */ H = 0 ; L = 0.5 ; S = 0.5 ; convert_HLS_rgb(H,L,S,&r,&g,&b) ; red[0] = r ; green[0] = g ; blue[0] = b ; /* set red, orange, yellow, and green ranges */ for (n=1; n<=255; n++) { if (n < 64) { H = 105.0 ; L = (float)(0.3 + 0.00968 * (n - 1)); S = (float)(0.4 + 0.00645 * (n - 1)); } else if (n < 128) { H = 155.0 ; L = (float)(0.3 + 0.00952 * (n - 64)); S = (float)(0.4 + 0.00635 * (n - 64)); } else if (n < 192) { H = 190.0 ; L = (float)(0.3 + 0.00968 * (n - 128)); S = (float)(0.4 + 0.00645 * (n - 128)) ; } else { H = 240.0 ; L = (float)(0.3 + 0.00968 * (n - 192)); S = (float)(0.4 + 0.00645 * (n - 192)); } convert_HLS_rgb(H,L,S,&r,&g,&b) ; red[n] = r ; green[n] = g ; blue[n] = b ; } } /* end set_hls */ void convert_HLS_rgb(float H,float L,float S,int *r,int *g,int *b) { float R,G,B ; float M,m ; /* Setup equations */ if (L <= 0.5) M = L * (1 + S) ; else M = L + S - L*S ; m = 2*L - M ; /* Calculate R */ if (H < 60) R = (float)(m + (M - m) * (H/60.0)); else if (H < 180) R = M ; else if (H < 240) R = m + (M - m) * ((240 - H)/60) ; else R = m ; /* calculate G */ if (H < 120) G = m ; else if (H < 180) G = m + (M - m) * ((H - 120)/60) ; else if (H < 300) G = M ; else G = m + (M - m) * ((360 - H)/60) ; /* calculate B */ if (H < 60) B = M ; else if (H < 120) B = m + (M - m) * ((120 - H)/60) ; else if (H < 240) B = m ; else if (H < 300) B = m + (M - m) * (( H - 240)/60) ; else B = M ; /* scale R,G,B to 0-255 */ *r = (int)(255 * R); *g = (int)(255 * G); *b = (int)(255 * B); } /* end convert_HLS_rgb */ void hatgray(Display *disp,Colormap cmap, int ncolors,int lut_start,char overlay, int *red,int *green,int *blue, int *intensity_lut,int *red_lut,int *green_lut, int *blue_lut) { int tred[256],tgreen[256],tblue[256]; int i,j; /* compute the gray color map */ lut_ramp(red,0,(float)0.0,ncolors-1,(float)1.0) ; lut_ramp(green,0,(float)0.0,ncolors-1,(float)1.0) ; lut_ramp(blue,0,(float)0.0,ncolors-1,(float)1.0) ; /* Up ramp */ i = 0; for (j=1; j0; j-=2) { tred[i] = red[j]; tgreen[i] = green[j]; tblue[i] = blue[j]; i++; } for(i=0;i0; j-=2) { tred[i] = red[j]; tgreen[i] = green[j]; tblue[i] = blue[j]; i++; } for(i=0;i= hival ) return; if(loval < 0) loval = 0; if(hival>(MAX_COLORS-1)) hival = (MAX_COLORS-1); for (i=0; idepth; switch( *colormap_level ) { case READ_SHARED_COLORMAP: /* Get LUT start and length from other client */ status = readSharedColorAtom (disp,&cmap, &lut_start, &ncolors); if (status != Success) return 0; else break; /* we still need to set the argument pointers and free the memory allocated */ case DEFAULT_SCREEN_COLORMAP: cmap = DefaultColormap(disp, screenIndex); break; case DEFAULT_PRIVATE_COLORMAP: case NEW_PRIVATE_COLORMAP: /* Allocate our own colormap */ /* get 40 colors from default colormap to avoid flashing */ colormap_size = DisplayCells(disp,screenIndex); colors = (XColor*)ckalloc(colormap_size*sizeof(XColor)); for(i=0;ivisual, AllocNone); /* AllocAll doesn't work quite correctly for X11/NeWS 1.0 */ if (!cmap) { printf ("ERROR in init_colors: XCreateColormap returned %x\n", (unsigned int)cmap); return 0; } colormap_size = 40; XAllocColorCells(disp,cmap,True,plane_masks,0,pixels,colormap_size); XStoreColors(disp,cmap,colors,colormap_size); ckfree((void*)colors); break; case POW_COLORMAP: cmap = Tk_GetColormap(interp, tkwin, ".pow"); break; } /* end switch statement */ if( *colormap_level != READ_SHARED_COLORMAP ) { /* Try to get a set of contiguous color table entries for our use */ /* Decrement by 10 cells until we succeed */ if( depth >= 8 ) { tfGotColors = False; /* Will be set True when we succeed */ ncolors = 212; while (ncolors > 10) { status = XAllocColorCells(disp,cmap,True,plane_masks,0,pixels,ncolors); if (status != 0) { tfGotColors = True; /* Success. Break out of the while loop */ break; } ncolors -= 10; /* Failure. Decrement request and try again */ } /* End of while loop */ } else { (void)fprintf(stderr, "\nERROR in init_colors: Not enough graphics planes, depth is %d\n",depth) ; exit(0); } } if( *colormap_level != READ_SHARED_COLORMAP ) { if(tfGotColors == False) {/* Case 1: Got no colors */ ckfree((void*)plane_masks); plane_masks = NULL; ckfree((void*)pixels); pixels = NULL; return 0; } else if((depth == 8) && (ncolors < 50)) { /* Case 2: not enough colors */ /* Free the colors we got */ XFreeColors (disp, cmap, pixels, ncolors, 0); ckfree((void*)plane_masks); plane_masks = NULL; ckfree((void*)pixels); pixels = NULL; return 0; } else { /* Case 3: We got enough colors */ /* We got colors, but they may not be contiguous (SGI, for example...). * Find the endpoints of the set of contiguous colors ending at the top * value of those allocated, and use that segment. * Free up the rest of the allocated colors, if any. */ lutStartIndex = ncolors - 1; for (i=ncolors-1; i>0; i--) { if (pixels[i-1] != (pixels[i] - 1)) break; lutStartIndex = i-1; } lut_start = pixels[lutStartIndex]; lutEnd = pixels[ncolors-1]; ncolors = lutEnd - lut_start + 1; #ifdef DEBUG printf("lut start = %d nb colors %d \n",lut_start,ncolors); #endif /* Free the short, unused block of colors */ if (lutStartIndex != 0) { XFreeColors (disp, cmap, pixels, lutStartIndex, 0); } /* Send default lut data to server for other clients to use */ if( *colormap_level == DEFAULT_SCREEN_COLORMAP ) { writeSharedColorAtom (disp,cmap, lut_start, ncolors); *atom = 1; /* We wrote color atom, and should delete it when the colortable is disposed */ } } /* End of third case */ } for (color_def=lut_start; color_defdepth >= depth ) return(vis_found); } return(NULL); } /* end pick_visual */ XVisualInfo *get_visual(Display *disp) /* Pointer to list of matching visuals */ { XVisualInfo vTemplate; /* Template of the visual we want */ XVisualInfo *visualList; /* Pointer to list of matching visuals */ int visualsMatched; /* Number of visuals matched */ int screenIndex; int depth; XVisualInfo *vis_found,*vis_found1; #ifdef DEBUG printf("get_visual\n"); #endif screenIndex = DefaultScreen(disp); /* Screen index */ depth = 8; /* need at least 8 planes */ root_window = RootWindow(disp, screenIndex); /* Set up the template for getting visual info. Select some or all of these depending on the VisualMask. */ vTemplate.screen = screenIndex; vTemplate.class = PseudoColor; /* Find all PseudoColor visuals */ visualList = XGetVisualInfo (disp, VisualScreenMask | VisualClassMask, &vTemplate, &visualsMatched); if (visualList == NULL) { /* This is recoverable, so don't print a message to stderr (void)fprintf (stderr,"get_visual: No PseudoColor visuals found . \n"); */ return NULL; /* exit (0);*/ } if( (vis_found=pick_visual((XVisualInfo *)visualList,depth,visualsMatched)) == NULL) { /* This is recoverable, so don't print a message to stderr (void)fprintf (stderr,"get_visual: No PseudoColor visuals with depth at least 8 found . \n"); */ return NULL; /*exit (0);*/ } vTemplate.screen = vis_found->screen; vTemplate.class = vis_found->class; vTemplate.depth = vis_found->depth; vis_found1 = XGetVisualInfo (disp, VisualScreenMask | VisualClassMask | VisualDepthMask, &vTemplate, &visualsMatched); XFree(visualList); if( vis_found1 == NULL) { /* This is recoverable, so don't print a message to stderr (void)fprintf (stderr,"get_visual: No PseudoColor visuals with depth at least 8 found . \n"); */ return NULL; /*exit (0);*/ } return(vis_found1); } /* End of "get_visual" */ static void show_installed_colormaps(Display *disp) { Colormap *colorMapList; /* Pointer to list of installed colormaps */ int i; /* Local looping variable */ int num; /* Number of returned colormaps */ #ifdef DEBUG printf ("show_installed_colormaps\n"); #endif XFlush(disp) ; colorMapList = XListInstalledColormaps (disp, root_window, &num); XFlush(disp) ; printf ("Number of installed colormaps in root_window (%x) =%d\n", (unsigned int)root_window, num); for (i=0; iclass) { case PseudoColor: printf ("Visual class is PseudoColor\n"); break; case StaticColor: printf ("Visual class is StaticColor\n"); break; case DirectColor: printf ("Visual class is DirectColor\n"); break; case TrueColor: printf ("Visual class is TrueColor\n"); break; case GrayScale: printf ("Visual class is GrayScale\n"); break; case StaticGray: printf ("Visual class is StaticGray\n"); break; default: printf ("Visual class is not known\n"); break; } return; }/* end of "print_visual_class" */ /* Write the shared color atom to give info about the shared colorlut */ void writeSharedColorAtom (Display *disp,Colormap cmap,int lutStart,int nPC) { Atom colormapAtom; /* Atom for specifying colormap info to server */ struct XColorSharedStruct XColorShared; XColorShared.cmap = cmap; XColorShared.lutStart = lutStart; XColorShared.nPC = nPC; #ifdef DEBUG printf("writeSharedColorAtom\n"); #endif /* Post the colormap in atom VIEW_COLORMAP */ /* Create the atom */ colormapAtom = XInternAtom (disp, "VIEW_COLORMAP", False); if (colormapAtom == None) { #ifdef DEBUG (void)fprintf(stderr, "ERROR in writeSharedColorAtom: XInternAtom returned None (%d)\n", (int)colormapAtom); #endif return; } /* Store XColorShared in the atom */ XChangeProperty (disp, root_window, colormapAtom, XA_STRING, 8, PropModeReplace, (unsigned char*)&XColorShared, sizeof(XColorShared)); return; } /* End of "writeSharedColorAtom" */ /* Read the shared color atom to get information about the shared colorlut */ Status readSharedColorAtom (Display *disp, Colormap *cmap, /* The colormap ID */ int *lutStart, /* The first available LUT value */ int *nPC) /* The number of pseudocolor values used */ { Atom colormapAtom; /* Atom for specifying colormap info to server */ int status; Atom actualType; int actualFormat; unsigned long nitems; unsigned long bytesAfter; struct XColorSharedStruct *theColorShared=NULL; #ifdef DEBUG printf("readSharedColorAtom\n"); #endif /* Create the atom */ colormapAtom = XInternAtom (disp, "VIEW_COLORMAP", True); if (colormapAtom == None) { #ifdef DEBUG printf("ERROR in readSharedColorAtom: XInternAtom returned None (%d)\n", (unsigned int)colormapAtom); #endif cmap = NULL; *lutStart = *nPC = 0; return BadAtom; } status = XGetWindowProperty (disp, root_window, colormapAtom, 0L, 1000L, False, AnyPropertyType, &actualType, &actualFormat, &nitems, &bytesAfter,(unsigned char **)&theColorShared); if ((status == Success) && (theColorShared != NULL)) { *cmap = theColorShared->cmap; *lutStart = theColorShared->lutStart; *nPC = theColorShared->nPC; XFree (theColorShared); theColorShared=NULL; return status; } else { switch (status) { case Success: if (actualType == None) { /* printf ("actualType=None\n"); */ return BadAtom; } break; case BadAtom : printf("bad atom\n"); break; case BadMatch : printf("bad match\n"); break; case BadValue : printf("bad value\n"); break; case BadWindow : printf("bad window\n"); break; default: printf("bad other\n"); break; } /* End of switch (status) */ printf("ERROR in readSharedColorAtom: XGetWindowProperty returned %d\n", status); cmap = NULL; *lutStart = *nPC = 0; return status; } } /* End of readSharedColorAtom */ /* Destroy the shared colormap atom, in preparation to exit the program */ void destroySharedColorAtom(Display *disp) { Atom colormapAtom; /* Atom for specifying colormap info to server */ #ifdef DEBUG printf("destroySharedColorAtom\n"); #endif /* Create the atom */ colormapAtom = XInternAtom (disp, "VIEW_COLORMAP", True); if (colormapAtom == None) { printf("ERROR in destroySharedColorAtom: XInternAtom returned None (%d)\n", (int)colormapAtom); } /* Destroy the property, in preparation to exit */ XDeleteProperty (disp, root_window, colormapAtom); return; } /* End of "destroySharedColorAtom" */ fv5.4/tcltk/pow/Visu_tkImgPict.c0000644000220700001010000044277012153447565016231 0ustar birbylheadev/* * tkImgPict.c -- * * A source file for Pict images * * Copyright (c) 1995 The Regents of the University of California. * * Author: Pierre-Louis Bossart * Date: November 17, 1995 * * Derived from tkImgPhoto.c in the tk4.0b2 distribution * copyrighted as follows: * * Copyright (c) 1994 The Australian National University. * Copyright (c) 1994-1995 Sun Microsystems, Inc. * * Author: Paul Mackerras (paulus@cs.anu.edu.au), * Department of Computer Science, * Australian National University. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ #include "tkpict.h" /* if PLB_SEGMENT is defined, then include the plb_segment include file */ #ifdef PLB_SEGMENT #include "plb_segment.h" int has_plb_segment = 1; #else int has_plb_segment = 0; #endif /* * Hash table used to provide access to Pict images from C code. */ static Tcl_HashTable imgPictHash; static int imgPictHashInitialized; /* set when Tcl_InitHashTable done */ static int ImgPictCreate _ANSI_ARGS_((Tcl_Interp *interp, char *name, int objc, Tcl_Obj *CONST objv[], Tk_ImageType *typePtr, Tk_ImageMaster master, ClientData *clientDataPtr)); static ClientData ImgPictGet _ANSI_ARGS_((Tk_Window tkwin, ClientData clientData)); static void ImgPictDisplay _ANSI_ARGS_((ClientData clientData, Display *display, Drawable drawable, int imageX, int imageY, int width, int height, int drawableX, int drawableY)); static void ImgPictFree _ANSI_ARGS_((ClientData clientData, Display *display)); static void ImgPictDelete _ANSI_ARGS_((ClientData clientData)); Tk_ImageType tkPictImageType = { "pict", /* name */ ImgPictCreate, /* createProc */ ImgPictGet, /* getProc */ ImgPictDisplay, /* displayProc */ ImgPictFree, /* freeProc */ ImgPictDelete, /* deleteProc */ NULL /* nextPtr */ }; /* * List of option names. The order here must match the order of * declarations of the OPT_* constants above. */ static char *optionNames[] = { "-format", "-from", "-shrink", "-subsample", "-to", "-zoom", (char *) NULL }; /* * Information used for parsing configuration specifications: */ static Tk_ConfigSpec configSpecs[] = { {TK_CONFIG_STRING, "-data", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(PictMaster, dataString), TK_CONFIG_NULL_OK}, {TK_CONFIG_STRING, "-format", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(PictMaster, format), TK_CONFIG_NULL_OK}, {TK_CONFIG_STRING, "-file", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(PictMaster, fileString), TK_CONFIG_NULL_OK}, {TK_CONFIG_INT, "-height", (char *) NULL, (char *) NULL, DEF_Pict_HEIGHT, Tk_Offset(PictMaster, userHeight), 0}, {TK_CONFIG_INT, "-width", (char *) NULL, (char *) NULL, DEF_Pict_WIDTH, Tk_Offset(PictMaster, userWidth), 0}, {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL, (char *) NULL, 0, 0} }; /* * Pointer to the first in the list of known Pict image formats. */ static Tk_PictImageFormat *formatList = NULL; /* * Forward declarations */ static int ImgPictCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)); static int ParseSubcommandOptions _ANSI_ARGS_(( struct SubcommandOptions *optPtr, Tcl_Interp *interp, int allowedOptions, int *indexPtr, int argc, const char **argv)); static void ImgPictCmdDeletedProc _ANSI_ARGS_(( ClientData clientData)); static int ImgPictConfigureMaster _ANSI_ARGS_(( Tcl_Interp *interp, PictMaster *masterPtr, int argc, const char **argv, int flags)); static void ImgPictConfigureInstance _ANSI_ARGS_(( PictInstance *instancePtr)); static void ImgPictSetSize _ANSI_ARGS_((PictMaster *masterPtr, int width, int height)); static void ImgPictInstanceSetSize _ANSI_ARGS_(( PictInstance *instancePtr)); static int ImgPictCopy(Tcl_Interp *interp, PictMaster *masterPtr, int argc, const char **argv); static int ImgPictSnap2Photo(Tcl_Interp *interp, PictMaster *masterPtr, int argc, const char **argv); static int ImgPictSnap2Pict(Tcl_Interp *interp, PictMaster *masterPtr, int argc, const char **argv); static int MatchFileFormat _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Channel f, char *fileName, char *formatString, Tk_PictImageFormat **imageFormatPtr, int *widthPtr, int *heightPtr)); static int MatchStringFormat _ANSI_ARGS_((Tcl_Interp *interp, char *string, char *formatString, Tk_PictImageFormat **imageFormatPtr, int *widthPtr, int *heightPtr)); int convert_block_to_byte(void *in, unsigned char *out, int npts, int in_type,double *dispmin, double *dispmax); static int make_colorbar(Tk_PictHandle handle, int width,int height); static void normalize_data(PictMaster *masterPtr); static void get_line_pixels(char *string,unsigned char *img, int nr,int nc,int x1,int y1,int x2,int y2, double min, double max); static int ChangeColorTable(PictMaster *masterPtr); #ifdef PLB_SEGMENT static int ImgPictClip(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv); static int ImgPictThreshold(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv); static int ImgPictSmooth(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv); static int ImgPictGradient(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv); static int ImgPictLaplacian(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv); static int ImgPictZeroCrng(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv); static int ImgPictErosion(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv); static int ImgPictDilation(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv); static int ImgPictCloseHoles(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv); static int ImgPictGetHoles(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv); static int ImgPictDistanceTransform(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv); static int ImgPictLabel(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv); #endif /* *---------------------------------------------------------------------- * * Tk_CreatePictImageFormat -- * * This procedure is invoked by an image file handler to register * a new Pict image format and the procedures that handle the * new format. The procedure is typically invoked during * Tcl_AppInit. * * Results: * None. * * Side effects: * The new image file format is entered into a table used in the * Pict image "read" and "write" subcommands. * *---------------------------------------------------------------------- */ void Tk_CreatePictImageFormat(formatPtr) Tk_PictImageFormat *formatPtr; /* Structure describing the format. All of * the fields except "nextPtr" must be filled * in by caller. Must not have been passed * to Tk_CreatePictImageFormat previously. */ { Tk_PictImageFormat *copyPtr; #ifdef DEBUG printf("Tk_CreatePictImageFormat\n"); #endif copyPtr = (Tk_PictImageFormat *) ckalloc(sizeof(Tk_PictImageFormat)); if(copyPtr == NULL ) { (void)fprintf(stderr,"Tk_CreatePictImageFormat: Could not allocate memory\n"); return; } *copyPtr = *formatPtr; copyPtr->name = (char *) ckalloc((unsigned) (strlen(formatPtr->name) + 1)); if(copyPtr->name == NULL ) { (void)fprintf(stderr,"Tk_CreatePictImageFormat: Could not allocate memory\n"); return; } strcpy(copyPtr->name, formatPtr->name); copyPtr->nextPtr = formatList; formatList = copyPtr; } /* *---------------------------------------------------------------------- * * ImgPictCreate -- * * This procedure is called by the Tk image code to create * a new Pict image. * * Results: * A standard Tcl result. * * Side effects: * The data structure for a new Pict image is allocated and * initialized. * *---------------------------------------------------------------------- */ static int ImgPictCreate(interp, name, objc, objv, typePtr, master, clientDataPtr) Tcl_Interp *interp; /* Interpreter for application containing * image. */ char *name; /* Name to use for image. */ int objc; /* Number of arguments. */ Tcl_Obj *CONST objv[]; /* Argument strings for options (doesn't * include image name or type). */ Tk_ImageType *typePtr; /* Pointer to our type record (not used). */ Tk_ImageMaster master; /* Token for image, to be used by us in * later callbacks. */ ClientData *clientDataPtr; /* Store manager's token for image here; * it will be returned in later callbacks. */ { PictMaster *masterPtr; Tcl_HashEntry *entry; int isNew; int j, argc; const char **argv; #ifdef DEBUG printf("ImgPictCreate\n"); #endif /* Convert Tcl_Objs to char * */ argc = objc; argv = (const char **) ckalloc( argc * sizeof(char *) ); for( j=0; jtkMaster = master; masterPtr->interp = interp; masterPtr->imageCmd = Tcl_CreateCommand(interp, name, ImgPictCmd, (ClientData) masterPtr, ImgPictCmdDeletedProc); masterPtr->data = NULL; masterPtr->bytedata = NULL; masterPtr->instancePtr = NULL; masterPtr->validRegion = XCreateRegion(); masterPtr->dispmax = 0.0; masterPtr->dispmin = 0.0; masterPtr->user_dispmax = 0.0; masterPtr->user_dispmin = 0.0; masterPtr->pixel_x = 1.0; masterPtr->pixel_y = 1.0; /* * Process configuration options given in the image create command. */ if (ImgPictConfigureMaster(interp, masterPtr, argc, argv, 0) != TCL_OK) { ImgPictDelete((ClientData) masterPtr); ckfree( (char*) argv ); return TCL_ERROR; } /* * Enter this Pict image in the hash table. */ if (!imgPictHashInitialized) { Tcl_InitHashTable(&imgPictHash, TCL_STRING_KEYS); imgPictHashInitialized = 1; } entry = Tcl_CreateHashEntry(&imgPictHash, name, &isNew); Tcl_SetHashValue(entry, masterPtr); *clientDataPtr = (ClientData) masterPtr; ckfree( (char*) argv ); return TCL_OK; } /* *---------------------------------------------------------------------- * * ImgPictCmd -- * * This procedure is invoked to process the Tcl command that * corresponds to a Pict image. See the user documentation * for details on what it does. * * Results: * A standard Tcl result. * * Side effects: * See the user documentation. * *---------------------------------------------------------------------- */ static int ImgPictCmd(clientData, interp, argc, argv) ClientData clientData; /* Information about Pict master. */ Tcl_Interp *interp; /* Current interpreter. */ int argc; /* Number of arguments. */ const char **argv; /* Argument strings. */ { PictMaster *masterPtr = (PictMaster *) clientData; int c, x, y; Tk_PictImageBlock block; char string[10000]; Tk_PictHandle srcHandle; size_t length; int pix_int; float pix_float; double pix_double; short *shortPtr; int *intPtr; float *floatPtr; double *doublePtr; int i; #ifdef DEBUG printf("ImgPictCmd\n"); #endif if (argc < 2) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " option ?arg arg ...?\"", (char *) NULL); return TCL_ERROR; } c = argv[1][0]; length = strlen(argv[1]); if ((c == 'b') && (strncmp(argv[1], "blank", length) == 0)) { /* * Pict blank command - just call Tk_PictBlank. */ if (argc == 2) { Tk_PictBlank(masterPtr); } else { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " blank\"", (char *) NULL); return TCL_ERROR; } return TCL_OK; } else if (c == 'c') { if( (strncmp(argv[1], "colorbar", length) == 0)) { make_colorbar((Tk_PictHandle)masterPtr, masterPtr->width,masterPtr->height); return TCL_OK; } else if( (strncmp(argv[1], "cget", length) == 0)) { if (argc != 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " cget option\"", (char *) NULL); return TCL_ERROR; } return Tk_ConfigureValue(interp, Tk_MainWindow(interp), configSpecs, (char *) masterPtr, argv[2], 0); } else if( (strncmp(argv[1], "configure", length) == 0)) { /* * Pict configure command - handle this in the standard way. */ if (argc == 2) { return Tk_ConfigureInfo(interp, Tk_MainWindow(interp), configSpecs, (char *) masterPtr, (char *) NULL, 0); } if (argc == 3) { return Tk_ConfigureInfo(interp, Tk_MainWindow(interp), configSpecs, (char *) masterPtr, argv[2], 0); } return ImgPictConfigureMaster(interp, masterPtr, argc-2, argv+2, TK_CONFIG_ARGV_ONLY); } else if( (strncmp(argv[1], "cmap_level", length) == 0)) { PictInstance *instancePtr; int cmap_level; if (argc != 2 && argc != 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " cmap_level [0|1|2|3] \"", (char *) NULL); return TCL_ERROR; } if( (instancePtr=masterPtr->instancePtr) == NULL ) { Tcl_AppendResult(interp, "No instance and no colors allocated yet", (char *) NULL); return TCL_ERROR; } if (argc == 2) { sprintf(string,"%d",instancePtr->colormap_level); Tcl_AppendResult(interp,string,(char *) NULL); } else { if(Tcl_GetInt(interp, argv[2], &cmap_level) != TCL_OK) { Tcl_AppendResult(interp, "Wrong arguments, should be: \"", argv[0], " cmap_level [0|1|2|3]\"", (char *) NULL); return TCL_ERROR; } if(cmap_level != READ_SHARED_COLORMAP && cmap_level != DEFAULT_SCREEN_COLORMAP && cmap_level != DEFAULT_PRIVATE_COLORMAP && cmap_level != NEW_PRIVATE_COLORMAP ) { Tcl_AppendResult(interp, "Wrong arguments, should be: \"", argv[0], " cmap_level [0|1|2|3]\"", (char *) NULL); return TCL_ERROR; } Private_Colormap = cmap_level; if( ChangeColorTable((PictMaster *)masterPtr) == 0 ) { Tcl_AppendResult(interp, "Could not change colormap level for active window", (char *) NULL); return TCL_ERROR; } } return TCL_OK; } else if( (strncmp(argv[1], "cmap_stretch", length) == 0)) { PictInstance *instancePtr; PictColorTable *colorTable; int cwid,clen; int x_lut[MAX_CLUT_LEN]; int y_lut[MAX_CLUT_LEN]; int i,j; int lut_size, nElem; const char **lutElem; int *p_lut; if( (instancePtr=masterPtr->instancePtr) == NULL ) return TCL_OK; if (argc != 6) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " cmap_stretch [intensity|red|green|blue] cwid clen {x1 y1 x2 y2 ...}\"", (char *) NULL); return TCL_ERROR; } else { colorTable = instancePtr->colorTable; length =strlen(argv[2]); if( (strncmp(argv[2], "intensity", length) == 0)) { p_lut = colorTable->intensity_lut; lut_size = colorTable->ncolors; } else if( (strncmp(argv[2], "red", length) == 0)) { p_lut = colorTable->red_lut; lut_size = MAX_COLORS; } else if( (strncmp(argv[2], "green", length) == 0)) { p_lut = colorTable->green_lut; lut_size = MAX_COLORS; } else if( (strncmp(argv[2], "blue", length) == 0)) { p_lut = colorTable->blue_lut; lut_size = MAX_COLORS; } else { Tcl_AppendResult(interp, "bad lookup table : should be \"", argv[0], " cmap_stretch [intensity|red|green|blue] cwid clen x1 y1 x2 y2 ... \"", (char *) NULL); return TCL_ERROR; } if((Tcl_GetInt(interp, argv[3], &cwid) != TCL_OK) || (Tcl_GetInt(interp, argv[4], &clen) != TCL_OK) ) { Tcl_AppendResult(interp, "bad lookup table : should be \"", argv[0], " cmap_stretch [intensity|red|green|blue] cwid clen {x1 y1 x2 y2 ... }\"", (char *) NULL); return TCL_ERROR; } if( Tcl_SplitList( interp, argv[5], &nElem, &lutElem ) != TCL_OK ) { Tcl_AppendResult(interp, "Error reading LUT", (char*)NULL); return TCL_ERROR; } if( nElem<4 || nElem&0x1 ) { Tcl_SetResult(interp,"LUT must have an even number of elements >= 4", TCL_VOLATILE); ckfree( (char*)lutElem ); return TCL_ERROR; } i = 0; j = 0; while(idisplay, instancePtr->colormap, colorTable->ncolors, colorTable->lut_start, instancePtr->has_overlay, colorTable->red,colorTable->green,colorTable->blue, colorTable->intensity_lut, colorTable->red_lut,colorTable->green_lut, colorTable->blue_lut); return TCL_OK; } } else if (strncmp(argv[1], "cmap_threshold", length) == 0) { double loval,hival; PictInstance *instancePtr; PictColorTable *colorTable; if (argc != 4) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " cmap_threshold x y\"", (char *) NULL); return TCL_ERROR; } if ((Tcl_GetDouble(interp, argv[2], &loval) != TCL_OK) || (Tcl_GetDouble(interp, argv[3], &hival) != TCL_OK)) { return TCL_ERROR; } if( masterPtr->instancePtr == NULL ) return TCL_OK; instancePtr = masterPtr->instancePtr; colorTable = instancePtr->colorTable; loval = (double)(loval - masterPtr->dispmin) * (double)(colorTable->ncolors) / (double)(masterPtr->dispmax - masterPtr->dispmin); hival = (hival - masterPtr->dispmin) * (double)(colorTable->ncolors) / (double)(masterPtr->dispmax - masterPtr->dispmin); lut_thres(instancePtr->display, instancePtr->colormap, colorTable->ncolors, colorTable->lut_start, instancePtr->has_overlay, floor(loval),ceil(hival), colorTable->red,colorTable->green,colorTable->blue, colorTable->intensity_lut, colorTable->red_lut,colorTable->green_lut, colorTable->blue_lut); return TCL_OK; } else if ( (strncmp(argv[1], "colormap", length) == 0)) { /* * Pict colormap command - first parse and check parameters. */ PictInstance *instancePtr; PictColorTable *colorTable; void (*f)(Display *display,Colormap cmap, int ncolors,int lut_start,char overlay, int *red,int *green,int *blue, int *intensity_lut,int *red_lut,int *green_lut, int *blue_lut); if (argc != 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " colormap cmap\"", (char *) NULL); return TCL_ERROR; } instancePtr = masterPtr->instancePtr; if( instancePtr == NULL ) return TCL_OK; colorTable = instancePtr->colorTable; if(strcmp(argv[2], "gray") == 0) f = gray; else if(strcmp(argv[2], "blkbdy") == 0) f = blkbdy; else if(strcmp(argv[2], "hot") == 0) f = hot; else if(strcmp(argv[2], "cold") == 0) f= cold; else if(strcmp(argv[2], "hls") == 0) f = hls; else if(strcmp(argv[2], "rgb") == 0) f = rgb; else if(strcmp(argv[2], "invert") == 0) f = invert_cmap; else if(strcmp(argv[2], "random") == 0) f = randwalk_spectrum; else if(strcmp(argv[2], "bowlerhat") == 0) f = bowlerhat; else if(strcmp(argv[2], "tophat") == 0) f = tophat; else if(strcmp(argv[2], "hatgray") == 0) f = hatgray; else if(strcmp(argv[2], "hatct") == 0) f = hatct; else if(strcmp(argv[2], "gray-ramp2") == 0) f = gray_ramp2; else if(strcmp(argv[2], "gray-ramp4") == 0) f = gray_ramp4; else if(strcmp(argv[2], "gray-step4") == 0) f = gray_step4; else if(strcmp(argv[2], "gray-step8") == 0) f = gray_step8; else if(strcmp(argv[2], "bgr-step") == 0) f = bgr_step; else if(strcmp(argv[2], "bgr-ramp") == 0) f = bgr_ramp; else if(strcmp(argv[2], "bgr-step2") == 0) f = bgr_step2; else if(strcmp(argv[2], "bgr-ramp2") == 0) f = bgr_ramp2; else if(strcmp(argv[2], "rygcbm-ramp") == 0) f = rygcbm_ramp; else if(strcmp(argv[2], "rygcbm-step") == 0) f = rygcbm_step; else if(strcmp(argv[2], "spectrum") == 0) f = spectrum2; else if(strcmp(argv[2], "inv_spec") == 0) f = inv_spec; else if(strcmp(argv[2], "color1") == 0) f = color1_lut; else if(strcmp(argv[2], "color2") == 0) f = color2_lut; else if(strcmp(argv[2], "color3") == 0) f = color3_lut; else { /* Try to find a user-specified cmap... */ char scrtch[200]; Tcl_Obj *lut; sprintf(scrtch,"cmapLUT_%s,powDef",argv[2]); lut = Tcl_ObjGetVar2(interp, Tcl_NewStringObj("powImageParam",-1), Tcl_NewStringObj(scrtch,-1), TCL_GLOBAL_ONLY); if( lut==NULL ) { sprintf(scrtch,"Unable to locate LUT for %s\n",argv[2]); Tcl_SetResult(interp,scrtch,TCL_VOLATILE); return TCL_ERROR; } return customCmap(instancePtr->display, instancePtr->colormap, colorTable->ncolors, colorTable->lut_start, instancePtr->has_overlay, colorTable->red,colorTable->green,colorTable->blue, colorTable->intensity_lut, colorTable->red_lut,colorTable->green_lut, colorTable->blue_lut, interp, lut); } (*f)(instancePtr->display, instancePtr->colormap, colorTable->ncolors, colorTable->lut_start, instancePtr->has_overlay, colorTable->red,colorTable->green,colorTable->blue, colorTable->intensity_lut, colorTable->red_lut,colorTable->green_lut,colorTable->blue_lut); return TCL_OK; } else if( (strncmp(argv[1], "copy", length) == 0)) { return ImgPictCopy(interp,masterPtr,argc,argv); } #ifdef PLB_SEGMENT else if ( (strncmp(argv[1], "clip", length) == 0)) { return ImgPictClip(interp,masterPtr,argc,argv); } else if ( (strncmp(argv[1], "close_holes", length) == 0)) { return ImgPictCloseHoles(interp,masterPtr,argc,argv); } else if (strncmp(argv[1], "convert", length) == 0) { PictMaster *srcMasterPtr; void *buff; int npts; int datatype,datasize; if(argc!=5) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " convert srcImg -type [byte|short|int|float] \"", (char *) NULL); return TCL_ERROR; } length = strlen(argv[3]); if (strncmp(argv[3], "-type", length) != 0) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " convert srcImg -type [byte|short|int|float]\"", (char *) NULL); return TCL_ERROR; } length = strlen(argv[4]); if ((strncmp(argv[4], "byte", length) != 0) && (strncmp(argv[4], "short", length) != 0) && (strncmp(argv[4], "int", length) != 0) && (strncmp(argv[4], "float", length) != 0)) { Tcl_AppendResult(interp, "bad type : should be \"", argv[0], " convert srcImg -type [byte|short|int|float]\"", (char *) NULL); return TCL_ERROR; } if ((srcHandle = Tk_FindPict(argv[2])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } srcMasterPtr = (PictMaster *)srcHandle; /* set new type */ if (strcmp(argv[4],"byte") == 0) { datatype = BYTE; datasize = sizeof(unsigned char); } else if(strcmp(argv[4],"short") == 0) { datatype = WORD; datasize = sizeof(short); } else if(strcmp(argv[4],"int") == 0) { datatype = LWORD; datasize = sizeof(int); } else if(strcmp(argv[4],"float") == 0) { datatype = REAL; datasize = sizeof(float); } else if(strcmp(argv[4],"double") == 0) { datatype = DOUBLE; datasize = sizeof(double); } else { Tcl_AppendResult(interp, argv[0], " convert : ", "unknown data type", (char *) NULL); return TCL_ERROR; } /* allocate memory */ npts = (srcMasterPtr->width)*(srcMasterPtr->height); buff = (void*)ckalloc(npts*datasize); if( buff == NULL ) { Tcl_AppendResult(interp, "Cannot allocate memory for conversion", (char*)NULL); return TCL_ERROR; } /* convert data */ lconvert_types(npts,(void*)srcMasterPtr->data, srcMasterPtr->datatype, (void*)buff,datatype); /* set image size */ Tk_PictExpand(masterPtr,srcMasterPtr->width,srcMasterPtr->height); /* initialize block */ block.pixelPtr = (unsigned char*)buff; block.width = srcMasterPtr->width; block.height = srcMasterPtr->height; block.pitch = block.width; block.pixelSize = datasize; block.datatype = datatype; block.pixel_x = srcMasterPtr->pixel_x; block.pixel_y = srcMasterPtr->pixel_y; block.copy = NO_COPY; block.skip = 0; Tk_PictPutBlock(masterPtr,&block,0,0, masterPtr->width,masterPtr->height); return TCL_OK; } #endif } #ifdef PLB_SEGMENT else if(c=='d') { if ( (strncmp(argv[1], "dilation", length) == 0)) { return ImgPictDilation(interp,masterPtr,argc,argv); } else if(strncmp(argv[1], "dt", length) == 0) { return ImgPictDistanceTransform(interp,masterPtr,argc,argv); } } else if(c=='e') { if ( (strncmp(argv[1], "erosion", length) == 0)) { return ImgPictErosion(interp,masterPtr,argc,argv); } } #endif else if (c == 'g') { if( (strncmp(argv[1], "get", length) == 0)) { /* * Pict get command - first parse and check parameters. */ if (argc != 4) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " get x y\"", (char *) NULL); return TCL_ERROR; } if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) || (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) { return TCL_ERROR; } if ((x < 0) || (x >= masterPtr->width) || (y < 0) || (y >= masterPtr->height)) { Tcl_AppendResult(interp, argv[0], " get: ", "coordinates out of range", (char *) NULL); return TCL_ERROR; } /* * Extract the value of the desired pixel and format it as a string. */ switch(masterPtr->datatype) { case BYTE: pix_int = (masterPtr->bytedata)[y * masterPtr->width + x]; sprintf(string, "%d", pix_int); break; case WORD: shortPtr = (short*)masterPtr->data; pix_int = shortPtr[y * masterPtr->width + x]; sprintf(string, "%d", pix_int); break; case LWORD: intPtr = (int*)masterPtr->data; pix_int = intPtr[y * masterPtr->width + x]; sprintf(string, "%d", pix_int); break; case REAL: floatPtr = (float*)masterPtr->data; pix_float = floatPtr[y* masterPtr->width + x]; sprintf(string, "%.5g", pix_float); break; case DOUBLE: doublePtr = (double*)masterPtr->data; pix_double = doublePtr[y* masterPtr->width + x]; sprintf(string, "%.5g", pix_double); break; default: Tcl_AppendResult(interp, argv[0], " get: ", "unknown data type", (char *) NULL); return TCL_ERROR; } Tcl_SetResult(interp,string,TCL_VOLATILE); return TCL_OK; } else if( (strncmp(argv[1], "getline", length) == 0)) { int x0,y0,x1,y1; /* * Pict get command - first parse and check parameters. */ if (argc != 6) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " getline x0 y0 x1 y1\"", (char *) NULL); return TCL_ERROR; } if((Tcl_GetInt(interp, argv[2], &x0) != TCL_OK) || (Tcl_GetInt(interp, argv[3], &y0) != TCL_OK) || (Tcl_GetInt(interp, argv[4], &x1) != TCL_OK) || (Tcl_GetInt(interp, argv[5], &y1) != TCL_OK)) { Tcl_AppendResult(interp, argv[0], " getline: ", "parameters out of range", (char *) NULL); return TCL_ERROR; } sprintf(string,""); get_line_pixels(string,masterPtr->bytedata, masterPtr->height, masterPtr->width, x0,y0,x1,y1, masterPtr->dispmin, masterPtr->dispmax); Tcl_AppendResult(interp, string, (char *) NULL); return TCL_OK; } else if( (strncmp(argv[1], "getmin", length) == 0)) { sprintf(string,"%.5g",masterPtr->dispmin); Tcl_AppendResult(interp, string, (char *) NULL); return TCL_OK; } else if( (strncmp(argv[1], "getmax", length) == 0)) { sprintf(string,"%.5g",masterPtr->dispmax); Tcl_AppendResult(interp, string, (char *) NULL); return TCL_OK; } #ifdef PLB_SEGMENT else if( (strncmp(argv[1], "get_holes", length) == 0)) { return ImgPictGetHoles(interp,masterPtr,argc,argv); } else if( (strncmp(argv[1], "gradient", length) == 0)) { return ImgPictGradient(interp,masterPtr,argc,argv); } #endif } else if(c== 'h') { if( strncmp(argv[1], "histogram", length) == 0 ) { int hist[256]; char string1[256]; int size; unsigned char *ptr; size = (masterPtr->width)*(masterPtr->height); /* clear histogram */ for (i = 0; i < 256; i++) hist[i] = 0; /* fill histogram */ ptr = masterPtr->bytedata; for (i = 0;i < size; i++) hist[(*ptr++)]++; /* format output string */ sprintf(string,""); for(i=0;i<256;i++) { sprintf(string1,"%g ",((double)i/(double)(MAX_COLORS-1.0)* (masterPtr->dispmax-masterPtr->dispmin)) +masterPtr->dispmin); strcat(string,string1); sprintf(string1,"%d ",hist[i]); strcat(string,string1); } Tcl_AppendResult(interp, string, (char *) NULL); return TCL_OK; } } #ifdef PLB_SEGMENT else if( c=='l') { if(strncmp(argv[1], "label", length) == 0) { return ImgPictLabel(interp,masterPtr,argc,argv); } else if(strncmp(argv[1], "laplacian", length) == 0) { return ImgPictLaplacian(interp,masterPtr,argc,argv); } } #endif else if ((c == 'r') && (strncmp(argv[1], "range", length) == 0)) { double dispmax; double dispmin; PictInstance *instancePtr; if (argc != 4) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " range x y\"", (char *) NULL); return TCL_ERROR; } if((Tcl_GetDouble(interp, argv[2], &dispmin) != TCL_OK) || (Tcl_GetDouble(interp, argv[3], &dispmax) != TCL_OK)) return TCL_ERROR; masterPtr->user_dispmax = dispmax; masterPtr->user_dispmin = dispmin; normalize_data(masterPtr); /* * Update each instance. */ for(instancePtr = masterPtr->instancePtr; instancePtr != NULL; instancePtr = instancePtr->nextPtr) DitherInstance(instancePtr, 0, 0, instancePtr->width, instancePtr->height); /* * Tell the core image code that this image has changed. */ Tk_ImageChanged(masterPtr->tkMaster,0,0, masterPtr-> width, masterPtr->height, masterPtr->width, masterPtr->height); return TCL_OK; } else if (c == 'r') { if( (strncmp(argv[1], "redither", length) == 0)) { if (argc == 2) { PictInstance *instancePtr; for (instancePtr = masterPtr->instancePtr; instancePtr != NULL; instancePtr = instancePtr->nextPtr) { DitherInstance(instancePtr, 0, 0, instancePtr->width,instancePtr->height); } i++; Tk_ImageChanged(masterPtr->tkMaster, 0, 0, masterPtr->width, masterPtr->height, masterPtr->width, masterPtr->height); } else { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " redither\"", (char *) NULL); return TCL_ERROR; } return TCL_OK; } else if( (strncmp(argv[1], "rxsize", length) == 0)) { if (argc == 2) { sprintf(string,"%g",masterPtr->pixel_x); Tcl_AppendResult(interp, string, (char *) NULL); } else { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " rxsize\"", (char *) NULL); return TCL_ERROR; } return TCL_OK; } else if( (strncmp(argv[1], "rysize", length) == 0)) { if (argc == 2) { sprintf(string,"%g",masterPtr->pixel_y); Tcl_AppendResult(interp, string, (char *) NULL); } else { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " rysize\"", (char *) NULL); return TCL_ERROR; } return TCL_OK; } } else if (c == 's') { if( (strncmp(argv[1], "snap2photo", length) == 0)) { return ImgPictSnap2Photo(interp,masterPtr,argc,argv); } else if( (strncmp(argv[1], "snap2pict", length) == 0)) { return ImgPictSnap2Pict(interp,masterPtr,argc,argv); } #ifdef PLB_SEGMENT else if( (strncmp(argv[1], "smooth", length) == 0)) { return ImgPictSmooth(interp,masterPtr,argc,argv); } else if( (strncmp(argv[1], "snake", length) == 0)) { return ImgPictSnakeCmd(masterPtr,interp,argc,argv); } #endif } else if ( c == 't') { #ifdef PLB_SEGMENT if (strncmp(argv[1], "threshold", length) == 0) { return ImgPictThreshold(interp,masterPtr,argc,argv); } /* end threshold */ else #endif if (strncmp(argv[1], "thres_isodata", length) == 0) { int hist[256]; int size; unsigned char *ptr; double t1,t2,g1,g2; int i,jt,it; int n = 256; double scale; if( argc != 2 ) { Tcl_AppendResult(interp," wrong # of arguments: should be ",argv[0], " thres_isodata ",(char *) NULL); return TCL_ERROR; } size = (masterPtr->width)*(masterPtr->height); /* clear histogram */ for (i = 0; i < n; i++) hist[i] = 0; /* fill histogram */ ptr = masterPtr->bytedata; for (i = 0;i < size; i++) hist[(*ptr++)]++; /* find threshold width isodata algorithm */ jt = -1; do { it = jt; for (t1 = g1 = 0.0, i = 0; i < it; i++) { t1 += hist[i]; g1 += hist[i] * ((double)i); } g1 = (t1 == 0.0 ? 0.0 : g1/t1); for (t2 = g2 = 0.0; i < n; i++) { t2 += hist[i]; g2 += hist[i] * ((double)i); } g2 = (t2 == 0.0 ? (it-1) : g2/t2); jt = (jt == -1 ? g2 + 1 : (g1 + g2)/2 + 1); } while (jt != it); scale = (masterPtr->dispmax-masterPtr->dispmin)/255.0; if( masterPtr->datatype != REAL && masterPtr->datatype != DOUBLE) sprintf(string,"%d",(int)((double)jt*scale + masterPtr->dispmin)); else sprintf(string,"%g",(double)jt*scale + masterPtr->dispmin); Tcl_AppendResult(interp, string, (char *) NULL); return TCL_OK; } /* end thres_isodata */ else if( strncmp(argv[1],"type",length) == 0) { if(argc!=2) { Tcl_AppendResult(interp," Wrong number of arguments, should be ", argv[0]," type",(char*)NULL); return TCL_ERROR; } switch(masterPtr->datatype) { case BYTE: Tcl_SetResult(interp,"byte",TCL_VOLATILE); break; case WORD: Tcl_SetResult(interp,"short",TCL_VOLATILE); break; case LWORD: Tcl_SetResult(interp,"int",TCL_VOLATILE); break; case REAL: Tcl_SetResult(interp,"float",TCL_VOLATILE); break; case DOUBLE: Tcl_SetResult(interp,"double",TCL_VOLATILE); break; default: Tcl_AppendResult(interp, argv[0], " type: ", "unknown data type", (char *) NULL); return TCL_ERROR; } return TCL_OK; } } /* endif c == 't' */ else if (c == 'w') { } #ifdef PLB_SEGMENT else if( c=='z') { if(strncmp(argv[1], "zero_crossings", length) == 0) { return ImgPictZeroCrng(interp,masterPtr,argc,argv); } } #endif /* If this point is reached, issue error message and list of commands */ #ifdef PLB_SEGMENT Tcl_AppendResult(interp, "bad option \"", argv[1], "\": must be blank, configure, cget, cmap_stretch,", "cmap_threshold, colorbar, colormap, copy, clip, convert," "erosion, dt, dilation, get,getline, getmin, getmax," "gradient, histogram, label, laplacian, overlay," "range,read, rdbinary, redither, snap2photo, snap2pict", "smooth, threshold, type, write, wrbinary, zero_crng", (char *) NULL); #else Tcl_AppendResult(interp, "bad option \"", argv[1], "\": must be blank, configure, cget, cmap_stretch,", "cmap_threshold, colorbar, colormap, copy, get,", "getline, getmin, getmax, histogram, overlay, range,", "read, rdbinary, redither, snap2photo, snap2pict, type, write,wrbinary", (char *) NULL); #endif return TCL_ERROR; } /* *---------------------------------------------------------------------- * * ParseSubcommandOptions -- * * This procedure is invoked to process one of the options * which may be specified for the Pict image subcommands, * namely, -from, -to, -zoom, -subsample, -format, and -shrink. * * Results: * A standard Tcl result. * * Side effects: * Fields in *optPtr get filled in. * *---------------------------------------------------------------------- */ static int ParseSubcommandOptions(optPtr, interp, allowedOptions, optIndexPtr, argc, argv) struct SubcommandOptions *optPtr; /* Information about the options specified * and the values given is returned here. */ Tcl_Interp *interp; /* Interpreter to use for reporting errors. */ int allowedOptions; /* Indicates which options are valid for * the current command. */ int *optIndexPtr; /* Points to a variable containing the * current index in argv; this variable is * updated by this procedure. */ int argc; /* Number of arguments in argv[]. */ const char **argv; /* Arguments to be parsed. */ { int index, c, bit, currentBit; size_t length; char *option, **listPtr; int values[4]; int numValues, maxValues, argIndex; #ifdef DEBUG printf("ParseSubcommandOptions\n"); #endif for (index = *optIndexPtr; index < argc; *optIndexPtr = ++index) { /* * We can have one value specified without an option; * it goes into optPtr->name. */ option = argv[index]; if (option[0] != '-') { if (optPtr->name == NULL) { optPtr->name = option; continue; } break; } /* * Work out which option this is. */ length = strlen(option); c = option[0]; bit = 0; currentBit = 1; for (listPtr = optionNames; *listPtr != NULL; ++listPtr) { if ((c == *listPtr[0]) && (strncmp(option, *listPtr, length) == 0)) { if (bit != 0) { bit = 0; /* An ambiguous option. */ break; } bit = currentBit; } currentBit <<= 1; } /* * If this option is not recognized and allowed, put * an error message in the interpreter and return. */ if ((allowedOptions & bit) == 0) { Tcl_AppendResult(interp, "unrecognized option \"", argv[index], "\": must be ", (char *)NULL); bit = 1; for (listPtr = optionNames; *listPtr != NULL; ++listPtr) { if ((allowedOptions & bit) != 0) { if ((allowedOptions & (bit - 1)) != 0) { Tcl_AppendResult(interp, ", ", (char *) NULL); if ((allowedOptions & ~((bit << 1) - 1)) == 0) { Tcl_AppendResult(interp, "or ", (char *) NULL); } } Tcl_AppendResult(interp, *listPtr, (char *) NULL); } bit <<= 1; } return TCL_ERROR; } /* * For the -from, -to, -zoom and -subsample options, * parse the values given. Report an error if too few * or too many values are given. */ if ((bit != OPT_SHRINK) && (bit != OPT_FORMAT)) { maxValues = ((bit == OPT_FROM) || (bit == OPT_TO))? 4: 2; argIndex = index + 1; for (numValues = 0; numValues < maxValues; ++numValues) { if ((argIndex < argc) && (isdigit(UCHAR(argv[argIndex][0])) || ((argv[argIndex][0] == '-') && (isdigit(UCHAR(argv[argIndex][1])))))) { if (Tcl_GetInt(interp, argv[argIndex], &values[numValues]) != TCL_OK) { return TCL_ERROR; } } else { break; } ++argIndex; } if (numValues == 0) { Tcl_AppendResult(interp, "the \"", argv[index], "\" option ", "requires one ", maxValues == 2? "or two": "to four", " integer values", (char *) NULL); return TCL_ERROR; } *optIndexPtr = (index += numValues); /* * Y values default to the corresponding X value if not specified. */ if (numValues == 1) { values[1] = values[0]; } if (numValues == 3) { values[3] = values[2]; } /* * Check the values given and put them in the appropriate * field of the SubcommandOptions structure. */ switch (bit) { case OPT_FROM: if ((values[0] < 0) || (values[1] < 0) || ((numValues > 2) && ((values[2] < 0) || (values[3] < 0)))) { Tcl_AppendResult(interp, "value(s) for the -from", " option must be non-negative", (char *) NULL); return TCL_ERROR; } if (numValues <= 2) { optPtr->fromX = values[0]; optPtr->fromY = values[1]; optPtr->fromX2 = -1; optPtr->fromY2 = -1; } else { optPtr->fromX = MIN(values[0], values[2]); optPtr->fromY = MIN(values[1], values[3]); optPtr->fromX2 = MAX(values[0], values[2]); optPtr->fromY2 = MAX(values[1], values[3]); } break; case OPT_SUBSAMPLE: optPtr->subsampleX = values[0]; optPtr->subsampleY = values[1]; break; case OPT_TO: if ((values[0] < 0) || (values[1] < 0) || ((numValues > 2) && ((values[2] < 0) || (values[3] < 0)))) { Tcl_AppendResult(interp, "value(s) for the -to", " option must be non-negative", (char *) NULL); return TCL_ERROR; } if (numValues <= 2) { optPtr->toX = values[0]; optPtr->toY = values[1]; optPtr->toX2 = -1; optPtr->toY2 = -1; } else { optPtr->toX = MIN(values[0], values[2]); optPtr->toY = MIN(values[1], values[3]); optPtr->toX2 = MAX(values[0], values[2]); optPtr->toY2 = MAX(values[1], values[3]); } break; case OPT_ZOOM: if ((values[0] <= 0) || (values[1] <= 0)) { Tcl_AppendResult(interp, "value(s) for the -zoom", " option must be positive", (char *) NULL); return TCL_ERROR; } optPtr->zoomX = values[0]; optPtr->zoomY = values[1]; break; } } else if (bit == OPT_FORMAT) { /* * The -format option takes a single string value. */ if (index + 1 < argc) { *optIndexPtr = ++index; optPtr->format = argv[index]; } else { Tcl_AppendResult(interp, "the \"-format\" option ", "requires a value", (char *) NULL); return TCL_ERROR; } } /* * Remember that we saw this option. */ optPtr->options |= bit; } return TCL_OK; } /* *---------------------------------------------------------------------- * * ImgPictConfigureMaster -- * * This procedure is called when a Pict image is created or * reconfigured. It processes configuration options and resets * any instances of the image. * * Results: * A standard Tcl return value. If TCL_ERROR is returned then * an error message is left in masterPtr->interp->result. * * Side effects: * Existing instances of the image will be redisplayed to match * the new configuration options. * *---------------------------------------------------------------------- */ static int ImgPictConfigureMaster(interp, masterPtr, argc, argv, flags) Tcl_Interp *interp; /* Interpreter to use for reporting errors. */ PictMaster *masterPtr; /* Pointer to data structure describing * overall Pict image to (re)configure. */ int argc; /* Number of entries in argv. */ const char **argv; /* Pairs of configuration options for image. */ int flags; /* Flags to pass to Tk_ConfigureWidget, * such as TK_CONFIG_ARGV_ONLY. */ { PictInstance *instancePtr; char *oldFileString, *oldDataString, *realFileName; int result; Tcl_Channel f; Tk_PictImageFormat *imageFormat; int imageWidth, imageHeight; Tcl_DString buffer; #ifdef DEBUG printf("ImgPictConfigureMaster\n"); #endif /* * Save the current values for fileString and dataString, so we * can tell if the user specifies them anew. */ oldFileString = masterPtr->fileString; oldDataString = (oldFileString == NULL)? masterPtr->dataString: NULL; /* * Process the configuration options specified. */ if (Tk_ConfigureWidget(interp, Tk_MainWindow(interp), configSpecs, argc, argv, (char *) masterPtr, flags) != TCL_OK) { return TCL_ERROR; } /* * Regard the empty string for -file, -data or -format as the null * value. */ if ((masterPtr->fileString != NULL) && (masterPtr->fileString[0] == 0)) { ckfree(masterPtr->fileString); masterPtr->fileString = NULL; } if ((masterPtr->dataString != NULL) && (masterPtr->dataString[0] == 0)) { ckfree(masterPtr->dataString); masterPtr->dataString = NULL; } if ((masterPtr->format != NULL) && (masterPtr->format[0] == 0)) { ckfree(masterPtr->format); masterPtr->format = NULL; } /* * Set the image to the user-requested size, if any, * and make sure storage is correctly allocated for this image. */ ImgPictSetSize(masterPtr, masterPtr->width, masterPtr->height); /* * Read in the image from the file or string if the user has * specified the -file or -data option. */ if ((masterPtr->fileString != NULL) && (masterPtr->fileString != oldFileString)) { realFileName = Tcl_TildeSubst(interp, masterPtr->fileString, &buffer); if (realFileName == NULL) { Tcl_AppendResult(interp, "No filename specified",(char*)NULL); return TCL_ERROR; } f = Tcl_OpenFileChannel(interp, realFileName, "r", 0); Tcl_DStringFree(&buffer); if (f == NULL) { Tcl_AppendResult(interp, "couldn't read image file \"", masterPtr->fileString, "\": ", Tcl_PosixError(interp), (char *) NULL); return TCL_ERROR; } if (MatchFileFormat(interp, f, masterPtr->fileString, masterPtr->format, &imageFormat, &imageWidth, &imageHeight) != TCL_OK) { Tcl_Close(interp, f); return TCL_ERROR; } ImgPictSetSize(masterPtr, imageWidth, imageHeight); result = (*imageFormat->fileReadProc)(interp, f, masterPtr->fileString, Tcl_NewStringObj( masterPtr->format, -1 ), (Tk_PictHandle) masterPtr, 0, 0, imageWidth, imageHeight, 0, 0); Tcl_Close(interp,f); if (result != TCL_OK) { return TCL_ERROR; } masterPtr->flags |= IMAGE_CHANGED; } if ((masterPtr->fileString == NULL) && (masterPtr->dataString != NULL) && (masterPtr->dataString != oldDataString)) { if (MatchStringFormat(interp, masterPtr->dataString, masterPtr->format, &imageFormat, &imageWidth, &imageHeight) != TCL_OK) { return TCL_ERROR; } ImgPictSetSize(masterPtr, imageWidth, imageHeight); if ((*imageFormat->stringReadProc)(interp, Tcl_NewStringObj( masterPtr->dataString, -1 ), Tcl_NewStringObj( masterPtr->format, -1 ), (Tk_PictHandle) masterPtr, 0, 0, imageWidth, imageHeight, 0, 0) != TCL_OK) { return TCL_ERROR; } masterPtr->flags |= IMAGE_CHANGED; } /* * Cycle through all of the instances of this image, regenerating * the information for each instance. Then force the image to be * redisplayed everywhere that it is used. */ for (instancePtr = masterPtr->instancePtr; instancePtr != NULL; instancePtr = instancePtr->nextPtr) { ImgPictConfigureInstance(instancePtr); } /* * Inform the generic image code that the image * has (potentially) changed. */ Tk_ImageChanged(masterPtr->tkMaster, 0, 0, masterPtr->width, masterPtr->height, masterPtr->width, masterPtr->height); masterPtr->flags &= ~IMAGE_CHANGED; return TCL_OK; } /* *---------------------------------------------------------------------- * * ImgPictConfigureInstance -- * * This procedure is called to create displaying information for * a Pict image instance based on the configuration information * in the master. It is invoked both when new instances are * created and when the master is reconfigured. * * Results: * None. * * Side effects: * Generates errors via Tk_BackgroundError if there are problems * in setting up the instance. * *---------------------------------------------------------------------- */ static void ImgPictConfigureInstance(instancePtr) PictInstance *instancePtr; /* Instance to reconfigure. */ { PictMaster *masterPtr = instancePtr->masterPtr; Display *disp; XImage *imagePtr; int bitsPerPixel; XRectangle validBox; int new_image = 0; #ifdef DEBUG printf("ImgPictConfigureInstance\n"); #endif /* * Create a new XImage structure for sending data to * the X server, if necessary. */ disp = instancePtr->display; bitsPerPixel = instancePtr->visualInfo.depth; if ((instancePtr->imagePtr == NULL) || (instancePtr->imagePtr->bits_per_pixel != bitsPerPixel)) { new_image = 1; if (instancePtr->imagePtr != NULL) { XFree((char *) instancePtr->imagePtr); } imagePtr = XCreateImage(disp, instancePtr->visualInfo.visual, (unsigned) bitsPerPixel, (bitsPerPixel > 1? ZPixmap: XYBitmap), 0, (char *) NULL, 1, 1, 32, 0); instancePtr->imagePtr = imagePtr; /* * Determine the endianness of this machine. * We create images using the local host's endianness, rather * than the endianness of the server; otherwise we would have * to byte-swap any 16 or 32 bit values that we store in the * image in those situations where the server's endianness * is different from ours. */ if (imagePtr != NULL) { union { int i; char c[sizeof(int)]; } kludge; imagePtr->bitmap_unit = sizeof(pixel) * NBBY; kludge.i = 0; kludge.c[0] = 1; imagePtr->byte_order = (kludge.i == 1) ? LSBFirst : MSBFirst; _XInitImageFuncPtrs(imagePtr); } } /* * If the user has specified a width and/or height for the master * which is different from our current width/height, set the size * to the values specified by the user. If we have no pixmap, we * do this also, since it has the side effect of allocating a * pixmap for us. */ if ((instancePtr->pixels == None) || (instancePtr->width != masterPtr->width) || (instancePtr->height != masterPtr->height)) { ImgPictInstanceSetSize(instancePtr); } /* * Redither this instance if necessary. */ if ((masterPtr->flags & IMAGE_CHANGED) || (new_image == 1)) { XClipBox(masterPtr->validRegion, &validBox); if ((validBox.width > 0) && (validBox.height > 0)) { DitherInstance(instancePtr, validBox.x, validBox.y, validBox.width, validBox.height); } } } /* *---------------------------------------------------------------------- * * ImgPictGet -- * * This procedure is called for each use of a Pict image in a * widget. * * Results: * The return value is a token for the instance, which is passed * back to us in calls to ImgPictDisplay and ImgPictFree. * * Side effects: * A data structure is set up for the instance (or, an existing * instance is re-used for the new one). * *---------------------------------------------------------------------- */ static ClientData ImgPictGet(tkwin, masterData) Tk_Window tkwin; /* Window in which the instance will be * used. */ ClientData masterData; /* Pointer to our master structure for the * image. */ { PictMaster *masterPtr = (PictMaster *) masterData; PictInstance *instancePtr; PictColorTable *colorTable; XVisualInfo *visInfoPtr; XRectangle validBox; XColor *white, *black; XGCValues gcValues; #ifdef DEBUG printf("ImgPictGet\n"); #endif if( GetColorTable(tkwin,(PictColorTable **)&colorTable,(XVisualInfo **)&visInfoPtr) == 0 ) { fprintf(stderr," GetColorTable failed \n"); return 0; } /* * Make a new instance of the image. */ instancePtr = (PictInstance *) ckalloc(sizeof(PictInstance)); if(instancePtr == NULL) { (void)fprintf(stderr,"ImgPictGet: Could not allocate memory\n"); return 0; } instancePtr->tkwin = tkwin; instancePtr->masterPtr = masterPtr; instancePtr->display = colorTable->display; instancePtr->colormap = colorTable->colormap; instancePtr->colormap_level = colorTable->colormap_level; instancePtr->has_overlay = 0; instancePtr->refCount = 1; instancePtr->pixels = None; instancePtr->width = 0; instancePtr->height = 0; instancePtr->imagePtr = 0; instancePtr->colorTable = colorTable; instancePtr->nextPtr = masterPtr->instancePtr; masterPtr->instancePtr = instancePtr; instancePtr->visualInfo = *visInfoPtr; XFree(visInfoPtr); /* * Make a GC with background = black and foreground = white. */ white = Tk_GetColor(masterPtr->interp, tkwin, "white"); black = Tk_GetColor(masterPtr->interp, tkwin, "black"); gcValues.foreground = (white != NULL)? white->pixel: WhitePixelOfScreen(Tk_Screen(tkwin)); gcValues.background = (black != NULL)? black->pixel: BlackPixelOfScreen(Tk_Screen(tkwin)); gcValues.graphics_exposures = False; instancePtr->gc = Tk_GetGC(tkwin, GCForeground|GCBackground|GCGraphicsExposures, &gcValues); instancePtr->setgc = GXcopy; /* Set configuration options and finish the initialization of the instance. */ ImgPictConfigureInstance(instancePtr); /* If this is the first instance, must set the size of the image. */ if (instancePtr->nextPtr == NULL) { Tk_ImageChanged(masterPtr->tkMaster, 0, 0, 0, 0, masterPtr->width, masterPtr->height); } /* If we have no pixmap, we do this also, since it has the side effect of allocating a pixmap for us. */ if (instancePtr->pixels == None) { XClipBox(masterPtr->validRegion, &validBox); if ((validBox.width > 0) && (validBox.height > 0)) { DitherInstance(instancePtr, validBox.x, validBox.y, validBox.width, validBox.height); } } return (ClientData) instancePtr; } /* end ImgPictGet */ /* *---------------------------------------------------------------------- * * ImgPictDisplay -- * * This procedure is invoked to draw a Pict image. * * Results: * None. * * Side effects: * A portion of the image gets rendered in a pixmap or window. * *---------------------------------------------------------------------- */ static void ImgPictDisplay(clientData, display, drawable, imageX, imageY, width, height, drawableX, drawableY) ClientData clientData; /* Pointer to PictInstance structure for * for instance to be displayed. */ Display *display; /* Display on which to draw image. */ Drawable drawable; /* Pixmap or window in which to draw image. */ int imageX, imageY; /* Upper-left corner of region within image * to draw. */ int width, height; /* Dimensions of region within image to draw. */ int drawableX, drawableY; /* Coordinates within drawable that * correspond to imageX and imageY. */ { PictInstance *instancePtr = (PictInstance *) clientData; #ifdef DEBUG printf("ImgPictDisplay\n"); #endif /* * If there's no pixmap, it means that an error occurred * while creating the image instance so it can't be displayed. */ if (instancePtr->pixels == None) { return; } /* * masterPtr->region describes which parts of the image contain * valid data. We set this region as the clip mask for the gc, * setting its origin appropriately, and use it when drawing the * image. */ XSetRegion(display, instancePtr->gc, instancePtr->masterPtr->validRegion); XSetClipOrigin(display, instancePtr->gc, drawableX - imageX, drawableY - imageY); XCopyArea(display, instancePtr->pixels, drawable, instancePtr->gc, imageX, imageY, (unsigned) width, (unsigned) height, drawableX, drawableY); XSetClipMask(display, instancePtr->gc, None); XSetClipOrigin(display, instancePtr->gc, 0, 0); } /* *---------------------------------------------------------------------- * * ImgPictFree -- * * This procedure is called when a widget ceases to use a * particular instance of an image. We don't actually get * rid of the instance until later because we may be about * to get this instance again. * * Results: * None. * * Side effects: * Internal data structures get cleaned up, later. * *---------------------------------------------------------------------- */ static void ImgPictFree(clientData, display) ClientData clientData; /* Pointer to PictInstance structure for * for instance to be displayed. */ Display *display; /* Display containing window that used image. */ { PictInstance *instancePtr = (PictInstance *) clientData; #ifdef DEBUG printf("ImgPictFree\n"); #endif instancePtr->refCount -= 1; if (instancePtr->refCount > 0) { return; } /* There are no more uses of the image within this widget. free the instance structure. */ DisposeInstance((ClientData) instancePtr); } /* *---------------------------------------------------------------------- * * ImgPictDelete -- * * This procedure is called by the image code to delete the * master structure for an image. * * Results: * None. * * Side effects: * Resources associated with the image get freed. * *---------------------------------------------------------------------- */ static void ImgPictDelete(masterData) ClientData masterData; /* Pointer to PictMaster structure for * image. Must not have any more instances. */ { PictMaster *masterPtr = (PictMaster *) masterData; PictInstance *instancePtr; #ifdef DEBUG printf("ImgPictDelete\n"); #endif while ((instancePtr = masterPtr->instancePtr) != NULL) { if (instancePtr->refCount > 0) { panic("tried to delete Pict image when instances still exist"); } #if (TK_MINOR_VERSION == 0) Tk_CancelIdleCall(DisposeInstance, (ClientData) instancePtr); #else Tcl_CancelIdleCall(DisposeInstance, (ClientData) instancePtr); #endif DisposeInstance((ClientData) instancePtr); } masterPtr->tkMaster = NULL; if (masterPtr->imageCmd != NULL) { Tcl_DeleteCommand(masterPtr->interp, Tcl_GetCommandName(masterPtr->interp, masterPtr->imageCmd)); } if (masterPtr->data != NULL) { if( (char*)(masterPtr->data) == (char*)(masterPtr->bytedata) ) { ckfree((char *) masterPtr->data); masterPtr->data = NULL; masterPtr->bytedata = NULL; } else { ckfree((char *) masterPtr->data); masterPtr->data = NULL; } } if (masterPtr->bytedata != NULL) { ckfree((char *) masterPtr->bytedata); } if (masterPtr->validRegion != NULL) { XDestroyRegion(masterPtr->validRegion); } Tk_FreeOptions(configSpecs, (char *) masterPtr, (Display *) NULL, 0); ckfree((char *) masterPtr); } /* *---------------------------------------------------------------------- * * ImgPictCmdDeletedProc -- * * This procedure is invoked when the image command for an image * is deleted. It deletes the image. * * Results: * None. * * Side effects: * The image is deleted. * *---------------------------------------------------------------------- */ static void ImgPictCmdDeletedProc(clientData) ClientData clientData; /* Pointer to PictMaster structure for * image. */ { PictMaster *masterPtr = (PictMaster *) clientData; #ifdef DEBUG printf("ImgPictCmdDeletedProc\n"); #endif masterPtr->imageCmd = NULL; if (masterPtr->tkMaster != NULL) { Tk_DeleteImage(masterPtr->interp, Tk_NameOfImage(masterPtr->tkMaster)); } } /* *---------------------------------------------------------------------- * * ImgPictSetSize -- * * This procedure reallocates the image storage and instance * pixmaps for a Pict image, as necessary, to change the * image's size to `width' x `height' pixels. * * Results: * None. * * Side effects: * Storage gets reallocated, for the master and all its instances. * *---------------------------------------------------------------------- */ static void ImgPictSetSize(masterPtr, width, height) PictMaster *masterPtr; int width, height; { char *newData; int h, offset, pitch; char *srcPtr, *destPtr; XRectangle validBox, clipBox; Region clipRegion; PictInstance *instancePtr; #ifdef DEBUG printf("ImgPictSetSize\n"); #endif if (masterPtr->userWidth > 0) { width = masterPtr->userWidth; } if (masterPtr->userHeight > 0) { height = masterPtr->userHeight; } /* * We have to trim the valid region if it is currently * larger than the new image size. */ XClipBox(masterPtr->validRegion, &validBox); if ((validBox.x + validBox.width > (unsigned) width) || (validBox.y + validBox.height > (unsigned) height)) { clipBox.x = 0; clipBox.y = 0; clipBox.width = width; clipBox.height = height; clipRegion = XCreateRegion(); XUnionRectWithRegion(&clipBox, clipRegion, clipRegion); XIntersectRegion(masterPtr->validRegion, clipRegion, masterPtr->validRegion); XDestroyRegion(clipRegion); XClipBox(masterPtr->validRegion, &validBox); } if ((width != masterPtr->width) || (height != masterPtr->height)) { if( masterPtr->data == NULL ) { masterPtr->width = width; masterPtr->height = height; } else { /* * Reallocate storage for the byte image and copy * over valid regions. */ pitch = width; newData = (char *) ckalloc((unsigned) (height * pitch*masterPtr->datasize)); if(newData == NULL) { (void)fprintf(stderr,"ImgPictSetSize: Could not allocate memory\n"); return; } /* * Zero the new array. The dithering code shouldn't read the * areas outside validBox, but they might be copied to another * Pict image or written to a file. */ if ((masterPtr->data != NULL) && ((width == masterPtr->width) || (width == validBox.width))) { if (validBox.y > 0) { memset((VOID *) newData, 0, (size_t) (validBox.y * pitch*masterPtr->datasize)); } h = validBox.y + validBox.height; if (h < height) { memset((VOID *) (newData + h * pitch), 0, (size_t) ((height - h) * pitch)); } } else { memset((VOID *) newData, 0, (size_t) (height * pitch*masterPtr->datasize)); } if (masterPtr->data != NULL) { /* * Copy the common area over to the new array array and * free the old array. */ if (width == masterPtr->width) { /* * The region to be copied is contiguous. */ offset = validBox.y * pitch; memcpy((VOID *) (newData + offset), (VOID *) (masterPtr->data + offset), (size_t) (validBox.height * pitch*masterPtr->datasize)); } else if ((validBox.width > 0) && (validBox.height > 0)) { /* * Area to be copied is not contiguous - copy line by line. */ destPtr = newData + (validBox.y * width + validBox.x)*masterPtr->datasize; srcPtr = masterPtr->data + (validBox.y * masterPtr->width + validBox.x)*masterPtr->datasize; for (h = validBox.height; h > 0; h--) { memcpy((VOID *) destPtr, (VOID *) srcPtr, (size_t) (validBox.width*masterPtr->datasize)); destPtr += width*masterPtr->datasize ; srcPtr += masterPtr->width*masterPtr->datasize; } } if (masterPtr->data != NULL) { if ((char*)(masterPtr->data) == (char*)(masterPtr->bytedata)) { free((void*)masterPtr->data); masterPtr->data = NULL; masterPtr->bytedata = NULL; } else { free((void*)masterPtr->data); masterPtr->data = NULL; free((void*)masterPtr->bytedata); masterPtr->bytedata = NULL; } } } masterPtr->data = newData; masterPtr->width = width; masterPtr->height = height; normalize_data(masterPtr); } } /* * Now adjust the sizes of the pixmaps for all of the instances. */ for (instancePtr = masterPtr->instancePtr; instancePtr != NULL; instancePtr = instancePtr->nextPtr) { ImgPictInstanceSetSize(instancePtr); } } /* *---------------------------------------------------------------------- * * ImgPictInstanceSetSize -- * * This procedure reallocates the instance pixmap and dithering * error array for a Pict instance, as necessary, to change the * image's size to `width' x `height' pixels. * * Results: * None. * * Side effects: * Storage gets reallocated, here and in the X server. * *---------------------------------------------------------------------- */ static void ImgPictInstanceSetSize(instancePtr) PictInstance *instancePtr; /* Instance whose size is to be * changed. */ { PictMaster *masterPtr; XRectangle validBox; Pixmap newPixmap; #ifdef DEBUG printf("ImgPictInstanceSetSize\n"); #endif masterPtr = instancePtr->masterPtr; XClipBox(masterPtr->validRegion, &validBox); if ((instancePtr->width != masterPtr->width) || (instancePtr->height != masterPtr->height) || (instancePtr->pixels == None)) { newPixmap = Tk_GetPixmap(instancePtr->display, RootWindow(instancePtr->display, instancePtr->visualInfo.screen), (masterPtr->width > 0) ? masterPtr->width: 1, (masterPtr->height > 0) ? masterPtr->height: 1, instancePtr->visualInfo.depth); if (instancePtr->pixels != None) { /* * Copy any common pixels from the old pixmap and free it. */ XCopyArea(instancePtr->display, instancePtr->pixels, newPixmap, instancePtr->gc, validBox.x, validBox.y, validBox.width, validBox.height, validBox.x, validBox.y); Tk_FreePixmap(instancePtr->display, instancePtr->pixels); } instancePtr->pixels = newPixmap; } instancePtr->width = masterPtr->width; instancePtr->height = masterPtr->height; } /* *---------------------------------------------------------------------- * * ImgPictCopy * * This procedure copies data from one image to another * * Results: * None. * * Side effects: * The contents of the image is replaced by what's been read. * *---------------------------------------------------------------------- */ static int ImgPictCopy(Tcl_Interp *interp, PictMaster *masterPtr, int argc, const char **argv) { int index; int width, height; struct SubcommandOptions options; Tk_PictImageBlock block; Tk_PictHandle srcHandle; /* * Pict copy command - first parse options. */ index = 2; memset((VOID *) &options, 0, sizeof(options)); options.zoomX = options.zoomY = 1; options.subsampleX = options.subsampleY = 1; options.name = NULL; if (ParseSubcommandOptions(&options, interp, OPT_FROM | OPT_TO | OPT_ZOOM | OPT_SUBSAMPLE | OPT_SHRINK, &index, argc, argv) != TCL_OK) { return TCL_ERROR; } if (options.name == NULL || index < argc) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " copy source-image ?-from x1 y1 x2 y2?", " ?-to x1 y1 x2 y2? ?-zoom x y? ?-subsample x y?", "\"", (char *) NULL); return TCL_ERROR; } /* * Look for the source image and get a pointer to its image data. * Check the values given for the -from option. */ if ((srcHandle = Tk_FindPict(options.name)) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } Tk_PictGetImage(srcHandle, &block); if ((options.fromX2 > block.width) || (options.fromY2 > block.height) || (options.fromX2 > block.width) || (options.fromY2 > block.height)) { Tcl_AppendResult(interp, "coordinates for -from option extend ", "outside source image", (char *) NULL); return TCL_ERROR; } /* * Fill in default values for unspecified parameters. */ if (((options.options & OPT_FROM) == 0) || (options.fromX2 < 0)) { options.fromX2 = block.width; options.fromY2 = block.height; } if (((options.options & OPT_TO) == 0) || (options.toX2 < 0)) { width = options.fromX2 - options.fromX; if (options.subsampleX > 0) { width = (width + options.subsampleX - 1) / options.subsampleX; } else if (options.subsampleX == 0) { width = 0; } else { width = (width - options.subsampleX - 1) / -options.subsampleX; } options.toX2 = options.toX + width * options.zoomX; height = options.fromY2 - options.fromY; if (options.subsampleY > 0) { height = (height + options.subsampleY - 1) / options.subsampleY; } else if (options.subsampleY == 0) { height = 0; } else { height = (height - options.subsampleY - 1) / -options.subsampleY; } options.toY2 = options.toY + height * options.zoomY; } /* * Set the destination image size if the -shrink option was specified. */ if (options.options & OPT_SHRINK) { ImgPictSetSize(masterPtr, options.toX2, options.toY2); } /* * Copy the image data over using Tk_PictPutZoomedBlock. */ block.pixelPtr += (options.fromX + options.fromY * block.pitch) * block.pixelSize; block.width = options.fromX2 - options.fromX; block.height = options.fromY2 - options.fromY; Tk_PictPutZoomedBlock((Tk_PictHandle) masterPtr, &block, options.toX, options.toY, options.toX2 - options.toX, options.toY2 - options.toY, options.zoomX, options.zoomY, options.subsampleX, options.subsampleY); return TCL_OK; } /* end ImgPictCopy */ /* *---------------------------------------------------------------------- * * ImgPictSnap2Photo -- * * This procedure is used for snapshots of a pict image. The result * is stored as a photo image. * * Results: * None. * * Side effects: * None * *---------------------------------------------------------------------- */ int ImgPictSnap2Photo(Tcl_Interp *interp, PictMaster *masterPtr, int argc, const char **argv) { void *destHandle; int i,j,col; Tk_PhotoImageBlock photoblock; PictInstance *instancePtr=masterPtr->instancePtr; PictColorTable *colorTable; int *red,*green,*blue; int *intensity_lut,*red_lut,*green_lut,*blue_lut; if ((destHandle = Tk_FindPhoto(interp,argv[2])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Photo image", (char *) NULL); return TCL_ERROR; } /* set size */ Tk_PhotoExpand(interp, destHandle,masterPtr->width,masterPtr->height); /* copy data from pict image to photo image. If no instance exists, no colors have been allocated, so we copy the original master data. Otherwise, we copy them using the color lookup tables in a 24-bit image. */ if( masterPtr->instancePtr == NULL ) { photoblock.pixelSize = 1; photoblock.offset[0] = 0; photoblock.offset[1] = 0; photoblock.offset[2] = 0; photoblock.width = masterPtr->width; photoblock.height = masterPtr->height; photoblock.pitch = photoblock.pixelSize * masterPtr->width; /* allocate storage */ photoblock.pixelPtr = (unsigned char*)ckalloc((size_t) (masterPtr->width)* (masterPtr->height)); if ( photoblock.pixelPtr == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in snap2photo ", (char*)NULL); return TCL_ERROR; } memcpy((void*)(photoblock.pixelPtr), (void*)(masterPtr->bytedata), (size_t)(masterPtr->width)*(masterPtr->height)); } else { /* produce a 24-bit image */ photoblock.pixelSize = 3; photoblock.offset[0] = 0; photoblock.offset[1] = 1; photoblock.offset[2] = 2; photoblock.width = masterPtr->width; photoblock.height = masterPtr->height; photoblock.pitch = photoblock.pixelSize * (masterPtr->width); /* allocate storage */ photoblock.pixelPtr = (unsigned char*)ckalloc((size_t)3* (masterPtr->width)* (masterPtr->height)); if ( photoblock.pixelPtr == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in snap2photo ", (char*)NULL); return TCL_ERROR; } /* get the colors */ colorTable = instancePtr->colorTable; red = colorTable->red; red_lut = colorTable->red_lut; green = colorTable->green; green_lut = colorTable->green_lut; blue = colorTable->blue; blue_lut = colorTable->blue_lut; intensity_lut = colorTable->intensity_lut; if( instancePtr->has_overlay == 0 ) { for(i=0,j=0;i<(masterPtr->width)*(masterPtr->height);i++) { /* map from [0-MAX_COLORS-1] to [0-(colorTable->ncolors-1)] */ col = (double)(masterPtr->bytedata[i])* (double)((colorTable->ncolors-1))/ (double)(MAX_COLORS-1); /* fill pixels of 24-bit image */ photoblock.pixelPtr[j++] = red_lut[red[intensity_lut[col]]]; photoblock.pixelPtr[j++] = green_lut[green[intensity_lut[col]]]; photoblock.pixelPtr[j++] = blue_lut[blue[intensity_lut[col]]]; } } else { /* instead of using a XGetImage call, we re-calculate the color values. tedious but no need for a server call */ Tcl_AppendResult(interp, "Overlays not supported. How did you get here?",(char *) NULL); return TCL_ERROR; } /* end else if overlays */ } /* put block in photo image */ Tk_PhotoPutBlock(interp, destHandle,&photoblock,0,0,masterPtr->width,masterPtr->height, TK_PHOTO_COMPOSITE_SET); /* free photo block */ ckfree((void*)photoblock.pixelPtr); return TCL_OK; } /* end ImgPictSnap2Photo */ /* *---------------------------------------------------------------------- * * ImgPictSnap2Pict -- * * This procedure is used for snapshots of a pict image. The result * is stored as a pict image after NTSC conversion. * * Results: * None. * * Side effects: * None * *---------------------------------------------------------------------- */ int ImgPictSnap2Pict(Tcl_Interp *interp, PictMaster *masterPtr, int argc, const char **argv) { PictMaster *destmasterPtr; Tk_PictHandle destHandle; Tk_PictImageBlock *tmp_block; int i,j,col; /* Basically the same thing as snap2photo, plus the conversion to gray, but we can use Tk_PictExpand and Tk_PictPutBlock */ if ((destHandle = Tk_FindPict(argv[2])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } destmasterPtr = (PictMaster*)destHandle; /* allocate storage */ tmp_block = (Tk_PictImageBlock*)ckalloc(sizeof(Tk_PictImageBlock)); if ( tmp_block == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in snap2pict ", (char*)NULL); return TCL_ERROR; } tmp_block->pixelPtr = (unsigned char*)ckalloc((size_t) (masterPtr->width)* (masterPtr->height)); tmp_block->width = masterPtr->width; tmp_block->height = masterPtr->height; tmp_block->datatype = BYTE; tmp_block->pixelSize = sizeof(unsigned char); tmp_block->pitch = tmp_block->pixelSize * tmp_block->width; tmp_block->copy = NO_COPY; tmp_block->skip = 0; tmp_block->pixel_x = masterPtr->pixel_x; tmp_block->pixel_y = masterPtr->pixel_y; /* copy data from pict image to pict image. If no instance exists, no colors have been allocated, so we copy the original master byte data. Otherwise, we copy them using the color lookup tables */ if( masterPtr->instancePtr == NULL ) { (void)memcpy((char*)(tmp_block->pixelPtr), (char*)(masterPtr->bytedata), (masterPtr->width)*(masterPtr->height)); } else { PictInstance *instancePtr=masterPtr->instancePtr; PictColorTable *colorTable; int *red,*green,*blue; int *intensity_lut,*red_lut,*green_lut,*blue_lut; colorTable = instancePtr->colorTable; red = colorTable->red; red_lut = colorTable->red_lut; green = colorTable->green; green_lut = colorTable->green_lut; blue = colorTable->blue; blue_lut = colorTable->blue_lut; intensity_lut = colorTable->intensity_lut; if( instancePtr->has_overlay == 0 ) { for(i=0,j=0;iwidth*masterPtr->height;i++) { /* map from [0-MAX_COLORS-1] to [0-(colorTable->ncolors-1)] */ col = (double)(masterPtr->bytedata[i])* (double)(colorTable->ncolors-1)/ (double)(MAX_COLORS-1); tmp_block->pixelPtr[i] = GRAY((red_lut[red[intensity_lut[col]]]), (green_lut[green[intensity_lut[col]]]), (blue_lut[blue[intensity_lut[col]]])); } } else { Tcl_AppendResult(interp, "Overlays not supported. How did you get here?",(char *) NULL); return TCL_ERROR; } /* end else if overlays */ } Tk_PictExpand(destHandle,masterPtr->width,masterPtr->height); Tk_PictPutBlock(destHandle,tmp_block,0,0,masterPtr->width,masterPtr->height); Tk_ImageChanged(destmasterPtr->tkMaster,0,0, destmasterPtr-> width, destmasterPtr->height, destmasterPtr->width, destmasterPtr->height); ckfree((void*)tmp_block); return TCL_OK; } /* end ImgPictSnap2Pict */ /* *---------------------------------------------------------------------- * * DisposeInstance -- * * This procedure is called to finally free up an instance * of a Pict image which is no longer required. * * Results: * None. * * Side effects: * The instance data structure and the resources it references * are freed. * *---------------------------------------------------------------------- */ void DisposeInstance(clientData) ClientData clientData; /* Pointer to the instance whose resources * are to be released. */ { PictInstance *instancePtr = (PictInstance *) clientData; PictInstance *prevPtr; #ifdef DEBUG printf("DisposeInstance\n"); #endif if(instancePtr->has_overlay) { XFreeGC(instancePtr->display,instancePtr->overlay_gc); instancePtr->has_overlay = False; } if (instancePtr->pixels != None) { Tk_FreePixmap(instancePtr->display, instancePtr->pixels); } if (instancePtr->gc != None) { Tk_FreeGC(instancePtr->display, instancePtr->gc); } if (instancePtr->imagePtr != NULL) { XFree((char *) instancePtr->imagePtr); } instancePtr->colorTable->refCount --; if( instancePtr->colorTable->refCount == 0 ) { (void)DisposeColorTable(instancePtr->colorTable); instancePtr->colorTable = NULL; } if (instancePtr->masterPtr->instancePtr == instancePtr) { instancePtr->masterPtr->instancePtr = instancePtr->nextPtr; } else { for (prevPtr = instancePtr->masterPtr->instancePtr; prevPtr->nextPtr != instancePtr; prevPtr = prevPtr->nextPtr) { /* Empty loop body */ } prevPtr->nextPtr = instancePtr->nextPtr; } ckfree((char *) instancePtr); } /* *---------------------------------------------------------------------- * * MatchFileFormat -- * * This procedure is called to find a Pict image file format * handler which can parse the image data in the given file. * If a user-specified format string is provided, only handlers * whose names match a prefix of the format string are tried. * * Results: * A standard TCL return value. If the return value is TCL_OK, a * pointer to the image format record is returned in * *imageFormatPtr, and the width and height of the image are * returned in *widthPtr and *heightPtr. * * Side effects: * None. * *---------------------------------------------------------------------- */ static int MatchFileFormat(interp, f, fileName, formatString, imageFormatPtr, widthPtr, heightPtr) Tcl_Interp *interp; /* Interpreter to use for reporting errors. */ Tcl_Channel f; /* The image file, open for reading. */ char *fileName; /* The name of the image file. */ char *formatString; /* User-specified format string, or NULL. */ Tk_PictImageFormat **imageFormatPtr; /* A pointer to the Pict image format * record is returned here. */ int *widthPtr, *heightPtr; /* The dimensions of the image are * returned here. */ { int matched; Tk_PictImageFormat *formatPtr; #ifdef DEBUG printf("MatchFileFormat\n"); #endif /* * Scan through the table of file format handlers to find * one which can handle the image. */ matched = 0; for (formatPtr = formatList; formatPtr != NULL; formatPtr = formatPtr->nextPtr) { if ((formatString != NULL) && (strncasecmp(formatString, formatPtr->name, strlen(formatPtr->name)) != 0)) { continue; } matched = 1; if (formatPtr->fileMatchProc != NULL) { Tcl_Seek(f, 0L, SEEK_SET); if ((*formatPtr->fileMatchProc)(f, fileName, Tcl_NewStringObj( formatString, -1 ), widthPtr, heightPtr, interp)) { if (*widthPtr < 1) { *widthPtr = 1; } if (*heightPtr < 1) { *heightPtr = 1; } break; } } } if (formatPtr == NULL) { if ((formatString != NULL) && !matched) { Tcl_AppendResult(interp, "image file format \"", formatString, "\" is unknown", (char *) NULL); } else { Tcl_AppendResult(interp, "couldn't recognize data in image file \"", fileName, "\"", (char *) NULL); } return TCL_ERROR; } *imageFormatPtr = formatPtr; Tcl_Seek(f, 0L, SEEK_SET); return TCL_OK; } /* *---------------------------------------------------------------------- * * MatchStringFormat -- * * This procedure is called to find a Pict image file format * handler which can parse the image data in the given string. * If a user-specified format string is provided, only handlers * whose names match a prefix of the format string are tried. * * Results: * A standard TCL return value. If the return value is TCL_OK, a * pointer to the image format record is returned in * *imageFormatPtr, and the width and height of the image are * returned in *widthPtr and *heightPtr. * * Side effects: * None. * *---------------------------------------------------------------------- */ static int MatchStringFormat(interp, string, formatString, imageFormatPtr, widthPtr, heightPtr) Tcl_Interp *interp; /* Interpreter to use for reporting errors. */ char *string; /* String containing the image data. */ char *formatString; /* User-specified format string, or NULL. */ Tk_PictImageFormat **imageFormatPtr; /* A pointer to the Pict image format * record is returned here. */ int *widthPtr, *heightPtr; /* The dimensions of the image are * returned here. */ { int matched; Tk_PictImageFormat *formatPtr; #ifdef DEBUG printf("MatchStringFormat\n"); #endif /* * Scan through the table of file format handlers to find * one which can handle the image. */ matched = 0; for (formatPtr = formatList; formatPtr != NULL; formatPtr = formatPtr->nextPtr) { if ((formatString != NULL) && (strncasecmp(formatString, formatPtr->name, strlen(formatPtr->name)) != 0)) { continue; } matched = 1; if ((formatPtr->stringMatchProc != NULL) && (*formatPtr->stringMatchProc)( Tcl_NewStringObj( string, -1 ), Tcl_NewStringObj( formatString, -1 ), widthPtr, heightPtr, interp)) { break; } } if (formatPtr == NULL) { if ((formatString != NULL) && !matched) { Tcl_AppendResult(interp, "image file format \"", formatString, "\" is unknown", (char *) NULL); } else { Tcl_AppendResult(interp, "no format found to parse", " image data string", (char *) NULL); } return TCL_ERROR; } *imageFormatPtr = formatPtr; return TCL_OK; } /* *---------------------------------------------------------------------- * * Tk_FindPict -- * * This procedure is called to get an opaque handle (actually a * PictMaster *) for a given image, which can be used in * subsequent calls to Tk_PictPutBlock, etc. The `name' * parameter is the name of the image. * * Results: * The handle for the Pict image, or NULL if there is no * Pict image with the name given. * * Side effects: * None. * *---------------------------------------------------------------------- */ Tk_PictHandle Tk_FindPict(imageName) char *imageName; /* Name of the desired Pict image. */ { Tcl_HashEntry *entry; #ifdef DEBUG printf("Tk_FindPict\n"); #endif if (!imgPictHashInitialized) { return NULL; } entry = Tcl_FindHashEntry(&imgPictHash, imageName); if (entry == NULL) { return NULL; } return (Tk_PictHandle) Tcl_GetHashValue(entry); } /* *---------------------------------------------------------------------- * * Tk_PictPutBlock -- * * This procedure is called to put image data into a Pict image. * * Results: * None. * * Side effects: * The image data is stored. The image may be expanded. * The Tk image code is informed that the image has changed. * *---------------------------------------------------------------------- */ void Tk_PictPutBlock(handle, blockPtr, x, y, width, height) Tk_PictHandle handle; /* Opaque handle for the Pict image * to be updated. */ register Tk_PictImageBlock *blockPtr; /* Pointer to a structure describing the * pixel data to be copied into the image. */ int x, y; /* Coordinates of the top-left pixel to * be updated in the image. */ int width, height; /* Dimensions of the area of the image * to be updated. */ { register PictMaster *masterPtr; PictInstance *instancePtr; int xEnd, yEnd; XRectangle rect; int i,j; #ifdef DEBUG printf("Tk_PictPutBlock\n"); #endif masterPtr = (PictMaster *) handle; if ((masterPtr->userWidth != 0) && ((x + width) > masterPtr->userWidth)) { width = masterPtr->userWidth - x; } if ((masterPtr->userHeight != 0) && ((y + height) > masterPtr->userHeight)) { height = masterPtr->userHeight - y; } if ((width <= 0) || (height <= 0)) return; xEnd = x + width; yEnd = y + height; if ((xEnd > masterPtr->width) || (yEnd > masterPtr->height)) { ImgPictSetSize(masterPtr, MAX(xEnd, masterPtr->width), MAX(yEnd, masterPtr->height)); } if((x!= 0) || (y!= 0) || (masterPtr->width != blockPtr->width) || (masterPtr->height != blockPtr->height)) { #ifdef DEBUG printf(" needs copy \n"); #endif blockPtr->copy = COPY; /* printf("Warning : the physical dimensions of the block being read will not be saved \n"); */ } if( blockPtr->copy == COPY ) { if( masterPtr->data == NULL ) { #ifdef DEBUG printf("needs allocation \n"); #endif masterPtr->datatype = blockPtr->datatype; masterPtr->datasize = blockPtr->pixelSize; masterPtr->data = (char*)ckalloc((size_t)masterPtr->datasize* masterPtr->width* masterPtr->height); if( masterPtr->data == NULL ) { (void)fprintf(stderr,"Could not allocate memory \n"); return; } } else { if (masterPtr->datatype != blockPtr->datatype ) { (void)fprintf(stderr,"Type mismatch \n"); return; } } if(masterPtr->width == blockPtr->width && masterPtr->height == blockPtr->height) masterPtr->skip = blockPtr->skip; if( blockPtr->datatype == BYTE ) { for(i=0;idata[i+x+(j+y)*masterPtr->width] = blockPtr->pixelPtr[i+j*blockPtr->pitch]; } else if( blockPtr->datatype == WORD ) { short *srcPtr = (short*)blockPtr->pixelPtr; short *destPtr = (short*)masterPtr->data; for(i=0;iwidth] = srcPtr[i+j*blockPtr->pitch]; } else if( blockPtr->datatype == LWORD ) { int *srcPtr = (int*)blockPtr->pixelPtr; int *destPtr = (int*)masterPtr->data; for(i=0;iwidth] = srcPtr[i+j*blockPtr->pitch]; } else if( blockPtr->datatype == REAL ) { float *srcPtr = (float*)blockPtr->pixelPtr; float *destPtr = (float*)masterPtr->data; for(i=0;iwidth] = srcPtr[i+j*blockPtr->pitch]; } else if( blockPtr->datatype == DOUBLE ) { double *srcPtr = (double*)blockPtr->pixelPtr; double *destPtr = (double*)masterPtr->data; for(i=0;iwidth] = srcPtr[i+j*blockPtr->pitch]; } } else { if( masterPtr->bytedata != NULL ) { if( (char*)masterPtr->bytedata == (char*)masterPtr->data ) { ckfree((void*)masterPtr->bytedata); masterPtr->bytedata = NULL; masterPtr->data = NULL; } else { ckfree((void*)masterPtr->bytedata); masterPtr->bytedata = NULL; } } if( masterPtr->data != NULL ) { free((void*)masterPtr->data); masterPtr->data = NULL; } masterPtr->datatype = blockPtr->datatype; masterPtr->datasize = blockPtr->pixelSize; masterPtr->skip = blockPtr->skip; /* save physical dimensions */ masterPtr->pixel_x = blockPtr->pixel_x; masterPtr->pixel_y = blockPtr->pixel_y; /* Put the data into our local data array */ masterPtr->data = (char*)blockPtr->pixelPtr; } normalize_data(masterPtr); blockPtr->pixelPtr = NULL; /* * Add this new block to the region which specifies which data is valid. */ rect.x = x; rect.y = y; rect.width = width; rect.height = height; XUnionRectWithRegion(&rect, masterPtr->validRegion, masterPtr->validRegion); /* * Update each instance. */ for(instancePtr = masterPtr->instancePtr; instancePtr != NULL; instancePtr = instancePtr->nextPtr) DitherInstance(instancePtr, x, y, width, height); /* * Tell the core image code that this image has changed. */ Tk_ImageChanged(masterPtr->tkMaster, x, y, width, height, masterPtr->width, masterPtr->height); } /* *---------------------------------------------------------------------- * * Tk_PictPutZoomedBlock -- * * This procedure is called to put image data into a Pict image, * with possible subsampling and/or zooming of the pixels. * * Results: * None. * * Side effects: * The image data is stored. The image may be expanded. * The Tk image code is informed that the image has changed. * *---------------------------------------------------------------------- */ void Tk_PictPutZoomedBlock(handle, blockPtr, x, y, width, height, zoomX, zoomY, subsampleX, subsampleY) Tk_PictHandle handle; /* Opaque handle for the Pict image * to be updated. */ register Tk_PictImageBlock *blockPtr; /* Pointer to a structure describing the * pixel data to be copied into the image. */ int x, y; /* Coordinates of the top-left pixel to * be updated in the image. */ int width, height; /* Dimensions of the area of the image * to be updated. */ int zoomX, zoomY; /* Zoom factors for the X and Y axes. */ int subsampleX, subsampleY; /* Subsampling factors for the X and Y axes. */ { register PictMaster *masterPtr; PictInstance *instancePtr; int xEnd, yEnd; int wLeft, hLeft; int wCopy, hCopy; int blockWid, blockHt; unsigned char *srcPtr, *srcLinePtr, *srcOrigPtr; unsigned char *destPtr, *destLinePtr; int pitch; int xRepeat, yRepeat; int blockXSkip, blockYSkip; XRectangle rect; register int il; #ifdef DEBUG printf("Tk_PictPutZoomedBlock\n"); #endif if ((zoomX == 1) && (zoomY == 1) && (subsampleX == 1) && (subsampleY == 1)) { Tk_PictPutBlock(handle, blockPtr, x, y, width, height); return; } masterPtr = (PictMaster *) handle; if ((zoomX <= 0) || (zoomY <= 0)) return; if ((masterPtr->userWidth != 0) && ((x + width) > masterPtr->userWidth)) { width = masterPtr->userWidth - x; } if ((masterPtr->userHeight != 0) && ((y + height) > masterPtr->userHeight)) { height = masterPtr->userHeight - y; } if ((width <= 0) || (height <= 0)) return; xEnd = x + width; yEnd = y + height; if ((xEnd > masterPtr->width) || (yEnd > masterPtr->height)) { ImgPictSetSize(masterPtr, MAX(xEnd, masterPtr->width), MAX(yEnd, masterPtr->height)); } if( masterPtr->data == NULL ) { #ifdef DEBUG printf("needs allocation \n"); #endif masterPtr->datatype = blockPtr->datatype; masterPtr->datasize = blockPtr->pixelSize; masterPtr->pixel_x = blockPtr->pixel_x; masterPtr->pixel_y = blockPtr->pixel_y; masterPtr->data = (char*)ckalloc((size_t)masterPtr->datasize* masterPtr->width* masterPtr->height); if( masterPtr->data == NULL ) { (void)fprintf(stderr,"Could not allocate memory \n"); return; } } else { if (masterPtr->datatype != blockPtr->datatype ) { (void)fprintf(stderr,"Type mismatch \n"); return; } if ((masterPtr->pixel_x != blockPtr->pixel_x) || (masterPtr->pixel_y != blockPtr->pixel_y) ) { printf("Warning : the physical dimensions of the block being read will not be saved \n"); } } /* * Work out what area the pixel data in the block expands to after * subsampling and zooming. */ blockXSkip = subsampleX * blockPtr->pixelSize; blockYSkip = subsampleY * blockPtr->pitch * blockPtr->pixelSize; if (subsampleX > 0) blockWid = ((blockPtr->width + subsampleX - 1) / subsampleX) * zoomX; else if (subsampleX == 0) blockWid = width; else blockWid = ((blockPtr->width - subsampleX - 1) / -subsampleX) * zoomX; if (subsampleY > 0) blockHt = ((blockPtr->height + subsampleY - 1) / subsampleY) * zoomY; else if (subsampleY == 0) blockHt = height; else blockHt = ((blockPtr->height - subsampleY - 1) / -subsampleY) * zoomY; destLinePtr = (unsigned char*)(masterPtr->data + (y * masterPtr->width + x)*masterPtr->datasize); srcOrigPtr = blockPtr->pixelPtr; if (subsampleX < 0) { srcOrigPtr += (blockPtr->width - 1) * blockPtr->pixelSize; } if (subsampleY < 0) { srcOrigPtr += (blockPtr->height - 1) * blockPtr->pitch * blockPtr->pixelSize; } pitch = masterPtr->width*masterPtr->datasize; for (hLeft = height; hLeft > 0; ) { hCopy = MIN(hLeft, blockHt); hLeft -= hCopy; yRepeat = zoomY; srcLinePtr = srcOrigPtr; for (; hCopy > 0; --hCopy) { destPtr = destLinePtr; for (wLeft = width; wLeft > 0;) { wCopy = MIN(wLeft, blockWid); wLeft -= wCopy; srcPtr = srcLinePtr; for (; wCopy > 0; wCopy -= zoomX) { for (xRepeat = MIN(wCopy, zoomX); xRepeat > 0; xRepeat--) { for(il=0;ildatasize;il++) *destPtr++ = srcPtr[il]; } srcPtr += blockXSkip; } } destLinePtr += pitch; yRepeat--; if (yRepeat <= 0) { srcLinePtr += blockYSkip; yRepeat = zoomY; } } } normalize_data(masterPtr); blockPtr->pixelPtr = NULL; /* * Add this new block to the region that specifies which data is valid. */ rect.x = x; rect.y = y; rect.width = width; rect.height = height; XUnionRectWithRegion(&rect, masterPtr->validRegion, masterPtr->validRegion); /* * Update each instance. */ for(instancePtr = masterPtr->instancePtr; instancePtr != NULL; instancePtr = instancePtr->nextPtr) DitherInstance(instancePtr, x, y, width, height); /* * Tell the core image code that this image has changed. */ Tk_ImageChanged(masterPtr->tkMaster, x, y, width, height, masterPtr->width, masterPtr->height); } /* *---------------------------------------------------------------------- * * Tk_PictBlank -- * * This procedure is called to clear an entire Pict image. * * Results: * None. * * Side effects: * The valid region for the image is set to the null region. * The generic image code is notified that the image has changed. * *---------------------------------------------------------------------- */ void Tk_PictBlank(handle) Tk_PictHandle handle; /* Handle for the image to be blanked. */ { PictMaster *masterPtr; #ifdef DEBUG printf("Tk_PictBlank\n"); #endif masterPtr = (PictMaster *) handle; /* * The image has valid data nowhere. */ if (masterPtr->validRegion != NULL) { XDestroyRegion(masterPtr->validRegion); } masterPtr->validRegion = XCreateRegion(); /* * Clear out the data storage array. */ memset((VOID *) masterPtr->data, 0, (size_t) (masterPtr->width * masterPtr->height * masterPtr->datasize)); /* * Tell the core image code that this image has changed. */ Tk_ImageChanged(masterPtr->tkMaster, 0, 0, masterPtr->width, masterPtr->height, masterPtr->width, masterPtr->height); } /* *---------------------------------------------------------------------- * * Tk_PictExpand -- * * This procedure is called to request that a Pict image be * expanded if necessary to be at least `width' pixels wide and * `height' pixels high. If the user has declared a definite * image size (using the -width and -height configuration * options) then this call has no effect. * * Results: * None. * * Side effects: * The size of the Pict image may change; if so the generic * image code is informed. * *---------------------------------------------------------------------- */ void Tk_PictExpand(handle, width, height) Tk_PictHandle handle; /* Handle for the image to be expanded. */ int width, height; /* Desired minimum dimensions of the image. */ { PictMaster *masterPtr; #ifdef DEBUG printf("Tk_PictExpand\n"); #endif masterPtr = (PictMaster *) handle; if (width <= masterPtr->width) { width = masterPtr->width; } if (height <= masterPtr->height) { height = masterPtr->height; } if ((width != masterPtr->width) || (height != masterPtr->height)) { ImgPictSetSize(masterPtr, MAX(width, masterPtr->width), MAX(height, masterPtr->height)); Tk_ImageChanged(masterPtr->tkMaster, 0, 0, 0, 0, masterPtr->width, masterPtr->height); } } /* *---------------------------------------------------------------------- * * Tk_PictGetSize -- * * This procedure is called to obtain the current size of a Pict * image. * * Results: * The image's width and height are returned in *widthp * and *heightp. * * Side effects: * None. * *---------------------------------------------------------------------- */ void Tk_PictGetSize(handle, widthPtr, heightPtr) Tk_PictHandle handle; /* Handle for the image whose dimensions * are requested. */ int *widthPtr, *heightPtr; /* The dimensions of the image are returned * here. */ { PictMaster *masterPtr; #ifdef DEBUG printf("Tk_PictGetSize\n"); #endif masterPtr = (PictMaster *) handle; *widthPtr = masterPtr->width; *heightPtr = masterPtr->height; } /* *---------------------------------------------------------------------- * * Tk_PictSetSize -- * * This procedure is called to set size of a Pict image. * This call is equivalent to using the -width and -height * configuration options. * * Results: * None. * * Side effects: * The size of the image may change; if so the generic * image code is informed. * *---------------------------------------------------------------------- */ void Tk_PictSetSize(handle, width, height) Tk_PictHandle handle; /* Handle for the image whose size is to * be set. */ int width, height; /* New dimensions for the image. */ { PictMaster *masterPtr; #ifdef DEBUG printf("Tk_PictSetSize\n"); #endif masterPtr = (PictMaster *) handle; masterPtr->userWidth = width; masterPtr->userHeight = height; ImgPictSetSize(masterPtr, ((width > 0) ? width: masterPtr->width), ((height > 0) ? height: masterPtr->height)); Tk_ImageChanged(masterPtr->tkMaster, 0, 0, 0, 0, masterPtr->width, masterPtr->height); } /* *---------------------------------------------------------------------- * * Tk_PictGetImage -- * * This procedure is called to obtain image data from a Pict * image. This procedure fills in the Tk_PictImageBlock structure * pointed to by `blockPtr' with details of the address and * layout of the image data in memory. * * Results: * TRUE (1) indicating that image data is available, * for backwards compatibility with the old Pict widget. * * Side effects: * None. * *---------------------------------------------------------------------- */ int Tk_PictGetImage(handle, blockPtr) Tk_PictHandle handle; /* Handle for the Pict image from which * image data is desired. */ Tk_PictImageBlock *blockPtr; /* Information about the address and layout * of the image data is returned here. */ { PictMaster *masterPtr; #ifdef DEBUG printf("Tk_PictGetImage\n"); #endif masterPtr = (PictMaster *) handle; blockPtr->pixelPtr = (unsigned char*)masterPtr->data; blockPtr->width = masterPtr->width; blockPtr->height = masterPtr->height; blockPtr->pitch = masterPtr->width; blockPtr->pixelSize = masterPtr->datasize;; blockPtr->datatype = masterPtr->datatype; blockPtr->copy = COPY; blockPtr->skip = masterPtr->skip; blockPtr->pixel_x = masterPtr->pixel_x; blockPtr->pixel_y = masterPtr->pixel_y; return 1; } static int make_colorbar(Tk_PictHandle handle, int width, int height) { Tk_PictImageBlock block; int i,j; unsigned char *pixelPtr; int nBytes; #ifdef DEBUG printf("make_colorbar \n"); #endif block.datatype = BYTE; block.pixelSize = sizeof(unsigned char); block.width = width; block.height = height; block.pitch = block.pixelSize * width; nBytes = width * height * block.pixelSize; pixelPtr = (unsigned char *) ckalloc((unsigned) nBytes); if ( pixelPtr == NULL ) return 0; for(j=0;jbytedata != NULL ) { ckfree((void*)masterPtr->bytedata); } out=(unsigned char*)ckalloc((size_t)(masterPtr->width*masterPtr->height*sizeof(unsigned char))); if( out == NULL ) { (void)fprintf(stderr,"Could not allocate memory \n"); return; } masterPtr->bytedata = out; if( masterPtr->user_dispmin != 0.0 || masterPtr->user_dispmax != 0.0 ) { masterPtr->dispmin = masterPtr->user_dispmin; masterPtr->dispmax = masterPtr->user_dispmax; } else { masterPtr->dispmin = 0.0; masterPtr->dispmax = 0.0; } convert_block_to_byte((void*)masterPtr->data, (unsigned char*)masterPtr->bytedata, (masterPtr->width)*(masterPtr->height), masterPtr->datatype, &(masterPtr->dispmin), &(masterPtr->dispmax)); } /* end normalize_data */ /* extract the pixel values along an arbitrary line. No interpolation, uses the Bresenham algorithm instead */ static void get_line_pixels(char *string, unsigned char *img, int nr,int nc, int x1,int y1, int x2,int y2, double min, double max) { int d, x, y, ax, ay, sx, sy, dx, dy; int pix_int; int i = 0; char string1[10000]; dx = x2-x1; ax = ABS(dx)<<1; sx = SGN(dx); dy = y2-y1; ay = ABS(dy)<<1; sy = SGN(dy); x = x1; y = y1; if (ax>ay) { /* x dominant */ d = ay-(ax>>1); for (;;) { /* add index x+y*nc to list */ if ((y<0) || (y>= nr) || (x<0) || (x>nc)) pix_int = 0; else pix_int = img[y*nc + x]; sprintf(string1,"%d ",i++); strcat(string,string1); sprintf(string1,"%g ",((double)pix_int/(double)(MAX_COLORS-1.0)*(max-min))+min); strcat(string,string1); if (x==x2) return; if (d>=0) { y += sy; d -= ax; } x += sx; d += ay; } } else { /* y dominant */ d = ax-(ay>>1); for (;;) { /* add index x+y*nc to list */ if ((y<0) || (y>= nr) || (x<0) || (x>nc)) pix_int = 0; else pix_int = img[y*nc + x]; sprintf(string1,"%d ",i++); strcat(string,string1); sprintf(string1,"%g ",((double)pix_int/(double)(MAX_COLORS-1.0)*(max-min))+min); strcat(string,string1); if (y==y2) return; if (d>=0) { x += sx; d -= ay; } y += sy; d += ax; } } } /* end get_line_pixels */ static int ChangeColorTable(PictMaster *masterPtr) { PictInstance *instancePtr = masterPtr->instancePtr; PictColorTable *colorTable; PictColorTable *old_colorTable; XVisualInfo *visInfoPtr; XRectangle validBox; #ifdef DEBUG printf("ChangeColorTable \n"); #endif old_colorTable = instancePtr->colorTable; old_colorTable->refCount--; if ( old_colorTable->refCount == 0 ) { DisposeColorTable((PictColorTable *)old_colorTable); } if( GetColorTable(instancePtr->tkwin,(PictColorTable **)&colorTable, (XVisualInfo **)&visInfoPtr) == 0 ) { fprintf(stderr," GetColorTable failed \n"); return 0; } instancePtr->display = colorTable->display; instancePtr->colormap = colorTable->colormap; instancePtr->colormap_level = colorTable->colormap_level; instancePtr->has_overlay = 0; instancePtr->colorTable = colorTable; instancePtr->visualInfo = *visInfoPtr; XFree(visInfoPtr); XClipBox(masterPtr->validRegion, &validBox); if ((validBox.width > 0) && (validBox.height > 0)) { DitherInstance(instancePtr, validBox.x, validBox.y, validBox.width, validBox.height); } Tk_ImageChanged(masterPtr->tkMaster, 0, 0, masterPtr->width, masterPtr->height, masterPtr->width, masterPtr->height); return 1; } /* end ChangeColorTable */ #ifdef PLB_SEGMENT static int ImgPictClip(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv) { PictInstance *instancePtr; int loval,hival; double dloval,dhival; int sim; if (argc < 3 || argc > 4) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " clip loval [hival]\"", (char *) NULL); return TCL_ERROR; } sim = masterPtr->width*masterPtr->height; if(masterPtr->datatype == BYTE) { if(argc==3) { if(Tcl_GetInt(interp, argv[2], &loval) != TCL_OK) return TCL_ERROR; if(loval<0 || loval > 255) { Tcl_AppendResult(interp, argv[0], "clip: ", "parameters should be in range [0-255]", (char *) NULL); return TCL_ERROR; } lclip_above_ubyte((unsigned char*)masterPtr->data,sim, loval); } else { if((Tcl_GetInt(interp, argv[2], &loval) != TCL_OK) || (Tcl_GetInt(interp, argv[3], &hival) != TCL_OK)) return TCL_ERROR; if(loval<0 || loval > 255 || hival<0 || hival>255) { Tcl_AppendResult(interp, argv[0], "clip: ", "parameters should be in range [0-255]", (char *) NULL); return TCL_ERROR; } lclip_ubyte((unsigned char*)masterPtr->data,sim,loval,hival); } } else if(masterPtr->datatype == WORD ) { if(argc==3) { if(Tcl_GetInt(interp, argv[2], &loval) != TCL_OK) return TCL_ERROR; if(loval<-32767 || loval > 32767 ) { Tcl_AppendResult(interp, argv[0], "clip: ", "parameters should be in range [-32768,32768]", (char *) NULL); return TCL_ERROR; } lclip_above_short((short*)masterPtr->data,sim,loval); } else { if((Tcl_GetInt(interp, argv[2], &loval) != TCL_OK) || (Tcl_GetInt(interp, argv[3], &hival) != TCL_OK)) return TCL_ERROR; if((loval<-32767) || (loval > 32767) || (hival<-32767) || (hival>32767)) { Tcl_AppendResult(interp, argv[0], "clip: ", "parameters should be in range [-32768,32768]", (char *) NULL); return TCL_ERROR; } lclip_short((short*)masterPtr->data,sim,loval,hival); } } else if(masterPtr->datatype == LWORD ) { if(argc==3) { if(Tcl_GetInt(interp, argv[2], &loval) != TCL_OK) return TCL_ERROR; lclip_above_int((int*)masterPtr->data,sim,loval); } else { if((Tcl_GetInt(interp, argv[2], &loval) != TCL_OK) || (Tcl_GetInt(interp, argv[3], &hival) != TCL_OK)) return TCL_ERROR; lclip_int((int*)masterPtr->data,sim,loval,hival); } } else if(masterPtr->datatype == REAL ) { /*this should be duplicated for DOUBLEs, but since I don't have the plb segment library, I've no idea how. LEB */ if(argc==3) { if(Tcl_GetDouble(interp, argv[2], &dloval) != TCL_OK) return TCL_ERROR; lclip_above_float((float*)masterPtr->data,sim,dloval); } else { if((Tcl_GetDouble(interp, argv[2], &dloval) != TCL_OK) || (Tcl_GetDouble(interp, argv[3], &dhival) != TCL_OK)) return TCL_ERROR; lclip_float((float*)masterPtr->data,sim, (float)dloval,(float)dhival); } } normalize_data(masterPtr); /* * Update each instance. */ for(instancePtr = masterPtr->instancePtr; instancePtr != NULL; instancePtr = instancePtr->nextPtr) DitherInstance(instancePtr, 0, 0, masterPtr->width, masterPtr->height); /* * Tell the core image code that this image has changed. */ Tk_ImageChanged(masterPtr->tkMaster, 0, 0, masterPtr->width, masterPtr->height, masterPtr->width, masterPtr->height); return TCL_OK; } /* end ImgPictClip */ static int ImgPictThreshold(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv) { PictInstance *instancePtr; int loval,hival,inval,outval; int rdval; double dloval,dhival,dinval,doutval; int sim; int parsed1 = 1; char *arg; int argstart; int has_lo; int has_hi; if( argc == 2 ) { Tcl_AppendResult(interp,"Usage ",argv[0]," threshold -loval [-hival -inval -outval ] \n",(char*)NULL); return TCL_ERROR; } has_lo = has_hi = 0; argstart = 2; if ( masterPtr->datatype == BYTE ) { inval = 255; outval = 0; } else if ( masterPtr->datatype == WORD || masterPtr->datatype == LWORD ) { inval = 1; outval = 0; } else if (masterPtr->datatype == REAL ) { /*this should be duplicated for DOUBLEs, but since I don't have the plb segment library, I've no idea how. LEB */ dinval = 1.0; doutval = 0.0; } if ( masterPtr->datatype != REAL ) { /*this should be duplicated for DOUBLEs, but since I don't have the plb segment library, I've no idea how. LEB */ while( (argstart [-hival -inval -outval ] \n",(char*)NULL); return TCL_ERROR; } if(masterPtr->datatype == BYTE) { if((rdval<0 || rdval > 255)) { Tcl_AppendResult(interp, argv[0], "threshold: ", "parameters should be in range [0-255]", (char *) NULL); return TCL_ERROR; } } else if(masterPtr->datatype == WORD) { if((loval<-32767) || (loval > 32767)) { Tcl_AppendResult(interp, argv[0], "threshold: ", "parameters should be in range [-32768,32768]", (char *) NULL); return TCL_ERROR; } } } } else { /* process floating-points */ while ((arg = argv[argstart]) != NULL && parsed1) { parsed1 = 0; if (strcmp(arg,"-loval") == 0) { has_lo = parsed1 = 1; ++argstart; if( argv[argstart] != NULL ) { if( (Tcl_GetDouble(interp, argv[argstart], &dloval) != TCL_OK)) { Tcl_AppendResult(interp," could not read value for ",arg, " option",(char*)NULL); return TCL_ERROR; } } argstart++; } else if (strcmp(arg,"-hival") == 0) { has_hi = parsed1 = 1; ++argstart; if( argv[argstart] != NULL ) { if( (Tcl_GetDouble(interp, argv[argstart], &dhival) != TCL_OK)) { Tcl_AppendResult(interp," could not read value for ",arg," option",(char*)NULL); return TCL_ERROR; } } argstart++; } else if (strcmp(arg,"-inval") == 0) { parsed1 = 1; ++argstart; if( argv[argstart] != NULL ) { if( (Tcl_GetDouble(interp, argv[argstart], &dinval) != TCL_OK)) { Tcl_AppendResult(interp," could not read value for ",arg, " option",(char*)NULL); return TCL_ERROR; } } argstart++; } else if (strcmp(arg,"-outval") == 0) { parsed1 = 1; ++argstart; if( argv[argstart] != NULL ) { if( (Tcl_GetDouble(interp, argv[argstart], &doutval) != TCL_OK)) { Tcl_AppendResult(interp," could not read value for ",arg, " option",(char*)NULL); return TCL_ERROR; } } argstart++; } else { Tcl_AppendResult(interp,"Usage ",argv[0]," threshold -loval [-hival -in -out ] \n",(char*)NULL); return TCL_ERROR; } } } if( !has_lo) { Tcl_AppendResult(interp,"Usage ",argv[0]," threshold -loval [-hival -inval -outval ] \n",(char*)NULL); return TCL_ERROR; } sim = masterPtr->width*masterPtr->height; if(masterPtr->datatype == BYTE) { if( !has_hi ) lthres_above_ubyte((unsigned char*)masterPtr->data, (unsigned char*)masterPtr->data, sim, loval,inval,outval); else lthres_between_ubyte((unsigned char*)masterPtr->data, (unsigned char*)masterPtr->data, sim, loval,hival,inval,outval); } else if(masterPtr->datatype == WORD ) { if( !has_hi ) lthres_above_short((short*)masterPtr->data, (short*)masterPtr->data, sim,loval,inval,outval); else lthres_between_short((short*)masterPtr->data, (short*)masterPtr->data, sim,loval,hival,inval,outval); } else if(masterPtr->datatype == LWORD ) { if( !has_hi ) lthres_above_int((int*)masterPtr->data, (int*)masterPtr->data, sim,loval,inval,outval); else lthres_between_int((int*)masterPtr->data, (int*)masterPtr->data, sim,loval,hival,inval,outval); } else if(masterPtr->datatype == REAL ) { /*this should be duplicated for DOUBLEs, but since I don't have the plb segment library, I've no idea how. LEB */ if( !has_hi ) lthres_above_float((float*)masterPtr->data, (float*)masterPtr->data, sim,(float)dloval,(float)dinval,(float)doutval); else lthres_between_float((float*)masterPtr->data, (float*)masterPtr->data, sim, (float)dloval,(float)dhival, (float)dinval,(float)doutval); } normalize_data(masterPtr); /* * Update each instance. */ for(instancePtr = masterPtr->instancePtr; instancePtr != NULL; instancePtr = instancePtr->nextPtr) DitherInstance(instancePtr, 0, 0, masterPtr->width, masterPtr->height); /* * Tell the core image code that this image has changed. */ Tk_ImageChanged(masterPtr->tkMaster, 0, 0, masterPtr->width, masterPtr->height, masterPtr->width, masterPtr->height); return TCL_OK; } /* end ImgPictThreshold */ static int ImgPictSmooth(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv) { Tk_PictHandle srcHandle; PictMaster *srcMasterPtr; Tk_PictImageBlock block; float *temp_img; float *buffer; int nr,nc; int npts; float *binom_filter; int filter_order=7; int len; if(argc != 3 && argc != 5) { Tcl_AppendResult(interp,"wrong # of arguments, should be ", argv[0], " smooth [-order ]", (char *) NULL); return TCL_ERROR; } if( argc==5 ) { len = strlen(argv[3]); if (strncmp(argv[3],"-order",len) != 0 || (Tcl_GetInt(interp, argv[4], &filter_order) != TCL_OK )) { Tcl_AppendResult(interp," wrong # of arguments, should be ", argv[0], "smooth [-order ]", (char *) NULL); return TCL_ERROR; } if (filter_order<1 || filter_order> 40) { Tcl_AppendResult(interp,"The order of the low-pass filter is too big. The maximum acceptable value is 40", (char *) NULL); return TCL_ERROR; } } if ((srcHandle = Tk_FindPict(argv[2])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } srcMasterPtr = (PictMaster *)srcHandle; if( srcMasterPtr->data == NULL ) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " contain any data", (char *) NULL); return TCL_ERROR; } /* allocate memory */ nr = srcMasterPtr->height; nc = srcMasterPtr->width; npts = nr*nc; temp_img = (float*)ckalloc(npts*sizeof(float)); if ( temp_img == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in smooth ", (char*)NULL); return TCL_ERROR; } /* convert to float and allocate memory */ buffer = (float*)ckalloc(npts*sizeof(float)); if ( buffer == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in smooth ", (char*)NULL); return TCL_ERROR; } /* allocate memory for filter */ binom_filter = (float*)ckalloc(filter_order*sizeof(float)); if ( binom_filter == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in smooth ", (char*)NULL); return TCL_ERROR; } lconvert_types(npts, (void*)srcMasterPtr->data, srcMasterPtr->datatype, (void*)buffer, REAL); lbinom_float_1D(binom_filter,filter_order); lconvolve2D_float((char*)buffer,(char*)binom_filter,(char*)temp_img, nr,nc,filter_order,1); lconvolve2D_float((char*)temp_img,(char*)binom_filter,(char*)buffer, nr,nc,1,filter_order); block.width = nc; block.height = nr; block.pitch = nc; block.pixelSize = sizeof(float); block.datatype = REAL; block.copy = NO_COPY; block.skip = 0; block.pixel_x = srcMasterPtr->pixel_x; block.pixel_y = srcMasterPtr->pixel_y; block.pixelPtr = (unsigned char*)buffer; /* set image size */ Tk_PictExpand(masterPtr,nc,nr); Tk_PictPutBlock(masterPtr,&block,0,0,nc,nr); /* free memory */ ckfree((void*)temp_img); ckfree((void*)binom_filter); return TCL_OK; } /* end ImgPictSmooth */ static int ImgPictGradient(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv) { Tk_PictHandle srcHandle; PictMaster *srcMasterPtr; Tk_PictImageBlock block; float *g_img; float *buffer; int npts; int nr,nc; int len; float *binom_filter; int filter_order = 1; if(argc != 3 && argc != 5) { Tcl_AppendResult(interp,"wrong # of arguments, should be ", argv[0], " gradient [-order ]", (char *) NULL); return TCL_ERROR; } if( argc==5 ) { len = strlen(argv[3]); if (strncmp(argv[3],"-order",len) != 0 || (Tcl_GetInt(interp, argv[4], &filter_order) != TCL_OK )) { Tcl_AppendResult(interp," wrong # of arguments, should be ", argv[0], "gradient [-order ]", (char *) NULL); return TCL_ERROR; } if (filter_order<1 || filter_order> 40) { Tcl_AppendResult(interp,"The order of the low-pass filter is too big. The maximum acceptable value is 40", (char *) NULL); return TCL_ERROR; } } if ((srcHandle = Tk_FindPict(argv[2])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } srcMasterPtr = (PictMaster *)srcHandle; if( srcMasterPtr->data == NULL ) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " contain any data", (char *) NULL); return TCL_ERROR; } /* allocate memory */ nr = srcMasterPtr->height; nc = srcMasterPtr->width; npts = nr*nc; g_img = (float*)ckalloc(npts*sizeof(float)); if ( g_img == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in gradient ", (char*)NULL); return TCL_ERROR; } /* convert to float if necessary, otherwise copy */ buffer = (float*)ckalloc(npts*sizeof(float)); if ( buffer == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in gradient ", (char*)NULL); return TCL_ERROR; } lconvert_types(npts, (void*)srcMasterPtr->data, srcMasterPtr->datatype, (void*)buffer, REAL); if( filter_order > 1 ) { /* allocate memory for filter */ binom_filter = (float*)ckalloc(filter_order*sizeof(float)); if ( binom_filter == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in gradient ", (char*)NULL); return TCL_ERROR; } lbinom_float_1D(binom_filter,filter_order); lconvolve2D_float((char*)buffer,(char*)binom_filter,(char*)g_img, nr,nc,filter_order,1); lconvolve2D_float((char*)g_img,(char*)binom_filter,(char*)buffer, nr,nc,1,filter_order); } lgradient2D_float((float*)buffer,(float*)g_img,nr,nc); block.width = nc; block.height = nr; block.pitch = nc; block.pixelSize = sizeof(float); block.datatype = REAL; block.copy = NO_COPY; block.skip = 0; block.pixel_x = srcMasterPtr->pixel_x; block.pixel_y = srcMasterPtr->pixel_y; block.pixelPtr = (unsigned char*)g_img; /* set the dimensions to force reallocation of memory */ masterPtr->width = 0; masterPtr->height = 0; Tk_PictPutBlock(masterPtr,&block,0,0,nc,nr); /* free memory */ ckfree((void*)buffer); if( filter_order > 1 ) ckfree((void*)binom_filter); return TCL_OK; } /* end ImgPictGradient */ static int ImgPictLaplacian(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv) { Tk_PictHandle srcHandle; PictMaster *srcMasterPtr; Tk_PictImageBlock block; float *g_img; float *buffer; int npts; int nr,nc; int len; if(argc != 3) { Tcl_AppendResult(interp,"wrong # of arguments, should be ", argv[0], " laplacian ", (char *) NULL); return TCL_ERROR; } if ((srcHandle = Tk_FindPict(argv[2])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } srcMasterPtr = (PictMaster *)srcHandle; if( srcMasterPtr->data == NULL ) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " contain any data", (char *) NULL); return TCL_ERROR; } /* allocate memory */ nr = srcMasterPtr->height; nc = srcMasterPtr->width; npts = nr*nc; g_img = (float*)ckalloc(npts*sizeof(float)); if ( g_img == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in laplacian ", (char*)NULL); return TCL_ERROR; } /* convert to float if necessary, otherwise copy */ buffer = (float*)ckalloc(npts*sizeof(float)); if ( buffer == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in laplacian ", (char*)NULL); return TCL_ERROR; } lconvert_types(npts, (void*)srcMasterPtr->data, srcMasterPtr->datatype, (void*)buffer, REAL); llaplacian2D_float((float*)buffer,(float*)g_img,nr,nc); block.width = nc; block.height = nr; block.pitch = nc; block.pixelSize = sizeof(float); block.datatype = REAL; block.copy = NO_COPY; block.skip = 0; block.pixel_x = srcMasterPtr->pixel_x; block.pixel_y = srcMasterPtr->pixel_y; block.pixelPtr = (unsigned char*)g_img; /* set the dimensions to force reallocation of memory */ masterPtr->width = 0; masterPtr->height = 0; Tk_PictPutBlock(masterPtr,&block,0,0,nc,nr); /* free memory */ ckfree((void*)buffer); return TCL_OK; } /* end ImgPictLaplacian */ static int ImgPictZeroCrng(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv) { Tk_PictHandle srcHandle; PictMaster *srcMasterPtr; Tk_PictImageBlock block; unsigned char *result; float *buffer; int npts; int nr,nc; int i,j; unsigned char temp; if(argc != 3) { Tcl_AppendResult(interp,"wrong # of arguments, should be ", argv[0], " zero_crossings ", (char *) NULL); return TCL_ERROR; } if ((srcHandle = Tk_FindPict(argv[2])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } srcMasterPtr = (PictMaster *)srcHandle; if( srcMasterPtr->data == NULL ) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " contain any data", (char *) NULL); return TCL_ERROR; } if( srcMasterPtr->datatype != REAL ) { Tcl_AppendResult(interp, "Can only compute zero-crossings for floating-point images", (char *) NULL); return TCL_ERROR; } /* allocate memory */ nr = srcMasterPtr->height; nc = srcMasterPtr->width; npts = nr*nc; result = (unsigned char*)ckalloc(npts*sizeof(unsigned char)); if ( result == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in zero_crossings ", (char*)NULL); return TCL_ERROR; } memset((void*)result,0,npts*sizeof(unsigned char)); buffer = (float*)(srcMasterPtr->data); /* detect zero_crossings */ for(i=1;i<(nc-1);i++) for(j=1;j<(nr-1);j++) { temp = 0; if( buffer[j*nc+i] < 0.0 ) { if(((float)(buffer[(j+1)*nc +i]) > 0.) || ((float)(buffer[j*nc +i+1]) > 0.) ) temp = 255; } if( buffer[j*nc+i] >= 0.0 ) { if(((float)(buffer[(j+1)*nc +i]) <= 0.) || ((float)(buffer[j*nc +i+1]) <= 0.) ) temp = 255; } result[j*nc + i ] = temp; } block.width = nc; block.height = nr; block.pitch = nc; block.pixelSize = sizeof(unsigned char); block.datatype = BYTE; block.copy = NO_COPY; block.skip = 0; block.pixel_x = srcMasterPtr->pixel_x; block.pixel_y = srcMasterPtr->pixel_y; block.pixelPtr = (unsigned char*)result; /* set the dimensions to force reallocation of memory */ masterPtr->width = 0; masterPtr->height = 0; Tk_PictPutBlock(masterPtr,&block,0,0,nc,nr); return TCL_OK; } /* end ImgPictZeroCrng */ static int ImgPictErosion(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv) { Tk_PictHandle srcHandle; PictMaster *srcMasterPtr; Tk_PictImageBlock block; unsigned char *result; int nr,nc; int x,y; int npts; if(argc != 5) { Tcl_AppendResult(interp,"wrong # of arguments, should be ", argv[0], " erosion x y", (char *) NULL); return TCL_ERROR; } if((Tcl_GetInt(interp, argv[3], &x) != TCL_OK) || (Tcl_GetInt(interp, argv[4], &y) != TCL_OK)) { Tcl_AppendResult(interp," wrong arguments, should be ", argv[0], " erosion x y", (char *) NULL); return TCL_ERROR; } if ((srcHandle = Tk_FindPict(argv[2])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } srcMasterPtr = (PictMaster *)srcHandle; if( srcMasterPtr->data == NULL ) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " contain any data", (char *) NULL); return TCL_ERROR; } /* allocate memory */ nr = srcMasterPtr->height; nc = srcMasterPtr->width; npts = nr*nc; /* allocate memory for result */ result = (unsigned char*)ckalloc(npts*sizeof(unsigned char)); if ( result == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in erosion ", (char*)NULL); return TCL_ERROR; } memcpy((void*)result,(void*)(srcMasterPtr->bytedata), (size_t)(npts*sizeof(unsigned char))); if( !lseparable_erosion_3D(result,nr,nc,1, x,y,0) ) { Tcl_AppendResult(interp, "lerosion_3D failed", (char*)NULL); ckfree((void*)result); return TCL_ERROR; } block.width = nc; block.height = nr; block.pitch = nc; block.pixelSize = sizeof(unsigned char); block.datatype = BYTE; block.copy = NO_COPY; block.skip = 0; block.pixel_x = srcMasterPtr->pixel_x; block.pixel_y = srcMasterPtr->pixel_y; block.pixelPtr = (unsigned char*)result; /* set image size */ Tk_PictExpand(masterPtr,nc,nr); Tk_PictPutBlock(masterPtr,&block,0,0,nc,nr); return TCL_OK; } /* end ImgPictErosion*/ static int ImgPictDilation(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv) { Tk_PictHandle srcHandle; PictMaster *srcMasterPtr; Tk_PictImageBlock block; unsigned char *result; int nr,nc; int x,y; int npts; if(argc != 5) { Tcl_AppendResult(interp,"wrong # of arguments, should be ", argv[0], " dilation x y", (char *) NULL); return TCL_ERROR; } if((Tcl_GetInt(interp, argv[3], &x) != TCL_OK) || (Tcl_GetInt(interp, argv[4], &y) != TCL_OK)) { Tcl_AppendResult(interp," wrong arguments, should be ", argv[0], " dilation x y", (char *) NULL); return TCL_ERROR; } if ((srcHandle = Tk_FindPict(argv[2])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } srcMasterPtr = (PictMaster *)srcHandle; if( srcMasterPtr->data == NULL ) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " contain any data", (char *) NULL); return TCL_ERROR; } /* allocate memory */ nr = srcMasterPtr->height; nc = srcMasterPtr->width; npts = nr*nc; /* allocate memory for result */ result = (unsigned char*)ckalloc(npts*sizeof(unsigned char)); if ( result == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in dilation ", (char*)NULL); return TCL_ERROR; } memcpy((void*)result,(void*)(srcMasterPtr->bytedata), (size_t)(npts*sizeof(unsigned char))); if( !lseparable_dilation_3D(result,nr,nc,1, x,y,0) ) { Tcl_AppendResult(interp, "ldilation_3D failed", (char*)NULL); ckfree((void*)result); return TCL_ERROR; } block.width = nc; block.height = nr; block.pitch = nc; block.pixelSize = sizeof(unsigned char); block.datatype = BYTE; block.copy = NO_COPY; block.skip = 0; block.pixel_x = srcMasterPtr->pixel_x; block.pixel_y = srcMasterPtr->pixel_y; block.pixelPtr = (unsigned char*)result; /* set image size */ Tk_PictExpand(masterPtr,nc,nr); Tk_PictPutBlock(masterPtr,&block,0,0,nc,nr); return TCL_OK; } /* end ImgPictDilation*/ static int ImgPictCloseHoles(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv) { Tk_PictHandle srcHandle; PictMaster *srcMasterPtr; Tk_PictImageBlock block; unsigned char *temp_img; unsigned char *marker; int nr,nc; int npts; if(argc != 3) { Tcl_AppendResult(interp,"wrong # of arguments, should be ", argv[0], " close_holes ", (char *) NULL); return TCL_ERROR; } if ((srcHandle = Tk_FindPict(argv[2])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } srcMasterPtr = (PictMaster *)srcHandle; if( srcMasterPtr->data == NULL ) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " contain any data", (char *) NULL); return TCL_ERROR; } /* allocate memory */ nr = srcMasterPtr->height; nc = srcMasterPtr->width; npts = nr*nc; /* allocate memory for marker */ marker = (unsigned char*)ckalloc(npts*sizeof(unsigned char)); if ( marker == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in close_holes ", (char*)NULL); return TCL_ERROR; } temp_img = (unsigned char *)(srcMasterPtr->bytedata); if( !lclose_holes_3D(temp_img,marker,255,nr,nc,1,0) ) { Tcl_AppendResult(interp, "lclose_holes_3D failed", (char*)NULL); ckfree((void*)marker); return TCL_ERROR; } block.width = nc; block.height = nr; block.pitch = nc; block.pixelSize = sizeof(unsigned char); block.datatype = BYTE; block.copy = NO_COPY; block.skip = 0; block.pixel_x = srcMasterPtr->pixel_x; block.pixel_y = srcMasterPtr->pixel_y; block.pixelPtr = (unsigned char*)marker; /* set image size */ Tk_PictExpand(masterPtr,nc,nr); Tk_PictPutBlock(masterPtr,&block,0,0,nc,nr); return TCL_OK; } /* end ImgPictCloseHoles */ static int ImgPictGetHoles(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv) { Tk_PictHandle srcHandle; PictMaster *srcMasterPtr; Tk_PictImageBlock block; unsigned char *temp_img; unsigned char *marker; int nr,nc; int npts; int i; if(argc != 3) { Tcl_AppendResult(interp,"wrong # of arguments, should be ", argv[0], " get_holes ", (char *) NULL); return TCL_ERROR; } if ((srcHandle = Tk_FindPict(argv[2])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } srcMasterPtr = (PictMaster *)srcHandle; if( srcMasterPtr->data == NULL ) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " contain any data", (char *) NULL); return TCL_ERROR; } /* allocate memory */ nr = srcMasterPtr->height; nc = srcMasterPtr->width; npts = nr*nc; /* allocate memory for marker */ marker = (unsigned char*)ckalloc(npts*sizeof(unsigned char)); if ( marker == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in close_holes ", (char*)NULL); return TCL_ERROR; } temp_img = (unsigned char*)(srcMasterPtr->bytedata); if( !lclose_holes_3D(temp_img,marker,255,nr,nc,1,0) ) { Tcl_AppendResult(interp, "lclose_holes_3D failed", (char*)NULL); ckfree((void*)marker); return TCL_ERROR; } /* now get the holes by substraction */ for(i=0;ipixel_x; block.pixel_y = srcMasterPtr->pixel_y; block.pixelPtr = (unsigned char*)marker; /* set image size */ Tk_PictExpand(masterPtr,nc,nr); Tk_PictPutBlock(masterPtr,&block,0,0,nc,nr); return TCL_OK; } /* end ImgPictGetHoles */ static int ImgPictDistanceTransform(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv) { Tk_PictHandle srcHandle; PictMaster *srcMasterPtr; Tk_PictImageBlock block; unsigned char *temp_img; short *result; int nr,nc; int npts; int dist; if(argc != 4) { Tcl_AppendResult(interp,"wrong # of arguments, should be ", argv[0], " dt [34|5711]", (char *) NULL); return TCL_ERROR; } if ((srcHandle = Tk_FindPict(argv[2])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } srcMasterPtr = (PictMaster *)srcHandle; if( srcMasterPtr->data == NULL ) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " contain any data", (char *) NULL); return TCL_ERROR; } if((Tcl_GetInt(interp, argv[3], &dist) != TCL_OK) || (dist != 34 && dist != 5711)) { Tcl_AppendResult(interp," wrong arguments, should be ", argv[0], " dt [34|5711]", (char *) NULL); return TCL_ERROR; } /* allocate memory */ nr = srcMasterPtr->height; nc = srcMasterPtr->width; npts = nr*nc; /* allocate memory for output */ result = (short*)ckalloc(npts*sizeof(short)); if ( result == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in DistanceTransform", (char*)NULL); return TCL_ERROR; } temp_img = (unsigned char*)(srcMasterPtr->bytedata); if( !ldt_2D(temp_img, result,nr,nc, 1, /* one slice */ dist, /* type of distance */ 1)) { /* force normalization */ Tcl_AppendResult(interp, "ldt_2D failed", (char*)NULL); ckfree((void*)result); return TCL_ERROR; } block.width = nc; block.height = nr; block.pitch = nc; block.pixelSize = sizeof(short); block.datatype = WORD; block.copy = NO_COPY; block.skip = 0; block.pixel_x = srcMasterPtr->pixel_x; block.pixel_y = srcMasterPtr->pixel_y; block.pixelPtr = (unsigned char*)result; /* set image size */ Tk_PictExpand(masterPtr,nc,nr); Tk_PictPutBlock(masterPtr,&block,0,0,nc,nr); return TCL_OK; } /* end ImgPictDistanceTransform*/ static int ImgPictLabel(Tcl_Interp *interp, PictMaster *masterPtr, int argc, char **argv) { Tk_PictHandle srcHandle; PictMaster *srcMasterPtr; Tk_PictImageBlock block; unsigned char *temp_img; short *result; int nr,nc; int npts; char *arg; int argstart; int parsed1; int hival = 1; int loval = 1; int has_lo = 0; int su = 0; int ma =0 ; int stretch = 0; int minlab = 1; int verbose = 0; if(argc < 3) { Tcl_AppendResult(interp,"wrong # of arguments, should be ", argv[0], " label [-hival -loval -su -ma -minlab -v]", (char *) NULL); return TCL_ERROR; } if ((srcHandle = Tk_FindPict(argv[2])) == NULL) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " exist or is not a Pict image", (char *) NULL); return TCL_ERROR; } srcMasterPtr = (PictMaster *)srcHandle; if( srcMasterPtr->data == NULL ) { Tcl_AppendResult(interp, "image \"", argv[2], "\" doesn't", " contain any data", (char *) NULL); return TCL_ERROR; } argstart = 3; while ( (argstart 255 || loval > 255 || minlab > 255) { Tcl_AppendResult(interp," hival, loval and minlab values should be lower than 255",(char*)NULL); return TCL_ERROR; } if( minlab > 1 ) stretch = 1; /* allocate memory */ nr = srcMasterPtr->height; nc = srcMasterPtr->width; npts = nr*nc; /* allocate memory for input */ temp_img = (unsigned char*)ckalloc(npts*sizeof(unsigned char)); if ( temp_img == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in label", (char*)NULL); return TCL_ERROR; } memcpy((void*)temp_img,(void*)(srcMasterPtr->bytedata),npts); /* allocate memory for output */ result = (short*)ckalloc(npts*sizeof(short)); if ( result == NULL) { Tcl_AppendResult(interp, "Cannot allocate memory in label", (char*)NULL); ckfree((void*)temp_img); return TCL_ERROR; } if( lflabel_2D_short(temp_img, result, nr,nc, su, ma, (unsigned char)hival, (unsigned char)loval, (unsigned char)stretch, (unsigned char)minlab, (char)verbose) < 0) { Tcl_AppendResult(interp, "lflabel_2D_short failed", (char*)NULL); ckfree((void*)result); ckfree((void*)temp_img); return TCL_ERROR; } block.width = nc; block.height = nr; block.pitch = nc; block.pixelSize = sizeof(short); block.datatype = WORD; block.copy = NO_COPY; block.skip = 0; block.pixel_x = srcMasterPtr->pixel_x; block.pixel_y = srcMasterPtr->pixel_y; block.pixelPtr = (unsigned char*)result; /* set image size */ Tk_PictExpand(masterPtr,nc,nr); Tk_PictPutBlock(masterPtr,&block,0,0,nc,nr); /* free memory */ ckfree((void*)temp_img); return TCL_OK; } /* end ImgPictLabel */ #endif /* *---------------------------------------------------------------------- * * Tk_PictPutScaledBlock -- * * This procedure is called to put image data into a Pict image, * with possible zooming of the pixels. * * Results: * None. * * Side effects: * The image data is stored. The image may be expanded. * The Tk image code is informed that the image has changed. * *---------------------------------------------------------------------- */ void Tk_PictPutScaledBlock(handle, blockPtr, x, y, width, height, zoomX, zoomY, Xoff, Yoff) Tk_PictHandle handle; /* Opaque handle for the Pict image * to be updated. */ register Tk_PictImageBlock *blockPtr; /* Pointer to a structure describing the * pixel data to be copied into the image. */ int x, y; /* Coordinates of the top-left pixel to * be updated in the image. */ int width, height; /* Dimensions of the area of the image * to be updated. */ double zoomX, zoomY; /* Zoom factors for the X and Y axes. */ double Xoff, Yoff; /* Offset into initial pixel data */ { register PictMaster *masterPtr; PictInstance *instancePtr; int xEnd, yEnd; int wCopy, hCopy; unsigned char *srcPtr, *srcLinePtr; unsigned char *destPtr, *destLinePtr; int pitch; double xRepeat, yRepeat; int blockXSkip, blockYSkip; XRectangle rect; register int il; #ifdef DEBUG printf("PowPictPutZoomedBlock\n"); #endif if ((zoomX == 1.01) && (zoomY == 1.0)) { Tk_PictPutBlock(handle, blockPtr, x, y, width, height); return; } masterPtr = (PictMaster *) handle; if ((zoomX <= 0.0) || (zoomY <= 0.0)) return; if ((masterPtr->userWidth != 0) && ((x + width) > masterPtr->userWidth)) { width = masterPtr->userWidth - x; } if ((masterPtr->userHeight != 0) && ((y + height) > masterPtr->userHeight)) { height = masterPtr->userHeight - y; } if ((width <= 0) || (height <= 0)) return; xEnd = x + width; yEnd = y + height; if ((xEnd > masterPtr->width) || (yEnd > masterPtr->height)) { ImgPictSetSize(masterPtr, MAX(xEnd, masterPtr->width), MAX(yEnd, masterPtr->height)); } if( masterPtr->data == NULL ) { #ifdef DEBUG printf("needs allocation \n"); #endif masterPtr->datatype = blockPtr->datatype; masterPtr->datasize = blockPtr->pixelSize; masterPtr->pixel_x = blockPtr->pixel_x; masterPtr->pixel_y = blockPtr->pixel_y; masterPtr->data = (char*)ckalloc((size_t)masterPtr->datasize* masterPtr->width* masterPtr->height); if( masterPtr->data == NULL ) { (void)fprintf(stderr,"Could not allocate memory \n"); return; } } else { if (masterPtr->datatype != blockPtr->datatype ) { (void)fprintf(stderr,"Type mismatch \n"); return; } if ((masterPtr->pixel_x != blockPtr->pixel_x) || (masterPtr->pixel_y != blockPtr->pixel_y) ) { printf("Warning : the physical dimensions of the block being read will not be saved \n"); } } destLinePtr = (unsigned char*)(masterPtr->data + (y * masterPtr->width + x)*masterPtr->datasize); pitch = masterPtr->width*masterPtr->datasize; srcLinePtr = blockPtr->pixelPtr; blockXSkip = blockPtr->pixelSize; blockYSkip = blockPtr->pitch * blockPtr->pixelSize; yRepeat = Yoff; for (hCopy=height; hCopy > 0; hCopy--) { destPtr = destLinePtr; srcPtr = srcLinePtr; xRepeat = Xoff; for (wCopy=width; wCopy > 0; wCopy--) { for(il=0;ildatasize;il++) *destPtr++ = srcPtr[il]; xRepeat--; while( xRepeat <= 0.0 ) { srcPtr += blockXSkip; xRepeat += zoomX; } } destLinePtr += pitch; yRepeat--; while( yRepeat <= 0.0 ) { srcLinePtr += blockYSkip; yRepeat += zoomY; } } normalize_data(masterPtr); blockPtr->pixelPtr = NULL; /* * Add this new block to the region that specifies which data is valid. */ rect.x = x; rect.y = y; rect.width = width; rect.height = height; XUnionRectWithRegion(&rect, masterPtr->validRegion, masterPtr->validRegion); /* * Update each instance. */ for(instancePtr = masterPtr->instancePtr; instancePtr != NULL; instancePtr = instancePtr->nextPtr) DitherInstance(instancePtr, x, y, width, height); /* * Tell the core image code that this image has changed. */ Tk_ImageChanged(masterPtr->tkMaster, x, y, width, height, masterPtr->width, masterPtr->height); } fv5.4/tcltk/pow/XRange.html0000644000220700001010000000341310450557573015220 0ustar birbylheadev The POW X Range Selection

      The POW X Range Selection

      Overview

      POW provides the user with the ability to restrict the analysis to only those photons that were detected within certain time intervals.

      Creating a Range

      When the range dialog box is open, a new range can be created by placing the mouse at the desired location in the graph and click-and-drag with the left mouse button down.

      Current Range and Manipulation

      The current range is the one highlighted in the dialog's list of ranges and "tagged" on the plot. Upon selection (clicking the left mouse button on a range in the list or on the graph itself) or creation, the definition of the current range is placed in the current range portion of the dialog box. A range consists of 2 parts: beginning and ending value on the X axis.

      To move a range, simply click the left mouse button on tope of the range and drag it to the new location.

      The Delete button in the Range dialog deletes the current range and the next range in the list (or previous range if deleting the last range) becomes the current range. All the ranges can be deleted with the Clear All button.

      To Split a range into 2 pieces by holding down the 'shift' key while dragging the left mouse across the middle of the colored horizontal bar for that time range.

      To see finer details, zoom in on the plot by dragging out the area of interest with the right mouse button.

      'Double click' the right mouse button to unzoom and see the entire area of the plot.

      Saving/Opening Range Files

      At the bottom of the Region dialog are a pair of Open and Save buttons which will read and write range files. fv5.4/tcltk/pow/configure0000755000220700001010000024154607730104104015051 0ustar birbylheadev#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: ac_help="$ac_help --with-tcl Path to tcl source " ac_help="$ac_help --with-tk Path to tk source " ac_help="$ac_help --with-x use the X Window System" # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. ac_max_here_lines=12 ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case "$ac_option" in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir="$ac_optarg" ;; -build | --build | --buil | --bui | --bu) ac_prev=build ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "enable_${ac_feature}='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix="$ac_optarg" ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he) # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names EOF cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR EOF if test -n "$ac_help"; then echo "--enable and --with options recognized:$ac_help" fi exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir="$ac_optarg" ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir="$ac_optarg" ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir="$ac_optarg" ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir="$ac_optarg" ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir="$ac_optarg" ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir="$ac_optarg" ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir="$ac_optarg" ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix="$ac_optarg" ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix="$ac_optarg" ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix="$ac_optarg" ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name="$ac_optarg" ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir="$ac_optarg" ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir="$ac_optarg" ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site="$ac_optarg" ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir="$ac_optarg" ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.13" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` eval "with_${ac_package}=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes="$ac_optarg" ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries="$ac_optarg" ;; -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 6 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 6>/dev/null else exec 6>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set these to C if already set. These must not be set unconditionally # because not all systems understand e.g. LANG=C (notably SCO). # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! # Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo > confdefs.h # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=Makefile.in # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then echo "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross ac_exeext= ac_objext=o if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi # From configure.in Revision: 1.22 if test $cache_file = ./config.cache; then cache_file=`pwd`/config.cache fi # Check whether --with-tcl or --without-tcl was given. if test "${with_tcl+set}" = set; then withval="$with_tcl" TCLPATH=$withval fi # Check whether --with-tk or --without-tk was given. if test "${with_tk+set}" = set; then withval="$with_tk" TKPATH=$withval fi #------------------------------------------------------------------------------- # Determine system type #------------------------------------------------------------------------------- BIN_EXT= if test "x$EXT" = x; then EXT=lnx; fi if test "x$BINDIR" = x; then # Extract the first word of "uname", so it can be a program name with args. set dummy uname; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:564: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_UNAME'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$UNAME"; then ac_cv_prog_UNAME="$UNAME" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_UNAME="uname" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_UNAME" && ac_cv_prog_UNAME="nouname" fi fi UNAME="$ac_cv_prog_UNAME" if test -n "$UNAME"; then echo "$ac_t""$UNAME" 1>&6 else echo "$ac_t""no" 1>&6 fi if test $UNAME = nouname; then { echo "configure: error: HEAsoft: Unable to guess system type. Please set it using --with-bindir option" 1>&2; exit 1; } fi BINDIR=`$UNAME -s 2> /dev/null`_`$UNAME -r 2> /dev/null | sed 's:[^0-9]*\([0-9][0-9]*\.[0-9]*\).*:\1:'` lhea_machine=`$UNAME -m 2> /dev/null` BIN_EXT= case $BINDIR in CYGWIN*) BINDIR=CYGWIN32_`$UNAME -a 2> /dev/null | awk '{ print $4 }'` lhea_machine= BIN_EXT=".exe" EXT=lnx ;; IRIX*) echo "configure: warning: IRIX support is marginal" 1>&2 EXT=sgi ;; HP-UX*) echo "configure: warning: HP-UX support is marginal" 1>&2 EXT=hpu lhea_machine=`$UNAME -m 2> /dev/null | tr '/' ' ' | awk '{ print $2 }'` ;; Linux*) EXT=lnx ;; OSF1*) EXT=osf ;; SunOS_4*) echo "configure: warning: SunOS 4.x is not supported!" 1>&2 echo "configure: warning: PROCEED AT YOUR OWN RISK!" 1>&2 EXT=sun lhea_machine=sparc ;; SunOS_5*) EXT=sol lhea_machine=`$UNAME -p` ;; Darwin_*) EXT=darwin lhea_machine=`$UNAME -p` ;; *) { echo "configure: error: Unable to recognize your system. Please make sure this platform is supported." 1>&2; exit 1; } ;; esac if test x$lhea_machine != x; then BINDIR=$BINDIR"_"$lhea_machine fi fi #------------------------------------------------------------------------------- # Checks for programs. #------------------------------------------------------------------------------- # Try first to find a proprietary C compiler, then gcc if test "x$CC" = x; then for ac_prog in cc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:657: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="$ac_prog" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi test -n "$CC" && break done fi # Set up flags to use the selected compiler # # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:692: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:722: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_prog_rejected=no ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" break fi done IFS="$ac_save_ifs" if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# -gt 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift set dummy "$ac_dir/$ac_word" "$@" shift ac_cv_prog_CC="$@" fi fi fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then case "`uname -s`" in *win32* | *WIN32*) # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:773: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="cl" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi ;; esac fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo "configure:805: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF #line 816 "configure" #include "confdefs.h" main(){return(0);} EOF if { (eval echo configure:821: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then ac_cv_prog_cc_cross=no else ac_cv_prog_cc_cross=yes fi else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_prog_cc_works=no fi rm -fr conftest* ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo "configure:847: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo "configure:852: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no fi fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes else GCC= fi ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo "configure:880: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ac_cv_prog_cc_g=yes else ac_cv_prog_cc_g=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi if test "$cross_compiling" = yes; then echo "configure: warning: Cannot run a simple C executable on your system:" 1>&2 echo "configure: warning: There may be something wrong with your compiler" 1>&2 echo "configure: warning: or perhaps you're trying to cross-compile?" 1>&2 echo "configure: warning: Cross-compiling is not supported within HEAsoft." 1>&2 echo "configure: warning: Please make sure your compiler is working." 1>&2 echo "configure: warning: Contact the FTOOLS help desk for further assistance." 1>&2 { echo "configure: error: Cross-compiling is not allowed." 1>&2; exit 1; } fi if test "x$GCC" = x; then GCC=no fi # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:927: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_RANLIB="ranlib" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" fi fi RANLIB="$ac_cv_prog_RANLIB" if test -n "$RANLIB"; then echo "$ac_t""$RANLIB" 1>&6 else echo "$ac_t""no" 1>&6 fi if test $EXT = darwin; then RANLIB="$RANLIB -cs" fi # RANLIB on IRIX is flaky if test $EXT = sgi; then RANLIB=: fi #------------------------------------------------------------------------------- # Checks for libraries. #------------------------------------------------------------------------------- # X XLIBS= XLIBPTH= XINCLUDES= # socket and nsl libraries -- only if needed echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 echo "configure:974: checking for gethostbyname" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) choke me #else gethostbyname(); #endif ; return 0; } EOF if { (eval echo configure:1002: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_gethostbyname=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then echo "$ac_t""yes" 1>&6 : else echo "$ac_t""no" 1>&6 echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 echo "configure:1020: checking for gethostbyname in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo nsl | sed -e 's/^a-zA-Z0-9_/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi fi for ac_func in connect accept do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:1071: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:1099: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 echo $ac_n "checking for main in -lsocket""... $ac_c" 1>&6 echo "configure:1121: checking for main in -lsocket" >&5 ac_lib_var=`echo socket'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lsocket $XLIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo socket | sed -e 's/^a-zA-Z0-9_/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi fi done echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 echo "configure:1169: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # This must be in double quotes, not single quotes, because CPP may get # substituted into the Makefile and "${CC-cc}" will confuse make. CPP="${CC-cc} -E" # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1190: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1207: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1224: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP=/lib/cpp fi rm -f conftest* fi rm -f conftest* fi rm -f conftest* ac_cv_prog_CPP="$CPP" fi CPP="$ac_cv_prog_CPP" else ac_cv_prog_CPP="$CPP" fi echo "$ac_t""$CPP" 1>&6 # If we find X, set shell vars x_includes and x_libraries to the # paths, otherwise set no_x=yes. # Uses ac_ vars as temps to allow command line to override cache and checks. # --without-x overrides everything else, but does not touch the cache. echo $ac_n "checking for X""... $ac_c" 1>&6 echo "configure:1253: checking for X" >&5 # Check whether --with-x or --without-x was given. if test "${with_x+set}" = set; then withval="$with_x" : fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then # Both variables are already set. have_x=yes else if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=NO ac_x_libraries=NO rm -fr conftestdir if mkdir conftestdir; then cd conftestdir # Make sure to not put "make" in the Imakefile rules, since we grep it out. cat > Imakefile <<'EOF' acfindx: @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' EOF if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl; do if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && test -f $ac_im_libdir/libX11.$ac_extension; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case "$ac_im_incroot" in /usr/include) ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; esac case "$ac_im_usrlibdir" in /usr/lib | /lib) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; esac fi cd .. rm -fr conftestdir fi if test "$ac_x_includes" = NO; then # Guess where to find include files, by looking for this one X11 .h file. test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h # First, try using that file with no special directory specified. cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1320: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* # We can compile using X headers with no special include directory. ac_x_includes= else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* # Look for the header file in a standard set of common directories. # Check X11 before X11Rn because it is often a symlink to the current release. for ac_dir in \ /usr/X11/include \ /usr/X11R6/include \ /usr/X11R5/include \ /usr/X11R4/include \ \ /usr/include/X11 \ /usr/include/X11R6 \ /usr/include/X11R5 \ /usr/include/X11R4 \ \ /usr/local/X11/include \ /usr/local/X11R6/include \ /usr/local/X11R5/include \ /usr/local/X11R4/include \ \ /usr/local/include/X11 \ /usr/local/include/X11R6 \ /usr/local/include/X11R5 \ /usr/local/include/X11R4 \ \ /usr/X386/include \ /usr/x386/include \ /usr/XFree86/include/X11 \ \ /usr/include \ /usr/local/include \ /usr/unsupported/include \ /usr/athena/include \ /usr/local/x11r5/include \ /usr/lpp/Xamples/include \ \ /usr/openwin/include \ /usr/openwin/share/include \ ; \ do if test -r "$ac_dir/$x_direct_test_include"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest* fi # $ac_x_includes = NO if test "$ac_x_libraries" = NO; then # Check for the libraries. test -z "$x_direct_test_library" && x_direct_test_library=Xt test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS="$LIBS" LIBS="-l$x_direct_test_library $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* LIBS="$ac_save_LIBS" # We can link X programs with no special library path. ac_x_libraries= else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* LIBS="$ac_save_LIBS" # First see if replacing the include by lib works. # Check X11 before X11Rn because it is often a symlink to the current release. for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ /usr/X11/lib \ /usr/X11R6/lib \ /usr/X11R5/lib \ /usr/X11R4/lib \ \ /usr/lib/X11 \ /usr/lib/X11R6 \ /usr/lib/X11R5 \ /usr/lib/X11R4 \ \ /usr/local/X11/lib \ /usr/local/X11R6/lib \ /usr/local/X11R5/lib \ /usr/local/X11R4/lib \ \ /usr/local/lib/X11 \ /usr/local/lib/X11R6 \ /usr/local/lib/X11R5 \ /usr/local/lib/X11R4 \ \ /usr/X386/lib \ /usr/x386/lib \ /usr/XFree86/lib/X11 \ \ /usr/lib \ /usr/local/lib \ /usr/unsupported/lib \ /usr/athena/lib \ /usr/local/x11r5/lib \ /usr/lpp/Xamples/lib \ /lib/usr/lib/X11 \ \ /usr/openwin/lib \ /usr/openwin/share/lib \ ; \ do for ac_extension in a so sl; do if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f conftest* fi # $ac_x_libraries = NO if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then # Didn't find X anywhere. Cache the known absence of X. ac_cv_have_x="have_x=no" else # Record where we found X for the cache. ac_cv_have_x="have_x=yes \ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" fi fi fi eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then echo "$ac_t""$have_x" 1>&6 no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes \ ac_x_includes=$x_includes ac_x_libraries=$x_libraries" echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 fi if test "x$no_x" != xyes; then USE_X=yes no_x=no if test `echo $x_includes | grep -c /` -ne 0; then XINCLUDES="-I$x_includes" fi if test `echo $x_libraries | grep -c /` -ne 0; then XLIBPTH="-L$x_libraries " fi XLIBS="$XLIBPTH-lX11" if test -f $x_libraries/libXt.a; then XLIBS="$XLIBS -lXt" fi # dnet_stub echo $ac_n "checking for getnodebyname in -ldnet_stub""... $ac_c" 1>&6 echo "configure:1497: checking for getnodebyname in -ldnet_stub" >&5 ac_lib_var=`echo dnet_stub'_'getnodebyname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldnet_stub $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 XLIBS="$XLIBS -ldnet_stub" else echo "$ac_t""no" 1>&6 fi else USE_X=no fi # dl echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 echo "configure:1546: checking for dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo dl | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi if test `echo $LIBS | grep -c '\-ldl'` -eq 0; then echo $ac_n "checking for dlopen in -ldld""... $ac_c" 1>&6 echo "configure:1594: checking for dlopen in -ldld" >&5 ac_lib_var=`echo dld'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldld $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo dld | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi fi #------------------------------------------------------------------------------- # Checks for header files. #------------------------------------------------------------------------------- echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 echo "configure:1646: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1659: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* ac_cv_header_stdc=yes else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "memchr" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "free" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF if { (eval echo configure:1726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* ac_cv_header_stdc=no fi rm -fr conftest* fi fi fi echo "$ac_t""$ac_cv_header_stdc" 1>&6 if test $ac_cv_header_stdc = yes; then cat >> confdefs.h <<\EOF #define STDC_HEADERS 1 EOF fi for ac_hdr in dirent.h fcntl.h limits.h malloc.h string.h sys/time.h unistd.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:1754: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1764: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 echo "configure:1791: checking whether time.h and sys/time.h may both be included" >&5 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include int main() { struct tm *tp; ; return 0; } EOF if { (eval echo configure:1805: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_time=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_time=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_header_time" 1>&6 if test $ac_cv_header_time = yes; then cat >> confdefs.h <<\EOF #define TIME_WITH_SYS_TIME 1 EOF fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 echo "configure:1828: checking for working alloca.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { char *p = alloca(2 * sizeof(int)); ; return 0; } EOF if { (eval echo configure:1840: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_header_alloca_h=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_alloca_h=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 if test $ac_cv_header_alloca_h = yes; then cat >> confdefs.h <<\EOF #define HAVE_ALLOCA_H 1 EOF fi echo $ac_n "checking for alloca""... $ac_c" 1>&6 echo "configure:1861: checking for alloca" >&5 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < # define alloca _alloca # else # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif # endif #endif int main() { char *p = (char *) alloca(1); ; return 0; } EOF if { (eval echo configure:1894: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_func_alloca_works=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_func_alloca_works=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_func_alloca_works" 1>&6 if test $ac_cv_func_alloca_works = yes; then cat >> confdefs.h <<\EOF #define HAVE_ALLOCA 1 EOF fi if test $ac_cv_func_alloca_works = no; then # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=alloca.${ac_objext} cat >> confdefs.h <<\EOF #define C_ALLOCA 1 EOF echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 echo "configure:1926: checking whether alloca needs Cray hooks" >&5 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5 | egrep "webecray" >/dev/null 2>&1; then rm -rf conftest* ac_cv_os_cray=yes else rm -rf conftest* ac_cv_os_cray=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_os_cray" 1>&6 if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:1956: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:1984: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <&6 fi done fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 echo "configure:2011: checking stack direction for C alloca" >&5 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test "$cross_compiling" = yes; then ac_cv_c_stack_direction=0 else cat > conftest.$ac_ext < addr) ? 1 : -1; } main () { exit (find_stack_direction() < 0); } EOF if { (eval echo configure:2038: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_stack_direction=1 else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* ac_cv_c_stack_direction=-1 fi rm -fr conftest* fi fi echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 cat >> confdefs.h <&6 echo "configure:2064: checking for working const" >&5 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } ; return 0; } EOF if { (eval echo configure:2118: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_c_const=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_c_const" 1>&6 if test $ac_cv_c_const = no; then cat >> confdefs.h <<\EOF #define const EOF fi echo $ac_n "checking for mode_t""... $ac_c" 1>&6 echo "configure:2139: checking for mode_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "(^|[^a-zA-Z_0-9])mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_mode_t=yes else rm -rf conftest* ac_cv_type_mode_t=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_mode_t" 1>&6 if test $ac_cv_type_mode_t = no; then cat >> confdefs.h <<\EOF #define mode_t int EOF fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 echo "configure:2172: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_size_t=yes else rm -rf conftest* ac_cv_type_size_t=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_size_t" 1>&6 if test $ac_cv_type_size_t = no; then cat >> confdefs.h <<\EOF #define size_t unsigned EOF fi echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 echo "configure:2205: checking whether struct tm is in sys/time.h or time.h" >&5 if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include int main() { struct tm *tp; tp->tm_sec; ; return 0; } EOF if { (eval echo configure:2218: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm=time.h else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_struct_tm=sys/time.h fi rm -f conftest* fi echo "$ac_t""$ac_cv_struct_tm" 1>&6 if test $ac_cv_struct_tm = sys/time.h; then cat >> confdefs.h <<\EOF #define TM_IN_SYS_TIME 1 EOF fi #------------------------------------------------------------------------------- # Tweak compiler flags as needed #------------------------------------------------------------------------------- case $EXT in darwin) CFLAGS="$CFLAGS -Dunix" ;; lnx) ;; osf) if test $GCC = yes; then # Remove optimization on DEC systems CFLAGS=`echo $CFLAGS | sed 's:-O[0-9]* *::g'` else # Standard DEC cc behavior is *STILL* K&R -- force ANSI compliance CFLAGS="$CFLAGS -std1 -Dunix" fi ;; sgi) cat >> confdefs.h <<\EOF #define HAVE_POSIX_SIGNALS 1 EOF ;; sol) cat >> confdefs.h <<\EOF #define HAVE_POSIX_SIGNALS 1 EOF ;; *) ;; esac # Remove optimization on all systems for all older gcc if test $GCC = yes; then if test `$CC -v 2> /dev/null | grep -c 'version 2\.45678'` -ne 0; then CFLAGS=`echo $CFLAGS | sed 's:-O0-9* *::g'` fi fi #------------------------------------------------------------------------------- # Shared library section #------------------------------------------------------------------------------- LD_FLAGS= SHLIB_SUFFIX=".so" SHLIB_LD_LIBS="" if test $EXT = darwin; then SHLIB_SUFFIX=".dylib" fi lhea_shlib_cflags= lhea_shlib_cxxflags= lhea_shlib_fflags= case $EXT in darwin) SHLIB_LD="cc -dynamiclib" SHLIB_SUFFIX=".dylib" lhea_shlib_cflags='-fPIC -fno-common' lhea_shlib_fflags='-fPIC -fno-common' ;; hpu) SHLIB_LD="ld -b" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".sl" ;; lnx) SHLIB_LD=":" ;; osf) SHLIB_LD="ld -shared -expect_unresolved '*'" ;; sol) SHLIB_LD="/usr/ccs/bin/ld -G" SHLIB_LD_LIBS='${LIBS}' lhea_shlib_cflags="-KPIC" lhea_shlib_cxxflags="-KPIC" lhea_shlib_fflags="-KPIC" ;; sgi) SHLIB_LD="ld -shared -rdata_shared" ;; *) echo "configure: warning: Unable to determine how to make a shared library" 1>&2 ;; esac # Darwin uses gcc, but uses -dynamiclib flag if test $GCC = yes -a $EXT != darwin; then SHLIB_LD="$CC -shared" lhea_shlib_cflags='-fPIC' fi if test "x$lhea_shlib_cflags" != x; then CFLAGS="$CFLAGS $lhea_shlib_cflags" fi #------------------------------------------------------------------------------- # Checks for library functions. #------------------------------------------------------------------------------- echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6 echo "configure:2343: checking for 8-bit clean memcmp" >&5 if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test "$cross_compiling" = yes; then ac_cv_func_memcmp_clean=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_func_memcmp_clean=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* ac_cv_func_memcmp_clean=no fi rm -fr conftest* fi fi echo "$ac_t""$ac_cv_func_memcmp_clean" 1>&6 test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}" echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 echo "configure:2379: checking return type of signal handlers" >&5 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #ifdef signal #undef signal #endif #ifdef __cplusplus extern "C" void (*signal (int, void (*)(int)))(int); #else void (*signal ()) (); #endif int main() { int i; ; return 0; } EOF if { (eval echo configure:2401: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_type_signal=int fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_signal" 1>&6 cat >> confdefs.h <&6 echo "configure:2420: checking for strftime" >&5 if eval "test \"`echo '$''{'ac_cv_func_strftime'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char strftime(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_strftime) || defined (__stub___strftime) choke me #else strftime(); #endif ; return 0; } EOF if { (eval echo configure:2448: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_strftime=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_strftime=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'strftime`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_STRFTIME 1 EOF else echo "$ac_t""no" 1>&6 # strftime is in -lintl on SCO UNIX. echo $ac_n "checking for strftime in -lintl""... $ac_c" 1>&6 echo "configure:2470: checking for strftime in -lintl" >&5 ac_lib_var=`echo intl'_'strftime | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lintl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_STRFTIME 1 EOF LIBS="-lintl $LIBS" else echo "$ac_t""no" 1>&6 fi fi for ac_func in getcwd socket strcspn strspn strstr strtod strtol do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:2518: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:2546: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi done #------------------------------------------------------------------------------- trap '' 1 2 15 cat > confcache <<\EOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote substitution # turns \\\\ into \\, and sed turns \\ into \). sed -n \ -e "s/'/'\\\\''/g" \ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ;; esac >> confcache if cmp -s $cache_file confcache; then : else if test -w $cache_file; then echo "updating cache $cache_file" cat confcache > $cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. cat > conftest.defs <<\EOF s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g s%\[%\\&%g s%\]%\\&%g s%\$%$$%g EOF DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` rm -f conftest.defs # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.13" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF $ac_vpsub $extrasub s%@SHELL@%$SHELL%g s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@FFLAGS@%$FFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@bindir@%$bindir%g s%@sbindir@%$sbindir%g s%@libexecdir@%$libexecdir%g s%@datadir@%$datadir%g s%@sysconfdir@%$sysconfdir%g s%@sharedstatedir@%$sharedstatedir%g s%@localstatedir@%$localstatedir%g s%@libdir@%$libdir%g s%@includedir@%$includedir%g s%@oldincludedir@%$oldincludedir%g s%@infodir@%$infodir%g s%@mandir@%$mandir%g s%@UNAME@%$UNAME%g s%@BINDIR@%$BINDIR%g s%@BIN_EXT@%$BIN_EXT%g s%@EXT@%$EXT%g s%@CC@%$CC%g s%@RANLIB@%$RANLIB%g s%@CPP@%$CPP%g s%@USE_X@%$USE_X%g s%@XINCLUDES@%$XINCLUDES%g s%@XLIBPTH@%$XLIBPTH%g s%@XLIBS@%$XLIBS%g s%@ALLOCA@%$ALLOCA%g s%@LD_FLAGS@%$LD_FLAGS%g s%@SHLIB_LD@%$SHLIB_LD%g s%@SHLIB_LD_LIBS@%$SHLIB_LD_LIBS%g s%@SHLIB_SUFFIX@%$SHLIB_SUFFIX%g s%@LIBOBJS@%$LIBOBJS%g s%@TCLPATH@%$TCLPATH%g s%@TKPATH@%$TKPATH%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ac_file=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_cmds # Line after last line for current file. ac_more_lines=: ac_sed_cmds="" while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file else sed "${ac_end}q" conftest.subs > conftest.s$ac_file fi if test ! -s conftest.s$ac_file; then ac_more_lines=false rm -f conftest.s$ac_file else if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f conftest.s$ac_file" else ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" fi ac_file=`expr $ac_file + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_cmds` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done rm -f conftest.s* EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 fv5.4/tcltk/pow/configure.in0000644000220700001010000001723107730104105015444 0ustar birbylheadevdnl Process this file with autoconf to produce a configure script. dnl disable caching to avoid sticky mistakes dnl ---------------------------------------------------------------------------- dnl define([AC_CACHE_LOAD], ) dnl define([AC_CACHE_SAVE], ) dnl ---------------------------------------------------------------------------- AC_INIT(Makefile.in) AC_REVISION($Revision: 1.24 $) AC_PREREQ(2.13) if test $cache_file = ./config.cache; then cache_file=`pwd`/config.cache fi AC_ARG_WITH( tcl, [ --with-tcl Path to tcl source ], TCLPATH=$withval ) AC_ARG_WITH( tk, [ --with-tk Path to tk source ], TKPATH=$withval ) #------------------------------------------------------------------------------- # Determine system type #------------------------------------------------------------------------------- BIN_EXT= if test "x$EXT" = x; then EXT=lnx; fi if test "x$BINDIR" = x; then AC_CHECK_PROG(UNAME, uname, uname, nouname) if test $UNAME = nouname; then AC_MSG_ERROR(HEAsoft: Unable to guess system type. Please set it using --with-bindir option) fi changequote(,) BINDIR=`$UNAME -s 2> /dev/null`_`$UNAME -r 2> /dev/null | sed 's:[^0-9]*\([0-9][0-9]*\.[0-9]*\).*:\1:'` changequote([,]) lhea_machine=`$UNAME -m 2> /dev/null` BIN_EXT= case $BINDIR in CYGWIN*) BINDIR=CYGWIN32_`$UNAME -a 2> /dev/null | awk '{ print $4 }'` lhea_machine= BIN_EXT=".exe" EXT=lnx ;; IRIX*) AC_MSG_WARN(IRIX support is marginal) EXT=sgi ;; HP-UX*) AC_MSG_WARN(HP-UX support is marginal) EXT=hpu lhea_machine=`$UNAME -m 2> /dev/null | tr '/' ' ' | awk '{ print $2 }'` ;; Linux*) EXT=lnx ;; OSF1*) EXT=osf ;; SunOS_4*) AC_MSG_WARN(SunOS 4.x is not supported!) AC_MSG_WARN(PROCEED AT YOUR OWN RISK!) EXT=sun lhea_machine=sparc ;; SunOS_5*) EXT=sol lhea_machine=`$UNAME -p` ;; Darwin_*) EXT=darwin lhea_machine=`$UNAME -p` ;; *) AC_MSG_ERROR(Unable to recognize your system. Please make sure this platform is supported.) ;; esac if test x$lhea_machine != x; then BINDIR=$BINDIR"_"$lhea_machine fi fi AC_SUBST(BINDIR) AC_SUBST(BIN_EXT) AC_SUBST(EXT) #------------------------------------------------------------------------------- # Checks for programs. #------------------------------------------------------------------------------- # Try first to find a proprietary C compiler, then gcc if test "x$CC" = x; then AC_CHECK_PROGS(CC, cc) fi # Set up flags to use the selected compiler # AC_PROG_CC if test "$cross_compiling" = yes; then AC_MSG_WARN(Cannot run a simple C executable on your system:) AC_MSG_WARN(There may be something wrong with your compiler,) AC_MSG_WARN(or perhaps you're trying to cross-compile?) AC_MSG_WARN(Cross-compiling is not supported within HEAsoft.) AC_MSG_WARN(Please make sure your compiler is working.) AC_MSG_WARN(Contact the FTOOLS help desk for further assistance.) AC_MSG_ERROR(Cross-compiling is not allowed.) fi if test "x$GCC" = x; then GCC=no fi AC_PROG_RANLIB if test $EXT = darwin; then RANLIB="$RANLIB -cs" fi # RANLIB on IRIX is flaky if test $EXT = sgi; then RANLIB=: fi #------------------------------------------------------------------------------- # Checks for libraries. #------------------------------------------------------------------------------- # X XLIBS= XLIBPTH= XINCLUDES= # socket and nsl libraries -- only if needed AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, gethostbyname)) AC_CHECK_FUNCS( connect accept, , AC_CHECK_LIB(socket, main, , , [ $XLIBS ]) ) AC_PATH_X if test "x$no_x" != xyes; then USE_X=yes no_x=no if test `echo $x_includes | grep -c /` -ne 0; then XINCLUDES="-I$x_includes" fi if test `echo $x_libraries | grep -c /` -ne 0; then XLIBPTH="-L$x_libraries " fi XLIBS="$XLIBPTH-lX11" dnl xpa sometimes needs Xt dnl this doesn't work at the moment: dnl AC_CHECK_LIB(Xt, main, XLIBS="$XLIBS -lXt") if test -f $x_libraries/libXt.a; then XLIBS="$XLIBS -lXt" fi # dnet_stub AC_CHECK_LIB(dnet_stub, getnodebyname, XLIBS="$XLIBS -ldnet_stub") else USE_X=no fi AC_SUBST(USE_X) AC_SUBST(XINCLUDES) AC_SUBST(XLIBPTH) AC_SUBST(XLIBS) # dl AC_CHECK_LIB(dl, dlopen) if test `echo $LIBS | grep -c '\-ldl'` -eq 0; then AC_CHECK_LIB(dld, dlopen) fi #------------------------------------------------------------------------------- # Checks for header files. #------------------------------------------------------------------------------- AC_HEADER_STDC AC_CHECK_HEADERS( dirent.h fcntl.h limits.h malloc.h string.h sys/time.h unistd.h ) AC_HEADER_TIME AC_FUNC_ALLOCA #------------------------------------------------------------------------------- # Checks for typedefs, structures, and compiler characteristics. #------------------------------------------------------------------------------- AC_C_CONST AC_TYPE_MODE_T AC_TYPE_SIZE_T AC_STRUCT_TM #------------------------------------------------------------------------------- # Tweak compiler flags as needed #------------------------------------------------------------------------------- case $EXT in darwin) CFLAGS="$CFLAGS -Dunix" ;; lnx) ;; osf) changequote(,) if test $GCC = yes; then # Remove optimization on DEC systems CFLAGS=`echo $CFLAGS | sed 's:-O[0-9]* *::g'` else # Standard DEC cc behavior is *STILL* K&R -- force ANSI compliance CFLAGS="$CFLAGS -std1 -Dunix" fi changequote([,]) ;; sgi) AC_DEFINE(HAVE_POSIX_SIGNALS) ;; sol) AC_DEFINE(HAVE_POSIX_SIGNALS) ;; *) ;; esac # Remove optimization on all systems for all older gcc if test $GCC = yes; then if test `$CC -v 2> /dev/null | grep -c 'version 2\.[45678]'` -ne 0; then CFLAGS=`echo $CFLAGS | sed 's:-O[0-9]* *::g'` fi fi #------------------------------------------------------------------------------- # Shared library section #------------------------------------------------------------------------------- LD_FLAGS= SHLIB_SUFFIX=".so" SHLIB_LD_LIBS="" if test $EXT = darwin; then SHLIB_SUFFIX=".dylib" fi lhea_shlib_cflags= lhea_shlib_cxxflags= lhea_shlib_fflags= dnl if test $lhea_shared = yes; then case $EXT in darwin) SHLIB_LD="cc -dynamiclib" SHLIB_SUFFIX=".dylib" lhea_shlib_cflags='-fPIC -fno-common' lhea_shlib_fflags='-fPIC -fno-common' ;; hpu) SHLIB_LD="ld -b" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".sl" ;; lnx) SHLIB_LD=":" ;; osf) SHLIB_LD="ld -shared -expect_unresolved '*'" ;; sol) SHLIB_LD="/usr/ccs/bin/ld -G" SHLIB_LD_LIBS='${LIBS}' lhea_shlib_cflags="-KPIC" lhea_shlib_cxxflags="-KPIC" lhea_shlib_fflags="-KPIC" ;; sgi) SHLIB_LD="ld -shared -rdata_shared" ;; *) AC_MSG_WARN(Unable to determine how to make a shared library) ;; esac # Darwin uses gcc, but uses -dynamiclib flag if test $GCC = yes -a $EXT != darwin; then SHLIB_LD="$CC -shared" lhea_shlib_cflags='-fPIC' fi if test "x$lhea_shlib_cflags" != x; then CFLAGS="$CFLAGS $lhea_shlib_cflags" fi dnl else dnl SHLIB_LD=: dnl fi AC_SUBST(LD_FLAGS) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_SUFFIX) #------------------------------------------------------------------------------- # Checks for library functions. #------------------------------------------------------------------------------- AC_FUNC_MEMCMP AC_TYPE_SIGNAL AC_FUNC_STRFTIME AC_CHECK_FUNCS(getcwd socket strcspn strspn strstr strtod strtol) #------------------------------------------------------------------------------- AC_SUBST(TCLPATH) AC_SUBST(TKPATH) AC_OUTPUT(Makefile) fv5.4/tcltk/pow/html_library.tcl0000644000220700001010000011764506760545121016352 0ustar birbylheadev# Simple HTML display library by Stephen Uhler (stephen.uhler@sun.com) # Copyright (c) 1995 by Sun Microsystems # Version 0.3 Fri Sep 1 10:47:17 PDT 1995 # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # To use this package, create a text widget (say, .text) # and set a variable full of html, (say $html), and issue: # HMinit_win .text # HMparse_html $html "HMrender .text" # You also need to supply the routine: # proc HMlink_callback {win href} { ...} # win: The name of the text widget # href The name of the link # which will be called anytime the user "clicks" on a link. # The supplied version just prints the link to stdout. # In addition, if you wish to use embedded images, you will need to write # proc HMset_image {handle src} # handle an arbitrary handle (not really) # src The name of the image # Which calls # HMgot_image $handle $image # with the TK image. # # To return a "used" text widget to its initialized state, call: # HMreset_win .text # See "sample.tcl" for sample usage ################################################################## ############################################ # mapping of html tags to text tag properties # properties beginning with "T" map directly to text tags # These are Defined in HTML 2.0 array set HMtag_map { b {weight bold} blockquote {style i indent 1 Trindent rindent} bq {style i indent 1 Trindent rindent} cite {style i} code {family courier} dfn {style i} dir {indent 1} dl {indent 1} em {style i} h1 {size 24 weight bold} h2 {size 22} h3 {size 20} h4 {size 18} h5 {size 16} h6 {style i} i {style i} kbd {family courier weight bold} menu {indent 1} ol {indent 1} pre {fill 0 family courier Tnowrap nowrap} samp {family courier} strong {weight bold} tt {family courier} u {Tunderline underline} ul {indent 1} var {style i} } # These are in common(?) use, but not defined in html2.0 array set HMtag_map { center {Tcenter center} strike {Tstrike strike} u {Tunderline underline} } # initial values set HMtag_map(hmstart) { family times weight medium style r size 14 Tcenter "" Tlink "" Tnowrap "" Tunderline "" list list fill 1 indent "" counter 0 adjust 0 } # html tags that insert white space array set HMinsert_map { blockquote "\n\n" /blockquote "\n" br "\n" dd "\n" /dd "\n" dl "\n" /dl "\n" dt "\n" form "\n" /form "\n" h1 "\n\n" /h1 "\n" h2 "\n\n" /h2 "\n" h3 "\n\n" /h3 "\n" h4 "\n" /h4 "\n" h5 "\n" /h5 "\n" h6 "\n" /h6 "\n" li "\n" /dir "\n" /ul "\n" /ol "\n" /menu "\n" p "\n\n" pre "\n" /pre "\n" } # tags that are list elements, that support "compact" rendering array set HMlist_elements { ol 1 ul 1 menu 1 dl 1 dir 1 } ############################################ # initialize the window and stack state proc HMinit_win {win} { upvar #0 HM$win var HMinit_state $win $win tag configure underline -underline 1 $win tag configure center -justify center $win tag configure nowrap -wrap none $win tag configure rindent -rmargin $var(S_tab)c $win tag configure strike -overstrike 1 $win tag configure mark -foreground red ;# list markers $win tag configure list -spacing1 3p -spacing3 3p ;# regular lists $win tag configure compact -spacing1 0p ;# compact lists $win tag configure link -borderwidth 2 -foreground blue ;# hypertext links HMset_indent $win $var(S_tab) $win configure -wrap word # configure the text insertion point $win mark set $var(S_insert) 1.0 # for horizontal rules $win tag configure thin -font [HMx_font times 2 medium r] $win tag configure hr -relief sunken -borderwidth 2 -wrap none \ -tabs [winfo width $win] bind $win { %W tag configure hr -tabs %w %W tag configure last -spacing3 %h } # generic link enter callback $win tag bind link <1> "HMlink_hit $win %x %y" } # set the indent spacing (in cm) for lists # TK uses a "weird" tabbing model that causes \t to insert a single # space if the current line position is past the tab setting proc HMset_indent {win cm} { set tabs [expr $cm / 2.0] $win configure -tabs ${tabs}c foreach i {1 2 3 4 5 6 7 8 9} { set tab [expr $i * $cm] $win tag configure indent$i -lmargin1 ${tab}c -lmargin2 ${tab}c \ -tabs "[expr $tab + $tabs]c [expr $tab + 2*$tabs]c" } } # reset the state of window - get ready for the next page # remove all but the font tags, and remove all form state proc HMreset_win {win} { upvar #0 HM$win var regsub -all { +[^L ][^ ]*} " [$win tag names] " {} tags catch "$win tag delete $tags" eval $win mark unset [$win mark names] $win delete 0.0 end $win tag configure hr -tabs [winfo width $win] # configure the text insertion point $win mark set $var(S_insert) 1.0 # remove form state. If any check/radio buttons still exists, # their variables will be magically re-created, and never get # cleaned up. catch unset [info globals HM$win.form*] HMinit_state $win return HM$win } # initialize the window's state array # Parameters beginning with S_ are NOT reset # adjust_size: global font size adjuster # unknown: character to use for unknown entities # tab: tab stop (in cm) # stop: enabled to stop processing # update: how many tags between update calls # tags: number of tags processed so far # symbols: Symbols to use on un-ordered lists proc HMinit_state {win} { upvar #0 HM$win var array set tmp [array get var S_*] catch {unset var} array set var { stop 0 tags 0 fill 0 list list S_adjust_size 0 S_tab 1.0 S_unknown \xb7 S_update 10 S_symbols O*=+-o\xd7\xb0>:\xb7 S_insert Insert } array set var [array get tmp] } # alter the parameters of the text state # this allows an application to over-ride the default settings # it is called as: HMset_state -param value -param value ... array set HMparam_map { -update S_update -tab S_tab -unknown S_unknown -stop S_stop -size S_adjust_size -symbols S_symbols -insert S_insert } proc HMset_state {win args} { upvar #0 HM$win var global HMparam_map set bad 0 if {[catch {array set params $args}]} {return 0} foreach i [array names params] { incr bad [catch {set var($HMparam_map($i)) $params($i)}] } return [expr $bad == 0] } ############################################ # manage the display of html # HMrender gets called for every html tag # win: The name of the text widget to render into # tag: The html tag (in arbitrary case) # not: a "/" or the empty string # param: The un-interpreted parameter list # text: The plain text until the next html tag proc HMrender {win tag not param text} { upvar #0 HM$win var if {$var(stop)} return global HMtag_map HMinsert_map HMlist_elements set tag [string tolower $tag] set text [HMmap_esc $text] # manage compact rendering of lists if {[info exists HMlist_elements($tag)]} { set list "list [expr {[HMextract_param $param compact] ? "compact" : "list"}]" } else { set list "" } # Allow text to be diverted to a different window (for tables) # this is not currently used if {[info exists var(divert)]} { set win $var(divert) upvar #0 HM$win var } # adjust (push or pop) tag state catch {HMstack $win $not "$HMtag_map($tag) $list"} # insert white space (with current font) # adding white space can get a bit tricky. This isn't quite right set bad [catch {$win insert $var(S_insert) $HMinsert_map($not$tag) "space $var(font)"}] if {!$bad && [lindex $var(fill) end]} { set text [string trimleft $text] } # to fill or not to fill if {[lindex $var(fill) end]} { set text [HMzap_white $text] } # generic mark hook catch {HMmark $not$tag $win $param text} err # do any special tag processing catch {HMtag_$not$tag $win $param text} msg # add the text with proper tags set tags [HMcurrent_tags $win] $win insert $var(S_insert) $text $tags # We need to do an update every so often to insure interactive response. # This can cause us to re-enter the event loop, and cause recursive # invocations of HMrender, so we need to be careful. if {!([incr var(tags)] % $var(S_update))} { update } } # html tags requiring special processing # Procs of the form HMtag_ or HMtag_ get called just before # the text for this tag is displayed. These procs are called inside a # "catch" so it is OK to fail. # win: The name of the text widget to render into # param: The un-interpreted parameter list # text: A pass-by-reference name of the plain text until the next html tag # Tag commands may change this to affect what text will be inserted # next. # A pair of pseudo tags are added automatically as the 1st and last html # tags in the document. The default is and . # Append enough blank space at the end of the text widget while # rendering so HMgoto can place the target near the top of the page, # then remove the extra space when done rendering. proc HMtag_hmstart {win param text} { upvar #0 HM$win var $win mark gravity $var(S_insert) left $win insert end "\n " last $win mark gravity $var(S_insert) right } proc HMtag_/hmstart {win param text} { $win delete last.first end } # put the document title in the window banner, and remove the title text # from the document proc HMtag_title {win param text} { upvar $text data wm title [winfo toplevel $win] $data set data "" } proc HMtag_hr {win param text} { upvar #0 HM$win var $win insert $var(S_insert) "\n" space "\n" thin "\t" "thin hr" "\n" thin } # list element tags proc HMtag_ol {win param text} { upvar #0 HM$win var set var(count$var(level)) 0 } proc HMtag_ul {win param text} { upvar #0 HM$win var catch {unset var(count$var(level))} } proc HMtag_menu {win param text} { upvar #0 HM$win var set var(menu) -> set var(compact) 1 } proc HMtag_/menu {win param text} { upvar #0 HM$win var catch {unset var(menu)} catch {unset var(compact)} } proc HMtag_dt {win param text} { upvar #0 HM$win var upvar $text data set level $var(level) incr level -1 $win insert $var(S_insert) "$data" \ "hi [lindex $var(list) end] indent$level $var(font)" set data {} } proc HMtag_li {win param text} { upvar #0 HM$win var set level $var(level) incr level -1 set x [string index $var(S_symbols)+-+-+-+-" $level] catch {set x [incr var(count$level)]} catch {set x $var(menu)} $win insert $var(S_insert) \t$x\t "mark [lindex $var(list) end] indent$level $var(font)" } # Manage hypertext "anchor" links. A link can be either a source (href) # a destination (name) or both. If its a source, register it via a callback, # and set its default behavior. If its a destination, check to see if we need # to go there now, as a result of a previous HMgoto request. If so, schedule # it to happen with the closing tag, so we can highlight the text up to # the . proc HMtag_a {win param text} { upvar #0 HM$win var # a source if {[HMextract_param $param href]} { set var(Tref) [list L:$href] HMstack $win "" "Tlink link" HMlink_setup $win $href } # a destination if {[HMextract_param $param name]} { set var(Tname) [list N:$name] HMstack $win "" "Tanchor anchor" $win mark set N:$name "$var(S_insert) - 1 chars" $win mark gravity N:$name left if {[info exists var(goto)] && $var(goto) == $name} { unset var(goto) set var(going) $name } } } # The application should call here with the fragment name # to cause the display to go to this spot. # If the target exists, go there (and do the callback), # otherwise schedule the goto to happen when we see the reference. proc HMgoto {win where {callback HMwent_to}} { upvar #0 HM$win var if {[regexp N:$where [$win mark names]]} { $win see N:$where update eval $callback $win [list $where] return 1 } else { set var(goto) $where return 0 } } # We actually got to the spot, so highlight it! # This should/could be replaced by the application # We'll flash it orange a couple of times. proc HMwent_to {win where {count 0} {color orange}} { upvar #0 HM$win var if {$count > 5} return catch {$win tag configure N:$where -foreground $color} update after 200 [list HMwent_to $win $where [incr count] \ [expr {$color=="orange" ? "" : "orange"}]] } proc HMtag_/a {win param text} { upvar #0 HM$win var if {[info exists var(Tref)]} { unset var(Tref) HMstack $win / "Tlink link" } # goto this link, then invoke the call-back. if {[info exists var(going)]} { $win yview N:$var(going) update HMwent_to $win $var(going) unset var(going) } if {[info exists var(Tname)]} { unset var(Tname) HMstack $win / "Tanchor anchor" } } # Inline Images # This interface is subject to change # Most of the work is getting around a limitation of TK that prevents # setting the size of a label to a widthxheight in pixels # # Images have the following parameters: # align: top,middle,bottom # alt: alternate text # ismap: A clickable image map # src: The URL link # Netscape supports (and so do we) # width: A width hint (in pixels) # height: A height hint (in pixels) # border: The size of the window border proc HMtag_img {win param text} { upvar #0 HM$win var # get alignment array set align_map {top top middle center bottom bottom} set align bottom ;# The spec isn't clear what the default should be HMextract_param $param align catch {set align $align_map([string tolower $align])} # get alternate text set alt "" HMextract_param $param alt set alt [HMmap_esc $alt] # get the border width set border 1 HMextract_param $param border # see if we have an image size hint # If so, make a frame the "hint" size to put the label in # otherwise just make the label set item $win.$var(tags) # catch {destroy $item} if {[HMextract_param $param width] && [HMextract_param $param height]} { frame $item -width $width -height $height pack propagate $item 0 set label $item.label label $label pack $label -expand 1 -fill both } else { set label $item label $label } $label configure -relief ridge -fg orange -text $alt catch {$label configure -bd $border} $win window create $var(S_insert) -align $align -window $item -pady 2 -padx 2 # add in all the current tags (this is overkill) set tags [HMcurrent_tags $win] foreach tag $tags { $win tag add $tag $item } # set imagemap callbacks if {[HMextract_param $param ismap]} { # regsub -all {[^L]*L:([^ ]*).*} $tags {\1} link set link [lindex $tags [lsearch -glob $tags L:*]] regsub L: $link {} link global HMevents regsub -all {%} $link {%%} link2 foreach i [array names HMevents] { bind $label <$i> "catch \{%W configure $HMevents($i)\}" } bind $label <1> "+HMlink_callback $win $link2?%x,%y" } # now callback to the application set src "" HMextract_param $param src HMset_image $win $label $src return $label ;# used by the forms package for input_image types } # The app needs to supply one of these proc HMset_image {win handle src} { HMgot_image $handle "can't get\n$src" } # When the image is available, the application should call back here. # If we have the image, put it in the label, otherwise display the error # message. If we don't get a callback, the "alt" text remains. # if we have a clickable image, arrange for a callback proc HMgot_image {win image_error} { # if we're in a frame turn on geometry propogation if {[winfo name $win] == "label"} { pack propagate [winfo parent $win] 1 } if {[catch {$win configure -image $image_error}]} { $win configure -image {} $win configure -text $image_error } } # Sample hypertext link callback routine - should be replaced by app # This proc is called once for each tag. # Applications can overwrite this procedure, as required, or # replace the HMevents array # win: The name of the text widget to render into # href: The HREF link for this tag. array set HMevents { Enter {-borderwidth 2 -relief raised } Leave {-borderwidth 2 -relief flat } 1 {-borderwidth 2 -relief sunken} ButtonRelease-1 {-borderwidth 2 -relief raised} } # We need to escape any %'s in the href tag name so the bind command # doesn't try to substitute them. proc HMlink_setup {win href} { global HMevents regsub -all {%} $href {%%} href2 foreach i [array names HMevents] { eval {$win tag bind L:$href <$i>} \ \{$win tag configure \{L:$href2\} $HMevents($i)\} } } # generic link-hit callback # This gets called upon button hits on hypertext links # Applications are expected to supply ther own HMlink_callback routine # win: The name of the text widget to render into # x,y: The cursor position at the "click" proc HMlink_hit {win x y} { set tags [$win tag names @$x,$y] set link [lindex $tags [lsearch -glob $tags L:*]] # regsub -all {[^L]*L:([^ ]*).*} $tags {\1} link regsub L: $link {} link HMlink_callback $win $link } # replace this! # win: The name of the text widget to render into # href: The HREF link for this tag. if { [info commands HMlink_callback]=="" } { proc HMlink_callback {win href} { puts "Got hit on $win, link $href" } } # extract a value from parameter list (this needs a re-do) # returns "1" if the keyword is found, "0" otherwise # param: A parameter list. It should alredy have been processed to # remove any entity references # key: The parameter name # val: The variable to put the value into (use key as default) proc HMextract_param {param key {val ""}} { if {$val == ""} { upvar $key result } else { upvar $val result } set ws " \n\r" # look for name=value combinations. Either (') or (") are valid delimeters if { [regsub -nocase [format {.*%s[%s]*=[%s]*"([^"]*).*} $key $ws $ws] $param {\1} value] || [regsub -nocase [format {.*%s[%s]*=[%s]*'([^']*).*} $key $ws $ws] $param {\1} value] || [regsub -nocase [format {.*%s[%s]*=[%s]*([^%s]+).*} $key $ws $ws $ws] $param {\1} value] } { set result $value return 1 } # now look for valueless names # I should strip out name=value pairs, so we don't end up with "name" # inside the "value" part of some other key word - some day set bad \[^a-zA-Z\]+ if {[regexp -nocase "$bad$key$bad" -$param-]} { return 1 } else { return 0 } } # These next two routines manage the display state of the page. # Push or pop tags to/from stack. # Each orthogonal text property has its own stack, stored as a list. # The current (most recent) tag is the last item on the list. # Push is {} for pushing and {/} for popping proc HMstack {win push list} { upvar #0 HM$win var array set tags $list if {$push == ""} { foreach tag [array names tags] { lappend var($tag) $tags($tag) } } else { foreach tag [array names tags] { # set cnt [regsub { *[^ ]+$} $var($tag) {} var($tag)] set var($tag) [lreplace $var($tag) end end] } } } # extract set of current text tags # tags starting with T map directly to text tags, all others are # handled specially. There is an application callback, HMset_font # to allow the application to do font error handling proc HMcurrent_tags {win} { upvar #0 HM$win var set font font foreach i {family size weight style} { set $i [lindex $var($i) end] append font :[set $i] } set xfont [HMx_font $family $size $weight $style $var(S_adjust_size)] HMset_font $win $font $xfont set indent [llength $var(indent)] incr indent -1 lappend tags $font indent$indent foreach tag [array names var T*] { lappend tags [lindex $var($tag) end] ;# test } set var(font) $font set var(xfont) [$win tag cget $font -font] set var(level) $indent return $tags } # allow the application to do do better font management # by overriding this procedure proc HMset_font {win tag font} { catch {$win tag configure $tag -font $font} msg } # generate an X font name proc HMx_font {family size weight style {adjust_size 0}} { catch {incr size $adjust_size} return "-*-$family-$weight-$style-normal-*-*-${size}0-*-*-*-*-*-*" } # Optimize HMrender (hee hee) # This is experimental proc HMoptimize {} { regsub -all "\n\[ \]*#\[^\n\]*" [info body HMrender] {} body regsub -all ";\[ \]*#\[^\n]*" $body {} body regsub -all "\n\n+" $body \n body proc HMrender {win tag not param text} $body } ############################################ # Turn HTML into TCL commands # html A string containing an html document # cmd A command to run for each html tag found # start The name of the dummy html start/stop tags proc HMparse_html {html {cmd HMtest_parse} {start hmstart}} { regsub -all \{ $html {\&ob;} html regsub -all \} $html {\&cb;} html set w " \t\r\n" ;# white space proc HMcl x {return "\[$x\]"} set exp <(/?)([HMcl ^$w>]+)[HMcl $w]*([HMcl ^>]*)> set sub "\}\n$cmd {\\2} {\\1} {\\3} \{" regsub -all $exp $html $sub html eval "$cmd {$start} {} {} \{ $html \}" eval "$cmd {$start} / {} {}" } proc HMtest_parse {command tag slash text_after_tag} { puts "==> $command $tag $slash $text_after_tag" } # Convert multiple white space into a single space proc HMzap_white {data} { regsub -all "\[ \t\r\n\]+" $data " " data return $data } # find HTML escape characters of the form &xxx; proc HMmap_esc {text} { if {![regexp & $text]} {return $text} regsub -all {([][$\\])} $text {\\\1} new regsub -all {&#([0-9][0-9]?[0-9]?);?} \ $new {[format %c [scan \1 %d tmp;set tmp]]} new regsub -all {&([a-zA-Z]+);?} $new {[HMdo_map \1]} new return [subst $new] } # convert an HTML escape sequence into character proc HMdo_map {text {unknown ?}} { global HMesc_map set result $unknown catch {set result $HMesc_map($text)} return $result } # table of escape characters (ISO latin-1 esc's are in a different table) array set HMesc_map { lt < gt > amp & quot \" copy \xa9 reg \xae ob \x7b cb \x7d nbsp \xa0 } ############################################################# # ISO Latin-1 escape codes array set HMesc_map { nbsp \xa0 iexcl \xa1 cent \xa2 pound \xa3 curren \xa4 yen \xa5 brvbar \xa6 sect \xa7 uml \xa8 copy \xa9 ordf \xaa laquo \xab not \xac shy \xad reg \xae hibar \xaf deg \xb0 plusmn \xb1 sup2 \xb2 sup3 \xb3 acute \xb4 micro \xb5 para \xb6 middot \xb7 cedil \xb8 sup1 \xb9 ordm \xba raquo \xbb frac14 \xbc frac12 \xbd frac34 \xbe iquest \xbf Agrave \xc0 Aacute \xc1 Acirc \xc2 Atilde \xc3 Auml \xc4 Aring \xc5 AElig \xc6 Ccedil \xc7 Egrave \xc8 Eacute \xc9 Ecirc \xca Euml \xcb Igrave \xcc Iacute \xcd Icirc \xce Iuml \xcf ETH \xd0 Ntilde \xd1 Ograve \xd2 Oacute \xd3 Ocirc \xd4 Otilde \xd5 Ouml \xd6 times \xd7 Oslash \xd8 Ugrave \xd9 Uacute \xda Ucirc \xdb Uuml \xdc Yacute \xdd THORN \xde szlig \xdf agrave \xe0 aacute \xe1 acirc \xe2 atilde \xe3 auml \xe4 aring \xe5 aelig \xe6 ccedil \xe7 egrave \xe8 eacute \xe9 ecirc \xea euml \xeb igrave \xec iacute \xed icirc \xee iuml \xef eth \xf0 ntilde \xf1 ograve \xf2 oacute \xf3 ocirc \xf4 otilde \xf5 ouml \xf6 divide \xf7 oslash \xf8 ugrave \xf9 uacute \xfa ucirc \xfb uuml \xfc yacute \xfd thorn \xfe yuml \xff } ########################################################## # html forms management commands # As each form element is located, it is created and rendered. Additional # state is stored in a form specific global variable to be processed at # the end of the form, including the "reset" and "submit" options. # Remember, there can be multiple forms existing on multiple pages. When # HTML tables are added, a single form could be spread out over multiple # text widgets, which makes it impractical to hang the form state off the # HM$win structure. We don't need to check for the existance of required # parameters, we just "fail" and get caught in HMrender # This causes line breaks to be preserved in the inital values # of text areas array set HMtag_map { textarea {fill 0} } ########################################################## # html isindex tag. Although not strictly forms, they're close enough # to be in this file # is-index forms # make a frame with a label, entry, and submit button proc HMtag_isindex {win param text} { upvar #0 HM$win var set item $win.$var(tags) if {[winfo exists $item]} { destroy $item } frame $item -relief ridge -bd 3 set prompt "Enter search keywords here" HMextract_param $param prompt label $item.label -text [HMmap_esc $prompt] -font $var(xfont) entry $item.entry bind $item.entry "$item.submit invoke" button $item.submit -text search -font $var(xfont) -command \ [format {HMsubmit_index %s {%s} [HMmap_reply [%s get]]} \ $win $param $item.entry] pack $item.label -side top pack $item.entry $item.submit -side left # insert window into text widget $win insert $var(S_insert) \n isindex HMwin_install $win $item $win insert $var(S_insert) \n isindex bind $item {focus %W.entry} } # This is called when the isindex form is submitted. # The default version calls HMlink_callback. Isindex tags should either # be deprecated, or fully supported (e.g. they need an href parameter) proc HMsubmit_index {win param text} { HMlink_callback $win ?$text } # initialize form state. All of the state for this form is kept # in a global array whose name is stored in the form_id field of # the main window array. # Parameters: ACTION, METHOD, ENCTYPE proc HMtag_form {win param text} { upvar #0 HM$win var # create a global array for the form set id HM$win.form$var(tags) upvar #0 $id form # missing /form tag, simulate it if {[info exists var(form_id)]} { puts "Missing end-form tag !!!! $var(form_id)" HMtag_/form $win {} {} } catch {unset form} set var(form_id) $id set form(param) $param ;# form initial parameter list set form(reset) "" ;# command to reset the form set form(reset_button) "" ;# list of all reset buttons set form(submit) "" ;# command to submit the form set form(submit_button) "" ;# list of all submit buttons } # Where we're done try to get all of the state into the widgets so # we can free up the form structure here. Unfortunately, we can't! proc HMtag_/form {win param text} { upvar #0 HM$win var upvar #0 $var(form_id) form # make submit button entries for all radio buttons foreach name [array names form radio_*] { regsub radio_ $name {} name lappend form(submit) [list $name \$form(radio_$name)] } # process the reset button(s) foreach item $form(reset_button) { $item configure -command $form(reset) } # no submit button - add one if {$form(submit_button) == ""} { HMinput_submit $win {} } # process the "submit" command(s) # each submit button could have its own name,value pair foreach item $form(submit_button) { set submit $form(submit) catch {lappend submit $form(submit_$item)} $item configure -command \ [list HMsubmit_button $win $var(form_id) $form(param) \ $submit] } # unset all unused fields here unset form(reset) form(submit) form(reset_button) form(submit_button) unset var(form_id) } ################################################################### # handle form input items # each item type is handled in a separate procedure # Each "type" procedure needs to: # - create the window # - initialize it # - add the "submit" and "reset" commands onto the proper Q's # "submit" is subst'd # "reset" is eval'd proc HMtag_input {win param text} { upvar #0 HM$win var set type text ;# the default HMextract_param $param type set type [string tolower $type] if {[catch {HMinput_$type $win $param} err]} { puts stderr $err } } # input type=text # parameters NAME (reqd), MAXLENGTH, SIZE, VALUE proc HMinput_text {win param {show {}}} { upvar #0 HM$win var upvar #0 $var(form_id) form # make the entry HMextract_param $param name ;# required set item $win.input_text,$var(tags) set size 20; HMextract_param $param size set maxlength 0; HMextract_param $param maxlength entry $item -width $size -show $show # set the initial value set value ""; HMextract_param $param value $item insert 0 $value # insert the entry HMwin_install $win $item # set the "reset" and "submit" commands append form(reset) ";$item delete 0 end;$item insert 0 [list $value]" lappend form(submit) [list $name "\[$item get]"] # handle the maximum length (broken - no way to cleanup bindtags state) if {$maxlength} { bindtags $item "[bindtags $item] max$maxlength" bind max$maxlength "%W delete $maxlength end" } } # password fields - same as text, only don't show data # parameters NAME (reqd), MAXLENGTH, SIZE, VALUE proc HMinput_password {win param} { HMinput_text $win $param * } # checkbuttons are missing a "get" option, so we must use a global # variable to store the value. # Parameters NAME, VALUE, (reqd), CHECKED proc HMinput_checkbox {win param} { upvar #0 HM$win var upvar #0 $var(form_id) form HMextract_param $param name HMextract_param $param value # Set the global variable, don't use the "form" alias as it is not # defined in the global scope of the button set variable $var(form_id)(check_$var(tags)) set item $win.input_checkbutton,$var(tags) checkbutton $item -variable $variable -off {} -on $value -text " " if {[HMextract_param $param checked]} { $item select append form(reset) ";$item select" } else { append form(reset) ";$item deselect" } HMwin_install $win $item lappend form(submit) [list $name \$form(check_$var(tags))] } # radio buttons. These are like check buttons, but only one can be selected proc HMinput_radio {win param} { upvar #0 HM$win var upvar #0 $var(form_id) form HMextract_param $param name HMextract_param $param value set first [expr ![info exists form(radio_$name)]] set variable $var(form_id)(radio_$name) set variable $var(form_id)(radio_$name) set item $win.input_radiobutton,$var(tags) radiobutton $item -variable $variable -value $value -text " " HMwin_install $win $item if {$first || [HMextract_param $param checked]} { $item select append form(reset) ";$item select" } else { append form(reset) ";$item deselect" } # do the "submit" actions in /form so we only end up with 1 per button grouping # contributing to the submission } # hidden fields, just append to the "submit" data # params: NAME, VALUE (reqd) proc HMinput_hidden {win param} { upvar #0 HM$win var upvar #0 $var(form_id) form HMextract_param $param name HMextract_param $param value lappend form(submit) [list $name $value] } # handle input images. The spec isn't very clear on these, so I'm not # sure its quite right # Use std image tag, only set up our own callbacks # (e.g. make sure ismap isn't set) # params: NAME, SRC (reqd) ALIGN proc HMinput_image {win param} { upvar #0 HM$win var upvar #0 $var(form_id) form HMextract_param $param name set name ;# barf if no name is specified set item [HMtag_img $win $param {}] $item configure -relief raised -bd 2 -bg blue # make a dummy "submit" button, and invoke it to send the form. # We have to get the %x,%y in the value somehow, so calculate it during # binding, and save it in the form array for later processing set submit $win.dummy_submit,$var(tags) if {[winfo exists $submit]} { destroy $submit } button $submit -takefocus 0;# this never gets mapped! lappend form(submit_button) $submit set form(submit_$submit) [list $name $name.\$form(X).\$form(Y)] $item configure -takefocus 1 bind $item "catch \{$win see $item\}" bind $item <1> "$item configure -relief sunken" bind $item " set $var(form_id)(X) 0 set $var(form_id)(Y) 0 $submit invoke " bind $item " set $var(form_id)(X) %x set $var(form_id)(Y) %y $item configure -relief raised $submit invoke " } # Set up the reset button. Wait for the /form to attach # the -command option. There could be more that 1 reset button # params VALUE proc HMinput_reset {win param} { upvar #0 HM$win var upvar #0 $var(form_id) form set value reset HMextract_param $param value set item $win.input_reset,$var(tags) button $item -text [HMmap_esc $value] HMwin_install $win $item lappend form(reset_button) $item } # Set up the submit button. Wait for the /form to attach # the -command option. There could be more that 1 submit button # params: NAME, VALUE proc HMinput_submit {win param} { upvar #0 HM$win var upvar #0 $var(form_id) form HMextract_param $param name set value submit HMextract_param $param value set item $win.input_submit,$var(tags) button $item -text [HMmap_esc $value] -fg blue HMwin_install $win $item lappend form(submit_button) $item # need to tie the "name=value" to this button # save the pair and do it when we finish the submit button catch {set form(submit_$item) [list $name $value]} } ######################################################################### # selection items # They all go into a list box. We don't what to do with the listbox until # we know how many items end up in it. Gather up the data for the "options" # and finish up in the /select tag # params: NAME (reqd), MULTIPLE, SIZE proc HMtag_select {win param text} { upvar #0 HM$win var upvar #0 $var(form_id) form HMextract_param $param name set size 5; HMextract_param $param size set form(select_size) $size set form(select_name) $name set form(select_values) "" ;# list of values to submit if {[HMextract_param $param multiple]} { set mode multiple } else { set mode single } set item $win.select,$var(tags) frame $item set form(select_frame) $item listbox $item.list -selectmode $mode -width 0 -exportselection 0 HMwin_install $win $item } # select options # The values returned in the query may be different from those # displayed in the listbox, so we need to keep a separate list of # query values. # form(select_default) - contains the default query value # form(select_frame) - name of the listbox's containing frame # form(select_values) - list of query values # params: VALUE, SELECTED proc HMtag_option {win param text} { upvar #0 HM$win var upvar #0 $var(form_id) form upvar $text data set frame $form(select_frame) # set default option (or options) if {[HMextract_param $param selected]} { lappend form(select_default) [$form(select_frame).list size] } set value [string trimright $data " \n"] $frame.list insert end $value HMextract_param $param value lappend form(select_values) $value set data "" } # do most of the work here! # if SIZE>1, make the listbox. Otherwise make a "drop-down" # listbox with a label in it # If the # of items > size, add a scroll bar # This should probably be broken up into callbacks to make it # easier to override the "look". proc HMtag_/select {win param text} { upvar #0 HM$win var upvar #0 $var(form_id) form set frame $form(select_frame) set size $form(select_size) set items [$frame.list size] # set the defaults and reset button append form(reset) ";$frame.list selection clear 0 $items" if {[info exists form(select_default)]} { foreach i $form(select_default) { $frame.list selection set $i append form(reset) ";$frame.list selection set $i" } } else { $frame.list selection set 0 append form(reset) ";$frame.list selection set 0" } # set up the submit button. This is the general case. For single # selections we could be smarter for {set i 0} {$i < $size} {incr i} { set value [format {[expr {[%s selection includes %s] ? {%s} : {}}]} \ $frame.list $i [lindex $form(select_values) $i]] lappend form(submit) [list $form(select_name) $value] } # show the listbox - no scroll bar if {$size > 1 && $items <= $size} { $frame.list configure -height $items pack $frame.list # Listbox with scrollbar } elseif {$size > 1} { scrollbar $frame.scroll -command "$frame.list yview" \ -orient v -takefocus 0 $frame.list configure -height $size \ -yscrollcommand "$frame.scroll set" pack $frame.list $frame.scroll -side right -fill y # This is a joke! } else { scrollbar $frame.scroll -command "$frame.list yview" \ -orient h -takefocus 0 $frame.list configure -height 1 \ -yscrollcommand "$frame.scroll set" pack $frame.list $frame.scroll -side top -fill x } # cleanup foreach i [array names form select_*] { unset form($i) } } # do a text area (multi-line text) # params: COLS, NAME, ROWS (all reqd, but default rows and cols anyway) proc HMtag_textarea {win param text} { upvar #0 HM$win var upvar #0 $var(form_id) form upvar $text data set rows 5; HMextract_param $param rows set cols 30; HMextract_param $param cols HMextract_param $param name set item $win.textarea,$var(tags) frame $item text $item.text -width $cols -height $rows -wrap none \ -yscrollcommand "$item.scroll set" -padx 3 -pady 3 scrollbar $item.scroll -command "$item.text yview" -orient v $item.text insert 1.0 $data HMwin_install $win $item pack $item.text $item.scroll -side right -fill y lappend form(submit) [list $name "\[$item.text get 0.0 end]"] append form(reset) ";$item.text delete 1.0 end; \ $item.text insert 1.0 [list $data]" set data "" } # procedure to install windows into the text widget # - win: name of the text widget # - item: name of widget to install proc HMwin_install {win item} { upvar #0 HM$win var $win window create $var(S_insert) -window $item -align bottom $win tag add indent$var(level) $item set focus [expr {[winfo class $item] != "Frame"}] $item configure -takefocus $focus bind $item "$win see $item" } ##################################################################### # Assemble and submit the query # each list element in "stuff" is a name/value pair # - The names are the NAME parameters of the various fields # - The values get run through "subst" to extract the values # - We do the user callback with the list of name value pairs proc HMsubmit_button {win form_id param stuff} { upvar #0 HM$win var upvar #0 $form_id form set query "" foreach pair $stuff { set value [subst [lindex $pair 1]] if {$value != ""} { set item [lindex $pair 0] lappend query $item $value } } # this is the user callback. HMsubmit_form $win $param $query } # sample user callback for form submission # should be replaced by the application # Sample version generates a string suitable for http proc HMsubmit_form {win param query} { set result "" set sep "" foreach i $query { append result $sep [HMmap_reply $i] if {$sep != "="} {set sep =} {set sep &} } puts $result } # do x-www-urlencoded character mapping # The spec says: "non-alphanumeric characters are replaced by '%HH'" set HMalphanumeric a-zA-Z0-9 ;# definition of alphanumeric character class for {set i 1} {$i <= 256} {incr i} { set c [format %c $i] if {![string match \[$HMalphanumeric\] $c]} { set HMform_map($c) %[format %.2x $i] } } # These are handled specially array set HMform_map { " " + \n %0d%0a } # 1 leave alphanumerics characters alone # 2 Convert every other character to an array lookup # 3 Escape constructs that are "special" to the tcl parser # 4 "subst" the result, doing all the array substitutions proc HMmap_reply {string} { global HMform_map HMalphanumeric regsub -all \[^$HMalphanumeric\] $string {$HMform_map(&)} string regsub -all \n $string {\\n} string regsub -all \t $string {\\t} string regsub -all {[][{})\\]\)} $string {\\&} string return [subst $string] } # convert a x-www-urlencoded string int a a list of name/value pairs # 1 convert a=b&c=d... to {a} {b} {c} {d}... # 2, convert + to " " # 3, convert %xx to char equiv proc HMcgiDecode {data} { set data [split $data "&="] foreach i $data { lappend result [cgiMap $i] } return $result } proc HMcgiMap {data} { regsub -all {\+} $data " " data if {[regexp % $data]} { regsub -all {([][$\\])} $data {\\\1} data regsub -all {%([0-9a-fA-F][0-9a-fA-F])} $data {[format %c 0x\1]} data return [subst $data] } else { return $data } } # There is a bug in the tcl library focus routines that prevents focus # from every reaching an un-viewable window. Use our *own* # version of the library routine, until the bug is fixed, make sure we # over-ride the library version, and not the otherway around if { [info commands tkFocusOK]=="" } { auto_load tkFocusOK } proc tkFocusOK w { set code [catch {$w cget -takefocus} value] if {($code == 0) && ($value != "")} { if {$value == 0} { return 0 } elseif {$value == 1} { return 1 } else { set value [uplevel #0 $value $w] if {$value != ""} { return $value } } } set code [catch {$w cget -state} value] if {($code == 0) && ($value == "disabled")} { return 0 } regexp Key|Focus "[bind $w] [bind [winfo class $w]]" } fv5.4/tcltk/pow/install-sh0000755000220700001010000000421206202215473015136 0ustar birbylheadev#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5; it is not part of GNU. # # $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $ # # This script is compatible with the BSD install script, but was written # from scratch. # # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" instcmd="$mvprog" chmodcmd="" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; *) if [ x"$src" = x ] then src=$1 else dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` fi # Make a temp file name in the proper directory. dstdir=`dirname $dst` dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp # and set any options; do chmod last to preserve setuid bits if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; fi if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; fi if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; fi if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; fi # Now rename the file to the real destination. $doit $rmcmd $dst $doit $mvcmd $dsttmp $dst exit 0 fv5.4/tcltk/pow/makefile.bc50000644000220700001010000001104206747627333015321 0ustar birbylheadev# # Borland C++ IDE generated makefile # Generated 10/6/98 at 11:20:32 AM # .AUTODEPEND # # Borland C++ tools # IMPLIB = Implib BCC32 = Bcc32 +BccW32.cfg BCC32I = Bcc32i +BccW32.cfg TLINK32 = TLink32 TLIB = TLib BRC32 = Brc32 TASM32 = Tasm32 # # IDE macros # # # Options # IDE_LinkFLAGS32 = -LD:\bc5\LIB LinkerLocalOptsAtC32_powtcldlib = -Tpd -ap -c /w-inq ResLocalOptsAtC32_powtcldlib = BLocalOptsAtC32_powtcldlib = CompInheritOptsAt_powtcldlib = -ID:\bc5\INCLUDE;C:\FV_SRC\TCL8.0.4\GENERIC;C:\FV_SRC\TK8.0.4\GENERIC;C:\FV_SRC\TK8.0.4\XLIB;C:\FV_SRC\TK8.0.4\WIN -D_RTLDLL;_BIDSDLL; -w-sig -w-stu -w-par -w-use -w-aus LinkerInheritOptsAt_powtcldlib = -x LinkerOptsAt_powtcldlib = $(LinkerLocalOptsAtC32_powtcldlib) ResOptsAt_powtcldlib = $(ResLocalOptsAtC32_powtcldlib) BOptsAt_powtcldlib = $(BLocalOptsAtC32_powtcldlib) # # Dependency List # Dep_pow = \ powtcl.lib pow : BccW32.cfg $(Dep_pow) echo MakeNode powtcl.lib : powtcl.dll $(IMPLIB) $@ powtcl.dll Dep_powtclddll = \ ..\tcl8.0.4\win\tcl80.lib\ ..\tk8.0.4\win\tk80.lib\ dllentrypoint.obj\ powutils.obj\ visu_lut.obj\ visu_init.obj\ visu_generic.obj\ tclshared.obj\ powwcs.obj\ powcanvcurve.obj\ powgrid.obj\ powcreatevector.obj\ powcreateimage.obj\ powcreategraph.obj\ powcreatedata.obj\ powcreatecurve.obj\ powcommands.obj\ powcolormap.obj\ powinit.obj powtcl.dll : $(Dep_powtclddll) powtcl.def $(TLINK32) @&&| /v $(IDE_LinkFLAGS32) $(LinkerOptsAt_powtcldlib) $(LinkerInheritOptsAt_powtcldlib) + D:\bc5\LIB\c0d32.obj+ dllentrypoint.obj+ powutils.obj+ visu_lut.obj+ visu_init.obj+ visu_generic.obj+ tclshared.obj+ powwcs.obj+ powcanvcurve.obj+ powgrid.obj+ powcreatevector.obj+ powcreateimage.obj+ powcreategraph.obj+ powcreatedata.obj+ powcreatecurve.obj+ powcommands.obj+ powcolormap.obj+ powinit.obj $<,$* ..\tcl8.0.4\win\tcl80.lib+ ..\tk8.0.4\win\tk80.lib+ D:\bc5\LIB\bidsfi.lib+ D:\bc5\LIB\import32.lib+ D:\bc5\LIB\cw32i.lib | dllentrypoint.obj : dllentrypoint.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ dllentrypoint.c | powutils.obj : powutils.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powutils.c | visu_lut.obj : visu_lut.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ visu_lut.c | visu_init.obj : visu_init.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ visu_init.c | visu_generic.obj : visu_generic.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ visu_generic.c | tclshared.obj : tclshared.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ tclshared.c | powwcs.obj : powwcs.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powwcs.c | powcanvcurve.obj : powcanvcurve.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcanvcurve.c | powgrid.obj : powgrid.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powgrid.c | powcreatevector.obj : powcreatevector.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcreatevector.c | powcreateimage.obj : powcreateimage.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcreateimage.c | powcreategraph.obj : powcreategraph.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcreategraph.c | powcreatedata.obj : powcreatedata.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcreatedata.c | powcreatecurve.obj : powcreatecurve.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcreatecurve.c | powcommands.obj : powcommands.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcommands.c | powcolormap.obj : powcolormap.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcolormap.c | powinit.obj : powinit.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powinit.c | orbit.obj : orbit.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ orbit.c | vcclib: powtcl.def lib/def:powtcl.def powtcl.def: ..\tcl8.0\win\DUMPEXTS -o powtcl.def powtcl.dll @&&| $(Dep_powtclddll) | # Compiler configuration file BccW32.cfg : Copy &&| -w -R -v -vi -H -H=pow.csm -WCD -g250 | $@ fv5.4/tcltk/pow/makefile.vc0000644000220700001010000002056507034373223015254 0ustar birbylheadev# Microsoft Developer Studio Generated NMAKE File, Based on pow.dsp !IF "$(CFG)" == "" CFG=pow - Win32 Debug !MESSAGE No configuration specified. Defaulting to pow - Win32 Debug. !ENDIF !IF "$(CFG)" != "pow - Win32 Release" && "$(CFG)" != "pow - Win32 Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "pow.mak" CFG="pow - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "pow - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "pow - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "pow - Win32 Release" OUTDIR=. INTDIR=. # Begin Custom Macros OutDir=. # End Custom Macros ALL : "$(OUTDIR)\powtcl.dll" CLEAN : -@erase "$(INTDIR)\PowCanvCurve.obj" -@erase "$(INTDIR)\PowColormap.obj" -@erase "$(INTDIR)\PowCommands.obj" -@erase "$(INTDIR)\PowCreateCurve.obj" -@erase "$(INTDIR)\PowCreateData.obj" -@erase "$(INTDIR)\PowCreateGraph.obj" -@erase "$(INTDIR)\PowCreateImage.obj" -@erase "$(INTDIR)\PowCreateVector.obj" -@erase "$(INTDIR)\PowGrid.obj" -@erase "$(INTDIR)\PowInit.obj" -@erase "$(INTDIR)\PowUtils.obj" -@erase "$(INTDIR)\PowWCS.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\Visu_generic.obj" -@erase "$(INTDIR)\Visu_Init.obj" -@erase "$(INTDIR)\Visu_lut.obj" -@erase "$(OUTDIR)\powtcl.dll" -@erase "$(OUTDIR)\pow.exp" -@erase "$(OUTDIR)\powtcl.lib" "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "POW_EXPORTS" /Fp"$(INTDIR)\pow.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32 BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\pow.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /pdb:"$(OUTDIR)\pow.pdb" /machine:I386 /def:"powtcl.def" /out:"$(OUTDIR)\powtcl.dll" /implib:"$(OUTDIR)\powtcl.lib" DEF_FILE= \ "powtcl.def" LINK32_OBJS= \ "$(INTDIR)\PowWCS.obj" \ "$(INTDIR)\PowCanvCurve.obj" \ "$(INTDIR)\PowColormap.obj" \ "$(INTDIR)\PowCommands.obj" \ "$(INTDIR)\PowCreateCurve.obj" \ "$(INTDIR)\PowCreateData.obj" \ "$(INTDIR)\PowCreateGraph.obj" \ "$(INTDIR)\PowCreateImage.obj" \ "$(INTDIR)\PowCreateVector.obj" \ "$(INTDIR)\PowGrid.obj" \ "$(INTDIR)\PowUtils.obj" \ "$(INTDIR)\Visu_lut.obj" \ "$(INTDIR)\Visu_Init.obj" \ "$(INTDIR)\Visu_generic.obj" \ "$(INTDIR)\PowInit.obj" "$(OUTDIR)\powtcl.dll" : "$(OUTDIR)" $(LINK32_OBJS) $(DEF_FILE) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(DEF_FILE): ..\tcl8.2.2\win\Release\DUMPEXTS -o $(DEF_FILE) powtcl.dll $(LINK32_OBJS) !ELSEIF "$(CFG)" == "pow - Win32 Debug" OUTDIR=. INTDIR=. # Begin Custom Macros OutDir=. # End Custom Macros ALL : "$(OUTDIR)\powtcl.dll" CLEAN : -@erase "$(INTDIR)\PowCanvCurve.obj" -@erase "$(INTDIR)\PowColormap.obj" -@erase "$(INTDIR)\PowCommands.obj" -@erase "$(INTDIR)\PowCreateCurve.obj" -@erase "$(INTDIR)\PowCreateData.obj" -@erase "$(INTDIR)\PowCreateGraph.obj" -@erase "$(INTDIR)\PowCreateImage.obj" -@erase "$(INTDIR)\PowCreateVector.obj" -@erase "$(INTDIR)\PowGrid.obj" -@erase "$(INTDIR)\PowInit.obj" -@erase "$(INTDIR)\PowUtils.obj" -@erase "$(INTDIR)\PowWCS.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\vc60.pdb" -@erase "$(INTDIR)\Visu_generic.obj" -@erase "$(INTDIR)\Visu_Init.obj" -@erase "$(INTDIR)\Visu_lut.obj" -@erase "$(OUTDIR)\powtcl.dll" -@erase "$(OUTDIR)\pow.exp" -@erase "$(OUTDIR)\pow.ilk" -@erase "$(OUTDIR)\powtcl.lib" -@erase "$(OUTDIR)\pow.pdb" "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MTd /W3 /Gm /GX /ZI /Od /I "d:\fv_src\tcl8.2.2\generic" /I "d:\fv_src\tk8.2.2\generic\\" /I "d:\fv_src\tk8.2.2\xlib" /I "d:\fv_src\tk8.2.2\win" /D "__WIN32__" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "POW_EXPORTS" /Fp"$(INTDIR)\pow.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32 BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\pow.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=d:\fv_src\tcl8.2.2\win\Release\tcl82.lib d:\fv_src\tk8.2.2\win\Release\tk82.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"$(OUTDIR)\pow.pdb" /debug /machine:I386 /def:"powtcl.def" /out:"$(OUTDIR)\powtcl.dll" /implib:"$(OUTDIR)\powtcl.lib" /pdbtype:sept DEF_FILE= \ "powtcl.def" LINK32_OBJS= \ "$(INTDIR)\PowWCS.obj" \ "$(INTDIR)\PowCanvCurve.obj" \ "$(INTDIR)\PowColormap.obj" \ "$(INTDIR)\PowCommands.obj" \ "$(INTDIR)\PowCreateCurve.obj" \ "$(INTDIR)\PowCreateData.obj" \ "$(INTDIR)\PowCreateGraph.obj" \ "$(INTDIR)\PowCreateImage.obj" \ "$(INTDIR)\PowCreateVector.obj" \ "$(INTDIR)\PowGrid.obj" \ "$(INTDIR)\PowUtils.obj" \ "$(INTDIR)\Visu_lut.obj" \ "$(INTDIR)\Visu_Init.obj" \ "$(INTDIR)\Visu_generic.obj" \ "$(INTDIR)\PowInit.obj" "$(OUTDIR)\powtcl.dll" : "$(OUTDIR)" $(LINK32_OBJS) $(DEF_FILE) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(DEF_FILE): ..\tcl8.2.2\win\Release\DUMPEXTS -o $(DEF_FILE) powtcl.dll $(LINK32_OBJS) !ENDIF .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << !IF "$(NO_EXTERNAL_DEPS)" != "1" !IF EXISTS("pow.dep") !INCLUDE "pow.dep" !ELSE !MESSAGE Warning: cannot find "pow.dep" !ENDIF !ENDIF !IF "$(CFG)" == "pow - Win32 Release" || "$(CFG)" == "pow - Win32 Debug" SOURCE=PowCanvCurve.c !IF "$(CFG)" == "pow - Win32 Release" CPP_SWITCHES=/nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "POW_EXPORTS" /Fp"$(INTDIR)\pow.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c "$(INTDIR)\PowCanvCurve.obj" : $(SOURCE) "$(INTDIR)" $(CPP) @<< $(CPP_SWITCHES) $(SOURCE) << !ELSEIF "$(CFG)" == "pow - Win32 Debug" CPP_SWITCHES=/nologo /MTd /W3 /Gm /GX /ZI /Od /I "d:\fv_src\tcl8.2.2\generic" /I "d:\fv_src\tk8.2.2\generic\\" /I "d:\fv_src\tk8.2.2\xlib" /I "d:\fv_src\tk8.2.2\win" /D "__WIN32__" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "POW_EXPORTS" /Fp"$(INTDIR)\pow.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c "$(INTDIR)\PowCanvCurve.obj" : $(SOURCE) "$(INTDIR)" $(CPP) @<< $(CPP_SWITCHES) $(SOURCE) << !ENDIF SOURCE=PowColormap.c "$(INTDIR)\PowColormap.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) SOURCE=PowCommands.c "$(INTDIR)\PowCommands.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) SOURCE=PowCreateCurve.c "$(INTDIR)\PowCreateCurve.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) SOURCE=PowCreateData.c "$(INTDIR)\PowCreateData.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) SOURCE=PowCreateGraph.c "$(INTDIR)\PowCreateGraph.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) SOURCE=PowCreateImage.c "$(INTDIR)\PowCreateImage.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) SOURCE=PowCreateVector.c "$(INTDIR)\PowCreateVector.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) SOURCE=PowGrid.c "$(INTDIR)\PowGrid.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) SOURCE=PowInit.c "$(INTDIR)\PowInit.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) SOURCE=PowUtils.c "$(INTDIR)\PowUtils.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) SOURCE=PowWCS.c "$(INTDIR)\PowWCS.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) SOURCE=Visu_generic.c "$(INTDIR)\Visu_generic.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) SOURCE=Visu_Init.c "$(INTDIR)\Visu_Init.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) SOURCE=Visu_lut.c "$(INTDIR)\Visu_lut.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF fv5.4/tcltk/pow/makefile_plugin.bc50000644000220700001010000001066306751650204016673 0ustar birbylheadev# # Borland C++ IDE generated makefile # Generated 10/6/98 at 11:20:32 AM # .AUTODEPEND # # Borland C++ tools # IMPLIB = Implib BCC32 = Bcc32 +BccW32.cfg BCC32I = Bcc32i +BccW32.cfg TLINK32 = TLink32 TLIB = TLib BRC32 = Brc32 TASM32 = Tasm32 # # IDE macros # # # Options # IDE_LinkFLAGS32 = -LD:\bc5\LIB LinkerLocalOptsAtC32_powtcldlib = -Tpd -ap -c /w-inq ResLocalOptsAtC32_powtcldlib = BLocalOptsAtC32_powtcldlib = CompInheritOptsAt_powtcldlib = -ID:\bc5\INCLUDE;C:\LHEAPLUGIN\TCL8.0\GENERIC;C:\LHEAPLUGIN\TK8.0\GENERIC;C:\LHEAPLUGIN\TK8.0\XLIB;C:\LHEAPLUGIN\TK8.0\WIN -D_RTLDLL;_BIDSDLL; -w-sig -w-stu -w-par -w-use -w-aus LinkerInheritOptsAt_powtcldlib = -x LinkerOptsAt_powtcldlib = $(LinkerLocalOptsAtC32_powtcldlib) ResOptsAt_powtcldlib = $(ResLocalOptsAtC32_powtcldlib) BOptsAt_powtcldlib = $(BLocalOptsAtC32_powtcldlib) # # Dependency List # Dep_pow = \ powtcl.lib pow : BccW32.cfg $(Dep_pow) echo MakeNode powtcl.lib : powtcl.dll $(IMPLIB) $@ powtcl.dll Dep_powtclddll = \ ..\tcl8.0\win\tcl80.lib\ ..\tk8.0\win\tk80.lib\ powutils.obj\ visu_lut.obj\ visu_init.obj\ visu_generic.obj\ tclshared.obj\ powwcs.obj\ powcanvcurve.obj\ powgrid.obj\ powcreatevector.obj\ powcreateimage.obj\ powcreategraph.obj\ powcreatedata.obj\ powcreatecurve.obj\ powcommands.obj\ powcolormap.obj\ powinit_plugin.obj\ orbit.obj powtcl.dll : $(Dep_powtclddll) powtcl.def $(TLINK32) @&&| /v $(IDE_LinkFLAGS32) $(LinkerOptsAt_powtcldlib) $(LinkerInheritOptsAt_powtcldlib) + D:\bc5\LIB\c0d32.obj+ powutils.obj+ visu_lut.obj+ visu_init.obj+ visu_generic.obj+ tclshared.obj+ powwcs.obj+ powcanvcurve.obj+ powgrid.obj+ powcreatevector.obj+ powcreateimage.obj+ powcreategraph.obj+ powcreatedata.obj+ powcreatecurve.obj+ powcommands.obj+ powcolormap.obj+ powinit_plugin.obj+ orbit.obj $<,$* ..\tcl8.0\win\tcl80.lib+ ..\tk8.0\win\tk80.lib+ D:\bc5\LIB\bidsfi.lib+ D:\bc5\LIB\import32.lib+ D:\bc5\LIB\cw32i.lib,powtcl.def | powutils.obj : powutils.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powutils.c | visu_lut.obj : visu_lut.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ visu_lut.c | visu_init.obj : visu_init.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ visu_init.c | visu_generic.obj : visu_generic.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ visu_generic.c | tclshared.obj : tclshared.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ tclshared.c | powwcs.obj : powwcs.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powwcs.c | powcanvcurve.obj : powcanvcurve.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcanvcurve.c | powgrid.obj : powgrid.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powgrid.c | powcreatevector.obj : powcreatevector.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcreatevector.c | powcreateimage.obj : powcreateimage.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcreateimage.c | powcreategraph.obj : powcreategraph.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcreategraph.c | powcreatedata.obj : powcreatedata.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcreatedata.c | powcreatecurve.obj : powcreatecurve.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcreatecurve.c | powcommands.obj : powcommands.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcommands.c | powcolormap.obj : powcolormap.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powcolormap.c | powinit_plugin.obj : powinit_plugin.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ powinit_plugin.c | orbit.obj : orbit.c $(BCC32) -P- -c @&&| $(CompOptsAt_powtcldlib) $(CompInheritOptsAt_powtcldlib) -o$@ orbit.c | vcclib: powtcl.def lib/def:powtcl.def powtcl.def: ..\tcl8.0\win\DUMPEXTS -o powtcl.def powtcl.dll @&&| $(Dep_powtclddll) | # Compiler configuration file BccW32.cfg : Copy &&| -w -R -v -vi -H -H=pow.csm -WCD -g250 | $@ fv5.4/tcltk/pow/mhh7.gif0000644000220700001010000054016206327671021014500 0ustar birbylheadevGIF87a]ø÷üìÓÿïÖÿñØúêÑýíÔþîÕÿëÐûëÒÿð×üé×üæÏùéÐïàÈüåÓÿòßøèÏþéÒýèÎýõÜÿñÓýçÑûîÙÿñÙÿíÎÿô×þøÜ÷çÎôàÌõäÐüåÇþòÕëÜÁÿíÒÿïÒõíÝÿíÑÿñÔÿöÛ÷íÒùäÇúñÚèÒ»áβúíÑô߯é×½ÿóÚüçÏ÷åÔúíÛìÝÄëÜÈøéÊÿîÙÑ¿µ£ØÅ²íßÄõçÉýçËöæÍìÙ½þûèøãËþéËýêÔêå×îåÒñåËøçÓþúßûíÎéÙÈõåÌðàÅáϾõéÑÝϺÿìÔãÔ¼õéØÐÁ²Û˱ÿïÔÀ´›«£›Åµ® ‰Õ˹¹©šÈÊʯ£Šã×Ȳ¿ËóæÊɽ¥†t^”¢ª‘¥µÑÀ«´¾¿houÏÑÍÕÅ«8*{‡“‡yž‹u]\XLA2whT¬³¿‡™¦®®¬ zØÒÅz{zéÕ¿“𣗉w–‘ƒ_fl­œŠ¢¬±¥±´lz†ÿõ᯴³¬›€ÆÆÉ£´ÂÄÁă›—‡n˹¦q`KQPKž®¾‰ze£”ƒ¹º½·¶ºÅ·§¥™’€kbR?®¹Ã½¿½¤šŽ¤”yŠkÆÀµ›§¶}o[ê×ÄŸ¤¥¼ÂËñæÖ»° Ê·›»¶«ÛË¹ÐÆ¸ä׽°›âÜл­žÝÕÆóâÏ»¨øéͶ¨÷áÆª¨¦óçÖ¾­‘ïÚÆÿøçòÜÀïÝËüêÙôäËÿòÙýìØëÙÁôÝÉúäÌþêÌüæÊþüßóãÉÿýããÓ¿ÿôÛþýêÿéÑýêÏûáÅøåÍëàÌûäÎôáÆùéÓÑÀ§òÜÄÙȳýîÏðßÍüæÌýòÚêàÔõåÔâиÿîÝðáÎÿïÞþòÞêÜÎÿôÞ÷áÌúáÎÿíÖòâÈÿöÝøèÕüèÐýìÑþøàüèÕÿõäÿïØÿõÛýíÝýêÒýîÒøêÚõäÉøêÐþðØþèÎûìÑøéÏõäÍóãÎÿòØÿòÚýíÖÿõØûëÑþæÎüæÎúèÐÿêÐ,]øþ (ðÁƒ*y> T€-Á\( À„§P'8›Juª‡«X¯FÝʵëÓªU½fÍzD H¨;2«Ø¶º†p†Ó#Íξ: 1ÁÚ{œé Ã_Œûõ I"GÞ¸°²å/%RäXQ(ΠÖ 9²äIˆÞEˆ9æL›wGëôÜ“hP¡¶}uá¦N¹†N|8ܸ^“sKõmÛ²gÓ®UÎõ¸\ºuc_È+•/Ô«Gîþõêåf¾¹Ðp ˜dÉ”-ËGˆõÄw¡ Íz´i’tí0‚J0ÔÚ;»\MÌM5mM!á„z–[ìfKàuOY"uê”hb‰^‘ âŠ*îÕW\sWœsc]× ƒSy5œ3½”0ÁÎ`Á/çDÖ›QÁ  ¤’ñÍ7_}*i†xFeGþ™à;0BDñs`‚ Ùàƒ¦‰Û…Ú"Àc|Õq"Ž˜œŒÄÙùÔpQíØ YÙÈŽÜM€rS1¤`@ƒø¢ÄpD5éäe8%V^i‘ì²I!p¹ A_h‚þ .Øà^jÖZ›m`(Ào, çwt¶¥ç°wâéÝŒRýÙU}ÎJ¨wW‘0:ÎÐDÂ=÷¨ÃŽ/êd`Ä/¿Ó`®¹šnº”~š_¨¢64B–§^êñ㥫F+lgÚ Q«[˜¹bšØ¿*Ç,±P±È¢W'ž£ƒ}ë]upéx£™.îB‰T‘àÁ=FqÏa90@Þð bÔL@ºê&Ä®”WÂï@mÀ©#„0ôjø¹šÒ«þ–©±ÀŸuº¦mûÄÔ Ëeìÿ(lW³JG“Y ˵Èxâ¸ñø@Íæ>À°,“ [¢Èþ xÀnŽsÎ Iå}=ï÷3«A·:4E Mïð3`…LÿkÓÓC¹Ó…oçzµ 'ËÜÙÄ¢¶ZcŸ…:ê«â €OÕüBܸÀg Æ¿hàÍ9»ÍÏò!½.øAà ðP…ü@ÃKã_²Ë4üDÀË º€Ÿ™jÚ´ZKиôê;܃ɟ¾ L@J#Ð3ÅJ–OA*4ÉTQ¤Exk>CˆÔÏ'øóŒ` 1¾ëÕ!§Œ,Ñ‘JÍâ´˜-™:øâC‘@0B`¨ _°ã)t h0{è°þGt¨ƒ#¼Ð¢`|8•ÎE„Y ƒ@¸Â¨˜ŒC4L|B ” $8'à‹C倠Št ƒÈ kp|€4 ŒŒCøÅ–¡| oÀà“屄}•áG!¡Q%PN_á…. IÉJRr`Yž}¼N_ûâ&ïcÉåÅ/~œ„H$y1¹–H’ RÇLf@g ÐÞ Fü’ÉFr²Bñ̰€b r\KúM21ÒÀ$ÎYJ`„Š™È&ÎeÕ¡ %°c-JP…Ø¡ Y0:PGƒ¤ úEFTE<ðr¶sˆ(þšåžf­¹ Fy9¶txz€: <Ëâ¨GÅ€+c;²ÉF¦À>±ÇË|à2HÁã¨D!¾0 À V€L¢O’ë‹iX1Vœ #` lÊÊñ€@ *PÛGÔ¢:oy©a^tqV¬F{º`ê ¦Z¾Êq²{‡ªP!ÀÕ®zõ«¨óÆÇ ó) ÙfÛXºÌs<ÆðÆ&W¹ËÓ”õÃOFR¿nk(€ ¾Áƒ8íê¯À‡‹BpΉV«&T´fM†lù› ­,ë€tµø0yÉÀt „"ñG:˜VÔ¡ƒ ¨%Og¹þZ 9­jð%ÀÖ/0€Ù† ÙZKh—œCfFà7|Q;h€ PÆ-jPƒ[(£8ð6žá`ø ¸@dð, µoK%">©µ¨Ìà ¨‘¤à=ÅN§ÚTþú—|Q pT§Ç ›ê‚•úž,zjôàÁŽp~ujS¬¢ÿå/26Ìá{üe ÜòAà Ð`*;’ ¹= %Åã Ÿ|—û RëG¹}¥&¥$F=|“¡ÁŽ½Ë íðQ&%øb¡…q­ÄTÄŽ„Â&.G`cY²)Fx’µ+t²:h F )ªÀ¡þ¤î@1jyG EâÊ XÎh:ãÞ A9ïA_ŒBA̲*’P o$! Þ¨E-ÀÐNXÀ3PQe\ÏpÀ3–  Ô 8ÐSÚyã+%@Dޑ⦲B«AÀX ¤`7˜pwÍk^gxª–…,tºSa3ƒ N ZÀl ·Âú-°@¾Ô^ïzzØÎ¶¶,ìd78 ®5}S %,פ–ž[@–))¶M'Ç@¤U‰•be5/dº>'@IÀyAo(¡¶s&<û‚ôÚ– ¸žË²(V+â:ôEe-UHK J`ì^þøRY܆@ - zñ‹‘‚ñ™ÙøÏ…ÞãG¯¡3J€m‰Ñ¾ø…ŒˆEUÔ,Øà0yF÷±¨€8pÀ€3H€0ÀŠf´Á£ÈA-ž‹R%DpX5†EÌ  ø§²ˆ7+z°Œh‡x§Ö¶é¯»ÝícûWÄÆÆö®]=UV>’Ú’Ì;+ŽÍøÆ;þظÈï‚[Ð`SCÜñÆ… úæ àbg Æ–¡jPÃà–÷TU#ÉSÎÄ(f*¬%¹Ü$ð ø@ –q†Þó~Ù9È5Þo¢Üô-ø€ò—¯|sKÔ9hÁtŸü'HA —oÁ Uþáô€´4`‡éƒOÚ€¼ oc z@ ,zƒ-¨¡i½ìŒG™¿£èÌ}ñ'L j€J 9`KÐ7 à ÞpAà æ ph ´@uTG ´p Hà00h  3À›whÞàhL§ï0>,€ln`Èö`'ãs`ÚãjŠ7{>ÅkÓ#I„7UFUíÃ>ë“®ÔzŠÇ¹Ð„Nø„Oø‚Æm¿ö›' &X¡'Í0 £Ð‘'yûu`L5„VxíãS1¨ ?Ày È §y-p¯p€p« ¯Ð‡7€‡T° ØG O4À|þÌWz¦'£÷ *p}R° ¯p©p7Ї©° {H Rð*ð _p}ÞÄ~œÈ{Ê7 Ÿn° _«`Ÿ@}H‘ ‡ ŠP²H6 =àWÀ{g‰_@R@[pUVcpŒË ˆg0Ô€ ŸW‰&ÀÏ0 ³ð åpm°~€ è @LµÀÎU;à#@¼ð/( ?pýø'ð'pl? /`ï0 üðù¨xeõ^íÃ<ï°¼ÐxÝfSŒÇÉðù‘)Qì@ pn¨b¬À)™’ì° ÛÀ /þ“09“1i`;;  yc Ù¬ð ðÌ€ ÔÀxà )€ ÇV`¹;ÐÅàkІ nø“þ¸•)pÆÆ'pjà Ô0Óø=à ì Ô° Ÿ ÚGÉ èDsxYsA90 µ¦=€P=€ m)-ðˆ* G 40ªðO4°lOÐ<@IàFÉð€ -à9ð g€ J {æwªz¼G -ÀjY 5„FP¢'£ ¸0Oð2€ æ'‡ê–;Œ Nì…)PLÎX:À@äÌ‹]³ »ÆàÓæYÝ`àÚPP`¹°Ê?pê:dÖe£ µlNÉJaÚÓÛÚŸ@•ÃÀ g+˜ì’þß¼ ѬÎk{­ïŒ /͔̰·'0Ó àg-P us†9¬ÐÛÝ­n@ç¡âù›¾àhµ`”P •î7ƒU‡vLÑbè6v}tvêEÒ²}lÉÌ „.Í̼®UZÍM›Ýp ; 5àEPÏ@ÊPʤQõ‘† ±- ð…€YŠ 7Ï üí¼ïÐ;`* ÊëçÞ»†°Ü @ …:£› ÀgŠê–|£ðõL _ðšgh<°¸´3LP˜ËÂúP‘'°ä\åäPåÊ5€ ÷ZзÀÊP PšP±Ðþ np¯`hƒµ:pG@L{{.6óªp`ÞÜa´Œ ú@9ïà?ÀÀ†° ê\³¥[`ô‹¶·èô[ôÖj ´:v[\Xè&ìfz_ðg@ k g°ÝFŒ51hEŒÅ¸`€ðWˆfh à6¦î —Ž&)ò(HÃ4HæBë‹GlE9ôúxî§’¥¾î²ù 30Wšp 3 YÐ’¼ä@ I¿­:U¤¸ 8jÂ`hàY°ŽŒã~î@à%Oú”úK ‘€c ¼£3 Ž7ª œØš¥ù3d(§-tJÀ U› ¯öÙãÃÈÐOþÐTWÊääÏoÀ‹·ÐñKph Òµá@ H€i8@ 5ÐèµÀæì Ãd¢vÄ3ïbm`µû[š´õ° ¤@ ë º~èR@‚ é2Èì‡'~üx!ƒA-I¼åИ#G­x(Ñ EÊ)¯pü€+G’jÝL’“ÇΛ‚! (“¢¹ñ“`ŒH¡`Tþ»¦‰Ãµ[KÔ˜[ DÅdÑ}ýz5¶Hm Íâ†N7Xš64€ƒ twu…üxb@:t`ÕÜy±XMÕÃÃY@6K ÀX„=N욢ËÂMwR™ €ŒÕ¯‰È~`ÁL‹ Ö4AC‘Lôh£ Ch¡E`¬Ð‰r4‰mp9 oj9B%h8—_Áo| @,¢êP ›n pÂ' Z€ ›zX0‚X`ˆ‚‡tAf! ¾úÁ¡„XÑ¥ VX@Æ cv¢r§x`àA*”ø j¤h&_Œú2‰|ñ¥–$xÐàÈþ`d …’$5P›FÁÅ›jZ€\–)„¯Êj+ŠÙ†j¨Iá±mXaæ—Þ1à^xU–X^Xy‚,iCpü°†&f‡?žAœ`Ù‡mjè–šÑfƒꈤpnñÃY„ 8à`–rn©†xé!˜wœ¨+€bò— å%riàš @'{àF8 .xç.h®º¦Ã ¸Š£Ž;Y<B–ŠáÆ^^0`Š ¸óðrBAÃ%`&€$)À‘™m´ i CŽ ® 嬙Æ4"#0n~Æþx €VPÇtX€Æ‘ÇCÑÈyâ´|aÉeSfô3h›m6È%XôË… ²ï‡"!`å­?¦GtÙæ}rÂoH§Z|Éé¨pyÂQÀÿ®EƒØtN9XÀ›s4@@$ 8à.Èé£.ÜÉ…¬ 8ãx€T+†œpˆL·ƒ s‚q[¡­Yaˆfbæ‡n‚qÂHÐð .ˆ!–!:é‰c†@ÂBäC‘3jPf–|¨ƒMä¿P™!BtÀ©F·[`8Í YR‡™œÈÇÊç]R(Ð`A,ª¶ l€ h2þváœçl£ËsŠÁ¯†ÅèÁh„lƒ} x€@p¨Âµ¨†n˜CG@‚‘VP‡Ý Ùà‚ ±Ž!ø€ \ð0bp³8 6WpÀ:Ö"˜@$í`‚rð eÄb3 ÐPÔA4ÊàÀ3hÑúˆÃxB(€@Ö` €Œ˜A2ƒ$!™î´aUÄm?È[ÞBx%0p‡À4P ÌäoIx@"5À¸7Åé(.P€täÞ@0À€$€(‹Œ àðo à ‹ËAê`£´@€8¨Ã ñƒûÃC¸Â4þLeÔà Ø€2,  Ì`‘ÈB'…& #Pˆ+†PŽlpìf‹¸C(ÆàÃÊ@…"Œjq€ @Ç,À! `\¨@G 4mP lÚØF ‚p–mt#cPª‹4 ø2 <É‘ ^ÐÅ¢ÏÙÚÀ@S€ ¦Ð|ƒÈé X°Ðâò”*” _ÔÁ>pC$bŒ8¢… á¥|p± !‡ø†`rCKXEî‹D"è8…B1 T` xÀ„y8 K(ÂÜ 8ÀäãÀ-hñŒk8€äËE†Ñþ†r ´8Y~V‡ ‡\ä"ÈÀÑŒì€ø%„!AÆ n2YÊÂ) ¾Ý¡°¥DAò(<ÈÊ.Û¦JÊé h7€º\Î`@ €Z<KÞPÂkƒñ$A%2€,}47'°`u8Ä+’Ä ¤—Qƒ)` CX¡ ·ÆÐ SHµèÀ‚#b0„!8" XÂxÑ HŒÁš¸8¦e$D!‹èUäêt<õÖš*nŒˆQŸ~("ƒ Äâ³ÐÄ^ÆP Þг(àoÈ ¯å#xÇAXðŽ÷ñR/2†1‚P x­8ø„1j ,þrôŠà@E€ÎH ÐQ²@H¼t‚-!0]à¨pÄ,"!CˆA6 tÍlD ÂȆ0\±Žc  ‘D FaYôê3H€¬ TÀÀåx²€t b2Ì€2Á ÐÛpáp† ¥®ÕHmÒÖ,@XºÕm!N`S¦3í H &FyS–Ù7£¼¶@¦gÉ<…0Ôðö|ŽJ É>{xc‘Ͱ‚‡„» 9†ÔÀ R‹o°@Šˆ(áôFÁ”…R=!Šcdb‹?lÃ!bÁ…% A Çh†p CþD ¤€Á<‘€ kàà7+Ö€`P÷¤X!tƒŒAÈÆ– t, 7(GpÀÏ6è>H€&BSÒ‚^¹˜E`pì¨*`ñ ð(´±@E6ÖkdcèØË4`-Üœ¨à@0¾€$¸[ÂÐñ|°.ˆ°À ?øÅ/¶Á ðÒ ‚Â5¹Ð‰tbMˆ„„ƒCè4Ù@G ÖÁm90Á/šÀ€[ä*Œà€–ð¬1@"kàÂ5ü }€ ÄÛh@5Êq tT„ˆ â6V°ÂÑÛÀE¾A:ãF¼¼ßŒ!"Ò“þÞ#¹Š¼Ñ&8u¤ô:€)U]Úã ãpr2€ZpVh;ù\ëg[ Ë`„ $ÜÕ!*p‚¬7é6¬ "Â)ª€‡SHà \о':! hZS m¸„áˆH¨ßÜÂ8Eä߆+Ì@ÂØyînGh Yà€r…Hpƒ6@9`¯C0À;¸ö Ì‚u(B‡rð„6X‚ 0n¨Mx(/R<2ú9<†u˜$p€PÈ`7kˆ6,aNri@„E†X D»k@…i†$8Hhƒ_À†hƒL(Ànø8X0„eÐþÇx`$°4†((‡´“†X€‚;¨a°À60tcˆ*ó$`€_È)ø&P+¯œ³+BŸ%ƒC8„,€r ‡(.]8}€€(4ö0HLé‰0ˆ,l"±‚Ðm`…I«£"ùXHÒ+½jx% 5؉81 Üb% €œR£$ÇyXƒ°_XÞ#€ †0‰Üb“7©0 ÅQqЬHQ2 I+ÀfÀ¨‡xEÀk0QÀƒ,ð!0èÎW¸7((X„C…³ó4¨‚Xp„C`ž(È‚äY…C(‡Yþ˜M »BhRø™6@lP†/p0„+x†/ƒhH(‡(@O†P „PX<`hÇlȆ;ˆG¸A‚Y€9¸7È„,h3•̘G?ô65¸KÀGP6aO(¸„*@D°„*˜ƒó[‚u §yЀ1XE(»{‹HX3î¹R(À3ðeØØj9P°Ú°*AŒ<nr4aP¡Lp7@;¸p ‚L°›AH`Ѓi0Á%ˆ‚18ž¼ŽÔÃè0€ €+Ѓ,p„iƒfàC'lဠÛl™Ep·jh¦þTà 8Ä[‚1ˆ ÍÙ´\8ƒ1x‚y˜P†ÞT†"˜™ÂxeH€"°kÐMÝ”‡Õ,‚x„6hyа˜‡h†WxPy@N˜Mx‚Z‚OX¶°j¥n¸‘!ÅÀ…áІ€€``&°‚+†f°„EK°lhEÈ‚&ÈK€6Ghƒyt„õsl˜78…9†;€¸‡eÈ„+8qH…W_˜4Ø"˜s€Kpƒ' ‡Ê(°KTx†·ú¹Xˆ‚C0ap8Cà‚r°„Lˆ`8` 2à(<`þ¹¼4P§6ˆ„HèÂR4`ƒHoS„Eà‚.ƒ6ƒ¨‡¥QCx„›È„C*0@a8†,‡1h³iˆ$ØÊYK°*4Àƒ/Ui†9@J(‡NÀs+@ÀK‚E(I@ñúÔq[…ÚPÑ íh*ÀgØ€$ÀШeàTOX„6Q¸5@ƒ6pQp…,Pƒ;È„*ˆ‚(€0X„dÍ‚²Ë²,H8E@W°†u°Éc@‚˜†+ØRñ³r(R.Àn2,xËX¸·6¯U€lÂ,sKh*s…lˆ‡ÓQˆWþ˜G°„-ƒ= †58EX†«À5Åñ´ŠX ‹:02f°f8¶è5…/‚'8o0jX `”Up, „;˜OÈ„:JÅÀPà:°„Rp `ø…¨J(†5x 9@ƒ¸ÃQpÉWpƒQ0&ˆ†+pƒcÝT¸†À–˜…cEkpÐ(Sˆ$à‚LE(@i*@„,Àƒ60ÒCp…½X…QˆR EÊX·_Fý4 oè“Q’H@ƒ$€qP°_.õƒZ„(È„&€‚²cX`hƒo´‚HÈ\0غÿþ.¨‚6ð'mõ³,ˆ,À‚/¨Ó;X‚6ˆ…+ÝW-Ë„EÐ7ˆ@<˜*Sx¸g‡ †™b€,PC0«‚R`7·í6XÂCX„–UƒH(À‚6°Gð5àQPÔ(Ë„/ðO808a¸Eø`à6lX×l°Á*p5`li8 lƒSøRE.ˆJ†H¸iÀ†lp€‚N(‡޲ô/ó„;(‡e}R *…8A¤Õ9’:HfÀfèd H€hQð€F€YP"ç±$Xöcàt75…Òµ"hþ*ÄO) ‚/ØR"0‚Qx„Úp‡ø4P·&E kà€iH€X`¹“„„©žu°¯H8†+‹‚iBèQ[JP`<8`xì*pmƒ0‹‚EX‡t0ÂH8ƒB_ÐP‚(€+@ƒsx+8@øh½S0ƒQØH(‡c¨€iWp¸›caи­‚Lð6¨‚Nh‚6À‚ Ê„6X‡-XBN-@a°™ LVChX!†Yp· #8ƒQXKxQJˆRD¨J8„(†6È‚õCƒX(‡E¸³ûшB=°„çKˆ-þ¸&°†h°/9XSXm˜úJ°É½à6òÝ¢lØ"Wð^ê‰SØ‚Cð„ ¼ÖiŠ… žN@ƒ:Ž„% Õ$­®Q¸‰xNûˆ¤8€…0‡ªKx¶¡æó ¨‡‹x:\¨:'}°€ @…Y°0k¹†Yñƒ%°°éæ*¨œtÀ$ÝCH)pù$€Z )°…†/X…GØ‚ex‚Bp*0…EÀ7‡PÉPÀh…„ÆDS@…,Ѓ;pB$à3T(ph©öP„1Ào+„[@-ò4°„iPÞjFæ@ãGø€8ŠÞ€_x‚þŽ †WÐ")øƒ»„Ù”‡f`{)ø‚v‰„_8ƒŽ±€B8„gHÓU ÉÉ­ÕÎ]\@ƒðƒ„QXƒ6?€O}†psƒ૬†,;=ð6Mð¢{‚8ðM¸´´„CøÞ1\¡ u7X‚/]„ …ª\¼Þ1(RØk›ù‚s`‚3X˺Ո‡rÀ#D‚?ŽÐZ…õƒuPfEƒÞÕnRà˜ók WÈK»6˜×CÈW¿–M«À…Ž%†=†ˆ£H:ÐuY醂Бi`†´ùVð©nN‰«”«XþÝ~„;…* @@@e‚Pƒ€X&Á…è†ep\ð…­ç9a˜†c¨pP(rR…¨€° 6qº•¨ƒ[PUcºCèeH…6PØ4(„ (~´eh7x…O m0ø„O | ¥È‚6x_øE€„7‚¸+Xƒ+ƒ5à“B±‚g+„BR€RPExãõ7hoXƒf)@H„e¨…oÐ¥zhm4¨J'FƒöHƒJHSRзjg‚ÔÖë:å‚x6Sh†ƒBƒL…kXhºHþ0MèÝ5(‚[P+¸™Yð@°ªUÈ„'ø…ZW„+p`RÊÐTHíE¨CXRN-D$ˆ9ˆ…fX_R¨׃*z°" ‡"¨ó6¸h‚L°mPp…q8†¸ƒ`j …+„U,H2Ÿn2ý°q?â Š€ ȇ\è Xˆ\ȇA«Ù®À…\¨K#…J8@p×,è”c  À?`a\І°'xø†àéH…œÇQ (BC…XÐnÐñj €q¨›º©ÈÆÿUéŽm8ƒ\€r …ÆÛ€%(ÑþH0›F¾JȎЇ„|¨…€xvø€U€™x€}0`€`h€0€Ha#ÈŸoHè€n†:0ãg~@þø„€fY˜‚p‚:˜O ¡‰)@C¨‡aF‚Ÿ,ÑÐÅ„l¨h‚EXƒ˜YXh‚«ƒBˆHg I´,=€µðó*Ò O ½ÊôèuÜ<ʱÂ[mäªM$Hk¨eA£§AO‘µðqèÐdNrý€À,W74Ѝ4)4&Ú9 –})TiM;#-¾P]¦¢Ö‚ 0þ‚̘!û¡KdÛ(tƒ-«mù–-Ë×›ÛbÚ‚XÐé„Y¾ã¤üˆÄìÛ/\P†@9¤ç9M3|£"V5nXa!Ë+\¨më¡Ì¡H3¿XƒœäPÑò‘€‹`¬†Éêñ«GÙn ÈÊGU‡ Xôð+—X~r%¨³¡ÛVÌvÈbÆŠ_ä¬T¹' ‰’Ôú0_ߌ:Ço? ¬Fì:ÑòðBÍ…×Áö1Ã,õ-#KÌ9±L7¨†´É,°çÍ£(c :ÓDaE¨Þ°Ìfªjà )hÆ ×ß¶ *ô4L ¿°ÀL ½¨ÐËGLðÁ4ÐpÄšÉÐðB ªŽÓC €CSC 5ôP¿ïÈŒ.ô`¿N¼#€.h˜ ^0ðÁ(^´ü/RðàA ¾ø‚ .ðþ€¨€ß¡Ì  (`A.5p#+ÅÔ ^©Ç 7?°ÒMsRM>¬ürF*` ‘$©Ìr ,r17 ä~X9¤ÃŠ|X`AÈG> Y¤*ÈD&< kpáH fÓ€ $ È€ÆX~Ðq¼£߀€"ÐPˆˆÌc “+ñ=@‚·aÈ: ÄìbP»? P n¸I!T€ø" 8@-|¡^`­˜ÀLSY1‚ø1V°¿@†4Q„"tCdEîÁ0"&,a².8Œ@ŒêúEý ð $Xþ«Áh Œà s8WˆD&Ð C ðW @|p£Ȉ Ù ÜäRŒ.`‡€#Ü#ž“ t`Ëdè`sÁ Xà^èb-èw~p6æÃ |U>†a¨ ÒØûE%Z@ Á ’7^a…-ä^ð€À€@ˆÞôÚâ½´øIõPÀ\šmÈ"*ß8TÐ d%AàF3-C,i»éÆV%…D‚ u€7¸‘€"ø€ m°D,f@ tPà}˜ËRê׃HÈ€&0Å„/¼B‚r·`þÀÅà€¶¤%¢¸H Tõîiƒõ(ÝhÕ ]lC-ÃùA7œ`ˆWÔÝhÁ6¾õ:¬(>xÄxð\äB£@Å"ÐÀ…NtÕè.´ñƒŽãX`ñ €!\X‡5\фؔ㨽*–‹êù,Û`,pft¦¼=1œð‚Cf m,` 6²ñnöO2zR¤Â €À… ˜çN-àIÈ’à bhçf2XÑ]Œ`º….xÑ|¼cºø/‚  eƒ†˜Æ< ^(ó¼=F@0ç&XApÂf¶ Bmc ¤þÉ!² Œ% ¢¯@>³ ´h€ðÀ¾0é^ðhVŒ2ËØ¨G†?!…¼`§ƒ& Aì`(X‹¢B È/iŽ*š|C ò Ь.ð@<@˜Ø‚/´@-xƒ€“<<ÀÛž ð1À˜ƒ(@8@@:(Ãp<ƒþ5,pÌA9XC-(¼2`…,@˜ƒ2ÈÌ8 Á,Ì‚HŸ@â,4-À0d Û8àB[ùÂ-h‚5CdBCÈÀ(ÁɃ7Ô>Ô,\â-Ì@Ü@âkÀ€5Ì‚5V7È‹Á÷¨žêylȃ/ì¢= À;=t£ôÌ*¼*Ì#B" x &DÁ"Ì@5bÃ4pÁ4\A@5:ÃZ@ ¾ €Ù[XÔ ÆQC à,°5PÃ2ƒ78¼‚ŒÃ'œ <5¤¨€dAœ‚c”C\4A¬0d þ.$2iÈ‘ ˆ@ UmùÁ(¨ 0Bœ *¸Á"ÄÃ:Ж€×5@XÁ, ÜÁ"4Á*,:¬pƒ+ t‚œ‚4 :Ü,‚XÃ<ŒC¬€:LÀ xS˜@ dC,@ižDÀØÂ8€ (Á8xü<Àz`ÃDÀ[pC5¸Tˆ@, ‚ˆ@¨0…BúÀ<dA9|þÜ(Bàhý݂º‚ÜBB°VÌ(d‚`ˆ@9`Á‚%P˜B°A$p`‚Af&О)´€ºt¯=@0€ËÁB‚ ÁDÁ ¸0d)p&\ƒ"@‚ÜÁ!¬ƒÚ)ƒ/ð@xƒ H <À€@Oœ2‰…ØW€¤÷@À2Ü5ÔÁ+|B Œäš* ¨1PC!Â+¬ÂØomIÁÓ­Á•ÔÀMÖ_ƒ/Dì *ð´Xƒ].#<Ã"´V‡ÂƒPÒçD±¡C„Þð³8@l6X |&B¸Â>g‚ðu,,A$˜ÂÙŠ¯"Ì€ €käÀ€A4Á/þä€ÜO$d€*èÀ̃&x9¤k(à d>Èà #÷t„ð^ Ã0À8ŒƒÄG X·üˆu;'(ÅÎh ¬MQÆÂ±)o,ȯ#ü‚ Ì `ƒ'”á®©Ë Ä-\õœ8 lá"ø0ð³6PÂS  TÀ:˜à!à34õXŸÄ" ø!è!ƒc‚_ò„B*²&BÐB,,‚€Á dDÊÝ^C,<ö Üq$Ì0È ¸A9 ƒš(b9€ÁÀ@BÂÌB&è5ÜÂ-,ÀœÇy¤UÅÙ6îØÛfȹåVOª¨22ƒô þTaû C ,H°Ã=°ƒô@„€Ø $C„€ P»àÂ-TC38@3l6$,A9À¦µÐB €ƒ20€$Xj#A XA$\fÁ"€(_]îB‹cPÁôã!(‚´ÁoÜ?Ö»%´]R0CK‚ÉðÀ ”ÀôµXÁ*¬‚:¤Æ/*<€/ØXµnÁ/‚!”CÄKC6p-AÇ.ÓÆ@(`x3´ÀÐ,m-XA‘EBΪæ8ø&ðã!Œp€…¯ƒ0¬C6\´A4DÃ#!04%B9dƒ€/;"8@º£þ‚ºXö!ÃÏ‘z(C épá/è)pz.„BÜ‚FBS#¬]€:ÈÁ!8XC(”Ã,€Ôõ!¬ì»Gcâ"=C6ÐV@9B‚!;€ÈÁ ÌÂ-`´0T€Á"”*´)À€KÊÃ<ÀÀÌÜì €àúãxGª,oÇN\p Dmƒ >öÔC$Ãu9{odÀˆ¤@oì‚6±±Œ$@ÏÂ: 4¬7À€181ˆË¤@.àB ÔÁX@=äB3XžÄ@©ƒ«[m–Q6‹”°[V¬ÍZrmŒ&Tr¬ÌŠ„þÒ«H‡*YY†æP=†*µYuξ9VµqSÌ+ ÞÐDò¦$Ù‹`éi£HεWh¨ñBsãF¤;àáÈr Œim9Š„À¡+µ¼ý’‚¦œJŸ’¸Ô¤ e2VÊLÃEŠ^ݺáÈÓ0¤Ü¸Y“sM¦C‡ -*ÉÊ äÉ«Å`L¡Lg´i€œCk`àÍ—¶nŒéút(µˆaÆ‚®:G™iã‘]dae^¨Á”5 Á¡ŽBÚ8!„WT0Ä Í D±,|F,4aà o"yÆ©…‡¤@À–`F©$RÆù¦2¤#‰nÆY&•HÀ€‰ìþÀå ØùÄ jhæŽ%žx’3V¡†4¾ÈÄ @ Éä#|ÒÁ‡¬O>°@‰$pa`™HHYæ•”pè5nW.À@CÄ  †EÐcZ8¸e H"YåC®pÃ`ÆÀ ‡P¹HŽhq$&7FD‘;6†k`p ‹B–Ï(ž±9q¤ˆž "“Sà!‰( €! àVdå „™Rø+ýäŠ+>û„jèOz„t9aj@`á^XI„)là 0 iF*¬pä˜u–€YÞ@YøA  ÈçwN^:pbþX)„wX(†Ÿ|òÙ tfÉ…–`i`€…ƒjÀ"ˆ@—sg…¦8hdÙƒx!!…]zÀÀ³U¡ƒ :0Qòa¦(&… ÜF@Fºq¢\~°Efz€ÀHâ•~Y …‚9 @'˜dXá’gž+“@ƒ¹ˆ,T€L 3j°`l€b¹‡î1v(áÔ` îÑ‚^è⿸Á!ØÑƒ`à‚z¸À/ !$'X ž[B5bQŽN8" C²¡‰%,a€ à$€#0ˆÅ|®bÚÀþ.> Œ$Èc8xSti³pàƒƒX€ã0xÆ5H hÂ×@0B1DTÔ@-XÆ#|Ao 8н¢‘0AL‚И ]Àâ u0+pð H¨@Rº0„ZR¡Väï`+ºñ'äC?èF ‹y­¡gh€1œ%0;èÁ¦ÀŠˆ-Qï(F1Þ±”`ü ÇŽY¹tàp=xPê0Äj8 ÜØ@56ÀÒá»ØÁŠÁ‚œ Ê A € NYx²˜f:0¨à!ABÐ]€@™ßÈÇ8œÀŒ)Ð*0Âþ0ÐÞ,HA/&w¼,´µ`ɨáªüB2p.ÎqŽÆ¥,Á Tp,ƒ¬èráfŒƒèitñ´À ±`Eh ÐÀJèA<Ó#èxR(D%XÐ#¨ yïHT/ÞQÁÀ"VâÀBà€c ¡QÂÊ1 MÄ¢ÀÈØY9À$\ã8G0HAhp€4c dBÇüð pÐbà€ÐŽgø`KЄpYpôˆ-Š ŒdQch|Áƒ ²CE{Ò ô ]0#Ô FÓt¡ üà`þ´ H‚¨8¥daÉn”OB:A—HÔH‚ ˜0ƒ;|! ;€æ.: ‹ô@ ‚z‹Ñ Ä—¢²(Æ.މß÷"€‹ˆÄ"Ðorƒ ÈÅ5¶Áé2ワ|‚{Äw¾(+7_ L ø¼°ƒ‹‚¤@ØAåìÛÌWséí¢<€Áy€!x¦ ßZá `À [_ŒÔê (R°< P³îÈç„8.=øTð€Ã`ê=z $Ãg8C/z¡‚ L€68Š ‚-烺q Xá}üÀݨÒ,€þã. AwðPaWh ™E,‹¦%Ü¢ôàÁ¼‘„(¡Ç.È@ F)øa¡p8 p„â~†š@ ”Íâ·8Ï-ZV0˜jñØæ@ .ˆ-€àsÔ#B‚,° '< ÒË3.aV­= ²$Öp¦±È…Ó,Pr#ÃH(+€‚'ÜC¸`š†fð€Ð,ü=bØóEo|-|LõÊâɲÁœ RÈ„Õ( \àkP@@`Å=0Ì üâ3½§ìÝ'* 7€à”æÝ…xa€b Óq2OïÌùþ^{²Û¹HErAT*¸È €9€jèl h(Ä* Q ˜ôI!ù.˜Çð}z|Ÿ¿;¥ ~0 Ed¢²?Ì+ jpZJpFZÐt4 Á ¬ÙÈ HIÊ ¦ ? F> Ë!'$¨5(Â-P!8  hÆÀ±YÜͨ-ÀaÄ` pðá 3\ïi£kP,6 €zÝ€…1Îÿþþ¬†ÀÉ€†/¼ ÃYˆD,‚¡ßTÌÂð©’)s.l ,gì˼.Ç«LɼX  ÖÀ`ãÀªáò¸¡N©lǼN€§ŠáfŽQXÁ AwÇ ` ‡bŽòáÂX̾ 휠( 4!á^ª!È! ¬¶A(@ @ ” d`n ¾àx`$Þ–|©ÄÜ ¡XAwxátaºáÐ ¡ðŒNàvA ¨rà’ä AÊ/!°Á¶!6€ŒŽ¸!¹p¡ïi6 ¯Â "!:þ!bÐfÎ ŒÈ²N¦÷~áxÀÀà>€\à€4`K|÷Dq€ Ͳ`/÷`¬`À¬äá|!±Î@ `ùšiºf Œ>!RΠ„ ¤èÀà ,@ Œä®€”á6 Œn¡ˆ|±Š`  ta @Š ¼Á °A~€nL‡AÇ”ÀЂޡ¦x¡d¬x†¡€²àp c œRF7àdR€åXÞbòˆAz"^ 2áZÀB  ~ €C~þªŽ©. ¾ @òÁ8Ç4 o ü€`¡äà Úà ÐÀjapá ¢„mXa¡NÀ’¡$¨!Kz¡)6 Ú€t ÄqTA h@tÀTÁB`Ož@ Ta¤Æ²²®A+sáj Æ rÁ :D°I”ÁÐa€ 2¡Àfà®á@ǪaÑ\ïˆPÜ€€5dà`2|aTK8àô dMQò2¦²Ð(¯`x*«j,”@ 4à ¨¨Ñu@ @¶aiddð¤¤HáþnÀ¹˜aÛÖ–p€ AÆ€¬a”¡Š9ýÀ5‹àðä!~AX`Âá;Q†`ábr!Jšï¤ï ¤/ŽN˜äi(À˜I$B!Ú` üM| 6%Ë€؇ÀjÁ¤¼Z p¡ Þ‚Àé”!º6€/ƒjàÙÈ¡JtÁFN`x¡¡ü`rŽB!ü 6à@óÊ8QaùZàÇjá Ð@x@ÐWZà’`’€àœÀT¼# rÀ` >àºA á2u`´è |aê‚þAVA à%xà¨á¦Nf@h¦á,âðÈT«!óR XÀ‚¢å „á²Á_ÏàÀ³rÒ& óTU ¡°a šÁ\8Š \Ó:qo:Š(ö€±<‘À¤<*Ë×À¡fÀ’À¾`¼!<€AŠ&JB´!p¡HazÀí´Áá·,ÀêÀ¦¡N¡:¢ @8s "J ŒêÀRa(` `ýpraÜotvJUdÊLþLÕ⊎P¡|¡´a d€–V@žü œbbhApoÊ¡â”ÃÔºç’Áw^ œ ü öÏÌ‚A‚í~ó`xäV "¡’`Ü`'4€; ôêÍ”|à 6q?äABCÊÁáÁŽ~•,À@|Àô d`ùÀ”¡à äÁ:€ ²¡cŸ!2a€ ¦|àXÀÁÄ f  ô –ÑhA:PÆt-Œˆ6„!pÏbLÊÈõhá¬8ªzOÒž²¦ãpÏ:c!þná`JÐ7÷”Áüt¿àÚ•ùlñ¸@g絺–Á¢,J®`€qáA ¨œÆ (¥  àa®€¶àáÆ€ a„á=ÇÀf!®! îÀ¡$„¡LáW­à @&õ5½ƒ$â Æ@|` ¡háš €€¡ ¸<¡ ¦Á¢ c­„a– * F! *@€* €a ÀAŒE¶‰ÑÁÖ!l#LÓ°€*²@5 r€B@ öDv P³t—´\á`bÀxý nA |Áb ã~þž`4À4aÆa8 ¬!’8ü€ ¸`i‰€(¢`…!J „ÁÀaž ŠàÜ`<ª¡Š` b”]ANaÊAÐáD@|D²Á«OÌZf!—MÁ¢  ¢€híª[ÉUö\Óhò4aPa¬x”3cŠqº· æ1òjíW`ü€NU–¨r°ܵ@¦MA&Ä ´AkêÁ{˜áú(Ç îBê`t!Fá a~á ¶ÀFá,áÆ1€} xС A Ê×Á,ÁŽá@ a Áá ,ábR¯¡_„ÁÐ ¾`šÀ$ÚÀ`ÙÀˆ L‚ñLÁ°  ® °z(š@Ú ba\ ÊA<² ð¼ V¬c ža 4@ˆAþþ¨  =r¼ËÛÀÐ@ ÖAÀ³! †Bì¡´¡Á ä¡.Àà¾AÐ “WA”+è<ÎõÀW‘`Ö ¼D ä† Öá fÆa „ÚôÀhÓp@Ú` ÆÚ€ÊÁÚ7 ®ÛÀ  °à¤ |ào ¤Ý[L¡BÛ`àAB¡*Ëü` nàô€Р¦A<8V¼?¢ñÆ€2=fA* Ïá:+—ÀÞ› !îèxC6q ªaÔådÀätD-T€( !€–AFV~Àš„H¡Tþ^ἡVä€?¡Ô[¾@ Va fáêàž¡·¯!8BÐ# € Lá-ba2A(jæ@¢ îÀ"A„XÜ b!,÷†àô@| 'Ê¡ "á üËÆ áø+Ä š æAˆ€‰EÔ  „Á¿Ê¡bÂ"ÏEq:€HàÀÀ ¦Á)ŒÁ ¤€ü²8 p š 0Öž¡ÊüΨÔ$ ÐÀª!Рª£RýîT,À8­¡:àì - !¸«õà|À "á @´AÌá`T Ì,AþÚ Ô¾ D@Ð@y'Hø¬PÁv-¡ Ä% šB\"Ö T­|U5+7|T;†œ;è` Y R”–h…: -¨fݹãÀ›1ÖV¢eÍšG¦ÀÝÈdj–¢ÀfùYäÛ%«ÚðÅc¶A€B 3Èt99sƒÔ«Š^Õq’bª¢Tcê¤Àñ©P¤OJT|ZF…Š*l¨HÖöÌ-n×45\”Ø4ô;¤(—(Cb@9…ÍQ¤L‹Ê9²ähI¤HÏ4ñä&“=¡f]›æ¸rm4!9”ɰ6‹ô¸– Ò2#™Ú<ùÖÆ•þoFÚ=7á š3ãôd’Ö°Bh€„@c@:{åFŽžH©~@j“ÊÛ7Ü…<ÈñëA$0ŠŒÈÛ£‚¡HY¬Í ºh„¥@cÅ8h†Œ¤ ñ ,,5‹)‡ãÀ!nÄbYFmèAJ$‡¸È!ãÍ<‰"`ürÎÖÄÐÆ\F,‹ …+\衈%mâ@B~LsH! “[ŒõÅØ †ÄR 8p Ú" ¡‡´,Æ~¢Ç5àĉ"dâH pÄ)‡Üa…"‡†!!±]$±\ƒ™zÌ€ 83ø’CÞø²Ì! $¡ÁPÔþÛPƒ.ü @g¤BŠm’ÂB7)|òI*8Há•!Ÿ¼²Æ2ìÀ¥ÂÔôÂN ÔäÂÉÓMÕäÒ9¡,ÃzàÐL,Í4£G±ÌÃ1uÅÉ"£”3Ʋ™6DI$u4)òàòË‘ áõá !0Ž ‘ch ‘ÊþB€¯81NItƒÏ7 !x Ó†%_rÈŸ´*°b]ËDbJ9¨pð‹h´ð‹- ˆÀ7À‘ð±ÜRŽ&Ý"áCu€-rp†g8aÁ!©ð ‘ ¾¤H¸,ƒ†Ó  ‘*Õ¿@Rþ.€øÜL ÞÈ@nDò„ ÁÔƒ«Üц"M8â†53¬ƒ‚c £rË,3ÌÉ>p€)>´}ÃzÐCå Ñ:M,Ì"‡Ì )wÌC™ÀðòŽl;Ð# ´€ƒÊ™òk&ÈQŽ!z°Š%ÕÀšQ$€„0Ïh@øÒÂ# h0@ .MÕ¡.°à” Ë0óRº@  ?8‘= PÀ õÌ@Ë,²ìD2²œpB2'ðÂþõ5Ô €QÝlƒ‹ØÔ°M5l yÈàÔÀ° E0à dð„Ð#½h3 @Pã8Á¨1þøÀu0,p`?`ƒ+5€E΀ ~ù‚¿€… ô!X¤@Ý` P 0XbCÀÂ*V±… `„–!‹t²(ÄL‘‰Pl#©€@¤ðRàB2(À(Ð …Œ#ÊðÊ "ц®l ¨ñCÓÆà1)°àRh(DX`D f°"VF{…q%„` ‘¸Üð„Jp ŠÈÌ€€€þ@"À> [´à 9øA ZµŒŸéâ ^©ƒÎðŠQ‚8̨Ã'p`¤àÔ°À^€|b4 Át ,ƒ½‚,2Àð€µÁ/>ðÊjÀgXÆ2Ø‚Z<Ð))Há¯G‚{? €6˜¡€e úAÆ0r¢–XÅ3~Ù Z8àQÈ¢€ƒ…¬BWÀÆ€ Zhb óÒÞfŠßB‹x88€ƒl* …) ±R b$àÇ~À‰BÔ³9øÄ@€ƒµ@7Z«¼£¤Ø3´§ £µ°X¨ÌñIýþ€Ãx‡ùÞ€|0™!•2+ÞwÀ/ÐãÇXaÐ#ý Ø3ÎVD€²l1  å Ö ?€À ^„4¤.`rzçw°¹øA>‚Pn #È4Sr¡ ô ;•0p 7{h@;üàLaÅ(/` ”#ÔàG˜ñ»$à¾X.|QˆQÀý´À;ò±ƒoÐ#¬?¾!A@ÉÛÆÌ‹0#,03~AÖÁÉp†3|Ë–„@ :PB F¡‚¢jà2@” @øâµpB2"`> NþÑ'P*TЃ àgH8 R T^œ#=Æ84¦Ã¿´H3À1 -Å"À( €Ñ§“ 8j‚0²¹±Y ár†n¡ a !3à€Þ`0 MøÁ¹*ü9TBŒˆ1”ã~þ“¥GÁqM)€j(è@NA¶‘A^” 2Áì¯r#ȳóán\¯°ì£*/zpYx`;©,F€)‚­*„ x~Pƒ}Å€–™ñWãØù3ŠÑ|460€,Šq~D^(Fßntcí«/ò!é\0ƒÎð‹:|ÃþÀ… j1<}Ûg¢­ÖsÆu#²àÅ p)PcØ xE$TPjÀÞ0À;@X=ÓïÅ`E«óÑƒÞÆž.ª§‹ìÕá»èA2Žpv'ÃÉ Ap‰›]Í0"µ€„ ð< ìpÔ° ‡p½Ð{w;@°Å 0yhôÐj°²Ð¬PÚ$ š Ò4 ÷áÀ@ >€ HÀO¢ 0Àp 3Í Yà5ÈKÀ‚Íð H0 à` 0€×p r×Às¨€À «ð e£2 °"b ¶pþÛÀ ?àÈ@)¸ð ¤@ )0)¬€ ¤€)7ð ÅuÀ € ¬€vßà ²çVÜÅÀpØw&x@À   È =ð mp6`¯p0p»ðy°× *ã ÈP PN{õ@pU F ’wV $`z„{eÇ Ü ˆ¹ gg -p P € ^p@;!Þ0¾0 ` ïP;ÀÓ€ä R¤ sO@ ¾à F<½h{Ç@0#@@zÚCW¡?ð~F_÷-ð=ðÞà :þ:ðJp%@ àÞÀYV Ò×  Op90âày »0‰= ˜h#Ðj柧ÞEΆ °7:8 Õ ° K0 @g Ï€ Ï Í` ràÐ8ÐKù ™âV ƒ¨ ƒ÷a :—80Õa~ ,‹ _3`&³ 8U gpðŠ"Ð æ`g…pX?V *ÈpQ kÐD…ÀÖ ÜÀ ʈŒk×Ðn÷°†t‰¬° ;p=€Š—8XŸ²0˜W§ØͶ­V Èxvùèh÷y˜·hRþÔ'EHÅÀ °wŒ!… ) A`‡éà P ¶€ ÁÆ JÞÀ¿pXK  Œl¥ Ó€ ë  È¬ #«ŒD P¶€’º‰yÀ ~û ~;>º@46õ©~65) ÊÀ· ØÀÕ  Ø@5@ p(Õ… Þ@ O@œ5Þ€  -pPÔj¨X ¬ ²Ðx¢ûÙj$à}ºÙ'¡`šP ~Y/ŠÀHà6È/_2“±šp_|&k06‹`¦Æ´p ó‚+—Ž0,‰£³ ½V þR`p2Ð;ÚÛvKñpÔÃR1Ä àË€,ÅP,Eº <°°œ—Ùk‡Œà˜‚ôgkÀyì³ åà wR@p6 $0LÅ ÈŒØ,àvÝPùðÝPz‘—ø‘‡y7i~¯j‚,~ùPA@›‡>̰€Ð¹0) °¤Ðà5Jðø]2 _ zP~Ä¢;Eð+ ‡ ¨ - X£kðà ½†< ìЩx¶ï°íê®îš¢‡9Vv“â†Û0¹à$H †ÐVÖnH` ¸pcðOð¯`¸þ]ppL*E Å ‘JeP>'`k'Ú®Ö›ºÙ®¼  ¤€§zpL-Ã4K8 0° c E Í`^B Õà¯Í¤waà°M0¨ mpJ2KY ¨p ˆsašÀµ ðËPkÚ;eP>” Ÿp“"d   ©PÔ ðU?pvïW=ÛÐ×Pf’‡¸ ‡ÈU msxã3õg€Ú##w¬p#@ ºp€ÊQ;@«¬¶Qµ›¬À à»ðඦ¹üàlðV„¥ ´W¯Ç†m‡ Ü"w&€Á,° þ«#bwà³`©° ²Z[àÓPÈÀ®ãà … _ðÁ0]¾à7Pð; Ъ“‡lá»˜É ç²UÈ ‚ ,ÀÀ Š å䦠0PÖ –/Hp òÞ * cð €Pk`O€º¸¬°hïpÐà>'ðUÐR;¾¼Ðš‚´¹Èæ|EÀMQ°…°7 V i™k Š "a Ñ$/Hs2ë `´`pÕÀ' 0:!sY€§X“šÕÐ$ ƒÀ‡â “Õ  µ  SÒg¶Ÿ  Úcmh[þŸ°€hmoë(¹° 0‚Ú¹°Ș °À 5  yI{¬ð ÁP^W<)ÊÃÓ(µP Ù™°Æà º†S€R;À !@_Á8©¬Gavg‡^“òcÊM‘Ná‘®d‡à@%òà ¼0ÀŠ1;ˆÖ! ¬Pt‚ v¼»À jÒð µ@µ ‘ ÝðÈ  ePØ£×ŒÍ PP8“4“bQQ° m 7 #V@§_ q¤0 ´ µÀв(ú6¯ © 0<ÀÏIFÆ` ýÆ ˜×<Êd‡þ=޲ E€ºÒ"äÕ0:è°ÂrbMa³àÖP  RÈÕ€GààÍO5˜Mà •UØ„H°FèàÀ”€ÓR¨ ÓU Þ°ÌiTÅ\w=uZÔÓ ¤ å>Ý–SW¿Ðˆ[|×Ì5P @l<; Pä€Óä@ pvÛ à;f“ ¸€ A ò@   0.òÊ O¼Þª› ÐÀ(Õ>–G=lÝU×¼‚*¨‰½·ú0®? åØ, ûÂÔ QС`O0h‘ÊV2à K [ Õ z0 Õ™ü k°!Àv þÀ¼€¸°A` = èkÍÙ|Íu ?ô áCëKnöÔR [PüQEàÃñHuÀ¿×ÓJ T{9€PÆZ ÊJ¾°Ó2 ×ê}×r½ÆP € ]vÍEÀH  ¡±°¨  Xa@ Às  +´³ð ~tV càN’ÂUˆÓ:Xb¨0´ >—z  |’ÓBkI°¾p@ ÚxlzQÌ }¬@vgð 7àuÌÀP?ð WІ¸0*)°¾”Bš€^:h’M9 äP0àš@Ð0Ó³0Çþ°ÀÖL0æ3ÀH€×P~À3   Àʼ£ °¾°X58-´5p VÚ'5p ÊÀ ”(0.> ð w Ø0p+Í&Þ …A N$X '  ô±5@1»àk I@ øb¾@<Ð+~ Ò ¡PÏ  àP¾ìE` ,€YÛàBèõ§N° ÚË0 hСð¸€ß!¿#ë°èð ð ÀÀâ0 kîL` d>ÓcåX¿ŽÓö LÉÆ)¼„€¤Ós%] ‡N¡ þ³ÕïÕ€5˜`zC z  LœÄaa ŠpÀ !•C 5PAaµ0.ãzið Ò„4‡¥.s¨PÓ÷ðäïH 90ñ°°JÀ¶@hÀ¾A‘` Ö Jp‰¦È±X¼± „¾ ²›‘  ,ЮßPŠð F ‘_ЋLT‘`s? T0¥ÓþÀá%FûàP¬°m`DóU)@{ Òp=h0+0ü÷û-€Ûå ¶-‘<0]óIÈ0HCà 5r ®0b>Ç0¨ û%6 äéá=G Ó $!Ó´ 7±€rÖ€ 0°M? 0ÃÀ@ÃH3h%@… Æ!H´fÌðcÖ¬…³Pq°6#T9?K á(7ãF3pà ‚ã° ‰€ÈÐ0à@€€l³\¹¸å‹õ)5XŒSP)Õ·J™~è£@3¨‚gƺ£çΡ,kô«öŒaµ:‡ !щ”)C¡ÆZ¢ ••&_ôDA… ”!þ«ð8Šâˆ Gwe[çˆÒ!JÒ²9ª’e ’!–8ò$*›µNQäP:e‰”Q|±Ò¬ÉBmbi²¶HN&QŽÝjß»(•¡QTîXmNXÉâeáV¤%å80 ÀKƒ”-õ—É ¾D² ]6`7L%(¡Èùé5Õs¨¬ÛÈùÙÀ&XÊhè(Qè‡ > ¡…d #ƒQ>P‚ x€”1g”&¤8£ 4ñ¤ WD€ W†àbˆl²éD.²‰Ì•]éd¼Žqe$ ƒaši¸@el:Z‡ÇYÖA%$Ðyæ™uÊ)‰š¯fþhHp`k`üÀ‡&€¬™Æ$*@ÂpbÉ$‹YÊ+o¼A‰|)À%˜€ ˆn àF'dàfR`¡…› ðCŠ5nÁŠHÎXÃjØ'—–X% Á¬ÑÃ’XY (¬â˜ÖÐ7àBU7ÐÒ6ä°¤"AŠuôhà (ª@£ < @£œl,q$³LA#a¡FjÛ`£ !<9V5„!– 4np 7A#0,É’L°8K:¢“k¦yìO<ÙâH®@uœyˆøåMôˆ‹¸g‰yÀi• B™ÁVT£qLËB7þRy¥‡dyç‡Æ™…2|€¤%¯á¢ÈlÐ ÅšräІˆ†ýå z’`À0‰DhkÖÉ$†r,‘ÃT2C#“+bQ¤LÓ#ní$JªX$iA# tNqŠr¬2Å“Eô ¬ŠSDÈÅL,¡Ö’(²P#’¯«ˆÙQ«Ã.¬É†ÉĪ,"qdå1†ÖÃfø]ÅküX,“HÒâÀ‚(x‚Râ!‰Z|ñÏ˜š ‚‚?¹‘½+™!Qd´yBWä©CŽeäX—n`éfS¹á`b)äŠ;2ÙbTf¨?î°ÄCÚ0GÚðCŽsÁAC þ%–±Â‡T‰H"Y›<YdˆC\ñ¡ J‰¢œøqmðA':Qd‘PDýDáàA \ˆ«â†-hã¨X$ÒÕ‰X¨Á ¢V,JK  ‡á! Ñ„¹"ÀО(î@ ?¬CXpDóÚ€04DÁVØ‚"Á…(€ŠCĦˆe¸@ßHAX‹ªd!Pš08=tpa0KXÄü‰¬!&ø˜ð"@m jD C‘CI*—(:¡<ºáh%"Ñ KX"wˆ„öÜp.ˆ@"ˆUJ‘…*”nèš"S´þ`C)J1½ÅK XG²àKx"¸8@‹,(¨(ÇØÆ T<ãèÐÃäNá†SÄ`‹°Ä*šŒY@  `3XP: œ.u«{IL‘äc9‘9ꀃ\*Q5ÀQlŒÓ ¯‚¶Ñ:¬á KPÄ8†3„b«hÓŠðŒYDb ~ðUÊ0Ô`eE¨F$Z@l!*@´†LäZnÈÂÐð‹hX‘à ~uE| ar8LÁÂ;¬¡ ŠE5ЊX@‡ø¨!š4Ê ` Ü ²‰"¯•0¶`‰3€ &þ°¬_‚ šƒ0¢pˆc£ ÚØ0ކ/Œâ>8® ‡ÜA Ù0…€‘qª ¨€Ä!.ÑKa ’á2„ ƒW”# 1hF¨qƒCÀD8@0¾Ð†&ø@‘IV¡ˆ;Äà™…&Ú`‰CwÀB' ©©Hà sÅâÐI$Ä _SƒÊ1„Xd ¦†):J”c‘—hƒ#N…*¸a>8ä)Ú€a¬ƒ 1¨À@qpZ© Tø@;æqM€”2²0 )¼B &¨ˆ`‚/4ÁWu„ š b+¬‚äòÆnWðˆë‚NèAþRñ =….V|RâÄúD†–‰e8V Æ+ÚÃg(cmX© ÜP4§‚H” lP\@sÃ/p'@"–‚ q†Pƒk°=Àp(„B‹è)7>¡ tp£sÂF QE"[Ã*|€ƒ-DbEˆÄTpˆ5¬¢ë 8 Üð ÷[B h$Báƒ:(£ÀÀAÀ0 h0H«BˆKpƒG˜š+@kІ®:†/°† øE ݪlhƒ1(4a¨7k‚XE­Lpk+8¸»ƒ6p»È  ‚6†g˜þMàHˆkPÊp+kø*€„$xo`…‚ ¸€]‚—Û¦£¹]Øá`¨ ‡m€rh@†= ‡ € 0†npX€n`˜±'І ¨ƒq €' 3X؇ ØX`€ ðCyØ“:x€?T€} €:¨¨€'²`‚c8‘?ÀùÀq‡_@"8†ˆÀh"ðƒ €VÀº_HjЀøs‡8ƒú¸†:(X¸Xü'(€ƒ…\?¸…\¨f\PRàV€„HY Y`f :RBI…P3¨„Jx…FþQ@8fYh~€SȆPÐ9 ?H§ãXˆ‚PXKÐsÙRP„+0„B˜CЃCÀ\8„TH#+ø Ý„J€„Bx‚qЄUÈ„Ár€g¸…XÄÂ*„g¨ç¨„G¸o3x„O°‚GXƒBx+ø…/ø&˜‡ÈY…G(¢_ &û‚ER.BË3ëp4˜yðžÌ„Gp¦& ·Ëð‚”‚OÃ+y‚'80 ¾J˜Ž 8*ƒ' †dà…'Ü…(V˜Â˜Ë“pB,dVø؆"0Z‡ ØØe‡þP"x?ˆ `@‚u˜†¢‰›$x†!˜…l@á²ppp(šcØ—Y‡c@ aj‰…i!(¬9%(!ÀÍXèjiøMa(…á$˜…j¨©k@pkh†g𘉂©Ê†i¨L`¨¨ƒ €Zè¶?¡…¨r €VèÈ€0Y )Ë b ¹Hú” †OP5x…WPàH@xz(„OYè'q„ †1yX6X€& Rh)Іð…Q¸y˜ Є˜ý‹ 7Ðþ„%€Th‚ FM(#ŠP†È\ ø€Zào8© &pÄU8gb‚'¨€G°„-8ƒQ¸ˆ†Lx‚1h†Q8ƒ_ø† DOK¸ƒ/y8&ÈQÈ3ðoð‚1s`o…sh‚sp»Qð™8ù€eð€ H  è€÷,U0˜ã¦xƒ7hFh>þ`k¾ælþƒ0æ=ç=ØBæ?8ßr¶ƒ7ØFhæA`ùƒmÞinPøMÙÜç6v`žW\ÍMÜœÍÛ,…*¨‚®ñPx×Ü,hahÍÆ‘X(‡umÖbý·KØ¡9˜Q˜ƒ[ÖcýMSšaH¤Eè„S »¬™ƒ¸)‡€£l(áD ¼Pä)æ‚ÄÍJ¤ÄzecÈ=WfWSZÖSØh.ŒÎhçÝÖ]n…õçA8`ÿ5äa•MSÚghS „ªÖã[e`Ù¨oP‚Poð€‰Læ…]ˆÂÀ.SP¸ç?蚃>hPèèþV5 ƒþ2 d~> I >fÞÄÖIƒ0à>؃0 BHƒ2ȃ<èÎ΃òEfóm-0ƒùýçýÄÎåjFìq¶lÄ®f˾lÈNfN°ƒ0àI°ì=hìe¶æaæV؃80nr&çV°âö^ç~Þù_ù½ågŽ;àÞ8`„g&„8„x~Þf®l>pf|†n;(gb¦õækzVïk…èÆhçõ„K85˜7<È5 Žîè*`D E`5¸„aå?j—>j[Ö‘VêÓößx`ç_øÖ‚xf„önlžæApßôe„óÎå§æÞgßößon„@Ðþp[Næj&ƦÞê„@Èã0‰³^oè&@5€˜Â…*€î[¦îõÍ^øàÎM-X_:è8@ìÊžmIèí7LØIàNÀ„>ðì6@4G„spÎD0mP¸nl`÷Ußy¾åWæÄNlá¶\&ƒ.Ðí0§íß~ïænÞr2ˆí%¿er~mkþånŽíß¾ìtÛþíqÆ„0q÷Mƒ]>ß78_e†néž„ÏåçžßVpï8 „nUïVÀ<€ïA¨D°6Àƒ*vS…A˜ƒæÅkçõ7QHv¼ßivò\Öõó…_èþÕæ8xg„@s-àFwNØÇfÖë[>îó çuOõàîæÆN„D„-·l'YžjX‚'À¨ X€Kns‚ðL}nÖîæFà„Føåÿƒ@ àFpço?ßÉN;èmȾlFßNxƒ0èG„2`ƒ2`s;Hl1OìÞoާ„…N×£nc„¤>êžÿ×IÐ-ˆ5(ƒ2À:Àƒ\Wz:Ø> ôu†øÚ¾ìwwôÙ~ú?¨mq¶ôj^ôv®æ.Èôq¶æ×Žù7çíqo:`:s6¨lóçãÎebžûj7îð_aŽƒV g&„þM°n;ˆf;pÏVƒFÀƒ<À'ß\ÆîÀ§nïÝægaÆlæÆì=¸÷ÙftNps2°æ.}IЂ0HL„mFæ_žVpÿƒØ~Q߃. ì/ý.wl²u¬7îIXRX†'`x€x‰(PØ0•X˜è®íDy§Wævf1§qN - æî§: „{/gÒ&9·–¦s¡úìŸìqƒqžv<°ÕܤWiGpQHV¢¥ux€è”Mˆ!sLáÁÑKˆØPRƒ¨ ›MqþlbÔè Ÿ=÷`’ôæ &Lù äó§£G>#E¾ùÑ$22þɼÙÇÓ2.÷lbigOÎ=v6åQƒ§JœK”(b„s$ËŸu¾‘ôgëJnš1ÎPŒMâºçâÖ“€îùÓhn£•)A•TdLY%Á$#˜ ÑŽ?ùhÉÃ&O I<}m» °¤.’\v„—¦0a²º,j‡ÑÖA& 2ãh µ<4øb°`¡#G Š—æJíbydL(÷prœ’§.›´ÈåDfD:mꤎQ•d¤k!Óè»ô·aŽ«ŒÓ*á%Q¥:a{0À›Š3Ë>½Â¥„Ç‚<ØÕ²25ÜrK 5$ ‰…ÈaÅ >Ä %ePbÑþQlqõF#"Ôi\ÕµÕ&­Äq‘z›üÑJ+[©XâŒ0bÇ&ÆÁŠ56² %xx²óŒÒX†”4œp]0—“J2Ù”6hCi›„ÕÑ[‘Õˆ†¹D—Dq„• ‚$RR"’°Ù&‰bÙ`6¥$X\6e…HˆpBS ¶N(ÁÙe9yVS+vLbÆ$“ÔUE+ƒ”2G)BLóÀ°@-Þ<°ÀÀ - ÜB :B¨Ú‰´ùF}…‡H¹ÒÔ\ /"Þ$­”Q†+nBHhÄÅI°ÎþÈ[ßM7¦N|„±iµÂT+š–þÌ~ÞÈЃ ˨‚,'ìÄÈòÃ̰@ Éô°Ì!™¨`@2³”Š‘tÌQp Ô¥^´Â判VʦBPL±Ä !qAK,™A‰¥ˆp±(BHSJ+YTQE ÓøŠ l C,â†tðLG?ÿLˆv¤AGi’ôQbq9ôŸŇ„è4ô&vœgT]XÙ5U¶^vmœž•„‰„¤&uöThÃ(;hZ9"b"umG„ðœÆe41ê™GvôQ†Z0‚˜J‰ TŠ4± Ó Ê< ¯•Zê©©¢s 7”SJ ­’$þFep±“SÁh¨Mr=ņt´ÑÆ“SF päjH£4ui0â¢F—ÂÅ¥ãŠ5·Ñ uü0Ž,È" 3Þ¼€.Þ°£ˆŠà€ .ÊpÁ…)‘ÜA‰0Òt"s`!Ê%Z Åq*j(&¡3”BÙÈÆ1†0$XÃD0\k@a1ÈÆ5Q,aÙ°Æ:†Š(DuØÀ-`Q A¸È2n±CD mˆØ †6(‚ ½Sƒ"z— ª  ‘Š6ш8”áj{ DG΃-©%b$‚È•è$’D´dj}PšÐ6Q4>ä!(a°IþÞ†1†a‹…úƒâ ­m=ñ—ÄzÊÀ¸ò¼!Yt`CS”‘x„9šŸâ0Dà¡蘃(б$L#äh@”¡ŒSjH°€sœCU(F1`q‰V¼aMU! ­ê$ˆµek$[ÑЇP²•%.$mðS\‚’5ícT›²ò ?•!vX–¡ž$I‚“¨ÂÉPÆ…N<ÃKøD%òQYt@?ðF°_, Š€„ä1 XæP„"nÀMÐ"0àÀ3f€„of¬§Xè)DáP=^ŽˆÏÀÈà OhA0jq, T¶H‚xþð‰3Há R¨Ï2Π‚sáb¬`~Á‚müÀ º`*qC" …°ÄôŠ1da ÍP±Š§~¡ Xˆ¨'H„‡…½EhØAdN(Ã5[ â/3I“µ¶Ä¥†•H*Ê CÒ€† ´…Á"qÀÃ&±ž=‡ YÀ‚.qÕŸåiHóJ^¬”’>ŒQhi¨c˲°.„ÖÆ (àØÇp€<€µPB€4€ù(F¨á8>´É$¡™“c8BÇ—ÀÑÈJ¸¤’Fhi¡YÎ ·}£3¡É¥Ô0 q˜¶¢IÄAe—Â)Ê1þ„u$ uXÃ'z0ŒŒÀ3À|A€B¬¡Rˆ8æa t\ ™¸ hÐŽÁ:  ®£„\ð¬Á€ˆò V¸? q†'„Tß(€ ’poâ«hF-0“*‚̨ ÔùƒP  ~A f4 KƒŒ \¸Eî` Qá£F(é ‹°d!ØjVZ”D0A†¸esÈÄbÙjâ¸,†áþ ”Ê¢õ5B5€°ªÅ0À ~c¶¾¢JYTÒÏà€®°[ç™Q+Ô€4Ða] ­Äà™\a" lØN0aýadÐAJ+–؈@ÀˆwE,æ‹Ì¢¿¨ƒ,Pڃ사ˆÀ” EâÍ@AÁ =Br@ P pÀf6ã€<äé}x2àWÆ/’ðOÈ!?*xÄ Œ×°…/à/Pa`¸Â á9œã€3 ÀŒmŒÃÌÐ….´ÑrâÕƒ0X£äPÄ"ÔÀ"xƒ9 B†€…–)Î Äb(xŠLþaás0C aõIhS:wòIGn·0Ž,ÃäN‚B)²i\¢ëQÞÀ‰¸ ¯D%&18-`).“ÈJ3³E>l1[Ró„:Á`œP³à@º!cÀ˜Î\¼áe<žm@ :Ѓ$ ­€­/ãæ`-mñLXâ E””$u{ïØð‡0´:WhCÚm‚¶š‘hyÀƒ´p K™A (šÖ[ñD8cA€Á |á‚_¼T êbÅ "ÀŽÈ `èk'¤1„iÌb™XÄ °mï÷¿ŸïàýùñŽwð‚73Âgùq5$ HA&¬7þˆ’ ÔÂØ‚h€ €(A ÀW%<)ŒB|Ã8ÐKÔƒ0à@ PÃ7ü àÂ-TC‚Ð\Ä€Í< À‚, Áè€*è€ ˜À|“(€‚'ôF)¨#HHƒ¡L6$¡BÍAÕ1ómKZ¤ÅŒ KÅ"lq•AÙ-ÖÙ=Í…œÈÕ¨M¶HÛ€Âð ÍG˜ØAÃØAeØ’¨MgÀÁP¬`Á1¬C "4ÁA788AHÞPžåYA- ÀiA@ƒ ô€2ˆ!,‰e`ËhpÂø †Güx¼…K° pD#L˜A"ÀÂÁþñð[!w”™!‚¤(\ÂðL+TáVTa+ØY)èÌÁ.ä>´@¼” ÈÂ@¹ŒBd‚%xBÆ8A!,BÌ‚€‰#8ØÌè_ìÀ»°R:A;Á.€<€€/ €/¼Â!TBm,€7,@h”€/À7 @ýeg°@1ðÂ; ? Ä+°VäÃ;ðdŽ 5¼ÈA0Tlôƒ-$Ø. @øB<@ À7À‚üÂB%h C%Œ.(D¢C.Œ$ÄÀ3p@q@$ôŽS‘,ƒŒÁ`Áx‚"ôb)ŒÅÌÁÓ•¡Æ°È•óT¦E'ŒÌPZЦ ÁEàÁQ!D  P 4!tÑ0(pAÎÆZ±±à°ÁyÄb,ºbIÜÊÕl‚ÄB(dþB(0Ü[`–¼¼€tVm€(%h^\À.œ@2@À:ÌA+p­ÛBP‚(`ã(ÕEOÓ•Â djïL͉AС Ôa”AÎâd‚RB'‚ò™u@ oÕEÃìÁ°8S³Âú‰@ü€´Ô<0ÀAM§DT¨A$D‚ÌB5D'-Ð[Ì (,ŒC8Á6¼@7„à‚è÷äø‚/xÃÈ€/<ÀDÂ+ð@0€hÉ@$§-ŒÃlo-´@è'lxŒ 8 @Âè| ¤À/@ À'YA&@¬þ$€€\"@úõW”#8B¯‰'ôDŽ)j8ß5™ÈÖEÓ¼˜0¤ÁØýÁÇÎÔ]²€¢(þAD%Ä ‚heÙ[Ü%ÛA*ÚLðŒá„Á¥+ÂA1™Ñ&$m,€ÁÄ€5`RÌ@.tC(2 €1dššÖ5<€ |ZÚÒ€1À@6¼묉qØ-H˜'ÏxÄg´Xyf­4.ìï9m©Í­‘jŠ‚” CtXT—z0‚GOØ™M‚«ˆS|‹{ˆ€ƒÍC4s¸ìš‚\‚¬€Ã ÐÂ5àÀTC3Xþ- ½-Á ÌIfç@Ý‚ Â €ƒ\ƒ5X@ŒÊ´À*Ì.`Zå À(¸À7Xž œƒŒõ&|ƒtØŒ AtƒÊ©€Ô+ü7l7äB$4„Œ$@BJÒ%Ĭƒ$­ƒ0tB€(ÌA “L°1Qó8Ñ\‚‡ô£„E e-æ¬ —Hð]ÔxD  ÐA­ÑAÜVéñc)Bué[î¥ATHS‹t,âP\t'÷ê:Ã5hBœA(@ 8ž>ü@: Ê,@å1€Û§9 ,-Hƒ(¨H$רÇHþ lÁD¤Aaì êıIH*"0ï‰A¼¢iJBÔ"ÏXÂ5Š@ £Èì ArOŒÄ‡”H#T¡¸ž¥´ÂÇÁÞ)dC,ì— Á€“&p€#4 ¸4Ã,$-L–& l90<A*HœA4"..d|€dà‚/(A €}zÃ8¤À78SY28A0˜ƒܯP,p0Z$ŒÁ,,$H!lœB6¨2:<ÃT‰´Ì\ù‘z<ÊŸbBsäA4×­µàþµq¶LôHl‚E YÄb_”5'0ÅÓÍ·TÕÀAëxÕ숸A¸)dƒ+ L ,À‚¾"3œV`«ngÔ`¡ãc±‰Q9gŒÅ Æ6ÀÚP FH` ë´.›9Ô(£©6€j£.0I“™b*J0$D ACŒD$ Ã<ÔÐ §µ´¢d‘1š1ÅMC8Ië’SÚ`#®=ÂÀ„Ã=þÈD 0 ±¡†p ,6[¥™1TØÆ‰mâ3Fƒ†X"o4 €LpEJ©KIöé*ÎPA–W)M”8&1à žö¨é=æ¬I>ìÈ2ʰ#42LƒÅ>š¢ƒ!„À O† 66‰#ŽI)Qƒ<èØd=É*«Iÿ ƒÔ·þº¤ ¹þˆãK´ˆ K ‰$…X†HôH kª‘£ +à ‹6ñãŽCšY# t4‰š … `Êi£'>@ _ÚXE†q>Qäod8 E®a% 8`€o¾ùâŠU i#P$’e BÆ'(P€…[`É…7ñÄpž!‡œnpC&šicmH¹¡eèA#2° @H¡ P@\€‰e‰5"ñ, `ÐA'7€B„)Dé"&OŽ Åè‚B 3LĦMðð°¦;ϪÂjR±¤M¼B>©¢žÉØc“0ø¸‰:ÜH6ŠiŠþlbY 9¬¥cj°dtÙg€X€_¼©E@À(º,E‹Rb„·6¡d)dùä•QˆÀâ’»¼4ãJÜ4£;Ñ 2ØÈ$“LK¡ƒÓh£ŒMi²Éf‰LDˆ£?Ôj©•§"UƒJ«h¥ÒMþµ›`j‹¬FVm¥ EH,E~IAyj@c‘[Èá @Ö˜¡ˆÆ8yäpÃHºQFfy´aÀÝÇÚpc¤ãI0pÑ o\!rHÁ8dð…C 9@°€o´ =RHG%‘ ]¢NÀ2˜¡ ü ÛP@Ê 9þÜáL¸Å7°+¸Ax„R‘0ã-X†"¨ÀР •p3X'Á5ð&Ü€1 Ž:„À†6àNuvàÃf"!I".&ºp¡D\Ža ÕS~b;˜—à0Æà 60" a¨ô¨…V”C(ƒP [ìД* ±θ ÒÕ < «ƒ& €m@À /è†Eð€Z(AIHÜâŽáŠkLc8Û¥Š-Ø@èA%N€‹  b¨@¢àSd¡2„áWfFM7€á‘°„'‘‰ð|!Hç3ò“€mÀ—˜DHò¬TþÊ'l CQ)èÅ.a•ö(Å*P²YøÅ#=¸Áè‡*‰Ô ØР4CŠÀ QH¼‚ɤ`€ƒ¸H…Öà„°à¸@C œð‹Bdb7DFð¦à pB2° 0¼âN(Ä!¨Á} €tñd¨l!ÝÀ0 0`À 2  °øÆ6êáX\¸ø…!"±†:pãÜÈ‚° sDâ)`!. Ñ:áhŠìЈµØé !I„…0!Iˆ7ºP†È6=5Ðá³ø¤„(Na¤(\Bþ­(þp¶7¬eµNÃ%ª`ºä±ÁCx¨ŽqŠ!¤¤GU ¤° op ê#Ç-,P€Z `.šA ˆ sÀ<\àÌÿôÄ#lЂà¸`sü Xà€WXC!>Á m cÁDЉ3"D<ç ¡^f@€¬HÈXÀŒ€³ET;'å::°¡ nºDª@ÓÅ០0 ¥ÄKÐδá–˜í!° rhbVkÀÅTYð HŒákH…!‚á„pN,Ê:)€ºøX  \8møÄ2>!R@À¨ß npƒL¡þEzˆ¨à èRÁ'ÐÅ‚&»•ÈR €¨„¼ñsäà(Ä )³€gÈs*À‡¼Â €H¯½*à%c+Œ@ o\b¶ @X ²=x2"O]8ód'WÛ$--¡Ã¬Ù SPÂ\E²Š9€´t!É&Ê )5`ꌇ86îàØY‚´¢Eh*ñÑ3Ø §2@EhA‹äš£(€-xà4Ѐà8 Œj´û£HÀ4¢ÐLS¬á ²€Æ2 ÑB„(dª `.R Vè‚e p!3p P€¸¨Cü Câºþ €.XÑà£BÙjÈ"ðJD8y”øg)æÐ%,üµsù°Ps,œâÙÀ‚#¾àˆ(x" 5·D–0 BÇ3vÂÁq€ƒ+ÈÐÅ xÁYèbqïèQ 8V"¯HA‚)À @‚†À´Á‚J¼ý ¨DXðzœ€8CØ_‘Š30ƒc•X) @y¶ÂÂã…Á kpC&*±äôEðKÄ+np…T¤¢3`X9±\¤@-Dzp‚ „ÀX°DÏxÆýèŒ<5h=t©§ÍV-U(ù%Z¡Û*X¢ jÈ‚ï˜I .”âjPþ121kD¤‹8D6#ÁUK€™iÃ53±Ô%똸6°Â(fŽz›òˆe+ @\xà œ2”Qƒ"(£šÖá¸@:Jh€–TF"Át•œ€-€ê …üF(`˜AÁl$°ìpá”ÐÍ^H!ñòLM*኶` Þ®òᨀs|1Ï*Aþa Aî¨à æÑ}®À^a©Á B Ü®  !°)ô A<‘Œ=‰ó<“Ó;+a nà –AðÐa‹`îŒÀÀÆ Z‰•R‚š°h !€ >¯…b¬è+!ܤN!¦Æí̘g¬·ðÒâ& dÀ`¦ÖÁw:ÁÀAÆA !xÁ:à\ ò¡6­–”¸2ê!@½4ŽÀðLT†ŠòÒ `Á”6®/@ø ÀxAì.è¡@ঠTt-€zŒ¶ÚþðôÁ,ù€x!ÎÁX ÁÍ~¿!Q§ `‡@¢„ @àú¬Çêé5U±:ª¡È#S ΰ„|$6oÉPˆ=Ë“«Ú‘=× /¢ó=óLÏôL}|>!*á ÅÀ >»,n`v“YmÀáLlàÇ^á úîêq\Ñä$z hà d ¬ø³âÖÍ•À¾à à’á¡T?àh¡ ªNíàY†a3Re¶áà(P¶á5€œ„œ¤ìN‰ÞЪPé þ¨*dÁ  fáfª¡‚` daŒ`Îv€àtvàøaŠáÚR@Þ!:ØòìN„lTR¹TªBðâœÀÞ €N@@€z Ì–öxAÌA%Niª”ãáô #  ¡ ¹V¼îöê¡…Â1!`ÓZr°XÀ€`*â Àpw¼ÁºÁ ) Î5›d¥jr¡>"f ^–áÚ^A2¡5e[`>  Kv¡…T©AÑ ÁáxaŠ,àT¦¬VR9.O7mÁ:vÍ(¶2-à…øæªØÖ+W†ãv˜s Ûhܬ㠀ú²X¡òáœà:€ÞaxaÓz`h‹aBØfeÜ”g‡¡EuáHЭº¤ô\À ÔR e¡g ÌÊ–P©Š\òÜJÔP!‚zVk×r @àƒYºö˦ %uÁánK.!ŒÁ@rqs @ jÁ!jþI’ÌE)ö…:rÆ` p@ ›˜Un`¿z—Ф& ŠÁRá‚«f7wQWŠAy…÷\…—õXo“kwI[‹¡„©I›÷€ €€y;@œ·`R`¬·z“·I; •eÁB€”aÑ¡СäArc@€@^¡ÎK`€` ôr!`   P†ܪª¤êâ`R¶ª~`dHã&Œm¯*8ù— ¯€ò!v Zäc'0™¡Iš–‡6yºIóAžåY^`ùánù! A£7Z£î+FþÝJR%•(àN¥ÓrÞT"à$Р7N!­JœÀpÂp"¢pd@jaeÜy¬*FlÁÁ„õHaÀG ®í€Is sÓ˜7”·š“{¹«¿ú«‹W¬ÇZ¬ÁÚ0O YxÓX¡N©Œ£7šžè‰âAa@9€ Â÷  ¡‚ÚB@›7 ›7`RwyY –C‡YÒâ":& ž1[†dÝê »Þ!  ò¡Ÿý úŠÀµ_»¼nüïš—99·¿z„9&õ¡¥ÁÐ0Ï4®7:!î…>zþ¤IÚ¤Sú¤OàzV²ßa½Fú„àjÚ~ÿÚpFA FárÀàà]Œa¨;.ÁBP‡Û»6@–€ 0ÐIŠ÷v!›1Õ’ Ø”@ÀÇZ·q¬Áz­×úÀ¿ú¬O@t€hx€’Áœ2\Ã÷:ÜÃU®¢T Á¡4àp  JÀr ¼Áôï®7v@¢– ¸!ø8™†ÀŠÜ9¢&³·;[`öt9ò{“wÀŸ)€RûŸq›˜TËÝÚ` Ýx¡«;@¡qÛÌy¢—\ô,ÃPoµ¸¡áìþôª¦—»¤û¹]€øèVÎx#ݹQ½l4 pá ¾@ 4à ¨Ájáp ÐX½Ý̽Ûbq¸:œ„,• 3ôÌãu05Séú‰^à8ò­kÝÖÉÒ½üÁ3\ôZ§,üÁuÀ ŠÝؽ@’]Ù—½ÃGœÄq)\i6|Ápx *A}=¼z/`(`t¼ò¡z¯—¨Š²û†0ûáÆo”\ÍY¦¨¦‘Á«Ya¯R{µy˜×aþp¬a@ŠŠ„ÅœPâÇ0Í—¸¡!h߯0ΡEþ™£ä0œ—»ÝõœºY@ ÔT îªÌ¸ªê¨ˆ,`¼“ÀÝÑ“À4\€GÁ ¤°ß9b‡¾ez(ráOp­µZæ}þO€•¡ª^ä!#Î~•’ë¹~è¿^Â^ì3•ì—p ×!™ g؉ýØ‹}Ùß¾Ã`Ë—j`”@<ÀŽu£€^A €Æ»ýÛsAÇÉAI­w®/·A2¬"š¤cáâý5nãF’®— ¡žƒŸU; ý] ôOF\ÐÁ®¡¯:® Àòl÷+_͵™øÁF`Àpã¿Á ‚aþ½žTD~äõœÂõ -ùÁ¨%õâ «8Ò4Àl¨a û 2çd r^ä噸͘էìô4úg`Ø!3£$p@<\ÿ5`Kƒ Ü ˆÌ˜¾ƒú^(Tø ¡C‡ Š€› T¾|é AC‡Ç9Šä¨*^DŠëÖ¡ƒ®†2JœÕ: !@€o¿¤,«‚.ì kIƒ ï€v’+]*ÎÔaÆÌ‚‚«X¯BØ ‚YÊU`ŽsN¶ms²´/ ~ªUkЀB¾;:ð‚¤¯ß¾äuó£MÞTf?ômÍ÷C—ãÇŽÇJÖþÀ/^ï Œ0­³çκÆhSà„®¨»RxǺõ;VgR ÷î] ¶:q²5·Mº~üØÇ ǃµ¼ñаEѶ<—ú«Ùë×là– A® §‡E€¶Ã@ˆ FÒØELcðiÐõ „øõéúìY•ÿÿ.°2Ê€“@0p€ÊìlÔ‘:@(!€> ÑD)©ôÌ3  DªÔ²@-0 „/_|âKÔeTüÑA1Åpƒ Ì’J ?°Ðd¨yõ•d’Q@?X  +NŒÀ +(0ÆÝÕ¥€>¼è•Wl£‹9,|rÅ ¸° þËVál©‹1oƉ’aQ 3²¨ÁxüuVÉ!u( M0Úhó¥j®µ,Ëð3B'ð‚ÌiÝØÔ?@À2½à„/ÞÀ< ðÍ«œÀ8 €2¬0ƒË¡ÜÒ ä4ÀÍÛ £Ë Àò²6*e¬^é³%y»`À.;\&í´Ôª×ÑG4 Ä;s Eܨ¥Ë Äð`î¹æ> Šºì>p† Ô¢ÄÞ$‘ï(ÔPóÊ<pÀ6 %c#ެpSO€TB Û@ o\I§X)¼r5N(À #Èr‚Ô(R,f-ÛåüÐÊÊ0,þ“I$™¤ÀL#¼£ /'tcsn|•>ÓC =°^PC I*° ?LŠÝuïlëu×#ÜÃB‘ò"K8AtSƒÔPC.Û\µÍ;  Aâˆc.(á >øxÃN¼ ƒ =P£ÂÖfA M AðòÌš9 íRÅ«-»ðã¹°œïD^Ç*u‚?€’¬C¨í;§y›àÛ!Ä|¸ã¾Àî¼ó~!Eà  Þ0€(ÁÃÁÐT5Ë,@IxÎÏ0Ø!“?€ÀO>Ȭ•Ê'Uu2¥m#™¹91ÎŽºhÓÍõTÅ23tà ,Y :Î7þ€E=Œ(±â$èÁ'dqYtÀI+FŒ À óåC²ÀF |¤ €@OdÑ L œÂ бÂ`¯—ú˜1–|`PŠ1‚¼àH‚xaÅ!R-V  ,0@¬°bBa/B° Y°B;Áv1(£·¨F 4á`hbðf ðÌà xÃ@ÀìaÔ ³˜†5h1‹•ÄbÌÁ‡šÛ\J @-¨1†ð‹2¨…¾xœŒä@œ£X@tþP^œ·H¿` (à$]ÔÔ`Ó fØ8˜Šz`>¤@°è2~ &¡ÁkB_Un$”£ Øê5,2TÐ \Y åp m z Ÿ Oz‡@ ’A W 00Š` ` ‹ÀfÏp ´à‘pžP–¡ÀQp \`¤\° ‡à—Yàf‹ð™° V@MzzÏÀ¤€ ¤`Ê §hŠÐr€cà ?éJ ® _wà H–€m°P@ n–WÐ11`ƒ1åб° n § ¼É–®à \ ž Ž Xà 10F ¦àCpÇ€Šz ~H X Q ð ‘ €þ ˆ·‚ ð ¤ £@`°‰Ëà3PK` †€ rz Íp™PM¡ ÿ)IÀ ±;ßTŠªÍ°p%‚ `¿Q$WÁ ë„ Û‰ )à~æ˜,° h_ ö €€Ì€ º©p S1† *P©ÀÁá Ž0\ ž€¥¦ ¢ Ò€а &…@W0ªÖñpðVP‘@ åC ž` n ™ CàX0ò€ 8zF8à°r 0€K *\H0 ݨ¤>m C¢Ðnþà"à wàE€ >¢¤ ~ Š€Ûp70€ J`ZV õà¸0à‰Oð® ‹°ÂxàØ€Ù [ µ™P> –p ~¤ªx€~ ®Ç~p ØÀ‡° C°‘y C¾åà m P€_€žäëÇ` m ‚–ðå ªó™x@ žp`0©Ð2 Ëð Ôp¾0 2pm° rÐ%pmà R f n€HpÇ—7p w  ´` ³ðŸ‡ð±åG{«~p{Ê NõX6¡£\±)½¡N\¶ ¤pþ)À>c*0?€ Aw)€)@ )° ©@ ¤°gà1u˰…17°ÅøÞÐXðw•{Çp ‡0¢pVð ™° OP €ÐŒÀ.p«¸L–`›Àà‘° «P[p C `  õ•ð ãàv)0Cöö Ô@ÝPY` Ómàå@cϰå m𣧰M ½Ž@ w(àY  mð ß W°^ôÀ¼°_ R e*À¥H" zCà ”wp qj0—®€™p "à‹Àm >`þ – ½H \ C€ P €é»x0w¿>ÐÇp ¦pL \Ð’Cp™ — U› ~ЙàX` TØ € õ@ n =9Ð7¿0 ô€ð@ m  O>@§h€ gZ¨  ‹‹p¡ÀÁ´  ·€Ö0 d§ ÔJ=ã0ß×Zp€·Š «²ÐÃý6P ÅQ±°€8ðæ+ ƒ d’&,@ ÌàÖ°€g°‹T¬ÌP+º¡R *0N4Äo°£Ðgðr°7é̯ÐO@m° ÍP W@’ ñˆŒRþð«ððcû g0`ð ¯PVp–ð °kð¯©`P?ppR  åjšÍ0¤P‹3PÀp‘`Çà –`Ÿ‘À_ _À7°3  uÃl@p6`ÅÐ7p-ð¾ð ¯ M×j€ËPV rp_ ØÐŽ M0ž0W°ÎÂX‡ ¼aš ØÐ (€ÞÚÁêÂà ‘p1 ‡ Ö¾>Àw¨Yp¹ì‘ðذYàHàš rà Ó \ ð€­òˆ× ©mpìø7¯pþÊÐ + x+ mpå€öY «ÐY gÔ` ³€ H½ÔI}ÛÅxÑ ¶Àß'm~ƒÕ6bºa1ês^·#j¢4&C ÉPs¤&#CS_±&, VæÐ È`1gÚð‘©A p4Ð9à J0 V}R0 9@ßv~2çP @ ßP£À/+0R :@]Ëà_@ $0° uð Pq8£aŠ tPM0ÍÍP ¾$ì¨Ð³Ž` >À¡0~å`Ü3Öd²à ÷Ð ¯Ð ý ÷·m-° Rpþ_P gàÎ0Π pa Q€û½_p–[[0ƒ½i_ ÖÁV  ®p TÐ ®Pèp ŽàÀ€‘à~0…W Pà Ç …€3àrÀcW7 úªmrðáÛQz c •0~®Æ±  ð ’ý¸ óÊ€np¤` mÐ H€¸¼ŒsúØè°|0pƒí ¢åI­/IPŠóqˆÙEº¶wfh®)GSl/íÅn<²`NÐÕ›’ç_“Â5åf] ¸P²a~OpêóÀ:p@É@Pé4þ°D4@»ñ €¾ CÁé¦.G É`é9ìpGÐÀêÄ€ ½2pi’ïó k@ @;K(AP Û€ ~°¹@À(©ÈÊð óh¹eµ õ !páTt=° *0Š£!ÐO@ï÷€ªà 4  O`V0ãpOЀðmc  £ÀVÀuÐ !§€3‘ aÈM!{ |ãÆÐ²8,RIÏ82,øbˆÁ‚Bc¬‚é©fö|Y³Àט/ Ø À`”<\ŠšùÒ— \ø:“㌔ZJ¤œ!°ÀþТšÐh*·ä™#Mèfø9¥ TÀX,Ö,eܾ@€Ü¾jix€÷€d3« ‚m~`Á ´±Àmê™É;̉n¾e¥7 €è`—B÷„d.e˜|¾]®†n°A&ŸòÉ'þm~0@h€Æ èA6f^p2d(Цø(øá°`œ YÞá¥zŠùæxáʼn†á…x!e^ €uÁe³`œ<›,ähuB‰î9"‡’9‘gŽ8âç "@Ž•)N`fø™‚]zA–tI†…"Eg]"DàŒ^˜Ñú)¦˜c„^FøaáŒ"pAëd"`æ#NHa„ øæ   Æ\@€Á¼YÀ<ý à\|i†n8„–už1ÅXÇRÌBP™!f)bTRñâ¡–\@@þ_(@½‘AÖÁnFÌ ˜IA6ÊcAŠOpÀ!XRÀE6ÎXA¦›ç ˆ¸Žý"Žì0@³€3‘™ j ÊÛ,z &ØasCèÀ.Ððc€ÅhŽ{ €/nä#°@¸nPk9…ÑÅg^  Ô#ÑaÆ6öSš×F|€LŠ!‹ð£+†ø±ã#à vÁ ã»8AxÑxH-¸ÑM\ƒܸFrŽjÀ ÄHF2t@ZDš‡BÀ? À²À€pfhì 7»ø™F„ÈBCð{`ìÂ!`…ƒx!þ‹  ¬ ¡Þ€°‹ ÜcZ+F:ÐC¼Ðt”E øa€ð‡›ì ”€$´ -EjñøP¾±€ ¾ …p‡6 ÀÃh1 +è¨Æ1¯ŽjXèÀ†ïàR‹àÕ‚ž“B›p*å(0Ï+Oy˜“ä( Z°ø ‘ŠîQ£¸hÆ|6°(ÀÁ@Æ R0 ø8Á² À^p°Ó¨†ã0Nd1äü@¼ðÀhتõ€.Œ!+Þá+nP ù˜ ñ… nÔƒ¬¨ÍG™!øÔ,`…¿ ãV|‹¿(¡i¶áþ`àº)F&PŒ]Ðp# =P VL`‘ì:—n€ Ã àÆ Z4`äPb. À‹÷(ÁºhÀvp‘¼ˆiT‚¤‘ÅHã¹TÈŠ „‹…=ðÀ z3´É¢=èÁBÐ^œ “(ªšÚV Ò@àEà:YÈÊ"/vqQ9^µG=´aŽzøÂòA-ž zÈ£øø€/à €¡ E8Ä|€Mâ7…z7ƒYÔwšˆÅŠ€ŠYê-ûHÇ>\4)¬b¸€ oPÃy73úŒ£ \ä/YÈB3P±þ¬â5P†2jÀ Üb#8ƒ"dQ re Ì€¹€@]°"Žy—³>s¿üÀ7$A ƒ „2îÂèÀ;œÀO¿#î s‘Aðc³Ž5@hAv?†ƒ‡¡‹wyæíÁ!RáÅ.Ò@ :¸ÇOwp›b覯 âwЃô•®#è†hX¡‚ä£|¹È¾‚åŸîbتìÆÊ ÖãÊÍá|3p7»‘EÐhà „ ÏëÒÁÄÁ6q<€Jà;–ñ v|À€t¤%=i„¹+ƒ<~G7¶3£~¨†”Ñ\T,âw†fáƒ&”þ¡ž)„Ö@Š:P@°C*šñoäW¨‡ò´ 7ŒÂEäñqydã ƒ<D~Áƒ$dÎ-@@ @@àf–AŸúÜ{HdbIŒ…Q$,“è˜Å/XW²¬èA ŒpȽÝcŸȇVLšz8”bÕÅ0X°ƒ uïñÃ/úŽbÃÙï‚°>“X >,‚&Ͳ“ ãÅÆÅ‚R §IÖ ‚0 êá^Å(t°s¤mqá +b „ýdŠÃ€FPF ôà_F$q†| ª @7øéÉÆÔÃE ¹ÝF`²€þ@è¤Ê=|öN6ð¢Ï`…eXáJ8Âö`¨EÆA )|ÀГFü¤ “Ç,l,ȇg P aw¦»-¬à†fBà˜…&Èñ> ô Ìpà ¶Ç }äã9)7x°C'²WÂ+Ú@ #€§©,ðÝ“ è¢WŠXÆ’ 0@(ƒ)@ô¯×Îü ã>Ì",ÁPibmà€€j̨ÈÅ/`‘0…#úØÆ8Ø÷¾ø!l ,`$ c p'Ø0€w`†ap1b…Ї‡0†Õ cx–gQ ~‘…)^àþ‡wðÀ|\I˜Œg €pƒ-ð†ð‚¤SuP$¯Ah8Á0²j8z›Ïb…™…§S„HH\H˜p¨°\0'w ~€©0hÐ…h›¿†`œ \)ä‡ÀÂÈ€Pø€#c’TXƒ ЀHhÚó†h†6x…ð†xUxB4ÄBDDB|ÆxÍ0 @†…êm¨[Ztƒ†L@`MÐ" À$„H< } €Cà ÀKЀ‚‚_ð}P_Ø]ô… þ@h7!%ˆ¾è иjÀ>@`.ˆ…C˜H€Y¸†±€Ð{]ªa(Zx$@…rè†|PžØ& _膉™Œ"¤€"̺m€ýØŒ P†"¸…oD?˜:˜…[ØYømÀ§ý€…t/ë†Ø/rè¯J¼¨1È„hÛ nS>ø†op¨‡zxòX¶n0 Ê–ÜeðãHÀlØe€tè†}ð†tø…0 8J_ÀcÐì™Á¨cx€}xo8€'H)8€s€x„J(_à¶p þUq‹¾(€ˆ„Tø†ÈhÐ˽ä˾„†؇À4p‚o¨…}¨‡ìyàkp?àp0„6¸?p„;˜Zø e˜‘,‚ ˆ„‡,‚"¨x†Y‡¸½Xé»BA[°7x;”‡Ñä°M„,è¯"p*†o؋ػCg,€hŒžm FìÓƒH€LZ€Ì6Єj .ÍDa …lX‡l˜a†Pa@‡kX‡ñŒ…"ÀCoxjPh á e€c€lp–س« ‚x`.ÓԆȄÌg f¢†TX?€ÐŒo ‚^ÙþЇJ™J¡…ËóS¸@… €…:È/y°€¢P¨‡(A†\X˜\€°Qð Ø€\Ø€c‡KMZ¸k‡²(kxQP{˜‹ø;yxR0(Í/°€Ö’ ð5eX€4‘`‡'¨‡'R_°ÃUZzKxh+ø†øh@¹?T;$·L%£ô ¸…ÇY€P=èPtˆ…<‹Y†ó;MøP Z .k€ÕŒ W©…±…CpH€hÕ³ k¦Oµ„+x€H‚`ð;¾ø¦˜¾êþ»>ì“0àp`p„«H=0`(Sp5¸„KˆJ(‡K@KȆN…*˜l`‚$XKÈ„5x„HX…ÈQ‚ø…:XQÓeXRÀY…ÜyUX‡!@‚cˆè.pGˆ‚,À.X‚5º%X†,H€h#½Ø pT$ˆ…NˆW@‡!°†uXWp€E „i@…'B†kðƒ˜gH€i˜(À`ȼp€Ì»†j¨` ¯ªr†k(Yk05$@°†! ÙX(°†itð¨&€‚ ˆ°­l@`‚ià´=†þ«õZp€eH€¸†Y˜?€Ök˜7XGK䀾£½8ÍÇ$x4€ŠQx€ðËÄ…Uˆ&h‡v(W"`€3 ‚3``& lpÔ$+P„¸†ÛqÚY¨†iˆQƒXh‚C@(ZW0Y(e€Å¼8UÞrËCø‚ä¡WÝ“•ÝnåW‚up=x 8€Z8 †fØ“Yñ6ó`Œ·q+„L ‹È\H‡ˆÕƒ&Ѓ;°†6†S@ƒK†,pƒXÀJX„Lðtd8‡'°„B"8„3h‚WØ‚GÐS=€TˆTƒCÈ‚&XS Zx†ˆþG¨à!O87ð.ÐE@×C(„”øÞE¨¢xÕà†Y@‚(a@.ˆ‚u†!ˆ„ÅHÈ( … (‡p€·0„rˆª˜†:HGCؘCp„@‡ŒÅ9h‚(ˆ,8„6Ȇ(ha( Ž…c¨ZeÅ‚Ø]‡#Žáå‚à‚c˜c0cW€‚<†­…®@…r+‡[8+ˆt °¿Ó€½#CÃ…Ch‘à’ÄK¼Æ5Ð\"Ø9x…¸d͵†Yà€g¸X…н€Õjx·l€‚,X·T>(p…N‚Npià‚Øþ›½Úã7ùpƒ'hW8iÀãdÆãr†ØÎlØHȯhjH‚yDp‚ôr¨Êh/æÌîã€&ƒÏ‹U†XT@qmƒrè„EXÈ60…LpQè×P„B ‚_P+¸ƒƒ>ƒ3 ‚#ÜŠCˆt8=ˆ‚HßgPÚlPKPænÅ5 5 i7`à;ˆ9X‚®àNr@X(®L¸58„kÍè„*8<°„K(‡r€…rÀ6p]ZhÎ(ˆ‚-ÀƒHЃUŽ„h£n½EK8›.pƒH5ÀƒLþ(¸é!p„Sà‚-pKø FàQp„/¨`Q8…ª…];6ãNÐc(x¸ÎM4&ˆK(‡Y@Ûm24;€pÞ‚)µ‡ÌÅìÌÖlÌe"x×QKØ‚QÀdMVEƒPX‚Hç(ƒÆüÐi@Q „H€²ög€iȆRÀGØ5Îq‹°%iÊHƒå.à©eî!ÈlȆ îmSЃo†$XÏ»€n'ÈRÃÈ\8HP$°‚B0t0„Lˆ?X”¥F!ØJX…/EˆOø5Pœ= &¸‚·Ž„'p7ø@þHˆ†·‡6(b¸$°`@ÇãLPºq¶î©«J <‚r …C…k@&H5ŽÅØPhÎS(4h(ˆ4†H˜çNPƒ*p…rÐ*^`Fahƒ;p„cpƒ(€6 ÛH¨ƒ N+°G¥X°„;;pƒN SE0QºCp&·„,È„,ð ©EƒH@KÀ@ƒ4Æ4Àƒ·ÎEðEhO@ƒ,˜†g†1ˆˆ•¸ƒ;ˆ‚¸M°†e8jÈ­=¡½¨„6¸‚ex+àa8†Eˆ,èiP „SX¦48,f4pëLþø?ðÌm‚6ЃæœßL¸+Ðpp(?˜†&4È, i55hq ôË|oPY’Ô¹EhƒkS†,iip_G`sa§.X=Hž¿û…ø‚‰ oØøþŒç ˆ„,R€/+`=ÈÙYƒL°c9ƒ(. ‚„ç”(˜`‚hè"8ƒííß5ƒKvƒ/¨€”v7pkeZp€gÀÚ …H¸ƒEp$X(ði"•†XsJ€7ÖöÐWZð%†\X>K0…Xˆ„6w<ˆÄŽGˆ,X°Ê…9XTCþ.¨Ç‚ÅBhXhƒXiÛ¡MƒúõJˆH°0Èén~ÎJ¸Hˆô€õí„EP„S@(@GpƒL¨úUPGX…­Ž5È„&¸K`ÔPà‚+°„((µMèaj‚T(„YÃUá_x…LX*0Gȳ¦„, s<@q ö„6x*(„/ 7 áo‚ \&0w v=xR˜…fÐRX¸Mˆ†up÷E0õHà, R.Ƚ·†à’#ð†á¡v%+@ƒj&7cE¸X^Ör˜ƒHˆ‚Ý6ைZ~µâ‹Çœ0tAÁþmÌX±H!åŒ!RYPÁÀAÊpôèA @Š’¸[EÅ„‹Iä¼zuæË2 20`2ÆÍš.¾¬±ò哇 ’ãè ˜HÀ â®Ž6wÛkÕ!9Ö …Š‘)Ò*ašÖ@ª³æPr°üpËÕÆPƒE‡ÜD9tªœV$–(¹ºãF5`m 5 $µ–² ùi†¡Lk yµM¬ ª‘»¶0tY²8sÃQ$W¡-щR“G‘šù˜Ú5{…iÓ l ˜+°€Ùòå $&aÑ5ƒjVºÏ€3t§’B8f¼zT¨’j¸žÈX`™þŠ:Y:t©Ô!KÂy‘ }Š€õ£ÆŠœáN $Á„9wq@K&Õ´±Æ Õø øAË:Àd¢ÈrDE,_´N_‹,bÅ+O à‹-IBÓ/¯¸ñMèáˆ"XD‘É ™,Ò rpQ‘€¡2(áÍOÔ¢AB 5ôPD? ƒÌ,0SG ÄRÍ-Å’ášÄÎ-åhòE%äÀÃ9@Rà´Œß`‹/Ü .°À2Ÿ¼BÊ7²ŒÍÔAŠ7œ±äD7¤¬q)‡ — ·XIYèJ~| èKÛl£,‘þ‚Ë ‘Vh˜J ©z¸hŠ22l°>´>ŒZ[hS‡€< …ȱ͗ l€ 2k¸èF!cÈaÈ,‘è!´ )X‰9\e[DrÅ+‘œ‹!ºðÊX`5…Ü€ hS.>Œ‰¦g-0І<áÜD  @*‡|P€Jd¢†0XDrŠ,RŽ"‡p@Í+ >Òs*2ÔòÀÞÈ#Õ,Ždrï¡pàÀ-0 ã€àø H!¨dR8­Ì"Y8â€_4“D-ß| $øÙ†µdbÈÏ,†%\‰K º‹þr5-xsŽhðÀ 5äDÛèâ%CDàÌr ³\ƒÄ5ÖÐ’À3&9ÀÀ>û àDƒM @=ÞÔ²O7xó€¨RÀ@-㤓N ¸ŒcÌ6¿°° +À 3tc˜(03XáÇ K^ú-5 ‚JNèò ÄÚÃÌ/Ô|à ŒC334aÈ>h2ƒ2°Cø ¡`d@zà Wø4Ch 2¡¯ ‚Wà€¬p$\( †0Ä bQ‡Ya -ô*0Äݨ‡~±$(Vƒá„´ h¿À+*ñvAâþ…0†7j$o,€m8„Àà†_ D!ñŠ/œÞp>ˆHPÁ ŠC0Ñ9@(&„9® =ìåèD$Õ²´À€`?" (ŠÈ‚&hÁ!p€tŸ¹Á77´ ‡Ðg®P‰3 ðÅ ¡ˆO¬Á CXÆðF0èá…($6ˆ5´¬Ÿ°+5¥„ àÀå¸=êyzp@5Lb $ £Õ°&*hA !ÜF °pæÛ¨.$2C@âúpõÂñƒ`@ÀøA èÁ ~t€ÃxG>¨€ì þ¬ÐÆÀëm£°2ªÇ X@€úd@¿€`".H/~¡ á#ô>rŽm°°P@VP‚``ÐÁ> Šô²0‚>#À Ð èA\hì“`0)¾á‡pÀb.Ý@Æ8TPT/ ˆ@O]`T#d9ÁFÀ ôÀM,¨RHÁ'A¤ÀŽ d TP‚:Zpj<¡€xÅ2^ˆUHAQ`ÀMVñ+hÊ6C%^¡)¼"ŸðÀdƒ¨Ä }ªU*!øN`Å|°„hÀx%VŒÕq *Ûþ°)ºá9à*0X.ZPƒL¤â¸H 7` \  hÍx@*®P‡è!`°$–á„{½ÂŠ Å2¾pˆLXÁxï1“™9 PÞ“16ƒ$Àšš˜0  ŽjЂ0 GnAŽx¨ àFnq n@‚å¬D* €U°B²@†,,]ðBÅØ“,dVô ÞÁ‚8¡Ã` ºq=;áÀ &@€²8Á=zÀb^$Y¼ø31 m´²ÈÇ òñ‹-ø@/r +<ÂÉ N`!Å0ðfYì‚'þÁvÀ‹]HÁ ˜Xàd|ã=`F=L„aÀYÏ)0@XÀ ÈBH²0À 쀲0/vÐ#œ€"%`E2p´À÷˜À=t ƒ^Ðà}ýÅž€‹ŒãÔpÁP€_àâôÅTÐdÅx¶,zðìb\ RȇR`]0#ÈÇBà¥Ì€€­¡ ÕUç+‚\ èS€¸pÂ8Æ‘\¤ ÁÀpÔB Ô.x $A¿`Ædq†|ü@ÇÝE=˜1Ž:À¸ €ppó½òˆX‘:ÔáyÊþêñ„L´a¸Ø”p„Tc£ 9 œ‹k<ØhƒS!‘‚nPÀsãІ6`QdP@ü@ vpŽïÀü`,:°ƒ8á› †I_À fИpÁÞуw€Õ¨Gö)=Z‚ô`A˜¾¡bÈâ?pA¶×ðUL` Wð‚^ÁƒoÁN‰q‚d$#'Ø+NPêOâ?ØÜ7Xጞï0r>ô ÌÈÀ ®®‹@ã.˜ÀžÝbÈ"¡ŸNç \@! Á€?v8Ÿì@s2Ø1¹¤#¾ønÁ7Œ±oh®@EþŠ„],{Ùa?ÿ@€Œl#¹èF.òaˆR@Ü?(‚2<à  ‚2A Aù`ƒ6¨3ðƒ.@”À0¸@ðƒ¼ÃŒÃ 0M|ƒ@‘7|ƒìxøÂlŽ.tCPÀ @€. <+ÔC xC0È@0xƒ/PQœÉuƒ9Ð2ˆIõh.Â'¤>-ÃÔ0Ã2E* Õ €°Àä4@$@”O5T7°“¯dAþA‚Õ€2øÀ3$@ œ@ÄéAà 4°ƒ/ÊxÃ(àÂŒC´€x.ÔC-,Ü>¤ €çHÚƒBvÎ0@À(.0À ÊÃXã$Á ðÂ;xÝ@/ˆ$IBCÓÑ#0vŽÔƒ1° 8,€Â%¼âÀð>ðåÔB-ÀþdDW1À@9A#š˜üV ¤Â ,C”IA|/ð+œPCü±ÂØÉÂt WæƒWrÕ}[œÁ',&p@RR%A Ì´)ÜÂ6œ2¼`:@;ÈÀ-EB!üÕxCøNÀâ,€1@7c6&9(C,ÜB4€Ã4"˜èÁ#ä@-ªÝ4xƒ2à€ÜM4ƒ àdÀ´â+*Ü#BÕX8(C€ ´£ìB%ØÀ\:+„š, ÀnvâðC.ø0XB$ÀÀ3€E')ƒèi#7:Äc;˜wš@;Ã8И,|CÙ!ƒ>þèCBÒ£zÎ#íH/5À@ðù)& ßé‚.8Á0@\ÿA€>lŽ @ž<5ð@,1ÉÀãnê/T¨…šäzâB§@.8$À-ÓhÀ+* P=<€/,ƒzC È€|VÎ@¹ÖPrØD@+½Ä­Uœ¤ÀHðBÈØ ü+ü@8Q€W~ 2K§x¥õ”*2hèÀƒ 9D§¨¤}uN}mÏæøŽý@8tþƒ>£,´€—”Ë t`À |A44ƒü•°ƒ7(„£8N- ÐÀ (Ö-Ó€ ä@A&à ,Âtë.îB[É=,h…°@8A>Ã;Ô-@僅þ@3Bl<@<|Ãìè=øÁ-(€ŠÔC>ãÃ.L/Ô@À‚,˜c2¦ðB„Ú;*Dkr'8€€C7(3dÂ!¤€ Æ ´V+µÊdàÂ<ÂYtF€h@7Elì ´Á¹ºÖ«nƒ1ä€@-‘È€¼:¨Fnd¨mc¾êk…Bƒ>`­÷bm7þ™5ÂôÖ»Á!Ö5¢@ì,@A0lPƨk „ 3|\ ˜ "ì/4Á(ŒƒØC(ƒˆ¦ƒJÑíä :„1´Ö „ ŽQÏþfp‚¨÷¤ˆ~p阀 HÁ8ƒ3@í|ÀT­ £™|)§ê‚ˆj@;ä€:ŒÂˆ0Á1,AøŽP…]@ƒNèS CÈÂ;<Û;ä™·Ÿ.ŒA„ƒ5TN¸@èžy@T B,À€5°¡lƒW²€@0 ØÏ5ä„9;˜>ì@¼1@@÷QãéB!CAùÔ€”þ##Ö¾,íΣ+þB0¬5È@Â,Ø‚Cl€õ@@=œäB78r$@Å( |ÃôÒkžáé;ªã:öò:2)0;òB¥5@5\2”Î -´Û,:P’5$@"ÀD‚ÖolQ:„.K0PC*¾)À3DCpÀ:|0€Ã:`:TÀoLÃ8LN:(&¤Ãè³Ê:kƒtC8œ§1„‰á,@$¤Ì*Aó.|ƒÏ®Œ‚wªƒ*è€õyCFËšF˰1ð§.0²1ð!2À/|€È 6TÀèÝ.¼ßðþ€<|Á"à@/ ó‚Wz¥…ê0œÈoXxÃ(U2`Àx.˜BÕ”ÃXÃ5 6(€*WÏúÂ#H9ÀÂ5ÀY—5 Ø$C@5¢î:@Á:¼5¼u‚h˜®ƒ#?r${ÎÉ~| xC.}B¨¬ØÂâ*@ Ôø€À}¯ (ÔÂ㸒7Ô2Ãñ€è‰ž.¸£/÷²Ù‰4iwƒ.,à€‘â  B6hÌÂ4ÐDÌÀ3LÃ3p@-`«à‚<BX,Õu³†A ¨ÀýàB hq¨®ƒ# þ  Á1`(¸¤Ì4 .þŒB 0– @<f p(`â–v¸Pc8=„>ܸ€ œt¹€{ –h@ò Læ32¨¥2€ƒ6 €Á Á:XC<àÂ@Ú0‚€hƒzeÁ*{¥—P+0©1B¸Â1Ì80ä=ü€Œ€¤B&ÜAtu;À48@"C.LÏ ÈÌ€°À@;›uYsÀ<>&t¾µ“¿u%ƒ¤B PU¨eì´&—w¹—÷uH_º5ÜIÄR2sÀ3ÃY9ô<æ3Ôð@8‘h¶íöàA,>0 3Íh“6"ƒþ P] °À*?Ã,dDz6Lz@B6<Ã4Yƒ°—ÚI"ž_hb”s¨iá‹U ¹a™3p9 ‰O )e|h˜ ôp˜P€§‚,ÆÐÃ5”€šBViƒšoXe @>iao¤¸b•¤Xf *Ƙgm`€e:í3fpa†™:êØ Š(LÉ‹PDA"Z²@ Ø‘§[øâ €áœp¸ã(pX](.ˆ"Æø‚ (®X‡‰,ppEŽ+€±æ‹1”Hç\^ƒ>PÄ \~±"’(JÁƒ<Ø”6ªD„¦M, ’J|ñþ j"±‚‰2`"†uÊ©s‘K³˜Æ”CîÈ$T 9$tB±³ÎlÐ(E5ªpã9Ø\CŠ:Ø…•¼y`EüÒ‘9@Á£ŠR¤± Ü€›"¡0Q“/Ö8C]’aå q£ 8Dü@c™ŠuaF…° hâŽCVÁ ²pã!52aÂ}~`E 9Üc‹BÚ°„ l,Ùb ÚÚÈDÃ, ¹Ãø!9ä4FÅ **±ä "®bt|äŠäW^€±O*)e¦©=ŠH°HOtê”c‘6äàƒJdpƒ4ð‰6¸á ™¸ÖW0dbWP„þ"ša p0à°Æ<Ò¥.s4 p×6¢ CX! ÍÀÁŽ®…BÖÀÁ¬p†'ŒbUáQІ9Ì8Ý(!„ˆ ôf2 $ =B[øžð\£8R¨Z c8ƒÖP7dBxÈD,ÔpˆSÄ‚‡àÂ)²A 0#€èÆÖ€´¡ Ñ`p¡‰- €Ä"b!CEÌ  ˆ„ž‹r˜ ‚ؠ°ˆ;` ¢ ‚"Vô =Ð…7FqüY¢œ'(1, a LjĆ KÈÁM0Ö%Ïðbè‚,`þ,qaª3P†é¶1 '  ‘Ù"A a´á ~°D&¶à‰UP¡.àE"€3Tb >˜d3fà†E(bëÀB$DÁ$¬‚Q–€ÂÀ`Š&@ÂkPÄ®Ð+˜€ pÇlE…-@B gx¬pÁoøÂµ8Ã!K,"–@‡)21„cH/ÛŠÅ+ u#€Á£¸‚¼Á€O¤¢€¾ÚB&°0ŠG@"¨@^4¡‰z¨ë3NøÁ(  \ÔÀ˜Å šŠPà` `†!fqHŒa ¸°Â–a)|AN Ć=lˆ¨‡X‚TÜ€Í8$dþP‹T(‚V0Dšn`°@ËX$˜'l£7pÃ!ꀄL\ûÔà ‘O ½BÂr˜qˆJàà n¨Å#Ú … <À…¹Ö‰CBͰB!^±†J4a‘€„Šg°vÍ€Â:Ž¡=4A Øuîd±ÊDµ(Ô1äf‚c`៣h‚Ü~Qˆ-`¡ hЃœÆQ/Hô' v0YC&"± &0¡½HƤ‰h/ƒÙ€h$dKŒTDÂËx 1†þQ<áåñVúšE5TG œa ‚ÐËÝì»ì+t T@}äÎ  aØáZ âVA ̇ °` ëN b®™T  èe0@An€tà¤ÀT€h@ ,L€"ï FA Z€t!xv¡`!+X®ŠadŽî!l@R` ®áM2a ôàQÀà¸Á. ®Ô äàÔÁ á þåð "痸Ĭg ^̇Àîï Ú`’`ZΠF ”à”@@VᎠªGNÁvÔà. .ÁPŽÁfÔmA¶žàž&¤` A̤Ç”G–Ê >îÐ’«&kœ Tà Ö¢pá ¾B |¡bP ^A `I ¬à ’à> a Fabíó”à \ @€N€•X‰Œ€ ÞᦠÔd˜Aêò˜áRÀÆA€`d!R <àå&€Fda0 \ RàZ@ ` F!2Àz!x@þZàz@ŠnNàdáT hàz .úB ’”À¨æhà”À˜Êö!2€v @ÀŽÁt€XdဠNàNrD´A|Àl ®êà`AøÆáR`"AÂv¡dî, ª`!€¸¡È!Òj`t .€>A~¨àt€Ó¶à ÚAR¢Ÿd‰f¡l°`îàÈÉW¡t”Àr€¼¾@ÇŒëA ž ’ÀxÀž î–Áb` ,ÁðÀ äàÂÄe€¬ÀäÁþ¬`|Àš  ´A p F˜`7}à BæŠs|à^à9¡óºá˜XX œ€”à ¼a2’à€–A¾À ¼[àÒÀ5œ`†!táš  @?ùRHR–#‚bzÇ+;` @ŠX îáÁ´qùv!C5”’!†òx!’oHTù€ JN€2ú "@"ˆ!h4 ˜‘ttGuôžèáFJ r Н˜!^ *£R~`(YŠN0€è:?; NòAôþA óÐd`º¡bAj ÒaêÁ¼!ˆ!Nã”F`”áNñTÌÁd€e€ÌAÜA¾àÍ@Nç”^À9µQ!õQÀt€>@Øa0ÀThàØáT¡€rï ¨ràªL¼a”Á¨ \áf 4@Hª1pf@f¡8`fò4Oƒ@A¶A( ` ºá@÷á=±[ `à `U„•PÁ¬¡Ú‚ÊA8 nà­lÑ 2À2ð F€l?ELú¤¬ Har¬ 4¡þ`€-·áx€ N”RÂT”FàPpc7öœaŽÀcw!vaD‘Àfd’b§àº!u À²ª8J 9ÀÔxtGeðA `Œ`¡&³X@9iñFs"KVIJ)’"an¨v¼ÂAºÁf` p Ún”å x NÍÖlÛÁÔvm×– z t‹ À b /2á Ni”FhäaýÖo«6pw€ø•TtF&rf„ø†¤  à4@¼Á®ÆáP \a6ˆ×Ô>ñÓ:9€fÐ̲uÍ’´þ9(¦8*æa@²5[ @~á V!€HÀ`8€\g6n ¬(P F+¤`  ^&H”ÞG'’¼÷{ùaHáÆ€a\—Ø÷`Ä@t €£rÄ à~@ö·uàB : `oÞa X_ùáÒ¤€¦€”ò³ía†tƒ5X>áNÐŽ`x€>a–ãê«j¶f_ XÀea aT@ABKææ¦vn´ˆÁ  ¬àg`jA[”àl™øÀ‰¡ø&ÀŽŠ8À¬þ!¼ä¼a€F÷oÿ–o͸FvÌx¬SSG€q§`€ñ=qÏ®l¡æÆb †À©`îUùöÆ Mk Lwxyx•á@mÖÔ,¸„Í3ã’` `À  H¡6€`x‹·xg¡€ÁPA.f@Z >`rà¼Ó^±×´×FyÖº±—߯`Cíh"}[בk ŒÁ`™÷ ! j¡Êb¢3:[`O®ªa~j—ˆ í®À~Àª˜9¶áhK¨Ø$Ù8(Uà9žu 7Z@ØA”@ h¥R€~ ta’‹ƒþôÁ¦3u– !†!A@@‡uøaà€@Çš 4ƒr Ú|‰Í¶FI:N 2ÀÐ nÀÀár¥ΉÞóFÉø¦UTCušFÔ˜F2Ô6Ç<À×Îáð à ¨¡ ` €1a\\Á©”¡` o :Gt fᙑ‹à@Z³Žƒ™X€ ®åºÌªb¡Κ‘ ’š ffž |¡¼!rÏ–“Ï{»‘F}¹—‰a nÀLw LÁ ˆ—\õ‚X‹@|¡”áÆ¡Ð@ ‚’2Y ´þµ[{LÍ3t¶LÍ@‹£`!¡h»´ÁЮêóœCÚÙ ä9¹OÐrR t@ áL œÖzZaº`6 *‚j[¢%:XØa21BZaZvžZ¤àΘFH Š¡6Òta„aî “¡4àræ×ootÁ¼¤k”€#ઠFà"€&\~ ”ÀÓþâ H!H©@ ÂŒÏ\8 õÖV4Á˜ fáxK9Ç‹€Âáa¡ÇÙzIY æºÈÍ’¨®¶”9ªÁàffþ@FÁ)OœÚޱ|<^ î ƒfà a Сc hµVçá¢a˜ >®ü€ üàb€\×u  ®á`À»Ó’h!hÁ|ÕÒÊA”«~àh¯ ·áfW?18¹uÀ>àÔA˜›ÂAÌ‚Áat…W˜€! nÆònáÖÈ vÀ¼ÖÕ ìa jáT Ü•¾) ²»qX¡èdÁXÀê ÁLg¯j"'’Á|bÌÝܹðó"`Äht"4@| `¼‚> lÀ¾aþ¬Áª±á8€r/çIáÄŒÌú;Ç‹—äÁ^àÇ_À~ â±vI}È‹<®Ù’V—4aÈõx9 ”€À᪡ÊgÊ@|!Î ¬¯¼WúHtÈýF  ¾`CÊ:\áºØ j5Ža 3ü òŠ ¬a8뵞Ð ¸€yébÔ’}6¸½6€p9º¹™œIÓkgs–€&§b –¡ Y`:“iB}ú%P¡"A®¡xiÁòAp½T:9 À!lža8: –!r oé›f#þõ©»·óf D!…ÁžÜ~Üs÷=9³÷{¿N§‚’€ØAØlCZ’àqË6 ÆaÜ`Êö|˜ °!ò´ààÀmšj#€ØPâ#~|ÁÞÓHªŒAÚ¿B™®í?¸AäiB! âÙ3k¨PqàƬÕÀ=£…ÊB­$däòmÀðãgÀÀˆ @@;‰Úƒ&nîœ:ÊQX°49ÅÉ1$Pމ@2dˆ›CAòtlÈ1kL›ZæÈ—uŽ¡z¶FZ\i5 …®Á,MϨXF ]?˜þ¹eÁê2Úµ›`F¨žn0vÐ8d, 0û8ñc}¹˜ÒêÚ´r‡n›– : ù:ç£@¡‡[³h=»c _”X‰D@Àٴ(#‡;7î 6Ì€U§ƒ!®¬EÚ2ƒ½$IN8þ ºô辪[¯^K6€<|øôÁ>c}ñ ؃Rм €`®Z.ÐÜeÆ8k¶ˆ@Ì.!0F&‹TciwÝÅ€7Ih AÞ(á/Æhð@„ò€³N~0 “:†D2KŠÏt!:*ÕQ‘ à"ƒ³mÔ‘.м#’ïD`@¼þ94ìà  ~ÌÀ…"[xÆ!ÂÜ‘ T 1„0Y€±È)xx’M6”,²H±8rHYDâ‰0CP‚‡%‡ÌÅ)[D¢‰5 -ŠƒŠ†ŒaÈ*ÌUŸ(R $¤8A° Š!³,¡èLƒD90dƒŽ5ÏXQÈm±`2?° .cPóÃ60trÍ"‘”³Ä,¢GÓ8RŽ#©ÀÒ9 À‚[8dóÌ:–Ü‹¸xóE%`Ô <(AãðD¢@ÑÉpŽ`L,H¸:\`1Fm€Ž9I¸°@²œ` ´€D(ó9 øB2.0P‚/IþÔÂ@9ÈÏ/‡DòËÔøÏ82 Ä7˜ÅƧ†E£ x() ‘ŠB(â-Ðj¡„O@b €ÈÄ”Ñ pA ”ˆD6Êq 5à! ‹°°À…(£9ðÆt¨à ¯x.ì!ƒ'H!ã|ÀÈ gRhÂ8° Ü)b_І2€ àÂÞ †7žPˆCB µð†78‰EPa ë…žÀ€$ ‘ " 94ã*7pÄ,aÌ` 8pÄ | )Tâ ðÆäpƒUþPcV¨Äîà(CuxPĘ@aÊ*¼é1`à š°98ÀH8n„"ø¢"dl5W¸„d$EÒÀ÷‘8! ˜:†c =ÐlÇX@) *¸a Â@B¯kÐÐK÷A%®°§_üâ«X…<Á+´A·XÂÐ=(bÔÈÀà†è"Ì`A΀)(¬pK=ºQ(ÜÀk …"‰P(" QˆD5RqˆT"*ø†¨1\´¡¿D$žÁ…*HCU@ƒ+ÖÑtdà Uˆ…á€r乸¨!P‡CÄ¢ ¦àB$"á‹´þá¿AxpŽ'€¡Z…ÄîN iˆ n(E'¸@ J€ÂX˜E­x£5Ì…z ­C€ÁL@ƒäp`XCYÂ)˜ÐðÉ¡ -©ñ9PA ¤B —Ñ‚B@â 8€r LÕ™pD1Šœá6èÁ À h(âšÆ"Àð×Cà€…(„> Q‡B¬AŠÀ("±K” _0Á(Jé (P  ¸„%@áˆÁºÓ˜ô0S"¨¸*`t Z8€•t#5žÀœ`–#à4NÀŠDüX‹,,ÏÇ2a pТþÀx Ð$@€õxE$®Ð 7@‚ °€92ñÌ` [°D$Fa|€%T`B ¬@ £A€$2‘ ÔAc ! PX|©€Ä2~A@`š@G(ä0YÄb±€„bá€P$@nPAÚ  P£?€À!X ˆC8À–X‚4¦å. a¦ ,e.ÈQn”cyŠÆ5¾” E,âKOøÆ7 ±Š$Ã]»ß+~‘ a  wP SÛ](¨ÁYÈD9°Á¦Px1 ‘0`a7˜ã ™ÈŽÁ¹a¡hˆÆPÆ€ 9"ͰÂ#2‘ pD”þ–hÂ#{…Uð`…x„ƒ&´€oPà QXL¡Õ1Œ"_H.xÁ ^Ð#ø[ê"š1@#7˜[˜°É(â Fˆ  7<‚[hå1„EâPÓÞ9O<ÂxÛ" á "E´˜ ªq ö~˸hÄä[’úÞ7¿º`Å;è1‚,à «À€ƒ^ƒåЄfyé-C¤©¸ÂH‘ ¦"" ©Å^9B ¿`$´e…1°À Ô`F£,ðƒÀÔ!€ € Ô¸ øY€©¨D RÜ`ºðÅ/,ІJXàcŠ@ƒfK Œã`þÈ ц3@àN°ž?¥Ð÷ua Mà‚œb ,ÀÐ ™˜‚a C¯hC(4±«gäNTýÆa…sÈ€8C&Îð ÷0áØ(„*†U4ãMWÇ#š€]½{íÐÀ7¦@âÉ B,°` K”ÃH`ì"á€E¸&`ˆÄ:†àOD" åàB& q‡-d¢€¨„$·Õ`á#ÓÀ#Áü›þ¬)Tô° 'À ÄpY ³ À d ÌÄwc° ÍkÐ\‘ ¿° ™ð[PÍð`0C` r`(° ÇàˆW°þM0Wà[¤  Õ3#ÖÀèÀ¾ÀFI”GÁ4L¯ÆÄøÅÀ*—¡Ð+Y °°P /vƒ·¬@, * Р-0= 6R=À À ¬ 7v( Ÿf¯€‡®Õ. k ð •° RÀ,`‰ž»¯Uó„¡ ±À)k@Ö@ 7ðÞ11 HT1à°dÓ ­îê€ Øà¸Ž‹ èð 0 ®€ÅfÀXœÆŒ›Æq<Çf@Óƒðýv€2DxàþÔ@ÝÐàÓÞÕN]@{°:-L°1WÝ_¥Ì±õá€ü Wà ßðð npð çP Ðç›­ û¾ï 0¿`V€<ã  9nðÌpWz•|ZÁ  m™`vºP/`ñoñ2Ñ¡ÞÐ5 à Z~¯À ¼»õzôÊ ªjÊðš©é³Ì€=Ð Û°Ï­­ó®ÀÌÍPÐ!p4pÉðšRðîxÄàðOßð‹> ô@ 70Ëp õ[•Ì ,Ð*€gÐ Íàrc@ Fj U §XVUàfHP&\Æ^þìÅŒ[Æa¼Å¥` Õ€ P±0l`ÅxÿÅw÷r<ZЛ° q þ0ƒ°ÀþàŸÏa0ùU0ÞÝ€þ…8¯¥ ,ðm@òZW €À.P ¾pAA°â@ÌÊ~ 1p ~ð X \P à½ÍÏüÏïüÀБ²õÄðcW¤ðáPÑoñë1à-¶ÐYsmð 4иK¯àG¬°Ž¿HÝ0x)ð ðæ æÌ±€0îÇ„ `ذ¡3ˆ¡XñÈ ·˜p„†³ 4h|@0F‘•T®þdÙ’ØK˜/ 0SQ©PºZîlù./V²R¨‚ÃCQ ݸã(Ê"KU:”I§*¦²TñD‰R•*­â€5–ìÙ8¦¢`­‚‡N›F­ä‚ ‡Ï¼qZmbdfП=8ý‰ógФ?5šÄÉq—.Ž%Iâ³É2¥!Lè†nÊ~ü@Ÿ`vB§# SHʲ3R­Ñà+Go<H€¸uP‚Çr E”H¢ŽÑêÝÜùsrNPsƒ€7 jhrkFXEP!_¾È>sx$©E I3ðøf¥ .‘"wíºpadd‘%va‚nÆAÆþXèF›mXÐÆVÐàB /thCÐ.!fa`Dšàž &ø@+ÉâCZ`Fg¤g€' É—)¦xàG „‘˜a p¢'œB?ü¨†Y²±ŠlæèdŽ9¢À#5<%+¶ÄŠÃ,²Ìšd’2)q¤¬1ãØäMôúªŠ8öàã7øØc¯V±Ì²7ÞÔË2Æi„ D%yCÈ}ƒŒMªažÍj¨&BMÓ"@M59# j¼ù` Hð\”Ð`e|[gÖà 8ŠSD¸Ä,°aî9`›³@†eñæonüP™rVÑÄkPyj«­öþÜ4ð&‡1*9À›Zdp”6x@•.:BgÐÁT”Hb´W`Amœ`E’x`;4ØC5¦ŽZÜ¥ƒt€X+2Ñ$ƃÔ8€}*Éä‰Z’ÐÈ‹<²›n–¼œi\qeˆl¸ÈF˜lD°Y Efai à‚‹S°œC”KŠ&«h£AÉB”²@«F6™ OÜ´SÏÀó³‘.öè‚ F&a$±Ãâ84ÑE»P”D#ˆJ¯anÕøyçV(hP‹ °ÃÅ*¬(—3>ø q hÁ`,‘#†,.AΫ,œZ„”gh¡EM` þ…œk6p`ƒY‡+^Á%ˆðey’ð…\´AN‚†‹r~ï$$²‰eežà—’€ä ¨@ƒZrˆÄ›d°†"8ÐÄ‚¾¹e”šáÀœp’DædX©C˜!È‚n~`€€/V¡"%ÎñF )x#<ðŒZŒˆPP |£Úà@"Qü"J ¤P\, ÕÇ”A„`@@–<ŒÀ€x(# ãàAÁ@ñU0ŽQ;MÐ@<¨q€†2¨¡À @ðž Q(t¢w „²Ñ‰ßÅ"—þ(G'®‹N@¡6C£0¤!‚N”Q±F'¸à ¦UáNcD\Úô²`% oØ!3³Ùa›à'øÐ…Al †éã™'IAQdØÃÚ˜N°ÔÜ@P·»S€†.F‚d‚9ð®@Š,à ÞðÅÎÀpÌ ¡hÉcˆâ8Ã%ÀІBÄbc8„"A nÀ‚0à†0D7†Ll!˜ÇH¡È@O˜ÇÀ kDáåp„#¤ÁJ\)ŽÀ‚2Ë'\á8G0 ÈáÓ(Ç5ftÃ\Ʋ ˆE<¹HþÒ6þU‡ePƒAR qÈ` € ÅVÑ:_6ƒ2ð…|4 müBMhXð\ЫˆÄ.cÓ‹Ðv¿H@îPycB PÆ/p¡DehÀD ê@{¨“æ Â<´Á7Xbóø…6‚ÑK•­c•Ç8ƒ!ÔaÔG|0€®àB,ªÐ†(À±Ò8…42Q…š‰@o„#¡àW”‹ÄsE Ë…%`As DŸìЦ1R.{ÀÓ´`¨ÒÊå|àÃd‡A´â¶ŽATdà O>ªx‚(IY S¢ò¼0@X¡Êœ@ã@Àþ ð9XA ùS5^qTƒtMˆ„!!=Dá ÇÃ*f@EÀbkpÃ`A EÔ Orô°…-‚ ƒ²PˆUhÃz°ÂÑ(°Á EL‘ E˜Â ŽˆÄ"Š@|âWxB¼1Žì‘XÁW4A8èpC(‘ 5衾gÀ….~@sü@ ôý„6Rp†bÝ€¸Á'n ˆHBÍXÅ*xŒ 4ãgÐÄ"Ö° eø`C*Ð ‰E¢ UYÅ.BU=@¡pÃüŒ&daÖÈÂ<€¡‰&h‚ à`ž­ &T`ޏB&þ¡BÏ`ÿ}Bfm§Í´6äñ‹fHTטÁš0„SlIÒpÄ%æàˆl@¡ žãΠ€Žld㚈…&¢€„kXc³ø+-fð t\£¥ˆCií`‡Ùîµ­Ð$!A‰1щ/Œh$Ó -üA f„¡ð„ÉÉt œ°%æ`ÜRÒÍv{Gß"p^D7W@Àj€Ü`¾ Æ2À%qA Ú$1R4¬AçP„PЄGä"zHº±0lC¹@. Y„à@àxD}³‰Q@s _˜¨0"q ad"\F,a‰,Ðx XC%>þð€üâ çh¼ñ rQa‘ØBa ?pØÖÐC ` À‚õ°€p¡€á¤øÁ ¡C¸B ‚€Üò …¸Â0 CDâ†ÈD&îàMèAÏXBHá‰LŒa|ðÅØ1€»ÂÀš¦ðD$ñÞ6db ‘X¶7¸áѸCZ1 Ä?Â`PÄf Â+ÜáÇ8†˜0hpZ¢M©@dp&k«H³"~އf j°„(bÐÈfƒŠèz€Qˆ,h£³ð‘ @àÀEXCZ=‡A "Œ7^ì—;‘/j¸D)J!þŠÔz$L;ÀƒM ƒF( ¬±<Nj„?Pi€7ä’7zƒ†¹‰€»‘)Øj8ºÀ…UØ‚x‚1¢¨…}€€`…qH…H8ˆ8ƒÀÑs)hƒePB …}‹(9°ÐA€‚Ek¸9XO0aX,P0ÈW¸ƒEÀ$@ƒ;ˆ…—9°ŠE0mXé‹„+X‘$hìùj¸‚_ȹ+À‚6ÈlHð.Gøè°m`Cø)HH€XƒO€€Ø)¸‚Tð…8ƒHx„JPHø‚€`À†P8„EH<ôªÅ aþ€4ðƒP …gPø… ø ÐÁ‹™©à«³`¸ƒ+˜º‹:Qˆ7à‚÷*F4ø(X98†E(¦PЃE€?@?*pƒU0E¸89“hO@,p€9À4bƒ9tÈ^q€HÈ@S0kƒ-…(;¦ˆSH5C‡EXth¦R -ÃØ„É4®É¤1Áƒ9(‡XøD:7T:°6HBà„F ­G™Œ=;`;…â¥x;¥y»h˜h.^è)ø@oø\X†Wø€Ð%C\ ¥\®J Yˆ€—8þ0(„ †J …5H…J€E8‡)èY0RX…/0KØQЃô†/øHˆkØ7HÈ„Jø…B8&ˆ†`€HXø‚1ð¤¹û,ÛH¾k‡WP„10C¨„WÈ„Wð€¸ƒUE }`†€€ +Hj¸HT  c…+„Yü†/ð…e¨„UPÈy¨_4„¬»ƒ¼9ˆpбg0…E@ZЖ¨Aeh‚LÈ‚r‚UÈ„ˆ0pa ¬EÈ,ˆ‚^1…-X„È„óÒl­X=È„u(Ï/pý<þ†WWX=H…pƒ%p€ =Kp,6£E$¸>KOcN=˜Âiˆ…7hƒl¨€lˆÇB€9pQ°€LBФ?BŠ“Ep„,@4Pƒ*Ø„N"D¢1á‹Ih„Nº“s³BÚƒ¸ð L®š\®) 8Vè$ðo¸€Æ €Zx€s€YØP  ^8 À€d8ƒOPª`4=X† 88B°‚(à‚PÀ,A*È‚&ÐEP*è)>j€²X#°ÊjZ0°²‚Jø%ø÷H‚¢Œ„ÖþøÆ'…CU}@x…-¨Ìeð€n €XC8f X@¨ _h3¸\H‡x…/(€È ˜È¨C>=0…;…fp+x¸H …µ+€Qø„[ƒôʆ/°„C(‡/ˆ„Rs™L°?ˆ<»=à‚/ˆ…UȰp…·…E(=°„o<kp€!@ˆ‚h*KX„X¨¸±†Xp€]²¨5.°N7ˆ‚hÈ*8HØV`aڂΪ&.p4ðƒrˆEÈ„%h,(…8AÉÉðH=I ,0…µQ5ĸ‹þ8ȃ2è#r3CÑ“0´ýÛ„þ£Àn'à x]˜‚n`Nðe {€ð… e‘è†aè€8¿0hdè…a‡‚˜Å…Ü x®‚q8¡g`‚°p†¸‚Hp†Xœ^Xh €F¤† °G¸‚Nm/@€v…$¸¼ÊOUXUP…Qx‚Wø@^ x‚ €†€Ð~Ð…€†…3°L]À–G‚ƒò²‚-0Á…`€1ƒQðƒ'Ѓ3°\ /%“þ$¸C¸‚Y¨X„H`€ ‡B°„È‚fÈ„&0;ب€h7¨BKƒ5x„CX“˜M+(„GX)†‰p(‡÷­kø‚L…&8„;¨€6X€Pð†U¨€rpE@¬SPõ’Ex„/øÏ«‹†"8Ô%(‡, µ6pJÀ‚ùäˆô„9ЂV „!ŒÙ“F µÀXHSPˆ‹¿ˆƒ6Pƒ°iNxÇ”0h$Hq >(Œ9€‚ÈÒj0”q }€€s‚`¨‚€œk‘gM¨aMà€P€w(þ†Ð (åR†‰' ($x•XŽeXNvøZ¾å˜ˆ‰dH†ç:‚ùeà8==%ŠP‡Ñø€øàÓ˜¸y"` ªaÑ ‚] ØðÛ8gtÞw@]†¨‡nxfÀ…x]xg]HÀ‡ bÐvð†dà¥$P| €Ø†Ò ‚@†1°‚÷飰‚3x‚ ŠppØ–P 3X©3°jÐP8ƒVUU¨„1І[Іtº3k‚1À²x…T‚PWX)E(„J8c¨þü’Â18UGøOõú‚, ‚üÉ+HYl8žu!8…KЋ¶˜3Ð> ƒ>¸!Å;¸„(†¨0xx2îÛŠ±ˆDÀƒÂXFéL0ƒu#ƒR°ƒM¨ãü3ŒN`b d$9d¨U @`î†%pY¨†P¸3p€[¸Zà€[P€(‚Ö¦`m؆í@8‡€]àßþm^gáncÆ7àÞqÞàÞÿ8Uðèž%ð% …"Z@渘$à?€ÈÞ~‚wPnànï ‚[è†èþ†x€Ø€[¨‡€ï °w0¸ýowà€$¨`ePj¹@…k …%˜ß(@‡ñ°RÈp ÷€ŽPP…#p†^0Ü{Ð#€˜ˆÑ p†QP‚#°RÀÆg@…r¨€ (œi˜pp€ è€ ¸n¡x[„€%88›™ƒ†ôƒRà‚R8…R…Qø*À‚¡¹±f±‰-( ýÓ"›?°ƒV8…|°OP¡P…%ˆ‚9!Ð:ðkýìÈ  2 „³® 2¸ZÖÚƒI&8‚`“1d×Þj`H'3„J ½J‚UþjПgõxÕní׎mØv‚øЀX€sØín[¿uáfoß\çq&çÅ5ñ#éçÎgÐd (‚[¸†jHphöY¨†Xøßp€ˆZ(¨ptøvpG(°€‚!†!€#8š,ʲ<›Y#r÷N@›‘Íê›É†uˆ#›éý‚qGü øâ8†!À†!Xx™up™!@k(Ž—‰™ž1#,ÕÃrø¢hðwh‡v I«€u˜\ËW°#𿆜ò.¿Q PÀ¤9‹±Ö‚2É N ƒ7èyIà„ ç±ùƒþV.´ƒs9O%Xi˜ùF`ƒ6ˆDIÈIôM˜;ÈÖÊã o„@PtU˜€zlHW'Ð …T gfpj §†ëÁÄ v %ÀSm×VuØö…—/¥E^oüoÆuPÙöÖÓÔ\_ç]`‡ÐL¢‚6Ë€à†[¨tàT°íN€g˜…—ÿ™S˜}Ú¯ýS¡ÜïâK¨P -8ŠdŒ %þ39“8ë=Š¿F03˜„A…Kh¤©~QàòÜoЙß~¤!š—þ¢‰yQ˜}Q°¨ržñ?*¿~±Þ£¢!þ¤QŒ?8J¢³Ñ Ý"c4…Ih£G~€ˆ‡ >]ºH2#© §Iþü”íUŠ*dÁ"e‰%7tè´Écâ›7’NJâÔg“IÒ¤áÃg$“vì”c¢Š6Nºus‚?X,;Cv*ÖQ¢¤ †O[>è5!‰K™- vl-o.d ( À€¶nˆ!w®ÜvïÚ1±Ðtý!xoßwïøÐABÕ—e« ªÄî+Øh‡™*HÆX!%:Ë¥Ò¦K L-°UP“&Š ;6j@ „Øh÷Ã?¬ÿ4š4hx£Aqˆ®eþxœ?qÒ²œQð@Œ®_ç݈:ð‡â0ä:xñÍ·¢ÃfP+ãÌH‡È»ðáµr¾=xðAú}ÿAÆ|øÚ$xÖÄ ' ½Þk¢”" )À²)kX¢F‡j´ÁÆ&q˜AJ‚ ˜È ýA#l´"Ódؤ†L‚>%QÌ8ÁÊ ©L ½¨°Å=Î| δp :L Ã^EÔXc ÀÞüÒB0 ¼õ–8 ™¦x±y4é"_x± ªL0J%•,C…`H¡ /ÔÀÕ\“Ù5· ²„!‹ÈA sPŠ¢`š©¦˜þRÚé§Ì! %làQÊr¯ H ÉM"Pl± 4 #àBpŒ8äŸC×9Èȼu¼KÆnŒ8¸'Á‰œPž¬¯ÍšGUGЃ’ha¬½òLjL:ÈÉnîш±å"Ô,'hÑ[+›h IÏ.[\t¥Í‘ K,qC$m(R”l‚Çœl"Ó‰‚œ´!màqÜ&×ÊÄGAœ±‰L¨3B<¬œ¼M7?¼ ‹(1Ê(‘(q!èpÄ4ì‚%XZnÉT¶hàå9P¦[ø0Ý4Ó@5ÔIðÀƒ<õÓ,ð€º°ðƒ µ Þþ&˜ðÊ*¸¼à9ÏÊA(K$€J5À`…KàíÊ4Ó aà1^8á" .6Ø$Þ‰#–€"ÌP Qy'TžyåÇœr©'b«¶-'1tú§ŸdÒIsüA{ÀÞl·ÍB„+´qlò‘q¼K#·å¾^Ò› h"²k Aî:K|³² Kt\k1xè J#—˜’Ù,!Jh(B‰xlÒˆ{¼1“‚$Rý]$’F·bÀ«$vxÃèP &à ™ŠÂ cÈøÁ8ÂD %A Wð… îÁ¤…à ðS€4% @¶PA–þa¥µEj2œá¼á _$ÁØÇ ¶¯ñÀIøÁ ¬àV`FÑŽoüàÀ,8@‹&Ü À°*`à‡g„ÂP\ëšxªU-U³8À„[˜`2(Æ CŒc&À Úá´cðV u0ÁÇ‚Ì 3 "¥˜¤L5IÄ1Ò B`¤ƒR’“tA&ÑX‰j7=2$Bb Ÿ8ËyNÛxâ‰ÃŒ–WŽm‸À-ò¹Ï,]4Á  Å @ M¬bÏx Œ,\*s H\Üà 2€'|COxÅ+2ÜŒU´ @0  Q|ã ‚ ƒ_4a2@=À)Øc¡`À<8€ {Ìcßx‚,0 þPÀd:Ã!‚\`p ¹€EÊ Î€Co¸E9h1T`&(¬A1da€È‚%HÊXQg^|"»\?qƒdT kØÅde‘ƪ€È@BpYºĈÅ1K8¢\àæ°S0sØÃ&±‡— ÀéÖ€b+ rÑV[¹†È(§÷‡†…A€ë¥Ã«qEIp ” %ëö†gÇDºHCèP±áĦ4æEpŒ”åÕ„&ô X…&:SŽÌÜ‚Ê ,,‹tCd‡…‹`Â/T %¸áª¸Â jÐH3ΡàâÀð )È#ë8F,†Ð†,Ä@ÔK‚'¢ÐSPbªüÃ}xãœü [¶¼Öõó} ÞÐ^]²¶!ìÀã·»þØØijP²Áï ¾ÅÄLÈÀlaOa.Í«îOPu ÇÄ Œ1Ü@UØDüÚ½îgÓoÙ]¯|k6´¡ [À°èðfÜØAœ‚5„€ÈX0CØE7@ \:8 ) €Ã"dÁè4Ah<TÔ'€Áp5P dBh@!àXÁ+<ÁÀ€-ðÀ@Â!ÜÁ1€C!ÜÁ(ÈÁd$Œ4C!ÈÁ1¬‚\¨A$¬Â€ƒ&ÜB54€2<Ãd ¬BèÁ¬ ÔÁdÈÁ"Ì‚-‚Ü0h‚!à@þ38Â"äazŸ(  ÜÁDAT‚ä€*@ ¼$¬A!Â(°ØÜB3,B*èAhÜ‚p@„Â!èaŠB9(‚'ƒ8BXCë!Áú”‚\B)ƒ0´%ˆÖ2µ( ˆóœ‹óàÚ¿=DÀ‹ïépÏ«ýÚ­,_ l &$'ð,O7yÒ&øÇn”Îp$ÇxLÂ%dA€H5¡Á9žã!PBˆ!`BM,ÏI@L",ÄÌWñ¥ØF‚(Âú<‡IhŒ$×&¨Áƒ:„@ $ S°B•ÐÝB&@ÈA&p@À*h`,tC30þذB¤B&tÃ/à 0C$ªÀ'È À ¼‚/ .øȘ¬A$XƒÜÁÄ€%P0‚'@,‚5`"d6ˆø(Âä€ëY‚@$&À3@‚"ø'DB3”,BdÁ Ì€XÜ4AÜ0$,)Ü ƒxÂ(‚#èDÂDÁ!t`¬d€ Á<Á¼B/HA!lÁÈ")\Á „B$D*XC¢€ƒ!DB Á¨'`C&P˜DèAdCj† ˆ‚0ÌAþ•B,”ÂSvN´¬Ê±é†íu‡îåÚ¿þIÇ s>#¸ËóX#A°ÄñðA#WôF³|Ë·»´B ¬Si8Âx‚#8‚)€ÂSN‚H£$ ý &@ ÂoñÁ&¤°Á!H$Ø$˜Oè“Q0CPô5äÀÂÀ+l†.Ã8à5„äRàB#R.à€àB%)¼‚H|Á*XÁ¬Í8<@-¸€(ÂŒ×`'ÄÀ1ÜÁ:ø0¬B ||¸B ¸‚$–Þ" AX^0P-Ü ôä`C,‚L ‚Ä ÐM$ƒ04ƒ<0¸Áþ")¸Rbd‚#là"ˆÂ€%Ä¡%˜Á/0A! 4ƒ"PÁ¬œŸ¡(ƒÁ5T€ÌÀ"\Ã`Á8Â:”f9Ü ÁX‚DÁ‚% `ü`'(N'dC6AgmR)À‡tœ wÄj%›Æ|’$„0: 4W'-²‹­Ðò˜ª1Bï”Á&ÐVì,ÏôÁÛA‡¨ÓzzBÔb)\BŒøVÔß³…oÕ'|vÁñÐ"B!¼e*Â#€„ÁItSoýV+àV@CfÉ6„¨,ƒ œA 8CHA/LÃŽÂá Œ <hþC7HÁ  ,C¤€hLhžÄ Pƒ Ä”ØB T  (‚)`ëmÁ1D´Þ,‚ A XÃ*ÂÌ€`6A d‚Ì€l9|Ü€@¤øpÀ^¢Â3ÌÀHõl&àÀdB¬™(BÔ5A&¬Â ‚&”Ã<„¸ÁƒjØnÁ(l$¬‚ ,©Ä‚:|@Àä/”€ x7´À#œÁ/,éø¬ ´aVn%ø€@ PXBÂ4ÄÂ4˜ Ð¥4ô*hu–4t%5’0ÂëtRüxÒ10¡„/BÌÊàx´JìþÑÆ¼àAx6ßé`‚8Á½‰Aô¢Èï2LKPBkTA¨R#¼ý¤H"°k@ M,WÇdPÁžì‰ðë„'y“4’A+ \Á1( ÃP, mC„¦@ ì‚( €,\ÀÀÐÀ°Ã°ƒ,´Í8Á/@ <ì ´ ¤À'tC Â2È€<€´@=”… @0tÃhÃ7Ä‚0À8hÙ*PB ¨á4`D‚‚"4Á ¬$|ÁÀ7Ä,h€P@0¤–tCtI è ¼1¸€ü€*àB°;0€ à‚ÌŒ.ÈÀ<Á(<“ÍCp2pƒ,´ä ÂØXPC‹¹Ì“Á 0œç‚PD=ÀÐ+Œ@À;ð‚.È‚ Â0°‚,8  ¤À/ Ã0ËCÃ0C;A;ê¸Â1dƒ@4œ¦´k·Žë¤67ñAÿáA1ƒ%˜k„WŒAÝÆà;¬ ÄŒ#TnIB",‹©QÁ¸Æv eòkID#Ðo+¨Ò$MB,hÂàÁû¥AuW÷s(» r»Is4Oßu³›ô¥PÂW‚¢QB&¨Á˜=2Oå(ÌD€ ø^ø;´‰],ƒ!¤Â+H|Â2lƒ0h …Eû‚ðÀ(˜… Pþ`¨‰šìÅ.ðÂÇïdÀÀ=xÀ=ÜC¸€ ¤@ÕxƒgCE%äC>¼C’c@L€Å{$ øÑ¢'¸‚5pà*ƒ\ƒ5h$Áø‚7\ÍØx ¥˜V1ÅQ+À6ÜB.$@ Ø À ·-˜Öqœi6ÄB6tÂ5LC9Ä@®C  :¬Ã`ˆá#N'dV9”î–BM”Äã'<ª6ŒÄ%¬ú4|Â+B*|þ+ü5É}‚ $Ã(8BéÔ.'\‚#\Á*lw?Çéy¾' B°à/w–0ø¦0þˆ@.ÒÁñM;xLk$¯*­Sˆ7½=›$@ÛLl"Ø)[ƒ> íú@„}Ϋì‹~2T€ŒÃ½¸a ú¿ |B‹¼çSCH°ÂRY´ÀLY%P\+D‡ @zôp¶ aB„ 첃WÄ-dyÀÂ+ Xð$•/Ÿ^]ÁåÍX rùе,v‚ ™ÞˆÌ8fm—;–D YçÊÔU\ÄèäLJ0®D @m©+§P  »†n]Öu0¦•Ë îÙ,(NA‘VJˆ´lÒÎr)5Ç“šVBæ”zKW„½zK% Ëœ9fÌhÑkFHþÞ¼œº¼á³‡ÏI’Þ8Ž\yÓž?›ãP*´åUªT• U2*ô+@¯lØèÑĨIœ]òteË–Øð°ù²ŠÊ3ƒ@ý&lÎ%!¥b•ÒB©U<âÚ¬…Ñ$êU截ªŠB˜ì„áÄçϤI­Ú°¡4g•›Bk ZUÈÍ¡-­þá“È1NÈÈl:ʸ ¨PÁ àç%œpœOHaÁ‰` &)¶aHHia€M,Q ¾1â‹C a‚].ØE…W>‘B!….`ˆ˜"€F—m`%’ae$Ѐ‡$jI€$ÆXã _Ò ‚œ ˆ¼”Iþ‰'–#Š,Ö¹dJ²p$‹;ܬ‹l–ðd¾NA«”¼ìJ,¯½ø*…°ÎÖC„*i¥Pâ˜$ÑIäõZÁ#M´ØŒ“=i„º=âØ£•MZ•ÔMDÝ„;į2Ç*“¤±Veå£ Iö•K1 @*yØWH[-’T ¦™KªØ$Ž*¶Xe‹G¥•Lô¸ïK$UV72Fˆ*Ø@äAFu4ŽC5!.™¼KL‰£•ÑkJÔhC¿/,±d>@ð+䨰ē8âàÖÆÈx˜4èP t°©`ÁŒŸŽ=>qâ¾a™3œÐþÆ CRøáÄøE¨©dt8á‚ dQ¡…s$Æ#Ðå‡lbNÐe  Ž–ô¥ê3å §›@âY” áˆÆxd•6=ÉBO(qLî Äð(¡¤ zMå/FèU¸Fþ UáMTä;&Ù¤29ôpfGeöpRí #ŒMÂØãó=(Ûƒt>ÓÌô?NßãÌ"kŒõÉju¬‹Ù+3½öɨk¶B)­_ƒ'­wHJ³áŒ3š”,À(d•W|ECšX @丄87Úkã-И´íÌàƒÓV ßl´Ì*.iE2qàQ+Àð€$xƒ.P$¼QÅ4x+dÑô2 ÅšáˆïTŽm°ÄªÀ·:~']¤âÏ&¡°®ÙLé6á>Ø!|`„áú‡ÃŽ^Ñ‰Ãæú ;ÀÊf`Ýc.s»ÉŽo`!ÓªL½j2o Ýd(#«É$bþ2šÏŒWãe"Æ$Àpˆü”æÔ˜Æ)¾0Ÿ-Ø@`§8D$–QË3À ˆ CÔ€:TÇ| ãÄ&8±©AÄP±Æý(‡r¶‚#gn¾@@Øày…Èž Tp†L`Jø‚#.шA4ÐþÏa‡6ˆ L0 ,ˆÁqƒÌ¸)(`PÀ ÔpC(  f8!-,‘/ qà¢X@Tá _<@¾ø€8œAS›`øpBœ0cÔ‚JHÇd 'ÈàIøÈ• \ð@ ŠH’ È‘€[tc Î8‚Ltà |Œc €ÁZæà–qš þÒ˜úâAŸxÔä™@Ëõ1:ÔI¢ÒeD`î”;TvúX®F¨ypŒêøhÒAæ dà”Bµ‰Ný! šiÄk‡Íp2°ë{ÃäÊÆ¤Òp Å"¤UyâÇE…Xf/Q‰O\!¥Â*„j 1 4Bz€8„ VÁ†6—Œ¸æ&·ÿbn’˜eùÃËrâ ZÈáZñƽáá?kðð#Ÿw¾"‡ƒôÎ[ˆ+´!ÒƒÄV‰ã²Ò¡(g2h=—¦D¸[',´énQˆþÂ*¾+\!ŠC&Zs)¤@Ø…—Ø-UŒ „¥I;1:¢ xHŒ;ÚÁ„† xMÁ@°à*CF7œÀ\â ,tPé¶*€ðxã ™8Ã4 $ â1˜F(€XëÈÆ3*  {ØCãðÁÍça`à¢çD8À74P[xCW8Ã(¤ˆGŒãÍ8F,ŽñÜã GÀ€T£×ÈF6àÌ(4ÍàbÑ aHƒíÆ:°Ž¢@!å{9²¯  €è>„!Üa‚'³Þá‹X˜¥t.Åþ~}Ð''1Ò 3[Oq Ä”B­šÏK9àÌ E  Á–A8êõƒhDa!ÏŸ^k Òü¾5È‚gËѬ¡úiC$*ç¢ hÐCšê– 5X‚tˆŸ5ÙÀ†ëß–.·àôà­€8$ä°†W(Á2`ÆüYг»2¡*L0( @A ˆã›(áPEßD€ßJc2¨AäAø^>ÄÌp`¤À¢¤€ @À`¶àä©à<" ÁÜÁ`(!NDÁ²àÚ°€ (! СÀ¬ À¡ ¾ fþ`¾ ¬€–á d@ ¾@Ra ¾àÀ ¨< |€ š`Ÿà¼þ”á`` î¬øi¸€ÏðLÌà¢P!ÖaÀÁ  Âb šÀ hᚬáŠ@f€ü` 4á Á¹à:áÄ ®b(Ñ+ÐA áP€LàDñ˜`ÊP€í¯¼BæÚ.!¦!òÒBö¢OÐâô¤Ab9DAá ÎÊ¡/ò‚ < . Øm½l` òã A5ú瀭ùœ ¢/×ÜÀ "Á ä@îàÄ+Zþ%z¨€ V¡x©WþáwzçWá ÈP€º¡Èዾ&v ÝöOäÐ!'ϸ£ ¥$¦ ÀV`þ-ƒn äAœÀ pà~ ‚Á Îàe´!>º! ´p ¨áxÀpÌ®à ž$¨î@ðAØ$â'²`˜€ *€¬Á¾  4 ®eaÖ €Z@ Æ@nÀ4à á>Àñ8Æ` V > \`#ÀÆ \ÐÁºÅtâa fBÁB¡€AHÁ n` áĪ n n€dÀ ^š ¬@AÆÀþfáPAÛ–¦¡aà–aˆªrà ¼ÀràÔá ¬àF!ÆÎ8\AÛB¦ïªA 6.aÍæ@¸@~<á]D!1:Aâ& –@ŽÁAN¡¬ ¯ ¨á\ :`Z¢d®± l l?xIXz…—èc™–o™Ð  ÀgÀ@Öà®@Jc E5*!¦Ð4Hã€æî!t€2À´€ÐA: "ö$¨Ì €îbÀÜ‚ZÁ Ò øËB (2B@ ÎèAl~ ÆÀ ºÀT`,ÀpàBRþÁ~A ®à €¤š‚IÀ °¡ð@ÊA(¡ -ab¢ °Áü< ,Á° ¶à° ¥4 `©@ÆÀ ¤ÀÀÀ|àAéò3V  bäà– î ¢  a!Ða n€ СMBD„ ÜÀp¼ph”a ÀàŠ  ÁæÁ,¡ Š f  ha7£ š ð°i 2ašÀ V!y¾à ¨á `á¤à €Á88õ`À ê@ à‚¡ V.A€Q°DÁ ÒDþ€! äÀLA{2 ¶·ðSV¡ºa¶òÁFßA½.àÚ¨ÐùÖ6!†OÚó â÷΀ž,V”À÷ʨ.€žBƒžÊ(ËŽ@5ÙÁœ`6B%”B#T$ ËìÁĘ ª:yÔ#UÒ& EpEäX¡¨A¦„>¤žê€ À ºA HÄäW€¸–¾` –2Aü  î`@Ü| 2 bàäà&€Áð\ÁD!€Ú`†@,!’@ÇVÊVA€ Ö@r`ä€Ƶ š@þ¤Æpv mc Ö! "èÎ Êáf Æ ên¨ Þ–îìn¬ž‚íÀàn8´Ààp@ÒVáÐ!Ð ²Â„!î`ÎàšÀ”Awça–Á žÀž`:!!²@ 2ÁÆÀ ´@t ZÕð@ ’cNá²ÀÒõDán@žHá ®@ÊéáYÖ` ž`…t¡º!xaJ ʨF*>žç fXÖàR!T zÝ€ KzÈhë. &ຊÖKî B h tÀ2à”@ jþà€ªJTõ bV©¼¡¤€S$116#6!1êEUtÀø!NÀ÷Î` wX ¼8(Ì Ì¡¤ #—Ô ¨âžÀà¼{Ï`låàî>à ÖÀˆà ¶ ˆ [D¸)c EšÀÁ† –Πx‹^!Á r`r,îì}=!ºU r@ü€ªu,¡”¨ ¾ ! ¨`¢ ä  ˆ€ Æ€ÚdÀ˜à\`"`èã`I Háèá ÜÀ÷!€!½Â! à&’R²á ä \þ(á Ö|Mï á€19 àLA¢Qˆ Ôá5¥ nã6Wä ô Ö¤9›`ä `€Pw¬ànÉÖà>à‹u`xáø¡dŠ¡œ!ÝîAiÌ3*!y>x£‹A Àiddä: cYÀ2 ¤L @ €Ø¡|h½î!1`‡àB€ÎÁÀFÈ Ü-f÷!”Á¨¡,Y  ÊA/! ÚE‚ኅö Á¦€èÞA, ¼%ÆÁœG·!Œžà’€¨ØÁ>@€ k[ FÁx`þ<` ¡JŒÀ~a²` pÀ°` îàV¡ ®Àfà>¤@À¼Á–!0[À^xÀ ²@†ÀpÙF V  žÊÁ"áæ¡ì  ÆáÆ Ì¡Fá ^a>à¨à ¡Ÿ ¼@x ÎÁAFà aÐûlÀzàŒô€ Á]Á®€´a„af aX-À5¡BA!@¦Aõp3 ¦nÜÉèÁ0 < θWá–a an ^ar™p ~@„+’ᨂ„×þ+¦{&‡T6ºžX!/ død!’A/€lN`Bda ¦àÒÚ ÀiÁª”!&ì~ø¡¢Üò‰t@ XHF †aªUfAb°u(9r@P!¸@/„aA@B! Ñ7¨XJ€—5 ´!¶¡ÒÁà X GXá @d"ÀŽæˆáÚáàâAVÕ¥æÚáÄ~Z ˜á’!¨A ~àÖ“áÚ<ˆ¦i|ÄØ}d ‘ @¤€×“ŒÚÆ!䀙AH®@ÆáZ 4Ý þ^€ ×` Ô “í જ€àH@>!&àÜàt(É^!œn–a> ŽÄ!\€–N?ašè½â’’¤táÖH?á ¾€Û­àNLª¡ª z`΀làÎà ‚'HAb^Ü*·ž ¿áZàd£O €à< Kxè‰vAÄä<v¡h@À ðaz†„""Në#:Æ ‚Àë½Þ Â(Œ(€ÂÂFh&DB|a«A‚jÁ`–¨Ár`º °Àt—` ¦AZ”ð `…b’ ŒÀˆàþŒk ^À€Z€bÄÉ ÀX!xÁ€€B ”`”ê Àôaý#@ !0šX€v Œœ£!bv€„¢êw?ØÔœAcyæœÁlœè2}’Üu`†¡£DøgèA£ Tøá­í/€ Ú{À=àþFÀ_ÄØžNh @œÞANÀ*—ú&v`ȆӋ†XÀ`Jù÷¤ ^Á…­kà81 È„!zÜ;‘‚Z²z´ ö„Z*@¤®X±òê VΨHÁbÄ„*l°àeÀ^¼ =Xp€  8@ @þÔÜÈœ'¢òÚd?X³j…@‚“nÞ5K¶l_I4áð0Æ+-äVI%õ‘[h@°Ê 2ÃÃКO@=@Œ‚†é¶à!„ ªlZZƒ=$wÄ»,‡Áê`Û@À2?03ÁZPOd¼°C1 t‚,;ðóεؾS“Sña@Â.Aâ4 !l+[TQeIN!0…bþ·[¹T]pA:8£ F Ïg4QŽÂø¡Ë‚»È Ĭ°‚.NЈ£„›µ, €7J¤VÀjás+3(‹‘(F¥ä <P@HMYÔQI-•%N;ÔLUSW`‰ef™$±ã –µ| „/D¿9”7Þ ¶€€Q€ê„ß|qE&˜ WÛXðD%¨àp!…œ,S  1 …Pƒ@Å.ˆ:êk¦SÓ Nø»@xltC£ËJF®¤N(Ã4ÜJÃÎ8GÊ<°È@‚AL7õX„AÅJµçðò?La-þzÖ‚  '€€@áÍÈëM2(4#Ð3¸ü24‚cü Gï'ö \ˆ¹/GðÀ2¬±ÆH$°²€ÀýÛDÐø ?D0I° µ/PÌ €”€#p4ìGDÀmôÈ=þR£ JCy™•jB·úA{Úë`ý @¹–+áðJP¿ºð…õãx ¤†M¾X` Ž1ÀªvµdíO5è†7¾°…/0ÁcË3\@B¬B)â‚)Øï `Á#òV Ú5+>‡"%q‹€.ìâ‰ðy…Ëcþᦀ€ @¤3t †ÊGêŒñŠTÁèF);8èÀ;d!­LÁ¼{‡þ"À‚–€Àˆë`Mä¨G7ŽÀ“ŠCQát±ÂÂ9n ?0Àը׼ 8ƒ4Àv„ƒXÖðÃ-Î?]HÐØ£âè”$À Æñ$( †/¢‰¸êqs @©´˜e°JIGñZøAÅ1®~/0¡>Q¨B܆.ä˜P¶ôG#€pMQ  J|ZÍãf† «  P:tC ¯h‚  %m=>|œÄ;BþƒÂREâÀ‡NuZ4œI@éZÖD4öh HMêTÆ2„`E4P…’°€•)£š(ä°† (C ¸Å-  r¡'D†¾Á3'P@úxÁ 0€$ê$€Jà‚ˆãF €Ô¢„¥â”q[h_ñ*ŽœCø@jc@Œ $'s½zÀ7”a0×(Â7x°P#ªƒÝÉÜR§ÔB¾PÂ|á‹ZM-$Ía`ƒ'HAß €/xà‹ (‚9J”¨äNœâƒhAÙ“' ðÜ5ùäºØMÇö1'ì–hà ¯x‹VSÀUu´B´\þP5!wc€ÌD \X! 9øL€X Æ@À(\`×t$Á°@€tàÃH –á‚o0€Áµ(@ƒâKi-û(Á8` |tcÆPËÒ'T0°0N‚P C¸àÚ,@OÀ`‚ØX„” á5¨Á-”Á¼à/èFd¡‹a 2º@Æ ŒñzàçÇ€^» 4p.(P\P³¨…7ö!X_tCTôØ ‹€}<À²À¼U” sŒ!À€A5ž±1$aµèFœ (!¨Úõ†  €o, (cޝ-lþc, À… ñ‰ÓVøßÄ‘Õ.øNwvºk ,”¶«Cìb7)MBîx‡ Þ ¯¥ã¸Ñkë>j`¸XpF (hð#Eüˆ/X€&áø€Xm8ÁDE<⡌sXNôêAy`¸‚ Æ‘[`µøÅ70|£ ‚Jü"IІì‘Q jÚø÷Ìq”v Q#f4”Ȩ“9€ìØchЄ– ˆ%Tc@-PQÁˆ] Œ¡€.@/PÀ/rá_ohÀ õø…PÆ!{ðÀô°ÀQΡÃþÄÃ=pÁ @&w,¼£(£å¸À/|qv$#=(Á(¨¡ eXá Hð*j  ÈãÊð†å|€ sœƒ§±Ðâü èøÙÞ°-ÆÆá'1 òxBd ŒªBh>ZÔ†›Í¢1à›9pÁJ`*iÃòð†d`ŽxØåDðÒ4Ê`¦€pAŽ´7Y€½×†ÈãA6Yópí ®oäé+[À¨3o ª#/b£?Ýé"†Prp…×_õ€ÀÎ0 Øãÿö0Ú`þóÀÚ€ np-` lÂCµ0 +dþ6D ` 0hp´D`ó:8‚0ç÷   Ú0X¶P ÀdÀ°sE f§ @`Pà ‹ÓÕ` Ó` àÛ@5;ØÐ uÐ A€ uP°   æ ó k'#ø€ `ò€}È(h£0£à£ óð ö`àõ@Áðz>  ,èê@9p¿@`ÀãP–00 0ó `  öЩÐö _Åqß IcÛ·8m.àÁ`QW¯w2`‰`p08FßÀþuð Dã Ô€pà 0ƒ­sˆ'pö @}F>¥v vô`Á…Mwöp€ÊpŒP‰ÚP9ðxÂy9° J¶1Õw59T90Š€¢ º<ç0'° ¯0c VàúÀA€° @IØ3à¿P9¡Ð L€™ð 9`>ÈN¾€ Ô°4 •Ö€ MÂ0à L  >3 ÀP3ÐÀÀÚ €ó` Ú~ð“2Oà õPèÐ³àˆ ð š…‹pQ` X K0®€ë°•ëÀà5°Øà³þ –~0†0 5ð ·` LÀ’L0 àÀã Ú  (` <™—0w9c`EV0Â0LÀàp £0LàÖà’3>P£ ùÒª mð 0rÖÀy‰ 3ð ó  óp™° ÖàƒópÞ `C¿@#­QAM%〠¥Y(PL£ Ç “¨qÞ pǧáD@xñ >0(”¿PœÀ© ‘IœLÐD@aÃ&@Dî`g`3ð-‰˜ÚÀÖ030Å©Q3bv' 8vA7¤cv¥gpyÁ ÷ˆïÀSPþüÀ g° O° cpr@ðÂòÔ X0HÐ_ HPŸÖ0 80T€3° †ÐEñ«õ _À€ð9 šM@šÀ(À_ V_p¡àMÐ ¡`ó© Çð“šðLð £° _0À™ ‹ ¤0uP}2paº¤`à1€« å ¡‹@ ä dEàsc€ÀÀ K`«0Q`š~`““ó@—;© HpØp—ÚÀV w° Y@¤¦€…éÑ ˜p ‡jŸÀÐDPÉÐ 4ð :p¤@ VÍð è ×ÀSÚþ¿0Ð[ c€? ¿›O€ ð¿0ã - g€Uê’H0Ò àÀM™~@‘ððßðh€Ac®õ  c €ÈīрP¥a™£&‚ä ôàíðOð2  T@Ö€Àp Ž€Ä)­3¢Ø7 R _@ Œá FPõG£CláÞ@0p>qô@JqÓ0¥3ö: €ÝðAg p c€ÈôQ_à¢À±Šc° g@Zÿ&R° _ Œ¯wM°¦X€Ø€V°X T€ \p°®àQ€1àCþY ` màS›>¤p`H` Y¨ìàR` QÐXà –àè` m0\°Qà™Ð Dް†0Yp´0 V …°[«…pzÀ« «€®€°™ð«c¢  k zðrPW°–° Q T°¦Ö°‡` SÉ% ð`P ês7pcঠఖp‘ð3·Š` [Ž` 1 R° ¤° QBcHà ¦` Q•‘`µC¦r@ ù£ ¤é‹Eƒ ©°•@½T°«àÇäþ[0Y° Ž0&ð«ð«™p¾`äIR@g`ͰKà«` 3`zPºŽ rÀ€´RðͰ ¿5Tƒ@Q}p¦KRpÁð$êW²¬¬¬ V.``ð/  Ü€ ¸ mðÖ0·®0ƒÚz@¢ú‹W0Ô 4I ¶ r rð…À-` w`\à Àà z¦ T « [Сp ë®à \ w¾z P –  º{ w¸Ó€Ó€ ¶@<@¶±0X°žQ Âà‡° ž ¦p––z`þ ³ ¨c°s³  p\0zÀÀ”pXp§¼ rp¢à M™„«È7‹QpÏk `ê=» M dÀ€ Q@ €ÎÐ÷ [PP °Y`npÖà7PP@¦@ÊzàÇÐM€ 10Ÿ‰Þ° • ò¶°Oð rPw°¦_ð\ r1pK Cðœ…@¯p¸à }R°ÀÍW€¡np3 Ž0º¦ ‹ÀÑé#@%À6Dp«`2p ž` À 7»À0`ÚHà`` J{¬2ä;âS¶IUuþz€½xÕV²¼)pÜÞ£0 `6ÁÒ /P ŠM ! 7=ÆÇ@ÆŽ ñG[¾'-À» ‘p2 ¦\@ºrà \§ ‹àŠ 3€ ` Cà~p `0å Ê¥œ¿€ €Y€wÛÙ ÖP@ñPÍèp¸Uà 1ÊÂÐÇ?ÁJ ÓPÏ ¨M€Ö€ c`r° w0ÌoìÀ Àm wà~ ¦ž01}Y¹J:¢¦°ž`Êz¦¦ Æ`°üu-°Tp¿Pv…0q›Ñ7««àQ` þù<ÉÇPß Tp*ýŸ‚.€ « Ö° –@ r` ®°—Ûn@ ‹p«`_°¤€cä€ÀPg“ À[Çp!zR™tÜÑ0FÀpFОû•nŒAÖ뜛»W (à –- <»ƒ•° ©@Ôȧ@aF7UE¤uç€æjnú@/3R`?°5?€-²kä¦ ã{-ð `0 €rðDÏg@ ‹0E``p¸7.ð0{`’™ð&Àþ½€ÀÏ ¢îàDÐ Š èõÀÊ 3ߪyþ5@`° (¥wwpQ«ÀI°m°‡à¦€> h0 ¦ÛÓ àŠ'x·®ÔpŠ€¯`>@r°¨_ú ¬<>‘PmPœ«ÀMú š@¬¹7P¨Ž¸jt W°¥±»¤€Öð $pÅåâ`¯ 5°pgà‘`(–0>ðÚ;D›· ‹¸€7³[¸€4,5é€ÀÙz€â¦¼Yð¹H\»Ô0Ô*’¶pÁÐ|〠•  ŠpL n ã°€0gPÐ üÞvPOðI þ`.ÐWpUê«ñÚ„r@ãœÚÐÍ@ % NÆ~qGÉâg ä‡g ßT:ƒÃ@9q!²NÀÐ0Q ùpÄg€¬P )ð 6Ð À)È’ u)  0#s“’ „Ï=°R@ ¯PRPf€ WpŸ û4ð$ða n@ çð …p©©pЕðø«€ ‘À4Ôà©@ ,‡ð…ð© •@µ@¿@ €p© Ë [ œmþpý!1RpgPlc*ˆËàÁp±‚'þT¢²’’zupÔ©¡à©e8tÃa(œ.VNx’©R!’Ôˆµ¨´FŠŠW6nÜXóƲgZÈZ0ÀJ!)ˬ%¥Åƒ¾ñ0$ç—Ex`uÇ“§9†,Ê¢ŒÇšedPãA-On¬Âu¥RªÔtвe¯¶Ü°IƒxR¬¼’BmµJrl~¹ÁÁ®WÍÆ|aðäË++ͤŒ `åŒ}¤^} °lM!R¸ @H§Á›¯.l;öiÚ´-t `,œØÑá݈ :ìx¼Øñ»Š©HdD1ø!ƒ²7yØÅªÇ2ŸÎþôØe€— Y*T``ñÉÆ™»è.Kу—Y#Bœ¸çjH0B–3TèA–ö>Y&T°¡<ð€CA  0B…eJè¡UháŒeZèE‰ &è†ORQáŒz©ëv¤@æ—R À Rº ‡3péfH±!ŽÐƒ>Èá )r fÆ¡À/_Yæ“+Rér "`!„Œ8¡&)—a¥=@R9ARPšW>QA¾TR0`ÄyBŽ/¨ùD+*Ë! 0Ë(°‰Â‘Žq¤Ò; ñäŠ;¬¨çœW¾ð铨E š¹/κ3ÎH)X9þNdiA‰oà ‚`œX}•)p)”å H‚šeV•õŠ>!åRœ€ …eƨ‚n| 6 €Ö]·6wuÑʼnq°@Š)æXÙˆaŠ)Fb‚ ŠÙŠÉ‡—|ò¡ d¶î„x‚‹da‡&ðs‡ï< wÁ`‡daÅ€&‚ ð(VXȸ™1Àà&pF‰<ày‚#Ž˜à^0è%á]H¡( !f^J(!B8%¤¸'™2 Á_ `%€_ `dÇ‚ÓXƉhÈ tHæ&þ ›†^hâ‡q¾ùj€pÀáfXêAð2À`ÀŽNn—þHp9=ZH¡izØáb à“ðñ&)phaè9G‰/4©À&†Ç,`â *pøâ ø—žÎxbœH|ñ&bxa…Ö’6€•5æ„_xÀ¾ 4ЀrÀE†l!àœàzl@[¼1ŽO"Ì`.Z/ tÃõê†|Q‹`µð†7 °Á º‹6 ¸vvC ^¨l ô(†,Px~ð#9(€€° ðƒe {2$†€¤®„}Èx±þ]ÜcÒÙE<À‹ ´éF(dÑ )œ€¬PA,Æ‚–…`'`EÙVĵ#„@4 Áœ1F˜L:)bœXЧ!z ì(£rÀ „ :Àc2ú¨‹ôèƒõ€3NS‡•àì[¤"±•ªà–Û( ÔÝP@7~10Ã-“Îdá3…€#¸G”fšÑò•»`Á^Ù²€ÀlFP[&°¸çøÅ9¼¡Œ(ÃõІ`s ã€<‚á £¸X€~a‹sÙbF8'=îqç‹=TY w°h`åz€7P‹$þã9ùFP‹€ 8€ÆŒ(ÍÓE¦à„u!à øÆ9œÀÀ7v%€oÀ¤&õàiÌá„M²í ²ë+ÞŸOÈB p4À;xñt0ìÀøÁ ~È«G=ê~  hD Aˆ]XLx4.ÆDà; =¦àzŒ€?(4Îq†ü SAS% ¨ÂêPu  UA!p |á/fôâÌAˆç©Sð€*JЋ{áGSÞHà (á´1G=nãf8Á ÈX)1TÑG%`à4ð;2p„°þÃJp‚1”JQ}° 7/ЇhÃz@®€ "Ђâ°"ª'øA2"àDÈ€ TiÐCª> /0°$uL@ÉÐÁÇŽP‚ÜC]HŸ ’€ Å8l nP~½ÒÀœê'h\•ÔÀNˆ€° V胋Bð@ùLBü0ÞHÔBЧíàиvñƒò¹ °…-4ð$á¤(M)mjâ<2M *Q§´Ñƒ? Ádx€€Ã¤¼ XÔ¡Ìø1¦J Z`ªRUð F høKêY°s§Œ þ…$"P§võ¬ÐŻƣ9ƒ÷ÀÀÔqWu¨ƒ ª  1‰ÒƒÿŠ@@P!YÞCéõ›]½!Kq€[´¡€.X`ŒËß îd¥°%°ãTP‘/þJ€} ÆpA0¾¤zÈK^ßpèAx Ì †wàT@.ÈóŽM^€@ ôˆ+1ð|,> ¬ƒ|F¨Ç­ÄÐ…,,úÐ Ä‡à † } p[,€Ò€S§@ :Ÿ€Ë¬û pÁð Dñ…ûP X“5 pÁ¼AAù%a¾¸X/z±‹]\àþ$/ùÇ0€€~‘Â8ØÁ”n  €9,À‚!!à ß)Há'tÓÃÐ2Þa°]Œ€B 2’®€ ¤ÀlQBÅQ”N‹c èôº°C.O{úÌÆààƒëòöŠâ><Àø@-JpŽ)Ä-Ú€€!GÍ '°BNxAf ˆC¬áF8„>A€Òû°@Lä Ü   @v@¢ôÅ=~ñ)HÁ ¯ 7Α„Ào™xÂ2*!|, kþL†2àŒdÜãgÎ@Z`ÍTÂpUd8?H°ƒô°àH–¡#,>,v¹î›¬ ÅËà‡b‡às‡8‡€²…|€‰#¨`Ö9Šs€b ð•PvH†ñ0¹¼g¸€(ójÀÐ`—È1ßPØ]¨ƒe`³Cfx‰­›Ü Ÿh2}` ¨zp€¨RX¨ŠJ‡œ 'HŸZ؇tYøqQ¨‡n0‡P€q0C]hHx(€ˆ\€ظ$¨/,³ýy€‰ãx0XÖ!)R€„þ`€\£_X%ÀopÀ‡sà»$ ÄZK´¼ØNúÞ0-mØ ¸  ¯P+ƒW €(!p_Й{jx“(©Ѐû †pP»³E%`<ƒC€c0>|ð…¬…`P\X@øCoøŠò€¸Ÿ™ÐÀÒ À%Û…Ÿ‚èYª]X‘`‡þó)P„WˆŠsg “‡npoÈ8ŸèÛ!Øð†A|(èðл`†€$ø…¸ž„B„ò' (gÐ HIŸÑ8#È\(€’:€þ‘’2-wQdØ$0„JEd‡n¸j‡n`2܆ðƒ,›l…:- ¸@rp„,`z(`T ¨&m e`{CÈ…oؤp‚St @† À…HXh‡ ¬Ú“ 0øs( ¨{ð¨o°_`[¨_Іoh‡v¦0 €zð¢P†S—kz€qð†{³F,€_HcصàmÐ…_àˆ:θ0 ƒC¨„ÕXŒN‘¨ ¢‡/Èjø€_0¨ó9\ø… o {è'àKh»W0‡½\"¨¨þ…eƒhE …0‡è™3R£5Â(#ÀQ‚d8˜{ (GVhGñ!r¡D¨„WhND¸¢àÄÐP†Ð0“š/Áo8o(©8€”o`࿜¨À>D€Ë5 hI#¨¬ À#gè#¿ ?ò…(“©ØÀÉOµ›ÃeÈXP€:Xƒ1€Xm¨ dð…¸j*ZÒP€r˜…Y€XR0^”Ű²œl²€y8_¨mð´ì? ؆mÐlˆ)Іq0e…z `e{¸ÅAþ&À &{ÀÌ|‚_°€=S °eøm-gÒ¹o ýT`S@U e‡¸á ¨ÐI=;ÔqPH˜Å`€TÅEH-¤‚BРoð‚Qà¿ø0‚걇>µÕ URèRm˜  T{°‡±OH°‚yXШ+`'U(/v o(4%¸€{`0€’©š 0‚$*~¶ §Z¨Rà €ƒº°oÀ&à€y0m(ÍŒT†z¨s¸Ôð†$ðxHÀ R`èÃkê©§Z¨Ñ ZÐK#4¡!þ»pk²±_T¸r€­ nÙÉ9•‚+@†Y˜T…Bƒˆ… ÚXðƒ[Õ‡tyè†Xxp(˜†EЃ%a`&&@kàjpÐkЄr¨n€¸…jÈ…[h€j¨† Mx„µ­mˆkl Ûh‡ylhÒYà€[P†[x†ªÔ°‚L¨"аm¨€²­Å‡±µ†`€ðÆõ`ˆ…"p€"¨?H€ªÄ 'XT£ (CXhBmèe˜Õ-„(‚g¨XÐCˆM˜…oH‚Q(Eh&H‚$ ‡ `‚'àþ/ps\p¨€_¨€´†/ƒ,ðpðƒc`‚Ò8† ø‚C˜M¸ƒ&@\*ù9(nº |e’>h;aƒ†r+7f(à¨r}Ø8À…Bx…À“’Ã@\ ø\¶EÜqð¶]Û_ðý½'À8š€Z0ŠÕÈXR!‹qpûÇ Z¾|’`€¸a¸P/€eÑ€_ØýÍÑ5-—Óºn¹,…]MX`(‚8‹ÊhrP‰¦ ?ЄT(‡r€„5(‡h‚Ýέ7¶†y@&˜$%…ؾ%nˆ…¸…kˆÂfþ¸°†ôe@a˜°ck‡à€j¨ºåÆUx†"H…Hh†"… ЄÁ倱=†¶­€ÏµkhdTˆT(?@Û°ÇE…nÐf¨dH'-dІ$…€[(ÉÍ+˜\eð1@MP†ìU„Gw8@È‹3(wh`‚ °†ÀÕ&ØÓ¸`ßñ …²m_E¸qˆ‚CÐÅVe‡•Ì›Laù‡ZpnJ‚ €}H‡ ê H$˜·8à`žŠó†°…HeÀ†;Eh¨€uþ…ÒÛÙÐÃþiA[¨ý:€ZÈ@hD úʼn{‚'ø€&,x„Uðéqh"0_çvøjà?íŦ$æYÚ°A' S'¨ƒÄ@tp`Ѓ …1(Cˆ‚E°`H€³…úù†â5?€²^7È„!ØLqp…càOhæ¸G@‚jH˜Ø€ RØ€>æ†È…,XGÀkp„(`ã(ˆ†(XGði@‚gà$อT˜Y¸…,È‚%?ðXX?ðƒ!?`$‚r(c†%XC°ãZ(І°€_Hd¨‡nTþ$XXö‡1ˆS°†ºÕ½µ‚+È‚&é-h#8) "Ø‚H8""é8(†½>$0…BÐÎF‚cðà‚%ˆl€{ïŽW€pp¨†X¸aT … …k‡X¨†[ÈRmx¨c)Àm¸0¨B,€q°Õ.]°EÑì¿Pv(`à?†c@ˆ†ø_~E–`ø¢Hr U¦Qp9nŒÀÿ”R ‚3ƒU =ø.ø‚1QÈ`Àÿn{ @X€™L©^âÚs`'À@¨åæ€1¸M€þÐ`h=(kH€0•/À+ÈT†,¸(9O°J€‚áö„,È„¯EX…­µ‚EPlm1HZ …hXìX„U¸ƒUð0°Ë.„-7@TÈ‚1ˆC€«´Êµ$€=0,ˆ…(…u€‚(€‚uØG0S(G@T¸E=ЃhZp€3&j0CÀ+€€q †T!K¨X¸âX q†Y¸o×9X„Ex"ø€J°‚Qø‚JH9¨„+x„C "À?€ðón‚/ÈÊ;Ø‚ Sh.ˆ‚/X„LÀ‚þ&ˆ=p…%ƒcˆ(˜¨†lð„(@C@Th†l@‚k …i°†E IY‚/С6=l@À…$Øè7»¶8ƒ·)x7h‚!€‚%X…EˆaÀ,Àv̆/h‚ž€e˜Ár¥Q¨‹3ø‚O¸­ŠM‚Y˜OG G8Op„%àSˆ‚uX<ÈH¸‚+ˆÔ k98ÏIÚà–ºqÕ:ƒ[€ZÐuMà¯%ä(ˆ‚X8Õ'¡+h‚,ÐKàr†!(üÛ.xZ^zlX¼X0(„ó•ƒ1À¸èÒ1@÷jàêX@‚UˆkpèþõcpHÈW‚U˜+€MX‚Ep¸†ºõƒjȈ5pmOÀ†L¸*¸‚Ch‚&.À‚-¸`˜KH|0h‚X˜Øˆ[±nÁ˜qæ‘¢5€Ülc”cÖà€ mC5kVÚ4»IƒfrnhB'‡K•¬<²´ŠJ¡UgLœ!- WÇ,9¥gÑ;W†,’sLØ kYňqǶ`€kº.›'7–²Ü¹Sn‰GŠ€»3¤‰%O¦¨lY…K OwVÝQÔ,Ç\g ­zHÑ—/‡RURj–À‹V ã)ʪŸ–2YQTIÉ!@­YFjÙ\üþª¥BÆ—Wµ ZêTY²@Áâ‰K9,¢Durä¨Ó*†æ=ÈáíÀ¿ @@7'Ò!P¯®Í ')Ö<{VAÙ9Ï”¹9£J e~4|Ó`Ù+–?ÇÜk$7ӆܑ£íK&Qhãˆrd1†)‘ÜF8(²ÄKÀÒ@. TC 7c´a ÀPÙ"Âp±È"Çø1Ä5©¢É zÌ  * TÃ8r˜2‹wÂD$«ŒƒÍ*–Ü‘I4\Á“"+  ¡€Áâ-ÐâG9Ïèq.u(Rn,ó‹>Ì€Á1úÜ¢Ì- qÌ!Y(cÈ!58à&ŒòþD,#“ rÜaÓ/£`ãÊC á†'X,"T!‹ ÑŸ0CÈä!à‰à ¡hãÊ5è,qGHd¡‡0Y,âÆ!Žºj4á‰.Ífê#34ñÅ(á 5•, ™ŒñIœY‚MYŒq¡G6Š !Œ#]™‚0™èKrÄ 2<ñ óË7ì¨ðÁ+€(QÀàÍÍrÅ 1„bJCœ 78Ž¢ÀhÄì„2ÝÐsÐIçDuAðƒ. àbÈ È£Œ ¤TòJÈŸ!…<õxó;$<ñ ÔH*¾ ÀéÜ`Â`XòE4ÑÄþ*rlñ‹ FÀ¤GzDK9³,Î5³$ Ì7,‚Í1n,âÃYDxøà Öl†.=´  (SÃPÉÔrÅ#¼²ÆÜðˆV€aŠb]óÌw 2j(ã:\Ì€„'…¨uƒ'eÝ$RŒÉcX2Æ8ÍBE=0 Ì,M@¢‡ÍÜáƒzX *šd‘ÉDH°…%V|ðÍñÊ(Â]GÐA |q…5¼V¨Ä d @\áR 0äpˆ” –Xà ²`‰BdE‘È0šÏPDá zø‰#Êa…;8…0'^q†5¬B ŸPÄ*ð €Ë(Ä xðŠLHa¢‘.ôBNÀ‘T€"Û„_¸@X@rlÁ ÁÊDP"…„b †ÀØp ‡,\#r¨B,î°ˆ(DÁJˆ‚!Ha  Þ Á+¶°…O€¡J 5d`…UÔ!¤ÀÁRpRHAdíª„ R ²xA€0ÐþÄ,‹a`S°)V@€b!` Ž. 82X€-@ )ŒçX€XA‚t€$8N€°bÅ(Á\À”ÀIÁ#xu+È¡ DhÆ6 À"uhÆ„A‹# Kh†5°Š1„‹E–ÛЃ2”B€(CÀ…%üp @X¡Vðj‘ƒ'xO%*Ѧf¤b "…&@‹"T#å€A!ƃkdMøÅp@¡8¤ˆW|"…`'~q™x©†à@,j` 9P·@cðÐ`ˆg s¤0„þªjå(Çmai%E"“ð…BÀ©Ð‘8ÎW°+&ŸA ^ñ Î.C Dð€^ÑÈG,£ Wpp;¼A@ O çHÑŒPƒËŸø‚ l@Ç—¶À¬Ÿà²B¡Rèyºš¨†!6fˆ/œÁ¸‡/B ƒ/xC _hAø– $p ÖXœøš¡ÂQ4£RhÂ<,0Š3,ò4š8®Q\  Gb+æEècŽÕÀ¼á  <À˜ÏáàS`E P ~L¡è@:°ìbÐc@¼Á @£‚/Fñ}( È€,6X`£ Âþ·QqL| È  @/d±‹!¢3‡=* ‡6 A[nÀ&5~Ñ<àã]@x€‹°ÆÚÐÆdÀsØTõP†=f0XX£~`Àµ€_ÜC:È@ ΑxÉà JÁ/žà†J"3«—4@{øâöÀ,²Ž@MÃBÑ„QŒÎ«a€p?>@.h …€‚"ð‹$øâ OA3´œàƒ¸‡7êLê{ü¢6B ”0€hÀOÀ( ƒoä@ Ÿ ÆhðM·)Á÷ð€*¼á‹Z´ÁàŠþ@C >À…2Ší‹tÔ#£P ŒS8 P8…(Êq .ˆ À†¡:!9`A"ÆbQ(¨÷C€8À¡€\àΘb]dÿÛøºÑs< .à•°$ð`˜S/òñŽbt`Å(+8Á;ä_1¼Ã xƒ1€7䀨ŸhÀƒ|QcuQ7P@0(€(€v ƒC=(ÇÊ$uC¤Ã>C`Œj¸ÝA]&Æ1Xà Œ5(Â2HÞ9@Â,€xÃ/Á/ ÐÀ/XÜ7´‡7<*DM¼œúþ;(|@2Ѐ â„=À9à‚–ÀŒ‚ ¼ÂøC-ŒÃ2€¼X[á G ŒC|À¿ @0àŒÃ>ÀüÂ/œC/ýÚ|@ü@à’@ÆåŒ”ÀÀè@«é@”€é „àCkÀ7D` € |C ØB¬"øeÀ¬Lœƒ6ÜB¸Ü5øä\¡Â5\C,\ÃB :ˆ(œÂ)”‚(ˆÀÌ(ÌA)˜ ‚hÁìÆ9‚Â%tã%\B)<:_'t‚ÄŒ@÷}_øMŒ9(À60,àþÂð€qPW€øB" €@€tX€äCþñBþuÃ0äEþ£1@@0X@c€0Ö°3¤_=œ?è4ô‚.@à ðŒ€.Ȥ°³µ@€4°+D¼4ð/œÀì+°€@ Œƒ6dÂ#”ƒˆ0œA!<À¼(Ý9 ý=àƒ*è€3”@( à(Á/AÌ8pÀ5ÔÁ C0˜à=„À=L€3ø‚Œ`ÞÝHHÁ/°å(Ü€"|‚3` èê_²Ã\˜*L è€/ÜÃ=|@ôÂ=|ŸЀ™i€‰^,~€ þxø‚¶Ù%¼ŸBÀ7,À,ÀY@hÉÂLÀ”@ðÜÃ.„=$øÂM¹¦ä5,5´À}%A¶%È”8À*L: Ã:¸tB6ˆñ=ß<žÂ%xÂ:Î\Â$˜A+Ô§4#hL Â$üA#èçú'9Â$h8–ƒvc)HxÀ\À8ƒˆ_u8Atl5B|ˆ¡P)PÁ"¶f±yC Ô@ ä7hd>¤À¨ ƒü@ äBx êAÁ ¼CŒ@rÀjíÂì‚/Œ@x+xÀ°‚þØÀ Ü@héè‘ÈLJ1ÀB¹ÂpÁ*ÄÄ 0âxÁ"ºð€ÈÝ/¨Ã=¬âЀçaÀlA…ÞŒ0,BÈðš¸Z2<¦âÃÈ„ŽD$ÜËÑA$TÂ(ÐÀÐ œe2A…z€dŠjd*ÁÔÜ”€©V |$tÓÌ!!€V*἟-|CøÒ7À€¼Œ† œÀ „+'ì‚\€,„ì@€ <@0ÛŒC#Žá¼Ýš„B(hÂ3LÃLzJƒ4¤§(„£4(¨”£ÂjA 0 Äþ}jÁ&ô+#ä+¿rB)p‚‚j'pB 4,'”ã$‚(€6‚(Ì0æU¨ `(°Â ƒ.àBB*Lž- !)‘¼ü*xÃ8Àh1ä ¼(uä2h$7h5Â' C7À(­(¼ƒ”:k %¤€,Á\ku\ÈB/¤@²tÀ.t+´ZØî‚“.@ÐâBÊQ,‚"´Ál0À7 KõÚÊ @-P¦3|ß7…ª¨ö€PèƒT*à@$,Ä– ø‚*ô‚¨ªBÕ.|5„˜4¬BXÏõB2š$ƒè@Íþé8ƒ¬:ƒ…é@…òmL@HæH=BÄ¢Û-:¤ |ƒ/ð€ @'À'dBÔB- ë,~\@-A„€³v+()ü@0ðŽé´ÀdÂ+ÔASŒAð–ˆd#¼'(´‚Ä#0Åê§ÃBlÃB9,Åš l¾JÂÃ’Aˆ#Ã2,Ãê« þÎÁ)0 hž  €úupƒ.P€üÀP3l”™P àB€Ô‚}ñühp7 Cä3ä9hd7$+¤À‡Q€í8 ƒ6 Ã;4é Toþô€ pžÀÔîÂôBtßt€ t€È„@D-°Bœ@2¤À*(Âpç<8ÈÀÎ=€-$ À@` [8CdŠ*FæÈBˆŠª7($À(*||ƒd«pšj,@-^A&/#¶Æ PÌ®!+”ê7é@/8ƒ„ÀeÒÀhÖ®p¶j2ôÂ+>Y'[Ú‚n. /!{°ÆàBÔB{À>D€XdiÀÜ?ðƒYî/ŒQ÷ŽC0Œ¡-| ´ÀÞYÞ2P2âB ‚<…ÅÜÒ[LÂ$Ä‚Ö'#8ìÃâs¿úþ'ÅR,¿6Âþ*¬$Dl 4'tÃ*l´Â*è‚( C4` €x°×CpÆà (èæ,¾¹Ô!2@68@ TC l¼Õ7äBTCÏv3B üB=0C=@æBþL@4óÙò‚ °Â=ô³f@añí’@1h&+ìÀ’"õU50&(€ƒ+”uTäÀî.€7\[kæþ´À5½5,ä8+è*#Aoü.ˆixC0@ LÐCÐÐð=¼+€@ì@°C$A0œƒxå2TÂÞI¡ ö€~ƒ ƒTÃ¥Z9”C,4„#ëëCßï˳<èC°?spÃæ3Ä0Ö£‚0¢ƒÜ„\4F«ŸøèÅp` ‚œƒsh€7œC-h@2·Ý02TÃ5pCÜB4@Ü…ÈH.0ƒxóÃâ@80Ã7D¤èCðÃÆ$?@è Œ€,0C @@CÐ1ðC€@ ¹Ð?€þ  LÈ‚8;ò<0¬C DÃŒÃ9øBWæîk:ç0"@îX²®*xÞ(d øÂZ~ù€C!tŽ $AР&C2°ƒ,ÀÔ"ßø‚µ=€®ž!ESv¨‚g÷ifªƒ—zÀ( ª:x ªƒäÀg€ð5¸Á+pÝЭÔBÙÕ&sx¥0=@ |Ã/ÈÀd[ƒ¼€ €.°œÃ uØD†Ý9СFÀBÐm/1 /š:(A ØL0|C”pÀ‚ –`‰ˆ€yëˆ@9<8ò7¿NB#Øï$ܯšÁ ì~sÂ$äwÃÞ3Nð 4þ‚)`Aå`6”CwpJ_ ­©)´@·}|Àø5xC/€<ø(C¼ˆåDE8@Ü‚6tì(¤)¬‚k ‹vr d u(Éþ+ÔÁ88A@€ŒÃ>ÔÂîÖC=üq:¤ƒ10^ œCÖN€.°Â2¬0À<µ5á @-(Áð²G0ÜÌ$ÌØÂ|¾€0€ŒÂ/ˆ„½Â3q@p€ À€:8ºpª‚Â/ Õ€-¯(ÁÜ¢7ÀÞÿÚsÀ+ê=nƒ-À/ø¬3ûmëÞ©±„ËÍüŠü1ï&?Àfu9þ|Š*|0xÃ/<Ô\lÀð¼ÔÀ/¨¾<¬ß½@´6š‚7¸À°Ô ~Â'xC-˜ƒ/ B €:Ă܂&x'3X9¬ƒ5„ç4¬C¸Ãã· Á\%€Âü¶ùO‚Ð#LB+ ÂüÁ{‚¾º÷ÂNð4#49€¿ÿ{R‡.ŒðD @P[Fí2–=aðÀƒy3f«@ ªj¡fø±ö œ& >´ ö„Z¡UI¤äp! É>!£Ð­„ÝêÕ¬—‹T!Êø°0Tƒ`Úhó±/‚¬dEH忇h>ʹŠ!Ì\ðþöàÛ€çŒØ" àW\ÊäÉgÎB=_¾Îà‚Ô„9V45 €³#î}ø²¥R \‘RjhÁÀ–xSFÀÇqÁ¼Éð%Wã|1ÀõK† æši0Ç@ƒ>¬´ìãrœñ6ÎVè$pé– I­I¾ýòö‹¬²[Ö| ›u -Öø …cc0.û…À׃LgÎ,0î—%(@Šfpñæ‹W¾Pâ³”ÁÁH™åM8@eT¬À=äÐC1‘CŽCR €ž ÔÁàæ\c™U y€(©AÀ›¬øÂ—(þf±BR²¸¢‰PÀ±âŠ1äeª´‚$bZ ¤Q>H¥U_þ9Ö'¾ b™É)×$k.•žx5k¸X' G €‚ Q€±&аˆe{lAà )Zâ¹bRFá€j‘b =¬0M`•gÖb C`0DB#7¹F † V Au hgÊ©€‹wÇðä’*N9å,°‹S¤ÁnJ9&iFv$tª©A züÑG „$Ò‚m‚Vâ”ëe®€ä•e¨ˆò‘,ñä˜,29ö .¾è<‹H`€ K¶ âŒBÆø€Š+FÉ` *ƒƒØÀ;6h†”1ªÁa C ð!k °b$bh"‹1þ°ÃÎyÊ2P¤–3e E2¹c•Gª$¾C‘B¾H‚ Å=LÑd‰P¸ÁP,¡;S\!hQÈB!,QˆB$4`ÇîÑ‚Tdë RxÅ^±Š5à" €°Â+>±hè×®µˆ,¬ëw‡Ú Œ(€aŽ€D3f!¨PXO•Ã!¨‘„3( ÄS!r@bŠø„žð‰6Ha g¢à!Jà!\ÈBà–OtBåxƤPˆG\¡¶XF&¬@ %$A9 #5*!RÜ@0E(¡ÂÜa¡ Ö: aˆE8b [.rþ \`48 h° b„€ÇOf`.œÂn\0å)Ž1„!  ©0Àk b ˆE TÃp>R†¤€z°‚VhîR oxÃgØB ¶ H,b–XÄ ä p˜à‹È¢!‡'4áаÂ/Òø„ Œ_ ÂæQrÁ€žóñŒr,¡XéŽQGÈÁå(E$šð…+x"#Ô.ŒŠ å,Ð+B Ox„7LKmØCæÐÆ,p†Wh€«¸Á ª¡‡E:âY˜ƒ#DQO"a˜0&á!AÖˆ¡ $! ¨ÃêpQ ’CQÅèFyŒS4áMP žpE`ÀpîÐKšhãÒ/qcPw(À¼’þBh%Wx.¤ð…\ÌHñ‹zâ `$¬`‚óåÃÜD„Ô 5.nPˆ â†x  ZLãฆ c°Æb ‘xÆ5j¡_H²ÞC&@*PX ©€Õ(fa RXÀ|1Ž$á&!ÅÀpQžJÁÔp†pŒÁŠ0Â1f`‚ agˆÄ~±ŒG` \#ÑȲ†+‡KÄâKІº1@$Ò nxŃ× @Bô9x„³ñ*5Áu.˜Å45áˆ;UK˜FNF‹ºbŸwX0 …UP1˜FxðWÎ !B˜îª|!È’ Šn ¨š!„âRáeð„\À/á ÜîvFœÆ€œÜo d` ÎÀÎAÆ!jC^á¾`x(gdÀj€üà:HA¶À†%Wä@…dàp2!ŠÖà>¡pᄨå\À@7® Óž !è0à¤@Ž@–á0€d!TVÁÀЧ”À^ÁZÀ&àt`¤ Väà ¾!B1¾àU.G8ÀÎAjˆ Yô²²àj ¡J%áî©Xþa l ¨` Èð*á Rl Ü ¶!Öå*ÁXÜ ôà Ö%’O ê` €¬à ð”Á ðA¤`ô ¾Î ÌǸ@¦áŽàÎÀÀ¤`ˆÚäí¨àvà Îà£\Î >a?`2ànà šáŠæA^ÔáäaF¡šÁF% (A¬šÀ† \…M˜ †` < 4ŽãBÀãäkH,À ˜Án€—)Z@Î`|aØçlaHá¤À¨A ” x b¦FáxÀÊÀdà jádÀ À n@ Ø"= ÈÌð¡þ o€¬(ê!¼^¡5p`N Úƒ9Æá fZ@>jxCÌ’Ì.ši¼!¼áÊB’áŽ`4{Áhà&`ïÁ”àTà&àz`t@Î ‚6îh Ö'¨¾Á ~˜Á p®n€F`è†Dš¬€åBáÈÆ €ü`ár¡°"4á*!dA€@R`=' œaT@¤À¡`A ¤ p!TÀ>Î~€ÎÀ1€*¥€æñ >a ç#’` ‚êÀ ¤ 0ÐÂÆF!\ð FTþÒ˜@JÃr@ ¾G    ^ᘀ ÀáF™ÀvT@e¬aØm1Bá'W! BAšÀ˜'N¡ ª@ˆ`&À¹àã"ä(YaX4`@–éž0 ”¨Ã”àÖC@Ã|A@"”,À4êŒA Ås(à€æÇà”`d€~Aš® Ì¢ZÀ4ÆáàÆ¡À|a:\À9À~¾¡-@  Ž*ÛnlxÀ½zhÀB 5oÓnón“’5á0ÉJþ ƒã8.‚è¡èá@  a 2 ÞÁ)0€fx!Xa±tá%ü€õ´˜,†¢´a`aêá À<`v!€ .€Ö³.@0`5ïav ŒÀ H<`=G@x! À\à+YTZ`™2€Ž ǾÆÁjÐáTvh!hÌÖ!ŽÁbÀ\!<–'•† ÖyŽá¾# ` °¡xr¤¡ÐA²a   ÀmBnÁµ@Nþƒáê´ à”ANÏÁ @ PÆÁP _P@ € ü@\¡’ \Àq_€À˜¡œÀX@^ 2àt¡ à"æn¡„À;Š"uê``d€èƒÜÁn¡`€wÈ¡;È¡PÁf¡b`ÀÚÁ Ú!1¼ ¨V`4€ „A„!„ŒD êf”X²¡n:A À³DÀl}¸ŠÁ aa&¡abD &á¨A †F„À©µ@ˆaÄ ž:ááâ &a¬!&A @ð F„àZþE’zEZA („ ,€\>Î^â%~ )%#A Y©®ìF÷o@ }á\4,b,tÁrAÜ€r¬ R`8ûö  ‚Á,Î=L :¶lÁ’àl³•%QãJN3!WS#; ê”dÀ`S]à2î6 ÌÃàj!uúš •¡W8`náhtEÀa„@¾› °ÚlKa¯… à„A¦ºà["£8À4¬À‘š n€£Ñ«:!° ŽAŠ;!b êfg;¡ÊApš‰ÑA«²a¼§ëÆ  €‰¡þ`D@ܲá.!Ì ¼ÍöÄO|.!ª^ä&AEŽº´ Ä:ÇÉ€ &!ª÷`€ÜÇÍÀ p|¡A ‫‘Ú«‹zÈ€á ö`Þà !¢šÞÀ˵Z þÀ©‰ºËa´€¬'ÉÚ D ªAÌ?j°µ¤@*á Ážà ΀l"æ ¾›EµÙãà\àHALKc†¤°q!ttá\kÀ ~€äöa”—9la€^!ˆ\@%˜U0 (¯”ã0I5ï\à,N *A ¬™JWQ³Ìþ¼¥†cLíÖ×`8àf! ÁưØÔæD¬¸ ,Š˜”j¤l„Š_¤‡wøn¤ÁáÎðÀÜÀN¡¨úlËAÇY\ÍOü§Ë»ÌÀl¥ºÅµàX\Æ/A ÀûboE”º‚¼DÀÍ™ü”­Ú¨ÍZ©Å:Àºâ ž¬þ«ßàøàªœÈàåaæÕª'á|ü©Í:È»€ $¡ç[ž€èy^º€ºà $A ´  ˆžé{^¬œ¨7AذmËåãøü‚p’^¡í¾AHaÏ ,#ØBØþþ"T ¶à Uà,&^¢KáÕ €éÓ)€à[žØ‘½ Á ” xñ¡4Ùa(_Y“!!1É0”@5LC àèI”T@,×ÇÔ¹8µ¹ôíhf; áÚ]Ÿ]²àDZDEâ€Ø€ Z¡ÅIœÆöY„ö'¡÷E° Ô @AuŸöA©'A <çÿ©AªÛ\©¬©êAŒ:ެÅÚ¨7á«»¼æè¡^Þ èžz~ËŸZ¬k>©÷`êÁè÷€çù€ö Â2 lĉQ#…|ýYÈ("'-]$Y¼ØåÅ.;rÜÈþÉcEI]B† ÄhÓ%(5XpP®›Ì™2Y°úË®`Ý4xû’äÀ)_¤pqÀƒ$,Ð µ’\”ãÜœ¼€ ›¾/,€ÎI¯.’Håá‚@-À¼ªe+؀Μ‘˜ JÕ„{G<Üsƒ[l é €É @ ÖƒÞ8w`3/@°€À‚’ð P ‚’<ƒ"K¶u\DqÁBiiX°Ì5HË%PÌ/-å|y«*lU¹TªJ«ç“u×bfÐBïÊÿaHüùFqšÔ¤F“ÉOgwFƒ2ú3ÉþÝ b†Fññ'’p ƒ‘±I›´ÒJ„›<Ôˆ„$øIò‚oŒHbˆ òâ%–â‰ðñ¢ .ò!£Fy$I‚ˆÄ‘I%1Ç®t3…ÁÄDÓL ³$.NhcL:IŒáKO¼rÁàM @¾œfK¸° ¸´@I¤£Ô P‹1ûXg:ð` ¬ÙÀ¶h† <àB-@OíeÄŸ§}sSK-g AMS˜ùÀjPÀm2†XJÀf`*=.|ãKU¾xSËÄ‚N¯® ±[¯è”#L9èˆ B”2Çþ¥<{ʳÊ2;‡ˆˆ­ˆÂ\#Éí…€GZL‚n·òUAI+ä– Ý ñ^ÒÊ€ómbG…îÇ­œ÷Bæ™ÇG¹õëïq¹Pyý…ˆ`Ša\D±E ’'dhìáŠ+VLñˆ8îÈc%•4‘1…@‚ ~$9Ó8N@° ÔcL7<,óAÔ¬ÒÂ$ÑBfÂF§7¶À\!CùIMæ¥IœvN\ŒòJ€èµ*"YP ø"Ï¡< 7ÞPm<ÔŒhõÍmüj›‹6š””j §-9´°€-, ¦PørkŒ¦þŒ8åpÅ×Ü2CèpÃ-´ÄÅ/ã !Í"t2»PH0Î8H0‡È !‚0ÉŠ ,ñ¥_<ñ"Ä2»´"<ÏìñÓ*K½²Ñ.[Š¥œ"ÄÆÒl³ZhQJxf„§_úú-÷(î¶%U°?Â)Ç¿LFy5Ôˆ7”§ÑB”&Ä" RЂD’“1È å(B0 ¼ f2Q€˜sü øÂ ƒTÀ.ø|!ƒCÍInIÐ@­ñ $aã8’àw0Á ˆ@o˜€<@€-D#¨`ì©_@Õ,Pe€þ£èðC5Pç”ãH€ê!€0`ghÃwÕÈà I@Ô7Fñhà Ô` 5mTC5‡2 X  PF nam4ÁKˆE*0[(£¨ ˜ð ˜€ˆ¿¥P`& ®8…Ž!à…,c8˜Á-– ‡fhÙøÂ9  „½ÀÓCn` $ ƒ cXE¢k8€´È„²°…-(âH˜$š°Š/4á ÍÅ¿‰G4ÃF(=Ü@TVÈ„&n` 9ŒÙð„²`R„¢5@*`0‹f,B8ÈBü0GPâÖ¦ØB‡å ,xÂÄ„5,ÐC¤bߨÃR‹ Œ·€XÃhà#¬@GÐøÔñqgÐ`^XÁ ˆ Ž$ü‚ ¨æWx‘iu@5*`Üœƒƒë€þÂ/](dcÆ‚bàtô\œ–F'h7ÎR §Z„1>3TÝÅfpÈ0 øà‚pÁ8t¬ãɨ}í¾XCèò CÕb ¿Á ¾@ @¼‚(À¥àWÈ!˜ÍÁ2áÞ-PÁ€X1ŠQb%€„ ,Ž›9áB%˜á@ÂR€  Eh`[€Ä**a½Õ#.€/~ñ„B|b n¸ ÐÚ/@" ÀÈÂ"RhB.8“m¬‚ _°Ä"¦á HÜ` c¸Ã*®¹gFA\ئ%Ôàƒ!–°D²#‘ #œ¡ Bþ!¶À„×2¡Þ8Ã!äš gP £€ k g ™pó Øà ëÇÏp†` ‡€YÀ«°Tpk0J¸Ð ‡ðÑЋ zpÌ¥ Š ‚ãg Ö ¦µDFÀªÄƒC4J£5Z£ÄC°D&ð 0`G§t0à H7,0ë FÖð<å@;Çð<ÆtÉdLËbÔOÓBáP …2ôb! BP,à×Ph—ck·vdóJà Ôð Ô0(…ð\¶Tg Ð&P Þ Ëð RpË …Fð €À_PH}D°&” °`þ  Ý03°ð …ÀæPqÆð y¶v!•phs_pMº œ· k‹…ðß`TÐV°Kà ¡`cp™0 [!pÎàL cÀwpÖ0' HpTÀ~p ë0Kp\°¡ z”ÐCàhÃWp@z¦€¯_`|rŠÐ Þ 0IP •ð © Æ@ r`D`Ê ò`Š`ÅxVðr0 F`{æŠô92ËÀu0¡ðJåàŠpÕ` r0wè¸ 3KÇðK±àÙ„ C9”€`¸C\ãþ ã€ãàÃÄÅ@ k ö@L&ŠP Š0~PAŽ MÀC0Çp H@L\ð,ÒC=Ì–Ñq>(¦VW>ç“"Zóá„.è2åÒfz.“À ã±1à Á 1§€à°´çvY5x ÞðW Op©ð ¾9õE¡1¥˜ °ÀÝxXæv ‚·þ MðVpg 0&@œÔ`šºB›— …° gÀmp7Œ Rpp«@ ¾À|>Ö •°ßðø Š gWpó†nÉW Ý À2!Ék ö°k€V`Dñ 8 `   õOs–ð2@n`WP © i`£•pÔðÞpª0ç@ ÀŒ…0 u°‘ à9É¿`pF Wp*° `P ô n° uÀ •P…@¢·° €pšPÈà _@’Rð Y…9P-pTpƒbT®€zàQp¶6p_ÜþÂÌá b!&RP #Q.¶bõá-üaP1 KëOîr´“ðƒ¥UW¥ç²b¡±³à.ã§€ € x‡ g0f~'S–F g€ Ô€ <`9 Ry´ Ëð­E Dà©V ™e£¯ÐIÈðÈ@º)𠈱Ì(𪣠+G §èÍpvÁú? 8rÐ`J¦l&4š°¡°¸0ü00 `š Wp£ð·©@ Þ` ûP@Ÿ2f*°« - ¯€€±GÞ€±£ ÇþÄ€âàš@ Ú÷‚7°© m zÈÀ ° Ôš±7À ¼ вp† p7 0zP ‹ äàA@½`•ø ¯@Î 6:POÀPà žÀHðt ÖK¸;ÒOà3ÆaËQhš?iÚ/ùóÞQ?ð£ÄüPd¢°´UÄ"Ö,ÒpbMŠÅ:ܤBá1 ah Æ€cvI·«ñ•‚Ju/t¾ð° à -à'Rà . . D&0 gШå—_ÀàÛð ëÝ€ uÀ,@>%Jpþç€ pjiÌû ¿   ¬ R° 5Lð Äí€ ±¼ ¤#`ÉÀ*à¿0vË Ðµ0ðFÄ@ #4 ðÐ%à-0¾÷@ J  @Ä *ÐJÊK‹œ ¡  ÜP¡° cP `¤ †Ð ?pN0#°e¢W 7@ ôÀyÔ°Ë% °À¡àð M€5P½ 9pi°M:  €üU> Ž ½²ë@ èP e帽Â:P0 /í Ø7XP=Ò²•q€xP P™þ n@™@ xà>T¬ÓØ“ ¥ ÃÊÒtFi”ÊÃ<_hXü,ÒpÕWê,( Æ…s ¨}wu´F™±* à Àritãp(+„½Ô5ä|Oð@ 0R U”W{´ì£X ÀÁ ¿ ‹)µ€ˆ©¦ç5ãð wä NàÚ`NÀšÈî@&pLÀ,๟ËcüÀÚÓ¹ùÜQ?y™Çßà:hñ À #° !€@ÉÐ @ ½€Äpº ð ð›G ð´B{=ö ðá¿ áðÚ`Ø þ Ê@ pX¾ÀÚ¨0 ¼E å :I—\Õ tÏ€®0ÿ% àªô L Âð 3 M4 H°00 ä×P 49RAÁ­qªà±…JC8 >‘g„(ðH‡~p >à ×0 7> CPƒC@;TùtÏ“,ð”,Oý<ØS>¢Ý‘bZ¢0&05æ î ÖxYÀUc&ˆs<à ‹b“9À£C~™;Ôp9rà9€ñðS7`Þ`€ÃýæàcÁð ºÀã°ç$tU6¿ W* çÞÝ ÛðaþF@T„À¤iùÀ;°ü ï N ݰ²Ýð2ÚAP°ð#@@Sp=0 €ô@ à?0À¼ØN¾ õ0 Á èßð¿ì ¸¬éÀ 02 ö€ðÒ<žt”ë€KÒPÁ# ±PMÂÄ+Íó[ Äã†Y­•öÞ=Q†pұРÖKë ,×pê²âô@ííà^  + D@.àÇôp&à~líÀñ( D0d  öð8ó@óÀ®p…ëŽ=C~P,ã3Ý1å´ÝqÄbþÛ—0Ñå5f\1Œ2~½¹5V“€ >qÞ®JðU9 <˜g`tfC¶ðå|]q«`«`R€ º²ìÁ@Êo3kÑ `ðIð Ž#U¶ÀG¢œåª¡›‡ Ûð .¶pÔ0 AõL0NÀÌðÝVô Ãð?öcÝp 5Àn·p ¼õHEÀEÑÁ@ê0ªÀ: :ÀG@÷P5ªÎùŸ³` E°ù5àûÊüÊ àùäP~PÀ` ¬†LÊ# s€Î"sPä9}ƒ ­@ áq çó,(6–¥äT $öMþ´S=éÏ2Œ åOä$Ĥ §à~\` ® à@×sF ®D €2DD¶S"Žqå’J Ì˜™4h¨8qþ€bÔÈbEFþ0bTñã -ÿ4ZY Џ#8 A€ÀÅ …•J•¾0²¬è*V¶¤ZöÀM.X0àÀ¸VÉyåÍ›¯`œHBME -Z0 [ºäÎk¡›“nÌA0&À–/as\yDÇ€láz…ãF%,rŒûPèI‘^¹p"™|ÃuëBd88`nÚ4ë®UCW›µmõ,Ø ì†þo»íYØ­l] tÕf£Cn»œƒk²k¯s5ÍÚõ(Q¸ Ab­”RZ5š¨F–IÿXÔ>Ð{‹´Ø9Or|-ZqŸ?ÿû@Ò[É¢Fú#Ž@6A$-Ìð¯÷ã‘$yÓ ÃŒ ýÓ“.ºàdà€¸‘M6ad¢xLÏ$3ì(ƒ‘ð騽Aø•8@ø7¥1–/2J&cà’)™-8Ù¤Œ=þ°ƒŽ2Öûã^–V*ie2D:ydƒƒÒFiÖ bЮ©é¦œvòE> †% ðjp €šeþF!³€¼‘$ÀæÁR @³X`aP_|1ԂЋ4¾ù– ¯» ¬Ø> ìŒ$”8ç‰C ø–eìöfœe ‘ÂQÀ‚/x8 ˜Ü*(Ö¢`;á¢.æÀB,æ8åuh½íÖAÞ¹ˆÝön¡-¥ÄSxÄKÂec lFòâ ‘MþØo"Baƒ¿“áä•9 ŸŒMØ(ƒû  x¿ ã%$<6á/Þ÷8I¯#–èȃ<µ`D<’Xˆ i0˜$Á ’ Œêc À 6Lô¡fà!ñôð@âW{Äc± ¥‡y÷1þƒîÓ t@NHÚÒœ´ü¦ßøÆ¼¡„àÂ+¯( ¦¢_Ôb9y@D—“,c _@N’ÐqX`,N ¨'@È€€9úÖ7`qPs@ªP7ÈÀÞøÂÂv)Db.?`A`|¡7¼‚DpC3L`‚h|CØÀF  -i HvÒFZ‡HDÈc$‹@±"”È‹Eº~pÔHVDG"YǯA¢ qøX õG‡A”„"ññŽÒ“=É AòÂmé°?”¡ qøÈÃ&‘³uQ"lˆKÔsL0tHƒH<"Jý|¬@-3þ$ñ†7,œd(C‡™m”)±þJ‚¿cjdYÉýzD¤Kp¡¸ÀB`6 IðFrð•þâŸøÀ/¤PRÔm>܉™’ `< …¤@€Z @ ÆTß²ˆÅn@à¬ø U¨Xñ¤XLÇ@p…BxãJ Æ€XáÁ¨ƒ´a') RàÁ/"A„_ @&8Æ))ÉM6â‘Ì$A ¥§!IYIbM“€²@=j(íŸv®O>‰ìÐò¤'q Dèð‡M°ÒbÆCÍ‚, …> ÓX†Uõƒi€Fp04ýHÀ‚,¸ƒPˆGX?à‚Hƒcp€]›5U,¨ÂE¸`àÂ`/h‡ˆ h‡€Q¸7¡@(„&X…PpÐh‚3„3h*Ë\¨ƒW=0„%˜ò4OôĽZÈ.«@Œþßð…&H‡Q0„Z¨…TC(„3 €À…ø¢ý…€¸kp$°,ø‚,ðkp„ñ«Yk@N`pSƒ(¸ƒ_¹4PÛCýËñ€_x€qàJ„yÒ-P,†¡½ISÈl¸‚E†¸†fRÐÐfƒ:õP-¤r¸ƒ;¨Ù/W@f‘K™´9ˆVQˆSDlèL=àZÆ„Y0…fÈEh?€„:´„;pXÏl†;@$hH¸ƒ_¨`€&`EÀ_(K`€GÈ\ƒ  €œ1 í×;h† Є…þÀô† 07˜?ˆ…%ˆ9 NuÌ,pƒ/P„Uˆa˜{}„+P*¨›hø£(„1ø…fhƒBP  ‚¾=‡&p]"h†:¨\‡Q€ø…` ÇQ…GX_¸‡Pb bp(E¨„P…e¸‚/#`@‚àè)"ø)À…Ø€äå‚…˜†­‰‡Í½‹"œ06[ø‚W°+†€„O°…3x)@%x‚p›ð)¨Z0P%Xé…z­€'(„ÆÝ‚¢¸úcE¸là€ ƒL˜±«m˜m{x…U°…WH…þÅŠúú…$¨+h¶½mØ‚+Ãe`xEˆ†,x„ÃØqX¼TÀdg˜E8wp‡³‹¨&ˆŠôQ(„,‡;ø&9hMh†r0Ü%ƒ5X`¨MðÏÅ(e`HƒqH…+‚_h‚5°€0ø‚Q& –TƒH €18„G …e‡ø…'h@x‚/hƒø…C°7À€0–Xâ…Öh†fP=èÊE`ÀU¸ƒUhƒ/Å!ÈGh"„; *ØI†=~4)€„U8ƒLx8„þ6˜¿UXx%ø©Å…5¨„W …Jx)0m»è0€`VHèø„Y@_È+@G@-‹/ ˜…k …N –l@‚[è‡ cìXK9/ Ò¨Z%ø*¸gÐþ€}…O8ƒex‚kh†CX 8ƒBXRXEHx„x‚-°‚U¸Ñ‰Ì È@xº¦‚ì…hÐÓ9†+°\8ƒª •LÐ_ €`X€8…6k°Q=P„B=ƒ'È9 p@¨„x%hè½0H…U€@X-X…`€^(@ðþ …0hy=+È„+`‚&0,ÈÐj°oXR Š¥Ð’ÿ,¾QH€æ)¾‚Hp%øXRx@8„e0"È&@ƒUpKxª&ˆ0 ^)8‡dp¦¨„HP ƒBø…ƒ%h+H4¬08å—Û+¨ÇNØO°ª;À,ð„!(0À‚ .‰¤<& ˆ„HÍ„U`#¸ƒG ‚WPº¾W-ù†n¨E>ƒ5¸R€ææ„T€íe^Ø…Àà)R›¸‚XЄ1ØCÀW` …1¸GVpˆ..þ³£.À¥NO¦®Š›`íJXx‹ÎjøÐO( )‚À®"zjx‚§o¨>l…¸!u š©>‚˜UÈ€$`€:X†3¨ƒ:eÐÞðÐeX†O Ðèfðð†d€' j˜åPh‚yƒ' ]+°)Ày ì 8‚˜€#`#P"*X†‚Wøo Ø’Ð#À#¸U€áWh†!_…6aâj­ð|°‚+ø„/øÏ3ø€ÄôZðÈojf°€†d˜he bð†C¸#@moÈ€%G½’þp£²Øs%P*0‚ÈQísÀòYp (@[ä8Oè࣠Â*a „;˜ÄSÀE‹‚/ K›ÅEÀ‚è?<€à‚!?À?ðƒr˜P˜¨$ØIkXUðTú`¹aبj`†oè‰cxE.èi †Ø³ŒË¹á.ƒ£î@sÛSó‹z€5ij‚‚#p†À{g   g ö{8zÐ.ð?‹þ †Z 2™è˜€„Ð ŽàL ÷`P!$ Œ6ÚãÇ/À0Q8(TÐÄ_ø@Ë:åsÍ5å £W'"`ÖŒ"tEX8Úxc'B˜¡Å C2 #E2É$IÒ(€Òˆ’ƒ˜Qeþ’JN¢Ô%—Lr‰s”f)ArÉ M.Iå Œ(©…T9æ)Q=öØ%žTQ(nN2¤”Z²É&•µ‡¡üaè — Q1ž&i¦6΀<2¨r„3¾áGƒ:$“ ¶açÍ€,ƒ‹µäp¬³ÒZëâàš«®»Rw-°€ P@ 8x£‚|ðIàò‰ GL€-}臟­ßÎZB@ÏâœËk¯Ö=0vÀí´“]ÐC+°ÂíÄóÀ56¹’#z³N‡Ç,²D'¬“SS3J³£å€E•ÒH£ñV’iùþ¤‘oüA2{ÊÇ&{4ÂÇÀÜ#lNòG¢†Úü2Ì7¿<¨Î1+ù²‘ÌüÊvØÑÊ“´‚h›(ÚŠ v@ÍoH" op" dtÑ'csrõÉ‚^"£ €Mh£•vÚ¿xSÈ'¶üÇ ê¨Ò›½x0¾©S -€ñHøò€8à~k€ä“S^ùºÕ3@°<Àƒ-.¸04ŒÀ‚ ©r 7œ!Kd@ß=è@_·ÎAn+=¬03‚ D0Eå’÷jšñ<ðØ€20N Ñø1Ž ƒÂ5Ä^åtþ”¨qI,Ø`¡çÃ\pþœBh•UÆ?dŸEö‰¥’0“!Éÿ¿ád[“Ä0ñL„áY[ ÿȇn ea@Ò±‡­kY»`ˆ‰=0 ôß®F†=üOP ÜÚ×$‘A¸†‚ k迳M"Ex‡Úö¶If $Î0\´ëIð…7j¡ €‰@Àisqxà …À/p\Œb #Å8¼3RîrÁqHÐ01~@ @*°Â Hу)Èâ -8Bh-_x*‘¾qF9F3²@ R`A z 1·Ø$'oáT£ HÀ-*€ þl„ ªTåŽÂ7#¢<æ—Àª’'°ˆ) Rþ*ƒ3›Å!g93T 짤¯u!kXûß»ð¿d&"šÌš ÞPM¬…ÎL&º9A°›‚7£MLŒ“œ„ì@ˆnòÁ, ý—ˆ.̰†éÜç8“) ròA BØaÝ&©¸¡†-Xƒ _Œ£Íàc% ‘‰eXÁ ÍÇó(eq|àÐ@0dÉAÀ)]©J[šR4¢Q§ –-„¬B ÉàÅN° x€¼vq@âËÐAt°u<À*U ”º4«,äX0þÁh¼-ÊjVZÀ`ÀpŠ%< ¢ìt Ql)d—¨Ì–ª 5 ‚ ”ÀC+ðP…B%Jj‚Ô/möµÇö²W+ÖA> ìæ»‰‰îӜф¡$’9Nj¢S†ä­h¹)†0°S Ÿõlgh@Ó¾°´ÿL¦ØhXZß.·ø”„D@P”R¿À*± j¢¡ˆB(fQTh†è#*j€Š[xT8ßhA&¡<h@¥X/{ÛÛ^˜žQ¦Ë[€ lQ ¬aÐÁ„‚œ€F Á.d±ŒT¬AÆòÆÎ1®ë\Õ½nïîda þ5h<ëY‘ ÂŽ0D’b(C%]ÊRRjæâ"©x (1¨@Äaf0“šb/k³¬ùÈ ´,fè¿jZV³|“áÀd1ȶµÿ\mk[‹ ÙîÊäܲ:G;N×"›’!5_XC|Ší·ùàÃ⃂€ ‘Vº}™h¹ÞlýÓ2Q"“m‚ËÈ #H þ¸‰Œ‰0ÂP '˜ÁØh0#'Ä6‘SÅ%ã0‚(Ã.„À=Œƒô‰õ`- €7ŒC@8@Œß5€C€0@þ ̂úÕ€ À€-Tà|À*Ñ8´Àxÿi_3´À@|ƒ .@-œC-|ÂàÂ9Œƒ%¸ÊüF3†Ø‚t‡<>€ H$ÂŒœ/hz‚ôz‘=4Ä ¬B(A¬Â,h‚„‚øÀ-(ƒ2ààÀ ‚4Á¶r@þ,\$ ˆ/|ð®"\/Œ<Ú#¸Á(XÁ F\ ÌÀ*PD<Á*To|AˆÀ1ðûˆÀœÌÁ$HÉҸ̫îÀ'¦le&¥n¤~nÀAgž±”A,R;ý-¥nîBý±;=êáÆ–ã²Ó!Ïñẞ¨r¤: ÁÛf"PÃeV:ÙP¢ÖòÙ4‚@Á9 ˆÀí&ç<5į/ȃ!„‚5À@urÀ3ü0Ô- Ù’†,Ã*PCTB%ÔB-ÜE¢r3àÂX~ƒ/dÂ@~‘ä/ƒœ)Œ5„’<)ƒ‚%¬¬Ã,È € Êã+XÁ‡2Ô/øB!ÔçT ŒÂx@Â+¨ÃÞ ´¨ÃŒ‚ Ü© èȲQ% žž¼ê&‚e0f¡ÓÏ7%2“mnà:Y¥¦Á&¤A<½›Ï›¤"U“nßrfznGê¿uê"CYe~êêuê­Æžê¶ožYcJB'K6Œƒ(“òðÀøÂÂÀþ˜ð (6*ÀÀÞ‚‹øÜ‚ŽÃ8ä2|Á2ÈÁR)|ÁÂ#<¼)4ÃB0XÁx.ôk€ TB$Øß2(‚€¶7œ¬œ° À/$5“BMCHUßsñp*œÁ|o4X!|À9È@!¬Á(˜ò/ÀË+Pƒ <~‘.Â247‚à‚6TìH(ƒÈÈö#d‚ 0Àxv%øc´)ðôÈÁ€îòøçaoÁ*dB!PÃ*<‚(Á¬ÀTŒB–RApO6ÜPÂ"T'àˆ›8 S R[“…µ‡P5þ¤þñÊ$Ð&Hâb¡ÐE²7•&91Ù91òêA™¥6òßαÇÖì1ò!³ž¨Ü*–VhM åò¢•KÂhbÄ‚_k5VçDíPƒö¡B9ø:p€RÒÂ,p€P®9$@=h@€ùêót7Ø‚àBtàx‡`åØÔŽÂ,@i7ѱF³-äÀ ´€j¨@3¸@0Ô‚-œ\%´À*Xi%¼àY3än-( d©€C ÀÉRCØ1€/@3„G€7d¥ Plã,Ã/X5Ôzñ€<À´@!Ì6.HÁ/˜,PzyƒÀÊ'œÁðþQ 0€ºfûøÂ ÈÀ+PÁ䀔€Œ‚:”À ”€¨€ œÁHA |:`Œ#ˆÂ:<ž#<†lIáA䥨Á8™ç:28.¯êÿHâ˜â)‚?©S¿á­º}™Œ#C,yÈ_æ¢>¼È3òâþm 9 “&bÙdŠò±.ÆQù Ì$ ŠÀ!Ô€œ |Â0À8Ì‚!40¬BÌÀ,Ü8À€XƒÌ‚˜ƒUàÌš70@ 3¼Ñu|}`ß8hÀŠàÚ``G€¬}3/´ WƼ<@ÚWæò@9€þ̱ýÚ»½uœƒÒÑýÞk0€¬ƒàÂÈ 3‘âJ0_¯8b ¶Ã_ö¸@=8Àr : ߡË8…cÌâÊ&PB´iÁ“ªT·:Ð nu¦þf\:½Pi’jlµ”%Äwf#‹ü‘‹|4¥A”A œh¥“–éSaSÖhÓØ”V×8æÉ”’ìõMøÐSÊxh5¼Â |XC¸Uh—)Ì:„³| ªaŽÀà"@sp)AcFŒ Ð0à† I’Ôx%h`‹AŽ-| @„‡þ( é2‰7- 0öÍ…7_¤túT#Ѐ€”(\ðàÁÈ1®ë%ºrå ‹cÝ:m”=PF+n§X±D ÑI„!"DÄ*˜p`3¥›Iô¦Ë›D˜czóFR—Ç—%u¾ÌGŸ={0¿á5ê0‰ÁÁä:Q˜×pˆAM(uB„ú¤C(ïÛpÄ’f7íDË—crÞ¹KI‚&“‘ô† 'íÙ%qÒ¢=£@ƒ8ý ?é’1ÊÅ`3"O\Œ#ðDÊ(3 qÀACîp0ƒRˆ!‡°¥€p!%\œêè›pþ¡fžøÄ JÉ¡$()¾Xå•lqè—zZhÎ à~ñÅ_\xà›øe¾B8ÉœY’É&tF#' Áðf ¿àR‰§”A'aþR+1(Ôìë(„(¥i+…-¤aLi¤1C -ÌøÓ N Ô´ËÞÀÄŽãì°£²CÛm4>$Ýc“0*Ýd´Ñ[”·>ŒK£;pÄLd3õ7Ô@ÕÍ·DP£ÌÔDØu>þ¸µ‘Mt cÑ^{­tÑVZÙ¤•8ncñøôs’bÿh%ÙADYÇjýxø0zà€÷0@lªÑ$rþª™% +ª! 9fá „j(€Z¤*à€O¶h*¥g”+¾qÄ‚F«FYF…'äã•$<"#ÇÉö›`¬@€'¾)`œ¬ø€„’M.ùÉ”™,¡„{îñ@#TaX ohÁ# àA[8VÆ•rÐ9EQ¢E”K.qÄ¥“Vz@i¤Š2Z¤‘¨ùƒ“F.cD’=håõ¸0 åÃŽàÝ„]ßà•Ø?!ƒ FÁµ‘»o%ÄŽMÒ¦C7Bâ°ã=×u4¿McQÝ6I# MÕÕo<(§„’84CXa‰¶‘I&Ïi3æ8}QN)å”ÕçPú’þ8`…Ú®q[mØŠ8À‚8£ÐIÀ=ÊñaŒUÚRfÁyòe©¾Y¦’œZÀr8„”‹vü‚5ªeœ å _$“–ÒÀ%ŒÈßI _Å j fଆex` TàŽÐ@>‚Gp™Ë<àŒ#Ѐ|Â2Öp ôq €i”ã\(Z<1,DÁž0…)Y s£È@9Ðr¸B‘…6fÀÄÃXò@æ"ˆVÁ°Å9Æq#g,@PÇtà‚#¸ ˜À9Ò a. ¡Ç ÈÑ Á#pE|B°ÇN`ŽØ#ö(µê0­x£nø…70ä½ü" ˜€®y=8ã×ÁvF{‰½uÀ÷ Ç¼ƒh#Ú$¾À ˆVÊx2¤‹{X×ß®'-x @ - A >ðŠW(:P‚t°‹`£pÂ@@‚%y@*øWÐ "0€ ÎÎÁ(žÀ„²zá¾V2ä±}t£Ú^=°±jB=àœ0 “wà ȇ Ð|@æA,Ê! nÔ¼Ȩ8¾Q×h|c©‚/0¨âÄp¾-`ŽQ`Þ€þ:d œƒâF  vxF¨n dÆ„^0AFˆE(–x3ð¦ÏP‹º3¤†2 Ñ ?ÐbàHÀ Q èA– àÆQð`¹¶H‚ð"Râ]Ç<*À„lh†%š±Ö  Ã¡gB|ÀÖhø`Ú@2°y€àܪ…9+†3˜ã·(B¬q (#Ž|†8à0H…8Uð‹xãOøÅdð Á°Æ8°!xÃÀF0˜àŽÎsµ¿¨À7Àñ lÈ@‡ÐÄ- Œg@b 8¬ªá¿n”èáþ€Ú¼ V€*ºÏé°„| Á¼AF4@ŠÀnúÏ‚A²d ÖÀ~¡2@z½¡%Ta>@ÎAV@j 8Àcÿn¡°aðj`ô` ü ¶Aê¡(`ÆÁ´¡baK\f짪!ê  nabÌa4 \ œ*á 0BèC¨Aê¡ÆA|@a æ!\´!”¡ ÀèÁÏa¨O   LÀ ~ÁjäŽ*ânî îl¡! nÊäAp€²€áTIÀ ÁPÀ@¾aTÀÈþX‚r`^¡æAà| \ `|À¢ €Á¬! Ž!šÀÀ¸®jbÁ|`~Á`ˆ!ºjÁÓVA €á\`ÀhÞ%8€§ü ªA4À&¶àˆD\`%ÀÀ8@PAª’Ïœ¯L°ùÀ€ì\a €¯b   ¨ÀP¡ü@AgÀ¶Êúƒ¢{2Æ~a|ápÂ_|€øÆš!¬ àØb`àb Ÿ®Á ba¬`öOÆ¡@b¤‚¤À~ayÀªœ` þÀ-hÁbaî@²àúC© £”ñ„) P¡øÐ¡ø|@nÁÆÁ~áæP`dÑš!p`Ž Á€a! ¦\ |ÚŒ ªì/¿a©¯Ê&âê@¿2¦#0ñA4±\`FÀà ô fAH4AÀánÁ ^„ë A €lð¨áV¡y bà ô@Æ 2 2a°Áî€ °`¨ ;Má ¾À€!Æ€ ¬¤ Àd`Æá\€”SHaP!yHa B¡ý€—` С#¥M Îþ^~áö¼IžüofÀf â„Áha Ba ¬Á® L! `°àÖ¢à-°€ Ba#a¢ ¬` €G!Íáx¦GpFøs*Ÿ@?ŒO@²ÏV! L! f¡ÃPa HÁ¯®@¬Á4¡] Èd ” ž`žÀ €HJ©bp@g 4! øƒî` äÀ ²€š Àa! r€¬fÓÀA8 =äQFM!ë µÀdàRa dÀ n`h Æ á¡ <á,§•¬ÀÆ¡GþhÍ>“*¸‘c d ^jëÞä.5ïŽ~`a Úqža–@Ä’Á‘P¼Á Ö`¨–Á ¤` ¶À‚ñä €\aÁf@¾ÀX#ï@¬ ¶ \á;›@*áH¡šlfV?@ Va ZÀHÁšÀÜ СÏ! ! ²”áHá !Î@æS'láÀ@ ²€ õ` `ÀÚÔB áš ¾€ `„á¶ ¸à ²À¢€ ÆÀº+ ÎÒºtö´ PÁìA)õ V¡~a þf‹ÖbáAJå` !,áÀÁY/vV¡U€¡aÄ$"¨á r@ ž@¬ p!÷¼/€Á î ðnÁ ! ! Æ€}ÖÌp³ü ˜æbo!anà báB!4áÎR¨ÁȰb*YäVbT€ÌôÊáôà € ®À¬ä@¸ ,`>DäX‚V"d}T¾`$â=P“îja$p&ÄUl ¬6›`zj;9ÒH+ê¬à¤` *¡–á¤àÎà ¨ mÇÀÆàô A–PÆaá xþ³˜àô˜ ]4af`ᤠ á <â¸EØp!¬@Ä®3| ap²6v ´ ád€ UK Üà € f («Alx¬  Æ€*à ž¡NABá ,á Àá¨`¯Bx—`4ÂvøL‚ä‚á a S_a ¨a Á¿æfä` Êá¡Î@B¡ôàÆ ]}"a f@®à>ɾ!HüV¤ ¾µG |Á¬v ø! n SIaOƒoªÁÊÁùba á ê€ÊV× þp”Á­¡ Š@`³|_¼ép¡¾ÒI ‚FDò¨Àn‡ ¡€ ε À! ƒ¡ú(Õ3i¨§#Œàd€Îak X¯×·Îá€oq…Ø|gáHáÀTgàn!ɲé2ÎàZÙ3 ® ¨ažX°¡ îÀ ‚ö˜À˜À~å f  a´á˜Óa*ì¾àz A a`n` `€Ðx‘@eKw²ä=~A^ád ä[Ys ê áj` ²ÀÎÁjáøV` !)P!’oD">à ¬Á ¾à¼9„ a¥` Ö@šà²„‡.³`ª¡šàpø” äÀj`@ªiëù’ù²@l×À ΀XKÀ ÚàÀŽ—Á}´A²ÀchõÀb lû*€šá¶Ï·šWš„R T 0“ËzUS' À‚ô àxŠd ´t 8 n唿áꞬ`à>àjaÎþd@ !AÇà Ö€Wqà Öà@íá¶u ðOæá h‰p@*á co€”ààfø >!®À”a5à Ðàžàö¬àÜ€ µH( D7EäáÎÀ Á¨3ëA!B-À®Va®àš Tü€mt£7– ŸáHW²Æà¹SWì¡Ê@æ¨!À5"X Há¾@È6:Á`"‰ía dxzùR ¬àÖ€cA Á¾_¼áT SÁ` Þ"²iR¡}^QFÁ:Øžà pàfØÓë€äÁ´Aþ:ždà |XòÌ¡ê@ÏÇÀ ¬à Æào ÷žÀ !á"f”áäÕ¨ á LaT±à bÕë+À@¢yƒáµ¸=>FŒL»îÀr@ Æ`Ç!`,Áá@TÖ –@@BAàhÖpá[à=¤€Ñ ÀžàŸ4€ àWûd+pÁ VXÎ@pž r;pA,À¾×à” ô”V2 ¾ n`â#ajA –!Æáp`0µôç –!`UÄ p9~!|áAŸ ì¡ |A òÛ޽ š¡°õÀ Öúþh×€àšd@ ¡<Ÿa š¬Á îØ 3¡KÀ¬#8 Ò©¬@®à @2AEÖ pA!ôË 2a 2¡}VÐWá Öì t‘ôy3A aÚ¿@ º¯cA²š  äà !ÎWá΀Ô ²Õ¢,ÊÎà€Iá êàø Ê ´|€ô€à<¤œC¶[¨ž€x   fè LA“‡@"W̱À(Ò´ö’`-ñ3 µø‘K:~jâ=’Ëg N”€›q}Z üfÁªaô¬ Ôw1K4à¨Âöî¿'¾þ",¶)%@ Р"ÕCg¨)y0`#B¬E±"E<¨}zeE oÞ|ÕJƒ‡2”,@E €`Ü·`,à‘DŠ-’àA2š%ô•äÌ2ŸOpQ ê-Ço†Â ‡!THnÁG6-Z·‚Ù `ëÛ IâÊMÀ+h(Ѣţwà#P îI|h 5\(ñ¹Œš¯'V¾()°@…”3<ðøræIçι°5@I‹JÐcàK.rx຅ŒZ j=$L/_ˆÊf qŰcK¨P±æ`š5kÚdäðþ–d€¡\0‚+Í‘äAP"ÛšŸsÁÞ»AÐVÜ­r×ÐÂÁ,È ´TS uXd…áµÀ Î…^hŸâ ŽOÈàÍS0Å{§"DF|S! À 'X]ÔV@%|ãB\Ä4ߨ–Óz`߸ ÀŽ© Ã<¸ /è)¡ -ÑC-¤²E3šD¡‡%z8à‡eu :5(cÞ•„xæ‰'~€„uèŠð§`3 h\é IxÃCððÁÞàcD°mš„/¿P˜DkIàB>EþÀ=0S Ì$=¸°›/Ü PÀw— ‚V0 :Çøƒ5ëÜáÉ5>øáÃ5àÉP…4ÌxœóE EHORóÍ/u 0Ÿ-õiÀ¥…  6\S ·ÄÂÁš ¢£à‚lpWdvÀÔŠcÀÁ h‰ôœ“AxéåD@ÌŃ¢slžÁ|ãc¡ê„0 `€::q„:$A€IÓ&j‹ÜçFdpÏ=%”€ÁüŒA!ÜÓ ”@ ÐC nÐC $…¿x$útŽ_PÃ` ÜöìC’XêJ¤Ð/«!GpràÊ Êp ~°5Øð PNÇÚ `£`®â¿ðð PàPÝPAàc cA Op `õ`ß  Á`crã ãPEÔn7àlŽàEàòÖ6 A.ƒá ¿ð:…â ø@9 íÐqípí@  êpO@ì wHƒ.0à 〠³ ³0P.ïôà4#øþ‡èñ$øpßÐ$ô (5²) `äñ ð <à‡%¿ðˆÇð L€L Ñ`ÀõP³aÃÑp„õ LÀçÀ&À¿ °èë1€1à è°Â7pçðrP'¶ÀÔà 0u3xe{X#q¥ а M0®Çà Ì简,Càà0 ³ "/àp À°b6G1mÝ£ Q#®rr*¶° nð çp“’`³€ ³p íèó’ ñ¢Žb Ú…ÕPcaÕ–PàPD¨ · ]± éÖKøR½â6¿@þÀJÐ'0 À¡°—[4@øðÞ  ¤`³` —´nð ªeþ*`¶€ µ0 ?RJksÞÀ¸€ I›7Ñu!Ú±ÁÔ gp¿p § \P,Ç€ÇÀKè€À¥° –P g@9&`À£ rP® ÝÉYàXÀQMðž` _P •@ µðÔ`© €8½·$ð”¢Z[p ¶ Xà z0X0_c`T€³à3z@ Ž’„xEê E ŸAWPŠð JpŸ@ r°NaË cDæp“† cà…p``€£†pdÂUŽà«•VФ¨P h² cþ Y€¤`‹pR© Š`QpY€dãpÔð0õ €‰Ôp‰‘Ͱ š5 z` K`0` zp¶ð¾P7 ¯_0 Þ0ãÐ Q°‹°QàÕpV`2ˆ¹‘üõVP 7ü*Oð ¯pÏp 7Ðažpw c°ްX`¬«G*pT {k OiK «°šO€Â!bR°«P ‹û «Rð TR`W@ —òËú ¤°rP €€º«° V0x°¢–` w°Q€ à cpI«@P0²êDðþÚø…`åžàž Ù²K«°¢` r° pë¶ r@¨`Š 80 ˆZuõ þ£P© ‹û¤€ Þ°¸P Ô`…ð2$w»¥ñˆ«p€°_ÀÍÇpY 3ßåPwíg°ÊÑKW%ЖI°kg [°´Ùû;ɤp”€åÐ ÕK{ ‰¯à ¾Pî[­Í90„1ŽªÓÂÒ´âÙ | þ Q †àঠ*¾?6…Ð WzJ`màÌÙ `”_`FÚÛså ‘É$Ìc‚[Ö"Íðˤ  À_ãà W ¤@·‘À¶Ø Õ“ O %ªi)ö`‘ Ê@‡* 2Þ@½ÔðËp°*þ¹[èˆô 0 3PH wZM€œ{Ôp-ð¬-ðE-æ7€ ±×¤©À<@ Ë¥s €_éŠÐ©+cP3˜® OÙÙ@¡1 7ðkpÔðr\©°å3  ¤` † ð ‘”v ŒŸ ‰û9°£ µ`‡€¶…0 Ù¢ª©ÝVš … u¶˜w3ð é Ê€zÚÐ WÆ@Ú© ü•ç °Ð¹´[°ÍàYpšà5š@¹M°ª‰<ɤ03¤Àï 62¶Ð…"O»!Ïíg1 Qþ°²± ƑРê] 0ðÇDë7€×VP ð‰‘ú V@ Ϫ[ 7€5° ‘p «¸±6VÙË{¨¶+‰Ë™ Ëð_ð®ð ‘à.™@פdå þµ€¿à Í Ê›µ pJ ‡À*-r`öwºl00ƒr€Ž@ K° m ]ÃÓˆ-¯‹»…@¥r3Ú±Køâ«Ð -pw—:…«¸à¸ð ©àg ÕÍIÐc Þfm W°Å}[•v¼¡Ÿ0Çà ʼz0 ¿Ü ï õ—”Lþͺ JbnÐH õ_à ã¢ç "(‘à ¸ Ä[P«P{ö\ „† åœ _ðŠP. 0b%_@Ç 0á;¡Õ¦óÀ`K¡É°-2¨½ªôí $ 2ØB€ 80€€qxA*”¦Y³–" •¦&M€-ÁሺYͲÓäय़%WšøA¥ÀÃoð áà7µ2µ8³LŠ”egZÀšë·c–©BåQª3ÔÎX¹ˆT¥+¥’£hÍ“3¯ªZ‘¢„Ô“J>‘å¡!‰/)|Ðð-É€`ðà,G3CG©uÔþŒÔ˜E¤f5ɤÈ8$¤2ÝXæ–š+©V}É1ظ¡œ†ãƒ&„œÚ+cΜyBàI \¸Ì~¢Réõ«G¾xEe 9Tx¨s&5µ'¾˜Ë‹eÍÁ,C7­’2`sÈ8s¥’•3©\|qC |©¥–šùBŠ/¾Xæ ~qá†GZ°%ª–ù⌤ÈäŒQˆøàŒ•x@ ,p‚…¤À倾Zð&€`º À ¼ñf ê¨C5™a† G™"•Qæàå¾XÅ›`*š¨¢‹2ú悱%¸ÅrÊ©ÆG?ÈL€–jhá þª¹æšü€a–8IR¬Xã‹'\(€[l9à’Xà4`Àû"z€#´ÒŠž$>P¢øÀ¾ o>HÔ¨¾©å oèÁ'ð…#xÐ4€$¼Ñ pA V+ʲ#l \ø%˜oÆùæêàà`ªyÆn°Ä’,î0%`|9§…‚1j£Ø Q4ñÁmìyå|| ÎgB8GƒZ @à[~)@€`¼\`TŽp††r8"ƒ^>¢zÉ€ & á·Z°G™8ZPaÀÓdƒ°€ e¥€sdø3~ùf€ ðæ—þÇ`€qhà¸ÎÀ[Æq_Ƒ„{Œ¸§/ðqᆀ]Xa†…}H¢ºy`'zs‰zÆéæ–Þ®l†ò»ƒ`€0â  b’JŠ,ÂHïr°9¢8 ‡œʹ†ª3Îjnùœ:g©` ÅPB¡…–&¹á/¹´e 8Ç[’P€DX(ÍŠ{Cðàž{08b‚#ŽÀÀg&¸Ç 2ÈÀø TIxTQç#0¸÷ž ®WE ¨?B•‚aò› mqÁ›ayX –`Pæ–kf¹ÅšBLi†fä¸-”€`þ å @ÀlB…€s¸à «Ø‚< 3¬a.øMìµA +YÀºô 6Ð0`<Üã½èÅÅ0À°äaà¿ À/äA€[øÀ¡¸F,h6Žq àã8@-¡#*éAø…/DDH¡óQÚ¤P ÌO(¶øÆ9z£,#”@xÂà @`hœàÈÇ0X]9¡ø1  «ÞXÀAB7ºñ¶·Aƒ|[=€ÃFpÎw¸ J„ˈ¦ ƒhÊà@(ëDŽYh¨ GƒT¢âå-Àq  Âs‡,gEPþ#K¶ÐÀ9@¨Z V@4 €-’w8‚:&à Uè€ÔS…/Øq„¨#GP‚Ž Í#è@|+œ€H ðïxª ñTx„_4PRv÷ø#˜õ¸*ªáo)‚H ™– ‡gTÃòP¾Á·``o´á¾p…BÂ÷Î7¸7[ X†!@J P% l+Ü`9'åa@;Â5K@€ZÈ ø¡"p  y¦)øF¬@Ü%~<ðटùB!7 ‚‘„,㤠ÆÑlqŽäÍ\ò1‚Ô±u€Äø=@°VÈBþ,à¾Q#N€@`!Ž„ØÀ6¶a d(@†¤°¡ m¸à—uA2µÊ3^òJ ˆ ¾ŠÍPãžÓÄPb…\4Õ :Àkøá¡0 À S4aMÕ*nPˆ|ƒ°æ7¾@Àœ••Y[G¨ž¹Á¼T…Ð`N‹çРºÞ¥éóbè]ÌyØýÝz@ Ø +ô…˜€D`˜ºú5ð‹r$ ± Å ,ñŒ[ø¡&cPD Ñ„3ŒÁXXY¼áº‡$-† †{Z „Ô^¸€3Nå$,«IçF%••—ÏþÏÃØ‹‹×‹öÂÚ+=Ìñ‹úÝ †¸Œˆ´J¡V¨Åep¨_$Á( ¡7¾q†BØE ò…/’ #‹ eX@f `Áxq‚bÔÕ®²È‡(@dèb€3ÒvGÁî™Ïg³@0´ñ e©O’¸ƒ²|£;¸ÏƬ`RxÅ*–Ñ€ 7CpÀ rPŽäP-®Á%è3¨*V¡`# «­Èp€€‘8ÀÍÆa„\ŠVxÝ3sêRvxyÎPB2–Ó'ãÅ;ØÓè!ÌÌ! ¤ð‰(":Ð/Æ F'éMRþÀ…¾°Û0(Ä áRèÁzÐÃ* *à*W¸ Ð3$áà‹/xð‹Œiðà Nج½Q ^•¸ƒbŸ ¸—mˆ/šÆóøÅJ#ðIÚ¨j`M`CHûÅ9àUbŠ2bjÑ a Œ¶€ÖµH¡ ¸¡úP†*få.)ø8 ¿âôÀ®¬(F1:À 0CuP@(X=[@Á@‘Ÿ`sì9'ªG0œ°Rce…ç8Ú¢­T¸Z$áÝh*0çZàÀšˆ¥KGŽUêvL ƒ„5n! `Œ.ÖКàqà,¶xþ•ЃÄ$!™.ðRõLÀsØ4€ý=˜çBg4›Èi:u0MÚ÷ây§ÁòÊ´À` : ð³øbçÖ9”D ›/ Må@B9~xƒU ³ð¤ \\á0‚h¼dF"Ëo¢™*~³A‡xF#@#ñNkäÿfø… pz¹sp‡o¹2ª$ø`j‚„68P†pC¸ƒh±‡_€ð†„G¸Zøˆð…Cˆ„fð“zˆ`€x$Й‹@€"úae9ç ]X³«ÓºàµI¯€ €€m €À2%d:þÐ}x À=$Aê‰p‚ü+š’:€$€¾ñ¬Â9#È›`€#M؆ÙÒdp€9œÃk¨Æ “Єk¨e° XT°À¸+–ž#”1o8ôB ó¹db½àó4S¶„¹€î 3|Ø•+â@á›((2š&¸0³Q€ëQ…q¨„1°€qІ_à5¬ƒU¨…qø˜X@?P†XøCkˆg00¨[ð†5X€'ø„OÀ…°]Ôy øD%ð=)ëJžJ¼1už‘9¨wˆ †h0z¬€wŒw(þ0ª±[0‡0A=P„¸{à5‰+jX2dq ø‚-ˆ¹¢è™SÉ¡hzð…)x$€q´ €zІsp«çÉ 0~Øè"t P S€nP€mh¬@R€:ðª.¤]zØÂè†)è(*@°¡‡oØÈ]a´Â™5d"`)Ø ¨y¨ƒx€,¬nP†nT†`‡'¸`X”P_(€[I& ø@Ø‚™µsðÈJ2ÁF¦+ à 3Û ¸€¨Ä]˜€…{ˆ€ð1qtðŒX˜C;‰…Ðþ|Ècù†¸¬P„ÀÃ1˜¸Gmx9 G¸ ¹ÜFÛ\e°‡'ÈR‡Jpƒ'(˜¨Pü{…T°eðcÄ?¨‡s`–³$%x°OÁu€=ºÙ“…Òd¸‡ ˜P`‚_`øw€z`¹”‡jP†"ð?¨†r ¨[ …E˜rÐ&Á;'¡†J8H²$€À€v0s0"Ðw8‡(šh00z0ú Ó€z‡ à€5ÊàV0Yà…)`†b ‡iˆ…¨@…X¨†,8E` ­þò€h0‚ 0_ð0&иb33áa묤2̈þ[©$X ³(oðÐp* ˜>6…UPj2j`DŸ“è¿J‚JØ‚ µó!"Z‹ ’4áØ…€Qè1 øˆtUTp€CÐ`¸†u@‚l@…rP¼ÛÝY€¸B ¯'ôƒcðaˆ/ƒrðƒiðGø‚c¨ ØÎ¡€PˆBø¸‚+ø„Q%P… À‡ {H@‚:©ЀÀ0”àù©£8£™Z¡€ ˜¦Œ¡ (û¤þwø"ˆ$zpwxL!©T€iqaØ–&x9Ëš(è“‚Gø„°I–_ Šu`&(øü#h‡$¨Ç\1pz`Cцrà€ƒý¯Xø+èùª "\`'ødðk†X8a‚lp(pW@‡càS „c@z$¢Ÿ1 @^•©M!:#Y3‚S#¦ Q¨ ^‹` ÁZðõ9(€ y…M !_ø»`W[ˆŸ­’xRX€~QTO:Š]É¡¡pú ›xœý @Ê_fø øm°Àpˆ…iX‚PþO@°P}†u8À…’AºsXŒh”* ¨aXõhKpƒX?p€-ð„c` `À[¬•@S@ø†ãgP‡{Ѐ-Àoø/Hÿü2‰.yÆËâ'_pUHgsq"Ûcž^ø/0• ÀWŠmz¸^8p0°R½†X`¨+B€HÊ,)Ø‚9÷É€|eO¸×Q8ph‡~u¨'\B ’èLiàL?ðƒ·ñdX†eØ€ ÐPX“iˆ@aÀ?MWp…lÚU€‚ÝEXp.8,p…S¸þmÚsä.çÁhH²¤ªÌˆøÀ+ ‚'8ˆO†hEB¦xfê\Ø”TxõáZ³…¾é™Ï[Òó;Ú(¿3x®$$šÁ% ×’ùâŸÑ€t‡ÿBT˜†¨†ÎÕ„x†¸$˜OЃEÀ·(ˆ‚Ýi _h’0ºˆ‰¢ÁP„ºÔ€WòØL,X„1@‚k€EƒcÐy°Ûó)‹šZƒT@¡ `%Hú¹…X°›:ÐÊ$ ”0ž’ox‚¯z€zè?² p è¬@w wp(¡"àX†× þи†g°Ê™08| e°‚'p2Æ8‡3+è R(®÷XÃU  &pØmèÏ XYt˜a(ÀQè„u‡Ç¹p¨†YÈ‚?˜+X?†&ˆ‚Ê=ð¾1°.˜HÚ%€$tˆ‚- „&ÈQÈ,ia ‡‹¡jî¢í¡ªÜ»Œè¢op°+ð\x…W`$\›Qð¨JŒq()²„B j(&[P‚²°¨Õø)¨Ë4 @8¯&×å#j ^}@À…ñ`ÕÅG0OȆlÈ‚*Ж(ÀC0„(XþHhˆ…Ñ™+€„1XK¸V‹ ø€¹…¿[²%:7 ˜kˆÀ†X€‚1ø‚P8Ø;ÐW`=€s°/ùr)peøxjÐ’Jxâ°ƒ+ …-ø‚gü™øI@¸‚e0‡Ph†˜&XC@ ZÐ=È‚+P¢j¸ŒJø‚c…5pƒ¶,îf†,Th‚1ÔÞn=H…1Ð)ø»&‡/Xƒën‹ZX€B(„Q‚+à*ƒpHbâ`¯%¨CЃ1È$±À¿üÒæi<änÌÂzܲÈcÎÁ 7p0†u0]%«¸PB íT™DGg0P‰2ÈPPÖ‘ È È*ŽžqÀgÜpÅ(JOˆb¦p„0JQOJ”â–pÄ*<‘…,D MˆÂŽ‘ÇàŠ ë(Ç5b€Ž p@!ôP‡3(-jä< ÆsP€o£€þ/š1)õ µƒàT Í@5^ñ ð`›d@j¼ Ú´À¨R8|Q ¡hA)Pa)”‚”ƒÝ Ý´@›)Ú©^|CX.$ÁOÀ‡MHÁ9,ÀNù—ç%ÞÕÎDKy鄪¹ÀnŒ.Œ„U=€¸À˜ßX€tlƒ 6lC=ø1@À88Á_V0ðÐ@>€ÞUKtÜ0b)~ƒ †9`6ÌÀ4@ÂÌÀf5Á"È#Lƒ@eHË7þ€-€-Ø‚Ý| 8CbÀàC㙃Ä‚0T Ü‚6xC†Ð€š(Ð8ŒCÜ><Á7D×/À=| €ð0Á%Aö€;˜À.eÀ HdÀ°ƒLÀôB¾e@8`Ü70Æ8¸ `:ÆÚïè× è@f€”Á=üžÐAA'pA 6TN!¡L!#42Â$ü ‚Lò$B+àA¨MšA ¤Â–‚  üäS:å LB#LÂ%”‚”Ã8HRKÔÂ_€ h4cT}@MµÙ”âqŒƒ-)B*xÞ,þŽÆ,Òj@ €D†7|ÂøÔ‚€¤ÂœÃ/‡¸éYº@-A5pC54Àà@9ç9TÃ5Tƒ‡¦@˜$AàÃà™„h@eeX`3"À_€ø€Ä@ xÂ,8‚)Ü€ÌÀ:ø˜RùN `0šlžƒ 8œ»U#hƒ9| -  Ô@=üBÛÙB-8'5\䂯|ì"0@ ǬǕÀ8ì”;”SÐK0$ìá'-‚ý‚/h4‚/ EÀEºÞÔ9”ƒ,¤BÄ- C5Ô@ |J7¸5‰Zz‰$I^œ¨©XÒCq> À¼¢~Ý‚5„5LèÁ1ˆÔ0NC4€|Ò+ªž4Z0Üj4‹LÙˆ¤›Ù‚,€=|þC=¸@ƒÚáfH€Í:ã2A!(‚]Ùa0ü²z\2Á @dPA&T ˜D¶ƒ:d€:Dœ:¨ÂD܀ĩ‚:è£3X1žƒ$A2â]Ã,2ÁŸåNAN€$¸€ÝÔ8Ä@Î9ב¨À^z£`kÜX>" 8CÄ9ƒê ЀØÌÛ¨ƒ2ƒ6ºBŒAA ÄBª¢C,¸Â/DÃ…ºÀ_5âüBàþ‚L ýµ®CÊ›7ô‚*x€ô« ÀbÈ€‡$£ d„*šŸÿÀ•ä4¤ ä€D’ȼ9\ k³0Ü @”€:pï9@6Ôƒ=؃9\«<ØC0ÔC˜ƒ•å ܃  ãFãÁ:6L*”C_ ƒàX)ÔhòdÊ QþÁ ÄAlÐþÁšÆ¡ÌVìŠîdþ7‹6B‹>娑þ%C„ñ¬Ïö¬ @).À¤°„TèT¢b#Ú$B½õ;ôü)`C&æìi@$ÑnÁ+ØarX ÜŒ•ØÂé-F0(L”Ã48@(¸Á 8€$€gʃ¸µY- @ây™7DŸ @2zçüBëA½e–@TŸªÂ88€+XCBic øÁ‰A8€A;`I („0¶f`€ÄŸÃì:DŽÂÈß,î”ÝüÂ9<Ýð3:ãÐCÿœ;@²Ýd}žköª›d@»‘HóîÛ P 0À™žÃ(0þ,¤è:¢.§ÔÍ"m`Õ7Ì@•˜€*Ðß=À.êj€2$@þ ¬ƒ0DT)ÌœQ*eOÊ$PÞ(À7xœØY#ª$Ü€h2|) Ü $¤^"¬¦Ñl’lFã值ð8g õ‡—Q pc9„B&„B!ŸL`Y¼ñÎ|˜*Að€Ôùé€*ÈŸ¬Ÿ/4uÀ+ €2 Ãd…)`AþNC ø€+ 6€Cƒ•S^Ùqƒ%²;þ|C;|åP2Ø1DÚ—TB!|€¨ãЦ0ÞeÑ.mùÙKË¢f A+»P¼ÆÜ¨Ct@<Ô§ `ŒÂäöýLôÔ=DËÌ *)‚xE'`ƒ+äj¯*A/Äã(èÖ!€A!BœÂ)ÌÁ„ì>BMúó$´%PB|ÁHÕ24KŽG b(w²hÅÂ$ÁÆrB’ ¡N%ÈitÁN‚4ŒÃÂI€A7ƶÈbí¡g\€Uá‚G` ^Ô‚X>X‘e#úë¨ðiÀ€È¬Z\ ,#ü• ("XAþ¬¹± @àÀœ-LC9 Á Ã5€Ê-Ô‚Ý$UŒÕ¨ñ î9 À/8ã8<€ùŒÚx0¼ÕÌ:8Â,AVÜf LCX;À:T@40–œÃé׿$=ð€;=d6ª²åHA!Ë›»ÀIÁ,´C;,€ÐÀˆü‚*x lŸü $ÐE”Ã-hÀßÃ|aë2Øõ'4úX(B$€Â)ü¯šÁ6e=UAr{‚Ò$•WRù„šdd¸ÄÛKæÀâO,Aó‘; ‘c‹G*©ä•L”9@i$-´„KÊ™¥ lX%%F±†ƒ&pØâK¹W‹è& ¤ºî°ã„|ɼKPÈ`ÒKÏ 8€#¼YåÆ9L _°…G\~yâCBAah”‹fYDpnX"”'Öà H|7@ (€EÎøEŠ/Zx@¾9ŒÍÀ°b$YkÜ0¤Eùåøej )@k%HQéŠJ ¹¡KB¹Áa2qÃ0Üx†þ–;²('Eš@â„bˆEf€ÂÏîCM¼¾Xå —pa”L¨Xf G°(gˆ+ôXb Ÿ¬‘Cub° 8`€'ª%iR”‚ ˆ£Æx„ Öe „W*i$h‰%ŠcÉÈ‘&LD”¹b‹’^‘úœs  Té¡jÙâ•{ޏÀ™ t \ %à+d¡‚WlA*5d Q4¬Œ0ƒ¼E‰;X‚ƒ™8Ä!*A…Q\˜Ãþ0-¼á ˜Hƒ$ ŠB9ƒ#¾€a »ÑÂ1ˆI˜*´XÅðÅBðÌA÷0 \àþ[@[<ඃ’ð€sÈà€HB0lñD €«: á†&L£wƒ#Üp¹¡Q¸)‚!Rð@ß8Ͱ€|£V°Â|q¦â ¿ÈVñ€W•àâ 7’ðŠU¬Âkp,ñ)"[UˆnQ tÌ‚ ™)"rÃ(4è Ë‚%V!w˜ &°‚†‘â ô¢H†,œ‘da÷À@²ÎQ8ÄAìá€Nˆb<íiv€Äo]b§øúétá2L"j0ƒ„p‰StÂ8Yµ@ÖÃ9 «X¨*Ã(؈A4þâ =½v´ÐˆM a¿À€ìJE+ °[ðà§üÀ'¤ š1 ¸PÄ'Baˆ,db ]*  MŒAV)¶‰U€e €CÑ ¨á j< ÔÕ‚1€È/ßx‚²pˆ”X‹°Ä"Bá4E´(À`å[C Ëxñ yàâ~d ΠÀÜ0ž`>€ô‚´A”A´jÁ|àä!þìÁ‚› ŒÎÁ¾¡l¤ŒÀBà´ÐžÎœA ·pº!,ÀV\€ € †`ª_Üð ýì } ;¾Î TÈ ‚h6¡ 6¡~È „`ð„H¤R*ãÚÂ.AD`,hð Xè;þaJá¼ ¤ ¯M4nh/ žT y6’à@  p¡ÎáΠôpÁ Z ×|Áö€J|á–ïŒ@•¾¡= dΡx`ÛÉ(-¾ÎÁhh žºÀCè¡Q¾|ÁláÈÏ)¼A~š0ŒÀ`«Æ¾Áf Ã&ÂEÁ|¢ bÀf $ƒtЈ€p%¾!›j¥<ˆ@ N¦fŒxÀÀà~Á<¤j¾AâA~¡ ¢¨Œ€ dr¸\`~~áw…$ƒajÎaþÛ‚í>€$匀ü€ ˜ŒŽBÀh2&à €éèAºÁ  >  .  ª§àFÏ_ìð‡Â.ªð@×ÊUHð„¡á>á n b ²€DAb¡ZA…& 2ñÌ@ƤNòñ@‘ªŽr!à’`$ƒ!à~A@Ï!èAt@|Áî¡BÀȼáBà û’` ÀX)›”€J `à‰Ò”€–¡ÆÁp"bÁHPá´¡’@”H²G)jaB²CÈ3°þP¼Ô!|AîÁŽ@Ô   Áü` –ÀVr¬ÁÊ!¾è Üá ¿¤Üá8)o0`VÀ<@zC=FÇäÆÂó87D`¿á> èa“ÀšòÂx$\tAãÈJ HÀŠ,2àÜó^!ŒQŽÜèÁEså\ Χða ¸f•̃ïÁTSÕzv”]Òˆ ýÚo*€ ÀhR˜ \€öÂÞ1¤J@u`$ïÆš  !~¨aä”(AÏ!ZÁlÏvŸøL›ø^÷lÇ”£)ѧz f#†ŒÕàÆà„:5ºA ¡; QϲvþlaüÀ`¡èp¯èЈ’àjÁöZ@xÀ ÀRá ĨC DY ÙÏ#¼p«·ºéê³=@š™n’a–îF¡Î@×”ö á ’ÀB "á ’g ’AéŽÌ\û÷¸pYBàÆÁY슀e¦Ié!2À’á’¡h ‚ X´Z ¡ J@)™I{VnúÕH€•‰ ‘›‘»ú*‹lÔ•›.6…ÈŽ`UašÅTñwt€eÇü ¤Ó®!  À¬˜`%RøAP€€^b\W`šÕ¡LÀ² Æ€¬ášÁ„þÆ J¡è€Î6ð„(¤ã‚î°a&¡æT:Îö^þîaŠØ£ñPå{,EA,A ®àÿÊe h¡‚Ád!”¡ Ô@*¨;º€b! @¡èAÊáœ4”«W›ëjá~“~ób=(Öªß `<Æa¼¹Æû×&€Ô¡G¥N|G=À1ÛGKàüà°Æ€€  ¬@ôÀà8·Ç3€5ïÁljl‘JD ›IW²êàwjGIàƒ{¤€å=WŽTŸuÒ2€ä0@G‰L=ÏüȾ I@(ôÈÔŒàrÀÐ>ÀV@þ µI»ÈTAC1À T*àÞb „!Ó Ô„a€ÁÀá¶ d”}4WôdéŽ@Ú*¿àƹÑaС 1ܬ ZAÐL„ DàȻ撼•]ÝûÍR£}£½…(ìö¬¬.¡ æÀ¨ÀVÁð  ná2€IQ  Ø@ðð:‚˜Þ€DÁJ@ü€ÃƒÐèy§u’à{¡LqFò–‘nªú<ÙŠ^áù¢á~¿aBr<œ°Ûƒ ¹Úã÷àxÀPÁå– šAŠ@jà ¡j€·‚–ôC„sC þx6~ªE’B<¦7$ãÇá>Ó°  =ªúІk/Œîä&Ÿs…Pt‹>~^QŠ®Èx ;$Ip`ÐN£E]ºOödy$I]àdI’ ÐA ÀÖabÀÊÁ®¡ ¾àÀAš›’À&ÿÂ@)ï! ¹C‰¬´ bÁbôMÊaª  €]  D ¤…Í@_>_ØsXØ!ÙßÍ„õWÿ‘ýõ‘ý!€šÁ¸@Ê!hA\@ˆa˜Àð`õ;¾£bÒ`bÁ¢¡Þ‹„“ø’Ý©dp¡3Àžþtd’ïàù­üËßá>‡W4 |Çì”ÌýšWäAXk `àharZÀÍÈ4«¸X>‚ɳð-Ø8 왫hÑ– ¶ É·Á(±…`œ= òÎ4©÷K™L,Ô«÷wçè¹0jÙFz&^}±€4©R¤7o~7Î…‰ Ѿ™1ª¢QU©‹V¡‚;wÑÆE3áê¯rå„9ˆáÃO9 Lã *_Lœcâ‚^`Á%2Hõ²âÈ„{îyPwæÑŒ_ǰùÁfÅ1ã¢<ò4„ ŠqLH&BH,"ʉ溔´Xåþ„¼F¶ja¸Y¯žc{µàPÊ Ñ žMÅ…]ÛÀEŽ”Ñ2¨'N]¶káDç”sbmìˆ @€àáKÀÞ\<ȱJ’sáž €€{ ºgO Ðò`„ÜâGQ4C‹´ÜB‹2 ÜrK xx‹5€# :èÐb )‡àÀ-0„’É3×ø`͉¨ s 5TsK5åÄâ€~|ƒÀ€çü¤ç$¡‘F˜ãƒ2×hrE0øQ~Ô@‹ˆØXô6ŠTFÄ[,b5ؘÈc5ÕyMó<ÃÄ3S¬óË:W\þaM Ä  óK,X3)>€Ã…+>Ì…\3D Ø3ƒ#«`1ÆTñŠ$< FøÆ¨!_(á ¤hA%^á eâ 7þÀÁh¡‡Ç¢£Ï0Å"¬ Gènd[iwCXáž@‚B HüR†¸†n 6K c-ꢰŠLÐBw0E(n`[¸­Á24ƒBPã€xÄLa‰p cX®qX ¤pCH¾Pˆ˜à9 €èA€¸` £àPB ZÜ€ÙR,B‘…(LƒxÐŒB(¤)Ñ8¢®@G Ú‚ºdð žØ‚ïL…(¢ è°Äb°;ÚYœðrÝ1†G0Á|Ù'¬ðˆWx`^P‚0À+Œâ ÐÆ ®0†+|_ØÂdp*0à þñ(À ‡@âØF7ô‰1œa 20.±ìãk8C*~„T"*¯(„H¡‡lÄâ”u¨Á86à‚_h£Ýpª¡ kÌ  [PÄ!,‡KLbYÅ'¾£…4Ì¡ëX×ó_Œy{bαp¯ÌÞ8Ã+A…BâPÀš hÉáOÃ’ð74cÃI#{Ò[à€ D‚|¬ˆ‹¸ÃeMT/’¨€Â € 㡃v½kÆVá`Øt‹ g\ê0xãx€DžpƒW,g8¨ë< ¨àMÓ®A¶jà@ãHBþªÆ@…G¦<È ñ(`Ü×Pø,h]ZÌÀ¤hÆ zëcËkFË‚(|à Wp‘X‚LaˆÈa^zà¼Ma =\!1@‚\G$8 hÇ/dðŠ‘­‚ L`‚ ðs…3”`Š!(²Bô&è Ǩß(*0ŠQHÉî° n » €€Ê8TPˆü@€ ,P#X*€nŒ ¤ìÄ0ƒ;(¢¹¤ˆE ^qƒ3䣘"y7à¡” 4txùC¿a;Û¡ÃbáqddÕH@€hà x€ 4ð„<á Wà,þ+qEÜ`xÛÏ×à (7…XÃ7¨Ñ¿5CÀÝIï0q=£M>¬â—Ï›ÁÜ0&,b']G9 a nß HC9”!‡3$@cˆE&H!ŒÜÀà0¢Sq ð ÔðE>PÂÀ[àE 'râÏ`WÀ3ÆOƒ÷ ~12¿Àà„ ø… ³`‹_5 ·Ð c`F*Çà@;0Q@Žð7àH£‹(T âòwðÀ°z0ÖPw€jr \0MàP M€_ð2`MÔð –DÐ @éVþp½Ð ðR T « K` ´ƒÖÐcÐ,W  g°„ «ð† `ûðpc¤ð 8@ 2õ@pR÷@úãiêF ©T` Fc@Ť k° P Pwx€”p ZðZ ™W1o@|Ð<„ç@D£gD€z¶ð ç ¸€ p¸¢ÁðV Ð W@ Ô Þ  ð¾0ÔðЊð¿Àeà†ÌèiR  Ð`ò0k  OÀj 7 O@òxzPc@]cp8Pl¡€r0à7ð šþ ³ –`?¯ekp2ðgðÂÂ$a Á@gP *X¯€ Vðì8òðkÐ ÍðP õЫÐ\_ >R [@ ’&P&€98ðc0 M c £ 𠯀c€xLð Y@t¸pnjg0&0-OÑ [ð?•M08p>¦pK°X0r ØàlÀš`Dà£09D R +OMp‰1Ð %àsÅxˆ‰‚²"“Ë +M  }ø£°–¬ò©°2 0²² † OÞ gø =€pF@ 9° *°˜þ-@\ 3 À€~p šðH Æ å  ðdÜqhß! œ°yÕijp å@Èd%ÈÈ$¶ O  CK  ù… °ž¯À¶ðVpQ¾p`@E_ ¯ Ë0cÔ eø²„ Ï ËÀ2pøWRpŸ€° Þ Ú£ cͪ¡P7uSа ¤P…ð øÃ*]˜Ô@ ¯ÀŽUžsC ¶@_Pw- gÀR 2tìX °Z4{Ë`@wb€Ð¿ÖBL𤣀 ðµà 4ã Ëpoõãcþ9ð<à—.pmøD`&RjOô°& ÀôÀ<ð s2^â Ч®PèDð FpM0b¿@L ^FÐ0DGà@>·Tàð nAä @« >ð `¿àÚ@ø:ð@  ¿ ½  Ð °&ð –âÇ (Õ€dc60 #C€ p ƒ09ÄyÓ)ÝÁCt èŒæAŒdUPdÔ =?6¬"W©@ Á€ ¯pV@ T Oð =F eö 2àoR 0-@©þÐRpFÐ $ð - ª$  !  à ‚E JÀûW¿`Rª½€ê@©@J°MàOðOÇ&`D‚p¨çð °@$p†÷`÷p%ð à ±©å ›•Z…a±Èú P»äã}ë3 ráÕ­1 å€ Ø M‚LÐp[K ð z‹·ê0ðLàà°~à ·`!Ð LÂ÷  F  þ:@f›VL¸ð ap£°µöp^½à í€^°¶»²bí €Ñ;"—" $l× "z$¥ [¥C½Ø­SÕÙ6T ¡g®ß¹€´°Ö®gà£(‹@ £@7¶ù g€²@Ÿ-9à ö$Žçp%pG€ÎÐ19 ¬|i40Îp÷0PÛ ÌGð<`BëD€ FàFà÷ Lç¶Ð Î@ì £'@¤ðã©Eëzªp®Knk¬0fÛÄi(˜Kî€^%€€¦æ£9ð«0þµìÅL¼ÀMl¶÷PÆ LG ÁG@P¬ÎÐÁê »ª0º <³g` 8 Øà ã Âp ÇK0 Úp¨p 79“µ„ITfìLÌĤ ¿0ààqa°  Ð ®;pG0–bY€ãÚÀ5™&@%ÐO@ &P¸ê`Éê QzC PÈ(à>@$¢SLëpHBp ¥ÐCßÑ;ÔÕ)ØŒXz¢Ç¾Ø Ôðð Þ Á`ã  òÀ>à¹ÊÏÁ < Þð  7@WÞ`¾ê Ÿœ 9Ðlþ¬»’Á¿!! 4 0º!Ìð ËÕЬ$ ÂJ¾ðÐÀ8ü¼F¬ % Îà ‘ ´þµP€‘3ô°Áü´N¬ üÉ÷à ¿0 cº`§¿° h çpKŽÑ ¼²˜4@PÛÆÐÆ^\Áµ\©TËÒal¬÷ŒÁ@ u uQàææçYàc LPFÀ>çÔR Ÿ¶ q¦ +@Æ};±0õ0Ýн@!à:0ìPÕ ¼,L Ö «àL€ Ú0 wp£  `Fç=@©}•êþŠš-Xp àrÛÒP s s Û»U=D¾½hÜ]pÛÑ@ F ÁÄ<¥.Ó<Àæ  5P!5€ EP§3OSà ¤ð ð‰DêÁÞì= -ð W𫀯gøÐ0-`¸@À¯èå -É’lÇ î `È!Ô0ÊÊ0° ðªÑg• Yd #n ÌÒ'ǽ°Á­¦ÛD@TìgÐ Àî`Pqf€7àz.àdç ª° hP `& S -à ˜Ö°Ð1ó 4!‡àþÈȳz€Ø€n°ÀঠÓà U©î02îÐеƒF@í  J‹^¶Ïhª Á Ú¢ë$ …® tœÄ Œ1èàX äô¸xÙm~2 «p« ½ªØ€Ø0>"Ð à" °­Yµ×, ’ð‚ ë¯nÜ´Þ‹‚°CŒÐ— ®0Ï}I‚E J@K%ºPƒ0  ³0øÕFR°uå¼ÐÞí.P¤2`·)]8iå ÅN0e­rOpD  vL¼Æ ®ÆÁ@6ÿRkz× ´ lþTÑqÿ ð³$n ô@ ¾à:[© ¬ m £Ð1˪´è/ôß.`Œ9€x˜ªÁ2.p¨¿ ¶€ ‘à-\ õýA<éñ¶` p0c R`Ø<«p ‡3‹P,Y ø¦ Áæîà8Þ%@ŒL°òê’= äFnÐq Tì}kí€ã^>0 û5ƒ,ä\°‹ÀÇ>ðV •C⢃½4ÑÐ1(à C § êf@1¶Ø­…Ö­] ‰ðÄ-à1Éì:¿@[n*óÀÔ°kM0¨€ K Çà J_þÀ¿° ‡ —fàÛÎÞ/ßP–*àu5ƒó¶P20˜àóR`E0rƒzªÆ/ü(~âð#¤ À wÀp~@[^^@\dkÝýaÓåÓô@ºéOºP+ðÂxKmP9à¤îpã9p^ ÃhAðR¤ãœûeda-0ã, ÀW³/Ô¦áÀ¸`.Œ| ÊoõŠ8r ”!QVq¹æ ’?Ø\˜`bÂ… w>}Ù²Šˆ‰ ¿!p1î—[¶8€€SmY+0©N›×¯_}ʆDÏt ¬]äÊ5W®°þEÉò¥\9?1b CŠ+&îJD3!B„9J™4H 'Fœ82cF²™I“&s"CFòç.oìÐiëšPÚ @ÕV0l PaeÌ3´Páh6ëªHhÑrPÃÇ(Eª Àùsç øvæUŽ`O>)ð`Ü7! dY%)“ž;@Á‚;À}üVT»EKجEäxF7p¬X„?”y`  €æ {Ž +¤ÐzLì’h‚oŒÈPC&2àÁ…_L À…–"àœø%˜s¾±ñ›qŒ€Êª'qA[€£`¤JBo0b€þ`ƒÑ@ ‘á€"f¸Æaü8& O¬)ç‹;°Á¦‚qhçÅ‚2¡d¸‚ è€Áð…°å(m@g´þ´tʉ˼ÔbpÅšÈ" a\YË(¶›—öóšÖQÆŠÌ©†/ ˆEi¤YÌ -¡L‹Ì´¨¬2\' D’7º¬ BØ äš´üP-¤æÂs!6xâCr‹å€I ?B¹Æ8ˆe 9à€~’𹄦Zf™¨e€qàœxR ¨e@ž°*‰ŠªÇÌÑfm, àaˆ ¸%?ÀyæþšP )„ƒ[8H ‹En)ç@À Pyå•-ˆæe˜£ª‚hƧw2p€sŒ0"ÍoL8c”oÜq¡„8 o¶ðb À…" 8Ñ…¾PÄ=Ù˜j_lÑ GæøR…y°‘k½ øb•cb‰Bލ(£KÈð'wdd Œø& oÇÙ€Š0ÇN\tkb)GuÅòu¦bEÆpeaÐæGPË?ÆX¤ ? Ù×?¶ á`€ËE(GšS¤yÕ0äË¢!NÁBQ. ä -´èB‹=©B˜rb ÖþZ€ƒ hŠ+¬œkf1DZÀ¹6Ëpð€Ö¨€=X×9± @V8Ã8 8ð€9I(R@oœa-h/Úó{Ô ÕØ` ÐQZôG„á:h‘€r„BYH€Êq‹Eè~xÀ|~ò‹o'b³G*ƒ(ˆ b$hƒ< BÏèñ`«XÚ!˜€$G}"À}Ü à¿€ €oØ‚CX@â…"üâgÈAßó‹e¤â ðÃ^‚u8`zà‚°°ˆºEƒ ?aÂ"]й#€ÈAC|Æäà 2ÀAþ˜h£ÙÀ:²‘%Ì!X:¼%”ƒ zÀB90 kda ¦ð 6lé:kPÌ”CÇ€Á…i€k°ÈE ,7(ÈAA±†ðС©Ê!ªˆ:…(B…KL¢œÍdÊ€‡»Ä"àsÁ9ÎÁ¬h€¾X5¶ppÀ°Â nŽjز?7@…2¤ 4ø_k¾QO+¨ÀIø†¼ñ€ƒ 1~bN_Ñðõ ¾ hq ÝÌ&%aKQA‹jd. ‹EüÊÁ~Pã°Å>° ä'??ÔKQë&((ø†€‚OVD„&Á£à˜þ@züÂpF Ñw¾QGuÀZmH¾pð ¨e+Àwo`RÁ7‚Ñ‚œ€M°Æ10„i¬CP¸bÐ=ü ¡À“ >@€´£'îÈßxp†/àRÄ^ñŠ'à.xÂZPˆBÂ8Åd’GˆÂHpÄÖ„-`cކ–àˆ,èAHˆÁ4åº!ƒ PðÜ4šà+4¡@†Hßb! ”:€ \†0:qŠuX Óh_fPŽj„b Kø­J1=BlâlPÃ+QS‘v~ƒO¶hO‘b„&@B¨p*¢À>?pÀÖà:îÐþ ¨@ÞÀEóô?#R.¾WoÈ& üc@0ÒZ Pã  E@0 ä@³:`€` a@-%á5l ŽA‚ÁàБ倃r(ãE ø„d€ õ>àXG•­Èîu"²ÎAw<Á t]Å*a…ÒŽ‚{B@-d ƒ(a¡ÆLK€ àËx꜃ñøB¨)HñŠ3\AÞ £7Vñ @‸#Æ 9|!\è:špc~Á `šЎ é÷Oè ˆWLÇ [´ö B«`À ¶àˆ&Ü` _à’'LþS,-‹p0vÝ WÜ¡ŽÃBá¹¾lyHø‚'šqŒ²|A¸Ž˜A¢`á†-YÈš0*¨Á¤X…n…;D‚ÜÙ0„!žƒ&Ì!fD#Þ0ß*Ä"-ØH£mѧ& *á)5p à€Í@8öã€[,AVH…=ŽÕâ– 5Œ`‹ü‚R¨ó>‘ƒ$P#VHÂ/Ú%ÔÂÔ6wvæ‚3¬YXÇf‘lã⤳Ƶgá‡U,mX8RØŒ1à`-T^‰eXOÏ ‚QðUcX¬'à ?8ÂŽX°€*þŒ" T Â+ưbHâ hB’ðH¡©àÁ >Q‰ÎÊaà9‡¿ñŠTà Š8Ã/pAŠà7 Æ–‰ž? Nµ ¤­À|[áwø¬¡ˆf”ƒ c8†é¨°ŒÃKgD8Š Æˆ=¢ÀE&¨ÐfHáPQÁ+¾`öU" ˸ôG‹9¯B¸ðÃñ{Høà 䯯¨Ð(¬£Qcpƒê. kлÛ=a…%ˆ•l¨,P„S€‚RÀ‚/0Œ/ø‚%˜­,Cø‚Dá‚U@k°J¨†RØ„@à„2Pp j8=8ðŸ`fþÀ%X©ç¸€j˜…(¸1x)€„O J:‡œˆ/‹ð—'hZ{\P;+(³'àQ3´ã“R(†r#øE$H60…Lp€10S@9ðÁ;PŸ(ÐC0Ѓôº+à%˜YÍ{…+Hjà3jÀ0…°„Eð„Uà2G°$,ƒ5H19x`€_ Ïú€ #€X†L¸ˆ´Qû‚B°®j 8€2C€()8‡X†QPÅe >\x……-Œ+ƒOø–h`¸;€‘Â-; (˜Â# po þw-*x0¥û…Xƒe›S‚ù_8ƒO8«+¸‚/h*°‚^ €X…3‚U"x„;€C989Ѓi@, .È ?¦(€„â =˜F4¯UXWˆ‚l˜¦NPÀ*8jò„-è„cð»s,È‚cX‚Uh@Qx%ÀJð„j‚Mh„F J°œzˆ|¸x‰–ox€õøÁ(¼BRÐeð9¨µH †x+x9P°‘x8ø"£'X…®\_€3¶“£J@< †eXƒ+¨HЃg$…K[4ȧH@+¸þ%†E0„YÐà€1 …™…X€ZXH¨57¹‚wù"|…,`‚]ƒ&†y°E0…K™(8„-È€3È„WÇÙ<>àù«ø‚L …o¸‚GPoX†BX†_ð…ƒ@€\»‚‘Zƒ'h9)º-pƒ5PE ™k =Q‚/ƒ$0‡àâžUÈ‚º¹ƒ1ðƒ%ˆÄðZ±QË€4‰,#`€Gƒ$ 0ø„ð†Èoˆ«öГ`ð3úÌ¢† ‚<*Ø‚0 ´‚Ká'* HB:†1¸À¸(®u[à9$(¸·1˜6ZŠ,Xi€G…*‚Á¢JKþ „(Ⱥè„lPOàQAl,80ŒV/<( ¼Ð† „8#ø£L‚/@…¥,‡ÝX‚U ¡ØY=p€qðEèÏC8ƒs<ÄT Ù{È1S ®#o ³+Àh=:0àŸ9 †}âÌ4R`HÈ„-P8m˜?˜G¸jЄEÐC …ø(ÐkP†Z¨ …JðÍš´~\½º‚3†+h†_˜" Œ-È‚BX…qˆEø +hëx´9zG&`¨ …5ÀÎ<Â#8ƒJ(½$8‡ï˜¤+øÄBP8´'ðjøJÉ£°…XœþãÜ@‚\»t˜Þ»kƒU˜ÅÌ(ÐÌR¾_ &0z…X`€B@4 ò†A9!y€hIº_PGj0) ‚/À,81ØQ(øÃ˜$h‚1ƒP®zäk¸†+¼pk†UX‡@7479@LK[5Ø‚9ðÑš•Ý‚nZ…+8…!ÀGÀGÀQȆuˆ-°.Aøƒ?PƒVXÁrø[p8ˆ#Ê“‘Iܹ†¥j”’ÿ†C(eX…LxJø‚_¨+BP´…Z˜ [8Ø6jx‚ Ä…1P„eh÷ +PÑ?ñÇT¨þ…-¨„Wx€+Pºsx…H€5€yˆÌU€ChÔ1ÐMðf°$à0‡=ù‚JÀ…¸ZƒU(-4kjÐ>¶L‚@3\{9 "+„W`€ú€Q¨Õ/(Š…Åc‚ø…¨„Gx;Ñý‚‚5 Ž-54g=1û*T±'ø´Ò‡„•*(Ö»‚Ch†P„I‰9¸‚(pS°pjࡇ‡Ñ…8Åehº’‚3%ݵE€é‡$8m`€f›a€†•Qh$ˆ†_PW¸lHªÀ`À‚1ààñšOèÊñš`8¬ºƒèÒþ£.kЄz-³U6,°„Uý–ø`è*ˆåš.ˆ‚+ø)Ђ?ˆƒ2ˆƒ´™$iŽ~áf@Ü–XpðqY‚HX\(„5h_ø¬Qƒ¨’ À‘x‚èÖðGR°둤{´eP¹•‚e˜—;H)`XƒW0‚€c0 P…{ô”,°C¸=0…fÐH|TH¸ƒgІ>I0ø¬p”[ƒUˆEÐQû0ˆ„´{…JX†U¿3Ø‚Gx9pƒUàÌNç|ŠÍ‚@8ÌÞ%\À…TUo\[àx‚:ù'äÔþs(KÌ,@€ ‰ø…Tjð…' †&H€•|®Pè,ˆ‚&àgœ¹ýwr‡žáž‰ áˆ91"JéàF”Á‘o¨? •XðAÑ t“A霱h›r°†½À¥º)à‚c°¶ $¸hkp`À`à>iÀ…¸m‡]µ‚à€sÅoø…І˜‡sù  Z1J¸EÑAlÚŒ—3 ´'ðkx†PÀMàtö™9¨ðG ˆÂÅëj„fºØøB<³À]&Ñ€x'×}3“‚ 4­ð©À%  jpþ†^p †½î…  †#Ð?Ð @…%ðT†ƒ`= 0¸Gx)¨…qPR@BHP‡°9è…ÞÂû„ ø³*×£ª£¿ìl"ø³ø&`"ÈwX¤``Sˆ‘„0ŸH‚¨p¡»°¥Ë¹ A¹&p…¶Ñßà p!l˜†cðƒ@’”Ï (è^ú (†b…ð€b`… ¸€dðb@kÀþ  þ`Pqq(_À ¸€ ø(…A˜6E±xâX‘ø_ >kÀ?¨’gPe@…)l@l0‡q` ¨1_m †Q'lZ\X€(¯¹(nÜ™_Hsì$ ã% €Ðmð¸‡è8( ð¸Äv ЄÿP”X0©¨†›!¸†0søÂ&ðmðyI u¸‡#ð‚^P ¸‡ P…Øs ø€^È«úªÑJ‚ ‚¶ÓÇ_ÈmX€«ž³iÆIᆆ€Ð,#xzàÆoËÐsäF#Ð|þ‘8‡ck†q@†PhІ­˜Œ@‚39šˆ‡xp£d'Ÿaˆ}xø!?(Ã(…lN˜ÉS‚XÃ@ -‚W)…K˜!(…äXAžæ™ƒ9À‚â)i(‡NðƒïÖ’f… ¸‡ H 8vfp‚xã'\°éd_¸P%À€…øð_RÆ`ƒ*ئn˜‚Õ çø“9‘¦€zHz ôz†Ýa‡~)‡(‚Р"𘸠ªl¨‡d—vy‘†º‡@?hŽjP†"˜{`¹—{| «ð…0oþ(ÿ°–j@–Š…Y@Tx0=€œ¨ h|¹§|Ï€Qo‡DS„ h‚ ùF"€0w°_&¨iа" ½± ‘|ÉŸØý?çû³vrÜ³ä œy‚+ƒy`\h‚fˆª¹?~#`£‡sЀn€€r¸„}72I؃8h„V¨‚F`„7„€/N؃7à„ê „@ ƒ=ØϨ ó—Œê!>ø2øF`„F0ÚK(…»@h€øÒäý[®…Êô,ŒuQ„­[8­œX"Ju‘­IzÞ&Üó¦#Ä…Ä*ˆ!JÍp±\Üþsá–0òÍ€$l§@`ËV¡öP9§I ?ÂhѺ…®ZµkØøæ‚çn¢EKb‚3 HøF@©:´ª•«aAß¾Ô VÀÅ/5üÐò¡i–ƒjXÑ9ˆ5uI(´É™F W {ùÒ -Zô7#Dάu啜'&ÜZuF'½ Fè•nç&ÔÑ»GÃðâŽ#G>a9ó ιpG€€;çÜaÏ®ž#íšX9Ce •&íÜ ðëçÔb BJ žâ4â$HPI’8qÂH þIÒEœôW ‚öÇßœþØŸ’⟠oøÆ˜!‚Bœ²ÊRxa‚+Xœ’ÅUpEŽd3‡#PèáIF§€Ê%_ˆ… %xA^`‚çŒ3N9X¨áÈ5õàL4Ù„ÔBÍË<ñIp2ÈÐ~„ g”C‹«¢‰c·hÅWðM ¯œ€-i¥Â4”ð eðĆ@ÖØgê €-ßH:Ž2 8@‹càŽ¦·À Iw £¨X²†ÂÄRƒ^ `£Æƒ RÒ«€IF”ðŠr0P‚;%d ;&`à³Î"çA³ÓJ›\´Ï>KLÚþÉÔ­·Ñ¹`Ä/ÀFG@9äÀ=%”à™»î~s€=Ê<ÑDgP³:—4Òˆ]8ø_€œ¼!H"Wèß„a‰P±„üß›l2ȇ"`!G%MxÀ0Ž`ñâ Q¬sC(†ÜaÍ4jDÑI)Q\2Ç)\ˆ TPñÈL¬ðB>ØøQX2C9·xKåMp“7RP“.jò€7Pó‰Á³ÔÔR*´d¡Gœ× ÓöV\ÕàÃ9X¡È*¨ZÎЀÁJ,à‹2M(B -~TƒÍ£êÙ‚@<°@-Ê8†6)³$N~ø‹,q ÜñŒþ¸jŽ9iÑ*š D\±F¿ô ÉÔ­RÈ*ìÒã_šðlrØïzÇû%ÚvÚ~+=ç”à¸s¸F˜ÀaØDý÷ÑÄRÁ5L„‚gÔ­Lò„üI’ÈoðñÆÁ˜ œ& '¬ …˜P(aü¡˜Ä$‰M0 >(±…Q”àšˆ*b±C,†ÐCÚPŠEÜÀQÈ‚'š .` W¬@…/Œ¡0@Ť! O¸Á¨KÒ”jò´ I¨ñ\xC˜Ú¼¾¸àRX…%h!Œ1˜"³àŒÜVƒ_˜ã†Xƒ!´¡ Õþ¡QuÀÀŽ£!r¸()Àá¯,®/b @˜°sÁ10Ðà €jÜ¢wÔ„® QDás¡ \õ´`²u¡1¶°#|€ <…;Ú±ŠU|ÁßÈ€ô¨ã¿-ÇYËQGs˜ã¼+—º€;FƒæyK:Èž­ÚÁ„vàÍ&À6ÐÌgÆ ±ðÃ1Nq ,h¥¨Â F!€‰ø;X"öc°qV(A +Püæû½Á@él1ˆ”\Âcr0?Á³ …%®@Š,>¨ƒnPX‚¤X€…Uœ7Â1ÊщlHþ£ÂàN±Îõ°Jx€7 ¦<á …/αRj¬‚N$€LZ`74c b‹kt‘N´à€<à&(ÃH#×x„^,çø€2d°ˆ1€£+zAÞ9΀s¿P:nŽEèašš+-f±ˆUDÁQ(ß,NG'{Øc:Ž&]°ŠG0À¿€ÄÅ9\aO Œ ˜pŽq9KêXÁ 4ëœâaÀ5¨ÆhK‹ÔÓv¥æ¨N·~ Ìë7ß(¥®ƒ0Ýc&o‰?”cCp¢pŠmîÁv0˜ÁİŸx–3b Ca ëÂOþž]ÀÐÃ$0I¢Z0C+…3À ã`€<¼ñ @äT…x…¼a@æ°. q+X£ ŽPƒ%2‡RÌ¡ƒ~A‰HplCGJŸŒœã=hÁ#’ð|càÁž  ßH®€„gX3¨îÈ•¶bŨ¸çb‘W9ulì…zq„-ä Q€X‚cH›G¾ð±&瀩êt™+Ì2 (G5:wCÌÂeë dÚz‹é+Ð$=г/ÁL(Ax@b5¶:ÇÎ0Š dà50æ1©§ÉhØ)ÑÕ¸#£¯áØ£:þ.—v¸šsئôHv˜wa·½Å†* m€£~XG6.!‚IüAa˜0'À V¡ýS˜Àß„n-!FÌ?³PD¿?8˜„žÈÞ/R,ƒ_â [=ƒ–A @ô=` aˆf@aŽð„ÔЊ*€¢è× Ìp 5@áÑ(G…­”[¤õ.øž°€oÔbOÂ9¾± €š¸†5$ºMÙX¡E ”Á[8 ErÍq6ŽâRˆÄìÑŒE(ÍS·x²O,”Qb Za!Q±h;³€„` tXC·ÈÊ™§'”5ö …þx~a‚v”@{(D%® 0á  ä 0aó`‚©GÍ[·¡½Qò–w¤­ß 6î˜tt°séoÀÖ@^ž`‹ÅŽãè%¤ÁˆVh».§ bñƒ¼ƒôÇx\;7ÎØ~ŠÝùùíZØDè &P#d!B0÷;“˜OP‚,dñ‰J¤B Öˆ0J¡£A´‚}`€8¡P¨!ó†0ø™@)hA-”  àBHB ó @ n€Ä-€¡‡%Eå:`Ž[h"°Ì¯á‡[pàpòÀ(t@ƒ ¨ÀÜÀþ'hC*€)t™2ŒCÁI Àã¤Õ@ÇÀ, Ä $8À,C(‚B”:DÁ :pÀBÔÀ7¨™ä˜Oå€ôl X–ð@k\ÁÐÎ*4Á7 ”C(8B@Á1dÃ:8d ¬CÛèV,:Lƒ)à DÁ!PøÊЃ¾¹Ãlq‡+õR·|ƒ¦ÙàkÐCd@€°€@<Ï9Ð@ ˆ%´#At&ˆÁÁˆ$8—A¢ãÝ„A…H"ãi^su ÀÈþ\—p4þB ž'€B0Á70Aö0Øù`öDC-j€Œƒ 8c¬ƒ0xȇ4Â&Ÿ$¼ÄA :`:ˆ€óY_Ø<ðÀx5àOi($H•C(Üù¡‚ü)Í-Ìœ8ÀéÀÀ ¬ hœ 0àÂÜ <Á'lPà èX|Y5ŒÃÂ#œ)$Á8€-€³IA|Y=ÆÜ! 04CŒN3èŒ#Ü€#  ÁA=„ÍtZ ðÀ0äÀXÁ#@ÖXAº¬Xԭ Ò<5ðÙ(|.˜‚#xTàÁT.Bþ8Â",ÂR)8‚)¼ V®ÂÈ"p)˜B;~@¨•¾iÏm(“Ð!óDÇóD‡P1`€ì€ßʬEŒø€€B üÁ$AÄàZ$ ‚B'JBuÁÀàuéf^¦d^9•"ÄXèÁ\ÌàAðQ(pAˆÂ^‚gîÚãLf‚&!d¦hŽ"¸Oð'˜þ„4ê&´%Ä%x‚' \B­ŠŠÌÁˆ‚ÍLaˆBHyˆL‚º5&3êG9a”['Ô@0H'ò’ÃL|ãD`x#.TÍœÁ|‰Á Ì XA&ˆé ¬Â<BTÆcÌ€)|•¦(B‡ 8‚áÃ=`€ŒB€â$dAPÝ%øà/PÃ’ÆŠãdã2|<ƒ"ÀÀ3‚)\C€Á,Ђ&ÜA3peP‚)<š)ÈAB]Á#ÂD«*ÐÍ+<à×*0ÁÉœ¾QöÁ ’"<Â*ŒÅdÂ,ƒBê 5)X‚(Ã1À‰(ÈAÏþÞ)\ÁPC¤ÂŒƒ<ȬÁ24Á”€ ò€;P$v8²Ø]·@¦ Ó±ÀN<h@õQ˜ 8@xÈ%L¬ÕÁØA¨J‚fj&¥†'ŠÓ¬¥Aôt¦þ<¯ '0g+„Þ±’ÁÄÁ&à0Xné=ãPÂ%à(nŽ€Â)\D `n¬=Ìþ€æ~hA#ˆB'X@0¸C5B+u.…-dÉœ{h€.ðÀ2¼Bt›ÆÂ"€Á Ha800¤U€:´É¨LêDÁKú:Àÿ-Ç'<‚ü‚WÁô‚(C!ü× íR þ@ Â2Œƒ0Š&€ÁÐÉX9D!8ÂçܧŽiœR3<€<‘7–ŒhÝ|Á´Ã9pGÐCLmÁlA!´Ã/¨eœQÁ*ŒC3lºÊAk0A3Ü€%´†7$Â'|§ LÍ*´€4…°\A3„\œÐÞÀ(0À90ÚÖ!0- ð^, €ˆ€+”ÃU9ø ä #(œ%°*ðuAb¤!$B`&¨râýˆA¤”A8ê&!ØÁüÁðÁ§Ò üÁ!ë& HèÙ°l‚&7â$Øxr ذšþp–² ££r×äEæe&'Ä(¸Âó¸ 8Ÿ-¸@R¸À´Àô¼T0,€|Ádä}1Àè)TU(ÜÀ àÀôÜ5äV Â…B,TÃ4 éÜAÐ8ÊXA!h€<4P¢‚Â-H$å2HA0 Ñ_$N‘‚2 ‚&ÐBBüÜ!gCƒ.°É@…@B‹Î€ØƒŠ @¬‚‘JA;|  ÈöD‡NxÚ9<Á<ÂPA%Pñ((‚x€dÂ(,¸ÐBµ‰(‚܃:TÂ*H 8ƒ/xÂAÀ0lA30@;˜€þSCRód\f]Úy¸€ |@(œÂ‡”‚%Øq•ߊ”0 A À1ˆBé%ØArQõA|&äÂAk&&$.##"”A° ÓAsR%ÐA A&´A&ï„X×+ó%ÛÁlBèòT¶º)òºýÁqþA h†øŒSÁ´²§†A°ªH€óÙÄ<_xÉMÇ”áÂ(àI\´H)@*H…!”Ã[-$¸A(Ã3p€œà4DRdC(pÁ5˜aLD5ÁÿõÍ(Â`ۃà @Â*‚"(Â8$Á}€  ø‚DâÔ*C(‚þyFˆ%ºŠà°~ÒÂ*ÈÄÂ3|LV”@3ì4 ŒlÁ+ÐÃXBÄt âÔ#¼Â7|$¼Â*¼Âœl¼B!@‡Ÿ ¨€ ŒÂNž‘y@ ,C*¤|‚ Ü@*¨€( |€èJa¸€¶Ði AV›U¯í¶ôç€0 _¸büAé¶‚xu)$M9ˆ‚#tõ¢ÆÁ!KÂ`ÂLf€*!<®âêµ§V‚¨XB ²t B&äù#|Á%T¼5m.do×*’ðÁ©îýt®†ðÁ&0#0cè59ùhr:›gþÇØ2´Àï @0à‚Š}Ã/Ðö<5HÊú2ÂXAdÜBD­CUÃø€2Lì,ˆ3 ¶Ì’“ÁðØ‚,¶ÀÃ5Ê`cÓ69DþR2©b“?Þxà A"S“±Ê,£¬ U5TÕD, ƒ“2Þ-<ÊÈ£´±‘Kb¡6Ùh®ÇÀ…s¾ùæœ` ø%˜’À…š3 Áà^€¥‡eHˆh x1 ] ¡; ¸'"< !~ùÚ\F#ÎAÚ Àjü¸%?Z€Ák®¹¨œ[,-‰sƉ¥g@ÀÁrÄ1uôpu~¡Ç…_2(žÜ1ÂΉÙ^ î¡·C”}&¡Y R??bA% HÀX¤=1¥Žg|P€`ªýË+C4B„S(aƒŽIÎ $¨=ÈØÖ.ãþL’¯%«ŒMéhD(>¨@^¡ÍE­ÑEÁ2*µ²à°c“4ÊPC06À¾³ ÅïdDܸ& “Ñ.c•±VÕTŒ>±LÕC1c“_}Í‘<òHLò˜#.‰m¶ÚnËúÊo‚±eAÙ‚`œž‚)¬8#RR±a™<Œ×€<¸ç„&€ Âûîv Z8àoøæƒ ja `f™aT¬†èà€,âTï ؘ||Œá€$ðÊzq‰ŒÞxÂÀ„_D( p‡ rp3”@‚:£—‡&2‘ †þÚÆa øÀ pÑ y<Àõ°€9äc i=xˆÆ„q <¨›ˆCøÐ…=Hâ ”ƒ±(.º© Fƒ‚E‡^±!tð*ñŠJBQ¤QìÀ²ô*NdÑcÊЇ:Þ‰­CØÌÂÇ>ÐAvˆhƒ¡:´¢iàÄ©(YII$‰°C&…"‰=hæ ‡Šƒâ;Omb}DTèp #x Y½Np ¾àÁ°ZHA Þð5l …¼¢=`"ÐLLd €20d š'ˆ€5# „(~pr` <`/<þ€F!0dÁYÐÃ"fá0ZøàKG, ¸+à"´‡9ê¡ mÔÀ½j¯{@ ÁØi…+„‚¿¨@4L &„â ÑØh 0œ4ÚÙJWJËÒæç € Æ1ŽoŒ2°ª´ù,ãôXÖêáP"›0'†™Í,&u:MZ§DpQ c Kâú;5Œâ6p# VQ…2Ð-aØ‚õ•F). ‚ˆ!ºhGÙ½ÎWlh”I¹A²0­`Ä…RØÒñA o8KÂÐ-´¢'vhDñ‹+ƒ§úHˆ2ë~ð@þŒÀ»eÝ&h âA-¼ÁoÔB ¨EóÎ@ ÜÒS1z‚ÐC^#ˆ¡ V|s '`…@ ‹)ÄŒÄý¦¨Àß|CœB€Æ\ð@³¸ÆV‰Pp`HƒpeøBR0GìZ¿æ(ÀBj/gDÔ^ýÀ2ñ&Œ#î!²ðˆ l‰¤ê8‚*Tq„ˆ¶0"µ©Ò†«ôÒhMÀ$(Ït€v€:˜À=ê¡ ½–õÆð€‡8üœèÂbå2f`ƒ\ ñ&LŠ!-›|TìñаÚÀ[x…'Κ*úxÈqÊêiþô(§²ôX¿â#ù˜Æ© 13!aÄ euü§ÀÖ(3S²­0+\,÷Ä;õŠÁ"Kâ‹^x¦õn-…'È`—€¬ ·e´ÀÁøÆàc„)àða™Äñð –. €8VòÜhÁg )ù‚–±o|ãÿ@JÎaK\AÂ`(îàˆgø! 0„ÆŽ[(Ãì­A n1í[\»ÚæYÐDâ£2ˆ„5´l0(°Æ"ÀPpÌ# õÃ>èzÜß÷ö°‡o´âÅHdº‘… pSk€—ãž¬Ñ Qð-ƒ£Úàþ ¯0Ê­nê¡,~q8ä!ÐièUØpˆJ„õ[°Á'Vq˜³°…­Áj“ì`n–4˜r°Ëlb;ÇéÜqñKåHî×Ê)ÒS|µCï‰Làt€:2!„LT® dØ[cÞÇ¢!³›ýgø@¦U€P¡ÔHBj‘„ø‚FøòDz étÁ´ ]àœûÀ‡ ÿ‹/gçð†Õ  ]ʦòô R ¢³X0®±°p@Ípµ§e(#ÓN-¯©²`üÂh°Æ8˜  TÀฃÜ} mtL% Úo÷ýþÒ^TФ(ÛJmäø$Á¾x@ÀÑÆî}¦7Æ!xàVÀ îÀ ‰.I1DŽ­DÎê$æ­Ê"5âÆý‚0á  á¶¶`,A 2Áø†å` ¬À ¡l`Ö !HÎudgÎ$0NçŽÎqjÌ'z¢ÆìqpÌ@ § ZA(Nú,Öï.Aþ°©“Hn À§‚£ž XKVR’À ¾ @@hñ8àæÁ`äáìA”Á°Å:qaˆ´ÁÇZ –`¢ÐzC>è4 š!f8À BaôȲ8`Ÿªf‡„¡ò£„¡äò|ÀBäáí~äAäÁš!BѦaüÀ\!n@¬Á €šRä¡—"ij0-à¶’dtcA<@{úít¥PjZ¦Z` à=np’€Œ`ìî!>à èáT,.-¼$Ñ­B®Ë`®D®ÈèþDqÉ þñVn: a >áÎà  Œ;ýQo ,Ú¨,rd'èÒÓèÉSÚ n"Hv(‡qþ/ð@¯bgÈÀÞ®*@’®â„H²dNx 8% ž vdÀæç–Áx…A¢a4A D…a´Á´áÀ*€ 4‚oÜíE=è\`ï~áÖ¨ÁjŠ=äA² Ä HÁ?hÁaf¡ÐÁ€ PAÚ‹D§f`„ap€–àÆ ”¡¦Í4!€A.Cáb@Ð €ab Á„! þ”¡– €O9 .Âüà"À¥¬fZª…F_I"2&ÈC`ÞC^a¤eArp4M0@¢aA J¥ÔFN¸Qä0rØ XÈBvöˆ,…ÿ ¦Ê^a:§‡;sµViÕV{ÕÎÀ.8ÅWÄì<Ñs=/ðWèଆu@nrÒȳú€ $ r¬,äDh' 0iè ËChéYªäJl¡´êŽ” [p!%—ád€ÆàÆp` øÏ*À¡WáÀAäÒ¾`,ÊòõÀ¢Ü-½Á]GÁ *aLí ²` b¡4a Hô@þ´4 P4anÀ „! äÀ€¡ á¦!šAF–#PáÙÁBaR!žÖÁa rö ŽÄN£„ „Á ¶ 4H$j 5vÚ, ‰æ§ð d~jáàxpmö„¼áyž€বe~ZÀš€à6á 8AÚdp­Ì"çW·XïªU﨎„®¡ ÄÊV¹ Áq•;m5¦ó ¨ÀÜ ‘ ²«—äš!‡õ ƒev\'è6ÅWDN±R#5ÔB2ÊÐ P |Â5‰„ç`&„`~á¤`x¤ í¾þÀ fÀ°`¢à Á°ÁÚà æ± š`° 6 b î€ b!† ápÖà Ρdà p ×|7 4PÁ²À –àÀà–@`Á Áî€S‘ ¦Á<á!ha4 ba2c! Ú`na À–€Ða ,ÁÀÔ ²À²` :!ÀA ÁÆ`añÚ`ü€k%š…í€Æaj@̉›˜‰`w €–á–á Fб‹ ¼À € (•j -TðP#XäätßÓïêç"GqÊ€þè"¡/Ê·róÆT@W}ÕqS!îÀ/äst%pXË"nàæs w>gçó€­ê( 4R,|¡2Õ¼;©€`4KL¼À~ @.! DÁÚ6ÇÉš¯ ‡rü*èˆ.³ÊÌqŽÎ/ð a ¶àz¼ÀÀé,hr+wz*!#óªYÕstt­ÓÂÎì Ù «ø(vàâ¬PP.©v²jöÚzaeèîm¡H@Äû,€žà þZÀ_ºa[΀>!ºá ÁàÆù ²€¾¿€¶ üÀÐYŒ¸¬)›á^á ”r*À À€]Àp ^àÚcðÁ–áBA#| ,a8@€a œWaOõà‚9 fÀ?¦Àáh, Œ¡¼!¬`ÒAp¡^a¾` B! ¸àô`IôÀÐ ô Æ Š¬ ¬Œ ÀkÓ]¸Vˆ¼AÌAlöÔ`Ê ’öß«8 —À~A|à HÁFaù‹`°!–Y\aLྀþì€ 8¯DŽ΂¯BÆç¬Yã&t.‘*Gè0 08åè2¡Élõ·:²àÊnäŒõ®L! ÇWô(‘ØÀ³6e 0ÿ@oÕ†PœÂÀ¼„:¹gLªvàDî\ž'¤à R¡¯ `!6 Ráê`–=áTàH! HAùBÏà*AÜàv ¦ øAÜÀ ô¦9v}H`RÀHïë R À `aÖ Zànà r >@¨!ºú ®À:e;Πv¡b¿dAÜ^ï÷/„i¨Á ¼ >þÀ½aZ` aD:¬aÀa1ÁÁ¬!ÆÁüö¾!,@ˆæ¡ æ¡˜YD +áJ¡ž¶:¡D@Dá…=Á¸×a(š¾à3 `ý;Áýñ Ê•’&¢—9„‘ÙÄÇÌž=œìØ¡“§"E3ÂÌlJS†M6ó”©H²OD ËL,òÏǸRA—‹o~°è6¬2'8~ ƒà„«ÔjHÁfƒŒ1Ú8XHà-”¹Xx PbÁq2´ø0ÀŽe*d±º€ÁÝ îaèÑcBYLÉ`„/LŒ˜ðâ!C/C°ÅƒX\ÄK'CÄK ëäçJ'û­c`'P¸rL "!‚ˆ`(U´REqÄ(”PbÊ%ÒĈ :M…žH# QJ)§ˆ‚…4sœ"‚Á”IÑAˆ Rˆˆ”fðAJE©‘‡“EÕ¥R0T"Aþ!¢=ð¤¦M6rH$BEeKFREPi`’FSeìY•R{ÚÁG„¼ñ„ðñ†$’tÑE"pbGƒˆÞ8l¹õÖ%d€À-åÄRP)Tª"Ä"M9”ÓI'å¬ê*^èô÷:-–ƒÎ:¼FE ×\ƒW„\ãJ¨1XsŒ+1øC èôåÀ´Â`SPøE9٠አ®³­èÄà+³ý•C6Ù@ÁD4ßDcBî¸ÃÁT`DT0Ž(ÁŸ4ãˆpãŽPtbáŽ:Îá°±4< AqÅ;Šr ( ˆH)“´Ç!v…tØGZ bF)þB˜a†Ž¢ˆPŽŽ ÄaÆ$Œ2H­€BjTA‰('õ!Mn¹e”X–d•ZlÒQCÁä Eq&I0±‘I!*rÓš6½òæQl4U‘˜G…žd]e7!”{\•èd½±‡¤a„!&˜ìÑÊ (ôÒË/mµµéô|“p…ƒL¢…Èìr Btóæ:Êlºé;’®c…£Z!Ì®£ q9¬[èCíGûîZ|£ì¢*ªë­ <ª´Wè¢ ³ºZ”2ÈŽšOR=(“Œ<É0‡j4BÉ&ƒ´ÒÈ&\µ²‰›0"ÊCã‘F”)o’Þi MGþŸv¤±>’ñÊú¶g‡¬xm(Eá’˜Ô¦tä$G9GNB’&¥œ€žFìp’¤ %H:Iâ‘°a6@CNÎv6d"G‰ÒHèD” "å*‘òJ¼â”ŠÄm{àÃ&U8—|E ‚ !´à‡^dr‘s‹0PWÌasfà'µ(Á½]XT$Á -pBpA|ÈC´H†7!+„@CÈ@Ç?hñŽZ 2ȉFpBZ¤ á3™• .c˜ŽvtÈ™Rƒ„Ä¢Ì ½AÒedØCV¢? -%e! žD¨þép$HzÞ¢Òòé‡MùŠŸª‚þ‰¦„aO‰Hƒ–/ò-*˜`Cú€µ°ém€RŠ$*2'“ ) ^ITÞ&¦>Èo{xCV:3;å›D±`ŸŽÔ9œá6øÄNÚôŠ3¸%3\ÊþDÒ’·¹dOMº'¡>%?í‰%l@C?톰 o`ÄÊ‘  ŠmÁ@4ü ½IÜQ b‹ÄŽfTIL"¡à†D`b—%åeAy ‡«4,r”LÇ(‰7ÂQ|è‚!Æ.lqŒtÜ#øð:râyäǨTCÑP1•DyIPĵTR÷‹ 41AP½¥¡nR©J,[j¤xõn³¼e"¥UþBl´¥kåhB6ŠÄŽ~¥£‰à(&à)8H" „ÂŸÄ ”;‘)Ov+G x¯ða‡±Ü!þªÕ–<Éf`ÝëÌ¢Vìï(ü<R¶6õ¤i?ŒÛSªB'jvÉmbb !ô4ΓDIRœ©X@ú†F,4-&xKä$Š Ho‹ŒêBF3š×$.7¯uÉGß FAlÔ¤HŒ+]aÝë‚t¯'=ÜGŲ[Ýr7ª’(o"ìRF…å¼ &È’’Òµpp i_תR¶æ7Rn]«Tò;K—Äò–NâˆIZJà¦t”¯Íï[ÜQ1ôAG”ë['Ü×#z•¬U¹ÊHåàµþ‚™}œ¢ú'‚ÂÁ‰0&Ñ7DÝéIE,V碂¸HGZ8Ú#"±Šœ°IM€„MÔ ¶‰²µ,‘R~(%·PõlJQ$Õ‡’".]DÿÌàà wŠÑ€ba2¤—»Ö iœË\1< a†.„#¼á O8‰Î+¬[aþ÷¿÷Ëh¤è^úÐtÝèIóËÒ×Wч¶›Y»L=ù ÄFt‰I1!‰“Bª¤Ý«.õ*†„è2Rÿ]k"ÜÊÑ>\U»t&ĬóÚ‡ù®ÒpƆ›"§‘’…µ7±UÌÕîNt°‡èð!5€bGs€ØË„ðŒþ⯨Ä:ÓˆBâ°EÄdOÅ–5€ Päͽ™5Ob­eÞ`ß÷îag¹‡C1ж¬%U¥ Cy“H^õ敼‘ïvJqìFZ¼‡ø]Á"WWÓºä½)¡a½è Ó•¬8„ƒ­uI^¦¡ “6œßÔš‡¹ÎI°= — Œß•òR-'/xÃð¨ÃZ²* ¬ádYt$æUØ’héFà ÀêRÁ®¶ŸÊÀVÉÞs(N"áRÂ7:ܘm_.Q&±aD„(²° œ!jÂIN*Q‰TÜáhìþa ¨¤ÄO]x9ñ¨. Ž«tá$Á‡4ÌÁþx"Á#wð˜å6¾ o8wŲ݋c¼ ‡û2Ä#Íݰ$ñ¤ït¡§ÎgˆW˜»³§ëÆ%Ìúâm¶ný Þ©{^…ç·äº‰]× ÆÒ«d—%±×êi[ßoøRÑP¦oண¼ øû§½¥n`Ž»üzÛºVgÙ§û‘Åe¹ÊFP¦J¬ $X*ÊþÜ`‰G¬b[€6 •`n…P [ ó6JÑLÓ·'?TMùXZÇá×'¶¶W|Åvp ˜Ç×îppУT gØÅ]''^ˆÃh‚–zª÷‚¤'lxÅp7õtŒæ‚°ÇpõQ¹wr¼·\×EzzÕrwu'Úgþ¶…•(á§Vÿ„'Å×V½fù¥}OQBLEÁn7C-QVPÁZJÑ'tóöOJck÷~gø'ô4oô„O³$qãv5dAv˜ –>x rð–ð&(á 14a¸!æjúà7X-eB}Ð?ueVÆ_ù… BT e‚!8‚( „´E _)¨g`^ye8b^wP™( ‚ÐQp&éetºh8ï%iD8„ÐuqÊ…Wäh¤ÇWUÇVøSK |dQy{À7xX±´LúäôÅ_…“€|À*~«[¯d|N1X`e¬Ô€kÕ6K1V1'eþ˜ˆå8b (7Á$PÂ(MÒÁ6MÒù$t€jþxL>$%v#'Ù~†}rA]RY‘XüµK‡£M¥P÷À÷ 0‚Ø ¢ g"§[¦öp%Wg¬hR%ÕŠ÷t&ÕQ’°]­(^­gPãeq8(i+È\`ÖƒEÙ‚SGWXkpëg7‘R8z“*%kÕ|ºfUa±K³•C;t…V xBa¸}o¸ubõ6.Õ€$&V¯Ô€ñd޳ô5OAM4NvvQR‡n÷ÿ¸$YÃ$˜OcA°—ëÇZTAbþˆçh³eóõQí5 BPõaþ#‰ô (p’sÀ9dRâ’–9‹¸^ïõ’£VzE‹Ð%lÎõp¢_¢×š]ù]ùQM×›B7„'ÅKb`b%Y–u÷4k•Œa ‹ÄÉ‘Àæ“5_¼Ä›$%l.—~%$&é'nÙ˜×K[Soo¹}§r|buù3T’èCw‰@`Ó4„i‡‡i˜54JÝ —K8‘Xè6„mÐms'ûXuScÔ`3›yçàŸ‰è€°Üõ(·_­öVÁ{¯xPÁH„( zÕi”åå]æ5j9)lcW²¸p®ç(²×ƒaùå`ÆuÊÇQ~³W 1þrBø\=X82z]—Ö£8´Jw5Xà9žPZ|ÄeožU¡žÿänç÷'ïæÎ7výcY±Å$ô6vˆŸ¢Ô¥Í¥Ë§ *[R&xV `³µ[1UF6c"I’P/R ðzƒ¢RH´QÖ•a±÷‹±GgVŠ¥(„­Ø]µ—oöt¯G“Vùt;ª“v8µ f—_ÊEkxÖq)a@×ru’ÆWp¶\•Ù•…a,µ5!V`xò‚ÅJƒ÷Ÿa¥eH(\—Í'`o©`T1E–rˆžó(%ìÖD[Ñ$FÑ'Tþä˜8eË9U7Ø´Cv°(`ôŠþ²(–Ô§ “³)ôà Ò0ƒPj'Ø“Gœÿ…8ucU‡“gŠç‹Å©k7Uƒ–z•¦¤×It’pÚitö%h7%£“ÆV†ó±™Œ¢™(|»ÄW{ƒ¯H„7Ê ¶¸VQ×£›ö•$WVÇ—•Ë™_‰¤s3'~“Kmh`XX–x“Xc²…%aMÛ·OáY—ö[Ù%P¦éÇuaûs ?úsJ‚ÑYšÔ=úº>Œ`A"Ø `-õ*\ÑÐ £É¨Gq(õ±J*°4Ùš?7±Y8‚+¸îZ¸|0_šH_ˆó”yKdAPèóo›°C‚•2'%þT¡4д>‘'kƒºu“œTù¸3fJ‘2_-W¢%¸1¸ºËÑxeŽHlø“2Ñ„>'&úƒˆˆû()Q¡»ËxC±?îé4àd$òIC£„$ ˜Ùú6 (&C#qÄbù3CfttÀ!k§1¢$¢ žp ¢ sÐ9ƒ sHúª¯#3ùz §@ ño[š·ð (p#fÐ|M†b(îªFAô üÀ{àfATS\ÁÜóÐ#Ãçc>0 ¯  ¾jë0ZÐ0ëë0qp sP .¬1‚­°1B ­Ãr„>ÜÃ=ì=­Àþ=›àÁéc>Z1)9ÌÁæÃLÜÄLÌ=>ÌÙ£¼IE"ƒà3B`IŒD1B0s#:"ÆÇƒ*¥`030s ÙâP XÀ¥°¾=r£1¦@ U€F“—é˾r|ì{Ç/Ìc¹s<6b3" 0ÒÀrÌ#gü:;r X€¿ÒÐ", °Êò+ý! ä2à|q’‚!€þë¿ r*¿y½€÷à¶~Pp“CÁPR†ÄHÂ,Hq'3“ ¯“Á“ ¡™ƒÁÖÓÄLÌó[Ì/ì0Ø$¤B7c0à 0°þ*å@.Ñ2ÎëàÚàÖþPp £PÇp   LÀC<Ã#/,ÌŒ4*6Â0s l<\À¾o| §1‹ÄÏ;b#‰L1ÍÆ§`r ç¼ÓàÓ°þ»®ÐÊà# Là(M¡îP 〠~àé¬ Eð 2 ` -.Íãß   à æ0 E€ ·àÊp EðÔ5P 5P»-Ñ2-Ór¡Ï,Ó’EÕ€ 5p ØÓ~à·  ÊP ðÔg Õ·ðÖ  ¨à0Ëݱ/L`%€êàF`%š¨²f"(Ó¦\1]\~€öÑ þ7’n+Ñ ô@@ðÙû*xá"¯ÜÊþû*PÀ;¨R*Úì: ÃÈØÛ±­Õ¦íê²}±+á| þ°õð.m ȽÝÐ N Ä@# .€F@ F0ô` 00¦<-Ár¡Z=Þ¶} þaÑçÓ`Ñý1 æRg- «\-g]ßgÓ>ß> k6ÃQÚ0>à¿ ð àÁàP. œ›â!@@¾  »p?@S .@ Éâââ@ à :@GÐâ,î /®GàQ$@%@ $ þ9NÐ)Ÿíã0Áþ Eþ .Pçà !Ð pBØP#Ù)áA¿``N `!Йp±)Î@l~€àa~*}Ù—-kÁ¿—miaË·ŒÙ™ÍÙðÙÝðPŠ>-Õ`ÞŠ´ -ÁbÛ¡b ÓR‹Î1¾}Îö]ßå0Œ­ € ß õ  Ú€êÚ`p°@ŸíS`ëœ F D^Ä@ ç Ú ÉpÔ­Ý!©ö` ª Ô^íÔ® õíõ`öÐà0­ ßn.P/ãþpêãÒêN¡§1Øpôp@¡ßðîbî' #’=~pN° »»ð! \¶ÀpBµìæ´ì8Ž€nNp”=nÁå]nòX~Á ò)m` ,_ÄÞ F`˃mË$pªàæ$0á›Î 4G`ËqkË@ÙpîæŸðDFàôðD¿ð 4õn»ñN4’!™Ø ¼QÔŸPå=ï%ëéÐìÐö‡^ÔÝ@ áNNÀà .À.ôЂ?EU>Î@ G@ ªÐâQgþùÒ Ñ íK Ñß`L` L  à ÚààÑp L€ 4]ØÀrû±‚´™—y\^p÷` 5EòùùEržç²i–òù@êð%ð½Ðã  °€Ò$íðnLNÒîà%€pNpo>E¿$à$àFðàÿÀ^@Ð Wû_~ÎõáÁƒ‹oõ*Øs¡ÍÅ64bÜ8&$H`"L‚‰ˆ9z¸—A¤H÷¼d0ñ랇0ÜðÂÄŠ 2ôºgä—w&2ürAàœ‹¡p碄‘þ‹FŒˆì5R$6ªõ,¨@À %2Ü;’„@—eUð@B1÷ø˜‚Á”üD@z&üü·ì` &@zøCMÃLLT¨€"Z4ªÚ¢ùÐVá—0?±ùˆáÇU9±B—ƒòy#GÃ=.ûz¥À73`õ«K²°_޼xÅE‘Â9f Y³—U÷LÄ<™¡UÈÚÆEƒÌ…¶_¿¢•èƒ O9bèX±ÊQå F{?;{é–šÁ#Šá&°YŽÆÌ~@ë~AAÎPˆe(D¢?Jã/¢‘øC¡7Dé—o¾ÙÉzJp§sxrE–§ŒøÆ­–"? <Êoœ€;fv5.4/tcltk/pow/notebook.tcl0000644000220700001010000002075110220563430015456 0ustar birbylheadev# A Notebook widget for Tcl/Tk # $Revision: 1.8 $ # # Copyright (C) 1996,1997,1998 D. Richard Hipp # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # # Author contact information: # drh@acm.org # http://www.hwaci.com/drh/ # # Create a new notebook widget # proc Notebook:create {w args} { global Notebook powbg global g_notebookTitleFont set fontName [font names] if { [string first "g_notebookTitleFont" $fontName] >= 0 } { set Notebook($w,fontName) g_notebookTitleFont } else { set Notebook($w,fontName) [list System 16] } set Notebook($w,width) 300 set Notebook($w,height) 300 set Notebook($w,pages) {} set Notebook($w,top) 0 set Notebook($w,pad) 5 set Notebook($w,fg,on) black set Notebook($w,textFg,on) black set Notebook($w,textFg,off) grey50 set Notebook($w,fg,off) grey50 canvas $w -bd 0 -highlightthickness 0 -takefocus 0 set Notebook($w,bg) [$w cget -bg] bind $w <1> "Notebook:click $w %x %y" bind $w "Notebook:scheduleExpand $w" eval Notebook:config $w $args } # # Change configuration options for the notebook widget # proc Notebook:config {w args} { global Notebook foreach {tag value} $args { switch -- $tag { -width { set Notebook($w,width) $value } -height { set Notebook($w,height) $value } -pages { set Notebook($w,pages) $value } -pad { set Notebook($w,pad) $value } -bg { set Notebook($w,bg) $value } -fg { set Notebook($w,fg,on) $value } -disabledforeground { set Notebook($w,fg,off) $value } -font { set Notebook($w,fontName) $value } -textFg { set Notebook($w,textFg,on) $value } } } # # After getting new configuration values, reconstruct the widget # $w delete all set Notebook($w,x1) $Notebook($w,pad) set Notebook($w,x2) [expr $Notebook($w,x1)+2] set Notebook($w,x3) [expr $Notebook($w,x2)+$Notebook($w,width)] set Notebook($w,x4) [expr $Notebook($w,x3)+2] set Notebook($w,y1) [expr $Notebook($w,pad)+2] set Notebook($w,y2) [expr $Notebook($w,y1)+2] set Notebook($w,y5) [expr $Notebook($w,y1)+30] set Notebook($w,y6) [expr $Notebook($w,y5)+2] set Notebook($w,y3) [expr $Notebook($w,y6)+$Notebook($w,height)] set Notebook($w,y4) [expr $Notebook($w,y3)+2] set x $Notebook($w,x1) set cnt 0 set y7 [expr $Notebook($w,y1)+10] foreach p $Notebook($w,pages) { set Notebook($w,p$cnt,x5) $x set id [$w create text 0 0 -text $p -anchor nw -tags "p$cnt t$cnt" \ -font $Notebook($w,fontName) \ -fill $Notebook($w,textFg,on)] set bbox [$w bbox $id] set width [lindex $bbox 2] $w move $id [expr $x+10] $y7 $w create line \ $x $Notebook($w,y5)\ $x $Notebook($w,y2) \ [expr $x+2] $Notebook($w,y1) \ [expr $x+$width+16] $Notebook($w,y1) \ -width 2 -fill white -tags p$cnt $w create line \ [expr $x+$width+16] $Notebook($w,y1) \ [expr $x+$width+18] $Notebook($w,y2) \ [expr $x+$width+18] $Notebook($w,y5) \ -width 2 -fill black -tags p$cnt set x [expr $x+$width+20] set Notebook($w,p$cnt,x6) [expr $x-2] if {![winfo exists $w.f$cnt]} { frame $w.f$cnt -bd 0 } place $w.f$cnt -x $Notebook($w,x2) -y $Notebook($w,y6) \ -width $Notebook($w,width) -height $Notebook($w,height) $w.f$cnt config -bg $Notebook($w,bg) incr cnt } $w create line \ $Notebook($w,x1) [expr $Notebook($w,y5)-2] \ $Notebook($w,x1) $Notebook($w,y3) \ -width 2 -fill white $w create line \ $Notebook($w,x1) $Notebook($w,y3) \ $Notebook($w,x2) $Notebook($w,y4) \ $Notebook($w,x3) $Notebook($w,y4) \ $Notebook($w,x4) $Notebook($w,y3) \ $Notebook($w,x4) $Notebook($w,y6) \ $Notebook($w,x3) $Notebook($w,y5) \ -width 2 -fill black if {![info exists Notebook($w,expand)]} { $w config -width [expr $Notebook($w,x4)+$Notebook($w,pad)] \ -height [expr $Notebook($w,y4)+$Notebook($w,pad)] \ -bg $Notebook($w,bg) } set top $Notebook($w,top) set Notebook($w,top) -1 Notebook:raise.page $w $top } # # This routine is called whenever the mouse-button is pressed over # the notebook. It determines if any page should be raised and raises # that page. # proc Notebook:click {w x y} { global Notebook if {$y<$Notebook($w,y1) || $y>$Notebook($w,y6)} return set N [llength $Notebook($w,pages)] for {set i 0} {$i<$N} {incr i} { if {$x>=$Notebook($w,p$i,x5) && $x<=$Notebook($w,p$i,x6)} { Notebook:raise.page $w $i break } } } # # For internal use only. This procedure raised the n-th page of # the notebook # proc Notebook:raise.page {w n} { global Notebook if {$n<0 || $n>=[llength $Notebook($w,pages)]} return set top $Notebook($w,top) if {$top>=0 && $top<[llength $Notebook($w,pages)]} { $w move p$top 0 2 } $w move p$n 0 -2 $w delete topline if {$n>0} { $w create line \ $Notebook($w,x1) $Notebook($w,y6) \ $Notebook($w,x2) $Notebook($w,y5) \ $Notebook($w,p$n,x5) $Notebook($w,y5) \ $Notebook($w,p$n,x5) [expr $Notebook($w,y5)-2] \ -width 2 -fill white -tags topline } $w create line \ $Notebook($w,p$n,x6) [expr $Notebook($w,y5)-2] \ $Notebook($w,p$n,x6) $Notebook($w,y5) \ -width 2 -fill white -tags topline $w create line \ $Notebook($w,p$n,x6) $Notebook($w,y5) \ $Notebook($w,x3) $Notebook($w,y5) \ -width 2 -fill white -tags topline set Notebook($w,top) $n raise $w.f$n } # # Change the page-specific configuration options for the notebook # proc Notebook:pageconfig {w name args} { global Notebook set i [lsearch $Notebook($w,pages) $name] if {$i<0} return foreach {tag value} $args { switch -- $tag { -state { if {"$value"=="disabled"} { $w itemconfig t$i -fg $Notebook($w,fg,off) } else { $w itemconfig t$i -fg $Notebook($w,fg,on) } } -onexit { set Notebook($w,p$i,onexit) $value } } } } # # This procedure raises a notebook page given its name. But first # we check the "onexit" procedure for the current page (if any) and # if it returns false, we don't allow the raise to proceed. # proc Notebook:raise {w name} { global Notebook set i [lsearch $Notebook($w,pages) $name] if {$i<0} return if {[info exists Notebook($w,p$i,onexit)]} { set onexit $Notebook($w,p$i,onexit) if {"$onexit"!="" && [eval uplevel #0 $onexit]!=0} { Notebook:raise.page $w $i } } else { Notebook:raise.page $w $i } } # # Return the frame associated with a given page of the notebook. # proc Notebook:frame {w name} { global Notebook set i [lsearch $Notebook($w,pages) $name] if {$i>=0} { return $w.f$i } else { return {} } } # # Try to resize the notebook to the next time we become idle. # proc Notebook:scheduleExpand w { global Notebook if {[info exists Notebook($w,expand)]} return set Notebook($w,expand) 1 after idle "Notebook:expand $w" } # # Resize the notebook to fit inside its containing widget. # proc Notebook:expand w { global Notebook set wi [expr [winfo width $w]-($Notebook($w,pad)*2+4)] set hi [expr [winfo height $w]-($Notebook($w,pad)*2+36)] Notebook:config $w -width $wi -height $hi catch {unset Notebook($w,expand)} } # # Locate minimum dimensions of frame and expand to it # proc Notebook:resize w { global Notebook update set minWid [expr [winfo width $w]-($Notebook($w,pad)*2+4)] set minHgt [expr [winfo height $w]-($Notebook($w,pad)*2+36)] foreach pg $Notebook($w,pages) { set frm [Notebook:frame $w $pg] set hgt [winfo reqheight $frm] set wid [winfo reqwidth $frm] if { $hgt>$minHgt } { set minHgt $hgt } if { $wid>$minWid } { set minWid $wid } } Notebook:config $w -width $minWid -height $minHgt } fv5.4/tcltk/pow/orbit.c0000644000220700001010000003633106767511142014434 0ustar birbylheadev/* gcc -Wall orbit.c -I$BIN/tcl/include/ -c -O -o orbit.o ld -G -o liborbit.so orbit.o */ #include #include #include #include /* Declare prototypes... */ int singleBarFastGen(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]); void sunPos(double MJD, double SunVect[]); void polToVect(double PVect[], double Vect[]); void rotVect(double RM[3][3], double Vect[], double RVect[]); void eulerToRM(double EA[],double RM[3][3]); void eulerToRM_righthand(double EA[],double RM[3][3]); void precessEuler(double Epoch, double MJD, double EA[3]); void precess(double Epoch, double MJD, double Vect[], double RVect[]); void invRotMat(double RM[3][3], double InvRM[3][3]); int vectToPol(double Vect[],double VRet[]); int rotPVect(double Ang[3], double Vect[3], double VRet[3]); void setEuler(double V1[3], double V2[3], double Euler[3]); double norm(double Vect[]); double angDistance(double Vect1[], double Vect2[]); double c_given_RADecMJD_return_SunAngle(double RA, double Dec, double MJD); void fastRADecMJD2Roll(double RA, double Dec, double MJD, double SunMin, double SunMax, double SunLimit, double ReturnVals[4]); void vectProd(double One[], double Two[], double Result[]); void normVect(double Vect[]); int c_given_RADecMJD_return_Roll(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]); int singleRollMe(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]); int Orbit_Init(Tcl_Interp* interp_instance); /* replaces internal workings of "fastgen" (and therefore also "given_RADecMJD_return_SunAngle")from Tcl version with a faster one (in C) */ #define DEG2RAD 0.017453292519943295769 #define RAD2DEG 57.295779513082320877 #define EPS 1.e-12 #define PI 3.1415926535897932385 int singleBarFastGen(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { double RA, Dec, MJD, MaxSun, MinSun, Span, SunAngle; double T1, End, Leap, T2; double c_given_RADecMJD_return_SunAngle(double,double,double); char buffer[40]; int istatus, itstat, itstat2; /* 0 = out, 1 = in */ Leap = 9; /* good figure for hopping around step size */ /* get our Tcl args */ sscanf(argv[1],"%lf",&RA); sscanf(argv[2],"%lf",&Dec); sscanf(argv[3],"%lf",&MJD); sscanf(argv[4],"%lf",&MaxSun); sscanf(argv[5],"%lf",&MinSun); sscanf(argv[6],"%lf",&Span); SunAngle = c_given_RADecMJD_return_SunAngle(RA,Dec,MJD); /* append MJD and istatus to answer array */ if (SunAngle < MaxSun && SunAngle > MinSun) { istatus = 1; /* in */ sprintf(buffer,"%f %s",MJD,"in"); } else { istatus = 0; /* out */ sprintf(buffer,"%f %s",MJD,"out"); } /* ultimately need list of data pairs (Start/End times) */ Tcl_AppendElement(interp,buffer); T1 = MJD; End = MJD + Span + Leap; while (T1 <= End) { T1 = T1 + Leap; SunAngle = c_given_RADecMJD_return_SunAngle(RA, Dec, T1); if (SunAngle < MaxSun && SunAngle > MinSun) itstat = 1; /* in */ else itstat = 0; /* out */ /* look for a transition */ if (itstat != istatus) { /* we had a change at or during this interval, so focus in */ for (T2=T1-Leap+1; T2 <= T1; T2 = T2 + 1.0) { SunAngle = c_given_RADecMJD_return_SunAngle(RA, Dec, T2); if (SunAngle < MaxSun && SunAngle > MinSun) itstat2 = 1; /* in */ else itstat2 = 0; /* out */ if (itstat2 == itstat) { if (itstat == 1) sprintf(buffer,"%f %s",T2,"in"); else sprintf(buffer,"%f %s",T2,"out"); Tcl_AppendElement(interp,buffer); istatus = itstat; T2 = T1+1; /* force an exit */ } } } } /* okay, we're done looping through all times, now clean up results */ return TCL_OK; } void sunPos(double MJD, double SunVect[]) { double t, m, r, l; t = MJD - 4.5e4; m = t * .985600267 + 27.26464; m = fmod(m,360.0); m = m * DEG2RAD; r = 1.00014 - cos(m) * .01672 - sin(m * 2) * 1.4e-4; l = t * .985609104 + 309.44862 + sin(m) * 1.91553 + sin(m * 2) * .0201; l = fmod(l,360.0); l = l * DEG2RAD; SunVect[0] = r * cos(l); SunVect[1] = r * .91744 * sin(l); SunVect[2] = r * .39788 * sin(l); } void polToVect(double PVect[], double Vect[]) { double R, Lat, Lon; R = PVect[0]; Lon = PVect[1]; Lat = PVect[2]; Vect[0] = R * cos(Lat) * cos(Lon); Vect[1] = R * cos(Lat) * sin(Lon); Vect[2] = R * sin(Lat); } void rotVect(double RM[3][3], double Vect[], double RVect[]) { double y0, y1, y2; y0 = RM[0][0] * Vect[0] + RM[0][1] * Vect[1] + RM[0][2] * Vect[2]; y1 = RM[1][0] * Vect[0] + RM[1][1] * Vect[1] + RM[1][2] * Vect[2]; y2 = RM[2][0] * Vect[0] + RM[2][1] * Vect[1] + RM[2][2] * Vect[2]; RVect[0] = y0; RVect[1] = y1; RVect[2] = y2; } void eulerToRM(double EA[],double RM[3][3]) { /* useful for viewing */ double phi, psi, theta; double cos_phi, cos_theta, cos_psi, sin_phi, sin_theta, sin_psi; phi = EA[0]; psi = EA[1]; theta = EA[2]; cos_phi = cos(phi); cos_theta = cos(theta); cos_psi = cos(psi); sin_phi = sin(phi); sin_theta = sin(theta); sin_psi = sin(psi); RM[0][0] = cos_psi * cos_theta * cos_phi - sin_psi * sin_phi; RM[0][1] = cos_psi * cos_theta * sin_phi + sin_psi * cos_phi; RM[0][2] = 0.0 - cos_psi * sin_theta; RM[1][0] = 0.0- sin_psi * cos_theta * cos_phi - cos_psi * sin_phi; RM[1][1] = 0.0- sin_psi * cos_theta * sin_phi + cos_psi * cos_phi; RM[1][2] = sin_psi * sin_theta; RM[2][0] = sin_theta * cos_phi; RM[2][1] = sin_theta * sin_phi; RM[2][2] = cos_theta; } void eulerToRM_righthand(double EA[],double RM[3][3]) { /* useful for rolls */ double phi, psi, theta; double cos_phi, cos_theta, cos_psi, sin_phi, sin_theta, sin_psi; phi = EA[0]; psi = EA[1]; theta = EA[2]; cos_phi = cos(phi); cos_theta = cos(theta); cos_psi = cos(psi); sin_phi = sin(phi); sin_theta = sin(theta); sin_psi = sin(psi); RM[0][0] = cos_psi*sin_phi - cos_phi*cos_theta*sin_psi; RM[1][0] = -cos_psi*cos_phi - sin_phi*cos_theta*sin_psi; RM[2][0] = sin_psi*sin_theta; RM[0][1] = -sin_psi*sin_phi - cos_phi*cos_theta*cos_psi; RM[1][1] = sin_psi*cos_phi - sin_phi*cos_theta*cos_psi; RM[2][1] = cos_psi*sin_theta; RM[0][2] = -cos_phi*sin_theta; RM[1][2] = -sin_phi*sin_theta; RM[2][2] = -cos_theta; } void precessEuler(double Epoch, double MJD, double EA[3]) { double u0, u, phi, psi, theta; u0 = (Epoch - 15020.) / 36524.22; u = (MJD - Epoch) / 36524.22; phi = -(u0*1.396 + 2304.25 + (u*.018 + .302) *u) * u * DEG2RAD /3600.; psi = phi - u * .791 * u * DEG2RAD / 3600.; theta = (2004.682 - u0*.853 + (-.426 - u*.042)* u)* u* DEG2RAD /3600.; EA[0] = phi; EA[1] = psi; EA[2] = theta; } void precess(double Epoch, double MJD, double Vect[], double RVect[]) { double EA[3],RM[3][3]; precessEuler(Epoch, MJD, EA); eulerToRM(EA,RM); rotVect(RM,Vect,RVect); } void invRotMat(double RM[3][3], double InvRM[3][3]) { InvRM[0][0] = RM[0][0]; InvRM[0][1] = RM[1][0]; InvRM[0][2] = RM[2][0]; InvRM[1][0] = RM[0][1]; InvRM[1][1] = RM[1][1]; InvRM[1][2] = RM[2][1]; InvRM[2][0] = RM[0][2]; InvRM[2][1] = RM[1][2]; InvRM[2][2] = RM[2][2]; } int vectToPol(double Vect[],double VRet[]) { double norm01, R, lon, lat, c, s; double norm(double[]); norm01 = Vect[0]*Vect[0]+Vect[1]*Vect[1]; R= norm(Vect); lon = 0.0; lat = 0.0; if (R == 0.0) { /* eek, failure */ VRet[0] = 0.0; VRet[1] = 0.0; VRet[2] = 0.0; return -1; } if (norm01 == 0.0) { /* we're pointing straight up */ VRet[0] = R; VRet[1] = 0.0; VRet[2] = 90 * DEG2RAD; return -1; } norm01 = sqrt(norm01); lat = asin(Vect[2]/R); c = Vect[0]/norm01; s = Vect[1]/norm01; if (norm01 < EPS) { lon = 0.0; } else if ( fabs(s) < EPS) { lon = (1.0 - c/fabs(c)) * PI/2.0; } else { lon = atan((1.0-c)/s) * 2.0; } while (lon >= 2.0*PI) { lon = lon - 2*PI; } while (lon < 0) { lon = lon + 2*PI; } VRet[0] = R; VRet[1] = lon; VRet[2] = lat; return 0; } int rotPVect(double Ang[3], double Vect[3], double VRet[3]) { double RM[3][3], U[3], V[3]; int ireturn; eulerToRM(Ang,RM); polToVect(Vect,U); rotVect(RM,U,V); /* note dual behavior-- we're setting VRet implicitly to return back to the calling program, while also setting a return flag (ireturn) explicitly to also return to the calling program. */ ireturn = vectToPol(V,VRet); return ireturn; } void setEuler(double V1[3], double V2[3], double Euler[3]) { double phi,psi, theta; double TempV[3]; int ireturn; phi = V1[1]; psi = 0.0; theta = PI/2.0 - V1[2]; Euler[0] = phi; Euler[1] = psi; Euler[2] = theta; /* note we only seem to do this to check the return value, as we've already set our return vector (save for a final tweaking of its psi value) */ ireturn = rotPVect(Euler, V2, TempV); if (ireturn != 0) { printf("Warning, problem with euler angle rotation, continuing\n"); } else { /* replace our psi angle with rotated longitude */ Euler[1] = TempV[1] - PI/2.0; } } double norm(double Vect[]) { double sum; sum = sqrt(Vect[0]*Vect[0]+Vect[1]*Vect[1]+Vect[2]*Vect[2]); return sum; } double angDistance(double Vect1[], double Vect2[]) { double d1, r; d1 = Vect1[0]*Vect2[0] + Vect1[1]*Vect2[1] + Vect1[2]*Vect2[2]; d1 = d1/(norm(Vect1)*norm(Vect2)); if (d1 > 1.0-EPS) d1 = 1.0; if (d1 < -1.0+EPS) d1 = -1.0; r = acos(d1); if (r < 0.0 || r > PI) r = -1.0; return r; } double c_given_RADecMJD_return_SunAngle(double RA, double Dec, double MJD) { double SunAngle; double SunVect[3], TargetVect[3], TargetPolarVect[3], NewTVect[3]; double Euler[3], RM[3][3], InvRM[3][3], FOV[3], RotatedTargetVect[3]; sunPos(MJD,SunVect); TargetPolarVect[0] = 1.0; TargetPolarVect[1] = RA * DEG2RAD; TargetPolarVect[2] = Dec * DEG2RAD; polToVect(TargetPolarVect,TargetVect); precess(51544.5000,MJD,TargetVect,NewTVect); /* precess to J2000 */ vectToPol(NewTVect,TargetPolarVect); FOV[0] = 0.0; FOV[1] = 0.0; FOV[2] = 1.0; setEuler(TargetPolarVect,SunVect,Euler); eulerToRM(Euler,RM); invRotMat(RM, InvRM); rotVect(InvRM,FOV,RotatedTargetVect); /* is this TargetVect or NewTVect? */ SunAngle = angDistance(SunVect,RotatedTargetVect); SunAngle = SunAngle*RAD2DEG; return SunAngle; } void fastRADecMJD2Roll(double RA, double Dec, double MJD, double SunMin, double SunMax, double SunLimit, double ReturnVals[4]) { double SunAngle; double SunVect[3], TargetVect[3], TargetPolarVect[3], NewTVect[3]; double N[3], W[3], X[3], Y[3]; double YNorth, YWest, Roll, Ratio, MinRoll, MaxRoll; void vectProd(double[],double[],double[]), normVect(double[]); sunPos(MJD,SunVect); TargetPolarVect[0] = 1.0; TargetPolarVect[1] = RA * DEG2RAD; TargetPolarVect[2] = Dec * DEG2RAD; polToVect(TargetPolarVect,TargetVect); /* Hey, wait, do we actually use this at all? */ precess(51544.5000,MJD,TargetVect,NewTVect); /* precess to J2000 */ TargetVect[0] = NewTVect[0]; TargetVect[1] = NewTVect[1]; TargetVect[2] = NewTVect[2]; /* vectToPol(NewTVect,TargetPolarVect); is not needed here */ SunAngle = c_given_RADecMJD_return_SunAngle(RA,Dec,MJD); if (SunAngle >= SunMin && SunAngle <= SunMax) { ; } else { /* printf("Bad sun angle: %f %f %f\n",SunAngle,SunMin,SunMax); */ ReturnVals[0] = 0; ReturnVals[1] = 0; ReturnVals[2] = 0; ReturnVals[3] = -1; return; } SunAngle = SunAngle * DEG2RAD; SunLimit = SunLimit * DEG2RAD; N[0] = 0.0; N[1] = 0.0; N[2] = 1.0; vectProd(TargetVect,N, W); normVect(W); vectProd(W,TargetVect,N); normVect(N); if (N[2] < 0.0) { /* north became south, correcting */ N[0] = 0.0-N[0]; N[1] = 0.0-N[1]; N[2] = 0.0-N[2]; } vectProd(TargetVect,SunVect,X); normVect(X); vectProd(X,TargetVect,Y); normVect(Y); YNorth = angDistance(Y,N); YWest = angDistance(Y,W); if (YNorth <= 90.0*DEG2RAD) { Roll = YWest; } else { Roll = (360.0*DEG2RAD) - YWest; } Ratio = cos(SunLimit)/sin(SunAngle); if (Ratio > 1.0) Ratio = 1.0; if (Ratio < -1.0) Ratio = -1.0; Ratio = acos(Ratio); MinRoll = (Roll-Ratio)*RAD2DEG; MaxRoll = (Roll+Ratio)*RAD2DEG; Roll = Roll*RAD2DEG; if (MinRoll < 0.0) MinRoll = 360.0 + MinRoll; if (MaxRoll > 360.0) MaxRoll = MaxRoll - 360.0; ReturnVals[0] = MinRoll; ReturnVals[1] = MaxRoll; ReturnVals[2] = Roll; ReturnVals[3] = 0; return; } void vectProd(double One[], double Two[], double Result[]) { Result[0] = One[1] * Two[2] - One[2] * Two[1]; Result[1] = One[2] * Two[0] - One[0] * Two[2]; Result[2] = One[0] * Two[1] - One[1] * Two[0]; } void normVect(double Vect[]) { double NV, norm(double[]); NV = norm(Vect); if (NV == 0) { Vect[0] = 0; Vect[1] = 0; Vect[2] = 0; } else { Vect[0] = Vect[0]/NV; Vect[1] = Vect[1]/NV; Vect[2] = Vect[2]/NV; } } /* wrapper for our c routine for return rolls and ranges */ int c_given_RADecMJD_return_Roll(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { double RA, Dec, MJD, SunMin, SunMax, SunLimit, ReturnVals[4]; char buffer[40]; /* get our Tcl args */ sscanf(argv[1],"%lf",&RA); sscanf(argv[2],"%lf",&Dec); sscanf(argv[3],"%lf",&MJD); sscanf(argv[4],"%lf",&SunMin); sscanf(argv[5],"%lf",&SunMax); sscanf(argv[6],"%lf",&SunLimit); fastRADecMJD2Roll(RA, Dec, MJD, SunMin, SunMax, SunLimit, ReturnVals); sprintf(buffer,"%f",ReturnVals[0]); Tcl_AppendElement(interp,buffer); sprintf(buffer,"%f",ReturnVals[1]); Tcl_AppendElement(interp,buffer); sprintf(buffer,"%f",ReturnVals[2]); Tcl_AppendElement(interp,buffer); sprintf(buffer,"%f",ReturnVals[3]); Tcl_AppendElement(interp,buffer); return TCL_OK; } int singleRollMe(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) { double RA, Dec, Roll, NewRA, NewDec, Phi, Theta, Psi; double c_given_RADecMJD_return_SunAngle(double,double,double); double RollEuler[3], FOV[3], FOVVect[3], PosPair[3], RollRM[3][3]; double XOffset, YOffset, ZOffset; char buffer[80]; /* get our Tcl args */ sscanf(argv[1],"%lf",&RA); sscanf(argv[2],"%lf",&Dec); sscanf(argv[3],"%lf",&Roll); sscanf(argv[4],"%lf",&XOffset); sscanf(argv[5],"%lf",&YOffset); Phi = RA*DEG2RAD; Theta = (90.0-Dec) *DEG2RAD; Psi = 0.0-Roll*DEG2RAD; /* changes geometric to astronomic reference frame */ RollEuler[0] = Phi; RollEuler[1] = Psi; RollEuler[2] = Theta; XOffset = XOffset*DEG2RAD; YOffset = YOffset*DEG2RAD; ZOffset = 0.0 - cos(sqrt(YOffset*YOffset+XOffset*XOffset)); FOV[0] = XOffset; FOV[1] = YOffset; FOV[2] = ZOffset; eulerToRM_righthand(RollEuler,RollRM); rotVect(RollRM,FOV,FOVVect); vectToPol(FOVVect,PosPair); NewRA = PosPair[1]*RAD2DEG; NewDec = PosPair[2]*RAD2DEG; sprintf(buffer,"%f %f",NewRA, NewDec); Tcl_SetResult(interp,buffer,TCL_VOLATILE); return TCL_OK; } int Orbit_Init(Tcl_Interp* interp_instance) { Tcl_CreateCommand(interp_instance,"singleBarFastGen", (Tcl_CmdProc*)singleBarFastGen, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL); Tcl_CreateCommand(interp_instance,"singleRollMe", (Tcl_CmdProc*)singleRollMe, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL); Tcl_CreateCommand(interp_instance,"c_given_RADecMJD_return_Roll", (Tcl_CmdProc*)c_given_RADecMJD_return_Roll, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL); return TCL_OK; } fv5.4/tcltk/pow/pow.def0000644000220700001010000000515007123670466014433 0ustar birbylheadevLIBRARY powtcl.dll EXETYPE WINDOWS CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE MULTIPLE EXPORTS CreatePowCurve PowCurveCoords ConfigurePowCurve DeletePowCurve ComputePowCurveBbox DisplayPowCurve PowCurveInsert PowCurveDeleteCoords PowCurveToPoint PowCurveToArea ScalePowCurve GetPowCurveIndex TranslatePowCurve PowCurveToPostscript PowSetupColormap PowTestColormap PowSetupPhotoImages PowDitherToPhoto PowGetHisto PowPhotoColorTable PowPhotoCmapStretch PowImageScale PowReditherPhotoBlock PowCleanUp PowListGraphs PowListCurves PowListImages PowListVectors PowListData PowProcessCurve PowSetGraphMagstep PowGetImageOrigin PowGetImageOtherend PowGetImageUnits PowGetImageZ PowTestMacMemory PowPutZoomedBlock PowDestroyData_Tcl PowCloneData PowCreateData_Tcl PowRegisterData_Tcl PowDestroyImage_Tcl PowCreateImage_Tcl PowDestroyVector_Tcl PowCreateVector_Tcl PowDestroyCurve_Tcl PowCreateCurve_Tcl PowCreateVectorEN_Tcl PowDataPtr_Tcl PowCreateHisto_Tcl PowDestroyGraph_Tcl PowCreateGraph_Tcl PowTestImage PowFetchCurveInfoHash PowFetchDataLength PowExprDataInfo PowFetchVectorInfoHash PowFetchImageInfoHash PowFindCurvesMinMax_Tcl PowCreateDataFromChannel PowCreateDataFromList PowGraphToCanvas PowCanvasToGraph PowPixelToGraph PowGraphToPixel PowGetImageClipbox PowWCSexists PowWCSisSwapped PowCreateCurve PowCreateHisto PowDestroyCurve PowCreateData PowDestroyData PowRegisterData PowCreateGraph PowCreateGraph_internal PowDestroyGraph PowCreateImage PowDestroyImage PowCreateVector PowCreateVectorEN PowDestroyVector PowDrawGridLines CreateGridPts GetTicks PowGetTics GetTics CanvToGraph GraphToCanv PtBtwnPts CalcXY SolveXY CalcCoeff PowCreateContour BuildContours TraceContour dllEntry Pow_Init PowInit PowFindCurvesMinMax PowFindCurvesBBox PowFindImagesBBox PowFindGraphBBox PowSortGraphMinMax PowFindCurve PowFindImage PowExtractDatum PowPutDatum PowFindVector PowFindData PowFindGraph PowGetObjectOption PowPosToPix PowPixToPos PowInitWCS PowParseWCS PowWCSInitImage PowWCSInitCurve PowWCSInitGraph PowXYPx PowWorldPos pow_worldpos pow_xypx Visu_Init convert_block_to_byte convert_block_to_histo equalize_histo build_lookup put_lut AllocateColorTable linear_lut non_linear_lut spectrum rgb gray hot cold hls blkbdy invert_cmap bowlerhat tophat randwalk_spectrum lut_ramp set_hls convert_HLS_rgb hatgray hatct lut_thres bgr_ramp bgr_ramp2 bgr_step bgr_step2 rygcbm_ramp rygcbm_step gray_ramp2 gray_ramp4 gray_step4 gray_step8 spectrum2 inv_spec color1_lut color2_lut color3_lut fv5.4/tcltk/pow/pow.dsp0000644000220700001010000001337210405566664014471 0ustar birbylheadev# Microsoft Developer Studio Project File - Name="pow" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=pow - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "pow.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "pow.mak" CFG="pow - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "pow - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "pow - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "pow - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "C:\BATGSETOP\Release\lib" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "POW_EXPORTS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "C:\BATGSETOP\EXTERN\tcl8.3.4\generic" /I "C:\BATGSETOP\EXTERN\tk8.3.4\generic" /I "C:\BATGSETOP\EXTERN\tk8.3.4\win" /I "C:\BATGSETOP\EXTERN\tk8.3.4\xlib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "POW_EXPORTS" /D "__WIN32__" /D "NOBOARDS" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib tcl84.lib tk84.lib /nologo /dll /machine:I386 /out:"c:\BATGSETOP\Release\bin\powtcl.dll" /libpath:"C:\BATGSETOP\Release\lib" !ELSEIF "$(CFG)" == "pow - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "C:\BATGSETOP\Debug\lib" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "POW_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "C:\BATGSETOP\EXTERN\tcl8.3.4\generic" /I "C:\BATGSETOP\EXTERN\tk8.3.4\generic" /I "C:\BATGSETOP\EXTERN\tk8.3.4\xlib" /I "C:\BATGSETOP\EXTERN\tk8.3.4\win" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "POW_EXPORTS" /D "__WIN32__" /D "_MT" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib tcl84.lib tk84.lib libcmtd.lib "f:\Tcl source\fv\lheasoft\src\tcltk2\fitsTcl\fitstcl.lib" /nologo /dll /debug /machine:I386 /out:"C:\BATGSETOP\Debug\bin\powtcl.dll" /pdbtype:sept /libpath:"C:\BATGSETOP\Debug\lib" !ENDIF # Begin Target # Name "pow - Win32 Release" # Name "pow - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\pow.def # End Source File # Begin Source File SOURCE=.\PowCanvCurve.c # End Source File # Begin Source File SOURCE=.\PowColormap.c # End Source File # Begin Source File SOURCE=.\PowCommands.c # End Source File # Begin Source File SOURCE=.\PowCreateCurve.c # End Source File # Begin Source File SOURCE=.\PowCreateData.c # End Source File # Begin Source File SOURCE=.\PowCreateGraph.c # End Source File # Begin Source File SOURCE=.\PowCreateImage.c # End Source File # Begin Source File SOURCE=.\PowCreateVector.c # End Source File # Begin Source File SOURCE=.\PowGrid.c # End Source File # Begin Source File SOURCE=.\PowInit.c # End Source File # Begin Source File SOURCE=.\PowUtils.c # End Source File # Begin Source File SOURCE=.\PowWCS.c # End Source File # Begin Source File SOURCE=.\Visu_generic.c # End Source File # Begin Source File SOURCE=.\Visu_Init.c # End Source File # Begin Source File SOURCE=.\Visu_lut.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\pow.h # End Source File # Begin Source File SOURCE=.\powRegion.h # End Source File # Begin Source File SOURCE=.\tkpict.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project fv5.4/tcltk/pow/pow.dsw0000644000220700001010000000102107123665567014471 0ustar birbylheadevMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "pow"=.\pow.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### fv5.4/tcltk/pow/pow.h0000644000220700001010000004446712076355402014133 0ustar birbylheadev#define POW #ifndef _POW_H #define _POW_H #include "tkpict.h" #include "tk.h" #include #include #include #define BYTE_DATA 0 /* unsigned char */ #define SHORTINT_DATA 1 #define INT_DATA 2 #define REAL_DATA 3 #define DOUBLE_DATA 4 #define STRING_DATA 5 #define LONGLONG_DATA 6 /* on some system , e.g. linux, SUNs DBL_MAX is in float.h */ #ifndef DBL_MAX #include #endif #ifndef DBL_MIN #include #endif /* Sun4s do not support %p, so switch to %lx */ #ifdef HEX_PTRFORMAT #define PTRFORMAT "%lx" #else #define PTRFORMAT "%p" #endif extern int pixelSizes[6]; extern char *WCSpih_Message[]; extern char *WCStrans_Message[]; /* Typedef for a PowData structure. This is the main way of getting data into TCL */ typedef struct PowData { char *data_name; /* The identifier for this data known to TCL and the calling program. Also the hash key. */ void *data_array; /* The array full of data. */ int data_type; /* The actual type of the data Byte-0,2 Bytes-1,4 Bytes-2, 4 Bytes Real- 3, 8 Bytes Real- 4 (not fully supported for images), String - 5 (currently supported as the "z-vector" for a curve only. */ int copy; /*if non-zero, indicates that the data pointer "belongs" to POW (i.e. the data was copied at creation time) and may thus be 'ckfree'd */ int length; /* The number of elements in the array. */ } PowData; #define MAX_WCS_DIMS 2 typedef struct WCSdata { char graphName[1024]; char curveName[1024]; char type[6]; int RaDecSwap; int nAxis; double refVal[MAX_WCS_DIMS], refPix[MAX_WCS_DIMS], cdFrwd[MAX_WCS_DIMS][MAX_WCS_DIMS], cdRvrs[MAX_WCS_DIMS][MAX_WCS_DIMS], rot; int haveWCSinfo; struct wcsprm *wcs; } WCSdata; typedef struct PowImage { /* this associates "physics" with a 2d data array */ char *image_name; /* The identifier for this image known to TCL and the calling program. Also the hash key. Also the image name for VISU/pict */ PowData *dataptr; /* The data array you want for this image */ /* Tk_PictHandle *pict_handle; The pict image handle */ void *image_handle; /* This way we can toss around Photo *or* Pict images */ int xoffset; int yoffset; /* The number of pixels in width and height you want to count before the image actually starts */ int width; /* The width of the image in pixels */ int height; /* The height of the image in pixels */ double xorigin; double xinc; double xotherend; /*The real coordinates of the upper right pixel. Primarily for WCS usage, but handy to have in general */ double yorigin; double yinc; /* The origin values (at first used pixel) for x and y and the increment per pixel */ double yotherend; char *xunits; char *yunits; /* Units strings for the min, and inc values */ char *zunits; WCSdata WCS; } PowImage; typedef struct PowVector { /*This associates "physics" with a 1d data array*/ char *vector_name; /* The identifier for this vector known to TCL and the calling program. Also the hash key. */ PowData *dataptr; /* The data array for the vector */ int offset; /* The number of data you want to skip before the vector actually starts */ int length; /* The length of the vector (number of elements) */ char *units; /* A units string */ } PowVector; typedef struct PowCurve { char *curve_name; /* The identifier for this vector known to TCL and the calling program. Also the hash key. */ int length; /* number of elements in the curve: == length of first non-null vector (in sequence x, y, z) */ PowVector *x_vector; PowVector *x_error; /* This may be NULL */ PowVector *y_vector; PowVector *y_error; /* This may be NULL */ PowVector *z_vector; /* This may be NULL */ PowVector *z_error; /* This may be NULL */ WCSdata WCS; } PowCurve; typedef struct PowGraph { char *graph_name; double xleft; double xright; double ybot; double ytop; double xmagstep; /* This is the displayed size factor wrt the delta X */ double ymagstep; /* and delta Y of the original PowCreateGraph call */ double xoff; double yoff; char *xunits; char *yunits; char *xlabel; char *ylabel; WCSdata WCS; /* The master WCS data for graph */ } PowGraph; extern int Private_Colormap; extern int slice_nb; extern int nb_slices; extern int Pow_Done; extern int tty; /* 12-23-03 BD change to permit pow use in C++ programs on linux. defines isatty with an exception specification, and this definition causes compilation failure in any file that includes as well as pow.h */ #ifndef __cplusplus extern int isatty _ANSI_ARGS_((int fd)); #else #include #endif extern Tcl_Interp *interp; /* Interpreter for application. */ extern Tk_Window mainWindow; /* The main window for the application. If * NULL then the application no longer * exists. */ extern Tcl_HashTable PowDataTable; extern Tcl_HashTable PowImageTable; extern Tcl_HashTable PowVectorTable; extern Tcl_HashTable PowCurveTable; extern Tcl_HashTable PowGraphTable; void PowInit(char *, char *, int *); /*call this from a main program before doing anything */ int Pow_Init(Tcl_Interp *); /*call this from a tkAppInit before doing anything */ int Pow_InitExec(Tcl_Interp *); int Pow_CreateCommands(Tcl_Interp *); int Pow_CreateCommands(Tcl_Interp *); void PowCreateData(char *, void *, int *, int *, int *, int *); void PowRegisterData(PowData *,int *); void PowDestroyData(char *, int *); void Pow_PhotoPutScaledBlock(Tk_PhotoHandle, register Tk_PhotoImageBlock *, int, int, int, int, double, double, double, double); void PowCreateImage(char *, char *, int *, int *, int *, int *, double *, double *, double *, double *, char *, char *, char *, int *); void PowDestroyImage(char *image_name, int *status); void PowCreateVector(char *, char *, int *, int *, char *, int *); void PowCreateVectorEN(char *, char *, int *, double *, double *, char *, int *); void PowDestroyVector(char *vector_name, int *status); void PowCreateCurve(char *, char *, char *, char *, char *, char *, char *, int *); void PowDestroyCurve(char *curve_name, int *status); void PowCreateHisto(char *, char *, char *, int *); void PowCreateGraph(char *, char *, char *, char *, char *, char *, char *, int *, int *, double *, double *, double *, double *, int *); void PowCreateGraph_internal(char *, char *, char *, char *, char *, char *, char *, int *, int *, double *, double *, double *, double *, char *, int *); void PowDestroyGraph(char *graph_name, int *status); void PowCreateDataFlip(char *, char *, int *, int *, int *); int PowCreateDataFlip_Tcl(ClientData, Tcl_Interp *, int, char **); void PowCreateCurveFlip(char *, char *, int *); int PowCreateCurveFlip_Tcl(ClientData, Tcl_Interp *, int, char **); void PowInitWCS( WCSdata *WCS, int n ); int FillinWCSStructure (WCSdata *WCS); void PowDumpWCSstructure ( WCSdata *WCS ); int PowParseWCS( Tcl_Interp *interp, WCSdata *WCS, int argc, Tcl_Obj *const argv[] ); int PowWCSInitGraph(PowGraph *, char *, char *, int, int); void PowDitherToPhoto(PowImage *,Tk_PhotoImageBlock *, double, double); void PowHandleEvents(); void PowWishHandleEvents(); void Pow_PhotoPutScaledBlock _ANSI_ARGS_(( Tk_PhotoHandle handle, Tk_PhotoImageBlock * blockPtr, int x, int y, int width, int height, double zoomX, double zoomY, double Xoff, double Yoff)); int PowFindCurvesMinMax(const char *, char *, double *, double *, int); int PowFindCurvesValue (char *, char *, int, double *); int PowFindCurvesBBox(char *, char *, double *, double *, double *, double *, WCSdata *); int PowFindImagesBBox(char *,double *,double *,double *,double *, WCSdata *); int PowFindGraphBBox (PowGraph *, char *, char *, double *, double *, double *, double *); int PowPosToPix(double, double, WCSdata *, double *, double *); int PowPixToPos(double, double, WCSdata *, double *, double *); int PowSortGraphMinMax(PowGraph *, double *, double *,double *, double *, double *, double *); void powDebugDataPrint (char *, int, WCSdata *, int, char *); const char *PowGetObjectOption(char *gn, const char *obj, char *option, char *objType); #ifdef __WIN32__ __int64 PowExtractDatumLong(PowData *, int); #else long long PowExtractDatumLong(PowData *, int); #endif double PowExtractDatum(PowData *, int); int PowPutDatum(PowData *,double,int); PowCurve * PowFindCurve(const char *); PowVector * PowFindVector(char *); PowImage * PowFindImage(const char *); PowGraph * PowFindGraph(char *); PowData * PowFindData(char *); int PowIsInRegion( double* , double *, int , char *, int* ); int PowCalRegion( PowImage* , char *, int *, double *, int , char *, char*, double* , double*, double*, double *, double*, double*, int* ); /* New Tcl Commands */ int PowGetRegionMean ( ClientData, Tcl_Interp, int, char **); int PowWCSInitImage(ClientData , Tcl_Interp *, int , Tcl_Obj *const []); int PowWCSInitCurve(ClientData , Tcl_Interp *, int , Tcl_Obj *const []); int PowWCSexists(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowWCSisSwapped(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowGetImageOrigin(ClientData , Tcl_Interp *, int , char **); int PowGetImageOtherend(ClientData , Tcl_Interp *, int , char **); int PowGetImageUnits(ClientData , Tcl_Interp *, int , char **); int PowCreateData_Tcl(ClientData, Tcl_Interp *, int, char **); int PowCloneData(ClientData, Tcl_Interp *, int, char **); int PowFindData_Tcl(ClientData, Tcl_Interp *, int, char **); int PowRegisterData_Tcl(ClientData, Tcl_Interp *, int, char **); int PowDestroyData_Tcl(ClientData, Tcl_Interp *, int, char **); int PowDestroyImage_Tcl(ClientData, Tcl_Interp *, int, char **); int PowDestroyVector_Tcl(ClientData, Tcl_Interp *, int, char **); int PowDestroyCurve_Tcl(ClientData, Tcl_Interp *, int, char **); int PowDestroyGraph_Tcl(ClientData, Tcl_Interp *, int, char **); int PowDestroyImage_Tcl(ClientData, Tcl_Interp *, int, char **); int PowCreateDataFromBuffer(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowCreateDataFromChannel(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowCreateDataFromPtr(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowCreateStrFromPtr(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowCreateDataFromList(ClientData, Tcl_Interp *, int, char **); int PowCreateCurve_Tcl(ClientData, Tcl_Interp *, int, char **); int PowCreateHisto_Tcl(ClientData, Tcl_Interp *, int, char **); int PowCreateVector_Tcl(ClientData, Tcl_Interp *, int, char **); int PowCreateVectorEN_Tcl(ClientData, Tcl_Interp *, int, char **); int PowCreateImage_Tcl(ClientData, Tcl_Interp *, int, char **); int PowCreateGraph_Tcl(ClientData, Tcl_Interp *, int, char **); int PowFindCurvesMinMax_Tcl(ClientData, Tcl_Interp *, int, char **); int PowFetchDataLength(ClientData, Tcl_Interp *, int, char **); int PowExprDataInfo(ClientData, Tcl_Interp *, int, Tcl_Obj *const [] ); int PowDataPtr_Tcl(ClientData, Tcl_Interp *, int, Tcl_Obj *const [] ); int PowFetchCurveInfoHash(ClientData, Tcl_Interp *, int, char **); int PowFetchVectorInfoHash(ClientData, Tcl_Interp *, int, char **); int PowFetchImageInfoHash(ClientData, Tcl_Interp *, int, char **); int PowSetGraphMagstep(ClientData, Tcl_Interp *, int, char **); int PowProcessCurve(ClientData, Tcl_Interp *, int, char **); int PowListGraphs(ClientData, Tcl_Interp *, int, char **); int PowListCurves(ClientData, Tcl_Interp *, int, char **); int PowListImages(ClientData, Tcl_Interp *, int, char **); int PowListVectors(ClientData, Tcl_Interp *, int, char **); int PowListData(ClientData, Tcl_Interp *, int, char **); int PowCleanUp(ClientData, Tcl_Interp *, int, char **); int PowSetupColormap(ClientData, Tcl_Interp *, int, char **); int PowSetupPhotoImages(ClientData, Tcl_Interp *, int, char **); int PowTestColormap(ClientData, Tcl_Interp *, int, char **); int PowPhotoCmapStretch(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowPhotoColorTable(ClientData, Tcl_Interp *, int, char **); int PowTestMacMemory(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowPutZoomedBlock(ClientData, Tcl_Interp *, int, char **); int PowReditherPhotoBlock(ClientData, Tcl_Interp *, int, char **); int PowImageScale(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowGetHisto(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowGetImageZ(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowWorldPos(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowXYPx(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowGraphToCanvas(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowCanvasToGraph(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowGraphToPixel(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowPixelToGraph(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowResetWcsStructure(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowGraphVToPixelV(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowPixelVToGraphV(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowGetImageClipbox(ClientData, Tcl_Interp *, int, Tcl_Obj *const []); int PowDrawGridLines(ClientData, Tcl_Interp *, int, char **); int PowCreateContour(ClientData, Tcl_Interp *, int, char **); int PowGetTics(ClientData, Tcl_Interp *, int, char **); int PowTestImage(ClientData, Tcl_Interp *, int, Tcl_Obj *const[]); int PowGetRegionStatistics( ClientData, Tcl_Interp *, int , char ** ); int pow_worldpos(double, double, double [], double [], double [][MAX_WCS_DIMS], char *, double *, double *); int pow_xypx(double, double, double [], double [], double [][MAX_WCS_DIMS], double [][MAX_WCS_DIMS], char *, double *, double *); /*see the sample tkAppInit.c in the POW source directory for an example of how to set up a user function (readpha) to allow passing data objects into POW from C */ /* * The structure below defines the record for each powcurve item. */ typedef struct PowCurveItem { Tk_Item header; /* Generic stuff that's the same for all * types. MUST BE FIRST IN STRUCTURE. */ Tk_Outline lOutline; /* Outline structure for lines */ Tk_Outline pOutline; /* Outline structure for points */ Tk_Canvas canvas; /* Canvas containing item. Needed for * parsing arrow shapes. */ PowCurve *curveObjectPtr; /* Pointer to the PowCurve object that this * item instantiates. */ PowGraph *graphObjectPtr; /* Pointer to the PowCurve object that this * item instantiates. */ double *pCoordPtr; /* Pointer to malloc-ed array containing * x- and y- canvas coords of all points * and errorbars in curve. * X-coords are even-valued indices, y-coords * are corresponding odd-valued indices. */ int numPoints; /* The number of points in the actual set of * XDrawn lines * == (length of pCoordPtr array)/2 */ double *lCoordPtr; /* Same but tracing out line */ int numLines; /* == (length of lCoordPtr array)/2 */ char *pointType; /* "Cross", shape to draw at point. */ int pointError; /* Draw point the size of errorbars? */ int pointSize; /* Size of point (absent error bars) in pxls. */ int pointDisp; /* Whether to display points or not */ int pointFill; /* Whether to fill points or draw outlines */ int boxFill; /* Whether to fill histogram box outlines */ int lineDisp; /* Whether to display lines or not */ int stairStep; /* Draw lines in stairstep fashion? */ int logX; /* Take log of X data? */ int logY; /* Take log of Y data? */ int LOD; /* Maximum # of points plotted when */ /* Level Of Detail averaging is enabled */ /* Use 0 (default) to disable LOD and plot*/ /* all points */ int curveToPoint; /* flag to disable point to curve processing */ int capStyle; /* Cap style for powCurve. */ int joinStyle; /* Join style for powCurve. */ int hidden; /* Hide curve... don't draw */ } PowCurveItem; /* Definitions */ extern Tk_ItemType tkPowCurveType; /* * Prototypes for powCanvCurve procedures defined in this file: */ void ComputePowCurveBbox _ANSI_ARGS_((Tk_Canvas canvas, PowCurveItem *powCurvePtr)); int ConfigurePowCurve _ANSI_ARGS_((Tcl_Interp *interp, Tk_Canvas canvas, Tk_Item *itemPtr, int objc, Tcl_Obj *CONST objv[], int flags)); int CreatePowCurve _ANSI_ARGS_((Tcl_Interp *interp, Tk_Canvas canvas, struct Tk_Item *itemPtr, int objc, Tcl_Obj *CONST objv[])); void DeletePowCurve _ANSI_ARGS_((Tk_Canvas canvas, Tk_Item *itemPtr, Display *display)); void DisplayPowCurve _ANSI_ARGS_((Tk_Canvas canvas, Tk_Item *itemPtr, Display *display, Drawable dst, int x, int y, int width, int height)); int GetPowCurveIndex _ANSI_ARGS_((Tcl_Interp *interp, Tk_Canvas canvas, Tk_Item *itemPtr, char *indexString, int *indexPtr)); int PowCurveCoords _ANSI_ARGS_((Tcl_Interp *interp, Tk_Canvas canvas, Tk_Item *itemPtr, int objc, Tcl_Obj *CONST objv[])); void PowCurveDeleteCoords _ANSI_ARGS_((Tk_Canvas canvas, Tk_Item *itemPtr, int first, int last)); void PowCurveInsert _ANSI_ARGS_((Tk_Canvas canvas, Tk_Item *itemPtr, int beforeThis, char *string)); int PowCurveToArea _ANSI_ARGS_((Tk_Canvas canvas, Tk_Item *itemPtr, double *rectPtr)); double PowCurveToPoint _ANSI_ARGS_((Tk_Canvas canvas, Tk_Item *itemPtr, double *coordPtr)); int PowCurveToPostscript _ANSI_ARGS_((Tcl_Interp *interp, Tk_Canvas canvas, Tk_Item *itemPtr, int prepass)); void ScalePowCurve _ANSI_ARGS_((Tk_Canvas canvas, Tk_Item *itemPtr, double originX, double originY, double scaleX, double scaleY)); void TranslatePowCurve _ANSI_ARGS_((Tk_Canvas canvas, Tk_Item *itemPtr, double deltaX, double deltaY)); #endif /* _POW_H */ fv5.4/tcltk/pow/pow.pch0000644000220700001010000000017607016575606014453 0ustar birbylheadev#pragma precompile_target "MW_PowHeaderPPC" #include "tclMacCommonPch.h" #include "tcl.h" #include "tk.h" #include "pow.h" fv5.4/tcltk/pow/pow.sit.hqx0000644000220700001010000005047307034165175015300 0ustar birbylheadev(This file must be converted with BinHex 4.0) :"h"[GbjcDA3!8dP84&0*9#%!N!3m"`#3"!@q8dP8)3!"!!!m"h*-BA8#K`#3!aE rrb!J!h"[G`#3(1S$#BB"U!$$!S)#9`#3!`%!N!q'!!!"$[q3"!2JY&mZ),5@8hX !N!8#"Li!N!BlJIrarr`!!-0!!!!pi!!0"A"[Gbkj!*!D',X*KJ#3$aB!!$ZA!*! $&J#3!`&069"b3eG*43%!VhJcrE54)Dd!N!8#"Li!N!BkS3!!ka!!N!D6m`CiQYZ "#rr1A#+3!#cmb#h(9Vk3!%d@2R#l9LkR#eXSf32fDeHZl$52ka9Yi3YIC!ZHHR* kH(Vi[!MqBlpCa4Fcb@*Hr"E#@Tl`aFJQbr1&h,i'C-"fC0()FR`Cm5),fH5@)`X Rbj0EMLa(0PR)SQ4(MT1&,drf4rBNb5,C$#Zm8TR2[B@lcdkbF'p,plU3!&r)m89 b#eR),@56fa&1&SjIb!U`$[,Ul"[Bc$`h1hXl,krcfLkFX$SRAQGHAYTE&UXhcpp 10-Z6MhV,Xmq"ICVCHf9REqIPpACqNQANG@D1%J'CN8@bH"RCPr'Hl,c)-K%!#b" Jr18hb%(RP@qpfIBL,-+,,'4jcpKY!,i!C-!M[f`R5H4jhUMRM9c[MAckflb4IjV f[#XH`qIZN8dMr$TRHG)*j[`d$C1ddNU6TD#G$haY+8I4%pa,Aq9j1jcpfDIHXH- (21p0)pkK(GGkV6GH1[S,1%k6X`50Zpk+A-)Gj8jaeh02iTl-hF!pKAXUpc(F#Hi klQ20c[pah-Gc6qFqJIY%lT1i6qBqKIY8lY1iCeLX@8THhphFkiZm9H%lH&l,r8Z 8j9QZ(-CZ8VKrj)'2hX54fYAb)2HA&T%LhRF@PD446%U4lbSU([('cImXmrpjXcq ZU(V%Hdh4$4([YHDrh2jA@%HYY[m,LSk+H(Z+MSTiYeUFLbbI9F@rpRRQ+CRcIbQ +U6041XC#[Bd$#BU$15Rj%m8da46A'HTPMER$VH6ShX$["'QV96X(&d8)m40ckK5 '1d-YCQ*)34aFTT!!MTFTM['SE`6T3P"TpVq'`ZG`cQZeTST5abHQEMh8AJil![E 0-e3c)H3hK8q(e&!fECpra+p&ITB&@AA*6mpQYDAHUM6QlQKCpF+LH5e"e*ZiVqE ZiEk9qaEZflK[jlk,qaHiAmlp'ZklZ9r"r8VZ9h'rQ[XqDk!&h)hFm`a5JD#Ph%Z i1lNlZ*r,VD%YiR0[jflR"Y,fF0r!I52hcGcAF&r($4hD@8"Ba,Z@Hlj9$`J'C&S ,'!1bJ#Zk&YJ$dS!jTmSY"B4&["X0jRr1i2NFS`0!qFZi0C8`-(qk83$S3V04!Q! Gm*aYm2idSaCcZHG`cq4Z-SS`bfJ$p!"JK#)mRrXjh1GbRfHd!lU`PIYjh%rKhPC !X'B`i++qRm(pE1iA&&!EmICcVq&HbkeTBD6*6AG$+el)[B&l)hFhpahF6qGq%IH Gh*Zi,qAHaAd20dKe,IIeh2GbRer!Hm6E9X!e%!qX!qN1[9PTG1NLlTG`Ya9d)Z, 0FcqCZjIlaGbEZDrJILVhCGa2%"$Tqh,Z*h)rbDL5#d(3SLlZah)[jCl'[C'lQAX *pbVZeG`AFkrKAXYp#IHkJNkT9Ga1H#1Ap*+Me8i8*A'@4%%&*Y!i-D@1mA&fcf+ NQYN@MP,Q,Z[`8&KG,'-hI+*-8+`Vaf'e@5C@198fb3'''iAIqVlpHAiCN!#NUFE [$VDQ5a+9S$qNCVH&!Yh`3-e@llTG4-"KcTDhXhDQ2[RbHT`(D4cNPFPM[5K*Jhq Kmb0R9H$#YJA(4+ZYE!F#NM6UdYf1'Rkl(SGjk%IKm@"2kLpdJrMIj+NV$QHjlqP RphqV@9FF"XHFr,Z$Y"['I[iIk4[PT%DIXP@[R6K"BN@J4a%)C#YH#L$B44'IR6Q -RaiCKdMieH6m#!,LXe'eqC(r65-R4MC[NTbGc@RV+hC,&%CdGc8j)jM[@Ea8SM1 #GA`dr-LIm)pBRIL'A4d*f!`,e,A#@',d(h!Rr9BLSIQ[Z910HLl!r"IZq[a!J1L [***2DJ3a`Vq5!$mjVb8)rNU#G3-QA8qP`B3T54BJ8#X*fP2$+*,Y$GLQc5`Q$!b S$f!lCQrB)6re)@c(0T)Mf++UhA'h"MRaSK,UMmHNDa19`$hpH&"$Z)jU'1'%+&4 YSK,16l4i[iMYT,`f5rfL[ilYj$bkR9M42mGf5KMAU%hdipK1VH84J`8aUBkR4Id !F6qQSBFCdHBCFST*V$pp0XL)&p03`m`*#,'f-BJ`DcEe'3+)DC!!S[&b(,@0[Y& pTaJ%L2dP0SB10#f1IBEr1Hmj0SR!(TH)cX!"EFM3!i-)f"J!B!!$'m-8-M!4ei! $``cBISXIKM@`ICJI"L1`r4-r$%[3cMTI-eb"M6`CdX#'CSRiM`fKR`%1E!b0-$b !MB%3kSrYMrKKm!2E&rKK%!6E[r,$F!LPC4L$hXI'8!(ea-CJ!i-If"J#`4FE!`d -Gf$l$AiB!-(f!AiBr-$f&AiB#J'#'2*J1!3E!bS-Jf"Mi%&NqD3'-3`qDKX$'G3 Cfkrc!`jLHbmr-Pb8I*`I-!4B!m8CPX"'Mc%dJBfK#@jXB#$$%pM!-)BXX,fH(iB lX,f((iBmX(f9(aPGU0F!#N-If1Jam!3E!b$Ff"LJF8Cp)T[9kr31YMIc!aCMqb! ri!1fVr($S!M`be!-H)X0,'"3""YeBD!$'lM03!FfF)["$Qc-f$(JJHh2q@(3!p[ ImF2!"j!!6Rm`q)%0l'"J""XjJb(B'$L#8f"MjJe-a[DRr-M!aZ3Rq+&2S3E8$,k "MCb%L$HSTJbIB#-R"TZ`-Dc%8"%f-)Pqa2CPIX"N+!B$2Jc%B!1R'$l#4Mr!3E! a&!8@BG0cHQE`"GXlq4'KDXU(q@'B#DS#MSUm-&@p4CpLSeH&Udf9$eL0MH%U"V+ ``6NBKX,fHAl!@'a-16#S"IeKm)JkB`12K-P08pdC!-,'B!l$40KqKapUL1f6aYf `IBFI"SqJ83cm-+5&$CaP#!NEr3Nr`SBr!dhBIS8I"VZ`[BmIm"2EerN"+r3j9KM !%"3fZ!4$6GM!,iDAX0%RB#-f"U(!H@cd!6A%pMIm-)#Nch'LX!alBB2c%"-E@!N 'BU0A'@,$4Mi-XQ'$!c(-KZeMr0"hf,l0$`05qKb[!5d'hE$"+m!3E1!DI!dE[F3 !&ECIj3IZJ`fZ`-!F0[S!AUc2G(&%m!dEr!H1L3f-!8q`dDZ[-aZaIYPXlq+(AX- 'ET'[2LHSYq!4f1"lB$)fm"[qJJdXJbpMSfIHD,EIj!F1K3eHqbDcr4XrF!Gp6T3 '3"aXm"pk"aZiqGYQSfrIBMCb!fH``6Pqefc`blFkfdRUJlHC$ElhGV2"-Al2E'$ F1ma'Ai%$f-$DhcFEI3"IeZGN$36qSGRJXH!m0RVVMmd'E[f*fDJ[Z@$l"$rd&cC U$qr3ja6akMmc'jMpEV2"*H!lf1KAZ"XfF!3Y!KZp"!jJ)cH`%4ZFr[eQqbBrm&C p6PApk"GXi2U(c!Efr+ACi(j`GQc`SSqBM9j"Lm%'$S*Tf-#AMjZ0RU61f-J6r-I f4AlSI@cr`FqRRHddpHKRc!Dq8MGXm1I2QBeqr5ZcJ6(`&'c`!63IE1!Ah"mEI3k 'Bk0Rd'U`N3pclYM!#@ULc`aaGrJ80SB`iCABi(aI-KZF'4c!4Pr#cE("KG!"X)& jrf!f-"%ZL3f-J'YMSarJaGM`q8Hc`EI!F(e1&cHL2YMJi[HE$Hle$E2"GHPVE(# cEjN0$S0HK!emKfYJ!pIqf@cd-e`-'hhbAE14'lUC2M1&pfK"f0!cd&+`SAH!AGM !URmh'pbB[XB'9[fRfH!f-M%h%kab*FfCi*Slp6D62R5R,'G5,k9qe'F@h%X9%U+ fD5e+ZBR[b"DiRA,6ij%Yk#E+4LjQS4FS0adHf3+A9KU!aDDjRc)9G"CpUF6VX@P -9fjD2E)&[&0Z%MfbKGj@'Xl&TQZY0)5V6b-$`8V$ZpLdYU@%AGJd9LN0)Q262%! 4apJdEeFDr-@Q1Dh4)E&TcUBdX)Y0F`bPIXHQX9MCi'UMhKk!'f,6rDQ%5rSmKVS S$3GMdd2%bZEc(i0'TV!EQpCpP,!GQpBqP)D&X@QX8ZTPE"UVP$JA0XhaP23rE"U VP$4-E"UMPHPrM`'VP1PrXc@M,[VIE2*4T[r04Xr3EdSi0V46dIpQSqmSdrpQJpr +p,rCm#4PqYpXH+mbr@mfR%QCrMFE$U0-rjZY[K6pEcEBT%crQd2I+Y2rjP!MCIV I($3lCIVI(23TSreLdrLY62qE!eBTdrrQ`+Z8kApci*r+p,mjF$0PqYmFZ)Fbr@m 1@+P-rfX#8j6TIdhdQc,pViNmPHPr6@J'b[5r*[Lp-[f[59Udk(p0k"I+p,mQH,N brDp*@#AkAj1`5[5r*VL+-[f[59JPqYpFX%DCrMGA@#AkhecKTHKrFi80S[r044G 4T[r04BY4T[r04DG3T[r0&Ak,rMFAVUP-rjX,Ie1Qrmf&fbM6rqD"aFVd[hRU5p( rjY&Mb[5rHH5[62qETli8r@qHX%(d[hRS'XVd[hP`G@AkhcbiU$,pEaim5TRq0ar F9kErcCI',IVII1'dk(rc9A[4rqDMK5R6rqDMqbM6rqDM-5M6rqD,ViMq0ere&[e [2Ta0QIlA,!`3rDpCp4EpVjQq9DEr09-MCITIXr)@rDmCrFM-)'$6'SFbrDmC2Up -rfZ'IbV6raE!Ij6TI`[%!d6r@`!Q+Y2r&SJ(L2khJ2SUdrm@L!H)rVG!r5hkh`* KRZKr#q#)b[5r"I"#CIVI3VL@-[e[SA"1p,q&`PV4raB+DdAr@bJH*[VI3M3ljJf -$@`6r@qK1*!!k(m,d3L8kAm,eG1Lrl8)5d6rDi&M+02r@Y66S[qeJ#r+p,m@F5r 4reVi9kErYD$aQ2N1E25Ck(mYD"r+p,m@m3c4reVKR-Vd[eDiPM,pVa9HS8crD`8 IPHPrVH)hS[qeL[1*rYH+4U*-rfY&$e+Qrl@UhU,rYD)G+02r@Z(-b[5r4I"$CIV I)[%mdIm@UEp&reX%VLR6raE4BmVd[dASIFVd[d9SAXVd[d@UYqKrLj5hk(r3,QA kAaXm8jRqekCkLrlA*X`@rDm0l&1Qrl@ThU,rY9%[CITIQr)@rDp0R&,d[cEeYqK rlH+8S[qe#mp%rfZ(QbR6rpT9Ep(rfX&hCITIZr"-p,pfqNfCrYI1[c,pVahp5jR qeil@SdcrDdHc8+Er,BCM+p2r&JY(4IpE,0iQqYpLiCRSIiY9Ep(r&JY(4IpE6"f 9kAq,dCq8kAq,dDH8kAq,aHP&reXL6Lrkha)D8*RqY`31TNcr@`)28DEr,9'p4Ip E!KiTdrq@d([+p,mPj+C-reZL[%Ar@i,ZSdcrkd#c8+ErGF$$PHPr(H)VS[peL$H )rYF"TL[6rcT8Ep(r1Y4RS[peS'mTdrmka!9&rqY8Ii[qeiNfS8crki4M+p2r1S8 VS[pe`TH8kAqGiU1Lrh8+4dArka3(&If[8ja-p,p1j5hkhe,P,IVI8Z'hk(pQ$J6 q"qq$lm%MiBR`2AJHr!kH#Bq%hm'Ai%R`)cJHh!j1"jH$`m(Gi'a`06JDh!`q#Lq $Mm($i&rZ)bMZibIS"1J!m(Pi22`G(3'G!2i1IhBI9UNpd1)qcS,H!+F1(NGahjP #+d-M3hY$@`[HTZ+J[39[9+&p(AUA#Jd[H*X+23Vp#0d)[3LG#2d*I3QG#(d)A3K p#[d*A3Jp#"d))S,ZJpk$cS1qJkk$RS11Jhk$ES0HJik&9S0'JcD$*S0qLQk+TSP 1LMk+0S[fLMk+,SSHLRD,lSS1Lak,,SSHLJk+rSRZLGk*cSQqLDi*0k1&p!qk*AS P1UA4*lAQLcD**SN@L3D*pSMQ#%q#(m',i%2`)$JB(!XH"2q"pm$4i&I`,EJBr!I H!pq"jm"[i$A`'AJ-r!AH!Pq"Tm"2i#A`%AJ)h!i1![H!Fm!ei"L'@m!4i!C`!VJ !(!$q!Eq!!i$pB$lm"'i"ei#(J2eJ2PJ2aS2YB$TB$SD$h@!f@!e'JmeJ-PL-YNN 1j)m'MrD1jSl@MXB1rdCVe6L$CST@LND+2S[qLND+0SSQLRk,pSS@Ldk,0SSQLKD +"SVfLHD*eSR'LED*TSQ@LBD*GSPQL9D*4SRZLck*,SNHL3k*rSMZ#!q#rm"li$[ `($J@(!UH!lq"em$"i&*`+,J@r!CH!jq"am"Ii#h`&AJ+r!31"dG$"d(r32G!ld$ R3'0"3d(R30p!ed#$36p"6d&V3Gp!ed$23-G![d#h3+p!Td#I3*G!Md#(3(p!Gd" [3'H!6k,IS$1J,k!VS#HJ)k!IS+fKUD'PSC!$RD(ESFZKRD'CSC@Kkk(*SG'Khk' CSC@KND'0SBQKKD'"SAfKHD&eSA'KED&TS@@KBD&GS3HL@k&AS91K6k&,S8HKeD, 4SXfLbD,&SJ1Mmk,&SX'L[D)6Sr'LqD)(Sm'L[D+jSV@LXD+YSUQLTD+KSTfLQD+ 9ST'LMD+*SS@L,k1$SRqLHk*hSR-DI42G"Ed&A3#Y"Bd&l3CY"Sd&E390"@d(M3# p!3d(V3&p"Dd!23+G!)d&E390"Id"238G"Id%h35p"-d"V350"'d%633Y")d)(36 p!ld#V3(p!pf$f3"d123hG$Id0[Fa0M3m0$Hd0M3f0%!d2M3mG$Ed0A3ep$6hi5p d-r3bG$,d-A3ap$"d-23[p%+d,c3[mkMEHG-cp3U$eqB*V60f,(Yl`M6,+c1"Hm* MQ4XbAa219qVGAT,Qa,MBDl6QeXcRqcc#e4YApJC4cf[-9@TMYDeEAD$0PCDIYIf SX'i)MRZYb6eVSCHGcGqNUa2CNF`PDG5TYRR#B8fP9L9BialrqZm)$qrSh&#P(Sj IbpE2HekC,r,[1ED[KGc3Mr1`'q!XXEBfCkU41@qX0`mH8NE'0e-FrEkB+8l1+@J 1c&i$L&%D!+ZqcmZkhU&DFmqJ#iaIZLP-8+NX'AZ9pUcQ0BZRqZeJYG4"CB1S6Me G$kPR@,b#5cTGRP2,CZDkE&6DiTIV,4e(9ip)KBc0'fd$EZ4`AUqhPPBZJq9l'U# %LEE5lc,3[`fIh[K)N!$5&C%p8A#-*e+hpp+N(@4CNRUl``aN#Pf@cH5GFmQA[E, "r23P3Z0kJ-Mi1RBYSi5lr63-XR%VU[Y2JX[1pGEqL,N116q-#cqrC`%e8m)eBEa -Abc[ChR5VH`2hR!d56ZCYkZYAY$3e,HBHE-qceN#qAej'#pN-!"Gk,9qVeGBcqq (8BHA8rT52r-QJ[Rq`N+3!&CFc)J$ZZ9*YdG-RDBakkGUGlT%ZPZNZ$1)[2U"5V0 (aI6M4,Xp!d3[UYLpX050[PiCa+l*VXhd0P$2I"%XA94-'MQGIhN@ed&Bb9Vc$6p ,(@9PP-b6U9q+hU-e2cj5kkG(!YS9Fbp2[I6i[49V6pH21jPCG`FmEa3%-`iVr0a IXkp-rGlLQX1UVVq`([&55Y@E1Sm,MX#c,L**A56*Ff8D#MbdK6HG(-ZQ2)c-IA0 Y"N0I1jTCp00!N5i0XrlKYLT(#'1p1SL$0'b[Q#84Bp[4(jMf&"PN3rFYelX,VE# Y+2TTTc1VfkV&-iVGb`16VS+$M[)%)h%@#AdJ8MKVM$,r"U!)JQ2hmJ$FfKlf`0( AVhMFkSh2,YmNhN@FAEhf'8mh0FI6F!rm[(VSb&Nr!p3A@q'f4QZ*Nd3k1Ep`9#4 dK)pkDG0[6Rjq6jM%Xjj"kX['aqXaVf[YL2`m61+eQZ9GrE5bVQkAJI)VdU4AMpF )J2E@J+rI9qRYTqfJ@U#D+9XK#qR2X&HlS[j#'"GYQQid(@YAHh%&JklS&6%d)25 Qm`@5Q'MLj5B#@ZVAA+l*Zp&KI1LM0Q!U%LGj-*mNbi@4c16rJJkTL%frhh*YX', FX"!A*RhVbNT,kU3h&K9ZR%d$(T2aZ)MdJSXhTReeqMe*RY!#f6SC"p0-bpClheM 2V'jhr8I$Emclm`-d@#Die3jZV$3NB3cMDKab)K29f2c%2FXL3KQV,I)SQpCQYX4 priPCN!$B3TB)SjJCdHmrEC@Qb-`(Mf)cH-(XM-arQlNApmNpCRAFf4CQFZU[GP2 kc12S'BbV00H$MMQj-eRNKbECd(%6NQLc-[pYY&DCrcDc$G-qpeJa&m5Fb$(c5c+ 4SUlE+4U$-,2P-[pYjV'2pdkGdS`)-b[6Nb+JQHQ9q@mc+b[chfBf9FmfQ(M-%*h X[9@e-A1ETr5+fTLj4jRr0[1%-[pYC[0Q4)Kb-[qQCaiH,jdG$ARQrrHZe(`+maS -ca12HBa'%Q9fJRNAHIr*Y*l-IdFehb2che(m)kpiZ*MiLQVZCQjH6+Y'0CFdEr6 qYk&44p9cmlYCMSBIeBb8RU@)SIp'T3N[m+l[SZ0(TB2,r(G8@R4,FRH#*Kc9I%Q Vpq$Gc"0%0CHPjbfLc&QBpkkBrp(c(c(ePXarac3l*22I-Fhkb2ah6202-[mG8ce NrMXQh*!!qHqBjPGNrMZQ@4@Crii*)@6q1kEC(jRrMQX15ZDriqS*QIq1UbGNrMZ Z'XRmGeacA$,r(GGXPXarac9A*[2IFFf8bIahA$0K-[mGPriZmppaDHBbrahA()( -ImHPlF[mGe`p*22IFFhUb2ahA,-k-[mGemb0c(r(p3k&c(r(0EmNmpm*iCh-IbH %+6,rRG"FPXar*e4hQIp1+!HCrdjS0NlQ[a0#"CRr6QL'31Dr%jS$N!$jEr0HPma r*c6R)22I#G99jVm6QS'3!2R[K1D$C2ilS4NMQIp1D&C)jVm6Q['5qHq%CV9NrVY 1f#hchhAL%c,rADIj-TRrVP2rbrahRAT91('GHNRQ[qY84jRrVP21-[pG*hqCrkj 6l@AqZdic&$,rADFj#CRrVK0QbrahRAL'c(rAD@j$jVrVa$PNrVY1XeFbrefR'5Z Crkl6I*6-IpF*)fAqZdl[DmMmGe+cHc,rR46Xbrah8M0i-[qG&&E+r(G5f#6chdP KJFar*p8c-[qG9&ePrMZT'3kCrdjUrN6Q[j2#)CRr6SScbIah8MJNmpp*e8cQ[j1 UQFarQlI0C2ilTAP#QIp1UAGPrMXPh*Ijlj3`@ZDr8m)lQIp1U9pPrMZP[TAjlj6 k41Dr8kUTc(qRP)r-IkFdVb,chbR0kXMmGdSeP[R[P(T8jVp6QTH6qHq8CYjNrMZ Pq6DCrdjTpP$Q[e1D)j6jlhTa9*RrVKF2P2R[H[&GQIqZ&fq4qHpkm35CrkiA,X[ mGlf`6qDrki8e-[pYhQQ6qHq"BaIBF5'cUN*aNB6J#Ih$,l$lQ8Nqqb)RLaR@6,' U,fPQ2-Q1k%c'jLCQ"lHiF#GNh@`'*fAamGB5#!jXQ%mRI5Eh@GcAF9r2[B1lKhX RGbrh,ZiEZ(Gclq(Zilk4qbEZQiYhk1XCMka-Ma`mhUS3@Kfic1E9(cRTa36d+Ed &kV`+B9T4hUFjHRki"dBC'CeMShL*p5H)V9h!V#CEpN3AA!!c'e%EQ0+H1Bb$%[1 -dh(#T)-i--pGTq18`9blSq"F2B`$5lV(GP[S1&0VBCI'&qARAS[6qDpa8%bH2U` h5XMcKr9'DAR"-!l3r-*K("5D&`hM`",[(-C"fARa-!kUcdZ'F9#%6Krf$dcpVQ% Fe+2AkQhe!TB&IB[kp,cbYcMkZ+pAQ2qhhAmYkNf6[A#52ZlSJ1AY@"&@UYQRLhN "I)EE96ZGJj1#1BBL'F(4U0D!AQdp(d,A"#f%J++S&F6rEc&,Qa$&'T@`[QrRrKR ZklL[jpl"hF1pNlZAHaIh$GblZIG`ph(Ib(d6pmf+VkYQ1NPjKm2"cK%20DcC1m, mr(M[L)KqR*dM(NlJX2KTHY!2&V*NfmXaU+KEBp*dFhTABl)kHFKQBh,Rd$S#p0D 9kc[51+,Ih3qGq1IARMTedXDM,'hR@AVE+BX,,aFZk)NJH4lBdRCHTRHqXVM`@SF ,6bYIfCA-*R0!JFN(QNdEI(41kYB$"feb-R,T96`-Xp@p%,+0jiXBh5$ZKI@T5DN NIUK*,l1h!"VG)`3-GN894bICCI&ZAieAre,hV%)Z(&0&mRrQDVMBCAUp)"eVUU9 dRIeIErmll,r(rRIDIkrpll,r'qarYrh[XImqqlr4rQqbrjYADc(j-Tj#m'Y4Cf9 HEImAfrmDqepVrjIBrlV9A*+E9pkP)"26@$V#NY8)kJUHH*!!Ga[dqacD)f&40YT rXrf[Yrp9pMpY0B[iPG5XIAEj#iNXYIr(fRq(rAIDIhIaefE@G[YIl&f1j*FXY,U TL"H6T(V*l,%&lN!Yp-X#hbY%,A$"'JF-,LlShmN1&hMXa3B($MiZ0"JZp1RCS'A f6THp$5&mA+KEai8H[m30%l+iB+DY`!Ac2TReM6$iZ*!!HK)AE'q%`FH&HNfMmL$ X-ZpSN!!ZCca3UemA[6,YV$b1L#m[iQB((baPk1(Ve#Q(#qCTi)hpRPkEYVN4"Km ABJ8Z@0b3!#"cI&c3ceIjHZ3Y[&9VLp-AR$Ni6hG#4ELba)e*qVJ`aEhQicbaBQf $JmVKmC`HReIQl5iRiBfqp-acp,R$3dEK)id@K3EpRkcPF9NbX-0XY@c01bHX[Dc i+$(KH$bSIYrZT"phY%"+k4LGJ[F-pEZ*+)rI1c9ARjk)qfcdBBXpjL96mk+SpHe B#(EIrQ&i5pLjF9ppr38p5pZ*fTS1aJLcX,m"`M9jhKXI'eYLGrqfV-pU8,hG-AB XfpC[jpRB8QGjl1EUc@1GT*f0qEh3eXDaM"cp9RYqcc,VkR(A3,1i(+[Fbjq2(0k DeVph2,I@LBl$mNSA$q1`f0+DB4bQCYB1il!3dbA$1%aiVa['BC'QVQ%FTS$@$q1 `@0+'B4`iH[F`$Zp(AcU-`q[bQiGa@2KTbc!1bd"G2Sc$SP"2(-CK2RY6q8)FrEJ j#dJ0VM2M(5Y'(*E6fUeeGE4YleSl,&AfP1I@U0'RdEYimFU4N6MAj0VLRAGiSq% e*dE$9lIBKTDY2["[LSUG%XrG16,5R&)FlEpVeAr'!IC(2(Il0Zpe%mQ%iUZ49jq `9cM`Efi(1hIHYQYbrrl@lS1@heX8AjHj8A'FYph2h8RkjjMr4eIcipecpe82Fl6 r0dllAreEB@mqi8'j&5-MrNjARmGIL6pELbc'rff$I89N*a)rRf0'`qA(L,Iillp 28hc44iMh"Q+PTT2i`KBIX8DM93+JX2&HGrINSGRUPkF&qaI*c"bfC$*jb'*HJkH `IQBqMp9)U--#iSPZ"DJMKfh,p&#P"@"+NMb@0qqeaFQU4fmq5Q'(Bbb2-PZ3!1a )(UZAdVZUh)r8PC(5YA-e@r,Y5(pXQ$P`E[qR(qCK%1BUff0Y%''#j9X(MXRMDYZ PEH!8YLN0MiHFV2GiY,BQ$bB(M[DpC3$*Hek!Mh3p4MN+5p#1jf%&B"CEkUf0*Ej UI8EIE`PlYZ6HNAl9ib#bq0b2$VLi1dX[J0P%(TbfGX4fU8IUD[+icRq"RFSfJT( UmI!C($p8$fFZKIeh"fKPBrN%SecEQ,+e#kXRZi4`ZI*G8aY)0Ck(0B!*VYZplbX )R0QQZ(5kTSSe+5d!pE"8-004,!mh5Kl1Sd9V*9S"mKJTb!0j$!2j$r+S-B+$HHK ClTrf[Qe!56M5pbJfPJ%&B,3l-XY-$rA(,MBPYJ6NS4H`rA&rT1ZkGI&CC(`JMeh RfAZYVPiHpJ#&C%pJkeiHa6-VJ0*LRe!fc$DkSbHlLRITl'&pA6Y!(T`fQZ54ZVU lhV6pEj-B[F%S*'EVY(+3!%RP%`U*j846YJF`1+Z%pQTA32)$Cfa@I9ETKbCBfVR 592k`*PM0`fib(A*)JkYdad-Dh&JH%aVF@"i6'Ybq2!jUF,8ml"dDh%"GE3iDA,A 4$QY`Y6`Q0,L"0"l@i-Eb1+6"P41a%@K`)c'FIHchjm'kjl01DNF02A'ljC@MYlc qhP(XkVJfHAl#0Jpl0c[SalEHbEZ2-DfX2%2qqYAj69XqFBmQ6bd#c2fb@R1$,a, $8ld'HYEkS3P@J2%K6A#)%GN#0-'eccfrFeaYkU!Y3[fM!f1b6d`Tf31QLf`R8cJ l,M""[Cia%i"XVmmk0"9QDTqBjYN@P!!-V$Tj(%&J6`%B94+qA`rlc441hmE)r0M C(-EI[VebE-FYAb*1dlr+#(3L`aepL"'-j6("#-EbQ%$bIANF42*D([B!*,F[D)) $GE8jD),94M[-#'Tj6$##J63HCJ4MH4c5"-Z*H(Q-bN`k$ddF4QBAR$c-pSf93a, E-a-PpZCK"G$b1"D"ZE2L`Klqm4@E)F6AHI61f`VkjE0ZIQNM$hN&B%@Le5Q,&+l Kq6GDG"E9'!qqd6+Fai'TPjVUE#'BHMRkPSR(G!kqC6,F(rB!9Il"0cmUpAMScBr KZKj3V`rd2@ILVBlKHTJm$Vka-C,($hC(YTFGmrlRaV$EBlPr[AaUFlCi8krA[U' F$3TL*prq+bZJ%$[j%iqXmB2Bb6H[L!JfNf0@ZJk1(@DeQ5Zq[L+ja2qr&FNPrSp @*2IDQ+Qmr)QabC,eTEQM5)0QCAJE$040[kl@R*LmVR,Ga+lCAIafe@Zcej@V0!" [TNiUGPFr"[A-fIh@rJ)+eTKMaGX9H9TTh8l!hUk&eVQGJ0hGXZec1`&lZf9EjhB #RP*DYm[T9)F,cN+5(G9Y*@p-XRqhl$3Zf0fBC,KEYX-MpHbA$@k)`CpVQI4r#)D G`kfa@l9e&FUVYD8"l(0EY@Q#@&qXDY(Bl(rY+45faMAl,E#+9RaLkYC$lH@`ddU 6TEQCCpqRrYrMlY*pBAeUNS`ll,r6rMI%q8YZq(rHNq2HIFX6!Bm9YbdqG2J+[BH Qp+61Q4LH-pbhl#aqRc[FCfamIcJGChar1"eRI(mi(@GmIcJGChar1"eRI(mi(@G mIcJGChar1"eRI(mi(@GmIcJGChar1"eRI(mi(@GmIcJGChar1"f(IGm'pp),F-8 HXZrES`'X[H"i&-`+XrT@RAj-(b6+B*V"0R0ipUh(,h&jhYBj&VRe!9I&V2Lf)r, c-)P,hAB*e+YeR$b6GbU-(IA'@3)),0r6Z'A(FQ9LkYqRlle(ML-MEcVd5"P!5FM (-fiD16'bHG2G6dC3KCCU@2kBZ$4q(ZdP,"'S%G)1`hFXmZI4l`3IXXBZ#b8leYP D'X"C&ZUTBCl0YU0bZDfKmXF5--CSK4R6XqLG%`C3qHJa3E81erqb[4a$#6eH@,p [Gp+21k`)8BjQRL,K@6hpbMXEJhh[e&apHL,Z4b8!'d9B3`p[UTQ&!DITK8,cF[R fl21l4r%1j0Uj1pcMTBTRKba`Cqe-II,Pp4KaI'H3!&FQMr@L*2h23DT9l+p"@,h (aRE[[m*E`Xk0qqUcT@aYRcR4%4d4GQ!@pMG!Z#E2Hq0MBhS*ZbhVae8f`'lRBIC YrADHM5eePXGZVYimaN[XHmEmAMK@5Y)!eTMhS1hclpekCama5+l-cIJdUXUS!Xp i+3$cLT+pIQM##R"Nqp9*dmhTABh*kZ5K,iSMCZ9(ma+ZrT(rrZGhlEF2l0Y2(p4 1ZVFSP2IeBTSkrVLBTSk4rbQQ[HC4m)3hHKPGJ#$'GM(&"@2J%L'IX#FFYCUeAHl aFY['B5A[$[k0XXMbjkq3!%%VD4k3!,%ld6eBPekNJ5BjVq4qe9SNrG1jNJEEqlc kE"S-U0q,pE&VDGc(rCVe50BD*Q4T39,0rUB@l'p(Ib'-[l"HNS@5r6dD6ALUhFk SM*ih29-IM$[T@DGPYAk@*ph+rZ!04j1dNcd9i,bf9U66Lq$e,Clcl[CCK,Q[-K2 NH4J[R!Y`)CY40MEmAZpTpr2lBG6K5CQqP"AlmYiX)XrLJ5Z$q'RR&@'QGiakjV9 qC5Q#22TGmZe+Nk@JRCpV#V-pRlIAjB$rCMq0RkkUQ51lq#Qr93FUc9iHGKR%+@6 &Zdb0cAlHkjmVLA'Z&-aiApTibY&I9eUhm-iJHLU%V2KAVEB%U*DEap8VEBVc5*[ kEl1AI29+U!11JqhJ,!ml@(#p00a3YFfQJN2q,$pC+EDr'@A*ekfBr$F@k,JQc-l 880G["*J*8!9Q[)H"Q3"$`)al&CMaVJ#ckecYH$G#X8eFhe*MQkBB!ZDdIaQTM(m "Q2'V!M2H&@$fR#X&+`%cMU2!6)KKB2B$9-YG!@EAHD40"i(CpFd$XqFif!j9B-D l#Xail`9Qr#[!l$S2PM)!CXGj2a$AS(Jr')r"F3f3!%FKq3!SMm$b+$$[JqCpi&b &jaT!Mm2TIN$G$kQMS(S!9NH!G3KD4m'e"UmeJ"dP1M@U-d4fpS(h+(b2!2L$%-j !rhiB0f&'SGc%f!IR*N`0dNf3!&&B0c&'S0d,-BSkATa+'hN4DUe8JhSrbK#51P% ')GpiMm+qLA%!qNfJII!IK+N9ES3'H#%1018`(I!LP#P"fRfNCdHTJBNa5Jp-M$% J0e&'`0`,-9,drD!q3PM5)3kNSBP,jM@3!%(Q8)i5%SGbL"a[+%I*d)CbM*!!03b %F*DF0IdqN!#S@D0h+%$!1kS43S5VKT&HV`C`Hh5J#61FBfm3$lN(JML-Sq`F%Sj bL!"cKL+-P(-%FIST66P1MY%-4aPYLi$29#2XEhDIc93$3'D'[)Gl*k3bj4!KNbQ (b"+CFT!!J-G8)`aA1j6p(Cr'p8KjIP'1%[+,FSJF[bK(bI#,FSb3!&q83`6NS"S Ka)YU'1QJDS$4$XU3!)1p36`8(!MLN!#$XR0)$XSK!R)`&''NR#ij+([hNi0bR"` j')ibfKB"1DK'f0rX2MQS"S!F$(N2pdj)$XSK3R*3$T%P"q8J!6QS4KLZpMjbB," JM4m[p2f&i)Xa9J6crB@&)+di!M#)qpfYmfhKVJ8p8JmUGX'aGJ!1DSrKK-$YP9% b$lc8B"1[L9"HX6IdBb)0pS6T'ph!2AlF83m1ah%JGC3h8IRq'ZRYLSSDNHZAB@h LP1GTiTGPCZ+9i@,LP'rjR*rA(H)BdMAI*i2C[Q1Pe!&Imedmf(!l)X[*3VFdhA$ GK(HjRC!!aLVa+24ci*P'b-!VepH"Vd[5!TpF$I13!#Kq"3SQRL&4mRe+E9C'2Gm jffBH0`VXfG*Nq)miC4L2118iMVL&V-Ehk3GphlP5aB!"q5j"eI4+(bAia#m2RcJ 9i41rI[M%+`qI1"AK-r3,i"2(((bk2[QqGKe,(H%kqahKZZ3lSKmqdfiKI"Uh0(b D6JMK%imbI(UH)AakAJAip(apq24mFM8X`LGqCIM%-`HIVNqTc5V`k6TRfbb!6mq H,8dH2R(+`bG1"IM%,3HIVNm*2PhR5K@cm1Qk"&A6Zhf9i"1r2(cL9)42r2VK%km mI1*8K-r3,i"2((2`kIVNqpTe,(@%kqahK1Z5liKqq%blKI"Th0,`D6SKK%mmb[$ THBE`kAN9i02cpH(6mmR9X!LIq*AK%mmFI,SqT6DV`+IVR'fc!$ipHlBdHIM%+3q I1"AJ%lFFI,Sq*IKdR5Y9c-+Rkq*AMEI6L["Tr(,`DC`+m'Rmm["T[(,`DC`+m*R amq(61'EKdr2*pEAR@1`)ccRG%Cj,[L2bm1Ql"I$TZ(R`kA4#!*r'S`5IDFm!2Y0 HrI#CpNh$CpSR9m-#I"Ur%R`DcbamHMkP0KZ%6mmjffBqI+EYfG,Ni0-ijH$612A $Th(,`UIR8i42clP5a3amHLjqe4C4X8%)pAac-1Sj&U$8mmh$UHHCJe62X3#VrEi qY(V1@AJ0rA+p(cSA1bF-N!$ZRY#Ye%&jb-fk"V#EG[@J0pdj!IakAL8)cRJ(-*c al)ILM(mDMM0qa6SAB0Rc,8'cjjf&jp#[dUD$-"d'+,5T$pFCRd,CFV$Y1HDJfh2 XKfr203[KS9m4aX-!`jA1`(RS&[$iVZ*4dC+Q*+jj@8RmLXU5Z2D,5q+BejI%VbJ aj9`$P8PmFd+6ljBA3AcINS,JqrXLJZp9l*Tqh5Rd$+8Rec1Y2VRG%JT3iP6@S!, R8)B+(!Y+91$ZLe'"@k'm48P+A-ZUP$MRK#RIEE!Y+r+8lprIPS&)&EMdebX[9BP IAUd5[i*J*CijcFTh+mP@[[rH!QI&+pmVU#D!S0FN+D+eZ1E4@[b+D#fZr@JYMRQ d&VmL@ZGF!l3@haaDqfjj@2"p5ehMqrYGihX9ZkBIV822%+eGcc4DZpd5SV8iPG% kF!l41R!XS(AJlU0ei&BSEa'YaE@-eZ+F3f[IEE!Y+fMYqrHhCB$@J8Yr[I*S,Aj jY"Dr!PU,C`kYIEF5@[[qH`ZF4@[I+cHKY6(TTfdfQYNG"1Y8,1mR@jY@(3I'2Sa [FI6$1!k-IaMIdJL)m5b1J4M(`C'2M(0Q6X6i&NC#2,rL[),R2+MfH`%bLVrRPTe 9F$US0#ELZqC'44cAF&c%Z&4Q-SahB5l$mk[8HZpmKKHJ81[XR%EDTe$riVb'F3a ae5jq'YJaBP+aMF5aE"%dUGLib3D(#ZE`$MQ,8jVYNTbYL5eaam8&rAZ-`i9P,*p KJ`-((aHQ'5ld,HqSEKpI#1)J$G[PE3MKii+M,lLid11AZ'&#&KFQVq$#eUJ-MM$ iZ0$`*#lBhJL$M`Y6eRRN,4TEYX6K`P5(#miH6"h9E59[60,(KG4CA,#l-8NI&qT CZdH00fDQaVfM3EUFmF5RRXqq-Y@)YJabETaL8R)l5mJbqlLYXMI`1d&D8SBGrV` 6bl9TA(!'lfrXpC)d,h-6'(aFL"@iB(&$JXcaF3%HQCT1H09MliNe'Ud5J1PjR@e NG[,3E2A,Lq`lfccX$PLGQCFIHXmQcYkJ*SpE,q3KHd08%L%2jrd5jqQ"dMR4,89 kj$b&@lpiDJ&Bi*mmPMI[AAiZcYUjLJSl('0jP'AP!(QXANV[UR)r8YGMLPbA6j3 $p-H'Q31eFS!m$-*FYAJ"BI4baleJc%9"e2Y5$*2(eHhcHDcdZi&HeH#&pTZ#9*Z 'KXG$cQ[blSXJB[*J4HfMI@mC32+H&q!MABp4MU,I!MQBKa@!@@bTYcE@QUhe'Af r*HcYH6%2MYilR$8[Ih,!aGeCHJ(-*[,JY,8MAS`j8PH6ahAq#qc8["0!(VH&cq$ iSASidT[rHNrZ0*C2--UeMDRGcmA4SR*M[5XeNG)19,jVDJ1Ta[1`"M$"GE[hI3@ "ZqBfkY%eP6bePHCreF05`8a(X9`MR[0m9+8lh$aDYTB&j$&5N!!(mKJ'mKrN8@- %"r2BIZa#3IBIfi#5F+6[8@`X!`V!D(ISHXKq*p9'Fr,3VlTC![,BHVj$D[f4VZ[ @a@H4mB%mGTeRll@kHRRB!a552F5#H@3'8&[Z%XV&R-GVJLrTCZc(HZ5I[P`6 N`@QM54kTDpG+(NHEa1J0k4F'bd%QP8mS**B66GNH`1#X%YUVA3(*$a`(mIaA,R0 R9ZQ(*UK,1e$j`jTJ03qlbA6))3fZdKd2DA"MH8aSF'0j6'K`qr)iU-(9mV"hD(! $GE8jD($94MZX`GAbQ0$J"Y*i@)-Ebq13!!CA6X4'S-'0a(#H40kIKhkM+,,PT#E (cf$HU(AdPYII1iTG(Am0%Ck`cF2HcA[CXDehAXSSk+8icC!![hl,CY1@6pacq5! 2+`"c[kc@h1#,a2"8Vi'HYAjSJK9JI%J6('*%YJ"0F1dcNSDFifT6"fGHl#!BNhe L5XNH-&eN1jR#fA'"#HV(j*N!((bJh@0-pSPTRQe"#F$!UT2(%36f&)"4*H(lpE$ I61(dEBc-Mafpcd2RpXVUNJfj-rfVM%!R-Yc4KaM"@"i6M'!XM`NNhjI(355[j@% 23(,lJLBi8&HEJbCBEE6$M+#@a`3M'%MMB8B`PXFK6E#FL*I(U-bNmc#,J)cKd'i fkaJk*,%p-e&LEaj@!#f2Ba'B1p-2CHk0ibXf3iL[mqLGAhSfMhAc5aYjb#X!l+0 5TR!0clr4SV1SaRM`MCEK2!j-[G48C`["e-[4Yd`mTR2`,C2KrV!(U2)2[[P4UFG $Ehi-er@!HRfJlcN6Eh8-em2NFI#0MC%me2%$RVI$kfEjQDkGrKDHE2TCr,,3d[) 5clY%IM[2*0,-6c0qeclTed%H$CCIl'p2qjf0RmP$jaIia422ff6j"AkV0q(lf@j H61Aal*DE0m6QkIM48B(Ihr,6f-fc-r&d'PkGJ[`Zq5#qVGeHGXC[dcGkhX96hAc K6*h8(`NkGGl8fmq[lU1#RTimSSk"hq@(bHrFeK4l[8Iqi&%FCMQrDGUlSkfASTk Sr6q1EC(jkAMaHZ%AhI3HaC!!rS!2a9fmcrm$YRD,Yi5I*ZIhT9hBj)QkD3IjQH6 m2U9H1F[j(Ip,r0cPr,l`2GJHChe2h0A1lqZU)D-VqY6rrZNka6kLaK#rE`hUT'k r#!HQ@[5CUMbP6YYr$YYQjaHlMjq8Uq[p[i[YQHEh#RiDR0ql&&Z)EdcpkrKG%[` 0YPmc[pF0mV[N0d5NhQMeZ*1I-jhIIGq#l8d@laCqTMLr5I*lXrNp9rASJ@YPF#Z kPjqlZrlC+G$SAr&cDT&(`rh[`rCZjrFNDRc+0ZIhREYaS&rdHHP[J`R6#lmTelm ,KrFi[rXfHpk0$jNIIINAcLrj5@!MkI*iRAVT[Fl[TMqQ9SdZh[)(F(LImhX2q5@ ZG(jRAiE$qke1he%c1hjE`,E)(eUp*`h`S1'A[aRE"me[qU$2'Ylp8pM!0rcJB91 Gh`[8Zf#A2L[rQMV91ErRAih$KbdH1(@fbhZQHNAAcILpIT!!aj4VEX6f8HIh!I* 4(h4j[1Zc1(c-qGfQHLpem8bXMcZrfm(,K-12+F'RFIL%mp[i-(P)(j`KcH@6cZm 1HL,@FRil2Sl$T`a(&iLF1(Pr@rhkDHIh2,#`cX9Vq-!q($lMr1i%4f*AZ6aQI!L (ceTGhmV295lH-d3!2fIjR6$S[iC2UIqim30VRIkEFPKjIplk(KbArVYAZ%[[d$, R#%ZFH#Gp$0XAR0q(IT&kRqcL[9-ed[eSmJ!lhq$mhL(GK9S"FI5@Jpp6QQ"-42b )GYBB((9j6fPp')F[1Vm,IiHIfFk[8lA!&crL5PhIIKdf-"QrE`p`FFS9`Vi['8j -29hAqm8j[Zcm9QdIm)q'6li6fpml[flKPm-r'Kjk'lD[1,V9SjkqUjZGj9Y4m8k AjfPZkTj[A3Y14)`[qRiVVa'h%,lSqp9,*h$jA"$[ARj@'*m,iS&K6Ve69k'%U6F k[iq!TkIY,Ib5I6"$IErcqjTiT0-hb6q&!kTlR0phUC2`J162JlA+m5&e,6JP2#$ jCh!qjIL3!2T@HP&i3'SRFecU"jhIA2Sll[![Y38ZU0jXGB*$50lEIa5r1m`2pFl "S93&j9A"aidIBUE6VmQhJ+&+r)MqT[B1ILFr#Fp62qcbAXM8S[#!j(["3[9@LhI FJ!HN@Q#PqK(cJqXiHD5ZJ(-SpEMqE5'Hm)$8GM"E[GhjA3$(%Kk3!(`F,&68%,q ,RKM`J16lEm-"hUGrerlMJ!HN$X*6P6L,rPd(CJJ25$i"ae!rj[`f%&Yi31U@cq$ `8[26I5)m)(N#,&3RR0pPm!hK!DNEb%RGlqUkrZ)"$dJqJ1+La1@Tpj02ppq(e'F [YckMRjhq5ri3R&$pT-9$Kj(qfk1miFAkE2Le!3p)0DQG%JI8[keS!-)$NL'F9BQ lkA1VG!L("b52)qZTGeKqi)l$!e)AB9-rlI*SSlq&"k4Hb55(%ZlThb[&k4dHN!# m"qe6#D[a!rZGZUBmpH9Vc!rqiH"LmP'iXISCmd-[N!$meX&Ae-qD(j+M``05Yrd G$QJ&q-(9("k3!*T"X9B21Vr&b*A#Gq2[JX-Vaj[9Um"1eqqV`PIKcHXIiZIiER* @PeS[IjFhd,YblS'AHlc"peX[(Z,b"Yp[Jel[FAP$i(Fc2ki1P2C6ipY1eqR,F"T P22iLm5@REa+ld6L8ir(U9p(RK%mN)PjZ8)l(UpFKE`UI5,aAA-(KmHT4qPEi41* U--$S92VhFRLAm)P%$*G6MXHV1m%2i3f*"m9A("k[jY&pK'I%2dBYPI(iLcihk2[ iip4F'Bqr8(U+JfH*pk((+12aUm3$R,j2["01V)c(Vj)'ir#!421Em(0i[!UqGm! R%[F*9i6(Va+RG2K%r&2dLM)H[elDMj0(r2G1iZI`H(@A-0MK%r&2df2+H2`hK9X 16LHfSZFTir(VM`cUQVKc'MrKmH[&3jbkaRm6M8`CMem[[*DkRLfmG(Lm@T4HjZ" diMkd219i[!V&&4bF6Y`"4LV(ip@5Y"-(Ta2[KV-Tir%ET3di1"hrLqr'cq(aDZR p!jb1IaC1B(41H2rA9#HYDk)*Hrcir`%!!#%K!h"[G`#3(JQ'!DJ!``+#!PF!N!- "!*!$KJ#3"aB!N!1'!!!"$[q3"!2JY&mZ),5@8hX!N!8#"Li!N!Bl%Irarr`!!-0 !!!#HBhBZ!!!: fv5.4/tcltk/pow/pow.tcl0000644000220700001010000131536311476213200014453 0ustar birbylheadevproc printStack {} { set level [info level] for {set i 1} {$i < $level} {incr i} { puts "Level $i: [info level $i]" } } proc powInitGlobals {} { #puts "powInitGlobals start" ############################## # This routine sets up various global variables which should be initialized # when POW is loaded... Some are used before the TCL routine powInit # is called... eg, in powSetupColormap. Putting it here instead of in # the C initialization routine, PowInit, makes it easily updated/modified # by developers (and us). PowInit must call this routine. ############################## global powMinColorcells global powPseudoImages global powbg global powFrameForTop global yellowLineWidth global powWCS global regionParam xRangeParam global powLutButton powROIButton global POWRC tcl_platform env global isMac global powIsDragging global powOrderedGraphList global localPowObject global searchPath global powOutputPaperSize global powConvertFunction global powSelectDirectory global powPrintFunction global powPaperSizeSelected global tixOption global g_titleFont global powRegionListGlobal global powNotifications global ghostScript global g_backupDir ############################## # Notifications sent by POW: # on graph creation/redraw: graphHasFinishedDrawing # on graph destruction: graphHasBeenDestroyed # on graph deselection: graphHasBeenUnselected # on graph selection: graphHasBeenSelected # on image selection: imageHasBeenSelected # on graph resize: graphHasResized # on graph moved: graphHasMoved dx dy package require Tix tix configure -fontset 14Point set ghostScript "gs" if { $tcl_platform(platform)=="windows" } { set ghostScript "gswin32c" } set errorFlag [ catch { exec $ghostScript -help } result ] set searchPath [determineSearchPath $result] if { [string first "Available devices:" $result] < 0 } { set ghostScript "" } if ![info exists g_backupDir] { set g_backupDir $::env(HOME) } set powOutputPaperSize [list Letter 8.0i 10.5i 672.4 985.6 612 792 \ A4 7.76389i 11.1944i 652.6 1050.8 595 842 ] # A5 5.34722i 7.76389i 449.43 728.8 420 595 # Legal 8.0i 13.5i 672.4 1267.2 612 1008 # 11x17 10.5i 16.5i 882.53 1548.8 792 1224 # Ledger 16.5i 10.5i 1386.82 985.86 1224 792 set powConvertFunction [list {bmp bmp256 bmp "Windows Bitmap"} \ {jpeg jpeg jpg "JPEG File"} \ {postscript pswrite ps "Postscript Files"} \ {pbm pbm pbm "Portable Bitmap File"} \ {ppm ppm ppm "Portable Pixmap File"} \ {png png256 png "Portable Network Graphics"} \ {pnm pnm pnm "Portable any Map File"} \ {ppm ppm ppm "Portable Pix Map File"} \ {tiff tiff24nc tiff "Tagged Image File Format"}] set powSelectDirectory [pwd] set powPaperSizeSelected Letter set powRegionListGlobal {} set powPrintFunction "lpr" if { $tcl_platform(platform)=="windows" } { set powPrintFunction "winPrint" } set powNotifications [gNotifications] # ############################## # Identify if on a Mac if { $tcl_platform(platform)=="macintosh" } { set isMac 1 } else { set isMac 0 } # Try to grab 128 colorcells to hold POW's colormaps set powMinColorcells 128 # Use pseudocolor images by default set powPseudoImages 1 # Also need this so powToplevel can get going in safe mode if { $isMac } { # Set default background to a more "Platinum" appearance set powbg "#eeeeee" } else { set powbg "#cccccc" } # By default, assume we're not running safe (need to make a powSafeInit # entry point to do this eventually set powFrameForTop 0 # How wide should the yellow line around the selected graph be? set yellowLineWidth 3 # Initialize a couple of region handling globals set regionParam(nItems) 0 set regionParam(gn) "" set xRangeParam(nItems) 0 set xRangeParam(gn) "" # These two variables are here so developers can easily override them... # The first determines which mouse button "diddles" the image colortable, # the second drags out a Region Of Interest set powLutButton 3 set powROIButton 1 trace variable powWCS w powWCSCallback # Define location of the POW resource file switch $tcl_platform(platform) { "unix" { set POWRC "~/.powrc" } "windows" { set POWRC [file join $env(POW_LIBRARY) "pow.ini"] } "macintosh" { set POWRC [file join $env(PREF_FOLDER) "pow Preferences"] } } # Comment out powXPA init until future need for XPA powXPA::init set localPowObject [gPowCmdsClass] # This is just a state variable set powIsDragging 0 # This lists the graphs created, in order set powOrderedGraphList {} } ######################################################################## proc powSetGlobal_bg { val } { #puts "powSetGlobal_bg start" global powbg if { $val == "" } return set powbg $val powChangeBg } proc powSetGlobal_cursor { val } { #puts "powSetGlobal_cursor start" global powcursor global powGraphCoordsTracker set powcursor $val .pow configure -cursor $val .pow.pow configure -cursor $val .pow.scope configure -cursor $val } proc powSetGlobal_ResizeMain { val } { #puts "powSetGlobal_ResizeMain start" global powResizeMain set powResizeMain $val } proc powSetGlobal_GUIposition { val } { #puts "powSetGlobal_GUIposition start" global powGUIposition set powGUIposition $val powLayoutGUI powUpdateGeometry } proc powSetGlobal_ScopeSize { val } { #puts "proc powSetGlobal_ScopeSize start" eval powCmds::scope $val } ######################################################################## proc powGetVersion { } { #puts "powGetVersion start" set revisionString {$Revision: 1.514 $} regexp {Revision: ([0-9.]+)} $revisionString blob powVersion set powVersion "(Build $powVersion)" return $powVersion } proc powWCSCallback {array element op} { global powWCS if {$powWCS($element) == ""} return if {![catch {image type $element}]} { eval [concat powWCSInitImage $element $powWCS($element)]; } elseif { [lsearch -exact [powListCurves] $element]!=-1 } { eval [concat powWCSInitCurve $element $powWCS($element)]; } } proc powInit { {powXColormapWindow none} {powContainerPath none} {powgui 1}} { #puts "powInit start" #This procedure creates the .pow window and sets up all the bindings # powXColormapWindow - a Tk path specifying a window to use to find the # X colormap to use. # powContainer - what window to "use" to put POW in # powgui - Do you want the POW user GUI header (usually yes, unless you're embedding POW in some other application) global currgn currimg mag powLargeFont Private_Colormap env global cmap cmap_inv powResizeMain powcursor global powImageParam powCurveParam powMenuOption global powbg powScopeWidth powScopeHeight powPlotParam powFontParam global powMinHeight powMinWidth powMaxHeight powMaxWidth global powFirstTimeThroughFlag global powShowHandlesFlag global powTrackText global powGraphCoordsTracker powImagePixelTracker powImageValueTracker powPhysicalPixelTracker global powHelpTopics curr_img powFirstPixel global powSqueeze powSlide powPseudoImages powMinColorcells global Pow_Allocated powGUIposition global powScopeMargin powScopeSize powGridLines powShowScope powScopeGn global powGUI showlinks powContainer powFrameForTop powDWP global powLutButton powROIButton POWRC global tcl_platform global menuBarDeleteFlag global g_titleFont g_backupDir global g_magnification global prev_magnification global g_multiplier global g_showpow_flag global powFitsHeader powFitsHeaderCnt set powGUI $powgui set powContainer $powContainerPath if {($powXColormapWindow == "safe" || $powFrameForTop == 1) && \ $powContainer == "none"} { set powContainer "." } event add <> set powFirstTimeThroughFlag 1 set powShowHandlesFlag 1 # trace variable powPlotParam w debug_trace #set defaults for options if {$powXColormapWindow == "safe"} { #don't set up a colormap if we're running in a tclet set powFrameForTop 1 if {[winfo visual $powContainer] == "pseudocolor"} { # set powPseudoImages 1 # This seems to break the plugin, so for now set powPseudoImages 0 } else { set powPseudoImages 0 } powToplevel .pow safe } else { if {$powXColormapWindow == "none" || $powXColormapWindow == "NULL"} { if {$powContainer != "none" && $powContainer != "NULL"} { powSetupColormap .pow 0 [list -use [winfo id $powContainer]] } else { powSetupColormap .pow 0 } set powXColormapWindow .pow } else { set visual [winfo visual $powXColormapWindow] set depth [winfo depth $powXColormapWindow] if {![regexp -nocase "pseudocolor" $visual] || $depth != 8} { # This doesn't seem so bad # puts stderr "Visual of window $powXColormapWindow is $visual $depth." set powPseudoImages 0 } if {$powContainer != "none" && $powContainer != "NULL"} { powToplevel .pow $powXColormapWindow [list -use [winfo id $powContainer]] } else { powToplevel .pow $powXColormapWindow } } #Check that there's still enough colors for POW to function i.e. they haven't #filled up the Colormap since we set it up, this should only happen if #they're using the default colormap. if {$powPseudoImages} { set free_colors [powTestColormap $powXColormapWindow] if {(($Pow_Allocated != 0) && ($free_colors < 10)) || \ ($Pow_Allocated == 0) && ($free_colors < 60) } { puts stderr "Colormap full"; set powPseudoImages 0; } } } #Since a master window must be the parent of a slave window or the descendant #of the slaves parent, we can't use .pow.whatever for "popup" dialogs #DWP stands for DialogWindowPrefix if $powFrameForTop { set powDWP ".pow" } else { set powDWP ".pow." } if { [info exists g_showpow_flag] && $g_showpow_flag == "noshow" } { wm withdraw .pow } #powPseudoImages is set by powSetupColormap if {!$powPseudoImages} { # puts stderr "Pseudocolor images disabled; using Truecolor images." powSetupPhotoImages } # Huge lists of fonts can't be listed on screen, so just grab # some common ones. set allFonts [lsort [font families]] set powFontParam(allFonts,powDef) {} foreach fnt [list \ {[Aa]rial} \ {[Cc]ourier} \ {[Hh]elvet} \ {[Pp]alat} \ {[Tt]imes} \ {[Ss]ymbol} \ ] { set i [lsearch -regexp $allFonts "^${fnt}.*"] if { $i >= 0 } { lappend powFontParam(allFonts,powDef) [lindex $allFonts $i] } } set fnt {[Cc]ourier} set i [lsearch -regexp $powFontParam(allFonts,powDef) "^${fnt}.*"] if { $i < 0 } {set i 0} set fnt [lindex $powFontParam(allFonts,powDef) $i] set powFontParam(allTypes,powDef) [list title axis tick note] set powFontParam(allOpts,powDef) [list Font Size Weight Slant Color] foreach lbl $powFontParam(allTypes,powDef) { set powFontParam(${lbl}Font,powDef) $fnt set powFontParam(${lbl}Size,powDef) 12 set powFontParam(${lbl}Weight,powDef) normal set powFontParam(${lbl}Slant,powDef) roman set powFontParam(${lbl}Color,powDef) "#000000" } set powFontParam(titleSize,powDef) 16 set powImageParam(allOpts,powDef) [list colormap invert scale] set powImageParam(colormap,powDef) gray set powImageParam(invert,powDef) No set powImageParam(scale,powDef) log set powImageParam(allMaps,powDef) [list \ [list Continuous gray blkbdy hot cold spectrum inv_spec \ color1 color2 color3] \ [list Ramps gray-ramp2 gray-ramp4 bgr-ramp bgr-ramp2 \ rygcbm-ramp bowlerhat] \ [list Steps gray-step4 gray-step8 bgr-step bgr-step2 \ rygcbm-step tophat] \ ] set currgn "powDef" set powScopeGn "-" set powCurveParam(allOpts,powDef) \ [list pDisp pShape pSizeErr pSize pFill pColor \ lDisp lStyle lWidth lStep lBoxFill lColor \ logX logY LOD] foreach opt $powCurveParam(allOpts,powDef) \ val [list Yes Cross No 4 No #000000 \ No " " 1 No No #000000 \ No No 0] { set powCurveParam($opt,powDef) $val } set powCurveParam(allColors,powDef) \ [list Black #000000 Red #FF0000 Blue #0000FF Green #00FF00 \ Yellow #FFFF00 White #FFFFFF Purple #9900FF Orange #FF9900 \ Aqua #00FFFF Grey #999999 Fuchsia #FF00FF ] set screenHeight [winfo screenheight .] set powScopeWidth 150 set powScopeHeight 150 set powMinHeight 350 set powMinWidth 350 set powGUIposition top set powShowScope 1 set powcursor crosshair set powResizeMain 0 set showlinks 0 set powFirstPixel 1 set powPlotParam(allOpts,powDef) [list \ tickLabels xTickScal yTickScal xNumTicks yNumTicks \ xTickLength yTickLength xLabelTicks yLabelTicks \ tickFormatCmdX tickFormatCmdY \ GridLines GridColor GridDash \ xdimdisp ydimdisp ] set powPlotParam(wcsName,powDef) "WCS" set powPlotParam(tickLabels,powDef) "degrees" set powPlotParam(tickFormatCmdX,powDef) "format %.6lg" set powPlotParam(tickFormatCmdY,powDef) "format %.6lg" set powPlotParam(xTickScal,powDef) "linear" set powPlotParam(yTickScal,powDef) "linear" set powPlotParam(xNumTicks,powDef) 3 set powPlotParam(yNumTicks,powDef) 3 set powPlotParam(GridLines,powDef) No set powPlotParam(GridColor,powDef) "#FFFFFF" set powPlotParam(GridDash,powDef) " " set powPlotParam(xdimdisp,powDef) 350 set powPlotParam(ydimdisp,powDef) 350 # order is [lft rgt top bot] set powPlotParam(xTickLength,powDef) [list 10 10 10 10] set powPlotParam(yTickLength,powDef) [list 10 10 10 10] set powPlotParam(xLabelTicks,powDef) [list Yes No No Yes] set powPlotParam(yLabelTicks,powDef) [list Yes No No Yes] # Initialize other powDef variables to simplify creating new graphs set powPlotParam(curves,powDef) NULL set powPlotParam(images,powDef) NULL set powPlotParam(xunits,powDef) NULL set powPlotParam(yunits,powDef) NULL set powPlotParam(xlabel,powDef) X set powPlotParam(ylabel,powDef) Y set powPlotParam(xBot,powDef) NULL set powPlotParam(yBot,powDef) NULL set powPlotParam(xTop,powDef) NULL set powPlotParam(yTop,powDef) NULL set powPlotParam(flipD,powDef) "U" set g_magnification 1.0 set prev_magnification 1.0 set g_multiplier 4.0 #read user's option file if present catch {if [file readable $POWRC] { source $POWRC } } # test for obsolete variable powCurvetype if { [info exists powCurvetype] } { if { [string first Points $powCurvetype]==-1 } { set powCurveParam(pDisp,powDef) No } else { set powCurveParam(pDisp,powDef) Yes } if { [string first Line $powCurvetype]==-1 } { set powCurveParam(lDisp,powDef) No } else { set powCurveParam(lDisp,powDef) Yes } unset powCurvetype } # Convert old 1/0 booleans to Yes/No strings foreach opt [list pDisp pSizeErr pFill lDisp lStep] { if { $powCurveParam($opt,powDef) } { set powCurveParam($opt,powDef) Yes } else { set powCurveParam($opt,powDef) No } } set powSqueeze 0.0 set powSlide 0.0 # Convert old powNumTicks to powX/YNumTicks if { [info exists powNumTicks] } { set powPlotParam(xNumTicks,powDef) $powNumTicks set powPlotParam(yNumTicks,powDef) $powNumTicks } # Convert old pow* options to powPlotParam(...) if { [info exists powGrid] } { if { $powGrid } { set powPlotParam(GridLines,powDef) Yes } else { set powPlotParam(GridLines,powDef) No } set powGridLines $powPlotParam(GridLines,powDef) } if { [info exists powGridColor] } { set powPlotParam(GridColor,powDef) $powGridColor } if { [info exists powGridDash] } { set powPlotParam(GridDash,powDef) $powGridDash } if { [info exists powSixties] } { if { $powSixties } { set powPlotParam(tickLabels,powDef) "degrees" } else { set powPlotParam(tickLabels,powDef) "decimal" } } set powMenuOption(tickScal) \ "$powPlotParam(xTickScal,powDef)-$powPlotParam(yTickScal,powDef)" # Convert text colors to hex... if { [info exists powCurveParam(Color,powDef)] } { set powCurveParam(lColor,powDef) $powCurveParam(Color,powDef) set powCurveParam(pColor,powDef) $powCurveParam(Color,powDef) unset powCurveParam(Color,powDef) } set powCurveParam(lColor,powDef) \ [powColorToHex $powCurveParam(lColor,powDef)] set powCurveParam(pColor,powDef) \ [powColorToHex $powCurveParam(pColor,powDef)] set powPlotParam(GridColor,powDef) \ [powColorToHex $powPlotParam(GridColor,powDef)] # Calculate Scopebox margin/size from current Width/Height values set powScopeSize [list $powScopeWidth $powScopeHeight] if { !($powScopeWidth && $powScopeHeight) } { set powScopeWidth 10 set powScopeHeight 10 set powShowScope 0 } else { set powShowScope 1 } set powScopeMargin [expr ($powScopeWidth+$powScopeHeight)/20] set Private_Colormap 4 if {!$powPseudoImages} { # powSetColorTable } .pow configure -bg $powbg catch {wm title .pow "POW [powGetVersion]"} catch {wm geometry .pow +0+240} if $powGUI { ############################################################## # Start Menus ############################################################## global isMac event add <> event add <> event add <> event add <> event add <> bind .pow <> "powEvents::postMenus %W" bind .pow <> "powSave" bind .pow <> "powPrintBox" bind .pow <> "powScopeZoom in yes 2.0" bind .pow <> "powScopeZoom out yes 2.0" bind .pow <> "powScopeZoom reset yes" .pow config -menu .pow.mbar menu .pow.mbar -postcommand "powEvents::generate <>" -bg $powbg -font g_titleFont if { $isMac } { set cmdkey "Cmd" set bdVal 0 .pow.mbar add cascade -menu .pow.mbar.apple .pow.mbar add cascade -menu .pow.mbar.file -label "File" -font g_titleFont .pow.mbar add cascade -menu .pow.mbar.edit -label "Edit" -font g_titleFont .pow.mbar add cascade -menu .pow.mbar.colors -label "Colors" -font g_titleFont .pow.mbar add cascade -menu .pow.mbar.tools -label "Tools" -font g_titleFont .pow.mbar add cascade -menu .pow.mbar.zoom -label "Zoom" -font g_titleFont .pow.mbar add cascade -menu .pow.mbar.help -label "Help" -font g_titleFont menu .pow.mbar.apple -tearoff False .pow.mbar.apple add command -label "About POW" \ -command {powHelp About.html} -font g_titleFont } else { set cmdkey "Alt" set bdVal 2 .pow.mbar add cascade -menu .pow.mbar.file -label "File" -font g_titleFont .pow.mbar add cascade -menu .pow.mbar.edit -label "Edit" -font g_titleFont .pow.mbar add cascade -menu .pow.mbar.colors -label "Colors" -font g_titleFont .pow.mbar add cascade -menu .pow.mbar.tools -label "Tools" -font g_titleFont .pow.mbar add cascade -menu .pow.mbar.zoom -label "Zoom" -font g_titleFont } # # FILE # set ::env(PSTMPDIR) $g_backupDir menu .pow.mbar.file -bg $powbg -bd $bdVal \ -postcommand "powEvents::generate <>" -font g_titleFont # .pow.mbar.file add command -label "Page Setup..." \ -command {powSetupPage} -font g_titleFont .pow.mbar.file add command -label "Print..." \ -command {powPrintPreview} -font g_titleFont # .pow.mbar.file add command -label "Print..." \ -command "powPrintBox" \ -accelerator "$cmdkey+P" -font g_titleFont .pow.mbar.file add separator .pow.mbar.file add command -label "Close" \ -command "::powEvents::ExitPOW" \ -accelerator "$cmdkey+W" -font g_titleFont # # COLORS # menu .pow.mbar.colors -bg $powbg -bd $bdVal \ -postcommand "powEvents::generate <>" -font g_titleFont foreach colorGrp $powImageParam(allMaps,powDef) { set cName [lindex $colorGrp 0] menu .pow.mbar.colors.c$cName -bg $powbg -bd $bdVal .pow.mbar.colors add cascade -menu .pow.mbar.colors.c$cName \ -label "$cName" -font g_titleFont foreach color [lrange $colorGrp 1 end] { .pow.mbar.colors.c$cName add radiobutton -label $color \ -value $color \ -variable powImageParam(colormap,powDef) \ -command "powCmds::colormap $color" -font g_titleFont } } .pow.mbar.colors add separator .pow.mbar.colors add checkbutton -label "Invert Colortable" \ -variable powImageParam(invert,powDef) \ -onvalue Yes -offvalue No \ -command {powCmds::colormap invert $powImageParam(invert${currimg},$currgn)} -font g_titleFont .pow.mbar.colors add separator .pow.mbar.colors add radiobutton -label "linear" -value linear \ -variable powImageParam(scale,powDef) \ -command "powCmds::colormap scale linear" -font g_titleFont .pow.mbar.colors add radiobutton -label "square root" -value sqrt \ -variable powImageParam(scale,powDef) \ -command "powCmds::colormap scale sqrt" -font g_titleFont .pow.mbar.colors add radiobutton -label "logarithmic" -value log \ -variable powImageParam(scale,powDef) \ -command "powCmds::colormap scale log" -font g_titleFont .pow.mbar.colors add radiobutton -label "Histo Equalize" -value histo \ -variable powImageParam(scale,powDef) \ -command "powCmds::colormap scale histo" -font g_titleFont .pow.mbar.colors add command -label "Rescale Image..." \ -command {powRescaleBox} -font g_titleFont .pow.mbar.colors add separator .pow.mbar.colors add command -label "Create Colorbar" \ -command {powColorbar} -font g_titleFont # # EDIT # menu .pow.mbar.edit -bg $powbg -bd $bdVal \ -postcommand "powEvents::generate <>" -font g_titleFont if { $isMac } { .pow.mbar.edit add command -label "Can't Undo" -state disabled -font g_titleFont .pow.mbar.edit add separator } .pow.mbar.edit add command -label "Edit Graph..." \ -command {powEditGraphDlg $currgn} -font g_titleFont .pow.mbar.edit add command -label "Add Text Label..." \ -command {powEditNoteDlg $currgn -1} -font g_titleFont .pow.mbar.edit add command -label "Choose Graph Size..." \ -command powSetGraphSize -font g_titleFont .pow.mbar.edit add separator .pow.mbar.edit add command -label "Duplicate Graph" \ -command {powEditCreateNewGraph $currgn} -font g_titleFont .pow.mbar.edit add command -label "Delete Graph" \ -command {powDeleteGraph $currgn} -font g_titleFont menu .pow.mbar.edit.merge -bg $powbg -bd $bdVal \ -postcommand {powGenerateMergeCascade} -font g_titleFont .pow.mbar.edit add cascade -label "Merge Graphs" \ -menu .pow.mbar.edit.merge -font g_titleFont menu .pow.mbar.edit.unmap -bg $powbg -bd $bdVal \ -postcommand {powGenerateUnmapCascade} -font g_titleFont .pow.mbar.edit add cascade -label "Hide Graph" \ -menu .pow.mbar.edit.unmap -font g_titleFont menu .pow.mbar.edit.replot -bg $powbg -bd $bdVal \ -postcommand {powGenerateReplotCascade} -font g_titleFont .pow.mbar.edit add cascade -label "Replot Graph" \ -menu .pow.mbar.edit.replot -font g_titleFont .pow.mbar.edit add separator menu .pow.mbar.edit.log -bg $powbg -bd $bdVal .pow.mbar.edit add cascade -label "Axes Transforms" \ -menu .pow.mbar.edit.log -font g_titleFont .pow.mbar.edit.log add radiobutton -label "Linear-Linear" \ -variable powMenuOption(tickScal) -value "linear-linear" \ -command { powCmds::axes linear linear } -font g_titleFont .pow.mbar.edit.log add radiobutton -label "Linear-Log" \ -variable powMenuOption(tickScal) -value "linear-log" \ -command { powCmds::axes linear log } -font g_titleFont .pow.mbar.edit.log add radiobutton -label "Log-Linear" \ -variable powMenuOption(tickScal) -value "log-linear" \ -command { powCmds::axes log linear } -font g_titleFont .pow.mbar.edit.log add radiobutton -label "Log-Log" \ -variable powMenuOption(tickScal) -value "log-log" \ -command { powCmds::axes log log } -font g_titleFont # Tick Label format menu .pow.mbar.edit.tlabels -bg $powbg -bd $bdVal .pow.mbar.edit add cascade -label "Tick Labels" \ -menu .pow.mbar.edit.tlabels -font g_titleFont .pow.mbar.edit.tlabels add radiobutton -label "Decimal" \ -variable powPlotParam(tickLabels,$currgn) -value "decimal" \ -command { powAdornGraph $currgn .pow.pow; powRedrawGraphHandles $currgn } -font g_titleFont .pow.mbar.edit.tlabels add radiobutton -label "Base 60 (deg)" \ -variable powPlotParam(tickLabels,$currgn) -value "degrees" \ -command { powAdornGraph $currgn .pow.pow powRedrawGraphHandles $currgn } -font g_titleFont # Grid Line Options menu .pow.mbar.edit.grid -bg $powbg -bd $bdVal .pow.mbar.edit add cascade -label "Grid Line Options" \ -menu .pow.mbar.edit.grid -font g_titleFont .pow.mbar.edit.grid add checkbutton -label "Show Grid Lines" \ -variable powPlotParam(GridLines,$currgn) \ -onvalue Yes -offvalue No \ -command {powChangeGrid 1} -font g_titleFont .pow.mbar.edit.grid add separator foreach {clr hex} [list White #FFFFFF Black #000000 \ Blue #0000FF Red #FF0000] { .pow.mbar.edit.grid add radiobutton -label $clr \ -variable powPlotParam(GridColor,$currgn) -value $hex \ -command {powChangeGrid 0} -font g_titleFont } .pow.mbar.edit.grid add separator foreach [list opt val] \ [list Solid " " "Small Dash" 10 "Large Dash" 20] { .pow.mbar.edit.grid add radiobutton -label $opt \ -variable powPlotParam(GridDash,$currgn) -value $val \ -command {powChangeGrid 0} -font g_titleFont } .pow.mbar.edit.grid add separator .pow.mbar.edit.grid add command -label "Fewer Lines" \ -command { if {$powPlotParam(xNumTicks,$currgn)>0} { incr powPlotParam(xNumTicks,$currgn) -1 } if {$powPlotParam(yNumTicks,$currgn)>0} { incr powPlotParam(yNumTicks,$currgn) -1 } powChangeGrid 1 } -font g_titleFont .pow.mbar.edit.grid add command -label "More Lines" \ -command { incr powPlotParam(xNumTicks,$currgn) incr powPlotParam(yNumTicks,$currgn) powChangeGrid 1 } -font g_titleFont menu .pow.mbar.edit.wcs -bg $powbg -bd $bdVal .pow.mbar.edit add cascade -label "WCS" \ -menu .pow.mbar.edit.wcs -font g_titleFont .pow.mbar.edit.wcs add radiobutton -label "WCS" \ -variable powPlotParam(wcsName,$currgn) -value WCS \ -command {powSwitch2NewWCSHeader} -font g_titleFont .pow.mbar.edit.wcs add separator set idx 3 foreach wcsName [list a b c d e f g h i j k l m n o p q r s t u v w x y z] { .pow.mbar.edit.wcs add radiobutton -label "WCS $wcsName" \ -variable powPlotParam(wcsName,$currgn) -value WCS$wcsName \ -command {powSwitch2NewWCSHeader} -font g_titleFont .pow.mbar.edit.wcs entryconfigure $idx -state disable incr idx } .pow.mbar.edit add separator .pow.mbar.edit add command -label "Preferences..." \ -command {powDefaultOptions} -font g_titleFont # Eliminate in favor of Preferences box with "Get Current" button # .pow.mbar.edit add separator # .pow.mbar.edit add command -label "Save Current Settings" \ # -command {powGetCurrVariables; powSaveConfig} # # TOOLS # menu .pow.mbar.tools -bg $powbg -bd $bdVal \ -postcommand "powEvents::generate <>" -font g_titleFont .pow.mbar.tools add command -label "Blink Graphs..." \ -command {powBlinkGraphDlg} -font g_titleFont .pow.mbar.tools add command -label "Blink Images..." \ -command {powMovie} -font g_titleFont .pow.mbar.tools add command -label "Region Files..." \ -command {powRegion} -font g_titleFont .pow.mbar.tools add command -label "Make Contour Map..." \ -command {powContour} -font g_titleFont .pow.mbar.tools add command -label "Draw Profile..." \ -command {ProfileDlg} -font g_titleFont .pow.mbar.tools add command -label "Ruler..." \ -command {OpenRuler} -font g_titleFont .pow.mbar.tools add command -label "Image Probe" \ -command {imgProbeDialog} -font g_titleFont .pow.mbar.tools add command -label "Select X Range.." \ -command {powXRange} -font g_titleFont # # ZOOM Functions # menu .pow.mbar.zoom -bg $powbg -bd $bdVal \ -postcommand "powEvents::generate <>" -font g_titleFont .pow.mbar.zoom add command -label "Zoom In (2x)" \ -command "powScopeZoom in yes 2.0" -font g_titleFont -accelerator "Ctrl+I" .pow.mbar.zoom add command -label "Zoom Out (2x)" \ -command "powScopeZoom out yes 2.0" -font g_titleFont -accelerator "Ctrl+O" .pow.mbar.zoom add command -label "Zoom Reset" \ -command "powScopeZoom reset yes" -font g_titleFont -accelerator "Ctrl+R" .pow.mbar.zoom add separator foreach { maglabel mag } [list "zoom in at 1x" 1.0 "zoom in at 2x" 2.0 "zoom in at 4x" 4.0 \ "zoom in at 8x" 8.0 "zoom in at 16x" 16.0 "zoom in at 32x" 32.0] { .pow.mbar.zoom add radiobutton -label $maglabel \ -variable g_magnification -value $mag \ -font g_titleFont -command "powSetMagnification ; powScopeZoom in yes" } .pow.mbar.zoom add separator .pow.mbar.zoom add command -label "Invert X Axis" \ -command "powFlipImage X" -font g_titleFont .pow.mbar.zoom add command -label "Invert Y Axis" \ -command "powFlipImage Y" -font g_titleFont .pow.mbar.zoom add command -label "Invert Both" \ -command "powFlipImage B" -font g_titleFont .pow.mbar.zoom add command -label "Undo Invert" \ -command "powFlipImage U" -font g_titleFont .pow.mbar add command -label "Replot" \ -command "powReplotReset" -font g_titleFont if { !$isMac } { .pow.mbar add cascade -menu .pow.mbar.help -label "Help" -font g_titleFont } set menuBarDeleteFlag "false" # # HELP # menu .pow.mbar.help -bg $powbg -bd $bdVal \ -postcommand "powEvents::generate <>" -font g_titleFont if { $isMac } { .pow.mbar.help config -tearoff False } set powHelpTopics(About.html) About set powHelpTopics(Overview.html) Overview set powHelpTopics(Blinking.html) "Blinking" set powHelpTopics(Color.html) "Colors" set powHelpTopics(Contours.html) "Contours" set powHelpTopics(Profile.html) "Drawing Profile" set powHelpTopics(Edit.html) "Edit Menu" set powHelpTopics(EditGraphs.html) "Editting Graphs" set powHelpTopics(EditObjects.html) "Editting Objects" set powHelpTopics(File.html) "File Menu" set powHelpTopics(Probe.html) "Image Probe" set powHelpTopics(Ruler.html) "Measure" set powHelpTopics(Moving_Graphs.html) "Moving Graphs" set powHelpTopics(ROI.html) "Panning/Zooming" set powHelpTopics(PrintControl.html) "Printing" set powHelpTopics(DefaultOptions.html) "Preferences" set powHelpTopics(Regions.html) "Region Files" set powHelpTopics(Scripting.html) "Scripting" set powHelpTopics(Tools.html) "Tool Menu" foreach topic [lsort [array names powHelpTopics]] { .pow.mbar.help add command -label $powHelpTopics($topic) \ -command "powHelp $topic" \ } ############################################################## # Build Scope Objects ############################################################## # frame .pow.scopebuttons -bg $powbg # button .pow.scopein -bg $powbg -text "Zoom In" \ # -command "powScopeZoom in" # button .pow.scopezoom1 -bg $powbg -text "Replot" \ # -command "powEndROI 1" # button .pow.scopeout -bg $powbg -text "Zoom Out" \ # -command "powScopeZoom out" frame .pow.scopeframe -bg $powbg canvas .pow.scope -bg $powbg -cursor $powcursor \ -width $powScopeWidth -height $powScopeHeight label .pow.currgn -textvariable powScopeGn -background yellow \ -relief sunken -foreground black -font g_titleFont -bd 1 ############################################################## # Build Tracker Objects ############################################################## set powTrackText(gn) "NULL" set powTrackText(img) "NULL" set powTrackText(rx) "X" set powTrackText(ry) "X" set powTrackText(imgx) "X" set powTrackText(imgy) "X" set powTrackText(imgz) "X" set powTrackText(zunits) " " powUpdateTrackVars set powTrackerWidth 30 frame .pow.trackers -bg $powbg -width $powTrackerWidth label .pow.graphtrack -textvariable powGraphCoordsTracker \ -background $powbg -relief sunken -anchor w -justify left \ -width $powTrackerWidth -font g_titleFont -bd 1 label .pow.ppixeltrack -textvariable powPhysicalPixelTracker \ -background $powbg -relief sunken -anchor w -justify left \ -width $powTrackerWidth -font g_titleFont -bd 1 label .pow.pixeltrack -textvariable powImagePixelTracker \ -background $powbg -relief sunken -anchor w -justify left \ -width $powTrackerWidth -font g_titleFont -bd 1 label .pow.pixvaltrack -textvariable powImageValueTracker \ -background $powbg -relief sunken -anchor w -justify left \ -width $powTrackerWidth -font g_titleFont -bd 1 frame .pow.gui -bg $powbg powLayoutGUI } #end powGUI if block frame .pow.bottom -bg $powbg canvas .pow.pow -bg $powbg -cursor $powcursor\ -xscrollcommand ".pow.scrollx set" \ -yscrollcommand ".pow.scrolly set" \ -scrollregion [list 0 0 50 50] scrollbar .pow.scrolly -command "powScrollMainCanvas Y" -orient vertical\ -bg $powbg scrollbar .pow.scrollx -command "powScrollMainCanvas X" -orient horizontal\ -bg $powbg grid configure .pow.bottom -row 1 -column 1 -sticky "n s e w" grid rowconfigure .pow 1 -weight 1 grid columnconfigure .pow 1 -weight 1 grid configure .pow.pow -sticky "n s e w" -row 0 -column 0 \ -in .pow.bottom grid configure .pow.scrolly -sticky "n s e" -row 0 -column 1 \ -in .pow.bottom grid configure .pow.scrollx -sticky "n e w" -row 1 -column 0 \ -in .pow.bottom grid rowconfigure .pow.bottom 0 -weight 1 grid columnconfigure .pow.bottom 0 -weight 1 #put .pow.top above .pow.pow in the stacking order, #This should prevent window items on the #.pow.pow canvas from "bleeding" off the edges of the .pow.pow canvas lower .pow.bottom powSetGeometry if $powGUI { if { ! $powShowScope } { grid remove .pow.scopeframe grid remove .pow.trackers grid remove .pow.gui powDeleteMenuBarItem } bind .pow.pow {set_tracker_info %x %y .pow.pow} bind .pow.scope {set_tracker_info %x %y .pow.scope} # The 'powProcessClick' is required here since both BtnPress # and ROI is bound to canvas, but only 1 can be executed #puts "calling powBindBtn" powBindBtn <> "bind .pow.pow" \ {powBeginROI %x %y .pow.pow} \ {powDragROI %x %y .pow.pow; set_tracker_info %x %y .pow.pow} \ {powEndROI 0 .pow.pow} powBindBtn <> "bind .pow.scope" \ {powBeginROI %x %y .pow.scope} \ {powDragROI %x %y .pow.scope; set_tracker_info %x %y .pow.scope} \ {powEndROI 0 .pow.scope} powBindBtn <> "bind .pow.scope" \ {catch {powPanROI %x %y .pow.scope}} \ {catch {powPanROI %x %y .pow.scope}} \ {catch {powEndROI 0 .pow.scope}} bind .pow.pow <> \ { set x [.pow.pow canvasx %x] set y [.pow.pow canvasy %y] powDrawOriginal $x $y } bind .pow.scope <> \ { set x [.pow.scope canvasx %x] set y [.pow.scope canvasy %y] powDrawOriginal $x $y } bind .pow.scope <> {powProcessClick %x %y B%bD} } bind .pow <> {powExit} bind .pow.pow <> {+powProcessClick %x %y B%b} bind .pow.pow <> {powProcessClick %x %y B%b} bind .pow.pow <> {powProcessClick %x %y B%bD} bind .pow {event generate .pow -warp yes -x %x \ -y [expr %y+1]} bind .pow {event generate .pow -warp yes -x %x \ -y [expr %y-1]} bind .pow {event generate .pow -warp yes -x [expr %x - 1] \ -y %y} bind .pow {event generate .pow -warp yes \ -x [expr %x + 1] -y %y} .pow.pow bind graphDragable { if { !$powIsDragging } { .pow.pow configure -cursor fleur } } .pow.pow bind graphDragable { if { !$powIsDragging } { .pow.pow configure -cursor $powcursor } } powBindBtn <> ".pow.pow bind graphDragable" \ {powDragGraph start %X %Y} \ {powDragGraph drag %X %Y} \ {powDragGraph end %X %Y} #### # Create the virtual events and default bindings #### event add <> event add <> if { $powLutButton != 0 && $powLutButton != "NULL" } { event add <> if { $powLutButton == 3 && $tcl_platform(platform) == "macintosh" } { event add <> } } if { $powROIButton != 0 && $powROIButton != "NULL" } { # Must delete BtnPress sequence to prevent it from hiding the ROI event event delete <> event add <> event add <> # we are dedicate the back to original to 3 event add <> if { $powROIButton == 3 && $tcl_platform(platform) == "macintosh" } { event add <> event add <> } } if { $tcl_platform(platform) != "macintosh" } { event add <> } else { event add <> } event add <> event add <> event add <> if { $tcl_platform(platform) != "macintosh" } { event add <> } else { event add <> } event add <> event add <> update idletasks } # The next two functions prevent multiple bindings from being executed # for Btn events. Only the first set of events will be accepted. proc powBindBtn { event bindCmd beginCmd dragCmd endCmd } { #puts "powBindBtn start\n event: $event\n bindCmd: $bindCmd\n beginCmd: $beginCmd\n dragCmd: $dragCmd\n endCmd: $endCmd" regsub -all % $dragCmd %% dragCmd regsub -all % $endCmd %% endCmd set c1 [concat powBtn Begin $event [list $beginCmd] ] set c2 [concat $bindCmd \{ \ [list powBtn Drag $event $dragCmd] \ \}] set c3 [concat $bindCmd \{ \ [concat $bindCmd \{\}] \; \ [concat $bindCmd \{\}] \; \ [list powBtn End $event $endCmd] \; \ \}] eval $bindCmd $event {"$c3; $c2; $c1"} } proc powBtn { evt cntxt cmd } { #puts "powBtn start" global powBtnState powBtnContext if { ![info exists powBtnState] } { set powBtnState none set powBtnContext none } # If this is a different event from last time, execute command and remember # context... otherwise execute only if same context if { $evt != $powBtnState || $cntxt==$powBtnContext } { #puts "powBtn 1" set powBtnState $evt set powBtnContext $cntxt uplevel #0 $cmd #puts "powBtn 1 end" } } proc powLayoutGUI { } { global powGUIposition powShowScope #puts "powLayoutGUI start" # Build Tracker Box grid configure .pow.graphtrack -row 0 -column 0 -sticky ew \ -in .pow.trackers grid configure .pow.ppixeltrack -row 1 -column 0 -sticky ew \ -in .pow.trackers grid configure .pow.pixeltrack -row 2 -column 0 -sticky ew \ -in .pow.trackers grid configure .pow.pixvaltrack -row 3 -column 0 -sticky ew \ -in .pow.trackers # Build ScopeWindow grid configure .pow.currgn -row 0 -column 0 -sticky s \ -in .pow.scopeframe grid configure .pow.scope -row 1 -column 0 -sticky n \ -in .pow.scopeframe if { $powGUIposition == "top" || $powGUIposition=="bottom" } { # Build ScopeButtons # grid configure .pow.scopein -row 0 -column 1 -sticky ew \ # -in .pow.scopebuttons # grid configure .pow.scopezoom1 -row 1 -column 1 -sticky ew \ # -in .pow.scopebuttons # grid configure .pow.scopeout -row 2 -column 1 -sticky ew \ # -in .pow.scopebuttons grid configure .pow.trackers -in .pow.gui -row 1 -column 0 \ -sticky w -padx 3 -pady 3 if { $powShowScope } { grid configure .pow.scopeframe -in .pow.gui -row 1 -column 1 \ -sticky e } # grid configure .pow.scopebuttons -in .pow.gui -row 1 -column 2 \ # -sticky e grid columnconfigure .pow.gui 1 -weight 1 grid rowconfigure .pow.gui 0 -weight 0 grid rowconfigure .pow.gui 1 -weight 1 } else { # Build ScopeButtons # grid configure .pow.scopein -row 1 -column 0 -sticky ew \ # -in .pow.scopebuttons # grid configure .pow.scopezoom1 -row 1 -column 1 -sticky ew \ # -in .pow.scopebuttons # grid configure .pow.scopeout -row 1 -column 2 -sticky ew \ # -in .pow.scopebuttons grid configure .pow.trackers -in .pow.gui -row 2 -column 1 \ -sticky n -padx 5 -pady 5 if { $powShowScope } { grid configure .pow.scopeframe -in .pow.gui -row 0 -column 1 \ -sticky n } # grid configure .pow.scopebuttons -in .pow.gui -row 1 -column 1 \ # -sticky n grid columnconfigure .pow.gui 1 -weight 1 grid rowconfigure .pow.gui 0 -weight 1 grid rowconfigure .pow.gui 1 -weight 0 } switch $powGUIposition { "top" { grid configure .pow.gui -in .pow -row 0 -column 1 \ -sticky news } "bottom" { grid configure .pow.gui -in .pow -row 2 -column 1 \ -sticky news } "left" { grid configure .pow.gui -in .pow -row 1 -column 0 \ -sticky n } "right" { grid configure .pow.gui -in .pow -row 1 -column 2 \ -sticky n } default { grid remove .pow.gui } } lower .pow.gui } proc powScrollMainCanvas {x_or_y args} { #puts "powScrollMainCanvas start" global powPreScrollCallback powPostScrollCallback if [info exists powPreScrollCallback] { eval $powPreScrollCallback $x_or_y $args } if {$x_or_y == "X"} { eval .pow.pow xview $args } else { eval .pow.pow yview $args } if [info exists powPostScrollCallback] { eval $powPostScrollCallback $x_or_y $args } } proc powSetGeometry { } { #puts "powSetGeometry start" global powHeaderHeight powHeaderWidth powGUIposition global powMaxWidth powMaxHeight powMinWidth powMinHeight global powRealMinWidth powRealMinHeight global powGUI powScopeSize powContainer tcl_platform update idletasks if $powGUI { if { $powGUIposition=="top" || $powGUIposition=="bottom" } { set powHeaderHeight [lindex [lsort -integer -decreasing [list \ [expr 3*[winfo height .pow.graphtrack]] \ [expr [winfo height .pow.scope]+[winfo height .pow.currgn]] \ ] ] 0] if { $tcl_platform(platform) != "macintosh" } { # Add in the menubar incr powHeaderHeight 32 } set powHeaderWidth 0 set minGuiWidth [expr [winfo width .pow.graphtrack] \ + [winfo width .pow.scope] \ + 15] if { $minGuiWidth > $powMinWidth } { set powRealMinWidth $minGuiWidth } else { set powRealMinWidth $powMinWidth } set powRealMinHeight [expr $powMinHeight + $powHeaderHeight] } elseif { $powGUIposition=="left" || $powGUIposition=="right" } { set powHeaderWidth [lindex [lsort -integer -decreasing [list \ [winfo width .pow.graphtrack] \ [winfo width .pow.scope] \ ] ] 0] set powHeaderHeight 0 set minGuiHeight [expr 3* [winfo height .pow.graphtrack] \ + [winfo height .pow.scope] \ + [winfo height .pow.currgn] \ + 10] if { $minGuiHeight > $powMinHeight } { set powRealMinHeight $minGuiHeight } else { set powRealMinHeight $powMinHeight } if { $tcl_platform(platform) != "macintosh" } { # Add in the menubar incr powRealMinHeight 32 set powHeaderHeight 32 } set powRealMinWidth [expr $powMinWidth + $powHeaderWidth] } else { set powHeaderHeight 0 set powHeaderWidth 0 set powRealMinWidth $powMinWidth set powRealMinHeight $powMinHeight } } else { set powHeaderHeight 0 set powHeaderWidth 0 set powRealMinWidth 0 set powRealMinHeight 0 } set powMaxHeight [expr [winfo screenheight .pow] - $powHeaderHeight] set powMaxWidth [expr [winfo screenwidth .pow] - $powHeaderWidth] if {$powContainer == "none" || $powContainer == "NULL" } { catch { wm minsize .pow $powRealMinWidth $powRealMinHeight } catch { wm maxsize .pow [expr $powMaxWidth + $powHeaderWidth] \ [expr $powMaxHeight + $powHeaderHeight] } } else { catch {wm geometry .pow "[winfo geometry $powContainer]"} } } proc powGetGraphOptions {gn} { #puts "powGetGraphOptions start" #returns list of extra graph options global powPlotParam #test for requested graph if { ![powListGraphs $gn] } { error "Graph $gn does not exist" return } lappend optlist "bgcolor" $powPlotParam(bgcolor,$gn) lappend optlist "xmargin" $powPlotParam(xmargin,$gn) lappend optlist "ymargin" $powPlotParam(ymargin,$gn) return $optlist } proc powGraphOptions {gn args} { #puts "powGraphOptions start" #add extra graph options here. Arguments are "option value" pairs. global powPlotParam currgn set argc [llength $args] if { $argc == 1 } { if { [info exists powPlotParam($args,$gn)] } { return $powPlotParam($args,$gn) } else { return "" } } elseif { [expr $argc %2] != 0 } { error "Arguments must be in 'option value' pairs" } foreach [list option value] $args { switch $option { bgcolor { set powPlotParam(bgcolor,$gn) $value if [winfo exists .pow.pow] { set cleanName [powCleanName $gn]handle .pow.pow itemconfigure ${gn}bkg -fill $value -outline $value if [winfo exists .pow.s$cleanName] { .pow.s$cleanName configure -bg $value } if [winfo exists .pow.ms$cleanName] { .pow.ms$cleanName configure -bg $value } .pow.pow lower ${gn}bkg } } xdimdisp - ydimdisp - xmargin - ymargin - zoomed - FixedAspect { set powPlotParam($option,$gn) $value } titleString - titleAnchor - titlePosition - xNumTicks - yNumTicks - flipD - xlabel - ylabel - xunits - yunits { set powPlotParam($option,$gn) $value set doAction(adornGraph) 1 } xTickLength - yTickLength - xLabelTicks - yLabelTicks - tickLabels - tickFormatCmdX - tickFormatCmdY - xTickScal - yTickScal { set powPlotParam($option,$gn) $value set doAction(adornGraph) 1 set doAction(redrawGraphHandles) 1 } wcsName { set powPlotParam(wcsName,$gn) $value } # Grid and GridLines are same option. Grid is archaic. Grid - GridLines { set powPlotParam(GridLines,$gn) $value set doAction(adornGraph) 1 } GridColor { set clr [powColorToHex $value] set powPlotParam(GridColor,$gn) $clr if [winfo exists .pow.pow] { .pow.pow itemconfig ${gn}grid -fill $clr } } GridDash { set powPlotParam(GridDash,$gn) $value if [winfo exists .pow.pow] { .pow.pow itemconfig ${gn}grid -dash $value } } default { error "Unknown option $option" } } } # Perform delayed actions if graph (and window) already exists if { [powListGraphs $gn] && [winfo exists .pow.pow] \ && [.pow.pow find withtag ${gn}box]!="" } { if { [info exists doAction(adornGraph)] } { powAdornGraph $gn .pow.pow } if { [info exists doAction(redrawGraphHandles)] } { powRedrawGraphHandles $gn } if { $gn == $currgn } { powUpdateGraphMenuOptions } } } proc powColorToHex { color } { #puts "powColorToHex start" global powCurveParam if { [string index $color 0]!="#" } { set idx [lsearch $powCurveParam(allColors,powDef) $color] if { $idx>-1 } { incr idx set color [lindex $powCurveParam(allColors,powDef) $idx] } } return $color } proc powToplevel {topwin refwin {options ""}} { #this implements what *should* be default behavior for X colormap handling. #Apparently the evil of Xlib colormap handling is contagious. #if we're running in the plugin or in single window mode, this creates #a frame instead of a toplevel. global powFrameForTop powbg powContainer #puts "powToplevel start" if {!$powFrameForTop} { #puts "powToplevel 1" #puts "refwin: $refwin" #puts "options: $options" catch { eval {toplevel $topwin -colormap $refwin \ -visual [list [winfo visual $refwin] [winfo depth $refwin]]} \ $options } err #puts "err: $err" focus $topwin } else { #in a tclet just use frames frame $topwin -bg $powbg if [info exists powContainer] { grid $topwin -sticky news -in $powContainer } else { grid $topwin -sticky news } } } proc powReditherImage {gn img {canvas .pow.pow} } { #This recalculates the colors/intensities in the base Photo image. #The call to powMagImage is necessary to make them appear. global powPseudoImages powImageParam #puts "powReditherImage start" #We could redither pseudocolors, but it isn't necessary if { ! $powPseudoImages } { powReditherPhotoBlock $img \ $powImageParam(RBmin${img},$gn) $powImageParam(RBmax${img},$gn) } if { [$canvas find withtag ${img}disp${gn}]!="" } { powMagImage $gn $img $canvas } } proc powReditherImages {gn img} { #puts "powReditherImages start" #This checks whether we need to redither both a color bar and an image #It also redithers the scope box if it is the current graph global powPseudoImages powPlotParam powImageParam currgn powGUI #We could redither pseudocolors, but it isn't necessary # if $powPseudoImages return # Redither this image powReditherImage $gn $img # Redither Scope if { $powGUI && $currgn == $gn && \ [.pow.scope find withtag ${img}disp${gn}scope]!="" } { powReditherImage ${gn}scope $img .pow.scope } # Redither original image or colorbar if other exists foreach {gn2 img2} [powGetColorbarLink $gn $img] {} if { $gn2 != "" } { powReditherImage $gn2 $img2 } } proc powCmapInvert { } { #puts "powCmapInvert start" global powPseudoImages curr_img if $powPseudoImages { $curr_img colormap invert } else { powPhotoColorTable invert } } proc powSetRanges { gn img min max } { #puts "powSetRanges start" global powGUI currgn powPlotParam powImageParam powSetRange $gn $img $min $max # Set Scope if { $powGUI && $currgn == $gn } { powSetRange ${gn}scope $img $min $max } # Set original image or colorbar if other exists foreach {gn2 img2} [powGetColorbarLink $gn $img] {} if { $gn2 != "" } { powSetRange $gn2 $img2 $min $max # Also need to update RB for undisplayed scope so must break modularity! if { $powGUI } { set powImageParam(RBmin${img2},${gn2}scope) $min set powImageParam(RBmax${img2},${gn2}scope) $max } } } proc powSetRange { gn img min max } { #puts "powSetRange start" global powPseudoImages powImageParam powGUI set powImageParam(RBmin${img},$gn) $min set powImageParam(RBmax${img},$gn) $max if {$powPseudoImages} { ${img}disp${gn} range $min $max } else { if { $powGUI && [regexp scope$ $gn] } { powReditherImage $gn $img .pow.scope } else { powReditherImage $gn $img .pow.pow } } } proc powSetColorTable { gn img } { #puts "powSetColorTable start" global powPseudoImages currimg currgn powImageParam powSetLut $gn $img $powImageParam(scale${img},$gn) if {$powPseudoImages} { ${img}disp${gn} colormap $powImageParam(colormap${img},$gn) } else { powPhotoColorTable $powImageParam(colormap${img},$gn) } invert_cmap_if_flag_set $gn $img } proc powGenerateReplotCascade { } { #puts "powGenerateReplotCascade start" global powPlotParam powOrderedGraphList set idx 0 .pow.mbar.edit.replot delete 0 end foreach gn $powOrderedGraphList { incr idx if { $gn=="" } continue if { [.pow.pow find withtag ${gn}box]=="" } { set state normal } else { set state disabled } set title $powPlotParam(titleString,$gn) if { $title=="" } { set title "Untitled $idx" } .pow.mbar.edit.replot add command -label $title \ -command "powMapGraph $gn" -state $state } } proc powGenerateUnmapCascade { } { #puts "powGenerateUnmapCascade start" global powPlotParam powOrderedGraphList set idx 0 .pow.mbar.edit.unmap delete 0 end foreach gn $powOrderedGraphList { incr idx if { $gn=="" } continue if { [.pow.pow find withtag ${gn}box]=="" } { set state disabled } else { set state normal } set title $powPlotParam(titleString,$gn) if { $title=="" } { set title "Untitled $idx" } .pow.mbar.edit.unmap add command -label $title \ -command "powUnmapGraph $gn" -state $state } } proc powGenerateMergeCascade { } { #puts "powGenerateMergeCascade start" global currgn powPlotParam powOrderedGraphList set idx 0 .pow.mbar.edit.merge delete 0 end foreach gn $powOrderedGraphList { incr idx if { $gn=="" } continue if { $gn==$currgn } { set state disabled } else { set state normal } set title $powPlotParam(titleString,$gn) if { $title=="" } { set title "Untitled $idx" } .pow.mbar.edit.merge add command -label $title \ -command "powMergeGraphs $gn" -state $state } } proc powProcessClick { x y binding} { #puts "powProcessClick start binding: $binding" global powClickCallback set gn [powWhereAmI [.pow.pow canvasx $x] [.pow.pow canvasy $y]] if {$gn != "NULL"} { # powSelectGraph $gn if [info exists powClickCallback] { set gcoords [powCanvasToGraph $gn [.pow.pow canvasx $x] [.pow.pow canvasy $y]] set rx [lindex $gcoords 0] set ry [lindex $gcoords 1] $powClickCallback $gn $rx $ry $binding } } #puts "powProcessClick end" } proc determineSearchPath { data } { global tcl_platform global env set searchPath "" set findFlag false set delimiter ":" if { $tcl_platform(platform)=="windows" } { return "$env(FITSVIEWER_LIBRARY)/../../gs6.52/bin;$env(FITSVIEWER_LIBRARY)/../../gs6.52/fonts" } set tokens [split $data "\n"] for {set i 0} {$i < [llength $tokens]} {incr i} { if { $findFlag == "true" } { if { [string first "For more" [lindex $tokens $i]] >= 0 } { break } set pathToken [split [lindex $tokens $i] $delimiter] foreach path $pathToken { set path [string trim $path] if { $path == "" } continue set lastpath $path set searchPath [format "%s%s%s" $searchPath $delimiter $path] } set searchPath [format "%s%s%s" $searchPath $delimiter [file dirname $lastpath]/fonts] break } if { [string first "Search path" [lindex $tokens $i]] >= 0 } { set findFlag true continue } } return $searchPath } proc powRescaleBox { } { global powbg curr_img currimg currgn powRBmin powRBmax powbg powDWP global powImageParam powHisto if { [winfo exists ${powDWP}powRB] } { destroy ${powDWP}powRB } if {![info exists curr_img]} { error "You must first select an image" return } powToplevel ${powDWP}powRB .pow "-bg $powbg -class \"POW Rescale\"" bind ${powDWP}powRB <> "destroy ${powDWP}" bind ${powDWP}powRB "+powUpdateHisto ?" bind ${powDWP}powRB "+powUpdateHisto ?" label ${powDWP}powRB.min -text "Image min: $powRBmin($currimg)" -bg $powbg label ${powDWP}powRB.max -text "Image max: $powRBmax($currimg)" -bg $powbg label ${powDWP}powRB.cmin -text "Current min:" -bg $powbg entry ${powDWP}powRB.ecmin -relief sunken -bg $powbg \ -textvariable powImageParam(RBmin${currimg},$currgn) -bd 1 label ${powDWP}powRB.cmax -text "Current max:" -bg $powbg entry ${powDWP}powRB.ecmax -relief sunken -bg $powbg \ -textvariable powImageParam(RBmax${currimg},$currgn) -bd 1 frame ${powDWP}powRB.buttonFrame -bg $powbg button ${powDWP}powRB.apply -text Apply -command { powUpdateHisto 0 # powSetRanges $currgn $currimg powCmds::colormap scale $powImageParam(scale${currimg},$currgn) \ $powImageParam(RBmin${currimg},$currgn) \ $powImageParam(RBmax${currimg},$currgn) foreach {gn2 img2} [powGetColorbarLink $currgn $currimg] {} if { $gn2 != "" || $img2 != "" } { powDeleteImage $gn2 $img2 powColorbar } } -bg $powbg button ${powDWP}powRB.reset -text Reset -command { # powSetRanges $currgn $currimg powCmds::colormap scale $powImageParam(scale${currimg},$currgn) \ $powRBmin($currimg) $powRBmax($currimg) powUpdateHisto ? foreach {gn2 img2} [powGetColorbarLink $currgn $currimg] {} if { $gn2 != "" || $img2 != "" } { powDeleteImage $gn2 $img2 powColorbar } } -bg $powbg button ${powDWP}powRB.exit -text Exit -command {destroy ${powDWP}powRB} \ -bg $powbg grid configure ${powDWP}powRB.min -row 0 -column 0 -columnspan 2 -sticky w grid configure ${powDWP}powRB.max -row 0 -column 2 -columnspan 2 -sticky w grid configure ${powDWP}powRB.cmin -row 1 -column 0 -sticky w grid configure ${powDWP}powRB.ecmin -row 1 -column 1 -sticky w grid configure ${powDWP}powRB.cmax -row 1 -column 2 -sticky w grid configure ${powDWP}powRB.ecmax -row 1 -column 3 -sticky w grid configure ${powDWP}powRB.buttonFrame -row 4 -column 0 -columnspan 4 -sticky ew grid configure ${powDWP}powRB.apply -row 0 -column 0 -in ${powDWP}powRB.buttonFrame -sticky w grid configure ${powDWP}powRB.reset -row 0 -column 1 -in ${powDWP}powRB.buttonFrame grid configure ${powDWP}powRB.exit -row 0 -column 2 -in ${powDWP}powRB.buttonFrame -sticky e frame ${powDWP}powRB.histo -bg $powbg grid ${powDWP}powRB.histo -row 2 -column 0 -columnspan 4 \ -padx 3 -pady 5 -sticky news canvas ${powDWP}powRB.histo.grph -relief sunken -width 256 -height 150 \ -bg $powbg -bd 3 grid ${powDWP}powRB.histo.grph -row 1 -column 2 -rowspan 3 powBindBtn <> "bind ${powDWP}powRB.histo.grph " \ { powDragHistoBounds b1 %x; powDragHistoBounds b2 %x } \ { powDragHistoBounds b1 %x } \ { powUpdateHisto ? } frame ${powDWP}powRB.histo.scale -bg $powbg grid ${powDWP}powRB.histo.scale -row 1 -column 0 -rowspan 3 radiobutton ${powDWP}powRB.histo.scale.linear \ -text "Linear" -bg $powbg -variable powHisto(scale) \ -value linear -highlightthickness 0 -command { set powHisto(scale) linear ; powUpdateHisto 1 } radiobutton ${powDWP}powRB.histo.scale.logY \ -text "LogY" -bg $powbg -variable powHisto(scale) \ -value log -highlightthickness 0 -command { set powHisto(scale) log; powUpdateHisto 1 } grid ${powDWP}powRB.histo.scale.linear -row 0 -column 0 -sticky nsw grid ${powDWP}powRB.histo.scale.logY -row 2 -column 0 -sticky nsw canvas ${powDWP}powRB.histo.scale.list -width 50 -height 150 \ -bg $powbg -bd 0 -highlightthickness 0 grid ${powDWP}powRB.histo.scale.list -row 0 -column 1 -rowspan 3 -sticky ns canvas ${powDWP}powRB.histo.bnds -relief flat -width 266 -height 6 \ -bg $powbg -bd 0 -highlightthickness 0 grid ${powDWP}powRB.histo.bnds -row 0 -column 2 frame ${powDWP}powRB.histo.histbutt -bg $powbg grid ${powDWP}powRB.histo.histbutt -row 4 -column 2 radiobutton ${powDWP}powRB.histo.histbutt.fullrange \ -text "Full Range" -bg $powbg -variable powHisto(range) \ -value full -highlightthickness 0 -command { after idle { powUpdateHisto 1 } } radiobutton ${powDWP}powRB.histo.histbutt.currrange \ -text "Current Range" -bg $powbg -variable powHisto(range) \ -value curr -highlightthickness 0 -command { after idle { powUpdateHisto 1 } } grid ${powDWP}powRB.histo.histbutt.fullrange -row 1 -column 1 grid ${powDWP}powRB.histo.histbutt.currrange -row 1 -column 2 set powHisto(image) $currimg set powHisto(graph) $currgn set powHisto(min) $powRBmin($currimg) set powHisto(max) $powRBmax($currimg) set powHisto(range) full set powHisto(scale) linear powUpdateHisto 1 } proc powUpdateHisto { new {scale linear} } { #puts "powUpdateHisto start" global powDWP powRBmin powRBmax global powImageParam powHisto if { ![winfo exists ${powDWP}powRB] } { return } set img $powHisto(image) set gn $powHisto(graph) if { $new=="?" } { if { $powHisto(range)!="full" } { set new 1 } else { set new 0 } } if { $new } { if { $powHisto(range)=="full" } { set powHisto(min) $powRBmin($img) set powHisto(max) $powRBmax($img) } else { set powHisto(min) $powImageParam(RBmin${img},$gn) set powHisto(max) $powImageParam(RBmax${img},$gn) } } set min $powImageParam(RBmin${img},$gn) set max $powImageParam(RBmax${img},$gn) if { $min > $max } { set tmp $min set min $max set max $tmp set powImageParam(RBmin${img},$gn) $min set powImageParam(RBmax${img},$gn) $max } set scale [expr $powHisto(max) - $powHisto(min) ] if { $scale != 0.0 } { set scale [expr 255.0 / $scale] set minBounds [expr round($scale * ($min - $powHisto(min)))] set maxBounds [expr round($scale * ($max - $powHisto(min)))] } else { set minBounds 0 set maxBounds 255 } if { $new } { set powHisto(b1) $min set powHisto(b2) $max ${powDWP}powRB.histo.bnds delete all ${powDWP}powRB.histo.bnds create polygon \ [expr $minBounds+0] 0 \ [expr $minBounds+10] 0 \ [expr $minBounds+5] 5 \ -fill black -tags b1 ${powDWP}powRB.histo.bnds create polygon \ [expr $maxBounds+0] 0 \ [expr $maxBounds+10] 0 \ [expr $maxBounds+5] 5 \ -fill black -tags b2 powBindBtn "${powDWP}powRB.histo.bnds bind b1" \ { powDragHistoBounds b1 %x } \ { powDragHistoBounds b1 %x } \ { powUpdateHisto ? } powBindBtn "${powDWP}powRB.histo.bnds bind b2" \ { powDragHistoBounds b2 %x } \ { powDragHistoBounds b2 %x } \ { powUpdateHisto ? } ${powDWP}powRB.histo.bnds bind b1 \ { ${powDWP}powRB.histo.bnds itemconfig b1 -fill red } ${powDWP}powRB.histo.bnds bind b1 \ { ${powDWP}powRB.histo.bnds itemconfig b1 -fill black } ${powDWP}powRB.histo.bnds bind b2 \ { ${powDWP}powRB.histo.bnds itemconfig b2 -fill red } ${powDWP}powRB.histo.bnds bind b2 \ { ${powDWP}powRB.histo.bnds itemconfig b2 -fill black } } else { if { $powHisto(b1) < $powHisto(b2) } { set minTag b1 set maxTag b2 } else { set minTag b2 set maxTag b1 } set powHisto($minTag) $min set powHisto($maxTag) $max ${powDWP}powRB.histo.bnds coords $minTag \ [expr $minBounds+0] 0 \ [expr $minBounds+10] 0 \ [expr $minBounds+5] 5 ${powDWP}powRB.histo.bnds coords $maxTag \ [expr $maxBounds+0] 0 \ [expr $maxBounds+10] 0 \ [expr $maxBounds+5] 5 } if { $new } { ${powDWP}powRB.histo.scale.list delete scale_0_Text scale_0_Line \ scale_H_Text scale_H_line \ scale_T_Text scale_T_line set histo [powGetHisto $img $powHisto(min) $powHisto(max)] set pixmax 0 set pixmin 9999999999 foreach val [lrange $histo 1 254] { if { $val>$pixmax } { set pixmax $val } if { $val > 0 && $val < $pixmin } { set pixmin $val } } if { $pixmax==0 } { set pixmax 1 } ${powDWP}powRB.histo.grph delete all set i 4 set sList {} foreach val $histo { set scaledVal [expr $val * 149 / $pixmax] if { $powHisto(scale) == "log" } { if { $val > 0 } { set scaledVal [expr log10($val) * 149.0 / log10($pixmax)] } else { set scaledVal 0 } } lappend sList $scaledVal if { $scaledVal > 153 } { set scaledVal 153 } ${powDWP}powRB.histo.grph create line $i 153 $i [expr 153-$scaledVal] -fill blue incr i } ${powDWP}powRB.histo.scale.list create text 20 145 -fill red \ -text "0" -tag scale_0_Text ${powDWP}powRB.histo.scale.list create line 45 149 50 149 -fill red \ -tag scale_0_Line if { $powHisto(scale) == "log" } { ${powDWP}powRB.histo.scale.list create text 20 5 -fill red \ -text [format "%5.3f" [expr log10($pixmax)]] -tag scale_T_Text ${powDWP}powRB.histo.scale.list create text 20 75 -fill red \ -text [format "%5.3f" [expr log10($pixmax/2.0)]] -tag scale_H_Text } else { ${powDWP}powRB.histo.scale.list create text 20 5 -fill red \ -text $pixmax -tag scale_T_Text ${powDWP}powRB.histo.scale.list create text 20 75 -fill red \ -text [expr $pixmax/2] -tag scale_H_Text } ${powDWP}powRB.histo.scale.list create line 45 0 50 0 -fill red \ -tag scale_T_Line ${powDWP}powRB.histo.scale.list create line 45 75 50 75 -fill red \ -tag scale_H_Line } ${powDWP}powRB.histo.grph addtag blackLines enclosed \ 0 0 [expr $minBounds+3.5] 160 ${powDWP}powRB.histo.grph addtag greyLines enclosed \ [expr $minBounds+3.5] 0 [expr $maxBounds+4.5] 160 ${powDWP}powRB.histo.grph addtag whiteLines enclosed \ [expr $maxBounds+4.5] 0 270 160 ${powDWP}powRB.histo.grph itemconfig blackLines -fill black ${powDWP}powRB.histo.grph itemconfig greyLines -fill blue ${powDWP}powRB.histo.grph itemconfig whiteLines -fill white ${powDWP}powRB.histo.grph dtag blackLines ${powDWP}powRB.histo.grph dtag greyLines ${powDWP}powRB.histo.grph dtag whiteLines } proc powDragHistoBounds { tag x } { #puts "powDragHistoBounds start" global powHisto powImageParam set img $powHisto(image) set gn $powHisto(graph) set scale [expr $powHisto(max) - $powHisto(min) ] if { $scale == 0.0 } { return } set scale [expr 255.0 / $scale] set val [expr ($x-5)/$scale + $powHisto(min)] set powHisto($tag) $val if { $powHisto(b1) < $powHisto(b2) } { set powImageParam(RBmin${img},$gn) $powHisto(b1) set powImageParam(RBmax${img},$gn) $powHisto(b2) } else { set powImageParam(RBmin${img},$gn) $powHisto(b2) set powImageParam(RBmax${img},$gn) $powHisto(b1) } powUpdateHisto 0 } proc powSetMagstepBox { } { #puts "powSetMagstepBox start" global powPlotParam currgn powbg powDWP global powXMagstep powYMagstep powSaveXMagstep powSaveYMagstep if { $currgn=="powDef" } { error "You must first select a graph" return } if { [winfo exists ${powDWP}magstep] } { raise ${powDWP}magstep return } powToplevel ${powDWP}magstep .pow "-bg $powbg -class \"POW Magstep\"" bind ${powDWP}magstep <> "destroy ${powDWP}" set powXMagstep $powPlotParam(xmagstep,$currgn) set powYMagstep $powPlotParam(ymagstep,$currgn) set powSaveXMagstep $powXMagstep set powSaveYMagstep $powYMagstep label ${powDWP}magstep.label -text "Current magstep:" -bg $powbg label ${powDWP}magstep.xlabel -text "X " -bg $powbg label ${powDWP}magstep.ylabel -text "Y " -bg $powbg entry ${powDWP}magstep.xmagstep -textvariable powXMagstep \ -relief sunken -bg $powbg -bd 1 entry ${powDWP}magstep.ymagstep -textvariable powYMagstep \ -relief sunken -bg $powbg -bd 1 frame ${powDWP}magstep.buttonFrame -bg $powbg button ${powDWP}magstep.apply -text Apply -command \ {powMagGraph $currgn $powXMagstep $powYMagstep; \ set powXMagstep $powPlotParam(xmagstep,$currgn); \ set powYMagstep $powPlotParam(ymagstep,$currgn)} -bg $powbg button ${powDWP}magstep.reset -text Reset -command \ {set powXMagstep $powSaveXMagstep; \ set powYMagstep $powSaveYMagstep; \ powMagGraph $currgn $powXMagstep $powYMagstep} -bg $powbg button ${powDWP}magstep.exit -text Exit -command {destroy ${powDWP}magstep} -bg $powbg grid configure ${powDWP}magstep.label -row 0 -column 0 -sticky w grid configure ${powDWP}magstep.xlabel -row 0 -column 1 grid configure ${powDWP}magstep.ylabel -row 1 -column 1 grid configure ${powDWP}magstep.xmagstep -row 0 -column 2 -sticky w grid configure ${powDWP}magstep.ymagstep -row 1 -column 2 -sticky w grid configure ${powDWP}magstep.buttonFrame -row 2 -column 0 -columnspan 3 -sticky ew grid configure ${powDWP}magstep.apply -row 0 -column 0 -in ${powDWP}magstep.buttonFrame -sticky w grid configure ${powDWP}magstep.reset -row 0 -column 1 -in ${powDWP}magstep.buttonFrame grid configure ${powDWP}magstep.exit -row 0 -column 2 -in ${powDWP}magstep.buttonFrame -sticky e } proc powSetGraphSize { } { #puts "powSetGraphSize start" global powPlotParam currgn powbg powFrameForTop global powXDim powYDim powSaveXDim powSaveYDim powDWP g_titleFont if { $currgn=="powDef" } { error "You must first select a graph" return } if { [winfo exists ${powDWP}dim] } { raise ${powDWP}dim return } powToplevel ${powDWP}dim .pow "-bg $powbg -class \"POW Dim\"" bind ${powDWP}dim <> "destroy ${powDWP}" if {!$powFrameForTop} { wm title ${powDWP}dim "Set Graph Dimensions" } set powXDim [tagXdim .pow.pow ${currgn}box] set powYDim [tagYdim .pow.pow ${currgn}box] set powSaveXDim $powXDim set powSaveYDim $powYDim label ${powDWP}dim.label -text "Current Dim:" -bg $powbg -font g_titleFont label ${powDWP}dim.xlabel -text "X " -bg $powbg -font g_titleFont label ${powDWP}dim.ylabel -text "Y " -bg $powbg -font g_titleFont entry ${powDWP}dim.xDim -textvariable powXDim \ -relief sunken -bg $powbg -width 10 -font g_titleFont -bd 1 entry ${powDWP}dim.yDim -textvariable powYDim \ -relief sunken -bg $powbg -width 10 -font g_titleFont -bd 1 frame ${powDWP}dim.buttonFrame -bg $powbg button ${powDWP}dim.apply -text Apply -command \ {powStretchGraphToSize $currgn $powXDim $powYDim} -bg $powbg -font g_titleFont button ${powDWP}dim.reset -text Reset -command \ {set powXDim $powSaveXDim; \ set powYDim $powSaveYDim; \ powStretchGraphToSize $currgn $powXDim $powYDim} -bg $powbg -font g_titleFont button ${powDWP}dim.exit -text Exit -command {destroy ${powDWP}dim} -bg $powbg -font g_titleFont grid configure ${powDWP}dim.label -row 0 -column 0 -sticky w grid configure ${powDWP}dim.xlabel -row 0 -column 1 grid configure ${powDWP}dim.ylabel -row 1 -column 1 grid configure ${powDWP}dim.xDim -row 0 -column 2 -sticky w grid configure ${powDWP}dim.yDim -row 1 -column 2 -sticky w grid configure ${powDWP}dim.buttonFrame -row 2 -column 0 -columnspan 3 -sticky ew grid configure ${powDWP}dim.apply -row 0 -column 0 -in ${powDWP}dim.buttonFrame -sticky w grid configure ${powDWP}dim.reset -row 0 -column 1 -in ${powDWP}dim.buttonFrame grid configure ${powDWP}dim.exit -row 0 -column 2 -in ${powDWP}dim.buttonFrame -sticky e } proc powSave { {inputFile {}} } { global powSelectDirectory global powGraphSelection global powbg powOutputFileName global powStretch powOutputPaperSize global powConvertFormat powConvertFunction global powHandles powDWP g_titleFont global powPaperDefXsizeInch powPaperDefYsizeInch global powPaperDefXsizePixel powPaperDefYsizePixel global powOutputPaperXsizeInch powOutputPaperYsizeInch global powOutputPaperXsizePixel powOutputPaperYsizePixel global powPlacement powPostOrient global powPaperSizeSelected powPixelToInchRatio global ghostScript global powOutputFileType global tcl_platform global searchPath global tcl_platform set fileNameList {} if { [llength $inputFile] == 0 } { set fileNameList [powAssemblePSfile] } else { lappend fileNameList $inputFile } if ![info exists powOutputFileName] { powSelectConvertFormat "postscript - Postscript Files" } set idx 0 foreach fileName $fileNameList { # Save to any graph format set outputName $powOutputFileName if { [llength $fileNameList] > 1 } { set token [split $powOutputFileName "."] set outputName [format "%s_%s.%s" [lindex $token 0] $idx [lindex $powOutputFileType 2]] } set realDirectory $powSelectDirectory if { $tcl_platform(platform) == "windows" } { set powSelectDirectory [string trim $powSelectDirectory "{}/"] set realDirectory [_changeWinDirectoryToUnixFormat $powSelectDirectory] } if { [lindex $powOutputFileType 2] != "ps" } { set errorFlag [ catch { exec $ghostScript -sDEVICE=[lindex $powOutputFileType 1] \ -dNOPAUSE -dBATCH -dQUIET \ -sPAPERSIZE=[string tolower $powPaperSizeSelected] \ -I$searchPath \ -sOutputFile=$realDirectory/$outputName $fileName } err ] #puts "err: <$err>" } else { set errorFlag [ catch { file copy -force $fileName $realDirectory/$outputName } err ] } incr idx if { $idx >= [llength $fileNameList] } { # tk_messageBox -icon info -parent .pow -type ok -message "Successful save graphs to $powSelectDirectory." } } } proc powSaveAs {} { global powDWP powbg global g_titleFont global powConvertFunction powOutputFileName global powOutputFileType powSelectDirectory global currentPreviewGraph global powGraphCoordList powGraphSelection if [winfo exists ${powDWP}saveAsSetup] { wm deiconify ${powDWP}saveAsSetup ${powDWP}saveAsSetup.directory.saveInEntry delete 0 end if { [${powDWP}print.option.direntry get] != "" } { ${powDWP}saveAsSetup.directory.saveInEntry insert end [${powDWP}print.option.direntry get] } else { ${powDWP}saveAsSetup.directory.saveInEntry insert end [pwd] } ${powDWP}saveAsSetup.file.fileNameEntry delete 0 end ${powDWP}saveAsSetup.file.fileNameEntry insert end $powOutputFileName set token [split $powOutputFileName "."] set powOutputFileType {postscript pswrite ps "Postscript Files"} foreach cvf $powConvertFunction { if { [lindex $cvf 2] == [lindex $token 1] } { set powOutputFileType $cvf tixSetSilent ${powDWP}saveAsSetup.file.convertType "[lindex $cvf 0] - [lindex $cvf 3]" break } } [${powDWP}saveAsSetup.directory.directoryTree subwidget hlist] delete all destroy ${powDWP}saveAsSetup.directory.directoryTree tixDirTree ${powDWP}saveAsSetup.directory.directoryTree \ -value [${powDWP}saveAsSetup.directory.saveInEntry get] \ -browsecmd {powSelectDir} -command {powSelectDir} \ -options { \ hlist.foreground black \ hlist.background white \ hlist.font g_titleFont \ hlist.width 40 \ } grid ${powDWP}saveAsSetup.directory.directoryTree -row 3 -column 0 -columnspan 5 -rowspan 10 -sticky news return } powToplevel ${powDWP}saveAsSetup .pow "-bg $powbg -class \"POW Print\"" bind ${powDWP}saveAsSetup <> "destroy ${powDWP}" wm title ${powDWP}saveAsSetup "Save POW Image/Plot As" grid rowconfigure ${powDWP}saveAsSetup 2 -weight 1 grid columnconfigure ${powDWP}saveAsSetup 0 -weight 1 grid columnconfigure ${powDWP}saveAsSetup 1 -weight 1 frame ${powDWP}saveAsSetup.directory -bg $powbg -bd 2 -relief ridge label ${powDWP}saveAsSetup.directory.dirLabel -text "Directory: " -bg $powbg -font g_titleFont entry ${powDWP}saveAsSetup.directory.saveInEntry -width 35 -bg white -font g_titleFont ${powDWP}saveAsSetup.directory.saveInEntry delete 0 end if { [${powDWP}print.option.direntry get] != "" } { ${powDWP}saveAsSetup.directory.saveInEntry insert end [${powDWP}print.option.direntry get] set directoryValue [${powDWP}print.option.direntry get] } else { ${powDWP}saveAsSetup.directory.saveInEntry insert end [pwd] set directoryValue [pwd] } tixDirTree ${powDWP}saveAsSetup.directory.directoryTree -value $directoryValue \ -browsecmd {powSelectDir} -command {powSelectDir} \ -options { \ hlist.foreground black \ hlist.background white \ hlist.font g_titleFont \ hlist.width 40 \ } set powSelectDirectory $directoryValue grid ${powDWP}saveAsSetup.directory -row 2 -column 0 -sticky news -columnspan 5 -rowspan 10 grid ${powDWP}saveAsSetup.directory.dirLabel -row 2 -column 0 -sticky nw grid ${powDWP}saveAsSetup.directory.saveInEntry -row 2 -column 1 -sticky new grid ${powDWP}saveAsSetup.directory.directoryTree -row 3 -column 0 -columnspan 5 -rowspan 10 -sticky news grid columnconfigure ${powDWP}saveAsSetup.directory 1 -weight 1 grid rowconfigure ${powDWP}saveAsSetup.directory 3 -weight 1 bind ${powDWP}saveAsSetup.directory.saveInEntry { [${powDWP}saveAsSetup.directory.directoryTree subwidget hlist] delete all destroy ${powDWP}saveAsSetup.directory.directoryTree tixDirTree ${powDWP}saveAsSetup.directory.directoryTree \ -value [${powDWP}saveAsSetup.directory.saveInEntry get] \ -browsecmd {powSelectDir} -command {powSelectDir} \ -options { \ hlist.foreground black \ hlist.background white \ hlist.font g_titleFont \ hlist.width 40 \ } grid ${powDWP}saveAsSetup.directory.directoryTree -row 3 -column 0 -columnspan 5 -rowspan 10 -sticky news } frame ${powDWP}saveAsSetup.file -bg $powbg label ${powDWP}saveAsSetup.file.fileNameLbl -text "File name:" -bg $powbg -font g_titleFont entry ${powDWP}saveAsSetup.file.fileNameEntry -width 35 -bg white -font g_titleFont tixComboBox ${powDWP}saveAsSetup.file.convertType -editable true \ -label "Save as type:" \ -options { \ listbox.height 4 \ label.font g_titleFont \ listbox.font g_titleFont \ entry.font g_titleFont \ entry.background white \ entry.width 30 \ entry.ipady 5 \ } \ -command powSelectConvertFormat foreach functionList $powConvertFunction { set formatStr [format "%s - %s" [lindex $functionList 0] [lindex $functionList 3]] ${powDWP}saveAsSetup.file.convertType insert end $formatStr } ${powDWP}saveAsSetup.file.fileNameEntry insert end $powOutputFileName set token [split $powOutputFileName "."] set powOutputFileType {postscript pswrite ps "Postscript Files"} foreach cvf $powConvertFunction { if { [lindex $cvf 2] == [lindex $token 1] } { set powOutputFileType $cvf tixSetSilent ${powDWP}saveAsSetup.file.convertType "[lindex $cvf 0] - [lindex $cvf 3]" break } } grid ${powDWP}saveAsSetup.file -row 13 -column 0 -sticky news -columnspan 5 -rowspan 2 grid ${powDWP}saveAsSetup.file.fileNameLbl -row 0 -column 0 -sticky nw grid ${powDWP}saveAsSetup.file.fileNameEntry -row 0 -column 1 -sticky new grid ${powDWP}saveAsSetup.file.convertType -row 1 -column 0 -sticky nw -columnspan 5 grid columnconfigure ${powDWP}saveAsSetup.file 1 -weight 1 frame ${powDWP}saveAsSetup.action -bg $powbg button ${powDWP}saveAsSetup.action.ok -text "OK" -bg $powbg -font g_titleFont \ -command { \ if ![info exists currentPreviewGraph] { \ set currentPreviewGraph "" ; \ if { $powGraphSelection == "one" } { \ foreach fileCoordList $powGraphCoordList { \ if { [lindex $fileCoordList 5] == $currgn } { \ set currentPreviewGraph [lindex $fileCoordList 0] ; \ break ; \ } ; \ } ; \ } ; \ } ; \ set powOutputFileName [${powDWP}saveAsSetup.file.fileNameEntry get] ; \ set powSelectDirectory [${powDWP}saveAsSetup.directory.saveInEntry get] ; \ ${powDWP}print.option.direntry delete 0 end ; \ ${powDWP}print.option.direntry insert 0 $powSelectDirectory ; \ ${powDWP}print.option.fileentry delete 0 end ; \ ${powDWP}print.option.fileentry insert 0 $powOutputFileName ; \ wm deiconify ${powDWP}print ; \ wm withdraw ${powDWP}saveAsSetup } label ${powDWP}saveAsSetup.action.blanklabel -text " " -bg $powbg -font g_titleFont button ${powDWP}saveAsSetup.action.cancel -text "Cancel" -bg $powbg -font g_titleFont \ -command { wm deiconify ${powDWP}print ; \ wm withdraw ${powDWP}saveAsSetup } grid ${powDWP}saveAsSetup.action -row 18 -column 0 -columnspan 6 -sticky news grid ${powDWP}saveAsSetup.action.ok -row 0 -column 1 -sticky w grid ${powDWP}saveAsSetup.action.blanklabel -row 0 -column 2 -columnspan 2 -sticky news grid ${powDWP}saveAsSetup.action.cancel -row 0 -column 4 -sticky e } proc powSelectConvertFormat { item } { global powOutputFileType powDWP global powOutputFileName powConvertFunction regsub -all " " $item "" result set token [split $result "-"] if { ![winfo exists ${powDWP}saveAsSetup.file.fileNameEntry] && \ ![winfo exists ${powDWP}print.option.fileentry] } { set fileName "powGraph" } else { if { [winfo exists ${powDWP}print.option.fileentry] && [winfo ismapped ${powDWP}print.option.fileentry] } { set fileName [lindex [split [${powDWP}print.option.fileentry get] "."] 0] } if { [winfo exists ${powDWP}saveAsSetup.file.fileNameEntry] && [winfo ismapped ${powDWP}saveAsSetup.file.fileNameEntry] } { set fileName [lindex [split [${powDWP}saveAsSetup.file.fileNameEntry get] "."] 0] } } foreach functionList $powConvertFunction { if { [lindex $token 0] == [lindex $functionList 0] } { set powOutputFileType $functionList set powOutputFileName [format "%s.%s" $fileName [lindex $functionList 2]] break } } if [winfo exists ${powDWP}saveAsSetup.file.fileNameEntry] { ${powDWP}saveAsSetup.file.fileNameEntry delete 0 end ${powDWP}saveAsSetup.file.fileNameEntry insert end $powOutputFileName } if [winfo exists ${powDWP}print.option.fileentry] { ${powDWP}print.option.fileentry delete 0 end ${powDWP}print.option.fileentry insert end $powOutputFileName } } proc powSetupPage {} { global powDWP powbg global powOutputPaperSize g_titleFont powStretch global powPaperSizeSelected powHandles powPostOrient powPlacement global old_powPaperSizeSelected old_powPostOrient old_powPlacement global powGraphSelection if [winfo exists ${powDWP}printPageSetup] { destroy ${powDWP}printPageSetup } powToplevel ${powDWP}printPageSetup .pow "-bg $powbg -class \"POW Print\"" bind ${powDWP}printPageSetup <> "destroy ${powDWP}" wm title ${powDWP}printPageSetup "Page Setup" tixComboBox ${powDWP}printPageSetup.papersize -editable true \ -label "Paper Size:" \ -options { \ listbox.height 4 \ label.font g_titleFont \ listbox.font g_titleFont \ entry.font g_titleFont \ entry.background white \ entry.ipady 5 \ } \ -command powPaperSizeSelection foreach [list name xSizeInch ySizeInch xSizePixel ySizePixel xPt yPt ] $powOutputPaperSize { ${powDWP}printPageSetup.papersize insert end $name } set old_powPaperSizeSelected Letter if [info exists powPaperSizeSelected] { set old_powPaperSizeSelected $powPaperSizeSelected tixSetSilent ${powDWP}printPageSetup.papersize $powPaperSizeSelected } else { tixSetSilent ${powDWP}printPageSetup.papersize Letter set powPaperSizeSelected Letter } grid ${powDWP}printPageSetup.papersize -row 1 -column 0 -sticky w -columnspan 6 image create bitmap landscapeIcon -data { #define landscape_width 41 #define landscape_height 36 static char landscape_bits[] = { 0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00, 0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfe, 0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfe,0xf0,0xff,0xff, 0x1f,0x00,0xfe,0x10,0x00,0x00,0x30,0x00,0xfe,0x10,0x00,0x00,0x50,0x00,0xfe, 0x10,0x00,0x06,0x90,0x00,0xfe,0x10,0x00,0x06,0x10,0x01,0xfe,0x10,0x00,0x0f, 0x10,0x02,0xfe,0x10,0x00,0x0f,0xf0,0x07,0xfe,0x10,0x80,0x1d,0x00,0x0c,0xfe, 0x10,0x80,0x1c,0x00,0x04,0xfe,0x10,0xc0,0x3c,0x00,0x0c,0xfe,0x10,0x40,0x38, 0x00,0x04,0xfe,0x10,0x60,0x78,0x00,0x0c,0xfe,0x10,0x20,0x70,0x00,0x04,0xfe, 0x10,0xf0,0xff,0x00,0x0c,0xfe,0x10,0x10,0xe0,0x00,0x04,0xfe,0x10,0x18,0xe0, 0x01,0x0c,0xfe,0x10,0x08,0xc0,0x01,0x04,0xfe,0x10,0x0c,0xc0,0x03,0x0c,0xfe, 0x10,0x3f,0xf0,0x0f,0x04,0xfe,0x10,0x00,0x00,0x00,0x0c,0xfe,0x10,0x00,0x00, 0x00,0x04,0xfe,0x10,0x00,0x00,0x00,0x0c,0xfe,0x10,0x00,0x00,0x00,0x04,0xfe, 0xf0,0xff,0xff,0xff,0x0f,0xfe,0x50,0x55,0x55,0x55,0x05,0xfe,0x00,0x00,0x00, 0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfe, 0x00,0x00,0x00,0x00,0x00,0xfe}; } image create bitmap portraitIcon -data { #define portrait_width 40 #define portrait_height 37 static char portrait_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0x03,0x00,0x80,0x00,0x00,0x06,0x00, 0x80,0x00,0x00,0x0a,0x00,0x80,0x00,0x00,0x12,0x00,0x80,0x00,0x00,0x22,0x00, 0x80,0x00,0x00,0x42,0x00,0x80,0x00,0x00,0xfe,0x00,0x80,0x00,0x18,0x80,0x01, 0x80,0x00,0x18,0x80,0x00,0x80,0x00,0x3c,0x80,0x01,0x80,0x00,0x3c,0x80,0x00, 0x80,0x00,0x76,0x80,0x01,0x80,0x00,0x72,0x80,0x00,0x80,0x00,0xf3,0x80,0x01, 0x80,0x00,0xe1,0x80,0x00,0x80,0x80,0xe1,0x81,0x01,0x80,0x80,0xc0,0x81,0x00, 0x80,0xc0,0xff,0x83,0x01,0x80,0x40,0x80,0x83,0x00,0x80,0x60,0x80,0x87,0x01, 0x80,0x20,0x00,0x87,0x00,0x80,0x30,0x00,0x8f,0x01,0x80,0xfc,0xe0,0xbf,0x00, 0x80,0x00,0x00,0x80,0x01,0x80,0x00,0x00,0x80,0x00,0x80,0x00,0x00,0x80,0x01, 0x80,0x00,0x00,0x80,0x00,0x80,0x00,0x00,0x80,0x01,0x80,0x00,0x00,0x80,0x00, 0x80,0x00,0x00,0x80,0x01,0x80,0xff,0xff,0xff,0x00,0x00,0x55,0x55,0x55,0x01, 0x00,0x00,0x00,0x00,0x00}; } frame ${powDWP}printPageSetup.orientation -bg $powbg -bd 2 label ${powDWP}printPageSetup.orientationframelabel -text Orientation -bg $powbg -font g_titleFont label ${powDWP}printPageSetup.orientation.blanklabel -text " " -bg $powbg -font g_titleFont label ${powDWP}printPageSetup.orientation.blankcolumn -text " " -bg $powbg -font g_titleFont label ${powDWP}printPageSetup.orientation.iconlabel -image portraitIcon label ${powDWP}printPageSetup.orientation.blanklbl2 -text " " -bg $powbg -font g_titleFont label ${powDWP}printPageSetup.orientation.blanklbl1 -text " " -bg $powbg -font g_titleFont radiobutton ${powDWP}printPageSetup.orientation.portrait -text Portrait -value 0 \ -variable powPostOrient -font g_titleFont \ -command { \ ${powDWP}printPageSetup.orientation.iconlabel configure -image portraitIcon ; \ } radiobutton ${powDWP}printPageSetup.orientation.landscape -text Landscape -value 1 \ -variable powPostOrient -font g_titleFont \ -command { \ ${powDWP}printPageSetup.orientation.iconlabel configure -image landscapeIcon ; \ } grid ${powDWP}printPageSetup.orientation.blanklbl1 -row 1 -column 0 -sticky sw grid ${powDWP}printPageSetup.orientation -row 2 -column 0 -columnspan 2 -sticky news -rowspan 4 grid ${powDWP}printPageSetup.orientationframelabel -row 2 -column 0 -sticky nw grid ${powDWP}printPageSetup.orientation.iconlabel -row 2 -column 0 -sticky news -rowspan 2 grid ${powDWP}printPageSetup.orientation.blankcolumn -row 2 -column 1 -sticky news -rowspan 2 grid ${powDWP}printPageSetup.orientation.portrait -row 2 -column 2 -sticky w -columnspan 2 grid ${powDWP}printPageSetup.orientation.landscape -row 3 -column 2 -sticky w -columnspan 2 grid ${powDWP}printPageSetup.orientation.blanklbl2 -row 4 -column 0 -sticky sw set old_powPostOrient 0 if [info exists powPostOrient] { if { $powPostOrient == "" } { set powPostOrient 0 } else { set old_powPostOrient $powPostOrient } } else { ${powDWP}printPageSetup.orientation.portrait select } frame ${powDWP}printPageSetup.placement -bg $powbg -bd 2 label ${powDWP}printPageSetup.placementlabel -text "Placement" -bg $powbg -font g_titleFont label ${powDWP}printPageSetup.placement.blanklabel -text " " -bg $powbg -font g_titleFont radiobutton ${powDWP}printPageSetup.placement.placementFOOP -text "Fit on one page" \ -value "FOOP" -variable powPlacement -font g_titleFont radiobutton ${powDWP}printPageSetup.placement.placementBFMP -text "Best Fit on multiple pages" \ -value "BFMP" -variable powPlacement -font g_titleFont radiobutton ${powDWP}printPageSetup.placement.placementOGPP -text "One graph per page" \ -value "OGPP" -variable powPlacement -font g_titleFont grid ${powDWP}printPageSetup.placement -row 6 -column 0 -columnspan 4 -sticky news \ -rowspan 6 grid ${powDWP}printPageSetup.placementlabel -row 6 -column 0 -sticky nw grid ${powDWP}printPageSetup.placement.blanklabel -row 1 -column 0 -sticky nw grid ${powDWP}printPageSetup.placement.placementFOOP -row 2 -column 0 -sticky nw grid ${powDWP}printPageSetup.placement.placementBFMP -row 3 -column 0 -sticky nw grid ${powDWP}printPageSetup.placement.placementOGPP -row 4 -column 0 -sticky nw set old_powPlacement "FOOP" if [info exists powPlacement] { if { $powPlacement == "" } { set powPlacement "FOOP" } else { set old_powPlacement $powPlacement } } else { ${powDWP}printPageSetup.placement.placementFOOP select } # set powGraphSelection all set pwoStretch "no" frame ${powDWP}printPageSetup.action -bg $powbg button ${powDWP}printPageSetup.action.ok -text "OK" -bg $powbg -font g_titleFont \ -command { \ if [winfo exists ${powDWP}printPreview] { \ powPrintPreview ; \ } else { \ set resp [tk_messageBox -icon info \ -type yesno \ -message "Would you like to preview images?" \ -title "Ask"] ; \ if { $resp=="yes" } { \ powPrintPreview \ } ; \ } ; \ destroy ${powDWP}printPageSetup } label ${powDWP}printPageSetup.action.blanklabel -text " " -bg $powbg -font g_titleFont button ${powDWP}printPageSetup.action.cancel -text "Cancel" -bg $powbg -font g_titleFont \ -command { \ set powPaperSizeSelected $old_powPaperSizeSelected ; \ set powPostOrient $old_powPostOrient ; \ set powPlacement $old_powPlacement ; \ destroy ${powDWP}printPageSetup } grid ${powDWP}printPageSetup.action -row 13 -column 0 -columnspan 6 -sticky news grid ${powDWP}printPageSetup.action.ok -row 0 -column 1 -sticky w grid ${powDWP}printPageSetup.action.blanklabel -row 0 -column 2 -columnspan 2 -sticky news grid ${powDWP}printPageSetup.action.cancel -row 0 -column 4 -sticky e } proc toggleFitToPageButton {} { global powDWP global currentPreviewState set currentPreviewState [${powDWP}printPreview.action.imageSize cget -text] if { $currentPreviewState == "Original Size" } { ${powDWP}printPreview.action.imageSize configure -text "Fit to Page" powFitToPage [${powDWP}printPreview.action.page.pageNumber get] no } else { ${powDWP}printPreview.action.imageSize configure -text "Original Size" powFitToPage [${powDWP}printPreview.action.page.pageNumber get] yes } } proc powPrintPreview {} { global powDWP powbg global ghostScript searchPath global previewNameList global g_titleFont global currentPreviewGraph global powPaperSizeSelected global powPaperSizeList global powOutputPaperSize global powStretch global powPostOrient global currentPreviewGraph global powGraphSelection global currentPreviewState if [winfo exists ${powDWP}printPreview] { destroy ${powDWP}printPreview } powShowHandles 0 powToplevel ${powDWP}printPreview .pow "-bg $powbg -class \"POW Print\"" bind ${powDWP}printPreview <> "destroy ${powDWP}" wm title ${powDWP}printPreview "Print Preview" wm geometry ${powDWP}printPreview +150+0 bind ${powDWP}printPreview { global previewNameList foreach nameList $previewNameList { catch { file delete -force [lindex $nameList 0] } catch { file delete -force [lindex $nameList 1] } } } frame ${powDWP}printPreview.action button ${powDWP}printPreview.action.imageSize -text "Fit to Page" -bg $powbg -font g_titleFont \ -command toggleFitToPageButton button ${powDWP}printPreview.action.print -text "Print" -bg $powbg -font g_titleFont \ -command { powPrintBox preview } button ${powDWP}printPreview.action.setup -text "Page Setup" -bg $powbg -font g_titleFont \ -command { powSetupPage } image create bitmap pointLeftIcon -data { #define pointLeft_width 24 #define pointLeft_height 20 static char pointLeft_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x0c,0x00,0x00,0x0a,0x00, 0x00,0x09,0x00,0x80,0xf8,0x0f,0x40,0x00,0x08,0x60,0x00,0x08,0x70,0x00,0x08, 0xf0,0x01,0x08,0xc0,0x02,0x08,0xc0,0xff,0x0f,0x00,0x5b,0x05,0x00,0x0f,0x00, 0x00,0x0c,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; } image create bitmap pointRightIcon -data { #define pointRight_width 24 #define pointRight_height 20 static char pointRight_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x30,0x00,0x00,0x50,0x00, 0x00,0x90,0x00,0xf0,0x1f,0x01,0x10,0x00,0x02,0x10,0x00,0x06,0x10,0x00,0x0e, 0x10,0x80,0x0f,0x10,0x40,0x03,0xf0,0xff,0x03,0xa0,0xda,0x00,0x00,0xf0,0x00, 0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; } frame ${powDWP}printPreview.action.page -bg $powbg button ${powDWP}printPreview.action.page.previous -image pointLeftIcon \ -command { \ ${powDWP}printPreview.action.page.next configure -state normal ; \ set idx [${powDWP}printPreview.action.page.pageNumber get] ; \ incr idx -1 ; \ if { $idx <= 1 } { \ set idx 1 ; \ ${powDWP}printPreview.action.page.previous configure -state disable ; \ } ; \ ${powDWP}printPreview.action.page.pageNumber delete 0 end ; \ ${powDWP}printPreview.action.page.pageNumber insert end $idx ; \ powShowPreviewGraph [expr $idx - 1] } label ${powDWP}printPreview.action.page.pageNumberLbl1 -text "Page: " -bg $powbg -font g_titleFont entry ${powDWP}printPreview.action.page.pageNumber -width 2 -bg white -font g_titleFont -fg blue label ${powDWP}printPreview.action.page.pageNumberLbl2 -text "" -bg $powbg -font g_titleFont button ${powDWP}printPreview.action.page.next -image pointRightIcon \ -command { \ ${powDWP}printPreview.action.page.previous configure -state normal ; \ set idx [${powDWP}printPreview.action.page.pageNumber get] ; \ incr idx ; \ if { $idx >= [llength $previewNameList] } { \ ${powDWP}printPreview.action.page.next configure -state disable ; \ set idx [llength $previewNameList] ; \ } ; \ ${powDWP}printPreview.action.page.pageNumber delete 0 end ; \ ${powDWP}printPreview.action.page.pageNumber insert end $idx ; \ powShowPreviewGraph [expr $idx - 1] } grid ${powDWP}printPreview.action.page.previous -row 0 -column 0 -sticky w grid ${powDWP}printPreview.action.page.pageNumberLbl1 -row 0 -column 1 -sticky w grid ${powDWP}printPreview.action.page.pageNumber -row 0 -column 2 -sticky w grid ${powDWP}printPreview.action.page.pageNumberLbl2 -row 0 -column 3 -sticky w grid ${powDWP}printPreview.action.page.next -row 0 -column 4 -sticky w button ${powDWP}printPreview.action.cancel -text "Close" -bg $powbg -font g_titleFont \ -command { set currentPreviewGraph "" ; \ set powStretch no ; \ destroy ${powDWP}printPreview } grid ${powDWP}printPreview.action -row 0 -column 0 -columnspan 20 -sticky news grid ${powDWP}printPreview.action.print -row 0 -column 0 -sticky w -padx 5 -columnspan 2 grid ${powDWP}printPreview.action.imageSize -row 0 -column 2 -sticky w -padx 5 -columnspan 2 grid ${powDWP}printPreview.action.setup -row 0 -column 6 -sticky w -padx 5 -columnspan 2 grid ${powDWP}printPreview.action.page -row 0 -column 8 -sticky ew -padx 5 -columnspan 5 grid ${powDWP}printPreview.action.cancel -row 0 -column 13 -sticky e -padx 5 -columnspan 2 canvas ${powDWP}printPreview.preview \ -xscrollcommand [list ${powDWP}printPreview.xscroll set] \ -yscrollcommand [list ${powDWP}printPreview.yscroll set] \ -background white \ -highlightthickness 0 \ -borderwidth 0 \ -scrollregion { 0 0 1024 768 } scrollbar ${powDWP}printPreview.xscroll -orient horizontal \ -command [list ${powDWP}printPreview.preview xview] scrollbar ${powDWP}printPreview.yscroll -orient vertical \ -command [list ${powDWP}printPreview.preview yview] grid ${powDWP}printPreview.preview -row 1 -column 0 -rowspan 10 -columnspan 15 -sticky news grid ${powDWP}printPreview.yscroll -row 1 -column 13 -rowspan 11 -sticky ns grid ${powDWP}printPreview.xscroll -row 11 -column 0 -sticky ew grid rowconfigure ${powDWP}printPreview 1 -weight 1 grid columnconfigure ${powDWP}printPreview 0 -weight 1 ${powDWP}printPreview.preview create text 225 100 \ -anchor center -tags deleteMe -text "Building graph... Please wait..." \ -font [list Helvetica 12 bold] -fill red ${powDWP}printPreview configure -cursor watch update idletask foreach [list name xIn yIn xPix yPix xPt yPt] $powOutputPaperSize { if { $powPaperSizeSelected == $name } { break } } set powPaperSizeList [list $name $xIn $yIn $xPix $yPix] set powGraphSelection "all" set fileNameList [powAssemblePSfile] set idx -1 set previewNameList {} #puts "paper size selected: $powPaperSizeSelected" foreach fileName $fileNameList { set previewName "[expr [pid] + $idx]preview.ppm" set errorFlag [ catch { exec $ghostScript -sDEVICE=ppmraw \ -dNOPAUSE -dBATCH -dQUIET \ -sPAPERSIZE=[string tolower $powPaperSizeSelected] \ -I$searchPath \ -sOutputFile=$::env(PSTMPDIR)/$previewName $fileName } result ] if { !$errorFlag } { lappend previewNameList [list $::env(PSTMPDIR)/$previewName $fileName] } incr idx } set currentPreviewGraph [lindex [lindex $previewNameList 0] 1] # show the first page, sequential pages will be toggle by GUI powShowPreviewGraph 0 ${powDWP}printPreview.action.page.pageNumber delete 0 end ${powDWP}printPreview.action.page.pageNumber insert end 1 ${powDWP}printPreview.action.page.previous configure -state disable ${powDWP}printPreview.action.page.pageNumberLbl2 configure -text "of [llength $previewNameList]" if { [llength $previewNameList] == 1 } { ${powDWP}printPreview.action.page.next configure -state disable } if [info exists currentPreviewState] { if { $currentPreviewState == "Original Size" } { ${powDWP}printPreview.action.imageSize configure -text "Fit to Page" powFitToPage 1 no } else { ${powDWP}printPreview.action.imageSize configure -text "Original Size" powFitToPage 1 yes } } ${powDWP}printPreview configure -cursor {} powShowHandles 1 } proc powFitToPage { page stretch } { global powStretch global previewNameList global powDWP global powGraphCoordList global powOutputPaperSize global currentPreviewGraph global powPaperSizeSelected global powPaperSizeList global ghostScript global searchPath global currentPreviewState global powOutputPaperXsizePoint powOutputPaperYsizePoint ${powDWP}printPreview.preview delete deleteMe ${powDWP}printPreview.preview create text 300 300 \ -anchor center -tags deleteMe -text "Rebuilding graph... Please wait..." \ -font [list Helvetica 12 bold] -fill red ${powDWP}printPreview configure -cursor watch update idletask powShowHandles 0 foreach nameList $previewNameList { catch { file delete -force [lindex $nameList 0] } catch { file delete -force [lindex $nameList 1] } } set powStretch $stretch set fileNameList [powAssemblePSfile] set idx -1 set previewNameList {} foreach fileName $fileNameList { set previewName "[expr [pid] + $idx]preview.ppm" set errorFlag [ catch { exec $ghostScript -sDEVICE=ppmraw \ -dNOPAUSE -dBATCH -dQUIET \ -dDEVICEWIDTHPOINTS=$powOutputPaperXsizePoint \ -dDEVICEHEIGHTPOINTS=$powOutputPaperYsizePoint \ -I$searchPath \ -sOutputFile=$::env(PSTMPDIR)/$previewName $fileName } result ] if { !$errorFlag } { lappend previewNameList [list $::env(PSTMPDIR)/$previewName $fileName] } incr idx } #puts "powFitToPage, previewNameList: $previewNameList" #puts "powFitToPage, page: $page" set currentPreviewGraph [lindex [lindex $previewNameList [expr $page - 1]] 1] # show the current page, sequential pages will be toggle by GUI powShowPreviewGraph [expr $page - 1] ${powDWP}printPreview.action.page.pageNumber delete 0 end ${powDWP}printPreview.action.page.pageNumber insert end $page if { $page <= 1 } { ${powDWP}printPreview.action.page.previous configure -state disable } ${powDWP}printPreview.action.page.pageNumberLbl2 configure -text "of [llength $previewNameList]" if { [llength $previewNameList] == 1 } { ${powDWP}printPreview.action.page.next configure -state disable } if { $stretch == "yes" } { set currentPreviewState "Fit to Page" ${powDWP}printPreview.action.imageSize configure -text "Original Size" } else { set currentPreviewState "Original Size" ${powDWP}printPreview.action.imageSize configure -text "Fit to Page" } ${powDWP}printPreview configure -cursor {} powShowHandles 1 } proc powShowPreviewGraph { page } { global previewNameList global powDWP global powGraphCoordList global currentPreviewGraph global powPaperSizeList global powPostOrient global powCurrentPreviewPage set powCurrentPreviewPage $page set param [lindex $powGraphCoordList $page] set fileName [lindex $param 0] set width [lindex $param 1] set height [lindex $param 2] set xCoord [lindex $param 3] set yCoord [lindex $param 4] set orgFileName [lindex $param 5] #puts "page: $page" #puts "previewNameList: $previewNameList" set currentPreviewGraph [lindex [lindex $previewNameList $page] 1] set errorFlag [ catch { set im [ image create photo -file [lindex [lindex $previewNameList $page] 0]] } err ] if { $errorFlag } { tk_messageBox -icon warning -type ok -message "Bummper!!!" return } set imWidth [image width $im] set displayWidth $imWidth #puts "imWidth: $imWidth" #puts "screenwidth: [winfo screenwidth .]" if { [expr [winfo screenwidth .] - 10 ] < $displayWidth } { set displayWidth [expr [winfo screenwidth .] - 10 ] } set imHeight [image height $im] set displayHeight $imHeight if { [expr [winfo screenheight .] - 60 ] < $displayHeight } { set displayHeight [expr [winfo screenheight .] - 60 ] } ${powDWP}printPreview.preview delete deleteMe ${powDWP}printPreview.preview create image 0 0 -image $im -anchor nw -tags deleteMe set regionList [list 0 0 $imWidth $imHeight] #grid ${powDWP}printPreview.yscroll -row 0 -column 12 -rowspan 10 -sticky ns #grid ${powDWP}printPreview.xscroll -row 10 -column 0 -columnspan 12 -sticky ew ${powDWP}printPreview.preview configure -scrollregion $regionList \ -width $displayWidth \ -height $displayHeight if { $imWidth == $displayWidth } { grid forget ${powDWP}printPreview.xscroll } if { $imHeight == $displayHeight } { grid forget ${powDWP}printPreview.yscroll } } proc powPaperSizeSelection { item } { global powPaperSizeSelected set powPaperSizeSelected $item } proc powSelectDir { dir } { global powSelectDirectory powDWP set powSelectDirectory $dir ${powDWP}saveAsSetup.directory.saveInEntry delete 0 end ${powDWP}saveAsSetup.directory.saveInEntry insert end $powSelectDirectory } proc powExtractGraph { {graph ""} } { global currgn powGraphSelection if ![info exists powGraphSelection] { set powGraphSelection "all" } if { $powGraphSelection == "all" } { set selection all } if { $graph == "" } { if { $powGraphSelection != "all" } { set selection $currgn } } else { set selection $graph } set bbox [.pow.pow bbox $selection] if { [llength $bbox] <= 0 } { return [list 0 0 0 0] } set width [expr [lindex $bbox 2]-[lindex $bbox 0]] set height [expr [lindex $bbox 3]-[lindex $bbox 1]] #puts " width : $width" #puts " height : $height" #puts " bbox : $bbox" #puts " xCoord : [lindex $bbox 0]" #puts " yCoord : [lindex $bbox 1]" return [list $width $height [lindex $bbox 0] [lindex $bbox 1]] } proc powSelectPaper { {orient 0} } { global powPaperSizeSelected powOutputPaperSize global powPaperDefXsizeInch powPaperDefYsizeInch global powPaperDefXsizePixel powPaperDefYsizePixel global powPaperDefXsizePoint powPaperDefYsizePoint global powOutputPaperXsizeInch powOutputPaperYsizeInch global powOutputPaperXsizePixel powOutputPaperYsizePixel global powOutputPaperXsizePoint powOutputPaperYsizePoint foreach [list name powPaperDefXsizeInch powPaperDefYsizeInch \ powPaperDefXsizePixel powPaperDefYsizePixel \ powPaperDefXsizePoint powPaperDefYsizePoint ] $powOutputPaperSize { if { $name == $powPaperSizeSelected } { set powOutputPaperXsizeInch $powPaperDefXsizeInch set powOutputPaperYsizeInch $powPaperDefYsizeInch set powOutputPaperXsizePixel $powPaperDefXsizePixel set powOutputPaperYsizePixel $powPaperDefYsizePixel set powOutputPaperXsizePoint $powPaperDefXsizePoint set powOutputPaperYsizePoint $powPaperDefYsizePoint break } } } proc powDetermineGraphDirection { dataList { directionOnly "no"} } { global powPaperDefXsizePixel powPaperDefYsizePixel global powStretch set direction "Y" set pfileName "none" set pwidth "none" set pheight "none" set pxCoord "none" set pyCoord "none" set porgFileName "none" foreach param $dataList { set fileName [lindex $param 0] set width [lindex $param 1] set height [lindex $param 2] set xCoord [lindex $param 3] set yCoord [lindex $param 4] set orgFileName [lindex $param 5] if { $pfileName == "none" } { set pfileName [lindex $param 0] set pwidth [lindex $param 1] set pheight [lindex $param 2] set pxCoord [lindex $param 3] set pyCoord [lindex $param 4] set porgFileName [lindex $param 5] } else { if { [expr $pxCoord + $pwidth] <= $xCoord } { set direction "X" } break } } if { $direction == "Y" } { set dataList [lsort -real -increasing -index 4 $dataList ] } #puts "direction: $direction" #puts "$dataList" if { $directionOnly == "yes" } { return $direction } set start_xCoord 0.0 set start_yCoord 0.0 # start breaking the graphList set resultList {} set idx 0 set subListFile "psTemp" set subListFormat "ps" # first ps file name set subListFileName [format "%s/%s_%s.%s" $::env(PSTMPDIR) $subListFile $idx $subListFormat] set resultSubList {} foreach param $dataList { set fileName [lindex $param 0] set width [lindex $param 1] set height [lindex $param 2] set xCoord [lindex $param 3] set yCoord [lindex $param 4] set orgFileName [lindex $param 5] #puts "s fileName: $fileName" #puts "s width: $width" #puts "s height: $height" #puts "s xCoord: $xCoord" #puts "s yCoord: $yCoord" #puts "s powPaperDefXsizePixel: $powPaperDefXsizePixel" #puts "s powPaperDefYsizePixel: $powPaperDefYsizePixel" if { $start_xCoord == 0.0 } { set start_xCoord $xCoord set start_yCoord $yCoord set max_width $width set max_height $height } set testResult "false" #puts "powPaperDefXsizePixel: $powPaperDefXsizePixel" #puts "powPaperDefYsizePixel: $powPaperDefYsizePixel" if { $direction == "X" } { #puts "X: $xCoord + $width - $start_xCoord: [expr $xCoord + $width - $start_xCoord]" if { [expr $xCoord + $width - $start_xCoord] < $powPaperDefXsizePixel} { set resultSubList {} lappend resultSubList $subListFileName lappend resultSubList [expr $xCoord + $width - $start_xCoord] if { $height > $max_height } { set max_height $height } } else { lappend resultSubList $max_height lappend resultSubList $start_xCoord lappend resultSubList $start_yCoord incr idx #puts "X resultSubList: $resultSubList" lappend resultList $resultSubList set resultSubList {} set subListFileName [format "%s/%s_%s.%s" $::env(PSTMPDIR) $subListFile $idx $subListFormat] lappend resultSubList $subListFileName lappend resultSubList $width set start_xCoord $xCoord set start_yCoord $yCoord set max_width $width set max_height $height } } else { #puts "Y: $yCoord + $height - $start_yCoord: [expr $yCoord + $height - $start_yCoord]" if { [expr $yCoord + $height - $start_yCoord] < $powPaperDefYsizePixel} { set resultSubList {} lappend resultSubList $subListFileName if { $width > $max_width } { set max_width $width } lappend resultSubList $max_width lappend resultSubList [expr $yCoord + $height - $start_yCoord] } else { lappend resultSubList $start_xCoord lappend resultSubList $start_yCoord incr idx #puts "Y resultSubList: $resultSubList" lappend resultList $resultSubList set resultSubList {} set subListFileName [format "%s/%s_%s.%s" $::env(PSTMPDIR) $subListFile $idx $subListFormat] lappend resultSubList $subListFileName lappend resultSubList $width lappend resultSubList $height set start_xCoord $xCoord set start_yCoord $yCoord set max_width $width set max_height $height } } } if { [llength $resultSubList] != 5 } { # make sure the incomplete list finished. if { $direction == "X" } { lappend resultSubList $max_height } lappend resultSubList $start_xCoord lappend resultSubList $start_yCoord lappend resultList $resultSubList } #puts $resultList return $resultList } proc powCombineGraph { master } { } proc powAssemblePSfile {{graph {}}} { global powSelectDirectory global powGraphSelection global powbg pcom_fname global powStretch powOutputPaperSize global powConvertFormat powConvertFunction global powHandles powDWP g_titleFont global powPaperDefXsizeInch powPaperDefYsizeInch global powPaperDefXsizePixel powPaperDefYsizePixel global powOutputPaperXsizeInch powOutputPaperYsizeInch global powOutputPaperXsizePixel powOutputPaperYsizePixel global powPlacement powPostOrient global powPaperSizeSelected powPixelToInchRatio global powGraphCoordList global ghostScript global powOutputFileType global tcl_platform global searchPath set tempList [powListGraphs] set px 99999999 set py 99999999 # reverse the order so the graphList has the order of graph been created set graphList {} if { [llength $graph] == 0 } { foreach graph $tempList { if { [string first "scope" $graph] >= 0 } continue set bboxToken [.pow.pow bbox $graph] if { [llength $bboxToken] <= 0 } continue foreach [list x1 y1 x2 y2] [.pow.pow bbox $graph] {} if { $x1 < $px } { set graphList [linsert $graphList 0 $graph] set px $x1 set py $y1 } else { if { $y1 < $py } { set graphList [linsert $graphList 0 $graph] set px $x1 set py $y1 } else { lappend graphList $graph } } } } else { set graphList $graph } set idx -1 set psNameList {} set allCoordList {} #################################################### # selectedGraphCoord is either all or selected graph #################################################### set selectedGraphCoord [powExtractGraph] #################################################### # allCoordList contains all graph's coordination #################################################### if ![info exists powPostOrient] { set powPostOrient 0 } if ![info exists powPlacement] { set powPlacement FOOP } if ![info exists powStretch] { set powStretch "no" } if ![info exists powPaperSizeSelected] { set powPaperSizeSelected "Letter" } #puts "powPostOrient: $powPostOrient" #puts "powStretch : $powStretch" #puts "powPlacement : $powPlacement" powSelectPaper $powPostOrient switch -exact $powPlacement { "FOOP" { # fit on one page set tname "[pid]FOOPextract.ps" set width [lindex $selectedGraphCoord 0] set height [lindex $selectedGraphCoord 1] set xCoord [lindex $selectedGraphCoord 2] set yCoord [lindex $selectedGraphCoord 3] lappend psNameList [list $::env(PSTMPDIR)/$tname $width $height $xCoord $yCoord all] } "BFMP" { # best fit on mulitple pages set findColorBar false foreach graph $graphList { if { [string first "scope" $graph] >= 0 } continue if { [string first "colorbar" $graph] >= 0 } { set findColorBar true continue } set resultGraphCoord [powExtractGraph $graph] set tname "[expr [pid] + $idx]BFMPextract.ps" set width [lindex $resultGraphCoord 0] set height [lindex $resultGraphCoord 1] set xCoord [lindex $resultGraphCoord 2] set yCoord [lindex $resultGraphCoord 3] lappend psNameList [list $::env(PSTMPDIR)/$tname $width $height $xCoord $yCoord $graph] incr idx } if { $findColorBar == "true" } { foreach graph $graphList { set idx [string first "colorbar" $graph] if { [string first "colorbar" $graph] >= 0 } { set masterKey [string range $graph 0 [expr $idx - 2]] set resultGraphCoord [powExtractGraph $graph] set width [lindex $resultGraphCoord 0] set height [lindex $resultGraphCoord 1] set xCoord [lindex $resultGraphCoord 2] set yCoord [lindex $resultGraphCoord 3] set x1Coord [expr $xCoord + $width] set y1Coord [expr $yCoord + $height] set idx 0 foreach token $psNameList { set name [lindex $token 0] set w [lindex $token 1] set h [lindex $token 2] set x [lindex $token 3] set y [lindex $token 4] set g [lindex $token 5] if { $g == $masterKey } { set x1 [expr $x + $w] set y1 [expr $y + $h] if { $x1Coord > $x1 && $xCoord < $x } { # colorbar is larger than the graph set x $xCoord set w $width } elseif { $x1Coord > $x1 && $xCoord > $x } { set w [expr $x1Coord - $x] } elseif { $x1Coord < $x1 && $xCoord > $x } { # don't do anything } else { # x1Coord < x1 && xCoord < $x set w [expr $x1 - $xCoord] } if { $y1Coord > $y1 && $yCoord < $y } { # colorbar is larger than the graph set y $yCoord set h $height } elseif { $y1Coord > $y1 && $yCoord > $y } { set h [expr $y1Coord - $y] } elseif { $y1Coord < $y1 && $yCoord > $y } { # don't do anything } else { # y1Coord < y1 && yCoord < $y set h [expr $y1 - $yCoord] } set newList [list $name $w $h $x $y $g] set psNameList [lreplace $psNameList $idx $idx $newList] break } incr idx } } } } if { $idx > 0 } { # more than one graph on the canvas # sort against X direction first set psNameList [lsort -real -increasing -index 3 $psNameList ] set psNameList [powDetermineGraphDirection $psNameList] } } "OGPP" { # one graph per page set findColorBar false foreach graph $graphList { if { [string first "scope" $graph] >= 0 } continue if { [string first "colorbar" $graph] >= 0 } { set findColorBar true continue } set resultGraphCoord [powExtractGraph $graph] set tname "[expr [pid] + $idx]OGPPextract.ps" set width [lindex $resultGraphCoord 0] set height [lindex $resultGraphCoord 1] set xCoord [lindex $resultGraphCoord 2] set yCoord [lindex $resultGraphCoord 3] lappend psNameList [list $::env(PSTMPDIR)/$tname $width $height $xCoord $yCoord $graph] incr idx } if { $findColorBar == "true" } { foreach graph $graphList { set idx [string first "colorbar" $graph] if { [string first "colorbar" $graph] >= 0 } { set masterKey [string range $graph 0 [expr $idx - 2]] set resultGraphCoord [powExtractGraph $graph] set width [lindex $resultGraphCoord 0] set height [lindex $resultGraphCoord 1] set xCoord [lindex $resultGraphCoord 2] set yCoord [lindex $resultGraphCoord 3] set x1Coord [expr $xCoord + $width] set y1Coord [expr $yCoord + $height] set idx 0 foreach token $psNameList { set name [lindex $token 0] set w [lindex $token 1] set h [lindex $token 2] set x [lindex $token 3] set y [lindex $token 4] set g [lindex $token 5] if { $g == $masterKey } { set x1 [expr $x + $w] set y1 [expr $y + $h] if { $x1Coord > $x1 && $xCoord < $x } { # colorbar is larger than the graph set x $xCoord set w $width } elseif { $x1Coord > $x1 && $xCoord > $x } { set w [expr $x1Coord - $x] } elseif { $x1Coord < $x1 && $xCoord > $x } { # don't do anything } else { # x1Coord < x1 && xCoord < $x set w [expr $x1 - $xCoord] } if { $y1Coord > $y1 && $yCoord < $y } { # colorbar is larger than the graph set y $yCoord set h $height } elseif { $y1Coord > $y1 && $yCoord > $y } { set h [expr $y1Coord - $y] } elseif { $y1Coord < $y1 && $yCoord > $y } { # don't do anything } else { # y1Coord < y1 && yCoord < $y set h [expr $y1 - $yCoord] } set newList [list $name $w $h $x $y $g] set psNameList [lreplace $psNameList $idx $idx $newList] break } incr idx } } } } if { $idx > 1 } { # more than one graph on the canvas set psNameList [lsort -real -increasing -index 3 $psNameList ] set direction [powDetermineGraphDirection $psNameList yes] if { $direction == "Y" } { set psNameList [lsort -real -increasing -index 4 $psNameList ] } } } } set powGraphCoordList $psNameList set fileNameList {} foreach param $psNameList { set fileName [lindex $param 0] set width [lindex $param 1] set height [lindex $param 2] set xCoord [lindex $param 3] set yCoord [lindex $param 4] #puts " fileName $fileName" #puts " width $width" #puts " height $height" #puts " xCoord $xCoord" #puts " yCoord $yCoord" #puts " powPostOrient $powPostOrient" set pageWidthPixel $powOutputPaperXsizePixel set pageHeightPixel $powOutputPaperYsizePixel set pageWidth $powOutputPaperXsizeInch set pageHeight $powOutputPaperYsizeInch #puts "powOutputPaperXsizeInch: $powOutputPaperXsizeInch" #puts "powOutputPaperXsizePixel: $powOutputPaperXsizePixel" #puts "powOutputPaperYsizeInch: $powOutputPaperYsizeInch" #puts "powOutputPaperYsizePixel: $powOutputPaperYsizePixel" #puts "OX1 pageWidth: $pageWidth" #puts "OX1 pageheight: $pageHeight" set canvasHeight $height set canvasWidth $width if { $width <= $powOutputPaperXsizePixel && $height <= $powOutputPaperYsizePixel } { # whole canvas or individual image is smaller than the output page size in Pixel if { $powStretch == "no" } { # no stretch to fit the page # Don't specify pageheight or pagewidth in canvas postscript command set pageWidth 0.0 set pageHeight 0.0 } else { # strectch the image to fit the page # adjust pageWidth and pageHeight and select the samller of two adjust size # # 1. calculate the factor from original image width to max width allows # calculate the factor from original image height to max height allows set widthFactor [expr $powOutputPaperXsizePixel / $width] set heightFactor [expr $powOutputPaperYsizePixel / $height] set imageWidthInch [format "%si" [expr [string range $powOutputPaperXsizeInch 0 [expr [string length $powOutputPaperXsizeInch] - 2]] / $widthFactor]] set imageHeightInch [format "%si" [expr [string range $powOutputPaperYsizeInch 0 [expr [string length $powOutputPaperYsizeInch] - 2]] / $heightFactor]] #puts "imageWidthInch : $imageWidthInch" #puts "imageHeightInch: $imageHeightInch" # 2. use the height factor * current width and get new width # use the width factor * current height and get new height set newWidthPixel [expr $heightFactor * $width] set newHeightPixel [expr $widthFactor * $height] #puts "newWidthPixel : $newWidthPixel" #puts "newHeightPixel: $newHeightPixel" set zoomFactor 1.0 set operator "/" if { $newWidthPixel > $powOutputPaperXsizePixel } { # width can't zoom in or out with heightFactor set zoomFactor $widthFactor if { $width < $powOutputPaperXsizePixel } { set operator "*" } set pageWidth [format "%si" [expr [string range $imageWidthInch 0 [expr [string length $pageWidth] - 2]] $operator $zoomFactor]] set pageHeight 0.0 } if { $newHeightPixel > $powOutputPaperYsizePixel } { # height can't zoom in or out with widthFactor set zoomFactor $heightFactor if { $height < $powOutputPaperYsizePixel } { set operator "*" } set pageHeight [format "%si" [expr [string range $imageHeightInch 0 [expr [string length $pageHeight] - 2]] $operator $zoomFactor]] set pageWidth 0.0 } if { $pageHeight == 0.0 && $pageWidth == 0.0 } { if { $powOutputPaperXsizePixel > $powOutputPaperYsizePixel } { # width larger than height, use powOutputPaperYsizeInch set pageHeight $powOutputPaperYsizeInch } else { set pageWidth $powOutputPaperXsizeInch } } } #puts "pageWidth: $pageWidth" #puts "pageHeight: $pageHeight" } elseif { $width > $powOutputPaperXsizePixel && $height <= $powOutputPaperYsizePixel } { # the width of whole canvas or individual image is larger than output page width in pixel # but height of whole canvas or individual image is smaller than output page height in pixel if { $powStretch == "no" } { # want width of the image to reduce by canvas postscript command to fit the page # set pageHeight to 0.0 and se the pagewidth = powOutputPagerXsizePixel to reduce # the width of image set pageHeight 0.0 } else { # strectch the image to fit the page if { $powOutputPaperXsizePixel > $powOutputPaperYsizePixel } { # using the smaller of paper width and height to be the final size. set pageWidth 0.0 set pageHeight $powOutputPaperYsizeInch } else { set pageHeight 0.0 set pageWidth $powOutputPaperXsizeInch } } } elseif { $width <= $powOutputPaperXsizePixel && $height > $powOutputPaperYsizePixel } { # the width of whole canvas or individual image is smaller than output page width in pixel # but height of whole canvas or individual image is larger than output page height in pixel if { $powStretch == "no" } { # want height of the image to reduce by canvas postscript command to fit the page # set pageWidth to 0.0 and se the pageHeight = powOutputPagerYsizePixel to reduce # the height of image set pageWidth 0.0 } else { # strectch the image to fit the page if { $powOutputPaperXsizePixel > $powOutputPaperYsizePixel } { # using the smaller of paper width and height to be the final size. set pageWidth 0.0 set pageHeight $powOutputPaperYsizeInch } else { set pageHeight 0.0 set pageWidth $powOutputPaperXsizeInch } } } elseif { $width > $powOutputPaperXsizePixel && $height > $powOutputPaperYsizePixel } { # the width and the height of whole canvas or individual image is larger than output page # width and height in pixel if { $width > $height } { if { $powStretch == "no" } { # width is larger than height, so reduce width will indicate that reduced height # will also fit the page. # set pageHeigth to 0.0 and se the pageWidth = powOutputPagerXsizePixel to reduce # the width of image set pageHeight 0.0 set pageWidth $powOutputPaperXsizeInch } else { # same idea, since now we need to reduce the image to fit the page, reduce the # width will reduce the height to fit the page also # set pageHeigth to 0.0 and se the pageWidth = powOutputPagerXsizePixel to reduce # the width of image if { $powPostOrient == 0 } { set pageHeight 0.0 set pageWidth $powOutputPaperXsizeInch } else { # rotate 90 degree and stretch. Even though width is larger than height, # the new width is now smaller than new height. Need pageHeight = powOutputPagerYsizePixel # to reduce the new height (previously the width of image) to fit the page. set pageWidth 0.0 set pageHeight $powOutputPaperYsizeInch } } } else { if { $powStretch == "no" } { # height is larger than width, so reduce height will indicate that reduced width # will also fit the page. # set pageWidth to 0.0 and se the pageHeight = powOutputPagerYsizePixel to reduce # the height of image set pageWidth 0.0 set pageHeight $powOutputPaperYsizeInch } else { # same idea, since now we need to reduce the image to fit the page, reduce the # height will reduce the width to fit the page also. # set pageWidth to 0.0 and se the pageHeight = powOutputPagerYsizePixel to reduce # the height of image if { $powPostOrient == 0 } { set pageWidth 0.0 set pageHeight $powOutputPaperYsizeInch } else { # rotate 90 degree and stretch. Even though height is larger than width, # the new height is now smaller than new width. Need pagewidth = powOutputPagerXsizePixel # to reduce the new width (previously the height of image) to fit the page. set pageHeight 0.0 set pageWidth $powOutputPaperXsizeInch } } } } #puts "pageWidth: $pageWidth" #puts "pageheight: $pageHeight" if { $pageWidth != 0.0 } { if { $powPostOrient == 1 } { # this is a hack until I could find a better way to stretch plot/image slice # to fit the page while rotate 90 degree set pageWidth [format "%si" [expr [string range $pageWidth 0 [expr [string length $pageWidth] - 2]] - 0.4]] } catch { .pow.pow postscript -colormode color -rotate $powPostOrient -file $fileName \ -width $canvasWidth -height $canvasHeight \ -pagewidth $pageWidth \ -x $xCoord -y $yCoord } err } elseif { $pageHeight != 0.0 } { if { $powPostOrient == 1 } { # this is a hack until I could find a better way to stretch plot/image slice # to fit the page while rotate 90 degree set pageHeight [format "%si" [expr [string range $pageHeight 0 [expr [string length $pageHeight] - 2]] - 0.4]] } catch { .pow.pow postscript -colormode color -rotate $powPostOrient -file $fileName \ -width $canvasWidth -height $canvasHeight \ -pageheight $pageHeight \ -x $xCoord -y $yCoord } err } else { catch { .pow.pow postscript -colormode color -rotate $powPostOrient -file $fileName \ -width $canvasWidth -height $canvasHeight \ -x $xCoord -y $yCoord } err } lappend fileNameList $fileName } return $fileNameList } proc powParseGraphRange { range } { global powPlacement set oldPowPlacement "" if [info exists powPlacement] { set oldPowPlacement $powPlacement } set powPlacement OGPP regsub -all " " $range "" result set tokenList [split $result ","] set indxList {} set returnList {} foreach token $tokenList { set subToken [split $token "-"] if { [llength $subToken] > 1 } { # it is range set start [expr [lindex $subToken 0] - 1] set end [expr [lindex $subToken 1] - 1] } else { set start [expr [lindex $subToken 0] - 1] set end [expr [lindex $subToken 0] - 1] } set value 1 if { $start > $end } { set value -1 } for { set i $start } {$i <= $end} { incr i $value } { if { [lsearch $indxList $i] < 0 } { lappend indxList $i } } } # delete from back of list set indxList [lsort -integer -increasing $indxList] set returnList [powAssemblePSfile] set finalList {} for {set i 0} {$i < [llength $indxList]} {incr i} { lappend finalList [lindex $returnList [lindex $indxList $i]] } set powPlacement $oldPowPlacement return $finalList } proc powPrintBox { {fromWhere "pow"} } { global powGraphSelection global powSelectDirectory global powConvertFunction global powDWP g_titleFont powbg global powGraphSelection global currentPreviewGraph global powPrintType global powPrintFunction global currgn global previewNameList global powCurrentPreviewPage global powOutputFileName global callingRoutine set callingRoutine $fromWhere if [winfo exists ${powDWP}print] { destroy ${powDWP}print } powToplevel ${powDWP}print .pow "-bg $powbg -class \"POW Print\"" bind ${powDWP}print <> "destroy ${powDWP}" wm title ${powDWP}print "Print" set rowIdx 0 frame ${powDWP}print.choice -bg $powbg -bd 2 radiobutton ${powDWP}print.choice.printer -text "Printer" -bg $powbg -font g_titleFont \ -variable powPrintType -value "Printer" \ -command { \ ${powDWP}print.option.filelbl configure -state disable ; \ ${powDWP}print.option.fileentry configure -state disable ; \ ${powDWP}print.option.dirlbl configure -state disable ; \ ${powDWP}print.option.direntry configure -state disable ; \ ${powDWP}print.option.filebutton configure -state disable; \ ${powDWP}print.option.convertType configure -state disable; \ ${powDWP}print.option.printerlbl configure -state normal ; \ ${powDWP}print.option.printerentry configure -state normal; \ } radiobutton ${powDWP}print.choice.file -text "File" -bg $powbg -font g_titleFont \ -variable powPrintType -value "File" \ -command { \ ${powDWP}print.option.filelbl configure -state normal; \ ${powDWP}print.option.convertType configure -state normal; \ ${powDWP}print.option.fileentry configure -state normal; \ ${powDWP}print.option.dirlbl configure -state normal ; \ ${powDWP}print.option.direntry configure -state normal ; \ ${powDWP}print.option.filebutton configure -state normal; \ ${powDWP}print.option.printerlbl configure -state disable ; \ ${powDWP}print.option.printerentry configure -state disable ; \ } label ${powDWP}print.choice.blanklabel -text " " -bg $powbg -font g_titleFont -width 10 grid ${powDWP}print.choice -row $rowIdx -column 0 -sticky ew -rowspan 2 grid ${powDWP}print.choice.printer -row 1 -column 0 -sticky nw grid ${powDWP}print.choice.blanklabel -row 1 -column 1 -sticky news -columnspan 3 grid ${powDWP}print.choice.file -row 1 -column 8 -sticky ne grid rowconfigure ${powDWP}print 0 -weight 1 grid columnconfigure ${powDWP}print 8 -weight 1 incr rowIdx 2 frame ${powDWP}print.option -bg $powbg -bd 2 label ${powDWP}print.option.printerlbl -text "Printer Command:" -bg $powbg -font g_titleFont entry ${powDWP}print.option.printerentry -bg white -font g_titleFont label ${powDWP}print.option.filelbl -text "File Name:" -bg $powbg -font g_titleFont entry ${powDWP}print.option.fileentry -bg white -font g_titleFont tixComboBox ${powDWP}print.option.convertType -editable true \ -label "format:" \ -options { \ listbox.height 4 \ label.font g_titleFont \ listbox.font g_titleFont \ entry.font g_titleFont \ entry.background white \ entry.width 30 \ entry.ipady 5 \ } \ -command powSelectConvertFormat foreach functionList $powConvertFunction { set formatStr [format "%s - %s" [lindex $functionList 0] [lindex $functionList 3]] ${powDWP}print.option.convertType insert end $formatStr } label ${powDWP}print.option.dirlbl -text "Directory:" -bg $powbg -font g_titleFont entry ${powDWP}print.option.direntry -bg white -font g_titleFont button ${powDWP}print.option.filebutton -text "Browse" -font g_titleFont -bg $powbg \ -command { set powOutputFileName [${powDWP}print.option.fileentry get] ; \ set powSelectDirectory [${powDWP}print.option.direntry get] ; \ wm withdraw ${powDWP}print; powSaveAs } grid ${powDWP}print.option -row $rowIdx -column 0 -columnspan 10 -sticky news -rowspan 2 grid ${powDWP}print.option.printerlbl -row 1 -column 0 -sticky nw -columnspan 2 grid ${powDWP}print.option.printerentry -row 1 -column 2 -sticky nw -columnspan 7 grid ${powDWP}print.option.filelbl -row 2 -column 0 -sticky nw -columnspan 2 grid ${powDWP}print.option.fileentry -row 2 -column 2 -sticky new -columnspan 4 grid ${powDWP}print.option.convertType -row 3 -column 2 -sticky new -columnspan 4 grid ${powDWP}print.option.dirlbl -row 4 -column 0 -sticky nw -columnspan 2 grid ${powDWP}print.option.direntry -row 4 -column 2 -sticky new -columnspan 4 grid ${powDWP}print.option.filebutton -row 4 -column 6 -sticky nw grid rowconfigure ${powDWP}print $rowIdx -weight 1 grid rowconfigure ${powDWP}print.option 1 -weight 1 grid rowconfigure ${powDWP}print.option 2 -weight 1 grid rowconfigure ${powDWP}print.option 3 -weight 1 grid columnconfigure ${powDWP}print.option 2 -weight 1 incr rowIdx 4 frame ${powDWP}print.selection -bg $powbg -bd 2 -relief ridge label ${powDWP}print.selectionframelabel -text "Print/Save Range" -bg $powbg -font g_titleFont label ${powDWP}print.selection.blanklabel -text " " -bg $powbg -font g_titleFont radiobutton ${powDWP}print.selection.allgraph -text "All Graphs" -value "all" \ -bg $powbg \ -variable powGraphSelection -font g_titleFont radiobutton ${powDWP}print.selection.selectedgraph -text "Selected Graph" -value "one" \ -bg $powbg \ -variable powGraphSelection -font g_titleFont \ -command { \ if ![info exists currentPreviewGraph] { \ set currentPreviewGraph "" ; \ if { $powGraphSelection == "one" } { \ set currentPreviewGraph [lindex [powAssemblePSfile $currgn] 0] ; \ } ; \ } ; \ } radiobutton ${powDWP}print.selection.range -text "Graphs No." -value "range" \ -bg $powbg \ -variable powGraphSelection -font g_titleFont entry ${powDWP}print.selection.entry -bg white -width 25 -font g_titleFont label ${powDWP}print.selection.label1 -text "Enter graph numbers and/or graph ranges separated by" \ -bg $powbg \ -font [list Helvetica 10 italic] -fg blue label ${powDWP}print.selection.label2 -text "commas, i.e. 1,3,5,5-12 (1 being leftmost/topmost graph)" \ -bg $powbg \ -font [list Helvetica 10 italic] -fg blue if { $fromWhere == "preview" } { ${powDWP}print.selection.allgraph configure -text "All Pages" ${powDWP}print.selection.selectedgraph configure -text "Current Page" ${powDWP}print.selection.range configure -text "Page No." ${powDWP}print.selection.label1 configure -text "Enter page numbers and/or page ranges separated by" ${powDWP}print.selection.label2 configure -text "commas, i.e. 1,3,5,5-12" } grid ${powDWP}print.selection -row $rowIdx -column 0 -columnspan 10 -sticky news -rowspan 7 grid ${powDWP}print.selectionframelabel -row $rowIdx -column 0 -sticky nw grid ${powDWP}print.selection.blanklabel -row 1 -column 0 -sticky nw grid ${powDWP}print.selection.allgraph -row 2 -column 1 -sticky nw -columnspan 2 grid ${powDWP}print.selection.selectedgraph -row 3 -column 1 -sticky nw -columnspan 2 grid ${powDWP}print.selection.range -row 4 -column 1 -sticky nw -columnspan 2 grid ${powDWP}print.selection.entry -row 4 -column 3 -sticky nw -columnspan 5 grid ${powDWP}print.selection.label1 -row 5 -column 1 -sticky nw -columnspan 6 grid ${powDWP}print.selection.label2 -row 6 -column 1 -sticky nw -columnspan 6 grid rowconfigure ${powDWP}print $rowIdx -weight 1 grid rowconfigure ${powDWP}print.selection 1 -weight 1 grid rowconfigure ${powDWP}print.selection 2 -weight 1 grid rowconfigure ${powDWP}print.selection 3 -weight 1 grid rowconfigure ${powDWP}print.selection 4 -weight 1 grid rowconfigure ${powDWP}print.selection 5 -weight 1 grid rowconfigure ${powDWP}print.selection 6 -weight 1 grid rowconfigure ${powDWP}print.selection 7 -weight 1 grid columnconfigure ${powDWP}print.selection 3 -weight 1 incr rowIdx 7 frame ${powDWP}print.action -bg $powbg button ${powDWP}print.action.ok -text "OK" -bg $powbg -font g_titleFont \ -command { \ if ![info exists currentPreviewGraph] { \ set currentPreviewGraph "" ; \ if { $powGraphSelection == "one" } { \ set currentPreviewGraph [lindex [powAssemblePSfile $currgn] 0] ; \ } ; \ } ; \ if { $powPrintType == "Printer" } { \ set powPrintFunction [${powDWP}print.option.printerentry get] if { $powGraphSelection == "all" } { \ powShowHandles 0 ; \ powPrint ; \ powShowHandles 1 ; \ } elseif { $powGraphSelection == "one" } { \ powShowHandles 0 ; \ powPrint $currentPreviewGraph ; \ powShowHandles 1 ; \ } elseif { $powGraphSelection == "range" } { \ powShowHandles 0 ; \ powPrint [powParseGraphRange \ [${powDWP}print.selection.entry get]] ;\ powShowHandles 1 ; \ } ; \ } else { set powOutputFileName [${powDWP}print.option.fileentry get] ; \ set powSelectDirectory [${powDWP}print.option.direntry get] ; \ set token [split $powOutputFileName "."] ; \ set powOutputFileType {} ; \ foreach cvf $powConvertFunction { if { [lindex $cvf 2] == [lindex $token 1] } {\ set powOutputFileType $cvf ; \ break; } \ } ; \ if { [llength $powOutputFileType] == 0 } { tk_messageBox -icon warning -parent .pow -type ok \ -message "Can't save to [lindex $token 1] format." } else { if { $powGraphSelection == "range" } { \ powShowHandles 0 ; \ powSave [powParseGraphRange \ [${powDWP}print.selection.entry get]] ; \ powShowHandles 1 ; \ } elseif { $powGraphSelection == "one" } { \ powShowHandles 0 ; \ if { $callingRoutine == "pow" } { \ powSave [lindex [powAssemblePSfile $currgn] 0] ; \ } else { \ powSave [lindex [lindex $previewNameList $powCurrentPreviewPage] 1] } ; \ powShowHandles 1 ; \ } else { \ powShowHandles 0 ; \ powSave ; \ powShowHandles 1 ; \ } ; \ } ; \ }; \ destroy ${powDWP}print } label ${powDWP}print.action.blanklabel -text " " -bg $powbg -font g_titleFont button ${powDWP}print.action.cancel -text "Cancel" -bg $powbg -font g_titleFont \ -command { destroy ${powDWP}print } grid ${powDWP}print.action -row $rowIdx -column 0 -columnspan 10 -sticky news grid ${powDWP}print.action.ok -row 0 -column 1 -sticky w -padx 30 grid ${powDWP}print.action.cancel -row 0 -column 4 -sticky e -padx 30 # grid rowconfigure ${powDWP}print 0 -weight 1 # grid columnconfigure ${powDWP}print 0 -weight 1 if { [${powDWP}print.option.printerentry get] == "" } { ${powDWP}print.option.printerentry insert end $powPrintFunction } else { set powPrintFunction [${powDWP}print.option.printerentry get] } if ![info exists powOutputFileName] { ${powDWP}print.option.fileentry insert end "powGraph.ps" } else { ${powDWP}print.option.fileentry insert end $powOutputFileName } set powOutputFileName [${powDWP}print.option.fileentry get] if ![info exists powSelectDirectory ] { ${powDWP}print.option.direntry insert end [pwd] } else { ${powDWP}print.option.direntry insert end $powSelectDirectory } if { ![info exists powPrintType] || $powPrintType == "" } { ${powDWP}print.choice.printer select ${powDWP}print.option.filelbl configure -state disable ${powDWP}print.option.convertType configure -state disable ${powDWP}print.option.fileentry configure -state disable ${powDWP}print.option.dirlbl configure -state disable ${powDWP}print.option.direntry configure -state disable ${powDWP}print.option.filebutton configure -state disable ${powDWP}print.option.printerlbl configure -state normal ${powDWP}print.option.printerentry configure -state normal } else { if { $powPrintType == "Printer" } { ${powDWP}print.option.filelbl configure -state disable ${powDWP}print.option.convertType configure -state disable ${powDWP}print.option.fileentry configure -state disable ${powDWP}print.option.filebutton configure -state disable ${powDWP}print.option.dirlbl configure -state disable ${powDWP}print.option.direntry configure -state disable ${powDWP}print.option.printerlbl configure -state normal ${powDWP}print.option.printerentry configure -state normal } else { ${powDWP}print.option.filelbl configure -state normal ${powDWP}print.option.convertType configure -state normal ${powDWP}print.option.fileentry configure -state normal ${powDWP}print.option.filebutton configure -state normal ${powDWP}print.option.dirlbl configure -state normal ${powDWP}print.option.direntry configure -state normal ${powDWP}print.option.printerlbl configure -state disable ${powDWP}print.option.printerentry configure -state disable } } if [info exists powGraphSelection] { if { $powGraphSelection == "one" && \ (![info exists currentPreviewGraph] || $currentPreviewGraph == "") } { set currentPreviewGraph [lindex [powAssemblePSfile $currgn] 0] } } else { ${powDWP}print.selection.allgraph select } set token [split $powOutputFileName "."] set powOutputFileType {postscript pswrite ps "Postscript Files"} foreach cvf $powConvertFunction { if { [lindex $cvf 2] == [lindex $token 1] } { set powOutputFileType $cvf tixSetSilent ${powDWP}print.option.convertType "[lindex $cvf 0] - [lindex $cvf 3]" break } } bind ${powDWP}print.selection.entry { global powDWP ${powDWP}print.selection.range select } } proc powPrint { {inputFile {}} } { global powSelectDirectory global powGraphSelection global powbg pcom_fname global powStretch powOutputPaperSize global powConvertFormat powConvertFunction global powHandles powDWP g_titleFont global powPaperDefXsizeInch powPaperDefYsizeInch global powPaperDefXsizePixel powPaperDefYsizePixel global powOutputPaperXsizeInch powOutputPaperYsizeInch global powOutputPaperXsizePixel powOutputPaperYsizePixel global powPlacement powPostOrient global powPaperSizeSelected powPixelToInchRatio global powPrintFunction global previewNameList global ghostScript global powOutputFileType global tcl_platform global searchPath #puts "inputFile: $inputFile" set fileNameList {} if { [llength $inputFile] == 0 } { set fileNameList [powAssemblePSfile] if [info exist ${powDWP}print.selection.allgraph] { ${powDWP}print.selection.allgraph select } } else { if { [llength $inputFile] == 1 } { lappend fileNameList $inputFile if [info exist ${powDWP}print.selection.selectedgraph] { ${powDWP}print.selection.selectedgraph select } } else { lappend fileNameList $inputFile if [info exist ${powDWP}print.selection.range] { ${powDWP}print.selection.range select } } } set idx -1 #puts "fileNameList: $fileNameList" #puts "fileNameList length: [llength $fileNameList]" #puts "previewNameList: $previewNameList" foreach fileName $fileNameList { #puts "fileName: $fileName" if { $tcl_platform(platform) != "windows" } { set errorFlag [ catch { set comm "cat $fileName | $powPrintFunction" exec /bin/sh -c $comm } result ] # file delete -force $fileName } elseif { $tcl_platform(platform) == "windows" } { # this is Windows environment print set previewIdx [lsearch -glob $previewNameList [list * $fileName]] set outputName "" #puts "previewIdx: $previewIdx" if { $previewIdx < 0 || ![file exists [lindex [lindex $previewNameList $previewIdx] 0]] } { set errorFlag [ catch { exec $ghostScript -sDEVICE=jpeg \ -dNOPAUSE -dBATCH -dQUIET \ -sPAPERSIZE=[string tolower $powPaperSizeSelected] \ -I$searchPath \ -sOutputFile=tmpPrint.jpg $fileName } result ] if { !$errorFlag } { set outputName $::env(PSTMPDIR)/tmpPrint.jpg } } else { set outputName [lindex [lindex $previewNameList $previewIdx] 0] } #puts "outputName: $outputName" if { $outputName != "" } { set errorFlag [ catch { exec $powPrintFunction "[_convertToWindowFileName $outputName]" "/print" } err ] } else { #tk_messageBox -icon error -parent .pow -type ok -message "Error sending graphs to printer." } } incr idx if { $idx > [llength $fileNameList] } { # tk_messageBox -icon info -parent .pow -type ok -message "Successful send graphs to printer." } } } proc _convertToWindowFileName { path } { set newStr "" for {set i 0} {$i < [string length $path]} {incr i} { if { [string range $path $i $i] == "/" } { set newStr [format "%s\\" $newStr] } else { set newStr [format "%s%s" $newStr [string range $path $i $i]] } } return $newStr } proc powMergeGraphs { newgn } { #puts "powMergeGraphs start" global currgn powPlotParam powGUI powPlotImages $currgn $powPlotParam(images,$newgn) .pow.pow powPlotCurves $currgn $powPlotParam(curves,$newgn) .pow.pow if { $powGUI } { powRedrawScopebox } } proc powEditNoteDlg { gn idx {id ""} } { #puts "powEditNoteDlg start" global powPlotParam powFontParam powNote powDWP powbg global g_titleFont if { $idx=="" } { set idx [powFindNoteIdx $gn $id] } powSetupNoteVar $gn $idx # # Build Dialog Window # set w ${powDWP}note if { [winfo exists $w] } { raise $w focus $w if { $powNote(idx)<0 } { $w.buttons.apply config -state disabled $w.buttons.delete config -state disabled } else { $w.buttons.apply config -state normal $w.buttons.delete config -state normal } return } powToplevel $w .pow "-bg $powbg" bind $w <> "destroy $w" wm title $w "Annotations" set row 1 label $w.title -text "Edit/Add Annotations" -bg $powbg -font g_titleFont grid $w.title -row $row -column 1 -columnspan 2 -sticky n incr row grid rowconfigure $w $row -minsize 10 incr row label $w.lbl -text "Label:" -bg $powbg -font g_titleFont entry $w.lblentry -width 30 -bg $powbg -textvariable powNote(string) -font g_titleFont grid $w.lbl -row $row -column 1 -sticky e grid $w.lblentry -row $row -column 2 -sticky ew -padx 5 incr row grid rowconfigure $w $row -minsize 3 incr row label $w.fnt -text "Font:" -bg $powbg -font g_titleFont frame $w.fntframe -bg $powbg set mnu [eval tk_optionMenu $w.fntframe.fnt \ powNote(Font) $powFontParam(allFonts,powDef)] $w.fntframe.fnt config -bg $powbg -highlightthickness 0 -width 20 -font g_titleFont $mnu config -bg $powbg -font g_titleFont set mnu [tk_optionMenu $w.fntframe.siz \ powNote(Size) 7 9 12 14 16 18 24 32 40] $w.fntframe.siz config -bg $powbg -highlightthickness 0 -width 3 -font g_titleFont $mnu config -bg $powbg -font g_titleFont pack $w.fntframe.fnt -side left -padx 5 pack $w.fntframe.siz -side left -padx 5 grid $w.fnt -row $row -column 1 -sticky e grid $w.fntframe -row $row -column 2 -sticky w incr row grid rowconfigure $w $row -minsize 3 incr row label $w.stl -text "Style:" -bg $powbg -font g_titleFont frame $w.stlframe -bg $powbg checkbutton $w.stlframe.bld -text Bold -onvalue bold -offvalue normal \ -bg $powbg -variable powNote(Weight) -highlightthickness 0 -font g_titleFont checkbutton $w.stlframe.itl -text Italic -onvalue italic -offvalue roman \ -bg $powbg -variable powNote(Slant) -highlightthickness 0 -font g_titleFont pack $w.stlframe.bld -side left -padx 5 pack $w.stlframe.itl -side left -padx 5 grid $w.stl -row $row -column 1 -sticky e grid $w.stlframe -row $row -column 2 -sticky w incr row grid rowconfigure $w $row -minsize 3 incr row label $w.clr -text "Color:" -bg $powbg -font g_titleFont button $w.clrbtn -textvariable powNote(Color) \ -bg $powbg -highlightthickness 0 -width 7 \ -command "powSelectColor powNote(Color)" -font g_titleFont grid $w.clr -row $row -column 1 -sticky e grid $w.clrbtn -row $row -column 2 -sticky w -padx 5 incr row grid rowconfigure $w $row -minsize 3 incr row label $w.pos -text "Position:" -bg $powbg -font g_titleFont frame $w.posframe -bg $powbg entry $w.posframe.x -width 14 -bg $powbg -textvariable powNote(xpos) -font g_titleFont entry $w.posframe.y -width 14 -bg $powbg -textvariable powNote(ypos) -font g_titleFont pack $w.posframe.x -side left -padx 5 pack $w.posframe.y -side left -padx 5 grid $w.pos -row $row -column 1 -sticky e grid $w.posframe -row $row -column 2 -sticky w incr row grid rowconfigure $w $row -minsize 3 incr row label $w.crd -text "Attach To:" -bg $powbg -font g_titleFont frame $w.crdframe -bg $powbg radiobutton $w.crdframe.graph -text "Graph" \ -variable powNote(coordSys) \ -value "graph" -highlightthickness 0 -bg $powbg \ -command powUpdateNoteCoord -font g_titleFont radiobutton $w.crdframe.coord -text "Coordinates" \ -variable powNote(coordSys) \ -value "coord" -highlightthickness 0 -bg $powbg \ -command powUpdateNoteCoord -font g_titleFont pack $w.crdframe.graph -side left -padx 5 pack $w.crdframe.coord -side left -padx 5 grid $w.crd -row $row -column 1 -sticky e grid $w.crdframe -row $row -column 2 -sticky w incr row grid rowconfigure $w $row -minsize 10 incr row frame $w.buttons -bg $powbg button $w.buttons.apply -text "Apply" -bg $powbg -highlightthickness 0 \ -command {powUpdateNote apply} -font g_titleFont button $w.buttons.add -text "Add" -bg $powbg -highlightthickness 0 \ -command {powUpdateNote add} -font g_titleFont button $w.buttons.delete -text "Delete" -bg $powbg -highlightthickness 0 \ -command {powUpdateNote delete} -font g_titleFont button $w.buttons.done -text "Exit" -bg $powbg -highlightthickness 0 \ -command "destroy $w" -font g_titleFont pack $w.buttons.add -side left -padx 5 pack $w.buttons.delete -side left -padx 5 pack $w.buttons.apply -side left -padx 5 pack $w.buttons.done -side left -padx 5 grid $w.buttons -row $row -column 1 -columnspan 2 incr row grid rowconfigure $w $row -minsize 5 incr row if { $powNote(idx)<0 } { $w.buttons.apply config -state disabled $w.buttons.delete config -state disabled } else { $w.buttons.apply config -state normal $w.buttons.delete config -state normal } } proc powSetupNoteVar { gn idx } { #puts "powSetupNoteVar start" global powNote powFontParam powPlotParam set powNote(gn) $gn if { $idx<0 && [llength $powPlotParam(Notes,$gn)]==0 } { # This is a new record # Grab font info from graph defaults foreach opt $powFontParam(allOpts,powDef) { set powNote($opt) $powFontParam(note${opt},$gn) } set powNote(xpos) 1.01 set powNote(ypos) 0.9 set powNote(string) "Blank" set powNote(coordSys) "graph" } else { if { $idx<0 || $idx >= [llength $powPlotParam(Notes,$gn)] } { # Grab font info from last note set record [lindex $powPlotParam(Notes,$gn) end] set record [lreplace $record 0 0 "Blank"] set record [lreplace $record end end -1] set idx -1 } else { set record [lindex $powPlotParam(Notes,$gn) $idx] } foreach [list string Font Size Weight Slant Color xpos ypos coordSys id] \ $record {} foreach opt \ [list string Font Size Weight Slant Color xpos ypos coordSys id] { set powNote($opt) [subst \$$opt] } } set powNote(idx) $idx set powNote(oldCoord) $powNote(coordSys) } proc powUpdateNote { method } { #puts "powUpdateNote start" global powNote powPlotParam powDWP set gn $powNote(gn) if { $method=="delete" } { # Delete this Note if { $powNote(idx)>=0 } { powDeleteNote $gn $powNote(idx) set powNote(idx) -1 } } elseif { $powNote(string)=="" } { error "Cannot Add/Apply an empty label" } else { # Update the Note set record {} foreach opt [list \ string Font Size Weight Slant Color xpos ypos coordSys] { lappend record $powNote($opt) } if { $method=="add" || $powNote(idx)<0 } { # Create a new Note set powNote(idx) [llength $powPlotParam(Notes,$gn)] lappend record -1 lappend powPlotParam(Notes,$gn) $record } else { # Apply # Grab current ID number of the current Note set r [lindex $powPlotParam(Notes,$gn) $powNote(idx)] lappend record [lindex $r 9] } set newID [powDrawNote $gn $record] set record [lreplace $record 9 9 $newID] set powPlotParam(Notes,$gn) [lreplace \ $powPlotParam(Notes,$gn) $powNote(idx) $powNote(idx) $record] powRedrawGraphHandles $gn } if { $powNote(idx)<0 } { ${powDWP}note.buttons.apply config -state disabled ${powDWP}note.buttons.delete config -state disabled } else { ${powDWP}note.buttons.apply config -state normal ${powDWP}note.buttons.delete config -state normal } } proc powUpdateNoteCoord { } { #puts "powUpdateNoteCoord start" global powNote powPlotParam set gn $powNote(gn) set xpos $powNote(xpos) set ypos $powNote(ypos) foreach [list x0 y1 x1 y0] [.pow.pow coord ${gn}box] {} if { $powNote(oldCoord)==$powNote(coordSys) } { set idx $powNote(idx) if { $idx>=0 } { set r [lindex $powPlotParam(Notes,$gn) $idx] set xpos [lindex $r 6] set ypos [lindex $r 7] set crd [lindex $r 8] if { $crd==$powNote(coordSys) } { set powNote(xpos) $xpos set powNote(ypos) $ypos return } } else { return } } if { $powNote(coordSys)=="graph" } { foreach {x y} [powGraphToCanvas $gn $xpos $ypos .pow.pow] {} set xpos [expr ($x - $x0) / ($x1 - $x0)] set ypos [expr ($y - $y0) / ($y1 - $y0)] } elseif { $powNote(coordSys)=="coord" } { set x [expr $xpos * ($x1-$x0) + $x0] set y [expr $ypos * ($y1-$y0) + $y0] foreach {xpos ypos} [powCanvasToGraph $gn $x $y .pow.pow] {} } set powNote(xpos) $xpos set powNote(ypos) $ypos set powNote(oldCoord) $powNote(coordSys) } proc powAddNote { gn xpos ypos string args } { #puts "powAddNote start" global powPlotParam powFontParam array set opts [list \ -font $powFontParam(noteFont,powDef) \ -size $powFontParam(noteSize,powDef) \ -weight $powFontParam(noteWeight,powDef) \ -slant $powFontParam(noteSlant,powDef) \ -color $powFontParam(noteColor,powDef) \ -coord graph \ ] foreach {opt val} $args { if { [info exists opts($opt)] } { set opts($opt) $val } else { puts "Unrecognized option $opt" } } set record [list $string $opts(-font) $opts(-size) $opts(-weight) \ $opts(-slant) $opts(-color) $xpos $ypos $opts(-coord) -1] set newID [powDrawNote $gn $record] set record [lreplace $record end end $newID] lappend powPlotParam(Notes,$gn) $record powRedrawGraphHandles $gn return $newID } proc powDeleteNote { gn idx } { #puts "powDeleteNote start" global powPlotParam set r [lindex $powPlotParam(Notes,$gn) $idx] set id [lindex $r 9] if { $id>=0 && [.pow.pow find withtag $id]!="" } { .pow.pow delete $id } set powPlotParam(Notes,$gn) \ [lreplace $powPlotParam(Notes,$gn) $idx $idx] powRedrawGraphHandles $gn } proc powDrawNote { gn record } { #puts "powDrawNote start" foreach [list string Font Size Weight Slant Color xpos ypos coordSys id] \ $record {} foreach [list x0 y1 x1 y0] [.pow.pow coord ${gn}box] {} if { $coordSys=="graph" } { set x [expr $xpos * ($x1-$x0) + $x0] set y [expr $ypos * ($y1-$y0) + $y0] } elseif { $coordSys=="coord" } { foreach {x y} [powGraphToCanvas $gn $xpos $ypos .pow.pow] {} if { $x<$x0 || $x>$x1 || $y<$y1 || $y>$y0 } { # Note not inside graph box if { $id>=0 && [.pow.pow find withtag $id]!="" } { .pow.pow delete $id } return -1 } } else { puts "Unsupported coordSys $coordSys" return -1 } if { $id>=0 && [.pow.pow find withtag $id]!="" } { .pow.pow coords $id $x $y .pow.pow itemconfig $id -text $string -fill $Color \ -font [list $Font $Size $Weight $Slant] -anchor sw \ -tags "$gn ${gn}text" } else { set id [.pow.pow create text $x $y -text $string -fill $Color \ -font [list $Font $Size $Weight $Slant] -anchor sw \ -tags "$gn ${gn}text"] .pow.pow bind $id <> "powEditNoteDlg $gn {} $id" #puts "calling powBindBtn 4" powBindBtn <> ".pow.pow bind $id" \ " powDragNote start $gn $id %X %Y " \ " powDragNote drag $gn $id %X %Y " \ " powDragNote end $gn $id %X %Y " } return $id } proc powDragNote { mode gn id X Y } { #puts "powDragNote start" global powMoveX powMoveY powIsDragging powResizeMain powNote powDWP switch -exact $mode { start { set powIsDragging 1 } drag { set dx [expr $X - $powMoveX] set dy [expr $Y - $powMoveY] .pow.pow move $id $dx $dy } end { set idx [powFindNoteIdx $gn $id] powRepositionNote $gn $idx powRedrawGraphHandles $gn set powIsDragging 0 if { [winfo exist ${powDWP}note] } { if { $gn==$powNote(gn) && $idx==$powNote(idx) } { powUpdateNoteCoord } else { powEditNoteDlg $gn {} $id } } } } set powMoveX $X set powMoveY $Y } proc powRepositionNote { gn idx } { #puts "powRepositionNote start" # Calculate the appropriate x/y position for # the note's current canvas position global powPlotParam if { $idx<0 || $idx>[llength $powPlotParam(Notes,$gn)] } return set r [lindex $powPlotParam(Notes,$gn) $idx] set coord [lindex $r 8] set id [lindex $r 9] foreach {x y} [.pow.pow coord $id] {} foreach {x0 y1 x1 y0} [.pow.pow coord ${gn}box] {} if { $coord=="graph" } { set xpos [expr ($x - $x0) / ($x1 - $x0)] set ypos [expr ($y - $y0) / ($y1 - $y0)] } elseif { $coord=="coord" } { foreach {xpos ypos} [powCanvasToGraph $gn $x $y .pow.pow] {} if { $x<$x0 || $x>$x1 || $y<$y1 || $y>$y0 } { # Note not inside graph box if { $id>=0 && [.pow.pow find withtag $id]!="" } { .pow.pow delete $id } set r [lreplace $r 9 9 -1] } } else { error "Unknown coordinate system: $coord" } set r [lreplace $r 6 7 $xpos $ypos] set powPlotParam(Notes,$gn) [lreplace $powPlotParam(Notes,$gn)\ $idx $idx $r] } proc powFindNoteIdx { gn id } { #puts "powFindNoteIdx start" global powPlotParam set idx 0 foreach r $powPlotParam(Notes,$gn) { if { [lindex $r end]==$id } break incr idx } if { $idx >= [llength $powPlotParam(Notes,$gn)] } { set idx -1 } return $idx } proc powRedrawNotes { gn } { #puts "powRedrawNotes start" global powPlotParam set i 0 set notes {} foreach r $powPlotParam(Notes,$gn) { set newID [powDrawNote $gn $r] set r [lreplace $r end end $newID] lappend notes $r } set powPlotParam(Notes,$gn) $notes } proc powAddTextToGraphDoIt { } { #puts "powAddTextToGraphDoIt start" global powDWP if [catch {selection get} gn] { set gn " " } set savebinding [bind .pow.pow ] bind .pow.pow "\ powPlaceText [list [${powDWP}addtext.text get 0.0 end] $gn %x %y .pow.pow]; destroy ${powDWP}addtext;\ bind .pow.pow \{$savebinding\}" } proc powSelectColor { varName } { #puts "powSelectColor start" upvar #0 $varName var set newClr [tk_chooseColor -initialcolor $var] if {$newClr != ""} {set var $newClr} } proc swap { a b} { #puts "swap start" upvar $a one upvar $b two set tmp $one set one $two set two $tmp } proc debug_trace {name element op} { if {$element != ""} { set name #puts "debug_trace start" ${name}($element) } upvar $name x puts "Variable $name set to $x" } proc powUpdateTrackVars {} { #puts "powUpdateTrackVars start" global powGraphCoordsTracker powImagePixelTracker powImageValueTracker powPhysicalPixelTracker global powFirstPixel powPlotParam powTrackText set gn $powTrackText(gn) if [regexp {[0-9]} $powTrackText(rx)] { if {$powPlotParam(tickLabels,$gn)=="degrees" \ && [powWCSexists $gn]} { set rx [powHourRA $powTrackText(rx)] set ry [powDegDec $powTrackText(ry)] set powGraphCoordsTracker \ "Graph coordinates:\n ( $rx, $ry )" } else { set rxVal $powTrackText(rx) if {$powPlotParam(xTickScal,$gn)=="log"} { # Make sure the log value isn't out-of-bounds if { $rxVal>300 || $rxVal<-300 } { set rxVal "***" } else { set rxVal [format "%.6lg" [expr pow(10.0,$rxVal)]] } } else { set rxVal [format "%.6lg" $rxVal] } set ryVal $powTrackText(ry) if {$powPlotParam(yTickScal,$gn)=="log"} { # Make sure the log value isn't out-of-bounds if { $ryVal>300 || $ryVal<-300 } { set ryVal "***" } else { set ryVal [format "%.6lg" [expr pow(10.0,$ryVal)]] } } else { set ryVal [format "%.6lg" $ryVal] } set powGraphCoordsTracker "Graph coordinates:\n ( $rxVal, $ryVal )" } } else { set powGraphCoordsTracker "Graph coordinates:\n ( X , X )" } #puts $powTrackText(imgx) if [regexp {[0-9]} $powTrackText(imgx)] { set result [powConvertImage2Physical [expr $powTrackText(imgx) + $powFirstPixel] [expr $powTrackText(imgy) + $powFirstPixel]] set powPhysicalPixelTracker "Physical pixel:\n ( [lindex $result 0], [lindex $result 1])" set powImagePixelTracker "Image pixel:\n ( [expr $powTrackText(imgx) + $powFirstPixel], [expr $powTrackText(imgy) + $powFirstPixel] )" } else { set powPhysicalPixelTracker "Physical pixel:\n ( X , X )" set powImagePixelTracker "Image pixel:\n ( X , X )" } if [regexp {[0-9]} $powTrackText(imgz)] { set ctoken [split $powTrackText(imgz) "."] if { [llength $ctoken] == 2 && [regexp {[0-9]} [lindex $ctoken 1]] } { set pixval [format %.16lg [expr $powTrackText(imgz)]] } else { set pixval $powTrackText(imgz) } } elseif { $powTrackText(imgz)=="NULL" } { set pixval "NULL" } else { set pixval "X" } set powImageValueTracker "Pixel value:\n $pixval ($powTrackText(zunits))" } proc powConvertPhysical2Image { x y } { global powLTM_11 powLTM_12 powLTM_21 powLTM_22 powLTV1 powLTV2 global currgn set image_x $x set image_y $y if ![info exists powLTM_11($currgn)] { set powLTM_11($currgn) [powDetermineKeyWordExist $currgn "LTM1_1"] if { $powLTM_11($currgn) == false } { # LTM1_1, LTM1_2, LTM2_1, LTM2_2, LTV1, LTV2 not exist unset powLTM_11($currgn) } else { set powLTM_12($currgn) [powDetermineKeyWordExist $currgn "LTM1_2"] set powLTM_21($currgn) [powDetermineKeyWordExist $currgn "LTM2_1"] set powLTM_22($currgn) [powDetermineKeyWordExist $currgn "LTM2_2"] set powLTV1($currgn) [powDetermineKeyWordExist $currgn "LTV1"] set powLTV2($currgn) [powDetermineKeyWordExist $currgn "LTV2"] } } if [info exists powLTM_11($currgn)] { if { $powLTM_12($currgn) == "false" } { set powLTM_12($currgn) 0 } if { $powLTM_21($currgn) == "false" } { set powLTM_21($currgn) 0 } if { $powLTM_22($currgn) == "false" } { set powLTM_22($currgn) 0 } if { $powLTV1($currgn) == "false" } { set powLTV1($currgn) 0 } if { $powLTV2($currgn) == "false" } { set powLTV2($currgn) 0 } set image_x [expr $powLTM_11($currgn) * $x + $powLTM_12($currgn) * $y + $powLTV1($currgn)] set image_y [expr $powLTM_21($currgn) * $x + $powLTM_22($currgn) * $y + $powLTV2($currgn)] } return [list $image_x $image_y] } proc powConvertRadiusPhysical2Image { phy_x phy_y img_x phy_radius } { set phy_outer_x [expr $phy_x + $phy_radius] set result [powConvertPhysical2Image $phy_outer_x $phy_y] return [expr abs([lindex $result 0] - $img_x)] } proc powConvertImage2Physical { x y } { global powLTM_11 powLTM_12 powLTM_21 powLTM_22 powLTV1 powLTV2 global currgn set physical_x $x set physical_y $y if ![info exists powLTM_11($currgn)] { set powLTM_11($currgn) [powDetermineKeyWordExist $currgn "LTM1_1"] if { $powLTM_11($currgn) == false } { # LTM1_1, LTM1_2, LTM2_1, LTM2_2, LTV1, LTV2 not exist unset powLTM_11($currgn) } else { set powLTM_12($currgn) [powDetermineKeyWordExist $currgn "LTM1_2"] set powLTM_21($currgn) [powDetermineKeyWordExist $currgn "LTM2_1"] set powLTM_22($currgn) [powDetermineKeyWordExist $currgn "LTM2_2"] set powLTV1($currgn) [powDetermineKeyWordExist $currgn "LTV1"] set powLTV2($currgn) [powDetermineKeyWordExist $currgn "LTV2"] } } if [info exists powLTM_11($currgn)] { if { $powLTM_12($currgn) == "false" } { set powLTM_12($currgn) 0 } if { $powLTM_21($currgn) == "false" } { set powLTM_21($currgn) 0 } if { $powLTM_22($currgn) == "false" } { set powLTM_22($currgn) 0 } if { $powLTV1($currgn) == "false" } { set powLTV1($currgn) 0 } if { $powLTV2($currgn) == "false" } { set powLTV2($currgn) 0 } set physical_x [expr ($powLTM_22($currgn) * ($x - $powLTV1($currgn)) - $powLTM_21($currgn) * ($y - $powLTV2($currgn))) / ($powLTM_11($currgn) * $powLTM_22($currgn) - $powLTM_12($currgn) * $powLTM_21($currgn))] set physical_y [expr ( -1.0 * $powLTM_12($currgn) * ($x - $powLTV1($currgn)) + $powLTM_11($currgn) * ($y - $powLTV2($currgn))) / ($powLTM_11($currgn) * $powLTM_22($currgn) - $powLTM_12($currgn) * $powLTM_21($currgn))] } return [list $physical_x $physical_y] } proc powConvertRadiusImage2Physical { img_x img_y phy_x img_radius } { set img_outer_x [expr $img_x + $img_radius] set result [powConvertImage2Physical $img_outer_x $img_y] return [expr abs([lindex $result 0] - $phy_x)] } proc powHelp { topic } { #puts "powHelp start topic" global env tcl_platform powHelpTopics powbg powDWP global Rw if { [string match "*.html" $topic] } { set topic [string range $topic 0 end-5] } if { [winfo exist ${powDWP}hyperhelp] == 0} { if { $tcl_platform(platform)=="windows" } { set size large } else { set size medium } set allTopics {} foreach aTopic [lsort [array names powHelpTopics]] { lappend allTopics [list $powHelpTopics($aTopic) $aTopic] } iwidgets::hyperhelp ${powDWP}hyperhelp -title "POW: Hyperhelp" \ -topics $allTopics \ -fontname courier \ -fontsize $size \ -helpdir $env(POW_HELPDIR) \ -background $powbg \ -textbackground $powbg \ -beforelink "powHelpResolveLink" # -helpdir $env(POW_LIBRARY) catch { unset Rw } } ${powDWP}hyperhelp showtopic $topic ${powDWP}hyperhelp activate update idletasks if ![info exists Rw] { scan [winfo geometry ${powDWP}hyperhelp] "%dx%d+%d+%d" Rw Rh Rx Ry catch { wm geometry ${powDWP}hyperhelp [expr $Rw / 2]x[expr $Rh / 2]+0+0 } err } else { catch { wm geometry ${powDWP}hyperhelp ${Rw}x${Rh}+0+0 } err } } proc powHelpResolveLink { path } { global g_backupDir powDWP env if {![file exists $g_backupDir/$path] && [string first $env(POW_HELPDIR) $path] < 0 } { powHelp [${powDWP}hyperhelp cget -helpdir]/$path } else { powHelp $path } } proc powMax { a b } { #puts "powMax start" return [expr ($a > $b) ? $a : $b] } proc powMin { a b } { #puts "powMin start" return [expr ($a < $b) ? $a : $b] } proc powFindFont { w {pointsizes 120} {weight medium} {slant r}} { #puts "powFindFont start" foreach family {times courier helvetica } { foreach points $pointsizes { if {[catch {$w config -font \ -*-$family-$weight-$slant-*-*-*-$points-*}] == 0} { return -*-$family-$weight-$slant-*-*-*-$points-* } } } $w config -font fixed return fixed } proc powGetFontList { gn lbl } { #puts "powGetFontList start" global powFontParam return [list \ $powFontParam(${lbl}Font,$gn) \ $powFontParam(${lbl}Size,$gn) \ $powFontParam(${lbl}Weight,$gn) \ $powFontParam(${lbl}Slant,$gn)] } proc powScopeZoom { in_or_out {scale "no"} {value -1.0}} { global currgn saveROI global powPlotParam powZoomStart global g_magnification #puts "powScopeZoom start, g_magnification: $g_magnification" #puts "powScopeZoom start, scale: $scale" if ![info exists powPlotParam(prev_magnification,$currgn)] { set powPlotParam(prev_magnification,$currgn) 1.0 set powPlotParam(new_magnification,$currgn) 1.0 set powPlotParam(g_multiplier,$currgn) 4.0 set powPlotParam(g_magnification,$currgn) 1.0 } set powPlotParam(prev_magnification,$currgn) $powPlotParam(new_magnification,$currgn) set powPlotParam(new_magnification,$currgn) $g_magnification set powPlotParam(g_magnification,$currgn) $g_magnification if ![info exists g_magnification] { if { $value == -1.0 } { set powPlotParam(new_magnification,$currgn) 1.0 set powPlotParam(g_multiplier,$currgn) 4.0 set powPlotParam(g_magnification,$currgn) 1.0 set g_magnification 1.0 } } else { if { $value == -1.0 } { # exact magnification if [regexp "reset" $in_or_out] { set g_magnification 1.0 } set powPlotParam(new_magnification,$currgn) $g_magnification } else { if [regexp "in" $in_or_out] { set powPlotParam(new_magnification,$currgn) \ [expr $powPlotParam(prev_magnification,$currgn) * $value] } else { set powPlotParam(new_magnification,$currgn) \ [expr $powPlotParam(prev_magnification,$currgn) / $value] } set g_magnification $powPlotParam(new_magnification,$currgn) set powPlotParam(g_magnification,$currgn) $g_magnification } set powPlotParam(g_multiplier,$currgn) [expr 1.0 / $powPlotParam(new_magnification,$currgn)] set value $powPlotParam(new_magnification,$currgn) } #set select_magnification $g_magnification #puts "powPlotParam(prev_magnification,$currgn): $powPlotParam(prev_magnification,$currgn)" #puts "powPlotParam(new_magnification,$currgn): $powPlotParam(new_magnification,$currgn)" #puts "powPlotParam(g_multiplier,$currgn): $powPlotParam(g_multiplier,$currgn)" #puts "powPlotParam(g_magnification,$currgn): $powPlotParam(g_magnification,$currgn)" #puts "g_magnification: $g_magnification" #puts "value: $value" if { $powPlotParam(new_magnification,$currgn) < [expr 1.0 / 64.0] } { set powPlotParam(new_magnification,$currgn) [expr 1.0 / 64.0] set g_magnification [expr 1.0 / 64.0] tk_messageBox -icon error -type ok -parent .pow \ -message "Couldn't zoom out any further." return } if { $powPlotParam(prev_magnification,$currgn) == $powPlotParam(new_magnification,$currgn) } { powEndROI 1 return } set powZoomStart($currgn) 1 #powEndROI 1 set powZoomStart($currgn) 0 #set powPlotParam(g_magnification,$currgn) $powPlotParam(new_magnification,$currgn) #set powPlotParam(prev_magnification,$currgn) $powPlotParam(g_magnification,$currgn) if { $powPlotParam(new_magnification,$currgn) == 1.0 } { powEndROI 1 set powPlotParam(prev_magnification,$currgn) 1.0 set powPlotParam(new_magnification,$currgn) 1.0 set powPlotParam(g_multiplier,$currgn) 4.0 set powPlotParam(g_magnification,$currgn) 1.0 set g_magnification 1.0 return } if [regexp "in" $in_or_out] { set multiplier [expr $powPlotParam(prev_magnification,$currgn) / $powPlotParam(new_magnification,$currgn)] } else { set multiplier 2.0 } set powPlotParam(g_multiplier,$currgn) $multiplier # set GUI value #set powPlotParam(g_magnification,$currgn) [expr 1.0 / $multiplier] #set g_magnification $powPlotParam(g_magnification,$currgn) #puts "A1 powPlotParam(prev_magnification,$currgn): $powPlotParam(prev_magnification,$currgn)" #puts "A1 powPlotParam(new_magnification,$currgn): $powPlotParam(new_magnification,$currgn)" #puts "A1 powPlotParam(g_multiplier,$currgn): $powPlotParam(g_multiplier,$currgn)" #puts "A1 powPlotParam(g_magnification,$currgn): $powPlotParam(g_magnification,$currgn)" #puts "A1 g_magnification: $g_magnification" if {! [string compare [.pow.scope find withtag ROI] ""] || ![winfo ismapped .pow.scope]} { # no ROI currently, ROI is whole graph OR no scopebox at all set ROIbbox [.pow.pow coords ${currgn}box] set halfwidth [expr ([lindex $ROIbbox 2] - [lindex $ROIbbox 0])/2.0] set halfheight [expr ([lindex $ROIbbox 3] - [lindex $ROIbbox 1])/2.0] set x_center [expr [lindex $ROIbbox 0] + $halfwidth] set y_center [expr [lindex $ROIbbox 1] + $halfheight] set new_halfwidth [expr $halfwidth * $multiplier] set new_halfheight [expr $halfheight * $multiplier] .pow.pow create rectangle \ [expr $x_center - $new_halfwidth] \ [expr $y_center - $new_halfheight] \ [expr $x_center + $new_halfwidth] \ [expr $y_center + $new_halfheight] \ -tags ROI -outline blue powEndROI 2 .pow.pow return } else { set ROIbbox [.pow.scope coords ROI] set saveROI $ROIbbox .pow.scope delete ROI } set halfwidth [expr ([lindex $ROIbbox 2] - [lindex $ROIbbox 0])/2.0] set halfheight [expr ([lindex $ROIbbox 3] - [lindex $ROIbbox 1])/2.0] set x_center [expr [lindex $ROIbbox 0] + $halfwidth] set y_center [expr [lindex $ROIbbox 1] + $halfheight] set new_halfwidth [expr $halfwidth * $multiplier] set new_halfheight [expr $halfheight * $multiplier] .pow.scope create rectangle \ [expr $x_center - $new_halfwidth] \ [expr $y_center - $new_halfheight] \ [expr $x_center + $new_halfwidth] \ [expr $y_center + $new_halfheight] \ -tags ROI -outline blue powEndROI 2 .pow.scope #puts "A powPlotParam(prev_magnification,$currgn): $powPlotParam(prev_magnification,$currgn)" #puts "A powPlotParam(new_magnification,$currgn): $powPlotParam(new_magnification,$currgn)" #puts "A powPlotParam(g_multiplier,$currgn): $powPlotParam(g_multiplier,$currgn)" #puts "A powPlotParam(g_magnification,$currgn): $powPlotParam(g_magnification,$currgn)" #puts "A g_magnification: $g_magnification" #set g_magnification $select_magnification } proc powGetCurrVariables {} { #puts "powGetCurrVariables start" global powPlotParam currgn currimg global powCurveParam global powImageParam global powFontParam if { ![info exists currgn] || $currgn=="powDef" } return foreach opt $powPlotParam(allOpts,powDef) { set powPlotParam(${opt},powDef) $powPlotParam(${opt},$currgn) } if { [info exists currimg] && $currimg != "" } { foreach opt $powImageParam(allOpts,powDef) { set powImageParam(${opt},powDef) \ $powImageParam(${opt}${currimg},$currgn) } } set crv [lindex $powPlotParam(curves,$currgn) 0] if { $crv != "NULL" } { foreach opt $powCurveParam(allOpts,powDef) { set powCurveParam(${opt},powDef) \ $powCurveParam(${opt}${crv},$currgn) } } foreach lbl $powFontParam(allTypes,powDef) { foreach opt $powFontParam(allOpts,powDef) { set powFontParam(${lbl}${opt},powDef) \ $powFontParam(${lbl}${opt},$currgn) } } } proc powSaveConfig { } { global powbg powCurveParam powImageParam powFontParam global powcursor powResizeMain currgn global showlinks powScopeHeight powScopeWidth powMinHeight powMinWidth global powPlotParam powShowScope powGUIposition global powLutButton powROIButton global POWRC currgn fvPrefObj event delete <> event delete <> event delete <> event delete <> event delete <> event delete <> event add <> event add <> event add <> event add <> if { $powROIButton != 0 && $powROIButton != "NULL" } { # Must delete BtnPress sequence to prevent it from hiding the ROI event event delete <> event add <> event add <> } if [catch {open $POWRC w} RCFILE] { error "Couldn't open $POWRC, not saving configuration" } else { puts $RCFILE "\n# Application parameters:" puts $RCFILE "set powbg \"$powbg\"" puts $RCFILE "set powcursor \"$powcursor\"" puts $RCFILE "set powResizeMain \"$powResizeMain\"" puts $RCFILE "set showlinks \"$showlinks\"" if { $powShowScope } { puts $RCFILE "set powScopeWidth \"$powScopeWidth\"" puts $RCFILE "set powScopeHeight \"$powScopeHeight\"" } else { puts $RCFILE "set powScopeWidth \"0\"" puts $RCFILE "set powScopeHeight \"0\"" } puts $RCFILE "set powMinHeight \"$powMinHeight\"" puts $RCFILE "set powMinWidth \"$powMinWidth\"" puts $RCFILE "set powGUIposition \"$powGUIposition\"" puts $RCFILE "set powLutButton \"$powLutButton\"" puts $RCFILE "set powROIButton \"$powROIButton\"" puts $RCFILE "\n# Default Font Parameters:" foreach lbl $powFontParam(allTypes,powDef) { foreach opt $powFontParam(allOpts,powDef) { puts $RCFILE "set powFontParam(${lbl}${opt},powDef)\ \"$powFontParam(${lbl}${opt},powDef)\"" } } if [info exists powPlotParam(xdimdisp,$currgn)] { set powPlotParam(xdimdisp,powDef) $powPlotParam(xdimdisp,$currgn) set powPlotParam(ydimdisp,powDef) $powPlotParam(ydimdisp,$currgn) # set result [$fvPrefObj setNewGraphSize [list $powPlotParam(xdimdisp,$currgn) $powPlotParam(ydimdisp,$currgn)]] } puts $RCFILE "\n# Default Graph Parameters:" foreach opt $powPlotParam(allOpts,powDef) { puts $RCFILE "set powPlotParam($opt,powDef)\ \"$powPlotParam($opt,powDef)\"" } puts $RCFILE "\n# Default Curve Parameters:" foreach opt $powCurveParam(allOpts,powDef) { puts $RCFILE "set powCurveParam($opt,powDef) \"$powCurveParam($opt,powDef)\"" } puts $RCFILE "\n# Default Image Parameters:" foreach opt $powImageParam(allOpts,powDef) { puts $RCFILE "set powImageParam($opt,powDef) \"$powImageParam($opt,powDef)\"" } close $RCFILE } } proc powBreakAllLinks { } { #puts "powBreakAllLinks start" #deletes all link info global axisToChainHash chainToAxisHash nextchain if [info exists axisToChainHash] { unset axisToChainHash unset chainToAxisHash unset nextchain } .pow.pow delete link } proc powLinkAxes {gn1 axis1 gn2 axis2} { #puts "powLinkAxes start" global axisToChainHash chainToAxisHash nextchain #catch stupid input if {$gn1 == $gn2} {return} if {![info exists nextchain]} { set nextchain 1 } set graphlist [powListGraphs] if {[lsearch $graphlist $gn1] == -1} {return "graph $gn1 does not exist";} if {[lsearch $graphlist $gn2] == -1} {return "graph $gn2 does not exist";} set chain1 0 set chain2 0 if {[array names axisToChainHash $gn1$axis1] != ""} {set chain1 $axisToChainHash($gn1$axis1)} if {[array names axisToChainHash $gn2$axis2] != ""} {set chain2 $axisToChainHash($gn2$axis2)} if {$chain1 == 0 && $chain2 == 0} { #new chain set axisToChainHash($gn1$axis1) $nextchain set axisToChainHash($gn2$axis2) $nextchain set chainToAxisHash($nextchain) [list $gn1$axis1 $gn2$axis2] incr nextchain } elseif {$chain1 != 0 && $chain2 !=0} { #two chains, delete one powMergeChains $chain1 $chain2 } elseif {$chain1 != 0} { #add axis 2 to chain 1 set axisToChainHash($gn2$axis2) $chain1 lappend chainToAxisHash($chain1) $gn2$axis2 } else { #add axis 1 to chain 2 set axisToChainHash($gn1$axis1) $chain2 lappend chainToAxisHash($chain2) $gn1$axis1 } } proc powMergeChains {chain1 chain2} { #puts "powMergeChains start" #delete two existing chains and make a new one consisting of all of their #members global axisToChainHash chainToAxisHash nextchain foreach axis [array names axisToChainHash] { if {$axisToChainHash($axis) == $chain1 || \ $axisToChainHash($axis) == $chain2} { set axisToChainHash($axis) $nextchain } } set chainToAxisHash($nextchain) [concat $chainToAxisHash($chain1) $chainToAxisHash($chain2)] unset chainToAxisHash($chain1) unset chainToAxisHash($chain2) } proc powBreakLink {gn axis} { #puts "powBreakLink start" #removes graph 1 axis 1 from the chain it belongs to global axisToChainHash chainToAxisHash set chain 0 if {[array names axisToChainHash $gn$axis] != ""} { set chain $axisToChainHash($gn$axis) } else { puts "Graph $gn axis $axis is not part of a chain" return } unset axisToChainHash($gn$axis) if {[llength $chainToAxisHash($chain)] <= 2} { unset chainToAxisHash($chain) } else { set chainToAxisHash($chain) [lreplace $chainToAxisHash($chain) [set bozo [lsearch $chainToAxisHash($chain) $gn$axis]] $bozo] } } proc chop {theString} { #puts "chop start" return [string range $theString 0 [expr [string length $theString]-2]] } proc powAlignChain {gn axis orient {gap default}} { #puts "powAlignChain start" #stacks all graphs in a chain either (H)orizontally or (V)ertically global axisToChainHash chainToAxisHash powResizeMain powPlotParam if {![info exists axisToChainHash($gn$axis)]} return; foreach graph $chainToAxisHash($axisToChainHash($gn$axis)) { #some (all?) graphs in a chain may be unmapped so loop until we get one #that is mapped set oldgraph [lindex $chainToAxisHash($axisToChainHash($gn$axis)) 0] set oldgraph [chop $oldgraph] if {[.pow.pow find withtag $oldgraph] != ""} break } foreach graph [lrange $chainToAxisHash($axisToChainHash($gn$axis)) 1 end] { set graph [chop $graph] if {[.pow.pow find withtag $graph] != ""} { #good, this graph is mapped set gbox [.pow.pow coords ${oldgraph}box] set bbox [.pow.pow bbox ${oldgraph}] if {[lindex $orient 0] == "H"} { if {$gap == "default"} { set gap [expr 2 * $powPlotParam(xmargin,$graph)] } set toX [expr [lindex $bbox 2] \ + $gap ] set toY [lindex $gbox 1] } else { if {$gap == "default"} { set gap [expr 2 * $powPlotParam(ymargin,$graph)] } set toX [lindex $gbox 0] set toY [expr [lindex $bbox 3] + $gap ] } set coords [.pow.pow coords ${graph}box] set fromX [lindex $coords 0] set fromY [lindex $coords 1] powMoveGraph $graph [expr int($toX - $fromX)] [expr int($toY - $fromY)] set oldgraph $graph } } powReconfigureToplevel $powResizeMain } proc powReconfigureToplevel {{resizemain 1} } { #puts "powReconfigureToplevel start" global powMinHeight powMinWidth powMaxWidth powMaxHeight global powRealMinHeight powRealMinWidth global powHeaderWidth powHeaderHeight global powContainer #resize POW window if necessary # update idletasks set bigbbox [.pow.pow bbox all] if {$resizemain && ($powContainer == "none" || $powContainer == "NULL")} { set windowX [expr [lindex $bigbbox 2] - [lindex $bigbbox 0] + 50] set windowY [expr [lindex $bigbbox 3] - [lindex $bigbbox 1] + 50] set windowX [powMax $windowX $powMinWidth ] set windowY [powMax $windowY $powMinHeight] set windowX [powMin $windowX $powMaxWidth ] set windowY [powMin $windowY $powMaxHeight] incr windowX $powHeaderWidth incr windowY $powHeaderHeight set windowX [powMax $windowX $powRealMinWidth ] set windowY [powMax $windowY $powRealMinHeight] foreach {x y} [lrange [split [wm geometry .pow] {x+-}] 2 3] {} if {$x != 0 && $y != 0} { catch {wm geometry .pow "${windowX}x${windowY}+$x+$y"} } else { catch {wm geometry .pow "${windowX}x${windowY}"} } } # Check if scrollregion has significantly changed so that one doesn't # force a full-screen update set currBnds [.pow.pow cget -scrollregion] set newBnds [list [expr [lindex $bigbbox 0] - 20] \ [expr [lindex $bigbbox 1] - 20] \ [expr [lindex $bigbbox 2] + 20] \ [expr [lindex $bigbbox 3] + 20] ] if { [expr abs([lindex $currBnds 0]-[lindex $newBnds 0])]>10 \ || [expr abs([lindex $currBnds 1]-[lindex $newBnds 1])]>10 \ || [expr abs([lindex $currBnds 2]-[lindex $newBnds 2])]>10 \ || [expr abs([lindex $currBnds 3]-[lindex $newBnds 3])]>10 } { .pow.pow configure -scrollregion $newBnds } powShowLinks } proc powChangeBg {} { #puts "powChangeBg start" global powbg powShowHandlesFlag powPlotParam set oldpowbg [.pow.pow cget -background] foreach com [info commands .pow.*] { if {[$com cget -bg] == $oldpowbg} { catch {$com configure -bg $powbg} } if {[$com cget -background] == $oldpowbg} { catch {$com configure -background $powbg} } } #catch the next line in case no graphs yet catch {.pow.currgn configure -background yellow} .pow configure -bg $powbg foreach gn [powListGraphs] { if {![regexp {scope$} $gn] && \ $powPlotParam(bgcolor,$gn) == $oldpowbg} { powGraphOptions $gn bgcolor $powbg } } } proc powExit { } { global axisToChainHash chainToAxisHash nextchain powGUI powRegionListGlobal #set powRegionListGlobal {} destroy .pow catch { unset axisToChainHash } catch { unset chainToAxisHash } catch { unset nextchain} powCleanUp } proc powLogGraph { gn x y } { #puts "powLogGraph start" global powPlotParam powCurveParam # Cannot have log plots with WCS information if { [powWCSexists $gn] && ($x=="log" || $y=="log") } { error "Cannot apply log transforms to WCS graphs" } foreach bnd [list xBot yBot xTop yTop xTickScal yTickScal] { set $bnd $powPlotParam($bnd,$gn) } if { $powPlotParam(curves,$gn) != "NULL" } { # Try to preserve the bounding box region if { $x!=$xTickScal } { if { $x=="log" } { if { $xBot>0.0 } { set xBot [expr log10($xBot)] } else { set xBot NULL } if { $xTop>0.0 } { set xTop [expr log10($xTop)] } else { set xTop NULL } } else { if { $xBot<-300 || $xBot>300 } { set xBot NULL } else { set xBot [expr pow(10.0,$xBot)] } if { $xTop<-300 || $xTop>300 } { set xTop NULL } else { set xTop [expr pow(10.0,$xTop)] } } } if { $y!=$yTickScal } { if { $y=="log" } { if { $yBot>0.0 } { set yBot [expr log10($yBot)] } else { set yBot NULL } if { $yTop>0.0 } { set yTop [expr log10($yTop)] } else { set yTop NULL } } else { if { $yBot<-300 || $yBot>300 } { set yBot NULL } else { set yBot [expr pow(10.0,$yBot)] } if { $yTop<-300 || $yTop>300 } { set yTop NULL } else { set yTop [expr pow(10.0,$yTop)] } } } set powPlotParam(xBot,$gn) $xBot set powPlotParam(yBot,$gn) $yBot set powPlotParam(xTop,$gn) $xTop set powPlotParam(yTop,$gn) $yTop } set powPlotParam(xTickScal,$gn) $x set powPlotParam(yTickScal,$gn) $y if { $x=="log" } { set x Yes } else { set x No } if { $y=="log" } { set y Yes } else { set y No } foreach crv $powPlotParam(curves,$gn) { if { $crv == "NULL" } continue set powCurveParam(logX${crv},$gn) $x set powCurveParam(logY${crv},$gn) $y } powEraseGraph $gn 1 powMapGraph $gn # powAdornGraph $gn .pow.pow # powRedrawGraphHandles $gn } proc powEraseGraph { gn {scope 1}} { #puts "powEraseGraph start" global powGUI currgn #Removes a graph from the display .pow.pow delete $gn .pow.pow delete ${gn}handles if { $currgn==$gn } { .pow.pow delete current_gn if {$powGUI && $scope} { .pow.scope delete all } } } proc powDeleteGraph { gn {opt "prompt"} } { global powFitsHeader powFitsHeaderCnt global xCount yCount powWCS #puts "powDeleteGraph start" if { $opt == "prompt" } { set feedback [promptMsg "This will permanently delete current graph.\n Do you want to continue?" \ return Yes No] if { $feedback == "CANCEL" } return } catch { powDestroyGraph $gn } err catch { powDeleteImage $gn $gn } err catch { powDeleteCurve $gn $gn } err catch { unset powFitsHeader($gn) } catch { unset powFitsHeaderCnt($gn) } catch { unset powFitsHeader(${gn}scope) } catch { unset powFitsHeaderCnt(${gn}scope) } catch { unset xCount($gn) } catch { unset xCount(${gn}scope) } catch { unset yCount($gn) } catch { unset yCount(${gn}scope) } catch { unset powWCS($gn) } catch { unset powWCS(${gn}scope) } } proc powFreeGraph { gn } { #puts "powFreeGraph start" # Called from powDestroyGraph global powOrderedGraphList set idx [lsearch -exact $powOrderedGraphList $gn] if { $idx >= 0 } { set powOrderedGraphList \ [lreplace $powOrderedGraphList $idx $idx ""] } [gNotifications default] postMessage $gn graphHasBeenDestroyed } proc powUnmapGraph { gn } { #puts "powUnmapGraph start" global currgn powScopeGn powEraseGraph $gn 1 if { $currgn == $gn } { set currgn "powDef" set powScopeGn "-" set otherGraphs [.pow.pow find withtag gbox] if {$otherGraphs != ""} { set newGraph [lindex [.pow.pow gettags [lindex $otherGraphs end]] 0] powSelectGraph $newGraph } else { powUpdateGraphMenuOptions powUpdateCurrentDialogs } } } proc powMapGraph { gn {restore_position 0}} { #puts "powMapGraph start" global powPlotParam if $restore_position { set xo $powPlotParam(xo,$gn) set yo $powPlotParam(yo,$gn) } powCreateGraph $gn $powPlotParam(curves,$gn) $powPlotParam(images,$gn) \ $powPlotParam(xunits,$gn) $powPlotParam(yunits,$gn) \ $powPlotParam(xlabel,$gn) $powPlotParam(ylabel,$gn) \ $powPlotParam(xdimdisp,$gn) $powPlotParam(ydimdisp,$gn) \ $powPlotParam(xBot,$gn) $powPlotParam(yBot,$gn) \ $powPlotParam(xTop,$gn) $powPlotParam(yTop,$gn) if $restore_position { powMoveGraphTo $gn $xo $yo .pow.pow } } proc powDeleteImage {gn img} { #puts "powDeleteImage start" global powPlotParam .pow.pow delete ${img}disp$gn catch {.pow.scope delete ${img}disp${gn}scope} .pow.pow delete current_img catch { image delete $img image delete $gn } err catch { image delete ${img}scope image delete ${gn}scope } err catch { image delete ${curve}$img image delete ${curve}$gn } err set whichImage [lsearch $powPlotParam(images,$gn) $img] set powPlotParam(images,$gn) [lreplace $powPlotParam(images,$gn) $whichImage $whichImage] } proc powDeleteCurve {gn curve} { #puts "powDeleteCurve start" #deletes global powPlotParam .pow.pow delete ${curve}$gn catch {.pow.scope delete ${curve}${gn}scope} set whichCurve [lsearch $powPlotParam(curves,$gn) $curve] set powPlotParam(curves,$gn) [lreplace $powPlotParam(curves,$gn) $whichCurve $whichCurve] } proc invert_cmap_if_flag_set { gn img } { #puts "invert_cmap_if_flag_set start" global cmap_inv powPseudoImages currimg currgn powImageParam if { $powImageParam(invert${img},$gn) } { if $powPseudoImages { ${img}disp${gn} colormap invert } else { powPhotoColorTable invert } } } proc powAddCustomLut { cmapName lut } { #puts "powAddCustomLut start" global powImageParam powbg if { [expr [llength $lut]%3]!=0 } { error "Lut must be list with multiple-of-3 elements (R G B)" } set powImageParam(cmapLUT_$cmapName,powDef) $lut set allMaps $powImageParam(allMaps,powDef) set map [lindex $allMaps end] if { [lindex $map 0] == "Custom" } { if { [lsearch -exact $map $cmapName]==-1 } { lappend map $cmapName # Add menu item to Custom menu .pow.mbar.colors.cCustom add radiobutton -label $cmapName \ -value $cmapName \ -variable powImageParam(colormap,powDef) \ -command "powCmds::colormap $cmapName" } set powImageParam(allMaps,powDef) [lreplace $allMaps end end $map] } else { lappend powImageParam(allMaps,powDef) [list Custom $cmapName] # Add Cust menu plus this item set bdVal [.pow.mbar.colors cget -bd] set idx [.pow.mbar.colors index [lindex $map 0]] incr idx menu .pow.mbar.colors.cCustom -bg $powbg -bd $bdVal .pow.mbar.colors insert $idx cascade -menu .pow.mbar.colors.cCustom \ -label "Custom" .pow.mbar.colors.cCustom add radiobutton -label $cmapName \ -value $cmapName \ -variable powImageParam(colormap,powDef) \ -command "powCmds::colormap $cmapName" } return } proc powSetLut { gn img scale {recalc {}} } { #puts "powSetLut start" global powSqueeze powSlide powClen global currimg currgn powPlotParam powImageParam set powClen 255 if {$scale == $powImageParam(scale${img},$gn) && $recalc=="" \ && [info exists powImageParam(lut${img},$gn)] } { powSetImageScale $gn $img $scale powCmapStretchIntensity $gn $img $powClen $powClen \ $powImageParam(lut${img},$gn) return } powSetImageScale $gn $img $scale set powSqueeze 0.0 set powSlide 0.0 powCmapStretchIntensity $gn $img $powClen $powClen \ [list 0 0 $powClen $powClen] } proc powSetImageScale { gn img scale } { #puts "powSetImageScale start" global powPseudoImages currimg currgn global powPlotParam powImageParam powGUI foreach {gn2 img2} [powGetColorbarLink $gn $img] {} set powImageParam(scale${img},$gn) $scale if { $gn2 != "" } { set powImageParam(scale${img2},$gn2) $scale } if { $powGUI && ![regexp scope$ $gn] } { set powImageParam(scale${img},${gn}scope) $scale if { $gn2 != "" } { set powImageParam(scale${img2},${gn2}scope) $scale } } # Make sure we only do the equalization on original image, not colorbar # nor colorbar's scope image if { $scale == "histo" } { if { $powGUI && [regexp scope$ $gn] } { set gn [string range $gn 0 [expr [string length $gn]-6]] foreach {gn2 img2} [powGetColorbarLink $gn $img] {} } if { [regexp _colorbar$ $img] } { if { $img2 != "" } { set gn $gn2 set img $img2 } } } if { $scale == "histo" } { set minmax [powImageScale $scale $img \ $powImageParam(RBmin${img},$gn) \ $powImageParam(RBmax${img},$gn)] } else { powImageScale $scale } } proc powCmapStretchIntensity { gn img cwidth clen lut } { #puts "powCmapStretchIntensity start" global powPseudoImages global powPlotParam powImageParam powGUI foreach {gn2 img2} [powGetColorbarLink $gn $img] {} set powImageParam(lut${img},$gn) $lut if { $gn2 != "" } { set powImageParam(lut${img2},$gn2) $lut } if { $powGUI && ![regexp scope$ $gn] } { set powImageParam(lut${img},${gn}scope) $lut if { $gn2 != "" } { set powImageParam(lut${img2},${gn2}scope) $lut } } if $powPseudoImages { ${img}disp${gn} cmap_stretch intensity $cwidth $clen $lut if { $gn2 != "" } { ${img2}disp${gn2} cmap_stretch intensity $cwidth $clen $lut } } else { # powPhotoColorTable $powImageParam(colormap${img},$gn) powPhotoCmapStretch $cwidth $clen $lut } } proc powBoundDiddleLut {gn img x y} { #puts "powBoundDiddleLut start" set cx [.pow.pow canvasx $x] set cy [.pow.pow canvasy $y] set bbox [.pow.pow coords ${gn}box] set lx [lindex $bbox 0] set ly [lindex $bbox 1] set ux [lindex $bbox 2] set uy [lindex $bbox 3] #make range from -1 to 1 set fx [expr (2.0 * ($cx - $lx)/($ux - $lx) - 1.0)] set fy [expr (2.0 * ($cy - $ly)/($uy - $ly) - 1.0)] powDiddleLut $gn $img $fx $fy } proc powDiddleLut { gn img slide squeeze } { #puts "powDiddleLut start" #$squeze and $slide should range from -1 to 1, not inclusive global powSqueeze powSlide currimg powClen global powPseudoImages powPlotParam powImageParam currgn set powSqueeze $squeeze set powSlide $slide if { ![info exist powClen] } return set squeeze [expr double($powSqueeze)] set slide [expr double($powSlide)] set increment [expr int($powClen * $slide)] if {$squeeze > 0 && $squeeze < 1} { set factor [expr (1.0 - $squeeze)] set increment [expr $increment + $squeeze*$powClen/5.0] } elseif {$squeeze < 0 && $squeeze > - 1} { set factor [expr 1.0/(1.0 + $squeeze)] set increment [expr $increment - ($factor - 1.0) * $powClen/5.0] } else { set factor 1.0 } for {set i 0} {$i <= $powClen} {incr i 5} { set newi [expr $i * $factor + $increment] set newi [expr ($newi < 0 ) ? 0 : $newi] set newi [expr ($newi > $powClen ) ? $powClen : $newi] lappend l2 [expr int(floor($newi))] lappend l2 $i } powCmapStretchIntensity $gn $img $powClen $powClen $l2 if { !$powPseudoImages } { powReditherImages $gn $img } } proc powShowHandles {showhandles } { #puts "powShowHandles start" global powShowHandlesFlag currgn powbg powPlotParam tcl_platform global powHiddenWindows set powShowHandlesFlag $showhandles if {$showhandles} then { .pow.pow raise current_img .pow.pow raise current_gn .pow.pow itemconfigure current_img -outline green .pow.pow itemconfigure current_gn -outline yellow .pow.pow raise buttonfg .pow.pow configure -bg $powbg foreach graph [powListGraphs] { .pow.pow itemconfigure ${graph}bkg -fill $powPlotParam(bgcolor,$graph) \ -outline $powPlotParam(bgcolor,$graph) #for win32 if {[string match "Win*" $tcl_platform(os) ] &&\ ![regexp {scope$} $graph]} { .pow.pow delete deleteMe set images $powPlotParam(images,$graph) set powPlotParam(images,$graph) 'NULL' powPlotImages $graph $images .pow.pow } } foreach key [array names powHiddenWindows "*,loc"] { foreach [list wind k] [split $key ,] {} eval .pow.pow create window $powHiddenWindows($wind,loc) \ -tags {$powHiddenWindows($wind,tags)} -window $wind \ -anchor $powHiddenWindows($wind,anchor) unset powHiddenWindows($key) } } else { .pow.pow itemconfigure ohandle -outline {} .pow.pow lower ohandle .pow.pow itemconfigure graphbkg -fill {} -outline {} # .pow.pow configure -bg white .pow.pow raise ${currgn}line foreach wind [.pow.pow find withtag canvas_window] { set windowname [.pow.pow itemcget $wind -window] set powHiddenWindows($windowname,loc) \ [.pow.pow coord $wind] set powHiddenWindows($windowname,tags) \ [.pow.pow itemcget $wind -tags] set powHiddenWindows($windowname,anchor) \ [.pow.pow itemcget $wind -anchor] .pow.pow delete $wind # $windowname configure -foreground white -background white \ # -highlightthickness 0 -relief flat } } } proc chopped {theString} { #puts "chopped start" return [string index $theString [expr [string length $theString] - 1]] } proc powShowLinks { } { #puts "powShowLinks start" global showlinks axisToChainHash chainToAxisHash .pow.pow delete link if {$showlinks} then { foreach chain [array names chainToAxisHash] { set oldaxis [chopped $chainToAxisHash($chain)] set oldgraph [chop [lindex $chainToAxisHash($chain) 0]] foreach graph [lrange $chainToAxisHash($chain) 1 end] { set axis [chopped $graph] set graph [chop $graph] set abox [.pow.pow coords ${oldgraph}box] set bbox [.pow.pow coords ${graph}box] if {$oldaxis == "X"} { set fromX [expr int(([lindex $abox 2]+[lindex $abox 0])/2.0)] set fromY [expr int([lindex $abox 3])] } else { set fromY [expr int(([lindex $abox 3]+[lindex $abox 1])/2.0)] set fromX [expr int([lindex $abox 0])] } if {$axis == "X"} { set toX [expr int(([lindex $bbox 2]+[lindex $bbox 0])/2.0)] set toY [expr int([lindex $bbox 3])] } else { set toY [expr int(([lindex $bbox 3]+[lindex $bbox 1])/2.0)] set toX [expr int([lindex $bbox 0])] } .pow.pow create line $fromX $fromY $toX $toY -tags "link" -fill pink set oldaxis $axis set oldgraph $graph } } } } proc powGetColorbarLink { gn img } { #puts "powGetColorbarLink start" global powPlotParam if { [info exists powPlotParam(Colorbar${img},$gn)] } { regexp "(.*)disp(.*)" $powPlotParam(Colorbar${img},$gn) z img2 gn2 } elseif { [info exists \ powPlotParam(Colorbar${img}_colorbar,${gn}_colorbar)] } { set img2 ${img}_colorbar set gn2 ${gn}_colorbar } else { set img2 "" set gn2 "" } return [list $gn2 $img2] } proc powSetCurrImageOpts { args } { #puts "powSetCurrImageOpts start" global powImageParam powPlotParam curr_img currimg currgn if { [info exists curr_img] && $currgn!="powDef" } { foreach img $powPlotParam(images,$currgn) { eval powSetImageOptions $currgn $img $args } } } proc powSetImageOptions {gn image {args ""}} { #puts "powSetImageOptions start" global powPlotParam powImageParam powGUI currgn foreach {gn2 image2} [powGetColorbarLink $gn $image] {} if { $args == "" } { set lst "" foreach opt $powImageParam(allOpts,powDef) { catch {lappend lst $opt $powImageParam(${opt}${image},$gn)} } return $lst } else { foreach {opt val} $args { set idx [lsearch -exact $powImageParam(allOpts,powDef) $opt] if { $idx != -1 } { set powImageParam(${opt}${image},$gn) $val if { $gn2 != "" } { set powImageParam(${opt}${image2},$gn2) $val } } if { $opt=="scale" } { powSetLut $gn $image $val forceIt } } if { [.pow.pow find withtag ${image}disp${gn}] != "" } { powSetColorTable $gn $image powReditherImages $gn $image } } } proc powPlotImages {gn images {canvas ".pow.pow"}} { #puts "powPlotImage starts" global powPlotParam powImageParam global filename_array powcursor global powPseudoImages powRBmin powRBmax if [regexp "NULL" $images] return # remove "NULL" from images list if present if [regexp "NULL" $powPlotParam(images,$gn)] { set powPlotParam(images,$gn) {} } set imgcnt 0 foreach current_image "$images" { # if image is already in list, don't plot it if {[lsearch $powPlotParam(images,$gn) $current_image]>=0} continue # Check if image's WCS/scaling is consistent with this graph if { [catch {powTestImage $gn $current_image} err] } { tk_messageBox -icon error -type ok -parent .pow \ -message "Couldn't place $current_image into graph...\ \n\n\"$err\"\n\nSkipping image." continue } incr imgcnt #puts "\nplotting image: $current_image in $gn" # Setup defaults... powDef for images, original for colorbars if { $canvas == ".pow.scope" } { set trueGn [string range $gn 0 [expr [string length $gn]-6] ] foreach opt $powImageParam(allOpts,powDef) { set powImageParam(${opt}${current_image},$gn) \ $powImageParam(${opt}${current_image},$trueGn) } set powImageParam(RBmin${current_image},$gn) \ $powImageParam(RBmin${current_image},$trueGn) set powImageParam(RBmax${current_image},$gn) \ $powImageParam(RBmax${current_image},$trueGn) # set powImageParam(lut${current_image},$gn) \ # $powImageParam(lut${current_image},$trueGn) } elseif { [string match "*_colorbar" $gn] && \ [string match "*_colorbar" $current_image] } { regexp "(.*)disp(.*)" \ $powPlotParam(Colorbar${current_image},$gn) z orig_img orig_gn foreach opt $powImageParam(allOpts,powDef) { if { ![info exists powImageParam(${opt}${current_image},$gn)] } { set powImageParam(${opt}${current_image},$gn) \ $powImageParam(${opt}${orig_img},$orig_gn) } set powImageParam(lut${current_image},$gn) \ $powImageParam(lut${orig_img},$orig_gn) } } else { foreach opt $powImageParam(allOpts,powDef) { #puts "pow.tcl: opt: ${opt}" if { ![info exists powImageParam(${opt}${current_image},$gn)] } { set powImageParam(${opt}${current_image},$gn) \ $powImageParam(${opt},powDef) #puts "pow.tcl: powImageParam(${opt},powDef): $powImageParam(${opt},powDef)" } } } # make a copy of the current image if $powPseudoImages { image create pict ${current_image}disp$gn } else { image create photo ${current_image}disp$gn } #This if block allows rescalings to persist through ROI zooms #you could get very bizarre behavior is somebodies reusing image names.... #nothing I can think of to do about that though if {![info exists powImageParam(RBmin${current_image},$gn)]} { #puts "pow.tcl: RBmin not exists" set powImageParam(RBmin${current_image},$gn) \ $powRBmin($current_image) set powImageParam(RBmax${current_image},$gn) \ $powRBmax($current_image) } set clipbox [powGetImageClipbox $gn $current_image $canvas] set powPlotParam(clipbox$current_image,$gn) $clipbox if {![regexp "clipped" $clipbox]} { # First two elements indicate location on graph to place image set x0 [lindex $clipbox 0] set y0 [lindex $clipbox 1] #puts "pow.tcl: BX0: $x0" #puts "pow.tcl: BY0: $y0" set pcoords [powGraphToCanvas $gn $x0 $y0 $canvas] set x0 [lindex $pcoords 0] set y0 [lindex $pcoords 1] #puts "pow.tcl: AX0: $x0" #puts "pow.tcl: AY0: $y0" set image_id [$canvas create image $x0 $y0 \ -image ${current_image}disp$gn -anchor sw \ -tags "$gn disp$gn\ ${current_image}disp$gn image_body\ img_$current_image"] if {$canvas == ".pow.pow" } { powBindBtn <> ".pow.pow bind $image_id" \ "powSelectImage $gn $current_image" \ "powBoundDiddleLut $gn $current_image %x %y" \ {} # The following prevents the <> binding from executing if # the <> binding is more appropriate due to modifiers # Pan Chai - commented out to make sure RegionList create correctly # powBindBtn <> ".pow.pow bind $image_id" {} {} {} if { ![info exists selImg] } {set selImg $current_image} } } lappend powPlotParam(images,$gn) $current_image powSetColorTable $gn $current_image powReditherImage $gn $current_image $canvas } if { [llength $powPlotParam(images,$gn)]==0 } { set powPlotParam(images,$gn) "NULL" } if { [info exists selImg] } { powSelectImage $gn $selImg } #puts "pow.tcl: done" } proc powDeSelectImage { } { #puts "powDeSelectImage start" global curr_img currimg powPlotParam if {[string compare [.pow.pow find withtag current_img] ""]} { .pow.pow delete current_img } catch {unset curr_img} catch {unset currimg} } proc powSelectImage {gn img} { #puts "powSelectImage start" global curr_img currimg powPlotParam powGUI currgn powPseudoImages #puts "gn: $gn, currgn: $currgn" set powPlotParam(currimg,$gn) $img if { $gn != $currgn } return #delete previous bbox rectangle .pow.pow delete current_img #make all things visible .pow.pow raise ${gn}line if { [info exists currimg] } { set prevImg $currimg set prevGn $currgn } else { set prevImg "" set prevGn "" } set currimg $img set curr_img ${img}disp$gn set tags [.pow.pow find withtag disp$gn] if { $tags != "" } { .pow.pow raise $curr_img [lindex $tags end] } if $powGUI { set scopeids [.pow.scope find withtag disp${gn}scope] if {$scopeids != ""} { .pow.scope raise img_$img [lindex $scopeids end] } } set ibbox [.pow.pow bbox ${img}disp$gn] if {$ibbox != ""} { eval [concat .pow.pow create rectangle $ibbox \ -tags [list "current_img $gn handle ohandle"] -outline green] } if { $currgn != $prevGn || $currimg != $prevImg } { powSetColorTable $currgn $currimg powUpdateGraphMenuOptions [gNotifications default] postMessage $currimg imageHasBeenSelected } } proc powSelectGraph {gn} { global powDWP global currgn currimg mag powPlotParam global powGUI powScopeGn yellowLineWidth global g_magnification #add a bit of slack around bbox foreach [list x0 y0 x1 y1] [.pow.pow bbox $gn] {} if { [llength [.pow.pow bbox $gn]] == 0 } return incr x0 -2 incr y0 -2 incr x1 2 incr y1 2 foreach [list ox0 oy0 ox1 oy1] [.pow.pow coord current_gn] {} if { ![info exists ox0] || \ [expr abs( $x0 - $ox0 ) + abs( $y0 - $oy0 ) + \ abs( $x1 - $ox1 ) + abs( $y1 - $oy1 ) ] > 1 } { #delete previous bbox rectangle .pow.pow delete current_gn .pow.pow create rectangle $x0 $y0 $x1 $y1 \ -tags "current_gn graphDragable ${gn}yhandle handle ohandle" \ -outline yellow -width $yellowLineWidth } # Rearrange graph layers and select current image if selecting new graph if { $currgn!=$gn } { [gNotifications default] postMessage $currgn graphHasBeenUnselected set currgn $gn if {[regexp "NULL" $powPlotParam(images,$gn)]} { .pow.pow delete current_img set powPlotParam(currimg,$gn) "NULL" } if $powGUI { if {! [string compare [.pow.scope find withtag ${gn}scopebox] ""]} { powRedrawScopebox } } powUpdateCurrentDialogs if ![info exists powPlotParam(prev_magnification,$currgn)] { set powPlotParam(prev_magnification,$currgn) 1.0 set powPlotParam(new_magnification,$currgn) 1.0 set powPlotParam(g_multiplier,$currgn) 4.0 set powPlotParam(g_magnification,$currgn) 1.0 } #puts "powSelectGraph powPlotParam(prev_magnification,$currgn): $powPlotParam(prev_magnification,$currgn)" #puts "powSelectGraph powPlotParam(new_magnification,$currgn): $powPlotParam(new_magnification,$currgn)" #puts "powSelectGraph powPlotParam(g_multiplier,$currgn): $powPlotParam(g_multiplier,$currgn)" #puts "powSelectGraph powPlotParam(g_magnification,$currgn): $powPlotParam(g_magnification,$currgn)" set g_magnification $powPlotParam(g_magnification,$currgn) } elseif $powGUI { if {! [string compare [.pow.scope find withtag ${gn}scopebox] ""]} { powRedrawScopebox } } # Now restore current image for this graph if { [info exists powPlotParam(currimg,$gn)] \ && $powPlotParam(currimg,$gn)!="NULL" } { powSelectImage $gn $powPlotParam(currimg,$gn) } elseif [info exists currimg] { unset currimg } .pow.pow raise ${gn}handles .pow.pow lower ${gn}bkg .pow.pow raise ${gn}text .pow.pow raise $gn .pow.pow lower graphSelect_$gn $gn .pow.pow raise current_gn powUpdateGraphMenuOptions if { [info exists powDWP] && [winfo exists ${powDWP}region]} { powSetupRegions $gn powUpdateRegionDlg $gn } [gNotifications default] postMessage $gn graphHasBeenSelected } proc powUpdateGraphMenuOptions {} { #puts "powUpdateGraphMenuOptions start" global currgn currimg powGUI global powPlotParam powImageParam powMenuOption if $powGUI { set powMenuOption(tickScal) \ "$powPlotParam(xTickScal,$currgn)-$powPlotParam(yTickScal,$currgn)" .pow.mbar.edit.tlabels entryconfigure "Decimal" \ -variable powPlotParam(tickLabels,$currgn) .pow.mbar.edit.tlabels entryconfigure "Base 60 (deg)" \ -variable powPlotParam(tickLabels,$currgn) .pow.mbar.edit.grid entryconfigure "Show Grid Lines" \ -variable powPlotParam(GridLines,$currgn) foreach clr [list White Black Blue Red] { .pow.mbar.edit.grid entryconfigure $clr \ -variable powPlotParam(GridColor,$currgn) } foreach opt [list Solid "Small Dash" "Large Dash"] { .pow.mbar.edit.grid entryconfigure $opt \ -variable powPlotParam(GridDash,$currgn) } if { [info exists currimg] && $currimg != "" } { set img $currimg set gn $currgn } else { set img "" set gn powDef } foreach colorGrp $powImageParam(allMaps,powDef) { set cName [lindex $colorGrp 0] foreach color [lrange $colorGrp 1 end] { .pow.mbar.colors.c$cName entryconfigure $color \ -variable powImageParam(colormap${img},$gn) } } .pow.mbar.colors entryconfigure "Invert Colortable" \ -variable powImageParam(invert${img},$gn) .pow.mbar.colors entryconfigure linear \ -variable powImageParam(scale${img},$gn) .pow.mbar.colors entryconfigure "square root" \ -variable powImageParam(scale${img},$gn) .pow.mbar.colors entryconfigure logarithmic \ -variable powImageParam(scale${img},$gn) .pow.mbar.colors entryconfigure "Histo Equalize" \ -variable powImageParam(scale${img},$gn) } #puts "powUpdateGraphMenuOptions end" } proc powUpdateCurrentDialogs { } { #puts "powUpdateCurrentDialogs start" global currgn powDWP if { [winfo exists ${powDWP}gEdit] } { powEditResetDialog } } proc powRedrawScopebox { } { #puts "powRedrawScopebox start" global currgn powPlotParam powScopeWidth powScopeHeight powScopeMargin global currimg powScopeGn powOrderedGraphList .pow.scope delete all # Make sure the scope's Title is up-to-date set title $powPlotParam(titleString,$currgn) if { $currgn=="powDef" } { set powScopeGn "-" } elseif { [string length $title] > 24 } { set ll [expr [string length $title]-10] set powScopeGn "[string range $title 0 11]...[string range $title $ll end]" } elseif { $title=="" } { set idx [expr [lsearch $powOrderedGraphList $currgn]+1] set powScopeGn "Untitled $idx" } else { set powScopeGn $title } # Do we need to go any further? Any curves/images in graph? if {[regexp "NULL" $powPlotParam(curves,$currgn)] && \ [regexp "NULL" $powPlotParam(images,$currgn)] } return set width [expr $powScopeWidth - 2*$powScopeMargin] set height [expr $powScopeHeight - 2*$powScopeMargin] set width [expr ($width < 10 ? 10 : $width )] set height [expr ($height< 10 ? 10 : $height)] powCreateGraph ${currgn}scope $powPlotParam(curves,$currgn) \ $powPlotParam(images,$currgn) $powPlotParam(xunits,$currgn) \ $powPlotParam(yunits,$currgn) $powPlotParam(xlabel,$currgn) \ $powPlotParam(ylabel,$currgn) \ $width $height \ NULL NULL NULL NULL .pow.scope # Raise current image if { [info exists currimg] && $currimg != "" } { set scopeids [.pow.scope find withtag disp${currgn}scope] if {$scopeids != ""} { .pow.scope raise img_$currimg [lindex $scopeids end] } } powDrawScopeROI [list \ $powPlotParam(xBot,$currgn) \ $powPlotParam(yBot,$currgn) \ $powPlotParam(xTop,$currgn) \ $powPlotParam(yTop,$currgn)] } proc powResizeScope { width height } { #puts "powResizeScope start" global powScopeWidth powScopeHeight powScopeMargin currgn global powShowScope powScopeSize global menuBarDeleteFlag # Resize Scopebox window set powScopeSize [list $width $height] if { $width && $height } { set powShowScope 1 set powScopeWidth $width set powScopeHeight $height set powScopeMargin [expr ($width+$height)/20] .pow.scope configure -width $width -height $height powLayoutGUI powRedrawScopebox } else { # set powShowScope 0 grid remove .pow.scopeframe grid remove .pow.trackers grid remove .pow.gui powDeleteMenuBarItem .pow.scope configure -width 1 -height 1 } powUpdateGeometry } proc powUpdateGeometry {} { #puts "powUpdateGeometry start" global powRealMinWidth powRealMinHeight powResizeMain # Update window geometry powSetGeometry set resize 0 foreach {dx dy} [lrange [split [wm geometry .pow] {x+-}] 0 1] {} if { $powRealMinWidth>$dx } { set dx $powRealMinWidth set resize 1 } if { $powRealMinHeight>$dy } { set dy $powRealMinHeight set resize 1 } if { $resize } { # set x [winfo x .pow] # set y [winfo y .pow] wm geometry .pow "${dx}x${dy}" } powReconfigureToplevel $powResizeMain } proc powGetCurrentGraph { } { #puts "powGetCurrentGraph start" global currgn if [info exist currgn] { if { $currgn=="powDef" } { return "" } return $currgn } else { return "" } } proc powMagImage {gn img {canvas .pow.pow}} { #puts "powMagImage start" #lowlevel routine, don't call this yourself #resizes image to match the current magstep and ROI window global powPlotParam curr_img currimg global powPseudoImages powImageParam isMac global menuBarDeleteFlag set clipbox $powPlotParam(clipbox${img},$gn) if [regexp "clipped" $clipbox] return catch {image delete ${img}disp$gn} if $powPseudoImages { image create pict ${img}disp$gn } else { image create photo ${img}disp$gn } set width [image width $img] set height [image height $img] #collect up the inputs to ship to Tk_(Pict||Photo)PutScaledBlock set x0 [lindex $clipbox 2] set y0 [lindex $clipbox 3] set x1 [lindex $clipbox 4] set y1 [lindex $clipbox 5] foreach {X0 Y0} [powPixelToCanvas $gn $img -0.5 -0.5 $canvas] {} foreach {X1 Y1} [powPixelToCanvas $gn $img \ [expr $width-0.5] [expr $height-0.5] $canvas] {} set zoomX [expr ($X1-$X0)/$width] set zoomY [expr ($Y0-$Y1)/$height] set width [expr int( ($x1 - $x0)*$zoomX + 0.5 )] set height [expr int( ($y1 - $y0)*$zoomY + 0.5 )] if { $isMac && ![powTestMacMemory [expr $width*$height]] } { tk_messageBox -type ok -icon error \ -message "Not enough memory to display $img. Will hide it\ until memory becomes available." } else { powPutZoomedBlock $img $gn $x0 $y0 $width $height $zoomX $zoomY } # set curr_img ${img}disp$gn if { $powPseudoImages } { powSetRange $gn $img \ $powImageParam(RBmin${img},$gn) $powImageParam(RBmax${img},$gn) } } proc powSetCurveOptions {gn curve {args ""}} { global powCurveParam powGUI currgn global powWCS powFitsHeader powFitsHeaderCnt xCount yCount powPlotParam if { $args == "" } { set lst "" foreach opt $powCurveParam(allOpts,powDef) { catch {lappend lst $opt $powCurveParam(${opt}${curve},$gn)} } return $lst } elseif { [llength $args] == 1 } { set opt [lindex $args 0] set idx [lsearch -exact $powCurveParam(allOpts,powDef) $opt] if { $idx != -1 } { if { $opt=="pColor" || $opt=="lColor" } { set val [powColorToHex $val] } return $powCurveParam(${opt}${curve},$gn) } else { return "" } } else { foreach {opt val} $args { set idx [lsearch -exact $powCurveParam(allOpts,powDef) $opt] if { $idx != -1 } { if { $opt=="pColor" || $opt=="lColor" } { set val [powColorToHex $val] } set powCurveParam(${opt}${curve},$gn) $val } } if { [.pow.pow find withtag ${curve}${gn}] != "" } { .pow.pow delete ${curve}${gn} powPlot1Curve $gn $curve .pow.pow if {$powGUI && ($gn == $currgn)} { .pow.scope delete ${curve}${gn}scope powPlot1Curve ${gn}scope $curve .pow.scope } } } } proc powAddCurves {gn curves} { #puts "powAddCurves start" global powPlotParam currgn powGUI powPlotCurves $gn $curves .pow.pow if { $powGUI && $gn == $currgn } { powRedrawScopebox } } proc powAddImages {gn images} { #puts "powAddImages start" global powPlotParam currgn powGUI powPlotImages $gn $images .pow.pow if { $powGUI && $gn == $currgn } { powRedrawScopebox } } proc powRemoveCurves {gn curves} { #puts "powRemoveCurves start" global powPlotParam currgn powGUI set hasChanged 0 foreach c $curves { set idx [lsearch -exact $powPlotParam(curves,$gn) $c] if { $c != "NULL" && $idx != -1 } { set hasChanged 1 .pow.pow delete $c$gn set powPlotParam(curves,$gn) \ [lreplace $powPlotParam(curves,$gn) $idx $idx] } } if { [llength $powPlotParam(curves,$gn)]==0 } { set powPlotParam(curves,$gn) "NULL" } if { $powGUI && $gn == $currgn && $hasChanged } { powRedrawScopebox } } proc powRemoveImages {gn images} { #puts "powRemoveImages start" global powPlotParam currgn powGUI set hasChanged 0 foreach i $images { set idx [lsearch -exact $powPlotParam(images,$gn) $i] if { $i != "NULL" && $idx != -1 } { set hasChanged 1 .pow.pow delete ${i}disp$gn set powPlotParam(images,$gn) \ [lreplace $powPlotParam(images,$gn) $idx $idx] } } if { [llength $powPlotParam(images,$gn)]==0 } { set powPlotParam(images,$gn) "NULL" } if { $powGUI && $gn == $currgn && $hasChanged } { powRedrawScopebox } } proc powGetCurveLength { crv } { #puts "powGetCurveLength start" array set crvInfo [powFetchCurveInfoHash $crv] array set vecInfo [powFetchVectorInfoHash $crvInfo(X)] return [powFetchDataLength $vecInfo(data)] } proc powPlot1Curve {gn crv {canvas .pow.pow}} { global powCurveParam powScopeWidth powScopeHeight global powPlotParam global xCount yCount if { $canvas == ".pow.scope" } { set trueGn [string range $gn 0 [expr [string length $gn]-6] ] foreach opt $powCurveParam(allOpts,powDef) { set powCurveParam(${opt}${crv},$gn) \ $powCurveParam(${opt}${crv},$trueGn) } } else { foreach opt $powCurveParam(allOpts,powDef) { if {! [info exists powCurveParam(${opt}${crv},$gn)]} { if { $opt == "pShape" && [powGetCurveLength $crv]>10000 \ && ($powCurveParam(LOD,powDef) == 0 || \ $powCurveParam(LOD,powDef) > 10000) } { set powCurveParam(${opt}${crv},$gn) Dot } elseif { [info exists powCurveParam(${opt}${crv},powDef)] } { set powCurveParam(${opt}${crv},$gn) \ $powCurveParam(${opt}${crv},powDef) } else { set powCurveParam(${opt}${crv},$gn) \ $powCurveParam(${opt},powDef) } } } } foreach opt $powCurveParam(allOpts,powDef) { set $opt $powCurveParam(${opt}${crv},$gn) } if { $logX || $logY } { if { [powWCSexists $gn] } { # Cannot mix WCS and log, so change options to No set powCurveParam(logX${crv},$gn) No set powCurveParam(logY${crv},$gn) No set logX No set logY No } } if { $canvas == ".pow.scope" } { # Shrink point size if drawing in the scope window if { $pSize>0 } { set pSize [expr round($pSize*($powScopeWidth+$powScopeHeight)/800.0)] if { $pSize<=1 } { set pShape Dot } } } # call curve plotting routine $canvas create powCurve $crv $gn \ -pointdisplay $pDisp \ -pointtype $pShape \ -pointsize $pSize \ -pointerror $pSizeErr \ -pointfill $pFill \ -linedisplay $lDisp \ -dash $lStyle \ -width $lWidth \ -stairstep $lStep \ -boxfill $lBoxFill \ -lfill $lColor \ -pfill $pColor \ -logx $logX \ -logy $logY \ -tags "$gn $crv$gn" \ -LOD $LOD } proc powPlotCurves {gn curves {canvas .pow.pow}} { global powPlotParam powCurveParam powcursor powResizeMain if [regexp "NULL" $curves] return #remove "NULL" from curves list if present if [regexp "NULL" $powPlotParam(curves,$gn)] {set powPlotParam(curves,$gn) { }} set crvCnt [llength $powPlotParam(curves,$gn)] foreach current_curve $curves { # if curve is already in list, don't plot it if [regexp $current_curve $powPlotParam(curves,$gn)] continue # Check if we need to assign a new color to this curve if { ![info exists powCurveParam(lColor${current_curve},$gn)] && \ ![info exists powCurveParam(lColor${current_curve},powDef)] } { set colors $powCurveParam(allColors,powDef) set nElem [lsearch $colors $powCurveParam(lColor,powDef)] # Must increment by 2* because list contains COLOR #HEX COLOR #HEX incr nElem [expr $crvCnt+$crvCnt] if { $nElem<0 } { set powCurveParam(lColor${current_curve},$gn) \ $powCurveParam(lColor,powDef) } else { while { $nElem >= [llength $colors] } { incr nElem -[llength $colors] } set powCurveParam(lColor${current_curve},$gn) \ [lindex $colors $nElem] } } if { ![info exists powCurveParam(pColor${current_curve},$gn)] && \ ![info exists powCurveParam(pColor${current_curve},powDef)] } { set colors $powCurveParam(allColors,powDef) set nElem [lsearch $colors $powCurveParam(pColor,powDef)] # Must increment by 2* because list contains COLOR #HEX COLOR #HEX incr nElem [expr $crvCnt+$crvCnt] if { $nElem<0 } { set powCurveParam(pColor${current_curve},$gn) \ $powCurveParam(pColor,powDef) } else { while { $nElem >= [llength $colors] } { incr nElem -[llength $colors] } set powCurveParam(pColor${current_curve},$gn) \ [lindex $colors $nElem] } } if { [catch {powPlot1Curve $gn $current_curve $canvas} err] } { tk_messageBox -icon error -type ok -parent .pow \ -message "Couldn't place $current_curve into graph...\ \n\n\"$err\"\n\nSkipping curve." } else { # add name to list of curves lappend powPlotParam(curves,$gn) $current_curve incr crvCnt } } } proc powWhereAmI {x y {canvas ".pow.pow"}} { set boxes [$canvas find withtag gbox] set topbox -1 set topgraph "" foreach graph [powListGraphs] { set gbox [$canvas coords ${graph}box] if { $gbox == "" } continue if { $x >= [lindex $gbox 0] && $x <= [lindex $gbox 2] \ && $y >= [lindex $gbox 1] && $y <= [lindex $gbox 3] } { set order [lsearch $boxes [$canvas find withtag ${graph}box]] if {$order>$topbox} {set topbox $order; set topgraph $graph } } } if {$topbox>=0} {return $topgraph} else {return "NULL"} } proc powWhereAmI_img {gn x y {canvas ".pow.pow"}} { set images [$canvas find withtag disp$gn] set N [llength $images] if { $N==0 } { return "NULL" } for { set i $N } { $i>0 } { } { incr i -1 set img [lindex $images $i] set ibox [$canvas bbox $img] if { $ibox == "" } continue if { $x >= [lindex $ibox 0] && $x <= [lindex $ibox 2] \ && $y >= [lindex $ibox 1] && $y <= [lindex $ibox 3] } { set tags [$canvas gettags $img] #puts "tags: $tags" set elem [lsearch -glob $tags ?*disp$gn] #puts "elem: $elem" set check [split $gn "()"] #puts "check: $check" if { [llength $check] > 1 } { # Pan Chai: check patten needed to update if the gn name is changed of table image # we got "()" special character in the gn name and only has one set if { [regexp "^(.+)disp[lindex $check 0](\\()[lindex $check 1](\\))[lindex $check 2]$" [lindex $tags $elem] dmy theImage] } { return $theImage } } else { if { [regexp "^(.+)disp$gn$" [lindex $tags $elem] dmy theImage] } { return $theImage } } } } return "NULL" } # C routines: CanvasToGraph, GraphToPixel # PixelToGraph, GraphToCanvas # TCL routines: CanvasToPixel, PixelToCanvas proc powPixelToCanvas {gn img x y {canvas .pow.pow}} { #puts "powPixelToCanvas start" set ccoords [powPixelToGraph $img $x $y] set rx [lindex $ccoords 0] set ry [lindex $ccoords 1] set ccoords [powGraphToCanvas $gn $rx $ry $canvas] #puts "PixelToCanvas - $x $y $ccoords $gn" return $ccoords } proc powCanvasToPixel {gn img x y {canvas .pow.pow}} { #puts "powCanvasToPixel start" global powPlotParam set ccoords [powCanvasToGraph $gn $x $y $canvas] #puts "powCanvasToPixel: ccoords: $ccoords" set rx [lindex $ccoords 0] set ry [lindex $ccoords 1] set ccoords [powGraphToPixel $img $rx $ry] #puts "ccoords - $x $y $ccoords" return $ccoords } proc set_tracker_info {x y {canvas ".pow.pow"}} { global powPlotParam powTrackText currimg currgn global powPseudoImages powEditObject global xCount yCount set cx [$canvas canvasx $x] set cy [$canvas canvasy $y] set gn [powWhereAmI $cx $cy $canvas] set powTrackText(gn) $gn if { $gn != "NULL" } { set gcoords [powCanvasToGraph $gn $cx $cy $canvas] set powTrackText(rx) [lindex $gcoords 0] set powTrackText(ry) [lindex $gcoords 1] set img [powWhereAmI_img $gn $cx $cy $canvas] set powTrackText(img) $img if { $img != "NULL" } { set icoords [powCanvasToPixel $gn $img $cx $cy $canvas] set imgx [expr int([lindex $icoords 0]+0.5)] set imgy [expr int([lindex $icoords 1]+0.5)] set width [image width $img] set height [image height $img] #puts "imgx: $imgx, imgy: $imgy, width: $width, height: $height" if { ($imgx < $width) && ($imgy < $height) \ && ($imgx >= 0) && ($imgy >= 0) } { set powTrackText(imgx) $imgx set powTrackText(imgy) $imgy if [info exist powPlotParam(flipD,$gn)] { switch $powPlotParam(flipD,$gn) { "X" { if { [info exists xCount($gn)] && [expr $xCount($gn) % 2] != 0 } { set powTrackText(imgx) [expr $width - $powTrackText(imgx) - 1] } } "Y" { if { [info exists yCount($gn)] && [expr $yCount($gn) % 2] != 0 } { set powTrackText(imgy) [expr $height - $powTrackText(imgy) - 1] } } "B" { if { [info exists xCount($gn)] && [expr $xCount($gn) % 2] != 0 } { set powTrackText(imgx) [expr $width - $powTrackText(imgx) - 1] } if { [info exists yCount($gn)] && [expr $yCount($gn) % 2] != 0 } { set powTrackText(imgy) [expr $height - $powTrackText(imgy) - 1] } } } } set powTrackText(imgz) [powGetImageZ $img $imgx $imgy] } else { set powTrackText(imgx) "X" set powTrackText(imgy) "X" set powTrackText(imgz) "X" } set powTrackText(zunits) [powGetImageUnits $img Z] } else { set powTrackText(imgx) "X" set powTrackText(imgy) "X" set powTrackText(imgz) "X" set powTrackText(zunits) " " } } else { set powTrackText(rx) X set powTrackText(ry) X set powTrackText(imgx) "X" set powTrackText(imgy) "X" set powTrackText(imgz) "X" set powTrackText(zunits) " " } powUpdateTrackVars } proc powStretchGraph {gn xfactor yfactor {canvas ".pow.pow"}} { #puts "powStretchGraph start, xfactor: $xfactor, yfactor: $yfactor" global powPlotParam powResizeGraph $gn $xfactor $yfactor $canvas } proc powMagGraph {gn newxmagstep newymagstep {canvas ".pow.pow"}} { #puts "powMagGraph start" global powPlotParam set xfactor \ [expr double($newxmagstep) / double($powPlotParam(xmagstep,$gn))] set yfactor \ [expr double($newymagstep) / double($powPlotParam(ymagstep,$gn))] powResizeGraph $gn $xfactor $yfactor $canvas } proc powResizeGraph {gn xfactor yfactor {canvas ".pow.pow"}} { #puts "powResizeGraph start" #lowlevel routine, don't call this yourself. Use powMagGraph or powStretchGraph #all "resizings" of a graph are done here. Don't you dare #do them elsewhere or you'll regret it. global powPlotParam powcursor powResizeMain global currimg powScopeMargin global baseX baseY global xFactor yFactor foreach el [array names powPlotParam] { set p1 [lindex [split $el ,] 0] set p2 [lindex [split $el ,] 1] if { $p2 == $gn } { set $p1 $powPlotParam($p1,$p2) } } if { [$canvas find withtag ${gn}box] == "" } return set bbox [$canvas coords ${gn}box] # save initial coordinates if {$canvas == ".pow.scope"} { set ul [list $powScopeMargin $powScopeMargin] } else { set ul [list [lindex $bbox 0] [lindex $bbox 1]] } $canvas scale $gn [lindex $bbox 0] [lindex $bbox 1] $xfactor $yfactor set fbox [$canvas coords ${gn}box] if { ![info exists baseX] } { set baseX [expr [lindex $bbox 2] - [lindex $bbox 0]] set baseY [expr [lindex $bbox 3] - [lindex $bbox 1]] } set xFactor [expr [expr [lindex $fbox 2] - [lindex $fbox 0]] / $baseX] set yFactor [expr [expr [lindex $fbox 3] - [lindex $fbox 1]] / $baseY] set powPlotParam(xmagstep,$gn) [expr $xfactor * $powPlotParam(xmagstep,$gn)] set powPlotParam(ymagstep,$gn) [expr $yfactor * $powPlotParam(ymagstep,$gn)] powSetGraphMagstep $gn $powPlotParam(xmagstep,$gn) \ $powPlotParam(ymagstep,$gn) if {![regexp "NULL" $images]} { foreach img $powPlotParam(images,$gn) { powMagImage $gn $img $canvas } } if {$canvas == ".pow.pow"} { # Redraw all the adornments .pow.pow delete ${gn}handles .pow.pow delete ${gn}shandle .pow.pow delete ${gn}yhandle #draw new tick marks and numbers to go with and new labels powDrawTicks $gn $canvas #make new GraphHandles powMakeGraphLabels $gn powMakeGraphHandles $gn powSelectGraph $gn } [gNotifications default] postMessage $gn graphHasResized } proc powRestoreGraph {gn {canvas .pow.pow}} { #puts "powRestoreGraph start" set bbox [$canvas bbox $gn] set x [lindex $bbox 0] set y [lindex $bbox 1] set mx [expr ($x < 20) ? 20 - $x : 0] set my [expr ($y < 20) ? 20 - $y : 0] powMoveGraph $gn $mx $my $canvas } proc tagXdim {can tag} { #puts "tagXdim start" set bbox [$can coords $tag] return [expr [lindex $bbox 2] - [lindex $bbox 0]] } proc tagYdim {can tag} { #puts "tagYdim start" set bbox [$can coords $tag] return [expr [lindex $bbox 3] - [lindex $bbox 1]] } proc powStretchGraphToSize {gn xdim ydim {canvas ".pow.pow"}} { #puts "powStretchGraphToSize start, xdim: $xdim, ydim: $ydim" #stretches/shrinks graph to fit in xdim/ydim size global powPlotParam powEditPlotParam set curr_xdim [tagXdim $canvas ${gn}box] set curr_ydim [tagYdim $canvas ${gn}box] set xfactor [expr double($xdim)/double($curr_xdim)] set yfactor [expr double($ydim)/double($curr_ydim)] powStretchGraph $gn $xfactor $yfactor $canvas #save requested current size of graph if ![info exists powEditPlotParam(xdimdisp,powDef)] { set powEditPlotParam(xdimdisp,powDef) $powPlotParam(xdimdisp,$gn) set powEditPlotParam(ydimdisp,powDef) $powPlotParam(ydimdisp,$gn) } set powPlotParam(xdimdisp,$gn) $xdim set powPlotParam(ydimdisp,$gn) $ydim set powEditPlotParam(xdimdisp,new) $xdim set powEditPlotParam(ydimdisp,new) $ydim if {$canvas == ".pow.pow"} { powSelectGraph $gn } } proc powDragGraph { stage X Y } { #puts "powDragGraph start" global powMoveX powMoveY powIsDragging global currgn powResizeMain switch -exact $stage { start { set powMoveX $X set powMoveY $Y set powIsDragging 1 } drag { powHideCurves $currgn powMoveHandle $currgn $X $Y } end { powShowCurves $currgn powReconfigureToplevel $powResizeMain set powIsDragging 0 } } } #Plotting routines below here ... proc powMoveGraph {gn xDist yDist {canvas ".pow.pow"}} { #puts "powMoveGraph start" global powPlotParam if { $xDist==0 && $yDist==0 } return $canvas move $gn $xDist $yDist $canvas move ${gn}handles $xDist $yDist $canvas move ${gn}yhandle $xDist $yDist incr powPlotParam(xo,$gn) $xDist incr powPlotParam(yo,$gn) $yDist [gNotifications default] postMessage $gn graphHasMoved $xDist $yDist } proc powMoveGraphTo {gn x y {canvas ".pow.pow"}} { #puts "powMoveGraphTo start" global powPlotParam set bbox [$canvas coords ${gn}box] set xDist [expr $x - [lindex $bbox 0]] set yDist [expr $y - [lindex $bbox 1]] $canvas move $gn $xDist $yDist $canvas move ${gn}handles $xDist $yDist $canvas move ${gn}yhandle $xDist $yDist set powPlotParam(xo,$gn) $x set powPlotParam(yo,$gn) $y # powRestoreGraph $gn $canvas [gNotifications default] postMessage $gn graphHasMoved $xDist $yDist } proc powRedrawGraphHandles {gn} { #puts "powRedrawGraphHandles start" global currgn if { [.pow.pow find withtag ${gn}handles] != "" } { .pow.pow delete ${gn}handles .pow.pow delete ${gn}shandle powMakeGraphHandles $gn # If this is current graph, call SelectGraph to update yellow box if { $gn == $currgn } {powSelectGraph $gn} } } proc powMakeGraphHandles {gn} { #puts "powMakeGraphHandles start" global powPlotParam env # update idletasks set bbox [.pow.pow bbox $gn] set left [lindex $bbox 0] set top [lindex $bbox 1] set right [lindex $bbox 2 ] set bot [lindex $bbox 3] #Make "handle" for graph, you can pick up the graph and #move it around by dragging this if [string match "*t*" $powPlotParam(handleposition,$gn)] { set y $top } elseif [string match "*b*" $powPlotParam(handleposition,$gn)] { set y $bot } else { set y [expr ($top + $bot)/2.0] } if [string match "*l*" $powPlotParam(handleposition,$gn)] { set x $left } elseif [string match "*r*" $powPlotParam(handleposition,$gn)] { set x $right } else { set x [expr ($left + $right)/2.0] } # .pow.ms${gn}handle - the 'ms' stands for Move/select and is necessary # to allow graph names to start with a capital set msName "ms[powCleanName $gn]handle" if [winfo exists .pow.$msName] { .pow.$msName configure -bg $powPlotParam(bgcolor,$gn) \ -text $powPlotParam(handletext,$gn) -cursor fleur } else { button .pow.$msName \ -bg $powPlotParam(bgcolor,$gn) \ -text $powPlotParam(handletext,$gn) -cursor fleur bind .pow.$msName \ "set powMoveX %X ; set powMoveY %Y" bind .pow.$msName \ "powHideCurves $gn ; powMoveHandle $gn %X %Y" bind .pow.$msName \ "+powShowCurves $gn; powSelectGraph $gn; \ powReconfigureToplevel \$powResizeMain" } raise .pow.$msName .pow.pow # .pow.pow create window $x $y \ # -tags "${gn}handle handle ghandle ${gn}handles canvas_window" \ # -anchor $powPlotParam(handleanchor,$gn) \ # -window .pow.$msName #Make "stretch handle" for graph, you will be able to expand the graph #by dragging this. set sName "s[powCleanName $gn]handle" if [winfo exists .pow.$sName] { .pow.$sName configure -bg $powPlotParam(bgcolor,$gn) \ -bitmap stretcharrow\ -cursor bottom_right_corner } else { button .pow.$sName -bg $powPlotParam(bgcolor,$gn) \ -bitmap stretcharrow \ -cursor bottom_right_corner bind .pow.$sName \ "powHideCurves $gn; powStretch $gn %X %Y" bind .pow.$sName \ "powBeginStretch $gn %X %Y; \ set fixedStretch \"yes\"; \ powStretch $gn %X %Y; " bind .pow.$sName \ "powBeginStretch $gn %X %Y; \ set fixedStretch \"no\"; \ powStretch $gn %X %Y; " bind .pow.$sName \ "powShowCurves $gn; powEndStretch $gn" } .pow.pow create window $right $bot\ -tags " ${gn}shandle shandle handle ${gn}handles canvas_window" \ -anchor se -window .pow.$sName raise .pow.$sName .pow.pow #Make a colored background .pow.pow create rectangle $bbox \ -tags "${gn}handles ${gn}bkg graphbkg" \ -fill $powPlotParam(bgcolor,$gn) -outline $powPlotParam(bgcolor,$gn) .pow.pow lower ${gn}bkg # Now create an underlying polygon with -fill {} to catch all clicks .pow.pow delete graphSelect_$gn foreach {x0 y0 x1 y1} $bbox {} .pow.pow create polygon $x0 $y0 $x0 $y1 $x1 $y1 $x1 $y0 $x0 $y0 \ -outline {} -fill {} -tags "${gn}handles graphSelect_$gn" .pow.pow lower graphSelect_$gn $gn #Store position of "Select" handle relative to graph box # update idletasks set hcoords [.pow.pow coords ${gn}handle] set bcoords [.pow.pow coords ${gn}box] set powPlotParam(handleoffsetx,$gn) \ [expr [lindex $hcoords 0] - [lindex $bcoords 0]] set powPlotParam(handleoffsety,$gn) \ [expr [lindex $hcoords 1] - [lindex $bcoords 1]] } proc powCleanName {gn} { #puts "powCleanName start" regsub -all {\.} $gn {_} a return $a } proc powHideCurves { gn } { #puts "powHideCurves start" global powPlotParam foreach crv $powPlotParam(curves,$gn) { if {$crv=="NULL"} continue #if the curve has string Z data, the next statement will fail #since the string Z data is implemented as a separate #canvas text item with the same tag and canvas text items don't #have the -hidden option... so catch it catch {.pow.pow itemconfig ${crv}${gn} -hidden 1} } } proc powShowCurves { gn } { #puts "powShowCurves start" global powPlotParam foreach crv $powPlotParam(curves,$gn) { if {$crv=="NULL"} continue #if the curve has string Z data, the next statement will fail #since the string Z data is implemented as a separate #canvas text item with the same tag and canvas text items don't #have the -hidden option... so catch it catch {.pow.pow itemconfig ${crv}${gn} -hidden 0} } } proc powMoveHandle {gn x y} { #puts "powMoveHandle start" global powMoveX powMoveY powPlotParam # Calculate root bounding box of .pow.pow canvas (- a little) set left [expr [winfo rootx .pow.pow] + 10] set top [expr [winfo rooty .pow.pow] + 10] set right [expr [winfo width .pow.pow] + $left - 20] set bott [expr [winfo height .pow.pow] + $top - 20] # Check whether we have moved outside of the .pow.pow canvas if { $x < $left } { set x $left } elseif { $x > $right } { set x $right } if { $y < $top } { set y $top } elseif { $y > $bott } { set y $bott } set dx [expr $x - $powMoveX] set dy [expr $y - $powMoveY] powMoveGraph $gn [expr $x - $powMoveX] [expr $y - $powMoveY] set powMoveX $x set powMoveY $y } proc powFindOverlapGraph { Lft Top Rgt Bot } { #puts "powFindOverlapGraph start" set gn "" foreach gnIdx [.pow.pow find withtag gbox] { foreach {lft top rgt bot} [.pow.pow bbox $gnIdx] {} if { $rgt<$Lft || $lft>$Rgt || $top>$Bot || $bot<$Top } continue set gn [lindex [.pow.pow gettags $gnIdx] 0] } return $gn } proc powBeginROI {x y {canvas .pow.pow}} { global roi_xo roi_yo saveROI global roi_xn roi_yn global currgn currimg global roi_pixelxo roi_pixelyo if {[$canvas find withtag ROI] != ""} { set saveROI [$canvas coords ROI] } set roi_xo [$canvas canvasx $x] set roi_yo [$canvas canvasy $y] set roi_xn $roi_xo set roi_yn $roi_yo if [info exists currimg] { set result [powCanvasToPixel $currgn $currimg $roi_xo $roi_yo ".pow.pow"] set roi_pixelxo [lindex $result 0] set roi_pixelyo [lindex $result 1] } $canvas create rectangle $x $y $x $y -tags ROI -outline blue } proc powDragROI {x y {canvas .pow.pow}} { #puts "powDragROI start" global roi_xo roi_yo global roi_xn roi_yn $canvas delete ROI set roi_xn [$canvas canvasx $x] set roi_yn [$canvas canvasy $y] if {![info exists roi_xo] || ![info exists roi_yo] || ($roi_xo == $roi_xn && $roi_yo == $roi_yn)} { return } $canvas create rectangle $roi_xo $roi_yo \ [$canvas canvasx $x] [$canvas canvasy $y] \ -tags ROI -outline blue } proc powPanROI {x y {canvas .pow.pow}} { #puts "powPanROI start" set ROIbbox [$canvas coords ROI] set halfwidth [expr ([lindex $ROIbbox 2] - [lindex $ROIbbox 0])/2.0] set halfheight [expr ([lindex $ROIbbox 3] - [lindex $ROIbbox 1])/2.0] $canvas delete ROI $canvas create rectangle [expr $x - $halfwidth] [expr $y - $halfheight] [expr $x + $halfwidth] [expr $y + $halfheight] -tags ROI -outline blue } proc powFlipImage { direction } { global powPlotParam powFlipPlotWCSDefault powFlipPlotFitsHeaderDefault global powContourParam global powWCS powFitsHeader powFitsHeaderCnt global currgn global xCount yCount global profile_gn set inDirection $direction set token img set idx [string first "_contour" $currgn] set currgn_contour "" set inputCurrgnIsContour "false" if { $idx >= 0 } { set inputCurrgnIsContour "true" set currgn_contour $currgn set currgn [string range $currgn 0 [expr $idx - 1]] } else { set currgn_contour ${currgn}_contour } set errorFlag [ catch { powFindData $currgn } err ] if ![info exists powPlotParam(graphType,$currgn)] { set powPlotParam(graphType,$currgn) "image" set powPlotParam(graphType,${currgn}scope) "image" } if { $errorFlag } { set errorFlag [ catch { array set crvInfo [powFetchCurveInfoHash c1_$currgn] } err ] if { !$errorFlag && [info exist powWCS(c1_$currgn)] } { set powPlotParam(graphType,c1_$currgn) "binary" set powPlotParam(zoomed,c1_$currgn) $powPlotParam(zoomed,$currgn) } set powPlotParam(graphType,$currgn) "binary" set powPlotParam(graphType,${currgn}scope) "binary" set imageInfoList {} lappend imageInfoList "data" lappend imageInfoList c1_$currgn lappend imageInfoList "width" lappend imageInfoList $powPlotParam(xdimdisp,$currgn) lappend imageInfoList "height" lappend imageInfoList $powPlotParam(ydimdisp,$currgn) } else { set obj $currgn set imageInfoList [powFetchImageInfoHash $obj] if { [expr [llength $imageInfoList] % 2] != 0 } { lappend imageInfoList DONTCARE } } set useWCS true array set powEditObject $imageInfoList if { $powWCS($currgn) == "" || [lindex [lindex $powWCS($currgn) 0] 0] == 0.0 } { set useWCS false } if { $powPlotParam(graphType,$currgn) == "binary" } { if { $useWCS == "false" } { if [info exist powWCS(c1_$currgn)] { set powPlotParam(graphType,c1_$currgn) "binary" } set powPlotParam(graphType,$currgn) "binary" set powPlotParam(graphType,${currgn}scope) "binary" } else { #tk_messageBox -message "Flipping is not available for plot using WCS info." \ # -title "Not Available" -type ok -parent .pow #return } } set refPixList [lindex $powWCS($currgn) 1] set gemoList [lindex $powWCS($currgn) 2] switch $direction { "X" - "Y" - "B" { if ![info exists powFlipPlotWCSDefault($currgn)] { set powFlipPlotWCSDefault($currgn) $powWCS($currgn) set powFlipPlotFitsHeaderDefault($currgn) $powFitsHeader($currgn) } if { ![info exists powFlipPlotWCSDefault(c1_$currgn)] && \ [info exists powWCS(c1_$currgn)] } { set powFlipPlotWCSDefault(c1_$currgn) $powWCS(c1_$currgn) set powFlipPlotFitsHeaderDefault(c1_$currgn) $powFitsHeader(c1_$currgn) } } } set directionList {} if ![info exists xCount($currgn)] { set xCount($currgn) 0 set xCount(${currgn}scope) 0 } if ![info exists yCount($currgn)] { set yCount($currgn) 0 set yCount(${currgn}scope) 0 } set powPlotParam(flipD,$currgn) $direction switch $direction { "X" - "Y" { lappend directionList $direction } "B" { lappend directionList "X" lappend directionList "Y" } "U" { if { [expr $xCount($currgn) % 2] != 0 } { lappend directionList "X" } if { [expr $yCount($currgn) % 2] != 0 } { lappend directionList "Y" } } } set setWCSFlag true set yPos 2 if { [llength $gemoList] <= 0 } { set setWCSFlag false #set powWCS($currgn) {{0.0 0.0} {$powEditObject(width) $powEditObject(height)} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} #set powWCS($currgn) {{0.0 0.0)} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set gemoList [list 1.0 -0.0 0.0 1.0] set refPixList [list $powEditObject(width) $powEditObject(height)] } else { set yPos [expr int(sqrt([llength $gemoList]))] } set naxisIdx $yPos # determine exact CDELT2 position in gemoList incr yPos set CDnExist [powDetermineKeyWordExist $currgn "CD1_1"] for {set d 0} { $d < [llength $directionList] } {incr d} { set direction [lindex $directionList $d] switch $direction { "X" { set CDELTExist [powDetermineKeyWordExist $currgn "CDELT1"] set refPixValue [expr abs($powEditObject(width) - [lindex $refPixList 0]) + 1] set refPixList [lreplace $refPixList 0 0 $refPixValue] # regardless if CDELT or CDn exist, this bit CDELT1 or CD1_1 has to be flipped set gemoValue [expr [lindex $gemoList 0] * -1.0] set gemoList [lreplace $gemoList 0 0 $gemoValue] if { $CDnExist != "false" } { # CD1_1 and CD2_1 need to be flipped set gemo2Value [expr [lindex $gemoList $naxisIdx] * -1.0] set gemoList [lreplace $gemoList $naxisIdx $naxisIdx $gemo2Value] } if { $CDELTExist != "false" } { set CDELTExist [expr $CDELTExist * -1.0] } if { $setWCSFlag == "true" } { set powWCS($currgn) [lreplace $powWCS($currgn) 1 1 $refPixList] set powWCS($currgn) [lreplace $powWCS($currgn) 2 2 $gemoList] } incr xCount($currgn) incr xCount(${currgn}scope) if { $useWCS == "true" } { if { $CDELTExist != "false" } { powChangeFitsHeaderKeyWordValue $currgn {"CDELT1" "CRPIX1"} \ $direction \ [list $CDELTExist \ [lindex $refPixList 0]] \ $refPixList } if { $CDnExist != "false" } { powChangeFitsHeaderKeyWordValue $currgn {"CD1_1" "CD2_1" "CRPIX1"} \ $direction \ [list [lindex $gemoList 0] \ [lindex $gemoList $naxisIdx] \ [lindex $refPixList 0]] \ $refPixList } } } "Y" { set CDELTExist [powDetermineKeyWordExist $currgn "CDELT2"] set refPixValue [expr $powEditObject(height) - [lindex $refPixList 1] + 1] set refPixList [lreplace $refPixList 1 1 $refPixValue] # regardless if CDELT or CDn exist, this bit CDELT2 or CD2_2 has to be flipped set gemoValue [expr [lindex $gemoList $yPos] * -1] set gemoList [lreplace $gemoList $yPos $yPos $gemoValue] if { $CDnExist != "false" } { set gemo2Value [expr [lindex $gemoList [expr $naxisIdx - 1]] * -1.0] set gemoList [lreplace $gemoList [expr $naxisIdx - 1] \ [expr $naxisIdx - 1] $gemo2Value] } if { $CDELTExist != "false" } { set CDELTExist [expr $CDELTExist * -1.0] } if { $setWCSFlag == "true" } { set powWCS($currgn) [lreplace $powWCS($currgn) 1 1 $refPixList] set powWCS($currgn) [lreplace $powWCS($currgn) 2 2 $gemoList] } incr yCount($currgn) incr yCount(${currgn}scope) if { $useWCS == "true" } { if { $CDELTExist != "false" } { powChangeFitsHeaderKeyWordValue $currgn {"CDELT2" "CRPIX2"} \ $direction \ [list $CDELTExist \ [lindex $refPixList 1]] \ $refPixList } if { $CDnExist != "false" } { powChangeFitsHeaderKeyWordValue $currgn {"CD2_2" "CD1_2" "CRPIX2"} \ $direction \ [list [lindex $gemoList $yPos] \ [lindex $gemoList [expr $naxisIdx - 1]] \ [lindex $refPixList 1]] \ $refPixList } } } } #puts "CDnExit: $CDnExist, CDELTExist: $CDELTExist" if { $powPlotParam(graphType,$currgn) == "image" } { powCreateDataFlip $currgn $direction $powEditObject(height) $powEditObject(width) } } if { $inDirection == "U" } { set xCount($currgn) 0 set yCount($currgn) 0 set xCount(${currgn}scope) 0 set yCount(${currgn}scope) 0 } #powDebugDataPrint "$currgn" $powFitsHeader($currgn) #powAdornGraph $currgn .pow.pow if { $inputCurrgnIsContour == "false" } { powRedrawGraphHandles $currgn powRedrawScopebox powEndROI 1 } else { if { $currgn_contour != "" && [info exists powContourParam(separate)] && \ $powContourParam(separate) == "yes" } { powMakeContours $powContourParam(image) \ $powContourParam(list) \ $powContourParam(res) powRedrawScopebox #powEndROI 1 } } } proc powDebugDataPrint { title string } { puts "$title" set k 0 for {set i 0} {$i < [string length $string]} {incr i 80} { set currentStr [string range $string $i [expr $i + 79]] puts "<$currentStr>" incr k } puts "count: $k" } proc powDetermineKeyWordExist { img keyword } { global powFitsHeader set str $powFitsHeader($img) set findFlag false set i 0 while { 1 } { set currentStr [string range $str $i [expr $i + 79]] incr i 80 if { [string trim $currentStr] == "" } { if { $i > [string length $str] } break continue } set currentStrToken [split $currentStr "=/"] set headerT [string trim [lindex $currentStrToken 0]] set valueT [string trim [lindex $currentStrToken 1]] if { [string tolower $headerT] == "end" } { break } if { $headerT == $keyword } { set findFlag $valueT break } } return $findFlag } proc powChangeFitsHeaderKeyWordValue { img keywordList direction changeList refPixList } { global powFitsHeader powWCS powFitsHeaderCnt global xCount yCount #puts "powChangeFitsHeaderKeyWordValue: keywordList: $keywordList" #puts " : changeList : $changeList" set changeListDone {} set str $powFitsHeader($img) set i 0 set powFitsHeaderStrCnt 0 set powFitsHeaderStr "" while { 1 } { set currentStr [string range $str $i [expr $i + 79]] incr i 80 if { [string trim $currentStr] == "" } { if { $i > [string length $str] } break continue } set currentStrToken [split $currentStr "=/"] set headerT [string trim [lindex $currentStrToken 0]] set valueT [string trim [lindex $currentStrToken 1]] set header [lindex $currentStrToken 0] set value [lindex $currentStrToken 1] set comment [lindex $currentStrToken 2] if { [string tolower $headerT] == "end" } { set endStr $currentStr break } set findFlag false set idx [lsearch -exact $keywordList $headerT] set keyword "" if { $idx < 0 } { set headerT [string range $headerT 0 [expr [string length $headerT] - 2]] set idx [lsearch -exact $keywordList $headerT] if { $idx >= 0 } { set findFlag true set keyword [lindex $keywordList $idx] } } else { set findFlag true set keyword [lindex $keywordList $idx] } if { $findFlag == "true" } { lappend changeListDone $keyword switch -glob $keyword { "CROTA2" - "CRPIX*" { set newStr [format "%.10E " [lindex $changeList $idx]] } "CD*" { set testStr [string trim $value] if { [string range $testStr 0 0] == "-" } { set testStr [string range $testStr 1 end] } else { set testStr [format " -%s" $testStr] } set newStr [format "%s " $testStr] } "CTYPE*" { set newStr [format "'%s' " [lindex $changeList $idx]] } } if { [llength $currentStrToken] == 2 } { set newStr [format "%-s=%22s" $header $newStr] set newStr [format "%s%[expr 80 - [string length $newStr]]s" $newStr " "] } elseif { [llength $currentStrToken] == 3 } { set newStr [format "%-s=%[string length $value]s/%s" $header $newStr $comment] } } else { set newStr $currentStr } # make sure final card is 80 characters long set newStr [string range $newStr 0 79] if { $powFitsHeaderStrCnt == 0 } { set powFitsHeaderStr $newStr } else { set powFitsHeaderStr [format "%s%s" $powFitsHeaderStr $newStr] } incr powFitsHeaderStrCnt } # check to see if any keyword required by user is not in original header if { [llength $changeListDone] != [llength $keywordList] } { set restKeywordList {} set restKeywordValueList {} for { set i 0 } {$i < [llength $keywordList]} {incr i} { set idx [lsearch -exact $changeListDone [lindex $keywordList $i]] if { $idx < 0 } { lappend restKeywordList [lindex $keywordList $i] lappend restKeywordValueList [lindex $changeList $i] } } for { set i 0 } {$i < [llength $restKeywordList]} {incr i} { set newStr [format "%-8s=%21s" [lindex $restKeywordList $i] \ [lindex $restKeywordValueList $i]] set newStr [format "%s%[expr 80 - [string length $newStr]]s" $newStr " "] set powFitsHeaderStr [format "%s%s" $powFitsHeaderStr $newStr] incr powFitsHeaderCnt($img) } } # add end token string set powFitsHeaderStr [format "%s%s" $powFitsHeaderStr $endStr] if { $direction != "U" } { set powFitsHeader($img) $powFitsHeaderStr set powFitsHeader(${img}scope) $powFitsHeaderStr } else { set powFitsHeader(${img}scope) $powFitsHeader($img) } set powWCS(${img}scope) $powWCS($img) if [info exists powFitsHeader(c1_$img)] { # set powWCS(c1_$img) $powWCS($img) set powFitsHeader(c1_$img) $powFitsHeader($img) set powFitsHeaderCnt(c1_$img) $powFitsHeaderCnt($img) set xCount(c1_$img) $xCount($img) set yCount(c1_$img) $yCount($img) } powResetWcsStructure -d $img $direction [lindex $refPixList 0] [lindex $refPixList 1] } proc powEndROI { zoomback {canvas .pow.pow}} { global saveROI powGUI global roi_xo roi_yo global roi_xn roi_yn r_staticYonG r_staticX0onG ROIbbox global roi_pixelxn roi_pixelyn global ROIunits powZoomStart global g_magnification global xCount yCount global powWCS powFitsHeader powFitsHeaderCnt global currentGraphList global powWCSLabel global powDrawDone #if zoomback is true, we're restoring the "default size" of the graph #otherwise, this is the end of a user dragging an ROI box global powPlotParam currgn axisToChainHash chainToAxisHash powResizeMain powEditPlotParam global powGraphsTagRangeList powTagsColorMap currimg global powGraphsTagRectList if { [info exists roi_xn] && [info exist currimg] } { set result [powCanvasToPixel $currgn $currimg $roi_xn $roi_yn ".pow.pow"] set roi_pixelxn [lindex $result 0] set roi_pixelyn [lindex $result 1] } #Guard against the simple click. if { [info exists roi_xo] && [info exists roi_xn] && [info exists roi_yo] && [info exists roi_yn] } { if {$zoomback ==0 && $roi_xo == $roi_xn && $roi_yo == $roi_yn} { if {$canvas != ".pow.scope" } { $canvas delete ROI unset roi_xo roi_xn roi_yo roi_yn } return } } set zoomback [expr $zoomback % 2] #puts "zoomback: $zoomback" if {$canvas == ".pow.scope"} { set currgraph ${currgn}scope # If graph is empty, scopebox will be empty, so don't draw ROI if { [.pow.scope find withtag ${currgraph}box]=="" } { .pow.scope delete ROI return } } else { set currgraph $currgn } if {!($zoomback)} { set ROIbbox [$canvas coords ROI] #puts "ROIbbox: $ROIbbox" set x0 [lindex $ROIbbox 0] set x1 [lindex $ROIbbox 2] set y0 [lindex $ROIbbox 3] set y1 [lindex $ROIbbox 1] if { $canvas==".pow.pow" } { # Find which graph ROI overlaps, if any set overlap_gn [powFindOverlapGraph $x0 $y1 $x1 $y0] if { $overlap_gn != "" && $overlap_gn!=$currgn } { powSelectGraph $overlap_gn set currgraph $currgn } } #get "real" coordinates of ROIbbox set gcoords [powCanvasToGraph $currgraph $x0 $y0 $canvas] set llx [lindex $gcoords 0] set lly [lindex $gcoords 1] set gcoords [powCanvasToGraph $currgraph $x1 $y1 $canvas] set urx [lindex $gcoords 0] set ury [lindex $gcoords 1] set r_staticYonG [expr ($lly + $ury) / 2.0] set r_staticX0onG $llx } else { catch { powResetWcsStructure -r $currgn 0.0 0.0 } } set graphlist $currgn if {[array names axisToChainHash ${currgn}X] != ""} { set graphlist [concat $graphlist $chainToAxisHash($axisToChainHash(${currgn}X))] } if {[array names axisToChainHash ${currgn}Y] != ""} { set graphlist [concat $graphlist $chainToAxisHash($axisToChainHash(${currgn}Y))] } set currentGraphList $graphlist set principal 1 foreach graph [concat $graphlist] { set graphIdx 0 if [info exists currimg] { set graphIdx [lsearch -exact $powPlotParam(images,$graph) $currimg] } if {!$principal} { set axis [chopped $graph] set graph [chop $graph] } if {!$zoomback} { if $principal { #note rROIbbox is in "scientific" coordinate, other bboxs are in "X" coordinates (i.e. upper left origin) set rROIbbox [list $llx $lly $urx $ury] if { $canvas != ".pow.scope" } { $canvas delete ROI } } else { if {$axis == "X"} { set abox [.pow.pow coords ${graph}box] set cllx $llx set clly [lindex [powCanvasToGraph $graph \ [lindex $abox 0] [lindex $abox 3] .pow.pow] 1] set curx $urx set cury [lindex [powCanvasToGraph $graph \ [lindex $abox 2] [lindex $abox 1] .pow.pow] 1] set rROIbbox [list $cllx $clly $curx $cury] } else { set abox [.pow.pow coords ${graph}box] set cllx [lindex [powCanvasToGraph $graph \ [lindex $abox 0] [lindex $abox 3] .pow.pow] 0] set clly $lly set curx [lindex [powCanvasToGraph $graph \ [lindex $abox 2] [lindex $abox 1] .pow.pow] 0] set cury $ury set rROIbbox [list $cllx $clly $curx $cury] } } } #get together everything you need for the next call to powCreateGraph set graph_position [.pow.pow coords ${graph}handle] set ROIcurves $powPlotParam(curves,$graph) set ROIimages $powPlotParam(images,$graph) set selection $powPlotParam(wcsName,$currgn) if { $selection == "WCS" } { set selection "DEFAULT" } else { set selection [string toupper [string range $selection end end]] } set powPlotParam(xunits,$graph) $powWCSLabel(xunit,$graph,$selection) set powPlotParam(yunits,$graph) $powWCSLabel(yunit,$graph,$selection) #puts "selection: $selection, graph: $graph" #puts "powPlotParam(xunits,$graph): $powWCSLabel(xunit,$graph,$selection)" #puts "powPlotParam(yunits,$graph): $powWCSLabel(yunit,$graph,$selection)" #puts "powPlotParam(xlabel,$graph): $powWCSLabel(xlabel,$graph,$selection)" #puts "powPlotParam(ylabel,$graph): $powWCSLabel(ylabel,$graph,$selection)" if ![info exist powWCSLabel(xlabel,$graph,$selection)] { set powWCSLabel(xlabel,$graph,$selection) "" } if ![info exist powWCSLabel(ylabel,$graph,$selection)] { set powWCSLabel(ylabel,$graph,$selection) "" } set powPlotParam(xlabel,$graph) $powWCSLabel(xlabel,$graph,$selection) set powPlotParam(ylabel,$graph) $powWCSLabel(ylabel,$graph,$selection) set ROIunits [list $powPlotParam(xunits,$graph) \ $powPlotParam(yunits,$graph) \ $powPlotParam(xlabel,$graph) \ $powPlotParam(ylabel,$graph) ] set ROIgraphOptions [powGetGraphOptions $graph] #puts "powEndROI powPlotParam(xmagstep,$currgn): $powPlotParam(xmagstep,$currgn)" #puts "powEndROI powPlotParam(prev_magnification,$currgn): $powPlotParam(prev_magnification,$currgn)" #puts "powEndROI powPlotParam(new_magnification,$currgn): $powPlotParam(new_magnification,$currgn)" #puts "powEndROI powPlotParam(g_multiplier,$currgn): $powPlotParam(g_multiplier,$currgn)" #puts "powEndROI powPlotParam(g_magnification,$currgn): $powPlotParam(g_magnification,$currgn)" #puts "powEndROI g_magnification: $g_magnification" # powUnmapGraph $graph 0 #puts "powPlotParam(xBot,$currgn) $powPlotParam(xBot,$currgn)" #puts "powPlotParam(xTop,$currgn) $powPlotParam(xTop,$currgn)" #puts "powPlotParam(yBot,$currgn) $powPlotParam(yBot,$currgn)" #puts "powPlotParam(yTop,$currgn) $powPlotParam(yTop,$currgn)" #puts "powPlotParam(xdimdisp,$currgn): $powPlotParam(xdimdisp,$currgn)" #puts "powPlotParam(zoomed,$currgn) $powPlotParam(zoomed,$currgn)" if {$zoomback} { if { ![info exists powZoomStart($currgn)] || $powZoomStart($currgn) != 1 } { set powPlotParam(zoomed,$graph) 1 eval [concat powCreateGraph $graph \{$ROIcurves\} \{$ROIimages\} \ $ROIunits $powPlotParam(xdimdisp,$graph) \ $powPlotParam(ydimdisp,$graph)] } else { set powPlotParam(xBot,$graph) $powPlotParam(xBot,$currgn) set powPlotParam(xTop,$graph) $powPlotParam(xTop,$currgn) set powPlotParam(yBot,$graph) $powPlotParam(yBot,$currgn) set powPlotParam(yTop,$graph) $powPlotParam(yTop,$currgn) set powPlotParam(zoomed,$graph) $powPlotParam(zoomed,$currgn) } set rROIbbox [list $powPlotParam(xBot,$graph) \ $powPlotParam(yBot,$graph) \ $powPlotParam(xTop,$graph) \ $powPlotParam(yTop,$graph) ] } else { set powPlotParam(zoomed,$currgn) 1 if [info exists powPlotParam(zoomed,c1_$currgn)] { set powPlotParam(zoomed,c1_$currgn) 1 } eval [concat powCreateGraph $graph \{$ROIcurves\} \{$ROIimages\} \ $ROIunits $powPlotParam(xdimdisp,$graph) \ $powPlotParam(ydimdisp,$graph) $rROIbbox] } eval [concat powGraphOptions $graph $ROIgraphOptions] set principal 0 if { [llength $ROIimages] > 1 } { # this is a movie powSelectImage $graph [lindex $powPlotParam(images,$graph) $graphIdx] } } if {$powGUI && $canvas != ".pow.scope"} { .pow.scope delete ROI powDrawScopeROI $rROIbbox } if {[info exists powGraphsTagRangeList($currgn)]} { foreach tagrangelist [concat $powGraphsTagRangeList($currgn)] { set tag [lindex $tagrangelist 3] eval [concat powColorRange $currgn $tagrangelist $powTagsColorMap($tag) 1] } } if {[info exists powGraphsTagRectList($currgn)]} { foreach tagrectlist [concat $powGraphsTagRectList($currgn)] { set tag [lindex $tagrectlist 4] eval [concat powColorRect $currgn $tagrectlist $powTagsColorMap($tag) 1] } } if { $zoomback == 1 } { # zoom back to original set powPlotParam(prev_magnification,$currgn) 1.0 set powPlotParam(new_magnification,$currgn) 1.0 set powPlotParam(g_multiplier,$currgn) 4.0 set powPlotParam(g_magnification,$currgn) 1.0 set g_magnification 1.0 } # this is for editing the graph set powEditPlotParam(xBot,new) $powPlotParam(xBot,$currgn) set powEditPlotParam(yBot,new) $powPlotParam(yBot,$currgn) set powEditPlotParam(xTop,new) $powPlotParam(xTop,$currgn) set powEditPlotParam(yTop,new) $powPlotParam(yTop,$currgn) set powDrawDone 1 } proc powDrawScopeROI { rROIbbox } { #puts "powDrawScopeROI start" global currgn set gn ${currgn}scope # If graph is empty, scopebox will be empty, so don't draw ROI if { [.pow.scope find withtag ${gn}box]=="" } return set rllx [lindex $rROIbbox 0] set rlly [lindex $rROIbbox 1] set rurx [lindex $rROIbbox 2] set rury [lindex $rROIbbox 3] set ccoords [powGraphToCanvas $gn $rllx $rlly .pow.scope] set ulx [lindex $ccoords 0] set lry [lindex $ccoords 1] set ccoords [powGraphToCanvas $gn $rurx $rury .pow.scope] set lrx [lindex $ccoords 0] set uly [lindex $ccoords 1] .pow.scope create rectangle $ulx $uly $lrx $lry -tags ROI -outline blue } #Select the graph if it is not the current graph. Then replot it. proc powDrawOriginal {x y} { #puts "powDrawOriginal start" global powDrawOriginalFlag global currgn set powDrawOriginalFlag true set gn [powWhereAmI $x $y] if {$gn != $currgn } { if { $gn != "NULL" } { set currgn $gn } else { # outside of graph, possible on scope set gn $currgn } powSelectGraph $gn } powEndROI 1 } proc powStretch {gn x y} { #puts "powStretch start" global stretchX0 stretchY0 global powPlotParam global fixedStretch new_xdim new_ydim global yellowLineWidth global ulx_yellow uly_yellow lrx_yellow lry_yellow global powHandX0 powHandY0 global powGBWidth powGBHeight global powrootx powrooty # Calculate root bounding box of allowed area of the canvas (- a little) if { ![info exists powrootx] || ![info exists powrooty] } { return } set cx [.pow.pow canvasx [expr $x - $powrootx]] set cy [.pow.pow canvasy [expr $y - $powrooty]] set left [expr $ulx_yellow + 30] set top [expr $uly_yellow + 30] set right [.pow.pow canvasx [expr [winfo width .pow.pow] - 20]] set bott [.pow.pow canvasy [expr [winfo height .pow.pow] - 20]] # Check whether we have moved outside of the .pow.pow canvas # or past the upper left corner of the current_gn box if { $cx < $left } { set cx $left } elseif { $cx > $right } { set cx $right } if { $cy < $top } { set cy $top } elseif { $cy > $bott } { set cy $bott } .pow.pow delete current_gn #how far have we moved the stretch-handle? set dx [expr $cx - $stretchX0] set dy [expr $cy - $stretchY0] #check magstep # calculate new xfactor from change in size of graphbox if { [expr $powGBWidth + $dx] < 1 } { set dx [expr 1 - $powGBWidth] } if { [expr $powGBHeight + $dy] < 1 } { set dy [expr 1 - $powGBHeight] } set xfactor [expr double($powGBWidth + $dx) / double($powGBWidth) ] set yfactor [expr double($powGBHeight + $dy) / double($powGBHeight)] if { $fixedStretch == "yes" } { if { $xfactor < $yfactor } { set yfactor $xfactor set dy [expr double($powGBHeight) * ($yfactor - 1.0)] } else { set xfactor $yfactor set dx [expr double($powGBWidth) * ($xfactor - 1.0)] } } #Move the stretch-handle .pow.pow coords ${gn}shandle [expr $powHandX0 + $dx] [expr $powHandY0 +$dy] #make new current_gn .pow.pow create rectangle $ulx_yellow $uly_yellow \ [expr $lrx_yellow + $dx] [expr $lry_yellow + $dy] \ -tags "current_gn graphDragable ${gn}yhandle handle ohandle" \ -outline yellow -width $yellowLineWidth set new_xdim [expr $xfactor * $powGBWidth] set new_ydim [expr $yfactor * $powGBHeight] #make magstep label set sizeText [format "%4d x %4d" [expr round($new_xdim)] \ [expr round($new_ydim)] ] .pow.ms[powCleanName ${gn}]handle configure -text "GraphSize: $sizeText" } proc powBeginStretch {gn x y} { #puts "powBeginStretch start" global powPlotParam ulx_yellow uly_yellow lrx_yellow lry_yellow global yellowLineWidth stretchX0 stretchY0 stretchGBWidth stretchGBHeight global powHandX0 powHandY0 global powGBWidth powGBHeight global powrootx powrooty powSelectGraph $gn set bbox [.pow.pow coords current_gn] set ulx_yellow [lindex $bbox 0] set uly_yellow [lindex $bbox 1] set lrx_yellow [lindex $bbox 2] set lry_yellow [lindex $bbox 3] set handcoords [.pow.pow coords ${gn}shandle] set powHandX0 [lindex $handcoords 0] set powHandY0 [lindex $handcoords 1] set gbox [.pow.pow coords ${gn}box] set powGBWidth [expr [lindex $gbox 2] - [lindex $gbox 0]] set powGBHeight [expr [lindex $gbox 3] - [lindex $gbox 1]] set powrootx [winfo rootx .pow.pow] set powrooty [winfo rooty .pow.pow] set stretchX0 [.pow.pow canvasx [expr $x - $powrootx ]] set stretchY0 [.pow.pow canvasy [expr $y - $powrooty ]] } proc powEndStretch {gn} { #puts "powEndStretch start" global powcursor powResizeMain powPlotParam global fixedStretch new_xdim new_ydim powStretchGraphToSize $gn $new_xdim $new_ydim powSelectGraph $gn powReconfigureToplevel $powResizeMain } proc powStartNewRow { } { #puts "powStartNewRow start" global powOpenAreaTop # update idletasks set powOpenAreaTop [lindex [.pow.pow bbox all] 3] } proc powInitGraph {gn xMin xMax yMin yMax xunits yunits xLabel yLabel \ {canvas ".pow.pow"} \ {xDim 600} {yDim 400} \ {xDimDisp 600} {yDimDisp 400} {aspect yes} \ {xmargin 60} {ymargin 60} } { # An array of plotting parameters global powPlotParam powOpenAreaTop powbg powScopeMargin powFontParam global powHeaderWcsKeyWord global powWCSList catch { wm deiconify .pow } #####################Plot set powPlotParam(images,$gn) "NULL" set powPlotParam(curves,$gn) "NULL" #set powPlotParam(zoomed,$gn) 0 if ![info exists powPlotParam(zoomed,$gn)] { set powPlotParam(zoomed,$gn) 0 } if {![info exists powOpenAreaTop]} {set powOpenAreaTop 10} if { $canvas == ".pow.scope" } { set powPlotParam(xo,$gn) $powScopeMargin set powPlotParam(yo,$gn) $powScopeMargin } elseif {[info exists powPlotParam(xo,$gn)]} { # Do nothing, thereby keeping the xo/yo values intact } elseif {$canvas == ".pow.pow"} then { # update idletasks set bbox [.pow.pow bbox all] if {$bbox != ""} { set leftSide [lindex $bbox 0] .pow.pow addtag currentRow enclosed $leftSide $powOpenAreaTop \ [lindex $bbox 2] [lindex $bbox 3] # update idletasks set bbox [.pow.pow bbox currentRow] .pow.pow dtag currentRow if {$bbox != ""} then { set powPlotParam(xo,$gn) [expr [lindex $bbox 2] + $xmargin] } else { set powPlotParam(xo,$gn) [expr $leftSide + $xmargin] } } else { set powPlotParam(xo,$gn) $xmargin } set powPlotParam(yo,$gn) [expr $powOpenAreaTop + $ymargin ] } set powPlotParam(graphHeight,$gn) $yDim set powPlotParam(graphWidth,$gn) $xDim set powPlotParam(xBot,$gn) $xMin set powPlotParam(xTop,$gn) $xMax set powPlotParam(xunits,$gn) $xunits set powPlotParam(xlabel,$gn) $xLabel set powPlotParam(yBot,$gn) $yMin set powPlotParam(yTop,$gn) $yMax set powPlotParam(yunits,$gn) $yunits set powPlotParam(ylabel,$gn) $yLabel ###################defaults for optional graph params handled by # powGraphOptions if {![info exists powPlotParam(bgcolor,$gn)]} { set powPlotParam(bgcolor,$gn) $powbg } if {![info exists powPlotParam(xmargin,$gn)]} { set powPlotParam(xmargin,$gn) $xmargin } if {![info exists powPlotParam(ymargin,$gn)]} { set powPlotParam(ymargin,$gn) $ymargin } if {![info exists powPlotParam(handletext,$gn)]} { set powPlotParam(handletext,$gn) "Select/Move: $gn" } if {![info exists powPlotParam(handleanchor,$gn)]} { set powPlotParam(handleanchor,$gn) "sw" } if {![info exists powPlotParam(handleposition,$gn)]} { set powPlotParam(handleposition,$gn) "tl" } if {![info exists powPlotParam(titleString,$gn)]} { set powPlotParam(titleString,$gn) "$gn" } if {![info exists powPlotParam(titlePosition,$gn)]} { set powPlotParam(titlePosition,$gn) "n" } if {![info exists powPlotParam(titleAnchor,$gn)]} { set powPlotParam(titleAnchor,$gn) "s" } # Axis tick and grid options... if {![info exists powPlotParam(GridLines,$gn)]} { set powPlotParam(GridLines,$gn) $powPlotParam(GridLines,powDef) } if {![info exists powPlotParam(GridColor,$gn)]} { set powPlotParam(GridColor,$gn) $powPlotParam(GridColor,powDef) } if {![info exists powPlotParam(GridDash,$gn)]} { set powPlotParam(GridDash,$gn) $powPlotParam(GridDash,powDef) } if {![info exists powPlotParam(xNumTicks,$gn)]} { set powPlotParam(xNumTicks,$gn) $powPlotParam(xNumTicks,powDef) } if {![info exists powPlotParam(yNumTicks,$gn)]} { set powPlotParam(yNumTicks,$gn) $powPlotParam(yNumTicks,powDef) } if {![info exists powPlotParam(xTickLength,$gn)]} { # order is [lft rgt top bot] set powPlotParam(xTickLength,$gn) $powPlotParam(xTickLength,powDef) } if {![info exists powPlotParam(yTickLength,$gn)]} { # order is [lft rgt top bot] set powPlotParam(yTickLength,$gn) $powPlotParam(yTickLength,powDef) } if {![info exists powPlotParam(xLabelTicks,$gn)]} { # order is [lft rgt top bot] set powPlotParam(xLabelTicks,$gn) $powPlotParam(xLabelTicks,powDef) } if {![info exists powPlotParam(yLabelTicks,$gn)]} { # order is [lft rgt top bot] set powPlotParam(yLabelTicks,$gn) $powPlotParam(yLabelTicks,powDef) } if {![info exists powPlotParam(tickLabels,$gn)]} { set powPlotParam(tickLabels,$gn) $powPlotParam(tickLabels,powDef) } if {![info exists powPlotParam(tickFormatCmdX,$gn)]} { set powPlotParam(tickFormatCmdX,$gn) $powPlotParam(tickFormatCmdX,powDef) } if {![info exists powPlotParam(tickFormatCmdY,$gn)]} { set powPlotParam(tickFormatCmdY,$gn) $powPlotParam(tickFormatCmdY,powDef) } if {![info exists powPlotParam(xTickScal,$gn)]} { set powPlotParam(xTickScal,$gn) $powPlotParam(xTickScal,powDef) } if {![info exists powPlotParam(yTickScal,$gn)]} { set powPlotParam(yTickScal,$gn) $powPlotParam(yTickScal,powDef) } if {![info exists powPlotParam(Notes,$gn)]} { set powPlotParam(Notes,$gn) {} } # WCS selection if {![info exists powPlotParam(wcsName,$gn)]} { set powPlotParam(wcsName,$gn) $powPlotParam(wcsName,powDef) } set idx 3 foreach wcsName [list a b c d e f g h i j k l m n o p q r s t u v w x y z] { if { [llength $powWCSList($gn)] == 2 } { set found [lsearch -exact [lindex $powWCSList($gn) 1] [string toupper $wcsName]] if { $found >= 0 } { .pow.mbar.edit.wcs entryconfigure $idx -state normal } } incr idx } update idletasks # Text Font Options... foreach lbl $powFontParam(allTypes,powDef) { foreach opt $powFontParam(allOpts,powDef) { if { ![info exists powFontParam(${lbl}${opt},$gn)] } { set powFontParam(${lbl}${opt},$gn) \ $powFontParam(${lbl}${opt},powDef) } } } # Graph size if { $xDimDisp == "NULL" } { if { ![info exists powPlotParam(xdimdisp,$gn)] } { set powPlotParam(xdimdisp,$gn) $powPlotParam(xdimdisp,powDef) } set xDimDisp $powPlotParam(xdimdisp,$gn) } else { set powPlotParam(xdimdisp,$gn) $xDimDisp } if { $yDimDisp == "NULL" } { if { ![info exists powPlotParam(ydimdisp,$gn)] } { set powPlotParam(ydimdisp,$gn) $powPlotParam(ydimdisp,powDef) } set yDimDisp $powPlotParam(ydimdisp,$gn) } else { set powPlotParam(ydimdisp,$gn) $yDimDisp } if {![info exists powPlotParam(FixedAspect,$gn)]} { set powPlotParam(FixedAspect,$gn) $aspect } #puts "powInitGraph Graph magstep, xDim: $xDim, yDim: $yDim, xDimDisp: $xDimDisp, yDimDisp, $yDimDisp" set xmagstep [expr double($xDimDisp)/$xDim] set ymagstep [expr double($yDimDisp)/$yDim] set newaspect [expr $xmagstep/$ymagstep] if { $powPlotParam(FixedAspect,$gn) } { if { [info exists powPlotParam(xmagstep,$gn)] } { set aspect [expr $powPlotParam(xmagstep,$gn) \ / $powPlotParam(ymagstep,$gn) ] if { $newaspect > $aspect } { set xmagstep [expr $ymagstep*$aspect] } else { set ymagstep [expr $xmagstep/$aspect] } } else { if { $xmagstep<$ymagstep } { if { [expr $xmagstep*$yDim] < [expr $yDimDisp/15.0] } { set ymagstep [expr $yDimDisp/15.0/$yDim] set powPlotParam(yNumTicks,$gn) \ [expr $powPlotParam(yNumTicks,$gn)/2+1] } else { set ymagstep $xmagstep } } else { if { [expr $ymagstep*$xDim] < [expr $xDimDisp/15.0] } { set xmagstep [expr $xDimDisp/15.0/$xDim] set powPlotParam(xNumTicks,$gn) \ [expr $powPlotParam(xNumTicks,$gn)/2+1] } else { set xmagstep $ymagstep } } # Handle special 1D case even better... if { $xDim==1 } { set powPlotParam(xNumTicks,$gn) 0 } if { $yDim == 1 } { set powPlotParam(yNumTicks,$gn) 0 } } } set powPlotParam(xmagstep,$gn) $xmagstep set powPlotParam(ymagstep,$gn) $ymagstep powSetGraphMagstep $gn $xmagstep $ymagstep ####### End of powInitGraph ######## } proc powBuildGraph { gn images curves canvas } { global powPlotParam powResizeMain powGUI currgn powOrderedGraphList global powcursor powbg powFirstTimeThroughFlag foreach el [list xo yo graphWidth graphHeight xmagstep ymagstep] { set $el $powPlotParam($el,$gn) } # Clean the canvas if there was a previous version of this graph $canvas delete $gn # Plot graph box and other niceties $canvas create rectangle $xo $yo \ [expr $graphWidth * $xmagstep + $xo] \ [expr $graphHeight * $ymagstep + $yo] \ -tags "$gn ${gn}box ${gn}line gbox" -outline black if {$canvas == ".pow.pow"} { # Can't have an image from the previous graph interfering with a new one powDeSelectImage powAdornGraph $gn $canvas .pow.pow delete ${gn}handles .pow.pow delete ${gn}shandle powMakeGraphHandles $gn if {$powFirstTimeThroughFlag} { powReconfigureToplevel 1 set powFirstTimeThroughFlag 0 } else { powReconfigureToplevel $powResizeMain } # Scroll to new graph set cbbox [.pow.pow cget -scrollregion] set bbox1 [.pow.pow bbox $gn] set xloc [expr double( [lindex $bbox1 0]+[lindex $bbox1 2]) \ / [lindex $cbbox 2] / 2.0 ] set yloc [expr double( [lindex $bbox1 1]+[lindex $bbox1 3]) \ / [lindex $cbbox 3] / 2.0 ] set xv [.pow.pow xview] if {$xloc<[lindex $xv 0] || $xloc>[lindex $xv 1]} { .pow.pow xview moveto [expr double([lindex $bbox1 0]-30) \ / [lindex $cbbox 2] ] } set yv [.pow.pow yview] if {$yloc<[lindex $yv 0] || $yloc>[lindex $yv 1]} { .pow.pow yview moveto [expr double([lindex $bbox1 1]-30) \ / [lindex $cbbox 3] ] } if { $gn != $currgn } { # Place a "working" message on graph, update screen, then continue set gMidX [expr 0.5*($graphWidth * $xmagstep) + $xo] set gMidY [expr 0.5*($graphHeight * $ymagstep) + $yo] .pow.pow create text $gMidX $gMidY \ -anchor center -tags deleteMe -text "Building graph..." update idletasks .pow.pow delete deleteMe } .pow.pow bind $gn "powSelectGraph $gn" .pow.pow bind graphSelect_$gn "powSelectGraph $gn" } powPlotImages $gn $images $canvas powPlotCurves $gn $curves $canvas if { $canvas==".pow.pow" \ && [lsearch -exact $powOrderedGraphList $gn]==-1 } { lappend powOrderedGraphList $gn } [gNotifications default] postMessage $gn graphHasFinishedDrawing } proc powSetCursor { crsr } { #puts "powSetCursor start" global powSaveCursor if { $crsr == "reset" } { set crsr [lindex $powSaveCursor end] set powSaveCursor [lreplace $powSaveCursor end end] } else { lappend powSaveCursor [.pow.pow cget -cursor] } .pow configure -cursor $crsr .pow.pow configure -cursor $crsr catch {.pow.scope configure -cursor $crsr} } proc powOverlapTest {id {canvas .pow.pow}} { #puts "powOverlapTest start" set bb [$canvas bbox $id] if {$bb != ""} { set olap [eval $canvas find overlapping $bb] } else { return 0 } foreach item $olap { set tags [$canvas gettags $item] if {$item != $id && !([string match "*handle*" $tags ])} { return 1 } } return 0 } proc powRedrawBox {gn {canvas .pow.pow}} { #puts "powRedrawBox start" global powPlotParam currimg foreach el [array names powPlotParam] { set p1 [lindex [split $el ,] 0] set p2 [lindex [split $el ,] 1] if { $p2 == $gn } { set $p1 $powPlotParam($p1,$p2) } } #find corners of new box set x0 [lindex [$canvas coords ${gn}box] 0] set y0 [lindex [$canvas coords ${gn}box] 3] set ccoords [powGraphToCanvas $gn $xTop $yTop $canvas] set x1 [lindex $ccoords 0] set y1 [lindex $ccoords 1] #remove previous box $canvas delete ${gn}box # plot the new box $canvas create rectangle $x0 $y1 $x1 $y0 \ -tags "$gn gbox ${gn}box ${gn}line" -outline black } proc powChangeGrid { {redraw 0} } { global powPlotParam currgn if { $currgn=="powDef" } {return} if {$redraw} { powAdornGraph $currgn .pow.pow } else { .pow.pow itemconfig ${currgn}grid \ -fill $powPlotParam(GridColor,$currgn) \ -dash $powPlotParam(GridDash,$currgn) } } proc powContour { } { #puts "powContour start" global currimg powRBmin powRBmax powbg powContourParam currgn global powDWP global g_titleFont if { ![info exists currimg] || $currimg=="NULL" || $currimg=="" } { tk_messageBox -message "Select a graph with an image first." \ -title "No Image" -type ok -parent .pow return } set powContourParam(image) $currimg set powContourParam(gn) $currgn set powContourParam(res) 2 set powContourParam(separate) no set powContourParam(nContrs) 10 set lst [powGetTics $powRBmin($currimg) $powRBmax($currimg) 10 linear] set powContourParam(min) [lindex $lst 0] set powContourParam(max) [lindex $lst end] set powContourParam(scale) linear if {[winfo exists ${powDWP}contour]} {destroy ${powDWP}contour} powToplevel ${powDWP}contour .pow "-bg $powbg" bind ${powDWP}contour <> "destroy ${powDWP}contour" catch {wm title ${powDWP}contour "Create Contours"} button ${powDWP}contour.help -text "Help" \ -command {powHelp Contours.html} \ -bg $powbg -takefocus 0 -font g_titleFont label ${powDWP}contour.image -bg $powbg -text "Image:" -font g_titleFont label ${powDWP}contour.currimg -bg yellow -fg black -text $currimg -font g_titleFont label ${powDWP}contour.imgrng -bg $powbg -text "Image Range:" -font g_titleFont frame ${powDWP}contour.imgfrm -bg $powbg label ${powDWP}contour.imgfrm.min -bg $powbg -width 10 \ -text "$powRBmin($currimg)" -font g_titleFont label ${powDWP}contour.imgfrm.dash -bg $powbg -text " - " -font g_titleFont label ${powDWP}contour.imgfrm.max -bg $powbg -width 10 \ -text "$powRBmax($currimg)" -font g_titleFont pack ${powDWP}contour.imgfrm.min -in ${powDWP}contour.imgfrm -side left \ -padx 4 -pady 1 -fill x -expand 1 pack ${powDWP}contour.imgfrm.dash -in ${powDWP}contour.imgfrm -side left \ -padx 4 -pady 1 pack ${powDWP}contour.imgfrm.max -in ${powDWP}contour.imgfrm -side left \ -padx 4 -pady 1 -fill x -expand 1 label ${powDWP}contour.pixrng -bg $powbg -text "Contour Range:" -font g_titleFont frame ${powDWP}contour.pixfrm -bg $powbg entry ${powDWP}contour.pixfrm.min -bg $powbg -width 10 \ -textvariable powContourParam(min) -takefocus 1 -font g_titleFont label ${powDWP}contour.pixfrm.dash -bg $powbg -text " - " -font g_titleFont entry ${powDWP}contour.pixfrm.max -bg $powbg -width 10 \ -textvariable powContourParam(max) -takefocus 1 -font g_titleFont pack ${powDWP}contour.pixfrm.min -in ${powDWP}contour.pixfrm -side left \ -padx 4 -pady 1 -fill x -expand 1 pack ${powDWP}contour.pixfrm.dash -in ${powDWP}contour.pixfrm -side left \ -padx 4 -pady 1 pack ${powDWP}contour.pixfrm.max -in ${powDWP}contour.pixfrm -side left \ -padx 4 -pady 1 -fill x -expand 1 label ${powDWP}contour.scale -bg $powbg -text "Scale:" -font g_titleFont frame ${powDWP}contour.sclbutt -bg $powbg radiobutton ${powDWP}contour.sclbutt.linear -bg $powbg -text Linear \ -variable powContourParam(scale) -value linear \ -highlightthickness 0 -takefocus 0 -font g_titleFont radiobutton ${powDWP}contour.sclbutt.sqrt -bg $powbg -text Sqrt \ -variable powContourParam(scale) -value sqrt \ -highlightthickness 0 -takefocus 0 -font g_titleFont radiobutton ${powDWP}contour.sclbutt.log -bg $powbg -text Log \ -variable powContourParam(scale) -value log \ -highlightthickness 0 -takefocus 0 -font g_titleFont pack ${powDWP}contour.sclbutt.linear -in ${powDWP}contour.sclbutt -side left \ -padx 4 -pady 1 pack ${powDWP}contour.sclbutt.sqrt -in ${powDWP}contour.sclbutt -side left \ -padx 4 -pady 1 pack ${powDWP}contour.sclbutt.log -in ${powDWP}contour.sclbutt -side left \ -padx 4 -pady 1 label ${powDWP}contour.ncntrs -bg $powbg -text "# Contours:" -font g_titleFont frame ${powDWP}contour.ncntrsbutt -bg $powbg button ${powDWP}contour.ncntrsbutt.less -bg $powbg -text "<" \ -command { incr powContourParam(nContrs) -1 } -takefocus 0 -font g_titleFont entry ${powDWP}contour.ncntrsbutt.numb -bg $powbg \ -textvariable powContourParam(nContrs) -width 5 -takefocus 1 -font g_titleFont button ${powDWP}contour.ncntrsbutt.more -bg $powbg -text ">" \ -command { incr powContourParam(nContrs) 1 } -takefocus 0 -font g_titleFont pack ${powDWP}contour.ncntrsbutt.less -in ${powDWP}contour.ncntrsbutt -side left \ -pady 1 pack ${powDWP}contour.ncntrsbutt.numb -in ${powDWP}contour.ncntrsbutt -side left \ -pady 1 pack ${powDWP}contour.ncntrsbutt.more -in ${powDWP}contour.ncntrsbutt -side left \ -pady 1 trace variable powContourParam(nContrs) w { powSetContours } trace variable powContourParam(min) w { powSetContours } trace variable powContourParam(max) w { powSetContours } trace variable powContourParam(scale) w { powSetContours } label ${powDWP}contour.clist -bg $powbg -text "Contours:" -font g_titleFont frame ${powDWP}contour.cntrs -bg $powbg scrollbar ${powDWP}contour.cntrs.scrolly -orient vertical -takefocus 0 \ -command {${powDWP}contour.cntrs.lst yview} -bg $powbg text ${powDWP}contour.cntrs.lst -bg $powbg -width 20 -height 5 \ -yscrollcommand {${powDWP}contour.cntrs.scrolly set } \ -takefocus 0 -font g_titleFont grid ${powDWP}contour.cntrs.lst -in ${powDWP}contour.cntrs -row 1 -column 1 \ -sticky news grid ${powDWP}contour.cntrs.scrolly -in ${powDWP}contour.cntrs -row 1 -column 2 \ -sticky news grid rowconfigure ${powDWP}contour.cntrs 1 -weight 1 grid columnconfigure ${powDWP}contour.cntrs 1 -weight 1 label ${powDWP}contour.res -bg $powbg -text "Resolution:" -font g_titleFont frame ${powDWP}contour.resbutt -bg $powbg radiobutton ${powDWP}contour.resbutt.high -bg $powbg -text High \ -variable powContourParam(res) -value 1 -highlightthickness 0 \ -takefocus 0 -font g_titleFont radiobutton ${powDWP}contour.resbutt.med -bg $powbg -text Medium \ -variable powContourParam(res) -value 2 -highlightthickness 0 \ -takefocus 0 -font g_titleFont radiobutton ${powDWP}contour.resbutt.low -bg $powbg -text Low \ -variable powContourParam(res) -value 3 -highlightthickness 0 \ -takefocus 0 -font g_titleFont pack ${powDWP}contour.resbutt.high -in ${powDWP}contour.resbutt -side left \ -padx 4 -pady 1 pack ${powDWP}contour.resbutt.med -in ${powDWP}contour.resbutt -side left \ -padx 4 -pady 1 pack ${powDWP}contour.resbutt.low -in ${powDWP}contour.resbutt -side left \ -padx 4 -pady 1 checkbutton ${powDWP}contour.separate -bg $powbg \ -text "Place contours in separate graph" \ -variable powContourParam(separate) -onvalue yes -offvalue no \ -highlightthickness 0 -takefocus 0 -font g_titleFont frame ${powDWP}contour.buttons -bg $powbg button ${powDWP}contour.buttons.make -text "Make Contours" -bg $powbg \ -command { powMakeContours $powContourParam(image) \ [${powDWP}contour.cntrs.lst get 1.0 end] \ $powContourParam(res) } -font g_titleFont button ${powDWP}contour.buttons.exit -text "Exit" -bg $powbg \ -command {destroy ${powDWP}contour} -font g_titleFont pack ${powDWP}contour.buttons.make -in ${powDWP}contour.buttons -side left \ -padx 4 -pady 3 pack ${powDWP}contour.buttons.exit -in ${powDWP}contour.buttons -side left \ -padx 4 -pady 3 grid ${powDWP}contour.help -in ${powDWP}contour -row 0 -column 2 -sticky ne grid ${powDWP}contour.image -in ${powDWP}contour -row 0 -column 0 -sticky e \ -pady 8 grid ${powDWP}contour.currimg -in ${powDWP}contour -row 0 -column 1 -sticky ew \ -pady 8 -padx 6 grid ${powDWP}contour.imgrng -in ${powDWP}contour -row 2 -column 0 -sticky e grid ${powDWP}contour.imgfrm -in ${powDWP}contour -row 2 -column 1 -sticky ew \ -columnspan 2 grid ${powDWP}contour.pixrng -in ${powDWP}contour -row 3 -column 0 -sticky e grid ${powDWP}contour.pixfrm -in ${powDWP}contour -row 3 -column 1 -sticky ew \ -columnspan 2 grid ${powDWP}contour.ncntrs -in ${powDWP}contour -row 4 -column 0 -sticky e grid ${powDWP}contour.ncntrsbutt -in ${powDWP}contour -row 4 -column 1 -sticky w \ -padx 4 grid ${powDWP}contour.scale -in ${powDWP}contour -row 5 -column 0 -sticky e grid ${powDWP}contour.sclbutt -in ${powDWP}contour -row 5 -column 1 -sticky w grid ${powDWP}contour.clist -in ${powDWP}contour -row 6 -column 0 -sticky e grid ${powDWP}contour.cntrs -in ${powDWP}contour -row 6 -column 1 -sticky news \ -padx 5 -columnspan 2 grid ${powDWP}contour.res -in ${powDWP}contour -row 8 -column 0 -sticky e grid ${powDWP}contour.resbutt -in ${powDWP}contour -row 8 -column 1 -sticky w \ -pady 8 grid ${powDWP}contour.separate -in ${powDWP}contour -row 10 -column 0 -sticky ew \ -padx 6 -pady 8 -columnspan 3 grid ${powDWP}contour.buttons -in ${powDWP}contour -row 11 -column 0 -columnspan 3 \ -pady 8 grid columnconfigure ${powDWP}contour 1 -weight 1 grid rowconfigure ${powDWP}contour 0 -weight 1 grid rowconfigure ${powDWP}contour 1 -minsize 10 grid rowconfigure ${powDWP}contour 7 -minsize 10 grid rowconfigure ${powDWP}contour 6 -weight 1 grid rowconfigure ${powDWP}contour 11 -weight 1 powSetContours 0 0 0 } proc powGetScale { min max scale nlvls } { #puts "powGetScale start" global powDWP set offset 0.0 if { $min<0.0 } { set offset [expr -2.0*$min] set min [expr $min+$offset] set max [expr $max+$offset] } set min [expr double($min)] set max [expr double($max)] set list "" switch $scale { linear { set step [expr ($max-$min) / ($nlvls-1) ] set val $min for {set i 0} {$i<$nlvls} {incr i} { lappend list [expr $val-$offset] set val [expr $val + $step] } } sqrt { set step [expr ( sqrt($max) - sqrt($min) ) / ($nlvls-1) ] set val [expr sqrt($min)] for {set i 0} {$i<$nlvls} {incr i} { lappend list [expr $val*$val-$offset] set val [expr $val + $step] } } log { if {$min==0.0} {set min [expr 0.001*$max]} set step [expr log( $max / $min ) / ($nlvls-1) ] set val [expr log($min)] for {set i 0} {$i<$nlvls} {incr i} { lappend list [expr exp($val)-$offset] set val [expr $val + $step] } } exp {} } return $list } proc powSetContours { a b c } { #puts "powSetContours start" global powContourParam powDWP set nContrs $powContourParam(nContrs) if { $nContrs == "" } return if { !($nContrs > 2) } { set nContrs 2 } set powContourParam(list) "" set powContourParam(list) \ [powGetScale $powContourParam(min) $powContourParam(max) \ $powContourParam(scale) $nContrs] if { [winfo exists ${powDWP}contour.cntrs.lst] } { ${powDWP}contour.cntrs.lst delete 1.0 end ${powDWP}contour.cntrs.lst insert end [join $powContourParam(list) "\n"] } } proc powMakeContours { img list res } { global powContourParam powPlotParam global powWCS powCurveParam global powFitsHeader powFitsHeaderCnt xCount yCount global powWCSList powWCSLabel powWCSName global useWCSInfo global currgn set gn $powContourParam(gn) set cntr ${img}_contour catch { powDeleteGraph $cntr NOPROMPT } set useWCS false if { [info exists powWCS($img)] && $powWCS($img)!="" } { set powWCS($cntr) $powWCS($img) if { [lindex [lindex $powWCS($img) 0] 0] != 0.0 } { set useWCS true } } set powWCSList($cntr) $powWCSList($gn) set powWCSList(${cntr}scope) $powWCSList($gn) set powWCSName($cntr) $powWCSName($gn) set powWCSName(${cntr}scope) $powWCSName($gn) powCreateContour $cntr $img $list $res set powContourParam(list) $list set useWCSInfo($cntr) $fvPref::ifWCSInfo set useWCSInfo(${cntr}scope) $fvPref::ifWCSInfo set powWCSLabel(xlabel,$cntr,DEFAULT) $powWCSLabel(xlabel,$gn,DEFAULT) set powWCSLabel(ylabel,$cntr,DEFAULT) $powWCSLabel(ylabel,$gn,DEFAULT) set powWCSLabel(xunit,$cntr,DEFAULT) $powWCSLabel(xunit,$gn,DEFAULT) set powWCSLabel(yunit,$cntr,DEFAULT) $powWCSLabel(yunit,$gn,DEFAULT) if { $powContourParam(separate) == "yes" } { set graph $cntr set images NULL set curves $cntr set powFitsHeader($cntr) $powFitsHeader($gn) set powFitsHeader(${cntr}scope) $powFitsHeader($gn) set powFitsHeaderCnt($cntr) $powFitsHeaderCnt($gn) set powFitsHeaderCnt(${cntr}scope) $powFitsHeaderCnt($gn) set powWCS(${cntr}scope) $powWCS($cntr) if { $useWCS == "true" } { set powPlotParam(graphType,$cntr) $powPlotParam(graphType,$gn) set powPlotParam(graphType,${cntr}scope) $powPlotParam(graphType,$cntr) } else { set powPlotParam(graphType,$cntr) "binary" set powPlotParam(graphType,${cntr}scope) "binary" set powPlotParam(graphType,$gn) "binary" } set powPlotParam(zoomed,$cntr) $powPlotParam(zoomed,$gn) set powPlotParam(zoomed,${cntr}scope) $powPlotParam(zoomed,$cntr) set xCount($cntr) $xCount($gn) set yCount($cntr) $yCount($gn) set xCount(${cntr}scope) $xCount($cntr) set yCount(${cntr}scope) $yCount($cntr) } else { set graph $gn set images $powPlotParam(images,$gn) set curves $powPlotParam(curves,$gn) if {$curves=="NULL"} { set curves $cntr } else { lappend curves $cntr } } # Find the true width of the of the graph box set width [tagXdim .pow.pow ${gn}box] set height [tagYdim .pow.pow ${gn}box] if { [lsearch -exact [powListGraphs] $graph]>=0 } { powUnmapGraph $graph } set powCurveParam(lStyle${cntr},$graph) " " set powCurveParam(lDisp${cntr},$graph) Yes set powCurveParam(pDisp${cntr},$graph) No set fixed $powPlotParam(FixedAspect,$gn) powCreateGraph $graph $curves $images \ $powPlotParam(xunits,$gn) $powPlotParam(yunits,$gn) \ $powPlotParam(xlabel,$gn) $powPlotParam(ylabel,$gn) \ $width $height \ $powPlotParam(xBot,$gn) $powPlotParam(yBot,$gn) \ $powPlotParam(xTop,$gn) $powPlotParam(yTop,$gn) set powPlotParam(FixedAspect,$graph) $fixed } proc powAdornGraph {gn {canvas ".pow.pow"}} { global powPlotParam if {$canvas != ".pow.pow" || $gn=="powDef" } {return} foreach par [list xNumTicks yNumTicks GridColor GridDash GridLines \ xTickScal yTickScal tickLabels] { set $par $powPlotParam($par,$gn) } if { $tickLabels=="degrees" && [powWCSexists $gn] } { # Convert "wcs" scaling to ra/dec to distinguish x/y axes set xTickScal "ra" set yTickScal "dec" } # Make tick frequency non-linear set xNumTicks [expr $xNumTicks + int(exp($xNumTicks/3.0)) - 1] set yNumTicks [expr $yNumTicks + int(exp($yNumTicks/3.0)) - 1] .pow.pow delete ${gn}grid set powPlotParam(tickList,$gn) \ [powDrawGridLines $gn $canvas $xTickScal $yTickScal \ $GridColor $xNumTicks $yNumTicks $GridDash \ $GridLines ] #puts "powPlotParam(tickList,$gn): $powPlotParam(tickList,$gn)" powDrawTicks $gn $canvas powMakeGraphLabels $gn } proc powDrawTicks { gn {canvas .pow.pow} } { global powPlotParam powFontParam global powTicksPerAxis global xCount yCount foreach par [list xTickLength xLabelTicks yTickLength yLabelTicks \ xmargin xTickScal yTickScal tickLabels tickFormatCmdX \ tickFormatCmdY] { set $par $powPlotParam($par,$gn) } set sideOrder [list lft rgt top bot] if { $tickLabels=="degrees" && [powWCSexists $gn] } { set xTickScal "ra" set yTickScal "dec" } .pow.pow delete ${gn}ticks ${gn}nums ${gn}label foreach axis [list x y] { foreach side [list top lft rgt bot none] { set powTicksPerAxis($axis$side,$gn) 0 } } ################################################################ # # Analyze tick values to identify required precision on labels # set xValues {} set yValues {} foreach {x y val axis side} $powPlotParam(tickList,$gn) { if { $axis=="x" } { lappend xValues $val } elseif { $axis=="y" } { lappend yValues $val } } set xValues [lsort -unique -real $xValues] set xLabelFmt [powBuildAxisFormat $xValues $xTickScal \ $powPlotParam(tickFormatCmdX,$gn)] set yValues [lsort -unique -real $yValues] set yLabelFmt [powBuildAxisFormat $yValues $yTickScal \ $powPlotParam(tickFormatCmdY,$gn)] # # ################################################################ #set direction "U" set newTickList $powPlotParam(tickList,$gn) #foreach {x y val axis side} $powPlotParam(tickList,$gn) # incr powTicksPerAxis($axis$side,$gn) foreach {x y val axis side} $powPlotParam(tickList,$gn) { incr powTicksPerAxis($axis$side,$gn) foreach {x y} [powGraphToCanvas $gn $x $y $canvas] {} if {$axis=="x"} { if {$xTickScal=="ra"} { set label [powHourRA $val $xLabelFmt] if { [llength $xValues]<2 } { # string will be of format xxhxxmxx.xxxxs regsub {\.*0*s$} $label "s" label regsub {00s$} $label "" label } else { regsub {X.*$} $label "" label } } elseif {$xTickScal=="log"} { set label [eval $xLabelFmt [expr pow(10.0,$val)] ] } else { set label [eval $xLabelFmt $val ] } } elseif {$axis=="y"} { if {$yTickScal=="dec"} { set label [powDegDec $val $yLabelFmt] if { [llength $yValues]<2 } { # string will be of format xx:xx:xx.xxxx regsub {(:00)?\.*0*$} $label "" label } else { regsub {X.*$} $label "" label } } elseif {$yTickScal=="log"} { set label [eval $yLabelFmt [expr pow(10.0,$val)] ] } else { set label [eval $yLabelFmt $val ] } } switch $side { lft { set tckLen [eval lindex \$${axis}TickLength 0] set tckLab [eval lindex \$${axis}LabelTicks 0] if { $tckLen != 0 } { $canvas create line $x $y [expr $x - $tckLen] $y \ -tags "$gn ${gn}line ${gn}ticks ${gn}lftticks ${gn}${axis}ticks" \ -fill black } if { $tckLab } { $canvas create text [expr $x - 5 - ($tckLen>0?$tckLen:0)] $y \ -text $label -anchor e -font [powGetFontList $gn tick] \ -fill $powFontParam(tickColor,$gn) \ -tags "$gn ${gn}text ${gn}nums ${gn}lftnums ${gn}${gn}nums" } } rgt { set tckLen [eval lindex \$${axis}TickLength 1] set tckLab [eval lindex \$${axis}LabelTicks 1] if { $tckLen != 0 } { $canvas create line $x $y [expr $x + $tckLen] $y \ -tags "$gn ${gn}line ${gn}ticks ${gn}rgtticks ${gn}${axis}ticks" \ -fill black } if { $tckLab } { $canvas create text [expr $x + 5 + ($tckLen>0?$tckLen:0)] $y \ -text $label -anchor w -font [powGetFontList $gn tick] \ -fill $powFontParam(tickColor,$gn) \ -tags "$gn ${gn}text ${gn}nums ${gn}rgtnums ${gn}${gn}nums" } } top { set tckLen [eval lindex \$${axis}TickLength 2] set tckLab [eval lindex \$${axis}LabelTicks 2] if { $tckLen != 0 } { $canvas create line $x $y $x [expr $y - $tckLen] \ -tags "$gn ${gn}line ${gn}ticks ${gn}topticks ${gn}${axis}ticks" \ -fill black } if { $tckLab } { $canvas create text $x [expr $y - 5 - ($tckLen>0?$tckLen:0)] \ -text $label -anchor s -font [powGetFontList $gn tick] \ -fill $powFontParam(tickColor,$gn) \ -tags "$gn ${gn}text ${gn}nums ${gn}topnums ${gn}${gn}nums" } } bot { set tckLen [eval lindex \$${axis}TickLength 3] set tckLab [eval lindex \$${axis}LabelTicks 3] if { $tckLen != 0 } { $canvas create line $x $y $x [expr $y + $tckLen] \ -tags "$gn ${gn}line ${gn}ticks ${gn}botticks ${gn}${axis}ticks" \ -fill black } if { $tckLab } { $canvas create text $x [expr $y + 5 + ($tckLen>0?$tckLen:0)] \ -text $label -anchor n -font [powGetFontList $gn tick] \ -fill $powFontParam(tickColor,$gn) \ -tags "$gn ${gn}text ${gn}nums ${gn}botnums ${gn}${axis}nums" } } } } # .pow.pow bind ${gn}nums \ # ".pow.pow itemconfigure ${gn}nums -fill yellow" # .pow.pow bind ${gn}nums \ # ".pow.pow itemconfigure ${gn}nums -fill black" .pow.pow bind ${gn}nums <> \ "powEditGraphDlg $gn; powEditSelectPage Ticks" } proc powMakeGraphLabels { gn {canvas ".pow.pow"} } { global powPlotParam powFontParam global powTicksPerAxis foreach par [list xTickLength xLabelTicks yTickLength yLabelTicks \ xlabel ylabel xunits yunits titleString titlePosition titleAnchor \ xmargin xTickScal yTickScal tickLabels] { set $par $powPlotParam($par,$gn) } foreach [list lft top rgt bot] [$canvas coords ${gn}box] {} # put the X and Y labels if { $xunits=="" || [regexp -nocase NULL $xunits] } { set xString "$xlabel" } else { set xString "$xlabel ($xunits)" } if { $yunits=="" || [regexp -nocase NULL $yunits] } { set yString "$ylabel" } else { set yString "$ylabel ($yunits)" } # Should we swap the Axis labels? if { [powWCSisSwapped $gn] && \ $powTicksPerAxis(xlft,$gn) < $powTicksPerAxis(xbot,$gn) && \ $powTicksPerAxis(ylft,$gn) > $powTicksPerAxis(ybot,$gn) } { set tmp $xString set xString $yString set yString $tmp } elseif { ![powWCSisSwapped $gn] && \ $powTicksPerAxis(xlft,$gn) > $powTicksPerAxis(xbot,$gn) && \ $powTicksPerAxis(ylft,$gn) < $powTicksPerAxis(ybot,$gn) } { set tmp $xString set xString $yString set yString $tmp } set lineSpace [font metrics [powGetFontList $gn axis] -linespace] incr lineSpace 5 set topMarg [powMax [lindex $xTickLength 2] [lindex $yTickLength 2]] set botMarg [powMax [lindex $xTickLength 3] [lindex $yTickLength 3]] if { $botMarg<0 } {set botMarg 0} if { $topMarg<0 } {set topMarg 0} if [regexp {[^ ]} $xString] { $canvas create text [expr ($lft + $rgt)/2 ] \ [expr $bot + $botMarg + $lineSpace] -text $xString -anchor n \ -tags "$gn ${gn}label ${gn}xlabel ${gn}text" \ -font [powGetFontList $gn axis] \ -fill $powFontParam(axisColor,$gn) } if [regexp {[^ ]} $yString] { $canvas create text [expr $lft - $xmargin/2] \ [expr $top - $topMarg] -text $yString -anchor sw \ -justify left -tags "$gn ${gn}label ${gn}ylabel ${gn}text"\ -font [powGetFontList $gn axis] \ -fill $powFontParam(axisColor,$gn) } # Now do the titleString # identical file name handler set titleStrToken [split $titleString "_"] if { [llength $titleStrToken] > 1 } { set titleStrToken [lreplace $titleStrToken end end] set titleString [lindex $titleStrToken 0] for {set i 1} {$i < [llength $titleStrToken]} {incr i} { set titleString [format "%s_%s" $titleString [lindex $titleStrToken $i]] } } if [regexp {[^ ]} $titleString] { if [string match "*w*" $titlePosition] { set x $lft } elseif [string match "*e*" $titlePosition] { set x $rgt } else { set x [expr ($lft + $rgt)*0.5] } if [string match "*n*" $titlePosition] { set y [expr $top - $topMarg] if { [lindex $xLabelTicks 2] || [lindex $yLabelTicks 2] } { set y [expr $y - $lineSpace] } if [regexp {[^ ]} $yString] { set y [expr $y - $lineSpace] } } elseif [string match "*s*" $titlePosition] { set y [expr $bot + $botMarg] if { [lindex $xLabelTicks 3] || [lindex $yLabelTicks 3] } { set y [expr $y + $lineSpace] } if [regexp {[^ ]} $xString] { set y [expr $y + $lineSpace] } } else { set y [expr ($top + $bot)*0.5] } $canvas create text $x $y -anchor $titleAnchor -text $titleString \ -tags "$gn graphDragable ${gn}label ${gn}tlabel ${gn}text" \ -font [powGetFontList $gn title] \ -fill $powFontParam(titleColor,$gn) } # $canvas bind ${gn}label \ # "$canvas itemconfigure ${gn}label -fill yellow" # $canvas bind ${gn}label \ # "$canvas itemconfigure ${gn}label -fill black" $canvas bind ${gn}label <> \ "powEditGraphDlg $gn; powEditSelectPage Graph" # Now do any extra graph labels powRedrawNotes $gn } proc powDummyRangeCallback { gn x0 x1} { #puts "powDummyRangeCallback start" puts "You have selected the ordered pair: ( $x0 , $x1) on the graph $gn" } proc powDragRange { x_or_y {tag highlight} {color red} {callback powDummyRangeCallback}} { #puts "powDragRange start" global currgn powRangeX0 powRangeX1 powRangeX0C powRangeXC global powRangeY0 powRangeY1 powRangeY0C powRangeYC powRangeTag powRangeColor global powRangeCallback powRangeSaveBinding set powRangeCallback $callback set powRangeTag $tag set powRangeColor $color set powRangeSaveBinding(ButtonPress-1) [bind .pow.pow ] set powRangeSaveBinding(B1-Motion) [bind .pow.pow ] set powRangeSaveBinding(ButtonRelease-1) [bind .pow.pow ] bind .pow.pow { set gn [powWhereAmI %x %y]; if {$gn == $currgn} { set powRangeX0C [.pow.pow canvasx %x]; set powRangeY0C [.pow.pow canvasy %y]; set gcoords [powCanvasToGraph $currgn $powRangeX0C $powRangeY0C \ .pow.pow]; set powRangeX0 [lindex gcoords 0] set powRangeY0 [lindex gcoords 1] .pow.pow create line $powRangeX0C $powRangeY0C $powRangeX0C $powRangeY0C \ -tags Range -fill $powRangeColor } } bind .pow.pow { set gn [powWhereAmI %x %y]; if {$gn == $currgn} { if {![info exists powRangeX0C]} { set powRangeX0C [.pow.pow canvasx %x]; set powRangeY0C [.pow.pow canvasy %y]; set gcoords [powCanvasToGraph $currgn $powRangeX0C $powRangeY0C \ .pow.pow]; set powRangeX0 [lindex gcoords 0] set powRangeY0 [lindex gcoords 1] } else { .pow.pow delete Range; } set powRangeXC [.pow.pow canvasx %x]; set powRangeYC [.pow.pow canvasy %y]; .pow.pow create line $powRangeX0C $powRangeY0C $powRangeXC $powRangeYC \ -tags Range -fill $powRangeColor } } if {$x_or_y == "X"} { bind .pow.pow { if {[info exists powRangeX0C]} { set range_coords [.pow.pow coords Range] .pow.pow delete Range set powRangeXC [lindex $range_coords 0]; set powRangeYC [lindex $range_coords 1]; set powRangeCoords [powCanvasToGraph $currgn \ $powRangeXC $powRangeYC .pow.pow] set powRangeX0 [lindex $powRangeCoords 0] set powRangeY0 [lindex $powRangeCoords 1] set powRangeXC [lindex $range_coords 2]; set powRangeYC [lindex $range_coords 3]; set powRangeCoords [powCanvasToGraph $currgn \ $powRangeXC $powRangeYC .pow.pow] set powRangeX1 [lindex $powRangeCoords 0] set powRangeY1 [lindex $powRangeCoords 1] powColorRange $currgn X $powRangeX0 $powRangeX1 $powRangeY0 $powRangeY1 $powRangeTag $powRangeColor 0; $powRangeCallback $currgn $powRangeX0 $powRangeX1; bind .pow.pow \ "$powRangeSaveBinding(ButtonPress-1)"; bind .pow.pow \ "$powRangeSaveBinding(B1-Motion)"; bind .pow.pow \ "$powRangeSaveBinding(ButtonRelease-1)"; #clear start point for next Drag unset powRangeX0C } } } else { bind .pow.pow { if {[info exists powRangeX0C]} { set range_coords [.pow.pow coords Range] .pow.pow delete Range set powRangeXC [lindex $range_coords 0]; set powRangeYC [lindex $range_coords 1]; set powRangeCoords [powCanvasToGraph $currgn \ $powRangeXC $powRangeYC .pow.pow] set powRangeX0 [lindex $powRangeCoords 0] set powRangeY0 [lindex $powRangeCoords 1] set powRangeXC [lindex $range_coords 2]; set powRangeYC [lindex $range_coords 3]; set powRangeCoords [powCanvasToGraph $currgn \ $powRangeXC $powRangeYC .pow.pow] set powRangeX1 [lindex $powRangeCoords 0] set powRangeY1 [lindex $powRangeCoords 1] powColorRange $currgn Y $powRangeX0 $powRangeX1 $powRangeY0 $powRangeY1 $powRangeTag $powRangeColor 0; $powRangeCallback $currgn $powRangeY0 $powRangeY1; bind .pow.pow \ "$powRangeSaveBinding(ButtonPress-1)"; bind .pow.pow \ "$powRangeSaveBinding(B1-Motion)"; bind .pow.pow \ "$powRangeSaveBinding(ButtonRelease-1)"; #clear start point for next Drag unset powRangeX0C } } } } proc powColorRange { gn x_or_y x0 x1 y0 y1 {tag highlight} {color red} {redrawing 0}} { #puts "powColorRange start" global powGraphsTagRangeList powTagsColorMap global chainToAxisHash axisToChainHash # puts "powColorRange: $gn $x_or_y $x0 $x1 $y0 $y1 $tag $color $redrawing" if {$x_or_y == "X"} { set a0 $x0 set a1 $x1 } else { set a0 $y0 set a1 $y1 } if {$a0 > $a1} { set tmp $a0 set a0 $a1 set a1 $tmp } if {!$redrawing} { set powTagsColorMap($tag) $color lappend powGraphsTagRangeList($gn) "$x_or_y $a0 $a1 $tag" } set graphlist ${gn}$x_or_y if {$x_or_y =="X"} { if {[array names axisToChainHash ${gn}X] != ""} { set graphlist [concat $graphlist $chainToAxisHash($axisToChainHash(${gn}X))] } } else { if {[array names axisToChainHash ${gn}Y] != ""} { set graphlist [concat $graphlist $chainToAxisHash($axisToChainHash(${gn}Y))] } } foreach graph [concat $graphlist] { set axis [chopped $graph] set graph [chop $graph] powTagRange $graph $x_or_y $x0 $x1 $y0 $y1 $tag } .pow.pow itemconfigure $tag -fill $color } proc powTagRange { gn x_or_y x0 x1 y0 y1 tag } { #puts "powTagRange start" # puts "powTagRange: $gn $x_or_y $x0 $x1 $tag" set gbox [.pow.pow coords ${gn}box] set gx0 [lindex $gbox 0] set gx1 [lindex $gbox 2] set gy0 [lindex $gbox 1] set gy1 [lindex $gbox 3] if {$x_or_y == "X"} { set xa [lindex [powGraphToCanvas $gn $x0 $y0 .pow.pow] 0] set xb [lindex [powGraphToCanvas $gn $x1 $y1 .pow.pow] 0] if {($xa < $gx0 && $xb < $gx0) || ($xa > $gx1 && $xb > $gx1)} { #range is entirely off the graph return } if {$xa < $gx0} {set xa $gx0 } if {$xb > $gx1} {set xb $gx1 } set ya $gy0 set yb $gy1 } else { set xa $gx0 set xb $gx1 set ya [lindex [powGraphToCanvas $gn $x1 $y1 .pow.pow] 1] set yb [lindex [powGraphToCanvas $gn $x0 $y0 .pow.pow] 1] if {($ya < $gy0 && $yb < $gy0) || ($ya > $gy1 && $yb > $gy1)} { #range is entirely off the graph return } if {$ya < $gy0} {set ya $gy0 } if {$yb > $gy1} {set yb $gy1 } } .pow.pow addtag $tag enclosed $xa $ya $xb $yb } proc powTagRect { gn x0 y0 x1 y1 tag } { #puts "powTagRect start" if {$x0 > $x1} { set tmp $x0 set x0 $x1 set x1 $tmp } if {$y0 > $y1} { set tmp $y0 set y0 $y1 set y1 $tmp } set ccoords [powGraphToCanvas $gn $x0 $y0 .pow.pow] set xa [lindex $ccoords 0] set yb [lindex $ccoords 1] set ccoords [powGraphToCanvas $gn $x1 $y1 .pow.pow] set xb [lindex $ccoords 0] set ya [lindex $ccoords 1] set gbox [.pow.pow coords ${gn}box] set gx0 [lindex $gbox 0] set gx1 [lindex $gbox 2] set gy0 [lindex $gbox 1] set gy1 [lindex $gbox 3] if {($xa < $gx0 && $xb < $gx0) || ($xa > $gx1 && $xb > $gx1) || \ ($ya < $gy0 && $yb < $gy0) || ($ya > $gy1 && $yb > $gy1)} { #rect is entirely off the displayed graph return } if {$xa < $gx0} {set xa $gx0 } if {$xb > $gx1} {set xb $gx1 } if {$ya < $gy0} {set ya $gy0 } if {$yb > $gy1} {set yb $gy1 } .pow.pow addtag $tag enclosed $xa $ya $xb $yb } proc powDummyRectCallback { gn x0 y0 x1 y1} { #puts "powDummyRectCallback start" puts "You have selected the rectangle: ( $x0 , $y0 , $x1, $y1) on the graph " } proc powDragRect { {tag highlight} {color red} {callback powDummyRectCallback}} { #puts "powDragRect start" global currgn powRectX0 powRectX1 powRectX0C powRectXC global powRectY0 powRectY1 powRectY0C powRectYC powRectTag powRectColor global powRectCallback powRectSaveBinding set powRectCallback $callback set powRectTag $tag set powRectColor $color set powRectSaveBinding(ButtonPress-1) [bind .pow.pow ] set powRectSaveBinding(B1-Motion) [bind .pow.pow ] set powRectSaveBinding(ButtonRelease-1) [bind .pow.pow ] bind .pow.pow { set gn [powWhereAmI %x %y]; if {$gn == $currgn} { set powRectX0C [.pow.pow canvasx %x]; set powRectY0C [.pow.pow canvasy %y]; set gcoords [powCanvasToGraph $currgn $powRectX0C $powRectY0C .pow.pow]; set powRectX0 [lindex $gcoords 0] set powRectY0 [lindex $gcoords 1] .pow.pow create rectangle $powRectX0C $powRectY0C $powRectX0C $powRectY0C \ -tags Rect -outline $powRectColor } } bind .pow.pow { set gn [powWhereAmI %x %y]; if {$gn == $currgn} { if {![info exists powRectX0C]} { set powRectX0C [.pow.pow canvasx %x]; set powRectX0 [powCanvasToGraph $currgn X $powRectX0C .pow.pow]; set powRectY0C [.pow.pow canvasy %y]; set powRectY0 [powCanvasToGraph $currgn Y $powRectY0C .pow.pow]; } else { .pow.pow delete Rect; } set powRectXC [.pow.pow canvasx %x]; set powRectYC [.pow.pow canvasy %y]; .pow.pow create rectangle $powRectX0C $powRectY0C $powRectXC $powRectYC \ -tags Rect -outline $powRectColor } } bind .pow.pow { if {[info exists powRectX0C]} { set rect_coords [.pow.pow coords Rect] .pow.pow delete Rect set powRectXC [lindex $rect_coords 0] set powRectYC [lindex $rect_coords 1]; set gcoords [powCanvasToGraph $currgn $powRectXC $powRectYC .pow.pow]; set powRectX0 [lindex $gcoords 0] set powRectY0 [lindex $gcoords 1] set powRectXC [lindex $rect_coords 2] set powRectYC [lindex $rect_coords 3]; set gcoords [powCanvasToGraph $currgn $powRectXC $powRectYC .pow.pow] set powRectX1 [lindex $gcoords 0] set powRectY1 [lindex $gcoords 1] powColorRect $currgn $powRectX0 $powRectY0 $powRectX1 $powRectY1 $powRectTag $powRectColor 0; bind .pow.pow \ "$powRectSaveBinding(ButtonPress-1)"; bind .pow.pow \ "$powRectSaveBinding(B1-Motion)"; bind .pow.pow \ "$powRectSaveBinding(ButtonRelease-1)"; $powRectCallback $currgn $powRectX0 $powRectY0 $powRectX1 $powRectY1; } } } proc powColorRect { gn x0 y0 x1 y1 {tag highlight} {color red} {redrawing 0}} { #puts "powColorRect start" global powGraphsTagRectList powTagsColorMap # puts "powColorRect: $gn $x_or_y $x0 $x1 $tag $color $redrawing" if {$x0 > $x1} { set tmp $x0 set x0 $x1 set x1 $tmp } if {!$redrawing} { set powTagsColorMap($tag) $color lappend powGraphsTagRectList($gn) "$x0 $y0 $x1 $y1 $tag" } powTagRect $gn $x0 $y0 $x1 $y1 $tag # Unless someone can come up with a good reason, powColorRect doesn't follow # linked axes because it's unclear what to do with the unlinked axis .pow.pow itemconfigure $tag -fill $color } proc powColorbar { } { global currimg currgn powResizeMain global powPlotParam powImageParam global powFitsHeader powFitsHeaderCnt powWCS xCount yCount global powWCSList powWCSLabel powWCSName if { [regexp {_colorbar$} $currgn] } { tk_messageBox -icon warning \ -message "Cannot create colorbar of\nanother colorbar" \ -parent .pow -title "Colorbar Warning" -type ok return } if { ![info exists currimg] || $currimg == "" } { tk_messageBox -icon warning \ -message "Select an image first." \ -parent .pow -title "Colorbar Warning" -type ok return } set saveimg $currimg set savegn $currgn if {[.pow.pow find withtag ${currimg}disp${currgn}] == ""} { puts "Your selected image must be on the selected graph to make a colorbar" return } set colorbarGn ${currgn}_colorbar set colorbarImg ${currimg}_colorbar set width 2048.0 set min $powImageParam(RBmin${currimg},$currgn) set max $powImageParam(RBmax${currimg},$currgn) set width [expr $max - $min] if { $min==$max } { if { $min==0.0 } { set min -1 set max 1 } else { set min [expr $min-abs(0.1*$min)] set max [expr $max+abs(0.1*$max)] } } set increment [expr ($max - $min) / ($width-1)] set x $min for {set j 0} {$j < $width} {incr j} { lappend color_list $x set x [expr $x + $increment] } powCreateDataFromList $colorbarImg $color_list set zunits [powGetImageUnits $currimg Z] set powPlotParam(zoomed,$colorbarImg) 0 set powWCS($colorbarImg) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set powPlotParam(graphType,$colorbarImg) "image" set powFitsHeader($colorbarImg) "" set powFitsHeaderCnt($colorbarImg) 0 set xCount($colorbarImg) 0 set yCount($colorbarImg) 0 set powPlotParam(zoomed,${colorbarImg}scope) 0 set powWCS(${colorbarImg}scope) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set powPlotParam(graphType,${colorbarImg}scope) "image" set powFitsHeader(${colorbarImg}scope) "" set powFitsHeaderCnt(${colorbarImg}scope) 0 set xCount(${colorbarImg}scope) 0 set yCount(${colorbarImg}scope) 0 set powWCSName($colorbarImg) 0 powCreateImage $colorbarImg $colorbarImg 0 0 \ [expr int($width)] 1 $min $increment 0.5 1.0 \ $zunits " " $zunits if [info exists powWCSList($colorbarImg)] { foreach name [lindex $powWCSList($colorbarImg) 1] { $fFile assembleWcsLabel $colorbarImg $name } } else { set powWCSList($colorbarImg) {} lappend powWCSList($colorbarImg) 1 lappend powWCSList($colorbarImg) {} } set powWCSList(${colorbarImg}scope) $powWCSList($colorbarImg) set powPlotParam(xo,$colorbarGn) [lindex [.pow.pow bbox ${savegn}box] 0] set powPlotParam(yo,$colorbarGn) \ [expr 20 + [lindex [.pow.pow bbox $savegn] 3] ] set powPlotParam(Colorbar${colorbarImg},$colorbarGn) ${currimg}disp${currgn} set powPlotParam(FixedAspect,$colorbarGn) No set powPlotParam(FixedAspect,${colorbarGn}scope) No set powPlotParam(handletext,$colorbarGn) "$savegn Colorbar" set powPlotParam(handleposition,$colorbarGn) bl set powPlotParam(handleanchor,$colorbarGn) nw set powPlotParam(titleString,$colorbarGn) "$savegn Colorbar" set powPlotParam(titlePosition,$colorbarGn) sw set powPlotParam(titleAnchor,$colorbarGn) nw set powPlotParam(GridLines,$colorbarGn) No set powPlotParam(yTickLength,$colorbarGn) [list 0 0 0 0] set powPlotParam(yLabelTicks,$colorbarGn) [list No No No No] set powPlotParam(zoomed,$colorbarGn) 0 set powPlotParam(graphType,$colorbarGn) "binary" set powFitsHeader($colorbarGn) "" set powFitsHeaderCnt($colorbarGn) 0 set powWCS($colorbarGn) "" set powWCS($colorbarGn) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set xCount($colorbarGn) 0 set yCount($colorbarGn) 0 powCreateGraph $colorbarGn NULL $colorbarImg $zunits NULL " " " " \ [tagXdim .pow.pow ${currgn}box] 20 powReconfigureToplevel $powResizeMain #reselect original image powSelectGraph $savegn powSelectImage $savegn $saveimg } # axisValues need to contain unique values in ascending order proc powBuildAxisFormat { axisValues axisScale defaultFmt } { #puts "powBuildAxisFormat start" if { [llength $axisValues]<2 } { set axisDiff 0 } else { set axisDiff [expr [lindex $axisValues 1] - [lindex $axisValues 0]] for { set i 2 } { $i<[llength $axisValues] } { incr i } { set j [expr $i-1] set diff [expr [lindex $axisValues $i] - [lindex $axisValues $j]] if { $diff < $axisDiff } { set axisDiff $diff } } } switch $axisScale { "ra" { set labelFmt "%dh" if { $axisDiff==0 } { append labelFmt "%02dm%07.4fs" } else { set axisDiff [expr $axisDiff * 3600.0 / 15.0] if { $axisDiff < 3600.0 } { # Need Minutes append labelFmt "%02dm" if { $axisDiff < 59.99 } { # Need Seconds if { $axisDiff < .99 } { set axisDiffPrec [expr int(-log10($axisDiff)+1)] set axisDiffWidth [expr 3+$axisDiffPrec] append labelFmt "%0${axisDiffWidth}.${axisDiffPrec}fs" } else { append labelFmt "%02.0fs" } } else { append labelFmt "X%02fs" } } else { append labelFmt "X%02dm%02fs" } } } "dec" { set labelFmt "%d:%02d" if { $axisDiff==0 } { append labelFmt ":%07.4f" } else { set axisDiff [expr $axisDiff * 3600.0] if { $axisDiff < 59.99 } { # Need Seconds if { $axisDiff < 0.99 } { set axisDiffPrec [expr int(-log10($axisDiff)+1)] set axisDiffWidth [expr 3+$axisDiffPrec] append labelFmt ":%0${axisDiffWidth}.${axisDiffPrec}f" } else { append labelFmt ":%02.0f" } } else { append labelFmt "X:%02.0f" } } } "log" { set labelFmt $defaultFmt } default { set labelFmt $defaultFmt } } return $labelFmt } # convert a decimal degree to HH MM SS.S # the optional fmtStr needs to have 3 value placeholders (%'s) in h m s order proc powHourRA { deciValue {fmtStr "%dh%02dm%05.2fs"} } { #puts "powHourRA start" #Written by J. Xu if { $deciValue < 0} { set deciValue [expr $deciValue + 360] } set hourValue [expr $deciValue/15.0 + 1e-13] set hour [expr int($hourValue)] set minuValue [expr ($hourValue - $hour)*60.0] set minu [expr int($minuValue)] set scndValue [expr ($minuValue - $minu)*60.0] set scnd $scndValue while {$hour >= 24} {set hour [expr $hour - 24]} while {$hour < 0} {set hour [expr $hour + 24]} # Check if we are rounding seconds to next value set scndFmt [lindex [split $fmtStr %] 3] set scndStr [format %$scndFmt $scnd] if { [regexp {^ *60} $scndStr] } { set scnd 0 incr minu if {$minu == 60} { set minu 0 incr hour if { $hour==24 } { set hour 0 } } } return [format $fmtStr $hour $minu $scnd] } # convert a decimal degree to DD MM SS.S # the optional fmtStr needs to have 3 value placeholders (%'s) in h m s order proc powDegDec { deciValue {fmtStr "%d:%02d:%05.2f"} } { #puts "powDegDec start" #Written by J. Xu if { $deciValue < 0} { set isNeg 1 } else { set isNeg 0 } set deciValue [expr abs($deciValue) + 1e-13] set deg [expr int($deciValue)] while {$deg > 360} {set deg [expr $deg - 360]} while {$deg < -360} {set deg [expr $deg + 360]} set minuValue [expr ($deciValue - $deg)*60.0] set minu [expr int($minuValue)] set scndValue [expr ($minuValue - $minu)*60.0] set scnd $scndValue # Check if we are rounding seconds to next value set scndFmt [lindex [split $fmtStr %] 3] set scndStr [format %$scndFmt $scnd] if { [regexp {^ *60} $scndStr] } { set scnd 0 incr minu if {$minu == 60} { set minu 0 incr deg if { $deg==360 } { set deg 0 } } } if { $isNeg } { return [format "-$fmtStr" $deg $minu $scnd] } else { return [format $fmtStr $deg $minu $scnd] } } proc powSwitch2NewWCSHeader {} { global powFitsHeader powPlotParam powWCSInfo powWCS global currgn coordSel powWCSList powWCSName global powWCSLabel set powPlotParam(wcsName,$currgn) $powPlotParam(wcsName,powDef) set selection $powPlotParam(wcsName,$currgn) set dest "DEFAULT" if { $selection == "WCS" } { set powWCSName($currgn) 0 #set powFitsHeader($currgn) [assembleWcsHeader $currgn] set powWCS($currgn) $powWCSInfo($currgn,DEFAULT) } else { set dest [string toupper [string range $selection 3 end]] set coordList [lindex $powWCSList($currgn) 1] set powWCSName($currgn) "[lsearch -exact $coordList [string toupper $dest]]" #set powFitsHeader($currgn) [assembleWcsHeader $currgn $dest] set powWCS($currgn) $powWCSInfo($currgn,$dest) } if [info exist powWCSName(imgobj_$currgn)] { set powWCSName(imgobj_$currgn) $powWCSName($currgn) set powWCS(imgobj_$currgn) $powWCS($currgn) } # next to initialize the pow wcs structure in C set tokenNew [lindex $powWCSInfo($currgn,$dest) 1] set tokenNewX [lindex $tokenNew 0] set tokenNewY [lindex $tokenNew 1] powResetWcsStructure -g $currgn $tokenNewX $tokenNewY catch { powEndROI 1 } powAdornGraph $currgn .pow.pow powRedrawGraphHandles $currgn powRedrawScopebox } proc assembleWcsHeader { img {selection "default"} } { global powHeaderWcsKeyWord # regular header return [format "%s%s%s" $powHeaderWcsKeyWord($img,NONE) \ $powHeaderWcsKeyWord($img,[string toupper $selection]) \ $powHeaderWcsKeyWord($img,END)] } proc powLoadFitsImage {url imagename} { #puts "powLoadFitsImage start" global powWCS #While POW, technically, should not know anything about FITS files, #loading an image using fitsTcl is *way* too complicated at the moment #so this routine is provided as a public service #This routine takes a url or filename and creates the POW Image object #with the requested name. The POW Data object is available under the #name ${imagename}_data #fitsTcl must be loaded to use this routine and an error will be thrown #if it isn't if {[lsearch [info loaded] *Fitstcl*] == -1} { # error "You must load fitsTcl to use powLoadFitsImage" } #if you're running under Windows or MacOS, you can't use #a URL, just a local file name because cfitsio's network drivers don't work #outside of UNIX. #open the fits file (readonly) if [catch {set infilehandle [fits open $url 0]}] { error "Couldn't open file: $url" } #load the image data into memory set imghandle [$infilehandle load image] #get the dimensions of the image set dims [$infilehandle info imgdim] set n1 [lindex $dims 0] set n2 [lindex $dims 1] #get the data type of the image set data_type [lindex [lindex [$infilehandle get keyword BITPIX] 0] 1] #Now a bit of Voodoo to deal with possible wierd file types: #If the image has BZERO or BSCALE keywords in the header, fitsTcl will #do the appropriate thing with them automatically, but the datatype returned #will be floating point doubles (isn't FITS fun:) if { ([catch {$infilehandle get keyword BZERO}] == 0) || ([catch {$infilehandle get keyword BSCALE}] == 0) } { set data_type 4 } #make a POW DATA object powCreateData ${imagename}_data $imghandle $data_type [expr $n1 * $n2] 0 # powCreateDataFlip ${imagename}_data $imghandle $data_type [expr $n1 * $n2] 1 X $n1 $n2 #make a POW IMAGE object; the units (pixels, intensity) are arbitrary; since #this is a general application, we don't know what they are powCreateImage $imagename ${imagename}_data 0 0 $n1 $n2 0 1 0 1 pixels pixels intensity powCreateGraph $imagename NULL $imagename NULL NULL x_label y_label $n1 $n2 #This will setup POW to use the Astronomical coordinate information #in the file (if there is any) global powWCS #puts "wcsString: $wcsString" if { ! [catch {$infilehandle get imgwcs} wcsString] } { set powWCS($imagename) $wcsString } #we're done reading the file now $infilehandle close } proc powReplotReset {} { #puts "powReplotReset start" global currgn global powPlotParam set powPlotParam(g_magnification,$currgn) 1.0 set powPlotParam(g_multiplier,$currgn) 0.5 powEndROI 1 } proc powSetMagnification {} { #puts "powReplotReset start" global g_magnification global currgn set powPlotParam(g_magnification,$currgn) $g_magnification } proc powExpr { outDataName inputExpression } { #puts "powExpr start" # Make sure fitsTcl is loaded first if {[lsearch [info loaded] *Fitstcl*] == -1} { # Pan Chai: comment out error message # error "You must load fitsTcl to use powExpr" } # Evaluate the expression set res [vexpr -ptr -use powExprGetData $inputExpression] # Create the powData item; have it create its own copy of the data eval powCreateData $outDataName $res 1 # Don't forget to free the pointer returned by vexpr fits free [lindex $res 0] } proc powDeleteMenuBarItem {} { #puts "powDeleteMenuBarItem start" global menuBarDeleteFlag if { $menuBarDeleteFlag == "false" } { # .pow.mbar delete "Zoom" .pow.mbar delete "Replot" set menuBarDeleteFlag "true" } } proc _changeWinDirectoryToUnixFormat { dir } { #puts "_changeWinDirectoryToUnixFormat start" set result "" for { set i 0 } { $i < [string length $dir] } {incr i} { set currentChar [string range $dir $i $i] if { $currentChar == "\\" } { set currentChar "/" } set result [format "%s%s" $result $currentChar] } return $result } ################## # # Button Selection # ################## proc powButtonSelection { wndw1 wndw2 option { saveOp "SAVE" } } { global powLutButton global powROIButton global powbg if { $option == "Left" } { catch { ${wndw1} configure -bg $powbg } catch { ${wndw2} configure -bg yellow } set powLutButton 1 set powROIButton 3 } else { catch { ${wndw1} configure -bg yellow } err catch { ${wndw2} configure -bg $powbg } set powLutButton 3 set powROIButton 1 } if { $saveOp == "SAVE" } { powSaveConfig } } namespace eval powEvents { variable lastEventWndw "" proc generate { evt {evtWndw ""} } { variable lastEventWndw global CpowXRangeY0 # This evtWndw messiness is necessary due to LinuxPPC's (and others?) problems # in tracking the focus when selecting menu items. Can't tell if it is a # Window Manager problem or Tk problem. if { $evt == "<>" } { set whn "now" set lastEventWndw $evtWndw catch { unset CpowXRangeY0 } } else { set whn "tail" } if { $evtWndw=="" } { if { $lastEventWndw=="" } { set evtWndw [focus] } else { set evtWndw $lastEventWndw } } #puts "Evt: $evt in $evtWndw" if { $evtWndw != "" && [winfo exists $evtWndw] } { event generate $evtWndw $evt -when $whn } else { event generate . $evt -when $whn } } proc postMenus { w } { #puts "Posting menus for $w" if { $w == ".pow" } { .pow.mbar.file entryconfig "Close*" -label "Close POW" } else { .pow.mbar.file entryconfig "Close*" -label "Close Window" } } proc ExitPOW { } { set tempList [::powListGraphs] foreach name $tempList { catch { powDeleteGraph $name NOPROMPT} err } set Pow_Done 1 catch { destroy .pow.pow } catch { destroy .pow.scope } catch { event generate .pow <> } } } fv5.4/tcltk/pow/powEdit.tcl0000644000220700001010000025513611316456516015275 0ustar birbylheadev########################################################################### # # # Routines for new edit graph motif # # # ########################################################################### proc powEditGraphDlg { gn } { global powbg currgn global powDWP global g_titleFont global powEditPlotParam #puts "powEditGraphDlg gn: <$gn>" set w ${powDWP}gEdit if {[winfo exists $w]} { raise $w focus $w $w.btns.reset invoke return } powToplevel $w .pow "-bg $powbg" bind $w <> "powEditExitDlg" catch {wm title $w "Edit Graph"} label $w.graphCont -text "Graph Contents:" -fg black -bg yellow -font g_titleFont frame $w.graphList -bg $powbg scrollbar $w.graphList.scrolly -orient vertical -takefocus 0\ -command {${powDWP}gEdit.graphList.lst yview} -bg $powbg listbox $w.graphList.lst -bg $powbg -width 25 -height 6 \ -selectmode browse -exportselection 0 -takefocus 0 \ -yscrollcommand "$w.graphList.scrolly set " -font g_titleFont bind $w.graphList.lst \ { powEditBuildOptions } grid $w.graphList.lst -in $w.graphList \ -row 1 -column 1 -sticky news grid $w.graphList.scrolly -in $w.graphList \ -row 1 -column 2 -sticky news grid rowconfigure $w.graphList 1 -weight 1 grid columnconfigure $w.graphList 1 -weight 1 label $w.elemCont -text "Available Objects:" \ -fg black -bg yellow -font g_titleFont frame $w.elemList -bg $powbg scrollbar $w.elemList.scrolly -orient vertical -takefocus 0 \ -command {${powDWP}gEdit.elemList.lst yview} -bg $powbg listbox $w.elemList.lst -bg $powbg -width 25 -height 6 \ -selectmode browse -exportselection 0 -takefocus 0 \ -yscrollcommand "$w.elemList.scrolly set " -font g_titleFont grid $w.elemList.lst -row 1 -column 1 -sticky news grid $w.elemList.scrolly -row 1 -column 2 -sticky news grid rowconfigure $w.elemList 1 -weight 1 grid columnconfigure $w.elemList 1 -weight 1 button $w.help -bg $powbg -text "Help" \ -command {powHelp EditGraphs.html} -takefocus 0 -font g_titleFont grid $w.graphCont -row 1 -column 1 -sticky w -padx 5 -pady 5 grid $w.graphList -row 2 -column 1 -sticky news grid $w.help -row 1 -column 2 grid $w.elemCont -row 1 -column 3 -sticky w -padx 5 -pady 5 grid $w.elemList -row 2 -column 3 -sticky news frame $w.elemButt -bg $powbg button $w.elemButt.add -text "<-- Add" -bg $powbg -takefocus 0 \ -command {powEditAddElems} -font g_titleFont button $w.elemButt.remove -text "--> Remove" -bg $powbg -takefocus 0 \ -command {powEditRemoveElems} -font g_titleFont pack $w.elemButt.add -fill x -padx 5 -pady 2 pack $w.elemButt.remove -fill x -padx 5 -pady 2 grid $w.elemButt -row 2 -column 2 button $w.editObj -text "Edit Objects" -bg $powbg -takefocus 0 \ -command {powEditObjectDlg} -font g_titleFont grid $w.editObj -row 3 -column 3 -padx 5 -pady 5 frame $w.btns -bg $powbg button $w.btns.apply -text "Apply" -bg $powbg \ -command { powEditApplyToGraph } -font g_titleFont button $w.btns.reset -text "Reset" -bg $powbg \ -command { powEditResetDialog } -font g_titleFont button $w.btns.exit -text "Exit" -bg $powbg \ -command "powEditExitDlg" -font g_titleFont pack $w.btns.apply -side left -padx 5 -pady 2 pack $w.btns.reset -side left -padx 5 -pady 2 pack $w.btns.exit -side left -padx 5 -pady 2 grid $w.btns -row 6 -column 1 -columnspan 3 -pady 5 grid rowconfigure $w 2 -weight 1 grid rowconfigure $w 5 -weight 1 grid columnconfigure $w 1 -weight 1 grid columnconfigure $w 3 -weight 1 powEditResetDialog init } proc powEditExitDlg { } { global powDWP destroy ${powDWP}gEdit } proc powEditApplyToGraph { } { global powEditGraphName powPlotParam powEditGraphName global powLutButton powROIButton powEditUpdateVariables set gn $powEditGraphName powEraseGraph $gn 1 powCreateGraph $gn $powPlotParam(curves,$gn) $powPlotParam(images,$gn) \ $powPlotParam(xunits,$gn) $powPlotParam(yunits,$gn) \ $powPlotParam(xlabel,$gn) $powPlotParam(ylabel,$gn) \ $powPlotParam(xdimdisp,$gn) $powPlotParam(ydimdisp,$gn) \ $powPlotParam(xBot,$gn) $powPlotParam(yBot,$gn) \ $powPlotParam(xTop,$gn) $powPlotParam(yTop,$gn) # this is for Mouse. Will not be saved in POW preference event delete <> event delete <> event delete <> event delete <> event delete <> event delete <> event add <> event add <> event add <> event add <> if { $powROIButton != 0 && $powROIButton != "NULL" } { # Must delete BtnPress sequence to prevent it from hiding the ROI event event delete <> event add <> event add <> } } proc powEditResetDialog { {flag "reset" }} { global currgn powDWP powEditGraphName powEditPlotParam powPlotParam #puts "powEditResetDialog: currgn: $currgn" set xdimdisp $powPlotParam(xdimdisp,powDef) set ydimdisp $powPlotParam(ydimdisp,powDef) if { [info exists powEditPlotParam(xdimdisp,new)] && $flag == "init" } { set xdimdisp $powEditPlotParam(xdimdisp,new) set ydimdisp $powEditPlotParam(ydimdisp,new) } if { [winfo exists ${powDWP}gEdit] } { set powEditGraphName $currgn # -------> FIX of selection of current graph powEditInitVariables init #set powEditPlotParam(xdimdisp,new) $xdimdisp #set powEditPlotParam(ydimdisp,new) $ydimdisp if { $currgn=="powDef" } { set powEditGraphName [powEditCreateNewGraphName] } powEditBuildOptions } } proc powEditCreateNewGraphName { } { set i 1 set gn "powGraph_$i" while { [powListGraphs $gn] } { incr i set gn "powGraph_$i" } return $gn } proc powEditCreateNewGraph { gn } { global powPlotParam powEditGraphName global powWCS powFitsHeader powFitsHeaderCnt xCount yCount if { $gn!="" } { set powEditGraphName $gn } else { set powEditGraphName "powDef" } powEditInitVariables set powEditGraphName [powEditCreateNewGraphName] set powWCS($powEditGraphName) $powWCS($gn) set powFitsHeader($powEditGraphName) $powFitsHeader($gn) set powFitsHeaderCnt($powEditGraphName) $powFitsHeaderCnt($gn) set powWCS(${powEditGraphName}scope) $powWCS($gn) set powFitsHeader(${powEditGraphName}scope) $powFitsHeader($gn) set powFitsHeaderCnt(${powEditGraphName}scope) $powFitsHeaderCnt($gn) set xCount($powEditGraphName) 0 set yCount($powEditGraphName) 0 set xCount(${powEditGraphName}scope) 0 set yCount(${powEditGraphName}scope) 0 powEditApplyToGraph } proc powEditSelectPage { p } { global powDWP set note ${powDWP}gEdit.nBook Notebook:raise $note $p } ######################################################################## # # Build Option Pages # ######################################################################## proc powEditBuildOptions { } { global powDWP powbg set note ${powDWP}gEdit.nBook if { ![winfo exists $note] } { Notebook:create $note -pages {Graph Fonts Ticks Points Lines Image} \ -pad 4 -bg $powbg grid $note -in ${powDWP}gEdit -row 5 -column 1 \ -padx 15 -pady 0 -columnspan 3 -sticky nwes } set w [Notebook:frame $note Graph] powEditBuildGraphOptions $w set w [Notebook:frame $note Fonts] powEditBuildFontOptions $w set w [Notebook:frame $note Ticks] powEditBuildTickOptions $w set w [Notebook:frame $note Points] set itemNo [${powDWP}gEdit.graphList.lst curselection] #puts "itemNo: $itemNo" if { $itemNo == "" } { set item "none none" } else { set item [${powDWP}gEdit.graphList.lst get $itemNo] } foreach {name type} [split $item { }] {} if { $type == "(curve)" } { powEditBuildCurveOptions1 $w $name set w [Notebook:frame $note Lines] powEditBuildCurveOptions2 $w $name } else { powEditBuildEmptyOptions $w "Curve Not Selected" set w [Notebook:frame $note Lines] powEditBuildEmptyOptions $w "Curve Not Selected" } set w [Notebook:frame $note Image] if { $type == "(image)" } { powEditBuildImageOptions $w $name } else { powEditBuildEmptyOptions $w "Image Not Selected" } Notebook:resize $note } ################## # # Setup Page: Empty # ################## proc powEditBuildEmptyOptions { frame str } { global powbg global g_titleFont if {[winfo exists $frame]} { foreach i [winfo children $frame] { destroy $i } } else { frame $frame -bg $powbg } label $frame.lab -bg $powbg -text $str -font g_titleFont # Use pack instead of grid to destroy any pre-existing grid # configuration from nonEmpty frames pack $frame.lab -side top -fill both -anchor center -expand 1 } ################## # # Setup Page: POW # ################## proc powEditBuildPOWOptions { frame } { global powEditAppParam powbg global g_titleFont if {[winfo exists $frame]} { foreach i [winfo children $frame] { destroy $i } } else { frame $frame -bg $powbg } set row 1 grid rowconfigure $frame $row -minsize 5 incr row # Setup POW Application Options # # Cursor: # label $frame.cursor -bg $powbg -text "Cursor:" -font g_titleFont grid $frame.cursor -row $row -column 2 -sticky ne set col 3 foreach [list lab val] [list "Cross Hairs" crosshair \ "Left Arrow" top_left_arrow "Right Arrow" right_ptr \ "Gumby" gumby "Star Trek" trek] { if {$col==6} {set col 3; incr row} radiobutton $frame.cStyle$val -bg $powbg -text $lab \ -variable powEditAppParam(cursor,new) -value $val \ -highlightthickness 0 -takefocus 0 \ -command "$frame configure -cursor $val" -font g_titleFont grid $frame.cStyle$val -row $row -column $col -sticky nw -padx 4 incr col } incr row grid rowconfigure $frame $row -minsize 7 incr row # # GUI position: # label $frame.gui -bg $powbg -text "GUI Position:" -font g_titleFont grid $frame.gui -row $row -column 2 -sticky ne set col 3 foreach [list lab val] [list Top top Left left Right right Bottom bottom \ "Hidden" none] { if {$col==6} {set col 3; incr row} radiobutton $frame.gPos$val -bg $powbg -text $lab \ -variable powEditAppParam(GUIposition,new) -value $val \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.gPos$val -row $row -column $col -sticky nw -padx 4 incr col } incr row grid rowconfigure $frame $row -minsize 7 incr row # # Scopebox Size: # label $frame.scope -bg $powbg -text "Scopebox Size:" -font g_titleFont grid $frame.scope -row $row -column 2 -sticky ne set col 3 foreach [list lab val] [list None [list 0 0] 100x100 [list 100 100] 150x150 [list 150 150]\ 200x200 [list 200 200] ] { if {$col==6} {set col 3; incr row} radiobutton $frame.sb$lab -bg $powbg -text $lab \ -variable powEditAppParam(ScopeSize,new) -value $val \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.sb$lab -row $row -column $col -sticky nw -padx 4 incr col } incr row grid rowconfigure $frame $row -minsize 7 incr row # # Resize Main: # label $frame.rszMain -bg $powbg -text "Resize Window:" -font g_titleFont grid $frame.rszMain -row $row -column 2 -sticky ne set col 3 foreach [list lab val] [list "To Fit Contents" 1 "Never" 0] { if {$col==6} {set col 3; incr row} radiobutton $frame.rs$val -bg $powbg -text $lab \ -variable powEditAppParam(ResizeMain,new) -value $val \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.rs$val -row $row -column $col -sticky nw -padx 4 incr col } incr row grid rowconfigure $frame $row -minsize 7 incr row # # Background Color: # label $frame.bg -bg $powbg -text "Background Color:" -font g_titleFont grid $frame.bg -row $row -column 2 -sticky e powColorFrame $frame.bgColors powEditAppParam(bg,new) grid $frame.bgColors -row $row -column 3 -columnspan 3 \ -sticky w -padx 8 incr row grid rowconfigure $frame $row -minsize 7 incr row grid columnconfigure $frame 0 -minsize 5 grid columnconfigure $frame [list 3 4 5 6] -weight 1 } ################## # # Setup Page: Graph # ################## proc powEditBuildGraphOptions { frame } { global powbg powEditPlotParam powEditCurveParam powEditGraphName global powPlotParam global currgn global g_titleFont global powLutButton global powROIButton global buttonWndw global buttonSelection if {[winfo exists $frame]} { foreach i [winfo children $frame] { destroy $i } } else { frame $frame -bg $powbg } set buttonWndw $frame set row 1 grid rowconfigure $frame $row -minsize 5 incr row if { $powEditGraphName != "powDef" } { # Don't do this if we are editting defaults... # ... these data are not relvnt label $frame.title -bg $powbg -text "Graph Title:" -font g_titleFont entry $frame.etitle -bg $powbg \ -textvariable powEditPlotParam(titleString,new) -takefocus 1 -font g_titleFont grid $frame.title -in $frame -row $row -column 1 -sticky e \ -padx 5 grid $frame.etitle -in $frame -row $row -column 2 -sticky ew \ -padx 5 -columnspan 2 incr row grid rowconfigure $frame $row -minsize 5 incr row } # Setup Bbox options label $frame.x -bg $powbg -text "X Axis" -font g_titleFont label $frame.y -bg $powbg -text "Y Axis" -font g_titleFont grid $frame.x -in $frame -row $row -column 2 -sticky ew grid $frame.y -in $frame -row $row -column 3 -sticky ew incr row if { $powEditGraphName == "powDef" } { set labelsAndValues [list Size: dimdisp] } else { # Don't do this if we are editting defaults... # ... these data are not relvnt set labelsAndValues [list Label: label Min: Bot Max: Top \ Units: units Size: dimdisp ] } if { $powEditGraphName != "powDef" } { foreach {lbl val} $labelsAndValues { label $frame.l$val -bg $powbg -text $lbl -font g_titleFont entry $frame.ex$val -bg $powbg \ -textvariable powEditPlotParam(x$val,new) -takefocus 1 -font g_titleFont entry $frame.ey$val -bg $powbg \ -textvariable powEditPlotParam(y$val,new) -takefocus 1 -font g_titleFont grid $frame.l$val -in $frame -row $row -column 1 -sticky e \ -padx 5 grid $frame.ex$val -in $frame -row $row -column 2 -sticky w \ -padx 5 grid $frame.ey$val -in $frame -row $row -column 3 -sticky w \ -padx 5 incr row } } # Axis Scaling label $frame.tickScale -bg $powbg -text "Scaling:" -font g_titleFont grid $frame.tickScale -in $frame -row $row -column 1 -sticky ne -padx 5 frame $frame.scaleX -bg $powbg frame $frame.scaleY -bg $powbg radiobutton $frame.scaleX.log -bg $powbg -text Log \ -variable powEditPlotParam(xTickScal,new) -value log \ -highlightthickness 0 -takefocus 0 -font g_titleFont radiobutton $frame.scaleX.lin -bg $powbg -text Linear \ -variable powEditPlotParam(xTickScal,new) -value linear \ -highlightthickness 0 -takefocus 0 -font g_titleFont radiobutton $frame.scaleY.log -bg $powbg -text Log \ -variable powEditPlotParam(yTickScal,new) -value log \ -highlightthickness 0 -takefocus 0 -font g_titleFont radiobutton $frame.scaleY.lin -bg $powbg -text Linear \ -variable powEditPlotParam(yTickScal,new) -value linear \ -highlightthickness 0 -takefocus 0 -font g_titleFont pack $frame.scaleX.lin -padx 5 -side left -anchor w pack $frame.scaleX.log -padx 5 -side left -anchor w pack $frame.scaleY.lin -padx 5 -side left -anchor w pack $frame.scaleY.log -padx 5 -side left -anchor w grid $frame.scaleX -row $row -column 2 -sticky we -padx 5 grid $frame.scaleY -row $row -column 3 -sticky we -padx 5 incr row label $frame.mouse -bg $powbg -text "Mouse:" -font g_titleFont grid $frame.mouse -in $frame -row $row -column 1 -sticky ne -padx 5 frame $frame.buttonSelection -bg $powbg set buttonWndw $frame.buttonSelection radiobutton $frame.buttonSelection.leftZoom \ -font g_titleFont \ -text "Normal: left zoom, right brightnesss/contrast" \ -variable buttonSelection -value leftZoom \ -command {powButtonSelection ${buttonWndw}.leftZoom ${buttonWndw}.leftBright Right DONT_SAVE} radiobutton $frame.buttonSelection.leftBright \ -font g_titleFont \ -text "Reversed: left brightnesss/contrast, right zoom" \ -variable buttonSelection -value leftBright \ -command {powButtonSelection ${buttonWndw}.leftZoom ${buttonWndw}.leftBright Left DONT_SAVE} grid $frame.buttonSelection.leftZoom -row 0 -column 1 -sticky w -padx 5 grid $frame.buttonSelection.leftBright -row 1 -column 1 -sticky w -padx 5 grid $frame.buttonSelection -row $row -column 2 -sticky w -padx 5 -rowspan 3 -columnspan 2 grid rowconfigure $frame $row -minsize 5 incr row 3 if { $powLutButton == 3 } { $frame.buttonSelection.leftZoom select powButtonSelection ${buttonWndw}.leftZoom ${buttonWndw}.leftBright Right DONT_SAVE } else { $frame.buttonSelection.leftBright select powButtonSelection ${buttonWndw}.leftZoom ${buttonWndw}.leftBright Left DONT_SAVE } if { $powEditGraphName != "powDef" } { # Don't do this if we are editting defaults... # ... these data are not relvnt checkbutton $frame.scaleData -bg $powbg -text "Scale curve data to axes" \ -variable powEditPlotParam(scalData,new) -onvalue Yes -offvalue No \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.scaleData -row $row -column 2 -columnspan 2 -sticky we -padx 5 incr row grid rowconfigure $frame $row -minsize 7 incr row } # Reset Button if { $powEditGraphName != "powDef" } { # Don't do this if we are editting defaults... # ... these data are not relvnt button $frame.reset -bg $powbg -text "Reset Min/Max" -takefocus 0 \ -command { foreach par [list xBot yBot xTop yTop] { set powEditPlotParam($par,new) NULL } } -font g_titleFont grid $frame.reset -in $frame -row $row -column 2 \ -columnspan 2 -sticky {} -padx 5 -pady 5 incr row } grid rowconfigure $frame $row -minsize 5 incr row grid columnconfigure $frame [list 0 4] -weight 1 -minsize 5 } ################## # # Setup Page: Fonts # ################## proc powEditBuildFontOptions { frame } { global powbg powEditFontParam powEditGraphName powFontParam global g_titleFont if {[winfo exists $frame]} { foreach i [winfo children $frame] { destroy $i } } else { frame $frame -bg $powbg } set row 1 grid rowconfigure $frame $row -minsize 5 incr row label $frame.family -text "Font Family" -bg $powbg -font g_titleFont label $frame.size -text "Size (pt)" -bg $powbg -font g_titleFont label $frame.style -text "Style" -bg $powbg -font g_titleFont label $frame.color -text "Color" -bg $powbg -font g_titleFont grid $frame.family -row $row -column 2 -sticky s grid $frame.size -row $row -column 3 -sticky s grid $frame.style -row $row -column 4 -sticky s -columnspan 2 grid $frame.color -row $row -column 6 -sticky s incr row grid rowconfigure $frame $row -minsize 5 incr row foreach {tLbl lbl} [list \ "Title:" title "Axis Labels:" axis \ "Tick Labels:" tick "Text Labels:" note] { label $frame.lbl$lbl -text $tLbl -bg $powbg -font g_titleFont checkbutton $frame.bld$lbl -text Bold -onvalue bold -offvalue normal \ -bg $powbg -variable powEditFontParam(${lbl}Weight,new) \ -highlightthickness 0 -font g_titleFont checkbutton $frame.itl$lbl -text Italic -onvalue italic -offvalue roman \ -bg $powbg -variable powEditFontParam(${lbl}Slant,new) \ -highlightthickness 0 -font g_titleFont set mnu [eval tk_optionMenu $frame.fnt$lbl \ powEditFontParam(${lbl}Font,new) $powFontParam(allFonts,powDef)] $frame.fnt$lbl configure -bg $powbg -highlightthickness 0 -width 20 -font g_titleFont $mnu configure -bg $powbg -font g_titleFont set mnu [tk_optionMenu $frame.siz$lbl powEditFontParam(${lbl}Size,new) \ 7 9 12 14 16 18 24 32 40] $frame.siz$lbl configure -bg $powbg -highlightthickness 0 -width 3 -font g_titleFont $mnu configure -bg $powbg -font g_titleFont button $frame.clr$lbl -textvariable powEditFontParam(${lbl}Color,new) \ -bg $powbg -highlightthickness 0 -width 7 \ -command "powSelectColor powEditFontParam(${lbl}Color,new)" -font g_titleFont grid $frame.lbl$lbl -row $row -column 1 -padx 3 -sticky e grid $frame.fnt$lbl -row $row -column 2 -padx 3 grid $frame.siz$lbl -row $row -column 3 -padx 3 grid $frame.bld$lbl -row $row -column 4 -padx 3 grid $frame.itl$lbl -row $row -column 5 -padx 3 grid $frame.clr$lbl -row $row -column 6 -padx 3 incr row grid rowconfigure $frame $row -minsize 5 incr row } } ################## # # Setup Page: Tick # ################## proc powEditBuildTickOptions { frame } { global powbg powEditPlotParam global g_titleFont if {[winfo exists $frame]} { foreach i [winfo children $frame] { destroy $i } } else { frame $frame -bg $powbg } set row 1 grid rowconfigure $frame $row -minsize 5 incr row # Setup Tick Options label $frame.nXTicks -bg $powbg -text "# of X Ticks:" -font g_titleFont grid $frame.nXTicks -in $frame -row $row -column 2 -sticky ne frame $frame.xTickSlide -bg $powbg label $frame.xTickSlide.few -text "None" -bg $powbg -font g_titleFont label $frame.xTickSlide.lots -text "Many" -bg $powbg -font g_titleFont scale $frame.xTickSlide.slide -from 0 -to 12 \ -orient horizontal -variable powEditPlotParam(xNumTicks,new) \ -highlightbackground $powbg -bg $powbg \ -showvalue 0 -takefocus 0 -font g_titleFont pack $frame.xTickSlide.few -in $frame.xTickSlide -side left pack $frame.xTickSlide.slide -in $frame.xTickSlide -side left \ -expand 1 -fill x pack $frame.xTickSlide.lots -in $frame.xTickSlide -side right grid $frame.xTickSlide -in $frame -row $row -column 3 -columnspan 3 \ -sticky ew -padx 5 incr row label $frame.nYTicks -bg $powbg -text "# of Y Ticks:" -font g_titleFont grid $frame.nYTicks -in $frame -row $row -column 2 -sticky ne frame $frame.yTickSlide -bg $powbg label $frame.yTickSlide.few -text "None" -bg $powbg -font g_titleFont label $frame.yTickSlide.lots -text "Many" -bg $powbg -font g_titleFont scale $frame.yTickSlide.slide -from 0 -to 12 \ -orient horizontal -variable powEditPlotParam(yNumTicks,new) \ -highlightbackground $powbg -bg $powbg \ -showvalue 0 -takefocus 0 -font g_titleFont pack $frame.yTickSlide.few -in $frame.yTickSlide -side left pack $frame.yTickSlide.slide -in $frame.yTickSlide -side left \ -expand 1 -fill x pack $frame.yTickSlide.lots -in $frame.yTickSlide -side right grid $frame.yTickSlide -in $frame -row $row -column 3 -columnspan 3 \ -sticky ew -padx 5 incr row label $frame.xTicks -bg $powbg -text "X Ticks:" -font g_titleFont grid $frame.xTicks -in $frame -row $row -column 2 -sticky ne frame $frame.xTickButt -bg $powbg radiobutton $frame.xTickButt.in -bg $powbg -text In \ -variable powEditPlotParam(xTickLength,new) \ -value [list -10 -10 -10 -10] \ -highlightthickness 0 -takefocus 0 -font g_titleFont radiobutton $frame.xTickButt.out -bg $powbg -text Out \ -variable powEditPlotParam(xTickLength,new) \ -value [list 10 10 10 10] \ -highlightthickness 0 -takefocus 0 -font g_titleFont checkbutton $frame.xTickButt.lab -bg $powbg -text "Labeled?"\ -variable powEditPlotParam(xLabelTicks,new) \ -onvalue [list Yes No No Yes] \ -offvalue [list No No No No] \ -highlightthickness 0 -takefocus 0 -font g_titleFont pack $frame.xTickButt.in -side left -padx 4 pack $frame.xTickButt.out -side left -padx 4 pack $frame.xTickButt.lab -side left -padx 20 grid $frame.xTickButt -row $row -column 3 -sticky w -padx 0 -columnspan 3 incr row label $frame.yTicks -bg $powbg -text "Y Ticks:" -font g_titleFont grid $frame.yTicks -in $frame -row $row -column 2 -sticky ne frame $frame.yTickButt -bg $powbg radiobutton $frame.yTickButt.in -bg $powbg -text In \ -variable powEditPlotParam(yTickLength,new) \ -value [list -10 -10 -10 -10] \ -highlightthickness 0 -takefocus 0 -font g_titleFont radiobutton $frame.yTickButt.out -bg $powbg -text Out \ -variable powEditPlotParam(yTickLength,new) \ -value [list 10 10 10 10] \ -highlightthickness 0 -takefocus 0 -font g_titleFont checkbutton $frame.yTickButt.lab -bg $powbg -text "Labeled?"\ -variable powEditPlotParam(yLabelTicks,new) \ -onvalue [list Yes No No Yes] \ -offvalue [list No No No No] \ -highlightthickness 0 -takefocus 0 -font g_titleFont pack $frame.yTickButt.in -side left -padx 4 pack $frame.yTickButt.out -side left -padx 4 pack $frame.yTickButt.lab -side left -padx 20 grid $frame.yTickButt -row $row -column 3 -sticky w -padx 0 -columnspan 3 incr row # Tick Labeling label $frame.tickLabel -bg $powbg -text "Tick Labels:" -font g_titleFont grid $frame.tickLabel -in $frame -row $row -column 2 -sticky ne set col 3 foreach {lab val} [list Decimal decimal "Base 60 (deg)" degrees] { if {$col==5} {set col 3; incr row} radiobutton $frame.label$val -bg $powbg -text $lab \ -variable powEditPlotParam(tickLabels,new) -value $val \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.label$val -in $frame \ -row $row -column $col -sticky nw -padx 5 incr col } incr row grid rowconfigure $frame $row -minsize 7 incr row # Add a separator line frame $frame.sep -bg $powbg -relief ridge -height 2 -bd 2 grid $frame.sep -row $row -column 3 -columnspan 3 -sticky ew grid rowconfigure $frame $row -minsize 10 -weight 1 incr row # Setup Grid Options checkbutton $frame.grid -bg $powbg -text "Grid Lines -" \ -variable powEditPlotParam(GridLines,new) \ -highlightthickness 0 -onvalue Yes -offvalue No -font g_titleFont grid $frame.grid -in $frame -row $row -column 1 -sticky w -columnspan 6 incr row # Line Style label $frame.style -bg $powbg -text "Style:" -font g_titleFont grid $frame.style -in $frame -row $row -column 2 -sticky ne set col 3 foreach {style val} \ {Solid " " "Sm Dash" 10 "Lg Dash" 20 \ "Dotted" "4 4" "Dot Dash" "15 10 4 10"} { regsub -all { } $style {_} cln if {$col==6} {set col 3; incr row} radiobutton $frame.lStyle$cln -bg $powbg -text $style \ -variable powEditPlotParam(GridDash,new) -value $val \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.lStyle$cln -in $frame \ -row $row -column $col -sticky nw -padx 4 incr col } incr row grid rowconfigure $frame $row -minsize 7 incr row # Color label $frame.gridColor -bg $powbg -text "Color:" -font g_titleFont grid $frame.gridColor -in $frame -row $row -column 2 -sticky e powColorFrame $frame.gColors powEditPlotParam(GridColor,new) grid $frame.gColors -in $frame -row $row -column 3 -columnspan 3 \ -sticky w -padx 8 incr row grid rowconfigure $frame $row -minsize 5 incr row grid columnconfigure $frame 0 -minsize 5 grid columnconfigure $frame [list 3 4 5 6] -weight 1 } ################## # # Setup Page: Points # ################## proc powEditBuildCurveOptions1 { frame curve } { global powbg powEditCurveParam global g_titleFont # If frame already exists delete its contents if {[winfo exists $frame]} { foreach i [winfo children $frame] { destroy $i } } else { frame $frame -bg $powbg } # Set default values if not defined for this curve #puts "call powEditCurveDefOptions 1" powEditCurveDefOptions $curve # Build widgets set row 1 grid rowconfigure $frame $row -minsize 5 incr row # # Setup Points Options # # Point Display checkbutton $frame.pDisp -bg $powbg -text "Points -" \ -variable powEditCurveParam(pDisp${curve},new) \ -highlightthickness 0 -onvalue Yes -offvalue No -font g_titleFont grid $frame.pDisp -in $frame -row $row -column 1 -sticky w -columnspan 2 incr row grid rowconfigure $frame $row -minsize 10 incr row # Shape label $frame.shape -bg $powbg -text "Shape:" -font g_titleFont grid $frame.shape -in $frame -row $row -column 2 -sticky ne set col 3 set cnt 1 foreach shape {Dot Cross Diamond Box Octagon Triangle "Inv. Triangle"} { if {$col>=7} {set col 3; incr row} radiobutton $frame.pShape$cnt -bg $powbg -text $shape \ -variable powEditCurveParam(pShape${curve},new) -value $shape \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.pShape$cnt -in $frame \ -row $row -column $col -sticky nw -padx 4 if { $shape=="Inv. Triangle" } { grid configure $frame.pShape$cnt -columnspan 2 incr col } incr col incr cnt } incr row grid rowconfigure $frame $row -minsize 7 incr row # Size label $frame.size -bg $powbg -text "Size:" -font g_titleFont grid $frame.size -in $frame -row $row -column 2 -sticky ne frame $frame.pSize -bg $powbg radiobutton $frame.pSize.fixed -bg $powbg -text "Fixed... " \ -variable powEditCurveParam(pSizeErr${curve},new) -value No \ -highlightthickness 0 -takefocus 0 -font g_titleFont label $frame.pSize.text -bg $powbg -width 2 \ -textvariable powEditCurveParam(pSize${curve},new) -font g_titleFont label $frame.pSize.pt -bg $powbg -width 2 -text pt -font g_titleFont scale $frame.pSize.slide -from 2 -to 12 -orient horizontal \ -variable powEditCurveParam(pSize${curve},new) \ -highlightbackground $powbg -bg $powbg \ -showvalue 0 -takefocus 0 -font g_titleFont grid $frame.pSize.fixed -in $frame.pSize -row 1 -column 1 -sticky nw -padx 3 grid $frame.pSize.text -in $frame.pSize -row 1 -column 2 -sticky ne grid $frame.pSize.pt -in $frame.pSize -row 1 -column 3 -sticky nw grid $frame.pSize.slide -in $frame.pSize -row 1 -column 4 -sticky new \ -padx 4 grid columnconfigure $frame.pSize 4 -weight 1 grid $frame.pSize -in $frame -row $row -column 3 -columnspan 3 \ -sticky new incr row radiobutton $frame.pSizeError -bg $powbg -text Errorbars \ -variable powEditCurveParam(pSizeErr${curve},new) -value Yes \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.pSizeError -in $frame \ -row $row -column 3 -sticky nw -padx 4 incr row grid rowconfigure $frame $row -minsize 7 incr row # Point Filling label $frame.fill -bg $powbg -text "Fill:" -font g_titleFont grid $frame.fill -in $frame -row $row -column 2 -sticky ne set col 3 foreach {lab val} {Yes Yes No No} { if {$col==7} {set col 3; incr row} radiobutton $frame.pFill$val -bg $powbg -text $lab \ -variable powEditCurveParam(pFill${curve},new) -value $val \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.pFill$val -in $frame \ -row $row -column $col -sticky nw -padx 4 incr col } incr row grid rowconfigure $frame $row -minsize 7 incr row # Colors label $frame.pcolor -bg $powbg -text "Color:" -font g_titleFont grid $frame.pcolor -in $frame -row $row -column 1 -sticky e -columnspan 2 powColorFrame $frame.pColors powEditCurveParam(pColor${curve},new) grid $frame.pColors -in $frame -row $row -column 3 -columnspan 3 \ -sticky w -padx 8 incr row # Add a separator line frame $frame.sep -bg $powbg -relief ridge -height 2 -bd 2 grid $frame.sep -row $row -column 3 -columnspan 4 -sticky ew grid rowconfigure $frame $row -minsize 10 -weight 1 incr row # Data Transform label $frame.lLog -bg $powbg -text "Transform:" -font g_titleFont grid $frame.lLog -in $frame -row $row -column 2 -sticky ne checkbutton $frame.xLog -bg $powbg -text "Log X" \ -variable powEditCurveParam(logX${curve},new) \ -highlightthickness 0 -onvalue Yes -offvalue No -font g_titleFont checkbutton $frame.yLog -bg $powbg -text "Log Y" \ -variable powEditCurveParam(logY${curve},new) \ -highlightthickness 0 -onvalue Yes -offvalue No -font g_titleFont grid $frame.xLog -in $frame -row $row -column 3 -sticky w -padx 4 grid $frame.yLog -in $frame -row $row -column 4 -sticky w -padx 4 incr row grid rowconfigure $frame $row -minsize 5 incr row grid columnconfigure $frame 1 -minsize 10 grid columnconfigure $frame 0 -minsize 5 grid columnconfigure $frame [list 3 4 5 6] -weight 1 } ################## # # Setup Page: Lines # ################## proc powEditBuildCurveOptions2 { frame curve } { global powbg powEditCurveParam global g_titleFont # If frame already exists delete its contents if {[winfo exists $frame]} { foreach i [winfo children $frame] { destroy $i } } else { frame $frame -bg $powbg } # Set default values if not defined for this curve #puts "powEditCurveDefOptions 2" powEditCurveDefOptions $curve # Build widgets set row 1 grid rowconfigure $frame $row -minsize 5 incr row # # Setup Lines Options # # Line Display checkbutton $frame.lDisp -bg $powbg -text "Lines -" \ -variable powEditCurveParam(lDisp${curve},new) \ -highlightthickness 0 -onvalue Yes -offvalue No -font g_titleFont grid $frame.lDisp -in $frame -row $row -column 1 -sticky w -columnspan 2 incr row grid rowconfigure $frame $row -minsize 10 incr row # Style label $frame.style -bg $powbg -text "Style:" -font g_titleFont grid $frame.style -in $frame -row $row -column 2 -sticky ne set col 3 foreach {style val} \ {Solid " " "Sm Dash" 10 "Lg Dash" 20 \ "Dotted" "4 4" "Dot Dash" "15 10 4 10"} { regsub -all { } $style {_} cln if {$col==6} {set col 3; incr row} radiobutton $frame.lStyle$cln -bg $powbg -text $style \ -variable powEditCurveParam(lStyle${curve},new) -value $val \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.lStyle$cln -in $frame \ -row $row -column $col -sticky nw -padx 4 incr col } incr row grid rowconfigure $frame $row -minsize 7 incr row # Line Width label $frame.width -bg $powbg -text "Width:" -font g_titleFont grid $frame.width -in $frame -row $row -column 2 -sticky ne set col 3 foreach {size val} {Thin 1 Medium 2 Thick 3} { if {$col==6} {set col 3; incr row} radiobutton $frame.lWidth$size -bg $powbg -text $size \ -variable powEditCurveParam(lWidth${curve},new) -value $val \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.lWidth$size -in $frame \ -row $row -column $col -sticky nw -padx 4 incr col } incr row grid rowconfigure $frame $row -minsize 7 incr row # Histogram??? label $frame.step -bg $powbg -text "Connect:" -font g_titleFont grid $frame.step -in $frame -row $row -column 2 -sticky ne set col 3 foreach {style val} {"Normal" No "Histogram" Yes} { if {$col==6} {set col 3; incr row} radiobutton $frame.lStep$val -bg $powbg -text $style \ -variable powEditCurveParam(lStep${curve},new) -value $val \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.lStep$val -in $frame \ -row $row -column $col -sticky nw -padx 4 incr col } checkbutton $frame.lBoxFill -bg $powbg -text "Fill Boxes" \ -variable powEditCurveParam(lBoxFill${curve},new) \ -onvalue Yes -offvalue No \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.lBoxFill -row $row -column $col -sticky nw -padx 4 incr row grid rowconfigure $frame $row -minsize 7 incr row # Color label $frame.color -bg $powbg -text "Color:" -font g_titleFont grid $frame.color -in $frame -row $row -column 1 -sticky e -columnspan 2 powColorFrame $frame.lColors powEditCurveParam(lColor${curve},new) grid $frame.lColors -in $frame -row $row -column 3 -columnspan 3 \ -sticky w -padx 8 incr row # Add a separator line frame $frame.sep -bg $powbg -relief ridge -height 2 -bd 2 grid $frame.sep -row $row -column 3 -columnspan 3 -sticky ew grid rowconfigure $frame $row -minsize 10 -weight 1 incr row # Data Transform label $frame.lLog -bg $powbg -text "Transform:" -font g_titleFont grid $frame.lLog -in $frame -row $row -column 2 -sticky ne checkbutton $frame.xLog -bg $powbg -text "Log X" \ -variable powEditCurveParam(logX${curve},new) \ -highlightthickness 0 -onvalue Yes -offvalue No -font g_titleFont checkbutton $frame.yLog -bg $powbg -text "Log Y" \ -variable powEditCurveParam(logY${curve},new) \ -highlightthickness 0 -onvalue Yes -offvalue No -font g_titleFont grid $frame.xLog -in $frame -row $row -column 3 -sticky w -padx 4 grid $frame.yLog -in $frame -row $row -column 4 -sticky w -padx 4 incr row grid rowconfigure $frame $row -minsize 5 incr row grid columnconfigure $frame 1 -minsize 10 grid columnconfigure $frame 0 -minsize 5 grid columnconfigure $frame [list 3 4 5] -weight 1 } ################## # # Setup Page: Images # ################## proc powEditBuildImageOptions { frame image } { global powbg powEditImageParam powImageParam powRBmin powRBmax global g_titleFont # If frame already exists delete its contents if {[winfo exists $frame]} { foreach i [winfo children $frame] { destroy $i } } else { frame $frame -bg $powbg } # Set default values if not defined for this curve powEditImageDefOptions $image # Build widgets set row 1 grid rowconfigure $frame $row -minsize 5 incr row # # Setup Image Options # # Colormap label $frame.cmap -bg $powbg -text "Colormap:" -font g_titleFont grid $frame.cmap -in $frame -row $row -column 2 -sticky ne foreach colorGrp $powImageParam(allMaps,powDef) { set col 3 foreach cmap [lrange $colorGrp 1 end] { if {$col>=7} {set col 3; incr row} radiobutton $frame.cmap$cmap -bg $powbg -text $cmap \ -variable powEditImageParam(colormap${image},new) -value $cmap \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.cmap$cmap -in $frame \ -row $row -column $col -sticky nw -padx 4 incr col } incr row } grid rowconfigure $frame $row -minsize 7 incr row # Inverted? label $frame.inv -bg $powbg -text "Invert:" -font g_titleFont grid $frame.inv -in $frame -row $row -column 2 -sticky ne radiobutton $frame.invOn -bg $powbg -text Yes \ -variable powEditImageParam(invert${image},new) -value Yes \ -highlightthickness 0 -takefocus 0 -font g_titleFont radiobutton $frame.invOff -bg $powbg -text No \ -variable powEditImageParam(invert${image},new) -value No \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.invOn -in $frame \ -row $row -column 3 -sticky nw -padx 4 grid $frame.invOff -in $frame \ -row $row -column 4 -sticky nw -padx 4 incr row grid rowconfigure $frame $row -minsize 7 incr row # Scaling label $frame.scale -bg $powbg -text "Scaling:" -font g_titleFont grid $frame.scale -in $frame -row $row -column 2 -sticky ne set col 3 foreach {lab val} [list Linear linear Square-Root sqrt Logarithmic log \ "Histo Equalize" histo] { if {$col>=7} {set col 3; incr row} radiobutton $frame.scale$val -bg $powbg -text $lab \ -variable powEditImageParam(scale${image},new) -value $val \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.scale$val -in $frame \ -row $row -column $col -sticky nw -padx 4 incr col } incr row if { $image != "" } { grid rowconfigure $frame $row -minsize 7 incr row # Intensity range label $frame.range -bg $powbg -text "Range:" -font g_titleFont grid $frame.range -in $frame -row $row -column 2 -sticky e frame $frame.rng -bg $powbg entry $frame.rng.min -relief sunken -bg $powbg -width 12 \ -textvariable powEditImageParam(RBmin${image},new) -font g_titleFont label $frame.rng.to -bg $powbg -text "-" -font g_titleFont entry $frame.rng.max -relief sunken -bg $powbg -width 12 \ -textvariable powEditImageParam(RBmax${image},new) -font g_titleFont button $frame.rng.reset -bg $powbg \ -text "Reset to [format "%.6g-%.6g" $powRBmin($image) \ $powRBmax($image)]" \ -command " set powEditImageParam(RBmin${image},new) $powRBmin($image) set powEditImageParam(RBmax${image},new) $powRBmax($image) " -font g_titleFont # label $frame.rng.orig -bg $powbg \ # -text "Orig: pack $frame.rng.min -side left pack $frame.rng.to -side left pack $frame.rng.max -side left pack $frame.rng.reset -side left -padx 10 grid $frame.rng -in $frame -row $row -column 3 -columnspan 4\ -sticky news -padx 4 } grid rowconfigure $frame $row -minsize 5 incr row grid columnconfigure $frame 1 -minsize 10 grid columnconfigure $frame 0 -minsize 5 grid columnconfigure $frame [list 3 4 5 6] -weight 1 } ######################################################################## # # Listbox manipulation # proc powEditAddElems { } { global powEditGraphName global powEditPlotParam powEditCurveParam global powDWP set elemNo [${powDWP}gEdit.elemList.lst curselection] if { $elemNo != "" } { set item [${powDWP}gEdit.elemList.lst get $elemNo] ${powDWP}gEdit.elemList.lst delete $elemNo if { [${powDWP}gEdit.elemList.lst size]<=$elemNo } { ${powDWP}gEdit.elemList.lst selection set end } else { ${powDWP}gEdit.elemList.lst selection set $elemNo } ${powDWP}gEdit.graphList.lst insert end $item ${powDWP}gEdit.graphList.lst selection clear 0 end ${powDWP}gEdit.graphList.lst selection set end foreach {name type} [split $item { }] {} if { $type=="(curve)" } { if { $powEditPlotParam(curves,new)=="NULL" } { set powEditPlotParam(curves,new) $name } else { lappend powEditPlotParam(curves,new) $name } } else { if { $powEditPlotParam(images,new)=="NULL" } { set powEditPlotParam(images,new) $name } else { lappend powEditPlotParam(images,new) $name } } } powEditBuildOptions } proc powEditRemoveElems { } { global powEditGraphName global powEditPlotParam powEditCurveParam global powDWP set graphNo [${powDWP}gEdit.graphList.lst curselection] if { $graphNo=="" } return if { $graphNo != "" } { set item [${powDWP}gEdit.graphList.lst get $graphNo] ${powDWP}gEdit.graphList.lst delete $graphNo if { [${powDWP}gEdit.graphList.lst size]<=$graphNo } { ${powDWP}gEdit.graphList.lst selection set end } else { ${powDWP}gEdit.graphList.lst selection set $graphNo } ${powDWP}gEdit.elemList.lst insert end $item ${powDWP}gEdit.elemList.lst selection clear 0 end ${powDWP}gEdit.elemList.lst selection set end foreach {name type} [split $item { }] {} if { $type=="(curve)" } { set i [lsearch -exact $powEditPlotParam(curves,new) $name] if { [llength $powEditPlotParam(curves,new)]==1 } { set powEditPlotParam(curves,new) NULL } else { set powEditPlotParam(curves,new) \ [lreplace $powEditPlotParam(curves,new) $i $i] } } else { set i [lsearch -exact $powEditPlotParam(images,new) $name] if { [llength $powEditPlotParam(images,new)]==1 } { set powEditPlotParam(images,new) NULL } else { set powEditPlotParam(images,new) \ [lreplace $powEditPlotParam(images,new) $i $i] } } } powEditBuildOptions } proc powEditUpdateListboxes { } { global powEditGraphName global powEditPlotParam powEditCurveParam global powDWP #puts "call powEditUpdateListboxes" ${powDWP}gEdit.graphList.lst delete 0 end ${powDWP}gEdit.elemList.lst delete 0 end set curves "" set images "" foreach item $powEditPlotParam(curves,new) { if {$item!="NULL"} { ${powDWP}gEdit.graphList.lst insert end "${item} (curve)" lappend curves $item } } foreach item $powEditPlotParam(images,new) { if {$item!="NULL"} { ${powDWP}gEdit.graphList.lst insert end "${item} (image)" lappend images $item } } foreach item [powListCurves] { if { [lsearch -exact $curves $item]==-1 } { ${powDWP}gEdit.elemList.lst insert end "${item} (curve)" } } foreach item [powListImages] { if { [lsearch -exact $images $item]==-1 } { ${powDWP}gEdit.elemList.lst insert end "${item} (image)" } } if { [${powDWP}gEdit.elemList.lst size]>0 } { ${powDWP}gEdit.elemList.lst selection set 0 } if { [${powDWP}gEdit.graphList.lst size]>0 } { ${powDWP}gEdit.graphList.lst selection set 0 } } ######################################################################## # # Variable management # proc powEditInitVariables { {flag "init"} } { global powEditGraphName powDWP global powPlotParam powCurveParam powImageParam powFontParam global powEditPlotParam powEditCurveParam powEditImageParam global powEditFontParam #puts "flag: $flag, powEditGraphName: $powEditGraphName" if { $flag == "reset" } { foreach el [array names powPlotParam] { set p1 [lindex [split $el ,] 0] set p2 [lindex [split $el ,] 1] if { $p2 == $powEditGraphName } { if { $flag == "reset" } { if [info exists powEditPlotParam($p1,powDef)] { set powPlotParam($p1,$p2) $powEditPlotParam($p1,powDef) } } } } } # Start fresh catch {unset powEditPlotParam} catch {unset powEditCurveParam} catch {unset powEditImageParam} catch {unset powEditFontParam} foreach el [array names powPlotParam] { set p1 [lindex [split $el ,] 0] set p2 [lindex [split $el ,] 1] if { $p2 == $powEditGraphName } { set powEditPlotParam($p1,old) $powPlotParam($p1,$p2) set powEditPlotParam($p1,new) $powPlotParam($p1,$p2) } } set powEditPlotParam(scalData,new) No # Hide some plot parameters foreach el [list xo yo handletext FixedAspect regions] { catch {unset powEditPlotParam($el,new)} } foreach el [array names powCurveParam] { set p1 [lindex [split $el ,] 0] set p2 [lindex [split $el ,] 1] if { $p2 == $powEditGraphName } { set powEditCurveParam($p1,old) $powCurveParam($p1,$p2) set powEditCurveParam($p1,new) $powCurveParam($p1,$p2) } } foreach el [array names powImageParam] { set p1 [lindex [split $el ,] 0] set p2 [lindex [split $el ,] 1] if { $p2 == $powEditGraphName } { set powEditImageParam($p1,old) $powImageParam($p1,$p2) set powEditImageParam($p1,new) $powImageParam($p1,$p2) } } foreach el [array names powFontParam] { set p1 [lindex [split $el ,] 0] set p2 [lindex [split $el ,] 1] if { $p2 == $powEditGraphName } { set powEditFontParam($p1,old) $powFontParam($p1,$p2) set powEditFontParam($p1,new) $powFontParam($p1,$p2) } } if { [winfo exists ${powDWP}gEdit] } { powEditUpdateListboxes } } proc powEditUpdateVariables { } { global powEditGraphName global powPlotParam powCurveParam powImageParam powFontParam global powEditPlotParam powEditCurveParam powEditImageParam global powEditFontParam global powWCSLabel powEditObject # Set default values of graph's curves if not already defined # Must do this before updating powPlotParam # because powEditCurveDefOptions references it #puts "powEditPlotParam(curves,new): $powEditPlotParam(curves,new)" foreach crv $powEditPlotParam(curves,new) { #puts " call powEditCurveDefOptions: $crv" powEditCurveDefOptions $crv } foreach img $powEditPlotParam(images,new) { powEditImageDefOptions $img } #### # Now update the global hashes for the modified graph #### foreach el [array names powEditFontParam] { set p1 [lindex [split $el ,] 0] set p2 [lindex [split $el ,] 1] if { $p2 == "new" } { set powFontParam($p1,$powEditGraphName) $powEditFontParam($p1,new) } } powEditConvertToAxes foreach el [array names powEditPlotParam] { set p1 [lindex [split $el ,] 0] set p2 [lindex [split $el ,] 1] if { $p2 == "new" } { if { ![info exists powEditPlotParam($p1,powDef)] && \ [info exists powPlotParam($p1,$powEditGraphName)] } { set powEditPlotParam($p1,powDef) $powPlotParam($p1,$powEditGraphName) } if { $p1 == "xdimdisp" } { #puts " B powPlotParam($p1,$powEditGraphName): $powPlotParam($p1,$powEditGraphName)" } set powPlotParam($p1,$powEditGraphName) $powEditPlotParam($p1,new) set powPlotParam($p1,${powEditGraphName}scope) $powEditPlotParam($p1,new) if { $p1 == "xdimdisp" } { #puts " A powPlotParam($p1,$powEditGraphName): $powPlotParam($p1,$powEditGraphName)" } switch $p1 { "xunits" - "yunits" - "xlabel" - "ylabel" { set target $p1 if { [string first "unit" $p1] >= 0 } { set target [string range $p1 0 4] } set powWCSLabel($target,$powEditGraphName,DEFAULT) $powEditPlotParam($p1,new) } } } } unset powPlotParam(scalData,$powEditGraphName) foreach el [array names powEditCurveParam] { set p1 [lindex [split $el ,] 0] set p2 [lindex [split $el ,] 1] if { $p2 == "new" } { set powCurveParam($p1,$powEditGraphName) $powEditCurveParam($p1,new) set powCurveParam($p1,${powEditGraphName}scope) \ $powEditCurveParam($p1,new) } } foreach img $powEditPlotParam(images,new) { if { $img == "NULL" } continue # Check for new colormap scaling if { [info exists powImageParam(lut$img,$powEditGraphName)] \ && $powImageParam(scale$img,$powEditGraphName) \ != $powEditImageParam(scale$img,new) } { unset powImageParam(lut$img,$powEditGraphName) } foreach {gn2 img2} [powGetColorbarLink $powEditGraphName $img] {} foreach opt [eval list $powImageParam(allOpts,powDef) RBmin RBmax] { set powImageParam(${opt}${img},$powEditGraphName) \ $powEditImageParam(${opt}${img},new) set powImageParam(${opt}${img},${powEditGraphName}scope) \ $powEditImageParam(${opt}${img},new) if { $gn2 != "" } { set powImageParam(${opt}${img2},${gn2}) \ $powEditImageParam(${opt}${img},new) set powImageParam(${opt}${img2},${gn2}scope) \ $powEditImageParam(${opt}${img},new) } } if { $gn2 != "" } { powSetColorTable $gn2 $img2 powReditherImage $gn2 $img2 } } } ######################################################################## proc powEditConvertToAxes {} { global powEditPlotParam powEditCurveParam if { $powEditPlotParam(scalData,new) } { foreach crv $powEditPlotParam(curves,new) { if { $crv=="NULL" } continue if { $powEditPlotParam(xTickScal,new)=="log" } { set powEditCurveParam(logX${crv},new) Yes } else { set powEditCurveParam(logX${crv},new) No } if { $powEditPlotParam(yTickScal,new)=="log" } { set powEditCurveParam(logY${crv},new) Yes } else { set powEditCurveParam(logY${crv},new) No } } } } ######################################################################## proc powEditCurveDefOptions { curve } { global powEditCurveParam powCurveParam powPlotParam #puts "curve: $curve" if { $curve == "NULL" || $curve == "" } return set crvGraph "" foreach opt $powCurveParam(allOpts,powDef) { if {! [info exists powEditCurveParam(${opt}${curve},new)]} { if { $crvGraph=="" } { set crvGraph powDef foreach grph [powListGraphs] { if { [regexp "scope$" $grph] } continue if { [lsearch -exact $powPlotParam(curves,$grph) $curve] \ != -1 } { set crvGraph $grph } } } if { $crvGraph=="powDef" } { set powEditCurveParam(${opt}${curve},new) \ $powCurveParam(${opt},powDef) set powEditCurveParam(${opt}${curve},old) \ $powCurveParam(${opt},powDef) } else { set powEditCurveParam(${opt}${curve},new) \ $powCurveParam(${opt}${curve},$crvGraph) set powEditCurveParam(${opt}${curve},old) \ $powCurveParam(${opt}${curve},$crvGraph) } } } } proc powEditImageDefOptions { image } { global powEditImageParam powImageParam powPlotParam global powRBmin powRBmax if { $image == "NULL" || $image == "" } return set imgGraph "" foreach opt $powImageParam(allOpts,powDef) { if {! [info exists powEditImageParam(${opt}${image},new)]} { if { $imgGraph=="" } { set imgGraph powDef foreach grph [powListGraphs] { if { [regexp "scope$" $grph] } continue if { [lsearch -exact $powPlotParam(images,$grph) $image] \ != -1 } { set imgGraph $grph } } } if { $imgGraph=="powDef" } { set powEditImageParam(${opt}${image},new) \ $powImageParam(${opt},powDef) set powEditImageParam(${opt}${image},old) \ $powImageParam(${opt},powDef) } else { set powEditImageParam(${opt}${image},new) \ $powImageParam(${opt}${image},$imgGraph) set powEditImageParam(${opt}${image},old) \ $powImageParam(${opt}${image},$imgGraph) } } } # Must also worry about RBmin and RBmax which don't have powDef defaults if {! [info exists powEditImageParam(RBmin${image},new)]} { if { $imgGraph=="" || $imgGraph=="powDef" } { set powEditImageParam(RBmin${image},new) \ $powRBmin($image) set powEditImageParam(RBmin${image},old) \ $powRBmin($image) set powEditImageParam(RBmax${image},new) \ $powRBmax($image) set powEditImageParam(RBmax${image},old) \ $powRBmax($image) } else { set powEditImageParam(RBmin${image},new) \ $powImageParam(RBmin${image},$imgGraph) set powEditImageParam(RBmin${image},old) \ $powImageParam(RBmin${image},$imgGraph) set powEditImageParam(RBmax${image},new) \ $powImageParam(RBmax${image},$imgGraph) set powEditImageParam(RBmax${image},old) \ $powImageParam(RBmax${image},$imgGraph) } } } ########################################################################### # # # Routines for editting Objects # # # ########################################################################### proc powEditObjectDlg { } { global powPlotParam powCurveParam powbg global powEditObject global powDWP global g_titleFont if {[winfo exists ${powDWP}object]} {destroy ${powDWP}object} powToplevel ${powDWP}object .pow "-bg $powbg" bind ${powDWP}object <> "powEditExitObjDlg" catch {wm title ${powDWP}object "Edit Objects"} label ${powDWP}object.objectCont -text "All Objects:" -fg black -bg yellow -font g_titleFont frame ${powDWP}object.objectList -bg $powbg scrollbar ${powDWP}object.objectList.scrolly -orient vertical -takefocus 0 \ -command {global powDWP ; ${powDWP}object.objectList.lst yview} -bg $powbg listbox ${powDWP}object.objectList.lst -bg $powbg -width 25 -height 6 \ -selectmode browse -exportselection 0 -takefocus 0 \ -yscrollcommand {global powDWP ; ${powDWP}object.objectList.scrolly set } -font g_titleFont bind ${powDWP}object.objectList.lst \ { powEditUpdateObject } grid ${powDWP}object.objectList.lst -in ${powDWP}object.objectList \ -row 1 -column 1 -sticky news grid ${powDWP}object.objectList.scrolly -in ${powDWP}object.objectList \ -row 1 -column 2 -sticky news grid rowconfigure ${powDWP}object.objectList 1 -weight 1 grid columnconfigure ${powDWP}object.objectList 1 -weight 1 label ${powDWP}object.dataCont -text "All Data:" -fg black -bg yellow -font g_titleFont frame ${powDWP}object.dataList -bg $powbg scrollbar ${powDWP}object.dataList.scrolly -orient vertical -takefocus 0 \ -command {global powDWP ; ${powDWP}object.dataList.lst yview} -bg $powbg listbox ${powDWP}object.dataList.lst -bg $powbg -width 25 -height 6 \ -selectmode browse -exportselection 0 -takefocus 0 \ -yscrollcommand {global powDWP ; ${powDWP}object.dataList.scrolly set } -font g_titleFont grid ${powDWP}object.dataList.lst -in ${powDWP}object.dataList -row 1 -column 1 \ -sticky news grid ${powDWP}object.dataList.scrolly -in ${powDWP}object.dataList -row 1 -column 2 \ -sticky news grid rowconfigure ${powDWP}object.dataList 1 -weight 1 grid columnconfigure ${powDWP}object.dataList 1 -weight 1 button ${powDWP}object.help -bg $powbg -text "Help" \ -command {powHelp EditObjects.html} -takefocus 0 -font g_titleFont grid ${powDWP}object.objectCont -in ${powDWP}object -row 1 -column 1 -sticky w \ -padx 5 -pady 5 grid ${powDWP}object.objectList -in ${powDWP}object -row 2 -column 1 -sticky news grid ${powDWP}object.help -in ${powDWP}object -row 1 -column 2 grid ${powDWP}object.dataCont -in ${powDWP}object -row 1 -column 3 -sticky w \ -padx 5 -pady 5 grid ${powDWP}object.dataList -in ${powDWP}object -row 2 -column 3 -sticky news button ${powDWP}object.editData -text "Edit Data" -bg $powbg -takefocus 0 \ -command { if { [info exists powDontPush] } { puts "I told you not to push that button again." } else { puts "Don't push that button again." set powDontPush 1 } } -font g_titleFont #grid ${powDWP}object.editData -in ${powDWP}object -row 3 -column 3 -sticky n -pady 2 frame ${powDWP}object.objectName -bg $powbg label ${powDWP}object.objectName.lab -bg yellow -fg black -text "Object Name:" -font g_titleFont entry ${powDWP}object.objectName.ent -textvariable powEditObject(name) \ -bg $powbg -font g_titleFont pack ${powDWP}object.objectName.lab -in ${powDWP}object.objectName -side left pack ${powDWP}object.objectName.ent -in ${powDWP}object.objectName -side left -padx 5 grid ${powDWP}object.objectName -in ${powDWP}object -row 3 -column 1 \ -columnspan 2 -sticky w -padx 18 frame ${powDWP}object.objectType -bg $powbg -relief ridge -bd 3 label ${powDWP}object.objectType.lab -bg yellow -fg black -text "Object Type:" -font g_titleFont radiobutton ${powDWP}object.objectType.curve -bg $powbg -text Curve \ -variable powEditObject(type) -value "(curve)" \ -highlightthickness 0 -takefocus 0 -font g_titleFont radiobutton ${powDWP}object.objectType.image -bg $powbg -text Image \ -variable powEditObject(type) -value "(image)" \ -highlightthickness 0 -takefocus 0 -font g_titleFont set powEditObject(type) "(curve)" pack ${powDWP}object.objectType.lab -in ${powDWP}object.objectType -side left pack ${powDWP}object.objectType.curve -in ${powDWP}object.objectType \ -side left -padx 10 pack ${powDWP}object.objectType.image -in ${powDWP}object.objectType \ -side left -padx 10 grid ${powDWP}object.objectType -in ${powDWP}object -row 4 -column 1 -sticky sew \ -columnspan 3 -padx 15 frame ${powDWP}object.btns -bg $powbg button ${powDWP}object.btns.create -text "Create Object" -bg $powbg \ -command {powEditCreateObject} -font g_titleFont button ${powDWP}object.btns.reload -text "Reload Info" -bg $powbg \ -command {powEditLoadObjects; powEditBuildObject} -font g_titleFont button ${powDWP}object.btns.exit -text "Exit" -bg $powbg \ -command powEditExitObjDlg -font g_titleFont pack ${powDWP}object.btns.create -in ${powDWP}object.btns -side left \ -padx 5 -pady 2 pack ${powDWP}object.btns.reload -in ${powDWP}object.btns -side left \ -padx 5 -pady 2 pack ${powDWP}object.btns.exit -in ${powDWP}object.btns -side left \ -padx 5 -pady 2 grid ${powDWP}object.btns -in ${powDWP}object -row 6 -column 1 -columnspan 3 \ -pady 5 grid rowconfigure ${powDWP}object 2 -weight 1 grid rowconfigure ${powDWP}object 5 -weight 1 grid columnconfigure ${powDWP}object 1 -weight 1 grid columnconfigure ${powDWP}object 3 -weight 1 powEditLoadObjects powEditBuildObject trace variable powEditObject(type) w powChangeBuildObject } proc powEditExitObjDlg { } { global powDWP destroy ${powDWP}object } proc powEditLoadObjects { {init 1} } { global powDWP ${powDWP}object.objectList.lst delete 0 end ${powDWP}object.dataList.lst delete 0 end set last "NULL (curve)" foreach itm [powListCurves] { set last "$itm (curve)" ${powDWP}object.objectList.lst insert end $last } foreach itm [powListImages] { set last "$itm (image)" ${powDWP}object.objectList.lst insert end $last } foreach itm [powListData] { ${powDWP}object.dataList.lst insert end "$itm ([powFetchDataLength $itm])" } ${powDWP}object.dataList.lst insert end "NULL (0)" ${powDWP}object.dataList.lst selection set 0 if {$init} { ${powDWP}object.objectList.lst selection set end eval [concat powEditInitObject $last] } } proc powEditInitObject { obj typ } { global powEditObject powWCS global powRotation if {$typ == "(curve)"} { set loc [lsearch -exact [powListCurves] $obj] } else { set loc [lsearch -exact [powListImages] $obj] } set powEditObject(name) $obj set powEditObject(type) $typ # Initialize all the entries to standard default NULLS or values foreach el [list xdata xedata xunits ydata yedata yunits \ zdata zedata zunits] { set powEditObject($el) NULL } foreach el [list xdim ydim xorigin yorigin xinc yinc] { set powEditObject($el) 1 } set powEditObject(wcs) 0 foreach el [list xref yref xrefpix yrefpix xinc yinc rot ctype] { set powEditObject(wcs$el) " " } if ![info exists powRotation($obj)] { set powRotation($obj) 0.0 #powChangeFitsHeaderKeyWordValue $obj {"CROAT2"} "X" $powRotation($obj) } set powEditObject(wcsrot) $powRotation($obj) # Now fill in the known quantities if { $obj!="NULL" && $loc!=-1 } { if { $typ=="(image)" } { array set powEditObject [powFetchImageInfoHash $obj] set powEditObject(xdata) $powEditObject(data) set powEditObject(xdim) $powEditObject(width) set powEditObject(ydim) $powEditObject(height) } else { array set powEditObject [powFetchCurveInfoHash $obj] foreach {vec lc} {X x Y y XE xe YE ye} { if { $powEditObject($vec) != "NULL" } { array set tmpArray \ [powFetchVectorInfoHash $powEditObject($vec)] set powEditObject(${lc}data) $tmpArray(data) set powEditObject(${lc}units) $tmpArray(units) } else { set powEditObject(${lc}data) NULL set powEditObject(${lc}units) NULL } } } if {[info exists powWCS($obj)] && $powWCS($obj) != "" } { set powEditObject(wcs) 1 set wcslist $powWCS($obj) # wcsinfo : {xrefvalue yrefvalue} {xrefpix yrefpix} {cdelt} {unit} {type} set powEditObject(wcsxref) [lindex [lindex $wcslist 0] 0] set powEditObject(wcsyref) [lindex [lindex $wcslist 0] 1] set powEditObject(wcsxrefpix) [lindex [lindex $wcslist 1] 0] set powEditObject(wcsyrefpix) [lindex [lindex $wcslist 1] 1] set powEditObject(wcsxinc) [lindex [lindex $wcslist 2] 0] set powEditObject(wcsxrot_cal) [lindex [lindex $wcslist 2] 1] set powEditObject(wcsyrot_cal) [lindex [lindex $wcslist 2] 2] set powEditObject(wcsyinc) [lindex [lindex $wcslist 2] 3] set powEditObject(wcsxunit) [lindex [lindex $wcslist 3] 0] set powEditObject(wcsyunit) [lindex [lindex $wcslist 3] 1] set powEditObject(wcsctype) [lindex [lindex $wcslist 4] 0] } } } proc powEditCreateObject { } { global powEditObject powWCS powFitsHeader powFitsHeaderCnt global powDWP g_magification powPlotParam powRotation global xCount yCount set obj $powEditObject(name) set wcslist {} if { $powEditObject(wcs) } { set wcsxinc $powEditObject(wcsxinc) set wcsyinc $powEditObject(wcsyinc) if { $powRotation($obj) != 0.0 } { # restore xinc yinc back to rotation 0.0 degree set wcsxinc [expr $powEditObject(wcsxrot_cal) / cos($powRotation($obj))] set wcsyinc [expr $powEditObject(wcsyrot_cal) / sin($powRotation($obj))] } # get user input rotation set powRotation($obj) $powEditObject(wcsrot) set powEditObject(wcsxrot_cal) [expr $wcsxinc * cos($powRotation($obj))] set powEditObject(wcsyrot_cal) [expr $wcsyinc * sin($powRotation($obj))] lappend wcslist [list $powEditObject(wcsxref) $powEditObject(wcsyref)] lappend wcslist [list $powEditObject(wcsxrefpix) $powEditObject(wcsyrefpix)] lappend wcslist [list $powEditObject(wcsxinc) $powEditObject(wcsxrot_cal) \ $powEditObject(wcsyrot_cal) $powEditObject(wcsyinc)] lappend wcslist [list $powEditObject(wcsxunit) $powEditObject(wcsyunit)] lappend wcslist [list $powEditObject(wcsctype) $powEditObject(wcsctype)] set graphHandle $obj if { $powEditObject(type)=="(curve)" } { # get rid of "c1_" for curve set graphHandle [string range $obj 3 end] } powChangeFitsHeaderKeyWordValue $graphHandle {"CTYPE1" "CTYPE2" "CDELT1" "CDELT2" "CROTA2" } \ "X" \ [list [format "RA--%s" $powEditObject(wcsctype)] \ [format "DEC-%s" $powEditObject(wcsctype)] \ $powEditObject(wcsxinc) \ $powEditObject(wcsyinc) \ $powRotation($obj)] \ [list $powEditObject(wcsxref) $powEditObject(wcsyref)] set powFitsHeader($obj) $powFitsHeader($graphHandle) set powFitsHeaderCnt($obj) $powFitsHeaderCnt($graphHandle) } set powFitsHeader(${obj}scope) $powFitsHeader($obj) set powFitsHeaderCnt(${obj}scope) $powFitsHeaderCnt($obj) set powWCS($obj) $wcslist set powWCS(${obj}scope) $wcslist if { $powEditObject(type)=="(curve)" } { set powFitsHeaderStr $powFitsHeader($obj) set powFitsHeaderCntValue $powFitsHeaderCnt($obj) catch { powDeleteGraph $graphHandle NOPROMPT powDeleteImage $graphHandle $graphHandle powDeleteCurve $graphHandle curve } set powWCS($obj) $wcslist set powWCS($graphHandle) $wcslist set powWCS(${graphHandle}scope) $wcslist set powFitsHeader($obj) $powFitsHeaderStr set powFitsHeaderCnt($obj) $powFitsHeaderCntValue set powFitsHeader(${graphHandle}scope) $powFitsHeaderStr set powFitsHeaderCnt(${graphHandle}scope) $powFitsHeaderCntValue set powFitsHeader($graphHandle) $powFitsHeader($obj) set powFitsHeaderCnt($graphHandle) $powFitsHeaderCnt($obj) set powPlotParam(graphType,$obj) "binary" set powPlotParam(graphType,${obj}scope) "binary" set powPlotParam(graphType,$graphHandle) "binary" set powPlotParam(graphType,${graphHandle}scope) "binary" set powPlotParam(zoomed,${graphHandle}) 0 set powPlotParam(zoomed,${graphHandle}scope) 0 set powPlotParam(zoomed,${obj}) 0 set powPlotParam(zoomed,${obj}scope) 0 set xCount(${obj}) 0 set yCount(${obj}) 0 set xCount(${obj}scope) 0 set yCount(${obj}scope) 0 set xCount(${graphHandle}) 0 set yCount(${graphHandle}) 0 set xCount(${graphHandle}scope) 0 set yCount(${graphHandle}scope) 0 set vectors "" foreach vec { x xe y ye } { if { $powEditObject(${vec}data) == "NULL" } { lappend vectors NULL } else { powCreateVector ${obj}_${vec}data $powEditObject(${vec}data) 0 \ NULL $powEditObject(${vec}units) lappend vectors ${obj}_${vec}data } } eval [concat powCreateCurve $obj $vectors] eval [concat powCreateGraph $graphHandle $obj NULL \ NULL NULL \ $powPlotParam(xlabel,$graphHandle) \ $powPlotParam(ylabel,$graphHandle) \ [lindex $fvPref::graphDispSize 0] \ [lindex $fvPref::graphDispSize 1]] } else { if { $powEditObject(wcs) } { powCreateImage $obj $powEditObject(xdata) \ 0 0 \ $powEditObject(xdim) $powEditObject(ydim) \ 1 1 1 1 \ $powEditObject(xunits) $powEditObject(yunits) \ $powEditObject(zunits) } else { powCreateImage $obj $powEditObject(xdata) \ 0 0 \ $powEditObject(xdim) $powEditObject(ydim) \ $powEditObject(xorigin) $powEditObject(xinc) \ $powEditObject(yorigin) $powEditObject(yinc) \ $powEditObject(xunits) $powEditObject(yunits) \ $powEditObject(zunits) } powEndROI 1 } powEditLoadObjects 0 set elem "$obj $powEditObject(type)" set num [lsearch -exact [${powDWP}object.objectList.lst get 0 end] $elem] ${powDWP}object.objectList.lst selection set $num eval [concat powEditInitObject $elem] } proc powEditUpdateObject { } { global powDWP set itm [${powDWP}object.objectList.lst curselection] if {$itm==""} { powEditInitObject NULL "(curve)" } else { eval [concat powEditInitObject [${powDWP}object.objectList.lst get $itm]] } powEditBuildObject } proc powChangeBuildObject { a b c } { powEditBuildObject } proc powEditBuildObject { } { global powEditObject powbg global powDWP if { $powEditObject(type)=="(curve)" } { powEditBuildCurve ${powDWP}object.curveFrame ${powDWP}object.curveFrame configure -borderwidth 3 -relief ridge grid ${powDWP}object.curveFrame -in ${powDWP}object -row 5 -column 1 \ -padx 15 -pady 5 -columnspan 3 -sticky news catch {grid remove ${powDWP}object.imageFrame} } else { powEditBuildImage ${powDWP}object.imageFrame ${powDWP}object.imageFrame configure -borderwidth 3 -relief ridge grid ${powDWP}object.imageFrame -in ${powDWP}object -row 5 -column 1 \ -padx 15 -pady 5 -columnspan 3 -sticky news catch {grid remove ${powDWP}object.curveFrame} } } proc powEditUpdateDataButton { btn var } { global powEditObject global powDWP set elem [${powDWP}object.dataList.lst curselection] if { $elem=="" } return set data [lindex [${powDWP}object.dataList.lst get $elem] 0] set powEditObject($var) $data $btn configure -text $data } proc powEditBuildCurve { frame } { global powEditObject powbg global g_titleFont if { [winfo exists $frame] } { foreach {lbl var} [list Data: data Error: edata] { $frame.bx$var configure -text $powEditObject(x$var) $frame.by$var configure -text $powEditObject(y$var) } return } frame $frame -bg $powbg set row 1 grid columnconfigure $frame 1 -minsize 10 grid columnconfigure $frame 4 -minsize 10 label $frame.x -bg $powbg -text X -font g_titleFont label $frame.y -bg $powbg -text Y -font g_titleFont grid $frame.x -in $frame -row $row -column 3 -sticky s grid $frame.y -in $frame -row $row -column 5 -sticky s incr row # Create data buttons foreach {lbl var} [list Data: data Error: edata] { label $frame.l$var -bg $powbg -text $lbl -font g_titleFont grid $frame.l$var -in $frame -row $row -column 2 -sticky e -padx 10 button $frame.bx$var -bg $powbg -text $powEditObject(x$var) \ -command "powEditUpdateDataButton $frame.bx$var x$var" -font g_titleFont button $frame.by$var -bg $powbg -text $powEditObject(y$var) \ -command "powEditUpdateDataButton $frame.by$var y$var" -font g_titleFont grid $frame.bx$var -in $frame -row $row -column 3 -sticky news grid $frame.by$var -in $frame -row $row -column 5 -sticky news incr row } foreach {lbl var} [list Units: units] { label $frame.l$var -bg $powbg -text $lbl -font g_titleFont grid $frame.l$var -in $frame -row $row -column 2 -sticky e -padx 10 entry $frame.ex$var -bg $powbg -textvariable powEditObject(x$var) \ -takefocus 1 -font g_titleFont entry $frame.ey$var -bg $powbg -textvariable powEditObject(y$var) \ -takefocus 1 -font g_titleFont grid $frame.ex$var -in $frame -row $row -column 3 -sticky news grid $frame.ey$var -in $frame -row $row -column 5 -sticky news incr row } grid rowconfigure $frame $row -minsize 10 incr row powEditBuildWCS $frame $row } proc powEditBuildImage { frame } { global powEditObject powbg global g_titleFont if { [winfo exists $frame] } { $frame.bdata configure -text $powEditObject(xdata) return } frame $frame -bg $powbg set row 1 grid columnconfigure $frame 1 -minsize 10 grid columnconfigure $frame 4 -minsize 10 label $frame.ldata -bg $powbg -text "Data:" -font g_titleFont grid $frame.ldata -in $frame -row $row -column 2 -sticky e -padx 10 button $frame.bdata -bg $powbg -text $powEditObject(xdata) \ -command "powEditUpdateDataButton $frame.bdata xdata; set powEditObject(ydim) 1; set powEditObject(xdim) \ \[powFetchDataLength \$powEditObject(xdata)\]" -font g_titleFont grid $frame.bdata -in $frame -row $row -column 3 -sticky w -columnspan 3 incr row label $frame.lzunits -bg $powbg -text "Units:" -font g_titleFont grid $frame.lzunits -in $frame -row $row -column 2 -sticky e -padx 10 entry $frame.ezunits -bg $powbg -textvariable powEditObject(zunits) \ -takefocus 1 -font g_titleFont grid $frame.ezunits -in $frame -row $row -column 3 -sticky w incr row grid rowconfigure $frame $row -minsize 10 incr row label $frame.x -bg $powbg -text X -font g_titleFont label $frame.y -bg $powbg -text Y -font g_titleFont grid $frame.x -in $frame -row $row -column 3 -sticky s grid $frame.y -in $frame -row $row -column 5 -sticky s incr row foreach {lbl var} \ [list Dimensions: dim Origin: origin "Pixel Size:" inc Units: units] { label $frame.l$var -bg $powbg -text $lbl -font g_titleFont grid $frame.l$var -in $frame -row $row -column 2 -sticky e -padx 10 entry $frame.ex$var -bg $powbg -textvariable powEditObject(x$var) \ -takefocus 1 -font g_titleFont entry $frame.ey$var -bg $powbg -textvariable powEditObject(y$var) \ -takefocus 1 -font g_titleFont grid $frame.ex$var -in $frame -row $row -column 3 -sticky news grid $frame.ey$var -in $frame -row $row -column 5 -sticky news incr row } grid rowconfigure $frame $row -minsize 10 incr row powEditBuildWCS $frame $row } proc powEditBuildWCS { frame row } { global powEditObject powbg global g_titleFont # Build WCS entries checkbutton $frame.wcs -bg $powbg -text "WCS Info -" \ -highlightthickness 0 -takefocus 0 \ -variable powEditObject(wcs) -font g_titleFont grid $frame.wcs -in $frame -row $row -column 1 -columnspan 2 -sticky w incr row foreach {lbl var} \ [list "Ref Value:" ref "Ref Pixel:" refpix "Pixel Scale:" inc] { label $frame.lw$var -bg $powbg -text $lbl -font g_titleFont grid $frame.lw$var -in $frame -row $row -column 2 -sticky e -padx 10 entry $frame.ewx$var -bg $powbg -textvariable powEditObject(wcsx$var) \ -takefocus 1 -font g_titleFont entry $frame.ewy$var -bg $powbg -textvariable powEditObject(wcsy$var) \ -takefocus 1 -font g_titleFont grid $frame.ewx$var -in $frame -row $row -column 3 -sticky news grid $frame.ewy$var -in $frame -row $row -column 5 -sticky news incr row } label $frame.lrot -bg $powbg -text "Rotation:" -font g_titleFont grid $frame.lrot -in $frame -row $row -column 2 -sticky e -padx 10 entry $frame.erot -bg $powbg -textvariable powEditObject(wcsrot) \ -takefocus 1 -font g_titleFont grid $frame.erot -in $frame -row $row -column 3 -sticky news incr row label $frame.lproj -bg $powbg -text "Projection:" -font g_titleFont grid $frame.lproj -in $frame -row $row -column 2 -sticky ne -padx 10 set pcol 1 set prow 1 frame $frame.projType -bg $powbg foreach {lbl val} \ {AZP "-AZP" SZP "-SZP" TAN "-TAN" STG "-STG" SIN "-SIN" ARC "-ARC" ZPN "-ZPN" \ ZEA "-ZEA" AIR "-AIR" CYP "-CYP" CEA "-CEA" CAR "-CAR" MER "-MER" COP "-COP" \ COE "-COE" COD "-COD" COO "-COO" SFL "-SFL" PAR "-PAR" MOL "-MOL" AIT "-AIT" \ BON "-BON" PCO "-PCO" TSC "-TSC" CSC "-CSC" QSC "-QSC" HPX "-HPX" NCP "-NCP"} { if {$pcol==5} {set pcol 1; incr prow} radiobutton $frame.projType.p$lbl -bg $powbg -text $lbl \ -variable powEditObject(wcsctype) -value $val \ -highlightthickness 0 -takefocus 0 -font g_titleFont grid $frame.projType.p$lbl -in $frame.projType \ -row $prow -column $pcol -sticky nw -padx 6 incr pcol } grid $frame.projType -in $frame -row $row -column 3 -columnspan 3 -sticky w incr row } ######################################################################## # # # Functions to set Default Display Options # # # ######################################################################## proc powDefaultOptions { } { global currgn powbg global powPlotParam powEditPlotParam powEditGraphName global powCurveParam powEditCurveParam global powImageParam powEditImageParam global powDWP global g_titleFont if {[winfo exists ${powDWP}default]} {destroy ${powDWP}default} powToplevel ${powDWP}default .pow "-bg $powbg" bind ${powDWP}default <> "powEditExitDefDlg" catch {wm title ${powDWP}default "POW Preferences"} set powEditGraphName powDef powEditInitDefVariables set note ${powDWP}default.nBook Notebook:create $note -pages {POW Graph Fonts Ticks Points Lines Images} \ -pad 4 -bg $powbg set w [Notebook:frame $note POW] powEditBuildPOWOptions $w set w [Notebook:frame $note Graph] powEditBuildGraphOptions $w set w [Notebook:frame $note Fonts] powEditBuildFontOptions $w set w [Notebook:frame $note Ticks] powEditBuildTickOptions $w set w [Notebook:frame $note Points] powEditBuildCurveOptions1 $w "" set w [Notebook:frame $note Lines] powEditBuildCurveOptions2 $w "" set w [Notebook:frame $note Images] powEditBuildImageOptions $w "" # Setup Buttons button ${powDWP}default.help -text "Help" \ -command {powHelp DefaultOptions.html} \ -bg $powbg -takefocus 0 -font g_titleFont frame ${powDWP}default.buttons -bg $powbg button ${powDWP}default.buttons.save -text "Save" -bg $powbg \ -command {powEditUpdateDefVariables; powSaveConfig} -font g_titleFont button ${powDWP}default.buttons.curr -text "Get Current" -bg $powbg \ -command {powEditGetCurrVariables} -font g_titleFont button ${powDWP}default.buttons.reset -text "Reset" -bg $powbg \ -command powEditInitDefVariables -font g_titleFont button ${powDWP}default.buttons.exit -text "Exit" -bg $powbg \ -command { powEditExitDefDlg } -font g_titleFont pack ${powDWP}default.buttons.save -side left -padx 4 -pady 3 pack ${powDWP}default.buttons.curr -side left -padx 4 -pady 3 pack ${powDWP}default.buttons.reset -side left -padx 4 -pady 3 pack ${powDWP}default.buttons.exit -side left -padx 4 -pady 3 label ${powDWP}default.lab -bg $powbg \ -text "Default options for new graphs:" -font g_titleFont # Place everything into dialog grid ${powDWP}default.help -in ${powDWP}default -row 1 -column 1 -sticky ne grid ${powDWP}default.lab -in ${powDWP}default -row 2 -column 1 grid ${powDWP}default.nBook -in ${powDWP}default -row 3 -column 1 \ -sticky news -padx 15 -pady 10 grid ${powDWP}default.buttons -in ${powDWP}default -row 4 -column 1 -pady 8 Notebook:resize $note } proc powEditExitDefDlg { } { global powDWP powEditUpdateDefVariables destroy ${powDWP}default } proc powEditInitDefVariables {} { global powPlotParam powEditPlotParam global powCurveParam powEditCurveParam global powImageParam powEditImageParam global powFontParam powEditFontParam global powEditAppParam #puts "call powEditInitDefVariables" foreach opt $powPlotParam(allOpts,powDef) { set powEditPlotParam(${opt},new) $powPlotParam(${opt},powDef) } foreach opt $powCurveParam(allOpts,powDef) { set powEditCurveParam(${opt},new) $powCurveParam(${opt},powDef) } foreach opt $powImageParam(allOpts,powDef) { set powEditImageParam(${opt},new) $powImageParam(${opt},powDef) } foreach opt $powFontParam(allOpts,powDef) { foreach lbl $powFontParam(allTypes,powDef) { set powEditFontParam(${lbl}${opt},new) \ $powFontParam(${lbl}${opt},powDef) } } foreach opt [list bg cursor ResizeMain GUIposition ScopeSize ] { set powEditAppParam(${opt},new) [subst \$::pow$opt] } } proc powEditGetCurrVariables {} { global powPlotParam powEditPlotParam currgn currimg global powCurveParam powEditCurveParam global powImageParam powEditImageParam global powFontParam powEditFontParam #puts "call powEditGetCurrVariables, currgn: <$currgn>" if { ![info exists currgn] || $currgn=="powDef" } return foreach opt $powPlotParam(allOpts,powDef) { set powEditPlotParam(${opt},new) $powPlotParam(${opt},$currgn) } if { [info exists currimg] && $currimg != "" } { foreach opt $powImageParam(allOpts,powDef) { set powEditImageParam(${opt},new) \ $powImageParam(${opt}${currimg},$currgn) } } set crv [lindex $powPlotParam(curves,$currgn) 0] if { $crv != "NULL" } { foreach opt $powCurveParam(allOpts,powDef) { set powEditCurveParam(${opt},new) \ $powCurveParam(${opt}${crv},$currgn) } } foreach opt $powFontParam(allOpts,powDef) { foreach lbl $powFontParam(allTypes,powDef) { set powEditFontParam(${lbl}${opt},new) \ $powFontParam(${lbl}${opt},$currgn) } } } proc powEditUpdateDefVariables {} { global powPlotParam powEditPlotParam global powCurveParam powEditCurveParam global powImageParam powEditImageParam global powFontParam powEditFontParam global powEditAppParam foreach opt $powPlotParam(allOpts,powDef) { set powPlotParam(${opt},powDef) $powEditPlotParam(${opt},new) } foreach opt $powCurveParam(allOpts,powDef) { set powCurveParam(${opt},powDef) $powEditCurveParam(${opt},new) } foreach opt $powImageParam(allOpts,powDef) { set powImageParam(${opt},powDef) $powEditImageParam(${opt},new) } foreach opt $powFontParam(allOpts,powDef) { foreach lbl $powFontParam(allTypes,powDef) { set powFontParam(${lbl}${opt},powDef) \ $powEditFontParam(${lbl}${opt},new) } } foreach opt [list bg cursor ResizeMain GUIposition ScopeSize ] { if { [subst \$::pow$opt] != $powEditAppParam(${opt},new) } { powSetGlobal_$opt $powEditAppParam(${opt},new) } } } ######################################################################## #### #### Color Frame "Widget" #### ######################################################################## proc powColorFrame { frame varName } { global powbg global g_titleFont upvar #0 $varName var set hex [list "00" "99" "FF"] set nClr [llength $hex] frame $frame -bg $powbg frame $frame.grid -relief ridge -bd 3 -bg $powbg for { set i 0 } { $i<$nClr } { incr i 1 } { for { set j 0 } { $j<$nClr } { incr j 1 } { for { set k 0 } { $k<$nClr } { incr k 1 } { set color "[lindex $hex $i][lindex $hex $j][lindex $hex $k]" frame $frame.grid.c$color -width 24 -height 24 -bg "#$color" \ -bd 4 -relief flat -takefocus 0 grid $frame.grid.c$color -row $k -column [expr $j + $i*$nClr] bind $frame.grid.c$color \ "powUpdateColorFrame $frame #$color $varName" } } } button $frame.clrbtn -textvariable $varName \ -bg $powbg -highlightthickness 0 -width 7 \ -font g_titleFont \ -command "powUpdateColorFrame $frame \ \[powSelectAndReturnColor \$$varName\] $varName" if { ![info exists var] } { # Set initial value to black set var "#000000" } grid $frame.grid -row 1 -column 1 grid $frame.clrbtn -row 1 -column 2 -padx 7 powUpdateColorFrame $frame $var $varName trace variable ::$varName w "powColorVarHasChanged $frame" } proc powColorVarHasChanged { f varName varIndex op } { if { $varName=="var" } return if { $varIndex != "" } { set varName ${varName}($varIndex) } if { [winfo exists $f.grid] } { foreach c [winfo child $f.grid] { $c configure -relief flat } } powUpdateColorFrame $f [subst \$::$varName] $varName } proc powSelectAndReturnColor { c } { set newClr [tk_chooseColor -initialcolor $c] if { $newClr != "" } { set c $newClr } return $c } proc powUpdateColorFrame { f color varName } { upvar #0 $varName var set lvar [string range $var 1 end] if { [winfo exists $f.grid.c$lvar] } { $f.grid.c$lvar configure -relief flat } set var "$color" set lvar [string range $var 1 end] if { [winfo exists $f.grid.c$lvar] } { $f.grid.c$lvar configure -relief raised } if { [winfo exists $f.clrbtn] } { $f.clrbtn configure -bg $color } } fv5.4/tcltk/pow/powImgProbe.tcl0000644000220700001010000003277110442112556016102 0ustar birbylheadevproc gImgProbe { args } { return [uplevel #0 ImgProbe #auto $args] } itcl::class ImgProbe { constructor {args} {} destructor {} private variable probeRegion private variable probeCentX private variable probeCentY private variable probeStdX private variable probeStdY private variable probeFlux private variable probeNPix private variable probeFormat private variable probeMean private variable probeDMean private variable probeFile private variable graphx private variable graphy private variable probeNewFile private variable imgprobe public method openProbe {} public method updateProbe {} public method setShape { } public method setUnit {} public method saveProbe {} public method closeProbeFile {} } itcl::body ImgProbe::constructor {args} { global currgn global powDWP global powDrawOriginalFlag set powDrawOriginalFlag "false" set probeRegion [gRegionList $currgn .pow.pow] $probeRegion setOwner imgProbeCallback $probeRegion setAllowsMultiple 0 $probeRegion setDefault "+" Circle set probeCentX 0.0 set probeCentY 0.0 set probeStdX 0.0 set probeStdY 0.0 set probeFlux 0.0 set probeNPix 0.0 set probeMean 0.0 set probeFormat decimal set probeNewFile 0 set imgprobe ${powDWP}probe } itcl::body ImgProbe::destructor {} { itcl::delete object $probeRegion } itcl::body ImgProbe::setShape { } { set probeSelected [$probeRegion rgnAtIndex 0 ] if {$probeSelected == ""} { return } set oldshape [$probeSelected getShape ] set descr [$probeSelected getFunction "pixels" ] set rotation [$probeSelected getRotation ] set shape [$imgprobe.options.shape get] if {$oldshape == $shape } { return; } if {$oldshape == "Circle" && $shape != "Circle" } { if {$shape == "Box"} { set a [lindex $descr 2] set descr [lreplace $descr 2 2 [expr 2.0*$a] ] } lappend descr [lindex $descr 2] lappend descr 0 } if {$oldshape != "Circle" && $shape == "Circle"} { set a [lindex $descr 2] set b [lindex $descr 3] if {$oldshape == "Box"} { set descr [lreplace $descr 2 2 [expr 0.25*$a + 0.25 * $b ] ] } else { set descr [lreplace $descr 2 2 [expr 0.5*$a + 0.5 * $b ] ] } set descr [lrange $descr 0 2 ] } if {$oldshape == "Ellipse" && $shape == "Box"} { set a [lindex $descr 2] set descr [lreplace $descr 2 2 [expr 2.0*$a] ] set a [lindex $descr 3] set descr [lreplace $descr 3 3 [expr 2.0*$a] ] } if {$oldshape == "Box" && $shape == "Ellipse"} { set a [lindex $descr 2] set descr [lreplace $descr 2 2 [expr 0.5*$a] ] set a [lindex $descr 3] set descr [lreplace $descr 3 3 [expr 0.5*$a] ] } $probeRegion deleteAll $probeRegion setDefault "+" $shape $probeRegion addRegion + $shape $descr pixels updateProbe } itcl::body ImgProbe::setUnit { } { set probeFormat [$imgprobe.options.unit get] updateProbe } itcl::body ImgProbe::updateProbe {} { global currimg # Use SAO Format set probeSelected [$probeRegion rgnAtIndex 0 ] if {$probeSelected == ""} { return } set shape [$probeSelected getShape ] set descr [$probeSelected getFunction "pixels" ] set results [powGetRegionStatistics $currimg NONE $descr $shape + ] set good [lindex $results 0] if {$good == 1} { set probeCentX [lindex $results 1] set probeCentY [lindex $results 2] set probeStdX [lindex $results 3] set probeStdY [lindex $results 4] set probeFlux [lindex $results 5] set probeNPix [lindex $results 6] set probeMean [ format "%.10g" [lindex $results 7] ] set probeDMean [ format "%.10g" [lindex $results 8] ] set pixel [format "(%.2f, %.2f) +- (%.2f, %.2f)" \ $probeCentX $probeCentY $probeStdX $probeStdY ] foreach {graphx graphy} [powPixelToGraph $currimg \ [expr $probeCentX - 1] [expr $probeCentY - 1] ] {} foreach {gx1 gy1} [powPixelToGraph $currimg \ [expr $probeCentX - 1 - $probeStdX ] \ [expr $probeCentY - 1 - $probeStdY ] ] {} foreach {gx2 gy2} [powPixelToGraph $currimg \ [expr $probeCentX - 1 + $probeStdX ] \ [expr $probeCentY - 1 + $probeStdY ] ] {} set graphdx [expr abs($gx2 - $gx1)/2.0 ] set graphdy [expr abs($gy2 - $gy1)/2.0 ] if {$probeFormat == "decimal" } { set graphx [format %.6g $graphx] set graphy [format %.6g $graphy] set graphdx [format %.3g $graphdx] set graphdy [format %.3g $graphdy] } else { set graphx [powHourRA $graphx "%02d:%02d:%05.2f"] set graphy [powDegDec $graphy] set graphdx [powHourRA $graphdx "%02d:%02d:%05.2f"] set graphdy [powDegDec $graphdy] } set coord "($graphx, $graphy) +- ($graphdx, $graphdy)" } else { set probeCentX X set probeCentY Y set probeStdX "" set probeStdY "" set probeFlux 0 set probeNPix 0 set pixel "(X,Y) +- (dX,dY)" set coord "(X,Y) +- (dX,dY)" set probeMean 0 set probeDMean 0 } # Update the readout in dialog box. set cen $imgprobe.centroid set childsite [$cen.pixel childsite] $childsite.c configure -text $pixel set childsite [$cen.coord childsite] $childsite.c configure -text $coord set sta $imgprobe.info.statistics set childsite [$sta.pixels childsite] $childsite.c configure -text $probeNPix set childsite [$sta.flux childsite] $childsite.c configure -text $probeFlux set childsite [$sta.mean childsite] $childsite.c configure -text "$probeMean +- $probeDMean" } itcl::body ImgProbe::saveProbe {} { global currimg if {$probeCentX == "X"} return if ![info exists probeFile ] { set probeFile [tk_getSaveFile -initialfile "pow.stat"] if [file exists $probeFile] { file delete -force $probeFile } } if {$probeFile == "" } { unset probeFile return } set probeNewFile [file exists $probeFile] set fprob [open $probeFile a] if {$probeNewFile == 0 } { set probeNewFile 1 set title \ "Xpix Ypix Xgraph Ygraph Npix Flux Mean" puts $fprob $title } if {$probeFormat == "decimal" } { set temp [ format \ "%-8.2f %-8.2f %-12.6g %-12.6g %-8.0f %-12.6g %-12.6g" \ $probeCentX $probeCentY $graphx $graphy $probeNPix $probeFlux \ $probeMean ] puts $fprob $temp } else { set temp [ format \ "%-8.2f %-8.2f %-12s %-12s %-8.0f %-12.6g %-12.6g" \ $probeCentX $probeCentY $graphx $graphy $probeNPix $probeFlux \ $probeMean ] puts $fprob $temp } close $fprob } itcl::body ImgProbe::closeProbeFile {} { if [info exist probeFile] { unset probeFile } } itcl::body ImgProbe::openProbe {} { global powbg global currgn global currimg global g_titleFont global ROIbbox powPlotParam global roi_xo roi_yo global roi_xn roi_yn global roi_pixelxo roi_pixelyo global roi_pixelxn roi_pixelyn global powImgProbe global ROIunits powToplevel $imgprobe .pow "-width 200 -bg $powbg" wm title $imgprobe "Image Probe" frame $imgprobe.title label $imgprobe.title.label -text "Image Probe" -bg yellow -font g_titleFont button $imgprobe.title.help -text Help \ -command {powHelp Probe.html} -font g_titleFont pack $imgprobe.title.label -side left pack $imgprobe.title.help -side right frame $imgprobe.options set opt $imgprobe.options iwidgets::optionmenu $opt.shape -labeltext "Probe Shape" \ -command [itcl::code $this setShape] \ -font g_titleFont \ -labelfont g_titleFont $opt.shape insert end "Circle" $opt.shape insert end "Ellipse" $opt.shape insert end "Box" # $opt.shape insert end "Polygon" iwidgets::optionmenu $opt.unit -labeltext "Coord. Format" \ -command [itcl::code $this setUnit] \ -font g_titleFont \ -labelfont g_titleFont $opt.unit insert end "decimal" if [ powWCSexists $currgn ] { $opt.unit insert end "hms" } pack $opt.shape -side left pack $opt.unit -side right frame $imgprobe.centroid set cen $imgprobe.centroid label $cen.label -text "Centroid:" -anchor w -font g_titleFont iwidgets::labeledwidget $cen.pixel -labeltext "Pixel:" \ -labelfont g_titleFont set childsite [$cen.pixel childsite] label $childsite.c -width 55 -relief sunken -font g_titleFont pack $childsite.c iwidgets::labeledwidget $cen.coord -labeltext "Coordinate:" \ -labelfont g_titleFont set childsite [$cen.coord childsite] label $childsite.c -width 55 -relief sunken -font g_titleFont pack $childsite.c iwidgets::Labeledwidget::alignlabels $cen.pixel $cen.coord pack $cen.label -fill x -anchor w pack $cen.pixel -fill x pack $cen.coord -fill x frame $imgprobe.info frame $imgprobe.info.statistics set sta $imgprobe.info.statistics label $sta.label -text "Statistics:" -anchor w -font g_titleFont iwidgets::labeledwidget $sta.pixels -labeltext "N pixels:" \ -labelfont g_titleFont set childsite [$sta.pixels childsite] label $childsite.c -width 30 -relief sunken -font g_titleFont pack $childsite.c iwidgets::labeledwidget $sta.flux -labeltext "Total Flux:" \ -labelfont g_titleFont set childsite [$sta.flux childsite] label $childsite.c -width 30 -relief sunken -font g_titleFont pack $childsite.c iwidgets::labeledwidget $sta.mean -labeltext "Mean Flux:" \ -labelfont g_titleFont set childsite [$sta.mean childsite] label $childsite.c -width 30 -relief sunken -font g_titleFont pack $childsite.c iwidgets::Labeledwidget::alignlabels $sta.pixels $sta.flux $sta.mean pack $sta.label -fill x -anchor w pack $sta.pixels -fill x pack $sta.flux -fill x pack $sta.mean -fill x frame $imgprobe.info.log set sta $imgprobe.info.log set cmd $imgprobe.info.log button $cmd.record -text Record -command [itcl::code $this saveProbe] \ -width 8 -font g_titleFont button $cmd.close -text "Close Log" -command [itcl::code $this closeProbeFile] \ -width 8 -font g_titleFont button $cmd.exit -text Exit -width 8 -command { global powImgProbe destroy ${powDWP}probe if [info exists powImgProbe] { itcl::delete object $powImgProbe unset powImgProbe } } -font g_titleFont pack $cmd.record -side top -padx 40 pack $cmd.close -side top -padx 40 pack $cmd.exit -side top -padx 40 pack $imgprobe.info.statistics -side left -anchor nw pack $imgprobe.info.log -side right -anchor nw pack $imgprobe.title -side top -fill x -pady 2 pack $imgprobe.options -side top -fill x -pady 2 pack $imgprobe.centroid -side top -anchor nw -pady 2 pack $imgprobe.info -side top -fill x -pady 2 bind $imgprobe <> { global powImgProbe destroy ${powDWP}probe if [info exists powImgProbe] { itcl::delete object $powImgProbe unset powImgProbe } } bind $imgprobe { global powImgProbe destroy ${powDWP}probe if [info exists powImgProbe] { itcl::delete object $powImgProbe unset powImgProbe } } set temp [ powFetchImageInfoHash $currimg ] set temp [split $temp ] if { $powPlotParam(zoomed,$currimg) == 1 } { # image is zoom set imgWidth [expr $roi_pixelxn - $roi_pixelxo] set imgHeight [expr $roi_pixelyo - $roi_pixelyn] } else { set imgWidth [lindex $temp 3] set imgHeight [lindex $temp 5] } set imgMin $imgHeight if {$imgMin < $imgHeight} { set $imgMin $imgHeight } if { $powPlotParam(zoomed,$currimg) == 1 } { set halfx [expr round($imgWidth*0.5) + 1 + round($roi_pixelxo)] set halfy [expr round($roi_pixelyo) - round($imgHeight*0.5) + 1] } else { set halfx [expr round($imgWidth*0.5)+1 ] set halfy [expr round($imgHeight*0.5)+1 ] } set r [expr round($imgMin/10.0)] if {$r < 1 } { set r 1 } set descr [list $halfx $halfy $r ] $probeRegion addRegion + Circle $descr pixels update idletasks scan [winfo geometry .pow] "%dx%d+%d+%d" Pw Ph Px Py set width [expr [winfo reqwidth $imgprobe] + 2] scan [winfo geometry $imgprobe] "%dx%d+%d+%d" Rw Rh Rx Ry catch { wm geometry $imgprobe ${width}x$Rh+[expr $Px + $Pw - 15 ]+$Py } err tkwait window $imgprobe } proc imgProbeDialog {} { global currimg global powDWP global powImgProbe if ![info exists currimg ] { tk_messageBox -type ok -icon error \ -message "Select an image first." return } if [winfo exists ${powDWP}probe ] { focus ${powDWP}probe raise ${powDWP}probe return } if [winfo exists ${powDWP}probe] { catch { destroy ${powDWP}probe itcl::delete object $powImgProbe unset powImgProbe } } set powImgProbe [gImgProbe] $powImgProbe openProbe } proc imgProbeCallback {obj msg} { global powImgProbe if {$msg == "shapeIsBeingModified" || $msg == "shapeHasChanged"} { $powImgProbe updateProbe } } fv5.4/tcltk/pow/powMacResource.r0000644000220700001010000000076006756602721016271 0ustar birbylheadev#define POW_LIBRARY_RESOURCES 4000 read 'TEXT' (POW_LIBRARY_RESOURCES+1, "pow", purgeable) ":pow.tcl"; read 'TEXT' (POW_LIBRARY_RESOURCES+2, "powEdit", purgeable) ":powEdit.tcl"; read 'TEXT' (POW_LIBRARY_RESOURCES+3, "powRgn", purgeable) ":powRgn.tcl"; read 'TEXT' (POW_LIBRARY_RESOURCES+4, "notebook", purgeable) ":notebook.tcl"; read 'TEXT' (POW_LIBRARY_RESOURCES+5, "html_library", purgeable) ":html_library.tcl"; read 'TEXT' (POW_LIBRARY_RESOURCES+6, "powMovie", purgeable) ":powMovie.tcl"; fv5.4/tcltk/pow/powMovie.tcl0000644000220700001010000005310610214220030015430 0ustar birbylheadev######################################################### # All the routines relating to Animation... # Blink Graphs # Blink Images ######################################################### proc powMovie { } { global powPlotParam movieParam powbg currgn global powDWP global g_titleFont if { $powPlotParam(images,$currgn)=="NULL" } { tk_messageBox -icon warning \ -message "Select a graph with images first." \ -parent .pow -title "Blink Warning" -type ok return } if {[winfo exists ${powDWP}movie]} {destroy ${powDWP}movie} powToplevel ${powDWP}movie .pow "-bg $powbg" bind ${powDWP}movie <> "powMovieExitDlg" catch {wm title ${powDWP}movie "Blink Images"} powMovieLoadInfo set movieParam(playing) 0 set movieParam(speed) 11 set movieParam(all) 1 set movieParam(loop) 1 set movieParam(direction) 1 set movieParam(list) "" set movieParam(update) 0 label ${powDWP}movie.title -textvariable movieParam(title) \ -bg yellow -fg black -font g_titleFont frame ${powDWP}movie.step -bg $powbg button ${powDWP}movie.step.forward -text "Next" -command {powMovieNext 1} \ -bg $powbg -font g_titleFont button ${powDWP}movie.step.addtolist -text "Add to list" \ -command {powMovieAddtoList} -bg $powbg -font g_titleFont button ${powDWP}movie.step.backward -text "Prev" -command {powMovieNext -1} \ -bg $powbg -font g_titleFont button ${powDWP}movie.step.help -text "Help" \ -command {powHelp Blinking.html} \ -bg $powbg -font g_titleFont pack ${powDWP}movie.step.addtolist -in ${powDWP}movie.step -side left -padx 7 pack ${powDWP}movie.step.backward -in ${powDWP}movie.step -side left pack ${powDWP}movie.step.forward -in ${powDWP}movie.step -side left pack ${powDWP}movie.step.help -in ${powDWP}movie.step -side left \ -padx 12 label ${powDWP}movie.play -text "Play:" -bg $powbg -fg black -font g_titleFont radiobutton ${powDWP}movie.all -text "All Frames" -variable movieParam(all) \ -value 1 -bg $powbg -highlightthickness 0 \ -command {set movieParam(update) 1} -font g_titleFont frame ${powDWP}movie.list -bg $powbg radiobutton ${powDWP}movie.list.lab -text "List " -variable movieParam(all) \ -value 0 -bg $powbg -highlightthickness 0 \ -command {set movieParam(update) 1} -font g_titleFont entry ${powDWP}movie.list.txt -width 15 -bg $powbg \ -textvariable movieParam(list) -font g_titleFont pack ${powDWP}movie.list.lab -in ${powDWP}movie.list -side left pack ${powDWP}movie.list.txt -in ${powDWP}movie.list -side left \ -expand 1 -fill x label ${powDWP}movie.speed -text "Speed:" -bg $powbg -fg black -font g_titleFont frame ${powDWP}movie.speedslide -bg $powbg label ${powDWP}movie.speedslide.fast -text "Fast" -bg $powbg -font g_titleFont label ${powDWP}movie.speedslide.slow -text "Slow" -bg $powbg -font g_titleFont scale ${powDWP}movie.speedslide.slide -from 0 -to 20 \ -orient horizontal -variable movieParam(speed) \ -highlightbackground $powbg -bg $powbg \ -showvalue 0 -font g_titleFont pack ${powDWP}movie.speedslide.fast -in ${powDWP}movie.speedslide -side left pack ${powDWP}movie.speedslide.slide -in ${powDWP}movie.speedslide \ -side left -expand 1 -fill x pack ${powDWP}movie.speedslide.slow -in ${powDWP}movie.speedslide -side right checkbutton ${powDWP}movie.loop -variable movieParam(loop) -text Loop \ -bg $powbg -highlightthickness 0 -font g_titleFont checkbutton ${powDWP}movie.reverse -variable movieParam(direction) \ -text Reverse -bg $powbg -highlightthickness 0 \ -offvalue 1 -onvalue -1 -font g_titleFont frame ${powDWP}movie.buttons -bg $powbg button ${powDWP}movie.buttons.reload -text "Reload Info" -bg $powbg \ -command {powMovieLoadInfo} -font g_titleFont button ${powDWP}movie.buttons.play -text "Blink Images" -bg $powbg \ -command {powPlayMovie} -width 12 -font g_titleFont button ${powDWP}movie.buttons.exit -text "Exit" -bg $powbg \ -command {powMovieExitDlg} -font g_titleFont pack ${powDWP}movie.buttons.reload -in ${powDWP}movie.buttons -side left \ -padx 4 -pady 3 pack ${powDWP}movie.buttons.play -in ${powDWP}movie.buttons -side left \ -padx 4 -pady 3 pack ${powDWP}movie.buttons.exit -in ${powDWP}movie.buttons -side left \ -padx 4 -pady 3 grid ${powDWP}movie.title -in ${powDWP}movie -row 0 -column 0 -columnspan 3 grid ${powDWP}movie.step -in ${powDWP}movie -row 1 -column 0 -columnspan 3 \ -pady 5 grid ${powDWP}movie.play -in ${powDWP}movie -row 2 -column 0 -sticky e grid ${powDWP}movie.all -in ${powDWP}movie -row 2 -column 1 -sticky w grid ${powDWP}movie.loop -in ${powDWP}movie -row 2 -column 2 -sticky w \ -padx 10 grid ${powDWP}movie.list -in ${powDWP}movie -row 3 -column 1 -sticky ew grid ${powDWP}movie.reverse -in ${powDWP}movie -row 3 -column 2 -sticky w \ -padx 10 grid ${powDWP}movie.speed -in ${powDWP}movie -row 4 -column 0 -sticky e \ -pady 3 grid ${powDWP}movie.speedslide -in ${powDWP}movie -row 4 -column 1 \ -sticky ew -pady 3 grid ${powDWP}movie.buttons -in ${powDWP}movie -row 5 -column 0 \ -columnspan 3 -pady 8 grid columnconfigure ${powDWP}movie 1 -weight 1 grid rowconfigure ${powDWP}movie 0 -weight 1 grid rowconfigure ${powDWP}movie 1 -weight 1 grid rowconfigure ${powDWP}movie 5 -weight 1 } proc powMovieExitDlg { } { global movieParam powDWP set movieParam(playing) 0 destroy ${powDWP}movie } proc powMovieLoadInfo { } { global movieParam currgn powPlotParam set movieParam(gn) $currgn set images $powPlotParam(images,$currgn) if { [lindex $images 0] == "NULL" } { set nFrames 0 set fNum 0 } else { set nFrames [llength $images] set img [powMovieGetTopImg] if { $img == "" } { set fNum 0 } else { set fNum [lsearch -exact $images $img] incr fNum } } set movieParam(nframes) $nFrames set movieParam(title) "$currgn: $fNum of $nFrames frames" } proc powMovieGetTopImg { } { global movieParam set gn $movieParam(gn) set visFrames [.pow.pow find withtag disp$gn] if { [llength $visFrames]==0 } { set img "" } else { set top [lindex $visFrames end] regexp "(\[^ \]+)disp$gn" [.pow.pow gettags $top] tag img } return $img } proc powMovieNext { step } { global movieParam currgn powPlotParam set gn $movieParam(gn) set images $powPlotParam(images,$gn) set img [powMovieGetTopImg] if { [lindex $images 0] == "NULL" || $img=="" } return set fNum [lsearch -exact $images $img] if { $fNum < 0 } { puts "Something went wrong! $img not in $images" return } # Locate next displayed image set nframes [llength $images] while { 1 } { incr fNum $step if { $fNum >= $nframes } { set fNum 0 } elseif { $fNum < 0 } { set fNum [expr $nframes-1] } set newimg [lindex $images $fNum] set newid [.pow.pow find withtag ${newimg}disp${gn}] if { $newid != "" } break } .pow.pow raise $newid ${img}disp${gn} set movieParam(title) "$gn: [expr $fNum+1] of $nframes frames" incr movieParam(Fidx) $movieParam(direction) if { $gn == $currgn } { powSelectImage $gn $newimg } } proc powMovieAddtoList { } { global movieParam powPlotParam set gn $movieParam(gn) set fNum [lsearch -exact $powPlotParam(images,$gn) [powMovieGetTopImg] ] incr fNum if {$movieParam(list)==""} {set movieParam(list) $fNum} \ else {set movieParam(list) "$movieParam(list),$fNum"} set movieParam(all) 0 } proc powPlayMovie { } { global movieParam powPlotParam global powDWP set gn $movieParam(gn) set images $powPlotParam(images,$gn) if { [lindex $images 0] == "NULL" } return set nframes [llength $images] set movieParam(playing) 1 if { [winfo exists ${powDWP}movie] } { ${powDWP}movie.buttons.play configure -text "Stop Movie" \ -command {set movieParam(playing) 0} } set movieParam(expdlist) [powUpdateMovieList $nframes] set ndisp [llength $movieParam(expdlist)] if {$movieParam(direction)>0} { if ![info exists movieParam(Fidx)] { set movieParam(Fidx) 0 } } else { if ![info exists movieParam(Fidx)] { set movieParam(Fidx) [expr $ndisp - 1] } } powPlayNextFrame } proc powPlayNextFrame { } { global movieParam powPlotParam global powDWP currimg set gn $movieParam(gn) set images $powPlotParam(images,$gn) if { [lindex $images 0] == "NULL" } return set nframes [llength $images] if { $movieParam(update) } { set movieParam(expdlist) [powUpdateMovieList $nframes] } set ndisp [llength $movieParam(expdlist)] set nextframe [expr [lindex $movieParam(expdlist) $movieParam(Fidx)]-1] if {$nextframe<$nframes && $nextframe>=0} { set img [lindex $images $nextframe] set currimg $img set next ${img}disp$gn if { [winfo exists .pow.pow] && [.pow.pow find withtag $next] != "" } { powSelectImage $gn $img set movieParam(title) \ "$gn: [expr $nextframe+1] of $movieParam(nframes) frames" } } incr movieParam(Fidx) $movieParam(direction) if {$movieParam(Fidx)<0} { set movieParam(Fidx) [expr $ndisp-1] if {!$movieParam(loop)} { set movieParam(playing) 0 } } elseif {$movieParam(Fidx)>=$ndisp} { set movieParam(Fidx) 0 if {!$movieParam(loop)} { set movieParam(playing) 0 } } if { ![winfo exists .pow.pow] } { set movieParam(playing) 0 } if { $movieParam(playing) } { # Setup delay... top speed ~30 fps set speed 33 for {set j 0} {$j<$movieParam(speed)} {incr j} { set speed [expr $speed*1.33] } set speed [expr int($speed)] after $speed powPlayNextFrame } else { # Check that dialog box is still around before trying to change # one of its objects if {[winfo exists ${powDWP}movie.buttons.play]} { ${powDWP}movie.buttons.play configure -text "Blink Images" \ -command {powPlayMovie} } } update idletasks } proc powUpdateMovieList { nframes } { global movieParam set expdlist {} if {$movieParam(all)} { for {set i 1} {$i<=$nframes} {incr i} { lappend expdlist $i } } else { set list [split $movieParam(list) " ,"] while { [llength $list] } { set elem [lindex $list 0] set list [lreplace $list 0 0] if {$elem==""} continue if { [regexp -- - $elem] } { set elem [split $elem "-"] set a1 [lindex $elem 0] set a2 [lindex $elem 1] if { $a1 <= $a2 } { for {set i $a1} {$i<=$a2} {incr i} \ {lappend expdlist $i} } else { for {set i $a1} {$i>=$a2} {incr i -1} \ {lappend expdlist $i} } } elseif { [expr $elem] > 0 && [expr $elem] <= $nframes} { lappend expdlist [expr $elem] } } } set movieParam(update) 0 return $expdlist } ############################ ### Blink Graphs ### ############################ proc powBlinkGraphDlg { } { global powPlotParam powbg currgn movieParam global powDWP global g_titleFont if {[winfo exists ${powDWP}blink]} {destroy ${powDWP}blink} powToplevel ${powDWP}blink .pow "-bg $powbg" bind ${powDWP}blink <> "powBlinkExitDlg" catch {wm title ${powDWP}blink "Blink Graphs"} set movieParam(playing) 0 listbox ${powDWP}blink.listall -width 20 -height 10 \ -selectmode extended -bg $powbg -exportselection 0 -font g_titleFont label ${powDWP}blink.titleall -text "Available Graphs:" -fg black -bg yellow -font g_titleFont listbox ${powDWP}blink.listblnk -width 20 -height 10 \ -selectmode extended -bg $powbg -exportselection 0 -font g_titleFont label ${powDWP}blink.titleblnk -text "Blink Order:" -fg black -bg yellow -font g_titleFont button ${powDWP}blink.help -text "Help" \ -command {powHelp Blinking.html} \ -bg $powbg -font g_titleFont grid ${powDWP}blink.titleall -in ${powDWP}blink -row 1 -column 1 -sticky w \ -padx 5 -pady 5 grid ${powDWP}blink.listall -in ${powDWP}blink -row 2 -column 1 -sticky news grid ${powDWP}blink.help -in ${powDWP}blink -row 1 -column 2 grid ${powDWP}blink.titleblnk -in ${powDWP}blink -row 1 -column 3 -sticky w \ -padx 5 -pady 5 grid ${powDWP}blink.listblnk -in ${powDWP}blink -row 2 -column 3 -sticky news frame ${powDWP}blink.grphbtns -bg $powbg button ${powDWP}blink.grphbtns.add -text "Add -->" -bg $powbg \ -command {powBlinkAdd} -font g_titleFont button ${powDWP}blink.grphbtns.insert -text "Insert -->" -bg $powbg \ -command {powBlinkInsert} -font g_titleFont button ${powDWP}blink.grphbtns.delete -text "Delete <--" -bg $powbg \ -command {powBlinkDelete} -font g_titleFont frame ${powDWP}blink.grphbtns.shft -bg $powbg label ${powDWP}blink.grphbtns.shft.lab -text "Shift\n& Align\nGraphs" \ -bg $powbg -font g_titleFont canvas ${powDWP}blink.grphbtns.shft.but -width 56 -height 56 -bg $powbg \ -highlightthickness 0 ${powDWP}blink.grphbtns.shft.but create polygon 3 30 18 22 18 38 \ -fill grey -outline black -tag "blinkShftLeft btn" ${powDWP}blink.grphbtns.shft.but create polygon 30 3 22 18 38 18 \ -fill grey -outline black -tag "blinkShftUp btn" ${powDWP}blink.grphbtns.shft.but create polygon 57 30 42 22 42 38 \ -fill grey -outline black -tag "blinkShftRght btn" ${powDWP}blink.grphbtns.shft.but create polygon 30 57 22 42 38 42 \ -fill grey -outline black -tag "blinkShftDown btn" ${powDWP}blink.grphbtns.shft.but create rectangle 23 23 37 37 \ -fill grey -outline black -tag "blinkShftCntr btn" pack ${powDWP}blink.grphbtns.shft.lab -in ${powDWP}blink.grphbtns.shft \ -side left -padx 5 pack ${powDWP}blink.grphbtns.shft.but -in ${powDWP}blink.grphbtns.shft \ -side left -padx 5 bind ${powDWP}blink.grphbtns.shft.but {powBlinkShift 10} bind ${powDWP}blink.grphbtns.shft.but {powBlinkShift 1} bind ${powDWP}blink.grphbtns.shft.but {set powShiftLoop 0} bind ${powDWP}blink.grphbtns.shft.but {powBlinkShiftHilight %x %y} bind ${powDWP}blink.grphbtns.shft.but {powBlinkShiftHilight %x %y} pack ${powDWP}blink.grphbtns.add -in ${powDWP}blink.grphbtns -fill x \ -padx 5 -pady 2 pack ${powDWP}blink.grphbtns.insert -in ${powDWP}blink.grphbtns -fill x \ -padx 5 -pady 2 pack ${powDWP}blink.grphbtns.shft -in ${powDWP}blink.grphbtns \ -fill none -padx 5 -pady 2 pack ${powDWP}blink.grphbtns.delete -in ${powDWP}blink.grphbtns -fill x \ -padx 5 -pady 2 grid ${powDWP}blink.grphbtns -in ${powDWP}blink -row 2 -column 2 set movieParam(speed) 11 label ${powDWP}blink.speedfast -text "Speed: Fast" -bg $powbg -font g_titleFont label ${powDWP}blink.speedslow -text "Slow" -bg $powbg -font g_titleFont scale ${powDWP}blink.speedslide -from 0 -to 20 \ -orient horizontal -variable movieParam(speed) \ -highlightbackground $powbg -bg $powbg \ -showvalue 0 -font g_titleFont grid ${powDWP}blink.speedfast -in ${powDWP}blink -row 3 -column 1 \ -sticky e -pady 5 grid ${powDWP}blink.speedslide -in ${powDWP}blink -row 3 -column 2 \ -sticky ew -pady 5 grid ${powDWP}blink.speedslow -in ${powDWP}blink -row 3 -column 3 \ -sticky w -pady 5 frame ${powDWP}blink.blnkbtns -bg $powbg button ${powDWP}blink.blink -text "Blink Graphs" -bg $powbg \ -command {powBlinkBlink} -font g_titleFont button ${powDWP}blink.reload -text "Reload Info" -bg $powbg \ -command {powBlinkReload} -font g_titleFont button ${powDWP}blink.exit -text "Exit" -bg $powbg \ -command {powBlinkExitDlg} -font g_titleFont grid ${powDWP}blink.reload -in ${powDWP}blink -row 4 -column 1 -sticky e \ -pady 7 -padx 10 grid ${powDWP}blink.blink -in ${powDWP}blink -row 4 -column 2 -sticky ew \ -pady 7 grid ${powDWP}blink.exit -in ${powDWP}blink -row 4 -column 3 -sticky w \ -pady 7 -padx 10 grid columnconfigure ${powDWP}blink 1 -weight 1 grid columnconfigure ${powDWP}blink 3 -weight 1 grid rowconfigure ${powDWP}blink 2 -weight 1 powBlinkReload } proc powBlinkExitDlg { } { global movieParam powDWP set movieParam(playing) 0 destroy ${powDWP}blink } proc powBlinkReload { } { global currgn global powDWP set graphlist "" foreach graph [powListGraphs] { if { ![regexp scope\$ $graph] } {lappend graphlist $graph} } ${powDWP}blink.listall delete 0 end eval [concat ${powDWP}blink.listall insert end $graphlist] ${powDWP}blink.listall selection clear 0 end set curridx [lsearch -exact $graphlist $currgn] if {$curridx>=0} {${powDWP}blink.listall selection set $curridx} \ else {${powDWP}blink.listall selection set 0} } proc powBlinkBlink { } { global movieParam currgn global powDWP ${powDWP}blink.blink configure -text "Stop Blinking" \ -command {set movieParam(playing) 0} set movieParam(playing) 1 set movieParam(Fidx) 0 powBlinkBlinkNext } proc powBlinkBlinkNext { } { global movieParam currgn global powDWP if { ![winfo exists ${powDWP}blink.listblnk] } { set movieParam(playing) 0 } else { set graphlist [${powDWP}blink.listblnk get 0 end] set cnt [llength $graphlist] if { [winfo exists .pow.pow] } { if {$movieParam(Fidx)<$cnt} { .pow.pow raise [lindex $graphlist $movieParam(Fidx)] } } else { set movieParam(playing) 0 } incr movieParam(Fidx) if {$movieParam(Fidx)>=$cnt} { set movieParam(Fidx) 0 } } if { $movieParam(playing) } { # Setup delay... top speed ~30 fps set speed 33 for {set j 0} {$j<$movieParam(speed)} {incr j} { set speed [expr $speed*1.33] } set speed [expr int($speed)] after $speed powBlinkBlinkNext } else { # Check that dialog box is still around before trying to change # its objects if {[winfo exists ${powDWP}blink]} { ${powDWP}blink.blink configure -text "Blink Graphs" \ -command {powBlinkBlink} } if { [winfo exists .pow.pow] } {.pow.pow raise $currgn} } update idletasks } proc powBlinkShift { size } { global currgn powShiftLoop powShiftCurrBtn global powDWP set powShiftLoop 1 set origobj $powShiftCurrBtn set firstloop 1 while {$powShiftLoop} { set obj $powShiftCurrBtn if {$obj!="" && $obj==$origobj} { set tags [${powDWP}blink.grphbtns.shft.but gettags $obj] regexp "blinkShft(\[^ \]+)" $tags "" direction if {$direction=="Cntr"} { set select [${powDWP}blink.listblnk get 0 end] } else { set select "" foreach idx [${powDWP}blink.listblnk curselection] { lappend select [${powDWP}blink.listblnk get $idx] } } foreach graph $select { set dx 0 set dy 0 switch -exact $direction { Cntr { if { ![info exists bbox1] } { set cbbox [.pow.pow cget -scrollregion] set bbox1 [.pow.pow bbox $graph] set xloc [expr double( \ [lindex $bbox1 0]+[lindex $bbox1 2]) \ / [lindex $cbbox 2] / 2.0 ] set yloc [expr double( \ [lindex $bbox1 1]+[lindex $bbox1 3]) \ / [lindex $cbbox 3] / 2.0 ] set xv [.pow.pow xview] if {$xloc<[lindex $xv 0] || $xloc>[lindex $xv 1]} { .pow.pow xview moveto \ [expr double([lindex $bbox1 0]-30) \ / [lindex $cbbox 2] ] } set yv [.pow.pow yview] if {$yloc<[lindex $yv 0] || $yloc>[lindex $yv 1]} { .pow.pow yview moveto \ [expr double([lindex $bbox1 1]-30) \ / [lindex $cbbox 3] ] } } else { set bbox2 [.pow.pow bbox $graph] set dx [expr [lindex $bbox1 2]-[lindex $bbox2 2]] set dy [expr [lindex $bbox1 1]-[lindex $bbox2 1]] } } Up { set dy -$size } Down { set dy $size } Left { set dx -$size } Rght { set dx $size } } powMoveGraph $graph $dx $dy } } if {$firstloop} { for {set delay 0} {$delay<200} {incr delay} {update} } update set firstloop 0 } } proc powBlinkShiftHilight { x y } { global powbg powShiftCurrBtn global powDWP ${powDWP}blink.grphbtns.shft.but itemconfigure btn -fill grey set obj [${powDWP}blink.grphbtns.shft.but find overlapping $x $y $x $y] if {[regexp btn [${powDWP}blink.grphbtns.shft.but gettags $obj] ]} { set powShiftCurrBtn $obj ${powDWP}blink.grphbtns.shft.but itemconfigure $obj -fill white } else { set powShiftCurrBtn "" } } proc powBlinkAdd { } { global powDWP set count 0 set select [${powDWP}blink.listall curselection] foreach item $select { set additem [${powDWP}blink.listall get $item] ${powDWP}blink.listblnk insert end $additem incr count } if {$count>0} { set nelem [llength [${powDWP}blink.listblnk get 0 end]] ${powDWP}blink.listblnk selection clear 0 end ${powDWP}blink.listblnk selection set [expr $nelem-$count] end } } proc powBlinkInsert { } { global powDWP set count 0 set select [${powDWP}blink.listall curselection] set insloc [lindex [${powDWP}blink.listblnk curselection] 0] if {$insloc==""} {set insloc 0} foreach item $select { set additem [${powDWP}blink.listall get $item] ${powDWP}blink.listblnk insert [expr $insloc+$count] $additem incr count } if {$count>0} { ${powDWP}blink.listblnk selection clear 0 end ${powDWP}blink.listblnk selection set $insloc [expr $insloc+$count-1] } } proc powBlinkDelete { } { global powDWP set count 0 set select [${powDWP}blink.listblnk curselection] foreach item $select { ${powDWP}blink.listblnk delete [expr $item-$count] incr count } if {$count>0} { ${powDWP}blink.listblnk selection set [lindex $select 0] } } fv5.4/tcltk/pow/powProfile.tcl0000755000220700001010000003202710723103322015764 0ustar birbylheadevproc GetPoint_Img {img x y } { global profileWidth global profileHeight if {$img == "NULL"} { return NULL } if {$x >= 0 && $x < $profileWidth && $y >= 0 && $y < $profileHeight } { set imgz [powGetImageZ $img $x $y] } else { set imgz 0 } return $imgz } proc UpdateProfile {obj} { global powDWP global profile_gn global profile_img global currgn global xCount yCount powPlotParam set xdlg ${powDWP}xdlg foreach [list gx0 gy0 gx1 gy1] [$obj getGraphCoords] {} set e0 [powGraphToPixel $profile_img $gx0 $gy0] set e1 [powGraphToPixel $profile_img $gx1 $gy1] foreach [list x0 y0] $e0 {} foreach [list x1 y1] $e1 {} set x0 [expr round($x0 + 1)] set y0 [expr round($y0 + 1)] set x1 [expr round($x1 + 1)] set y1 [expr round($y1 + 1)] set width [image width $profile_img] set height [image height $profile_img] if [info exist powPlotParam(flipD,$profile_gn)] { switch $powPlotParam(flipD,$profile_gn) { "X" { if { [info exists xCount($profile_gn)] && [expr $xCount($profile_gn) % 2] != 0 } { set x0 [expr $width - $x0 - 1] set x1 [expr $width - $x1 - 1] } } "Y" { if { [info exists yCount($profile_gn)] && [expr $yCount($profile_gn) % 2] != 0 } { set y0 [expr $height - $y0 - 1] set y1 [expr $height - $y1 - 1] } } } } set g0 [format "(%-.8g, %-.8g)" $gx0 $gy0 ] set g1 [format "(%-.8g, %-.8g)" $gx1 $gy1 ] set p0 [format "(%d, %d)" $x0 $y0 ] set p1 [format "(%d, %d)" $x1 $y1 ] $xdlg.frame.row1.pix1 configure -text $p0 $xdlg.frame.row1.pix2 configure -text $p1 $xdlg.frame.row2.graph1 configure -text $g0 $xdlg.frame.row2.graph2 configure -text $g1 } proc DrawProfile {obj} { global profile_gn global profile_img global currgn global currimg global powWCS powFitsHeader powFitsHeaderCnt xCount yCount global powWCSList powWCSLabel powWCSName global powPlotParam global xlist global zlist global graphCoordList set graphCoordList {} foreach [list gx0 gy0 gx1 gy1] [$obj getGraphCoords] {} set e0 [powGraphToPixel $profile_img $gx0 $gy0] set e1 [powGraphToPixel $profile_img $gx1 $gy1] foreach [list x0 y0] $e0 {} foreach [list x1 y1] $e1 {} set x0 [expr round($x0)] set y0 [expr round($y0)] set x1 [expr round($x1)] set y1 [expr round($y1)] set tx [expr abs($x1-$x0)] set tx [expr abs($x1-$x0)] set ty [expr abs($y1-$y0)] if {$tx == 0 && $ty == 0 } { return } if {$tx >= $ty } { if {$x0 > $x1 } { set step -1 } else { set step 1 } set k [expr double($y1-$y0)/double($x1-$x0) ] set tpoints [expr (abs($x1-$x0+1))] set usex 1 } else { if {$y0 > $y1 } { set step -1 } else { set step 1 } set k [expr double($x1-$x0)/double($y1-$y0) ] set tpoints [expr abs(($y1-$y0+1))] set usex 0 } set xi $x0 set yi $y0 set a [GetPoint_Img $profile_img $xi $yi] if {$a != "NULL"} { lappend zlist $a } else { lappend zlist 0 } set zlist [GetPoint_Img $profile_img $xi $yi] lappend graphCoordList [powPixelToGraph $profile_img $xi $yi] set xlist 1 for {set i 1} {$i < $tpoints } {incr i} { if {$usex == 1} { incr xi $step set yi [expr round($k*($xi-$x0))+$y0] } else { incr yi $step set xi [expr round($k*($yi-$y0))+$x0] } lappend xlist [expr $i + 1] set a [GetPoint_Img $profile_img $xi $yi] lappend graphCoordList [powPixelToGraph $profile_img $xi $yi] if {$a != "NULL"} { lappend zlist $a } else { lappend zlist 0 } } powCreateDataFromList ${profile_gn}_cx_data $xlist set xlabel "pixel index " set xunit " pixel" set powWCSLabel(xlabel,${profile_gn}_xsec,DEFAULT) $xlabel set powWCSLabel(ylabel,${profile_gn}_xsec,DEFAULT) "" set powWCSLabel(xunit,${profile_gn}_xsec,DEFAULT) $xunit set powWCSLabel(yunit,${profile_gn}_xsec,DEFAULT) "" powCreateDataFromList ${profile_gn}_cz_data $zlist powCreateVector ${profile_gn}_cx_vector ${profile_gn}_cx_data 0 NULL NULL powCreateVector ${profile_gn}_cz_vector ${profile_gn}_cz_data 0 NULL NULL set powWCSName(${profile_gn}_xsec) $powWCSName($profile_gn) set powWCSName(${profile_gn}_xsecscope) $powWCSName($profile_gn) set powWCSList(${profile_gn}_xsec) $powWCSList($profile_gn) set powWCSList(${profile_gn}_xsecscope) $powWCSList($profile_gn) powCreateCurve ${profile_gn}_xsec_curve ${profile_gn}_cx_vector \ NULL ${profile_gn}_cz_vector NULL if ![info exists powPlotParam(xdimdisp,${profile_gn}_xsec)] { set powPlotParam(xdimdisp,${profile_gn}_xsec) 200 set powPlotParam(ydimdisp,${profile_gn}_xsec) 200 } set powWCSName(${profile_gn}_xsec_curve) $powWCSName($profile_gn) set powWCSList(${profile_gn}_xsec_curve) $powWCSList($profile_gn) set powFitsHeader(${profile_gn}_xsec) $powFitsHeader($profile_gn) set powFitsHeaderCnt(${profile_gn}_xsec) $powFitsHeaderCnt($profile_gn) set powPlotParam(graphType,${profile_gn}_xsec) "binary" set powPlotParam(zoomed,${profile_gn}_xsec) 0 set xCount(${profile_gn}_xsec) 0 set yCount(${profile_gn}_xsec) 0 set powFitsHeader(${profile_gn}_xsec_curve) $powFitsHeader($profile_gn) set powFitsHeaderCnt(${profile_gn}_xsec_curve) $powFitsHeaderCnt($profile_gn) set powPlotParam(graphType,${profile_gn}_xsec_curve) "binary" set powPlotParam(zoomed,${profile_gn}_xsec_curve) 0 set xCount(${profile_gn}_xsec_curve) 0 set yCount(${profile_gn}_xsec_curve) 0 set powFitsHeader(${profile_gn}_xsecscope) $powFitsHeader($profile_gn) set powFitsHeaderCnt(${profile_gn}_xsecscope) $powFitsHeaderCnt($profile_gn) set powPlotParam(graphType,${profile_gn}_xsecscope) "binary" set powPlotParam(zoomed,${profile_gn}_xsecscope) 0 set xCount(${profile_gn}_xsecscope) 0 set yCount(${profile_gn}_xsecscope) 0 set powWCS(${profile_gn}_xsec) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} set powWCS(${profile_gn}_xsec_curve) {{0.0 0.0} {0.0 0.0} {1.0 -0.0 0.0 1.0} {{} {}} {{} {}}} powCreateGraph ${profile_gn}_xsec ${profile_gn}_xsec_curve NULL \ $xunit NULL $xlabel Counts \ $powPlotParam(xdimdisp,${profile_gn}_xsec) \ $powPlotParam(ydimdisp,${profile_gn}_xsec) powSetCurveOptions ${profile_gn}_xsec ${profile_gn}_xsec_curve pDisp No powSetCurveOptions ${profile_gn}_xsec ${profile_gn}_xsec_curve lDisp Yes powSetCurveOptions ${profile_gn}_xsec ${profile_gn}_xsec_curve lStyle " " } proc ProfileCallback { obj msg } { global powDWP global powFitsHeader powFitsHeaderCnt global currgn set xdlg ${powDWP}xdlg if ![winfo exists $xdlg ] { return } if {$msg == "shapeIsBeingModified"} { UpdateProfile $obj } if {$msg == "shapeHasChanged"} { DrawProfile $obj UpdateProfile $obj } } proc ProfileDlg {} { global currgn global currimg global powbg global powDWP global powWCS powFitsHeader powFitsHeaderCnt global profile_gn global profile_img global profileRegion global profileWidth global profileHeight global g_titleFont global profileFile global powRotation global storePowRotation set xdlg ${powDWP}xdlg if [winfo exists $xdlg ] { focus $xdlg raise $xdlg return } if ![info exists currimg ] { tk_messageBox -type ok -icon error \ -message "Select an image first." return } powToplevel $xdlg .pow "-width 200 -bg $powbg" wm title $xdlg "Profile" frame $xdlg.frame -borderwidth 4 frame $xdlg.frame.title -width 300 frame $xdlg.frame.row0 frame $xdlg.frame.row1 frame $xdlg.frame.row2 label $xdlg.frame.title.title -text "Profile:" -background yellow \ -relief flat -width 8 -anchor w -font g_titleFont button $xdlg.frame.title.help -text Help -anchor e \ -command {powHelp Profile.html} -font g_titleFont label $xdlg.frame.row0.holder -text "" -width 18 \ -anchor w -relief flat -font g_titleFont label $xdlg.frame.row0.start -text "Start" -width 25 \ -anchor w -relief flat -font g_titleFont label $xdlg.frame.row0.stop -text "Stop" -width 25 -anchor w -relief flat -font g_titleFont label $xdlg.frame.row1.pixelname -text "Image Pixel:" \ -width 18 -relief flat -anchor w -font g_titleFont label $xdlg.frame.row1.pix1 -justify left -anchor w \ -relief sunken -width 25 -font g_titleFont label $xdlg.frame.row1.pix2 -justify left -anchor w \ -relief sunken -width 25 -font g_titleFont label $xdlg.frame.row2.graphname -text "Graph coordinates:" \ -width 18 -relief flat -anchor w -font g_titleFont label $xdlg.frame.row2.graph1 -justify left -anchor w \ -relief sunken -width 25 -font g_titleFont label $xdlg.frame.row2.graph2 -justify left -anchor w \ -relief sunken -width 25 -font g_titleFont button $xdlg.frame.save -text Record -command { SaveProfile } -font g_titleFont button $xdlg.frame.close -text Exit -command { global storePowRotation global currimg global powRotation if { [info exists currimg] && [info exists storePowRotation($currimg)] } { set powRotation($currimg) $storePowRotation($currimg) } if [info exists profileFile] { unset profileFile } ; \ itcl::delete object $profileRegion ; \ destroy ${powDWP}xdlg ; \ } -font g_titleFont pack $xdlg.frame.title.title -side left -anchor w pack $xdlg.frame.title.help -side right -anchor e pack $xdlg.frame.row0.holder -side left pack $xdlg.frame.row0.start -side left pack $xdlg.frame.row0.stop -side left pack $xdlg.frame.row1.pixelname -side left pack $xdlg.frame.row1.pix1 -side left pack $xdlg.frame.row1.pix2 -side left pack $xdlg.frame.row2.graphname -side left pack $xdlg.frame.row2.graph1 -side left pack $xdlg.frame.row2.graph2 -side left pack $xdlg.frame.title -anchor w -pady 5 -padx 2 -fill x pack $xdlg.frame.row0 -anchor w -pady 2 -padx 2 pack $xdlg.frame.row1 -anchor w -pady 2 -padx 2 pack $xdlg.frame.row2 -anchor w -pady 2 -padx 2 pack $xdlg.frame.save -expand 1 -side left -anchor w -pady 5 -padx 2 pack $xdlg.frame.close -expand 1 -side right -anchor e -pady 5 -padx 2 pack $xdlg.frame set profileRegion [gRegionList $currgn .pow.pow] $profileRegion setOwner ProfileCallback $profileRegion setAllowsMultiple 0 $profileRegion setDefault "+" Line set profile_gn $currgn set profile_img $currimg set temp [ powFetchImageInfoHash $profile_img ] set temp [split $temp ] set profileWidth [lindex $temp 3] set profileHeight [lindex $temp 5] set halfx [expr round($profileWidth*0.5) ] set halfy [expr round($profileHeight*0.5) ] set gx0 [expr round($halfx*0.5) + 1] set gy0 [expr round($halfy*0.5) + 1] set gx1 [expr round($halfx*1.5) + 1] set gy1 [expr round($halfy*1.5) + 1] set descr [list $gx0 $gy0 $gx1 $gy1] if [info exists powRotation($currimg)] { set storePowRotation($currimg) $powRotation($currimg) catch { unset powRotation($currimg) } } $profileRegion addRegion + Line $descr pixels set elem [ $profileRegion rgnAtIndex 0] bind $xdlg <> { if [info exists profileFile] { unset profileFile } itcl::delete object profileRegion destroy ${powDWP}xdlg } tkwait window $xdlg } proc SaveProfile {} { global xlist global zlist global profileFile global graphCoordList if { ![info exists profileFile ] || $profileFile == "" } { set profileFile [tk_getSaveFile -initialfile "powProfile.txt" -filetypes {{ASCII Text .txt}}] if [file exists $profileFile] { file delete -force $profileFile } } if {$profileFile == "" } { unset profileFile return } set probeNewFile [file exists $profileFile] set fprofile [open $profileFile a] foreach ele $graphCoordList x $xlist z $zlist { set v1 [lindex $ele 0] set v2 [lindex $ele 1] set v3 $x set v4 $z #puts "v1: $v1, v2: $v2, v3: $v3, v4: $v4" if { $v1 == "NULL" } { set v1 0.0 } if { $v2 == "NULL" } { set v2 0.0 } if { $v3 == "NULL" } { set v3 0.0 } if { $v4 == "NULL" } { set v4 0.0 } set temp [format "%-10.7g %-10.7g %-d %-10.7g" $v1 $v2 $v3 $v4] #puts "data: $temp" puts $fprofile $temp } close $fprofile } fv5.4/tcltk/pow/powRegion.h0000644000220700001010000000331711066773043015267 0ustar birbylheadev/***************************************************************/ /* REGION STUFF */ /***************************************************************/ #define myPI 3.1415926535897932385 typedef struct { int exists; double xrefval, yrefval; double xrefpix, yrefpix; double xinc, yinc; double rot; char type[6]; } WCSdataX; typedef enum { point_rgn, line_rgn, circle_rgn, annulus_rgn, ellipse_rgn, elliptannulus_rgn, box_rgn, rectangle_rgn, diamond_rgn, sector_rgn, poly_rgn } shapeType; typedef enum { pixel_fmt, degree_fmt, hhmmss_fmt } coordFmt; typedef struct { char sign; /* Include or exclude? */ shapeType shape; /* Shape of this region */ union { /* Parameters - In pixels */ /**** Generic Shape Data ****/ struct { double p[8]; /* Region parameters */ double sinT, cosT; /* For rotated shapes */ double a, b; /* Extra scratch area */ } gen; /**** Polygon Data ****/ struct { int nPts; /* Number of Polygon pts */ double *Pts; /* Polygon points */ double xmin,xmax; /* Polygon bounding box */ double ymin,ymax; } poly; } param; } RgnShape; typedef struct { int nShapes; RgnShape *Shapes; WCSdataX wcs; } SAORegion; #ifdef __cplusplus extern "C" { #endif int fits_read_rgnfile( const char *filename, WCSdataX *wcs, SAORegion **Rgn, int *status ); int fits_in_region( double X, double Y, SAORegion *Rgn ); void fits_free_region( SAORegion *Rgn ); #ifdef __cplusplus } #endif fv5.4/tcltk/pow/powRgn.tcl0000644000220700001010000016263011130706071015116 0ustar birbylheadev################################################################### # # TCL routines handling creation and manipulation of SAO regions # ################################################################### # variables used: # regionParam(rgns): RegionList object containing objects # regionParam(currSign) : current sign (+/-) # regionParam(currShape): current shape (Circle, etc) # regionParam(supportedShapes): list of valid shapes # regionParam(format): "Linear", "FK5 ()", etc # regionParam(degreeFormat): "decimal" or "hhmmss" # gn proc powRegion { } { #puts "powRegion start" global heraQueryEntry g_fvHera global powPlotParam regionParam powbg currgn currimg global powFrameForTop global powDWP availableColor global negSignLineColor negSignHandleColor posSignLineColor posSignHandleColor global d_negSignLineColor d_negSignHandleColor d_posSignLineColor d_posSignHandleColor global g_titleFont global powLutButton buttonWndw powROIButton global old_powLutButton old_powROIButton global propertyOrder set propertyOrder "Source" if {[winfo exists ${powDWP}region]} { catch {raise ${powDWP}region} return } set old_powLutButton $powLutButton set old_powROIButton $powROIButton set posSignLineColor blue set posSignHandleColor green set negSignLineColor red set negSignHandleColor yellow set d_posSignLineColor blue set d_posSignHandleColor green set d_negSignLineColor red set d_negSignHandleColor yellow powSetupRegions $currgn $regionParam(rgns) activate powToplevel ${powDWP}region .pow "-bg $powbg" bind ${powDWP}region "powRegionChangeColor all -1.0" bind ${powDWP}region <> "destroy ${powDWP}region" catch {wm title ${powDWP}region "Edit Region"} catch {wm geometry ${powDWP}region +500+240} ${powDWP}region config -menu ${powDWP}region.mbar menu ${powDWP}region.mbar -postcommand "powEvents::generate <>" -bg $powbg -font g_titleFont ${powDWP}region.mbar add cascade -menu ${powDWP}region.mbar.file -label "Property" -font g_titleFont ${powDWP}region.mbar add command -label "Help" -font g_titleFont -command { powHelp Regions.html } set m [menu ${powDWP}region.mbar.file] $m add radio -label Source -variable [itcl::scope propertyOrder] -value Source \ -command { powSetupRegionProperty } $m add radio -label Background -variable [itcl::scope propertyOrder] -value Background \ -command { powSetupRegionProperty } frame ${powDWP}region.list -bg $powbg scrollbar ${powDWP}region.list.scrolly -orient vertical \ -command {${powDWP}region.list.rgns yview} -bg $powbg scrollbar ${powDWP}region.list.scrollx -orient horizontal \ -command {${powDWP}region.list.rgns xview} -bg $powbg listbox ${powDWP}region.list.rgns -width 30 -height 6 \ -selectmode browse -bg $powbg -exportselection 0 \ -yscrollcommand "${powDWP}region.list.scrolly set " \ -xscrollcommand "${powDWP}region.list.scrollx set " -font g_titleFont bind ${powDWP}region.list.rgns \ {powSelectRegion [${powDWP}region.list.rgns curselection]} grid ${powDWP}region.list.rgns -row 1 -column 1 -sticky news -columnspan 4 grid ${powDWP}region.list.scrolly -row 1 -column 5 -sticky news grid ${powDWP}region.list.scrollx -row 2 -column 1 -sticky news grid rowconfigure ${powDWP}region.list 1 -weight 1 grid columnconfigure ${powDWP}region.list 1 -weight 1 update idletasks ${powDWP}region.list.rgns configure -height 3 frame ${powDWP}region.currshape -bg $powbg -bd 4 -relief groove frame ${powDWP}region.currshape.f1 -bg $powbg label ${powDWP}region.currshape.f1.lbl -text "Current Shape: " -bg $powbg -font g_titleFont button ${powDWP}region.currshape.f1.apply -text "Apply" -bg $powbg \ -command {powChangeRegion} -highlightthickness 0 -font g_titleFont button ${powDWP}region.currshape.f1.delete -text "Delete" -bg $powbg \ -command {powDeleteCurrRegion} -highlightthickness 0 -font g_titleFont pack ${powDWP}region.currshape.f1.lbl -in ${powDWP}region.currshape.f1 \ -side left pack ${powDWP}region.currshape.f1.apply -in ${powDWP}region.currshape.f1 \ -side right -padx 5 pack ${powDWP}region.currshape.f1.delete -in ${powDWP}region.currshape.f1 \ -side right -padx 5 frame ${powDWP}region.control -bg $powbg -bd 4 -relief groove label ${powDWP}region.control.label -text "Set right mouse button to control:" -font g_titleFont radiobutton ${powDWP}region.control.zoom -variable buttonSelection -text "Zoom/unZoom Region" \ -font [list Helvetica 10] -value left \ -command {powButtonSelection ${powDWP}region.control.brightness \ ${powDWP}region.control.zoom Left} radiobutton ${powDWP}region.control.brightness -variable buttonSelection -text "Brightness/Contrast" \ -font [list Helvetica 10] -value right \ -command {powButtonSelection ${powDWP}region.control.brightness \ ${powDWP}region.control.zoom Right} grid ${powDWP}region.control.label -row 0 -column 0 -columnspan 3 grid ${powDWP}region.control.zoom -row 1 -column 1 -sticky w grid ${powDWP}region.control.brightness -row 2 -column 1 -sticky w ${powDWP}region.control.zoom select powButtonSelection ${powDWP}region.control.brightness ${powDWP}region.control.zoom Left frame ${powDWP}region.currshape.f2 -bg $powbg menu ${powDWP}region.shapemenu -tearoff 0 -bg $powbg set regionParam(supportedShapes) \ [list Box Circle Ellipse Polygon Line Point] foreach s $regionParam(supportedShapes) { ${powDWP}region.shapemenu add command -label $s \ -command "powChangeShape $s" -font g_titleFont } button ${powDWP}region.currshape.f2.shapebut \ -textvariable regionParam(currShape) -highlightthickness 0 \ -bg $powbg -relief raised -width 8 -font g_titleFont bind ${powDWP}region.currshape.f2.shapebut { tk_popup ${powDWP}region.shapemenu \ [winfo pointerx ${powDWP}region.shapemenu] \ [winfo pointery ${powDWP}region.shapemenu] \ [lsearch -exact $regionParam(supportedShapes) \ $regionParam(currShape) ] ${powDWP}region.currshape.f2.shapebut configure -relief raised } entry ${powDWP}region.currshape.f2.desc -bg $powbg -font g_titleFont button ${powDWP}region.currshape.f2.signbut \ -textvariable regionParam(currSign) -highlightthickness 0 \ -bg $powbg -relief raised -width 1 \ -command { powToggleSign } -font g_titleFont set availableColor [list black blue green red yellow lightblue lightgreen lightyellow] tixComboBox ${powDWP}region.currshape.f2.lineColor -label "Line Color:" -dropdown true -editable true \ -option { font {Helvetica -11} \ entry.width 7 \ entry.background blue \ label.anchor w \ entry.anchor e \ } \ -command { powRegionChangeColor ${powDWP}region.currshape.f2.lineColor } foreach color $availableColor { ${powDWP}region.currshape.f2.lineColor insert end $color } tixSetSilent ${powDWP}region.currshape.f2.lineColor blue [${powDWP}region.currshape.f2.lineColor subwidget label] configure -background $powbg set swLineWidget [${powDWP}region.currshape.f2.lineColor subwidget entry] bind $swLineWidget { powRegionChangeColor ${powDWP}region.currshape.f2.lineColor -1.0 } tixComboBox ${powDWP}region.currshape.f2.handleColor -label "Handle Color:" -dropdown true -editable true \ -bg $powbg \ -option { font {Helvetica -11} \ entry.width 7 \ entry.background green \ label.anchor w \ entry.anchor e \ } \ -command { powRegionChangeColor ${powDWP}region.currshape.f2.handleColor } foreach color $availableColor { ${powDWP}region.currshape.f2.handleColor insert end $color } tixSetSilent ${powDWP}region.currshape.f2.handleColor green [${powDWP}region.currshape.f2.handleColor subwidget label] configure -background $powbg set swHandleWidget [${powDWP}region.currshape.f2.handleColor subwidget entry] bind $swHandleWidget { powRegionChangeColor ${powDWP}region.currshape.f2.handleColor -1.0 } #pack ${powDWP}region.currshape.f2.signbut -in ${powDWP}region.currshape.f2 -side left -padx 1 #pack ${powDWP}region.currshape.f2.shapebut -in ${powDWP}region.currshape.f2 -side left -padx 1 #pack ${powDWP}region.currshape.f2.lineColor -in ${powDWP}region.currshape.f2 -side left -padx 1 #pack ${powDWP}region.currshape.f2.desc -in ${powDWP}region.currshape.f2 -side left -padx 1 -fill x -expand 1 grid ${powDWP}region.currshape.f2.signbut -row 0 -column 0 -sticky w grid ${powDWP}region.currshape.f2.shapebut -row 0 -column 1 -sticky w grid ${powDWP}region.currshape.f2.desc -row 0 -column 2 -sticky we -columnspan 4 grid ${powDWP}region.currshape.f2.lineColor -row 1 -column 0 -sticky w -columnspan 2 grid ${powDWP}region.currshape.f2.handleColor -row 1 -column 2 -sticky w -columnspan 2 # Build format controls frame ${powDWP}region.radiobtns -bg $powbg -bd 4 -relief groove label ${powDWP}region.radiobtns.lbl -text "Format:" -bg $powbg -font g_titleFont menu ${powDWP}region.radiobtns.formatmenu -tearoff 0 -bg $powbg -font g_titleFont set regionParam(supportedFormats) [$regionParam(rgns) getAllFormats] foreach s $regionParam(supportedFormats) { ${powDWP}region.radiobtns.formatmenu add command -label $s \ -command [list powChangeFormat $s] -font [list Helvetica 10] } ${powDWP}region.radiobtns.formatmenu add separator ${powDWP}region.radiobtns.formatmenu add radiobutton \ -label "Decimal Degrees" -variable regionParam(degreeFormat) \ -command [list powChangeFormat "Decimal"] -value "decimal" -font [list Helvetica 10] ${powDWP}region.radiobtns.formatmenu add radiobutton \ -label "HHMMSS Degrees" -variable regionParam(degreeFormat) \ -command [list powChangeFormat "HHMMSS"] -value "hhmmss" -font [list Helvetica 10] button ${powDWP}region.radiobtns.btn \ -textvariable regionParam(format) -highlightthickness 0 \ -bg $powbg -relief raised -width 10 -font [list Helvetica 10] bind ${powDWP}region.radiobtns.btn { tk_popup ${powDWP}region.radiobtns.formatmenu \ [winfo pointerx ${powDWP}region.radiobtns.formatmenu] \ [winfo pointery ${powDWP}region.radiobtns.formatmenu] \ [lsearch -exact $regionParam(supportedFormats) \ $regionParam(format) ] ${powDWP}region.radiobtns.btn configure -relief raised -font [list Helvetica 10] } grid ${powDWP}region.radiobtns.lbl -column 0 -row 0 -sticky w grid ${powDWP}region.radiobtns.btn -column 0 -row 1 # Build Flux Panel frame ${powDWP}region.fluxprobe -bg $powbg -bd 4 -relief groove label ${powDWP}region.fluxprobe.label -text "Statistics:" -anchor w -font g_titleFont -bg $powbg iwidgets::labeledwidget ${powDWP}region.fluxprobe.pixels -labeltext "N pixels:" \ -labelfont g_titleFont -background $powbg set childsite [${powDWP}region.fluxprobe.pixels childsite] label $childsite.c -width 30 -relief sunken -font g_titleFont -bg $powbg pack $childsite.c -side left iwidgets::labeledwidget ${powDWP}region.fluxprobe.flux -labeltext "Total Flux:" \ -labelfont g_titleFont -background $powbg set childsite [${powDWP}region.fluxprobe.flux childsite] label $childsite.c -width 30 -relief sunken -font g_titleFont -bg $powbg pack $childsite.c -side left iwidgets::labeledwidget ${powDWP}region.fluxprobe.mean -labeltext "Mean Flux:" \ -labelfont g_titleFont -background $powbg set childsite [${powDWP}region.fluxprobe.mean childsite] label $childsite.c -width 30 -relief sunken -font g_titleFont -bg $powbg label $childsite.label -text "+- error" -anchor w -font g_titleFont -bg $powbg pack $childsite.c $childsite.label -side left iwidgets::Labeledwidget::alignlabels ${powDWP}region.fluxprobe.pixels \ ${powDWP}region.fluxprobe.flux \ ${powDWP}region.fluxprobe.mean grid ${powDWP}region.fluxprobe.label -column 0 -row 0 -columnspan 10 -sticky nsw grid ${powDWP}region.fluxprobe.pixels -column 0 -row 1 -columnspan 10 -sticky nsw grid ${powDWP}region.fluxprobe.flux -column 0 -row 2 -columnspan 10 -sticky nsw grid ${powDWP}region.fluxprobe.mean -column 0 -row 3 -columnspan 10 -sticky nsw # frame ${powDWP}region.btns -bg $powbg button ${powDWP}region.btns.exit -text "Exit" \ -command "destroy ${powDWP}region" \ -bg $powbg -highlightthickness 0 -font g_titleFont button ${powDWP}region.btns.clear -text "Clear All" -command powClearRegions \ -bg $powbg -highlightthickness 0 -font g_titleFont button ${powDWP}region.btns.save -text "Save..." -command powSaveRegionFile \ -bg $powbg -highlightthickness 0 -font g_titleFont button ${powDWP}region.btns.open -text "Open..." -command powOpenRegionFile \ -bg $powbg -highlightthickness 0 -font g_titleFont if { ![info exists heraQueryEntry] && !([info exists g_fvHera] && $g_fvHera > 0) } { pack ${powDWP}region.btns.open -in ${powDWP}region.btns -side left -padx 7 } pack ${powDWP}region.btns.save -in ${powDWP}region.btns -side left -padx 7 pack ${powDWP}region.btns.clear -in ${powDWP}region.btns -side left -padx 7 pack ${powDWP}region.btns.exit -in ${powDWP}region.btns -side left -padx 7 grid ${powDWP}region.list -in ${powDWP}region -column 1 -row 1 -sticky news -columnspan 5 grid ${powDWP}region.currshape -in ${powDWP}region -column 1 -row 5 -sticky ew -columnspan 5 grid ${powDWP}region.currshape.f1 -in ${powDWP}region.currshape -column 1 -row 0 -sticky ew -padx 5 -pady 5 grid ${powDWP}region.currshape.f2 -in ${powDWP}region.currshape -column 1 -row 1 -sticky ew -padx 5 -pady 5 grid ${powDWP}region.radiobtns -in ${powDWP}region -column 1 -row 11 -sticky news -rowspan 3 grid ${powDWP}region.control -in ${powDWP}region -column 2 -row 11 -sticky news -columnspan 4 -rowspan 3 grid ${powDWP}region.fluxprobe -column 0 -row 15 -columnspan 5 -rowspan 4 -sticky news grid ${powDWP}region.btns -in ${powDWP}region -column 1 -row 19 -pady 5 -columnspan 5 grid columnconfigure ${powDWP}region 1 -weight 1 grid columnconfigure ${powDWP}region.currshape 1 -weight 1 grid columnconfigure ${powDWP}region.currshape.f2 2 -weight 1 grid rowconfigure ${powDWP}region 1 -weight 1 grid rowconfigure ${powDWP}region 11 -minsize 5 grid rowconfigure ${powDWP}region 15 -minsize 10 # catch {wm minsize ${powDWP}region 300 400} ######### # Now setup bindings ######### .pow.pow bind shape {powRegion} bind ${powDWP}region.list.rgns {powExitRegionDlg} foreach wndw [list .pow ${powDWP}region] { bind $wndw { powShiftRegion 0 -1 } bind $wndw { powShiftRegion -1 0 } bind $wndw { powShiftRegion 1 0 } bind $wndw { powShiftRegion 0 1 } bind $wndw { powShiftRegion 0 -10 } bind $wndw { powShiftRegion -10 0 } bind $wndw { powShiftRegion 10 0 } bind $wndw { powShiftRegion 0 10 } } powUpdateRegionDlg update idletasks scan [winfo geometry .pow] "%dx%d+%d+%d" Pw Ph Px Py #set width [winfo reqwidth ${powDWP}region.control] #set width [expr [winfo reqwidth ${powDWP}region.radiobtns] + $width + 2] set width [expr [winfo reqwidth ${powDWP}region.fluxprobe] + 2] scan [winfo geometry ${powDWP}region] "%dx%d+%d+%d" Rw Rh Rx Ry catch { wm geometry ${powDWP}region ${width}x$Rh+[expr $Px + $Pw - 15 ]+$Py } err [gNotifications default] addObserver \ powRegionNotify notify * graphHasBeenUnselected [gNotifications default] addObserver \ powRegionNotify notify * graphHasBeenSelected [gNotifications default] addObserver \ powRegionNotify notify * graphHasBeenDestroyed } proc powSetupRegionProperty { } { global regionParam global propertyOrder set rgnIdx [$regionParam(rgns) selected] if { $rgnIdx < 0 } return set rgn [$regionParam(rgns) rgnAtIndex $rgnIdx] $rgn setPropertyOrder $propertyOrder powSelectRegion $rgnIdx } proc powSetupRegions { gn } { global regionParam powPlotParam set regionParam(gn) $gn if { [info exists powPlotParam(regions,$gn)] } { set regionParam(rgns) $powPlotParam(regions,$gn) $regionParam(rgns) activate } else { set regionParam(rgns) [gRegionList $gn .pow.pow] $regionParam(rgns) setOwner powRegionOwner set powPlotParam(regions,$gn) $regionParam(rgns) } } proc powRegionResetPanelColor { lineColor handleColor } { global powDWP [${powDWP}region.currshape.f2.lineColor subwidget entry] configure -background $lineColor [${powDWP}region.currshape.f2.handleColor subwidget entry] configure -background $handleColor powRegionChangeColor all -1.0 } proc powRegionChangeColor { wndw value } { global regionParam powDWP availableColor global negSignLineColor negSignHandleColor posSignLineColor posSignHandleColor if { $wndw == "all" } { set swEntry [${powDWP}region.currshape.f2.handleColor subwidget entry] $regionParam(rgns) setHandleColor [$swEntry cget -background] $swEntry delete 0 end set swEntry [${powDWP}region.currshape.f2.lineColor subwidget entry] $regionParam(rgns) setOutlineColor [$swEntry cget -background] $swEntry delete 0 end } else { set swEntry [$wndw subwidget entry] $swEntry delete 0 end if { $value == -1.0 } { set value [$swEntry cget -background] } else { set idx [lsearch -exact $availableColor $value] if { $idx < 0 } { # not on the availableColor list $swEntry delete 0 end set value [$swEntry cget -background] } else { $swEntry configure -background $value } } $swEntry configure -background $value if { $wndw == "${powDWP}region.currshape.f2.lineColor" } { $regionParam(rgns) setOutlineColor $value } elseif { $wndw == "${powDWP}region.currshape.f2.handleColor" } { $regionParam(rgns) setHandleColor $value } } if { $regionParam(currSign) == "+" } { set posSignLineColor [[${powDWP}region.currshape.f2.lineColor subwidget entry] cget -background] set posSignHandleColor [[${powDWP}region.currshape.f2.handleColor subwidget entry] cget -background] } else { set negSignLineColor [[${powDWP}region.currshape.f2.lineColor subwidget entry] cget -background] set negSignHandleColor [[${powDWP}region.currshape.f2.handleColor subwidget entry] cget -background] } } proc powUpdateRegionDlg { { selectGn "" } } { global regionParam powDWP global currentRegionObj global powPlotParam if { $selectGn != "" } { set regionParam(gn) $selectGn } set gn $regionParam(gn) #change rgn as well if [info exists powPlotParam(regions,$gn)] { set regionParam(rgns) $powPlotParam(regions,$gn) set regionParam(format) [$regionParam(rgns) getCoordSys] set currentRegionObj [$regionParam(rgns) getObj] } if { [$regionParam(rgns) count]==0 } { set regionParam(currRgn) "" set regionParam(currSign) "+" set regionParam(currShape) "Circle" if { [powWCSexists $gn] } { # Dont set default regions # $regionParam(rgns) setCoordSys fk5 set regionParam(degreeFormat) "hhmmss" } else { $regionParam(rgns) setCoordSys linear set regionParam(degreeFormat) "decimal" } } if { [powWCSexists $gn] } { set wcsState normal set linState disabled } else { set wcsState disabled set linState normal } foreach itm [list FK4 FK5 Gal Ecl IC Deg] { ${powDWP}region.radiobtns.formatmenu entryconfigure "${itm}*" \ -state $wcsState } ${powDWP}region.radiobtns.formatmenu entryconfigure "Lin*" \ -state $linState powUpdateRegionList powUpdateRegionTitle } proc powExitRegionDlg { } { global regionParam powPlotParam global powDWP waitFlag global old_powLutButton powLutButton powROIButton old_powROIButton set waitFlag unsave destroy ${powDWP}region if { [itcl::find objects $regionParam(rgns)] != "" } { if { [$regionParam(rgns) count]==0 || ![winfo exists .pow.pow] } { itcl::delete object $regionParam(rgns) unset powPlotParam(regions,$regionParam(gn)) } else { $regionParam(rgns) deleteAll $regionParam(rgns) deactivate itcl::delete object $regionParam(rgns) unset powPlotParam(regions,$regionParam(gn)) } } [gNotifications default] removeObserver \ powRegionNotify notify * if [info exists old_powLutButton] { set powLutButton $old_powLutButton set powROIButton $old_powROIButton powSaveConfig } } proc powRegionNotify { dmy obj msg args } { global powDWP regionParam currgn powPlotParam switch -- $msg { "graphHasBeenSelected" { if { [winfo exists ${powDWP}region] } { if { $regionParam(gn)==$obj } { # If graph hasn't actually changed, just call the activate # method so that all the shapes/drawables get raised to top $regionParam(rgns) activate } else { powSetupRegions $obj powUpdateRegionDlg } } } "graphHasBeenUnselected" { if { [info exists powPlotParam(regions,$obj)] } { set rgnList $powPlotParam(regions,$obj) $rgnList deactivate if { [$rgnList count]==0 } { unset powPlotParam(regions,$obj) itcl::delete object $rgnList } } } "graphHasBeenDestroyed" { if { [info exists powPlotParam(regions,$obj)] } { set rgnList $powPlotParam(regions,$obj) unset powPlotParam(regions,$obj) itcl::delete object $rgnList if { $regionParam(gn)==$obj } { set regionParam(gn) "" } } } } } proc powRegionOwner { obj msg } { global regionParam global currentRegionObj switch $msg { "selectionHasChanged" { powUpdateSelectedRegion } "shapeIsBeingModified" { } "shapeHasChanged" { set idx [$regionParam(rgns) indexOfRgn $obj] if { $idx == -1 } return powUpdateRegionList $idx } "regionsHaveChanged" { powUpdateRegionList } } } proc powShiftRegion { dx dy } { global regionParam if { [info exists regionParam(rgns)] \ && [itcl::find objects $regionParam(rgns)]!="" } { set idx [$regionParam(rgns) selected] [$regionParam(rgns) rgnAtIndex $idx] shift $dx $dy } } proc powUpdateRegionTitle { {outputfile ""} } { global regionParam global powDWP if { $outputfile == "" } { set fName [$regionParam(rgns) filename] if { $fName!="" } { # ${powDWP}region.head.title configure \ -text "Regions for $regionParam(gn) ([file tail $fName])" } else { # ${powDWP}region.head.title configure -text "Regions for $regionParam(gn)" } } else { # catch { ${powDWP}region.head.title configure -text "Regions for $regionParam(gn) ([file tail $outputfile])" } } } proc powSaveRegionFile { } { global regionParam currimg powDWP global regionOutputFileName global heraClientObj heraClientUploadDirList # g_fvHera is defined in fvApp of fv and it indicates that POW is # used in a Hera client. global heraQueryEntry g_fvHera global waitFlag g_backupDir global newUploadFileName set filenameList [list "src.reg"] for {set i 0} {$i<[$regionParam(rgns) count]} {incr i} { set rgn [$regionParam(rgns) rgnAtIndex $i] set propertyOrder [$rgn getPropertyOrder] if { $propertyOrder == "Background" } { lappend filenameList "back.reg" break } } for {set i 0} {$i < [llength $filenameList]} {incr i} { if { $i == 0 } { # file list: source, background set fName [$regionParam(rgns) filename] set property "Source" } else { set fName [$regionParam(rgns) bfilename] set property "Background" } if { $fName!="" } { set defFile [file tail $fName] } else { if { [info exists regionOutputFileName] && $regionOutputFileName != "" } { set defFile [file tail $regionOutputFileName] } else { set defFile [lindex $filenameList $i] } } if { [info exists heraQueryEntry] || ([info exists g_fvHera] && $g_fvHera > 0) } { set newUploadFileName [file tail $defFile] powRenameFile $defFile vwait newUploadFileName set defFile $newUploadFileName $regionParam(rgns) writeToFile "$g_backupDir/[file tail $defFile]" $regionParam(degreeFormat) $property set idx [lsearch $heraClientUploadDirList [list "*" [file tail $defFile]] ] set heraClientUploadDir [lindex [lindex $heraClientUploadDirList $idx] 0] eval $heraClientObj uploadFileVirtual {$g_backupDir/[file tail $defFile]} $heraClientUploadDir eval $heraClientObj receiveOutput "refreshDir .$heraClientUploadDir" file delete -force $g_backupDir/[file tail $defFile] set waitFlag save } else { if { [info exists regionOutputFileName] && $regionOutputFileName != "" } { set filename $regionOutputFileName } else { set filename [tk_getSaveFile -initialfile "$defFile"] } if {$filename == "" } { set waitFlag unsave return } $regionParam(rgns) writeToFile $filename $regionParam(degreeFormat) $property powUpdateRegionTitle set waitFlag save } } } proc powRenameFile { fileName } { global oldUploadFileName set oldUploadFileName $fileName set top .renameFile toplevel .renameFile wm geometry $top +[winfo pointerx .]+[winfo pointery .] wm title .renameFile "Rename Upload File Name" label $top.label -text "Rename file name if desired" -font g_titleFont label $top.entrylb -text "file name:" -font g_titleFont entry $top.entry -text "" -width 30 -background white -font g_titleFont grid $top.label -row 0 -column 0 -columnspan 5 -sticky nws grid $top.entrylb -row 1 -column 0 -sticky nws grid $top.entry -row 1 -column 1 -columnspan 4 -sticky nws frame $top.actionFrame set actionFrame $top.actionFrame button $actionFrame.ok -text "Save File" -command { powUpdateFileName } grid $actionFrame.ok -row 0 -column 4 grid $actionFrame -row 6 -column 0 -columnspan 10 -sticky news $top.entry delete 0 end $top.entry insert end [file tail $fileName] bind $top.entry { powUpdateFileName } } proc powUpdateFileName {} { global oldUploadFileName global newUploadFileName set fileDir [file dirname $oldUploadFileName] set fileName [string trim [.renameFile.entry get]] set newUploadFileName [format "%s/%s" $fileDir $fileName] destroy .renameFile } proc powOpenRegionFile { {fName "NONE"} } { global regionParam global powDWP set types { {{Region Files} {.reg} } {{All Files} * } } if { $fName == "NONE" } { set fName [$regionParam(rgns) filename] if { $fName!="" } { set defFile [file tail $fName] } else { set defFile "" } set filename [tk_getOpenFile -filetypes $types -initialfile $defFile] if {$filename == "" } return if { $regionParam(nItems) } { set act [tk_dialog ${powDWP}regionInquiry "Open Region File" \ "Region files already exist" warning 2 Cancel Overwrite Append] if { $act==-1 || $act==0 } {return} if { $act==1 } { $regionParam(rgns) deleteAll } } } else { set filename $fName } catch { $regionParam(rgns) readFromFile $filename } err catch { powUpdateRegionTitle } err } proc powUpdateRegionList { {idx -1} } { global regionParam global powDWP global convertToFormat powRotation currentRotationList currimg if { ![winfo exists ${powDWP}region] } { return } set regionParam(format) [$regionParam(rgns) getCoordSys] set currItm [$regionParam(rgns) selected] if { $idx==-1 } { ${powDWP}region.list.rgns delete 0 end set theRgns [$regionParam(rgns) regions] set n 0 } else { set theRgns [$regionParam(rgns) rgnAtIndex $idx] set n $idx } foreach rgn $theRgns { foreach [list sign shape descr] \ [$regionParam(rgns) buildRegionStr $rgn $regionParam(degreeFormat)]\ {} #puts "regionParam(degreeFormat): $regionParam(degreeFormat)" #puts "readin descr: $descr" if [info exists convertToFormat] { if { ([string tolower $shape] == "box" || [string tolower $shape] == "ellipse") && [llength $descr] >= 5 } { switch $convertToFormat { "TO_SKY" { # convert from Pixel value to Sky coordinates, minus powRotation if { [info exists currimg] && [info exists powRotation($currimg)] } { set convrtRot [lindex [lindex $currentRotationList 0] $n] # set convrtRot [expr $convrtRot - $powRotation($currimg)] set descr [lreplace $descr end end $convrtRot] #puts "PIXEL_TO_SKY: descr: $descr" } } "TO_PIXEL" { # convert from Sky coordinates to Pixel value, add powRotation if { [info exists currimg] && [info exists powRotation($currimg)] } { set convrtRot [lindex [lindex $currentRotationList 0] $n] set convrtRot [expr $convrtRot + $powRotation($currimg)] set descr [lreplace $descr end end $convrtRot] #puts "SKY_TO_PIXEL: descr: $descr" } } default { } } } catch { unset convertToFormat } catch { unset currentRotationList } } elseif { [string first "(pixels)" [string tolower $regionParam(format)]] > 0 && \ [info exists currimg] && [info exists powRotation($currimg)] } { if { ([string tolower $shape] == "box" || [string tolower $shape] == "ellipse") && [llength $descr] >= 5 } { set rot [lindex $descr end] set descr [lreplace $descr end end [expr $rot + $powRotation($currimg)]] } } set descr "([join $descr {, }])" #puts "final descr: $descr" set txtDescr "$sign${shape}$descr" ${powDWP}region.list.rgns insert $n $txtDescr if { $n==$currItm } { set regionParam(currSign) $sign set regionParam(currShape) $shape set regionParam(currDescr) $descr ${powDWP}region.currshape.f2.desc delete 0 end ${powDWP}region.currshape.f2.desc insert 0 $descr } incr n } if { $idx!=-1 } { ${powDWP}region.list.rgns delete [expr $idx+1] } if { $currItm!=-1 } { ${powDWP}region.list.rgns selection set $currItm ${powDWP}region.list.rgns see $currItm } powCalculateImageFlux } proc powUpdateSelectedRegion { } { global regionParam powDWP set rgnIdx [$regionParam(rgns) selected] set rgn [$regionParam(rgns) rgnAtIndex $rgnIdx] if { [winfo exists ${powDWP}region] } { ${powDWP}region.currshape.f2.desc delete 0 end foreach [list sign shape descr] \ [$regionParam(rgns) buildRegionStr $rgn $regionParam(degreeFormat)]\ {} ${powDWP}region.currshape.f2.desc insert 0 "([join $descr {, }])" ${powDWP}region.list.rgns select clear 0 end ${powDWP}region.list.rgns select set $rgnIdx ${powDWP}region.list.rgns see $rgnIdx set regionParam(currSign) $sign set regionParam(currShape) $shape $regionParam(rgns) setDefault $sign $shape } powCalculateImageFlux } proc powSelectRegion { itemNo } { global regionParam global powDWP global propertyOrder if {$itemNo==""} {return} $regionParam(rgns) selectRegion $itemNo set rgn [$regionParam(rgns) rgnAtIndex $itemNo] set propertyOrder [$rgn getPropertyOrder] } proc powChangeFormat { newFormat } { global regionParam global currimg powRotation convertToFormat currentRotationList set format [string tolower [lindex $newFormat 0]] switch $format { # Changes to degreeFormat "decimal" - "hhmmss" { set regionParam(degreeFormat) $format } # Changes to format default { set fromSys [$regionParam(rgns) getCoordSys] set theRgns [$regionParam(rgns) regions] set currentRotationList {} foreach rgn $theRgns { foreach [list sign shape descr] \ [$regionParam(rgns) buildRegionStr $rgn $regionParam(degreeFormat)]\ {} lappend currentRotationList [list [lindex $descr end] $fromSys] } $regionParam(rgns) setCoordSys $newFormat set toSys [$regionParam(rgns) getCoordSys] set convertToFormat "NONE" if { [string first "Pixel" $fromSys] >= 0 && [string first "Pixel" $toSys] < 0 } { # convert from Pixel value to Sky coordinates, minus powRotation set convertToFormat "TO_SKY" } elseif { [string first "Pixel" $fromSys] < 0 && [string first "Pixel" $toSys] >= 0 } { # convert from Sky coordinates to Pixel value, add powRotation set convertToFormat "TO_PIXEL" } elseif { [string first "Pixel" $fromSys] >= 0 && [string first "Pixel" $toSys] >= 0 } { # convert from Pixel value to Pixel value, since value of rotation is from # origine plane, add powRotation set convertToFormat "TO_PIXEL" } } } powUpdateRegionList } proc powChangeShape { newShape } { global regionParam global powDWP set d [${powDWP}region.currshape.f2.desc get] if { [catch {set descr [$regionParam(rgns) parseRegionStr $d]} errMsg] } { set regionParam(currShape) $newShape $regionParam(rgns) setDefault \ $regionParam(currSign) $regionParam(currShape) ${powDWP}region.currshape.f2.desc delete 0 end return } foreach [list oldSign oldShape oldDescr oldUnits] $descr {} if {$oldShape==$newShape} {return} set rgn [gRegion $regionParam(gn) .pow.pow] $rgn setSign $oldSign $rgn setShape $oldShape $rgn setFunction $oldUnits $oldDescr set theta [$rgn getRotation] set stdDescr [$rgn getCoords] if {$oldShape=="Polygon"} { set sumX 0 set sumY 0 set sumXX 0 set sumYY 0 set sumXY 0 set cnt 0 foreach {x y} $stdDescr { set sumX [expr $sumX +$x] set sumY [expr $sumY +$y] set sumXX [expr $sumXX+$x*$x] set sumYY [expr $sumYY+$y*$y] set sumXY [expr $sumXY+$x*$y] incr cnt } set x1 [expr $sumX/$cnt] set y1 [expr $sumY/$cnt] set dx [expr sqrt($sumXX/$cnt-$x1*$x1)] set dy [expr sqrt($sumYY/$cnt-$y1*$y1)] set x2 [expr $x1+$dx] set y2 [expr $y1+$dy] set stdDescr [list $x1 $y1 $x2 $y2] } if {$newShape=="Polygon"} { set pts [$rgn getPolygon] set npts [expr [llength $pts]-3] set theta 0 set stdDescr [lrange $pts 0 $npts] } $rgn setRotation $theta $rgn setShape $newShape $rgn setCoords $stdDescr foreach [list sign shape descr] \ [$regionParam(rgns) buildRegionStr $rgn $regionParam(degreeFormat)]\ {} ${powDWP}region.currshape.f2.desc delete 0 end ${powDWP}region.currshape.f2.desc insert 0 "([join $descr {, }])" set regionParam(currShape) $shape $regionParam(rgns) setDefault $sign $shape itcl::delete object $rgn } proc powToggleSign { } { global regionParam powDWP global d_negSignLineColor d_negSignHandleColor d_posSignLineColor d_posSignHandleColor if {$regionParam(currSign)=="+"} { set regionParam(currSign) "-" } else { set regionParam(currSign) "+" } if { $regionParam(currSign) == "+" } { [${powDWP}region.currshape.f2.lineColor subwidget entry] configure -background $d_posSignLineColor [${powDWP}region.currshape.f2.handleColor subwidget entry] configure -background $d_posSignHandleColor } else { [${powDWP}region.currshape.f2.lineColor subwidget entry] configure -background $d_negSignLineColor [${powDWP}region.currshape.f2.handleColor subwidget entry] configure -background $d_negSignHandleColor } powRegionChangeColor all -1.0 $regionParam(rgns) setDefault $regionParam(currSign) $regionParam(currShape) } proc powChangeRegion { } { global regionParam global powDWP $regionParam(rgns) setDefault $regionParam(currSign) $regionParam(currShape) set descr [${powDWP}region.currshape.f2.desc get] if { [catch {set newDescr [\ $regionParam(rgns) parseRegionStr $descr \ ]}] } { return } foreach {sign shape descr units} $newDescr {} $regionParam(rgns) modifyRegion $sign $shape $descr $units } proc powDeleteCurrRegion { } { global regionParam $regionParam(rgns) deleteRegion [$regionParam(rgns) selected] } proc powClearRegions { {mode "manual"} } { global regionParam powDWP if { $mode == "manual" } { set act [tk_messageBox -message "Delete All regions?" -type yesno \ -default no] if { $act=="yes" } { $regionParam(rgns) deleteAll } } else { $regionParam(rgns) deleteAll } catch { set sta ${powDWP}region.fluxprobe set childsite [$sta.pixels childsite] $childsite.c configure -text "" set childsite [$sta.flux childsite] $childsite.c configure -text "" set childsite [$sta.mean childsite] $childsite.c configure -text "" } } ######### # # Handle region clipping # proc powConvPoly { P } { set PolyGrid "" set x [lindex $P 0] set y [lindex $P 1] for {set i 2} {$i<[llength $P]} {incr i 2} { set nextX [lindex $P $i] set nextY [lindex $P [expr $i+1]] set dx [expr ($nextX-$x)] set dy [expr ($nextY-$y)] if { $dx || $dy } { lappend PolyGrid [list $x $y $dx $dy] } set x $nextX set y $nextY } return $PolyGrid } proc powClipPolys { P1 P2 } { # # Find the intersect region of two polygons. P1 and P2 *must* be closed # (ie, P[0]==P[last]) without any adjacent duplicate entries (P[i]=P[i+1]) # If a polygon is irregular (eg, U-shaped), this routine may return a list # of lists of coordinates, mapping out the disjointed regions. set TINY 1e-9 set ONEPLUS [expr 1+$TINY] set ONEMNUS [expr 1-$TINY] set Poly1 [powConvPoly $P1] set Poly2 [powConvPoly $P2] set nPoly1 [llength $Poly1] set nPoly2 [llength $Poly2] set Ipts "" if { !$nPoly1 || !$nPoly2 } { if {$nPoly1 \ && [powPtInRgn [lindex P2 0] [lindex P2 1] $Poly1]} { return $P2 } elseif { $nPoly2 \ && [powPtInRgn [lindex P1 0] [lindex P1 1] $Poly2]} { return $P1 } return "" } # Find the Intersections of the two regions for {set i1 0} {$i1 < $nPoly1} {incr i1} { set Seg1 [lindex $Poly1 $i1] foreach {a_x a_y a_dx a_dy} $Seg1 {} for {set i2 0} {$i2 < $nPoly2} {incr i2} { set Seg2 [lindex $Poly2 $i2] foreach {b_x b_y b_dx b_dy} $Seg2 {} set a $i1 set b $i2 set num [expr $a_dx*($a_y-$b_y) - $a_dy*($a_x-$b_x)] set den [expr $a_dx*$b_dy - $b_dx*$a_dy] if {$den!=0 || ($den==0 && $num==0)} { if {$den==0} { if { [expr abs($b_dx)] > [expr abs($b_dy)] } { set fb [expr ($a_x-$b_x)/$b_dx] } else { set fb [expr ($a_y-$b_y)/$b_dy] } if {$fb>=0 && $fb<$ONEPLUS} { if {$fb>$ONEMNUS} { incr b if {$b==$nPoly2} {set b 0} } elseif { $fb>$TINY } { incr b set dx [expr $fb*$b_dx] set dy [expr $fb*$b_dy] set x [expr $b_x+$dx] set y [expr $b_y+$dy] set Seg2 [list $b_x $b_y $dx $dy] set newSeg [list $x $y [expr $b_dx-$dx] \ [expr $b_dy-$dy] ] set Poly2 [lreplace $Poly2 $i2 $i2 $Seg2 $newSeg] incr nPoly2 foreach {b_dx b_dy} "$dx $dy" {} set tmp "" foreach j $Ipts { foreach {j1 j2} $j {} if {$j2>$i2} {incr j2} lappend tmp [list $j1 $j2] } set Ipts $tmp } set newI [list $a $b] if { [lsearch -exact $Ipts $newI]==-1 } { lappend Ipts $newI } set b $i2 } set fb 0 } else { set fb [expr $num/$den] } if { $fb>=0 && $fb<$ONEPLUS } { if { [expr abs($a_dx)] > [expr abs($a_dy)] } { set fa [expr ($b_dx*$fb+$b_x-$a_x)/$a_dx] } else { set fa [expr ($b_dy*$fb+$b_y-$a_y)/$a_dy] } if { $fa>=0 && $fa<$ONEPLUS } { if { $fa>$ONEMNUS } { incr a if {$a==$nPoly1} {set a 0} } elseif { $fa>$TINY } { incr a set dx [expr $fa*$a_dx] set dy [expr $fa*$a_dy] set x [expr $a_x+$dx] set y [expr $a_y+$dy] set Seg1 [list $a_x $a_y $dx $dy] set newSeg [list $x $y [expr $a_dx-$dx] \ [expr $a_dy-$dy] ] set Poly1 [lreplace $Poly1 $i1 $i1 $Seg1 $newSeg] incr nPoly1 foreach {a_dx a_dy} "$dx $dy" {} set tmp "" foreach j $Ipts { foreach {j1 j2} $j {} if {$j1>$i1} {incr j1} lappend tmp [list $j1 $j2] } set Ipts $tmp } if { $fb>$ONEMNUS } { incr b if {$b==$nPoly2} {set b 0} } elseif { $fb>$TINY } { incr b set dx [expr $fb*$b_dx] set dy [expr $fb*$b_dy] set x [expr $b_x+$dx] set y [expr $b_y+$dy] set Seg2 [list $b_x $b_y $dx $dy] set newSeg [list $x $y [expr $b_dx-$dx] \ [expr $b_dy-$dy] ] set Poly2 [lreplace $Poly2 $i2 $i2 $Seg2 $newSeg] incr nPoly2 foreach {b_dx b_dy} "$dx $dy" {} set tmp "" foreach j $Ipts { foreach {j1 j2} $j {} if {$j2>$i2} {incr j2} lappend tmp [list $j1 $j2] } set Ipts $tmp incr i2 } set newI [list $a $b] if { [lsearch -exact $Ipts $newI]==-1 } { lappend Ipts $newI } } } } } } set Ipts [lsort -command {powSortIntSects 0} $Ipts] set Jpts [lsort -command {powSortIntSects 1} $Ipts] set Npts [llength $Ipts] # powClipDump $Ipts $Poly1 $Poly2 # If there are no intersections or only 1, return: # P1 if P1 is inside P2 # P2 if P1 encloses P2 # empty if there is no overlap # If there is only one intersection, make sure first point isn't lying # right on the other Polygon. If it is, use second point for test. set state [powPtInRgn [lindex $P1 0] [lindex $P1 1] $Poly2] if { $Npts==1 } { set i1 [lindex [lindex $Ipts 0] 0] set za [lindex [lindex $Ipts 0] 2] if { $i1==0 && $za==0 } { set state [powPtInRgn [lindex $P1 2] [lindex $P2 3] $Poly2] } set Npts 0 } if { ! $Npts } { if {$state} { return [list $P1] } set state [powPtInRgn [lindex $P2 0] [lindex $P2 1] $Poly1] if {$state} { return [list $P2] } return "" } # Do loop over all the intersections and make sure they all make it # into the clipped region... this allows for disjointed clip regions set Mclips "" for {set IntSects 0} {$IntSects<$Npts} {incr IntSects} { if { ![info exists Iused($IntSects)] } { set I $IntSects set J [lsearch -exact $Jpts [lindex $Ipts $I] ] set Idir 1 set Jdir 1 set endPt $I set errFlag 0 foreach {ia1 ib1} [lindex $Ipts $I] {} set pt [lindex $Poly1 $ia1] foreach {x y dx dy} $pt {} set clipped "$x $y" set Iused($I) 1 while { 1 } { foreach {ia1 ib1} [lindex $Ipts $I] {} foreach {x1 y1 dx1 dy1} [lindex $Poly1 $ia1] {} foreach {x2 y2 dx2 dy2} [lindex_wrap $Poly1 [expr $ia1-1] ] {} set posState [powPtInRgn [expr $x1+0.5*$dx1] [expr $y1+0.5*$dy1] $Poly2] set negState [powPtInRgn [expr $x2+0.5*$dx2] [expr $y2+0.5*$dy2] $Poly2] set doP1 1 if { $posState && !$negState } { set Idir 1 } elseif { !$posState && $negState } { set Idir -1 } elseif { $posState } { set prevI [lsearch -exact $Ipts [lindex_wrap $Jpts [expr $J-$Jdir]]] set Idir [expr $I-$prevI] if { $Idir<-1 } {set Idir 1} if { $Idir> 1 } {set Idir -1} } else { # Both directions outside region... # If this wasn't first point tested, return to tracing other region. # Otherwise, it was a single point intersection, so just finish. set doP1 0 if { $I!=$endPt } { set ia2 [lindex [lindex_wrap $Ipts [expr $I+1] ] 0] if { $ia1==$ia2 } { incr I } else { incr I -1 } set J [lsearch -exact $Jpts [lindex_wrap $Ipts $I] ] } } while { $doP1 } { foreach {ia1 ib1} [lindex $Ipts $I] {} incr I $Idir if {$I==$Npts} {set I 0} elseif {$I<0} {set I [expr $Npts-1]} # Copy over all polygon1 segments inside polygon2 (ia1->ia2) foreach {ia2 ib2} [lindex $Ipts $I] {} while {$ia1!=$ia2} { incr ia1 $Idir if {$ia1==$nPoly1} {set ia1 0} \ elseif {$ia1<0} {set ia1 [expr $nPoly1-1]} set pt [lindex $Poly1 $ia1] lappend clipped [lindex $pt 0] lappend clipped [lindex $pt 1] } set J [lsearch -exact $Jpts [lindex $Ipts $I] ] set Iused($I) 1 if {$I==$endPt} {break} if { [llength $clipped] > [expr 3*($nPoly1+$nPoly2)]} { set errFlag 1 tk_messageBox -message "Got lost clipping regions! Region is too complex." break } # Check whether we actually need to switch to P2... test whether the middle # point of the next segment is still inside P2 if {$Idir==1} { foreach {x y dx dy} [lindex $Poly1 $ia2] {} } else { foreach {x y dx dy} [lindex_wrap $Poly1 [expr $ia2-1]] {} } if { ![powPtInRgn [expr $x+0.5*$dx] [expr $y+0.5*$dy] $Poly2] } { break } } if {$I==$endPt} {break} if {$errFlag} {break} # Follow polygon2 around until re-intersect polygon1 # First, need to know what direction to go! foreach {ja1 jb1} [lindex $Jpts $J] {} foreach {x1 y1 dx1 dy1} [lindex $Poly2 $jb1] {} foreach {x2 y2 dx2 dy2} [lindex_wrap $Poly2 [expr $jb1-1] ] {} set posState [powPtInRgn [expr $x1+0.5*$dx1] [expr $y1+0.5*$dy1] $Poly1] set negState [powPtInRgn [expr $x2+0.5*$dx2] [expr $y2+0.5*$dy2] $Poly1] set doP2 1 if { $posState && !$negState } { set Jdir 1 } elseif { !$posState && $negState } { set Jdir -1 } elseif { $posState } { set prevJ [lsearch -exact $Jpts [lindex_wrap $Ipts [expr $I-$Idir]]] set Jdir [expr $J-$prevJ] if { $Jdir<-1 } {set Jdir 1} if { $Jdir> 1 } {set Jdir -1} } else { set jb2 [lindex [lindex_wrap $Jpts [expr $J+1] ] 1] if { $jb1==$jb2 } { incr J } else { incr J -1 } set I [lsearch -exact $Ipts [lindex_wrap $Jpts $J] ] set doP2 0 } while { $doP2 } { foreach {ja1 jb1} [lindex $Jpts $J] {} incr J $Jdir if {$J==$Npts} {set J 0} elseif {$J<0} {set J [expr $Npts-1]} # Copy over all polygon2 segments inside polygon1 (jb1->jb2) foreach {ja2 jb2} [lindex $Jpts $J] {} while {$jb1!=$jb2} { incr jb1 $Jdir if {$jb1==$nPoly2} {set jb1 0} \ elseif {$jb1<0} {set jb1 [expr $nPoly2-1]} set pt [lindex $Poly2 $jb1] lappend clipped [lindex $pt 0] lappend clipped [lindex $pt 1] } set I [lsearch -exact $Ipts [lindex $Jpts $J] ] set Iused($I) 1 if {$I==$endPt} {break} # Check whether we actually need to switch to P1... test whether the middle # point of the next segment is still inside P1 if { [llength $clipped] > [expr 3*($nPoly1+$nPoly2)]} { set errFlag 1 tk_messageBox -message "Got lost clipping regions! Region is too complex." break } if {$Jdir==1} { foreach {x y dx dy} [lindex $Poly2 $jb2] {} } else { foreach {x y dx dy} [lindex_wrap $Poly2 [expr $jb2-1]] {} } if { ![powPtInRgn [expr $x+0.5*$dx] [expr $y+0.5*$dy] $Poly1] } { break } } if {$I==$endPt} {break} if {$errFlag} {break} } lappend Mclips $clipped } } return $Mclips } proc powClipDump { Ints P1 P2 } { puts "\nPolygon1" set i 0 foreach is $P1 { puts "[eval [concat format \"%2d %9.3f %9.3f %9.3f %9.3f\" $i $is]]" incr i } puts "Polygon2" set i 0 foreach is $P2 { puts "[eval [concat format \"%2d %9.3f %9.3f %9.3f %9.3f\" $i $is]]" incr i } puts "Intersections: " set i 0 foreach is $Ints { puts "[eval [concat format \"%2d %2d %2d\" $i $is]]" incr i } } proc lindex_wrap { L i } { set n [llength $L] while { $i < 0 } { incr i $n } while { $i >= $n } { incr i [expr -$n] } return [lindex $L $i] } proc powSortIntSects { elem a b } { set d [expr [lindex $a $elem] - [lindex $b $elem] ] if {$d==0} { set d [expr [lindex $a [expr 1-$elem] ] - [lindex $b [expr 1-$elem] ] ] } if { $d<0 } {return -1} elseif { $d>0 } {return 1} else {return 0} } proc powPtInRgn { x y Poly } { lappend Poly [lindex $Poly 0] set nPoly [llength $Poly] set next [lindex $Poly 0] foreach {n_x n_y n_dx n_dy} $next {} set flag 0 for {set cnt 1} {$cnt < $nPoly} {incr cnt} { set nxt [list $n_x $n_y $n_dx $n_dy] foreach {b_x b_y b_dx b_dy} $nxt {} foreach {n_x n_y n_dx n_dy} [lindex $Poly $cnt] {} if { ($y>$b_y && $y>=$n_y) || ($y<$b_y && $y<=$n_y) \ || ($x>$b_x && $x>=$n_x) } { continue } # Check to see if x,y lies right on the segment if { $x>=$b_x || $x>$n_x } { set dy [expr $y-$b_y] if { [expr abs($b_dy)]<1e-10 } { if { [expr abs($dy)]<1e-10 } { return 1 } else { continue } } set dx [expr $b_x + ($b_dx/$b_dy)*$dy - $x] if { $dx < -1e-10 } {continue} if { $dx < 1e-10 } {return 1} } # There is an intersection! Make sure it isn't a V point. if { $y!=$b_y } { set flag [expr 1-$flag] } else { set idx [expr $cnt-1] while {1} { if {$idx} {incr idx -1} else {set idx [expr $nPoly-2]} set prevdy [lindex [lindex $Poly $idx] 3] if {$prevdy} {break} } if {$b_dy*$prevdy > 0} { set flag [expr 1-$flag] } } } return $flag } proc powCalculateImageFlux {} { global currimg global powbg global powDWP g_titleFont global regionParam global g_backupDir global powRotation set probeFormat decimal # Use SAO Format set theRgns [$regionParam(rgns) regions] if {$theRgns == ""} { return } set regionFileName $g_backupDir/pow_[clock seconds].reg set f [open $regionFileName "w+"] set numberShape 0 for {set i 0} {$i < [llength $theRgns]} {incr i} { set probeSelected [lindex $theRgns $i] set shape [$probeSelected getShape ] set descr [$probeSelected getFunction "pixels" ] set sign [$probeSelected getSign] if { $regionParam(format) == "Physical (Pixels)" } { set new_descr "" if { $shape=="Line" || $shape=="Polygon" || $shape=="Point" } { # These objects consist of just pairs of coordinates foreach [list phy_x phy_y] $descr { set result [powConvertPhysical2Image $phy_x $phy_y] set img_x [lindex $result 0] set img_y [lindex $result 1] if { $new_descr == "" } { set new_descr [format "%s %s" $img_x $img_y] } else { set new_descr [format "%s %s %s" $new_descr $img_x $img_y] } } } else { set tokenList [split $descr " "] set phy_x [lindex $tokenList 0] set phy_y [lindex $tokenList 1] set result [powConvertPhysical2Image $phy_x $phy_y] set img_x [lindex $result 0] set img_y [lindex $result 1] set new_descr [format "%s %s" $img_x $img_y] if { $shape=="Circle" } { set phy_radius [lindex $tokenList 2] set img_radius [powConvertRadiusPhysical2Image $phy_x $phy_y $img_x $phy_radius] set new_descr [format "%s %s" $new_descr $img_radius] } else { set width [lindex $tokenList 2] set height [lindex $tokenList 3] set rot [lindex $tokenList 4] set phy_xn [expr $phy_x + $width] set phy_yn [expr $phy_y + $height] set result [powConvertPhysical2Image $phy_xn $phy_yn] set img_xn [lindex $result 0] set img_yn [lindex $result 1] set new_width [expr $img_xn - $img_x] set new_height [expr $img_yn - $img_y] set new_descr [format "%s %s %s %s" $new_descr $new_width $new_height $rot] } } set descr $new_descr } if { [string tolower $shape] == "polygon" } { set token [split $descr " "] if { [llength $token] <= 4 } { continue } } if { ([string tolower $shape] == "box" || [string tolower $shape] == "ellipse") && [llength $descr] >= 5 } { set rot [lindex $descr end] if { [info exists currimg] && [info exists powRotation($currimg)] } { set rot [expr $rot + $powRotation($currimg)] set descr [lreplace $descr end end $rot] } } # update data set tempdescr "([join $descr {, }])" set rgnDescr "$sign[string tolower ${shape}]$tempdescr" puts $f $rgnDescr incr numberShape } close $f if { $numberShape <= 0 } return set results [powGetRegionStatistics $currimg $regionFileName $descr $shape $sign ] file delete -force $regionFileName set good [lindex $results 0] if {$good == 1} { set probeCentX [lindex $results 1] set probeCentY [lindex $results 2] set probeStdX [lindex $results 3] set probeStdY [lindex $results 4] set probeFlux [lindex $results 5] set probeNPix [lindex $results 6] set probeMean [ format "%.10g" [lindex $results 7] ] set probeDMean [ format "%.10g" [lindex $results 8] ] set pixel [format "(%.2f, %.2f) +- (%.2f, %.2f)" \ $probeCentX $probeCentY $probeStdX $probeStdY ] foreach {graphx graphy} [powPixelToGraph $currimg \ [expr $probeCentX - 1] [expr $probeCentY - 1] ] {} foreach {gx1 gy1} [powPixelToGraph $currimg \ [expr $probeCentX - 1 - $probeStdX ] \ [expr $probeCentY - 1 - $probeStdY ] ] {} foreach {gx2 gy2} [powPixelToGraph $currimg \ [expr $probeCentX - 1 + $probeStdX ] \ [expr $probeCentY - 1 + $probeStdY ] ] {} set graphdx [expr abs($gx2 - $gx1)/2.0 ] set graphdy [expr abs($gy2 - $gy1)/2.0 ] if {$probeFormat == "decimal" } { set graphx [format %.6g $graphx] set graphy [format %.6g $graphy] set graphdx [format %.3g $graphdx] set graphdy [format %.3g $graphdy] } else { set graphx [powHourRA $graphx "%02d:%02d:%05.2f"] set graphy [powDegDec $graphy] set graphdx [powHourRA $graphdx "%02d:%02d:%05.2f"] set graphdy [powDegDec $graphdy] } set coord "($graphx, $graphy) +- ($graphdx, $graphdy)" } else { set probeCentX X set probeCentY Y set probeStdX "" set probeStdY "" set probeFlux 0.0 set probeNPix 0 set pixel "(X,Y) +- (dX,dY)" set coord "(X,Y) +- (dX,dY)" set probeMean 0.0 set probeDMean 0.0 if { $good == 504 } { tk_messageBox -message "Current projection is not supported." -type ok -icon error } else { tk_messageBox -message "Failed to get statistical values for region., err code: $good" -type ok -icon error } } # Update the readout in dialog box. set sta ${powDWP}region.fluxprobe set childsite [$sta.pixels childsite] $childsite.c configure -text $probeNPix set childsite [$sta.flux childsite] $childsite.c configure -text $probeFlux set childsite [$sta.mean childsite] $childsite.c configure -text "$probeMean +- $probeDMean" } fv5.4/tcltk/pow/powRuler.tcl0000755000220700001010000001574510455006725015500 0ustar birbylheadev# From canvas coordinates to the pixel and physical coord. #Update the label in the Option box proc UpdateRuler {obj} { global currimg global currgn global powDWP set xruler ${powDWP}xruler if ![info exists currimg] { return } foreach [list tx0 ty0 tx1 ty1] [$obj getGraphCoords] {} set e0 [powGraphToPixel $currimg $tx0 $ty0] set e1 [powGraphToPixel $currimg $tx1 $ty1] foreach [list x0 y0] $e0 {} foreach [list x1 y1] $e1 {} set dx [expr $x1 - $x0 ] set dy [expr $y1 - $y0 ] set dd [expr hypot($dx, $dy)] set ruler_pix [ format \ "Image Pixel \n(dX, dY): (%-.6g ,%-.6g)\n Pixel Distance: %-.6g " \ $dx $dy $dd ] $xruler.frame.message.pixel configure -text $ruler_pix set tx [expr $tx1 - $tx0 ] set ty [expr $ty1 - $ty0 ] set deg2rad [expr 3.1415926/180.0 ] if [powWCSexists $currgn ] { # angular distance set sinx2 [expr sin($tx/2.0*$deg2rad)] set siny2 [expr sin($ty/2.0*$deg2rad)] set cosy1 [expr cos($ty1*$deg2rad)] set cosy0 [expr cos($ty0*$deg2rad)] set dd [expr ($siny2*$siny2) + ($cosy1*$cosy0*$sinx2*$sinx2) ] set dd [expr sqrt($dd)] if {$dd > 1.0} { set dd 1.0 } set dd [expr asin($dd)*2.0/$deg2rad] # angle to north set a [expr (90 - $ty1)*$deg2rad] set b [expr (90 - $ty0)*$deg2rad] set c [expr $dd*$deg2rad] if {$a == 0.0 || $b == 180.0 || $c == 0.0 } { set angle 0 } elseif {$a == 180.0 || $b == 0.0 || $c == 180.0 } { set angle 180 } else { set sinb [expr sin($b)] set sinc [expr sin($c)] set s [expr 0.5 * ($a + $b + $c)] set sinsc [expr sin($s - $c)] set sinsb [expr sin($s - $b)] set temp2 [expr sqrt(($sinsc/$sinc)*($sinsb/$sinb))] if {$temp2 > 1.0} { set temp2 1.0 } set angtmp [expr 2.0*asin($temp2)/$deg2rad] if {$tx >= 0 && $tx < 180} { set angle $angtmp } elseif {$tx >= 180 && $tx < 360 } { set angle [expr 360 - $angtmp ] } elseif {$tx < 0 && $tx >= -180 } { set angle [expr 360.0 - $angtmp ] } elseif {$tx < -180 && $tx >= -360 } { set angle $angtmp } else { } } set ruler_graph [format \ "Graph Coordinate (deg) \n(dRA, dDec): (%-.6g, %-.6g)\n" $tx $ty ] set temp [format \ "Ang. Distance: %-.6g \nAngle to North: %-.6g \n" \ $dd $angle ] set ruler_graph "${ruler_graph}${temp}" } else { set dd [expr hypot($tx, $ty)] set angle [expr atan2($ty,$tx)/$deg2rad ] set ruler_graph [ format \ "Graph Coordinate \n(dX, dY): (%-.6g, %-.6g)\n" $tx $ty ] set temp [format \ "Distance: %-.6g \nAngle to X-axis(deg): %-.6g \n" \ $dd $angle ] set ruler_graph "${ruler_graph}${temp}" } $xruler.frame.message.graph configure -text $ruler_graph foreach {cx0 cy0} [powGraphToCanvas $currgn $tx0 $ty0] {} foreach {cx1 cy1} [powGraphToCanvas $currgn $tx1 $ty1] {} set temp [list $cx0 $cy0 $cx0 $cy1 $cx1 $cy1] .pow.pow delete ruler_line .pow.pow create line $temp -fill lightblue -tags ruler_line } proc RulerCallback { obj msg } { global powDWP set xruler ${powDWP}xruler if ![winfo exists $xruler ] { return } if {$msg == "shapeIsBeingModified" || $msg == "shapeHasChanged"} { UpdateRuler $obj } } proc OpenRuler { } { global rulerRegion global currgn global currimg global powDWP global powbg global g_titleFont global powRotation global storePowRotation set xruler ${powDWP}xruler if [winfo exists $xruler ] { focus $xruler raise $xruler return } if ![info exists currimg ] { tk_messageBox -type ok -icon error \ -message "Select an image first." return } powToplevel $xruler .pow "-width 200 -bg $powbg" wm title $xruler "Ruler" frame $xruler.frame -borderwidth 4 frame $xruler.frame.title frame $xruler.frame.message -borderwidth 3 -relief groove label $xruler.frame.title.title -text "Ruler:" -background yellow \ -relief flat -width 8 -anchor w -font g_titleFont button $xruler.frame.title.help -text Help -anchor e \ -command {powHelp Ruler.html} -font g_titleFont set ruler_pix "Image Pixel \n(dX, dY): \n Pixel Distance: " if [powWCSexists $currgn ] { set ruler_graph "Graph Coordinate (deg)\n(dRA, dDEC): \n" set ruler_graph "${ruler_graph}Ang. Distance: \nAngle to North:" } else { set ruler_graph "Graph Coordinate \n(dX, dY): \n" set ruler_graph "${ruler_graph}Distance: \nAngle to X-axis:" } message $xruler.frame.message.pixel -text $ruler_pix \ -anchor w -relief flat -width 200 -font g_titleFont message $xruler.frame.message.graph -text $ruler_graph \ -anchor w -relief flat -width 400 -font g_titleFont button $xruler.frame.close -text Exit -command { global storePowRotation global currimg global powRotation if { [info exists currimg] && [info exists storePowRotation($currimg)] } { set powRotation($currimg) $storePowRotation($currimg) } itcl::delete object $rulerRegion .pow.pow delete ruler_line destroy ${powDWP}xruler } -font g_titleFont pack $xruler.frame.title.title -side left -anchor w pack $xruler.frame.title.help -side right -anchor e pack $xruler.frame.message.pixel -side left -anchor nw pack $xruler.frame.message.graph -side left -anchor nw pack $xruler.frame.title -anchor w -pady 5 -padx 2 -fill x pack $xruler.frame.message -anchor w -pady 2 -padx 2 -fill x pack $xruler.frame.close -expand 1 -anchor w -pady 5 -padx 2 pack $xruler.frame -fill x set ruler_gn $currgn set ruler_img $currimg set rulerRegion [gRegionList $currgn .pow.pow] $rulerRegion setOwner RulerCallback $rulerRegion setAllowsMultiple 0 $rulerRegion setDefault "+" Line set temp [powFetchImageInfoHash $ruler_img ] set temp [split $temp ] set rulerWidth [lindex $temp 3] set rulerHeight [lindex $temp 5] set halfx [expr round($rulerWidth*0.5) ] set halfy [expr round($rulerHeight*0.5) ] set gx0 [expr round($halfx*0.5) + 1] set gy0 [expr round($halfy*0.5) + 1] set gx1 [expr round($halfx*1.5) + 1] set gy1 [expr round($halfy*1.5) + 1] set descr [list $gx0 $gy0 $gx1 $gy1] if [info exists powRotation($currimg)] { set storePowRotation($currimg) $powRotation($currimg) catch { unset powRotation($currimg) } } $rulerRegion addRegion + Line $descr pixels set elem [$rulerRegion rgnAtIndex 0] set powROIButton 1 powSaveConfig bind $xruler <> { itcl::delete object rulerRegion .pow.pow delete ruler_line destroy ${powDWP}xruler } tkwait window $xruler } fv5.4/tcltk/pow/powScript.tcl0000644000220700001010000017257211130706071015642 0ustar birbylheadev# # This file contains code which makes POW more scriptable either from # TCL or via XPA entry points # namespace eval powCmds { variable currcrv "" variable remoteServer "" variable mouseClicked "" proc helpPage { args } { variable remoteServer global g_showpow_flag powDWP g_backupDir if { $remoteServer != "" } { return [::powXPA::server $remoteServer helpPage $str ] } set g_showpow_flag "noshow" if { ![winfo exists .pow] } { powInit .dummy } if { [string range $args [expr [string length $args] - 5] end] == ".html" } { set fileName $args } else { set fileName $g_backupDir/helpPage_[clock seconds].html set f [::open $fileName w+] set data [split [lindex $args 0] \n] foreach line $data { catch { puts $f $line } err } catch { ::close $f } err } catch { powHelp $fileName } err } proc getXRange { args } { global currgn powDWP global xRangeParam variable remoteServer if { $remoteServer != "" } { return [::powXPA::server $remoteServer getXRange $str ] } if { ![info exist xRangeParam(rgns)] } return {} set theRgns [$xRangeParam(rgns) regions] set regionStr {} foreach rgn $theRgns { foreach [list sign shape descr] \ [$xRangeParam(rgns) buildRegionStr $rgn $xRangeParam(degreeFormat)]\ {} set descr "[format "%.15G" [lindex $descr 0]] [format "%.15G" [lindex $descr 2]]" lappend regionStr $descr } return $regionStr } proc getRegion { args } { global currgn regionParam powDWP variable remoteServer if { $remoteServer != "" } { return [::powXPA::server $remoteServer getRegion $str ] } set propertyOrder [lindex $args 0] if { ![info exist regionParam(rgns)] } return {} set theRgns [$regionParam(rgns) regions] set regionStr {} foreach rgn $theRgns { if { [$rgn getPropertyOrder] == $propertyOrder } { foreach [list sign shape descr] \ [$regionParam(rgns) buildRegionStr $rgn $regionParam(degreeFormat)]\ {} set descr [format "%s%s%s" [string trim $sign] [string tolower $shape] ([join $descr {, }])] lappend regionStr $descr } } return $regionStr } proc regions { args } { variable remoteServer global currgn regionParam powDWP if { [llength $args] == 1 && [file exists [lindex $args 0]] } { set f [open [lindex $args 0] r] set str [read $f [file size [lindex $args 0]]] ::close $f } else { set str "" for {set i 0} {$i < [llength $args]} {incr i} { set str [format "%s%s" $str [lindex $args $i]] } } if { $remoteServer != "" } { return [::powXPA::server $remoteServer regions $str ] } if { ![winfo exists ${powDWP}region] } { powRegion } if { ![info exists regionParam(rgns)] } { set regionParam(rgns) [gRegionList $currgn .pow.pow] } catch { $regionParam(rgns) readFromStr $str } err return Done } proc regionName { args } { global regionOutputFileName variable remoteServer if { $remoteServer != "" } { return [::powXPA::server $remoteServer regionName $args] } set regionOutputFileName [lindex $args 0] powUpdateRegionTitle $regionOutputFileName return Done } proc setRegionFormat { args } { variable remoteServer global regionParam if { $remoteServer != "" } { return [::powXPA::server $remoteServer regionName $args] } set plainformats [$regionParam(rgns) getPlainFormats] set allformats [$regionParam(rgns) getAllFormats] set idx [lsearch -exact $plainformats [lindex $args 0]] set newFormat [lindex $args 0] if { $idx >= 0 } { set newFormat [lindex $allformats $idx] } powChangeFormat $newFormat return Done } proc binFactorTool { args } { global binFactorSendFlag powDWP global defaultBinFactor variable remoteServer if { $remoteServer != "" } { return [::powXPA::server $remoteServer binFactorTool $args] } if { [llength $args] == 1 } { switch -- [lindex $args 0] { "-wait" { set token [split $binFactorSendFlag " "] if { [lindex $token 0] != "NOT_YET" } { set returnFlag $binFactorSendFlag set binFactorSendFlag "NOT_YET 0" return $returnFlag } return $binFactorSendFlag } "-open" { powBinFactorSelect set binFactorSendFlag "NOT_YET 0" return Done } "-close" { powApplyBinFactor DONE catch { destroy ${powDWP}binFactorSelect } return Done } default { error "[lindex $args 0] is not a valid option for binFactorTool" } } } elseif { [llength $args] == 2 } { switch -- [lindex $args 0] { "-value" { powSetBinFactor [lindex $args 1] set defaultBinFactor [lindex $args 1] } default { error "[lindex $args 0] is not a valid option for binFactorTool" } } } else { error "$args are not a valid options for binFactorTool" } } proc regionTool { args } { global currgn regionParam global regionOutputFileName waitFlag powDWP variable remoteServer if { $remoteServer != "" } { return [::powXPA::server $remoteServer regionTool $args] } if { [llength $args] == 1 } { switch -- [lindex $args 0] { "-wait" { if ![info exists waitFlag] { return "NOT_YET" } if { $waitFlag == "save" } { return 0 } elseif { $waitFlag == "unsave" } { return 1 } else { return "NOT_YET" } } "-open" { set regionParam(rgns) [gRegionList $currgn .pow.pow] powRegion set waitFlag "NOT_YET" return Done } "-close" { catch { destroy ${powDWP}region } return Done } "-clearAll" { catch { powClearRegions clearAll } err return Done } default { error "[lindex $args 0] is not a valid option for regionTool" } } } else { error "$args are not a valid options for regionTool" } } proc xranges { args } { variable remoteServer global currgn xRangeParam powDWP if { [llength $args] == 1 && [file exists [lindex $args 0]] } { set f [open [lindex $args 0] r] set str [read $f [file size [lindex $args 0]]] ::close $f } else { set str "" for {set i 0} {$i < [llength $args]} {incr i} { set str [format "%s%s" $str [lindex $args $i]] } } if { $remoteServer != "" } { return [::powXPA::server $remoteServer xranges $str ] } if { ![info exists ${powDWP}xRange] } { powXRange } if { ![info exists xRangeParam(rgns)] } { set xRangeParam(rgns) [gRegionList $currgn .pow.pow] } $xRangeParam(rgns) setStaticFlag "y" catch { xrangeReadDataStr $str } err return Done } proc xrangeName { args } { global xrangeOutputFileName variable remoteServer if { $remoteServer != "" } { return [::powXPA::server $remoteServer xrangeName $args] } set xrangeOutputFileName [lindex $args 0] powUpdateXRangeTitle $xrangeOutputFileName return Done } proc xrangeTool { args } { global currgn xRangeParam global xrangeOutputFileName waitFlag powDWP variable remoteServer if { $remoteServer != "" } { return [::powXPA::server $remoteServer xrangeTool $args] } if { [llength $args] == 1 } { switch -- [lindex $args 0] { "-wait" { if { $waitFlag == "save" } { return 0 } elseif { $waitFlag == "unsave" } { return 1 } else { return "NOT_YET" } } "-open" { set xRangeParam(rgns) [gRegionList $currgn .pow.pow] powXRange set waitFlag "NOT_YET" return Done } "-close" { catch { destroy ${powDWP}xRange } return Done } default { error "[lindex $args 0] is not a valid option for xrangeTool" } } } else { error "$args are not a valid options for xrangeTool" } } proc draw { args } { init eval .pow.pow create $args } ######################## # Graph Commands # ######################## proc add { objType objName } { global currgn variable remoteServer if { $remoteServer != "" } { return [::powXPA::server $remoteServer add $objType $objName] } switch -- $objType { curve { powAddCurves $currgn $objName } image { powAddImages $currgn $objName } default { error "Unrecognized object type: $objType" } } } proc axes { {xscale ""} {yscale ""} } { global currgn powPlotParam variable remoteServer if { $remoteServer != "" } { return [::powXPA::server $remoteServer axes $xscale $yscale] } if { $xscale=="" && $yscale=="" } { return [list $powPlotParam(xTickScal,$currgn) \ $powPlotParam(yTickScal,$currgn)] } elseif { $yscale=="" } { if { [regexp (\W)-(\W) $xscale dmy xsc ysc] } { powLogGraph $currgn $xsc $ysc } else { powLogGraph $currgn $xscale $xscale } } else { powLogGraph $currgn $xscale $yscale } } proc bounds { args } { global powPlotParam currgn currimg variable currcrv variable remoteServer if { $remoteServer != "" } { return [eval ::powXPA::server $remoteServer bounds $args] } setCurrCurve set mode "wcs" set argc [llength $args] if { $argc==0 || ($argc==1 && [lindex $args 0]!="reset") } { foreach {x0 y0 x1 y1} [list \ $powPlotParam(xBot,$currgn) \ $powPlotParam(yBot,$currgn) \ $powPlotParam(xTop,$currgn) \ $powPlotParam(yTop,$currgn) ] {} if { $argc==1 } {set mode $args} switch -glob $mode { pix* { if { [info exists currimg] || $currcrv!="" } { if { [info exists currimg] } { set obj $currimg set isImg 1 } else { set obj $currcrv set isImg 0 } foreach {x0 y0} [powGraphToPixel $obj \ $powPlotParam(xBot,$currgn) \ $powPlotParam(yBot,$currgn)] {} foreach {x1 y1} [powGraphToPixel $obj \ $powPlotParam(xTop,$currgn) \ $powPlotParam(yTop,$currgn)] {} if { $isImg } { set x0 [expr $x0+1] set y0 [expr $y0+1] set x1 [expr $x1+1] set y1 [expr $y1+1] } } } wc* { # No need to do anything } default { error "Unrecognized conversion mode: $mode" } } return [list $x0 $y0 $x1 $y1] } elseif { [lindex $args 0]=="reset" } { set powPlotParam(xBot,$currgn) NULL set powPlotParam(yBot,$currgn) NULL set powPlotParam(xTop,$currgn) NULL set powPlotParam(yTop,$currgn) NULL powEraseGraph $currgn 1 powMapGraph $currgn } elseif { [lindex $args 0]=="zoom" } { if { $argc==2 || $argc==3 } { set xmag [lindex $args 1] if { $argc==3 } { set ymag [lindex $args 2] } else { set ymag $xmag } if { $xmag<=0 || $ymag<=0 } { error "Zoom factor out of range" } foreach {x0 y0 x1 y1} [bounds pixels] {} set halfwdth [expr 0.5*($x1-$x0)] set halfhght [expr 0.5*($y1-$y0)] set x0 [expr $x0 + $halfwdth - $halfwdth/$xmag] set x1 [expr $x1 - $halfwdth + $halfwdth/$xmag] set y0 [expr $y0 + $halfhght - $halfhght/$ymag] set y1 [expr $y1 - $halfhght + $halfhght/$ymag] bounds $x0 $y0 $x1 $y1 pixels } else { error "Usage: bounds zoom xMag ?yMag?" } } elseif { $argc==4 || $argc==5 } { foreach {x0 y0 x1 y1} [lrange $args 0 3] {} if { $argc==5 } {set mode [lindex $args 4]} switch -glob $mode { pix* { if { [info exists currimg] || $currcrv!="" } { if { [info exists currimg] } { set obj $currimg set x0 [expr $x0-1] set y0 [expr $y0-1] set x1 [expr $x1-1] set y1 [expr $y1-1] } else { set obj $currcrv } foreach {x0 y0} [powPixelToGraph $obj $x0 $y0] {} foreach {x1 y1} [powPixelToGraph $obj $x1 $y1] {} } } wc* { # No need to do anything } default { error "Unrecognized conversion mode: $mode" } } set powPlotParam(xBot,$currgn) $x0 set powPlotParam(yBot,$currgn) $y0 set powPlotParam(xTop,$currgn) $x1 set powPlotParam(yTop,$currgn) $y1 powEraseGraph $currgn 1 powMapGraph $currgn } else { error "Syntax: bounds ?xLft yBtm xRgt yTop? ?mode?" } } proc cursor { } { global currgn variable mouseClicked foreach {x1 y1 x2 y2} [.pow.pow coords ${currgn}box] {} set boxid [.pow.pow create polygon $x1 $y1 $x1 $y2 $x2 $y2 $x2 $y1 \ -fill {}] .pow.pow bind $boxid