savi1.6.0/0000755000175000017500000000000014423445060011435 5ustar lloydlloydsavi1.6.0/data/0000755000175000017500000000000014423445060012346 5ustar lloydlloydsavi1.6.0/data/atcontact.tcl0000644000175000017500000000251314423445060015033 0ustar lloydlloyd# # * PROPOSAL # * # * @contact # * # * Not built. # * # * See their FCC application, filed 22 December 1997. # * Orbital characteristics are given in section 4.2. # # Was at http://www.atcontactcom.com/ # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: atcontact.tcl 170 2020-04-28 03:34:51Z lloydwood $ # site says 16 operational satellites and four spares, one per plane. set SATS_PER_PLANE 4 set NUM_PLANES 4 # setup orbital elements set a [expr 10400.0+$RADIUS_OF_EARTH] set e 0.001 set inc 45 set omega 0.0 set coverage_angle 20.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # satellite phasing relative to adjacent plane of 22.5 deg. # harmonic factor in Ballard constellations # 360 / 4 / 4 = 360 / 16 = 22.5 degrees. set plane_offset [expr $T_per / $NUM_PLANES / $SATS_PER_PLANE] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { # 90 degrees between planes. set Omega [expr $j * 360.0 / $NUM_PLANES] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { # we use second harmonic as that appears to give best coverage # with dual or better coverage below 50 degrees of latitude. set T [expr $T_per * $i / $SATS_PER_PLANE - $plane_offset*2*$j] set n [satellites LOAD $a $e $inc $Omega $omega $T "@contact ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/skybridge-64.tcl0000644000175000017500000000542514423445060015272 0ustar lloydlloyd# # * 1990s LARGE BROADBAND PROPOSALS - FAT PIPE DREAMS # * # * SkyBridge double-delta constellation # * # * This system, developed by Alcatel, was originally called Sativod # * (for Satellite Video on Demand). # * # * This is the original 64-active-satellite proposal, which consists # * of two overlapping rosettes, slightly offset. The first # * subconstellation was originally planned for launch in 2000, with # * the second in 2002. These were redesigned in 1998 to a single # * 80-active-satellite constellation. # * # * The aim of having two overlapping synchronised rosettes was to give # * frequency sharing with satellites in GEO. The idea was that when # * one Skybridge satellite was too near in the sky to the equatorial # * belt and to a geostationary satellite, service could be provided # * by its slightly-more-distant neighbour. This can be demonstrated # * by showing the equatorial exclusion zone. # * # * See: # * the SkyBridge FCC application, 28 February 1997, pp. 27-31. # * # * Jean-Luc Palmade, Eric Frayssinhes and Erick Lansard, Constellation # * of non-geostationary satellites providing permanent coverage, # * US patent 6,032,902, issued 7 March 2000 to Alcatel Espace. # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: skybridge-64.tcl 116 2019-09-30 07:20:51Z lloydwood $ # Elevation angle apparently 10 degrees, but that's not quite full # coverage. set coverage_angle 10.0 # I'm not convinced by the orbital parameters given - they define the # argument of perigee as 90 degrees, and the eccentricity as 0 degrees # (table, p.30). Some redundancy, surely? Would have been impossible # to figure out if they hadn't given a planar projection of satellite # distribution; it's continuous-phasing. set SATS_PER_PLANE 4 set NUM_PLANES 8 # set to one to show the first subconstellation after completed launch set NUM_CONSTS 2 # offset of second SkyBridge sub-constellation, degrees set LONG_OFFSET 10 set LAT_OFFSET -14 # setup orbital elements set a [expr 1457.0+$RADIUS_OF_EARTH] set e 0.0 set inc 55 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] puts stderr "\nSaVi: showing Skybridge's equatorial exclusion zone." upvar #0 plane_flag plane_flag set plane_flag 1 satellites GV_BEGIN # outer loop for both sub-constellations for {set k 0} {$k < $NUM_CONSTS} {incr k} { for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 45.0 + $k * $LONG_OFFSET ] set plane_offset [expr $T_per / 360.0 * ($j * -33.75 + $k * $LAT_OFFSET) ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * $i / $SATS_PER_PLANE + $plane_offset] set n [satellites LOAD $a $e $inc $Omega $omega $T "SkyBridge-64 ($j, $i, $k)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } } satellites GV_END savi1.6.0/data/radarsat-rcm.tcl0000644000175000017500000000344114423445060015434 0ustar lloydlloyd# # * REMOTE SENSING - OPERATIONAL SYSTEM # * # * RADARSAT-3 / RADARSAT CONSTELLATION MISSION # * # * Three satellites are spaced equally in a sun-synchronous plane, # * which ascends over the Equator at 6:00 pm, in order after one # * another. Launched June 2019. The earlier RADARSAT-1 and -2 are # * not included here. # * # * This script turns on sunlight to show the sun-synchronous orbits. # * # * Satellite, payload, and orbital details from ESA's Earth # * Observation Portal. # https://earth.esa.int/web/eoportal/satellite-missions/r/rcm # # $Id: radarsat-rcm.tcl 111 2019-09-26 07:05:26Z lloydwood $ # sun-synchronous, so turn on sunlight upvar #0 sun_flag sun_flag set sun_flag 1 set a [expr 600.0+$RADIUS_OF_EARTH] set inc 97.7 set e 0.0 set omega 0.0 # ascending over Equator at 18:00 set Omega [expr 18.00/12 * 180.0] # 0 or 5 degrees would be minimum for ground station visibility. # 600km swath width / accessible area. # arctan(686/300) = 66.4 degrees - ignores curvature of Earth. # or 23.6 for half-cones from satellites. # We could set half-cone for correct fisheye behaviour, but then # the popup and subsequently-loaded scripts are incorrect. set coverage_angle 66.4 # set coverage_angle 23.6 # upvar #0 coverage_angle_flag coverage_angle_flag # set coverage_angle_flag 1 # puts stderr "\n\nSaVi: half-cone coverage angle of $coverage_angle deg shows extent of DMC imaging swath." puts stderr "\nSaVi: imaging swath shown. Set mask angle to zero for limits of communications connectivity." set SATS_PER_PLANE 3 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per / $SATS_PER_PLANE * $i ] satellites LOAD $a $e $inc $Omega $omega $T "RADARSAT RMC-$i" } satellites GV_END savi1.6.0/data/spacex-starlink-inner.tcl0000644000175000017500000001206314423445060017275 0ustar lloydlloyd# # * PROPOSED LARGE BROADBAND CONSTELLATIONS - 2010s MEGACONSTELLATIONS # * # * Starlink # * # * This is the 'perfect' fully-deployed first-generation SpaceX # * Starlink system. Only the initial "first shell" of the planned # * initial Ku/Ka-band constellations is simulated here; this is # * likely to be the "inner shell" for quite some time. Higher # * shells and the lower, later, V-band constellations are not yet # * simulated. # * # * Initial single launch of 60 satellites in May 2019, after # * two test satellites were launched in February 2018. Further # * launches have been carried out. # * # * This was based on the November 2018 FCC filing, which modified # * and slightly reduced the first shell authorised in March 2018, # * as well as lowering the satellites to 550km from 1,150km altitude. # * The planned geometry of further added shells, if any, can also be # * expected to be altered. # * # * The planned design of this first shell changed again in August # * 2019, when SpaceX advised the FCC of a redistribution of the # * orbital planes and satellites, while still keeping the same # * overall number of satellites. # * # * Attempting to simulate any further shells does not appear # * worthwhile, especially since SpaceX filed for an additional # * 30,000 satellites in October 2019. That would have led to # * a multiple-shell constellation of over 42,000 satellites. # * Though SaVi could simulate that many satellites, little # * would be learned from doing so. In April 2019 SpaceX filed # * again with the FCC, lowering the altitude of all proposed # * shells and satellites to under 575km, but leaving this first # * shell unchanged from the earlier August 2019 filing. # * # * Expected user terminal minimum elevation angle for this shell # * is 25 degrees, rising to 40 degrees once all satellites in # * this shell are launched and operational. # * # * Planned to use intersatellite links, which are not yet simulated # * here - but the test duo and first batches of launched satellites # * do not include those links. # # http://en.wikipedia.org/wiki/Starlink_(satellite_constellation) # # $Id: spacex-starlink-inner.tcl 166 2020-04-23 04:59:32Z lloydwood $ # November 2018 # This is Orbital Plane 2 detailed in SAT-MOD-2018-1108-00083, FCC # filing of 8 November 2018, and described in Appendix A. # set SATS_PER_PLANE 66 # set NUM_PLANES 24 # August 2019 # This is detailed in the Technical Attachment of # FCC document SAT-MOD-20190830-00087, filed 30 August 2019. # SpaceX wants to rearrange its Starlink satellites for faster # broadband ramp-up, Alan Boyle, GeekWire, 16 September 2019. # https://www.geekwire.com/2019/spacex-wants-rearrange-starlink-satellites-faster-broadband-ramp/ set SATS_PER_PLANE 22 set NUM_PLANES 72 # to see planned initial deployment of third of shell, # which provides continuous coverage at highest # degrees of latitude, set this to 1 set DEPLOY_THIRD 0 # setup orbital elements set a [expr 550.0 + $RADIUS_OF_EARTH] set e 0.0 set inc 53.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # Minimum elevation angle is said to start at 25 degrees, rising to 40 degrees. # Let's assume that 25 degrees is during partial constellation deployment, # and 40 degrees is for this fully deployed constellation. Given uneven # coverage for 40 degrees for the specified geometry, this seems doubtful. # There are indications that, without intersatellite links, the lower # minimum elevation of 25 degrees will be in use permanently. set coverage_angle 25.0 upvar #0 NUM_COLORS NUM_COLORS if {$NUM_COLORS < 19} { # more than 19 satellites can be visible in fisheye over mid-latitudes puts stderr "\nSaVi: Coverage view of Starlink constellation benefits from largest number of colors (19+)." } # Plane offset is really a function of harmonic factor in Ballard constellations. # (Rosette Constellations of Earth Satellites, A. H. Ballard, TRW, # IEEE Transactions on Aerospace and Electronic Systems, Vol 16 No 5, Sep. 1980) # 360 / 66 / 24 = 360 / 1,584 = 0.2273 degrees approx. # The Access .ndb database file in the November FCC filing suggests a # ~3 degree offset between planes - 13th harmonic is 2.9545, close enough. # set interplane_phasing [expr 360.0 / $NUM_PLANES / $SATS_PER_PLANE * 13] # With the August 2019 filing, phasing is not specified. # In the spirit of Starlink's constellation design to date, we'll just # guess. Let's pick a prime and hope for the best. What could # possibly go wrong? Offset makes so much more sense when negativa, # since it's time TO periapsis. set interplane_phasing [expr 360.0 / $NUM_PLANES / $SATS_PER_PLANE * -13] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES] if {$DEPLOY_THIRD && [expr $j % 3 ] != 0} { continue; } for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set plane_offset [expr ($T_per / 360) * ($j * $interplane_phasing) ] set T [expr ($T_per * $i / $SATS_PER_PLANE ) + $plane_offset ] set n [satellites LOAD $a $e $inc $Omega $omega $T "Starlink-first ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/amazon-project-kuiper-third.tcl0000644000175000017500000000527514423445060020421 0ustar lloydlloyd# # * PROPOSED LARGE BROADBAND CONSTELLATIONS - 2010s MEGACONSTELLATIONS # * # * Project Kuiper # * # * This is the third shell to be deployed in the Amazon Project Kuiper # * system. # * # * This is based on the 4 July 2019 FCC filing. # * This is at Ka-band - even though the name may suggest 'Ku'. # * # * Despite the number of satellites, the filing does not appear # * to describe intersatellite links. The Technical Appendix says: # * "The number of United States gateways sites will be approximately # * equal to the number of active satellites serving U.S. territory." # # July FCC filings # https://licensing.fcc.gov/cgi-bin/ws.exe/prod/ib/forms/attachment_menu.hts?id_app_num=131001&acct=322741&id_form_num=12&filing_key=-434810 # # Amazon asks FCC for approval of Project Kuiper broadband satellite operation, # Alan Boyle and Taylor Soper, GeekWire, July 6, 2019. # https://www.geekwire.com/2019/amazon-asks-fcc-approval-project-kuiper-broadband-satellite-operation/ # https://finance.yahoo.com/news/amazon-asks-fcc-approval-project-175804004.html # # $Id: amazon-project-kuiper-third.tcl 84 2019-08-19 05:01:03Z lloydwood $ set SATS_PER_PLANE 28 set NUM_PLANES 28 # No initial deployment of half of shell puts stderr "SaVi: Kuiper: full third shell" # setup orbital elements set a [expr 590.0 + $RADIUS_OF_EARTH] set e 0.0 set inc 33.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # Minimum elevation angle is said to be 35 degrees. set coverage_angle 35.0 upvar #0 NUM_COLORS NUM_COLORS if {$NUM_COLORS < 19} { # more than 19 satellites can be visible in fisheye over mid-latitudes puts stderr "\nSaVi: Coverage view of Kuiper constellation benefits from largest number of colors (19+)." } # FIX THIS # Plane offset is really a function of harmonic factor in Ballard constellations. # (Rosette Constellations of Earth Satellites, A. H. Ballard, TRW, # IEEE Transactions on Aerospace and Electronic Systems, Vol 16 No 5, Sep. 1980) # 360 / 28 / 28 = 360 / 784 = 0.4592 degrees approx. # The Access .ndb database file in the July FCC filing would suggest # exactly which harmonic to use. Technical document suggests simple tiling # with half spacing given number of sats, i.e. 14th harmonic. set interplane_phasing [expr 360.0 / $NUM_PLANES / $SATS_PER_PLANE * 17] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set plane_offset [expr ($T_per / 360) * ($j * $interplane_phasing) ] set T [expr ($T_per * $i / $SATS_PER_PLANE ) + $plane_offset ] set n [satellites LOAD $a $e $inc $Omega $omega $T "Kuiper-3rd ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/gps.tcl0000644000175000017500000000732014423445060013645 0ustar lloydlloyd# # * NAVIGATION SYSTEMS # * # * Global Positioning System (GPS) # * # * This shows nominal positions and spacing. # * # * Information provided by Peter Dana in 1996 while at the # * University of Texas. # * # * Best viewed with a large number of colours (14+) to show full # * diversity. # # Orbital summary now found at: # http://www.colorado.edu/geography/gcraft/notes/gps/gps.html#SpaceSeg # Nominal positions in plane taken from: # http://www.colorado.edu/geography/gcraft/notes/gps/nomconst.html # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: gps.tcl 23 2019-06-09 14:54:58Z lloydwood $ set SATS_PER_PLANE 4 set NUM_PLANES 6 # Uncertain of minimum elevation angle; set to zero. set coverage_angle 0.0 # setup orbital elements set a [expr 20200.0+$RADIUS_OF_EARTH] set e 0.0 set inc 55.0 set omega 0.0 upvar #0 NUM_COLORS NUM_COLORS if {$NUM_COLORS < 13} { # 13 satellites is maximum diversity seen in fisheye for GPS. puts stderr "\nSaVi: Coverage view of GPS constellation benefits from a large number of colors." } # GPS period is approximately 12 hours. Let's be a bit more exact... set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES + 17 ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { #B1-4 if { $j == 0 } { if { $i == 0 } { set plane_offset 339.7 } if { $i == 1 } { set plane_offset 81.9 } if { $i == 2 } { set plane_offset 115.0 } if { $i == 3 } { set plane_offset 213.9 } } # C1-4 if { $j == 1 } { if { $i == 0 } { set plane_offset 16.0 } if { $i == 1 } { set plane_offset 138.7 } if { $i == 2 } { set plane_offset 244.9 } if { $i == 3 } { set plane_offset 273.5 } } # D1-4 if { $j == 2 } { if { $i == 0 } { set plane_offset 42.1 } if { $i == 1 } { set plane_offset 70.7 } if { $i == 2 } { set plane_offset 176.8 } if { $i == 3 } { set plane_offset 299.6 } } # E1-4 if { $j == 3 } { if { $i == 0 } { set plane_offset 101.7 } if { $i == 1 } { set plane_offset 200.5 } if { $i == 2 } { set plane_offset 233.7 } if { $i == 3 } { set plane_offset 335.9 } } # F1-4 if { $j == 4 } { if { $i == 0 } { set plane_offset 142.2 } if { $i == 1 } { set plane_offset 255.6 } if { $i == 2 } { set plane_offset 5.3 } if { $i == 3 } { set plane_offset 34.5 } } # A1-4 if { $j == 5 } { if { $i == 0 } { set plane_offset 280.7 } if { $i == 1 } { set plane_offset 310.3 } if { $i == 2 } { set plane_offset 60.0 } if { $i == 3 } { set plane_offset 173.4 } } if { $plane_offset > 180 } { set plane_offset [expr $plane_offset - 360] } set T [expr $T_per * $plane_offset / 360 ] satellites LOAD $a $e $inc $Omega $omega $T "GPS ($j, $i)" } } satellites GV_END savi1.6.0/data/clarke.tcl0000644000175000017500000000426214423445060014317 0ustar lloydlloyd# # * GEOSYNCHRONOUS CONSTELLATIONS # * # * Clarke three-satellite geostationary constellation # * # * Clarke proposed three geostationary satellites spaced 120 deg at: # * 30E - Africa and Europe # * 150E - China and Oceania # * 90W - the Americas # * # * In practice, Inmarsat's BGAN (Broadband Global Area Network) comes # * closest to this - though it lacks the intersatellite links Clarke # * mentions. # * # * There is slight drift over time even in the SaVi # * model; geostationary satellites need to perform station-keeping # * against perturbation anyway, and this drift is the only motion # * visible. # * # * Arthur C. Clarke, 'Extra-Terrestrial Relays' # * pp 305-308, Wireless World, October 1945. # # https://web.archive.org/web/20090318000548/http://www.clarkefoundation.org/docs/ClarkeWirelessWorldArticle.pdf # https://web.archive.org/web/20070209201445/http://www.sciencemuseum.org.uk:80/on-line/clarke/ww1.asp # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: clarke.tcl 197 2023-04-11 03:02:04Z lloydwood $ # It's easiest to give each satellite its own RAAN, so we'll treat them # as having separate planes even though they're not actually ascending. set NUM_PLANES 3 # set location of one satellite; the others will be spaced from it # east is positive. set sat_longitude 150 # setup orbital elements # Earth-centric hack # set a [expr 35786.1+$RADIUS_OF_EARTH] # match the current stationary altitude. # see tcl/equator.tcl for working set OM $params(Omega) set cuberoot [expr 1.0/3] set a [expr { 0.0 + pow(($MU / $OM / $OM), $cuberoot) } ] set radius [format "%0.2f" $a] puts stderr "\nSaVi: stationary radius is $radius km." set e 0.0 set inc 0.0 set omega 0.0 set Omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # for illustration purposes, but also a rough guide to practical use; # although in e.g. Greenland, large dishes point almost to the horizon... set coverage_angle 5.0 satellites GV_BEGIN for {set i 0} {$i < $NUM_PLANES} {incr i} { # SaVi handles wraparound beyond +/-180 set Omega [ expr 360.0/$NUM_PLANES * $i + $sat_longitude] set T 0 satellites LOAD $a $e $inc $Omega $omega $T "Clarke-$i" } satellites GV_END savi1.6.0/data/nuonce.tcl0000644000175000017500000000212014423445060014334 0ustar lloydlloyd# # * PROPOSAL # * # * NUONCE # * # * NonUniform Optimal Network Communications Engine # * # * See: # * M. W. Lo and P. Estabrook, The NUONCE Engine for LEO Networks, # * NASA Jet Propulsion Lab, Proceedings of the Fourth International # * Satellite Mobile Conference, 1995, pp. 193-197. # * # * Martin and Polly are thanked in SaVi's README. # * # * See also: # * M. W. Lo, Satellite constellation design, Computing in Science and # * Engineering, Jan-Feb 1999, pp. 58-67. # # $Id: nuonce.tcl 69 2019-08-14 06:13:10Z lloydwood $ # setup orbital elements set a [expr 800+$RADIUS_OF_EARTH] set e 0 set inc 98.7 set omega 0.0 # Uncertain of minimum elevation angle; set to zero. set coverage_angle 0.0 set Omegas {15 30 45 90 135 150 165} set n_sats { 6 6 6 4 6 6 6} # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN set j 0 foreach Omega $Omegas { set ns [lindex $n_sats $j] for {set i 0} {$i < $ns} {incr i} { set T [expr $T_per * $i / $ns] satellites LOAD $a $e $inc $Omega $omega $T "NUONCE ($j, $i)" } incr j } satellites GV_END savi1.6.0/data/orbcomm.tcl0000644000175000017500000001313114423445060014507 0ustar lloydlloyd# # * OPERATIONAL SYSTEMS - LOW-RATE MESSAGING # * # * Orbcomm - idealised full initial system. # * # * Orbcomm does not provide real-time services. Coverage gaps are not # * considered a problem for terminals that store their messages and # * forward them to a ground station when coverage is available. # * # * Earlier satellites are in different orbits, and do not coordinate # * well with the main constellation. # * # * Filed for US Chapter 11 bankruptcy protection in 15 September 2000 # * and later re-emerged under the same ownership. # * Does not use intersatellite links; connections are only completed # * when a ground gateway station shares a footprint with a terminal. # * # * See also http://www.orbcomm.com/. # # From information supplied by Jim Franconeri # (franconeri.jim@orbcomm.com) # # fourth Pegasus launch on 4 December 1999 was into an inclined # orbit of 45 degrees, instead of the previously expected equatorial # orbit. The RAANs are currently 0/120/240/20 (December 1999) but # will be transitioning to the 0/90/180/270 you'd expect, shown here. # Relative phasing between planes is not controlled and will drift # over time; the phasing here is not optimal. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: orbcomm.tcl 69 2019-08-14 06:13:10Z lloydwood $ # for main rosette constellation only set SATS_PER_PLANE 8 set NUM_PLANES 4 # setup orbital elements # we have some earlier satellites at different altitudes and inclinations # to the main constellation rosette, so their coverage will not # coordinate well with the coverage of the main constellation; # you'll see multiple overlaps occurring, as well as varying # coverage gaps. Since Orbcomm does not provide realtime service, # coverage gaps are less important than for e.g. voice systems. # since these first launches were to different altitudes, they will # precess differently. # no orbital eccentricity set e 0.0 # altitudes set a1 7115.14 set a2 7204.14 set a3 7198.14 # inclinations set inc1 70 set inc2 108 set inc3 45 set omega 0.0 # mask elevation angle of 5 degrees set coverage_angle 5.0 satellites GV_BEGIN # first two satellites set Omega 0 set T_per [expr 2 * $PI * pow($a1,1.5) / sqrt($MU)] for {set i 0} {$i < 2} {incr i} { set T [expr ($T_per * $i / 2) ] satellites LOAD $a1 $e $inc1 $Omega $omega $T "Orbcomm-polar-$i" } # second two satellites set Omega 0 set T_per [expr 2 * $PI * pow($a2,1.5) / sqrt($MU)] for {set i 0} {$i < 2} {incr i} { set T [expr ($T_per * $i / 2) ] satellites LOAD $a2 $e $inc2 $Omega $omega $T "Orbcomm-retrograde-$i" } # three planes of eight satellites, and one of seven set T_per [expr 2 * $PI * pow($a3,1.5) / sqrt($MU)] for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [ expr $j * 360.0 / $NUM_PLANES ] if {$j == 3} { set SATS_PER_PLANE 7 ;# launched 4 Dec 1999. } for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr ($T_per * $i / $SATS_PER_PLANE) ] satellites LOAD $a3 $e $inc3 $Omega $omega $T "Orbcomm ($j, $i)" } } satellites GV_END # Here is what the idealized Orbcomm constellation would look like: # # # Sat A (km) Inc (deg) Ecc ArgP(deg) Ra(deg) M(deg) # 1 7115.14 70.00 0.00000 0.00 0.00 0.00 # 2 7115.14 70.00 0.00000 0.00 0.00 180.00 # 3 7204.14 108.00 0.00000 0.00 0.00 0.00 # 4 7204.14 108.00 0.00000 0.00 0.00 180.00 # 5 7198.14 45.00 0.00000 0.00 0.00 0.00 # 6 7198.14 45.00 0.00000 0.00 0.00 45.00 # 7 7198.14 45.00 0.00000 0.00 0.00 90.00 # 8 7198.14 45.00 0.00000 0.00 0.00 135.00 # 9 7198.14 45.00 0.00000 0.00 0.00 180.00 # 10 7198.14 45.00 0.00000 0.00 0.00 225.00 # 11 7198.14 45.00 0.00000 0.00 0.00 270.00 # 12 7198.14 45.00 0.00000 0.00 0.00 315.00 # 13 7198.14 45.00 0.00000 0.00 120.00 0.00 # 14 7198.14 45.00 0.00000 0.00 120.00 45.00 # 15 7198.14 45.00 0.00000 0.00 120.00 90.00 # 16 7198.14 45.00 0.00000 0.00 120.00 135.00 # 17 7198.14 45.00 0.00000 0.00 120.00 180.00 # 18 7198.14 45.00 0.00000 0.00 120.00 225.00 # 19 7198.14 45.00 0.00000 0.00 120.00 270.00 # 10 7198.14 45.00 0.00000 0.00 120.00 315.00 # 21 7198.14 45.00 0.00000 0.00 240.00 0.00 # 22 7198.14 45.00 0.00000 0.00 240.00 45.00 # 23 7198.14 45.00 0.00000 0.00 240.00 90.00 # 24 7198.14 45.00 0.00000 0.00 240.00 135.00 # 25 7198.14 45.00 0.00000 0.00 240.00 180.00 # 26 7198.14 45.00 0.00000 0.00 240.00 225.00 # 27 7198.14 45.00 0.00000 0.00 240.00 270.00 # 28 7198.14 45.00 0.00000 0.00 240.00 315.00 # 29 7198.14 45.00 0.00000 0.00 20.00 0.00 # 30 7198.14 45.00 0.00000 0.00 20.00 51.43 # 31 7198.14 45.00 0.00000 0.00 20.00 102.86 # 32 7198.14 45.00 0.00000 0.00 20.00 154.29 # 33 7198.14 45.00 0.00000 0.00 20.00 205.71 # 34 7198.14 45.00 0.00000 0.00 20.00 257.14 # 35 7198.14 45.00 0.00000 0.00 20.00 308.57 # # Operational constraints may change the final spacing somewhat. savi1.6.0/data/singh-24hr.tcl0000644000175000017500000000311114423445060014733 0ustar lloydlloyd# # * GEOSYNCHRONOUS CONSTELLATIONS / ELLIPTICAL # * # * Singh four-satellite system with 24-hour orbits # * # * Project forwards 24 hours then record ground tracks # * to see repeating paths from geosynchronous orbits. # * # * Singh, L.A., Whittecar, W.R., DiPrinzio, M.D. et al., # * Low cost satellite constellations for nearly continuous # * global coverage, Nature Communications, volume 11, # * article 200, January 2020. # https://www.nature.com/articles/s41467-019-13865-0 # * Orbital information is from the supplementaty information # * to this paper. # * # $Id$ set NUM_PLANES 4 # altitude for all satellites set a 42163.6 set e_list {0.020 0.010 0.021 0.018} set inc_list {75.71 73.88 77.86 78.16} set Omega_list {71.03 269.68 13.57 335.59} set omega_list {65.75 359.72 169.28 259.15} set v0_list {180.00 325.35 231.50 271.44} set coverage_angle 0.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # "The epoch for the elements as presented is November 26, # 1995 at midnight GMT" - and SaVi starts at midnight GMT. # So, no adjustment in RAAN is needed? set offset 0.0 satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr [lindex $Omega_list $j] + $offset] set e [lindex $e_list $j] set inc [lindex $inc_list $j] set omega [lindex $omega_list $j] set anom [lindex $v0_list $j] # negative, as it's time TO periapsis (or, for Earth, perigee). set T [expr $T_per * -$anom / 360.0] set number [expr $j+1] satellites LOAD $a $e $inc $Omega $omega $T "Singh-24hr-$number" } satellites GV_END savi1.6.0/data/iridium-66.tcl0000644000175000017500000000462014423445060014747 0ustar lloydlloyd# # * OPERATIONAL SYSTEMS - 1990s VOICE SYSTEMS # * # * Iridium # * # * This is the 'perfect' fully-deployed first-generation Iridium # * system, which provides voice and low-rate data services. # * Iridium was originally designed with 77 active satellites, and # * so given the name 'Iridium', for the element with periodic # * number 77 and 77 orbiting electrons. # * # * The Iridium constellation was later redesigned to reduce the # * number of active satellites needed to 66 - but the name was # * not changed to that of element 66: 'Dysprosium', which is Latin # * for 'bad approach'. # * # * Designed for voice telephony and low-rate data. In the decade while # * Iridium was being designed and built for Motorola, GSM terrestrial # * mobile cellular telephony became widespread, removing the intended # * 'business traveller' market and leading to a focus on specialist # * industries in remote areas. # * # * Full constellation launched as of May 1998. Service offered # * as of end of 1998. Filed for US Chapter 11 bankruptcy protection # * August 1999, and later re-emerged as Iridium Satellite. # * # * A Walker polar star geometry. Note the 'orbital seam' where # * the footprints of ascending (going north over the Equator) and # * descending (going (south) satellites overlap more to ensure # * continuous coverage. # * # * A replacement Iridium NEXT constellation has been launched, # * with satellites built by Thales Alenia Space in France, # * using a similar geometry. NEXT was completely deployed by # * Jamuary 2019. # * # * See http://www.iridium.com/ # * # * Uses intersatellite links, which are not yet simulated here. # $Id: iridium-66.tcl 106 2019-09-22 10:40:19Z lloydwood $ set SATS_PER_PLANE 11 set NUM_PLANES 6 set INTERPLANE_SPACING 31.6 # setup orbital elements set a [expr 780.0+$RADIUS_OF_EARTH] set e 0.0 set inc 86.4 set omega 0.0 set coverage_angle 8.2 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * $INTERPLANE_SPACING] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { if { $j % 2 == 0} { set plane_offset 0 } else { set plane_offset [expr $T_per / $SATS_PER_PLANE / 2.0] } set T [expr $T_per * $i / $SATS_PER_PLANE + $plane_offset] set n [satellites LOAD $a $e $inc $Omega $omega $T "Iridium ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/geo.tle0000644000175000017500000016031414423445060013633 0ustar lloydlloydLES 9 1 08747U 76023B 09006.26707867 -.00000061 00000-0 10000-3 0 2032 2 08747 10.7594 153.0585 0022401 318.0834 347.9083 1.00268499 65797 MARISAT 2 1 09478U 76101A 09004.56881517 -.00000045 00000-0 10000-3 0 981 2 09478 13.2130 356.9367 0100921 196.9014 162.7855 0.97590151 61291 GOES 3 1 10953U 78062A 09003.99759380 -.00000122 00000-0 10000-3 0 3559 2 10953 14.3027 1.4071 0003139 285.3533 74.6347 1.00272917 65028 ESIAFI 1 (COMSTAR 4) 1 12309U 81018A 09003.52070881 -.00000148 00000-0 10000-3 0 1862 2 12309 13.7976 11.5376 0007339 262.2274 97.7150 1.00271466103549 SATCOM C5 1 13631U 82105A 09006.08992478 -.00000094 00000-0 10000-3 0 5761 2 13631 12.2608 33.0428 0008667 238.5797 121.3528 1.00273147 62491 TDRS 1 1 13969U 83026B 09005.31918943 -.00000286 00000-0 10000-3 0 7853 2 13969 13.2133 10.5088 0025823 234.5258 286.1103 1.00272740 67360 GSTAR 1 1 15677U 85035A 09005.14724573 -.00000081 00000-0 10000-3 0 944 2 15677 10.3252 52.6466 0009037 241.2626 118.6413 1.00272511 61349 INTELSAT 511 1 15873U 85055A 09005.29448844 .00000082 00000-0 10000-3 0 3396 2 15873 11.7005 40.7668 0015609 265.2284 94.6048 1.00111635 60758 GOES 7 1 17561U 87022A 09006.48759076 .00000068 00000-0 10000-3 0 7682 2 17561 11.8088 38.8507 0002578 174.2377 252.1929 1.00282045 63294 GSTAR 3 1 19483U 88081A 09005.06437342 -.00000094 00000-0 10000-3 0 1656 2 19483 14.1068 22.5023 0005491 305.7079 54.2664 1.00272636 70721 TDRS 3 1 19548U 88091B 09006.12207664 -.00000182 00000-0 10000-3 0 1792 2 19548 11.5254 41.5267 0022032 299.2495 253.8963 1.00274072 61513 ASTRA 1A 1 19688U 88109B 09004.74731059 .00000018 00000-0 10000-3 0 5211 2 19688 7.2139 66.2884 0015000 289.0305 70.7860 0.98335891 53443 TDRS 4 1 19883U 89021B 09007.20343646 -.00000273 00000-0 10000-3 0 4962 2 19883 10.1450 53.6484 0004027 235.1776 205.2753 1.00264932245109 INTELSAT 602 (IS-602) 1 20315U 89087A 09006.60916605 .00000048 00000-0 10000-3 0 8198 2 20315 6.5098 68.1925 0001552 220.0374 215.2081 1.00272076 68102 LEASAT 5 1 20410U 90002B 09004.92640209 -.00000296 00000-0 10000-3 0 468 2 20410 8.0254 36.2360 0000782 67.2171 74.7331 1.00270710 54809 INTELSAT 603 (IS-603) 1 20523U 90021A 09004.10984081 -.00000137 00000-0 10000-3 0 3976 2 20523 5.9789 69.8107 0001337 226.0928 187.5215 1.00271303 61830 ASIASAT 1 1 20558U 90030A 09004.66487362 .00000053 00000-0 10000-3 0 6457 2 20558 8.6605 62.2726 0006390 201.6196 158.3208 0.99239918 68455 INSAT-1D 1 20643U 90051A 09004.68019209 -.00000020 00000-0 10000-3 0 996 2 20643 9.4205 58.2211 0011800 37.2827 322.7829 1.00277149 54851 COSMOS 2085 1 20693U 90061A 09004.59203532 -.00000133 00000-0 10000-3 0 8933 2 20693 11.8437 37.3143 0005065 246.0395 113.9200 1.00275556 67608 SKYNET 4C 1 20776U 90079A 08357.91100881 .00000037 00000-0 10000-3 0 8665 2 20776 9.4756 49.0772 0003480 210.5155 166.1492 1.00273426 66925 EUTELSAT 2-F1 1 20777U 90079B 09007.04922963 -.00000187 00000-0 10000-3 0 8360 2 20777 8.8623 61.2994 0005957 162.5612 197.4159 0.99346014 47487 SBS-6 1 20872U 90091A 09006.46197714 -.00000207 00000-0 10000-3 0 09 2 20872 1.3824 81.2737 0001267 205.6503 264.6632 1.00271303 55178 GALAXY 6 1 20873U 90091B 09004.25691686 .00000106 00000-0 10000-3 0 2247 2 20873 5.7692 70.6670 0001951 154.6642 205.2511 0.99757578 61214 INMARSAT 2-F1 1 20918U 90093A 09005.15011336 .00000126 00000-0 10000-3 0 2104 2 20918 6.2344 56.5912 0003360 219.1577 101.1937 1.00274817 63037 GSTAR 4 1 20946U 90100B 09004.62787355 -.00000074 00000-0 10000-3 0 2334 2 20946 5.9604 70.4990 0007033 175.3584 184.5529 0.99140757 61117 COSMOS 2133 1 21111U 91010A 09004.63410871 -.00000045 00000-0 10000-3 0 995 2 21111 10.9375 43.4966 0003276 285.8497 74.1258 1.00280492 65549 INMARSAT 2-F2 1 21149U 91018A 09006.42909295 -.00000122 00000-0 10000-3 0 3298 2 21149 5.5529 56.7433 0003985 215.0614 250.7655 1.00270708 65340 TDRS 5 1 21639U 91054B 09006.21992410 .00000118 00000-0 10000-3 0 3744 2 21639 9.4855 57.5198 0005096 269.7325 50.1256 1.00273430 63832 INTELSAT 605 (IS-605) 1 21653U 91055A 09006.51106384 .00000025 00000-0 10000-3 0 7247 2 21653 4.0258 74.5414 0001058 195.6687 193.9622 1.00272951 63692 ANIK E1 1 21726U 91067A 09006.17597209 .00000013 00000-0 10000-3 0 984 2 21726 5.3586 72.6744 0008971 183.5427 176.3059 0.99167175 54096 INTELSAT 601 (IS-601) 1 21765U 91075A 09004.73922006 .00000145 00000-0 10000-3 0 7021 2 21765 4.0761 74.3853 0001538 100.9551 242.7595 1.00273742 62771 EUTELSAT 2-F3 1 21803U 91083A 09006.56014836 .00000043 00000-0 10000-3 0 6441 2 21803 8.0265 64.4244 0005010 205.9944 290.9498 0.99293429 58405 GALAXY 5 1 21906U 92013A 09006.47853584 -.00000255 00000-0 10000-3 0 8538 2 21906 3.8257 75.5786 0013541 263.9531 95.6581 0.99292443 53156 INMARSAT 2-F4 1 21940U 92021B 09004.79319295 -.00000332 00000-0 10000-3 0 408 2 21940 4.1887 50.3055 0002132 224.3445 224.4717 1.00272279 61213 EUTELSAT 2-F4 1 22028U 92041B 09001.48332003 -.00000264 00000-0 10000-3 0 1161 2 22028 7.2069 67.7330 0006011 129.8364 230.1739 0.99081850 53066 SATCOM C3 1 22117U 92060B 09006.46251516 -.00000218 00000-0 10000-3 0 509 2 22117 3.9805 74.5268 0002116 238.9362 240.1367 1.00272803 59757 HELLAS SAT 1 (DFS 3) 1 22175U 92066A 09004.42415255 -.00000101 00000-0 10000-3 0 3217 2 22175 6.5052 68.5086 0004925 215.1332 144.7574 0.99737905 57044 GORIZONT 27 1 22245U 92082A 09004.34834917 .00000026 00000-0 10000-3 0 4085 2 22245 10.9277 46.5986 0016889 216.0706 143.8293 1.00218241 63306 SUPERBIRD A1 1 22253U 92084A 09002.66452326 .00000030 00000-0 10000-3 0 7841 2 22253 2.6119 67.0167 0008839 340.9419 18.7048 0.99115652 58638 COSMOS 2224 1 22269U 92088A 08360.87727299 -.00000018 00000-0 10000-3 0 5334 2 22269 10.0428 49.4287 0003713 156.7859 203.1771 1.00251263 58179 TDRS 6 1 22314U 93003B 09006.23151012 .00000108 00000-0 10000-3 0 4085 2 22314 8.8277 60.6395 0000583 223.6765 93.8534 1.00280336 58550 ASTRA 1C 1 22653U 93031A 09004.22022303 .00000034 00000-0 10000-3 0 3570 2 22653 2.1700 80.0200 0003714 205.8754 259.3532 1.00274089 52418 INSAT-2B 1 22724U 93048B 09006.07290158 -.00000239 00000-0 10000-3 0 1663 2 22724 7.5297 65.5458 0011138 46.0479 313.9762 0.99968292 56899 ACTS 1 22796U 93058B 09005.16848722 -.00000074 00000-0 10000-3 0 6019 2 22796 9.0467 59.7624 0001737 223.5892 136.3705 1.00272157 63016 INTELSAT 701 (IS-701) 1 22871U 93066A 09005.22673727 .00000075 00000-0 10000-3 0 3062 2 22871 0.0135 39.2082 0002815 267.7044 59.6603 1.00273096 55570 GORIZONT 28 1 22880U 93069A 09006.65578867 -.00000322 00000-0 10000-3 0 616 2 22880 10.4407 49.9412 0004163 263.3223 135.0075 1.00214783 55650 GORIZONT 29 1 22907U 93072A 09006.27365434 .00000132 00000-0 10000-3 0 6199 2 22907 10.4182 50.0478 0015193 199.7950 160.1382 1.00140118 55402 SOLIDARIDAD 1 1 22911U 93073A 09006.17274809 -.00000095 00000-0 10000-3 0 1351 2 22911 7.5115 65.5362 0004135 153.9694 205.9821 1.00277763 54035 METEOSAT-6 (MOP-3) 1 22912U 93073B 09004.94986976 -.00000004 00000-0 10000-3 0 8672 2 22912 7.9860 61.8110 0002311 245.4570 206.8585 1.00275159 53832 NATO 4B 1 22921U 93076A 09005.75998643 .00000163 00000-0 10000-3 0 1149 2 22921 7.4116 54.1099 0003439 231.4262 128.5018 1.00269982 55264 DIRECTV 1 (DBS 1) 1 22930U 93078A 09006.53186155 -.00000154 00000-0 00000+0 0 5505 2 22930 0.1617 87.8689 0003182 199.3900 279.2991 1.00271286 62996 THAICOM 1 1 22931U 93078B 09006.19821558 -.00000342 00000-0 10000-3 0 2906 2 22931 0.1373 57.3447 0001988 210.1444 29.7543 1.00267095 54699 GOES 8 1 23051U 94022A 09004.76673936 .00000086 00000-0 10000-3 0 6296 2 23051 5.3357 75.9774 0009560 174.9235 184.9549 0.98903433 61103 INTELSAT 702 (IS-702) 1 23124U 94034A 09003.82420066 .00000108 00000-0 10000-3 0 1379 2 23124 0.0057 347.0908 0002159 272.6252 195.4342 1.00273720 67474 INTELSAT 2 (IS-2) 1 23175U 94040A 09006.67553069 -.00000011 00000-0 10000-3 0 3420 2 23175 0.0574 106.1593 0003659 211.2751 201.1321 1.00271256 52419 BS-3N 1 23176U 94040B 09004.92404247 -.00000328 00000-0 10000-3 0 9742 2 23176 0.0276 305.0752 0002727 70.7946 171.3114 1.00271125 52890 APSTAR 1 1 23185U 94043A 09006.31772969 -.00000250 00000-0 10000-3 0 902 2 23185 4.0185 74.6471 0000912 199.8089 87.9270 1.00268992 52955 DIRECTV 2 (DBS 2) 1 23192U 94047A 09005.18041450 -.00000071 00000-0 10000-3 0 3928 2 23192 1.9731 79.6813 0017042 186.4693 195.5601 0.98632919 62827 BRASILSAT B1 1 23199U 94049A 09005.33245228 -.00000249 00000-0 10000-3 0 2086 2 23199 1.7510 80.7116 0001640 208.1429 227.8065 1.00266209 63645 OPTUS B3 1 23227U 94055A 09006.45405740 -.00000055 00000-0 10000-3 0 2766 2 23227 1.0420 81.7642 0005065 196.7084 155.1413 1.00272508 52578 NSS-703 1 23305U 94064A 09005.01603071 .00000094 00000-0 10000-3 0 8714 2 23305 0.0405 223.4283 0003100 38.1547 265.9441 1.00273518 52296 SOLIDARIDAD 2 1 23313U 94065A 09006.53310233 -.00000006 00000-0 10000-3 0 2614 2 23313 0.8291 82.3866 0002237 202.2296 258.6352 1.00272671 52176 THAICOM 2 1 23314U 94065B 09004.94367419 -.00000099 00000-0 10000-3 0 1763 2 23314 0.0976 46.0210 0006435 223.8847 252.9709 1.00270832 52130 EXPRESS 1 1 23319U 94067A 09004.59470602 -.00000251 00000-0 10000-3 0 6428 2 23319 7.7078 64.8719 0003021 157.3324 202.6326 0.99822555 51984 ASTRA 1D 1 23331U 94070A 09006.00000000 .00000174 00000-0 00000+0 0 8582 2 23331 1.2453 79.6761 0006503 209.6032 207.7604 1.00277511 52413 RADUGA 32 1 23448U 94087A 09004.66424602 -.00000039 00000-0 10000-3 0 990 2 23448 9.8639 54.2174 0005480 152.1687 207.8525 1.00278070 69041 INTELSAT 704 (IS-704) 1 23461U 95001A 09004.90965042 .00000021 00000-0 10000-3 0 8670 2 23461 0.0483 245.5049 0004488 33.1390 219.4626 1.00271570 51262 INTELSAT 705 (IS-705) 1 23528U 95013A 09007.14905964 -.00000265 00000-0 10000-3 0 8078 2 23528 0.0231 89.5287 0004752 178.0102 202.9907 1.00271086 50463 BRASILSAT B2 1 23536U 95016A 09005.13912566 -.00000147 00000-0 00000-0 0 9507 2 23536 0.9250 84.9846 0002162 189.9230 148.0353 1.00271800 50513 AMSC 1 1 23553U 95019A 09005.20111563 -.00000094 00000-0 10000-3 0 769 2 23553 4.1051 74.5370 0002440 217.8314 143.6486 1.00271676 50325 INTELSAT 706 (IS-706) 1 23571U 95023A 09004.93318509 .00000136 00000-0 10000-3 0 8531 2 23571 0.0102 20.3495 0002834 247.6782 222.8394 1.00274071 49936 DIRECTV 3 (DBS 3) 1 23598U 95029A 09006.09236692 -.00000199 00000-0 10000-3 0 9875 2 23598 0.0120 2.9273 0002390 301.0689 113.0502 1.00270898 49679 TDRS 7 1 23613U 95035B 09005.26433566 .00000135 00000-0 10000-3 0 4400 2 23613 10.6861 49.9825 0003601 212.1644 147.1867 1.00272937 49352 INTELSAT 4 (IS-4) 1 23636U 95040A 09004.86083450 -.00000035 00000-0 10000-3 0 9044 2 23636 0.0235 256.9380 0003213 20.6429 208.9089 1.00271908 49138 COSMOS 2319 1 23653U 95045A 09006.35108450 .00000077 00000-0 10000-3 0 9654 2 23653 9.4826 56.4880 0002874 93.7238 266.2819 1.00246811 48902 TELSTAR 4 (TELSTAR 402R) 1 23670U 95049A 09006.16076897 -.00000152 00000-0 10000-3 0 8783 2 23670 4.9441 72.0448 0007040 193.3462 166.4803 1.00255039 48663 LUCH 1 1 23680U 95054A 09004.67976072 -.00000087 00000-0 10000-3 0 7122 2 23680 8.5790 65.5247 0005351 287.9749 71.9300 1.00277279 48501 ASTRA 1E 1 23686U 95055A 09006.00000000 .00000158 00000-0 00000+0 0 9649 2 23686 0.0480 145.5360 0002382 121.5360 222.1320 1.00274818 48483 ASIASAT 2 1 23723U 95064A 09006.15622450 -.00000286 00000-0 10000-3 0 8340 2 23723 0.0064 326.3245 0001732 305.1452 351.0873 1.00267453 48015 TELECOM 2C 1 23730U 95067A 09005.76122266 .00000036 00000-0 10000-3 0 464 2 23730 4.7669 72.9284 0004572 202.8086 106.8036 1.00272716 48030 ECHOSTAR 1 1 23754U 95073A 09006.48549860 .00000149 00000-0 10000-3 0 252 2 23754 0.0099 295.1102 0002467 334.0349 223.7688 1.00275059 47563 INTELSAT 3R (IS-3R) 1 23764U 96002A 09005.94078664 -.00000247 00000-0 00000+0 0 5918 2 23764 0.0309 89.3482 0001921 195.9690 116.0104 1.00271408 47560 AFRICASAT-1 (MEASAT-1) 1 23765U 96002B 09003.86245704 .00000155 00000-0 10000-3 0 7665 2 23765 1.1999 81.3441 0000435 22.0996 356.6394 1.00274837 47521 KOREASAT 2 1 23768U 96003A 09004.79288280 -.00000341 00000-0 10000-3 0 6845 2 23768 1.9507 79.5194 0002925 277.1237 149.7947 1.00269082 47518 HGS-3 1 23779U 96006A 09003.80516480 .00000176 00000-0 10000-3 0 1274 2 23779 0.0340 149.6664 0002062 115.6395 166.1551 1.00275900 47283 INTELSAT 707 (IS-707) 1 23816U 96015A 09007.21092360 -.00000267 00000-0 10000-3 0 7987 2 23816 0.0048 354.5321 0002908 290.0584 205.2523 1.00270041 46963 INMARSAT 3-F1 1 23839U 96020A 09004.90836325 .00000034 00000-0 10000-3 0 5404 2 23839 0.1060 32.3061 0005849 246.8186 217.0278 1.00269989 46731 ASTRA 1F 1 23842U 96021A 09006.00000000 .00000141 00000-0 00000+0 0 9571 2 23842 0.0220 256.8150 0004356 64.8360 163.2300 1.00273366 46651 MSAT M1 1 23846U 96022A 09005.61028740 -.00000059 00000-0 10000-3 0 3852 2 23846 1.4532 80.3266 0005839 202.4920 295.7006 1.00271828 46568 PALAPA C2 1 23864U 96030A 09004.94790532 -.00000336 00000-0 10000-3 0 8034 2 23864 0.0442 94.5215 0001703 172.3400 292.1042 1.00269892 46286 AMOS 1 1 23865U 96030B 09006.15229631 .00000005 00000-0 10000-3 0 176 2 23865 0.4673 85.9087 0004684 174.9837 258.3222 1.00270736 46295 GALAXY 9 (G-9) 1 23877U 96033A 09005.14043047 -.00000203 00000-0 10000-3 0 165 2 23877 0.3664 80.7310 0000940 212.2237 141.4894 1.00271458 46233 GORIZONT 32 1 23880U 96034A 09007.07215536 -.00000109 00000-0 10000-3 0 1108 2 23880 9.0558 58.3776 0003089 218.4798 201.4745 1.00277009 46228 INTELSAT 709 (IS-709) 1 23915U 96035A 09004.75149700 -.00000162 00000-0 10000-3 0 8677 2 23915 0.0331 65.5729 0002360 216.5985 177.9855 1.00270540 46023 APSTAR 1A 1 23943U 96039A 09006.53764002 -.00000320 00000-0 10000-3 0 9282 2 23943 3.3221 76.1234 0001503 188.7755 164.8883 1.00273941 45843 TURKSAT 1C 1 23949U 96040B 09004.94375990 .00000176 00000-0 10000-3 0 9364 2 23949 0.7556 80.2401 0003954 204.2060 190.9584 1.00270376 45766 TELECOM 2D 1 24209U 96044B 09005.79999032 -.00000046 00000-0 10000-3 0 8301 2 24209 2.4931 77.8842 0005961 198.1714 109.5657 1.00272095 45587 INMARSAT 3-F2 1 24307U 96053A 09006.76618063 -.00000104 00000-0 10000-3 0 6392 2 24307 0.0697 320.2607 0005656 322.0590 84.4648 1.00271461 45176 ECHOSTAR 2 1 24313U 96055A 09006.53806071 .00000030 00000-0 10000-3 0 9091 2 24313 0.4700 82.0633 0004010 193.4888 262.1147 1.00342700 45193 AMC-1 (GE-1) 1 24315U 96054A 09006.22806910 -.00000081 00000-0 10000-3 0 638 2 24315 0.0406 235.2595 0003388 44.8068 164.9739 1.00272217 45156 ARABSAT-2B 1 24652U 96063A 09004.97213094 .00000176 00000-0 10000-3 0 9203 2 24652 0.0484 128.0244 0002333 159.0545 198.1137 1.00277658 44978 MEASAT-2 1 24653U 96063B 09006.59983492 -.00000200 00000-0 10000-3 0 8714 2 24653 1.1707 81.5776 0000826 236.2008 152.4410 1.00270688 44556 EUROBIRD 9 1 24665U 96067A 09004.10679407 .00000086 00000-0 00000+0 0 7865 2 24665 0.0751 91.1363 0009296 210.8893 209.3153 1.00276020 44782 INMARSAT 3-F3 1 24674U 96070A 09006.23014267 .00000060 00000-0 10000-3 0 6060 2 24674 0.0836 14.3285 0005781 271.0809 81.4451 1.00272587 44129 AMC-2 (GE-2) 1 24713U 97002A 09005.20111531 -.00000092 00000-0 00000-0 0 8411 2 24713 0.0265 80.0549 0002814 184.3064 171.9633 1.00271660 43717 NAHUEL 1A 1 24714U 97002B 09005.14514858 -.00000238 00000-0 10000-3 0 8195 2 24714 1.3523 81.0938 0004485 194.3109 169.9355 1.00270400 43718 JCSAT 4 1 24732U 97007A 09004.64943755 -.00000178 00000-0 10000-3 0 5860 2 24732 0.0085 326.1193 0001867 308.4156 213.6462 1.00270739 43434 INTELSAT 801 (IS-801) 1 24742U 97009A 09004.71672450 -.00000201 00000-0 10000-3 0 5645 2 24742 0.3243 87.7938 0004826 215.3132 27.8569 1.00271025 43431 DIRECTV 6 (TEMPO 2) 1 24748U 97011A 09005.06733542 -.00000179 00000-0 10000-3 0 9955 2 24748 2.7841 77.5983 0033890 153.6827 206.1821 0.99032478 43327 BSAT-1A 1 24769U 97016B 09006.64308194 -.00000330 00000-0 10000-3 0 8294 2 24769 0.0405 260.6007 0001579 67.3585 119.5234 1.00269302 42987 GOES 10 1 24786U 97019A 09005.24698418 -.00000264 00000-0 10000-3 0 7163 2 24786 3.2242 76.6823 0004626 227.7731 189.4697 1.00260728 42872 DFH 3-2 1 24798U 97021A 09004.73979117 .00000031 00000-0 10000-3 0 6542 2 24798 4.6666 73.0076 0006595 288.3966 71.3903 1.00372113 42692 THOR II 1 24808U 97025A 09004.62702998 .00000057 00000-0 10000-3 0 5533 2 24808 0.7028 83.6363 0001597 200.1661 51.3901 1.00274378 42601 GALAXY 25 (G-25) 1 24812U 97026A 09006.52412747 -.00000143 00000-0 10000-3 0 8653 2 24812 0.0158 75.5427 0003203 206.0730 280.1988 1.00272422 42584 INMARSAT 3-F4 1 24819U 97027A 09006.03427035 -.00000237 00000-0 10000-3 0 3731 2 24819 0.1070 40.4373 0004445 250.6646 132.3343 1.00838006 42541 FENGYUN 2A 1 24834U 97029A 09004.66873624 -.00000035 00000-0 10000-3 0 3259 2 24834 7.9788 64.4755 0095509 67.7811 293.1848 0.96050498 42193 INTELSAT 802 (IS-802) 1 24846U 97031A 09004.97684539 .00000178 00000-0 00000+0 0 7463 2 24846 0.0154 351.2232 0002590 291.6362 206.4249 1.00272859 42286 SUPERBIRD C 1 24880U 97036A 09006.53490360 -.00000231 00000-0 10000-3 0 5269 2 24880 0.0063 290.1813 0001593 356.1256 156.4506 1.00272025 41868 AGILA 2 1 24901U 97042A 09006.37882457 -.00000215 00000-0 10000-3 0 7943 2 24901 0.0501 343.7451 0004884 296.9758 107.6995 1.00269719 41693 INTELSAT 5 (IS-5) 1 24916U 97046A 09006.59140742 .00000057 00000-0 10000-3 0 6976 2 24916 0.0372 225.1456 0003244 56.6830 204.5412 1.00755187 41751 EUROBIRD 4 1 24931U 97049A 09004.71413892 .00000049 00000-0 10000-3 0 8914 2 24931 0.1418 88.3204 0001867 176.4595 100.6881 1.00273654 41613 METEOSAT-7 1 24932U 97049B 09004.86771828 .00000087 00000-0 10000-3 0 4960 2 24932 4.7950 71.5965 0000407 227.4961 175.1209 1.00272789 41558 AMC-3 (GE-3) 1 24936U 97050A 09006.46894773 -.00000176 00000-0 10000-3 0 6589 2 24936 0.0491 234.4552 0002304 41.2051 272.3348 1.00271160 41560 NSS-5 1 24957U 97053A 09004.67410715 .00000095 00000-0 10000-3 0 6989 2 24957 0.0118 37.7705 0001966 237.6708 254.6665 1.00274719 41340 ECHOSTAR 3 1 25004U 97059A 09007.12160873 -.00000264 00000-0 00000+0 0 6017 2 25004 0.0183 338.1081 0001009 309.7064 161.2989 1.00269776 41276 TELSTAR 10 (APSTAR 2R) 1 25010U 97062A 09006.66979999 -.00000082 00000-0 10000-3 0 6465 2 25010 0.0365 227.8140 0003463 52.8493 143.3458 1.00272336 41125 ASTRA 5A (SIRIUS 2) 1 25049U 97071A 09004.94375963 .00000177 00000-0 10000-3 0 6001 2 25049 0.0322 102.9521 0003832 182.6626 190.3035 1.00273346 40850 INDOSTAR 1 1 25050U 97071B 09006.57006428 -.00000326 00000-0 10000-3 0 9663 2 25050 3.2861 76.1838 0004042 218.8719 124.0487 1.00271037 40879 ASTRA 1G 1 25071U 97076A 09006.00000000 .00000141 00000-0 00000+0 0 7835 2 25071 0.0350 92.8080 0002174 273.7820 118.2970 1.00272627 40688 GALAXY 8 1 25086U 97078A 09004.81714246 .00000117 00000-0 10000-3 0 7337 2 25086 5.8132 70.4713 0010235 212.0795 147.7523 0.99699783 40475 HGS-1 (ASIASAT 3) 1 25126U 97086A 08360.20914987 -.00000219 00000-0 10000-3 0 2140 2 25126 1.4246 135.6598 0049455 177.8255 181.4690 1.00266160 41145 BRASILSAT B3 1 25152U 98006A 09006.43179524 -.00000229 00000-0 10000-3 0 9019 2 25152 0.0401 204.2278 0004222 64.3820 277.9520 1.00268893 40081 INMARSAT 3-F5 1 25153U 98006B 09004.76916808 .00000164 00000-0 00000+0 0 3654 2 25153 0.4609 357.9100 0004530 284.4256 124.0582 1.00275212 40034 ATLANTIC BIRD 4 1 25237U 98013A 09005.78834934 -.00000038 00000-0 10000-3 0 8995 2 25237 0.0389 28.7877 0007068 266.9918 86.3259 1.00271176 40082 NSS-806 1 25239U 98014A 09004.71030350 -.00000239 00000-0 10000-3 0 3695 2 25239 0.0151 20.4176 0003052 278.3628 20.8504 1.00269862 39821 NILESAT 101 1 25311U 98024A 09005.76756719 -.00000036 00000-0 10000-3 0 6752 2 25311 0.0325 128.5252 0003125 170.1095 76.1763 1.00272618 39440 COSMOS 2350 1 25315U 98025A 09004.68482709 -.00000052 00000-0 10000-3 0 3038 2 25315 6.9826 64.1922 0003407 310.8488 49.0647 1.00258703 39153 ECHOSTAR 4 1 25331U 98028A 09005.22185363 -.00000221 00000-0 10000-3 0 9074 2 25331 0.7953 34.7862 0004206 247.9688 184.9201 1.00270709 39188 CHINASTAR 1 1 25354U 98033A 09006.70253646 -.00000189 00000-0 10000-3 0 4011 2 25354 0.0457 242.5503 0002537 44.2162 160.2294 1.00272335 43413 THOR III 1 25358U 98035A 09006.11446564 .00000011 00000-0 10000-3 0 4029 2 25358 0.0489 180.0982 0001405 103.2923 222.7965 1.00273290 38833 INTELSAT 805 (IS-805) 1 25371U 98037A 09004.36635718 -.00000263 00000-0 10000-3 0 3032 2 25371 0.0054 86.0231 0002337 200.0107 254.4005 1.00268001 38665 SINOSAT 1 (XINNUO 1) 1 25404U 98044A 09006.63024983 -.00000333 00000-0 10000-3 0 9567 2 25404 0.0633 65.2530 0004105 246.9832 131.4486 1.00268594 38546 ST-1 1 25460U 98049A 09004.93531801 -.00000189 00000-0 10000-3 0 5685 2 25460 0.0064 357.0336 0003663 285.9158 246.4318 1.00271063 37987 ASTRA 2A 1 25462U 98050A 09006.00000000 .00000171 00000-0 00000+0 0 423 2 25462 0.0430 132.2240 0001147 69.2660 292.4360 1.00276622 37983 INTELSAT 7 (IS-7) 1 25473U 98052A 09004.89924488 -.00000004 00000-0 10000-3 0 7087 2 25473 0.0171 86.4045 0003186 200.6298 209.9817 1.00272797 37757 EUTELSAT W2 1 25491U 98056A 09006.82904341 .00000123 00000-0 10000-3 0 6194 2 25491 0.0478 2.5160 0003953 261.3253 157.1526 1.00273702 37603 SIRIUS 3 1 25492U 98056B 09004.61612844 .00000057 00000-0 10000-3 0 4345 2 25492 0.1116 114.1312 0001117 159.5950 57.3796 1.00273844 37635 EUROBIRD 2 1 25495U 98057A 09004.00495925 .00000166 00000-0 10000-3 0 6096 2 25495 0.0634 353.8315 0004827 277.7717 219.4477 1.00274193 37547 AFRISTAR 1 25515U 98063A 09004.85515157 .00000151 00000-0 10000-3 0 4541 2 25515 0.0259 351.3406 0003402 285.3345 156.7584 1.00274659 37333 AMC-5 (GE-5) 1 25516U 98063B 09006.46224625 -.00000214 00000-0 10000-3 0 3964 2 25516 0.0234 75.7006 0002626 199.0602 278.8614 1.00270570 37387 INTELSAT 8 (IS-8) 1 25522U 98065A 09006.31113344 -.00000036 00000-0 10000-3 0 5854 2 25522 0.0266 277.3220 0002758 4.0203 102.6806 1.00272208 37348 BONUM 1 1 25546U 98068A 09006.99923106 .00000097 00000-0 10000-3 0 1832 2 25546 0.0426 240.8639 0002122 25.5992 255.8976 1.00274449 37178 SAT MEX 5 1 25558U 98070A 09006.53853097 .00000007 00000-0 10000-3 0 4204 2 25558 0.0195 53.1497 0002335 240.2557 249.9022 1.00271803 37166 GALAXY 26 (G-26) 1 25626U 99005A 09005.31309479 -.00000140 00000-0 00000-0 0 4197 2 25626 0.0075 2.4238 0002661 288.3206 194.0065 1.00271585 36247 JCSAT 6 1 25630U 99006A 09003.92059618 -.00000333 00000-0 10000-3 0 4597 2 25630 0.0352 221.6740 0000816 62.5967 274.8215 1.00270170 36095 BADR-3 (ARABSAT-3A) 1 25638U 99009A 09005.77124368 .00000174 00000-0 10000-3 0 5579 2 25638 0.2864 87.7468 0003118 160.5183 165.1511 1.00269233 36187 SKYNET 4E 1 25639U 99009B 09004.99529267 .00000169 00000-0 10000-3 0 5080 2 25639 5.0562 52.7522 0002823 203.6254 242.1894 1.00277959 36149 ASIASAT 3S 1 25657U 99013A 09006.72989652 -.00000314 00000-0 10000-3 0 2244 2 25657 0.0197 200.6325 0001804 99.3347 174.7191 1.00269020 35941 INSAT-2E (APR-1) 1 25666U 99016A 09004.88534418 -.00000142 00000-0 10000-3 0 1943 2 25666 0.0994 84.0172 0004211 199.3631 222.9526 1.00269760 35862 EUTELSAT W6 1 25673U 99018A 09004.88227816 .00000153 00000-0 10000-3 0 7132 2 25673 0.0737 10.1084 0003946 266.9480 166.7689 1.00274298 35692 NIMIQ 1 1 25740U 99027A 09007.05437822 -.00000155 00000-0 00000+0 0 6147 2 25740 0.0209 74.3989 0002168 231.4194 89.2555 1.00271859 35333 ASTRA 1H 1 25785U 99033A 09006.00000000 .00000142 00000-0 00000+0 0 7541 2 25785 0.0610 161.6981 0002294 200.6287 122.6858 1.00277555 35046 TELKOM 1 1 25880U 99042A 09006.56698405 -.00000325 00000-0 10000-3 0 6537 2 25880 0.0052 2.4455 0002502 302.6195 113.3222 1.00272361 34516 KOREASAT 3 1 25894U 99046A 09006.22848713 -.00000341 00000-0 10000-3 0 2532 2 25894 0.0077 358.0745 0001712 213.6920 92.5610 1.00267958 33276 YAMAL 102 1 25897U 99047B 09006.32925063 -.00000211 00000-0 10000-3 0 726 2 25897 5.0219 72.2590 0004448 213.3959 28.5772 1.00269465 34277 ECHOSTAR 5 1 25913U 99050A 09006.59546030 .00000077 00000-0 10000-3 0 6614 2 25913 0.0065 19.4941 0002534 278.1383 254.1647 1.00273526 34021 GALAXY 27 (G-27) 1 25922U 99052A 09006.59546005 .00000078 00000-0 10000-3 0 4437 2 25922 0.0294 55.6837 0002719 244.0848 251.9297 1.00273822 34007 ABS 1 (LMI 1) 1 25924U 99053A 09006.61480524 -.00000067 00000-0 10000-3 0 1308 2 25924 0.0060 262.2166 0001825 21.4050 119.0141 1.00272214 34039 DIRECTV 1R 1 25937U 99056A 09007.15056046 -.00000240 00000-0 00000+0 0 5978 2 25937 0.0202 249.8427 0001973 40.1672 158.5284 1.00270092 33895 TELSTAR 12 (ORION 2) 1 25949U 99059A 09005.13243733 -.00000097 00000-0 10000-3 0 6203 2 25949 0.0223 25.8522 0003429 261.6815 209.9817 1.00271359 33740 AMC-4 (GE-4) 1 25954U 99060A 09005.20111503 -.00000092 00000-0 00000-0 0 6142 2 25954 0.0359 249.9553 0000828 36.6272 149.7648 1.00272933 33591 GALAXY 11 (G-11) 1 26038U 99071A 09004.77030181 .00000178 00000-0 10000-3 0 6497 2 26038 0.0315 160.3672 0001173 347.5555 266.7176 1.00274567 33217 ZHONGXING-22 1 26058U 00003A 09005.75569428 -.00000268 00000-0 10000-3 0 211 2 26058 0.6869 79.5274 0003576 213.4547 182.3516 1.00267488 32831 HISPASAT 1C 1 26071U 00007A 09005.88420709 -.00000195 00000-0 10000-3 0 2426 2 26071 0.0435 24.1839 0002587 212.2120 157.5269 1.00267934 32764 GARUDA 1 1 26089U 00011A 09004.92166770 -.00000333 00000-0 10000-3 0 3301 2 26089 1.4141 259.0269 0002278 33.8226 266.7023 1.00274203 32622 SUPERBIRD 4 1 26095U 00012A 09004.28136343 -.00000070 00000-0 10000-3 0 6425 2 26095 0.0211 45.3689 0002432 239.8604 82.0742 1.00271440 32586 EXPRESS 2A 1 26098U 00013A 09004.95196409 -.00000300 00000-0 10000-3 0 7418 2 26098 2.8286 77.3621 0001457 259.5640 213.2202 1.00270803 32296 ASIASTAR 1 26107U 00016A 09006.74154383 -.00000313 00000-0 10000-3 0 5485 2 26107 0.0125 0.5725 0004203 279.8507 197.9663 1.00272879 32273 INSAT-3B 1 26108U 00016B 09004.88534328 -.00000142 00000-0 10000-3 0 272 2 26108 0.0133 100.8567 0007476 173.8109 231.6617 1.00271218 32201 SESAT 1 1 26243U 00019A 09006.80421120 .00000174 00000-0 10000-3 0 4687 2 26243 0.0743 19.1977 0006358 251.0124 161.7625 1.00273918 31951 GALAXY 4R (G-4R) 1 26298U 00020A 09007.23353029 -.00000227 00000-0 10000-3 0 5961 2 26298 2.2823 78.6504 0003012 205.2625 190.2184 1.00270892 32069 GOES 11 1 26352U 00022A 09005.23395201 .00000109 00000-0 10000-3 0 1302 2 26352 0.0364 103.1720 0005776 160.9090 150.1820 1.00282804 31777 EUTELSAT W4 1 26369U 00028A 09006.79886711 .00000174 00000-0 10000-3 0 3651 2 26369 0.0693 2.6085 0003829 275.0736 152.5095 1.00274056 31601 EXPRESS A3 1 26378U 00031A 09006.13373831 -.00000069 00000-0 10000-3 0 9219 2 26378 0.5887 80.8642 0003733 200.9532 221.1103 1.00271358 31260 TDRS 8 1 26388U 00034A 09005.01138433 -.00000199 00000-0 10000-3 0 8703 2 26388 1.0493 122.2117 0003492 168.6512 267.2909 1.00272547 31297 COSMOS 2371 1 26394U 00036A 09006.76129927 -.00000120 00000-0 10000-3 0 4792 2 26394 6.2437 68.4967 0003817 217.8805 173.6721 1.00271699 31161 ECHOSTAR 6 1 26402U 00038A 09007.10034054 -.00000239 00000-0 00000+0 0 6090 2 26402 0.0367 72.1226 0002940 222.7987 135.2864 1.00270970 31081 INTELSAT 9 (IS-9) 1 26451U 00043A 09005.16069446 -.00000262 00000-0 10000-3 0 1633 2 26451 0.0411 244.9912 0001598 18.4414 201.3098 1.00270608 30956 BRASILSAT B4 1 26469U 00046A 09004.24960098 -.00000187 00000-0 10000-3 0 4499 2 26469 0.0499 190.3463 0003187 96.0712 183.3676 1.00269135 30735 NILESAT 102 1 26470U 00046B 09005.77180859 -.00000036 00000-0 10000-3 0 2074 2 26470 0.0394 238.8625 0005999 43.8962 93.5776 1.00271906 30753 RADUGA-1 5 1 26477U 00049A 09006.73673671 .00000148 00000-0 10000-3 0 4503 2 26477 6.1092 69.1870 0004377 206.5694 140.6176 1.00261117 30603 EUTELSAT W1 1 26487U 00052A 09006.81855006 .00000087 00000-0 10000-3 0 2398 2 26487 0.0657 353.4155 0006426 294.1354 123.6482 1.00270829 30579 ASTRA 2B 1 26494U 00054A 09006.00000000 .00000171 00000-0 00000+0 0 7131 2 26494 0.0580 282.8710 0004753 13.3930 197.6400 1.00271162 30455 AMC-7 (GE-7) 1 26495U 00054B 09004.51692880 .00000119 00000-0 10000-3 0 3446 2 26495 0.0187 199.3135 0003197 86.4157 227.6125 1.00273334 30456 NSS-11 (AAP-1) 1 26554U 00059A 09006.56362204 -.00000325 00000-0 10000-3 0 4988 2 26554 0.0154 14.1750 0002155 264.4161 138.7851 1.00270382 30323 NSAT 110 1 26559U 00060A 09006.63354028 -.00000331 00000-0 10000-3 0 4806 2 26559 0.0383 241.9070 0001479 90.5368 112.0232 1.00269573 30252 AMC-6 (GE-6) 1 26580U 00067A 09004.27011998 -.00000236 00000-0 10000-3 0 3590 2 26580 0.0041 231.4731 0002021 64.2783 193.4854 1.00270214 30086 INTELSAT 12 (IS-12) 1 26590U 00068A 09004.76623840 .00000159 00000-0 10000-3 0 2100 2 26590 0.0059 7.6646 0002101 255.8265 161.8667 1.00274521 30015 BEIDOU 1A 1 26599U 00069A 09005.13833025 -.00000259 00000-0 10000-3 0 2045 2 26599 0.8371 82.2632 0004274 219.2763 353.0440 1.00270331 30056 INTELSAT 1R (IS-1R) 1 26608U 00072A 09004.70569096 -.00000251 00000-0 10000-3 0 35 2 26608 0.0081 220.3163 0000387 70.9843 22.1702 1.00269732 29857 ANIK F1 1 26624U 00076A 09005.21816587 -.00000052 00000-0 10000-3 0 4150 2 26624 0.0028 155.3758 0001826 145.5818 135.2314 1.00272471 29841 ASTRA 2D 1 26638U 00081A 09006.00000000 .00000171 00000-0 00000+0 0 7085 2 26638 0.0810 230.7080 0004012 359.5220 263.6910 1.00270716 29562 AMC-8 (GE-8) 1 26639U 00081B 09006.41077844 .00000124 00000-0 10000-3 0 3451 2 26639 0.0275 53.9669 0003266 236.6142 184.4205 1.00273720 29536 BEIDOU 1B 1 26643U 00082A 09006.60986441 -.00000122 00000-0 10000-3 0 2717 2 26643 1.6091 79.3936 0005136 195.4020 131.4277 1.00271366 29511 TURKSAT 2A 1 26666U 01002A 09003.93082882 .00000169 00000-0 10000-3 0 3793 2 26666 0.0425 251.6603 0005233 22.1551 206.9402 1.00272807 29259 SICRAL 1 1 26694U 01005A 09007.06292344 .00000122 00000-0 10000-3 0 3734 2 26694 1.0993 80.7170 0004474 203.2529 221.6313 1.00276438 29040 SKYNET 4F 1 26695U 01005B 09004.70231503 -.00000218 00000-0 10000-3 0 1491 2 26695 3.3180 58.4469 0002632 221.0369 43.7825 1.00268259 28986 EUROBIRD 1 1 26719U 01011A 09004.90101632 .00000173 00000-0 10000-3 0 4320 2 26719 0.0665 0.6136 0003947 276.2573 180.6126 1.00272803 28697 BSAT-2A 1 26720U 01011B 09004.92404247 -.00000328 00000-0 10000-3 0 2895 2 26720 0.0442 270.1511 0002799 91.9010 185.1142 1.00270596 28678 XM-2 (ROCK) 1 26724U 01012A 09007.25645612 -.00000187 00000-0 10000-3 0 5203 2 26724 0.0740 273.3983 0000131 181.9034 18.7187 1.00269601 28681 EKRAN 21 1 26736U 01014A 09006.26275490 -.00000282 00000-0 10000-3 0 4914 2 26736 5.5231 79.5289 0002172 245.3947 334.6727 1.00279217 28469 XM-1 (ROLL) 1 26761U 01018A 09006.09794770 -.00000184 00000-0 10000-3 0 2991 2 26761 0.0851 270.8379 0000942 122.2020 22.8876 1.00270963 28144 INTELSAT 10 (IS-10) 1 26766U 01019A 09004.89924457 -.00000002 00000-0 10000-3 0 2944 2 26766 0.0457 104.5237 0002349 125.7891 266.5144 1.00271703 28030 INTELSAT 901 (IS-901) 1 26824U 01024A 09004.17822414 -.00000118 00000-0 00000+0 0 3568 2 26824 0.0079 310.8820 0002877 322.8729 236.3012 1.00270416 27770 ASTRA 2C 1 26853U 01025A 09006.00000000 .00000171 00000-0 00000+0 0 6341 2 26853 0.0400 58.2790 0001602 301.0040 134.6340 1.00273207 27730 ARTEMIS 1 26863U 01029A 09004.85515145 .00000144 00000-0 10000-3 0 6130 2 26863 7.0468 71.4209 0003691 236.9176 125.4691 1.00274193 28519 GOES 12 1 26871U 01031A 09005.21630139 -.00000227 00000-0 10000-3 0 8780 2 26871 0.3926 262.6262 0000540 150.4639 54.9143 1.00276217 27370 COSMOS 2379 1 26892U 01037A 09007.02964505 .00000088 00000-0 10000-3 0 1975 2 26892 4.4480 71.1459 0004142 170.4328 247.2107 1.00268482 26992 INTELSAT 902 (IS-902) 1 26900U 01039A 09004.90589808 .00000055 00000-0 10000-3 0 3268 2 26900 0.0176 42.9335 0003488 251.5527 198.2555 1.00272171 26957 ATLANTIC BIRD 2 1 26927U 01042A 09005.80458579 -.00000045 00000-0 10000-3 0 1629 2 26927 0.0625 6.8199 0004977 265.8408 114.3970 1.00271916 26701 DIRECTV 4S 1 26985U 01052A 09006.54066943 -.00000094 00000-0 00000+0 0 2277 2 26985 0.0352 79.5542 0002026 231.3601 248.8435 1.00272874 26115 INSAT-3C 1 27298U 02002A 09004.85777837 -.00000054 00000-0 10000-3 0 8620 2 27298 0.0560 97.0191 0005487 175.5195 214.8202 1.00272161 25472 ECHOSTAR 7 1 27378U 02006A 09006.53280868 .00000019 00000-0 10000-3 0 2740 2 27378 0.0200 315.1978 0001194 333.8825 250.0804 1.00273579 25181 INTELSAT 904 (IS-904) 1 27380U 02007A 09007.05418457 .00000067 00000-0 10000-3 0 3383 2 27380 0.0103 352.3692 0003763 299.3304 254.5596 1.00272894 25225 TDRS 9 1 27389U 02011A 09005.07605446 -.00000252 00000-0 10000-3 0 3201 2 27389 2.7106 239.7884 0004301 50.1946 140.1753 1.00271308 26541 JCSAT 8 1 27399U 02015A 09004.59124586 -.00000142 00000-0 10000-3 0 1614 2 27399 0.0098 312.9048 0001909 328.1849 190.0957 1.00271682 24868 ASTRA 3A 1 27400U 02015B 09006.00000000 .00000158 00000-0 00000+0 0 1957 2 27400 0.0720 254.2560 0004202 15.8830 219.0360 1.00274279 24886 INTELSAT 903 (IS-903) 1 27403U 02016A 09003.29994045 -.00000216 00000-0 10000-3 0 1625 2 27403 0.0318 41.4519 0004189 238.6571 256.4241 1.00271308 24842 NSS-7 1 27414U 02019A 09004.73958413 -.00000145 00000-0 10000-3 0 2878 2 27414 0.0453 171.6760 0002319 106.5015 70.5380 1.00271091 24687 DIRECTV 5 (TEMPO 1) 1 27426U 02023A 09005.23232723 -.00000034 00000-0 10000-3 0 2384 2 27426 0.0261 89.0708 0002978 190.1976 159.2175 1.00272582 24444 INTELSAT 905 (IS-905) 1 27438U 02027A 09004.69723088 -.00000161 00000-0 00000+0 0 305 2 27438 0.0259 293.5159 0003375 5.8458 31.5745 1.00271650 24175 EXPRESS 4A 1 27441U 02029A 09007.07814281 -.00000094 00000-0 10000-3 0 1291 2 27441 0.0095 353.6352 0002959 170.7128 316.5102 1.00270441 24106 GALAXY 3C (G-3C) 1 27445U 02030A 09004.19888131 -.00000128 00000-0 00000+0 0 9754 2 27445 0.0261 178.2778 0000132 204.9568 57.2734 1.00270951 24057 ATLANTIC BIRD 3 1 27460U 02035A 09005.75621869 -.00000021 00000-0 10000-3 0 750 2 27460 0.0319 319.2319 0003498 319.9288 93.5376 1.00271997 23864 N-STAR C 1 27461U 02035B 09003.51049806 -.00000284 00000-0 10000-3 0 9095 2 27461 0.0541 99.8401 0003795 167.2868 155.9142 1.00269461 23848 HOT BIRD 6 1 27499U 02038A 09004.85361304 .00000110 00000-0 10000-3 0 5067 2 27499 0.0267 310.2175 0004398 320.6939 153.9773 1.00273502 23362 ECHOSTAR 8 1 27501U 02039A 09006.09062657 -.00000221 00000-0 10000-3 0 3342 2 27501 0.0033 270.4209 0002002 55.5952 95.4179 1.00270955 23393 ATLANTIC BIRD 1 1 27508U 02040A 09005.84478082 -.00000079 00000-0 10000-3 0 1738 2 27508 0.0604 172.8459 0002217 184.7178 39.5892 1.00270762 23374 METEOSAT-8 (MSG-1) 1 27509U 02040B 09004.93110404 .00000088 00000-0 10000-3 0 816 2 27509 0.4539 352.4911 0001481 247.5857 209.3227 1.00279542 23362 INTELSAT 906 (IS-906) 1 27513U 02041A 09004.91141405 .00000037 00000-0 10000-3 0 1203 2 27513 0.0116 17.8641 0002897 273.4657 205.5506 1.00271701 23237 KODAMA (DRTS) 1 27516U 02042B 09004.92464895 -.00000212 00000-0 10000-3 0 765 2 27516 0.0610 269.6397 0002773 327.2148 291.4127 1.00269385 23205 KALPANA-1 (METSAT 1) 1 27525U 02043A 09004.85777785 -.00000054 00000-0 10000-3 0 7360 2 27525 0.0352 83.6485 0000776 353.9536 49.7580 1.00271552 23169 HISPASAT 1D 1 27528U 02044A 09005.87403425 -.00000195 00000-0 10000-3 0 82 2 27528 0.0484 19.4200 0005360 236.9666 133.8125 1.00268610 23103 EUTELSAT W5 1 27554U 02051A 09004.86055139 -.00000020 00000-0 10000-3 0 348 2 27554 0.0218 13.9952 0002926 274.4677 196.4143 1.00268581 22486 TDRS 10 1 27566U 02055A 09003.30641823 -.00000240 00000-0 10000-3 0 337 2 27566 1.4954 279.2571 0002938 355.8198 257.4227 1.00267079 22358 NSS-6 1 27603U 02057A 09004.92703157 -.00000246 00000-0 10000-3 0 8748 2 27603 0.0206 194.3468 0003268 79.0817 259.9585 1.00267412 22228 NIMIQ 2 1 27632U 02062A 09006.07918466 -.00000152 00000-0 10000-3 0 9720 2 27632 0.0229 40.7830 0002685 269.3971 92.8387 1.00270301 22099 INTELSAT 907 (IS-907) 1 27683U 03007A 09004.69452133 -.00000180 00000-0 10000-3 0 7310 2 27683 0.0073 349.3604 0003748 312.5410 25.0432 1.00270896 21580 INSAT-3A 1 27714U 03013A 09006.75527914 -.00000239 00000-0 10000-3 0 4278 2 27714 0.0947 81.7083 0000361 23.8717 6.2724 1.00270067 21083 GALAXY 12 (G-12) 1 27715U 03013B 09006.53806089 .00000044 00000-0 10000-3 0 390 2 27715 0.0177 29.4226 0002351 230.5334 277.0759 1.00272571 21123 ASIASAT 4 1 27718U 03014A 09006.18775110 -.00000339 00000-0 10000-3 0 9572 2 27718 0.0151 79.4519 0000253 176.8756 39.3858 1.00273976 21058 COSMOS 2397 1 27775U 03015A 09003.76294996 .00000068 00000-0 10000-3 0 462 2 27775 2.9872 73.5658 0048720 196.5181 163.0815 1.00488224 20908 GSAT-2 1 27807U 03018A 09004.94339492 .00000147 00000-0 10000-3 0 9224 2 27807 0.0544 93.5646 0003350 182.2019 216.5064 1.00271041 20783 HELLAS-SAT 2 1 27811U 03020A 09004.82285719 .00000175 00000-0 10000-3 0 8670 2 27811 0.0245 251.5951 0002943 24.9387 163.2277 1.00273354 20590 BEIDOU 1C 1 27813U 03021A 09006.63145819 -.00000332 00000-0 10000-3 0 6742 2 27813 0.1717 217.8515 0003513 346.8036 239.5103 1.00267454 20633 AMC-9 (GE-12) 1 27820U 03024A 09007.07661259 -.00000198 00000-0 10000-3 0 8622 2 27820 0.0356 165.9717 0002913 110.0783 135.3008 1.00270912 20493 THURAYA-2 1 27825U 03026A 09004.72283616 .00000156 00000-0 10000-3 0 4130 2 27825 2.9639 337.6115 0005206 298.0222 133.0824 1.00273512 20463 BSAT-2C 1 27830U 03028A 09004.92404340 -.00000328 00000-0 10000-3 0 9653 2 27830 0.0716 250.1625 0004233 356.8755 300.1588 1.00270898 20437 OPTUS C1 1 27831U 03028B 09006.49137957 -.00000127 00000-0 00000+0 0 366 2 27831 0.0377 178.5375 0003105 103.1789 157.3701 1.00270713 20449 RAINBOW 1 1 27852U 03033A 09005.24742358 -.00000259 00000-0 00000+0 0 8896 2 27852 0.0259 18.6740 0001655 313.9521 159.7689 1.00270112 20099 GALAXY 23 (G-23) 1 27854U 03034A 09006.56255772 .00000033 00000-0 10000-3 0 9158 2 27854 0.0100 16.4659 0003095 256.6794 274.6392 1.00272317 19888 EUROBIRD 3 1 27948U 03043A 09004.97685468 .00000178 00000-0 00000+0 0 9496 2 27948 0.0438 358.0059 0000923 133.7926 357.7047 1.00273741 19437 INSAT-3E 1 27951U 03043E 09004.87279064 .00000107 00000-0 10000-3 0 4560 2 27951 0.0569 104.4825 0004071 138.3886 230.9867 1.00274303 19330 GALAXY 13 (HORIZONS-1) 1 27954U 03044A 09004.30568774 .00000070 00000-0 10000-3 0 8362 2 27954 0.0381 25.0712 0000997 251.8990 170.1343 1.00273408 19348 ZHONGXING-20 1 28082U 03052A 09004.99276987 -.00000270 00000-0 10000-3 0 6351 2 28082 0.0055 351.9269 0005649 308.9934 259.3503 1.00271691 18886 YAMAL 202 1 28089U 03053A 09007.16776131 .00000138 00000-0 10000-3 0 5303 2 28089 0.0383 266.7797 0003073 12.0146 297.4236 1.00272174 18820 YAMAL 201 1 28094U 03053B 09005.66778097 -.00000207 00000-0 10000-3 0 8991 2 28094 0.0269 274.1191 0003117 9.3411 152.3633 1.00271186 20985 AMOS 2 1 28132U 03059A 09005.70314692 -.00000012 00000-0 10000-3 0 7591 2 28132 0.0105 105.5260 0002442 205.9540 43.1132 1.00273898 18494 EXPRESS-AM 22 1 28134U 03060A 09004.89305802 .00000120 00000-0 10000-3 0 6326 2 28134 0.0360 111.4036 0001163 67.7141 300.0312 1.00273684 18416 ESTRELA DO SUL 1 28137U 04001A 09007.22040906 -.00000263 00000-0 10000-3 0 6729 2 28137 0.0392 73.0211 0001413 265.3911 144.7932 1.00270831 18514 AMC-10 (GE-10) 1 28154U 04003A 09005.23395081 .00000110 00000-0 10000-3 0 102 2 28154 0.0055 352.1944 0001839 280.2122 141.7878 1.00273776 18040 MBSAT 1 28184U 04007A 09006.53490301 -.00000231 00000-0 10000-3 0 7544 2 28184 0.0157 293.3857 0001927 344.8730 164.6016 1.00270970 17742 EUTELSAT W3A 1 28187U 04008A 09005.79192433 .00000069 00000-0 10000-3 0 7368 2 28187 0.0587 346.3761 0003953 297.2755 113.9448 1.00270666 17696 RADUGA-1 7 1 28194U 04010A 09007.01168438 -.00000171 00000-0 10000-3 0 1802 2 28194 3.4194 88.3870 0002497 192.2983 275.5083 1.00276468 17526 DIRECTV 7S 1 28238U 04016A 09006.27606240 .00000021 00000-0 10000-3 0 8419 2 28238 0.0164 74.6769 0002617 206.8552 164.7643 1.00272335 17203 AMC-11 (GE-11) 1 28252U 04017A 09006.57659190 .00000089 00000-0 10000-3 0 6895 2 28252 0.0061 347.3701 0002933 295.2694 260.2136 1.00272307 16994 INTELSAT 10-02 1 28358U 04022A 09006.11946657 .00000010 00000-0 10000-3 0 6574 2 28358 0.0214 119.8400 0000492 131.1880 256.8333 1.00272954 16743 APSTAR 5 (TELSTAR 18) 1 28364U 04024A 09006.18984134 -.00000273 00000-0 10000-3 0 3515 2 28364 0.0073 302.2784 0002291 338.8380 31.1139 1.00270194 16726 ANIK F2 1 28378U 04027A 09006.53524756 -.00000030 00000-0 00000+0 0 7006 2 28378 0.0134 358.7837 0002500 315.5399 233.4970 1.00272675 16477 AMAZONAS 1 28393U 04031A 09005.24742228 -.00000260 00000-0 10000-3 0 5470 2 28393 0.0280 264.4374 0003041 13.5208 215.0625 1.00273574 16236 EDUSAT 1 28417U 04036A 09003.83412639 -.00000054 00000-0 10000-3 0 8873 2 28417 0.0151 242.6854 0008188 29.0736 206.0955 1.00272135 15772 AMC-15 1 28446U 04041A 09004.21795944 -.00000066 00000-0 10000-3 0 7587 2 28446 0.0166 222.4290 0002415 50.4343 164.5233 1.00271996 15501 FENGYUN 2C 1 28451U 04042A 09006.73954997 -.00000313 00000-0 00000+0 0 3236 2 28451 0.9911 78.4189 0002880 311.6433 87.5321 1.00272711 15438 EXPRESS-AM 1 1 28463U 04043A 09006.98943446 .00000169 00000-0 10000-3 0 3787 2 28463 0.0430 133.4841 0001080 188.6197 180.7841 1.00274229 15344 AMC-16 1 28472U 04048A 09007.25645510 -.00000189 00000-0 10000-3 0 8007 2 28472 0.0154 343.0181 0001791 291.7386 199.5270 1.00271212 14946 NSS-10 (AMC-12) 1 28526U 05003A 09003.32546954 -.00000228 00000-0 10000-3 0 4331 2 28526 0.0339 59.6614 0003484 240.4045 242.7567 1.00270026 14409 XTAR-EUR 1 28542U 05005A 09004.90101778 .00000174 00000-0 10000-3 0 4954 2 28542 0.0108 297.2466 0001402 346.7558 174.0114 1.00274843 14285 HIMAWARI 6 (MTSAT-1R) 1 28622U 05006A 09005.14101446 -.00000258 00000-0 10000-3 0 9468 2 28622 0.0485 108.7266 0002594 32.8501 154.0998 1.00269254 14110 XM-3 (RHYTHM) 1 28626U 05008A 09004.15852637 -.00000183 00000-0 10000-3 0 5361 2 28626 0.0181 24.9321 0000341 85.7867 325.1756 1.00270706 14160 INMARSAT 4-F1 1 28628U 05009A 09004.91141309 .00000036 00000-0 10000-3 0 8218 2 28628 2.2537 320.4142 0003319 323.3389 212.8965 1.00272730 13784 EXPRESS-AM 2 1 28629U 05010A 09004.83200990 -.00000113 00000-0 10000-3 0 112 2 28629 0.0490 130.6164 0000925 192.4302 161.0261 1.00270761 13814 APSTAR 6 1 28638U 05012A 09006.53595262 -.00000298 00000-0 10000-3 0 2556 2 28638 0.0349 76.5232 0002135 207.9337 148.7330 1.00269457 38542 SPACEWAY 1 1 28644U 05015A 09004.53534615 -.00000080 00000-0 00000+0 0 6434 2 28644 0.0210 197.9280 0000229 155.9151 200.2500 1.00272357 13612 DIRECTV 8 1 28659U 05019A 09006.39578450 -.00000095 00000-0 00000+0 0 6701 2 28659 0.0217 22.9693 0002362 268.4129 216.3433 1.00271248 13302 GALAXY 28 (G-28) 1 28702U 05022A 09006.46867177 -.00000165 00000-0 10000-3 0 5936 2 28702 0.0164 68.0096 0003372 310.9915 166.8662 1.00270303 13010 EXPRESS-AM 3 1 28707U 05023A 09005.13578168 -.00000257 00000-0 00000+0 0 9283 2 28707 0.0734 172.7739 0002313 99.2897 21.7761 1.00271488 12962 THAICOM 4 1 28786U 05028A 09006.20014885 -.00000342 00000-0 10000-3 0 5001 2 28786 0.0157 326.6476 0002921 308.5450 22.2456 1.00270639 12517 GALAXY 14 (G-14) 1 28790U 05030A 09006.50332639 .00000056 00000-0 10000-3 0 6431 2 28790 0.0131 12.7166 0002475 270.9004 238.7974 1.00273066 12431 ANIK F1R 1 28868U 05036A 09006.48434981 -.00000054 00000-0 10000-3 0 6128 2 28868 0.0114 326.4824 0001971 281.3974 285.3750 1.00272074 12276 GALAXY 15 (G-15) 1 28884U 05041A 09006.41106453 .00000099 00000-0 10000-3 0 5504 2 28884 0.0105 339.3917 0002577 311.1467 190.5566 1.00273214 11865 SYRACUSE 3A 1 28885U 05041B 09004.97775122 .00000151 00000-0 10000-3 0 5227 2 28885 0.0251 82.3813 0002220 208.4991 212.8015 1.00272801 11940 INMARSAT 4-F2 1 28899U 05044A 09004.36588101 -.00000264 00000-0 10000-3 0 6741 2 28899 2.2704 310.7136 0003743 337.5221 254.8395 1.00269741 11619 TELKOM 2 1 28902U 05046A 09004.85076657 -.00000340 00000-0 10000-3 0 5463 2 28902 0.0441 163.9144 0001843 127.3148 237.6183 1.00268242 11515 SPACEWAY 2 1 28903U 05046B 09006.48385440 -.00000106 00000-0 10000-3 0 5525 2 28903 0.0168 152.1489 0000123 219.1568 169.9386 1.00271243 11618 INSAT-4A 1 28911U 05049A 09004.88823447 -.00000142 00000-0 10000-3 0 5837 2 28911 0.0674 90.0215 0002775 274.4288 142.9365 1.00271040 11190 METEOSAT-9 (MSG-2) 1 28912U 05049B 09006.08360434 .00000027 00000-0 10000-3 0 4430 2 28912 0.2960 161.7456 0003462 158.3992 176.5313 1.00284491 11224 AMC-23 1 28924U 05052A 09004.59256606 .00000017 00000-0 10000-3 0 5616 2 28924 0.0370 41.6974 0003091 233.5209 214.4484 1.00273587 11085 ECHOSTAR 10 1 28935U 06003A 09003.16773197 -.00000033 00000-0 10000-3 0 5817 2 28935 0.0125 347.7516 0001811 272.6487 152.7213 1.00272695 10607 MTSAT-2 1 28937U 06004A 09004.66580593 -.00000220 00000-0 10000-3 0 5146 2 28937 0.0488 74.0999 0002228 199.5644 215.4367 1.00270199 10593 SPAINSAT 1 28945U 06007A 09005.87865044 -.00000195 00000-0 10000-3 0 3238 2 28945 0.0349 18.9168 0004490 288.4792 84.5047 1.00269128 10374 HOT BIRD 7A 1 28946U 06007B 09004.85361865 .00000110 00000-0 10000-3 0 2862 2 28946 0.0201 230.9227 0003478 31.1567 162.7882 1.00273462 10419 JCSAT 9 1 29045U 06010A 09007.14860102 -.00000310 00000-0 10000-3 0 3987 2 29045 0.0104 38.8342 0001972 186.9786 66.5690 1.00268751 10079 ASTRA 1KR 1 29055U 06012A 09006.00000000 .00000141 00000-0 00000+0 0 2735 2 29055 0.0950 230.8830 0005158 32.0900 221.9310 1.00274493 9988 KAZSAT 1 1 29230U 06022A 09004.84148578 -.00000299 00000-0 10000-3 0 5119 2 29230 0.0154 105.7197 0001266 211.3520 193.4039 1.00270299 9364 GALAXY 16 (G-16) 1 29236U 06023A 09005.27808998 -.00000105 00000-0 10000-3 0 4400 2 29236 0.0226 201.5916 0002967 81.8221 182.6958 1.00271365 9377 GOES 13 1 29155U 06018A 09005.23174142 -.00000069 00000-0 00000-0 0 5470 2 29155 0.3751 88.1055 0003799 176.8205 178.9107 1.00271512 9623 SATMEX 6 1 29162U 06020A 09004.55419052 -.00000015 00000-0 10000-3 0 3605 2 29162 0.0027 128.9100 0002345 156.7427 265.1378 1.00272848 9573 THAICOM 5 1 29163U 06020B 09004.94367359 -.00000098 00000-0 10000-3 0 5288 2 29163 0.0562 252.1848 0002380 48.0145 222.6621 1.00270740 9642 HOT BIRD 8 1 29270U 06032A 09004.85361785 .00000110 00000-0 10000-3 0 2749 2 29270 0.0656 346.9723 0006367 243.9629 193.9816 1.00273263 8975 JCSAT 10 1 29272U 06033A 09004.89762119 -.00000325 00000-0 10000-3 0 4293 2 29272 1.2785 81.2494 0003311 196.2199 277.7786 1.00267663 8867 SYRACUSE 3B 1 29273U 06033B 09004.10374442 -.00000021 00000-0 10000-3 0 3096 2 29273 0.0060 3.9269 0003409 277.7407 214.3294 1.00272773 8844 KOREASAT 5 (MUGUNGWHA 5) 1 29349U 06034A 09004.75716353 -.00000335 00000-0 10000-3 0 4092 2 29349 0.0083 353.2420 0002116 351.9984 144.7491 1.00269608 8749 ZHONGXING-22A 1 29398U 06038A 09004.86790157 -.00000301 00000-0 10000-3 0 7115 2 29398 0.0140 58.4703 0004990 251.7674 210.1163 1.00273587 8543 DIRECTV 9S 1 29494U 06043A 09005.20111580 -.00000091 00000-0 00000-0 0 4056 2 29494 0.0146 332.4320 0002353 299.5523 164.2391 1.00272112 8219 OPTUS D1 1 29495U 06043B 09004.37966168 -.00000088 00000-0 10000-3 0 3086 2 29495 0.0072 333.4457 0002624 291.9097 135.4399 1.00271536 8243 XM-4 (BLUES) 1 29520U 06049A 09005.37146302 -.00000003 00000-0 10000-3 0 3146 2 29520 0.0066 348.1230 0000111 331.8943 163.8057 1.00273181 8110 BADR-4 (ARABSAT-4B) 1 29526U 06051A 09004.00509905 .00000168 00000-0 10000-3 0 3978 2 29526 0.0610 30.7764 0003555 285.1162 175.6928 1.00274689 7982 FENGYUN 2D 1 29640U 06053A 09006.70900301 -.00000180 00000-0 10000-3 0 5529 2 29640 0.6875 255.0177 0001417 55.6758 137.7496 1.00270379 7682 WILDBLUE-1 1 29643U 06054A 09003.17628355 -.00000027 00000-0 00000+0 0 3654 2 29643 0.0084 221.3217 0001975 23.7002 170.2652 1.00272407 7634 AMC-18 1 29644U 06054B 09006.42810580 -.00000069 00000-0 10000-3 0 3638 2 29644 0.0123 44.8596 0003275 245.5270 224.9147 1.00271630 7670 MEASAT-3 1 29648U 06056A 09006.68871198 -.00000222 00000-0 10000-3 0 3534 2 29648 0.0258 63.1409 0001689 217.0055 165.6606 1.00269279 7691 KIKU-8 (ETS-VIII) 1 29656U 06059A 09003.15607384 -.00000212 00000-0 10000-3 0 3404 2 29656 0.0180 6.5105 0002790 342.2509 316.3523 1.00270913 7541 BEIDOU 1D 1 30323U 07003A 09006.34475376 -.00000237 00000-0 10000-3 0 5808 2 30323 4.7745 278.9068 0123043 302.6300 153.3093 1.00270523 7525 INSAT-4B 1 30793U 07007A 09006.75339005 -.00000238 00000-0 10000-3 0 3197 2 30793 0.0625 101.5516 0006159 175.8470 193.7518 1.00269397 6703 SKYNET 5A 1 30794U 07007B 09006.14376317 .00000009 00000-0 10000-3 0 2945 2 30794 0.0432 348.8387 0002671 277.7900 249.8465 1.00272990 6861 ANIK F3 1 31102U 07009A 09004.74846544 .00000021 00000-0 10000-3 0 2549 2 31102 0.0103 225.0509 0002461 52.6139 337.5635 1.00273361 6433 ASTRA 1L 1 31306U 07016A 09006.00000000 .00000141 00000-0 00000-0 0 2418 2 31306 0.0830 250.7460 0005289 37.2040 196.9560 1.00275082 6197 GALAXY 17 (G-17) 1 31307U 07016B 09006.07918534 -.00000154 00000-0 10000-3 0 3191 2 31307 0.0130 36.7802 0003095 239.5206 127.0062 1.00271414 6194 NIGCOMSAT 1 1 31395U 07018A 09004.98464561 .00000170 00000-0 10000-3 0 3269 2 31395 0.1946 80.7601 0003760 223.5334 195.9486 1.00278094 6170 SINOSAT 3 1 31577U 07021A 09006.24012278 -.00000333 00000-0 10000-3 0 4443 2 31577 0.0937 115.1590 0002317 145.1320 57.1134 1.00270048 5890 ZHONGXING-6B 1 31800U 07031A 09006.22996293 -.00000341 00000-0 10000-3 0 4077 2 31800 0.0216 85.6780 0002730 203.2290 15.3567 1.00273790 5581 DIRECTV 10 1 31862U 07032A 09004.53534759 -.00000080 00000-0 10000-3 0 2677 2 31862 0.0342 190.7113 0000381 211.0125 152.4889 1.00272233 5504 SPACEWAY 3 1 32018U 07036A 09006.48839553 -.00000131 00000-0 00000+0 0 1964 2 32018 0.0372 166.7190 0000817 215.3802 164.9567 1.00271174 5247 BSAT-3A 1 32019U 07036B 09004.92402892 -.00000327 00000-0 10000-3 0 2349 2 32019 0.0477 221.0553 0001057 305.9823 20.1549 1.00269416 5168 INSAT-4CR 1 32050U 07037A 09004.85777528 -.00000055 00000-0 10000-3 0 3156 2 32050 0.0838 89.0441 0002154 182.4204 215.9709 1.00271466 4969 OPTUS D2 1 32252U 07044A 09004.65044593 -.00000160 00000-0 10000-3 0 2814 2 32252 0.0324 234.0337 0002820 41.5027 215.0069 1.00270671 4638 INTELSAT 11 (IS-11) 1 32253U 07044B 09005.93286786 -.00000248 00000-0 10000-3 0 1837 2 32253 0.0464 85.6897 0003050 205.9333 106.6982 1.00267838 4648 STAR ONE C1 1 32293U 07056A 09005.35644238 -.00000254 00000-0 10000-3 0 1758 2 32293 0.0365 92.6836 0001996 204.8091 230.9224 1.00271831 4265 SKYNET 5B 1 32294U 07056B 09004.89305752 .00000122 00000-0 10000-3 0 2217 2 32294 0.0652 338.2481 0003470 276.6828 223.9137 1.00272270 4346 SIRIUS 4 1 32299U 07057A 09004.62179985 .00000056 00000-0 10000-3 0 1508 2 32299 0.0323 127.4468 0002939 146.1919 59.3833 1.00273294 4183 RADUGA-1M 1 1 32373U 07058A 09007.19881146 -.00000020 00000-0 10000-3 0 3263 2 32373 0.0395 228.7649 0002384 30.4076 349.2293 1.00268892 4857 RASCOM-QAF 1 1 32387U 07063A 09004.69178338 .00000040 00000-0 10000-3 0 1201 2 32387 0.0545 85.5965 0001263 168.5930 102.0252 1.00272710 4287 HORIZONS 2 1 32388U 07063B 09005.33113295 -.00000230 00000-0 00000+0 0 1684 2 32388 0.0043 219.0679 0002910 45.3332 245.8238 1.00271873 3980 THURAYA-3 1 32404U 08001A 09004.84177374 -.00000280 00000-0 10000-3 0 1791 2 32404 5.8010 330.1451 0004833 300.3363 235.7477 1.00269114 3633 EXPRESS-AM 33 1 32478U 08003A 09006.24215188 -.00000260 00000-0 00000+0 0 2442 2 32478 0.0408 141.0481 0001750 256.7477 251.8198 1.00270426 3759 THOR 5 1 32487U 08006A 09006.10971333 .00000012 00000-0 10000-3 0 1551 2 32487 0.0408 131.0768 0002491 155.9249 217.5582 1.00273172 3304 KIZUNA (WINDS) 1 32500U 08007A 09005.69704749 -.00000237 00000-0 10000-3 0 1073 2 32500 0.0527 276.8806 0002479 3.6413 218.8237 1.00270156 3233 DIRECTV 11 1 32729U 08013A 09005.27809150 -.00000103 00000-0 00000+0 0 1920 2 32729 0.0199 202.5005 0000215 12.2558 251.1273 1.00271535 3041 ICO G1 1 32763U 08016A 09006.53110294 -.00000150 00000-0 00000+0 0 1602 2 32763 5.6874 328.2947 0003008 306.5611 289.7238 1.00271192 2713 VINASAT-1 1 32767U 08018A 09004.85833553 -.00000306 00000-0 10000-3 0 1351 2 32767 0.0138 1.5706 0000854 321.6124 222.3326 1.00269807 2717 STAR ONE C2 1 32768U 08018B 09004.19515311 -.00000242 00000-0 10000-3 0 1100 2 32768 0.0393 137.4233 0002383 159.8443 166.8943 1.00268630 2742 TIANLIAN I (CTDRS-1) 1 32779U 08019A 09005.66211260 -.00000086 00000-0 10000-3 0 2277 2 32779 0.0640 269.4658 0001337 241.4040 269.9653 1.00272919 2585 AMOS 3 1 32794U 08022A 09005.69852020 -.00000013 00000-0 10000-3 0 1130 2 32794 0.0494 59.7405 0000164 84.7644 208.3653 1.00272316 2559 GALAXY 18 (G-18) 1 32951U 08024A 09005.97185159 .00000046 00000-0 10000-3 0 1146 2 32951 0.0149 59.8324 0003081 223.4186 49.2983 1.00273181 2320 CHINASAT 9 1 33051U 08028A 09006.68663043 -.00000228 00000-0 10000-3 0 1798 2 33051 0.0305 93.5068 0006815 190.4792 161.7797 1.00269896 2152 SKYNET 5C 1 33055U 08030A 09004.59762185 -.00000115 00000-0 00000-0 0 835 2 33055 0.4753 197.5198 0004571 84.4502 19.7047 1.00271197 2128 TURKSAT 3A 1 33056U 08030B 09003.72521166 .00000168 00000-0 10000-3 0 1070 2 33056 0.0400 63.4761 0002727 204.9959 138.0939 1.00275103 2178 COSMOS 2440 1 33108U 08033A 09006.99429984 -.00000119 00000-0 10000-3 0 1761 2 33108 1.8516 285.6549 0004417 44.8093 214.4624 1.00270362 1938 PROTOSTAR 1 1 33153U 08034A 09004.99277065 -.00000270 00000-0 00000+0 0 1315 2 33153 0.0348 221.4610 0002256 57.6695 281.3232 1.00269825 1859 BADR-6 1 33154U 08034B 09004.76916668 .00000167 00000-0 10000-3 0 1139 2 33154 0.0463 325.5427 0005322 320.0514 121.7939 1.00271631 1875 ECHOSTAR 11 1 33207U 08035A 09006.22999154 -.00000036 00000-0 00000+0 0 1156 2 33207 0.0099 334.5561 0002245 300.4363 163.7551 1.00272608 1773 SUPERBIRD 7 1 33274U 08038A 09006.53490237 -.00000233 00000-0 10000-3 0 1216 2 33274 0.2146 84.1407 0003004 212.5733 145.8333 1.00270817 1507 AMC-21 1 33275U 08038B 09005.33113471 .00000058 00000-0 10000-3 0 1175 2 33275 0.0202 35.1116 0003117 266.9510 157.2886 1.00272167 1581 INMARSAT 4-F3 1 33278U 08039A 09006.49629167 -.00000120 00000-0 10000-3 0 1228 2 33278 2.9851 331.6572 0003097 320.6188 254.9944 1.00271148 1455 NIMIQ 4 1 33373U 08044A 09006.09236657 -.00000200 00000-0 10000-3 0 659 2 33373 0.0140 115.3370 0001799 140.0823 161.6281 1.00271922 1134 GALAXY 19 (G-19) 1 33376U 08045A 09004.32564119 -.00000116 00000-0 10000-3 0 863 2 33376 0.0035 283.8161 0002748 357.7026 202.7070 1.00272084 1061 VENESAT-1 1 33414U 08055A 09007.10062851 -.00000220 00000-0 00000+0 0 481 2 33414 0.2193 273.4502 0002131 4.5169 147.1317 1.00271191 799 ASTRA 1M 1 33436U 08057A 09004.76916850 .00000153 00000-0 10000-3 0 651 2 33436 0.1164 218.1718 0000784 288.3263 260.1706 1.00130128 640 savi1.6.0/data/glonass.tcl0000644000175000017500000000274314423445060014526 0ustar lloydlloyd# # * NAVIGATION SYSTEMS # * # * Glonass navigation constellation # * # * The Russian alternative to GPS. This shows the perfect full # * constellation; what's in orbit is only partial. Current status # * information is available from: # * http://www.glonass-iac.rsa.ru/ - click the British flag. # * # * Best viewed with a large number of colours (14+) to show full # * diversity. # # http://www.spaceandtech.com/spacedata/constellations/glonass_consum.shtml # has basic constellation information. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: glonass.tcl 69 2019-08-14 06:13:10Z lloydwood $ # We are excluding all spares. set SATS_PER_PLANE 8 set NUM_PLANES 3 # setup orbital elements set a [expr 19100.0+$RADIUS_OF_EARTH] set e 0.0 set inc 64.8 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] upvar #0 NUM_COLORS NUM_COLORS if {$NUM_COLORS < 11} { # 11 satellites is maximum diversity seen in fisheye for Glonass. puts stderr "\nSaVi: Coverage view of Glonass benefits from a large number of colors." } # set mask to 0 set coverage_angle 0.0 set phase_offset [expr $T_per / $NUM_PLANES / $SATS_PER_PLANE] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [ expr $j * 360.0 / $NUM_PLANES ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr ($T_per * $i / $SATS_PER_PLANE - $phase_offset*$j)] satellites LOAD $a $e $inc $Omega $omega $T "Glonass ($j, $i)" } } satellites GV_END savi1.6.0/data/laser-light-halo.tcl0000644000175000017500000000232114423445060016204 0ustar lloydlloyd# # * NON-GEOSTATIONARY EQUATORIAL RING - PROPOSED SYSTEM # * # * LASER LIGHT COMMUNICATIONS aka aka HALO GLOBAL NETWORK # * # * See https://www.laserlightcomms.com/ # * # * Medium Earth Orbit system using lasers for data delivery. # * # * First commercial space-based FSO laser communication network # * to deploy in 2017, LaserFocusWorld, 12 September 2012. # * gives the altitude. # * # * Uses intersatellite links, which are not yet simulated here. # https://www.laserfocusworld.com/test-measurement/research/article/16565254/first-commercial-spacebased-fso-laser-communication-network-to-deploy-in-2017 # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: laser-light-halo.tcl 105 2019-09-22 10:24:29Z lloydwood $ # 8 to 12 satellites set NUM_SATS 12 # setup orbital elements set a [expr 10500.0+$RADIUS_OF_EARTH] set e 0.0 set inc 0.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # #without knowing limits on lasers, assume limit of visibility. set coverage_angle 0.0 satellites GV_BEGIN set T [expr $T_per ] for {set j 0} {$j < $NUM_SATS} {incr j} { set Omega [expr $j * 360.0 / $NUM_SATS] satellites LOAD $a $e $inc $Omega $omega $T "Laser Light-$j" } satellites GV_END savi1.6.0/data/draim-4.tcl0000644000175000017500000000455614423445060014321 0ustar lloydlloyd# # * GEOSYNCHRONOUS CONSTELLATIONS / ELLIPTICAL SYSTEMS / HIGH EARTH ORBIT # * # * Draim example 4-satellite elliptical constellation # * # * Uses elliptical orbits for continuous coverage. # * # * If the Earth is completely enclosed within a tetrahedron, # * then satellites at the vertices of that tetrahedron can # * see the whole surface of the Earth. # * # * Project forwards 48 hours then record ground tracks # * to see repeating paths from geosynchronous orbits. # * # * John E. Draim, A common-period four-satellite continuous # * global coverage constellation, AIAA Journal of Guidance, # * Control and Dynamics, vol. 10, no. 5, September-October 1987, # * pp. 492-499. Orbital parameters from Table 1. # * # * John E. Draim, Tetrahedral multi-satellite continuous-coverage # * constellation, US Patent 4,854,527, August 1989. # http://www.freepatentsonline.com/4854527.html # * # * Draim later used this SaVi script to demonstrate his design: # # * John E. Draim et al., Common-period four-satellite continuous # * global coverage constellations revisited, Advances in the # * Astronautical Sciences, vol. 143, pp. 667-686, January 2012. # * # * A later paper in Nature made the Draim four-points idea more # * practical by using orbits requiring less station-keeping. See: # * Singh, L.A., Whittecar, W.R., DiPrinzio, M.D. et al., # * Low cost satellite constellations for nearly continuous # * global coverage, Nature Communications, volume 11, # * article 200, January 2020. # https://dx.doi.org/10.1038/s41467-019-13865-0 # https://www.nature.com/articles/s41467-019-13865-0 # # $Id: draim-4.tcl 175 2020-05-03 11:30:30Z lloydwood $ set NUM_PLANES 4 # apogee altitude 42203 nautical miles - translate to km set apogee_altitude 78160.0 # perigee altitude 23193 nautical miles - translate to km set perigee_altitude 42953.5 # setup orbital elements set a [expr ($apogee_altitude+$perigee_altitude)/2+$RADIUS_OF_EARTH] # e is approximately 0.263 set e [expr ($apogee_altitude-$perigee_altitude)/(2*$a)] set inc 31.3 set omega -90 set coverage_angle 0.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES] set omega [expr -$omega] set T [expr $T_per / $NUM_PLANES * $j ] satellites LOAD $a $e $inc $Omega $omega $T "Draim-$j" } satellites GV_END savi1.6.0/data/telesat-polar.tcl0000644000175000017500000000337414423445060015635 0ustar lloydlloyd# # * PROPOSED LARGE BROADBAND CONSTELLATIONS - 2010s MEGACONSTELLATIONS # * # * Telesat Lightspeed # * # * Canadian system that combines a Ballard rosette, good at coverage of # * mid-latitudes, with a crude polar star to ensure coverage of the highest # * latitudes. # * # * This is the crude polar star component. # * # * This is based on Telesat's patent filing: # # * Dual leo satellite system and method for global coverage, # * David Wending, Telesat Canada, WO2017177343A1, October 2017. # https://patents.google.com/patent/WO2017177343A1/en # * # * See also https://www.telesat.com/services/leo/why-leo # * # * Uses intersatellite links, which are not yet simulated here. # $Id: telesat-polar.tcl 181 2021-02-13 11:54:42Z lloydwood $ set SATS_PER_PLANE 12 set NUM_PLANES 6 # not optimised, and therefore not actually a Walker # star, but that's what the patent application specifies. # While any equatorial gaps or seam spacing can be covered # by the rosette, crude star coverage here looks very weak. set INTERPLANE_SPACING 30 # setup orbital elements set a [expr 1000.0+$RADIUS_OF_EARTH] set e 0.0 set inc 99.5 set omega 0.0 # assumes both constellations are active. # does not look good. set coverage_angle 20 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * $INTERPLANE_SPACING] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { if { $j % 2 == 0} { set plane_offset 0 } else { set plane_offset [expr $T_per / $SATS_PER_PLANE / 2.0] } set T [expr $T_per * $i / $SATS_PER_PLANE + $plane_offset] set n [satellites LOAD $a $e $inc $Omega $omega $T "Telesat-polar ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/ico.tcl0000644000175000017500000000431014423445060013622 0ustar lloydlloyd# # * 1990s VOICE SYSTEMS # * # * ICO # * # * ICO is Intermediate Circular Orbit, another term for Medium Earth # * Orbit, or MEO. ICO began at Inmarsat, where it was known as # * Inmarsat-P or Project 21, as a response to the developments of # * Iridium and Globalstar to provide voice telephony and low-rate data. # * Contract work was done with TRW; this also led to the Odyssey system, # * which was cancelled in December 1997 in favour of ICO. # * # * GSM terrestrial mobile cellular telephony became widespread, # * and the construction, launch and bankruptcies of the competing # * Iridium and Globalstar efforts indicated a shift in the market. # * # * ICO filed for US Chapter 11 bankruptcy protection in August 1999. # * ICO then emerged from bankruptcy protection in May 2000, after its # * first launch lost a satellite in March 2000. The second launch in # * June 2001 succeeded. None of the other constructed MEO ICO satellites # * have yet been launched. # * # * (ICO Global's G1 geostationary satellite was launched in April 2008, and # * was claimed to be the largest geostationary satellite yet launched. # * This is intended to provide "ICO mim" (mobile interactive media) # * services, including mobile video, over the United States.) # Zero phasing between planes, since odd number of sats 180deg opposed # means that sats cross the other plane halfway between sats in that plane, # which is ideal for coverage. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: ico.tcl 170 2020-04-28 03:34:51Z lloydwood $ set SATS_PER_PLANE 5 set NUM_PLANES 2 # setup orbital elements # altitude was 10,355km until recently. # Noticed and confirmed change to 10,390km in October 1998. set a [expr 10390.0+$RADIUS_OF_EARTH] set e 0.0 set inc 45.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # elevation angle of 10 degrees set coverage_angle 10.0 satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * $i / $SATS_PER_PLANE ] set n [satellites LOAD $a $e $inc $Omega $omega $T "ICO ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/amazon-project-kuiper-first.tcl0000644000175000017500000000655714423445060020442 0ustar lloydlloyd# # * PROPOSED LARGE BROADBAND CONSTELLATIONS - 2010s MEGACONSTELLATIONS # * # * Project Kuiper # * # * This is the 'perfect' fully-deployed first-generation Amazon # * Project Kuiper system. Only the initial "first shell" of the # * planned Ka-band constellations is simulated in this script. # * # * This is based on the 4 July 2019 FCC filing. # * This is at Ka-band - even though the name may suggest 'Ku'. # * # * Despite the number of satellites, the filing does not appear # * to describe intersatellite links. The Technical Appendix says: # * "The number of United States gateways sites will be approximately # * equal to the number of active satellites serving U.S. territory." # # July FCC filings # https://licensing.fcc.gov/cgi-bin/ws.exe/prod/ib/forms/attachment_menu.hts?id_app_num=131001&acct=322741&id_form_num=12&filing_key=-434810 # # Amazon asks FCC for approval of Project Kuiper broadband satellite operation, # Alan Boyle and Taylor Soper, GeekWire, July 6, 2019. # https://www.geekwire.com/2019/amazon-asks-fcc-approval-project-kuiper-broadband-satellite-operation/ # https://finance.yahoo.com/news/amazon-asks-fcc-approval-project-175804004.html # # $Id: amazon-project-kuiper-first.tcl 84 2019-08-19 05:01:03Z lloydwood $ set SATS_PER_PLANE 34 set NUM_PLANES 34 # to see deployment of half of this shell, intended to provide # continuous coverage between 39 and 56 degrees of latitude, # set this to 1 for first half, 2 for second half, or 0 for # the full first shell. set DEPLOY_HALF 0 set halfname "" if {$DEPLOY_HALF == 1} { puts stderr "SaVi: Kuiper: first half of first shell" set halfname "-1/2" } elseif {$DEPLOY_HALF == 2} { puts stderr "SaVi: Kuiper: second half of first shell" set halfname "-2/2" } else { puts stderr "SaVi: Kuiper: full first shell" } # setup orbital elements set a [expr 630.0 + $RADIUS_OF_EARTH] set e 0.0 set inc 51.9 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # Minimum elevation angle is said to be 35 degrees. set coverage_angle 35.0 upvar #0 NUM_COLORS NUM_COLORS if {$NUM_COLORS < 19} { # more than 19 satellites can be visible in fisheye over mid-latitudes puts stderr "\nSaVi: Coverage view of Kuiper constellation benefits from largest number of colors (19+)." } # Plane offset is really a function of harmonic factor in Ballard constellations. # (Rosette Constellations of Earth Satellites, A. H. Ballard, TRW, # IEEE Transactions on Aerospace and Electronic Systems, Vol 16 No 5, Sep. 1980) # 360 / 34 / 34 = 360 / 1,156 = 0.3114 degrees approx. # The Access .ndb database file in the July FCC filing would suggest # exactly which harmonic to use. Technical document suggests simple tiling # with half spacing given number of sats, i.e. 17th harmonic. set interplane_phasing [expr 360.0 / $NUM_PLANES / $SATS_PER_PLANE * 17] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES] if {($DEPLOY_HALF == 1) && ([expr $j % 2 ] != 0)} { continue; } if {($DEPLOY_HALF == 2) && ([expr $j % 2 ] != 1)} { continue; } for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set plane_offset [expr ($T_per / 360) * ($j * $interplane_phasing) ] set T [expr ($T_per * $i / $SATS_PER_PLANE ) + $plane_offset ] set n [satellites LOAD $a $e $inc $Omega $omega $T "Kuiper-1st$halfname ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/galileo.tcl0000644000175000017500000000530114423445060014465 0ustar lloydlloyd# # * NAVIGATION SYSTEMS # * # * Galileo navigation constellation # * # * Proposed as a competitor to GPS. # * # * Not yet operational, other than the Galileo In-Orbit Validation # * Element (GIOVE) demonstrator satellites, which do not form part of # * this constellation. # * # * Best viewed with a large number of colours (14+) to show full # * diversity. # # http://europa.eu.int/comm/dgs/energy_transport/galileo/ # http://europa.eu.int/comm/dgs/energy_transport/galileo/doc/galileo_hld_v3_23_09_02.pdf # Galileo Mission High Level Definition, version 3, 23 Sep 2002. # see section 4.1.1 # # http://www.aoe.vt.edu/~cdhall/Space/archives/000296.html # The GALILEO constellation will comprise 27 satellites (and four # spares) in circular orbits at 23,616 km altitude, in 56 degree # inclined orbits, with nine operational satellites equally spaced # in each of three equally spaced orbital planes. This configuration # is known as a Walker 27/3/1 constellation, where "27" is the number # of satellites, "3" is the number of planes, and "1" is a parameter # defining the phasing or mean anomaly difference between satellites # in adjacent planes. The constellation has the notable property that # for any minimum elevation angle, the number of visible GALILEO # satellites is equal to the number of visible GPS satellites # plus one. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: galileo.tcl 23 2019-06-09 14:54:58Z lloydwood $ # We are excluding all spares. set SATS_PER_PLANE 9 set NUM_PLANES 3 # setup orbital elements set a 29994.0 set e 0.0 set inc 56.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] upvar #0 NUM_COLORS NUM_COLORS if {$NUM_COLORS < 12} { # 12 satellites is maximum diversity seen in fisheye for Galileo. puts stderr "\nSaVi: Coverage view of Galileo constellation benefits from a large number of colors." } # Walker /1 for deltas means Ballard first harmonic. # each plane is offset by 360/27*1 = 13.33 degrees. # Third plane is 13.33 degrees below the first plane. # table 8 of Mission HLD says: # receiver mask visible Galileo visible GPS # 5 13 12 # 10 11 10 # 15 9 8 # ...but is unclear if this includes transmitting spares. # set mask to 0 set coverage_angle 0.0 set phase_offset [expr $T_per / $NUM_PLANES / $SATS_PER_PLANE] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [ expr $j * 360.0 / $NUM_PLANES ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr ($T_per * $i / $SATS_PER_PLANE - $phase_offset*$j)] satellites LOAD $a $e $inc $Omega $omega $T "Galileo ($j, $i)" } } satellites GV_END savi1.6.0/data/deligo.tcl0000644000175000017500000000277614423445060014331 0ustar lloydlloyd# # * PROPOSAL # * # * Deligo # * # * A satellite constellation designed at the University of Surrey. # * # * This "provides 100% single satellite visibility between +/-74deg # * latitudes and 100% dual diversity between +/-62deg latitudes # * at a minimum elevation angle of 14deg" with a repetitive ground # * track. Not built. # * # * Described in: # * C. Meenan, A. Sammut, R. Tafazolli and B. G. Evans, Deligo: # * Repetitive ground track 100% dual-diversity LEO satellite # * constellation for S-PCN, IEE Electronics Letters, vol. 13 # * no. 17, 17 August 1995, pp. 1407-1408. # # $Id: deligo.tcl 69 2019-08-14 06:13:10Z lloydwood $ set SATS_PER_PLANE 8 set NUM_PLANES 8 # setup orbital elements set a [expr 1626.0+$RADIUS_OF_EARTH] set e 0.0 set inc 54.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] set coverage_angle 14.0 # Plane offset is really a function of harmonic factor in Ballard constellations. # (Rosette Constellations of Earth Satellites, A. H. Ballard, TRW, # IEEE Transactions on Aerospace and Electronic Systems, Vol 16 No 5, Sep. 1980) # 360 / 8 / 8 = 360/64 = 5.625 degrees. # quoted 1/8 harmonic factor is that. satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * ( double($i) / $SATS_PER_PLANE - 5.625/360.0*$j) ] set n [satellites LOAD $a $e $inc $Omega $omega $T "Deligo ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/teledesic-288.tcl0000644000175000017500000000375014423445060015337 0ustar lloydlloyd# # * 1990s LARGE BROADBAND PROPOSALS - FAT PIPE DREAMS # * # * Teledesic (288-active satellite Boeing design) # * # * A reduced number of satellites, at higher altitude, than the # * first 840-active-satellite proposal. # * # * Uses intersatellite links, which are not yet simulated here. # * # * Based on a Boeing-led redesign before a merger with Motorola's # * competing Celestri effort in May 1998, which was then followed by # * a planned 30-active-satellite MEO system announced in February # * 2002. # * # * In October 2002 Teledesic suspended satellite work, and in July # * 2003 surrendered allocated frequencies. # * # * Craig McCaw, who had funded Teledesic development, then invested in # * the company developing the smaller MEO ICO system. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: teledesic-288.tcl 116 2019-09-30 07:20:51Z lloydwood $ # note that planes would not be as clearly offset in reality; # with such a large number of satellites, control of phasing # is hard and random phasing between planes is likely to result. # Coverage should cope with that. # Eccentricity not known; approximated to zero. set SATS_PER_PLANE 24 set NUM_PLANES 12 # setup orbital elements set a [expr 1375.0+$RADIUS_OF_EARTH] set e 0.0 set inc 84.7 set omega 0.0 # still Ka-band and 40 degrees mask elevation. set coverage_angle 40.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { # space planes evenly, adjusted for seam. set Omega [expr $j * 15 ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { if { $j % 2 == 0} { set plane_offset 0 } else { set plane_offset [expr $T_per / $SATS_PER_PLANE / 2.0] } set T [expr $T_per * ($i + $j/double($NUM_PLANES)) / \ $SATS_PER_PLANE + $plane_offset ] set n [satellites LOAD $a $e $inc $Omega $omega $T "Teledesic-1997 ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/amazon-project-kuiper-second.tcl0000644000175000017500000000630014423445060020550 0ustar lloydlloyd# # * PROPOSED LARGE BROADBAND CONSTELLATIONS - 2010s MEGACONSTELLATIONS # * # * Project Kuiper # * # * This is the second shell to be deployed in the Amazon Project Kuiper # * system. # * # * This is based on the 4 July 2019 FCC filing. # * This is at Ka-band - even though the name may suggest 'Ku'. # * # * Despite the number of satellites, the filing does not appear # * to describe intersatellite links. The Technical Appendix says: # * "The number of United States gateways sites will be approximately # * equal to the number of active satellites serving U.S. territory." # # July FCC filings # https://licensing.fcc.gov/cgi-bin/ws.exe/prod/ib/forms/attachment_menu.hts?id_app_num=131001&acct=322741&id_form_num=12&filing_key=-434810 # # Amazon asks FCC for approval of Project Kuiper broadband satellite operation, # Alan Boyle and Taylor Soper, GeekWire, July 6, 2019. # https://www.geekwire.com/2019/amazon-asks-fcc-approval-project-kuiper-broadband-satellite-operation/ # https://finance.yahoo.com/news/amazon-asks-fcc-approval-project-175804004.html # # $Id: amazon-project-kuiper-second.tcl 84 2019-08-19 05:01:03Z lloydwood $ set SATS_PER_PLANE 36 set NUM_PLANES 36 # to see deployment of half of this shell, set this to # 1 for first half, 2 for second half, or 0 for # the full first shell. set DEPLOY_HALF 0 set halfname "" if {$DEPLOY_HALF == 1} { puts stderr "SaVi: Kuiper: first half of second shell" set halfname "-1/2" } elseif {$DEPLOY_HALF == 2} { puts stderr "SaVi: Kuiper: second half of second shell" set halfname "-2/2" } else { puts stderr "SaVi: Kuiper: full second shell" } # setup orbital elements set a [expr 610.0 + $RADIUS_OF_EARTH] set e 0.0 set inc 42.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # Minimum elevation angle is said to be 35 degrees. set coverage_angle 35.0 upvar #0 NUM_COLORS NUM_COLORS if {$NUM_COLORS < 19} { # more than 19 satellites can be visible in fisheye over mid-latitudes puts stderr "\nSaVi: Coverage view of Kuiper constellation benefits from largest number of colors (19+)." } # FIX THIS # Plane offset is really a function of harmonic factor in Ballard constellations. # (Rosette Constellations of Earth Satellites, A. H. Ballard, TRW, # IEEE Transactions on Aerospace and Electronic Systems, Vol 16 No 5, Sep. 1980) # 360 / 36 / 36 = 360 / 1,296 = 0.2778 degrees approx. # The Access .ndb database file in the July FCC filing would suggest # exactly which harmonic to use. Technical document suggests simple tiling # with half spacing given number of sats, i.e. 18th harmonic. set interplane_phasing [expr 360.0 / $NUM_PLANES / $SATS_PER_PLANE * 17] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES] if {($DEPLOY_HALF == 1) && ([expr $j % 2 ] != 0)} { continue; } if {($DEPLOY_HALF == 2) && ([expr $j % 2 ] != 1)} { continue; } for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set plane_offset [expr ($T_per / 360) * ($j * $interplane_phasing) ] set T [expr ($T_per * $i / $SATS_PER_PLANE ) + $plane_offset ] set n [satellites LOAD $a $e $inc $Omega $omega $T "Kuiper-2nd$halfname ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/amazon-project-kuiper-all.tcl0000644000175000017500000000257214423445060020054 0ustar lloydlloyd# # * PROPOSED LARGE BROADBAND CONSTELLATIONS - 2010s MEGACONSTELLATIONS # * # * Project Kuiper # * # * This is the full Amazon Project Kuiper system, consisting # * of three separate Ballard rosette 'shells'. Each shell # * is loaded separately from a different script. # * # * This is based on the 4 July 2019 FCC filing. # * This is at Ka-band - even though the name may suggest 'Ku'. # * # * Despite the number of satellites, the filing does not appear # * to describe intersatellite links. The Technical Appendix says: # * "The number of United States gateways sites will be approximately # * equal to the number of active satellites serving U.S. territory." # # July FCC filings # https://licensing.fcc.gov/cgi-bin/ws.exe/prod/ib/forms/attachment_menu.hts?id_app_num=131001&acct=322741&id_form_num=12&filing_key=-434810 # # Amazon asks FCC for approval of Project Kuiper broadband satellite operation, # Alan Boyle and Taylor Soper, GeekWire, July 6, 2019. # https://www.geekwire.com/2019/amazon-asks-fcc-approval-project-kuiper-broadband-satellite-operation/ # https://finance.yahoo.com/news/amazon-asks-fcc-approval-project-175804004.html # # $Id: amazon-project-kuiper-all.tcl 77 2019-08-16 06:25:18Z lloydwood $ satellites GV_BEGIN source "data/amazon-project-kuiper-first.tcl" source "data/amazon-project-kuiper-second.tcl" source "data/amazon-project-kuiper-third.tcl" satellites GV_END savi1.6.0/data/quasi-geo.tcl0000644000175000017500000000552514423445060014753 0ustar lloydlloyd# # * GEOSYNCHRONOUS CONSTELLATIONS # * # * Quasi-geostationary constellation # * # * A three-satellite inclined geosynchronous system. # * This was researched for Japan. It is intended to provide coverage # * of higher latitudes while still allowing the high mask elevation # * needed for high-frequency use. # * # * Project forwards 8 hours then record ground tracks # * to see repeating paths from geosynchronous orbits. # * # * This simulation is intended to match what is described in: # * T. Taleb, U. Dharmaratna, N. Kato, and Y. Nemoto, A Geographical # * Location Based Satellite Selection Scheme for a Novel Constellation # * Composed of Quasi-Geostationary Satellites, Proceedings of IEEE # * International Conference on Communications, ICC 2005, Seoul, Korea, # * May 2005. # http://dx.doi.org/10.1109/ICC.2005.1494588 # * # * See also: # * T. Taleb, A. Jamalipour, N. Kato, and Y. Nemoto, A Theatre in the # * Sky: A Ubiquitous Broadband Multimedia-on-Demand Service over a # * Novel Constellation Composed of Quasi-Geostationary Satellites, # * International Journal of Satellite Communications and Networking, # * Vol. 24, No. 3, May/June 2006. pp. 215-227. # http://doi.wiley.com/10.1002/sat.829 # * T. Taleb, Internetworking over Next-Generation NGEO/IP-based # * Satellite Communications Systems, PhD thesis, Tohoku University, # * August 2005. See chapter 6. # http://www.nemoto.ecei.tohoku.ac.jp/%7Etaleb/Library/phd_thesis.pdf # * # * Taleb gives a central longitude of 118 degrees for East Asia in # * Fig 6.2 of his thesis. We use 140 degrees to also cover the # * Australian and New Zealand landmasses, so that coverage is useful # * in the southern hemisphere as well. # * # * Taleb repeats this three-satellite constellation six times for full # * equatorial coverage. The script can be edited to show this. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # http://savi.sourceforge.net/ # # $Id: quasi-geo.tcl 175 2020-05-03 11:30:30Z lloydwood $ # Draw single plane over Japan for illustrative purposes. # To see global coverage as described in Taleb's work, set this to 6. set NUM_PLANES 1 set desired_longitude 140 set SATS_PER_PLANE 3 # setup orbital elements set a [expr 35786.1+$RADIUS_OF_EARTH] set e 0.0 set inc 45.0 set omega 0.0 set Omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # Presume high-frequency Ka-band use set coverage_angle 40.0 set offset_between_planes [expr 360.0 / $NUM_PLANES ] satellites GV_BEGIN for {set i 0} {$i < $NUM_PLANES} {incr i} { set sat_longitude [expr $desired_longitude + $i * $offset_between_planes] for {set j 0} {$j < $SATS_PER_PLANE} {incr j} { # SaVi handles wraparound beyond +/-180 set Omega [ expr 360.0/$SATS_PER_PLANE * $j + $sat_longitude] set T [expr $T_per / 3 * $j] satellites LOAD $a $e $inc $Omega $omega $T "Quasi-GEO-$j" } } satellites GV_END savi1.6.0/data/viasat-ngso.tcl0000644000175000017500000000301314423445060015302 0ustar lloydlloyd# # * MEDIUM EARTH ORBIT (MEO) SYSTEMS - PROPOSAL # * # * ViaSat NGSO # * # * Originally described in ViaSat's filing to the US FCC: Petition # * for Declaratory Ruling, SAT-LOI-20161115-00120, 15 November 2016. # * Later reduced from 24 to 20 satellites (four planes of five # * satellites) at the same altitude, in a November 2018 modification. # * # * The application was again later modified in May 2020 to be a LEO # * system, modelled in a separate script. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # http://savi.sourceforge.net/ # # https://spacenews.com/viasat-shrinks-meo-constellation-plans/ # Viasat shrinks MEO constellation plans, Caleb Henry, 5 November 2018. # # $Id: viasat-ngso.tcl 177 2020-05-27 04:40:43Z lloydwood $ set SATS_PER_PLANE 8 set NUM_PLANES 3 set INTERPLANE_SPACING 120 set PHASING 0.0 # setup orbital elements set a [expr 8200.0+$RADIUS_OF_EARTH] set e 0.0 set inc 87.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # in Appendix A. set coverage_angle 25.0 satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * $INTERPLANE_SPACING ] if { $j == 1 } { set PHASING 60 } if { $j == 2 } { set PHASING 30 } set T_PHASE [expr $T_per * $PHASING / 360.0 ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * $i / $SATS_PER_PLANE + $T_PHASE ] set n [satellites LOAD $a $e $inc $Omega $omega $T "ViaSat NGSO ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/oneweb.tcl0000644000175000017500000000360714423445060014337 0ustar lloydlloyd# # * PROPOSED LARGE BROADBAND CONSTELLATIONS - 2010s MEGACONSTELLATIONS # * # * OneWeb # * # * Greg Wyler's followup to the popular O3b. # * # * A Walker polar star geometry. Note the 'orbital seam' where # * the footprints of ascending (going north over the Equator) and # * descending (going (south) satellites overlap more to ensure # * continuous coverage. # * # * This simulation is a rough approximation, based only on news reports. # * It is speculative, not authoritative, and not finalised. # * # * "OneWeb’s 150-kilogram satellites will operate in an orbit # * 1,200 kilometers in altitude, in 18 planes of 40 satellites each, # * with an inclination of 87.9 degrees relative to the equator." # * -- OneWeb Pledges Vigilance on Orbital Debris Issue, # * Peter B. de Selding, October 15, 2015. # * # * Filed for US Chapter 11 bankruptcy protection, March 2020, # * after launching 74 satellites. # # http://spacenews.com/oneweb-pledges-vigilance-on-orbital-debris-issue/ # * See http://oneweb.world/ or http://spacenews.com/tag/oneweb/ # $Id: oneweb.tcl 165 2020-03-28 12:51:24Z lloydwood $ set SATS_PER_PLANE 40 set NUM_PLANES 18 # rough guess. set INTERPLANE_SPACING 10.0 # setup orbital elements set a [expr 1200.0+$RADIUS_OF_EARTH] set e 0.0 set inc 87.9 set omega 0.0 # Ku-band, but presume high elevation angle for terminals. set coverage_angle 50.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * $INTERPLANE_SPACING] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { if { $j % 2 == 0} { set plane_offset 0 } else { set plane_offset [expr $T_per / $SATS_PER_PLANE / 2.0] } set T [expr $T_per * $i / $SATS_PER_PLANE + $plane_offset] set n [satellites LOAD $a $e $inc $Omega $omega $T "OneWeb ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/globalstar.tcl0000644000175000017500000000443714423445060015214 0ustar lloydlloyd# # * OPERATIONAL SYSTEMS - 1990s VOICE SYSTEMS # * # * Globalstar # * # * This is the 'perfect' fully-deployed first-generation Globalstar # * system, which provides voice and low-rate data services. # * # * Full constellation launched as of November 1999; notably lost # * twelve satellites on a failed Zenit 2 launch in September 1998. # * Service officially launched in October 1999. # * # * Designed for voice telephony and low-rate data. In the decade while # * Globalstar was being designed and built for Qualcomm, GSM terrestrial # * mobile cellular telephony became widespread, removing the intended # * 'business traveller' market. # * Filed for US Chapter 11 bankruptcy protection # * February 2002, and re-emerged in April 2004. # * # * Despite the name, this does not offer global coverage, and is # * not a Walker polar star constellation. The geometry is that # * of a Walker delta, or a Ballard rosette. # * Does not use intersatellite links; connections are only completed # * when a ground gateway station shares a footprint with a terminal. # * Service and coverage areas are limited by the number of available # * ground stations; there is no service over most oceans, because # * there is no gateway station to complete and connect the call. # * # * Onboard S-band transponders amplifiers failing # * and preventing voice service on a number of Globalstar satellites # * are another limitation on service availability. # * # * A replacement Globalstar-2 constellation was completely launched # * and in service as of September 2013, with satellites built by # * Thales Alenia Space in France. Ocean coverage remains limited. # * # * See also http://www.globalstar.com/ # # $Id: globalstar.tcl 69 2019-08-14 06:13:10Z lloydwood $ set SATS_PER_PLANE 6 set NUM_PLANES 8 # setup orbital elements set a [expr 1406.0+$RADIUS_OF_EARTH] set e 0.0 set inc 52.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] set coverage_angle 10.0 satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * ( double($i) / $SATS_PER_PLANE - 7.5/360.0*$j) ] set n [satellites LOAD $a $e $inc $Omega $omega $T "Globalstar ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/odyssey.tcl0000644000175000017500000000410514423445060014551 0ustar lloydlloyd# # * 1990s VOICE SYSTEMS - PROPOSAL # * # * Odyssey # * # * A Medium Earth Orbit (MEO) system for voice and low-rate data that was # * developed by TRW. Odyssey was cancelled in December 1997 in favour of # * the very similar ICO system. # # from Mitre Corporation report MTR93B0000157, February 1994, for ESA/ESTEC # 'A reevaluation of selected mobile satellite communications systems: # Ellipso, Globalstar, IRIDIUM, Odyssey', Gaffney, Hulkower, Klein, Lam. # Report is classed as 'controlled distribution', yet 'this report is # based solely on open sources of information' (p2) so I can quote it. # this report decribes Odyssey as 3 planes of 4 sats, 55 deg inclination, # min 22 deg elevation angle. # phasing is described as 'the phasing angle between planes one and two # is 60 deg and between planes one and three is 30 deg'. (5.2.1, p87) # 'this configuration provides continuous, near-global coverage by at least # one satellite with a minimum elevation angle of 22 deg and by at least # two satellites with a minimum elevation angle of 10 deg.' # # more recent info (e.g. Tor Wisloff's data) modifies that to 50 degs, # 20 deg min elevation angle for one satellite; I assume the phasing is # basically unchanged. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: odyssey.tcl 170 2020-04-28 03:34:51Z lloydwood $ set SATS_PER_PLANE 4 set NUM_PLANES 3 set INTERPLANE_SPACING 120 set PHASING 0.0 # setup orbital elements set a [expr 10354.0+$RADIUS_OF_EARTH] set e 0.0 set inc 50.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] set coverage_angle 20.0 satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * $INTERPLANE_SPACING ] if { $j == 1 } { set PHASING 60 } if { $j == 2 } { set PHASING 30 } set T_PHASE [expr $T_per * $PHASING / 360.0 ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * $i / $SATS_PER_PLANE + $T_PHASE ] set n [satellites LOAD $a $e $inc $Omega $omega $T "Odyssey ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/telesat-inclined.tcl0000644000175000017500000000324014423445060016275 0ustar lloydlloyd# # * PROPOSED LARGE BROADBAND CONSTELLATIONS - 2010s MEGACONSTELLATIONS # * # * Telesat Lightspeed # * # * Canadian system that combines a Ballard rosette, good at coverage of # * mid-latitudes, with a crude polar star to ensure coverage of highest # * latitudes. # * # * This is the inclined Ballard rosette component. # * # * This is based on Telesat's patent filing: # # * Dual leo satellite system and method for global coverage, # * David Wending, Telesat Canada, WO2017177343A1, October 2017. # https://patents.google.com/patent/WO2017177343A1/en # * # * See also https://www.telesat.com/services/leo/why-leo # * # * Uses intersatellite links, which are not yet simulated here. # # $Id: telesat-inclined.tcl 181 2021-02-13 11:54:42Z lloydwood $ set SATS_PER_PLANE 6 set NUM_PLANES 9 # setup orbital elements set a [expr 1250.0+$RADIUS_OF_EARTH] set e 0.0 set inc 37.4 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] set coverage_angle 10.0 # The patent filing doesn't metnion Walker, but at least it says Ballard. # Plane offset is really a function of harmonic factor in Ballard constellations. # (Rosette Constellations of Earth Satellites, A. H. Ballard, TRW, # IEEE Transactions on Aerospace and Electronic Systems, Vol 16 No 5, Sep. 1980) # 360 / 9 / 5 = 360 / 45 = 8 degrees approx. # satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * ( double($i) / $SATS_PER_PLANE - 8.0/360.0*$j) ] set n [satellites LOAD $a $e $inc $Omega $omega $T "Telesat-inclined ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/theia.tcl0000644000175000017500000000315014423445060014143 0ustar lloydlloyd# # * PROPOSED REMOTE SENSING SYSTEMS # * # * Theia # * # * Theia Holdings plans a large remote sensing constellation, # * which follows a crude polar star geometry. # * # * This follows the spcecification set out in the technical # * narrative related to SAT-LOA-20161115-00121, April 2016. # * # * FCC Approves Theia’s 112-Satellite Earth Imaging Constellation, # * Doug Messier, Parabolic Arc, 10 May 2019. # http://www.parabolicarc.com/2019/05/10/fcc-approves-theias-112satellite-earth-imaging-constellation/ # * # * Uses intersatellite links, which are not yet simulated here. # $Id: theia.tcl 97 2019-09-19 21:02:36Z lloydwood $ set SATS_PER_PLANE 14 set NUM_PLANES 8 # this is what their narrative says. 14 planes = 343 degrees, # which is less than 360. No Walker seam overlap here, but then # it's retrograde. set INTERPLANE_SPACING 24.5 # setup orbital elements set a [expr 800.0+$RADIUS_OF_EARTH] set e 0.0 set inc 98.6 set omega 0.0 # this appears to be an effective minimum for communications. # Remote-sensing swath widths would be far narrower. set coverage_angle 15 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * $INTERPLANE_SPACING] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { if { $j % 2 == 0} { set plane_offset 0 } else { set plane_offset [expr $T_per / $SATS_PER_PLANE / 2.0] } set T [expr $T_per * $i / $SATS_PER_PLANE + $plane_offset] set n [satellites LOAD $a $e $inc $Omega $omega $T "Theia ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/skybridge-80.tcl0000644000175000017500000000352014423445060015262 0ustar lloydlloyd# # * 1990s LARGE BROADBAND PROPOSALS - FAT PIPE DREAMS # * # * SkyBridge (80 satellite final proposal) # * # * The well-documented 64-satellite system with two overlapping # * subconstellations was redesigned into this larger single rosette. # * # * In March 2001, reports of intent to use geostationary satellite # * transponders appeared. SkyBridge was put on hold as of January # * 2002. # * # * See: # * Skybridge will expand its satellite constellation from 64 to 80 # * satellites, Alcatel press release, 1 June 1998. # * # * P. Fraise, B. Coulomb, B. Monteuuis and J.-L. Soula, # * SkyBridge LEO satellites: optimized for broadband communications # * in the 21st century, Proceedings of the IEEE Aerospace conference, # * vol. 1 pp. 241-251, March 2000. # http://10.1109.AERO.2000.879395 # # With thanks to Judith Cote for verifying phase offset information. # # $Id: skybridge-80.tcl 73 2019-08-16 01:35:02Z lloydwood $ set SATS_PER_PLANE 4 set NUM_PLANES 20 # setup orbital elements set a [expr 1469.0+$RADIUS_OF_EARTH] set e 0.0 set inc 53.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # Coverage angle presumed the same as for previous design # supports minimum dual diversity everywhere, at least. set coverage_angle 10.0 # * The constellation phasing repeats every five planes. # * 360/80 = 4.5. Ballard fifth harmonic is 4.5 * 5 = 22.5 degrees. # This is a classic Ballard rosette, much simpler than the # 1997 two-overlapping-rosette 64-satellite design. satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * ( double($i) / $SATS_PER_PLANE - 22.5/360.0*$j) ] set n [satellites LOAD $a $e $inc $Omega $omega $T "SkyBridge-80 ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/aries.tcl0000644000175000017500000000231614423445060014157 0ustar lloydlloyd# # * PROPOSAL # * # * Aries # * # * Constellation Communication Inc. was a joint venture between Raytheon, # * Bell Atlantic, and others. Not built. # * # * See: # * R. A. Summers and R. J. Lepkowski, Aries - Global communication # * through a constellation of low Earth orbit satellites, # * Proceedings of the 14th AIAA International Communication Satellite # * Systems Conference, March, 1992, pp. 628-638. # $Id: aries.tcl 69 2019-08-14 06:13:10Z lloydwood $ set SATS_PER_PLANE 12 set NUM_PLANES 4 # setup orbital elements set a [expr 1018+$RADIUS_OF_EARTH] set e 0.0 set inc 90.0 set omega 0.0 # Uncertain of minimum elevation angle; set to zero. set coverage_angle 0.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 180.0 / $NUM_PLANES] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { if { $j % 2 == 0} { set plane_offset 0 } else { set plane_offset [expr $T_per / $SATS_PER_PLANE / 2.0] } set T [expr $T_per * $i / $SATS_PER_PLANE + $plane_offset] set n [satellites LOAD $a $e $inc $Omega $omega $T "Aries ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/viasat-leo.tcl0000644000175000017500000000344614423445060015125 0ustar lloydlloyd# # * PROPOSED LARGE BROADBAND CONSTELLATIONS - 2010s MEGACONSTELLATIONS # * # * ViaSat LEO # * # * Originally described in ViaSat's filing to the US FCC: Petition # * for Declaratory Ruling, SAT-LOI-20161115-00120, 15 November 2016, # * as a Medium Earth Orbit system. # * # * Later reduced from 24 to 20 satellites (four planes of five # * satellites) at the same altitude, in a November 2018 modification, # * modelled in a separate script. # * # * The application was again later modified in May 2020 to be this # * LEO system. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # http://savi.sourceforge.net/ # # $Id$ set SATS_PER_PLANE 36 set NUM_PLANES 8 set INTERPLANE_SPACING 45.0 set PHASING 0.0 # setup orbital elements set a [expr 1300.0+$RADIUS_OF_EARTH] set e 0.0 set inc 45.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # Coverage angle remains 25 degrees despite the MEO/LEO change. set coverage_angle 25.0 satellites GV_BEGIN # Plane offset is really a function of harmonic factor in Ballard constellations. # (Rosette Constellations of Earth Satellites, A. H. Ballard, TRW, # IEEE Transactions on Aerospace and Electronic Systems, Vol 16 No 5, Sep. 1980) # 360 / 8 / 36 = 360 / 288 = 1.25 degrees approx. # Application confirms 1st harmonic, with 1.25 degrees between planes. set interplane_phasing [expr 360.0 / $NUM_PLANES / $SATS_PER_PLANE] for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * $INTERPLANE_SPACING ] set plane_offset [expr ($T_per / 360) * ($j * $interplane_phasing)] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr ($T_per * $i / $SATS_PER_PLANE) - $plane_offset ] set n [satellites LOAD $a $e $inc $Omega $omega $T "ViaSat LEO ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/molnya.tcl0000644000175000017500000000526014423445060014354 0ustar lloydlloyd# # * GEOSYNCHRONOUS CONSTELLATIONS / HIGHLY ELLIPTICAL # * # * Molnya (Molniya, Russian: 'Lightning') high-latitude coverage # * # * Highly-elliptical orbits useful near apogee. # * # * Originally used since 1965 for Soviet defence satellites, and then # * for television broadcast in 1967 using Orbita Molnya satellites. # * Much of the Soviet Union lies at high latitudes, where satellites # * in geostationary orbit are very low on the horizon, leading # * to the name 'Gorizont', or Horizon, for a series of Soviet # * geostationary satellites. Molnya satellites are higher in the # * sky, and more easily seen. # * # * Three equally-spaced satellites are required to give coverage # * all the time at the desired longitude. Spacing isn't just in the # * same orbit, since that gives apogees at different longitudes. # * Instead, we must also space the right angles of the ascending nodes # * (RAAN), so that different apogees are at the same longitude as the # * Earth rotates. # * # * Project forwards 8 hours then record ground tracks # * to see repeating paths from geosynchronous orbits. # * # * Information from 'Satellite Communication Systems', Maral and # * Bousqet, 2nd/3rd edition, chapter 7; values are set to match # * Figure 7.12. # * # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: molnya.tcl 175 2020-05-03 11:30:30Z lloydwood $ # setup orbital elements # apogee longitude of slow-moving subsatellite point # at a latitude of around 50-63.45 degrees. # positive is east set apogee_longitude 50.0 set NUM_PLANES 3 # constant semi-major axis for these orbits set sma 26556.0 # eccentricity can be from 0.6 to 0.75 set e 0.71 set perigee_altitude [expr ($sma*(1-$e)-$RADIUS_OF_EARTH)] set apogee_altitude [expr ($sma*(1+$e)-$RADIUS_OF_EARTH)] # mean altitude is semi-major axis set a $sma # * Setting minimum transmission altitude to 20,000 km works well # * to turn off transmission away from apogee with some overlap. # * # * savi -min-transmit-altitude 20000 # or uncomment: # set min_transmit_altitude 20000 # inclination must be 63.435 (stationary apogee in northern hemisphere) # or -63.435 (stationary apogee in southern hemisphere) set inc 63.435 set omega 270.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # effective limit of coverage set coverage_angle 5.0 satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { # three planes are spaced by 120 degrees set Omega [expr $j * 360.0 / $NUM_PLANES] # orbital positions are spaced by 120 degrees. # orbits are twelve-hour. set T [expr ($T_per * -(2*$apogee_longitude+$Omega)/360) ] satellites LOAD $a $e $inc $Omega $omega $T "Molyna-$j" } satellites GV_END savi1.6.0/data/mm.tcl0000644000175000017500000000232314423445060013463 0ustar lloydlloyd# # * ELLIPTICAL SYSTEMS - PROPOSAL # * # * Millimeter Wave Satellite proposal # * # * Uses elliptical orbits. Not built. # * # * Described in: A. H. Jackson and P. Christopher, A LEO Concept for # * Millimeter Wave Satellite Communication, Proceedings of the Fourth # * International Mobile Satellite Conference, Ottawa, 1995, pp. 185-192. # * # * A slightly different system is described in: # * A. H Jackson and P. Christopher, Angle diversity for millimeter wave # * satellite communications, Proceedings of the Fifth International # * Conference on Satellite Systems for Mobile Communications and # * Navigation, May 1996, pp. 51-54. # http://dx.doi.org/10.1049/cp:19960407 # # $Id: mm.tcl 69 2019-08-14 06:13:10Z lloydwood $ # number of satellites set IMAX 30 # setup orbital elements set a 8059.0 set e 0.1651396 set inc 63.435 set omega -45.0 set Omega 0.0 set T_per 0.0 set delta_T_per [expr -144.0/180.0*$PI/sqrt($MU/$a/$a/$a)] # Uncertain of minimum elevation angle; set to zero. set coverage_angle 0.0 satellites GV_BEGIN for {set i 0} {$i < $IMAX} {incr i} { satellites LOAD $a $e $inc $Omega $omega $T_per "Millimeter-$i" set Omega [expr $Omega + 12] set T_per [expr $T_per + $delta_T_per] } satellites GV_END savi1.6.0/data/leqo.tcl0000644000175000017500000000221314423445060014010 0ustar lloydlloyd# # * NON-GEOSTATIONARY EQUATORIAL RING - PROPOSAL # * # * LEqO # * # * A satellite constellation designed at the University of Surrey. # * # * A number of small satellites in a low equatorial orbit for # * near-real-time communications for the tropics. Not built. # * # * Uses intersatellite links, which are not yet simulated here. # * # * W. Sun, M. Sweeting and A. da Silva Curiel, # * LEO satellite constellation for regional communications, # * Proceedings of IAF '96. # http://web.archive.org/web/20040220030502/http://personal.ee.surrey.ac.uk/SSC/CSER/UOSAT/papers/iaf96/leqo/leqo.html # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: leqo.tcl 23 2019-06-09 14:54:58Z lloydwood $ set NUM_SATS 8 # setup orbital elements set a [expr 968.2+$RADIUS_OF_EARTH] set e 0.0 set inc 0.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # Elevation angle of five degrees for mobile users. set coverage_angle 5.0 satellites GV_BEGIN set T [expr $T_per ] for {set j 0} {$j < $NUM_SATS} {incr j} { set Omega [expr $j * 360.0 / $NUM_SATS] satellites LOAD $a $e $inc $Omega $omega $T "LEqO-$j" } satellites GV_END savi1.6.0/data/nels.tcl0000644000175000017500000000667314423445060014027 0ustar lloydlloyd# # * 1990s LARGE BROADBAND PROPOSALS - FAT PIPE DREAMS # * # * NeLS (Next-generation LEO System) # * # * Japanese proposal. A rosette with intersatellite links. # * # * Orbital details are given in an investigation of diversity issues: # * # * Hiroshi Tsunoda, Umith Dharmaratna, Nei Kato, Abbas Jamalipour # * and Yoshiaki Nemoto, Network Controlled Handover for Improving # * TCP Performance in LEO Satellite Networks, proceedings of # * Globecom 2006 (see Table 1). # * # * Related diversity aspects and ns simulations discussed in: # * # * Umith Dharmaratna, Hiroshi Tsunoda, Nei Kato and Yoshiaki Nemoto, # * A Proposal for Service Satellite Selection over LEO Satellite # * Networks Using Geographical Location Information, Proceedings # * of the 2003 Joint Conference on Satellite Communications (JC-SAT # * 2003), National Museum of Emerging Science and Innovation, Tokyo, # * 23-24 October 2003, pp. 181-193. # http://register.itfind.or.kr/Report01/200401/KOSST/KOSST-0005/KOSST-0005.pdf # * # * This paper builds on the ideas in Lloyd Wood's PhD thesis (ch. 6) # * and 2001 AIAA diversity paper. # # There are other related papers (not seen by Lloyd): # http://ci.nii.ac.jp/naid/110003222474 # Umith Dharmaratna, Hiroshi Tsunoda, Nei Kato and Yoshiaki Nemoto # A Satellite Selection Method for Walker Delta LEO Satellite Networks, # IEICE transactions on communications E87-B(8), pp. 2124-2131, August # 2004. # Umith Dharmaratna, Hiroshi Tsunoda, Nei Kato, and Yoshiaki Nemoto, # A Proposal for Service Satellite Selection over LEO Satellite # Networks Using Geographical Location Information, IEICE Technical # Report, SAT2003-123, pp. 7-12, 2003. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: nels.tcl 170 2020-04-28 03:34:51Z lloydwood $ set SATS_PER_PLANE 12 set NUM_PLANES 10 # setup orbital elements set a [expr 1200.0+$RADIUS_OF_EARTH] set e 0.0 set inc 55 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # * Mask elevation angle said to be either 13 or 20 degrees; we would # * choose the higher. Simulations suggest 18 degrees is needed for full # * double surface coverage, so we use that. set coverage_angle 18.0 # Plane offset is really a function of harmonic factor in Ballard constellations. # (Rosette Constellations of Earth Satellites, A. H. Ballard, TRW, # IEEE Transactions on Aerospace and Electronic Systems, Vol 16 No 5, Sep. 1980) # 360 / 12 / 10 = 360/120 = 3.0 degrees. # From inspection we select harmonic factor of 9, which looks -almost- # double mesh coverage at 20 degrees mask. # Subtracting nine is the same as adding one. # set interplane_phasing [expr 360.0 / $NUM_PLANES / $SATS_PER_PLANE * 3 * 9] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [ expr $j * 360 / $NUM_PLANES ] set plane_offset [expr ($T_per / 360) * ($j * $interplane_phasing) ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr ($T_per * $i / $SATS_PER_PLANE) - $plane_offset ] set n [satellites LOAD $a $e $inc $Omega $omega $T "NeLS ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END # * This is not the definitive word on NeLS geometry. Also of interest: # * # * R. Suzuki and Y. Yasuda, Study on ISL network structure in LEO satellite # * communication systems, Acta Astronautica, vol. 61, issues 7-8, # * October 2007, pp. 648-658. # http://dx.doi.org/10.1016/j.actaastro.2006.11.015 # * which recommends changes to that geometry. savi1.6.0/data/karousel.tcl0000644000175000017500000000433514423445060014704 0ustar lloydlloyd# # * GEOSYNCHRONOUS CONSTELLATIONS / ELLIPTICAL / MEDIUM EARTH ORBIT (MEO) SYSTEMS - PROPOSAL # * # * Karousel elliptical broadcast constellation # * # * Project forwards 6 hours then record ground tracks # * to see repeating paths from geosynchronous orbits. # * # * From information in their April 2016 FCC Application, # * which was authorised 16 August 2018. # * See document SAT-LOA-20161115-00113 # * # $Id: karousel.tcl 175 2020-05-03 11:30:30Z lloydwood $ set NUM_PLANES 12 # figures given are actually altitudes. set apogee [expr 40002.3+$RADIUS_OF_EARTH] set perigee [expr 31569.5+$RADIUS_OF_EARTH] # setup orbital elements set a [expr ($apogee + $perigee)/2] set e [expr ($apogee - $perigee)/(2*$a)] # for all satellites set inc 63.4 set omega 180.0 # taken directly from SATLOA2016111500113 set anomaly {0.0 90.0 180.0 0.0 90.0 180.0 0.0 90.0 180.0 270.0 270.0 270.0} # ordered differently so that satellites fall in correct loops over continents, # as SaVi initial Earth rotation is different from the rotation offset at the FCC TLE. set RAAN {149.894 59.894 329.894 39.894 309.894 219.894 259.894 169.894 79.894 239.894 129.894 349.894} # FCC application, p. 70: "elevation angles to Karousel satellites will be high # relative to other systems." So, old Ka-band favourite of 40 degrees mask. set coverage_angle 40.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # adjust for different rotation of Earth in FCC filing vs SaVi # just +55 sets up loops in the right place, but we need to reorder RAAN to match # the plot in the figure on p. 29 of the 15 November 2016 Karousel FCC filing. set offset 55.0 satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { # adjust for different rotation of Earth in FCC filing vs SaVi # just +55 sets up loops in the right place, but we need to reorder RAAN to match # the plot in the figure on p. 29 of the 15 November 2016 Karousel FCC filing. set Omega [expr [lindex $RAAN $j] + $offset] set anom [lindex $anomaly $j] # negative, as it's time TO periapsis (or, for Earth, perigee). set T [expr $T_per * -$anom / 360.0] set number [expr $j+1] satellites LOAD $a $e $inc $Omega $omega $T "Karousel-$number" } satellites GV_END savi1.6.0/data/leosat.tcl0000644000175000017500000000500414423445060014340 0ustar lloydlloyd# # * PROPOSED LARGE BROADBAND CONSTELLATIONS - 2010s MEGACONSTELLATIONS # * # * LeoSat # * # * A Walker polar star geometry, using optical intersatellite # * links with the Iridium NEXT bus. Note the 'orbital seam' where # * the footprints of ascending (going north over the Equator) and # * descending (going (south) satellites overlap more to ensure # * continuous coverage. # * # * See Petition for Declatory Ruling, LeoSat MA, Inc., US FCC # * SAT-LOI-20161115-00112, 15 November 2016. # * # * "It's 78-108 satellites in polar orbit at 1,430 kilometers in # * altitude, six orbital planes with 18 satellites each." # * -- Mark Rigolle, CEO of LeoSat, interviewed by Peter B. de Selding # * in "Never Mind the Unconnected Masses, LeoSat’s Broadband Constellation # * is Strictly Business," Space News, 20 November 2015. # http://spacenews.com/nevermind-the-unconnected-masses-leosats-broadband-constellation-is-strictly-business/ # * # * FCC letter SAT-PDR-20161115-00112 of 15 November 2018 clains # * 78 satellites at 90 deg inclination in 6 1400km orbital planes, # * plus 6 in-orbit spares - i.e. the minimum of the range. # * # * LeoSat ceased development in August 2019 (LeoSat, absent # * investors, shuts down, Caleb Henry, SpaceNews, 13 November 2019). # https://spacenews.com/leosat-absent-investors-shuts-down/ # * # * See http://leosat.com/ # * # * Planned intersatellite links, which are not yet simulated here. # $Id: leosat.tcl 130 2019-11-25 04:08:24Z lloydwood $ set SATS_PER_PLANE 13 set NUM_PLANES 6 # this is a rough approximation set INTERPLANE_SPACING 31.0 # setup orbital elements # could be retrograde sun synchronous orbit to simplify solar panel # tracking, at circa 110 degrees, but seems unlikely. set a [expr 1430.0+$RADIUS_OF_EARTH] set e 0.0 # previously 87 deg, but FCC letter says 90. set inc 90.0 set omega 0.0 # needs relatively low elevation angle for terminals. # Technical Annex says 10 degrees, though 25 suposedly gives full coverage. set coverage_angle 10.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * $INTERPLANE_SPACING] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { if { $j % 2 == 0} { set plane_offset 0 } else { set plane_offset [expr $T_per / $SATS_PER_PLANE / 2.0] } set T [expr $T_per * $i / $SATS_PER_PLANE + $plane_offset] set n [satellites LOAD $a $e $inc $Omega $omega $T "LeoSat ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/tundra.tcl0000644000175000017500000000422714423445060014354 0ustar lloydlloyd# # * GEOSYNCHRONOUS CONSTELLATIONS / HIGHLY ELLIPTICAL # * # * Tundra high-latitude coverage - compare with similar Soviet Molnya. # * # * Highly-elliptical orbits useful near apogee. # * # * Two satellites in separate orbits are necessary for full, # * continuous coverage of the chosen point. # * # * Project forwards 12 hours then record ground tracks # * to see repeating paths from geosynchronous orbits. # * # * Information from 'Satellite Communication Systems', Maral and # * Bousquet, 2nd/3rd edition, chapter 7; values are set to match # * Figure 7.13. # * # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: tundra.tcl 175 2020-05-03 11:30:30Z lloydwood $ # setup orbital elements # indicate longitude of slow-moving subsatellite point # at approximate latitude of 60 degrees. # east is positive set apogee_longitude 50 set SATS_PER_PLANE 2 # constant semi-major axis for these orbits set sma 42164.0 # eccentricity can vary from 0.25 to 0.4 # top loop vanishes at 0.37 set e 0.4 set perigee_altitude [expr ($sma*(1-$e)-$RADIUS_OF_EARTH)] set apogee_altitude [expr ($sma*(1+$e)-$RADIUS_OF_EARTH)] set a $sma # * Setting minimum transmission altitude to 40,000 km works well # * to turn off transmission away from apogee with some overlap. # * # * savi -min-transmit-altitude 40000 # or uncomment: # set min_transmit_altitude 40000 # inclination must be 63.435 (stationary apogee in northern hemisphere) # or -63.435 (stationary apogee in southern hemisphere) set inc 63.435 # switch sign around to ensure east is positive set apogee_longitude -$apogee_longitude # 270 degrees gives an optimal orbit # to vary latitude, you need to vary omega and e. set omega 270.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # zero is 90 degrees west set offset_longitude 90 set apogee_longitude [expr ($apogee_longitude-$offset_longitude)] # effective limit of coverage set coverage_angle 5.0 satellites GV_BEGIN for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set Omega [expr $i*180-$apogee_longitude] set T [expr $T_per * $i / $SATS_PER_PLANE ] satellites LOAD $a $e $inc $Omega $omega $T "Tundra-$i" } satellites GV_END savi1.6.0/data/sirius-radio.tcl0000644000175000017500000000577214423445060015477 0ustar lloydlloyd# # * GEOSYNCHRONOUS CONSTELLATIONS / HIGHLY ELLIPTICAL SYSTEMS # * # * Sirius Radio # * # * A three-satellite Molnya-like constellation which uses modified # * Tundra orbits. # * # * Highly-elliptical orbits useful from apogee. # * # * Project forwards 8 hours then record ground tracks # * to see repeating paths from geosynchronous orbits. # * # * Sirius Radio later merged with XM Radio, which offered a competing # * service from geostationary orbit. # # * See http://www.sirius.com/. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: sirius-radio.tcl 175 2020-05-03 11:30:30Z lloydwood $ # information from 'mission overview' Acrobat pdf handout found at: # http://www.ilslaunch.com/launch_schedules/overviews/sirius2.pdf # in September 2000. # Further information at http://www.siriusradio.com/ # Table 1.2 from that handout: # inclination 63.4 +/- 0.5 # eccentricity 0.2684 +/- 0.005 # orbit period 24 hours # relative phasing 8 hours +/- 10 minutes # semi-major axis 42,164 km # pedigree (sic!) radius 24,469 km # apogee radius 47,102 km # RAAN 45.0, 165.0 and 285.0 # argument of perigee 270.0 +/- 0.5 # apogee longitude 96.0W +/- 0.5 # mean anomaly Y=f(RAAN) Y-120, Y-290 # setup orbital elements # indicate longitude of slow-moving subsatellite point # at approximate latitude of 60 degrees. # east is positive set apogee_longitude -96.0 # two satellites in separate 24-hour Tundra orbits are needed # for full, continuous coverage of the chosen area. # Sirius Radio uses three, giving it Molnya-like qualities. set SATS_PER_PLANE 3 # constant semi-major axis for these orbits set sma 42164.0 # eccentricity can vary from 0.25 to 0.4 # top loop vanishes at 0.37 set e 0.2684 set perigee_altitude [expr ($sma*(1-$e)-$RADIUS_OF_EARTH)] set apogee_altitude [expr ($sma*(1+$e)-$RADIUS_OF_EARTH)] set a $sma # inclination must be 63.435 for stationary apogee in northern hemisphere # invert sign for southern hemisphere. set inc 63.4 # switch sign around to ensure east is positive set apogee_longitude -$apogee_longitude # 270 degrees gives an optimal orbit # to vary latitude, you need to vary omega and e. set omega 270.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # zero is 90 degrees west, due to omega set offset_longitude 90 set apogee_longitude [expr ($apogee_longitude-$offset_longitude)] # effective limit of coverage is said to be 60 degrees, but that's # extremely high, and rarely gives double coverage. # We'll need >30 to ensure continuous double # coverage over the continental United States. set coverage_angle 30.0 satellites GV_BEGIN # note introduction of 45 for RAANs at 45+0, 45+120, 45+240. for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set Omega [expr ($i*120)+45-$apogee_longitude ] set T [expr ($T_per * ($i*120+45)/360 ) ] satellites LOAD $a $e $inc $Omega $omega $T "Sirius-Radio-$i" } satellites GV_END savi1.6.0/data/commstellation-78.tcl0000644000175000017500000000314214423445060016340 0ustar lloydlloyd# # * 1990s LARGE BROADBAND PROPOSALS - FAT PIPE DREAMS # * # * COMMstellation # * # * Announced January 2011, with some initial information on # * orbital parameters. It uses a Walker polar star geometry, # * but with a stated distance between seams of thirty degrees # * for six planes there is no adjustment for the counter-rotating # * seam. Minimum elevation angle (10 degrees is assumed, though with # * Walker seam adjustment this could change), phasing (ABAB is # * assumed) and inclination of orbit (90 degrees assumed) are not # * stated. # * # * This is a very approximate simulation, and likely to be altered # * as futher details emerge. # * # * See http://www.commstellation.com/ and http://www.mscinc.ca/ # # most simulation details from: # http://www.commstellation.com/constellation/coverage.html # # $Id: commstellation-78.tcl 69 2019-08-14 06:13:10Z lloydwood $ set SATS_PER_PLANE 12 set NUM_PLANES 6 set INTERPLANE_SPACING 30.0 # setup orbital elements set a [expr 1000.0+$RADIUS_OF_EARTH] set e 0.0 set inc 90.0 set omega 0.0 set coverage_angle 10.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * $INTERPLANE_SPACING] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { if { $j % 2 == 0} { set plane_offset 0 } else { set plane_offset [expr $T_per / $SATS_PER_PLANE / 2.0] } set T [expr $T_per * $i / $SATS_PER_PLANE + $plane_offset] set n [satellites LOAD $a $e $inc $Omega $omega $T "COMMstellation ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/telesat-all.tcl0000644000175000017500000000206714423445060015266 0ustar lloydlloyd# # * PROPOSED LARGE BROADBAND CONSTELLATIONS - 2010s MEGACONSTELLATIONS # * # * Telesat Lightspeed # * # * Canadian system that combines a Ballard rosette, good at coverage of # * mid-latitudes, with a crude polar star to ensure coverage of the highest # * latitudes. # * # * This script loads in both separate constellations. As those # * are at different altitudes and inclinations, they're assumed # * to be unsynchronised. # * # * This is based on Telesat's patent filing: # # * Dual leo satellite system and method for global coverage, # * David Wending, Telesat Canada, WO2017177343A1, October 2017. # https://patents.google.com/patent/WO2017177343A1/en # * # * See also https://www.telesat.com/services/leo/why-leo # * # * Named as Lightspeed in February 2021, when Thales Alenia Space # * was announced as the selected builder. # * # * Uses intersatellite links, which are not yet simulated here. # * # $Id: telesat-all.tcl 182 2021-02-13 12:38:59Z lloydwood $ satellites GV_BEGIN source "data/telesat-polar.tcl" source "data/telesat-inclined.tcl" satellites GV_END savi1.6.0/data/visual.tle0000644000175000017500000005526114423445060014370 0ustar lloydlloydATLAS CENTAUR 2 1 00694U 63047A 09006.70961577 .00000182 00000-0 13852-4 0 8461 2 00694 30.3562 103.1548 0617017 87.7289 279.3760 13.94954952250883 THOR AGENA D R/B 1 00733U 64002A 09006.61892009 .00000003 00000-0 19352-4 0 6719 2 00733 99.1268 20.3723 0034666 140.9706 219.3993 14.31243756341098 SL-3 R/B 1 00877U 64053B 09006.34024649 -.00000072 00000-0 10701-4 0 9833 2 00877 65.0811 292.9578 0083169 246.0746 113.1627 14.58074150351749 SL-8 R/B 1 02802U 67045B 09006.51475216 .00000063 00000-0 26704-4 0 9059 2 02802 74.0110 140.7343 0068427 216.3664 143.2844 14.42444029184209 SL-8 R/B 1 03230U 68040B 09006.64968112 .00000115 00000-0 18148-4 0 5357 2 03230 74.0371 260.8544 0034391 308.7453 51.0655 14.84170101177285 OAO 2 1 03597U 68110A 09007.16168828 .00000013 00000-0 92095-5 0 9462 2 03597 34.9961 265.4724 0005152 71.0426 289.0821 14.44856251111655 ISIS 1 1 03669U 69009A 09005.86996781 -.00000001 00000-0 -17514-4 0 8215 2 03669 88.4392 129.7614 1714944 129.2840 247.3355 11.28853486640898 METEOR 1-1 1 03835U 69029A 09006.17754689 .00001607 00000-0 30850-4 0 9777 2 03835 81.1650 243.7791 0009761 79.7943 280.4390 15.47234726172329 SERT 2 1 04327U 70009A 09005.86297613 .00000032 00000-0 10000-3 0 9638 2 04327 99.2380 249.0145 0005398 17.8629 342.2700 13.58220703928763 SL-3 R/B 1 04814U 70113B 09006.06170800 .00001139 00000-0 60913-4 0 8475 2 04814 81.1489 50.7894 0041387 28.1692 332.1776 15.13501717 65713 SL-3 R/B 1 05118U 71028B 09006.21773294 .00000258 00000-0 17268-4 0 391 2 05118 81.2357 59.1051 0049495 27.6149 332.7730 15.02231173 39804 ASTEX 1 1 05560U 71089A 09005.92320130 .00000085 00000-0 24127-4 0 6995 2 05560 92.7247 291.4094 0015201 302.2967 57.6764 14.46180514955150 SL-8 R/B 1 05730U 71119B 09006.65517206 .00001100 00000-0 84012-4 0 296 2 05730 73.9032 66.9830 0806316 184.6388 174.6932 13.76613241778069 COSMOS 482 DESCENT CRAFT 1 06073U 72023E 09007.15575446 .00014241 29385-5 10991-3 0 5413 2 06073 52.1039 92.9925 2225650 183.6138 174.5801 11.13223403997399 OAO 3 (COPERNICUS) 1 06153U 72065A 09007.07744745 .00000013 00000-0 73984-5 0 765 2 06153 35.0085 255.3829 0006510 165.2190 194.8698 14.56553408930949 ATLAS CENTAUR R/B 1 06155U 72065B 09007.14812471 .00000060 00000-0 14247-4 0 7560 2 06155 35.0075 315.0116 0040987 338.2237 21.6737 14.67945329938222 OPS 8180 (RADCAT) 1 06212U 72076A 09006.01260310 .00002122 00000-0 80656-4 0 6411 2 06212 98.5867 349.3165 0003177 172.2436 187.8868 15.28216626 98103 SL-8 R/B 1 07004U 73107B 09006.49993403 .00000870 00000-0 37928-4 0 9049 2 07004 73.9567 204.8412 0431132 107.1731 257.7116 14.67409359776585 SL-8 R/B 1 07338U 74044B 09006.65029755 .00004858 00000-0 99871-4 0 7670 2 07338 82.8832 233.6791 0223590 289.2558 68.4593 15.23113932774996 DELTA 1 R/B 1 08063U 75072B 09006.55516301 .00008025 00000-0 22297-3 0 1238 2 08063 89.1519 352.5963 0957382 31.2637 334.1970 13.66635923446590 SL-8 R/B 1 08459U 75112B 09006.54729871 -.00000029 00000-0 -10804-5 0 5492 2 08459 74.0612 6.2415 0017170 230.3097 129.6542 14.35873586731499 SL-3 R/B 1 10114U 77057B 09006.92464992 .00000882 00000-0 60100-4 0 7428 2 10114 97.5148 267.6334 0016442 182.4127 177.7059 15.08697457717650 SL-3 R/B 1 10861U 78045B 09006.09933766 .00001272 00000-0 32918-4 0 9043 2 10861 81.2010 273.0079 0020561 181.7384 178.3778 15.38039947680402 SEASAT 1 1 10967U 78064A 09006.29024223 -.00000044 00000-0 28142-4 0 7119 2 10967 108.0142 345.9744 0003570 264.7945 95.2801 14.42121651601839 SL-14 R/B 1 11267U 79011B 09006.65739768 .00000119 00000-0 10513-4 0 6814 2 11267 82.5239 255.6309 0018973 31.7931 328.4449 14.86992660616996 SL-3 R/B 1 11332U 79032B 09006.57092765 .00050315 -15694-7 15066-3 0 1234 2 11332 81.2251 131.4007 0005214 36.3536 323.8088 15.92141020639482 SL-8 R/B 1 11574U 79089B 09006.48658475 -.00000002 00000-0 75898-5 0 1686 2 11574 74.0673 145.4883 0015686 117.4906 242.7847 14.39582167533274 SL-14 R/B 1 11672U 80005B 09006.50218609 .00000095 00000-0 79885-5 0 2872 2 11672 82.5157 104.9799 0019116 96.3203 264.0177 14.86044141565193 SL-3 R/B 1 11849U 80051B 09005.92719384 .00000780 00000-0 33942-4 0 7262 2 11849 97.6768 132.9700 0012369 99.5596 260.7069 15.25358592562934 SL-3 R/B 1 11933U 80069B 09006.91233563 .00001084 00000-0 31987-4 0 5820 2 11933 81.2161 225.5569 0024567 45.1405 315.1843 15.33720817556441 COSMOS 1220 1 12054U 80089A 09006.80333522 .00001407 00000-0 65525-4 0 8907 2 12054 64.9692 104.2832 0069372 233.5448 125.9276 15.22635645443659 SL-8 R/B 1 12139U 81003B 09006.52867903 .00001276 00000-0 76326-4 0 6624 2 12139 82.9577 191.8876 0595353 11.1480 350.2271 14.23925075404186 SL-8 R/B 1 12389U 81033B 09006.05383363 .00002348 00000-0 75963-4 0 2303 2 12389 82.9182 105.4495 0413169 8.8190 352.0033 14.76380477413071 SL-3 R/B 1 12465U 81046B 09006.16137898 .00000882 00000-0 60481-4 0 7231 2 12465 81.2267 300.8326 0039272 105.1576 255.3996 15.04339435502593 METEOR PRIRODA 1 12585U 81065A 09006.82961653 -.00000376 00000-0 -20845-4 0 2776 2 12585 97.4324 58.6976 0018404 273.5646 86.3476 15.07182803496258 SL-3 R/B 1 12904U 81103B 09007.01510517 .00000091 00000-0 56812-5 0 7620 2 12904 81.1771 174.6997 0033933 69.9533 290.5412 14.98459799 30227 SL-3 R/B 1 13068U 82013B 09006.46175221 -.00000028 00000-0 -40119-5 0 7669 2 13068 81.2053 121.2328 0025254 0.8153 359.3167 15.00229919460285 SL-3 R/B 1 13154U 82039B 09006.14534842 .00000184 00000-0 15508-4 0 5264 2 13154 81.1852 94.3155 0044164 199.7691 160.1828 14.92688127442935 COSMOS 1400 1 13402U 82079A 09006.07432145 .00000408 00000-0 13857-4 0 6882 2 13402 81.1335 316.4359 0006872 320.0073 40.0655 15.28102884444519 SL-3 R/B 1 13403U 82079B 09007.13409513 -.00000217 00000-0 -19412-4 0 8845 2 13403 81.1708 176.2114 0038637 292.4303 67.2841 14.99070879433866 SL-3 R/B 1 13819U 83010B 09006.01402207 .00000376 00000-0 24443-4 0 3491 2 13819 81.1053 129.4258 0039472 66.0690 294.4660 15.04984374408586 COSMOS 1484 1 14207U 83075A 09006.50284583 .00002419 00000-0 54425-4 0 2215 2 14207 97.5250 118.5331 0016394 86.3299 273.9841 15.44255435836410 SL-3 R/B 1 14208U 83075B 09006.17076820 .00000667 00000-0 54366-4 0 5201 2 14208 97.7033 61.6908 0047532 214.7143 145.1009 15.02120669383487 COSMOS 1500 1 14372U 83099A 09006.22409890 .00000345 00000-0 22879-4 0 349 2 14372 82.5325 109.5830 0012727 208.9210 151.1330 15.04034091372598 SL-8 R/B 1 14484U 83111B 09006.48128995 .00001867 00000-0 58988-4 0 7718 2 14484 82.8476 334.4251 0439260 124.4837 239.8721 14.71512765276616 COSMOS 1536 1 14699U 84013A 09007.22717261 .00000354 00000-0 27594-4 0 3334 2 14699 82.5265 54.8560 0016457 66.2574 294.0373 14.98018369350645 COSMOS 1544 1 14819U 84027A 09006.55545995 -.00000075 00000-0 -68446-5 0 4077 2 14819 82.5294 187.9827 0012071 358.9178 1.2020 15.07700282349024 SL-14 R/B 1 14820U 84027B 09006.60463758 .00000050 00000-0 32107-5 0 9667 2 14820 82.5423 341.7977 0020335 136.5691 223.7128 14.82081844339047 ERBS 1 15354U 84108B 09007.23565721 -.00000281 00000-0 96835-6 0 53 2 15354 56.9883 99.7311 0022811 124.7054 235.6122 15.15668320327657 SL-8 R/B 1 15483U 85006B 09007.10830905 .00000019 00000-0 15756-4 0 6616 2 15483 74.0446 248.5151 0019661 267.6220 92.2671 14.35202310254113 SL-12 R/B(2) 1 15772U 85042D 09006.54113576 .00000100 00000-0 68152-4 0 8501 2 15772 71.1077 359.1170 0035519 158.5143 201.7466 14.20697035223429 SL-14 R/B 1 15945U 85069B 09007.01970780 .00000075 00000-0 63689-5 0 9450 2 15945 82.5277 136.4527 0020828 8.7153 351.4415 14.82418062264066 SL-3 R/B 1 16111U 85090B 09006.07431116 .00000681 00000-0 34978-4 0 8292 2 16111 97.6193 64.5859 0035482 162.9877 197.2542 15.19531184272487 SL-16 R/B 1 16182U 85097B 09006.50347970 -.00000304 00000-0 -13022-3 0 7568 2 16182 71.0019 14.3393 0005713 96.7097 263.4668 14.15946771199688 SL-14 R/B 1 16496U 86006B 09006.12243606 .00000045 00000-0 25762-5 0 8574 2 16496 82.5225 15.1173 0020403 149.5464 210.6959 14.82517775240210 SL-14 R/B 1 16792U 86046B 09006.63845013 .00000067 00000-0 54941-5 0 7601 2 16792 82.4798 219.8796 0025157 356.5117 3.5933 14.81647142218096 SL-14 R/B 1 16882U 86055B 09007.15239223 .00000082 00000-0 73221-5 0 7518 2 16882 82.5186 235.6059 0021909 110.3529 250.0035 14.81595360211189 EGP (AJISAI) 1 16908U 86061A 09007.18168727 -.00000083 00000-0 10000-3 0 7984 2 16908 50.0118 294.0451 0011415 166.8817 193.2313 12.44461264687552 COSMOS 1812 1 17295U 87003A 09006.21196358 .00000596 00000-0 42973-4 0 8181 2 17295 82.5225 263.1379 0011172 222.4318 137.6040 15.02345538194411 SL-14 R/B 1 17567U 87024B 09007.11603655 .00000048 00000-0 29607-5 0 6538 2 17567 82.5266 200.5979 0021488 64.6732 295.6709 14.82162892179592 COSMOS 1833 1 17589U 87027A 09007.06480728 -.00000191 00000-0 -77127-4 0 2113 2 17589 70.9156 183.4269 0001851 13.2647 346.8522 14.12778484124857 SL-16 R/B 1 17590U 87027B 09005.47065128 -.00000189 00000-0 -71090-4 0 2807 2 17590 70.9991 163.9827 0005515 306.3625 53.7047 14.16464144127287 SL-14 R/B 1 17912U 87038B 09006.63740470 .00000055 00000-0 40734-5 0 6396 2 17912 82.5000 59.5908 0019133 294.9418 64.9810 14.81466391171007 COSMOS 1844 1 17973U 87041A 09006.19382399 -.00000096 00000-0 -25314-4 0 2276 2 17973 70.8934 291.2389 0029109 72.0139 288.4156 14.13708339117245 SL-14 R/B 1 18153U 87055B 09006.23209246 .00000113 00000-0 11235-4 0 6466 2 18153 82.5001 115.8182 0023024 145.1083 215.1660 14.81694438161507 COSMOS 1867 1 18187U 87060A 09006.77953587 -.00000116 00000-0 -58865-5 0 4893 2 18187 65.0099 216.2740 0015669 255.7221 104.2128 14.30848737122816 SL-14 R/B 1 18749U 88001B 09006.94414378 .00000070 00000-0 59011-5 0 6558 2 18749 82.5145 310.0617 0020526 21.3316 338.8762 14.81635622133737 COSMOS 1933 1 18958U 88020A 09006.56353913 .00000089 00000-0 54508-5 0 5292 2 18958 82.5309 181.1904 0011798 276.2741 83.7136 14.96675601129453 SL-3 R/B 1 19046U 88032B 09006.50835041 .00000303 00000-0 32323-4 0 570 2 19046 97.9241 41.8341 0036866 260.4788 99.2273 14.95859917110843 SL-16 R/B 1 19120U 88039B 09005.96105581 .00000072 00000-0 57975-4 0 6678 2 19120 71.0115 359.2389 0025060 235.1471 124.7282 14.18573597 68892 COSMOS 1953 1 19210U 88050A 09007.20310456 .00000214 00000-0 16465-4 0 6407 2 19210 82.5210 118.3959 0014920 255.8059 104.1512 14.96526913115613 SL-8 R/B 1 19257U 88053B 09006.66522605 -.00000005 00000-0 72284-5 0 4837 2 19257 74.0489 119.9304 0019928 54.3703 305.9304 14.36373449 75905 COSMOS 1975 1 19573U 88093A 09006.54242555 .00000284 00000-0 23292-4 0 4159 2 19573 82.5237 63.6710 0015856 277.6134 82.3287 14.95345390 97887 SL-14 R/B 1 19574U 88093B 09006.90641448 .00000082 00000-0 73828-5 0 6366 2 19574 82.5318 143.7821 0021833 184.1681 175.9355 14.81734792 92672 SL-16 R/B 1 19650U 88102B 09006.48548185 .00000118 00000-0 84781-4 0 7628 2 19650 70.9982 17.7508 0015325 200.5910 159.4616 14.15508145 39591 INTERCOSMOS 24 1 20261U 89080A 09005.91490678 .00000055 00000-0 12502-4 0 8931 2 20261 82.5897 203.8361 1215673 352.8331 5.6651 12.53409419879257 SL-14 R/B 1 20262U 89080C 09007.16003399 .00000064 00000-0 95101-5 0 2594 2 20262 82.5863 228.5331 1242871 78.0926 295.6508 12.47745697877084 DELTA 1 R/B 1 20323U 89089B 09006.28226694 .00000042 00000-0 20250-4 0 3575 2 20323 97.0812 46.8746 0074792 50.9792 309.8029 14.46730000 8649 DELTA 2 R/B(1) 1 20453U 90008B 09006.36587650 .00000488 00000-0 39404-4 0 3792 2 20453 35.6368 328.5374 0379043 258.7085 97.0813 14.59156736994388 COSMOS 2058 1 20465U 90010A 09006.31072029 .00000091 00000-0 66441-5 0 3468 2 20465 82.4935 314.2900 0017676 173.3006 186.8444 14.90923931 24996 SL-14 R/B 1 20466U 90010B 09006.60829245 .00000051 00000-0 35990-5 0 2461 2 20466 82.5009 14.1576 0022260 19.0558 341.1481 14.79886891 21262 SL-14 R/B 1 20511U 90018B 09006.92394939 .00000068 00000-0 60700-5 0 2579 2 20511 82.5235 301.8693 0019067 126.8630 233.4342 14.78605773 16270 HST 1 20580U 90037B 09006.22217519 .00000330 00000-0 12713-4 0 2995 2 20580 28.4695 78.9162 0003402 22.5106 337.5637 15.00444770825505 SL-16 R/B 1 20625U 90046B 09006.46425741 .00000288 00000-0 17519-3 0 1954 2 20625 70.9974 139.8288 0013130 114.9032 245.3472 14.14370449961785 COSMOS 2084 1 20663U 90055A 09006.56718628 -.00000107 00000-0 85013-5 0 4057 2 20663 62.7938 20.6618 0068742 352.2269 7.7750 14.85267245 957 SL-6 R/B(2) 1 20666U 90055D 09006.88059062 -.00000016 00000-0 18426-4 0 4743 2 20666 62.7901 313.2359 0089123 17.6059 342.8070 14.86344766 2144 SL-8 R/B 1 20775U 90078B 09006.94600077 .00001198 00000-0 69899-4 0 7692 2 20775 82.9415 342.4520 0729362 216.2488 138.7115 13.97598837913652 SL-8 R/B 1 21088U 91006B 09006.48395356 -.00000036 00000-0 -51405-4 0 2985 2 21088 82.9413 151.9152 0021736 313.0105 46.9235 13.76723175901252 OKEAN 3 1 21397U 91039A 09006.38670740 .00000188 00000-0 18257-4 0 5398 2 21397 82.5221 172.1626 0021492 58.9362 301.3963 14.86784030950831 COSMOS 2151 1 21422U 91042A 09006.30535628 .00000218 00000-0 21248-4 0 1684 2 21422 82.5019 289.2024 0017336 108.9060 251.4017 14.87437806949492 SL-14 R/B 1 21423U 91042B 09006.40527048 .00000063 00000-0 54988-5 0 576 2 21423 82.4941 319.7312 0016130 261.0751 98.8639 14.78385187946791 ERS 1 1 21574U 91050A 09006.65982670 .00000014 00000-0 18848-4 0 3455 2 21574 98.1720 33.3382 0033752 194.1409 165.8846 14.35674497914910 ARIANE 40 R/B 1 21610U 91050F 09006.51953122 .00000068 00000-0 36581-4 0 9179 2 21610 98.6139 331.0853 0003656 110.8212 249.3367 14.39041511916353 UARS 1 21701U 91063B 09006.46064849 .00004531 00000-0 68342-4 0 5600 2 21701 56.9735 353.0684 0076359 213.0532 146.5741 15.53805211954077 INTERCOSMOS 25 1 21819U 91086A 09006.83774900 .00000799 00000-0 15156-3 0 7453 2 21819 82.5553 107.0437 1550362 133.6300 240.4370 11.98956605742037 SL-14 R/B 1 21820U 91086B 09006.46967379 .00000016 00000-0 17986-5 0 5565 2 21820 82.5660 133.2453 1588330 221.8086 125.0434 11.90823267739421 SL-8 R/B 1 21876U 92008B 09006.58657297 .00000039 00000-0 25096-4 0 4811 2 21876 82.9246 248.4492 0035676 2.4974 357.6353 13.75360385847487 SL-8 R/B 1 21938U 92020B 09006.93081108 .00000070 00000-0 56869-4 0 5037 2 21938 82.9301 129.0337 0029547 149.9863 210.2994 13.75033903839540 SL-16 R/B 1 22220U 92076B 09006.42611871 -.00000210 00000-0 -82112-4 0 7921 2 22220 70.9997 68.7258 0014724 286.3015 73.6498 14.16129536834167 SL-16 R/B 1 22285U 92093B 09006.88587408 -.00000208 00000-0 -83228-4 0 8049 2 22285 71.0193 198.7406 0004108 169.9289 190.1900 14.14728449826431 COSMOS 2228 1 22286U 92094A 09007.14283039 .00000117 00000-0 11483-4 0 8584 2 22286 82.5191 28.5633 0020506 229.2036 130.7388 14.83006754864952 SL-16 R/B 1 22566U 93016B 09006.48684122 -.00000296 00000-0 -12925-3 0 5380 2 22566 71.0079 58.0030 0009435 155.0597 205.0964 14.14635833815138 COSMOS 2242 1 22626U 93024A 09006.27213681 .00000138 00000-0 13955-4 0 3826 2 22626 82.5209 57.0581 0018983 232.8230 127.1241 14.83163181848454 SL-16 R/B 1 22803U 93059B 09006.85273345 -.00000287 00000-0 -12006-3 0 7576 2 22803 70.9918 265.1934 0015782 35.6554 324.5605 14.16543077791620 ARIANE 40 R/B 1 22830U 93061H 09006.92818940 .00000002 00000-0 17605-4 0 6273 2 22830 98.5552 318.8674 0010861 322.9628 37.0798 14.30468640797313 COSMOS 2278 1 23087U 94023A 09007.08407122 -.00000177 00000-0 -69189-4 0 106 2 23087 71.0564 320.0724 0011181 245.9274 114.0678 14.13293665758836 SL-16 R/B 1 23088U 94023B 09006.94172101 -.00000226 00000-0 -93165-4 0 4286 2 23088 71.0010 272.0564 0001730 137.3851 222.7395 14.14454601759547 SL-16 R/B 1 23343U 94074B 09007.01663998 .00000003 00000-0 80165-5 0 3630 2 23343 98.0032 334.2407 0006250 219.1235 140.9520 14.74968493762100 SL-16 R/B 1 23405U 94077B 09005.93172663 -.00000048 00000-0 00000-0 0 424 2 23405 70.9797 218.4908 0004239 294.0992 65.9684 14.14913344729213 ERS 2 1 23560U 95021A 09007.09703410 -.00000008 00000-0 13210-4 0 6934 2 23560 98.5651 84.3701 0000748 95.0154 265.1121 14.32240601717150 ARIANE 40+ R/B 1 23561U 95021B 09006.94380808 .00000043 00000-0 29306-4 0 2072 2 23561 98.4176 321.4822 0007927 56.8219 303.3728 14.36358021718445 SL-16 R/B 1 23705U 95058B 09005.50698997 -.00000262 00000-0 -11097-3 0 8522 2 23705 71.0201 19.3509 0013184 310.2078 49.7972 14.14852115680852 SL-16 R/B 1 24298U 96051B 09006.12523790 -.00000144 00000-0 -52151-4 0 9506 2 24298 70.8867 75.0435 0014069 107.6188 252.6472 14.12409210636353 ORBVIEW 2 (SEASTAR) 1 24883U 97037A 09006.53811772 .00000042 00000-0 18741-4 0 6257 2 24883 98.3216 129.6230 0001794 20.4173 339.7101 14.59971154608854 SL-16 R/B 1 25400U 98043G 09006.11676027 -.00000009 00000-0 13685-4 0 1113 2 25400 98.3993 61.0052 0010207 354.3948 5.7115 14.25087650545780 SL-16 R/B 1 25407U 98045B 09005.62494438 .00000182 00000-0 11736-3 0 9361 2 25407 71.0103 41.9244 0009448 231.7976 128.2307 14.15493557539662 ISS (ZARYA) 1 25544U 98067A 09006.52567200 .00012730 00000-0 99439-4 0 130 2 25544 51.6428 54.4350 0007000 165.8125 336.8270 15.72052661580528 SL-8 R/B 1 25723U 99022C 09007.19112729 .00000866 00000-0 59990-4 0 2088 2 25723 48.4432 139.2548 0022027 119.2238 241.0898 15.15956641534879 CZ-4B R/B 1 25732U 99025C 09006.50525937 -.00000030 00000-0 63752-5 0 9986 2 25732 98.6218 346.5381 0036751 266.2881 93.4092 14.17179421499804 OKEAN O 1 25860U 99039A 09007.03562587 .00000037 00000-0 13006-4 0 5689 2 25860 97.7694 354.7807 0001282 41.9506 318.1791 14.73552756509411 SL-16 R/B 1 25861U 99039B 09006.47248140 -.00000038 00000-0 15349-5 0 9334 2 25861 97.6899 2.9512 0016011 334.2380 25.8037 14.76596912510475 SL-14 R/B 1 26874U 01032B 09006.91041380 .00000677 00000-0 18797-4 0 306 2 26874 82.4770 224.6477 0023594 358.6691 1.4530 15.34702577415532 ENVISAT 1 27386U 02009A 09006.51709320 -.00000129 00000-0 -31671-4 0 7645 2 27386 98.5467 76.2130 0001204 104.4795 255.6553 14.32248769358354 IDEFIX & ARIANE 42P R/B 1 27422U 02021B 09006.85924957 -.00000083 00000-0 -15894-4 0 9428 2 27422 98.5377 89.7577 0012257 340.9698 19.1023 14.28475439346373 AQUA 1 27424U 02022A 09006.55299444 .00000104 00000-0 33145-4 0 1180 2 27424 98.2542 310.9568 0000995 83.5515 276.5804 14.57085848355222 CZ-4B R/B 1 27432U 02024C 09006.52836220 -.00000144 00000-0 -53990-4 0 4759 2 27432 98.5573 357.5403 0050712 169.8660 190.3566 14.13593109343078 JB-3 2 (ZY 2B) 1 27550U 02049A 09007.06690634 .00000325 00000-0 15860-4 0 1305 2 27550 97.1307 49.5105 0009892 36.9305 46.7753 15.24611681344936 ADEOS-2 1 27597U 02056A 09006.42228153 .00000116 00000-0 66069-4 0 7510 2 27597 98.4970 75.9661 0001541 65.5829 294.5511 14.26151613315735 H-2A R/B 1 27601U 02056E 09006.41413903 .00000021 00000-0 23933-4 0 5217 2 27601 98.5795 98.2756 0073903 38.7374 321.9080 14.30690171316737 H-2A R/B 1 27700U 03009C 09006.87868415 .00002531 00000-0 69720-4 0 7234 2 27700 97.0329 36.4688 0043061 343.4971 16.4823 15.37123385322917 CZ-4B R/B 1 28059U 03049C 09006.48962474 -.00000015 00000-0 84684-5 0 4615 2 28059 98.5082 126.4766 0050316 266.4859 93.0580 14.51423133276215 CZ-2C R/B 1 28222U 04012C 09007.12080558 .00000049 00000-0 91863-5 0 4910 2 28222 97.4627 61.8495 0053369 237.7297 121.8696 14.96963195257885 SL-16 R/B 1 28353U 04021B 09006.70695154 -.00000249 00000-0 -10629-3 0 2508 2 28353 70.9993 63.3365 0006565 213.6207 146.4511 14.13899256236280 CZ-4B R/B 1 28471U 04044B 09006.21401623 .00002331 00000-0 56985-4 0 2391 2 28471 96.9992 39.1451 0105287 223.9315 135.3525 15.36239481233036 CZ-2C R/B 1 28480U 04046B 09005.73306860 .00000105 00000-0 56601-4 0 4929 2 28480 98.1940 284.9479 0143535 337.8221 21.6794 14.24811887214915 ARIANE 5 R/B 1 28499U 04049H 09006.46963621 .00000057 00000-0 15454-4 0 2854 2 28499 98.2412 340.4305 0097984 30.5477 330.1394 14.77072027218407 CZ-2D R/B 1 28738U 05024B 09006.80160652 -.00000217 00000-0 -12245-4 0 1893 2 28738 97.8171 21.9313 0010804 12.9354 347.2145 15.00786667192058 SUZAKU (ASTRO-EII) 1 28773U 05025A 09006.86938107 .00000239 00000-0 12686-4 0 9065 2 28773 31.4050 210.8918 0006200 77.5076 282.6263 15.00719624191950 ALOS (DAICHI) 1 28931U 06002A 09007.04076719 -.00000168 00000-0 -25602-4 0 3328 2 28931 98.2081 84.0929 0001064 97.1897 262.9428 14.59545348157393 H-2A R/B 1 28932U 06002B 09006.18269758 .00000293 00000-0 40522-4 0 9624 2 28932 98.1909 122.3852 0105865 241.0139 118.0426 14.82528270159691 AKARI (ASTRO-F) 1 28939U 06005A 09006.05214861 .00000100 00000-0 32161-4 0 8890 2 28939 98.2427 10.7745 0007986 329.3924 30.6823 14.57512415152477 M-V-8 R/B 1 28942U 06005D 09007.22996677 .00008572 23475-5 78748-4 0 7916 2 28942 98.1202 140.5171 0196985 57.6063 304.4095 15.48451789161042 RESURS-DK 1 1 29228U 06021A 09007.15035991 .00001079 00000-0 24748-4 0 8952 2 29228 69.9326 81.7309 0155663 65.5577 296.1752 15.35218130143659 COSMOS 2421 1 29247U 06026A 09007.22982020 .00010549 00000-0 14143-3 0 5934 2 29247 65.0351 111.3619 0022051 270.4401 89.4221 15.58148383143983 GENESIS 1 1 29252U 06029A 09006.87882836 .00000232 00000-0 30023-4 0 6796 2 29252 64.5070 150.9592 0049199 235.2359 124.4121 15.03310735136661 H-2A R/B 1 29394U 06037B 09006.53137294 .00003558 00000-0 90683-4 0 7250 2 29394 97.3045 131.1676 0036949 220.7948 139.0532 15.39526723130308 M-V-7 R/B 1 29480U 06041B 09005.92270983 .00033089 29712-5 13970-3 0 7202 2 29480 98.2676 154.7607 0133771 13.9897 346.5011 15.73300699129513 CZ-4B R/B 1 29507U 06046C 09007.08024173 -.00000199 00000-0 -13557-4 0 7208 2 29507 97.6545 16.5536 0045421 126.3227 234.2153 14.92394894120226 SL-8 R/B 1 29659U 06060B 09006.84441636 .00001057 00000-0 40554-4 0 6020 2 29659 98.0830 92.2948 0039809 81.8509 278.7240 15.28420418114387 ATLAS 5 CENTAUR R/B 1 30778U 07006G 09006.23538856 .00000674 00000-0 37340-4 0 4930 2 30778 35.7061 300.1109 0032074 289.5569 70.1694 15.15460330101516 CZ-2C R/B 1 31114U 07010B 09006.24805072 -.00000021 00000-0 91279-5 0 4780 2 31114 98.2928 54.4590 0059944 181.8057 178.2926 14.18620839 90194 GENESIS 2 1 31789U 07028A 09006.53056869 .00000049 00000-0 17094-4 0 4254 2 31789 64.5034 182.9275 0056126 286.1549 73.3390 15.02966466 83833 COSMOS 2428 1 31792U 07029A 09007.05877252 -.00000235 00000-0 -10154-3 0 7110 2 31792 71.0235 27.8941 0010945 253.0382 106.9540 14.12497503 78742 SL-16 R/B 1 31793U 07029B 09006.49518258 .00000282 00000-0 17336-3 0 4471 2 31793 70.9783 24.0967 0001632 256.0402 104.0527 14.14046329 78758 savi1.6.0/data/ellipso.tcl0000644000175000017500000000472514423445060014531 0ustar lloydlloyd# # * ELLIPTICAL SYSTEMS / 1990s VOICE SYSTEMS # * # * NON-GEOSTATIONARY EQUATORIAL RING - PROPOSAL # * # * Ellipso # * # * Combines highly-elliptical orbits useful near apogee with # * an equatorial circular orbit. # * # * Designed by John E. Draim. # * Combines a MEO equatorial ring (the Concordia constellation) # * with an elliptical constellation covering the northern # * hemisphere (the Borealis constellation). Ellipsat CEO David Castiel # * was famously quoted as saying "Frankly, my business plan can do # * without the people on Easter Island." (Joe Flower, Iridium, WIRED # * Magazine 1.05.) It focused on voice telephony and low-rate # * data. GSM terrestrial mobile cellular telephony became widespread, # * and the construction, launch and bankruptcies of the competing # * Iridium and Globalstar efforts indicated a shift in the market. # * # * Not built. Ellipsat Inc. announced an alliance with ICO/Teledesic # * in March 2001. # * # $Id: ellipso.tcl 69 2019-08-14 06:13:10Z lloydwood $ # to ensure overlapping coverage in the northern hemisphere set coverage_angle 25 # # Do ELLIPSO-BOREALIS # set SATS_PER_PLANE 5 set NUM_PLANES 2 set apogee_altitude 7846.0 set perigee_altitude 520.0 # * Setting minimum transmission altitude to 5,000 km works well # * to turn off transmission away from apogee with some overlap. # * # * savi -min-transmit-altitude 5000 # setup orbital elements set a [expr ($apogee_altitude+$perigee_altitude)/2+$RADIUS_OF_EARTH] set e [expr ($apogee_altitude-$perigee_altitude)/(2*$a)] set inc 116.565 set omega -90.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { if { $j % 2 == 0} { set plane_offset 0 } else { set plane_offset [expr $T_per / $SATS_PER_PLANE / 2.0] } set T [expr $T_per * $i / $SATS_PER_PLANE + $plane_offset] satellites LOAD $a $e $inc $Omega $omega $T "Ellipso-Borealis ($j, $i)" } } satellites GV_END # # Do ELLIPSO-CONCORDIA # # setup orbital elements set a [expr 8040.0+$RADIUS_OF_EARTH] set e 0.0 set inc 0 set Omega 0.0 set omega 0.0 set SATS_PER_PLANE 6 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per*$i/$SATS_PER_PLANE] satellites LOAD $a $e $inc $Omega $omega $T "Ellipso-Concordia ($i)" } satellites GV_END savi1.6.0/data/o3b-networks.tcl0000644000175000017500000000653714423445060015422 0ustar lloydlloyd# # * NON-GEOSTATIONARY EQUATORIAL RING - OPERATIONAL SYSTEM # * # * O3b # * # * See http://www.o3bnetworks.com/ # * # * Named for 'the other three billion people' without good network # * service. # * # * Announced with much publicity in September 2008. Investment from # * Google, SES, and others. First four satellites launched in June 2013, # * with operational traffic from January 2014. Second four satellites # * launched July 2014. Third four satellites launched December 2014. # * # Satellite altitude has been altered slightly over time. See: # # Sea Launch signs launch agreement with O3b Networks, press release, # 23 September 2008. # ("equatorial injection orbit of 7,825 kilometers above the earth") # # O3b signs agreement with Arianespace, press release, 17 March 2010. # ("nearly 8,000 kilometers from the earth") # http://www.o3bnetworks.com/AboutUs/faq.html checked 8 April 2011. # "O3b is positioning its satellites in an orbit 8,063km from # Earth.") # Website currently says 8,062km altitude. # http://www.o3bnetworks.com/o3b-advantage/our-technology # checked 12 October 2014. # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: o3b-networks.tcl 71 2019-08-15 08:09:34Z lloydwood $ # * Stated deployment of satellites at 8,062km altitude, # * but only six of the first eight satellites launched were active, # * due to power converter problems with the first four satellites. # * Two of the faulty satellites are not in service, acting as # * on-orbit spares for the other two. See: # * 'Two O3b Satellites Taken Out of Service as a Precaution,' # * Peter de Selding, Space News, 11 September 2014. # * # * After four further satellites were launched in December 2014, # * it was reported in May 2016 that nine satellites are active. See: # * 'SES to take control of O3b Networks,' Space Daily, 6 May 2016. # * # * Four more satellites were laumched in March 2018, and four more # * in April 2019. # # http://www.spacenews.com/article/satellite-telecom/41831world-satellite-business-week-two-o3b-satellites-taken-out-of-service # http://www.spacedaily.com/resports/SES_to_take_control_of_O3b_Networks_999.html # * O3b Networks filed with the US FCC in November 2016 to add satellites # * in high-inclination 70 degree orbits to cover polar latitudes and complete # * global coverage. Two planes of eight satellites each are planned. # * Further satellites with new payloads and frequencies are added to share # * the existing equatorial ring. These are simulated in the other script # * (o3b-networks-full.tcl), which you can Load... in # * to add to this existing constellation. set NUM_SATS [expr 4 - 2 + 4 + 4 - 1 + 4 + 4] # setup orbital elements set a [expr 8062.0+$RADIUS_OF_EARTH] set e 0.0 set inc 0.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # We're told coverage between 45 degrees of latitude. # Ka-band, so a relatively high mask angle can be expected. # But mask must be low to cover up to 45 deg lat consistently. # > 5 degrees elevation for 7.3m diameter gateway stations. # > 15 degrees elevation for 2.4m diameter and larger antennas. # > 20 degrees elevation for 1.8m diameter antennas. set coverage_angle 15.0 satellites GV_BEGIN set T [expr $T_per ] for {set j 0} {$j < $NUM_SATS} {incr j} { set Omega [expr $j * 360.0 / $NUM_SATS] satellites LOAD $a $e $inc $Omega $omega $T "03b Networks-$j" } satellites GV_END savi1.6.0/data/dmc.tcl0000644000175000017500000000623314423445060013621 0ustar lloydlloyd# # * REMOTE SENSING - OPERATIONAL SYSTEM # * # * Disaster Monitoring Constellation (DMC), circa 2006. # * # * A satellite constellation designed at the University of Surrey, # * and built by Surrey Satellite Technology Ltd. # * # * Four satellites are spaced equally in a sun-synchronous plane, # * which ascends over the Equator at 10:15 am, in order after one # * another: # * Alsat-1, NigeriaSat-1, BILSAT-1, UK-DMC. Alsat-1 was launched in # * November 2002, while the other three were launched in September # * 2003. # * # * The fifth satellite, Beijing-1, launched October 2005, is in a # * separate plane which ascends over Equator at 10:30am. # * # * This script turns on sunlight to show the sun-synchronous orbits. # * # * Orbital details from a presentation on the DMC and its # * capabilities: # * David Hodgson, 11th Conference on Control with Remote Sensing of # * Area-based Subsidies, Krakow, Poland, 25 November 2005 (slide 5). # * # * This simulation has not yet been updated to reflect the later # * launches of: # * # * - UK-DMC2 and Deimos-1 on 29 July 2009. # * # * - NigeriaSat-2 and NigeriaSat-X on 17 August 2011. # * # * BilSAT-1 is no longer operational due to batteries no longer # * charging. UK-DMC has now reached end of life, and is no longer # * in operational use. # * # * See also http://www.dmcii.com/. # * # * These satellites use the Internet Protocol to communicate. The # * UK-DMC satellite has acted as a networking testbed with an onboard # * Internet router from Cisco Systems, and became the first satellite # * to run IPv6 and the Delay-Tolerant Networking 'Bundle Protocol'. # # $Id: dmc.tcl 210 2023-04-30 10:31:16Z lloydwood $ # sun-synchronous, so turn on sunlight upvar #0 sun_flag sun_flag set sun_flag 1 set a [expr 686.0+$RADIUS_OF_EARTH] set inc 98.2 set e 0.0 set omega 0.0 # ascending over Equator at 10:15 set Omega [expr 10.25/12 * 180.0] # 0 or 5 degrees would be minimum for ground station visibility. # To get an idea of 600km swath width under DMC satellite, # arctan(686/300) = 66.4 degrees - ignores curvature of Earth. # or 23.6 for half-cones from satellites. # We could set half-cone for correct fisheye behaviour, but then # the popup and subsequently-loaded scripts are incorrect. set coverage_angle 66.4 # set coverage_angle 23.6 # upvar #0 coverage_angle_flag coverage_angle_flag # set coverage_angle_flag 1 # puts stderr "\n\nSaVi: half-cone coverage angle of $coverage_angle deg shows extent of DMC imaging swath." puts stderr "\nSaVi: imaging swath shown. Set mask angle to zero for limits of communications connectivity." set SATS_PER_PLANE 4 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per / $SATS_PER_PLANE * $i ] satellites LOAD $a $e $inc $Omega $omega $T "DMC ($i)" } # 15 minutes difference is 360/24/4 = 3.75 degrees west. set Omega [expr $Omega + 3.75] # optimum intermediate spacing would interleave the satellite with # the other plane; Beijing-1 likely isn't this well-spaced. set T [expr $T_per / $SATS_PER_PLANE /2 ] satellites LOAD $a $e $inc $Omega $omega $T "DMC (Beijing-1)" satellites GV_END savi1.6.0/data/rapideye.tcl0000644000175000017500000000324214423445060014655 0ustar lloydlloyd# # * REMOTE SENSING - OPERATIONAL SYSTEM # * # * RapidEye # * # * Five remote-sensing satellites, spaced equally in a sun-synchronous # * plane. Launched on a single rocket in August 2008. # * # * This script turns on sunlight to show the sun-synchronous orbits. # * # * Satellite platforms constructed by Surrey Satellite Technology Ltd # * (SSTL). # * # * Orbits in the opposite direction to the Disaster Monitoring # * Constellation, also built by SSTL. # * # * See also http://www.rapideye.de/. # # $Id: rapideye.tcl 69 2019-08-14 06:13:10Z lloydwood $ # sun-synchronous, so turn on sunlight upvar #0 sun_flag sun_flag set sun_flag 1 set a [expr 630.0+$RADIUS_OF_EARTH] set inc 98.2 set e 0.0 set omega 0.0 # descending over Equator at 11am - ascends 11pm set Omega [expr 23.0 / 24.0 * 360] # 0 or 5 degrees would be minimum for ground station visibility. # Imaging swath is 6.75 degrees about nadir, corresponding to a swath of # over 70 km at an orbital altitude of 620 km # arctan(630/35) = 86.82 # ignores curvature of Earth set coverage_angle 86.82 # set coverage_angle 6.75 # upvar #0 coverage_angle_flag coverage_angle_flag # set coverage_angle_flag 1 # puts stderr "\n\nSaVi: half-cone coverage angle of $coverage_angle deg shows extent of RapidEye imaging swath." puts stderr "\nSaVi: imaging swath shown. Set mask angle to zero for limits of communications connectivity." set SATS_PER_PLANE 5 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per / $SATS_PER_PLANE * $i ] satellites LOAD $a $e $inc $Omega $omega $T "RapidEye ($i)" } satellites GV_END savi1.6.0/data/orblink.tcl0000644000175000017500000000230114423445060014506 0ustar lloydlloyd# # * NON-GEOSTATIONARY EQUATORIAL RING - PROPOSAL # * # * MEDIUM EARTH ORBIT (MEO) SYSTEMS # * # * Orblink # * # * Announced September 1997 by Orbital Sciences Corporation. # * Not built. # * # * Intended use of intersatellite links, which are not yet # * simulated here. # * # * Based on slides from: # * J. Bravman, J. Fedak and G. Giffin, Infrastructure on Demand - # * Global Fiber-Optic Capacity from EHF Satellite Communications # * Systems, Proceedings of the Fifth International Workshop on # * Satellite Communications, June 1999. # * # * See also: # * K. Coale, Orbital launches into competition, Wired News, # * 25 September 1997. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: orblink.tcl 69 2019-08-14 06:13:10Z lloydwood $ set NUM_SATS 7 # setup orbital elements set a [expr 9000+$RADIUS_OF_EARTH] set e 0.0 set inc 0.0 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # Elevation angle of ten degrees in presentation set coverage_angle 10.0 satellites GV_BEGIN set T [expr $T_per ] for {set j 0} {$j < $NUM_SATS} {incr j} { set Omega [expr $j * 360.0 / $NUM_SATS] satellites LOAD $a $e $inc $Omega $omega $T "Orblink-$j" } satellites GV_END savi1.6.0/data/Makefile0000644000175000017500000000244214423445060014010 0ustar lloydlloyd# # Makefile - SaVi data directory. Run top-level Makefile instead. # # $Id: Makefile 177 2020-05-27 04:40:43Z lloydwood $ SHELL = /bin/sh RM = /bin/rm -f OTHER_SRCS = amazon-project-kuiper-all.tcl amazon-project-kuiper-first.tcl \ amazon_project-kuiper-second.tcl amazon-project-kuiper-third.tcl \ aries.tcl atcontact.tcl audacy.tcl celestri.tcl clarke.tcl \ commstellation-78.tcl deligo.tcl draim-4.tcl dmc.tcl \ ellipso.tcl galileo.tcl globalstar.tcl glonass.tcl gps.tcl \ gs2.tcl ico.tcl iridium-66.tcl karousel.tcl \ laser-light-halo.tcl leqo.tcl leosat.tcl macrocell.tcl \ mm.tcl molnya.tcl nels.tcl nuonce.tcl o3b-networks.tcl \ o3b-networks-full.tcl odyssey.tcl oneweb.tcl orbcomm.tcl \ orblink.tcl quasi-geo.tcl radarsat-rmc.tcl rapideye.tcl \ singh-24hr.tcl singh-48hr.tcl \ sirius-radio.tcl skybridge-64.tcl skybridge-80.tcl spaceway-ngso.tcl \ spacex-starlink-inner.tcl teledesic-288.tcl teledesic-840.tcl \ telesat-all.tcl telesat-polar.tcl telesat-rosette.tcl \ theia.tcl tundra.tcl us-patent-6726152-boeing.tcl \ viasat-leo.tcl viasat-ngso.tcl geo.tle visual.tle all: clean: $(RM) *~ $(CLEAN_FILES) tarfilelist:: @srcs="Makefile $(SRCS) $(OTHER_SRCS)" ; \ for i in $$srcs ; do \ echo "$(CURRENT_DIR)/$$i" >> $(TOP)/fileslist ; \ done savi1.6.0/data/o3b-networks-full.tcl0000644000175000017500000000471714423445060016360 0ustar lloydlloyd# # * MEDIUM EARTH ORBIT (MEO) SYSTEMS - PROPOSAL # * # * O3b additional rings for full global coverage # * # * See http://www.o3bnetworks.com/ # * # * This is the future build-out described in O3b Ltd's November 2016 # * filing with the US FCC to add satellites in high-inclination # * circular orbits to cover polar latitudes. # * # * See "Amendment to Application to Modify U.S. Market Access Grant # * for the O3b Medium Earth Orbit Satellite System," O3b Limited, # * US FCC SAT-AMD-20161115-00116, 15 November 2016. # * # * The other O3b script (o3b-networks.tcl) describes the existing # * operational equatorial ring in detail. These satellites add to # * that, so you can use Load... to bring the other script in and # * simulate all satellites. # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # http://savi.sourceforge.net/ # # $Id: o3b-networks-full.tcl 85 2019-08-19 06:16:16Z lloydwood $ # full equatorial ring - this is the zeroth plane. # 24 new satellites add to 20 existing satellites for the # original O3b constellation, but with four in-orbit spares # for the new constellation, per A.9.1.1 p. 15 of amendment. set NUM_SATS [expr 24 - 4] set inc 0.0 # setup orbital elements set a [expr 8062.0+$RADIUS_OF_EARTH] set e 0.0 # may want to optimise staggering from original constellation set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # We're told coverage between 45 degrees of latitude. # Ka-band, so a relatively high mask angle can be expected. # But mask must be low to cover up to 45 deg lat consistently. # > 5 degrees elevation for 7.3m diameter gateway stations. # > 15 degrees elevation for 2.4m diameter and larger antennas. # > 20 degrees elevation for 1.8m diameter antennas. set coverage_angle 15.0 satellites GV_BEGIN set T [expr $T_per ] for {set j 0} {$j < $NUM_SATS} {incr j} { set Omega [expr $j * 360.0 / $NUM_SATS] satellites LOAD $a $e $inc $Omega $omega $T "O3bN (0, $j)" } # inclined orbits - two planes of eight each. set inc 70.0 set SATS_PER_PLANE 8 set NUM_PLANES 2 # staggering planes slightly so satellites don't cross - use a prime! set phase [expr $T_per / $SATS_PER_PLANE / 7] for {set j 1} {$j <= $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * $i / $SATS_PER_PLANE + $phase * $j] satellites LOAD $a $e $inc $Omega $omega $T "O3bI ($j, $i)" } } satellites GV_END savi1.6.0/data/gs2.tcl0000644000175000017500000000355414423445060013554 0ustar lloydlloyd# # * PROPOSAL # * # * GS-2 (Globalstar proposal) # * # * Intended for voice and data in S-band. # * Information from Globalstar's FCC filing of September 1997. # * Orbital parameters provided on pages 7 and 8. # * This SaVi simulation can be verified against picture on page 9. # * # * Uses intersatellite links, which are not yet simulated here. # * The filing also mentions four geostationary satellites, not simulated. # * Second-generation Globalstar satellites turned out rather # * differently. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: gs2.tcl 170 2020-04-28 03:34:51Z lloydwood $ set SATS_PER_PLANE 8 set NUM_PLANES 8 # setup orbital elements set a [expr 1420.0+$RADIUS_OF_EARTH] set e 0.001 set inc 54.0 set omega 90.0 # minimum elevation mentioned in the Appendix for link budgets is 20 degrees, # but that's insufficient for full coverage. So, we guess less - 14 is minimum. set coverage_angle 14.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # Plane offset is really a function of harmonic factor in Ballard constellations # Rosette Constellations of Earth Satellites, A. H. Ballard, TRW, # IEEE Transactions on Aerospace and Electronic Systems, Vol 16 No 5, Sep. 1980 # 360 / 8 / 8 = 360/64 = 5.625 degrees. # FCC application gives 39.375 degrees, which is what's left # after subtracting from plane spacing of 45 degrees, or 7/8 harmonic. satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES ] # plane offset is 39.375, or 7/8 harmonic of 45 set plane_offset [expr $T_per / 360 * 39.375 ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * $i / $SATS_PER_PLANE - $plane_offset * $j] set n [satellites LOAD $a $e $inc $Omega $omega $T "GS-2 ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/macrocell.tcl0000644000175000017500000000222014423445060015007 0ustar lloydlloyd# # * PROPOSAL # * # * Macrocell # * # * Macrocell was a followup proposal from Iridium, intended to provide # * S-band voice and data. Not built. # * # * See Iridium's FCC filing of 26 September 1997. # * Orbital parameters provided in table 2, page A-7. # * SaVi simulation can be verified against picture on page A-8. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: macrocell.tcl 170 2020-04-28 03:34:51Z lloydwood $ set SATS_PER_PLANE 12 set NUM_PLANES 8 # setup orbital elements set a [expr 852.95+$RADIUS_OF_EARTH] set e 0.0013 set inc 98.8 set omega 270.0 set coverage_angle 15.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 23.5 ] if { $j % 2 == 0} { set plane_offset 0 } else { set plane_offset [expr $T_per / $SATS_PER_PLANE / 2.0] } for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * $i / $SATS_PER_PLANE + $plane_offset] set n [satellites LOAD $a $e $inc $Omega $omega $T "Macrocell ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/teledesic-840.tcl0000644000175000017500000000437614423445060015336 0ustar lloydlloyd# # * 1990s LARGE BROADBAND PROPOSALS - FAT PIPE DREAMS # * # * Teledesic (original Calling 840-active-satellite design) # * # * Uses intersatellite links, which are not yet simulated here. # * # * Announced with much publicity in 1994. With 840 active satellites, # * and 84 on-orbit spares for 924 satellites in orbit, this was # * the largest commercial proposal and the height of dot-com decade # * optimism. # * # * The constellation is a Walker polar star; there is a 2-degree hole # * in coverage at the poles. # * # * Redesigned in 1997 to a reduced 288-active satellite system. # * # * The simulation shows optimum ABABA spacing between co-rotating # * planes. In reality, maintaining phasing between planes for all # * these satellites is recognised to be impossible, making phasing # * offsets random. # * # * See: # * M. Sturza, Architecture of the Teledesic satellite system, # * Proceedings of the International Mobile Satellite Conference '95, # * Ottawa, pp. 214-218. # * # * M. H. Lawrence, D. P. Patterson, J. R Stuart and E. F. Tuck, # * The Calling network: a global wireless communications system, # * International Journal of Satellite Communications. Vol. 12, No. 1, # * Jan-Feb 1994, pp.45-61. # * # * Satellite communication system, Teledesic LLC, # * US Patent 6157621, granted November 2000. # # $Id: teledesic-840.tcl 69 2019-08-14 06:13:10Z lloydwood $ set SATS_PER_PLANE 40 set NUM_PLANES 21 set INTERPLANE_SPACING 9.5 # setup orbital elements set a [expr 750.0+$RADIUS_OF_EARTH] set e 0.00118 set inc 98.7 set omega 0.0 # Ka-band and 40 degrees mask elevation. set coverage_angle 40.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { # space planes evenly so that intersection with the # equatorial plane are separated by INTERPLANE_SPACING. set Omega [expr $j * $INTERPLANE_SPACING] # put planes at different heights set a_plane [expr $a+0.5*$j] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * ($i + $j/double($NUM_PLANES)) / \ $SATS_PER_PLANE ] set n [satellites LOAD $a_plane $e $inc $Omega $omega $T "Teledesic-1994 ($i, $j)"] # only display one orbit in each plane if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/spaceway-ngso.tcl0000644000175000017500000000226714423445060015641 0ustar lloydlloyd# # * MEDIUM EARTH ORBIT (MEO) SYSTEMS - PROPOSAL # * # * Spaceway NGSO # * # * See Hughes Spaceway NGSO FCC filing, 22 December 1997. # * SaVi output can be compared to Figure C-1, p69, Appendix C. # * # * Uses intersatellite links, which are not yet simulated here. # # Zero phasing between planes, since an odd number of sats in planes # 180deg opposed means that sats cross the other plane halfway between # sats in that plane, which is ideal for coverage. Just like ICO. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: spaceway-ngso.tcl 170 2020-04-28 03:34:51Z lloydwood $ set SATS_PER_PLANE 5 set NUM_PLANES 4 # setup orbital elements set a [expr 10352.0+$RADIUS_OF_EARTH] set e 0.0 set inc 55 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # elevation angle of 30 degrees set coverage_angle 30.0 satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * $i / $SATS_PER_PLANE ] set n [satellites LOAD $a $e $inc $Omega $omega $T "Spaceway-NGSO ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/singh-48hr.tcl0000644000175000017500000000316714423445060014754 0ustar lloydlloyd# # * GEOSYNCHRONOUS CONSTELLATIONS / ELLIPTICAL # * # * Singh four-satellite system with 48-hour orbits # * # * Project forwards 48 hours then record ground tracks # * to see repeating paths from geosynchronous orbits. # * # * Singh, L.A., Whittecar, W.R., DiPrinzio, M.D. et al., # * Low cost satellite constellations for nearly continuous # * global coverage, Nature Communications, volume 11, # * article 200, January 2020. # https://dx.doi.org/10.1038/s41467-019-13865-0 # https://www.nature.com/articles/s41467-019-13865-0 # * Orbital information is from the supplementaty information # * to this paper. # * # $Id$ set NUM_PLANES 4 # altitude for all satellites set a 66931.2 set e_list {0.030 0.018 0.018 0.018} set inc_list {86.49 86.81 88.12 85.26} set Omega_list {166.79 114.81 67.67 116.19} set omega_list {134.31 153.05 148.86 155.39} set v0_list {180.00 36.82 175.18 306.35} set coverage_angle 0.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # "The epoch for the elements as presented is November 26, # 1995 at midnight GMT" - and SaVi starts at midnight GMT. # So, no adjustment in RAAN is needed? set offset 0.0 satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr [lindex $Omega_list $j] + $offset] set e [lindex $e_list $j] set inc [lindex $inc_list $j] set omega [lindex $omega_list $j] set anom [lindex $v0_list $j] # negative, as it's time TO periapsis (or, for Earth, perigee). set T [expr $T_per * -$anom / 360.0] set number [expr $j+1] satellites LOAD $a $e $inc $Omega $omega $T "Singh-48hr-$number" } satellites GV_END savi1.6.0/data/audacy.tcl0000644000175000017500000000423614423445060014325 0ustar lloydlloyd# # * MEDIUM EARTH ORBIT - GEOSYNCHRONOUS PROPOSED SYSTEM # * # * Audacy # * # * Intended for use as a relay system for data from # * other satellites. # * # * How this can provide global coverage without the minimum # * of four satellites as determined by Draim is a good question, # * and 'the satellites we're receiving from area much higher' # * is not the best answer to that question. # * # * Uncertain if this simulation attempt is correct, but the # * minimal coverage overlap suggests it's along the right lines. # * # * Project forwards 24 hours then record ground tracks # * to see repeating patha from geosynchronous orbits. # * # * FCC application document SAT-LOA-2016-1115-00117, April 2016. # * # * Uses intersatellite links, which are not yet simulated here. # * # $Id: audacy.tcl 160 2020-02-06 10:51:45Z lloydwood $ set NUM_PLANES 3 # figures given in the schedule are actually radii, explains the # narrative. Unlike Karousel. You'd think the orbits would be higher, # since with only three satellites there will be coverage # gaps on Earth. For satellites at higher altitudes, less so. set a 20270.4 # setup orbital elements # for all satellites set e 0.0 set inc 25.0 set omega 180.0 set anom 0 # SaVi initial Earth rotation is different from the rotation offset at the FCC TLE, # but that shouldn't matter for these circular orbits. # SAT-LOA-2016-1115-00117 gave one with a mean anomaly of 180 deg, # so we just subtract 180 deg from it to get spacing of 120 degrees. set RAAN {37.64 157.64 277.64} # Uses spotbeams, so we set to limit of visibility. # That matters more for receiving gateways, # not for satellites originating data. Assume # gateways are near-equatorial... set coverage_angle 0.0 # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { # could adjust for different rotation of Earth in FCC filing vs SaVi set Omega [lindex $RAAN $j] # negative, as it's time TO periapsis (or, for Earth, perigee). set T [expr $T_per * (-$j * 120.0)/360.0] set number [expr $j+1] satellites LOAD $a $e $inc $Omega $omega $T "Audacy-$number" } satellites GV_END savi1.6.0/data/us-patent-6726152-boeing.tcl0000644000175000017500000000231214423445060017063 0ustar lloydlloyd# # * PROPOSAL # * # * Boeing US patent 6726152 # * # * See: # * US patent 6726152, Satellite communications system, Robert P. Higgins, # * Boeing. # http://www.patentstorm.us/patents/6726152.html # # References Lloyd's 'managing diversity' paper for no good reason. # Phasing seems to have been chosen for a Walker delta; not the Ballard # harmonic you might expect. # # this script for SaVi 1.2, by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: us-patent-6726152-boeing.tcl 170 2020-04-28 03:34:51Z lloydwood $ set SATS_PER_PLANE 5 set NUM_PLANES 4 # setup orbital elements set a [expr 20182.0+$RADIUS_OF_EARTH] set e 0.0 set inc 57 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # elevation angle of 30 degrees set coverage_angle 30.0 # offset between planes is 36 degrees - half of 72 degree phasing. set offset 36 satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * 360.0 / $NUM_PLANES ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * $i / $SATS_PER_PLANE + $T_per * $j * $offset/360] set n [satellites LOAD $a $e $inc $Omega $omega $T "Boeing-Higgins ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/data/celestri.tcl0000644000175000017500000000430014423445060014661 0ustar lloydlloyd# # * 1990s LARGE BROADBAND PROPOSALS - FAT PIPE DREAMS # * # * Celestri # * # * This replaced Motorola's larger M-Star proposal. Not built. # * # * Uses intersatellite links, which are not yet simulated here. # * # * In May 1998, it was announced that Motorola and Teledesic would # * be combining efforts on Teledesic, replacing the then Boeing # * 288-active-satellite Teledesic design. # * # * information used from the Motorola FCC application, June 1997. # # Was available online in Adobe Acrobat pdf format from Motorola; see: # http://lloydwood.users.sourceforge.net/Personal/L.Wood/constellations/celestri/ # for an archived copy. # # Full details are in the scanned pdf of the section titled part two, # on pp. 36-38, including 3D position plot and unprojected coverage # map showing subsatellite points. # # this script for SaVi by Lloyd Wood (lloydwood@users.sourceforge.net) # # $Id: celestri.tcl 116 2019-09-30 07:20:51Z lloydwood $ set SATS_PER_PLANE 9 set NUM_PLANES 7 # setup orbital elements set a [expr 1400.0+$RADIUS_OF_EARTH] set e 0.0013 set inc 48 set omega 0.0 set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # mask elevation angle is 16 degrees, according to page 42. set coverage_angle 16.0 # Plane offset is really a function of harmonic factor in Ballard constellations. # (Rosette Constellations of Earth Satellites, A. H. Ballard, TRW, # IEEE Transactions on Aerospace and Electronic Systems, Vol 16 No 5, Sep. 1980) # 360 / 9 / 7 = 360/63 = 5.714 degrees. # quoted 28.57 degrees is 5x that, or fifth harmonic factor. set interplane_phasing [expr 360.0 / $NUM_PLANES / $SATS_PER_PLANE * 5] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { # FCC application gives 51.43 degrees between planes, but since it's a rosette # we can assume that they're just rounding off. More accurate: set Omega [ expr $j * 360 / $NUM_PLANES ] set plane_offset [expr ($T_per / 360) * ($j * $interplane_phasing) ] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr ($T_per * $i / $SATS_PER_PLANE) - $plane_offset ] set n [satellites LOAD $a $e $inc $Omega $omega $T "Celestri ($j, $i)"] if {$i > 0} {satellites ORBIT_SET $n 0} } } satellites GV_END savi1.6.0/src/0000755000175000017500000000000014423445060012224 5ustar lloydlloydsavi1.6.0/src/globals.c0000644000175000017500000000643114423445060014017 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * globals.c * * declaration and initialization of global variables. * * $Id: globals.c 190 2023-04-02 03:52:19Z lloydwood $ */ #include #include "constants.h" #include "globals.h" /* Is program running as a Geomview module? */ int geomview_module = FALSE; int fake_geomview_module = FALSE; int geomview_oogl_verbose = FALSE; int geomview_logo = TRUE; /* has texturemapping been turned on? */ int texture_flag = TRUE; /* has dynamic texturemapping been selected? */ int geomview_dynamic_texture_flag = FALSE; int geomview_texture_with_map = FALSE; int geomview_detailed_texturemap = FALSE; int geomview_stream_textures = TRUE; /* works on Geomview >= 1.9.0 */ int geomview_compress2_textures = TRUE; /* works on Geomview >= 1.9.5 */ /* does the user want uncompressed files? Assume we're capable until we find otherwise. */ int geomview_compressed_images = TRUE; /* turn off geomview's buggy light source positioning */ int geomview_sun_lighting = FALSE; /* footprints are turned off by default */ int footprints_flag = FALSE; /* sunlight is turned off by default */ int sun_flag = FALSE; /* equatorial plane is turned off by default */ int plane_flag = FALSE; /* fisheye default is not open, and location is not plotted in coverage */ int fisheye_viewpoint_flag = FALSE; /* debug flag to avoid recompiling. Off by default. */ int debug = FALSE; /* Don't show about box as splash screen by default */ int splash_about = FALSE; /* Default to new menu-drawing method, localised for Cygwin and Mac OS X */ /* Known to fail on Mac OS X 10.5 Leopard, hence this fallback method */ int buttons_menu = FALSE; int coverage_all_projections = FALSE; unsigned char * cyl_foreground = NULL; unsigned char * sin_foreground = NULL; unsigned char * unp_foreground = NULL; unsigned char * unp_mask_foreground = NULL; /* presumes default cylindrical projection */ int Longitude_Center_Line = 0; int coverage_display_center_longitude = 0; /* so we know if it has been set at command line. */ int NUM_COLORS = 0; /* useful for elliptical orbits. */ int min_transmit_altitude = -1; int max_transmit_altitude = -1; char * first_filename = NULL; /* empty string */ char EMPTY_str[] = ""; /* default values for panels and initial motion */ unsigned int motion = FALSE; unsigned int reset = FALSE; unsigned int single_step = FALSE; double direction = 1.0; double coverage_angle = COVERAGE_ANGLE; int coverage_type = MASK_ELEVATION; int orbit_model = J2; double tracks_interval = 0; /* in hours */ unsigned int transforms_needed = 0; /* global consts - to link to tcl vars */ int Image_Width = 0; int Image_Height = 0; int Fisheye_Diameter = FISHEYE_DIAMETER; savi1.6.0/src/cones.c0000644000175000017500000001632314423445060013504 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * cones.c * * routines for cones in Geomview * * $Id: cones.c 12 2019-03-09 09:26:35Z lloydwood $ */ #include #include #include #include "globals.h" #include "constants.h" #include "gv_file.h" #include "gv_utils.h" #include "sats.h" #include "orbit_utils.h" #include "savi.h" static unsigned int cones_on_flag = FALSE; static unsigned int cones_geom_exists = FALSE; static unsigned int cones_geom_needs_updating = FALSE; static int cones_angle_used = 0; static char name[] = "cone_ "; static double t[GV_FOOTPRINT_EDGE_SEGMENTS]; static void cone_size(double *radius, double *height, const Satellite s, const Constellation * pconstellation); static void cone_write_geom(const Satellite s, const Constellation * pconstellation); static void cone_gv_delete(const Satellite s); /* * cones_on_cmd() * * Routine to display cones */ char * cones_on_cmd(int argc, char *argv[]) { Constellation *pconstellation; Satellite_list sl; Satellite ps; if (cones_on_flag) return EMPTY_str; pconstellation = get_constellation(); sl = pconstellation->satellites; cones_on_flag = TRUE; cones_geom_needs_updating = TRUE; transforms_needed |= (1 << CONES); gv_start(); while (sl) { ps = sl->s; gv_trans_create(ps); cone_write_geom(ps, pconstellation); sl = sl->next; } write_cones_geom(pconstellation); gv_stop(); /* remember what angle was used */ cones_angle_used = coverage_angle; return EMPTY_str; } /* * cones_off_cmd() * * Routine to turn off display of cones */ char * cones_off_cmd(int argc, char *argv[]) { Satellite_list sl; if (!cones_on_flag) return EMPTY_str; sl = get_constellation()->satellites; transforms_needed &= ~(1 << CONES); gv_start(); cones_gv_delete(); while (sl) { cone_gv_delete(sl->s); sl = sl->next; } cones_geom_needs_updating = FALSE; cones_on_flag = FALSE; gv_stop(); return EMPTY_str; } /* * cones_rebuild() * * Routine to resize all the cones currently built */ void cones_rebuild() { Constellation *pconstellation; Satellite_list sl; if (!cones_on_flag) return; pconstellation = get_constellation(); sl = pconstellation->satellites; gv_start(); while (sl) { cone_write_geom(sl->s, pconstellation); sl = sl->next; } gv_stop(); /* remember what angle was used */ cones_angle_used = coverage_angle; cones_geom_needs_updating = FALSE; } /* * cones_gv_update * * get ready to update drawing in geomview. */ void cones_gv_update() { cones_geom_needs_updating = TRUE; } /* * cones_gv_delete * * routine to delete geomview cones object */ void cones_gv_delete() { if (cones_geom_exists) { gv_delete_geom("Cones"); cones_geom_exists = FALSE; } } /* * cones_relocate * * Called to update the cone when the satellites have all been moved * */ void cones_relocate(const Constellation * pconstellation) { Satellite_list sl; Satellite ps; unsigned int angle_changed; if (!cones_on_flag) return; sl = pconstellation->satellites; angle_changed = (cones_angle_used != coverage_angle); gv_start(); while (sl) { ps = sl->s; if (angle_changed || (ps->oe.e > 0)) { cone_write_geom(ps, pconstellation); } sl = sl->next; } gv_stop(); /* remember what angle was used */ cones_angle_used = coverage_angle; } /* * cone_size * * computes radius and height of cone for given satellite * */ static void cone_size(double *radius, double *height, const Satellite s, const Constellation * pconstellation) { CentralBody *pcb = pconstellation->pcb; double a, r, theta, c, si, temp; a = s->x_S.r - pcb->radius; if (a <= min_transmit_altitude) { *radius = 0; *height = 0; return; } /* coverage_angle is global variable (in degrees) */ theta = coverage_angle * DEG_TO_RAD; c = cos(theta); si = sin(theta); r = s->x_S.r / pcb->radius; if (MASK_ELEVATION == get_coverage_type()) { temp = sqrt(r * r - c * c); *radius = c * (temp - si) / r; *height = temp * (temp - si) / r; } else { if (r * si < 1) { /* cone intersects earth */ if (si == 0) { /* trivial case - theta = 0 */ *radius = 0.0; *height = r - 1.0; } else { *radius = sin(asin(r * si) - theta); *height = (*radius) * c / si; } } else { /* cone does not intersect earth */ *radius = r * si * c; *height = r * c * c; } } } /* * cone_write_geom * * Write cone geom for a satellite */ static void cone_write_geom(const Satellite s, const Constellation * pconstellation) { unsigned int i; for (i = 0; i < GV_FOOTPRINT_EDGE_SEGMENTS - 1; i++) { t[i] = 0.0; } t[GV_FOOTPRINT_EDGE_SEGMENTS - 1] = 1.0; /* compute scaling of cone - a rigid body rotation plus a translation will be applied to the cone to place it so that (0,0,0) will be mapped to the position of the satellite and (0,0,-1) will point to the origin */ cone_size(t, t + 10, s, pconstellation); t[5] = t[0]; /* start of gv cone description */ fprintf(gv_out, "(read geometry {define cone_%d { INST transform { ", s->id); for (i = 0; i < GV_FOOTPRINT_EDGE_SEGMENTS; i++) { fprintf(gv_out, "%g ", t[i]); } fprintf(gv_out, "} geom: cone_h } } )\n"); } /* * cone_display * * Takes a satellite and displays its cone (if turned on). */ void cone_display(Satellite s, const Constellation * pconstellation) { if (!cones_on_flag) return; cones_geom_needs_updating = TRUE; gv_start(); cone_write_geom(s, pconstellation); gv_stop(); } /* * cone_gv_delete * * Takes a satellite and deletes its cone */ static void cone_gv_delete(Satellite s) { sprintf(name + 5, "%-10d", s->id); gv_delete_handle(name); } /* * cone_delete * * Takes a satellite and deletes its cone * ONLY if cones_on_flag == TRUE */ void cone_delete(Satellite s) { if (!cones_on_flag) return; gv_start(); cone_gv_delete(s); gv_stop(); cones_geom_needs_updating = TRUE; } void write_cones_geom(const Constellation * pconstellation) { Satellite ps; Satellite_list sl = pconstellation->satellites; int sid; if (cones_on_flag && cones_geom_needs_updating) { /* write out new list of all satellites */ gv_send("(geometry Cones {LIST\n"); /* always skip sunlight cone */ if (sl) sl = sl->next; while (sl) { ps = sl->s; if (ps->can_display_coverage) { sid = ps->id; fprintf(gv_out, "{ INST transform:trans_%d geom:cone_%d}\n", sid, sid); } sl = sl->next; } gv_send("})\n"); cones_geom_exists = TRUE; cones_geom_needs_updating = FALSE; } } savi1.6.0/src/Makefile_defs_ubuntu0000644000175000017500000000615314423445060016274 0ustar lloydlloyd# # Makefile_defs_ubuntu # # Definitions which work for a Ubuntu (Debian derivative) linux system. # Last tested with Ubuntu 14, which upgrades Tcl/Tk from 8.5 to 8.6. # # Always run make ARCH=platform from the top-level savi directory. # # Ubuntu includes gcc by default, but not always standard C library # header files or Tcl/Tk and the Tcl/Tk header files for compiling # programs. Install those before compiling SaVi, by e.g.: # sudo apt-get install tk-dev # # zlib also needs to be installed if -lz is to be used. # # If using the command line rather than the graphical package manager: # sudo apt-get install build-essentials tcl tk tcl-dev tk-dev zlib1g-dev # make ARCH=ubuntu # # $Id: Makefile_defs_ubuntu 10 2019-01-24 04:47:40Z lloydwood $ ######################################################## # # # Set machine type -- suffix for savi # # # ######################################################## MACH = ubuntu ######################################################## # # # set CC to an ANSI C compiler # # # ######################################################## CC = gcc ######################################################## # # # set TCL_INCLUDES so that the compiler can # # find the tcl.h and tk.h # # # # If tcl/tk is installed in a standard place # # it is not necessary to set this. You may need to # # change the numbers to match your version of tcl/tk. # # The numbers in the topmost savi script should also # # match. # # # ######################################################## TCL_INCLUDES = -I/usr/include/tcl8.6 -I/usr/include/tk8.6 # TCL_INCLUDES = -I/usr/include/tcl -I/usr/include/tk # is a generic alternative to try. ######################################################## # # # set TCL_LIBS so that the compiler can find # # libtcl.a and libtk.a. Alter to suit - see above. # # # ######################################################## # Debian variants, including Ubuntu, require a dot here: -ltcl8.4 -ltk8.4 # as does Red Hat Enterprise. TCL_LIBS = -ltcl8.6 -ltk8.6 # TCL_LIBS = -ltcl -ltk # is a generic alternative to try. ######################################################## # # # Set OTHER_LIBS so that any other stuff needing to # # be linked in will be! # # # ######################################################## OTHER_LIBS = -ldl # OTHER_LIBS = -lz # if zlib compression of textures to Geomview is desired. # OTHER_LIBS = -static savi1.6.0/src/include/0000755000175000017500000000000014423445060013647 5ustar lloydlloydsavi1.6.0/src/include/globals.h0000644000175000017500000001055314423445060015447 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * globals.h * * Global variable declarations * * $Id: globals.h 190 2023-04-02 03:52:19Z lloydwood $ */ #ifndef _GLOBALS_H_ #define _GLOBALS_H_ #define LENGTH_STRING_BUFFER 2048 char cmd[LENGTH_STRING_BUFFER]; char command_switches[LENGTH_STRING_BUFFER]; int geomview_module; /* TRUE if program is a geomview module */ int fake_geomview_module; /* TRUE if pretending to run under geomview */ int geomview_oogl_verbose; /* TRUE if sending comments to geomview or log */ int geomview_logo; /* TRUE if SaVi logo is shown on camera */ int texture_flag; /* TRUE if we're texturemapping */ int geomview_detailed_texturemap; /* TRUE if file available */ int geomview_dynamic_texture_flag; /* TRUE if sending coverage to Geomview. */ int geomview_texture_with_map; /* TRUE if bitmap earthmap included */ int geomview_stream_textures; /* TRUE if we don't need a scratchfile */ int geomview_compress2_textures; /* TRUE if Geomview doesn't have to spawn gzip */ int geomview_compressed_images; /* FALSE if no zlib or -uncompressed. */ int geomview_sun_lighting; /* TRUE if we trust geomview's light sources */ int footprints_flag; /* TRUE if we want to see edges, inc sun terminator */ int plane_flag; /* TRUE if we want to see equatorial plane */ int sun_flag; /* TRUE if we want to see sun lighting */ int fisheye_viewpoint_flag; /* TRUE if we want to plot location on coverage */ int coverage_all_projections; /* TRUE if we want to see not-very-useful projections */ int debug; int splash_about; int buttons_menu; typedef enum { MASK_ELEVATION=0, SATELLITE_CONE } coverage_types; typedef enum { J0=0, J2 } orbit_models; int orbit_model; /* We don't yet have a proper map for SINUSOIDAL centred on 0 deg lat. */ typedef enum { UNPROJECTED_MASK=0, UNPROJECTED, SPHERICAL, SPHERICAL_90, SINUSOIDAL, SINUSOIDAL_90, CYLINDRICAL, NUM_PROJECTIONS } coverage_projections; int coverage_projection; /* * sinusoidal and cylindrical projections can be centered on America * and rotated -90 degrees * cylindrical and unprojected projections are normal - 0 degrees rotation. * Just stretch the coverage window sideways to see tiling. */ int Longitude_Center_Line; int coverage_display_center_longitude; int min_transmit_altitude; int max_transmit_altitude; /* number of colors in use by coverage panel map display */ int NUM_COLORS; char * first_filename; extern char EMPTY_str[]; /* empty string */ char *Version; /* string containing who and when compiled */ unsigned int motion; /* TRUE to move satellites, FALSE to stop them */ unsigned int reset; /* TRUE to reset satellites to original positions */ unsigned int single_step; /* TRUE if take only one step */ double equatorial_exclusion_angle; /* half-width/highest latitude of geo frequency exclusion belt */ double parallels_angle; /* angle marked out in fisheye for parallel lines of latitude */ double delta_t; /* time increment */ double coverage_angle; /* angle for footprints */ int coverage_type; /* mask elevation or the less-used cone angle */ double tracks_interval; /* time interval for computing ground tracks */ unsigned int transforms_needed; /* flag for sending transforms to gv */ /* size of image for coverage display */ int Image_Width; int Image_Height; /* size of fisheye */ int Fisheye_Diameter; /* coverage colors */ int DIV0, DIV1, DIV2, DIV3, DIV4, DIV5, DIV6, DIV7, DIV8, DIV9; int DIV10, DIV11, DIV12, DIV13, DIV14, DIV15, DIV16, DIV17, DIV18, DIV19; int DIV20, DIV21, DIV22, DIV23, DIV24, DIV25, DIV26, DIV27, DIV28, DIV29; int DEC0, DEC1, DEC2, DEC3, DEC4, DEC5, DEC6, DEC7, DEC8, DEC9; int DEC10, DEC11, DEC12, DEC13, DEC14, DEC15, DEC16, DEC17, DEC18, DEC19; int DEC20, DEC21, DEC22, DEC23, DEC24, DEC25, DEC26, DEC27, DEC28, DEC29; #endif /* !_GLOBALS_H_ */ savi1.6.0/src/include/utils.h0000644000175000017500000000336114423445060015163 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * utils.h * */ #ifndef _UTILS_H_ #define _UTILS_H_ #include /* * Define structs for Cartesian and Spherical coordinates */ typedef struct CartesianCoordinates { double x, y, z; } CartesianCoordinates; typedef struct SphericalCoordinates { double r, theta, phi; } SphericalCoordinates; typedef struct LatLon { double lat, lon; } LatLon; unsigned int copyfile(FILE *, const char []); void forward_over_comments(FILE *); void identity(double [4][4]); void error_format(const char[], const char[]); void error_and_exit(const char[]); void error(const char[]); double norm(const CartesianCoordinates *px); void normalize(CartesianCoordinates *px); double dot(const CartesianCoordinates *px, const CartesianCoordinates *py); void cross_product(CartesianCoordinates *pucv, const CartesianCoordinates *pu, const CartesianCoordinates *pv); void print_vec(const char msg[], const CartesianCoordinates *pv); void rotate_z(const CartesianCoordinates *v_old, const double theta, CartesianCoordinates *v_new); void millisleep(const unsigned int ms); #endif /* !_UTILS_H_ */ savi1.6.0/src/include/Satellite.h0000644000175000017500000000660014423445060015750 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * Satellite.h * * $Id: Satellite.h 8 2019-01-24 04:33:00Z lloydwood $ */ #ifndef _SATELLITE_H_ #define _SATELLITE_H_ #include "orbit_utils.h" /* * define the data structure of a single satellite * */ /* 24 in TLE definition, plus zero terminator */ #define SATELLITE_NAME_LENGTH 25 typedef struct satellite { OrbitalElements oe; /* classical orbital elements */ OrbitalElements oe_t; /* orbital elements at time t */ CartesianCoordinates x_C; /* position in geocentric */ SphericalCoordinates x_S; /* coordinate systems at t */ double t; /* time */ double period; /* classical period */ double transform[4][4]; /* transform for use in gv */ float gs_into_view; /* time sat into view on ground*/ float gs_last_into_view; /* previous encounter time */ float gs_last_pass; /* time sat last pass on ground*/ unsigned int can_display_satellite:1; /* satellite display flag */ unsigned int can_display_orbit:1; /* orbit display flag */ unsigned int can_display_coverage:1; /* coverage display flag */ int tag; /* used for marking satellites */ int id; /* identifier of satellite */ char name[SATELLITE_NAME_LENGTH]; /* name identifier */ } *Satellite; /* * define the structure of a list of satellites * */ typedef struct satellite_list { Satellite s; struct satellite_list *next; } *Satellite_list; /* * create array of 'marker' static satellites for equatorial ring */ #define EQUATORIAL_MARKERS 1080 Satellite marker[EQUATORIAL_MARKERS]; /* * define the constellation struct * */ typedef struct constellation { unsigned int n_sats, n_view_sats, n_tag_sats; Satellite_list satellites; CentralBody *pcb; } Constellation; /* declare routines */ Satellite satellite_create(int id, OrbitalElements *poe, CentralBody *pcb); int satellite_name(Satellite s, char* name); void satellite_oe_edited(Satellite s, CentralBody *pcb); void satellite_destroy(Satellite s); void satellite_compute_position(Satellite s, const double t, CentralBody *pcb); void satellite_set_tag(Satellite, int); int satellite_get_tag(Satellite); int constellation_new_id(const Constellation *pconstellation); int constellation_add(Constellation *pconstellation, Satellite s); Satellite constellation_search(const Constellation *pconstellation, int); void constellation_compute_positions(Constellation *pconstellation, double t); void constellation_destroy_element(Constellation *pcosntellation, int); #endif /* !_SATELLITE_H_ */ savi1.6.0/src/include/orbit_utils.h0000644000175000017500000001047114423445060016362 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * orbit_utils.h * * $Id: orbit_utils.h 8 2019-01-24 04:33:00Z lloydwood $ */ #ifndef _ORBIT_UTILS_H_ #define _ORBIT_UTILS_H_ #include "utils.h" /* * Define a struct for orbital elements * * Note: we use time of periapsis whereas it is also common to use * mean anomaly, MA. To convert one to the other use the formula: * T = -MA/360 * 2Pi * a^(3/2) / sqrt(mu) * Where 2Pi * a^(3/2) / sqrt(mu) is of course the period of the orbit. */ typedef struct OrbitalElements { double a, /* length of semi-major axis */ e, /* eccentricity */ i, /* inclination */ Omega, /* longitude of ascending node */ omega, /* argument of periapsis */ T; /* time of periapsis */ } OrbitalElements; /* * Define a struct to hold information about a central body * */ typedef struct CentralBody { double radius, rotation_rate, mu, J2, orbital_period, tilt; } CentralBody; void oe_time_to_geocentric(CartesianCoordinates *px, const double t, const OrbitalElements *poe, const CentralBody *pcb); void oe_time_to_geocentric_spherical(SphericalCoordinates *px, const double t, const OrbitalElements *poe, const CentralBody *pcb); void spherical_to_transform(double T[4][4], const SphericalCoordinates *px, const double scale); void spherical_to_cartesian(CartesianCoordinates *px, const SphericalCoordinates *py); void cartesian_to_spherical(SphericalCoordinates *px, const CartesianCoordinates *py); void oe_time_J0_to_oe(OrbitalElements *final, const OrbitalElements *initial, const double t, const CentralBody *pcb); void oe_time_J2_to_oe(OrbitalElements *final, const OrbitalElements *initial, const double t, const CentralBody *pcb); void oe_time_to_oe(OrbitalElements *final, const OrbitalElements *initial, const double t, const CentralBody *pcb); void oe_time_J0_to_geocentric(CartesianCoordinates * px, const double t, const OrbitalElements * poe, const CentralBody * pcb); void oe_to_geocentric(CartesianCoordinates *px, const OrbitalElements *poe, const CentralBody *pcb); double oe_to_period(const OrbitalElements *poe, const CentralBody *pcb); void perifocal_to_geocentric(CartesianCoordinates *, const CartesianCoordinates *, const double, const double, const double); void lat_lon_to_spherical (const double lat, const double lon, const double t, const CentralBody *pcb, SphericalCoordinates *px); void lat_lon_to_cartesian (const double lat, const double lon, const double t, const CentralBody *pcb, CartesianCoordinates *px); void spherical_to_lat_lon(LatLon *pl, const SphericalCoordinates *px, const double t, const CentralBody *pcb); double eccentric_anomaly_to_true_anomaly (const double E, const double e); double time_to_true_anomaly (const double t, const CentralBody *pcb, const double a, const double e, const double T); int sat_to_fisheye (const CartesianCoordinates *ps, const double lat, const double lon, const CentralBody *pcb, const double t, double sky[2]); void oe_info(FILE *, const OrbitalElements *poe, const CentralBody *pcb); double oe_to_nodal_precession(const OrbitalElements *poe, const CentralBody *pcb); double oe_to_apsidal_rotation(const OrbitalElements *poe, const CentralBody *pcb); double oe_to_apoapsis_altitude(const OrbitalElements *poe, const CentralBody *pcb); double oe_to_periapsis_altitude(const OrbitalElements *poe, const CentralBody *pcb); double mean_anomaly(const double t, const double mu, const double a, const double T); #endif /* !_ORBIT_UTILS_H_ */ savi1.6.0/src/include/tcl_utils.h0000644000175000017500000000300314423445060016016 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * tcl_utils.h * * $Id: tcl_utils.h 8 2019-01-24 04:33:00Z lloydwood $ */ #ifndef _TCL_UTILS_H_ #define _TCL_UTILS_H_ /* necessary to tell Tcl 8.6 to be backwards-compatible * and support interp->result, needed in satCmd.c::satCmd() * and also used in non-critical debug error statements. * Tcl_GetStringResult() / Tcl_SetResult() don't work in 7.x. * http://www.tcl.tk/man/tcl8.6/TclLib/Interp.htm */ #ifndef USE_INTERP_RESULT #define USE_INTERP_RESULT #endif #ifndef _TK #include #endif Tcl_Interp *interp; /* Interpreter for this application. */ unsigned int tcl_init(Tcl_Interp * interpreter); unsigned int tk_init(Tcl_Interp * interpreter); unsigned int tcl_script(char []); unsigned int tk_update(void); extern int satCmd(ClientData, Tcl_Interp *, int, char *[]); extern ClientData get_ClientData(char *); #endif /* !_TCL_UTILS_H_ */ savi1.6.0/src/include/gv_utils.h0000644000175000017500000000457414423445060015666 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * gv_utils.h * * $Id: gv_utils.h 8 2019-01-24 04:33:00Z lloydwood $ */ #ifndef _GV_UTILS_H_ #define _GV_UTILS_H_ #include #include "int_types.h" /* * Try to check if machine has 32-bit unsigned ints and 32-bit floats * and 16-bit shorts, then use a more efficient method of writing to * Geomview. The test is conservative; you may increase performance * with use of binary formats by removing the check, at your own risk. */ #if ((INT_MAX == 2147483647) && (USHRT_MAX == 65535)) #define TEST_FOR_GV_BINARY_FORMAT #endif unsigned char GV_BINARY_FORMAT_AVAILABLE; unsigned char test_ieee_float(void); unsigned char gv_stream_init_proc(void); unsigned char gv_init_proc(void); void gv_send(const char *); char *gv_version(void); void gv_send_binary_ints(const uint32_t *buf, unsigned int n); void gv_send_binary_shorts(const uint16_t *buf, unsigned int n); void gv_send_binary_floats(const float *buf, unsigned int n); unsigned int gv_sendfile(const char *); void gv_wait(void); void gv_begin(void); void gv_start(void); void gv_end(void); void gv_stop(void); void gv_transform(const char *, double [4][4]); void gv_create_geom(const char *, const char *, const char *); void gv_create_geomh(const char *, const char *); void gv_create_alienh(const char *, const char *); void gv_delete_geom(const char *); void gv_delete_handle(const char *); void gv_ui_freeze(int flag); void gv_set_ready(void); unsigned int gv_ready(void); char *gv_begin_cmd(int argc, char *argv[]); char *gv_end_cmd(int argc, char *argv[]); char *gv_wait_cmd(int argc, char *argv[]); char *gv_send_cmd(int argc, char *argv[]); void htonl_buffer(uint32_t *buf, unsigned int n); void htons_buffer(uint16_t *buf, unsigned int n); #endif /* !_GV_UTILS_H_ */ savi1.6.0/src/include/fisheye.h0000644000175000017500000000356014423445060015460 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * fisheye.h * * $Id: fisheye.h 8 2019-01-24 04:33:00Z lloydwood $ */ #ifndef _FISHEYE_H_ #define _FISHEYE_H_ #include "Satellite.h" void fisheye_location(LatLon *); char * fisheye_on_cmd(int argc, char *argv[]); char * fisheye_off_cmd(int argc, char *argv[]); char * fisheye_labels_on_cmd(int argc, char *argv[]); char * fisheye_labels_off_cmd(int argc, char *argv[]); char * fisheye_reverse_view_on_cmd(int argc, char *argv[]); char * fisheye_reverse_view_off_cmd(int argc, char *argv[]); char * fisheye_print_inview_on_cmd(int argc, char *argv[]); char * fisheye_print_inview_off_cmd(int argc, char *argv[]); char * fisheye_names_on_cmd(int argc, char *argv[]); char * fisheye_names_off_cmd(int argc, char *argv[]); char * fisheye_numbers_on_cmd(int argc, char *argv[]); char * fisheye_numbers_off_cmd(int argc, char *argv[]); char * fisheye_times_on_cmd(int argc, char *argv[]); char * fisheye_times_off_cmd(int argc, char *argv[]); char * fisheye_viewpoint_on_cmd(int argc, char *argv[]); char * fisheye_viewpoint_off_cmd(int argc, char *argv[]); char * fisheye_set_cmd(int argc, char *argv[]); void fisheye_display(const Satellite_list SL, unsigned int force, const CentralBody *pcb); #endif /* !_FISHEYE_H_ */ savi1.6.0/src/include/stats_utils.h0000644000175000017500000000336514423445060016405 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * stats_utils.h * * $Id: stats_utils.h 8 2019-01-24 04:33:00Z lloydwood $ */ #ifndef _STATS_UTILS_H_ #define _STATS_UTILS_H_ #include #define MAX(A, B) ((A) < (B) ? (B) : (A)) #define MIN(A, B) ((A) < (B) ? (A) : (B)) /* The coverage grid structure. */ typedef struct grid { int *data; int *noaccess; int *covered; unsigned int height, width, count; } grid; grid *create_grid(int h, int w); void destroy_grid(grid *g); void clear_intensity(grid *g); void fill_interval(grid * g, int value); void decay_interval(grid *g); void fill_grid(const Satellite_list SL, int projection, int fp_angle_type, double footprint_angle, const CentralBody *pcb, grid *g); void intensity_edges(int left[2], int right[2], SphericalCoordinates *point, int projection, grid *g); void project_latlon_sinusoidal(double proj[2], LatLon *point); void project_latlon_cylindrical(double proj[2], LatLon *point); void project_latlon_unprojected(double proj[2], LatLon *point); void project_latlon_spherical(double proj[2], LatLon *point); #endif /* !_STATS_UTILS_H_ */ savi1.6.0/src/include/gv_file.h0000644000175000017500000000154014423445060015433 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * gv_file.h * * $Id: gv_file.h 8 2019-01-24 04:33:00Z lloydwood $ */ #ifndef _GV_FILE_H_ #define _GV_FILE_H_ #include FILE *gv_out; FILE *gv_in; #endif /* !_GV_FILE_H_ */ savi1.6.0/src/include/sats.h0000644000175000017500000000456714423445060015006 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * sats.h * * $Id: sats.h 8 2019-01-24 04:33:00Z lloydwood $ */ #ifndef _SATS_H_ #define _SATS_H_ #include char *forwards_cmd(int argc, char *argv[]); char *backwards_cmd(int argc, char *argv[]); char *forwards_step_cmd(int argc, char *argv[]); char *backwards_step_cmd(int argc, char *argv[]); char *reset_cmd(int argc, char *argv[]); char *stop_cmd(int argc, char *argv[]); void set_realtime(void); char *realtime_on_cmd(int argc, char *argv[]); char *realtime_off_cmd(int argc, char *argv[]); void set_time(double); double current_time(void); void satellite_init(void); void sats_init(void); Constellation *get_constellation(void); double get_central_body_radius(void); unsigned int sats_update(void); char *geomview_on_cmd(int argc, char *argv[]); char *geomview_off_cmd(int argc, char *argv[]); void geomview_set_flag(int flag); char *sats_get_cmd(int argc, char *argv[]); char *sats_set_cmd(int argc, char *argv[]); char *sats_tag_cmd(int argc, char *argv[]); char *sats_untag_cmd(int argc, char *argv[]); char *sats_new_cmd(int argc, char *argv[]); char *sats_copy_cmd(int argc, char *argv[]); char *sats_delete_cmd(int argc, char *argv[]); char *sats_delete_all_cmd(int argc, char *argv[]); char *sats_load_marker_cmd(int argc, char *argv[]); char *sats_load_cmd(int argc, char *argv[]); char *sats_name_cmd(int argc, char *argv[]); char *sats_get_name_cmd(int argc, char *argv[]); char *sats_get_id_cmd(int argc, char *argv[]); char *sats_debug_cmd(int argc, char *argv[]); char *exit_cmd(int argc, char *argv[]); char *reset_params_cmd(int argc, char *argv[]); char *version_cmd(int argc, char *argv[]); char *command_line_cmd(int argc, char *argv[]); void gv_delayed_view_update(void); #endif /* !_SATS_H_ */ savi1.6.0/src/include/coverage_vis.h0000644000175000017500000000623614423445060016503 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * coverage_vis.h * * $Id: coverage_vis.h 135 2020-01-04 10:04:48Z lloydwood $ */ #ifndef _COVERAGE_VIS_H_ #define _COVERAGE_VIS_H_ #include "stats_utils.h" #include "Satellite.h" /* bitmap of geographical boundaries for coverage */ #define CYLINDRICAL_BITMAP_NAME "maps/world.cyl.pbm" #define UNPROJECTED_BITMAP_NAME "maps/world.unp.pbm" #define UNPROJECTED_MASK_BITMAP_NAME "maps/world-mask.unp.pbm" #define SPHERICAL_BITMAP_NAME "maps/world.sph.pbm" #define SPHERICAL_90_BITMAP_NAME "maps/world90W.sph.pbm" #define SINUSOIDAL_BITMAP_NAME "maps/world.sinu.pbm" #define SINUSOIDAL_90_BITMAP_NAME "maps/world90W.sinu.pbm" #define CYLINDRICAL_LARGE_BITMAP_NAME "maps/world1024.cyl.pbm" #define UNPROJECTED_LARGE_BITMAP_NAME "maps/world1024.unp.pbm" #define UNPROJECTED_MASK_LARGE_BITMAP_NAME "maps/world-mask1024.unp.pbm" #define SPHERICAL_LARGE_BITMAP_NAME "maps/world1024.sph.pbm" #define SPHERICAL_90_LARGE_BITMAP_NAME "maps/world90W1024.sph.pbm" #define SINUSOIDAL_LARGE_BITMAP_NAME "maps/world1024.sinu.pbm" #define SINUSOIDAL_90_LARGE_BITMAP_NAME "maps/world90W1024.sinu.pbm" #define LONGITUDE_CENTER_LINE 0.0 #define LONGITUDE_CENTER_LINE_90W (-90.0) /* * Indices to be inserted in the foreground array drawn over coverage. */ enum { COVERAGE_AREA_CI = 0, MAP_OUTLINE_CI, PROJECT_TRACKS_CI, SPECIAL_PROJECT_TRACKS_CI, GROUND_TRACKS_CI, GROUND_TRACKS_CROSS_CI, SPECIAL_GROUND_TRACKS_CI, SPECIAL_GROUND_TRACKS_CROSS_CI, GROUND_LOCATION_CI, GROUND_LOCATION_CROSS_CI }; void write_image_to_file(char *name); int coverage_dynamic_initialised(void); int capable_of_compression(void); void coverage_color_copy(void); int coverage_custom_height_valid(int map_view_height); void image_init(grid *g); void clear_interval(grid *g); void update_display(int projection, grid *g, int coverage_flag, int tracks_flag, int project_tracks_flag); void coverage_send_static_file(void); void coverage_send_scratchfile(void); void coverage_dynamic_cleanup(void); void reset_foreground(int projection, grid *g); void tracks_to_foreground(const Satellite_list SL, int projection, grid *g, unsigned int color_index, const CentralBody *pcb); void latlon_to_foreground(LatLon *pl, int projection, grid * g, unsigned int color_index); void fisheye_to_foreground(int projection, grid * g); void track_to_foreground(Satellite s, int projection, grid *g, unsigned int color_index, const CentralBody *pcb); void grid_and_foreground_to_image(int projection, grid * g, int fgOnly); #endif /* !_COVERAGE_VIS_H */ savi1.6.0/src/include/Makefile0000644000175000017500000000104414423445060015306 0ustar lloydlloyd# # Makefile - SaVi src/include directory. Run top-level Makefile instead. # # $Id: Makefile 8 2019-01-24 04:33:00Z lloydwood $ SHELL = /bin/sh RM = /bin/rm -f SRCS = Satellite.h globals.h orbit_utils.h stats_utils.h \ constants.h gv_file.h gv_utils.h sats.h utils.h \ tcl_utils.h int_types.h savi.h coverage_vis.h \ fisheye.h time.h all: clean: $(RM) *~ $(CLEAN_FILES) tarfilelist: @srcs="Makefile $(SRCS) $(OTHER_SRCS)" ; \ for i in $$srcs ; do \ echo "$(CURRENT_DIR)/$$i" >> $(TOP)/fileslist ; \ done savi1.6.0/src/include/constants.h0000644000175000017500000000513414423445060016037 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * constants.h * * $Id: constants.h 8 2019-01-24 04:33:00Z lloydwood $ */ #ifndef NULL #define NULL (void *)0 #endif #ifndef _CONSTANTS_H_ #define _CONSTANTS_H_ /* * SaVi's Tcl code uses 0 and 1 directly, rather than pulling globals * $TRUE and $FALSE into each procedure. */ #define TRUE 1 #define FALSE 0 /* for file-handling routines */ #define NOT_OK -1 #define HANDLE_FILE_SAVI "oogl/savi.oogl" #define HANDLE_FILE_LOGO "oogl/savilogo.oogl" #define AMBIENT_LIGHTING "oogl/ambient_light.oogl" #define EARTH_YEAR (365.25*24*3600) #define EARTH_TILT 23.5 #define TCL_DIR "tcl" #ifndef PI #define PI 3.14159265358979324 #define TWOPI 6.2831853071795865 #define HALFPI 1.570796326794897 #else #define TWOPI PI*2 #define HALFPI PI/2 #endif #define DEG_TO_RAD (PI/180.0) #define RAD_TO_DEG (180.0/PI) #define SECS_PER_DAY (3600*24) #define ANOMALY_COMPUTATION_TOLERANCE 1e-5 /* The gravitational parameter MU. Units are km^3/s^2 */ #define EARTH_MU 398601.2 #define EARTH_RADIUS 6378.14 /* km */ /* * Earth's rotation rate (in geocentric equatorial coordinates) is * (2*PI+2*PI/365.25) radians per day. * The second term accounts for the fact that the Earth is orbiting * the sun. The factor is 1/365.25 rather than 1/365 because of leap * year effects. The rate below is radians per second. */ #define EARTH_ROTATION_RATE (TWOPI*1.160576e-5) #define EARTH_OBLATENESS 1.0826e-3 /* Parameters for coverage display */ #define IMAGE_HEIGHT 300 #define IMAGE_WIDTH 600 #define IMAGE_LARGE_HEIGHT 512 #define IMAGE_LARGE_WIDTH 1024 #define IMAGE_MIN_HEIGHT 8 #define IMAGE_MAX_HEIGHT 2048 #define COVERAGE_ANGLE 0.0 /* set sensible diameter for fisheye view */ #define FISHEYE_DIAMETER 300 /* parameters for Geomview display */ /* number of segments in cone surface/footprint cannot be changed */ #define GV_FOOTPRINT_EDGE_SEGMENTS 16 /* increased for fidelity on highly elliptical orbits. */ #define GV_ORBIT_SEGMENTS 90 #endif /* !_CONSTANTS_H_ */ savi1.6.0/src/include/savi.h0000644000175000017500000001730714423445060014772 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * savi.h * * headers for the different functions * * $Id: savi.h 133 2020-01-04 09:17:43Z lloydwood $ */ #ifndef _SAVI_H_ #define _SAVI_H_ #include "Satellite.h" #include "stats_utils.h" /* gv_init.c */ void gv_sat_create(Satellite, const Constellation *pconstellation); void gv_trans_create(Satellite); void gv_sat_list_create(const Constellation *pconstellation); void gv_trans_list_create(Satellite_list); unsigned int gv_init(void); /* earth.c */ void redraw_earth(int argc, char *argv[]); char *earth_off_cmd(int argc, char *argv[]); void earth_place(double t, const CentralBody *pcb); char *earth_on_cmd(int argc, char *argv[]); char *simple_off_cmd(int argc, char *argv[]); char *simple_on_cmd(int argc, char *argv[]); char *fancy_off_cmd(int argc, char *argv[]); char *fancy_on_cmd(int argc, char *argv[]); char *texture_on_cmd(int argc, char *argv[]); char *texture_off_cmd(int argc, char *argv[]); char *geomview_dynamic_texture_on_cmd(int argc, char *argv[]); char *geomview_dynamic_texture_off_cmd(int argc, char *argv[]); /* sun.c */ char *sun_off_cmd(int argc, char *argv[]); void sun_place(double t, const CentralBody *pcb); char *sun_on_cmd(int argc, char *argv[]); /* plane.c */ char *plane_cmd(int argc, char *argv[]); char *plane_off_cmd(int argc, char *argv[]); /* satellites.c */ char *satellites_on_cmd(int argc, char *argv[]); char *satellites_off_cmd(int argc, char *argv[]); char *satellites_set_cmd(int argc, char *argv[]); char *fancy_sat_on_cmd(int argc, char *argv[]); char *fancy_sat_off_cmd(int argc, char *argv[]); char *planes_sat_on_cmd(int argc, char *argv[]); char *planes_sat_off_cmd(int argc, char *argv[]); char *box_sat_on_cmd(int argc, char *argv[]); char *box_sat_off_cmd(int argc, char *argv[]); char *sphere_sat_on_cmd(int argc, char *argv[]); char *sphere_sat_off_cmd(int argc, char *argv[]); char *fast_marker_sat_on_cmd(int argc, char *argv[]); char *fast_marker_sat_off_cmd(int argc, char *argv[]); void satellite_display(Satellite s, const Constellation *pconstellation); void satellites_relocate(const Constellation *pconstellation); void satellite_delete(Satellite s); void satellites_gv_delete(void); void write_satellites_geom(const Constellation *pconstellation); /* orbits.c */ char *orbits_on_cmd(int argc, char *argv[]); char *orbits_off_cmd(int argc, char *argv[]); char *orbits_set_cmd(int argc, char *argv[]); void orbit_display(Satellite s, const Constellation *pconstellation); void orbits_relocate(const Constellation *pconstellation); void orbit_delete(Satellite s); void orbits_gv_delete(void); void write_orbits_geom(const Constellation *pconstellation); /* cones.c */ char *cones_on_cmd(int argc, char *argv[]); char *cones_off_cmd(int argc, char *argv[]); void cones_rebuild(void); void cones_relocate(const Constellation *pconstellation); void cone_display(Satellite, const Constellation *pconstellation); void cone_delete(Satellite s); void cones_gv_update(void); void cones_gv_delete(void); void write_cones_geom(const Constellation *pconstellation); /* footprints.c */ char *footprints_on_cmd(int argc, char *argv[]); char *footprints_off_cmd(int argc, char *argv[]); void footprints_rebuild(void); void footprints_relocate(const Constellation *pconstellation); void footprint_display(Satellite s, const Constellation *pconstellation); void footprint_delete(Satellite s); void footprints_gv_update(void); void footprints_gv_delete(void); void write_footprints_geom(const Constellation *pconstellation); /* coverage.c */ void redraw_coverage_display(void); void update_coverage_display(void); void clear_coverage(void); void coverage_decay(void); void coverage_compute(const Satellite_list sl, unsigned int, const CentralBody *pcb); void coverage_display(const Satellite_list sl, unsigned int, const CentralBody *pcb); char *coverage_map_on_cmd(int argc, char *argv[]); char *coverage_map_off_cmd(int argc, char *argv[]); char *coverage_on_cmd(int argc, char *argv[]); char *coverage_off_cmd(int argc, char *argv[]); char *coverage_set_cmd(int argc, char *argv[]); char *no_access_on_cmd(int argc, char *argv[]); char *no_access_off_cmd(int argc, char *argv[]); char *print_access_on_cmd(int argc, char *argv[]); char *print_access_off_cmd(int argc, char *argv[]); char *map_on_cmd(int argc, char *argv[]); char *map_off_cmd(int argc, char *argv[]); int get_map_flag(void); int get_coverage_type(void); void tracks_compute(const Satellite_list sl, const CentralBody *pcb); char *tracks_on_cmd(int argc, char *argv[]); char *tracks_off_cmd(int argc, char *argv[]); char *project_tracks_on_cmd(int argc, char *argv[]); char *project_tracks_off_cmd(int argc, char *argv[]); void project_tracks_reset(void); char *coverage_proj_cmd(int argc, char *argv[]); char *coverage_save_map_cmd(int argc, char *argv[]); char *coverage_save_plot_cmd(int argc, char *argv[]); char *coverage_angle_type_cmd(int argc, char *argv[]); char *coverage_color_update_cmd(int argc, char *argv[]); double mean_coverage(int projection_type, grid *g); void init_coverage_time(void); void update_coverage_time(void); double total_coverage(int projection_type, int output, grid *g); /* axes.c */ char *axes_on_cmd(int argc, char *argv[]); char *axes_off_cmd(int argc, char *argv[]); /* logo.c */ char *logo_on_cmd(int argc, char *argv[]); char *logo_off_cmd(int argc, char *argv[]); /* stars.c */ char *stars_on_cmd(int argc, char *argv[]); char *stars_off_cmd(int argc, char *argv[]); typedef struct ViewModule { /* function called to extend geom to include new satellite or rewrite old satellite stuff; called by delayed_stuff */ void (*write_geom_fn)(const Constellation *); /* function that must be called if the coverage angle/type is changed; called by coverage_angle_type_cmd */ void (*coverage_rebuild_fn)(void); /* function used to display object when a new satellite is created; called by satellite_gv_create */ void (*display_fn)(Satellite, const Constellation *); /* function used to relocate objects when the satellites have movied; called by satellite_gv_create */ void (*relocate_fn)(const Constellation *); /* function to delete item associated to an individual satellite; called by sats_delete_cmd */ void (*delete_fn)(Satellite); /* function called to turn options off; called by exit_cmd. These functions usually also call the corresponding gv_delete_fn. */ char *(*off_cmd)(int, char *[]); /* function called to eliminate all trace of object in Geomview; called by sats_delete_all when all the satellites are deleted. */ void (*gv_delete_fn)(void); } ViewModule; typedef struct CompModule { void (*update_fn)(const Constellation *); } CompModule; extern ViewModule view_modules[]; const int N_VIEW_MODULES; extern CompModule comp_modules[]; const int N_COMP_MODULES; /* * These are used to provide unique identifiers for modules which * require certain information to be computed. They are used like: * * transforms_needed |= (1 << FOOTPRINTS); <--- on * transforms_needed &= ~(1 << FOOTPRINTS); <--- off */ typedef enum { SATELLITES=0, CONES, FOOTPRINTS } Module_Codes; #endif /* !_SAVI_H_ */ savi1.6.0/src/include/int_types.h0000644000175000017500000000231414423445060016036 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * int_types.h * * $Id: int_types.h 8 2019-01-24 04:33:00Z lloydwood $ */ #ifndef _INT_TYPES_H_ #define _INT_TYPES_H_ /* traditional */ #include /* modern C99 definitions file not used by many compilers. */ #include /* * If the modern uint16_t type isn't included, map it * to the older u_int16_t type from BSD, which is likely to * exist instead. Ditto for uint32_t -> u_int32_t. */ #ifndef uint16_t #define uint16_t u_int16_t #endif #ifndef uint32_t #define uint32_t u_int32_t #endif #endif /* !_INT_TYPES_H_ */ savi1.6.0/src/include/time.h0000644000175000017500000000163114423445060014757 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * time.h * * $Id: time.h 8 2019-01-24 04:33:00Z lloydwood $ */ #ifndef _TIME_H_ #define _TIME_H_ void time_update(const double); void coverage_time_update(const double); void coverage_init_time_update(const double); #endif /* !_TIME_H_ */ savi1.6.0/src/Makefile_defs_irix0000644000175000017500000000446414423445060015730 0ustar lloydlloyd# # Makefile_defs_irix # # Definitions which work for SGI Irix systems. # # Supported by Nekochan: # http://forums.nekochan.net/viewtopic.php?t=16730306 # # Always run make ARCH=platform from the top-level savi directory. # # $Id: Makefile_defs_irix 10 2019-01-24 04:47:40Z lloydwood $ ######################################################## # # # Set machine type -- suffix for savi # # # ######################################################## MACH = irix ######################################################## # # # set CC to an ANSI C compiler # # # # We have also used gcc on SGI irix 5.x machines # # # # # ######################################################## CC = gcc ######################################################## # # # set TCL_INCLUDES so that the compiler can # # find the tcl.h and tk.h # # # # if tcl/tk is installed in a standard place # # it is not necessary to set this # # # ######################################################## TCL_INCLUDES = -I/usr/nekoware/include ######################################################## # # # set TCL_LIBS so that the compiler can find # # libtcl.a and libtk.a # # # ######################################################## TCL_LIBS = -L/usr/nekoware/lib -ltk8.4 -ltcl8.4 ######################################################## # # # Set OTHER_LIBS so that any other stuff needing to # # be linked in will be! # # # ######################################################## OTHER_LIBS = -ldl savi1.6.0/src/sats.c0000644000175000017500000005057314423445060013354 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * sats.c * * $Id: sats.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include #include /* for select */ /* #include #include #include */ #include "globals.h" #include "constants.h" #include "utils.h" #include "coverage_vis.h" #include "fisheye.h" #include "gv_utils.h" #include "Satellite.h" #include "sats.h" #include "stats_utils.h" #include "savi.h" #include "time.h" unsigned int geomview_flag = FALSE; static int current_marker = 0; static double direction; /* 1.0 = FORWARDS, -1.0 = BACKWARDS */ /* * Central body parameter - global from the parameters panel. It should * be initialized in the following routine so it can be reset at runtime */ static CentralBody CB = { EARTH_RADIUS, EARTH_ROTATION_RATE, EARTH_MU, EARTH_OBLATENESS, EARTH_YEAR, EARTH_TILT }; static Constellation constellation = { 0, 0, 0, (Satellite_list) NULL, &CB }; static double ttime = 0.0; static unsigned int realtime_flag = FALSE; static double realtime = 0; static Satellite sats_n(int n); static char OK_str[] = "OK"; static const int Forward = 1.0; static const int Backward = -1.0; /* * forwards_cmd */ char * forwards_cmd(int argc, char *argv[]) { if (!motion) { motion = TRUE; direction = Forward; set_realtime(); return OK_str; } return EMPTY_str; } /* * backwards_cmd */ char * backwards_cmd(int argc, char *argv[]) { if (!motion) { motion = TRUE; direction = Backward; set_realtime(); return OK_str; } return EMPTY_str; } /* * forwards_step_cmd */ char * forwards_step_cmd(int argc, char *argv[]) { if (!motion) { motion = TRUE; single_step = TRUE; direction = Forward; sats_update(); /* call twice to compute and move */ sats_update(); return OK_str; } return EMPTY_str; } /* * backwards_step_cmd */ char * backwards_step_cmd(int argc, char *argv[]) { if (!motion) { motion = TRUE; single_step = TRUE; direction = Backward; sats_update(); /* call twice to compute and move */ sats_update(); return OK_str; } return EMPTY_str; } /* * reset_cmd */ char * reset_cmd(int argc, char *argv[]) { reset = TRUE; return OK_str; } /* * stop_cmd */ char * stop_cmd(int argc, char *argv[]) { if (motion) { sats_update(); /* call twice to compute and move */ sats_update(); motion = FALSE; return OK_str; } return EMPTY_str; } /* * set_realtime */ void set_realtime() { struct timeval tv; gettimeofday(&tv, NULL); realtime = tv.tv_sec + tv.tv_usec / 1000000.0; } /* * realtime_on_cmd */ char * realtime_on_cmd(int argc, char *argv[]) { if (realtime_flag) return EMPTY_str; realtime_flag = TRUE; set_realtime(); return EMPTY_str; } /* * realtime_off_cmd */ char * realtime_off_cmd(int argc, char *argv[]) { if (!realtime_flag) return EMPTY_str; realtime_flag = FALSE; return EMPTY_str; } /* * geomview_on_cmd */ char * geomview_on_cmd(int argc, char *argv[]) { if (!geomview_module) return EMPTY_str; geomview_set_flag(TRUE); /* plot all satellites */ gv_begin(); gv_trans_list_create(constellation.satellites); earth_place(ttime, constellation.pcb); sun_place(ttime, constellation.pcb); gv_end(); return EMPTY_str; } /* * geomview_off */ char * geomview_off_cmd(int argc, char *argv[]) { geomview_set_flag(FALSE); return EMPTY_str; } /* * geomview_set_flag(int flag) */ void geomview_set_flag(int flag) { geomview_flag = flag; } /* * set_time() * * Sets time variable and makes sure window displays it */ void set_time(double t) { ttime = t; time_update(t); } /* * current_time() * * Returns current value of time variable. */ double current_time() { return (ttime); } /* * get_constellation * * Returns a pointer to the constellation */ Constellation * get_constellation() { return &constellation; } /* * get_central_body_radius * */ double get_central_body_radius() { return constellation.pcb->radius; } /* * satellite_init * * Create initial example satellite */ void satellite_init() { Satellite s; OrbitalElements oe = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; /* put at some fixed distance above the Earth */ oe.a = 1.2 * get_central_body_radius(); /* install one satellite */ s = satellite_create(0, &oe, constellation.pcb); satellite_name(s, "example"); constellation_add(&constellation, s); constellation_compute_positions(&constellation, ttime); /* display all satellites only if geomview is running */ /* place first so that they are created in the correct positions */ if (geomview_module) { gv_trans_list_create(constellation.satellites); gv_sat_list_create(&constellation); } } /* * sats_init * * Create initial configuration */ void sats_init() { /* set time */ set_time(0.0); } /* * sats_update * * loop called repeatedly to update the configuration and * display of the satellites * */ unsigned int sats_update() { /* * Unit of time is second-dev-tes. */ unsigned int i; static unsigned int computed = FALSE; static double computed_time = 0.0; static double old_delta_t = 0.0; static double old_ttime = 0.0; static int old_direction = 0; double oldt; if (reset) { set_time(0.0); computed_time = 0.0; init_coverage_time(); computed = FALSE; reset = FALSE; constellation_compute_positions(&constellation, ttime); tracks_compute(constellation.satellites, constellation.pcb); fisheye_display(constellation.satellites, FALSE, constellation.pcb); clear_coverage(); coverage_compute(constellation.satellites, FALSE, constellation.pcb); if (geomview_flag) { gv_start(); if (transforms_needed) { gv_trans_list_create(constellation.satellites); } for (i = 0; i < N_VIEW_MODULES; i++) { if (view_modules[i].relocate_fn) view_modules[i].relocate_fn(&constellation); } gv_delayed_view_update(); earth_place(ttime, constellation.pcb); sun_place(ttime, constellation.pcb); /* updates display, sends scratchfile if necessary. */ coverage_display(constellation.satellites, FALSE, constellation.pcb); gv_stop(); gv_set_ready(); } else { /* we're not talking to Geomview, but still need to draw coverage */ coverage_display(constellation.satellites, FALSE, constellation.pcb); } project_tracks_reset(); } else if (motion) { if (computed && !realtime_flag && ((old_ttime != ttime) || (old_delta_t != delta_t) || (old_direction != direction))) computed = FALSE; if (!computed) { if (!realtime_flag || single_step) { computed_time = ttime + direction * delta_t; old_ttime = ttime; old_delta_t = delta_t; old_direction = direction; } else { oldt = realtime; set_realtime(); computed_time = ttime + direction * (realtime - oldt) * delta_t; } constellation_compute_positions(&constellation, computed_time); coverage_decay(); coverage_compute(constellation.satellites, FALSE, constellation.pcb); tracks_compute(constellation.satellites, constellation.pcb); computed = TRUE; /* Pause briefly to avoid saturating the CPU. */ millisleep(1); } else { if (!geomview_flag || gv_ready()) { set_time(computed_time); fisheye_display(constellation.satellites, FALSE, constellation.pcb); /* plot all satellites */ if (geomview_flag) { gv_start(); if (transforms_needed) { gv_trans_list_create(constellation.satellites); } for (i = 0; i < N_VIEW_MODULES; i++) { if (view_modules[i].relocate_fn) view_modules[i].relocate_fn(&constellation); } gv_delayed_view_update(); earth_place(ttime, constellation.pcb); sun_place(ttime, constellation.pcb); /* updates display, sends scratchfile if necessary. */ coverage_display(constellation.satellites, FALSE, constellation.pcb); gv_stop(); gv_set_ready(); } else { /* we're not talking to Geomview, but still need to draw coverage */ coverage_display(constellation.satellites, FALSE, constellation.pcb); } if (single_step) { single_step = FALSE; motion = FALSE; } computed = FALSE; } } } else { /* If nothing's happening, pause 20 milliseconds to avoid saturating the CPU. */ millisleep(20); } return TRUE; } /* * sats_new * * Adds a new satellite and makes it current */ char * sats_new_cmd(int argc, char *argv[]) { Satellite s; OrbitalElements oe = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; static char result[10]; oe.a = CB.radius * 1.2; s = satellite_create(0, &oe, constellation.pcb); constellation_add(&constellation, s); satellite_compute_position(s, ttime, constellation.pcb); if (geomview_module) { gv_begin(); gv_trans_create(s); gv_sat_create(s, &constellation); gv_end(); } sprintf(result, "%d", s->id); return result; } /* * sats_n * * Returns nth satellite (starting from 0) */ static Satellite sats_n(int n) { Satellite_list sl = constellation.satellites; while (sl && (n > 0)) { sl = sl->next; n--; } if (sl) return sl->s; return NULL; } /* * sats_get_cmd * * Returns orbital elements and properties of nth satellite in list. * * Don't forget: User interface angles are in degrees, but internally we * like radians. * */ char * sats_get_cmd(int argc, char *argv[]) { int n = atoi(argv[2]); Satellite s = sats_n(n); if (s) { static char result[300]; char altitude[15]; int id = s->id; if (id < 10) { sprintf(altitude,"%12.2f", s->oe.a); } else if (id < 100) { sprintf(altitude,"%11.2f", s->oe.a); } else if (id < 1000) { sprintf(altitude,"%10.2f", s->oe.a); } else { sprintf(altitude,"%9.2f", s->oe.a); } sprintf(result, "%s %10.4f %8.3f %12.3f %12.3f %13.3f " "%10.3f %10.4f %10.4f %10.2f %10.2f %d %d %d", altitude, s->oe.e, s->oe.i * RAD_TO_DEG, s->oe.Omega * RAD_TO_DEG, s->oe.omega * RAD_TO_DEG, s->oe.T, oe_to_period(&(s->oe), constellation.pcb) / 60, oe_to_nodal_precession(&(s->oe), constellation.pcb) * RAD_TO_DEG * SECS_PER_DAY, oe_to_apsidal_rotation(&(s->oe), constellation.pcb) * RAD_TO_DEG * SECS_PER_DAY, oe_to_apoapsis_altitude(&(s->oe), constellation.pcb), oe_to_periapsis_altitude(&(s->oe), constellation.pcb), s->can_display_satellite, s->can_display_orbit, s->can_display_coverage); return result; } return EMPTY_str; } /* * sats_set_cmd * * Sets the orbital elements of a particular satellite. * * Don't forget: User interface angles are in degrees, but internally we * like radians. */ char * sats_set_cmd(int argc, char *argv[]) { unsigned int j; int n = atoi(argv[2]); Constellation *pconstellation = get_constellation(); Satellite s = sats_n(n); if (s) { float a, e, i, o, u, t; /* should sanity-check and bound all parameters */ /* semi-major axis greater than 0 */ a = atof(argv[3]); /* negative altitudes turned into positive */ if (a < 0) { a = -a; if (debug) error("turned negative semi-major axis into positive"); } /* check altitude is not zero to avoid /0 */ if (a == 0) a = 0.0001; /* eccentricity between 0 and 1 */ e = atof(argv[4]); if (e < 0) { e = -e; if (debug) error("turned negative eccentricity into positive"); } if (e > 0.999) e = 0.999; i = atof(argv[5]) * DEG_TO_RAD; o = atof(argv[6]) * DEG_TO_RAD; u = atof(argv[7]) * DEG_TO_RAD; t = atof(argv[8]); s->oe.a = a; s->oe.e = e; s->oe.i = i; s->oe.Omega = o; s->oe.omega = u; s->oe.T = t; satellite_oe_edited(s, pconstellation->pcb); if (atoi(argv[9])) { /* allow satellite to be viewed */ if (!s->can_display_satellite) { s->can_display_satellite = 1; pconstellation->n_view_sats++; } } else { /* don't allow satellite to be viewed */ if (s->can_display_satellite) { s->can_display_satellite = 0; pconstellation->n_view_sats--; } } s->can_display_satellite = atoi(argv[9]) ? 1 : 0; s->can_display_orbit = atoi(argv[10]) ? 1 : 0; s->can_display_coverage = atoi(argv[11]) ? 1 : 0; satellite_compute_position(s, ttime, pconstellation->pcb); if (geomview_module) { gv_begin(); gv_trans_create(s); for (j = 0; j < N_VIEW_MODULES; j++) if (view_modules[j].display_fn) view_modules[j].display_fn(s, pconstellation); gv_end(); } } return EMPTY_str; } /* * sats_tag_cmd * * Sets the nth satellite as distinguished. */ char * sats_tag_cmd(int argc, char *argv[]) { int n = atoi(argv[2]); Satellite s = sats_n(n); if (s && !s->tag) { s->tag = 1; (constellation.n_tag_sats)++; if (debug) fprintf(stderr,"SaVi: after tagging, tagged %i satellites.",constellation.n_tag_sats); if (geomview_module) { gv_begin(); gv_sat_create(s, &constellation); gv_end(); } } return EMPTY_str; } /* * sats_untag_cmd * * Untags the nth satellite */ char * sats_untag_cmd(int argc, char *argv[]) { int n = atoi(argv[2]); Satellite s = sats_n(n); if (s && s->tag) { s->tag = 0; (constellation.n_tag_sats)--; if (debug) fprintf(stderr,"SaVi: after untagging, tagged %i satellites.",constellation.n_tag_sats); if (geomview_module) { gv_begin(); gv_sat_create(s, &constellation); gv_end(); } } return EMPTY_str; } /* * sats_delete_cmd * * Deletes satellite n */ char * sats_delete_cmd(int argc, char *argv[]) { int n = atoi(argv[2]); int i; Satellite s = sats_n(n); if (s) { constellation_destroy_element(&constellation, s->id); if (geomview_module) { gv_begin(); for (i = 0; i < N_VIEW_MODULES; i++) if (view_modules[i].delete_fn) view_modules[i].delete_fn(s); gv_end(); } } return EMPTY_str; } /* * sats_copy_cmd * */ char * sats_copy_cmd(int argc, char *argv[]) { static char result[10]; int n = atoi(argv[2]); Satellite old_s = sats_n(n); Satellite s = old_s; if (old_s) { s = satellite_create(0, &(old_s->oe), constellation.pcb); satellite_name(s, old_s->name); constellation_add(&constellation, s); satellite_compute_position(s, ttime, constellation.pcb); if (geomview_module) { gv_begin(); gv_trans_create(s); gv_sat_create(s, &constellation); gv_end(); } } if (s) { sprintf(result, "%d", s->id); } return result; } /* * sats_load_marker_cmd */ char * sats_load_marker_cmd(int argc, char *argv[]) { double a = atof(argv[2]); double Omega = atof(argv[3]); double omega = atof(argv[4]); double T = atof(argv[5]); char* name = argv[6]; Satellite s; int n; static char result[20]; OrbitalElements oe; oe.a = a; oe.e = 0; oe.i = 90 * DEG_TO_RAD; /* N/S for drawing vertical lines */ oe.Omega = Omega * DEG_TO_RAD; oe.omega = omega * DEG_TO_RAD; oe.T = T; if (current_marker >= EQUATORIAL_MARKERS) { current_marker = 0; if (debug) { error("marker creation wrapped round array - redrawing?"); } } marker[current_marker] = satellite_create(0, &oe, constellation.pcb); if (name && !satellite_name(marker[current_marker], name)) { error ("problem naming marker."); } satellite_compute_position(marker[current_marker], 0, constellation.pcb); current_marker++; return result; } /* * sats_load_cmd * * Don't forget: User interface angles are in degrees, but internally we * like radians. */ char * sats_load_cmd(int argc, char *argv[]) { double a = atof(argv[2]); double e = atof(argv[3]); double i = atof(argv[4]); double Omega = atof(argv[5]); double omega = atof(argv[6]); double T = atof(argv[7]); char* name = argv[8]; Satellite s; int n; static char result[20]; OrbitalElements oe; oe.a = a; oe.e = e; oe.i = i * DEG_TO_RAD; oe.Omega = Omega * DEG_TO_RAD; oe.omega = omega * DEG_TO_RAD; oe.T = T; s = satellite_create(0, &oe, constellation.pcb); if (name && !satellite_name(s, name)) error ("problem naming satellite."); n = constellation_add(&constellation, s); satellite_compute_position(s, ttime, constellation.pcb); if (geomview_module) { gv_start(); gv_trans_create(s); gv_sat_create(s, &constellation); gv_stop(); } sprintf(result, "%d", n); return result; } /* * sats_name_cmd * * Names the given satellite */ char * sats_name_cmd(int argc, char *argv[]) { Satellite s; int n; char *name = argv[3]; n = atoi(argv[2]); s = sats_n(n); if (s) satellite_name(s, name); return EMPTY_str; } /* * sats_get_name_cmd * * Gets name of the given satellite */ char * sats_get_name_cmd(int argc, char *argv[]) { Satellite s; unsigned int n; int i; static char result[SATELLITE_NAME_LENGTH] = " "; i = atoi(argv[2]); s = sats_n(i); if (s) { n = strlen((char *)&s->name); if (n > SATELLITE_NAME_LENGTH) { error("string has overflowed in struct"); return EMPTY_str; } strcpy(result, (char *) &s->name); /* terminate string - elements are 0 to length-1 */ result[SATELLITE_NAME_LENGTH - 1] = 0; } return result; } /* * sats_get_id_cmd * * Gets id no of the given satellite * Needed because the id # may not be same as list position, * if e.g. you delete a satellite. */ char * sats_get_id_cmd(int argc, char *argv[]) { Satellite s; int n; static char result[12] = " "; n = atoi(argv[2]); s = sats_n(n); if (s) { sprintf(result, "%d", s->id); } else { sprintf(result, "%d", NOT_OK); } /* terminate the string - 12 long, but 0 to 11. */ result[11] = 0; return result; } /* * sats_delete_all_cmd * * Deletes all satellites in the satellite list */ char * sats_delete_all_cmd(int argc, char *argv[]) { unsigned int i; while (constellation.satellites) constellation_destroy_element(&constellation, constellation.satellites->s->id); if (geomview_module) { gv_start(); for (i = 0; i < N_VIEW_MODULES; i++) if (view_modules[i].gv_delete_fn) view_modules[i].gv_delete_fn(); gv_stop(); } return EMPTY_str; } /* * sats_debug_cmd * * Dumps satellite list to stderr */ char * sats_debug_cmd(int argc, char *argv[]) { Satellite_list sl = constellation.satellites; fprintf(stderr, "Satellites:\n"); while (sl) { fprintf(stderr, " %d %g %g %g %g %g %g", sl->s->id, sl->s->oe.a, sl->s->oe.e, sl->s->oe.i, sl->s->oe.Omega, sl->s->oe.omega, sl->s->oe.T); fprintf(stderr, "\n"); sl = sl->next; } return EMPTY_str; } /* * reset_params_cmd * * Resets values of central body */ char * reset_params_cmd(int argc, char *argv[]) { CentralBody *pcb = constellation.pcb; pcb->radius = EARTH_RADIUS; pcb->rotation_rate = EARTH_ROTATION_RATE; pcb->mu = EARTH_MU; pcb->J2 = EARTH_OBLATENESS; pcb->orbital_period = EARTH_YEAR; pcb->tilt = EARTH_TILT; return EMPTY_str; } /* * exit_cmd * * Clean up everything */ char * exit_cmd(int argc, char *argv[]) { unsigned int i; (void) sats_delete_all_cmd(argc, argv); if (!geomview_module) return EMPTY_str; gv_start(); for (i = 0; i < N_VIEW_MODULES; i++) { if (view_modules[i].off_cmd) { (void) view_modules[i].off_cmd(argc, argv); } } gv_stop(); coverage_dynamic_cleanup(); return EMPTY_str; } void gv_delayed_view_update() { Constellation *pconstellation; unsigned int i; if (!geomview_module) return; pconstellation = get_constellation(); for (i = 0; i < N_VIEW_MODULES; i++) if (view_modules[i].write_geom_fn) view_modules[i].write_geom_fn(pconstellation); } /* * Return the version string */ char * version_cmd(int argc, char *argv[]) { return Version; } /* * Return the list of valid command line parameters */ char * command_line_cmd(int argc, char *argv[]) { return command_switches; } savi1.6.0/src/Makefile_defs_macosx0000644000175000017500000000535014423445060016242 0ustar lloydlloyd# # Makefile_defs_macosx # # Makefile definitions that first worked on Mac OS X 10.4.7 using gcc 4.0.1 # # Always run make ARCH=platform from the top-level savi directory. # # $Id: Makefile_defs_macosx 10 2019-01-24 04:47:40Z lloydwood $ ######################################################## # # # Set machine type -- suffix for savi # # # # If empty symlink in Makefile fails for Cygwin (./!.) # # # ######################################################## MACH = macosx ######################################################## # # # set CC to an ANSI C compiler # # # ######################################################## CC = gcc ######################################################## # # # set TCL_INCLUDES so that the compiler can # # find the tcl.h and tk.h # # # # If tcl/tk is installed in a standard place # # it is not necessary to set this. You may need to # # change the numbers to match your version of tcl/tk. # # The numbers in the topmost savi script should also # # match. # # # ######################################################## # XQuartz installs Xlib headers here # - needed on Mac OS X 10.9 and later. TCL_INCLUDES = -I/opt/X11/include ######################################################## # # # set TCL_LIBS so that the compiler can find # # libtcl.a and libtk.a. Alter to suit - see above. # # # ######################################################## TCL_LIBS = -ltcl -ltk # If ActiveState ActiveTcl has been installed from # http://www.activestate.com/activetcl/downloads # build with that by uncommenting the following line: # TCL_LIBS = -F/Library/Frameworks -framework Tcl -framework Tk ######################################################## # # # Set OTHER_LIBS so that any other stuff needing to # # be linked in will be! # # # ######################################################## # -lz is for gzip compression library http://www.zlib.net/ # used for compressing textures to Geomview. OTHER_LIBS = -lz savi1.6.0/src/Satellite.c0000644000175000017500000001312114423445060014314 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * Satellite.c * * Routines for Satellite object * * $Id: Satellite.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include "constants.h" #include "orbit_utils.h" #include "stdlib.h" #include "Satellite.h" /* * satellite_create * * Pass unique id for new satellite plus orbital elements. * Returns a Satellite object (which has been positioned at t=0). */ Satellite satellite_create(int id, OrbitalElements * poe, CentralBody * pcb) { Satellite s = (Satellite) calloc(1, sizeof(struct satellite)); s->id = id; s->oe = *poe; s->tag = FALSE; s->gs_into_view = 0; s->can_display_satellite = 1; s->can_display_orbit = 1; s->can_display_coverage = 1; /* set name to default blank */ s->name[0] = 0; /* give it a valid position; choose time 0 */ satellite_compute_position(s, 0.0, pcb); /* precompute some quantities */ satellite_oe_edited(s, pcb); return s; } /* * satellite_name * * Set name string on satellite, using unique id assigned by _create. */ int satellite_name(Satellite s, char * name) { unsigned int n; if (!name) return FALSE; n = strlen(name); if (n < SATELLITE_NAME_LENGTH) { strcpy((char *)&s->name, name); } else { error("satellite name too long. Ignored."); } return TRUE; } /* * satellite_oe_edited * * Call this after time 0 orbital elements (s->oe) have been changed. * It updates some precomputed quantities. */ void satellite_oe_edited(Satellite s, CentralBody * pcb) { /* determine classical (Keplerian) period */ s->period = oe_to_period(&(s->oe), pcb); } /* * satellite_destroy * * Frees memory for a Satellite object */ void satellite_destroy(Satellite s) { free((char *) s); } /* * satellite_compute_position * * Updates the orbital elements, cartesian and spherical coordinates * of a satellite for time t */ void satellite_compute_position(Satellite s, const double t, CentralBody * pcb) { oe_time_to_oe(&(s->oe_t), &(s->oe), t, pcb); oe_to_geocentric(&(s->x_C), &(s->oe_t), pcb); cartesian_to_spherical(&(s->x_S), &(s->x_C)); s->t = t; spherical_to_transform(s->transform, &(s->x_S), pcb->radius); } /* * satellite_set_tag * * Sets the tag field for the satellite */ void satellite_set_tag(Satellite s, int tag) { s->tag = tag; } /* * satellite_get_tag * * Returns the tag field for the satellite */ int satellite_get_tag(Satellite s) { return s->tag; } /* * constellation_new_id * * returns an integer identifier which is not already used in * the specified constellation */ int constellation_new_id(const Constellation * pconstellation) { int n = 0; Satellite_list sl = pconstellation->satellites; while (sl && (sl->s->id == n)) { sl = sl->next; n++; } return n; } /* * constellation_add * * adds a satellite to a constellation, modifying * the satellite id to be the lowest possible one */ int constellation_add(Constellation * pconstellation, Satellite s) { int n = 0; Satellite_list newl; Satellite_list *psl = &(pconstellation->satellites); /* find id and empty position number */ while (*psl && ((*psl)->s->id == n)) { psl = &((*psl)->next); n++; } /* set id on satellite */ s->id = n; /* add to satellite list */ newl = (Satellite_list) calloc(1, sizeof(struct satellite_list)); newl->s = s; newl->next = *psl; (*psl) = newl; /* increment counters */ (pconstellation->n_sats)++; if (s->can_display_satellite) (pconstellation->n_view_sats)++; if (s->tag) (pconstellation->n_tag_sats)++; return n; } /* * constellation_search(Constellation *pconstellation, int id) * * Returns the satellite with a specified id, else NULL. * */ Satellite constellation_search(const Constellation * pconstellation, int id) { Satellite_list sl = pconstellation->satellites; while (sl && (id != sl->s->id)) sl = sl->next; return (sl ? sl->s : NULL); } /* * constellation_compute_positions * * Computes the spherical coordinates position of each satellite in the constellation * for some specified time t. */ void constellation_compute_positions(Constellation * pconstellation, double t) { Satellite_list sl = pconstellation->satellites; while (sl) { satellite_compute_position(sl->s, t, pconstellation->pcb); sl = sl->next; } } /* * constellation_destroy_element * * Removes a satellite from a constellation based on its id * and destroys it. */ void constellation_destroy_element(Constellation * pconstellation, int id) { Satellite_list *slp = &(pconstellation->satellites); Satellite_list old = NULL; while (*slp && ((*slp)->s->id != id)) slp = &((*slp)->next); if (*slp) { /* remove from list */ old = *slp; *slp = old->next; /* decrement counters */ (pconstellation->n_sats)--; if (old->s->tag) (pconstellation->n_tag_sats)--; if (old->s->can_display_satellite) (pconstellation->n_view_sats)--; /* release memory */ satellite_destroy(old->s); free((char *) old); } } savi1.6.0/src/logo.c0000644000175000017500000000251114423445060013327 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * logo.c * * $Id: logo.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include "gv_utils.h" #include "constants.h" #include "globals.h" #include "savi.h" static unsigned int logo_geom_exists = FALSE; /* * logo_on_cmd * * Display axes in geomview */ char * logo_on_cmd(int argc, char *argv[]) { if (logo_geom_exists) return EMPTY_str; logo_geom_exists = TRUE; gv_create_alienh("Logo", "logo_h"); return EMPTY_str; } /* * logo_off_cmd * * Deletes logo in Geomview */ char * logo_off_cmd(int argc, char *argv[]) { if (!logo_geom_exists) return EMPTY_str; logo_geom_exists = FALSE; gv_delete_geom("Logo"); return EMPTY_str; } savi1.6.0/src/plane.c0000644000175000017500000000410614423445060013470 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * plane.c * * $Id: plane.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include "constants.h" #include "gv_utils.h" #include "utils.h" #include "savi.h" #include "globals.h" static unsigned int plane_geom_exists = FALSE; /* * plane * * Routine to place plane at a particular angle * (will create plane geom if necessary). * * Expects i and Omega to be in degrees, since user interface * is that way. */ char * plane_cmd(int argc, char *argv[]) { double i = atof(argv[2]); double Omega = atof(argv[3]); double m[4][4], ci, si, cO, sO; plane_flag = TRUE; if (!geomview_module) return EMPTY_str; identity(m); ci = cos(i * DEG_TO_RAD); si = sin(i * DEG_TO_RAD); cO = cos(Omega * DEG_TO_RAD); sO = sin(Omega * DEG_TO_RAD); m[0][0] = cO; m[0][1] = sO; m[1][0] = -ci * sO; m[1][1] = ci * cO; m[1][2] = si; m[2][0] = si * sO; m[2][1] = -si * cO; m[2][2] = ci; gv_start(); gv_transform("plane_t", m); if (!plane_geom_exists) { gv_create_geom("Plane", "plane_t", "plane_h"); } plane_geom_exists = TRUE; gv_stop(); return EMPTY_str; } /* * plane_off * * Deletes plane from geomview */ char * plane_off_cmd(int argc, char *argv[]) { if (!plane_flag) return EMPTY_str; if(geomview_module) { gv_start(); gv_delete_geom("Plane"); plane_geom_exists = FALSE; gv_stop(); } plane_flag = FALSE; return EMPTY_str; } savi1.6.0/src/fisheye.c0000644000175000017500000003517114423445060014033 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * fisheye.c * * $Id: fisheye.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include "constants.h" #include "globals.h" #include "sats.h" #include "savi.h" #include "tcl_utils.h" #include "fisheye.h" static unsigned int fisheye_flag = FALSE; static unsigned int fisheye_labels_flag = FALSE; static unsigned int fisheye_reverse_view_flag = FALSE; static unsigned int fisheye_print_inview_flag = FALSE; static unsigned int fisheye_names_flag = FALSE; static unsigned int fisheye_numbers_flag = FALSE; static unsigned int fisheye_times_flag = FALSE; static char plotStr[LENGTH_STRING_BUFFER]; static char fisheye_widget[] = ".fisheye.cmd.p"; static char font[] = "helvetica 9"; static void fisheye_location_string(char * string); static void fisheye_update(void); double lat, lon; /* * Provide current fisheye coordinates for use elsewhere. */ void fisheye_location(LatLon * l) { l->lat = lat; l->lon = lon; } /* * Print lat/long coords in string ready to show to user. */ static void fisheye_location_string(char * plotStr) { char latNS, lonEW; double lat_min, lon_min; int lat_deg, lon_deg; /* display lat lon */ if (lat >= 0) { latNS = 'N'; lat_deg = (int) floor(lat); lat_min = (lat - lat_deg) * 60.0; } else { latNS = 'S'; lat_deg = (int) floor(-lat); lat_min = (-lat - lat_deg) * 60.0; } if (lon >= 0) { lonEW = 'E'; lon_deg = (int) floor(lon); lon_min = (lon - lon_deg) * 60.0; } else { lonEW = 'W'; lon_deg = (int) floor(-lon); lon_min = (-lon - lon_deg) * 60.0; } sprintf(plotStr, "%i %2.0f' %c %i %2.0f' %c", lat_deg, lat_min, latNS, lon_deg, lon_min, lonEW); } /* * fisheye_update * * called if we need to redraw the fisheye because of * a user change. */ static void fisheye_update(void) { Constellation *pconstellation; Satellite_list SL; CentralBody *pcb; if (fisheye_flag) { pconstellation = get_constellation(); SL = pconstellation->satellites; pcb = pconstellation->pcb; /* display the fisheye view */ fisheye_display(SL, TRUE, pcb); } } /* * fisheye_on * * Set flags to indicate that fisheye should be displayed. * Call fisheye_display to get updated display. */ char * fisheye_on_cmd(int argc, char *argv[]) { /* set flag so that fisheye will be displayed */ fisheye_flag = TRUE; /* display the fisheye view */ fisheye_update(); return EMPTY_str; } char * fisheye_off_cmd(int argc, char *argv[]) { unsigned int old_flag = fisheye_flag; fisheye_flag = FALSE; if (fisheye_flag != old_flag) fisheye_update(); return EMPTY_str; } char * fisheye_labels_on_cmd(int argc, char *argv[]) { unsigned int old_flag = fisheye_labels_flag; fisheye_labels_flag = TRUE; if (fisheye_labels_flag != old_flag) fisheye_update(); return EMPTY_str; } char * fisheye_labels_off_cmd(int argc, char *argv[]) { unsigned int old_flag = fisheye_labels_flag; fisheye_labels_flag = FALSE; if (fisheye_labels_flag != old_flag) fisheye_update(); return EMPTY_str; } char * fisheye_reverse_view_on_cmd(int argc, char *argv[]) { unsigned int old_flag = fisheye_reverse_view_flag; fisheye_reverse_view_flag = TRUE; /* display the fisheye view */ if (fisheye_reverse_view_flag != old_flag) fisheye_update(); return EMPTY_str; } char * fisheye_reverse_view_off_cmd(int argc, char *argv[]) { unsigned int old_flag = fisheye_reverse_view_flag; fisheye_reverse_view_flag = FALSE; /* display the fisheye view */ if (fisheye_reverse_view_flag != old_flag) fisheye_update(); return EMPTY_str; } char * fisheye_print_inview_on_cmd(int argc, char *argv[]) { fisheye_print_inview_flag = TRUE; return EMPTY_str; } char * fisheye_print_inview_off_cmd(int argc, char *argv[]) { fisheye_print_inview_flag = FALSE; /* could delete or hide mask elevation circle */ return EMPTY_str; } char * fisheye_names_on_cmd(int argc, char *argv[]) { unsigned int old_flag = fisheye_names_flag; fisheye_names_flag = TRUE; if (fisheye_names_flag != old_flag) fisheye_update(); return EMPTY_str; } char * fisheye_names_off_cmd(int argc, char *argv[]) { unsigned int old_flag = fisheye_names_flag; fisheye_names_flag = FALSE; if (fisheye_names_flag != old_flag) fisheye_update(); return EMPTY_str; } char * fisheye_numbers_on_cmd(int argc, char *argv[]) { unsigned int old_flag = fisheye_numbers_flag; fisheye_numbers_flag = TRUE; if (fisheye_numbers_flag != old_flag) fisheye_update(); return EMPTY_str; } char * fisheye_numbers_off_cmd(int argc, char *argv[]) { unsigned int old_flag = fisheye_numbers_flag; fisheye_numbers_flag = FALSE; if (fisheye_numbers_flag != old_flag) fisheye_update(); return EMPTY_str; } char * fisheye_times_on_cmd(int argc, char *argv[]) { unsigned int old_flag = fisheye_times_flag; fisheye_times_flag = TRUE; if (fisheye_times_flag != old_flag) fisheye_update(); return EMPTY_str; } char * fisheye_times_off_cmd(int argc, char *argv[]) { unsigned int old_flag = fisheye_times_flag; fisheye_times_flag = FALSE; if (fisheye_times_flag != old_flag) fisheye_update(); return EMPTY_str; } char * fisheye_viewpoint_on_cmd(int argc, char *argv[]) { fisheye_viewpoint_flag = TRUE; update_coverage_display(); return EMPTY_str; } char * fisheye_viewpoint_off_cmd(int argc, char *argv[]) { fisheye_viewpoint_flag = FALSE; /* can't seem to remove cross - update_ and redraw_coverage_display() don't work. */ return EMPTY_str; } /* * fisheye_set * * Sets the lat and lon for the fisheye display and redisplays it */ char * fisheye_set_cmd(int argc, char *argv[]) { Constellation *pconstellation = get_constellation(); Satellite_list sl = pconstellation->satellites; CentralBody *pcb = pconstellation->pcb; double new_lat = (double) atoi(argv[2]); double new_lon = (double) atoi(argv[4]); /* was 3 gjl */ new_lat = (new_lat >= 0) ? new_lat + atof(argv[3]) / 60.0 : new_lat - atof(argv[3]) / 60.0; new_lon = (new_lon >= 0) ? new_lon + atof(argv[5]) / 60.0 : new_lon - atof(argv[5]) / 60.0; lat = new_lat; lon = new_lon; fisheye_location_string(plotStr); sprintf(cmd, "set fisheye_lat_lon \"%s\"", plotStr); tcl_script(cmd); /* display sky view */ if (fisheye_flag) fisheye_display(sl, TRUE, pcb); return EMPTY_str; } /* * fisheye_display * * update the Tk image */ void fisheye_display(const Satellite_list SL, unsigned int force, const CentralBody * pcb) { int offset, test, not_visible_to_terminal; static char attributes[30]; float coverage_pct = (90.0 - coverage_angle) / 90.0; if (!fisheye_flag && !force) return; sprintf(cmd, "fisheye(delete)"); test = tcl_script(cmd); if (debug && !test) { error("Problem telling Tk to delete fisheye."); } /* plot satellite positions */ { CartesianCoordinates ccs; double sky[2]; double t = current_time(); double interval_time; Satellite_list sl = SL; unsigned int sats_visible, sats_above_mask; int a, d, n, r, x, y, x_start, y_start, x_end, y_end; int adjust = 2; int mirror = -1; sprintf(cmd,"fisheye(resize)"); test = tcl_script(cmd); if (debug && !test) { error("problem telling Tk to resize fisheye disk."); } d = Fisheye_Diameter - adjust; r = (float)(d/2) - 1; offset = r + adjust; /* important for later */ if (coverage_type == MASK_ELEVATION) { x_start = (float) (d * coverage_angle / 180) + adjust; y_end = d - x_start; sprintf(cmd,"%s create oval %i %i %i %i -outline red -width 1 -tags mask_elevation", fisheye_widget, x_start, x_start, y_end, y_end); test = tcl_script(cmd); if (debug && !test) { error("Problem telling Tk to draw mask elevation."); } } sats_visible = sats_above_mask = 0; if (fisheye_reverse_view_flag) { sprintf(attributes, "-anchor ne -fill blue"); } else { sprintf(attributes, "-anchor nw -fill blue"); } /* display equatorial ring markers, if turned on. Unmoving, time 0. */ if (plane_flag) { sprintf(plotStr, "purple"); for (n = 0; n < EQUATORIAL_MARKERS; n++) { oe_time_to_geocentric(&ccs, 0, &(marker[n]->oe), pcb); if (sat_to_fisheye(&ccs, lat, lon, pcb, 0, sky)) { if (fisheye_reverse_view_flag) { sky[0] = -sky[0]; } x = (int) (offset + r * sky[0]); y = (int) (offset - r * sky[1]); /* North is top of canvas */ /* Draw parallels in dark gray. Plain gray is too light on a Mac. */ if (n > 359) { sprintf(plotStr, "darkgray"); if (n > 719) { mirror = -mirror; } } sprintf(cmd, "%s create line %i %i %i %i -fill %s -tags equator", fisheye_widget, x, y, x, y+mirror, plotStr); test = tcl_script(cmd); } } } if (debug && !test) { error("Problem telling Tk to draw equator markers."); } /* display satellites */ while (sl) { if (!sl->s->can_display_satellite) { sl = sl->next; continue; } oe_time_to_geocentric(&ccs, t, &(sl->s->oe), pcb); if (sat_to_fisheye(&ccs, lat, lon, pcb, t, sky)) { sats_visible++; if ((sky[0] * sky[0] + sky[1] * sky[1]) < (coverage_pct * coverage_pct)) { if (sl->s->gs_into_view == 0) { /* fudge time slightly so that recorded value is never zero. */ sl->s->gs_into_view = t - 0.00001; sl->s->gs_last_into_view = t - 0.00001; } } else { /* * could add delta_t for half of interval before and after * passing view test - but assumes delta_t unchanged! */ if (sl->s->gs_into_view != 0) { sl->s->gs_last_pass = t - sl->s->gs_into_view; } sl->s->gs_into_view = 0; } if (fisheye_reverse_view_flag) { sky[0] = -sky[0]; } not_visible_to_terminal = ((coverage_type == MASK_ELEVATION) && (!sl->s->gs_into_view)) || !sl->s->can_display_coverage; a = sl->s->x_S.r - pcb->radius; if (a <= min_transmit_altitude) { not_visible_to_terminal = TRUE; } if (not_visible_to_terminal || (coverage_type != MASK_ELEVATION)) { if (fisheye_names_flag) { if (fisheye_numbers_flag) { sprintf(plotStr, "{%d %s}", sl->s->id, sl->s->name); } else { sprintf(plotStr, "{%s}", sl->s->name); } } else { if (fisheye_numbers_flag) { sprintf(plotStr, "{%d}", sl->s->id); } else { /* print nothing */ sprintf(plotStr, "{}"); } } } else { sats_above_mask++; interval_time = t - sl->s->gs_into_view; if (fisheye_times_flag) { if (fisheye_names_flag) { if (fisheye_numbers_flag) { sprintf(plotStr, "{%d %s %.1f}", sl->s->id, sl->s->name, interval_time); } else { sprintf(plotStr, "{%s %.1f}", sl->s->name, interval_time); } } else { if (fisheye_numbers_flag) { sprintf(plotStr, "{%d %.1f}", sl->s->id, interval_time); } else { sprintf(plotStr, "{%.1f}", interval_time); } } } else { if (fisheye_names_flag) { if (fisheye_numbers_flag) { sprintf(plotStr, "{%d %s}", sl->s->id, sl->s->name); } else { sprintf(plotStr, "{%s}", sl->s->name); } } else { if (fisheye_numbers_flag) { sprintf(plotStr, "{%d}", sl->s->id); } else { /* print nothing */ sprintf(plotStr, "{}"); } } } } x = (int) (offset + r * sky[0]); y = (int) (offset - r * sky[1]); /* North is top of canvas */ if (fisheye_labels_flag) { sprintf(cmd, "%s create text %i %i -text %s %s -font {%s} -tags labels", fisheye_widget, x, y, plotStr, attributes, font); test = tcl_script(cmd); if (debug && !test) { error("Problem telling Tk to write fisheye widget satellite labels."); } } if (sl->s->tag == 1) { sprintf(plotStr, "pink"); } else if (not_visible_to_terminal) { sprintf(plotStr, "red"); } else { sprintf(plotStr, "green"); } x_start = x-3; x_end = x+4; y_start = y-3; y_end = y+4; sprintf(cmd, "%s create line %i %i %i %i -fill %s -tags crosses", fisheye_widget, x, y_start, x, y_end, plotStr); test = tcl_script(cmd); sprintf(cmd, "%s create line %i %i %i %i -fill %s -tags crosses", fisheye_widget, x_start, y, x_end, y, plotStr); test = test && tcl_script(cmd); if (debug && !test) { error("Problem telling Tk to draw on fisheye."); } } else { sl->s->gs_into_view = 0; /* * any recorded output needs formatting into a proper tracefile, * including lat/long, estimated margin of error (delta_t/2). * currently disabled. */ if (sl->s->gs_last_pass != 0) { if (0) { fprintf(stderr, "Sat: %2d, first seen: %6.1f secs, for: %.1f secs.\n", sl->s->id, sl->s->gs_last_into_view, sl->s->gs_last_pass); } } } sl = sl->next; } /* if canvas is really too small, don't write in corners. */ if (d < 75) return; if (sats_above_mask) { /* output number of satellites */ sprintf(plotStr, "%i in mask", sats_above_mask); sprintf(cmd, "%s create text %i %i -text {%s} -anchor ne -font {%s} -fill green -tags labels", fisheye_widget, d-2, 2, plotStr, font); test = test && tcl_script(cmd); } /* output number of satellites visible */ if (d < 175) { if ((coverage_type != MASK_ELEVATION) || !sats_above_mask) { sprintf(plotStr, "-text {%i in view} -anchor ne", sats_visible); } else { sprintf(plotStr, " "); } y_start = 2; } else { sprintf(plotStr, "-text {%i in view} -anchor se", sats_visible); y_start = d-2; } if (sats_visible) { sprintf(cmd, "%s create text %i %i %s -font {%s} -fill blue -tags labels", fisheye_widget, d-2, y_start, plotStr, font); test = test && tcl_script(cmd); } /* output coordinates */ fisheye_location_string(plotStr); sprintf(cmd, "%s create text %i %i -text {%s} -anchor sw -font {%s} -fill blue -tags labels", fisheye_widget, 2, d-2, plotStr, font); test = test && tcl_script(cmd); if (debug && !test) { error("Problem telling Tk to write satellite counts."); } } } savi1.6.0/src/orbit_utils.c0000644000175000017500000004240314423445060014732 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * orbit_utils.c * * $Id: orbit_utils.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include "constants.h" #include "globals.h" #include "orbit_utils.h" #include "stats_utils.h" /* * converts perifocal coordinates y into geocentric equatorial Cartesian coords x * using the orbital elements: i, Omega, omega. */ void perifocal_to_geocentric(CartesianCoordinates * x, const CartesianCoordinates * y, const double i, const double Omega, const double omega) { double ci, si, cO, sO, co, so, tx, ty, tz; tx = y->x; ty = y->y; tz = y->z; ci = cos(i); si = sin(i); cO = cos(Omega); sO = sin(Omega); co = cos(omega); so = sin(omega); x->x = (cO * co - sO * so * ci) * tx + (-cO * so - sO * co * ci) * ty + sO * si * tz; x->y = (sO * co + cO * so * ci) * tx + (-sO * so + cO * co * ci) * ty - cO * si * tz; x->z = so * si * tx + co * si * ty + ci * tz; } /* * oe_time_J0_to_geocentric * * Converts orbital elements at time 0 to Cartesian coordinates * in the geocentric equatorial system at time t. * * This assumes the central body is a perfect sphere. * previously commented. Unused. */ void oe_time_J0_to_geocentric(CartesianCoordinates * px, const double t, const OrbitalElements * poe, const CentralBody * pcb) { CartesianCoordinates y; double nu, cosnu, r, a, e; a = poe->a; e = poe->e; nu = time_to_true_anomaly(t, pcb, a, e, poe->T); cosnu = cos(nu); r = a * (1 - e * e) / (1 + e * cosnu); y.x = r * cosnu; y.y = r * sin(nu); y.z = 0.0; perifocal_to_geocentric(px, &y, poe->i, poe->Omega, poe->omega); } /* * oe_to_geocentric * * Returns the position of a satellite from a set * of classical orbital elements * */ void oe_to_geocentric(CartesianCoordinates * px, const OrbitalElements * poe, const CentralBody * pcb) { CartesianCoordinates y; double nu, cosnu, r, a, e; a = poe->a; e = poe->e; nu = time_to_true_anomaly(0.0, pcb, a, e, poe->T); cosnu = cos(nu); r = a * (1 - e * e) / (1 + e * cosnu); y.x = r * cosnu; y.y = r * sin(nu); y.z = 0.0; perifocal_to_geocentric(px, &y, poe->i, poe->Omega, poe->omega); } /* * oe_time_J0_to_oe * * Given orbital elements for the satellite at time 0, * returns orbital elements for the satellite at time t. * * This uses the Keplerian orbits formulation (spherical central body). * * (Since we use the orbital element T (time of periapsis passage) * flowing forward in time results in decreasing T.) */ void oe_time_J0_to_oe(OrbitalElements * final, const OrbitalElements * initial, const double t, const CentralBody * pcb) { double d_T = -1.0; /* copy initial orbital elements to final orbital elements */ *final = *initial; /* adjust the time until periapsis */ final->T += t * d_T; } /* * oe_time_J2_to_oe * * Given orbital elements for the satellite at time 0, * returns orbital elements for the satellite at time t. * * This uses the J2 oblateness term in the model of the central body. * * See Szebehely, Adventures in Celestial Mechanics, Chap. 11 * and U of Texas, Austin, Applied Orbital Mechanics course notes (Lundberg), * 3-22. * */ void oe_time_J2_to_oe(OrbitalElements * final, const OrbitalElements * initial, const double t, const CentralBody * pcb) { double a = final->a = initial->a; double e = final->e = initial->e; double i = final->i = initial->i; double R_a_sqr = pcb->radius * pcb->radius / a / a; double one_minus_e_sqr = 1 - e * e; double factor = 0.75 * pcb->J2 * R_a_sqr / one_minus_e_sqr / one_minus_e_sqr; double n = sqrt(pcb->mu / a / a / a); double cosi = cos(i); double cosi2 = cosi * cosi; double d_Omega = -2.0 * factor * n * cosi; double d_omega = factor * n * (5.0 * cosi2 - 1.0); double d_T = -(1.0 + factor * sqrt(one_minus_e_sqr) * (3.0 * cosi2 - 1.0)); /* adjust the longitude of ascending node */ final->Omega = initial->Omega + t * d_Omega; /* adjust the argument of periapsis */ final->omega = initial->omega + t * d_omega; /* adjust the time until periapsis */ final->T = initial->T + t * d_T; } /* * oe_time_to_oe * * Given orbital elements for the satellite at time 0, * returns orbital elements for the satellite at time t. * */ void oe_time_to_oe(OrbitalElements * final, const OrbitalElements * initial, const double t, const CentralBody * pcb) { switch (orbit_model) { case J0: oe_time_J0_to_oe(final, initial, t, pcb); break; default: /* J2 model is the current default if another model is not specified */ oe_time_J2_to_oe(final, initial, t, pcb); break; } } /* * oe_time_to_geocentric * * Converts orbital elements at time 0 to spherical coordinates * in the geocentric equatorial system at time t. * * Uses the model that oe_time_to_oe uses. */ void oe_time_to_geocentric(CartesianCoordinates * px, const double t, const OrbitalElements * poe, const CentralBody * pcb) { OrbitalElements oe; oe_time_to_oe(&oe, poe, t, pcb); oe_to_geocentric(px, &oe, pcb); } /* * oe_time_to_geocentric_spherical * * Converts orbital elements at time 0 to spherical coordinates * in the geocentric equatorial system at time t. * * Uses the whatever model oe_time_to_geocentric uses. */ void oe_time_to_geocentric_spherical(SphericalCoordinates * px, const double t, const OrbitalElements * poe, const CentralBody * pcb) { CartesianCoordinates y; oe_time_to_geocentric(&y, t, poe, pcb); cartesian_to_spherical(px, &y); } /* * spherical_to_transform * * creates a transformation matrix to move a satellite centered at the * origin to the specified point in spherical coordinates. The vector * (0,0,-1) is mapped so that it points to the origin. There is still * one degree of freedom in this specification! * */ void spherical_to_transform(double m[4][4], const SphericalCoordinates * px, const double scale) { double theta, phi, ct, st, cp, sp, spct, spst, r0; const double zero = 0.0; theta = px->theta; ct = cos(theta); st = sin(theta); phi = px->phi; cp = cos(phi); sp = sin(phi); m[0][0] = cp * ct; m[0][1] = cp * st; m[0][2] = -sp; m[0][3] = zero; m[1][0] = -st; m[1][1] = ct; m[1][2] = zero; m[1][3] = zero; spct = sp * ct; spst = sp * st; m[2][0] = spct; m[2][1] = spst; m[2][2] = cp; m[2][3] = zero; r0 = px->r / scale; m[3][0] = r0 * spct; m[3][1] = r0 * spst; m[3][2] = r0 * cp; m[3][3] = 1.0; } /* * spherical_to_cartesian * * convert from spherical (r, theta, phi) to cartesian (x,y,z) coordinates. */ void spherical_to_cartesian(CartesianCoordinates * u, const SphericalCoordinates * v) { double r, theta, phi, sinphi; r = v->r; theta = v->theta; phi = v->phi; sinphi = sin(phi); u->x = r * cos(theta) * sinphi; u->y = r * sin(theta) * sinphi; u->z = r * cos(phi); } /* * converts geocentric cartesian coordinates to spherical coordinates * x = (r,theta,phi), where theta in (-Pi, Pi], phi in [0, Pi]. */ void cartesian_to_spherical(SphericalCoordinates * px, const CartesianCoordinates * py) { double rsqr, x, y, z, x_r, x2_y2; x = py->x; y = py->y; x2_y2 = x * x + y * y; if (y < 0.0) { px->theta = -acos(x / sqrt(x2_y2)); } else { px->theta = acos(x / sqrt(x2_y2)); } z = py->z; rsqr = x2_y2 + z * z; px->r = x_r = sqrt(rsqr); px->phi = acos(z / x_r); } /* * lat_lon_to_spherical * * Convert geocentric latitude (NOTE: NOT geodetic latitude. Will need to * account for oblateness of earth later.) and longitude coordinates to * NORMALIZED (length=1) geocentric equatorial spherical coordinates * (r, theta, phi). * * We assume that longitude equals geocentric equatorial theta at t=0. */ void lat_lon_to_spherical(const double lat, const double lon, const double t, const CentralBody * pcb, SphericalCoordinates * px) { px->r = 1.0; /* Geocentric equatorial spherical */ px->theta = lon * DEG_TO_RAD + pcb->rotation_rate * t; /* coordinates. */ px->phi = (90.0 - lat) * DEG_TO_RAD; } /* * lat_lon_to_cartesian * * Convert geocentric latitude (NOTE: NOT geodetic latitude. Will need to * account for oblateness of earth later.) and longitude coordinates to * NORMALIZED (length=1) geocentric equatorial cartesian coordinates. * * We assume that longitude equals geocentric equatorial theta at t=0. */ void lat_lon_to_cartesian(const double lat, const double lon, const double t, const CentralBody * pcb, CartesianCoordinates * px) { SphericalCoordinates y; lat_lon_to_spherical(lat, lon, t, pcb, &y); spherical_to_cartesian(px, &y); } /* * spherical_to_lat_lon * * Converts spherical (geocentric equatorial) coordinates to * the latitude and longitude of the point on earth it is over */ void spherical_to_lat_lon(LatLon * pl, const SphericalCoordinates * px, const double t, const CentralBody * pcb) { double x; x = (px->theta - pcb->rotation_rate * t) * RAD_TO_DEG - 180.0; if (x > 0) pl->lon = fmod(x, 360.0) - 180.0; else pl->lon = fmod(x, 360.0) + 180.0; pl->lat = 90.0 - px->phi * RAD_TO_DEG; } /* * Given a time, return true anomaly. */ double time_to_true_anomaly(const double t, const CentralBody * pcb, const double a, const double e, const double T) { double M, M_n, E, incr; /* * E is the eccentric anomaly, M = E-e*sinE is the mean anomaly. The * time of flight equation, t-T = Msqrt(a^3/mu), gives M in terms of * time, and we solve for E in terms of M by Newton's method (the Kepler * problem). The calculation is trivial for circular orbits, and is handled * separately. */ if (e == 0.0) { /* mean anomaly = eccentric anomaly = true anomaly */ return mean_anomaly(t, pcb->mu, a, T); } if (e < 0.1) { /* mean anomaly is a good seed for Newton's method */ M = mean_anomaly(t, pcb->mu, a, T); E = M; M_n = M - e * sin(M); incr = (M - M_n) / (1 - e * cos(E)); while (fabs(incr) > ANOMALY_COMPUTATION_TOLERANCE) { E += incr; M_n = E - e * sin(E); incr = (M - M_n) / (1 - e * cos(E)); } } else { /* will force each iterate of Newton's method to remain in 0 to 2pi */ M = mean_anomaly(t, pcb->mu, a, T); E = M; M_n = M - e * sin(M); incr = (M - M_n) / (1 - e * cos(E)); while (fabs(incr) > ANOMALY_COMPUTATION_TOLERANCE) { E += incr; if (E < 0) { E = (E - incr) / 2.0; } else if (E > TWOPI) { E = (E - incr + TWOPI) / 2.0; } M_n = E - e * sin(E); incr = (M - M_n) / (1 - e * cos(E)); } } return eccentric_anomaly_to_true_anomaly(E, e); } /* * Convert eccentric anomaly to true anomaly. * E is the eccentric anomaly, e is the eccentricity of the orbit. * * Note: If e=0, then eccentric anomaly equals true anomaly and * there is no reason to call this routine! */ double eccentric_anomaly_to_true_anomaly(const double E, const double e) { if (sin(E) >= 0.0) return acos((e - cos(E)) / (e * cos(E) - 1)); else return 2 * PI - acos((e - cos(E)) / (e * cos(E) - 1)); } /* * sat_to_fisheye * * Given a satellite position vector (cartesian geocentric-equatorial * coordinates) and time, compute the fisheye coordinates of that satellite as * viewed from a given latitude/longitude on the earth. * * If the spherical coordinates of the satellite as viewed from the * ground are (phi, theta), where phi is measured from vertical, and * theta is measured from east, then the fisheye coordinates are given * by 1/(PI/2)*(-phi*cos(theta), phi*sin(theta)). Thus coordinates * lie in the unit disk, and are oriented so that north is up, south is * down, east is LEFT, west is RIGHT. (This is the correct orientation * when looking up.) * * Value of function is TRUE if satellite is in view, FALSE otherwise. */ int sat_to_fisheye(const CartesianCoordinates * ps, const double lat, const double lon, const CentralBody * pcb, const double t, double sky[2]) { CartesianCoordinates p, sp, e, n; double phi, alpha, radius; lat_lon_to_cartesian(lat, lon, t, pcb, &p); /* sp is the vector from point on earth to satellite. Scale satellite vector by earth radius since we assume |p|=1. */ radius = pcb->radius; sp.x = ps->x / radius - p.x; sp.y = ps->y / radius - p.y; sp.z = ps->z / radius - p.z; normalize(&sp); normalize(&p); phi = acos(dot(&p, &sp)); /* The view angle from vertical. */ if (debug) fprintf(stderr, "Angle from vertical: %f\n", phi * RAD_TO_DEG); if (phi > PI / 2.0) return FALSE; /* Compute "east" and "north" vectors spanning the tangent plane at p. For the north pole, take east to be direction of 0 degrees long. For the south pole, take east to be direction of 180 degrees long. */ if (fabs(lat) == 90.0) { lat_lon_to_cartesian(0.0, lon + 90.0, t, pcb, &e); } else { e.x = -p.y; /* The "east" vector is the projection of p onto the */ e.y = p.x; /* equatorial plane, then rotated counterclockwise pi/2 */ e.z = 0.0; /* and normalized. */ } normalize(&e); cross_product(&n, &p, &e); /* "North" is then p x e. */ /* project sp onto plane defined by n,e by subtracting out components of p */ alpha = dot(&p, &sp); sp.x -= alpha * p.x; sp.y -= alpha * p.y; sp.z -= alpha * p.z; normalize(&sp); /* Cos(theta) equals the projection of the new sp onto e, or the dot product of sp and e. Sin(theta) equals the projection of sp onto n. */ sky[0] = -2.0 / PI * phi * dot(&sp, &e); sky[1] = 2.0 / PI * phi * dot(&sp, &n); if (debug) { print_vec("sp", &sp); print_vec("p", &p); print_vec("e", &e); print_vec("n", &n); fprintf(stderr, "Norms: sp %f p %f e %f n %f\n", norm(&sp), norm(&p), norm(&e), norm(&n)); fprintf(stderr, "sky = (%f , %f )\n", sky[0], sky[1]); } return TRUE; } /* * oe_to_period * * Returns the period of a classical orbit given its orbital elements * */ double oe_to_period(const OrbitalElements * poe, const CentralBody * pcb) { return (TWOPI * pow(poe->a, 1.5) / sqrt(pcb->mu)); } /* * oe_info * * Writes to file information about the orbital elements * */ void oe_info(FILE * out, const OrbitalElements * poe, const CentralBody * pcb) { double period = oe_to_period(poe, pcb); /* output orbital elements */ fprintf(out, "a=%f e=%f i=%f Om=%f om=%f T=%f ", poe->a, poe->e, poe->i, poe->Omega, poe->omega, poe->T); /* output period of orbit in hours */ fprintf(out, " (%f=%f hrs)\n", period, period / 3600.0); } /* * oe_to_nodal_precession * * Returns the nodal precession for the J2 model * */ double oe_to_nodal_precession(const OrbitalElements * poe, const CentralBody * pcb) { double a = poe->a; double R_a_sqr = pcb->radius * pcb->radius / a / a; double one_minus_e_sqr = 1 - poe->e * poe->e; double factor = 0.75 * pcb->J2 * R_a_sqr / one_minus_e_sqr / one_minus_e_sqr; double n = sqrt(pcb->mu / a / a / a); double cosi = cos(poe->i); double nodal_precession = -2.0 * factor * n * cosi; if (debug) fprintf(stderr, "nodalprecession = %f\n", nodal_precession); return (nodal_precession); } /* * oe_to_apsidal_rotation * * Returns the apsidal rotation for the J2 model * */ double oe_to_apsidal_rotation(const OrbitalElements * poe, const CentralBody * pcb) { double a = poe->a; double R_a_sqr = pcb->radius * pcb->radius / a / a; double one_minus_e_sqr = 1 - poe->e * poe->e; double factor = 0.75 * pcb->J2 * R_a_sqr / one_minus_e_sqr / one_minus_e_sqr; double n = sqrt(pcb->mu / a / a / a); double cosi = cos(poe->i); double apsidal_rotation = factor * n * (5.0 * cosi * cosi - 1.0); if (debug) fprintf(stderr, "apsidal rotation = %f\n", apsidal_rotation); return (apsidal_rotation); } /* * oe_to_apoapsis_altitude * * Returns the apoapsis altitude, the height from the surface of the central * body to the satellite at its furthest point in the orbit. * */ double oe_to_apoapsis_altitude(const OrbitalElements * poe, const CentralBody * pcb) { return (poe->a * (1 + poe->e) - pcb->radius); } /* * oe_to_periapsis_altitude * * Returns the periapsis altitude, the height from the surface of the central * body to the satellite during closest approach. * */ double oe_to_periapsis_altitude(const OrbitalElements * poe, const CentralBody * pcb) { return (poe->a * (1 - poe->e) - pcb->radius); } /* * mean_anomaly * * Computes the mean anomaly in terms of current time t, gravitational * parameter mu, and the orbital elements a and T, and returns it in the * range 0 to 2*pi. * * M = sqrt(mu/(a*a*a))*(t-T) mod 2*pi * */ double mean_anomaly(const double t, const double mu, const double a, const double T) { double M = fmod(sqrt(mu / (a * a * a)) * (t - T), TWOPI); /* if negative add two pi to put in correct range */ if (M < 0.0) M += TWOPI; return M; } savi1.6.0/src/orbits.c0000644000175000017500000001214014423445060013670 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * orbits.c * * routines to display orbits * * $Id: orbits.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include #include "globals.h" #include "constants.h" #include "gv_file.h" #include "gv_utils.h" #include "sats.h" #include "orbit_utils.h" #include "savi.h" static unsigned int orbits_on_flag = FALSE; static unsigned int orbits_geom_exists = FALSE; static unsigned int orbits_geom_needs_updating = FALSE; static char name[] = "orbit_ "; static void orbit_write_geom(const Satellite s, const Constellation * pconstellation); /* * orbits_on_cmd() * * Routine to display orbits */ char * orbits_on_cmd(int argc, char *argv[]) { Constellation *pconstellation = get_constellation(); Satellite_list sl = pconstellation->satellites; if (orbits_on_flag) return EMPTY_str; orbits_on_flag = TRUE; orbits_geom_needs_updating = TRUE; gv_start(); while (sl) { orbit_write_geom(sl->s, pconstellation); sl = sl->next; } write_orbits_geom(pconstellation); gv_stop(); return EMPTY_str; } /* * orbits_off_cmd() * * Routine to turn off display of orbits */ char * orbits_off_cmd(int argc, char *argv[]) { Satellite_list sl = get_constellation()->satellites; if (!orbits_on_flag) return EMPTY_str; gv_start(); orbits_gv_delete(); while (sl) { orbit_delete(sl->s); sl = sl->next; } orbits_geom_needs_updating = FALSE; orbits_on_flag = FALSE; gv_stop(); return EMPTY_str; } /* * orbits_gv_delete * * routine to delete geomview orbits object */ void orbits_gv_delete() { if (orbits_geom_exists) { gv_delete_geom("Orbits"); orbits_geom_exists = FALSE; } } char * orbits_set_cmd(int argc, char *argv[]) { Constellation *pconstellation = get_constellation(); Satellite s; int n = atoi(argv[2]); unsigned int flag = atoi(argv[3]); s = constellation_search(pconstellation, n); if (s) { if (flag) s->can_display_orbit = 1; else s->can_display_orbit = 0; orbits_geom_needs_updating = TRUE; } return EMPTY_str; } /* * orbit_write_geom * * Write orbit geom for a satellite */ static void orbit_write_geom(const Satellite s, const Constellation * pconstellation) { unsigned int i, segments_drawn, segment_endpoints; double t, ellipse, segment_time; CartesianCoordinates u; CentralBody *pcb = pconstellation->pcb; double scale = pcb->radius; ellipse = s->oe_t.e; segments_drawn = GV_ORBIT_SEGMENTS / (1-ellipse); segment_time = s->period / segments_drawn; segment_endpoints = segments_drawn + 1; /* start of gv orbit description */ fprintf(gv_out, "(read geometry {define orbit_%d {VECT\n1 %d 1\n%d\n1\n\n", s->id, segment_endpoints, segment_endpoints); for (i = 0; i < segment_endpoints; i++) { t = i * segment_time; oe_time_to_geocentric(&u, t, &(s->oe_t), pcb); fprintf(gv_out, "%f %f %f\n", u.x / scale, u.y / scale, u.z / scale); } /* These four numbers specify the color (RGBA). */ if (s->tag) gv_send("1 1 0 1} })\n"); else gv_send("1 0 0 1} })\n"); } /* * orbit_display * * Takes a satellite and displays its orbit */ void orbit_display(Satellite s, const Constellation * pconstellation) { if (!orbits_on_flag) return; orbits_geom_needs_updating = TRUE; gv_start(); orbit_write_geom(s, pconstellation); gv_stop(); } /* * orbits_relocate * * Called to update the orbits when the time has changed */ void orbits_relocate(const Constellation * pconstellation) { Satellite_list sl = pconstellation->satellites; if (!orbits_on_flag) return; while (sl) { if (sl->s->can_display_orbit) orbit_write_geom(sl->s, pconstellation); sl = sl->next; } } /* * orbit_delete * * Takes a satellite and deletes its orbit * ONLY if orbits_on_flag == TRUE */ void orbit_delete(Satellite s) { if (!orbits_on_flag) return; orbits_geom_needs_updating = TRUE; gv_start(); sprintf(name + 6, "%-10d", s->id); gv_delete_handle(name); gv_stop(); } void write_orbits_geom(const Constellation * pconstellation) { Satellite_list sl = pconstellation->satellites; if (orbits_on_flag && orbits_geom_needs_updating) { /* write out new list of all satellites */ gv_send("(geometry Orbits {LIST\n"); while (sl) { if (sl->s->can_display_orbit) { fprintf(gv_out, ":orbit_%d\n", sl->s->id); } sl = sl->next; } gv_send("})\n"); orbits_geom_needs_updating = FALSE; orbits_geom_exists = TRUE; } } savi1.6.0/src/gv_init.c0000644000175000017500000001221114423445060014024 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * gv_init.c * * Routines for displaying satellites in geomview. * * $Id: gv_init.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include #include #include "constants.h" #include "Satellite.h" #include "orbit_utils.h" #include "gv_utils.h" #include "savi.h" #include "sats.h" #include "globals.h" #define DETAILED_TEXTUREMAP_NAME "oogl/blue_marble_land_shallow_topo_2048.jpeg" static char tname[] = "trans_ "; /* * gv_sat_create * * Creates geomview objects for the satellite */ void gv_sat_create(Satellite s, const Constellation * pconstellation) { unsigned int i; for (i = 0; i < N_VIEW_MODULES; i++) if (view_modules[i].display_fn) view_modules[i].display_fn(s, pconstellation); } /* * gv_sat_transform * * Writes a gv transform for a satellite */ void gv_trans_create(Satellite s) { sprintf(tname + 6, "%-10d", s->id); gv_transform(tname, s->transform); } /* * gv_sat_list_create * * Creates all satellites in geomview */ void gv_sat_list_create(const Constellation * pconstellation) { Satellite_list sl = pconstellation->satellites; gv_begin(); while (sl) { gv_sat_create(sl->s, pconstellation); sl = sl->next; } gv_end(); } /* * gv_trans_list_create * * Updates transformation matrices containing positions of all satellites */ void gv_trans_list_create(Satellite_list sl) { gv_begin(); while (sl) { gv_trans_create(sl->s); sl = sl->next; } gv_end(); } /* * provide information on missing texturemap */ void gv_detailed_texturemap_info() { error("can use a detailed unprojected color map, such as the maps from:"); error("NASA's Blue Marble project http://visibleearth.nasa.gov/"); error("JHT's Planet Pixel Emporium http://planetpixelemporium.com/"); fprintf(stderr, "\n Save the jpeg colour map then copy to " DETAILED_TEXTUREMAP_NAME); } /* * load up handle file into geomview * * Returns true if successful. */ unsigned int gv_init() { /* call initialize proc for gv_utils */ gv_init_proc(); /* set gv flag on for display */ geomview_set_flag(TRUE); /* abort early to avoid asking questions of non-existent Geomview */ if (fake_geomview_module) return TRUE; { char *ver; static char knownlatestvers[] = "1.9.5"; static char firstgoodX11logo[] = "1.8.2"; static char firstgoodstreaming[] = "1.9.0"; static char firstgoodzlibstreaming[] = "1.9.5"; static char opengl[] = "OpenGL"; ver = gv_version(); /* If Geomview could be newer, tell user. */ if (strncmp(ver, knownlatestvers, 5) < 0) { error_format("Geomview %s is available from " "http://www.geomview.org/", knownlatestvers); error_format("but you are still using Geomview %s. Please upgrade!\n", ver); } if (!strstr(ver, opengl)) { /* * Figure out if we have a buggy version of Geomview which draws * the logo upside down! */ if (strncmp(firstgoodX11logo, ver, 5) > 0) { geomview_logo = FALSE; error("not drawing logo under Geomview's buggy X11 rendering. Upgrade!"); } error("can use OpenGL for drawing coverage maps in Geomview."); error("configure Geomview with OpenGL (--with-opengl).\n"); } if (strncmp(firstgoodstreaming, ver, 5) > 0) { geomview_stream_textures = FALSE; error("can't stream dynamic coverage maps to this old Geomview. Upgrade!"); } else { if ((debug && strncmp(firstgoodzlibstreaming, ver, 5) > 0)) { geomview_compress2_textures = FALSE; error("can't talk zlib direct down a pipe to this version of Geomview."); error("falling back on older Geomview-spawns-gzip method used by 1.9.4 and older."); } { FILE *f; if (NULL == (f = fopen(DETAILED_TEXTUREMAP_NAME, "r"))) { gv_detailed_texturemap_info(); } else { fclose(f); geomview_detailed_texturemap = TRUE; } } } } /* load up savi base oogl file */ if (!gv_sendfile(HANDLE_FILE_SAVI)) { error_format("gv_init: Can't load file %s", HANDLE_FILE_SAVI); error("file telling Geomview about Earth and satellites is not there!"); return FALSE; } if (!geomview_logo) { return TRUE; } /* load up savi logo file */ if (!gv_sendfile(HANDLE_FILE_LOGO)) { error_format("gv_init: Can't load file %s", HANDLE_FILE_LOGO); error("not drawing SaVi logo in Geomview camera window."); geomview_logo = FALSE; return TRUE; } /* turn on logo */ logo_on_cmd(0, NULL); return TRUE; } savi1.6.0/src/Makefile_defs_0000644000175000017500000000517114423445060015030 0ustar lloydlloyd# # Makefile_defs_ # # Generic definitions can also work for a linux system. # Updated to expect Tcl/Tk 8.5. # # Always run make ARCH=platform from the top-level savi directory. # # $Id: Makefile_defs_ 10 2019-01-24 04:47:40Z lloydwood $ ######################################################## # # # Set machine type -- suffix for savi # # # # If empty symlink in Makefile fails for Cygwin (./!.) # # # ######################################################## MACH = _ ######################################################## # # # set CC to an ANSI C compiler # # # ######################################################## CC = gcc ######################################################## # # # set TCL_INCLUDES so that the compiler can # # find the tcl.h and tk.h # # # # If tcl/tk is installed in a standard place # # it is not necessary to set this. You may need to # # change the numbers to match your version of tcl/tk. # # The numbers in the topmost savi script should also # # match. # # # ######################################################## TCL_INCLUDES = -I/usr/local/lib/tcl8.5 -I/usr/local/lib/tk8.5 ######################################################## # # # set TCL_LIBS so that the compiler can find # # libtcl.a and libtk.a. Alter to suit - see above. # # # ######################################################## TCL_LIBS = -ltcl8.5 -ltk8.5 # the above works on most Linux platforms. # TCL_LIBS = -ltcl -ltk # is a generic alternative to try. # TCL_LIBS = -ltcl84 -ltk84 # works for FreeBSD and Cygwin. ######################################################## # # # Set OTHER_LIBS so that any other stuff needing to # # be linked in will be! # # # ######################################################## OTHER_LIBS = # You may wish to try using some of the following instead: # OTHER_LIBS = -static -lsocket -ldl -lz savi1.6.0/src/coverage.c0000644000175000017500000003465414423445060014177 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * * coverage.c * * $Id: coverage.c 135 2020-01-04 10:04:48Z lloydwood $ */ #include #include #include #include "sats.h" #include "constants.h" #include "globals.h" #include "coverage_vis.h" #include "stats_utils.h" #include "savi.h" #include "time.h" static double START_TIME; static int coverage_flag = FALSE; static int tracks_flag = FALSE; int no_access_flag = FALSE; int map_flag = TRUE; static int print_access_flag = FALSE; static int project_tracks_flag = FALSE; static int tracks_computed_flag = FALSE; static int coverage_computed_flag = FALSE; static unsigned int N_OBSERVATIONS = 1; /* delta t (in seconds) for projecting ground tracks */ #define PROJECT_TRACKS_DT 5.0 /* if c_grid is NULL we are about to draw first image */ static grid *c_grid = NULL; /* * redraw_coverage_display */ void redraw_coverage_display(void) { if (!c_grid) return; /* need to recompute coverage first */ grid_and_foreground_to_image(coverage_projection, c_grid, TRUE); update_coverage_display(); } /* * update_coverage_display */ void update_coverage_display(void) { if (!c_grid) return; update_display(coverage_projection, c_grid, coverage_flag, tracks_flag, project_tracks_flag); } /* * coverage_map_on_cmd */ char * coverage_map_on_cmd(int argc, char *argv[]) { if (c_grid) { destroy_grid(c_grid); c_grid = create_grid(Image_Height, Image_Width); } image_init(c_grid); return EMPTY_str; } /* * coverage_map_off_cmd */ char * coverage_map_off_cmd(int argc, char *argv[]) { if (c_grid) { /* could do destroy_grid(c_grid); */ } return EMPTY_str; } /* * coverage_on_cmd - * Set flags to indicate that coverage should be actually computed and * displayed. Call coverage_compute and update_display to get the ball * rolling. (These are repeatedly called during the sats_update cycle.) */ char * coverage_on_cmd(int argc, char *argv[]) { Constellation *pconstellation; CentralBody *pcb; Satellite_list sl; if (Image_Height * Image_Width <= 0) { return EMPTY_str; } /* do memory allocations and initialize display first time only */ if (!c_grid) { c_grid = create_grid(Image_Height, Image_Width); image_init(c_grid); } /* set variables so that coverage will be computed and displayed */ coverage_flag = TRUE; coverage_computed_flag = FALSE; init_coverage_time(); /* reset average coverage info */ pconstellation = get_constellation(); pcb = pconstellation->pcb; sl = pconstellation->satellites; coverage_compute(sl, FALSE, pcb); /* compute the current coverage */ update_coverage_display(); return EMPTY_str; } char * coverage_off_cmd(int argc, char *argv[]) { if (c_grid) { clear_interval(c_grid); clear_intensity(c_grid); update_coverage_display(); } coverage_flag = FALSE; return EMPTY_str; } char * coverage_set_cmd(int argc, char *argv[]) { Constellation *pconstellation = get_constellation(); Satellite s; int n = atoi(argv[2]); int flag = atoi(argv[3]); s = constellation_search(pconstellation, n); if (s) { if (FALSE == flag) { s->can_display_coverage = 0; } else { s->can_display_coverage = 1; } if (geomview_module) { cones_gv_update(); footprints_gv_update(); } } return EMPTY_str; } char * no_access_on_cmd(int argc, char *argv[]) { no_access_flag = TRUE; if (c_grid) { if (coverage_flag) { clear_interval(c_grid); } update_coverage_display(); } return EMPTY_str; } char * no_access_off_cmd(int argc, char *argv[]) { no_access_flag = FALSE; if (c_grid) { update_coverage_display(); } return EMPTY_str; } char * print_access_on_cmd(int argc, char *argv[]) { print_access_flag = TRUE; return EMPTY_str; } char * print_access_off_cmd(int argc, char *argv[]) { print_access_flag = FALSE; return EMPTY_str; } char * map_on_cmd(int argc, char *argv[]) { map_flag = TRUE; if (c_grid) { update_coverage_display(); } redraw_earth(argc, argv); return EMPTY_str; } char * map_off_cmd(int argc, char *argv[]) { map_flag = FALSE; if (c_grid) { update_coverage_display(); } redraw_earth(argc, argv); return EMPTY_str; } char * tracks_on_cmd(int argc, char *argv[]) { Constellation *pconstellation; CentralBody *pcb; Satellite_list sl; /* do memory allocations and initialize display first time only */ if (!c_grid) { c_grid = create_grid(Image_Height, Image_Width); image_init(c_grid); } /* set variable so tracks will be plotted */ tracks_flag = TRUE; tracks_computed_flag = FALSE; pconstellation = get_constellation(); pcb = pconstellation->pcb; sl = pconstellation->satellites; tracks_compute(sl, pcb); /* compute current tracks */ update_coverage_display(); return EMPTY_str; } char * tracks_off_cmd(int argc, char *argv[]) { if (c_grid) { if (!project_tracks_flag) { reset_foreground(coverage_projection, c_grid); } update_coverage_display(); } tracks_flag = FALSE; return EMPTY_str; } /* * project_tracks_on_cmd - * Draw ground tracks forwards in time for all satellites. */ char * project_tracks_on_cmd(int argc, char *argv[]) { Constellation *pconstellation; Satellite_list sl, Sl; CentralBody *pcb; double c_time, f_time, t, dt; /* interval from hours to seconds */ Satellite s; unsigned int color; int npts, npts_start; if (tracks_interval >= 0) dt = PROJECT_TRACKS_DT; else dt = -PROJECT_TRACKS_DT; c_time = current_time(); f_time = c_time + tracks_interval * 60 * 60; /* convert the tracks */ npts_start = (int) ((f_time - c_time) / dt); pconstellation = get_constellation(); pcb = pconstellation->pcb; sl = Sl = pconstellation->satellites; while (sl) { if (sl->s->can_display_satellite) { if (sl->s->tag == 1) { color = SPECIAL_PROJECT_TRACKS_CI; } else { color = PROJECT_TRACKS_CI; } s = satellite_create(0, &(sl->s->oe), pcb); t = c_time; npts = npts_start; while ((npts--) >= 0) { satellite_compute_position(s, t, pcb); track_to_foreground(s, coverage_projection, c_grid, color, pcb); t += dt; } satellite_destroy(s); } sl = sl->next; } project_tracks_flag = TRUE; if (c_grid) { update_coverage_display(); } return EMPTY_str; } /* * project_tracks_off_cmd - Erase all ground tracks. */ char * project_tracks_off_cmd(int argc, char *argv[]) { Constellation *pconstellation; Satellite_list sl; CentralBody *pcb; if (c_grid) { /* Rather than resetting entire foreground, we could step through it and selectively erase PROJECT_TRACKS_CI etc. */ reset_foreground(coverage_projection, c_grid); if (tracks_flag) { pconstellation = get_constellation(); pcb = pconstellation->pcb; sl = pconstellation->satellites; tracks_compute(sl, pcb); /* compute current satellite locations */ } update_coverage_display(); } project_tracks_flag = FALSE; return EMPTY_str; } /* * project_tracks_reset */ void project_tracks_reset() { if (!project_tracks_flag) return; (void) project_tracks_off_cmd(0, NULL); /* clear current ground tracks */ (void) project_tracks_on_cmd(0, NULL); /* and then re-draw. */ } int get_coverage_type() { return coverage_type; } int get_map_flag() { return map_flag; } /* * Clear current coverage completely */ void clear_coverage(void) { if (c_grid) { clear_intensity(c_grid); clear_interval(c_grid); } } /* * Fade current coverage by increasing values */ void coverage_decay(void) { if (c_grid && coverage_flag && no_access_flag) { decay_interval(c_grid); } } /* * fill out the pixel map for the Tk image */ void coverage_compute(const Satellite_list SL, unsigned int force, const CentralBody * pcb) { if (!coverage_flag && !force) return; if (!c_grid) return; clear_intensity(c_grid); fill_grid(SL, coverage_projection, coverage_type, coverage_angle * DEG_TO_RAD, pcb, c_grid); coverage_computed_flag = TRUE; update_coverage_time(); } /* * tracks_compute - Plots point under satellites onto foreground image */ void tracks_compute(const Satellite_list SL, const CentralBody * pcb) { if (!tracks_flag) return; if (!c_grid) return; if (!project_tracks_flag) { reset_foreground(coverage_projection, c_grid); } tracks_to_foreground(SL, coverage_projection, c_grid, GROUND_TRACKS_CI, pcb); tracks_computed_flag = TRUE; } /* * coverage_proj_cmd - sets type of projection */ char * coverage_proj_cmd(int argc, char *argv[]) { Constellation *pconstellation = get_constellation(); Satellite_list sl = pconstellation->satellites; CentralBody *pcb = pconstellation->pcb; coverage_compute(sl, FALSE, pcb); /* compute the current coverage */ if (c_grid) { update_coverage_display(); } return EMPTY_str; } /* * coverage_angle_type - * sets type of angle for footprint computations - from earth or from satellite */ char * coverage_angle_type_cmd(int argc, char *argv[]) { Constellation *pconstellation; Satellite_list sl; CentralBody *pcb; int t = atoi(argv[2]); coverage_type = t; pconstellation = get_constellation(); sl = pconstellation->satellites; pcb = pconstellation->pcb; coverage_compute(sl, TRUE, pcb); /* compute the current coverage */ if (c_grid) { clear_interval(c_grid); update_coverage_display(); } /* rebuild the coverage cones, footprints, .. */ for (t = 0; t < N_VIEW_MODULES; t++) if (view_modules[t].coverage_rebuild_fn) view_modules[t].coverage_rebuild_fn(); return EMPTY_str; } char * coverage_save_map_cmd(int argc, char *argv[]) { write_image_to_file(argv[2]); return EMPTY_str; } char * coverage_save_plot_cmd(int argc, char *argv[]) { Constellation *pconstellation; CentralBody *pcb; Satellite_list sl; LatLon pl; double time; FILE *f; pconstellation = get_constellation(); pcb = pconstellation->pcb; sl = pconstellation->satellites; if (NULL == (f = fopen(argv[2], "w"))) { fprintf(stderr,"\nSaVi: unable to save dump file to %s", argv[2]); return EMPTY_str; } time = current_time(); fprintf(f, "Dumping satellites at time %f\n", time); /* first in list in sunlight - skip it. */ if (sl) sl = sl->next; while (sl) { spherical_to_lat_lon(&pl, &(sl->s->x_S), sl->s->t, pcb); /* meed to modify sat plot scripts to support name, not just number */ fprintf(f, "%s\t%f\t%f\n",sl->s->name, pl.lat, pl.lon); sl = sl->next; } fclose(f); fprintf(stderr, "\nSaVi: satellite plot script input written to %s", argv[2]); return EMPTY_str; } char * coverage_color_update_cmd(int argc, char *argv[]) { coverage_color_copy(); return EMPTY_str; } /* * coverage_display - Display the coverage map. */ void coverage_display(const Satellite_list SL, unsigned int force, const CentralBody * pcb) { if (!coverage_flag && !tracks_flag && !project_tracks_flag && !force) return; if (!c_grid) return; /* image not yet created */ update_coverage_display(); } /* * init_coverage_time - Initialize variables for computing mean coverage. */ void init_coverage_time() { START_TIME = current_time(); coverage_init_time_update(START_TIME); N_OBSERVATIONS = 1; } /* * update_coverage_time - Update coverage time, for use in computing mean coverage. */ void update_coverage_time() { coverage_time_update(current_time() - START_TIME); } /* * mean_coverage - Compute mean coverage over the current time interval. */ double mean_coverage(int projection_type, grid * g) { static double mean; mean = (mean * (N_OBSERVATIONS - 1) + total_coverage(projection_type, FALSE, g)) / N_OBSERVATIONS; N_OBSERVATIONS++; return (mean); } /* * Compute percentage covered from an intensity array. * Earth occupies 2/PI of the image if projection is SINUSOIDAL. * Earth occupies PI/4 of the image if the image is SPHERICAL. * And all of image if projection is CYLINDRICAL or UNPROJECTED. */ double total_coverage(int projection_type, int output, grid *g) { double cov; if (output) { if (print_access_flag) { float coverage, totCoverage = 0.0; /* * Use slightly off values to avoid cos(90), cos(-90) * because of later divide by 0 */ float lat = 89.85, latincr = 4.9905, cosLat; int i, numBins = 37; char coverStr[LENGTH_STRING_BUFFER] = ""; /* * Format a string containing coverage percentages * for specified latitudes. Print the string */ for (; lat > -89.99; lat -= latincr) { i = (90.0 - lat) * g->height / 180.0; switch (projection_type) { case SINUSOIDAL: case SPHERICAL: case SPHERICAL_90: cosLat = cos(DEG_TO_RAD * lat); break; default: cosLat = 1.0; } if (debug) fprintf(stderr, "%.1f %d %d %d %d\n", lat, g->covered[i], (int) (cosLat * g->width), i, g->height); coverage = MIN(100.0, (100.0 * g->covered[i]) / (cosLat * g->width)); /* Multiply coverage by cosLat to deemphasize poles and divide by numbins */ totCoverage += (coverage * cosLat / numBins); sprintf(&coverStr[strlen(coverStr)], "%3.0f%s", coverage, ((lat > -85) ? " " : "\n")); } fprintf(stderr, coverStr); /* Use total coverage calculated by latitude instead of overall number */ return MIN(100.0, (((projection_type == SINUSOIDAL)|| (projection_type == SPHERICAL) || (projection_type == SPHERICAL_90)) ? totCoverage * PI / 2.0 : totCoverage)); } } switch (projection_type) { case SINUSOIDAL: cov = 100.0*g->count*PI/g->height/g->width/2; break; case SPHERICAL: case SPHERICAL_90: cov = 100.0*g->count*4/g->height/g->width/PI; break; case CYLINDRICAL: case UNPROJECTED: default: /* is this correct for UNPROJECTED? */ cov = 100.0*g->count/g->height/g->width; } return MIN(100.0, cov); } savi1.6.0/src/tcl_utils.c0000644000175000017500000003344314423445060014401 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * tcl_utils.c * * $Id: tcl_utils.c 190 2023-04-02 03:52:19Z lloydwood $ */ #include "constants.h" #include "sats.h" #include "utils.h" #include "globals.h" #include "tcl_utils.h" static Tk_Window mainWindow; /* The main window for the application. */ /* we want to bypass Tcl_Eval for speed in some case, so store some cmd info */ static Tcl_CmdInfo update_info; static unsigned int tcl_app_init(void); static unsigned int prepend_to_auto_path(const char []); /* * tcl_init * * Initialisation of tcl interface */ unsigned int tcl_init(Tcl_Interp * interpreter) { if (Tcl_Init(interpreter) == TCL_ERROR) { #if (TK_MAJOR_VERSION >= 8) error_format("tcl_init: Error in Tcl_Init: %s", Tcl_GetStringResult(interpreter)); #else error_format("tcl_init: Error in Tcl_Init: %s", interpreter->result); #endif return FALSE; } return TRUE; } /* * tk_init * * Initialization of tk interface */ unsigned int tk_init(Tcl_Interp * interpreter) { void * screenName = NULL; static char baseName[] = "Satellites"; static char className[] = ""; if (Tk_Init(interpreter) == TCL_ERROR) { #if (TK_MAJOR_VERSION >= 8) error_format("tk_init: Error in Tk_Init: %s", Tcl_GetStringResult(interpreter)); #else error_format("tk_init: Error in Tk_Init: %s", interpreter->result); #endif return FALSE; } if (!tcl_app_init()) { #if (TK_MAJOR_VERSION >= 8) error_format("tk_init: Error in tcl_app_init: %s", Tcl_GetStringResult(interpreter)); #else error_format("tk_init: Error in tcl_app_init: %s", interpreter->result); #endif return FALSE; } #if ( (TK_MAJOR_VERSION > 4) || ( (TK_MAJOR_VERSION == 4) && (TK_MINOR_VERSION > 0)) ) if (!(mainWindow = Tk_CreateWindow(interpreter, screenName, baseName, className))) { # if (TK_MAJOR_VERSION >= 8) error_format("tk_init: Can't create main wainWindow: %s", Tcl_GetStringResult(interpreter)); # else error_format("tk_init: Can't create main wainWindow: %s", interpreter->result); # endif return FALSE; } #else if (!(mainWindow = Tk_CreateMainWindow(interpreter, screenName, baseName, className))) { # if (TK_MAJOR_VERSION >= 8) error_format("tk_init: Can't create main wainWindow: %s", Tcl_GetStringResult(interpreter)); # else error_format("tk_init: Can't create main wainWindow: %s", interpreter->result); # endif return FALSE; } #endif return (tk_update()); } /* * tcl_app_init * * Application specific initialization commands for tcl/tk * */ static unsigned int tcl_app_init() { CentralBody *pcb = get_constellation()->pcb; static char command0[] = "satellites"; static char command1[] = "savi"; static char update[] = "update"; static char var0[] = "delta_t"; static char var1[] = "coverage_angle"; static char var2[] = "IM_W"; static char var3[] = "IM_H"; static char var4[] = "params(Radius)"; static char var5[] = "params(Mu)"; static char var6[] = "params(Omega)"; static char var7[] = "params(J2)"; static char var8[] = "params(orbital_period)"; static char var9[] = "params(tilt)"; static char var10[] = "tracks_interval"; static char var11[] = "FS_D"; static char var12[] = "NUM_COLORS"; static char var13[] = "coverage_projection"; static char var14[] = "Longitude_Center_Line"; static char var15[] = "coverage_display_center_longitude"; static char var16[] = "first_filename"; static char var17[] = "debug"; static char var18[] = "splash_about"; static char var19[] = "DIV(0)"; static char var20[] = "DEC(0)"; static char var21[] = "DIV(1)"; static char var22[] = "DEC(1)"; static char var23[] = "DIV(2)"; static char var24[] = "DEC(2)"; static char var25[] = "DIV(3)"; static char var26[] = "DEC(3)"; static char var27[] = "DIV(4)"; static char var28[] = "DEC(4)"; static char var29[] = "DIV(5)"; static char var30[] = "DEC(5)"; static char var31[] = "DIV(6)"; static char var32[] = "DEC(6)"; static char var33[] = "DIV(7)"; static char var34[] = "DEC(7)"; static char var35[] = "DIV(8)"; static char var36[] = "DEC(8)"; static char var37[] = "DIV(9)"; static char var38[] = "DEC(9)"; static char var39[] = "DIV(10)"; static char var40[] = "DEC(10)"; static char var41[] = "DIV(11)"; static char var42[] = "DEC(11)"; static char var43[] = "DIV(12)"; static char var44[] = "DEC(12)"; static char var45[] = "DIV(13)"; static char var46[] = "DEC(13)"; static char var47[] = "DIV(14)"; static char var48[] = "DEC(14)"; static char var49[] = "DIV(15)"; static char var50[] = "DEC(15)"; static char var51[] = "DIV(16)"; static char var52[] = "DEC(16)"; static char var53[] = "DIV(17)"; static char var54[] = "DEC(17)"; static char var55[] = "DIV(18)"; static char var56[] = "DEC(18)"; static char var57[] = "DIV(19)"; static char var58[] = "DEC(19)"; static char var59[] = "DIV(20)"; static char var60[] = "DEC(20)"; static char var61[] = "DIV(21)"; static char var62[] = "DEC(21)"; static char var63[] = "DIV(22)"; static char var64[] = "DEC(22)"; static char var65[] = "DIV(23)"; static char var66[] = "DEC(23)"; static char var67[] = "DIV(24)"; static char var68[] = "DEC(24)"; static char var69[] = "DIV(25)"; static char var70[] = "DEC(25)"; static char var71[] = "DIV(26)"; static char var72[] = "DEC(26)"; static char var73[] = "DIV(27)"; static char var74[] = "DEC(27)"; static char var75[] = "DIV(28)"; static char var76[] = "DEC(28)"; static char var77[] = "DIV(29)"; static char var78[] = "DEC(29)"; static char var79[] = "buttons_menu"; static char var80[] = "min_transmit_altitude"; static char var81[] = "parallels_angle"; static char var82[] = "equatorial_exclusion_angle"; static char var83[] = "coverage_all_projections"; unsigned int test; /* add directory of tcl code */ prepend_to_auto_path(TCL_DIR); /* add special commands */ Tcl_CreateCommand(interp, command0, (Tcl_CmdProc *) satCmd, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp, command1, (Tcl_CmdProc *) satCmd, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); /* get info on some commands for optimization */ Tcl_GetCommandInfo(interp, update, &update_info); /* link some variables */ Tcl_LinkVar(interp, var0, (char *) &delta_t, TCL_LINK_DOUBLE); Tcl_LinkVar(interp, var1, (char *) &coverage_angle, TCL_LINK_DOUBLE); Tcl_LinkVar(interp, var2, (char *) &Image_Width, TCL_LINK_INT); Tcl_LinkVar(interp, var3, (char *) &Image_Height, TCL_LINK_INT); Tcl_LinkVar(interp, var4, (char *) &(pcb->radius), TCL_LINK_DOUBLE); Tcl_LinkVar(interp, var5, (char *) &(pcb->mu), TCL_LINK_DOUBLE); Tcl_LinkVar(interp, var6, (char *) &(pcb->rotation_rate), TCL_LINK_DOUBLE); Tcl_LinkVar(interp, var7, (char *) &(pcb->J2), TCL_LINK_DOUBLE); Tcl_LinkVar(interp, var8, (char *) &(pcb->orbital_period), TCL_LINK_DOUBLE); Tcl_LinkVar(interp, var9, (char *) &(pcb->tilt), TCL_LINK_DOUBLE); Tcl_LinkVar(interp, var10, (char *) &tracks_interval, TCL_LINK_DOUBLE); Tcl_LinkVar(interp, var11, (char *) &Fisheye_Diameter, TCL_LINK_INT); Tcl_LinkVar(interp, var12, (char *) &NUM_COLORS, TCL_LINK_INT); Tcl_LinkVar(interp, var13, (char *) &coverage_projection, TCL_LINK_INT); Tcl_LinkVar(interp, var14, (char *) &Longitude_Center_Line, TCL_LINK_INT); Tcl_LinkVar(interp, var15, (char *) &coverage_display_center_longitude, TCL_LINK_INT); Tcl_LinkVar(interp, var16, (char *) &first_filename, TCL_LINK_STRING | TCL_LINK_READ_ONLY); Tcl_LinkVar(interp, var17, (char *) &debug, TCL_LINK_INT | TCL_LINK_READ_ONLY); Tcl_LinkVar(interp, var18, (char *) &splash_about, TCL_LINK_INT | TCL_LINK_READ_ONLY); Tcl_LinkVar(interp, var19, (char *) &DIV0, TCL_LINK_INT); Tcl_LinkVar(interp, var20, (char *) &DEC0, TCL_LINK_INT); Tcl_LinkVar(interp, var21, (char *) &DIV1, TCL_LINK_INT); Tcl_LinkVar(interp, var22, (char *) &DEC1, TCL_LINK_INT); Tcl_LinkVar(interp, var23, (char *) &DIV2, TCL_LINK_INT); Tcl_LinkVar(interp, var24, (char *) &DEC2, TCL_LINK_INT); Tcl_LinkVar(interp, var25, (char *) &DIV3, TCL_LINK_INT); Tcl_LinkVar(interp, var26, (char *) &DEC3, TCL_LINK_INT); Tcl_LinkVar(interp, var27, (char *) &DIV4, TCL_LINK_INT); Tcl_LinkVar(interp, var28, (char *) &DEC4, TCL_LINK_INT); Tcl_LinkVar(interp, var29, (char *) &DIV5, TCL_LINK_INT); Tcl_LinkVar(interp, var30, (char *) &DEC5, TCL_LINK_INT); Tcl_LinkVar(interp, var31, (char *) &DIV6, TCL_LINK_INT); Tcl_LinkVar(interp, var32, (char *) &DEC6, TCL_LINK_INT); Tcl_LinkVar(interp, var33, (char *) &DIV7, TCL_LINK_INT); Tcl_LinkVar(interp, var34, (char *) &DEC7, TCL_LINK_INT); Tcl_LinkVar(interp, var35, (char *) &DIV8, TCL_LINK_INT); Tcl_LinkVar(interp, var36, (char *) &DEC8, TCL_LINK_INT); Tcl_LinkVar(interp, var37, (char *) &DIV9, TCL_LINK_INT); Tcl_LinkVar(interp, var38, (char *) &DEC9, TCL_LINK_INT); Tcl_LinkVar(interp, var39, (char *) &DIV10, TCL_LINK_INT); Tcl_LinkVar(interp, var40, (char *) &DEC10, TCL_LINK_INT); Tcl_LinkVar(interp, var41, (char *) &DIV11, TCL_LINK_INT); Tcl_LinkVar(interp, var42, (char *) &DEC11, TCL_LINK_INT); Tcl_LinkVar(interp, var43, (char *) &DIV12, TCL_LINK_INT); Tcl_LinkVar(interp, var44, (char *) &DEC12, TCL_LINK_INT); Tcl_LinkVar(interp, var45, (char *) &DIV13, TCL_LINK_INT); Tcl_LinkVar(interp, var46, (char *) &DEC13, TCL_LINK_INT); Tcl_LinkVar(interp, var47, (char *) &DIV14, TCL_LINK_INT); Tcl_LinkVar(interp, var48, (char *) &DEC14, TCL_LINK_INT); Tcl_LinkVar(interp, var49, (char *) &DIV15, TCL_LINK_INT); Tcl_LinkVar(interp, var50, (char *) &DEC15, TCL_LINK_INT); Tcl_LinkVar(interp, var51, (char *) &DIV16, TCL_LINK_INT); Tcl_LinkVar(interp, var52, (char *) &DEC16, TCL_LINK_INT); Tcl_LinkVar(interp, var53, (char *) &DIV17, TCL_LINK_INT); Tcl_LinkVar(interp, var54, (char *) &DEC17, TCL_LINK_INT); Tcl_LinkVar(interp, var55, (char *) &DIV18, TCL_LINK_INT); Tcl_LinkVar(interp, var56, (char *) &DEC18, TCL_LINK_INT); Tcl_LinkVar(interp, var57, (char *) &DIV19, TCL_LINK_INT); Tcl_LinkVar(interp, var58, (char *) &DEC19, TCL_LINK_INT); Tcl_LinkVar(interp, var59, (char *) &DIV20, TCL_LINK_INT); Tcl_LinkVar(interp, var60, (char *) &DEC20, TCL_LINK_INT); Tcl_LinkVar(interp, var61, (char *) &DIV21, TCL_LINK_INT); Tcl_LinkVar(interp, var62, (char *) &DEC21, TCL_LINK_INT); Tcl_LinkVar(interp, var63, (char *) &DIV22, TCL_LINK_INT); Tcl_LinkVar(interp, var64, (char *) &DEC22, TCL_LINK_INT); Tcl_LinkVar(interp, var65, (char *) &DIV23, TCL_LINK_INT); Tcl_LinkVar(interp, var66, (char *) &DEC23, TCL_LINK_INT); Tcl_LinkVar(interp, var67, (char *) &DIV24, TCL_LINK_INT); Tcl_LinkVar(interp, var68, (char *) &DEC24, TCL_LINK_INT); Tcl_LinkVar(interp, var69, (char *) &DIV25, TCL_LINK_INT); Tcl_LinkVar(interp, var70, (char *) &DEC25, TCL_LINK_INT); Tcl_LinkVar(interp, var71, (char *) &DIV26, TCL_LINK_INT); Tcl_LinkVar(interp, var72, (char *) &DEC26, TCL_LINK_INT); Tcl_LinkVar(interp, var73, (char *) &DIV27, TCL_LINK_INT); Tcl_LinkVar(interp, var74, (char *) &DEC27, TCL_LINK_INT); Tcl_LinkVar(interp, var75, (char *) &DIV28, TCL_LINK_INT); Tcl_LinkVar(interp, var76, (char *) &DEC28, TCL_LINK_INT); Tcl_LinkVar(interp, var77, (char *) &DIV29, TCL_LINK_INT); Tcl_LinkVar(interp, var78, (char *) &DEC29, TCL_LINK_INT); Tcl_LinkVar(interp, var79, (char *) &buttons_menu, TCL_LINK_INT); Tcl_LinkVar(interp, var80, (char *) &min_transmit_altitude, TCL_LINK_INT); Tcl_LinkVar(interp, var81, (char *) ¶llels_angle, TCL_LINK_DOUBLE); Tcl_LinkVar(interp, var82, (char *) &equatorial_exclusion_angle, TCL_LINK_DOUBLE); Tcl_LinkVar(interp, var83, (char *) &coverage_all_projections, TCL_LINK_INT); /* execute initialization */ { static char buf0_0[] = "set geomview_module 0"; static char buf0_1[] = "set geomview_module 1"; static char buf1[] = "app_init"; if (geomview_module) { test = tcl_script(buf0_1); } else { test = tcl_script(buf0_0); } if (test) { test = tcl_script(buf1); } } return test; } /* * autopath is the directory list variable which tcl uses to * look for unknown commands */ static unsigned int prepend_to_auto_path(const char path[]) { sprintf(cmd, "set auto_path [linsert $auto_path 0 %s]", path); return tcl_script(cmd); } /* * tcl_script * * execute script in tcl */ unsigned int tcl_script(char script[]) { if (Tcl_GlobalEval(interp, script) == TCL_ERROR) { #if (TK_MAJOR_VERSION >= 8) error_format("tcl_error: %s", Tcl_GetStringResult(interp)); #else error_format("tcl_error: %s", interp->result); #endif return FALSE; } return TRUE; } /* * tk_update * * Routine to process tk events * */ unsigned int tk_update() { static char update[] = "update"; const char *argv[1]; int argc = 1; argv[0] = update; (*update_info.proc) (update_info.clientData, interp, argc, argv); #if ( (TK_MAJOR_VERSION > 4) || ( (TK_MAJOR_VERSION == 4) && (TK_MINOR_VERSION > 0)) ) if (Tk_GetNumMainWindows() > 0) return TRUE; #else if (tk_NumMainWindows > 0) return TRUE; #endif return FALSE; } /* * returns ClientData for a tcl object */ ClientData get_ClientData(char *obj) { Tcl_CmdInfo info; if (Tcl_GetCommandInfo(interp, obj, &info)) return info.clientData; /* * A useful method for testing and debugging of Tcl is * to print bad object name strings obj to stderr here. */ return NULL; } savi1.6.0/src/Makefile_defs_freebsd0000644000175000017500000000531714423445060016365 0ustar lloydlloyd# # Makefile_defs_freebsd # # You must modify tcl/Makefile to call tclsh8.5 where indicated. # Definitions which first worked for FreeBSD 6.0 using Tcl/Tk 8.4 # tested at Swinburne CAIA, Melbourne, with thanks to # Lawrence Stewart (lstewart@room52.net). # Now updated to Tcl/Tk 8.5 for FreeBSD 8.1. # # The FreeBSD ports install of Tcl and Tk seems to call everything # blahN.N where N.N is the version number. So, you run # e.g. tclsh8.5. Naming of libraries, e.g. -ltk85, is similar. # Always run make ARCH=platform from the top-level savi directory. # # $Id: Makefile_defs_freebsd 10 2019-01-24 04:47:40Z lloydwood $ ######################################################## # # # Set machine type -- suffix for savi # # # ######################################################## MACH = freebsd ######################################################## # # # set CC to an ANSI C compiler # # # ######################################################## CC = gcc ######################################################## # # # set TCL_INCLUDES so that the compiler can # # find the tcl.h and tk.h # # # # If tcl/tk is installed in a standard place # # it is not necessary to set this. You may need to # # change the numbers to match your version of tcl/tk. # # The numbers in the topmost savi script should also # # match. # # # ######################################################## TCL_INCLUDES = -I/usr/local/include/tcl8.5 -I/usr/local/include/tk8.5 -I/usr/X11R6/include ######################################################## # # # set TCL_LIBS so that the compiler can find # # libtcl.a and libtk.a. Alter to suit - see above. # # # ######################################################## TCL_LIBS = -ltcl85 -ltk85 ######################################################## # # # Set OTHER_LIBS so that any other stuff needing to # # be linked in will be! # # # ######################################################## OTHER_LIBS = -L/usr/local/lib #-ldl # OTHER_LIBS = -static savi1.6.0/src/Makefile_defs_sun40000644000175000017500000000421714423445060015642 0ustar lloydlloyd# # Makefile_defs_sun4 # # Definitions for Solaris, when generic 'make' picks up on $ARCH=sun4 # # Always run make ARCH=platform from the top-level savi directory. # # $Id: Makefile_defs_sun4 10 2019-01-24 04:47:40Z lloydwood $ ######################################################## # # # Set machine type -- suffix for savi # # # ######################################################## MACH = sun4 ######################################################## # # # set CC to an ANSI C compiler # # # ######################################################## CC = gcc # override line terminator for version.c creation LINEEND = ######################################################## # # # set TCL_INCLUDES so that the compiler can # # find the tcl.h and tk.h # # # # if tcl/tk is installed in a standard place # # it is not necessary to set this # # # ######################################################## TCL_INCLUDES = -I/usr/local/include ######################################################## # # # set TCL_LIBS so that the compiler can find # # libtcl.a and libtk.a # # # ######################################################## TCL_LIBS = -L/usr/local/lib -ltk -ltcl ######################################################## # # # Set OTHER_LIBS so that any other stuff needing to # # be linked in will be! # # # ######################################################## OTHER_LIBS = -lsocket -lnsl -ldl savi1.6.0/src/modules.c0000644000175000017500000000406314423445060014043 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * modules.c * * * Eventually additional features will be all installed here * and the code will loop over elements at appropriate times. * Right now, most of the calls to the modules are sprinkled * throughout the code :( * * $Id: modules.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include "Satellite.h" #include "savi.h" ViewModule view_modules[] = { {NULL, NULL, NULL, NULL, NULL, earth_off_cmd, NULL}, {NULL, NULL, NULL, NULL, NULL, sun_off_cmd, NULL}, {NULL, NULL, NULL, NULL, NULL, axes_off_cmd, NULL}, {NULL, NULL, NULL, NULL, NULL, plane_off_cmd, NULL}, {NULL, NULL, NULL, NULL, NULL, stars_off_cmd, NULL}, {NULL, NULL, NULL, NULL, NULL, logo_off_cmd, NULL}, {write_satellites_geom, NULL, satellite_display, satellites_relocate, satellite_delete, satellites_off_cmd, satellites_gv_delete}, {write_orbits_geom, NULL, orbit_display, orbits_relocate, orbit_delete, orbits_off_cmd, orbits_gv_delete}, {write_cones_geom, cones_rebuild, cone_display, cones_relocate, cone_delete, cones_off_cmd, cones_gv_delete}, {write_footprints_geom, footprints_rebuild, footprint_display, footprints_relocate, footprint_delete, footprints_off_cmd, footprints_gv_delete} }; const int N_VIEW_MODULES = sizeof(view_modules) / sizeof(ViewModule); CompModule comp_modules[] = { {NULL} , }; const int N_COMP_MODULES = sizeof(comp_modules) / sizeof(CompModule); savi1.6.0/src/utils.c0000644000175000017500000001124314423445060013531 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * utils.c * * $Id: utils.c 146 2020-01-16 02:14:25Z lloydwood $ */ #include #include #include /* for select */ #include #include #include "constants.h" #include "globals.h" #include "utils.h" /* * copyfile(stdout, "data.txt") * * Will copy the file data.txt to stdout. * Returns TRUE if successful, else FALSE. */ unsigned int copyfile(FILE * out_fp, const char filename[]) { FILE *in_fp; char buf[LENGTH_STRING_BUFFER]; if (!out_fp) return FALSE; if (NULL == (in_fp = fopen(filename, "r"))) return FALSE; while (fgets(buf, LENGTH_STRING_BUFFER, in_fp)) { /* skip comments - 35 is ASCII for hash, followed by space or return. */ /* but doesn't handle multiline coomments indicated by backslash! */ if ((35 == buf[0]) && \ ((32 == buf[1]) || (13 == buf[1])) && \ !geomview_oogl_verbose) { /* skip line and do nothing */ } else { fprintf(out_fp, "%s", buf); } } fflush(out_fp); fclose(in_fp); return TRUE; } /* * forward over comments and any newlines and white space * */ void forward_over_comments(FILE * fp) { int c = getc(fp); while ((c == '\n') || (c == ' ') || (c == '\t') || (c == '#')) { if (c == '#') { /* skip to end of line */ do { c = getc(fp); } while ((c != '\n') && (c != EOF)); } c = getc(fp); } ungetc(c, fp); } /* * identity * * Fills in a 4x4 matrix to be the identity matrix */ void identity(double m[4][4]) { unsigned int i, j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) m[i][j] = ((i == j) ? 1.0 : 0.0); } /* * Return the norm of a CartesianCoordinate vector */ double norm(const CartesianCoordinates * px) { return (sqrt(px->x * px->x + px->y * px->y + px->z * px->z)); } /* * Normalizes a CartesianCoordinate vector to unit length */ void normalize(CartesianCoordinates * px) { double l = norm(px); if (l == 0.0) return; px->x /= l; px->y /= l; px->z /= l; } /* * Return the dot-product of two CartesianCoordinate vectors. */ double dot(const CartesianCoordinates * px, const CartesianCoordinates * py) { return (px->x * py->x + px->y * py->y + px->z * py->z); } /* * The vector cross-product of two CartesianCoordinate vectors */ void cross_product(CartesianCoordinates * pucv, const CartesianCoordinates * pu, const CartesianCoordinates * pv) { double pu_x = pu->x; double pu_y = pu->y; double pu_z = pu->z; double pv_x = pv->x; double pv_y = pv->y; double pv_z = pv->z; pucv->x = (pu_y * pv_z - pu_z * pv_y); pucv->y = (pu_z * pv_x - pu_x * pv_z); pucv->z = (pu_x * pv_y - pu_y * pv_x); } void print_vec(const char msg[], const CartesianCoordinates * pv) { fprintf(stderr, "%s = (%f,%f,%f)\n", msg, pv->x, pv->y, pv->z); } /* * Rotate a vector by angle theta about the z-axis. * * The rotation matrix is * * cos(theta) -sin(theta) 0 * sin(theta) cos(theta) 0 * 0 0 1 * */ void rotate_z(const CartesianCoordinates * v_old, const double theta, CartesianCoordinates * v_new) { double cos_theta = cos(theta); double sin_theta = sin(theta); double old_x = v_old->x; double old_y = v_old->y; v_new->x = cos_theta * old_x - sin_theta * old_y; v_new->y = sin_theta * old_x + cos_theta * old_y; v_new->z = v_old->z; } /* * error_format * * prints a string using formatting to stderr * - a newline is automatically appended */ void error_format(const char format[], const char msg[]) { fprintf(stderr, "\nSaVi: "); fprintf(stderr, format, msg); } /* * error_and_exit * * prints an error msg and exits program with value 1 */ void error_and_exit(const char msg[]) { error_format("%s", msg); error_format("%s", "Error! Exiting."); exit(1); } /* * error * * prints a string as an error message */ void error(const char msg[]) { error_format("%s", msg); } void millisleep(const unsigned int ms) { struct timeval tv; tv.tv_usec = (ms % 1000) * 1000; tv.tv_sec = ms / 1000; select(0, NULL, NULL, NULL, &tv); } savi1.6.0/src/stars.c0000644000175000017500000000330214423445060013522 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * stars.c * * Routines for creating star field * * $Id: stars.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include "gv_utils.h" #include "utils.h" #include "constants.h" #include "savi.h" #include "globals.h" void stars_delete(void); static unsigned int stars_loaded = FALSE; static unsigned int stars_geom_exists = FALSE; /* * stars_on * * Creates a star field by loading file stars.oogl */ char * stars_on_cmd(int argc, char *argv[]) { gv_start(); if (!stars_loaded) { stars_loaded = gv_sendfile("oogl/stars_h.oogl"); } if (stars_loaded) { gv_create_geomh("Stars", "stars_h"); stars_geom_exists = TRUE; } gv_stop(); return EMPTY_str; } /* * stars_off * * turns the stars off again */ char * stars_off_cmd(int argc, char *argv[]) { stars_delete(); return EMPTY_str; } /* * stars_delete * * Delete the stars from geomview */ void stars_delete() { if (!stars_geom_exists) return; gv_start(); gv_delete_geom("Stars"); gv_stop(); stars_geom_exists = FALSE; } savi1.6.0/src/time.c0000644000175000017500000000562714423445060013340 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * time.c * * $Id: time.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include #include "time.h" extern int tcl_script(char []); static const int secs_in_minute = 60; static const int secs_in_hour = 3600; static const int secs_in_day = 86400; /* * time_update * * Updates time on the screen * */ void time_update(const double time) { int days, hours, mins, tensecs; double secs=time; /* time is in seconds */ const char format[] = "set time \"Day %d %.2d:%.2d:%.1d%.2f\""; days = (int) floor(secs/secs_in_day); secs = secs - days*secs_in_day; hours = (int) floor(secs/secs_in_hour); secs = secs - hours*secs_in_hour; mins = (int) floor(secs/secs_in_minute); secs = secs - mins*secs_in_minute; tensecs = (int) floor(secs/10); secs = secs - 10*tensecs; sprintf(cmd, format, days, hours, mins, tensecs, secs); tcl_script(cmd); } /* * coverage_time_update * * Updates time elapsed on the coverage screen * */ void coverage_time_update(const double time) { int days, hours, mins, tensecs; double secs=time; /* time is in seconds */ const char format[] = \ "set coverage_time \"Elapsed time: %d days, %.2d:%.2d:%.1d%.2f\""; days = (int) floor(secs/secs_in_day); secs = secs - days*secs_in_day; hours = (int) floor(secs/secs_in_hour); secs = secs - hours*secs_in_hour; mins = (int) floor(secs/secs_in_minute); secs = secs - mins*secs_in_minute; tensecs = (int) floor(secs/10); secs = secs - 10*tensecs; sprintf(cmd, format, days, hours, mins, tensecs, secs); tcl_script(cmd); } /* * coverage_init_time_update * * Updates initial time on the coverage screen * */ void coverage_init_time_update(const double time) { int days, hours, mins, tensecs; double secs=time; /* time is in seconds */ const char format[] = \ "set coverage_init_time \"Start time: Day %d %.2d:%.2d:%.1d%.2f\""; days = (int) floor(secs/secs_in_day); secs = secs - days*secs_in_day; hours = (int) floor(secs/secs_in_hour); secs = secs - hours*secs_in_hour; mins = (int) floor(secs/secs_in_minute); secs = secs - mins*secs_in_minute; tensecs = (int) floor(secs/10); secs = secs - 10*tensecs; sprintf(cmd, format, days, hours, mins, tensecs, secs); tcl_script(cmd); } savi1.6.0/src/Makefile_defs_x86_640000644000175000017500000000600214423445060015701 0ustar lloydlloyd# # Makefile_defs_x86_64 # # A copy of Makefile_defs_ubuntu so that 'make' alone does as # expected on a 64-bit system. # Definitions which work for a Ubuntu (Debian derivative) linux system. # Last tested with Ubuntu 10.04. # # Always run make ARCH=platform from the top-level savi directory. # # Ubuntu includes gcc by default, but not standard C library # header files or Tcl/Tk and the Tcl/Tk header files for compiling # programs. Install those before compiling SaVi. # # zlib also needs to be installed if -lz is to be used. # # If using the command line rather than the graphical package manager: # sudo apt-get install build-essentials tcl tk tcl-dev tk-dev zlib1g-dev # make ARCH=ubuntu # # $Id: Makefile_defs_x86_64 10 2019-01-24 04:47:40Z lloydwood $ ######################################################## # # # Set machine type -- suffix for savi # # # ######################################################## MACH = ubuntu ######################################################## # # # set CC to an ANSI C compiler # # # ######################################################## CC = gcc ######################################################## # # # set TCL_INCLUDES so that the compiler can # # find the tcl.h and tk.h # # # # If tcl/tk is installed in a standard place # # it is not necessary to set this. You may need to # # change the numbers to match your version of tcl/tk. # # The numbers in the topmost savi script should also # # match. # # # ######################################################## TCL_INCLUDES = -I/usr/include/tcl8.5 -I/usr/include/tk8.5 ######################################################## # # # set TCL_LIBS so that the compiler can find # # libtcl.a and libtk.a. Alter to suit - see above. # # # ######################################################## # Debian requires a dot here: -ltcl8.4 -ltk8.4 # as does Red Hat Enterprise. TCL_LIBS = -ltcl8.5 -ltk8.5 # TCL_LIBS = -ltcl -ltk # is a generic alternative to try. ######################################################## # # # Set OTHER_LIBS so that any other stuff needing to # # be linked in will be! # # # ######################################################## OTHER_LIBS = -ldl # OTHER_LIBS = -lz # if zlib compression of textures to Geomview is desired. # OTHER_LIBS = -static savi1.6.0/src/satellites.c0000644000175000017500000003215414423445060014546 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * satellites.c * * routines for satellites in Geomview * * $Id: satellites.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include #include "int_types.h" #include "globals.h" #include "constants.h" #include "gv_file.h" #include "gv_utils.h" #include "sats.h" #include "orbit_utils.h" #include "savi.h" static int satellites_on_flag = FALSE; static int satellites_geom_exists = FALSE; static int satellites_geom_needs_updating = FALSE; static int use_box_satellite = FALSE; static int use_planes_satellite = FALSE; static int use_fancy_satellite = FALSE; static int use_sphere_satellite = FALSE; static int use_fast_marker_satellite = TRUE; static char box_hname[] = "box_satellite_h"; static char box_special_hname[] = "box_special_satellite_h"; static char planes_hname[] = "planes_satellite_h"; static char planes_special_hname[] = "planes_special_satellite_h"; static char fancy_hname[] = "fancy_satellite_h"; static char fancy_special_hname[] = "fancy_special_satellite_h"; static char sphere_hname[] = "sphere_satellite_h"; static char sphere_special_hname[] = "sphere_special_satellite_h"; /* * routine to display satellites */ char * satellites_on_cmd(int argc, char *argv[]) { if (satellites_on_flag) return EMPTY_str; satellites_on_flag = TRUE; satellites_geom_needs_updating = TRUE; gv_start(); if (use_box_satellite || use_planes_satellite || use_fancy_satellite) { transforms_needed |= (1 << SATELLITES); /* and send them too */ gv_trans_list_create(get_constellation()->satellites); } write_satellites_geom(get_constellation()); gv_stop(); return EMPTY_str; } /* * satellites_off_cmd() * * Routine to turn off display of satellites */ char * satellites_off_cmd(int argc, char *argv[]) { if (!satellites_on_flag) return EMPTY_str; satellites_gv_delete(); satellites_geom_needs_updating = FALSE; satellites_on_flag = FALSE; return EMPTY_str; } /* * routine to display fancy satellites */ char * fancy_sat_on_cmd(int argc, char *argv[]) { if (use_fancy_satellite) return EMPTY_str; use_fast_marker_satellite = FALSE; use_box_satellite = FALSE; use_planes_satellite = FALSE; use_sphere_satellite = FALSE; use_fancy_satellite = TRUE; if (satellites_on_flag) { transforms_needed |= (1 << SATELLITES); satellites_geom_needs_updating = TRUE; gv_start(); gv_trans_list_create(get_constellation()->satellites); write_satellites_geom(get_constellation()); gv_stop(); } return EMPTY_str; } /* * routine to display fast marker satellites */ char * fast_marker_sat_on_cmd(int argc, char *argv[]) { if (use_fast_marker_satellite) return EMPTY_str; use_fast_marker_satellite = TRUE; use_box_satellite = FALSE; use_fancy_satellite = FALSE; use_planes_satellite = FALSE; use_sphere_satellite = FALSE; if (satellites_on_flag) { transforms_needed |= (1 << SATELLITES); satellites_geom_needs_updating = TRUE; gv_start(); gv_trans_list_create(get_constellation()->satellites); write_satellites_geom(get_constellation()); gv_stop(); } return EMPTY_str; } /* * routine to display spherical satellites */ char * sphere_sat_on_cmd(int argc, char *argv[]) { if (use_sphere_satellite) return EMPTY_str; use_fast_marker_satellite = FALSE; use_box_satellite = FALSE; use_fancy_satellite = FALSE; use_planes_satellite = FALSE; use_sphere_satellite = TRUE; if (satellites_on_flag) { transforms_needed |= (1 << SATELLITES); satellites_geom_needs_updating = TRUE; gv_start(); gv_trans_list_create(get_constellation()->satellites); write_satellites_geom(get_constellation()); gv_stop(); } return EMPTY_str; } /* * routine to display crossing-planes satellites */ char * planes_sat_on_cmd(int argc, char *argv[]) { if (use_planes_satellite) return EMPTY_str; use_fast_marker_satellite = FALSE; use_box_satellite = FALSE; use_fancy_satellite = FALSE; use_sphere_satellite = FALSE; use_planes_satellite = TRUE; if (satellites_on_flag) { transforms_needed |= (1 << SATELLITES); satellites_geom_needs_updating = TRUE; gv_start(); gv_trans_list_create(get_constellation()->satellites); write_satellites_geom(get_constellation()); gv_stop(); } return EMPTY_str; } /* * routine to display box satellites */ char * box_sat_on_cmd(int argc, char *argv[]) { if (use_box_satellite) return EMPTY_str; use_fast_marker_satellite = FALSE; use_fancy_satellite = FALSE; use_planes_satellite = FALSE; use_sphere_satellite = FALSE; use_box_satellite = TRUE; if (satellites_on_flag) { transforms_needed |= (1 << SATELLITES); satellites_geom_needs_updating = TRUE; gv_start(); gv_trans_list_create(get_constellation()->satellites); write_satellites_geom(get_constellation()); gv_stop(); } return EMPTY_str; } /* * Routine to turn off display of fast marker satellites */ char * fast_marker_sat_off_cmd(int argc, char *argv[]) { if (!use_fast_marker_satellite) return EMPTY_str; use_sphere_satellite = TRUE; use_fast_marker_satellite = FALSE; if (satellites_on_flag) { transforms_needed &= ~(1 << SATELLITES); satellites_geom_needs_updating = TRUE; gv_start(); write_satellites_geom(get_constellation()); gv_stop(); } return EMPTY_str; } /* * Routine to turn off display of spherical satellites */ char * sphere_sat_off_cmd(int argc, char *argv[]) { if (!use_sphere_satellite) return EMPTY_str; use_sphere_satellite = FALSE; use_fast_marker_satellite = TRUE; if (satellites_on_flag) { transforms_needed &= ~(1 << SATELLITES); satellites_geom_needs_updating = TRUE; gv_start(); write_satellites_geom(get_constellation()); gv_stop(); } return EMPTY_str; } /* * Routine to turn off display of fancy satellites */ char * fancy_sat_off_cmd(int argc, char *argv[]) { if (!use_fancy_satellite) return EMPTY_str; use_fancy_satellite = FALSE; use_fast_marker_satellite = TRUE; if (satellites_on_flag) { transforms_needed &= ~(1 << SATELLITES); satellites_geom_needs_updating = TRUE; gv_start(); write_satellites_geom(get_constellation()); gv_stop(); } return EMPTY_str; } /* * Routine to turn off display of crossing-plane satellites */ char * planes_sat_off_cmd(int argc, char *argv[]) { if (!use_planes_satellite) return EMPTY_str; use_planes_satellite = FALSE; use_fast_marker_satellite = TRUE; if (satellites_on_flag) { transforms_needed &= ~(1 << SATELLITES); satellites_geom_needs_updating = TRUE; gv_start(); write_satellites_geom(get_constellation()); gv_stop(); } return EMPTY_str; } /* * Routine to turn off display of box satellites */ char * box_sat_off_cmd(int argc, char *argv[]) { if (!use_box_satellite) return EMPTY_str; use_box_satellite = FALSE; use_fast_marker_satellite = TRUE; if (satellites_on_flag) { transforms_needed &= ~(1 << SATELLITES); satellites_geom_needs_updating = TRUE; gv_start(); write_satellites_geom(get_constellation()); gv_stop(); } return EMPTY_str; } char * satellites_set_cmd(int argc, char *argv[]) { Constellation *pconstellation = get_constellation(); Satellite s; int n = atoi(argv[2]); unsigned int flag = atoi(argv[3]); s = constellation_search(pconstellation, n); if (s) { if (flag) s->can_display_satellite = 1; else s->can_display_satellite = 0; satellites_geom_needs_updating = TRUE; } return EMPTY_str; } /* * satellites_gv_delete * * routine to delete geomview satellites object */ void satellites_gv_delete() { if (satellites_geom_exists) { gv_start(); gv_delete_geom("Satellites"); gv_stop(); satellites_geom_exists = FALSE; } } /* * satellite_display * * Takes a satellite and displays it */ void satellite_display(Satellite s, const Constellation * pconstellation) { satellites_geom_needs_updating = TRUE; } /* * satellites_relocate * * Moves a satellite into its proper position */ void satellites_relocate(const Constellation * pconstellation) { /* fancy satellites automatically updated from transformation matrices */ if (use_fancy_satellite) return; satellites_geom_needs_updating = TRUE; gv_start(); write_satellites_geom(pconstellation); gv_stop(); } /* * satellite_delete * * Takes a satellite and deletes it on the display */ void satellite_delete(Satellite s) { satellites_geom_needs_updating = TRUE; } void write_satellites_geom(const Constellation * pconstellation) { Satellite s; Satellite_list sl; unsigned int i, num_view_sats, num_tag_sats; num_view_sats = pconstellation->n_view_sats; num_tag_sats = pconstellation->n_tag_sats; if (satellites_on_flag && satellites_geom_needs_updating) { satellites_geom_needs_updating = FALSE; /* if no sats then delete the Satellites gv object */ if ((num_view_sats == 0) && (num_tag_sats == 0)) { satellites_gv_delete(); return; } if (!use_fast_marker_satellite) { /* write out new list of all satellites */ sl = pconstellation->satellites; gv_send("(geometry Satellites {LIST\n"); while (sl) { s = sl->s; if (sl->s->can_display_satellite) { if (use_box_satellite) { fprintf(gv_out, "{INST transform:trans_%d geom:%s}\n", s->id, s->tag ? box_special_hname : box_hname); } else if (use_planes_satellite) { fprintf(gv_out, "{INST transform:trans_%d geom:%s}\n", s->id, s->tag ? planes_special_hname : planes_hname); } else if (use_sphere_satellite) { fprintf(gv_out, "{INST transform:trans_%d geom:%s}\n", s->id, s->tag ? sphere_special_hname : sphere_hname); } else { /* use fancy satellite */ fprintf(gv_out, "{INST transform:trans_%d geom:%s}\n", s->id, s->tag ? fancy_special_hname : fancy_hname); } } sl = sl->next; } gv_send("})\n"); } else { /* write out as a LIST of VECT */ gv_send("(geometry Satellites {LIST\n"); /* write out all viewable satellites as a single VECT */ if (num_view_sats > 0) { if (GV_BINARY_FORMAT_AVAILABLE) { uint32_t ibuf[3]; float fbuf[3]; float rgba[] = { 0, 1, 0, 1 }; /* green */ uint16_t zero_one_buf[] = { 0, 1 }; uint16_t *zero = zero_one_buf; uint16_t *one = zero_one_buf + 1; /* convert stuff to big endian format */ htons_buffer(zero, 2); /* send VECT header */ gv_send("{appearance {linewidth 7} VECT BINARY\n"); /* send: n_view_sats n_view_sats 1 */ ibuf[0] = ibuf[1] = num_view_sats; ibuf[2] = 1; htonl_buffer(ibuf, 3); gv_send_binary_ints(ibuf, 3); /* send n_view_sats number of short 1s */ for (i = 0; i < num_view_sats; i++) { gv_send_binary_shorts(one, 1); } /* send short 1 followed by n_view_sats-1 number of short 0s */ gv_send_binary_shorts(one, 1); for (i = 1; i < num_view_sats; i++) { gv_send_binary_shorts(zero, 1); } /* for each satellite to view, send 3 floats describing position */ for (sl = pconstellation->satellites; NULL != sl; sl = sl->next) { s = sl->s; if (s->can_display_satellite) { fbuf[0] = s->transform[3][0]; fbuf[1] = s->transform[3][1]; fbuf[2] = s->transform[3][2]; htonl_buffer((uint32_t *) fbuf, 3); gv_send_binary_floats(fbuf, 3); } } /* send color */ htonl_buffer((uint32_t *) rgba, 4); gv_send_binary_floats(rgba, 4); gv_send("}\n"); } else { gv_send("{appearance {linewidth 7} VECT\n"); fprintf(gv_out, "%d %d 1\n", num_view_sats, num_view_sats); for (i = 0; i < num_view_sats; i++) { gv_send("1 "); } gv_send("\n1 "); for (i = 1; i < num_view_sats; i++) { gv_send("0 "); } gv_send("\n"); for (sl = pconstellation->satellites; NULL != sl; sl = sl->next) { s = sl->s; if (s->can_display_satellite) { fprintf(gv_out, "%f %f %f\n", s->transform[3][0], s->transform[3][1], s->transform[3][2]); } } gv_send("0 1 0 1}\n"); } } /* write out any tagged satellites */ if (num_tag_sats > 0) { fprintf(gv_out, "{appearance {linewidth 15} VECT\n%d %d 1\n", num_tag_sats, num_tag_sats); for (i = 0; i < num_tag_sats; i++) { gv_send("1 "); } gv_send("\n1 "); for (i = 1; i < num_tag_sats; i++) { gv_send("0 "); } gv_send("\n"); for (sl = pconstellation->satellites; NULL != sl; sl = sl->next) { s = sl->s; if (s->tag) { fprintf(gv_out, "%f %f %f\n", s->transform[3][0], s->transform[3][1], s->transform[3][2]); } } gv_send("1 1 0 1}\n"); } /* close LIST object */ gv_send("})\n"); } satellites_geom_exists = TRUE; } } savi1.6.0/src/Makefile_defs_linux0000644000175000017500000000510514423445060016105 0ustar lloydlloyd# # Makefile_defs_linux # # Definitions which work for a Red Hat Fedora 12 linux system. # # Debian/Ubuntu users: See src/Makefile_defs_ubuntu # # Add the gcc and tk-devel packages with the package manager. # tk-devel will bring tcl-devel and zlib in as necessary dependencies. # Always run make ARCH=platform from the top-level savi directory. # # $Id: Makefile_defs_linux 10 2019-01-24 04:47:40Z lloydwood $ ######################################################## # # # Set machine type -- suffix for savi # # # ######################################################## MACH = linux ######################################################## # # # set CC to an ANSI C compiler # # # ######################################################## CC = gcc ######################################################## # # # set TCL_INCLUDES so that the compiler can # # find the tcl.h and tk.h # # # # If tcl/tk is installed in a standard place # # it is not necessary to set this. You may need to # # change the numbers to match your version of tcl/tk. # # The numbers in the topmost savi script should also # # match. # # # ######################################################## TCL_INCLUDES = -I/usr/include/tcl -I/usr/include/tk # Can also try: # TCL_INCLUDES = -I/usr/include/tcl8.5 -I/usr/include/tk8.5 ######################################################## # # # set TCL_LIBS so that the compiler can find # # libtcl.a and libtk.a. Alter to suit - see above. # # # ######################################################## TCL_LIBS = -ltcl -ltk # Can also try instead: # TCL_LIBS = -ltcl8.5 -ltk8.5 ####################################################### # # # Set OTHER_LIBS so that any other stuff needing to # # be linked in will be! # # # ######################################################## OTHER_LIBS = -ldl -lz # OTHER_LIBS = -static savi1.6.0/src/sun.c0000644000175000017500000000562614423445060013206 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * * sun.c * * Routines for creating fancy sun model * * $Id: sun.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include "gv_utils.h" #include "utils.h" #include "constants.h" #include "globals.h" #include "savi.h" #include "sats.h" /* * sun_on_cmd * * Adjusts lighting for day/night shadows * and draws line from central body towards Sun in Geomview. * */ char * sun_on_cmd(int argc, char *argv[]) { if (sun_flag) return EMPTY_str; sun_flag = TRUE; if (geomview_module) { gv_start(); sun_place(current_time(), (get_constellation())->pcb); if (footprints_flag) { footprints_off_cmd(argc, argv); footprints_on_cmd(argc, argv); } gv_stop(); } return EMPTY_str; } /* * sun_off_cmd * * Resets to uniform lighting. */ char * sun_off_cmd(int argc, char *argv[]) { if (!sun_flag) return EMPTY_str; sun_flag = FALSE; if (geomview_module) { gv_start(); if (geomview_sun_lighting) gv_sendfile(AMBIENT_LIGHTING); gv_delete_geom("Sun"); if (footprints_flag) { footprints_off_cmd(argc, argv); footprints_on_cmd(argc, argv); } gv_stop(); } return EMPTY_str; } /* * sun_place * * rotates the sun to correct position for time t * * Time 0 is determined to be an equinox with the * 0 longitude turned away from the Sun * */ void sun_place(double t, const CentralBody *pcb) { char buf[LENGTH_STRING_BUFFER]; double theta, phi, x, y, z; if (!sun_flag) return; /* theta is the earth in the sun's orbit */ theta = t / pcb->orbital_period * TWOPI + PI; /* phi is the angle above the equatorial plane */ phi = pcb->tilt * sin(theta) * DEG_TO_RAD; /* position the light source at x, y, z */ x = cos(theta)*cos(phi); y = sin(theta)*cos(phi); z = sin(phi); gv_begin(); if (geomview_sun_lighting) { gv_send("(merge-baseap appearance { lighting { ambient .7 .7 .7 replacelights light { "); gv_send("color 1 1 1 position "); sprintf(buf,"%f %f %f 0", x, y, z); gv_send(buf); gv_send(" location global } } } )"); } gv_send("(geometry Sun {VECT 1 2 1 2 1 "); sprintf(buf,"%f %f %f", x, y, z); gv_send(buf); sprintf(buf, " %f %f %f",2*x, 2*y, 2*z); gv_send(buf); gv_send(" 1 1 0 1 } )"); gv_end(); } savi1.6.0/src/satCmd.c0000644000175000017500000001507214423445060013610 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * satCmd.c * * procedure to implement tcl command "satellites" * * $Id: satCmd.c 133 2020-01-04 09:17:43Z lloydwood $ */ #include #include #include #include "fisheye.h" #include "globals.h" #include "constants.h" #include "utils.h" #include "gv_utils.h" #include "sats.h" #include "savi.h" #include "tcl_utils.h" extern Tcl_Interp *interp; /* Interpreter for this application. */ /* * define structure for the string to keyword translation */ typedef char *(*PCmdF) (int argc, char *argv[]); struct Key { const char *word; PCmdF cmd_fn; }; static PCmdF keyword_to_fn(const char *word); /* * define the set of keywords and command functions * - these correspond to the allowable commands "satellite COMMAND ..." */ static struct Key key[] = { /* tape recorder commands */ {"FORWARDS", forwards_cmd}, {"BACKWARDS", backwards_cmd}, {"FORW_STEP", forwards_step_cmd}, {"BACK_STEP", backwards_step_cmd}, {"RESET", reset_cmd}, {"STOP", stop_cmd}, /* option commands */ {"SATELLITES_ON", satellites_on_cmd}, {"SATELLITES_OFF", satellites_off_cmd}, {"BOX_SAT_ON", box_sat_on_cmd}, {"BOX_SAT_OFF", box_sat_off_cmd}, {"PLANES_SAT_ON", planes_sat_on_cmd}, {"PLANES_SAT_OFF", planes_sat_off_cmd}, {"SPHERE_SAT_ON", sphere_sat_on_cmd}, {"SPHERE_SAT_OFF", sphere_sat_off_cmd}, {"FAST_MARKER_SAT_ON", fast_marker_sat_on_cmd}, {"FAST_MARKER_SAT_OFF", fast_marker_sat_off_cmd}, {"FANCY_SAT_ON", fancy_sat_on_cmd}, {"FANCY_SAT_OFF", fancy_sat_off_cmd}, {"AXES_ON", axes_on_cmd}, {"AXES_OFF", axes_off_cmd}, {"LOGO_ON", logo_on_cmd}, {"LOGO_OFF", logo_off_cmd}, {"ORBITS_ON", orbits_on_cmd}, {"ORBITS_OFF", orbits_off_cmd}, {"ORBIT_SET", orbits_set_cmd}, {"CONES_ON", cones_on_cmd}, {"CONES_OFF", cones_off_cmd}, {"COVERAGE_SET", coverage_set_cmd}, {"FOOTPRINTS_ON", footprints_on_cmd}, {"FOOTPRINTS_OFF", footprints_off_cmd}, {"EARTH_ON", earth_on_cmd}, {"EARTH_OFF", earth_off_cmd}, {"SIMPLE_EARTH_ON", simple_on_cmd}, {"SIMPLE_EARTH_OFF", simple_off_cmd}, {"FANCY_EARTH_ON", fancy_on_cmd}, {"FANCY_EARTH_OFF", fancy_off_cmd}, {"TEXTURE_ON", texture_on_cmd}, {"TEXTURE_OFF", texture_off_cmd}, {"SUN_ON", sun_on_cmd}, {"SUN_OFF", sun_off_cmd}, {"STARS_ON", stars_on_cmd}, {"STARS_OFF", stars_off_cmd}, {"PLANE", plane_cmd}, {"PLANE_OFF", plane_off_cmd}, {"GEOMVIEW_ON", geomview_on_cmd}, {"GEOMVIEW_OFF", geomview_off_cmd}, {"GEOMVIEW_DYNAMIC_TEXTURE_ON", geomview_dynamic_texture_on_cmd}, {"GEOMVIEW_DYNAMIC_TEXTURE_OFF", geomview_dynamic_texture_off_cmd}, {"REALTIME_ON", realtime_on_cmd}, {"REALTIME_OFF", realtime_off_cmd}, {"COVERAGE_ON", coverage_on_cmd}, {"COVERAGE_OFF", coverage_off_cmd}, {"COVERAGE_MAP_ON", coverage_map_on_cmd}, {"COVERAGE_MAP_OFF", coverage_map_off_cmd}, {"NO_ACCESS_ON", no_access_on_cmd}, {"NO_ACCESS_OFF", no_access_off_cmd}, {"MAP_ON", map_on_cmd}, {"MAP_OFF", map_off_cmd}, {"PRINT_ACCESS_ON", print_access_on_cmd}, {"PRINT_ACCESS_OFF", print_access_off_cmd}, {"FISHEYE_REVERSE_VIEW_ON", fisheye_reverse_view_on_cmd}, {"FISHEYE_REVERSE_VIEW_OFF", fisheye_reverse_view_off_cmd}, {"FISHEYE_PRINT_INVIEW_ON", fisheye_print_inview_on_cmd}, {"FISHEYE_PRINT_INVIEW_OFF", fisheye_print_inview_off_cmd}, {"FISHEYE_NAMES_ON", fisheye_names_on_cmd}, {"FISHEYE_NAMES_OFF", fisheye_names_off_cmd}, {"FISHEYE_VIEWPOINT_ON", fisheye_viewpoint_on_cmd}, {"FISHEYE_VIEWPOINT_OFF", fisheye_viewpoint_off_cmd}, {"FISHEYE_NUMBERS_ON", fisheye_numbers_on_cmd}, {"FISHEYE_NUMBERS_OFF", fisheye_numbers_off_cmd}, {"FISHEYE_TIMES_ON", fisheye_times_on_cmd}, {"FISHEYE_TIMES_OFF", fisheye_times_off_cmd}, {"TRACKS_ON", tracks_on_cmd}, {"TRACKS_OFF", tracks_off_cmd}, {"PROJECT_TRACKS_ON", project_tracks_on_cmd}, {"PROJECT_TRACKS_OFF", project_tracks_off_cmd}, {"COVERAGE_PROJ", coverage_proj_cmd}, {"COVERAGE_ANGLE_TYPE", coverage_angle_type_cmd}, {"COVERAGE_SAVE_MAP", coverage_save_map_cmd}, {"COVERAGE_SAVE_PLOT", coverage_save_plot_cmd}, {"FISHEYE_ON", fisheye_on_cmd}, {"FISHEYE_OFF", fisheye_off_cmd}, {"FISHEYE_LABELS_ON", fisheye_labels_on_cmd}, {"FISHEYE_LABELS_OFF", fisheye_labels_off_cmd}, {"FISHEYE_SET", fisheye_set_cmd}, /* editing commands */ {"NEW", sats_new_cmd}, {"COPY", sats_copy_cmd}, {"DELETE", sats_delete_cmd}, {"DELETE_ALL", sats_delete_all_cmd}, {"GET", sats_get_cmd}, {"SET", sats_set_cmd}, {"TAG", sats_tag_cmd}, {"UNTAG", sats_untag_cmd}, {"LOAD_MARKER", sats_load_marker_cmd}, {"LOAD", sats_load_cmd}, {"NAME", sats_name_cmd}, {"GET_NAME", sats_get_name_cmd}, {"GET_ID", sats_get_id_cmd}, /* geomview commands */ {"GV_BEGIN", gv_begin_cmd}, {"GV_END", gv_end_cmd}, {"GV_WAIT", gv_wait_cmd}, {"GV_SEND", gv_send_cmd}, /* other */ {"COLOR_UPDATE", coverage_color_update_cmd}, {"EXIT", exit_cmd}, {"RESET_PARAMS", reset_params_cmd}, {"VERSION", version_cmd}, {"COMMAND_LINE", command_line_cmd} }; unsigned int N_KEYS = sizeof(key) / sizeof(struct Key); /* * keyword_to_fn * translates from key string to key command function */ static PCmdF keyword_to_fn(const char *word) { unsigned int i; for (i = 0; i < N_KEYS; i++) { if (!strcmp(word, key[i].word)) { return (key[i].cmd_fn); } } return (NULL); } /* * satCmd * * procedure that tcl calls to execute the "satellites" or "savi" command * */ int satCmd(ClientData clientData, Tcl_Interp * interpreter, int argc, char *argv[]) { PCmdF cmd_fn = NULL; /* for debugging purposes, display commands */ if (debug) { unsigned int i; for (i = 0; i < argc; i++) { fprintf(stderr, " %s", argv[i]); } fprintf(stderr, "\n"); } if (argc < 2) { error("satCmd: satellite command needs an argument!"); } else { cmd_fn = keyword_to_fn(argv[1]); if (cmd_fn) { Tcl_SetResult(interpreter, cmd_fn(argc, argv), TCL_STATIC); } else { error_format("satCmd %s unrecognized", argv[1]); } } return TCL_OK; } savi1.6.0/src/footprints.c0000644000175000017500000002060414423445060014601 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * footprints.c * * routines for footprints in Geomview * * $Id: footprints.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include #include "globals.h" #include "constants.h" #include "gv_file.h" #include "gv_utils.h" #include "sats.h" #include "orbit_utils.h" #include "savi.h" static unsigned int footprints_geom_exists = FALSE; static unsigned int footprints_geom_needs_updating = FALSE; static int footprints_angle_used = 0; static char name[] = "footprint_ "; static double t[GV_FOOTPRINT_EDGE_SEGMENTS]; static void footprint_size(double *radius, double *height, const Satellite s, const Constellation * pconstellation, int special); static void footprint_write_geom(const Satellite s, const Constellation * pconstellation, int special); static void footprint_gv_delete(const Satellite s); /* * footprints_on_cmd() * * Routine to display footprints */ char * footprints_on_cmd(int argc, char *argv[]) { Constellation *pconstellation; Satellite_list sl; Satellite ps; if (footprints_flag) return EMPTY_str; pconstellation = get_constellation(); sl = pconstellation->satellites; footprints_flag = TRUE; footprints_geom_needs_updating = TRUE; transforms_needed |= (1 << FOOTPRINTS); ps = sl->s; gv_start(); gv_trans_create(ps); footprint_write_geom(ps, pconstellation, TRUE); sl = sl->next; while (sl) { ps = sl->s; gv_trans_create(ps); footprint_write_geom(ps, pconstellation, FALSE); sl = sl->next; } write_footprints_geom(pconstellation); gv_stop(); /* remember what angle was used */ footprints_angle_used = coverage_angle; return EMPTY_str; } /* * footprints_off_cmd() * * Routine to turn off display of footprints */ char * footprints_off_cmd(int argc, char *argv[]) { Satellite_list sl; if (!footprints_flag) return EMPTY_str; sl = get_constellation()->satellites; transforms_needed &= ~(1 << FOOTPRINTS); gv_start(); footprints_gv_delete(); while (sl) { footprint_gv_delete(sl->s); sl = sl->next; } footprints_geom_needs_updating = FALSE; footprints_flag = FALSE; gv_stop(); return EMPTY_str; } /* * footprints_rebuild() * * Routine to resize all the footprints currently built */ void footprints_rebuild() { Constellation *pconstellation; Satellite_list sl; if (!footprints_flag) return; pconstellation = get_constellation(); sl = pconstellation->satellites; /* do sunlight separately */ footprint_write_geom(sl->s, pconstellation, TRUE); sl = sl->next; gv_start(); while (sl) { footprint_write_geom(sl->s, pconstellation, FALSE); sl = sl->next; } gv_stop(); /* remember what angle was used */ footprints_angle_used = coverage_angle; footprints_geom_needs_updating = FALSE; } /* * footprints_gv_delete * * routine to delete geomview footprints object */ void footprints_gv_delete() { if (footprints_geom_exists) { gv_delete_geom("Footprints"); footprints_geom_exists = FALSE; } } /* * footprints_relocate * * Called to update the footprint when the satellites have all been moved * */ void footprints_relocate(const Constellation * pconstellation) { Satellite_list sl; Satellite ps; unsigned int angle_changed; if (!footprints_flag) return; sl = pconstellation->satellites; angle_changed = (footprints_angle_used != coverage_angle); gv_start(); /* skip sunlight - it should never change */ ps = sl->s; if (angle_changed || (ps->oe.e > 0)) { footprint_write_geom(ps, pconstellation, TRUE); } sl = sl->next; while (sl) { ps = sl->s; if (angle_changed || (ps->oe.e > 0)) { footprint_write_geom(ps, pconstellation, FALSE); } sl = sl->next; } gv_stop(); /* remember what angle was used */ footprints_angle_used = coverage_angle; } /* * footprint_size * * computes radius and height of footprint for given satellite * */ static void footprint_size(double *radius, double *height, const Satellite s, const Constellation * pconstellation, int special) { CentralBody *pcb = pconstellation->pcb; double a, r, theta, c, si, temp; a = s->x_S.r - pcb->radius; if (a <= min_transmit_altitude) { *radius = 0; *height = 0; return; } /* coverage_angle is global variable (in degrees) */ theta = coverage_angle * DEG_TO_RAD; if (special) { if (MASK_ELEVATION == get_coverage_type()) { theta = 0; } else { theta = HALFPI; } } c = cos(theta); si = sin(theta); r = s->x_S.r / pcb->radius; if (MASK_ELEVATION == get_coverage_type()) { temp = sqrt(r * r - c * c); *radius = c * (temp - si) / r; *height = temp * (temp - si) / r; } else { /* SATELLITE_CONE */ if (r * si < 1) { /* coverage cone intersects earth */ if (si == 0) { /* trivial case - theta = 0 */ *radius = 0.0; *height = r - 1.0; } else { *radius = sin(asin(r * si) - theta); *height = (*radius) * c / si; } } else { /* coverage cone does not intersect earth */ *radius = sqrt(1 - 1 / (r * r)); *height = r - 1 / r; } } } /* * footprint_write_geom * * Write footprint geom for a satellite */ static void footprint_write_geom(const Satellite s, const Constellation * pconstellation, int special) { unsigned int i; if (special && !sun_flag) return; for (i = 0; i < GV_FOOTPRINT_EDGE_SEGMENTS - 1; i++) { t[i] = 0.0; } t[GV_FOOTPRINT_EDGE_SEGMENTS - 1] = 1.0; /* compute scaling of footprint - a rigid body rotation plus a translation will be applied to the footprint to place it so that (0,0,0) will be mapped to the position of the satellite and (0,0,-1) will point to the origin */ footprint_size(t, t + 10, s, pconstellation, special); t[5] = t[0]; /* start of gv footprint description */ fprintf(gv_out, "(read geometry {define footprint_%d { INST transform { ", s->id); for (i = 0; i < GV_FOOTPRINT_EDGE_SEGMENTS; i++) { fprintf(gv_out, "%g ", t[i]); } if (special) { fprintf(gv_out, "} geom: terminator_h } } )\n"); } else { fprintf(gv_out, "} geom: footprint_h } } )\n"); } } /* * footprint_display * * Takes a satellite and displays its footprint. */ void footprint_display(Satellite s, const Constellation * pconstellation) { if (!footprints_flag) return; footprints_geom_needs_updating = TRUE; gv_start(); footprint_write_geom(s, pconstellation, FALSE); /* what if it's sun? */ gv_stop(); } /* * footprints_gv_update * * get ready to update drawing in geomview. */ void footprints_gv_update() { footprints_geom_needs_updating = TRUE; } /* * footprint_gv_delete * * Takes a satellite and deletes its footprint */ static void footprint_gv_delete(Satellite s) { sprintf(name + 10, "%-10d", s->id); gv_delete_handle(name); } /* * footprint_delete * * Takes a satellite and deletes its footprint * ONLY if footprints_flag == TRUE */ void footprint_delete(Satellite s) { if (!footprints_flag) return; footprints_geom_needs_updating = TRUE; gv_start(); footprint_gv_delete(s); gv_stop(); } void write_footprints_geom(const Constellation * pconstellation) { Satellite ps; Satellite_list sl = pconstellation->satellites; int sid; if (footprints_flag && footprints_geom_needs_updating) { /* write out new list of all satellites */ gv_send("(geometry Footprints {LIST\n"); /* skip sunlight cone if turned off */ if (!sun_flag)sl = sl->next; while (sl) { ps = sl->s; if (ps->can_display_coverage) { sid = ps->id; fprintf(gv_out, "{ INST transform:trans_%d geom:footprint_%d }\n", sid, sid); } sl = sl->next; } gv_send("})\n"); footprints_geom_exists = TRUE; footprints_geom_needs_updating = FALSE; } } savi1.6.0/src/coverage_vis.c0000644000175000017500000007643314423445060015061 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * coverage_vis.c * * Coverage visualization routines. * * $Id: coverage_vis.c 191 2023-04-02 04:27:41Z lloydwood $ */ #include #include #include #include #ifndef _TK #include #endif #ifndef NO_ZLIB #include #endif /* NO_ZLIB */ #include "constants.h" #include "fisheye.h" #include "globals.h" #include "gv_file.h" #include "gv_utils.h" #include "orbit_utils.h" #include "savi.h" #include "stats_utils.h" #include "coverage_vis.h" extern Tcl_Interp *interp; /* Interpreter for this application. */ extern int tcl_script(char[]); extern int no_access_flag; extern int map_flag; extern unsigned int geomview_flag; extern unsigned int earth_on_flag; extern unsigned int earth_geom_exists; extern unsigned int use_fancy_earth; extern unsigned int geomview_dynamic_coverage; static int current_proj = -1; /* whatever the default, we start by drawing */ static int coverage_bitmap_drawn; static char imagename[] = "im_coverage"; static const char format1[] = "set coverage \"Estimated map coverage: %.1f%%\""; static const char format2[] = "set mean_coverage \"Averaged map coverage: %.1f%%\""; static void write_image_as_ppm(FILE *f); #ifndef NO_ZLIB /* used only in this file */ static int gzip_compress2(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level); static void write_image_to_stream_compressed(); static void * image_compress_scratch = NULL; #endif /* NO_ZLIB */ static void set_coverage(int projection, grid *g); static int reset_map_foreground(const unsigned char * map_pointer, const unsigned int map_size); static int new_foreground(int projection, grid * g, unsigned int force); static void draw_sin_map_edges(grid * g); static Tk_PhotoImageBlock *get_image(void); static int overlay_bitmap(unsigned int h, unsigned int w, unsigned char *b, const char *filename); static void latlon_to_grid_index(int grid_index[2], LatLon * pl, int projection, grid * g); static Tk_PhotoImageBlock *image = NULL; static unsigned char *foreground = NULL; #define PIXELSIZE 3 /* 3 for RGB */ typedef struct RGB { unsigned char red, green, blue; } RGB; /* Colors for coverage intensity (in RGB values) */ /* We allow up to thirty values, for 0 to 29. *3, gives us 90. */ static unsigned char colors[90]; static unsigned char noaccess_colors[90]; /* Color for earth outline and ground track - see enum in coverage_vis.h */ static unsigned char outline_colors[] = { 255, 255, 255, /* background */ 0, 0, 0, /* earth outline */ 0, 255, 0, /* projected ground track */ 255, 0, 255, /* selected ground track */ 0, 255, 0, /* satellite position */ 0, 255, 0, /* rest of cross */ 255, 0, 255, /* selected satellite */ 255, 0, 255, /* rest of cross */ 128, 128, 128, /* ground location */ 128, 128, 128 /* rest of cross */ }; static unsigned char * COLDIV = &colors[0]; static unsigned char * COLDEC = &noaccess_colors[0]; static unsigned char * cyl_foreground; static unsigned char * sin_foreground; static unsigned char * sin_90_foreground; static unsigned char * unp_foreground; static unsigned char * unp_mask_foreground; static unsigned char * sph_foreground; static unsigned char * sph_90_foreground; static int dynamic_errors_reported = FALSE; /* * capable_of_compression - were we compiled with zlib available? */ int capable_of_compression(void) { #ifndef NO_ZLIB return TRUE; #endif return FALSE; } /* * color_hex - turn combined RRGGBB byte into three RGB bytes. */ static void color_hex(int combined, RGB * color_set) { unsigned int rrggbb = (unsigned int) combined; color_set->blue = rrggbb & 0x0000FF; rrggbb = rrggbb >> 8; color_set->green = rrggbb & 0x0000FF; rrggbb = rrggbb >> 8; color_set->red = rrggbb & 0x0000FF; } /* * coverage_color_copy - slave color arrays to Tcl values */ void coverage_color_copy(void) { color_hex(DIV0, (RGB *) &COLDIV[0]); color_hex(DIV1, (RGB *) &COLDIV[3]); color_hex(DIV2, (RGB *) &COLDIV[6]); color_hex(DIV3, (RGB *) &COLDIV[9]); color_hex(DIV4, (RGB *) &COLDIV[12]); color_hex(DIV5, (RGB *) &COLDIV[15]); color_hex(DIV6, (RGB *) &COLDIV[18]); color_hex(DIV7, (RGB *) &COLDIV[21]); color_hex(DIV8, (RGB *) &COLDIV[24]); color_hex(DIV9, (RGB *) &COLDIV[27]); color_hex(DIV10, (RGB *) &COLDIV[30]); color_hex(DIV11, (RGB *) &COLDIV[33]); color_hex(DIV12, (RGB *) &COLDIV[36]); color_hex(DIV13, (RGB *) &COLDIV[39]); color_hex(DIV14, (RGB *) &COLDIV[42]); color_hex(DIV15, (RGB *) &COLDIV[45]); color_hex(DIV16, (RGB *) &COLDIV[48]); color_hex(DIV17, (RGB *) &COLDIV[51]); color_hex(DIV18, (RGB *) &COLDIV[54]); color_hex(DIV19, (RGB *) &COLDIV[57]); color_hex(DIV20, (RGB *) &COLDIV[60]); color_hex(DIV21, (RGB *) &COLDIV[63]); color_hex(DIV22, (RGB *) &COLDIV[66]); color_hex(DIV23, (RGB *) &COLDIV[69]); color_hex(DIV24, (RGB *) &COLDIV[72]); color_hex(DIV25, (RGB *) &COLDIV[75]); color_hex(DIV26, (RGB *) &COLDIV[78]); color_hex(DIV27, (RGB *) &COLDIV[81]); color_hex(DIV28, (RGB *) &COLDIV[84]); color_hex(DIV29, (RGB *) &COLDIV[87]); color_hex(DEC0, (RGB *) &COLDEC[0]); color_hex(DEC1, (RGB *) &COLDEC[3]); color_hex(DEC2, (RGB *) &COLDEC[6]); color_hex(DEC3, (RGB *) &COLDEC[9]); color_hex(DEC4, (RGB *) &COLDEC[12]); color_hex(DEC5, (RGB *) &COLDEC[15]); color_hex(DEC6, (RGB *) &COLDEC[18]); color_hex(DEC7, (RGB *) &COLDEC[21]); color_hex(DEC8, (RGB *) &COLDEC[24]); color_hex(DEC9, (RGB *) &COLDEC[27]); color_hex(DEC10, (RGB *) &COLDEC[30]); color_hex(DEC11, (RGB *) &COLDEC[33]); color_hex(DEC12, (RGB *) &COLDEC[36]); color_hex(DEC13, (RGB *) &COLDEC[39]); color_hex(DEC14, (RGB *) &COLDEC[42]); color_hex(DEC15, (RGB *) &COLDEC[45]); color_hex(DEC16, (RGB *) &COLDEC[48]); color_hex(DEC17, (RGB *) &COLDEC[51]); color_hex(DEC18, (RGB *) &COLDEC[54]); color_hex(DEC19, (RGB *) &COLDEC[57]); color_hex(DEC20, (RGB *) &COLDEC[60]); color_hex(DEC21, (RGB *) &COLDEC[63]); color_hex(DEC22, (RGB *) &COLDEC[66]); color_hex(DEC23, (RGB *) &COLDEC[69]); color_hex(DEC24, (RGB *) &COLDEC[72]); color_hex(DEC25, (RGB *) &COLDEC[75]); color_hex(DEC26, (RGB *) &COLDEC[78]); color_hex(DEC27, (RGB *) &COLDEC[81]); color_hex(DEC28, (RGB *) &COLDEC[84]); color_hex(DEC29, (RGB *) &COLDEC[87]); } /* * coverage_custom_height_valid - allow a custom map size, or not. */ int coverage_custom_height_valid(int map_view_height) { int valid; if (!map_view_height) return FALSE; valid = TRUE; if (map_view_height < IMAGE_MIN_HEIGHT) { fprintf(stderr, "\nSaVi: map height must be a minimum of %i pixels.", IMAGE_MIN_HEIGHT); valid = FALSE; } if (map_view_height > IMAGE_MAX_HEIGHT) { fprintf(stderr, "\nSaVi: map height has a maximum limit of %i pixels.", IMAGE_MAX_HEIGHT); valid = FALSE; } if (!valid) { error("using default map size instead."); } return(valid); } /* * image_init - Set up the Tk image structure based on the coverage grid. */ void image_init(grid * g) { unsigned int height, width, image_size, made; height = g->height; width = g->width; image_size = height * width; if (image_size <= 0) { error("image size must be greater than zero."); return; } if (!image) { image = (Tk_PhotoImageBlock *) malloc(sizeof(Tk_PhotoImageBlock)); } /* this will leak memory until fixed */ image->pixelPtr = (unsigned char *) malloc(image_size * PIXELSIZE * sizeof(unsigned char *)); image->width = width; image->height = height; image->pitch = width * PIXELSIZE; image->pixelSize = PIXELSIZE; image->offset[0] = 0; image->offset[1] = 1; image->offset[2] = 2; { if (foreground) free (foreground); foreground = (unsigned char *) calloc(sizeof(char) * image_size, 1); if (coverage_all_projections) { if (cyl_foreground) free (cyl_foreground); cyl_foreground = (unsigned char *) calloc(sizeof(char) * image_size, 1); if (sin_foreground) free (sin_foreground); sin_foreground = (unsigned char *) calloc(sizeof(char) * image_size, 1); if (sin_90_foreground) free (sin_90_foreground); sin_90_foreground = (unsigned char *) calloc(sizeof(char) * image_size, 1); } if (unp_foreground) free (unp_foreground); unp_foreground = (unsigned char *) calloc(sizeof(char) * image_size, 1); if (unp_mask_foreground) free (unp_mask_foreground); unp_mask_foreground = (unsigned char *) calloc(sizeof(char) * image_size, 1); if (sph_foreground) free (sph_foreground); sph_foreground = (unsigned char *) calloc(sizeof(char) * image_size, 1); if (sph_90_foreground) free (sph_90_foreground); sph_90_foreground = (unsigned char *) calloc(sizeof(char) * image_size, 1); if (width == IMAGE_LARGE_WIDTH) { made = overlay_bitmap(height, width, unp_foreground, UNPROJECTED_LARGE_BITMAP_NAME); made = overlay_bitmap(height, width, unp_mask_foreground, UNPROJECTED_MASK_LARGE_BITMAP_NAME); made = overlay_bitmap(height, width, sph_foreground, SPHERICAL_LARGE_BITMAP_NAME); made = overlay_bitmap(height, width, sph_90_foreground, SPHERICAL_90_LARGE_BITMAP_NAME); if (coverage_all_projections) { made = overlay_bitmap(height, width, cyl_foreground, CYLINDRICAL_LARGE_BITMAP_NAME); made = overlay_bitmap(height, width, sin_foreground, SINUSOIDAL_LARGE_BITMAP_NAME); made = overlay_bitmap(height, width, sin_90_foreground, SINUSOIDAL_90_LARGE_BITMAP_NAME); } } else if (width == IMAGE_WIDTH) { made = overlay_bitmap(height, width, unp_foreground, UNPROJECTED_BITMAP_NAME); made = overlay_bitmap(height, width, unp_mask_foreground, UNPROJECTED_MASK_BITMAP_NAME); made = overlay_bitmap(height, width, sph_foreground, SPHERICAL_BITMAP_NAME); made = overlay_bitmap(height, width, sph_90_foreground, SPHERICAL_90_BITMAP_NAME); if (coverage_all_projections) { made = overlay_bitmap(height, width, cyl_foreground, CYLINDRICAL_BITMAP_NAME); made = overlay_bitmap(height, width, sin_foreground, SINUSOIDAL_BITMAP_NAME); made = overlay_bitmap(height, width, sin_90_foreground, SINUSOIDAL_90_BITMAP_NAME); } } if (coverage_all_projections) { draw_sin_map_edges(g); } } } static void write_image_as_ppm(FILE *f) { unsigned int w, h, length, elements; unsigned char *p; /* this was grid g->width, but for temporary convenience... */ w = Image_Width; h = Image_Height; /* * Write header file describing grid */ fprintf(f,"P6\n%i %i\n255\n", w, h); p = image->pixelPtr; length = w * h * PIXELSIZE; elements = fwrite(p, sizeof(unsigned char), length, f); if (debug) { fprintf(stderr, "Took coverage image of %i bytes and wrote %i bytes to disk\n", length, elements); } } void write_image_to_file(char * name) { FILE *f; if (NULL == (f = fopen(name, "w"))) { fprintf(stderr,"\nSaVi: unable to save coverage map to %s", name); return; } write_image_as_ppm(f); fclose(f); } static void write_image_to_stream(void) { unsigned int elements; unsigned int w = Image_Width; unsigned int h = Image_Height; unsigned char * p = image->pixelPtr; unsigned int length = w * h * PIXELSIZE; gv_start(); gv_send("(read image {\n"); gv_send(" define coverage\n"); fprintf(gv_out, " width %i\n", w); fprintf(gv_out, " height %i\n", h); fprintf(gv_out,"data RGB raw %i {\n", length); elements = fwrite(p, sizeof(unsigned char), length, gv_out); if (debug) { fprintf(stderr, "Took coverage image of %i bytes and sent %i bytes to stream.\n", length, elements); } gv_send("\n} } )\n"); gv_end(); } #ifndef NO_ZLIB /* * zlib's compress2 doesn't write the gzip header bytes. * This wrapper gets them added by signalling MAX_WBITS+16 * Taken from Claus-Justus Heine's gv_compress2 code at end of * geomview/src/lib/shade/image.c * * function requires zlib */ static int gzip_compress2(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level) { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit2(&stream, level, Z_DEFLATED, MAX_WBITS+16, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); if (err != Z_OK) return err; err = deflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { deflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = deflateEnd(&stream); return err; } /* function requires zlib */ /* needs Geomview >= 1.9.0. * Geomview 1.9.0-.4 spawns gzip process to decompress image when we stream gzip. * 1.9.5 and later does this internally, but also supports more efficient raw.zlib.. * so we default to sending 1.9.5 and later straight compress2, without munging * through gzip_compress2() to add gzip headers. */ static void write_image_to_stream_compressed(void) { int code; unsigned int w = Image_Width; unsigned int h = Image_Height; unsigned char * p = image->pixelPtr; unsigned int length = w * h * PIXELSIZE; unsigned int complength = (length * 102)/100 + 512; uLongf complength_f = complength; if (!image_compress_scratch) { image_compress_scratch = malloc(complength); } gv_start(); gv_send("(read image {\n"); gv_send(" define coverage\n"); fprintf(gv_out, " width %i\n", w); fprintf(gv_out, " height %i\n", h); if (geomview_compress2_textures) { code = compress2(image_compress_scratch, &complength_f, p, length, 6); complength = complength_f; if (code != Z_OK) { fprintf(stderr, "Problem compress2'ing coverage image of %i bytes to %i bytes for stream.\n", length, complength); } else { if (debug) { fprintf(stderr, "Compress2'ed coverage image of %i bytes to %i bytes for stream.\n", length, complength); } } fprintf(gv_out,"data RGB raw.zlib %i {\n", complength); fwrite(image_compress_scratch, sizeof(unsigned char), complength, gv_out); } else { code = gzip_compress2(image_compress_scratch, &complength_f, p, length, 6); complength = complength_f; if (code != Z_OK) { fprintf(stderr, "Problem gv_compress2'ing coverage image of %i bytes to %i bytes for stream.\n", length, complength); } else { if (debug) { fprintf(stderr, "gv_compress2'ed coverage image of %i bytes to %i bytes for stream.\n", length, complength); } } fprintf(gv_out,"data RGB raw.gz %i {\n", complength); fwrite(image_compress_scratch, sizeof(unsigned char), complength, gv_out); } gv_send("\n} } )\n"); gv_end(); } #endif /* NO_ZLIB */ static void coverage_output_image(void) { if (geomview_stream_textures) { if (geomview_compressed_images) { #ifndef NO_ZLIB write_image_to_stream_compressed(); #else error("geomview_compressed_images was set wrongly. Not sending image."); #endif } else { write_image_to_stream(); } } } int coverage_dynamic_initialised(void) { if (!geomview_stream_textures) { error("Geomview does not support streaming images."); return(FALSE); } if (!dynamic_errors_reported) { #ifndef NO_ZLIB /* We can support compressed images. User may have set * geomview_compressed_images to FALSE with -uncompressed flag. */ if(!geomview_compressed_images){ error("texturemaps will be uncompressed."); } #else /* We can't support compressed images. */ geomview_compressed_images = FALSE; error("texturemaps will be uncompressed. Compile SaVi with zlib for compressed."); #endif if (Image_Height < IMAGE_LARGE_HEIGHT) { error("dynamic texture mapping benefits from large coverage map (-large-map)."); } dynamic_errors_reported = TRUE; } return(TRUE); } void coverage_dynamic_cleanup(void) { if (geomview_dynamic_coverage) { if (geomview_stream_textures) { #ifndef NO_ZLIB free(image_compress_scratch); #endif } } } void reset_foreground(int projection, grid * g) { if (foreground) new_foreground(projection, g, TRUE); } /* * get_image - Return pointer to the image structure. */ static Tk_PhotoImageBlock * get_image(void) { if (!image) { error("get_image: image not yet initialized."); } return image; } /* * update_display - Update the Tk coverage image, given a completed coverage grid. */ void update_display(int projection, grid * g, int coverage_flag, int tracks_flag, int project_tracks_flag) { int map_repeat = 1; Tk_PhotoHandle handle; /* * Re-write the entire image, unless we are just displaying ground * tracks, and there's not a new projection, in which case we can * simply write the foreground (which includes ground tracks). */ int fgOnly = !new_foreground(projection, g, FALSE) && !coverage_flag && !tracks_flag && !project_tracks_flag; if (fisheye_viewpoint_flag) { fisheye_to_foreground(projection,g); } grid_and_foreground_to_image(projection, g, fgOnly); handle = Tk_FindPhoto(interp, imagename); if (handle) { /* double width of image to tile bitmaps horizontally */ if (coverage_bitmap_drawn) { map_repeat = 2; } else { /* only show the one blank map */ Tk_PhotoBlank(handle); } #if ( (TK_MAJOR_VERSION >= 8) && (TK_MINOR_VERSION >= 5) ) /* changed for version 8.5 alpha/beta, November 2007 */ Tk_PhotoPutBlock(interp, handle, get_image(), 0, 0, image->width*map_repeat, image->height, TK_PHOTO_COMPOSITE_OVERLAY); #elif ( (TK_MAJOR_VERSION >= 8) && (TK_MINOR_VERSION >= 4) ) /* changed for version 8.4, September 2002. */ Tk_PhotoPutBlock(handle, get_image(), 0, 0, image->width*map_repeat, image->height, TK_PHOTO_COMPOSITE_OVERLAY); #else Tk_PhotoPutBlock(handle, get_image(), 0, 0, image->width*map_repeat, image->height); #endif } else { error("coverage_display: bad image name."); } /* display coverage percentages */ set_coverage(projection, g); } /* * fill interval-decay with high value meaning many intervals since coverage */ void clear_interval(grid * g) { fill_interval(g, NUM_COLORS); } /* * set_coverage - Display total percent coverage. */ static void set_coverage(int projection, grid * g) { sprintf(cmd, format1, total_coverage(projection, TRUE, g)); tcl_script(cmd); sprintf(cmd, format2, mean_coverage(projection, g)); tcl_script(cmd); } /* * overlay_bitmap - Takes a bitmap and lies it on top of our image array. * h,w = height, width of the image array. */ static int overlay_bitmap(unsigned int h, unsigned int w, unsigned char *b, const char filename[]) { FILE *f; int pbmtype, length; unsigned int image_size, width, height, i, j, c, mask; if (NULL == (f = fopen(filename, "r"))) { fprintf(stderr, "\nSaVi: couldn't read in %s", filename); return FALSE; } forward_over_comments(f); fscanf(f, "P%d", &pbmtype); forward_over_comments(f); fscanf(f, "%d", &length); width = length; forward_over_comments(f); fscanf(f, "%d", &length); height = length; /* skip one char */ c = getc(f); if ((pbmtype == 4) && (width == w) && (height == h)) { image_size = h*w; for (i = 0; i < image_size; i += 8) { c = getc(f); mask = 0x80; for (j = 0; j < 8; j++) { if (c & mask) { *(b++) = 1; } else { *(b++) = 0; } mask = mask / 2; } } } else { if (debug) { fprintf(stderr, "\nSaVi: %s has unexpected pbm header format: P%d %d %d", filename, pbmtype, width, height); fprintf(stderr, "\n was expecting the pbm header format: P4 %d %d\n", w, h); } fclose(f); return FALSE; } fclose(f); return TRUE; } static void draw_sin_map_edges(grid * g) { SphericalCoordinates point; int left[2], right[2]; unsigned int h = g->height; unsigned int w = g->width; unsigned int i; if (!sin_foreground) return; point.r = 1; point.theta = 0; point.phi = 0; for (i = 0; i < h; i++) { intensity_edges(left, right, &point, SINUSOIDAL, g); sin_foreground[(w * i + left[0])] = 1; sin_foreground[(w * i + right[0])] = 1; point.phi += PI / (h - 1); /* Increment phi by one pixel */ } } /* * reset_map_foreground - Copies fresh Earth outline to foreground. */ static int reset_map_foreground(const unsigned char * map_pointer, const unsigned int map_size) { /* * Only copy map over if map foreground was created by loading into memory. */ if (map_pointer) { memcpy(foreground, map_pointer, map_size); return TRUE; } else { /* to erase previously plotted satellites */ memset(foreground, 0, map_size); return FALSE; } } /* * new_foreground - Initialize foreground intensity image, including earth outline. * Returns TRUE if foreground must be re-drawn, FALSE otherwise. */ static int new_foreground(int projection, grid * g, unsigned int force) { unsigned int image_size; if (!force && (projection == current_proj)) return (FALSE); if (current_proj != projection) { current_proj = projection; clear_intensity(g); clear_interval(g); } image_size = g->height * g->width; switch (projection) { case UNPROJECTED: Longitude_Center_Line = LONGITUDE_CENTER_LINE; coverage_bitmap_drawn = reset_map_foreground(unp_foreground, image_size); break; case UNPROJECTED_MASK: Longitude_Center_Line = LONGITUDE_CENTER_LINE; coverage_bitmap_drawn = reset_map_foreground(unp_mask_foreground, image_size); break; case SINUSOIDAL: Longitude_Center_Line = LONGITUDE_CENTER_LINE; coverage_bitmap_drawn = reset_map_foreground(sin_foreground, image_size); break; case SINUSOIDAL_90: Longitude_Center_Line = LONGITUDE_CENTER_LINE_90W; coverage_bitmap_drawn = reset_map_foreground(sin_90_foreground, image_size); break; case SPHERICAL: Longitude_Center_Line = LONGITUDE_CENTER_LINE; coverage_bitmap_drawn = reset_map_foreground(sph_foreground, image_size); break; case SPHERICAL_90: Longitude_Center_Line = LONGITUDE_CENTER_LINE_90W; coverage_bitmap_drawn = reset_map_foreground(sph_90_foreground, image_size); break; case CYLINDRICAL: default: Longitude_Center_Line = LONGITUDE_CENTER_LINE; coverage_bitmap_drawn = reset_map_foreground(cyl_foreground, image_size); } return (TRUE); } /* * Copy foreground (land masses and ground tracks, if any) only onto image. * The routine re-draws an image pixel only for corresponding foreground array * elements which are non-zero. */ void grid_and_foreground_to_image(int projection, grid * g, int fgOnly) { int drawWidth, middleWidth, projection_supported, skip_map; unsigned int w, h, i, j, offset, ci; unsigned int data_value, map_threshold, send_coverage; unsigned int sinu_surround = FALSE; unsigned int sph_surround = FALSE; unsigned char *c; unsigned char *f = foreground; unsigned char fg, cross_fg, fill0, fill1, fill2; unsigned char *p = image->pixelPtr; unsigned char *q, *r; float fw, fw2, lat, width; /* * Do we need to draw a blank surround outside * the map? */ if (!fgOnly) { if ((projection == SINUSOIDAL) || (projection == SINUSOIDAL_90)) { sinu_surround = TRUE; } if ((projection == SPHERICAL) || (projection == SPHERICAL_90)) { sph_surround = TRUE; } } projection_supported = (projection == CYLINDRICAL) || (((projection == UNPROJECTED)||(projection == UNPROJECTED_MASK)) && geomview_stream_textures); send_coverage = geomview_flag && geomview_dynamic_texture_flag && texture_flag && projection_supported && earth_on_flag && earth_geom_exists; /* * If threshold is 0, we don't draw white background (0), but we * do draw map outline (1) above that. If 1, we will not draw * map outline. For 0/1, could have used || instead of MAX, * but MAX is clearer in intent. */ skip_map = !map_flag || (projection == UNPROJECTED_MASK); map_threshold = MAX((send_coverage && !geomview_texture_with_map), skip_map); /* set to match Earth outline */ fill0 = outline_colors[3]; fill1 = outline_colors[4]; fill2 = outline_colors[5]; h = g->height; w = g->width; drawWidth = w; middleWidth = drawWidth/2; fw = (float) w; fw2 = fw * fw; for (i = 0; i < h; i++) { lat = 90.0 - 180.0 * i / h; if (sinu_surround) { width = (fw * cos(DEG_TO_RAD * lat)); drawWidth = (int) (0.5 + (fw - width) / 2); } if (sph_surround) { width = fw/4 - sqrt(fw2/16-fw2*lat*lat/16/90/90); drawWidth = (int) width; middleWidth = w/2 - drawWidth; } offset = i * w; q = p; for (j = 0; j < w; j++, p += PIXELSIZE) { fg = *(f++); if (sinu_surround || sph_surround) { q = p; /* updating for cross wrap-around */ if ((j <= drawWidth) || j >= (w - drawWidth)) { p[0] = fill0; p[1] = fill1; p[2] = fill2; continue; } if (sph_surround && (j > middleWidth) && (j < w - middleWidth)) { p[0] = fill0; p[1] = fill1; p[2] = fill2; continue; } } if (fg > map_threshold) { /* skipping Earth outline if map is to be sent */ c = outline_colors + PIXELSIZE * fg; p[0] = c[0]; p[1] = c[1]; p[2] = c[2]; /* * Indicate sub-satellite point by drawing four arms of cross. */ if ((fg == GROUND_TRACKS_CI) || (fg == SPECIAL_GROUND_TRACKS_CI) || (fg == GROUND_LOCATION_CI)) { cross_fg = fg + 1; if (j > 0) { /* draw left arm of cross */ *(f-2) = cross_fg; /* set retroactively for future updates. */ r = p - PIXELSIZE; r[0] = c[0]; r[1] = c[1]; r[2] = c[2]; } else { /* left arm wrap around - set pixel at j=w */ /* not well-matched to sinusoidal */ *(f+w-2) = cross_fg; /* ready to draw at end of this line */ } if (i > 0) { /* draw top arm of cross */ *(f-w-1) = cross_fg; /* set retroactively for future updates. */ r = p - w * PIXELSIZE; r[0] = c[0]; r[1] = c[1]; r[2] = c[2]; } if (j < w-1) { /* ready to draw right arm of cross, next j iteration */ *f = cross_fg; } else { /* right arm wrap around - set pixel at j=0 i same value */ /* not well-matched to sinusoidal */ *(f-j) = cross_fg; q[0] = c[0]; q[1] = c[1]; q[2] = c[2]; } if (i < h-1) { /* ready to draw bottom of cross, next i iteration/row pass */ *(f-1 + w) = cross_fg; } } continue; } if (!fgOnly) { data_value = g->data[offset + j]; if (projection == UNPROJECTED_MASK) { ci = MIN(data_value + 1, NUM_COLORS); if (*(f-1) == 0) { c = noaccess_colors + PIXELSIZE * ci; if (!no_access_flag && (ci == 1)) { c = outline_colors; } } else { c = colors + PIXELSIZE * ci; } } else { if (data_value || !(no_access_flag || sun_flag)) { ci = MIN(data_value, NUM_COLORS); c = colors + PIXELSIZE * ci; } else { ci = MIN(g->noaccess[offset + j], NUM_COLORS); c = noaccess_colors + PIXELSIZE * ci; } } p[0] = c[0]; p[1] = c[1]; p[2] = c[2]; } } } if (send_coverage) { coverage_output_image(); } if (projection == UNPROJECTED_MASK) { if (map_flag) { f = unp_foreground; } else { f = foreground; return; /* do not draw continents mask */ } } else if (!map_flag) { /* map outline is not needed. */ return; } else { f = foreground; } p = image->pixelPtr; /* map outline is 1 - cache colors for that from array */ c = outline_colors + PIXELSIZE; fill0 = c[0]; fill1 = c[1]; fill2 = c[2]; drawWidth = h*w; for (i = 0; i < drawWidth; i++, p+=PIXELSIZE) { fg = *(f++); if (fg == 1) { p[0] = fill0; p[1] = fill1; p[2] = fill2; } } } /* * tracks_to_foreground - place dot on the foreground map which corresponds * to the subsatellite point (nadir). Do this for every satellite * in the list. */ void tracks_to_foreground(const Satellite_list SL, int projection, grid * g, unsigned int color_index, const CentralBody * pcb) { unsigned int color; Satellite_list sl = SL; while (sl) { if (sl->s->tag) { /* inelegant choice of special color */ color = SPECIAL_GROUND_TRACKS_CI; } else { color = color_index; } if (sl->s->can_display_satellite) { track_to_foreground(sl->s, projection, g, color, pcb); } sl = sl->next; } } /* * track_to_foreground - routine to increment the foreground map at the point * underneath the satellite. For a single satellite. * * grid_index = color index to insert into the foreground array */ void track_to_foreground(Satellite s, int projection, grid * g, unsigned int color_index, const CentralBody * pcb) { LatLon l; spherical_to_lat_lon(&l, &(s->x_S), s->t, pcb); latlon_to_foreground(&l, projection, g, color_index); } void latlon_to_foreground(LatLon *pl, int projection, grid * g, unsigned int color_index) { int coords[2]; latlon_to_grid_index(coords, pl, projection, g); foreground[g->width * coords[1] + coords[0]] = color_index; } void fisheye_to_foreground(int projection, grid * g) { LatLon l; fisheye_location(&l); latlon_to_foreground(&l, projection, g, GROUND_LOCATION_CI); } /* * Given lat/lon coordinates of point on central body, return corresponding * index into grid. * grid_index[0]=column index, grid_index[1]=row index. */ static void latlon_to_grid_index(int grid_index[2], LatLon * pl, int projection, grid * g) { double proj[2]; LatLon l; /* * The vertical center-line of the grid corresponds to longitude = * Longitude_Center_Line, whereas both 2-d projections place longitude = 0 * along this line. So shift the input longitude as required. */ l.lat = pl->lat; l.lon = pl->lon - Longitude_Center_Line; if (l.lon < -180.0) { l.lon += 360.0; } else if (l.lon > 180.0) { l.lon -= 360.0; } switch (projection) { case UNPROJECTED: case UNPROJECTED_MASK: project_latlon_unprojected(proj, &l); break; case SINUSOIDAL: case SINUSOIDAL_90: project_latlon_sinusoidal(proj, &l); break; case SPHERICAL: case SPHERICAL_90: project_latlon_spherical(proj, &l); break; case CYLINDRICAL: default: project_latlon_cylindrical(proj, &l); } /* * It's assumed that proj[0] ranges from -180 to 180, and * proj[1] ranges from -90 to 90, no matter what. */ grid_index[0] = ((int) (0.5 + (proj[0] + 180.0) * (g->width) / 360.0)); grid_index[1] = ((int) (0.5 + proj[1] * (g->height - 1) / 180.0)); } savi1.6.0/src/gv_utils.c0000644000175000017500000002466714423445060014243 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * gv_utils.c * * $Id: gv_utils.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include /* #include */ /* for select */ #include #include #include #include /* extern int select(int, int *, int *, int *, struct timeval *); */ #include "int_types.h" #include "utils.h" #include "gv_file.h" #include "gv_utils.h" #include "constants.h" #include "globals.h" extern void gv_delayed_view_update(void); static unsigned char GV_LITTLE_ENDIAN = 1; static unsigned char GV_BIG_ENDIAN = 2; /* * variable to see if an acknowledgement request has been sent * accessed by gv_set_ready and gv_ready */ static unsigned int gv_ack = FALSE; /* * if depth nesting ever goes negative, it's a bug. */ static int progn_depth = 0; /* * get information on floating point storage type. * Suggested by Stuart Levy on geomview-users, November 2000 */ unsigned char test_ieee_float() { static float testfloat = 40970.25; static unsigned char testle[] = { 0x40, 0x0a, 0x20, 0x47 }; static unsigned char testbe[] = { 0x47, 0x20, 0x0a, 0x40 }; if(sizeof(testfloat) != 4) return 0; /* wrong float size */ if(memcmp( &testfloat, testle, 4 ) == 0) return GV_LITTLE_ENDIAN; /* OK, little-endian */ if(memcmp( &testfloat, testbe, 4 ) == 0) return GV_BIG_ENDIAN; /* OK, big-endian */ return 0; /* non-IEEE, or something */ } unsigned char gv_stream_init_proc() { /* * Redirect stdout to stderr */ int gv_fdout, fdout; gv_in = stdin; fdout = fileno(stdout); gv_fdout = dup(fdout); if (gv_fdout == NOT_OK) { error("failure to set up output pipe to control Geomview."); return FALSE; } close(fdout); gv_out = fdopen(gv_fdout, "a"); if (!gv_out) { error("failure to open output pipe to control Geomview."); return FALSE; } if (dup2(fileno(stderr), fdout) != fdout) { error("failure to redirect stdout to stderr."); fclose(gv_out); return FALSE; } /* at this point stdout should point to stderr */ return TRUE; } /* * gv_init_proc * * Call to initialize any variables, if necessary. * */ unsigned char gv_init_proc() { unsigned char gv_binary_format_available; gv_binary_format_available = test_ieee_float(); #ifndef TEST_FOR_GV_BINARY_FORMAT error("can't use Geomview binary format on this architecture."); gv_binary_format_available = 0; #endif return gv_binary_format_available; } /* * gv_send * * Sends a string to geomview */ void gv_send(const char *buf) { if (!geomview_module) return; fprintf(gv_out, "%s", buf); } /* * gv_version * * Returns a pointer to a string containing the version of geomview */ char * gv_version() { static char version_str[LENGTH_STRING_BUFFER]; unsigned int c; char *p; /* request version from geomview */ gv_wait(); gv_send("(echo (geomview-version))\n"); fflush(gv_out); /* get a double quote */ do { c = fgetc(gv_in); } while (c != '"'); /* read in characters until another double quote is found */ p = version_str; do { *p = (char) fgetc(gv_in); } while ((*(p++)) != '"'); /* overwrite final double quote with a string terminator */ *(--p) = '\0'; return version_str; } /* * gv_send_binary_ints * * Sends long ints in (big endian) binary format to geomview * To convert to big endian format, use htonl_buffer * */ void gv_send_binary_ints(const uint32_t *buf, unsigned int n) { fwrite((const void *) buf, 4, n, gv_out); } /* * gv_send_binary_shorts * * Sends short ints in (big endian) binary format to geomview * To convert to big endian format, use htons_buffer * */ void gv_send_binary_shorts(const uint16_t *buf, unsigned int n) { fwrite((const void *) buf, 2, n, gv_out); } /* * gv_send_binary_floats * * Sends floats in (big endian) binary format to geomview * To convert to big endian format, use htonl_buffer * Presumes that a float is a 32-bit (4-byte) word. * */ void gv_send_binary_floats(const float *buf, unsigned int n) { fwrite((const void *) buf, 4, n, gv_out); } /* * gv_sendfile * * Sends a file to geomview */ unsigned int gv_sendfile(const char *filename) { return copyfile(gv_out, filename); } /* * gv_wait * * Waits until geomview is up to date */ void gv_wait() { while (!gv_ready()); /* just in case something is waiting already */ gv_set_ready(); while (!gv_ready()); } /* * gv_begin * * Sets up beginning of block of commands. * */ void gv_begin() { if (!geomview_module) { error("gv_begin() called although not running as Geomview module."); return; } if (0 == progn_depth++) { fprintf(gv_out, "(progn\n"); } } void gv_start() { if (!geomview_module) { error("gv_start() called although not running as Geomview module."); return; } if (0 == progn_depth++) { fprintf(gv_out, "(progn\n"); } } /* * gv_end * * Ends block of commands and flushes buffer */ void gv_end() { if (!geomview_module) { error("gv_end() called although not running as Geomview module."); return; } if (--progn_depth == 0) { gv_delayed_view_update(); fprintf(gv_out, ")\n"); fflush(gv_out); } else if (progn_depth < 0) { error("gv_end() called more than gv_begin()! Nesting symmetry broken."); } } /* * gv_stop * As gv_end(), but doesn't call gv_delayed_view_update() to update everything. */ void gv_stop() { if (!geomview_module) { error("gv_stop() called although not running as Geomview module."); return; } if (--progn_depth == 0) { fprintf(gv_out, ")\n"); fflush(gv_out); } else if (progn_depth < 0) { error("gv_stop() called too often! Nesting symmetry broken."); } } /* * gv_transform * * Defines transform name using matrix m. */ void gv_transform(const char *name, double m[4][4]) { unsigned int i, j; fprintf(gv_out, "(read transform {transform define %s\n", name); for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) fprintf(gv_out, "%g ", m[i][j]); fprintf(gv_out, "})\n"); } /* * gv_create_geom * * Create geomview object name as the transformation tname * applied to the object hname. */ void gv_create_geom(const char *name, const char *tname, const char *hname) { fprintf(gv_out, "(geometry %s { INST transform :%s geom :%s} )\n", name, tname, hname); } /* * gv_create_geomh * * Create geomview object name from handle hname. */ void gv_create_geomh(const char *name, const char *hname) { fprintf(gv_out, "(geometry %s { :%s } )\n", name, hname); } /* * gv_create_alienh * * Create geomview object name from handle hname. */ void gv_create_alienh(const char *name, const char *hname) { fprintf(gv_out, "(new-alien %s { :%s } )\n", name, hname); } /* * gv_delete_geom(char *name) * * Deletes geomview object name */ void gv_delete_geom(const char *name) { fprintf(gv_out, "(delete %s)\n", name); } /* * gv_delete_handle(char *name) * * Deletes geomview handle object */ void gv_delete_handle(const char *name) { fprintf(gv_out, "(read geometry {define %s {} })\n", name); } /* * gv_ui_freeze(int flag) * * If flag is TRUE then geomview interface is frozen * else if FALSE it is reactivated. Currently unused. */ void gv_ui_freeze(int flag) { if (!flag) { fprintf(gv_out, "(ui-freeze off)\n"); fflush(gv_out); } else { fprintf(gv_out, "(ui-freeze on)\n"); } } /* * send msg to gv so that we can later test if it is ready */ void gv_set_ready() { if (gv_ack) return; fprintf(gv_out, "(echo \"\\n\")\n"); fflush(gv_out); gv_ack = TRUE; } /* * returns true if GV has returned the last acknowledgement * sent by gv_set_ready */ unsigned int gv_ready() { char c; static struct timeval poll = { 0, 100000 }; fd_set fds; /* don't wait for input from Geomview if it's not really there. */ if (fake_geomview_module) return TRUE; FD_ZERO(&fds); FD_SET(fileno(gv_in), &fds); /* if nothing to wait for then ready */ if (!gv_ack) gv_set_ready(); if (select(fileno(gv_in) + 1, &fds, NULL, NULL, &poll) > 0) { c = (char)fgetc(gv_in); if (c != '\n') fprintf(stderr, "gv_ready: error, got char: %c (%d)\n", c, c); gv_ack = FALSE; if (debug) { putc('|', stderr); putc('\n', stderr); } return TRUE; } if (debug) putc('.', stderr); return FALSE; } char * gv_begin_cmd(int argc, char *argv[]) { if (geomview_module) { gv_begin(); } return EMPTY_str; } char * gv_end_cmd(int argc, char *argv[]) { if (geomview_module) { gv_end(); } return EMPTY_str; } char * gv_wait_cmd(int argc, char *argv[]) { gv_wait(); return EMPTY_str; } char * gv_send_cmd(int argc, char *argv[]) { if (!geomview_module) return EMPTY_str; if (argc == 3) { gv_begin(); gv_send(argv[2]); gv_end(); } else { error_format("gv_send_cmd: savi %s needs 1 argument", argv[1]); } return EMPTY_str; } /* * htonl_buffer * * Converts an array of unsigned ints from host format * to native (big endian) format. * This is for writing in binary format to Geomview and * requires use of an unsigned 32-bit word. */ void htonl_buffer(uint32_t *buf, unsigned int n) { /* * if we are not little-endian, do nothing. */ if (GV_BINARY_FORMAT_AVAILABLE != GV_LITTLE_ENDIAN) return; while ((n--) > 0) { *buf = htonl(*buf); buf++; } } /* * htons_buffer * * Converts an array of unsigned shorts from host format * to native (big endian) format. * This is for writing in binary format to Geomview and * requires use of an unsigned 16-bit (two-byte) word. */ void htons_buffer(uint16_t *buf, unsigned int n) { /* * if we are not little-endian, do nothing. */ if (GV_BINARY_FORMAT_AVAILABLE != GV_LITTLE_ENDIAN) return; while ((n--) > 0) { *buf = htons(*buf); buf++; } } savi1.6.0/src/earth.c0000644000175000017500000002314714423445060013502 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * earth.c * * Routines for creating fancy earth model * * $Id: earth.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include "gv_utils.h" #include "utils.h" #include "constants.h" #include "globals.h" #include "coverage_vis.h" #include "savi.h" unsigned int earth_on_flag = FALSE; unsigned int earth_geom_exists = FALSE; unsigned int use_simple_earth = FALSE; unsigned int use_fancy_earth = FALSE; unsigned int geomview_dynamic_coverage = FALSE; static unsigned int earth_vectors_loaded = FALSE; static unsigned int earth_texture_loaded = FALSE; static unsigned int earth_created = FALSE; static double m[4][4]; /* identity matrix used for rotating Earth */ static void earth_create_geom(void); static void earth_delete_geom(void); /* * earth_create_geom */ static void earth_create_geom(void) { if (earth_geom_exists) return; /* * initialise the identity matrix */ identity(m); if (geomview_module) { /* create a simple blue sphere for the earth */ gv_start(); gv_create_geom("Central_Body", "central_t", "unit_sphere_h"); gv_stop(); } earth_geom_exists = TRUE; } /* * earth_delete_geom */ static void earth_delete_geom(void) { if (!earth_geom_exists) return; if (geomview_module) { gv_start(); gv_delete_geom("Central_Body"); gv_stop(); } earth_geom_exists = FALSE; } /* * create_earth */ void create_earth(void) { /* coverage map checkbox determines if we draw Earth with vector map or not. */ if (get_map_flag()) { gv_create_geom("Central_Body", "central_t", "earth_vect_texture_sphere_h"); } else { gv_create_geom("Central_Body", "central_t", "earth_h"); } } /* * redraw_earth */ void redraw_earth(int argc, char *argv[]) { if (earth_on_flag) { char *status = EMPTY_str; if (geomview_module) gv_start(); status = earth_off_cmd(argc, argv); status = earth_on_cmd(argc, argv); if (geomview_module) gv_stop(); } } /* * earth_on_cmd * * Displays the earth sphere, dull or detailed. */ char * earth_on_cmd(int argc, char *argv[]) { char *status = EMPTY_str; if (earth_on_flag) return status; if (!earth_created) { /* just draw sphere */ earth_create_geom(); } earth_on_flag = TRUE; if (geomview_module) { gv_start(); if (texture_flag) { if (!earth_texture_loaded) { earth_texture_loaded = gv_sendfile("oogl/earth_texture_h.oogl"); } if (geomview_stream_textures && geomview_dynamic_texture_flag) { if ((coverage_projection == UNPROJECTED)||(coverage_projection == UNPROJECTED_MASK)) { if (debug) error("texturemap sphere, dynamic unprojected map."); gv_sendfile("oogl/earth_coverage_unp_h.oogl"); redraw_coverage_display(); } else if (coverage_projection == CYLINDRICAL) { if (debug) error("texturemap sphere, dynamic cylindrical map."); gv_sendfile("oogl/earth_coverage_h.oogl"); redraw_coverage_display(); } else { if (debug) error("texturemap sphere, dynamic mapping of this projection not supported."); if (use_fancy_earth) { gv_sendfile("oogl/earth_fancy_h.oogl"); } else { gv_sendfile("oogl/earth_h.oogl"); } geomview_dynamic_coverage = FALSE; } create_earth(); } else if (use_simple_earth) { /* static texture - blue and gold map */ if (debug) error ("texturemap sphere, simple static Earth image.\n"); gv_sendfile("oogl/earth_h.oogl"); create_earth(); } else if (use_fancy_earth) { /* static texture - detailed texturemap */ if (debug) error ("texturemap sphere, detailed static Earth image.\n"); if (!geomview_stream_textures) { /* 1.9.0 supports streaming and CYLINDRICAL/RECTANGULAR */ error("Detailed Earth map requires later Geomview. Please upgrade."); } gv_sendfile("oogl/earth_fancy_h.oogl"); create_earth(); } else { if (debug) error ("texturemap sphere, do not draw detailed Earth.\n"); if (geomview_dynamic_coverage) { if (debug) error ("texturemap sphere, do not draw detailed Earth.\n"); gv_create_geom("Central_Body", "central_t", "earth_h"); } else { if (debug) error ("basic sphere, no detailed Earth.\n"); gv_create_geom("Central_Body", "central_t", "unit_sphere_h"); } } } else if (earth_on_flag) { /* no texturing */ create_earth(); } gv_stop(); } earth_geom_exists = TRUE; return status; } /* * earth_off_cmd * * Destroy the earth sphere */ char * earth_off_cmd(int argc, char *argv[]) { char *status = EMPTY_str; if (!earth_on_flag) return status; earth_on_flag = FALSE; if (use_fancy_earth) { /* we nest in gv_start/stop to hide temporary cosmetic changes - * this is the same idea used when loading tcl scripts * to prevent incremental per-new-satellite drawing updates. */ if (geomview_module) gv_start(); fancy_off_cmd(argc, argv); fancy_on_cmd(argc, argv); if (geomview_module) gv_stop(); } else if (use_simple_earth) { if (geomview_module) gv_start(); simple_off_cmd(argc, argv); simple_on_cmd(argc, argv); if (geomview_module) gv_stop(); } else { /* just destroy sphere */ earth_delete_geom(); } return status; } /* * simple_on_cmd * * Creates a simple model of the earth by using vector * or loading texture-map file. */ char * simple_on_cmd(int argc, char *argv[]) { char *status = EMPTY_str; if (use_simple_earth) return status; use_simple_earth = TRUE; if (geomview_module) gv_start(); if (!earth_vectors_loaded) { earth_vectors_loaded = gv_sendfile("oogl/earth_vect_h.oogl"); } if (earth_on_flag) { status = earth_off_cmd(argc, argv); status = earth_on_cmd(argc, argv); } else { /* clear sphere */ if (debug) error("clear sphere, invisible Earth body."); gv_sendfile("oogl/earth_vect_h.oogl"); gv_create_geom("Central_Body", "central_t", "earth_vect_clear_h"); earth_geom_exists = TRUE; } if (geomview_module) gv_stop(); return status; } /* * simple_off_cmd * * Returns to a clean sphere to model the central body */ char * simple_off_cmd(int argc, char *argv[]) { char *status = EMPTY_str; if (!use_simple_earth) return status; use_simple_earth = FALSE; redraw_earth(argc, argv); return status; } /* * fancy_on_cmd * * Creates a fancy model of the earth by using vector * or loading texture-map file. */ char * fancy_on_cmd(int argc, char *argv[]) { char *status = EMPTY_str; if (use_fancy_earth) return status; if (!geomview_detailed_texturemap) { error("Detailed texturemap file has not been downloaded."); return status; } use_fancy_earth = TRUE; if (geomview_module) gv_start(); if (!earth_vectors_loaded) { earth_vectors_loaded = gv_sendfile("oogl/earth_vect_h.oogl"); } if (earth_on_flag) { status = earth_off_cmd(argc, argv); status = earth_on_cmd(argc, argv); } else { /* clear sphere */ if (debug) error("clear sphere, invisible Earth body."); gv_sendfile("oogl/earth_vect_h.oogl"); gv_create_geom("Central_Body", "central_t", "earth_vect_clear_h"); earth_geom_exists = TRUE; } if (geomview_module) gv_stop(); return status; } /* * fancy_off_cmd * * Returns to a clean sphere to model the central body */ char * fancy_off_cmd(int argc, char *argv[]) { char *status = EMPTY_str; if (!use_fancy_earth) return status; use_fancy_earth = FALSE; redraw_earth(argc, argv); return status; } /* * texture_on * * Use texture mapping for fancy earth model */ char * texture_on_cmd(int argc, char *argv[]) { char *status = EMPTY_str; if (texture_flag) return status; texture_flag = TRUE; redraw_earth(argc, argv); return status; } /* * texture_off_cmd * * Use vect model for fancy earth model */ char * texture_off_cmd(int argc, char *argv[]) { char *status = EMPTY_str; if (!texture_flag) return status; texture_flag = FALSE; redraw_earth(argc, argv); return status; } /* * geomview_dynamic_texture_on */ char * geomview_dynamic_texture_on_cmd(int argc, char *argv[]) { char *status = EMPTY_str; if (geomview_dynamic_texture_flag) return status; if (!geomview_dynamic_coverage) { geomview_dynamic_coverage = coverage_dynamic_initialised(); } if (geomview_dynamic_coverage) { geomview_dynamic_texture_flag = TRUE; } if (texture_flag) { redraw_earth(argc, argv); } return status; } /* * geomview_dynamic_texture_off */ char * geomview_dynamic_texture_off_cmd(int argc, char *argv[]) { char *status = EMPTY_str; if (!geomview_dynamic_texture_flag) return status; geomview_dynamic_texture_flag = FALSE; if (texture_flag) { redraw_earth(argc, argv); } return status; } /* * earth_place * * rotates the earth to correct position for time t */ void earth_place(double t, const CentralBody * pcb) { double theta, ct, st; theta = t * pcb->rotation_rate; ct = cos(theta); st = sin(theta); /* * update elements of an existing identity matrix */ m[0][0] = ct; m[0][1] = st; m[1][0] = -st; m[1][1] = ct; gv_transform("central_t", m); } savi1.6.0/src/Makefile0000644000175000017500000000664514423445060013677 0ustar lloydlloyd# # Makefile for SaVi - src directory. Run top-level Makefile instead. # # Used for the version string. Can be overriden per-platform. LINEEND = \\ include Makefile_defs_$(ARCH) SUBDIRS = include SHELL = /bin/sh RM = /bin/rm -f MV = /bin/mv CP = /bin/cp SAVIBIN = SaVi # We retain . here to avoid cygwin appending .exe PROGRAM = $(SAVIBIN)-$(ARCH).bin INCLUDE_DIR = ./include # remove -DNO_ZLIB from end to use zlib from http://www.gzip.org/zlib # zlib enables transparent gzip compression of dynamic texture scratchfiles. # OTHER_LIBS = -lz should be inserted at end of definitions file. GCC_FLAGS = -fcommon -O2 -DNO_ZLIB # -fcommon works around default definition dup change in gcc 10, 11. LIBS = $(TCL_LIBS) $(OTHER_LIBS) -lm # DEBUGFLAGS = -Wall -Wextra -Wconversion -pedantic # These do not find anything to warn about: # DEBUGFLAGS = -Wshadow -Wpointer-arith -Wcast-qual \ # -Wcast-align -Wwrite-strings -Wconversion -Waggregate-return \ # -Wmissing-prototypes -Wmissing-declarations -Wnested-externs # These do, but the reports aren't useful (e.g. use of all inlines): # -Wtraditional # For compiling a binary for use with gdb: # DEBUGFLAGS = -g # On non-gcc compilers: # DEBUGFLAGS = fullwarn SRCS = \ main.c \ globals.c \ satCmd.c \ sats.c \ modules.c \ axes.c \ sun.c \ logo.c \ orbits.c \ cones.c \ footprints.c \ plane.c \ earth.c \ stars.c \ coverage.c \ coverage_vis.c \ fisheye.c \ time.c \ Satellite.c \ gv_init.c \ satellites.c \ orbit_utils.c \ stats_utils.c \ utils.c \ gv_utils.c \ tcl_utils.c INCLUDES = \ $(INCLUDE_DIR)/Satellite.h \ $(INCLUDE_DIR)/constants.h \ $(INCLUDE_DIR)/coverage_vis.h \ $(INCLUDE_DIR)/fisheye.h \ $(INCLUDE_DIR)/globals.h \ $(INCLUDE_DIR)/gv_utils.h \ $(INCLUDE_DIR)/orbit_utils.h \ $(INCLUDE_DIR)/sats.h \ $(INCLUDE_DIR)/savi.h \ $(INCLUDE_DIR)/stats_utils.h \ $(INCLUDE_DIR)/tcl_utils.h \ $(INCLUDE_DIR)/utils.h OTHER_SRCS = Makefile_defs_ Makefile_defs_linux Makefile_defs_cygwin \ Makefile_defs_macosx Makefile_defs_freebsd \ Makefile_defs_irix Makefile_defs_sun Makefile_defs_sun4 \ Makefile_defs_ubuntu Makefile_defs_x86_64 \ Makefile_defs_cygwin84 # # commands and flags # CFLAGS = $(GCC_FLAGS) $(DEBUGFLAGS) \ -I$(INCLUDE_DIR) $(TCL_INCLUDES) # # derived objects # OBJS = $(SRCS:.c=.o) # # targets # $(PROGRAM): $(OBJS) version.o $(CC) $(CFLAGS) -o $(PROGRAM) $(OBJS) version.o $(LIBS) $(MV) $(PROGRAM) ../bin/$(PROGRAM) $(CP) ../bin/$(PROGRAM) ../bin/$(SAVIBIN) all: @$(MAKE_SUBDIRS:target=all) @make $(PROGRAM) version.c: FORCE # echo -E may be useful on Linux if output is over multiple lines @echo "char *Version = \"SaVi was compiled with 'make ARCH=$(ARCH)'$(LINEEND)\\nVersion" `cat ../VERSION`"$(LINEEND)\\nBuilt by $(USER)@$(HOST)$(HOSTNAME), `date`\";" > ./version.c objs: $(OBJS) $(OBJS): $(INCLUDES) tarfilelist:: @$(MAKE_SUBDIRS:target=tarfilelist) @srcs="Makefile $(SRCS) $(OTHER_SRCS)" ; \ for i in $$srcs ; do \ echo "$(CURRENT_DIR)/$$i" >> $(TOP)/fileslist ; \ done clean: @$(MAKE_SUBDIRS:target=clean) $(RM) *~ *.o version.c core $(SAVIBIN)* FORCE: # macros MAKE_SUBDIRS = \ dirs="$(SUBDIRS)" ; \ for i in $$dirs ; do \ (cd $$i; \ echo "making" target "in $(CURRENT_DIR)/$$i..."; \ $(MAKE) $(MFLAGS) target CURRENT_DIR=$(CURRENT_DIR)/$$i TOP=$(TOP)) ; \ done # END savi1.6.0/src/Makefile_defs_cygwin0000644000175000017500000000570214423445060016251 0ustar lloydlloyd# # Makefile_defs_cygwin # Definitions which work for a Windows/cygwin system: # http://www.cygwin.com/ # A conventional unix port of Tcl/Tk 8.5 replaced Cygwin's Insight Tcl/Tk 8.4 # in October 2011 - the older cygwin84 Makefile. # # Always run make ARCH=platform from the top-level savi directory. # # Cygwin needs to have installed from Setup: # under Devel: # binutils # gcc-core and its dependencies # make # zlib-devel (optional, requires editing flag in src/Makefile) # under Libs: # tcltk # under X11: # libX11-devel and its dependencies (lets Tcl/Tk files compile) # # X11 binaries are only needed if Geomview is installed. See: # http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/building-under-Windows/ # # $Id: Makefile_defs_cygwin 10 2019-01-24 04:47:40Z lloydwood $ ######################################################## # # # Set machine type -- suffix for savi # # # ######################################################## MACH = cygwin ######################################################## # # # set CC to an ANSI C compiler # # # ######################################################## CC = gcc # override line terminator for version.c creation LINEEND = ######################################################## # # # set TCL_INCLUDES so that the compiler can # # find the tcl.h and tk.h # # # # If tcl/tk is installed in a standard place # # it is not necessary to set this. You may need to # # change the numbers to match your version of tcl/tk. # # The numbers in the topmost savi script should also # # match. # # # ######################################################## ######################################################## # # # set TCL_LIBS so that the compiler can find # # libtcl.a and libtk.a. Alter to suit - see above. # # # ######################################################## TCL_LIBS = -ltk -ltcl ######################################################## # # # Set OTHER_LIBS so that any other stuff needing to # # be linked in will be! # # # ######################################################## # -lz is for gzip compression library http://www.zlib.net/ # used for compressing textures to Geomview. OTHER_LIBS = -lz # OTHER_LIBS = -static # -ldl savi1.6.0/src/Makefile_defs_sun0000644000175000017500000000416114423445060015554 0ustar lloydlloyd# # Makefile_defs_sun # # Definitions which work for Sun Solaris.. # # Always run make ARCH=platform from the top-level savi directory. # # $Id: Makefile_defs_sun 10 2019-01-24 04:47:40Z lloydwood $ ######################################################## # # # Set machine type -- suffix for savi # # # ######################################################## MACH = sun ######################################################## # # # set CC to an ANSI C compiler # # # ######################################################## CC = gcc # override line terminator for version.c creation LINEEND = ######################################################## # # # set TCL_INCLUDES so that the compiler can # # find the tcl.h and tk.h # # # # if tcl/tk is installed in a standard place # # it is not necessary to set this # # # ######################################################## TCL_INCLUDES = -I/usr/local/include ######################################################## # # # set TCL_LIBS so that the compiler can find # # libtcl.a and libtk.a # # # ######################################################## TCL_LIBS = -L/usr/local/lib -ltk -ltcl ######################################################## # # # Set OTHER_LIBS so that any other stuff needing to # # be linked in will be! # # # ######################################################## OTHER_LIBS = -lsocket -lnsl -ldl savi1.6.0/src/stats_utils.c0000644000175000017500000004364714423445060014764 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * stats_utils.c * * $Id: stats_utils.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include #include #include #include "sats.h" #include "constants.h" #include "globals.h" #include "stats_utils.h" #include "orbit_utils.h" #include "utils.h" static void orient_circle(double t, CartesianCoordinates *pc, CartesianCoordinates *pu, CartesianCoordinates *pv, const CentralBody *pcb); static void footprint_circle(CartesianCoordinates *pc, CartesianCoordinates *pu, CartesianCoordinates *pv, int fp_angle_type, double footprint_angle, CartesianCoordinates *py, const CentralBody *pcb); static double footprint_circle_radius(double l, int fp_angle_type, double footprint_angle); static void intensity_circle_footprint(CartesianCoordinates *pc, CartesianCoordinates *pu, CartesianCoordinates *pv, int current_projection, grid *g, int special); static void increment_intensity (int row, int column, grid *g, int special); static void circle_point(SphericalCoordinates *point, CartesianCoordinates *pc, CartesianCoordinates *pu, CartesianCoordinates *pv, double t); static void intensity_index(int grid_index[2], SphericalCoordinates *point, int current_projection, grid *g); static void cap_pole(CartesianCoordinates *pc, CartesianCoordinates *pu, CartesianCoordinates *pv, int current_projection, grid *g, int special); static void project_sinusoidal(double proj[2], SphericalCoordinates *point); static void project_cylindrical(double proj[2], SphericalCoordinates *point); static void project_unprojected(double proj[2], SphericalCoordinates *point); static void project_spherical(double proj[2], SphericalCoordinates *point); /* * Initialize the coverage grid */ grid* create_grid(int h, int w) { grid *pg; pg=(grid *) malloc(sizeof(grid)); pg->data=(int *) malloc(h * w *sizeof(int)); pg->noaccess=(int *) malloc(h * w * sizeof(int)); pg->covered=(int *) malloc(h * sizeof(int)); pg->height=h; pg->width=w; pg->count = 0; return pg; } /* * Free space allocated to a coverage grid. */ void destroy_grid(grid *g) { free(g->data); free(g->noaccess); free(g->covered); free(g); } /* * Clear the intensity array. */ void clear_intensity(grid * g) { unsigned int block; block = sizeof(int) * g->height * g->width; memset(g->data, 0, (size_t) block); memset(g->covered, 0, (size_t) sizeof(int) * g->height); g->count = 0; } /* * fill interval-decay with fixed value meaning many intervals since coverage */ void fill_interval(grid * g, int value) { unsigned int block; block = sizeof(int) * g->height * g->width; memset(g->noaccess, value, (size_t) block); } /* * Increment everything on the interval grid towards decay. */ void decay_interval(grid * g) { unsigned int i; unsigned int image_size = g->height * g->width; for (i = 0; i < image_size; i++) { (g->noaccess[i])++; } } /* * Fill out the coverage grid. */ void fill_grid(const Satellite_list SL, int current_projection, int fp_angle_type, double footprint_angle, const CentralBody *pcb, grid *g) { CartesianCoordinates c, u, v; Satellite_list sl; double angle, a; /* first satellite is special sunlight approximation */ int sunlight = TRUE; if (fp_angle_type == MASK_ELEVATION) { angle = 0; } else { angle = HALFPI; } for (sl = SL; NULL != sl; sl = sl->next) { if (sl->s->can_display_coverage) { a = sl->s->x_S.r - pcb->radius; if (!sunlight && ((min_transmit_altitude > 0)||(max_transmit_altitude > 0))) { if (a <= min_transmit_altitude) { continue; } if (a >= max_transmit_altitude) { continue; } } footprint_circle(&c, &u, &v, fp_angle_type, angle, &(sl->s->x_C), pcb); orient_circle(sl->s->t, &c, &u, &v, pcb); intensity_circle_footprint(&c, &u, &v, current_projection, g, sunlight); } if (sunlight) { angle = footprint_angle; sunlight = FALSE; } } } /* * Given orbital elements, compute circular footprint of a satellite. * * The circle is normalized to lie on a unit radius reference sphere, and * is specified by a center c and basis vectors u and v, in normalized * geocentric coordinates. The parametrization is thus c+cos(t)u + sin(t)v. */ static void footprint_circle(CartesianCoordinates *pc, CartesianCoordinates *pu, CartesianCoordinates *pv, int fp_angle_type, double footprint_angle, CartesianCoordinates *py, const CentralBody *pcb) { SphericalCoordinates z; CartesianCoordinates w; double ly, l, d, r, ip; /* The center first */ ly = norm(py); l = ly/pcb->radius; r = footprint_circle_radius( l, fp_angle_type, footprint_angle); d = sqrt(1-r*r); ip = d / ly; pc->x = py->x*ip; pc->y = py->y*ip; pc->z = py->z*ip; /* Now the "up" basis vector. */ cartesian_to_spherical(&z, py); z.r = 1; z.phi -= asin(r); if (debug) fprintf(stderr, "r=%.4f dphi=%.4f y=(%.2f, %.2f, %.2f)\n", \ r, asin(r), z.r, z.theta, z.phi); spherical_to_cartesian(&w, &z); pu->x = w.x-pc->x; pu->y = w.y-pc->y; pu->z = w.z-pc->z; /* The final basis vector we can take to be the cross-product c x u, * normalized to have same length as u (that is, r). Notice, then, that * v points to the "left". */ cross_product( pv, pc, pu ); pv->x /= d; pv->y /= d; pv->z /= d; } /* * orient_circle * * For displaying onto the coverage map, the footprint circle vectors need * to be rotated around the z-axis so that Longitude_Center_Line appears * at geocentric equatorial theta=0. */ static void orient_circle(double t, CartesianCoordinates *pc, CartesianCoordinates *pu, CartesianCoordinates *pv, const CentralBody *pcb) { SphericalCoordinates p; CartesianCoordinates w; /* Find the geocentric equatorial spherical coordinates of the specified */ /* longitude at the current time. Then rotate all vectors by minus this */ /* angle about the z-axis. */ lat_lon_to_spherical (0.0, (double) Longitude_Center_Line, t, pcb, &p); rotate_z(pc, -p.theta, &w); pc->x = w.x; pc->y = w.y; pc->z = w.z; rotate_z(pu, -p.theta, &w); pu->x = w.x; pu->y = w.y; pu->z = w.z; rotate_z(pv, -p.theta, &w); pv->x = w.x; pv->y = w.y; pv->z = w.z; } /* * Given the normalized distance to the spacecraft, compute the radius of * a circular footprint. */ static double footprint_circle_radius( double L, int fp_angle_type, double footprint_angle) { double sa = sin(footprint_angle); double ca = cos(footprint_angle); if (fp_angle_type == MASK_ELEVATION) { if (L < 1) { /* * Avoid NaN oddities and overflows when satellite drops below * Earth surface. * Only do this for mask elevation, because the invert effect for * satellite cones is very cool and safe. */ L = 1; } if (debug) fprintf(stderr, "Mask elevation = %f radians.\n", footprint_angle); return( ca*(sqrt(1-ca*ca/L/L)-sa/L) ); } else { if (debug) fprintf(stderr, "Sat cone angle = %f radians.\n", footprint_angle); if ( L >= 1/sa ) return( sqrt(L*L-1)/L ); else return( sa*(L*ca-sqrt(1-L*L*sa*sa)) ); } } /* * Increment the intensity image, circular footprint. */ static void intensity_circle_footprint(CartesianCoordinates *pc, CartesianCoordinates *pu, CartesianCoordinates *pv, int current_projection, grid *g, int special) { double t, dt, t_final; SphericalCoordinates point; int j, row, prev_row, left[2], right[2], left_edge[2], right_edge[2]; /* compute phi increment so that we fill in each row of grid */ switch (current_projection) { case UNPROJECTED: case UNPROJECTED_MASK: case SINUSOIDAL: case SINUSOIDAL_90: dt = PI/(g->height-1)/norm(pu); break; case SPHERICAL: case SPHERICAL_90: case CYLINDRICAL: default: dt = 2.0/(g->height-1)/norm(pu); } t_final = PI; circle_point(&point, pc, pu, pv, 0.0); intensity_index(left, &point, current_projection, g); increment_intensity(left[1], left[0], g, special); row=left[1]; prev_row=row; for (t=dt; t 1 ) { fprintf(stderr, "Intensity: row skipped. Prev=%i,current=%i.\n", prev_row, row); } circle_point(&point, pc, pu, pv, TWOPI-t); intensity_index(right, &point, current_projection, g); if (left[0] <= right[0]) { for (j = left[0]; j <= right[0]; j++) { increment_intensity(row,j,g, special); } } else { intensity_edges(left_edge, right_edge, &point, current_projection, g); for(j = left_edge[0]; j <= right[0]; j++) { increment_intensity(row,j,g, special); } for(j = left[0]; j < right_edge[0]; j++) { increment_intensity(row,j,g, special); } } prev_row = row; } } /* * Footprint caps one of the poles if projection of center vector c onto * x,y plane has magnitude less than magnitude of projection of circle basis * vector u (u always points in direction of north pole from c). */ if ( pc->x*pc->x+pc->y*pc->y < pu->x*pu->x+pu->y*pu->y ) { cap_pole( pc, pu, pv, current_projection, g, special); } } /* * Increment the intensity image at given row and column. * (row ranges from 0 to g->height-1, * column from 0 to g->width-1.) */ static void increment_intensity(int row, int column, grid *g, int special) { unsigned int k; k = g->width * row + column; if (!special && ( 0 == (g->data[k])++) ) { if (sun_flag) { (g->noaccess[k]) = NUM_COLORS - 1; } else { (g->noaccess[k]) = 0; } (g->covered[row])++; (g->count)++; } else { if (sun_flag) { (g->noaccess[k]) = NUM_COLORS - 1; } if (!special) { (g->covered[row])++; (g->count)++; } } } /* * For time t, return the spherical coordinates of the point * c+cos(t)u+sin(t)v on circle with center c and basis vectors u and v. */ static void circle_point(SphericalCoordinates *point, CartesianCoordinates *pc, CartesianCoordinates *pu, CartesianCoordinates *pv, double t ) { CartesianCoordinates temp; float ct = cos(t), st = sin(t); temp.x = pc->x+ct*pu->x+st*pv->x; temp.y = pc->y+ct*pu->y+st*pv->y; temp.z = pc->z+ct*pu->z+st*pv->z; cartesian_to_spherical(point, &temp); } /* * Given point on unit sphere in spherical coordinates, return corresponding * index into coverage intensity grid. * grid_index[0]=column index, grid_index[1]=row index. */ static void intensity_index(int grid_index[2], SphericalCoordinates *point, int current_projection, grid *g) { double proj[2]; switch (current_projection) { case UNPROJECTED: case UNPROJECTED_MASK: project_unprojected(proj, point); break; case SINUSOIDAL: case SINUSOIDAL_90: project_sinusoidal(proj, point); break; case SPHERICAL: case SPHERICAL_90: project_spherical(proj,point); break; case CYLINDRICAL: default: project_cylindrical(proj, point); } /* It's assumed that proj[0] ranges from -PI to PI no matter what. */ grid_index[0]=((int) ((proj[0]+PI)*(g->width)/TWOPI)); grid_index[1]=((int) (proj[1]*(g->height-1)/PI)); } /* * Increment intensity image for a polar cap. * * The routine increments those image pixels corresponding to the largest * disk centered at the pole contained within the footprint. We're helped * here by the fact that u, when based at the tip of the center vector c, * always points in the direction of the north pole. So for north pole * caps, we simply increment rows 0 through the row corresponding to c+u. * * For south poles, the vector c-u is the closest point in the footprint * to the pole, so we increment that row through the final row. */ static void cap_pole(CartesianCoordinates *pc, CartesianCoordinates *pu, CartesianCoordinates *pv, int current_projection, grid *g, int special) { SphericalCoordinates point; int grid_index[2], left[2], right[2], bottom, i, j; const double dphi=PI/g->height; if (pc->z > 0.0) { /* Cap covers north pole. */ circle_point(&point, pc, pu, pv, 0.0); intensity_index(grid_index, &point, current_projection, g); if (debug) { fprintf(stderr, "North pole cap: begin %d, end %d\n", 0, grid_index[1]); fprintf(stderr, "Size of cap: theta=%f.2\n", point.theta); } for (i = 0; i < grid_index[1]+1; i++) { if (debug) fprintf(stderr, "row %d ", i); intensity_edges(left, right, &point, current_projection, g); if (i == 0 && right[0] <= left[0]) right[0] = left[0] + 1; if (debug) fprintf(stderr, "columns %d to %d\n", left[0], right[0]); for (j = left[0]; j < right[0]; j++) { increment_intensity(i,j,g, special); } point.phi += dphi; } } else { /* South pole. But u still points towards north pole. */ circle_point(&point, pc, pu, pv, PI); /* t=PI gets point on other side */ intensity_index(grid_index, &point, current_projection, g); /* of south pole. */ bottom = g->height; if (debug) fprintf(stderr, "South pole cap: begin %d, end %d\n", grid_index[1]+1, bottom); for (i = grid_index[1]+1; i< bottom; i++) { if (debug) fprintf(stderr, "row %d ", i); intensity_edges(left, right, &point, current_projection, g); if (i == bottom - 1 && right[0] <= left[0]) right[0] = left[0] + 1; if (debug) fprintf(stderr, "columns %d to %d\n", left[0], right[0]); for(j = left[0]; j < right[0]; j++) { increment_intensity(i,j,g, special); } point.phi += dphi; } } } /* * Given spherical coordinates on unit sphere, compute area-preserving * sinusoidal 2-d projection. Map is (1,theta,phi) -> (theta*sin(phi), phi). * proj[0] in [-Pi, Pi], proj[1] in [0, Pi]. */ static void project_sinusoidal(double proj[2], SphericalCoordinates *point) { proj[0]=point->theta*sin(point->phi); proj[1]=point->phi; } /* * Given spherical coordinates on unit sphere, compute "area-preserving" * rectangular 2-d projection. Map is (1,theta,phi) -> (theta, Pi/2 * (1-cos(phi))). * proj[0] in [-Pi, Pi], proj[1] in [0, Pi] with phi=0 corresponding to * y=0. (dA on sphere = 2/Pi dx dy) */ static void project_cylindrical(double proj[2], SphericalCoordinates *point) { proj[0]=point->theta; proj[1]=HALFPI*(1.0-cos(point->phi)); } /* * Given spherical coordinates on unit sphere, compute unprojected * rectangular 2-d projection. Map is (1,theta,phi) -> (theta, phi). * proj[0] in [-Pi, Pi], proj[1] in [0, Pi]. */ static void project_unprojected(double proj[2], SphericalCoordinates *point) { proj[0]=point->theta; proj[1]=point->phi; } /* * Given spherical coordinates on unit sphere, compute spherical * globes, two to a rectangle. Map is (1,theta,phi) -> (theta, phi). * proj[0] in [-Pi, Pi], proj[1] in [0, Pi]. */ static void project_spherical(double proj[2], SphericalCoordinates *point) { if (point->theta < 0) { proj[0] = -HALFPI + HALFPI * sin(point->theta + HALFPI) * cos(HALFPI-point->phi); } else { proj[0] = HALFPI - HALFPI * sin(point->theta + HALFPI) * cos(HALFPI-point->phi); } proj[1]=HALFPI*(1.0-cos(point->phi)); } /* * Given lat/lon coordinates on sphere, compute area-preserving * sinusoidal 2-d projection. Map is (lon, lat) -> (lon*sin(90-lat), 90-lat). * proj[0] in [-180, 180], proj[1] in [0,180]. */ void project_latlon_sinusoidal(double proj[2], LatLon *point) { proj[0]=point->lon*(cos(DEG_TO_RAD*(point->lat))); proj[1]=90.0-point->lat; } /* * Given lat/lon coordinates on sphere, compute "area-preserving" * rectangular 2-d projection. Map is * (lon, lat) -> (lon, 90(1-cos(90-lat))). * proj[0] in [-180,180], proj[1] in [0,180] with lon=0 corresponding to * y=0. (dA on sphere = 2/Pi dx dy) */ void project_latlon_cylindrical(double proj[2], LatLon *point) { proj[0]=point->lon; proj[1]=90.0*(1-sin(DEG_TO_RAD*(point->lat))); } /* * Given lat/lon coordinates on sphere, compute rectangular * unprojected 2-d projection. Map is (lon, lat) -> (lon*sin(90-lat), 90-lat). * proj[0] in [-180, 180], proj[1] in [0,180]. */ void project_latlon_unprojected(double proj[2], LatLon *point) { proj[0]=point->lon; proj[1]=90.0-point->lat; } /* * Given lat/lon coordinates on sphere, compute spherical globes * on 2-d projection. Map is (lon, lat) -> broken into two hemispheres. * proj[0] in [-180, 180], proj[1] in [0,180]. */ void project_latlon_spherical(double proj[2], LatLon *point) { if (point->lon < 0) { proj[0] =-90 + 90.0*sin(DEG_TO_RAD*(point->lon + 90)) * cos(DEG_TO_RAD*(point->lat)); } else { proj[0] = 90 - 90.0*sin(DEG_TO_RAD*(point->lon + 90)) * cos(DEG_TO_RAD*(point->lat)); } proj[1] = 90.0*(1-sin(DEG_TO_RAD*(point->lat))); } /* * Compute the left and right edge points in the projection map at the same * height as the projection of a point given in spherical coords (r, theta, * phi). * * left, right[0] = x (row) position * left, right[1] = y (column) position */ void intensity_edges(int left[2], int right[2], SphericalCoordinates *point, int current_projection, grid *g) { SphericalCoordinates temp; temp.r = point->r; temp.theta = PI; temp.phi = point->phi; intensity_index(right, &temp, current_projection, g); left[1]=right[1]; left[0]=g->width-right[0]; } savi1.6.0/src/axes.c0000644000175000017500000000260014423445060013326 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * axes.c * * $Id: axes.c 8 2019-01-24 04:33:00Z lloydwood $ */ #include #include "constants.h" #include "gv_utils.h" #include "globals.h" #include "savi.h" static unsigned int axes_geom_exists = FALSE; /* * axes_on_cmd * * Display axes in geomview */ char * axes_on_cmd(int argc, char *argv[]) { if (axes_geom_exists) return EMPTY_str; axes_geom_exists = TRUE; gv_start(); gv_create_geomh("Axes", "axes_h"); gv_stop(); return EMPTY_str; } /* * axes_off_cmd * * Deletes axes in Geomview */ char * axes_off_cmd(int argc, char *argv[]) { if (!axes_geom_exists) return EMPTY_str; axes_geom_exists = FALSE; gv_start(); gv_delete_geom("Axes"); gv_stop(); return EMPTY_str; } savi1.6.0/src/Makefile_defs_cygwin840000644000175000017500000000645214423445060016430 0ustar lloydlloyd# # Makefile_defs_cygwin # # Definitions which work for a Win32/cygwin system running Insight Tcl 8.4. # Insight Tcl/Tk was replaced in Cygwin October 2011 by a more conventional # unix port. # # If you still use Insight Tcl and haven't updated, use this: # make ARCH=cygwin84 # in top-level directory. # # http://www.cygwin.com/ # Originally ported by Matthias Foehl # # Always run make ARCH=platform from the top-level savi directory. # # Cygwin needs to have installed from Setup: # under Devel: # binutils # gcc-core and its dependencies # make # zlib-devel (optional, requires editing flag in src/Makefile) # under Libs: # tcltk # under X11: # libX11-devel and its dependencies (lets Tcl/Tk files compile) # # X11 binaries are only needed if Geomview is installed. See: # http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/building-under-Windows/ # # You may also need to alter the name of the tclsh # executable set in ~savi/tcl/Makefile # only if running a much older version of Cygwin. # # TK_LIBRARY = /usr/lib/tk8.4 # # $Id: Makefile_defs_cygwin84 10 2019-01-24 04:47:40Z lloydwood $ ######################################################## # # # Set machine type -- suffix for savi # # # ######################################################## MACH = cygwin ######################################################## # # # set CC to an ANSI C compiler # # # ######################################################## CC = gcc # override line terminator for version.c creation LINEEND = ######################################################## # # # set TCL_INCLUDES so that the compiler can # # find the tcl.h and tk.h # # # # If tcl/tk is installed in a standard place # # it is not necessary to set this. You may need to # # change the numbers to match your version of tcl/tk. # # The numbers in the topmost savi script should also # # match. # # # ######################################################## TCL_INCLUDES = ######################################################## # # # set TCL_LIBS so that the compiler can find # # libtcl.a and libtk.a. Alter to suit - see above. # # # ######################################################## TCL_LIBS = -ltk84 -ltcl84 ######################################################## # # # Set OTHER_LIBS so that any other stuff needing to # # be linked in will be! # # # ######################################################## # -lz is for gzip compression library http://www.zlib.net/ # used for compressing textures to Geomview. OTHER_LIBS = -lz # OTHER_LIBS = -static # -ldl savi1.6.0/src/main.c0000644000175000017500000004144714423445060013326 0ustar lloydlloyd/* ***************************************************** * * SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), * Patrick Worfolk (worfolk@alum.mit.edu) and * Robert Thurman. * * Copyright (c) 1997 by The Geometry Center. * Also Copyright (c) 2017 by Lloyd Wood. * * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * main.c * * $Id: main.c 190 2023-04-02 03:52:19Z lloydwood $ */ #include #include #include #include #include #include "utils.h" #include "constants.h" #include "coverage_vis.h" #include "globals.h" #include "sats.h" #include "savi.h" #include "tcl_utils.h" #include "gv_utils.h" static unsigned int check_env_vars(void); static void decode_cmd_line(int argc, char *argv[]); int main(int argc, char *argv[]) { char buf[] = "main(update)"; /* decode command line */ decode_cmd_line(argc, argv); /* initialize geomview if started as a module */ if (geomview_module) { if (!gv_stream_init_proc()) { error("could not open pipe to Geomview; savi is now running standalone."); geomview_module = FALSE; } else if (!gv_init()) { error("could not initialise Geomview (main: error in gv_init)."); geomview_module = FALSE; } else { GV_BINARY_FORMAT_AVAILABLE = gv_init_proc(); } } if (!check_env_vars()) { error("edit and run the savi wrapper script in savi's directory to set locations."); } Tcl_FindExecutable(argv[0]); interp = Tcl_CreateInterp(); /* initialize Tcl interface */ if (!tcl_init(interp)) { error_and_exit("could not initialise Tcl (main: error in tcl_init)."); } /* initialize Tk interface */ if (!tk_init(interp)) { error_and_exit("could not initialise Tk (main: error in tk_init)."); } /* load up a single satellite */ if (!first_filename) { satellite_init(); } /* initialise satellites */ sats_init(); /* and update interface */ if (!tcl_script(buf)) { error_and_exit("is SaVi compiled correctly? " "Edit savi startup scripts to set locations."); } /* loop until exit */ while (sats_update() && tk_update()); Tcl_DeleteInterp(interp); exit(0); } static unsigned int check_env_vars(void) { unsigned int all_env_found = TRUE; if (!getenv("SAVI")) { error("$SAVI was not set to location of savi directory containing launch script."); all_env_found = FALSE; } if (!getenv("TCL_LIBRARY")) { error("$TCL_LIBRARY was not set to location of directory containing Tcl."); all_env_found = FALSE; } if (!getenv("TK_LIBRARY")) { error("$TK_LIBRARY was not set to location of directory containing Tk."); all_env_found = FALSE; } return all_env_found; } static void decode_cmd_line(int argc, char *argv[]) { unsigned int unknown_parameters = 0; unsigned int skipped_filenames = 0; unsigned int more_filenames = 0; unsigned int special_flags_done = 0; unsigned int length_filename = 0; char temp_buffer[LENGTH_STRING_BUFFER]; char temp_switches[LENGTH_STRING_BUFFER]; char *switches = temp_switches; char *command_line = command_switches; char *script_filename = NULL; FILE *script_file = NULL; int give_version = FALSE; int give_help = FALSE; int coverage_large_map = TRUE; int coverage_map_type_set = FALSE; int not_fake_geomview = FALSE; int levels_error = FALSE; int levels_format_error = FALSE; int orbit_model_unknown = FALSE; int map_longitude_error = FALSE; int map_format_error = FALSE; int map_view_error = FALSE; int map_view_height = 0; int min_transmit_altitude_error = FALSE; int max_transmit_altitude_error = FALSE; int length_savi_name, length_switches; unsigned int i; int can_use_zlib = capable_of_compression(); for (i = 1; i < argc; i++) { /* argv[0] gives name of binary, not wrapper script */ if (strcmp(argv[i], "-geomview") == 0) { not_fake_geomview = TRUE; geomview_module = TRUE; } else if (strcmp(argv[i], "-fake-geomview") == 0) { geomview_module = TRUE; fake_geomview_module = TRUE; } else if (strcmp(argv[i], "-debug") == 0) { debug = TRUE; } else if (strcmp(argv[i], "-help") == 0) { special_flags_done++; give_help = TRUE; } else if (strcmp(argv[i], "-large-map") == 0) { if (coverage_map_type_set) { error("Large map now? Another map size was already chosen."); } coverage_large_map = TRUE; coverage_map_type_set = TRUE; } else if (strcmp(argv[i], "-small-map") == 0) { if (coverage_map_type_set) { error("Small map now? Another map size was already chosen."); } coverage_large_map = FALSE; coverage_map_type_set = TRUE; } else if (strcmp(argv[i], "-all-maps") == 0) { coverage_all_projections = TRUE; } else if (strcmp(argv[i], "-dynamic-texture-with-map") == 0) { geomview_texture_with_map = TRUE; } else if (strcmp(argv[i], "-gzip-compressed-textures") == 0) { geomview_compress2_textures = FALSE; } else if (strcmp(argv[i], "-uncompressed") == 0) { geomview_compressed_images = FALSE; } else if (strcmp(argv[i], "-no-logo") == 0) { geomview_logo = FALSE; } else if (strcmp(argv[i], "-redrawn-menus") == 0) { buttons_menu = TRUE; } else if (strcmp(argv[i], "-version") == 0) { special_flags_done++; give_version = TRUE; } else if (strcmp(argv[i], "-splash") == 0) { splash_about = TRUE; } else if (strcmp(argv[i], "-sun-lighting") == 0) { geomview_sun_lighting = TRUE; } else if (strcmp(argv[i], "-verbose") == 0) { geomview_oogl_verbose = TRUE; } else if (strcmp(argv[i],"-levels") == 0) { if (++i < argc) { if (sscanf((char *) argv[i], "%i", &NUM_COLORS) == 1) { if ((NUM_COLORS < 1) || (NUM_COLORS > 29)) { NUM_COLORS = 0; levels_error = TRUE; } } else { levels_format_error = TRUE; i--; } } } else if (strcmp(argv[i],"-orbit-model") == 0) { if (++i < argc) { if (strcmp(argv[i],"J0") == 0) { orbit_model = J0; } else if (strcmp(argv[i],"J2") == 0) { orbit_model = J2; } else { orbit_model_unknown = TRUE; i--; } } else { orbit_model_unknown = TRUE; } } else if (strcmp(argv[i],"-map-view-middle") == 0) { if (++i < argc) { if (sscanf((char *) argv[i], "%i", &coverage_display_center_longitude) == 1) { if ((coverage_display_center_longitude < -180) || (coverage_display_center_longitude > 180)) { coverage_display_center_longitude = 0; map_longitude_error = TRUE; } } else { map_format_error = TRUE; i--; } } } else if (strcmp(argv[i],"-map-view-height") == 0) { if (++i < argc) { if (sscanf((char *) argv[i], "%i", &map_view_height) != 1) { map_view_error = TRUE; i--; } } } else if (strcmp(argv[i],"-min-transmit-altitude") == 0) { if (++i < argc) { if (sscanf((char *) argv[i], "%i", &min_transmit_altitude) != 1) { min_transmit_altitude_error = TRUE; i--; } } } else if (strcmp(argv[i],"-max-transmit-altitude") == 0) { if (++i < argc) { if (sscanf((char *) argv[i], "%i", &max_transmit_altitude) != 1) { max_transmit_altitude_error = TRUE; i--; } } } else if (strncmp(argv[i],"-",1) == 0) { unknown_parameters++; } else if (!script_filename) { if (NULL == (script_file = fopen(argv[i], "r"))) { skipped_filenames++; } else { script_filename = argv[i]; fclose(script_file); length_filename = strlen(script_filename); } } else if (!more_filenames) { error("already found specified file. Ignoring any additional filenames."); more_filenames++; } } if (!can_use_zlib) { /* turn off all compression flags */ geomview_compress2_textures = FALSE; geomview_compressed_images = FALSE; } if (give_version) { fprintf(stderr,"\n%s\n",Version); sprintf(temp_buffer," -version"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } if (unknown_parameters) { if (unknown_parameters == 1) { error("Unknown flag passed to SaVi."); } else { error("Multiple unknown flags passed to SaVi."); } give_help = TRUE; } if (give_help) { error("supported command-line options when SaVi is run standalone include:\n" "savi [-large-map] [-small-map] [-levels ] [-all-maps] [-fake-geomview]\n" " [-map-view-height ] [-map-view-middle ] \n" " [-max-transmit-altitude ] [-min-transmit-altitude ]\n" " [-orbit-model ] [-redrawn-menus] [-debug] [filename]"); error("further flags become available when SaVi is run from Geomview:\n" "savi [-geomview] [-dynamic-texture-with-map] [-gzip-compressed-textures]\n" " [-uncompressed] [-verbose] [-no-logo] [-sun-lighting]"); error("other useful flags:\n" "savi -help repeats this help information at the command line.\n" "savi -version provides version information at the command line.\n" "savi -splash shows copyright and version information in a window.\n"); sprintf(temp_buffer," -help"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } if (special_flags_done && (special_flags_done == argc - unknown_parameters - 1)) { /* * exit only if only help or version information was requested, * but continue if they were requested along with any other valid flag. */ exit(0); } if (skipped_filenames) { if (skipped_filenames > 1) { error("couldn't find multiple files passed as parameters."); } else { error("couldn't find file passed as parameter."); } } if (script_filename) { first_filename = script_filename; /* * Only display filename if multiple filenames given means ambiguity. */ if (skipped_filenames || more_filenames) { error("loading specified file:"); error(script_filename); } } if (!geomview_module) { error("For 3D visualization, run from within Geomview."); if (!geomview_logo) { error("logo control is for Geomview."); geomview_logo = TRUE; } if (geomview_texture_with_map) { error("dynamic texture mapping only under Geomview."); geomview_dynamic_texture_flag = FALSE; geomview_texture_with_map = FALSE; } if (geomview_sun_lighting) { error("sun lighting control is only in Geomview."); geomview_sun_lighting = FALSE; } } if (fake_geomview_module) { if (!not_fake_geomview) { error("Enabling all features that normally require Geomview."); sprintf(temp_buffer," -fake-geomview"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } else { error("-geomview overrides -fake-geomview. Waiting for Geomview."); fake_geomview_module = FALSE; } } if (geomview_oogl_verbose) { sprintf(temp_buffer," -verbose"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } if (!can_use_zlib) { error("compiled without zlib compression."); } if (levels_error) { error("Only 1 to 19 levels of color shading are supported."); } if (levels_format_error) { error("format is -levels . Default is 4."); } if (NUM_COLORS) { if (NUM_COLORS == 1) { error("one level of color shading selected for all coverage."); } else { fprintf(stderr, "\nSaVi: %i levels of color shading selected.", NUM_COLORS); } sprintf(temp_buffer," -levels %i", NUM_COLORS); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } if (orbit_model_unknown) { error("unfamiliar orbit model. format is -orbit-model . Selecting J2."); } else if (orbit_model == J0) { error("selected J0 orbital model for classical mechanics."); sprintf(temp_buffer, " -orbit-model J0"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } else if (orbit_model == J2) { error("defaulting to J2 orbital model."); sprintf(temp_buffer, " -orbit-model J2"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } if (map_format_error) { error("format is -map-view-middle "); } if (map_longitude_error) { error("longitude given for middle of map view is invalid."); } if (map_view_error) { error("format is -map-view-height "); } if (min_transmit_altitude_error) { error("format is -min-transmit-altitude "); } if (max_transmit_altitude_error) { error("format is -max-transmit-altitude "); } if (min_transmit_altitude > 0) { sprintf(temp_buffer, " -min-transmit-altitude %i", min_transmit_altitude); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } else { min_transmit_altitude = -1; } if (max_transmit_altitude > 0) { sprintf(temp_buffer, " -max-transmit-altitude %i", max_transmit_altitude); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } else { max_transmit_altitude = -1; } if (buttons_menu) { sprintf(temp_buffer, " -redrawn-menus"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } if (coverage_all_projections) { sprintf(temp_buffer, "-all-maps"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } if (debug) { sprintf(temp_buffer, " -debug"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } if (coverage_custom_height_valid(map_view_height)) { Image_Height = map_view_height; Image_Width = 2 * Image_Height; fprintf(stderr, "\nSaVi: coverage map sized to %i by %i pixels.", Image_Width, Image_Height); sprintf(temp_buffer," -map-view-height %i", map_view_height); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } else if (coverage_map_type_set) { if (coverage_large_map) { Image_Width = IMAGE_LARGE_WIDTH; Image_Height = IMAGE_LARGE_HEIGHT; error("large default map size selected."); sprintf(temp_buffer," -large-map"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } else { Image_Width = IMAGE_WIDTH; Image_Height = IMAGE_HEIGHT; error("small default map size selected."); sprintf(temp_buffer," -small-map"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } } if (coverage_display_center_longitude) { sprintf(temp_buffer, " -map-view-middle %i", coverage_display_center_longitude); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } if (geomview_module) { sprintf(temp_buffer, " -geomview"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); if (geomview_texture_with_map) { sprintf(temp_buffer, " -dynamic-texture-with-map"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } if (!geomview_compress2_textures && geomview_compressed_images) { sprintf(temp_buffer, " -gzip-compressed-textures"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } if (!geomview_compressed_images && can_use_zlib) { sprintf(temp_buffer, " -uncompressed"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } if (!geomview_logo) { sprintf(temp_buffer, " -no-logo"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } if (geomview_sun_lighting) { error("buggy sun lighting positioning enabled under Geomview."); sprintf(temp_buffer, " -sun-lighting"); sprintf(switches, temp_buffer); switches += strlen(temp_buffer); } } length_savi_name = strlen(argv[0]); length_switches = switches - temp_switches; /* leave room for terminator */ if (length_savi_name + length_switches < LENGTH_STRING_BUFFER - 1) { sprintf(command_line, argv[0]); command_line += length_savi_name; if (length_switches) { /* presumes selected switches are of controlled length less than buffer */ sprintf(command_line, temp_switches); command_line += length_switches; } } /* leave room for terminator */ i = length_savi_name + length_switches + length_filename; if (script_filename && (i < LENGTH_STRING_BUFFER - 1)) { sprintf(command_line, " %s", script_filename); command_line += length_filename + 1; } /* terminate the string with null char, however long it is. */ *command_line = 0; } savi1.6.0/VERSION0000644000175000017500000000004214423445445012510 0ustar lloydlloyd1.6.1 development (30 April 2023) savi1.6.0/manual/0000755000175000017500000000000014423445060012712 5ustar lloydlloydsavi1.6.0/manual/Makefile0000644000175000017500000000141114423445060014347 0ustar lloydlloyd# # Makefile - savi manual directory. Run top-level Makefile instead. # # $Id: Makefile 8 2019-01-24 04:33:00Z lloydwood $ SUBDIRS = images SHELL = /bin/sh RM = /bin/rm -f OTHER_SRCS = index.html all: @$(MAKE_SUBDIRS:target=all) clean: @$(MAKE_SUBDIRS:target=clean) $(RM) *~ $(CLEAN_FILES) tarfilelist: @$(MAKE_SUBDIRS:target=tarfilelist) @srcs="Makefile $(SRCS) $(OTHER_SRCS)" ; \ for i in $$srcs ; do \ echo "$(CURRENT_DIR)/$$i" >> $(TOP)/fileslist ; \ done # macros MAKE_SUBDIRS = \ dirs="$(SUBDIRS)" ; \ for i in $$dirs ; do \ (cd $$i; \ echo "making" target "in $(CURRENT_DIR)/$$i..."; \ $(MAKE) $(MFLAGS) target CURRENT_DIR=$(CURRENT_DIR)/$$i TOP=$(TOP)) ; \ done # END savi1.6.0/manual/images/0000755000175000017500000000000014423445060014157 5ustar lloydlloydsavi1.6.0/manual/images/savi-tle.png0000644000175000017500000000770414423445060016421 0ustar lloydlloydPNG  IHDRxBsRGBgAMA a pHYsodYIDATx^ pUrH$p߇ SN  Ga`A B9Cu/\-=b9=5ILO2u4=zrӉ대9\9Uڳ<"""r&` ;n2G4Y-'"*)|AY-|g_c#"ǰX,+oe#"prbu10X,b#"GacX,ŀGDO3gθZ+..NN>j(e%K \mX,VY^o8hz \JdT,-8mWRcd֓^R;2Z:c箤/) c?/[)/??_\mbX. 䜍EBպVJvj2oo:VnE^ZuhπWM-[JxxʵkT_FFILL$$$-0΂ $))IZnֻrCݻW \5|pٿu*b B 4L4mEno*#3b0Bٔn}GIjyjV^Lz^(Mw]xGkJF>1W=?T^S^(c:.=XOA߀w!WKd钝j>XZqp={x=gϞunbXe] xA[_ e栄3lKzxVJpy^=܊~[%P&3xގ7pV{Z'%&&f.eX\pAܹz>dq9iܸz2bXe] xA#c&u{tPոUd-cwIKag'Dqv=4+ x_yuߟw GSj}^܏7. xS3vuԑM6y\qVX!M6HP˗Uիe5bu1!}"w0}iK0wex `[,oֶYZbę/fV/]UhMha+hy xT߃x!O TEo'ldbXe] xD(,Y".]rbXe] xD(X,x,b#"GFD1|<""ɀGDA[#""0Q Y}w H#"""GDDDT03 ȹ<""""rbjrjE""""r<"""rgC(ؘ?DD: MKÇj9Kqc#a#" ] x00.<{qB= x8 xDDש#|X#S_9Y݋|_׏zԏm(Q. R7:^d$aKM]'6=Tm;h"=ڣ6B6vs-Ӡ#}xfQ'l9TQK{z|rղ?sskIs] x?$w4Q-Z rT:4oD\7gBqo! s}a#" ]'lT\ 9׹9,S}3Ju=B:\rt'>GP`cWd3Lb.UZe𼍩1ӼyuQmE;U]=t4c 3"?}vĬuO=q7+5nQ'd׹9<#6Up#$^ch=cok_3xMef9k6^sX\~SScÛkg,xSc-?vvUmK}<\vF?ý=z&Poq~nU O.yZpu{skisApaBᨺXS)Ό/>JT@;yu.)g0)1WxHo ?o,wHJ蛘X]{?1 xv?\Zڜ`GP=Ro̙  \p=3T;  ?/OF' P9ybAAM PAf#$ B͢G1B  bAAY PAfakWիgd§w>]dmn۔O<0ӮydOunS/lue~@s^! n]#M25jL.[>-l= _4[o=ڴkoq%1P5jܔntrr7~ }-G?Tǖ?z*1<͎c^yU:7mQlW|PS_NSfA<\yc{v{\0-K0F(W+/quB&Cum7x:y}W3gTzr9.iܱ}6hP=~t<?gZ3DVARm;8T}}Us)f Q;k*^ 10'lM:AФD QۘHc5S `= }"T8]ׯГy6*=&s^xIm#D˱燜nt㓟)sMm?)cS]A x„Jv!hzp9;T~K?QoiV_$$! cin[c-kИҁn{z!z1u>Bt!D[TԧX\5nϿ)D<,xfYc O!қnzKc0qWK'PO(do86^]EP$5Bcg8~D6B=ns=x1&y V?WA̡FMEK1=[m҅9{]mfPƴklKy5OT{e5 ~ l@߀ۍ|I@{Ԁ? <>1&%_;63iǡ:uܜ4lL=DW:'GtI.GC91]:menO6#/Mk7`h߱˞&<I'-*U&Cb2kRe5 XFU2O 8_5!|wDcb_4︅ھh O>PgQGs^r'au]zU>8vBiѹPw҅X~-XMI#Fn uJPjRdB-F(`5_5>?>4h7<)͹Ujզzݣx>bRngU}㓟 wm~u)(T? Zݠ2:A#~"tsAFzW߰l9#r4iנCwvHnO=_>y]c_]ʣa|BPUҢ_>2@TF(i-E}O4yllvs}4w\3Gh}r3>Eo=/MklKy5LOlJJXԫ]C8*4B&+_L^wǯȶ~Yߣ}R!#rϽ5j޲z-G6lQ=5Zsu裧.L5;/QW1M>2)ʽhׂǦq%T.5itGhAK<;h2;3fPKriTcȣrQotO偧G|mL&s_f}$Jx I)TEYJq&TO #=DS>d<'QLO |ԋN/q'TbWdxzԦ}''SAb|ByR.*2C FbpڥwQm0M>!=T 21Z x4䤩 ;ȿJb h1BJbP_*H{l恐h1BHK UJpU6b3'ICbuz*T3 hm^|E1BIC^ ꨩ LIRTn)@#$1M>**LBS 2[SvyiMӼAF/KmKo344kI[ 1m!? 5mx76ܓZj#קx,6Gm_d-uju2'ē MSUYi5#85mn}j~S5i*͹U;4|ijQ0]cF;lڍyИCR#tҙWݿNZ4$U]2@c*DeO 1kOB<5m<7o-O;첿27 HGtIGC9Qmyle/YwDL&_JH:nN\h.{n>Xq0sC >ΰf-Z'Icc;Jc;:wF?f|՞ eu06hm׿1,vڛΚ-yNNn.=y f-7T׭|GjԤv…*O}wRY+hc^+KPO:l^]~닪|/:vEW:]쏁IiDs~EOt~CLѵE4htsBF(Z4|*u:P/m!*K_?j^c~!#wM-a|O$Q/5sc'moB>5mc0E:w2 q/:/<1,ǜ w3BxYþ6Bxiܴ6 MeŁ4xBԹ`њ> ֱREwGz;Ө[5Bq'$_0R5AO uSIe:*Y8'd@i#t7^M+*t -^l.o};'B0a#OtcDMe&Eh'{\=U“&:x ~76t3N`p;&\N[l=-z#⌥EP5i:ITMdܗVc4|#?~O}0a!/^5i"z|،'.08Wa SsqFfUt{!|?ԫ\ZSYO-}-~݆vtQg7_eRP>|Fhܯ/nE'C0i8#ţFhҔ9C覧Tu0MZ&U}j{KOMAi#`x~|fp,CGw <~1֦}':E8gԹ5nJ}﮾瀩,<c??c/L~uWȏ6BKVNv;P _ha~z% aP 34Bq|kU\Šz$K! 8|T^JKoyY Fk#K/զt.mLe5(HX*>R 2Sn#MJYPZLVpUjꐠQ酱HEZT9}Oil& Ӽ%z LpU*OP,1}J_Qj>0Z1Z x4:JeAC bJԠJlq--FHFRIluhm&_]E,X(۱| mYIa,'ii^e gL. u,;*H3Q[E>T!JN Fk#C 4.J\Dz*d:峎ƸkM.?O1B+*| Zd DŽO S YWmy_@#$1M-8(7AZV(,S}AZ±]_W@FW^#$>0MjUl. ]nrGs ILq.Ы*FH|`|Ռ/,冕 XIWr+Aj{6̇$m2Ńj1Z^{M 4/&eUHSIIeL&1Ńj1Z x4- (ϡ̰4Ab)]rJoir#m1Ņj1Z_vЭk:6hjب mNYwD7]縉 -zmGZ݆OR4emIQf-y6Ðt]X'u UwwBێ敯V0G5UE9UMHﳌZR)3sŵP F v*h4GާGL翧}wׯwҶۤ sn۴4W3չcΧA{K?PҨISi=ҼߡNͺQ%8RĨia3:t+<Lp`ν1Z'y hZ!<-兕 J _T=018o\`b6BoFF.y^FN:vB^ ̢me`8:meny&{ G;`VpCn\1v_pZ0n!ǫSaCoAFtsv!~VF/R>L:'?Kfٚ闿se&`ʔV54xJӥg?:sJu|}^vλ!v4[ذ]GcZ!< -iaսti" Cr”[Oy*bt}ot.9nipN#?\SN+ek_X3C ͒՟z믯{ 5Bv)WܓFI cZ4*?r(O+^@:4^Jq/rO׺e5п5Bxɹk+0!w:CMP |f5OƛuKo>;nP&jh`Λdn q7j,ītr(ˡ7>$OA]/~',Sh>|A\|z*}tcZԷ= ?~2/d0`q?3z?TK5q`L)3LR9У, , d̫ޯjT9\i#јG9kA#sѦ]{oZ``il_<:7'ÃUpڔV54S¿G4pkvۉ3Tr (ǡ,( JcQJ38%?uQJ/2C\O5+K L)Z2AIK-TIFP FϘ&_S0G9eAI d WTIy#f(=zw L)Jx V>Q%ٯ2 b6B!AiU \9nPTnF&%"{J_b-FH0MJ#,G&ȹ1re‡Lh)"v%>bʥ+h1B+7\9ir]K*$ gL\peh%1AIz- S*Uy/z2u[) FϘ&_9iaU>\#]4ZT~I&뵥2C.}[ Fk#&_9|? MQZJ>'Na.sK1Z x4J GNAYT.T.}ZLF._=OR/kS>-7b3WJ8r 2j4A.YLF|kc I\3Th1B+%rZ8k9+"n_SuJ[NiPIJNi$urf.ݗ1Z!?]O&_`Cf\1NIDB)SaʡN:6R!t? hmy1B++g ,B.XHI•./L%Kc$I]\shܺ~,bW lC0AI89t9aI$/p 1p*5w}b?T-&ȥL..eRmKcǵ.׹GK_A#$1M>p!1AI+Jvw1Z e@#$1M>؊7#LPRR:_yW|GZ&O\Ǟp+b3 ؁ n|*+ײ]s2C qg1Z x4|a+vd !r,]L}nɵ΅K3Z~K#? ˥l:Un؊,7#Mn˵K3Z~Lw~RK}M:>+XB 4҆#vpeu r gVaqzt^iD@[ikҼ\橖K.װ=:> b!Ai򥍭7*C _TF|VzkΨ1NXsK4:I>ܹK.c-f{8uT2Xޭtȫ`MQg^]ڬku1;ƹ]KR׭v0jG녏RxȦn e'¦C+z,l@؋'iE(~Owjɽ=N1[pb4I*FF6FŏBʷ [j~Hg^u1P&_؊HyC]˶n$ZnXb@/d9OOe!qmX.eraf[8 9_ FW.= 3cdNNڤsOjҬ% }$-x=uaqmܙ>\zJo֝lC:Z?f|jqsjа1z]yx{"TYwDL&_J=GsׅIJw0 ?TjѪfg[Ըisw\Bmw ͞MCٝ^zi쎅geӺfn0=_\RTIK-z\{(|]FOW}H-/z:̽5jڼ}ô豏hia)D(2 ,ZCsyUc-k6hАΛ$]u͞oz5WI&.?z)&ȼz;huY6m?ɓgFD9_#G쳙caO<-ݫѫ!N5B=F4vlv'Eec/&RfSpK3Bo4':xm$<*tGC9"7Jg.W ?^-8BDI!FF(< oz#NK7w1B]a?BY)x`@ٳSFiod%lTd„6{6 cv`ӷj&cJ73D2O ?vۨkW|WN6Bqylw_4ezc8cd8G2neq_f8u ǿ4AJ#owl5hcӮK S_}`{7Y}#4gU}f 4em/8Ȉ\̰+Ĥk#Qg]:posm#N4+P2 K?Z( ]we>֋ x3uj: C~]5#z݌:`HZ7t_bY+T}2՘[ak#We;=Xգ6;ҬC(i%V`Ȼ&{  uY#oq֬Q9aAǷ7Q#4}u^̉P۶O˗gu}5?A+.SASQ{,zFLoYQS?҆@ZW w?x'3N ֢E5Gad:fRHE8+&\MSJO FW*@KX/ F/BTd#7|(ݽ{µkG2/>! OXN?=!2/*m1"s݌Сmfv\"<"Ol>$?/| 2!}?@N/w_"ş;:svf$j,ڵ-6 SZ(iMZyqm/CM Fbp-G;犭X2E ͕o^ŋ3ysRFd OFWﲩg̓|_3eù]vCk;F]BM|I}k*~"W}~A'p~L=yuj&ZoP]Hoplcp=uISak0q6F*gkqMϚ̘©K8bt*FHr4\+1dT/\Ѳ6kmn?r󅄏׮Xs>ϩkt? )Il a|֑m,ũG8b!Ai`+Vpc q! 7=dczr)δatݸ‡P#P1ʵ6bѵnas8nz1 b3炭8%8Q\ ȪG i̭eȵ=a[nɼtUm3{/۵^qqMǞV8.&1Z x4؊Bf06~n@([/H/~'*[L.mFho{:&\7 "n~cSN=t$1Z x4؊rHkJ/OBeD6_ ɇ*܏z;_Xm~DD;҆b=ڏ2aI@#$1M>b3F'q*sGNhTl5ܶh2Az1+ImMroJrգs͸78ub8 FϘ&[+#_NC8kNh>ᅨ ێ,Zda}$q wF1'N; Vyc8 b!Aiq'xf7@x9p oJr(Zv-Rp gr@^6}i76pm=t$1Z x4l'g7+mƬ:!\rd+|t9QҐ)_['0CPxƉhlƠmpt1Z x4luBK/'Aq}aZ8X}5ZB m#rT:$?=\ʎ) ZO:716ITxb!Ai`+N 2n YL8u.q9$s D-#wyKGz1"FN}!S. FϘ& 2_ u,/ ACqׄQT(ӥqyowl yB 9}{-kX 2γ\і$km¥L5sNocXsl gLb7F6ܾ`G SzӢXH.u,$WZUn_\9ʳ1Z:燍!MVxo1Z x4a#Vд j` ҇m?hq!nb jٴF:4${]/:O 1.?9 FϘ&_ FqZ$m ܜ~X}^BܲLBZTwe S *4_Lsw\hY)΅-b3#h0+!׀bZt8uת$J/\pʊ3nm狞{9ua1Z x4'8f7 , 6B(VeU.UtU~eBzyg]SĩSrʏb Fb qy]U^wY+K‰3.n<'>N8le,A؋ Ƒ"@^'|[>n96cӿz"N}RΖk6 FßblTzԬt压+8A!4Q\A=h0e5m r/ J[[>듴]w1CEӇEhpTBȶެ`׶1Phi#sFhgփrxzLÏ8ZjKwݟ7mN c k 5iR]/7an9#4hrѹW`|Z=2BC_st촅ԥg?jvcu5_+4:h,m8 'hrҢl:@f㧚VJy|!NpNkcl"W7+]{[Uԡ ᕗN2.F(DZ &l`v.Yz#As}Mm_sߛԽ@:e1M(AƢXry4nu8>\⎛jVm-}!n>|i lc6 FWO\=Fh7PซZo阳Y8T+U~`˂E"<Ac|Qldahs &m4U5ZTv~GKϽLZBȺ/Bu-flۀ]F`h#Ϙ*r딋ow2B{:ZzkҴm.y9Omֵ5jܔߝ:5B~ y4jL}c_>/b#`ed Tmt ٶn wY8k\+IǡJ.tigr'myV(pOju-_8 gL/ď5@e~͓ XIl wMe7ŤZ_J^-[gF6mswlGƚٍB]m1Z x44yW u 8i}.R7o e_jUW~M\3|㔯!'q FϘ&FEi3|gnpϩ E˶_ ɵJPuw?r96oNZN21i8 gLOSLAٍT/0l*P*uP*i`'oI(ӥJRmpGnL7'mcmq_'F1Yq FϘ&“:؅{buŵ;*|S_ Mq$*n۫AIҟ86oN|̻b&D&be=u,T;h1BvyrM9yrZ NZ-XʥjR+^ssǝl9:Mn1Z x4Iр™AOl_{P91IkA9őΟ/%ɟۿr8m p-?.fض&ii]hm>1Ba <$]۲9A38(_LY:$yG!%ɓr8}?Nxi{PQWpB FϘ&Q`}+I ,'/#I q@X([V!/w˥9pҖ{q6ϸtјbP= ݅@F#$>0M>-_NaYPq2"SPn0p)!_M -n&!M)f.yp['q)߶/8eKcMuh h1B+fI_IA6 :A6-m#g''-daqˈ kʩr=9ep2Bi9ViBOlFCۣ FϘ&L ,lmp$.$۴>M>I:BizNsIگ[[JkpNz6FL6>b XvGA#$N< Â#\el ]6v!NZN!NZ8lISm^c\Bi9f'iǢ4ڝP6GAF#$>Nb< 2n$_W 6m6vC8j\c* GI-$}pӞi;Øu,dmB&6=wU&ze3fwL+$*k6m9 ٶ]7MoHwp'o۴}lMnw8)Zn!C6GA?I٨ZoY ڕ#$T;щg#c'ڈn3 h;Bz5ao$G%-åmZNiGnwwaq1$FAŌPhi#sǣF蘩]̓փ;_Vg;q*hՖzۙf.~O6}Nqނմymy6ciVo~;vбԬEkǘcgW/*_/;*Xv\d n9ysӇ~MJR)lGٶmOl뱐_WhlE{ Fk#1B0-}Ɲia#to yW}@ H{:Zι=ujjզ=] ePO?29wc^G[CqEQ.{_QgݯszhŽ϶ (*8D,rh 6?6mm8imq\HZr-gOi9NӞi9 bc-1:U#pa6LPђ՟ekk{Sm0 w kڇ<ΠaQjIOvzpA 5[^oo|n]2[˟&V\΃b*6ei[tiY lVqʇ!YuOiS6-gi00ѩ!v;P !~9MfPn}GMJ>7an9|e|Z=2CN[H]zm7ViatBt.= l'tav#^'qJ\\ml qRɵNM釴.dCMOlFE F{1Ba!kڼ rFhŖ۫W_?qRA0?,A={_S{tri= Bz_dpld6 6?t\\ۭMZpJ,/ɩm?]qj19m"T3Qq6B̡B7=%-x=eT!oΜR}/t)#k˨[tmQO`tBܜ0): 2nī\Arms!٦K͐mZ6C>BX/6eK}YcMxMcf8isԍTsF`FOa[ 6ëf,6B؞:!ڬkjԸ);͹Uu$\&T~C\O:N F$VB)Sz.7֕S.'x6q,ږAF衇JKނP'.$H2rYn{6TPF&q)6}lMiekZٲ~EeVhoTt e“F$V2rN{mz T6CmB\S-Ǥ$ypm9kB2O (aS1B &f^ b!Ap6AٍxI`5KkVtrOKƯYjoPF8 F g#ۉd݈VfKWl,W{dUnċ^ b!Ap6AٍxI`5KkmB+kVk8 F g#ۉd݈VI2~UkwjS1BĆ{ok^œ~V;KʅK֦wy u=md; j8iQOj^ b4I*FFqy/Y9-~EV>>yrwy u=ld; jV⤅|-ӬZkmW]1F(LMй퇟̺%w0 ?TjѪ-3\ uݟ7mNiRmhҼ;Y' q/ uv7s}tk3u~n.:t'BGmp Ҳ5_>wf,!T?zv"f7%լ^(6CH˩+7oY/8u_^xi1*zGǝs=-z#uUt7!B Og`ԓ>>G.By7jҌ;BZ/Sgߝֹ3CFaNG#WP g#ۉd݈ªKmN>R9d\6۶6qګAFi iI%_POa1w:燜@ G=p^!< ~ԺƴӰC+]# 􄳑D2nīV6,䛦t序i[6qګAFЙWu]4F誻NmwRUX8bK~-[эO~K# 􄳑u̯\JͶq۬ũC'.׶Pl8m FY#sͺF_c͹\:'}R8/WyT7Auȣf Տp6Aٍxqȴ\mMW Ľל[V9,$֬˅uuD5i.'e`+PeC!oN.r)ۼ9uqkVkl˅f bt*Fb^2Ig# mX.Jys%oN9yۦmdPC{ FbA(LxvBf7%,~T6C# ǩ>,yZ@) -FH<t6AٍxI-rm?,n9&%Ƀ{lԧ\cyZ@) -FH<t6AٍxZf(☊PF&q)6}lMiekZ9a g“F:0rBi]6C)S.7֕S.'xͶqζ\7 b!ALx:Y'A8mMkfGZŦLr>K}~MxMc&ms)[Y|_0b3Ig# d݈WAg]6ΊRʥn~Ayrjicڦ- RfJhsh1B𤳑uб̏ؖ :6J\\ml qRɵNM釴.Aner0b3Ig# dmM;fMv qʇ顸r~17mrƩm|OEDǂa g“V:4/N'ȺlӦfΊ^ŀ)}d4FH !~a gF2m:BiYt.⶝77}XNߤ$erQȶ_|vB~yڦK=J u@tS׉~Cz&1BPuD'e~Eɶlt9mZ8imqr$U\[H}ᤵ+=/jG5kFvm?zhEЂQϞD-[I{0BF9W޳[g8Jh1B&'#dgA7 :ɓ~q.N7[Ҕk[mZNɩgڱ(v^6Pu ^#j& B>/[@Q1Z x'e.]ׂZuD{ wϩG98dXg&:`#[W_%j'??M)Mن`x6؀3F(59ի ࣀ-tV1Z xA'e~i!(l Ik~-_JP)̹9ie>u]D:~-Mo? ̶^ntPڜl0Ch1B&O:Yxˆ|-:>z]kcmrE()XyI5v !O.ڜy"a@P1Z x&3+mlٶ*G /'-X6P:rjlcm\]&7|(ݽFh͚WfV}FΜZ̯(b3:Qld,em-G$nK4r=uM{Bi}`#tƿ#DtD-YBbźFeq_h(W4qU*Fb ?SAèIԼeapί~}1]d-ujcA(IAyVCF~yr qdaqˈ kʩr=9epHgGMkvƽb4I*FFqyԶ4jTsϫ4whh}ֵ?4\#tҙWoL#4le,!۲9Vi 2B7=/e<4TonlSmڴ&KbPݸc<=Oԓ"hδ1SSSփ;_VׄMDS/6S=qȠYwDL&_J=Gs*[_Jc;:w߆v>8uu3ܾ6?;[iͺ'd:://x4a#n_] '/3I q@X([V!/w˥9pҖ{q6O/'݅@ntaPa 75Z/9\{[At'U(稣I~56רiVtӢ>R4uFQft r?zI+ ywͼYe찛:諮UwZjK,Z-N[P']Y `#ڶQEX([V1\2w+3}ŕan@S.Ɵ|9uqy'aq,/T'VA2O8mɓ~_⌅\ʫ&%iKr5'}^h/F(LXqyxM=9WMLr{ O!i! ޏ++HsU9[mKwFN~h~+f, Ձi^hld=-C@ J>m!N:Z nz'Qq^ J&Ioyskوslmhwѩ!(\@Tqyf-Z?xM֤iOap)shMOg 2"N6BxUo]?1xi\+d->lk19^{!i'rEPDY; LQ>Y N7=PK4ҏ2FVǛ@iY-zq Fn dnRax~De|8fկ`8zLgZOKtu5vGWcBF*d~?td? 7@;na}đ!:؈L9䴝S>'[-~)$r+Aiݥ\3ۼ9i9)V}࡞h{^P!]MP{&VA2j1B'_NZN@!nz-Nv-J-ޗ18mm1:#kl1]_WΝ8i߉n~[c0M06Atlzi{ NZHqײbuv/]/ϭOms)S=TKm7/x^ML/8*4/ m8r\\8㣘PM9v=Kc'y)ߺJ7.u^Ý_9imWbA0N0>r!=V-FHȦ\Ws!d&M~35sk>nl'g Ul krOqs瓭8iC]1Z x4L:1䚡 :t :rQD|*VWm N<,# P?h݈~O3լ^MD_|QZEԹ3FD&Ojկcfq/\:)Ӈzprh1B3a+뀀<-]j֌h쁬`=4c];$ٓeK#{OVFh(1cPh _̜'|sƍI{q!?KԺ5Q۶D3f4lX0!;ByJtDl9}2w.嗫utaD˗gwk=|YgM=h49s>fbrW吏z]Xn{8}ɭu/lA#$1MB؈Le/PjyjGWhxzeԫw1mQÆDO>I>:s~v3OhGF^yERO`W?Bƍ#z1Hޠyh3G -tn%֍7&@=F4vlfuo-_>I/ɧ 8}6-?-?ym7_k.]h~;ogwʼC~c~5f5gAJ/\( \É'oNZF\ gL/[qDqvlřWM͛ @d ъ!;wǁj -KCg~aoiAx:rY6/䋮 uQv?!4`nR#i-+>QB`P,'oM-*G.u78iY⩾8j b!AiFA2OиA8 ٦|Bx}Zڏl*|l_JI)v [7=gpI1.?9 FϘ&_1l TAٍ5_7P[oLTG+MQi/I^q 0j2o `R!?W|%I~ڥL5͛?\ gL[Y,i/7s&7 s\@jLrL;_Uyc2>b Nq b!Ai`+VeYA%qR5BZt޾O*Ku)kI#Oub̛7OwB>g0ew!.NZȶ/X}5Z. fXIʶw9q*U~r|'-7FN b E^wywB>gX/#qs려fJR>G(iȔ/) >LĩC8^-FbKF`g'@ !K/YqV5!tI(*LgpIˍ c[I@#T1B%F`+VPe5B/-naJRZQZ}䞹m<űpt1ZP!;LX/ zz ׸\%YXJR4$ɽr5q-_X8N6Btˤ&]35u/f]m:[sΡM6ل4iB?:Ր!CfΞJj? 5mx.؊rH˪w N@.e@ieu J׺\{s7O+dν1{*4n?cz*Z:wLߧI&>?2h6~^u왺)1Bv&[#_/^~aԩ䣽Ik}\sqҳQwN=t$1]dmޱ.= 3cΧv7 Sѕw_~{]iqSĦ3B-XMܖlC;=Vht,5kњZjKcm^{5zՓO?:,0a:7|C5\*:Զ'_g [s/OAmi\S\c炭XA/7 OP: o!%W%Wے z^2Y})nbR!,S>k6hАΛ$]mDs*-,,zCG3ox66m!#tEY+hc^G[ct'_tuҋux59wF[nQӇ~=R֭iԭ[7;v,ٳuS\#4cSԬ_muxآFSemg*.siBD'+b6F'pC~r)r.p!%_ik\on9q1)NFQfjiب z4bܲ5_5>?>4 g)“uB_uU-Q-]- :hذa#?i͚5ԯ_?Zr%KtG;=[75BLNMnY{;rY1\qO |Υ1f a|؊T z⦇8RVk|!-/L%TuMRknzV?zWxNF rKV;'Druݟ8y<#anVi !…:h7mN|'/c-.=Q`pmӛo!< jذ!}#f}ꪸF?n]@27wuU\>q30M>Wl pȗdj}"-5L9U꺤Irm)37=1Spq30M$؊BzܾKLJk4dWS*էIrXm/CM Fj&MC[m?nzKZ{j1?d:]҆MMxOZiOg^ثuҍeԭ c9[i߾==sCQo]} SOo`SOCfSMq^oVl3pOq2ۋ?ja;5G2BqĝKc4`+vf 5-\UZw$JZ1R7=Oo+?iOa9X`Q*e+.m!#}H7jܔߝ:nno?~ t!ТEwԪU+e`5kF+VP*GԲeK9r2 uY\#`6;q,R [pYцmBt+OsiB&_Rl x|!;XCBY.i%64ZQ}t,\drMWF8u6l#T+>0뎗h'r03}v-/M%c|I; 3.> q',^rq-[?v2K8 b*R!|KAxW;?q%ƴi򥁭X/]r?a,^oRڋ}]>)w.eqa{i-FbTFv…aUБGU"ɗbLF7X"C> eVyD @W}]ƩKYkl>ḗ6b FJiK [ e8q2s8}KyaFًUw;ӸGIw.ug93fpw>@#T1B%FK ['#oPOQkm-=T=iݓ$yKz\{(|-F0BXxL}'c|ib+n0 2n؉< r 駨'Na^ʤRֹRxt){ 0©O81Z x4҄#VPDތ]Rv-n_2] KF^6R9f'uɽ}O1[pb!Ai򥍭7䲰"kq+*rB>iő^L)SR+;NOR5lN|-FH 庖+(lVRnݯIJ2\u}ߘIo gLbuUvrYT-$_y֢|c5r]dmIY)@#$1M>_؊`yC.O\8r 3\\H:44K2\v\Nt h1BG@̟\:oQ$|*+ײ]$Y)@#$1M>؊7#VOK|}]idojڼԼey4"~WsԹ6kа1z]y˹<ubjIu7m}PFK/?6mg`r?N=z$t&#t鳩mMO<ݷB4n)t羣aKZҘcg䮱4*6q( Jj.RiaR{ ~U& ߃J1eν1ڬs~=6|"4u3CF;Nn"sƬluq=T,hoȾh ҵE4hH_QGԢFS ٖ,0ƕPN… i=?6l^e5B3>EZnu+VEw&.s'_tuҋux݈:giU\9nPTn3OTI|k)1A2Bǝszc:p,u Oo@<={jܴ9-[]W6C]_p 4,>˟FCk{3qƨ΢O3{r c\ 6F袋.I&e[}YHFM\#t_tݷ7qĝЩ2[[iKxU*\9pP Ai,\P+NIy#&(=zi͎"98XxZ ZM«~9O Job\K[m1BHs!d2OzׯO?CHFM\#w r+ݷ7qĝ:vBm7Vi1u6&_%•S0G9eAtJ3/ܗZR)M9>r'K2BkQAAmwR1O 68@?']L??n>4u΃A{5 &3[n^aKsFO?%+-qec6Gy#zꩧ{ٽd5Bvr w&.sW${8Tr (ǡ,̐VSU"&,#SyJ `aVm+syU-bӮYuӞs_uߕiڰ]Go1<@g^p.i[m?nzK6&EKܰ]dk1 6Fᆪ;N91O=K8~%V,]k*L}#`g{צ8wwtwnܯ/nE"<q`| We9%5CPE)4*U6W( rw~U:\#O:m^?N'DWcM[ЀjLi4l1yǦ}6G=qwep<ħw0,V2ND?hÍ6Qcyk AGmڴQ>_=CԬY3ZbڎKW!_$w"_}.q)tn]9Lx[L9У,* AigU6UH4}Z轫FuK4}},n}v-/MRLFH/#B)w&_ÕsGYi%5Cs Hf2KP2Z>WZ bt2BO veoҺ"FJeJq4XT!Hv.20>d*'Lg1ؿu7j1N!o^ y))+bTFi`|W0CPWitR{,& Fk#t #1BUJ#T &_5U0CP6H#oQa4M<~kL@#DPq4 -兕/BU=Le:6D5}'F!,BU(7p$i) gL.D MPV]2DZ(,S}AZ±]_W@#$1M/6 +m34U)Sya*A>J8ޓ4b3WpQ:VjkMS>S0r[M]ژJa4"b3WqQ:U) Q1&U:c;I;M󻮂-FH}2qt)gw M;/}=衇2C=`3#?;/~暏馛2Z1Z x4j$ /vBäRf >*, Ё"D?Lt!D{;ԫwE{\>we:ꫯvۍ` sGg ?zmԶ4y,3FW2`Pq㈞}6s,r[ʃό>[7c~;sߌ:l׋coC>d b!Ai2IT$O!U!S x`v'ЫfOVFe, 2 dP|mڴ!z+7N<9v{WN]=\\ P\^0B0O>SfM[+3u<7?q}}7QN,ٓP/ӓLA#$1MZ'lYk. 'mRwݕ1Z0/{':5q3Wkロ1B=g ^O4t(Ѿ"=9ksP-\g)ӝBcωڷWFg̝Iza;]==j"ӏ& FHJi G5"HLQo&#aaAǷ7Q#'Bxmy|yܔ)9μ'B:# ӕ-k#«9再P^a,> z5-71M:̥ 5>,Zc4Bԗ'ؓJbRkZ2((%3ͱh/h1B!;'BXd9hr簘}+3Ba#Oܹͽ5uޤ}I,˥T\PP%i |ҐWC*ɔMUM Pe-F(^oVl3pOA-m9sJ >ƹ?ja;>.d;7חQqƒi -F(--x=/i]#NĘV=LOH4U2CkD *:A#7oUБGk i 铦Jn !^e;1@ b!Ai ~H[z+)О0T9.LZb!Ai ~I[>>k]&Leq`ǂ gLO( >s1d m,D5TM~ƭP: gLO(->{L,((4N҃-FH(JU4΄1!Qycߙ,4M>2)‹rZS41ZPJP#T(ʵh%MH|ը+1Bur܋z54^1ڛZsU>0c}g ( zDiPgP'.̓+tMr*kjAvr4>j"\I3@FhڵvQ֭iĉ_fԶ\YōЀ7 hp}ʀ&бB  *;*f\5`KN PEм08`,l3m=uMJ jRdB6`1W'ZbEi1SSSփ;_Vhδр]}N^8S.]hoСCi̙\IVq#EV3nO_`c`8^ NӳԥEX0 _zaC0 Bv!u=^z*U&Ca2kReX ?A<}bĿ^# zC#Hps@./840og ΀]#to yTw>ut|y V7!wpZrK =ԣG^mIVq#c/}[xZcc~&4ט^-\F?6lH?cHIx-uVKelxaPVб( x AOLi5QC4 'Ǘ௼5uG@44-> YQ#`^?) &ܞOX?9P)k&btYLAFzmv׋袋hҤIjoU>ڕ,Fg@6O>`N)m5pT8ar'5W*fhmFhDF t 0-?ʕ~ 6Ƭ{v[x&OQ~@cOxf A⮀ SF#4yrbicg,bC9DmCxQ~}GjW.FH!<2 6 *\~ڏrx~tqM4 `G35Bv \#*LCp6fEP)s}6SOQݳ{-#$YXō {01o OBd,;`Om'O2^2x~n)-hG ?Rd/'5 jh`T}Y~!n;Wc0eȟL-mr5Bx؀8 OuwAH_Y(ǜnxS-PY+UtŒ%ڝBMH:vH~;}4b>}:Wr1BҟU#&(~ؿ ^8`x12 >TgSZM/c.#g<_lFEF.S 5B~8/W&^ msC AbLf{6BD/ݛ~Q6mԿ{_gԶ\$i>2 p@FHd%FH(5$S! ը+1BBP2G|-FF%F(]RT TbjTbҕ!A1ZPJP#$P} FY#Iw&?00M>A FI#$i 1Z x4A-FHA FϘ& P~ gLOA(?uBqL}gt.' :kDwoH;B bt%FH@#T# TbjTbҕ!A1kvmG['җ_~=Sr5BҟfA>YFhՅׯxR O]t oMC3gs.#$YXbA:mVZE[nچqѣGvb? K B:;i=I4pYwDL&_JH:nN\h_mE?~ j[ɹ}½pB=zچ>Cjذ!#+#$YXbAԌ{_[W?Lv>vv:#ԨI3: i¢O}wR.E7>G7my V7!o^/"4iچ[U>,{vb? K Bp,u Oo@<2BxJtsߩs"uKmtz)Wܓg\ 7{!mO0ׯO?CHI!A1:5#t3hS^FS]Ԍ#S}"az_?S'F*θԌw}G;vo>s1bM>]u!#$P} F;9wB$Dz5_Ӝ{^UMf-~cuӞuqF袥Zn؎.\=~Ծ׏ڴiݛ:{b O TNF(1g/PO̯ƚBFuuFkY>sI~5&*,W#$2K B2B>)>ԹQvKE# Te7B,ZMOI;?q%ƴ]\bҕ!A1F?ئ}':(o " wqJWbA0Bi# wqJWbA:k0 ΄' :i0M>A FϘ& P~ gLOA(?b3' h1BAb!Ai 1Z x4A-FHt 3&{'F; N|GG\ 8u7mQlWyvO={͕<u:^zG8WNXfGo.蘳8k*FR>kWq_N 7$ 1u= w.F򊵟!Aj$FcW:mРz2p Gs ڰ]G.l.t?tX/nѿR׶jӁ&MCN-ZO;f95PF|mCXWō!Ա9>MAz|>;շJ00z0~J^90+ն~g )WܣЀ]|Ϲ5[H]F&u+/:_[ Pki1Vl?{c47-3B#_]K}WONhTw*=k5q7XxMwH'6m;lF6ߒo@=  ?E(l#/Rۧ\|:w*sδ@hqsʴѶ<1B e$OpX }wRlsP\qOb렭7=:ܹ5̦HábhOPHC(|Di# {V]gƐ6o܍)G4~w+u+V ?|θ^unQ8މۤ*SCax_2m-O ;IPWcb9҄cdb=GJw)!<6L ތ[lb3ŇMR )>_1|C}rCulNŌ@\Rejk{F ?oj0\ j 7\s_l< D.AWWu>F i$O4:?c8~,Ϙ@ZS/Cs5BqyƝRl5B?xLZlCE!#$B!YC!Aj Ybg PkzV#$8#FHZCֳGF#TK֐!FHpF gu1B3bA5d={#$B!YC!Aj Y%3BH$=Y#Yt9 lAA*bAAY P  #t?6QДIENDB`savi1.6.0/manual/images/savi-coverage.png0000644000175000017500000014240714423445060017430 0ustar lloydlloydPNG  IHDRD-sRGBgAMA a pHYsodĜIDATx^$Gu(kWZqr9rY("B+$Y(,@H @mlq18`lpcy=Stwu{ԩTwLsB!6EK@!BH;8)b !BH%B!"B!XB!:(b !BH레%B!"B!XB!:EbK.&M4[#.ᇾS3 rI<'gw} ,ڿO(\ݦd V]δs~O+Aϓ3[bin}w/}]X[YϺ?q/nGOXwspgmӁnŗNڎ8E=cA"skNf)7yźlhRiEr+`넻_Ocod̫SKĞ~ϴUwsy>~&sOxCŮngn&b0~r6}V{o1}]!boMgz^!/狉]uF`gMھ{Cg=H(b  E>I5ˬL]mnk(yul\hv#܌i汫(aoo7-{&um8)'vc re>|k| >‡z[jٕ|=sf;G>(O~n)S>=MҮym6v#K-oycJl̼!{p{ؤ;k|اmv?ESXmCӲʕe%(y# A"6U->I eWX+>,CU2l'IQ5bvc\7|Zׇ_֜E8ǝz$h'C?xb}s+aE'MVAѵ[0'%bˮSYQN,v$=C'v$B 6|uzOB'(oCgκm>moӲ#  !06ҋ_Zcη"@d"DLJVϤ>7mSK8pqFUl!T.$HCgcGbjy+_>J$dݼ26 enעiDVY!Lgb\xJ.qɇ0vq ;@%N)xeWL>b8O{_XT_|nO==#ڱEhl_/jcE"vEDtbF_y}tp敏xmjraóEa\dX |p^_8DXvpF~ylBvӏ:O6rD鿴zǜoE9{>,H|8~yYzU8OY?8pW}Qq[@mb,ڎMR-umųb#caUM"bSYQ/4kN-W,Yu:»|)@\BXB-ȱ,H@Ooϼa_z_viӻծ@<˝/ç>?⌫}<,>E< 0veΫ5>1&ak~Bۊ+½rC?h.םؼq8<]/E'BN±s/"njYs}ʧUg>."ʎ9z9ս- "bSYQ/"V>Ĝp7/_dI<(qZZ+ݔ.w~­moڇdĿ:HO|?ܵ6a?Q%e~l|=Dv.lN^p'RS.a~C:'^X1v/ n_Kvd)m^h?h0-e/wV!a}. G\݂;oӻ1o\w}އi;1sq;6O_Qp炛^:E(oAI'ս9'@(bSYQ/"Ddg_? ,衯XN9$pC?zG3D1Uma> тgeWRI:]c / I!xKc8RC_,,Czٗ:YW=$ɷs_˭c\bOi@;~C'څc\4?v c@Aڼ;^ ṋ.9WJ_XL9B*|2Ju ;xH Q&vc޸-|߉nŖO3gܮxF[ _ ǖ&ϻbWV줼ɫ{ٵ; bNd*Tּ d鋈EͰ ,i܃_.?E:\tg|:nkBzBWIy"fb[gJ'܊sȃ "pQD 2qw^Ha ^F~t}cuN^h6>yYq-v[a" \^ ֹ+"d bηa|.bIΛH Eg}Ol޸YW=?ab_JɺXӮb _QcS2kwĜ:5/eE,!ֹ| Y7Pv:cJռ dX% %m[ܩ3x?L WeS3(Ӧ9z1/&(b !C _ogUqτV}ƽWB5vL43lF6 @KH6B!uPB!AK!BZE,!BiB!uPB!AK!BZG"bq@!BH["B!6 !BHHvbDB!B;[wB!ZkB!(b !BH레%B!"B!XB!:(b !BH레%B!"B!XB!:(b *aB!"-IJZV_X(Cď$BE,ip bH#,Civ!y:=&<VzQ|B!塈%=&?yӾAXk$ʗFu)C+ !PĒ&`Oa4?:^Ҭ8+)MۖT2y0vBKj@sMg_?i8AbMy!m"mn!"T@/1Ѷ!ƏeB;2_e?,H6qyh&.iagiB6>+M>!"Ԁ[qek0-L>n"-&di&ϞRXAVHK/_ۧa",[ cͅid81x6̧m!E:bkluXYqtAYid"߲ڪu\=n1\ N(b[,|@نN m_c!6accCi*lnF!AX…MGJKCmbh)vVZ(aǨѨJ˲oҖVC|6Z@.tGжYv@k64i:tyEV?c2z`+Bi V=c }heо+z`!$ViWlB{.a\MK?vmu]CB`X1T͟Fu>1uɛG1(bGٓ7f}!!yvi:~4^$l((5mYmim< (C5 nMmEZiwL ǼuX&nM;i3 . CռX;!ʟji)g'Ë5U}K"X~UX;!,dMl "9E [ADžqle[5MOyXypby/l(67V+]>F(bJ̉O,0MK|ֶ:ҀN`q?yĖc٤ŧcyB_!FhmXe~iK'3DVS&ޢl>2`'yu8 Ne|_YV,RX;MGlTKaEh m拱irwb A^ ;D|u˲61y+-J MV y5-(b;*X},QkqYb[i:N-.+OG\L~:}]}MX!Fz@; :|z6 amڅa /DzA^=:7[_[-fk,,|U|e z.<./&ڇY::it|hOȰ~eE>zA^=:ۗ qz4YhMsRW4M9'CZq:-ke51_ ;Dxnk&Ϯ)g[7(<}%Vy$.0㫠}κA-Z~QAbյ yeieqPI0^[ɳk e91_60ZXyI:4 m'4,)ZNe)[*X6M"gzE|dم~$lBu.XBV^ +o?R6d:4F?$,q:-ƊҪ ~UbmHCMӰkeabFcBAӦԥjQ=leoG3HA&aZ iyuN ubW^֭ =M[ ic8mC|fS²-lMkO"6$M]ukz;{Lc[i>u^'e^˴g+XAW[/<߽,[OElM`Pg:msZ0^%BlCe~ÄuLW˛ELلsNcŐK~Wg+ۯRNuwE/)H}6־ EWgV,P&!$9Bt KZB?uRN}u쳈tgט1BiXy516e)Z6ѯ;XvuR ݇1Y%=/oHQ{BH:8sJt>OS48,bÆJCpQt~Gmô40"cӴ}D˖vi,QHhۘ<6NׄaOFsIa\ :_Hc.omf[y裈:]AkV"-O!6#E̳<;2xQN,;BF#+"-0 HIJ+>8 mEZl}1RYV4& [e_Q]6|*mJ+iˎi6B[Mh[4?!Â" X6:o6lO_$lٖ<|ªSU}_4`A/qHW +gلɲA0uN2%nu,|ª8E8Kty.߲۫6!-]O!#yʈC_:^2 svŏ*aH8D%[$b~a,*TY6r/4]·q>0<:ͲZymG0[^tȱ&%Vۮ"6B׭Wul*Z}!qUZh3 ]ŕATtX,601Nj9砌&&nv]*bue7W~毫  -SG ڧU&=a9;,G:Bۥf i3ױ:MoOױ;A"VWLc6eˠW-WI lCؖ!-LV[qECHZ1i>GQoŖe7smlUŖU)ˮMvծA寣XVuekEȲH5qa%-XΟGXd YXH5ȱ)7~ [Ə(b2RaUQ6rm˯`4eC Q:pWA }Y%Y,bڄ²IcFhu7.Ȩo"Vw0wjF2T /j[C,_²'٤oyqh/XvE훆nsX~4b#:ً` aǎ{,bue7LmE_B>,ekՕdg:Nlbl-y!eJU4϶W/W7(7@ضakEJ"v:,VH az eV)ϊ([FV*/o> MTm1#6( IMӋ23,:2HBm8i}S$eG1B?l!SCH> .6u.E}3Jy(j"y!^<+]%Ũ?Sxi]X(Xm>iS߄uXe|4B6.(bCѓ2㤮Z<kg)FQ{G~M˓OCB;M^Fjlt\h[3eŵ݆"mj[ۥmˮ[iGQ6F(b> k:\,Y8+McFho׾Sd IckbVqV\QrB(cДiC^4A5H|MH[2JP6} u҆y1ɟ'W^}%=жiyðekőQvUFCb[vY^Xa9&ͣ86:,qV40Ͳ)U|1>^/}ԯv?A^bCk{9qCEY<' !-k,+.>&1X>47 Ke[v:"bk.QG_"1P62'p}Qb_˗c/֟؉ml>ʌфa8XiVtmgkblɲ-b(_ꔇ{AXf݈~% ]K"ˮBmeNX"~,"1y`cajĦH=,uy؇vV>+.L m°E7&_MyڟƲ )b[~1azWC%rP6Į<"Bl4;cEm}hCO߲K˛t[:"X!yv:=ͯIKɲFBꕆXm,i~%"Ad1'{M̢RgβMK&+/,ḔefKXokƲqeoYd٧[%6Vէ_CN?F|b IlAVtgOVfubcŅa-tXbj,[˗Yiy|iI'Sh?u#dƐurǜuh`_,iiYaMX; ±-:~tE:޲ia_ui:>LP$Mˣc2OcӲ!Uo2P6#椯FSiYv&y>HscVt,bc+dᣗHiMOb1EL$tN u#!kJ+BQu٧?m#v8˖3 .Ru|EfbZq@!Ny1H9/+"nI러 lˠ}훌:BNpD4YiBN{tӴMNHV/ݫz:ɱ mB,;W$]/hX¼4id > mu~_O> "q'Kmc}O˓F>eŖkWw:I8{eC#i6YYiY<Xcőn;I,X,UbCHNvkqEQ:}fZcقtA%+NK#+[ƅH2X4K\1v[i )הּ44ć/Bm$i&Y bleB_u]H XCb0=Ͼ1u6iن΢]mHV">ŏ'-L$,}fo&:%愗!v]c/ V:i'ycZe|i>#oh/&&]H9RfѲlC7J˶J^M^:!堈m4'~;+>IJi>]L>ɳ#AiV"huԈ?FRFb򦕑o(Ә'bak_XrYv: YcZǘ1[lCUӫSB"Q4²B/L#~(b[ÂX.(ivR,xJ'&f\m:+!;aɤUcSeHGQ?iv:/!"uTY b-ZI|Li72Bj`YXrVǢuG;՞uZ,ePoL4UV?7d8m-zAJ/T8. a^W*6Ep쎳XЯU1{+d2ɳIˊpElc:yylbUFOHm5֢Hu*ay!i hq"nibl goKnpN>BbҵCֱ҅h쵿>G*}>%̈́"EE,4u.Pi~4lu:i@^zUnx1tEMV91e<_EW<]<ĶHa~`?fBzda L&\p,:_?˧Y6Vi*Ctzݔo9,ďƲ+J2eھhaLl(bYd*XYyc}mcA= //N\*eZ}N0ĕeƕ!,GcgQ4e_Mu%$ءC/u-XY~,'De9 cn 90Z}2X;e}갶駨,2 OPGBCzdqJ[Z,?YV%˲HY\:VzWIe[}MXƱl2~te yu&blEz5=C;4&5yvV16]4?:ri#A'iV|Y@k0FbXQ0VFmQY/˟fѝ|tV ]f^9y1Ĕ/º+N5:Mf,[NH{isFx"֎"ʀNOK-"ևe#ycWG(/KʪR4yeօ u80O4l,ړgxDE'ao)ӿeCd٥KZ"_Ew+EQ"&hUw+E}Ė[~UqVCa+rwHLcl,<'u|GH/Hͦe"V]U&n|mq .~G-PƇ+T[l^iyC tXeXu^/Rm%=V4BzE[E,O(ۗEveԈI'B(> ce_ RfV^k,Wi1ގI+ ⳈߘL+CiĠ삗G̲,$Tu9eiCʰ8BXuQGyu }BE,ɡVI R7+-*yegQ6cKׄ6:|]ПWw!d0PĒHd1rm ph+XvyͧG1JG[yNO6aFlbl{I{OӲ|W9XRp!JKH&井#PyHXi!]uӰ&Mkŏ+=cO֥W9qYXøhu&dPĒ -YfZ!/A(gIJJ4(Sk&"8+^4H}Qw)HV=h?uMi"G-Y I;hX)p<,,оRoXc֍ 1_$O Pﴽ_OgiK=I%=Z@6n4N ESx!/=1Sge+5f݌1Nr䉱4D[nYek4] O~ <ȢCG!u14m+LKׄ6iT 1&F`i.ƶIiKrӎ5 O/JORF(bɀZP0?+ dY;XV80GQ{ kƐ:YiV\{/o&"g_WX iR]H۠% E ^0>~m/y-XvE(㧎#+b> UML]kфmc_П,CKֹ u-B+u8-=lbY*(5vc-j^>?ȫ_/_ghÊOi>腴*CK(zfƉ]h'eP&O1Cv>N7:R7aegŕ!ƯąXE좚ϊ8MV}P$omt&lˠ%eW/_qy<ҚDV*إƊBOmOH% ZT,a u|; ER@cAۄi0]IO-Xv&&OcRX&VA=ﴍK?]^!͇"4-:,:U6P$ôoH\]_-,"CNh/bU]yeOB&BK,ZV*|Bo¸0ƅXy~ˠ}dCJqE? R+-1D]^^ٽ_Qb_4!̀"4kQaI4YiE)HaHKEcƳ<گ? 7i@eeg!v}L^BE,iւu\H^zQ_L!H@,-J Ic_c٥Q%5uybmQvR'nej!PĒx"bW?Bq4HpbHɛM/6V|g1j~{UNe+ƟYvye Q6!ա%-[b]WEQ@e-lǢV%,QПMǵoj.urT}\7Ŕ]x%Ʋdi?!} EQS> tX&~c516E)o|,q]aiۥ˺e'YPĒS[$Zyiq0iҎ-4O#ͮJޢeg1>{|I_"8UFVblC(xuek!,4i06q˗O.&\W^AH%-:`aǚ0>?BQdGV|]hcmkiyҰh_c6!y$݇aEha(U2(bI˩x+]8&ƮhaD;]m+i[c;mq16$ݗag!̟V!E,i1 ćicˮH"6+>dl:,c(ǐg;VF1bEZ" DOC96RH]}&>~x}Σm#aeڧ%K{ǼE" '[ٓlBbl҈-BQDƑH;pHVZY81cH>N&vit+GH3%-"\\%\dͲ- ?P gŇiҲ!f-G9ϋE]HXq؆y4BE,1u.Y>bK1P ~ϋӤe)C^qMG%1cRv;X;1i:^ecX1ڥv!C|dT%-!mqKBB~WeM(8үaXf[310>/ʳCBX_yﰌ0ƧP5?V(bI XM UWi&H(DЗ*]5ciYdpZi@5Yim':_ֱ&&ΊeE|dX%-!\.V| e"("G;䥗%ϧ5cHtXUfŇvSi1Vۇ0.LK#Gl~M4lǿU0>m3H:K8/B>H%-%v1 e[6m"EA?Zyɗe;6nYؐblMV\P(bI)pȯ{(H:O+>WEZɱ 3eCHS(;OVc"yb E켈1> ɦ&+ s<2#bHZi1T *0lcowX@A` }S65X ; "sl.WP8qЧV|,Ug;?оh~~0悕YdЄ쫐XBE]vhR>x"c[i͟=cl''khtE H[N4^$" 1NEi Z"+e|cXJZ Iפx2XcAc^^#m,(bɐTY$ƲԨ J 15N'Ãu|/d &@Kk!ka"WPT:}:eCL^]56c8.+d 16Pe>XeᐬvR!8s91UOZX:c}}GCKtkLB;+ 21s|yl0IhF(bɈ s9Q"SWԊOc|3q۴4+"ˏON+>2yg栴g%4]C.b W76P үVZyy4k,IK4b*ꓴLerbPĒB/emAjҲXc1N>;.eܩ2'歒i [{E,!BRdaI-n/WQkg'~hɲҲS',*묛]E,!EZ8".bP*w+^K&qZEV2ǸU)OW E,!1vJ9P"+^K6klʲӲHW<*e~X2BX `Ebl,(%0&Vne8gH+/-4~[2zY?Y2E,!ů"<_'g¾aƲɗFZ޲`2P^֯_'m"zk!| QAJi5 Z~ ~B,[|1vUudH%#^ZTʈiXvd4Axn&DړѡsCUV9eO6(b:ETH|D '+^Kw|e}n> M"vd>l]}a2G 0q8VO/2cn]F6BKFPYXBM E0"cfM5z s!CKFr+ñn/K~F/|nu/J'E,B˅^cpV-lIFSuց E,;܋o(M U~z9W݋\u(bɈ ]XElO(JwXrLH/u?/E,B׫Tcف$mjK=ch꓌3u?3E,dłL[X%J-B4:Oq e~(zݤMPĒ@^,zi>a EdOɹAPܑ72yi#dЋ] |eK'!VŨkl9GHU!&֊KVd%#^楓"B4G}T[ ReQs0-_,za"zsv):28/H]GuϿW:ʬd%CNֹC,4p%AHS8B-,{2\pɠ aL:.&2yzԩi(b..ZhB@ CX^VFȳRǦo%CLjE!kzmL['u mm MBKzF!݄kN#5VzdH ^/,\`?2Z9_G>Jo mpAKk!EBld=.N&94X2DXeo%H_d!,'i z.r>6 XAxfa7.aꘕ&Hy}Li2\E,)ENy)W<vceG!MkWӠMQ&O뼚 hQ}F5؁/ǡYAl*W(j.?N}N!D_!=4࡝&Ʀ i~8}] \M>5t?YXy! pjz,cElE)X;eCڎiX !p--afagDY!V>2x,{`9 X}!XBFzb嫏XE:Gʱ#́~,[BFHh[9q%"VwOCt2XF!3JX!X2*d:M mإه齡%"2yHsH0NitaWPBQYGڟE< [3ydP5OU_ye啗El22IJo#EӮXΒ Cډ5,:)Z͓EG!Äv-gp X VG }+i61 (b[:E]2hFy͓[XYX>B|!" I]1k,-iX +B6u Elɳog^ʓG?V,_V^`Bke6E&VRKkӰ >iX !p &GVZoh(O,eBHpM}r I̳,|B~ga!`'!BE\VaymLhlG͠ u$BR,MuLb; -V1X!BUV1X#bjP]X },߄B!,ua'Xe|G+,{B!˾ %B!E,!BiB!uPB!AK!BZ)b !Bi:B!uPB!AK!BZE,!BiB!uP@pNBu> |B5_D(b i <' ? Z9G]qhWXfڪ7bs;ʹ~[~bCs4<߹\ED셷~ڭV~ 1[|4=Ocl]ٯ쉈_g[dsorO~]z JĞy#3ulx;SĎ!9<y_̴X(bI8/ uЄuvmv O^?v7:lky+{":eڇI_~gm~6?;-ҚnI‹/|`AĞwf8+˯ƺf}nu6u+qYnyuK,=O{&jWO~7mnOooӁowbWǣμ֭6n5u|!WK3O'GK,O5'{;ל̙]H շHCkU=O\bEcЗ(q$>>-ZΟQΛXX=aiXsM<!.:Vs#>M kYXc3NY/{8mSE7<Բ+WY\"VOl 2+f.uc :u-v؍/[qu_/P<۞cw~Dw+]ldCD,!,цgOC}7qݝشvYXcQch+>ޖԋKl>~!EG֘!]N6u's?#<^M oiTxZ wti~QOث_CGյJ"VK~{o7&/ >~k8SϨHڬ[>Ui'6WX1 1NO}|S a| AdX<ЎjEh%bc^ʿzW|390>{緐|ZDB98Z|`'wJNB/8tޮȃ탺5 1-kg%NxZ,u?ue<# oXYZVʼundg_UgOxU^ԲDl%㉹񑗷U|+//n߉Uo ۍM"nզo_6!84N8Ic !\揳D셷?BZxeWX=yaZUWR"X * "b v7oPBHE:WgB|(bI/%t"PĒ^@K!\)bEl%"B*ҹ:SCKzE,!Tsu ͇"XBHL;@(bODˮn}4enz>ceIR"b8&3Em>$bϹIț{%buu+Z{vn[h"nʢu6];IbK.xO46}#GL;@(bOEa]t ӹ/*nɋ5]7}r3[bi|u'GK,O5')#^gZCty?Zo_y-'cϽma]q{q VϳzmIVZm1Ixf뉈컿rL]w{swc&6&b)RU"vP6~؛M}?u/{w+?t}7< ֝~neV_z7p^܏H}z5\U]46s_z[„<-^o!~H,~y7_|w/PW-R>KjED읟G'Y2W\S)p=|悛^U>- 8BH}tV>B|)bo{;er7yKk ?zwҬ;n8.Hu_7N#f/K^JkRˮۅ{zb3/m!I^SIĊX?ED,+> m7(LŮ^i|@ӯ@ym/0e?-§8BH}tV?B|8W>S==՟x7Cz9|O y7N5Lw.Ioqlב$S/6noMA'Iyqv/ }9 pǓOi2u]89I/iȧ!L6~#Gg gP/v<7vp'K-גc}yamvkxQ(*b{: bw%MS4~c9=!\V^P,ԍ3;>V^s$M e?- 8BH}tVCB|)btcJ~/w+q/3*MJD,u˧?۸O=#λn">-y5"@c1ٴ+^wXU_wA~k__ οy/%5@N~$ىiaX?Bꣳ*b~rIn&3m*S_->ɭ$7eInu'?Ͷ-KEa+MrtڲvvmW~?0OT\Swj7" ',a# zCN5[_\\N 6pEl>-^gVCtY)s}3 fར>- E,,xl|:­~<"k3&|ZOq謂7ޘ^}u;yf~cgNr;ɭ$m2[~eII&ǰ+K?E:a}qedEĦ; 7&ǃƏ~_Olb|<6 i觅QGչ'sNElsH/ 'cO qyi:X"v? @KzA) X2Lt|aG-9; '6->=vۦ,?^_v%m%2NL=6ɭ$ Bbf7}v{ۦ,uxc-bY%?8>_X (b !"3El$:܍U=|[zI~M:X?|1vn"PĒ^@K!\)b3ޛLr@U ]x͝2CBסs H%tεvկ&3ϜN;mqm)b$wvܱ;}SNLrm:#Iu')[e]B[7wfڨ1CO< ./N;A4>wx|%s.+ر1|bMΪȻcb;K-w}4=힇ϼ4cӾ򋨬}F;2~inCxӻq{;Zs)ؼ4؉s:n]IuO\.mE3?>ҹK! su ͧv?b!s7ూkyǧv9^Wr68^‹Wq /~%{sko;ċO"BgFǞc߾ Jk{_~&6, HvϽXPGvcmg:b mnTOUڰS'n|&BLL;@(bO"ԋc+/ ==#Itl [xK=ڧ:UN8x>yA]ֵ7]7}S !92 4+ Rՙ"vP6:D,8r5{P&,)}]/,a.ݸa6| Rՙ"vP6Dlۘym{<j}0;_ZiRՙ"vP6Q1!d\)bEl%Z{vnV[xN&XoBHS\8l aGB qbD,a%uS__|"Sjw~{ܥw]ػͨ!Xm6lV[-j!e]B [@ĢL| ?\悛^w: ×o1IxO~{ w?$-<w;,{qvn6W;i֜m<Ovڕ:f|0YQov`!BN%+bUDf{1o-vL[em_iW9V_.0~M?Ia/տB_|md|1kǗ8,fR^~G4,;3}m"Ͱůoțh#Y⋙!FKWA~{n_)B!T"XCX~ty?-BMG倓t2~qԙ?wXh!ô<9;e6/>>=lOW3D,4^R#{_~&6,B!SMWvD W5Bu-w+l@|oXm&%*m?󴒖W޹> [+?O 3D!\!b^!!GfZ)R}9zf!BȰ;i$D9<y_̴*"ƌ"B!$E,l/Da][r9E y'GK,I$yB8λ٭Vnr;{f~gyKOyλU}nu6u+;ܛֻ8wYzU“uko&vY"vK~|ܮ~Kf/c%iǡ@ܬ8B!~RIĊX?u؛/O݋_{<}m_}Wn~Kso[s-n|! wbʂw?مE ./|~ţox Nğ~neVOKtw97r.oUo#oҗuo'~\h{kP-5G-!B@e+5KwDnouݪGEKNuS&<$.H8yesH:oa~ JAywg8Mw}?@JF[ج:EKr>o3ͼ!|WN%B7XK//n&흄ϼn}w~g^Pa'Obx[E/iv^GCW{p%s6qO*IE{Zv%kwW?u멹tlag&"6^|~W^MV}>znvxḏҕB!TKz+{:+,C($\tg}?w<QG[}> #yxl6#Ξ.Dٳ:Di%ji~+n/^K–&yE#>yĵ7]7""[_yUD>9Y'g|u<^Zq{{)< P*ŭ=! ch^{zF/>h9W?BAgovpj+< "Vv6ÑM},V~>w[ V:! !E젡mJX2Z1®b2@R@K"d;_Zi j !!E젡m(b !""=PĒz%@R@K"B*AH;h(bCu->!"̣N_uЄPBHE )b El{.b+A!+-?u_:^6&ԇ"B*AH;h(bC;^λ٭V3q$8,7<%w3>ߩZw#Ysw){MnK^G;|iW_w㇒{'?ªtK4ivm~-2uI%iYm[''gH/ҚnI‹/PBHE )b El{_GW=6܉/XNh[#?ʹzoOvabza&Ěox΋8ğ~}ㇾS_>~Ɵ,6k1w.y>eu>)dkn}OHvhvPĦN,!^{opgm!b / D,ب"=kwk4IIDooPK~k/-b/%1gE,ﵿu{qf;t} $| wt?锩KtvrI~_ Q[4ɣ^leޚ0cD5}# R`EՂz bP28:Zfk!b{M'A~;Tag=?#[vXbS;/4kNbg_j57qM4I/]7;Yey'|N~$WV?TAOb M]4Bj ^7zO /S\tgIwx_8»ܞBq敏$:6`z?1"6:%6`Μ bR28 )b El{蝈v[¸+Փo+"-N-]6oiTM-5*  ?_z?U;yei ?z97z_y7Q /-WP.rk=MwǓp4NĂo|J8KY;!OX$Aŧ4١-`h Ǿ<׺A'^l'~ٿ^UĢtɄ:]uWgbb{-J„AH;h(bCD,vRUke#=]aL['v8q 3)qcb;@~wbҌڲ+.WV?#?8q+/梎Xܦy}s@6&ˣ_&OAnn^P-i>Mok vFaxQKoyݪ7Ϝ ~,bqOH (uItԙ&^x~7 AH;h(bCD,D )mN,6#b k=Մkk^~kwb`'V^^p':WV?e||^/w؁>+?g%%@R;û6l} p\~L)N.N,^KZ~pwy;)X|3c_%S|3D`ޝؼ4H#aF?+0_e ;}{'L,L|D]D dAH;h(bCD7 x9^8"I˻{Ou:ɝpm]x /Cbr vW~MX !92,"0NlVY!(B>BD,OY8F?sIF9"!̼dRӌ!!@R;Gp{Vzhع|A]quBK! 4w"9=VZiX<ۆix(|ɭN(b !""=VĶ6߉}/sz]?R/(b !""=PĒz%@R@K"B*A8& ۂ186#b! D(l:Rvan=`|w}X;j!E%B!"B!XB!:(b !BH레%B!"B!XB!:(b !BH레%B!"B!XB!:(b !BH레%B!"B!XB!:(b !BH레%B!"B!XB!:(b !BH레%B!"B!XB!:(b !$$5b1!T"B WO~ !*@[E,!WPBHEl}^QJ"S DŽ6B[E,!W@k1~W^c}7i$%q;}{dcwr+[#3[r9wNjj L[fZ,1c>r+,;{M&";ꨣܔ)S܊++p_;k!^#bϹIw߸5u9m/x;1HKتu'q<濘iĈg>z3-^~!Zxvin=p?ݻ]tQ_QakzLƈ}: [:m~ܶ{wiuҬ9Iڃ_$mK>-I36jjvbԭ>nKZ+E;v=#I,ܰr;t[ediyu}I#Θnu\~䅿-4ߧ]|iW_-SN9͜9P_QQ+*bq}<ü맵5g!q"wmnbMh[wgyq=]GDn/ON5o݊?*/اc|O䰟tw97KT{ㄏ!_` "6,#N16uG?v >h+s^4/- _|A\uW}Y"Rn~@B[1wCw>Kڂ6~_l>soJ/2?DĖ='@N;f^?ΫSI@= !R~/8F"gsJDC/~ ]wvaBEGᯨ]]VY~95uRY/27[{ iXpQ&'ͺvЩgɅOOS.)~Nvt?FYW}#Iv_h=SE 챣%dM:,<$|hAu@;^u7[J<uųrAݿa)K[u퍺ҋe PT=vQDE5vf^jCl5X9?S"byQއc7P_QQ+*bn 8'sSϩ&Cr4FĞz}o{ s^;. رzC}Ew|6e$`Aq1_~v\lL`L)c[tŅȩS"C<;\ M:5a'[֘fG@v\1`[;{BC cQSɓ'w=zꩧf>[~u~Ch}/ؕCsO @|Np G>Sg\oyL(< x/,xiqQG5ذ:Noqj"h^qa={VW>14Ald!GC- Љ'zEV[sѯ}+tz!"91LlWVڿ{ qcu)1conԩ]6/~G.7Z!H 92|,nEb…^7}F #\L<ŭMI.Cne.E7w;+~^~ܶ{._O5'Â׻ԭ>ӮtK/ko&8ޖnɋ-w9z)]㬲BA;f+k?=K/@E4?e;=7:~wiYRNido{_&OYv8N[{ꧬ `5ƧhEX%m";>w"4Eq%>mr.l_dqE(Jfv;To$iXlx9.i_r1++)Ǩ5}#IC;yr1(R']le𔸍3}HC%$ny{n"%@o{%I֗ݪkoԧ(m5Vïu4/L}O,mďE^J;^U,7Ƨ툈?-9;μ iQ>:p԰xD`ӻRp1m9C_1˲vdE:@.E3s^x Br&<ċ?vˀgh1^,xgbsdp"W "uBnb^ [Lu} uGN_]!cu2vPLvcoV)Ů;.Zw 㽟k$V+ 4O%ylͣ0.wj?!EUN2B%]"kS8@̛YCD,lau@[/b5q.ncǿ"[/x7"^_$O8xXyag` NK Cba>,x>,x;RGym7rz i:L\ 6N%6|aotUo_㢋-3Vb rVY;^זϰY-[uD_~NJz/y*>cczUqWYRNido]vG]a4Y}Zd I[{c]f|Q'F xK?!=}ku6b,)6 dthE#AZc(bn0&]wKhJ=S.EEҲ@>` 0R6k@ >0󊇓[ja)vzNq~2@Xeh|`:mր )BHۀ 5"DˊѲ%Hu|¼%fxNB!ZV,FE,!5s6 xѲbl>` 0R6_0/(b SBH[3 leKYb^PB!$"B!CEAK!"v%BC;|PB!d衈>(b !2h+eKPB!dh"D` 0RXB! = dƺ PB!AK!BZE,!BiB!uPB!AK!BZE,!BiB!uPB!AK!BZPXk !BzЋX+&O! (bI-PB!PĒZH>  !Q"B_=?O>&BFXR %Bơ%@?XB!dXR %BơUr[t[t ,Zne~k4iϙu}fz]Ĉ_rSLq+b-j?EDk%]u-3mUwSwՁUV=|w)idp`y7yL;͙W>⦭o7?IA']\o $?:$\u6-Ro&x>46m"VIJkӭzCP -El7Zxvin=p?ݻ]tQ_Qa+*b>&mN-rnɋy{S3<%w_ϻowbKwV\x;OsdwaܹxU˯wݣie.E7u;g w`57qY?uk-w9ӗteVYiw %\Ϟfo\q!Jӯrn菺-w>(o8|:ḎP~>a'D O|ǽda &.ˬ?9ɳOǂUkCgκS>,IG,J>OpbOtRun i"6au]nv W~5s~' pqEpA?z}I^,} (><ɇİ,s/su~_y-w=8p^250]W] >DM_d%knۿ>ym߸>qD^| ͰE0>] '|vo}_|x_(˼nqI9!hQ,ꇾn. owuG:j7}3v='n-vh+'o~Wէaχ·6C=.O>"ұ͏8P,x`mf8 pँB>9aq P'!LƉ[>dqxqi"6>?S/C{oA(y?<@y#bI.^G1; wnNM!KP/|X Nu:y _r%a-~ s\ 0"$q"Y}co$i%vqq4\h/}s31gv -{_N*kmE؜r^lA(O}|]>Kw|\Y"_X Sq㓋9<Sp| rpG~ d'",9$ ؍2S$`̽hUW…HlWov $08>n;Rr~x^BZ{r.[ݗyeqkJ{K?9ʔ8MN8y\q;E/.P0Yqu>v=d„d'?V'>gIrOx§~-ى]_y'"biU^ɓ'w=zꩧf>[~|&V [H,-D,n}aC_L]uYzGDn :踭v=v^] 眤NHΓgd そ<ށؽA|V߀YcRY;Oyeuy ~‹v(oJţTؕódz }||Vܥu6}x>||h;gD@Kj"B8D, !Q"B%B(b !O^Ģ?Xc@! =VB!"B!XB!:(b !BH레%B!"B!XB!:(b !BH레%B!"B!XB!:(b !BH레%B!"B!XB!:rE ۭnɋ).x{w#$K.?S2Vu7=~W\?XyݤI܇>!n v\|{ߚUx_f\x eF^G_24_>i1COL臦[U'B}W3y>ݨs 0:X, L]{Mo=ֿKw tYw~aٜs͓7+`B_{_ {cWaOsn{~_x]G^G_g^{L"m:ϠElsYsl"Ky= c \MׇGO?(Y3N߉χ'GK,4kNv᭟v\"w3>4~?NB}`~XtK>]vi4uˢ;6~_k6ni7?C_?vv/sns9_N έ2aZ4<߲CsiGAn#\,v;=Vҟc,2W}cBz 핟|3I8Invt?Ƃ{HILH[lNWO6fyC9im+S;N*,wUUoeF^G_إFt=7CA.묺Ft%ux_&kw}]{V8Oٶ杇iGs#buHׇGA@"v{'qneW ̼~> /|s?MҶ0 Wx;8€I8F'Y} q+븏ޒTdOM!As3|Fɇ]E_: [ ";{{?˜$YY*:>1m-{Z.ii4}>7_ 1"_ׁ4x} 'Zn &>j YxEFDeSv'.O\E) <>x[c `3:%-mF^G_i*Af$m-Jvb5xql\$q[zHmʹUt|Zy=L i|nUi0H3xb3bW0 JDžWI{ge0Ӎh"6aaٔ]p/xE WN­@?)|ov n~-ۧy}*km6j$'n/mI|v-?/=싦y{m n5aB͘sѯ3ǜ}OÜoy8třzwnM:O^[˞i4\в:xeS:W9=_I~'E]_jy'\xS$>Y⢎8<(j;r?PZ>B,C!|Y ),:/h&"(6Y}p\Dgv#'DA˟Em^]XSzne1CK_7<M~xGy3#wLۤs䵵yx'O|2 :xeSUj>4ߠ+=Bz'NFKK"_&2>Em,|);J'EyH%!P/>vtb{ 7!i""B!XB!:(b !BH레%B!"B!XB!:(b !BH레%B!"B!DB!E,!B!mB!VZB!4XB!:LpmXmjlD- X+Bhcdϊ*buMAV<`F_1_/B2:Mm`U".\/өc݄@QQ _1_/B2:Mm`U".\/өc݄@QQ _1_/B2:Mm`U".\/өc݄@QQ _1_/B2:Mml=+NE_ͿnV^ObnҤI?x o}}xBYȭF#^|IY-\WީK,˺?Hl`XE`#!KR_?4G>}ípko[km5q'IJ-NHw;Ԥ,9aWt}:e}¹ξgRv d=y>d!dt)^k"Bx1R};o9-% EˬL]mnkvneWrͿf;GnUI#6!nW2)}nVsˮzX7/"97m龡CN_e;J܊k6a3ugW_§+y\1!ox;~76M^<$GW;1',ʸ旒w]yyaQv d=y>d!dt)^k"6q{qݕv3rsgywf?O[y cc/pN܏1?v!/{:uu~C6x^\ؗ'gu>z.b9<+0 %Eɠ.%qYnŖ8 Ӯ,l~-3md҂W .MĞy#>j{Dw|XNhK8eP؛z['b 9/B~7!쯲U?ǐ".E0-²gd W}ҟ%@ ?⌫}\c X/g?d'V<&/:M]X'7Ŵ+K?/ASv%seWj_w&G+k+ai܃_GB4E؀7sGĺ.0~yqc x️"=OZtzu10 (V`X/`#! tX7"PTTW W12pLu>(b[EE5`#! tX7"PTTW W12pLu>(b[EE5`#! tX7"PTTW W12pLu>(b[EE5`#! tX7Hh+-kl/! l>+|LB!4XB!:(b !BHHD,!Bilxζ@{IENDB`savi1.6.0/manual/images/savi-main.png0000644000175000017500000002021414423445060016550 0ustar lloydlloydPNG  IHDRr SIDATxyսs b[T Ae0l*bD}3EŠJx JDE+h| *ATD# BP<3.1f9uߡ5]3[׿[= V9 t$nL2;*n\i#<w4g<\.}P r5[FI6{rM 4/I#/դw]h}m_IaSamj &6+tk !mR4MxinooyT;N` agu|޽{/_Gߴ(F-j-/*  ]hi哬 tgp.-㛓-Y5C<ͯN6LjZ/)Lt8[ FF 9ѝ>rЎ.z]?V<>0fҺy]{1vu 1o8?{^++~+y[y?pXwyp?;9{q?>wz]ӿ.pƖ9[)R>-JxXn{pޡ #۶={#.n}_5أxuw/99y_эjXW1uOV_v^Aׯ>|S:nTKS?xڟx"S]׶/CN( %*S}EǓ#kSf]|/s#kaYcj2kOWUԜQ_U独/?\ǝjs)c/ז?pOhY>#Q<ߎOk3ٻG?a8R1_-rO;/dAY9ÞSY"c|!([^FU}tvXo߽]][fet/nQ8[&1xVZVnMXxU%a]hç%IU˨/+lUOT:UHz_ fۀ%:wι߼S3Ueu){v卢;_V3%~^U'VUM*[mk#ePjtLnnV:*l#&>1)7lRL{.S{rSV56Q\1;0+٪ͦ@4oΪQ:RUw"4R.]$lT olJXY!l54UU#+k}FGB6We|c;e&C/aI{8:9rIX}y~]F%S?A`ǯ\޲$>|yw{m])VLٔospk={%j:~W,IgltRصΧ̔u퓍#O?\޲vo~iU.ջL#ka6Ǩؖ~KK<+ nW;O\;[Z;{xijNKKdUvu>Ctx%oG6|iX 6Y}ͫຽg;wcϚn_ [-.ܵTl%o,y /HdvSYɝn X dVYi%Y٪LR{OIݻ'Yˋd@oTg-UmX}ÿB-\47VwTT rޛ[mV 5U!` akXCX*OVs[4XK _}ɚC&{/~pmOjԜo|9 (hB+,P3ޚNR w$|>G8^i[T @h}ZF/sIE2 j$P}{ PsdZ|5IJKlfMWXC_9QTK$K R@ s84[֫1ɺ4$'*W-s7A|V7V^UoMM6:d?~,֣ߐةKϓqy7Y*/Yn3޶ɣ4?Fl$Mr٣̝$Ӳ_yxo9~׶>+MrŽ=}|b'{C*Osfsߧ7O:Ȧ][X"4繝vEZ|đ*ܵ-o~]vm%'De+ (eB7VR9ߔe>|u9i/Oz)GW^ꄛkW~}0ظmOwGCh|,9emcC ˹Oe!UKEP$H#:mocwyyT | g<,tI24y oQUIT]Լd--6I"'ynڅ}|Q{ 0?nC}j4,\njMöN;xi& :Y/ÎrH5{`?UaO&|{;k3$)+OK}jqz%?b|s`m+9~m ;-fxdCcj o^jxSyY2'9#'E%-18 G}?T?qE{sQE}i2a %I +,.F[DY)䦹$oS5`{q5t_$lE=%~Œd c/a}ه5;L޶{F`jmX}W˓:Wljfn,Ӓ@ߌ9MyYE"L,\4@S:g :dahJnYxKX*V 5U!`M6kv 4 d; 0V 5U!`MfֶnTXT &$M;ݗlK$n˃6K:[]cFT -LX}չ4 KKҌ֞M^N&.몰I>aU}t51޶3$^4ul:ߒB|sL6޶E3}4ٮVly/9sJ~ Y5GMݼ6tI2j'w oIKkX4Utߡ^lUtgC*$4E%[Y25)ʰsL&ZQݴЖ`9eM/м[4ne* ny³%뮒ueW;0F@qªID|\bk[],ըGt(Wڣ^\K얦\co޿Q˗Is[x7xͰvZ]]r]d͜حUiPhi$,'*DmŶY#yl~N7mc,V6/tzr=V)1^]&kUД9ϗǫ4M&g8~ ڧM+j+gȤJ }M6aw֬RBIE %{?sGrec92ee8v%WbHbx,ɷW[ZlIR]diIVb8jh^_[>͑ۺq:x wɜvN>k7\QfI`ۢ3<$sܭӿ̷=tp2c!)JV1sێf,vWɃ9捽GbX`֯(aݪj6_-O^03-OYGw֒NftW&tm]p -9[8Bw˗4aKגplZt @V 5UQJ e[opjʩ[we}寽Zߜlu޼y[@=}#SA`):fh 5U!PZ7[Uz9Yh۶m(xΛ7o[Z`[<Ѕ5W=UvQY3+!- :ć1ђ{P荌'ޙoʔ)i]XU$2tZ3*%WJ4i73- :ć1A/Va5K)r W7_|uh䴬&iS= NG-vwߺ'סshpªJ:1tЊ43N3v#{5QMx ,3]OdX Ĩ51ؼAT 5}Vm^f4 1-&OVMͲo31\֘v&4-JCLT[/6QwKrc]Ƅ6ܙ&ELytH [eC^r<|nTrbw'pNwQ?(ׇm-aT4se}? wG-\4gorGma8D1V 5U!` akXCX*V 5Uo @#c_{]*,_|ꏑw{W~ݪ]Btd`8-0@V3nԒRrBk,Y-WQɓp41lw5[41ʯ\Be$:nBqVՠnK c;my w@Y G_K }! lGU=4<~bT޵oKcx\L@I?jw]7~fo[{"s\iux]{[+]݄(eՖJC@WgذxK6 7yd]};Ylˤq5ƈPzz1eemQ ɴ; fu! 9K)WmU[!lniɛSRh.FcHn%d w+CFm۶:ӽjg+Y"mXMX{yQ myK0G!GrrUbd^Fj. ]+ْ۰nUN5ׯ'uɯ&r޼y3x53P +T&.Z1hY9aoakJf|ata>udHV 5U!` akն(~3@|l@Y 5aL2et-Ug3*U%P 3٪M-Ug3*䧔P3 ` akXCX*VZ^}~ẕfwyR=Qڷ&7[\GN.,Ӿ^ea N5E,iʥhGc^=Bٖ+u'RATlS9O:9;]xMLLY{r(H٧H?%]:÷[<]\yӆNe'N4Jizn-EGtq<-I1ש= Y;ZL:fǝvZW!9{T ܮr$Yߪua7^\pI'ynm2͟~M>=NwƘ#k1z *|J@0)ޑE k%P lkhsDZ34aoyt>%ˮ$=Q*DH(ג3P1T^HgZ:@WXU*8Ě" &5N =HԔ,io4>Ep*fX  (:vnu6FDUcf4J q*QNԚND]> ),npTݰηyU uLDHN#wEi ڎlv yAvޜJ+%MJ_eolD֨ڥͲGP3̽{!}kiS#IsS֏?s*1~rs.>]@b>nYR+^qni)5` <7ݜ%5iuN7'Nk[4,~Z;u[?͛3C(m/bx!gHbLϐ~O)=0>C9eI}޴YNSk³g~ǼbeDkop<{Uٖϳwuct޿_*.F_W{1\ɭWw%.nw~pQ/jIZ11S[_?_z-;ilgwY ._5rۙ _4,&uշ-26gq}xLJ.0.k>|Z_ZmyUQ Fqߪԉ [jNGuGQ z-"\;D8(ՌR[Po{ϘzzfN$w*oƔ%x}rcZrXFVw %qY|m]'g'-&W7O]ϱ7x(>mO^.ߵ29|QN˯7&zkrd쏬[X\8Q\l_QzgSZ[6#[]oWmK6=]U_͡7?PmWlxh+gza×WW{9>{}{W{=nyC&/s̵rDuѾ/2;ygGNwӏ4̬Mn9nsv{rћ?#.8Gn>Soӫo:Uzgnӫne?aPLe=Y\~F8]O~C9I3p ?˕מ ؒ+ywrU9ǜwc/w_1O\ο`G%h"*XB ԁpy5us~lێ]hh) O{7|VT676_;^'F΅mwYR(a<߾y:}7;|Ox^w?]/OD&E*?oNB/+Dl?y~=ز41~>HorΙ?hG.jؖ۞w.=؉E=b;w^>WNo8,wCQ˭tzO+:.D n|wN?wZ[%x/(% V[~Z{ɝZKVamJE(QJp)*gjDٲWoI=T}n4\vKz;r+EW`?j d-\??"£wdќ(򁳢q[%yF%xcq#q}~,[ϛQ ߳v<m}/yvXbk:~~[r)ckGN?>3DǞL8=cʃߪosθ]?bˇ'? =+%[=.yZq%xo-"(-iL@q׉#LʐE-g-[P?ծZU"Zͩ@yfϞ]yR%lW5B~kg;+WZ)nXh6S5w?ǿ @xoC~ <7! @xR l+^/iY@j xd-6hl@0Y1VoMjA꾢|l"Z K Hu:K}<nxJE~OVjlI'R$Vs]gm+s"4K^w)rnP R#3eTd9t]e=*gIM]˲Ԟ6[2Hlk5ڈ rZS1~}I1Lm .xSY]aI&kY^6.=,fcIs?Аbq1Pԉa;9?0W%c^mi;]w3v`YLoGDs}4+EKXםKZ=iBvIR?d[ݾkgoڰN\9/֍t\4\̚]W :!"[L,_j+֍tzM%x~=I~֭Hx7{B~(Vcz nwB]н46xܷ_nwG2_tA~,^fg4+62|l@G~f"+9~S@E%j"֜L֜3U@~LLVurkΙ@ouS8H7"P{7!0)0"33 Tzjq\qfpRw-^P eNc09X93cƖF7vؘmY/9gK6k$ gZ^û+|<\&QoIMz{ѓUcݜ3@_b>@]ՈM˛%]+rJl3}IX]HvrF@m?R[n2"+k&p~2eXAVy]c UR !J:䷥-iU=He.)}=Իȷ{xI9y·ⵤ\پ!Y!3ګBzA֣w7,j*plG_~v2rC-F$̿ueʽCCCY E筠fYna`Q-(pSEd+WZ:W7UAxMdTu-bSP75> H7Z7Zι@}v;<###B 9~!>{il  .v17z hvF9bs-WZ@D$;oWMZD~/:"P{wؚߘR4>PYwDʸU-TY;ϿX~㽼um w ~w>@y;фugiH}؉9c?_ֲZJ,;~h/6;ZQΌʅOcI3M%k N8/.[ނ崥Q_B%o(T(U^~}h%-MZ,u}I( Jlf]_EKҒ^Z~kE*1eWҢm{X /Ï;Y<=꿺݋{̸W/nk *W-W.V_H qɪH#5z׮גVbDuU81mou zIu!]5Ċ wGwKpVc cT|iW<˽jôN5 E42`!cTu^3_W4H{*AsԻyQVNbU_>uEU\n,a&:Hqڸ/2!WYRmK.qwOl+jzČ3-W77_;ӆuʴ~~SuۂXxddV~~`40kC.8>$.psEd+WZ ߁0;k2 bX6#nE^% UߑXI~eP{7o@" ':Gj#oC~j? S 6jppP>HP!CCC_HǮONrG~@ϦeY@ ޲x2l\F`1s?`KD7y:;B7O!'è[ƝhBFu|E49yZ&@pٵ\m|%D]o֩%oBo_;>.ߘR4>E/.[~9Ejl'9âGԿK濻o('}ǷAǖ z]u/ r2ni˭3P˽ڎ]resr:FZ7z o95>, 2zy8(B=Lv/TSvQ*w`\>(=P+e ǯDfppP>PCj <7J~~5s#|zz|͹#6k*EnQ?e'mΫ[!/c'tϻ6dGr~aHvfUIZ&@p\+xNrjlr#텡AmIJcIWD+гiɵ|4}-/Hҋ؎qf/|Yb2}C5vzlQHz{˩ KrxYtAh6Wl.eKe j*JUۖKafo7V:r%cC6ܪ.xzPɎdoWۢHJ *в*I.ŎV*@{YϻȽBԾ/Y :è|UQÍӨoW*1Sn; 2d֫קTeߘR4>qn#ŪVVu xڛ8DZ߭e&BWƭ:m}&PoHR38DIO-rD;>"Ԑm]416]nUZ@({zTVufn[M؄qbKWl'W ':Z^]p^{2#DUV̫݅µ]¾%(يsHUvRw-3\Rjګk0GKa]S@I/*f݇PE|ת*./ߵoC~lllLܶV@2Y:;lzܪsa>#sܿ/6_yA~F3ȑQ@~ghh]E v=::^âvG~-0KUͮt2ia~?;(*û=ӘX!$4f^4ڠe1VZVeI6%rYb;pl=~~q1}+UStFέP{Z,;%-cڙ?dnx矗F-;.)G K&ɰV] 9~!>{il/.w׋r6c[-@fpp *s׾c˱μ%QKfsx2Z"7RGS0M[SbK$"'MqWX~9pNjоX9*y-:0*\TSUk Y5 2ni˭3U|~ЃoC~ PY7zו*Fo!20gPwx݅ 9(Lv//;0ߦ]t @xoC~ <7! @xoC~ <7! @xoC~#[.K]f5gzO3pW/jk:iW>tmup`[9-̮۷+oLtWe+>xj4Rs,o7Omi^ ogfFzE4m\1rS_EkEV{I[cK7!{ Ϫ=|<%\XIPR*(K~ePwUcdKn3,tܖI`ܣحu='쁔4^HxWiՔS"iM!G@eVjlLz8m_xiYŽ%macov2la,##U~>҆#lyz/ U#bX{q`mwV=*WiY#|% 8n@Edo(ұwԁA*KhpQ҈z}extW3]PdҰۥ(oY꼥ڏO3)˱p㭎3Mgܟ<qڙ}6W[ಁ9fM-P43'$}@DXrU/]PZ`4z XuL'G~(! @xoC~ <7! @xoC~)=V?)X,b5v|__8 @xo@^w l.kyuPzi=,g 7! @xoC~ l+g~Î?sBZ.o@)[Э~fߝ3K*/P[.Ogv,^xGۯW}:/{{tWnSk~647j1s) ޾qXwᒻv+=\lE4U_/-mWYu/})]u?ZNJ, (Q"E~˙rc%GS/ng\j6g Wq"Y1_sD#bz;l]_rɷ}9Hhba'3v^[ɉtګ>*.{:"VQQ+`V۸͈(E$uHօK?O/l*ZqսM6?P|9N >Sي/Pg~cqs~nW{_zi\ަ e[.p'MO̽-fʫ9":[;޳zӡzN;;ղqu{Mo&ww|+qa'+gzᒻDTmيkgoڰN\| ̚N|xi=lU >T&Dd+WZ-oC~ <7!h=]-7 fso@^5RgJ~3@wŪ? @^ 1007G'zAIENDB`savi1.6.0/manual/images/Makefile0000644000175000017500000000103214423445060015613 0ustar lloydlloyd# # Makefile - savi manual/images directory. Run top-level Makefile instead. # # $Id: Makefile 136 2020-01-05 02:43:49Z lloydwood $ SHELL = /bin/sh RM = /bin/rm -f OTHER_SRCS = savi-constants.png savi-coverage.png \ savi-edit.png savi-empty.png savi-fisheye.png savi-main.png \ savi-rosette.png savi-spot.png savi-tle.png all: clean: $(RM) *~ $(CLEAN_FILES) tarfilelist: @srcs="Makefile $(SRCS) $(OTHER_SRCS)" ; \ for i in $$srcs ; do \ echo "$(CURRENT_DIR)/$$i" >> $(TOP)/fileslist ; \ done savi1.6.0/manual/images/savi-constants.png0000644000175000017500000001327614423445060017652 0ustar lloydlloydPNG  IHDR}!!IDATx{ŝ{q㊊ʊJ "Pqf1"\E@( jAE Qq|#J$H .ȠdVf Aٜ߽5T~;ߏouף~_Utm^ocH@gҤI?`mˆ3" 4/RV4wৰ񘅧  =sq]p"'r]ŁIB8 XGb92E~Ҥe2\ y"+ҫ(4u.~2w.RY [esYu۳bWn:Oh" Bʕ+W: raDМ]habq<5;v[8B'+m .vA>tPW5Q*V~Ǔ.Mom[vGۯLѝK9i?/ ShKuWI/Lv^z˼ȋ@jab*;čO;? ⿵c98]|AOжu{i.E>7=3J)GΡ, Z MtwD|4qiOjTiudXޣbx۞Z#>\?ɽ'vgC=reǻ/Sرcu=.rEVo{E}}swccȯib Y(Xq}5Y9x)?_oW5/}f8m/{jx_(E,QHz+td'X.e_7=w#oW7Ȏwy}޻u:;u0}>g?q?m]kn{H~f|R|Snw̧ݾߙءo,.N=AoYr\>:k izٟǟ<ƅwܫfXZzYoǬ?ǐ1yk^폿k^JN{_昕;|y+ 72Y$.:ύ\U5,Kf_O;n}*L-G-?Q:dȷlɭkq*>;;V~<1ɽl?[5IzE; t[޳uI4Knů j;]4Kݯ;mxk~E w-w.+z79Fso;h7Dg~9I~BӤsY\SE|i/tfɢ+I+L~c:x9]T燉 6 1Jg0D @@\`SVy˱ `Ѳ?o4P,9k h"@6D& 4l`Mh"@6D& 418~c]3LcD KRĚ/K iaܴ0}.y3.)b^YO'Nԕ#ф)OduE9 |0aE 7>PDݪ*r;A_ 1=˥vhXKJȀ&*j!jS6xh/JNj2~E  ;җ O?f7GO|FxhZK@Ki!V 22#=꛵5}i;D/orw5+:d=L%d_ Dы_LS2F~'H%k&/Vѫ:)dWd@N\$Jk5aƧcjeuohezTKý[ɨ h"JKSv83pi/ҶىQӢ",aaxqI2muYD/B b:'Jv FveEU;H'ꠗad c(> 5Èң꾳&(çm Sf2 XJ̨]Wh;$'[bkGRnyUW ǔ&i4`M7qQB陥aa(z[M2P8i K HTWW_766[aQQ7kĺ} 6D& }`-1ML :?Ĵкub!^1.vJQX#41ECX*rJZkTe }`-qMh"@FVrJC W/HD ! #R 410JC W/HD! #Ҍ&]x^{~`)tt!^b,a_Q>X*mkއ_̄ Z~KƤKv.&Ui,\(qM§p4K4AYuGk!wd* Q)SmdK]-{y0/STNzJn4Cj|nf.jëk.tiD!I+L @3ҡ订&F fBjC 0@І4ӬQ.I|M}k\ āƚsX(5 'hP'BvD:2UZ[Tuu܌aTf TtWn5 b'jұ^J̀z1 ugD ԞNG$YEAB'[L߹L0ZthA蜬r'߼f 4G͈`U4GeEDE>ܖkN:N$PyrQ'JT#J3*ѢdPTYa7w37-/ðV(/He!rIJ{uf;%^@1|E#&[ ,#ĎXKL@VZX%>`Mh"@6D&M&VnQr@Qh[kW}ly E 6rMD'Z?O}KO %:ТOHKщI`[zJ(- !U~[`Mh"@6DDǢM3#ޯXߐѾ%z)~g7пOiV$]xޛ/MQP~U蠾 F]ֆzӠj/0@|+@ڜ ] U~1~"+.=t{2oJηBn"}oyLkٷ1K Ϟz׆]:7̒%Þ6eCJI|J J3Umbyݲ S^ң ee=aLں)Vy׽Y6ɯvNΈnfo[KO8El해lZ]{^J[ʅGWak>X0(nfR9hakʳSƯ pΣmN8Ɖ^yǑI^Rc']WV( ;6{pnҧaZ}:Cff^O42#O1n B 2d[[ֹd;zu.H~>ӖGewSu7;덹W?KL~<րk=r,}~=t= ߌvRYcu)*WZNM6[F[(Ϡ* rz*u&bKzۃpvmo^+Ʋ;܉y4sTw I- 1.Ё"i">}VcbZ,ꈣ.itEV^%?CRO/HjE!.üՏ%$4{L fӖyETzzi #3}s['ߨU':i P+"╸ ,ZK儼^PߥG0r%n5ߗprYJE[?>} HxQ4dBdҬC~i4HaG%$٠5zp Z/yƜd陾9ib,fT|wͤuG fרU(mwIۮ=QByb0Z:iK]!K2:6v6ڒOG W#+S&;B>-9PSC7t"|i? =Z r :4Q|3b-bw#>HkC=@aH*ƚ_DQZ6'U_qN++ocbOS]AB[:6H[ԇ%(ɧRRf/0.i綍Ǵn{7]Ǧdv*?ci+=7n?COy}4}3b@׆] d%d! jmju qb\gi+: f}|G]&ɺZK0힗\C&űS^[t6+ʞCPO 7ϯ!8d+RbY VǨYWHG\;J3a9So4}_71+G}r@uϣ~. ?QZ)r1a\kԇIX#[ lՆ.'^V`;8 63G]t0aNW }O}\[۶\>VѻK[55:ؚf\BT;{#1[C,*X6[ee>s!-dh" mfm/@P2@6D&ZX|҈߷Fm.GiW5VW`<l 4:Sق3o8 IV?}2_IENDB`savi1.6.0/manual/images/savi-rosette.png0000644000175000017500000002611214423445060017314 0ustar lloydlloydPNG  IHDR',IDATx}aɓ Ńś׼^=b @1 )[lOˬsl'Wڮꮙ=CoOwuuok{ckW:k5⌌ N׭n@nWzӴxUק's~}\n*Ѻi?meZs7MJ7mE\|[ƭ|m+B3LZ6˸>)[6m"K*w A*]7s_x/b7,JxP=W._|xggĖOً7[qf|cn)nxg=.:F<~Kn8ZLwѲBjuW\ٻ/_<~*n?oxM8vLS!`Wc֦穾o߸]ß:X;cw8W<o[wB{_W\wm:}}O'q=x1W<9zm'~D<. 'GGxϯy~KDzY^ {$,\V#XK997W x8gM8#SZ‹5߹G.U@V\K,#Edk~tճ*75?i1z}{"1G;>ok׋?_プ韭 V]%g~6{ǷZd?.{49W^@Nr޽<#n~sw=b-HZ%mݏ{q ^yL'w$gx|񁆜󹓿)3Ն{6__<{X.vЗPΩ[vr6iǿvx<'!x>L<^u\CrN}}㼯Map9MuӋ/-ܲLXc*x;1Zw}XmOS w9hYxsgqA%гyyT|ǣDYz翵ǜ-=[OI#5xSb]uhl_֓GS^{8Hx\/D6v~O^[@Y_'vshnȯĹ[+ʣ_ݚUMɁխv"apɓ^wzr@{ erS|+'׭j^5kϋήMZo#ԛ-~sy ~k3c]9D䥭ا^Ys"a՞&D֧/4yf!/mEªl;UC_S>N5K[oɫ[Srl+/m}cQ6ZR?EpE/T;l2{YKE.*F[!^ ճk tV5:c`[Y7'O^zĹWx Wx Wx Wx Wx W5:mv{v-P"+<5nWD˒e}'2Uᅣݮ< v_x`dάGmQ2<@F ]dB]޽21WMnM-KYWxE1h1+k%AU*zUkMSR83z0^-dV \яrڒUoN.T^Tj©e?}j3I23Du[L]%5%C3U8Fу;NJ^`&,de,ǯp L 1YΣsU:e6 (.Lz0^%}hB]1eQc~5;.R1n^˧Q؟%R;lhpnCQQ=j}fMZs@c ,Taz&-`D_~{D]=k`p5{Vnvʈ*&._jz@ J7] ^  ^  ^  ^;=ns;0T+<5nWD˒en%^n /v)S_<+#(vf>lCxJM$c'[![6+5ѕ](@}SA@c_{T88ދ&U: k41aQT K TxMs06Sےv>SDe\7V~bcP+QII=uI)5X0gk {6)S L:hL^g}susP%^͖ 3S*Djݼ+`Y2)Xebb" V9VxeLX2b!s/D_oX]5rUOԆ. QUmFQmO/LG.T9r5탪_W?:.X~yݬ氳< y$*]=k`p5|vkO٤,K /Y4?Pt[n5fI9)^\bbVtWJ? ^TMW44g8S(83DZwA>'F ^1T+A@+A@+A@+AGi&vPl6]i4_c/Smp t;gxhOqWu`j:O},C'RF#(vfN呡ZNְ=C$c'[![65i$8zjNmKەL}TYqX22-G)AHZݥJ"޳g{QA;i:٤lθ}1+ $e_}JqHxMj&-lL-ʛ:r_T uf![Xtb&*)a={JxA_o֢{9y(d++ݍYw`o`5f['Y@WEPA7guSKy\jedɳ뗶%lҎKS\RSKs@~g0$0]=k`p5I9[]YllK /V&wf7[ Y!^bbVt^Q9M9۞% V.m: U t{t&PQ+$f? ^N3PT ODZwA>'AcWx Wx Wx W]Fb=ky9fkW'{Cv`qS=֥}ަM+Vll]H=f3uh4_sϴ/&o @!(F}'S5jx W jֹ(W-џWeyī'smHOv2@o#^qoY1SYMף'Reu-@g _F0c`{(g,z|6ns;p"Q+[^qCU~Zn6 F562UƉ f(# ʌxEYDKXE,HR5i_T G@+J+xE^~&*ƙ@zs !^+aA^\I]Й@E=-ka#$QgFMuhZΏ=KV 1>Zy24g8S(}*w'Sjg|*ػ z C8'`lzkێc Z10R:0fx-w ;PųI˙BCv$)v>ЄLΤB졙֮50~ÌAλ6@8K$X|eբGV>BD@+|^ݲi  OfU(F562UƉ [W? G]x tȢ!Y.dx ^R}Ȗ txO(}A"D"^:V>nY A A Aՠ"GՖ3`C޵ 311*2> b9OB66a۔T;=79*ZajfD/:.L^޵(v^,5E8Cs3u"^~F8.@VyRZLv8 bZ֮50~ÌA^w$wJ$X|eբ_) E" ^  ^  ^7>ZDWxj6ݮB4 ǯ6NL8~x?3pUL}@,ؙ !J(5lчl@׸D_KUD xE^rPش˳@ ݝhνu_^Tvdao^@zXمG$,Pū>*IfW88e(KM\J{6QT6u亩GƥNkl R}8@ǒwIϪq9㺩Gp/ jt>^￾}>䟇BͽAgU='p*UR >JkӮoTQhB|Q{hLLLw{J:h\뽕cPHVMuԉxuخ^ׯ3nE%1쥹㾧n.v@Q^CCpܻ3]=k`p5j3!}bfIqš^8AYAmVC{m*&._jurx"ݤjo*r+WZ \qgDu+9@ ]פÙQoz1^>Jf֒cM2{ܘWLѩ-0N'-`iy6O~< rM׉ VyYWp{-y-T琪O@yw@gE]@b贡9Ù EED_~{D ^n;}+|0fx Wx Wx Wx C}s/Omnx2fsh8~LUqbwW}d'A Lueu[ƁKڐKrHɄn /v)S_<ՎW5 -aVҴ}feJj%KZd2h~bg6(R(.:HZ`Z9i؎('lчlHf(F.<[ :q=~O>5Z(*S9[.؅hПz$^-g+& Z8t+TM[=y~Px/g->˨ŪKZf2#.[滯nܢ_vG'D?U;^kJfeRrҳګz,ꌁ%=%^џ*T{Po[9N?^*;W9/|T9 ^ ApxE1 %UW;ܻ3"^. 1 tМL݆Wx/m? n>A ] >HE@+A@+A@+A@+A@+A@+A@+A@+A@+A1 D'?>9.s﵀D~/M ;6!4cWI #^K!5uf=%+xk<>]kJZ,>M!֮50~ÌKuJPI!UL,]jz Wx Wx W|(\^Ƈ] tBJlv@?h4ݮ:$xCtc8 A AdzMLLL.*m4 PˆPQS1K[9߸llfcThL-߾>7 WcKVOCL=f)ou _2Wj+Wi٨(wʤ̺Xǫٞzp|tκ9qWs]PnsI2^>q?|xgnTޕ;6Rf.]!abX ^ x+kf cWo7ν@+A@u&=E@AFbb-7ν@xkŭw:VW/خAHb땳zfaf_UGøkV/Aȹ5N@ +A@+A@+ן⁧QLϻʳUQk{VC?:}l|xZ^zWNdw?;FiASJyUKr1}AI/}jefa{rVϾ]Zٗ,MG5})6P؁)^Ż|;^T?{⹟~Ԧ7@9CQQZFpOī^q1+X@/}9u!}cz$F%_svjmc$g!b8ͻ*QT7{rR!BƝ2IPHb5nG?xyһ>5G=J}YYBE^x`WS?+l{yek_=׶@nJmzGxś;#vR槷=zGro\ƵkSlU,jyaxK pgb+Q߯؎$Id?#cSRͣrф9^w| Ice|?R=}&~->G(euePU_hXow7b->׸̢8ūYyR]_k-QcO~(Zedsй|r`w1ZlIJ?4wוQTOx#֦>~zdW`t%5߷ߊ7/Ƿd:3{M-6XXQ؏2Ⓢ;~`ebup\8{gSHe2_13O9Vs{o~(zjJQ˚tRqϝUqVMh; ^0h@g\(Ruz-8COQZ񪈏Q"uQW_,!Ikd/qw+]w?@MT#zD43kQ9]BXT/&:=J}Y@;6Pg|OW)^U yܼC$(o>6#ޔFcƵKF^MuK>GGX:tx叵O->uʺQkd/qwIWWjɁǝ-Ռ.y]*^BXTOlb ˶擵pYH ѵO4ށSfMK^Z"^{*w>⑛.k!"T;ˌkOLbu.}yqQCN8/Pl{FM]dFw& udz^YZ7\pew6gkSow9$2 dل'FFQ˚.:y~Cߏ5Vޝqe]=k`p5Q'C{mVJŋoZ땹̯Q*\#SJ!DWZ- A A AD@ܹEh{:VW3 ufz ʽFpɏLɫ}r_+d kkԬCXG _XD]iIENDB`savi1.6.0/manual/images/savi-spot.png0000644000175000017500000000107014423445060016610 0ustar lloydlloydPNG  IHDRagAMA abKGD pHYs  ~tIME;IvLIDATxk@%*j,b%tC2g4tTu-t?Х@.:gJ␂ 5Tl"uy[{jXKmQ!NyƢwtH W8¢Ng#DOjE"x HT^m9W5? Y!IENDB`savi1.6.0/manual/images/savi-empty.png0000644000175000017500000000541014423445060016763 0ustar lloydlloydPNG  IHDR;ؒ IDATx{\LJ'ORh#jT4J0Db|A1ѨW>B@ U-J&+T$ѨQl, h1jCĦV݋wex}g9wgװ AefFArss].}L?.]j\%A^ZxZ Ũ.EO eaxUTbXwդ)NĐ*]^SQ"O;Ayb('(. \SNТko][P,#a݅4=d+BcZ/wzzaDH+bs_gRc_լ3g>eTF!@ѳե@| Jj`.s/oFl8Ӫe8?Ie-?t=Գk6 akܑ4I:c1Ã21!^UJ|t&mm[4+6/]{S YWo.u!nG% V]#n(* ycq[#96Wz:}ۼT ^pl.Kb:;NcPc6)8UuxcOgū{XdOxfoĮQ+^SV0kYUE٦G&7.\ý2,g:[?pDy(vXΥw#٥V kJsvfTY5`ʽLyeƒ al>1]HXZ:eK{4MV͂=+F*ݕq>~ș[W޺p0ǃ M{ ĖCus.fqh+Щ"5x+ԫ;o8Q<;"aM;S 尸bZQR wݙ5 Tn؃kXpD9VK ǭ'~j3|xxPb%8 }Vmw,!|kd(xB6i*y%mc<ƾ~z mrCax<(nMe Dh3)s/žcĺCFSDi!=(Wp挚->W<(|J2+7<ڮ{̅X*㊮O-[yk= N0ҽGh[l:Nk gcvmx-N}e4뉯KoV2qmd$Xd ũߧx'D 4(Nnqqq-ߐZ"v #-JAZx/p?N? hYђ< SUesو~zu5"/VLO/+$anHϘ pI.8qjn1ba/1붨T,,]QA9GGY׎H}9}%x;RNxLT?'KX퓏._<Ve, MH.%2t9D=jPg#Qֵ#Ru}p$'ʾ>p:VH<1PN. Dz SaVi satellite constellation visualization - user manual

SaVi logo

SaVi - satellite constellation visualization

User manual

Contents

  1. Other documentation for SaVi
  2. The main SaVi window
  3. The coverage panel
  4. The fisheye window
  5. Further hints

1. Other documentation for SaVi

This manual introduces SaVi to the user. Descriptions of the satellite constellations that SaVi simulates are provided from the Help menu.

Other documentation is available for SaVi in textfiles supplied with the SaVi software, which can also be read from the Help menu:

Further information on SaVi is available on the web at http://savi.sourceforge.net/ and http://personal.ee.surrey.ac.uk/Personal/L.Wood/software/SaVi/.

Support for SaVi is provided via the savi-users mailing list.

Geomview provides SaVi with three-dimensional rendering capabilities. When using Geomview, the Look, Fly and Orbit buttons in its toolbar are the most useful; the stationary axes allow you to see the Earth rotating against something fixed as you orbit your camera view around. (Rotate leaves the cameras in all views fixed, while rotating all objects; Orbit allows you to alter a single camera window.)

Documentation for Geomview, describing the many features of Geomview, is available separately on the web at http://www.geomview.org/.

Note that SaVi has a number of simple command-line options that can be seen by typing:
./savi -help
which provides brief summary documentation of the available options.

Below is a brief guide to the main features of SaVi's graphical user interface:

2. The main SaVi window

The main window is where satellite parameters are edited and where Geomview (if it is in use) is controlled from the Rendering menu. The simulation is run forwards or backwards in time using the >> and << buttons on the playbar at the bottom of the window. > and < step forwards or backwards a single interval of time; the time interval between simulation steps is set to a default of sixty seconds, and can be changed here.

SaVi's main window
Main window - to see this, launch SaVi.

Resizing this window to make it larger, so that you can see information on more satellites at once, is a good idea.

Double-click a line listing satellite parameters to open the 'Edit satellite parameters' window and edit values directly. Press return after entering each value to update the satellite and change the simulation. A custom list of edited satellites can be saved for posterity as a script to be loaded in again later - see the File menu in the main window's menubar.

Clicking a line listing satellite parameters highlights it, giving it a purple cross in the Coverage and Fisheye windows, and a yellow surround in Geomview's Camera window. Control-clicking a line adds it to or removes it from the current selection. Shift-clicking a line includes the range of satellites from the current selection to that line.

The menubar's Edit menu allows you to copy or cut selected satellites, or edit existing or new satellite parameter lines, via an edit box. Like all SaVi windows, this edit box can be left open while other windows are active. The edit box will always show parameters for the last-selected satellite.

SaVi's edit box
Edit window - to see this, use the Edit menu, or double-click a satellite parameter line.

Individual satellites and their coverage can be hidden from view here, by using the checkboxes.

Simulation constants can also be edited from the Edit menu. Altering these from Earth normal is not for the faint of heart.

SaVi's simulation constants
Simulation constants - to see this, use the Edit menu.

The menubar's Views menu allows you to open the coverage panel and fisheye windows, described further below. Opening the coverage panel is often the first thing that you do upon launching SaVi. Other options in the Views menu duplicate the playbar at the bottom of the window, including the 'Restart' button to reset the clock to time 0.

The Constellations menu allows you to load in simulations of known satellite constellations, both existing and proposed. You can also empty space by deleting all created satellites, or run the rosette generator to easily create a custom constellation. The simulations on this menu are split into several submenu groups:

  • geosynchronous constellations, where groundtracks repeat over themselves.
  • systems using elliptical, rather than circular, orbits.
  • systems using simple rings around the Equator.
  • systems using Medium Earth Orbit (MEO).
  • navigation systems, which are also in MEO orbits.
  • voice telephony-oriented systems.
  • remote-sensing systems viewing the Earth.
  • low-rate messaging systems.
  • current "megaconstellation" initiatives, under construction or proposed.
  • previous large systems proposed in the 1990s, but not constructed.
  • other systems.

Also available are:

  • various other proposed systems.
  • constellation generation tools.
  • sample TLE (two-line element) files. Although SaVi does have TLE parsing capabilities, simulation from TLEs of different epochs is not at all accurate! This is considered experimental. Up-to-date TLEs can be loaded from the web via the command on the File menu.

SaVi's elset loading tool
TLE loading tool - to see this, use the File menu.

Decriptions of these systems are available in the Details window that is always accessible from the Help menu. Many of these constellations are described in material introducing satellite constellations.

Note that loading in a constellation from the menu replaces all existing satellites. To add a constellation to existing satellites that you wish to preserve, use Load... in the File menu, and load in a Tcl script from SaVi's data/ directory.

Rosette constellations can be easily created using the Ballard rosette tool, which can also generate a number of preset constellations.

SaVi's rosette generator tool
Ballard rosette tool - to see this, use the Constellations menu.

To save an existing constellation you have created, such as one generated using the Ballard rosette tool, use the File menu's Save satellites as Tcl script... option. To begin from scratch, either delete all satellites, or select Empty space, and confirm the dialog that comes up.

SaVi's 'Empty space?' dialog
Empty space of all satellites dialog - to see this, use the Constellations menu.

The Rendering menu includes a Real-time mode option that attempts to synchronise SaVi to the computer's clock, so that an interval is simulated every second. If you set to 1 second per interval, SaVi attempts motion in real time. This mode option is most useful on very fast computers.

The Rendering menu is complete when SaVi is running with Geomview. The full menu allows you to control how Geomview shows the constellations in its Camera windows. To change the satellite type shown in Geomview, select a marker type from the sumenu at top. To restore the default green dots, select that marker type again.

By turning off Show central body, an outline Earth is produced. This is useful when used with Geomview's spherical projection (in the Geomview window's Space menu.)

Animate in Geomview can be turned off temporarily if Geomview becomes problematic, so SaVi can be used standalone. This option is useful on slower computers.

The Help menu identifies SaVi and provides brief installation information.

3. The coverage panel

In the coverage panel a map projection of the Earth and visible coverage is shown. It is likely that this will be the first option selected once SaVi is running, and that most work will be done using the menubar at the top of this panel's window.

The Earth map can be either large (1024x512 pixels) or small (600x300 pixels) in size. The large map is the default, but can be changed from the Display menu. A custom map size can also be selected. This does not support the bitmap Earth map in the coverage panel, but provides more fine-detailed coverage texturemapping to Geomview.

14 map colors is the default; more are useful when viewing large numbers of satellites, such as the navigation systems or megaconstellations. A minumum of 4 colors is recommended. The number of colors is chosen from the popup menu below the map. If increasing the number of colors, select Blend colors from the Shading menu to produce a color spectrum.

Here, the smaller coverage panel is shown, with four colors selected.

SaVi's coverage panel
Coverage panel - to see, use Views menu on main window.

Stretching this window horizontally will show two projections side-by-side; this is useful for looking at coverage at the edge of the map, which lies in the middle of the two copies.

A number of different map projections can be chosen:

  • The unprojected land/sea map is colorful, matching and enhancing Geomview's simple static world map.
  • The default unprojected map is most useful for examining coverage, and for saving maps as files to show to others.
  • The spherical views are a poor substitute for running Geomview, to gain an idea of 'real' coverage on a globe.

Other map projections may be optionally enabled, as indicated in the README. These include:

  • The cylindrical map shows high latitudes and poles less clearly than the default unprojected view does.
  • The sinusoidal views may be of use for examining coverage in the map centers.
  • Any other experimental projections.

    The unprojected views and the cylindrical view can send their maps as texturemaps to Geomview to draw on the world sphere in its camera. This texturemapping feature is controlled from the coverage panel's Rendering menu.

    The number of shading levels can be changed directly using the shades popup. After increasing the number of levels, you will want to blend between end colors from the Shades menu to take advantage of the new levels.

    Clicking in the map sets coordinates that are passed to the fisheye window, and can then be selected in that window to replace the current coordinates in use. This is a two-step process to prevent stray clicks from inadvertently changing the fisheye. To change the fisheye in one step, control-click the coverage map.

    Satellite coverage (which defaults to yellow/red) is intended to give an idea of the number of satellites visible from a point, or available diversity. The higher the number of satellites covering a point, the deeper the shade of red.

    Interval decay (which defaults to shades of blue) is intended to give an idea of where a satellite footprint has been and is going, even when you look at a still map snapshot. Turning this feature off replaces blue with white.

    The sunlight checkbox shows a day/night terminator, reusing the last two interval decay colors. Sunlight is simulated as a 'special' satellite zero, shown at the start of the main satellite list when sunlight is turned on. Sunlight begins with time zero as an equinox.

    Map colors can be controlled to taste by the Shading menu or by clicking the color wells in the key individually to launch a color selector. 'Change shading' and 'Shade between end colors' will always produce ranges of tasteful hues. To alter just the coverage or interval decay colors, uncheck the 'Show coverage' or 'Add interval decay' checkboxes before using the shading menu options.

    Satellites selected in the main window will be shown in the coverage panel as purple, rather than green, as will their groundtracks.

    Still and animated map snapshots can be saved from the File menu. These are saved in .gif format. Stills can also be saved using the simple ppm bitmap format, and .png if it is supported. Map animations require gifsicle to create.

    The coverage of all satellites is controlled in the coverage panel by angle, pop-up menu, and slider. The angle is between 0 and 90 degrees. The angle can indicate either:

    • the mask elevation. This is the minimum angle above the horizon and through the atmosphere needed to establish communication with the satellite. This is measured from the ground terminal.
    • half the angle of the useful satellite beamwidth, referred to as the half-angle. This is measured from the overhead satellite.

    The default mask elevation is generally more useful, as it can be shown for the ground terminal in the fisheye view. A mask elevation angle of zero degrees is the same as a half-angle of ninety degrees when the satellite is directly over the ground terminal. The slider to the right alters the angle value directly.

    Computed coverage estimates are currently not accurate, and vary between projections, as they are based on counting from the maps, which distort the true sphere.

    The playbar is repeated at the bottom of this window for convenience.

    4. The fisheye window

    The fisheye window shows a view of the sky looking upwards from the ground, with the horizon around the outside of the circle. North is to the top of the fisheye. East is to the left, unless the 'Reverse fisheye view' option is chosen, since this is looking up. The default location is at zero point (zero longitude, zero latitude, zero altitude, floating on the sea just off the coast of Africa).

    SaVi's fisheye window
    Fisheye panel - to see, use Views menu on main window.

    The fisheye window is completely resizeable, and will scale the fisheye area to suit. A larger fisheye shows a large number of satellites in view much more clearly.

    If ground terminal mask elevation is selected from the coverage panel, the mask circle will be shown, and the time a satellite spends in view (i.e. within the mask area) will be indicated next to the satellite. Note that times are only accurate to +/- half the simulation interval, assuming that a satellite began moving in the fisheye outside the mask area. Setting a smaller simulation interval provides more accurate time-in-view estimates.

    The equatorial geostationary arc can be drawn along with selected latitude markers, or parallels. These parallels default to 3.5 degrees of latitude, which is the limit of the geostationary exclusion zone, where frequencies used by geostationary satellites cannot be reused by other satellites, to prevent interference.

    Enter new coordinates updates the fisheye to use the values in the white text boxes, which will be copied to the actual coordinates shown higher up in the fisheye panel. Use this feature to determine how many satellites are visible from a selected point on the Earth.

    Reverse fisheye view switches East and West, to give an idea of satellites moving over the Earth. This can be compared with Geomview's spherical view with the central body turned off, mentioned earlier.

    5. Further hints

    The best, most accurate, way to simulate a custom constellation in SaVi is either to:

    • write a Tcl script, similar to the existing Tcl scripts in the savi/data directory. Discussion of Tcl and the SATELLITE keywords specific to SaVi is outside the scope of this note - but much can be learned from reading the code and comments in existing scripts. Further information on Tcl is available from http://www.tcl.tk/
    • improve the TLE-handling code in savi/tcl/constellations.tcl so that it works more accurately, by staring at existing FORTRAN code and translating it into Tcl. That is likely not for the faint of heart.

    The background color in Geomview is set at the start of savi/oogl/savi.oogl, as three fractional values between 0 and 1, representing Red, Green and Blue.
    0 0 0 is black.
    1 1 1 is white.

    Geomview can have multiple cameras open showing different views. Scripting of camera actions in Geomview (using its oogl object-oriented graphics language, which is a variant of lisp) can be very powerful.

    Notes on sources and for and details of simulated constellations can be found in the comments to each constellation script. See the savi/data directory, or use the View Source... button at the bottom of the Help menu window where details of each constellation are displayed.

    Use SaVi with Geomview 1.9 or later. This is strongly recommended.
    Use the latest Geomview release from http://www.geomview.org/.

    Further information on Geomview is available on the web at http://www.geomview.org/

    Further information on SaVi is available on the web at http://savi.sf.net/


    Lloyd Wood (lloydwood@users.sourceforge.net) savi1.6.0/COPYRIGHT0000644000175000017500000000574314423445060012741 0ustar lloydlloydCOPYRIGHT FOR SaVi ================== $Id: COPYRIGHT,v 1.29 2017/01/02 06:11:31 lloydwood Exp $ This contains: 1. Additional copyright for the SaVi 1.2, 1.3, 1.4 and 1.5 releases. 2. Original copyright for SaVi 1.0. 1. ADDITIONAL COPYRIGHT FOR THE SaVi 1.2, 1.3, 1.4 AND 1.5 RELEASES =================================================================== Enhancements to and modifications of SaVi 1.0, expressed in the SaVi 1.2, 1.3, 1.4 and 1.5 releases, are: Copyright (c) 2001-2023 by Lloyd Wood. Lloyd Wood maintains SaVi, and welcomes bug reports and fixes from users. Contact Lloyd at: lloydwood@users.sourceforge.net. SaVi continues to be provided "as is", and no warranty or guarantee of fitness for use is expressed or implied. Use of SaVi images must credit SaVi. Suggested references are: - L. Wood, SaVi: satellite constellation visualization, First Annual CCSR Research Symposium (CRS 2011), Centre for Communication Systems Research, 30 June 2011. http://arxiv.org/abs/1204.3265 - L. Wood, P. Worfolk et al., SaVi - Satellite constellation Visualisation software, http://savi.sf.net/, 2017. 2. ORIGINAL COPYRIGHT FOR SaVi 1.0 ================================== SaVi by Robert Thurman (thurman@geom.umn.edu) and Patrick Worfolk (worfolk@alum.mit.edu). Copyright (c) 1997 The National Science and Technology Research Center for Computation and Visualization of Geometric Structures (The Geometry Center) University of Minnesota email: savi@geom.umn.edu This software is copyrighted as noted above. It is free software and may be obtained by emailing savi@geom.umn.edu or contacting the authors. It may be freely copied, modified, and redistributed under the following conditions: 1. All copyright notices must remain intact in all files. 2. A copy of this file (COPYRIGHT) must be distributed along with any copies which you redistribute; this includes copies which you have modified, or copies of programs or other software products which include this software or portions of it. 3. When distributing modified versions of this software, you must provide notice clearly stating that it is modified software and that the original software may be obtained freely as noted above. When distributing other software products which include this software or portions of it, you must also provide notice that the original software may be obtained freely as noted above. 4. There is no warranty or other guarantee of fitness for this software, it is provided solely "as is". Bug reports or fixes may be sent to the email address above; the authors may or may not act on them as they desire. If you use an image produced by this software in a publication or presentation, we request that you credit the Geometry Center with a notice such as the following: Figures 1, 2, and 5-300 were generated with SaVi, software written at the Geometry Center, University of Minnesota. savi1.6.0/oogl/0000755000175000017500000000000014423445060012375 5ustar lloydlloydsavi1.6.0/oogl/earth_vect_h.oogl0000644000175000017500000000152214423445060015712 0ustar lloydlloyd# SaVi by Robert Thurman (thurman@geom.umn.edu) and # Patrick Worfolk (worfolk@alum.mit.edu). # # Copyright (c) 1997 by The Geometry Center. # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # Earth sphere and vector map descriptions. # $Id: earth_vect_h.oogl 8 2019-01-24 04:33:00Z lloydwood $ (read geometry { define earth_vect_h < "$SAVI/oogl/earth.vect" } ) (read geometry { define earth_vect_clear_h { LIST { appearance { material { edgecolor 0.6 0.6 1 } } {: earth_vect_h} } } } ) (read geometry { define earth_vect_sphere_h { LIST {: unit_sphere_h} {: earth_vect_h} } } ) savi1.6.0/oogl/earth_coverage_unp_h.oogl0000644000175000017500000000011214423445060017420 0ustar lloydlloyd(read geometry { define earth_h < "$SAVI/oogl/earth_coverage_unp.oogl" }) savi1.6.0/oogl/earth_coverage_h.oogl0000644000175000017500000000010614423445060016541 0ustar lloydlloyd(read geometry { define earth_h < "$SAVI/oogl/earth_coverage.oogl" }) savi1.6.0/oogl/stars.oogl0000644000175000017500000016233014423445060014420 0ustar lloydlloydappearance { material { edgecolor 1 1 1 } } { LIST appearance { linewidth 4 } VECT 15 15 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -13.1 65.7 -20.1 -4.4 42.2 -55.7 -54.9 -36.9 23.0 -26.2 -21.9 -61.1 8.8 -53.9 43.8 9.1 47.8 50.4 13.7 67.9 -10.0 -29.3 63.3 6.4 34.5 15.7 -58.9 1.5 69.4 9.0 -29.7 -17.8 -60.8 32.1 -61.2 10.8 24.1 62.6 19.9 -24.1 -57.8 -31.2 -64.0 -24.9 -13.6 0.8 0.8 0.8 1 0.8 0.8 0.7 1 0.9 0.8 0.7 1 0.9 0.9 0.7 1 0.8 0.8 0.8 1 0.9 0.9 0.7 1 0.8 0.8 0.9 1 0.8 0.8 0.7 1 0.8 0.8 0.9 1 0.9 0.7 0.5 1 0.8 0.8 0.9 1 0.8 0.8 0.8 1 0.9 0.8 0.7 1 0.9 0.7 0.5 1 0.8 0.8 0.9 1 appearance { linewidth 3 } VECT 207 207 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -27.4 55.4 32.9 58.6 -16.4 -34.6 -34.6 -7.3 -60.4 31.9 -37.5 49.7 -26.2 -21.9 -61.1 -60.5 32.1 14.5 -15.5 59.3 -33.9 -23.8 54.4 37.0 -31.5 -3.7 -62.4 -23.8 54.4 37.0 -37.7 -5.2 -58.8 -6.4 -55.5 -42.2 10.5 68.8 7.7 9.0 60.8 33.5 -18.1 16.1 -65.7 7.2 69.6 -1.5 42.2 -22.4 -51.2 -38.1 -9.2 58.0 -25.4 40.1 -51.5 28.3 35.1 53.5 -32.1 8.1 61.7 -18.4 59.9 -31.1 6.1 -57.4 -39.5 -20.7 28.9 -60.3 -40.7 -20.6 53.1 -5.1 -50.9 -47.7 0.1 49.5 49.5 -7.7 -23.8 -65.4 -11.0 66.2 19.8 22.8 -30.9 -58.5 -26.6 30.4 -57.1 -6.6 66.3 -21.6 -54.5 42.7 -10.5 54.6 33.8 27.9 0.7 0.6 70.0 15.0 -60.9 -31.0 65.4 12.6 -21.6 5.9 69.7 -2.4 61.1 2.2 34.0 54.3 17.0 40.8 3.7 68.9 -11.8 -48.0 -29.6 -41.5 -14.1 -13.0 67.3 -7.5 -67.9 15.2 -31.5 -3.7 -62.4 45.1 -15.8 -51.1 36.0 38.7 45.9 -67.7 3.2 17.6 -45.2 -8.3 -52.8 31.1 -43.5 45.2 -37.2 34.7 -48.1 38.0 6.8 58.4 8.5 69.5 -0.4 -37.0 -50.4 31.5 -0.6 -43.6 54.8 -27.5 46.0 -45.0 -27.1 23.3 -60.2 44.4 26.6 47.1 35.9 1.4 60.1 -37.6 -14.4 57.3 -17.3 -55.2 -39.4 -37.8 -17.6 -56.2 -36.0 -30.8 -51.5 -40.4 -32.6 -47.0 -32.2 -56.0 -26.9 -37.5 9.7 58.3 51.4 5.9 -47.1 57.2 -38.5 12.0 -4.2 -54.2 -44.1 59.9 -15.0 33.0 -14.5 -65.8 -19.0 -41.4 1.1 56.4 24.6 -20.9 62.1 -21.9 57.0 -34.3 38.5 -43.4 39.1 33.2 8.4 61.1 65.6 -16.1 18.4 -31.0 25.5 -57.4 48.9 49.9 5.0 -41.6 -22.9 -51.4 -64.2 13.0 24.5 -24.3 -64.4 -12.8 7.9 66.2 -21.4 -66.6 -4.6 -21.1 -44.3 -1.6 -54.2 16.4 -58.4 -34.9 -59.7 27.8 23.8 -45.1 -52.3 -11.4 0.1 55.7 42.3 -31.6 -57.8 -23.7 57.4 31.4 24.9 5.1 57.8 -39.2 -63.5 -9.6 -27.8 -38.8 -57.7 7.8 32.3 12.7 60.8 -58.3 -31.9 22.1 -36.4 -35.9 -47.9 15.9 56.4 38.3 -43.2 14.3 -53.2 -24.6 -4.0 -65.4 -7.1 -55.2 -42.4 -18.4 52.7 -42.2 -46.9 -41.1 31.9 5.6 -60.5 -34.8 30.8 -61.5 12.9 -31.1 -62.6 -4.5 -13.6 -30.5 61.5 -52.7 -19.3 -41.9 -49.4 -45.6 -19.4 -28.6 10.0 -63.1 7.4 69.2 -7.2 -24.9 -60.2 25.6 -5.0 -69.6 5.6 -31.1 -42.5 -46.1 15.7 67.9 -6.2 -5.5 -42.5 55.4 15.4 1.7 -68.3 -36.2 -2.4 -59.8 -33.7 54.2 -28.8 -20.1 -56.1 36.7 7.7 -62.8 -30.0 -22.1 -57.6 -33.1 67.4 3.9 18.3 -66.2 -18.4 13.3 9.0 64.8 -24.8 31.0 50.7 37.0 -16.2 -26.8 -62.6 -6.0 -39.2 -57.7 29.0 16.5 -61.6 31.4 -14.9 -60.8 34.9 53.5 28.6 21.8 -44.3 49.6 56.2 -36.9 -19.5 -6.5 64.3 26.8 27.2 46.2 45.0 -16.4 -19.4 -65.2 -31.7 -54.3 -30.8 -26.4 -57.4 -30.2 19.6 -62.3 -25.1 -25.7 64.3 10.1 -53.3 -13.3 43.4 55.6 -42.0 -6.8 28.8 30.1 56.3 -9.6 43.4 -54.1 57.1 -19.9 35.2 34.5 58.6 -16.4 -66.5 -8.7 -19.9 -5.5 -44.8 -53.5 -24.7 16.2 -63.5 61.5 -33.5 -0.4 -12.1 62.2 29.7 -53.4 35.4 28.2 12.7 48.9 48.5 1.5 -60.3 -35.4 19.1 -65.2 16.8 48.4 30.7 40.1 6.4 65.0 25.3 -64.6 -2.9 -26.9 -60.6 -21.7 -27.5 26.5 38.9 51.8 -48.7 10.9 49.1 47.4 -29.1 -42.5 -5.4 60.3 -35.1 -17.4 61.6 -28.3 -43.3 -33.8 43.4 -2.9 -53.4 -45.1 57.4 39.9 -3.6 -45.8 -23.8 -47.3 -47.7 21.7 46.4 -25.6 -5.2 -64.9 -14.0 -16.8 66.5 8.3 -25.3 64.7 -16.1 -52.7 -43.1 23.8 -57.0 32.8 39.1 -55.3 -17.9 -48.2 50.2 7.3 -64.1 20.3 -19.5 4.3 -55.9 -41.9 30.1 -36.7 -51.4 2.2 56.8 -40.9 -44.4 36.9 39.5 -30.3 23.0 -58.7 -31.6 3.3 -62.4 -36.9 -36.6 -46.9 -10.4 -37.8 -58.0 -33.0 33.2 52.1 -12.4 -62.3 29.4 -10.9 -55.0 41.9 12.2 51.2 46.1 -8.4 50.3 -47.9 -34.8 26.0 54.9 -6.4 -28.1 63.8 12.3 -61.1 -31.8 20.9 66.3 8.5 15.3 62.9 -26.6 -22.5 -19.3 -63.4 -18.6 -66.5 11.4 45.1 -40.3 35.2 -2.5 -55.8 -42.2 14.9 -1.3 68.4 -33.9 -40.9 -45.6 37.9 -58.8 -1.0 18.4 -14.3 66.0 10.4 15.9 -67.4 -29.9 -63.0 -5.7 15.0 -57.0 37.8 -19.3 47.1 -48.0 appearance { linewidth 2 } VECT 897 897 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6.5 -69.6 -3.5 59.2 10.3 35.9 14.7 37.3 -57.4 -6.9 32.2 -61.8 -53.3 -32.8 -31.4 -10.5 -62.6 -29.6 64.6 -18.9 -19.1 -4.2 64.5 26.8 -44.0 -45.5 -29.9 -22.6 -28.1 60.0 46.0 13.6 -51.0 13.7 65.8 -19.5 -38.0 -2.6 58.7 -21.4 10.7 -65.8 -30.8 12.4 -61.6 17.8 -59.4 -32.5 -10.6 -49.9 -47.9 -29.2 56.4 -29.4 -66.1 13.4 18.6 -5.8 -38.3 -58.3 -0.3 -69.0 -11.9 14.4 29.0 -62.1 32.8 -16.9 59.5 10.8 69.1 -2.9 -13.4 66.9 15.6 -20.9 27.1 61.1 25.5 -65.1 3.8 -64.1 -28.1 -0.7 -31.5 -38.5 -49.2 27.3 14.9 62.7 -46.3 51.9 7.8 -67.8 -16.8 4.2 37.7 39.4 43.9 26.1 62.1 19.1 -30.3 14.6 -61.4 64.8 -23.1 13.2 47.2 19.2 -48.0 53.6 28.8 34.6 -46.4 -24.0 -46.6 -28.7 -32.0 -55.2 -27.4 -47.5 -43.5 38.0 37.5 -45.3 -3.7 -61.9 32.6 18.6 -21.2 -64.0 21.8 -24.8 61.7 36.4 7.9 59.2 -26.7 24.3 -60.0 -57.8 28.0 27.8 19.9 -66.9 -6.0 65.8 20.3 -12.4 -46.2 22.3 47.7 12.7 -57.1 38.5 52.9 45.7 3.9 34.0 59.3 15.1 -16.5 59.6 -32.8 -20.6 36.8 -55.9 -38.5 -44.1 38.4 32.7 -57.3 23.4 -57.7 10.6 38.2 -13.3 -66.5 17.4 60.7 -19.1 29.1 41.6 -13.4 -54.6 60.5 29.5 -19.2 -37.4 -38.0 45.4 5.7 -48.3 -50.3 16.3 -63.2 -25.2 -38.8 57.2 11.2 -56.7 39.3 12.0 -59.1 31.6 20.2 26.9 -8.5 64.0 25.7 60.9 23.0 -22.2 61.0 26.2 -37.6 -58.9 -4.2 -18.0 -51.4 44.0 61.8 -32.1 7.6 38.8 57.1 -11.9 -34.9 20.8 -57.0 -59.0 7.0 -36.9 -6.6 -67.2 -18.6 3.9 67.6 -17.9 -39.9 -27.8 -50.4 68.9 5.9 -10.7 36.1 24.4 -54.8 25.1 52.5 -38.9 -66.6 11.9 -17.9 -35.9 -43.5 -41.4 15.1 -23.9 -64.0 42.1 19.2 52.5 -28.1 57.2 28.9 -16.0 -52.8 -43.1 1.9 -20.7 66.8 38.7 -56.3 -15.2 -22.4 63.2 19.9 -47.6 -37.1 35.4 -36.1 -50.1 -33.0 -34.4 -3.2 -60.9 64.7 24.8 -10.0 43.3 53.9 11.0 12.8 68.3 -8.3 4.4 64.5 -26.7 -13.3 56.5 39.1 -34.2 33.1 51.3 -42.3 32.3 -45.4 -24.5 49.5 -43.1 -60.7 31.4 -15.0 -69.9 2.8 2.2 62.2 26.2 18.5 -27.2 32.3 -55.8 -21.3 -5.9 -66.4 -14.6 -49.6 -47.2 -4.3 -34.0 -61.0 -1.9 -29.8 -63.3 50.1 -13.0 47.1 45.9 42.0 32.1 34.5 53.8 28.5 43.0 -52.4 17.6 -27.6 1.7 -64.3 28.5 61.1 18.9 -68.8 -12.6 -1.8 -25.9 -15.6 63.1 25.3 -26.5 -59.7 40.7 6.6 56.6 7.5 68.5 12.1 -35.1 -49.6 -34.8 1.3 -44.9 -53.7 63.7 -14.3 -25.3 -25.3 19.1 62.4 -37.2 -56.3 18.6 -38.4 44.3 -38.3 -68.8 -12.6 -1.8 -37.7 -48.2 34.0 54.9 -38.4 -20.1 41.9 49.7 -25.9 20.6 66.6 6.8 -26.9 17.9 -62.1 68.7 -13.0 4.0 38.0 21.1 -54.9 35.5 53.1 28.6 -0.6 -61.1 34.2 1.1 67.9 -17.1 -46.9 2.9 51.8 -37.3 -59.0 5.5 33.5 -60.9 7.8 19.8 67.1 3.0 0.1 40.9 56.8 -52.3 -46.4 2.3 36.4 -34.9 48.6 41.4 -36.4 43.1 60.9 32.2 -12.6 41.3 55.3 -11.5 -25.0 46.9 -45.5 2.2 -69.0 11.6 42.7 54.2 11.8 50.8 -40.1 -26.7 66.4 -20.1 -9.2 13.1 51.1 46.0 -34.3 33.1 -51.3 -27.4 -60.2 23.0 -3.7 -69.8 3.3 -1.1 -38.2 58.6 33.8 -14.2 59.6 28.9 26.6 58.0 27.4 60.8 21.1 3.7 32.1 -62.1 -10.9 -34.3 -60.0 12.6 -8.7 -68.3 55.7 -29.9 30.0 28.6 42.9 47.4 -16.8 22.8 -64.0 18.1 -62.4 -25.9 13.8 -39.4 56.2 43.2 -51.6 19.2 46.1 -51.4 -11.6 41.4 -16.9 53.8 -6.9 22.3 -66.0 -34.7 10.4 -59.9 -18.1 63.0 24.6 -22.6 57.6 32.6 16.5 -40.1 55.0 26.4 -40.1 51.0 33.6 36.5 49.4 -30.5 19.2 60.0 -59.7 27.8 23.7 -40.7 -55.5 12.8 -40.7 -55.5 12.8 -4.4 -48.4 50.4 6.5 69.6 -3.2 2.5 65.4 -25.0 -61.5 26.7 -20.3 21.7 56.2 -35.6 -42.8 36.2 41.9 -33.4 14.2 -59.8 -26.5 -64.7 2.4 30.0 -59.2 22.2 48.0 -4.7 50.7 33.0 49.1 37.4 -55.5 16.6 39.4 -45.2 -25.6 -46.9 -9.9 -8.9 -68.7 2.0 -61.3 33.7 10.7 -21.1 65.9 26.1 62.0 19.3 -31.0 36.7 -50.9 -23.7 24.8 -61.0 -43.6 16.5 -52.2 -24.5 3.1 65.5 -35.4 -51.8 31.0 6.7 -64.7 26.0 63.6 -29.1 -1.7 16.6 24.7 -63.3 2.4 43.9 -54.5 -5.6 58.1 -38.6 -20.0 59.2 -31.5 -46.5 23.0 -46.9 -64.1 25.6 11.3 -34.6 -57.8 18.9 -13.7 -27.9 -62.7 10.6 -68.5 -10.0 23.1 46.3 -47.1 -45.7 -7.6 -52.5 -0.9 -55.7 42.4 3.9 -65.2 -25.2 53.1 13.4 43.6 41.0 45.5 -33.9 35.2 53.1 28.9 23.7 63.6 -17.3 7.1 56.6 -40.6 -14.9 62.1 -28.7 -21.3 -3.0 -66.6 -23.9 -3.5 65.7 -43.2 -24.6 -49.3 -30.9 -34.3 -52.6 48.8 2.0 -50.1 -52.5 46.3 2.8 -53.5 33.2 30.7 -49.9 -20.9 -44.4 -52.8 -45.5 -6.9 -31.3 -52.5 -34.2 49.7 48.1 -10.8 -40.1 6.9 -57.0 -69.7 -6.1 -0.8 -20.5 -43.8 50.6 -5.0 -12.5 -68.7 27.8 -50.1 40.2 -41.5 56.2 -4.8 33.0 -61.7 1.2 48.1 -10.6 -49.7 34.0 60.8 7.3 -32.2 36.4 -50.4 -57.3 40.2 -1.4 -35.2 8.0 -60.0 -44.4 -5.5 -53.8 -39.9 -54.7 -17.9 38.1 11.7 -57.5 -15.5 -58.0 36.0 52.6 -45.8 6.4 25.0 65.3 -4.1 -29.5 62.4 -11.6 23.2 -62.4 -21.5 50.3 5.8 -48.3 -43.8 50.1 21.8 -68.0 10.8 12.8 36.8 -37.7 46.1 42.3 17.8 -52.9 30.7 29.2 55.7 -10.5 65.2 -23.1 -9.0 18.9 -66.8 -37.6 -14.4 57.3 -31.1 -49.3 -38.8 60.9 -20.2 28.0 23.6 53.0 -39.2 0.2 51.3 -47.6 -12.7 57.6 -37.6 -26.8 55.1 -33.9 -42.7 -2.2 -55.4 -31.1 -57.7 -24.7 10.3 -17.8 -66.9 2.0 54.2 44.2 -36.7 43.7 -40.5 -37.0 36.8 46.6 -24.1 21.8 -62.0 0.2 -69.9 3.6 19.0 -49.6 -45.6 46.8 -19.6 -48.2 64.9 -10.6 -24.1 18.2 10.8 66.7 -4.5 69.4 -7.6 -8.6 24.8 -64.9 26.2 -39.1 51.8 36.2 -6.8 -59.5 56.6 32.7 -25.2 32.7 31.0 -53.5 -20.0 19.6 -64.1 -17.6 7.8 -67.3 -42.1 -35.9 -42.9 48.0 32.8 39.0 -42.0 45.6 -32.6 -37.4 -14.6 57.3 -18.0 -31.8 59.7 -30.0 -58.8 -23.3 4.2 -21.9 -66.4 17.6 -46.7 -49.0 36.6 -48.0 35.4 64.9 -20.6 -16.5 69.5 -0.2 8.4 22.3 66.2 -4.0 -40.8 45.8 33.7 -63.5 -2.3 -29.3 -19.0 -40.6 -53.7 17.4 -65.3 18.2 18.5 -67.1 -7.0 39.4 -29.1 50.0 65.3 -25.3 -0.1 8.4 33.5 60.9 -69.4 4.3 8.0 -36.9 -9.0 -58.8 1.7 -69.9 3.1 42.5 -53.9 13.7 28.6 49.0 40.9 22.0 41.6 51.8 31.6 61.9 -8.3 -30.6 -2.5 -62.9 12.0 -48.9 48.6 30.8 33.3 53.3 -68.6 11.7 7.4 -45.2 -31.8 -43.0 -34.8 -25.6 55.0 -35.1 -28.9 -53.2 -43.2 -37.5 -40.3 -33.5 -36.1 -49.7 62.5 13.1 28.8 -25.4 57.0 31.7 -10.9 -40.5 -56.0 39.9 19.4 54.2 53.7 44.9 0.4 18.7 65.5 16.4 -16.0 66.6 -14.6 -9.0 13.0 -68.2 -33.8 38.8 -47.4 -59.8 -31.0 19.1 -23.6 -27.5 -59.9 48.5 -46.0 -20.7 -28.8 21.2 -60.1 -64.2 17.3 -22.0 -65.9 10.2 -21.3 -57.7 -38.9 -7.3 50.8 -41.9 23.7 30.0 -20.4 59.9 47.9 21.5 46.3 20.7 14.8 -65.2 44.9 45.8 -28.0 7.0 68.7 11.3 -36.1 -55.9 21.8 19.9 16.6 -65.0 41.1 34.7 -44.9 41.3 54.3 15.7 -22.2 42.9 -50.7 -12.9 5.0 -68.6 -33.7 2.0 -61.3 -26.2 -2.0 -64.9 -16.5 -22.8 -64.1 16.5 -52.7 -43.0 16.3 -51.6 -44.4 42.5 -45.7 -31.7 46.7 -19.4 -48.4 34.5 30.0 53.0 -0.7 69.0 11.7 -18.5 64.8 -18.9 -57.3 36.0 -17.9 -69.2 -1.6 10.6 41.0 -10.8 -55.7 5.8 -45.5 -52.9 25.1 -45.7 -46.7 52.4 -35.1 30.3 49.7 -24.3 42.9 69.4 -6.1 6.9 20.6 41.7 52.4 10.9 68.5 -9.5 -32.5 39.6 -47.7 -35.8 -47.9 36.4 42.0 -47.4 -29.9 49.9 -4.3 48.9 -8.3 65.2 24.2 -21.6 66.6 -0.6 -30.0 -0.9 -63.2 -35.1 -57.1 -20.2 -31.8 -53.7 31.7 9.9 -3.3 -69.2 31.5 4.6 62.3 -1.2 64.3 27.7 -44.2 53.8 7.0 -20.4 -53.4 -40.4 62.4 -30.2 -9.5 30.5 47.6 -41.3 -9.3 -63.2 -28.7 58.6 -21.2 -31.8 35.2 53.4 28.4 -22.6 55.1 36.9 -40.2 -27.2 50.4 -51.3 -26.5 -39.6 -57.6 -37.7 -12.5 13.0 -64.2 24.6 34.1 -16.8 58.7 65.0 -21.5 14.8 8.9 69.1 7.3 -31.5 56.3 -27.2 -18.9 -48.1 47.2 21.5 27.7 60.6 5.9 69.7 -2.4 -51.7 22.0 41.8 56.7 -16.3 -37.6 67.8 -13.2 -11.1 26.0 59.3 26.6 2.0 -22.3 66.3 14.3 -68.3 -5.8 7.4 -31.8 -61.9 19.3 -25.2 62.4 39.8 -45.1 35.8 22.9 -18.1 -63.6 68.2 -13.8 -7.4 29.6 2.6 -63.4 40.4 37.2 43.4 27.3 37.8 52.2 35.3 53.8 -27.6 -52.5 -26.1 -38.2 -26.6 -49.3 -41.9 -21.7 -53.3 -39.8 -3.1 -9.2 69.3 27.3 -52.1 38.0 41.0 -35.2 44.4 38.1 -25.1 53.1 -22.2 41.2 -52.1 -5.0 -14.3 -68.3 38.6 -56.4 -15.2 4.4 1.4 69.9 45.3 14.2 51.4 37.7 28.2 -51.8 51.3 44.6 -16.8 19.1 39.2 -54.8 24.8 64.3 12.4 18.7 49.2 46.2 -29.8 41.4 47.9 -48.1 48.8 14.4 -55.1 23.6 -36.1 -13.8 -10.4 67.8 61.9 30.7 11.1 0.0 48.7 50.3 -12.9 -1.0 -68.8 -52.0 -7.7 46.2 -58.9 -19.1 32.7 -60.3 -35.4 1.9 -23.1 -43.8 49.4 -5.5 -68.0 -15.6 51.8 45.4 12.3 32.9 39.2 -47.8 38.8 52.3 -25.8 23.9 64.0 15.2 15.2 67.5 -10.6 -25.4 40.1 -51.5 -52.0 -12.4 -45.2 -43.2 -13.0 -53.5 -30.4 -35.8 -51.9 44.7 -50.2 19.4 59.8 -32.3 -16.8 66.7 18.8 9.6 55.3 41.7 10.3 40.9 56.8 0.5 25.7 59.2 27.1 21.5 60.8 27.3 -26.7 55.2 33.8 -37.1 13.6 -57.8 -58.1 1.8 -39.0 -25.4 -62.1 -20.0 51.7 -42.6 -20.3 49.4 -11.7 -48.2 68.9 -9.7 7.8 21.2 39.3 53.9 30.4 62.1 10.8 26.7 61.0 21.6 8.0 26.9 64.1 12.0 67.1 -16.0 -8.6 6.2 69.2 -8.6 -60.1 -34.9 -5.6 -54.4 -43.7 17.6 -46.4 -49.3 28.2 -18.7 61.3 26.2 -14.6 63.3 52.0 -27.1 38.3 54.8 -22.3 -37.5 50.7 -4.9 48.0 35.4 53.0 29.0 -45.7 52.9 4.2 -69.6 7.0 -1.0 13.2 -54.4 42.0 21.2 -32.2 58.4 59.0 15.4 -34.3 -51.4 38.9 27.3 -66.6 -9.4 -19.5 -34.9 -43.3 42.5 22.4 62.0 -23.6 -26.0 64.1 10.9 -45.2 50.9 -16.4 -30.9 1.4 -62.8 -6.2 -4.6 -69.6 -37.1 -34.5 -48.3 -8.3 -12.3 68.4 -30.9 -57.7 -24.9 44.6 -53.9 -1.3 38.1 12.2 57.4 60.2 35.5 3.4 -8.9 63.6 -27.8 -22.7 26.9 -60.5 -31.4 -0.4 -62.5 -44.7 -10.6 -52.8 -31.7 -22.3 -58.3 -29.9 -42.0 -47.4 -11.6 -67.3 -15.6 4.9 -56.4 41.2 -37.2 59.2 -3.6 -28.4 24.6 -59.1 -42.2 -24.8 -50.0 -39.3 -46.0 -35.2 -10.2 -69.1 5.0 55.5 -37.2 20.9 48.8 -32.6 -38.2 44.2 48.9 23.6 1.9 28.7 -63.8 -4.1 60.8 34.5 -9.1 35.5 59.6 -13.5 21.6 -65.2 -8.7 12.4 -68.3 -37.0 26.7 -53.1 -39.5 -29.3 -49.8 1.2 -31.0 -62.7 57.5 9.3 38.9 37.0 7.1 -59.0 28.4 37.2 52.0 31.3 56.8 26.3 20.6 66.0 10.8 13.8 66.8 -15.7 0.6 57.1 -40.4 -46.7 51.7 7.1 -61.2 -7.2 33.2 -44.9 -27.5 -46.1 -0.5 -4.1 69.9 2.5 -65.4 24.9 3.4 -33.2 -61.5 10.8 -54.4 42.7 13.5 -65.1 21.8 18.0 -52.0 43.2 28.7 -63.8 -1.6 43.5 -18.1 51.8 31.5 4.4 -62.4 60.2 10.2 34.3 57.8 37.9 10.8 -4.1 57.1 -40.3 -16.2 64.9 -20.5 -60.9 32.4 12.2 28.2 -60.3 21.7 28.5 -60.4 21.0 28.5 -49.5 -40.4 54.9 -6.5 -42.9 8.0 65.9 22.3 -66.5 -20.9 -6.7 -19.6 -66.1 12.4 20.1 66.7 -6.6 -6.4 41.7 -55.9 -35.6 60.2 2.8 -50.1 13.4 -47.1 -11.1 -64.4 -25.2 17.2 -51.5 44.2 7.9 -12.6 68.4 31.9 -26.8 -56.2 67.9 -12.6 -11.2 64.8 -9.7 -24.7 -9.0 40.5 -56.4 -21.4 59.8 -29.5 -35.3 55.9 -23.1 -48.8 -50.1 2.5 34.6 -20.4 -57.3 63.5 -9.7 27.8 69.6 0.6 -7.3 42.5 23.0 -50.6 7.6 68.6 11.5 1.6 65.6 24.3 -18.5 57.6 35.3 -22.5 39.7 -53.0 -58.7 10.8 36.6 -45.5 -41.8 -32.8 -8.0 -62.3 30.8 -0.4 -60.5 35.2 17.2 -4.0 67.7 58.1 -10.5 -37.6 62.2 15.9 27.8 38.0 37.5 -45.3 37.7 57.1 -14.7 -2.2 67.7 17.8 -63.6 16.4 24.2 -43.8 -31.6 -44.5 -35.0 -27.5 -54.0 -26.2 -61.0 -22.2 46.6 -51.9 -6.1 64.5 -27.1 0.0 67.8 14.6 9.2 30.6 62.3 -9.3 -10.9 65.6 -21.9 -51.9 -44.0 16.6 -38.2 -58.0 9.0 34.8 -48.0 37.3 44.2 -51.1 18.2 43.6 -37.3 40.1 39.1 -17.5 55.3 66.1 4.2 -22.7 63.0 29.8 6.7 15.6 32.2 -60.2 -7.2 69.4 5.6 -29.5 44.5 -45.3 -44.6 53.8 4.1 6.7 -26.3 -64.5 24.0 -58.9 29.2 17.7 49.0 -46.7 14.2 67.0 -14.4 -25.8 59.4 -26.6 -29.2 45.3 -44.6 -31.9 46.2 -41.8 -37.2 37.2 -46.2 -35.0 13.5 -59.1 -10.9 3.7 -69.0 -24.4 -60.4 -25.6 0.5 -70.0 1.6 6.5 -19.0 67.1 27.7 -63.7 9.0 43.7 39.8 -37.5 14.2 68.5 3.5 -48.9 39.4 30.9 -49.3 1.9 -49.6 -47.4 -38.0 34.7 47.4 -25.7 -44.6 47.1 -17.0 48.9 56.3 -17.1 -38.0 49.9 43.8 -22.3 39.3 46.9 34.0 15.6 24.4 63.7 11.2 39.9 56.5 18.5 67.5 2.1 -14.5 68.4 3.0 -68.6 13.1 -4.5 -44.3 -1.6 -54.1 -18.6 -43.4 -51.7 62.3 -14.8 -28.2 -3.5 67.8 17.2 -3.1 35.9 60.0 -7.2 58.5 -37.7 -15.1 14.5 -66.8 -31.9 29.5 54.9 -50.4 27.0 40.4 -63.1 13.5 -27.2 18.3 -40.9 53.8 27.2 -11.7 -63.4 26.8 61.9 18.8 -13.0 66.9 16.0 -14.9 45.6 -51.0 -25.7 48.1 -43.9 -25.5 28.7 -58.6 -61.8 32.9 -0.4 -50.0 -48.7 -5.3 51.7 -45.6 12.2 48.2 -24.1 44.7 67.6 -5.1 -17.6 -9.9 68.7 8.9 -26.1 56.8 -31.6 -28.6 56.1 -30.6 -34.7 25.5 55.2 -35.5 16.4 -58.1 -61.1 17.6 29.3 -59.6 -30.1 21.0 -26.7 -60.1 -24.0 46.2 -43.4 -29.6 51.9 -27.5 -38.1 69.8 -5.5 2.2 28.9 0.0 -63.7 57.6 18.6 35.1 45.4 40.9 34.2 16.2 28.4 -61.9 22.4 56.5 -34.8 1.7 38.9 -58.1 -44.8 34.6 -41.1 -22.6 -27.7 -60.2 13.5 -22.7 64.8 28.3 -32.6 -55.1 24.8 -28.2 59.1 50.5 -46.5 -13.8 51.3 -39.9 -26.0 47.2 -19.5 47.8 55.9 4.5 41.9 21.4 16.3 64.6 2.6 54.2 44.2 -27.5 19.3 -61.4 -55.9 -38.8 -16.2 -37.4 -54.3 23.6 -8.8 -55.1 42.3 30.4 -54.3 -32.0 34.6 -51.4 32.7 67.2 -15.8 11.5 44.6 -9.4 53.1 51.5 11.4 46.0 42.0 39.0 40.2 0.0 69.9 -3.7 -23.6 52.3 -40.1 -65.6 3.4 24.2 -31.8 -12.0 -61.2 -28.1 -10.8 -63.2 2.4 -48.6 -50.3 37.6 -41.9 41.6 67.8 -16.9 4.7 31.5 4.4 -62.4 45.7 9.0 52.3 19.7 11.6 66.1 22.0 28.7 59.9 10.6 57.5 38.5 -9.8 63.7 -27.3 -26.1 63.3 14.6 -36.2 -23.8 55.0 -43.3 -45.0 31.7 -44.0 -49.0 -23.7 -35.4 -43.4 -42.0 -29.1 -40.1 -49.5 -10.1 -69.0 -6.2 -3.4 -61.8 -32.7 37.6 -0.9 59.0 66.8 1.1 -20.9 13.7 55.3 -40.6 -4.1 15.2 68.2 -45.3 33.5 41.5 -48.5 -45.0 22.9 -26.8 -58.0 -28.7 34.3 -32.4 51.7 67.7 -9.2 15.5 16.9 28.9 -61.5 -39.9 37.6 43.5 -19.4 14.3 65.7 -51.9 -27.5 -38.1 -39.6 -29.4 -49.7 18.5 -12.7 66.3 6.3 69.5 5.0 -55.9 42.1 -1.4 -36.3 17.0 -57.4 -32.5 11.3 -61.0 -27.2 -62.2 17.0 2.2 -61.5 -33.3 50.9 -39.1 28.1 43.7 -20.2 50.8 41.6 -18.4 53.2 61.7 -3.0 -33.0 31.2 43.4 -45.2 1.8 62.0 32.4 -46.1 42.9 -30.5 -40.8 25.6 -50.8 -1.7 -21.4 66.6 30.4 -56.2 28.6 31.6 -53.3 -32.6 47.8 8.7 -50.4 31.4 46.0 -42.4 10.1 69.2 3.8 7.5 69.3 -5.9 -26.9 55.4 -33.3 -34.8 21.8 56.7 -33.1 -53.9 -30.0 -28.0 -55.1 -32.8 -5.1 -47.9 -50.8 15.3 -62.8 27.0 15.6 -50.9 -45.5 9.9 -27.0 63.8 42.5 -45.5 31.9 64.5 -27.1 0.0 -8.7 68.9 -8.6 -19.5 23.2 63.1 -55.3 42.8 -3.4 -59.8 32.8 -15.8 -53.7 15.2 -42.3 -33.9 7.1 -60.8 -33.4 -10.9 -60.6 -50.3 -44.2 20.4 -20.4 -20.0 63.9 -34.1 -42.6 -43.8 26.0 -57.9 -29.5 63.1 -11.0 28.2 69.6 1.6 -7.0 54.5 4.1 43.8 19.2 40.4 53.9 -33.2 57.5 -22.1 -31.5 7.5 -62.0 23.5 -63.1 -19.2 35.6 -44.8 40.4 61.5 33.2 3.9 8.5 68.9 -8.9 -26.1 56.8 -31.6 -45.5 52.5 -8.8 -41.9 36.5 -42.5 -40.6 4.5 -56.8 -34.9 -8.5 -60.1 -41.0 -55.4 -12.2 -27.2 -43.9 47.2 -6.7 -69.0 -9.9 0.1 -69.9 -4.5 17.0 -67.7 5.1 34.8 8.8 60.1 46.3 45.9 25.5 46.3 45.9 25.5 36.2 40.0 44.6 12.0 18.9 66.3 -1.1 65.7 24.1 -21.5 39.9 -53.3 -67.4 16.5 8.9 -63.2 12.5 27.5 -33.9 -53.0 30.8 -18.2 -32.6 -59.2 -27.1 -63.7 -10.2 40.7 -15.4 54.8 16.0 63.1 25.7 -20.3 58.5 -32.7 -16.9 42.5 53.0 -24.9 56.3 -33.3 -52.8 -9.3 -45.0 -28.3 -40.9 -49.2 -33.6 -53.3 -30.4 0.1 -69.8 5.3 2.2 -69.2 10.6 4.4 -32.3 -62.0 7.5 -51.2 -47.1 31.2 -53.5 32.6 60.4 20.1 29.1 33.3 54.2 -29.2 24.8 62.9 17.9 19.3 66.1 12.3 0.8 31.7 -62.4 -16.1 66.2 16.0 -23.1 55.4 -36.0 -37.9 -7.8 -58.4 -39.0 -19.6 -54.7 -26.4 -14.0 63.3 -22.3 -39.9 -53.0 -20.7 -65.6 -13.1 -10.2 -54.7 42.4 4.9 -62.1 -31.8 43.6 -10.8 53.7 62.2 20.0 25.1 46.9 40.5 32.5 32.0 55.4 -28.5 -12.3 67.9 12.0 -20.0 59.5 -31.1 -18.8 52.9 -41.9 -42.6 49.3 25.6 -34.5 14.7 -59.1 -33.6 12.4 -60.1 -69.5 -0.3 8.1 -68.3 -11.8 -9.7 -45.3 -8.5 -52.7 -36.6 -17.2 57.1 7.9 -34.8 60.2 25.8 -65.1 0.4 64.1 -28.1 1.7 63.4 -0.6 29.7 61.1 31.7 -13.0 27.8 36.0 53.2 -1.8 67.6 -18.0 -23.1 21.0 62.7 -33.2 -47.3 -39.6 0.0 -67.0 20.2 42.1 -41.6 -37.4 36.2 -24.8 54.5 16.2 65.5 18.6 -15.8 63.8 -24.1 -35.3 60.4 -1.7 -56.9 40.4 5.7 -5.8 -12.4 -68.6 7.1 -68.8 -10.9 9.5 -22.4 65.6 42.5 -52.8 17.7 53.6 -38.5 -23.3 23.3 12.8 -64.7 52.3 31.6 -34.3 26.8 62.2 17.8 23.2 63.2 19.2 -29.5 30.5 -55.7 -47.5 38.8 -33.8 -50.9 40.0 -26.6 -33.3 -6.7 -61.2 -64.1 -27.2 -7.6 1.3 -60.9 -34.6 25.4 -54.9 35.2 50.9 -46.5 12.3 56.4 -40.3 -9.6 61.1 -34.1 -2.6 33.5 -18.7 -58.6 62.6 -21.7 -22.6 63.2 -14.0 -26.7 appearance { linewidth 1 } VECT 1485 1485 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38.3 37.9 44.7 49.0 48.8 10.8 -26.3 57.5 -30.0 -60.1 34.6 9.8 -68.6 7.0 -11.9 -57.3 5.0 -39.9 -42.1 -18.4 52.8 8.6 -67.2 -17.6 30.4 -54.9 -31.0 32.8 14.3 60.1 36.0 26.5 53.8 23.6 47.7 45.4 9.5 52.7 45.1 11.2 64.3 -25.4 9.2 69.4 -1.3 -21.7 42.4 -51.3 -16.9 16.1 -66.0 -55.7 20.6 37.1 -48.9 14.5 47.9 -44.5 -13.2 -52.4 -27.0 -15.2 -62.7 33.1 -60.8 10.3 45.0 -38.5 -37.3 6.6 -1.9 69.7 64.9 -7.6 -25.0 51.2 -5.6 -47.4 19.5 25.2 -62.3 8.9 36.6 -59.0 -37.0 57.3 -15.7 -48.5 40.1 -30.6 -27.5 1.4 -64.3 -31.6 -0.6 -62.5 -33.0 -34.5 -51.2 -23.5 -43.4 -49.6 12.7 -68.0 -11.0 40.2 5.6 57.0 42.3 55.4 -6.2 11.6 69.0 -0.5 -66.3 4.4 -22.0 -50.2 -17.7 45.5 -52.3 -28.2 -37.0 -14.7 -49.6 -47.2 -13.2 -68.7 -0.5 47.3 -50.4 -10.9 26.7 -19.0 61.9 54.7 -37.4 -22.6 50.9 -34.3 33.7 24.3 9.5 65.0 19.7 64.9 17.2 2.2 55.6 42.4 -53.3 23.2 38.9 -20.0 8.2 -66.6 -67.7 17.6 -3.0 -66.4 -6.0 21.4 -62.6 -22.3 -22.0 -51.0 -27.1 39.6 -37.3 -54.3 -23.6 22.5 -53.2 39.6 33.4 -33.5 51.6 7.9 -2.6 69.5 48.8 -4.7 -49.9 58.1 31.4 23.1 53.2 41.6 -18.4 39.3 32.9 -47.7 13.3 12.2 -67.6 48.0 44.4 -25.1 -27.8 43.0 -47.7 -49.5 19.7 45.4 -35.2 -22.4 -56.2 -36.2 -24.5 54.7 -32.4 -47.5 -39.9 14.1 -50.0 -46.9 25.7 -4.7 65.0 67.5 13.2 -12.9 58.5 21.1 32.1 26.5 27.8 58.5 7.0 58.8 37.3 -14.9 44.1 -52.2 -17.9 28.4 -61.4 -19.0 18.6 64.7 -62.5 -25.1 -19.3 -32.8 -33.9 51.7 -34.8 -55.3 25.1 -23.8 -42.4 50.4 -26.2 -49.8 41.6 -0.1 -64.0 -28.3 39.3 -55.8 -15.5 21.6 -26.8 -61.0 61.5 -14.5 30.1 45.7 6.3 -52.7 68.1 16.0 -1.4 -14.2 67.8 9.8 -30.7 36.2 -51.5 -52.8 36.5 -28.0 -69.3 9.0 -3.7 -40.3 -28.4 -49.7 -50.3 -36.2 -32.6 -33.2 -60.1 -13.8 -3.9 -45.4 -53.2 5.4 -37.7 58.7 21.3 -61.6 25.5 28.3 -47.4 -43.0 15.7 0.1 -68.2 25.6 62.2 19.5 16.3 53.7 41.8 7.6 69.2 -7.3 2.3 69.9 2.3 -31.2 47.4 -41.0 -54.2 9.8 43.3 -64.6 -17.0 21.0 -26.4 -55.5 -33.5 -4.4 -26.1 -64.8 35.1 -52.4 30.2 40.3 -53.1 -21.4 34.3 -36.4 49.0 55.8 31.6 28.0 36.5 59.7 -3.6 17.7 66.0 -15.2 -8.8 50.9 47.3 -21.1 60.7 -27.7 -29.7 52.6 -35.4 -52.4 44.1 -14.5 -51.4 34.6 -32.6 -59.8 28.0 23.3 -67.1 -16.2 -11.6 -24.2 -58.6 -29.7 5.9 -29.1 -63.4 18.8 -9.8 66.7 47.2 -23.1 -46.2 64.2 -27.3 5.7 57.5 -20.4 34.3 65.6 4.2 24.2 43.8 8.1 54.0 45.4 52.2 -10.7 17.3 26.2 62.6 27.1 61.0 21.0 6.4 69.2 -8.8 -2.0 24.6 65.5 -20.1 18.3 64.5 -53.0 44.3 -11.6 -43.3 -4.6 54.8 -59.4 -17.9 32.4 -24.9 -8.5 -64.9 -65.7 -23.1 6.7 -2.5 -25.2 65.2 43.7 -0.3 54.7 58.3 7.1 -38.1 17.6 67.2 -8.7 -1.8 40.1 -57.3 -24.9 20.7 -62.0 -43.5 31.9 44.6 -62.7 -6.2 30.5 -63.9 -9.8 26.9 -47.0 -32.3 40.7 -55.8 -42.1 -2.7 -47.4 -41.0 31.3 -44.4 -45.3 29.6 -8.0 -63.5 -28.4 -2.3 -53.5 -45.1 7.2 -65.2 -24.6 31.2 -45.5 43.1 56.0 -25.7 33.2 30.5 -12.2 -61.8 32.9 7.8 61.3 46.8 29.4 43.0 37.5 44.1 39.4 14.7 65.8 18.8 0.5 62.9 30.6 -11.6 66.9 -17.1 -15.6 27.0 -62.7 -27.0 37.7 -52.4 -63.7 24.0 -16.2 -28.5 10.0 -63.2 -29.1 10.0 -62.9 -43.3 -5.0 -54.7 -51.4 -23.3 41.4 -12.8 -8.0 68.4 -33.0 -34.5 -51.2 -33.3 -37.2 -49.1 -30.3 -48.1 40.8 -29.0 -63.7 1.3 -14.8 -46.3 50.3 -17.8 -67.5 -5.1 -10.9 -57.6 38.2 3.3 -28.8 63.7 5.3 -21.8 66.3 41.6 -50.3 25.3 40.7 -33.9 -45.8 63.6 -26.1 -13.0 66.4 -5.3 -21.4 35.1 8.6 60.0 45.6 18.3 49.8 58.1 31.4 23.1 41.3 23.2 -51.5 41.9 27.5 48.8 45.1 53.4 4.1 5.4 26.6 -64.5 10.6 56.4 -40.1 -15.2 63.9 -24.2 -15.9 51.5 -44.7 -33.9 47.9 -38.2 -31.1 27.0 56.6 -47.6 21.6 -46.5 -67.9 10.6 -13.2 -53.4 -34.2 29.7 -51.9 -44.0 16.6 -31.7 -56.2 27.1 -10.2 -28.3 63.2 -2.8 -59.5 -36.8 12.5 -61.3 31.4 15.1 -62.8 -27.1 17.2 -67.5 -7.1 31.2 -54.5 -30.9 26.3 -40.0 51.0 64.3 26.7 7.5 44.4 26.6 47.1 52.6 43.9 -14.4 20.0 17.6 -64.7 18.6 22.1 63.8 30.8 61.8 11.3 -23.1 49.8 -43.4 -23.2 36.9 54.8 -36.2 14.9 58.0 -16.1 6.3 67.8 -67.5 17.9 4.4 -25.5 -63.7 13.9 32.6 -35.9 50.5 47.4 -45.7 -23.8 61.2 -33.4 6.2 56.5 31.5 -26.8 20.1 43.8 50.8 -24.6 59.5 -27.4 -28.7 9.5 -63.1 -69.1 4.4 10.0 -43.7 -12.4 -53.3 -52.6 -17.1 -42.9 -24.9 -54.7 35.9 -12.3 -36.3 58.6 20.5 -59.9 -29.9 49.6 -17.2 -46.3 39.5 -13.3 -56.3 34.7 -8.2 60.3 45.1 -8.4 52.8 23.9 8.2 -65.3 54.2 43.8 6.8 30.1 46.6 -42.7 11.1 53.7 43.6 5.5 66.9 19.9 3.0 63.6 29.1 -23.2 28.9 -59.4 -27.3 31.9 -56.0 -38.3 20.2 -55.0 -31.4 -3.7 -62.4 -55.1 -38.5 19.6 -52.8 -44.9 9.9 -20.2 -23.6 -62.7 -0.7 -50.1 -48.9 6.4 -69.6 4.1 29.5 -58.9 -23.7 69.9 -0.4 -4.3 47.8 32.6 39.4 12.6 14.0 67.4 30.6 61.7 -12.5 1.7 58.1 -38.9 -7.1 34.9 60.3 -58.7 10.8 36.6 -26.0 -9.1 -64.3 -13.8 -56.3 -39.3 -4.8 -39.7 57.5 -4.7 -64.9 -25.9 10.9 -55.8 -40.8 10.6 -40.8 -55.9 14.1 -54.0 -42.2 36.4 -2.1 59.8 45.9 17.2 50.0 41.9 49.2 -26.8 16.7 53.0 42.6 9.1 64.3 26.1 -29.6 59.4 22.2 -43.6 51.2 -19.2 -53.7 32.8 -30.6 -67.7 -12.5 12.4 -34.4 -58.5 -17.3 -4.8 -39.7 57.5 -0.5 -52.2 -46.6 21.2 -25.8 -61.5 51.0 -18.8 44.1 39.4 -0.2 57.9 67.4 3.3 -18.7 43.1 9.3 54.4 55.0 40.7 -14.9 43.1 49.1 25.1 -15.5 46.8 -49.7 -39.1 46.7 -34.5 -43.0 44.7 -32.5 -38.4 15.6 -56.4 -58.1 22.0 -32.2 -26.6 -47.8 -43.7 -8.1 -28.3 63.5 24.5 -50.0 42.5 44.2 -54.2 -3.1 32.6 -35.8 -50.6 63.1 24.7 -17.6 48.3 38.4 -33.1 -6.1 69.6 -3.6 -12.3 47.9 49.6 -16.7 51.5 44.4 -24.2 52.3 39.7 -29.3 1.0 -63.5 -63.5 -15.0 25.4 -58.1 -15.6 35.8 -16.0 -43.1 52.8 13.1 -68.0 -10.1 18.9 -42.8 -52.1 39.3 -42.9 -38.9 44.1 -32.4 43.6 66.4 -19.3 10.7 40.6 34.8 45.2 26.3 64.9 -0.1 16.6 63.6 -24.0 5.3 69.8 1.8 3.1 68.2 15.3 -5.0 45.4 53.1 -62.8 23.3 -20.3 -53.1 3.1 -45.5 -14.3 0.0 -68.5 -56.6 -12.7 -39.1 -57.9 -30.0 25.4 -56.5 -36.3 -19.6 -9.0 -6.2 -69.1 -39.4 -44.8 -36.6 -9.3 -22.0 -65.8 -16.1 -66.3 15.4 42.5 -55.5 -3.5 41.7 -47.6 29.9 26.7 -15.9 62.7 36.2 -4.8 59.7 -21.1 66.6 -5.2 -25.0 25.7 -60.1 -50.8 -16.9 45.1 -34.1 -11.4 -60.1 -29.7 -21.3 -59.7 -43.0 -37.7 -40.4 -48.7 -49.2 -10.4 -31.6 -57.8 -23.7 10.2 -43.1 54.2 20.6 -37.4 55.5 38.5 -43.1 39.5 52.4 -27.2 -37.7 40.6 40.3 40.3 23.9 46.2 -46.8 24.3 52.3 39.7 -1.5 67.1 -19.9 -7.8 46.0 -52.2 -12.5 43.6 -53.3 -34.9 60.5 -4.5 -33.2 36.3 -49.8 -18.7 7.7 -67.0 -34.7 -6.4 -60.4 -37.4 -10.2 58.3 -43.5 -46.3 29.4 15.3 -57.2 37.2 30.0 -47.3 42.0 60.9 -4.3 34.3 68.8 1.4 -12.8 46.9 9.0 51.2 48.1 22.6 45.5 50.6 33.0 35.3 28.4 59.1 24.6 14.5 53.3 43.0 11.5 63.8 26.3 -17.3 38.9 -55.6 -28.6 61.2 -18.4 -31.8 53.1 32.6 -41.2 36.0 -43.6 -52.8 36.2 -28.4 -56.6 34.4 -22.8 -60.4 14.7 -32.1 -32.7 2.7 -61.9 -23.6 -3.6 65.8 -60.5 -13.9 32.4 -64.0 -27.9 4.5 -51.3 -43.3 19.8 -47.3 -41.9 -30.1 -51.4 -47.5 -2.8 -43.3 -53.6 -12.5 -31.3 -61.4 -12.2 -18.2 -36.2 -57.1 -18.4 -46.8 -48.7 26.5 -47.9 43.6 22.3 -35.9 -55.8 48.7 -14.9 48.0 69.3 -10.1 1.5 46.5 22.1 47.4 32.5 39.2 48.0 26.2 56.4 32.2 10.7 69.1 2.3 5.8 69.7 -1.4 -0.6 68.8 -12.9 -3.5 67.2 19.5 -11.2 44.8 -52.6 -69.2 9.8 3.5 -63.8 -4.6 28.4 -61.8 -7.2 32.1 -24.6 -3.3 65.4 -61.5 -19.1 -27.5 -20.5 -34.8 57.2 -7.5 -15.5 67.8 5.7 -64.7 26.2 28.5 -63.4 -8.6 30.1 -57.2 26.9 37.3 -56.3 18.4 28.0 -36.5 52.8 43.5 -12.4 53.4 48.2 -2.9 50.7 46.4 15.8 -50.0 -23.2 62.0 -22.8 -3.6 8.5 69.4 -69.6 -6.2 4.0 -9.3 -12.2 68.3 -36.7 -52.5 -28.3 -22.4 -62.8 -21.3 0.4 -65.1 25.8 6.7 -48.2 -50.3 22.0 -62.4 -22.7 17.5 -31.7 59.9 32.8 47.9 39.1 16.8 29.4 -61.3 26.1 61.9 19.7 1.1 55.8 -42.2 -27.0 62.2 -17.5 -29.7 55.0 31.5 -50.6 48.0 6.2 -54.8 41.3 13.7 -26.5 11.8 63.7 -23.7 1.0 -65.9 -59.4 -24.5 -27.7 -59.0 -30.7 -21.8 -48.6 -36.7 -34.5 3.1 -59.7 36.5 21.8 -56.8 34.6 31.0 -46.7 41.9 34.6 12.6 59.5 45.4 21.0 49.0 53.2 33.7 30.6 28.2 36.1 52.9 -2.6 33.3 61.5 -21.4 59.9 -29.1 -43.9 52.4 -15.1 -63.0 -25.6 16.7 -51.1 -22.4 42.3 -16.7 -65.8 17.1 3.3 -64.0 -28.1 3.8 -36.1 59.9 17.0 -67.7 5.1 67.9 -12.3 -11.7 32.2 -5.0 62.0 59.4 -6.8 36.4 63.0 30.3 -4.5 22.3 12.3 65.2 21.8 21.5 -63.0 10.3 66.0 20.9 8.5 55.0 42.5 0.9 39.4 57.8 -12.7 56.4 -39.5 -18.9 67.2 -5.2 -25.2 64.3 11.3 -15.8 32.7 59.8 -37.0 56.3 -19.0 -30.2 39.5 -49.3 -25.0 11.3 -64.4 -67.3 17.8 7.4 -50.1 8.2 48.2 -48.2 -9.6 49.9 -26.2 -45.2 -46.6 -30.0 -52.8 34.8 -19.5 -40.5 -53.7 15.4 -62.7 -27.0 11.9 -35.5 59.2 26.1 -52.0 38.9 30.6 -50.8 -37.1 51.3 -27.1 -39.2 33.6 49.0 -37.0 17.3 29.1 61.3 10.0 42.3 54.9 15.1 64.6 22.4 11.3 68.9 4.3 -16.5 65.9 -17.0 -21.2 63.8 19.5 -36.7 33.3 -49.4 -56.4 40.6 8.3 -23.6 8.2 65.4 -55.8 9.0 -41.3 -58.5 -4.2 38.2 -39.9 -3.3 -57.4 -62.0 -7.3 31.6 -29.8 -36.2 -52.0 -30.7 -55.0 -30.5 -31.4 -59.1 20.5 -9.9 -23.3 65.2 -11.5 -65.6 21.7 1.7 -50.8 48.2 26.4 -60.3 23.7 30.3 -58.8 23.0 38.4 -32.7 48.6 36.9 -9.9 58.7 67.6 -6.0 -17.2 30.4 -0.3 -63.1 60.8 0.6 -34.7 16.0 11.5 -67.2 23.7 64.2 -14.7 -1.4 28.9 -63.7 -4.7 67.8 -16.6 -23.6 57.2 32.8 -27.1 50.8 -39.8 -28.2 35.2 -53.6 -52.4 39.0 -25.2 -35.2 26.0 -54.6 -62.5 -29.7 -10.6 -36.6 -17.4 -57.0 -54.2 -30.2 32.3 -58.6 -38.2 3.0 12.7 -46.1 51.1 16.0 -53.5 -42.2 16.0 -53.5 -42.2 24.0 -65.4 -6.6 42.6 -44.7 32.9 43.2 -31.1 45.4 50.3 -32.8 -35.9 62.2 -28.5 14.8 15.7 60.8 -31.0 11.4 57.8 37.8 -1.8 55.7 -42.4 -9.3 49.0 49.1 -11.5 50.9 46.6 -44.3 17.7 -51.2 -54.0 -6.1 44.1 -65.6 -10.1 22.1 -14.3 -16.6 66.5 -32.1 -42.1 45.8 -31.9 -42.2 45.8 -25.7 -58.8 -27.9 -2.1 -44.2 54.2 13.6 -68.6 2.5 33.2 -58.7 -18.7 17.8 -15.8 -65.8 48.5 2.2 50.4 48.2 14.7 48.6 55.0 33.9 27.0 50.5 35.0 33.6 28.9 33.3 54.3 29.0 34.3 53.7 16.2 27.3 62.4 26.4 62.9 15.8 20.2 64.1 -19.5 10.8 44.1 -53.3 10.1 57.2 39.1 0.3 69.0 -11.6 -18.5 53.1 -41.7 -22.6 59.3 29.6 -56.1 16.2 38.6 -32.3 2.3 -62.1 -40.3 -37.9 -42.9 -34.5 -55.9 -24.1 -14.9 -57.4 -37.2 -12.3 -67.6 13.2 1.8 -30.2 63.1 23.2 -59.3 -29.0 26.9 -64.5 -3.4 19.6 -37.3 55.9 17.5 -10.2 67.0 65.4 -24.5 -5.2 37.2 18.6 -56.3 35.0 20.7 57.0 -0.9 62.8 -31.0 -4.9 68.2 14.9 -30.2 60.6 -17.6 -59.5 7.1 -36.1 -16.3 -0.3 -68.1 -63.9 -20.8 -19.5 -20.2 -48.0 46.7 -18.7 -60.8 29.2 -0.7 -15.8 68.2 1.8 -60.2 35.6 7.3 -38.9 57.7 40.8 -49.2 28.6 34.0 -37.1 48.7 51.0 -32.6 35.2 31.7 -16.2 60.3 69.7 -4.1 4.3 26.4 -1.4 64.8 14.4 39.5 56.0 18.6 52.6 -42.3 2.1 12.9 68.8 -1.0 32.7 -61.9 -3.6 69.4 -8.0 -15.3 42.8 53.2 -23.5 57.1 33.0 -28.1 60.5 21.2 -25.9 41.9 -49.7 -41.3 49.6 -27.0 -58.9 36.6 -9.9 -51.4 13.9 45.4 -17.0 -6.6 -67.6 -3.2 -25.9 65.0 4.3 -45.6 52.9 14.4 -38.1 -56.9 22.7 -38.8 53.7 44.1 -53.0 12.3 29.6 -31.9 -54.9 68.7 -12.0 6.6 66.1 8.1 21.5 46.7 52.2 -1.5 17.3 31.4 60.1 10.6 62.7 -29.3 -1.0 25.2 -65.3 -8.5 69.2 -5.8 -14.6 56.1 -39.3 -21.4 44.5 -49.6 -55.6 38.8 -17.3 -40.6 -16.7 -54.5 -9.8 -7.0 -69.0 -45.1 -53.5 2.2 1.7 -64.8 26.5 10.4 -52.9 44.7 20.9 -44.4 49.9 29.1 -60.6 -19.4 68.1 -13.0 -9.4 68.7 -5.0 12.6 17.8 3.8 -67.6 65.4 14.2 20.4 37.3 57.6 13.5 18.8 45.8 -49.5 23.3 63.2 19.1 2.8 10.3 69.2 12.1 61.2 -31.7 8.1 57.1 39.6 -14.3 67.7 -11.0 -1.5 3.3 69.9 -16.4 23.8 -63.8 -55.1 41.5 11.8 -31.6 -21.1 -58.8 -32.3 -45.9 41.8 -33.2 -60.1 -13.8 6.8 -48.4 -50.1 33.7 -54.6 28.0 40.5 6.4 56.8 8.4 35.1 60.0 10.8 69.2 -1.1 -24.7 48.9 -43.6 -31.1 47.0 -41.5 -41.2 26.3 -50.1 -41.7 22.6 -51.5 -59.6 23.5 -28.2 -64.7 25.2 8.5 -33.1 12.7 -60.4 -60.8 21.1 27.6 -52.4 13.8 44.3 -51.0 7.0 -47.4 -52.1 -34.1 -32.1 -11.6 -51.7 45.7 -10.6 -48.7 -49.1 16.2 -63.5 -24.7 53.5 -33.1 30.6 57.9 -35.7 -16.4 18.4 -7.1 67.2 49.3 -17.0 46.7 67.0 -12.1 -16.3 67.5 -11.0 14.9 66.1 -2.2 22.9 31.4 4.5 -62.4 41.5 50.6 24.8 24.2 31.5 57.7 34.5 53.8 28.6 -0.8 18.4 -67.5 -24.6 43.8 -48.7 -25.2 33.6 -56.0 -40.8 26.4 50.4 -64.7 26.7 -0.8 -65.4 10.5 -22.5 -50.1 -19.8 -44.8 -22.2 -25.7 -61.2 -13.2 -21.9 -65.2 19.8 -65.8 13.4 57.5 -38.4 -11.1 69.9 0.6 -3.7 58.1 32.7 21.4 17.8 26.0 62.5 5.2 10.0 69.1 19.5 63.3 22.6 -10.2 69.2 -1.5 -15.7 47.3 -49.2 -23.0 61.4 24.5 -16.2 40.9 -54.4 -32.6 35.4 -50.8 -38.9 11.6 57.0 -67.5 -4.7 18.0 -56.4 -19.6 -36.6 -56.3 -41.0 7.1 2.5 -65.7 24.0 5.3 -54.4 -43.7 15.9 -65.5 -18.8 23.5 -65.9 1.3 34.2 -56.2 23.9 42.8 -51.0 -21.8 57.2 -40.2 2.7 47.1 -22.8 -46.5 10.5 -4.9 -69.0 49.8 -12.7 47.5 45.3 24.7 -47.3 42.5 41.5 37.0 24.6 25.3 -60.5 31.6 49.4 38.2 30.1 49.0 -39.9 25.3 64.5 -10.0 1.2 27.4 -64.4 -18.9 52.8 -41.9 -31.9 55.8 -27.7 -32.7 25.9 -56.2 -8.9 6.6 -69.1 -29.3 4.7 -63.4 -62.4 3.1 -31.5 -23.0 -22.3 -62.2 -32.1 -43.9 44.1 -37.2 -59.2 -3.8 23.8 -57.0 32.8 32.1 -60.9 12.7 31.1 -39.1 -49.1 33.8 -37.4 -48.6 41.8 -29.2 48.0 28.6 -15.6 62.0 55.8 -14.0 -39.9 9.7 -0.3 -69.3 69.2 4.4 -9.5 65.5 6.2 -24.0 60.2 24.8 -25.8 28.1 63.1 11.5 16.1 67.9 -5.7 15.5 68.1 -5.4 -5.9 24.5 65.3 -35.4 58.3 15.9 -37.9 32.8 -48.9 -36.9 27.4 -52.8 -27.1 9.6 63.8 -65.7 -13.6 20.0 -56.1 -40.5 10.3 -46.9 -41.1 31.9 -33.0 -57.9 21.4 -10.8 -62.8 29.0 -7.8 -49.6 -48.8 -3.1 -63.0 30.3 5.6 -61.0 33.8 5.7 -53.7 44.5 11.8 -36.4 58.6 27.7 -63.0 -12.8 25.3 -48.4 43.8 22.1 -26.4 -61.0 67.5 -15.1 10.6 49.3 8.0 49.0 65.7 22.1 -9.6 7.5 69.3 -6.6 -18.8 66.1 13.3 -19.6 52.5 41.9 -28.8 63.6 -5.0 -26.3 39.9 -51.2 -41.3 55.8 9.2 -25.1 22.2 61.5 -32.1 7.3 -61.8 -35.3 4.4 -60.3 -52.2 -8.2 -45.9 -17.8 -20.2 64.6 -27.9 -54.2 -34.4 -8.6 -25.8 -64.5 10.4 -53.9 -43.4 4.8 -15.5 68.1 18.1 -30.7 -60.2 59.2 -27.1 -25.8 42.4 -0.2 -55.7 42.9 25.2 -49.3 46.4 35.0 -39.0 41.7 54.5 13.8 5.3 35.8 -59.9 -1.0 65.9 23.6 -5.2 66.8 -20.3 -10.4 46.9 -50.9 -5.9 26.1 64.7 -11.5 42.1 -54.7 -14.0 43.8 -52.8 -26.4 52.1 38.6 -32.8 61.8 2.2 -35.7 51.0 32.0 -20.1 18.7 64.4 -47.7 44.0 26.3 -45.4 26.9 46.0 -15.0 -0.8 68.4 -67.8 -6.2 -16.4 -57.4 -40.0 -2.8 -20.9 -42.5 -51.5 9.1 -65.8 -22.1 10.5 -67.9 -13.3 10.4 -52.9 44.6 8.8 -33.7 -60.7 17.8 -33.1 59.0 44.7 -50.2 19.4 43.5 -23.6 49.5 44.5 34.8 41.3 29.0 34.1 53.8 -9.3 67.7 -15.0 -34.5 37.0 48.4 -50.1 11.7 -47.4 -35.2 4.4 -60.3 -33.5 3.4 -61.4 -32.9 3.2 -61.7 -51.7 -0.8 -47.2 -26.6 -2.6 -64.7 -42.7 -15.2 53.4 -50.4 -25.4 -41.4 -61.4 -33.6 -1.8 -55.2 -31.4 -29.5 -49.5 -45.6 -19.3 -36.4 -38.2 -46.0 -36.6 -49.8 -32.9 -22.0 -65.6 10.4 -3.0 -43.2 -55.0 22.1 -66.4 2.8 20.7 -52.5 41.5 35.8 -53.3 27.9 17.9 -21.0 -64.3 11.3 -10.9 -68.2 56.9 18.2 36.5 65.9 23.3 4.4 16.0 13.2 66.9 -17.7 26.5 -62.3 -29.6 34.1 -53.5 -25.4 25.5 -60.1 -25.1 12.6 -64.1 -35.5 13.8 58.8 -42.5 -10.8 -54.6 -34.4 -39.6 -46.4 -1.6 -53.6 45.0 7.6 -53.3 -44.7 12.2 -41.0 -55.4 24.8 -63.8 14.5 24.0 -61.3 23.7 44.9 -53.7 0.6 29.2 -27.9 -57.2 53.8 -44.0 8.3 66.0 -20.1 12.0 67.7 -14.5 10.6 49.6 6.1 49.0 38.5 11.8 57.3 32.0 22.9 57.9 50.1 48.7 -4.5 28.5 63.8 -4.6 3.6 59.1 -37.4 1.7 42.9 -55.2 -6.8 25.4 -64.9 -10.6 36.9 -58.5 -23.1 47.6 -45.9 -31.8 60.0 -16.8 -24.1 42.7 -50.0 -17.1 29.8 -61.0 -25.7 34.9 -55.0 -17.6 12.0 66.7 -30.4 4.6 -62.9 -29.0 2.6 -63.6 -36.9 -9.0 -58.8 -21.2 -22.1 -62.9 -42.1 -52.8 18.6 -42.9 -55.3 2.3 -41.0 -55.6 -11.2 9.8 -41.9 -55.2 20.4 -45.4 49.2 29.2 -63.3 6.6 32.6 -47.2 40.1 47.2 -49.0 16.6 17.6 -12.0 66.7 55.0 5.1 43.1 61.0 5.7 -33.9 20.9 10.1 66.0 51.4 45.1 15.1 14.1 65.8 19.4 5.6 62.7 30.6 -17.2 61.5 28.7 -24.9 49.6 42.6 -30.8 59.3 -20.7 -33.4 33.8 -51.4 -45.8 15.9 50.5 -68.7 13.0 2.5 -66.9 1.2 -20.6 -17.7 -0.6 -67.7 -62.5 -6.7 30.8 0.4 -65.1 25.8 22.2 -58.7 31.0 33.9 -51.2 33.6 43.0 -40.6 -37.5 22.7 -19.2 63.4 55.9 -38.6 -17.0 44.7 -2.5 -53.8 66.2 -2.5 -22.7 63.5 8.5 -28.2 67.2 14.9 -12.9 36.4 26.5 53.6 18.1 37.4 56.4 19.3 65.9 13.9 2.0 16.4 -68.0 -12.6 68.0 -11.2 -19.1 49.6 45.6 -27.0 32.2 -55.9 -65.8 -20.1 -13.0 -17.7 -26.9 62.1 27.9 -48.4 42.2 29.2 -10.8 62.7 69.0 10.7 -4.4 52.0 37.3 -28.3 29.5 54.6 32.4 7.1 30.5 -62.6 0.8 35.1 60.6 -4.3 66.0 23.0 -8.3 69.5 0.4 -9.1 52.9 44.9 -11.6 58.8 -36.1 -18.6 67.1 -7.0 -14.3 49.7 -47.1 -11.5 33.5 60.4 -32.6 45.9 -41.6 -15.0 18.1 -65.9 -34.4 40.9 -45.2 -47.2 48.3 18.5 -41.7 41.9 37.5 -31.7 20.9 58.8 -24.6 2.6 65.5 -25.1 -24.2 -60.7 -46.1 -48.9 -19.6 -36.1 -57.1 18.3 -24.0 -53.0 38.9 -12.6 -30.8 -61.6 -11.6 -62.7 -28.8 14.3 -68.2 -7.0 11.2 -14.3 67.6 61.0 -23.8 -24.8 66.7 -11.0 -18.2 50.2 15.3 -46.4 31.0 26.2 -57.0 -1.3 69.5 -8.2 -4.3 36.4 59.6 -12.3 65.6 21.2 -26.9 42.4 -48.7 -39.7 43.4 -37.9 -64.5 26.9 -3.3 -51.2 -0.5 47.8 -64.5 -5.8 -26.5 -63.3 -27.2 -12.4 -31.9 -28.5 -55.4 8.3 -69.5 0.2 39.7 -37.4 43.8 35.9 -13.3 58.6 43.0 9.7 -54.4 14.3 8.7 68.0 49.4 45.0 21.0 30.6 61.8 12.2 0.4 70.0 0.7 -7.2 68.2 -14.0 -4.9 38.0 -58.6 -9.5 45.1 52.7 -24.3 60.4 25.6 -42.9 44.5 32.8 -55.9 8.5 -41.2 -58.8 4.7 -37.6 -68.0 -13.7 9.3 -63.7 -20.1 21.1 -63.7 -20.1 21.1 -62.2 -21.4 -23.9 -65.2 -22.7 11.5 -30.6 -61.3 -14.4 -15.5 -50.3 -46.1 14.5 -57.0 38.0 20.6 -66.5 7.4 32.2 -54.7 29.5 43.3 -51.9 -18.1 53.8 -6.8 44.3 60.2 8.0 34.7 57.6 21.3 33.7 60.2 35.5 3.4 49.7 49.2 -3.4 18.8 23.4 63.2 39.2 54.1 -21.0 29.0 53.9 33.9 24.6 65.5 -3.0 8.7 51.5 46.7 6.0 37.1 59.1 -9.5 67.9 14.0 -21.7 42.9 -50.9 -25.2 39.6 -52.0 -31.9 37.4 -49.9 -30.6 30.1 -55.3 -49.0 28.6 -41.0 -28.8 9.6 -63.1 -36.4 12.0 -58.5 -29.9 6.2 -63.0 -27.6 -19.3 -61.4 -37.5 -59.0 2.7 -27.2 -63.8 -9.3 -6.6 -43.9 -54.1 -3.6 -32.8 61.7 17.3 -65.8 16.5 17.1 -56.5 37.6 49.2 -49.6 5.2 63.7 12.6 -26.2 65.8 21.9 9.2 59.2 28.4 24.2 21.0 24.6 -62.1 34.9 53.6 -28.3 13.0 28.5 -62.6 -7.8 54.8 -42.8 -27.0 47.0 -44.3 -50.3 47.0 13.0 -52.6 45.5 -7.7 -62.5 29.9 -9.8 -57.1 19.1 35.7 -63.0 18.8 -24.1 -28.3 -7.0 63.7 -20.6 -13.4 65.5 -46.8 -42.0 -30.8 -29.3 -38.0 -51.0 -31.0 -43.4 45.3 -31.4 -45.9 -42.5 -21.6 -66.3 6.4 0.9 -69.3 -10.0 11.0 -52.2 -45.4 14.1 -64.1 -24.3 30.0 -44.1 45.3 49.4 -43.1 -24.7 38.1 -29.4 50.8 53.0 -36.4 -27.7 34.1 -17.4 58.6 26.3 -6.6 64.5 66.3 -4.6 -22.0 57.2 2.9 -40.3 66.5 3.5 -21.6 53.4 25.5 -37.4 55.2 42.9 2.8 39.0 58.1 -1.4 10.8 67.1 -16.9 -10.3 49.7 48.3 -18.2 51.1 -44.3 -26.0 64.4 8.5 -27.4 64.4 2.3 -26.7 61.8 19.1 -38.3 33.7 -47.9 -43.6 31.0 45.2 -65.6 20.9 12.8 -36.3 11.0 -58.9 -46.9 4.9 -51.7 -54.5 -16.1 40.9 -48.4 -15.6 -48.1 -63.5 -25.2 -15.4 -37.3 -19.9 -55.8 -38.6 -24.2 53.2 -27.9 -29.5 57.0 -10.4 -22.7 65.4 -24.9 -60.6 24.5 -19.6 -66.8 -7.5 -14.7 -56.4 38.7 -7.6 -46.7 -51.6 -3.9 -40.5 -57.0 6.6 -66.3 21.4 5.3 -50.0 -48.7 12.7 -57.6 37.7 39.9 -53.2 -21.9 50.3 -18.0 45.2 26.0 15.0 63.2 23.7 21.5 -62.3 48.1 50.0 -9.3 33.8 53.3 30.2 28.4 61.3 18.2 25.3 64.4 -10.9 7.4 69.4 -5.9 -11.3 54.0 -43.0 -23.1 28.7 -59.5 -33.5 28.6 -54.4 -58.9 34.6 15.1 -8.4 3.4 69.4 -65.0 5.5 25.5 -65.9 -0.2 -23.6 -40.4 -45.9 34.1 -40.4 -55.9 12.2 17.7 -31.5 -59.9 40.3 -36.0 -44.5 62.7 -20.5 -23.5 44.1 18.3 51.2 13.2 8.0 68.3 54.6 35.7 25.3 47.8 50.6 -7.4 12.4 26.7 63.5 11.4 33.4 -60.5 3.6 69.5 7.9 -6.0 69.1 -9.5 -5.8 44.4 -53.8 -9.5 61.1 32.9 -9.7 58.3 -37.4 -14.5 63.4 26.0 -19.6 40.1 54.0 -39.9 48.5 -31.0 -29.7 26.2 -57.7 -29.0 25.2 58.5 -38.7 23.3 53.5 -39.4 2.3 57.8 -42.8 -26.7 48.5 -5.8 -12.5 -68.6 -12.0 -28.2 -62.9 -0.2 -60.5 -35.3 5.3 -63.5 29.0 3.8 -18.8 67.3 16.2 -60.7 30.9 29.6 -61.8 14.4 15.1 -25.7 63.3 28.1 -15.4 62.2 4.3 -2.1 69.8 9.5 0.4 -69.4 18.6 8.5 67.0 50.3 33.0 -35.8 48.5 32.7 38.5 57.0 40.6 0.5 10.4 8.1 -68.7 30.1 30.3 55.4 41.7 50.2 25.3 22.7 38.1 54.2 34.6 60.8 -1.9 26.0 59.4 26.4 23.8 54.8 36.5 -21.1 58.9 -31.3 -37.8 51.5 -28.5 -25.4 13.4 -63.9 -39.2 19.7 -54.6 -7.8 -1.7 69.5 0.7 -65.4 24.9 8.7 -58.1 -38.1 0.7 -2.8 -69.9 16.4 -54.1 41.2 22.8 -64.7 14.1 33.3 -60.0 13.9 37.8 -54.3 -22.9 50.9 -44.4 -18.3 67.3 -5.2 -18.6 24.1 7.7 65.3 48.5 36.6 34.6 28.9 35.4 53.0 31.1 62.0 9.4 16.8 48.0 48.1 14.8 63.9 24.4 4.5 57.4 -39.8 3.6 67.9 16.8 1.0 42.5 -55.6 -8.7 54.1 43.5 -13.8 66.4 -17.4 -34.5 60.8 2.7 -11.6 16.3 -67.1 -46.6 52.1 -2.3 -13.8 11.9 -67.6 -28.1 11.8 -63.0 -48.8 3.0 -50.1 -45.8 -4.0 52.8 -62.5 -7.9 30.6 -57.3 -38.2 12.3 -13.7 -36.6 58.0 -10.3 -40.6 -56.1 -12.1 -61.4 -31.3 -7.0 -48.2 -50.2 42.1 -31.7 -46.1 53.8 -35.6 27.3 56.4 -35.9 20.8 7.5 -4.7 -69.4 27.7 -15.4 62.4 19.5 -8.6 -66.7 66.2 -4.0 -22.4 38.9 27.1 51.5 44.8 36.6 39.4 49.9 41.5 26.2 47.6 40.2 31.9 11.9 67.3 -14.9 -4.5 67.1 19.5 -15.5 62.6 -27.3 -24.8 63.9 14.2 -30.8 61.5 13.1 -34.4 55.2 25.7 -33.5 4.9 -61.3 -27.6 2.1 64.3 -63.0 1.5 -30.4 -46.1 -43.9 -29.2 28.7 -49.9 -39.8 39.2 -38.2 -43.7 57.4 -39.4 6.9 61.3 -33.7 -1.1 44.4 -4.1 54.0 68.7 -2.2 13.3 66.6 16.6 -13.7 56.8 28.2 -29.6 36.7 24.2 54.5 32.9 27.0 -55.6 29.2 38.9 50.4 24.7 65.5 1.2 14.7 42.0 -54.0 5.5 21.7 -66.3 6.0 61.1 -33.6 2.8 48.0 -50.9 -2.2 66.1 -23.0 -16.5 50.6 -45.5 -27.7 56.6 30.4 -30.4 50.5 -37.8 -47.1 51.6 -4.2 -60.6 31.5 -15.5 -53.7 7.3 44.4 -48.8 -3.0 -50.1 -31.2 -5.9 -62.4 -28.1 -11.0 -63.2 -50.2 -45.7 -17.1 -9.0 -69.4 -1.3 13.9 -23.6 -64.4 40.8 -56.5 6.5 45.4 -46.1 26.6 36.2 -28.6 52.7 43.9 -34.5 42.2 59.1 -5.0 -37.2 48.5 49.6 -9.4 -1.6 28.7 63.8 -13.5 66.3 -17.9 -14.1 21.5 65.1 -38.2 33.8 47.9 -30.5 21.2 -59.4 -54.0 33.8 28.9 -66.9 13.0 16.1 -69.2 3.7 10.0 -56.7 -5.9 -40.6 -37.2 -9.3 -58.6 -26.9 -7.2 64.2 -51.3 -37.5 -29.4 -41.9 -40.3 -39.0 -17.2 -57.0 36.8 30.6 -47.5 -41.2 35.8 -52.6 29.2 58.5 -29.1 -25.2 34.1 -15.0 -59.2 58.7 -9.8 36.9 64.2 -7.5 26.8 53.2 9.6 44.5 39.9 37.7 43.4 33.9 60.9 6.6 20.0 67.0 3.1 19.5 66.6 9.5 -4.7 68.2 15.2 -8.2 34.6 60.3 -24.3 62.7 -19.5 -24.2 54.9 36.0 -29.1 56.4 -29.5 -28.4 37.3 -52.0 -40.5 51.6 24.4 -32.5 34.3 -51.6 -41.0 35.3 -44.4 -50.3 22.5 -43.1 -57.7 4.8 39.3 -62.4 -20.9 -23.9 -64.2 -22.5 16.6 -45.9 -52.5 6.0 -38.7 -56.2 15.6 -18.7 -41.3 -53.3 -19.6 -48.3 -46.7 -14.2 -67.3 12.9 -12.1 -61.4 -31.3 2.9 -39.0 -58.0 7.7 -24.6 -65.1 25.2 -47.5 -44.9 32.9 -58.4 20.2 51.4 -26.0 39.7 47.0 -10.9 50.7 62.5 18.4 25.6 62.3 31.1 -7.0 21.3 45.4 -48.9 11.9 36.5 58.5 15.6 67.4 10.3 12.4 68.8 3.2 3.6 30.2 -63.0 8.1 69.5 -1.4 -50.9 44.5 18.0 -55.3 26.3 -33.9 -28.6 9.5 -63.2 -46.2 -1.7 -52.6 -11.5 -11.3 -68.1 0.8 -63.8 -28.8 5.6 -55.9 -41.8 7.9 -58.2 -38.1 21.6 -65.9 -9.7 19.4 -15.0 -65.6 61.4 -29.7 -15.5 66.3 -5.3 -21.7 52.3 30.6 -35.0 28.0 20.5 -60.8 55.1 43.1 -1.3 44.8 36.2 39.8 38.5 58.0 7.4 27.7 59.1 25.3 14.3 39.2 56.2 8.3 69.5 -2.0 2.6 69.3 -9.2 -2.4 34.9 60.6 -7.7 37.2 58.8 -22.3 66.3 3.8 -21.5 55.5 -36.9 -31.8 57.6 23.8 -24.8 44.3 -48.2 -40.9 52.5 21.7 -18.7 20.3 -64.3 -42.5 31.9 -45.6 -56.3 38.0 17.0 -54.9 26.7 34.3 -25.8 -0.5 -65.1 -36.4 -4.8 59.6 -44.7 -53.8 0.9 -18.6 -44.7 -50.6 -18.5 -63.8 22.1 -9.8 -60.9 -33.0 3.5 -17.2 67.7 20.7 -47.3 47.2 17.6 -34.5 -58.3 37.0 -39.1 -44.8 30.5 -15.5 61.1 11.5 -3.6 -69.0 64.2 11.3 25.6 46.5 13.1 -50.7 33.9 61.2 3.5 7.8 69.4 4.6 -1.6 54.8 43.6 -1.6 36.1 60.0 -5.7 68.8 -11.4 -4.0 41.5 56.2 -19.4 57.0 -35.7 -17.3 41.9 53.4 -37.7 58.2 -9.5 -8.7 7.1 -69.1 -51.6 29.5 37.0 -44.9 9.4 -52.9 -69.0 6.5 9.9 -62.9 -30.4 4.3 -24.0 -21.1 -62.3 6.3 -42.3 55.4 12.5 -49.9 -47.5 32.5 -58.7 20.0 29.7 -48.3 41.1 69.0 6.2 10.0 31.7 9.6 -61.7 24.2 40.2 51.9 31.2 59.5 -19.7 26.0 57.5 30.3 21.7 65.0 14.2 -25.7 51.9 -39.3 -12.7 18.2 -66.4 -31.5 37.2 50.2 -45.7 34.6 40.3 -69.9 0.0 4.5 -62.3 -23.6 -21.3 -36.0 -27.7 -53.2 -37.4 -45.3 38.1 -33.7 -42.0 -44.7 -26.6 -43.6 47.9 -29.7 -49.9 -39.1 -32.3 -62.0 -4.2 -4.7 -46.1 52.5 8.8 -50.3 -47.9 10.4 -52.9 44.6 13.0 -63.4 -26.7 33.4 -57.8 21.1 34.5 -34.1 50.5 51.5 -26.8 -39.2 37.5 -17.8 -56.4 62.9 -29.3 -9.5 63.2 -29.3 7.1 40.0 -9.8 -56.6 65.0 9.3 24.3 66.1 13.6 18.7 61.5 24.3 23.0 45.4 53.3 -1.1 34.3 61.0 -0.3 27.6 58.9 26.0 27.5 59.5 -24.7 17.9 66.5 -12.5 11.3 44.4 -52.9 6.8 63.6 28.5 -2.0 69.8 -5.1 -2.7 24.2 -65.6 -22.1 57.8 -32.7 -6.6 10.9 68.8 -34.6 55.7 -24.6 -54.8 42.9 -7.4 -50.3 19.5 -44.6 -33.8 11.9 -60.1 -17.9 -1.5 67.7 -32.7 -15.6 -59.9 -30.4 -29.4 -55.8 -38.2 -53.9 -23.1 -29.4 -55.4 -31.1 -10.9 -62.2 30.2 4.3 -65.3 -24.8 13.6 -54.0 -42.5 16.8 -64.7 20.9 11.6 -43.0 54.0 11.7 -40.1 56.2 24.5 -55.8 34.4 42.4 -53.4 15.8 28.6 5.4 -63.7 29.7 6.7 63.0 45.6 41.8 -32.8 14.2 31.1 61.1 24.0 65.1 9.6 -5.1 68.8 12.1 -14.3 66.0 -18.3 -19.7 65.8 -13.7 -14.8 40.4 -55.2 -21.1 55.3 -37.3 -41.5 43.7 35.6 -19.3 16.6 -65.2 -69.1 10.9 1.7 -52.8 6.1 -45.5 -37.2 -3.7 -59.2 -53.1 -39.4 23.1 -38.5 -32.0 49.0 -33.3 -54.3 -29.1 -24.0 -53.0 38.8 -27.2 -64.5 0.8 -12.7 -55.2 41.1 -13.3 -66.5 17.4 -10.1 -58.2 37.6 5.8 -69.2 8.9 5.9 -67.1 -19.1 9.0 -69.4 -2.4 11.0 -68.2 11.1 32.0 -60.9 -13.1 17.1 -28.1 61.8 29.1 -33.9 53.9 7.7 -8.6 69.1 67.3 -14.9 11.9 32.8 3.6 61.7 51.6 24.6 40.4 46.7 25.2 45.7 25.9 62.9 16.6 11.6 30.6 -61.9 22.2 65.0 13.5 5.6 60.1 35.5 1.2 65.7 24.1 -8.7 68.9 -8.6 -8.9 42.9 -54.6 -5.1 22.3 -66.2 -32.5 -13.2 60.6 -38.6 -58.4 -2.2 -15.3 -31.8 60.5 -22.1 -49.6 -44.2 16.1 -46.4 -49.9 21.6 -46.6 47.6 39.3 -20.2 54.3 68.2 -15.5 2.6 66.1 -6.4 22.1 61.8 3.1 -32.6 17.9 3.8 67.6 66.1 22.9 -3.1 56.7 32.7 -24.9 33.6 28.8 -54.2 28.7 55.7 31.2 10.4 57.3 38.9 -9.7 16.8 67.3 -47.6 49.3 14.1 -54.6 42.5 11.0 -38.7 30.0 50.0 -45.9 33.4 41.0 -61.2 29.6 16.6 -37.3 2.1 -59.2 -56.0 -38.9 15.7 -37.5 -30.7 -50.5 -37.7 -55.9 -18.9 -29.0 -50.8 38.4 -18.3 -62.7 25.0 -3.9 -23.5 -65.8 6.2 -64.0 27.7 9.7 -18.7 -66.8 17.1 -18.7 -65.3 50.9 -41.1 -24.9 48.8 -38.3 32.4 appearance { linewidth 0 } VECT 284 284 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61.8 2.5 -32.8 39.2 7.8 57.5 59.3 15.3 33.9 48.9 18.9 -46.4 61.7 27.4 -18.6 56.9 40.7 -1.1 30.1 46.6 -42.7 9.5 65.9 21.6 4.1 31.4 62.4 -8.3 55.8 -41.4 -26.1 61.6 20.6 -23.4 49.5 -43.6 -40.5 52.1 -23.5 -3.7 3.8 -69.8 -63.5 21.0 -20.8 -68.6 14.0 -0.1 -57.9 -8.6 38.4 -55.4 -42.0 -8.4 -33.4 -54.5 -28.5 -22.4 -50.7 -42.7 9.3 -57.7 38.6 18.9 -67.2 -4.5 19.5 -67.0 -4.9 16.7 -31.7 -60.1 46.3 -41.2 -32.4 53.4 -30.6 -33.3 51.8 -16.1 -44.2 53.3 6.6 -44.9 44.9 7.8 53.1 67.1 18.9 -5.9 60.1 35.8 0.2 37.8 32.9 48.9 4.4 10.3 69.1 15.1 67.3 12.0 4.0 18.9 67.3 8.5 62.8 29.7 -9.6 68.6 -9.9 -21.1 55.6 -37.0 -20.7 50.5 -43.9 -26.7 49.6 -41.5 -44.5 41.5 34.6 -55.1 13.5 -40.9 -27.0 -5.7 64.3 -59.4 -30.1 -21.5 -55.2 -37.0 -21.9 -26.7 -29.5 -57.6 -29.4 -40.5 -49.0 -32.1 -54.8 -29.4 -31.4 -61.7 -10.4 10.5 -52.8 -44.7 21.4 -60.8 27.4 23.3 -59.6 -28.4 43.6 -53.0 13.8 50.6 -43.3 -21.6 55.5 -27.6 -32.6 37.4 -11.8 58.0 44.5 -12.5 52.6 67.6 -18.3 1.2 67.4 -16.4 -9.4 32.6 -1.6 61.9 12.4 19.3 66.1 32.0 61.7 -8.4 9.1 29.9 62.6 -11.9 60.1 33.9 -19.8 64.3 19.2 -36.4 55.9 21.2 -60.2 13.7 -33.0 -46.8 4.6 -51.8 -38.8 0.3 -58.2 -54.0 -6.7 -44.1 -41.1 -42.2 -37.8 -24.7 -34.9 -55.4 -34.2 -56.1 24.3 -12.6 -23.2 64.8 -18.0 -37.2 -56.5 -9.5 -69.4 0.4 4.0 -64.9 -25.9 12.4 -50.9 46.5 28.0 -36.1 53.0 21.7 -17.0 64.3 45.5 -8.1 52.5 23.8 5.8 -65.6 45.8 44.7 -28.3 9.5 11.4 68.4 34.9 53.9 27.8 14.5 29.3 -61.9 19.1 40.7 53.7 23.4 63.7 -17.4 7.8 43.7 -54.1 5.2 58.7 -37.7 -2.5 12.4 68.8 -16.5 68.0 -1.4 -3.1 12.5 -68.8 -21.5 66.6 -0.4 -23.5 63.6 -17.4 -14.1 37.3 57.5 -22.7 41.4 51.7 -41.0 42.1 38.0 -45.6 44.5 29.0 -34.6 26.5 -54.8 -33.7 24.2 -56.4 -13.4 8.8 -68.1 -34.0 12.8 -59.8 -67.0 19.9 -2.6 -61.5 -10.2 -31.9 -39.9 -20.2 -53.9 -34.7 -44.1 -41.9 -28.5 -47.3 43.0 -21.9 -46.6 -47.4 -14.8 -50.0 -46.7 11.1 -68.6 8.1 26.1 -46.5 45.3 33.9 -35.9 49.7 53.7 -38.4 23.2 62.3 14.6 -28.5 56.0 39.9 -13.1 35.5 53.0 28.8 33.6 60.6 10.0 3.1 7.5 69.5 23.4 64.3 14.8 6.2 47.3 -51.3 8.7 69.3 4.0 8.1 66.4 20.5 -15.8 61.6 -29.2 -18.8 59.2 -32.3 -22.0 63.7 -18.8 -32.4 36.4 -50.3 -50.9 46.8 -10.7 -63.0 25.4 17.1 -64.1 -3.1 -28.0 -63.1 -8.6 29.1 -64.4 -11.1 25.2 -5.8 -1.4 -69.7 -38.3 -17.8 55.8 -58.8 -36.3 -11.3 -26.2 -24.3 60.2 -49.2 -47.8 -13.9 -22.3 -26.3 -60.9 -35.9 -45.3 39.5 -1.3 -62.9 30.7 3.5 -50.1 -48.8 5.5 -46.4 -52.1 28.9 -63.5 -5.7 6.3 -8.3 69.2 47.8 -28.6 -42.4 60.9 -31.5 -14.0 27.0 -11.6 63.5 62.3 15.2 28.1 55.5 40.6 12.9 41.8 38.5 -40.8 33.6 33.6 51.4 32.7 38.2 48.7 28.2 37.4 52.0 30.9 55.9 28.6 5.1 17.5 -67.6 2.8 45.1 53.5 0.5 12.9 -68.8 -1.8 64.4 -27.5 -13.7 41.4 54.7 -30.8 41.7 -47.0 -18.4 23.0 63.5 -20.2 24.7 -62.3 -8.7 10.2 -68.7 -52.3 45.2 -10.6 -29.6 24.5 58.5 -17.4 13.7 -66.4 -16.2 12.3 -67.0 -11.0 3.7 -69.0 -47.4 12.6 50.0 -49.8 -12.3 -47.7 -33.5 -58.2 -19.9 -18.3 -47.9 -47.6 -8.8 -55.1 42.3 -1.0 -69.8 -5.0 3.0 -52.5 -46.2 1.9 -18.0 -67.6 28.0 -61.8 -17.3 38.4 -58.5 -1.2 37.6 -44.7 -38.6 40.2 -42.4 38.6 0.9 -0.9 -70.0 21.1 -9.2 66.1 50.0 -21.1 -44.2 56.3 9.3 40.5 36.8 59.2 -6.5 25.6 62.3 18.9 18.1 64.4 20.6 9.3 50.5 47.6 6.5 54.4 -43.6 -31.0 61.0 -14.8 -26.7 32.0 -56.2 -36.0 39.4 -45.3 -49.6 38.1 -31.3 -33.2 19.2 58.6 -64.4 21.4 17.2 -33.6 4.1 61.3 -67.9 6.3 -16.0 -52.6 -2.0 -46.1 -63.4 -8.2 28.6 -35.3 -4.9 -60.3 -68.3 -10.1 -11.5 -60.5 -11.8 -33.2 -39.8 -14.6 -55.7 -53.5 -31.6 -32.3 -41.0 -37.7 42.4 -7.8 -15.2 67.9 -31.3 -62.3 6.1 -17.0 -51.4 -44.4 -15.8 -56.3 -38.4 -8.5 -47.3 -50.9 -0.5 -21.6 66.6 2.0 -56.3 41.5 8.6 -59.7 35.6 14.7 -63.5 25.6 10.3 -38.1 57.8 48.3 -48.9 13.2 64.5 -26.7 5.4 39.6 19.8 -54.3 49.5 46.0 18.2 8.8 9.3 68.8 29.4 49.2 40.2 3.7 66.6 21.3 3.1 67.7 -17.5 -31.0 62.2 -8.2 -27.1 49.8 -41.0 -62.8 20.9 22.7 -12.1 -16.0 -67.1 -25.5 -54.4 -35.9 -22.8 -48.8 44.7 -20.8 -66.3 8.8 1.5 -32.8 -61.8 9.4 -63.2 -28.5 10.7 -49.5 -48.3 24.1 -65.7 -1.1 29.5 -60.7 -18.7 27.6 -56.7 30.4 29.7 -52.2 36.0 34.0 -52.4 31.6 53.1 -42.9 -15.6 54.5 -43.7 -4.3 43.6 -29.6 46.1 63.0 -17.6 24.8 3.0 -0.4 -69.9 69.8 -3.7 -3.4 63.4 12.9 -26.8 67.0 14.0 14.5 57.5 16.1 -36.6 57.3 16.1 36.9 61.4 24.4 23.1 50.3 29.9 38.4 40.0 49.5 29.3 30.7 58.4 23.5 14.3 62.2 28.8 13.7 68.4 6.3 13.1 67.4 13.8 12.5 66.9 -16.4 9.4 66.7 19.1 1.0 59.8 -36.5 -1.8 51.9 -47.0 -2.5 64.7 -26.7 -9.8 34.5 -60.1 -40.8 54.8 15.3 -41.6 29.6 -47.9 -53.2 23.6 38.9 -6.5 2.7 69.6 -66.5 16.8 -13.7 -45.5 5.0 -52.9 -35.8 -4.3 -60.0 -35.1 -5.6 60.3 -20.5 -9.3 66.3 -48.9 -24.6 43.6 -13.7 -8.3 -68.2 -39.0 -30.0 -49.8 -42.4 -48.9 -26.7 -34.2 -41.7 44.6 -40.1 -53.7 -20.3 -30.5 -62.2 -10.2 -8.3 -21.2 -66.2 -2.6 -61.0 34.3 9.6 -67.0 -18.0 16.6 -57.6 -36.1 36.0 -40.6 -44.2 47.4 -27.6 -43.5 21.1 -10.9 65.8 } } } ) savi1.6.0/oogl/earth_texture_h.oogl0000644000175000017500000000131014423445060016444 0ustar lloydlloyd# SaVi by Robert Thurman (thurman@geom.umn.edu) and # Patrick Worfolk (worfolk@alum.mit.edu). # # Copyright (c) 1997 by The Geometry Center. # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # $Id: earth_texture_h.oogl 8 2019-01-24 04:33:00Z lloydwood $ # loaded ready for Earth texturemaps. (read geometry { define earth_h < "$SAVI/oogl/earth.oogl" }) (read geometry { define earth_vect_texture_sphere_h { LIST {: earth_h} {: earth_vect_h} } } ) savi1.6.0/oogl/stars_h.oogl0000644000175000017500000000016514423445060014724 0ustar lloydlloyd# $Id: stars_h.oogl 8 2019-01-24 04:33:00Z lloydwood $ (read geometry { define stars_h < "$SAVI/oogl/stars.oogl" }) savi1.6.0/oogl/Earth.ppm.Z0000644000175000017500000025751114423445060014401 0ustar lloydlloydPl(b"A<4e@Iʉ9 8iH6taE4o܀0dQ# 2jP?}*hУDMtSPF}**իSZՊu׮`:6,ٳfӖ]ڶpuK7nݹv{^| L #^qnj!;Lyeɘ+g3ϛC{ zҨI>:5׮c ڸo;wݾpď+OϛC^\O5=ij;;= YĻG^=m{<ԓQP݀h& *FGOt{a{aS=.ؓ~JGO }24>HB:RZA&)1| ^Pa0h]Bb3rA)A\%BO0ZIz'0paf{cF)]Ox# ?G8)!bFzLhLL)zP=ٓ- =q lz"ˢCp|ԟ=m ` F[ h>ГE!R\Oѓ# d)B{S36T|ӞMPe1X%@(@q.z#XJug-+Zתֶ?EGO,ѓT8 AUg} fsI% ?qE\,$+Y dЂI6 &|h uiP cFK`ⶡv{;h*pOA`YVV$ \c8Y$tt 9)8Am@AOГMD=Gz =FpN)G0/,;O=0JѓQL`C;8 V"I [ΰ7W 6 R8y ^',J*V=PPE@O b ~ Ҧ1 hEnѓh'iL1IMIo |^b.1QӞ('3h=H εs\ru-jEwE(dػ N6FlfVmjKؾh A (p@:zt E6 H@^AO8d L|=A'*w] {9Fj/tvVi(f0~x8j-MT0P=@D}HُfyP$=JQCZM{(t\WxOh1iyfm`us9\8%5 Z&fDC +rz@)B&> _Ech1=Xa0W@ $:&*(Z)z*ZZR 3 u08:q"MP=x@iS٤JpNj 4ť' V`_ad`gAЦ b;upC){LUci{U πM!GrX\ʨ]lJR@D@jzj꩜z9wP0+`H0+sx@ ʫګ` @ۀHߠ"ePfw +V cP__^@`J*{^}% =уNah㦯Kˤ{ zEah&B/=%PH}p..Ї~rm03"K3""XrV &0 @up5^0P"8ib !"M #)NO*=q =Q T_=P=0 p y HyhʴFe6@ A&'N W㠐7 Ұ ɐ @ ٰ Ωq 5Sr)` p萺퐺` 0,4)v-x໾[)wЪ` ݐ SEb1~pw : g ` ۾ 8GK1b 2j7P [ k;v8;Ъ@0+ P " XuEj05=1< 0S ך6nyRC`#GG|G[ `Q R\T Œ 0ဣn{ muqpD+0Ɓ2Vk0UeͰx\ะ0 :fu\1=> ΋ й p|Uq`vf8$y-@g=bT=5n=lȻ5V :1"Kǜ3,U VPS 8 @PX ZP\;PE9L(= =qp) TUf' ZB m=j=֓E\ yM1iP:4==$:&lwzzr &`M$)e`&00|4| S HFVkHι b= J L {U#(a%V {`|=z>[, I OR ՠ ,Z@ =z=)yD pdMx K驐9aYT B ܵ- Űܘ+Hc 0* G Wݞ8=gMXў|:؛E \ =~w .[dqpatn A ܐ[?(S }w$&Rngi{="ː ۰ ZDMѸ T K ڠ 0`ͰϰԐЇ6o\ٕU]PdfP E PAv:;6(Md 0[+2 : <̰Pp(`_1L]w  T?VS hn=_]\˰fަim nQ)JdiL hF@ftL~־&Uhp|px p[pT[`\[Q Wj + k = 3 0E#/=_{MCƀȑ+ P Entne(*@:,@PH 0j(,E[ n *r -(8f{^U4 7B &HH"1}p|| | @ ՘-w,MX [&\<d7&Px+@~ % T!p=R@i(!8Z"P8/D 1!xVTz+| >Pߐ9@m \ 8onfv -W@>IdIV&͆?Fz5?n5 0+rԾQB7@H֖+p.Ȃu .dh1-F^C un¶`SpK+C(X\`tafBtj$,&Ac,rJӪ"<%7!9U+G v/\@㸂24[06BIZt\3+9+% 2ASFDt  lSeA ZlۊPi8fz?yXAQg,`Nࡲ Ԭ P_ə<`2Ha(5AñU8ݖ18[ntKwPf F4iɞP b@WTL )˵ڒ:K4gI, &F@*@w2O&=I^w }L@t8#i2BR©llXD )8S.DJaj%dP Z  pp4c{AA0.{m F*@zWhwCXlA,D}IHY:p\% '@ @xR@?%P.XJZXF0+N|u.;f\MA _ri3D;<HCC8p56@4$/ {>CrZ #A@% +9 *@GCHȃc_ͱI6#s#U&M- _ uoͼ7t=[Zr56x@%;kզN)0rm}S%i/&;m2t9$q!b1;B1cɊw#S.#(jgOx(yV +ЀVL)<&Pii)<% .IAd|~IVLOwϞPgS0iI$, A lwE& =vw, Ӭ@e.K@H:.- }M2&WGEPC.*r@."ReSnR1)0@BD1ieY,n$$|@ N d}$)P@  Pۂ 8NeX́(El`hP:]A3v0(et'HGp2d-b`lF ͷ2- IPH%߸N *.V@U%Cg(EZ"_4JM50i g7:`qek ZyvSuNש;mw `(,AJ*" zXf@y(Ro" 7AfRS] !@Ęr 9SuRԠZi|HMo\T8> \ %8@s3 15 }p[AXn*A@r@kJ5Q Ү vhŮ}b JV U5b-d,) Qr0 T.A3@IYxy @88~x6Yjj8).+-e -=\v7&!Ċ|SOM6n"@*J'5ӦTLi5- )rٲO?4dg((p@{V?o ]\PBkc !h3hhz~-BP E(~((`" I;0"&qk t)@"CapNЕh@kE!W${ݺt/AoĘ@ G nPM0p,ܪuށ $"6}Iẘz@h A!@89Y- xafp'Iɝ΃CM hěb Aol `l5 ˹>60L}fu{»3 IYRvrlBzYN?,k #`V $A4 $H+V Gp[)Ib 9E̢tU}!*Q|Y PACYl[C}SXgۼdP4h4O !  ~/T!¤(_r{4`R@uy Ma fD P1}fB""*yj ́;:`$G_L~W n-܊^W` ƸMՠ'Iixnȹ3v-DzVR1P[I@$5׭%~@jS7Weyrd*I,D 2=$2\a"!{ RH"@ 5j jKy! 2"Am4JLyo$_L B~9<ʣ2[#,@-j!a#ʂIA(ܤ$`.fXT0 I:dr %ǵr FMS`$ Ǽwȴ@a[ E29 @ 7(pPxH2:L9:\HA - pYRL6XVi}g':4*6PƉv[D!yA^BJιO$V* ("#тЧE&$:jg\pKTtt||JYaLQ0W? ) SO М|in ̴mA,U ?ڞ2 `K=A(>Ka{@,;g̠(HP,IZ|VNZM>`qj1]ڠZ"E tܴ,'2d@ق]KvHs0ˊf_*k+f1]Oэ6 8bpCF;ԃ)Pl \<*_m(=QrK(0: # lSM@d?d<oi(w-0n$ CdHP3z X؁`!h9 *瓮CO;*`4Dzu0S)F@n*84]YP`B=@Cl1DDom c FA ɦx大@ '$thUCa3l\O/ o.-أCe5ͮƨitJf* ]I}!I@̌)9:(#M>zc:J"P:9CR"tJ,`u,  (G-W/O&qNù9眜76қg^Ά.P!%<lZu+C'$ib+gc 2Z@e;m/ 8+ dlh6)Xu܊ ps =䘁`.0:wؓgG*#S`4BFIt].ȳQ}W!b>>ԋQOKA\j R@#~!p&oQhz 9DsnCx`OCj}.+{co <{LQ_]r9]r2pP_;k$ 81蚬s܅4JIP QPH^6hP vi.Bٍu\pjDiFɠtbddAj_jh t 8 b~(r4-NhSdilu]ĜK`rPpMՀh@ZtpQz4dXmOav*h-54Q:h50p?Ot];IB@:@Ͷ!i QWHşo?+VEGá<["~:J<̀✘{Kך @[h(~rcl\יGͬH@A>[ L/X9hqB F@7CgZVV Й)P-˽aVrpqP(lIP]K Xt^O@oe)pCxz ~>~&L-T ?YLD7BrD?e/KO0AvGxSPBH64ǐ!019c|C -d=P`(Nz)~5Mߘ U z~d1!ۈb Zt9"UUxu8eF1) `P_xa0=g F 1˗(HQM]`4`4]QgRA3 ?G@bōAk4Љ2`GT 0%Ķ@@cJA_\l7]pC!kx8(~V f`)h|ڷ;WB IeD#g+bG˽~D2`oȵFwG]QDoA$bWV@w"Vtq$>HWq_/'Sp(VD o\a`U#] R VKȂ`A3T~Aa4.DՂ(p(9a-@|`HƁ T,g  ZHp|; 1&0} jd0! #ՠY1/L #"Dž,$!Xo@6u"SyL@uM\BQYo@!4TFU!I.asK+Gm&s[e DQE?p S P86E Dia@ >y4 4`Q auZC-쇌<(VXV%-%Xa`PpXlD ~0PZ  @y%3 1 Q;77IiOM%\84,+wQ_ W I t@+a7m_"@(Cux xޗ ,=`bh'h &pЂů5 ZH;M$N t1s((bg"\DUmQp(n!9YB2WeF!!MAbt`P1rG@ixRM)(  SCϙ47~bА,K6@E1@\É&<$@(| wq +&.a#812D.jVKr4;0Y{M1 E9QT |JLɠl v`r.xYgH$^wgBP#@ڝ !aqWW|[I2iF0Q)~c1iL&k1G,+@°5#!rb p5h@1#t( 2 [XŀK-@p,|I7%F!i yM$BgdKp`$f>a r$AΉ0[vadag'b"l%k;"U7:2PWt05TZ$<,BkKFMݐ}F [dA/HnEL35H{b$0 :Jb%jd{BUPgeZk%*0(PgB}K1I\/o%iq ӹ74$ECc #+ sDrLdArs - !}{a4" uC7> S%0Ln1dmi[ޖە Pw#!:ktaPdD@,W4ۼX}f\h 9Հ t=0e!E,]$pHğT]XF"%1U@r ]s Px`!)@$Wz`/%#V"76pNq~ g)r"D%VI4$6rD8E$gt"'q)+gΙ) p*B(1  r"1[6ZMk6W|VΙsb\8t)l.ԁloo$c@)^EhYuO\c:WW )yGu= {cqa\C;2 #`c~!=R2 *6$X$4cBh@A.x a1(U¸igYx@+ |%?ng0@-F#\ɒP P0-ưwa 2C % HD>WI@AgpWpHwDGp`4[ll|4M(`@vVXǯ idVIKXnʅ |G"O@#c!4+!E|_9p(`c \ʭ,Tp7|f/Dg F ,j@ 2 ҉ -.o6#G@DAMx)l \P Zx+bO *0A] ]s8 ²Ȉ>h00U5lQ'zxh'*~h($ccl~{11R@Ӏb

    .6VVg@HI ($\6c[4Z PBfx"EB(&:A`;HCî  ]d3lZ: w-\myX37+. DA7,8NK``vb_*/>+0+j2HRXęWX*r ( e@Ƹ΂=@eT4dRpEe1whP A, $i؁-bgGL w:&㱦@ % ⚜9IC!ZFt6 x" PfiJ< AA.0|CTxoL h06mR!xDCze kۤ!j:pw@ؓpRaY@Ya2H71Nz'Cy΂'c C<3/ԝNA;"Hq !@#ةDs:HU$) [¤ܦh*~DSa @p GX3dNPi*z\zN0p>d}={`Dz~h/ȁϔ"iqn 򐼬DAC"*}')ijΪY!@ tryLS4Ab91"B @geEIJAgE4 >b~G*q1EJ14ȫ=p6BԴ4H)miG,}]&!DAppL+PA- =EzZc^ಏp `H А>AUGr8mP֮gCv=gO97)*B9Rh+'"M+т-#vD낀A2 Hjk /ػ6+Ы PuMpC&^e;$4BH%z //PÎ:,zDBTG%mpL9ӈ M"Lxk#a̒3oƹ4,nl2MRX@"8 4[!HU#'> ADū5a`d)dQ R1"3|:A Rk~ľ"OU!z<2pJ.=) EOAf FdEV(*;=hxr3lWBΣxu,Pੀ}]G୏sFqlDCHYk `l}<0I W׈ |-Civ5T# !G@gSEuqeX4g@mZ .! +C-*2\6"eKEeK "$5"2Cµ^Ssu H2-\Ir3NFom sTlPG\a1{F Za A"ނ!dTZi $Z^"F]vλWaH O@O#SˁH>`\DkxKG 86S묀ql4"T~Pa|'Q0H%&-> IJO Tbm5%dK?P` AO̻ý>wh0"ԲAGG܆hȓ*nlEA6P)GpG j QBb(UB GɁ/A_f3@4u`8'  G"z}jJkZ'ƝtkK,?TͰҹĮ[ ,.F8΂!r,D:Hx<(2E@g#NLz[̹VL\A ؏ĥK5ތQdhQʁ/̀!8AƤDMIc^*nx- X $\Zn]Jƻ3X-<(U4m lZMå?M6Yy+YY2MSEL @QƱ ws$N*0 @ H[=DI@٪ sMhT+qL 0z(&a8@*W8D:-0@*(L\8s$W&zLqv x fqZUP 5B,;o)؎BrU :PO+W4L8@u0Fqwe\"20LLnS$܌46Z-LQ/\\l KzB bRX t?"@6 ifb>ܯXb"xՂ#@,7p*h J'l S #ѐf^V &G*0 RJA 1+r> *) Q qr|lc#!lr#T<8m1~gJN"ŧ$!Zp& .; @4үS %_п< Fo_hPP$m"RҾuMAQK@0Aq(ϣ(FG=Bp2΂,@ hnb JA<D0!-xwhQR@z-Q:3V$D:4~ Q ڀ!/nHn2`|A84C (q;ik&W%P*XK;H@\rH8Ы*c L͂\y䳳{6(LHJ4|'|my3 PG |FvMTD[HZYIuRk"xxx _y|uA!2D0,'>i\c5q:ȉTb=LS IqS:m10sܻ0901Kj; 3`W1zs@x)-u -X3v8Iv  xdGd ~!G2jjp$ U/fp0'IH*SCp.D9uzBtܐ$z$y,Ap @bdĀ 2t?"9HnLLAƔ<$xJC!@MRʤlnA"DX구VDh],2aX#`UF*7֔ȿHr: I 7IE2@-Q%5:ѸgaCXUv+ڨ8nr, iP%erP@ˑRa0!ӕcÚ6 т> Um=긨2 (>(CPp _jDa@J S,4 HЀ6[S@`1CشA> F p (AqY6%K!{P׮;HpqXưNO~\gq`4MI<<+ԫX]\QM-H#D`Ԭ*#~(#ǔ  \@4P#F@n72-VwLOL8ލsP8F1" t /As =3Dr3">pB?." wf `_7T&P+";Vce[ x"4BR>qBT>p5q 1?D(L1a)>XIlWwfǦƠ5 K)H!t a?TBk^֣u{MPB 0:xu<8}x#sq3rB mMAаQ4).xRA0 7v?VJ2܌ȇS -^6ux 1[i-/(kRXSv:MGAԗsA4A%T,QtI4,.@O .m킟~C8 NuVri+2bd،1J l7 1d%ehB̒mxVq9YM 1[YO&`%W5=4QSu~XqH@$Dxg$1T~ O *u/-~^͂36atc &xFa>*D p[Ps~P $&:YBo"p[0 Wa(( E:`⑝!`rcDP% H|Mї, YƅH1L*dܶ&wk; %B1B$w޸FQ%Y~ ' !nS5pJP4luDtJisB'aV)9[e7 Ww gzR0'49M{b#M.9yl/;YzRDnb!8R@pCʂs./fl{[vc@Sa)Y8 EY#/1hfv,]Ĕ i CFx (d\9QB}M]F7χ=-+z,( ۬`֜ T@P EW*Y册?> !&Y%RH!p ԙP9t=mFt.)T+й#Ŕ_9Ѱ q~\{\Zi@%utpdFk%xP)xBU>q6F5 {](T%G.k[yx ԔrŮf8N< c c^uzGK끭k$3$+tS`: !yA A,G$a!)~؅̜cJ%-sL"qk:!@ \DGXob5͔E [CoP@ &5U$ʄ5~GktN 5Y*Ip 5ա;+19Ky( 4lVYDd's\/"] '`.-H\j|g-VVڷX]9lxD;-VAx3(wՐFHtwA p,Js!Bλ XgƉ_ٔ_?0$ȘCJ$PDT4l1A+qVES_(̈́!d (`<FdRsU A+$xҒ_ɀ¾A 聏ETW~ȳY QFqVlGT75ك("0{\nj,n] ;|¶  D G`V{44 -V@0$4p4U$W@JreE6@ 0< ߏk-YlV|-_[,nV~c*S@<&`]/`EPA޵/ I(E~6%fFn ` p{*Vt: @0ĠK4E.&z? `HQQl׻aBXI  I ҷdgZ8y!*wcH3{#d7x)@Ox(]E.o p|$'Ȋd {8,`^ Al60G9`]Q-0@<"(Z +@Ā Bp (V{z D'Ɉ;/ &t న/찰c'a;fuDpC8:y pHBFx`E*cHPY9Wl ' 10 Zp:h"aÈ؄< n60Yt-}zp=l>"fIúH4< {#&v߀n7,fA`X!xخVBc}IB@)tZ FpK'*So2 9Q$M"?QX<_! dmB^L |W1@X(ĄZ@0xw5Ɛ6bx\yςwGL6o͂SI`m Lh(Fa>d]Q` _]p*D\ 4@Ge8`3D)EPs?s:?r z/Y1Vb~C@b]_KB,0EBPanpB!SbY<$7vBzW1~?m(UQ.,|h $F@s1@2n&p/z X?1] aMxC%`r ׋Z'a:>7Uנe8D\lnT- (\ ,)apxd7xz8a@yHP 7H7HʹF⏰i)Hi\4J{ Y`-P.Ҫ fAIBDž.8 S $  GT !DQLwVu@"vGP*G3.b #JUgDCBrmCĎ*6BpD .Bq/D%@(;Cn0`0QX2d r"@4%LZ@3Gq/8H* 2j.i/7dpdDǪNC.p@E9_D@ $Ew`ADT< xKK0s…f cp50"x{np:G0Deh8P0TU9( Vqw@@GH" &"oQɨH-@R8 èypXb/s(yDd@f$3&N!P$$D7x@ '|~"Ю m m|qO #Wx xd\D1kp UV c!`8H@k R"pb"HnVk_/x"~s2e?cF4 7p2d'H>*`װ D( ,J(rc.%-ͽFB"E@_Q1@n ."E( 1,~e qq4J8EDrŨx87Aı0:#ϣBF}E:Ta`PD _b-D XD I`֢Jr"A`R@2f@v-@ÀHEPG5JiQUD'/FPLc(A'P ih ?OQnpPl0@rax0c%FA۰;6r',-'Y,ƨ(*v-AK$kȁ0UJOrrPI`<|PWvl=Nz @åeW]H !!MJ!:rD ;8iY`C# hp@1!6]QZ2(jħ Nt6 (peiʌ,uubf}—AiЂr!%0Fq9! - 8BYe|{pDG aX݈\Np5HJL%Cg$HQmpɸ'ꣴ +1 --Q U#L `!:Ep+.6 \P UcRɉ-L#`#"f9 ?&0X"_A+lrY"1CB)DFxI.fpd@n":3Mޯh`pd"U1y@5 'a*zҫ< !Cr| RZ 3Pz!4 QoQI_,\fDYAx'0D x6 ce`c0]siYdDD8/upI \rhܡ D2(0Qbj+Y{HgLr/ \XŃ5 9+&&Nᅁ,XID]xQ$'v-?@@fFƤVfLI$7`LQZ)(@ WI3Ro2^~׊dh%TzȽ=E?`sxHZ?_a0xd(d¬ + cc usF+2h?, ̀v2Pw~oAR4>7LR/0IG`'+ɜ܋#4n/h !%Lpt,[mTL ! $(Ǧ )$;< pA' `PWr@&x<@^B "5&@E-@%, `\ ×wG J9@)3 /"T@i:|0܎"ãLe5QeZQ$'w"9tf1g9Ĉ1H7ѡ01k2!&L!Ex^`j9I$PJ;؂$N/x@F7v y/6=0E^'"![p :esrz,xDVB[עH&@ ,@>#! xBD[ 9pW|0s3@Հ@'r{@e 4@g3ǶM||GxH]CDa a0'+udGGA3,(SN,W ɡqЯ60_R;/eITXf jABu(ɲ|$D,Kc AۘɁ'N91|,;B`e4<88Ae!q-S<JE,@034O& u  gwaVhKzgtbAXx])dKBG2cǽ ԓHkKH͍G :D,GĄ5MK!@Pnm%"Ί_.!Pq&>* m/bF'sbIM#2.ӍF%F9<> B s'Đ =6Ԗw*&`~ۄf$ia(ЅrbaGP@:MAW(| H],91rf5StkS%Z`4ݍzJ?%ĸ8|!)hà8@<6pMc8@Fd(78- dd2%A=%n<`8{/"0$QeРH i,k@I}bs@F +A`1Hid2 !L@%ѱ$@ @WDA G\рYGFG_إ8ϔy>,8("#=@~T yLpO/aЬ&܁)i7T W@%dm3U[d2ͪA8#,[LA&s Fb`BW;@i F :".qCN!P{4g@d#Vy%Q-T 8D 1ͮ@ʬzH |8{Fʄ-8y(`!!ʐNLE,ݸ$̶T0V@kh(7<494 p $i:Ɍf a)h#,AEshp<?!6js -VPIl=ʌFBtь\{Gr#(x(HPL$! m:L(VO {Px炽'dq^ƺA: "'I$dm dt$ZpB򾣒ุ0EBZ``ȭ@ARH, @oB6{Nl!*aք@aX$/"0ژBHDRZui8 sUpH**įoCQ3x|fgHA• 9:yX'^M (Rr`-$`H Ia`:7@(E) + gc{iFa8:(Px րC:0*HblQ%>P4eT6C$ NLg`07 >lN.Ne/ (E85 ˠwB!tiˠAsh@w9O()58}BM)Gd:h^`ႍ0$ >.Rрx"-}O'[ ,4%D*@!!xb(~=;B,'9ЂۤE 9@ :7H@'Q {b#(IJ%Ŏ`~.0JĦna+ <" ƼGIDvb 4(uRFmr gsڛ:{ Co4GNBpP zg iA<qF QT8;M]%ӑ,ʫ"TBPBu&+!bPkT3;40i6^].M\v28K@Ye ZX^Z-0аdD]$ YJhhS3^F`/H !,͂P]86VBCI4yRNc<$$X qd<<7 8Vǁ⋠_Tj%V hX.(>'ςqH=FĬU F{A@pw ?0SR y>"tkzB`?C \dxqY94J+O CmBk1:߆ 8HP|>uAxRl _ q1)Bjnh-aGۀ}q vuOg00OfwE7{^g32f ICoFAq:o1/`8(؂?SR(~ FT OzЛ88Ā`  с/, \-"Wd@3"΁V,Y:c1cS ST#"s,x-`.`+tgEgPgAed-8ᱶ:syA"p(H$I֠:n">~gU$lt AR ؂%{87ҀGžmrF|ϙ:Ct`ICeьFT#:qť6t@c |4@"Łyِ@@u`"88{K2s604@1 wb0zN7^x )T)jzb(A#I!GcL7  ٖx̙FI1($ us0%%VE5?T'J1 Ψ!"a`8G 9!Q" vt;u$f$\OG EDwt=xl^|%4 - pF~tAwODC~?v8-j 7*-xT.`KĈ IOat eĈEVa64P NВaY%PX!VlLl bA;G(ʬ<_ΉhC - =N ]sŶ/B1 PHHCNC=sQ<\" * d YQX> }"&CO12s0B@4<]!t@ dFƢ@%` J(0|p*D=Ut1k  d;Gx9Q> oX@% v38@LaB`xC 7@!$ `(2}b$"*8@0y/. ȯonD@ #ob>"H3&b@B0 !0l #&H b[)Ֆj"HH2ZQ: CphP50U@]E0nwD?i6[^BBrC*`n 0Z4X[(!dQ([)^M40;L@ u 0T$C#>?Ԩan&# e]Y4hLk>덆A5v  nBHssacDei:zE4)YKY mF5Wv(GhUBQx(G ή[঴,0* hA>Z4جJ]}Ise͛ˠAAq`t d cAS OMԃy b4 lQP=mj6 D=FA x@Sj;iiSƴ`(\S*|<d\EuEx(O" 8SoɁh෩/N CtHJfO u3 2i`裺p =YAWj$Qeht(`3TC 1}L y-%nw| TCjHCh>*|!N| zo" /DCAs@ IxV@/fI_ T0y-E T9 !9t0lZM| xAԏ+HvY )(uJE Fca"ꔞ^M$H̋rCA- i&XP/σ"YL6r+ Ot( X}6Z`m2\Hw`*Q@ʉ0ڑX,5 c˓à`&.GMpSaF _T*av8g Ap:vP@ V7evw[L Wzj^zG0m.HaG:? N;<< 41Tѷ`y丑>qB J鉩 bAUJX@:%3 7:`\4=!sL8xwNGgPP_saPcxV- # 19 ҸOuڠ#FaE|6&~r8 HVv ; La{$!1m *s`H^)jGmhphЊ; ~shp0Vw<|Q0`ԯW 3,h )'I=r^l}2.5GHxlBdAydN"50GuUzGmv+:M*?UT)` ]GhSn HրF~  #:HO>0@" ܅*j*I>XFL 7U$Z=(P ֩/*y5`bUI S㬛VtgS:nvSGBar\Oͣm)!1i%' !zGO4Op uѠ0h؀iUF dj5`_ԧ6HjMM΍Lst&k>DDshtPOb,hDؚa0nЂ^`IP nɵx DB3R+_unLV TATTHJ|mU"2,Qc;ggppHvᙅa@ ˸W3 \-<D2Zk`QB-Y a΋2@I= UL5y$ˤeE`^3Z-DI ( NB2.`2"^]2=8G<ϐgmWlêS]$1k h<YPvEW؀4PE4];@ A 4}wD~"9+8Tbx}:S,r6'U0cu`hA9zNh FaRXSnBr! g+5|-+02&Ѣ}]%f*j=}ul^ӡohGJ cMy'oZa SFL0 @4&ΐnPHz ?~dpam B#Yc|$\co"°yLkW Dj:z  ^P3Hl 6J0 ԡ X vR- kױcs"6$JXeBy`+H=|G F>d UO6@1H4 gZ72O5s&E 4@}u,Xד +Ĵȣ?bX[1"X4|$K 8tu7F?!@Y<[7 XFh {!'nD* akuF s+BY&P)C#* :} P +s@DPlX)&bt@6JDu# ''x}Qy@Rv`c B|N 7##:vA${R.N)A0uٴ> 2*j !YctW Y CB6q7?Bw&HOLb H eLLzd`:Oaብ !#` w0Aݳ p\Xي$. +84{Qgxt k*Hh.m("d xUDez jcv;؏Bd` ,p;YhA_jaP%t;KtbureԶɸ(=2j9%pMGp\b .[2(Ӊqh(P.,rDPi .+Flfds8CZc?I#@WWx8Fl8`1D.#ϔ\WcHɕ*1"Y#E+4 ]QXHFh5A;ŐfE! S~Itetp-`i wf0*B[=\tL9<&. Ģu0YE`e$ah&,.YB"HMQcc!Q hAź9l1iwdH0ioY-`qAJ:-o @Ar|7t7al bz:gYhrpt!D'+\mV70JX,3 Dk5>2DIA O]q@Eh Z5-`thxY_ uSy|1k @ͳpj8 Hra.Tm;HGCPYpIHx\gC8ɈbL!-W"$mk!VO`1o3 ba]pPdAM!:%r; iSI^V+gIa$U!4 *ر Cl lDpmQ``%Z8ܐ5Å< S[ᑻ@¼8Ch(9@ 89BQ `Da #"]À\7*9o50W yrrPp|ќ.2(nbʠ嚲t !xtZ7V/bdA4U*CϏ[XUH]!LGHn@3l Vp*0׃M ;+ 9p)*Zx!%:<6V2a(!.ʀ '\V`mf`K a>1S`6JN"'VP.^π3` #̒*1-d>G+KyOPt= 7 *-xH_7kG(c܎ū<`@ݗQ&%LYHUt,Pc|w"k \@#WP+o4*Ъ؏5 <>ZE ej" "B r6#*`!-4r`6  >do^M Pa;a,K5ÁBu Fi F^ QaBPzgT#l^aBF` . x`+"PmKx1TyWٻal1mΩeS `a*RA+B BT#vFUC!H4%W bpl.:Љ^ʡP|BfT & d :{ut H 6;!``)9nX@_s`ҊM\J !]G,$_ 5DE4 ԸJM}c#ܬpay&@ŢV~d pnH1h705asR(Z\1 v_uÉR.5vŬİ 8z@_b5]Uh _&N 7+5o-2Xή64cH ":[;6 MRYcSCBI4@`&#( AvJ:A94yB:˵+SpQ v=`@P-ӐPB?a!2$H)V "wgp*pl ..B%1:z1:(ÒYKU,ǸB7mJM0,]ԁp 8P_sB |xYDy_ũS h7C-@`Y8 Km y!-`C^I4Cv7|T_Z@|c޾ Qp,d!a<#Q$D[}  $f# {OLw?B 7!6>˜a m6Cp,+7w,XtfVk+Rw)-C;6:P0p^@ȀFp8L&v HY0=X\5iȗN) p.50iG+ І#wBYw`Y" (\B 0Xb =,+,+QᗤN'B1wShU+%3d+] Ce.QpNX҈2L$u hb;@*tU`%ZSj \;")$ q0uMbBPFףs3#![xsqfeU(^`:۸OE^F(Dej)',A΋/3-ȇ7o]Ëx!~b|AƵ"':icd21Xd7ӮvhR+߈brcAS?phA#rZf mѠf2C Sv1{̀pb@f\~r]F&$R; p?`vf0oIqr@U> (N2.&k W@0ć9X!qR;ÃQ90Dˣ #"~];+9dS ⏱ w4r*68@nFCUT=nì)Bƒ" -xG8@1 8 6#&@)ƒtF?F("5: 0&5RO0D_\z0$HgA'hX4i'MF٩"yH9-3B$Wnҙo;r ~DliR#DsB LjzDZ!A#WqkN4 hi%G09ϴe V*h)߂е\iBy@(7lYdž޴fpf;eA! |}1 a=n%P@wS,ci?YTE% < 2zi Ǖea+m5}!(ʆ,y`zr: Y)t >8 7<*/vƄ%ㆣUL›pѠy,G܂B.pXj;24ٲd(~1F׃UzlmD PB4J=weE;́*k; W34C.Ԗ=0\e=@+ C00 p.gs5:m`O#8hGyX"DB*&wƚz@.P(7. 9,o  dlX |xI 7`lD&50#6+3o`"2&* (w90VB< ٙY lE14+SAG& ТfB4 ZHLG+Uy̒<CB ,`ۋ?~fpl"oGЋfCX'"˔!Rms= P/ J-D%4$tA1x0NEC7Z!!@3 q/x@? Gh`"! `AB4:8ȥYPs= 1 ZI9f\РQX& hOIQpAM3) J)3_I !d /DHS B*g0 !W l*u|I[ ͣNTz{$'`c k8Nhc; 6x< :yD$ ,6B5T؁ .qQaOrz\pE[9ִB 5JR`{2&9&`VpKKEthNOan8(98͢ Miq@F_O(;:s~&ۄrc`Y%Vwx+ #,B7}qNϴEa0. $24zMͦ`.Q%Dq (Ħ]zp>H-].|Ȣ#6($xA] s&8/*? ! nԱR@Q *4 '5.QΡi z(J_ 8Xp @DKb*SB($h.:ӲmZtUFw bF6;v-5@]ANό@  WGyWY4CA+>]+C28 LZ\QJԡzG๬3= dNc A:UiXGmx$< "0LmG8yQ ͳusfpn Lv`Y #}4 @i=f_PoVaG(ykIHld҆ہFӱ h`H@ HNx+_3cT9!D rfaG chC¸G'j 6AB.U%ja-P) k@[ wV乏 [}_>cF!n ,/f;WV,tb@MZ`Pd)&&G6mq NHpdCM&-Hly .!ɞ) QZd.t 8C*[&dGJq xCb[kA!! #gaƨŖh2颁A0bq0耿G:@Bj@ u&k)p}Xz_d4lQF+xD .yӒկ X҂`P6p> N߀X0& hJs%&͊3 ]{Gq #_4IeC7jIuO `{Y1@k\'fA@)ݾk>LYu(d^G ӎM9 EXqXͺX 0DaCH.ü~e։] 0 jaɕBuS-$.I6°I˾v;ܛ>7c ȜLD,1 0YWWE nrrm@ӽZ#ШTjcޗPB_l lxs lvu[ ccMy|$ fʁ_Y8#Ăc!@yzwF p\?m(m6}L  AW1@XA^~p$%i.+2ٻ`JHa\ڍUED7c˵3\,=@rl$t5EU+ JD{nGX~ EjW-` @\t ZP6NDPAS2$<d&ּb"$k ŷܽʫG C yhE 2[DW,l7Nҁ{ YȂK'bI\pMHc##R2B5]pa?nz>9O(o@'$ \,#*S!h&R%>CmP ;ȃ8m$Wb(|h " s7Scoxz t~d!!v3Dž )iv.ᢑ~> d 4{ NK% X#_A/|,.Zv@ ckdvm0?\!76ey!|‚--4 >v@ ~<-WGSgBo2_w&!d$GO> xI`ut}`1Fb :Ȱ~f $ za$ܰ_n3IY@\h 4;lכFSOW~@u#jtyAiZr:ET31>!\+ѳ~x>`Lj;4N=JۑɊi,'P>$F0l#4۸á6׃]Fhr>j@7[0fU"qq|lR2LDZ: pCB*^܍`Bs"H鑫-vsA;.ր-2Q РM1R ;wT>c IԺ2 ) 8g(#&jfr!( x"kLrqCöc>7/M֦tTa,a{\E&Dm "5< +K<.p zIcPUÂւWmh"Y7 E,Ȍ2fƒzfQj1&H'c@+Alr732VP_Y2$7X[E@Kp;q FVԠE86ٱf?rřЋ /d6 jpMF< nR(z8` Plʓ6Ͱ}{@^ l]NO/X-t8A\Ysrhh/:w 23?ɵ7+ ZP osXhCΒ0dd3~*_TrhAĀG 5su"MQ =vS I0 ²p5'~srhPhU`juY@V&HD `o&RuB( .;΂>&  *vC7y? h4Zua`9H@Dʋ (f|Yeye Ӛ6$${t@% 4 XE[ą%ǃd^cy..`e"z"#F~#Ea6 RWPAٸT^>' m"xlH4gFw_`0. p#:`0Dx}$N'Qx!LCȉa(F؍DYRY@b;_<^XBz.#>׀U°Yyg38b*_=0,_G 8tA\Wֲ!~Dlv2fA8}Z[P2Bt±`GSg&+xѹ<}~"#Lpl=@.10n=Cxzw`3v y \0p[c|jѠm^4@@,@dЫpK #Ä i(@;*DHxU Eg]n@EڑP⸶c5e0p eG*gVAw5x}"nٛk|[#Uס, fyDp08UPLdo݈B:G 9 jɨX\E GtNY/W+8yHHvƘ-xu*8`z7Xw69JxuJ90ˆRFٌiS%<ׅ tg_3NZjFsAzOPƅqlOМê y-7w'! s Luw%&1IqxѦkZ0pgMvC]0kDՎWt(Kf2D.km`srWg3(&BB-+ 1@ugBH7Jr偎YwV9( .ś g}b@c&SJa!/ Θv"A}a_1ZiCaPzB;^s;ۙV).F!1Qndx B5y,: iŌ`wS8#u]yLHTߤ3Thx(>MZgÃ(pC,fuɣ6'􀙁΁8"#ZD7"+:6]br4#bǑpD Y9}^-MT( x0[о{=W@ڃtyjAZc }fTr:xc+РS nz %/{YK(R@42`. ZXRJBaΔT 7kOp  F! DV؟]Z@e  |,`lߢi]^8y_a(6AӵXPE CN0[5uü,7P7 "QIJ,(c4rF݅~e,Z@Ā ` mi,Ue" }Нt-R~&Q '73~V&Q6m CNsbrb!سf;4ZnD7Gnf=+—x"B 2~^x̰d恤!֡L *l2-xI nBi0ݴ'4 .Y`:a821=%9j>2v:ŀ1D.Z9XJփM%[S0 (&+0fl|99Tːg]AH,dvZ6[ KM6O%9DqndJ "zk=$8'"͂Iq 0#>%@c% <bel3pš 7&br~?)16 4JРU06h/4ELA yW0ږ0&W+ ,=gda9fw g,X0'#6|/3Oׯ̒Ҩ@BjQ 8AHPEțYFBFu}p/ y ;.A0߀/zGEg(vT¬]V 0^Jy,;XlzC}gprF멗p06A z\ 5A-xH|H,quȭ`{ZZ8qbl5IJ#\" o&& l0M (P -9)o Y+uASbJ"bijAl4 *9qo;Yxj2 p~M߁@$#_dlDf,)O[1ej &I쀆@ 0  !=#˩g٬Uňc=7U_ .q!hE n;P͹$ N{V" 7+V6.QI.?L=\Ո.`V(YzE??@B`X:X] HimPuf j^ 8]hFݮK9Dݩ)_DmC qxFh=)\%,H0bϸd`ԸS0ެP1/ Sly> K- SN @b +d6QK /.9Nx:! ¤7B4N `A K3S lY7 &̋#olҞxK 4{}.6Ʉuivf LH 3#iH76 5ҪzS0Gz<sv&(5  vī1 rsV GR"A,PR`a%h WZAoj!~OR x̀<&рak:"҂BPL\H)=@m+WpNLӀzʬ̢R=/p*U8O tQ("΂YG1\Ft{! }D" eT |/Q*Sd~U]Q 5 (&@jIu!E;؁'O]/8Րg sj/g<nߗ0'mڎKn1!5_xQW';⁄B͂R!(Z'nX +OwV[|!na wXg_<#gWoh[ V# #W*H5?ЭC F;aRn ԟhMm5x~:X"1o}@1 knuiAZYĎ~f6opwH>7K_x9衡=<>(V s֌ JDgFj`(Y=@ w6\WEM &+Nܷ0vLy@Ob9SPb2r|(S{OkoTUMN4 (0F:'&SOh,I&Iv-8uп@G9 0}7WA;_vKvW`!l2)4ĜwX{pÒ 壉y OA`w8Jv8ҥxB aGG/$AI %@AÝtSЉ JBcZu$E+x]sBǞG P0$]ek <|jZ 4#fbH!Я x!WXr{fZYAk"4vNDa֡#g 8~ ))yaYpA'RJ6P@[/z2gJL m8N3d!]肊U,-p=3*،E .p^8߿x*hEKF ՟, 6OK ׳z}~,`zWhSB&q cung<@bj) Cnhɨj;ۄw{(z(VXX(!'MgoLQH< 1$4+?2 {T4kBuqAbFaiPy+ZJ!ZC{vEwnYlr{M>xgxC-I-(a 1tcj*J A@ 4QU "b *Fs`}~B~Km qs6|w .m9 c MM a+z sSqDa kuV $ h WdW G|D]z qqGLt{%ZmUnƀRU6 1-/:KwEXdxM2 ;[Sa ?ww.]|Q[F^ t VyhL^K0C:*|k }v&yzf )}OBd x{"Efx)-p p9My@75 uzP|nHR(p 3y Db3> xŀ+k `KnzE8\qEEft~!D :ang[uDAiTYki,3 w< hz_)vOnjA+~| Po9 ~Y2_q zDKQ{X}偕!,|d }xdG+/w j nGZ|wa hQv  ja.s):x< $Ht6u@ emoa2e:;cSD72' L)YqDz1ajY_;)!~Xt }G7 vlq DrxF~VgpL=SKt#}X$9~;  U 7z7! %Kʁ́bx ( o81^Ai|7X w|bZ'& vJ s^|W*g65P Y<|0"Rkra&qnx!5 UBtwqEUGF)z rB q4 }U 98n u< ]yV I*\ ]4ށMyZe6Htz $<$W'$ p|u$ ; Pw{La; ~t0FQ*V a[7:vX4 &t}/m: LCU9 b6uVA JAs|B6_#V* 9 wihc dL`{|"8 btYww+?σJ 5{$6I D4}I t18~V mF)lK^z rslp+$,]Hpl$aui {Nd b\XfBMpb; sL n c#rr~5W-<?~* h T6F ECu {x~DRl (t΀C d|LiRBtiA 9t~s7Nz TN :pMքt.~|yp1:1Bw%v`M%lyO5фqXjAb" H0S AC *4 RuA&~ukL } փ".+]=ׄ1لsd: DzB9m JZ" l3Hmj}W#H| X6t)p{^\38 kt āa D$ Ng?#7 WHԂt~C€[ <-uE=prE us!w 5#}5 V^C.//-|lz[M  fk~G5(ZT9Vk!yW?q nk q 1ZCu)>*a 8tp- VA5bAMoRR\ jy} K = dzxy5{}R Ys/.~]nNCxm yb?z m} _V}{]%vW p &xAUY4W"ypWVDD!B\'^<jy A6o@^/{#AlQ/7 muhgl]j <8 nA k1M!e mC h_n9T@>]D ;J\i{eɆy@J>cEg[ oeqx݆҇X ]( cdM7|}qdz%O;u-9쁇LcrfJs'-E NdB >[ip .}mmILizPMnr^ rzz+t zu0q(q~YJY$sooxF6xksw1u?" ^{6 y4s `qoHoswnp]t ׁ S=ۄ}~T{#Kt_WHr 4 }v|.5i:-\FvI 9r'Mz p QwH()Y~ 9Ɉh n!}VYo҈E" 1= xdJo;&b]  kEAhDYC~8 % B_@w rqm1I 8/PHwK3H%ycX &K^QY8Wn%q_}Sofvo#d~2 =Co~G7.^<5NP:Y"$}}C" i}'j _tpzJ(a7n 1DQrB  9'/^Dn}< +{ :  b"+W ?~CO/G{Q|L mz3Jvh&)Or#H|xkl Zev~p {4BdKE+s>8x96|7c]henA@H?bFDOo,(W]X/:$YFUEouxMA|lB PGEP XGAY0Zm$v܂0[#YG\: ~9 34;_ cj-f`ZS\5=H}f^ a(jh F {W CH8,x!% ' nD {weGW w{)чԊMB f:Hz: .]3 ^NTa m!={E)%Y ܅c v Ru&dHI= u }NhR}Utr=n|heY+=߃ So_n~qqهT5Mɂ >z>+)x=   Yw swn s\ 'hE ˃yt g*-7nj. K t_D Kp?BLRvGL|M` -}ub zkij U([Jbyh6BBDqd {iE\'EUr/ >3tsE aM/_A`jI+P؂bK7azYPtfD:HGp*#Y9 UMgy~cP scQpyx4.m;~?2cKx$uT j0Xa B; 8)^A9M #KFeM.G\ : v ynxDKqe, \ oڌjemGQAÅ nd"a mDޅn>_/ ~zvb mIMN.yYTw c }sg\  $>uE~+`(!%5 8; cb %8 8 9Px=_Cy`@d 6^Wߌ'_k&V{`GEY7m;QHy-1{97~ D 8 m5?q &PlaFf~=a {3F , UN-h;Q)uhATM>Ej t"8sC[ (oJ*\{aY; tlfT``P vքchTvH lX&]|p/01 f ҍv}Lgρ@ fY'I2K_P چmG^(⁀M|: }W3_w{fwi~\T'j8'^ n̍A ^h9e`/8 wV@h9-([O moGojVZq=l1D8 D? :=9,}7 [ӊFE Ad [k ]s*|qE2o艌wSb2U}xJe)jZՄ!^ 4+ICmC^nEKz2 M%# |DHB mފ @({p[i 03Cwt z 酎H^n  hP+mT.s XC Y,(܌4dR zv 8v<= L 8gZ"0I.  ~ 6Q-=(fJ) 1 nk a2ԍN;TGo`@in" ?o )Q^>Mn}E)[}2u3@7w A+mrgG y iA;y?u&Fh[!zD_*vz!PC f_/3w{@Sq wc2?)h:{nR:l\  d P\P M myT+IFBSGrHcq+uA=;eh* 2 ZB _V0!ME 'd`-%:TFjvZw  n MrkY=0Qo @n>e~9aPB ߇a) jQPLcNzK@}Il_.w6ɏWKdA^QbJEJ߀dBE_ b!) ` SxraAn\O ~m\ s3#B% x(iG3v挾c W <NSJ|! DJ4nOSq L5.W*}f~4c J Wgz p!S!he=OX @(h!=$VT4xE6 (X;{ !  5|yFLPdF y$p q;*g0 1]p\&Iv$ v: 7#u- w N'ׄ {dVČ ?AHrDA\4J_ݎW6]*PD߉ ?Ha͓bQ4g71Kb jLڐ Dr?cVʊ1%#(|^ h{DXA!X +M~Hx ;-"dZ͆O)W苺펎 ve) R@Ae9 3,9cQ׈ 1U`| 4z3{Ab /g;B@y1\x#$vP7ҏJlafi.1 'P (|֌^"wsCr 0@ ׊ Xք( 5 TxNxn@ ϑerk JUb=l۔Ĕ+]4ڍx1\A3}T}!I#[Qf6{ q(TP xO"W Qur !%} #KWa 6FjHD;B v v # -s7̍ȍ| > a V6wv<3S7I}/-b Ք7 jR=| P+5xc}(Ď!1j0\2 BlYaw/w B "? !%h$3iUVc /"\HkcA~c$~iq=Ŕ12B E $v"ÇM}Fd ̔]WLjY&>E9enNvTd s\YW+]̓` m2Y@ssl6U| fTw}L~n~邎vc:2CXY<xz4W/ hAx)26eeb59ヶwmm~(0z~{LkƕpT BqVT+8G5*dl\ (L`hg K )5NUQaCd T|W4jYkv{>P vk2Y _ٕ&sy9\ ,\ؖw/\ݖ{ wM"7H7E` !K ; SVb\ёb\ \P1 E ىV^HɖMw ?)G[ 6  'IP0GfNpAK6j,c ua Y荳 4xi"`Bx&'d4GJ= Yp&JeZ"d 5 9zO+{X/Y3~w ~~ S vtnU}.애<+d$M`mw9 o@ug  |g7`rMHy7H{SV? XN_G &a9!F26Mex5 -by%]#k   \y _D k}؇<  U\Y ӗL ֗  nNADE!{4 <`\ 2XL 1K3E5WOT)E,E +"l tLx~ ;H吳 ۖpu q $vj d itwY-] Ie0(^!S I=0  'z^TYw^> #fPr~2elWrP< ?WƖZnc*iHc剌k{(3 Pfa RH (NI?)Ș9dS74vVg -W-0J$^AzhaXaٌk^=SO/5ǖ#  >"W9R [T^Q҇<2/`DVG4 Q ۈE$ U ?WE  } Mjo2.V V0mGL DCShJqYUWo~;R8 {1@vĒhR4m +#N|  &""J [WᘑisS  ]Wi}VǕ˓d'&QV t}}.>Dg GSM%shZR x,<y:+ 痙C-o>!aYA`*1YqM "JEB{% W2 KAJBhޙSD{ D5B‰|)`{hYo'r͙:1d;<΍X*񓻙\%@ }0,.( OS{ Zo|Y%ryJ c1~RC=Na;RAx7!:ZJ+#' 8/{)R ϋmUk^j}z6O.w[kC +O2 d2h2AϖiuxaC|*%RP-d ʔY6q&rt$ Nn. + Eg(:U}NrOG^)|) @&aIċ: " { L? O ϒEWL/D)h~`P M蚹D  |EV$y`v& ZP">A" EښtE*< i녏t;N' a-皑3(os< c  d{*|8u j NNi2Cq@6[ N}5x$e0Cu eGe  !dC]|$a }}amB*?_=>@ d0'k2\Vr J6 b/iX*ЛH9 8 듵%iB1yG" 7!z8 /Λf{a3[ϛqd DrHdR.(1^ YYUf"TNQ >b6}d2%癍x?ѐ92K}KC'Yd+ք Y. FFO C#n*ە Wf#|sC'g*b\H]: _H# ޛIMa t oD Š>l$ 1 } ٛX2 9R9R-z{A; z4qmcRÚH+y ($ O9CDy^t(E\Bd@`V lK<}AzXdS{<8 jjt5, !Z̍p ֚ZHq % x6J Ȝ̅}Y<,(6 ДzTTND ߜL yVᆇyZjJ!6-W* yccIDrzC Zs\ )A ]9ќ}ŋ S #* -n84 }VGbzt?CY2+Y}C:{ T)+ɉo/tO B@<g<$MqN ;s OŃyc5y RK ⏈8 *b oftAl 23GF:PfɐA o՜uv^Ix?ܗ(<7ݝYf}E='sȝl˝ _HÎ!Beo(q)yMX{ la9 `-흡i̝/~ŔhÝv [q Nq +u( +șvi\[fDw{d_rcqy 1Q rAL 4` ;uP *uw0Z SR hW>CwA&BWƜ ['jylo TqC: KܜN/ V .c Mڞ" #*S ؑ :|Y6Zv:(c' &Ԓ5>r SUr<~׌t.!9 "H w9|M ^yO v dNQ F@E iDUy0J8S%%\kB2 .d= ~wp;b5);ێiAb" 5W̒:K2N0П[6$՟'q ]vMB\g|Ew\ 8-r\ƟW/3e~S:?P ݕqV& r@E3 ╨kk 8.6d8 ȗo;C[ }r2GJd)w<1 &M' ΐ5t SVJV B %Ad p v Px5]Ur %   َ56^H}'m \T;{ Xz6@VOLFqh9 * +(ٔL 2 Dr̠ Smk΅b^Zw>a-Ėۏ~㠕-O Ԙ]b 0 BY azӚ/~ >!\b[ɈXPax{\yYw# 8}';Q# BAZʜCLW ǘC4ݐLbdmkF; _}hi' XnnYˢC%-E"r 䘑X-¢nrsxɈ ԟ8lTjeb)n 5m#9t9M 4xha >}=bu EdwI0gpU$@/$RoJ u#R ͆u 7ϊ-K&MQhkTiSL& fPp"XT##L ~^}2|qWl%ߡA<.9WW'pȘun ̟Њ{h ܝr ⍪ &@&W:9 㗽  ‘[=գT 4L}2 w ] 2wd XjcjqhC _qj v GŔAk(}kLn _q꣌ ]k K(Au̝5N3 \IMPWuf(Q^*}nnB~NÊAޡv Km ȘZ<՟9G l;##9J ʄn*w4A[CZE$$~!,~WTh}_Fك_X̏ʕmn o@5,]ll 46oQ`!}XDX\Ge.or cwSāLm4ŕg M l \ X&!,M pn" kIT~{Yq?6y& 1}Xx Ec2@ՠGH] } P 'o/55 LT{!M  BUդKjiJE h8 {#Uo\p dYז W@(㉀<3% :TSu0h=|fzL9C :Ie֑]' `م< A xv(\,$Q6<Ӥ4K̤#&nk"#< "Q"j ƝEm_;]4N <ΘTzjV䥑6RˁQvvEC#ٝޟ1y@O Q8 %ML_k<1PBe\^~e q! t8~vI wY )DZ j Vҗ9 /D֍s^e  rc#*-Ц f~1K|Ο1,xf)S^DU9¦ ۡBǦl!wALҦ֦mo > \J!}\=qa^ҤD8P_: ^To$hLB   n 2C,VL#In6 *0 !%6 xu̚v4E=Qd٦ J+]{87?CF%   }KM8 B雔SbnnT '7@ ZSE 'bdYi} C?) =[P~4/ SU)[ _k}M)Vy2wަA U7g!iVjVwg^7VͧLBW,Ldj0hB^Nj镯 Й9էME\㧶EB 2tߟTySJ z\CC B =M\M  q#>-4㖭եE"sq@ϦE_v L\9) lrhnrk.An@SШ2(^Ñw9՞K IO "jx}hd^BV<o,8,VX*R$R)z|$`PC%NA#8ytX^0p X (e*z+ţ}<Lk 1rd"2{y =1$bE{6Yi>#+Wd اDWlnh=D槕Xy O j2ubn /*"tLSx \nlѫX j« ƙYŨfP  ;Rhh2 7Z߫hAP8fk(-6B{Ver< vc ph|A m6 qJPk t wث@㫎 -PT rF g-fVת(<K*%]{ !E e i7=ئ9AP+w ̩ \q)Y;e';xF)EX}xq %pp[mX^25=\d&xAA 3$p0 j^ hLjJ w*$e00{ghnWk  B+h<]χ  Ҭ*5ءZP1ʬZ+ea",1G $t >o9+~ ެs yEu2"*U2g9 ,CZ'{7.iAi,Au57sȦd2򬗬Cb |9BN#n5W[lH:M1tkA)b ?zNߣB@ ;sJb?ۢ>ڪ-VsTëWP*'/6yp2 4FNg(A=0cBl:\ qP0C. ^Mq @<%ǎ"歟A" }eOQ {" ))Ό. M0 3E{U`_ " xZjIg3d[S|8ݩee  РD|RkVNRS V' H< U& a{Q7Se}n._dmbR! Y kHqBg<mR & ґ Q4n "fLcʮGm \bA4~ sծTh{v _Ԯ֮Y1Y e%: -ﮍ@Qڭ#^V ꥐ3rb:3ׄ?CP""mWٮ0 3= v!SgVmp#" lk +@>nx uJ=2O!zc;V偃34-]:ybL0A|g 3B۠od#WyA:rL C#w}Bm.aތtzhn8 smDn 6 {; ; D2 dlh!g~{ "%@)tK<=~-"g 9"]V/n M֯GEVB Q;Xk΁$FDFuT?imJAAMׯl%(($#2 T L)(I+^,jdy7 N m d^'z#E9NL@( ܥ? p;" {If; +4 ݬaS &Dꡘ%-cnDߑ: Gb9{QA`P/|rcB7#_}L#3RZ< Řnx?iz@9qN1Xv9v 4 fen @ ((<=w)nsc n –eޫ˰mM{ud9Ao&tfkHb \7PxٰEHK!ge/*28 ; *T!Lڰri4qkTE1 @wP 9dJeۛuI8)3U.8#4k*MP .i-r!Tb:JD٥k"/&v\BU:e+ EEvT9anaha; ^kT{ [36 ɌЫjlefKVJE16 4Pz;jmG _ Gw4-6C:XAg~(sWD6$Jk,5)-Z@$63@5bE w Ylz@|@/ga%lŰ6S~q0qL7AٱlY;@бt `˱ر, a k vq;vn`bP  (IVWid"F)Cg Z,DVe:Xb\  9 :Jt0#7E++,yFw(R'F uޢP`G H0v >'aロ#A(7ۤbk~E _H>ք. ?A~j '6Q$VF c"lz!   tT.}pE Z WfoTqxB'l^AeԲ[JG `$DzeM| sc D j_'ݲղ첡)Y8 */'(''~]Y5]}' _JӲ 45~h}e^ap )eB0 <-˯jY14x*s}f6?%5Nv aA@BNMe8 yOLZYhAp_[Pik&F* E~ ųóƳ5ӳgJw uj ͳ{hM׳ҳ((³$vn_7Amcl4OԳz+ o bf'K6p 6>w6S{ a h _n.Mh J .Ϛ/.PH. i#: W Ps!E [0MS;1t@ h(/ 'lK e]-~YRNkMj)P kfN }c l$Yt2 4+=o O`!ʰNU "$$* l; p n "k*~2/EdP " P sN"㮩gnʴ̴h^ DaW } Ax[x3X7Y7<20!JIETb]klşʹ-˴ޙ oPO*jONM=6qNEŔ(I^8J-!' ("[).+0071/*7S85<;>6@=Ax BG?Hq|ǴCMJOKISNTUYPZխw[`Vb\daec7߰fkhm11nlgt3^-ӂsyr{~~ u|z C  qA" 4DT(Z V { El(xVh bj $ 0!VE٪ѳµ{<`  Zi(}s Rĵ޵õൎlE !uWbc/ %׵1hΞߵŵm$ |I[ m6".LsR:ZP msCMfRR;_ @ =93n SfHW/PO * $>kF]n:I(Gn#0.@{UE rJYl:]=rVt bAeo:cB]ho]CqSM֬w+]AZl:l:M]KpƞVTU]v2 2 W a="VaK=KMU[]L]zkf^}l:nƞ=5J trA@ \0Ateen#m\g盅 Gn6o9Gn㶎m/ Yu/@{T/@tCM/@+VM^d NPKQ: +P JY}T[  }E|^Z50D/@t'U+¶s~M/?kѶ^"g9`tHG 3;X(Y-P;Z2p*R-a8pJ3@$#gJfihf?dJm Gm 0mGI|Ar_P*v pQ&)o?#[ jmy$~w' y) cA N01~=v= "/ cR1 c$T/ 6%E $Th @h$TP6+Jk!O9;M(Zxd!66H}`"we-J <~ @g h\JG+,! :dŔWg`D׷`m R TK!j;6s zk s<1##k <1    K,4 u-.V & Joi2 |g9 aZ  B YY&4Im  SY [N[繱 K6n 9e $ r g 2APtj fSya l$[&B Slw" %/D(g`/2d [jfn. <nn~g =>-+ + .- "; }ΰVϺ ӺкҺ &ںٺѺ׺ h D5M׺ݺغ hmWUX  60l$` %`yuMA jdUB =@ )[8cU Z2N+a'+eknD <z  lE - 4|%S GHI9(Y(YD<r6YR.YSTZ Qu*(^_J`cGn ahdibl P H zY~d 1^˒  1< `iyd 'R,Y<&(d z#/ > `  0g io L,z ʱggN" -9- :JػٻڻyDyI })8t& !S{*%"-Z:Te{Β<%)sAk  Fv  ʦPi% f""2 0 >9<"FHJG}%  "`T+i hyMGG surmdpjm ##vt(8ۻ _V[E "t~$E F 5(ir{z9"T ,0gqI+y ny mnDKA&|Ƽ{ 6hC v Լqڼۼ?ܼ߼޼ݼ+àq06|pA#{-P?)g]$$$ixxSle@1+Ws\=91p*I  L ![ zR |-P" us ]|PRj|}iz?44 (KtWP P9~!"W EY@Ku 3,efgP*D:Q MV_kY41" shrmMLZK49gj2&k Bz(G#4hs?4g1 eYoLy~$ {WMK  h J1,LQDǽTȽʽɽ˽˽`s=Qt_6  ٽDڽܽܽ> O!c%~췠ヲ' o&k E9 hEEj  pmG(  Qx YG r C w=$ $ge),*-g7òN  xg,+U+ - Z exJ J b#hV Ge]>zf' 46 t\6 )g)ijxyw~ sdv*Y n ic DV}|h2 U .'O6ht* \ Gz7sxP =e=^=T-[E}V w= v& Vtph:AľƾžȾ>&} J=о # @rV ! ;]ж z %M~{y$tq j>_hB'ns w6`<`Ѽ\?]   > ߭7{g '5.{gK ]ik\}^isx%@BCAD_!<ۦnZqRTSVUWZpZ} `arR|K=ni)JV\}~~TCM[XYVFN Z~u=hϾ )=8= Ѿq6:; 5- }i&ۓ; :: ƿǿȿɿʿ˿̿Ϳǿk<&3ֿh9ҿݿ޿߿Gտؿ׿h忕hea򿲿 Gu  ʫ Isavi1.6.0/oogl/blue_marble_land_shallow_topo_2048.jpeg0000644000175000017500000072212414423445060021772 0ustar lloydlloydJFIFHH4Photoshop 3.08BIMxHH(FG(HH(d'`8BIMHH8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMland_shallow_topo_20488BIM8BIM8BIM!UAdobe PhotoshopAdobe Photoshop 6.08BIMAdobed        ""     !1A"Qa2qBRbr#Ѣ3CScs$4TDt%5!1AQ"2aBRbrqұ#3CSs ?ооооо @7 kh6ઃO){C{ މ7ۯ`biyrnߕbک״2Tݶt[7ai\![CZ#u7 VjlaLy }̏Ѹ8֐8Z?{*Q@~Uy8[kG*ޤYOS w3]5.k5|G*/ȤgG60=rۏy#X~ync,5)a8Kegې f;-nVť>C5C|[9l1A]-\u+>oc7p.jtbHjpKmrJayjx+S\!%>F:TߐTGo#bx3lF{[ʹ[+?׸<8Pƺzl޶{qyߺ2Mg!J[+ye0_-Cpڷfn7qNHw7_7:=/̿̇o:` ͺ?MqD=9\E}yZܑc88ysʴq[`\nHԫjkXyQ9:Gso-#šd\obZ;3 Ɗ(T,rxnH+M \Z588[ǘL73m ̃Sc,566-Ij( "eos$+I:-b5S;v2-t8@<]F7?̛x[c D[,[q.մ]vĚ* necsF k>*8ŜʐnPTy18ji4l2_py>_/T6Vu 2u$v /m훥eۏle+&y&ͣKO( Z_ۄEo2E4t$lv>g꽭VQZoCq4kkG(<߹٭6kzA럥bI/o<iqZWԧϭOµ䷜ԏ_֬aCVcsl;e;ڵ6r n.&wO'O5\\Z(=ږ| ƍ .o;!}>)(Lj оp p9A!3yhP+G8ja-J>˾$W۶+>;P8$aĎX&sUZoN:;OWrV'4]?b.weydhmŤgkW7g_Kt忀ֺ ͮ=].gnNn[MX$P.+ﭧRxe\ym"}Ŭ̶nbmOz}jN+fT;-䋉7#-{CӉҷR^+= irw0;W<Ʀ-4n lϻ][I \c/ҵxl2~b>=Ϸhp-1\H\8,ycCN߳n# uLx~0Tηw/kŞֶ@K_#zƣo^]F\s:>`2?9W~nymhw+\=enxZ1 Пf&!*ͺ[|86?['s5W] j5Pi9n+孀q:y\<0فY$mŴ]7TwH;Wi}n+-//mlXwMy'r~Uγ֏Qm{j|ͺAn`|8SVo,Șc;>0nK(رh80yկNi% =Ρ@;|NhkF'jY  Ak`:K:6 D,2 $ Pe ((ǀA\5(3@14  ]ԧ0z6:WBQ;D t쭁Wiu+E@-DuCZ85Z8۝w?G]NN--}>7k]jI<*45u2@ #Q zHɎ]&l~QGliwMsV.W6b, sH{$Pjd~-OWʎSظ]^uϟGVYt}JTu?0ݾhmu:GMjC{j\;X:\mtPj]Lmwja"dhtZ8"eso[1capغN9=/ Mq+PI @3qyKvK[ZM9x%+yM.oRN/nV[OKVY{Ѱn\qbCqo \Էk-nvwڮ-eeH$o^ui2ir*  WCc5;sۡcH\Ω'؍>I>V.߀Asqs Ms5+pƃwRWi%*T\NFӅۖFHݘɇJ< ku&^IZֻ|Q/Rooiֳln|$h̍]EfY-cd1<4v.򃹴y.:򖹍{ 5]-_U7oL<e>rldٗeps}Q#;9 \f}ۮ8kdmg@@@@A=C+d!CEuſlp9wn>uk5j\/6=6Tӻ{+kP7HNXzp3a,i tJ?t|am;זuիe"ss~|N]:lNɷEgq!3qXZUyYXB8֋YZ6&-u-'8ֹo6\?=6"ATF HnV>=Wyo|//Ƴ#WiFAŲG{ZRgmor k0:}¹<7vikxW䝧~  өkw_eK}n.?w[ 93.'C#K>.--kqbyI{;iqn%˫]9y7O1=*c9`jD Y~5k39񿼗|~-Ix۷5P>Pkz~&fz KytR./d?_ j綽f+6\ۓ􇺃 Vaw]4k as]]L@ 68L:z2~skao<jT`㥮~+^a(?oר9rsC#pJM0{\/f%yK/0\t$ks]\sM+-e9ncê# {iKs^jrii)sENt5]Vƶ{g` hߨ9p߅zK+ok/w +Yq3Rsq)e}K"X32Im }BA:H:Ri+;rkb(-NsޑrVhQBs26(; (DA5AesA6#޼tAnL-u͙-M9 F1{*6zWTtVqr.Lf|)Ֆ睑?nk]1fuzkԯ 6wK[Wlֳ(⍒;r<ڈ= $cxG*W'Mwv?ˏ vgqm s&S_v.~,yUm2m3F(%4#zeڭvlD7tPq'oC>m;fv1l95 ?kSݯJ3;ob3oamX.tL{dnŎFNK=RQ_>Z)no; n.9,ar/w?vS6_YPp\DQ2DY.ܖǶ]>{_G#"쮳W]6GXαkI*-kH>*^ )n'Ď @~Ď.VpUu ζl-ml:fH~vIu׊NǮf2H5QeHYdzrPʱi ".wCs3@ZkʦW[I5G=-L֙ORz]nwt38A kOZp-雩)M=WҝԘdq In ]dsߵ]h0yG0ьRKI7uėN<j<`q(vrft50T QB9Ɖa<g2VО.,E4=:iE(ɹ3l6c c*Wٿ:fڨx#kõPDZct\WKsV}eij6*Rtʦi?c˟~G9DӺ{hM_7cck^ZD7y[mݶˉK>U@çj<׻y/ySˠ.osZis69Xob{{@dGFΛVɶ?P6>nn'meHT,Τ3lߍTT]icmmKn'vyv]!d6&0 q:[ט6v)V# [WթgmzzK_1o>F[e#Cdv~*6-|PacZ"hwV6oj͛ˮei9Ǚrm%=[m_Cđj!fk]rm.uWלx:]~vl.=ڤf_e}>96klkmw8 s`R KAWi+.n 4c G;߆E˦yv+=ˡP^lhjpT|?I$[#8sut׊N釁g\\I?9]oі;-1GWk~Mn?_ˡnn=6ёn7?ڷ&`K 2J/^?6^k:XE1;Aj$Wo*8[7-NȞOFi]&bL7cTkqU@@@@@@@@@@@@@@@AP(D (1D  v $5 jM+X*~jqKZ-UF{,>%.=ٿ̿?ʼnn]%{dqܾ^}}ߘٳomFk\ڻS\NJhY :Wik=EIy/"|'D>>VU\檢 w?k#}%6ou:_}]Tb%w\gGѼ2`f1:/?'iwI{vy^c1hv׬_5c'<ܘ#.Z+hJt ̕5}{yndh'QWI6[ k旰\l^>]/M5SIz dqJq~lǗ|͵wſXY鿯;gW7;swk-"5iInԽoӕzv˟y[+Go' 2=z%fV-qxlאTi47O=<)viK"R06՝.+y|~WO)6NOcRZ@p52۳yMu&F7ʙz|zvu{ s;*1Fܽo\NzbO55hž׍}׬Ny8^G|,O#,$>MMkޞ- V_۽e=r-|n4.#,r_ɖ=O^FOۯqӢ:=.[_ڽW7ºi7͋CGl35?\/%]yrrt^o(~W\ý>иddȴ8}>ܞl-omyhs1(EAs}$Y? Pw[V7M"x6oW |ޓ㯶 q6ݹlh#flZ]jOO{i,w h3R7}ۇ=ud5woX}sY {MM&F-Cȟ|"}P|l@l'' JrM5{zx99|6kKakakpgXV|"kds WQN-qZy{#)|,IԆR.al?rߊla]n{n.RcGyvcQ&XF0)Hiѿ}y>1_XȐIq rBݤSE~+I޽N*ZضY5i%r^I^Qml.,,k$y=ʵ}؂Umx8p"%4H!-*PK7K=OYzΥ'1iY ˕SJj(4@@@@@@@@@(D }x; dfגmk9)L=R ?畸lwKy< K .qh4\|{nck6x#aW0u=MOrc{0˾xּЀ1\\rC{ Ph>U$O Jԯ.]*"{ IvMcI'YHϜz.KyQmoauvW1X,=$h;LĊdXF>)u2Zly4͑{sF>z83~Qgջ^[AH s`y\Ǘ|깧"}7v?杣NGMRid}~޸"~p0\mN -Խs>?J ݐz*eªܮ4 p sYoc"\js[p W yW;ɬؼ-.@/LU[fmrac͸͘\۶m7 m$-.k[s|<$lNS~TV[Dm^vM?jkk>C1\4KϏ^}kgI[uc{ECa6vdNܷk]q;(^I4TU潐B414'IRŽf3C[4i 5ףvݏ \9-w `Wtd.vbU½6oճl63\H fw[w7uѬ#` ?wOQژCu{{s>ʿa{x$1\[6!0d|ܬ>^=ƻb]zP@@@@@@@@@@@@@@A@*{\ony26Aqi53?Z,bpgcpϞVnwXhao1P о fhs2Zi &wZ;=BzeYd1 v̗mәkޢZY{am$u 7.>2s{<[Yl_$ٰ=oa÷~qfv[)q{#shק?|:_yBǨքWk?7l6 |$au 5#\ִ[D=ov2RLW"kϿiG;5\ >^_#I.{NNI4?Y5dҍtZsb{>]{o$۾ c$}G`_[O{Fo$x,y{n$f{oqN _`l-wQ1=ֹ<&z?8EvƆ[,4FY{o˿>B!内A1kX[~[s>N;(?eqoU?py7[Xں:9##tx?wfܱ{?f?y/&oOo-^z̕ёH,Ewfyv{S;78SO#:nWZ6XO57Hp᨞js=<'ɺWbṷak只'VZ.o mߐBͺGe]-/u?sټ.#{ kC¹#;oؿ%hNq{)FچW:Vߗ8w ߜ5XN Mymbwz廋}V&&lQ״iZ*[-3_cfKZ\adƵ썏ٚ狽9yYǷ%_Y{tY. P"ae{FU$b\0 B̺gw-q, hǖ>YGڿ*;7WPH.., ׌ky2/ʿY15015yn;I^ծi2Mj$[++NY6s6q{+xm9d踇O[ͧNg.6MK[3ɮ&,q0StcW$ci,%C39!rx,һo8j m~|'йro2yfx{鷑­Aٜ[޾o&90 [dUwޑUpR|:X(˖,S޺`sH۟M{՟on(\cJUt/>H׍]T}&a&}N:ZWkiqn{n:DM,b&߉AsS:[yXPMGڹ^2] $CMOinkU>Y55Qs-Ņ../ǜ2ͿhvL_ 1U2x-H;H@hKyE-n5n ?^ΥY̌ s^ћu1bnFH;_Z9U ڜ 0nK_oO,7͛/~Ɯ;ElD;m iHEWzJ{7qGS9M?ԧ5?U)᧙iYO[!PHs^Zn%<ߛ+_#¬{8;x=q&Wsa[o5P.2b뛜k]u q"2{-&5Yq^ jlq#/xw׼ٕ%qoCe 鄎5s+:.^.NYnk?/maqu^ýUokI[|Zzvs\>_۱mi9^9^k~oe 9xvv/^G~_Y8#v?K|F/&_;N;\wL).`"`ZV羸f v2,{x]N>W}cl]|v,i.nu|Nq7{:͗{D2ƴ&6$XDDu_?yǭtvڭ!c]#Z|4k>9q\kw7ܼ̇Q1X+z}KdG| S[_рRZ;\kºDv A l/@ZN^9q,0 nk_`d^vb.a$ QF}ſWaWq+zzeZFⶺj$h؜Y^=q󝽕g2Lt蔇SidtA,xx3l`hiqpuacy dnW\?T<{k@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A 4~Tt;ECc`T|zOu}~_8>ŬF4Yvxmqk/xş4~olqmȖRCFa;T]5Y'WVI 0WIo;t/y.qWLj$ !4gm4tdk֜?w\5:_UrץRA Ak~X%%(rX~dlKkN^wЋtth u?bo幭>DuE1.ÿ_ѯV+osVo'۫,tкSiBb{O_kKc̯7XL\mu>8#MZ_:+5LXw,$ \rsKu\80RV${#"M\%OmsL\t6Ni)) ns FNm#2*L۠0Z֙|]=Nc]0HɦT m0Fk{QIqc -fzEs{c?Fsy˩xR59Oy-פK-[SFqfglΣKy[\hy&-|_y{ gxT`ܧaeu G#r|6O wh5JX)޺i5۴ً0^-*F7 EA'{[3L\@xˏ]mJʎeL.ˁv~ǍQf3K[B맹o0斚BRUDE+#4+_JVԢ {x xF7?^˓ķ_#6muőS}1ֱ7O[>@RV߫]acN` Wҗ,TP ]WSO+a.M2yeKZ[j:0+E>[cpI n$2vYlzt7PcSOkFz}ܽin; = ^f/盷gUcT*^]o>WOi r=t[Yn:ݩ}e%\e^-e"Vxn~MmTHl6Z* "e.~}o[XI{GWi},!OH#:o'kW]qU5r|[2Z8n>V}MoӣGsa$^ێ 0do){a>ѣ 48p>M=] Ku:]V8ւ<齧.ӥ.O齯v * =/sSoY 71TI.tQHtں@M5n2ӭn'ךϛk/AnsqvN^}`t񙫭uZpe^k=S=<飯{mpXeglOW|\=2>m3\Gmt13GJ?G7$wZls1FFՉ 5is9,Ɨg|sC 9]O/%:{\̶Y*p增4'ܕp^t۟-"Vc>[קIs<=0[W xts>3]w=tzGܟqަR7N |&hp5'/1yZ] tbp`kw >/r|QW.,$7:"h#Ŧm]'}כ▾El[\,4%Sk#*}i{$*:҈ FJYz/8ӒciOWfo͟263K $;49-n_9ޫu.kxݏ~;KiAWzULמƚ0ZQD\P*PjS\(y;E 9vg2F'/:DzgK6uM_8>bdvG){G+d,rfSnS}Hƻyцe.|kk$6ycH&]&]ɫ[[EIoMcz`1^j!t?vͺ<* 'zy62G^5rT%94\QydU4x΃ʾMZU(9;'ܮ-qIֻJUݝզIg彅Ke5: h8фrM2G@fC~g߇yuViq{Mv3:I^{/2yuh2k]O)7'_=VGܴs,ogV㿌΃IeMBڛ >(<^ᬪ_JdA#5%ww;?-nSʮ sv&5嬖EQBڃr]9'lvKaUYԋL vk8ؿ{i`:fcG^e74 p<_u3m>E{uS{4乱v7 $ӿ3 %]tY^Zo6NtOkѠHq_3q>֨) 1'1{NMU̾ k$HxFmηNvGo+fzW~A f1]!~u)!n[l3Az_˴6u[=A{-քFk]~:/9wok궎΍Y~On[IG!+',vv{ izL~<-}]އkڷv(!FI;s6\ҿ-6n|t]alQHكp[gml#X"rz @FAVJw}K+/F᧱7}YZTMz#cӹckqB=<5$LmMiw V8;Z4e?47.2cu8aYkyLλ;|c,BYoӎ70ԧO}z-s?:oݶi`c% xtNGʾKl@@@@@@A$Mdqd~Dmt`/2 hH!UDFd!Am\e@ hu pX:yRGϖA1iubq>e<&~ڗh)=>VeK) 3!9=.$e{7k.Whuog5ʅ1Ya4zhԲ, /K,* H\Xбiv-͹v#aYsďB6n|3&k]t亱fY7]chF 0 |]<n u8FZևW pZnnaJoTF_O&+-5!ڪؽqnYd:r[~oO-6H&zOeoo.ZfO*JaӊbS h ȝq%0jQqS5ULtrTbi>g5#U! syoz g;-ϹLjk¾Тe|bpkvx>YY67~M_v1$N WG\U_OL>,|qӤOI"4{iM$`DջЬ. ~٬D3maMz|F"|L ^wLw0i w2MklEc`YbI;.9ΐN< P+ZS`ZhU095r>Cy\TɆij W{O7L]n2)&xUk/m&J)OH y7xq.WkD &y8A''KbG0fZr^/u'I݋0@jiԅQwoK@Nip^M9v.kZhC޾# ۳\<F]Jy}Ƽs[iil,`3+o6I"V-nFp+.͠g)a>TEr9jb Y2E0S+FZxYbW[qiЦ]2rjN1jwZm\xOʻk;mSel]XOa3RoS*]{]ȫ{YV2c?-k F)TNV<(V_zS¨_ybܓ3g.~]u,yr*w^oeF+,r|V~y˚љ+ь6iKL}՛ƽ2}enkYx1 x~ҹ^E;/w~!s{I"դWn餃JfێW\eلkzf|+l്{ p׋p{jEo\uH]9=?gՋoz!hGM[Q?-EOzՋ\)nV!&V.$6[%nXM2CMS_>]?u&/Zye!$Q t@o7'y˭l&54K_+ X#x-hn*l_7NCKF0пkUy=ΚwKz.kv18X[56}_oR<]"ٵ~8\u-Z\Kpkx\cSXyv+/Qloyһ9 T9po^MdoͺM"B!n8o={FŃAng٪-u|O8\Z8aSYr_s=U!{9itoi E{ d*F/MËiirƥb[XoW9 ūY]zG9 .oW'ͯWw=!kȼu_^m6^/1]C?JWN݁Uڽ[3?KmR-sp>E}u:HHn .&Pq1y{'¥ѩ0y[#[Y_8n_$ӫC.sk q҆BM\ᆞYnc-pvKpl$sWp@@@@@A'U*>>ms{nFNIibar{]:G8m+;@BG'i]guf977}W-ď Z:kr?f9?_Boܶs(ijszʼܷ&JZh@@@@@@@A;J518K;k\ u)|EwI &CZh}WtraˇʖW,Fu+'҂8R9*1gp_%ECN: ɔfCm8tZNj@n^* Gswy-al $mѯ释Ө- #XкɅF2NB[K%P<8ڦW-gJ 4n&<{O\tQ3An<iZ=(Ed}1͡s586[w55[khy9PcnK[ȈC&@qoD^n'EsZc+9,L֑C@+Nr(g.v 8zVvf؉;>NJb4טM4(5TsxuƿaZ//ڴ+O ؉+HoWe_gy~U Dw)v{_ݏ]5:m hp=zQQ[iΫ3 ]^.owI2ˍG?)a^DH-#PcV|԰0BM [urm]G*>eǗ]6WJ_0|Cn01 h@^M}:usN7q5ƾ?y6YHFdq&1X8S.p0M^ʼnW_uǷ"ŸŵJ\B(3+xلzmzi :]Jspmݩ4< 5lI5ܪNFxbKïZcw8$ z}ɕѧfcϯ҉ݭXۏm{Ƣ\׊sˣJQd9"L%G5sKLuʹc4W9fk,R@hkk`J, FhUovϽ1T^X?rK8-/Lgr͎@<ʒ%b&5~NZC ͺweb<S eRա Edw@<Crs,~$_(6"yF_;NbUrUA^FEYibKQ,gT-es.ta֕DBQS 劭EyoMFin/h[CS8-L|`chpn#s]#[X]٫+i49'4rem<qKP*]LvpHhw+1;)YVYqݏ1=R07@] ³I!*(R#$5bF,^ehx@I; ɄSզ[Xߵӥ̉dg{3;xƌk2ˤbH6X(?cQ0enpV1fTw3pgNév+|@d/=xyI\]'fIZaV? ~Oz~S">ELmXlboi -o{m<{A#:v0I_G]qu|ka}JH?2=!y=.{wVKͱ9F)mSC㨫o'ۍvܟIyZdtDp/S\~^\kV}OYR&ۅcNo\~[Ђ1#JzuvEUg1f6ץɷ qwJiۿ[Wtacif_&P Fݾ% s\9&ďem-sށ>ھ''䟶Xob㣚r-8/ΕXm޳0Gj231WYZGu#))1yʿ*Qf.SIxج"/Moέ:-e"gY\nPtң_a„hnZA$ԏԙ2)Rty&Z:X̌h2u?B<72^Dեa ʦq49a>'+nj)o TeVN[>YM<45+\# ZĄeـ?Yo7wcp Y sEG,pj[6&NԎ!grEC#9NȂyƼd4sWm8wMmP? V4~=Z_PGQJ64tǒ˲kǫ,DImz5ǁpY9mmSHփLx~r{lK&`lMSy {O/ze(nqZډ 06rWZqMv.Y϶lN5kxUv۞cs[^z{Xl$MI=^+n/^MY.lq̭Mp{+[~MZV2uc}<`:Rre۫y;N9:FҏjG+{=|fs?E`)-(w=O[_sum?w_tt sZؚ(}ow|awEQ網+KʺirYLg +"v5}>9&#oWN|dN.ܧ&;pN}ѓV0^FT=@ns8slMu-%KHmZUUh^t>?7rϱ3m'h M\܅j@LotlLΉ{)\q^.i3ex猽NŸB# KZ7S@>+~^+nucm6W9ښ~s.\n7[$-Gޣ(TovOlOTnƂI9vWvWAy8q^wvy1sɿj=uۛkzVuvh,|3gזtV7O:W?;^`ڙiEZ1} #jڼK͛ £]n U*Z @\w՛)Qxd $G-ެ?R2Ӯ散,PT;S-hEYZZuI4`ƯOsVV0= n.Ǵno>I +P1S5<:5*{ynI8ԥżwX=4ytnG"o+N w8=Է[ztMlXzvl̸uڀAiFj Yc,騮g,x1jTPPA [3|+v#kՏG XeP8X*ڒ8S,1.OuˤdJE} І[jcLUg8 s(Q'"@F2i[j゙ F* ~D 4 ~ Ph=~d;J2+-F 2ZcZ9N4PJ47sP@nEík;~1YFVl$jˍ2\L&P\Re҉j4E4i^E\BT26HjLї΍UpYgN+N #9WZaމrUX)[ 0L^ԕûP#tOhq(džA2TI#xNJ {V0:Գ- p+\CJk- ֋.4Aw3IQᦍ f;TDFb媸rf”Yꩭ QE Cz М2W/Yfgt&}|*Jl+~r˫SөWIW-ye!T?0$8 оLkbllWYŋ Kٷr1midt^o1/2#?RS[ohfq{?y 3B-UT[/m.f/@!Bm43V){줙<,omS>l@ʸ즽e؊w->qk)C_^[օq[}^9jZjQ2 u؀H5ǵ\U]|GL ɖͶsj3)haZueUk]&j}W|E65X* m.ch78@!<ZuO(_*q?/].<浆!I[=7S.vN O%k+np0ʮ[qLc#<oyb\0ˈ{v[2[VQc~n.\vFgA3qwmV0ٍ-n1XZj ),XkLV,5 K\1W ̙iSSYKms'/II4{G*I.n=ŠƤb9*9[T]Z &Pp0=3h<Vtff*6pn0Z&g^Xo,hUu+YSI5) =W;9.=^=W~w}̎5_KM&bT9k[N+Ϝe}9Մjݞfo3ap0Y h$d9Nrmt w\#n{O3}ne,~^3"0iwR)xkDxӢ4B{>dozes@czq_s.1f',l xFN +vvy鎅s^oq\}_`|mbf1aOi%&떻wś=mSm15Own]>Ʀv{3u6~U(kJK ` 0Aނ,}ČwN0\pѨe{P[G(خnˢ/, ]x{/%LX<@jQך87UXk5MT2Jod pscEXSE7o%1mhjh=9O$CZp5DSFE4^߸K"*G0qF[ kuZt=R9ՔSr%$F8/3XfV+ [`$L y-9ci!6 ,ʈ;hܱn ^ԱZI:<8)YާDZBj F"JD9qkFY?Zcspϻ%lW&g&p4е0F\@dz+|e2cHArf4,Q:|C Jj2T"MrS*Н=:,lʸВ+U[L4Xw?"3 lvy%ia)A:k-oGS͂~#jy5,`%gX9һYâ|q\h{$7#bh?ZI̼}D gs57R9zVsUn>lAiUŴvv]oI W-02V&88[VS-m5J}?-.t0 ۇi:DͳtAXs{$Qk-F^mK]wciA:wZs~fn|ϐ*_ֽIمq~qp+Đ@+7ϖ%u{b *Fq]]4? p=BBƊKJVU>K+fr͉TݜcsUEr_j9$Vҕ><8(to5 `h$Ep^;oxLKzdh'҈T0 &$wy* RVf*vH0~e02s($Cjg\C!R;VZRΰɺhʕS'9mqpwb-tUOژOæPE3sq xAG& jᱸ֤b)_lmZ\*3L'QO#\} 'ܞ G΢\.,2ёࠩ(oux13S5)erYg<OsO:ͮDmS!uؿ$5~ajoͯifVb2΋ɲmB2*4t\iiV飰 ' I%qξ̩ޚa*F' :rWɧ Vz id!Z*mSN=2a?p R%HntEGj93nDCRcR|ffj3GJx&`F:"\ϫi1ok$}f1_/NrRfA4,:zN3Ֆ F. & jvEI>r\=9#G5s]^/us]s4||g=tcּdt0_JY{9TdGڬ7Xj'_;yw^+}G}_w5\+vη}<[gbk}Nl5;\=>-Kv&?u88.tb"NǵA«;Mo.n$B'?y]BƺиttUf2RATS[%.\){Ǵ=\6 TѺH{Qj]98&:{J#cqd˓zsc/Ҽ>-{nŤiOm.v旨kMF)fG|s񋈀#|zurp]:=5h/䅎uZƍ,5vW~WlIuo~z@g9~F%ֽϒFvo(k@Q }|ͺ<|n$F|o1VL|(_n* 2BAa}xmy>>nlb2 k9w!؇Ww^@Y8;Msէ7{HIcKHhhWk'fdšB mƼht#C^67ZkaKi9KۇI;www{yi`8[tm:z'p{,9KFOqW^Oq/_ItZڙ6|E@^xmկ :Vo6[ .!GSSMԫ4e u|3'MVmbLHZ`^ݙ(e,/|S+;/9 D2P-#uYHr +K-GĒGWM4ޝW8оfq lRywmWMsN=8ѣ[׊[hy$ b$˜Um'=Һˮez+L 'V84\uNoݎ;ˆ5|Ӻ͖nL MB6ⳬr]th| =ח].yx- hN_;mǍX\#T`M(>eڦxq+k5bP4( 0Q0hexTtL5n:kn2%&r,.E\9Q@>~u0Hd  WIY2uSӚ.lBcC%A!٢4/j3 &S6hhMM*x(< 4fi-`ҧF[3uhdVӳ)""aTdI#ZilEE2"';7%Ұu q RW7Q9qSe!RT/9rW$ۊz`-gbI\;JԞ]"eTh=gJ7kzȘjkhq \A.֤Z:ƾ+v1#KG)I̊KcHqj?f2X,fF+ƵYc8WW]s*lڞ*8ia>[}oTJۧ-~ܰ\.[ tNgi /$T+lUpierd~#‹S+QWi .qhŸrj 5 @^ŏ7'r߮72"$G4 +Vv.5s%ᑮg/k_Lb rg.eᷟ7m匰?G]Ao?_Wo~ Gvս+>7 W)Josy'}ݷVwe9Z~᛬ ueH]v.^NMtfge2p{(>sKۏk?ڹWqp()W}> fZAZ)=,|mxգd%|7EXh|J ̱ƴzɅsVbCv֮ٙ՟7e,mndp823.^b$ 5:Y3?W^\\ǟm_vm^渂G)(tP]yc`,Qe-/%Ċo_Oq;|Nw}0;6S'i:* = PUwA7O;\H͛Is@4Y[X7̏߷7_y =N_KYƱe]tj\`=2FDҾG7{zMcyk=p oe/$׉&JK_3k@fFEi{ۥ. #//z#mm -7+oLpAW`fVJ:=/8vޘک,Q\PXkBTdަ th;JԖQw僐>w֕{@/UtTA3_?3.qG `szA4Υ3eK\H'* #$#4n"9!ʬޝfd஺[M4MNڡg)~a{}D} n_txsɖkYOb]d`-9svFEu:vf`s( n@ܵ2зrWZ2k Rlh0ः,$hH؞Ɲ3Vkq%aU oZ~Vp(Pt I'd¿2AS0eZš%ntD(Vlk M)4iʩa $fi^uPɘuUR9FHm:*SZ-IZp_@j1h^ \nwTْ9Tp#fR̷꜈4SUPH@i$d*TvjUwZd2\6ꒆ[㊃bZԂ5D^YqR}[HKә8о Zj0=of~\'I]GkۄP=}ͺ" /˚ǧϪչ qk-u #س5KrS'3ӆ$fWծtƦG^#IW/gwY /}*k-˻My .4\ItohyH .%݌Opwfڱf=wV9Ҵ G༼]ϕfL4燧5ocӥwǛ6>>Oɥ̟ה[ۦ}ϖoz7-uA/']>;/d7%nCC}W/EmW "77"*85o υ%Bͦ*>][܉cq7QoI&/x)~\8qNk{:nV\;A.8 .߹ m󱭉Z^OKS~'_7-,h%5ꓫή@@@@@@@A0\{Mxoujghyiwq$fWUI.тI0U|O{Q-|]1b7WR˵ZoD,gIZ_yo\ -'U9 YR@egVTaA7uv,+U4b+^o_ʲ9JNsIE2==LFWR-,ʉgdr @d 0Bִ>\!I=L +V*-6N34*rgJv}. N@fM+/Ny[~"ŝ%Q޹rx DSf3(Soś[EFgYFXQR%Hĵ.v5:as3k9e[C^ɋAEQ2ݤNfGX8-#uq 2{4΍ܹSJʥ .QQ˜ +=7JxrIiӉRFV8i ;Y,S|B@+]h˘ fISq;ƒrYJˉ4Y;fFĖNgU4+5ymu;lKIu&"3}))5g LMet7l٣-x,b= XTL5`ئ6dѦ5] z\PYSEF [0P 4~CYQ- ]vgEW!"@L#x"a}2Upvq1rԠqskU2]\&kb]\{Tf܇U 'mH;ƌhiSň58$@h.iw,½(NXDʴVή"ZK#hkز=%}m&Z_u+Qo]5+gHos%lna^/&Mѫ»c~v19h*MJ7;a.1լGN2-KZH5GWLYk{❒펍_)ao.q hyy59Wk/MO&.0%(/̏K?xܫ.[lD} " Fn-ӫĦ_FпfmqݙZİt:Loj˸fFM+$2tN~xK.\}e_I_d-YɗZtWlD)M%54{^֕}0K:sN#i+2[bˀf8BH"nc}(i.HzrWqaԱCCZ=乌n9׳oqi㗋вJGW Z2@5TxRVAΣZ84IoeX# YT^b2 EMiTSPc jƋ÷;f {S97r{~tu<`1qy.տ;"ll<tVowEiX$r֨KM)핃e <$Qk N$b\lېqq'Y񽌧ligj\1ur.g86dS.yn  A{bL֗x̬4yn @3U[[N3n}Hd2JqοSP^d F",w7 Ԏ-r zf)v/׷:iIVJ)GLe2xxTTxi4 D4Pu'uya$Oz{'Xmdnִh{~眝E7 }z3;#Q:;N5X[#uTv!pV\9ik\(A.іhtnaLT{o)csMT|d sg/թ_|#K{F/go\ sdpZF|OmXVg ! kS/v䯐{~e\l{q>&`"p,v.jp-q$I^Em$g]pVA+Att/K6@Ac~8WоOGۮfLCZ:AQZ{d]t6+A!$iln'}~٦tZFՋU镮lxO?}(H vTE 3^k5op2G5۷ʸum 7뾘geˢY3 2SE CFYq:,nd_A -T2R4"ʜk,5F\jI9- NDUQn\q#{Wi􈳶xg?ZiRfI, 8C/vۿy9Qw׏Zܾ_^\6?;S.quS],+Gv\]ݭ]v>xlB,}ZVaͭk}U>kפt<-g'4#5i{͟oؘ5=ݧĻm 2Nquc` 2)1nQ 2W:^X^vܶug&dc#=sSfu~`tG36/k{Fza³TSv.۶?kȞEr_ypߋmfgiߛ8F{pA.9Qͽ7ʝYs-clӫfѸM[x!6-Ԓּku_y7t؈K]\oұz84ҜW)Ytq5MJ#[  ʶ(G UH3R3_oKH¢*v+Q35 <j0H0u<{`oK99PTG)$cXpW*%bxQZ[L47vKZuHiyN+׿elL AyvpPO9|ߵL᜶`2bp4U;u:2YL[[) 7omЄ~%#r1oAWxYoV?#ڸi#Aɕp<h>|srlfTaԯ.]讎g,tc}U|/_&{G8jє90.oDnߩ^!'/g-1# y6>VV5}Oc%aΣ 09f̢9}kJQ<5ǁ[׋m$p!!,W;dTFgVwf"F2  jrYy!}J2\CWQ /GvXԢT\fq'#ZOUk[painTw5[ӷSP;\OsíC1T9;uFityͤvm_a8<m׷8oBmqF#h[^]\у8WS(6 %*4]41Pd\n WL \IH6%ք epS(1VPц% f8- õ  1YVV$OkmY#=d'hM)Z(ԭ^yejl{ ݹPR+ K\sJ,cJObY%;R #X)aJ"K22X3AS[ĮC0ھXah꘾QQY"D-qӕs^X_Gr\~y֭P.˔nM{EOm{=,sPA te}+o[Ż.sks$iˆi~{{'D\k#u/65kL{}]Mi+:b${6;Cȟw~-~XźIt6f=inCjҸ2&^ hEi5/=6Z܇Dsޕ1#e(9e@Yk4Tv2][H st0>Yc;0ڼӚZhp!}Ir  ʖe/,c c$LMnC ?ikYy' aAciWmݮ;Q+ Uz{W^?>|]<=Gf~U&-v8ffۇ֭=9|oloΌͼ㨚k7s.pj\>]:ߛdWp!ku`z6>9Fa_[ؿ+1mm qsOhyu2B^$EV7$WїIpY,[p&Zq?mZGƇ^+ۈQ5OUe$.k7>\Uӻ690ឣqVpY|[ "|nqnRj^dsl)p."$-n'*gDh`՜Wp-- hҺKA8($d܏jʷPԩFq+U|w2kkuf!ь Ϳ:nU@ƯQ TL5{@Halhկ`1G{TEraf#8 &raIi# mWqV"eo(iSm՚Aic2lZ96k @pL׽25-#FpnDEh?ZVH+Ys#]. %dڊ_N* AP# uA=UhҊrٴy+e[)ڳr55o(͐j6|ek2i@$^jrЌUT`<( rg3Tj,USNBIZF- .pZ&ZL)j-R$Sftepֵ aul d (->ӷ%p(Ïoψָgj. %=pVQԐh8m+&O81rD-鷁+q{]f1#5EK̰ZNdn=vO#5Χ5g5EoO4;m5QѶkoM/'YL~ mKNJn[׷bܽM:Ng7F}]o{Ҹv%_+k`T꾧ӎO-kÊkPc[ۇ^N?+Ʈ8Wy$Uо  FUDGN˗#Xad|\(U8dyHlj}Y$Z537}粻m9uHn\\kN {}x}_h@@@@@@@@@Am'nW`^qi݋2&,U7iv-Z6q_Eoe?ۦn4㎓_|wg][{v޽>[{F @өk#w/J+u?DەŽ ~m.'uȸ1ϫw7MhrZquQry)\O)8 \_۰ik[Kv:*7 qҬ˅9}7f8 Yx\c)1Rг.U6mN}];mZjN=X+Ya{yZzEk9\pABN|bmsk[ކb3ѻ˗54{56 --ݮѫn*(EI9.xg(raL A̕]S*t]:v# zsryXםA'>̗r'Q;ViX+:6iӑ 5r9!M# ZN#r]]9huWo1+7*mtjOshKk/O]XKkE}.}y;" ?,\)Oҫ\S XtXyp-/[qk w/]5'+О:z>UrP R2gFUUvż&[T] n>ܫF]':-5 İNMbga놡~E}%ƹ&6/ne:1ѡ8JvRK}G_a֖V _Dld~4 \H'LݙEh׈Zacqn1f~}~u]zv~Ńͧq/wFM3WY`Iac>Tfh sZXG5@RO蘋,5g1 aOִINCŜJ^;F*%自jOz2穅@Y[Q(|‡%KZCNUdўuTɘbD9`D2W^0wj[Օ=ldgYL%:%7#o 3߭u27rܻ\>exӤDA {bgƁc}7i`KjHS~o{GInxxRunLj[yiuh_Oek Ɏ:i$jw1R~nw rB۝/pMiuK]3=7#'_ivz"5о 1mS L嵥t|k˹vvs-Qqpՙx=t[.d3<+Wmvf̦Y$0A dX-q77:4:=qu%õ޾sI2Mx(06c+e,u{$h-4.,K0aHCZi mg_ˏ%}h{#K]g<;j7kɬ#uYّpy,"6k[Y!8_\sxW+*<NOӊ-D%JfbNGF@.Nq < \.3bi'jlpPLӖ4jdF#c ;+[$c\@Pkt8A͝ ͱ-iL;M7£"7o%6Fs =*LQ 2#}p9Omlj35qxR3@M)ܘ,l>UcB.|M=Pe@;$ ]֬kүq݊W: w,Wڱ Lw0Mc`7ȷ,՛8毎E4 qf@&o ص"KҔtIiJ.^Yˮ >osW::=jθ%͡%njGKfV21.Pp V*C>r|jkK*r=њcETULM-<#%T[lgD9߃tWKTA Ͼ%j2ȫ\A\OTP;+Im Ma_\b4Z+Y,ČjRe|%2Dd.fhihd2Z2ThjhPd;2A?*e$n4$wTVJXTQ2{ʸzF5Jq{m;1Ľo7"6n!jpqucZIqk3 kf V@@@@@@@@@Ai!|q6k5#Y Z O_ںΎQFS^} J8bGSjzU7N.s{ TB/IcYE/%$+&:FhКD2Z$ks\1d\|~UPEо :%:fgyrK;xo.^;u;4¼ym'~Dʥvs2ݺ@sIuL_[17 1Is)c_oޮy?"aQE]P~\G^~,X'aJj]gW,d3xŸڳ;23yy&:h$6e;iԹ޵{+}S v".oiep= c1AaUj`kA&ԭI#MZs o9GZGE,cT vҋa9֘řP<#l*{{q-Ѽ<,>PBG$۳2ЀHcnMubez-m54Kǿř6؃ewZoza͸Oy[)5Q^=x7[+}׬0 Hk<~ivڙq<,ĉCUy5/_|}|eҊ CkcBmvD3yr'X&|Ԫkwx&WaZ jWkw2S0H@n`bh,o  DV {Ha{0DMi;2E״q\Lι) ݅sV!R>oBشΜ"6Ӵb8 pY g9l08Ũ5vñvt74{ֈhyvR:FcA=ʫHFhJDh5WN?/Ļqgzuc샇4W0 0֓Epk FjA˾~i)Zp`9浖udMܻx׽rXnZ6ΪUq+"a'T%k HGr`QS 03OŸW T_/~Zx- +J0ȹD8c:U!8ܘs%g XP §(!˫5 9.#qО\Q+/Y;LSCe, т,]nu~bp|竩֕5{<+ZS5MgW)[t/U{g #uS޽si>翯^5F?APd|xߊr:{Ij\R~UYT+J [ iªcI;i`0Xg j=l;yf-^omH{m6Xsi#mc&T+] 52p")+r׾YK[jwQ{s| vҫ<IEE^gVZ9v8`[;ǖ\V,< b0Č+|J0= A-+.p ڨ+r۝qiK v#ܒimff{~Hk5+ܸO!@p~t0c[rQ#|8-jkYb)Tk 怚 ^sKN5os~P}-XՌLE|_)U1ptW8Aآ`8 A/sMyA %82AEUIOӞV%V1MrMڰ]Iwyip[5pKZХKM2*J_k۴11]V%30Rqq80`pq]0d5\5Y+5ZJJP5 妶Ba1MRc{R @ԣz1RtJqs1ʩ"xPFED8jӑ=L B3L`@-XchPPuV&4$v UgxB!wm3]j][ CTiCHÛ5aʒA]dV"8Tl\/;ַ jrS@=%tbh|1#6ۺ\n$ pw 8fkik;ANZ*5SX X_َ Jʐڒګu˕ņ[V1mqER:C~nb *id{sOpkr?˥cm#m+~K[p[[9.-|zXOfi˩•W,bHv!eŃ~TW& (7*iQ) Y´sB7%w0%b&XUVh:{DQ5ԯ0ΪܬJbkA'THԍ%SfmcZJԈivTf{nCkNcS{9'k2.Μml]jc600} <9L|bNV؀ "=쾶lq=;tS=X5]Vm`[#ÂM:ߊ4 p#x<:Vg֕K;KgA7VHA82#){_$S@+a.rߪF_akIpA{+7YL$;ΐ80G(ϙbqk.L*R`=PQ("kH:r/+\ɵK\dž89maղX6H2==&{yCZhGNdyA1O 4vN߇Yyk..O5-Š>q T z*|`4ie][#JWwe3ؖ t( wiw'7#qѷ:&x[)ӫViFvV?Bq;Wyǥ۬6\tWV;6WK#MbV N$%_A#g+r[V74VubSPk4׵,c*rS ;UʨTTb`K{j\8L™-$`ӹ%flVAL2tRdF2e]vڤѹH4m鑴o%+*֭=yQ nRƴ[L-PC5I8]tu-mëR95=+yʸqNJ.G4x+;cÅNKz&R:wBA,` d2 ,5g4R\(nQܵ{=)k˛UOɩsӆͿOCk:I&.W:bk[-_Ԉr㜓Aƶm*W9If\˫ٮ_8|ůGӱ 2>-e5j4**th8VXf2؀њqVEZ=ڪ ьNR n!',0ˠ: **3.̵"{{hF{X%[]f X.v [DZVUp'LDM;A0VزLescfX=\sKQ'Qj2*hE Af;- 8{oAa#FM*r'Ym-B(`X(EiB{M֧%r6Gօ']5tbϢYo1<+qVmc}4bԬ|m`nsjMiLJgb^H ؞ߝbly*+L;ZiLY7&4BVNG5#Kxq.5o-Hk ъ4}+]dܻuMjDm61QƿT#RԜp^e$mm+u>#qWצd#V`%4DZ x!‹5gnKacj3x.I4~mYuc[eIk[9,;Qk]RI׮{vY#lÉWNke>ngF~ˎZ;*M-NkަX1-ƝT6Vj1%DLbiލ:6{` ;u{1PT+c[jBkrpadåaVx@4%FJSJf;pXȐ\d m@Pœ*Ky.V^0ToءZ'5ӍUȚ $cReyP)j%[ԎRJu.^t𣩎Jsqݻ^U^ (j_5IжC4<㙽6k2ϪH_Y~.@@@@@AX_EOb;ۭ:Zjx{{[řE-}d׊b5"4 ^MVM)bόL67M = cy%q%10о Af{[,/VҙLZkdMU 4M:b#H-@ӯd8:b;o"Ey*ur5Z]n=7hC_GMvjE: /-%v9yyx5ӯ$t g~OQ]5E;{=?k ײ(`.~]:ȥ܆.=^nYǮoޚ0_גgo&k `qhWSibVD)E_s\^dQDtK b+@!nn-ĸد%s*a=hڴ>u׋^,epYXzDj"8aS^9QIiI'6N+eֺPThKgpGm56/\sCUFo^ewQ<`ZmCQ 7@OiYթQ'Mޯd͛(@s@JRtzXXچWk)7GGO Z}F;{hiDqH#.h)d{ 6j;)Z+euۃibC(U 2AIXWqC)hÌx婌,m*HިɌS@-J@nn=lF`P5dI wCm׺2c+ĬoipՆUl\&\V`>W ARr'eSÊ 6cQ'08z|K1jùZq=5#ҊVg ,O/ W xSgk-MCH#Sz #h4~Xղyټ8R iFc|qh4^ljTQ2x;KEE#EAa#iQvm)IĮaXUDо #4\BWJ 5Ůc.ubiiis |\YٶfnH2SZzO(y8й'׏g-"HB`4p:vx\\3+P+6V3ZPqZs2W}%T[KB4=PMœhùg Xj8\kI[Ԧ ta ujFkRl9#%dI>ݧ0K5 X-rAf8WO3}柰1`EB Ga[r080+gw=UߋI923= iuȞws .ra$%q|ˤ\`#CpX% nk#01;f@gP,ʓ\r@).z\iI#js=8z?&< ,!X cWn]rE%:j\3ks]'pddtھ]qoqsžwZIĕ0ւI3Sm5nQQ q$3{qK+=KӇy4ݹ "WQ0p*aE׊ӧaa;H_f~WU]maE;Jm5οG6./O | c y=1]r0"} .Kx΋p/f|-xtbs8ؙV> RqSs*S]I5⬙H-l"p)3P- XlsO5#3+92)Bj3BaA(SOMytgGѸjsOz:ʺvSC5ZKF$eSL4(&Z\:os]O,3pYP5ؗl!\)]X njT;M# GO;#u{Vp9M)a%4+1m^^Zz KjI.1 ,\04sXEki`ePJԨU+ e}`Oη'Ljif^?2dӱttoeF0:VVlp,sqxkԦ2@bRK`$j(oj[{u+I-W?JVE^K ͐ǂ1W9prHJq>fMاi8 r8v%ۼsXE=l:Np ʼ)'GVk\*>YsH&yZ +W i9 h{|Jo힎qmݪ֍P[Z}Uej[vцqogsƴ^"F혍"CK2Gu\c65qT_G{{Yc\E@5;L7]}5Pˇ_kN;׳.j SNFڋMcUо {kS 3KGr+6bI+}̭n%ljrk־ CLEx`mrk,0DÙSްԮpÀñLr<,Έд̿]<444L G\oHg4vܭI$Kjv6m|Hcxqٗ*jmV,,Ҹhp÷Ę%!9aRRɵz[AL&+,so(9vX\{ K\ g\N$`*x-ʈykk\TaκbOq(9TCwc `UӎK%.ɬ}oïoܖ1m韌1qZ~kk=0q?\m~k:Ei4c۷.A=t!48TN]lԡъ Js(IU@ ; &WGS512Qɖ'8j#TQc#UZ=%5 ˁp?=۹i/Wp͍!cE\*H@ZU$jqFi<5р?zf/pƘ"N%$`H"J5 0[ `]Mmk N\hG pxY93Ӎ&>pzVb-ss~Za`*÷2Xt,ekG[\v-NYHhʅXƼjnxb{j750^j9𪖳Tr˃,e[s5o[;eɡlMF7b*M$ S\n6V;`WkôwtT.ru\*SHsK!Rܺ;c[Y2I'cz'srm\وavP\2~}+͆|l<m;b(E UMtYlkH"XJnq$E>o.Zũ,GZ\zN:\R]7q#w^\yg[E*SeKZm^?^H4h@Ƙɥ׿G^?{zREqW9܂[ psVPaޯ+'쒽HIϳ2aVMAҫ0·*-JIKm`޵ۛts¾fk_eY\EXA7'+fw&t.6isiVeo #h/O6x<,|Ÿ$E=6L8YRe]2'ʠh9*Jҹ"4nm2B75ǥ+Zg XE5vSTVP\쨢I{xE.Cj]v^&ilO쫧[:\ 2K^}v/K翲yOȵ8Qף1 k qy}}.6:s7E^Xr ,F6XׇۖdH?eengͤ%U R lȅ:ZZn7mp@'iiYu]m36&Ev\ԟ/ȹݺN=,^s$2ہ܈yWY%:`[謯!Rj# 43]ʹmڎfimH.k՝k[Ms%lL{7ks5rz.  (S1e*3;_-CMN: .o 7\m@s{3{VbێqjZP#Bێڵocq\<$g6=u\` Qm 1ĂGgq52M[Joi̟),n[a½yeZ=˾=5aڱhe`^McֻteθL#Πh?iX\SWUI[(nc鮍u[عm`/8WUUai?0gi5..gvc=P$.ƫr2 q{ z-Ɔ/gsg.&k6k[$Qg{m+Z#z C|?iɶ8i[,%B칙* ªeFkޤ4 о `J7ZYasqbja۾'U8j3_GFZ[VFerv:9wPB$&ՕָVZnSIrִ7Ǎ{ve %VӶ%lm ּԎlLrid:Td[dž; W_JߋwM\lК휱=aX\0(~D&{JVMqq@#>\ۋr+_\[HDT.JňKhMVdaim+Rga*@~ "}aΕJmag,l15KYDgVYil,>=oMnq7*ZiwEjEWZ8U^_qU:/ƒ`S >vqo}_zX.ܞır4 r{9u΋Y ֡[[{HIbVc#-9B @=/k㵋H=oqcnbW5&H44Zl_N+xX4t['6f1J/FkJϏ$uA~zU-m@xc\.xph4i<7-۟i $}Mt\ [%ycD/ߦ#n)`M}^p֓Dޚee[5L ʵ[ۛ^9ߚ[g.l^~hM-5ZO|u1ϥ}w;GJ# :e-ŏ^l\efpͱHɘZRq֚8"Wq~Ytp?bg!;\*O)ʁ/Gܽ{'nBͳ.ﶻ6 e@ur;u&v lDE~\8i\.v7W6P@aDZu,퇓[8Z4eԽ{0[W4>w-9=b 2mlϓXa[6H4j/#K9id;]rPT:11Wm-iNp?_:^@4ۇ3IƿgԞ+6{FP!g65qT{cm onZc 'ٻL8?&٩vl/5s^Ҋ]f\ |T59d ךx5v\hSݶ|n ص+ڼwE΅Bv[]˫-Ϲ2_V6S ' jqwVԮEx8Ҹ0dq$,k7ftp;tQJ2-ds14zZOYkmn׾5eBMWUa@@@@@@@@@@@@@@@@@@Aо [cIq^?wqY۳xو$?R׫z:^Ltq]!ӏR_GJ1L٥f=90 G==.[mDg 1Ǵϩ^憞:W2sn#`+AvaLZ>e5À]gF_h`鴐^Lx:1lCW3=#tnHW]r^{ oN%m&u.yx-7[XB€'ٯ8vo66ͺj 1kG`U.ӧɺ6n{)wvcZH#[Â*X.¸ 0*a|b ;qV̺Ye}Y84 ]Z#GO.psdUYJdݬCӻs~coR2嶖1?྿<_ׇ$S+ɆXUSYܛYpʡc}|^%w4'ӏy8I$j{={"MugW.^y>ů$ Iox8/uV,v0H8Uwtch;ᴾbsAעˇZrczl:1;T8q2+yۘN3=x}.|mN\ۙOի ^nmyavw2smۻWe`ssԂg%Wx{.coOwI^s-trҍ{^jᬑZlq@+M GȮխ5tzl4 c9o;{{gnֻl2W4 LwmF.v+fqi<FZ\ZoxoKO[M=kKyw1"8C~mck3i2OI Y9b ZfW=Z]6P9j[τﻕ̊h٩I<_O)bM#ko8QkRo2wms asHшf7p!ANSSF;]]uKƅiikŋ+? jfn8NXhwKiιX8tO3bgRwN|v}7j֞mu}ϻxjx܌|-n`VF귀-*xּS|e0vT,4\߀VLLI=$ts R3&];@h72Y a}疋`(O֦\v`tHbABa-s%k,β $jg,Vد5Ԁ7U mfX.Yiv5Ybv+ 5ЊհgNᡣ {Pp<;*<;j_j9U{n=2]xWWi<#%NǺB8XZ:s`crk˼s4ovYiЯ<;i[= Oy wmǖٵyf6*`~u~jϓXZے`4M-n"+QFƂ暥5ZD˭.sz߯.$I d50S~ ݷg[,х( ὍZZzVniMBl 㪀mv6ʽ#69MIԤۼ1ti"ln-A5 *wV=ͳF0\$X.4v\ּI rJSO /=]ͯ1[Fhwc/8t}[.˃WDΣxGʽ;{^;] eOe=yrws+emuiP+SWG[?+؞ߚ}ZHt58Jz_Ġn6;5Ӌoz,euK$n`п]yz6[քt@ w7A0:w.J//}?V: lC_3m.6>"``εW+0a4s#p#Pf D C5aU0t %cqYa4tX=@Z2'+7..ewRwMkt- V4վy}pFiflͯߎ'Ls8Q"W᫳S|洖;UA5wp9Sãv3AZjhoiZ|KY-7%?,4/vfce3 hW{i:鿋gmf;'\H渑SO_b'kCb.D£or[pASI _q  Co3Y+O~bGo2BX^jhkϩUfUdX4Ƹѭ'U=Ust}>~4Ď+SBN%bnL)Wj0jK*ƣf]x\G7dGmVƧkã^8]8bz VƎop=)6vU~NAƃ‹+y`kFֹk&]NDž>SUˎ6NnqqY~o]hY'Ǘ/W*(0q2ԺN>^#t-t#! ժm˻2FAV,t뷽 Rsʦ0[>M#0Vn-v4րj{ujr˞P88#5FWTQ4v-R9휵ϱN,qT $obRđ/m[3RaJaJzT~fKG0{s?:q{u֦q559ZaU^캕J⨭WsxcjZ]mN%AM>|ܳ~FVke掕*;ku6e~0XW]r[u\ִ8=☟3s\([bо [k%xUrxuggٮ"k롭+r{GM:uEϹ%`pb}6m,  ye+Edmkc9 '(VkUNK7!`wZß-84W9si- pq4?ik|Vs<rCEqIk6u{,j{.kdwÞ*紵hսmKk ?X˝5k#D~ړ\y{?42C(c-Aǿ mWUFP88Ue5\_63V ÂeI|eY͙/ ;>G*ҥ b;L5kC*`PbRFa*#.B=D`kE}nmnA]xyoQ%}ndJ7>ܷ525Ƹz[ZZC-]5m30[bg%,*~ExTע L.|)[׼3[(TOWiBaQ|j6dt48s[\*ͺ2&<QO^}]m8ҾK6\9w.cX4 'U%աG{8j:~uzq>Bۇh#TuöN_m)Z Mq gHFW d9rnuy#\es2t15 [׳m75I__3k͜_8K#"珋{.^^m4~Un5TG/ʾ>}{cf7(3[J=/qnvG/ElH,O}vxq.vz);3ΛusּQ:¸zu[,bF֬p ~3.~ü2\L ^q h_R4-"}vLҾgp)Ms *r].K<˛{5gyi}s!i#jO6̼oqll _"u}MgV6L2ќuN#Ozxn>uH)lYct" n\hk9ه:mF}^ M1FX<|.Pٗpa#VISMpNۃ;66ih(At$V'8P*{ֵI]KKt+]s_ۺrW6fZ[62sݺ%|:mFg V禾n.39̊Z?ޓDiM{NJS"]_t:kqp9/"+2JeܷF]W +EѓGzȯgI&{{^x.XܞƖ,}߫ʘ2,``2*걷_lj `N hFִ/){՝!+K˥.jk>m>(mu_M@4PT)Ó\&ڶ8F'Hcy[7$t{m?v453!򅙖vxqM. tdg yq..dz0x9n#x֑9V9Ljaq˂\BpY9hfkeT(_ )ZxIF,Wa# ׅj \kbJ`P J HUQI(c"Ti#Y$\ K wĆZޡ'=BɎ8x#CYƴy}v҂G664ς]3Or9Ʈ5=Ɏ !1QUD(X>{L}'ou{mw#[]=_Xe3ɗkswE fv]L% dF`.vף^?uICzk8o_kn7]ܝ1@,ǧgk|~<34~׻r/SSnT-m_u#ah*@;mԓ+ۿٮC !vr朓:km|n+Ee[$l״LQ÷CZv8~KOOze^ӽ˷M'5{rӷg<5arqQҾiWkp#eũqg}-_goi'z9=+ݾTFǻezwx^'WԿ1۸e~Ŧ-Qc>5_>mIi\8mv;tybWt؜j~ޟBbgyLG֑^q`<~^~-Gfo'c븍@W!Ҿ</e-Y۽2@^w[:v6ܴ7N^l4˹]G$o2UQ`njˍ}cH9jh}--d++usy >c_E+(xmؚAx15k+4JvV /`Ls96{ukhJy5IJZ)0qv:R9j +p1ǗfjlpӗM8<]]=7|E0"hY]>gR3 5AaL:d3\$ vWWKwom /Eyیm%au9}K/_KLܱ/ 1Ow¿=v_JMo\/CT 9ztikvص HŠVG^F[AP9.#C5b-hVU4`1Ǖ$m<.8nn}]KpݯU9ц 4vU̸;Η=8FsMQJt-Kck\Y xd6kK jb;"Hajj}8.iY=T%N=w {Bo[UzsXI+DuXz7SÕ+wo,Eq N4$YK7oSՇd pĴ3ec"q6ܚ܂N\3 IKZ˂W t8;"L$؛ΫRd]tV4 W]r糛qs3d X* N$\euTp8%_]?i f՛#hmmH#ld#\}>#T\9WnԗC%+GUh4;C[11i<~ʝZ3`Ɨ`ngNj.Lu]dV9k{qΫ:rHX6fxU0Yu 8}dzAsAμs&~ rmi[mh5$TkƱަ{ o]oW:x6k˅0e~BV8r2IOn[GXCCu9G6{TbI+UVg.denƁWYvyl 8WY~jew%:H̿*Kkc4WNcAit bxOo^-Nye16RI]k;-٦0E &U}o澚 t N-'X/Ǵs־lƵ#x3A~Eо ~Tm!Ҹ\]4{m4>2nz^\EG"y,9zuۣM~Y 5'PLGXSfm0:d:5y&x]VrkJ~*M$Q%桑Wr |Y8 O9k27^ݹ;"p]CMNinwFxI0shjWOfgf_Mܬ'kgtҔskYpz֮6veVzǼcueX$v2NQVGoF- `SU9hyjV+m yiniO ;Uf4@phޔy½YAs~U dnQ9ӰYF2Uy%c09FX/:j̖L5d{Q*q ٬b{٥ިL C.!Ԫ#'ռ3pOdT,1]߆ Ǯeʧn:mlݾQHQmኰ`N+Xuy'evuԅ4Z iҖa5.$.\2ysoOX9 gWҀv9}-ŘZ l ikukW>i3]Jvu Ue 6EƟ_;;v{u%8V}J~9鈗)Úc{$V.;6K\ׇ wˎz;xK ͻ:i,ʺwbtqnGu4av+%sdKAƀqI0K+[i{!,)nJ㳚h]B3z8nAaȹٮ 6eoTs_^ V(OA˨?w{-r뮓\R3 Hqݜ.OGeGg5W;^f󢅞u1G[þ5Wń?jJB}:~&I~/?=f^3yB\W5k1y0iWvkpgʮ\8sk䁸hg^enhʿ5z=%ۋ6{n,zksUЯwy.COUirܝ1 X35QRm+W[:SMAj[溎a8൬mmr usC"$jmӭsr&1qXy9H o^&12KZO;ǍoR豤 wcL<+|kl`z4iL=m+qZl#aj #;Rj0(Q˴?8UtLݰmwZC>u=w񓻖mSfV\J,Å(zkV-Be$P~u\dc4|1w3Wˣ>.˴ kuyrɾ&[3Q8jy2Ѩ}Ϻc/5nG G)[=U״˕p[J ŎW~y^_,%u h֧Sm> ˇ_ kQpV]>ΥGܕmfwkan %:mp/'on=Z ZM,m5<{O]MDaۿcPTbjoUW L {N Sy!_޺嵏{O)tsqR}>vr;5ls泗-F1$k,tzȴ30ȭ(RV~+eN+Zn:4E\ } w}Q Z(̾޵mK CR6GR]'93s]^};#i3\mM>cCEդOidsiQwMjXr'/oqg_T@Eouq+>S8L>j-b$< ry6urZoۋb[ߍNa+~]" .о m0HFm oYRٝ0`:6?^nq^;0!Ap̏oK _v͕Ag P`(yC5uJ6wӼj8eU=^߲,IIF&~̍aIdۋ5F kW>In ɸn6r)Ai}eۻNvFHso[k(qn'Yںqή\{$l5sޡYWm1<ǵ>ƒG>Hͼi{+^ߥu/ŏ-n ˚ ŤckU+.ŁHI$jz{ [B\;bNU\6!MA+E |Wf|pj`!|s;ՕApZ1'U)M'O gnfȢ@$:YVaБzȎ7366?@Re γS=5˂VI‹Y82H4D7Ϟ=#:֕][/']K 4~quaYzVL莦чI$ԕ`Ut6+ns)4h9 Hr{;ɯ]n+Id" 1gPSIu~e'poWv-pkN;ŷ]v:nuN #H$ uY d_J - 44VWy_g 0۬c08XCN#[̽\m$|̞nm$uIU9/aaPA$,$#*Y=[׈1-ᨯΓߍhxM8{Z_l.\W6\uv>D<oP6v)Y[X"A-[{\3av41uV_[H%CZ<^W&dSt\|O¾oOu6iECRqZxoϞWtoNN 8sqa#{}SmVk9ۘӛ]Vra\֠҃y;5b^/5썲c0K~WO .~]i WRmg3钞Kf;۷˫wi }HZ<Dž4OYvbKCto??йٿ\T5}Ym-{]taO PޕpՅ;6t\.XUYpyO~*e+!,-cWy9]l}ߔ,9 ŽvLﴷ6b|[4g5)̼x^n^v :NetSnBBcc2z:;,9kM\8ǹt2/Ÿy!ᥤLlYY_m㸎! WK†hv>yM ͉{Yk }R= jζVq4P\otJ_3~l=?םf;8{ܫ65w;m6c§},b60T`E{UZ!]Jd15 VZBߖ3#-W[{{eAK85[0X+A¥b=Y;"#IچKX뜤po30Ir)MOjÞH_3ӖX;iYdiwx,i<='R半rje;wT[#P1*غyZՎtO6{hӵ޷2霼뎯ir$e̒:Տr7fU}~/M5*+ʹGYyK͗vͬ-l ߫W-E.-,l/p=+ۏGݸ±z!Ҵ8rkM<+X˞1/an.ww6͒5q9WZ؊S$"GqE[:#<2=`џrjY45X\+IKkAFdn:2*pbxsI/Ky0KGр]=ۤ髞rw_OTCjָ_G<nW(s %у@O8kզn/u.˼mv;={miWu &GH|//V2 w1Zx/˙F {"cG)ׂmzi1Wi ?St '{w:kgYW7 ;#Pg]Wi "t.Ր4k ]mC&2wU)Z \aqe+^\H\a䔌)pIڹouW ?i^BEuF$VQ,:J(dt ޲#,e(sH.fi zگdj%k9X+L#WLJw+.#T:`-C1vaf\ۊUxk@$/GGG)ָ}t]zwoMpt N*ɯvPܻu@JeSקho؞j !p^˼ l2820\T@[6oɝ\]MQk.xZꯗ]n$zugbd8\LǪwo^5y%8rewMxmŭ1I/ }\J+pnzhWeq^,e0Z@@=e\Z]{-y8 cAJs{͢ڥ-򥻎$pIߋ~zYmvوя|и^חꯩM6ş_mKlo&BF׷R Q').JҦ+i<|-d})Raao\5N{iq1#:WmvaFZt _ͥgi1-o\;IIpyypBd[rHΗ A Tz>f F7.e\mxtl6y][yOU3OsW.dBIގ r$W+iC7+0 .p`o52|ViQZ#IPST ֦tˣh;E|S*wd}ׂRFӑxgYŸH# -];\hc_&Zsi\9[=>mZ"Ïi$,{NPmU 1Gp~y}m_uy\W]em!z5$uԳoJύ](7[kv@R.%噌>i^o $s{>>1ѷ#B>ru5uQʧ5ZH.]S y /)vC#<(G; kI4'p\Tmp_86/[ey}8ˈi}`GZ{-pKJvi Ͱ@7G8\jAN2mB1ѹc93sk FW='T͎I- du-cǟp`\\; c6]E!-qq#k[shaF"@pˊW]wz(/Zfh|c<0\y}O;Ӳf5x!'0&댂N uek( GP{{Wpq9GQ2\ʚzfT֔@@@@@@@@@@@@@@@@@@@@@@@@@AоWkx1@8CSBx~{]~˦^ؾN$q^O.^m=>_._N?K&F"ϋ9s;=Enak6+Zs YYQݶˍ5 SF#{.cEq]U={ºe2g/TUkGj.[7mbZ`HܓdU{y iv,xem 9s_DX h[ٚp9]\]3pɼHZe^JHe",X \iIJJ<hA p,fGSh0Ϧ @N1BU@LGVws/wFꡥy!_w׊5{a@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ATD7L"ilgy'/{q.'ӯ.ף HN +뽎k};#U{ƓV<=_mn^>| h ᏨQo^ֻN,mZ2G믋1.m {uW'ۓrع v2[ݻ RQvx-f9}bkZږ|gͅi-ÞӨ8Poyt[l,\۶S%۶0p0S O͋ۛ)vG "S5ik?۶w.}v{:^Y'&׿i? /& 6[͋$tN"IM"\16s;K&ić8M522 1=T_ - -C"nvuvynt+\{I^$Vɏ,Mz. 8-5U|?<3_}3_r7]+*Hh8$WeݺPz aʩp:9iۢwRV#^ShpKtNrȷ#bܷC_wK>+6q7-{gioOͪ'w{XFZw["e4-`0_P=e"l⛮zvAvM54=3݉U=@靉rMHbmH/0s:usUua—3{ohV\cU>XA0m=eq=^]h\1-p/D&ٷI ~5u(OqVuuwK馬448WȺKleݻ:hX !k(<=fZ^Zcih DƚƓ\<|moMeıHcJQ7eUg|2*TATb H~'?c-ŷ! P?JzfS^+FVOow=[1/ӑwmJ'K8`Z8EeIdl CENz5w3JщCp/w9s@ Oyn~b|T\0_r3iߨ\a]:GFI^5]{}^̍/ W/iKbA_0S|sKۧ<}>^~OǮbܘVR (}_mǝum8h6,5<$:i{g w6,kZЍ-15cOC3I & -DKBо 9`hGsq3e3$Ѹ϶9j_#I<;sܼ fY=mɫ$a:]KO.bgG2lLaz /[:- 8rz+fiŭt K5=YLa¾GVϷ v+-28)kh4%PKckU%Wխ}G$%õ孲bwQִi)˦~,!sh|m]ɧoMJ*mn"8楽WYRZb#v|åp?Jӎ/nKu`2.emZb¼O*XgIpv%\9 i"jHodԩ>'s8$ֹ&+c.!\`nThVPñUϏ{q|c[ wgص"Wu:\\X^x=5]1B IĢ0 ٍhH%-0LEzo$*o2OnGO8ǶqOu}e@fTy~W?65n{]K.RJ -B_!`}N;OvMdfliUqsmJs{iԖ@Hyr٭Uv\iyΊ[e5gfjۏR#[5bXmZO8w^~^76n\{=2ϋp4=ymC 'g}eo~V|WвMMs5 Ts\k[ܫZ]:{ۻ>qn">\7kG}1}/|Z[Bi}/LşMG~J7KIs3.a7ߴ|Ley9 ϰ_o2v]+yZrr3Zv;O}͚wcNWo\s;M#y'e| h\זgZ㾗^ `;Hr4|K! }e}@֌tSV~?;m__\t}OjYYӷxUѹ N 84渨Gd+V)X\GZWFF5SF1uxuǃa⯮7_8H$&r6\9e[1ѝvW{=[QXö^?qtŚ_8}fp]fkY-#irQH"BG$v|9I IEE;.+ yN0eveNd#-\F-ɯVmpa|6ܺgCP?ԗVeK.\#gf@r=%Aa+եd(nkuzwn\|$RchM>v<.kOgjĸy671WTEזW<^dfo%Hh\0DrwkW\ǧM8WLS%AaVs9X-ëHOyo 7c8,ܵ'h掛E6U VOγ]&VĎUbԩ..*I#QIp'\m64δ} עm:uQdk5kW;:93OcxNXeT)ʛ$!iʼHŸr/zWT 'qڰTp$uEVb8-Jj[8Z1v-.v9ا{nvj}L,֗:TSַVm&f+n$Qv3Qaш"dOXQơL{tFn`ig1}VM4lG}9_o̡! PVmXWg^ک k%Z{+D*]co+dΆ kߪQ׷"NGQѝ޹EeQо"K{-l/a+;k64il[7kyהi9x^6W;m/췶oЉI­sr ~6r;W/8Zu9=Ǎ;GmwYJm(s ^o]77ON\yNFA uWގùbEguuçph8E)_i\8M]]Xguvnqo4׶:p;FQo4_!ha>]jooQ$AB|Q{r[W1%n"&iq'ԗ5[r\u7{$;l7v˟uo|Cp'w;:<$4MvAk=G8/x k5ܝFaH\4J&\8ffZkkZq\D@ *3 v0¿2^N|XmǍI NśLFZ`anW}y^˒b ŧSM1DA@@@@@@@@@@D~孬Gu3; CK<-_0WM֋>2K᤬kUhZZf :Ml8Pa2F-v{Lܶ[Ylp՗,ٙ0om]nXps}R=\?{NϏxvl;'GtNX[_F׷NMw뭛~ hm;=,FziqSt}E?6?>^ f˗ |L;Z+]]5WM7O]~̽^ _W ;Ai{+FQ$zeoOWqIfoy⏗om:;g\qac~IyM}\?gx3op9dn:OP=Ѳ7z?mw{kWKnls nm۫i+hgi:AstӤt<+HmW;H5_ir\[yz6۩$r^& O~V~D\ t6kOF9pvn-Ka܀CWM{M6SKyKdvT.;5TumAƍ{JܬmZ s5VՑK]E 58Ag1 IUth k~\&ڑZJfk\֕/Z6YZNл{ڸ7Q{|:'W2З4LqZ/O[ecZ_\]$ʽ3Ys`u͋[ikF6^wT5t"qC\F-'GV#&|,_q.tgkc ]q{i"cћּߝ[o%ӛjր00nI6y8ep`Z뗔$j.a۫Hzn ^=ڱ,Ա9oY5[՜ZoVxl{A'M$3 )ˆ˗udt135ZGwo8of_zìi/[ 6>E i[niZ糔䛣uW8 Gx׻ZɅu:O_֣~Һo_]S8W[9ikϖ:m[;p3M ,Ukqt?K8~柵ͫ;>rXCV凉rR{vx]ͦ+Ҝ,oqUggZ7${C-έykgע@I~-BXCT[8,îT^Ό-yLp5#Vc>> GD.K}rvYVXՎ-5Iћ'l5TWI{n#y!֥rGFӠ\<\UAcp9Tι[L?Lqp[1f=$K Ytd:*B@up^~)]iցګA򶫯-Ir^n 44Зt$1)׿W bds[ƙkgKZuE$BPt~=|x}וˮWRvc7\tP h馕=hEe szR)Lq6>w94wp&\m 4]ӳ=ȹ)'kVeY{T#sȏW.X8;^\H XžS]Emn GMh&['Tߋ j[Z{:LvӬ}upƔ*efU]O #7.s_GK&\0Y,p 5»\} ^~!8akR򵬣#X$\T%Aq:i!Zh[ԯ\epuy-/n1ҍ}*a97-g[ @.d?j<틣W<1ͮET"j7cU^NW-sZ_H k^t4q& s*P6;o)^/X kD:@֕:Iv[O.{q4v 0Lp !_ 9MqeNA1tryN 7Z;% ^CZ4rJ0MzLc(MIOBΣ^L1j-+X^hHĐ<]&WLCIi]fxu%7@c`0%cYVet_ s(/}UHͪW .-#[͉W8oShw[%g-;1`kCq:.էuæ\c-4\,WIs狫+m7gt\\Pjm6z<\2 c[hmԊ O?zϟ?-6us6ٯ)o+ \]00?M^/s66o415C q&×.g/\yux8\U.g! O׳խWp]L TU8 LWdN[tHAp8Vp"8߆w(cCZѤr^U*XwV^@VWrODLs$eL<[\wm Ӳ]XTnV 1Y Wwki穞]}_oyO0M qkF+6TEkn |F<F;ݸ근e;,@:VCtxZmv_gb/mpg(HxXy˯$~G䥇m^_#wZq6嘟.vA_474ЖgU]3 \F hnfet%\jY{)0q'ƋljŮ;b~[n8gf\^By7śsd0ƅWOL]5(`Yۼc}مv527i$fP]^'6(({}%1,Y]58P]7Yk$ص$$U&ޞud4 YM^OE&=p'4Y+V V1z?4iOq7cFU5ɭrsreƋ?sPԴxV vq,f}9My|ǞGwcn`m[F4R⦷.Y9P9j @]y0C6A@ey^g༻.',Y Hg?nEC6]&9c%X^яtSm.l4?8ֽ']%XYG=HI8hcio3߆zUvyrA cd&jntcK*:X<F`G!>/G^y4:*3I﫩K;HZ "{̹,Wڥ6水4<`h5r;WO=PhVJ#5%Ջa3htҕriW2M|^{6>!,^> O;uxVm;^ɻN'Ϥr?ةzXMzܹMKy3h!k\rO'zı:y;#ulvۣë/oϮGo0lrl4gJِ/psN]ݫ﯍{_$y؛nH^H!:q/=Y~g]7“zc+Ku_tyNz2kkܴhs$gY/LNƖ5Ƶiƾ*{\;G6A+4teih:sv<`s&F;TvvÆ3V_$FB ?ENN Uao-[SqRO-{gm6,n!/ p9qvvm-%UɾmcqpҕgʱOc. _ӥI4=8I]#ˀΗC=˽_J\8^z{3.\EzO`ՄL*ju ݭs,2Ѳ4%-]ޠq 'sNANIT?=nW8T8LL:Ij\א;3]qyq;, p[-I5 \wu-"t48P yw..ks ?t\-(mpy 原W\d/uCzl_*^uׅᢵ^WL\\:2 z\U+H^ osL ,SGPO=L.y=p\ݦb[sMgpK G`$ϣ3Ů?\?,y[迓ntNt5:O]&-G5/q>}oΓyuۄl 5u,`~>V9|oyS8930ŭV. d'v/zf}RvH 1*{ޞ(oo"kɧNj|zWqqV4q1i Nlt.ٯAerJ嶸F<4FX,qͩty:;OdIIy! VuJ˹%c:og^OZHvK[9zWԪ^ Ӹ9]wH\\ pw~ukWO+V7]2qZ-zeµ$kkb sF9s%LcA\ұira,PPQ3P[Q 8HƕX^bCqpZYTQP)Mun5-MS*%֫%lf8HYu(vb3v<͹՘p \Sb:kWgA@cbG4Q@@@@@@A(Eо 0 ^`>*M-s}y^˓^I]1vmc9Ֆ7ӯUa|OG.>ic5iv,8uZC\ 5s/{,xLyLzRJֽŦRe,HO+qΫzu۬d4.[k[-0@5suF:?sbrn[ U/el-:dӫťo3|ϽZxmbDzgH'ڼ?Ĭ{ZԳWH*jgU1d39eL>ř(_":;%dpp g&{VmW.ܭtLM:FW6,vmSnVV2|O<_+u# kdNм5ݎ\qsK\I}34+ =_qiQ]]DQ,,/lԘ@sE{\{}y>4=߱e[cKƆvm#֌prƵDvSg,iaUpl,Hf{s:= ӐŘ|;mot exz׿Mao^H-0e..ts!rڵv5''wHê>|y\K ]p73 -p0v(o)s=oz].G{@>.]Jϭts#7Qr/ՐrÛ3_^.}1xfp45+Iy~mk<=7{sk_Ŀ3k{ݼ_X0:)FҤT?\ܮr*NJWm[ީk6WkG^T1 i CSGM; _u~Xoos,L\ʒSm&ݞQ+Cz5ɯ|ھ?.[ @<:9moG_)o:~Je}L9nÑQӓ/oG[}sv¼ˬϑ쿵ۆ+n6met7^mۼG_?4}.Ytr?.W68XyG|\ 9:3t'?~|kWŶoY2RX֜@>S/G+3b.sE1i!9h{>yO%|=v cPj%6g] r_z ZV;+\&ִwSͫOԘL[ĵƄy=Ԧbݴ>9 t{.^}J^gl&;sUuW2mi>[=\RܓkDksw<5W_&66'\UmaX\ a9pJuF#Z26j(Ps ̥eesۂfK2}nǗn%gV.Fk)]5V nyI*WCyR׃,91ҹYغYxQN.!i^X9hk}?b܎Yb'i5HnN/I"=Lem[$2-ieFNI3VGm[m4<ڦ[jmz߲rScp5sNZ|J볖WWck7Oy|-[W;;ܷ-$&M[m0חWN#-sszGVKb״4Vz=xCmN$*Mxڂ}呒 pr]u෪e8W[8a7HV^}>+5\ 4ίVy;[mþjVgh啻y](q#f;9GKp0hPLmsco[9`cXrze{8yd{ͦ״f0u$p+tri?-yv-if~rL˳snϼJ- |rQh{NpXv8v_Ŵ׿m]C$lT89h #;[aG)VP9kOYrָz't+$eww\>:I\Hv}.\+\;Z.O&=#\4Mr8뵗)PKgzsˈ 9"-[O/nQyBc6v::K #mg$fy98͛?wuü$)NnU}]i:|[wޯ"yhp2i#5kqgj\t볯c/;fblDF7gܿ?|ޯŧʒF!藱5Ǚc>=<WƼ{ƍ&"a< 3ٸ\A-%5o#~v "/^p\yϮ&Rqk;HaN=pSp˙3\#Wkgr]3s.$$I#?7Y$MMd4Kik\Oi9'o]/G]vpJآYH=-7O֑kG;O -t&{(!AOwId#8.Y*-ѕ欠̎^}VLQZJ &6Z|:Mz*05w]7K7IYl[䱇-Y$6wE`itev՛]KdO;w~k{]L^9rl.Iv3RǷ|zΗQRiXޏ3JbsxMEOrGj6Q>9,@e}_9Qgm;zYNyHW:m0+ LEt,+(/'/ӏ]<$o=Mx1&$wb&%axK{V'IՍcܭ/Y3.WU><>NIkznֽՇ*{ CXeepǻrm6Ki͌[+4e0p4|^u˷6&/w{͢h v:v]asǠ9[^Issn˛FG-n7\diML^ʫM?Ci~Bws-JFZ{rĚGN=|?M^$$֠`œL=&ջA0gm1Zٻ䤭\kfj.\m:&4p,^Lvwč:VX=ow]u4ucaBu6:1F:k[z:p[^m{7,.&(Zt4oʩ\q8[U:`8cƨŽ\r#ke5Ed9}b*Z;*뇡ޓu0H QfV;oYdݺjfɜ;3ylDv2ԂYik\;:oxExSN : apשؚv-.5z[z%|sr%bn=sshq֤חONggۍ'S^.KսθẚYuǨRr}[a)8,.S\"ef满f&OZ骁t31)ص]fv:FxfN'.]WМLYzoc#H!x&ӫMvѾ^ 8۫QsG~C]o6sY;v n ZL5;Y-? zqz~g\o7:'h% ZpW]qZ~_=. kg mFkK^˞]|/՟|]qrnODK[Ujtg_+q~yOGޏC[MN4VT֞-+Twxˇ@"uN2luNș3):H!q d.XԚqL՝YѦH qQ{k,h۳KEsJ糂}>WnYۤhkAȵR1r\ۯG}5w5۾?%KzuǢn.ACQEz5;a0yF[G cU𹼵zpW/v) ۣx4-䕾^?ssou% $ŵzcx'$xΕ]@@AH5ondC_xxݵZzuyqoP0i#5+ik;dN;%/:s$-x.E܇U\VytqZ˔!pA5z(}xc&04v2yZ؝O%2c&=+SY'D{+{¦2ǖWn}L]^t9췉bLvj1}Sbsky5xԞÖT#<} ~,Bi.$kx_Y>S ƣ+95kr 5SوYaiWhp ҭn_kIoLmva珍4i)ط8|ͽ&ɛR; o^PБ9޲}=%;Vc=rL|ݿrk~Z^:Ss c50Zcvc/_X7ݬu u*?_\|}..i2@i8̽nL%27H"n7Gk]+l;jH! Ãx:n|k+2HaM@h8]mծS*M/l;Yݷ ms4qTf52ı2߂?v^][F 1W{^z|}>$\GQ"ՋpTgPCkD^YT'|mqIktˎh!"W+0kgz`iM"9CUM@ N~NcuW^ ˋl{Z }z,[^q M|PnrsJְTEk뎏6e McCax[;\^FM3C0YcM4~y.[4ܩ}8ZmXK]Rr/ 2:6Vƞ?"ԏW̠2*)^,ף2uKl:⼟TCufMӎO\Xn~gw# M)%ۯHsUn!kq kǢގtxc:QoW/d^[/l$d5̚Dպ<i!or>YfǼ,.٠ n#X}uח^;k>&ȭ|`_C(iK=޹N;Oao8eGѝ+'Ӥx ir\6oqlGjn^[n99Yn$~V9Ȓ $+XSCKk/7~,t46Ԓ6ri*՛\(Mn)\}d3Xۻz<؍?V=Y] -H4k^.hti/h&ZVYPJ%ˤ?&p}ͫdv:dn-|PM \n_<\l|o -lиFЂR̾o$Z 5S߳|t^K8Ͻ|딳l$" [kI7G !4z`\^3K;j]J|H͑cmE^˝{Vk+SlOMZvcV蘵v0yCwzT^ 15Sʫn]rd|.0#3*eBG|DKVG8.7_,HoAcY\FK۫!x{עmL<^wj(821^/avVM`ZIP6kO3N{Ŷ=侬k$pⳬnv}[sӟWnw q< 7.&T48s hv і74m0'}^ :Qt%ͨ:L<|'/5Ă4[ŭU ޲ 8LeM;T۴ v`.T#f^#g ||;rk2fۮAdri#.M} GV"3M(dmvKŮm$kuya^kEҞÓn+>~{Cd8 c_:d]Kv.yWLjܘB4 cxYǴv\SbkWUa@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Aо vۋƚ5xcr{Ϳ_62FPWj姸mg?ԶX/J646坳p2PP0_"YB@q\o\28;$ p sl:IP$ng*[zK;xKtm={s۟a)S}W!~skKEh@A輳h. uHQ|;ٮkw;wP ҵâҷƓN.<~{MR<}ٻԁ_ӱ~qºЀx|.Bf} \;:¾?f.3ZBޔ҇U|;7f;k]>fkq8/wcY>_\ i'F# uiu}_i}6XkvhASNmwl2I]D`IiVsizKSuEMi#] K8iP4.<#Q}X{lGe4U9,ǦMbSpHH^gS,xʐ ivoʳ ujqۓ=g s]`t_B7 ψ85iȀ?Իi1պmqɵõjmrM"ӵbWYμ-[;B6sۣ拈Xc&Cpj[5lB;5O<!W$akwO-pyZmӝiSAӥ+kg rk}dzۋZr{7K,7nY2KFp!Ɗ=]%tJ Zx7jܝsC̮YHfam_Գ6˔+1G`thWƸT7-|zEZ[+ߕضX \#qeۖkVLv5ޕsK=8CC_h,domO77%;E\kHsM[yv1SqF;5xptyg!qC p9S|ou˦JrF 82_9iص:TSsO&.MM-$S.{\Eht8'%aa-B>Ƌ &pc҂["xdd5g2jQ5p/vd/3?8:i=ۧKHp*Ogymv)'|.q5+ak"5[u<;hl έ'^oq96>e͑ť8{+x6>X]BgpqmFqԒ9b qCWQ^7=,p##jC#+p^_LmE* ( 12 KI.jKdi &頪u;˃M3Oεz0`$ӎ?]=t?3o$2À||scU ;O0Iv,o55ǚg\G3fܬli4"!_ mmkql|~Eq( qDa@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Aо䯈D9N$k5y_쭹sW# (y[&t\$]1\^[fpllͫ:_ۋoג=W&ZY4755ZnmDH|Nam)=X;<7qM%fGڽ>^fOz\c3y{F!~iWYcuߗ];շ͟fHnKNݵeB6bmu{DyھԵ_0I}cv_173<:3 BQ4VSL5F8vmˮ-i$O鑥-۬4ZW M Yy?3?uKmӜHH&:Wryfxߗ_ʳgC5/0Í}bE)bᇳ˩'rymiv?ù \; ߞsk'(˩Os]ϦfPo,O5 .i̦Z ]Dj Oyۥߗ(fP^ךInk~k&SGxnvإYp~z޽g^K"ۭ#hFbekW q٤Q[I +Z]U=JL^7vv68G]"RfkVc ivq$-!]%h . (<5^]^)Mkx/$DJz.:qtů`Mq#29 RWyV6;3{r{zIks^:ƬtWn,_4<@.֏-m{hܾ/'ۏYt~# m0yéc1I)T;GُbL [u:P {\gg;Z 4L[܍>-5-*i' j`n閌qid?7:q4dA.+W3ce}G@@@@A~r[\yTs̭l 9<^N.?.z42>^k@x]%'vuwFHy:m}gEr׊Y?0y8ڽg<ƥL O֊~qsgZV[:/$?i4xn꼇Rp*Ae)BE \ -nKag]0ցݿ{97`)JZ__{[fE`U>ۘG.k4 Z5+r&s]KKn- G,s^{ӏz .F['fjEp>mx~u/4~]8o2DJ.Zک%1?:MZ͎؃aeq"]Lc`GڴȖ5qpk6/V>.&Ύ6Tw -ù\|SA?*ޓ/FfET@9]q^C:$~{ד}OBIP)dFa{7"3pŠkyaw>;0l!Wohܑ׳ݭuɠxean ɭץoMvkI'k:{<ԶilTI^;Z]>@>Y#=beFboo=8evg/Fk?vikV;YW{B^Ugon V0aUkSE:5utfP~$҄[vch4$`x랬vAI#X֑JOZֳyzR&ŭFtz0_.[<"p(_ ׿ފG7믣9x~]yg%'7|xn"0иװs^Ɵo^?ul֜/бH΅]i@5 sL#w#su[j˜Y>MYeۃ\=Vygip:qJamK#tF4R'ZMs8NK~vm`c_C]q|ލvҡ\9]p̷l p8ծָѵ8[\ܶ9hHҥ=_?7? \(cA{X }9V>U=ms~KƯo;w.fڞfOoƚM&'gR[AL$l0H5R)}m(sNT6υ{ܒٲ)뗣u:>aVH A T\qpG-*k5(],> 1ZhG;+l SCj]p\p_ a8! onPcdy'|-Y\q7v8]MyO>/W[y39|Ki KhBNMcV=5i -^BQEQw iy>!Ҿ_~1Mƴ/Ǵyk8xŮs3 о pDa@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Dtm7g׏qOaf+ oȁR2{n[)3 1@ckE55կW_kte͓S}LI&={5qaұ!h[No Fp:ٮX +DcSHׯQ/•||~닏Y'Uxv h(>eo{=[g÷D$JjY#BkwA!nRM3MYx8)ڵ1ϣR)ƾ 9VAQjFH,]h\Jr+ۯ+. ψw1 :͌uKhU6Ϡ?K~QXMyRj:1;!Pk}O}|o]r ިƒ̼=zr9[2#䝜۷Cs@IZN*9+. &kXquw'Gs^;nrZN^ڟJkZ#,+de W mLmty YZ=[:XdeZ^4;0 Hzp$}G_ܺ9eմKp\JS/Yo9Ye8Fpq$Q-E.pWiqhy$ y%+sn]-mhĜkv6hDpnׇ}jP4Qu l{i:JZ ׌.IݔsBE #з6~_h{z piSA)+<^ҟwk&ӳEZѥhw w.-  Dzts[{CKغc JYD \]Z@#n`Ve/WygkvB&Bp~+e㜓zC4>VV n+&ţOg._zƖ_MHl`kAp8}n_V=}&=`[2.к"Hh9ˇt!H2 uS[u+V^c{[viJf>9RM/3:S˩5~M7Mt2:&2'^t@j~.^Eom4ͬ;~[n2W$/y$H֔T}C[W;lU<~_r_3zW&NT5חlûcu$y@ۖ-CD>V =oV&f:Fkxޅ.vx3 N`|nXp+=5O|z( ޾SKآ 4D}`˶3\@0 5N_emϓzmdȽ%0>K+ޯo_gxo͹v~-s:Oia̾o/reҶ`2j+;WʳN0EV,vMEuxӨZvr;:cKh n:-=͜\G9 w_mb5i?i\9o?U\n]۶lLkDmn]>Ws#[RXz8[̭֚#ImGֺ.q# nw+9ڃ{dq1i~ehyq•:cؤ7tl_s {PQuu)k(#yi.{z99rkN9YL:1tUQ1?9RZ3\Yjt\x:꟟-CCW*Th#e]Ú<[-=}]nRƒh<8nkDSUk}y,MZQL*eqk&]:.Jp7ܼ߶mr6JQ媘0wuKgĒ%!؂=:ʆ0馁Pd 1k'vi}ˌFgqw4G ÃZps<;yM^f]HҴLIF(gyZgWv.1!2i=ۚó0A}؈d dGI` 5%;/IA3e9)\խu+;T]}]@vp^l+6e_2rFl=82IF!W__G-~iٱ?X3/tywyܗcH5wμ>iZ|I+d;tfޏo؝^+5Ůnyƞ;=Yu*3s&ʇih=0jA"1cUT@@@@@@@@@A3̳[5v_'_Y-z-iR˙| t]u"-s+XۼMperF>=]RTUAKHO+G8.eG3hpaغve|nɜt΂iص}^q}~cu&ɱ%.i527w>:fI獿r ĂͫNY~؁3*8/&7ɹrtQՠ3Q pQо LFhQQ[+5Jۼ˵gj@M-3?7]k#gM) ޸ȳkRq}hEh{V-µަ4 GU6rtkqW +^A8} 6Jv`ݛCZaE#;V܍Ƨiobٴ1UfLΩs+{um=(c22p\ef?8ǀ0Yi[+g@ k ܘk9pM53]4~ծ3y*K ʒ7,y {GK!⦮e2wʦ{<1S-ɗ&tb%ϑk_ @JkY̮. ;\ ϩjHj{NBmnmEA`fx}eNpq {u-wPQ~g1mtvboyvo'MCkt h%dq:ߖ{+'o/-3d-TUo.~DN kMSc~(\h5W_Km˕擷oFE5{͕ܱގ6{xu;=M+Ƽ.Ƿ澄NVKKp J TFh{FZ/k[FI _S]o"@L/9²w囗7}p"u_OqggDžIuQFd{cnn Kq*m[I Ui<3X5쬺4 yzw2ViT8.MLgVS^GP]5ƙK# bо A;w&hMk*}\}_{OO~[|/%1i:ᗟE^jG+k:P4/(xBƗ`(3S1pN \w Ѻ y[|n}NIzߧNo$[lQϱBY B:؛_\r\qﵚ_n6٭c$-uMU3\W75ǃ봳{4}|oB# 2Fc{\jZdz_K[9kXZIqڭ\FJ6qhч(hjVT6m\8yt O-#$ѫ_EG^+.8E@Es-:Ĥnjh$Z (ԕ/Ǧ5be/D&Ju$20ВZa̍&FGR㉯jܮmq:uPjB{2PLLH{꫶wi{9o.Fh(w|Z+4kRIW 3jw|92nMava\HaĬ*ya-5C^ED HV:[':h]2i['.5]F%J5|-`)˓ǤyMH Άj[[zha iВ#]nAǴ6%̀ŏAru.Ksh⧋:-KCO^)zϠ`Vf%ܱ1UP+pq7â6ewPďd'k둶\Ce-$a5iK_/#~{]d\\v7/45.kr~|檨H7dHlkiP <*pK]}8R=Z֟_K|Kӽ]x۴g L,tۮ: ,-M'{\^d>hEȎ+Շ'g{ '0SkI[ֹ7%ۻ,3NF^cN1:^Ige}Obeu0k@ ί^O(\!pӤz*^WO[>m0piԺ{~)$#qq.q8\ 3+F+&|n۲+s;Σ9kɈioʳ޸sLsgGj&{~^۷k[;O3<.{_O'vѾa69ajs}yft-^Ye~oDǢ,r>寐h}m\έMu5P 0Ym0r氜hFg,V0dxuLP}UcXy%&DaA+405}c-snfgh{0^ .'˟=J'e93XӞxeݚvudz{0Wz7՝ Ѥf}izR^LElPMF*8 A (о 0 s1Jm1{Sjfn$ c'/φ;}H؊ >V-_m3I$d_{,eӏnsdM Q y$Z'GLrK WZ;kٝ&4hxTc oV:&+H8Ѐk@fOV/tӧj:,Ήr6'~J0sNDaOJ q%gx[986;>T/nnv ,Gu@`Y؁p;x8zJ9[K櫦7I_TWKZo5''c[מ?sCi$8(&TLR9V #Rc/yªw9xt -4kj{>U܋v:deH"ƹp]#} |gI 44§J$Ƕɸͩ­<؏ps/E|&;d{Y>m>*PSf]oK]yn+{9 ]߄Ilnc]&y}>3x뫡o-.nsqP IQ=_erj޾\uz+Mlc#2BXɡQmj{=Om#[yKo[ll"vCycyWzg:^E35sS9$~dw̼̎Igmh $IsG3Wugggy#p9)ff(ü?jw{]Mk>N+NgWe-/ml_ѫZxWOz=yMƋ{<.N@ ‘ Ҝ >ruSuokqih189=[ӛ3a,!~/<wܼF }u/{,K1wy5䮸yW8ԯYѤ+@w ڈt`<\HCcԓďU^^}RN(sn^4Ԟ+irv#`+#S!5kTZ({&ILVr * ͭ.')POՙmɸnjW,La,ެrcJU2{gTsJZNKUz+M}}ՙ vҽ5T+;OŷO[»Ss\hlmn1X,%23WYZKxfJp ohZ#(FV*Uچ b݇ փSQ<7Ҧ>"SvQώY[CMFcrVtj\2q.8+nZZ?@vGTt妍&W$N;6p\aгRMK]j=Z qЫyfbR7*V:Ws8J#VGG\MˇY ݷH8auh~_{(gGI3KMڶ}Ypx1TFrTu;w*9N8Qrۣ˵L#j4ִ ;gs_a d AW~=.Mgkoo0V>WZ2tZxk5/|\Dz*nMuui2\vBͼ.fyq\itZPMZ^Ooy#ݶR]Ou}~N/8Vfg<G^czmWh@@@@@AJ {AQ퍁ƀUqK=c[CpWLGr>Vg=n ]H80WeXl(S,pcr#r5deu'fxjBYV \i^®[$mXu`\>[m;Rs͈~%)8cSƓJn qnO@o!i$жwr7[q(5'HS qopɀ ")Sk}fLIrn1ɤ\لun[:=mĶFCOa_s/׫5{Ke#HQy= [K6S>A!9LwKL#MrJs ='t U2IB !Ͽ,OX_HΪeT(iRٛY׃EFޖd,~[+sWoVaҶjԋhܚUfr]=.„VI"Zvv,UV@[[RrS g35?J#n{FuH%r>1L9fOxh_^G1TjKZwo*Oy.ԩqNg*ԽP\dIdۗ;Wޙq+Y']BNөL *vLAc?25pط.5sB̸q\I x>+1j;淕5H r^dG.M\¼jZ؃1GVlXܾ <gLF0-4&#UN_ BeHg dc{ck_nLup<bINXL mǹ1환mwa.fV/嶞; {uĿ?;K5|m1t8˛X]7rGWK>x"4FD+p|d"vm1Qkrn-!F,u>-xk0sr s~pgɚ/c-wE;7rݧSXhh]5~V]AO">E՞]iyY3q,ppvYK2_ŇY_O_9c[w19LWnkS d x IKf26"X[|T͋8+7'_͸w-+8-BTV{NN]-tG4]XckKH_;t_?kc&#p\m/; ct}ڳk6"Zih+("3DA@+QÂ(49I@kb "(aB-֟*  "?о NFD]>fO1ȳi.45Z{{)W9 f]*b0xN4Hub'Ԑ֔gnZ兯 v# \{VHM 6GY\=1k֣ j'µ#䓠jWU0x@M{+Z"u:7zkצnY|n.p||4r8_w`af4\'dMysR*;:_yKѽ&/RIH{J%f8.N̽vt͢z]:21%C{Y-Z%!i'-]W\9 Q5쁁kҷ65(iqӊ׉2N.:'_2T.wyl0}lM-|y_,/{$S}%~I&#hZ2@ X۲9+fqU@A=ɵTӳ˧_ԕAysr:j{M_)wr]3qg 9F,aƉ-UQs&di1Zn?lكy\ N8>n~+þ%sǥr7=-׌}y{wH5[a@@@@@@Dtv&No?b1>ԽeD0_/Ƿ~Z;,Od vLyrƊ`U22-KBxUϹ=uwV]z~whs0Ew]v9쭊%`.M M|S׷xuf(("2+5("2pӯ-kN1a" j \ :"?о 0 ظJKε೴̹Jt@Hݞ O_'WKQR 뎎8Ђ;UHU'[{CoL#=HkBccj?/q\xv.*Z:R;VnwXtsN=,M|Y[%\ w/'M={G>_5_QIW<3 I:k؄FB {e鳝AßiufzK(.י!@8w/='˟1.\3%\I{yvӲ/Y2:'Aki㿗qZt^̂㑾DOJ?%j֮B΂ TFDGJi :Hɣo/3o 0_*ܲ)rł#FL1MiE 4~Й8V7q_W\"[h@Ak#/aa9KUT@@DD.'>"2 QEd"0 о Wj)#TQ ;c]@˴[vYI1hc&5iF/?v|yҏ_Ƣ~^\1vDyAN&N@a O 9wk+Rκ0C`[2tn J᾽Qֱif 8QdV$$':le˜t|YݼH4oP9:ԙJ"=ճ aHէ>]n˻]24Ls=<;=ov Hw8X*=Wd?̦=yiR֖[P^ܟCk_[uf^tpf?(@W$ይ-{zܮж0` n{tF:zIӉS>rJɈq<{oW,pYuxZW[G;dSl[<4]1 g[-yc|~\K/ HA.̨fl}Б"%[d -2ڴEXH4<>{}yz3۟!5>P=ͥtSVK_MZ~ོߘ+ur_Gi.-S}2}$Wm{upBq?:۾pm8eN ' ofZVt豪Ҽ8cnMuc9׵tZP i_+{?f-҇\0[Zp6ΌiCER/:0 TA.59 QEeij о FX0v䤹"5T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AFD[>V:!Tgm5-vm d0 *H&z\/ws\6FckHAO#'k+3n%µy<} ۆ-sdl:\rYd/kCp$e4nA."YOF"4vvTسfP>&\ NJbXse)^4WŹ&3H0[ PGʴ&ע: |aM AFVɝ iRŋs"x\mZ>wm:nﮞS3^h] i CihdgFYƊB&]m譐 =`A~2h95DHZuIEsn^8;XͮynH]33^E#ڳb7l5)`_ITc,;2E3żVt@~ba\K "2V#2gVHZNxLaxsW-7ܰ89x~7_"JLj,xç^MnȜ[#H10H\=pfg5#3tpͫsZYsFCjYlj1+cr 6sK}cABAz+NI5?gߑu[FY˕ G| 7pWWN-.5pI@t i|?E4Ot[~nLJ/"6cVdp5B4ENJyBƺMnc8,N5 'uͫWz8aqxѿ *p?Lm&?+eNI,@W}M9~ga֭);mZGߘ+<{M7dU]ajKX1'qs5klr1qLfw8˒2jN(xY,SS"A{tKP`} 뷍f=3B\bNyLMnP6 (+*cm5-jV<.\\Է 4kXTx8mӪEuݱn֕4%-9 (о G2*Qbw۲DvȞL1{uѯ{s6 /$2NiLu9Mri&kޙF-e6*ξs͌M;M9 Qi˱v qj'qſ",Rx+ Ɇ>zҵWHeFgVg c %9VpZxp04UWIQUdą''pTF(pknx%rf^sEh=мܙgƿ_vR){9+>7^-}쌼2hYchi]_-vZ {bۍUq$ օ~k N47ĩa&7M$48 ΌktxֳI6>05ͩ,V J$3x- *Fz$Z]•+ \0+xȞȾgѦSnmԐ{>g1,mюKԜt׋}JϜHa#:*pĀ9иܺKKvWgf붺7 ɤHbm67xIs1CayKaΩiýfKsbwfǃ]xvxm|zn7i単21h3ppk1~-˜ 4De(lRy>?o1& 4]F /637z .t,t5"]z7-- ݇umvcnND}|s3>>b= Đ~@.ecg]aSKM2*Sk5Wԋ tgKv}W? "ex,c.:Z8.׃m &^[pܾ65È${56C Y-5&ro맧ձzL^*@?RiͯkT,۟sK۟_MvВ׋~]]~ gK[k JS:php-1 {n;s>kz)/kmPaSN@@@@@@@@@@@@@@AFDWSZTI4 о Ђ&9*\N|sii?O_o-R-hh5:b*CݴMt/% t8jk$;E#Լ>Ley|$hk tƺZ1S_ &n^+qf\Gm:9J1.xpkF䪒S4WH4tnAW(ƀO6 C!\eC8U\Gh[L[Dxɇ S=%F$,>N WVUjN5%U(u8-5ؔZǥsW Ay&j4KM}EZq'}Tg]p򭻫όZrwqr|sn [}>{'쯞;rFXZ+.zUT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Ag@B2޾ _|tzcu1̯U4)ږ&R2[t2Vh쭷A<.yc\Í` HZh XZL_c*Jr*`i,"-HA> :E4)#an#5sUr5s;04 G/om_uMr_>^H&G&}ya0[1o#ui.Ԗ[lR6[-#E:kޟe\Ɉ R%gk4 ޸v;qSHЭoη]nF >x8'S^@@@@@@@@@@@@@@@@@@@A܈(hXK3,k͜ᯙ.Zo6γ|3:z +y<iڿ?8>؟K8t]6w/_ (kǷ׋i٬dZK1+~Ik6ڈ.KZoj,:;lk3-?BO-skr90顦Kzb,b W?6>[/f L8qS)![A y #:a j7_f8W@imlKXDZk{oq-ZEi3Ciz/K`$ocy{{Oqv]U̹؂ͬ:u AKOňN>\b.N+&i%~€f^9'3kuDʌYLͽ~o7'98b8[#MGZ+JooL" i Da@@DDAAA4Kk3%fFi5 8B aAо " 0 ~H͌Hu!D./=O/U|^#;ĶcrȒ0jC1dr]_#i: }@u+O\{L8N\w.& а;p}ߚEDÆ4TmpC£5DNq- qnEA˜hѕoʱ"-щZF-@5KwO#F1j|`lJQ8QBBZ){)Big^aabLH<&*LvB,B,59$pY4,g\n:25ǔq̻m/@dKFFaϻ_Wq]u4,p>^ǜ-д>F9R# ;M{稔[Sx9M0={K9p jU/nfFqdmkVرAǦi%YVq~94 q(9*1#M*< nuEh>-9toX ,<5.Wl/ p dwT=.yeKjekm R'4-&mғJ8i[^L|2fr˳Vz=S\6-.\\;B.:e>ˎiB = UӏUO5nǫ0Vڱ{<7GON,!h{Okz߯ Z ,2ཌྷS@b+>1걶=/uf|?_[q/]~Qf`0tZT/_boဨ^i<-k}.vyt"&[ۗ]{e[KA:{NϢ{pW/{nrP { =+[A6# ZF-Go$8x~mΆd v֑^ʅ׋ӧSgֻmPbJ{Izd:_9̈i$.ؽ]mO& jhxzs_j*G3XT᫂]su \y@=Z{`gIa8&s~lW<ԭɁ4Sى|/O͞l9RWjoX Yw]1>̾usZ:c7⾏䘲ˤs4&$;+]15Lξ/7LO-\[ͥ _( \~ֿ[Itp}M}ut)o$_4^MvrQ5ˆ$QO }O͟.&:R# S@^z5|nfԲYX""7Z*@a "?о #ðx>.Gc"᎘zmG|ǽAtb#׻S]SH{r$_ ~Orֽ:ڥTުq\9_\C(5ϔI3*` y*1RjZ6[8TJkTƣVї4SIǴp)*ĝP@m.Xl,Ujdk{lZ@#Bڞb'iY* p=#F0y~w#iumq!i$Q$U= 8֙w~L1Zn'0V,p˻#>9[cT}yʡYaLL_ovc>?ii.XEQo˻![^8>BG| t?uGQg,سŽ`S)L1fb 8fuS[1m8B!B0Mf%ƀvJ-7KB[Ua>f0b>: L.[LHIs->qWN{ñyko2 V&6 kVލbݔA鲴hqhI#cYz]L=nV}1ΊںYs$v57 Epbf|nsNpm.hn=go5|ڰ֝NO;{\ܼ( " ){ZÎwb?p훃n\giZ3;͖ @__#98w%x  |k?U?5mne1&k3*_n6[8RO {n˛}VN9/wq͙uv<]B o=D )C ^~H\#thi.ɊW]5cUpk>[T[͠.ǃ^O7)_ 4e3r\(rp%iK?58U#8Rދlj^i2NnbqGzͧ~.͸;S)ċ:;[~ mK&v֥;!N #* OUHFϘ4Y^=8[|CM=)Y󓻛nr[ Ht5[\OI~Ğ3_W8uh@@@@@@A#3\(ª Da@@@@@@@@@@@@@@@@@@AZ]R8bp&j)]~_coehMO~m,k[78Ӱp_?y_;^2`CWүf6 "3L; ؽ=-IW[6 x]OE o뽿.F۸7A8'}ǷKsM.5sH^?/'G$`s_UY#ogjnB⧔e0K%]'F$ vKdM33!^mzcR[o&f2po/6׮}#{[R0s2 إwK]#{¾_-3#*D\뛇U5[jI4Rn3Yxv/96qrNO947y=Lѧ/&2HHcWq>/;VwH?' 3"Hmi^+n:=KIs *0UQоOlShl.70+Hre{k7+d\6걘;u^vI8 Z,soUPÂ^*6H$g,eqUڴ5-2p8/UF?jA6Q3W)UU0!qZRpnk0D֒hNѸp\T.g"ԶCVkJTb6X13T=;mX ;֭ZP+ض醟s̵H;m\ѫ#jc-xbɗ*>4VEѸZkm:,@@pVbQLWZ;?jӤr.HK\s|yk#᪣q_I_ms'QAh9Ui5d"0 " 0\JKckLru==0 BK]_}6si^y~s=LUxo^z~L9xޛ$nn/$閖4bI {x~k)/{hMY7ڙKsHϔwOK I!҄cU3Yr8{Y{jHyuuU"8gI;A ZMnfZ5L(L UQE>hcZf\w<t2i4̜xonI˴|Wz#[mϏ0g8|be]T9u^T,K9Hz=ZK3`r݁3q9pEs5IK2wCZ\;VN8^o%z#ϋJL/֚r ewo?^XC{ oO+KѬtuRɅEhAqf | Stpo<Cg==Sptg[QQEо D" Kv>jsC˧_+]y7!]S _wwGЅlx"R0ƚ+YZM"2N OPTW"Ph)`ihm VG`U]E%QIidH[q+'v񴚷,Vj7mKDгrOjѧ;9$NCZeXވK۞+n Ti\YhGaг2$a~0CLQ&:cmUW08W 8^ 3u/)ŭ~LqG; A`mͦ~{.+OԽS:>[)r_W\4qUa{@v`W (܊-5Q$\m3 _|{L,29zn\8߽Hjd{r{=֣7a\x*7fR!|xXSzu׮og7WDOt8ԯo&w8ť#:34 i&:cmƠM:[Jp+95qH6]t K j k+Ʀ{;ˬl) 4 ^mgKF6:)#ꊫ@cpZ^#c(r+1֊i5[{sQyMoęn# 1lUU( eS@o|[b du5rޮV2\t[Mu.0\Q\ I)f9e0zfsN!?C^eOG#PZ}:_/-z4aXw5 WڿCȯ9&b˔+LFx"0 q"-ZR8dq^n\wvv՚~O[kokSz04\};~TEPJ\ #Fо QEeQĊ i\* #p{ kAp#"QoPZrH i_u[-\Gww\窈pa!K66M%˥֌k8;_MC6t! @4M\E.lUqN8/Fyb[;&c-scY6jbÉ~eil!vu#rƣWzJĘT^e@$ 9"3A (DFCT"q}0{d.%ȕ1c -Y`פ4 "\C ds:ZҠ᯲gdq{@n< ۋrܷrۣkkS@\4Ӈ~M\LIvFiHIc.]}rAь-\ʾf7ǎ|~eG?-"kG )L7Rܻ\.=qk1!]T@@@@As>#XZ{FdCW=$f b4p(ͦ*Y;&)tGʾ7,DZf{_wKoKq9l _kI^y(ͻ[o"Ji+hx=϶_-~,vowl/s|h<|GnD.p-Wk/7>mKYiq$lRܩ m&NujSZF+-qiK23],$ [@f%4TJ\apfQ $u\8z\=~m7gr|TױDGо 0 # dTFQ܅&a4V z/x|ucկSLD'yIv8^-s*6UdvJQf9E ,c"rZ+B*Yյk.!p9W[JؽF#5˜`r\dWQS87K׷FkkF1ѹx ՋD:l6uL7:Ɨgasft6o<0]t}1B#qZmp^uc^[ը+Uaœ{jeŤrjxCk9͑ ҫ׺23,>@Z༻b<|^vI0xB_:1Ez[w.q{}_+<F‹:k:+` C%c̏JN\V MFШ!a6 +RZhc+D}KQʹ: S>#V^!,ԃCNm.LD spF\h7Ycq ݸe;x 2ut^kLJVDe`#PV>Tt'8Hxs:n {^}k-rۣǯѨ5(("2iQm#n5"Wmy_TnU eEȞ̂=kr]_OͲ$/ܣ/o?R^IH 31vfm. t+ČF/.խń6,^I-BV\UD=jH"ͰcDM vԵ+uf:EiحnKSZ:ocJ:\kW(w;^~lJOZr^,X=f`8yzWMtdֹ"zWw'-F-ih}' W=.3QB#kj^K.{N&Ҫ˝V\jHYFiVXXւ\+hsH5fCeGQ.\I0 Fs.uLh{Eh;Mi6\nkѫWhʾiowLi /XE7dV! ùvqtx0T7 i\vƚWQ5A-Ǚj4s:O8;N=m 0 hMj# ᪣:S#TQk˗z \X&:{9;>/7.gY^FÕM3>'&Y&Pܚf@ҕ\=O{836Sq(D}+կuӵio3-?u[žwzpjA+cӦ=* ixkk$'-ʡ|?i:{33y;AHv@#f0KIRh+8dI0iђ=%,VʑQ_آ5UYDaC+ "?о c_QͶ/h13 X")uiQ@E{?ʙn&۵+Jil?sׇ.t㸯a%hlhavrߋۇv޹0#!5Z\sIPaŤD[m {pY@Z{{نg4z 5dUNlY#XµmsI$ lU'4@MFuZr]78z)ܣZ̯|+5n>aU2ZHC{IZT;(ݰo5Lx?Bjh0;r鮍&amE(2ZbqΊg+I/Q$+q͞a0a~ΕцF݇u۪%R˂$ZC WBڥtΖ@jJfQ_\NP,r[7XH{hi;<|kà{ 7GmKphgc}eГ/^Yk=¾9NMg~΃d"bZAcrMK5Bڦx〢 =:B1Tu-^'mNnt\kr_6T;=VԲZ6;XK[L{Tkf3e d 婑+B-ZۆQ5pWMco knM\NxԷ^M *̬~ V0zVpDE\pUDZH/BΗ=S*ITz.m̴d$pa {sb2($jsDa@A)N5ݤ w%ET@@@@@@Aо QkõEnTJ3niJ0 nUWO1@8p#{K7~ W^q5L\0l2ؤIˎe\]2#@̎亮[MH^*)AEg)!Kp<YPABJeJ0QLZ׊^jl/ CCN"3FЀx\A^BmBV0X]*[I}Z{M3[6-|~yˇ^24;^i^:qС`Ƙ^aLhIw\%k@SFGHNkE'uu4W.q_wPuFΒ[6Z ^)\`7CZ^sGi;lLDQ9iWq`u:05DZo]yg+`į5w_5z}.N4꣗n-1ౕxO1&S~y3:te( лSI *7m1Y)䉁X ౮3ǻ2.΂ @L4hįrk/.;qv]pb߻ǿsǧ+0$b;n^񪢴Xas[QW%gEPqZI­4qܵ.8\ۘ^j@)YH)+c0TQ2 7URBØJԝm5K2ť• QaZZqZta9#i( ` ܒ3z9MOu~LX ~2;ڳ]Ke8ښk6 9-hQ:WqK[Agw+qE *y5T{je"& T ׏~S0; -Ί0uk.)*UbHiƊ&V㰆7j; F'-&D jXfQ1hi 4r6+rqFѵ4PabKi,2"3ZFeJBsN>q#ykZ?gIbi;tsl19#W _Y0(yKp wQ{qך3>sk]8./лo,@A0sdcSsKW供.l#ہmjݟ"3՞9]Mr_o}ѵ:C93VY:-ysҨɹ=#0x˿ھV1̨k 4ZTU8ז: q~u˹^H+\r=YeFcҪގTQj(\mηԚ\,n3}5'IʭO,R%dt#]35}:~]0Q2;qoM]1M5}.-u#S'ͷ˫=e/%5' S.c+|O}ǍK٘W[Zhj{K-$wPfyx{McM=55UyG8s8ɅaUg$FD ֗4T pדEi3h#9|{<'|{s^1ʫe|[of4 ;0+ҖoZM"çObsڞ2a k Ănjonn\&S^@ xWuX籂PZ8 6^9W:Qh2*m+ZO~K$+tt3_CaFDAVB#.35F=Peeb^2mP8s͍Ms*Kq֤(( "2(("$GMMdvѷ[q4 ؿ)~}ƾƚFo|oSh*$aI# mvd0mHitHu9Y@'[3=mÛm#%ĝn 8K~?G0|{ ;]+nk FZU{-.vaΪI8r>#}N!٤M.*BzhO gzX bh5R:ΌlC`6Q}zc >^֯p~Grt}%Y b%Ƅ{Kݱ^f^7p1$ %.c[kG- `lm|\+ti<D+Mlz =*بؚڽ(+LꖱsjEœ=3Iv֘ kR:vk[m^HXڊ`=wjlպbk-UcWD#?CXJj4'Ze CBsdR4#Imˆئ}GE,M۳>|k\sTT@@@A<.&B0ھ'?뛗&5\5ÁNpi:8-8r([/8~/؀sD YǪ6tmF q o-HZ\KI SQ /%5'2Q:V>_628fFCyYg~]+G"vN/ -H6ok==;Ky=^c۶moL@Ojoziǧis6c+8aT$8玒=(KFc ME"|fZ\7HDv\\)5]@u,YIp-2N]O7~ BOWj+8}0XyG$+-\c-W˅qIcihZ,N,kjp Un6\r+sj6;4.g rZ:V \U”8_{EDmlT7mn-iǮ-:ic6V1n# J6FЊ ( "mDt<¹]νiybc-\y'~Dص 5{vi2Њ "?о NE1UQkAQE(AQ?/l<զ0;%$R]HƉX˝GVqNXYYc5,K\;2Y Js9(6{JIR[ q*"̭ !j 5^(H5G 8Оkّ{4lYޭ=pfFJöbf1,5$dJ6f#U?-n-{*1ܲF{˗rkuk~vmn;5>f .׉ܮJw6i[M3%2']4rapE9Ildm+~JVGf==/a*cQjK\EpTnzatdFUjs7TAq\+.9R4J&aJ"wkeZp5Up֊91K`p)1DZc W[kv~礮:ElAEt6 HoUs4ev;D@18Ư{u|Og˴yL!h%N}}ܐ W=<^o~N֋>_-xtlq4p [lߗf]H(\:uzOwz8.秏{l;,-e3iW{} #7P:O%w{YZmtR^w ^Ho RB؞u0hX%& w^jbIDHv ]╭pqP1Misz6%4Cy^N#hsI6o]'ҵk;\\1nQNFgzՆүʵ:&@b˩`laƋZ>Kى8Qo|Zk`W ; a-ʬu]1[θ~2-9i\sdh ƤJ.eգ. <${k+n~]{~rɬ־G&ko Ŏ/1z]fPS]*( "*Z uǗxy9}kn> ]ٰ}qrm.ĹS/>+Վa҈?о# &09 ( ɥpD/^[_9췑1O- ϓkœ7mkؘƗQIe?'Ǣ;I/f(CԷ!)n5s3^woo%:buW-qk}:EW/8iK*O9ڝ蝪b2SUŦ  4U5~֫k6jKX`#z[pss:AJ-"{@Px)+f8Uܴ@ K!$?*}Gu\iGoʺk۳i~o4d.MCN^39拭Elm{itʹW/ˋjib"~gb9֧P [j e1iMvZ:&@ ͥtK0v!+\pw״Y56Nqq.9WG&QS6jPLV08=KZKlf-\x~NAe}HnǵkW-_n + :NV9[ǚW;0nΝi^+r:;KKqU}fㅡԻ,Zەch k2t{tgdrG.{}+}T֌i0]&-e;8O .}jxZԥ=*5-,ɗP:S3qk; {G_Sk1+}=+dc*f xW {VW<9vև=ݫxfRrtxG*˺M\ZO1TてBI1QM^ڵՈcZY7yiuaCؾ߳_ͫgpȢ# 8#60NĕL0?о#(0 "II l$8}+4ΗZӼ~ݙy Ha:I[t}2噝yv"-Z5Z;Wi15+KGR6;D9ю>Mk-}FWM]]$|kkn9{Zvŋ\dG8Sep~fƍ5߇ʌ SQ^ZcLUEn*K%K?jZq0 ̅-A00u''e'޸#3U{%`;x$sĒx$UT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Av =N{7w!dn/ߋi?Z;Ȓ|UWWNG43.'2x֝? " X]]E#mprk0ia&r8 (cL],rD)\;TT9ZՒG4( Vm8ƍT W,E1.5*C|wl"Ysʶ++;~y|kmV+}㯯d@xU@@@@"">#d} ^r# =.7{/ qns.вz\p #7nWPѴiφϧ&U`@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A?,F{w2PDןQ_;i?ׇiQ;U]^x;_{v&Cpf c0ʹ.N@Rp\?o|[Y\3)5j%ƦUiʆXG:s1B&6-lz9K vr!!b˙ WN?W~Xn%Ucdݼs删fN)hp2,h)UmtO6ae 0&#/+;<[.#1%8A}* :]9y=ç H3[N1¬6&I =G5IK\m^LZkN4qgs*,|UMMƇc·WjPTӵQQ!­TH-rDW@ȝX*wL759 i]C~ec*Lb8-i.ktJZ9h0TZb!Z3 ! 丯u\!}v\ڷ]_[Υ=FpŝOx?%{=;*MmdZК3ΕftyW,^-]hd4 <:ix)LJν6gbpЃRd-J]˭4%6cK\2 ЩfEJ2ŮLnTP@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A輱AOh">8!w3{+s:mn}HM #=:qPsҾ =omw Ǫ7/ŠmÏq!Zگ Kr>k1Ku~(e0D[QqV[֫G[ 8Ti~ 4e\d2c].𩆥fj )H[cHñ*ή4ǹc [V+pk.n>GobzGxϷI 6Btjʯw~_[8h19;:6qw)[$q'Vm˝gqN E竗ycMZIYs{]cf/W:mHk98JAmnb /- f~D;9q#GLp V\ i=e/~A@@@@@@@@@@@@Aо 0 5DFDP#V ܿTxԾGM{y/m uu;_+]^Kۨ~@4%Yw]vr*X_nM8Q롟4\fq-+}Įo8`.{WlռgA8Q*ZgْJ&s1XrZZT»oZ"ു5{ΈN4XKŶ<r 4L68 YUgF#i TiWX便 $e}oawql@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A/Km[Hא 57e}jj5̺rq}Ǽ-Fl+N{m=Xm_(e&Tihc\NO.|ĮJ&q%<$Ԟ+Sl]I/-wg8y{SSSWi۫1[T 3RԚa; k!hqZaǓsڜkӯm eB#GpWl8ϙ[f S_iz}ǟm2jW$sj2WJA2뗼ߕ|=<,Wl5MZ8KV]HB$;Wf+M) )zF|[SЯ+6x{)z9,m7_L*]V%@N0GpWA?b'9/mUjXpYʰXZ}?:6)?0).ul8! vcn;k #ֵǂ&,wQG}KZÒ[_tmLՕČGs۴G~$CkW0ޯsn1.Įmp7l}ӗ镣ړnp 3 s'%{enM6ر*EEK<\ܟsl}#5|R+hW:=jꍶr&GEuZƃO=릶]z{G-_T,Lkm1\cbH9N9G;ȴ  dW磍d~ kޱ+s&#F f] 0 2FAlZ;hؐ"A`x"Z*ڸc0 'M =Qq/뎌t 0{>/ s{r>2q!kqf }>Z{!EWٶc^5;iᑕ} ;ɢan(ܗ( =4W G7+sZuP YFڰjq$S0;*Juĕ'W^.;qMM3{yI?*&f#E@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A ^A_.;!Z ~Omh@u-ŷ3Kvkl{4.-ż!u~zlqhtD7FI44*~zR Z{~Eߍ-a5ټm ;V甑d8kZhAXcž[鍯ŮЩlc1Q]b# 9GinDsq秎O8˥oXIcN8)%$Q| +o]3& W\@Zrҵo7>.K3Әv)mc'b40WH\Wki\]<0ltdn$ DTVHmʦ2zq,5w ;o{'eLԥy9:K%XAJM<6 H0 "оAo˽ﺳddf_\ogicyW;6a]c\z'ck=ͩF>΃.vs|+ga BsΎ Y˖N]M#K+t!J3$X9+,ޱVC+e+}13^?aV/?k c9귷eɌ1SAw߉՜ fٔo#X\@$Ҝ+r6HNMeCv&$хjiWY=NX_-Ax|{]<ϦN*m(о#^_"8 ZZn_3[[_N–Y-csh}Mh˷4me鵵y0n7FrW=Vh5; 5,J Q˲ vfc{Gnƶҁ1flК5Jb(2llS177еˁZ9ՑӇ}?gRܼj ݳ4inNՋMzrw/8# ٌsΖIv^[1ŕ.o{bk^nHv 0Z8s+#nH#R{[_ĻKsta:f8O>,д(N@iVU@Fg|>m%X.v^ҾMzG;mEdV|k{k#|wZm0Hݞ۩|[pMp$\rN Vv?>siYf?L} ὮAgmTNaa|0Sfd9r73BNZBp{+nwTWEw4>`Kp>^_Yp4Zԗ2Nh^n?cq:\7Lm M;9OcfkؙOoz?s%. \]Kp,.yBkbV6|s}n,u`f/'*77J;wA&^ g|U7=GC-2SP:@=ݫnowy'oexEgzF;e [#nk}"2Ju%IäV]@@@@@@DzO46&\ Yd+-V+y}݋{sݕ@i:_u뗡ڷ.q}8|~Ǐ]^I1; ~62߶4=j/!s=< ˡ_.$O3 &rrљ6spOY5#.H5)8e8%h9 G]N#n`P}g&^8g.Zf:"YEN]v/_ғl]оI:~@֝U}'fG?!y&F jHuQ{!vCk AM5_Լ5ӳ][Weh+9MVi>(0V9=SӬ;,Vpо)XIb4ӎ`q)-Dm!0dF7cy'^g5ܻ\cP@EQA#muktpNKg]rZ yjg']u{]Ǫ;W[brͦR$8OFb_^J0ڤ&ȌiU7n.k e<ܽvd q Z.f2̷>=~HI' ݶSН08,/wP0b= pk+zފ؀о q6GXTB{Kf-R@c%/v{7VNloGK4P$ulI]&\[nHވ{w}7/VB`G2(+B#8;^cЭI4X+dӗ[ů\;P᝕i)K [܌YƵ֑󃻀5_[\gͯЀ'QH "=Ovco&fm/mn=ꐃ@F]||57H${^% yiؙ3H^5҄i'+vݍ9ZTzF+e?Vݫz-F4 ;"iA=O,+naB9*佾׆s\@@@@@@@@@@@@@@AH5Gf 'pR OimIףmKIeM/Ϯ6GZ2[Qо 6f`7._J#m +q;6^ls&cCo)-oNfkڙ;7G. 3^'ZHh!irŕ [sA$|{ÝTtcGQҞpïASrpwK{siNmG?wVaKp^}מ}65D-3Oc~foW/%5q5$& qtv%yo3[o80RVvrn7ŋ.y*4qt:ٯҸt#|7]o_fpY3>m%g [hTr׎gfmJbh(3/6r$-jI˽jk۱ռvG %Zq⽞߃o,>.о {mP/iaO5QD.{+ͱSU|n.K>qJ3 3k,s ,zF41ྣj=֣cJSaMV,P-44ϵi9a T˕^ۮGQ$/֦5G̷)@kRqjM1x" 48"0 " j$k"cy5=s-gVaaBX媪vE\tf,Jvl@@@@@@@@@@@@@@Aq:CF ׺[K$-pΊmbq]. W '*{K %X*{ !iEs^MSƯ:?о0;(Wgz"IqsxrH lF>z\|.X ) {.l..c@suoܷ5;Qe@~o(* ;].bt ¸W*Q9 G?ζ4[J{K>Yl2b{c2/׬y<{idÛF[ӃM:aEwQQEo7L|RHLWbGRm@z 6\+\;W-Xr7mE.5侏HB ͸G_jۧA#.! Io76r3~]rDҕˁ*iɶHqٖ 8>^oky.rx\C,"||sIܘD(о"Sa-Wͺ]3wߖ[$ֶNx sXHз:˫5rk[m78]Cķ};Ӳմb1\Y#nVi_gk-rIv+>p qFƌJ}^C.slIxc&Gi%X$t%4綷iӏoeyގOW|˿SxlU6W3ھ׊goW."L?о Y+~-mG?n.'|_{HtM\<\$W/p7+y1K&. |5ik4jpܑɶYu6Lzjbsg_3ʽkU 7,s\0PMgtL~.yȖee[Z }?}>~{_Jr'QhҜ=5Y)n[v}a"'W[rsyO_>NWa]q0iVLq5GR#;1ɥ:v.XFQԸjƤWi1 *2ZZhE ##оE䚋mwI1s_˥y_ؾ& M "O1qnZ^ϡ<]u,^[T5z_*czpx$!5vMn^~Iv>{X-ØV~ic홋^@@A, Ɯ=?ɮ5+^>[j_:{/kƫn~Zm5>񯲷/%Ǎ[5dNe:RTUо 쮟k3eac}s0|x/!3:;fsIFFϺbз[>ap3Khd{I+>oʱj\^{ќmo16KJp8xϝϭl ڗ/\j7gqÈ4YYJ%x ;2%cn-v;_#:I=sY;#Ue5ͯ@0cd_ TD8J Pcވ@@@@@Aо {n5X^PtfնF ;zn_^+e7?*:97ltua/ah:[99rmrmMT ku:٥?.W]v–Z[镍j´5vmw+1 bՍ >BMo o_<̈́@_GN]vZDH.4UD=ViK;b?ɢc>̋7,\7^|Ed A;"?оy{h$5uCH_UA-ue; eV\ʂо%`*}M`RG7Y]~[]BDcUޣէ^^NY_Ro啦 lm=K[\Z#G+θEzYA5%W6~oMQ-  S<}6K0H0\ko533G/yɭ'j֘vbf-4mD;/~?·wä*<٠K&찊"'OÍktiR{P쌱E5hOcaqLk84ɌKquo#oL}k)P=%&v tAկ3[WҾ}jm&9 A4*QGk,16(3wʻ[ִ+(~ᲊHM]n25WҦ&oF U?s_=-OJ7;s4kuKZQy8W^Bݣ~xM8> i^൧nխczط6ͶIo,CK{Ok9Mp$c4 ~ {,G>r;ɬ_e87NM(]_*c1\ZAp!mXE{O+~QofmL1<7V4o3bHWnwmsu:L|95sʮyCod'Lfxw;k/@aa>*yǍx,qcsIqv6רЃxNqѠԃh䘑kI֦He+KAо =qTxCFMc+l]!<|6ٸ[_9Ӯ^Ⱦ"77*OnYhPv*^UkK?h#ki.zH- gMV}'GZiTsU?j.SFY^ottqJ7H]rDM:}gct9oXmnse $KjVzM6Ӳ#hٚcێkq"W-]WU<6_;Nyyk5dXsےz;r7-XG+G!c_}e~?eBXC }e} =^gyC; X4KǾ>Wh.-y5ұǶnsܶG#[ O ]G9fy^-Ѿ-qrZ:0Z}W?Rc>؝#5iӆuϊ^K87yMx;\k she7[Yҵr7w ^D5v±z}y u%nM#Sh[VcsݔB98?uk{ض5NC@Z)pkZ7ŝ1{n^e^ή.۽:⌵WQ:\xutmcM0"7J,F'Pm;Əʺ}ˌk~ۙuob]KmJyq#WX׭ٽ>]^ʻ$R鹱s9wF0GJݵ +XUl'QcqˍdqkKĖ=&8@ֹviuӓ9崙Rb-t4wR0^ug9.$x|[XoqZ̛po⮷{fW??QfIϭf{;2ny;A8b}v׎cn2Y5nl`aw5]gًii%+Fz]cƼپVۺ4GVE͢=5?Kch0_[mY1W:Uٸ8HiB0F6Piʧ?E @]#qҭ pAо H֒Q_¨4@@@@@@@@@@@@Argv-ԭ-CL#.x"s\\Գ#uܥ]I;|]z >LC/~R[7 u[<:Yo^M>rkY_bI.$6 㕣uu{OlTs2ru;Y)mNcôѯnL*6^K|48L<'9hi,st]v0?-6; 'uգiG iPz޲gV\Š@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sg>C;m5F=5׽Y-f"o)EjZ*0s$/N=ͬ::9hZA![*.m=68f"S/m~BzOp?`&?QcnI9{*k-~b{%vԠs;Wq۟UcPRYAu^+kXMKx叔;{X uk%g1^)oĒ/,Ze.sL- ?~[y+"1EêpOoq\,{[Sxw/g.?9Hk@Vo/jaQmtNե4n[h xܦG1sW\?ey9=״kY_w&xs䐻Sqcj m {[\ۘc{*Hk]T1MLp06͠i/-ڜRv_xs]&y[qԹ*B8#/*vx6SA#n3] 5@ w3[n^#6ϻ}öYY8I{uҷ/f,trt4=[D мֽ0ntېY¬r=*b8N`YRaw NS]4%k\H9|\"lK9k 'joH?kCom84w+yŧ/GY\d<c7W^k5W+pUݷLh|oo5:Xsg¸^gmܻt78}h.unsn2_ϙ:fc72c#O2{_ ^F؍"DnmnKs%ߘ*[!ЧZ+^~}ۺGdX54xuٜU/4hK KV;e H,cI+wi:ã#g10\IhX9\UO](>utk__\T4M}Ks5?*m%ѳK_&*}_﫥p_S~`ẹpcmdĵok}S}s4l;分7uk:1{zʺxͻrY<{Od8[癧#Jʼw[Ot3;aS#?mh{\'WΏ'2 g37ihp5ku;]:dC  @ެ1;Ya ~^%rR8Pw\W.gя.H魩rP W#we]jujlel^܆?WĹܮMMk-]BB`a=ce28ٚCu Jk8Vl|JѤ6ׇ'H8Ku8pz;EdSXi {9ݏș0fDqzWS^wr*x/m1qR6@CUL,?q n`sVn729MxU Ͷ .5ݤyK+ZtBECk]8SeCSN]]NƴC@q3gsZA&b{&]3#wmvv$T?WNoucx۾&O 1"SUb뷤z.~@mquw Ce'ٻKO\z^V]&m%ChOjͶgCcR*ME)ƞ,n"'XnBH 5 -G15pS&Ԋh(䋹uh\ŸFEԬZe8i ;[W)k]f頡}UmrQ_U2SUj3Y6g>+qskr؃NS ZDP ,yi҇S:vҴ8*#\]!0ecu1"Ժ`f-2 B)gBAR-ћ4Um5:ɇVFYwh+$aQڹe7KPSp)F{V.V#({|ŰCS|Zɷg|UN#Kq*8 26W3Jw,Y'{.a S½yQ,p aZ-Pо45 N4Ac p8q@@@@@@@@@@@@@A?45z,]-֖dw I|JE#}MN ꯫szcF1N\S)s>Y y^{'i@e յA>S̓}:W!6뎑W5sCCtrWM疮a'4Z8rE^LW_7xu|[g w OO+DgZ=)m#eF1<V16|EqKJjdam}MHE9}<~ ysm1!kKMq'F.ӆ٘yḓ1I3r`}V]~ksyvEks!x ]xf *L \ks8Ԓin^m㘗xkQ3^bj$4.~.Mz$[Zv)L|*Z_mۢSV[CF*ܖnHΌv+n- 5[}49xSTV>bc aS >50eB<.%0eǸ1<Ӂ5pj”umx-`*3zwon(C) fY$bVU'eܢ]0b8ּ jVlrMON yL+\B_L*,Pkn':B*N[B2'T\*o-MWB0+Q'Ο4ct3VQ;<>x&[yP@4\cvNA'U,3AӚ 'ΈepJ9jZdSBkTV=^(50QpL9~(5Qwcr*Hyc94zH.UVkaYٷʙs:ɶKIkF #G.<~巗[Vs6 xj%qW~K}ZM|aqNWZ5W99cήm6[Qu--"q:OGp_K}Ei|9Eu2 HNlO? _reط]6y5?^ <NGjOS^[l^dٰ=*5qmyu]{^c>5J?c{{`'%{teϺthT# xkrө_ 7o:H'hq=mtrpv7ymentdI oTz/=~HjmF J}Wt;PEsk}L8H߬ջۮf>}+sy}S1 [6tI?e[ؼ% D%w[g鴬m&Ho/ qCm> a6l\?Óm>bςkYӃGk>ε ZoV- d1dq8kW]&c_reylt7@C$~}ƱO3_k󵿚-6ܵI0鈻UŹ^t]"es\S ez\= -QZ9^C탃/])~TsO>GԳZݮC4~| ڞ_iu?ZƬe.8h<ݞĽ28J{my^M@G /|t9|fQf@П[#.jjl{>̈}3yٷ@-udiɧve]'9d,OW굌wkگAg5ӗJ>U߄jq;^{b}wX߇1IZb\±yZx뎎/e3K@=\# ||z;ݝ#엞^FJx Y p]3-dڻy|^$u@kLpǒx]]˓~:rփҠ{K'E -na C.*)]8jun?{jkݱو[[6mM;ĺ9#J ,|rߖ]Zr˅iSNyr6oFhqr ek}I 9.mCq4:\hf q|:WIZFw4ZFf{@s0 Wp z]vcƾ?gI5M"HN.ˆKX>81|6cِji0ϝq.j]KaՆ{1sU5{;˷:[9ei%Wҵ[Xsd5w=i\oŎ=VokkNKMc}XZ^Ċ8֬瓴gWhoe5:uWkZ+|Ke F\яj8ȫk=sA.!jӧe9VMPG}l"Ht8ÿr\z.D9VkUG{}[_c`$1e.V\tPTȍcFFs jx+9TvyQeެ֣㇡L.[ pT$XsG.}t?q,ᬣu$VpA5 GȖ}]J#VUz Q3>K/JLwKH⯉~ì"<'H Pε4b^ƕ?O WYeO2yCsq&h26kX얟t{4c9Xp\+iԳۻU"a[-_gS-~ߗ/gY 'fwk6V51&͹Y0 kqs;yg ~>6"6c*p XeFy\yIZA1QApY&d})NНvJ rb^nh\t/2h;h?&R`0!F"N (.% sdu1= uJ- {sDqd kMTV~* mi|Q|k eamq5DzșMFt-a2ntmA& `C@ČGQ| Q1KHkFAIsN<N8xj4爪$g*Ί{ VU4rJn iL.Va(st OQW/nZ-kXn1C.iv#*i6'\;o-mfyfKR{_i[oe ֶSC,sH-#s@.qZ9rã_>9s:INM4# 5GW"7sM( #='Q|K>sao䯛bSHq`?tRa巙5mta }J~&lٗg |:5k2W6?ļZ9}1͛!:{ZB.D#5cJsmxɿ hnW)k3)޲=37qۋQ(@#2K~.UokUo=kvruHυf{} ￵P+ck6?a޿k÷>C8-3SWZzI/2 ԂM]4m=Yo [>!] Oq o3Xq' 4^>_r)}__ef0C ;Dsx}^IXr#$ݶQaVQܼ퐛9ᅮ^d.*ͥ9+J6˲r=7S) >#F;FL9"I $ /m7lIh< o7mWj.dXet{-Kŷ}*sw'2;ء,mßцKn:YZo7L-A# {G/zϫl/dVXٖI?=勽nhaqW?xc7t]f# =EGi<}_MV se9 }~U9>p.I c-4Tt?:߄n۵=间цU3SՎlZj4$Q75T9Q$L+I<µ֑{^iO%cm/stkZls#O7ūĽ{1tx'k%&iioJ Qonoi4P@.|c>M?&촻;H+ }YϫW~kX_۵hͺͳ) 2exSxǗv] QCo!k >y=.G-[oTw70M$!&is~:|^Է5e^o{5鍠Pɯs/>QX{V2> [!-kH]#mϦ-jik/3[blͯio.i-7 5I@8W[tu53}֑>}7X./khaktu5ڑ3ŧxyw]5Q:a(уQ6ڬԻa͛12I:_GԻi/iWg=v5 ǛZϴӭ';M4K~MpH`#qZ\Ly[g1 +(4h?( j8TMA*R"mR{%ߺw'D[s|Ux&uO/~d2[#M1jm4ȭM9ػ>2M#U2m?*fdk=HZ[;+LZ,`-4+#XCi8z7xۤS+s[T¯p9Ɇa9S+ q**syz7e+õ< P^tMoܻI&ՔNF ʖ5;Us.ڌtڗIXXy+^JmF:sv9.}I_k8AYRfٲ8j05}P6enF >Nkyg M s9,ƁΔ.d&ӊ\62Nٓ3MRnn(ڌ{kQŖ4)H"i+S _ԁ%uOeZkLI5n|SR6 ƢAjaI61! "O¢M!2ǩº1 +r;+ |:$ywٺKYmlܻ;Zo͏-QEӋ&O6M>.c7.]qN$GFHUŵtj*F;k=Ҽ=siM'CwI|}! Qf}tO.:Ls *߆F4쮏blZ~gL˯&#'XuEڍno3ZDn:e'tԖNRFE޶s Ağu}_Թ:/Ex jYm$YQ1DL g-a%~Xo [],!=d8~JT:PW$ȉ抈d+`0 -+nh^"ڃ=`;a}ZajMhX2ge0֗Gv•wȳwkbna =測ښ:֍hhjvodvzVt"tv.ki \r6zW;j3m5WWKkƟtٰ{767PDak:/tF]l=wypVMfQB5iO,Go13#;m$S=y5pep\n 5B 9ڨSw˫Lm8Ai}NogQYrrNY4ӕk@1ˊL)\n=8@@ ~O+@.Y & *]Q miqU5-q~w**G;!yă9uĎ pt,Zl/kmdҚլ"v9U3ɬ&h"ͯyEViuZ tҠbNO<9T${#@4ƾ,{L|\:W:KC-ѭphۖ5{~nxo]vfZ=kbk:wk޶bCow Q kAɫss̾StowVKFǒ7]&^ u6[%ڰ6F@O]g=vunx>l"T"6?Mߥ82иM\7b.wKRIQ3*,kOM33n%2}=G6ZZv5n2/ik+ѭv̒O@cn{Ü3Ai"NI48 r5?꽓\wZ̠KM\]~z:<-$l}̱mv}n姺yg8ƀֵb@rjLJ 9ޣ\:&.du\ᮾ$}լ3XfЯy+:Ԃ##.O$ $#-=d_$ \ڇexJ;#A]@qYK0.,-k.pyeUwvO: ZH4!pwk3P]yH do*SUwar9X$7rDOVƕ4_2;cᬱ j{1=W5|nN2 B 0ێøm[Mҋ^ȢS mm"Ví4#}gp Q-}y _ dդv9p0w_`%7;2_I 3؍Or޻yhak[ynI6@OݏW Z?~~H$q>_)l:o _OO8]$cz'7sO$.еFΦ{9^}v-řj\7|L rЃs<؆Dz7}"L-$*4b=*m0ܠplDMNu7BڋfNaeMcEpDH4Lr!jK9ebO/S 1c1W)ӫ4bx*"oQkA.W&t4өISep.I!^]ZM:>2WhmuIx:U,eڴ>:uAi VƵ& @b8թ*VRiW:tn`LGTi;/X< < }iU=.4ҘLvG50[0e=H㟡}PkTB[J |JLJr=+Q* ”:Q^7cRE*NF4BtmnWXV䎼 :a~+ٹb OEM'esS !ֿъdVBj?O05cU1Drn@5F 1p0qCXGbRwESKѝ9 qf];96-/]K{5u->ʘT0)AR+N *!NV*0ed0ʦF?,YIheX`i:+YfȆ~R㏄g͸k@>!\Кc(#*x*sinw8psG 4i#~.V[r9e$эk]8XHui@l-[h\yusnt qž 82kV_L5#s\hA9A]9HzmmZge?X׽woWic KE8{v1PX75t"3V15ұwnh 54Z zssY,Sam$Ɣi, o9w>x# tgN+ oC`ڵ&QpDz94fiڵ>2C4'\ p4hujGц7k,gJ9ƪe;VVNYZ}za\.oԅ[PWg~![)fl6Z`xWRx_¶%f ^a.c2piyTmOɴ~kcH0?J}Otu68i wy9 =].įO*ku}#$f9=}+"XjtfW =Ā.-u1ʮ<+qGs"_*0vўwUU`Zま`Lc]˦m;1y#[WK'+SsfDy޳Vճ?Vr3Οt}NXTڍOYG%V$4/&k.$IF9DDh-e<7it {.wC=nk>0*˕^Љ-N/5[45}2+0aհcH7x(x ໳ⳖZ?чΦ)L8䙗{^ݲR[o e;EiM^?Ĝ|a`X۫q+ld~5#=k^㫋ș0 u r??Iis?Frˮ%i ӲK8j⊑V`O .ixQZ˷= Uuk?) hk=8, ;&cXʆ e@QS62IWQ[MP@b$iS F4+Lic7Ahω(71Ev02*5&pw{9 [q;ᬭ6SFHƾ`4cOԺZM5qoGYYVu!Mx!kh] V~1% ́T񉚌!`jkO5C4,xq>ڗxJq<D%Jy-௒x1 wɆ͊G`AV;c+ ?\c+?yN. :IZLFm+DIcyIiE_4#IdGo0)-5L(4.Ӑ<(C="V-6I=Y;GJ\`d8xb2KV5 p$Esg)ރIfsNЬk&cI:F4QdZ<>fY$q̖1^ Cqq &sxԒ؀zyh`_eg pĊ}n]?ȵNtqՈ _YL>.s5RVW|ZZ]onN1@h(2QA)dTsdhq9ꕖq' s_V{*;v27YCG҃@c_Jݪa͎х8PWp%,HnKE[ى9jes.Z>MQ"&T̂gmc*H-v8pf+-gђHxd5!)Y{U'Ó!ZJ&L.GhܝJX0 UɄ?k>Kύӹk()_^⯎M {)d\տqS5t`Arnz~[ž'*`vN*ңL;z 䥆U7yXh5I 7I'L q{h*O4#Q#.uNҵ+A[a8Th|*d.o+'E0,s[jQItuh>ܘ2OPZq~iTt(1^ #5X rA@fl٩:N5Ԁdbq9؃ #AQ J?⢶ǾUF~CL*.H=&L+:ad}5i?I + =Vm ֬qRrQAN+vIoiPj5Oah#uj˙ʒпMf;i]då8;2RF6]. 0Ujү)-;t;,Op=r#.<(?3kT 'BzU>?ڻx/oxV||WVmRVZ'G7F\Y;u}4_|* ?o5TGO '( 8g x~n8ڌ?7,46%j}F?+n'n*{c~#lm|мP?Թ^|zv-?Vq{F)?ÿiyn67 LoR^iaCաouv޺}kӑ=...-uuUpsydult/.ﳥ~wblNݥ}t:eҖii u+ZUSV| hQ:0e>sGk<(n@ kG5i_Aɸvt)z*Ñ1Vj}47f͐Ir+@fk8k,Rt ֜<5y|6"yy%~\@UO%ii3!/8STkEEK\VTfk#IukvKAdq e僕p8W#݆K6+=m۰4OR/But繝MiΕqںȑu HL>ѩ&ZHLl,%M*1ĦDk(\х1%5aPPi+0Ob\n\n.\@ .5(3U.w:WP KY9L%[^!+YRK6g3rd[؜K:7t1EH1էiL*{}UΚE0Z1&*Lꌲb]iL& \ ÿ4˟eB1ޚS J9 8 qhӝi V%Q~lC5YP1{c' #Չv{j\t׏ck 4sG+[t|]YE{otż7A.\-[ťrI Z+1"M9TD/^ik\Z+_KT1]8K) rDN#^*gTpUu>NiJO; 1NAONEȷ}I /]Ab,qH`zaK[:J?+i{CC(F6۾Cms8}d6&4?h7ꓪۅxTqҗRlRF[iwe7yCW<k|C#]: nEH?CUgWn K>[oC~<%<̆?k빸4; 3,WF:oB nN¹6Lט$p996@5^~/'Yn:i,fc2䱩mzoݮ障*8?X[i cK% csj{,SF,Φ?d5_XM+ #Vg3jWvb/l`*Tz.sk=U!'\ځsuN.?+6i4;yA>)eY~'Wvy]g2#KMs1:~ךּNO>Uٿ/-.!C+.h=Z4}.;sa]I.n3h4д}:GIY]dO 1Z?2Z=huppQL.Z3m0\״W=[TKF/ed-sZ{*Z+fk&iIp8?"dՉk+VYi'˔qUok^'R\%_FRn] kHqY[G1W-!$j ,LYW=\֍{F"$F1R }+Hɕ 8jw89iLkR xsH3v5[<<3W nUʊ5rHZV:AʮkMA.4\]F8Ӓ`ӟ0j"7{;:XP{hZ`60j= ep[L4S*UE0eZD.Օ>upSVQH.iCj-$ |" ۠EFnZw+Cx]∫<ÇUrk%GyPZHqL\)uPgD่rV pzaQreҲ?½L:hT&R-9 W)f0[*qS+g1 &D=x\h׊h^q8(Ah%4Es+]P~rGFf?W*0ԘLJLjQɅy.CX*{}G;F #c) 8, ,vv) .i_փQ}#QJa;;܊)&L#Z@'O#Ŗ5&LEңT}-e05\Ut,)DTʰ1|Qq( kj05 {} epL>ɆRpS&6GU2aazdVU xT +Ie-nF _GUđJwZ U8ɅWTj~&LIlփ&BNecPc-4, iq#=PQʬ&ZI IPCxֲ5n-6s^j+{'rX^솺hɢ9y^]?NV{+OQ̑՚9c=G(x2HDWƧ 0ED@haS];EDÀs+SV|noӈk xkş$׿CAhе>>$:Fi3VU#&S92EuI5d3qv\b{#p'1 pCǐL;r9~%"Vk?~Us=AJT44& Ҋc0nv2L7j\LG~h8ңWeQocP ñ Yto`$oMxZMxmh\YvQ=zA<my]@5E]H%N&?Lm-1 P*O&_hs>έJ`IYdƮ jxs%Hq-i<0ÌBe~ƶ\\ujl9Vs^2F>1G]q0dx.rEtA-Ո=EF9DnP:ȭ[hX0yH4'H nN8c}q[4~\WI$ོcZV/[OEÂS/Qᗚiiט\gV>^kEc- ?2@Yyo#$k4gt卣]#bq#Bŭpak6!3Oe^u6fśnRڷ06u. WU⇵a @5|x#jKsZg'Ĉ$ѦO5g0;YkoՋ6]WtэD6>.zxU^A$ h{C# 8~cKyYZ>44."WHgSª9lg2Di`^yqY#ZXi@;.foW(Мk\5~^.oDw Hs3H|]No=\YxSSV+G;cM9jwՕfT.s]9-9uc9y|6b$G]X,ttkxbj>Ʌ8۩>]?UY\n/okY[& P->ת=)-˖бZq9^WKZm6=\7sŮ*U.P0.իZW&v pƟĵFF:CZ1 <04Qȴ_:?aka(ˉcgT֔Hµ۫=O<V UΟeKI|chi{EpU2f+Q jwōDkp{`qj+Qe\J($BtUQ4JU p4UD;$aJ ڲN(SeLdn ar; SOL`wOWQIpD.I 0h]T`b`y%knAcEFH'v.e\5*+QvkQAp?^qD`R7N(4(0\(5v9QoΙh \ Oe2a& j8qS&L6 q5d7>ϡ_$nɆZW n1*yjIn_Bd^a%r@ir bZ ayTlmb2,d2Nii 42a ⢶8Q/ISVBZ+\ii+Xl93OA8 gU0n  ɐS,a\UDbr[jPiկUFA\AUp$2\.rb 6ޠP-`5u)S65.#Gʛ7;CH:\ tT;5,%h@E *A*aQZTj؉8UTcS<jaR@⢵{M}%*b@!iL D}ȩ[ IB X #"ah4 ȖvAZqydjTU[ 9pWU)kr0L]='p02I毵y:o;g I%/[FܭӢ_4L㳣l>$s~,?}Ob嵏m #\S4G@~˾]˩ DP 5h{1Uя9=].-9 sHgu͢s\|W3d `,r0 _Bqy8S[gLәP8R .+PLc8TeBΐIJ͍IYnqO9%urbN}*(,^gQ_U)kjY;h#.KR8K#yu(䙻*b&[ )-N+䨭J~kp*rwG[kJ{u& 68ܼJ} `gAOԦ lҠ`{Ncւ;"ecdWU6}?\aQ(ܝapDe Q<8|p V012&/) (aSwR7%Q^P}Ko_4#>Rt~+hg#X-)*=9B~o6~4sOώ)[uXP5>z~2`s ƠPRyL+18{;qOH( X@n 0Lj/b'@"¶mu24P3D䕱i4q|j2n4#+ʥ\+aԷٕyuJbws Rbl2#Ff-3l38 SЦW lAMPɇ&cw/SǗ4ɄRU\=Lf8:#UaC tCn5i(ΥtiDHhai' KBXX;mjΒS\68#n8N_efFVx0`z9Tpn-:%ٸU ;oP2^6W]A5K Z18ⵕI6k9 ֶqLX[OZ DFߣVXp^qG`:Gtɩ'+Gud!¸|5gTw}ęs$4M{jyȊO9NK-DwR}qșK%P5a;KUkN:?%y@ϧ{[H]z7-[[1kMM}k]~%kHIhu(nG eIX^HiMBa׋Y eH CZ\N e]O]Y"8;Fr:s1ΠړH:zLD֑Zfwkz-n?5LY,t l8hlnE*6ll 5 rFr^]~+sLƮaq<̩տ:ȭYƖhmA$+iVw7OCt0->&7G1K>P\h-Ӈ0 >wkAQcDpPdzqKm1-x!P;KNec;yzD$dqm+_o^}aɃ(@ Xe0acha%¸cWJOl_$]^=_̳bʷ5+N']\9>]V`v0 ´+r(ɱ]ZJִA+d 9_$ð-Јቌa ko)/c3ռW:Foo6?S᛾ׅk:I{, [AxNz 3hԵ&YVC FTYn5v8h0NZkO{Eu3 q)!j gmKc_$N\0k@[9E%4~UQW0p[eL.Z@2T?0`8gU@]ݸqL>4'ƹ0e" r veǸ`~b^n$j hAJp0Ogk@UCH<Z\&[2G+]2qpH,qe(0*؀;kv@L.YpeL X #L.Y+` ϡQ", 42Ҡ)Cˆ6d刭{ F p*ZP $Ң峮i\8۶U̪Ĝ \> ><9O?RLpkt凋姪cquF?xSZ3pkASXHž82\܀ǏWT4ZI' 7rf{7.ƤP*d- j\*H'YbvEp F\xG Tj mOQ`Ƞij+g[B(4AFMY(x{·s@,xL 5WӛKԂ7]H2ŕ2ޮ"eF[3V҅WnLjhk'1"RUgyFꃘ9U<ڟ196$fX84ZCjEonqW 9RobȴGTi.8kq5ß׻C[T J칍]&Sȶ[Yb>@Gcts32|p$.hL*g.6ıc v^\֫wwI=ܸaMn\&RŸ4 qzӖ*xn.2SViPlIPd5Uhh ֙dUj DF rЫ/AP.-LniҴ\81Q{*)A00%ƍxL&ROTTV$0d꿍TH`] hȯ}e wWp!S eڱSZE4-@S dF1l'vV& dz75ô7-$`B!pK}\I8?)0e?@p?aW {e7H 2=Sƹ%}@u ^ ؙYai٧ *f4ZfpAhƃ0np^1W`+ >Y Yj' eO2kk #;Dt {yLjHi5&>i(֊ES-aU#7@޷bJ^lfBuO1 8 GSkSQPJSAp5([ѪV nrf[PrʕRC.d `'VU?p1s=~TgVӴA26MG>#QL2$#V %A$ )-0M;OW RZ;AAjbDNpiQiW+lǙ".)z Z)繮>BMgO-OOy2a\aL/zx7JZ) r?2aNi rm.~Mʵ{Ei#_(w- =yUDCS\0Ih֒0$ I2PFUvlP8CUpO@*i,FWPAZ$@4UEGAZp 3fk `EQta_6G.N]#hi|ks@ή $[zyOo7kk TXn{@pc]L8{ RrrJ`miiy:=52ZuHU8{?ULYn n)\(0dqTx}oe2n6hp{j"hcr#AO3?$ZM!;=> {[nw{m_iH[m j*{,fѠ{rjgcQ9♀F?JQ8wqAN2A $4LJziʢ @en珧-K\!6fCJ@6jkī-p@@+/&a '֩OC,.4j>zDQZ_=XD>"cfGtEomKdk;YAdXv,9dh:wQVe[Sw̹X>mrT5Q -~x\G]\fYMZ[z'iOe3Fgl>:"BX Tzمci!9:3iyYkŜUm8Tip5LSx`-NG5$p``L\9 tWY /ҕ}PKtCd[~PLeۏB`vTP@LnojDEx &0e~1?0dIy6un} jʢ6ח6z-: #7DmҘ2ـj6q2í aazxSO{Ax[|, ,\1uĚNzXT\5WvU6?˜L(߈$Q?@ꩅ/QV-5 U853}obcmLΫd 5>y_6KXˣvBB FtSVvj;^X|^dVH;GQϰkY dd渹EOov֤\NNe5<#çYLojDz&1G=҂s[-ʮ]!kpV7!B9[푷V(G-uGs.íqk+sw&+"g UĂWRE|G-`U!HxFlgZ]=^l(_yz]kՀZcW{][Y8;2a*[ͫr/|µʱ08Ɨ5dfMZ5"fj6q04PbUE+`˚K/A4hfUvmp׵XD̆Q+XO >wwR9~W3z&\8wrZCZ(E Ն޾0KT~*bY?Q!;?`YnƏl`aW px7))#49Ƈ\"+$j2Ҝ0etH'UIhɭ.i%-5uk3«3W[)k@$֐\hq~{, Xބ`;I+\us1kRcgJwR \M^'5L.[uHƸ=GWGՓY2NN"_\pk~9RuqA uASXƮ$h/*3~!5\Z  >!#R*W> M~dbiZw۪8(uj*TҡeDFCNH2+:d~-MD%s<ӇQеn.:1 Bkn8}tDot/.ҿ.*$ps#wZ}j0e̸fXm![G}W4֪^:H" 1UD9{|YU#Sh]P83[;܎L~,_ iLb0b,e\&S}1?eɊf4empkbiʍƌk9TРIoo `cja sM os{F\lrcɠ1Y dkOL}:x8S λ܉*emkdqjA8O,pb"w~0lH(I5J,OQb-`F9]@/Q !(4v4:r1 j`)42҇0U% pH֜?JڳugK&mna]4`MF3i )[F{~!ђgG#)nU`dmlph4k7VP:^ZsFG ;mwqcQrtij*Ň&p{` zoA#8K"- ݘ>hD s7 Vp]a+m4Fj<10粳X׉o+Y̭`xSQphtT ^iKz`)__IL-|DM$ s饧S)⏯LO*2ba4^r;{cV1ƚN|=Uˬ,ه|ɼ\p^i[I:/vj/d6lHtz՚vo,#ѷCL¡$}1z:~Zau{lXuxV.,>VP /5{GO;=2iByCyՍ׻Uڥ:q|GZ]2:Un>Zmf<Yٺw5..h{\~ֳۣN[ԝ-AA|x}wIXRޛG[~ێ͆Xu=Z@)Xm='ܴ/$4 M]gkxy>}˶{裕ZWџ&](eoԣZI"3~{2]\L Bs=o?ԓl ot놈&>_NuſVh'Ep1 pj}o{Aq;y,tܭt lNW8Prb֎1$Ped1QU?$)y0QޤptLWV׭A i:[ƼjV8^~L&R&7 <$85]LAt-n5c>87WWV K.a{ #Y*GiZ&0vPW[@a;/$A#a*[y~b'`iZ援}98WlUa)CFL+xUɆ7Hu?re08[+p>v-e0s# lehSJ+8sY\V% q5om]tIӈheY,tAyCH vY3K+"=, s]ߡyBʶFo8-^Λ:Iq#b깊[5&KD9Y_\Jy ?p6HSǥ>後c%$n|'xӇ&k8~ɳAr$2s kM0u}nԒDgxs+ž/Ń' e|]ѳ@Zêc ţ's& <ep*qaƔ ʥ8T;P*a$nciL*_A3Gag׶: <{Ta#ٴHTɆ$Hg7 ίa_@4ɹ,iyJcdKBGϥYx~# O<[EiM=2G oRRKuPT?Vj0$ @Dʮy@S o{HҮ(˨Z*2ҁXi'AjQk<k\h&fd1?|S$´4 13Y\6,x|aRLpk} 593>%1 Ԡ:{ar`Z*:k TkXuOIĠ٬wEҊtE'fPi#Pc)@~8Ecក 9 ۻ"TTc V0L$w)|CBӨStPРcΩ# G\Uf?h1t:eX=LЮSv %@چn4C 48-MC8rT~y)bZ1ďC 2j#<~L1bw2ZX\iL:jHϏΊEiiiƃ_@J4BTVt!i2 [T%Edv@P`Ca!z*v1*^BQcĬpEdW:ހ#-'"`L)E)\ALr#:&wCf2a dH.p2asO(2mj5>dɁF0DɅwWS}+^UF`>B+LU)Ȓ Hu~KS3՛+<ՒC)ih/coJ9vW;GwGna,$=VWt^z-K]C%sί=Ҧuo|ln lވ;]&ڦ2g߮Zޱp,tmO`u{u}uo.ի&\O#XO gMgUw,yZ,/CD(mh<: i_RWNgRuNZ.~{7>o^SR~c-`G)wBmk$GBFG*9\^Y#i <$gv,H 4g ̎%FeWgOjkU2g캳&ҞCsgQeu;Zmp?'D,0%xycKsyI8vLcLW'Wo!3u-Nt1@xAm9g ̧nѵ۶8,'3Se3y`6֢LWS#CN{^qwגF0I#]tkH`e:MSI(˽-ܬm꽦aK}_gY׃wi[e=C?tx#U3\~$Hv"qtoMҺ͊[M\19,sKW>KiZ"hAʗL7z d n6i5Vh+<>a8%B2fu:13}~.:[r= xW|$7ۓMˮ!U#ݵ2msfs 1,rO%,Om fKGVf,pɮoXk@c?ejT1mpKfXIiN3E.ѱM+g70𫝌DIэ{p#sV>f{vɢl2Ckqv=&3CuaܳDi(joLGK.$ޔH9vbIlYK-й}^k#|mxӛk}<$;5XD2rMI8 Vnԟnb@,[et;ԛHYT,Yv vR9 WO_,t?72ԑ-;;Sd LרM2n-Ɇ0|:dɓ :d Ƀ&&L0|:0|9T P? T0|(C„0| C (C | C | S& |Qp|C dadɆ S&eL`س0)f7-e0L6mȔ0|ʙ0i5 6vL 0ɣ{*=@(>ᇴU!_0e'U-ATVtO@Q!:OHJD2KP1'Yi6@dNIQƿB+jv(0!TzUvUDaT`7O ޚF2Ā72PjZrAW ڝۇE`Qù2afnj07xR?R ?N,f"mb;1 גaYS$~"sC q4wD4 ߪ aræSP3~W{u;=j Xa[ L1 4vq*i=rIз9i]JC2<l[=8m/sYcD8 ;bL11?"fnV7 )a۱1\erds(ETɆ:i JcEr`7L:'*Lc&Ɇ}b0·\t^Kh+\>B&6q+LES[Iꆸ;?Zr^fQG֓mzUp,-:2oEF嫽kmrKOe(®L$qLvz޳uj|FhۍܘB6ۂp& 4D!4mbe0x'^lcm;!-Ŧ6aS ůj+Cms'ݥ9`7$e;z CNa2j9N&O)~L#ekTdҘcQê1LحIJb ĚKҘ22v"Z{1Dژ1 S(UFm\QSF`b :ՎŴ 4jõ! OȂ966aje.m[ߊZKmr=W'E#ڦ mx?)Qۢv.ɚtOW 4TEaցIL&QFM?1 ŘvRz(XA2oi+uH*Xb1>~rA~'y2v =x?Dq4u=Y1 Ô%_J͡􀯌2ٻcYRqH,8@c,)uYba:&1>,F'WC>L6k[M$ )WDЦFBLS 3A'ҙ0zziɃph(ذܓ&OhDa'̉Ld0mo91O#şgx 5!<py,a<hz x;SLjxf!U2aP@<'8NɆ ^{LkG<$;y#O#dU&XL=\"m&ca z?} epӡ1vT~֦L0m-^C>LFMjZL`m€F!{*S&lhҙ#MvG7l߇0Ȱ)p92a6ZhO O# N+8oΙ0==~0ٛ<410) C^ BFN.K|I|$'KT) S\hP_rϝ2aɕLVn1*fl,}&aoԦbܷ61Ms&~uL,?J-"QN:`"o>T2%%LEv\L㧥1 Jriq9ji6N#·ҦpJ`dkҘ2ȍǁz$06UE8D(0`?Ԝi\|3xL,nM0X0~"L223i(KL%mLqn2 tw ` ϗ|3v`Bd=0td=>:;dcGx@Т#dCwPh(1Ѓ"!wT:}gEs-:}:C:S{~t}_DCEg3AΟx|΀:פ==ttǴg=@:M@71o e?}6̃Sm̵h/1lQcGFӭIdaen`Vߡ2aS[q|_$Hr$~2a[;?\(߱Xy' 1G_Jy)žGQ -?0O#פWʞ,?s4[OY❛t G}*y/>"]kiOiʞFY6OGi(V_m{E ?t~bpCC؟,'v&pߕTyCIOΘ{GO*xOG|TV$|T񍄐5O*xL6LF_ԞuԞt-߼k:Np8'eڭ52LG|xF6صһ]KE,8hoΙ0u">GLlɘxTṞ3JdGIߝ2aE:e03aW&9pҙ0שkS&=Ɇ|dȸuT d~%2a&S k5>eral){~ratG2~dɃoҙ0R{S+p*0Ψ}L5Eɀ='S&uY5s~Tx; =0qHLV™#"XFL ̓J#V3q14ihfԴлO0d' }raݛ~m!<;5Ax>f;"A)d[D-ɟJ+W`?҂2ƜC@Lox?O`v&?&L4lnp oa+׍/yp"S+4壹0[~JL$ L]@1AójÞ? W&ggЦL560 V?Bd?TɆz *0t0IEeptY‰gr0tY&;B0t>tG2`G2`3|N>L6{CL:L ghW+hS&ܮSMɓM2a;BdojeptYɃЮS tڙ0tڙ0IM tڙ0hghLgC;Bd2a;Bd=6vɃɃL3ghL:l IL:12a}L:q2`&}2`rd:& tܙ0hghL:l ) ghL42`;BdFw&Loj4 Y:[& h2`;BdvɃH H:dv2a|& &L12ai8dsavi1.6.0/oogl/earth_coverage.oogl0000644000175000017500000000043514423445060016237 0ustar lloydlloyd# $Id: earth_coverage.oogl 8 2019-01-24 04:33:00Z lloydwood $ appearance { texturing shading smooth texture { image {: coverage } transform { 1 0 0 0 0 1 0 0 0 0 1 0 .5 0 0 1 } } } STSPHERE RECTANGULAR 1 0 0 0 savi1.6.0/oogl/earth_coverage_unp.oogl0000644000175000017500000000044114423445060017116 0ustar lloydlloyd# $Id: earth_coverage_unp.oogl 8 2019-01-24 04:33:00Z lloydwood $ appearance { texturing shading smooth texture { image {: coverage } transform { 1 0 0 0 0 1 0 0 0 0 1 0 .5 0 0 1 } } } STSPHERE CYLINDRICAL 1 0 0 0 savi1.6.0/oogl/earth.oogl0000644000175000017500000000044514423445060014365 0ustar lloydlloyd# $Id: earth.oogl 8 2019-01-24 04:33:00Z lloydwood $ appearance { material { diffuse 0.839 1.000 0.461 } # *-evert # +backcull +texturing shading smooth texture { file "Earth.ppm.Z" transform { 1 0 0 0 0 1 0 0 0 0 1 0 .5 0 0 1 } } } STSPHERE RECTANGULAR 1 0 0 0 savi1.6.0/oogl/earth_fancy.oogl0000644000175000017500000000070214423445060015541 0ustar lloydlloyd# $Id: earth_fancy.oogl 8 2019-01-24 04:33:00Z lloydwood $ appearance { material { diffuse 1.0 1.0 1.0 } # *-evert # +backcull +texturing shading smooth texture { # Detailed Earth map from NASA's Blue Marble project. # http://visibleearth.nasa.gov/ # free for educational use. file "blue_marble_land_shallow_topo_2048.jpeg" transform { 1 0 0 0 0 1 0 0 0 0 1 0 .5 0 0 1 } } } STSPHERE CYLINDRICAL 1 0 0 0 savi1.6.0/oogl/ambient_light.oogl0000644000175000017500000000107014423445060016063 0ustar lloydlloyd# # ambient_light.oogl # # restores default lighting model in Geomview # (progn (merge-baseap appearance { lighting { ambient 0.2 0.2 0.2 replacelights light { ambient 0.000000 0.000000 0.000000 color 0.750000 0.750000 0.750000 position 0.000000 0.000000 10.000000 0.000000 } light { ambient 0.000000 0.000000 0.000000 color 0.600000 0.600000 0.600000 position 0.000000 1.000000 -1.000000 0.000000 } light { ambient 0.000000 0.000000 0.000000 color 0.400000 0.400000 0.400000 position 1.000000 -2.000000 -1.000000 0.000000 } } } ) ) savi1.6.0/oogl/savilogo.oogl0000644000175000017500000001247514423445060015113 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2011 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # savilogo.oogl # # for plotting logo onscreen in corner of Geomview window. # # $Id: savilogo.oogl 8 2019-01-24 04:33:00Z lloydwood $ (progn (read geometry {define logo_h { INST location screen transform 35 0 0 0 0 35 0 0 0 0 35 0 40 25 -.99 1 geom { LIST # World list { # OOGL INST transform { 2.3584001 0 0 0 0 2.3584001 0 0 0 0 2.3584001 0 0 0.014800021 0 1 } geom { # hvectext -hershey /usr/local/lib/ghostscript/fonts/hrpl_ti.gsf SaVi VECT 26 138 3 18 4 19 8 3 4 17 5 7 4 2 2 2 2 2 2 2 2 2 2 5 2 2 8 4 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 -0.214835 0.0898349 0 -0.203528 0.0898349 0 -0.192221 0.112449 0 -0.203528 0.0446065 0 -0.203528 0.0672207 0 -0.214835 0.0898349 0 -0.226142 0.101142 0 -0.260063 0.112449 0 -0.305292 0.112449 0 -0.339213 0.101142 0 -0.361827 0.0785278 0 -0.361827 0.0446065 0 -0.35052 0.0219923 0 -0.327906 -0.00062189 0 -0.260063 -0.0345432 0 -0.248756 -0.0571574 0 -0.248756 -0.0910787 0 -0.260063 -0.113693 0 -0.35052 0.0446065 0 -0.339213 0.0219923 0 -0.260063 -0.0232361 0 -0.248756 -0.0458503 0 -0.339213 0.101142 0 -0.35052 0.0785278 0 -0.35052 0.0559136 0 -0.339213 0.0332994 0 -0.27137 -0.00062189 0 -0.248756 -0.0232361 0 -0.237449 -0.0458503 0 -0.237449 -0.0797716 0 -0.248756 -0.102386 0 -0.260063 -0.113693 0 -0.293985 -0.125 0 -0.339213 -0.125 0 -0.373134 -0.113693 0 -0.384441 -0.102386 0 -0.395748 -0.0797716 0 -0.395748 -0.0571574 0 -0.407056 -0.125 0 -0.395748 -0.102386 0 -0.384441 -0.102386 0 -0.0113071 0.0332994 0 -0.0339213 -0.0458503 0 -0.0339213 -0.0910787 0 -0.0226142 -0.113693 0 -0.0113071 -0.125 0 0.0113071 -0.125 0 0.0339213 -0.102386 0 0.0452284 -0.0797716 0 -2.77556e-17 0.0332994 0 -0.0226142 -0.0458503 0 -0.0226142 -0.113693 0 -0.0113071 0.0332994 0 0.0113071 0.0332994 0 -0.0113071 -0.0458503 0 -0.0226142 -0.0910787 0 -0.0339213 -0.0458503 0 -0.0339213 -0.011929 0 -0.0452284 0.0219923 0 -0.0678426 0.0332994 0 -0.0904568 0.0332994 0 -0.124378 0.0219923 0 -0.146992 -0.011929 0 -0.158299 -0.0458503 0 -0.158299 -0.0684645 0 -0.146992 -0.102386 0 -0.135685 -0.113693 0 -0.113071 -0.125 0 -0.0904568 -0.125 0 -0.0678426 -0.113693 0 -0.0565355 -0.102386 0 -0.0452284 -0.0797716 0 -0.0339213 -0.0458503 0 -0.113071 0.0219923 0 -0.135685 -0.011929 0 -0.146992 -0.0458503 0 -0.146992 -0.0797716 0 -0.135685 -0.102386 0 -0.0904568 0.0332994 0 -0.113071 0.0106852 0 -0.124378 -0.011929 0 -0.135685 -0.0458503 0 -0.135685 -0.0797716 0 -0.124378 -0.113693 0 -0.113071 -0.125 0 0.113071 0.112449 0 0.113071 0.0898349 0 0.124378 -0.102386 0 0.124378 -0.125 0 0.124378 0.101142 0 0.135685 -0.0910787 0 0.135685 0.112449 0 0.146992 -0.0797716 0 0.260063 0.101142 0 0.124378 -0.125 0 0.0904568 0.112449 0 0.169607 0.112449 0 0.226142 0.112449 0 0.293985 0.112449 0 0.101764 0.112449 0 0.113071 0.0898349 0 0.146992 0.112449 0 0.135685 0.0898349 0 0.158299 0.112449 0 0.124378 0.101142 0 0.237449 0.112449 0 0.260063 0.101142 0 0.282678 0.112449 0 0.260063 0.101142 0 0.361827 0.112449 0 0.361827 0.0898349 0 0.384441 0.0898349 0 0.384441 0.112449 0 0.361827 0.112449 0 0.373134 0.112449 0 0.373134 0.0898349 0 0.361827 0.101142 0 0.384441 0.101142 0 0.282678 -0.011929 0 0.293985 0.0106852 0 0.316599 0.0332994 0 0.339213 0.0332994 0 0.35052 0.0219923 0 0.361827 -0.00062189 0 0.361827 -0.0345432 0 0.339213 -0.0910787 0 0.35052 0.0219923 0 0.35052 -0.0232361 0 0.339213 -0.0684645 0 0.339213 -0.113693 0 0.35052 -0.00062189 0 0.327906 -0.0571574 0 0.327906 -0.0910787 0 0.339213 -0.113693 0 0.35052 -0.125 0 0.373134 -0.125 0 0.395748 -0.102386 0 0.407056 -0.0797716 0 0.3 0.3 1 1 0.3 1 0.3 1 0.3 0.3 1 1 } } # end (geom and INST) OOGL { # SaVi arc, from Bob's showcase drawing. INST transform { 0.015118737 0 0 0 -3.2713245e-08 0.015118686 0 0 0 0 0.015118686 0 0.089017533 -0.27418625 0 1 } geom {appearance { material { edgecolor 1.000000 0.176471 0.176471 } } geom VECT 1 34 0 34 0 -65 -7.12 0 -63.878 -9.641 0 -62.15 -11.916 0 -59.856 -13.949 0 -57.038 -15.745 0 -53.734 -17.309 0 -49.987 -18.647 0 -45.836 -19.762 0 -41.321 -20.661 0 -36.484 -21.348 0 -31.365 -21.828 0 -26.004 -22.106 0 -20.442 -22.188 0 -14.719 -22.078 0 -8.875 -21.781 0 -2.952 -21.303 0 0 -21 0 0 -21 0 9.178 -19.794 0 18.267 -18.206 0 27.125 -16.256 0 35.607 -13.966 0 43.571 -11.358 0 50.872 -8.452 0 57.367 -5.271 0 62.913 -1.835 0 67.366 1.833 0 70.583 5.712 0 72.42 9.781 0 72.734 14.018 0 71.381 18.403 0 68.219 22.912 0 63.102 27.526 0 55.889 32.222 0 } } # end (geom and INST) t } #end of World List } } ) ) savi1.6.0/oogl/earth_h.oogl0000644000175000017500000000113714423445060014673 0ustar lloydlloyd# SaVi by Robert Thurman (thurman@geom.umn.edu) and # Patrick Worfolk (worfolk@alum.mit.edu). # # Copyright (c) 1997 by The Geometry Center. # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # $Id: earth_h.oogl 8 2019-01-24 04:33:00Z lloydwood $ # loaded ready for Earth texturemaps. (read geometry { define earth_h < "$SAVI/oogl/earth.oogl" }) savi1.6.0/oogl/savi.oogl0000644000175000017500000001625514423445060014232 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # savi.oogl # # General description - axes, planes, coverage, satellites. # Loads in always-available vector Earth description. # # $Id: savi.oogl 8 2019-01-24 04:33:00Z lloydwood $ (progn (normalization allgeoms none) (bbox-draw allgeoms no) # undocumented command in geomview/src/bin/geomview/common/ui.c # makes mouse rotate camera view in individual window, # not all universe with cameras fixed. (event-mode '[o] Cam Orbit') (merge-baseap appearance { shading smooth }) (camera "Camera" camera { fov 45 focus 6 } ) (xform-set "worldgeom" transform { -0.65249914 -0.38307628 0.65383321 0 0.75735289 -0.35893893 0.54550701 0 0.025715861 0.851125 0.52433109 0 0 0 0 0.8 } ) (xform-set Camera transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 6 1 } ) (backcolor Camera 0 0 0) (read geometry { define unit_sphere_h { appearance {shading smooth material {diffuse 0.2 0.4 1} } SPHERE 1.0 0.0 0.0 0.0 } } ) (read transform { transform define central_t { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } } ) (read geometry {define axes_h { appearance {linewidth 3} VECT 3 6 3 2 2 2 1 1 1 0.0 0.0 0.0 1.5 0.0 0.0 0.0 0.0 0.0 0.0 1.5 0.0 0.0 0.0 0.0 0.0 0.0 1.5 1.0 0.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 0.0 1.0 1.0 } } ) (read geometry {define plane_h { appearance {+transparent material {alpha 0.5} } OFF 4 1 4 2.0 2.0 0 2.0 -2.0 0 -2.0 -2.0 0 -2.0 2.0 0 4 0 1 2 3 0.6 0.6 0.6 } } ) (read geometry {define footprint_h { VECT 1 21 1 21 1 0 1 -1 0.309017 0.951057 -1 0.587785 0.809017 -1 0.809017 0.587786 -1 0.951056 0.309018 -1 1.0 1.32679e-06 -1 0.951057 -0.309015 -1 0.809018 -0.587784 -1 0.587787 -0.809016 -1 0.309019 -0.951056 -1 2.65359e-06 -1.0 -1 -0.309014 -0.951057 -1 -0.587783 -0.809019 -1 -0.809015 -0.587788 -1 -0.951055 -0.309021 -1 -1.0 -3.98038e-06 -1 -0.951058 0.309013 -1 -0.80902 0.587782 -1 -0.587789 0.809014 -1 -0.309022 0.951055 -1 0 1 -1 1 1 1 1 } } ) (read geometry {define terminator_h { VECT 1 21 1 21 1 0 1 -1 0.309017 0.951057 -1 0.587785 0.809017 -1 0.809017 0.587786 -1 0.951056 0.309018 -1 1.0 1.32679e-06 -1 0.951057 -0.309015 -1 0.809018 -0.587784 -1 0.587787 -0.809016 -1 0.309019 -0.951056 -1 2.65359e-06 -1.0 -1 -0.309014 -0.951057 -1 -0.587783 -0.809019 -1 -0.809015 -0.587788 -1 -0.951055 -0.309021 -1 -1.0 -3.98038e-06 -1 -0.951058 0.309013 -1 -0.80902 0.587782 -1 -0.587789 0.809014 -1 -0.309022 0.951055 -1 0 1 -1 1 1 0 1 } } ) (read geometry {define cone_h { appearance {+transparent material {alpha 0.6}} OFF 21 20 40 0 0 0 0.0 1.0 -1 0.309017 0.951057 -1 0.587785 0.809017 -1 0.809017 0.587786 -1 0.951056 0.309018 -1 1.0 1.32679e-06 -1 0.951057 -0.309015 -1 0.809018 -0.587784 -1 0.587787 -0.809016 -1 0.309019 -0.951056 -1 2.65359e-06 -1.0 -1 -0.309014 -0.951057 -1 -0.587783 -0.809019 -1 -0.809015 -0.587788 -1 -0.951055 -0.309021 -1 -1.0 -3.98038e-06 -1 -0.951058 0.309013 -1 -0.80902 0.587782 -1 -0.587789 0.809014 -1 -0.309022 0.951055 -1 3 0 1 2 1 1 1 3 0 2 3 1 1 1 3 0 3 4 1 1 1 3 0 4 5 1 1 1 3 0 5 6 1 1 1 3 0 6 7 1 1 1 3 0 7 8 1 1 1 3 0 8 9 1 1 1 3 0 9 10 1 1 1 3 0 10 11 1 1 1 3 0 11 12 1 1 1 3 0 12 13 1 1 1 3 0 13 14 1 1 1 3 0 14 15 1 1 1 3 0 15 16 1 1 1 3 0 16 17 1 1 1 3 0 17 18 1 1 1 3 0 18 19 1 1 1 3 0 19 20 1 1 1 3 0 20 1 1 1 1 } } ) (read geometry {define box_satellite_h { OFF 8 6 8 0.025 0.025 0.025 0.025 -0.025 0.025 -0.025 -0.025 0.025 -0.025 0.025 0.025 0.025 0.025 -0.025 0.025 -0.025 -0.025 -0.025 -0.025 -0.025 -0.025 0.025 -0.025 4 3 2 1 0 0.0 1.0 0.0 1.0 4 4 5 6 7 0.0 1.0 0.0 1.0 4 0 1 5 4 0.0 1.0 0.0 1.0 4 1 2 6 5 0.0 1.0 0.0 1.0 4 2 3 7 6 0.0 1.0 0.0 1.0 4 3 0 4 7 0.0 1.0 0.0 1.0 } } ) (read geometry {define planes_satellite_h { OFF 12 3 12 0.025 0.025 0 0.025 -0.025 0 -0.025 -0.025 0 -0.025 0.025 0 0.025 0 0.025 0.025 0 -0.025 -0.025 0 -0.025 -0.025 0 0.025 0 0.025 0.025 0 0.025 -0.025 0 -0.025 -0.025 0 -0.025 0.025 4 0 1 2 3 0.0 1.0 0.0 1.0 4 4 5 6 7 0.0 1.0 0.0 1.0 4 8 9 10 11 0.0 1.0 0.0 1.0 } } ) (read geometry {define sphere_satellite_h { appearance {shading smooth material {diffuse 0.4 1 0.2} } SPHERE 0.03 0.0 0.0 0.0 } } ) (read geometry {define fancy_satellite_h { INST transform { 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0.6 } geom { LIST { # solar panels OFF 8 2 8 0 0.06 0.01 0 0.06 -0.01 0 0.02 -0.01 0 0.02 0.01 0 -0.06 0.01 0 -0.06 -0.01 0 -0.02 -0.01 0 -0.02 0.01 4 0 1 2 3 0.7 0.7 0.7 4 4 5 6 7 0.7 0.7 0.7 } { # strut connecting solar panels VECT 1 2 1 2 1 0 0.02 0 0 -0.02 0 0.7 0.7 0.7 1.0 } { # hexagonal body OFF 12 8 18 0.015 -0.00866 0.005 0.015 0.00866 0.005 0 0.0173 0.005 -0.015 0.00866 0.005 -0.015 -0.00866 0.005 0 -0.0173 0.005 0.015 -0.00866 -0.005 0.015 0.00866 -0.005 0 0.0173 -0.005 -0.015 0.00866 -0.005 -0.015 -0.00866 -0.005 0 -0.0173 -0.005 6 0 1 2 3 4 5 0 1 0 6 6 7 8 9 10 11 0 1 0 4 0 1 7 6 0 1 0 4 1 2 8 7 0 1 0 4 2 3 9 8 0 1 0 4 3 4 10 9 0 1 0 4 4 5 11 10 0 1 0 4 5 0 6 11 0 1 0 } } } } ) (read geometry { define sphere_marker_h { appearance {+transparent shading smooth material {diffuse 0.8 0.8 0.2 alpha 0.6} } SPHERE 0.08 0.0 0.0 0.0 } } ) (read geometry { define box_marker_h { appearance {+transparent material {alpha 0.6} } OFF 8 6 8 0.05 0.05 0.05 0.05 -0.05 0.05 -0.05 -0.05 0.05 -0.05 0.05 0.05 0.05 0.05 -0.05 0.05 -0.05 -0.05 -0.05 -0.05 -0.05 -0.05 0.05 -0.05 4 3 2 1 0 0.6 0.6 0.0 4 4 5 6 7 0.6 0.6 0.0 4 0 1 5 4 0.6 0.6 0.0 4 1 2 6 5 0.6 0.6 0.0 4 2 3 7 6 0.6 0.6 0.0 4 3 0 4 7 0.6 0.6 0.0 } } ) (read geometry {define box_special_satellite_h { LIST {: box_satellite_h} {: box_marker_h} } } ) (read geometry {define planes_special_satellite_h { LIST {: planes_satellite_h} {: sphere_marker_h} } } ) (read geometry {define sphere_special_satellite_h { LIST {: sphere_satellite_h} {: sphere_marker_h} } } ) (read geometry {define fancy_special_satellite_h { LIST {: fancy_satellite_h} {: box_marker_h} } } ) ) savi1.6.0/oogl/earth.vect0000644000175000017500000110410714423445060014367 0ustar lloydlloyd# This is a model of the Earth on a unit sphere in outline form, with # +Z=north, +X=(lat 0, lon 0), +Y=(lat 0, lon 90 E). # It includes land/water boundaries, national political boundaries, # and US state & Canadian provincial boundaries. # The data are from the public-domain CIA World Map II database, # which is at least a few years old, which explains why a number of the # political boundaries aren't current as of 1996. I believe those data # are available by FTP from hanauma.stanford.edu. # -- Stuart Levy, Geometry Center, University of Minnesota slevy@geom.umn.edu VECT 5340 12420 0 5 3 3 3 4 8 3 4 2 3 3 3 3 2 3 2 2 2 2 2 2 3 2 2 2 2 3 2 2 4 4 2 2 3 3 3 2 3 2 2 2 2 3 3 2 2 2 2 2 3 2 2 2 2 2 2 3 2 2 2 3 3 2 3 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 3 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 2 3 2 2 2 3 2 3 2 2 3 2 2 4 2 2 3 3 3 2 2 2 2 2 2 2 3 2 3 2 2 2 4 2 3 3 2 2 2 2 3 2 2 2 2 2 2 3 3 2 2 3 3 2 3 3 2 3 2 2 2 2 2 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 2 3 3 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 2 3 2 2 3 2 2 3 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 3 3 2 2 2 2 2 2 2 3 2 2 4 2 2 2 3 2 2 3 2 2 2 3 2 2 2 3 2 2 3 3 2 2 2 2 2 2 2 2 3 2 2 3 3 2 2 2 2 2 4 2 2 3 2 2 2 2 2 2 2 5 3 2 2 4 5 2 3 2 4 3 2 2 2 2 3 3 3 3 2 2 2 3 3 2 2 3 3 2 2 2 3 2 3 2 2 2 2 2 2 3 2 2 2 3 3 2 3 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 3 2 2 3 2 2 3 2 2 2 2 2 4 5 2 3 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 2 9 10 2 4 7 4 3 5 6 2 3 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 4 2 2 2 2 3 2 2 2 2 3 2 2 2 2 2 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 3 2 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 5 4 2 3 2 2 2 3 3 2 2 2 2 2 2 3 4 2 3 4 3 2 2 2 2 3 3 3 3 3 3 2 2 2 2 4 5 3 3 2 2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 5 5 2 2 2 2 2 2 2 13 2 4 2 3 3 3 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 3 2 2 2 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 2 2 4 2 3 2 2 2 2 2 4 4 2 3 3 2 2 4 4 4 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 2 2 2 2 4 2 4 3 2 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 4 2 2 2 2 2 2 2 3 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 8 3 3 4 2 2 5 4 3 3 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 13 4 6 3 3 2 3 2 2 2 4 3 4 2 2 3 2 2 2 2 2 4 2 2 3 2 2 3 3 3 4 2 3 2 2 2 3 2 2 3 2 2 2 2 2 3 2 2 3 2 3 3 2 2 3 3 3 2 3 2 2 3 2 2 2 2 2 2 2 3 2 2 2 2 3 2 3 2 2 2 2 3 3 2 3 2 2 3 3 2 2 4 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2 2 2 2 2 2 3 4 2 3 3 3 2 2 2 3 2 2 3 4 2 2 4 7 3 4 5 3 2 3 3 2 2 2 2 2 2 7 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 3 2 2 4 5 2 3 2 4 2 2 4 2 2 2 2 2 2 2 2 2 3 2 3 3 4 2 4 4 4 4 3 3 3 2 3 4 4 3 2 4 3 3 3 4 2 2 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 4 2 2 2 2 2 2 3 3 3 4 2 2 2 3 3 3 2 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 2 2 5 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 5 4 4 3 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 5 11 2 3 2 4 2 2 2 3 4 4 3 2 2 2 2 2 2 3 2 4 3 2 2 2 2 3 4 4 2 2 2 3 3 2 3 2 3 3 3 3 3 2 2 4 2 3 2 2 2 2 3 3 3 2 2 2 2 3 2 2 3 3 2 4 3 3 2 2 3 6 3 11 7 9 5 7 6 4 11 10 11 14 8 5 6 7 6 5 5 7 6 5 4 4 5 5 3 2 4 2 2 2 3 3 2 2 2 4 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2 4 12 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 8 2 4 4 4 2 2 2 6 6 5 2 2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 4 5 4 6 6 2 4 4 4 4 3 2 2 2 2 2 2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 7 2 4 2 2 2 6 2 2 6 2 2 2 2 2 2 2 6 2 2 2 4 4 5 4 2 2 3 3 2 2 2 2 2 2 4 2 2 2 3 3 3 3 3 3 3 2 4 3 4 2 3 3 4 4 3 3 4 3 4 2 3 3 3 3 3 4 3 3 3 3 3 2 3 2 4 2 2 4 3 4 4 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 4 3 2 2 2 2 2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 4 3 3 3 3 3 2 2 5 4 3 4 2 2 2 2 2 2 2 2 2 2 2 2 3 4 2 2 2 2 2 2 2 2 2 7 2 2 2 2 2 2 2 2 2 2 2 2 6 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 5 3 2 2 2 2 4 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 2 2 4 2 4 3 3 3 4 3 3 2 2 3 2 2 2 2 2 2 3 3 3 2 3 3 3 3 2 4 3 3 5 3 3 5 4 4 4 5 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 4 4 6 5 5 6 2 6 9 5 6 8 4 7 9 5 11 8 9 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 4 4 3 3 3 3 3 5 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 6 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 2 3 3 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 3 3 2 2 2 2 3 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 3 3 4 2 2 2 2 2 2 2 3 5 5 4 3 3 3 3 4 5 3 4 5 5 5 3 6 6 4 5 6 3 3 2 3 3 3 4 3 4 4 3 3 2 4 3 3 3 3 3 2 4 3 5 5 4 4 3 4 4 4 3 3 3 3 3 3 2 4 4 3 3 3 3 3 3 5 3 3 3 2 2 2 2 2 2 3 3 3 2 3 3 3 2 2 3 3 3 2 3 3 2 3 3 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 4 4 3 4 4 5 6 3 5 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 4 2 2 2 2 2 2 2 2 2 2 2 3 3 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 3 3 4 5 4 2 2 2 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 2 3 2 3 3 3 3 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 5 6 5 4 5 5 9 15 16 10 6 6 6 4 3 5 3 5 4 5 3 4 6 4 3 4 3 4 3 4 8 7 6 5 11 9 7 5 7 7 10 10 9 4 2 4 2 3 2 2 2 4 2 4 2 4 2 2 2 2 4 2 2 2 2 2 2 2 2 2 6 2 4 2 4 2 4 3 4 2 2 2 2 2 6 2 2 2 2 2 2 2 2 3 3 2 3 3 3 2 3 6 6 2 2 2 2 2 2 2 2 2 2 4 3 3 3 3 3 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 5 4 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 5 2 2 2 2 2 2 6 6 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 3 3 2 3 2 4 4 4 2 4 3 2 2 3 3 2 3 5 5 4 4 2 7 4 6 3 3 3 4 4 3 3 4 3 2 2 2 4 3 3 2 3 4 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 3 6 3 7 4 22 2 8 7 8 2 2 4 3 8 11 11 13 9 7 2 4 4 8 10 8 8 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 2 2 2 3 2 2 8 2 2 2 2 2 3 4 10 4 2 2 2 2 2 4 2 2 2 2 4 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7706 0.3618 0.5247 0.7915 0.3691 0.4871 0.8099 0.3777 0.4488 0.8268 0.3855 0.4095 0.8403 0.3919 0.3746 0.8403 0.3919 0.3746 0.8224 0.4281 0.3746 0.8109 0.4496 0.3746 0.8109 0.4495 0.3746 0.7895 0.4836 0.3780 0.7760 0.5075 0.3746 0.7760 0.5074 0.3746 0.7532 0.5407 0.3745 0.7416 0.5565 0.3746 0.8611 0.3834 0.3338 0.8687 0.3475 0.3530 0.8748 0.3111 0.3713 0.8762 0.3016 0.3759 0.8762 0.3017 0.3760 0.8805 0.2649 0.3932 0.8942 0.2281 0.3851 0.8968 0.1903 0.3993 0.8916 0.1579 0.4244 0.8730 0.1520 0.4634 0.8540 0.1409 0.5008 0.8521 0.1431 0.5035 0.8521 0.1431 0.5035 0.8305 0.1621 0.5330 0.8201 0.1673 0.5472 0.8520 0.1432 0.5035 0.8345 0.1239 0.5369 0.8109 0.1181 0.5731 0.7902 0.1199 0.6010 0.9283 0.0000 0.3718 0.9328 0.0190 0.3600 0.9659 0.0038 0.2588 0.9633 0.0454 0.2647 0.9625 0.0593 0.2649 0.9625 0.0593 0.2648 0.9499 0.0706 0.3046 0.9421 0.0699 0.3280 0.9421 0.0699 0.3280 0.9376 0.0328 0.3460 0.9327 0.0190 0.3600 0.9421 0.0699 0.3280 0.9331 0.1071 0.3434 0.9266 0.1212 0.3560 0.9659 0.0000 0.2588 0.9659 0.0038 0.2588 0.9659 0.0039 0.2589 0.9749 0.0234 0.2215 0.9777 0.0409 0.2061 0.9785 0.0395 0.2024 0.9755 0.0484 0.2147 0.9785 0.0396 0.2024 0.9796 0.0325 0.1981 0.9796 0.0325 0.1982 0.9815 0.0166 0.1907 0.9815 0.0166 0.1907 0.9813 0.0000 0.1927 0.9941 0.0209 0.1063 0.9933 0.0119 0.1148 0.9929 0.0092 0.1189 0.9933 0.0119 0.1147 0.9929 0.0092 0.1189 0.9867 0.0093 0.1620 0.9865 0.0040 0.1639 0.9839 0.0065 0.1783 0.9865 0.0039 0.1639 0.9839 0.0066 0.1783 0.9829 0.0000 0.1841 0.9819 0.0000 0.1895 0.9819 0.0000 0.1895 0.9818 0.0000 0.1902 0.9813 0.0000 0.1925 0.9815 0.0157 0.1907 0.9883 0.0280 0.1498 0.9922 0.0268 0.1218 0.9922 0.0268 0.1218 0.9935 0.0312 0.1094 0.9935 0.0313 0.1094 0.9937 0.0284 0.1083 0.9267 0.1211 0.3559 0.9134 0.1542 0.3767 0.8987 0.1867 0.3968 0.8969 0.1904 0.3991 0.8891 0.2382 0.3907 0.9008 0.2539 0.3522 0.9154 0.2550 0.3113 0.9198 0.2555 0.2979 0.9927 0.0471 0.1109 0.9894 0.0464 0.1374 0.9864 0.0480 0.1574 0.9894 0.0463 0.1373 0.9864 0.0480 0.1574 0.9783 0.0595 0.1985 0.9771 0.0608 0.2038 0.9773 0.0616 0.2027 0.9676 0.0852 0.2375 0.9662 0.0938 0.2401 0.9662 0.0938 0.2401 0.9636 0.1350 0.2306 0.9636 0.1429 0.2261 0.9755 0.0485 0.2146 0.9771 0.0608 0.2038 0.9636 0.1429 0.2261 0.9553 0.1842 0.2313 0.9522 0.2050 0.2267 0.9522 0.2049 0.2267 0.9455 0.2239 0.2365 0.9455 0.2239 0.2365 0.9441 0.2289 0.2371 0.9441 0.2289 0.2371 0.9467 0.2393 0.2155 0.9457 0.2476 0.2105 0.9467 0.2393 0.2155 0.9457 0.2476 0.2105 0.9583 0.2259 0.1751 0.9620 0.2194 0.1626 0.9620 0.2194 0.1626 0.9713 0.2035 0.1232 0.9747 0.1898 0.1180 0.9747 0.1898 0.1180 0.9753 0.1825 0.1242 0.9753 0.1825 0.1242 0.9824 0.1557 0.1030 0.9824 0.1557 0.1030 0.9830 0.1532 0.1014 0.9830 0.1532 0.1014 0.9841 0.1528 0.0904 0.9841 0.1528 0.0904 0.9853 0.1489 0.0839 0.9053 0.3799 0.1900 0.9222 0.3503 0.1636 0.9350 0.3198 0.1536 0.9346 0.3229 0.1491 0.9350 0.3198 0.1536 0.9346 0.3229 0.1491 0.9434 0.3012 0.1389 0.9489 0.2868 0.1313 0.9434 0.3012 0.1389 0.9489 0.2868 0.1313 0.9495 0.2824 0.1370 0.9507 0.2799 0.1336 0.9495 0.2824 0.1370 0.9507 0.2799 0.1336 0.9544 0.2661 0.1350 0.9544 0.2661 0.1350 0.9566 0.2381 0.1681 0.9482 0.2662 0.1735 0.9482 0.2662 0.1735 0.9443 0.2538 0.2093 0.9443 0.2538 0.2093 0.9437 0.2451 0.2221 0.9438 0.2450 0.2220 0.9448 0.2369 0.2263 0.8840 0.4593 0.0875 0.9032 0.4204 0.0869 0.9194 0.3851 0.0806 0.9194 0.3851 0.0806 0.9350 0.3446 0.0838 0.9403 0.3290 0.0876 0.9403 0.3290 0.0876 0.9459 0.3188 0.0607 0.9459 0.3188 0.0607 0.9587 0.2810 0.0435 0.9595 0.2789 0.0388 0.9553 0.2650 0.1310 0.9631 0.2476 0.1053 0.9631 0.2476 0.1053 0.9627 0.2501 0.1030 0.9627 0.2501 0.1030 0.9639 0.2498 0.0923 0.9639 0.2498 0.0923 0.9635 0.2526 0.0891 0.9635 0.2525 0.0891 0.9629 0.2602 0.0717 0.9629 0.2602 0.0717 0.9627 0.2614 0.0706 0.9627 0.2614 0.0706 0.9601 0.2742 0.0542 0.9601 0.2742 0.0542 0.9596 0.2773 0.0472 0.9596 0.2773 0.0472 0.9595 0.2789 0.0388 0.8960 0.4228 0.1359 0.8871 0.4499 0.1031 0.8840 0.4593 0.0875 0.9595 0.2789 0.0388 0.9605 0.2767 0.0289 0.9671 0.2513 0.0384 0.9605 0.2767 0.0289 0.9671 0.2513 0.0385 0.9725 0.2298 0.0378 0.9752 0.2176 0.0397 0.9725 0.2298 0.0378 0.9752 0.2176 0.0397 0.9761 0.2135 0.0404 0.9761 0.2135 0.0405 0.9796 0.1970 0.0402 0.9796 0.1969 0.0402 0.9798 0.1965 0.0379 0.9798 0.1965 0.0378 0.9840 0.1739 0.0378 0.9840 0.1739 0.0378 0.9846 0.1702 0.0409 0.9798 0.1965 0.0378 0.9852 0.1702 0.0175 0.9852 0.1702 0.0175 0.9860 0.1658 0.0170 0.9690 0.2458 0.0244 0.9683 0.2491 -0.0178 0.9725 0.2298 0.0378 0.9734 0.2281 0.0213 0.9690 0.2458 0.0238 0.9734 0.2281 0.0213 0.9683 0.2489 -0.0180 0.9756 0.2159 -0.0406 0.9789 0.1927 -0.0684 0.9459 0.3188 0.0607 0.9467 0.3175 0.0537 0.9467 0.3175 0.0536 0.9478 0.3153 0.0477 0.9478 0.3153 0.0477 0.9482 0.3144 0.0456 0.9482 0.3144 0.0456 0.9490 0.3124 0.0424 0.9490 0.3125 0.0423 0.9505 0.3096 0.0252 0.9505 0.3096 0.0252 0.9513 0.3082 0.0061 0.9513 0.3082 0.0061 0.9525 0.3046 -0.0055 0.9524 0.3047 -0.0055 0.9596 0.2785 -0.0397 0.9590 0.2784 -0.0534 0.9590 0.2784 -0.0534 0.9611 0.2668 -0.0714 0.9611 0.2668 -0.0714 0.9620 0.2627 -0.0751 0.9620 0.2627 -0.0751 0.9650 0.2481 -0.0852 0.9650 0.2481 -0.0852 0.9692 0.2311 -0.0851 0.9692 0.2311 -0.0851 0.9708 0.2258 -0.0808 0.9708 0.2258 -0.0808 0.9743 0.2076 -0.0874 0.8840 0.4593 0.0874 0.8648 0.4964 0.0758 0.8568 0.5121 0.0609 0.8568 0.5121 0.0609 0.8540 0.5188 0.0380 0.8540 0.5188 0.0380 0.8616 0.5071 0.0215 0.8663 0.4994 0.0145 0.8616 0.5071 0.0215 0.8663 0.4994 0.0145 0.8685 0.4956 -0.0012 0.8685 0.4956 -0.0012 0.8690 0.4947 -0.0083 0.8690 0.4947 -0.0083 0.8693 0.4938 -0.0242 0.8693 0.4938 -0.0242 0.8723 0.4881 -0.0295 0.8722 0.4882 -0.0295 0.8748 0.4826 -0.0432 0.8748 0.4826 -0.0432 0.8734 0.4846 -0.0478 0.8713 0.4873 -0.0582 0.8684 0.4898 -0.0776 0.8684 0.4898 -0.0776 0.8591 0.4977 -0.1194 0.8505 0.5064 -0.1425 0.8659 0.4780 -0.1475 0.8669 0.4711 -0.1629 0.8483 0.4859 -0.2106 0.8646 0.4719 -0.1729 0.8669 0.4711 -0.1629 0.8483 0.4859 -0.2106 0.8695 0.4493 -0.2053 0.8759 0.4360 -0.2065 0.8759 0.4360 -0.2065 0.8958 0.4015 -0.1906 0.8973 0.3992 -0.1886 0.8973 0.3992 -0.1886 0.9078 0.3713 -0.1951 0.9078 0.3713 -0.1951 0.9171 0.3684 -0.1526 0.9211 0.3681 -0.1267 0.8734 0.4846 -0.0479 0.8713 0.4872 -0.0581 0.9211 0.3681 -0.1267 0.9289 0.3481 -0.1268 0.9289 0.3481 -0.1268 0.9291 0.3498 -0.1204 0.9291 0.3498 -0.1204 0.9397 0.3124 -0.1394 0.9441 0.2983 -0.1405 0.9441 0.2983 -0.1405 0.9533 0.2838 -0.1028 0.9533 0.2838 -0.1028 0.9649 0.2420 -0.1022 0.9686 0.2268 -0.1020 0.9686 0.2268 -0.1020 0.9713 0.2132 -0.1054 0.8742 0.3797 -0.3028 0.8905 0.3598 -0.2785 0.8905 0.3598 -0.2786 0.9009 0.3640 -0.2364 0.9025 0.3646 -0.2293 0.9708 0.2258 -0.0808 0.9726 0.2149 -0.0887 0.9726 0.2149 -0.0888 0.9724 0.2103 -0.1007 0.8533 0.3106 -0.4189 0.8696 0.3165 -0.3789 0.8774 0.3367 -0.3418 0.8863 0.3401 -0.3143 0.8735 0.3761 -0.3090 0.8611 0.4064 -0.3057 0.8697 0.3916 -0.3003 0.8611 0.4064 -0.3057 0.8698 0.3916 -0.3004 0.8834 0.3531 -0.3081 0.8856 0.3466 -0.3093 0.9059 0.3007 -0.2982 0.8892 0.3372 -0.3093 0.8856 0.3465 -0.3093 0.9055 0.3014 -0.2988 0.9177 0.2617 -0.2988 0.9251 0.2342 -0.2988 0.9251 0.2349 -0.2983 0.9349 0.1948 -0.2966 0.8905 0.2294 -0.3929 0.8928 0.2340 -0.3849 0.8928 0.2339 -0.3849 0.8931 0.2314 -0.3857 0.7492 0.4845 -0.4516 0.7538 0.4771 -0.4518 0.7556 0.4745 -0.4515 0.7538 0.4771 -0.4518 0.7556 0.4746 -0.4515 0.7628 0.4760 -0.4377 0.7627 0.4760 -0.4377 0.7556 0.4745 -0.4515 0.7628 0.4760 -0.4377 0.7814 0.4802 -0.3987 0.7899 0.4803 -0.3814 0.8069 0.4542 -0.3777 0.7899 0.4802 -0.3813 0.8142 0.4042 -0.4168 0.8131 0.4343 -0.3877 0.8069 0.4542 -0.3777 0.8142 0.4042 -0.4168 0.8172 0.3963 -0.4186 0.8156 0.3948 -0.4231 0.8172 0.3962 -0.4185 0.8156 0.3948 -0.4231 0.8132 0.3894 -0.4325 0.8133 0.3894 -0.4324 0.8315 0.3549 -0.4274 0.8319 0.3221 -0.4519 0.8343 0.3151 -0.4524 0.8533 0.3106 -0.4189 0.8343 0.3151 -0.4524 0.8533 0.3106 -0.4189 0.8353 0.3040 -0.4581 0.8264 0.3008 -0.4760 0.8264 0.3007 -0.4760 0.8365 0.2640 -0.4801 0.8420 0.2492 -0.4784 0.7700 0.4216 -0.4789 0.7743 0.3947 -0.4946 0.7743 0.3948 -0.4946 0.7665 0.3970 -0.5048 0.7646 0.3991 -0.5061 0.7666 0.3970 -0.5048 0.7646 0.3992 -0.5061 0.7700 0.4216 -0.4789 0.8611 0.4064 -0.3057 0.8405 0.4220 -0.3399 0.8292 0.4356 -0.3504 0.8292 0.4356 -0.3503 0.8113 0.4512 -0.3718 0.8113 0.4512 -0.3718 0.8085 0.4529 -0.3757 0.8086 0.4529 -0.3756 0.8069 0.4541 -0.3777 0.8611 0.4063 -0.3057 0.8474 0.4322 -0.3084 0.8474 0.4322 -0.3084 0.8404 0.4613 -0.2846 0.8404 0.4613 -0.2846 0.8305 0.4875 -0.2695 0.8972 0.3992 -0.1886 0.8990 0.3758 -0.2250 0.9025 0.3646 -0.2293 0.7979 0.5558 -0.2334 0.7801 0.5634 -0.2720 0.7795 0.5619 -0.2767 0.7795 0.5619 -0.2767 0.7839 0.5517 -0.2849 0.7839 0.5517 -0.2849 0.7800 0.5521 -0.2946 0.7800 0.5521 -0.2946 0.7965 0.5485 -0.2545 0.8117 0.5316 -0.2421 0.8117 0.5316 -0.2421 0.8194 0.5373 -0.1996 0.8274 0.5370 -0.1647 0.7899 0.4802 -0.3813 0.7856 0.5003 -0.3640 0.7856 0.5003 -0.3640 0.7963 0.5113 -0.3232 0.7958 0.5168 -0.3157 0.8116 0.5316 -0.2421 0.8302 0.4957 -0.2549 0.8348 0.4861 -0.2585 0.8348 0.4861 -0.2585 0.8305 0.4875 -0.2695 0.8305 0.4875 -0.2695 0.8063 0.5178 -0.2860 0.8053 0.5184 -0.2877 0.8053 0.5184 -0.2877 0.8034 0.5214 -0.2875 0.8034 0.5214 -0.2875 0.8001 0.5205 -0.2981 0.7974 0.5173 -0.3107 0.8001 0.5204 -0.2983 0.7974 0.5173 -0.3107 0.7957 0.5168 -0.3158 0.8693 0.4938 -0.0242 0.8616 0.5072 -0.0185 0.8616 0.5072 -0.0185 0.8593 0.5112 -0.0174 0.8593 0.5112 -0.0174 0.8362 0.5482 -0.0175 0.8297 0.5580 -0.0175 0.8297 0.5580 -0.0175 0.8072 0.5890 -0.0380 0.8053 0.5915 -0.0397 0.8505 0.5064 -0.1425 0.8460 0.5118 -0.1494 0.8460 0.5118 -0.1494 0.8280 0.5365 -0.1634 0.8053 0.5915 -0.0398 0.7904 0.6103 -0.0532 0.7904 0.6103 -0.0532 0.7887 0.6114 -0.0637 0.7887 0.6114 -0.0637 0.7723 0.6300 -0.0814 0.8274 0.5370 -0.1647 0.8271 0.5377 -0.1635 0.8271 0.5377 -0.1635 0.8179 0.5502 -0.1685 0.8029 0.5614 -0.2005 0.8179 0.5502 -0.1685 0.8029 0.5613 -0.2006 0.7979 0.5558 -0.2334 0.8054 0.5552 -0.2075 0.8054 0.5552 -0.2075 0.8041 0.5568 -0.2081 0.8042 0.5568 -0.2081 0.8029 0.5613 -0.2006 0.7984 0.5678 -0.2006 0.7984 0.5678 -0.2006 0.7738 0.6024 -0.1960 0.7672 0.6101 -0.1979 0.7672 0.6101 -0.1979 0.7484 0.6378 -0.1819 0.8403 0.3919 0.3746 0.8600 0.3829 0.3373 0.8611 0.3834 0.3338 0.9441 0.2289 0.2371 0.9301 0.2427 0.2757 0.9221 0.2555 0.2907 0.9221 0.2555 0.2907 0.9198 0.2555 0.2979 0.8795 0.3916 0.2706 0.8680 0.3865 0.3118 0.8612 0.3834 0.3338 0.8795 0.3916 0.2706 0.8985 0.3670 0.2410 0.9052 0.3626 0.2216 0.9052 0.3626 0.2216 0.9053 0.3799 0.1900 0.9046 0.3817 0.1895 0.9029 0.4024 0.1513 0.8960 0.4228 0.1359 0.8734 0.4846 -0.0479 0.8687 0.4929 -0.0488 0.8687 0.4929 -0.0488 0.8654 0.4994 -0.0409 0.8654 0.4994 -0.0409 0.8622 0.5049 -0.0408 0.8602 0.5082 -0.0418 0.8584 0.5113 -0.0415 0.8584 0.5113 -0.0415 0.8577 0.5129 -0.0357 0.8577 0.5129 -0.0357 0.8602 0.5094 -0.0240 0.8602 0.5094 -0.0240 0.8616 0.5072 -0.0185 0.8622 0.5050 -0.0408 0.8602 0.5082 -0.0419 0.8602 0.5082 -0.0419 0.8605 0.5073 -0.0462 0.8606 0.5067 -0.0514 0.8605 0.5073 -0.0462 0.8606 0.5066 -0.0514 0.8604 0.5058 -0.0619 0.8604 0.5058 -0.0619 0.8606 0.5049 -0.0660 0.8653 0.4953 -0.0768 0.8606 0.5049 -0.0660 0.8653 0.4953 -0.0768 0.8684 0.4898 -0.0775 0.8568 0.5120 0.0609 0.8336 0.5484 0.0656 0.8268 0.5576 0.0736 0.8268 0.5576 0.0736 0.8186 0.5734 0.0339 0.8237 0.5667 0.0194 0.8237 0.5667 0.0194 0.8274 0.5615 0.0105 0.8274 0.5615 0.0105 0.8290 0.5592 0.0041 0.8290 0.5593 0.0041 0.8297 0.5580 -0.0175 0.8268 0.5576 0.0736 0.8070 0.5850 0.0805 0.7539 0.6551 0.0492 0.7548 0.6559 0.0058 0.7480 0.6631 -0.0292 0.7423 0.6664 0.0696 0.7539 0.6551 0.0494 0.7551 0.6514 0.0748 0.7403 0.6683 0.0728 0.7550 0.6514 0.0748 0.7823 0.6197 0.0633 0.7983 0.5972 0.0781 0.7983 0.5972 0.0781 0.8070 0.5850 0.0806 0.6627 0.7358 0.1392 0.6752 0.7244 0.1392 0.6752 0.7244 0.1392 0.7029 0.6946 0.1529 0.7103 0.6862 0.1566 0.7103 0.6862 0.1566 0.7186 0.6687 0.1909 0.7186 0.6687 0.1909 0.7138 0.6715 0.1990 0.7186 0.6687 0.1909 0.7120 0.6668 0.2200 0.8070 0.5850 0.0806 0.8161 0.5664 0.1151 0.8161 0.5664 0.1151 0.8277 0.5417 0.1467 0.8224 0.5500 0.1455 0.8277 0.5417 0.1467 0.8224 0.5500 0.1455 0.8102 0.5555 0.1869 0.8037 0.5623 0.1946 0.8037 0.5623 0.1946 0.7878 0.5753 0.2200 0.7878 0.5753 0.2200 0.7765 0.5734 0.2614 0.7765 0.5734 0.2613 0.7593 0.5810 0.2930 0.7593 0.5810 0.2930 0.7573 0.5813 0.2976 0.7573 0.5813 0.2976 0.7433 0.5933 0.3089 0.5605 0.4964 0.6629 0.5478 0.5245 0.6518 0.5478 0.5245 0.6518 0.5463 0.5428 0.6379 0.5891 0.5343 0.6063 0.5895 0.5378 0.6026 0.5891 0.5343 0.6063 0.6158 0.5127 0.5983 0.6192 0.5093 0.5976 0.6192 0.5093 0.5976 0.6402 0.4814 0.5987 0.6421 0.4779 0.5995 0.6421 0.4779 0.5995 0.6495 0.4785 0.5909 0.6513 0.4797 0.5880 0.6495 0.4785 0.5909 0.6513 0.4797 0.5880 0.6558 0.4751 0.5867 0.6658 0.4832 0.5685 0.6627 0.4869 0.5690 0.6627 0.4869 0.5690 0.6688 0.4927 0.5568 0.6688 0.4927 0.5568 0.6798 0.4871 0.5483 0.6839 0.4905 0.5400 0.6813 0.4939 0.5402 0.6813 0.4939 0.5402 0.6561 0.5199 0.5471 0.6508 0.5232 0.5502 0.7126 0.4985 0.4936 0.7128 0.4987 0.4931 0.7067 0.4816 0.5183 0.7063 0.4804 0.5199 0.7143 0.4994 0.4903 0.6883 0.5259 0.4997 0.6603 0.5325 0.5296 0.6545 0.5358 0.5334 0.6545 0.5358 0.5334 0.6508 0.5232 0.5501 0.6898 0.6833 0.2392 0.7073 0.6719 0.2197 0.6806 0.6688 0.2990 0.7041 0.6518 0.2820 0.6545 0.5358 0.5334 0.6389 0.5675 0.5195 0.6289 0.5860 0.5110 0.6289 0.5860 0.5110 0.6263 0.6048 0.4918 0.6509 0.5232 0.5501 0.6225 0.5412 0.5652 0.6225 0.5412 0.5652 0.5959 0.5361 0.5979 0.5895 0.5378 0.6027 0.5893 0.5373 0.6033 0.5657 0.5615 0.6039 0.6585 0.2578 0.7070 0.6503 0.2400 0.7207 0.6503 0.2400 0.7207 0.6570 0.2267 0.7190 0.6503 0.2401 0.7208 0.6234 0.2547 0.7392 0.6170 0.2606 0.7426 0.6170 0.2606 0.7426 0.6133 0.2673 0.7432 0.6182 0.3317 0.7126 0.6175 0.3388 0.7099 0.6114 0.2744 0.7422 0.5976 0.2956 0.7453 0.5976 0.2956 0.7453 0.6057 0.3251 0.7262 0.6182 0.3317 0.7126 0.6114 0.2744 0.7422 0.6133 0.2672 0.7433 0.6175 0.3388 0.7099 0.6122 0.3486 0.7097 0.6138 0.2234 0.7572 0.6051 0.2506 0.7557 0.6049 0.2513 0.7556 0.6148 0.2503 0.7479 0.6273 0.2241 0.7458 0.6318 0.2176 0.7439 0.5710 0.7080 0.4156 0.5736 0.7041 0.4186 0.5830 0.6571 0.4779 0.6010 0.6342 0.4864 0.6010 0.6342 0.4864 0.6203 0.6141 0.4879 0.6203 0.6141 0.4879 0.6263 0.6048 0.4919 0.5800 0.6430 0.5002 0.6009 0.6343 0.4864 0.6010 0.6342 0.4864 0.6203 0.6141 0.4879 0.5732 0.6500 0.4990 0.5736 0.6493 0.4994 0.5736 0.6493 0.4994 0.5760 0.6413 0.5070 0.5760 0.6413 0.5070 0.5756 0.6145 0.5395 0.5794 0.5980 0.5539 0.5794 0.5980 0.5539 0.5710 0.5886 0.5723 0.5710 0.5886 0.5723 0.5655 0.5615 0.6041 0.5655 0.5615 0.6041 0.5494 0.5395 0.6380 0.5464 0.5425 0.6381 0.5464 0.5425 0.6381 0.5245 0.5679 0.6343 0.5149 0.5714 0.6390 0.5149 0.5714 0.6390 0.5136 0.5776 0.6345 0.5174 0.5802 0.6291 0.5136 0.5776 0.6345 0.5174 0.5802 0.6291 0.5150 0.5901 0.6218 0.4683 0.6423 0.6067 0.4587 0.6477 0.6083 0.4587 0.6477 0.6083 0.4486 0.6478 0.6157 0.4486 0.6478 0.6157 0.4206 0.6677 0.6143 0.3984 0.6928 0.6011 0.3870 0.7028 0.5969 0.3907 0.7130 0.5822 0.3870 0.7028 0.5969 0.3972 0.7185 0.5709 0.3907 0.7130 0.5822 0.3972 0.7185 0.5709 0.4119 0.7379 0.5347 0.4045 0.7532 0.5187 0.4045 0.7532 0.5187 0.4052 0.7559 0.5142 0.4052 0.7559 0.5142 0.4222 0.7575 0.4979 0.4222 0.7575 0.4979 0.4168 0.7691 0.4846 0.4168 0.7691 0.4846 0.4054 0.7819 0.4736 0.4054 0.7819 0.4736 0.4039 0.7974 0.4483 0.4039 0.7974 0.4483 0.4178 0.7934 0.4427 0.4178 0.7934 0.4427 0.4302 0.7960 0.4257 0.2124 0.7696 0.6022 0.2466 0.7636 0.5968 0.2668 0.7815 0.5639 0.2967 0.7887 0.5384 0.3153 0.7891 0.5272 0.3907 0.7130 0.5822 0.3580 0.7258 0.5874 0.3281 0.7243 0.6065 0.3153 0.7891 0.5272 0.3228 0.7907 0.5201 0.3228 0.7907 0.5201 0.3306 0.7887 0.5184 0.3306 0.7887 0.5184 0.3627 0.7900 0.4943 0.3974 0.7749 0.4915 0.4222 0.7575 0.4979 0.2072 0.7687 0.6051 0.2411 0.7614 0.6019 0.2712 0.7449 0.6096 0.3043 0.7353 0.6056 0.3281 0.7243 0.6065 0.2074 0.7686 0.6052 0.2124 0.7696 0.6022 0.2124 0.7695 0.6022 0.1868 0.7901 0.5839 0.1717 0.7958 0.5807 0.2137 0.8178 0.5344 0.2263 0.8211 0.5240 0.2263 0.8211 0.5239 0.2511 0.8334 0.4924 0.2828 0.8376 0.4674 0.3015 0.8322 0.4654 0.3015 0.8322 0.4654 0.2982 0.8533 0.4277 0.2945 0.8596 0.4177 0.3099 0.8570 0.4117 0.2945 0.8595 0.4177 0.3099 0.8570 0.4117 0.3165 0.8555 0.4098 0.3233 0.8524 0.4110 0.3165 0.8555 0.4098 0.3233 0.8524 0.4110 0.3411 0.8501 0.4011 -0.0256 0.8845 0.4658 -0.0601 0.8742 0.4818 -0.0704 0.8690 0.4898 -0.0704 0.8690 0.4898 -0.1062 0.8736 0.4749 -0.1127 0.8739 0.4729 -0.1127 0.8739 0.4729 -0.0838 0.8896 0.4491 -0.0787 0.8959 0.4373 -0.0787 0.8959 0.4373 -0.0532 0.9114 0.4080 -0.0542 0.9135 0.4033 -0.0542 0.9135 0.4033 -0.0498 0.9206 0.3873 -0.0511 0.9245 0.3777 -0.0498 0.9206 0.3873 -0.0511 0.9245 0.3777 -0.0421 0.9263 0.3743 0.1348 0.8537 0.5031 0.1003 0.8654 0.4909 0.0751 0.8741 0.4800 0.0751 0.8741 0.4800 0.0395 0.8835 0.4667 0.0286 0.8836 0.4674 0.1348 0.8536 0.5031 0.1373 0.8535 0.5026 0.1373 0.8535 0.5026 0.1495 0.8608 0.4865 0.1495 0.8608 0.4865 0.1191 0.8766 0.4662 0.0939 0.8824 0.4610 0.0939 0.8824 0.4610 0.0582 0.8922 0.4479 0.0476 0.8934 0.4467 0.0477 0.8934 0.4467 0.0308 0.8888 0.4573 0.0308 0.8888 0.4573 0.0286 0.8836 0.4674 0.0287 0.8836 0.4674 0.0168 0.8883 0.4590 0.0168 0.8883 0.4590 -0.0200 0.8821 0.4707 -0.0256 0.8845 0.4658 0.0168 0.8883 0.4590 0.0194 0.8896 0.4563 0.0194 0.8896 0.4563 -0.0190 0.8923 0.4510 -0.0256 0.8845 0.4658 0.0140 0.9295 0.3686 0.0155 0.9276 0.3732 0.0155 0.9276 0.3732 0.0151 0.9263 0.3765 0.0170 0.9228 0.3849 0.0151 0.9263 0.3765 0.0170 0.9228 0.3848 0.0206 0.9125 0.4085 0.0206 0.9125 0.4085 0.0306 0.9084 0.4169 0.0305 0.9084 0.4169 0.0155 0.8969 0.4420 0.0155 0.8969 0.4420 -0.0203 0.9046 0.4257 -0.0395 0.9063 0.4209 -0.0395 0.9063 0.4209 -0.0309 0.9105 0.4123 -0.0347 0.9147 0.4025 -0.0421 0.9263 0.3743 -0.0421 0.9263 0.3743 -0.0358 0.9320 0.3607 -0.1496 0.9723 0.1796 -0.1565 0.9625 0.2215 -0.1558 0.9605 0.2306 -0.1558 0.9605 0.2307 -0.1435 0.9517 0.2715 -0.1275 0.9434 0.3062 -0.1215 0.9400 0.3187 -0.1275 0.9434 0.3062 -0.1215 0.9400 0.3187 -0.1528 0.9267 0.3433 -0.1540 0.9246 0.3484 -0.1540 0.9246 0.3484 -0.1643 0.9231 0.3477 -0.1747 0.9783 0.1118 -0.2083 0.9720 0.1086 -0.2189 0.9547 0.2017 -0.2171 0.9451 0.2442 -0.2542 0.9349 0.2479 -0.2542 0.9348 0.2479 -0.2630 0.9335 0.2438 -0.2630 0.9335 0.2438 -0.2724 0.9293 0.2495 -0.2723 0.9293 0.2495 -0.2755 0.9277 0.2521 -0.2755 0.9277 0.2520 -0.2916 0.9222 0.2539 -0.2726 0.9172 0.2907 -0.2735 0.9183 0.2861 -0.2769 0.9182 0.2832 -0.2736 0.9183 0.2862 -0.2769 0.9182 0.2832 -0.2916 0.9222 0.2538 -0.2916 0.9222 0.2539 -0.2914 0.9258 0.2407 -0.2914 0.9258 0.2408 -0.2914 0.9264 0.2385 -0.2914 0.9264 0.2385 -0.2775 0.9385 0.2057 -0.2774 0.9385 0.2057 -0.2775 0.9392 0.2022 -0.2775 0.9392 0.2023 -0.2670 0.9425 0.2010 -0.2670 0.9425 0.2010 -0.2683 0.9428 0.1977 -0.2683 0.9428 0.1977 -0.2454 0.9524 0.1809 -0.1944 0.9039 0.3810 -0.2287 0.9055 0.3575 -0.2329 0.9124 0.3365 -0.2329 0.9124 0.3364 -0.2284 0.9134 0.3370 -0.2284 0.9134 0.3370 -0.2293 0.9149 0.3323 -0.2293 0.9149 0.3323 -0.2264 0.9163 0.3304 -0.2264 0.9163 0.3304 -0.2591 0.9169 0.3035 -0.2726 0.9171 0.2907 -0.1799 0.9124 0.3676 -0.1643 0.9231 0.3477 -0.1643 0.9231 0.3477 -0.1724 0.9228 0.3446 -0.1724 0.9228 0.3446 -0.1812 0.9353 0.3038 -0.1857 0.9353 0.3012 -0.1857 0.9353 0.3012 -0.1908 0.9327 0.3059 -0.1908 0.9327 0.3059 -0.2152 0.9256 0.3113 -0.2152 0.9256 0.3113 -0.2464 0.9272 0.2822 -0.2592 0.9289 0.2645 -0.2592 0.9289 0.2645 -0.2542 0.9349 0.2479 -0.3739 0.8451 0.3821 -0.3762 0.8437 0.3828 -0.3762 0.8437 0.3829 -0.3789 0.8422 0.3835 -0.3789 0.8422 0.3835 -0.3832 0.8410 0.3818 -0.3833 0.8410 0.3819 -0.3738 0.8452 0.3820 -0.1930 0.7233 0.6630 -0.2195 0.7057 0.6737 -0.2489 0.6930 0.6766 -0.2703 0.6707 0.6907 -0.2703 0.6707 0.6907 -0.2889 0.6460 0.7066 -0.3078 0.6219 0.7201 -0.3293 0.6017 0.7277 -0.3122 0.5913 0.7436 -0.3122 0.5913 0.7436 -0.2899 0.5762 0.7642 -0.1127 0.8739 0.4729 -0.1356 0.8877 0.4401 -0.1365 0.9027 0.4080 -0.1410 0.9014 0.4093 -0.1365 0.9027 0.4080 -0.1410 0.9014 0.4093 -0.1523 0.9137 0.3768 -0.1523 0.9137 0.3768 -0.1604 0.9129 0.3754 -0.1604 0.9129 0.3754 -0.1650 0.9161 0.3654 -0.1689 0.9150 0.3663 -0.1651 0.9161 0.3654 -0.1689 0.9150 0.3663 -0.1756 0.9125 0.3695 -0.1756 0.9125 0.3695 -0.1791 0.9112 0.3709 -0.1791 0.9112 0.3709 -0.1799 0.9124 0.3676 -0.1798 0.9124 0.3677 -0.1944 0.9039 0.3810 -0.1944 0.9039 0.3810 -0.2176 0.8959 0.3873 -0.2176 0.8959 0.3873 -0.2230 0.8966 0.3827 -0.2230 0.8966 0.3827 -0.2607 0.8837 0.3889 -0.2839 0.8849 0.3692 -0.2838 0.8849 0.3692 -0.2873 0.8847 0.3672 -0.4686 0.4728 0.7463 -0.4798 0.5023 0.7194 -0.4803 0.5180 0.7078 -0.4426 0.5074 0.7394 -0.4600 0.4837 0.7446 -0.4648 0.4743 0.7477 -0.4309 0.6357 0.6405 -0.4319 0.6314 0.6441 0.2179 0.7498 0.6247 0.1913 0.7352 0.6503 0.1586 0.7370 0.6570 0.1269 0.7319 0.6695 0.1193 0.7030 0.7011 0.0911 0.6906 0.7175 0.0630 0.6793 0.7312 0.0390 0.6603 0.7500 0.0246 0.6533 0.7567 0.0246 0.6533 0.7567 0.0007 0.6716 0.7410 -0.0083 0.7018 0.7124 -0.0387 0.7058 0.7073 -0.0680 0.7161 0.6947 -0.0963 0.7292 0.6775 -0.1279 0.7244 0.6774 -0.1600 0.7245 0.6705 -0.1923 0.7233 0.6632 -0.1930 0.7233 0.6630 -0.4823 0.5609 0.6730 -0.4805 0.5605 0.6746 -0.4805 0.5605 0.6746 -0.4589 0.5844 0.6692 -0.4432 0.6123 0.6547 -0.4319 0.6314 0.6440 0.0246 0.6533 0.7567 -0.0018 0.6414 0.7672 -0.0283 0.6319 0.7745 -0.0555 0.6396 0.7667 -0.0836 0.6404 0.7635 -0.0941 0.6100 0.7868 -0.0953 0.6062 0.7895 -0.0953 0.6063 0.7895 -0.1225 0.6108 0.7823 -0.1493 0.6225 0.7682 -0.1646 0.6160 0.7704 -0.1646 0.6160 0.7704 -0.1925 0.6136 0.7658 -0.1987 0.6121 0.7654 -0.1986 0.6121 0.7654 -0.2273 0.6122 0.7573 -0.2521 0.5982 0.7607 -0.2751 0.5817 0.7655 -0.2899 0.5762 0.7641 -0.3127 0.5617 0.7659 -0.3145 0.5304 0.7873 -0.3212 0.5014 0.8034 -0.3447 0.4900 0.8007 -0.3742 0.4991 0.7816 -0.3904 0.5072 0.7684 -0.4142 0.5021 0.7592 -0.4426 0.5074 0.7394 -0.4803 0.5180 0.7078 -0.4806 0.5488 0.6840 -0.4804 0.5605 0.6746 0.6170 0.2606 0.7426 0.6156 0.2593 0.7441 0.6156 0.2593 0.7442 0.6164 0.2569 0.7443 0.6164 0.2569 0.7443 0.6148 0.2503 0.7479 0.6148 0.2503 0.7479 0.6049 0.2513 0.7556 0.6049 0.2513 0.7556 0.6043 0.2551 0.7548 0.6044 0.2551 0.7548 0.6024 0.2523 0.7572 0.6024 0.2523 0.7572 0.5790 0.2591 0.7731 0.5790 0.2591 0.7731 0.5624 0.2407 0.7910 0.5624 0.2407 0.7910 0.5397 0.2347 0.8085 0.5397 0.2347 0.8085 0.5440 0.2092 0.8126 0.5474 0.1949 0.8139 -0.4203 0.9067 0.0357 -0.4188 0.9073 0.0375 -0.4245 0.9043 0.0455 -0.4297 0.9014 0.0528 -0.4176 0.9081 0.0319 -0.4203 0.9067 0.0357 -0.4188 0.9073 0.0375 -0.4245 0.9043 0.0455 -0.4297 0.9014 0.0528 -0.4619 0.8839 0.0727 -0.3360 0.9412 0.0361 -0.3739 0.9273 0.0198 -0.4134 0.9102 0.0262 -0.4176 0.9081 0.0319 -0.4619 0.8839 0.0727 -0.4634 0.8832 0.0727 -0.4634 0.8832 0.0727 -0.4667 0.8814 0.0728 -0.4068 0.9100 0.0800 -0.4215 0.9029 0.0850 -0.4216 0.9029 0.0840 -0.4234 0.9019 0.0855 -0.7764 0.6286 -0.0455 -0.7741 0.6267 -0.0889 -0.7725 0.6254 -0.1103 -0.7725 0.6254 -0.1103 -0.7716 0.6247 -0.1200 -0.7716 0.6247 -0.1200 -0.7674 0.6213 -0.1586 0.6563 0.3491 0.6689 0.6689 0.3314 0.6654 0.7062 0.2708 0.6542 0.6914 0.2926 0.6606 0.6914 0.2926 0.6606 0.6786 0.3227 0.6598 0.6693 0.3297 0.6658 0.6693 0.3297 0.6658 0.6686 0.3333 0.6648 0.6686 0.3333 0.6648 0.6686 0.3347 0.6641 0.6686 0.3347 0.6641 0.6808 0.3327 0.6526 0.7230 0.2633 0.6387 0.7062 0.2708 0.6542 0.7062 0.2708 0.6542 0.7010 0.2466 0.6691 0.7010 0.2466 0.6691 0.7027 0.2470 0.6672 0.6914 0.2926 0.6605 0.6676 0.2750 0.6919 0.6612 0.2763 0.6975 0.6606 0.2584 0.7049 0.6612 0.2894 0.6921 0.6527 0.3124 0.6902 0.6605 0.2584 0.7049 0.6585 0.2578 0.7070 0.6570 0.2267 0.7190 0.6625 0.2188 0.7164 0.6633 0.2082 0.7188 0.6625 0.2188 0.7164 0.6633 0.2082 0.7188 0.6616 0.2015 0.7223 0.6599 0.1968 0.7251 0.6616 0.2015 0.7223 0.6599 0.1968 0.7251 0.6596 0.1895 0.7273 0.6603 0.1850 0.7279 0.6596 0.1895 0.7273 0.6603 0.1850 0.7279 0.6684 0.1632 0.7257 0.6527 0.3123 0.6902 0.6379 0.3289 0.6963 0.6473 0.3163 0.6935 0.6469 0.3165 0.6938 0.6379 0.3289 0.6963 0.6343 0.3456 0.6915 0.6568 0.1897 0.7298 0.6387 0.1983 0.7434 0.6387 0.1983 0.7434 0.6355 0.2169 0.7410 0.6329 0.2158 0.7436 0.6355 0.2170 0.7410 0.6324 0.1927 0.7503 0.6378 0.1947 0.7452 0.6329 0.2158 0.7436 0.6318 0.2176 0.7439 0.6392 0.1974 0.7433 0.6379 0.1958 0.7448 0.6654 0.1141 0.7377 0.6575 0.1424 0.7399 0.6538 0.1510 0.7414 0.6538 0.1510 0.7414 0.6495 0.1491 0.7456 0.6495 0.1491 0.7456 0.6436 0.1539 0.7497 0.6432 0.1545 0.7499 0.6435 0.1572 0.7492 0.6435 0.1572 0.7492 0.6381 0.1521 0.7548 0.6399 0.1576 0.7521 0.6330 0.1855 0.7516 0.6312 0.1916 0.7516 0.6436 0.1539 0.7497 0.6432 0.1545 0.7499 0.6138 0.2234 0.7571 0.6118 0.1964 0.7662 0.6118 0.1964 0.7662 0.6091 0.1681 0.7751 0.6101 0.1615 0.7757 0.6101 0.1615 0.7757 0.6240 0.1372 0.7693 0.6243 0.1338 0.7697 0.6243 0.1338 0.7697 0.6381 0.1521 0.7548 0.6312 0.1916 0.7516 0.6324 0.1927 0.7503 0.6378 0.1947 0.7452 0.6379 0.1958 0.7448 0.6101 0.1615 0.7757 0.5944 0.1566 0.7888 0.5944 0.1566 0.7888 0.5791 0.1492 0.8015 0.5791 0.1492 0.8015 0.5707 0.1447 0.8083 0.5896 0.0662 0.8050 0.5937 0.0751 0.8012 0.5937 0.0751 0.8012 0.6161 0.0652 0.7850 0.6161 0.0652 0.7850 0.6374 0.0685 0.7675 0.6374 0.0685 0.7675 0.6425 0.0733 0.7627 0.6460 0.0720 0.7600 0.6425 0.0733 0.7627 0.6460 0.0720 0.7600 0.6458 0.0645 0.7608 0.6460 0.0720 0.7600 0.6498 0.0940 0.7543 0.6538 0.0910 0.7512 0.6498 0.0939 0.7543 0.6374 0.0685 0.7675 0.6455 0.0657 0.7609 0.6889 0.0929 0.7189 0.6807 0.1220 0.7223 0.6721 0.1242 0.7300 0.6721 0.1241 0.7300 0.6720 0.1122 0.7320 0.6720 0.1122 0.7320 0.6661 0.1122 0.7373 0.6716 0.1136 0.7321 0.6691 0.1124 0.7346 0.6723 0.1243 0.7298 0.6695 0.1540 0.7267 0.6684 0.1632 0.7257 0.6684 0.1632 0.7257 0.6797 0.1659 0.7144 0.7035 0.1548 0.6936 0.7036 0.1548 0.6936 0.6707 0.0871 0.7366 0.6686 0.0891 0.7383 0.6686 0.0891 0.7383 0.6688 0.0895 0.7380 0.6686 0.0891 0.7383 0.6538 0.0910 0.7512 0.6671 0.0996 0.7383 0.6654 0.1141 0.7377 0.6661 0.1122 0.7373 0.6657 0.1122 0.7378 0.6654 0.1016 0.7396 0.6654 0.1016 0.7396 0.6671 0.0996 0.7383 0.6688 0.0895 0.7380 0.7369 0.0413 0.6747 0.7368 0.0226 0.6757 0.7368 0.0226 0.6757 0.7369 0.0226 0.6757 0.7373 0.0257 0.6751 0.7373 0.0257 0.6751 0.7358 0.0191 0.6769 0.7348 0.0000 0.6783 0.7157 0.0946 0.6920 0.7010 0.0814 0.7085 0.7010 0.0814 0.7085 0.6903 0.0852 0.7185 0.6903 0.0852 0.7185 0.6888 0.0916 0.7191 0.6903 0.0852 0.7185 0.6816 0.0755 0.7278 0.7166 0.0930 0.6913 0.7162 0.0935 0.6916 0.6888 0.0916 0.7191 0.6889 0.0929 0.7189 0.6816 0.0755 0.7278 0.6765 0.0794 0.7322 0.6765 0.0794 0.7322 0.6730 0.0828 0.7350 0.6730 0.0828 0.7350 0.6707 0.0871 0.7366 0.6275 0.0279 0.7781 0.6326 0.0321 0.7738 0.6326 0.0321 0.7738 0.6312 0.0343 0.7749 0.6312 0.0343 0.7749 0.6413 0.0467 0.7658 0.6413 0.0467 0.7658 0.6458 0.0645 0.7608 0.6291 0.0663 0.7745 0.6278 0.0625 0.7759 0.6278 0.0625 0.7759 0.6240 0.0640 0.7788 0.6240 0.0640 0.7788 0.6232 0.0367 0.7812 0.5665 0.0840 0.8197 0.5682 0.0866 0.8183 0.5683 0.0866 0.8183 0.5683 0.0945 0.8174 0.5683 0.0945 0.8174 0.5681 0.1005 0.8168 0.3310 0.1539 0.9310 0.3059 0.1563 0.9391 0.3010 0.1601 0.9401 0.3310 0.1539 0.9310 0.3352 0.1388 0.9319 0.3359 0.1282 0.9331 0.3346 0.1257 0.9339 0.3480 0.1141 0.9305 0.3758 0.1092 0.9202 0.4055 0.1040 0.9082 0.4282 0.0963 0.8985 0.4282 0.0963 0.8985 0.4659 0.1049 0.8786 0.5020 0.1045 0.8585 0.5050 0.1021 0.8571 0.5050 0.1021 0.8571 0.5070 0.0973 0.8564 0.3359 0.1282 0.9331 0.3420 0.1470 0.9281 0.3557 0.1552 0.9216 0.3557 0.1552 0.9216 0.3738 0.1677 0.9122 0.3009 0.1595 0.9402 0.3129 0.1735 0.9338 0.3128 0.1731 0.9339 0.3457 0.1947 0.9179 0.3457 0.1947 0.9179 0.3739 0.2189 0.9013 0.3879 0.2385 0.8903 0.3879 0.2385 0.8903 0.4153 0.2353 0.8787 0.4349 0.2294 0.8708 0.3093 0.1736 0.9350 0.3080 0.1729 0.9355 0.3129 0.1735 0.9338 0.3093 0.1736 0.9350 0.3035 0.1754 0.9365 0.2965 0.1772 0.9385 0.3080 0.1729 0.9355 0.3035 0.1754 0.9365 0.9003 -0.1038 0.4226 0.9139 -0.1018 0.3931 0.9003 -0.1038 0.4226 0.9031 -0.0759 0.4226 0.8785 -0.1339 0.4585 0.8927 -0.1020 0.4391 0.9031 -0.0759 0.4226 0.9031 -0.0759 0.4226 0.9150 -0.0432 0.4012 0.9254 -0.0103 0.3789 0.9283 0.0000 0.3718 0.9283 0.0000 0.3718 0.9283 0.0000 0.3718 0.8628 -0.0845 0.4984 0.8650 -0.1212 0.4870 0.8670 -0.1322 0.4804 0.8628 -0.0845 0.4984 0.8492 -0.0569 0.5249 0.8469 -0.0203 0.5314 0.8459 -0.0185 0.5331 0.8459 -0.0185 0.5331 0.8222 -0.0260 0.5686 0.8177 -0.0315 0.5748 0.8153 -0.0415 0.5775 0.8148 -0.0419 0.5783 0.8071 -0.0755 0.5855 0.8063 -0.0762 0.5866 0.8965 -0.2003 0.3951 0.8973 -0.1907 0.3980 0.9076 -0.2095 0.3639 0.8965 -0.2003 0.3952 0.8939 -0.2742 0.3545 0.9012 -0.2353 0.3639 0.9076 -0.2095 0.3639 0.8973 -0.1907 0.3980 0.8797 -0.1870 0.4373 0.8792 -0.1869 0.4384 0.8792 -0.1869 0.4384 0.8864 -0.1489 0.4384 0.8885 -0.1354 0.4384 0.8885 -0.1354 0.4384 0.8688 -0.1324 0.4772 0.8671 -0.1322 0.4804 0.8624 -0.2019 0.4643 0.8703 -0.1644 0.4643 0.8756 -0.1335 0.4643 0.9212 -0.2736 0.2767 0.9306 -0.2332 0.2823 0.9414 -0.2135 0.2613 0.9458 -0.2020 0.2542 0.9414 -0.2135 0.2613 0.9434 -0.1955 0.2680 0.9458 -0.2020 0.2542 0.9434 -0.1955 0.2680 0.9480 -0.1825 0.2606 0.9471 -0.1793 0.2662 0.9480 -0.1825 0.2606 0.9471 -0.1793 0.2662 0.9537 -0.1378 0.2673 0.9588 -0.0962 0.2673 0.9592 -0.0923 0.2672 0.9592 -0.0923 0.2672 0.9464 -0.0955 0.3085 0.9318 -0.0986 0.3492 0.9155 -0.1015 0.3892 0.9139 -0.1018 0.3931 0.9317 -0.2771 0.2350 0.9430 -0.2362 0.2345 0.9440 -0.2330 0.2336 0.9440 -0.2331 0.2336 0.9344 -0.2739 0.2277 0.9328 -0.2807 0.2260 0.9467 -0.2047 0.2487 0.9450 -0.2051 0.2548 0.9467 -0.2047 0.2487 0.9500 -0.2033 0.2370 0.9573 -0.1923 0.2159 0.9500 -0.2033 0.2370 0.9573 -0.1923 0.2159 0.9473 -0.2334 0.2195 0.9373 -0.2743 0.2149 0.9357 -0.2810 0.2134 0.9483 -0.2543 0.1901 0.9487 -0.2360 0.2106 0.9493 -0.2313 0.2129 0.9487 -0.2360 0.2105 0.9493 -0.2313 0.2129 0.9478 -0.2313 0.2194 0.9575 -0.1926 0.2149 0.9617 -0.1809 0.2061 0.9617 -0.1809 0.2061 0.9615 -0.1752 0.2117 0.9615 -0.1752 0.2117 0.9643 -0.1586 0.2122 0.9643 -0.1587 0.2122 0.9634 -0.1580 0.2165 0.9634 -0.1580 0.2165 0.9654 -0.1525 0.2117 0.9666 -0.1496 0.2080 0.9654 -0.1525 0.2117 0.9666 -0.1496 0.2080 0.9700 -0.1425 0.1972 0.9707 -0.1468 0.1902 0.9700 -0.1425 0.1972 0.9707 -0.1469 0.1902 0.9749 -0.1393 0.1738 0.9764 -0.1396 0.1650 0.9749 -0.1393 0.1738 0.9764 -0.1396 0.1650 0.9805 -0.1316 0.1457 0.9789 -0.1418 0.1468 0.9805 -0.1317 0.1457 0.9789 -0.1418 0.1468 0.9797 -0.1494 0.1339 0.9797 -0.1494 0.1339 0.9796 -0.1571 0.1252 0.9796 -0.1571 0.1253 0.9786 -0.1603 0.1291 0.9786 -0.1603 0.1291 0.9782 -0.1634 0.1282 0.9777 -0.1611 0.1347 0.9782 -0.1634 0.1281 0.9777 -0.1610 0.1348 0.9745 -0.1679 0.1490 0.9745 -0.1679 0.1490 0.9724 -0.1837 0.1439 0.9708 -0.1812 0.1574 0.9724 -0.1838 0.1439 0.9708 -0.1812 0.1574 0.9619 -0.2133 0.1713 0.9619 -0.2133 0.1713 0.9620 -0.2204 0.1611 0.9620 -0.2203 0.1611 0.9611 -0.2272 0.1570 0.9739 -0.1823 0.1353 0.9728 -0.1977 0.1206 0.9739 -0.1823 0.1353 0.9732 -0.1763 0.1476 0.9831 -0.1448 0.1122 0.9885 -0.1306 0.0759 0.9831 -0.1448 0.1122 0.9824 -0.1487 0.1133 0.9805 -0.1460 0.1316 0.9824 -0.1487 0.1133 0.9946 -0.0539 0.0887 0.9948 -0.0501 0.0891 0.9945 -0.0472 0.0932 0.9947 -0.0509 0.0889 0.9945 -0.0472 0.0932 0.9941 -0.0480 0.0974 0.9939 -0.0514 0.0981 0.9941 -0.0480 0.0974 0.9939 -0.0514 0.0981 0.9890 -0.0447 0.1409 0.9873 -0.0445 0.1526 0.9853 -0.0462 0.1647 0.9873 -0.0446 0.1527 0.9853 -0.0462 0.1647 0.9832 -0.0741 0.1667 0.9783 -0.0935 0.1847 0.9832 -0.0741 0.1667 0.9789 -0.0946 0.1811 0.9782 -0.1067 0.1781 0.9782 -0.1067 0.1781 0.9767 -0.1068 0.1863 0.9767 -0.1068 0.1862 0.9761 -0.1137 0.1851 0.9771 -0.1146 0.1795 0.9761 -0.1137 0.1851 0.9771 -0.1146 0.1795 0.9748 -0.1366 0.1765 0.9783 -0.0935 0.1847 0.9744 -0.0921 0.2050 0.9747 -0.0795 0.2090 0.9744 -0.0921 0.2050 0.9747 -0.0795 0.2090 0.9715 -0.0584 0.2296 0.9715 -0.0584 0.2296 0.9701 -0.0541 0.2365 0.9701 -0.0541 0.2365 0.9706 -0.0502 0.2356 0.9706 -0.0502 0.2356 0.9659 -0.0147 0.2583 0.9659 0.0000 0.2588 0.9813 0.0000 0.1927 0.9807 -0.0427 0.1908 0.9804 -0.0485 0.1908 0.9804 -0.0485 0.1909 0.9853 -0.0462 0.1647 0.9829 0.0000 0.1841 0.9819 0.0000 0.1895 0.9819 0.0000 0.1895 0.9818 0.0000 0.1902 0.9813 0.0000 0.1925 0.9812 -0.0026 0.1932 0.7338 -0.1058 0.6711 0.7349 -0.1131 0.6687 0.7338 -0.1058 0.6711 0.7438 -0.0808 0.6635 0.7438 -0.0808 0.6635 0.7488 -0.0910 0.6565 0.7509 -0.0895 0.6543 0.7488 -0.0910 0.6565 0.7509 -0.0895 0.6543 0.7593 -0.0922 0.6442 0.7593 -0.0922 0.6442 0.7638 -0.0939 0.6386 0.7638 -0.0939 0.6386 0.7630 -0.1011 0.6385 0.7664 -0.0989 0.6347 0.7630 -0.1011 0.6385 0.7664 -0.0989 0.6347 0.7728 -0.0954 0.6275 0.7728 -0.0954 0.6275 0.7768 -0.1004 0.6217 0.7768 -0.1004 0.6217 0.7799 -0.0975 0.6183 0.7799 -0.0951 0.6186 0.7799 -0.0975 0.6183 0.7799 -0.0951 0.6186 0.7824 -0.0997 0.6147 0.7824 -0.0997 0.6147 0.7860 -0.1038 0.6095 0.7860 -0.1038 0.6095 0.7900 -0.1028 0.6044 0.8039 -0.0755 0.5899 0.8039 -0.0758 0.5899 0.7348 0.0000 0.6783 0.7263 -0.0224 0.6871 0.5830 -0.0640 0.8100 0.5682 -0.0723 0.8197 -0.3760 -0.4386 0.8162 -0.3604 -0.4293 0.8282 -0.3604 -0.4293 0.8282 -0.3653 -0.4026 0.8393 -0.3596 -0.3807 0.8519 -0.3596 -0.3807 0.8519 -0.3586 -0.3530 0.8642 -0.3777 -0.3411 0.8608 -0.3814 -0.3173 0.8682 -0.3849 -0.3118 0.8687 -0.3849 -0.3118 0.8687 -0.3552 -0.2877 0.8894 -0.3252 -0.2633 0.9083 -0.2945 -0.2385 0.9254 -0.2703 -0.2189 0.9376 -0.3777 -0.5444 0.7490 -0.3603 -0.5483 0.7547 -0.0585 -0.6485 0.7590 -0.0539 -0.6556 0.7532 -0.0388 -0.6601 0.7502 -0.0540 -0.6556 0.7531 -0.0388 -0.6601 0.7502 -0.0168 -0.6683 0.7437 -0.0121 -0.6666 0.7454 -0.0168 -0.6683 0.7437 -0.0121 -0.6666 0.7454 -0.0097 -0.6663 0.7456 -0.0046 -0.6679 0.7443 -0.0097 -0.6663 0.7456 -0.3603 -0.5483 0.7547 -0.3363 -0.5633 0.7547 -0.3114 -0.5775 0.7547 -0.2859 -0.5905 0.7547 -0.2599 -0.6024 0.7547 -0.2337 -0.6130 0.7547 -0.2067 -0.6226 0.7547 -0.1798 -0.6310 0.7547 -0.1521 -0.6382 0.7547 -0.1241 -0.6442 0.7547 -0.0962 -0.6490 0.7547 -0.0682 -0.6525 0.7547 -0.0589 -0.6534 0.7547 -0.0589 -0.6534 0.7547 -0.0585 -0.6485 0.7590 0.0049 -0.6691 0.7432 0.0341 -0.6706 0.7410 0.0619 -0.6820 0.7287 0.0625 -0.6836 0.7272 0.0625 -0.6836 0.7272 0.0777 -0.6925 0.7172 0.0777 -0.6925 0.7172 0.0983 -0.7153 0.6919 0.0964 -0.7248 0.6822 0.0942 -0.7306 0.6762 0.1262 -0.7278 0.6741 0.1408 -0.7187 0.6809 0.1382 -0.7149 0.6854 0.1667 -0.7016 0.6928 0.1684 -0.6980 0.6960 0.1684 -0.6980 0.6960 0.1868 -0.6819 0.7072 0.1868 -0.6819 0.7072 0.2163 -0.6730 0.7073 0.2243 -0.6703 0.7074 0.2244 -0.6703 0.7074 0.2342 -0.6524 0.7208 0.2351 -0.6478 0.7247 0.2397 -0.6321 0.7369 0.2574 -0.6306 0.7322 0.2686 -0.6462 0.7144 0.2730 -0.6498 0.7094 0.2781 -0.6532 0.7043 -0.0045 -0.6679 0.7443 0.0049 -0.6691 0.7432 0.0964 -0.7248 0.6822 0.0942 -0.7306 0.6763 0.1408 -0.7187 0.6809 0.1385 -0.7169 0.6833 0.2342 -0.6524 0.7208 0.2351 -0.6478 0.7246 0.2397 -0.6320 0.7369 0.2447 -0.6340 0.7336 0.2448 -0.6340 0.7336 0.2574 -0.6306 0.7322 0.2686 -0.6461 0.7144 0.2731 -0.6498 0.7094 0.1382 -0.7149 0.6854 0.1385 -0.7169 0.6833 0.2948 -0.8941 0.3372 0.2971 -0.8971 0.3272 0.2971 -0.8971 0.3272 0.2945 -0.8987 0.3251 0.2945 -0.8987 0.3251 0.2973 -0.9032 0.3097 -0.2417 -0.8150 0.5267 -0.2195 -0.8371 0.5011 -0.1834 -0.8478 0.4976 -0.1704 -0.8524 0.4944 -0.1704 -0.8524 0.4944 -0.1667 -0.8547 0.4917 -0.1667 -0.8547 0.4917 -0.1462 -0.8749 0.4616 -0.1464 -0.8785 0.4547 -0.1464 -0.8785 0.4547 -0.1426 -0.8830 0.4472 -0.1426 -0.8830 0.4472 -0.1117 -0.8921 0.4378 -0.3843 -0.7504 0.5378 -0.3518 -0.7642 0.5405 -0.3518 -0.7642 0.5405 -0.3539 -0.7655 0.5374 -0.3539 -0.7655 0.5374 -0.3245 -0.7857 0.5266 -0.3067 -0.7972 0.5200 -0.3067 -0.7972 0.5200 -0.2721 -0.8096 0.5200 -0.2669 -0.8114 0.5200 -0.2669 -0.8114 0.5200 -0.2656 -0.8075 0.5267 -0.2656 -0.8075 0.5267 -0.2417 -0.8150 0.5267 -0.0379 -0.9672 0.2512 -0.0348 -0.9649 0.2601 -0.0348 -0.9649 0.2601 -0.0075 -0.9609 0.2769 -0.0075 -0.9609 0.2769 -0.0239 -0.9547 0.2967 -0.0239 -0.9547 0.2967 0.0143 -0.9519 0.3060 0.0143 -0.9519 0.3060 0.0142 -0.9512 0.3083 0.0229 -0.9496 0.3126 0.0204 -0.9509 0.3088 0.0229 -0.9496 0.3126 0.0281 -0.9480 0.3170 0.0142 -0.9512 0.3083 0.0204 -0.9509 0.3088 0.0281 -0.9480 0.3170 0.0374 -0.9494 0.3119 0.0143 -0.9519 0.3060 0.0131 -0.9617 0.2738 0.0131 -0.9617 0.2738 0.0183 -0.9616 0.2739 0.0300 -0.9621 0.2710 0.0283 -0.9624 0.2701 0.0283 -0.9624 0.2701 0.0143 -0.9655 0.2601 0.0143 -0.9655 0.2601 0.0109 -0.9684 0.2492 0.0109 -0.9684 0.2492 0.0078 -0.9691 0.2466 0.0081 -0.9693 0.2458 0.0025 -0.9700 0.2429 0.0025 -0.9700 0.2429 -0.0016 -0.9714 0.2376 0.0459 -0.9733 0.2247 0.0499 -0.9731 0.2250 0.0525 -0.9720 0.2290 0.0499 -0.9731 0.2250 0.0525 -0.9720 0.2290 0.0548 -0.9700 0.2370 0.0549 -0.9700 0.2370 0.0662 -0.9678 0.2427 0.0662 -0.9678 0.2427 0.0722 -0.9683 0.2390 0.0722 -0.9683 0.2390 0.1091 -0.9599 0.2583 0.1155 -0.9590 0.2587 0.0737 -0.9786 0.1921 0.0966 -0.9769 0.1907 0.0966 -0.9769 0.1907 0.1087 -0.9758 0.1895 0.1216 -0.9800 0.1575 0.1225 -0.9826 0.1397 0.1216 -0.9800 0.1575 0.1230 -0.9786 0.1650 0.1230 -0.9786 0.1650 0.1223 -0.9785 0.1660 0.1223 -0.9785 0.1660 0.1276 -0.9778 0.1662 0.2162 -0.9646 0.1508 0.2081 -0.9700 0.1258 0.1940 -0.9807 0.0251 0.1970 -0.9801 0.0221 0.1970 -0.9801 0.0221 0.1977 -0.9800 0.0221 0.1977 -0.9800 0.0221 0.1983 -0.9799 0.0209 0.1983 -0.9799 0.0209 0.2093 -0.9777 0.0154 0.2093 -0.9777 0.0154 0.2111 -0.9774 0.0141 0.2111 -0.9774 0.0141 0.2138 -0.9768 0.0142 0.2138 -0.9768 0.0142 0.2181 -0.9759 0.0070 0.2181 -0.9759 0.0070 0.2350 -0.9720 0.0043 0.2350 -0.9720 0.0043 0.2350 -0.9720 0.0070 0.2350 -0.9720 0.0070 0.2541 -0.9672 -0.0019 0.2541 -0.9672 -0.0019 0.2855 -0.9579 -0.0306 0.2980 -0.9537 -0.0407 0.2980 -0.9537 -0.0407 0.3390 -0.9397 -0.0462 0.3409 -0.9389 -0.0475 0.3409 -0.9389 -0.0475 0.3311 -0.9412 -0.0667 0.3311 -0.9412 -0.0667 0.3420 -0.9368 -0.0737 0.3420 -0.9368 -0.0736 0.3501 -0.9362 -0.0308 0.3504 -0.9365 0.0128 0.3549 -0.9348 0.0108 0.2527 -0.9675 -0.0081 0.2551 -0.9668 -0.0171 0.2551 -0.9668 -0.0171 0.2242 -0.9734 -0.0471 0.2032 -0.9772 -0.0613 0.1961 -0.9777 -0.0750 0.1816 -0.9801 -0.0796 0.1816 -0.9801 -0.0796 0.1708 -0.9825 -0.0747 0.1709 -0.9825 -0.0746 0.1664 -0.9830 -0.0781 0.1664 -0.9830 -0.0781 0.1670 -0.9842 -0.0588 0.3419 -0.9368 -0.0736 0.3405 -0.9372 -0.0756 0.2768 -0.9529 -0.1239 0.2989 -0.9504 -0.0864 0.3387 -0.9379 -0.0744 0.3405 -0.9372 -0.0758 0.2768 -0.9529 -0.1239 0.2915 -0.9425 -0.1635 0.3260 -0.9272 -0.1845 0.3272 -0.9257 -0.1896 0.3272 -0.9257 -0.1896 0.3428 -0.9200 -0.1900 0.3427 -0.9200 -0.1900 0.3492 -0.9080 -0.2313 0.3444 -0.9045 -0.2516 0.3444 -0.9045 -0.2516 0.3365 -0.8948 -0.2933 0.3340 -0.8933 -0.3008 0.3340 -0.8933 -0.3008 0.3183 -0.8942 -0.3148 0.3340 -0.8933 -0.3008 0.3422 -0.8771 -0.3371 0.2347 -0.7159 -0.6576 0.2532 -0.7376 -0.6259 0.2664 -0.7609 -0.5917 0.2706 -0.7610 -0.5897 0.2706 -0.7610 -0.5897 0.2865 -0.7810 -0.5549 0.2844 -0.8057 -0.5196 0.2982 -0.8157 -0.4957 0.2982 -0.8157 -0.4957 0.3190 -0.8284 -0.4605 0.3333 -0.8430 -0.4222 0.3564 -0.8458 -0.3971 0.3564 -0.8458 -0.3971 0.3574 -0.8496 -0.3879 0.3574 -0.8496 -0.3879 0.3417 -0.8705 -0.3542 0.3422 -0.8771 -0.3371 0.2346 -0.7159 -0.6576 0.2274 -0.6875 -0.6897 0.2268 -0.6836 -0.6937 0.2268 -0.6836 -0.6937 0.2265 -0.6833 -0.6942 0.2265 -0.6833 -0.6942 0.2162 -0.6556 -0.7235 0.2162 -0.6556 -0.7235 0.2163 -0.6531 -0.7257 0.2163 -0.6531 -0.7257 0.2095 -0.6453 -0.7346 0.2095 -0.6453 -0.7346 0.2091 -0.6451 -0.7349 0.2091 -0.6451 -0.7349 0.1982 -0.6325 -0.7487 0.1982 -0.6325 -0.7487 0.1955 -0.6277 -0.7535 0.1955 -0.6277 -0.7535 0.1837 -0.6115 -0.7697 0.1837 -0.6115 -0.7697 0.1837 -0.6109 -0.7701 0.1837 -0.6109 -0.7701 0.1912 -0.5853 -0.7880 0.1911 -0.5853 -0.7880 0.2106 -0.5786 -0.7880 0.2106 -0.5786 -0.7880 0.2244 -0.5677 -0.7921 0.2212 -0.5650 -0.7949 0.2095 -0.5357 -0.8180 0.4609 -0.7867 -0.4107 0.4782 -0.7610 -0.4384 0.4630 -0.7585 -0.4586 0.4630 -0.7585 -0.4586 0.4955 -0.7376 -0.4587 0.4990 -0.7340 -0.4607 0.3574 -0.8496 -0.3878 0.3717 -0.8486 -0.3765 0.3717 -0.8486 -0.3765 0.3743 -0.8498 -0.3712 0.3743 -0.8498 -0.3712 0.3962 -0.8370 -0.3774 0.3962 -0.8370 -0.3774 0.3992 -0.8304 -0.3887 0.4038 -0.8321 -0.3801 0.3992 -0.8304 -0.3887 0.4038 -0.8321 -0.3801 0.4237 -0.8247 -0.3745 0.4237 -0.8247 -0.3745 0.4433 -0.8008 -0.4028 0.4524 -0.7935 -0.4071 0.4254 -0.8221 -0.3785 0.4357 -0.8288 -0.3512 0.4357 -0.8288 -0.3512 0.4459 -0.8296 -0.3362 0.4459 -0.8296 -0.3362 0.4720 -0.8173 -0.3305 0.4720 -0.8173 -0.3305 0.4952 -0.7974 -0.3448 0.3428 -0.9200 -0.1900 0.3557 -0.9149 -0.1910 0.3557 -0.9149 -0.1910 0.3584 -0.9135 -0.1926 0.3584 -0.9135 -0.1926 0.3728 -0.9092 -0.1856 0.3729 -0.9092 -0.1855 0.3734 -0.9092 -0.1841 0.3734 -0.9092 -0.1841 0.3819 -0.9067 -0.1790 0.3819 -0.9067 -0.1790 0.4098 -0.8966 -0.1682 0.4098 -0.8966 -0.1682 0.4095 -0.8943 -0.1804 0.4095 -0.8943 -0.1804 0.4269 -0.8780 -0.2166 0.4292 -0.8767 -0.2172 0.4292 -0.8767 -0.2172 0.4622 -0.8554 -0.2337 0.4770 -0.8408 -0.2558 0.4770 -0.8408 -0.2557 0.4744 -0.8409 -0.2605 0.5032 -0.8165 -0.2830 0.5064 -0.8085 -0.2997 0.4777 -0.8327 -0.2800 0.4744 -0.8409 -0.2605 0.4524 -0.7935 -0.4071 0.4627 -0.7848 -0.4123 0.4952 -0.7974 -0.3448 0.4913 -0.7856 -0.3761 0.5041 -0.7763 -0.3784 0.4913 -0.7857 -0.3760 0.4777 -0.8327 -0.2800 0.5032 -0.8165 -0.2830 0.5250 -0.7183 -0.4566 0.4920 -0.7284 -0.4769 0.4619 -0.7292 -0.5049 0.4447 -0.7172 -0.5366 0.4447 -0.7172 -0.5366 0.4352 -0.7036 -0.5617 0.4626 -0.7297 -0.5035 0.4872 -0.7037 -0.5171 0.5037 -0.6753 -0.5388 0.4960 -0.6674 -0.5555 0.5283 -0.7380 -0.4198 0.5049 -0.7333 -0.4554 0.4991 -0.7339 -0.4607 0.5306 -0.7294 -0.4319 0.5226 -0.7353 -0.4317 0.5306 -0.7294 -0.4319 0.5250 -0.7182 -0.4567 0.5149 -0.8569 0.0232 0.5506 -0.8341 0.0334 0.5521 -0.8331 0.0339 0.5521 -0.8331 0.0339 0.5876 -0.8083 0.0384 0.5977 -0.8008 0.0383 0.5977 -0.8008 0.0383 0.6185 -0.7826 0.0704 0.5116 -0.7726 -0.3759 0.5041 -0.7763 -0.3784 0.5184 -0.7663 -0.3795 0.5116 -0.7726 -0.3760 0.5184 -0.7663 -0.3795 0.5336 -0.7410 -0.4076 0.5336 -0.7410 -0.4076 0.5283 -0.7380 -0.4198 0.4971 -0.7993 -0.3377 0.5001 -0.7957 -0.3417 0.5001 -0.7957 -0.3417 0.4952 -0.7974 -0.3448 0.5064 -0.8086 -0.2997 0.4971 -0.7993 -0.3378 0.5349 -0.8429 0.0583 0.5385 -0.8372 0.0956 0.5829 -0.8072 0.0932 0.5853 -0.8046 0.1004 0.5855 -0.8086 0.0575 0.5829 -0.8072 0.0932 0.5149 -0.8569 0.0232 0.5053 -0.8623 0.0322 0.5012 -0.8631 0.0622 0.5053 -0.8623 0.0322 0.4963 -0.8634 0.0912 0.5012 -0.8631 0.0622 0.4963 -0.8634 0.0911 0.4869 -0.8687 0.0907 0.3446 -0.9386 0.0185 0.3549 -0.9348 0.0108 0.3446 -0.9386 0.0185 0.3444 -0.9383 0.0299 0.3445 -0.9383 0.0299 0.3520 -0.9355 0.0301 0.3521 -0.9355 0.0302 0.3916 -0.9199 0.0211 0.3927 -0.9194 0.0214 0.3765 -0.9251 0.0487 0.3927 -0.9194 0.0213 0.4869 -0.8687 0.0907 0.4573 -0.8870 0.0646 0.4272 -0.9012 0.0736 0.4271 -0.9012 0.0736 0.4374 -0.8987 0.0314 0.4016 -0.9157 0.0132 0.3927 -0.9194 0.0213 0.3839 -0.9216 0.0569 0.3767 -0.9251 0.0487 0.3839 -0.9216 0.0569 0.3780 -0.9230 0.0713 0.3780 -0.9230 0.0713 0.3812 -0.9182 0.1079 0.3494 -0.9309 0.1066 0.3812 -0.9182 0.1079 0.3494 -0.9309 0.1066 0.3376 -0.9334 0.1215 0.3056 -0.9442 0.1229 0.3376 -0.9334 0.1215 0.3056 -0.9442 0.1229 0.2834 -0.9457 0.1594 0.2834 -0.9457 0.1594 0.3007 -0.9331 0.1973 0.3134 -0.9272 0.2054 0.8505 0.5064 -0.1425 0.8659 0.4780 -0.1474 0.8863 0.3401 -0.3143 0.8736 0.3760 -0.3090 0.6756 0.6897 0.2606 0.6851 0.6878 0.2401 0.6882 0.6845 0.2405 0.6851 0.6878 0.2401 0.6882 0.6845 0.2405 0.6898 0.6833 0.2392 0.5710 0.7080 0.4156 0.5695 0.7086 0.4166 0.1529 0.8270 0.5410 0.1418 0.8502 0.5070 0.1348 0.8536 0.5031 -0.0309 0.9105 0.4123 -0.0347 0.9147 0.4025 -0.4663 0.4733 0.7474 -0.4685 0.4729 0.7462 -0.4648 0.4743 0.7477 -0.4663 0.4733 0.7474 0.1717 0.7958 0.5807 0.1697 0.7960 0.5811 0.1602 0.8193 0.5506 0.1529 0.8270 0.5410 0.2074 0.7686 0.6052 0.2179 0.7498 0.6247 -0.2899 0.5762 0.7641 -0.3126 0.5618 0.7659 -0.3904 0.5072 0.7683 -0.4142 0.5021 0.7592 0.0110 -0.9684 0.2492 0.0227 -0.9700 0.2422 0.0227 -0.9700 0.2422 0.0255 -0.9701 0.2414 0.0255 -0.9701 0.2414 0.0256 -0.9705 0.2396 0.0279 -0.9704 0.2397 0.0256 -0.9705 0.2396 0.0332 -0.9700 0.2407 0.0279 -0.9704 0.2397 0.0332 -0.9700 0.2407 0.0338 -0.9703 0.2397 0.0363 -0.9700 0.2403 0.0338 -0.9703 0.2397 0.0363 -0.9700 0.2403 0.0391 -0.9703 0.2388 0.0390 -0.9703 0.2388 0.0376 -0.9718 0.2327 0.0376 -0.9718 0.2327 0.0367 -0.9719 0.2324 0.2482 -0.9687 -0.0019 0.2541 -0.9672 -0.0019 0.2482 -0.9687 -0.0019 0.2483 -0.9687 -0.0031 0.2483 -0.9687 -0.0031 0.2527 -0.9675 -0.0081 0.2032 -0.9772 -0.0613 0.1961 -0.9777 -0.0750 0.2095 -0.5357 -0.8180 0.2227 -0.5298 -0.8183 0.2227 -0.5298 -0.8184 0.2242 -0.5193 -0.8247 0.2226 -0.5299 -0.8183 0.2288 -0.5230 -0.8210 0.5788 -0.8145 0.0406 0.5804 -0.8132 0.0424 0.5488 -0.8352 0.0354 0.5349 -0.8429 0.0583 0.5520 -0.8331 0.0339 0.5488 -0.8352 0.0354 0.5804 -0.8132 0.0424 0.5855 -0.8086 0.0575 0.4869 -0.8688 0.0907 0.4779 -0.8721 0.1057 0.4779 -0.8721 0.1057 0.4794 -0.8698 0.1167 0.4908 -0.8629 0.1207 0.4903 -0.8608 0.1365 0.4902 -0.8608 0.1365 0.4957 -0.8567 0.1428 0.4957 -0.8567 0.1428 0.4946 -0.8563 0.1484 0.4794 -0.8698 0.1167 0.4908 -0.8629 0.1207 0.7760 0.5074 0.3746 0.7498 0.5342 0.3905 0.7476 0.5356 0.3928 0.8227 0.5628 0.0802 0.8095 0.5816 0.0806 0.7403 0.6683 0.0728 0.7113 0.6976 0.0860 0.7051 0.7039 0.0855 0.7051 0.7039 0.0855 0.6817 0.7223 0.1170 0.6627 0.7358 0.1392 0.6798 0.4871 0.5483 0.6826 0.4889 0.5431 0.6826 0.4890 0.5431 0.6830 0.4897 0.5419 0.6830 0.4897 0.5419 0.6836 0.4900 0.5410 0.6836 0.4900 0.5410 0.6841 0.4898 0.5405 0.6841 0.4898 0.5405 0.6849 0.4897 0.5395 0.6854 0.4817 0.5460 0.6798 0.4871 0.5483 0.6849 0.4897 0.5395 0.6870 0.4910 0.5357 0.6870 0.4910 0.5357 0.6948 0.4865 0.5297 0.6948 0.4865 0.5297 0.6950 0.4886 0.5274 0.6950 0.4886 0.5274 0.6944 0.4949 0.5225 0.6944 0.4949 0.5225 0.6992 0.4967 0.5142 0.6992 0.4967 0.5142 0.7051 0.4966 0.5063 0.7051 0.4966 0.5063 0.7129 0.4985 0.4932 0.7138 0.4981 0.4923 0.7020 0.4823 0.5239 0.5824 0.7448 0.3256 0.5763 0.7648 0.2880 0.5754 0.7661 0.2862 0.5013 0.7454 0.4394 0.5006 0.7498 0.4327 0.1717 0.7958 0.5807 0.2057 0.7984 0.5659 0.2137 0.8178 0.5344 0.1697 0.7960 0.5811 0.1602 0.8193 0.5506 0.1697 0.7960 0.5811 0.1602 0.8193 0.5506 -0.4719 0.6333 0.6134 -0.4849 0.6126 0.6242 0.5929 0.1426 0.7926 0.5929 0.1426 0.7926 0.5773 0.1114 0.8089 0.5865 0.1098 0.8025 0.5891 0.1207 0.7990 0.5865 0.1098 0.8025 0.5891 0.1207 0.7990 0.6134 0.1101 0.7820 0.6134 0.1101 0.7820 0.6243 0.1338 0.7697 0.2398 -0.9092 0.3404 0.2407 -0.9086 0.3414 0.2411 -0.9085 0.3414 0.2420 -0.9086 0.3403 0.1742 -0.9711 0.1629 0.1742 -0.9713 0.1619 0.1745 -0.9715 0.1605 0.1742 -0.9713 0.1619 0.1745 -0.9715 0.1605 0.1780 -0.9709 0.1601 0.1780 -0.9709 0.1601 0.1787 -0.9709 0.1596 0.1787 -0.9709 0.1596 0.1795 -0.9714 0.1553 0.1708 -0.9720 0.1612 0.1723 -0.9722 0.1588 0.1723 -0.9722 0.1588 0.1729 -0.9722 0.1581 0.1729 -0.9722 0.1581 0.1743 -0.9720 0.1575 0.1743 -0.9720 0.1575 0.1746 -0.9720 0.1572 0.1746 -0.9720 0.1572 0.1783 -0.9718 0.1545 -0.3777 -0.3277 0.8660 -0.3631 -0.3438 0.8660 -0.3478 -0.3593 0.8660 -0.3318 -0.3741 0.8660 -0.3154 -0.3880 0.8660 -0.2984 -0.4012 0.8660 -0.2806 -0.4139 0.8660 -0.2784 -0.4153 0.8660 -0.2782 -0.4152 0.8661 -0.2873 -0.3930 0.8735 -0.2918 -0.3708 0.8817 -0.2918 -0.3708 0.8817 -0.2854 -0.3406 0.8958 -0.2860 -0.3210 0.9029 -0.2860 -0.3210 0.9029 -0.2802 -0.2935 0.9140 -0.2809 -0.2715 0.9205 -0.2818 -0.2706 0.9205 -0.2818 -0.2706 0.9205 -0.2748 -0.2613 0.9253 -0.2748 -0.2613 0.9253 -0.2608 -0.2482 0.9330 -0.2953 -0.5114 0.8070 -0.2854 -0.5388 0.7926 -0.2736 -0.5655 0.7781 -0.2680 -0.5963 0.7567 -0.2675 -0.5991 0.7547 -0.0542 -0.6018 0.7968 -0.0311 -0.5846 0.8107 -0.0097 -0.5652 0.8249 0.0101 -0.5468 0.8372 0.2268 -0.5457 0.8067 0.2432 -0.5243 0.8161 0.2498 -0.4999 0.8293 0.2498 -0.4999 0.8293 0.2306 -0.4690 0.8526 0.2136 -0.4458 0.8692 0.2098 -0.4472 0.8695 0.2131 -0.4472 0.8687 -0.1168 -0.5496 0.8272 -0.1092 -0.5138 0.8510 -0.1040 -0.4891 0.8660 -0.1175 -0.5546 0.8238 -0.1168 -0.5496 0.8272 -0.1182 -0.5596 0.8203 -0.1175 -0.5546 0.8238 -0.1188 -0.5645 0.8168 -0.1182 -0.5596 0.8203 -0.1188 -0.5645 0.8168 -0.1195 -0.5695 0.8133 -0.1201 -0.5744 0.8097 -0.1195 -0.5695 0.8133 -0.1206 -0.5789 0.8064 -0.1201 -0.5744 0.8097 -0.1214 -0.5842 0.8025 -0.1206 -0.5789 0.8065 -0.1220 -0.5890 0.7988 -0.1214 -0.5841 0.8025 -0.1227 -0.5939 0.7952 -0.1220 -0.5890 0.7989 -0.1233 -0.5987 0.7915 -0.1227 -0.5938 0.7952 -0.1240 -0.6035 0.7877 -0.1233 -0.5986 0.7915 -0.1254 -0.6126 0.7804 -0.1240 -0.6035 0.7877 -0.1261 -0.6173 0.7766 -0.1254 -0.6126 0.7804 -0.1267 -0.6220 0.7727 -0.1261 -0.6173 0.7766 -0.1273 -0.6267 0.7687 -0.1267 -0.6220 0.7727 -0.1279 -0.6314 0.7648 -0.1273 -0.6267 0.7688 -0.1286 -0.6361 0.7608 -0.1279 -0.6315 0.7648 -0.1292 -0.6408 0.7567 -0.1286 -0.6361 0.7608 -0.1293 -0.6432 0.7547 -0.1292 -0.6408 0.7567 -0.2784 -0.4153 0.8660 -0.2602 -0.4270 0.8660 -0.2413 -0.4379 0.8660 -0.2220 -0.4480 0.8660 -0.2025 -0.4571 0.8660 -0.1824 -0.4655 0.8660 -0.1622 -0.4730 0.8660 -0.1414 -0.4796 0.8660 -0.1204 -0.4853 0.8660 -0.0991 -0.4901 0.8660 -0.0779 -0.4939 0.8660 -0.0566 -0.4968 0.8660 -0.0418 -0.4983 0.8660 -0.2953 -0.5114 0.8070 -0.2774 -0.4804 0.8320 -0.2592 -0.4490 0.8551 -0.2500 -0.4330 0.8660 -0.2244 -0.6165 0.7547 -0.2131 -0.5854 0.7822 -0.2012 -0.5528 0.8087 -0.1891 -0.5196 0.8332 -0.1765 -0.4849 0.8566 -0.1710 -0.4699 0.8660 -0.0585 -0.6485 0.7590 -0.0555 -0.6152 0.7864 -0.0542 -0.6018 0.7968 0.1138 -0.6164 0.7792 0.1201 -0.6491 0.7511 0.1228 -0.6635 0.7381 0.1228 -0.6635 0.7381 0.1287 -0.6721 0.7292 0.1477 -0.6764 0.7216 0.1781 -0.6769 0.7142 0.1868 -0.6819 0.7072 0.2424 -0.6334 0.7349 0.2631 -0.6153 0.7431 0.1288 -0.6722 0.7291 0.1477 -0.6764 0.7216 -0.0815 -0.7208 0.6883 -0.0791 -0.6990 0.7108 -0.0834 -0.7206 0.6884 -0.0521 -0.7235 0.6883 -0.0205 -0.7251 0.6884 -0.0155 -0.7252 0.6884 -0.1645 -0.7126 0.6820 -0.1333 -0.7191 0.6820 -0.1080 -0.7233 0.6820 -0.1564 -0.6776 0.7186 -0.1267 -0.6838 0.7186 -0.0970 -0.6886 0.7186 -0.0794 -0.6908 0.7186 -0.0277 -0.6931 0.7203 -0.0274 -0.6857 0.7274 0.2268 -0.5457 0.8067 0.2464 -0.5622 0.7895 0.2464 -0.5622 0.7895 0.2650 -0.5422 0.7974 0.2687 -0.5401 0.7975 0.2690 -0.5418 0.7963 0.2677 -0.5488 0.7920 0.2731 -0.5512 0.7884 0.2723 -0.5522 0.7880 0.3041 -0.6247 0.7192 0.3025 -0.6277 0.7173 0.1131 -0.6127 0.7822 0.1138 -0.6163 0.7792 0.2677 -0.5488 0.7920 0.2731 -0.5511 0.7884 0.2723 -0.5522 0.7880 0.2961 -0.5398 0.7880 0.3194 -0.5263 0.7880 0.3344 -0.5169 0.7880 0.3387 -0.5236 0.7817 0.3344 -0.5169 0.7880 -0.0598 -0.8459 0.5299 -0.0588 -0.8313 0.5527 -0.0591 -0.8365 0.5448 -0.0228 -0.8382 0.5448 -0.0173 -0.8384 0.5448 -0.0247 -0.8568 0.5150 0.0040 -0.8572 0.5150 0.0452 -0.8179 0.5736 0.0773 -0.8155 0.5736 0.0358 -0.8564 0.5150 0.0730 -0.8541 0.5150 0.0746 -0.8539 0.5150 0.1360 -0.7917 0.5955 0.1702 -0.7851 0.5955 0.1966 -0.7789 0.5955 -0.1330 -0.7544 0.6428 -0.1000 -0.7595 0.6428 -0.0708 -0.7628 0.6428 -0.1387 -0.7865 0.6018 -0.1045 -0.7918 0.6018 -0.0698 -0.7956 0.6018 -0.0643 -0.7960 0.6018 -0.0643 -0.7960 0.6018 -0.0624 -0.7732 0.6311 0.1321 -0.7313 0.6691 0.1639 -0.7249 0.6691 0.1874 -0.7191 0.6691 0.1321 -0.7313 0.6691 0.1315 -0.7283 0.6726 0.1267 -0.7587 0.6391 0.1224 -0.7333 0.6688 0.1267 -0.7587 0.6391 0.1405 -0.7562 0.6391 0.1405 -0.7562 0.6391 0.1733 -0.7494 0.6391 0.1888 -0.7456 0.6391 0.1888 -0.7456 0.6391 0.1890 -0.7456 0.6391 0.0412 -0.7448 0.6660 0.0677 -0.7429 0.6660 -0.0647 -0.8013 0.5948 -0.0299 -0.8033 0.5948 -0.0024 -0.8039 0.5948 -0.0647 -0.8013 0.5948 -0.0643 -0.7960 0.6018 0.0081 -0.8038 0.5948 0.0275 -0.8034 0.5948 0.0061 -0.8038 0.5948 0.0071 -0.8038 0.5948 -0.0043 -0.8191 0.5736 0.0259 -0.8187 0.5736 -0.0828 -0.7266 0.6820 -0.0832 -0.7324 0.6758 -0.0762 -0.7554 0.6508 -0.0433 -0.7581 0.6506 -0.0230 -0.7586 0.6511 0.0006 -0.7884 0.6151 0.0020 -0.7891 0.6143 0.0119 -0.8001 0.5998 0.0115 -0.8021 0.5971 0.0036 -0.8109 0.5851 -0.0166 -0.8314 0.5555 -0.0134 -0.8450 0.5346 -0.0134 -0.8450 0.5346 -0.0247 -0.8568 0.5150 -0.0651 -0.8299 0.5541 -0.0641 -0.8050 0.5898 -0.0647 -0.8012 0.5948 0.0259 -0.8188 0.5735 0.0234 -0.8430 0.5375 0.0241 -0.8623 0.5059 0.0453 -0.8179 0.5736 0.0259 -0.8188 0.5735 -0.0024 -0.8039 0.5948 0.0038 -0.8090 0.5878 0.0275 -0.8034 0.5948 0.0622 -0.8001 0.5966 0.0884 -0.7979 0.5963 0.0884 -0.7979 0.5963 0.1230 -0.7937 0.5958 0.1360 -0.7917 0.5955 0.1165 -0.7942 0.5964 0.0866 -0.8094 0.5808 0.0810 -0.8153 0.5734 0.0774 -0.8155 0.5735 0.0985 -0.8132 0.5736 0.0984 -0.8132 0.5736 0.1340 -0.8099 0.5710 0.1649 -0.8139 0.5571 0.0980 -0.8173 0.5678 0.1032 -0.8191 0.5643 0.1069 -0.8219 0.5595 0.1129 -0.8247 0.5542 0.1269 -0.8503 0.5108 0.0898 -0.8554 0.5101 0.0753 -0.8546 0.5138 0.0358 -0.8564 0.5150 0.0375 -0.8628 0.5042 0.0733 -0.8483 0.5244 0.0730 -0.8444 0.5307 0.0707 -0.8373 0.5421 0.0625 -0.8168 0.5736 0.2008 -0.7616 0.6162 0.1899 -0.7653 0.6150 0.1884 -0.7660 0.6146 0.1742 -0.7584 0.6281 0.1748 -0.7596 0.6265 0.1734 -0.7582 0.6286 0.2021 -0.7566 0.6219 0.1934 -0.7434 0.6403 0.1643 -0.7559 0.6338 0.1376 -0.7744 0.6175 0.1108 -0.7852 0.6093 0.1108 -0.7852 0.6093 0.1011 -0.7770 0.6214 0.1108 -0.7851 0.6093 0.0885 -0.7979 0.5963 0.1405 -0.7562 0.6391 0.1414 -0.7619 0.6321 0.0849 -0.7413 0.6657 0.0677 -0.7436 0.6652 0.0677 -0.7429 0.6660 0.0699 -0.7711 0.6328 0.0700 -0.7729 0.6307 0.0323 -0.7458 0.6654 0.0333 -0.7725 0.6341 0.0283 -0.7368 0.6755 -0.0038 -0.7372 0.6757 -0.0082 -0.7371 0.6757 -0.0598 -0.8460 0.5299 -0.0532 -0.8538 0.5179 -0.0573 -0.8642 0.4999 -0.0583 -0.8666 0.4956 -0.1010 -0.8238 0.5578 -0.0946 -0.8254 0.5566 0.0040 -0.8572 0.5151 0.0072 -0.8644 0.5028 -0.1430 -0.8108 0.5676 -0.1096 -0.8226 0.5580 -0.1010 -0.8238 0.5578 -0.0946 -0.8254 0.5566 -0.0589 -0.8313 0.5527 -0.0588 -0.8313 0.5527 -0.0532 -0.8538 0.5179 -0.0573 -0.8642 0.4999 -0.1080 -0.7233 0.6820 -0.0802 -0.7387 0.6692 -0.0771 -0.7502 0.6567 -0.0771 -0.7502 0.6567 -0.0625 -0.7733 0.6310 -0.0230 -0.7586 0.6511 -0.0191 -0.7616 0.6478 -0.0147 -0.7313 0.6819 -0.0182 -0.7601 0.6495 -0.0191 -0.7616 0.6478 -0.0191 -0.7616 0.6478 -0.0039 -0.7863 0.6179 0.0006 -0.7884 0.6151 0.0333 -0.7725 0.6341 0.0269 -0.7896 0.6130 0.0020 -0.7891 0.6143 0.0120 -0.8001 0.5998 0.1250 -0.7484 0.6513 0.1058 -0.7722 0.6265 0.0720 -0.7727 0.6307 0.0656 -0.7778 0.6251 0.0115 -0.8021 0.5971 0.0036 -0.8109 0.5851 0.0655 -0.7778 0.6251 0.0336 -0.7882 0.6145 0.0121 -0.7987 0.6016 0.1414 -0.7619 0.6321 0.1528 -0.7561 0.6364 0.1528 -0.7560 0.6365 0.1742 -0.7584 0.6280 0.1937 -0.7331 0.6519 0.1979 -0.7399 0.6430 0.1927 -0.7477 0.6355 0.1979 -0.7399 0.6430 0.0985 -0.8132 0.5736 0.0980 -0.8173 0.5678 0.1033 -0.8190 0.5644 0.1069 -0.8219 0.5595 0.1129 -0.8247 0.5542 0.1342 -0.8371 0.5303 0.0733 -0.8483 0.5244 0.0753 -0.8546 0.5138 0.0707 -0.8373 0.5421 0.0730 -0.8444 0.5307 0.2280 -0.6654 0.7108 0.2409 -0.6895 0.6830 0.2408 -0.6921 0.6804 0.2116 -0.7032 0.6788 0.2116 -0.7032 0.6788 0.2069 -0.6944 0.6892 0.2116 -0.7032 0.6788 0.2125 -0.7241 0.6562 0.2111 -0.7119 0.6698 0.2340 -0.7136 0.6603 0.2321 -0.7058 0.6693 0.2422 -0.7086 0.6628 0.1981 -0.7240 0.6607 0.2109 -0.7306 0.6494 -0.0148 -0.7303 0.6830 -0.0152 -0.7269 0.6866 -0.0157 -0.7240 0.6896 -0.0160 -0.7225 0.6912 -0.0159 -0.7218 0.6919 -0.0169 -0.7201 0.6937 -0.0265 -0.7137 0.6999 -0.0322 -0.7111 0.7023 -0.0049 -0.6873 0.7264 0.0141 -0.6941 0.7198 0.2025 -0.6774 0.7072 0.2068 -0.6922 0.6914 -0.0798 -0.6921 0.7174 -0.0835 -0.6947 0.7144 -0.0156 -0.7258 0.6877 -0.0153 -0.7269 0.6866 -0.0817 -0.6652 0.7422 -0.0825 -0.6509 0.7547 0.2068 -0.6922 0.6914 0.2069 -0.6944 0.6892 0.1874 -0.7191 0.6691 0.1938 -0.7331 0.6519 0.0141 -0.6941 0.7198 0.0296 -0.7052 0.7084 -0.0148 -0.7303 0.6830 -0.0147 -0.7313 0.6819 -0.0157 -0.7240 0.6896 -0.0156 -0.7258 0.6877 -0.0159 -0.7218 0.6919 -0.0160 -0.7225 0.6912 -0.0264 -0.7137 0.6999 -0.0170 -0.7201 0.6936 -0.0349 -0.7093 0.7040 -0.0322 -0.7112 0.7023 -0.0277 -0.6931 0.7203 -0.0350 -0.7093 0.7041 -0.0834 -0.7206 0.6884 -0.0829 -0.7266 0.6820 -0.0835 -0.6947 0.7144 -0.0791 -0.6990 0.7108 -0.0798 -0.6920 0.7174 -0.0817 -0.6652 0.7422 0.2244 -0.6703 0.7074 0.2213 -0.7005 0.6785 -0.0274 -0.6857 0.7274 -0.0253 -0.6845 0.7286 -0.3885 -0.6730 0.6294 -0.3717 -0.7001 0.6097 -0.3540 -0.7267 0.5887 -0.3413 -0.7447 0.5735 -0.3288 -0.7370 0.5906 -0.3385 -0.7347 0.5879 -0.3385 -0.7347 0.5879 -0.3389 -0.7388 0.5825 -0.3389 -0.7388 0.5824 -0.3394 -0.7418 0.5784 -0.3394 -0.7418 0.5784 -0.3412 -0.7468 0.5709 -0.3413 -0.7468 0.5708 -0.3406 -0.7479 0.5698 -0.3406 -0.7478 0.5699 -0.3400 -0.7504 0.5669 -0.3400 -0.7504 0.5669 -0.3376 -0.7538 0.5637 -0.3376 -0.7538 0.5637 -0.3518 -0.7642 0.5405 -0.3279 -0.6430 0.6921 -0.3134 -0.6157 0.7229 -0.3127 -0.6129 0.7256 -0.2939 -0.6012 0.7431 -0.2877 -0.6317 0.7199 -0.2734 -0.6589 0.7008 -0.2562 -0.6657 0.7009 -0.1871 -0.8077 0.5592 -0.1896 -0.8169 0.5447 -0.1573 -0.7382 0.6560 -0.1630 -0.7654 0.6226 -0.1662 -0.7811 0.6019 -0.1828 -0.7322 0.6561 -0.1759 -0.7037 0.6883 -0.1715 -0.6860 0.7071 -0.1711 -0.6861 0.7071 -0.1637 -0.6555 0.7373 -0.1591 -0.6364 0.7548 -0.2432 -0.8124 0.5299 -0.2417 -0.8150 0.5267 -0.3127 -0.6129 0.7256 -0.3124 -0.6122 0.7264 -0.3788 -0.5794 0.7217 -0.3873 -0.5724 0.7227 -0.3367 -0.6076 0.7193 -0.3645 -0.5954 0.7160 -0.3787 -0.5794 0.7217 -0.3124 -0.6122 0.7264 -0.2982 -0.5843 0.7547 -0.2939 -0.6012 0.7431 -0.2881 -0.5894 0.7547 -0.2711 -0.7043 0.6561 -0.2606 -0.6772 0.6881 -0.2540 -0.6599 0.7071 -0.2540 -0.6599 0.7071 -0.2250 -0.6704 0.7071 -0.1957 -0.6795 0.7071 -0.1711 -0.6861 0.7071 -0.3376 -0.6621 0.6691 -0.3279 -0.6430 0.6921 -0.2711 -0.7043 0.6561 -0.2463 -0.7134 0.6561 -0.2463 -0.7134 0.6561 -0.2150 -0.7234 0.6561 -0.1832 -0.7321 0.6561 -0.1573 -0.7382 0.6560 -0.4179 -0.6145 0.6691 -0.3909 -0.6321 0.6691 -0.3629 -0.6485 0.6691 -0.3345 -0.6636 0.6691 -0.3052 -0.6776 0.6691 -0.2756 -0.6902 0.6691 -0.2669 -0.6936 0.6691 -0.3885 -0.6730 0.6294 -0.3745 -0.6486 0.6626 -0.3716 -0.6436 0.6691 -0.3288 -0.7370 0.5906 -0.3180 -0.7127 0.6252 -0.3065 -0.6872 0.6587 -0.3028 -0.6787 0.6691 -0.2787 -0.8074 0.5200 -0.2711 -0.7852 0.5568 -0.2629 -0.7617 0.5922 -0.2543 -0.7367 0.6266 -0.2463 -0.7134 0.6561 -0.2432 -0.8124 0.5299 -0.2076 -0.8223 0.5299 -0.1917 -0.8261 0.5299 -0.1917 -0.8261 0.5299 -0.1896 -0.8170 0.5446 -0.1871 -0.8077 0.5592 -0.1814 -0.7833 0.5946 -0.1814 -0.7831 0.5948 -0.1814 -0.7831 0.5948 -0.1471 -0.7903 0.5948 -0.1396 -0.7916 0.5948 -0.1430 -0.8108 0.5676 -0.1396 -0.7916 0.5948 -0.1808 -0.7833 0.5948 -0.1797 -0.7782 0.6018 -0.3367 -0.6076 0.7193 -0.3141 -0.6196 0.7194 -0.1684 -0.6747 0.7186 -0.1564 -0.6776 0.7186 -0.1773 -0.7095 0.6820 -0.1645 -0.7126 0.6820 -0.1596 -0.7492 0.6428 -0.1330 -0.7544 0.6428 -0.3254 -0.7293 0.6018 -0.2934 -0.7428 0.6018 -0.2609 -0.7548 0.6018 -0.2277 -0.7655 0.6018 -0.1943 -0.7746 0.6018 -0.1604 -0.7824 0.6018 -0.1387 -0.7865 0.6018 0.3046 -0.6208 0.7224 0.3072 -0.6207 0.7214 0.3200 -0.6194 0.7169 0.3221 -0.6186 0.7167 0.2711 -0.6114 0.7434 0.2655 -0.6138 0.7435 0.0296 -0.7052 0.7084 0.0458 -0.7025 0.7102 0.0418 -0.7056 0.7074 0.0397 -0.7090 0.7041 0.0378 -0.7147 0.6984 0.0371 -0.7173 0.6958 0.0358 -0.7243 0.6885 0.0362 -0.7280 0.6846 0.0378 -0.7323 0.6799 0.0377 -0.7377 0.6741 0.0381 -0.7364 0.6755 0.0356 -0.7365 0.6755 0.0380 -0.7449 0.6661 0.0346 -0.7451 0.6661 0.0362 -0.7441 0.6671 0.0360 -0.7450 0.6661 0.0329 -0.7451 0.6661 0.0321 -0.7455 0.6658 0.0012 -0.6770 0.7360 -0.0006 -0.6800 0.7332 0.0004 -0.6783 0.7348 -0.0011 -0.6783 0.7348 -0.0060 -0.6781 0.7350 -0.0090 -0.6787 0.7344 -0.0152 -0.6815 0.7317 -0.0180 -0.6828 0.7304 -0.0229 -0.6848 0.7284 -0.0253 -0.6845 0.7286 0.0057 -0.6691 0.7432 0.0047 -0.6709 0.7415 0.7834 0.1673 0.5986 0.7834 0.1673 0.5986 0.7836 0.2001 0.5881 0.7836 0.2001 0.5881 0.7852 0.2032 0.5850 0.7852 0.2032 0.5850 0.7227 0.4569 0.5186 0.7247 0.4508 0.5212 0.7247 0.4508 0.5212 0.7329 0.4367 0.5216 0.7329 0.4367 0.5216 0.7383 0.4313 0.5186 0.7383 0.4313 0.5186 0.7509 0.4167 0.5124 0.7390 0.4901 0.4623 0.7426 0.5151 0.4280 0.7474 0.5370 0.3913 0.7415 0.5566 0.3747 0.7509 0.4167 0.5124 0.7624 0.3821 0.5223 0.7706 0.3618 0.5246 0.7390 0.4901 0.4623 0.7370 0.4741 0.4818 0.7370 0.4741 0.4818 0.7301 0.4666 0.4993 0.7706 0.3618 0.5246 0.7754 0.3272 0.5401 0.7911 0.2941 0.5363 0.8030 0.2945 0.5182 0.8030 0.2945 0.5182 0.8170 0.2601 0.5146 0.8181 0.2248 0.5293 0.8184 0.1894 0.5425 0.8202 0.1673 0.5471 0.8202 0.1673 0.5471 0.8012 0.1572 0.5774 0.8012 0.1572 0.5774 0.7837 0.1340 0.6065 0.7902 0.1198 0.6010 0.7902 0.1198 0.6010 0.7913 0.1040 0.6025 0.7913 0.1040 0.6025 0.7976 0.0699 0.5992 0.8022 0.0353 0.5960 0.8019 0.0323 0.5966 0.8019 0.0323 0.5966 0.8107 0.0000 0.5855 0.9952 0.0000 0.0979 0.9941 0.0208 0.1063 0.9941 0.0208 0.1063 0.9914 0.0633 0.1144 0.9918 0.0953 0.0849 0.9878 0.1347 0.0788 0.9878 0.1347 0.0788 0.9851 0.1558 0.0735 0.9851 0.1558 0.0735 0.9845 0.1703 0.0410 0.9845 0.1703 0.0410 0.9852 0.1703 0.0175 0.9852 0.1703 0.0175 0.9873 0.1584 -0.0120 0.9873 0.1584 -0.0120 0.9857 0.1660 -0.0281 0.9852 0.1664 -0.0406 0.9788 0.1931 -0.0688 0.9857 0.1660 -0.0281 0.9852 0.1664 -0.0406 0.9788 0.1931 -0.0688 0.9744 0.2073 -0.0875 0.9725 0.2102 -0.1007 0.9686 0.2268 -0.1021 0.9352 0.1946 -0.2958 0.9449 0.2055 -0.2548 0.9503 0.2192 -0.2211 0.9744 0.2073 -0.0875 0.9725 0.2102 -0.1007 0.9686 0.2268 -0.1021 0.9626 0.2289 -0.1452 0.9609 0.2244 -0.1622 0.9609 0.2244 -0.1622 0.9508 0.2334 -0.2036 0.9503 0.2192 -0.2211 0.9352 0.1946 -0.2958 0.9194 0.2081 -0.3337 0.9018 0.2240 -0.3696 0.8932 0.2315 -0.3856 0.8932 0.2315 -0.3856 0.8905 0.2294 -0.3929 0.8905 0.2294 -0.3929 0.8717 0.2313 -0.4321 0.8504 0.2389 -0.4688 0.8421 0.2492 -0.4783 0.8421 0.2492 -0.4783 0.8187 0.2591 -0.5125 0.7947 0.2600 -0.5486 0.7830 0.2619 -0.5642 0.7830 0.2619 -0.5642 0.7707 0.2957 -0.5644 0.7604 0.3300 -0.5593 0.7468 0.3595 -0.5596 0.7468 0.3595 -0.5596 0.7409 0.3935 -0.5443 0.7400 0.4255 -0.5208 0.7427 0.4474 -0.4982 0.7427 0.4474 -0.4982 0.7446 0.4760 -0.4680 0.7492 0.4845 -0.4516 0.7492 0.4845 -0.4516 0.7484 0.5128 -0.4207 0.7479 0.5137 -0.4203 0.7479 0.5137 -0.4203 0.7518 0.5361 -0.3838 0.7638 0.5372 -0.3579 0.7638 0.5372 -0.3579 0.7631 0.5596 -0.3233 0.7323 0.6307 -0.2568 0.7426 0.6345 -0.2146 0.7484 0.6378 -0.1819 0.7631 0.5596 -0.3233 0.7515 0.5897 -0.2958 0.7345 0.6212 -0.2732 0.7323 0.6307 -0.2568 0.7484 0.6378 -0.1819 0.7653 0.6275 -0.1431 0.7748 0.6242 -0.1007 0.7723 0.6300 -0.0814 0.7723 0.6300 -0.0814 0.7597 0.6488 -0.0442 0.7480 0.6631 -0.0292 0.7480 0.6631 -0.0292 0.7326 0.6806 0.0000 0.7326 0.6806 0.0000 0.7100 0.7036 0.0293 0.6841 0.7273 0.0550 0.6741 0.7354 0.0687 0.6741 0.7354 0.0687 0.6533 0.7499 0.1041 0.6430 0.7552 0.1273 0.6430 0.7552 0.1273 0.6230 0.7647 0.1647 0.6134 0.7687 0.1814 0.6134 0.7687 0.1814 0.6428 0.7407 0.1953 0.6444 0.7394 0.1950 0.6444 0.7394 0.1950 0.6765 0.7126 0.1857 0.7070 0.6825 0.1851 0.7134 0.6717 0.1996 0.7134 0.6717 0.1996 0.7120 0.6668 0.2200 0.7430 0.5934 0.3096 0.7430 0.6051 0.2860 0.7120 0.6668 0.2200 0.7273 0.6394 0.2494 0.7278 0.6383 0.2510 0.7278 0.6383 0.2510 0.7441 0.6082 0.2764 0.7430 0.6051 0.2860 0.7415 0.5566 0.3747 0.7501 0.5706 0.3344 0.7430 0.5934 0.3096 0.7140 0.4721 0.5171 0.7140 0.4721 0.5171 0.7152 0.4690 0.5183 0.7152 0.4690 0.5183 0.8059 0.1607 0.5698 0.8059 0.1607 0.5698 0.8156 0.1594 0.5563 0.8156 0.1594 0.5563 0.9949 0.0981 -0.0248 0.9949 0.0981 -0.0248 0.9932 0.1164 0.0071 0.9932 0.1164 0.0071 0.9912 0.1292 0.0295 0.9912 0.1292 0.0295 0.9858 0.1547 0.0654 0.9858 0.1547 0.0654 0.9373 0.1950 -0.2889 0.9373 0.1950 -0.2889 0.7539 0.4891 -0.4386 0.7539 0.4891 -0.4386 0.7566 0.5392 -0.3700 0.7566 0.5392 -0.3700 0.7136 0.6722 -0.1973 0.7136 0.6722 -0.1973 0.7071 0.6746 -0.2121 0.7071 0.6746 -0.2121 0.7007 0.6816 -0.2107 0.7007 0.6816 -0.2107 0.6887 0.6910 -0.2194 0.6887 0.6910 -0.2194 0.6863 0.6931 -0.2207 0.6863 0.6931 -0.2207 0.6799 0.7151 -0.1623 0.6799 0.7151 -0.1623 0.8377 0.5449 -0.0374 0.8377 0.5449 -0.0373 0.7617 0.6329 -0.1388 0.7617 0.6329 -0.1388 0.7709 0.6285 -0.1035 0.7709 0.6285 -0.1035 0.7660 0.6358 -0.0948 0.7660 0.6358 -0.0948 0.8467 0.5320 -0.0094 0.8467 0.5320 -0.0094 0.7678 0.6367 -0.0710 0.7678 0.6367 -0.0710 0.7541 0.6556 -0.0384 0.7541 0.6556 -0.0384 0.7380 0.6188 0.2690 0.7380 0.6188 0.2690 0.6752 0.6367 -0.3725 0.6724 0.6595 -0.3360 0.6863 0.6635 -0.2981 0.5260 0.7713 -0.3583 0.5260 0.7713 -0.3583 0.6557 0.7102 -0.2563 0.6404 0.7346 -0.2242 0.6383 0.7414 -0.2070 0.6158 0.7382 -0.2755 0.6181 0.7203 -0.3149 0.6196 0.7008 -0.3536 0.6194 0.6985 -0.3583 0.5618 0.8239 -0.0746 0.5618 0.8239 -0.0746 0.5651 0.8212 -0.0793 0.5651 0.8212 -0.0793 0.5508 0.8254 -0.1239 0.5508 0.8254 -0.1239 0.5425 0.8207 -0.1793 0.5425 0.8207 -0.1793 0.5420 0.8208 -0.1805 0.5420 0.8208 -0.1805 0.5010 0.7941 -0.3440 0.5010 0.7941 -0.3440 0.6357 0.6398 -0.4319 0.6621 0.6341 -0.3994 0.6752 0.6367 -0.3725 0.6863 0.6634 -0.2982 0.6679 0.6923 -0.2731 0.6557 0.7102 -0.2563 0.6383 0.7414 -0.2070 0.6204 0.7446 -0.2464 0.6158 0.7382 -0.2755 0.6194 0.6985 -0.3583 0.6176 0.6790 -0.3969 0.6273 0.6513 -0.4268 0.6357 0.6398 -0.4319 0.4205 0.8425 -0.3367 0.4205 0.8425 -0.3367 0.6482 0.7254 -0.2317 0.6482 0.7254 -0.2317 0.6166 0.7304 -0.2938 0.6166 0.7304 -0.2938 0.7673 0.4960 0.4065 0.7918 0.4822 0.3748 0.7973 0.4795 0.3666 0.7973 0.4796 0.3666 0.7719 0.4998 0.3929 0.7673 0.4960 0.4065 0.9878 0.0042 0.1557 0.9936 0.0023 0.1125 0.9939 0.0000 0.1104 0.9929 0.0000 0.1191 0.9914 0.0000 0.1306 0.9913 0.0000 0.1313 0.9913 0.0000 0.1317 0.9907 0.0000 0.1358 0.9908 0.0000 0.1355 0.9908 0.0000 0.1352 0.9908 0.0011 0.1352 0.9908 0.0011 0.1352 0.9878 0.0042 0.1557 0.9778 0.0707 0.1972 0.9778 0.0708 0.1971 0.9561 0.2406 0.1672 0.9561 0.2406 0.1672 0.9402 0.2550 0.2257 0.9402 0.2550 0.2257 0.9608 0.2673 -0.0733 0.9608 0.2673 -0.0733 0.8612 0.5079 0.0176 0.8612 0.5079 0.0176 0.8718 0.4841 -0.0751 0.8619 0.4965 -0.1032 0.8619 0.4965 -0.1032 0.8488 0.5091 -0.1428 0.8552 0.4997 -0.1372 0.8552 0.4997 -0.1373 0.8675 0.4879 -0.0972 0.8718 0.4841 -0.0751 0.7867 0.3626 -0.4996 0.7867 0.3626 -0.4996 0.7766 0.3713 -0.5089 0.7766 0.3713 -0.5089 0.8474 0.4321 -0.3086 0.8474 0.4321 -0.3086 0.8274 0.4925 -0.2697 0.8274 0.4925 -0.2697 0.7842 0.5515 -0.2844 0.7842 0.5515 -0.2844 0.8179 0.5501 -0.1685 0.8102 0.5467 -0.2113 0.7914 0.5586 -0.2484 0.8024 0.5600 -0.2062 0.8029 0.5614 -0.2005 0.8029 0.5614 -0.2005 0.8179 0.5502 -0.1685 0.7906 0.5588 -0.2505 0.7906 0.5588 -0.2505 0.8511 0.5239 -0.0357 0.8457 0.5337 0.0008 0.8457 0.5337 0.0008 0.8272 0.5619 -0.0033 0.8272 0.5619 -0.0033 0.8338 0.5503 -0.0446 0.8338 0.5503 -0.0446 0.8511 0.5239 -0.0357 0.8425 0.5381 0.0247 0.8425 0.5381 0.0247 0.8451 0.5339 0.0290 0.8451 0.5339 0.0290 0.8046 0.5883 0.0810 0.8046 0.5883 0.0810 0.7789 0.5939 0.2016 0.7789 0.5939 0.2016 0.8064 0.5574 0.1973 0.8064 0.5574 0.1973 0.6558 0.4751 0.5867 0.6739 0.4449 0.5899 0.6798 0.4382 0.5881 0.6798 0.4382 0.5881 0.6958 0.4070 0.5917 0.7038 0.3841 0.5976 0.7038 0.3841 0.5976 0.7035 0.3519 0.6175 0.6934 0.3393 0.6357 0.6934 0.3393 0.6357 0.6700 0.3622 0.6480 0.6496 0.3793 0.6588 0.6496 0.3793 0.6588 0.6270 0.4024 0.6671 0.6077 0.4259 0.6703 0.6077 0.4259 0.6703 0.5991 0.4567 0.6576 0.5799 0.4833 0.6559 0.5784 0.4853 0.6557 0.6635 0.4803 0.5736 0.6558 0.4751 0.5867 0.6635 0.4802 0.5737 0.6658 0.4832 0.5685 0.6658 0.4832 0.5685 0.6854 0.4817 0.5460 0.6854 0.4817 0.5460 0.7020 0.4823 0.5239 0.7020 0.4823 0.5239 0.7064 0.4804 0.5199 0.7064 0.4804 0.5199 0.7204 0.4637 0.5157 0.7204 0.4637 0.5157 0.7230 0.4572 0.5179 0.7301 0.4666 0.4993 0.7337 0.4868 0.4740 0.7337 0.4868 0.4740 0.7238 0.4978 0.4778 0.7238 0.4978 0.4778 0.7129 0.4985 0.4932 0.7129 0.4985 0.4932 0.7128 0.4987 0.4931 0.7128 0.4987 0.4931 0.7143 0.4994 0.4903 0.7143 0.4994 0.4903 0.7249 0.5021 0.4716 0.7249 0.5021 0.4716 0.7214 0.5095 0.4689 0.7214 0.5095 0.4689 0.7223 0.5365 0.4365 0.7204 0.5597 0.4095 0.7204 0.5597 0.4095 0.7207 0.5837 0.3741 0.7217 0.5964 0.3513 0.7217 0.5964 0.3513 0.7126 0.6241 0.3204 0.7038 0.6497 0.2872 0.7080 0.6621 0.2457 0.7092 0.6666 0.2297 0.7092 0.6666 0.2297 0.6792 0.6967 0.2309 0.6475 0.7225 0.2423 0.6328 0.7327 0.2506 0.6328 0.7326 0.2506 0.5998 0.7553 0.2642 0.5683 0.7707 0.2881 0.5472 0.7841 0.2928 0.5472 0.7841 0.2928 0.5174 0.7929 0.3219 0.5006 0.7953 0.3421 0.5005 0.7953 0.3421 0.4901 0.7990 0.3484 0.4901 0.7990 0.3484 0.4643 0.7988 0.3825 0.4891 0.7734 0.4032 0.5006 0.7498 0.4326 0.6688 0.4611 0.5831 0.6688 0.4611 0.5831 0.6870 0.3352 0.6447 0.6870 0.3352 0.6447 0.6928 0.3442 0.6337 0.6928 0.3442 0.6337 0.7021 0.3449 0.6230 0.7021 0.3449 0.6230 0.7091 0.3514 0.6112 0.7091 0.3514 0.6112 0.7039 0.3597 0.6125 0.7039 0.3597 0.6125 0.7113 0.3630 0.6019 0.7113 0.3630 0.6019 0.7106 0.3677 0.5998 0.7106 0.3677 0.5998 0.7094 0.3750 0.5967 0.7094 0.3750 0.5967 0.7089 0.3802 0.5940 0.7089 0.3802 0.5940 0.7210 0.3710 0.5852 0.7210 0.3710 0.5852 0.7122 0.6382 0.2924 0.7122 0.6382 0.2924 0.7139 0.6373 0.2903 0.7139 0.6373 0.2903 0.6004 0.7711 0.2120 0.6004 0.7711 0.2120 0.5830 0.7829 0.2172 0.5830 0.7829 0.2172 0.5324 0.7909 0.3017 0.5324 0.7909 0.3017 0.6526 0.4324 0.6223 0.6526 0.4324 0.6223 0.5789 0.5269 0.6223 0.5789 0.5269 0.6223 0.7276 0.4600 0.5089 0.7276 0.4600 0.5089 0.7282 0.4619 0.5063 0.7282 0.4619 0.5063 0.7230 0.4572 0.5179 0.7258 0.4592 0.5122 0.7258 0.4592 0.5122 0.7276 0.4600 0.5089 0.7278 0.4601 0.5085 0.7285 0.4615 0.5063 0.7285 0.4654 0.5027 0.7301 0.4666 0.4993 0.2203 0.6078 -0.7629 0.2203 0.6078 -0.7629 0.1736 0.5764 -0.7985 0.1736 0.5764 -0.7985 0.5803 0.0340 -0.8137 0.5803 0.0340 -0.8137 -0.5968 0.0769 0.7987 -0.5968 0.0769 0.7987 0.6235 0.3432 0.7024 0.6122 0.3486 0.7097 0.5475 0.1952 0.8137 0.5512 0.1898 0.8125 0.1913 0.0815 0.9782 0.1913 0.0815 0.9782 0.1889 0.0763 0.9790 0.1889 0.0763 0.9790 0.1522 0.0705 0.9858 0.1699 0.0706 0.9829 0.1713 0.0626 0.9832 0.1573 0.0650 0.9854 0.1522 0.0705 0.9858 0.1784 0.0336 0.9834 0.1938 0.0445 0.9800 0.1867 0.0515 0.9811 0.2220 0.0660 0.9728 0.1962 0.0659 0.9783 0.1837 0.0705 0.9805 0.1717 0.0580 0.9834 0.1659 0.0483 0.9850 0.1786 0.0439 0.9829 0.1739 0.0350 0.9841 0.1784 0.0336 0.9834 0.5511 0.1924 0.8119 0.5511 0.1924 0.8119 0.5737 0.7040 0.4186 0.5767 0.6796 0.4535 0.5830 0.6571 0.4779 0.5006 0.7498 0.4327 0.5013 0.7454 0.4394 0.5013 0.7454 0.4394 0.5313 0.7409 0.4108 0.5641 0.7187 0.4066 0.5694 0.7087 0.4166 0.5694 0.7087 0.4166 0.5737 0.7040 0.4186 0.5830 0.6571 0.4779 0.5800 0.6429 0.5002 0.5800 0.6429 0.5002 0.5736 0.6492 0.4994 0.5736 0.6492 0.4994 0.5512 0.6779 0.4864 0.5517 0.6877 0.4718 0.5517 0.6877 0.4718 0.5307 0.7161 0.4534 0.4988 0.7381 0.4544 0.4872 0.7447 0.4561 0.4872 0.7447 0.4562 0.4681 0.7712 0.4315 0.4360 0.7934 0.4248 0.4302 0.7960 0.4257 0.4302 0.7960 0.4257 0.3945 0.8123 0.4296 0.3605 0.8267 0.4320 0.3605 0.8267 0.4320 0.3490 0.8438 0.4078 0.3490 0.8438 0.4078 0.3476 0.8454 0.4056 0.3476 0.8454 0.4056 0.3446 0.8468 0.4053 0.3446 0.8468 0.4053 0.3422 0.8475 0.4057 0.3422 0.8475 0.4057 0.3399 0.8497 0.4031 0.3399 0.8497 0.4031 0.3284 0.8651 0.3790 0.3284 0.8651 0.3790 0.3008 0.8851 0.3551 0.2894 0.8868 0.3604 0.2894 0.8868 0.3604 0.2753 0.9032 0.3291 0.2753 0.9032 0.3291 0.2753 0.9172 0.2879 0.2604 0.9325 0.2503 0.2588 0.9341 0.2461 0.2589 0.9340 0.2460 0.2477 0.9467 0.2059 0.2315 0.9582 0.1679 0.2319 0.9581 0.1681 0.2336 0.9578 0.1678 0.2319 0.9581 0.1681 0.2315 0.9582 0.1679 0.2336 0.9578 0.1678 0.2037 0.9674 0.1505 0.2037 0.9674 0.1505 0.1838 0.9670 0.1763 0.1838 0.9670 0.1763 0.1669 0.9620 0.2160 0.1656 0.9536 0.2514 0.1656 0.9536 0.2514 0.1357 0.9498 0.2819 0.1045 0.9448 0.3104 0.0972 0.9443 0.3145 0.0972 0.9443 0.3145 0.0639 0.9384 0.3395 0.0359 0.9285 0.3697 0.0310 0.9251 0.3784 0.0311 0.9251 0.3784 0.0156 0.9276 0.3733 0.0156 0.9276 0.3733 0.0003 0.9241 0.3822 0.0003 0.9241 0.3822 -0.0076 0.9166 0.3998 -0.0076 0.9166 0.3998 -0.0326 0.9293 0.3680 -0.0358 0.9320 0.3607 -0.0358 0.9320 0.3607 -0.0656 0.9409 0.3321 -0.0669 0.9409 0.3319 -0.0644 0.9422 0.3288 -0.0637 0.9419 0.3298 -0.0669 0.9409 0.3319 -0.0740 0.9539 0.2909 -0.0802 0.9571 0.2783 -0.0802 0.9571 0.2783 -0.1143 0.9471 0.2999 -0.1143 0.9471 0.2999 -0.1312 0.9564 0.2611 -0.1433 0.9625 0.2304 -0.1433 0.9625 0.2304 -0.1468 0.9712 0.1878 -0.1495 0.9723 0.1796 -0.1495 0.9723 0.1796 -0.1560 0.9782 0.1370 -0.1747 0.9782 0.1118 -0.2083 0.9720 0.1086 -0.1775 0.9742 0.1391 -0.1608 0.9740 0.1597 -0.1608 0.9740 0.1597 -0.1654 0.9653 0.2022 -0.1692 0.9581 0.2311 -0.1689 0.9581 0.2313 -0.1903 0.9570 0.2191 -0.1903 0.9570 0.2191 -0.2189 0.9547 0.2018 -0.1747 0.9782 0.1118 -0.1880 0.9796 0.0703 -0.2155 0.9758 0.0368 -0.2173 0.9755 0.0356 -0.2173 0.9755 0.0356 -0.2322 0.9708 0.0611 -0.2322 0.9708 0.0611 -0.2164 0.9710 0.1017 -0.2083 0.9720 0.1086 -0.2189 0.9547 0.2018 -0.2453 0.9524 0.1809 -0.2453 0.9524 0.1809 -0.2524 0.9544 0.1597 -0.2524 0.9544 0.1597 -0.2746 0.9475 0.1635 -0.2746 0.9475 0.1635 -0.2805 0.9424 0.1819 -0.2806 0.9424 0.1819 -0.3182 0.9275 0.1961 -0.3223 0.9192 0.2263 -0.3223 0.9192 0.2263 -0.3078 0.9133 0.2668 -0.2814 0.9139 0.2926 -0.2814 0.9139 0.2926 -0.2544 0.9106 0.3256 -0.2664 0.8993 0.3470 -0.2664 0.8993 0.3470 -0.2872 0.8847 0.3672 -0.3762 0.8437 0.3828 -0.3789 0.8423 0.3835 -0.2872 0.8847 0.3672 -0.3176 0.8749 0.3657 -0.3176 0.8749 0.3657 -0.3363 0.8676 0.3662 -0.3363 0.8676 0.3662 -0.3701 0.8484 0.3784 -0.3751 0.8441 0.3830 -0.3751 0.8441 0.3830 -0.3762 0.8437 0.3829 -0.3789 0.8423 0.3835 -0.3833 0.8410 0.3819 -0.3833 0.8410 0.3819 -0.4139 0.8191 0.3972 -0.4244 0.8053 0.4141 -0.4244 0.8052 0.4141 -0.4433 0.7803 0.4412 -0.4485 0.7595 0.4712 -0.4484 0.7595 0.4712 -0.4341 0.7474 0.5029 -0.4341 0.7474 0.5029 -0.4403 0.7210 0.5350 -0.4127 0.7143 0.5652 -0.4068 0.7160 0.5673 -0.4318 0.6314 0.6441 -0.4583 0.6429 0.6138 -0.4720 0.6333 0.6134 -0.4849 0.6126 0.6241 -0.4820 0.5836 0.6536 -0.4823 0.5609 0.6729 -0.4719 0.6333 0.6134 -0.4850 0.6467 0.5886 -0.4851 0.6467 0.5886 -0.5137 0.6366 0.5752 -0.5137 0.6366 0.5752 -0.4994 0.6149 0.6103 -0.4849 0.6126 0.6241 -0.4823 0.5609 0.6729 -0.5028 0.5362 0.6779 -0.5145 0.5071 0.6915 -0.5149 0.4762 0.7128 -0.5111 0.4456 0.7350 -0.5082 0.4239 0.7497 -0.5082 0.4239 0.7497 -0.4867 0.3987 0.7773 -0.4675 0.3733 0.8013 -0.4675 0.3733 0.8013 -0.4420 0.3829 0.8112 -0.4204 0.3970 0.8158 -0.4101 0.3668 0.8350 -0.4107 0.3398 0.8461 -0.4061 0.3120 0.8589 -0.4170 0.2925 0.8605 -0.4309 0.2751 0.8595 -0.4362 0.2529 0.8636 -0.4558 0.2394 0.8573 -0.4584 0.2261 0.8595 -0.4583 0.2261 0.8596 -0.4464 0.2007 0.8720 -0.4392 0.1769 0.8808 -0.4612 0.1650 0.8718 -0.4535 0.1420 0.8799 -0.4453 0.1198 0.8874 -0.4481 0.1148 0.8866 -0.4481 0.1146 0.8866 -0.4641 0.1369 0.8752 -0.4746 0.1602 0.8655 -0.4876 0.1846 0.8533 -0.4900 0.2091 0.8463 -0.5139 0.2329 0.8256 -0.5475 0.2431 0.8007 -0.5729 0.2292 0.7869 -0.5641 0.2231 0.7950 -0.5642 0.2231 0.7950 -0.5496 0.1967 0.8120 -0.5310 0.1720 0.8297 -0.4969 0.1588 0.8532 -0.4816 0.1439 0.8645 -0.4816 0.1439 0.8645 -0.4801 0.1214 0.8687 -0.4808 0.0997 0.8711 -0.4870 0.0791 0.8698 -0.4754 0.0577 0.8779 -0.4660 0.0371 0.8840 -0.4555 0.0240 0.8899 -0.4554 0.0241 0.8899 -0.4598 0.0044 0.8880 -0.4329 0.0180 0.9013 -0.4253 0.0360 0.9043 -0.4267 0.0175 0.9042 -0.4215 0.0000 0.9068 -0.3587 0.0000 0.9335 -0.3486 0.0147 0.9371 -0.3431 0.0293 0.9388 -0.3426 0.0376 0.9387 -0.3426 0.0375 0.9387 -0.3370 0.0517 0.9401 -0.3493 0.0681 0.9345 -0.3402 0.0816 0.9368 -0.3325 0.0951 0.9383 -0.3336 0.1112 0.9361 -0.3087 0.1157 0.9441 -0.2983 0.1267 0.9460 -0.2942 0.1403 0.9454 -0.2884 0.1533 0.9452 -0.2867 0.1547 0.9455 -0.2867 0.1546 0.9454 -0.2702 0.1606 0.9493 -0.2562 0.1675 0.9520 -0.2485 0.1784 0.9521 -0.2540 0.1660 0.9529 -0.2425 0.1739 0.9544 -0.2335 0.1833 0.9549 -0.2292 0.1965 0.9533 -0.2336 0.2169 0.9478 -0.2301 0.2182 0.9484 -0.2301 0.2182 0.9484 -0.2219 0.2296 0.9477 -0.2170 0.2446 0.9450 -0.1994 0.2447 0.9489 -0.1813 0.2421 0.9532 -0.1683 0.2463 0.9545 -0.1546 0.2488 0.9561 -0.1429 0.2538 0.9566 -0.1278 0.2514 0.9594 -0.1171 0.2572 0.9592 -0.1221 0.2731 0.9542 -0.1221 0.2731 0.9542 -0.1044 0.2598 0.9600 -0.0945 0.2682 0.9587 -0.0844 0.2772 0.9571 -0.0905 0.2592 0.9616 -0.0977 0.2457 0.9644 -0.0991 0.2239 0.9696 -0.0850 0.2154 0.9728 -0.0749 0.2169 0.9733 -0.0666 0.2238 0.9723 -0.0547 0.2167 0.9747 -0.0447 0.2162 0.9753 -0.0378 0.2307 0.9723 -0.0452 0.2520 0.9667 -0.0453 0.2519 0.9667 -0.0329 0.2384 0.9706 -0.0224 0.2382 0.9710 -0.0123 0.2420 0.9702 -0.0020 0.2486 0.9686 0.0089 0.2569 0.9664 0.0194 0.2829 0.9589 0.0164 0.2920 0.9563 0.0164 0.2921 0.9563 0.0274 0.2791 0.9599 0.0396 0.2788 0.9595 0.0356 0.3117 0.9495 0.0404 0.3382 0.9402 0.0404 0.3382 0.9402 0.0471 0.3094 0.9498 0.0582 0.2972 0.9530 0.0722 0.3003 0.9511 0.0639 0.3204 0.9451 0.0734 0.3160 0.9459 0.0734 0.3160 0.9459 0.0756 0.2853 0.9555 0.0926 0.3043 0.9481 0.0990 0.3429 0.9342 0.0839 0.3459 0.9345 0.0767 0.3725 0.9249 0.0725 0.3746 0.9243 0.0725 0.3746 0.9243 0.0827 0.3537 0.9317 0.0991 0.3542 0.9299 0.1184 0.3786 0.9179 0.1361 0.3770 0.9162 0.1350 0.3689 0.9196 0.1350 0.3689 0.9196 0.1169 0.3675 0.9226 0.1029 0.3297 0.9384 0.0896 0.2909 0.9526 0.0930 0.2788 0.9558 0.0930 0.2788 0.9558 0.1059 0.2771 0.9550 0.1250 0.2952 0.9472 0.1319 0.3310 0.9344 0.1345 0.3442 0.9292 0.1345 0.3442 0.9292 0.1443 0.3280 0.9336 0.1537 0.3130 0.9372 0.1655 0.3029 0.9385 0.1880 0.3167 0.9297 0.1998 0.3056 0.9309 0.2016 0.3045 0.9309 0.2016 0.3045 0.9309 0.2179 0.3003 0.9286 0.2282 0.2874 0.9302 0.2466 0.2849 0.9263 0.2690 0.2869 0.9194 0.2732 0.2833 0.9193 0.2732 0.2833 0.9193 0.2622 0.2552 0.9307 0.2914 0.2828 0.9138 0.3017 0.2683 0.9149 0.3020 0.2685 0.9147 0.3020 0.2685 0.9147 0.3304 0.2747 0.9030 0.3342 0.2549 0.9074 0.3480 0.2685 0.8982 0.3480 0.2685 0.8982 0.3534 0.2493 0.9016 0.3344 0.2224 0.9158 0.3298 0.2049 0.9215 0.3298 0.2049 0.9215 0.3271 0.2232 0.9182 0.3222 0.2407 0.9156 0.3136 0.2561 0.9144 0.2879 0.2382 0.9276 0.2879 0.2382 0.9276 0.2878 0.2187 0.9324 0.2912 0.2022 0.9351 0.2971 0.1877 0.9362 0.2968 0.1768 0.9384 0.4345 0.2297 0.8709 0.4563 0.2181 0.8627 0.4586 0.2178 0.8615 0.4586 0.2178 0.8615 0.4865 0.2196 0.8456 0.4864 0.2196 0.8457 0.4976 0.1992 0.8442 0.5325 0.2063 0.8209 0.5475 0.1952 0.8137 -0.4023 0.6422 0.6525 -0.3910 0.6468 0.6548 -0.3659 0.6944 0.6196 -0.3957 0.6919 0.6039 -0.4023 0.6422 0.6525 -0.4319 0.6314 0.6441 -0.3659 0.6944 0.6196 -0.3796 0.6663 0.6419 -0.3910 0.6468 0.6548 -0.4067 0.7160 0.5674 -0.4137 0.6878 0.5965 -0.3957 0.6919 0.6039 0.6122 0.3486 0.7097 0.6027 0.3499 0.7171 0.6079 0.3469 0.7142 0.6027 0.3499 0.7171 0.6027 0.3499 0.7171 0.5875 0.3557 0.7269 0.5875 0.3557 0.7269 0.5772 0.3840 0.7207 0.5732 0.4144 0.7069 0.5644 0.3994 0.7224 0.5644 0.3994 0.7224 0.5393 0.4159 0.7323 0.5426 0.4200 0.7274 0.5426 0.4200 0.7274 0.5590 0.4463 0.6988 0.5556 0.4698 0.6860 0.5556 0.4698 0.6860 0.5784 0.4853 0.6557 0.4830 0.8012 0.3533 0.4830 0.8012 0.3533 0.5378 0.7365 0.4104 0.5378 0.7365 0.4104 0.5427 0.7314 0.4129 0.5427 0.7314 0.4129 0.5705 0.6921 0.4421 0.5705 0.6921 0.4421 0.5775 0.6456 0.4997 0.5775 0.6456 0.4997 0.4948 0.7415 0.4532 0.4948 0.7415 0.4532 0.3440 0.8458 0.4079 0.3440 0.8458 0.4079 0.0301 0.9276 0.3725 0.0300 0.9276 0.3724 0.0183 0.9296 0.3680 0.0183 0.9296 0.3680 0.2907 0.9568 -0.0105 0.2907 0.9568 -0.0105 0.2903 0.9569 -0.0114 0.2903 0.9569 -0.0114 0.2896 0.9571 -0.0119 0.2896 0.9571 -0.0119 0.2889 0.9573 -0.0117 0.2889 0.9573 -0.0117 0.2883 0.9575 -0.0109 0.2883 0.9575 -0.0109 0.2882 0.9575 -0.0103 0.2882 0.9575 -0.0103 0.2851 0.9585 -0.0049 0.2851 0.9585 -0.0049 0.2933 0.9560 0.0087 0.2933 0.9560 0.0087 0.2931 0.9561 0.0070 0.2931 0.9561 0.0070 0.2926 0.9562 0.0053 0.2926 0.9562 0.0053 0.2918 0.9565 0.0047 0.2918 0.9565 0.0047 0.2908 0.9568 0.0040 0.2908 0.9568 0.0040 0.2889 0.9574 0.0042 0.2889 0.9574 0.0042 0.2860 0.9582 0.0050 0.2860 0.9582 0.0050 0.2838 0.9589 0.0068 0.2838 0.9589 0.0068 0.2841 0.9587 0.0089 0.2841 0.9587 0.0089 0.2864 0.9580 0.0148 0.2864 0.9580 0.0148 0.2895 0.9571 0.0140 0.2895 0.9571 0.0140 0.2901 0.9569 0.0147 0.2901 0.9569 0.0147 0.2857 0.9577 0.0355 0.2857 0.9577 0.0355 0.2869 0.9573 0.0347 0.2869 0.9573 0.0347 0.2880 0.9571 0.0330 0.2880 0.9571 0.0330 0.2874 0.9573 0.0319 0.2874 0.9573 0.0319 0.2861 0.9577 0.0313 0.2861 0.9577 0.0313 0.2855 0.9578 0.0315 0.2855 0.9578 0.0315 0.2836 0.9584 0.0322 0.2836 0.9584 0.0322 0.2830 0.9585 0.0337 0.2830 0.9585 0.0337 0.2830 0.9585 0.0345 0.2830 0.9585 0.0345 0.2831 0.9584 0.0354 0.2831 0.9584 0.0354 0.2829 0.9585 0.0363 0.2829 0.9585 0.0363 0.2827 0.9585 0.0368 0.2827 0.9585 0.0368 0.2934 0.9551 0.0406 0.2934 0.9551 0.0406 0.2929 0.9553 0.0400 0.2929 0.9553 0.0400 0.2904 0.9561 0.0382 0.2904 0.9561 0.0382 0.2902 0.9562 0.0384 0.2902 0.9562 0.0384 0.2864 0.9572 0.0410 0.2864 0.9572 0.0410 0.2862 0.9572 0.0425 0.2862 0.9572 0.0425 0.2868 0.9570 0.0437 0.2868 0.9570 0.0437 0.2942 0.9546 0.0470 0.2942 0.9546 0.0470 0.2937 0.9547 0.0468 0.2937 0.9547 0.0468 0.2917 0.9553 0.0478 0.2917 0.9553 0.0478 0.2918 0.9551 0.0515 0.2918 0.9551 0.0515 0.2861 0.9570 0.0485 0.2861 0.9570 0.0485 0.2860 0.9569 0.0507 0.2860 0.9569 0.0507 0.2828 0.9578 0.0505 0.2828 0.9578 0.0505 0.2827 0.9579 0.0509 0.2827 0.9579 0.0509 0.2826 0.9579 0.0515 0.2826 0.9579 0.0515 0.2822 0.9580 0.0517 0.2822 0.9580 0.0517 0.2923 0.9548 0.0543 0.2923 0.9548 0.0543 0.2821 0.9576 0.0589 0.2821 0.9576 0.0589 0.2794 0.9583 0.0602 0.2794 0.9583 0.0602 0.2930 0.9541 0.0620 0.2930 0.9541 0.0620 0.2946 0.9536 0.0612 0.2946 0.9536 0.0612 0.2953 0.9534 0.0613 0.2953 0.9534 0.0613 0.2969 0.9527 0.0650 0.2969 0.9527 0.0650 0.2966 0.9524 0.0698 0.2966 0.9524 0.0698 0.2922 0.9535 0.0744 0.2922 0.9535 0.0744 0.2859 0.9558 0.0688 0.2859 0.9558 0.0688 0.2844 0.9563 0.0671 0.2844 0.9563 0.0671 0.2837 0.9564 0.0688 0.2837 0.9564 0.0688 0.2834 0.9565 0.0693 0.2834 0.9565 0.0693 0.2831 0.9564 0.0716 0.2831 0.9564 0.0716 0.2837 0.9561 0.0728 0.2837 0.9561 0.0728 0.2833 0.9563 0.0729 0.2833 0.9563 0.0729 0.2829 0.9563 0.0731 0.2829 0.9563 0.0731 0.2816 0.9565 0.0757 0.2816 0.9565 0.0757 0.2809 0.9567 0.0762 0.2809 0.9567 0.0762 0.2798 0.9569 0.0773 0.2798 0.9569 0.0773 0.2798 0.9569 0.0776 0.2798 0.9569 0.0776 0.2852 0.9553 0.0780 0.2852 0.9553 0.0780 0.2848 0.9552 0.0807 0.2848 0.9552 0.0807 0.2916 0.9527 0.0853 0.2916 0.9527 0.0853 0.2838 0.9550 0.0867 0.2838 0.9550 0.0867 0.2904 0.9527 0.0895 0.2904 0.9527 0.0895 0.2894 0.9529 0.0902 0.2894 0.9529 0.0902 0.2892 0.9528 0.0923 0.2892 0.9528 0.0923 0.2852 0.9538 0.0950 0.2852 0.9538 0.0950 0.2857 0.9537 0.0936 0.2857 0.9537 0.0936 0.2845 0.9541 0.0935 0.2845 0.9541 0.0935 0.2833 0.9546 0.0925 0.2833 0.9546 0.0925 0.2812 0.9552 0.0921 0.2812 0.9552 0.0921 0.2806 0.9552 0.0944 0.2806 0.9552 0.0944 0.2922 0.9507 0.1042 0.2922 0.9507 0.1042 0.2919 0.9508 0.1040 0.2919 0.9508 0.1040 0.2914 0.9511 0.1022 0.2914 0.9511 0.1022 0.2913 0.9513 0.1013 0.2913 0.9513 0.1013 0.2911 0.9514 0.1005 0.2911 0.9514 0.1005 0.2844 0.9535 0.1000 0.2844 0.9535 0.1000 0.2834 0.9536 0.1018 0.2834 0.9536 0.1018 0.2837 0.9534 0.1030 0.2837 0.9534 0.1030 0.2843 0.9531 0.1040 0.2843 0.9531 0.1040 0.2862 0.9522 0.1073 0.2862 0.9522 0.1073 0.2862 0.9521 0.1078 0.2862 0.9521 0.1078 0.2866 0.9519 0.1087 0.2866 0.9519 0.1087 0.2885 0.9512 0.1095 0.2885 0.9512 0.1095 0.2885 0.9511 0.1103 0.2885 0.9511 0.1103 0.2873 0.9515 0.1102 0.2873 0.9515 0.1102 0.2875 0.9514 0.1106 0.2875 0.9514 0.1106 0.2897 0.9505 0.1122 0.2897 0.9505 0.1122 0.2957 0.9487 0.1117 0.2957 0.9487 0.1117 0.2897 0.9502 0.1153 0.2897 0.9502 0.1153 0.2892 0.9502 0.1161 0.2892 0.9502 0.1161 0.2886 0.9503 0.1168 0.2886 0.9503 0.1168 0.2876 0.9505 0.1180 0.2876 0.9505 0.1180 0.2873 0.9504 0.1189 0.2873 0.9504 0.1189 0.2867 0.9504 0.1205 0.2867 0.9504 0.1205 0.2869 0.9502 0.1214 0.2869 0.9502 0.1214 0.2918 0.9488 0.1212 0.2918 0.9488 0.1212 0.2905 0.9490 0.1224 0.2905 0.9490 0.1224 0.2916 0.9485 0.1235 0.2916 0.9485 0.1235 0.2909 0.9350 0.2027 0.2909 0.9350 0.2027 0.2998 0.9326 0.2010 0.2998 0.9326 0.2010 0.3013 0.9335 0.1944 0.3013 0.9335 0.1944 0.2863 0.9372 0.1994 0.2863 0.9372 0.1994 0.2902 0.9369 0.1950 0.2902 0.9369 0.1950 0.2910 0.9371 0.1929 0.2910 0.9371 0.1929 0.2946 0.9371 0.1870 0.2946 0.9371 0.1870 0.2932 0.9383 0.1834 0.2932 0.9383 0.1834 0.2761 0.9426 0.1879 0.2761 0.9426 0.1879 0.2769 0.9446 0.1761 0.2769 0.9446 0.1761 0.2772 0.9447 0.1751 0.2772 0.9447 0.1751 0.2880 0.9467 0.1444 0.2880 0.9467 0.1444 0.2997 0.9379 0.1746 0.2997 0.9379 0.1746 0.2988 0.9379 0.1760 0.2988 0.9379 0.1760 0.2985 0.9353 0.1899 0.2985 0.9353 0.1899 0.3002 0.9351 0.1885 0.3002 0.9351 0.1885 0.2993 0.9453 -0.1294 0.2993 0.9453 -0.1294 0.1756 0.9755 0.1323 0.1477 0.9786 0.1435 0.1477 0.9786 0.1435 0.1756 0.9755 0.1323 0.1421 0.9808 0.1337 0.1421 0.9808 0.1336 0.1756 0.9717 0.1582 0.1756 0.9717 0.1582 0.1767 0.9702 0.1656 0.1767 0.9702 0.1656 0.1731 0.9702 0.1695 0.1731 0.9702 0.1695 -0.0244 0.9234 0.3831 -0.0244 0.9234 0.3831 -0.0478 0.9736 0.2232 -0.0491 0.9735 0.2232 -0.0474 0.9759 0.2131 -0.0490 0.9758 0.2131 -0.0472 0.9764 0.2110 -0.0470 0.9768 0.2091 -0.0063 0.9270 0.3751 -0.0063 0.9270 0.3751 -0.0119 0.9220 0.3870 -0.0119 0.9220 0.3870 -0.0152 0.9233 0.3837 -0.0151 0.9233 0.3838 -0.0169 0.9256 0.3781 -0.0169 0.9256 0.3782 -0.0479 0.9380 0.3434 -0.0480 0.9380 0.3434 -0.0560 0.9383 0.3412 -0.0561 0.9383 0.3412 -0.0607 0.9403 0.3348 -0.0608 0.9403 0.3348 -0.0600 0.9442 0.3238 -0.0601 0.9443 0.3237 -0.0574 0.9680 0.2443 -0.0575 0.9680 0.2442 -0.0627 0.9643 0.2572 -0.0627 0.9643 0.2571 -0.0780 0.9570 0.2795 -0.0780 0.9570 0.2795 -0.0809 0.9582 0.2745 -0.0809 0.9582 0.2744 -0.1254 0.9505 0.2841 -0.1255 0.9505 0.2841 -0.1285 0.9547 0.2683 -0.1285 0.9547 0.2683 -0.1317 0.9605 0.2450 -0.1318 0.9605 0.2450 -0.1337 0.9613 0.2409 -0.1338 0.9613 0.2408 -0.1339 0.9616 0.2395 -0.1340 0.9616 0.2395 -0.0726 0.9699 0.2325 -0.0726 0.9699 0.2325 -0.1404 0.9643 0.2245 -0.1404 0.9643 0.2245 -0.1330 0.9661 0.2211 -0.1330 0.9661 0.2211 -0.1412 0.9666 0.2141 -0.1412 0.9665 0.2142 -0.1399 0.9662 0.2165 -0.1398 0.9662 0.2165 -0.1439 0.9660 0.2150 -0.1439 0.9659 0.2151 -0.1464 0.9657 0.2142 -0.1464 0.9657 0.2143 -0.1358 0.9676 0.2128 -0.1357 0.9676 0.2129 -0.1372 0.9679 0.2108 -0.1371 0.9678 0.2109 -0.1332 0.9670 0.2172 -0.1332 0.9670 0.2173 -0.1372 0.9697 0.2020 -0.1371 0.9697 0.2021 -0.1441 0.9679 0.2061 -0.1441 0.9678 0.2063 -0.1433 0.9690 0.2012 -0.1433 0.9690 0.2013 -0.1402 0.9683 0.2067 -0.1402 0.9683 0.2067 -0.1405 0.9685 0.2055 -0.1405 0.9685 0.2056 -0.1392 0.9702 0.1986 -0.1391 0.9701 0.1987 -0.1407 0.9707 0.1946 -0.1406 0.9707 0.1947 -0.1451 0.9714 0.1879 -0.1451 0.9714 0.1879 -0.1439 0.9711 0.1904 -0.1439 0.9711 0.1904 -0.1348 0.9727 0.1888 -0.1348 0.9727 0.1888 -0.1359 0.9740 0.1812 -0.1359 0.9740 0.1811 -0.1407 0.9731 0.1826 -0.1407 0.9731 0.1826 -0.1410 0.9742 0.1765 -0.1410 0.9742 0.1765 -0.1382 0.9757 0.1703 -0.1381 0.9757 0.1702 -0.1419 0.9745 0.1738 -0.1419 0.9745 0.1738 -0.1416 0.9723 0.1861 -0.1416 0.9723 0.1861 -0.0515 0.9703 0.2362 -0.0516 0.9703 0.2362 -0.0520 0.9708 0.2340 -0.0520 0.9708 0.2340 -0.0465 0.9734 0.2243 -0.0465 0.9735 0.2241 -0.0535 0.9762 0.2104 -0.0535 0.9762 0.2104 -0.0515 0.9767 0.2082 -0.0515 0.9767 0.2082 -0.0660 0.9749 0.2125 -0.0660 0.9749 0.2125 -0.0389 0.9789 0.2007 -0.0390 0.9789 0.2007 -0.0459 0.9790 0.1988 -0.0459 0.9790 0.1988 -0.0439 0.9814 0.1871 -0.0439 0.9814 0.1870 -0.0480 0.9859 0.1606 -0.0480 0.9859 0.1605 -0.0535 0.9880 0.1447 -0.0535 0.9880 0.1448 -0.0622 0.9869 0.1486 -0.0622 0.9869 0.1485 -0.0610 0.9879 0.1429 -0.0610 0.9879 0.1428 -0.0615 0.9883 0.1393 -0.0615 0.9884 0.1392 -0.0586 0.9885 0.1394 -0.0586 0.9885 0.1394 -0.0633 0.9896 0.1291 -0.0634 0.9896 0.1290 -0.0639 0.9896 0.1290 -0.0639 0.9896 0.1290 -0.0668 0.9899 0.1252 -0.0669 0.9899 0.1250 -0.1827 0.9564 0.2279 -0.1827 0.9564 0.2279 -0.1430 0.9771 0.1578 -0.1429 0.9771 0.1577 -0.1807 0.9577 0.2241 -0.1807 0.9577 0.2241 -0.1486 0.9786 0.1421 -0.1486 0.9786 0.1421 -0.1470 0.9790 0.1410 -0.1471 0.9790 0.1409 -0.1434 0.9794 0.1420 -0.1435 0.9794 0.1420 -0.1566 0.9786 0.1335 -0.1566 0.9786 0.1335 -0.1620 0.9787 0.1265 -0.1620 0.9787 0.1264 -0.1814 0.9754 0.1249 -0.1815 0.9754 0.1248 -0.1726 0.9709 0.1659 -0.1725 0.9709 0.1658 -0.1717 0.9704 0.1701 -0.1718 0.9704 0.1700 -0.1661 0.9721 0.1658 -0.1661 0.9721 0.1658 -0.1658 0.9719 0.1672 -0.1659 0.9719 0.1671 -0.1667 0.9791 0.1168 -0.1667 0.9791 0.1167 -0.2072 0.9548 0.2130 -0.2072 0.9548 0.2130 -0.2084 0.9552 0.2103 -0.2084 0.9552 0.2103 -0.2129 0.9556 0.2037 -0.2129 0.9556 0.2037 -0.1700 0.9790 0.1126 -0.1700 0.9790 0.1126 -0.1781 0.9794 0.0950 -0.1781 0.9794 0.0949 -0.2448 0.9683 0.0501 -0.2448 0.9683 0.0500 -0.2415 0.9701 0.0242 -0.2417 0.9700 0.0241 -0.2210 0.9550 0.1978 -0.2210 0.9550 0.1977 -0.2381 0.9542 0.1812 -0.2381 0.9542 0.1812 -0.2833 0.9469 0.1524 -0.2833 0.9468 0.1524 -0.2788 0.9448 0.1724 -0.2788 0.9448 0.1724 -0.2835 0.9410 0.1850 -0.2836 0.9409 0.1850 -0.3191 0.9299 0.1831 -0.3191 0.9298 0.1831 -0.2694 0.8947 0.3563 -0.2694 0.8947 0.3563 -0.2719 0.8942 0.3557 -0.2719 0.8942 0.3557 -0.2786 0.8921 0.3558 -0.2786 0.8921 0.3558 -0.2816 0.8899 0.3589 -0.2816 0.8899 0.3589 -0.2817 0.8903 0.3577 -0.2817 0.8904 0.3577 -0.2857 0.8944 0.3442 -0.2858 0.8943 0.3443 -0.2859 0.8885 0.3590 -0.2859 0.8885 0.3590 -0.2845 0.8891 0.3586 -0.2845 0.8891 0.3586 -0.2824 0.8891 0.3602 -0.2824 0.8891 0.3603 -0.2797 0.8889 0.3628 -0.2798 0.8889 0.3628 -0.2846 0.8868 0.3641 -0.2846 0.8868 0.3642 -0.2857 0.8862 0.3646 -0.2857 0.8862 0.3647 -0.3480 0.8971 0.2721 -0.3480 0.8971 0.2721 -0.3563 0.8925 0.2765 -0.3563 0.8925 0.2765 -0.3703 0.8835 0.2868 -0.3703 0.8835 0.2868 -0.3637 0.8853 0.2897 -0.3637 0.8853 0.2897 -0.3637 0.8848 0.2913 -0.3637 0.8848 0.2913 -0.3625 0.8850 0.2921 -0.3625 0.8850 0.2921 -0.3615 0.8854 0.2921 -0.3615 0.8854 0.2921 -0.3546 0.8910 0.2834 -0.3546 0.8910 0.2834 -0.3529 0.8913 0.2848 -0.3529 0.8913 0.2848 -0.3513 0.8924 0.2831 -0.3513 0.8924 0.2831 -0.3149 0.8855 0.3416 -0.3150 0.8854 0.3417 -0.3261 0.8744 0.3593 -0.3261 0.8744 0.3593 -0.3269 0.8732 0.3616 -0.3270 0.8731 0.3616 -0.4287 0.8032 0.4136 -0.4285 0.8032 0.4137 -0.4582 0.7342 0.5010 -0.4582 0.7342 0.5010 -0.4403 0.7270 0.5269 -0.4403 0.7269 0.5270 -0.4490 0.6479 0.6154 -0.4491 0.6478 0.6154 -0.4693 0.6356 0.6131 -0.4694 0.6356 0.6130 -0.4888 0.6635 0.5664 -0.4889 0.6636 0.5663 -0.4997 0.6671 0.5525 -0.4998 0.6671 0.5525 -0.5041 0.6468 0.5724 -0.5042 0.6468 0.5722 -0.5127 0.6395 0.5729 -0.5128 0.6395 0.5728 -0.4701 0.7739 0.4245 -0.4756 0.7910 0.3849 -0.4701 0.7738 0.4245 -0.4702 0.7737 0.4246 -0.4518 0.7978 0.3993 -0.4518 0.7977 0.3993 -0.4316 0.8018 0.4134 -0.4316 0.8018 0.4134 -0.5608 0.6305 0.5366 -0.5476 0.6391 0.5402 -0.5816 0.5896 0.5604 -0.5608 0.6184 0.5505 -0.5803 0.5891 0.5623 -0.5817 0.5898 0.5601 -0.5837 0.4704 0.6618 -0.6107 0.4799 0.6299 -0.6202 0.5067 0.5989 -0.6204 0.5367 0.5719 -0.5960 0.5627 0.5729 -0.5732 0.5902 0.5684 -0.5516 0.6182 0.5599 -0.5634 0.5878 0.5805 -0.5818 0.5586 0.5912 -0.5951 0.5278 0.6061 -0.5925 0.4980 0.6332 -0.5838 0.4704 0.6618 -0.5519 0.4319 0.7134 -0.5809 0.4215 0.6963 -0.5838 0.4523 0.6742 -0.5569 0.4388 0.7053 -0.5520 0.4319 0.7133 -0.5956 0.4122 0.6895 -0.5956 0.4122 0.6895 -0.5227 0.6348 0.5691 -0.5227 0.6347 0.5691 -0.5240 0.6395 0.5626 -0.5240 0.6395 0.5625 -0.5314 0.6385 0.5567 -0.5315 0.6385 0.5566 -0.5320 0.6445 0.5492 -0.5320 0.6445 0.5491 -0.5288 0.6500 0.5458 -0.5288 0.6501 0.5456 -0.5825 0.5824 0.5669 -0.5825 0.5825 0.5668 -0.6238 0.5344 0.5704 -0.6238 0.5343 0.5704 -0.6393 0.5407 0.5467 -0.6394 0.5407 0.5467 -0.6304 0.5370 0.5606 -0.6304 0.5371 0.5604 -0.5486 0.4414 0.7101 -0.5485 0.4414 0.7101 -0.5451 0.4415 0.7127 -0.5452 0.4415 0.7126 -0.5628 0.4816 0.6719 -0.5628 0.4815 0.6719 -0.5880 0.5200 0.6196 -0.5880 0.5200 0.6195 -0.5524 0.5864 0.5924 -0.5526 0.5864 0.5923 -0.5476 0.6391 0.5402 -0.5608 0.6304 0.5367 -0.5427 0.6474 0.5351 -0.5427 0.6474 0.5352 -0.5257 0.6572 0.5401 -0.5256 0.6572 0.5402 -0.5642 0.6474 0.5125 -0.5642 0.6474 0.5124 -0.5601 0.6554 0.5067 -0.5602 0.6553 0.5067 -0.5612 0.6763 0.4772 -0.5613 0.6763 0.4771 -0.5553 0.6875 0.4679 -0.5554 0.6875 0.4679 -0.5533 0.6942 0.4604 -0.5533 0.6941 0.4605 -0.5527 0.7003 0.4518 -0.5528 0.7003 0.4517 -0.5241 0.7406 0.4205 -0.5242 0.7406 0.4204 -0.5103 0.7540 0.4137 -0.5103 0.7539 0.4137 -0.5064 0.7568 0.4133 -0.5065 0.7568 0.4132 -0.6002 0.6841 0.4144 -0.6002 0.6841 0.4144 -0.6633 0.5502 0.5072 -0.6633 0.5502 0.5072 -0.6983 0.5440 0.4653 -0.6983 0.5440 0.4653 -0.7000 0.5432 0.4636 -0.7000 0.5432 0.4636 -0.7030 0.5452 0.4567 -0.7030 0.5452 0.4567 -0.7039 0.5453 0.4552 -0.7039 0.5453 0.4552 -0.7052 0.5484 0.4495 -0.7052 0.5484 0.4495 -0.7091 0.5669 0.4193 -0.7091 0.5669 0.4193 -0.7047 0.5646 0.4297 -0.7047 0.5646 0.4297 -0.7722 0.5352 0.3424 -0.7722 0.5352 0.3424 -0.8125 0.3966 0.4273 -0.8125 0.3966 0.4273 -0.6898 0.5610 0.4577 -0.6898 0.5610 0.4577 -0.5924 0.3971 0.7010 -0.5924 0.3971 0.7010 -0.6022 0.4036 0.6888 -0.6022 0.4036 0.6888 -0.6037 0.3941 0.6930 -0.6038 0.3940 0.6929 -0.4715 0.3706 0.8002 -0.4999 0.3896 0.7735 -0.5267 0.4091 0.7451 -0.5356 0.3813 0.7535 -0.5042 0.3725 0.7791 -0.4849 0.3611 0.7966 -0.4620 0.4788 0.7465 -0.4620 0.4788 0.7465 0.3408 0.6022 0.7219 0.3408 0.6018 0.7223 -0.4849 0.3611 0.7966 -0.4715 0.3706 0.8002 -0.4182 0.3945 0.8182 -0.4182 0.3945 0.8182 -0.4233 0.3918 0.8169 -0.4233 0.3917 0.8169 -0.5994 0.3630 0.7134 -0.5994 0.3630 0.7134 -0.6026 0.3554 0.7145 -0.6027 0.3554 0.7145 -0.6018 0.3173 0.7329 -0.6019 0.3173 0.7328 -0.6010 0.3139 0.7350 -0.6011 0.3139 0.7350 -0.5993 0.3057 0.7399 -0.5993 0.3056 0.7399 -0.5969 0.3010 0.7437 -0.5969 0.3010 0.7437 -0.5927 0.2893 0.7517 -0.5926 0.2894 0.7517 -0.5900 0.2819 0.7566 -0.5900 0.2818 0.7566 -0.5891 0.2798 0.7580 -0.5891 0.2797 0.7581 -0.5830 0.2690 0.7666 -0.5830 0.2691 0.7666 -0.5813 0.2539 0.7731 -0.5813 0.2540 0.7730 -0.5526 0.1353 0.8224 -0.5526 0.1352 0.8224 -0.4998 0.1491 0.8532 -0.4998 0.1491 0.8532 -0.3288 0.0069 0.9444 -0.3256 0.0000 0.9455 -0.3167 0.0000 0.9485 -0.3288 0.0070 0.9444 -0.3399 0.0635 0.9383 -0.3400 0.0636 0.9383 -0.1934 0.1906 0.9624 -0.1934 0.1906 0.9624 -0.2144 0.1762 0.9607 -0.2138 0.1766 0.9608 -0.2163 0.1742 0.9607 -0.2163 0.1741 0.9607 -0.2076 0.1374 0.9685 -0.2250 0.1359 0.9648 -0.2077 0.1374 0.9685 -0.2075 0.1373 0.9685 -0.2003 0.1690 0.9650 -0.2056 0.1588 0.9657 -0.2080 0.1468 0.9671 -0.1926 0.1484 0.9700 -0.1869 0.1574 0.9697 -0.1809 0.1663 0.9693 -0.1981 0.1677 0.9657 -0.2007 0.1680 0.9651 -0.1799 0.1771 0.9676 -0.1799 0.1771 0.9676 -0.1803 0.2421 0.9533 -0.1941 0.2384 0.9516 -0.1796 0.2412 0.9537 -0.1803 0.2421 0.9533 -0.1799 0.2430 0.9532 -0.1839 0.2276 0.9562 -0.1743 0.2361 0.9560 -0.1798 0.2430 0.9532 -0.1571 0.2472 0.9562 -0.1711 0.2453 0.9542 -0.1570 0.2469 0.9562 -0.1571 0.2471 0.9562 -0.1063 0.2526 0.9617 -0.1063 0.2526 0.9617 -0.0582 0.1974 0.9786 -0.0582 0.1974 0.9786 -0.0563 0.1963 0.9789 -0.0563 0.1963 0.9789 -0.0344 0.2058 0.9780 -0.0423 0.2000 0.9789 -0.0503 0.1957 0.9794 -0.0389 0.1803 0.9828 -0.0349 0.1996 0.9793 -0.0343 0.2058 0.9780 -0.0307 0.1840 0.9824 -0.0212 0.1694 0.9853 -0.0141 0.1733 0.9848 -0.0231 0.1905 0.9814 -0.0316 0.1913 0.9810 -0.0307 0.1840 0.9824 -0.0148 0.1507 0.9885 -0.0085 0.1562 0.9877 -0.0162 0.1700 0.9853 -0.0222 0.1602 0.9868 -0.0148 0.1507 0.9885 -0.0002 0.1529 0.9882 -0.0002 0.1528 0.9883 0.0294 0.1544 0.9876 0.0294 0.1544 0.9876 0.0420 0.1765 0.9834 0.0420 0.1766 0.9834 -0.0034 0.1729 0.9849 -0.0111 0.1764 0.9843 -0.0034 0.1726 0.9850 -0.0034 0.1729 0.9849 0.0032 0.2221 0.9750 0.0033 0.2215 0.9751 -0.0252 0.2201 0.9752 -0.0252 0.2201 0.9751 -0.0275 0.2359 0.9714 -0.0275 0.2359 0.9714 0.0342 0.2480 0.9681 0.0342 0.2481 0.9681 0.0578 0.2884 0.9558 0.0577 0.2883 0.9558 0.0690 0.2956 0.9528 0.0689 0.2954 0.9529 0.0682 0.2752 0.9590 0.0682 0.2752 0.9590 0.0724 0.2762 0.9584 0.0724 0.2760 0.9584 0.0800 0.2808 0.9564 0.0799 0.2807 0.9565 0.1004 0.2739 0.9565 0.1003 0.2737 0.9566 0.1773 0.2945 0.9390 0.1773 0.2943 0.9391 0.2378 0.2663 0.9341 0.2377 0.2663 0.9341 0.1962 0.2603 0.9454 0.1960 0.2602 0.9454 0.1951 0.2443 0.9499 0.1719 0.2316 0.9575 0.1613 0.2383 0.9577 0.1770 0.2549 0.9506 0.1770 0.2548 0.9507 0.1768 0.2770 0.9445 0.1903 0.2715 0.9434 0.1930 0.2527 0.9481 0.1948 0.2440 0.9500 0.1439 0.2214 0.9645 0.1602 0.2254 0.9610 0.1559 0.2403 0.9581 0.1402 0.2260 0.9640 0.1402 0.2260 0.9640 0.1276 0.2269 0.9655 0.1128 0.2219 0.9685 0.1010 0.2218 0.9698 0.0891 0.2201 0.9714 0.0948 0.2128 0.9725 0.0948 0.2128 0.9725 0.1057 0.2121 0.9715 0.1151 0.2078 0.9714 0.1281 0.2097 0.9693 0.1426 0.2130 0.9666 0.1439 0.2214 0.9645 0.0920 0.1451 0.9851 0.0919 0.1451 0.9851 0.1160 0.1271 0.9851 0.1017 0.1211 0.9874 0.1162 0.1275 0.9850 0.1159 0.1271 0.9851 0.1152 0.1150 0.9867 0.1075 0.1171 0.9873 0.1156 0.1155 0.9866 0.1152 0.1151 0.9866 0.0839 0.1413 0.9864 0.0749 0.1396 0.9874 0.0842 0.1418 0.9863 0.0839 0.1413 0.9864 0.0734 0.1413 0.9872 0.0649 0.1391 0.9881 0.0737 0.1418 0.9871 0.0733 0.1412 0.9873 0.0908 0.1269 0.9878 0.0865 0.1326 0.9874 0.0908 0.1269 0.9878 0.3404 0.2455 0.9077 0.3404 0.2456 0.9076 0.4797 0.2035 0.8535 0.4797 0.2037 0.8535 0.3409 0.6018 0.7223 0.3408 0.6022 0.7219 0.4584 0.6194 0.6373 0.4584 0.6194 0.6373 0.3634 0.6060 0.7076 0.3634 0.6060 0.7076 0.3523 0.6048 0.7142 0.3523 0.6048 0.7142 0.5515 0.5592 0.6189 0.5515 0.5592 0.6189 0.5040 0.5868 0.6338 0.5082 0.6150 0.6029 0.4832 0.6390 0.5986 0.4581 0.6277 0.6294 -0.2311 0.9455 0.2294 -0.2311 0.9455 0.2294 -0.3031 0.5777 0.7579 -0.3031 0.5780 0.7577 -0.4262 0.7410 0.5190 -0.4262 0.7409 0.5191 -0.3939 0.7416 0.5431 -0.3939 0.7415 0.5432 -0.4093 0.7346 0.5412 -0.4092 0.7345 0.5414 -0.1096 0.8111 0.5745 -0.1096 0.8111 0.5745 0.0951 0.8623 0.4974 0.0951 0.8623 0.4974 -0.0213 0.8482 0.5293 -0.0213 0.8481 0.5293 -0.1424 0.7839 0.6043 -0.1426 0.7840 0.6041 -0.1126 0.6121 0.7827 -0.1127 0.6120 0.7828 -0.0323 0.6328 0.7737 -0.0324 0.6328 0.7736 -0.4789 0.5172 0.7094 -0.4790 0.5172 0.7093 -0.1879 0.5309 0.8263 -0.1930 0.5655 0.8019 -0.1736 0.5852 0.7921 -0.1524 0.6032 0.7829 -0.1715 0.5822 0.7947 -0.1845 0.5555 0.8108 -0.1880 0.5306 0.8265 -0.1522 0.5932 0.7905 -0.1523 0.5933 0.7905 -0.1178 0.5436 0.8311 -0.1349 0.5731 0.8083 -0.1132 0.5501 0.8274 -0.1179 0.5436 0.8310 -0.0092 0.5772 0.8165 -0.0139 0.5824 0.8128 0.0899 0.5821 0.8081 0.0898 0.5819 0.8083 0.0677 0.6693 0.7399 0.0678 0.6692 0.7400 0.1878 0.6632 0.7245 0.1582 0.6679 0.7273 0.1286 0.6725 0.7288 0.1584 0.6694 0.7258 0.1885 0.6686 0.7193 0.1876 0.6632 0.7245 0.1527 0.7187 0.6784 0.1523 0.7188 0.6784 0.3395 0.6240 0.7038 0.3412 0.5952 0.7275 -0.0593 0.2610 0.9635 -0.0692 0.2536 0.9648 -0.0587 0.2586 0.9642 -0.0462 0.2524 0.9665 -0.0591 0.2610 0.9635 -0.0593 0.2609 0.9635 0.3753 0.2593 0.8899 0.3753 0.2593 0.8899 0.3635 0.2491 0.8977 0.3635 0.2491 0.8977 0.3895 0.3170 0.8647 0.3895 0.3171 0.8647 0.4057 0.3184 0.8567 0.4058 0.3186 0.8566 0.4063 0.2434 0.8807 0.4062 0.2436 0.8807 0.3412 0.5952 0.7275 0.3519 0.5978 0.7203 0.5757 0.3838 0.7220 0.5757 0.3838 0.7220 0.5503 0.3367 0.7641 0.5458 0.3653 0.7541 0.5770 0.3715 0.7274 0.5515 0.3874 0.7388 0.5491 0.3573 0.7556 0.5503 0.3367 0.7641 0.5396 0.3181 0.7795 0.5396 0.3181 0.7795 0.4707 0.4474 0.7605 0.4707 0.4474 0.7605 0.4129 0.4550 0.7890 0.4129 0.4550 0.7890 0.5040 0.5868 0.6338 0.4923 0.5606 0.6658 0.4876 0.5307 0.6932 0.4854 0.5184 0.7040 0.4854 0.5184 0.7040 0.4550 0.5225 0.7211 0.4260 0.5309 0.7326 0.4171 0.5550 0.7197 0.4170 0.5550 0.7197 0.4479 0.5554 0.7007 0.4467 0.5860 0.6761 0.4351 0.6151 0.6575 0.4581 0.6277 0.6294 0.3519 0.5978 0.7203 0.3784 0.6136 0.6931 0.3531 0.6323 0.6896 0.3395 0.6240 0.7038 0.3795 0.4362 0.8159 0.3834 0.4560 0.8032 0.3834 0.4560 0.8032 0.3805 0.4350 0.8161 0.4719 0.4648 0.7492 0.4413 0.4627 0.7689 0.4208 0.4517 0.7867 0.4208 0.4518 0.7867 0.4514 0.4574 0.7661 0.4719 0.4648 0.7492 0.3938 0.3651 0.8436 0.3876 0.3689 0.8448 0.3938 0.3651 0.8436 0.3876 0.3688 0.8448 0.3212 0.4435 0.8367 0.3168 0.4424 0.8390 0.3168 0.4424 0.8390 0.3212 0.4435 0.8367 0.2840 0.4250 0.8595 0.2891 0.4264 0.8571 0.2891 0.4264 0.8571 0.2840 0.4250 0.8595 0.3795 0.4362 0.8159 0.3542 0.4427 0.8237 0.3770 0.4319 0.8194 0.3805 0.4350 0.8161 -0.0127 0.5824 0.8128 -0.0156 0.5914 0.8063 -0.0156 0.5913 0.8063 -0.0139 0.5824 0.8128 -0.0127 0.5824 0.8128 -0.0092 0.5772 0.8165 -0.8015 0.4786 -0.3585 -0.8040 0.4496 -0.3892 -0.8049 0.4299 -0.4091 -0.8049 0.4299 -0.4091 -0.7990 0.4058 -0.4438 -0.7901 0.3950 -0.4687 -0.7901 0.3950 -0.4687 -0.7689 0.3905 -0.5064 -0.7489 0.3891 -0.5365 -0.7489 0.3891 -0.5365 -0.7216 0.4012 -0.5642 -0.7005 0.4030 -0.5890 -0.7004 0.4031 -0.5890 -0.6720 0.4152 -0.6132 -0.6458 0.4294 -0.6313 -0.6458 0.4294 -0.6313 -0.6319 0.4601 -0.6237 -0.6262 0.4628 -0.6274 -0.6262 0.4628 -0.6274 -0.6125 0.4935 -0.6175 -0.6092 0.5172 -0.6012 -0.6092 0.5172 -0.6012 -0.6065 0.5408 -0.5829 -0.6065 0.5408 -0.5828 -0.6208 0.5613 -0.5473 -0.5903 0.5727 -0.5688 -0.5888 0.5693 -0.5738 -0.5888 0.5694 -0.5737 -0.5844 0.5993 -0.5471 -0.5726 0.6252 -0.5303 -0.5726 0.6252 -0.5303 -0.5478 0.6523 -0.5239 -0.5164 0.6706 -0.5326 -0.4970 0.6840 -0.5340 -0.6426 0.4014 -0.6527 -0.6178 0.3862 -0.6849 -0.6178 0.3862 -0.6850 -0.6031 0.4143 -0.6816 -0.6125 0.4329 -0.6614 -0.6126 0.4328 -0.6614 -0.6346 0.4087 -0.6560 -0.6426 0.4014 -0.6527 -0.4970 0.6840 -0.5339 -0.4644 0.6916 -0.5533 -0.4328 0.7092 -0.5565 -0.4071 0.7178 -0.5648 -0.4071 0.7179 -0.5648 -0.3735 0.7285 -0.5743 -0.3509 0.7532 -0.5564 -0.3522 0.7556 -0.5523 -0.3523 0.7556 -0.5523 -0.3666 0.7743 -0.5158 -0.3645 0.7970 -0.4816 -0.3645 0.7970 -0.4816 -0.3559 0.8206 -0.4471 -0.3633 0.8311 -0.4209 -0.3633 0.8311 -0.4209 -0.3723 0.8463 -0.3811 -0.4072 0.8393 -0.3603 -0.4105 0.8385 -0.3584 -0.4105 0.8385 -0.3584 -0.4473 0.8241 -0.3475 -0.4659 0.8163 -0.3416 -0.4659 0.8163 -0.3416 -0.4991 0.8060 -0.3182 -0.5226 0.8046 -0.2820 -0.5215 0.8040 -0.2856 -0.5215 0.8040 -0.2856 -0.5552 0.7875 -0.2676 -0.5552 0.7875 -0.2676 -0.5837 0.7765 -0.2374 -0.5840 0.7763 -0.2373 -0.5840 0.7763 -0.2373 -0.6098 0.7494 -0.2580 -0.6284 0.7451 -0.2236 -0.6284 0.7451 -0.2236 -0.6607 0.7207 -0.2101 -0.6689 0.7161 -0.1993 -0.6689 0.7161 -0.1993 -0.6970 0.6857 -0.2098 -0.7108 0.6726 -0.2059 -0.7108 0.6726 -0.2059 -0.6946 0.6760 -0.2461 -0.6883 0.6795 -0.2542 -0.6883 0.6795 -0.2542 -0.7073 0.6499 -0.2781 -0.7259 0.6189 -0.3000 -0.7280 0.6156 -0.3019 -0.7280 0.6156 -0.3019 -0.7527 0.6002 -0.2706 -0.7628 0.6039 -0.2309 -0.7628 0.6039 -0.2309 -0.7761 0.6014 -0.1895 -0.7838 0.5854 -0.2074 -0.7838 0.5853 -0.2075 -0.7814 0.5723 -0.2489 -0.7947 0.5495 -0.2579 -0.7947 0.5494 -0.2579 -0.7916 0.5334 -0.2981 -0.7891 0.5256 -0.3178 -0.7891 0.5256 -0.3178 -0.7989 0.4938 -0.3435 -0.8015 0.4786 -0.3585 -0.4619 0.8839 0.0727 -0.4588 0.8827 0.1022 -0.4588 0.8827 0.1022 -0.4236 0.9018 0.0855 -0.4234 0.9019 0.0855 -0.4216 0.9029 0.0840 -0.4214 0.9029 0.0853 -0.4068 0.9100 0.0800 -0.3776 0.9245 0.0513 -0.3427 0.9390 0.0296 -0.3361 0.9411 0.0360 -0.4234 0.9019 0.0855 -0.4216 0.9029 0.0840 -0.4214 0.9029 0.0853 -0.4068 0.9100 0.0800 -0.0909 0.9911 0.0971 -0.1331 0.9872 0.0882 -0.1645 0.9847 0.0582 -0.1897 0.9813 0.0318 -0.1897 0.9813 0.0318 -0.2262 0.9740 0.0091 -0.2296 0.9733 -0.0045 -0.2295 0.9733 -0.0045 -0.2565 0.9658 -0.0380 -0.2731 0.9588 -0.0776 -0.2667 0.9587 -0.0986 -0.2667 0.9587 -0.0986 -0.2283 0.9701 -0.0817 -0.1981 0.9788 -0.0516 -0.1807 0.9834 -0.0182 -0.1807 0.9834 -0.0182 -0.1556 0.9877 0.0171 -0.1287 0.9904 0.0513 -0.0967 0.9920 0.0808 -0.0909 0.9911 0.0971 -0.0887 0.9911 0.0994 -0.0888 0.9911 0.0994 -0.0933 0.9904 0.1017 -0.0933 0.9904 0.1017 -0.1125 0.9928 0.0412 -0.1124 0.9928 0.0411 -0.1277 0.9912 0.0358 -0.1277 0.9912 0.0358 -0.1244 0.9916 0.0359 -0.1244 0.9916 0.0358 -0.1492 0.9884 0.0284 -0.1491 0.9884 0.0283 -0.1598 0.9867 -0.0309 -0.1597 0.9867 -0.0309 -0.1377 0.9903 0.0163 -0.1377 0.9903 0.0162 -0.2737 0.9615 -0.0260 -0.2738 0.9614 -0.0260 -0.3039 0.9517 -0.0446 -0.3039 0.9517 -0.0446 -0.2513 0.9679 0.0037 -0.2513 0.9679 0.0037 -0.2490 0.9685 0.0028 -0.2490 0.9685 0.0028 -0.2479 0.9688 0.0064 -0.2480 0.9687 0.0063 -0.2467 0.9690 0.0124 -0.2467 0.9690 0.0123 -0.2463 0.9691 0.0146 -0.2463 0.9691 0.0146 -0.2563 0.9664 0.0170 -0.2563 0.9664 0.0169 -0.2531 0.9673 0.0179 -0.2532 0.9673 0.0179 -0.2445 0.9695 0.0199 -0.2445 0.9695 0.0198 -0.2413 0.9703 0.0167 -0.2413 0.9703 0.0165 -0.2408 0.9705 0.0138 -0.2409 0.9705 0.0138 -0.2391 0.9709 0.0139 -0.2391 0.9709 0.0137 -0.2338 0.9722 0.0139 -0.2339 0.9722 0.0139 -0.2335 0.9723 0.0129 -0.2335 0.9723 0.0129 -0.2323 0.9725 0.0179 -0.2323 0.9725 0.0179 -0.2300 0.9731 0.0104 -0.2300 0.9731 0.0103 -0.2278 0.9736 0.0150 -0.2277 0.9736 0.0149 -0.2258 0.9741 0.0139 -0.2258 0.9741 0.0137 -0.2160 0.9762 0.0212 -0.2160 0.9762 0.0210 -0.2163 0.9760 0.0253 -0.2163 0.9760 0.0251 -0.2039 0.9784 0.0339 -0.2039 0.9784 0.0338 -0.3361 0.9412 0.0360 -0.3271 0.9450 -0.0064 -0.3462 0.9371 -0.0440 -0.3462 0.9371 -0.0440 -0.3837 0.9215 -0.0597 -0.4147 0.9081 -0.0584 -0.4147 0.9081 -0.0584 -0.4445 0.8953 -0.0293 -0.4608 0.8874 -0.0092 -0.4608 0.8874 -0.0091 -0.4672 0.8835 0.0338 -0.4619 0.8839 0.0727 -0.3373 0.9315 -0.1364 -0.3763 0.9151 -0.1450 -0.3816 0.9162 -0.1227 -0.3816 0.9162 -0.1227 -0.3414 0.9322 -0.1202 -0.3023 0.9470 -0.1089 -0.2908 0.9510 -0.1049 -0.2908 0.9510 -0.1048 -0.3207 0.9377 -0.1334 -0.3373 0.9315 -0.1364 -0.3869 0.9143 -0.1200 -0.3871 0.9142 -0.1200 -0.4102 0.9011 -0.1408 -0.4102 0.9011 -0.1407 -0.4391 0.8870 -0.1429 -0.4392 0.8869 -0.1429 -0.4524 0.8798 -0.1458 -0.4524 0.8798 -0.1458 -0.4788 0.8625 -0.1639 -0.4788 0.8625 -0.1638 -0.4864 0.8614 -0.1466 -0.4864 0.8613 -0.1466 -0.4989 0.8547 -0.1438 -0.5355 0.8319 -0.1453 -0.4988 0.8530 -0.1536 -0.4989 0.8546 -0.1438 -0.5401 0.8291 -0.1442 -0.5403 0.8291 -0.1441 -0.5448 0.8261 -0.1439 -0.5449 0.8261 -0.1439 -0.5529 0.8205 -0.1451 -0.5530 0.8204 -0.1451 -0.5603 0.8161 -0.1415 -0.5603 0.8161 -0.1415 -0.5169 0.8362 -0.1830 -0.5170 0.8362 -0.1830 -0.5330 0.8253 -0.1867 -0.5330 0.8253 -0.1867 -0.5671 0.8071 -0.1644 -0.5586 0.8139 -0.1596 -0.5586 0.8139 -0.1596 -0.5671 0.8071 -0.1644 -0.5821 0.8021 -0.1333 -0.5822 0.8021 -0.1333 -0.6067 0.7823 -0.1410 -0.6068 0.7823 -0.1410 -0.6319 0.7631 -0.1357 -0.6320 0.7630 -0.1357 -0.6594 0.7415 -0.1239 -0.6594 0.7415 -0.1239 -0.6500 0.7468 -0.1406 -0.6500 0.7468 -0.1406 -0.6608 0.7403 -0.1239 -0.6608 0.7402 -0.1239 -0.5049 0.8573 -0.1008 -0.5049 0.8573 -0.1008 -0.4987 0.8613 -0.0974 -0.4818 0.8743 -0.0594 -0.4919 0.8705 -0.0173 -0.4976 0.8673 -0.0153 -0.4976 0.8673 -0.0153 -0.5148 0.8570 0.0234 -0.5423 0.8400 0.0142 -0.5423 0.8400 0.0142 -0.5768 0.8164 0.0265 -0.5457 0.8380 0.0089 -0.5456 0.8380 0.0089 -0.5086 0.8609 0.0092 -0.5110 0.8593 -0.0239 -0.5110 0.8593 -0.0238 -0.5461 0.8376 -0.0099 -0.5198 0.8536 -0.0348 -0.5198 0.8536 -0.0348 -0.5384 0.8397 -0.0716 -0.5226 0.8496 -0.0705 -0.5226 0.8496 -0.0705 -0.4987 0.8613 -0.0974 -0.5819 0.8111 0.0598 -0.5818 0.8111 0.0597 -0.5983 0.7975 0.0781 -0.5983 0.7975 0.0780 -0.5286 0.8488 -0.0082 -0.5286 0.8488 -0.0083 -0.5306 0.8476 -0.0066 -0.5306 0.8476 -0.0066 -0.5526 0.8332 -0.0228 -0.5526 0.8331 -0.0229 -0.5650 0.8246 -0.0289 -0.5651 0.8245 -0.0289 -0.5792 0.8146 -0.0311 -0.5792 0.8146 -0.0311 -0.5868 0.8090 -0.0345 -0.5869 0.8090 -0.0345 -0.5440 0.8362 -0.0694 -0.5440 0.8362 -0.0694 -0.5275 0.8449 -0.0885 -0.5276 0.8449 -0.0886 -0.5386 0.8387 -0.0805 -0.5387 0.8387 -0.0805 -0.5441 0.8355 -0.0768 -0.5441 0.8355 -0.0768 -0.5887 0.8065 -0.0544 -0.5887 0.8065 -0.0545 -0.6174 0.7851 -0.0499 -0.6501 0.7576 -0.0583 -0.6168 0.7853 -0.0536 -0.6174 0.7851 -0.0499 -0.6149 0.7861 -0.0627 -0.6150 0.7861 -0.0627 -0.6753 0.7309 -0.0989 -0.6753 0.7309 -0.0989 -0.6813 0.7261 -0.0924 -0.6813 0.7261 -0.0924 -0.6921 0.7137 -0.1075 -0.6922 0.7137 -0.1075 -0.6979 0.7099 -0.0947 -0.6979 0.7099 -0.0947 -0.6080 0.7935 -0.0250 -0.6080 0.7935 -0.0250 -0.6091 0.7931 -0.0054 -0.6092 0.7930 -0.0054 -0.6051 0.7961 -0.0107 -0.6051 0.7961 -0.0107 -0.6052 0.7961 -0.0046 -0.6052 0.7961 -0.0047 -0.6191 0.7845 0.0352 -0.6191 0.7845 0.0352 -0.6280 0.7782 0.0035 -0.6110 0.7916 -0.0037 -0.6110 0.7916 -0.0037 -0.6156 0.7877 0.0250 -0.6156 0.7877 0.0250 -0.6280 0.7782 0.0035 -0.6537 0.7568 -0.0002 -0.6537 0.7567 -0.0001 -0.6539 0.7564 -0.0134 -0.6540 0.7564 -0.0135 -0.6545 0.7559 -0.0156 -0.6547 0.7558 -0.0156 -0.6472 0.7618 -0.0293 -0.6472 0.7617 -0.0294 -0.6844 0.7256 -0.0716 -0.6844 0.7256 -0.0716 -0.7434 0.6564 -0.1284 -0.7436 0.6562 -0.1284 -0.7450 0.6517 -0.1421 -0.7450 0.6517 -0.1422 -0.7674 0.6212 -0.1586 -0.7490 0.6494 -0.1313 -0.7512 0.6488 -0.1214 -0.7512 0.6488 -0.1214 -0.7343 0.6729 -0.0894 -0.7063 0.7037 -0.0769 -0.7029 0.7074 -0.0743 -0.7029 0.7074 -0.0743 -0.6755 0.7353 -0.0551 -0.6898 0.7224 -0.0474 -0.6898 0.7224 -0.0474 -0.6626 0.7485 -0.0257 -0.6627 0.7487 -0.0138 -0.6627 0.7487 -0.0138 -0.6947 0.7191 -0.0131 -0.6996 0.7128 -0.0499 -0.6996 0.7128 -0.0499 -0.7293 0.6832 -0.0382 -0.7333 0.6790 -0.0341 -0.7333 0.6791 -0.0341 -0.7618 0.6466 -0.0401 -0.7764 0.6286 -0.0455 -0.7130 0.7007 -0.0279 -0.7130 0.7006 -0.0279 -0.7127 0.7014 -0.0115 -0.7127 0.7013 -0.0116 -0.7764 0.6286 -0.0455 -0.8011 0.5955 -0.0594 -0.8220 0.5637 -0.0804 -0.8395 0.5330 -0.1057 -0.8325 0.5414 -0.1175 -0.8325 0.5414 -0.1175 -0.8426 0.5168 -0.1518 -0.8565 0.4847 -0.1773 -0.8523 0.4905 -0.1816 -0.8523 0.4905 -0.1816 -0.8317 0.5273 -0.1735 -0.8228 0.5495 -0.1455 -0.8228 0.5494 -0.1455 -0.8005 0.5844 -0.1334 -0.7769 0.6088 -0.1602 -0.7674 0.6212 -0.1586 -0.7924 0.5922 -0.1465 -0.7924 0.5922 -0.1465 -0.7937 0.5907 -0.1454 -0.7937 0.5907 -0.1454 -0.8752 0.4420 -0.1963 -0.8752 0.4420 -0.1963 -0.8815 0.4293 -0.1968 -0.8815 0.4293 -0.1968 -0.8722 0.4530 -0.1843 -0.8722 0.4530 -0.1843 -0.8602 0.4813 -0.1687 -0.8602 0.4813 -0.1687 -0.8588 0.4859 -0.1623 -0.8588 0.4859 -0.1623 -0.8766 0.4552 -0.1560 -0.8766 0.4552 -0.1560 -0.8662 0.4777 -0.1466 -0.8662 0.4777 -0.1466 -0.8569 0.4900 -0.1601 -0.8569 0.4900 -0.1601 -0.8365 0.5405 -0.0905 -0.8365 0.5405 -0.0905 -0.8428 0.5297 -0.0957 -0.8428 0.5297 -0.0957 -0.8821 0.4655 -0.0723 -0.8670 0.4867 -0.1072 -0.8821 0.4655 -0.0723 -0.8722 0.4871 -0.0447 -0.8878 0.4549 -0.0695 -0.8721 0.4872 -0.0449 -0.8722 0.4871 -0.0447 -0.8648 0.5002 -0.0430 -0.8648 0.5002 -0.0430 -0.8621 0.5062 -0.0236 -0.8621 0.5062 -0.0236 -0.8869 0.4588 -0.0532 -0.8869 0.4588 -0.0532 -0.9000 0.4255 -0.0947 -0.9000 0.4255 -0.0947 -0.9000 0.4270 -0.0875 -0.9000 0.4270 -0.0875 -0.8458 0.5321 -0.0390 -0.8458 0.5321 -0.0390 -0.8419 0.5386 -0.0342 -0.8419 0.5386 -0.0342 -0.8264 0.5576 -0.0791 -0.8264 0.5576 -0.0791 -0.4970 0.8311 0.2496 -0.4974 0.8306 0.2504 -0.5069 0.8021 0.3158 -0.5046 0.8183 0.2755 -0.5297 0.8133 0.2407 -0.4934 0.8348 0.2441 -0.4831 0.8276 0.2858 -0.5038 0.8044 0.3149 -0.5070 0.8021 0.3156 -0.5112 0.8193 0.2596 -0.5114 0.8192 0.2595 -0.5457 0.8020 0.2429 -0.5457 0.8020 0.2429 -0.5353 0.8161 0.2178 -0.5354 0.8161 0.2177 -0.5304 0.8167 0.2274 -0.5306 0.8166 0.2273 -0.5267 0.8222 0.2160 -0.5267 0.8222 0.2159 -0.5212 0.8251 0.2182 -0.5212 0.8251 0.2181 -0.5191 0.8262 0.2191 -0.5191 0.8261 0.2191 -0.5134 0.8255 0.2344 -0.5136 0.8254 0.2343 -0.4915 0.8389 0.2338 -0.4917 0.8388 0.2339 -0.5501 0.8062 0.2178 -0.5501 0.8062 0.2178 -0.5528 0.8090 0.2000 -0.5528 0.8090 0.2000 -0.5735 0.7990 0.1810 -0.5735 0.7990 0.1810 -0.5715 0.8027 0.1703 -0.5908 0.7960 0.1319 -0.5658 0.8180 0.1040 -0.5369 0.8331 0.1327 -0.5648 0.8102 0.1565 -0.5715 0.8027 0.1704 -0.5276 0.8414 0.1171 -0.5276 0.8414 0.1171 -0.5132 0.8517 0.1061 -0.5133 0.8516 0.1061 -0.5006 0.8607 0.0930 -0.5007 0.8606 0.0931 -0.5468 0.8215 0.1614 -0.5469 0.8215 0.1614 -0.5625 0.8110 0.1605 -0.5625 0.8110 0.1605 -0.5568 0.8119 0.1754 -0.5568 0.8119 0.1753 -0.5494 0.8126 0.1945 -0.5494 0.8126 0.1945 -0.5425 0.8186 0.1887 -0.5425 0.8186 0.1887 -0.5189 0.8296 0.2061 -0.5190 0.8296 0.2061 -0.4871 0.8469 0.2134 -0.4872 0.8468 0.2134 -0.4881 0.8478 0.2072 -0.4881 0.8478 0.2072 -0.4894 0.8523 0.1846 -0.4895 0.8523 0.1845 -0.4508 0.8816 0.1401 -0.4508 0.8816 0.1400 -0.4828 0.8531 0.1978 -0.4689 0.8687 0.1597 -0.4825 0.8532 0.1980 -0.4828 0.8531 0.1977 -0.8007 0.4644 -0.3783 -0.8007 0.4644 -0.3783 -0.8050 0.4553 -0.3802 -0.8050 0.4553 -0.3802 -0.8020 0.4408 -0.4031 -0.8020 0.4408 -0.4031 -0.8026 0.4080 -0.4352 -0.8026 0.4080 -0.4352 -0.7943 0.3976 -0.4593 -0.7943 0.3976 -0.4593 -0.7915 0.3965 -0.4651 -0.7915 0.3965 -0.4651 -0.6511 0.4288 -0.6262 -0.6511 0.4288 -0.6262 -0.6496 0.4164 -0.6361 -0.6496 0.4164 -0.6361 -0.6432 0.4447 -0.6233 -0.6432 0.4447 -0.6233 -0.6443 0.4457 -0.6215 -0.6443 0.4457 -0.6215 -0.5953 0.5467 -0.5888 -0.5953 0.5467 -0.5888 -0.5906 0.5666 -0.5746 -0.5906 0.5666 -0.5746 -0.5823 0.5932 -0.5559 -0.5823 0.5932 -0.5559 -0.5824 0.6123 -0.5347 -0.5824 0.6123 -0.5347 -0.6178 0.4508 -0.6443 -0.6178 0.4508 -0.6443 -0.6478 0.4032 -0.6463 -0.6478 0.4032 -0.6463 -0.6475 0.3993 -0.6491 -0.6475 0.3993 -0.6491 -0.6452 0.4005 -0.6506 -0.6452 0.4005 -0.6506 -0.6133 0.3929 -0.6852 -0.6133 0.3929 -0.6852 -0.6094 0.3937 -0.6882 -0.6094 0.3937 -0.6882 -0.6212 0.4344 -0.6522 -0.6212 0.4344 -0.6522 -0.6224 0.4374 -0.6490 -0.6224 0.4374 -0.6490 -0.6200 0.4384 -0.6507 -0.6200 0.4384 -0.6507 -0.6230 0.3891 -0.6786 -0.6230 0.3891 -0.6786 -0.3530 0.8257 -0.4399 -0.3530 0.8257 -0.4399 -0.3541 0.8321 -0.4268 -0.3541 0.8321 -0.4268 -0.3558 0.8338 -0.4221 -0.3558 0.8338 -0.4221 -0.3993 0.8449 -0.3560 -0.3993 0.8449 -0.3560 -0.5462 0.7942 -0.2662 -0.5462 0.7942 -0.2662 -0.5441 0.7964 -0.2640 -0.5441 0.7964 -0.2640 -0.5527 0.7921 -0.2592 -0.5527 0.7921 -0.2592 -0.5562 0.7918 -0.2522 -0.5562 0.7918 -0.2522 -0.6296 0.7495 -0.2047 -0.6296 0.7495 -0.2047 -0.6411 0.7391 -0.2067 -0.6411 0.7391 -0.2067 -0.6633 0.7222 -0.1962 -0.6633 0.7222 -0.1962 -0.7040 0.6806 -0.2030 -0.7040 0.6806 -0.2030 -0.7066 0.6780 -0.2023 -0.7066 0.6780 -0.2023 -0.7111 0.6746 -0.1981 -0.7111 0.6746 -0.1981 -0.7050 0.6777 -0.2089 -0.7050 0.6777 -0.2089 -0.7012 0.6735 -0.2338 -0.7012 0.6735 -0.2338 -0.7008 0.6720 -0.2393 -0.7008 0.6720 -0.2393 -0.7016 0.6690 -0.2452 -0.7016 0.6690 -0.2452 -0.6917 0.6749 -0.2570 -0.6917 0.6749 -0.2570 -0.6987 0.6627 -0.2697 -0.6987 0.6627 -0.2697 -0.6999 0.6605 -0.2719 -0.6999 0.6605 -0.2719 -0.7026 0.6588 -0.2691 -0.7026 0.6588 -0.2691 -0.7042 0.6555 -0.2728 -0.7042 0.6555 -0.2728 -0.7243 0.6265 -0.2880 -0.7243 0.6265 -0.2880 -0.7258 0.6217 -0.2945 -0.7258 0.6217 -0.2945 -0.7770 0.6041 -0.1767 -0.7770 0.6041 -0.1767 -0.7783 0.6021 -0.1781 -0.7783 0.6021 -0.1781 -0.7757 0.6029 -0.1865 -0.7757 0.6029 -0.1865 -0.7776 0.6010 -0.1846 -0.7776 0.6010 -0.1846 -0.7884 0.5274 -0.3168 -0.7884 0.5274 -0.3168 -0.7904 0.5172 -0.3283 -0.7904 0.5172 -0.3283 -0.8037 0.4852 -0.3444 -0.8037 0.4852 -0.3444 -0.8035 0.4834 -0.3473 -0.8035 0.4834 -0.3473 -0.8032 0.4816 -0.3506 -0.8032 0.4816 -0.3506 -0.6620 0.7215 -0.2030 -0.6620 0.7215 -0.2030 -0.7008 0.6597 -0.2713 -0.7008 0.6597 -0.2713 -0.8548 0.1822 -0.4859 -0.8548 0.1822 -0.4859 -0.7956 0.3044 -0.5239 -0.7956 0.3044 -0.5239 -0.7427 0.0779 -0.6651 -0.7377 0.1100 -0.6661 -0.7134 0.1289 -0.6888 -0.7107 0.1315 -0.6911 -0.7107 0.1316 -0.6911 -0.6911 0.1555 -0.7059 -0.6739 0.1299 -0.7273 -0.6973 0.1100 -0.7083 -0.7013 0.1089 -0.7045 -0.7013 0.1089 -0.7045 -0.7249 0.0891 -0.6831 -0.7427 0.0778 -0.6651 -0.6706 0.1425 -0.7280 -0.6705 0.1424 -0.7281 -0.6171 0.1506 -0.7723 -0.6171 0.1505 -0.7724 -0.5986 0.1141 -0.7929 -0.5985 0.1141 -0.7930 -0.6472 0.0131 -0.7622 -0.6471 0.0132 -0.7623 -0.7685 0.0411 -0.6385 -0.7453 0.0608 -0.6639 -0.7670 0.0814 -0.6365 -0.7839 0.0694 -0.6170 -0.7972 0.0751 -0.5991 -0.7878 0.0433 -0.6145 -0.7685 0.0410 -0.6385 -0.7839 0.0694 -0.6170 -0.8050 0.0886 -0.5866 -0.7972 0.0751 -0.5990 -0.9741 0.2260 -0.0086 -0.9741 0.2260 -0.0086 -0.9786 0.1772 0.1047 -0.9785 0.1798 0.1010 -0.9841 0.1428 0.1059 -0.9841 0.1428 0.1059 -0.9907 0.1258 0.0524 -0.9907 0.1258 0.0524 -0.9908 0.1237 0.0540 -0.9908 0.1237 0.0540 -0.9909 0.1223 0.0569 -0.9909 0.1223 0.0569 -0.9921 0.1218 0.0298 -0.9921 0.1218 0.0298 -0.9921 0.1224 0.0268 -0.9921 0.1224 0.0268 -0.9917 0.1243 0.0322 -0.9917 0.1243 0.0322 -0.9925 0.1198 0.0235 -0.9925 0.1198 0.0235 -0.9924 0.1219 0.0178 -0.9924 0.1219 0.0178 -0.9942 0.1075 0.0078 -0.9942 0.1075 0.0078 -0.9938 0.1108 0.0036 -0.9938 0.1108 0.0036 -0.9952 0.0977 -0.0104 -0.9952 0.0977 -0.0104 -0.9953 0.0963 -0.0117 -0.9953 0.0963 -0.0117 -0.9956 0.0917 -0.0201 -0.9956 0.0917 -0.0201 -0.9960 0.0861 -0.0251 -0.9960 0.0861 -0.0251 -0.9965 0.0774 -0.0319 -0.9965 0.0774 -0.0319 -0.9973 0.0702 -0.0225 -0.9973 0.0702 -0.0225 -0.9978 0.0626 -0.0233 -0.9978 0.0626 -0.0233 -0.9928 0.0670 -0.0990 -0.9928 0.0670 -0.0990 -0.9920 0.0639 -0.1091 -0.9920 0.0639 -0.1091 -0.9932 0.0470 -0.1061 -0.9932 0.0470 -0.1061 -0.9909 0.0493 -0.1249 -0.9909 0.0493 -0.1249 -0.9913 0.0224 -0.1300 -0.9913 0.0224 -0.1300 -0.9898 0.0281 -0.1398 -0.9898 0.0281 -0.1398 -0.9890 0.0138 -0.1472 -0.9888 0.0140 -0.1486 -0.9605 0.2183 -0.1727 -0.9605 0.2183 -0.1727 -0.9604 0.2197 -0.1714 -0.9604 0.2197 -0.1714 -0.9966 0.0702 -0.0434 -0.9966 0.0702 -0.0434 -0.9974 0.0560 -0.0455 -0.9974 0.0560 -0.0455 -0.9776 0.1942 0.0807 -0.9774 0.1956 0.0797 -0.8189 0.4000 0.4117 -0.8189 0.4000 0.4117 -0.9824 0.1394 0.1242 -0.9824 0.1394 0.1242 -0.9753 0.1573 0.1549 -0.9753 0.1573 0.1549 -0.9728 0.1901 0.1325 -0.9728 0.1901 0.1325 -0.9725 0.1947 0.1276 -0.9725 0.1947 0.1276 -0.9718 0.1967 0.1299 -0.9718 0.1967 0.1299 -0.9658 0.2099 0.1521 -0.9658 0.2099 0.1521 -0.9553 0.2235 0.1935 -0.9553 0.2235 0.1935 -0.9483 0.2451 0.2018 -0.9483 0.2451 0.2018 -0.9180 0.2183 0.3310 -0.9180 0.2183 0.3310 -0.9823 0.1422 0.1223 -0.9823 0.1414 0.1231 -0.9818 0.1454 0.1226 -0.9823 0.1424 0.1214 -0.9809 0.1508 0.1230 -0.9811 0.1486 0.1237 -0.9802 0.1543 0.1243 -0.9808 0.1513 0.1230 -0.9632 0.2137 0.1631 -0.9634 0.2134 0.1622 -0.9049 0.4079 -0.1213 -0.9049 0.4079 -0.1213 -0.9177 0.3760 -0.1286 -0.9177 0.3760 -0.1286 -0.9109 0.3963 -0.1150 -0.9109 0.3963 -0.1150 -0.9095 0.3942 -0.1318 -0.9095 0.3942 -0.1318 -0.9086 0.3941 -0.1382 -0.9086 0.3941 -0.1382 -0.9125 0.3856 -0.1366 -0.9125 0.3856 -0.1366 -0.9130 0.3807 -0.1463 -0.9130 0.3807 -0.1463 -0.9150 0.3788 -0.1387 -0.9150 0.3788 -0.1387 -0.9222 0.3639 -0.1311 -0.9222 0.3639 -0.1311 -0.9227 0.3523 -0.1564 -0.9227 0.3523 -0.1564 -0.9290 0.3353 -0.1564 -0.9290 0.3353 -0.1564 -0.9299 0.3324 -0.1575 -0.9299 0.3324 -0.1575 -0.9257 0.3423 -0.1608 -0.9257 0.3423 -0.1608 -0.9340 0.3267 -0.1445 -0.9340 0.3267 -0.1445 -0.9350 0.3153 -0.1625 -0.9350 0.3153 -0.1625 -0.9323 0.3153 -0.1772 -0.9323 0.3153 -0.1772 -0.9210 0.3350 -0.1989 -0.9210 0.3350 -0.1989 -0.9524 0.2411 -0.1866 -0.9524 0.2411 -0.1866 -0.9536 0.2290 -0.1956 -0.9536 0.2290 -0.1956 -0.9535 0.2247 -0.2011 -0.9535 0.2247 -0.2011 -0.8870 0.3234 -0.3296 -0.8870 0.3234 -0.3296 -0.9036 0.2420 -0.3535 -0.9008 0.2099 -0.3802 -0.9036 0.2420 -0.3535 -0.9100 0.2179 -0.3528 -0.9100 0.2179 -0.3528 -0.9113 0.2039 -0.3576 -0.9113 0.2039 -0.3576 -0.9101 0.1914 -0.3674 -0.9101 0.1914 -0.3674 -0.9240 0.1647 -0.3452 -0.9240 0.1647 -0.3452 -0.9262 0.1723 -0.3352 -0.9262 0.1723 -0.3352 -0.9298 0.1762 -0.3232 -0.9298 0.1762 -0.3232 -0.9338 0.1896 -0.3034 -0.9338 0.1896 -0.3034 -0.9370 0.1959 -0.2893 -0.9370 0.1959 -0.2893 -0.9401 0.1960 -0.2790 -0.9401 0.1960 -0.2790 -0.9414 0.1972 -0.2738 -0.9414 0.1972 -0.2738 -0.9439 0.1985 -0.2639 -0.9439 0.1985 -0.2639 -0.9416 0.2051 -0.2669 -0.9416 0.2051 -0.2669 -0.9457 0.2107 -0.2474 -0.9457 0.2107 -0.2474 -0.9476 0.2115 -0.2396 -0.9476 0.2115 -0.2396 -0.9484 0.2135 -0.2344 -0.9484 0.2135 -0.2344 -0.9464 0.2245 -0.2323 -0.9464 0.2245 -0.2323 -0.9470 0.2262 -0.2279 -0.9470 0.2262 -0.2279 -0.9403 0.2210 -0.2588 -0.9403 0.2210 -0.2588 -0.9385 0.2132 -0.2715 -0.9385 0.2132 -0.2715 -0.9361 0.2089 -0.2832 -0.9361 0.2089 -0.2832 -0.9750 0.0498 -0.2167 -0.9750 0.0498 -0.2167 -0.9560 0.0217 -0.2924 -0.9605 0.0000 -0.2782 -0.9604 0.0000 -0.2785 -0.9560 0.0217 -0.2924 -0.9525 0.0191 -0.3038 -0.9525 0.0191 -0.3038 -0.9490 0.0331 -0.3134 -0.9490 0.0331 -0.3134 -0.9450 0.0302 -0.3256 -0.9450 0.0302 -0.3256 -0.9563 0.0014 -0.2924 -0.9574 0.0000 -0.2888 -0.9565 0.0000 -0.2918 -0.9563 0.0014 -0.2924 -0.6964 0.7050 0.1342 -0.6964 0.7050 0.1342 -0.7350 0.6573 0.1664 -0.7350 0.6573 0.1664 -0.7950 0.5590 0.2357 -0.7950 0.5590 0.2357 -0.7970 0.5521 0.2449 -0.7970 0.5521 0.2449 -0.7972 0.5449 0.2600 -0.7972 0.5449 0.2600 -0.7980 0.5422 0.2630 -0.7980 0.5422 0.2630 -0.7921 0.5413 0.2820 -0.7921 0.5413 0.2820 -0.7921 0.5384 0.2875 -0.7921 0.5384 0.2875 -0.7901 0.5359 0.2976 -0.7901 0.5359 0.2976 -0.7888 0.5350 0.3025 -0.7888 0.5350 0.3025 -0.7858 0.5341 0.3119 -0.7858 0.5341 0.3119 -0.7819 0.5336 0.3223 -0.7819 0.5336 0.3223 -0.7751 0.5349 0.3364 -0.7751 0.5349 0.3364 -0.7663 0.5384 0.3505 -0.7663 0.5384 0.3505 -0.5038 0.8272 0.2489 -0.5038 0.8272 0.2488 -0.5382 0.2084 -0.8167 -0.5382 0.2084 -0.8167 0.6235 0.3432 0.7024 0.6344 0.3456 0.6914 0.6344 0.3456 0.6915 0.6563 0.3491 0.6689 0.6563 0.3491 0.6689 0.6852 0.3392 0.6445 0.6809 0.3326 0.6525 0.6809 0.3326 0.6525 0.6997 0.3054 0.6459 0.7078 0.2965 0.6412 0.7078 0.2965 0.6412 0.7211 0.3220 0.6134 0.7211 0.3220 0.6134 0.7438 0.3079 0.5932 0.7438 0.3079 0.5932 0.7318 0.2835 0.6198 0.7318 0.2835 0.6198 0.7230 0.2633 0.6387 0.7230 0.2633 0.6387 0.7027 0.2470 0.6672 0.7027 0.2470 0.6672 0.6991 0.2156 0.6817 0.6888 0.1864 0.7006 0.6798 0.1659 0.7144 0.6798 0.1659 0.7144 0.7011 0.1564 0.6957 0.7011 0.1564 0.6957 0.7156 0.1837 0.6739 0.7210 0.2150 0.6587 0.7218 0.2339 0.6514 0.7218 0.2339 0.6514 0.7494 0.2230 0.6234 0.7583 0.2174 0.6145 0.7583 0.2174 0.6145 0.7377 0.1976 0.6455 0.7377 0.1964 0.6460 0.7377 0.1964 0.6460 0.7313 0.1650 0.6618 0.7265 0.1515 0.6703 0.7265 0.1515 0.6703 0.7084 0.1267 0.6944 0.7156 0.0961 0.6919 0.7157 0.0946 0.6919 0.7158 0.0946 0.6919 0.7244 0.0643 0.6863 0.7369 0.0413 0.6747 0.7369 0.0413 0.6748 0.7537 0.0146 0.6571 0.7613 0.0060 0.6483 0.7613 0.0060 0.6483 0.7667 0.0000 0.6421 0.7786 0.0000 0.6275 0.7813 0.0000 0.6242 0.6517 0.0000 0.7585 0.6293 0.0206 0.7769 0.6275 0.0279 0.7781 0.6275 0.0279 0.7781 0.6143 0.0432 0.7879 0.6143 0.0432 0.7879 0.5933 0.0615 0.8027 0.6189 0.0444 0.7843 0.6178 0.0413 0.7852 0.6187 0.0444 0.7844 0.6165 0.0436 0.7861 0.6183 0.0451 0.7846 0.6172 0.0418 0.7857 0.5778 0.1113 0.8086 0.5696 0.0997 0.8158 0.5712 0.0885 0.8160 0.5366 0.0916 0.8389 0.5249 0.0985 0.8455 0.5248 0.0985 0.8455 0.5587 0.0935 0.8240 0.5696 0.0997 0.8158 0.5712 0.0885 0.8160 0.5915 0.0688 0.8034 0.5933 0.0615 0.8027 0.5707 0.1447 0.8083 0.5687 0.1388 0.8108 0.5687 0.1388 0.8108 0.5768 0.1144 0.8088 0.5778 0.1113 0.8086 0.5512 0.1898 0.8125 0.5563 0.1649 0.8144 0.5707 0.1447 0.8083 0.3738 0.1677 0.9122 0.4085 0.1722 0.8964 0.4137 0.1705 0.8943 0.4137 0.1705 0.8943 0.4497 0.1768 0.8755 0.4509 0.1758 0.8751 0.4509 0.1758 0.8751 0.4635 0.1957 0.8642 0.4635 0.1957 0.8642 0.4483 0.2123 0.8683 0.4352 0.2296 0.8706 0.4345 0.2297 0.8709 0.5050 0.1021 0.8570 0.5346 0.1195 0.8366 0.5537 0.1266 0.8230 0.5537 0.1266 0.8230 0.5372 0.1465 0.8307 0.5112 0.1534 0.8456 0.5112 0.1534 0.8456 0.4836 0.1631 0.8599 0.4883 0.1414 0.8611 0.4798 0.1618 0.8623 0.4584 0.1425 0.8773 0.4584 0.1425 0.8772 0.4266 0.1461 0.8926 0.4177 0.1523 0.8957 0.4177 0.1523 0.8957 0.3866 0.1543 0.9092 0.3738 0.1677 0.9122 0.2968 0.1768 0.9384 0.2927 0.1583 0.9430 0.2992 0.1453 0.9431 0.3095 0.1342 0.9414 0.3157 0.1225 0.9409 0.3157 0.1225 0.9409 0.3308 0.1127 0.9369 0.3508 0.1041 0.9306 0.3656 0.0965 0.9258 0.3656 0.0965 0.9258 0.3944 0.0904 0.9145 0.4214 0.0815 0.9032 0.4244 0.0788 0.9020 0.4244 0.0788 0.9020 0.4470 0.0658 0.8921 0.4623 0.0488 0.8854 0.4648 0.0414 0.8845 0.4648 0.0414 0.8845 0.4739 0.0622 0.8784 0.4824 0.0423 0.8749 0.5109 0.0584 0.8576 0.5164 0.0493 0.8549 0.5164 0.0493 0.8549 0.5239 0.0722 0.8487 0.5063 0.0907 0.8576 0.5050 0.1021 0.8570 0.6855 0.3293 0.6494 0.6855 0.3293 0.6494 0.6880 0.3158 0.6534 0.6880 0.3158 0.6534 0.6917 0.3291 0.6429 0.6917 0.3291 0.6429 0.7100 0.3104 0.6321 0.7100 0.3104 0.6321 0.7074 0.3223 0.6290 0.7074 0.3223 0.6290 0.7134 0.3072 0.6298 0.7134 0.3072 0.6298 0.7209 0.3266 0.6112 0.7209 0.3266 0.6112 0.7225 0.3284 0.6084 0.7225 0.3284 0.6084 0.7155 0.3305 0.6155 0.7155 0.3305 0.6155 0.7170 0.3352 0.6112 0.7170 0.3352 0.6112 0.7194 0.3344 0.6088 0.7194 0.3344 0.6088 0.7170 0.3397 0.6088 0.7170 0.3397 0.6088 0.7188 0.3439 0.6042 0.7188 0.3439 0.6042 0.7240 0.3424 0.5989 0.7240 0.3424 0.5989 0.7265 0.3447 0.5945 0.7265 0.3447 0.5945 0.7314 0.3618 0.5780 0.7471 0.3299 0.5771 0.7314 0.3618 0.5780 0.7414 0.3140 0.5931 0.7414 0.3140 0.5931 0.7288 0.3328 0.5983 0.7288 0.3328 0.5983 0.7210 0.3405 0.6035 0.7210 0.3405 0.6035 0.7254 0.3329 0.6024 0.7254 0.3329 0.6024 0.7227 0.3142 0.6156 0.7227 0.3142 0.6156 0.7247 0.3158 0.6125 0.7247 0.3158 0.6125 0.7379 0.2789 0.6146 0.7379 0.2789 0.6146 0.7330 0.2751 0.6221 0.7330 0.2751 0.6221 0.7287 0.2754 0.6271 0.7287 0.2754 0.6271 0.7224 0.2609 0.6404 0.7224 0.2609 0.6404 0.7003 0.2196 0.6792 0.7003 0.2196 0.6792 0.7006 0.2105 0.6818 0.7006 0.2105 0.6818 0.6994 0.2057 0.6845 0.6994 0.2057 0.6845 0.6970 0.2058 0.6869 0.6970 0.2058 0.6869 0.7020 0.2022 0.6829 0.7020 0.2022 0.6829 0.6933 0.1840 0.6968 0.6933 0.1840 0.6968 0.6875 0.1809 0.7033 0.6875 0.1809 0.7033 0.6830 0.1748 0.7091 0.6830 0.1748 0.7091 0.6817 0.1775 0.7097 0.6817 0.1775 0.7097 0.5678 0.1323 0.8124 0.5678 0.1323 0.8124 0.5706 0.1110 0.8137 0.5706 0.1110 0.8137 0.5711 0.0831 0.8166 0.5711 0.0831 0.8166 0.5862 0.0784 0.8064 0.5862 0.0784 0.8064 0.5869 0.0756 0.8061 0.5869 0.0756 0.8061 0.5892 0.0702 0.8049 0.5892 0.0702 0.8049 0.5912 0.0656 0.8038 0.5912 0.0656 0.8038 0.7562 0.2115 0.6192 0.7733 0.1825 0.6072 0.7561 0.2113 0.6194 0.7562 0.2115 0.6192 0.7211 0.1329 0.6800 0.7211 0.1329 0.6800 0.7421 0.1209 0.6593 0.7421 0.1209 0.6593 0.7636 0.0564 0.6432 0.7636 0.0564 0.6432 0.7652 0.0426 0.6423 0.7652 0.0426 0.6423 0.7755 0.0211 0.6310 0.7755 0.0211 0.6310 0.7795 0.0197 0.6261 0.7795 0.0197 0.6261 0.7214 0.1198 0.6821 0.7214 0.1198 0.6821 0.6047 0.0618 0.7940 0.6047 0.0618 0.7940 0.5971 0.0510 0.8005 0.5971 0.0510 0.8005 0.5928 0.0579 0.8033 0.5928 0.0579 0.8033 0.5924 0.0589 0.8035 0.5924 0.0589 0.8035 0.5912 0.0000 0.8066 0.5929 0.0000 0.8053 0.5944 0.0000 0.8042 0.6240 0.0139 0.7813 0.6238 0.0158 0.7814 0.6238 0.0158 0.7814 0.6322 0.0000 0.7748 0.5505 0.1455 0.8220 0.5505 0.1455 0.8220 0.5632 0.1118 0.8187 0.5632 0.1118 0.8187 0.5620 0.1177 0.8187 0.5620 0.1177 0.8187 0.5449 0.1211 0.8297 0.5449 0.1211 0.8297 0.5612 0.1084 0.8205 0.5612 0.1084 0.8205 0.5556 0.1044 0.8249 0.5556 0.1044 0.8249 0.5643 0.0971 0.8198 0.5643 0.0971 0.8198 0.5300 0.1048 0.8415 0.5300 0.1048 0.8415 0.2949 0.1410 0.9451 0.2949 0.1410 0.9451 0.3052 0.1343 0.9428 0.3052 0.1343 0.9428 0.3103 0.1327 0.9413 0.3103 0.1327 0.9413 0.3095 0.1259 0.9425 0.3095 0.1259 0.9425 0.3112 0.1319 0.9412 0.3112 0.1319 0.9412 0.3263 0.1129 0.9385 0.3263 0.1129 0.9385 0.3322 0.1092 0.9369 0.3322 0.1092 0.9369 0.3195 0.1193 0.9400 0.3195 0.1193 0.9400 0.3214 0.1166 0.9397 0.3214 0.1166 0.9397 0.3208 0.1161 0.9400 0.3208 0.1161 0.9400 0.3425 0.1050 0.9337 0.3425 0.1050 0.9337 0.3469 0.0957 0.9330 0.3469 0.0957 0.9330 0.3578 0.0958 0.9289 0.3578 0.0958 0.9289 0.3525 0.0932 0.9312 0.3525 0.0932 0.9312 0.3605 0.0913 0.9283 0.3605 0.0913 0.9283 0.3636 0.0872 0.9275 0.3636 0.0872 0.9275 0.3637 0.0849 0.9276 0.3637 0.0849 0.9276 0.4070 0.0898 0.9090 0.4070 0.0898 0.9090 0.4153 0.0815 0.9060 0.4153 0.0815 0.9060 0.4376 0.0679 0.8966 0.4376 0.0679 0.8966 0.4397 0.0708 0.8953 0.4397 0.0708 0.8953 0.4434 0.0638 0.8940 0.4434 0.0638 0.8940 0.4617 0.0489 0.8857 0.4617 0.0489 0.8857 0.4630 0.0471 0.8851 0.4630 0.0471 0.8851 0.4699 0.0429 0.8817 0.4699 0.0429 0.8817 0.4874 0.0486 0.8719 0.4874 0.0486 0.8719 0.4984 0.0466 0.8657 0.4984 0.0466 0.8657 0.5068 0.0462 0.8608 0.5068 0.0462 0.8608 0.5148 0.1069 0.8506 0.5148 0.1069 0.8506 0.5158 0.1588 0.8419 0.5158 0.1588 0.8419 0.5025 0.1730 0.8471 0.5025 0.1730 0.8471 0.4564 0.1933 0.8685 0.4564 0.1933 0.8685 0.4644 0.1682 0.8695 0.4644 0.1682 0.8695 0.4625 0.1836 0.8674 0.4625 0.1836 0.8674 0.4614 0.1851 0.8677 0.4614 0.1851 0.8677 0.4612 0.1905 0.8666 0.4612 0.1905 0.8666 0.4076 0.2293 0.8839 0.4076 0.2293 0.8839 0.6091 0.2079 0.7654 0.6091 0.2079 0.7654 0.6654 0.1044 0.7391 0.6654 0.1044 0.7391 0.6664 0.1112 0.7372 0.6664 0.1112 0.7372 0.6878 0.0741 0.7221 0.6878 0.0741 0.7221 0.6001 0.0532 0.7981 0.5980 0.0562 0.7995 0.5002 0.1334 0.8556 0.5002 0.1334 0.8556 0.4951 0.1241 0.8600 0.4951 0.1241 0.8600 0.4069 0.1979 0.8918 0.4069 0.1979 0.8918 0.4267 0.2253 0.8759 0.3970 0.2029 0.8951 0.4079 0.2276 0.8842 0.4167 0.2288 0.8797 0.4167 0.2288 0.8797 0.4267 0.2253 0.8759 0.3204 0.1637 0.9330 0.3204 0.1637 0.9330 0.0854 0.3380 -0.9373 0.0758 0.3583 -0.9305 0.0624 0.3712 -0.9264 0.0565 0.3765 -0.9247 0.0517 0.3837 -0.9220 0.0350 0.3869 -0.9215 0.0184 0.3916 -0.9199 0.0075 0.3949 -0.9187 -0.1431 0.3780 -0.9147 -0.1619 0.3781 -0.9115 -0.1732 0.3616 -0.9161 -0.1838 0.3455 -0.9202 -0.1998 0.3391 -0.9193 -0.2105 0.3372 -0.9176 -0.2907 0.2784 -0.9154 -0.2993 0.2627 -0.9173 -0.3076 0.2472 -0.9189 -0.3162 0.2323 -0.9198 -0.3155 0.2239 -0.9221 -0.3187 0.1032 -0.9422 -0.3218 0.0889 -0.9426 -0.3211 0.0740 -0.9441 -0.3132 0.0585 -0.9479 -0.2798 0.0534 -0.9586 -0.2274 0.0704 -0.9712 -0.2006 0.0554 -0.9781 -0.1944 0.0449 -0.9799 -0.1910 0.0529 -0.9802 -0.1837 0.0594 -0.9812 -0.1797 0.0635 -0.9817 0.0565 0.3765 -0.9247 0.0517 0.3837 -0.9220 0.3174 0.0000 -0.9483 0.3267 0.0138 -0.9450 0.3301 0.0283 -0.9435 0.3354 0.0433 -0.9411 0.3322 0.0576 -0.9414 0.3311 0.0583 -0.9418 0.3311 0.0583 -0.9418 0.3274 0.0725 -0.9421 0.3259 0.0871 -0.9414 0.3254 0.1022 -0.9400 0.3181 0.1153 -0.9410 0.3086 0.1272 -0.9426 0.3045 0.1413 -0.9420 0.3015 0.1560 -0.9406 0.3009 0.1609 -0.9400 0.3009 0.1609 -0.9400 0.2972 0.1759 -0.9385 0.2994 0.1945 -0.9341 0.2905 0.2071 -0.9342 0.2901 0.2072 -0.9343 0.1233 0.3330 -0.9348 0.1192 0.2987 -0.9469 0.1026 0.2917 -0.9510 0.1003 0.3195 -0.9423 0.0897 0.3342 -0.9382 0.0854 0.3380 -0.9373 0.0075 0.3949 -0.9187 -0.0098 0.3980 -0.9173 -0.0270 0.3960 -0.9179 -0.0441 0.3943 -0.9179 -0.0614 0.3928 -0.9176 -0.0796 0.3980 -0.9139 -0.0971 0.3952 -0.9135 -0.0992 0.3944 -0.9136 -0.0992 0.3944 -0.9136 -0.1144 0.3842 -0.9161 -0.1286 0.3727 -0.9190 -0.1431 0.3780 -0.9147 -0.2105 0.3372 -0.9176 -0.2255 0.3285 -0.9172 -0.2403 0.3195 -0.9166 -0.2517 0.3060 -0.9182 -0.2693 0.3003 -0.9150 -0.2832 0.2894 -0.9144 -0.2907 0.2784 -0.9154 -0.3155 0.2239 -0.9221 -0.3154 0.2045 -0.9267 -0.3184 0.1876 -0.9292 -0.3179 0.1696 -0.9329 -0.3303 0.1583 -0.9305 -0.3264 0.1400 -0.9348 -0.3259 0.1235 -0.9373 -0.3215 0.1066 -0.9409 -0.3187 0.1032 -0.9422 -0.2798 0.0534 -0.9586 -0.2732 0.0645 -0.9598 -0.2533 0.0705 -0.9648 -0.2282 0.0725 -0.9709 -0.2274 0.0704 -0.9712 -0.1797 0.0635 -0.9817 -0.1575 0.0624 -0.9855 -0.1580 0.0548 -0.9859 -0.1357 0.0418 -0.9899 -0.1276 0.0335 -0.9913 -0.1191 0.0260 -0.9925 -0.1127 0.0195 -0.9934 -0.1069 0.0138 -0.9942 -0.1051 0.0090 -0.9944 -0.1027 0.0044 -0.9947 -0.0992 0.0000 -0.9951 0.2901 0.2072 -0.9343 0.2732 0.2130 -0.9381 0.2759 0.2336 -0.9323 0.2739 0.2523 -0.9281 0.2675 0.2685 -0.9254 0.2556 0.2799 -0.9254 0.2494 0.2975 -0.9216 0.2452 0.3013 -0.9215 0.2453 0.3014 -0.9214 0.2454 0.3261 -0.9129 0.2303 0.3354 -0.9135 0.2080 0.3300 -0.9208 0.1908 0.3339 -0.9231 0.1743 0.3380 -0.9249 0.1593 0.3452 -0.9249 0.1431 0.3493 -0.9260 0.1232 0.3330 -0.9348 -0.2067 0.0473 -0.9773 -0.2067 0.0473 -0.9773 -0.2809 0.0501 -0.9584 -0.2809 0.0501 -0.9584 -0.3702 0.1002 -0.9235 -0.3702 0.1002 -0.9235 -0.3797 0.1152 -0.9179 -0.3797 0.1152 -0.9179 -0.3839 0.1210 -0.9154 -0.3839 0.1210 -0.9154 -0.0173 0.4114 -0.9113 -0.0173 0.4114 -0.9113 0.3313 0.0169 -0.9434 0.3313 0.0169 -0.9434 0.3305 0.0772 -0.9407 0.3305 0.0772 -0.9407 0.3261 0.0943 -0.9406 0.3261 0.0943 -0.9406 0.1038 0.3163 -0.9430 0.1038 0.3163 -0.9430 -0.0459 0.4002 -0.9153 -0.0459 0.4002 -0.9153 -0.0750 0.4050 -0.9112 -0.0750 0.4050 -0.9112 -0.0957 0.4041 -0.9097 -0.0957 0.4041 -0.9097 0.2612 0.2934 -0.9196 0.2612 0.2934 -0.9196 0.2576 0.2802 -0.9247 0.2576 0.2802 -0.9247 0.8107 0.0000 0.5855 0.8176 -0.0314 0.5749 0.8176 -0.0314 0.5749 0.8143 -0.0669 0.5766 0.8069 -0.0838 0.5847 0.8069 -0.0838 0.5847 0.8249 -0.1063 0.5552 0.8355 -0.1367 0.5323 0.8364 -0.1377 0.5306 0.8364 -0.1377 0.5306 0.8560 -0.1511 0.4945 0.8626 -0.1833 0.4714 0.8624 -0.2019 0.4643 0.8795 -0.2469 0.4068 0.8878 -0.2706 0.3722 0.8939 -0.2742 0.3545 0.8624 -0.2019 0.4643 0.8720 -0.2282 0.4331 0.8795 -0.2469 0.4068 0.8939 -0.2742 0.3545 0.9114 -0.2625 0.3169 0.9213 -0.2734 0.2766 0.9213 -0.2734 0.2767 0.9318 -0.2770 0.2346 0.9357 -0.2811 0.2134 0.9357 -0.2811 0.2134 0.9499 -0.2508 0.1863 0.9611 -0.2272 0.1570 0.9611 -0.2271 0.1570 0.9716 -0.2018 0.1233 0.9809 -0.1684 0.0972 0.9884 -0.1313 0.0758 0.9885 -0.1306 0.0759 0.9885 -0.1306 0.0759 0.9920 -0.0894 0.0892 0.9946 -0.0539 0.0886 0.9946 -0.0539 0.0886 0.9956 -0.0108 0.0928 0.9952 0.0000 0.0979 0.8494 -0.2032 0.4870 0.8494 -0.2032 0.4870 0.8524 -0.2139 0.4772 0.8524 -0.2139 0.4772 0.8500 -0.2408 0.4685 0.8500 -0.2408 0.4685 0.8433 -0.2456 0.4781 0.8433 -0.2456 0.4781 0.8416 -0.2616 0.4725 0.8416 -0.2616 0.4725 0.8414 -0.2743 0.4657 0.8414 -0.2743 0.4657 0.8366 -0.2683 0.4776 0.8366 -0.2683 0.4776 0.8036 -0.2456 0.5420 0.8036 -0.2456 0.5420 0.8780 -0.4038 0.2571 0.8780 -0.4038 0.2571 0.8792 -0.4001 0.2588 0.8792 -0.4001 0.2588 0.8843 -0.3887 0.2588 0.8843 -0.3887 0.2588 0.8865 -0.3802 0.2638 0.8865 -0.3802 0.2638 0.8854 -0.3742 0.2757 0.8854 -0.3742 0.2757 0.8813 -0.3739 0.2889 0.8813 -0.3739 0.2889 0.8723 -0.3961 0.2866 0.8723 -0.3961 0.2866 0.8673 -0.4053 0.2891 0.8673 -0.4053 0.2891 0.8644 -0.4089 0.2924 0.8644 -0.4089 0.2924 0.9026 -0.2646 0.3396 0.9026 -0.2646 0.3396 0.9408 -0.2695 0.2058 0.9408 -0.2695 0.2058 0.9419 -0.2690 0.2011 0.9419 -0.2690 0.2011 0.9427 -0.2714 0.1941 0.9427 -0.2714 0.1941 0.9442 -0.2647 0.1960 0.9442 -0.2647 0.1960 0.9662 -0.2210 0.1325 0.9662 -0.2210 0.1325 0.7503 -0.1308 -0.6480 0.7503 -0.1308 -0.6480 0.7794 -0.1686 -0.6034 0.7794 -0.1686 -0.6034 0.9565 -0.0957 -0.2755 0.9565 -0.0957 -0.2755 0.9592 -0.2461 -0.1389 0.9592 -0.2461 -0.1389 0.9855 -0.0945 0.1408 0.9855 -0.0945 0.1408 0.9592 -0.0653 0.2749 0.9592 -0.0653 0.2749 0.9939 0.0000 0.1104 0.9929 0.0000 0.1191 0.9914 0.0000 0.1306 0.9913 0.0000 0.1313 0.9913 0.0000 0.1317 0.9907 0.0000 0.1358 0.9908 0.0000 0.1355 0.9908 0.0000 0.1352 -0.6165 -0.0223 0.7870 -0.6165 -0.0223 0.7870 -0.6164 -0.0318 0.7868 -0.6164 -0.0318 0.7868 -0.6149 -0.0371 0.7877 -0.6149 -0.0371 0.7877 -0.6129 -0.0424 0.7890 -0.6129 -0.0424 0.7890 -0.6067 -0.0621 0.7925 -0.6067 -0.0621 0.7925 -0.6106 -0.0641 0.7893 -0.6106 -0.0641 0.7893 -0.5814 -0.1258 0.8038 -0.5814 -0.1258 0.8038 -0.5714 -0.1397 0.8087 -0.5714 -0.1397 0.8087 -0.5679 -0.1452 0.8102 -0.5679 -0.1452 0.8102 -0.4793 -0.1185 0.8696 -0.4793 -0.1185 0.8696 -0.4874 -0.0606 0.8711 -0.4874 -0.0606 0.8711 -0.4475 -0.0816 0.8906 -0.4475 -0.0816 0.8906 -0.4033 -0.0778 0.9118 -0.4033 -0.0778 0.9118 -0.8558 -0.3842 0.3465 -0.8558 -0.3842 0.3465 -0.8550 -0.3759 0.3574 -0.8550 -0.3759 0.3574 -0.8588 -0.3722 0.3519 -0.8588 -0.3722 0.3519 -0.8593 -0.3662 0.3571 -0.8593 -0.3662 0.3571 -0.8593 -0.3617 0.3617 -0.8593 -0.3617 0.3617 -0.8613 -0.3486 0.3697 -0.8613 -0.3486 0.3697 -0.8663 -0.3270 0.3776 -0.8663 -0.3270 0.3776 -0.8715 -0.3162 0.3748 -0.8715 -0.3162 0.3748 -0.8749 -0.2853 0.3914 -0.8749 -0.2853 0.3914 -0.8840 -0.2419 0.4000 -0.8840 -0.2419 0.4000 -0.8864 -0.1885 0.4228 -0.8864 -0.1885 0.4228 -0.8910 -0.1297 0.4350 -0.8910 -0.1297 0.4350 -0.8932 -0.0947 0.4396 -0.8932 -0.0947 0.4396 -0.8802 -0.0406 0.4728 -0.8802 -0.0406 0.4728 -0.8793 -0.0262 0.4755 -0.8793 -0.0262 0.4755 -0.9418 -0.1738 0.2878 -0.9418 -0.1738 0.2878 -0.4215 0.0000 0.9068 -0.4145 -0.0178 0.9099 -0.4246 -0.0360 0.9047 -0.4258 -0.0492 0.9035 -0.4259 -0.0492 0.9035 -0.4100 -0.0643 0.9098 -0.3869 -0.0474 0.9209 -0.3783 -0.0303 0.9252 -0.3680 -0.0140 0.9297 -0.3587 0.0000 0.9335 -0.3256 0.0000 0.9455 -0.3226 -0.0140 0.9464 -0.3167 -0.0002 0.9485 -0.3167 0.0000 0.9485 -0.7179 -0.0420 -0.6948 -0.7180 -0.0420 -0.6948 -0.8716 -0.0318 -0.4891 -0.8716 -0.0318 -0.4891 -0.9877 -0.1353 -0.0785 -0.9877 -0.1353 -0.0785 -0.9854 -0.1519 -0.0774 -0.9854 -0.1519 -0.0774 -0.9864 -0.1548 -0.0544 -0.9864 -0.1548 -0.0544 -0.9884 -0.1440 -0.0482 -0.9884 -0.1440 -0.0482 -0.9605 0.0000 -0.2782 -0.9604 0.0000 -0.2785 -0.9574 0.0000 -0.2888 -0.9565 0.0000 -0.2918 -0.5651 -0.7148 -0.4120 -0.5651 -0.7148 -0.4119 -0.5184 -0.7464 -0.4173 -0.5184 -0.7464 -0.4173 -0.9708 -0.0649 -0.2308 -0.9708 -0.0649 -0.2308 -0.9628 -0.1264 -0.2386 -0.9628 -0.1264 -0.2386 -0.9600 -0.1394 -0.2428 -0.9600 -0.1394 -0.2428 -0.9685 -0.0312 -0.2471 -0.9685 -0.0312 -0.2471 -0.9286 -0.0789 -0.3627 -0.9286 -0.0789 -0.3627 -0.9304 -0.1653 -0.3272 -0.9304 -0.1653 -0.3272 -0.9423 -0.0981 -0.3201 -0.9423 -0.0981 -0.3201 -0.8719 -0.3502 -0.3423 -0.8719 -0.3502 -0.3423 -0.8416 -0.4575 -0.2869 -0.8416 -0.4575 -0.2869 -0.8405 -0.4572 -0.2908 -0.8405 -0.4572 -0.2908 -0.7201 -0.5172 -0.4626 -0.7201 -0.5172 -0.4626 -0.7266 -0.6627 -0.1814 -0.7266 -0.6627 -0.1814 -0.7329 -0.6581 -0.1721 -0.7329 -0.6581 -0.1721 -0.7321 -0.6599 -0.1691 -0.7321 -0.6599 -0.1691 -0.7455 -0.6464 -0.1624 -0.7455 -0.6464 -0.1624 -0.7401 -0.6544 -0.1548 -0.7401 -0.6544 -0.1548 -0.7461 -0.6479 -0.1535 -0.7461 -0.6479 -0.1535 -0.7547 -0.6411 -0.1392 -0.7547 -0.6411 -0.1392 -0.9036 -0.4224 -0.0707 -0.9036 -0.4224 -0.0707 -0.9214 -0.3875 0.0300 -0.9214 -0.3875 0.0300 -0.9331 -0.3534 0.0662 -0.9331 -0.3534 0.0662 -0.6501 -0.6504 -0.3930 -0.6501 -0.6504 -0.3930 -0.7180 -0.5897 -0.3699 -0.7180 -0.5897 -0.3699 -0.7848 -0.5572 -0.2714 -0.7848 -0.5572 -0.2714 -0.7994 -0.5324 -0.2784 -0.7994 -0.5324 -0.2784 -0.8214 -0.4822 -0.3046 -0.8214 -0.4822 -0.3046 -0.8244 -0.4787 -0.3019 -0.8244 -0.4787 -0.3019 -0.8373 -0.4639 -0.2895 -0.8373 -0.4639 -0.2895 -0.8378 -0.4635 -0.2885 -0.8378 -0.4635 -0.2885 -0.8444 -0.4538 -0.2845 -0.8444 -0.4538 -0.2845 -0.8179 -0.5065 -0.2730 -0.8179 -0.5065 -0.2730 -0.8108 -0.4428 -0.3829 -0.8108 -0.4428 -0.3829 -0.7907 -0.4660 -0.3972 -0.7907 -0.4660 -0.3972 -0.7727 -0.4890 -0.4047 -0.7727 -0.4890 -0.4047 -0.6630 -0.6525 -0.3670 -0.6639 -0.6519 -0.3663 -0.6646 -0.6505 -0.3676 -0.6649 -0.6505 -0.3670 -0.6691 -0.6416 -0.3751 -0.6687 -0.6421 -0.3749 -0.6736 -0.6421 -0.3659 -0.6741 -0.6417 -0.3659 -0.6760 -0.6406 -0.3642 -0.6762 -0.6405 -0.3639 -0.6854 -0.6548 -0.3185 -0.6875 -0.6533 -0.3171 -0.6938 -0.6477 -0.3150 -0.6953 -0.6468 -0.3135 -0.7133 -0.6345 -0.2977 -0.7137 -0.6341 -0.2975 -0.7142 -0.6335 -0.2977 -0.7141 -0.6333 -0.2983 -0.7124 -0.6236 -0.3218 -0.7129 -0.6233 -0.3215 -0.7001 -0.6187 -0.3564 -0.7009 -0.6186 -0.3549 -0.6985 -0.6109 -0.3725 -0.6985 -0.6115 -0.3717 -0.6996 -0.6097 -0.3725 -0.6987 -0.6107 -0.3726 -0.7258 -0.6001 -0.3364 -0.7260 -0.6002 -0.3356 -0.7308 -0.5985 -0.3283 -0.7313 -0.5981 -0.3278 -0.7363 -0.5912 -0.3292 -0.7367 -0.5909 -0.3289 -0.7339 -0.6013 -0.3160 -0.7354 -0.6002 -0.3147 -0.7363 -0.6001 -0.3127 -0.7385 -0.5987 -0.3101 -0.7380 -0.6015 -0.3059 -0.7368 -0.6040 -0.3038 -0.7369 -0.6037 -0.3041 -0.7379 -0.6018 -0.3055 -0.7376 -0.6166 -0.2752 -0.7382 -0.6158 -0.2753 -0.7464 -0.6073 -0.2723 -0.7467 -0.6067 -0.2728 -0.7624 -0.5854 -0.2759 -0.7625 -0.5845 -0.2775 -0.7625 -0.5842 -0.2781 -0.7622 -0.5842 -0.2788 -0.7621 -0.5843 -0.2789 -0.7619 -0.5843 -0.2795 -0.7569 -0.5792 -0.3027 -0.7579 -0.5787 -0.3013 -0.7644 -0.5747 -0.2923 -0.7650 -0.5741 -0.2919 -0.7659 -0.5686 -0.3000 -0.7667 -0.5679 -0.2996 -0.7689 -0.5714 -0.2869 -0.7707 -0.5693 -0.2861 -0.7709 -0.5690 -0.2863 -0.7724 -0.5674 -0.2854 -0.7737 -0.5660 -0.2848 -0.7752 -0.5646 -0.2833 -0.7753 -0.5621 -0.2881 -0.7760 -0.5613 -0.2876 -0.7767 -0.5607 -0.2869 -0.7771 -0.5604 -0.2864 -0.7783 -0.5602 -0.2837 -0.7789 -0.5599 -0.2826 -0.7800 -0.5590 -0.2814 -0.7807 -0.5582 -0.2811 -0.7864 -0.5521 -0.2769 -0.7867 -0.5517 -0.2771 -0.7868 -0.5509 -0.2781 -0.7865 -0.5510 -0.2789 -0.7892 -0.5492 -0.2748 -0.7901 -0.5484 -0.2738 -0.7883 -0.5509 -0.2741 -0.7899 -0.5498 -0.2716 -0.7936 -0.5468 -0.2669 -0.7949 -0.5452 -0.2663 -0.7930 -0.5553 -0.2506 -0.7933 -0.5554 -0.2495 -0.7942 -0.5528 -0.2525 -0.7946 -0.5522 -0.2521 -0.7948 -0.5519 -0.2524 -0.7943 -0.5523 -0.2532 -0.8023 -0.5430 -0.2478 -0.8016 -0.5439 -0.2481 -0.8017 -0.5437 -0.2484 -0.8020 -0.5430 -0.2491 -0.8021 -0.5426 -0.2493 -0.8026 -0.5418 -0.2497 -0.8034 -0.5405 -0.2497 -0.8034 -0.5407 -0.2492 -0.8050 -0.5378 -0.2504 -0.8054 -0.5378 -0.2493 -0.8017 -0.5363 -0.2642 -0.8013 -0.5363 -0.2652 -0.8011 -0.5357 -0.2669 -0.8010 -0.5354 -0.2678 -0.7971 -0.5386 -0.2729 -0.7965 -0.5392 -0.2737 -0.7939 -0.5414 -0.2767 -0.7930 -0.5428 -0.2765 -0.7929 -0.5427 -0.2771 -0.7906 -0.5438 -0.2815 -0.7896 -0.5448 -0.2825 -0.7891 -0.5450 -0.2833 -0.7863 -0.5467 -0.2878 -0.7858 -0.5473 -0.2883 -0.7849 -0.5419 -0.3005 -0.7857 -0.5414 -0.2994 -0.7860 -0.5410 -0.2991 -0.7867 -0.5405 -0.2982 -0.7872 -0.5395 -0.2988 -0.7877 -0.5393 -0.2978 -0.7698 -0.5396 -0.3409 -0.7698 -0.5399 -0.3403 -0.8022 -0.5311 -0.2727 -0.8026 -0.5310 -0.2719 -0.8055 -0.5309 -0.2634 -0.8060 -0.5306 -0.2625 -0.8028 -0.5347 -0.2639 -0.8032 -0.5341 -0.2637 -0.8112 -0.5222 -0.2633 -0.8115 -0.5219 -0.2630 -0.8124 -0.5206 -0.2627 -0.8128 -0.5202 -0.2623 -0.8130 -0.5200 -0.2620 -0.8136 -0.5194 -0.2612 -0.8151 -0.5181 -0.2592 -0.8154 -0.5179 -0.2586 -0.8195 -0.5113 -0.2588 -0.8210 -0.5096 -0.2575 -0.8214 -0.5087 -0.2579 -0.8216 -0.5081 -0.2584 -0.8251 -0.5031 -0.2571 -0.8258 -0.5023 -0.2564 -0.8214 -0.5079 -0.2595 -0.8211 -0.5081 -0.2600 -0.8445 -0.4543 -0.2837 -0.8451 -0.4535 -0.2830 -0.8486 -0.4468 -0.2832 -0.8490 -0.4464 -0.2827 -0.8491 -0.4462 -0.2827 -0.8490 -0.4459 -0.2834 -0.8597 -0.4208 -0.2895 -0.8601 -0.4206 -0.2886 -0.8687 -0.4138 -0.2722 -0.8689 -0.4139 -0.2717 -0.7976 -0.5381 -0.2725 -0.7981 -0.5376 -0.2721 0.7667 0.0000 0.6421 0.7786 0.0000 0.6275 0.7813 0.0000 0.6242 0.7922 -0.0100 0.6102 0.7922 -0.0100 0.6102 0.8000 -0.0429 0.5984 0.7997 -0.0623 0.5972 0.7997 -0.0623 0.5972 0.7910 -0.0958 0.6042 0.7900 -0.1028 0.6045 0.7900 -0.1028 0.6045 0.7699 -0.1275 0.6253 0.7695 -0.1287 0.6255 0.7695 -0.1287 0.6255 0.7452 -0.1135 0.6571 0.7349 -0.1131 0.6687 0.7349 -0.1131 0.6687 0.7152 -0.0993 0.6918 0.7152 -0.0993 0.6918 0.7212 -0.0684 0.6893 0.7243 -0.0568 0.6871 0.7243 -0.0568 0.6871 0.7268 -0.0252 0.6864 0.7263 -0.0224 0.6870 0.7263 -0.0224 0.6870 0.6982 -0.0152 0.7158 0.6982 -0.0152 0.7158 0.6813 -0.0239 0.7316 0.6813 -0.0239 0.7316 0.6687 -0.0509 0.7418 0.6663 -0.0551 0.7436 0.6663 -0.0551 0.7436 0.6596 -0.0267 0.7512 0.6596 -0.0267 0.7512 0.6524 -0.0025 0.7578 0.6524 -0.0025 0.7578 0.6517 0.0000 0.7585 0.7102 -0.3439 0.6143 0.7102 -0.3439 0.6143 0.7905 -0.0103 0.6124 0.7905 -0.0103 0.6124 0.7911 -0.1094 0.6018 0.7911 -0.1094 0.6018 0.6968 -0.0149 0.7171 0.6968 -0.0149 0.7171 0.6925 -0.0157 0.7212 0.6925 -0.0157 0.7212 0.6826 -0.0257 0.7303 0.6826 -0.0257 0.7303 0.6523 -0.0237 0.7576 0.6523 -0.0237 0.7576 0.6488 -0.0283 0.7604 0.6488 -0.0283 0.7604 0.5635 -0.0730 0.8229 0.5932 -0.0629 0.8026 0.6086 -0.1110 0.7857 0.5751 -0.1023 0.8117 0.5751 -0.1023 0.8117 0.5659 -0.0771 0.8209 0.5635 -0.0730 0.8229 0.5788 -0.1016 0.8091 0.5788 -0.1016 0.8091 0.6113 -0.0879 0.7865 0.6113 -0.0894 0.7863 0.6113 -0.0894 0.7863 0.6086 -0.1110 0.7857 0.6081 -0.0680 0.7909 0.6113 -0.0879 0.7865 0.5932 -0.0629 0.8026 0.6081 -0.0680 0.7909 0.5186 -0.0454 0.8538 0.5341 -0.0252 0.8450 0.5371 -0.0165 0.8433 0.5371 -0.0165 0.8433 0.5731 -0.0143 0.8193 0.5862 -0.0008 0.8102 0.5862 -0.0008 0.8102 0.5912 0.0000 0.8066 0.5929 0.0000 0.8053 0.5944 0.0000 0.8042 0.6035 0.0000 0.7974 0.6035 0.0000 0.7974 0.6322 0.0000 0.7748 0.6355 -0.0273 0.7717 0.6355 -0.0272 0.7717 0.6377 -0.0550 0.7683 0.6272 -0.0496 0.7773 0.6272 -0.0496 0.7773 0.6027 -0.0502 0.7964 0.6027 -0.0502 0.7964 0.5744 -0.0339 0.8178 0.5765 -0.0441 0.8159 0.5765 -0.0441 0.8159 0.5476 -0.0574 0.8348 0.5454 -0.0596 0.8361 0.5454 -0.0596 0.8361 0.5186 -0.0454 0.8538 0.5151 -0.0242 0.8568 0.5151 -0.0242 0.8568 0.5165 -0.0288 0.8558 0.5165 -0.0288 0.8558 0.6336 -0.0119 0.7736 0.6336 -0.0119 0.7736 0.6398 -0.0706 0.7653 0.6398 -0.0706 0.7653 0.5941 -0.0458 0.8031 0.5941 -0.0458 0.8031 0.5803 -0.0442 0.8132 0.5803 -0.0442 0.8132 0.5609 -0.0517 0.8263 0.5609 -0.0517 0.8263 0.5572 -0.0599 0.8282 0.5572 -0.0599 0.8282 0.5569 -0.0571 0.8286 0.5569 -0.0571 0.8286 0.5544 -0.0554 0.8304 0.5544 -0.0554 0.8304 0.5501 -0.0545 0.8333 0.5501 -0.0545 0.8333 0.5332 -0.0574 0.8440 0.5332 -0.0574 0.8440 0.5209 -0.0562 0.8518 0.5209 -0.0562 0.8518 0.5314 -0.0660 0.8446 0.5314 -0.0660 0.8446 0.5361 -0.0679 0.8414 0.5361 -0.0679 0.8414 0.4928 -0.0102 0.8701 0.4928 -0.0102 0.8701 0.4889 -0.0085 0.8723 0.4889 -0.0085 0.8723 0.3878 -0.1007 0.9162 0.4181 -0.1100 0.9017 0.4181 -0.1100 0.9017 0.4218 -0.1303 0.8973 0.4200 -0.1500 0.8950 0.4104 -0.1606 0.8976 0.4104 -0.1606 0.8976 0.3908 -0.1715 0.9044 0.3875 -0.1730 0.9055 0.3875 -0.1730 0.9055 0.3731 -0.1506 0.9155 0.3794 -0.1485 0.9132 0.3794 -0.1485 0.9132 0.3825 -0.1309 0.9147 0.3828 -0.1128 0.9169 0.3877 -0.1007 0.9162 0.4729 -0.0557 0.8794 0.4729 -0.0557 0.8794 0.4682 -0.0554 0.8819 0.4682 -0.0554 0.8819 0.4612 -0.0557 0.8855 0.4612 -0.0557 0.8855 0.4612 -0.0580 0.8854 0.4612 -0.0580 0.8854 0.4633 -0.0602 0.8841 0.4633 -0.0602 0.8841 0.5427 -0.0460 0.8387 0.5427 -0.0460 0.8387 0.5376 -0.0408 0.8422 0.5376 -0.0408 0.8422 -0.3730 -0.4751 0.7969 -0.3778 -0.4466 0.8111 -0.3602 -0.4292 0.8283 -0.2703 -0.2188 0.9376 -0.2655 -0.2345 0.9351 -0.2596 -0.2500 0.9328 -0.2429 -0.2548 0.9360 -0.2366 -0.2547 0.9376 -0.2366 -0.2547 0.9376 -0.2205 -0.2587 0.9405 -0.2408 -0.2603 0.9350 -0.2245 -0.2645 0.9379 -0.2150 -0.2669 0.9394 -0.2150 -0.2669 0.9394 -0.2068 -0.2806 0.9373 -0.1965 -0.2924 0.9359 -0.1866 -0.2901 0.9386 -0.3563 -0.5662 0.7433 -0.3626 -0.5363 0.7622 -0.3573 -0.5391 0.7627 -0.3573 -0.5391 0.7627 -0.3732 -0.5154 0.7714 -0.3719 -0.5085 0.7766 -0.3719 -0.5085 0.7766 -0.3792 -0.4803 0.7909 -0.3731 -0.4751 0.7969 -0.3602 -0.4292 0.8283 -0.3711 -0.4064 0.8349 -0.3613 -0.3771 0.8528 -0.3613 -0.3771 0.8528 -0.3747 -0.3587 0.8550 -0.3850 -0.3381 0.8588 -0.3875 -0.3268 0.8620 -0.3875 -0.3268 0.8620 -0.3948 -0.3053 0.8666 -0.4047 -0.2857 0.8686 -0.4081 -0.2631 0.8742 -0.4063 -0.2566 0.8770 -0.4063 -0.2566 0.8770 -0.4341 -0.2531 0.8646 -0.4282 -0.2301 0.8739 -0.4282 -0.2301 0.8739 -0.4548 -0.2234 0.8621 -0.4854 -0.2202 0.8461 -0.4891 -0.2205 0.8439 -0.4892 -0.2205 0.8439 -0.5107 -0.2059 0.8347 -0.5315 -0.1897 0.8256 -0.5486 -0.1703 0.8186 -0.5479 -0.1641 0.8203 -0.5479 -0.1641 0.8203 -0.5292 -0.1824 0.8287 -0.5082 -0.1983 0.8381 -0.4776 -0.2032 0.8548 -0.4712 -0.2022 0.8585 -0.4712 -0.2022 0.8585 -0.4873 -0.1850 0.8534 -0.4952 -0.1637 0.8532 -0.4832 -0.1397 0.8643 -0.4774 -0.1311 0.8689 -0.4774 -0.1311 0.8689 -0.4410 -0.1193 0.8895 -0.4305 -0.1333 0.8927 -0.4305 -0.1332 0.8927 -0.4037 -0.1407 0.9040 -0.4104 -0.1233 0.9035 -0.4167 -0.1057 0.9029 -0.4045 -0.0857 0.9105 -0.4013 -0.0864 0.9118 -0.4013 -0.0864 0.9118 -0.3873 -0.1006 0.9164 -0.3874 -0.1188 0.9142 -0.3775 -0.1339 0.9163 -0.3729 -0.1148 0.9208 -0.3640 -0.0991 0.9261 -0.3640 -0.0992 0.9261 -0.3326 -0.1014 0.9376 -0.3163 -0.1110 0.9422 -0.3180 -0.1172 0.9408 -0.3180 -0.1172 0.9408 -0.3005 -0.1250 0.9455 -0.2932 -0.1372 0.9461 -0.2905 -0.1517 0.9448 -0.2908 -0.1532 0.9444 -0.2908 -0.1532 0.9444 -0.2882 -0.1682 0.9427 -0.2851 -0.1833 0.9408 -0.2797 -0.1975 0.9396 -0.2724 -0.2106 0.9389 -0.2703 -0.2188 0.9376 0.1432 -0.3412 0.9290 0.1598 -0.3389 0.9272 0.1737 -0.3533 0.9192 0.1737 -0.3533 0.9192 0.1899 -0.3472 0.9184 0.1819 -0.3649 0.9131 0.1820 -0.3649 0.9131 0.1662 -0.3644 0.9163 0.1662 -0.3644 0.9163 0.1495 -0.3695 0.9171 0.1687 -0.3916 0.9046 0.1687 -0.3916 0.9045 0.1917 -0.4025 0.8951 0.1899 -0.4123 0.8910 0.1899 -0.4123 0.8910 0.1686 -0.4109 0.8959 0.1585 -0.4128 0.8969 0.1585 -0.4128 0.8969 0.1813 -0.4217 0.8884 0.1640 -0.4324 0.8866 0.1484 -0.4268 0.8921 0.1484 -0.4268 0.8921 0.1265 -0.4157 0.9006 0.1123 -0.4090 0.9056 0.1123 -0.4090 0.9056 0.0972 -0.4231 0.9008 0.1091 -0.4021 0.9091 0.1096 -0.4011 0.9095 0.1096 -0.4011 0.9095 0.1187 -0.3777 0.9183 0.1371 -0.3785 0.9154 0.1411 -0.3719 0.9175 0.1411 -0.3719 0.9175 0.1243 -0.3764 0.9181 0.1102 -0.3590 0.9268 0.1143 -0.5620 0.8192 0.1285 -0.5363 0.8342 0.1081 -0.5119 0.8522 0.1081 -0.5119 0.8522 0.1023 -0.4766 0.8731 0.1023 -0.4767 0.8731 0.1132 -0.4504 0.8856 0.1325 -0.4444 0.8860 0.1396 -0.4509 0.8816 0.1396 -0.4509 0.8816 0.1622 -0.4565 0.8748 0.1622 -0.4720 0.8666 0.1622 -0.4720 0.8666 0.1866 -0.4816 0.8563 0.1879 -0.4992 0.8459 0.1879 -0.4992 0.8459 0.2045 -0.4812 0.8524 0.2087 -0.4578 0.8642 0.2087 -0.4578 0.8642 0.2334 -0.4612 0.8560 0.2347 -0.4605 0.8561 0.2347 -0.4605 0.8561 0.2611 -0.4781 0.8386 0.2615 -0.4786 0.8382 0.2615 -0.4786 0.8382 0.2863 -0.4915 0.8224 0.2864 -0.4915 0.8224 0.3123 -0.4881 0.8150 0.2971 -0.5098 0.8073 0.3046 -0.5074 0.8061 0.3046 -0.5074 0.8061 0.3260 -0.4930 0.8067 0.3408 -0.5201 0.7831 -0.1866 -0.2901 0.9386 -0.1774 -0.3037 0.9361 -0.1674 -0.3172 0.9335 -0.1540 -0.3253 0.9330 -0.1604 -0.3421 0.9259 -0.1604 -0.3421 0.9259 -0.1462 -0.3507 0.9250 -0.1294 -0.3530 0.9266 -0.1218 -0.3760 0.9186 -0.1075 -0.3571 0.9279 -0.1075 -0.3571 0.9279 -0.0922 -0.3625 0.9274 -0.0775 -0.3713 0.9253 -0.0694 -0.3715 0.9258 -0.0694 -0.3715 0.9258 -0.0533 -0.3748 0.9256 -0.0377 -0.3829 0.9230 -0.0355 -0.3728 0.9272 0.0107 -0.3744 0.9272 0.0268 -0.3717 0.9280 0.0266 -0.3438 0.9387 0.0265 -0.3438 0.9387 0.0417 -0.3446 0.9378 0.0554 -0.3759 0.9250 0.0540 -0.3916 0.9185 0.0539 -0.3917 0.9185 0.0365 -0.3888 0.9206 0.0236 -0.4121 0.9108 0.0114 -0.4125 0.9109 0.0114 -0.4125 0.9109 -0.0063 -0.4080 0.9130 0.0111 -0.4179 0.9084 -0.0009 -0.4364 0.8998 -0.0009 -0.4364 0.8998 -0.0200 -0.4406 0.8975 -0.0202 -0.4667 0.8842 0.2431 -0.6073 0.7563 0.2210 -0.6262 0.7476 0.2197 -0.6491 0.7283 0.2197 -0.6491 0.7283 0.2370 -0.6242 0.7445 0.2499 -0.6095 0.7523 0.0586 -0.5667 0.8219 0.0804 -0.5874 0.8053 0.0844 -0.5992 0.7962 0.0843 -0.5992 0.7961 0.1087 -0.6163 0.7799 0.1172 -0.6221 0.7741 0.1172 -0.6221 0.7741 0.1150 -0.5880 0.8006 0.1150 -0.5872 0.8012 0.1150 -0.5872 0.8012 0.1143 -0.5620 0.8192 0.3408 -0.5201 0.7831 0.3243 -0.5427 0.7748 0.3053 -0.5635 0.7676 0.3046 -0.5632 0.7682 0.3046 -0.5631 0.7682 0.2792 -0.5746 0.7693 0.2547 -0.5879 0.7678 0.2431 -0.6073 0.7564 0.2499 -0.6095 0.7523 0.2734 -0.5930 0.7574 0.2631 -0.6153 0.7431 0.2631 -0.6153 0.7431 0.2929 -0.6202 0.7277 0.3064 -0.6219 0.7206 0.3064 -0.6219 0.7206 0.3359 -0.6145 0.7139 0.3330 -0.6231 0.7077 0.3330 -0.6232 0.7077 0.3092 -0.6430 0.7007 0.2976 -0.6609 0.6890 0.2976 -0.6609 0.6890 0.3093 -0.6323 0.7103 0.2990 -0.6290 0.7176 -0.0201 -0.4668 0.8841 -0.0382 -0.4885 0.8717 -0.0287 -0.5181 0.8549 -0.0286 -0.5181 0.8548 -0.0110 -0.5410 0.8409 0.0123 -0.5481 0.8363 0.0351 -0.5611 0.8270 0.0586 -0.5667 0.8219 0.2990 -0.6290 0.7176 0.2758 -0.6488 0.7092 0.2673 -0.6633 0.6990 0.2673 -0.6633 0.6990 0.2440 -0.6842 0.6873 0.2556 -0.6999 0.6669 0.2556 -0.7000 0.6669 0.2276 -0.7163 0.6597 0.2063 -0.7318 0.6496 0.2064 -0.7318 0.6496 0.2021 -0.7566 0.6219 0.2021 -0.7566 0.6219 0.1731 -0.7651 0.6202 0.1732 -0.7651 0.6202 0.1964 -0.7790 0.5955 0.1964 -0.7790 0.5955 0.1946 -0.7885 0.5835 0.1946 -0.7885 0.5835 0.1787 -0.8019 0.5700 0.1788 -0.8019 0.5700 0.1549 -0.8228 0.5468 0.1549 -0.8228 0.5468 0.1294 -0.8422 0.5234 0.1264 -0.8445 0.5205 0.1264 -0.8445 0.5204 0.1393 -0.8639 0.4841 0.1467 -0.8718 0.4674 0.1467 -0.8718 0.4674 0.1520 -0.8907 0.4285 0.1509 -0.8923 0.4255 0.1509 -0.8923 0.4256 0.1278 -0.8841 0.4495 0.1278 -0.8841 0.4495 0.1104 -0.8675 0.4850 0.1040 -0.8658 0.4894 0.1040 -0.8658 0.4894 0.0672 -0.8634 0.5001 0.0533 -0.8599 0.5077 0.0533 -0.8599 0.5077 0.0158 -0.8621 0.5065 -0.0046 -0.8634 0.5046 -0.0046 -0.8634 0.5046 0.0090 -0.8752 0.4837 0.0090 -0.8752 0.4837 -0.0203 -0.8715 0.4899 -0.0203 -0.8715 0.4899 -0.0576 -0.8666 0.4957 -0.0588 -0.8662 0.4962 -0.0588 -0.8662 0.4961 -0.0930 -0.8735 0.4779 -0.1041 -0.8728 0.4768 -0.1041 -0.8728 0.4768 -0.1136 -0.8914 0.4387 -0.1120 -0.8912 0.4395 -0.1120 -0.8912 0.4395 -0.1117 -0.8921 0.4379 -0.3844 -0.7454 0.5447 -0.4053 -0.7195 0.5640 -0.4178 -0.7109 0.5657 -0.4178 -0.7109 0.5657 -0.4250 -0.6826 0.5945 -0.4217 -0.6816 0.5981 -0.4217 -0.6816 0.5981 -0.4278 -0.6578 0.6199 -0.4278 -0.6578 0.6199 -0.4297 -0.6284 0.6484 -0.4195 -0.6164 0.6664 -0.4195 -0.6163 0.6664 -0.4013 -0.5928 0.6982 -0.3959 -0.5871 0.7061 -0.3959 -0.5871 0.7061 -0.3811 -0.5703 0.7277 -0.3811 -0.5703 0.7277 -0.3781 -0.5458 0.7478 -0.3781 -0.5458 0.7478 -0.3640 -0.5721 0.7350 -0.3564 -0.5662 0.7433 -0.3780 -0.4746 0.7949 -0.3780 -0.4746 0.7949 -0.3753 -0.4654 0.8016 -0.3753 -0.4654 0.8016 -0.3711 -0.4612 0.8059 -0.3711 -0.4612 0.8059 -0.3822 -0.4682 0.7967 -0.3822 -0.4682 0.7967 -0.3800 -0.4501 0.8081 -0.3800 -0.4501 0.8081 -0.3844 -0.4518 0.8051 -0.3844 -0.4518 0.8051 -0.3818 -0.4506 0.8069 -0.3818 -0.4506 0.8069 -0.3798 -0.4473 0.8097 -0.3798 -0.4473 0.8097 -0.3698 -0.4382 0.8193 -0.3698 -0.4382 0.8193 -0.3989 -0.4464 0.8010 -0.3989 -0.4464 0.8010 -0.3896 -0.4378 0.8103 -0.3896 -0.4378 0.8103 -0.2646 -0.2275 0.9372 -0.2646 -0.2275 0.9372 -0.2563 -0.2481 0.9342 -0.2563 -0.2481 0.9342 -0.3853 -0.5027 0.7738 -0.3823 -0.5332 0.7547 -0.3727 -0.5361 0.7575 -0.3727 -0.5361 0.7575 -0.3816 -0.5079 0.7723 -0.3854 -0.5027 0.7738 -0.3611 -0.5540 0.7502 -0.3611 -0.5540 0.7502 -0.3584 -0.5541 0.7514 -0.3584 -0.5541 0.7514 -0.3634 -0.5474 0.7539 -0.3634 -0.5474 0.7539 -0.3631 -0.5450 0.7558 -0.3631 -0.5450 0.7558 -0.3667 -0.5313 0.7637 -0.3667 -0.5313 0.7637 -0.3668 -0.5242 0.7686 -0.3668 -0.5242 0.7686 -0.3687 -0.5218 0.7693 -0.3687 -0.5218 0.7693 -0.3679 -0.5201 0.7709 -0.3679 -0.5201 0.7709 -0.3736 -0.5095 0.7752 -0.3736 -0.5095 0.7752 -0.3838 -0.5257 0.7592 -0.3838 -0.5257 0.7592 -0.3815 -0.4883 0.7849 -0.3815 -0.4883 0.7849 -0.3782 -0.4849 0.7885 -0.3782 -0.4849 0.7885 -0.3691 -0.4855 0.7925 -0.3691 -0.4855 0.7925 -0.3763 -0.4823 0.7911 -0.3763 -0.4823 0.7911 -0.3787 -0.4822 0.7900 -0.3787 -0.4822 0.7900 -0.3754 -0.4741 0.7964 -0.3754 -0.4741 0.7964 -0.3857 -0.5162 0.7647 -0.3857 -0.5162 0.7647 0.1995 -0.4160 0.8872 0.1995 -0.4160 0.8872 0.1984 -0.4268 0.8823 0.1984 -0.4268 0.8823 0.2036 -0.4300 0.8795 0.2036 -0.4300 0.8795 0.1521 -0.4315 0.8892 0.1521 -0.4315 0.8892 0.1071 -0.3596 0.9269 0.1071 -0.3596 0.9269 0.0963 -0.3596 0.9281 0.0963 -0.3596 0.9281 0.0940 -0.4282 0.8988 0.0940 -0.4282 0.8988 0.1038 -0.4347 0.8946 0.1038 -0.4347 0.8946 0.0974 -0.4393 0.8930 0.0974 -0.4393 0.8930 0.0618 -0.4501 0.8908 0.0618 -0.4501 0.8908 0.0841 -0.4554 0.8863 0.0841 -0.4554 0.8863 0.1088 -0.5424 0.8331 0.1088 -0.5424 0.8331 0.1041 -0.5417 0.8341 0.1041 -0.5417 0.8341 0.1001 -0.5428 0.8339 0.1001 -0.5428 0.8339 0.0995 -0.4775 0.8730 0.0995 -0.4775 0.8730 0.1226 -0.4413 0.8889 0.1226 -0.4413 0.8889 0.1845 -0.4555 0.8709 0.1845 -0.4555 0.8709 0.2110 -0.4452 0.8702 0.2110 -0.4452 0.8702 0.2617 -0.4791 0.8378 0.2617 -0.4791 0.8378 0.3051 -0.4872 0.8183 0.3051 -0.4872 0.8183 -0.1365 -0.2390 0.9614 -0.1247 -0.2422 0.9622 -0.1458 -0.2611 0.9542 -0.1661 -0.2726 0.9477 -0.1760 -0.2625 0.9488 -0.1735 -0.2456 0.9537 -0.1737 -0.2456 0.9537 -0.1489 -0.2235 0.9632 -0.1383 -0.2285 0.9637 -0.1365 -0.2389 0.9614 -0.1245 -0.2719 0.9543 -0.1108 -0.2725 0.9558 -0.0987 -0.2767 0.9559 -0.0965 -0.3004 0.9489 -0.0965 -0.3003 0.9489 -0.0793 -0.2821 0.9561 -0.0810 -0.3153 0.9455 -0.0810 -0.3153 0.9455 -0.0702 -0.3297 0.9415 -0.0876 -0.3499 0.9327 -0.0885 -0.3482 0.9332 -0.0885 -0.3482 0.9332 -0.1009 -0.3362 0.9364 -0.1188 -0.3431 0.9318 -0.1247 -0.3425 0.9312 -0.1248 -0.3425 0.9312 -0.1403 -0.3386 0.9304 -0.1490 -0.3213 0.9352 -0.1581 -0.3061 0.9388 -0.1576 -0.3036 0.9397 -0.1576 -0.3036 0.9397 -0.1423 -0.3059 0.9414 -0.1292 -0.3125 0.9411 -0.1399 -0.3011 0.9433 -0.1527 -0.2945 0.9434 -0.1449 -0.2867 0.9470 -0.1449 -0.2867 0.9470 -0.1232 -0.2603 0.9576 -0.1245 -0.2719 0.9542 0.0516 -0.4208 0.9057 0.0709 -0.4325 0.8989 0.0518 -0.4334 0.8997 0.0357 -0.4507 0.8919 0.0331 -0.4408 0.8970 0.0331 -0.4408 0.8970 0.0465 -0.4175 0.9075 0.0515 -0.4208 0.9057 -0.1533 -0.3441 0.9263 -0.1533 -0.3441 0.9263 -0.1488 -0.3455 0.9266 -0.1488 -0.3455 0.9266 -0.1357 -0.3441 0.9291 -0.1357 -0.3441 0.9291 -0.1298 -0.3430 0.9303 -0.1298 -0.3430 0.9303 -0.1335 -0.3511 0.9268 -0.1335 -0.3511 0.9268 -0.1268 -0.3505 0.9279 -0.1268 -0.3505 0.9279 -0.1243 -0.3494 0.9287 -0.1243 -0.3494 0.9287 -0.1242 -0.3518 0.9278 -0.1242 -0.3518 0.9278 -0.1218 -0.3547 0.9270 -0.1218 -0.3547 0.9270 -0.1174 -0.3618 0.9248 -0.1174 -0.3618 0.9248 -0.1177 -0.3648 0.9236 -0.1177 -0.3648 0.9236 -0.1171 -0.3695 0.9218 -0.1171 -0.3695 0.9218 -0.0926 -0.3534 0.9309 -0.0926 -0.3534 0.9309 -0.0734 -0.3546 0.9321 -0.0734 -0.3546 0.9321 -0.0646 -0.3629 0.9296 -0.0646 -0.3629 0.9296 -0.0642 -0.3526 0.9336 -0.0642 -0.3526 0.9336 -0.0625 -0.3509 0.9343 -0.0625 -0.3509 0.9343 -0.0709 -0.3480 0.9348 -0.0709 -0.3480 0.9348 -0.0671 -0.3436 0.9367 -0.0671 -0.3436 0.9367 -0.0601 -0.3257 0.9436 -0.0601 -0.3257 0.9436 -0.0709 -0.2745 0.9590 -0.0831 -0.2722 0.9587 -0.0709 -0.2745 0.9590 -0.0857 -0.2695 0.9592 -0.0857 -0.2695 0.9592 -0.0471 -0.3407 0.9390 -0.0353 -0.3594 0.9325 -0.0513 -0.3601 0.9315 -0.0471 -0.3407 0.9390 -0.0374 -0.3475 0.9370 -0.0374 -0.3475 0.9370 -0.0334 -0.3475 0.9371 -0.0334 -0.3475 0.9371 0.0231 -0.3713 0.9282 0.0231 -0.3713 0.9282 0.0387 -0.3434 0.9384 0.0387 -0.3434 0.9384 0.0495 -0.3997 0.9153 0.0495 -0.3997 0.9153 0.0474 -0.4066 0.9124 0.0474 -0.4066 0.9124 0.0431 -0.4043 0.9136 0.0431 -0.4043 0.9136 0.0361 -0.4051 0.9135 0.0361 -0.4051 0.9135 0.3507 -0.5125 0.7838 0.3641 -0.5296 0.7661 0.3641 -0.5296 0.7661 0.3886 -0.5244 0.7576 0.3887 -0.5244 0.7576 0.4021 -0.5320 0.7451 0.4021 -0.5321 0.7451 0.3895 -0.5593 0.7318 0.3884 -0.5627 0.7298 0.3884 -0.5627 0.7298 0.3596 -0.5702 0.7386 0.3528 -0.5741 0.7389 0.3528 -0.5741 0.7388 0.3438 -0.5501 0.7611 0.3438 -0.5501 0.7610 0.3453 -0.5189 0.7820 0.3508 -0.5126 0.7838 0.0928 -0.5921 0.8005 0.0928 -0.5921 0.8005 0.1141 -0.6037 0.7890 0.1141 -0.6037 0.7890 0.2267 -0.5778 0.7840 0.2267 -0.5778 0.7840 0.2878 -0.5771 0.7643 0.2878 -0.5771 0.7643 0.3584 -0.5208 0.7748 0.3584 -0.5208 0.7748 0.3758 -0.5275 0.7619 0.3758 -0.5275 0.7619 0.3792 -0.5234 0.7631 0.3792 -0.5234 0.7631 0.3959 -0.5363 0.7454 0.3959 -0.5363 0.7454 0.3948 -0.5460 0.7389 0.3948 -0.5460 0.7389 0.3780 -0.5666 0.7322 0.3780 -0.5666 0.7322 0.3387 -0.5941 0.7296 0.3387 -0.5941 0.7296 0.3225 -0.5916 0.7389 0.3225 -0.5916 0.7389 0.2989 -0.6125 0.7318 0.2989 -0.6125 0.7318 0.2887 -0.6048 0.7422 0.2887 -0.6048 0.7422 -0.3895 -0.4162 0.8216 -0.3895 -0.4162 0.8216 -0.3820 -0.4014 0.8324 -0.3820 -0.4014 0.8324 -0.3901 -0.4140 0.8224 -0.3901 -0.4140 0.8224 -0.3821 -0.4057 0.8303 -0.3821 -0.4057 0.8303 -0.3782 -0.4315 0.8190 -0.3782 -0.4315 0.8190 -0.3776 -0.4273 0.8215 -0.3776 -0.4273 0.8215 -0.3785 -0.4231 0.8233 -0.3785 -0.4231 0.8233 -0.3690 -0.4210 0.8286 -0.3690 -0.4210 0.8286 -0.3737 -0.4094 0.8323 -0.3737 -0.4094 0.8323 -0.3719 -0.4082 0.8337 -0.3719 -0.4082 0.8337 -0.3748 -0.4061 0.8335 -0.3748 -0.4061 0.8335 -0.3722 -0.4019 0.8366 -0.3722 -0.4019 0.8366 -0.3720 -0.3982 0.8385 -0.3720 -0.3982 0.8385 -0.3800 -0.3923 0.8377 -0.3800 -0.3923 0.8377 -0.3813 -0.3799 0.8427 -0.3813 -0.3799 0.8427 -0.3865 -0.3771 0.8417 -0.3865 -0.3771 0.8417 -0.3769 -0.3673 0.8503 -0.3769 -0.3673 0.8503 -0.3831 -0.3642 0.8489 -0.3831 -0.3642 0.8489 -0.3701 -0.3717 0.8514 -0.3701 -0.3717 0.8514 -0.4063 -0.2763 0.8710 -0.4063 -0.2763 0.8710 -0.4101 -0.2756 0.8694 -0.4101 -0.2756 0.8694 -0.4154 -0.2704 0.8685 -0.4154 -0.2704 0.8685 -0.4616 -0.2419 0.8535 -0.4616 -0.2419 0.8535 -0.4636 -0.2455 0.8514 -0.4636 -0.2455 0.8514 -0.4732 -0.2384 0.8481 -0.4732 -0.2384 0.8481 -0.4830 -0.2472 0.8400 -0.4830 -0.2472 0.8400 -0.4949 -0.2427 0.8344 -0.4949 -0.2427 0.8344 -0.4745 -0.2370 0.8478 -0.4745 -0.2370 0.8478 -0.4951 -0.2406 0.8349 -0.4951 -0.2406 0.8349 -0.4967 -0.2377 0.8347 -0.4967 -0.2377 0.8347 -0.5102 -0.2319 0.8282 -0.5102 -0.2319 0.8282 -0.5348 -0.1960 0.8219 -0.5348 -0.1960 0.8219 -0.5341 -0.1995 0.8215 -0.5341 -0.1995 0.8215 -0.5359 -0.1877 0.8231 -0.5359 -0.1877 0.8231 -0.5467 -0.1752 0.8188 -0.5467 -0.1752 0.8188 -0.5548 -0.1722 0.8140 -0.5548 -0.1722 0.8140 -0.5500 -0.1630 0.8191 -0.5500 -0.1630 0.8191 -0.4891 -0.1712 0.8553 -0.4891 -0.1712 0.8553 0.2093 -0.7422 0.6366 0.2093 -0.7422 0.6366 0.1999 -0.7630 0.6147 0.1999 -0.7630 0.6147 0.2016 -0.7919 0.5764 0.2016 -0.7919 0.5764 0.2006 -0.7924 0.5760 0.2006 -0.7924 0.5760 0.1973 -0.7945 0.5743 0.1973 -0.7945 0.5743 0.1953 -0.7964 0.5724 0.1953 -0.7964 0.5724 0.1891 -0.8002 0.5692 0.1891 -0.8002 0.5692 0.1803 -0.8040 0.5666 0.1803 -0.8040 0.5666 0.1733 -0.8118 0.5576 0.1733 -0.8118 0.5576 0.1470 -0.8719 0.4671 0.1470 -0.8719 0.4671 0.1539 -0.8895 0.4302 0.1539 -0.8895 0.4302 0.1528 -0.8909 0.4278 0.1528 -0.8909 0.4278 0.1466 -0.8954 0.4205 0.1466 -0.8954 0.4205 0.1453 -0.8960 0.4197 0.1453 -0.8960 0.4197 0.1430 -0.8968 0.4188 0.1430 -0.8968 0.4188 0.1413 -0.8973 0.4181 0.1413 -0.8973 0.4181 0.1356 -0.8980 0.4186 0.1356 -0.8980 0.4186 0.1344 -0.8986 0.4177 0.1344 -0.8986 0.4177 0.1336 -0.8988 0.4176 0.1336 -0.8988 0.4176 0.1320 -0.8997 0.4161 0.1320 -0.8997 0.4161 0.1304 -0.9002 0.4155 0.1304 -0.9002 0.4155 0.1217 -0.8865 0.4464 0.1217 -0.8865 0.4464 0.0801 -0.8646 0.4961 0.0801 -0.8646 0.4961 0.0518 -0.8610 0.5060 0.0518 -0.8610 0.5060 0.0287 -0.8634 0.5036 0.0287 -0.8634 0.5036 0.0218 -0.8639 0.5033 0.0218 -0.8639 0.5033 0.0178 -0.8660 0.4997 0.0178 -0.8660 0.4997 0.0115 -0.8649 0.5018 0.0115 -0.8649 0.5018 -0.0262 -0.8695 0.4933 -0.0262 -0.8695 0.4933 -0.0731 -0.8686 0.4902 -0.0731 -0.8686 0.4902 -0.0956 -0.8738 0.4768 -0.0956 -0.8738 0.4768 -0.0981 -0.8743 0.4753 -0.0981 -0.8743 0.4753 -0.1050 -0.8758 0.4711 -0.1050 -0.8758 0.4711 -0.1086 -0.8777 0.4667 -0.1086 -0.8777 0.4667 -0.1143 -0.8822 0.4568 -0.1143 -0.8822 0.4568 0.2799 -0.6520 0.7046 0.2799 -0.6520 0.7046 0.2647 -0.6631 0.7001 0.2647 -0.6631 0.7001 0.2564 -0.7051 0.6611 0.2564 -0.7051 0.6611 0.2494 -0.7066 0.6622 0.2494 -0.7066 0.6622 0.2341 -0.7169 0.6567 0.2341 -0.7169 0.6567 0.1010 -0.6887 0.7179 0.1010 -0.6887 0.7179 0.0806 -0.6901 0.7192 0.0806 -0.6901 0.7192 0.0770 -0.6891 0.7206 0.0770 -0.6891 0.7206 0.0732 -0.6871 0.7229 0.0732 -0.6871 0.7229 0.0547 -0.6958 0.7161 0.0547 -0.6958 0.7161 0.0370 -0.7027 0.7105 0.0370 -0.7027 0.7105 0.0502 -0.6699 0.7408 0.0502 -0.6699 0.7408 0.0240 -0.6773 0.7353 0.0240 -0.6773 0.7353 0.0178 -0.6668 0.7450 0.0178 -0.6668 0.7450 0.0256 -0.6577 0.7529 0.0256 -0.6577 0.7529 -0.4006 -0.7369 0.5445 -0.4006 -0.7369 0.5445 -0.3982 -0.7329 0.5516 -0.3982 -0.7329 0.5516 -0.4116 -0.7277 0.5487 -0.4116 -0.7277 0.5487 -0.4125 -0.7182 0.5604 -0.4125 -0.7182 0.5604 -0.4157 -0.7169 0.5597 -0.4157 -0.7169 0.5597 -0.4183 -0.7151 0.5600 -0.4183 -0.7151 0.5600 -0.3576 -0.5595 0.7477 -0.3576 -0.5595 0.7477 -0.3378 -0.3597 0.8698 -0.3378 -0.3597 0.8698 -0.2287 -0.3204 0.9192 -0.2287 -0.3204 0.9192 -0.2318 -0.3503 0.9075 -0.2068 -0.3370 0.9185 -0.1905 -0.3431 0.9198 -0.2156 -0.3637 0.9062 -0.2305 -0.3528 0.9069 -0.2318 -0.3503 0.9075 -0.0881 -0.5947 0.7991 -0.0719 -0.6206 0.7808 -0.0721 -0.6146 0.7855 -0.0721 -0.6146 0.7855 -0.0816 -0.5833 0.8082 -0.0884 -0.5948 0.7990 -0.2059 -0.4409 0.8736 -0.1835 -0.4408 0.8786 -0.1608 -0.4350 0.8859 -0.1503 -0.4308 0.8898 -0.1503 -0.4308 0.8898 -0.1712 -0.4302 0.8863 -0.1904 -0.4238 0.8855 -0.2141 -0.4300 0.8771 -0.2058 -0.4409 0.8737 -0.3129 -0.4509 0.8359 -0.2982 -0.4711 0.8301 -0.3132 -0.4513 0.8356 -0.3129 -0.4509 0.8359 -0.2227 -0.4246 0.8776 -0.2227 -0.4246 0.8776 -0.0951 -0.4434 0.8913 -0.0951 -0.4434 0.8913 -0.1276 -0.5402 0.8318 -0.1276 -0.5402 0.8318 -0.1886 -0.4841 0.8544 -0.1645 -0.4797 0.8619 -0.1446 -0.4900 0.8597 -0.1666 -0.4854 0.8583 -0.1886 -0.4841 0.8544 -0.2095 -0.4763 0.8540 -0.2095 -0.4763 0.8540 -0.1882 -0.4630 0.8662 -0.1882 -0.4630 0.8662 -0.1916 -0.4495 0.8725 -0.1916 -0.4495 0.8725 -0.1374 -0.5767 0.8053 -0.1374 -0.5767 0.8053 -0.1027 -0.5751 0.8116 -0.1027 -0.5751 0.8116 -0.1085 -0.5899 0.8002 -0.1085 -0.5899 0.8002 -0.0984 -0.6109 0.7856 -0.0984 -0.6109 0.7856 -0.0670 -0.5707 0.8184 -0.0670 -0.5707 0.8184 -0.0723 -0.5659 0.8213 -0.0723 -0.5659 0.8213 -0.0569 -0.5524 0.8317 -0.0569 -0.5524 0.8317 -0.0466 -0.5518 0.8327 -0.0466 -0.5518 0.8327 -0.0510 -0.6412 0.7657 -0.0510 -0.6412 0.7657 -0.2787 -0.5750 0.7692 -0.2787 -0.5750 0.7692 -0.2882 -0.5463 0.7864 -0.2882 -0.5463 0.7864 -0.2944 -0.5293 0.7957 -0.2944 -0.5293 0.7957 -0.2942 -0.5603 0.7743 -0.2942 -0.5603 0.7743 -0.3042 -0.5698 0.7634 -0.3042 -0.5698 0.7634 -0.3109 -0.5826 0.7509 -0.3109 -0.5826 0.7509 -0.1846 -0.4674 0.8645 -0.1846 -0.4674 0.8645 -0.1240 -0.5727 0.8104 -0.1240 -0.5727 0.8104 0.1442 -0.4045 0.9031 0.1442 -0.4045 0.9031 0.2489 -0.5203 0.8169 0.2489 -0.5203 0.8169 0.1850 -0.5966 0.7809 0.1850 -0.5966 0.7809 0.2301 -0.5744 0.7855 0.2301 -0.5744 0.7855 -0.4852 -0.2104 0.8487 -0.4852 -0.2104 0.8487 -0.4520 -0.2214 0.8641 -0.4520 -0.2214 0.8641 0.0481 -0.7298 0.6820 0.0273 -0.7309 0.6820 0.1429 -0.8780 0.4568 0.1429 -0.8780 0.4569 0.0786 -0.8547 0.5131 0.0786 -0.8547 0.5131 0.0730 -0.8450 0.5298 0.0731 -0.8449 0.5299 0.0355 -0.8199 0.5714 0.0355 -0.8199 0.5714 0.0881 -0.8200 0.5656 0.0880 -0.8200 0.5656 0.0250 -0.7986 0.6014 0.0249 -0.7985 0.6014 0.1748 -0.6915 0.7009 0.1506 -0.7111 0.6868 0.1382 -0.7149 0.6855 0.1382 -0.7149 0.6855 0.1645 -0.6979 0.6971 0.1748 -0.6915 0.7009 0.1070 -0.7297 0.6753 0.1374 -0.7198 0.6804 0.1319 -0.7280 0.6727 0.0964 -0.7247 0.6823 0.0804 -0.6987 0.7109 0.0609 -0.6948 0.7166 0.0609 -0.6949 0.7166 0.0446 -0.7209 0.6916 0.0481 -0.7298 0.6820 0.0272 -0.7309 0.6820 0.0327 -0.7009 0.7125 0.0443 -0.6956 0.7170 0.0443 -0.6956 0.7170 0.0461 -0.6845 0.7276 0.0461 -0.6844 0.7276 0.0167 -0.6802 0.7329 -0.0049 -0.6873 0.7264 -0.0049 -0.6873 0.7264 0.0049 -0.6690 0.7433 0.0049 -0.6690 0.7433 0.0322 -0.6583 0.7520 0.0423 -0.6596 0.7504 0.0423 -0.6596 0.7504 0.0656 -0.6796 0.7306 0.0771 -0.6868 0.7228 0.0770 -0.6868 0.7228 0.1073 -0.6870 0.7187 0.1275 -0.6986 0.7040 0.1275 -0.6986 0.7040 0.1045 -0.7195 0.6866 0.0965 -0.7248 0.6822 -0.1499 -0.6496 0.7453 -0.1501 -0.6503 0.7447 0.0889 -0.7350 0.6722 0.0881 -0.7365 0.6707 0.1319 -0.7280 0.6727 0.1029 -0.7419 0.6626 0.0881 -0.7365 0.6707 0.0889 -0.7350 0.6722 0.1070 -0.7297 0.6753 0.1571 -0.6544 0.7396 0.1571 -0.6544 0.7396 0.0181 -0.6386 0.7693 0.0181 -0.6386 0.7693 -0.0146 -0.7269 0.6866 -0.0146 -0.7269 0.6866 -0.0160 -0.7246 0.6889 -0.0160 -0.7246 0.6889 -0.0155 -0.7227 0.6910 -0.0155 -0.7227 0.6910 -0.0163 -0.7201 0.6937 -0.0163 -0.7201 0.6937 -0.0317 -0.7113 0.7021 -0.0317 -0.7113 0.7021 -0.0499 -0.6736 0.7374 -0.0499 -0.6736 0.7374 -0.0536 -0.6739 0.7369 -0.0536 -0.6739 0.7369 -0.0572 -0.6727 0.7377 -0.0572 -0.6727 0.7377 -0.0581 -0.6745 0.7360 -0.0581 -0.6745 0.7360 -0.1169 -0.7103 0.6941 -0.1169 -0.7103 0.6941 -0.1272 -0.6741 0.7276 -0.1272 -0.6741 0.7276 -0.1501 -0.6503 0.7447 -0.1499 -0.6496 0.7453 -0.2748 -0.7399 0.6140 -0.2748 -0.7399 0.6140 -0.3308 -0.7319 0.5957 -0.3308 -0.7319 0.5957 -0.3391 -0.7393 0.5818 -0.3391 -0.7393 0.5818 -0.3398 -0.7507 0.5665 -0.3398 -0.7507 0.5665 -0.4030 -0.6397 0.6546 -0.4030 -0.6397 0.6546 -0.2621 -0.6787 0.6860 -0.2621 -0.6787 0.6860 -0.2817 -0.6743 0.6827 -0.2817 -0.6743 0.6827 -0.2917 -0.6746 0.6781 -0.2917 -0.6746 0.6781 -0.3352 -0.6060 0.7214 -0.3352 -0.6060 0.7214 -0.2463 -0.7984 0.5495 -0.2463 -0.7984 0.5495 -0.2484 -0.8001 0.5460 -0.2484 -0.8001 0.5460 -0.2085 -0.7351 0.6451 -0.2085 -0.7351 0.6451 -0.2891 -0.6889 0.6647 -0.2891 -0.6889 0.6647 -0.2100 -0.6407 0.7385 -0.2100 -0.6407 0.7385 -0.1764 -0.7670 0.6169 -0.1764 -0.7670 0.6169 -0.2572 -0.6606 0.7053 -0.2572 -0.6606 0.7053 -0.2534 -0.6381 0.7270 -0.2534 -0.6381 0.7270 0.3282 -0.2368 0.9144 0.3240 -0.2147 0.9214 0.3194 -0.1935 0.9277 0.3232 -0.1772 0.9296 0.3226 -0.1741 0.9304 0.3226 -0.1741 0.9304 0.3252 -0.1578 0.9324 0.3175 -0.1385 0.9381 0.3034 -0.1480 0.9413 0.2999 -0.1628 0.9400 0.2922 -0.1635 0.9423 0.2922 -0.1635 0.9423 0.2917 -0.1472 0.9451 0.2953 -0.1333 0.9461 0.3113 -0.1252 0.9420 0.3024 -0.1206 0.9455 0.3024 -0.1206 0.9455 0.2787 -0.1235 0.9524 0.2679 -0.1328 0.9543 0.2491 -0.1198 0.9610 0.2491 -0.1198 0.9610 0.2585 -0.1108 0.9596 0.2664 -0.1008 0.9586 0.2322 -0.0947 0.9680 0.2305 -0.0953 0.9684 0.2305 -0.0954 0.9684 0.2385 -0.0868 0.9673 0.2174 -0.0888 0.9720 0.2125 -0.0765 0.9742 0.2007 -0.0800 0.9764 0.2007 -0.0800 0.9764 0.1777 -0.0640 0.9820 0.1650 -0.0520 0.9849 0.1632 -0.0593 0.9848 0.1619 -0.0510 0.9855 0.1527 -0.0554 0.9867 0.1534 -0.0483 0.9870 0.1532 -0.0410 0.9873 0.1512 -0.0403 0.9877 0.1511 -0.0403 0.9877 0.1444 -0.0320 0.9890 0.1357 -0.0362 0.9901 0.1351 -0.0424 0.9899 0.1390 -0.0503 0.9890 0.1425 -0.0586 0.9881 0.1312 -0.0606 0.9895 0.1332 -0.0687 0.9887 0.1229 -0.0701 0.9899 0.1212 -0.0763 0.9897 0.1189 -0.0679 0.9906 0.1211 -0.0624 0.9907 0.1236 -0.0571 0.9907 0.1230 -0.0505 0.9911 0.1176 -0.0475 0.9919 0.1176 -0.0476 0.9919 0.1125 -0.0512 0.9923 0.1077 -0.0548 0.9927 0.1041 -0.0587 0.9928 0.1036 -0.0644 0.9925 0.1019 -0.0697 0.9923 0.1027 -0.0639 0.9927 0.1035 -0.0583 0.9929 0.1064 -0.0540 0.9929 0.0981 -0.0552 0.9936 0.0947 -0.0588 0.9938 0.0922 -0.0629 0.9938 0.0907 -0.0679 0.9936 0.0955 -0.0780 0.9924 0.0893 -0.0796 0.9928 0.0852 -0.0822 0.9930 0.0852 -0.0822 0.9930 0.0833 -0.0877 0.9927 0.0896 -0.0866 0.9922 0.0936 -0.0829 0.9921 0.0905 -0.0875 0.9920 0.0947 -0.0996 0.9905 0.0867 -0.0993 0.9913 0.0882 -0.1102 0.9900 0.0868 -0.1185 0.9892 0.0753 -0.1116 0.9909 0.0753 -0.1116 0.9909 0.0719 -0.1171 0.9905 0.0688 -0.1238 0.9899 0.0689 -0.1372 0.9881 0.0666 -0.1479 0.9868 0.0756 -0.1535 0.9853 0.0756 -0.1535 0.9852 0.0765 -0.1724 0.9821 0.0695 -0.1769 0.9818 0.0643 -0.1866 0.9803 0.0784 -0.2019 0.9763 0.0843 -0.1954 0.9771 0.0843 -0.1953 0.9771 0.0791 -0.2069 0.9752 0.0950 -0.2230 0.9702 0.1026 -0.2148 0.9713 0.1118 -0.2100 0.9713 0.1205 -0.2098 0.9703 0.1206 -0.2098 0.9703 0.1376 -0.2189 0.9660 0.1580 -0.2317 0.9599 0.1639 -0.2350 0.9581 0.1639 -0.2350 0.9581 0.1872 -0.2495 0.9501 0.1984 -0.2480 0.9482 0.1984 -0.2480 0.9482 0.1946 -0.2653 0.9443 0.2136 -0.2672 0.9397 0.2208 -0.2956 0.9295 0.2262 -0.2947 0.9284 0.1432 -0.3412 0.9290 0.1231 -0.3276 0.9368 0.1194 -0.3286 0.9369 0.1194 -0.3286 0.9369 0.1323 -0.3200 0.9381 0.1170 -0.3221 0.9395 0.1000 -0.3160 0.9435 0.0991 -0.3166 0.9434 0.0991 -0.3166 0.9434 0.0832 -0.3116 0.9466 0.0667 -0.2890 0.9550 0.0691 -0.2990 0.9517 0.0691 -0.2990 0.9517 0.0554 -0.2985 0.9528 0.0412 -0.2773 0.9599 0.0296 -0.2832 0.9586 0.0324 -0.2908 0.9562 0.0324 -0.2909 0.9562 0.0219 -0.3078 0.9512 0.0183 -0.2918 0.9563 0.0183 -0.2918 0.9563 0.0057 -0.2872 0.9578 0.0132 -0.3234 0.9462 0.0150 -0.3261 0.9452 0.0038 -0.3289 0.9443 0.0183 -0.3352 0.9420 0.0333 -0.3405 0.9397 0.0484 -0.3411 0.9388 0.0631 -0.3381 0.9390 0.0668 -0.3375 0.9390 0.0668 -0.3375 0.9390 0.0823 -0.3377 0.9377 0.1003 -0.3521 0.9306 0.1102 -0.3590 0.9268 0.0107 -0.3745 0.9272 -0.0040 -0.3585 0.9335 -0.0090 -0.3394 0.9406 -0.0090 -0.3394 0.9406 -0.0197 -0.3157 0.9486 -0.0337 -0.3169 0.9479 -0.0361 -0.3216 0.9462 -0.0361 -0.3216 0.9462 -0.0273 -0.3485 0.9369 -0.0354 -0.3728 0.9272 -0.0480 -0.2724 0.9610 -0.0363 -0.2756 0.9606 -0.0450 -0.3149 0.9481 -0.0488 -0.3173 0.9471 -0.0488 -0.3173 0.9471 -0.0585 -0.2996 0.9523 -0.0480 -0.2724 0.9610 -0.0912 -0.2210 0.9710 -0.0855 -0.2346 0.9683 -0.0735 -0.2323 0.9699 -0.0785 -0.2449 0.9664 -0.0785 -0.2449 0.9664 -0.0905 -0.2453 0.9652 -0.1038 -0.2480 0.9632 -0.1101 -0.2347 0.9658 -0.1182 -0.2260 0.9669 -0.1053 -0.2241 0.9689 -0.0922 -0.2200 0.9711 -0.0912 -0.2210 0.9710 -0.0081 -0.2306 0.9730 0.0019 -0.2365 0.9716 0.0123 -0.2484 0.9686 0.0231 -0.2471 0.9687 0.0333 -0.2426 0.9696 0.0448 -0.2468 0.9680 0.0482 -0.2561 0.9655 0.0482 -0.2561 0.9655 0.0383 -0.2652 0.9634 0.0267 -0.2658 0.9637 0.0150 -0.2649 0.9642 0.0035 -0.2629 0.9648 -0.0037 -0.2607 0.9654 -0.0037 -0.2608 0.9654 -0.0121 -0.2377 0.9713 -0.0222 -0.2349 0.9718 -0.0118 -0.2311 0.9729 -0.0081 -0.2307 0.9730 0.0312 -0.1274 0.9914 0.0348 -0.1196 0.9922 0.0395 -0.1169 0.9924 0.0440 -0.1139 0.9925 0.0493 -0.1127 0.9924 0.0549 -0.1120 0.9922 0.0627 -0.1152 0.9914 0.0629 -0.1280 0.9898 0.0586 -0.1335 0.9893 0.0525 -0.1353 0.9894 0.0528 -0.1454 0.9880 0.0529 -0.1454 0.9880 0.0575 -0.1391 0.9886 0.0620 -0.1337 0.9891 0.0602 -0.1456 0.9875 0.0575 -0.1575 0.9858 0.0543 -0.1707 0.9838 0.0461 -0.1701 0.9843 0.0403 -0.1787 0.9831 0.0386 -0.1805 0.9828 0.0386 -0.1804 0.9828 0.0470 -0.1807 0.9824 0.0392 -0.1833 0.9823 0.0484 -0.1865 0.9813 0.0443 -0.2041 0.9780 0.0376 -0.2169 0.9755 0.0317 -0.2200 0.9750 0.0318 -0.2200 0.9750 0.0410 -0.2174 0.9752 0.0338 -0.2315 0.9722 0.0234 -0.2298 0.9729 0.0136 -0.2308 0.9729 0.0136 -0.2308 0.9729 0.0036 -0.2347 0.9721 0.0126 -0.2216 0.9750 0.0218 -0.2173 0.9759 0.0120 -0.2049 0.9787 0.0194 -0.1923 0.9811 0.0267 -0.1959 0.9803 0.0267 -0.1959 0.9803 0.0176 -0.1896 0.9817 0.0232 -0.1736 0.9845 0.0315 -0.1769 0.9837 0.0229 -0.1709 0.9850 0.0287 -0.1620 0.9864 0.0339 -0.1601 0.9865 0.0339 -0.1601 0.9865 0.0266 -0.1593 0.9869 0.0201 -0.1632 0.9864 0.0129 -0.1641 0.9864 0.0186 -0.1532 0.9880 0.0120 -0.1550 0.9878 0.0055 -0.1618 0.9868 0.0118 -0.1530 0.9882 0.0052 -0.1551 0.9879 0.0070 -0.1476 0.9890 0.0070 -0.1475 0.9890 0.0006 -0.1488 0.9889 0.0063 -0.1378 0.9904 0.0125 -0.1404 0.9900 0.0182 -0.1368 0.9904 0.0245 -0.1381 0.9901 0.0177 -0.1325 0.9910 0.0223 -0.1260 0.9918 0.0269 -0.1209 0.9923 0.0311 -0.1274 0.9914 -0.0117 -0.1541 0.9880 -0.0050 -0.1535 0.9881 0.0016 -0.1643 0.9864 0.0091 -0.1741 0.9847 0.0044 -0.2048 0.9788 -0.0045 -0.2050 0.9788 -0.0126 -0.1951 0.9807 -0.0041 -0.1875 0.9823 -0.0012 -0.1866 0.9824 -0.0012 -0.1866 0.9824 -0.0092 -0.1836 0.9830 -0.0171 -0.1831 0.9830 -0.0117 -0.1541 0.9880 0.0151 -0.3261 0.9452 0.0038 -0.3290 0.9443 0.2925 -0.1407 0.9459 0.2954 -0.1577 0.9423 0.2922 -0.1405 0.9460 0.2925 -0.1407 0.9459 0.2717 -0.1159 0.9554 0.2717 -0.1159 0.9554 0.2726 -0.1096 0.9559 0.2678 -0.1214 0.9558 0.2726 -0.1096 0.9559 0.2599 -0.1180 0.9584 0.2599 -0.1180 0.9584 0.2522 -0.0943 0.9631 0.2522 -0.0943 0.9631 0.2398 -0.0778 0.9677 0.2398 -0.0778 0.9677 0.0973 -0.0978 0.9904 0.0867 -0.0949 0.9917 0.0919 -0.0922 0.9915 0.0973 -0.0978 0.9904 0.0866 -0.1096 0.9902 0.0866 -0.1096 0.9902 0.1965 -0.2735 0.9416 0.2147 -0.2738 0.9375 0.2033 -0.2839 0.9370 0.1965 -0.2735 0.9416 0.2161 -0.2668 0.9392 0.2161 -0.2668 0.9392 0.0449 -0.2762 0.9600 0.0571 -0.2754 0.9596 0.0463 -0.2840 0.9577 0.0449 -0.2762 0.9600 0.0783 -0.3423 0.9363 0.0783 -0.3423 0.9363 0.0704 -0.3449 0.9360 0.0704 -0.3449 0.9360 0.0711 -0.3389 0.9381 0.0711 -0.3389 0.9381 0.0571 -0.3407 0.9384 0.0571 -0.3407 0.9384 -0.0244 -0.2742 0.9614 -0.0124 -0.2739 0.9617 -0.0218 -0.3070 0.9515 -0.0244 -0.2742 0.9614 -0.0365 -0.2715 0.9617 -0.0365 -0.2715 0.9617 -0.0209 -0.2473 0.9687 -0.0209 -0.2473 0.9687 -0.0615 -0.2438 0.9679 -0.0615 -0.2438 0.9679 -0.0505 -0.2377 0.9700 -0.0505 -0.2377 0.9700 -0.0519 -0.2313 0.9715 -0.0519 -0.2313 0.9715 -0.0563 -0.2236 0.9731 -0.0563 -0.2236 0.9731 -0.0411 -0.2260 0.9733 -0.0411 -0.2260 0.9733 -0.0572 -0.2043 0.9772 -0.0572 -0.2043 0.9772 -0.1113 -0.2126 0.9708 -0.1113 -0.2126 0.9708 -0.1049 -0.1920 0.9758 -0.0954 -0.1942 0.9763 -0.1109 -0.2046 0.9725 -0.1227 -0.2049 0.9711 -0.1052 -0.1919 0.9757 -0.1049 -0.1920 0.9758 -0.0930 -0.2070 0.9739 -0.0930 -0.2070 0.9739 -0.0698 -0.1940 0.9785 -0.0828 -0.2032 0.9756 -0.0699 -0.1940 0.9785 -0.0698 -0.1940 0.9785 -0.0851 -0.1886 0.9784 -0.0851 -0.1886 0.9784 -0.0680 -0.1828 0.9808 -0.0787 -0.1868 0.9792 -0.0680 -0.1828 0.9808 -0.0680 -0.1828 0.9808 -0.0424 -0.2054 0.9778 -0.0424 -0.2054 0.9778 -0.0438 -0.1795 0.9828 -0.0374 -0.1877 0.9815 -0.0478 -0.1968 0.9793 -0.0438 -0.1795 0.9828 -0.0118 -0.2126 0.9771 -0.0213 -0.2159 0.9762 -0.0118 -0.2126 0.9771 -0.0268 -0.1921 0.9810 -0.0190 -0.1983 0.9800 -0.0281 -0.2010 0.9792 -0.0268 -0.1921 0.9810 -0.0031 -0.2138 0.9769 -0.0031 -0.2138 0.9769 0.0001 -0.2277 0.9737 0.0001 -0.2277 0.9737 0.0462 -0.2355 0.9708 0.0462 -0.2355 0.9708 -0.0289 -0.1686 0.9853 -0.0289 -0.1686 0.9853 0.0926 -0.3511 0.9317 0.0926 -0.3511 0.9317 -0.0417 -0.2275 0.9729 -0.0320 -0.2310 0.9724 -0.0444 -0.2553 0.9658 -0.0531 -0.2439 0.9684 -0.0416 -0.2400 0.9699 -0.0417 -0.2275 0.9729 0.2168 -0.0743 0.9734 0.2168 -0.0743 0.9734 0.0663 -0.2069 0.9761 0.0663 -0.2069 0.9761 0.0699 -0.2056 0.9761 0.0699 -0.2056 0.9761 0.1874 -0.2527 0.9492 0.1874 -0.2527 0.9492 0.1903 -0.2580 0.9472 0.1903 -0.2580 0.9472 0.1922 -0.2548 0.9477 0.1922 -0.2548 0.9477 -0.0341 -0.2873 0.9572 -0.0341 -0.2873 0.9572 0.1918 -0.2736 0.9425 0.1918 -0.2736 0.9425 0.3282 -0.2368 0.9145 0.3203 -0.2530 0.9129 0.3166 -0.2677 0.9100 0.3166 -0.2677 0.9100 0.3325 -0.2968 0.8952 0.3326 -0.2969 0.8951 0.3327 -0.2969 0.8951 0.3475 -0.3249 0.8796 0.3475 -0.3249 0.8796 0.3522 -0.3531 0.8668 0.3479 -0.3434 0.8724 0.3478 -0.3434 0.8724 0.3304 -0.3558 0.8742 0.3239 -0.3569 0.8762 0.3239 -0.3568 0.8762 0.2987 -0.3560 0.8855 0.2931 -0.3456 0.8915 0.2931 -0.3456 0.8915 0.2807 -0.3297 0.9014 0.2807 -0.3297 0.9014 0.2657 -0.3411 0.9017 0.2614 -0.3176 0.9115 0.2614 -0.3176 0.9115 0.2478 -0.3294 0.9111 0.2484 -0.3051 0.9194 0.2421 -0.3242 0.9145 0.2446 -0.3016 0.9215 0.2474 -0.2985 0.9218 0.2474 -0.2985 0.9218 0.2329 -0.3073 0.9227 0.2444 -0.2949 0.9237 0.2284 -0.3012 0.9258 0.2399 -0.2894 0.9266 0.2262 -0.2947 0.9284 0.3243 -0.2532 0.9114 0.3243 -0.2532 0.9114 0.3279 -0.2795 0.9024 0.3279 -0.2795 0.9024 0.3283 -0.2857 0.9003 0.3283 -0.2857 0.9003 0.3373 -0.2980 0.8930 0.3373 -0.2980 0.8930 0.3611 -0.3465 0.8657 0.3611 -0.3465 0.8657 0.3608 -0.3498 0.8645 0.3608 -0.3498 0.8645 0.3598 -0.3475 0.8659 0.3598 -0.3475 0.8659 0.3568 -0.3478 0.8670 0.3568 -0.3478 0.8670 0.3280 -0.3612 0.8729 0.3280 -0.3612 0.8729 0.2478 -0.3311 0.9105 0.2478 -0.3311 0.9105 -0.1117 -0.8921 0.4379 -0.1236 -0.9084 0.3995 -0.1194 -0.9254 0.3598 -0.1169 -0.9278 0.3544 -0.1169 -0.9278 0.3544 -0.0944 -0.9423 0.3211 -0.0727 -0.9474 0.3116 -0.0727 -0.9474 0.3116 -0.0323 -0.9466 0.3209 -0.0120 -0.9433 0.3317 -0.0120 -0.9433 0.3317 0.0129 -0.9313 0.3641 0.0468 -0.9284 0.3685 0.0468 -0.9284 0.3685 0.0404 -0.9437 0.3283 0.0284 -0.9480 0.3171 0.0284 -0.9480 0.3171 0.0192 -0.9608 0.2765 0.0183 -0.9616 0.2739 0.0183 -0.9616 0.2739 0.0300 -0.9621 0.2710 0.0300 -0.9621 0.2710 0.0716 -0.9587 0.2753 0.0726 -0.9588 0.2747 0.0726 -0.9588 0.2747 0.0965 -0.9573 0.2724 0.0965 -0.9573 0.2724 0.1155 -0.9590 0.2587 0.1155 -0.9590 0.2587 0.1098 -0.9660 0.2343 0.1097 -0.9660 0.2343 0.1068 -0.9721 0.2090 0.1068 -0.9721 0.2090 0.1087 -0.9758 0.1895 0.1087 -0.9758 0.1895 0.1277 -0.9778 0.1662 0.2081 -0.9700 0.1258 0.2102 -0.9674 0.1414 0.2102 -0.9674 0.1414 0.1888 -0.9691 0.1589 0.1888 -0.9691 0.1589 0.1795 -0.9714 0.1553 0.1795 -0.9714 0.1553 0.1783 -0.9718 0.1545 0.1783 -0.9718 0.1545 0.1655 -0.9763 0.1392 0.1655 -0.9763 0.1392 0.1513 -0.9789 0.1374 0.1513 -0.9789 0.1374 0.1303 -0.9808 0.1452 0.1303 -0.9808 0.1452 0.1225 -0.9826 0.1397 0.1277 -0.9778 0.1662 0.1449 -0.9774 0.1536 0.1449 -0.9774 0.1536 0.1709 -0.9720 0.1613 0.1708 -0.9720 0.1612 0.1742 -0.9711 0.1629 0.1742 -0.9711 0.1629 0.2048 -0.9656 0.1602 0.2048 -0.9656 0.1602 0.2162 -0.9646 0.1508 0.1225 -0.9826 0.1397 0.1101 -0.9816 0.1558 0.1101 -0.9816 0.1558 0.0809 -0.9806 0.1784 0.0809 -0.9806 0.1784 0.0738 -0.9786 0.1921 0.0738 -0.9786 0.1921 0.0494 -0.9753 0.2153 0.0494 -0.9753 0.2153 0.0459 -0.9733 0.2247 0.0459 -0.9733 0.2247 0.0371 -0.9720 0.2319 0.0371 -0.9720 0.2319 0.0160 -0.9728 0.2312 0.0160 -0.9728 0.2312 -0.0016 -0.9714 0.2376 -0.0016 -0.9714 0.2376 -0.0380 -0.9672 0.2512 -0.0758 -0.9574 0.2788 -0.1173 -0.9550 0.2725 -0.1556 -0.9453 0.2868 -0.1766 -0.9392 0.2946 -0.1766 -0.9392 0.2946 -0.2127 -0.9262 0.3114 -0.2451 -0.9105 0.3329 -0.2495 -0.9070 0.3392 -0.2495 -0.9070 0.3393 -0.2495 -0.8908 0.3797 -0.2716 -0.8710 0.4094 -0.2986 -0.8507 0.4325 -0.3026 -0.8403 0.4499 -0.3026 -0.8403 0.4499 -0.3242 -0.8174 0.4763 -0.3361 -0.7929 0.5083 -0.3424 -0.7824 0.5203 -0.3424 -0.7824 0.5203 -0.3470 -0.8041 0.4828 -0.3328 -0.8256 0.4556 -0.3328 -0.8256 0.4556 -0.3207 -0.8482 0.4216 -0.3409 -0.8309 0.4398 -0.3409 -0.8309 0.4398 -0.3681 -0.8085 0.4591 -0.3707 -0.7881 0.4913 -0.3707 -0.7882 0.4913 -0.3819 -0.7625 0.5223 -0.3844 -0.7454 0.5447 -0.0758 -0.9574 0.2788 -0.0469 -0.9644 0.2604 -0.0380 -0.9672 0.2512 -0.0469 -0.9644 0.2604 0.3605 -0.7644 0.5345 0.3605 -0.7644 0.5345 0.2817 -0.8843 0.3723 0.2817 -0.8843 0.3723 0.2934 -0.8813 0.3705 0.2934 -0.8813 0.3705 0.2892 -0.8819 0.3723 0.2892 -0.8819 0.3723 0.2865 -0.8821 0.3739 0.2865 -0.8821 0.3739 0.2681 -0.8847 0.3813 0.2681 -0.8847 0.3813 0.2710 -0.8901 0.3665 0.2710 -0.8901 0.3665 0.2619 -0.8959 0.3588 0.2619 -0.8959 0.3588 0.2564 -0.8834 0.3923 0.2564 -0.8834 0.3923 0.2487 -0.8874 0.3881 0.2487 -0.8874 0.3881 0.2565 -0.8859 0.3864 0.2565 -0.8859 0.3864 0.2499 -0.8883 0.3854 0.2499 -0.8883 0.3854 0.2323 -0.8859 0.4014 0.2323 -0.8859 0.4014 0.2395 -0.8837 0.4022 0.2395 -0.8837 0.4022 0.2435 -0.8799 0.4079 0.2435 -0.8799 0.4079 0.2256 -0.8805 0.4170 0.2256 -0.8805 0.4170 0.2274 -0.8887 0.3980 0.2274 -0.8887 0.3980 0.2212 -0.8887 0.4016 0.2212 -0.8887 0.4016 0.1942 -0.8906 0.4113 0.1942 -0.8906 0.4113 0.1850 -0.8857 0.4258 0.1850 -0.8857 0.4258 0.1915 -0.8919 0.4096 0.1915 -0.8919 0.4096 0.1960 -0.8844 0.4236 0.1960 -0.8844 0.4236 0.2070 -0.8781 0.4314 0.2070 -0.8781 0.4314 0.1862 -0.8722 0.4524 0.1862 -0.8722 0.4524 0.1711 -0.8770 0.4491 0.1711 -0.8770 0.4491 0.3570 -0.8810 0.3105 0.3570 -0.8810 0.3105 0.3669 -0.8752 0.3152 0.3669 -0.8752 0.3152 0.3932 -0.8653 0.3110 0.3932 -0.8653 0.3110 0.4045 -0.8621 0.3052 0.4045 -0.8621 0.3052 0.4009 -0.8602 0.3151 0.4009 -0.8602 0.3151 0.4063 -0.8572 0.3164 0.4063 -0.8572 0.3164 0.4091 -0.8541 0.3213 0.4091 -0.8541 0.3213 0.4051 -0.8582 0.3152 0.4051 -0.8582 0.3152 0.4289 -0.8479 0.3117 0.4289 -0.8479 0.3117 0.4296 -0.8481 0.3102 0.4296 -0.8481 0.3102 0.4336 -0.8495 0.3007 0.4336 -0.8495 0.3007 0.4356 -0.8490 0.2991 0.4356 -0.8490 0.2991 0.4396 -0.8481 0.2957 0.4396 -0.8481 0.2957 0.4492 -0.8402 0.3039 0.4492 -0.8402 0.3039 0.4511 -0.8422 0.2952 0.4511 -0.8422 0.2952 0.4464 -0.8468 0.2893 0.4464 -0.8468 0.2893 0.4574 -0.8433 0.2822 0.4574 -0.8433 0.2822 0.4548 -0.8466 0.2764 0.4548 -0.8466 0.2764 0.4618 -0.8431 0.2755 0.4618 -0.8431 0.2755 0.4600 -0.8461 0.2694 0.4600 -0.8461 0.2694 0.4657 -0.8470 0.2564 0.4657 -0.8470 0.2564 0.2911 -0.8952 0.3374 0.3302 -0.8839 0.3311 0.3043 -0.9030 0.3034 0.2647 -0.9127 0.3113 0.2911 -0.8952 0.3374 0.3438 -0.8856 0.3123 0.3438 -0.8856 0.3123 0.2667 -0.9124 0.3105 0.2667 -0.9124 0.3105 0.2644 -0.9100 0.3194 0.2644 -0.9100 0.3194 0.2719 -0.9060 0.3245 0.2719 -0.9060 0.3245 0.1412 -0.9330 0.3309 0.1412 -0.9330 0.3309 0.1914 -0.9301 0.3134 0.1914 -0.9301 0.3134 0.0821 -0.9241 0.3733 0.1171 -0.9128 0.3913 0.1569 -0.9075 0.3895 0.1943 -0.9072 0.3731 0.2318 -0.9051 0.3564 0.2566 -0.9027 0.3453 0.2566 -0.9027 0.3453 0.2177 -0.9145 0.3411 0.1840 -0.9123 0.3659 0.1446 -0.9154 0.3756 0.1046 -0.9200 0.3776 0.0821 -0.9241 0.3733 0.1659 -0.9068 0.3875 0.1659 -0.9068 0.3875 0.1747 -0.9061 0.3854 0.1747 -0.9061 0.3854 0.1843 -0.9051 0.3831 0.1843 -0.9051 0.3831 0.1873 -0.9053 0.3811 0.1873 -0.9053 0.3811 0.1921 -0.9050 0.3796 0.1921 -0.9050 0.3796 0.1935 -0.9061 0.3762 0.1935 -0.9061 0.3762 0.1873 -0.9171 0.3519 0.1873 -0.9171 0.3519 0.1719 -0.9169 0.3603 0.1719 -0.9169 0.3603 0.1364 -0.9197 0.3681 0.1364 -0.9197 0.3681 0.1119 -0.9215 0.3720 0.1119 -0.9215 0.3720 -0.2606 -0.8942 0.3639 -0.2606 -0.8942 0.3639 -0.2638 -0.8922 0.3667 -0.2638 -0.8922 0.3667 -0.2941 -0.8538 0.4296 -0.2941 -0.8538 0.4296 -0.3103 -0.8564 0.4126 -0.3103 -0.8564 0.4126 -0.3169 -0.8524 0.4160 -0.3169 -0.8524 0.4160 -0.3201 -0.8472 0.4241 -0.3201 -0.8472 0.4241 -0.3240 -0.8378 0.4394 -0.3240 -0.8378 0.4394 -0.3332 -0.8069 0.4878 -0.3332 -0.8069 0.4878 -0.3370 -0.8096 0.4806 -0.3370 -0.8096 0.4806 -0.3412 -0.8082 0.4800 -0.3412 -0.8082 0.4800 -0.3480 -0.7970 0.4937 -0.3480 -0.7970 0.4937 -0.3549 -0.7734 0.5253 -0.3549 -0.7734 0.5253 -0.4150 -0.7707 0.4835 -0.4150 -0.7707 0.4835 -0.3765 -0.7980 0.4705 -0.3765 -0.7980 0.4705 -0.3407 -0.8376 0.4271 -0.3407 -0.8376 0.4271 -0.3410 -0.8434 0.4152 -0.3410 -0.8434 0.4152 -0.3391 -0.8834 0.3234 -0.3391 -0.8834 0.3234 -0.3977 -0.8618 0.3148 -0.3977 -0.8618 0.3148 -0.2666 -0.8894 0.3713 -0.2666 -0.8894 0.3713 -0.2662 -0.8902 0.3696 -0.2662 -0.8902 0.3696 -0.0254 -0.9464 0.3221 -0.0254 -0.9464 0.3221 0.0532 -0.9348 0.3512 0.0532 -0.9348 0.3512 -0.3239 -0.9291 0.1787 -0.3238 -0.9291 0.1787 0.0332 -0.9510 0.3075 0.0333 -0.9510 0.3075 0.0344 -0.9541 0.2974 0.0344 -0.9541 0.2974 0.0505 -0.9595 0.2773 0.0505 -0.9595 0.2773 0.0564 -0.9582 0.2806 0.0565 -0.9581 0.2807 0.0677 -0.9568 0.2826 0.0677 -0.9568 0.2826 0.0400 -0.9726 0.2292 0.0399 -0.9726 0.2292 0.0410 -0.9723 0.2301 0.0409 -0.9723 0.2301 0.1214 -0.9611 0.2481 0.1214 -0.9611 0.2482 0.0753 -0.9767 0.2008 0.0753 -0.9767 0.2008 0.1328 -0.9775 0.1639 0.1328 -0.9775 0.1639 0.1335 -0.9776 0.1625 0.1335 -0.9776 0.1625 0.1340 -0.9776 0.1625 0.1341 -0.9776 0.1625 0.1870 -0.9714 0.1464 0.1870 -0.9714 0.1463 0.1873 -0.9716 0.1444 0.1873 -0.9716 0.1444 0.1909 -0.9705 0.1471 0.1909 -0.9705 0.1470 0.1536 -0.9793 0.1319 0.1536 -0.9793 0.1319 0.1424 -0.9808 0.1329 0.1424 -0.9808 0.1329 0.1413 -0.9818 0.1269 0.1413 -0.9818 0.1269 0.1324 -0.9811 0.1414 0.1324 -0.9811 0.1414 0.1330 -0.9807 0.1431 0.1330 -0.9807 0.1431 0.1321 -0.9807 0.1441 0.1321 -0.9807 0.1441 -0.1690 -0.8540 0.4921 -0.1690 -0.8540 0.4921 -0.1422 -0.8831 0.4471 -0.1422 -0.8831 0.4471 -0.1169 -0.8955 0.4293 -0.1169 -0.8955 0.4293 0.0113 -0.9641 0.2652 0.0113 -0.9641 0.2652 0.0634 -0.9743 0.2163 0.0634 -0.9743 0.2163 0.0721 -0.9751 0.2099 0.0721 -0.9751 0.2098 0.1728 -0.9717 0.1610 0.1729 -0.9716 0.1617 0.1768 -0.9715 0.1582 0.1790 -0.9715 0.1556 0.2162 -0.9646 0.1508 0.2346 -0.9594 0.1565 0.1976 -0.9797 0.0340 0.2237 -0.9723 0.0681 0.2169 -0.9699 0.1110 0.2175 -0.9695 0.1132 0.2346 -0.9594 0.1565 0.2558 -0.9474 0.1924 0.2698 -0.9426 0.1968 0.2697 -0.9426 0.1969 0.3060 -0.9277 0.2140 0.3134 -0.9272 0.2054 0.2175 -0.9695 0.1132 0.2081 -0.9700 0.1258 0.1940 -0.9807 0.0251 0.1652 -0.9862 -0.0072 0.1598 -0.9867 -0.0299 0.1598 -0.9867 -0.0299 0.1676 -0.9841 -0.0588 0.1676 -0.9841 -0.0588 0.1574 -0.9823 -0.1012 0.1823 -0.9738 -0.1358 0.1866 -0.9723 -0.1407 0.1866 -0.9723 -0.1407 0.2037 -0.9625 -0.1795 0.2229 -0.9505 -0.2165 0.2304 -0.9432 -0.2395 0.2304 -0.9432 -0.2395 0.2562 -0.9281 -0.2703 0.2905 -0.9122 -0.2890 0.3183 -0.8942 -0.3148 0.1976 -0.9797 0.0340 0.1940 -0.9807 0.0251 0.3183 -0.8942 -0.3148 0.3171 -0.8792 -0.3557 0.3054 -0.8662 -0.3955 0.3054 -0.8622 -0.4042 0.2097 -0.7272 -0.6536 0.2167 -0.6982 -0.6823 0.2140 -0.6824 -0.6990 0.2140 -0.6824 -0.6990 0.1990 -0.6651 -0.7197 0.1990 -0.6651 -0.7197 0.1797 -0.6674 -0.7227 0.1797 -0.6674 -0.7227 0.1909 -0.6384 -0.7457 0.1812 -0.6341 -0.7517 0.1812 -0.6341 -0.7517 0.1734 -0.6017 -0.7797 0.1774 -0.5945 -0.7843 0.1774 -0.5945 -0.7843 0.1928 -0.5755 -0.7948 0.1928 -0.5755 -0.7948 0.2193 -0.5713 -0.7909 0.2244 -0.5677 -0.7921 0.3054 -0.8622 -0.4042 0.2971 -0.8455 -0.4436 0.2803 -0.8309 -0.4806 0.2693 -0.8118 -0.5182 0.2693 -0.8079 -0.5242 0.2693 -0.8079 -0.5242 0.2565 -0.7875 -0.5603 0.2370 -0.7692 -0.5935 0.2227 -0.7463 -0.6273 0.2097 -0.7272 -0.6536 0.2243 -0.5677 -0.7921 0.2351 -0.5998 -0.7648 0.2638 -0.6090 -0.7480 0.2687 -0.6147 -0.7415 0.2687 -0.6147 -0.7415 0.2721 -0.6461 -0.7131 0.3014 -0.6557 -0.6922 0.3072 -0.6597 -0.6859 0.3072 -0.6597 -0.6859 0.3162 -0.6814 -0.6600 0.3162 -0.6814 -0.6600 0.3469 -0.6702 -0.6561 0.3750 -0.6807 -0.6293 0.4063 -0.6679 -0.6235 0.4379 -0.6679 -0.6018 0.4354 -0.6960 -0.5710 0.4447 -0.7172 -0.5365 0.4447 -0.7172 -0.5365 0.4489 -0.6899 -0.5679 0.4775 -0.6684 -0.5704 0.4961 -0.6674 -0.5554 0.4961 -0.6674 -0.5554 0.5238 -0.6713 -0.5244 0.5551 -0.6645 -0.5003 0.5837 -0.6620 -0.4702 0.5993 -0.6743 -0.4314 0.6053 -0.6723 -0.4261 0.7479 -0.6039 -0.2758 0.7556 -0.6120 -0.2336 0.7766 -0.5962 -0.2036 0.7766 -0.5962 -0.2036 0.7983 -0.5775 -0.1711 0.8078 -0.5688 -0.1550 0.8078 -0.5688 -0.1550 0.8143 -0.5696 -0.1119 0.8059 -0.5854 -0.0881 0.8059 -0.5854 -0.0881 0.7835 -0.6176 -0.0693 0.7600 -0.6480 -0.0489 0.7528 -0.6563 -0.0503 0.7528 -0.6563 -0.0503 0.7242 -0.6883 -0.0427 0.6978 -0.7159 -0.0218 0.6945 -0.7192 -0.0194 0.6053 -0.6724 -0.4260 0.6361 -0.6578 -0.4033 0.6523 -0.6461 -0.3964 0.6523 -0.6461 -0.3964 0.6815 -0.6193 -0.3899 0.7037 -0.6109 -0.3629 0.7037 -0.6109 -0.3629 0.7268 -0.6038 -0.3274 0.7433 -0.6041 -0.2873 0.7479 -0.6039 -0.2758 0.6945 -0.7192 -0.0194 0.6626 -0.7486 -0.0235 0.6462 -0.7617 -0.0466 0.6462 -0.7617 -0.0466 0.6329 -0.7736 -0.0311 0.6329 -0.7736 -0.0311 0.6200 -0.7842 -0.0245 0.6200 -0.7842 -0.0245 0.6196 -0.7847 -0.0177 0.6196 -0.7847 -0.0177 0.6408 -0.7676 0.0163 0.6276 -0.7764 0.0569 0.6185 -0.7827 0.0703 0.6185 -0.7827 0.0703 0.5906 -0.8010 0.0983 0.5829 -0.8072 0.0932 0.5829 -0.8072 0.0932 0.5476 -0.8303 0.1035 0.5385 -0.8372 0.0956 0.5385 -0.8372 0.0956 0.5393 -0.8356 0.1046 0.4880 -0.8600 0.1491 0.5188 -0.8461 0.1219 0.5394 -0.8356 0.1045 0.3134 -0.9272 0.2054 0.3064 -0.9377 0.1637 0.3304 -0.9231 0.1967 0.3311 -0.9200 0.2098 0.3311 -0.9200 0.2098 0.3644 -0.9130 0.1835 0.4040 -0.8974 0.1774 0.4264 -0.8855 0.1846 0.4264 -0.8855 0.1846 0.4557 -0.8731 0.1736 0.4557 -0.8731 0.1736 0.4773 -0.8649 0.1555 0.4702 -0.8697 0.1500 0.4773 -0.8649 0.1555 0.4702 -0.8697 0.1500 0.4880 -0.8600 0.1492 0.1463 -0.9618 0.2312 0.1463 -0.9618 0.2312 0.1411 -0.9657 0.2180 0.1411 -0.9657 0.2180 0.1749 -0.9834 -0.0479 0.1749 -0.9834 -0.0479 0.2176 -0.5216 -0.8250 0.2176 -0.5215 -0.8250 0.2231 -0.5269 -0.8201 0.2230 -0.5268 -0.8202 0.2114 -0.5337 -0.8188 0.2114 -0.5337 -0.8188 0.2039 -0.5369 -0.8186 0.2040 -0.5369 -0.8186 0.1934 -0.5415 -0.8181 0.1934 -0.5415 -0.8181 0.1875 -0.5442 -0.8177 0.1875 -0.5442 -0.8178 0.1786 -0.5506 -0.8154 0.1786 -0.5506 -0.8155 0.1886 -0.5566 -0.8091 0.1886 -0.5565 -0.8092 0.1982 -0.5593 -0.8049 0.1982 -0.5592 -0.8050 0.2095 -0.5357 -0.8180 0.1870 -0.5471 -0.8159 0.2036 -0.5410 -0.8160 0.2036 -0.5410 -0.8160 0.2212 -0.5650 -0.7949 0.1851 -0.5587 -0.8084 0.1851 -0.5587 -0.8084 0.1764 -0.5561 -0.8122 0.1764 -0.5561 -0.8122 0.1784 -0.5589 -0.8098 0.1784 -0.5588 -0.8099 0.1698 -0.5616 -0.8098 0.1698 -0.5616 -0.8098 0.1808 -0.5626 -0.8068 0.1808 -0.5626 -0.8068 0.1670 -0.5706 -0.8041 0.1670 -0.5705 -0.8041 0.1700 -0.5715 -0.8028 0.1701 -0.5714 -0.8028 0.1644 -0.5753 -0.8013 0.1643 -0.5752 -0.8013 0.1601 -0.5841 -0.7958 0.1602 -0.5840 -0.7958 0.1730 -0.5803 -0.7958 0.1731 -0.5803 -0.7958 0.1668 -0.5870 -0.7923 0.1667 -0.5871 -0.7922 0.1717 -0.5880 -0.7905 0.1717 -0.5880 -0.7904 0.1675 -0.5933 -0.7874 0.1675 -0.5933 -0.7874 0.1653 -0.5919 -0.7889 0.1653 -0.5920 -0.7888 0.1703 -0.5945 -0.7859 0.1702 -0.5945 -0.7859 0.1606 -0.5900 -0.7913 0.1605 -0.5900 -0.7913 0.1588 -0.5936 -0.7890 0.1588 -0.5936 -0.7890 0.1586 -0.5963 -0.7869 0.1585 -0.5964 -0.7868 0.1574 -0.6007 -0.7838 0.1574 -0.6007 -0.7838 0.1610 -0.6017 -0.7823 0.1610 -0.6017 -0.7823 0.1639 -0.6068 -0.7777 0.1639 -0.6069 -0.7777 0.1717 -0.6076 -0.7755 0.1717 -0.6076 -0.7755 0.1663 -0.6085 -0.7759 0.1663 -0.6085 -0.7759 0.1602 -0.6115 -0.7749 0.1601 -0.6115 -0.7749 0.1615 -0.6162 -0.7709 0.1614 -0.6162 -0.7709 0.1686 -0.6196 -0.7666 0.1685 -0.6196 -0.7666 0.1634 -0.6233 -0.7647 0.1634 -0.6233 -0.7647 0.1694 -0.6300 -0.7579 0.1693 -0.6301 -0.7578 0.1631 -0.6318 -0.7578 0.1631 -0.6318 -0.7578 0.1601 -0.5926 -0.7894 0.1601 -0.5926 -0.7894 0.1665 -0.6336 -0.7555 0.1665 -0.6336 -0.7555 0.1635 -0.6382 -0.7523 0.1635 -0.6382 -0.7523 0.1751 -0.6364 -0.7512 0.1750 -0.6365 -0.7512 0.1711 -0.6410 -0.7482 0.1711 -0.6410 -0.7482 0.1807 -0.6446 -0.7429 0.1807 -0.6446 -0.7429 0.1642 -0.6394 -0.7512 0.1641 -0.6394 -0.7511 0.1681 -0.6382 -0.7513 0.1681 -0.6382 -0.7513 0.1703 -0.6466 -0.7436 0.1703 -0.6466 -0.7436 0.1716 -0.6489 -0.7413 0.1717 -0.6490 -0.7412 0.1744 -0.6489 -0.7406 0.1744 -0.6489 -0.7406 0.1849 -0.6548 -0.7328 0.1849 -0.6548 -0.7328 0.1821 -0.6551 -0.7333 0.1821 -0.6552 -0.7332 0.1787 -0.6699 -0.7206 0.1786 -0.6700 -0.7205 0.1842 -0.6732 -0.7161 0.1842 -0.6733 -0.7161 0.1866 -0.6723 -0.7164 0.1866 -0.6723 -0.7164 0.1924 -0.6679 -0.7190 0.1924 -0.6679 -0.7190 0.1961 -0.6696 -0.7164 0.1961 -0.6696 -0.7163 0.1917 -0.6716 -0.7156 0.1917 -0.6717 -0.7156 0.1913 -0.6735 -0.7140 0.1913 -0.6735 -0.7140 0.1934 -0.6756 -0.7114 0.1934 -0.6757 -0.7114 0.1965 -0.6757 -0.7105 0.1964 -0.6758 -0.7105 0.1890 -0.6763 -0.7120 0.1889 -0.6763 -0.7120 0.1900 -0.6773 -0.7108 0.1899 -0.6774 -0.7107 0.1912 -0.6805 -0.7074 0.1911 -0.6805 -0.7074 0.1970 -0.6796 -0.7067 0.1969 -0.6797 -0.7066 0.1899 -0.6834 -0.7049 0.1899 -0.6835 -0.7049 0.1821 -0.6844 -0.7060 0.1821 -0.6844 -0.7060 0.1884 -0.6855 -0.7033 0.1884 -0.6854 -0.7033 0.1864 -0.6863 -0.7031 0.1864 -0.6863 -0.7030 0.1922 -0.6830 -0.7047 0.1921 -0.6830 -0.7047 0.1986 -0.6821 -0.7037 0.1986 -0.6821 -0.7037 0.2035 -0.6783 -0.7061 0.2035 -0.6783 -0.7061 0.1903 -0.6871 -0.7012 0.1903 -0.6871 -0.7012 0.1959 -0.6851 -0.7016 0.1958 -0.6851 -0.7016 0.1972 -0.6862 -0.7001 0.1972 -0.6863 -0.7001 0.1925 -0.6894 -0.6983 0.1925 -0.6895 -0.6983 0.1967 -0.6878 -0.6987 0.1967 -0.6878 -0.6987 0.1992 -0.6887 -0.6972 0.1992 -0.6887 -0.6971 0.1986 -0.6922 -0.6939 0.1985 -0.6922 -0.6939 0.1896 -0.6985 -0.6901 0.1896 -0.6985 -0.6901 0.2091 -0.7008 -0.6820 0.2090 -0.7009 -0.6820 0.2074 -0.7058 -0.6774 0.2074 -0.7058 -0.6774 0.2101 -0.7060 -0.6763 0.2100 -0.7061 -0.6763 0.2016 -0.6982 -0.6869 0.2015 -0.6983 -0.6868 0.2505 -0.5203 -0.8164 0.2505 -0.5203 -0.8164 0.2099 -0.5368 -0.8172 0.2095 -0.5357 -0.8180 0.2100 -0.5370 -0.8170 0.2099 -0.5368 -0.8172 0.2212 -0.5650 -0.7949 0.2307 -0.5363 -0.8119 0.2100 -0.5370 -0.8170 0.3635 -0.6858 -0.6305 0.3635 -0.6858 -0.6305 0.6316 -0.7752 -0.0100 0.6316 -0.7752 -0.0100 0.6337 -0.7736 -0.0002 0.6337 -0.7736 -0.0002 0.6276 -0.7785 -0.0027 0.6276 -0.7785 -0.0027 0.6352 -0.7723 0.0035 0.6352 -0.7723 0.0035 0.6379 -0.7700 0.0106 0.6379 -0.7700 0.0106 0.6418 -0.7668 0.0113 0.6418 -0.7668 0.0113 0.6442 -0.7649 0.0054 0.6442 -0.7649 0.0054 0.6504 -0.7596 0.0012 0.6504 -0.7596 0.0012 0.6640 -0.7477 -0.0047 0.6378 -0.7695 -0.0319 0.6640 -0.7477 -0.0047 0.6374 -0.7696 0.0381 0.6374 -0.7696 0.0381 0.6199 -0.7845 -0.0178 0.6199 -0.7845 -0.0178 0.6432 -0.6491 -0.4062 0.6432 -0.6491 -0.4062 0.6574 -0.6422 -0.3942 0.6574 -0.6422 -0.3942 0.3330 -0.9173 0.2186 0.3330 -0.9173 0.2186 0.3477 -0.9127 0.2145 0.3477 -0.9127 0.2145 0.3600 -0.9083 0.2132 0.3600 -0.9083 0.2132 0.3885 -0.8984 0.2049 0.3885 -0.8984 0.2049 0.3951 -0.8955 0.2048 0.3951 -0.8955 0.2048 0.4094 -0.8923 0.1902 0.4094 -0.8923 0.1902 0.4196 -0.8840 0.2062 0.4196 -0.8840 0.2062 0.4310 -0.8827 0.1875 0.4310 -0.8827 0.1875 0.4251 -0.8846 0.1919 0.4251 -0.8846 0.1919 0.4750 -0.8597 0.1878 0.4750 -0.8597 0.1878 0.4824 -0.8536 0.1967 0.4824 -0.8536 0.1967 0.4647 -0.8598 0.2118 0.4647 -0.8598 0.2118 0.4697 -0.8530 0.2274 0.4697 -0.8530 0.2274 0.4719 -0.8492 0.2371 0.4719 -0.8492 0.2371 0.4943 -0.8394 0.2259 0.4943 -0.8394 0.2259 0.3444 -0.3470 -0.8724 0.3444 -0.3470 -0.8724 0.3469 -0.3437 -0.8727 0.3469 -0.3437 -0.8727 0.4648 -0.3388 -0.8180 0.4648 -0.3388 -0.8180 0.4916 -0.2568 -0.8321 0.4916 -0.2568 -0.8321 0.4881 -0.2505 -0.8361 0.4881 -0.2505 -0.8361 0.4856 -0.2438 -0.8395 0.4856 -0.2438 -0.8395 0.4769 -0.2370 -0.8464 0.4769 -0.2370 -0.8464 0.4687 -0.2312 -0.8526 0.4687 -0.2312 -0.8526 0.4596 -0.2301 -0.8578 0.4596 -0.2301 -0.8578 0.4512 -0.2333 -0.8614 0.4512 -0.2333 -0.8614 0.8125 -0.4662 -0.3500 0.8125 -0.4662 -0.3500 0.8087 -0.4727 -0.3501 0.8087 -0.4727 -0.3501 0.8714 -0.4902 0.0163 0.8714 -0.4902 0.0163 0.8714 -0.4903 0.0161 0.8714 -0.4903 0.0161 0.2981 -0.5384 -0.7882 0.2980 -0.5383 -0.7883 0.3097 -0.5304 -0.7892 0.3098 -0.5304 -0.7891 0.2981 -0.5402 -0.7869 0.2981 -0.5403 -0.7869 -0.2955 -0.8390 -0.4569 -0.2955 -0.8390 -0.4569 0.1335 -0.8205 -0.5559 0.1335 -0.8205 -0.5559 0.1590 -0.8170 -0.5543 0.1590 -0.8170 -0.5543 0.1574 -0.8822 -0.4438 0.1574 -0.8822 -0.4438 -0.0091 -0.9997 -0.0228 -0.0091 -0.9997 -0.0228 0.0111 -0.9999 -0.0121 0.0111 -0.9999 -0.0121 -0.0045 -1.0000 -0.0085 -0.0045 -1.0000 -0.0085 -0.0261 -0.9997 0.0017 -0.0261 -0.9997 0.0017 -0.0291 -0.9996 -0.0050 -0.0291 -0.9996 -0.0050 -0.0138 -0.9999 -0.0026 -0.0138 -0.9999 -0.0026 0.3373 -0.9032 -0.2655 0.3373 -0.9032 -0.2655 0.1911 -0.6281 -0.7543 0.1912 -0.6282 -0.7541 0.2003 -0.6517 -0.7315 0.2003 -0.6517 -0.7315 0.1855 -0.6062 -0.7733 0.1856 -0.6063 -0.7733 0.1968 -0.6149 -0.7637 0.1967 -0.6149 -0.7637 0.3929 -0.7624 -0.5142 0.3929 -0.7624 -0.5142 0.4951 -0.6699 -0.5533 0.4951 -0.6699 -0.5533 0.6432 -0.6801 -0.3519 0.6432 -0.6801 -0.3519 0.6513 -0.6639 -0.3674 0.6513 -0.6639 -0.3674 0.6642 -0.6513 -0.3669 0.6642 -0.6513 -0.3669 0.6671 -0.6697 -0.3263 0.6671 -0.6697 -0.3263 0.5719 -0.8158 0.0864 0.5719 -0.8158 0.0864 0.0676 -0.2707 -0.9603 0.0804 -0.2715 -0.9591 0.0936 -0.2720 -0.9577 0.1068 -0.2718 -0.9564 0.1255 -0.3065 -0.9436 0.1308 -0.3280 -0.9356 0.1648 -0.3668 -0.9156 0.1874 -0.3780 -0.9066 0.1899 -0.3754 -0.9072 0.1899 -0.3754 -0.9072 0.2123 -0.3810 -0.8999 0.2335 -0.3808 -0.8947 0.2095 -0.3723 -0.9042 0.1855 -0.3582 -0.9150 0.1799 -0.3618 -0.9147 0.1799 -0.3618 -0.9148 0.1571 -0.3449 -0.9254 0.1533 -0.3362 -0.9292 0.2672 -0.0665 -0.9613 0.2635 -0.0779 -0.9615 0.2812 -0.0708 -0.9570 0.2966 -0.0618 -0.9530 0.3225 -0.0555 -0.9449 0.3112 -0.0405 -0.9495 0.3169 -0.0333 -0.9479 0.3169 -0.0333 -0.9479 0.3196 -0.0197 -0.9473 0.3209 -0.0058 -0.9471 0.3174 0.0000 -0.9483 -0.0868 -0.0200 -0.9960 -0.0830 -0.0229 -0.9963 -0.0785 -0.0253 -0.9966 -0.0766 -0.0284 -0.9967 -0.0732 -0.0309 -0.9968 -0.0735 -0.0348 -0.9967 -0.0718 -0.0378 -0.9967 -0.0708 -0.0413 -0.9966 -0.0718 -0.0462 -0.9963 -0.0695 -0.0490 -0.9964 -0.0664 -0.0512 -0.9965 -0.0634 -0.0534 -0.9966 -0.0712 -0.0550 -0.9959 -0.0747 -0.0527 -0.9958 -0.0782 -0.0503 -0.9957 -0.0823 -0.0481 -0.9955 -0.0890 -0.0470 -0.9949 -0.1214 -0.0602 -0.9908 -0.1376 -0.0614 -0.9886 -0.1388 -0.0693 -0.9879 -0.1325 -0.0735 -0.9885 -0.1282 -0.0782 -0.9887 -0.2037 -0.1396 -0.9690 -0.2037 -0.1396 -0.9690 -0.0874 -0.2390 -0.9671 -0.0767 -0.2418 -0.9673 -0.0672 -0.2484 -0.9663 -0.0565 -0.2517 -0.9662 -0.0449 -0.2506 -0.9670 -0.0589 -0.2702 -0.9610 -0.0479 -0.2768 -0.9597 -0.0450 -0.2785 -0.9594 -0.0450 -0.2785 -0.9594 -0.0579 -0.2807 -0.9580 -0.0467 -0.2887 -0.9563 -0.0337 -0.2856 -0.9578 -0.0212 -0.2863 -0.9579 -0.0088 -0.2883 -0.9575 -0.0042 -0.2869 -0.9579 -0.0042 -0.2869 -0.9579 0.0083 -0.2959 -0.9552 0.0206 -0.2891 -0.9571 0.0317 -0.2784 -0.9599 0.0445 -0.2829 -0.9581 0.0556 -0.2754 -0.9597 0.0670 -0.2705 -0.9604 0.0676 -0.2707 -0.9603 0.1308 -0.3280 -0.9356 0.1385 -0.3322 -0.9330 0.1530 -0.3581 -0.9211 0.1648 -0.3668 -0.9156 0.1533 -0.3362 -0.9292 0.1675 -0.3287 -0.9295 0.1580 -0.2939 -0.9427 0.1539 -0.2922 -0.9439 0.1539 -0.2921 -0.9439 0.1464 -0.2601 -0.9544 0.1323 -0.2393 -0.9619 0.1323 -0.2393 -0.9619 0.1165 -0.2331 -0.9655 0.1001 -0.2219 -0.9699 0.0885 -0.2211 -0.9712 0.0763 -0.2168 -0.9732 0.0672 -0.2213 -0.9729 0.0580 -0.2257 -0.9725 0.0514 -0.2376 -0.9700 0.0514 -0.2376 -0.9700 0.0532 -0.2107 -0.9761 0.0619 -0.2068 -0.9764 0.0509 -0.2008 -0.9783 0.0427 -0.2051 -0.9778 0.0346 -0.2116 -0.9767 0.0412 -0.1993 -0.9791 0.0312 -0.1917 -0.9810 0.0242 -0.2017 -0.9791 0.0287 -0.1807 -0.9831 0.0295 -0.1777 -0.9837 0.0295 -0.1777 -0.9837 0.0383 -0.1821 -0.9825 0.0414 -0.1641 -0.9856 0.0454 -0.1526 -0.9873 0.0506 -0.1465 -0.9879 0.0555 -0.1408 -0.9885 0.0592 -0.1332 -0.9893 0.0622 -0.1253 -0.9902 0.0648 -0.1176 -0.9909 0.0629 -0.1039 -0.9926 0.0633 -0.1034 -0.9926 0.0633 -0.1034 -0.9926 0.0724 -0.1077 -0.9915 0.0810 -0.1101 -0.9906 0.0875 -0.1086 -0.9902 0.0937 -0.1065 -0.9899 0.0986 -0.1027 -0.9898 0.1022 -0.0977 -0.9900 0.1129 -0.0990 -0.9887 0.1197 -0.0962 -0.9881 0.1273 -0.0935 -0.9875 0.1334 -0.0894 -0.9870 0.1398 -0.0853 -0.9865 0.1404 -0.0847 -0.9865 0.1404 -0.0846 -0.9865 0.1474 -0.0804 -0.9858 0.1596 -0.0954 -0.9826 0.1532 -0.1008 -0.9830 0.1541 -0.1112 -0.9818 0.1780 -0.1190 -0.9768 0.1890 -0.1149 -0.9752 0.2019 -0.1114 -0.9731 0.2121 -0.1055 -0.9715 0.2121 -0.1055 -0.9715 0.2201 -0.0978 -0.9706 0.2257 -0.0889 -0.9701 0.2318 -0.0799 -0.9695 0.2527 -0.0762 -0.9645 0.2651 -0.0679 -0.9618 0.2672 -0.0665 -0.9613 0.1385 -0.3322 -0.9330 0.1529 -0.3581 -0.9211 -0.0992 0.0000 -0.9951 -0.0958 -0.0041 -0.9954 -0.0965 -0.0082 -0.9953 -0.0961 -0.0099 -0.9953 -0.0961 -0.0099 -0.9953 -0.0939 -0.0139 -0.9955 -0.0913 -0.0175 -0.9957 -0.0868 -0.0200 -0.9960 -0.1282 -0.0782 -0.9887 -0.1345 -0.0900 -0.9868 -0.1528 -0.0939 -0.9838 -0.1605 -0.0893 -0.9830 -0.1686 -0.0845 -0.9820 -0.1782 -0.0800 -0.9807 -0.1949 -0.0781 -0.9777 -0.1979 -0.0796 -0.9770 -0.1979 -0.0796 -0.9770 -0.2038 -0.0921 -0.9747 -0.1969 -0.0995 -0.9754 -0.1882 -0.1055 -0.9765 -0.1844 -0.1141 -0.9762 -0.1860 -0.1263 -0.9744 -0.1985 -0.1227 -0.9724 -0.1938 -0.1318 -0.9722 -0.1998 -0.1482 -0.9686 -0.1989 -0.1519 -0.9682 -0.1989 -0.1519 -0.9682 -0.1928 -0.1610 -0.9679 -0.1904 -0.1734 -0.9663 -0.1887 -0.1871 -0.9640 -0.1786 -0.1931 -0.9648 -0.1694 -0.1999 -0.9650 -0.1620 -0.2089 -0.9644 -0.1593 -0.2114 -0.9643 -0.1593 -0.2114 -0.9643 -0.1497 -0.2176 -0.9645 -0.1400 -0.2237 -0.9645 -0.1308 -0.2305 -0.9642 -0.1214 -0.2374 -0.9638 -0.1149 -0.2505 -0.9613 -0.0992 -0.2416 -0.9653 -0.0874 -0.2390 -0.9671 -0.1889 -0.1180 -0.9749 -0.1889 -0.1180 -0.9749 -0.0042 -0.2989 -0.9543 -0.0042 -0.2989 -0.9543 0.0796 -0.2817 -0.9562 0.0796 -0.2817 -0.9562 0.0821 -0.2773 -0.9573 0.0821 -0.2773 -0.9573 0.1432 -0.3500 -0.9257 0.1432 -0.3500 -0.9257 0.1356 -0.3572 -0.9241 0.1356 -0.3572 -0.9241 0.1583 -0.3694 -0.9157 0.1583 -0.3694 -0.9157 0.1653 -0.3740 -0.9126 0.1653 -0.3740 -0.9126 0.1891 -0.3800 -0.9054 0.1891 -0.3800 -0.9054 0.1857 -0.3850 -0.9040 0.1857 -0.3850 -0.9040 0.1985 -0.3833 -0.9020 0.1985 -0.3833 -0.9020 0.2218 -0.4025 -0.8881 0.2218 -0.4025 -0.8881 0.2314 -0.3992 -0.8872 0.2314 -0.3992 -0.8872 0.2342 -0.4004 -0.8859 0.2342 -0.4004 -0.8859 0.2382 -0.3996 -0.8852 0.2382 -0.3996 -0.8852 0.2404 -0.3997 -0.8845 0.2404 -0.3997 -0.8845 0.2736 -0.3957 -0.8767 0.2736 -0.3957 -0.8767 0.2817 -0.3897 -0.8768 0.2817 -0.3897 -0.8768 0.2504 -0.3757 -0.8923 0.2504 -0.3757 -0.8923 0.2475 -0.3727 -0.8944 0.2475 -0.3727 -0.8944 0.2488 -0.3688 -0.8956 0.2488 -0.3688 -0.8956 0.2289 -0.3657 -0.9021 0.2289 -0.3657 -0.9021 0.2312 -0.3626 -0.9028 0.2312 -0.3626 -0.9028 0.2123 -0.3607 -0.9082 0.2123 -0.3607 -0.9082 0.3308 -0.0347 -0.9431 0.3308 -0.0347 -0.9431 0.3343 -0.0159 -0.9423 0.3343 -0.0159 -0.9423 0.3245 -0.0157 -0.9457 0.3245 -0.0157 -0.9457 -0.0561 -0.2929 -0.9545 -0.0561 -0.2929 -0.9545 -0.0661 -0.2990 -0.9520 -0.0533 -0.3027 -0.9516 -0.0400 -0.3044 -0.9517 -0.0524 -0.2984 -0.9530 -0.0661 -0.2989 -0.9520 -0.0661 -0.2990 -0.9520 -0.0019 -0.2916 -0.9565 -0.0019 -0.2916 -0.9565 0.0577 -0.2795 -0.9584 0.0577 -0.2795 -0.9584 0.0545 -0.2855 -0.9568 0.0545 -0.2855 -0.9568 0.0752 -0.3137 -0.9465 0.0909 -0.3190 -0.9434 0.0752 -0.3137 -0.9465 0.0846 -0.3292 -0.9405 0.0846 -0.3292 -0.9405 0.1031 -0.3306 -0.9381 0.1031 -0.3306 -0.9381 0.0895 -0.2839 -0.9547 0.0803 -0.2976 -0.9513 0.0961 -0.3046 -0.9476 0.1123 -0.3405 -0.9335 0.1227 -0.3254 -0.9376 0.1161 -0.2894 -0.9502 0.0994 -0.2804 -0.9547 0.0895 -0.2839 -0.9547 0.2373 -0.3707 -0.8979 0.2373 -0.3707 -0.8979 0.1762 -0.3170 -0.9319 0.1762 -0.3170 -0.9319 0.1622 -0.3073 -0.9377 0.1622 -0.3073 -0.9377 0.1603 -0.2901 -0.9435 0.1603 -0.2901 -0.9435 0.1590 -0.2835 -0.9457 0.1590 -0.2835 -0.9457 0.0567 -0.1722 -0.9834 0.0690 -0.1838 -0.9805 0.0567 -0.1722 -0.9834 0.0739 -0.1417 -0.9872 0.0700 -0.1495 -0.9863 0.0784 -0.1502 -0.9856 0.0739 -0.1417 -0.9872 0.0951 -0.1259 -0.9875 0.1137 -0.1395 -0.9837 0.1350 -0.1543 -0.9788 0.1443 -0.1513 -0.9779 0.1454 -0.1399 -0.9794 0.1167 -0.1176 -0.9862 0.1092 -0.1200 -0.9868 0.1024 -0.1229 -0.9871 0.0958 -0.1255 -0.9875 0.0951 -0.1259 -0.9875 0.1554 -0.1205 -0.9805 0.1508 -0.1278 -0.9803 0.1558 -0.1208 -0.9804 0.1554 -0.1205 -0.9805 0.2450 -0.0906 -0.9653 0.2450 -0.0906 -0.9653 -0.0759 -0.2800 -0.9570 -0.0759 -0.2800 -0.9570 0.2224 -0.3958 -0.8910 0.2224 -0.3958 -0.8910 0.1633 -0.3004 -0.9397 0.1633 -0.3004 -0.9397 0.1503 -0.2652 -0.9524 0.1503 -0.2652 -0.9524 -0.1642 -0.0625 -0.9844 -0.1691 -0.0562 -0.9840 -0.1717 -0.0654 -0.9830 -0.1642 -0.0625 -0.9844 -0.1914 -0.1140 -0.9749 -0.1914 -0.1140 -0.9749 -0.1805 -0.1979 -0.9635 -0.1805 -0.1979 -0.9635 -0.1745 -0.2014 -0.9638 -0.1745 -0.2014 -0.9638 -0.1611 -0.2128 -0.9637 -0.1611 -0.2128 -0.9637 -0.1530 -0.2260 -0.9620 -0.1675 -0.2261 -0.9596 -0.1554 -0.2301 -0.9607 -0.1530 -0.2260 -0.9620 -0.1322 -0.2420 -0.9612 -0.1397 -0.2314 -0.9628 -0.1338 -0.2446 -0.9604 -0.1322 -0.2420 -0.9612 -0.1210 -0.2481 -0.9611 -0.1210 -0.2481 -0.9611 0.7357 0.4951 0.4623 0.7357 0.4951 0.4623 0.8072 0.1583 0.5686 0.8072 0.1583 0.5686 0.7274 0.5003 0.4697 0.7274 0.5003 0.4696 0.9888 0.1272 0.0782 0.9888 0.1272 0.0782 0.9882 0.1315 0.0779 0.9882 0.1315 0.0779 0.9875 0.1570 -0.0130 0.9875 0.1570 -0.0130 0.9611 0.2663 -0.0727 0.9611 0.2663 -0.0727 0.9694 0.2232 -0.1022 0.9694 0.2233 -0.1022 0.9502 0.3116 0.0004 0.9502 0.3116 0.0004 0.9499 0.3125 0.0027 0.9499 0.3125 0.0027 0.9439 0.3289 0.0280 0.9439 0.3290 0.0280 0.9341 0.3553 0.0351 0.9341 0.3552 0.0351 0.9185 0.3943 0.0277 0.9185 0.3943 0.0277 0.8738 0.4847 -0.0394 0.8738 0.4847 -0.0394 0.8676 0.4706 -0.1607 0.8676 0.4706 -0.1607 0.8509 0.4882 -0.1938 0.8509 0.4882 -0.1938 0.6820 0.7132 -0.1623 0.6820 0.7132 -0.1623 0.8488 0.5272 -0.0389 0.8488 0.5272 -0.0389 0.8470 0.5301 -0.0389 0.8470 0.5301 -0.0389 0.8432 0.5359 -0.0422 0.8432 0.5360 -0.0422 0.8355 0.5495 0.0013 0.8355 0.5494 0.0013 0.5686 0.8189 -0.0776 0.5686 0.8189 -0.0776 0.6206 0.7676 -0.1604 0.6206 0.7676 -0.1604 0.6206 0.7665 -0.1652 0.6206 0.7665 -0.1652 0.6171 0.7670 -0.1759 0.6171 0.7670 -0.1759 0.5404 0.4170 -0.7308 0.5404 0.4170 -0.7308 0.7473 0.4459 0.4927 0.7473 0.4459 0.4927 0.9927 0.0426 0.1128 0.9927 0.0427 0.1128 0.9839 0.1782 -0.0163 0.9839 0.1782 -0.0164 0.9502 0.3112 -0.0175 0.9502 0.3112 -0.0176 0.9490 0.3118 -0.0469 0.9490 0.3118 -0.0469 0.8713 0.4905 -0.0114 0.8713 0.4905 -0.0114 0.8751 0.4820 -0.0431 0.8751 0.4820 -0.0431 0.8682 0.4678 -0.1654 0.8682 0.4678 -0.1654 0.8753 0.4458 -0.1873 0.8753 0.4459 -0.1873 0.8852 0.4410 -0.1479 0.8852 0.4410 -0.1479 0.7956 0.3944 -0.4599 0.7956 0.3944 -0.4599 0.7832 0.4253 -0.4535 0.7832 0.4253 -0.4535 0.7444 0.4746 -0.4697 0.7444 0.4746 -0.4697 0.8512 0.4900 -0.1881 0.8530 0.4836 -0.1962 0.8530 0.4836 -0.1962 0.8512 0.4899 -0.1882 0.8556 0.4960 -0.1482 0.8556 0.4960 -0.1482 0.7823 0.5626 -0.2672 0.7823 0.5626 -0.2672 0.8337 0.5335 -0.1422 0.8337 0.5335 -0.1422 0.8414 0.5241 -0.1317 0.8414 0.5241 -0.1317 0.8084 0.5869 -0.0450 0.8084 0.5869 -0.0450 0.8099 0.5829 -0.0656 0.8099 0.5829 -0.0656 0.8195 0.5692 -0.0665 0.8186 0.5708 -0.0633 0.8186 0.5708 -0.0633 0.8195 0.5692 -0.0666 0.8671 0.4976 -0.0210 0.8671 0.4976 -0.0210 0.7941 0.6076 -0.0164 0.7941 0.6076 -0.0164 0.7904 0.6125 -0.0142 0.7904 0.6125 -0.0142 0.7813 0.6136 0.1147 0.7813 0.6136 0.1147 0.7836 0.5669 0.2542 0.7836 0.5669 0.2542 0.6530 0.6630 -0.3661 0.6530 0.6630 -0.3661 0.6718 0.3532 0.6511 0.6718 0.3532 0.6511 0.7050 0.3380 0.6235 0.7050 0.3380 0.6235 0.7110 0.3590 0.6046 0.7110 0.3590 0.6046 0.7184 0.3515 0.6003 0.7184 0.3515 0.6003 0.7189 0.3579 0.5959 0.7189 0.3579 0.5959 0.7143 0.3710 0.5934 0.7143 0.3710 0.5934 0.7260 0.3701 0.5797 0.7260 0.3701 0.5797 0.5882 0.7808 0.2106 0.5882 0.7808 0.2106 0.5849 0.7834 0.2100 0.5849 0.7834 0.2100 0.5352 0.7893 0.3010 0.5352 0.7893 0.3010 0.7225 0.5199 0.4558 0.7225 0.5199 0.4558 0.7227 0.5316 0.4416 0.7227 0.5316 0.4416 0.7237 0.5357 0.4351 0.7237 0.5357 0.4351 0.7248 0.5358 0.4332 0.7248 0.5358 0.4332 0.7229 0.5409 0.4299 0.7229 0.5409 0.4299 0.7233 0.5462 0.4225 0.7233 0.5462 0.4225 0.7215 0.5425 0.4304 0.7215 0.5425 0.4304 0.7216 0.5418 0.4310 0.7216 0.5418 0.4310 0.7213 0.5410 0.4325 0.7213 0.5410 0.4325 0.7223 0.5402 0.4318 0.7223 0.5402 0.4318 0.6738 0.4033 0.6191 0.6738 0.4033 0.6191 0.6727 0.4111 0.6152 0.6727 0.4111 0.6152 0.6614 0.4898 0.5681 0.6614 0.4898 0.5681 0.6826 0.4890 0.5431 0.6830 0.4897 0.5419 0.6830 0.4897 0.5419 0.6836 0.4900 0.5410 0.6836 0.4900 0.5410 0.6841 0.4898 0.5405 0.6841 0.4898 0.5405 0.6826 0.4890 0.5431 0.6915 0.4946 0.5264 0.6915 0.4946 0.5264 0.6072 0.5769 0.5463 0.6072 0.5769 0.5463 0.6027 0.5645 0.5641 0.6027 0.5645 0.5641 0.1699 0.7706 -0.6142 0.1699 0.7706 -0.6142 0.1684 0.7618 -0.6255 0.1684 0.7618 -0.6255 0.2312 0.6128 -0.7557 0.2312 0.6128 -0.7557 -0.6055 0.0693 0.7928 -0.6055 0.0693 0.7928 -0.6135 0.0253 0.7893 -0.6135 0.0253 0.7893 -0.6203 0.0141 0.7842 -0.6203 0.0141 0.7842 -0.6157 0.0158 0.7878 -0.6157 0.0158 0.7878 -0.6154 0.0036 0.7882 -0.6154 0.0036 0.7882 0.2525 0.0869 0.9637 0.2525 0.0869 0.9637 0.1736 0.0870 0.9810 0.1736 0.0870 0.9810 0.1423 0.0927 0.9855 0.1423 0.0927 0.9855 0.1589 0.0526 0.9859 0.1589 0.0526 0.9859 0.1920 0.0360 0.9807 0.1920 0.0360 0.9807 0.5509 0.2177 0.8057 0.5509 0.2177 0.8057 0.5453 0.2157 0.8100 0.5453 0.2157 0.8100 0.5764 0.6756 0.4597 0.5764 0.6756 0.4597 0.5298 0.7398 0.4147 0.5298 0.7398 0.4147 0.5325 0.7392 0.4123 0.5325 0.7392 0.4123 0.5337 0.7387 0.4117 0.5337 0.7387 0.4117 0.5527 0.7241 0.4125 0.5527 0.7241 0.4125 0.5782 0.6446 0.5002 0.5782 0.6446 0.5002 0.5346 0.7143 0.4517 0.5346 0.7143 0.4517 0.5262 0.7233 0.4471 0.5262 0.7233 0.4471 0.4935 0.7429 0.4523 0.4935 0.7429 0.4523 0.4917 0.7421 0.4556 0.4917 0.7421 0.4556 0.3500 0.8434 0.4076 0.3500 0.8434 0.4076 0.1521 0.9499 0.2729 0.1522 0.9499 0.2729 0.0305 0.9271 0.3737 0.0305 0.9271 0.3737 0.0216 0.9277 0.3728 0.0216 0.9277 0.3728 0.2850 0.9568 0.0574 0.2850 0.9568 0.0574 0.2922 0.9532 0.0774 0.2922 0.9532 0.0774 0.2941 0.9544 0.0518 0.2941 0.9544 0.0518 0.3176 0.9411 -0.1158 0.3176 0.9411 -0.1158 0.3181 0.9419 -0.1079 0.3181 0.9419 -0.1079 0.3149 0.9431 -0.1067 0.3149 0.9431 -0.1067 0.3040 0.9481 -0.0928 0.3040 0.9481 -0.0928 0.3042 0.9480 -0.0934 0.3042 0.9480 -0.0934 0.3083 0.9469 -0.0912 0.3083 0.9469 -0.0912 0.3099 0.9463 -0.0915 0.3099 0.9463 -0.0915 0.3120 0.9456 -0.0921 0.3120 0.9456 -0.0921 0.3114 0.9455 -0.0948 0.3114 0.9455 -0.0948 -0.0207 0.9233 0.3835 -0.0207 0.9233 0.3835 -0.0184 0.9221 0.3866 -0.0184 0.9221 0.3866 -0.0090 0.9266 0.3759 -0.0090 0.9266 0.3759 0.0195 0.9128 0.4080 0.0195 0.9128 0.4080 -0.0150 0.9255 0.3785 -0.0150 0.9254 0.3786 -0.0314 0.9282 0.3706 -0.0314 0.9282 0.3706 -0.0529 0.9761 0.2110 -0.0529 0.9761 0.2110 -0.2205 0.9547 0.1998 -0.2205 0.9547 0.1998 -0.2342 0.9549 0.1825 -0.2342 0.9549 0.1825 -0.2501 0.9457 0.2078 -0.2501 0.9457 0.2078 -0.2692 0.9358 0.2274 -0.2693 0.9358 0.2274 -0.2667 0.9352 0.2331 -0.2667 0.9352 0.2330 -0.2299 0.9597 0.1618 -0.2300 0.9596 0.1618 -0.2734 0.9469 0.1693 -0.2734 0.9469 0.1692 -0.2801 0.9432 0.1786 -0.2801 0.9432 0.1787 -0.2855 0.9405 0.1845 -0.2856 0.9405 0.1844 -0.2862 0.9406 0.1825 -0.2863 0.9406 0.1825 -0.2903 0.9395 0.1816 -0.2903 0.9395 0.1816 -0.3235 0.9223 0.2117 -0.3235 0.9222 0.2117 -0.3243 0.9214 0.2141 -0.3243 0.9214 0.2141 -0.3640 0.8851 0.2900 -0.3640 0.8851 0.2900 -0.3639 0.8848 0.2910 -0.3639 0.8848 0.2910 -0.3635 0.8848 0.2916 -0.3635 0.8848 0.2916 -0.3631 0.8849 0.2918 -0.3631 0.8849 0.2918 -0.3553 0.8907 0.2836 -0.3553 0.8907 0.2836 -0.3526 0.8915 0.2843 -0.3526 0.8915 0.2843 -0.2649 0.9323 0.2464 -0.2648 0.9323 0.2463 -0.3770 0.8447 0.3800 -0.3770 0.8447 0.3799 -0.3794 0.8440 0.3792 -0.3794 0.8440 0.3792 -0.3051 0.8820 0.3592 -0.3051 0.8820 0.3593 -0.3288 0.8741 0.3576 -0.3288 0.8741 0.3576 -0.3483 0.8618 0.3687 -0.3483 0.8618 0.3688 -0.3576 0.8575 0.3699 -0.3577 0.8575 0.3698 -0.3604 0.8558 0.3709 -0.3606 0.8558 0.3709 -0.3678 0.8505 0.3759 -0.3678 0.8506 0.3759 -0.3663 0.8452 0.3893 -0.3663 0.8452 0.3892 -0.4180 0.8164 0.3984 -0.4181 0.8164 0.3983 -0.4222 0.8121 0.4028 -0.4221 0.8121 0.4028 -0.4475 0.7845 0.4293 -0.4475 0.7845 0.4293 -0.4384 0.7840 0.4395 -0.4384 0.7840 0.4395 -0.4561 0.7551 0.4710 -0.4560 0.7551 0.4710 -0.4618 0.7420 0.4860 -0.4618 0.7419 0.4861 -0.4620 0.7358 0.4952 -0.4620 0.7357 0.4953 -0.4634 0.7324 0.4989 -0.4633 0.7324 0.4990 -0.4567 0.7357 0.5002 -0.4567 0.7357 0.5002 -0.4602 0.7288 0.5070 -0.4602 0.7288 0.5070 -0.4500 0.7258 0.5203 -0.4500 0.7258 0.5203 -0.4191 0.7344 0.5339 -0.4191 0.7344 0.5339 -0.4071 0.7419 0.5328 -0.4071 0.7419 0.5328 -0.4049 0.7494 0.5240 -0.4049 0.7493 0.5240 -0.4013 0.7550 0.5186 -0.4014 0.7549 0.5187 -0.3874 0.7748 0.4996 -0.3875 0.7747 0.4996 -0.3814 0.7796 0.4967 -0.3814 0.7796 0.4967 -0.4195 0.7624 0.4927 -0.4196 0.7623 0.4928 -0.4211 0.7612 0.4932 -0.4211 0.7612 0.4932 -0.4309 0.7398 0.5167 -0.4309 0.7398 0.5167 -0.4274 0.7388 0.5211 -0.4274 0.7388 0.5211 -0.3918 0.7397 0.5471 -0.3918 0.7397 0.5471 -0.4030 0.6592 0.6348 -0.4030 0.6593 0.6348 -0.4106 0.6614 0.6276 -0.4107 0.6614 0.6276 -0.4152 0.6546 0.6318 -0.4154 0.6546 0.6316 -0.4181 0.6517 0.6328 -0.4182 0.6517 0.6328 -0.4189 0.6515 0.6325 -0.4190 0.6515 0.6324 -0.4205 0.6466 0.6364 -0.4206 0.6466 0.6364 -0.4413 0.6321 0.6369 -0.4413 0.6322 0.6369 -0.4474 0.6417 0.6229 -0.4474 0.6417 0.6229 -0.4676 0.6369 0.6129 -0.4677 0.6369 0.6129 -0.4685 0.6372 0.6119 -0.4685 0.6373 0.6118 -0.4722 0.6372 0.6091 -0.4723 0.6372 0.6090 -0.4765 0.6469 0.5954 -0.4765 0.6469 0.5954 -0.4824 0.6603 0.5755 -0.4824 0.6604 0.5755 -0.4828 0.6627 0.5725 -0.4828 0.6627 0.5725 -0.4827 0.6644 0.5706 -0.4828 0.6644 0.5705 -0.4830 0.6652 0.5694 -0.4831 0.6651 0.5694 -0.4986 0.6564 0.5662 -0.4986 0.6564 0.5662 -0.5045 0.6512 0.5670 -0.5046 0.6511 0.5669 -0.5043 0.6500 0.5685 -0.5044 0.6500 0.5684 -0.5194 0.5993 0.6091 -0.5196 0.5993 0.6090 -0.4843 0.7903 0.3753 -0.4843 0.7903 0.3753 -0.4304 0.8024 0.4134 -0.4305 0.8024 0.4134 -0.4476 0.7782 0.4406 -0.4476 0.7782 0.4406 -0.4480 0.7774 0.4415 -0.4480 0.7774 0.4416 -0.5586 0.6153 0.5563 -0.5587 0.6153 0.5562 -0.5600 0.6126 0.5578 -0.5600 0.6127 0.5577 -0.5595 0.6096 0.5616 -0.5595 0.6096 0.5615 -0.6255 0.5380 0.5651 -0.6256 0.5381 0.5649 -0.6324 0.5379 0.5575 -0.6325 0.5379 0.5573 -0.5790 0.4234 0.6968 -0.5791 0.4233 0.6968 -0.5522 0.5898 0.5893 -0.5522 0.5898 0.5892 -0.5518 0.5913 0.5881 -0.5520 0.5912 0.5881 -0.5519 0.5899 0.5895 -0.5519 0.5900 0.5893 -0.5451 0.6441 0.5367 -0.5451 0.6441 0.5367 -0.5452 0.6473 0.5327 -0.5452 0.6472 0.5328 -0.5434 0.6551 0.5250 -0.5434 0.6550 0.5251 -0.5657 0.6741 0.4749 -0.5657 0.6741 0.4750 -0.5569 0.6831 0.4724 -0.5570 0.6830 0.4724 -0.5358 0.7179 0.4444 -0.5360 0.7178 0.4444 -0.6502 0.5453 0.5291 -0.6502 0.5453 0.5291 -0.4887 0.5442 0.6820 -0.4887 0.5442 0.6819 -0.1816 0.5679 0.8028 -0.1818 0.5678 0.8028 -0.4303 0.3923 0.8130 -0.4302 0.3922 0.8131 -0.4309 0.3918 0.8129 -0.4309 0.3918 0.8129 -0.4478 0.2538 0.8573 -0.4478 0.2538 0.8574 -0.5823 0.2795 0.7634 -0.5823 0.2795 0.7634 -0.5739 0.2622 0.7758 -0.5739 0.2621 0.7759 -0.5617 0.1252 0.8178 -0.5617 0.1251 0.8178 -0.3333 0.1124 0.9361 -0.3333 0.1123 0.9361 -0.3414 0.1148 0.9329 -0.3414 0.1148 0.9329 -0.2356 0.2124 0.9484 -0.2356 0.2124 0.9484 -0.1969 0.1211 0.9729 -0.1968 0.1211 0.9729 -0.1843 0.2349 0.9544 -0.1842 0.2349 0.9544 -0.1808 0.2372 0.9545 -0.1808 0.2371 0.9545 -0.1825 0.2312 0.9556 -0.1825 0.2312 0.9556 -0.1568 0.2479 0.9560 -0.1568 0.2478 0.9560 -0.2972 0.3780 0.8768 -0.2972 0.3780 0.8768 -0.1446 0.2534 0.9565 -0.1445 0.2534 0.9565 0.0309 0.2401 0.9703 0.0309 0.2401 0.9703 0.0135 0.2587 0.9659 0.0134 0.2587 0.9659 0.1375 0.3746 0.9169 0.1376 0.3744 0.9170 0.0899 0.1484 0.9848 0.0899 0.1484 0.9848 0.0965 0.1418 0.9852 0.0964 0.1418 0.9852 0.1040 0.1346 0.9854 0.1038 0.1345 0.9855 0.0780 0.1355 0.9877 0.0779 0.1355 0.9877 0.0846 0.1350 0.9872 0.0846 0.1351 0.9872 0.0863 0.1284 0.9880 0.0862 0.1284 0.9880 0.0937 0.1290 0.9872 0.0937 0.1290 0.9872 0.0914 0.1329 0.9869 0.0913 0.1329 0.9869 0.0864 0.1260 0.9883 0.0863 0.1259 0.9883 0.0811 0.1241 0.9889 0.0811 0.1241 0.9889 0.0764 0.1219 0.9896 0.0764 0.1219 0.9896 0.0675 0.1279 0.9895 0.0674 0.1278 0.9895 0.3821 0.2708 0.8835 0.3821 0.2707 0.8836 0.4742 0.1977 0.8579 0.4742 0.1978 0.8579 0.5882 0.3607 0.7238 0.5882 0.3607 0.7238 0.5843 0.3743 0.7201 0.5843 0.3743 0.7201 0.4853 0.5858 0.6490 0.4853 0.5858 0.6490 0.4148 0.5516 0.7237 0.4148 0.5516 0.7237 0.4528 0.5419 0.7080 0.4528 0.5419 0.7080 0.4662 0.6205 0.6306 0.4662 0.6205 0.6306 -0.0353 0.9196 0.3913 -0.0353 0.9196 0.3913 0.2087 0.9558 0.2072 0.2086 0.9558 0.2072 0.2294 0.9369 0.2639 0.2294 0.9369 0.2639 0.1370 0.9461 0.2933 0.1370 0.9462 0.2933 0.1076 0.9229 0.3697 0.1076 0.9229 0.3697 0.1169 0.9063 0.4062 0.1168 0.9063 0.4062 0.2290 0.8815 0.4129 0.2289 0.8815 0.4129 0.1975 0.8317 0.5189 0.1976 0.8317 0.5189 0.2195 0.7952 0.5652 0.2194 0.7952 0.5652 0.1653 0.8127 0.5588 0.1654 0.8128 0.5586 0.1524 0.9786 0.1386 0.1525 0.9786 0.1384 0.1473 0.9810 0.1261 0.1473 0.9810 0.1260 -0.2089 0.9341 0.2896 -0.2089 0.9341 0.2896 -0.2448 0.7136 0.6564 -0.2449 0.7137 0.6563 -0.2436 0.7151 0.6552 -0.2437 0.7150 0.6552 -0.2936 0.7000 0.6510 -0.2936 0.7000 0.6510 -0.3314 0.6858 0.6479 -0.3314 0.6859 0.6479 -0.3569 0.7251 0.5890 -0.3569 0.7252 0.5889 -0.3751 0.7312 0.5697 -0.3753 0.7312 0.5697 -0.3457 0.6768 0.6499 -0.3458 0.6768 0.6499 -0.3271 0.6497 0.6862 -0.3272 0.6497 0.6862 -0.3249 0.6210 0.7133 -0.3249 0.6210 0.7133 -0.4193 0.6145 0.6683 -0.4194 0.6146 0.6681 -0.3982 0.5811 0.7098 -0.3982 0.5812 0.7097 -0.4532 0.5589 0.6944 -0.4532 0.5590 0.6944 -0.4332 0.5781 0.6915 -0.4331 0.5784 0.6913 -0.3000 0.6939 0.6546 -0.3001 0.6941 0.6544 -0.3792 0.8305 0.4080 -0.3792 0.8305 0.4080 -0.3272 0.8113 0.4845 -0.3272 0.8113 0.4845 -0.3384 0.8044 0.4882 -0.3384 0.8043 0.4884 -0.3423 0.7972 0.4973 -0.3423 0.7972 0.4973 -0.3521 0.7923 0.4983 -0.3521 0.7923 0.4983 -0.3547 0.7908 0.4989 -0.3545 0.7908 0.4990 -0.3531 0.7889 0.5030 -0.3530 0.7888 0.5031 -0.3589 0.7848 0.5053 -0.3589 0.7848 0.5053 -0.3568 0.7879 0.5018 -0.3568 0.7879 0.5018 -0.3800 0.7792 0.4984 -0.3800 0.7792 0.4984 -0.4179 0.7644 0.4909 -0.4179 0.7644 0.4910 -0.4104 0.7480 0.5216 -0.4104 0.7480 0.5217 -0.3930 0.7568 0.5223 -0.3929 0.7568 0.5224 -0.2023 0.8863 0.4166 -0.2024 0.8862 0.4167 -0.1983 0.8842 0.4230 -0.1984 0.8841 0.4230 -0.1589 0.8851 0.4375 -0.1589 0.8851 0.4375 -0.0088 0.8765 0.4813 -0.0087 0.8765 0.4813 0.1283 0.8515 0.5085 0.1284 0.8514 0.5085 0.1321 0.8504 0.5093 0.1322 0.8504 0.5093 0.1052 0.8461 0.5226 0.1053 0.8461 0.5226 0.0691 0.8554 0.5133 0.0692 0.8554 0.5133 0.0537 0.8574 0.5118 0.0538 0.8574 0.5119 0.0200 0.8504 0.5257 0.0200 0.8504 0.5258 -0.0050 0.8614 0.5079 -0.0049 0.8614 0.5079 -0.0032 0.7566 0.6539 -0.0033 0.7566 0.6539 0.0361 0.7418 0.6696 0.0359 0.7419 0.6696 0.0323 0.6767 0.7355 0.0320 0.6766 0.7357 -0.4389 0.6188 0.6516 -0.4388 0.6189 0.6515 -0.3124 0.5924 0.7426 -0.3122 0.5923 0.7428 -0.1026 0.6142 0.7824 -0.1027 0.6142 0.7824 -0.0378 0.6654 0.7456 -0.0381 0.6654 0.7455 -0.0280 0.6637 0.7474 -0.0282 0.6639 0.7473 -0.0332 0.6509 0.7584 -0.0334 0.6510 0.7584 -0.5878 0.5638 0.5802 -0.5879 0.5638 0.5800 -0.6231 0.5150 0.5887 -0.6234 0.5149 0.5884 -0.4506 0.4285 0.7832 -0.4506 0.4283 0.7833 -0.4693 0.3942 0.7902 -0.4693 0.3940 0.7902 -0.4535 0.3851 0.8038 -0.4535 0.3849 0.8039 -0.2368 0.5662 0.7896 -0.2367 0.5660 0.7897 -0.2233 0.5639 0.7951 -0.2233 0.5638 0.7951 -0.2216 0.5653 0.7945 -0.2216 0.5652 0.7946 -0.4733 0.5189 0.7119 -0.4734 0.5188 0.7119 0.0037 0.6365 0.7713 0.0037 0.6364 0.7713 0.0246 0.6233 0.7816 0.0247 0.6231 0.7818 0.0493 0.6587 0.7508 0.0495 0.6586 0.7508 0.1108 0.5927 0.7978 0.1109 0.5924 0.7979 0.1264 0.5604 0.8185 0.1263 0.5602 0.8187 0.1040 0.6857 0.7204 0.1040 0.6855 0.7206 0.1117 0.6777 0.7268 0.1117 0.6777 0.7268 0.2206 0.7439 0.6308 0.2205 0.7440 0.6307 0.2558 0.7172 0.6483 0.2557 0.7173 0.6482 0.2790 0.6987 0.6588 0.2789 0.6988 0.6587 0.1724 0.5749 0.7998 0.1725 0.5748 0.7999 0.2316 0.5950 0.7696 0.2316 0.5948 0.7698 0.0118 0.3408 0.9401 0.0118 0.3408 0.9401 0.0011 0.3491 0.9371 0.0011 0.3491 0.9371 -0.0005 0.3714 0.9285 -0.0005 0.3714 0.9285 0.3695 0.2778 0.8867 0.3696 0.2779 0.8867 0.3721 0.3004 0.8782 0.3725 0.3005 0.8780 0.3798 0.3079 0.8723 0.3799 0.3080 0.8723 0.3909 0.3041 0.8688 0.3909 0.3042 0.8687 0.4467 0.2717 0.8524 0.4468 0.2718 0.8523 0.4565 0.2399 0.8567 0.4567 0.2399 0.8567 0.3716 0.2473 0.8949 0.3717 0.2474 0.8948 0.3466 0.2159 0.9128 0.3467 0.2159 0.9128 0.3445 0.2077 0.9155 0.3446 0.2079 0.9155 0.3335 0.2072 0.9197 0.3335 0.2072 0.9197 0.3086 0.2024 0.9294 0.3087 0.2024 0.9294 0.3172 0.5246 0.7900 0.3172 0.5246 0.7900 0.5961 0.3470 0.7241 0.5961 0.3470 0.7241 0.5262 0.2357 0.8170 0.5262 0.2357 0.8170 0.5577 0.2660 0.7863 0.5577 0.2660 0.7863 0.5598 0.3969 0.7274 0.5598 0.3969 0.7274 0.3773 0.6196 0.6883 0.3773 0.6196 0.6883 0.5367 0.5367 0.6510 0.5367 0.5367 0.6510 0.5177 0.5483 0.6567 0.5177 0.5483 0.6567 0.1478 0.7057 0.6930 0.1478 0.7057 0.6930 -0.5739 0.5885 0.5694 -0.5746 0.5878 0.5695 -0.1164 0.9706 -0.2107 -0.1164 0.9706 -0.2107 -0.3921 0.9080 -0.1478 -0.3921 0.9080 -0.1478 -0.0898 0.9911 0.0981 -0.0898 0.9911 0.0981 -0.1157 0.9926 0.0378 -0.1157 0.9926 0.0378 -0.1160 0.9926 0.0365 -0.1160 0.9926 0.0364 -0.1488 0.9889 -0.0055 -0.1488 0.9889 -0.0056 -0.1478 0.9890 -0.0080 -0.1478 0.9890 -0.0081 -0.1711 0.9844 -0.0414 -0.1711 0.9844 -0.0415 -0.1770 0.9830 -0.0481 -0.1769 0.9830 -0.0481 -0.1814 0.9819 -0.0535 -0.1814 0.9819 -0.0535 -0.2134 0.9723 -0.0956 -0.2134 0.9723 -0.0956 -0.2371 0.9715 -0.0047 -0.2372 0.9715 -0.0048 -0.2501 0.9682 -0.0061 -0.2501 0.9682 -0.0061 -0.2523 0.9677 0.0000 -0.2523 0.9676 -0.0001 -0.2524 0.9675 0.0135 -0.2523 0.9675 0.0135 -0.2372 0.9714 0.0137 -0.2372 0.9714 0.0136 -0.2337 0.9722 0.0117 -0.2337 0.9722 0.0116 -0.2329 0.9724 0.0157 -0.2329 0.9724 0.0157 -0.2261 0.9740 0.0113 -0.2261 0.9740 0.0113 -0.2237 0.9746 0.0054 -0.2236 0.9747 0.0053 -0.3094 0.9486 0.0671 -0.3093 0.9486 0.0672 -0.3380 0.9410 -0.0180 -0.3380 0.9410 -0.0180 -0.4419 0.8952 -0.0572 -0.4419 0.8952 -0.0573 -0.4633 0.8831 0.0742 -0.4634 0.8830 0.0743 -0.4242 0.8977 -0.1191 -0.4242 0.8977 -0.1191 -0.4583 0.8774 -0.1417 -0.4583 0.8774 -0.1417 -0.4889 0.8594 -0.1495 -0.4889 0.8594 -0.1495 -0.5373 0.8303 -0.1481 -0.5373 0.8303 -0.1481 -0.5420 0.8217 -0.1763 -0.5421 0.8216 -0.1763 -0.5769 0.8044 -0.1417 -0.5769 0.8044 -0.1418 -0.5986 0.7888 -0.1395 -0.5987 0.7887 -0.1395 -0.6024 0.7874 -0.1307 -0.6024 0.7874 -0.1307 -0.6048 0.7836 -0.1421 -0.6049 0.7836 -0.1420 -0.6109 0.7787 -0.1428 -0.6110 0.7787 -0.1428 -0.6210 0.7708 -0.1424 -0.6210 0.7708 -0.1424 -0.6194 0.7754 -0.1230 -0.6195 0.7753 -0.1230 -0.6517 0.7468 -0.1327 -0.6519 0.7466 -0.1326 -0.6488 0.7497 -0.1305 -0.6488 0.7497 -0.1305 -0.6510 0.7480 -0.1291 -0.6511 0.7479 -0.1291 -0.6542 0.7456 -0.1271 -0.6542 0.7455 -0.1271 -0.6593 0.7428 -0.1163 -0.6594 0.7428 -0.1163 -0.5083 0.8518 -0.1264 -0.5084 0.8518 -0.1265 -0.5060 0.8538 -0.1222 -0.5061 0.8538 -0.1223 -0.5777 0.8158 0.0267 -0.5776 0.8159 0.0266 -0.5795 0.8139 0.0407 -0.5795 0.8140 0.0406 -0.5793 0.8137 0.0481 -0.5793 0.8137 0.0480 -0.5986 0.7984 0.0655 -0.5986 0.7984 0.0655 -0.5968 0.7995 0.0681 -0.5968 0.7995 0.0680 -0.5319 0.8468 -0.0059 -0.5319 0.8468 -0.0060 -0.5353 0.8447 -0.0046 -0.5353 0.8446 -0.0046 -0.5465 0.8369 -0.0321 -0.5464 0.8369 -0.0322 -0.5482 0.8358 -0.0314 -0.5482 0.8358 -0.0315 -0.5499 0.8347 -0.0295 -0.5499 0.8347 -0.0295 -0.5500 0.8345 -0.0328 -0.5500 0.8345 -0.0329 -0.5467 0.8364 -0.0381 -0.5467 0.8365 -0.0382 -0.5514 0.8335 -0.0339 -0.5513 0.8336 -0.0339 -0.5509 0.8337 -0.0371 -0.5508 0.8338 -0.0371 -0.5523 0.8329 -0.0336 -0.5523 0.8329 -0.0336 -0.5539 0.8319 -0.0334 -0.5539 0.8319 -0.0335 -0.5542 0.8317 -0.0329 -0.5543 0.8317 -0.0329 -0.5556 0.8308 -0.0326 -0.5555 0.8308 -0.0326 -0.5551 0.8311 -0.0333 -0.5551 0.8311 -0.0333 -0.5557 0.8306 -0.0354 -0.5557 0.8307 -0.0354 -0.5567 0.8300 -0.0340 -0.5568 0.8300 -0.0341 -0.5571 0.8297 -0.0352 -0.5571 0.8297 -0.0353 -0.5502 0.8300 -0.0915 -0.5502 0.8300 -0.0915 -0.5524 0.8281 -0.0954 -0.5525 0.8280 -0.0954 -0.5561 0.8247 -0.1026 -0.5562 0.8247 -0.1027 -0.6037 0.7944 -0.0667 -0.6037 0.7944 -0.0667 -0.6087 0.7913 -0.0570 -0.6088 0.7913 -0.0570 -0.6107 0.7900 -0.0552 -0.6107 0.7899 -0.0551 -0.6142 0.7875 -0.0509 -0.6142 0.7875 -0.0509 -0.6204 0.7818 -0.0614 -0.6205 0.7818 -0.0614 -0.6224 0.7803 -0.0610 -0.6225 0.7802 -0.0609 -0.6401 0.7642 -0.0791 -0.6401 0.7642 -0.0791 -0.6600 0.7481 -0.0691 -0.6600 0.7481 -0.0691 -0.6623 0.7452 -0.0773 -0.6624 0.7452 -0.0774 -0.6634 0.7438 -0.0818 -0.6634 0.7437 -0.0818 -0.6701 0.7360 -0.0961 -0.6701 0.7360 -0.0962 -0.6763 0.7302 -0.0971 -0.6763 0.7302 -0.0972 -0.6935 0.7128 -0.1050 -0.6935 0.7128 -0.1050 -0.6961 0.7096 -0.1095 -0.6961 0.7095 -0.1095 -0.6988 0.7060 -0.1147 -0.6989 0.7060 -0.1148 -0.7014 0.7042 -0.1099 -0.7014 0.7042 -0.1100 -0.6094 0.7926 -0.0205 -0.6095 0.7925 -0.0205 -0.6079 0.7940 0.0021 -0.6079 0.7940 0.0021 -0.6073 0.7944 0.0066 -0.6074 0.7944 0.0065 -0.6079 0.7939 0.0129 -0.6079 0.7939 0.0129 -0.6065 0.7950 0.0149 -0.6065 0.7949 0.0149 -0.6337 0.7736 0.0006 -0.6337 0.7736 0.0006 -0.6512 0.7589 -0.0073 -0.6513 0.7588 -0.0073 -0.6410 0.7673 -0.0200 -0.6410 0.7673 -0.0200 -0.7453 0.6563 -0.1172 -0.7454 0.6562 -0.1172 -0.7057 0.7083 -0.0164 -0.7057 0.7083 -0.0165 -0.7084 0.7053 -0.0258 -0.7084 0.7053 -0.0258 -0.8588 0.4785 -0.1829 -0.8588 0.4785 -0.1829 -0.8751 0.4434 -0.1941 -0.8751 0.4434 -0.1941 -0.8603 0.4755 -0.1839 -0.8603 0.4755 -0.1839 -0.8725 0.4860 -0.0507 -0.8725 0.4860 -0.0507 -0.8179 0.5710 -0.0706 -0.8179 0.5710 -0.0706 -0.4934 0.7938 0.3557 -0.4935 0.7937 0.3556 -0.4967 0.7943 0.3499 -0.4968 0.7942 0.3498 -0.4989 0.7993 0.3350 -0.4990 0.7992 0.3350 -0.4932 0.8041 0.3319 -0.4933 0.8041 0.3318 -0.4898 0.8078 0.3280 -0.4898 0.8078 0.3280 -0.4936 0.8072 0.3238 -0.4936 0.8072 0.3238 -0.5006 0.8022 0.3253 -0.5007 0.8022 0.3252 -0.5146 0.8183 0.2561 -0.5147 0.8182 0.2561 -0.5131 0.8225 0.2457 -0.5132 0.8224 0.2456 -0.5451 0.8063 0.2296 -0.5452 0.8063 0.2295 -0.5406 0.8122 0.2190 -0.5407 0.8122 0.2190 -0.4874 0.8397 0.2393 -0.4876 0.8396 0.2393 -0.5000 0.8314 0.2425 -0.5000 0.8314 0.2424 -0.5588 0.8042 0.2024 -0.5588 0.8043 0.2023 -0.5545 0.8071 0.2027 -0.5546 0.8071 0.2026 -0.5801 0.7957 0.1740 -0.5801 0.7957 0.1740 -0.5794 0.8054 0.1249 -0.5794 0.8054 0.1249 -0.5387 0.8325 0.1294 -0.5387 0.8325 0.1294 -0.4729 0.8726 0.1225 -0.4729 0.8726 0.1225 -0.5668 0.8048 0.1763 -0.5668 0.8047 0.1763 -0.5309 0.8267 0.1862 -0.5309 0.8267 0.1862 -0.4880 0.8497 0.1995 -0.4880 0.8497 0.1995 -0.4542 0.8791 0.1447 -0.4542 0.8791 0.1447 -0.8069 0.4608 -0.3695 -0.8069 0.4608 -0.3695 -0.8069 0.4597 -0.3709 -0.8069 0.4597 -0.3709 -0.7982 0.4662 -0.3815 -0.7982 0.4662 -0.3815 -0.8038 0.4459 -0.3938 -0.8038 0.4459 -0.3938 -0.8026 0.4383 -0.4047 -0.8026 0.4383 -0.4047 -0.8052 0.4104 -0.4280 -0.8052 0.4104 -0.4280 -0.6058 0.5583 -0.5669 -0.6058 0.5583 -0.5669 -0.5928 0.5628 -0.5761 -0.5928 0.5628 -0.5761 -0.6498 0.4163 -0.6360 -0.6498 0.4163 -0.6360 -0.6494 0.4171 -0.6359 -0.6494 0.4171 -0.6359 -0.6288 0.3881 -0.6737 -0.6288 0.3881 -0.6737 -0.5505 0.7922 -0.2633 -0.5505 0.7922 -0.2633 -0.5775 0.7802 -0.2402 -0.5775 0.7802 -0.2402 -0.5962 0.7590 -0.2616 -0.5962 0.7590 -0.2616 -0.6155 0.7449 -0.2576 -0.6155 0.7449 -0.2576 -0.6162 0.7446 -0.2566 -0.6162 0.7446 -0.2566 -0.6590 0.7222 -0.2102 -0.6590 0.7222 -0.2102 -0.6732 0.7120 -0.1998 -0.6732 0.7120 -0.1998 -0.6725 0.7120 -0.2020 -0.6725 0.7120 -0.2020 -0.6900 0.6927 -0.2099 -0.6900 0.6927 -0.2099 -0.6908 0.6923 -0.2087 -0.6908 0.6923 -0.2087 -0.6924 0.6912 -0.2068 -0.6924 0.6912 -0.2068 -0.7094 0.6740 -0.2061 -0.7094 0.6740 -0.2061 -0.7103 0.6736 -0.2043 -0.7103 0.6736 -0.2043 -0.7128 0.6692 -0.2101 -0.7128 0.6692 -0.2101 -0.7234 0.6267 -0.2899 -0.7234 0.6267 -0.2899 -0.7767 0.6026 -0.1835 -0.7767 0.6026 -0.1835 -0.7780 0.6010 -0.1831 -0.7780 0.6010 -0.1831 -0.8006 0.4915 -0.3427 -0.8006 0.4915 -0.3427 -0.6001 0.7568 -0.2592 -0.6001 0.7568 -0.2592 -0.6124 0.1507 -0.7761 -0.6123 0.1508 -0.7761 -0.6806 0.1605 -0.7148 -0.6805 0.1604 -0.7149 -0.8030 0.0628 -0.5927 -0.8030 0.0629 -0.5927 -0.8196 0.1131 -0.5617 -0.8196 0.1131 -0.5617 -0.6709 0.1358 -0.7290 -0.6709 0.1358 -0.7290 -0.9216 0.3694 0.1189 -0.9216 0.3694 0.1189 -0.9604 0.2200 -0.1709 -0.9604 0.2200 -0.1709 -0.9846 0.1369 0.1083 -0.9846 0.1369 0.1083 -0.9848 0.1380 0.1054 -0.9846 0.1393 0.1056 -0.9926 0.1163 0.0348 -0.9926 0.1163 0.0348 -0.9927 0.1161 0.0339 -0.9927 0.1161 0.0339 -0.9917 0.1238 0.0337 -0.9917 0.1238 0.0337 -0.9922 0.1220 0.0263 -0.9922 0.1220 0.0263 -0.9924 0.1209 0.0246 -0.9924 0.1209 0.0246 -0.9921 0.1230 0.0233 -0.9921 0.1230 0.0233 -0.9933 0.1152 0.0045 -0.9933 0.1152 0.0045 -0.9934 0.1147 0.0040 -0.9934 0.1147 0.0040 -0.9944 0.1056 0.0054 -0.9944 0.1056 0.0054 -0.9957 0.0896 -0.0244 -0.9957 0.0896 -0.0244 -0.9965 0.0783 -0.0309 -0.9965 0.0783 -0.0309 -0.9928 0.0680 -0.0986 -0.9928 0.0680 -0.0986 -0.9899 0.0275 -0.1391 -0.9899 0.0275 -0.1391 -0.9739 0.2047 0.0982 -0.9739 0.2047 0.0982 -0.9737 0.2056 0.0984 -0.9737 0.2056 0.0984 -0.9076 0.4026 -0.1187 -0.9076 0.4026 -0.1187 -0.9129 0.3790 -0.1514 -0.9129 0.3790 -0.1514 -0.9169 0.3706 -0.1480 -0.9169 0.3706 -0.1480 -0.9273 0.3448 -0.1457 -0.9273 0.3448 -0.1457 -0.9216 0.3651 -0.1318 -0.9216 0.3651 -0.1318 -0.9211 0.3670 -0.1300 -0.9211 0.3670 -0.1300 -0.9016 0.1996 -0.3838 -0.9016 0.1996 -0.3838 -0.9504 0.0113 -0.3108 -0.9504 0.0113 -0.3108 -0.9569 0.0404 -0.2877 -0.9569 0.0404 -0.2877 -0.9480 0.0020 -0.3182 -0.9480 0.0020 -0.3182 -0.9250 0.0869 -0.3698 -0.9250 0.0869 -0.3698 -0.6691 0.7374 0.0926 -0.6691 0.7374 0.0926 -0.6916 0.7121 0.1208 -0.6916 0.7121 0.1208 -0.6929 0.7105 0.1227 -0.6929 0.7105 0.1227 -0.6941 0.7090 0.1250 -0.6941 0.7090 0.1250 -0.6946 0.7081 0.1273 -0.6946 0.7081 0.1273 -0.6947 0.7078 0.1281 -0.6947 0.7078 0.1281 -0.7973 0.5466 0.2560 -0.7973 0.5466 0.2560 -0.1588 0.9864 0.0417 -0.1588 0.9864 0.0416 -0.5214 0.8521 -0.0462 -0.5215 0.8520 -0.0463 -0.7756 0.6200 -0.1187 -0.7756 0.6199 -0.1187 -0.5005 0.8308 0.2433 -0.5006 0.8308 0.2432 -0.5586 0.8177 0.1390 -0.5585 0.8177 0.1390 -0.6914 0.1476 -0.7073 -0.6913 0.1476 -0.7074 -0.6845 0.1500 -0.7134 -0.6844 0.1498 -0.7136 -0.6953 0.1421 -0.7045 -0.6952 0.1421 -0.7046 -0.7087 0.1251 -0.6943 -0.7087 0.1252 -0.6943 -0.7120 0.1229 -0.6913 -0.7120 0.1229 -0.6913 -0.7152 0.1194 -0.6887 -0.7150 0.1193 -0.6888 -0.7741 0.0580 -0.6304 -0.7741 0.0580 -0.6304 -0.7757 0.0576 -0.6285 -0.7758 0.0575 -0.6284 -0.7834 0.0593 -0.6187 -0.7835 0.0593 -0.6186 -0.7862 0.0598 -0.6151 -0.7862 0.0598 -0.6151 -0.7025 0.1212 -0.7013 -0.7025 0.1212 -0.7013 -0.7108 0.4266 -0.5593 -0.7108 0.4266 -0.5593 -0.5991 0.7469 -0.2884 -0.5991 0.7469 -0.2884 0.6986 0.3260 0.6369 0.6986 0.3260 0.6369 0.7107 0.3086 0.6321 0.7107 0.3086 0.6321 0.7073 0.3143 0.6332 0.7073 0.3143 0.6332 0.7177 0.3474 0.6035 0.7177 0.3474 0.6035 0.7208 0.3462 0.6005 0.7208 0.3462 0.6005 0.7224 0.3443 0.5997 0.7224 0.3443 0.5997 0.7255 0.3411 0.5977 0.7255 0.3411 0.5977 0.7248 0.3500 0.5934 0.7248 0.3500 0.5934 0.7491 0.3348 0.5717 0.7491 0.3348 0.5717 0.7441 0.3202 0.5863 0.7441 0.3202 0.5863 0.7278 0.3374 0.5971 0.7278 0.3374 0.5971 0.7279 0.3340 0.5988 0.7279 0.3340 0.5988 0.7278 0.3328 0.5996 0.7278 0.3328 0.5996 0.7229 0.3384 0.6023 0.7229 0.3384 0.6023 0.7247 0.3307 0.6045 0.7247 0.3307 0.6045 0.7272 0.3159 0.6094 0.7272 0.3159 0.6094 0.7285 0.3176 0.6070 0.7285 0.3176 0.6070 0.7317 0.3125 0.6057 0.7317 0.3125 0.6057 0.7441 0.2971 0.5984 0.7441 0.2971 0.5984 0.7440 0.2962 0.5990 0.7440 0.2962 0.5990 0.7323 0.2761 0.6225 0.7323 0.2761 0.6225 0.7299 0.2793 0.6239 0.7299 0.2793 0.6239 0.7272 0.2667 0.6325 0.7272 0.2667 0.6325 0.6975 0.2029 0.6873 0.6975 0.2029 0.6873 0.6965 0.1948 0.6905 0.6965 0.1948 0.6905 0.6929 0.1867 0.6965 0.6929 0.1867 0.6965 0.6955 0.1895 0.6931 0.6955 0.1895 0.6931 0.6892 0.1763 0.7028 0.6892 0.1763 0.7028 0.6860 0.1799 0.7050 0.6860 0.1799 0.7050 0.5660 0.1313 0.8139 0.5660 0.1313 0.8139 0.5748 0.1173 0.8099 0.5748 0.1173 0.8099 0.5766 0.1160 0.8088 0.5766 0.1160 0.8088 0.5715 0.0844 0.8163 0.5715 0.0844 0.8163 0.5717 0.0839 0.8162 0.5717 0.0839 0.8162 0.5856 0.0842 0.8062 0.5856 0.0842 0.8062 0.5852 0.0815 0.8067 0.5852 0.0815 0.8067 0.5856 0.0802 0.8067 0.5856 0.0802 0.8067 0.5868 0.0764 0.8061 0.5868 0.0764 0.8061 0.5878 0.0730 0.8057 0.5878 0.0730 0.8057 0.5735 0.0904 0.8142 0.5735 0.0904 0.8142 0.6857 0.1503 0.7122 0.6857 0.1503 0.7122 0.7708 0.1647 0.6154 0.7708 0.1647 0.6154 0.7705 0.1682 0.6149 0.7705 0.1682 0.6149 0.7596 0.1779 0.6255 0.7596 0.1779 0.6255 0.7557 0.1999 0.6236 0.7557 0.1999 0.6236 0.7560 0.2015 0.6228 0.7560 0.2015 0.6228 0.7570 0.2024 0.6213 0.7570 0.2024 0.6213 0.7519 0.2048 0.6267 0.7519 0.2048 0.6267 0.7353 0.1818 0.6529 0.7353 0.1818 0.6529 0.7363 0.1697 0.6551 0.7363 0.1697 0.6551 0.7198 0.1248 0.6828 0.7198 0.1248 0.6828 0.7671 0.1120 0.6317 0.7671 0.1120 0.6317 0.7456 0.1092 0.6574 0.7456 0.1092 0.6574 0.6880 0.1502 0.7100 0.6868 0.1501 0.7112 0.5953 0.0529 0.8018 0.5953 0.0529 0.8018 0.5599 0.1216 0.8196 0.5599 0.1216 0.8196 0.5650 0.1017 0.8188 0.5650 0.1017 0.8188 0.5502 0.1025 0.8287 0.5502 0.1025 0.8287 0.5393 0.0845 0.8379 0.5393 0.0845 0.8379 0.3003 0.1719 0.9382 0.3003 0.1719 0.9382 0.2987 0.1334 0.9450 0.2987 0.1334 0.9450 0.3191 0.1222 0.9398 0.3191 0.1222 0.9398 0.3189 0.1269 0.9392 0.3189 0.1269 0.9392 0.3206 0.1218 0.9394 0.3206 0.1218 0.9394 0.3292 0.1121 0.9376 0.3292 0.1121 0.9376 0.3455 0.1069 0.9323 0.3455 0.1069 0.9323 0.3473 0.1049 0.9319 0.3473 0.1049 0.9319 0.3539 0.1023 0.9297 0.3539 0.1023 0.9297 0.3455 0.1024 0.9328 0.3455 0.1024 0.9328 0.3625 0.0866 0.9280 0.3625 0.0866 0.9280 0.3762 0.0957 0.9216 0.3762 0.0957 0.9216 0.3965 0.0907 0.9136 0.3965 0.0907 0.9136 0.3953 0.0887 0.9143 0.3953 0.0887 0.9143 0.4037 0.0856 0.9109 0.4037 0.0856 0.9109 0.4163 0.0829 0.9055 0.4163 0.0829 0.9055 0.4115 0.0897 0.9070 0.4115 0.0897 0.9070 0.4218 0.0854 0.9027 0.4218 0.0854 0.9027 0.4462 0.0672 0.8924 0.4462 0.0672 0.8924 0.4471 0.0641 0.8922 0.4471 0.0641 0.8922 0.4483 0.0602 0.8919 0.4483 0.0602 0.8919 0.4604 0.0510 0.8862 0.4604 0.0510 0.8862 0.4803 0.0417 0.8761 0.4803 0.0417 0.8761 0.4918 0.0429 0.8696 0.4918 0.0429 0.8696 0.4899 0.0427 0.8708 0.4899 0.0427 0.8708 0.4966 0.0492 0.8666 0.4966 0.0492 0.8666 0.5000 0.0451 0.8649 0.5000 0.0451 0.8649 0.5181 0.1076 0.8485 0.5181 0.1076 0.8485 0.5008 0.1755 0.8476 0.5008 0.1755 0.8476 0.4843 0.1620 0.8598 0.4843 0.1620 0.8598 0.4672 0.1555 0.8704 0.4672 0.1555 0.8704 0.3847 0.1760 0.9061 0.3847 0.1760 0.9061 0.4191 0.1644 0.8929 0.4191 0.1644 0.8929 0.4674 0.1666 0.8682 0.4674 0.1666 0.8682 0.4244 0.2222 0.8778 0.4244 0.2222 0.8778 0.4224 0.2305 0.8766 0.4224 0.2305 0.8766 0.4164 0.2261 0.8806 0.4164 0.2261 0.8806 0.4087 0.2153 0.8869 0.4087 0.2153 0.8869 0.4233 0.2209 0.8787 0.4233 0.2209 0.8787 0.7044 0.2710 0.6561 0.7044 0.2710 0.6561 0.7041 0.2664 0.6583 0.7041 0.2664 0.6583 0.6988 0.2418 0.6731 0.6988 0.2418 0.6731 0.6546 0.2032 0.7281 0.6546 0.2032 0.7281 0.6648 0.1723 0.7268 0.6648 0.1723 0.7268 0.6405 0.1624 0.7506 0.6405 0.1624 0.7506 0.6445 0.1932 0.7398 0.6445 0.1932 0.7398 0.5750 0.1507 0.8041 0.5750 0.1507 0.8041 0.6289 0.1587 0.7611 0.6289 0.1587 0.7611 0.6010 0.1545 0.7842 0.6010 0.1545 0.7842 0.5958 0.1479 0.7894 0.5958 0.1479 0.7894 0.5954 0.1508 0.7891 0.5954 0.1508 0.7891 0.5922 0.1441 0.7928 0.5922 0.1441 0.7928 0.5947 0.1377 0.7920 0.5947 0.1377 0.7920 0.5952 0.1371 0.7918 0.5952 0.1371 0.7918 0.5944 0.1363 0.7926 0.5944 0.1363 0.7926 0.5956 0.1320 0.7924 0.5956 0.1320 0.7924 0.5834 0.1369 0.8006 0.5834 0.1369 0.8006 0.5831 0.1347 0.8012 0.5831 0.1347 0.8012 0.5838 0.1339 0.8008 0.5838 0.1339 0.8008 0.5837 0.1327 0.8011 0.5837 0.1327 0.8011 0.5926 0.1392 0.7934 0.5926 0.1392 0.7934 0.5927 0.0655 0.8028 0.5927 0.0655 0.8028 0.6731 0.1250 0.7289 0.6731 0.1250 0.7289 0.6890 0.1280 0.7134 0.6890 0.1280 0.7134 0.7517 0.0068 0.6595 0.7517 0.0068 0.6595 0.7499 0.0032 0.6616 0.7518 0.0000 0.6594 0.7516 0.0000 0.6596 0.7513 0.0000 0.6600 0.7510 0.0000 0.6602 0.7499 0.0032 0.6616 0.4000 0.1000 0.9111 0.4000 0.1000 0.9111 0.4492 0.0934 0.8885 0.4492 0.0934 0.8885 0.4661 0.0696 0.8820 0.4661 0.0696 0.8820 0.4756 0.0877 0.8753 0.4756 0.0877 0.8753 0.4915 0.0963 0.8656 0.4915 0.0963 0.8656 0.4983 0.0989 0.8613 0.4983 0.0989 0.8613 0.5306 0.1383 0.8363 0.5306 0.1383 0.8363 0.5284 0.1301 0.8389 0.5284 0.1301 0.8389 0.4981 0.1274 0.8577 0.4981 0.1274 0.8577 0.4915 0.1370 0.8600 0.4915 0.1370 0.8600 0.4698 0.1474 0.8704 0.4698 0.1474 0.8704 0.4775 0.1408 0.8673 0.4775 0.1408 0.8673 0.4698 0.1227 0.8742 0.4698 0.1227 0.8742 0.4309 0.1016 0.8967 0.4309 0.1016 0.8967 0.4354 0.1101 0.8935 0.4354 0.1101 0.8935 0.4158 0.1024 0.9037 0.4158 0.1024 0.9037 0.3908 0.1275 0.9116 0.3908 0.1275 0.9116 0.4623 0.1088 0.8800 0.4623 0.1088 0.8800 0.4269 0.1873 0.8847 0.4269 0.1873 0.8847 0.4300 0.1984 0.8808 0.4300 0.1984 0.8808 0.4217 0.2088 0.8824 0.4217 0.2088 0.8824 0.4279 0.2088 0.8794 0.4279 0.2088 0.8794 0.3938 0.2290 0.8902 0.3938 0.2290 0.8902 0.3936 0.2321 0.8895 0.3936 0.2321 0.8895 0.3346 0.1747 0.9260 0.3346 0.1747 0.9260 0.3875 0.1971 0.9005 0.3875 0.1971 0.9005 0.3858 0.2083 0.8987 0.3858 0.2083 0.8987 -0.2015 0.0441 -0.9785 -0.2015 0.0441 -0.9785 -0.1992 0.0470 -0.9788 -0.1992 0.0470 -0.9788 0.0238 0.3938 -0.9189 0.0238 0.3938 -0.9189 0.0273 0.3921 -0.9195 0.0273 0.3921 -0.9195 0.3239 0.0027 -0.9461 0.3239 0.0027 -0.9461 0.3306 0.0125 -0.9437 0.3306 0.0125 -0.9437 0.1122 0.2834 -0.9524 0.1122 0.2834 -0.9524 -0.0500 0.3962 -0.9168 -0.0500 0.3962 -0.9168 -0.0605 0.3942 -0.9170 -0.0605 0.3942 -0.9170 -0.0634 0.3897 -0.9187 -0.0634 0.3897 -0.9187 -0.0716 0.3975 -0.9148 -0.0716 0.3975 -0.9148 -0.0740 0.3981 -0.9144 -0.0740 0.3981 -0.9144 -0.0760 0.3993 -0.9137 -0.0760 0.3993 -0.9137 -0.0766 0.3995 -0.9135 -0.0766 0.3995 -0.9135 -0.0760 0.4021 -0.9124 -0.0760 0.4021 -0.9124 -0.3246 0.1500 -0.9339 -0.3246 0.1500 -0.9339 -0.3248 0.1455 -0.9345 -0.3248 0.1455 -0.9345 -0.2333 0.0474 -0.9712 -0.2333 0.0474 -0.9712 0.1070 0.2899 -0.9511 0.1070 0.2899 -0.9511 0.2733 0.2144 -0.9377 0.2733 0.2144 -0.9377 0.2486 0.2990 -0.9213 0.2486 0.2990 -0.9213 0.2030 0.3316 -0.9213 0.2030 0.3316 -0.9213 0.2016 0.3326 -0.9213 0.2016 0.3326 -0.9213 0.1970 0.3314 -0.9227 0.1970 0.3314 -0.9227 0.8470 -0.2032 0.4912 0.8470 -0.2032 0.4912 0.8482 -0.2034 0.4891 0.8482 -0.2034 0.4891 0.8093 -0.2394 0.5364 0.8093 -0.2394 0.5364 0.8083 -0.2398 0.5378 0.8083 -0.2398 0.5378 0.8041 -0.2362 0.5455 0.8041 -0.2362 0.5455 0.9440 -0.2613 0.2015 0.9440 -0.2613 0.2015 0.9406 -0.2740 0.2005 0.9406 -0.2740 0.2005 0.9411 -0.2728 0.1996 0.9411 -0.2728 0.1996 0.9421 -0.2728 0.1951 0.9421 -0.2728 0.1951 0.9430 -0.2701 0.1943 0.9430 -0.2701 0.1943 0.9432 -0.2695 0.1941 0.9432 -0.2695 0.1941 0.9555 -0.0734 0.2858 0.9555 -0.0734 0.2858 -0.6179 -0.0131 0.7862 -0.6179 -0.0131 0.7862 -0.6163 -0.0401 0.7865 -0.6163 -0.0401 0.7865 -0.6160 -0.0413 0.7867 -0.6160 -0.0413 0.7867 -0.6050 -0.0807 0.7921 -0.6050 -0.0807 0.7921 -0.6013 -0.0926 0.7936 -0.6013 -0.0926 0.7936 -0.5981 -0.0990 0.7953 -0.5981 -0.0990 0.7953 -0.5959 -0.1040 0.7963 -0.5959 -0.1040 0.7963 -0.5941 -0.1082 0.7971 -0.5941 -0.1082 0.7971 -0.5729 -0.1418 0.8073 -0.5729 -0.1418 0.8073 -0.5673 -0.1492 0.8099 -0.5673 -0.1492 0.8099 -0.5659 -0.1523 0.8103 -0.5659 -0.1523 0.8103 -0.5651 -0.1460 0.8120 -0.5651 -0.1460 0.8120 -0.5415 -0.0981 0.8350 -0.5415 -0.0981 0.8350 -0.5336 -0.0927 0.8407 -0.5336 -0.0927 0.8407 -0.8803 -0.0412 0.4727 -0.8803 -0.0412 0.4727 0.3198 -0.0468 0.9463 0.3198 -0.0468 0.9463 -0.4234 -0.0544 0.9043 -0.4234 -0.0544 0.9043 -0.9981 -0.0617 0.0040 -0.9981 -0.0617 0.0040 -0.9982 -0.0587 0.0141 -0.9982 -0.0587 0.0141 -0.9457 -0.0023 -0.3250 -0.9457 -0.0023 -0.3250 -0.9552 -0.0173 -0.2953 -0.9552 -0.0173 -0.2953 -0.9498 -0.0205 -0.3122 -0.9498 -0.0205 -0.3122 -0.9510 -0.0167 -0.3088 -0.9510 -0.0167 -0.3088 -0.9772 -0.1398 -0.1601 -0.9772 -0.1398 -0.1601 -0.9561 -0.1556 -0.2482 -0.9561 -0.1556 -0.2482 -0.9530 -0.1763 -0.2465 -0.9530 -0.1763 -0.2465 -0.9603 -0.0727 -0.2693 -0.9603 -0.0727 -0.2693 -0.9423 -0.0981 -0.3201 -0.9423 -0.0981 -0.3201 -0.9375 -0.0807 -0.3385 -0.9375 -0.0807 -0.3385 -0.9366 -0.0935 -0.3377 -0.9366 -0.0935 -0.3377 -0.9271 -0.0822 -0.3656 -0.9271 -0.0822 -0.3656 -0.9156 -0.3706 -0.1562 -0.9156 -0.3706 -0.1562 -0.8750 -0.3213 -0.3621 -0.8750 -0.3213 -0.3621 -0.8600 -0.3481 -0.3732 -0.8600 -0.3481 -0.3732 -0.5834 -0.6928 -0.4238 -0.5834 -0.6928 -0.4238 -0.8213 -0.4208 -0.3852 -0.8213 -0.4208 -0.3852 -0.8637 -0.4632 -0.1988 -0.8637 -0.4632 -0.1988 -0.7538 -0.6424 -0.1380 -0.7538 -0.6424 -0.1380 -0.9084 -0.4064 -0.0979 -0.9084 -0.4064 -0.0979 -0.9388 -0.3347 0.0820 -0.9388 -0.3347 0.0820 0.6928 -0.3588 0.6256 0.6928 -0.3588 0.6256 0.6872 -0.3739 0.6229 0.6872 -0.3739 0.6229 0.6852 -0.0284 0.7278 0.6852 -0.0284 0.7278 0.6760 -0.0382 0.7359 0.6760 -0.0382 0.7359 0.6393 -0.0710 0.7656 0.6393 -0.0710 0.7656 0.5581 -0.0504 0.8282 0.5581 -0.0504 0.8282 0.5477 -0.0646 0.8342 0.5477 -0.0646 0.8342 0.5459 -0.0618 0.8356 0.5459 -0.0618 0.8356 0.5415 -0.0593 0.8386 0.5415 -0.0593 0.8386 0.4872 -0.0068 0.8732 0.4872 -0.0068 0.8732 0.4609 -0.0529 0.8859 0.4609 -0.0529 0.8859 0.7518 0.0000 0.6594 0.7516 0.0000 0.6596 0.7513 0.0000 0.6600 0.7510 0.0000 0.6602 0.7319 -0.0449 0.6799 0.7319 -0.0449 0.6799 0.7290 -0.0497 0.6827 0.7290 -0.0497 0.6827 0.7416 -0.0752 0.6666 0.7416 -0.0752 0.6666 0.7436 -0.0804 0.6638 0.7436 -0.0804 0.6638 0.7636 -0.0798 0.6408 0.7636 -0.0798 0.6408 0.7574 -0.0341 0.6520 0.7574 -0.0341 0.6520 0.7602 -0.0335 0.6488 0.7602 -0.0335 0.6488 0.7874 -0.0444 0.6148 0.7874 -0.0444 0.6148 0.7728 -0.0719 0.6306 0.7728 -0.0719 0.6306 0.7696 -0.0666 0.6350 0.7696 -0.0666 0.6350 0.7855 -0.0380 0.6177 0.7855 -0.0380 0.6177 0.7438 -0.0351 0.6675 0.7438 -0.0351 0.6675 0.5744 -0.0628 0.8162 0.5744 -0.0628 0.8162 0.5799 -0.0817 0.8106 0.5799 -0.0817 0.8106 0.5868 -0.0825 0.8055 0.5868 -0.0825 0.8055 0.5948 -0.0853 0.7993 0.5948 -0.0853 0.7993 -0.3804 -0.4762 0.7928 -0.3804 -0.4762 0.7928 -0.3757 -0.4724 0.7973 -0.3757 -0.4724 0.7973 -0.3740 -0.4621 0.8041 -0.3740 -0.4621 0.8041 -0.3777 -0.4627 0.8020 -0.3777 -0.4627 0.8020 -0.3809 -0.4627 0.8005 -0.3809 -0.4627 0.8005 -0.3833 -0.4640 0.7986 -0.3833 -0.4640 0.7986 -0.3828 -0.4634 0.7992 -0.3828 -0.4634 0.7992 -0.3829 -0.4620 0.8000 -0.3829 -0.4620 0.8000 -0.3818 -0.4430 0.8112 -0.3818 -0.4430 0.8112 -0.3778 -0.4469 0.8109 -0.3778 -0.4469 0.8109 -0.3781 -0.4440 0.8124 -0.3781 -0.4440 0.8124 -0.3769 -0.4449 0.8124 -0.3769 -0.4449 0.8124 -0.3795 -0.4413 0.8132 -0.3795 -0.4413 0.8132 -0.3780 -0.4387 0.8153 -0.3780 -0.4387 0.8153 -0.3725 -0.4406 0.8167 -0.3725 -0.4406 0.8167 -0.3740 -0.4386 0.8171 -0.3740 -0.4386 0.8171 -0.4032 -0.4625 0.7896 -0.4032 -0.4625 0.7896 -0.4010 -0.4538 0.7958 -0.4010 -0.4538 0.7958 -0.2512 -0.2484 0.9355 -0.2512 -0.2484 0.9355 -0.2492 -0.2443 0.9371 -0.2492 -0.2443 0.9371 -0.2423 -0.2509 0.9372 -0.2423 -0.2509 0.9372 -0.2063 -0.2611 0.9430 -0.2063 -0.2611 0.9430 -0.1956 -0.2781 0.9404 -0.1956 -0.2781 0.9404 -0.3592 -0.5560 0.7496 -0.3592 -0.5560 0.7496 -0.3614 -0.5353 0.7634 -0.3614 -0.5353 0.7634 -0.3569 -0.5425 0.7605 -0.3569 -0.5425 0.7605 -0.3655 -0.5240 0.7693 -0.3655 -0.5240 0.7693 -0.3757 -0.5117 0.7727 -0.3757 -0.5117 0.7727 -0.3791 -0.5052 0.7753 -0.3791 -0.5052 0.7753 -0.3779 -0.4832 0.7898 -0.3779 -0.4832 0.7898 -0.3799 -0.4803 0.7906 -0.3799 -0.4803 0.7906 -0.3735 -0.4751 0.7967 -0.3735 -0.4751 0.7967 -0.2163 -0.4308 0.8761 -0.2163 -0.4308 0.8761 -0.1764 -0.4344 0.8833 -0.1764 -0.4344 0.8833 -0.1757 -0.4358 0.8827 -0.1757 -0.4358 0.8827 -0.1789 -0.4375 0.8812 -0.1789 -0.4375 0.8812 -0.1710 -0.4318 0.8856 -0.1710 -0.4318 0.8856 -0.0842 -0.6024 0.7937 -0.0842 -0.6024 0.7937 -0.0721 -0.6227 0.7792 -0.0721 -0.6227 0.7792 -0.1038 -0.5995 0.7936 -0.1038 -0.5995 0.7936 -0.0508 -0.6513 0.7571 -0.0508 -0.6513 0.7571 0.1495 -0.3392 0.9288 0.1495 -0.3392 0.9288 0.1673 -0.3418 0.9248 0.1673 -0.3418 0.9248 0.1796 -0.3436 0.9218 0.1796 -0.3436 0.9218 0.1913 -0.3638 0.9116 0.1913 -0.3638 0.9116 0.1789 -0.3882 0.9040 0.1789 -0.3882 0.9040 0.1891 -0.3973 0.8980 0.1891 -0.3973 0.8980 0.1924 -0.4002 0.8960 0.1924 -0.4002 0.8960 0.1954 -0.4168 0.8878 0.1954 -0.4168 0.8878 0.1942 -0.4304 0.8815 0.1942 -0.4304 0.8815 0.1220 -0.4120 0.9030 0.1220 -0.4120 0.9030 0.0956 -0.4503 0.8878 0.0956 -0.4503 0.8878 0.0972 -0.4499 0.8878 0.0972 -0.4499 0.8878 0.0878 -0.4942 0.8649 0.0878 -0.4942 0.8649 0.0862 -0.4975 0.8632 0.0862 -0.4975 0.8632 0.0841 -0.5013 0.8612 0.0841 -0.5013 0.8612 0.1099 -0.5134 0.8511 0.1099 -0.5134 0.8511 0.1023 -0.5098 0.8542 0.1023 -0.5098 0.8542 0.0958 -0.5275 0.8441 0.0958 -0.5275 0.8441 0.1249 -0.5504 0.8255 0.1249 -0.5504 0.8255 0.0964 -0.5381 0.8373 0.0964 -0.5381 0.8373 0.0968 -0.5369 0.8381 0.0968 -0.5369 0.8381 0.0999 -0.5388 0.8365 0.0999 -0.5388 0.8365 0.1070 -0.5478 0.8297 0.1070 -0.5478 0.8297 0.1824 -0.4796 0.8583 0.1824 -0.4796 0.8583 0.2102 -0.4425 0.8718 0.2102 -0.4425 0.8718 0.2198 -0.4516 0.8647 0.2198 -0.4516 0.8647 0.2507 -0.4691 0.8468 0.2507 -0.4691 0.8468 0.2532 -0.4694 0.8459 0.2532 -0.4694 0.8459 0.2529 -0.4727 0.8441 0.2529 -0.4727 0.8441 0.2550 -0.4725 0.8436 0.2550 -0.4725 0.8436 0.2652 -0.4810 0.8357 0.2652 -0.4810 0.8357 0.2625 -0.4847 0.8344 0.2625 -0.4847 0.8344 0.2644 -0.4862 0.8329 0.2644 -0.4862 0.8329 0.2693 -0.4873 0.8306 0.2693 -0.4873 0.8306 0.2737 -0.4887 0.8284 0.2737 -0.4887 0.8284 0.3509 -0.5063 0.7878 0.3509 -0.5063 0.7878 0.1704 -0.3462 0.9225 0.1704 -0.3462 0.9225 -0.1520 -0.2955 0.9432 -0.1520 -0.2955 0.9432 -0.1504 -0.2979 0.9427 -0.1504 -0.2979 0.9427 -0.1497 -0.2973 0.9430 -0.1497 -0.2973 0.9430 -0.1473 -0.2986 0.9429 -0.1473 -0.2986 0.9429 -0.1458 -0.2992 0.9430 -0.1458 -0.2992 0.9430 -0.1272 -0.3111 0.9418 -0.1272 -0.3111 0.9418 -0.1319 -0.3106 0.9414 -0.1319 -0.3106 0.9414 -0.1489 -0.3278 0.9329 -0.1489 -0.3278 0.9329 -0.1488 -0.3319 0.9315 -0.1488 -0.3319 0.9315 -0.1478 -0.3333 0.9312 -0.1478 -0.3333 0.9312 -0.1534 -0.3425 0.9269 -0.1534 -0.3425 0.9269 -0.1511 -0.3431 0.9271 -0.1511 -0.3431 0.9271 -0.1288 -0.3421 0.9308 -0.1288 -0.3421 0.9308 -0.1234 -0.3574 0.9258 -0.1234 -0.3574 0.9258 -0.1163 -0.3570 0.9269 -0.1163 -0.3570 0.9269 -0.1199 -0.3629 0.9241 -0.1199 -0.3629 0.9241 -0.1212 -0.3719 0.9203 -0.1212 -0.3719 0.9203 -0.1194 -0.3722 0.9204 -0.1194 -0.3722 0.9204 -0.0582 -0.3690 0.9276 -0.0582 -0.3690 0.9276 -0.0484 -0.3760 0.9253 -0.0484 -0.3760 0.9253 -0.0728 -0.3390 0.9380 -0.0728 -0.3390 0.9380 -0.0628 -0.3310 0.9415 -0.0628 -0.3310 0.9415 -0.0438 -0.3403 0.9393 -0.0438 -0.3403 0.9393 0.0513 -0.3656 0.9293 0.0513 -0.3656 0.9293 0.0652 -0.4301 0.9004 0.0652 -0.4301 0.9004 -0.0048 -0.4465 0.8948 -0.0048 -0.4465 0.8948 -0.0056 -0.4455 0.8953 -0.0056 -0.4455 0.8953 -0.0114 -0.4443 0.8958 -0.0114 -0.4443 0.8958 -0.0080 -0.4592 0.8883 -0.0080 -0.4592 0.8883 -0.0175 -0.4631 0.8861 -0.0175 -0.4631 0.8861 -0.0197 -0.4630 0.8862 -0.0197 -0.4630 0.8862 -0.0427 -0.4343 0.8998 -0.0427 -0.4343 0.8998 -0.0339 -0.4359 0.8994 -0.0339 -0.4359 0.8994 -0.1673 -0.3817 0.9090 -0.1673 -0.3817 0.9090 -0.2011 -0.3712 0.9065 -0.2011 -0.3712 0.9065 0.1055 -0.5901 0.8004 0.1055 -0.5901 0.8004 0.1042 -0.5878 0.8023 0.1042 -0.5878 0.8023 0.1091 -0.5643 0.8183 0.1091 -0.5643 0.8183 0.2815 -0.5743 0.7688 0.2815 -0.5743 0.7688 0.3234 -0.5455 0.7732 0.3234 -0.5455 0.7732 0.3277 -0.5330 0.7801 0.3277 -0.5330 0.7801 0.3564 -0.5192 0.7768 0.3564 -0.5192 0.7768 0.3652 -0.5349 0.7619 0.3652 -0.5349 0.7619 0.3659 -0.5356 0.7611 0.3659 -0.5356 0.7611 0.3760 -0.5302 0.7600 0.3760 -0.5302 0.7600 0.3954 -0.5454 0.7391 0.3954 -0.5454 0.7391 0.3814 -0.5686 0.7289 0.3814 -0.5686 0.7289 0.3806 -0.5615 0.7348 0.3806 -0.5615 0.7348 0.3772 -0.5577 0.7394 0.3772 -0.5577 0.7394 0.3405 -0.6120 0.7138 0.3405 -0.6120 0.7138 0.3001 -0.6607 0.6881 0.3001 -0.6607 0.6881 0.2883 -0.6542 0.6992 0.2883 -0.6542 0.6992 0.2881 -0.6037 0.7433 0.2881 -0.6037 0.7433 -0.3894 -0.4232 0.8181 -0.3894 -0.4232 0.8181 -0.3880 -0.4188 0.8210 -0.3880 -0.4188 0.8210 -0.3905 -0.4123 0.8231 -0.3905 -0.4123 0.8231 -0.3901 -0.4099 0.8245 -0.3901 -0.4099 0.8245 -0.3896 -0.4108 0.8243 -0.3896 -0.4108 0.8243 -0.3880 -0.4121 0.8244 -0.3880 -0.4121 0.8244 -0.3855 -0.4091 0.8271 -0.3855 -0.4091 0.8271 -0.3843 -0.4090 0.8277 -0.3843 -0.4090 0.8277 -0.3903 -0.4025 0.8281 -0.3903 -0.4025 0.8281 -0.3881 -0.4041 0.8283 -0.3881 -0.4041 0.8283 -0.3680 -0.3743 0.8512 -0.3680 -0.3743 0.8512 -0.4059 -0.2923 0.8659 -0.4059 -0.2923 0.8659 -0.4051 -0.2827 0.8695 -0.4051 -0.2827 0.8695 -0.4169 -0.2642 0.8697 -0.4169 -0.2642 0.8697 -0.4124 -0.2638 0.8720 -0.4124 -0.2638 0.8720 -0.4141 -0.2598 0.8724 -0.4141 -0.2598 0.8724 -0.4122 -0.2573 0.8740 -0.4122 -0.2573 0.8740 -0.4149 -0.2579 0.8725 -0.4149 -0.2579 0.8725 -0.4191 -0.2621 0.8693 -0.4191 -0.2621 0.8693 -0.4226 -0.2659 0.8665 -0.4226 -0.2659 0.8665 -0.4238 -0.2648 0.8662 -0.4238 -0.2648 0.8662 -0.4221 -0.2650 0.8669 -0.4221 -0.2650 0.8669 -0.4218 -0.2632 0.8676 -0.4218 -0.2632 0.8676 -0.4414 -0.2519 0.8612 -0.4414 -0.2519 0.8612 -0.4438 -0.2500 0.8606 -0.4438 -0.2500 0.8606 -0.4562 -0.2409 0.8566 -0.4562 -0.2409 0.8566 -0.4345 -0.2323 0.8702 -0.4345 -0.2323 0.8702 -0.4551 -0.2280 0.8608 -0.4551 -0.2280 0.8608 -0.4638 -0.2488 0.8503 -0.4638 -0.2488 0.8503 -0.4714 -0.2375 0.8493 -0.4714 -0.2375 0.8493 -0.5079 -0.2131 0.8347 -0.5079 -0.2131 0.8347 -0.5228 -0.2027 0.8280 -0.5228 -0.2027 0.8280 -0.5336 -0.1926 0.8235 -0.5336 -0.1926 0.8235 -0.5361 -0.2017 0.8197 -0.5361 -0.2017 0.8197 -0.5373 -0.2032 0.8185 -0.5373 -0.2032 0.8185 -0.5354 -0.1914 0.8226 -0.5354 -0.1914 0.8226 -0.5426 -0.1791 0.8206 -0.5426 -0.1791 0.8206 -0.5549 -0.1755 0.8132 -0.5549 -0.1755 0.8132 -0.5429 -0.1646 0.8235 -0.5429 -0.1646 0.8235 -0.4239 -0.1349 0.8956 -0.4239 -0.1349 0.8956 -0.3355 -0.1015 0.9365 -0.3323 -0.1008 0.9378 -0.3320 -0.1007 0.9379 -0.3279 -0.1013 0.9393 -0.3276 -0.1014 0.9393 -0.3249 -0.1021 0.9402 -0.3247 -0.1020 0.9403 -0.3214 -0.1034 0.9413 -0.3204 -0.1042 0.9415 -0.3193 -0.1078 0.9415 -0.2865 -0.1700 0.9429 -0.2861 -0.1731 0.9424 -0.2715 -0.2129 0.9386 -0.2712 -0.2166 0.9378 0.2072 -0.7443 0.6349 0.2072 -0.7443 0.6349 0.1961 -0.7698 0.6075 0.1961 -0.7698 0.6075 0.1949 -0.7720 0.6050 0.1949 -0.7720 0.6050 0.1941 -0.7733 0.6035 0.1941 -0.7733 0.6035 0.1901 -0.8000 0.5691 0.1901 -0.8000 0.5691 0.1745 -0.8088 0.5616 0.1745 -0.8088 0.5616 0.1550 -0.8237 0.5454 0.1550 -0.8237 0.5454 0.1280 -0.8481 0.5141 0.1280 -0.8481 0.5141 0.1429 -0.8663 0.4786 0.1429 -0.8663 0.4786 0.1541 -0.8877 0.4340 0.1541 -0.8877 0.4340 0.1478 -0.8947 0.4214 0.1478 -0.8947 0.4214 0.1247 -0.9007 0.4162 0.1247 -0.9007 0.4162 0.1304 -0.8902 0.4365 0.1304 -0.8902 0.4365 0.1218 -0.8850 0.4493 0.1218 -0.8850 0.4493 0.1206 -0.8853 0.4491 0.1206 -0.8853 0.4491 0.1200 -0.8845 0.4509 0.1200 -0.8845 0.4509 0.1134 -0.8804 0.4606 0.1134 -0.8804 0.4606 0.0820 -0.8637 0.4973 0.0820 -0.8637 0.4973 0.0745 -0.8657 0.4950 0.0745 -0.8657 0.4950 0.0236 -0.8639 0.5031 0.0236 -0.8639 0.5031 0.0142 -0.8638 0.5036 0.0142 -0.8638 0.5036 0.0145 -0.8697 0.4934 0.0145 -0.8697 0.4934 0.0128 -0.8703 0.4923 0.0128 -0.8703 0.4923 0.0109 -0.8677 0.4970 0.0109 -0.8677 0.4970 0.0083 -0.8678 0.4968 0.0083 -0.8678 0.4968 0.0088 -0.8684 0.4957 0.0088 -0.8684 0.4957 0.0065 -0.8698 0.4933 0.0065 -0.8698 0.4933 0.0020 -0.8718 0.4899 0.0020 -0.8718 0.4899 0.0007 -0.8724 0.4887 0.0007 -0.8724 0.4887 0.0014 -0.8721 0.4893 0.0014 -0.8721 0.4893 -0.0048 -0.8740 0.4860 -0.0048 -0.8740 0.4860 -0.0102 -0.8740 0.4858 -0.0101 -0.8740 0.4858 -0.0139 -0.8741 0.4856 -0.0139 -0.8741 0.4856 0.2609 -0.6668 0.6981 0.2609 -0.6668 0.6981 0.2601 -0.6694 0.6959 0.2601 -0.6694 0.6959 0.2406 -0.7076 0.6644 0.2406 -0.7076 0.6644 0.2084 -0.7297 0.6513 0.2084 -0.7297 0.6513 0.1986 -0.6697 0.7156 0.1986 -0.6697 0.7156 0.1692 -0.6969 0.6969 0.1692 -0.6969 0.6969 0.1657 -0.6978 0.6968 0.1657 -0.6978 0.6968 0.1402 -0.7170 0.6828 0.1402 -0.7170 0.6828 0.0955 -0.7391 0.6668 0.0955 -0.7391 0.6668 0.1010 -0.6933 0.7135 0.1010 -0.6933 0.7135 0.1213 -0.6926 0.7111 0.1213 -0.6926 0.7111 0.0991 -0.6870 0.7198 0.0991 -0.6870 0.7198 0.0899 -0.6895 0.7187 0.0899 -0.6895 0.7187 0.0679 -0.6937 0.7171 0.0679 -0.6937 0.7171 0.0376 -0.7009 0.7123 0.0376 -0.7009 0.7123 0.0266 -0.6577 0.7528 0.0266 -0.6577 0.7528 0.0109 -0.6656 0.7463 0.0109 -0.6656 0.7463 -0.0072 -0.6836 0.7298 -0.0072 -0.6836 0.7298 -0.0063 -0.6826 0.7307 -0.0063 -0.6826 0.7307 -0.0049 -0.6812 0.7321 -0.0049 -0.6812 0.7321 0.0184 -0.6468 0.7625 0.0184 -0.6468 0.7625 0.0154 -0.6442 0.7647 0.0154 -0.6442 0.7647 0.0162 -0.6423 0.7663 0.0162 -0.6423 0.7663 0.2241 -0.6441 0.7313 0.2241 -0.6441 0.7313 -0.3845 -0.5709 0.7254 -0.3845 -0.5709 0.7254 -0.3606 -0.5621 0.7443 -0.3606 -0.5621 0.7443 -0.3616 -0.5675 0.7397 -0.3616 -0.5675 0.7397 -0.3625 -0.5717 0.7360 -0.3625 -0.5717 0.7360 -0.3459 -0.3607 0.8662 -0.3459 -0.3607 0.8662 -0.3567 -0.3140 0.8798 -0.3567 -0.3140 0.8798 -0.2498 -0.2692 0.9301 -0.2498 -0.2692 0.9301 -0.2338 -0.3181 0.9188 -0.2338 -0.3181 0.9188 -0.2301 -0.3144 0.9210 -0.2301 -0.3144 0.9210 -0.2297 -0.3103 0.9225 -0.2297 -0.3103 0.9225 -0.2206 -0.3154 0.9230 -0.2206 -0.3154 0.9230 -0.2073 -0.3224 0.9236 -0.2073 -0.3224 0.9236 -0.2072 -0.4017 0.8920 -0.2072 -0.4017 0.8920 -0.1290 -0.4204 0.8981 -0.1466 -0.4129 0.8989 -0.1289 -0.4202 0.8982 -0.1290 -0.4204 0.8981 -0.0663 -0.4547 0.8881 -0.0663 -0.4547 0.8881 -0.0881 -0.4944 0.8648 -0.0881 -0.4944 0.8648 -0.1047 -0.4900 0.8654 -0.1047 -0.4900 0.8654 -0.0924 -0.5404 0.8363 -0.0924 -0.5404 0.8363 -0.1169 -0.5089 0.8529 -0.1169 -0.5089 0.8529 -0.1497 -0.5127 0.8454 -0.1497 -0.5127 0.8454 -0.1976 -0.4863 0.8512 -0.1976 -0.4863 0.8512 -0.2386 -0.5167 0.8222 -0.2386 -0.5167 0.8222 -0.1759 -0.5184 0.8368 -0.1759 -0.5184 0.8368 -0.0366 -0.5758 0.8168 -0.0366 -0.5758 0.8168 -0.0475 -0.5862 0.8088 -0.0475 -0.5862 0.8088 -0.0165 -0.6331 0.7739 -0.0165 -0.6331 0.7739 -0.0378 -0.6558 0.7540 -0.0378 -0.6558 0.7540 -0.1809 -0.5991 0.7799 -0.1809 -0.5991 0.7799 -0.3606 -0.4696 0.8059 -0.3420 -0.4876 0.8033 -0.3609 -0.4698 0.8056 -0.3606 -0.4696 0.8059 -0.3331 -0.4723 0.8161 -0.3331 -0.4723 0.8161 -0.2257 -0.4352 0.8716 -0.2257 -0.4352 0.8716 -0.2096 -0.4484 0.8689 -0.2096 -0.4484 0.8689 -0.2027 -0.3938 0.8966 -0.2027 -0.3938 0.8966 -0.1652 -0.4106 0.8967 -0.1652 -0.4106 0.8967 -0.1614 -0.4459 0.8804 -0.1614 -0.4459 0.8804 -0.1437 -0.4323 0.8902 -0.1437 -0.4323 0.8902 -0.1353 -0.4404 0.8876 -0.1353 -0.4404 0.8876 -0.1301 -0.4630 0.8768 -0.1301 -0.4630 0.8768 -0.1218 -0.4800 0.8688 -0.1218 -0.4800 0.8688 -0.0997 -0.4792 0.8720 -0.0997 -0.4792 0.8720 -0.0801 -0.4612 0.8836 -0.0801 -0.4612 0.8836 -0.0775 -0.4501 0.8896 -0.0775 -0.4501 0.8896 -0.0436 -0.4668 0.8833 -0.0436 -0.4668 0.8833 -0.0595 -0.4799 0.8753 -0.0595 -0.4799 0.8753 -0.0690 -0.5358 0.8415 -0.0690 -0.5358 0.8415 -0.1033 -0.5462 0.8313 -0.1033 -0.5462 0.8313 -0.1014 -0.5481 0.8302 -0.1014 -0.5481 0.8302 -0.1134 -0.5510 0.8268 -0.1134 -0.5510 0.8268 -0.1162 -0.5486 0.8280 -0.1162 -0.5486 0.8280 -0.1332 -0.5523 0.8229 -0.1332 -0.5523 0.8229 -0.1388 -0.5508 0.8230 -0.1388 -0.5508 0.8230 -0.1550 -0.5407 0.8268 -0.1550 -0.5407 0.8268 -0.1579 -0.5403 0.8265 -0.1579 -0.5403 0.8265 -0.1626 -0.5361 0.8283 -0.1626 -0.5361 0.8283 -0.1697 -0.5331 0.8289 -0.1697 -0.5331 0.8289 -0.1707 -0.5340 0.8281 -0.1707 -0.5340 0.8281 -0.1332 -0.4931 0.8597 -0.1332 -0.4931 0.8597 -0.1224 -0.5050 0.8544 -0.1224 -0.5050 0.8544 -0.1432 -0.5511 0.8221 -0.1432 -0.5511 0.8221 -0.0640 -0.6343 0.7704 -0.0640 -0.6343 0.7704 -0.0148 -0.6570 0.7538 -0.0148 -0.6570 0.7538 -0.0207 -0.6157 0.7877 -0.0207 -0.6157 0.7877 -0.0174 -0.6190 0.7852 -0.0174 -0.6190 0.7852 -0.0193 -0.6232 0.7818 -0.0193 -0.6232 0.7818 -0.0155 -0.6273 0.7786 -0.0155 -0.6273 0.7786 -0.0049 -0.6282 0.7780 -0.0049 -0.6282 0.7780 -0.1426 -0.5462 0.8254 -0.1426 -0.5462 0.8254 -0.1159 -0.4376 0.8917 -0.1159 -0.4376 0.8917 0.1383 -0.4685 0.8726 0.1383 -0.4685 0.8726 0.1456 -0.5170 0.8435 0.1456 -0.5170 0.8435 0.1301 -0.5360 0.8341 0.1301 -0.5360 0.8341 0.1490 -0.5342 0.8321 0.1490 -0.5342 0.8321 0.1627 -0.5493 0.8197 0.1627 -0.5493 0.8197 0.1961 -0.5140 0.8351 0.1961 -0.5140 0.8351 -0.1990 -0.3675 0.9085 -0.1990 -0.3675 0.9085 -0.1547 -0.3671 0.9172 -0.1547 -0.3671 0.9172 -0.1483 -0.3799 0.9131 -0.1483 -0.3799 0.9131 -0.0607 -0.4016 0.9138 -0.0786 -0.4013 0.9126 -0.0606 -0.4012 0.9140 -0.0607 -0.4016 0.9138 -0.0894 -0.3838 0.9191 -0.0894 -0.3838 0.9191 -0.0862 -0.4221 0.9024 -0.0862 -0.4221 0.9024 -0.0526 -0.4234 0.9044 -0.0714 -0.4238 0.9029 -0.0526 -0.4234 0.9044 -0.0321 -0.4358 0.8995 -0.0321 -0.4358 0.8995 -0.0164 -0.4532 0.8913 -0.0164 -0.4532 0.8913 0.1389 -0.5788 0.8036 0.1389 -0.5788 0.8036 0.1978 -0.5677 0.7991 0.1978 -0.5677 0.7991 0.2170 -0.6066 0.7648 0.2170 -0.6066 0.7648 0.2251 -0.5917 0.7741 0.2251 -0.5917 0.7741 0.3554 -0.5462 0.7585 0.3554 -0.5462 0.7585 0.1850 -0.5634 0.8052 0.1850 -0.5634 0.8052 0.1926 -0.5613 0.8049 0.1926 -0.5613 0.8049 0.1947 -0.5490 0.8129 0.1947 -0.5490 0.8129 0.2126 -0.5565 0.8032 0.2126 -0.5565 0.8032 0.2146 -0.5589 0.8010 0.2146 -0.5589 0.8010 0.2211 -0.5576 0.8001 0.2211 -0.5576 0.8001 0.2055 -0.6055 0.7689 0.2055 -0.6055 0.7689 0.2029 -0.6007 0.7733 0.2029 -0.6007 0.7733 -0.3904 -0.2606 0.8830 -0.3904 -0.2606 0.8830 -0.4335 -0.2399 0.8686 -0.4335 -0.2399 0.8686 -0.4892 -0.2121 0.8460 -0.4892 -0.2121 0.8460 -0.4747 -0.2099 0.8548 -0.4747 -0.2099 0.8548 -0.4421 -0.2193 0.8698 -0.4421 -0.2193 0.8698 -0.4719 -0.1798 0.8631 -0.4719 -0.1798 0.8631 -0.4677 -0.1782 0.8657 -0.4677 -0.1782 0.8657 -0.4732 -0.1411 0.8696 -0.4732 -0.1411 0.8696 -0.4617 -0.1364 0.8765 -0.4617 -0.1364 0.8765 -0.4655 -0.1335 0.8749 -0.4655 -0.1335 0.8749 -0.4562 -0.1320 0.8800 -0.4562 -0.1320 0.8800 -0.4397 -0.1308 0.8886 -0.4397 -0.1308 0.8886 -0.4059 -0.1059 0.9078 -0.4059 -0.1059 0.9078 -0.3745 -0.1390 0.9168 -0.3745 -0.1390 0.9168 -0.2995 -0.1489 0.9424 -0.2995 -0.1489 0.9424 0.1424 -0.7837 0.6046 0.1424 -0.7837 0.6047 0.1576 -0.7853 0.5987 0.1575 -0.7853 0.5987 0.1664 -0.7854 0.5962 0.1664 -0.7854 0.5962 0.1026 -0.8167 0.5678 0.1025 -0.8167 0.5679 0.1100 -0.8223 0.5583 0.1100 -0.8224 0.5582 0.1272 -0.8533 0.5056 0.1271 -0.8533 0.5057 -0.0591 -0.8462 0.5296 -0.0591 -0.8462 0.5296 -0.0941 -0.8229 0.5604 -0.0941 -0.8229 0.5604 0.0269 -0.7977 0.6025 0.0269 -0.7976 0.6025 0.0514 -0.8373 0.5443 0.0514 -0.8373 0.5443 0.0552 -0.8313 0.5531 0.0552 -0.8313 0.5531 0.1753 -0.6348 0.7525 0.1753 -0.6348 0.7525 0.2031 -0.6271 0.7520 0.2031 -0.6271 0.7520 0.1683 -0.6609 0.7314 0.1683 -0.6609 0.7314 0.1134 -0.6473 0.7538 0.1134 -0.6473 0.7538 0.1390 -0.6231 0.7697 0.1390 -0.6231 0.7697 0.2055 -0.6757 0.7079 0.2055 -0.6757 0.7079 0.0197 -0.7166 0.6972 0.0197 -0.7166 0.6972 -0.0549 -0.6642 0.7456 -0.0549 -0.6642 0.7456 -0.0427 -0.6889 0.7236 -0.0427 -0.6889 0.7236 0.1486 -0.6575 0.7387 0.1486 -0.6575 0.7387 0.1469 -0.6554 0.7409 0.1469 -0.6554 0.7409 0.1449 -0.6553 0.7413 0.1449 -0.6553 0.7413 0.1327 -0.6600 0.7395 0.1327 -0.6600 0.7395 0.1235 -0.6634 0.7380 0.1235 -0.6634 0.7380 0.1314 -0.6982 0.7037 0.1314 -0.6982 0.7037 -0.2509 -0.7082 0.6599 -0.2509 -0.7082 0.6599 -0.3650 -0.7495 0.5523 -0.3650 -0.7495 0.5523 -0.3865 -0.6715 0.6323 -0.3865 -0.6715 0.6323 -0.3893 -0.6246 0.6770 -0.3893 -0.6246 0.6770 -0.2987 -0.5982 0.7436 -0.2987 -0.5982 0.7436 -0.2753 -0.6137 0.7400 -0.2753 -0.6137 0.7400 -0.2150 -0.7095 0.6711 -0.2150 -0.7095 0.6711 -0.2138 -0.7061 0.6750 -0.2138 -0.7061 0.6750 -0.2470 -0.6686 0.7014 -0.2470 -0.6686 0.7014 -0.1543 -0.7352 0.6600 -0.1543 -0.7352 0.6600 -0.1902 -0.7111 0.6768 -0.1902 -0.7111 0.6768 -0.3943 -0.6941 0.6023 -0.3943 -0.6941 0.6023 0.2912 -0.1501 0.9448 0.2912 -0.1501 0.9448 0.2924 -0.1392 0.9461 0.2924 -0.1392 0.9461 0.2670 -0.1233 0.9558 0.2670 -0.1233 0.9558 0.2422 -0.0893 0.9661 0.2422 -0.0893 0.9661 0.1997 -0.0636 0.9778 0.1997 -0.0636 0.9778 0.1981 -0.0694 0.9777 0.1981 -0.0694 0.9777 0.1921 -0.0659 0.9792 0.1921 -0.0659 0.9792 0.1897 -0.0661 0.9796 0.1897 -0.0661 0.9796 0.1812 -0.0631 0.9814 0.1812 -0.0631 0.9814 0.1782 -0.0569 0.9824 0.1782 -0.0569 0.9824 0.1617 -0.0559 0.9853 0.1617 -0.0559 0.9853 0.1374 -0.0465 0.9894 0.1374 -0.0465 0.9894 0.1323 -0.0487 0.9900 0.1323 -0.0487 0.9900 0.0932 -0.0754 0.9928 0.0932 -0.0754 0.9928 0.0936 -0.0779 0.9926 0.0936 -0.0779 0.9926 0.0933 -0.0789 0.9925 0.0933 -0.0789 0.9925 0.0835 -0.0938 0.9921 0.0835 -0.0938 0.9921 0.1441 -0.2248 0.9637 0.1441 -0.2248 0.9637 0.1524 -0.2313 0.9609 0.1524 -0.2313 0.9609 0.1683 -0.2422 0.9555 0.1683 -0.2422 0.9555 0.1736 -0.2480 0.9531 0.1736 -0.2480 0.9531 0.1651 -0.2404 0.9565 0.1651 -0.2404 0.9565 0.1756 -0.2557 0.9507 0.1756 -0.2557 0.9507 0.2228 -0.2870 0.9317 0.2228 -0.2870 0.9317 0.2251 -0.2864 0.9313 0.2251 -0.2864 0.9313 0.2207 -0.2928 0.9304 0.2207 -0.2928 0.9304 0.1329 -0.3361 0.9324 0.1329 -0.3361 0.9324 0.1307 -0.3214 0.9379 0.1307 -0.3214 0.9379 0.1338 -0.3221 0.9372 0.1338 -0.3221 0.9372 0.1014 -0.3084 0.9458 0.1014 -0.3084 0.9458 0.0914 -0.3027 0.9487 0.0914 -0.3027 0.9487 0.0924 -0.3010 0.9491 0.0924 -0.3010 0.9491 0.0163 -0.3398 0.9404 0.0163 -0.3398 0.9404 0.0703 -0.3571 0.9314 0.0703 -0.3571 0.9314 0.0698 -0.3623 0.9294 0.0698 -0.3623 0.9294 0.0955 -0.3509 0.9315 0.0955 -0.3509 0.9315 0.0991 -0.3535 0.9302 0.0991 -0.3535 0.9302 -0.0012 -0.3516 0.9362 -0.0012 -0.3516 0.9362 -0.0043 -0.3523 0.9359 -0.0043 -0.3523 0.9359 -0.0089 -0.3439 0.9389 -0.0089 -0.3439 0.9389 -0.0343 -0.2923 0.9557 -0.0343 -0.2923 0.9557 -0.0260 -0.2636 0.9643 -0.0260 -0.2636 0.9643 -0.0340 -0.2630 0.9642 -0.0340 -0.2630 0.9642 -0.0261 -0.2472 0.9686 -0.0261 -0.2472 0.9686 -0.0515 -0.2351 0.9706 -0.0515 -0.2351 0.9706 -0.1249 -0.2089 0.9699 -0.1249 -0.2089 0.9699 -0.0454 -0.1982 0.9791 -0.0454 -0.1982 0.9791 0.0068 -0.2002 0.9797 0.0068 -0.2002 0.9797 -0.0143 -0.1613 0.9868 -0.0143 -0.1613 0.9868 0.1584 -0.2343 0.9592 0.1584 -0.2343 0.9592 0.1671 -0.2446 0.9551 0.1671 -0.2446 0.9551 -0.0189 -0.2416 0.9702 -0.0189 -0.2416 0.9702 0.2008 -0.2568 0.9454 0.2008 -0.2568 0.9454 0.2039 -0.2592 0.9440 0.2039 -0.2592 0.9440 0.3283 -0.2346 0.9150 0.3283 -0.2346 0.9150 0.3296 -0.2428 0.9124 0.3296 -0.2428 0.9124 0.3285 -0.2452 0.9121 0.3285 -0.2452 0.9121 0.3286 -0.2464 0.9117 0.3286 -0.2464 0.9117 0.3300 -0.2489 0.9106 0.3300 -0.2489 0.9106 0.3223 -0.2666 0.9083 0.3223 -0.2666 0.9083 0.3400 -0.2981 0.8920 0.3400 -0.2981 0.8920 0.3395 -0.3002 0.8914 0.3395 -0.3002 0.8914 0.3404 -0.3023 0.8904 0.3404 -0.3023 0.8904 0.3502 -0.3180 0.8810 0.3502 -0.3180 0.8810 0.3563 -0.3314 0.8736 0.3563 -0.3314 0.8736 0.3643 -0.3441 0.8654 0.3643 -0.3441 0.8654 0.3636 -0.3451 0.8653 0.3636 -0.3451 0.8653 0.3222 -0.3604 0.8754 0.3222 -0.3604 0.8754 0.3175 -0.3591 0.8776 0.3175 -0.3591 0.8776 0.3049 -0.3588 0.8822 0.3049 -0.3588 0.8822 0.2872 -0.3501 0.8916 0.2872 -0.3501 0.8916 0.2861 -0.3488 0.8925 0.2861 -0.3488 0.8925 0.2793 -0.3477 0.8950 0.2793 -0.3477 0.8950 0.2698 -0.3345 0.9030 0.2698 -0.3345 0.9030 0.2718 -0.3334 0.9028 0.2718 -0.3334 0.9028 0.2496 -0.3304 0.9102 0.2496 -0.3304 0.9102 0.0501 -0.1308 0.9901 0.0457 -0.1368 0.9895 0.0501 -0.1308 0.9901 0.1163 -0.3131 0.9426 0.1163 -0.3131 0.9426 0.3008 -0.8804 0.3667 0.3008 -0.8804 0.3667 0.2801 -0.8859 0.3697 0.2801 -0.8859 0.3697 0.2614 -0.8853 0.3845 0.2614 -0.8853 0.3845 0.2603 -0.8857 0.3844 0.2603 -0.8857 0.3844 0.2147 -0.8871 0.4085 0.2147 -0.8871 0.4085 0.2121 -0.8865 0.4114 0.2121 -0.8865 0.4114 0.1930 -0.8904 0.4123 0.1930 -0.8904 0.4123 0.1895 -0.8918 0.4108 0.1895 -0.8918 0.4108 0.1894 -0.8806 0.4343 0.1894 -0.8806 0.4343 0.1928 -0.8752 0.4436 0.1928 -0.8752 0.4436 0.3962 -0.8626 0.3147 0.3962 -0.8626 0.3147 0.4097 -0.8552 0.3173 0.4097 -0.8552 0.3173 0.4339 -0.8467 0.3079 0.4339 -0.8467 0.3079 0.4642 -0.8401 0.2808 0.4642 -0.8401 0.2808 0.3021 -0.9040 0.3026 0.3021 -0.9040 0.3026 0.2755 -0.8980 0.3430 0.2755 -0.8980 0.3430 0.1617 -0.9277 0.3365 0.1617 -0.9277 0.3365 0.1652 -0.9269 0.3370 0.1652 -0.9269 0.3370 0.1443 -0.9084 0.3925 0.1443 -0.9084 0.3925 0.1505 -0.9069 0.3936 0.1505 -0.9069 0.3936 0.1544 -0.9076 0.3905 0.1544 -0.9076 0.3905 0.1562 -0.9065 0.3921 0.1562 -0.9065 0.3921 0.1584 -0.9063 0.3918 0.1584 -0.9063 0.3918 0.1606 -0.9067 0.3899 0.1606 -0.9067 0.3899 0.1943 -0.9045 0.3796 0.1943 -0.9045 0.3796 0.2329 -0.9055 0.3548 0.2329 -0.9055 0.3548 0.1813 -0.9174 0.3543 0.1813 -0.9174 0.3543 0.1857 -0.9168 0.3535 0.1857 -0.9168 0.3535 0.1789 -0.9175 0.3553 0.1789 -0.9175 0.3553 0.1770 -0.9173 0.3566 0.1770 -0.9173 0.3566 0.1745 -0.9171 0.3584 0.1745 -0.9171 0.3584 -0.1244 -0.9132 0.3881 -0.1244 -0.9132 0.3881 -0.1249 -0.9135 0.3871 -0.1249 -0.9135 0.3871 -0.1241 -0.9198 0.3723 -0.1241 -0.9198 0.3723 -0.3201 -0.8423 0.4336 -0.3201 -0.8423 0.4336 -0.3122 -0.8310 0.4604 -0.3122 -0.8310 0.4604 -0.3641 -0.8064 0.4660 -0.3641 -0.8064 0.4660 -0.3364 -0.8466 0.4126 -0.3364 -0.8466 0.4126 -0.3050 -0.8364 0.4554 -0.3050 -0.8364 0.4554 0.0306 -0.9523 0.3037 0.0306 -0.9523 0.3037 0.0324 -0.9528 0.3017 0.0324 -0.9528 0.3017 0.0362 -0.9541 0.2974 0.0362 -0.9541 0.2974 0.0386 -0.9729 0.2280 0.0386 -0.9729 0.2280 0.1183 -0.9703 0.2111 0.1183 -0.9703 0.2111 0.1072 -0.9723 0.2077 0.1072 -0.9723 0.2077 0.0710 -0.9764 0.2039 0.0710 -0.9764 0.2039 0.0852 -0.9773 0.1942 0.0852 -0.9773 0.1942 0.0829 -0.9809 0.1757 0.0829 -0.9809 0.1757 0.1368 -0.9777 0.1594 0.1368 -0.9777 0.1594 0.1529 -0.9790 0.1349 0.1529 -0.9790 0.1349 0.2924 -0.9012 0.3198 0.2924 -0.9012 0.3198 0.2961 -0.9007 0.3178 0.2961 -0.9007 0.3178 -0.1081 -0.9430 0.3148 -0.1081 -0.9430 0.3148 -0.1959 -0.9292 0.3134 -0.1857 -0.9298 0.3179 -0.1959 -0.9292 0.3134 -0.1857 -0.9298 0.3179 -0.1521 -0.9275 0.3415 -0.1521 -0.9275 0.3415 -0.1674 -0.9241 0.3436 -0.1674 -0.9241 0.3436 -0.1744 -0.9231 0.3428 -0.1744 -0.9231 0.3428 -0.2093 -0.9141 0.3473 -0.2093 -0.9141 0.3473 -0.2194 -0.9076 0.3580 -0.2194 -0.9076 0.3580 -0.2419 -0.8963 0.3717 -0.2419 -0.8963 0.3717 -0.2818 -0.8622 0.4209 -0.2818 -0.8622 0.4209 -0.2351 -0.8546 0.4630 -0.2351 -0.8546 0.4630 -0.2838 -0.8469 0.4497 -0.2838 -0.8469 0.4497 -0.2999 -0.8293 0.4715 -0.2999 -0.8293 0.4715 -0.2946 -0.8203 0.4902 -0.2946 -0.8203 0.4902 -0.2856 -0.8123 0.5085 -0.2856 -0.8123 0.5085 -0.1332 -0.9366 0.3241 -0.1333 -0.9366 0.3242 -0.0624 -0.9533 0.2955 -0.0624 -0.9533 0.2955 -0.0463 -0.9583 0.2820 -0.0463 -0.9583 0.2820 0.0209 -0.9702 0.2416 0.0210 -0.9702 0.2416 0.1127 -0.9626 0.2462 0.1127 -0.9626 0.2462 0.1082 -0.9657 0.2360 0.1082 -0.9657 0.2360 0.0686 -0.9753 0.2101 0.0686 -0.9753 0.2101 0.1723 -0.9722 0.1588 0.1729 -0.9722 0.1581 0.1729 -0.9722 0.1581 0.1743 -0.9720 0.1575 0.1743 -0.9720 0.1575 0.1746 -0.9720 0.1573 0.1746 -0.9720 0.1572 0.1745 -0.9715 0.1604 0.1745 -0.9715 0.1604 0.1742 -0.9713 0.1619 0.1742 -0.9713 0.1619 0.1723 -0.9722 0.1588 0.2059 -0.9775 0.0452 0.2059 -0.9775 0.0452 0.2172 -0.5178 -0.8275 0.2172 -0.5178 -0.8275 0.2150 -0.5190 -0.8273 0.2150 -0.5190 -0.8273 0.2183 -0.5183 -0.8269 0.2184 -0.5183 -0.8269 0.2155 -0.5238 -0.8241 0.2155 -0.5238 -0.8241 0.1967 -0.5337 -0.8225 0.1967 -0.5337 -0.8225 0.1952 -0.5348 -0.8221 0.1952 -0.5348 -0.8221 0.1925 -0.5427 -0.8175 0.1926 -0.5427 -0.8175 0.1978 -0.5502 -0.8112 0.1978 -0.5502 -0.8113 0.1675 -0.5823 -0.7956 0.1675 -0.5823 -0.7956 0.1698 -0.5861 -0.7922 0.1698 -0.5862 -0.7922 0.1727 -0.5939 -0.7857 0.1727 -0.5939 -0.7857 0.1743 -0.5994 -0.7812 0.1742 -0.5995 -0.7812 0.1713 -0.6002 -0.7813 0.1712 -0.6003 -0.7813 0.1704 -0.5994 -0.7821 0.1704 -0.5994 -0.7821 0.1620 -0.5930 -0.7887 0.1620 -0.5931 -0.7887 0.1609 -0.5916 -0.7900 0.1609 -0.5916 -0.7900 0.1621 -0.6058 -0.7790 0.1621 -0.6058 -0.7789 0.1682 -0.6035 -0.7794 0.1682 -0.6036 -0.7794 0.1697 -0.6029 -0.7796 0.1697 -0.6030 -0.7795 0.1679 -0.6124 -0.7725 0.1679 -0.6125 -0.7725 0.1670 -0.6140 -0.7714 0.1670 -0.6140 -0.7714 0.1633 -0.6104 -0.7751 0.1632 -0.6104 -0.7751 0.1740 -0.6240 -0.7618 0.1739 -0.6241 -0.7617 0.1624 -0.6284 -0.7608 0.1624 -0.6284 -0.7608 0.1676 -0.6343 -0.7547 0.1675 -0.6344 -0.7546 0.1687 -0.6364 -0.7526 0.1688 -0.6364 -0.7527 0.1702 -0.6372 -0.7517 0.1702 -0.6372 -0.7517 0.1778 -0.6380 -0.7493 0.1777 -0.6380 -0.7492 0.1817 -0.6374 -0.7488 0.1817 -0.6374 -0.7488 0.1796 -0.6384 -0.7484 0.1796 -0.6384 -0.7484 0.1772 -0.6409 -0.7469 0.1772 -0.6409 -0.7469 0.1833 -0.6739 -0.7157 0.1832 -0.6739 -0.7157 0.1868 -0.6745 -0.7143 0.1868 -0.6745 -0.7142 0.1914 -0.6690 -0.7182 0.1914 -0.6690 -0.7182 0.1938 -0.6669 -0.7195 0.1938 -0.6670 -0.7194 0.1933 -0.6646 -0.7218 0.1933 -0.6646 -0.7218 0.1944 -0.6743 -0.7124 0.1943 -0.6743 -0.7124 0.1946 -0.6817 -0.7053 0.1946 -0.6817 -0.7053 0.1992 -0.6805 -0.7051 0.1991 -0.6806 -0.7051 0.2058 -0.6843 -0.6995 0.2057 -0.6844 -0.6995 0.1922 -0.6859 -0.7018 0.1922 -0.6859 -0.7018 0.1985 -0.6855 -0.7004 0.1985 -0.6855 -0.7005 0.2002 -0.6854 -0.7001 0.2001 -0.6855 -0.7000 0.2004 -0.6870 -0.6984 0.2004 -0.6871 -0.6984 0.2076 -0.6885 -0.6949 0.2076 -0.6886 -0.6948 0.2019 -0.6889 -0.6962 0.2019 -0.6889 -0.6962 0.1987 -0.6871 -0.6989 0.1988 -0.6871 -0.6989 0.1937 -0.6903 -0.6971 0.1936 -0.6904 -0.6971 0.1950 -0.6920 -0.6950 0.1949 -0.6920 -0.6950 0.2149 -0.7076 -0.6732 0.2149 -0.7076 -0.6732 0.2224 -0.7073 -0.6710 0.2225 -0.7073 -0.6710 0.2173 -0.7123 -0.6674 0.2173 -0.7123 -0.6674 0.2240 -0.5244 -0.8215 0.2241 -0.5244 -0.8215 0.2278 -0.5238 -0.8208 0.2278 -0.5238 -0.8209 0.2239 -0.5281 -0.8191 0.2240 -0.5281 -0.8191 0.3634 -0.6869 -0.6294 0.3634 -0.6869 -0.6294 0.4144 -0.9089 -0.0472 0.4144 -0.9089 -0.0472 0.5776 -0.8153 -0.0416 0.5776 -0.8152 -0.0416 0.5853 -0.6631 -0.4666 0.5853 -0.6631 -0.4666 0.5924 -0.6717 -0.4449 0.5924 -0.6717 -0.4449 0.6516 -0.7580 -0.0300 0.6516 -0.7580 -0.0300 0.6272 -0.7782 -0.0319 0.6272 -0.7782 -0.0319 0.6425 -0.7662 0.0064 0.6425 -0.7662 0.0064 0.6423 -0.7663 0.0152 0.6423 -0.7663 0.0152 0.6435 -0.7652 0.0181 0.6435 -0.7652 0.0181 0.6360 -0.7707 0.0394 0.6360 -0.7707 0.0394 0.7563 -0.6109 -0.2341 0.7563 -0.6109 -0.2341 0.7595 -0.6097 -0.2269 0.7595 -0.6097 -0.2269 0.7123 -0.7000 -0.0512 0.7123 -0.7000 -0.0512 0.7078 -0.7060 -0.0237 0.7078 -0.7060 -0.0237 0.6074 -0.6722 -0.4232 0.6074 -0.6722 -0.4232 0.6311 -0.6607 -0.4065 0.6311 -0.6607 -0.4065 0.4650 -0.8592 0.2134 0.4650 -0.8592 0.2134 0.4669 -0.8573 0.2169 0.4669 -0.8573 0.2169 0.4668 -0.8570 0.2183 0.4668 -0.8570 0.2183 0.4683 -0.8557 0.2204 0.4683 -0.8557 0.2204 0.4693 -0.8537 0.2257 0.4693 -0.8537 0.2257 0.3457 -0.3463 -0.8721 0.3457 -0.3463 -0.8721 0.4519 -0.2320 -0.8614 0.4519 -0.2320 -0.8614 0.2973 -0.5433 -0.7851 0.2973 -0.5434 -0.7851 0.3093 -0.5421 -0.7813 0.3094 -0.5421 -0.7812 0.3149 -0.5409 -0.7799 0.3150 -0.5409 -0.7799 0.0060 -0.9997 -0.0234 0.0060 -0.9997 -0.0234 -0.0084 -0.9999 0.0064 -0.0084 -0.9999 0.0064 -0.0140 -0.9998 0.0113 -0.0140 -0.9998 0.0113 0.2261 -0.6704 -0.7067 0.2261 -0.6704 -0.7067 0.2234 -0.6726 -0.7055 0.2232 -0.6727 -0.7055 0.2242 -0.5353 -0.8144 0.2242 -0.5353 -0.8144 0.2536 -0.6512 -0.7153 0.2536 -0.6512 -0.7153 0.3703 -0.8691 -0.3280 0.3703 -0.8691 -0.3280 0.4595 -0.7025 -0.5434 0.4787 -0.6950 -0.5364 0.4787 -0.6950 -0.5364 0.4595 -0.7026 -0.5434 0.5003 -0.6670 -0.5521 0.5003 -0.6670 -0.5521 0.6058 -0.6883 -0.3992 0.6058 -0.6883 -0.3992 0.6152 -0.6870 -0.3868 0.6152 -0.6870 -0.3868 0.4541 -0.8807 0.1347 0.4541 -0.8807 0.1347 -0.1890 -0.1232 -0.9742 -0.1890 -0.1232 -0.9742 -0.1986 -0.1297 -0.9715 -0.1986 -0.1297 -0.9715 -0.2049 -0.1334 -0.9697 -0.2049 -0.1334 -0.9697 -0.2002 -0.1497 -0.9683 -0.2002 -0.1497 -0.9683 -0.1235 -0.2404 -0.9628 -0.1235 -0.2404 -0.9628 -0.0042 -0.3598 -0.9330 -0.0042 -0.3598 -0.9330 -0.1957 -0.1268 -0.9724 -0.1957 -0.1268 -0.9724 -0.1949 -0.1243 -0.9729 -0.1949 -0.1243 -0.9729 -0.1957 -0.1203 -0.9733 -0.1957 -0.1203 -0.9733 -0.1914 -0.1182 -0.9744 -0.1914 -0.1182 -0.9744 -0.1999 -0.1153 -0.9730 -0.1999 -0.1153 -0.9730 -0.1915 -0.1088 -0.9754 -0.1915 -0.1088 -0.9754 0.1501 -0.3631 -0.9196 0.1501 -0.3631 -0.9196 0.2091 -0.3974 -0.8935 0.2091 -0.3974 -0.8935 0.2077 -0.4024 -0.8916 0.2077 -0.4024 -0.8916 0.2147 -0.3851 -0.8976 0.2147 -0.3851 -0.8976 0.2372 -0.3631 -0.9011 0.2372 -0.3631 -0.9011 0.3271 -0.0447 -0.9439 0.3271 -0.0447 -0.9439 -0.0430 -0.2946 -0.9547 -0.0430 -0.2946 -0.9547 -0.0285 -0.2973 -0.9544 -0.0285 -0.2973 -0.9544 -0.0180 -0.2979 -0.9544 -0.0180 -0.2979 -0.9544 0.1083 -0.2815 -0.9534 0.1083 -0.2815 -0.9534 0.2186 -0.4013 -0.8895 0.2186 -0.4013 -0.8895 0.1610 -0.3230 -0.9326 0.1610 -0.3230 -0.9326 0.1448 -0.2626 -0.9540 0.1448 -0.2626 -0.9540 0.7279 0.4596 0.5088 0.7397 0.4487 0.5016 0.7398 0.4468 0.5030 0.7247 0.4508 0.5212 0.7369 0.4345 0.5179 0.7418 0.4262 0.5178 0.7400 0.4467 0.5027 0.7384 0.4337 0.5164 0.6798 0.4871 0.5482 0.6812 0.4880 0.5458 0.7230 0.4572 0.5179 0.7258 0.4592 0.5122 0.7258 0.4592 0.5122 0.7276 0.4600 0.5089 0.7258 0.4592 0.5122 0.7263 0.4599 0.5109 0.7278 0.4601 0.5085 0.7285 0.4615 0.5063 0.7285 0.4654 0.5027 0.7301 0.4666 0.4993 -0.3468 0.7212 0.5996 -0.3516 0.7097 0.6105 -0.3697 0.7315 0.5729 -0.3763 0.7337 0.5658 -0.3549 0.7274 0.5873 -0.3698 0.7315 0.5728 -0.4344 0.7470 0.5033 -0.4176 0.7362 0.5326 -0.3763 0.7337 0.5658 -0.4096 0.7297 0.5474 -0.4170 0.7346 0.5352 -0.3543 0.7254 0.5901 -0.3549 0.7274 0.5873 -0.3515 0.6931 0.6294 -0.3542 0.6900 0.6312 -0.3442 0.6854 0.6417 -0.3542 0.6900 0.6312 -0.3468 0.7212 0.5996 -0.3543 0.7254 0.5901 -0.3515 0.7098 0.6104 -0.3515 0.6931 0.6294 0.3741 0.2603 0.8901 0.3748 0.2605 0.8898 0.3637 0.2483 0.8978 0.3619 0.2466 0.8990 0.3594 0.2452 0.9004 0.3530 0.2458 0.9028 0.3892 0.2945 0.8728 0.3892 0.2932 0.8733 0.3902 0.2864 0.8751 0.3935 0.2853 0.8739 0.3950 0.2843 0.8736 0.3947 0.2813 0.8747 0.3913 0.3130 0.8654 0.3952 0.3126 0.8638 0.4767 0.4570 0.7510 0.4750 0.4596 0.7505 0.4752 0.4621 0.7488 0.4720 0.4648 0.7491 0.7260 0.3077 0.6151 0.7261 0.3084 0.6145 0.6588 0.2256 0.7176 0.6571 0.2400 0.7145 0.6065 0.0809 0.7909 0.6189 0.0729 0.7821 0.5998 0.1243 0.7905 0.6003 0.1242 0.7901 0.5735 0.1026 0.8128 0.5819 0.0935 0.8079 0.5940 0.1359 0.7929 0.5924 0.1423 0.7930 0.5927 0.1431 0.7926 0.5926 0.1418 0.7930 0.5940 0.1359 0.7929 0.5910 0.1388 0.7946 0.6649 0.1068 0.7392 0.6649 0.1074 0.7392 0.6570 0.0667 0.7509 0.6553 0.0789 0.7512 0.6554 0.0795 0.7511 0.6544 0.0888 0.7509 0.5998 0.1239 0.7905 0.6027 0.0973 0.7920 0.6041 0.0950 0.7913 0.6041 0.0950 0.7913 0.6065 0.0809 0.7909 0.6682 0.0889 0.7386 0.6628 0.0881 0.7436 0.6685 0.0891 0.7383 0.6544 0.0888 0.7509 0.6081 0.0530 0.7921 0.6072 0.0488 0.7930 0.0053 -0.8647 0.5022 -0.0004 -0.8664 0.4993 0.0006 -0.8666 0.4990 -0.0185 -0.8686 0.4952 0.0228 -0.7499 0.6611 0.0310 -0.7439 0.6676 0.0150 -0.7507 0.6605 0.0228 -0.7499 0.6612 0.1728 -0.9717 0.1610 0.1729 -0.9716 0.1617 0.1768 -0.9715 0.1582 0.1790 -0.9715 0.1556 0.7315 0.4464 0.5154 0.7255 0.4543 0.5170 0.7263 0.4534 0.5166 0.7310 0.4464 0.5161 0.7400 0.4468 0.5027 0.7297 0.4402 0.5232 0.7388 0.4395 0.5109 0.7424 0.4272 0.5160 0.6189 0.7162 -0.3225 0.6194 0.7069 -0.3415 0.6193 0.7067 -0.3420 0.6196 0.6985 -0.3582 0.6195 0.6985 -0.3583 0.6189 0.6837 -0.3868 0.6581 0.4912 0.5706 0.6567 0.4906 0.5728 0.6581 0.4912 0.5706 0.6581 0.4901 0.5716 0.6582 0.4910 0.5708 0.6570 0.4903 0.5727 0.6578 0.4901 0.5719 0.6575 0.4906 0.5719 0.6572 0.4909 0.5719 0.6568 0.4905 0.5727 0.6571 0.4909 0.5721 0.6571 0.4906 0.5722 0.6807 0.4868 0.5474 0.6812 0.4880 0.5458 0.6811 0.4874 0.5464 0.6808 0.4879 0.5463 0.6844 0.4901 0.5398 0.6880 0.4930 0.5326 0.6879 0.4929 0.5328 0.6883 0.4921 0.5329 -0.3303 0.7462 0.5780 -0.3264 0.7514 0.5734 -0.3781 0.7313 0.5677 -0.3846 0.7295 0.5657 -0.4263 0.7404 0.5197 -0.4190 0.7378 0.5293 -0.3846 0.7295 0.5657 -0.3853 0.7296 0.5650 -0.4164 0.7344 0.5360 -0.4275 0.7263 0.5382 -0.4280 0.7263 0.5379 -0.4343 0.7224 0.5381 -0.3183 0.8435 0.4326 -0.3175 0.8440 0.4323 0.3930 0.3085 0.8663 0.3952 0.2999 0.8682 0.5552 0.2654 0.7883 0.5585 0.2520 0.7903 0.4374 0.3312 0.8361 0.4463 0.3414 0.8272 0.4141 0.2672 0.8702 0.4292 0.2582 0.8655 0.6011 0.0769 0.7954 0.6065 0.0809 0.7909 0.5960 0.1309 0.7922 0.5998 0.1243 0.7905 0.5798 0.1090 0.8074 0.5866 0.1094 0.8025 0.5893 0.1388 0.7959 0.5807 0.1488 0.8004 0.5924 0.1477 0.7920 0.5931 0.1443 0.7921 0.5936 0.1556 0.7896 0.5927 0.1502 0.7913 0.5940 0.0856 0.7999 0.5975 0.0765 0.7982 0.7115 0.0584 0.7002 0.7141 0.0586 0.6976 0.7226 0.0529 0.6892 0.7191 0.0585 0.6924 0.7258 0.0449 0.6864 0.7238 0.0180 0.6897 0.6664 0.0865 0.7405 0.6712 0.0795 0.7370 0.6778 0.0651 0.7324 0.6777 0.0630 0.7327 0.6570 0.0667 0.7509 0.6563 0.0648 0.7517 0.4894 0.1396 0.8608 0.4910 0.1408 0.8597 0.5024 0.1249 0.8556 0.5050 0.1276 0.8537 0.5032 0.1375 0.8532 0.5036 0.1398 0.8525 0.5022 0.1436 0.8527 0.5016 0.1477 0.8524 0.5044 0.1350 0.8528 0.5039 0.1356 0.8530 0.5719 0.1813 0.8000 0.5707 0.1849 0.8001 0.4261 0.2291 0.8752 0.4279 0.2344 0.8729 -0.2792 -0.5766 0.7678 -0.2791 -0.5771 0.7675 -0.0929 -0.6336 0.7680 -0.0929 -0.6368 0.7654 0.1427 -0.8819 0.4493 0.1535 -0.8874 0.4347 0.1882 -0.7060 0.6827 0.1796 -0.7063 0.6848 0.1747 -0.7071 0.6852 0.1728 -0.7080 0.6847 0.1678 -0.7116 0.6822 0.1408 -0.7174 0.6823 0.2068 -0.6922 0.6914 0.2056 -0.6986 0.6853 0.2475 -0.7039 0.6657 0.2489 -0.7028 0.6664 0.1363 -0.7157 0.6850 0.1366 -0.7200 0.6804 -0.1002 -0.7429 0.6619 -0.0948 -0.7441 0.6613 -0.4085 -0.6667 0.6234 -0.4124 -0.6692 0.6181 savi1.6.0/oogl/Makefile0000644000175000017500000000133414423445060014036 0ustar lloydlloyd# # Makefile - savi oogl directory. Run top-level Makefile instead. # # $Id: Makefile 8 2019-01-24 04:33:00Z lloydwood $ SHELL = /bin/sh RM = /bin/rm -f OTHER_SRCS = savi.oogl savilogo.oogl \ stars_h.oogl stars.oogl ambient_light.oogl \ earth_h.oogl earth.oogl earth_fancy_h.oog earth_fancy.oogl \ Earth.ppm.Z blue_marble_land_shallow_topo_2048.jpeg \ earth_vect_h.oogl earth.vect \ earth_texture_h.oogl \ earth_coverage_h.oogl earth_coverage.oogl \ earth_coverage_unp_h.oogl earth_coverage_unp.oogl all: clean: $(RM) *~ $(CLEAN_FILES) tarfilelist: @srcs="Makefile $(SRCS) $(OTHER_SRCS)" ; \ for i in $$srcs ; do \ echo "$(CURRENT_DIR)/$$i" >> $(TOP)/fileslist ; \ done savi1.6.0/oogl/earth_fancy_h.oogl0000644000175000017500000000010314423445060016043 0ustar lloydlloyd(read geometry { define earth_h < "$SAVI/oogl/earth_fancy.oogl" }) savi1.6.0/savi0000755000175000017500000001763414423444222012337 0ustar lloydlloyd#! /bin/sh ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # Script that is always used to launch the binary SaVi executable # # $Id: savi,v 1.87 2017/06/26 04:17:00 lloydwood Exp $ # # If SAVI environment variable indicating directory is undefined # then set it to be the path of this file. Make this the directory. # : ${SAVI:=`dirname "$0"`} SAVI=$(cd "${SAVI}" && pwd) # # If this script is moved from the SaVi installation tree and run # elsewhere, then uncomment the following line: # SAVI=/usr/lib/savi # and replace /usr/lib/savi with the location of # your SaVi installation. # export SAVI # # Default executable absolute location and name # SAVIBIN="${SAVI}/bin/SaVi" # # Set locations of tcl and tk library code needed at runtime # Cygwin and Mac OS X may be special cases, handled later. # The version numbers used here should match the versions given # in the src/Makefile_defs_ARCH file used to compile SaVi. # Try under /usr/lib and /usr/local/lib. # If using other versions or locations, insert in the next lines. # TCL_LIBRARY="" TK_LIBRARY="" if [ ! -d "$TK_LIBRARY" ]; then TCL_LIBRARY=/usr/lib/tcl8.6 TK_LIBRARY=/usr/lib/tk8.6 elif [ ! -d "$TK_LIBRARY" ]; then TCL_LIBRARY=/usr/local/lib/tcl8.6 TK_LIBRARY=/usr/local/lib/tk8.6 elif [ ! -d "$TK_LIBRARY" ]; then TCL_LIBRARY=/usr/lib/tcl8.5 TK_LIBRARY=/usr/lib/tk8.5 elif [ ! -d "$TK_LIBRARY" ]; then TCL_LIBRARY=/usr/local/lib/tcl8.5 TK_LIBRARY=/usr/local/lib/tk8.5 elif [ ! -d "$TK_LIBRARY" ]; then # SGI IRIX Nekoware TCL_LIBRARY=/usr/nekoware/lib TK_LIBRARY=/usr/nekoware/lib fi if [ ! -d "$TK_LIBRARY" ]; then # reasonable default, also default for Mac OS X. TCL_LIBRARY=/usr/lib TK_LIBRARY=/usr/lib fi # # Default parameters to pass to executable # params="" # start messages on clean line echo # # Check for known machine types # if [ -f /etc/debian_version ]; then # Debian GNU/kFreeBSD is Debian, but not Linux, so we test first. # Ubuntu is the most popular Debian variant; clue for ubuntu users. ARCH=ubuntu elif [ -f /vmlinuz -o -f /boot/vmlinuz ]; then # test doesn't handle changed vmlinuz- directories. ARCH=linux elif [ -d /devices ]; then ARCH=sun elif [ -d /usr/bsd -a -d /usr/sbin ]; then ARCH=irix elif [ -d /proc/cygdrive ]; then ARCH=cygwin if [ ! -d /usr/lib/tk8.6 ]; then # unix port of Tk 8.6 not installed if [ ! -d /usr/lib/tk8.5 ]; then # unix port of Tk 8.5 not installed if [ -d /usr/share/tk/8.4 ]; then # Insight Tk 8.4 is installed and still in use. echo "SaVi: detected legacy Insight Tcl/Tk 8.4 in Cygwin." >&2 ARCH=cygwin84 TCL_LIBRARY=/user/share/tcl8.4 TK_LIBRARY=/usr/share/tk8.4 fi fi fi elif [ -d /System ]; then ARCH=macosx # Mac OS X installs libraries in shared folder /usr/lib, selected above. # Tk in 10.5 Leopard has menubar bugs. # Not required by 10.6 Snow Leopard or 10.4 Tiger users if [ -d /Developer/SDKs ]; then # we can guess version from libraries available if [ ! -d /Developer/SDKs/MacOSX10.7.sdk ]; then # We're not later than 10.6. 10.7 has 10.7+10.6 SDKs. if [ ! -d /Developer/SDKs/MacOSX10.6.sdk ]; then # We're not later than 10.5 if [ -d /Developer/SDKs/MacOSX10.5.sdk ]; then # We are 10.5 - use popup menus instead. # Comment out below lines if ActiveTcl is installed on 10.5 # and SaVi has been compiled with it - see src/Makefile_defs_macosx echo "SaVi: using popup menus to work around a Mac OS X 10.5-specific problem." >&2 params="-redrawn-menus ${params}" fi fi fi fi elif [ -d /sys/boot ]; then ARCH=freebsd else ARCH=unknown fi # are we 64-bit? Known to affect linux installs. MACHINE=`uname -m` KNOWN64=x86_64 SIXTYFOUR=no if [ ${MACHINE} = ${KNOWN64} ]; then SIXTYFOUR=yes fi # # Sanity check $SAVI location # if [ ! -f "${SAVI}/savi" ]; then echo "SaVi: a copy of this script is not at $SAVI/savi. Is \$SAVI set correctly?" >&2 fi # # Verify that tcl and tk directories exist # EDIT=no if [ ! -d "$TCL_LIBRARY" ]; then echo "SaVi: selected TCL_LIBRARY $TCL_LIBRARY was not found." >&2 echo " Does Tcl need to be installed?" >&2 EDIT=yes fi if [ ! -d "$TK_LIBRARY" ]; then echo "SaVi: selected TK_LIBRARY $TK_LIBRARY was not found." >&2 echo " Does Tk need to be installed?" >&2 EDIT=yes fi if [ ${EDIT} = "yes" ]; then echo " Please edit this script to set correct LIBRARY locations. Read the comments." >&2 fi export TCL_LIBRARY export TK_LIBRARY # # Do we need to complain that SaVi has not been compiled properly? # NOTFOUND=no COMPLAIN=no MAKEFILE=no # # Try specific binary, then default to filename without extension # if [ ! ${ARCH} = "unknown" ]; then PLATFORMSAVIBIN="${SAVIBIN}-${ARCH}.bin" if [ -f "${PLATFORMSAVIBIN}" ]; then # found the platform-specific executable if [ -f "${SAVIBIN}" ]; then # if default as well, indicate a choice was made - the safer choice. echo "SaVi: selected platform-specific binary $PLATFORMSAVIBIN" >&2 fi SAVIBIN="${PLATFORMSAVIBIN}" else # try default SaVi binary; assuming it's for our platform. if [ ! -f "${SAVIBIN}" ]; then # couldn't find default binary. Are we 64-bit? if [ ${SIXTYFOUR} = yes ]; then SAVI64BIN="${SAVIBIN}-${KNOWN64}.bin" if [ -f "${SAVI64BIN}" ]; then # found the 64-bit executable SAVIBIN="${SAVI64BIN}" echo "SaVi: found 64-bit binary $SAVI64BIN" >&2 else echo "SaVi: couldn't find 64-bit binary $SAVI64BIN" >&2 NOTFOUND=yes fi else # couldn't find any SaVi* binary. NOTFOUND=yes fi fi fi fi if [ ${NOTFOUND} = yes ]; then echo "SaVi: couldn't find platform-specific binary $PLATFORMSAVIBIN" >&2 echo "SaVi: couldn't find generic executable binary $SAVIBIN." >&2 COMPLAIN=yes if [ ! -f "${SAVI}/src/main.o" ]; then echo "SaVi: can't see expected main.o object file in the $SAVI/src/ directory." >&2 echo " Has the master Makefile been run to call the C Makefile?" >&2 MAKEFILE=yes fi fi if [ ! -f "${SAVI}/tcl/tclIndex" ]; then echo "SaVi: couldn't find generated list of Tcl commands in $SAVI/tcl/tclIndex" >&2 echo " Has the master Makefile been run to call the Tcl Makefile?" >&2 MAKEFILE=yes COMPLAIN=yes fi if [ ${MAKEFILE} = "yes" ]; then echo " The master Makefile in $SAVI must run all other makefiles to make SaVi work." >&2 fi if [ ${COMPLAIN} = "yes" ]; then echo "SaVi: Try compiling SaVi by making in the same directory as this script:" >&2 echo " cd $SAVI" >&2 echo " make ARCH=$ARCH" >&2 echo " before running this script again to launch and run the SaVi binary." >&2 fi # # Run binary # if [ ! -f ${SAVIBIN} ]; then echo "SaVi: did not attempt to launch a binary executable that was not found.">&2 exit fi # # If savi tree has been split, with files (data/ oogl/ tcl/ maps/ and textfiles) # placed elsewhere, then uncomment and edit the following line to reset SAVI to # that other tree location. # SAVI=/usr/share/savi # This is useful for Debian and Cygwin packagers. # # Change directory # cd "$SAVI" # # See if we need to add a -geomview flag # if [ -t 1 ]; then exec > /dev/null else case "$*" in *-geomview*) ;; *) set -- -geomview $*;; esac # send SAVI env variable to geomview echo "(setenv SAVI \"$SAVI\")" fi exec "${SAVIBIN}" $* ${params} savi1.6.0/README-COVERAGE-TEXTUREMAP0000644000175000017500000002625614423445060015215 0ustar lloydlloydTEXTUREMAPPING IN GEOMVIEW from SaVi ==================================== $Id: README-COVERAGE-TEXTUREMAP 207 2023-04-29 02:19:35Z lloydwood $ This README supplied with the SaVi satellite visualization software supplements the main README textfile. This contains the following sections: For SaVi and Geomview users: 1. Using static Earthmap texturemapping - introduction and how to turn this on. 2. Using dynamic coverage texturemapping - introduction and how to turn this on. 3. Related command line options - how to configure texturemapping to suit you. 4. Troubleshooting problems - common problems and workarounds. 5. Enabling texturemap compression - how to alter performance by decreasing the amount of data piped. For programmers interested in how texturemapping with Geomview works: 6. Technical details of texturemapping 7. Programming implementation notes. 8. Notes on SaVi Earthmap creation. 1. USING STATIC EARTHMAP TEXTUREMAPPING ======================================= Geomview can show detailed maps of the Earth's continents. Support for this requires configuring and building Geomview with OpenGL - see the README. (Mac OS X Leopard users will also want to see the linker hint in BUGS.) To show these detailed maps, launch SaVi from Geomview and select either: a. Use simple Earth map b. Use detailed Earth map from SaVi's Rendering menu. Coverage footprints can be shown as vector circles over these texturemaps by turning on 'Show footprints'. The simple Earth map is SaVi's traditional blue-and-gold texture. This map is a cylindrical projection in oogl/Earth.ppm.gz, and is loaded by oogl/earth.oogl. The detailed Earth map is freely available from NASA's Blue Marble project. This unprojected map is in oogl/blue_marble_land_shallow_topo_2048.jpeg and is loaded by oogl/earth_fancy.oogl and checked for by src/gv_init.c. Geomview requires the jpegtopnm utility, from the netpbm package available at http://netpbm.sourceforge.net/ in its path to unpack this image into a less space-efficient format. Since that is a Geomview dependency, Geomview use is optional with SaVi, and use of the detailed Earth map is optional with Geomview, SaVi only includes the compact .jpeg file. 2. USING DYNAMIC COVERAGE TEXTUREMAPPING ======================================== Geomview can show the coverage map of satellite footprints that is drawn in SaVi's coverage panel. This map is wrapped as a texture around Geomview's Earth sphere, replacing any static Earth map, and is updated as SaVi computes new coverage maps. Support for this requires configuring and building Geomview with OpenGL - see the README. Dynamic texturemapping of satellite coverage in Geomview requires SaVi's coverage panel open, to reuse the map area that that coverage panel draws and copy it to Geomview. The coverage map must be set to a particular projection. Geomview 1.9.0 and later support cylindrical and unprojected projections. If another projection is selected that cannot be texturemapped to Geomview, the default static simple Earth map will be shown in Geomview. To turn on dynamic texturemapping, launch SaVi from Geomview. From the Rendering menu, select "Use generated coverage map' to open the Coverage panel and send its map to Geomview, so that Geomview shows in three dimensions what you can see in the SaVi coverage panel in two. Animate SaVi's coverage by pressing '>>'. Geomview will now show what SaVi's coverage map shows. 3. RELATED COMMAND-LINE OPTIONS =============================== There are some command-line options for SaVi that relate to and can improve the behaviour of this texturemapping: -dynamic-texture-with-map This option sends SaVi's entire coverage panel map, including the bitmap Earth outline, to Geomview. This takes less computing by Geomview than drawing the vector Earth around the sphere does, but doesn't look as good. Try this flag only if performance feels particularly sluggish while dynamic texturemapping. -large-map This option resizes the coverage panel map from 600x300 to 1024x512, giving smoother texturemapping results in Geomview. If you have trouble getting Geomview to render the coverage map at one size, try the other. -map-view-height This option can be used to provide an even larger coverage bitmap for Geomview to texturemap, at the expense of Earth maps in SaVi's coverage panel, as the available bitmaps are not scaled to match. Smaller maps can also be selected to reduce the amount of computing done by SaVi and Geomview. Texturemap compression is recommended for sending large bitmaps to Geomview, as pipe use can be decreased. See section 5 of this document for how to enable texturemap compression. -uncompressed If SaVi has been compiled with zlib support (see section 5 below), this can be set to force uncompressed textures, ignoring zlib. Performance may vary between compressed and uncompressed images depending on your system. -gzip-compressed-textures If SaVi has been compiled with zlib support (see section 5 below), this can be set to force writing the textures with their gzip headers, which less recent versions of Geomview (before 1.9.5) need. SaVi will automatically use this method with older versions of Geomview (before 1.9.5) for backward compatibility. 4. TROUBLESHOOTING PROBLEMS =========================== If you see a blank golden sphere in Geomview once texturemapping has been turned on, Geomview has attempted to load the texture, but is not displaying the texture. Look for error messages in the console window where Geomview was run. Launching SaVi from Geomview with the -large-map option may help, as may upgrading your OpenGL drivers and rebuilding Geomview. 5. ENABLING TEXTUREMAP COMPRESSION ================================== Texturemaps sent from SaVi to Geomview can be transparently compressed using zlib where available. This can alter performance by decreasing the amount of writing to, reading from, and waiting for pipe that is required. You can tell whether compression is working by SaVi's status messages in the console window where savi was launched. Transparent compression requires use of the free zlib library. As zlib is optional and may not be present on your system, use of zlib is disabled by default and must be explicitly enabled by you. If the zlib library and zlib.h are not already available on your system, zlib can be downloaded from http://www.zlib.net/ and shown to work with: cd zlib-1.2.11 ./configure -s make test Then install zlib as superuser (or get an administrator to do so) with: make install Transparent compression must be selectively enabled in the SaVi code by editing SaVi's src/Makefile to remove the -DNO_ZLIB flag before recompiling SaVi after first doing 'make clean'. SaVi can tell you whether compression support was included when building SaVi in its About dialog from the Help menu. SaVi's support for texturemapping varies depending on the version of Geomview used, with the default being the newest method available for that version of Geomview. Older methods can be supported via command-line options described earlier. Geomview 1.9.x - static and dynamic texturemaps are supported. Compressed and uncompressed texturemaps may be piped to Geomview directly. Cylindrical and unprojected coverage projections are supported. * Geomview 1.9.5 and later: - Geomview handles decompression internally rather than spawning gzip to uncompress, for a minor performance improvement. Texturemaps may also be piped to Geomview using zlib's compress2 (.zlib) directly without added gzip (.gz) headers, which greatly simplifies coding. * Geomview 1.9.0 to 1.9.4: - piped compressed texturemaps are handled by spawning a gzip process to uncompress them. Geomview 1.8.x - dynamic coverage texturemaps were last supported in SaVi 1.4.8, where a temporary scratchfile using the cylindrical projection was written to and read from disk repeatedly. That legacy method is no longer available. Static Earth texturemaps were last supported in SaVi 1.4.9, where numesh.oogl was used instead of the STSPHERE command. That legacy method is no longer available. The following sections are only of interest to programmers. 6. TECHNICAL DETAILS OF TEXTUREMAPPING ====================================== The large coverage panel option exists because 1024x512 seems to be the size that Geomview is most willing to texturemap, as it matches the size of the yellow-and-blue static Earth texturemap provided with SaVi. This is why -large-map is suggested if problems with texturemapping are seen. Interval decay is turned on because white areas show up in Geomview's lighting as gold, and blue is rather cooler and matches Geomview's default blue sphere. Coverage images are sent down a pipe to Geomview, inline with oogl commands. 7. PROGRAMMING IMPLEMENTATION NOTES =================================== Mapping is very convenient because the Tcl coverage image is effectively already a raw RGB ppm file, which we can send to Geomview or write to a scratchfile we tell Geomview to read in. Changing Image_Width/Height and having everything rescale is convenient. We're reusing the existing projection in the coverage map (rather than building a separate image, which would require clearer image/grid handling in src/coverage_vis.c and would be even more of a slowdown since we'd be rendering two separate maps). Texturemapping of other projections has been disabled as incorrect and inconvenient for viewing in Geomview. Note that Geomview 1.9's STSPHERE uses CYLINDRICAL for unprojected maps and RECTANGULAR for cylindrical projections, which is backwards. (Geomview 1.8.1 does not support STSPHERE, and required the older oogl/numesh.oogl to support only cylindrical projections.) More correct image/grid handling for multiple grids would probably require a pointer to the image stored in grid structure we're passing around, checking that the Tcl image referenced exists, etc. 8. NOTES ON SAVI EARTHMAP CREATION ================================== 1024x512 sinusoidal pbm map was created from the 600x300 map (scaled in gimp, made 1-bit as greyscale indexed colour, saved as xbm, run through xbmtopbm). Cylindrical map created from same-size Earth.ppm.Z, by using threshold in gimp before going 1-bit and xbm. New unprojected equirectangular and orthographic spherical maps were created from maps generated by Versamap, then screenshots were turned to greyscale, resized, set threshold in gimp, then saved as xbm before being processed as above. http://www.versamap.com/ Some maps used in previous versions of SaVi were created from maps generated by Henry Bottomley's java map applet, which does a variety of interesting projections: http://www.btinternet.com/%7Ese16/js/mapproj.htm The blue-and-gold Earthmap in oogl/Earth.ppm.gz used for simple static texturemapping was originally created by the Geometry Center for the Orrery, another Geomview module, and tweaked. The continents mask Earthmaps used for the unprojected duochrome shaded land and sea maps were resized from http://naturalearth.springercarto.com/ne3_data/16200/masks/water_16k.png NASA's Blue Marble project at http://visibleearth.nasa.gov/ has created detailed Earth texturemaps for more accurate Earth rendering. Lloyd Wood (lloydwood@users.sourceforge.net) savi1.6.0/.geomview0000644000175000017500000000005314423444222013255 0ustar lloydlloyd(emodule-define "SaVi" "./savi -geomview") savi1.6.0/PACKAGING0000644000175000017500000001246114423445060012650 0ustar lloydlloydPACKAGING SaVi FOR RELEASES AND BINARY DISTRIBUTION ================================================== $Id: PACKAGING 200 2023-04-16 10:25:53Z lloydwood $ 1. Packaging SaVi for binary distribution 2. Packaging SaVi for releases 1. PACKAGING SAVI FOR BINARY DISTRIBUTION ========================================= If you're packaging SaVi to release a .rpm, .deb or similar, great! Please go ahead. I hope that the following notes will be helpful. If these notes could be improved, please let me know. SaVi requires Tcl and Tk as package dependencies. Most makefiles and savi launch script expect 8.5, but any version of 8.x can be compiled with. You will want to compile SaVi with zlib (steps are detailed in README-COVERAGE-TEXTUREMAP) and have zlib as an additional package dependency. geomview and gifsicle are optional dependencies. Once you have compiled SaVi, check that the SaVi help menu's 'About SaVi...' dialog indicating the compilation date and build source is suitable. Once SaVi has been built, the only directory that is safe to remove is src/ (and src/include). All other directories are used by the SaVi executable. You will want to remove the .geomview file if having invisible files in a package is undesirable. SaVi users progress with time from reading the manual and helpfiles to reading scripts in data/ before copying scripts and editing them to create their own, so these all need to be in one place - the savi directory. Textfiles are loaded in by the executable for its help menu, and are linked to from the manual in manual/ - please do not remove these, though making additional copies elsewhere is fine, and they can be loaded in by adjusting $SAVI where indicated near the end of the launch script. In the top-level directory, only the Makefile, configure, and PACKAGING files are now redundant. Makefiles can be removed from all directories and subdirectories (src/include and manual/images). In bin/ two copies of the SaVi binary are deliberately created on compilation, as bin/SaVi and bin/SaVi-arch.bin. This can allow multiple binary architectures to coexist with different arch names, with the more recent build overwriting bin/SaVi. (SaVi can't make assumptions about the availability of symlinks, and creating bin/SaVi supports src/Makefile_defs_anything and 'make ARCH=anything'.) If packaging for one binary platform, you can delete one executable to save space. On Mac OS X, keeping bin/SaVi is preferred, as the executable name is shown in the menubar as the application name. To create a 64-bit package, you could 'make ARCH=x86_64' (or just make) on a 64-bit linux system -- but the savi launch script will give an ARCH=linux -linux.bin executable precedence over an -x86-64.bin executable. Although the platform where -x86-64.bin was built reported itself as 64-bit, we don't know about the compile chain or where the binary is run, and defaulting to 32-bit appears safest. The detailed Earth map is freely available from NASA's Blue Marble project. This unprojected map is in oogl/blue_marble_land_shallow_topo_2048.jpeg and is loaded by oogl/earth_fancy.oogl and checked for by src/gv_init.c. Geomview requires the jpegtopnm utility, from the netpbm package available at http://netpbm.sourceforge.net/ in its path to unpack this image into a less space-efficient format. Since that is a Geomview dependency, Geomview use is optional with SaVi, and use of the detailed Earth map is optional with Geomview, SaVi only includes the compact .jpeg file. 2. PACKAGING SaVi FOR RELEASES ============================== This is an aide-memoire for the SaVi maintainers when preparing development for release. Don't package on Mac OS X, to avoid invisible files. If repackaging to fix a packaging problem with version a/b/c, include a RELEASE-NOTE file indicating changes. Do not change VERSION file. Individual files may be replaced with files from SVN, or have SVN information removed, should changes warrant, in later a/b/c repackaging. a. Delete /savi-dev and pull a fresh copy from the repository. b. Edit end of README to indicate version and major changes. c. Mark repository with tag savi_1_6_X. Commit. d. Update VERSION to X+1 development, commit. e. Delete and pull another fresh copy to avoid e.g. editing backup files. f. Edit VERSION to indicate release and give date. g. Edit src/Makefile to comment DEBUGFLAGS lines. Delete Id line, as this file has been modified. h. Edit configure script variable to indicate version. Delete Id line, as this file has been modified. i. remove repository information with: rm -fr savi-dev/.svn j. Rename savi-dev/ to savi1.6.X/ to indicate version. k. subversion honours the local umask, so inspect and chmod all files to remove world/group writability. l. touch -t all directories with a suitable timestamp, starting with src/include and manual/images, ending with savi1.6.X. Also touch configure and VERSION. m. Create tarball (tar cvf savi1.6.X-release.tar savi1.6.X), touch, gzip -9. n. tar xvfz elsewhere and build to check all works. o. Pull copy of savi-dev/ from respository and build for further work. p. Put tarball on sourceforge, local webpages, update pages. q. Announce on mailing lists etc. Announce on SourceForge blog. Announce on SourceForge News: http://sourceforge.net/p/savi/news/ Announce on fresh(code): http://freshcode.club Lloyd Wood lloydwood@users.sourceforge.net savi1.6.0/BUGS0000644000175000017500000012315414423445060012126 0ustar lloydlloydBUGS recognized in SaVi ======================= $Id: BUGS 148 2020-01-18 02:50:25Z lloydwood $ This list of BUGS describes caveats and problems with use of the SaVi satellite visualization software. This document contains the following sections: 1. Caveats in use of SaVi. Be aware of these. 2. Platform-specific issues. a. Mac OS X i. Mac compilation hints -- for SaVi -- for Geomview ii. 10.5 (Leopard)-specific issues -- for SaVi -- for Geomview iii. Other minor Mac-specific issues -- for SaVi -- for Geomview b. Cygwin on Microsoft Windows -- for SaVi -- for Geomview 3. A detailed SaVi wishlist. Notes on issues in these SaVi releases. a. Coding and build issues b. Scalability c. Scriptability d. User interface e. Coverage view improvements f. Fisheye view improvements g. Geomview interaction h. Dynamic texturemapping with Geomview i. Various j. Interaction with other 3D renderers k. Interaction with the network simulator ns l. Desirable constellations to simulate 4. Remaining integration work from unreleased SaVi 1.1. 5. Remaining items from the original SaVi 1.0 wishlist. 1. CAVEATS IN USE OF SAVI ========================= Changing default simulation parameters (central body radius, gravity, etc.) can cause unexpected behaviour; scripts generally describe satellites in circular orbits via an altitude above the body's surface. Use at own risk. If simulating a different planet to Earth, we should force the -orbit-model J0 flag to avoid simulating Earth's oblateness and environment. J0/J2 should be selectable in the params dialog. Any changes should reset time to zero - with a warning. Two-line-element (TLE or 'elset') reading and constellation code in tcl/constellations.tcl still needs considerable work. Reading .tle files is experimental. This is not guaranteed for multiple satellites of different epochs, so you can't really just expect to download a .tle file, load it in and go. Improving this and introducing clock time would make SaVi far more practical. (Sidereal time and the Earth's motion around the sun is not simulated; noted by Tom Tessier.) Selection: selected satellite is not visible as selected in Geomview until a marker type is first selected or satellite orbital elements are edited. Operations on multiple satellites (e.g. Cut) only work on the last satellite selected. Sunlight is approximated by having the sun orbit the Earth as a distant satellite with the appropriate year-long period. This should not be done as a J2 calculation, but should at least be J0. Geomview's lighting rendering needs to be fixed to match this coverage footprint. 2. PLATFORM-SPECIFIC ISSUES =========================== a. MAC OS X i. Mac compilation hints -- for SaVi SaVi and Geomview need Xcode (included in Developer Tools with the Mac OS X system installer copy, or downloadable from Apple) to provide the tools that can compile these and other programs. As of Mac OS X 10.7, Xcode is now an app available from the Mac App Store. As well as downloading and installing the Xcode app, it may be necessary to explicitly enable command-line tools so that e.g. gcc is available. The command line tools must be selected in: Xcode > Preferences > Downloads > Components > Command Line Tools Simply typing 'make' in a Terminal window may generate a dialog to install the app and necessary command-line tools. Alternatively, the command-line tools can be installed by typing: xcode-select --install Although recent releases of Mac OS X include Tcl/Tk headers, they do not include the X11 headers that Tk needs to compile. One way to get these headers is to install the XQuartz package from http://www.xquartz.org/ The XQuartz copies of X11 headers are looked for during compilation. The Tcl/Tk libraries shipped with Mac OS X releases have some user-interface problems and are prone to crashing. It is preferable to install a later ActiveTcl release from http://www.activestate.com/activetcl and then choose to build with that instead; to do so, uncomment the second, commented, TCL_LIBS = line in src/Makefile_defs_macosx before compiling savi by typing make ARCH=macosx Mac Tcl issues fixed in ActiveTcl include: - Mac OS X 10.5 Leopard menu problems - accelerator key crashes - coverage panel angle slider crashing Tcl due to a busy event loop when texturemapping, cone and footprint drawing are on. -- for Geomview On Mac OS X 10.8 or later, you will need to install XQuartz from http://www.xquartz.org/ to provide an X11 environment. To build Geomview on Mac OS X, you must first install a Motif clone such as Lesstif (available via www.geomview.org's Downloads section). In Lesstif's directory you will need to configure make sudo make install and okay the sudo with a password to place Motif files where Geomview expects to find them. Geomview works well with OpenGL, but the OpenGL header files needed are not included in Xcode by default. They were an extra optional package provided with the Mac OS X system installer. Building Geomview with ./configure --without-opengl make is a fast way to get started, but the OpenGL rendering is recommended for coverage texturemapping. To build Geomview with OpenGL once these optional header files are installed: ./configure --with-opengl=/usr/X11R6 make and then optionally to make Geomview available from the command line everywhere: sudo make install ii. 10.5 (Leopard)-specific issues -- for SaVi The Tk 8.4.7 supplied with Mac OS X 10.5 (Leopard) has problems displaying SaVi's menubar. To work around this, menu buttons can be put in each SaVi window with: savi -redrawn-menus This is not required on Mac OS X 10.6 (Snow Leopard) or 10.4 (Tiger), where the Mac menubar can be used correctly. The ./savi launch script attempts to detect 10.5, and adds the -redrawn-menus flag to make SaVi usable for Leopard users. This avoids having to add the parameter at the command line each time SaVi is launched. Installing ActiveTcl, uncommenting the TCL_LIBS line before compiling, as described above, and removing the -redrawn-menus flag from the ./savi launch script is the preferred way to work around the user interface problems of the Tk supplied with 10.5. -- for Geomview If doing make of Geomview fails to link at end with a 'cycle in dylib re-exports with /usr/X11/lib/libGL.dylib' error, use the following single-line, no-breaks command: export LDFLAGS="-Wl,-dylib_file,/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:,/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib" then repeat the previous instructions. This problem is caused by a linking bug in Leopard. iii. Other minor Mac-specific issues -- for SaVi - Menu shortcuts are disabled on the Mac unless -redrawn-menus is used. This is to prevent a freeze on using a keypress to open a window (seen in 10.6 with Tk 8.5.7). 10.7 is unaffected, and shortcuts can be enabled for ActiveTcl by editing disable_mac in tcl/utils.tcl. - On compilation, two binaries are produced: bin/SaVi-macosx.bin and bin/SaVi. You can rm bin/SaVi-macosx.bin to get just 'SaVi' in the menubar as the application name. - Under the Tcl/Tk supplied with 10.5, coverage colour buttons are only fully coloured when another application is frontmost. - Under the Tcl/Tk supplied with 10.6, menu highlight colours are incorrect; highlighted text remains black. -- for Geomview - With X11 rendering, Geomview does not appear to be able to control its background colour, which is always grey. OpenGL rendering is fine. b. CYGWIN ON MICROSOFT WINDOWS SaVi and Geomview can be installed as packages by the Cygwin installer. 32-bit Cygwin and the newer 64-bit Cygwin can coexist on a Windows PC. 32-bit Cygwin has often had better Geomview interaction in the past, and so was preferable for SaVi. If both 32-bit and 64-bit Cygwin are installed: - Depending on which XWin the Start menu Cygwin-X folder launches, the other can be launched when that is not running by launching the appropriate terminal, then typing startx -- -multiwindow -clipboard & - The Task Manager will indicate whether 32-bit or 64-bit Xwin.exe is running. - uname -a in a terminal indicates whether that terminal is 32-bit or 64-bit; x86_64 is 64-bit. -- for SaVi When expanding the coverage window to show a tiled coverage map, there can be two lines of pixels, one to the left of the map, one to the right, where coverage is not drawn on the background. Satellites and maps are drawn correctly. Oddly, this only appears under the 32-bit Cygwin, not in the newer 64-bit Cygwin. This has not been seen on any platform other than 32-bit Cygwin. Cygwin support isn't seamless, and may need some editing of tcl/Makefile to support the version of Tcl Cygwin uses. This caveat only appears to apply to very old versions of Cygwin; not Cygwin 1.5.6-1 and later. Under cygwin, specifying -mno-cygwin to gcc in src/Makefile in order to build using MinGW generates errors. We're a long way from a standalone Windows executable. -- for Geomview SaVi and Geomview can be installed as packages by the Cygwin installer. The SaVi/Geomview combination took a while to become functional under the new 64-bit Cygwin introduced in March 2013, with OpenGL and piping problems. Under 64-bit Cygwin, you can try building Geomview with: MOTIFLIBS='-lDtPrint -lMrm -lXm -lXt -lXmu -lXp -lXext -lX11 -lSM -lICE' ./configure --with-motif=/usr --with-opengl=/usr CPPFLAGS="-DglBindTextureEXT=glBindTexture -DglDeleteTexturesEXT=glDeleteTextures" make 3. A DETAILED SAVI WISHLIST =========================== This is an additional wishlist of improvements for SaVi originally accumulated during work for the SaVi 1.2 release during October-November 2001, and kept up-to-date with later development. Development takes place at: http://savi.sourceforge.net/develop/ Many suggestions (such as the user interface and fisheye modifications) should be straightforward if you have some Tcl/Tk/C experience and the spare time and interest. Others are difficult. a. CODING AND BUILD ISSUES - make install is needed. That should probably match the current debian package. Early creation of it may have been able to prevent the previous package problems caused by maintainers unfamiliar with the savi tree, described below. - Binary packages are not created by the SaVi authors. You can always download SaVi from http://savi.sf.net/ and compile it to get all the files created for SaVi. - The savi-1.4.3 package available from getdeb.net from December 2009 onward (and available in Ubuntu's Synaptic package manager) initially removed the textfiles and manual from SaVi. This package installed SaVi under /usr/share/savi, while the COPYRIGHT file was edited, renamed 'copyright' and placed under /usr/share/doc/savi. This broke SaVi's help system by removing all help information. Packaging was fixed in later revisions. These packages were not initially compiled using zlib, although and making zlib a package dependency is straightforward. More details are in the PACKAGING textfile. - $HOST or $HOSTNAME? One or both have the machine info we need for the compile version info preserved in Help/About... - gv_utils.c warning: implicit declaration of functions fileno and fdopen because they're POSIX, not ANSI C, even though they're normally in stdio.h; could set -std=gnu99 flag to relax restriction if this mattered. - The executable bin/SaVi (named for viewing the process name, e.g. in the Mac OS X menubar) is considered the same name as the savi script on case-insensitive file systems (Mac OS X, Windows). This may lead to confusion, particularly if src/Makefile is ever made to build in the savi directory. - Improve open/close filehandling and catch errors. - Under error catching, if SaVi is launched from a terminal window and backgrounded with the & metacharacter, and that terminal window is then closed, writing status messages to stderr, e.g. when loading a new constellation, fails due to a broken pipe. The resulting Tk error dialog stalls SaVi until it is closed. Option to remove ALL output sent to stdout? -quiet? Would need printf varargs wrapper. Could log to file or to a Tk log window instead - but little point sans timestamps? - We should really be using snprintf instead of sprintf. - We should examine jerkiness when used with Geomview, particularly under Cygwin. utils.c::millisleep() calls select() without reference to the state of the pipe to Geomview; how can this be made smarter? Should we sleep after gv_end()/gv_stop() ceases nesting? - Command line handling to note what options are set should note more for hint in About dialog. For debugging purposes, could allow override of existing global variables by writing support for -tclvar -tclvar by setting them near the end of init.tcl init code. Check existence of value set and warn if not already present. - Menu shortcuts don't work while any menu is dropped down. This looks like a Tcl failing crossplatform. - -fisheye and -coverage flags to spawn those windows at startup? How do we set size? -large-map/-snmall-map and -levels handles that... -camera to spawn n geomview cameras at startup? 2nd/3rd could be north/south pole views. How to position windows on screen? - Rewrite README (for building SaVi) and README-TEXTUREMAPPING into README (for building), SAVI-USE, and GEOMVIEW-USE for better online help. - Filehandling: why does the SaVi package installed as a deb say 'File not found' when a file parameter is passed? b. SCALABILITY - Scaling up. Can SaVi detect available CPU power and e.g. scale number of segments in drawn orbit circles/number of sides to a coverage cone appropriately for Geomview? A slider or command switch giving some control over this would be very useful. Scaling up the number of segments when drawing highly-elliptical orbits has been done, but ORBIT_SEGMENTS defined in include/constants.h needs to be passed to Tcl as a variable. More use of Geomview binary format (discussed below) may help. - Scaling down. Geomview rendering is optional; you can conserve CPU by running SaVi standalone. SaVi 1.2 and later don't do Geomview calculations when run standalone, although 1.0 did. Why shouldn't Tk and a graphical display also be optional? You do need a Tcl parser - that's essential - but we can execute scripts to build satellites and get results; we can make use of command-line switches, and we can pipe graphics to stdout for a variety of uses, including building web cgis (a la Chris Meenan's footprint generator). c. SCRIPTABILITY As well as scripts that get results there needs to be a scriptable interface to record tracefiles. Scriptable recording of satellite-related values over time periods would be very useful; the self-scheduling Tcl procedure model that is used in the network simulator ns-2 (see below) may be worth emulating. Having Tcl/C interaction daisy-chained as keywords off the 'satellites' keyword is awkward, particularly for Geomview interaction, where a 'geomview' keyword would seem more intuitive. Perhaps a 'C' keyword? d. USER INTERFACE A user manual has been written and placed in the manual/ directory, but more detail is needed. The manual is not yet directly accessible from SaVi; could SaVi find and spawn a web browser? Building a web browser into SaVi seems a bit much. The Tk procedures in tcl/tcl_utils.tcl (inherited from dsTool) are straightforward to use, but are not that efficient in using screen real estate. This makes SaVi cluttered, even on a 1024x768 display. SaVi 1.2 has improved things, but this still needs more work. * Main panel: A realtime push-hold button next to Time Interval would be useful; removes Rendering menu (->Geomview menu) when Geomview is not present. Move current time into reworked playbar line instead? Cutting to remove a satellite jumps to end of (long) list, unless start of list is shown. Bindings are needed for cursor up/down so that satellite selection moves. * Coverage panel: Some wasted space here. When -large-map is selected the playbar at end is drawn below the bottom of a 1024x768 screen, which is a problem if you can't move windows from available edges - which is why the buttons are also listed as commands in a menu. Reaching the coverage angle options also becomes tricky. Clicking and dragging the map sideways to shift the view would be cool - esa's Space Trajectory Analysis v3.0 does this. Bindings are needed for cursor left/right (forwards/back) and shift-cursor left-right (single step forwards/back) * Edit satellite: Dialog layout can be improved, with better alignment of captions, text boxes and sliders. Apply button was removed since values do update live - but does that also hold for older versions of Tcl? There's no easy way to select multiple satellites so that you can change a checkbox setting for all of them. Panel can be left open when inappropriate, e.g. when a new constellation is loaded in. Should switch to editing a new satellite. * Rosette and crude star generators: Dialog layout can be improved, with better alignment of captions, text boxes and sliders. Slider positions do not update to match text value changes. Create overriding 'Show all {satellites | orbits | coverage }' checkboxes that, when checked, force related checkbox (in satellite Edit parameters) on and the feature visible for all satellites. When checked off, disable the feature for all satellites. These would be entries on the Rendering menu, under 'Real-time mode'. Provide menu of colour choices for pane backgrounds, highlights etc. It's possible to type into the help menu text windows. That should be prevented. But that is not simple in Tk: http://wiki.tcl.tk/1152 Ballard/crude star generators need to create info text in "About constellation" window. Look at how the initial LEO satellite text is created. Need to create info text separately from function that we may in future call from scripts that we collapsse down to Ballard? e. COVERAGE VIEW IMPROVEMENTS Now that we have satellite names, an option to show them in the coverage view would be useful. The satellite plot scripts do this for print via xfig. Could blend coverage maps somehow with the detailed map, but that means uncompressing it and blending on a pixel-by-pixel basis, or setting alpha transparency in Geomview for a coverage sphere over the earth sphere. Decay/sunlight options are really mutually exclusive, and could be done via a popup menu: No coverage (all-white background) Coverage (white background) Coverage and decay (default) Coverage and sunlight (two shades of decay) Coverage over land and sea (blue background) but we need masking for all supported projections first. Drawing the Earth map last in each rastering is nice for sending to Geomview earlier, where the vector Earth can be overlaid instead - but means that green satellite cross markers are behind and occluded by continent/country outlines. Ideally we have subsatellite nadir markers drawn by Geomview, with bitmap crosses drawn after the bitmap Earth maps, and not sent to Geomview either. Could fix coverage satellites drawn behind map bitmap outline problem. In map-drawing section, test value in lookup table, i.e. that it's not green, before plotting. Or could move loop of detect-and-draw-green-crosses after map drawing loop, at cost of not drawing them in Geomview. If "use sunlight" is on, why is change shading only restricted to land/satellite coverage only? For land/sea both should change; debatable for others. But labels need to update to show 1/2 sats etc. Could implement 0 satellites in view/0 intervals as two white boxes, not given in color swaths, but colors set individually by clicking buttons. Possibly better as menu option spawning color box? Set uncovered map color? Should intervals off default to 4+ colors, not 1? Add greyscale option for colors? diversity is white? Unless land/sea? As well as allowing coverage angles to be set per satellite, having multiple fooprints per satellite at set elevation angles (5 degrees, 10 degrees) would be very useful. Either approach could be used to build traditional geostationary iso-coverage maps, marked out with diversity colours. What is the diversity/decay value of the pixel that we have clicked? Report it next to fisheye lat/long coords. Unlike coords, this would need to be updated in real time. If fisheye is open, then we likely already know it from within the red circle, and can just repeat it in coverage? Useful reality check by comparing the two. Should opening coverage panel turn on vector Geomview map overlay? Saving maps now supports .gif, as that's integral to Tcl. Support for handling .png requires a non-buggy version of Tcl 8.6 or later, and produces larger non-indexed files, so it's not a menu option - but if .png is given in the filename, an attempt to save as .png will be made. May need to revisit filetypes here at some much later point. There are alternatives to plotting full circular footprints: - just plotting only edges of footprints - hollow circles. - plotting imaging swath widths, i.e. a line perpendicular to the orbit inclination, width diameter footprint. - plotting complex spotbeams, again aligned with respect to to the orbit inclination. (Chris Meenan's footprint generator demonstrated hexagonal arrays.) This would involve making changes to e.g. src/stats_utils.c::fill_grid() and intensity_circle_footprint() Look at masking SaVi logo onto coverage maps - this makes most sense in corners of spherical and sinusoidal maps, but area used would need to be discounted from coverage calculations. Update all Earth maps to track more recent political boundaries. A couple of pixels of west Mexican coastline are missing from the 1024 unprojected map. Consider producing better outline and landmass mask maps across all projections, and even new projections, by generating them using the d3.js map drawing functionality. Unfortunately, this means first understanding d3.js. The coverage slider position should be updated when a script loaded from the menu changes the coverage angle. Threshold altitudes for enabling coverage footprints and cones are useful for elliptical orbits where satellites only transmit at apogee, but is currently only a command-line option. This may be more useful for a mix of orbits if specified as an angle around apogee, rather than as an altitude. Similar thresholds could be implemented for latitude and longitude, based on satellite position, and implemented as command-line options to start with, or a Coverage constraints coverage panel menu option. -coverage-latitude-max, -coverage-latitude-min, -coverage-longitude-max, -coverage-longitude-min, with -coverage-altitude-max, -coverage-altitude-min renaming the transmit-altitude-max/-min already implemented to fit the set. Longitude calculation for spherical fisheye clicks are inaccurate. Edge calculation methods have visible differences (as does sinusoidal). Area calculation hasn't been attempted; calculations of areas in general for all projections are poor estimates anyway. Using sinusoidal coverage map, full coverage reads from 99.6% to 99.8% due to rounding at curved edges of map. Coverage calculations for all projections are estimates at best, reflect the map projection in use by changing with latitude, and are limited to not exceed the 100% threshold. Calculations should really reflect degree of coverage overlap and be consistent across all views. Working off stats_utils.c::footprint_circle_radius() when that is computed, not off a distorted map, can give total coverage for each small circle that coverage generates. These can be summed to give overlapping coverage. Calculating amount of coverage overlap for 1/2/3 etc. satellites is possible by counting pixels, but still depends on choice of projection and latitude of satellite. For handling overlap, see Kantsiper and Weiss, An Analytic Approach to Calculating Earth Coverage, AAS 97-620, while they were at MIT, for an analytical integration approach using the inclusion/exclusion principle. Also Brian Kantsiper, A Systematic Approach to Station-Keeping of Constellations of Satellites, PhD dissertation, MIT, Feb 1998. See also A. Gonzalez, Measurement of areas on a sphere using Fibonacci and latitude-longitude lattices, Mathematical Geosciences, January 2010, pp. 42-49. http://arxiv.org/abs/0912.4540 The correct way to count coverage overlap is debatable. Counting pixel intensities and saying X% of the earth has single satellite coverage, Y% of the earth has double coverage... could be useful - and these percentages could then be overlaid on the colour key wells. But counting pixels from a map still introduces some distortion. When choosing new colour shades after animating forwards then stopping, the satellites move on an interval unexpectedly as the map is updated with new colours. Is this due to computed coverage finally being shown by tk_update()? Project groundtracks for the next n hours only projects forwards in time, even if the simulator is currently being run backwards - is this the least confusing approach? Enter negative number to project backwards. When altering the coverage map and tiling, remember to run the Teledesic (840) simulation to check that the top and bottom of the map are visible as a single line of uncovered (blue or white) pixels in cylindrical view. Tk does require a unit offset. Add option to fade groundtracks to background over time, just as interval decay works for coverage areas. When recording groundtracks, erase the cross arms and leave only the subsatellite point. Coverage areas of the selected satellite(s) can be shown in different shades - possibly shades of green. Add optional latitude/longitude lines. Could add equator line to match showing equator in fisheye view. Earth outline on sinusoidal map is drawn using different algorithm to backdrop. Overlap is poor; both should be drawn on the cached map, rather than on each coverage map drawn. This matters less when the backdrop is set to black to match the outline. How much work would be required to enable multiple coverage windows to be spawned, so that multiple projections could be seen, and any available cylindrical or unprojected projection is used for texturemapping if desired? Probably a lot. Opening the coverage window when animating means that the coverage playbar is not immediately updated with playbar status, and playbars only sync when the next playbar button is pressed. Menu options invoking popup windows to control project groundtrack, coverage angle slider, and minimum transmit altitude slide would be useful on small screens where these controls are offscreen at the bottom. Minimum transmit altitude is of minority interest, does not require slider to always be onscreen. f. FISHEYE VIEW IMPROVEMENTS Now that the fisheye window is resizable, having controls partially obscured at small sizes is messy. Can this be improved? (Not resizing the window when recording tracks would be a deliberate choice, given the complexity of the alternative.) New cross location in coverage map is not removed immediately when checkbox is turned off. Add slider to select size of fisheye crosshairs; will need to adjust text positioning slightly. Can we add this on buttonbar? When equatorial exclusion zone is shown, satellites are not indicated as within or outside it. This needs to be figured out. Equator altitude should be figured out from first principles in case simulation constants get changed and we're not simulating Earth. We support minimum elevation of the terminal, i.e. whether the terminal can see each satellite, but do not consider half-angle of the satellite, i.e. whether each satellite can see the terminal. Considering both would be ideal, and useful as a prelude to connectivity/link work. Could create fisheye orbit markers to show trajectory of currently selected satellite, if any. Would need to be a separate satellite marker list, since parallels table wraps around. Do we space markers in RAAN or time? Would need to cut down on satellite info to just the minimum and create a special marker group, then simplify equator code to use it? Would this even make sense with HEO orbits, where markers won't be spaced evenly? Could we create markers for each satellite as lists hanging off the Satellite in the satellites list? Hard to keep updated. How much work would be required to enable multiple fisheye windows to be spawned? Probably a lot, if pass times are to be recorded in the SL list structures on a per-view basis. A fisheye view that wandered (randomly?) over time would be nice to have, as it could show the equator and latitude lines moving smoothly. This would probably require a simulation event scheduler to be implemented so that commands could be executed on repeat intervals. The -debug flag outputs information about satellite positions, but it's verbose, showing angle to all satellites, even those below the horizon, and lots of debugging information for visible satellites. A decent log format for visible satellites and their angles above the horizon is needed. Saving bitmaps would be nice to have as an option. Postscript can always be converted to a bitmap via GhostScript: gs -dNOPAUSE -sDEVICE=png256 -r300x300 -sOutputFile=out.png -q -dBATCH out.ps but Ghostscript is a tad unwieldy, and since you'll end up cropping the results anyway... it's simpler to just take a screen capture. g. GEOMVIEW INTERACTION Geomview coverage cones and footprints are dynamically updated when the coverage view angle slider is moved. For cones, this is computationally laggy for large constellations. Speed it up by forcing a delay and scheduling a later update after a timer expires? We're already collapsing it in BEGIN/END. Should gv_end force a texturemap update for after e.g. loading a constellation? Should footprints be turned on if dynamic texturemapping and switching to a projection that cannot be texturemapped? Fisheye location(s) should be shown in Geomview - another colored line? Now that we have satellite names, an option to show them in Geomview would be useful. This would be even harder than showing in the coverage view - look at how The Orrery, another Geomview module, renders fonts and text. Could make markers distinguish satellites - a satellite struct field holding a number mapping to dot/sphere/box/sat or colour (since shades of black aren't useful), and text column saying marker type if geomview is running. Selecting marker could ask for all, or operate on highlighted selection of satellites. This looks hard. Look at altering sleep code to give longer sleeps when Geomview is running and animating, so that more CPU time is devoted to Geomview and overall performance is made more responsive. Being able to control and program camera position, to e.g. show exactly what a satellite sees at nadir as the satellite moves, would be very useful to have. Geomview's light source positioning appears to be buggy at present, as shown by savi -geomview -sun-lighting. Could implement a terminator plane at right angles to the sun pointer, reusing equatorial plane code. Quitting SaVi as a Geomview module can leave the blue Earth sphere behind. This was identified as a bug in Geomview exposed by chosen -O3 optimisation when building, which vanishes when -O2 is chosen - see the January 2012 geomview-users archives. Running under Geomview with -fake-geomview flag on as well leads to weird behaviour, so don't do that. One or the other! Should be able to scale one or all satellites in size. Being able to scale one spherical satellite to large could be useful for simulating the Moon. But would need to match position to J2 model. Rotation of satellite markers as they approach the poles is inaccurate; detailed satellite solar panels should be at right angles to the ecliptic and rotate to follow the sun (if there's a sun...), rather than pointing east-west. (Face on to the sun at right angles to the ecliptic is at 67.5 degrees to the equator, which is 22.5 degrees to the ecliptic.) That's reality; for visualization, having panels at right angles to the planes increases visibility - when the planes are drawn. Could use inclination of orbit. Make this unwieldy SaVi/Geomview combination run in root window under Xscreensaver, in long tradition of overdone OpenGL hacks. To do that, more command switches must be passed to SaVi through Geomview. Can central blue sphere rendering be rotated so that lat/long lines map to barely-visible rendering of sphere segments? Can we draw latitude/longitude lines that rotate with the central body as an option? This would be like Geomview's 'Draw Unit Sphere Projection' Camera menu option, but rotating with the Earth. Replace equatorial plane with more detailed sectored concentric circles, or with a translucent circle sized to the current stationary orbit as set in parameters. Translucent surfaces (e.g. yellow selection cubes) may not be that visible in some renderers. Add a 'Sky view' rendering option that combines the following: - switches Geomview to spherical geometry, so we're looking out from the centre of the Earth; - turns off central body, so that we look through outline continents. - turns on footprints, turns off spotbeams. Can Geomview postscript output be improved and made useful by tweaking SaVi's oogl? This probably requires work on Geomview On Mac OS X, Geomview does not support the Mac menubar, but uses its own Motif menus in its main window. This means that switching between SaVi and Geomview is a little disruptive to the user experience. This cannot be fixed only in SaVi. Check deleting central body and turning off simple earth. only works in one order, should work in both. Loading in constellation updates texturemapped coverage slowly. Because we need to change earth types? Geomview 1.8.1 points: These are unlikely to be dealt with, as 1.8.1 no longer builds with modern compilers. With Geomview 1.8.1, the large list structures used in writing footprints and cones cause complaints about not being able to 'seek back far enough in pipe.' This is related to how piping is handled, and the piping code rewrite by Claus-Justus Heine in Geomview 1.8.2 release candidates for the 1.9 releases appears to have fixed this. An alternative to the oogl used in: footprints.c::write_footprints_geom() cones.c::write_cones_geom() would be good to have for remaining Geomview 1.8.1 users. Footprints and cones are off by default to avoid this problem. Geomview binary format is only used in one place at present (the default satellite marker if the architecture permits it), but offers a scaling advantage. Note that e.g. Geomview 1.8.0 (Linux, some glibc) has problems with handling binary format; selecting a more complicated marker type than the default green dot avoids use of binary format entirely, but an explicit option would be better. h. DYNAMIC TEXTUREMAPPING WITH GEOMVIEW Dynamic texturemapping is described in the file README-COVERAGE-TEXTUREMAP which can be found in the same directory as this BUGS file. Dynamic satellite coverage passing over the poles shows an interesting 'circle' effect where coverage diversity appears to be evaluated once for the entire around-the-pole circular region. This may be dependent on Geomview rendering options. Coverage texturemap is not immediately updated when turning 'project groundtracks forward in time' on or off, so it is out of sync with coverage window until the next animation step. i. VARIOUS Constellation generation tools should be working at a higher level of abstraction: generating constellation to match input properties for behaviour and characteristics, rather than just taking orbital parameters as input without calculating what is needed and then generating those parameters to give a desired outcome. Implement per-satellite coverage angles, as a property of each satellite when it is created, like the name. But global coverage properties for constellations are useful, and the global slider will be hard to give up - how do we do both? Do we need to store half-angle/mask setting on a per-satellite basis? Improve time display, so that groundtrack drawing has useful 'elapsed time', and the time that the fisheye and coverage displays are stopped can be easily read from their respective windows. Average coverage display needs to count number of intervals sampled, since time between intervals can be changed. Implement a -start <+/- seconds> switch, so that a simulation can be loaded at a specific point. Also -coverage, -fisheye, -edit to open up the various windows on startup; can these be scripted? Allow switching between a set of default values for various planets (e.g. Venus, Earth, Mars) with matching surface maps, and even a default Constellations menu for each planet. This wuold involve changing the body gravity/spin defaults and possibly adding a finetuned special-case per-planet orbit model to handle the equivalent of Earth's J2 precession. A different default colour scheme to indicate 'not Earth' is probably also a good idea. A number of scripts - Clarke geostationary, Draim, possibly Molnya/Tundra - could compute from the defaults and generalise to any planet; three-satellite Mars stationary would be the first target. Other constellation scripts would be Earth-specific. More accurate Earth gravitational models than J2, e.g. J20, could be implemented via the new -orbit-model flag and the switch cases in orbit_utils.c::oe_time_to_oe(). Related to that, the faked 'sun' satellite should always be running off the simplest Keplerian J0, to avoid amplifying Earth oddities. Accurate gravitational models for each planet would be useful. Maps for each planet can be obtained from e.g. Stuart Levy's The Orrery for Geomview, or from James Hastings-Trew at http://planetpixelemporium.com/ JHT's maps are unprojected, so require STSPHERE CYLINDRICAL 1 0 0 0 rather than { : numesh_h } in oogl/earth.oogl, which means at least Geomview 1.9.0 for support. They're large, even once run through jpegtopnm and compressed, so would have to be optional. A way of drawing coverage on a translucent sphere just over the planet map (but just under e.g. the Earth boundary vectors) would be useful, so that colourful maps could be combined with coverage and diversity. But this needs alpha rendering support; easier to do the maths and mapping upfront when drawing a single coverage map. TLE loading code is inelegant; a new popup function tying menu name and url to load together would be desirable and easier to maintain. Makefiles, header files and #include dependencies could be much better. There's no attempt to optimise with judicious use of inlines, but since we spend most of our time in the Tcl interpreter, gains would be minimal and we can't inline functions in other files anyway. Adding -O2 in src/Makefile (and turning off -g debug) has produced a smaller and faster executable. j. INTERACTION WITH OTHER 3D RENDERERS Are there other 3D renderers with piped input for which SaVi could add support? An alternative is to simply render the constellation in a web browser using d3.js. This is shown to be possible by the animations in: Ashlee Vance, The New Space Race: One Man's Mission To Build A Galactic Internet, Bloomberg News, 23 January 2015. http://www.bloomberg.com/news/features/2015-01-22/the-new-space-race-one-man-s-mission-to-build-a-galactic-internet-i58i2dp6 so scripts in Javascript would replace Tcl, and d3 driving the browser would replace Geomview. k. INTERACTION WITH OTHER SIMULATORS network simulator ns-2 - http://www.isi.edu/nsnam/ SaVi can generate output in a format suitable for Lloyd Wood's perl ns-2 satplotscripts. This really requires working intersatellite-link functionality to be useful; drawing satellite positions alone doesn't give much over the coverage panel, other than satellite names, unless you need a postscript map. ns-2 could write the simplest SaVi format that describes satellites (the simple Tcl scripts that SaVi saves files as...) to allow SaVi to show where ns-2 satellites are. Over time the ns-2 and SaVi simulations will diverge if SaVi is using the more complex J2 orbital model - the simpler J0 model should be preferable in this case. The default ns output format for Lloyd Wood's perl ns-2 satplotscripts describes long/lat position, but does not include orbital information such as altitude, making it useless for SaVi to simulate from files in that format as it stands. A new format would be needed. The later ns-3 does not yet include satellite simulation functionality. l. DESIRABLE CONSTELLATIONS TO SIMULATE Many newly-announced large satellite constellations can be simulated, and there's a backlog of FCC filings with technical supplements to find, read, and create outline simulations from. Add a Chinese BeiDou-2 navigation constellation simulation script. The complete perfect BeiDou-2 constellation has five geostationary, three inclined geosynchronous, and 27 medium earth orbit satellites. 4. REMAINING INTEGRATION WORK FROM UNRELEASED SAVI 1.1 ====================================================== This work requires detailed knowledge of relevant geometry, satellite requirements, SaVi and Geomview in order to build on Patrick Worfolk's efforts. - Intersatellite link simulation in SaVi and Geomview - although this really needs a good scripting interface, and must also consider visibility, handoff, and configuration. 5. REMAINING ITEMS FROM THE ORIGINAL SAVI 1.0 WISHLIST ====================================================== - Ability to input satellite positions correctly in two-line-element format, allowing multiple satellites with different epoch times to be simulated correctly simultaneously. - Incorporation of actual time into program so that the evolution of real satellites can be monitored. - Full incorporation of NORAD SGP4/SDP4 propagation models for NORAD two-line element sets for added realism. Lloyd Wood savi1.6.0/tcl/0000755000175000017500000000000014423445060012217 5ustar lloydlloydsavi1.6.0/tcl/utils.tcl0000644000175000017500000005623314423445060014074 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # utils.tcl # # $Id: utils.tcl 50 2019-08-01 11:47:29Z lloydwood $ proc window(raise) {window} { if [winfo exists .$window] { wm deiconify .$window raise .$window return 1 } return 0 } # Routines for helping to construct tk windows # # Construction routines: # build_Toplevel # build_Title # build_StdFrame # build_CmdFrame # build_Menubar # build_Menu # build_Buttonbar # build_DismissButtonbar # build_Optionslist # build_HOptionslist # build_Scrollingtext # build_Text # build_IPopupMenu # build_PopupMenu # build_LabelEntryColumns # build_Label # build_Message # build_Radiobutton # # # Other routines: # build_Wname # update_Popupmenu # longest # loadfile_into_text # New routines: # string_ends # These procedures use the global variables COLOR and FONT in # order to configure them. In particular, they may reference: # COLOR(bg) # COLOR(abg) # COLOR(entry) # FONT(button) # FONT(label) # TITLE # # Other global variables used are: # main(title) - for a string to appear in all titlebars made # with build_Title # # string_ends {filename extension} # # returns true if filename ends with extension # proc string_ends {filename extension} { set file_length [string length "$filename"] set ext_length [string length "$extension"] set file_end [string range "$filename" \ [expr $file_length - $ext_length] $file_length] if {[string compare $file_end "$extension"] == 0} { return 1 } else { return 0 } } # # build_Wname # # Converts name to a tk window name by placing a '.' at the beginning # # Returns: .name # proc build_Wname {name} { return .$name } # # build_Toplevel # # Builds a new window using name (which must be unique). # The name is passed to build_Wname to convert it to a Tk window name # # Returns: the tk window name # proc build_Toplevel {name} { set wname [build_Wname $name] if {![winfo exists $wname]} { toplevel $wname } return $wname } # # build_Title # # Set the title of a toplevel window with the string "main(title) $title" # proc build_Title {name title} { global TITLE wm title $name "$TITLE: $title" } # # build_StdFrame # # Builds a plain frame with specifed name in specified parent # This widget is not packed. # # Returns: the tk frame widget name parent.name # proc build_StdFrame {parent name} { set fname $parent.$name if {![winfo exists $fname]} { frame $fname } return $fname } # # build_CmdFrame # # Builds a raised frame with specifed name in specified parent # to become an area of a window to put widgets # This widget is not packed # # Returns: the tk frame widget name parent.name # proc build_CmdFrame {parent name} { set fname $parent.$name if {![winfo exists $fname]} { frame $fname -relief raised -bd 1 } return $fname } # # build_Menubar # # Usage: # build_Menubar parent name { helpmenu stuff } { menu stuff } ... # # Builds a menubar as specified. The first menu specification is # always placed all the way to the right and is expected to be a help menu. # The others are placed starting at the left. # proc build_Menubar {parent name helpmenu args} { global FONT buttons_menu # create menubar if {$buttons_menu == 1} { set mbarname [ build_CmdFrame $parent $name ] } else { set mbarname $parent.$name menu $mbarname -tearoff 0 } # menubars are not currently rebuilt! if [winfo exists $mbarname.b0] { puts stderr "\nbuild_Menubar: NOT rebuilding $mbarname" return } if {$buttons_menu == 1} { # put menubar at top of each windowpane # add help menubutton on right side # hack to show all text cut short by popup indicator set helpname [lindex $helpmenu 0] set helpname "$helpname " if {[llength $helpmenu] > 1} { menubutton $mbarname.help -text $helpname \ -menu $mbarname.help.menu -font $FONT(button) eval build_Menu $mbarname.help [lrange $helpmenu 1 end] pack $mbarname.help -side right } #add other menubuttons on left side set i 0 ; set menubuttons {} foreach arg $args { if {[llength $arg] > 0} { # hack to show all text cut short by popup indicator # two spaces for long words set menuname [lindex $arg 0] set menuname "$menuname " menubutton $mbarname.b$i -text $menuname \ -menu $mbarname.b$i.menu -font $FONT(button) lappend menubuttons $mbarname.b$i if {[llength $arg] > 1} { eval build_Menu $mbarname.b$i [lrange $arg 1 end] } incr i } } if {[llength $menubuttons] > 0} { eval pack $menubuttons -side left } # display menubar across the top of the panel pack $mbarname -side top -fill x return $mbarname } #add menus (except help) on left side of menubar area set i 0 foreach arg $args { if {[llength $arg] > 0} { $mbarname add cascade -menu $mbarname.b$i -label [lindex $arg 0] \ -font $FONT(button) if {[llength $arg] > 1} { eval build_Menu $mbarname.b$i [lrange $arg 1 end] } incr i } } # add help menu on right side if {[llength $helpmenu] > 1} { $mbarname add cascade -menu $mbarname.helpx -label [lindex $helpmenu 0] \ -font $FONT(button) eval build_Menu $mbarname.helpx [lrange $helpmenu 1 end] } # display menubar across the top of the panel $parent configure -menu $mbarname return $mbarname } # # build_Menu # # Usage: # build_Menu mname {"Load..." load_open} {} {"Exit" tk_exit} ... # # Builds a menu with an arbitrary number of entries. # Empty entries result in menu separators. # proc build_Menu {parent args} { global FONT buttons_menu modifier modifier_indicator # needed for Mac freeze workaround, which does not affect -redrawn-menus global buttons_menu # create menu if {$buttons_menu == 1} { set mname $parent.menu menu $mname -font $FONT(label) } else { set mname $parent menu $mname } set parent_window [string range $parent 0 [expr [string wordend $parent 1]-1]] # Do we disable on Mac to work around Mac menu+accelerator then # window draw freeze bug? This problem affects 10.6 with the default # supplied Tcl/Tk 8.5.7, when accelerator keys are used with Mac # menus. set disable_mac [expr ([string compare $modifier "Command"] == 0) && !$buttons_menu] # Tcl 8.5.9 under 10.7.2 or ActiveTcl 8.6b1.2 don't need this, # so the following line can be uncommented. # set disable_mac 0 # add commands to menu foreach arg $args { if {[llength $arg] > 1} { set name [lindex $arg 0] if {[string compare $name "SUBMENU"] == 0} { set submenu_id [lindex $arg 1] set submenu_name [lindex $arg 2] $mname add cascade -menu $mname.$submenu_id -label $submenu_name } else { set command [lindex $arg 1] set key [lindex $arg 2] if {(!$disable_mac)&&([string length $key] > 0)} { set accelerator $modifier_indicator-[lindex $arg 2] set upperkey [string toupper $key] set lowerkey [string tolower $key] # We have to bind to .main, .coverage etc. Just . doesn't work bind $parent_window <$modifier-$upperkey> $command bind $parent_window <$modifier-$lowerkey> $command } else { set accelerator "" } $mname add command -label $name -command $command -accelerator $accelerator } } else { $mname add separator } } return $mname } # # build_Buttonbar # # Usage: build_Buttonbar parent name {"Button1" action} ... # proc build_Buttonbar {parent name args} { global FONT # create buttonbar set bbarname [ build_CmdFrame $parent $name ] # add buttons set i 0 foreach arg $args { if {[llength $arg] > 1} { if {![winfo exists $bbarname.b$i]} { button $bbarname.b$i -font $FONT(button) pack $bbarname.b$i -side left -padx 2 -pady 2 } set name [lindex $arg 0] if {([string compare $name "Cancel"] == 0) || ([string compare $name "Close"] == 0) || ([string compare $name "Restart"] == 0) || ([string compare $name "Dismiss"] == 0) || ([string compare $name "Dismiss window"] == 0)} { # pad to avoid drawing under grow box (Mac OS X) pack $bbarname.b$i -side right -padx 15 } $bbarname.b$i configure -text [lindex $arg 0] \ -command [lindex $arg 1] incr i } while [winfo exists $bbarname.b$i] { destroy $bbarname.b$i incr i } } pack $bbarname -fill x return $bbarname } # # build_DismissButtonbar # # Builds a button bar with a dismiss button on the right-hand side # and the rest lined up on the left. # # Usage: build_DismissButtonbar parent name "dismiss command" \ # {"Button1" "button1 command"} ... # proc build_DismissButtonbar {parent name dismiss args} { global FONT # create buttonbar set bbarname [ build_CmdFrame $parent $name ] # add other buttons set i 0 foreach arg $args { if {[llength $arg] > 1} { if {![winfo exists $bbarname.b$i]} { button $bbarname.b$i -font $FONT(button) pack $bbarname.b$i -side left -padx 2 -pady 2 } $bbarname.b$i configure -text [lindex $arg 0] \ -command [lindex $arg 1] incr i } while [winfo exists $bbarname.b$i] { destroy $bbarname.b$i incr i } } # add dismiss button on right side if {![winfo exists $bbarname.dismiss]} { button $bbarname.dismiss -font $FONT(button) # pad to avoid drawing under grow box (Mac OS X) pack $bbarname.dismiss -in $bbarname -side right -anchor e \ -padx 15 -pady 2 } $bbarname.dismiss configure -text "Dismiss window" -command $dismiss pack $bbarname -side bottom -fill x } # # build_Optionslist # # Procedure to make a list of option items # # Usage: build_Optionslist parent name \ # {"Switch 1" switch1} {"Switch 2" switch2} ... # # The variables switch1,2 are set to 0 or 1 according to whether # the switch is set or not. # proc build_Optionslist {parent name args} { global FONT # create options list set olistname [ build_StdFrame $parent $name] # add options set i 0 foreach arg $args { if {[llength $arg] > 1} { if {![winfo exists $olistname.b$i]} { checkbutton $olistname.b$i -anchor w -font $FONT(label) pack $olistname.b$i -side top -fill x -padx 0.1c -pady 0.1c } set name [lindex $arg 0] $olistname.b$i configure -text " $name" \ -variable [lindex $arg 1] incr i } while [winfo exists $olistname.b$i] { destroy $olistname.b$i incr i } } pack $olistname -pady 0.1c -anchor w } # # build_HOptionslist # # Procedure to make a horizontal list of option items # # Usage: build_HOptionslist parent name cmd \ # {"Switch 1" switch1} {"Switch 2" switch2} ... # # The variables switch1,2 are set to 0 or 1 according to whether # the switch is set or not, and then the cmd is executed. # proc build_HOptionslist {parent name cmd args} { global FONT # create options list set olistname [ build_StdFrame $parent $name] # add options set i 0 foreach arg $args { if {[llength $arg] > 1} { if {![winfo exists $olistname.b$i]} { checkbutton $olistname.b$i -anchor w -font $FONT(label) -command $cmd pack $olistname.b$i -side left -padx 0.1c -pady 0.1c } $olistname.b$i configure -text [lindex $arg 0] \ -variable [lindex $arg 1] incr i } while [winfo exists $olistname.b$i] { destroy $olistname.b$i incr i } } pack $olistname -pady 0.1c -anchor w } # # build_Scrollingtext # # Builds a widget for text and a scrollbar # proc build_Scrollingtext {parent name width height} { global COLOR FONT # create stext frame set stext [ build_StdFrame $parent $name ] # add text widget if {![winfo exists $stext.text]} { text $stext.text -relief sunken -bd 2 \ -yscrollcommand "$stext.scroll set" \ -bg $COLOR(entry) -font $FONT(label) \ -width 1 -height 1 $stext.text configure -width $width -height $height -wrap word pack $stext.text -side left -fill both -expand 1 } # add scrollbar if {![winfo exists $stext.scroll]} { scrollbar $stext.scroll -command "$stext.text yview" pack $stext.scroll -side right -fill y } pack $stext -expand 1 -fill both return $stext.text } # # build_Text # # Builds a widget for text # proc build_Text {parent name width height} { global COLOR FONT # build text widget if {![winfo exists $parent.text]} { text $parent.text -relief sunken -bd 2 \ -bg $COLOR(entry) -font $FONT(label) \ -width 1 -height 1 $parent.text configure -width $width -height $height pack $parent.text -fill both -expand 1 } return $parent.text } # # update_PopupMenu # # Utility routine for build_PopupMenu and build_IPopupMenu # proc update_PopupMenu {name str cmd args} { # $name configure -text "$str ~" $name configure -text "$str" foreach arg $args { uplevel #0 $arg } eval $cmd } # # build_IPopupMenu # # Constructs a popup menu # proc build_IPopupMenu { parent name label ivar command items } { global FONT set wname [build_StdFrame $parent $name] # make label if {![winfo exists $wname.label]} { label $wname.label -anchor w -font $FONT(label) } $wname.label configure -text $label # if no items then do not create menubar! if {![llength $items]} { if [winfo exists $wname.mb] {destroy $wname.mb} pack $wname.label -side left -padx 0.1c pack $wname -fill x -pady 0.1c return $wname } # make menubutton if {![winfo exists $wname.mb]} { menubutton $wname.mb -menu $wname.mb.m -anchor n -relief raised \ -font $FONT(label) \ -indicatoron 1 } upvar #0 $ivar iv set w [expr [longest $items] + 4] $wname.mb configure -text "[lindex $items $iv]" -width $w # make menu if [winfo exists $wname.mb.m] { destroy $wname.mb.m } menu $wname.mb.m -font $FONT(label) set i 0 foreach item $items { $wname.mb.m add command -label $item -command \ [list update_PopupMenu $wname.mb $item $command [list set $ivar $i]] incr i } pack $wname.label $wname.mb -side left -padx 0.1c pack $wname -fill x -pady 0.1c return $wname } # # build_PopupMenu # # Constructs a popup menu # # Usage: build_PopupMenu parent name "Algorithm:" \ # alg_var alg_proc {"Alg 0" "Alg 1" "Alg 2" ...} # where alg_var is the variable which gives the index of the selected # algorithm and alg_proc gets called whenever the algorithm is changed. # proc build_PopupMenu { parent name label ivar command items } { global FONT set wname [build_StdFrame $parent $name] # make label if {![winfo exists $wname.label]} { label $wname.label -anchor w -font $FONT(label) } $wname.label configure -text $label # if no items then do not create menubar! if {![llength $items]} { if [winfo exists $wname.mb] {destroy $wname.mb} pack $wname.label -side left -padx 0.1c pack $wname -fill x -pady 0.1c return $wname } # make menubutton if {![winfo exists $wname.mb]} { menubutton $wname.mb -menu $wname.mb.m -anchor n -relief raised \ -font $FONT(label) \ -indicatoron 1 } upvar #0 $ivar iv set w [expr [longest $items] + 4] $wname.mb configure -text "[lindex $items $iv]" -width $w # make menu if [winfo exists $wname.mb.m] { destroy $wname.mb.m } menu $wname.mb.m -font $FONT(label) set i 0 foreach item $items { $wname.mb.m add command -label $item -command \ [list update_PopupMenu $wname.mb $item $command \ [list set $ivar $i]] incr i } pack $wname.label $wname.mb -side left -padx 0.1c pack $wname -fill x -pady 0.1c return $wname } ########################################################################## # # utility: n-column builder # notes: builds n columns, each column is one of # entry or label widget # # build_Toplevel zoo col ZOO # build_LabelEntryColumns lentry zoo.col sel \ # {label "title1" {l1 l2 l3 l4} } \ # {entry "title2" {e1 e2 e3 e4} } \ # {foo "title3" {f1 f2 f3 f4} } \ # ########################################################################## proc build_LabelEntryColumns {parent name args } { global COLOR FONT PLATFORM build_StdFrame $parent $name # set _tablist {} set cn 0 foreach c $args { set _type [lindex $c 0] set _code c$cn set _head [lindex $c 1] set _list [lindex $c 2] set valid_type 1 set pady 0 set col_config {$obj_n configure -textvariable $l} # set col_tab {set valid_type} if { [string compare $_type "label"] == 0 } { set col_entry {label $obj_n -anchor n -font $FONT(label)} set pady 2 } elseif { [string compare $_type "dlabel"] == 0 } { set col_entry {label $obj_n -width 23 -relief sunken -anchor w -font $FONT(label) } set pady 2 } elseif { [string compare $_type "ilabel"] == 0 } { set col_entry {label $obj_n -width 10 -relief sunken -anchor w -font $FONT(label) } if {$PLATFORM == 2} { set pady 2 } elseif {$PLATFORM == 1} { set pady 4 } else { set pady 3 } } elseif { [string compare $_type "text"] == 0 } { set col_entry {label $obj_n -anchor e -font $FONT(label)} if {$PLATFORM == 2} { set pady 2 } elseif {$PLATFORM == 1} { set pady 4 } else { set pady 4 } set col_config {$obj_n configure -text $l} } elseif { [string compare $_type "dentry"] == 0 } { set col_entry {entry $obj_n -width 10 -relief sunken -bg $COLOR(entry) -font $FONT(label) } # set col_tab { lappend _tablist $obj_n } if {$PLATFORM == 2} { set pady 4 } elseif {$PLATFORM == 1} { set pady 1 } else { set pady 2 } } elseif { [string compare $_type "ientry"] == 0 } { set col_entry {entry $obj_n -width 10 -relief sunken -bg $COLOR(entry) -font $FONT(label)} # set col_tab { lappend _tablist $obj_n } if {$PLATFORM == 2} { set pady 4 } elseif {$PLATFORM == 1} { set pady 3 } else { set pady 2 } } elseif { [string compare $_type "lentry"] == 0 } { set col_entry {entry $obj_n -width 40 -relief sunken -bg $COLOR(entry) -font $FONT(label)} # set col_tab { lappend _tablist $obj_n } } elseif { [string compare $_type "checkbox"] == 0 } { set col_entry {checkbutton $obj_n -anchor w -variable $l -font $FONT(label)} set col_config {$obj_n configure -text ""} } elseif { [string compare $_type "lcheckbox"] == 0 } { set col_entry {checkbutton $obj_n -anchor w -variable $l -font $FONT(label)} set col_config {$obj_n configure -text " Record ground tracks and project forwards "} } elseif { [string compare $_type "slider"] == 0 } { set col_entry {scale $obj_n -from 0 -to 100 -command $l \ -length 4c -showvalue false } if {$PLATFORM == 2} { set pady 1 } elseif {$PLATFORM == 1} { set pady 5 } else { set pady 2 } set col_config {$obj_n configure -orient horizontal} } else { # widget type not recognized set valid_type 0 puts stderr "\nunknown widget name: $_type" } if {$valid_type} { # create column and header set obj $parent.$name.$_code if {![winfo exists $obj]} { frame $obj pack $obj -fill x -side left # -padx 2 -pady 1 } if {[string length "$_head"]} { if {![winfo exists $obj.head]} { label $obj.head -anchor n -font $FONT(label) pack $obj.head -side top -padx 2 -pady 1 } $obj.head configure -text "$_head" } else { if [winfo exists $obj.head] { destroy $obj.head } } # add elements to column set _n 0 foreach l $_list { set obj_n $obj.$_n if {![winfo exists $obj_n]} { eval $col_entry pack $obj_n -side top -padx 0.1c -pady $pady -fill x } eval $col_config # eval $col_tab incr _n } while [winfo exists $obj.$_n] { destroy $obj.$_n incr _n } } # prepare for next column incr cn } while [winfo exists $parent.$name.c$cn] { destroy $parent.$name.c$cn incr cn } # if {[llength $_tablist] > 0} { # setTabbing $_tablist $name # focus [lindex $_tablist 0] # } pack $parent.$name -fill x -pady 0.1c return $parent.$name } # # build_Label # # Usage: build_Label parent name message # proc build_Label {parent name message} { global FONT set fname [build_StdFrame $parent $name] if [winfo exists $fname.label] { $fname.label configure -text $message } else { label $fname.label -text $message -font $FONT(label) pack $fname.label -expand 1 -fill both } pack $fname -anchor w -padx 0 -pady 0 return $fname } # # build_options_menu # # Usage: # build_options_menu owner {"Load..." load_open} {} {"Exit" tk_exit} ... # # where the number of entries is arbitrary and empty entries result # in separators. # proc build_options_menu {owner args} { global FONT buttons_menu if {$buttons_menu == 1} { set owner $owner.menu } # create menu if [winfo exists $owner] { destroy $owner } if {$buttons_menu == 1} { menu $owner -font $FONT(label) } else { menu $owner } # add commands to menu foreach arg $args { if {[llength $arg] > 1} { if {[llength $arg] == 2} { $owner add checkbutton -label [lindex $arg 0] \ -variable [lindex $arg 1] } if {[llength $arg] == 3} { set name [lindex $arg 0] if {[string compare $name "SUBMENU"] == 0} { set submenu_id [lindex $arg 1] set submenu_name [lindex $arg 2] $owner add cascade -menu $owner.$submenu_id -label $submenu_name } } } else { $owner add separator } } } # return the length of the longest string in a list proc longest list { set len 0 foreach l $list { set ll [string length $l] if {$ll > $len} {set len $ll} } return $len } # # loads a file into the end of a text widget # returns 1 if successful, else 0 # proc loadfile_into_text {textw filename} { set ok 0 if {[file exists "$filename"]} { set f [open "$filename"] while {![eof $f]} { $textw insert end [read $f 1000] } close $f set ok 1 } return $ok } savi1.6.0/tcl/save.tcl0000644000175000017500000000505414423445060013665 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # save.tcl # # $Id: save.tcl 132 2020-01-03 10:22:37Z lloydwood $ proc save(build) {} { global last_filename user_file_dir set types { {"SaVi simulation scripts" {.tcl} } } set filenotfound 1 while {$filenotfound == 1} { set filename [tk_getSaveFile -initialdir "$user_file_dir" -filetypes $types \ -title "SaVi: save satellites" ] if {"$filename" == ""} return set filename [save(extension) "$filename" "tcl"] # are we overwriting a file that adding the extension didn't catch? if {[file exists $filename]} { puts stderr "\nSaVi: Not saved! $filename already exists!" } else { set filenotfound 0 } } # open file set f [open "$filename" w] if {$f == ""} { puts stderr "\nSaVi: couldn't save satellites to $filename" return } puts $f "\# SaVi saved satellites" puts $f "\# http://savi.sourceforge.net/" set n [.main.cmd.lb size] # put a wrapper around satellite creation puts $f "satellites GV_BEGIN" # write satellites # skip 0, as that's sunlight for {set i 1} {$i <= $n} {incr i} { set name [satellites GET_NAME $i] set noe [satellites GET $i] # we strip elements of extraneous settings set noe [string range $noe 0 70] puts $f "satellites LOAD $noe \"$name\"" } # close file puts $f "satellites GV_END" close $f puts stderr "\nSaVi: saved satellites to $filename" set last_filename "$filename" main(title) "$filename" } proc save(extension) {filename extension} { if {[string last "$extension" ".$filename"] < 0} { return "$filename.$extension" } else { return "$filename" } } proc save(gzip_file) {filename} { set gzip gzip if {[catch {eval exec $gzip -9 "$filename"}]} { puts stderr "\nSaVi: failed to compress file with $gzip." return FALSE } puts stderr "\nSaVi: saved $gzip-compressed file to $filename.gz" return TRUE } savi1.6.0/tcl/no_frames.tcl0000644000175000017500000000407314423445060014700 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # no_frames.tcl # # $Id: no_frames.tcl 8 2019-01-24 04:33:00Z lloydwood $ proc no_frames(build) {} { if {[eval window(raise) no_frames]} return set name [build_Toplevel no_frames] wm protocol $name WM_DELETE_WINDOW no_frames(dismiss) build_Title $name "Choose no. of frames to save..." build_Buttonbar $name dbbar \ {"10" "no_frames(save) 10"} \ {"50" "no_frames(save) 50"} \ {"100" "no_frames(save) 100"} \ {"500" "no_frames(save) 500"} \ {"1000" "no_frames(save) 1000"} \ {"single snapshot" "no_frames(save) 1"} \ {"Cancel" "no_frames(dismiss)"} update } proc no_frames(save) v { global user_file_dir if {$v < 0} return no_frames(dismiss) set types { {"SaVi snapshot frames" {.ppm} } } set filename [tk_getSaveFile -initialdir "$user_file_dir" -filetypes $types \ -title "SaVi: save frames to folder" ] if {"$filename" == ""} return set length [string length "$filename"] if {[string_ends "$filename" ".ppm"]} { set filename [string range "$filename" 0 [expr $length - 5]] } if {$v == 1} { geomview(puts) "(snapshot focus $filename.ppm)" } else { for {set j 0} {$j < $v} {incr j} { set n [format "%07d" $j] geomview(wait) geomview(puts) "(snapshot focus $filename$n.ppm)" main(forw_step) geomview(wait) } } } proc no_frames(dismiss) {} { destroy .no_frames } savi1.6.0/tcl/sunlight.tcl0000644000175000017500000000733414423445060014567 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # sunlight.tcl # # $Id: sunlight.tcl 199 2023-04-16 08:59:33Z lloydwood $ # Sunlight on Earth # # We fake the Sun as a satellite taking a year to orbit Earth, # with the same inclination as the ecliptic. # # This is intended to give a realistic day/night terminator # in the global coverage panel. # (Turning on interval decay to see the night in blue helps.) proc sunlight(create) {} { global PI params set MU $params(Mu) # set up orbital elements # CHECK EARTH'S ORBIT! # Which way round the Sun does the Earth rotate? # (See Orrery - should be anticlockwise when viewed from north pole.) # Which way round the Earth does this solar 'satellite' rotate? # (should also be anticlockwise, but the Earth is spinning # hundreds of times faster -- and anticlockwise -- making it # look clockwise.) # Radius of Earth's orbit is 150 million km, more or less -- # Semimajor axis (10^6 km) 149.60 # Sidereal orbit period (days) 365.256 # Tropical orbit period (days) 365.242 # Perihelion (10^6 km) 147.09 # Aphelion (10^6 km) 152.10 # but that's only meaningful for a year's period when in the Sun's # gravitational field, which we're not. So we must fake up an # altitude to give us the same period from an orbit in the Earth's # gravitational field instead, by manipulating the classic: # set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # equation to get what we want with the MU and period # we have to use. # We can use these: # Earth Mean Orbital Elements (J2000) # # Semimajor axis (AU) 1.00000011 # Orbital eccentricity 0.01671022 # Orbital inclination (deg) 0.00005 # Longitude of ascending node (deg) -11.26064 # Longitude of perihelion (deg) 102.94719 # Mean Longitude (deg) 100.46435 # 1 AU = 149,597,870.691 kilometres # data from NASA Earth fact sheet: # # http://nssdc.gsfc.nasa.gov/planetary/factsheet/earthfact.html # set period of a year. set T_per $params(orbital_period) set a1 [expr $T_per * sqrt($MU) / ( 2 * $PI) ] set a [expr pow($a1,0.666666667)] # Inclination is angle between planes of equator and ecliptic. set inc $params(tilt) # Eccentricity of 0 is an approximation -- # if we set this to anything other than zero, we'll # have considerable trouble with getting omega right # in our modified environment for a given year. # real Earth orbit has eccentricity of 0.0167 set e 0.0 set omega 0.0 set Omega 0.0 # Special-casing coverage as 0 is set in C code. # We want to start with equinox on the international date line. # Matches behaviour of SaVi 1.1 where Sun starts as fourth axis. set T [expr -$T_per/2] # Disabling visibility in Geomview is a nice touch; # avoiding zooming out when you press Look is useful. set disp_satellite 0 set disp_coverage 1 set disp_orbit 0 # Prevent Geomview from drawing while we load in the satellites. satellites GV_BEGIN set sat [satellites LOAD $a $e $inc $Omega $omega $T "sunlight"] # below line needs SaVi > 1.0 for all trailing parameters satellites SET $sat $a $e $inc $Omega $omega $T \ $disp_satellite $disp_orbit $disp_coverage satellites GV_END } savi1.6.0/tcl/geomview.tcl0000644000175000017500000000630014423445060014544 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # geomview.tcl # # $Id: geomview.tcl 8 2019-01-24 04:33:00Z lloydwood $ proc geomview(new_camera) {} { geomview(puts) "(new-camera Camera)" } proc geomview(camera_north_pole) {} { geomview(camera_position) 0 0 3 } proc geomview(camera_south_pole) {} { geomview(camera_position) 0 0 -3 } proc geomview(camera_position) {x y z} { geomview(begin) geomview(puts) "(geometry A { QUAD 0 0 0 0 0 0 0 0 0 0 0 0 })" geomview(puts) "(geometry B { QUAD 0 0 0 0 0 0 0 0 0 0 0 0 })" geomview(puts) "(transform A g0 g0 translate $x $y $z)" geomview(puts) "(position-at c0 A)" geomview(puts) "(position-at c0 A)" geomview(puts) "(look-toward B c0)" geomview(puts) "(delete A)" geomview(puts) "(delete B)" geomview(end) } proc geomview(choose_background_color) {} { global COLOR set color [tk_chooseColor -initialcolor $COLOR(geomview) -parent .main \ -title "SaVi: background color in Geomview"] if {($color == "") || ($color == $COLOR(geomview))} return set COLOR(geomview) $color geomview(set_background_color) } proc geomview(set_background_color) {} { global COLOR set value [string range $COLOR(geomview) 1 6] set GEOM [expr 0x$value] set GEOMB [expr $GEOM % 256] set GEOMG [expr ($GEOM - $GEOMB)/256 % 256] set GEOMR [expr ($GEOM - $GEOMB - $GEOMG * 256) / 65536] set geomb [expr $GEOMB / 255.0] set geomg [expr $GEOMG / 255.0] set geomr [expr $GEOMR / 255.0] geomview(puts) "(backcolor focus $geomr $geomg $geomb)" } proc geomview(wait) {} { satellites GV_WAIT } proc geomview(begin) {} { satellites GV_BEGIN } proc geomview(end) {} { satellites GV_END } proc geomview(puts) v { satellites GV_SEND $v } proc geomview(update_texture) {} { global geomview_module earth_flag if {($geomview_module == 1)} { geomview(begin) # recreate the Earth if it exists set flag $earth_flag set earth_flag 0 if {$flag == 1} { set earth_flag 1 } geomview(end) } } proc geomview(update_cones_footprints) {} { global geomview_module cones_flag earth_flag footprints_flag if {$geomview_module == 1} { geomview(begin) # recreate the Earth if it exists set flag $earth_flag set earth_flag 0 if {$flag == 1} { set earth_flag 1 } set flag $footprints_flag set footprints_flag 0 if {$flag == 1} { set footprints_flag 1 } set flag $cones_flag set cones_flag 0 if {$flag == 1} { set cones_flag 1 } geomview(end) } } savi1.6.0/tcl/empty.tcl0000644000175000017500000000223014423445060014056 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # empty.tcl # # $Id: empty.tcl 8 2019-01-24 04:33:00Z lloydwood $ proc empty(build) {} { if {[eval window(raise) empty]} return set name [build_Toplevel empty] wm protocol $name WM_DELETE_WINDOW empty(dismiss) build_Title $name "empty space?" build_Buttonbar $name dbbar \ {"Empty space of all satellites" empty(delete_all)} \ {"Cancel" empty(dismiss)} update } proc empty(delete_all) {} { main(delete_all) empty(dismiss) } proc empty(dismiss) {} { destroy .empty } savi1.6.0/tcl/constellations.tcl0000644000175000017500000002441614423445060015773 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2014 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # constellations # # Procedures to: # # - generate a constellation # - read a two line element file # # TLE reading and constellation generation are incomplete, and # hard to get right. Use at own risk. # These need considerable expansion and work. # # $Id: constellations.tcl 140 2020-01-06 05:09:39Z lloydwood $ proc walker {T P F alt inc lan_offset phase_offset} { # this attempted to generate a Walker delta constellation # constellation using Walker's later T/P/F notation, which # is equivalent to Ballard's fractional harmonics. # Users might have expected a Walker star instead; # the term 'Walker constellation' is meaningless, since # Walker's papers cover a very wide range of geometries. # This procedure is retired, and now does nothing by design. # An altered version is below. } # walker_star # # Very crude star constellation creation. Needs more work. # proc walker_star {NUM_PLANES SATS_PER_PLANE alt inc e omega lan_offset phase_offset name} { global PI params source_comments set source_comments "generated by the crude star tool. This is a very basic star constellation, without the counter-rotating seam adjustment overlap of coverage expected for Adam and Rider 'streets of coverage' and for Walker star constellations. See: J. G. Walker, Satellite constellations, Journal of the British Interplanetary Society, vol. 37, pp. 559-571, 1984. W. S. Adams and L. Rider, Circular polar constellations providing continuous single or multiple coverage above a specified latitude, Journal of the Astronautical Sciences, vol. 35 no. 2, pp. 155-192, April-June 1987. A brief summary of the seam geometry is in: J. Restrepo and G. Maral, Analysis and comparison of satellite constellation configurationsfor global single permanent visibility, Fifth International Conference on Satellite Systems for Mobile Communications and Navigation, May 1996, pp. 102-105. The crude star tool needs to consider desired coverage as an input to the computation of seam offset spacing, in line with these papers. " # simulation constants set elsewhere in SaVi - see params.tcl set MU $params(Mu) set RADIUS_OF_EARTH $params(Radius) # this is a very crude first approximation. No seam adjustment set INTERPLANE_SPACING [expr 180.0 / $NUM_PLANES] # setup orbital elements set a [expr $alt+$RADIUS_OF_EARTH] # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # 360 degrees is $T_per; get the fraction. set plane_offset [expr $T_per / $SATS_PER_PLANE / 2.0 ] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * $INTERPLANE_SPACING + $lan_offset] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * $i / $SATS_PER_PLANE - $plane_offset * $j ] set n [satellites LOAD $a $e $inc $Omega $omega $T] satellites NAME $n "$name ($j, $i)" if {$i > 0} { satellites ORBIT_SET $n 0 } } } satellites GV_END } # Rough approximation of a Ballard (Walker delta) constellation. # note use of harmonic factor AND use of phase_offset. # We pass no. of planes and no. of satellites rather than total # number of satellites to avoid division. # NUM_PLANES number of planes # SATS_PER_PLANE number of satellites per plane # F interplane phasing is (360/T)*F - harmonic factor # alt altitude of satellites # - using radius, which is independent of the size # of the central body, would be more rigorous. # inc inclination of orbits to the equator. # e eccentricity # omega omega # lan_offset longitude of ascending node offset # phase_offset offset for phase of satellites in planes # - possibly redundant and might be misused, but as # an initial offset for everything it's okay. # # By default, only one orbit in each orbital plane will be displayed # since all the satellites move on the same orbit. # # We may want to pass (or compute?) a mask elevation angle. # proc ballard_rosette {NUM_PLANES SATS_PER_PLANE F alt inc e omega lan_offset phase_offset name} { global PI params source_comments set source_comments "generated by the Ballard rosette tool. See: A. H. Ballard, Rosette Constellations of Earth Satellites, IEEE Transactions on Aerospace and Electronic Systems, Vol 16 No 5, Sep. 1980. Ballard's rosettes are also known as Walker delta constellations, under a slightly different nomenclature. See: J. G. Walker, Comments on 'Rosette Constellations of Earth Satellites', IEEE Transactions on Aerospace and Electronic Systems, vol. 18 no. 4, pp. 723-724, November 1982. J. G. Walker, Satellite constellations, Journal of the British Interplanetary Society, vol. 37, pp. 559-571, 1984. " # simulation constants set elsewhere in SaVi - see params.tcl set MU $params(Mu) set RADIUS_OF_EARTH $params(Radius) set TOTAL_SATS [expr $NUM_PLANES * $SATS_PER_PLANE] set INTERPLANE_SPACING [expr 360.0 / $NUM_PLANES] # setup orbital elements set a [expr $alt+$RADIUS_OF_EARTH] # compute period of orbit set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] # 360 degrees is $T_per; get the fraction. set plane_offset [expr $T_per / $TOTAL_SATS * $F ] set overall_offset [expr $T_per / 360.0 * $phase_offset ] satellites GV_BEGIN for {set j 0} {$j < $NUM_PLANES} {incr j} { set Omega [expr $j * $INTERPLANE_SPACING + $lan_offset] for {set i 0} {$i < $SATS_PER_PLANE} {incr i} { set T [expr $T_per * $i / $SATS_PER_PLANE - $plane_offset * $j \ + $overall_offset ] set n [satellites LOAD $a $e $inc $Omega $omega $T] satellites NAME $n "$name ($j, $i)" if {$i > 0} { satellites ORBIT_SET $n 0 } } } satellites GV_END } # # TLE reading can't yet handle satellites with different epochs, # making it useless for more than one satellite. Much work is needed! # # Procedure to read a file in NORAD two line element (TLE) format # proc tle_file_input {filename} { global PI params source_comments sun_flag details_source set source_comments "These satellites were loaded from a two-line element (TLE) set, or elset. Note that SaVi's elset handling is not that accurate - see BUGS.\n\nCurrent TLE elsets can be downloaded from http://www.celestrak.com/NORAD/elements/" set now [split [exec date -u {+%D %T %Y %j %H %M %S}] " "] set date [lindex $now 0] set time [lindex $now 1] puts stderr "\nSaVi: For all these satellites, time 0 is $date $time UTC." set year [string trimleft [lindex $now 2] 0] set day [string trimleft [lindex $now 3] 0] set hour [string trimleft [lindex $now 4] 0] set minute [string trimleft [lindex $now 5] 0] set second [string trimleft [lindex $now 6] 0] set epoch_now [expr $day+($hour+($minute+$second/60.0)/60.0)/24.0] set MU $params(Mu) # disable sunlight, as it won't be accurate if {$sun_flag} { set sun_flag 0 puts stderr "SaVi: sunlight is not synchronized to real time" } set f [open "$filename" r] set line1 0 set line2 0 set name "" satellites GV_BEGIN while {[gets $f line] >= 0} { # remove white space set line [string trim $line] if {([string length $line] == 69) && ([string index $line 0] == 1)} { # first elements line set epoch_decade [string range $line 18 18] if {$epoch_decade == 0} { set epoch_year [string range $line 19 19] } else { set epoch_year [string range $line 18 19] } if {$epoch_year < 50} { incr epoch_year 2000 } else { incr epoch_year 1900 } set epoch [string range $line 20 31] # compute delta t set dt [time_difference $epoch_year $epoch $year $epoch_now ] set line1 1 } elseif {([string length $line] == 69) && ([string index $line 0] == 2) && ($line1 == 1)} { # second elements line set inc [string range $line 8 16] set ascending_node [string range $line 17 24] set ecc 0.[string range $line 26 32] set arg_perigee [string range $line 34 41] set mean_anomaly [string range $line 43 50] set mean_motion [string range $line 52 62] set line2 1 } else { # line with name or junk set line1 0 set line2 0 # valid name is up to 24 characters if {([string length $line] < 25)} { # save the name set name $line } } # if we have everything then write out a satellite! if {($line1 == 1) && ($line2 == 1)} { # write out orbital elements set period [expr 86400.0 / $mean_motion] set a [expr pow($period*sqrt($MU)/2.0/$PI,2.0/3.0)] set mean_anomaly [expr fmod($mean_anomaly + \ $dt*$mean_motion*360.0, 360.0)] set T [expr $period - $period*$mean_anomaly/360.0] satellites LOAD $a $ecc $inc $ascending_node $arg_perigee $T "$name" set line1 0 set line2 0 set name "" } } satellites GV_END close $f set details_source "$filename" details(rebuild) } # # Compute the number of days between the first and second dates # If second date is later, then positive. The yi are years and # the di are (fractional) days. # proc time_difference {y1 d1 y2 d2} { set dt [expr $d2-$d1] while {$y2 > $y1} { set dt [expr $dt+[days_in_year $y1]] incr y1 } while {$y2 < $y1} { set dt [expr $dt-[days_in_year $y2]] incr y2 } return $dt } # # Compute the number of days in a given year # proc days_in_year {y} { # if not a fourth year return 365 if { $y % 4 } { return 365 } # if a fourth year, but not a 100th year return 366 if { $y % 100 } { return 366 } # if a 100th year, but not a 400th year return 365 if { $y % 400} { return 365 } # it is a 400th year so return 366 return 366 } savi1.6.0/tcl/star.tcl0000644000175000017500000001052314423445060013675 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # star.tcl # # $Id: star.tcl 8 2019-01-24 04:33:00Z lloydwood $ proc star(build) {} { global star_oe coverage_angle set star_oe(name) "star" if {[eval window(raise) star]} return set name [build_Toplevel star] wm protocol $name WM_DELETE_WINDOW star(dismiss) build_Title $name "create crude star constellation" set cmd [build_CmdFrame $name cmd] build_LabelEntryColumns $cmd le0 \ {text " " {"Star parameters" \ "Number of orbital planes" \ "Number of satellites per plane" \ "altitude (km)" \ "inclination (deg)" \ "eccentricity e" \ "omega" \ "long. asc. node offset (deg)" \ "overall phase offset (deg)" \ "coverage angle (deg)" } } \ {dentry "Orbital elements" {star_oe(P) star_oe(S) \ star_oe(alt) star_oe(inc) \ star_oe(e) star_oe(omega) \ star_oe(lan_offset) \ star_oe(phase_offset) \ coverage_angle } } \ {slider " " { star(slide_P) star(slide_S) \ star(slide_alt) star(slide_inc) star(slide_e) \ star(slide_omega) star(slide_lan_offset) \ star(slide_phase_offset) star(coverage_angle)} } pack $cmd -anchor n -fill both -expand 1 build_LabelEntryColumns $cmd lename \ {lentry "Star name" star_oe(name)} for {set i 0} {$i < 9} {incr i} { bind $cmd.le0.c1.$i star(create) bind $cmd.le0.c1.$i star(create) } build_Buttonbar $name dbbar \ {"Create crude star" star(create)} \ {"Dismiss" star(dismiss)} update star(reset) } proc star(dismiss) {} { destroy .star } proc star(update) {} { update } proc star(create) {} { global star_oe last_filename if {$star_oe(P) < 0} return if {$star_oe(S) < 0} return if {($star_oe(inc) < -90) || ($star_oe(inc) > 90)} return if {($star_oe(omega) < -180) || ($star_oe(omega) > 180)} return if {($star_oe(lan_offset) < -180) || ($star_oe(lan_offset) > 180)} return if {($star_oe(phase_offset) < -180) || ($star_oe(phase_offset) > 180)} return main(delete_all) walker_star $star_oe(P) $star_oe(S) \ $star_oe(alt) $star_oe(inc) $star_oe(e) $star_oe(omega) \ $star_oe(lan_offset) $star_oe(phase_offset) $star_oe(name) set last_filename "Crude star" main(update) } proc star(slide_P) v { global star_oe set star_oe(P) [expr $v+3] } proc star(slide_S) v { global star_oe set star_oe(S) [expr $v+1] } proc star(slide_F) v { global star_oe set star_oe(F) [expr $v] } proc star(slide_alt) v { global star_oe set star_oe(alt) [expr $v*300] } proc star(slide_inc) v { global star_oe set star_oe(inc) [expr $v*1.8 - 90] } proc star(slide_e) v { global star_oe # Don't want slider to allow eccentricity > 0.85 # as this shows movement of orbit over time. set star_oe(e) [expr $v/125.0] } proc star(slide_omega) v { global star_oe set star_oe(omega) [expr $v*3.6 - 180] } proc star(slide_lan_offset) v { global star_oe set star_oe(lan_offset) [expr $v*3.6 - 180] } proc star(slide_phase_offset) v { global star_oe set star_oe(phase_offset) [expr $v*3.6 - 180] } proc star(coverage_angle) v { global coverage_angle set coverage_angle [expr $v*0.9] } proc star(iridium) {} { global star_oe coverage_angle set star_oe(name) "Crude-star" set star_oe(P) 6 set star_oe(S) 11 set star_oe(alt) 780 set star_oe(inc) 86.4 set star_oe(e) 0.0 set star_oe(omega) 0.0 set star_oe(lan_offset) 0.0 set star_oe(phase_offset) 0.0 set coverage_angle 8.2 } proc star(reset) {} { # start with sensible values for a popular rosette - crude Iridium star(iridium) } savi1.6.0/tcl/coverage_frames.tcl0000644000175000017500000000532114423445060016054 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # coverage_frames.tcl # # $Id: coverage_frames.tcl 8 2019-01-24 04:33:00Z lloydwood $ proc coverage_frames(build) {} { global total_frames if {[eval window(raise) coverage_frames]} return set name [build_Toplevel coverage_frames] wm protocol $name WM_DELETE_WINDOW coverage_frames(dismiss) build_Title $name "Choose no. of frames to save..." build_LabelEntryColumns $name total_frames \ {ientry "" {total_frames} } \ {text "" {frames} } bind $name.total_frames.c0.0 {coverage_frames(save) $total_frames} build_Buttonbar $name dbbar \ {"10" "coverage_frames(save) 10"} \ {"50" "coverage_frames(save) 50"} \ {"100" "coverage_frames(save) 100"} \ {"500" "coverage_frames(save) 500"} \ {"Cancel" "coverage_frames(dismiss)"} \ {"Save" "coverage_frames(save) $total_frames"} update } proc coverage_frames(save) v { global im IM_H IM_W global user_file_dir if {$v < 0} return coverage_frames(dismiss) set types { {"SaVi coverage animation" {.gif} } } set filename [tk_getSaveFile -initialdir "$user_file_dir" -filetypes $types \ -title "SaVi: save frames to folder" ] if {"$filename" == ""} return if {$v == 1} { # write a single image. $im write "$user_file_dir$filename" -format gif -from 0 0 $IM_W $IM_H } else { set gifsicle "gifsicle" set files "exec $gifsicle -O3" set rmfiles "exec rm" for {set j 0} {$j < $v} {incr j} { set n [format "%07d" $j] set files "$files $filename-$n" set rmfiles "$rmfiles $filename-$n" $im write "$filename-$n" -format gif -from 0 0 $IM_W $IM_H main(forw_step) } if {[catch {eval $files > $filename}]} { puts stderr "\nSaVi: could not run $gifsicle successfully. Is $gifsicle installed?" } else { puts stderr "\nSaVi: told $gifsicle to save animation of $v frames in $filename" } eval $rmfiles } } proc coverage_frames(dismiss) {} { destroy .coverage_frames } savi1.6.0/tcl/equator.tcl0000644000175000017500000000574614423445060014417 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # equator.tcl # # $Id: equator.tcl 195 2023-04-10 04:24:20Z lloydwood $ set previous_parallels_angle 0 proc equator(init) {} { global parallels_angle equatorial_exclusion_angle set equatorial_exclusion_angle 3.5 set parallels_angle $equatorial_exclusion_angle } proc equator(create) {} { global PI params parallels_angle # lots of satellites to mark the geostationary or other rings. # markers every degree of longitude set NUM_PLANES 360 # setup orbital elements; this quick hack has been upgraded # set a [expr 35786.1+$params(Radius)] set MU $params(Mu) # stationary radius is cube root of (Mu T^2 / 4 pi^2) where # G is gravitational constant, m is mass in kg/s; Gm = MU # T is period of rotation in seconds. Omega is radians/second, # two PI radians in a circle. set OM $params(Omega) # the 2PIs cancel out, but we show in comments for clarity. # Must force floating point in Tcl by stating .0 set cuberoot [expr 1.0/3] # set T [expr 2 * $PI / $params(Omega)] # set a [expr { 0.0 + pow(($MU * $T*$T/4/$PI/$PI),$cuberoot) } ] set a [expr { 0.0 + pow(($MU / $OM / $OM),$cuberoot) } ] set omega 0.0 set T 0.0 # not yet requiring geomview. satellites GV_BEGIN for {set i 0} {$i < $NUM_PLANES} {incr i} { # SaVi handles wraparound beyond +/-180 set Omega [expr 360.0/$NUM_PLANES * $i] set name "equator-$i" satellites LOAD_MARKER $a $Omega $omega $T $name } set T_per [expr 2 * $PI * pow($a,1.5) / sqrt($MU)] set T [expr $T_per * $parallels_angle/360] for {set i 0} {$i < $NUM_PLANES} {incr i} { set Omega [expr 360.0/$NUM_PLANES * $i] set name "parallel-N-$i" satellites LOAD_MARKER $a $Omega $omega $T $name set name "parallel-S-$i" satellites LOAD_MARKER $a $Omega $omega -$T $name } satellites GV_END } proc equator(update_angle) {} { global parallels_angle # local variable defined at top of this file upvar 1 previous_parallels_angle previous_parallels_angle set parallels_angle [expr abs($parallels_angle)] if {$parallels_angle > 90} { set parallels_angle 90 } if {$parallels_angle == $previous_parallels_angle} { return } set previous_parallels_angle $parallels_angle equator(create) fisheye(update) } savi1.6.0/tcl/rosette.tcl0000644000175000017500000001456714423445060014425 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # rosette.tcl # # $Id: rosette.tcl 8 2019-01-24 04:33:00Z lloydwood $ proc rosette(build) {} { global rosette_oe coverage_angle set rosette_oe(name) "rosette" if {[eval window(raise) rosette]} return set name [build_Toplevel rosette] wm protocol $name WM_DELETE_WINDOW rosette(dismiss) build_Title $name "create Ballard rosette (Walker delta)" set cmd [build_CmdFrame $name cmd] build_LabelEntryColumns $cmd le0 \ {text " " {"Rosette parameters" \ "Number of orbital planes" \ "Number of satellites per plane" \ "Harmonic factor" \ "altitude (km)" \ "inclination (deg)" \ "eccentricity e" \ "omega" \ "long. asc. node offset (deg)" \ "overall phase offset (deg)" \ "coverage angle (deg)" } } \ {dentry "Orbital elements" {rosette_oe(P) rosette_oe(S) rosette_oe(F) \ rosette_oe(alt) rosette_oe(inc) \ rosette_oe(e) rosette_oe(omega) \ rosette_oe(lan_offset) \ rosette_oe(phase_offset) \ coverage_angle } } \ {slider " " { rosette(slide_P) rosette(slide_S) rosette(slide_F) \ rosette(slide_alt) rosette(slide_inc) rosette(slide_e) \ rosette(slide_omega) rosette(slide_lan_offset) \ rosette(slide_phase_offset) rosette(coverage_angle)} } pack $cmd -anchor n -fill both -expand 1 build_LabelEntryColumns $cmd lename \ {lentry "Rosette name" rosette_oe(name)} for {set i 0} {$i < 10} {incr i} { bind $cmd.le0.c1.$i rosette(create) bind $cmd.le0.c1.$i rosette(create) } build_Buttonbar $name dbbar \ {"Create Ballard rosette" rosette(create)} \ {"Celestri" rosette(celestri)} \ {"ICO" rosette(ico)} \ {"Galileo" rosette(galileo)} \ {"Globalstar" rosette(globalstar)} \ {"Dismiss" rosette(dismiss)} update rosette(reset) } proc rosette(dismiss) {} { destroy .rosette } proc rosette(update) {} { update } proc rosette(create) {} { global rosette_oe last_filename # range checks if {$rosette_oe(P) < 0} return if {$rosette_oe(S) < 0} return if {$rosette_oe(F) < 0} return if {($rosette_oe(inc) < -90) || ($rosette_oe(inc) > 90)} return if {($rosette_oe(omega) < -180) || ($rosette_oe(omega) > 180)} return if {($rosette_oe(lan_offset) < -180) || ($rosette_oe(lan_offset) > 180)} return if {($rosette_oe(phase_offset) < -180) || ($rosette_oe(phase_offset) > 180)} return if {$rosette_oe(F) > $rosette_oe(P)} { set prev $rosette_oe(F) set rosette_oe(F) [expr $rosette_oe(F)%$rosette_oe(P)] puts stderr "\nSaVi: Wrapping harmonic factor $prev to within number of planes." puts stderr "SaVi: Harmonic factor now $rosette_oe(F)" } main(delete_all) ballard_rosette $rosette_oe(P) $rosette_oe(S) $rosette_oe(F) \ $rosette_oe(alt) $rosette_oe(inc) $rosette_oe(e) $rosette_oe(omega) \ $rosette_oe(lan_offset) $rosette_oe(phase_offset) $rosette_oe(name) set last_filename "Ballard rosette" main(update) } proc rosette(slide_P) v { global rosette_oe set rosette_oe(P) [expr $v+3] } proc rosette(slide_S) v { global rosette_oe set rosette_oe(S) [expr $v+1] } proc rosette(slide_F) v { global rosette_oe set rosette_oe(F) [expr $v] } proc rosette(slide_alt) v { global rosette_oe set rosette_oe(alt) [expr $v*300] } proc rosette(slide_inc) v { global rosette_oe set rosette_oe(inc) [expr $v*1.8 - 90] } proc rosette(slide_e) v { global rosette_oe # Don't want slider to allow eccentricity > 0.85 # as this shows movement of orbit over time. set rosette_oe(e) [expr $v/125.0] } proc rosette(slide_omega) v { global rosette_oe set rosette_oe(omega) [expr $v*3.6 - 180] } proc rosette(slide_lan_offset) v { global rosette_oe set rosette_oe(lan_offset) [expr $v*3.6 - 180] } proc rosette(slide_phase_offset) v { global rosette_oe set rosette_oe(phase_offset) [expr $v*3.6 - 180] } proc rosette(coverage_angle) v { global coverage_angle set coverage_angle [expr $v*0.9] } proc rosette(celestri) {} { global rosette_oe coverage_angle set rosette_oe(name) "Celestri-rosette" set rosette_oe(P) 7 set rosette_oe(S) 9 set rosette_oe(F) 5 set rosette_oe(alt) 1400 set rosette_oe(inc) 48.0 set rosette_oe(e) 0.0013 set rosette_oe(omega) 0.0 set rosette_oe(lan_offset) 0.0 set rosette_oe(phase_offset) 0.0 set coverage_angle 16 } proc rosette(galileo) {} { global rosette_oe coverage_angle set rosette_oe(name) "Galileo-rosette" set rosette_oe(P) 3 set rosette_oe(S) 9 set rosette_oe(F) 1 set rosette_oe(alt) 23615.86 set rosette_oe(inc) 56.0 set rosette_oe(e) 0.0 set rosette_oe(omega) 0.0 set rosette_oe(lan_offset) 0.0 set rosette_oe(phase_offset) 0.0 set coverage_angle 0 } proc rosette(globalstar) {} { global rosette_oe coverage_angle set rosette_oe(name) "Globlstar-rosette" set rosette_oe(P) 8 set rosette_oe(S) 6 set rosette_oe(F) 1 set rosette_oe(alt) 1400 set rosette_oe(inc) 52.0 set rosette_oe(e) 0.0 set rosette_oe(omega) 0.0 set rosette_oe(lan_offset) 0.0 set rosette_oe(phase_offset) 0.0 set coverage_angle 10 } proc rosette(ico) {} { global rosette_oe coverage_angle set rosette_oe(name) "ICO-rosette" set rosette_oe(P) 2 set rosette_oe(S) 5 set rosette_oe(F) 0 set rosette_oe(alt) 10390 set rosette_oe(inc) 45.0 set rosette_oe(e) 0.0 set rosette_oe(omega) 0.0 set rosette_oe(lan_offset) 0.0 set rosette_oe(phase_offset) 0.0 set coverage_angle 10 } proc rosette(reset) {} { # start with sensible values for a popular rosette - Globalstar rosette(globalstar) } savi1.6.0/tcl/coverage.tcl0000644000175000017500000012135414423445060014524 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # coverage.tcl # # $Id: coverage.tcl 190 2023-04-02 03:52:19Z lloydwood $ # Note: IM_W and IM_H are linked to C variables for the image size proc coverage(init) {} { global coverage_flag no_access_flag print_access_flag tracks_flag map_flag \ project_tracks_flag coverage_proj_flag coverage_angle_flag \ coverage_flag_dismissed tracks_flag_dismissed \ Projection coverage_projection last_coverage_projection NUM_COLORS_PREV NUM_COLORS trace variable coverage_flag w flag_change trace variable no_access_flag w flag_change trace variable print_access_flag w flag_change trace variable tracks_flag w flag_change trace variable map_flag w flag_change trace variable project_tracks_flag w flag_change trace variable coverage_proj_flag w flag_change trace variable coverage_angle_flag w flag_change set project_tracks_flag 0 set coverage_proj_flag 0 set coverage_angle_flag 0 set coverage_flag 0 set NUM_COLORS_PREV 0 # for texturemap demonstration - blue world in Geomview set no_access_flag 1 set map_flag 1 set coverage_flag_dismissed 1 set tracks_flag_dismissed 1 # this and popup menu must match master list in globals.h # reordered to place less useful projections at end. set Projection(unprojected_mask) 0 set Projection(unprojected) 1 set Projection(spherical) 2 set Projection(spherical_90) 3 set Projection(sinusoidal) 4 set Projection(sinusoidal_90) 5 set Projection(cylindrical) 6 set coverage_projection $Projection(unprojected) set last_coverage_projection $coverage_projection coverage(init_coldiv_coldec) } proc coverage(build) {} { global FONT COLOR coverage_flag no_access_flag tracks_flag \ coverage_angle_flag project_tracks_flag map_flag \ coverage_projection coverage_angle IM_H IM_W \ coverage_flag_dismissed tracks_flag_dismissed \ coverage_name coverage_all_projections \ sun_flag Fisheye NUM_COLORS NUM_COLORS_PREV if {$IM_H == 0} { # default to large map set IM_H 512 set IM_W 1024 } if {$NUM_COLORS == 0} { # for large map set NUM_COLORS 14 } if {[eval window(raise) coverage]} return set coverage_name [build_Toplevel coverage] wm protocol $coverage_name WM_DELETE_WINDOW coverage(dismiss) coverage(title) build_Menubar $coverage_name mbar \ {"Help" \ {"About this constellation..." "details(build)" "H"} \ {} \ {"Introduction to SaVi..." "helpfile(build) README"} \ {"Bugs in SaVi..." "helpfile(build) BUGS"} \ {"Texturemapping in Geomview..." "helpfile(build) README-COVERAGE-TEXTUREMAP"} \ {} \ {"about SaVi..." "about(build)"} } \ {"File" \ {"Load satellites..." "load(build)"} \ {"Save satellites as Tcl script..." "save(build)" "S"} \ {} \ {"Load new constellation TLEs from web..." "load_url_tle(build)"} \ {} \ {"Save map..." "coverage(save_map)" "M"} \ {"Save animation..." "coverage_frames(build)"} \ {"Save satellites map for plot script..." main(save_plot)} \ {} \ {"Load color shades..." "coverage(load_colors)"} \ {"Save color shades..." "coverage(save_colors)"} \ {} \ {"Close window" "coverage(dismiss)" "W"} \ {"Quit" "main(exit)" "Q"} } \ {"Edit" \ {"Simulation constants..." "params(build)"} } \ {"Views" \ {"Satellites list..." "window(raise) main" "L"} \ {"Local fisheye..." "fisheye(build)" "F"} \ {} \ {"> Step forwards" "main(forw_step)"} \ {"< Step back" "main(back_step)"} \ {">> Forwards..." "main(forwards)"} \ {"<< Reverse..." "main(backwards)"} \ {"Freeze views" "main(stop)"} \ {} \ {"Refresh coverage view" "coverage(foot)"} \ {} \ {"Restart views at time zero" "main(restart)" "0"} } \ {"Constellations"} \ {"Rendering"} \ {"Display"} \ {"Shading" \ {"Blend between end colors" "coverage(blend_colors)" "B"} \ {} \ {"SUBMENU" "shades" "Shadings"} \ {} \ {"Reverse shading" "coverage(reverse_colors)"} \ {"Select random colors" "coverage(random_colors)"} \ {"Swap color swatches" "coverage(swap_color_diversity_decay)"} } build_Menu $coverage_name.mbar.b6.shades \ {"SaVi color shades" "coverage(restore_colors)"} \ {} \ {"shades of purple" "coverage(shades_colors_purple)"} \ {"shades of green" "coverage(shades_colors_green)"} \ {"shades of grey" "coverage(shades_colors_grey)"} \ {} \ {"Change shading" "coverage(run_of_colors)"} main(constellations_menu) $coverage_name.mbar.b3 constellations(rendering_menu) $coverage_name.mbar.b4 build_options_menu $coverage_name.mbar.b5 \ {"SUBMENU" map_size "Map size"} \ {"Show Earth map" map_flag} \ {} \ {"Show coverage" coverage_flag} \ {"Use interval decay" no_access_flag} \ {"Show sunlight" sun_flag} \ {"Show fisheye viewpoint" fisheye_viewpoint_flag} \ {} \ {"Show satellites" tracks_flag} \ {"Record ground tracks" project_tracks_flag} build_Menu $coverage_name.mbar.b5.map_size \ {"large Earth map" "coverage(map_large)"} \ {"small Earth map" "coverage(map_small)"} \ {} \ {"Custom map size..." "coverage_size(build)"} set cmd [build_CmdFrame $coverage_name cmd] set cmdmap [build_StdFrame $cmd map] pack $cmdmap -fill x # -side left actually works nicely... coverage(map_show) set cmdq [build_StdFrame $cmd q] build_Optionslist $cmdq olist \ {"Show Earth map" map_flag} pack $cmdq.olist -side left set maps_list {"unprojected land/sea" \ "unprojected" \ "spherical" \ "spherical (90W)"} if {$coverage_all_projections} { set maps_list {"unprojected land/sea" "unprojected" \ "spherical" \ "spherical (90W)" \ "sinusoidal" \ "sinusoidal (90W)" \ "cylindrical"} } build_IPopupMenu $cmdq p0 "projected as:" \ coverage_projection coverage(map) $maps_list # coverage_projection coverage(map) {"unprojected land/sea" "unprojected" "cylindrical" "sinusoidal" "sinusoidal (90W)" "spherical" "spherical (90W)"} pack $cmdq.p0 -side left build_IPopupMenu $cmdq p1 "in" NUM_COLORS coverage(shades) {"colors:" \ "1 shade" "2 shades" "3 shades" "4 shades" "5 shades" "6 shades" \ "7 shades" "8 shades" "9 shades" "10 shades" "11 shades" "12 shades" \ "13 shades" "14 shades" "15 shades" "16 shades" "17 shades" \ "18 shades" "19 shades" "20 shades" "21 shades" "22 shades" "23 shades" \ "24 shades" "25 shades" "26 shades" "27 shades" "28 shades" "29 shades"} pack $cmdq.p1 -side left build_LabelEntryColumns $cmdq p2 \ {text "" {"Clicked: "}} \ {label "" {Fisheye(clicked_coords)}} pack $cmdq.p2 -side right pack $cmdq -anchor w set cmda [build_StdFrame $cmd a] build_Optionslist $cmda olist \ {"Show satellites" tracks_flag} \ {"Show coverage" coverage_flag} \ {"Use interval decay" no_access_flag} \ {"Show sunlight" sun_flag} # this will give a numerical idea of coverage by latitude # {"Print access data" print_access_flag} # this is hacked into utils.tcl instead. # {"Record ground tracks and project forwards" project_tracks_flag} pack $cmda.olist -side left coverage(wells_frame) pack $cmda -fill both # handles window being closed and reopened when sunlight on if {$sun_flag} { coverage(labels_show_sunlight) } build_LabelEntryColumns $cmd le2 \ {lcheckbox "" project_tracks_flag} \ {ientry "" {tracks_interval}} \ {text "" {hours}} set cmdf [build_StdFrame $cmd f] build_IPopupMenu $cmdf p2 "Coverage angle describes:" \ coverage_angle_flag coverage(foot) {"ground terminal mask elevation" "cones from satellites"} pack $cmdf.p2 -side left build_LabelEntryColumns $cmdf p3 \ {slider " " { coverage(set_angle) } } pack $cmdf.p3 -side right -fill x -expand 1 pack $cmdf set cmdb [build_StdFrame $cmd b] button $cmdb.b1 -font $FONT(button) $cmdb.b1 configure -text "Set angle:" \ -command "coverage(foot)" pack $cmdb.b1 -side left build_LabelEntryColumns $cmdb le1 \ {dentry "" {coverage_angle}} \ {label "" {coverage}} \ {label "" {mean_coverage}} bind $cmdb.le1.c0.0 coverage(foot) bind $cmdb.le1.c0.0 coverage(foot) pack $cmdb.le1 pack $cmdb set cmdd [build_StdFrame $cmd d] build_LabelEntryColumns $cmdd le0 \ {label "" {coverage_init_time}} \ {label "" {coverage_time}} \ {text "" "Time:"} \ {label "" {time}} pack $cmdd.le0 -side bottom pack $cmdd -fill both -side bottom -expand 1 pack $cmd -fill both -expand 1 build_Buttonbar $coverage_name bb1 \ {"Restart" coverage(restart)} \ {" < " coverage(back_step)} \ {" > " coverage(forw_step)} \ {" STOP " coverage(stop)} \ {" < < " coverage(backwards)} \ {" > > " coverage(forwards)} set coverage_flag $coverage_flag_dismissed set tracks_flag $tracks_flag_dismissed if {$NUM_COLORS_PREV == 0} { coverage(init_colors) set NUM_COLORS_PREV $NUM_COLORS } coverage(update_colors) } proc coverage(map_show) {} { global IM_W IM_H COLOR coverage_display_center_longitude global im im_x_offset im_y_offset set c ".coverage.cmd.map.c" # canvas counts from 0 canvas $c -bg $COLOR(bg) -width $IM_W -height $IM_H if {$coverage_display_center_longitude < 0} { set offset_longitude [expr $coverage_display_center_longitude + 360] } else { set offset_longitude $coverage_display_center_longitude } set im_x_offset [expr 2 + ($offset_longitude * -$IM_W/360)] set im_y_offset 2 set im [image create photo im_coverage -width [expr $IM_W*2] -height $IM_H] $c create image [expr $IM_W + $im_x_offset] [expr $IM_H/2 + $im_y_offset] \ -image $im pack $c -fill x -side top # catch button click in map to get fisheye Lat/Long bind $c {coverage(lat_long) %x %y} bind $c {coverage_set(lat_long) %x %y} bind $c {coverage(back_step)} bind $c {coverage(forw_step)} bind $c {coverage(backwards)} bind $c {coverage(forwards)} } proc coverage(map_hide) {} { global im set c ".coverage.cmd.map.c" $c delete image $im destroy $c } proc coverage(map_large) {} { global IM_W IM_H if {$IM_W == 1024} return coverage(map_hide) set IM_W 1024 set IM_H 512 satellites COVERAGE_MAP_OFF satellites COVERAGE_MAP_ON coverage(map_show) coverage(update) } proc coverage(map_small) {} { global IM_W IM_H if {$IM_W == 600} return coverage(map_hide) set IM_W 600 set IM_H 300 satellites COVERAGE_MAP_OFF satellites COVERAGE_MAP_ON coverage(map_show) coverage(update) } proc coverage(wells_frame) {} { global NUM_COLORS COLDIV COLDEC FONT coverage_projection Projection sun_flag # build_StdFrame $cmda.ce set cmdace [build_StdFrame .coverage.cmd.a ce] set cmdacef [build_StdFrame .coverage.cmd.a.ce cf] label $cmdace.cf.0 -text "satellites in view\n(coverage diversity)" \ -font $FONT(label) pack $cmdace.cf.0 -side right -ipadx 2m -ipady 2m \ -padx 1m -pady 1m for {set i 1} {$i < $NUM_COLORS} {incr i} { button $cmdace.cf.$i -text "$i" -font $FONT(fixed) -bg $COLDIV($i) \ -activebackground $COLDIV($i) -highlightbackground $COLDIV($i) \ -command "coverage(diversitycolor) $i" \ -relief groove pack $cmdace.cf.$i -expand 1 -fill x -side left -ipadx 2m -ipady 2m \ -padx 1m -pady 1m } button $cmdace.cf.$NUM_COLORS -text "$NUM_COLORS+" -font $FONT(fixed) \ -bg $COLDIV($NUM_COLORS) \ -activebackground $COLDIV($NUM_COLORS) \ -highlightbackground $COLDIV($NUM_COLORS) \ -command "coverage(diversitycolor) $NUM_COLORS" \ -relief groove pack $cmdace.cf.$NUM_COLORS -expand 1 -fill x -side left -ipadx 1m -ipady 2m \ -padx 1m -pady 1m # set max_colors [expr $NUM_COLORS + 1] # label $cmda.ce.cf.$max_colors -text "satellites" -font $FONT(label) # pack $cmda.ce.cf.$max_colors -ipady 2m -expand 1 pack $cmdace.cf -expand 1 -fill x -side left -ipadx 2m -ipady 2m \ -padx 1m -pady 1m pack $cmdace.cf -side top build_StdFrame $cmdace cg label $cmdace.cg.0 -text "intervals since view\n(coverage decay)" -font $FONT(label) pack $cmdace.cg.0 -side right -ipadx 2m -ipady 2m \ -padx 1m -pady 1m for {set i 1} {$i < $NUM_COLORS} {incr i} { button $cmdace.cg.$i -text "$i" -font $FONT(fixed) -bg $COLDEC($i) \ -activebackground $COLDEC($i) -highlightbackground $COLDEC($i) \ -command "coverage(decaycolor) $i" \ -relief groove pack $cmdace.cg.$i -expand 1 -fill x -side left -ipadx 2m -ipady 2m \ -padx 1m -pady 1m } button $cmdace.cg.$NUM_COLORS -text "$NUM_COLORS+" -font $FONT(fixed) \ -bg $COLDIV($NUM_COLORS) \ -activebackground $COLDIV($NUM_COLORS) \ -highlightbackground $COLDIV($NUM_COLORS) \ -command "coverage(diversitycolor) $NUM_COLORS" \ -relief groove if {$coverage_projection == $Projection(unprojected_mask)} { coverage(labels_show_land_sea) } elseif {$sun_flag} { coverage(labels_show_sunlight) } pack $cmdace.cg.$NUM_COLORS -expand 1 -fill x -side right -ipadx 1m -ipady 2m \ -padx 1m -pady 1m # label $cmda.ce.cg.$max_colors -text "intervals" -font $FONT(label) # pack $cmda.ce.cg.$max_colors -ipady 2m -expand 1 pack $cmdace.cg -expand 1 -fill x -side left -ipadx 2m -ipady 2m \ -padx 1m -pady 1m pack $cmdace.cg -side top pack $cmdace -side right -fill both } proc constellations(rendering_menu) {submenu} { global geomview_module if {$geomview_module == 1} { build_options_menu $submenu \ {"Real-time mode" realtime_flag} \ {} \ {"Show central body" earth_flag} \ {"Use simple Earth map" simple_earth_flag} \ {"Use detailed Earth model" fancy_earth_flag} \ {} \ {"Show coverage in Geomview" geomview_dynamic_texture_flag} } else { build_options_menu $submenu \ {"Real-time mode" realtime_flag} } } proc coverage(forw_step) {} { main(forw_step) } proc coverage(back_step) {} { main(back_step) } proc coverage(forwards) {} { global COLOR playbar if [winfo exists .coverage] { .coverage.bb1.b3 configure -bg $COLOR(bg) -highlightbackground $COLOR(bg) .coverage.bb1.b4 configure -bg $COLOR(bg) -highlightbackground $COLOR(bg) .coverage.bb1.b5 configure -bg $COLOR(sbg) -highlightbackground $COLOR(sbg) } set flag $playbar set playbar 1 if {$flag == 0} { main(forwards) } set playbar 0 } proc coverage(backwards) {} { global COLOR playbar if [winfo exists .coverage] { .coverage.bb1.b3 configure -bg $COLOR(bg) -highlightbackground $COLOR(bg) .coverage.bb1.b4 configure -bg $COLOR(sbg) -highlightbackground $COLOR(sbg) .coverage.bb1.b5 configure -bg $COLOR(bg) -highlightbackground $COLOR(bg) } set flag $playbar set playbar 1 if {$flag == 0} { main(backwards) } set playbar 0 } proc coverage(stop) {} { global COLOR playbar if [winfo exists .coverage] { .coverage.bb1.b3 configure -bg $COLOR(sbg) -highlightbackground $COLOR(sbg) .coverage.bb1.b4 configure -bg $COLOR(bg) -highlightbackground $COLOR(bg) .coverage.bb1.b5 configure -bg $COLOR(bg) -highlightbackground $COLOR(bg) } set flag $playbar set playbar 1 if {$flag == 0} { main(stop) } set playbar 0 } proc coverage(set_angle) v { global coverage_angle # this is a hack to prevent resetting to zero when coverage window is reopened. if {$v == 0} return set coverage_angle [expr floor($v/100.0*90)] coverage(update_angle) } proc coverage(update_angle) {} { global coverage_flag coverage_angle set coverage_angle [expr abs($coverage_angle)] if {$coverage_angle > 90} { set coverage_angle 90 } coverage(update_decay) if {$coverage_flag == 1} { set coverage_flag 0 set coverage_flag 1 } coverage(update) geomview(update_cones_footprints) fisheye(update) } proc coverage(restart) {} { coverage(stop) satellites RESET } proc coverage(init_colors) {} { global NUM_COLORS global DIV DEC set DIV(0) [expr 0xffffff] set DIV(1) [expr 0xffff00] set DIV($NUM_COLORS) [expr 0xff0000] set DEC(0) [expr 0xffffff] set DEC(1) [expr 0x0000ff] set DEC($NUM_COLORS) [expr 0x00008f] coverage(blend_color_values) 1 } proc coverage(shades_colors_grey) {} { global NUM_COLORS global DIV DEC set DIV(0) [expr 0xffffff] set DIV(1) [expr 0xdddddd] set DIV($NUM_COLORS) [expr 0x333333] set DEC(0) [expr 0xffffff] set DEC(1) [expr 0x0000ff] set DEC($NUM_COLORS) [expr 0x0000ff] coverage(blend_color_values) 1 coverage(update_colors) } proc coverage(shades_colors_green) {} { global NUM_COLORS global DIV DEC set DIV(0) [expr 0xffffff] set DIV(1) [expr 0x00ff00] set DIV($NUM_COLORS) [expr 0x003300] set DEC(0) [expr 0xffffff] set DEC(1) [expr 0x0000ff] set DEC($NUM_COLORS) [expr 0x0000ff] coverage(blend_color_values) 1 coverage(update_colors) } proc coverage(shades_colors_purple) {} { global NUM_COLORS global DIV DEC set DIV(0) [expr 0xffffff] set DIV(1) [expr 0xff00ff] set DIV($NUM_COLORS) [expr 0x330033] set DEC(0) [expr 0xffffff] set DEC(1) [expr 0x0000ff] set DEC($NUM_COLORS) [expr 0x00008f] coverage(blend_color_values) 1 coverage(update_colors) } proc coverage(init_coldiv_coldec) {} { global COLDIV COLDEC # this is just to name our variables. set COLDIV(0) #ffffff set COLDIV(1) #ffffff set COLDIV(2) #ffffff set COLDIV(3) #ffffff set COLDIV(4) #ffffff set COLDIV(5) #ffffff set COLDIV(6) #ffffff set COLDIV(7) #ffffff set COLDIV(8) #ffffff set COLDIV(9) #ffffff set COLDIV(10) #ffffff set COLDIV(11) #ffffff set COLDIV(12) #ffffff set COLDIV(13) #ffffff set COLDIV(14) #ffffff set COLDIV(15) #ffffff set COLDIV(16) #ffffff set COLDIV(17) #ffffff set COLDIV(18) #ffffff set COLDIV(19) #ffffff set COLDIV(20) #ffffff set COLDIV(21) #ffffff set COLDIV(22) #ffffff set COLDIV(23) #ffffff set COLDIV(24) #ffffff set COLDIV(25) #ffffff set COLDIV(26) #ffffff set COLDIV(27) #ffffff set COLDIV(28) #ffffff set COLDIV(29) #ffffff set COLDEC(0) #ffffff set COLDEC(1) #ffffff set COLDEC(2) #ffffff set COLDEC(3) #ffffff set COLDEC(4) #ffffff set COLDEC(5) #ffffff set COLDEC(6) #ffffff set COLDEC(7) #ffffff set COLDEC(8) #ffffff set COLDEC(9) #ffffff set COLDEC(10) #ffffff set COLDEC(11) #ffffff set COLDEC(12) #ffffff set COLDEC(13) #ffffff set COLDEC(14) #ffffff set COLDEC(15) #ffffff set COLDEC(16) #ffffff set COLDEC(17) #ffffff set COLDEC(18) #ffffff set COLDEC(19) #ffffff set COLDEC(20) #ffffff set COLDEC(21) #ffffff set COLDEC(22) #ffffff set COLDEC(23) #ffffff set COLDEC(24) #ffffff set COLDEC(25) #ffffff set COLDEC(26) #ffffff set COLDEC(27) #ffffff set COLDEC(28) #ffffff set COLDEC(29) #ffffff } proc coverage(labels_show_land_sea) {} { global NUM_COLORS coverage_projection Projection if {$coverage_projection != $Projection(unprojected_mask)} { return } if [winfo exists .coverage] { set last [expr $NUM_COLORS] for {set i 1} {$i < $last} {incr i} { set j [expr $i-1] .coverage.cmd.a.ce.cf.$i configure -text $j .coverage.cmd.a.ce.cg.$i configure -text $j } set j [expr $last - 1] .coverage.cmd.a.ce.cf.$NUM_COLORS configure -text "$j+" .coverage.cmd.a.ce.cg.$NUM_COLORS configure -text "$j+" .coverage.cmd.a.ce.cf.0 configure -text "satellites in view\n(coverage on land)" .coverage.cmd.a.ce.cg.0 configure -text "satellites in view\n(coverage on sea)" } } proc coverage(labels_show_diversity) {} { #top line only global NUM_COLORS coverage_projection Projection if {$coverage_projection == $Projection(unprojected_mask)} { return } if [winfo exists .coverage] { set last [expr $NUM_COLORS ] for {set i 1} {$i < $last} {incr i} { .coverage.cmd.a.ce.cf.$i configure -text $i } .coverage.cmd.a.ce.cf.$NUM_COLORS configure -text "$NUM_COLORS+" .coverage.cmd.a.ce.cf.0 configure -text "satellites in view\n(coverage diversity)" } } proc coverage(labels_show_decay) {} { global NUM_COLORS coverage_projection Projection if {$coverage_projection == $Projection(unprojected_mask)} { return } if [winfo exists .coverage] { set last [expr $NUM_COLORS] for {set i 1} {$i < $last} {incr i} { .coverage.cmd.a.ce.cg.$i configure -text $i } .coverage.cmd.a.ce.cg.$NUM_COLORS configure -text "$NUM_COLORS+" .coverage.cmd.a.ce.cg.0 configure -text "intervals since view\n(coverage decay)" } } proc coverage(labels_show_sunlight) {} { global NUM_COLORS coverage_projection Projection if {$coverage_projection == $Projection(unprojected_mask)} { return } if [winfo exists .coverage] { set last [expr $NUM_COLORS - 1] for {set i 1} {$i < $last} {incr i} { .coverage.cmd.a.ce.cg.$i configure -text "" } if {$last > 0 } { .coverage.cmd.a.ce.cg.$last configure -text "day" } .coverage.cmd.a.ce.cg.$NUM_COLORS configure -text "night" .coverage.cmd.a.ce.cg.0 configure -text "sunlight\n " } } proc coverage(update_wells) {} { global COLDIV COLDEC NUM_COLORS COLOR global coverage_projection Projection coverage_flag no_access_flag sun_flag if {$coverage_projection == $Projection(unprojected_mask)} { if {$no_access_flag == 0} { set j 2 } else { set j 0 } } elseif {$sun_flag == 1} { set j [expr $NUM_COLORS - 1] } else { set j 0 } for {set i 1} {$i <= $NUM_COLORS} {incr i} { # set -highlightbackground to black for frame surround on Mac OS X # to hint that buttons are not active and cannot set colours, # since the buttons always look active. if {$coverage_flag == 0} { .coverage.cmd.a.ce.cf.$i configure -bg $COLOR(bg) \ -activebackground $COLOR(bg) -highlightbackground black \ -relief flat \ -command "" } else { .coverage.cmd.a.ce.cf.$i configure -bg $COLDIV($i) \ -activebackground $COLDIV($i) -highlightbackground $COLDIV($i) \ -relief groove \ -command "coverage(diversitycolor) $i" } if {($coverage_flag == 0) || (($no_access_flag == 0)&&($coverage_projection != $Projection(unprojected_mask))) || ($i < $j)} { .coverage.cmd.a.ce.cg.$i configure -bg $COLOR(bg) \ -activebackground $COLOR(bg) -highlightbackground black \ -relief flat \ -command "" } else { .coverage.cmd.a.ce.cg.$i configure -bg $COLDEC($i) \ -activebackground $COLDEC($i) -highlightbackground $COLDEC($i) \ -relief groove \ -command "coverage(decaycolor) $i" } } } proc coverage(update_colors) {} { global DIV DEC global COLDIV COLDEC NUM_COLORS for {set i 0} {$i <= $NUM_COLORS} {incr i} { set COLDIV($i) [eval format "#%06x" $DIV($i)] set COLDEC($i) [eval format "#%06x" $DEC($i)] } satellites COLOR_UPDATE # if texturemapping, need to update sphere map geomview(update_texture) coverage(update_wells) coverage(update) } proc coverage(swap_color_diversity_decay) {} { global DIV DEC global NUM_COLORS for {set i 1} {$i <= $NUM_COLORS} {incr i} { set a $DIV($i) set DIV($i) $DEC($i) set DEC($i) $a } coverage(update_colors) } proc coverage(random_color_values) {} { global DIV DEC coverage_projection Projection global NUM_COLORS global coverage_flag no_access_flag sun_flag for {set i 1} {$i <= $NUM_COLORS} {incr i} { if {$coverage_flag == 1} { set DIV($i) [random_color] } if {(($coverage_projection == $Projection(unprojected_mask)) || ($no_access_flag == 1)) && ($sun_flag == 0)} { set DEC($i) [random_color] } } } proc coverage(random_colors) {} { coverage(random_color_values) coverage(update_colors) } proc coverage(restore_colors) {} { coverage(init_colors) coverage(update_colors) } proc coverage(run_of_colors) {} { global DIV DEC global NUM_COLORS coverage_flag no_access_flag sun_flag if {$coverage_flag == 1} { set DIV(1) [random_color] set DIV($NUM_COLORS) [random_color] } if {($no_access_flag == 1) && ($sun_flag == 0)} { set DEC(1) [random_color] set DEC($NUM_COLORS) [random_color] } coverage(blend_colors) } proc coverage(reverse_color_values) {} { global DIV DEC NUM_COLORS coverage_flag no_access_flag sun_flag if {$NUM_COLORS % 2 == 0} { # even set flip [expr $NUM_COLORS / 2] } else { # odd set flip [expr ($NUM_COLORS-1) / 2] } for {set i 1} {$i <= $flip} {incr i} { set high [expr $NUM_COLORS + 1 - $i] if {$coverage_flag == 1} { set j $DIV($i) set DIV($i) $DIV($high) set DIV($high) $j } if {($no_access_flag == 1) && ($sun_flag == 0)} { set j $DEC($i) set DEC($i) $DEC($high) set DEC($high) $j } } } proc coverage(reverse_colors) {} { coverage(reverse_color_values) coverage(update_colors) } proc coverage(blend_color_values) {force} { global DIV DEC global NUM_COLORS coverage_flag no_access_flag if {$NUM_COLORS < 3} { # no blending required return } set interval [expr $NUM_COLORS - 1] if {$force ||($coverage_flag == 1)} { set DIV1B [expr $DIV(1) % 256] set DIV1G [expr ($DIV(1) - $DIV1B)/256 % 256] set DIV1R [expr ($DIV(1) - $DIV1B - $DIV1G * 256) / 65536] set DIVlast $DIV($NUM_COLORS) set DIVlastB [expr $DIVlast % 256] set DIVlastG [expr ($DIVlast - $DIVlastB)/256 % 256] set DIVlastR [expr ($DIVlast - $DIVlastB - $DIVlastG * 256) / 65536] set DIVRinc [expr double($DIVlastR - $DIV1R) / $interval] set DIVGinc [expr double($DIVlastG - $DIV1G) / $interval] set DIVBinc [expr double($DIVlastB - $DIV1B) / $interval] for {set i 2} {$i < $NUM_COLORS} {incr i} { set j [expr $i - 1] set DIV($i) [expr $DIV(1) + $j * (int($DIVRinc) * 65536 + int($DIVGinc) * 256 + int($DIVBinc))] } } if {$force ||($no_access_flag == 1)} { set DEC1B [expr $DEC(1) % 256] set DEC1G [expr ($DEC(1) - $DEC1B)/256 % 256] set DEC1R [expr ($DEC(1) - $DEC1B - $DEC1G * 256) / 65536] set DEClast $DEC($NUM_COLORS) set DEClastB [expr $DEClast % 256] set DEClastG [expr ($DEClast - $DEClastB)/256 % 256] set DEClastR [expr ($DEClast - $DEClastB - $DEClastG * 256) / 65536] set DECRinc [expr double($DEClastR - $DEC1R) / $interval] set DECGinc [expr double($DEClastG - $DEC1G) / $interval] set DECBinc [expr double($DEClastB - $DEC1B) / $interval] for {set i 2} {$i < $NUM_COLORS} {incr i} { set j [expr $i - 1] set DEC($i) [expr $DEC(1) + $j * (int($DECRinc) * 65536 + int($DECGinc) * 256 + int($DECBinc))] } } } proc coverage(blend_colors) {} { coverage(blend_color_values) 0 coverage(update_colors) } proc coverage(save_colors) {} { global DIV DEC NUM_COLORS global user_file_dir set types { {"SaVi coverage color shades" {.shades} } } set filename [tk_getSaveFile -initialdir "$user_file_dir" -filetypes $types \ -title "SaVi: save coverage color shades" ] if {"$filename" == ""} return if {![string_ends "$filename" ".shades"]} { set filename "$filename.shades" } # open file set f [open "$filename" w] if {$f == ""} { puts stderr "\nSaVi: couldn't save coverage color shades to $filename" return } # write colors puts $f "\# SaVi saved coverage color shades" puts $f "\# http://savi.sourceforge.net/" for {set i 1} {$i <= $NUM_COLORS} {incr i} { puts $f "set DIV($i) $DIV($i)" puts $f "set DEC($i) $DEC($i)" } close $f puts stderr "\nSaVi: saved coverage color shades to $filename" } proc coverage(load_colors) {} { global user_file_dir set types { {"SaVi coverage color shades" {.shades} } } set filename [tk_getOpenFile -initialdir "$user_file_dir" -filetypes $types \ -parent .main -title "SaVi: load coverage color shades" ] if {"$filename" == ""} return coverage(source_colors) "$filename" coverage(update_colors) } proc coverage(source_colors) {filename} { global DIV DEC source "$filename" } proc coverage(diversitycolor) {n} { global DIV global COLDIV coverage_flag if {$coverage_flag == 0} return if {$n == "1"} { set s "" } else { set s "s" } set color [tk_chooseColor -initialcolor $COLDIV($n) -parent .coverage \ -title "SaVi: diversity color for $n satellite$s visible"] if {($color != "") && ($color != $COLDIV($n))} { set COLDIV($n) $color .coverage.cmd.a.ce.cf.$n configure -bg $COLDIV($n) \ -highlightbackground $COLDIV($n) -activebackground $COLDIV($n) set value [string range $COLDIV($n) 1 6] set DIV($n) [expr 0x$value] } satellites COLOR_UPDATE coverage(update_decay) } proc coverage(decaycolor) {n} { global DEC coverage_projection Projection global COLDEC no_access_flag if {($coverage_projection != $Projection(unprojected_mask)) && ($no_access_flag == 0)} return if {$n == "1"} { set s "" } else { set s "s" } set color [tk_chooseColor -initialcolor $COLDEC($n) -parent .coverage \ -title "SaVi: decay color for $n interval$s since covered"] if {($color != "") && ($color != $COLDEC($n))} { set COLDEC($n) $color .coverage.cmd.a.ce.cg.$n configure -bg $COLDEC($n) \ -highlightbackground $COLDEC($n) -activebackground $COLDEC($n) set value [string range $COLDEC($n) 1 6] set DEC($n) [expr 0x$value] } satellites COLOR_UPDATE coverage(update_decay) } proc coverage(save_map_handler) {filename} { global im IM_H IM_W # supported in Tcl 8.5 and 8.6 if {[string_ends "$filename" ".gif"] } { set ext gif } # not supported in Tcl 8.5. Uncertain 8.6 support. if {[string_ends "$filename" ".png"] } { set ext png } if {[string_ends "$filename" ".ppm"] } { set ext ppm } $im write "$filename" -format $ext -from 0 0 $IM_W $IM_H puts stderr "\nSaVi: saved map as $ext to $filename" } proc coverage(save_map) {} { global user_file_dir # {"SaVi coverage map (png)" {.png} } # gives two-color images in 8.6 only, doesn't work in 8.5, # and produces larger filesizes than gif. # {"SaVi coverage map (ppm)" {.ppm} } # works consistently, but is uncompressed. set types { {"SaVi coverage map (gif)" {.gif} } \ {"SaVi coverage map (gzipped)" {.ppm.gz} } \ } set filename [tk_getSaveFile -initialdir "$user_file_dir" -filetypes $types \ -parent .coverage -title "SaVi: save coverage map" ] if {"$filename" == ""} return set length [string length "$filename"] if {[string_ends "$filename" ".png"] || [string_ends "$filename" ".gif"]} { coverage(save_map_handler) $filename return } if {[string_ends "$filename" ".gz"]} { set filename [string range "$filename" 0 [expr $length - 4]] } if {![string_ends $filename ".ppm"]} { set filename "$filename.ppm" } satellites COVERAGE_SAVE_MAP "$filename" save(gzip_file) "$filename" } proc coverage(save_plot) {filename} { global Projection coverage_projection im IM_W IM_H if {"$filename" == ""} return if {($coverage_projection == $Projection(unprojected)) || \ ($coverage_projection == $Projection(unprojected_mask))} { # could use gif, but Xfig needs netpbm to convert gif, has display issues. $im write "$filename.ppm" -format ppm -from 0 0 $IM_W $IM_H puts stderr "\nSaVi: unprojected map background written to $filename.ppm" save(gzip_file) "$filename.ppm" } else { puts stderr "\nSaVi: can only save unprojected maps as plot script backgrounds!" } } proc coverage(dismiss) {} { global coverage_flag tracks_flag \ coverage_flag_dismissed tracks_flag_dismissed set coverage_flag_dismissed $coverage_flag set tracks_flag_dismissed $tracks_flag # turn off flags to avoid computing drawing when window not shown set coverage_flag 0 set tracks_flag 0 destroy .coverage } proc coverage(update_decay) {} { global no_access_flag if {$no_access_flag == 0} return set flag $no_access_flag set no_access_flag 1 if {$flag == 0} { set no_access_flag 0 } } proc coverage(update) {} { global coverage_flag tracks_flag if {![winfo exists .coverage]} return coverage(update_decay) set flag $coverage_flag set coverage_flag 1 if {$flag == 0} { set coverage_flag 0 } set flag $tracks_flag set tracks_flag 1 if {$flag == 0} { set tracks_flag 0 } update } proc coverage(lat_long) {x y} { global Fisheye coverage_projection IM_W IM_H im_x_offset im_y_offset \ Longitude_Center_Line PI Projection set x [expr $x-$im_x_offset] set y [expr $y-$im_y_offset] set HALF_X [expr $IM_W/2] set HALF_Y [expr $IM_H/2] set off_map 0 if {$coverage_projection == $Projection(cylindrical)} { # cylindrical set long [expr (($x%$IM_W)-$HALF_X)/double($IM_W)*360.0+$Longitude_Center_Line] set y [expr 1-$y/double($IM_H)*2] if {$y < -1} { set y -1 } elseif {$y > 1} { set y 1 } set lat [expr asin($y)/$PI*180.0] } elseif {($coverage_projection == $Projection(unprojected))||($coverage_projection == $Projection(unprojected_mask))} { # unprojected set long [expr (($x%$IM_W)-$HALF_X)/double($IM_W)*360.0+$Longitude_Center_Line] set y [expr 1-$y/double($IM_H)*2] if {$y < -1} { set y -1 } elseif {$y > 1} { set y 1 } set lat [expr $y*90] } elseif {$coverage_projection == $Projection(sinusoidal)} { # sinusoidal 0W set lat [expr ($HALF_Y-$y)/double($HALF_Y)*90.0] if {abs($lat) == 90} { set long 0 } else { set long [expr \ (($x%$IM_W)-$HALF_X)/double($HALF_X)/cos($lat/180.0*$PI)*180] } if {$long > 180} { set long 180 set off_map 1 } elseif {$long < -180} { set long 180 set off_map 1 } } elseif {$coverage_projection == $Projection(sinusoidal_90)} { # sinusoidal 90W set lat [expr ($HALF_Y-$y)/double($HALF_Y)*90.0] if {abs($lat) == 90} { set long 0 } else { set long [expr \ (($x%$IM_W)-$HALF_X)/double($HALF_X)/cos($lat/180.0*$PI)*180 + $Longitude_Center_Line] } # below presumes that LCR is -90; it depends on the ppm map anyway. if {$long > ($Longitude_Center_Line+180)} { set long [expr $Longitude_Center_Line+180] set off_map 1 } elseif {$long < ($Longitude_Center_Line-180)} { set long [expr $Longitude_Center_Line+180] set off_map 1 } } else { # spherical 0W/90W set disty [expr abs($y-$HALF_Y)] set laty [expr 1-$y/double($IM_H)*2] if {$laty < -1} { set laty -1 } elseif {$laty > 1} { set laty 1 } set lat [expr asin($laty)/$PI*180.0] set x [expr $x%$IM_W] if {$x > $HALF_X} { set distx [expr $x - $IM_W*0.75] set first_sphere 0 } else { set distx [expr $x - $IM_W*0.25] set first_sphere 1 } if {(sqrt($distx*$distx + $disty*$disty)) > $HALF_Y} { set off_map 1 } if {$coverage_projection == $Projection(spherical)} { if {$first_sphere == 1} { if {$off_map == 1} { if {$distx > 0} { set long 0 } else { set long 180 } } else { # compute value on map set long [expr -90 + 90*$distx/($HALF_X/2.0)*cos($lat*$PI/180)] } } else { if {$off_map == 1} { if {$distx > 0} { set long 180 } else { set long 0 } } else { # compute value on map set long [expr 90 + 90*$distx/($HALF_X/2.0)*cos($lat*$PI/180)] } } } elseif {$coverage_projection == $Projection(spherical_90)} { if {$first_sphere == 1} { if {$off_map == 1} { if {$distx > 0} { set long -90 } else { set long 90 } } else { # compute value on map set long [expr 180 + 90*$distx/($HALF_X/2.0)*cos($lat*$PI/180)] } } else { if {$off_map == 1} { if {$distx > 0} { set long 90 } else { set long -90 } } else { # compute value on map - was set long [expr 0 + 90*$distx/($HALF_X/2.0)*cos($lat*$PI/180)] } } } } if {$off_map == 0} { if {$long <= -180} { set long [expr $long+360] } elseif {$long > 180} { set long [expr $long-360] } } set Fisheye(new_lat_degrees) [expr {$lat<0 ? -int(-$lat) : int($lat)} ] set Fisheye(new_lat_minutes) [expr abs($lat-$Fisheye(new_lat_degrees))*60.0] set Fisheye(new_long_degrees) [expr {$long<0 ? -int(-$long) : int($long)} ] set Fisheye(new_long_minutes) [expr abs($long-$Fisheye(new_long_degrees))*60.0] if {$lat >= 0} { set latdir "N" } else { set latdir "S" } if {$long >=0} { set longdir "E" } else { set longdir "W" } set Fisheye(clicked_coords) "($Fisheye(new_lat_degrees)$latdir, $Fisheye(new_long_degrees)$longdir)" # We could call fisheye(apply) here to set the coordinates directly, # but it's more useful to just know where you've clicked without also # changing the fisheye location. } proc coverage_set(lat_long) {x y} { coverage(lat_long) $x $y fisheye(apply) } proc coverage(foot) {} { global coverage_angle if {$coverage_angle > 90} { set coverage_angle 90 } elseif {$coverage_angle < 0} { set coverage_angle 0 } coverage(update_angle) } proc coverage(title) {} { global coverage_name coverage_projection Projection if {$coverage_projection == $Projection(cylindrical)} { build_Title $coverage_name "view of coverage on cylindrical Earth map" } elseif {$coverage_projection == $Projection(unprojected)} { build_Title $coverage_name "view of coverage on unprojected (equirectangular) Earth map" } elseif {$coverage_projection == $Projection(unprojected_mask)} { build_Title $coverage_name "view of coverage on unprojected (equirectangular) colorful Earth map" } elseif {$coverage_projection == $Projection(sinusoidal)} { build_Title $coverage_name "view of coverage on sinusoidal Earth map" } elseif {$coverage_projection == $Projection(sinusoidal_90)} { build_Title $coverage_name "view of coverage on sinusoidal Earth map (centred on 90W for Americas)" } elseif {$coverage_projection == $Projection(spherical)} { build_Title $coverage_name "view of coverage on east/west hemispheres (equatorial orthographic maps)" } elseif {$coverage_projection == $Projection(spherical_90)} { build_Title $coverage_name "view of coverage from 180/0 deg latitudes (equatorial orthographic maps)" } } proc coverage(map) {} { global coverage_proj_flag coverage_projection last_coverage_projection \ Projection sun_flag if {$coverage_projection == $last_coverage_projection} return coverage(title) set coverage_proj_flag [expr 1 - $coverage_proj_flag] if {($coverage_projection == $Projection(unprojected_mask))} { coverage(labels_show_land_sea) } else { if {$sun_flag} { coverage(labels_show_diversity) coverage(labels_show_sunlight) } else { coverage(labels_show_diversity) coverage(labels_show_decay) } } set last_coverage_projection $coverage_projection coverage(update) # this is a hack to reset Earth while dynamic texturemapping, # if we move from cylindrical/unprojected projections supporting # texturemapping to other projections that don't. geomview(update_texture) } proc coverage(shades) {} { global NUM_COLORS NUM_COLORS_PREV DIV DEC if {$NUM_COLORS < 1} { set NUM_COLORS $NUM_COLORS_PREV return } if {$NUM_COLORS > $NUM_COLORS_PREV} { for {set i [expr $NUM_COLORS_PREV+1]} {$i <= $NUM_COLORS} {incr i} { set DIV($i) $DIV($NUM_COLORS_PREV) set DEC($i) $DEC($NUM_COLORS_PREV) } } set NUM_COLORS_PREV $NUM_COLORS destroy .coverage.cmd.a.ce coverage(wells_frame) coverage(update_colors) } savi1.6.0/tcl/load.tcl0000644000175000017500000000204114423445060013637 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # load.tcl # # $Id: load.tcl 8 2019-01-24 04:33:00Z lloydwood $ proc load(build) {} { set types { {"SaVi simulation scripts" {.tcl} } {"Two-line element sets" {.tle} } } set filename [tk_getOpenFile -initialdir "data/" -filetypes $types \ -parent .main -title "SaVi: load satellites" ] if {"$filename" == ""} return main(load_file) "$filename" } savi1.6.0/tcl/helpfile.tcl0000644000175000017500000000530714423445060014520 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # textfile.tcl # $Id: helpfile.tcl 168 2020-04-28 03:15:28Z lloydwood $ proc helpfile(build) {helpfile} { global helpfile_name helpfile_text if {[eval window(raise) helpfile]} { helpfile(load) $helpfile return } set name [build_Toplevel helpfile] wm protocol $name WM_DELETE_WINDOW helpfile(dismiss) build_Title $name "help" build_DismissButtonbar $name dbbar helpfile(dismiss) \ {"Introduction" "helpfile(build) README"} \ {"Bugs" "helpfile(build) BUGS"} \ {"Texturemapping" "helpfile(build) README-COVERAGE-TEXTUREMAP"} \ {"Copyright" "helpfile(build) COPYRIGHT"} set cmd [build_CmdFrame $name cmd] build_Label $cmd on "Help from $helpfile_name" set helpfile_name $cmd.on $helpfile_name.label configure -font *-times-medium-i-normal--*-140-*-*-*-*-*-* \ -fg blue set helpfile_text [build_Scrollingtext $cmd text 60 25] $helpfile_text configure -font *-courier-i-normal--*-12-*-*-*-*-*-* \ helpfile(load) $helpfile pack $cmd.text -side left -anchor w -ipadx 15m -ipady 2m pack $cmd -anchor w -expand 1 -fill both } proc helpfile(dismiss) {} { destroy .helpfile } proc helpfile(load) {helpfile} { global helpfile_name helpfile_text set helpfile_file $helpfile if {[string compare "" $helpfile] == 0} { # special case starting SaVi without a constellation loaded. set file_text "\nThis is a simple low-Earth-orbiting equatorial example satellite." } elseif {[file exists $helpfile] == 0} { set file_text "\nThe $helpfile textfile is not available to SaVi.\n\n$helpfile may have been removed or moved. SaVi may have been packaged incorrectly by a third party.\n\nPlease install the full version of SaVi, which includes $helpfile, from: http://savi.sf.net/" } else { set f [open "$helpfile" r] set file_text "" while {[gets $f line] >= 0} { if {[string index $line 0] != "$"} { set file_text "$file_text\n$line " } } close $f } $helpfile_name.label configure -text "Help from $helpfile" $helpfile_text delete 1.0 end $helpfile_text insert end $file_text } savi1.6.0/tcl/fisheye.tcl0000644000175000017500000005071514423445060014367 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # fisheye.tcl # # $Id: fisheye.tcl 179 2020-05-27 05:33:37Z lloydwood $ proc fisheye(init) {} { global fisheye_flag fisheye_reverse_view_flag fisheye_names_flag fisheye_numbers_flag \ fisheye_times_flag fisheye_viewpoint_flag fisheye_print_inview_flag fisheye_labels_flag Fisheye \ fisheye_flag_dismissed trace variable fisheye_flag w flag_change trace variable fisheye_labels_flag w flag_change trace variable fisheye_reverse_view_flag w flag_change trace variable fisheye_print_inview_flag w flag_change trace variable fisheye_names_flag w flag_change trace variable fisheye_numbers_flag w flag_change trace variable fisheye_times_flag w flag_change trace variable fisheye_viewpoint_flag w flag_change set fisheye_flag 0 set fisheye_labels_flag 1 set fisheye_reverse_view_flag 0 set fisheye_print_inview_flag 0 set fisheye_names_flag 1 set fisheye_numbers_flag 0 set fisheye_times_flag 0 set fisheye_flag_dismissed 1 # Equator (0,0) - increases chances of seeing a satellite set Fisheye(new_lat_degrees) 0 set Fisheye(new_lat_minutes) 0 set Fisheye(new_long_degrees) 0 set Fisheye(new_long_minutes) 0 set Fisheye(new_location_name) "Equator (0,0)" fisheye(set_location) $Fisheye(new_lat_degrees) $Fisheye(new_lat_minutes) $Fisheye(new_long_degrees) $Fisheye(new_long_minutes) $Fisheye(new_location_name) } proc fisheye(build) {} { global Fisheye fisheye_names_flag global fisheye_times_flag fisheye_numbers_flag fisheye_viewpoint_flag global plane_flag if {[eval window(raise) fisheye]} return set fisheye_name [build_Toplevel fisheye] wm protocol $fisheye_name WM_DELETE_WINDOW fisheye(dismiss) build_Title $fisheye_name "Fisheye view of the local sky" build_Menubar $fisheye_name mbar \ {"Help" \ {"About this constellation..." "details(build)" "H"} \ {} \ {"Introduction to SaVi..." "helpfile(build) README"} \ {"Bugs in SaVi..." "helpfile(build) BUGS"} \ {"Texturemapping in Geomview..." "helpfile(build) README-COVERAGE-TEXTUREMAP"} \ {} \ {"about SaVi..." "about(build)"} } \ {"File" \ {"Load satellites..." "load(build)"} \ {"Save satellites as Tcl script..." "save(build)" "S"} \ {} \ {"Load new constellation TLEs from web..." "load_url_tle(build)"} \ {} \ {"Save fisheye as postscript..." fisheye(save)} \ {} \ {"Close window" "fisheye(dismiss)" "W"} \ {"Quit" "main(exit)" "Q"} } \ {"Edit" \ {"Simulation constants..." "params(build)"} } \ {"Views" \ {"Satellites list..." "window(raise) main" "L"} \ {"Global coverage..." "coverage(build)" "G"} \ {} \ {"> Step forwards" "main(forw_step)"} \ {"< Step back" "main(back_step)"} \ {">> Forwards..." "main(forwards)"} \ {"<< Reverse..." "main(backwards)"} \ {"Freeze views" "main(stop)"} \ {} \ {"Restart views at time zero" "main(restart)" "0"} } \ {"Constellations"} \ {"Rendering"} \ {"Display"} \ {"Locations" \ {"Equator (0,0)" "fisheye(set_location) 0 0 0 0 {Equator (0 , 0)}"} \ {"North Pole" "fisheye(set_location) 90 0 0 0 {North Pole}"} \ {"South Pole" "fisheye(set_location) -90 0 0 0 {South Pole} "} \ {"SUBMENU" "africa" "Africa"} \ {"SUBMENU" "asia" "Asia"} \ {"SUBMENU" "antarctica" "Antarctica"} \ {"SUBMENU" "australasia" "Australasia"} \ {"SUBMENU" "europe" "Europe"} \ {"SUBMENU" "northamerica" "North America"} \ {"SUBMENU" "southamerica" "South America"} \ {} \ {"SUBMENU" "pacific" "Pacific Ocean"} \ {"SUBMENU" "atlantic" "Atlantic Ocean"} \ {"SUBMENU" "indian" "Indian Ocean"} \ {"SUBMENU" "med" "Mediterranean Sean"} } build_Menu $fisheye_name.mbar.b6.africa \ {"Algiers, Algeria" "fisheye(set_location) 36 50 3 0 {Algiers, Algeria}"} \ {"Cairo, Egypt" "fisheye(set_location) 30 3.6 31 13.8 {Cairo, Egypt}"} \ {"Casablanca, Morocco" "fisheye(set_location) 33 66 -7 37.2 {Casablanca, Morocco}"} \ {"Dakar, Senegal" "fisheye(set_location) 14 43.8 -17 27 {Dakar, Senegal}"} \ {"Lagos, Nigeria" "fisheye(set_location) 6 27 3 24 {Lagos, Nigeria}"} \ {"Addis Ababa, Ethiopia" "fisheye(set_location) 9 0.18 38 43.8 {Addis Ababa, Ethiopia}"} \ {"Nairobi, Kenya" "fisheye(set_location) -1 17.4 36 48.6 {Nairobi, Kenya}"} \ {"Harare, Zimbabwe" "fisheye(set_location) -17 49.8 31 3 {Harare, Zimbabwe}"} \ {"Johannesburg, South Africa" "fisheye(set_location) -26 12 28 2.4 {Johannesburg, Soth Africa}"} \ {"Cape Town, South Africa" "fisheye(set_location) -33 55.2 18 25.2 {Cape Town, Sourh Africa}"} build_Menu $fisheye_name.mbar.b6.antarctica \ {"Casey Station" "fisheye(set_location) -66 17 119 31.5 {Casey Station}"} \ {"Mawson Station" "fisheye(set_location) -67 36 62 52.38 {Mawson}"} \ {"McMurdo Station" "fisheye(set_location) -77 51 166 40 {McMurdo Station, Antarctica}"} \ {"Vostok Station" "fisheye(set_location) -78 28 106 50.25 {Vostok Station}"} build_Menu $fisheye_name.mbar.b6.asia \ {"Ankara, Turkey" "fisheye(set_location) 39 55 32 55 {Ankara, Turkey}"} \ {"Bombay, India" "fisheye(set_location) 19 0 72 48 {Bombay, India}"} \ {"Bangkok, Thailand" "fisheye(set_location) 13 45 100 30 {Bangkok, Thailand}"} \ {"Beijing, China" "fisheye(set_location) 39 55 116 25 {Beijing, China}"} \ {"Mecca, Saudi Arabia" "fisheye(set_location) 21 29 39 45 {Mecca, Saudi Arabia}"} \ {"Port Moresby, Papua New Guinea" "fisheye(set_location) -9 25 147 17 {Port Moresby, Papua New Guinea}"} \ {"Singapore" "fisheye(set_location) 1 14 103 55 {Singapore}"} \ {"Tokyo, Japan" "fisheye(set_location) 35 40 139 45 {Tokyo, Japan}"} build_Menu $fisheye_name.mbar.b6.australasia \ {"Adelaide, Australia" "fisheye(set_location) -34 55 138 36 {Adelaide, Australia}"} \ {"Brisbane, Australia" "fisheye(set_location) -27 28 153 0 {Brisbane, Australia}"} \ {"Canberra, Australia" "fisheye(set_location) -35 18 149 7 {Canberra, Australia}"} \ {"Melbourne, Australia" "fisheye(set_location) -37 47 144 58 {Melbourne, Australia}"} \ {"Perth, Australia" "fisheye(set_location) -31 57 115 51 {Perth, Australia}"} \ {"Sydney, Australia" "fisheye(set_location) -34 0 151 0 {Sydney, Australia}"} \ {"Auckland, New Zealand" "fisheye(set_location) -36 52 174 45 {Auckland, New Zealand}"} \ {"Wellington, New Zealand" "fisheye(set_location) -41 17 174 47 {Wellington, New Zealand}"} # europe build_Menu $fisheye_name.mbar.b6.europe \ {"Amsterdam, Netherlands" "fisheye(set_location) 52 22 4 53 {Amsterdam, Netherlands}"} \ {"Athens, Greece" "fisheye(set_location) 37 58 23 43 {Athens, Greece}"} \ {"Berlin, Germany" "fisheye(set_location) 52 30 13 25 {Berlin, Germany}"} \ {"Brussels, Belgium" "fisheye(set_location) 50 52 4 22 {Brussels, Belgium}"} \ {"Copenhagen, Denmark" "fisheye(set_location) 55 40 12 34 {Copenhagen, Denmark}"} \ {"Dublin, Eire" "fisheye(set_location) 53 20 -6 15 {Dublin, Eire}"} \ {"Lisbon, Portugal" "fisheye(set_location) 38 44 -9 9 {Lisbon, Portugal}"} \ {"London, UK" "fisheye(set_location) 51 32 0 -5 {London, UK}"} \ {"Madrid, Spain" "fisheye(set_location) 40 26 -3 42 {Madrid, Spain}"} \ {"Moscow, Russia" "fisheye(set_location) 55 45 37 36 {Moscow, Russia}"} \ {"Reykjavik, Iceland" "fisheye(set_location) 64 4 -21 58 {Reykjavik, Iceland}"} \ {"Rome, Italy" "fisheye(set_location) 41 54 12 27 {Rome, Italy}"} \ {"Oslo, Norway" "fisheye(set_location) 59 57 10 42 {Oslo, Norway}"} \ {"Paris, France" "fisheye(set_location) 48 48 2 20 {Paris, France}"} \ {"Vienna, Austria" "fisheye(set_location) 48 14 16 20 {Vienna, Austria}"} build_Menu $fisheye_name.mbar.b6.northamerica \ {"Anchorage, Alaska, USA" "fisheye(set_location) 61 13 -149 54 {Anchorage, Alaska}"} \ {"Miami, Florida, USA" "fisheye(set_location) 25 47 -80 13 {Miami, Florida}"} \ {"New York, USA" "fisheye(set_location) 40 47 -73 58 {New York, USA}"} \ {"San Francisco, California, USA" "fisheye(set_location) 37 47 -122 26 {San Francisco, USA}"} \ {"Toronto, Canada" "fisheye(set_location) 43 40 -79 24 {Toronto, Canada}"} \ {"Vancouver, Canada" "fisheye(set_location) 49 13 -123 6 {Vancouver, Canada}"} \ {"Washington DC, USA" "fisheye(set_location) 38 53 -77 02 {Washington DC, USA}"} build_Menu $fisheye_name.mbar.b6.southamerica \ {"Buenos Aires, Argentina" "fisheye(set_location) -34 35 -58 22 {Buenos Aires, Argentina}"} \ {"Lima, Peru" "fisheye(set_location) -12 0 -77 2 {Lima, Peru}"} \ {"Quito, Ecuador" "fisheye(set_location) 0 -14 -78 30 {Quito, Ecuador}"} \ {"Rio de Janeiro, Brazil" "fisheye(set_location) -22 57 -43 12 {Rio de Janeiro, Brazil}"} build_Menu $fisheye_name.mbar.b6.pacific \ {"Honiara, Solomon Islands" "fisheye(set_location) -9 26 159 57 {Honiara, Solomon Islands}"} \ {"Honolulu, Hawaii" "fisheye(set_location) 21 18 -157 51 {Honolulu, Hawaii}"} \ {"Suva, Fiji" "fisheye(set_location) -18 8 178 26 {Suva, Fiji}"} \ {"Tarawa, Kiribati" "fisheye(set_location) 1 25 173 2 {Tarawa, Kiribati}"} \ {"Apia, Samoa" "fisheye(set_location) -13 50 171 45 {Apia, Samoa}"} \ {"Nuku'alofa, Tonga" "fisheye(set_location) -21 8 175 12 {Nuku'alofa, Tonga}"} \ {"Rarotonga, Cook Islands" "fisheye(set_location) -21 14 -159 47 {Rarotonga, Cook Islands}"} build_Menu $fisheye_name.mbar.b6.atlantic \ {"Nuuk, Greenland" "fisheye(set_location) 64 11 -51 45 {Nuuk, Greenland}" } \ {"Reykjavik, Iceland" "fisheye(set_location) 64 9 -21 57 {Reykjavik, Iceland}"} \ {"Horta, Azores" "fisheye(set_location) 38 32 -28 38 {Horta, Azores}"} \ {"Stanley, Falklands" "fisheye(set_location) -51 41 -57 51 {Stanley, Falklands}"} build_Menu $fisheye_name.mbar.b6.indian \ {"Colombo, Sri Lanka" "fisheye(set_location) 6 55 79 50 {Colombo, Sri Lanka}"} \ {"Male, Maldives" "fisheye(set_location) 4 10 73 30 {Male, Maldives}"} \ {"Antananarivo, Madagascar" "fisheye(set_location) -18 55 47 31 {Antananarivo, Madagascar}"} \ {"Port Louis, Mauritius" "fisheye(set_location) -20 9 57 30 {Port Louis, Mauritius}"} \ {"Victoria, Seychelles" "fisheye(set_location) -4 35 55 40 {Victoria, Seychelles}"} build_Menu $fisheye_name.mbar.b6.med \ {"Gibraltar" "fisheye(set_location) 36 11 -5 22 {Gibraltar}"} \ {"Nicosia, Cyprus" "fisheye(set_location) 35 10 33 22 {Nicosia, Cyprus}"} main(constellations_menu) $fisheye_name.mbar.b3 main(rendering_menu) $fisheye_name.mbar.b4 build_options_menu $fisheye_name.mbar.b5 \ {"Plot location on map" fisheye_viewpoint_flag } \ {} \ {"Show numbers" fisheye_numbers_flag} \ {"Show names" fisheye_names_flag} \ {"Show time in view" fisheye_times_flag} \ {} \ {"Show stationary arc" plane_flag} \ {} \ {"Reverse fisheye view" fisheye_reverse_view_flag} set cmd [build_CmdFrame $fisheye_name cmd] set p "$cmd.p" canvas $p -bg black -height 360 -width 360 bind $p {main(back_step)} bind $p {main(forw_step)} bind $p {main(backwards)} bind $p {main(forwards)} pack $p -side right pack $p -fill both -expand 1 set cmdr [build_StdFrame $cmd r] build_LabelEntryColumns $cmdr le1 \ {label "" {time Fisheye(location_name) fisheye_lat_lon}} pack $cmdr build_Optionslist $cmd olist \ {"Plot location on map" fisheye_viewpoint_flag} \ {"Numbers" fisheye_numbers_flag} \ {"Names" fisheye_names_flag} \ {"Time in view" fisheye_times_flag} \ {"Stationary arc" plane_flag} set cmdll [build_StdFrame $cmd ll] pack $cmdll set cmdb [build_StdFrame $cmd b] build_LabelEntryColumns $cmdb le3 \ {text "" "Coverage"} \ {dentry "" {coverage_angle}} \ {text "" "degrees"} bind $cmdb.le3.c1.0 coverage(update_angle) bind $cmdb.le3.c1.0 coverage(update_angle) pack $cmdb -fill both -expand 1 set cmdq [build_StdFrame $cmd q] build_LabelEntryColumns $cmdq le0 \ {text " " {"Lat:" "Long:"}} \ {ientry "degrees" {Fisheye(new_lat_degrees) Fisheye(new_long_degrees)} } \ {ientry "minutes" {Fisheye(new_lat_minutes) Fisheye(new_long_minutes)} } bind $cmdq.le0.c1.0 fisheye(apply) bind $cmdq.le0.c1.1 fisheye(apply) bind $cmdq.le0.c2.0 fisheye(apply) bind $cmdq.le0.c2.1 fisheye(apply) pack $cmdq -side bottom -fill both pack $cmd -fill both -expand 1 # an explicit Dismiss Window button halts computation. build_DismissButtonbar $fisheye_name dbbar fisheye(dismiss) \ {"Set new location" fisheye(apply)} update # needed if window was closed and is being reopened fisheye(draw) fisheye(update) } proc fisheye(dismiss) {} { global fisheye_flag fisheye_flag_dismissed set fisheye_flag_dismissed $fisheye_flag set fisheye_flag 0 destroy .fisheye } proc fisheye(draw) {} { global FS_D # initialize display set p ".fisheye.cmd.p" if {[eval winfo exists $p] == 0} return set adjust 2 set size_threshold_small 175 set size_threshold_large 350 set d [expr $FS_D - $adjust] set color_dark "black" set color_light "grey90" if {$d < $size_threshold_large} { set ring_color $color_light } else { set ring_color $color_dark } set x_start [expr double($adjust)] set y_end [expr double($d - $x_start)] $p create oval $x_start $x_start $y_end $y_end -fill white -width 1 -tags disk # 30 degrees circle set x_start [expr $d / 6 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $ring_color -width 1 -tags disk # 60 degrees circle set x_start [expr $d / 3 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $ring_color -width 1 -tags disk # centre point set r [expr $d / 2] set r1 [expr $r + 1] $p create rectangle $r $r $r1 $r1 -outline black -width 1 -tags disk # if canvas is too small, don't draw extra circles. if {$d < $size_threshold_small} return; # 15 degrees circle set x_start [expr $d / 12 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $ring_color -width 1 -tags disk # 45 degrees circle set x_start [expr $d / 4 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $ring_color -width 1 -tags disk # 75 degrees circle set x_start [expr $d * 5/12 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $ring_color -width 1 -tags disk # draw more circles on big canvas. if {$d < $size_threshold_large} return; # 5 degrees circle set x_start [expr $d / 36 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $color_light -width 1 -tags disk # 10 degrees circle set x_start [expr $d / 18 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $color_light -width 1 -tags disk # 20 degrees circle set x_start [expr $d / 9 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $color_light -width 1 -tags disk # 25 degrees circle set x_start [expr $d / 7.2 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $color_light -width 1 -tags disk # 35 degrees circle set x_start [expr $d / 5.1429 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $color_light -width 1 -tags disk # 40 degrees circle set x_start [expr $d / 4.5 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $color_light -width 1 -tags disk # 50 degrees circle set x_start [expr $d / 3.6 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $color_light -width 1 -tags disk # 55 degrees circle set x_start [expr $d / 3.273 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $color_light -width 1 -tags disk # 65 degrees circle set x_start [expr $d / 2.77 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $color_light -width 1 -tags disk # 70 degrees circle set x_start [expr $d / 2.57 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $color_light -width 1 -tags disk # 80 degrees circle set x_start [expr $d / 2.25 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $color_light -width 1 -tags disk # 85 degrees circle set x_start [expr $d / 2.118 + $adjust] set y_end [expr $d - $x_start] $p create oval $x_start $x_start $y_end $y_end -outline $color_light -width 1 -tags disk } proc fisheye(parallels_show) {} { if {![winfo exists .fisheye]} return set cmdll ".fisheye.cmd.ll" build_LabelEntryColumns $cmdll le2 \ {text "" "Parallels"} \ {dentry "" {parallels_angle}} \ {text "" "degrees"} bind $cmdll.le2.c1.0 equator(update_angle) bind $cmdll.le2.c1.0 equator(update_angle) pack $cmdll } proc fisheye(parallels_hide) {} { if {![winfo exists .fisheye]} return destroy .fisheye.cmd.ll.le2 } proc fisheye(delete) {} { set p ".fisheye.cmd.p" if [winfo exists $p] { $p delete crosses $p delete labels $p delete mask_elevation $p delete equator } } proc fisheye(resize) {} { # update C with current smallest dimension of window. set p ".fisheye.cmd.p" set diam [eval winfo width $p] set height [eval winfo height $p] if {$diam > $height} { set diam $height } upvar #0 FS_D FS_D if {$diam != $FS_D} { $p delete disk set FS_D $diam fisheye(draw) } } proc fisheye(update) {} { global fisheye_flag if {![winfo exists .fisheye]} return set flag fisheye_flag set fisheye_flag 1 if {$flag == 0} { set fisheye_flag 0 } update } proc fisheye(apply) {} { global Fisheye if {($Fisheye(new_lat_degrees) == $Fisheye(lat_degrees)) && ($Fisheye(new_lat_minutes) == $Fisheye(lat_minutes)) && ($Fisheye(new_long_degrees) == $Fisheye(long_degrees)) && ($Fisheye(new_long_minutes) == $Fisheye(long_minutes))} { # do not change the name return } set Fisheye(new_location_name) "custom location" fisheye(set_location) $Fisheye(new_lat_degrees) $Fisheye(new_lat_minutes) $Fisheye(new_long_degrees) $Fisheye(new_long_minutes) $Fisheye(new_location_name) } proc fisheye(set_location) {lat_degrees lat_minutes long_degrees long_minutes location} { global Fisheye set Fisheye(lat_degrees) $lat_degrees set Fisheye(lat_minutes) $lat_minutes set Fisheye(long_degrees) $long_degrees set Fisheye(long_minutes) $long_minutes set Fisheye(location_name) $location satellites FISHEYE_SET $Fisheye(lat_degrees) $Fisheye(lat_minutes) \ $Fisheye(long_degrees) $Fisheye(long_minutes) fisheye(update) } proc fisheye(save) {} { global user_file_dir set types { {"Postscript files" {.ps} } } set filename [tk_getSaveFile -initialdir "$user_file_dir" -filetypes $types \ -title "SaVi: save fisheye as Postscript" ] if {"$filename" == ""} return set length [string length "$filename"] set last3 [string range "$filename" [expr $length - 3] $length] if {[string compare $last3 ".ps"] != 0} { set filename "$filename.ps" } # open file set f [open "$filename" w] if {$f == ""} { puts stderr "\nSaVi: couldn't save postscript to $filename" return } set p ".fisheye.cmd.p" $p postscript -channel $f # close file close $f puts stderr "\nSaVi: saved fisheye as postscript to $filename" } savi1.6.0/tcl/main.tcl0000644000175000017500000005754314423445060013665 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # main.tcl # # $Id: main.tcl 209 2023-04-30 10:29:46Z lloydwood $ proc main(build) {} { global main_name COLOR FONT TITLE geomview_module last_filename PLATFORM if {[eval window(raise) main]} return set main_name [build_Toplevel main] wm protocol $main_name WM_DELETE_WINDOW main(exit) wm title $main_name "$TITLE - satellite constellation visualization" build_Menubar $main_name mbar \ {"Help" \ {"About this constellation..." "details(build)" "H"} \ {} \ {"Introduction to SaVi..." "helpfile(build) README"} \ {"Bugs in SaVi..." "helpfile(build) BUGS"} \ {"Texturemapping in Geomview..." "helpfile(build) README-COVERAGE-TEXTUREMAP"} \ {} \ {"about SaVi..." "about(build)"} } \ {"File"} \ {"Edit" \ {"Simulation constants..." "params(build)"} \ {} \ {"Edit selected satellite..." "edit(build)" "E"} \ {"New satellite..." "main(new)" "N"} \ {} \ {"Unselect" "main(unselect_all)" } \ {"Copy" "main(copy)" "C"} \ {"Cut" "main(delete)" "X"} } \ {"Views"} \ {"Constellations"} \ {"Rendering"} if {$geomview_module == 0} { build_Menu $main_name.mbar.b0 \ {"Load more satellites..." "load(build)"} \ {"Save satellites as Tcl script..." "save(build)" "S"} \ {} \ {"Download new constellation TLEs..." "load_url_tle(build)"} \ {} \ {"Save satellites for plot script..." main(save_plot)} \ {} \ {"Quit" "main(exit)" "Q"} build_Menu $main_name.mbar.b2 \ {"Global coverage..." "coverage(build)" "G"} \ {"Local fisheye..." "fisheye(build)" "F"} \ {} \ {"> Step forwards" "main(forw_step)"} \ {"< Step back" "main(back_step)"} \ {">> Forwards..." "main(forwards)"} \ {"<< Reverse..." "main(backwards)"} \ {"Freeze views" "main(stop)"} \ {} \ {"Restart views at time zero" "main(restart)" "0"} } else { build_Menu $main_name.mbar.b0 \ {"Load satellites..." "load(build)"} \ {"Save satellites as Tcl script..." "save(build)" "S"} \ {} \ {"Download constellation TLEs..." "load_url_tle(build)"} \ {} \ {"Save satellites for plot script..." main(save_plot)} \ {} \ {"Save Geomview camera screenshots..." "no_frames(build)"} \ {"Save Geomview print rendering..." "snapshot(build)"} \ {} \ {"Quit" "main(exit)" "Q"} build_Menu $main_name.mbar.b2 \ {"Global coverage..." "coverage(build)"} \ {"Local fisheye..." "fisheye(build)"} \ {} \ {"Geomview background color..." "geomview(choose_background_color)"} \ {"View north pole in Geomview" "geomview(camera_north_pole)"} \ {"View south pole in Geomview" "geomview(camera_south_pole)"} \ {} \ {"> Step forwards" "main(forw_step)"} \ {"< Step back" "main(back_step)"} \ {">> Forwards..." "main(forwards)"} \ {"<< Reverse..." "main(backwards)"} \ {"Freeze views" "main(stop)"} \ {} \ {"Restart views at time zero" "main(restart)"} } main(constellations_menu) $main_name.mbar.b3 main(rendering_menu) $main_name.mbar.b4 set cmd [build_StdFrame $main_name cmd] # needs to be 78 on old 10.4 Mac with supplied Tcl/Tk to avoid crash. set WIDTH 99 if {$PLATFORM == 1} { set WIDTH 78 } label $cmd.l -text \ "no. semi-major axis eccentricity inclination longitude asc. node arg. periapsis time to periapsis satellite name" \ -font $FONT(label) listbox $cmd.lb -yscrollcommand "$cmd.scroll set" \ -height 2 -width $WIDTH -selectmode single \ -font $FONT(fixed) -bg $COLOR(entry) pack $cmd.l -side top -anchor w pack $cmd.l -fill none pack $cmd.lb -side left pack $cmd.lb -fill both -expand 1 bind $cmd.lb {main(select) [%W nearest %y]} bind $cmd.lb {main(dblselect) [%W nearest %y]} bind $cmd.lb {main(rangeselect) [%W nearest %y]} bind $cmd.lb {main(rangedblselect) [%W nearest %y]} bind $cmd.lb {main(itemselect) [%W nearest %y]} bind $cmd.lb {main(itemdblselect) [%W nearest %y]} bind $cmd.lb {main(delete)} bind $cmd.lb {main(new)} scrollbar $cmd.scroll -command "$cmd.lb yview" pack $cmd.scroll -side right -fill y pack $cmd -fill both -expand 1 set cmd0 [build_CmdFrame $main_name cmd0] build_LabelEntryColumns $cmd0 le0 \ {dentry "" {delta_t}} \ {text "" {"seconds per simulation interval."}} \ {label "" {time}} \ {label "" {last_filename}} pack $cmd0 -fill x build_Buttonbar $main_name bb1 \ {"Restart" {main(restart)}} \ {" < " {main(back_step)}} \ {" > " {main(forw_step)}} \ {" STOP " main(stop)} \ {" < < " main(backwards)} \ {" > > " main(forwards)} main(start_satellites) # show help menu details(build) } proc main(save_plot) {} { global user_file_dir set types { {"ns-2 dump file" {.dump} } \ } set filename [tk_getSaveFile -initialdir "$user_file_dir" -filetypes $types \ -parent .main -title "SaVi: save for satellite plot scripts"] if {"$filename" == ""} return satellites COVERAGE_SAVE_PLOT "$filename" if {[winfo exists .coverage]} { coverage(save_plot) "$filename" } else { puts stderr "\nSaVi: can't save background map without a Coverage window." } } proc main(start_satellites) {} { global first_filename last_filename source_comments comments_text comments_file details_source if { [string compare "$first_filename" "NULL"] } { main(load_file) "$first_filename" } else { set last_filename "a LEO satellite." set source_comments "An example satellite in a low equatorial orbit." set comments_text "" set comments_file "" set details_source "" } } proc main(reset_title) {} { global TITLE main_name wm title $main_name "$TITLE - satellite constellation visualization" } proc main(title) {filename} { global TITLE main_name wm title $main_name "$TITLE - $filename - satellite constellation visualization" } proc main(constellations_menu) {submenu} { build_Menu $submenu \ {"Empty space..." "empty(build)" "M"} \ {} \ {"SUBMENU" "geosync" "Geosynchronous" } \ {"SUBMENU" "ellip" "Elliptical"} \ {"SUBMENU" "eq" "Equatorial"} \ {"SUBMENU" "meo" "Medium Earth Orbit (MEO)"} \ {} \ {"SUBMENU" "navigation" "Navigation (MEO)" } \ {"SUBMENU" "voice" "Voice"} \ {"SUBMENU" "sensing" "Remote sensing"} \ {"SUBMENU" "messaging" "Messaging"} \ {} \ {"SUBMENU" "mega" "2010s 'megaconstellations'"} \ {"SUBMENU" "broad" "1990s large broadband proposals"} \ {"SUBMENU" "other" "Other proposed designs"} \ {} \ {"Ballard rosette..." "rosette(build)"} \ {"Crude star..." "star(build)"} \ {} \ {"SUBMENU" "tle" "Sample two-line elsets (TLE)"} \ # build submenus build_Menu $submenu.geosync \ {"Clarke geostationary" "main(constellation) clarke.tcl"} \ {} \ {"Quasi-geostationary" "main(constellation) quasi-geo.tcl"} \ {"Karousel" "main(constellation) karousel.tcl"} \ {} \ {"Molnya elliptical" "main(constellation) molnya.tcl"} \ {"Tundra elliptical" "main(constellation) tundra.tcl"} \ {"Sirius Radio" "main(constellation) sirius-radio.tcl"} \ {} \ {"Draim tetrahedral" "main(constellation) draim-4.tcl"} \ {"Singh 24-hour tetrahedral" "main(constellation) singh-24hr.tcl"} \ {"Singh 48-hour tetrahedral" "main(constellation) singh-48hr.tcl"} build_Menu $submenu.navigation \ {"Global Positioning System (GPS)" "main(constellation) gps.tcl"} \ {"Glonass" "main(constellation) glonass.tcl"} \ {"Galileo" "main(constellation) galileo.tcl"} \ build_Menu $submenu.mega \ {"SpaceX Starlink first shell (1,584)" "main(constellation) spacex-starlink-inner.tcl"} \ {"OneWeb (720)" "main(constellation) oneweb.tcl"} \ {} \ {"SUBMENU" "kuiper" "Amazon Project Kuiper"} \ {"SUBMENU" "telesat" "Telesat Lightspeed"} \ {"ViaSat (LEO)" "main(constellation) viasat-leo.tcl"} \ {} \ {"LeoSat (78)" "main(constellation) leosat.tcl"} build_Menu $submenu.mega.kuiper \ {"Amazon Project Kuiper first shell (1,156)" "main(constellation) amazon-project-kuiper-first.tcl"} \ {"Amazon Project Kuiper second shell (784)" "main(constellation) amazon-project-kuiper-second.tcl"} \ {"Amazon Project Kuiper third shell (1,296)" "main(constellation) amazon-project-kuiper-third.tcl"} \ {} \ {"all of Amazon Project Kuiper" "main(constellation) amazon-project-kuiper-all.tcl"} build_Menu $submenu.mega.telesat \ {"Telesat polar (72)" "main(constellation) telesat-polar.tcl"} \ {"Telesat inclined (45)" "main(constellation) telesat-inclined.tcl"} \ {} \ {"all of Telesat" "main(constellation) telesat-all.tcl"} build_Menu $submenu.broad \ {"SUBMENU" "teledesic" "Teledesic"} \ {"SUBMENU" "skybridge" "Skybridge"} \ {"Celestri (63)" "main(constellation) celestri.tcl"} \ {"COMMstellation (78)" "main(constellation) commstellation-78.tcl"} \ {"NeLS (120)" "main(constellation) nels.tcl"} \ build_Menu $submenu.broad.teledesic \ {"1997 reduced Boeing design (288)" "main(constellation) teledesic-288.tcl"} \ {"1994 original design (840)" "main(constellation) teledesic-840.tcl"} build_Menu $submenu.broad.skybridge \ {"1998 redesign (80)" "main(constellation) skybridge-80.tcl"} \ {"1997 original design (64)" "main(constellation) skybridge-64.tcl"} build_Menu $submenu.ellip \ {"Molnya" "main(constellation) molnya.tcl"} \ {"Tundra" "main(constellation) tundra.tcl"} \ {"Sirius Radio" "main(constellation) sirius-radio.tcl"} \ {} \ {"Draim tetrahedral" "main(constellation) draim-4.tcl"} \ {"Ellipso (for Concordia)" "main(constellation) ellipso.tcl"} \ {"Karousel" "main(constellation) karousel.tcl"} \ {"Millimeter" "main(constellation) mm.tcl"} build_Menu $submenu.eq \ {"Clarke geostationary" "main(constellation) clarke.tcl"} \ {"O3b Networks" "main(constellation) o3b-networks.tcl"} \ {} \ {"Laser Light (HALO)" "main(constellation) laser-light-halo.tcl"} \ {"Ellipso (for Borealis)" "main(constellation) ellipso.tcl"} \ {"Orblink" "main(constellation) orblink.tcl"} \ {"LEq0" "main(constellation) leqo.tcl"} build_Menu $submenu.meo \ {"O3b Networks" "main(constellation) o3b-networks.tcl"} \ {} \ {"O3b full global coverage" "main(constellation) o3b-networks-full.tcl"} \ {"Audacy" "main(constellation) audacy.tcl"} \ {"Laser Light (HALO)" "main(constellation) laser-light-halo.tcl"} \ {} \ {"ViaSat NGSO" "main(constellation) viasat-ngso.tcl"} \ {"Spaceway NGSO" "main(constellation) spaceway-ngso.tcl"} \ {"Orblink" "main(constellation) orblink.tcl"} \ {} \ {"Ellipso" "main(constellation) ellipso.tcl"} \ {"ICO" "main(constellation) ico.tcl"} \ {"Odyssey" "main(constellation) odyssey.tcl"} \ build_Menu $submenu.voice \ {"Globalstar" "main(constellation) globalstar.tcl"} \ {"Iridium" "main(constellation) iridium-66.tcl"} \ {} \ {"Ellipso" "main(constellation) ellipso.tcl"} \ {"ICO" "main(constellation) ico.tcl"} \ {"Odyssey" "main(constellation) odyssey.tcl"} \ build_Menu $submenu.sensing \ {"RADARSAT" "main(constellation) radarsat-rcm.tcl"} \ {"DMC disaster monitoring" "main(constellation) dmc.tcl"} \ {"RapidEye" "main(constellation) rapideye.tcl"} \ {} \ {"Theia" "main(constellation) theia.tcl"} build_Menu $submenu.messaging \ {"Orbcomm" "main(constellation) orbcomm.tcl"} build_Menu $submenu.other \ {"Aries" "main(constellation) aries.tcl"} \ {"Boeing Higgins patent" "main(constellation) us-patent-6726152-boeing.tcl"} \ {"Deligo" "main(constellation) deligo.tcl"} \ {"@contact" "main(constellation) atcontact.tcl"} \ {"GS2" "main(constellation) gs2.tcl"} \ {"Macrocell" "main(constellation) macrocell.tcl"} \ {"NUONCE" "main(constellation) nuonce.tcl"} build_Menu $submenu.tle \ {"Geosynchronous belt (TLE)" "main(constellation) geo.tle"} \ {"Brightest LEO craft (TLE)" "main(constellation) visual.tle"} } proc main(rendering_menu) {submenu} { global geomview_module if {$geomview_module == 1} { build_options_menu $submenu \ {"Real-time mode" realtime_flag} \ {} \ {"SUBMENU" "markers" "Satellite markers"} \ {} \ {"Show satellite orbits" orbits_flag} \ {"Show footprints" footprints_flag} \ {"Show coverage cones" cones_flag} \ {} \ {"Show stationary axes" axes_flag} \ {"Show equatorial plane" plane_flag} \ {"Show sunlight" sun_flag} \ {"Show star field" stars_flag} \ {} \ {"Show central body" earth_flag} \ {"Use simple Earth map" simple_earth_flag} \ {"Use detailed Earth map" fancy_earth_flag} \ {"Use generated coverage map" geomview_dynamic_texture_flag} \ {} \ {"Animate in Geomview" geomview_flag} build_options_menu $submenu.markers \ {"Sphere markers" sphere_sat_flag} \ {"Box markers" box_sat_flag} \ {"Planes markers" planes_sat_flag} \ {"Satellite markers" fancy_sat_flag} \ {} \ {"Mark satellite positions" satellites_flag} } else { build_options_menu $submenu \ {"Real-time mode" realtime_flag} } } proc main(forw_step) {} { main(stop) satellites FORW_STEP } proc main(back_step) {} { main(stop) satellites BACK_STEP } proc main(forwards) {} { global COLOR playbar satellites STOP if {("OK" == [satellites FORWARDS]) && ([winfo exists .main])} { .main.bb1.b3 configure -bg $COLOR(bg) -highlightbackground $COLOR(bg) .main.bb1.b4 configure -bg $COLOR(bg) -highlightbackground $COLOR(bg) .main.bb1.b5 configure -bg $COLOR(sbg) -highlightbackground $COLOR(sbg) } set flag $playbar set playbar 1 if {$flag == 0} { coverage(forwards) } set playbar 0 } proc main(backwards) {} { global COLOR playbar satellites STOP if {("OK" == [satellites BACKWARDS]) && ([winfo exists .main])} { .main.bb1.b3 configure -bg $COLOR(bg) -highlightbackground $COLOR(bg) .main.bb1.b4 configure -bg $COLOR(sbg) -highlightbackground $COLOR(sbg) .main.bb1.b5 configure -bg $COLOR(bg) -highlightbackground $COLOR(bg) } set flag $playbar set playbar 1 if {$flag == 0} { coverage(backwards) } set playbar 0 } proc main(stop) {} { global COLOR playbar if {("OK" == [satellites STOP]) && ([winfo exists .main])} { .main.bb1.b3 configure -bg $COLOR(sbg) -highlightbackground $COLOR(sbg) .main.bb1.b4 configure -bg $COLOR(bg) -highlightbackground $COLOR(bg) .main.bb1.b5 configure -bg $COLOR(bg) -highlightbackground $COLOR(bg) } set flag $playbar set playbar 1 if {$flag == 0} { coverage(stop) } set playbar 0 } proc main(restart) {} { main(stop) satellites RESET } proc main(exit) {} { global geomview_module fancy_earth_flag simple_earth_flag earth_flag if {$geomview_module == 1} { # turn off Earth entirely set fancy_earth_flag 0 set simple_earth_flag 0 set earth_flag 0 } satellites EXIT puts stderr "\nSaVi: thankyou for using SaVi.\n" exit } proc main(update) {} { global sun_flag # 0 shows sunlight set i 0 set n [.main.cmd.lb size] while {[satellites GET $i] != ""} { main(update_field) $i incr i } if {$n > 0} { .main.cmd.lb delete $i [expr $i+$n-1] } if {!$sun_flag} { .main.cmd.lb delete 0 } edit(update) fisheye(update) coverage(update) } proc main(update_field) {i} { set noe [satellites GET $i] set name [satellites GET_NAME $i] set id [satellites GET_ID $i] # don't display everything in results string. Increase to 299 to debug. set length 72 if {$id > 9} { incr length -1 } if {$id > 99} { incr length -1 } if {$id > 999} { incr length -1 } set line [list $id [string range $noe 0 $length] $name] # primitive, but works. regsub {\{} $line "" line regsub {\}} $line "" line regsub {\{} $line "" line regsub {\}} $line "" line .main.cmd.lb insert $i $line } proc main(show_sunlight) {} { main(update_field) 0 } proc main(hide_sunlight) {} { .main.cmd.lb delete 0 } proc main(update_one) {i} { global sun_flag main(update_field) $i .main.cmd.lb select set $i if {$sun_flag == 1} { incr i } else { incr i -1 } .main.cmd.lb delete $i } proc main(update_selection) {m} { edit(set) $m # need to update so that selected satellites are marked purple. coverage(update) fisheye(update) } proc main(unselect) {n} { global sun_flag satellites GV_BEGIN foreach arg $n { set m [expr $arg + (1 - $sun_flag)] satellites UNTAG $m } satellites GV_END main(update) } proc main(unselect_all) {} { set n [.main.cmd.lb curselection] main(unselect) $n } proc main(tag_select) {n} { global sun_flag satellites GV_BEGIN foreach arg $n { set m [expr $arg + (1 - $sun_flag)] satellites TAG $m } satellites GV_END main(update_selection) $m } proc main(tag_unselect) {n} { global sun_flag satellites GV_BEGIN foreach arg $n { set m [expr $arg + (1 - $sun_flag)] satellites UNTAG $m } satellites GV_END main(update_selection) $m } proc main(untag_all) {} { set s [.main.cmd.lb size] satellites GV_BEGIN for {set m 0} {$m <= $s} {incr m} { satellites UNTAG $m } satellites GV_END } proc main(select) {n} { main(untag_all) main(tag_select) $n } proc main(dblselect) {n} { main(select) $n edit(build) } proc main(itemselect) {n} { set s [.main.cmd.lb curselection] set found [lsearch -exact $s $n] if {$found == -1} { .main.cmd.lb select set $n main(tag_select) $n } else { .main.cmd.lb select clear $n main(tag_unselect) $n } } proc main(itemdblselect) {n} { main(itemselect) $n edit(build) } proc main(rangeselect) {n} { global sun_flag set s [.main.cmd.lb curselection] set lowest 999999 set highest 0 foreach arg $s { if {$lowest > $arg} { set lowest $arg } if {$highest < $arg} { set highest $arg } } satellites GV_BEGIN if {($lowest > $n)&&($highest > $n)} { # tag down to n from lowest for {set i $n} {$i <= $lowest} {incr i} { satellites TAG $i .main.cmd.lb select set $i } } elseif {($highest < $n)&&($lowest < $n)} { # tag up to n from highest for {set i $highest} {$i <= $n} {incr i} { satellites TAG $i .main.cmd.lb select set $i } } else { # tag between lowest and highest, covering n for {set i $lowest} {$i <= $highest} {incr i} { satellites TAG $i .main.cmd.lb select set $i } } satellites GV_END main(update_selection) [expr $n + (1 - $sun_flag)] } proc main(rangedblselect) {n} { main(rangeselect) $n edit(build) } proc main(new) {} { set nn [satellites NEW] main(update) main(select) $nn edit(build) } proc main(copy) {} { global sun_flag set n [.main.cmd.lb curselection] foreach arg $n { set m [expr $arg + (1 - $sun_flag)] set nn [satellites COPY $m] main(select) $nn } main(update) } proc main(delete) {} { global sun_flag set n [.main.cmd.lb curselection] set i 0 foreach arg $n { set m [expr $arg + (1 - $sun_flag) - $i] if {$sun_flag && ($m == 0)} { puts stderr "\nSaVi: sunlight may be hidden, but not deleted." } else { satellites DELETE $m # deleting shortens list. set i [expr $i + 1] } } main(update) coverage(update_decay) } proc main(delete_all) {} { global project_tracks_flag last_filename details_source source_comments set project_tracks_flag 0 satellites DELETE_ALL # restore sunlight at position 0. sunlight(create) set last_filename " " set details_source " " set source_comments " " details(rebuild) main(reset_title) geomview(update_texture) coverage(update_decay) main(update) } proc main(constellation) {filename} { # We could choose not to delete all satellites when loading # in an additional constellation, but since mask angle is # set for all rather than for each satellite, the result # would be very confusing coverage. Load... gets around this. satellites DELETE_ALL # restore sunlight at position 0. sunlight(create) # coverage(update_decay) main(load_file) "data/$filename" } proc main(source_file) {filename} { global coverage_angle coverage_angle_flag PI params source_comments details_source global min_transmit_altitude set coverage_angle_old $coverage_angle set min_transmit_altitude_old $min_transmit_altitude # interpret as a tcl file. Set up constants. set MU $params(Mu) set RADIUS_OF_EARTH $params(Radius) source "$filename" set block_end 1 set f [open "$filename" r] set source_comments "" while {[gets $f line] >= 0} { set line [string trim $line] if {[string index $line 0] == "\#"} { set length [string length "$line"] if {[string index $line 2] == "*"} { if {$length > 3} { set line [string range "$line" 4 $length] if {([string index $line 0] == " ")||($block_end == 1)} { set source_comments "$source_comments\n$line " set block_end 0 } else { set source_comments "$source_comments$line " } } else { set source_comments "$source_comments\n\n" } } else { set block_end 1 } } } close $f set details_source "$filename" puts stderr "\nSaVi: loaded $filename" if {$min_transmit_altitude != $min_transmit_altitude_old} { puts stderr " changed minimum transmit altitude from $min_transmit_altitude_old to $min_transmit_altitude km." } if {$coverage_angle != $coverage_angle_old} { puts stderr " changed coverage angle from $coverage_angle_old to $coverage_angle degrees." if {$coverage_angle_flag} { puts stderr " Coverage angle probably describes mask elevation." } } geomview(update_texture) details(rebuild) } proc main(load_file) {filename} { global geomview_module last_filename if {![file exists "$filename"]} { puts stderr "\nSaVi: could not find $filename" return } if {$geomview_module == 1} { satellites GV_SEND "(ui-freeze on)" } # if filename ends in ".tle" then interpret as a two-line-element file if {[string_ends "$filename" ".tle"]} { set last_filename "$filename" # tle file # if sunlight is on should really turn it off as misleading. tle_file_input "$filename" } elseif {[string_ends "$filename" ".tcl"]} { set last_filename "$filename" main(source_file) "$filename" } else { puts stderr "\nSaVi: $filename is not a recognised .tle/.tcl satellites file." puts stderr " No satellites loaded." } if {$geomview_module == 1} { geomview(update_texture) satellites GV_SEND "(ui-freeze off)" } main(title) "$filename" main(update) } savi1.6.0/tcl/load_url_tle.tcl0000644000175000017500000001421014423445060015366 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # load_url_tle.tcl # # $Id: load_url_tle.tcl 203 2023-04-28 00:46:24Z lloydwood $ proc load_url_tle(init) {} { global url_choice load_url set url_choice 0 set load_url "http://" } proc load_url_tle(build) {} { global url_choice load_url if {[eval window(raise) load_url_tle]} return set name [build_Toplevel load_url_tle] wm protocol $name WM_DELETE_WINDOW load_url_tle(dismiss) build_Title $name "Download constellation TLE set from URL..." set cmd [build_CmdFrame $name cmd] set cmda [build_StdFrame $name cmd] build_Label $cmda text "Sourced from Celestrak unless stated." build_IPopupMenu $cmda p0 "" \ url_choice load_url_tle(choice) { \ "Enter link to TLE:" \ "" \ "Iridium NEXT" \ "Iridium" \ "Globalstar" \ "Orbcomm" \ "O3b Networks" \ "OneWeb" \ "SpaceX Starlink" \ "" \ "GPS" \ "Glonass" \ "Galileo" \ "Beidou" \ "" \ "Raduga" \ "Gorizont" \ "Molniya" \ "TDRSS" \ "Cubesats" \ "" \ "Spire" \ "Swarm" \ "Planet Labs" \ "Planet Labs (from Planet Labs)" } pack $cmda.p0 -side left build_LabelEntryColumns $cmda url_path \ {lentry "" {load_url} } bind $cmda.url_path.c0.0 {load_url_tle(load) $load_url} pack $cmda -expand 1 -fill x build_Buttonbar $name dbbar \ {"Download elsets from web" {load_url_tle(load) $load_url} } \ {"Close" "load_url_tle(dismiss)"} update } proc load_url_tle(choice) {} { global url_choice load_url # sources on web for TLEs: # http://celestrak.com/NORAD/elements/ # http://www.idb.com.au/joomla/index.php # # Celestrak's own 3D TLE web viewer (globe icons on elements webpage) # is more impressive than SaVi. # we cannot yet fully support https: in Tcl. set load_url "http://" switch $url_choice { 0 { # already set } 1 { # divider } 2 { set load_url "http://celestrak.org/NORAD/elements/iridium-NEXT.txt" } 3 { set load_url "http://celestrak.org/NORAD/elements/iridium.txt" } 4 { set load_url "http://celestrak.org/NORAD/elements/globalstar.txt" } 5 { set load_url "http://celestrak.org/NORAD/elements/orbcomm.txt" } 6 { set load_url "http://celestrak.org/NORAD/elements/other-comm.txt" } 7 { set load_url "http://celestrak.org/NORAD/elements/oneweb.txt" } 8 { set load_url "http://celestrak.org/NORAD/elements/starlink.txt" } 9 { # divider } 10 { set load_url "http://celestrak.org/NORAD/elements/gps-ops.txt" } 11 { set load_url "http://celestrak.org/NORAD/elements/glo-ops.txt" } 12 { set load_url "http://celestrak.org/NORAD/elements/galileo.txt" } 13 { set load_url "http://celestrak.org/NORAD/elements/beidou.txt" } 14 { # divider } 15 { set load_url "http://celestrak.org/NORAD/elements/raduga.txt" } 16 { set load_url "http://celestrak.org/NORAD/elements/gorizont.txt" } 17 { set load_url "http://celestrak.org/NORAD/elements/molniya.txt" } 18 { set load_url "http://celestrak.org/NORAD/elements/tdrss.txt" } 19 { set load_url "http://celestrak.org/NORAD/elements/cubesat.txt" } 20 { # divider } 21 { set load_url "http://celestrak.org/NORAD/elements/spire.txt" } 22 { set load_url "http://celestrak.org/NORAD/elements/swarm.txt" } 23 { set load_url "http://celestrak.org/NORAD/elements/planet.txt" } 24 { set load_url "https://ephemerides.planet-labs.com/planet_mc.tle" } } } proc load_url_tle(lynx) {url localfile} { set lynx "lynx -dump" if {[catch {eval exec $lynx $url > $localfile}]} { puts stderr "\nSaVi: could not run $lynx successfully. Is $lynx installed?" } else { puts stderr "\nSaVi: lynx download of $url" } } proc load_url_tle(load) {url} { # https support requires third-party tls package by Matt Newman # see http://wiki.tcl.tk/1475 and http://wiki.tcl.tk/2630 set filename [file tail $url] # we append .tle because SaVi insists that tle files end .tle set localfile "/tmp/$filename.tle" set n 1 while {[file exists $localfile]} { set localfile "/tmp/$filename-$n.tle" incr n } if {[catch {package require http}]} { puts stderr "\nSaVi: Tcl http package not found." set no_http_package 1 } else { set no_http_package 0 } set a [string first http: $url] if {$no_http_package || ($a < 0)} { load_url_tle(lynx) $url $localfile } else { set token [http::geturl $url -binary 1] if {[string compare [::http::code $token] "HTTP/1.1 200 OK"]} { puts stderr "\nSaVi: Tcl did not get $url" load_url_tle(lynx) $url $localfile } else { set fo [open $localfile w] fconfigure $fo -translation binary puts -nonewline $fo [http::data $token] close $fo } ::http::cleanup $token } puts stderr "\nSaVi: downloaded \"$url\" to \"$localfile\"" puts stderr "\nSaVi: replacing any existing satellites so that time 0 is consistent." main(delete_all) main(load_file) $localfile } proc load_url_tle(dismiss) {} { destroy .load_url_tle } proc load_url_tle(cancel) {} { load_url_tle(dismiss) } savi1.6.0/tcl/init.tcl0000644000175000017500000002704314423445060013674 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # init.tcl # # $Id: init.tcl 147 2020-01-18 02:44:34Z lloydwood $ proc geomview_init {} { global satellites_flag box_sat_flag planes_sat_flag fancy_sat_flag \ sphere_sat_flag fast_marker_sat_flag cones_flag footprints_flag \ orbits_flag axes_flag stars_flag \ earth_flag simple_earth_flag fancy_earth_flag texture_flag \ geomview_flag geomview_dynamic_texture_flag COLOR satellites GV_BEGIN set COLOR(geomview) \#000000 trace variable satellites_flag w flag_change trace variable box_sat_flag w flag_change trace variable planes_sat_flag w flag_change trace variable fancy_sat_flag w flag_change trace variable sphere_sat_flag w flag_change trace variable fast_marker_sat_flag w flag_change trace variable orbits_flag w flag_change trace variable footprints_flag w flag_change trace variable cones_flag w flag_change trace variable axes_flag w flag_change trace variable stars_flag w flag_change trace variable earth_flag w flag_change trace variable simple_earth_flag w flag_change trace variable fancy_earth_flag w flag_change trace variable texture_flag w flag_change trace variable geomview_dynamic_texture_flag w flag_change trace variable geomview_flag w flag_change set satellites_flag 1 set fast_marker_sat_flag 1 set box_sat_flag 0 set planes_sat_flag 0 set fancy_sat_flag 0 set sphere_sat_flag 0 set orbits_flag 1 set footprints_flag 0 set cones_flag 0 set axes_flag 1 set stars_flag 0 set earth_flag 1 set simple_earth_flag 1 set fancy_earth_flag 0 set texture_flag 1 set geomview_dynamic_texture_flag 0 set geomview_flag 1 satellites GV_END } proc app_init {} { global TITLE FONT COLOR PLATFORM global last_filename source_comments details_source global user_file_dir helpfile_text helpfile_name geomview_module global realtime_flag sun_flag playbar delta_t splash_about rendering_size global plane_flag global modifier modifier_indicator # env is unused. global PI set PI 3.14159265358979324 # delay per simulation interval set delta_t 60.0 set playbar 0 # set colors for windows if {[string equal [tk windowingsystem] aqua]} { # Aqua Tcl on Mac OS X - white # can't control menu highlights or button colors as you'd expect. # instead, -highlightbackground is needed to color the frame # around the edges and corners of the button. set COLOR(bg) #fff set COLOR(abg) #67f set COLOR(sbg) #33f set modifier "Command" set modifier_indicator "Command" set PLATFORM 1 } elseif {[string equal [tk windowingsystem] win32]||[file exists "/proc/cygdrive"]} { # Tcl on Windows - grey to match XP. Vary to suit interface. set COLOR(bg) #d4d0c8 set COLOR(abg) #bbb set COLOR(sbg) #aaa set modifier "Control" set modifier_indicator "Ctrl" set PLATFORM 2 } elseif {[file exists /usr/bsd ]&&[file exists /usr/sbin ]} { # Tcl on IRIX - different grey set COLOR(bg) #c1c1c1 set COLOR(abg) #bbb set COLOR(sbg) #aaa set modifier "Control" set modifier_indicator "Ctrl" set PLATFORM 3 } else { # Tcl on Unix - shades of blue set COLOR(bg) #acf set COLOR(abg) #67f set COLOR(sbg) #33f set modifier "Control" set modifier_indicator "Ctrl" set PLATFORM 0 } set COLOR(entry) white set FONT(button) -Adobe-Helvetica-Bold-R-Normal--*-120-* set FONT(label) -Adobe-Helvetica-Medium-R-Normal--*-120-* set FONT(fixed) -Adobe-Courier-Medium-R-Normal--*-120-* # set colors everywhere tk_setPalette background $COLOR(bg) \ activeBackground $COLOR(abg) selectBackground $COLOR(abg) # set directory for saving files to user's home directory set user_file_dir "~/" # close the default toplevel window wm withdraw . # set up string for title bar set TITLE "SaVi" if {$geomview_module == 1} { geomview_init } # Should we show the about box as a splash screen? if {$splash_about == 1} { about(build) } set realtime_flag 0 trace variable realtime_flag w flag_change # default high-resolution rendering size set rendering_size(x) 4000 set rendering_size(y) 4000 set helpfile_name "" set helpfile_text "" set source_comments "" set details_source "" trace variable plane_flag w flag_change set plane_flag 0 set sun_flag 0 trace variable sun_flag w flag_change trace variable realtime_flag w flag_change set realtime_flag 0 # load in fake sun as first satellite (zero) sunlight(create) equator(init) coverage(init) fisheye(init) load_url_tle(init) # build top window set last_filename "" main(build) } proc flag_change {name element op} { global geomview_module box_sat_flag planes_sat_flag fancy_sat_flag \ sphere_sat_flag satellites_flag no_access_flag sun_flag \ simple_earth_flag fancy_earth_flag plane_flag upvar #0 $name flag if {$geomview_module == 1} { set not_geomview_flag 0 if {$name == "satellites_flag"} { if {$flag == 1} {satellites SATELLITES_ON} else {satellites SATELLITES_OFF} } elseif {$name == "box_sat_flag"} { if {$flag == 1} { satellites BOX_SAT_ON set fast_marker_sat_flag 0 set planes_sat_flag 0 set fancy_sat_flag 0 set sphere_sat_flag 0 } else {satellites BOX_SAT_OFF} } elseif {$name == "planes_sat_flag"} { if {$flag == 1} { satellites PLANES_SAT_ON set fast_marker_sat_flag 0 set box_sat_flag 0 set fancy_sat_flag 0 set sphere_sat_flag 0 } else {satellites PLANES_SAT_OFF} } elseif {$name == "fancy_sat_flag"} { if {$flag == 1} { satellites FANCY_SAT_ON set fast_marker_sat_flag 0 set box_sat_flag 0 set planes_sat_flag 0 set sphere_sat_flag 0 } else {satellites FANCY_SAT_OFF} } elseif {$name == "sphere_sat_flag"} { if {$flag == 1} { satellites SPHERE_SAT_ON set fast_marker_sat_flag 0 set box_sat_flag 0 set planes_sat_flag 0 set fancy_sat_flag 0 } else {satellites SPHERE_SAT_OFF} } elseif {$name == "fast_marker_sat_flag"} { if {$flag == 1} { satellites FAST_MARKER_SAT_ON set sphere_sat_flag 0 set box_sat_flag 0 set planes_sat_flag 0 set fancy_sat_flag 0 } else {satellites FAST_MARKER_SAT_OFF} } elseif {$name == "orbits_flag"} { if {$flag == 1} {satellites ORBITS_ON} else {satellites ORBITS_OFF} } elseif {$name == "footprints_flag"} { if {$flag == 1} {satellites FOOTPRINTS_ON} else {satellites FOOTPRINTS_OFF} } elseif {$name == "cones_flag"} { if {$flag == 1} {satellites CONES_ON} else {satellites CONES_OFF} } elseif {$name == "axes_flag"} { if {$flag == 1} {satellites AXES_ON} else {satellites AXES_OFF} } elseif {$name == "stars_flag"} { if {$flag == 1} {satellites STARS_ON} else {satellites STARS_OFF} } elseif {$name == "earth_flag"} { if {$flag == 1} {satellites EARTH_ON} else {satellites EARTH_OFF} } elseif {$name == "simple_earth_flag"} { if {$flag == 1} { satellites SIMPLE_EARTH_ON set fancy_earth_flag 0 } else {satellites SIMPLE_EARTH_OFF} } elseif {$name == "fancy_earth_flag"} { if {$flag == 1} { satellites FANCY_EARTH_ON set simple_earth_flag 0 } else {satellites FANCY_EARTH_OFF} } elseif {$name == "texture_flag"} { if {$flag == 1} {satellites TEXTURE_ON} else {satellites TEXTURE_OFF} } elseif {$name == "geomview_flag"} { if {$flag == 1} {satellites GEOMVIEW_ON} else {satellites GEOMVIEW_OFF} } elseif {$name == "geomview_dynamic_texture_flag"} { if {$flag == 1} { # open coverage window if not open coverage(build) satellites GEOMVIEW_DYNAMIC_TEXTURE_ON } else { satellites GEOMVIEW_DYNAMIC_TEXTURE_OFF } } else { set not_geomview_flag 1 } if {$not_geomview_flag == 0} return } if {$name == "realtime_flag"} { if {$flag == 1} {satellites REALTIME_ON} else {satellites REALTIME_OFF} } elseif {$name == "coverage_flag"} { if {$flag == 1} {satellites COVERAGE_ON} else {satellites COVERAGE_OFF} if [winfo exists .coverage] coverage(update_wells) } elseif {$name == "no_access_flag"} { if {$flag == 1} { satellites NO_ACCESS_ON } else { if {$sun_flag == 1} { set sun_flag 0 } satellites NO_ACCESS_OFF } if [winfo exists .coverage] coverage(update_wells) } elseif {$name == "print_access_flag"} { if {$flag == 1} {satellites PRINT_ACCESS_ON} else {satellites PRINT_ACCESS_OFF} } elseif {$name == "map_flag"} { if {$flag == 1} { satellites MAP_ON } else { satellites MAP_OFF } } elseif {$name == "plane_flag"} { if {$flag == 1} { satellites PLANE 0.0 0.0 equator(create) fisheye(parallels_show) fisheye(update) } else { satellites PLANE_OFF fisheye(parallels_hide) fisheye(update) } } elseif {$name == "fisheye_reverse_view_flag"} { if {$flag == 1} {satellites FISHEYE_REVERSE_VIEW_ON} else {satellites FISHEYE_REVERSE_VIEW_OFF} } elseif {$name == "fisheye_print_inview_flag"} { if {$flag == 1} {satellites FISHEYE_PRINT_INVIEW_ON} else {satellites FISHEYE_PRINT_INVIEW_OFF} } elseif {$name == "tracks_flag"} { if {$flag == 1} {satellites TRACKS_ON} else {satellites TRACKS_OFF} } elseif {$name == "project_tracks_flag"} { if {$flag == 1} {satellites PROJECT_TRACKS_ON} else {satellites PROJECT_TRACKS_OFF} } elseif {$name == "coverage_proj_flag"} { if {$flag == 1} {satellites COVERAGE_PROJ 1} else {satellites COVERAGE_PROJ 0} } elseif {$name == "coverage_angle_flag"} { if {$flag == 1} {satellites COVERAGE_ANGLE_TYPE 1} else {satellites COVERAGE_ANGLE_TYPE 0} } elseif {$name == "fisheye_flag"} { if {$flag == 1} {satellites FISHEYE_ON} else {satellites FISHEYE_OFF} } elseif {$name == "fisheye_labels_flag"} { if {$flag == 1} {satellites FISHEYE_LABELS_ON} else {satellites FISHEYE_LABELS_OFF} } elseif {$name == "fisheye_names_flag"} { if {$flag == 1} {satellites FISHEYE_NAMES_ON} else {satellites FISHEYE_NAMES_OFF} } elseif {$name == "fisheye_viewpoint_flag"} { if {$flag == 1} {satellites FISHEYE_VIEWPOINT_ON} else {satellites FISHEYE_VIEWPOINT_OFF} } elseif {$name == "fisheye_numbers_flag"} { if {$flag == 1} {satellites FISHEYE_NUMBERS_ON} else {satellites FISHEYE_NUMBERS_OFF} } elseif {$name == "fisheye_times_flag"} { if {$flag == 1} {satellites FISHEYE_TIMES_ON} else {satellites FISHEYE_TIMES_OFF} } elseif {$name == "sun_flag"} { if {$flag == 1} { satellites SUN_ON set no_access_flag 1 main(show_sunlight) coverage(labels_show_sunlight) coverage(update) } else { satellites SUN_OFF main(hide_sunlight) coverage(labels_show_decay) coverage(update_decay) } } else { puts "Unrecognized flag: $name" } } savi1.6.0/tcl/random.tcl0000644000175000017500000000533014423445060014204 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # From Mark Eichin, Cygnus Support. # Souped up a bit by Stuart Levy # http://www.cygnus.com/~eichin/random-tcl.html # now try: # http://www.mit.edu/afs/sipb/project/eichin/common/public_html/random-tcl.html # # $Id: random.tcl 8 2019-01-24 04:33:00Z lloydwood $ proc rand(raw) {} { global rand_seed # per Knuth 3.6: # 65277 mod 8 = 5 (since 65536 is a power of 2) # c/m = .5-(1/6)\sqrt{3} # c = 0.21132*m = 13849, and should be odd. set rand_seed [expr (65277*$rand_seed+13849)%65536] set rand_seed [expr ($rand_seed+65536)%65536] return $rand_seed } # [rand base] returns a random number in range 0..(base-1). # Returns integer or floating-point according to the type of "base". # With no parameter, [rand] returns floating-point value in range 0..1. proc rand {{base 1.0}} { set rr [rand(raw)] return [expr ($rr*$base)/65536] } # Seed random generator. proc srand {{seed ""}} { if {$seed == ""} { # Initial seed from process-id and access-time of UNIX current dir set seed [expr [pid] + [file atime .]] } if {$seed != int($seed)} { set seed [expr int(($seed-int($seed))*65536)] } global rand_seed set rand_seed [expr $seed%65536] } srand # Produce an ordered list of N values spaced at uniform-randomly-distributed # intervals over range 0..Max proc randlist {N {Max 1.0}} { set sum 0 for {set i 0} {$i < $N} {incr i} { set v [rand 1.0] set sum [expr $sum+$v] lappend vals $sum } set scale [expr $Max/$sum] if {[string match {*[.eE]*} $Max]} { foreach v $vals { lappend result [expr $v*$scale] } } else { foreach v $vals { lappend result [expr int($v*$scale)] } } lrange $result 0 [expr $N-2] } # return a random RRGGBB color value # This isn't perceptually weighted. proc random_color {} { # set color_range [expr 256*256*256.0] # set random_col [expr int([rand $color_range])] # only seems to generate tasteful autumn shades set rr [rand 255] set gg [rand 255] set bb [rand 255] set random_col [expr int(65536*$rr + 256*$gg + $bb)] return $random_col } savi1.6.0/tcl/edit.tcl0000644000175000017500000001264014423445060013653 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # edit.tcl # # $Id: edit.tcl 140 2020-01-06 05:09:39Z lloydwood $ proc edit(build) {} { global edit_oe geomview_module if {[eval window(raise) edit]} return set edit_oe(OK) 0 set name [build_Toplevel edit] wm protocol $name WM_DELETE_WINDOW edit(dismiss) build_Title $name "Edit satellite parameters (press return to save)" set cmd [build_CmdFrame $name cmd] build_LabelEntryColumns $cmd lename \ {lentry "Satellite name" edit_oe(name)} bind $cmd.lename.c0.0 edit(oe) bind $cmd.lename.c0.0 edit(oe) build_LabelEntryColumns $cmd le0 \ {text " " {"semi-major axis (km)" \ "eccentricity e" \ "inclination (deg)" \ "long. asc. node (deg)" \ "arg. of periapsis (deg)" \ "time to periapsis (s)"} } \ {dentry "Orbital elements" {edit_oe(a) edit_oe(e) edit_oe(i) \ edit_oe(Omega) edit_oe(omega) \ edit_oe(T)} } \ {slider " " { edit(slide_a) edit(slide_e) edit(slide_i) \ edit(slide_O) edit(slide_o) edit(slide_T)} } \ {ilabel {} {edit_oe(Period) edit_oe(Nodal_precession) \ edit_oe(Apsidal_rotation) edit_oe(Apoapsis_altitude) \ edit_oe(Periapsis_altitude)} } \ {text {} {"period (minutes)" "nodal precession (deg/day)" "apsidal rotation (deg/day)" "apoapsis altitude (km)" "periapsis altitude (km)"} } for {set i 0} {$i < 6} {incr i} { bind $cmd.le0.c1.$i edit(oe) bind $cmd.le0.c1.$i edit(oe) } if ($geomview_module) { build_HOptionslist $cmd le2 edit(oe) \ {"Show satellite and groundtrack" edit_oe(disp_satellite)} \ {"Show coverage area" edit_oe(disp_coverage)} \ {"Show orbit" edit_oe(disp_orbit)} } else { build_HOptionslist $cmd le2 edit(oe) \ {"Show satellite and groundtrack" edit_oe(disp_satellite)} \ {"Show coverage area" edit_oe(disp_coverage)} \ } pack $cmd -fill both -expand 1 build_DismissButtonbar $name dbbar edit(dismiss) update set edit_oe(OK) 1 } proc edit(dismiss) {} { destroy .edit } proc edit(oe) {} { global edit_oe if {$edit_oe(n) < 0} { return } # could make edited satellite more visible by moving Geomview plane # to its plane of orbit # satellites PLANE $edit_oe(i) $edit_oe(Omega) # but this should really be set via an $edit_oe(disp_plane) option. set m $edit_oe(n) satellites NAME $m "$edit_oe(name)" satellites SET $m $edit_oe(a) $edit_oe(e) $edit_oe(i) \ $edit_oe(Omega) $edit_oe(omega) $edit_oe(T) $edit_oe(disp_satellite) \ $edit_oe(disp_orbit) $edit_oe(disp_coverage) edit(set) $m main(update_one) $m coverage(update) fisheye(update) } proc edit(slide_a) v { global edit_oe if {$edit_oe(OK) > 0} { set edit_oe(a) [expr $v*300+6400.0] edit(oe) } } proc edit(slide_e) v { global edit_oe if {$edit_oe(OK) > 0} { # Don't want slider to allow eccentricity > 0.85 # as this shows movement of orbit over time. set edit_oe(e) [expr $v/125.0] edit(oe) } } proc edit(slide_i) v { global edit_oe if {$edit_oe(OK) > 0} { set edit_oe(i) [expr $v/100.0*180.0] edit(oe) } } proc edit(slide_O) v { global edit_oe if {$edit_oe(OK) > 0} { set edit_oe(Omega) [expr $v/100.0*360.0] edit(oe) } } proc edit(slide_o) v { global edit_oe if {$edit_oe(OK) > 0} { set edit_oe(omega) [expr $v/100.0*180.0] edit(oe) } } proc edit(slide_T) v { global edit_oe if {$edit_oe(OK) > 0} { set edit_oe(T) [expr $v/0.01] edit(oe) } } proc edit(update) {} { global sun_flag set n [.main.cmd.lb curselection] if {[llength $n] == 0} { edit(reset) } else { set m [expr $n + (1 - $sun_flag)] edit(set) [lindex $m 0] edit(oe) } } proc edit(reset) {} { global edit_oe set edit_oe(n) -1 set edit_oe(a) "" set edit_oe(e) "" set edit_oe(i) "" set edit_oe(Omega) "" set edit_oe(omega) "" set edit_oe(T) "" set edit_oe(disp_satellite) 1 set edit_oe(disp_orbit) 1 set edit_oe(disp_coverage) 1 set edit_oe(name) "" } proc edit(set) n { global edit_oe set noe [satellites GET $n] if {$noe == ""} { edit(reset) } else { set edit_oe(n) $n set edit_oe(a) [lindex $noe 0] set edit_oe(e) [lindex $noe 1] set edit_oe(i) [lindex $noe 2] set edit_oe(Omega) [lindex $noe 3] set edit_oe(omega) [lindex $noe 4] set edit_oe(T) [lindex $noe 5] set edit_oe(Period) [lindex $noe 6] set edit_oe(Nodal_precession) [lindex $noe 7] set edit_oe(Apsidal_rotation) [lindex $noe 8] set edit_oe(Apoapsis_altitude) [lindex $noe 9] set edit_oe(Periapsis_altitude) [lindex $noe 10] set edit_oe(disp_satellite) [lindex $noe 11] set edit_oe(disp_orbit) [lindex $noe 12] set edit_oe(disp_coverage) [lindex $noe 13] set edit_oe(name) [eval satellites GET_NAME $n] } } savi1.6.0/tcl/params.tcl0000644000175000017500000000535614423445060014217 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # params.tcl # # $Id: params.tcl 198 2023-04-16 08:54:04Z lloydwood $ proc params(build) {} { global PI params tparams rotation_period if {[eval window(raise) params]} return set name [build_Toplevel params] wm protocol $name WM_DELETE_WINDOW params(dismiss) build_Title $name "Simulation constants" set cmd [build_StdFrame $name cmd] set cmda [build_StdFrame $cmd a] # params(orbital_period) is around the Sun. # We show length of day as it is easier to understand. set rotation_period [expr 2.0*$PI/$params(Omega)] build_LabelEntryColumns $cmda le0 \ {text " " {"Radius (km)" "Rotational period (s)" "Tilt (degrees)"} } \ {dentry "Central body" {tparams(Radius) rotation_period tparams(tilt)} } pack $cmda -side left -expand 1 set cmdb [build_StdFrame $cmd b] build_LabelEntryColumns $cmdb le1 \ {text " " {"Mu (km^3/s^2)" "Oblateness (J2)"} } \ {dentry "Gravitational model" {tparams(Mu) tparams(J2) } } pack $cmdb -side right -expand 1 pack $cmd build_DismissButtonbar $name dbbar "params(dismiss)" \ {"Reset to default" params(reset)} \ {"Cancel" params(cancel)} \ {"Apply" params(apply)} update # fill in the boxes params(cancel) } proc params(dismiss) {} { destroy .params params(cancel) } proc params(apply) {} { global PI params tparams rotation_period set inds [array names tparams] foreach ind $inds { set params($ind) $tparams($ind) } # Omega is definitive, we compute from display set params(Omega) [expr 2.0*$PI/$rotation_period] # now update other panels if necessary edit(update) } proc params(cancel) {} { global PI params tparams rotation_period # when inheriting all params, without messing for the user interface, # this mapping code is useful. set inds [array names tparams] foreach ind $inds { set tparams($ind) $params($ind) } # Omega is definitive, we return to display set rotation_period [expr 2.0*$PI/$params(Omega) ] } proc params(reset) {} { satellites RESET_PARAMS params(cancel) } savi1.6.0/tcl/Makefile0000644000175000017500000000214314423445060013657 0ustar lloydlloyd# # Makefile - SaVi tcl directory. Run top-level Makefile instead. # # $Id: Makefile 141 2020-01-08 05:59:21Z lloydwood $ SHELL = /bin/sh RM = /bin/rm -f TCL_SRCS = init.tcl main.tcl utils.tcl load.tcl save.tcl coverage_frames.tcl \ coverage.tcl coverage_size.tcl edit.tcl fisheye.tcl params.tcl \ geomview.tcl random.tcl about.tcl oe.tcl constellations.tcl \ no_frames.tcl snapshot.tcl rosette.tcl star.tcl empty.tcl \ sunlight.tcl equator.tcl details.tcl helpfile.tcl \ load_url_tle.tcl TCLSH = tclsh # FreeBSD will require this uncommented # TCLSH = tclsh8.5 # older Cygwin and Insight Tcl may require this uncommented # TCLSH = cygtclsh80.exe MKINDEX = mkindex.tcl OTHER_SRCS = $(TCL_SRCS) tclIndex CLEAN_FILES = $(MKINDEX) tclIndex all: buildtclIndex buildtclIndex: $(MKINDEX) $(TCL_SRCS) $(TCLSH) $(MKINDEX) $(MKINDEX): Makefile echo "auto_mkindex . $(TCL_SRCS)" > $(MKINDEX) tarfilelist: @srcs="Makefile $(OTHER_SRCS) lib" ; \ for i in $$srcs ; do \ echo "$(CURRENT_DIR)/$$i" >> $(TOP)/fileslist ; \ done clean: $(RM) *~ $(CLEAN_FILES) savi1.6.0/tcl/coverage_size.tcl0000644000175000017500000000406714423445060015557 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # coverage_size.tcl # # $Id: coverage_size.tcl 67 2019-08-12 10:03:05Z lloydwood $ proc coverage_size(build) {} { global IM_H if {[eval window(raise) coverage_size]} return set name [build_Toplevel coverage_size] wm protocol $name WM_DELETE_WINDOW coverage_size(dismiss) build_Title $name "Choose coverage size..." set cmd [build_CmdFrame $name cmd] set cmda [build_StdFrame $name cmd] set size $IM_H build_LabelEntryColumns $cmda colors \ {ientry "Vertical height, up to 4096 pixels.\nLarger is slower, but provides more detail in Geomview.\nContinents are not drawn in the Coverage panel." {size}} bind $cmda.colors.c0.0 {coverage_size(set) $size} bind $cmda.colors.c0.0 {coverage_size(set) $size} pack $cmda -expand 1 -fill x build_Buttonbar $name dbbar \ {"Set coverage map size" "coverage_size(set) $size"} \ {"Cancel" "coverage_size(dismiss)"} update } proc coverage_size(set) {size} { global IM_H IM_W if {$size == $IM_H} return if {($size < 0) || ($size > 5000)} return coverage(map_hide) set IM_H $size set IM_W [expr $IM_H * 2] satellites COVERAGE_MAP_OFF satellites COVERAGE_MAP_ON coverage_size(dismiss) coverage(map_show) coverage(update) } proc coverage_size(dismiss) {} { destroy .coverage_size } proc coverage_size(cancel) {} { coverage_size(dismiss) } savi1.6.0/tcl/about.tcl0000644000175000017500000000477014423445060014045 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # about.tcl # $Id: about.tcl 194 2023-04-02 08:44:34Z lloydwood $ proc about(build) {} { global env debug #environment variables get used here. if {[eval window(raise) about]} return set name [build_Toplevel about] set package_names "" if {$debug > 0} { set package_names [eval package names] } wm protocol $name WM_DELETE_WINDOW about(dismiss) build_Title $name "about SaVi - satellite constellation visualization" build_DismissButtonbar $name dbbar about(dismiss) \ {"Copyright details..." "helpfile(build) COPYRIGHT"} set cmd [build_CmdFrame $name cmd] set logo [canvas $cmd.logo -width 150 -height 75] image create photo graphic -file "maps/savi-logo.gif" $logo create image 75 0 -image graphic -anchor n pack $logo build_Label $cmd l1 "Satellite constellation simulation and Visualization" $cmd.l1.label configure -font *-times-medium-i-normal--*-140-*-*-*-*-*-* \ -fg blue pack $cmd.l1 -anchor n -ipadx 15m -ipady 2m set SAVI $env(SAVI) build_Label $cmd l2 \ "Visit the SaVi website at: http://savi.sourceforge.net/ A user manual is in SaVi's manual/ directory. Look at: $SAVI/manual/index.html Originally created at The Geometry Center by Patrick Worfolk and Robert Thurman. Enhanced and maintained by Lloyd Wood. SaVi is free software. You may redistribute SaVi and/or modify SaVi only under the terms that are given in the COPYRIGHT, which can be read by pressing the button below. Copyright (c) 2001-2023 by Lloyd Wood. Copyright (c) 1995-1997 by The Geometry Center http://www.geom.uiuc.edu/~worfolk/SaVi/ [satellites VERSION] SaVi is using Tcl/Tk [info patchlevel] and obeyed the launch command: [satellites COMMAND_LINE] $package_names " pack $cmd.l2 -anchor n -ipadx 15m -ipady 2m pack $cmd -expand 1 -fill both } proc about(dismiss) {} { destroy .about } savi1.6.0/tcl/snapshot.tcl0000644000175000017500000000563414423445060014572 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # large_snapshot.tcl # # $Id: snapshot.tcl 140 2020-01-06 05:09:39Z lloydwood $ proc snapshot(build) {} { global rendering_size if {[eval window(raise) snapshot]} return set name [build_Toplevel snapshot] wm protocol $name WM_DELETE_WINDOW snapshot(dismiss) build_Title $name "Choose size of snapshot to save..." set cmd [build_CmdFrame $name cmd] build_LabelEntryColumns $cmd x \ {ientry "pixels across (x)" rendering_size(x)} build_LabelEntryColumns $cmd y \ {ientry "pixels down (y)" rendering_size(y)} bind $cmd.x.c0 "snapshot(save)" bind $cmd.y.c0 "snapshot(save)" pack $cmd -fill both -expand 1 build_Buttonbar $name dbbar \ {"Save snapshot" "snapshot(save)"} \ {"Cancel" "snapshot(dismiss)"} update } proc snapshot(dismiss) {} { destroy .snapshot } proc snapshot(save) {} { global footprints_flag texture_flag geomview_dynamic_texture_flag global fast_marker_sat_flag rendering_size user_file_dir snapshot(dismiss) set types { {"SaVi high-quality rendering" {.ppm} } } set filename [tk_getSaveFile -initialdir "$user_file_dir" -filetypes $types \ -title "SaVi: save rendering to folder" ] if {"$filename" == ""} return set filename [save(extension) "$filename" ppm] set footprints_on 0 set texture_off 0 set marker_off 0 geomview(begin) # texturemapping doesn't appear in software snapshot, # so coverage footprints substitute. if {($texture_flag == 1) && ($geomview_dynamic_texture_flag == 1)} { set texture_flag 0 set texture_off 0 if {$footprints_flag == 0} { set footprints_flag 1 set footprints_on 1 } } # marker blobs are too small; spheres scales. if {$fast_marker_sat_flag == 1} { set fast_marker_sat_flag 0 set marker_off 1 } # change to white for print geomview(puts) "(backcolor focus 1 1 1)" geomview(puts) "(snapshot focus \"$filename\" ppm $rendering_size(x) $rendering_size(y))" # change back to current color geomview(set_background_color) if {$marker_off == 1} { set fast_marker_sat_flag 1 } if {$footprints_on == 1} { set footprints_flag 0 } if {$texture_off == 1} { set texture_flag 1 } geomview(end) } savi1.6.0/tcl/details.tcl0000644000175000017500000000407214423445060014353 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # details.tcl # $Id: details.tcl 161 2020-02-06 10:56:52Z lloydwood $ proc details(build) {} { global last_filename source_comments comments_text comments_file details_source env if {[eval window(raise) details]} return set name [build_Toplevel details] wm protocol $name WM_DELETE_WINDOW details(dismiss) build_Title $name "details of the loaded constellation" build_DismissButtonbar $name dbbar details(dismiss) \ {"View source..." "helpfile(build) $details_source"} \ {"Help..." "helpfile(build) README"} set cmd [build_CmdFrame $name cmd] build_Label $cmd on "Comments on $last_filename" set comments_file $cmd.on $comments_file.label configure -font *-times-medium-i-normal--*-140-*-*-*-*-*-* \ -fg blue set comments_text [build_Scrollingtext $cmd text 50 10] set SAVI $env(SAVI) $comments_text insert end $source_comments $comments_text insert end "\n\n\nThis window describes details of the currently loaded constellation. This window can be closed, and later reopened from the Help menu.\n\nFurther details are in the constellation scripts that are present in the $SAVI/data directory. View a script by pressing the View Source... button.\n\n" pack $cmd.text -side left -anchor w -ipadx 15m -ipady 2m pack $cmd -anchor w -expand 1 -fill both } proc details(dismiss) {} { destroy .details } proc details(rebuild) {} { details(dismiss) details(build) } savi1.6.0/tcl/oe.tcl0000644000175000017500000000154014423445060013326 0ustar lloydlloyd# ###################################################### # # SaVi by Lloyd Wood (lloydwood@users.sourceforge.net), # Patrick Worfolk (worfolk@alum.mit.edu) and # Robert Thurman. # # Copyright (c) 1997 by The Geometry Center. # Also Copyright (c) 2017 by Lloyd Wood. # # This file is part of SaVi. SaVi is free software; # you can redistribute it and/or modify it only under # the terms given in the file COPYRIGHT which you should # have received along with this file. SaVi may be # obtained from: # http://savi.sourceforge.net/ # http://www.geom.uiuc.edu/locate/SaVi # ###################################################### # # oe.tcl # # Procedures for computing with orbital elements # # $Id: oe.tcl 8 2019-01-24 04:33:00Z lloydwood $ proc oe_to_period {a mu} { global PI set period [expr 2*$PI*pow($a,1.5)/sqrt($mu)] } savi1.6.0/configure0000755000175000017500000000612414423445060013347 0ustar lloydlloyd#! /bin/sh VERSION="savi1.6.0" echo "Please read the $VERSION/README file." echo ARCH=unknown if [ -f /vmlinuz -o -f /boot/vmlinuz ]; then ARCH=linux NAME=Linux if [ -f /etc/debian_version ]; then ARCH=ubuntu NAME="Debian/Ubuntu variant" fi elif [ -d /devices ]; then ARCH=sun NAME=Solaris elif [ -d /usr/bsd -a -d /usr/sbin ]; then ARCH=irix NAME="SGI IRIX" elif [ -d /cygdrive ]; then ARCH=cygwin NAME="Cygwin on Windows" elif [ -d /System ]; then ARCH=macosx NAME="Mac OS X" elif [ -d /sys/boot ]; then ARCH=freebsd NAME=FreeBSD fi if [ "${ARCH}" = unknown ]; then echo "This system isn't familiar. You could try building SaVi with just:" echo " cd $VERSION; make; ./savi" echo "You may need to edit the generic $VERSION/src/Makefile_defs_ to build." # set for citing with Makefile_defs_ ARCH="" else echo "This appears to have a $NAME operating system installed." echo "A brief getting-started summary is given here:" echo " cd $VERSION; make ARCH=$ARCH; ./savi" echo "You may need to edit $VERSION/src/Makefile_defs_$ARCH to build." echo echo "Replace ARCH value with the name of another platform" echo "(linux, ubuntu, freebsd, cygwin, macosx, sun or irix) if needed." fi if [ "${ARCH}" = macosx ]; then echo echo "Please read the BUGS file for Mac-specific problems and workarounds!" if [ -d /Library/Frameworks/Tcl.framework/Headers -a -d /Library/Frameworks/Tk.framework/Headers ]; then echo "ActiveTcl appears to already be installed, and can be used." echo "Edit src/Makefile_defs_macosx before compiling SaVi." else echo "ActiveTcl can be installed to improve Tcl/Tk reliability." echo "Read and edit src/Makefile_defs_macosx before compiling SaVi." fi echo "10.5 Leopard users may need to launch savi with: savi -redrawn-menus" elif [ "${ARCH}" = freebsd ]; then echo "FreeBSD users may need to edit savi-dev/tcl/Makefile where commented." fi if [ -f /usr/include/zlib.h -o -f /usr/local/include/zlib.h ]; then if [ -f /usr/lib/libz.a -o -f /usr/local/lib/libz.a -o -f /usr/lib64/libz.a -o -f /usr/ocal/lib64/libz.a ]; then echo echo "zlib appears to be installed on this system." echo "You can edit $VERSION/src/Makefile to remove the -DNO_ZLIB flag." echo "Make sure that:" echo " OTHER_LIBS = -lz" echo "is at the end of the Makefile_defs_$ARCH file that will be used." echo "This can improve texturemapping performance with Geomview," echo "as described in the README-COVERAGE-TEXTUREMAP textfile." fi fi echo echo "You may also need to edit the $VERSION/savi wrapper script that runs" echo "the SaVi binary to set environment variables appropriately." echo "You may need to edit the Tcl/Tk library locations set in this ./savi" echo "script by TCL_LIBRARY and TK_LIBRARY when building dynamically." echo echo "The ./savi wrapper script sets \$SAVI to the location" echo "of the $VERSION/ directory that contains files all SaVi" echo "binaries need, and also contains the README file that you" echo "need to read. Always run SaVi with the ./savi wrapper script." echo echo "Enjoy playing with SaVi!" savi1.6.0/Makefile0000644000175000017500000000150514423445060013076 0ustar lloydlloyd# # Makefile for SaVi - top level. # $Id: Makefile 8 2019-01-24 04:33:00Z lloydwood $ SUBDIRS = manual bin maps oogl data tcl src SHELL = /bin/sh RM = /bin/rm -f OTHER_SRCS = .geomview COPYRIGHT BUGS VERSION README configure savi \ README-COVERAGE-TEXTUREMAP PACKAGING # # targets # all: @$(MAKE_SUBDIRS:target=all) clean: $(RM) *~ core $(CLEAN_FILES) @$(MAKE_SUBDIRS:target=clean) tarfilelist: @srcs="Makefile $(SRCS) $(OTHER_SRCS)" ; \ for i in $$srcs ; do \ echo "$(CURRENT_DIR)$$i" >> $(TOP)/fileslist ; \ done @$(MAKE_SUBDIRS:target=tarfilelist) # macros MAKE_SUBDIRS = \ dirs="$(SUBDIRS)" ; \ for i in $$dirs ; do \ (cd $$i; \ echo "making" target "in $(CURRENT_DIR)$$i..."; \ $(MAKE) $(MFLAGS) target CURRENT_DIR=$(CURRENT_DIR)$$i TOP=$(TOP) ARCH=$(ARCH)) ; \ done savi1.6.0/bin/0000755000175000017500000000000014423445060012205 5ustar lloydlloydsavi1.6.0/bin/Makefile0000644000175000017500000000054614423445060013652 0ustar lloydlloyd# # Makefile - SaVi bin directory. Run top-level Makefile instead. # # $Id: Makefile 8 2019-01-24 04:33:00Z lloydwood $ TOP = ../.. RM = /bin/rm -f SAVIBIN = SaVi all: clean: $(RM) *~ core $(SAVIBIN)* tarfilelist:: @srcs="Makefile $(SRCS) $(OTHER_SRCS)" ; \ for i in $$srcs ; do \ echo "$(CURRENT_DIR)/$$i" >> $(TOP)/fileslist ; \ done savi1.6.0/maps/0000755000175000017500000000000014423445060012375 5ustar lloydlloydsavi1.6.0/maps/world90W1024.sph.pbm0000644000175000017500000020001414423445060015621 0ustar lloydlloydP4 1024 512 @O??_8s  <`< pπ0~<?Mg>p||@Ϟ<0?0?x1x< xyp`?9~ `?yh8<0#~`0? @10~4@>  p|```)p 5~ 0^p(@`p 00 0<| `4` x  8a30~  p | `~t@`` `?|1>@/ >~p<`0P<ŀ <?Aa#`; @@ `  \0 ,g` x!a `3|fv(@0@M8L8C@ @`B |`À5O@<p``@!<p0x 0!`Lg[> @">3  ~ ` d?  6`=~ 0@@0 `hb0@0`x< xC.&yp p,~`4F```pN8hpy#AQt0>h @ -F (8p@A;  0`Q `@ @03z}`#  @@d  x< G`@` |`0r ? G@0 0 #@@88pg <" @< `@@@ < <`0`# 0  08h $7 P ~p@$00@@  _0@ ` G@@ `pv=X  `G@8!? ``>?A`"@-0!D 8A!0l X 0F0 B0  @A4H28N 08< @ 0o `0ܐ"@ @ A߀p @ `@ ( @ 0 LN8a0@ f c@3  ܀|@ 0'0LL@X@@``(x p `@pG8 ` 06@8D=p8q<8>`A@`>@p-D  AX @0b F @`!p P> `|@8Vp0x +?@(0 %0 @ ,C 0  (} ;0(bA; H1` 0tP 0!p@q@A @P@@@r`A`o Xd0@ T``  0 (< C @( :P ~@8p@@D@@088 N| @D @ `|`%<@D ?0F@@4@$@ $0@B0C @<@$@ ! A0x@8,! H@`0w p X@ `@HG`8 X`wp@A`o;8\!@`  8. @4@a0  4J2 .Jc  hg`@' @` 7  < N @`4[@    8 S2`08@30Pc `` 22 `@ p2@p@@ Qp&@@`@9vp h 8@1@8 @a@t4 @  X,@<@ @X(@q c^  @ 3>@ 9@@@@$0 p @H@2h$ @0  @8 5(`H    '8 0 0g 0.>  8 `@G0`@*@? O`.@0   @`@ @3`00 `f`  F   "F:   b@  0@c`@  ]x` n$D0 jX <@ LH H @@ DHO @ <@ L/@@ `@ @@@ 0@@<`0@ < @`8<`  `8\`@ @.N8T@a_ `@< p@8T!@@p  @ @@@x\bX@ @@pTd8  @pTD`@@ @ TH @ @ TH @  @@`@>@@@`p@B Bh @C>A  GL > @ O $@  HH7 ` $@80 @`@8P0x; @ @P `@A@@Ơ@0t'0@   " #`~ @@ & 1M@$@)`@  @D$K` @ǐ1P D|[@ `?:`! D7@ r   Dh "7_ ` @ C0"$0#[` @@ @@"4 ?&# | O  @,@_@& @ (@8`& 1   (0I    0M@  @ 0 @ @@   @`@ . x8D @p8@ , $ @@ $D @?`@ $ D 0g p  @B D x0@  Bd@`D @Lb @D  J @D {@  @d#$$$ 8&@ @C @ @J@@  `b 0 880   (Ff  B4L  !"|b !"``b "@@j0# j "@@@ j C @!B@j A @z1 A @A@A @ @ @^ @Ѐ `^ `@ ?0^`A``@@@t @^@. @@@ @@  0<@@X@1 @dg #( d `$@@d@$@$&" "$ #$`" $! $!  b0) ! @q!)!A@1A0!A 1AL!A{@`A 88"A| @Ap"10 @ "=9`='B$0@&Y@B*`0<p<YBJ"H`00@ P|B1h8 @ @fA(p@ @d 8@@ 8@@@P8@0@008 @@@8'@( +@@0 (@@  @Ѐ  `p@0  ((`$ D@D@30   @ @` @p8` A` ?$: @@{| @@ш @`_߁0  @ < xb 4   @ @H?4B@@@HB@@ $@`@F D@|  @ @  `@ @0 @  `   @ `  @=B@ : @! @F1@8P @(@8 $0 0 $` `@D@@ Dh Xp !X @ @ ! @   ! 0  !0 @@ a8@ B0 @ B0x@|L @3`f@`8 @> @00`@@z@@@0@ x``` `@0@@ @q@x@@@(@@  (@ @0@$@@8 @1@@  ` A A@`0  p 0  0@@0@ ` @0  0d@  ` @ 'x  @5@8 @d@f@@@#?` @@@`@@B@ @@ B@@@@ !0@@ ! @@ @ @@@ @@@"@@`@  @@@@  @`@ C00`  LX08 P 8(@ @  @  @        r @@@@`P@P@ @ Pppl(0 `(@  @ @     8  < @@@,@@ ( 0 8 @  p  00 @( ,(`8@@ @ E@x p)`d>08c@: @@p 8` n1  07XAhH D v, "8  v@ p @x 8@0`@`P((@  4 @ @@ 0@ 0 8 `@p `pp< `p?`@0 pp@ 8@ 8@ 03 d`C@p@x < 8 9@ 0>@} @y xx<}?px?~~ ~s@?p<<pp|<0p <|savi1.6.0/maps/world-mask1024.unp.pbm0000644000175000017500000020001414423445060016262 0ustar lloydlloydP4 1024 512 @ov_K?oxAR` ?o._?B/P|O5O ?|k0?`px-NH@?>"/@_(@;( G߄ \ `@~`@?1  ?.(>? ;pOx@_xP? ?o#y/?/@ۂ?/  o_@'|h /=Ԁ<??/?? [@|>?΀-?x/?{ `??<{@>?oo8>? ?0~?^?}{|?7_?=?W~ `@/'`߽ p?~` ? k w;?>?> _ |?o? o_ ?hG~|߿ ??po}߿?n? 7? Ox{/ ~o_>?k p@? /@/w|@8|???/ ~  [ ?<@C?> 0/R}x`?pX_п@??G???? ?????a?`?`?`?P@?@`???(??/x?/ @?_?<#4O?Gx? @>??x >?> ?~`?n@?>?`<?(_π|@8???O??????``p?px?`x`?`? ????} ~p????????/xx?> x?????????@?? ? @? q?0??#x/` `?*`?|@  R<@ |?<?=?<0w?< {x~80?8xx?<<?`???C~@04?@C? ?_@ ? w Z ??z ??C0!?0a ?0>0<??<İ??7 :!  8?,?@ ?7B??p@?0 P?? Cp>@@ ~@p? ??0  = x X?@? ??4?????????`??p??@? ?   ?????W??@q?a? ???x|p?@>><|<rx~p~?``   ???[Gu_{_7/[=-ߠ >{@{, `~ ?zz? @ ????44?/ҬǠ_??_?=/o?w? ?`/@savi1.6.0/maps/world-mask.unp.pbm0000644000175000017500000005375714423445060015777 0ustar lloydlloydP4 600 300  ?AgC4UKU ? (@@׿|^|-5= s @/W/ǰ<y?/@< ??:gx@~Fpp|?@ P}E}1y@ > T`p ^}};;?yw?7/?߇m?@!0:?' {?`?{? ??~_? { p@~??A???oo?8+߿ /?8>x=0?2@__@?}|? ??wpp߿`@`p{0@Op? 7@Z@0`b~z? Ã??ω?~Ϗ?χ`1 ߏ~>00'߀0V83 0? ? ?8r@;9\x8?8<?<@C @_a?@Ap@? ??? < x?xp0L ??s0V! ?@@? X ??@/?t>0``@D~o ` p?p p8:?p??/?|?@ ?@???߀@:q?8pp8?px80ps@` | 0 :8``?@? ?408`? 0` 82w@p @ `ǀpO0ڦB< zpp|>0x|7h<sv >|8  0 g:0 0@ `0b xp#a?@M@(1À^08<H 0pPsP?@@ H< 0 @Hx`<(,o |pv 3À\xx>t` 0# N #<` 3\p`@2 p8b@`80B0``00870|t 304gx'0|G8@X|x?s?8|pp?< x0`` `0?x3@> (808 8@? <@$3@3< `0``&@8w8p`π$ <  x3@f1 @ p  p0``a g d @```0 P`' B 0 @@@ 0 80`p@Aǐ89<@``s `@4@D@`" @$ B` @%; (@  3@ @@@ @ @: P@ B P@0`1 8@ 8@ `}w@0@ p@@ ` 0``? `0 !@A  p` C@p 00H bD `@A `@@a(1 ,@ p @ @GL  @+`@p$`@ @$`=0a 0  ~c?7`@  @>`@ @ 8`` 0$ ?@ X `@``D0@R >G @ ?   h 8  @  @ B@a@ 08 @p' |rp @h9 @#`@00 !< @  `0@ c @ @  $@`@l&@@@@`@  @@ P @@@@0 `!@ @ @ 0@@ 0@@ @9 : 0 @ @`@@`@ 8`@@@  @@0@@@@  @ @   @`@0 0`  @ @` 08@`0>  0 p0 @`@p/ `= d 8`0@q@10;x o`$<x0  \`` @p8{  `>`@  @ p 08 80?p0@( x` pp`00` p0p@8sx<f 8s ?0x>0? px0<8` `<x`` 0`Àp|q<<x`<xx vǀ8savi1.6.0/maps/world.unp.pbm0000644000175000017500000005375714423445060015046 0ustar lloydlloydP4 600 300 ???|p~`#!0{>O{y??x8ǀdA_`>s 8~0 788 >C!0 |`~w?px`8 ~@O?~xL `~` _0p?8~0`lృ`0{0%6?@<3 ?>p|~0l00>?`sπ x<@8p  ?1pyߜ 0G >s@`?p`@@ p3 @|#6|3> `@@p ~@38 @o  B@0c <0@`^80Ap0 ?@0 y>>``@8pCc0@ /|` @ p ~t@` ` x~0` e18w0`8>    @` fp3@ ,~n @pX`x`? |L 1 0> cL!x! 0 pL3F8x 0#L@> 0@?#A?p `xn0&c88@ C>`|`> 8O`@  H` A 9#  0p ~`  `>08  >2<pp`N x|;``y;q`l@`~#`0@@=@38 P 8_x0!  LL` @D &00 ?'0!cp  > 0 `f@`p`q10x<<<<0A@ 0 a`A`A00 @@@`@@@p7@0C9c0@?` @0!v |F1@ 0`@@  @.`3<`O`~@1i@L8q` #@0a8 # h8C 0 0 ?" |yA 0 " x  ɀ    # pq  l# @ oda; @ ` `85m rp ?<a?3dw_D`8` @<08d`/ 30 &?=x0@ `8@Dq#0D @@ @   `C8Ob 8F0Oc49!``08% x0 x`f``$ d#c?Cx&F4 @0f88~  b|0  L 2  <@ @p0 0f@  @߲`@`A0р`l1x` `8` ` `#{@ ` @`pdl0` @@# ` 0 `x`#  |c<`$5 3@( `>0N`an b @p1`,` #H0 0bx{000`03  "p&00DFX4.01 0p0x ?p  >1`0Lx<80F8#8 {Pf8l ɀ0AJ i` `@f`}0@p``_͘8@ @@``> @1`30@0?@H@x0">͓?@~ <b`C" m}@2<<h8@ L 8  x9b @ "@`2@ @ 2``` ~>@ @@ fa e@``Ca@6`88h` `  `0 ^y @ 4  &   0"81xx`p 000@0& s0  `0p ` N0 0@  @<`  @@@# @ ` 0@@& 8 @`@0@`$  @` `f  @`&00B0 @= ` @~!@ @@ 0@ @ 0 @ `@  @`8 "@ @p@0 ~?0@00 0@ @  0 ` 0 p `8@0  @L   0 b 0 @$ n`  00`pB` 00``0B 0 0 3?C`23&&D ||F8daL  H ``3@ /0@` p<l````{ ppp`` @?H |p>?}o?`@  p`p~p `x0p?dx <}x=x8?0 ??8~88<@=<0| 80?savi1.6.0/maps/world90W.sph.pbm0000644000175000017500000005375714423445060015336 0ustar lloydlloydP4 600 300 >>?t y<8?7x??O888><gxx7`~?p`d` {`pǀcx 8= p00 }@`8p0h?8  S` à g@~p d0a`A Na c x 6  0> @ { A 80?`B`aa@/#`o18p0a( ` Ю`` tD` p8?  @280r8|  0@xC8 H`>N@?@` <t<x 8#a x X8 0_0a@<sE5@`h~a1*", 00ž?8 0H :ua+O@H=O`g0(z2@$C" 8PπD@H1`` @`3,$@ ؈@ ?@@ DP> 4  c$Xtpa 8@hsD @Q<0!z"1 !D0A  &0 @ @@ A0@$,@ @l @@]` @ 8@V@ 0 @ @ @ @  @@8@   h@ x @  (6 @00AAB(&f@0`#BHx @0\"A8H8`0s!8P8@@p!8@ @ `!8 @0@8` XT@   @. 8`Hp ` 00@0 PT803,@@P @@*`y@@*  @0@+ <  <@0? @3 <@P x x,/p@p <x (  `d@<30L $"|p2 T $A@ p0@t 4@88p0   8  D $ l x@$@ L  @$= @0H0 B@0@8 @<@0`@`@|`1dp~8@!F(l v 8!0Y6! 0D!$ 0D?1q@!<"0@# "`c @~@@ `QÀ pQ% `Q% QL$X/Dl/ M74,$x2C 8H@bd,$ 8q0\`0.N܀0t@'y^ x`` 0&@$.*  $@ (8@{  @    AA 09  0!x @  !  @  @1  ' Y   # ]b c! h 8d (,8 x0p ( 8BP@(C(8CH(  OY$ Hǀ$ P6 @"A@@"@@!@ @@!@d @82`@0@  `$a0 $ <08 |    ` P|  @0@r@ @@ ` 0@@@@@`@   @ @    @ @x 8@@@@ @@ @@`ix`@@ @  @@ @0 @ @0@` A ` N@ P0 0`( (@@@@@   ? 0 D       @@  @@\  c ,@` ` `` @0 0d@(\a@@qp~q@ H|@ r@@p@@x,@ G# @@`80 @2T 8  @ `9oq9  @ d2  | =88><8|0? pp !savi1.6.0/maps/savi-logo.gif0000644000175000017500000000360614423445060014771 0ustar lloydlloydGIF89aKo""  !!!!""##$$%%&&''(())**++13,,--..//1122334466778899:;::;;<<==>>@@AAffEEGGHHIIJJKKNNRRUUwwww)15!A2C->21%(dY'!51HETQge{z! ,Keedccghh`behklkkgecbaDDȈDeimnmmibYjNNςNdgkYXօ ]"ȍ 1]H1C!" zRPHB̙xb% Q(bWGn3d*2dt2KQ%JX 2I˪U_RbTE9H?YtYE˕FZw?Sc%}KʕWHu ݲZLf)Q"GB -UT-B2. {~+strO9t>RO{HBr*uG73ggR@uLNtϵkM00 p SGƉ3ȓNHg8鷈%IH`cROw5 1Y"\8M2bb"uh`^t%1G2tQtKt%8 G] {4=2r i Mg!$\*p!$#)2bF)1 hv>6sթ'$H@H'hRZ!LVț DITיx j$ b9RjirJ6Y9 떵jwV9Hr*i(<"$#ZCrFLѵm!Ov(@mv8#aRB!fқꐇPhw+0J$ PXo9[A*nƒhp"'rb!^l$ZRƽ^#;\r?"$3Њ; #`]H:+@0| &.*InHF L^zhB8zc#ɉЃ#Mۋc7\#Ns5KZ'm"$8!'1~7cW2zف*\!4ʹ7#̶$G um5ㄓ=$GHLxڹ0_:IzϙBΡ{#Ա+;K7H=GBcAnCDd1A '9PA%r88AD>ʼn^jJ&t8 D .ۼwhiP~D ":q gN8O̡  E@aEr E]`]^:09Q`e4E*h5,h   :p@\{ &VБ`0CRTlBA0! *7&@⌄ 8ܒ\& e"T4  T pA 6Ў> /}&%5o\<>@ ;savi1.6.0/maps/world1024.sph.pbm0000644000175000017500000020001414423445060015321 0ustar lloydlloydP4 1024 512 ?>`>3w0???;<|` =``̀p@`~/lL d/o?q~`烀g@0ρs/??a@1>A<=|lLp qH20~> =`@28?@I 9==`p@d Z  @61o8?8|`>\>`q0'p@ !p `sx@ 0 0wp30 j<8x@@@0` 8`=1 A`|`` @ 8 @@#`p@@@>kN=`p{H/0> ~F }@C@HMG`@@p 0 f {B C  @f 0} 0`p>  x @`8xC  @q@N @@  @>8p`wy$4@qh`|@8@08 @`0 $@ < ` p`` 0` ?2x@ p8`3@pp \ 0@@@t l  |H@0t`0@$ @  ˀ @?`K  p`* )2 8 0'% 2@  8 8Yx ?  @ `@# 8 68 | @'@ 8A `  `N@ H!d (``@p< @x@X ,@0@   ?{  @< o8   @0  @` @p9@1|@p `@#x``? p,p@``0 A?@ p@0@@ ( Ȇ  ` @ 5  @0 G@0@0@@P@0PL 0M``@z x @|@@08@@#@a0pH{@@ @  8 px8 /.Bv0@0 ` AJ t|%pJ@ L0C`V|ِO>6  w`@  ә @@  >@;p @?@ @ - @ 8 @ @X @ /|8@@ 0A~ 3%@@  em`!a'0@D@ `0=AZCf 8D@ @  `@ x:&` @@@098 @# !@@@?@v` @ DD@B@@ 4  @x`8 @@@@@ H@ 80 8<@A 8?(&`@ @H0?`@ (801 0> @=0(<q ?7P xs@@  `  ? `H @ 0O   w  9A0 @G` @@0pa @ @P 8 @ A@ c  !O @`0@!`X0@ @ @! _ @0@!H@@0&  0&@  2D@b ><^1s@@} `o 2` @H 8p @x 0d@@{p2  00@ p@  `O@ @@@.0,@@@0(@8D @0x H@D`  G `G0,<F(F 90X00 G@d0 C@#`@@` B(C00@B@$@@@| @pa @@0@`@00  XDŽ8$0"@@ @ @0B@8 `  @ @88C`H @0$ P @2 $@@`*@@` 8N@ l`@)< +p  G̀@` C @` pؒ@` }H$B@ @@U؎`Y8x "@?H"H | S !@@ ?H/FS @@ 8"Ar `$ @  ( \ iD8( @N 8PA`@8 0Ap @@P  8 , RH2@@`  @@ @MHB `@ @@@~NHE~@xp @@ @@C  @` @ @`  @@` `   q0@ ` f  @  ~(9p ` @x@>`,x 0(G@0 @$   &@D 0   qP 0  <  0 h@L @@ `@@ @@   0@  C@A@@Bl@@@0D  0   $   0` @$@  @,@@  @0( @"`$  p0@% `0@=IxtP @0@(  A@\8pR @` i@z @H@y HP aـ `<a H >   HP' 3 @ (P:@@Ѐ @ (p9 h@ H@ 8 p8@@  0@   ~ 0  "C@ P`0@ Cp,@0$(3w@0` !B  0@g @8x \@ P F   @@\@ H< @  @#0@`  @G@#`@ Dl @ @X8@ @fp# (U 8@@@$2pU $ @ @(`dU $ 08Od`  <0ND@ 0X##l.G.FCa`#  1x`@ Q <  R 2 0 r@A xr@ "A6r  -<r @@40 B @@@  D  O   \ c0 @  0@<    N 8 !< 8 `!@@d p!p@{ @@'  !@B8`@   @@ @  A@ 8@@?" @`/\A   !@  <(`@P @C@ @B(@#l0` `[B@P  $B@0@@?  t` 0< D  @D 4D b 4D     D' "@`| H<`A . H$` LhH$@`H s| @HB@H ~@@@D @>  08@@L>@@` Lj@~\ C!@ X@hq@|"A $@`P`?" $0@P"@(@G $0@(@@ $ @ $"@ H  x$("8 x>"X@( #X8`@ x ` h  J 0@C(1!8 @  @ @B /0B0? ` Bp@?@ @ B,@@@`!$< @!"` !p<0   ba> x2  R^0t0 9 @`"@0  0@ @<8 @@ @ @80 ` J @0 @@  $? 9x@ > @R!@  m@@x@0@<@@ @ @ @@@  8@B @0 <.p0 `C P 0A@ @`=@ ` @`O@ `@ @H `  @@(    <@8 @@  g@ H@@0 `@x  @ @ @@@@@@@`@@ @ !@0@@ "/p@  &@ L@ `A@߀   # 0   "@@ @  @  @ @<@`00  @@  @ @@ @ `  @ @ P @    @@  @@0!0@o@ 9p@?'``@A@@ `  @@  @ @ @    @@@@@@` @@@ A`  A`@  `  `d  t @ <@ @ 8  @   ( @@ @@    0f@@29 .  2@!! !@ ! @ A|  @(/  p p0 @@@@  @ $0  `? @ & PL @ 0/8@ l@@ @p9@ @O @@@ \4@ o@   @0 @@ '0@@   `A h[0 \ @0`D`$<X @.@>   `p    ?8 (D00?0`?0N_`?0 ?@0`ta0 <0 0( =0`0`?8p|`?gx??8|3?savi1.6.0/maps/world90W1024.sinu.pbm0000644000175000017500000020001414423445060016005 0ustar lloydlloydP4 1024 512 NN L L|'|'p0 L0L0  <0  &`&`>@>@ ` pp9>9> ~ ~>>p>p8`1 08`1 0` 8` 8 A0 A0?0| @c` ??`@c` ??`08g@c` 08g@c`  `x`0a`s `0a`s  pLx< pLx< 2 2    p8|8`? p8|8`? `0@ `0@0`0p|0 &`p<0 &`p<p0 >p0 >>`>`?x80pc80pc|8?``8 |8?``8 y <<p?`<`p?`<```3``3|0``À >0``> >0``> 0``>00``>0x`lpx`lp`c <~``À`~``À`@@@`p`@@@`p`|<0`r 3<`  2c8<`  2c8?<p  ` ?a`0?<p  ` ?a`0? 2A ? 2A >|  2?@? 0px`00? 0px`000 000?? 0 000?? `00B7``000`0p```000`0p`x`0 `x`0 `~00<0@ >À<0@ >À0ǰ x0ǰ x>0x c@>0x c@ ! ~??8`0p`` `x@`0p`` `x@0`0xNg` 00`0xNg` 0>00N8 xc<@?c`?<<8@?c`?<<80?` 0`0?` 0``0>``0>``=88?>0 `?`>88?>0 `?`>>o?0ρ0>o?0ρ0p1 1~0` >q0~0` >q0`` py88~`` py88~s` ـ|ǀ `` `p`` `pp8p` ??p8p` ??`|s`|s  >` ? ` `0 `8 ` `0 `8~0` 1``~0` 1``8000````N8`` 00 `00pp`18`` 00 `00pp`1 x00 `O0  x00 `O0 10`010`0< ```00|p``00|p c ` ~80x> c ` ~80x>c``x? ` c`pc``` c`pc``pc``pc``` p `0 | `0 |` ` 1x` ` 1x>cp  >cp  |`s` 0`p?` 0`p?`>``@` x>``@` x0`@x<8`80``0C `80``0C ``08``08`  `  c>| >?|< 10 >?|< 10 000` 000`~0p`@{ 0`0A ``C0`0A ``C08c> 0`08c> 0`0 9< 00 9< 0031|8sp1 0p1 0l6 ?0x0l6 ?0x0p68`a0 ``?8` `0 `?8` `0 `8>``0` 9`8>``0` 9 6`0@`  `0`@ ` `0`@ `7`& @7`& @ @`0 `< 01 @`0 `< 01 ?`?20 ? `s00 p@ `s00 p@ @ 00@ @ 00@? 0>@sÇ`` |0sÇ`` |00083s<00083s<000`&| @00`&| @ 0@&> @000@000@`00{```00{``p0 |0 `0 `2p p>2p p> 208 x <8    <8    & ` & ` ` `   8``  |60 ` x |60 ` x0 `? `0 `? `@l0 ?   0{ 9  0{ 9``Cx π> ? ``Cx π> ? `?@ 000`?@ 000<@|0 60@ 0c>`9 0c>`9C`8?<`C`8?<``0x0x0000 0000 0x 00?  08?  08l 00l 00 0 0`0|| 8 800`8?00`8?0  `00   `00 | 0 `@0| 0 `@0  @  @  @0  `0  `0` `` @ 0` x<@ 0` x< p70 ` p70 `>00@` a@p0`a@p0````8`8` `0`0` `` `0 0`700``8700``88@xp8@xp0`0`0`0`0`0`0x`0 < ` 0 ` 0 a0|1?a0|1?0<0 0@p0 8@p0 8< < 00 00 @0 x ` ``@`@ `0`  ` `  0 p00p00 <@ <@ >cx>cxc`ll008 8   ?` ?`  ` `` `` ` `11122222f2f2a2a2>`a`a``  00  ``&`'' <<0 <`8?`8???? ?<? ? | ~ | ~   x? x?````B x<|pxx<|px000p8080@0@0<  x`x``@@33<<?00ǀǀ>psavi1.6.0/maps/world90W.sinu.pbm0000644000175000017500000005403314423445060015506 0ustar lloydlloydP4 # Aladdin Ghostscript 1 bit mono image dump 600 300 X Ph(p?`)P3@8 xtt<) (@8p xp  '`00!!  G!0@@@pN@?G@` @ @|  f c$F 0DL#B!PgB  81@ wA n p a@`  @@3@@ H xz @ 78t?`@!؆CF$F,8 @@ @ ;P@ @@0 À@ @0 @ @ `@@  Lh!x@ "`@ 9l0 A@6`x@0@! @M88 0 "00,B 89o@G /   Bx?x@DŽ B0<0r 0^@ 6wA>3c9]p h _$`@43` D0"p >`p 1@ "0x?YX  p aYb`0<  i@< 0` x  ?#90`Px>@ (?c> 0#x9 B`B('!Hw0pc\`B!$ˆ aD!&$@0F8{f`gh`m @8@8@A  ?>> A``~A `"@ > @@x@` "X~0# "p$A `d/ @#%pHy @`"0a @,B @@@!`3`@@@" _ `0O" @ 8 ` ?"0'0{ @ 0`@q0`p(@ <.< (8@@  @`0 @ X p8R@ 6`|2@ 0p$`!`09@@ @00 `@@ @<@@@@ # &@070 @@ \@@ 0< |<   `à 8 H`0b&@   # 1@@ B  `@@ !@@@@@ @8f @@B@p@$@ @ !@@'x   ' B? @ " }C: @" 8BB? 8 ?B@.,T @B ($`>AB?@ 7^!0@ !@b@ n @@0o<30Ap( 6@(@`8  $|`Tp@` <@@0<@  @= @@0:@<#(|@x@C!`? G? D!0; :DA0@  0"!P@ DP? @1Ȁ@`A@p@A `@@A@B@( @B?A@Q@68 @) A=< (@<"xA @(@ ( $  8)0 8 p P  0` B 3 >*@0 @0p @ 4@@ 8@ @@ @@  @    @ @@ `@@r$0 p@D  q0@a`@8` H@`8 ` $ 0$  @ $@@$"b  " # ?AB@`FB  D`  @`H @ 8  ` @  @,!@@Ap>@@ @@B@ @0 @0 `0H @8    '0 x@  " $$HH 0pH@<   @@@@A @@@`? @^(|0>P9?    @`@a@`` ` A0  8A0. 0 p`8savi1.6.0/maps/Makefile0000644000175000017500000000127614423445060014043 0ustar lloydlloyd# # Makefile - SaVi maps directory. Run top-level Makefile instead. # # $Id: Makefile 8 2019-01-24 04:33:00Z lloydwood $ SHELL = /bin/sh RM = /bin/rm -f OTHER_SRCS = world.cyl.pbm world1024.cyl.pbm \ world.unp.pbm world1024.unp.pbm \ world-mask.unp.pbm world-mask1024.unp.pbm \ world.sph.pbm world1024.sph.pbm \ world90W.sph.pbm world90W1024.sph.pbm \ world.sinu.pbm world1024.sinu.pbm \ world90W.sinu.pbm world90W1024.sinu.pbm \ savi-logo.gif all: clean: $(RM) *~ $(CLEAN_FILES) tarfilelist:: @srcs="Makefile $(SRCS) $(OTHER_SRCS)" ; \ for i in $$srcs ; do \ echo "$(CURRENT_DIR)/$$i" >> $(TOP)/fileslist ; \ done savi1.6.0/maps/world1024.cyl.pbm0000644000175000017500000020001414423445060015316 0ustar lloydlloydP4 1024 512 ?>@<?<`3??' ??@C>@8?"3p.??|<1?{|? ǃ<?À3 ?>`0<~??{p !?up x' <p~08|)> xk?>8p0@080>O? ?``08|~p<xPx0p< x@?Ip4`@   > 0?x@??π 4`88|< |`?x| 21 9#?Lo```8?`8`<0`|@~0D<``<(` ^|?0 `?@ c~t?`x@h0C<=>@00`Yx`0g0<0 }`8|C|  08@C  F> ǯÀ ]V̾Lpp Ax<2?'~ @ 01@080/ ~ 0 `8,& 060@ @R3Bxp  6 0c @ &` 00`8 00?' b00h`0   p |0Ϡ` 0 00> <p   p`<<j  xHM0`80 03~~?8 0G0b9.?B?0<vÏ0Mb~`8M C 0  CopM0p >p `<1`8@ @ ` q80?x@À<0g`πQ`0(@0?0300|A3 8@;?0? `<@8@:?7 0x@` C@r 00p0`lA 0 e```  ?P ?8@0@?p8@@p>\`<`p< @l`@?&O@>0`>`  2 >0@?000608 @p60> ? 3@0  ?{30Af~@8 p801x:@?@0P0@|``0?``0 @Ax`~  0 0 `0@ ` _008?x 0`@xp0_Mp< 8` x p@0 8G?&0p@l?03`?`\p$~008$x ` 30 &?> 0@  1#6x  0@#" z @ ` >#pp@`  a `@:` 0p > ~@7x=p 1 80 0`|`|@ C? 00 1 `@` 30C}00``@ !0[ |`72<0  `  0/ p a  |0  `0,`q  0 `00(@ap|@L 0 `p( 1p @ `` ;0`0 ``0` Kx` 0 `0P~X `0`0p 0vr0x@p  0F`0  '<80@88 f`0 /@G>h`0`01@8O>;@`0x0 \03`@`0X 87? @ `t x?g?``0$D`0G0<x0`??<?yy<@ `00G`0p`00   @` ``000@f@3 `00` f@00p`0 ``0~``0p  0s0 `0   0?Ѓx0`0 X  `|Q~0`0 0p ``h c0`0 00  0 0`0 <` 0  b} c0  !` c0 d@81f?`0  `1?`0 0?`r<`0 `xÀp@8<IrGo ` < <  6 @ n l<8xX?`,|``̠8 D0 (@`` B?8h`006 B0x  cp08 0 `1 0 0~@  0 0`p 2>1 0 0@ ,` 08 @ n a09 ` x !)0`p @8  `80A  >` a`"  !` # 8 p08@0`y!(``L P@` > @L 0 ``  `n  @00 @7 v  0=`@0A "p 0@ ` ````P p ` @ @@ `  z@  @@`0 :0< ``8< @0 30`0 0  p8; ;0 0 0a%90 000 ?i8p` |880`lM` 0C H ?``A H008A` P@A` p @ <@  @< P 0 @` > t `l`0!  8 a 0`0 @? 0`p `` `@0 08 @@  8f @a `@@c?x`<>@` > `   ` . @2E.@#|9Fx (@a)C (A`-a@8P0` ! 0q0`@Ā! ~00@@0 ` ?@`0`@`0X@3{0`` l`0P ?````l` 0 (0`@  dp `@`@0 fp@0 `@````@ bx0<0@ @ b@x @!@b@ `@b~ _ `>hc#? `0?c c!mc 77 a!0 0c`04߾0 x pp=xp`  !|`8(c` #0x,`ݰi` 00p6 -? h0 0 0` k vx0p 0 0 j`xl< A 3 0`(@0f A`18@ 0 (` c `0@@a, ``@@@Cpal 0@`@@@Cp=`0@pF` `Y 0`F  P@0@L ~<k# p`@  @0 )>` `@ɀ #28 0H`ɀ  / 2  P` xɀ00 p<1c0`mɀ081 0 mɀ p3` A0 mɀ`0f@ ɀ`0 f 0 ɀ@ 102ŀ ?ɀ` 1008@ɀ0`` `@`p 00 B``0`00@^@@ ``@00`0|`0@0`@ 0~ ```@@ `  C   @@@` @ @@v `p 4 !@ @@d & ?@  1`  p 8@0  7G  c`00 plC0 c@a`@ c10@1  0@a  €`@$  G :`0 80`p@0@? "00 a` @02`@`a;0p`@20``!À0@` 2402LH p020 0N@68`PD30< NB 8`0  |B8@`0 @ @`p 0@@ 00 @0081 `?<x3 ?@`f`00``|` 0 `  0 0`  0A8`0 ` 00  p0 Â0`p  G`80 |$dP p>47Ï 00}F0d0H@@p?` `@@#c` @0 |a0p0>0`0@`@,@6`` ` @0`0 f  p$ `0 p 0<πp `0P~0 @0_0  ~h80 0 1`0<1<0 ``$01`p`f`1`0@0`F` `0@0p@ x`@p@  @0 `@0  8 0&0@08@ 0@0|@ `0@ d ` (@0@`d `  / p@`d x0 0@`d0x` !0@@d000 `!!@ 0@@d 0`  @@0`l@`@% @@`88@`7 @xπ`0@p` L 0`@0`0  a`0A| ! `@p  `` 0`@  & `0!@  0@@@@ `0`@` 0p00`p 0 p  000 0 `00 P0`0P  ``0  `|@00@@0@p@@@`0@p` 0P70?`0`@` h @`@@ 0@@@ @~@`  `@` `p@ ` 8<@  @ 0 @0   @@000 ` @`0` `` @@0P``  7pp0  6   6 0  v`0   ` `;  `300@c0 0 00  ` ``  `  @0 @@0 0`@` `` ` @@`0``0 0 0 0 | 0  00` 0`` P`c`8c0``!`!`x@0, R17`pc!?3a > A@ x 0     ` pQ0<80~` ?`` x 0@Hffl,xF` ` |@x@ ? | `< @( ?@ 808`0 ( 0(` <``@@dI [U|.` g `]}{?@@>Jk@7@p`@0 8&x?<?~ 8qG? 9CF  ??9@`:<>OO  ???0?8<>0?8??? savi1.6.0/maps/world1024.unp.pbm0000644000175000017500000020001414423445060015331 0ustar lloydlloydP4 1024 512  p<N ??<<??}?~80ᇀy> 0p8߀>?0yp!,~ `p80s? ! ~> ~10~>> 0O`pp@>D p?xy0 p 8' N~>0?@>p#0g~PC>x <|?xp w0p>?>8 p0  1=<~?f }|# @ '8xa`<`G?>` 822 D@opπ ??x# 0x=&}1` <@xxG? Ɓ8g>'0@xO8w~x {?@p8| @  3񁇀 0pa89gCx0` 0xjG@A>8@#?0@?y< 8@<npxm?0H?O0 7< `Þ @ 0px ?800@ @x 0 v`@n pC00406w00?w>vP ?v@ |_<?8@0p@?#98@ @@ 8``pa A ?@{?  0r? |p>0 x9x0p ~O0<? 8? |? 08F>2` p@x!< @>80 p @  08 0 x0>;  @0@?0p /N pp0  0@00p0? @@ya0@ p 0x009p ?xp8NGa0 '0\z0|@ ?O?@ q#> @>0 7@< d0p#10 a La@|q8|` X @& 8<0/8 >@;0wC  ` |@ x݂$`| @à"C8C ?B '@>8@8~ @ @ p`2@:@!P` 0@ R 8 @`0 @`_ b@ 'p@8|@0b@`@3@ 9 |@@@R @ y`Ox'.`  @Āo]> @ @#;@ 02~8 @0<`@? <`80 `` @@@` 8@`B !0@ @~2?`<></@m0@ 'p9@`?}@@@00 &9@px309@2   8`8 8  p 8`!` 2Aa8p@> %# `'AA(q8>p ) |8 ``@0p 8 8 4@@@  ` 3" |~ 0?aA1838 $8xA~!| 0 " 00@0` 0!"p a@@># @  "?` 8 "$ 8@  p&p`x@@p]`: <0  `@0x67  '0 P .`' ?$`n'p2Y<|  $@ ?@ 00  0$xy ` @91  0 `?8 @800@C8  0@0 @ 98|@@p0@ | X`@@@ f >x Gx`80H> 0 HA0AЀ D"X O0Df   X< <} ?@#< ( ?Æ @.|x  ? p~x@p @@@  @ < ` @@A?0>? @` ?=0@0>@ |0 80 `` @@G  0   @`< 8  0?@ 0  Ŝ@  @# &! @@l p<0`x=o `B@8` $Xp/ @d@|| | B$@?@ @0">$@H  `"H38$=(0x0!'@@000`@0`@ 0 x 00 }@0<Ń@`N@@ @<`b`  0` 0 @d 0x@``~8  ?h 8   0 ?,10 @ 0, 0 @  083`80@80@ @` %0P`@?! HppG @x pa @ @ @q@ `3`0 `0` `"@@00@ ?<pp@A 0@` p@@  `Z@`@~<0@0@ 7@  08@E`k:p` 00@wɀxa 88 `  X ?0@p Hk0 À0AɁ@8` @A  @8@0@  d$ !@@8 <Hp@ `p@ 8  0@8 0` , p'F 0 )$pG>p     $ " G<$~B@yB (2aB`LA 9A`A@ p;w; GpL G @1@0@`< Dq@0@@`0@` s_Q800  `X@ DCހ ϰ  | p`z~Ap0!`0 @?o`0p <  >p`v<`  0?g ?⟁ s@@0DÀ@` 0``@c>`@>0 L =B@@@l0 @``8 @   p`@@ 0 @0@p`p08 00  <    00 `0?0@ 0@0 @&>0  `a@ xA@@ @@@@@ @@0 @@<0`` @ 0   @! 0 @#8 $   0 x` x0@ @  @}d 0  @q0`0@@ @@  @ ` 0    | 00`  8@ 0x 00 `@@x@`0~p 0 9@!0=g@A@ @ ?    `` O<0 x @@0dpDtSp8xh@  ( 8`7p0  4` ``0~x0H` 0< _`v@<@,ONO ` 083FJ `~8 <0x\??~`1a80?0?<`/`p78?>?? f| 08O<0>$x@ ?p   @~?>`C318N1 @p ??`p ? ?`@08~`X?D ?pA:`@0p|x`<`??||}xg< 3 x@ >?@p??`|??@8@?~?~0??savi1.6.0/maps/world1024.sinu.pbm0000644000175000017500000020001414423445060015505 0ustar lloydlloydP4 1024 512 ?3g??> ``>` `~~0|?>>>@|||||?><?   |?|<><>~r#>08p8||0xpx|?0|`>?B  ~?`~p xx<x|p>>9067>=0&'c@~p88' o# 77 g#03?~ps8 x ? ???? 9?| ?9>6p̀???6??|8= >7xp|?0  >3x| 1xÃ3p sC|p`0`9>8pxp8 8?08<` ||p3 `3   B<pNcx<x|8 s 0|8@ z0>0|w>σ3 >px`??~??||0x>p>π1`|@8>8 @8>0  000`?  0`x<8p0'>~9<||~=>|8 8#8 8|>8|>`?6>`&o||o?`|0À?x1qp`~p`_`?;q~|`391?|~B|`8>>p0?~>|848 8?|8<><|8p|gx8xxq<~? lv? `8||`?>` p0` 808 <<p  s<|qppp?<px>|xpxx<~0}l?xl!>pl1>? |x8q`8<x |8pp@s x< | `8 >0`> p > >888 x88x8c``<pw```x8``` ?8|`@<`>`|`0``p`~`9`p```8`p `p `8c0c0`pd@     8@0 6800 |1 `1 @1?c pcÀ0  s0L` p3p|8`p|<8``` 00,p   lx`<`90 88@y <| !  <8008880@>`@ |@<`@>|0><0  @?|80>>0?|00|08À00`xp~C 08``9 c p88 <|8x80p|>00`0 ``|r  `s?  po` ? 0xo` 10  0` p`0``0x8`00<98`0p0p p x0<` 0<08`` ` `@ 0``L|000x0@r00`8q`@30 p0``@ 0n```00o``rp>0x00##`<80c~|p08axx@8``@@ px! ? ||?0<?p<p0r|g888~ps|?8080c>9 008p008pc`0 0`@`@' ;?9pp  px<80 3`0 p p``  p``` `` ```` a`|`` x @@``0p`l? 0`s0 0`s00 ````0 0 ` 09@ 0  ` 0c0  ` 8` 0  ` <`p0 `Ac0@ >@B` qgg`p?Àg p?x`  90d`0 ?>0  0 0 ? ǀ?  @ ?p``0 @` `0 0<`|8 8``pc ` 8``0c````x>`8x  pppx`|0< |0>x|p  > 0 `0    ` ?0 `0?0`` 0?p@xp8` >88x88p8@0`8 p` `@```8 8߀` x  `@`p `x `<< ` 8`` 8 p``0L` 8x``0  00 ? 0?>px0<0?>p0p` 0p@ 0` 8 0?@p`0?0?<|O88  @  >0p|<8p8p~yppp`o>``0 `0w?0?||88pxp ߀8p8p>0<|~?>8<>x@p` `p`|x0  ~ p xp`|>>|>|>|>||p@>||x>||0'|x|;gpggp?p o> >x p?|8?>9?|`>>π<<|<?p88|<|>|?0p?p8>>> ???|?@|x8?><>| 8<7|??π?>G`'?99??savi1.6.0/maps/world.sph.pbm0000644000175000017500000005375714423445060015036 0ustar lloydlloydP4 600 300  }x~xxxQ<x_&~8? YpA 37 `,q<?p p>c@ _p` @08@l8@` 0p` x`@!@p=<  :`@` 8  `bp >  \F(`@ @ <8"cӀ $bC A@ BB(0ax0 0B@ 9@ @@~@0py0>{ A! >6|< pA {(C< p@    (@  ?@ <@4  o0q@@ 87 n 0@ ~pq0px*@>  , < @pBQAp;fb!cX !6 pD8@@ @`:@ ``9K@  B80  Y JA`088@@ ` .x a ; " p 4 ``87  w <@<,  "0p$0r $ =@$:  Q0 @ Ѐ @JAp@@ 0 0 pH `0@<@|À ^À6Dp  <bDdBbP@ 2?b |H@  @B?,  ` :8    * @ "  ` B`  n0!D Ā8 " !0 !x !X` Z @-a0@ '|p `)`À p@'X 0`IA@&;@o>  @  @,P<"8 @>00 r!!@``x 8 f`!0@|~Fـ @!@ @ zDH` @!8Ap(L`@! @@>k\@ @p>G<@p@ b`"sxBpx0@@8!  x@Bf` @xhb@ @4ppSA @ Ā1 f?|1!A 8D" /" B@" ." B  `@$D  @^  `@$DJ@@ @D`@@ " 䀀@|` `@@ ` x@@` H@``  `0@0 @` @p 5a  p@+q0@Հ0 @qP`0?, ?P@`?00%0`@<031P09 20@@ FR8X 80^ D4CHX$|DjP jPZ  D`[@@ b`; @p` ;  @@ @@0 &2@`&A@%B  (? A@@8) 1@@08!`0@ A"!@" @ @p_ @ b@@`h @@  @aA@`À1AB 1sqaq HCB @HD0@P@ PH@PP |&@3P0D  pP " -  `10 0@ @@ ? #!0 # (BP @: 0p p p@    8 8B~@@p@ 0"d`@H@0"` @H@ ! "p@@ K <>? 2 @ K "@@* p b8@@&0` @ @pĀ @H] B@0 @@@C@< 0< A@@ A p(A@`@  @@ `@@@ 8 @0  @` @@`@<@@@@ @N`  D @$` @#X@@"  @D@@H@HP@H@@ @A@@#@p0 @   @0 ` `(!@ 0p' @*`6, @GxD@D8@:G  "@`b@@@BB|FH00 ` @@ @ `80p@|:|8 x@?{@~?0@`> ݟ~??``x8 `0c00<C??~x?x?}p8savi1.6.0/maps/world.cyl.pbm0000644000175000017500000005375714423445060015033 0ustar lloydlloydP4 600 300 8`;0<? ?ao?~e߃xq?<}w< pA'~~8@|@Qz0D@^ @@ pn,@8  C@'x8<>@ q?(8yx` @=D$h aq"<@A  A[@H! <h}@<Pp&a! l`tq> x 0 "?@h `~kH@p8Rp m @xL `@>4  &2[0h pfx,  8' @00A@/x @@< p `!@pN `@l1` -C  NX@ -$` H 8@ HG$d 9>."`#d`>{ !$dg}8 ` "{8  0Q,>p `/8$d8 >8# ; 1B"?0 0 @x &Z>@ 0@ ?ac΁!p#p @ `@y#  AB@`~&& @ @B?@|@ !` 00C@8L0@  @ 04` P_`  ?p?" PpBF  @@@"0@  "P( s0@@" 0%:#Ȁ@B`8 A@L@G O3`  x"  )@  DaӀ>@!<b@DO"Ap`@, 0B 9A"a 0 B @$~  _B@ X@B` F8@B @ @hD@! `@@AH  $@@B@@@A8@@ @"  @@-K?" @AT Nc0 ])?w `  )(  P $ @ < p"@`% ;D1#?BxbDF6!   0$ @ ` $C`~ 0 `" H@ `È@E@24x0@ @ $ @@X@ 0b@ @ǡ@@!0Q@`!p@ ~ >AFX@!L `A x@)aB ~0 @! @@AA!i@ @ @A@C!@@@@<c@D@@ `bC`@`@f`(@aK0@  D:(@$~@@D| @ @@DtH 0a@F`D   @(!E8  D!0H( ( < @HH@ @i  (H0py@ @ Bpz0@ @@B   @  @C l (> E&@ d $pK& I( DZ%  $ D0b? B   a @@ a8x@@@!` @@@@ @S@ @Ѐ +0@A -@@  8<@ (  @@  | @0(D@"  >$0`@ ( @@ @ @p `@@ @0 A0!P$@`@ 1p,< 0$@ @1@( 0$ @ $ z@(  @4,`dsHB @D@| (" H@ B 1*Pr2!: P"N @,1XPR @LHP  "Xx@&`  D BP("Dp6 "0  @0@ ? H <08@D G ȐDI F0@  I H @I @$@@  T@"$@@"( B<` p $@1` CN(@A@`xA@ @H@@ `@ * ` 1 ``@ @P(1t  р<"d`?0p(5"q`O  ! %x   "'``@ "*`@@ ( `   @  @`BAD x BF@ @   "@@A @@@@ ~@@@@!@@@@@2@@@@p*& @@ ` eVa!#@@ 1 @ ` @@0@0N@ 88% @  @ `     T@  J9@  @@ , ߀@@ @0@  @ @ @0@ 2  P ! 8@ A@ @0  X` @F!4 @@ "  `H  ` J@ ~@ `@  @A  @ @@@!H@" @p@@$  @0@@@$p@` " @@  "@  b H`&C`@ @  `@@@ @B @ @@D @@ @L` @ `>p0@ ` @`@0@ 0@@ @@1  @0    @  00@0 @P I y @ @ @  $  8  @ $8 @@ 0 @ 0 ? @ 8 1`   "0"H"$DhD0D~DH@H  H0 H( %D0D` @@0HPH  @@Ѐ`?@@ l?p>?0?? ;`` <p? x~!?O8? ??|savi1.6.0/README0000644000175000017500000005464114423445060012327 0ustar lloydlloydREADME for SaVi - SATELLITE CONSTELLATION SIMULATION AND VISUALIZATION ====================================================================== $Id: README 206 2023-04-29 02:18:02Z lloydwood $ This README supplied with the SaVi satellite visualization software contains the following sections: 1. Introduction to SaVi - SaVi is described and places to obtain the latest SaVi are given. 2. Requirements for SaVi - Optional packages enhancing SaVi are also described. 3. SaVi and Geomview - SaVi's optional use of Geomview for 3D rendering is outlined. 4. Installation instructions for SaVi - how to compile SaVi from source. Read and follow this section. 5. Running the SaVi software - how to launch SaVi, with or without Geomview. Read this section. 6. Command-line switches for SaVi - things that can be selected when launching SaVi. 7. Contributing to SaVi - notes for programmers. 8. Version history of SaVi - a brief overview of major developments in SaVi. 9. Acknowledgements for SaVi - a list of contributors to the SaVi project. 1. INTRODUCTION TO SAVI ======================= SaVi is software written to facilitate the visualization and analysis of satellite constellations. This software is freely and publically available. We require that use of any images produced by this software credits SaVi and The Geometry Center. A webpage user manual for SaVi is in the manual/ directory. Lloyd Wood, the current SaVi maintainer, welcomes suggestions, patches and improvements to SaVi. Lloyd can be contacted at: lloydwood@users.sourceforge.net See the SaVi webpages: http://savi.sourceforge.net/ http://lloydwood.users.sourceforge.net/Personal/L.Wood/software/SaVi/ http://www.geom.uiuc.edu/projects/visualization/savi.html Support for SaVi is provided via the savi-users mailing list: https://lists.sourceforge.net/lists/listinfo/savi-users SaVi is not a completely polished or finished product. SaVi is not guaranteed to be fit for any purpose. Bugs in the SaVi software are still being discovered and addressed. Users of SaVi are responsible for verifying for themselves that their simulations are sufficiently accurate to be useful for their purposes. Known bugs and possible future features of SaVi are discussed in the textfile BUGS. Please report problems with your use of SaVi to the savi-users mailing list. SaVi is originally Copyright (c) 1995-1997 by The Geometry Center. SaVi is also Copyright (c) 2001-2023 by Lloyd Wood. See the textfile COPYRIGHT for full details. 2. REQUIREMENTS FOR SAVI ======================== SaVi requires: - an ANSI C compiler, e.g. gcc from http://gcc.gnu.org/ - most recently tested and built with gcc 11.2, 8.3, 7.5 and 6.4. previously tested with gcc 5.4, 4.9 back to 4.0, 3.4 to 3.2, and 2.95. or clang from http://clang.llvm.org/ - tested and builds with Apple LLVM 9.0.0 / clang-900. previously tested with clang 3.1. - Tcl and Tk, from http://www.tcl.tk/ - most recently tested with Tcl/Tk 8.6 releases and ActiveTcl 8.6.4. Use of the Http package for loading TLEs from the web demands a minimum of Tcl/Tk 8.0. Use of the Tk color picker and load/save file dialogs demands a minimum of Tcl/Tk 7.6/4.2. Tcl/Tk 8.x gives increased performance, and is recommended. If an existing installation of Tcl does not include header files, e.g. /usr/include/tcl.h, you should be able to add these by installing the tk-devel and tcl-devel packages (Red Hat, Fedora) or the tcl-dev and tk-dev packages (Debian, Ubuntu). The savi wrapper script in this directory, and the Makefile_defs_ files in the src/ directory, assume that Tcl/Tk 8.5 are available, and will need to be edited if other versions are used. On RedHat/Fedora/CentOS etc. try: sudo yum install tk-devel On Ubuntu/Debian etc. try: sudo apt-get install tk-dev SaVi can optionally use, and is far more useful with, these recommended packages: - Geomview, discussed below, for three-dimensional animations. - most recently tested with Geomview 1.9.5. On Ubuntu/Debian etc. try: sudo apt-get install geomview - gifsicle, from http://lcdf.org/gifsicle/ for saving animations of satellite coverage. - most recently tested with LCDF Gifsicle 1.92. On Ubuntu/Debian etc. try: sudo apt-get install gifsicle - lynx, from https://lynx.browser.org/ for handling https or other downloads of TLEs (elsets) - most recently tested with lynx 2.9.0 On Ubuntu/Debian etc. try: sudo apt-get install lynx SaVi may also optionally use, but does not in any way require: - the jpegtopnm utility, from the netpbm package available at http://netpbm.sourceforge.net/ for Geomview to uncompress and display the detailed Earth map that is included with SaVi. On RedHat/Fedora/CentOS etc. try: sudo yum install netpbm On Ubuntu/Debian etc. try: sudo apt-get install netpbm - the zlib compression library, from http://www.zlib.net/ for compressing texturemap images sent to Geomview. - most recently tested with zlib 1.2.11. zlib is most useful with Geomview. To build with zlib to compress dynamic texturemaps that are sent to Geomview, edit src/Makefile to remove the -DNO_ZLIB flag. On RedHat/Fedora/CentOS etc. try: sudo yum install zlib-devel On Ubuntu/Debian etc. try: sudo apt-get install zlib1g-dev SaVi has been successfully compiled and run on the following architectures and unix-like operating systems: - Intel x86 and PowerPC / Macintosh OS X (10.12.6, 10.11.6, 10.9.5, 10.7.2, 10.6.8, 10.5.8, 10.4.11) Mac users - you must read the BUGS file! A section there discusses Mac-specific problems and workarounds for those problems. - Intel x86 / Windows running Cygwin (most recently tested with 3.3.5, previously Cygwin 3.0.7, 2.9.0, 1.7.10 to .29 and 1.5.9-1 to .25-11) Cygwin users - Insight Tcl/Tk 8.4 was replaced by a more conventional unix port of 8.5 in October 2011. If you are still using Insight and haven't updated, build with: make ARCH=cygwin84 instead of cygwin. - Intel x86 / Windows 10 Anniversary Update Install Windows Subsystem for Linux from the Microsoft Store, then install Ubuntu. For X display you can install and run the Xming web server from http://xming.sf.net/ and then launch bash and type: sudo apt-get install savi sudo apt-get install geomview set DISPLAY=:0 geomview -run savi - Intel x86 / Linux (Ubuntu 20 back to 8; CentOS 6.5, Fedora 12; Red Hat 6.x, 7.x and Enterprise 3.0; Mandrake 9.0; Mandriva One 2010) - Intel x86 / FreeBSD (6.0, 8.1) - Sun SPARC / Solaris (2.4 and later, 10) - SGI / Irix5 SaVi is 64-bit clean. 3. SAVI AND GEOMVIEW ==================== SaVi can optionally use Geomview for 3D rendering of Earth and satellites. Geomview requires a unix-like operating system and an X Window display. SaVi can be run either as a stand-alone program, or as an "external module" for the Geomview program. The latter mode enables three-dimensional visualization of the satellite constellations, but also requires Geomview. Geomview is available from: http://www.geomview.org/ http://geomview.sourceforge.net/ On Ubuntu/Debian etc., where these packages are maintained: sudo apt-get install geomview sudo apt-get install savi geomview -run savi will save you the effort of compiling Geomview or SaVi. SaVi was most recently tested with Geomview 1.9.5. SaVi supports 3D texturemapping of the Earth sphere to Geomview, if OpenGL is supported. If this is not viewable, due to graphics drivers or other problems, try turning off OpenGL use with: geomview -noopengl -run savi OpenGL and texturemapping are discussed in further detail in README-COVERAGE-TEXTUREMAPPING, also accessible from SaVi's Help menu. Discussion of maintaining and building Geomview on various platforms can be found in the geomview-users mailing list archives: http://lists.sourceforge.net/lists/listinfo/geomview-users Instructions for building Geomview under Microsoft Windows with Cygwin are available from: http://savi.sourceforge.net/install/ Geomview, like SaVi, was originally available from the Geometry Center: http://www.geom.uiuc.edu/software/download/geomview.html The Geometry Center was at the University of Minnesota (umn), and its webserver content is now hosted at the University of Illinois at Urbana-Champaign (uiuc). Contracted work with Geomview can be undertaken by Geometry Technologies: http://www.geomtech.com/ 4. INSTALLATION INSTRUCTIONS FOR SAVI ===================================== For the remainder of this file, we shall refer to the directory originally containing this README file, the root of the SaVi tree, as $SAVI. That is, if you are a user and have unpacked SaVi in your home directory, then $SAVI would be the topmost SaVi directory ~user/saviX.Y.Z that contains this README file that you are now reading. This is a shorthand; $SAVI is determined by the $SAVI/savi script that launches SaVi. 1.) In $SAVI/src/Makefile_defs_ARCH (where ARCH is linux, cygwin, macosx, sun, freebsd, irix or ubuntu) you may need to edit some variables to suit your system. If your system is current with recent versions of Tcl and Tk installed, and everything is in its usual place, the generic definitions file, called "Makefile_defs_", may work perfectly, and typing 'make' in SaVi's topmost directory may be sufficient to compile the C files in src/ and index the Tcl files in tcl/. If not, choose the Makefile_defs_ file most suitable for your system and: - ensure that the variables are set to give the locations and correct versions of the Tcl/Tk libraries and header include files. - ensure that the CC variable is set to an available ANSI C compiler, e.g. gcc 2.) Return to the topmost SaVi directory $SAVI. Once in that directory, type e.g. 'make ARCH=linux' (or cygwin, or macosx, or sun, or freebsd, or irix, or ubuntu) in the topmost $SAVI directory. Typing just 'make' in the topmost directory will use the default Makefile_defs_ file. 3.) You may also need to edit the locations of the Tcl and Tk libraries in $SAVI/savi at the TCL_LIBRARY and TK_LIBRARY lines when linking dynamically. If running the savi script to launch SaVi generates Tcl or Tk errors, it is often because either the TCL_LIBRARY or TK_LIBRARY lines need to be corrected in that shell wrapper, or because make was not done using the top-level Makefile in the $SAVI directory. SaVi needs $SAVI/tcl/tclIndex to run. That tcl/tclIndex file must be generated by the tcl/Makefile that, like all other subdirectory Makefiles, is called by the top-level master Makefile in the same directory as this README file. 4.) SaVi allows binaries for multiple architectures to co-exist on a shared filesystem, by running the appropriately-named binary: bin/SaVi-$ARCH.bin The most recently compiled executable is also available as: bin/SaVi To save disk space on filesystems used by only one architecture and avoid messages saying which binary copy was selected to be run, you can rm bin/SaVi-*.bin, leaving the single bin/SaVi executable. This has the advantage of displaying just 'SaVi' as the process name. This is very useful for Mac OS X, where that name is shown in the menubar. 5. RUNNING THE SAVI SOFTWARE ============================ As in the previous section, we refer to the directory containing this README file as $SAVI. Always launch SaVi using the savi script in this directory. Do not run the binary executable directly. 1.) To run SaVi standalone, without needing Geomview, in the $SAVI directory type: ./savi Or from any other directory, $SAVI/savi where $SAVI is the path of the savi directory. To load in a satellites tcl scriptfile directly, type: ./savi filename SaVi supports a number of command-line switches, many related to use with Geomview. To see these, type: ./savi -help 2.) To run SaVi as a module within Geomview, for 3D rendering, when in the $SAVI directory start up Geomview: geomview and then select "SaVi" from Geomview's scrollable list of external modules, where it will have appeared. Or invoke directly: geomview -run ./savi [flags]