From a7be2fd2981da28322be0872b11e1059d6571e6d Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Thu, 1 Apr 2021 21:58:31 -0400 Subject: [PATCH] From https://www.jwz.org/xscreensaver/xscreensaver-6.00.tar.gz -rw-rw-r-- 1 zblaxell zblaxell 27786617 Apr 1 19:32 xscreensaver-6.00.tar.gz 13ac90c2b684626da363a899021ad3509434c3cb xscreensaver-6.00.tar.gz --- INSTALL | 32 +- Makefile.in | 171 +- OSX/InvertedSlider.h | 6 +- OSX/InvertedSlider.m | 24 +- OSX/Makefile | 63 +- OSX/PrefsReader.m | 6 + OSX/PxPlus_IBM_VGA8.ttf | Bin 70956 -> 0 bytes OSX/README | 94 +- OSX/Randomizer.h | 18 + OSX/Randomizer.m | 1590 ++ OSX/Randomizer.plist | 36 + OSX/SaverListController.m | 37 +- OSX/SaverRunner.h | 10 +- OSX/SaverRunner.m | 263 +- OSX/SaverRunner.plist | 26 +- OSX/Updater.plist | 36 +- OSX/XScreenSaver.plist | 18 +- OSX/XScreenSaverConfigSheet.h | 6 +- OSX/XScreenSaverConfigSheet.m | 149 +- OSX/XScreenSaverGLView.m | 19 + OSX/XScreenSaverSubclass.m | 65 +- OSX/XScreenSaverView.h | 6 +- OSX/XScreenSaverView.m | 195 +- OSX/YearlReg.ttf | Bin 44984 -> 0 bytes OSX/bindist.rtf | 4 +- OSX/build-fntable.pl | 39 +- OSX/gallant19.bdf | 13691 ---------------- OSX/iSaverRunner.ai | 3771 ++--- OSX/iSaverRunner.plist | 40 +- OSX/ios-function-table.m | 487 +- OSX/textclient-ios.m | 13 +- OSX/update-info-plist.pl | 76 +- OSX/updates.xml | 24 +- OSX/xscreensaver.xcodeproj/project.pbxproj | 638 +- .../xcschemes/Abstractile.xcscheme | 110 + .../xcschemes/All Savers (OpenGL).xcscheme | 91 + .../xcschemes/All Savers (XLockmore).xcscheme | 91 + .../All Savers (XScreenSaver).xcscheme | 91 + .../xcschemes/All Savers.xcscheme | 91 + .../xcshareddata/xcschemes/Anemone.xcscheme | 98 + .../xcschemes/Anemotaxis.xcscheme | 98 + .../xcshareddata/xcschemes/Ant.xcscheme | 98 + .../xcschemes/AntInspect.xcscheme | 98 + .../xcshareddata/xcschemes/AntMaze.xcscheme | 98 + .../xcschemes/AntSpotlight.xcscheme | 98 + .../xcschemes/Apollonian.xcscheme | 98 + .../xcschemes/Apple2-OSX.xcscheme | 101 + .../xcschemes/Apple2-iOS.xcscheme | 87 + .../xcshareddata/xcschemes/Apple2.xcscheme | 98 + .../xcshareddata/xcschemes/Atlantis.xcscheme | 98 + .../xcschemes/Attraction.xcscheme | 98 + .../xcshareddata/xcschemes/Atunnel.xcscheme | 98 + .../xcshareddata/xcschemes/BSOD.xcscheme | 98 + .../xcshareddata/xcschemes/Barcode.xcscheme | 105 + .../xcshareddata/xcschemes/Beats.xcscheme | 85 + .../xcschemes/BinaryRing.xcscheme | 94 + .../xcshareddata/xcschemes/Blaster.xcscheme | 98 + .../xcshareddata/xcschemes/BlinkBox.xcscheme | 98 + .../xcshareddata/xcschemes/BlitSpin.xcscheme | 98 + .../xcshareddata/xcschemes/BlockTube.xcscheme | 98 + .../xcshareddata/xcschemes/Boing.xcscheme | 98 + .../xcshareddata/xcschemes/Bouboule.xcscheme | 98 + .../xcschemes/BouncingCow.xcscheme | 98 + .../xcshareddata/xcschemes/BoxFit.xcscheme | 98 + .../xcshareddata/xcschemes/Boxed.xcscheme | 98 + .../xcshareddata/xcschemes/Braid.xcscheme | 98 + .../xcshareddata/xcschemes/Bubble3D.xcscheme | 98 + .../xcshareddata/xcschemes/Bubbles.xcscheme | 98 + .../xcshareddata/xcschemes/Bumps.xcscheme | 98 + .../xcshareddata/xcschemes/CCurve.xcscheme | 98 + .../xcshareddata/xcschemes/COVID19.xcscheme | 85 + .../xcshareddata/xcschemes/CWaves.xcscheme | 98 + .../xcshareddata/xcschemes/Cage.xcscheme | 98 + .../xcshareddata/xcschemes/Carousel.xcscheme | 98 + .../xcshareddata/xcschemes/Celtic.xcscheme | 98 + .../xcshareddata/xcschemes/Circuit.xcscheme | 98 + .../xcshareddata/xcschemes/Cityflow.xcscheme | 94 + .../xcshareddata/xcschemes/CloudLife.xcscheme | 98 + .../xcschemes/CompanionCube.xcscheme | 112 + .../xcshareddata/xcschemes/Compass.xcscheme | 98 + .../xcshareddata/xcschemes/Coral.xcscheme | 98 + .../xcshareddata/xcschemes/Crackberg.xcscheme | 98 + .../xcshareddata/xcschemes/Critical.xcscheme | 98 + .../xcshareddata/xcschemes/Crumbler.xcscheme | 94 + .../xcshareddata/xcschemes/Crystal.xcscheme | 98 + .../xcshareddata/xcschemes/Cube21.xcscheme | 98 + .../xcshareddata/xcschemes/CubeStack.xcscheme | 94 + .../xcshareddata/xcschemes/CubeStorm.xcscheme | 98 + .../xcshareddata/xcschemes/CubeTwist.xcscheme | 94 + .../xcshareddata/xcschemes/Cubenetic.xcscheme | 98 + .../xcshareddata/xcschemes/CubicGrid.xcscheme | 98 + .../xcshareddata/xcschemes/Cynosure.xcscheme | 98 + .../xcshareddata/xcschemes/DNAlogo.xcscheme | 120 + .../xcschemes/DangerBall.xcscheme | 98 + .../xcschemes/DecayScreen.xcscheme | 98 + .../xcshareddata/xcschemes/Deco.xcscheme | 98 + .../xcshareddata/xcschemes/DeepStars.xcscheme | 94 + .../xcshareddata/xcschemes/Deluxe.xcscheme | 107 + .../xcshareddata/xcschemes/Demon.xcscheme | 98 + .../xcshareddata/xcschemes/Discoball.xcscheme | 94 + .../xcshareddata/xcschemes/Discrete.xcscheme | 98 + .../xcshareddata/xcschemes/Distort.xcscheme | 98 + .../xcshareddata/xcschemes/Drift.xcscheme | 98 + .../xcschemes/DymaxionMap.xcscheme | 94 + .../xcshareddata/xcschemes/Endgame.xcscheme | 98 + .../xcschemes/EnergyStream.xcscheme | 94 + .../xcshareddata/xcschemes/Engine.xcscheme | 98 + .../xcshareddata/xcschemes/Epicycle.xcscheme | 98 + .../xcshareddata/xcschemes/Eruption.xcscheme | 98 + .../xcshareddata/xcschemes/Esper.xcscheme | 94 + .../xcschemes/EtruscanVenus.xcscheme | 85 + .../xcshareddata/xcschemes/Euler2D.xcscheme | 98 + .../xcshareddata/xcschemes/Extrusion.xcscheme | 98 + .../xcshareddata/xcschemes/FadePlot.xcscheme | 98 + .../xcshareddata/xcschemes/Fiberlamp.xcscheme | 98 + .../xcschemes/FilmLeader.xcscheme | 94 + .../xcshareddata/xcschemes/Fireworkx.xcscheme | 98 + .../xcshareddata/xcschemes/Flag.xcscheme | 98 + .../xcshareddata/xcschemes/Flame.xcscheme | 98 + .../xcshareddata/xcschemes/FlipFlop.xcscheme | 98 + .../xcschemes/FlipScreen3D.xcscheme | 98 + .../xcshareddata/xcschemes/FlipText.xcscheme | 98 + .../xcshareddata/xcschemes/Flow.xcscheme | 98 + .../xcschemes/FluidBalls.xcscheme | 98 + .../xcschemes/FlyingToasters.xcscheme | 98 + .../xcshareddata/xcschemes/FontGlide.xcscheme | 98 + .../xcshareddata/xcschemes/Forest.xcscheme | 98 + .../xcschemes/FuzzyFlakes.xcscheme | 98 + .../xcshareddata/xcschemes/GFlux.xcscheme | 98 + .../xcshareddata/xcschemes/GLBlur.xcscheme | 98 + .../xcshareddata/xcschemes/GLCells.xcscheme | 98 + .../xcschemes/GLForestFire.xcscheme | 98 + .../xcshareddata/xcschemes/GLHanoi.xcscheme | 98 + .../xcshareddata/xcschemes/GLKnots.xcscheme | 98 + .../xcshareddata/xcschemes/GLMatrix.xcscheme | 98 + .../xcshareddata/xcschemes/GLPlanet.xcscheme | 98 + .../xcshareddata/xcschemes/GLSchool.xcscheme | 98 + .../xcschemes/GLSlideshow.xcscheme | 98 + .../xcshareddata/xcschemes/GLSnake.xcscheme | 98 + .../xcshareddata/xcschemes/GLText.xcscheme | 98 + .../xcshareddata/xcschemes/Galaxy.xcscheme | 98 + .../xcshareddata/xcschemes/Gears.xcscheme | 98 + .../xcshareddata/xcschemes/Geodesic.xcscheme | 94 + .../xcschemes/GeodesicGears.xcscheme | 94 + .../xcshareddata/xcschemes/Gibson.xcscheme | 85 + .../xcschemes/Gleidescope.xcscheme | 98 + .../xcshareddata/xcschemes/GlitchPEG.xcscheme | 94 + .../xcshareddata/xcschemes/Goop.xcscheme | 98 + .../xcshareddata/xcschemes/Grav.xcscheme | 98 + .../xcschemes/GravityWell.xcscheme | 94 + .../xcshareddata/xcschemes/Greynetic.xcscheme | 98 + .../xcshareddata/xcschemes/Halftone.xcscheme | 98 + .../xcshareddata/xcschemes/Halo.xcscheme | 98 + .../xcshareddata/xcschemes/Handsy.xcscheme | 94 + .../xcshareddata/xcschemes/Headroom.xcscheme | 85 + .../xcshareddata/xcschemes/Helix.xcscheme | 98 + .../xcshareddata/xcschemes/Hexadrop.xcscheme | 99 + .../xcshareddata/xcschemes/Hexstrut.xcscheme | 94 + .../xcshareddata/xcschemes/Hilbert.xcscheme | 112 + .../xcshareddata/xcschemes/Hopalong.xcscheme | 98 + .../xcshareddata/xcschemes/Hydrostat.xcscheme | 94 + .../xcshareddata/xcschemes/HyperBall.xcscheme | 98 + .../xcshareddata/xcschemes/HyperCube.xcscheme | 98 + .../xcschemes/Hypertorus.xcscheme | 98 + .../xcschemes/Hypnowheel.xcscheme | 98 + .../xcshareddata/xcschemes/IFS.xcscheme | 98 + .../xcshareddata/xcschemes/IMSMap.xcscheme | 98 + .../xcschemes/Interaggregate.xcscheme | 98 + .../xcschemes/Interference.xcscheme | 98 + .../xcschemes/Intermomentary.xcscheme | 98 + .../xcschemes/JigglyPuff.xcscheme | 98 + .../xcshareddata/xcschemes/Jigsaw.xcscheme | 98 + .../xcshareddata/xcschemes/Juggle.xcscheme | 98 + .../xcshareddata/xcschemes/Juggler3D.xcscheme | 98 + .../xcshareddata/xcschemes/Julia.xcscheme | 98 + .../xcschemes/Kaleidescope.xcscheme | 98 + .../xcschemes/Kaleidocycle.xcscheme | 98 + .../xcshareddata/xcschemes/Klein.xcscheme | 98 + .../xcshareddata/xcschemes/Kumppa.xcscheme | 98 + .../xcshareddata/xcschemes/LCDscrub.xcscheme | 98 + .../xcshareddata/xcschemes/LMorph.xcscheme | 98 + .../xcshareddata/xcschemes/Lament.xcscheme | 98 + .../xcshareddata/xcschemes/Laser.xcscheme | 98 + .../xcshareddata/xcschemes/Lavalite.xcscheme | 98 + .../xcshareddata/xcschemes/Lightning.xcscheme | 98 + .../xcshareddata/xcschemes/Lisa.xcscheme | 98 + .../xcshareddata/xcschemes/Lissie.xcscheme | 98 + .../xcshareddata/xcschemes/Lockward.xcscheme | 98 + .../xcshareddata/xcschemes/Loop.xcscheme | 98 + .../xcshareddata/xcschemes/Maze.xcscheme | 98 + .../xcshareddata/xcschemes/Maze3D.xcscheme | 117 + .../xcschemes/MemScroller.xcscheme | 98 + .../xcshareddata/xcschemes/Menger.xcscheme | 98 + .../xcshareddata/xcschemes/MetaBalls.xcscheme | 98 + .../xcschemes/MirrorBlob.xcscheme | 98 + .../xcshareddata/xcschemes/Moebius.xcscheme | 98 + .../xcschemes/MoebiusGears.xcscheme | 98 + .../xcshareddata/xcschemes/Moire.xcscheme | 98 + .../xcshareddata/xcschemes/Moire2.xcscheme | 98 + .../xcshareddata/xcschemes/Molecule.xcscheme | 98 + .../xcshareddata/xcschemes/Morph3D.xcscheme | 98 + .../xcshareddata/xcschemes/Mountain.xcscheme | 98 + .../xcshareddata/xcschemes/Munch.xcscheme | 98 + .../xcshareddata/xcschemes/NerveRot.xcscheme | 98 + .../xcshareddata/xcschemes/Noof.xcscheme | 98 + .../xcshareddata/xcschemes/NoseGuy.xcscheme | 98 + .../xcshareddata/xcschemes/Obsolete.xcscheme | 98 + .../xcshareddata/xcschemes/Pacman.xcscheme | 98 + .../xcshareddata/xcschemes/Pedal.xcscheme | 98 + .../xcshareddata/xcschemes/Peepers.xcscheme | 94 + .../xcshareddata/xcschemes/Penetrate.xcscheme | 98 + .../xcshareddata/xcschemes/Penrose.xcscheme | 98 + .../xcshareddata/xcschemes/Petri.xcscheme | 98 + .../xcschemes/Phosphor-OSX.xcscheme | 101 + .../xcschemes/Phosphor-iOS.xcscheme | 87 + .../xcshareddata/xcschemes/Phosphor.xcscheme | 98 + .../xcshareddata/xcschemes/Photopile.xcscheme | 98 + .../xcshareddata/xcschemes/Piecewise.xcscheme | 98 + .../xcshareddata/xcschemes/Pinion.xcscheme | 98 + .../xcshareddata/xcschemes/Pipes.xcscheme | 98 + .../xcshareddata/xcschemes/Polyhedra.xcscheme | 98 + .../xcschemes/Polyominoes.xcscheme | 98 + .../xcshareddata/xcschemes/Polytopes.xcscheme | 98 + .../xcshareddata/xcschemes/Pong.xcscheme | 98 + .../xcschemes/PopSquares.xcscheme | 98 + .../xcschemes/ProjectivePlane.xcscheme | 94 + .../xcschemes/Providence.xcscheme | 98 + .../xcshareddata/xcschemes/Pulsar.xcscheme | 98 + .../xcshareddata/xcschemes/Pyro.xcscheme | 98 + .../xcshareddata/xcschemes/Qix.xcscheme | 98 + .../xcschemes/QuasiCrystal.xcscheme | 98 + .../xcshareddata/xcschemes/Queens.xcscheme | 98 + .../xcshareddata/xcschemes/RDbomb.xcscheme | 98 + .../xcschemes/RandomXScreenSaver.xcscheme | 86 + .../xcshareddata/xcschemes/RaverHoop.xcscheme | 94 + .../xcschemes/RazzleDazzle.xcscheme | 94 + .../xcshareddata/xcschemes/Ripples.xcscheme | 98 + .../xcshareddata/xcschemes/Rocks.xcscheme | 98 + .../xcshareddata/xcschemes/RomanBoy.xcscheme | 94 + .../xcshareddata/xcschemes/Rorschach.xcscheme | 98 + .../xcshareddata/xcschemes/RotZoomer.xcscheme | 98 + .../xcshareddata/xcschemes/Rotor.xcscheme | 98 + .../xcshareddata/xcschemes/Rubik.xcscheme | 98 + .../xcschemes/RubikBlocks.xcscheme | 98 + .../xcshareddata/xcschemes/SBalls.xcscheme | 98 + .../xcschemes/SaverTester.xcscheme | 91 + .../xcshareddata/xcschemes/Scooter.xcscheme | 85 + .../xcshareddata/xcschemes/ShadeBobs.xcscheme | 98 + .../xcschemes/Sierpinski.xcscheme | 98 + .../xcschemes/Sierpinski3D.xcscheme | 98 + .../xcschemes/SkyTentacles.xcscheme | 98 + .../xcschemes/SlideScreen.xcscheme | 98 + .../xcshareddata/xcschemes/Slip.xcscheme | 98 + .../xcshareddata/xcschemes/Sonar.xcscheme | 98 + .../xcshareddata/xcschemes/SpeedMine.xcscheme | 98 + .../xcshareddata/xcschemes/Sphere.xcscheme | 98 + .../xcschemes/SphereEversion.xcscheme | 85 + .../xcschemes/Spheremonics.xcscheme | 98 + .../xcshareddata/xcschemes/Spiral.xcscheme | 98 + .../xcshareddata/xcschemes/SplitFlap.xcscheme | 96 + .../xcshareddata/xcschemes/Splodesic.xcscheme | 94 + .../xcshareddata/xcschemes/Spotlight.xcscheme | 98 + .../xcschemes/Sproingies.xcscheme | 98 + .../xcshareddata/xcschemes/Squiral.xcscheme | 98 + .../xcshareddata/xcschemes/Stairs.xcscheme | 98 + .../xcshareddata/xcschemes/StarWars.xcscheme | 98 + .../xcshareddata/xcschemes/Starfish.xcscheme | 98 + .../xcschemes/StonerView.xcscheme | 98 + .../xcshareddata/xcschemes/Strange.xcscheme | 98 + .../xcshareddata/xcschemes/Substrate.xcscheme | 98 + .../xcschemes/Superquadrics.xcscheme | 98 + .../xcshareddata/xcschemes/Surfaces.xcscheme | 98 + .../xcshareddata/xcschemes/Swirl.xcscheme | 98 + .../xcshareddata/xcschemes/T3D.xcscheme | 98 + .../xcshareddata/xcschemes/Tangram.xcscheme | 98 + .../xcschemes/Tessellimage.xcscheme | 94 + .../xcschemes/TestX11-iOS.xcscheme | 87 + .../xcshareddata/xcschemes/TestX11.xcscheme | 94 + .../xcshareddata/xcschemes/Thornbird.xcscheme | 98 + .../xcschemes/TimeTunnel.xcscheme | 98 + .../xcshareddata/xcschemes/TopBlock.xcscheme | 98 + .../xcshareddata/xcschemes/Triangle.xcscheme | 98 + .../xcshareddata/xcschemes/TronBit.xcscheme | 112 + .../xcshareddata/xcschemes/Truchet.xcscheme | 98 + .../xcshareddata/xcschemes/Twang.xcscheme | 98 + .../xcshareddata/xcschemes/Unicrud.xcscheme | 94 + .../xcschemes/UnknownPleasures.xcscheme | 94 + .../xcshareddata/xcschemes/VFeedback.xcscheme | 94 + .../xcschemes/Vermiculate.xcscheme | 98 + .../xcshareddata/xcschemes/Vigilance.xcscheme | 94 + .../xcshareddata/xcschemes/Vines.xcscheme | 98 + .../xcshareddata/xcschemes/Voronoi.xcscheme | 98 + .../xcshareddata/xcschemes/Wander.xcscheme | 98 + .../xcschemes/WebCollage.xcscheme | 113 + .../xcschemes/WhirlWindWarp.xcscheme | 98 + .../xcshareddata/xcschemes/Whirlygig.xcscheme | 98 + .../xcschemes/WindupRobot.xcscheme | 94 + .../xcshareddata/xcschemes/Worm.xcscheme | 98 + .../xcshareddata/xcschemes/Wormhole.xcscheme | 98 + .../xcshareddata/xcschemes/XAnalogTV.xcscheme | 98 + .../xcshareddata/xcschemes/XFlame.xcscheme | 98 + .../xcshareddata/xcschemes/XJack.xcscheme | 98 + .../xcshareddata/xcschemes/XLyap.xcscheme | 98 + .../xcshareddata/xcschemes/XMatrix.xcscheme | 98 + .../xcshareddata/xcschemes/XRaySwarm.xcscheme | 98 + .../xcschemes/XScreenSaver-iOS.xcscheme | 104 + .../xcschemes/XScreenSaverUpdater.xcscheme | 87 + .../xcschemes/XSpirograph.xcscheme | 98 + .../xcshareddata/xcschemes/Zoom.xcscheme | 106 + .../xcshareddata/xcschemes/enable_gc.xcscheme | 87 + .../xcschemes/images_png_h.xcscheme | 76 + .../xcshareddata/xcschemes/jwxyz.xcscheme | 71 + .../xcshareddata/xcschemes/m6502.h.xcscheme | 71 + .../xcshareddata/xcschemes/m6502.xcscheme | 88 + .../xcschemes/molecules.h.xcscheme | 81 + .../xcschemes/xcschememanagement.plist | 2862 ++++ README | 89 +- README.VMS | 57 - README.hacking | 26 + aclocal.m4 | 2 +- android/Makefile | 73 +- android/README | 33 +- android/android.iml | 19 - android/screenhack-android.c | 13 +- android/xscreensaver/#build.gradle# | 114 - android/xscreensaver/assets/fonts/OCRAStd.otf | 2 +- .../assets/fonts/SpecialElite.ttf | 1 + android/xscreensaver/assets/fonts/clacon.ttf | 1 + .../assets/fonts/gallant12x22.ttf | 2 +- android/xscreensaver/assets/fonts/luximr.ttf | 2 +- android/xscreensaver/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - android/xscreensaver/gradlew | 160 - android/xscreensaver/gradlew.bat | 90 - android/xscreensaver/jni/Android.mk | 9 +- android/xscreensaver/jni/Application.mk | 2 +- android/xscreensaver/project.properties | 2 +- android/xscreensaver/xscreensaver.iml | 101 - ax_pthread.m4 | 448 +- config.guess | 578 +- config.h-vms | 284 - config.h.in | 184 +- config.sub | 2570 +-- configure | 6004 ++++--- configure.ac | 2163 ++- driver/Makefile.in | 1056 +- driver/XScreenSaver-Xm.ad | 2 +- driver/XScreenSaver.ad.in | 540 +- driver/XScreenSaver_ad.h | 374 +- driver/atoms.c | 70 + driver/atoms.h | 38 + driver/atomswm.c | 101 + driver/auth.h | 79 +- driver/blurb.c | 50 + driver/blurb.h | 11 + driver/clientmsg.c | 123 + driver/clientmsg.h | 19 + driver/compile_axp.com | 15 - driver/compile_decc.com | 15 - driver/demo-Gtk-conf.c | 9 +- driver/demo-Gtk.c | 336 +- driver/demo-Xm-widgets.c | 49 +- driver/demo-Xm.c | 166 +- driver/dialog.c | 2507 +++ driver/dpms.c | 190 +- driver/exec.c | 32 +- driver/exts.c | 238 + driver/fade.c | 1749 ++ {utils => driver}/fade.h | 13 +- driver/link_axp.com | 15 - driver/link_decc.com | 15 - driver/lock.c | 2285 --- driver/mlstring.c | 229 - driver/mlstring.h | 57 - driver/passwd-helper.c | 64 +- driver/passwd-kerberos.c | 45 +- driver/passwd-pam.c | 312 +- driver/passwd-pwent.c | 110 +- driver/passwd.c | 319 +- driver/pdf2jpeg.m | 152 - driver/pdf2jpeg.man | 43 - driver/prefs.c | 1696 +- driver/prefs.h | 28 +- driver/prefsw.c | 1555 ++ driver/remote.c | 284 +- driver/remote.h | 3 +- driver/screens.c | 608 +- driver/screens.h | 37 + driver/screensaver-properties.desktop.in | 2 +- driver/setuid.c | 229 +- driver/splash.c | 917 -- driver/stderr.c | 568 - driver/subprocs.c | 1299 +- driver/test-apm.c | 101 - driver/test-fade.c | 172 +- driver/test-grab.c | 146 +- driver/test-mlstring.c | 312 - driver/test-passwd.c | 333 +- driver/test-randr.c | 25 +- driver/test-screens.c | 31 +- driver/test-uid.c | 14 +- driver/test-vp.c | 24 +- driver/test-xdpms.c | 47 +- driver/test-xinerama.c | 26 +- driver/test-xinput.c | 306 + driver/test-xkb.c | 89 + driver/test-yarandom.c | 3 +- driver/timers.c | 1797 -- driver/types.h | 306 +- driver/vms-getpwnam.c | 129 - driver/vms-hpwd.c | 75 - driver/vms-pwd.h | 48 - driver/vms-validate.c | 75 - driver/vms_axp.opt | 5 - driver/vms_axp_12.opt | 5 - driver/vms_decc.opt | 5 - driver/vms_decc_12.opt | 5 - driver/windows.c | 2072 +-- driver/xdpyinfo.c | 112 +- driver/xinput.c | 381 + driver/xinput.h | 19 + driver/xscreensaver-auth.c | 340 + driver/xscreensaver-auth.man | 27 + driver/xscreensaver-command.c | 150 +- driver/xscreensaver-command.man | 274 +- driver/xscreensaver-getimage-desktop | 174 - driver/xscreensaver-getimage-desktop.man | 55 - driver/xscreensaver-getimage-file.man | 66 - driver/xscreensaver-gfx.c | 595 + driver/xscreensaver-gfx.man | 28 + ...ver-demo.man => xscreensaver-settings.man} | 198 +- driver/xscreensaver-systemd.c | 393 +- driver/xscreensaver-systemd.man | 80 +- driver/xscreensaver.c | 4280 +++-- driver/xscreensaver.h | 138 +- driver/xscreensaver.man | 1174 +- .../{xscreensaver-demo.ui => xscreensaver.ui} | 118 +- driver/xset.c | 391 - hacks/Makefile.in | 347 +- hacks/analogtv-cli.c | 8 +- hacks/analogtv.c | 52 +- hacks/apollonian.c | 141 +- hacks/apple2-main.c | 17 +- hacks/apple2.man | 51 +- hacks/asm6502.c | 11 +- hacks/attraction.man | 22 +- hacks/barcode.c | 4 - hacks/blitspin.man | 6 +- hacks/boxfit.man | 6 +- hacks/bsod.c | 790 +- hacks/bsod.man | 13 - hacks/bubbles.c | 16 +- hacks/bubbles.h | 9 - hacks/bubbles.man | 13 - hacks/bumps.man | 6 +- hacks/check-configs.pl | 62 +- hacks/compass.c | 1 - hacks/compile_axp.com | 158 - hacks/compile_decc.com | 158 - hacks/config/README | 11 +- hacks/config/antinspect.xml | 2 +- hacks/config/antmaze.xml | 2 +- hacks/config/antspotlight.xml | 2 +- hacks/config/apple2.xml | 2 +- hacks/config/binaryring.xml | 2 +- hacks/config/blinkbox.xml | 2 +- hacks/config/blitspin.xml | 2 +- hacks/config/blocktube.xml | 2 +- hacks/config/bouncingcow.xml | 2 +- hacks/config/boxfit.xml | 2 +- hacks/config/bubble3d.xml | 2 +- hacks/config/cage.xml | 4 +- hacks/config/ccurve.xml | 2 +- hacks/config/cityflow.xml | 2 +- hacks/config/cloudlife.xml | 2 +- hacks/config/companioncube.xml | 2 +- hacks/config/cube21.xml | 2 +- hacks/config/cubestack.xml | 2 +- hacks/config/cubestorm.xml | 2 +- hacks/config/cubetwist.xml | 2 +- hacks/config/cubicgrid.xml | 8 +- hacks/config/cwaves.xml | 2 +- hacks/config/dangerball.xml | 2 +- hacks/config/decayscreen.xml | 2 +- hacks/config/deepstars.xml | 2 +- hacks/config/dymaxionmap.xml | 2 +- hacks/config/energystream.xml | 2 +- hacks/config/epicycle.xml | 11 + hacks/config/etruscanvenus.xml | 4 +- hacks/config/euler2d.xml | 2 +- hacks/config/fadeplot.xml | 2 +- hacks/config/fiberlamp.xml | 2 +- hacks/config/filmleader.xml | 2 +- hacks/config/flipflop.xml | 2 +- hacks/config/flipscreen3d.xml | 2 +- hacks/config/fliptext.xml | 2 +- hacks/config/fluidballs.xml | 2 +- hacks/config/flyingtoasters.xml | 2 +- hacks/config/fontglide.xml | 2 +- hacks/config/fuzzyflakes.xml | 2 +- hacks/config/gears.xml | 4 +- hacks/config/geodesicgears.xml | 2 +- hacks/config/glblur.xml | 2 +- hacks/config/glcells.xml | 2 +- hacks/config/glforestfire.xml | 2 +- hacks/config/glhanoi.xml | 2 +- hacks/config/glknots.xml | 2 +- hacks/config/glmatrix.xml | 2 +- hacks/config/glplanet.xml | 2 +- hacks/config/glschool.xml | 2 +- hacks/config/glslideshow.xml | 2 +- hacks/config/glsnake.xml | 2 +- hacks/config/gltext.xml | 2 +- hacks/config/gravitywell.xml | 2 +- hacks/config/hexstrut.xml | 2 +- hacks/config/hyperball.xml | 2 +- hacks/config/hypercube.xml | 2 +- hacks/config/imsmap.xml | 2 +- hacks/config/jigglypuff.xml | 2 +- hacks/config/juggler3d.xml | 2 +- hacks/config/klein.xml | 6 +- hacks/config/lcdscrub.xml | 2 +- hacks/config/maze3d.xml | 2 +- hacks/config/memscroller.xml | 2 +- hacks/config/metaballs.xml | 8 +- hacks/config/mirrorblob.xml | 2 +- hacks/config/moebius.xml | 8 +- hacks/config/moebiusgears.xml | 6 +- hacks/config/moire.xml | 6 +- hacks/config/moire2.xml | 4 +- hacks/config/morph3d.xml | 2 +- hacks/config/nerverot.xml | 2 +- hacks/config/noseguy.xml | 2 +- hacks/config/pacman.xml | 2 +- hacks/config/photopile.xml | 2 +- hacks/config/pinion.xml | 4 +- hacks/config/popsquares.xml | 2 +- hacks/config/projectiveplane.xml | 2 +- hacks/config/quasicrystal.xml | 2 +- hacks/config/raverhoop.xml | 2 +- hacks/config/razzledazzle.xml | 2 +- hacks/config/rd-bomb.xml | 2 +- hacks/config/rdbomb.xml | 1 - hacks/config/romanboy.xml | 4 +- hacks/config/rotzoomer.xml | 2 +- hacks/config/rubikblocks.xml | 2 +- hacks/config/shadebobs.xml | 2 +- hacks/config/sierpinski3d.xml | 2 +- hacks/config/skytentacles.xml | 2 +- hacks/config/slidescreen.xml | 2 +- hacks/config/speedmine.xml | 2 +- hacks/config/sphereeversion.xml | 2 +- hacks/config/spheremonics.xml | 2 +- hacks/config/spiral.xml | 4 +- hacks/config/splitflap.xml | 2 +- hacks/config/starwars.xml | 2 +- hacks/config/stonerview.xml | 2 +- hacks/config/surfaces.xml | 4 +- hacks/config/testx11.xml | 2 +- hacks/config/timetunnel.xml | 2 +- hacks/config/topblock.xml | 2 +- hacks/config/tronbit.xml | 2 +- hacks/config/unknownpleasures.xml | 2 +- hacks/config/vidwhacker.xml | 2 +- hacks/config/webcollage.xml | 2 +- hacks/config/whirlwindwarp.xml | 2 +- hacks/config/winduprobot.xml | 2 +- hacks/critical.man | 4 +- hacks/cwaves.c | 7 +- hacks/decayscreen.man | 6 +- hacks/delaunay.h | 4 - hacks/deluxe.c | 1 - hacks/distort.man | 6 +- hacks/epicycle.man | 37 - hacks/filmleader.c | 40 +- hacks/flag.c | 2 +- hacks/fluidballs.c | 46 +- hacks/fontglide.c | 112 +- hacks/fontglide.man | 4 +- hacks/fonts/Makefile.in | 96 + {OSX => hacks/fonts}/OCRAStd.otf | Bin hacks/fonts/SpecialElite.ttf | Bin 0 -> 166224 bytes hacks/fonts/clacon.ttf | Bin 0 -> 103892 bytes {OSX => hacks/fonts}/gallant12x22.ttf | Bin {OSX => hacks/fonts}/luximr.ttf | Bin hacks/forest.c | 4 - hacks/fps.c | 123 +- hacks/fps.h | 4 - hacks/fpsI.h | 12 +- hacks/glitchpeg.c | 12 +- hacks/glx/Makefile.in | 1222 +- hacks/glx/antinspect.c | 23 +- hacks/glx/antinspect.man | 4 +- hacks/glx/antmaze.c | 14 +- hacks/glx/antmaze.man | 4 +- hacks/glx/antspotlight.c | 12 - hacks/glx/antspotlight.man | 4 +- hacks/glx/atlantis.h | 19 +- hacks/glx/atunnel.c | 3 - hacks/glx/atunnel.man | 13 - hacks/glx/b_lockglue.c | 17 +- hacks/glx/beats.c | 22 +- hacks/glx/blinkbox.c | 19 +- hacks/glx/blocktube.c | 11 +- hacks/glx/boing.c | 2 - hacks/glx/bouncingcow.c | 15 +- hacks/glx/boxed.c | 14 +- hacks/glx/bubble3d.h | 16 +- hacks/glx/buildlwo.c | 4 +- hacks/glx/buildlwo.h | 19 - hacks/glx/cage.c | 12 + hacks/glx/carousel.c | 34 +- hacks/glx/carousel.man | 6 +- hacks/glx/chessmodels.c | 22 +- hacks/glx/circuit.c | 21 +- hacks/glx/cityflow.c | 2 - hacks/glx/co____9.c | 1 - hacks/glx/companion.c | 12 +- hacks/glx/companioncube.man | 6 +- hacks/glx/covid19.c | 11 +- hacks/glx/crackberg.c | 2 - hacks/glx/crumbler.c | 109 +- hacks/glx/cube21.c | 13 +- hacks/glx/cubenetic.c | 11 +- hacks/glx/cubestack.c | 11 +- hacks/glx/cubestorm.c | 11 +- hacks/glx/cubetwist.c | 11 +- hacks/glx/cubicgrid.c | 81 +- hacks/glx/cubicgrid.man | 5 + hacks/glx/dangerball.c | 11 +- hacks/glx/deepstars.c | 3 - hacks/glx/discoball.c | 11 +- hacks/glx/dnalogo.c | 32 +- hacks/glx/dropshadow.c | 7 +- hacks/glx/dropshadow.h | 6 - hacks/glx/dymaxionmap-coords.c | 2 +- hacks/glx/dymaxionmap.c | 13 +- hacks/glx/dymaxionmap.man | 2 +- hacks/glx/endgame.c | 3 - hacks/glx/endgame.man | 4 +- hacks/glx/energystream.c | 2 - hacks/glx/engine.c | 15 +- hacks/glx/esper.c | 97 +- hacks/glx/etruscanvenus.c | 1896 ++- hacks/glx/extrusion.c | 15 - hacks/glx/extrusion.h | 10 +- hacks/glx/flipflop.c | 1168 +- hacks/glx/flipscreen3d.c | 4 - hacks/glx/fliptext.c | 8 +- hacks/glx/fliptext.man | 4 +- hacks/glx/flurry.h | 24 +- hacks/glx/flyingtoasters.c | 11 +- hacks/glx/fps-gl.c | 17 - hacks/glx/gears.c | 11 +- hacks/glx/geodesic.c | 11 +- hacks/glx/geodesicgears.c | 32 +- hacks/glx/geodesicgears.man | 4 +- hacks/glx/gflux.c | 25 +- hacks/glx/gflux.man | 6 +- hacks/glx/gibson.c | 8 +- hacks/glx/glblur.c | 11 +- hacks/glx/glcells.c | 7 - hacks/glx/glcells.man | 2 +- hacks/glx/gleidescope.c | 10 +- hacks/glx/glforestfire.c | 14 - hacks/glx/glforestfire.man | 13 - hacks/glx/glhanoi.c | 13 +- hacks/glx/glknots.c | 11 +- hacks/glx/gllist.h | 19 +- hacks/glx/glmatrix.c | 2 - hacks/glx/glplanet.c | 11 - hacks/glx/glplanet.man | 2 +- hacks/glx/glschool.c | 3 - hacks/glx/glschool_alg.c | 2 +- hacks/glx/glschool_gl.h | 27 +- hacks/glx/glsl-utils.c | 391 + hacks/glx/{glsl_support.h => glsl-utils.h} | 56 +- hacks/glx/glsl_support.c | 266 - hacks/glx/glslideshow.c | 5 +- hacks/glx/glslideshow.man | 6 +- hacks/glx/glsnake.c | 38 +- hacks/glx/glsnake.man | 18 +- hacks/glx/gltext.c | 142 +- hacks/glx/gltext.man | 31 +- hacks/glx/gltrackball.c | 21 +- hacks/glx/glut_stroke.c | 19 +- hacks/glx/glut_swidth.c | 14 +- hacks/glx/grab-ximage.c | 109 +- hacks/glx/gravitywell.c | 4 - hacks/glx/handsy.c | 2 - hacks/glx/headroom.c | 16 +- hacks/glx/hexstrut.c | 11 +- hacks/glx/hilbert.c | 11 +- hacks/glx/hydrostat.c | 11 +- hacks/glx/hypertorus.c | 309 +- hacks/glx/hypnowheel.c | 11 +- hacks/glx/involute.c | 22 - hacks/glx/jigglypuff.c | 18 +- hacks/glx/jigsaw.c | 25 +- hacks/glx/jigsaw.man | 6 +- hacks/glx/juggler3d.c | 4 +- hacks/glx/kaleidocycle.c | 11 +- hacks/glx/kaleidocycle.man | 13 - hacks/glx/klein.c | 2581 ++- hacks/glx/lament.c | 2 - hacks/glx/lavalite.c | 7 +- hacks/glx/lavalite.man | 13 - hacks/glx/lockward.c | 3 - hacks/glx/marching.c | 23 +- hacks/glx/maze3d.c | 3 - hacks/glx/menger.c | 11 +- hacks/glx/mirrorblob.c | 13 +- hacks/glx/moebius.c | 21 +- hacks/glx/moebiusgears.c | 11 +- hacks/glx/molecule.c | 15 +- hacks/glx/morph3d.c | 10 +- hacks/glx/normals.c | 5 +- hacks/glx/normals.h | 18 +- hacks/glx/peepers.c | 3 - hacks/glx/photopile.c | 28 +- hacks/glx/photopile.man | 6 +- hacks/glx/pinion.c | 8 +- hacks/glx/pipeobjs.c | 4 +- hacks/glx/pipes.c | 12 - hacks/glx/polyhedra-gl.c | 47 +- hacks/glx/polytopes.c | 1 + hacks/glx/projectiveplane.c | 459 +- hacks/glx/providence.c | 12 +- hacks/glx/providence.man | 4 +- hacks/glx/pulsar.c | 11 - hacks/glx/quasicrystal.c | 2 - hacks/glx/queens.c | 16 - hacks/glx/queens.man | 4 +- hacks/glx/quickhull.c | 100 +- hacks/glx/quickhull.h | 1 + hacks/glx/raverhoop.c | 11 +- hacks/glx/razzledazzle.c | 7 +- hacks/glx/romanboy.c | 1620 +- hacks/glx/romanboy.man | 4 +- hacks/glx/rubik.c | 10 + hacks/glx/rubikblocks.c | 13 +- hacks/glx/sballs.c | 30 +- hacks/glx/sballs.man | 13 - hacks/glx/sierpinski3d.c | 12 +- hacks/glx/skytentacles.c | 2 - hacks/glx/sonar-icmp.c | 42 +- hacks/glx/sonar.c | 18 +- hacks/glx/sonar.man | 55 +- hacks/glx/sphere.c | 20 +- hacks/glx/sphereeversion.c | 1688 +- hacks/glx/spheremonics.c | 145 +- hacks/glx/splitflap.c | 65 +- hacks/glx/splodesic.c | 11 +- hacks/glx/sproingies.c | 6 +- hacks/glx/sproingies.man | 2 +- hacks/glx/sproingiewrap.c | 5 +- hacks/glx/stairs.c | 10 + hacks/glx/starwars.c | 25 +- hacks/glx/starwars.man | 33 +- hacks/glx/stonerview-view.c | 19 +- hacks/glx/stonerview.c | 2 - hacks/glx/stonerview.h | 6 +- hacks/glx/superquadrics.c | 14 +- hacks/glx/surfaces.c | 13 +- hacks/glx/swim.c | 2 +- hacks/glx/tangram.c | 12 +- hacks/glx/tangram_shapes.c | 17 +- hacks/glx/teapot.c | 16 +- hacks/glx/texfont.c | 954 +- hacks/glx/texfont.h | 16 +- hacks/glx/timetunnel.c | 4 - hacks/glx/topblock.c | 17 +- hacks/glx/tronbit.c | 13 +- hacks/glx/tube.c | 22 +- hacks/glx/tunnel_draw.c | 23 +- hacks/glx/unicrud.c | 33 +- hacks/glx/unknownpleasures.c | 2 - hacks/glx/vigilance.c | 14 +- hacks/glx/voronoi.c | 4 +- hacks/glx/winduprobot.c | 65 +- hacks/glx/winduprobot.man | 2 +- hacks/glx/xlock-gl-utils.c | 158 +- ...r-gl-helper.c => xscreensaver-gl-visual.c} | 21 +- ...-helper.man => xscreensaver-gl-visual.man} | 6 +- hacks/hexadrop.c | 1 - hacks/ifs.c | 10 +- hacks/images/Makefile | 42 +- hacks/images/Makefile.in | 42 +- hacks/images/logo-360.png | Bin 0 -> 27394 bytes hacks/interference.c | 12 +- hacks/kaleidescope.man | 13 - hacks/kumppa.c | 3 - hacks/lcdscrub.c | 3 - hacks/link_axp.com | 107 - hacks/link_decc.com | 107 - hacks/ljlatest | 1 - hacks/ljlatest.man | 61 - hacks/lmorph.c | 2 +- hacks/m6502.c | 21 +- hacks/maze.c | 11 +- hacks/memscroller.c | 61 +- hacks/munch.man | 54 +- hacks/munge-ad.pl | 35 +- hacks/noseguy.c | 8 +- hacks/noseguy.man | 4 +- hacks/pacman.c | 7 +- hacks/pacman.h | 8 - hacks/pacman_ai.c | 6 +- hacks/pacman_level.c | 3 +- hacks/penetrate.c | 96 +- hacks/penetrate.man | 13 - hacks/phosphor.c | 141 +- hacks/phosphor.man | 62 +- hacks/polyominoes.c | 3 - hacks/recanim.c | 49 +- hacks/recanim.h | 6 +- hacks/rotzoomer.man | 6 +- hacks/scooter.man | 4 +- hacks/screenhack.c | 45 +- hacks/screenhackI.h | 63 +- hacks/slidescreen.man | 6 +- hacks/slip.man | 6 +- hacks/speedmine.man | 38 - hacks/spotlight.c | 15 +- hacks/spotlight.man | 6 +- hacks/tessellimage.c | 3 - hacks/testx11.c | 2 - hacks/vermiculate.c | 5 +- hacks/vfeedback.c | 9 - hacks/vidwhacker.man | 8 +- hacks/vms_axp.opt | 4 - hacks/vms_axp_12.opt | 4 - hacks/vms_decc.opt | 4 - hacks/vms_decc_12.opt | 4 - hacks/webcollage.man | 45 +- hacks/xanalogtv.c | 10 +- hacks/xanalogtv.man | 6 +- hacks/xflame.c | 3 - hacks/ximage-loader.c | 21 +- hacks/xjack.c | 83 +- hacks/xlockmore.c | 42 +- hacks/xlockmore.h | 9 +- hacks/xlockmoreI.h | 79 +- hacks/xlyap.c | 3 - hacks/xmatrix.c | 72 +- hacks/xmatrix.man | 28 +- hacks/xrayswarm.c | 8 +- {driver => hacks}/xscreensaver-getimage-file | 0 hacks/xscreensaver-getimage-file.man | 63 + {driver => hacks}/xscreensaver-getimage-video | 10 +- .../xscreensaver-getimage-video.man | 42 +- {driver => hacks}/xscreensaver-getimage.c | 188 +- {driver => hacks}/xscreensaver-getimage.man | 25 +- hacks/xscreensaver-sgigl.c | 266 - {driver => hacks}/xscreensaver-text | 162 +- {driver => hacks}/xscreensaver-text.man | 65 +- hacks/xsublim.c | 1 + hacks/zoom.man | 6 +- install-sh | 693 +- jwxyz/Makefile.in | 30 +- jwxyz/jwxyz-android.c | 300 +- jwxyz/jwxyz-cocoa.m | 13 +- jwxyz/jwxyz-common.c | 48 +- jwxyz/jwxyz-gl.c | 15 +- jwxyz/jwxyz-image.c | 10 +- jwxyz/jwxyz.h | 18 + jwxyz/jwxyz.m | 12 +- jwxyz/jwxyzI.h | 3 +- jwxyz/jwzgles.c | 106 +- jwxyz/jwzgles.h | 1 - jwxyz/jwzglesI.h | 4 +- makevms.com | 57 - po/Makefile.in.in | 7 +- po/POTFILES.in | 7 +- po/ja.po | 4298 +++-- setup.com | 131 - utils/Makefile.in | 71 +- utils/aligned_malloc.c | 259 +- utils/aligned_malloc.h | 8 +- utils/async_netdb.c | 4 +- utils/compile_axp.com | 34 - utils/compile_decc.com | 34 - utils/fade.c | 962 -- utils/font-retry.c | 637 +- utils/font-retry.h | 14 +- utils/grabclient.c | 1 - utils/grabscreen.c | 19 +- utils/images/logo-180.xpm | 4 +- utils/images/logo-360.gif | Bin 0 -> 7868 bytes utils/images/logo-360.xpm | 390 + utils/images/logo-50.xpm | 2 +- utils/images/logo.eps | 8058 --------- utils/images/logo.pdf | 1156 ++ utils/logo.c | 52 +- utils/minixpm.c | 2 +- utils/minixpm.h | 3 +- utils/textclient.c | 51 +- utils/thread_util.c | 239 +- utils/thread_util.h | 2 +- utils/version.h | 4 +- utils/visual-gl.c | 350 +- utils/visual.h | 6 +- utils/vms-gtod.c | 31 - utils/vms-gtod.h | 85 - utils/vms-strdup.c | 25 - utils/xdbe.c | 5 +- utils/xft.c | 110 +- utils/xft.h | 7 +- utils/xftwrap.c | 206 + utils/xftwrap.h | 35 + utils/xmu.c | 197 +- utils/xmu.h | 8 +- utils/xshm.c | 15 +- xscreensaver.spec | 4 +- 915 files changed, 77097 insertions(+), 61307 deletions(-) delete mode 100644 OSX/PxPlus_IBM_VGA8.ttf create mode 100644 OSX/Randomizer.h create mode 100644 OSX/Randomizer.m create mode 100644 OSX/Randomizer.plist delete mode 100644 OSX/YearlReg.ttf delete mode 100644 OSX/gallant19.bdf create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Abstractile.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers (OpenGL).xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers (XLockmore).xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers (XScreenSaver).xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Anemone.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Anemotaxis.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Ant.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/AntInspect.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/AntMaze.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/AntSpotlight.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apollonian.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apple2-OSX.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apple2-iOS.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apple2.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Atlantis.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Attraction.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Atunnel.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BSOD.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Barcode.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Beats.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BinaryRing.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Blaster.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BlinkBox.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BlitSpin.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BlockTube.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Boing.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bouboule.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BouncingCow.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BoxFit.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Boxed.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Braid.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bubble3D.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bubbles.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bumps.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CCurve.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/COVID19.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CWaves.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cage.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Carousel.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Celtic.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Circuit.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cityflow.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CloudLife.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CompanionCube.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Compass.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Coral.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Crackberg.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Critical.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Crumbler.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Crystal.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cube21.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubeStack.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubeStorm.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubeTwist.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cubenetic.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubicGrid.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cynosure.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DNAlogo.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DangerBall.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DecayScreen.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Deco.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DeepStars.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Deluxe.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Demon.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Discoball.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Discrete.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Distort.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Drift.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DymaxionMap.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Endgame.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/EnergyStream.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Engine.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Epicycle.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Eruption.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Esper.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/EtruscanVenus.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Euler2D.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Extrusion.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FadePlot.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Fiberlamp.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FilmLeader.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Fireworkx.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Flag.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Flame.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlipFlop.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlipScreen3D.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlipText.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Flow.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FluidBalls.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlyingToasters.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FontGlide.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Forest.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FuzzyFlakes.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GFlux.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLBlur.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLCells.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLForestFire.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLHanoi.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLKnots.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLMatrix.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLPlanet.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLSchool.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLSlideshow.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLSnake.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLText.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Galaxy.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Gears.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Geodesic.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GeodesicGears.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Gibson.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Gleidescope.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GlitchPEG.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Goop.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Grav.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GravityWell.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Greynetic.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Halftone.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Halo.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Handsy.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Headroom.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Helix.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hexadrop.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hexstrut.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hilbert.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hopalong.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hydrostat.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/HyperBall.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/HyperCube.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hypertorus.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hypnowheel.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/IFS.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/IMSMap.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Interaggregate.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Interference.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Intermomentary.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/JigglyPuff.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Jigsaw.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Juggle.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Juggler3D.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Julia.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Kaleidescope.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Kaleidocycle.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Klein.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Kumppa.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/LCDscrub.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/LMorph.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lament.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Laser.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lavalite.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lightning.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lisa.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lissie.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lockward.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Loop.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Maze.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Maze3D.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MemScroller.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Menger.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MetaBalls.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MirrorBlob.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Moebius.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MoebiusGears.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Moire.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Moire2.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Molecule.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Morph3D.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Mountain.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Munch.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/NerveRot.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Noof.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/NoseGuy.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Obsolete.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pacman.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pedal.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Peepers.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Penetrate.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Penrose.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Petri.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Phosphor-OSX.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Phosphor-iOS.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Phosphor.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Photopile.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Piecewise.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pinion.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pipes.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Polyhedra.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Polyominoes.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Polytopes.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pong.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/PopSquares.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/ProjectivePlane.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Providence.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pulsar.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pyro.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Qix.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/QuasiCrystal.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Queens.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RDbomb.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RandomXScreenSaver.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RaverHoop.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RazzleDazzle.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Ripples.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rocks.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RomanBoy.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rorschach.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RotZoomer.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rotor.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rubik.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RubikBlocks.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SBalls.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SaverTester.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Scooter.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/ShadeBobs.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sierpinski.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sierpinski3D.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SkyTentacles.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SlideScreen.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Slip.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sonar.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SpeedMine.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sphere.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SphereEversion.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Spheremonics.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Spiral.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SplitFlap.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Splodesic.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Spotlight.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sproingies.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Squiral.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Stairs.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/StarWars.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Starfish.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/StonerView.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Strange.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Substrate.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Superquadrics.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Surfaces.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Swirl.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/T3D.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Tangram.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Tessellimage.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TestX11-iOS.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TestX11.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Thornbird.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TimeTunnel.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TopBlock.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Triangle.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TronBit.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Truchet.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Twang.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Unicrud.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/UnknownPleasures.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/VFeedback.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Vermiculate.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Vigilance.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Vines.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Voronoi.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Wander.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/WebCollage.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/WhirlWindWarp.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Whirlygig.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/WindupRobot.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Worm.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Wormhole.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XAnalogTV.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XFlame.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XJack.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XLyap.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XMatrix.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XRaySwarm.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XScreenSaver-iOS.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XScreenSaverUpdater.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XSpirograph.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Zoom.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/enable_gc.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/images_png_h.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/jwxyz.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/m6502.h.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/m6502.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/molecules.h.xcscheme create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist delete mode 100644 README.VMS delete mode 100644 android/android.iml delete mode 100644 android/xscreensaver/#build.gradle# create mode 120000 android/xscreensaver/assets/fonts/SpecialElite.ttf create mode 120000 android/xscreensaver/assets/fonts/clacon.ttf delete mode 100644 android/xscreensaver/gradle/wrapper/gradle-wrapper.jar delete mode 100644 android/xscreensaver/gradle/wrapper/gradle-wrapper.properties delete mode 100644 android/xscreensaver/gradlew delete mode 100644 android/xscreensaver/gradlew.bat delete mode 100644 android/xscreensaver/xscreensaver.iml delete mode 100644 config.h-vms mode change 100644 => 100755 config.sub create mode 100644 driver/atoms.c create mode 100644 driver/atoms.h create mode 100644 driver/atomswm.c create mode 100644 driver/blurb.c create mode 100644 driver/blurb.h create mode 100644 driver/clientmsg.c create mode 100644 driver/clientmsg.h delete mode 100644 driver/compile_axp.com delete mode 100644 driver/compile_decc.com create mode 100644 driver/dialog.c create mode 100644 driver/exts.c create mode 100644 driver/fade.c rename {utils => driver}/fade.h (58%) delete mode 100644 driver/link_axp.com delete mode 100644 driver/link_decc.com delete mode 100644 driver/lock.c delete mode 100644 driver/mlstring.c delete mode 100644 driver/mlstring.h delete mode 100644 driver/pdf2jpeg.m delete mode 100644 driver/pdf2jpeg.man create mode 100644 driver/prefsw.c create mode 100644 driver/screens.h delete mode 100644 driver/splash.c delete mode 100644 driver/stderr.c delete mode 100644 driver/test-apm.c delete mode 100644 driver/test-mlstring.c create mode 100644 driver/test-xinput.c create mode 100644 driver/test-xkb.c delete mode 100644 driver/timers.c delete mode 100644 driver/vms-getpwnam.c delete mode 100644 driver/vms-hpwd.c delete mode 100644 driver/vms-pwd.h delete mode 100644 driver/vms-validate.c delete mode 100644 driver/vms_axp.opt delete mode 100644 driver/vms_axp_12.opt delete mode 100644 driver/vms_decc.opt delete mode 100644 driver/vms_decc_12.opt create mode 100644 driver/xinput.c create mode 100644 driver/xinput.h create mode 100644 driver/xscreensaver-auth.c create mode 100644 driver/xscreensaver-auth.man delete mode 100755 driver/xscreensaver-getimage-desktop delete mode 100644 driver/xscreensaver-getimage-desktop.man delete mode 100644 driver/xscreensaver-getimage-file.man create mode 100644 driver/xscreensaver-gfx.c create mode 100644 driver/xscreensaver-gfx.man rename driver/{xscreensaver-demo.man => xscreensaver-settings.man} (74%) rename driver/{xscreensaver-demo.ui => xscreensaver.ui} (96%) delete mode 100644 driver/xset.c delete mode 100644 hacks/compile_axp.com delete mode 100644 hacks/compile_decc.com delete mode 120000 hacks/config/rdbomb.xml create mode 100644 hacks/fonts/Makefile.in rename {OSX => hacks/fonts}/OCRAStd.otf (100%) create mode 100644 hacks/fonts/SpecialElite.ttf create mode 100644 hacks/fonts/clacon.ttf rename {OSX => hacks/fonts}/gallant12x22.ttf (100%) rename {OSX => hacks/fonts}/luximr.ttf (100%) delete mode 120000 hacks/glx/co____9.c create mode 100644 hacks/glx/glsl-utils.c rename hacks/glx/{glsl_support.h => glsl-utils.h} (50%) delete mode 100644 hacks/glx/glsl_support.c rename hacks/glx/{xscreensaver-gl-helper.c => xscreensaver-gl-visual.c} (82%) rename hacks/glx/{xscreensaver-gl-helper.man => xscreensaver-gl-visual.man} (89%) create mode 100644 hacks/images/logo-360.png delete mode 100644 hacks/link_axp.com delete mode 100644 hacks/link_decc.com delete mode 100755 hacks/ljlatest delete mode 100644 hacks/ljlatest.man delete mode 100644 hacks/vms_axp.opt delete mode 100644 hacks/vms_axp_12.opt delete mode 100644 hacks/vms_decc.opt delete mode 100644 hacks/vms_decc_12.opt rename {driver => hacks}/xscreensaver-getimage-file (100%) create mode 100644 hacks/xscreensaver-getimage-file.man rename {driver => hacks}/xscreensaver-getimage-video (93%) rename {driver => hacks}/xscreensaver-getimage-video.man (52%) rename {driver => hacks}/xscreensaver-getimage.c (92%) rename {driver => hacks}/xscreensaver-getimage.man (81%) delete mode 100644 hacks/xscreensaver-sgigl.c rename {driver => hacks}/xscreensaver-text (84%) rename {driver => hacks}/xscreensaver-text.man (57%) mode change 100644 => 100755 install-sh delete mode 100644 makevms.com delete mode 100644 setup.com delete mode 100644 utils/compile_axp.com delete mode 100644 utils/compile_decc.com delete mode 100644 utils/fade.c create mode 100644 utils/images/logo-360.gif create mode 100644 utils/images/logo-360.xpm delete mode 100644 utils/images/logo.eps create mode 100644 utils/images/logo.pdf delete mode 100644 utils/vms-gtod.c delete mode 100644 utils/vms-gtod.h delete mode 100644 utils/vms-strdup.c create mode 100644 utils/xftwrap.c create mode 100644 utils/xftwrap.h diff --git a/INSTALL b/INSTALL index 50dbe439..67d57d3d 100644 --- a/INSTALL +++ b/INSTALL @@ -1,5 +1,30 @@ -Basic Installation -================== +XScreenSaver Installation +========================= + + ./configure --help + + ./configure --prefix=/usr + make + sudo make install + make clean + + xscreensaver & + xscreensaver-settings + + There are many compilation dependencies. The configure script will + tell you what is missing. At the least, you will need development + versions of these libraries: + + perl pkg-config gettext intltool libx11 libxext libxi libxt + libxft libxinerama libxrandr libxxf86vm libgl libglu libgle + libgtk2 gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 libxml2 libpam + dbus libsystemd elogind + + BSD systems might need gmake instead of make. + + +Boilerplate 'Configure' Instructions +==================================== These are generic installation instructions. @@ -36,8 +61,7 @@ The simplest way to compile this package is: 2. Type `make' to compile the package. - 3. Optionally, type `make check' to run any self-tests that come with - the package. + 3. [There is no number three] 4. Type `make install' to install the programs and any data files and documentation. diff --git a/Makefile.in b/Makefile.in index 30a1db97..42742d3c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in --- xscreensaver, Copyright (c) 1999-2014 Jamie Zawinski. +# Makefile.in --- xscreensaver, Copyright © 1999-2021 Jamie Zawinski. # the `../configure' script generates `Makefile' from this file. @SET_MAKE@ @@ -6,23 +6,23 @@ srcdir = @srcdir@ VPATH = @srcdir@ SHELL = /bin/sh -SUBDIRS = utils jwxyz hacks/images hacks hacks/glx driver po +SUBDIRS = utils jwxyz hacks/images hacks hacks/glx hacks/fonts \ + driver po SUBDIRS2 = $(SUBDIRS) OSX android -TARFILES = README README.hacking README.VMS INSTALL \ +TARFILES = README README.hacking INSTALL \ configure configure.ac Makefile.in config.h.in \ - config.h-vms install-sh setup.com config.guess aclocal.m4 \ - ax_pthread.m4 config.sub makevms.com \ + install-sh config.guess aclocal.m4 \ + ax_pthread.m4 config.sub \ intltool-merge.in intltool-extract.in intltool-update.in \ - xscreensaver.spec \ - OSX/xscreensaver.xcodeproj/project.pbxproj + xscreensaver.spec TAR = tar # Using $(MAKE) directly means the shell executes things even with "make -n" MAKE2 = $(MAKE) -MAKE_SUBDIR = for dir in $(SUBDIRS); do (cd $$dir; $(MAKE2) $@) || exit 5; done -MAKE_SUBDIR2 = for dir in $(SUBDIRS2); do (cd $$dir; $(MAKE2) $@) || exit 5; done +MAKE_SUBDIR = for dir in $(SUBDIRS); do (cd $$dir && $(MAKE2) $@) || exit 5; done +MAKE_SUBDIR2 = for dir in $(SUBDIRS2); do (cd $$dir && $(MAKE2) $@) || exit 5; done default:: @+$(MAKE_SUBDIR) @@ -57,8 +57,8 @@ clean:: @$(MAKE_SUBDIR2) distclean:: clean - -rm -f config.h Makefile config.status config.cache config.log TAGS *~ "#"* intltool-extract intltool-merge intltool-update @$(MAKE_SUBDIR2) + -rm -f config.h Makefile config.status config.cache config.log TAGS *~ "#"* intltool-extract intltool-merge intltool-update dist:: tar @@ -71,26 +71,31 @@ tar:: $(MAKE2) version-date distdepend ; \ $(MAKE2) _tar +list_tarfiles: + @find $(TARFILES) -type f -print | sort + _tar: @ \ - VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \ + VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h | \ + head -1` ; \ NAME="xscreensaver-$$VERS" ; \ rm -rf $$NAME ; ln -s . $$NAME ; \ - FILES= ; \ + LIST="tar$$$$.txt" ; \ ADIR=archive/ ; \ - for subdir in $(SUBDIRS2) ; do \ - d=`pwd` ; \ - cd $$subdir ; \ - FILES="$$FILES `$(MAKE2) echo_tarfiles \ - | grep -v '^.*make\[' \ - | sed \"s|^|$$subdir/|g;s| | $$subdir/|g\" \ - ` "; \ - cd $$d ; done ; \ + rm -f "$$LIST" ; \ + for subdir in . $(SUBDIRS2) ; do \ + ( cd $$subdir ; \ + $(MAKE2) list_tarfiles \ + | grep -v '^.*make\[' \ + | sed -e "s@^@$$NAME/$$subdir/@g" \ + | sed -e "s@/\./@/@g" \ + ) >> "$$LIST" ; \ + done ; \ echo creating tar file $$ADIR$$NAME.tar.gz... ; \ export COPYFILE_DISABLE=true ; \ - GZIP="-9v" $(TAR) -vczf $$ADIR$$NAME.tar.gz \ - `echo $(TARFILES) $$FILES | sed "s|^|$$NAME/|g; s| | $$NAME/|g" ` ; \ - rm $$NAME + export GZIP="-9v" ; \ + $(TAR) -vczf $$ADIR$$NAME.tar.gz -T "$$LIST" ; \ + rm "$$LIST" "$$NAME" # This also makes me sick... @@ -139,37 +144,68 @@ configure:: cat $$TMP > configure ) ; \ rm -f $$TMP +# WARNING: This stands a good chance of breaking the world. +# Be prepared to roll back all of /opt/local/ from Time Machine. +automake-upgrade: + sudo port upgrade autoconf automake libtool autoconf-archive + cp -p /opt/local/share/automake*/{config.guess,config.sub,install-sh} . + cp -p /opt/local/share/libtool/aclocal.m4 . + cp -p /opt/local/share/aclocal/ax_pthread.m4 . + echo also consider autoupdate + $(MAKE2) configure + + bump-version:: @ \ SRC=utils/version.h ; \ - VERS=`sed -n 's/[^0-9]*\([0-9]\)\.\([0-9][^. ]*\).*/\1 \2/p' $$SRC` ; \ + VERS=`sed -n \ + 's/[^0-9]*\([0-9]\)\.\([0-9][0-9]*\)\([^. \"]*\).*/\1 \2 \3/p' $$SRC | \ + head -1` ; \ set - $$VERS ; \ - MAJOR="$$1"; MINOR="$$2"; \ - NEW=`echo $$MINOR + 1 | bc` ; \ - NEW=`echo $$NEW | sed 's/^\([0-9]\)$$/0\1/'` ; \ - D=`date '+%d-%b-%Y'`; \ + MAJOR="$$1"; MINOR="$$2"; SUF="$$3"; \ + VERS="$$MAJOR.$$MINOR$$SUF" ; \ + if [ -z "$$SUF" ]; then \ + MINOR=`echo $$MINOR + 1 | bc | sed 's/^\(.\)/0\1/'` ; \ + else \ + set - `echo $$SUF | sed 's/^\([^0-9]*\)/\1 /'` ; \ + AA="$$1"; BB="$$2"; \ + BB=`echo $$BB + 1 | bc` ; \ + SUF="$$AA$$BB" ; \ + fi ; \ + VERS2="$$MAJOR.$$MINOR$$SUF" ; \ ADIR=archive/ ; \ - if [ ! -f $${ADIR}xscreensaver-$$MAJOR.$$MINOR.tar.gz ]; then \ - echo "WARNING: $${ADIR}xscreensaver-$$MAJOR.$$MINOR.tar.gz does not exist.";\ + if [ ! -f "$${ADIR}xscreensaver-$$VERS.tar.gz" ]; then \ + echo "WARNING: $${ADIR}xscreensaver-$$VERS.tar.gz does not exist."; \ fi ; \ - if [ -f $${ADIR}xscreensaver-$$MAJOR.$$NEW.tar.gz ]; then \ - echo "WARNING: $${ADIR}xscreensaver-$$MAJOR.$$NEW.tar.gz already exists.";\ + if [ -f "$${ADIR}xscreensaver-$$VERS2.tar.gz" ]; then \ + echo "WARNING: $${ADIR}xscreensaver-$$VERS2.tar.gz already exists."; \ fi ; \ - /bin/echo -n "Bumping $$MAJOR.$$MINOR to $$MAJOR.$$NEW ($$D), ok? "; \ + /bin/echo -n "Bumping $$VERS to $$VERS2, ok? "; \ read line; \ if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then \ exit 1 ; \ fi ; \ + \ TMP=/tmp/bv.$$ ; \ - sed -e "s/\([0-9]\.[0-9][0-9]*\)/$$MAJOR.$$NEW/" \ - -e "s/\(([0-9][0-9]*-[A-Za-z][a-z][a-z]-[0-9][0-9][0-9]*\))/($$D)/" \ - $$SRC > $$TMP ; \ - /bin/echo -n "New version and date are "; \ - sed -n "s/[^0-9]*\([0-9]\.[0-9][0-9]*\) (\([-A-Za-z0-9]*\)).*/\1, \2./p" \ - $$TMP; \ + sed -e "s/\([0-9]\.[0-9][^. \"]*\)/$$VERS2/" $$SRC > $$TMP ; \ + if cmp -s $$SRC $$TMP ; then \ + echo "ERROR! UNCHANGED!" ; \ + exit 1 ; \ + fi ; \ + \ cat $$TMP > $$SRC ; \ rm -f $$TMP; \ - echo "overwrote $$SRC"; \ + \ + VERS3=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. \"]*\).*/\1/p' < $$SRC | \ + tail -1`; \ + if [ x"$$VERS2" != x"$$VERS3" ]; then \ + echo "ERROR! \"$$VERS2\" vs \"$$VERS3\"!" ; \ + exit 1 ; \ + fi ; \ + \ + echo "Updated $$SRC version to \"$$VERS3\"" ; \ + \ + $(MAKE) version-date ; \ ls -lFd $$SRC bump_version:: bump-version @@ -179,15 +215,18 @@ tick_version:: bump-version version-date:: @ \ SRC=utils/version.h ; \ + VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. \"]*\).*/\1/p' < $$SRC | \ + head -1`; \ D=`date '+%d-%b-%Y'`; \ + TIME_T=`perl -e "use Date::Parse; print str2time('$$D 12:00')"` ; \ TMP=/tmp/bv.$$ ; \ - sed -e "s/([0-9][^()]*)/($$D)/" < $$SRC > $$TMP ; \ - /bin/echo -n "Updating date in $$SRC to \"$$D\"... " ; \ - if cmp -s $$SRC $$TMP ; then \ - echo "unchanged." ; \ - else \ + sed -e "s/\([0-9]\.[0-9][^. \"]*\)/$$VERS/" \ + -e "s/([0-9][^()]*)/($$D)/" \ + -e "s/\(_RELEASED *\)[0-9][0-9]*/\1$$TIME_T/" \ + < $$SRC > $$TMP ; \ + if ! cmp -s $$SRC $$TMP ; then \ cat $$TMP > $$SRC ; \ - echo "done." ; \ + echo "Updated $$SRC date to \"$$D\"" ; \ fi ; \ rm -f $$TMP @@ -195,7 +234,8 @@ version-date:: update_spec_version:: @S=$(srcdir)/xscreensaver.spec ; \ U=$(srcdir)/utils/version.h ; \ - VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' < $$U` ; \ + VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' < $$U | \ + head -1` ; \ /bin/echo -n "Updating $$S to \"$$VERS\"... " ; \ T=/tmp/xs.$$$$ ; \ sed "s/^\(%define.version[^0-9]*\)\(.*\)/\1$$VERS/" \ @@ -210,7 +250,8 @@ update_spec_version:: rpm:: @ \ - VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \ + VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h | \ + head -1` ; \ DIR=`pwd`/rpm_build ; \ ARCH=`rpm --showrc | sed -n 's/^build arch *: //p'` ; \ ADIR=archive/ ; \ @@ -246,7 +287,8 @@ apk:: www:: @ \ DEST=$$HOME/www/xscreensaver ; \ - VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \ + VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h | \ + head -1` ; \ HEAD="xscreensaver-$$VERS" ; \ ADIR=archive/ ; \ BNAME="$$HEAD.tar.gz" ; \ @@ -356,17 +398,22 @@ www:: count:: @ \ - /bin/echo -n "Current hack count: " ; \ - ( ( cd hacks; make -s INSTALL=true install-program install-scripts ) ; \ - ( cd hacks/glx; make -s INSTALL=true install-program ) ) | \ - grep true | \ - grep -v helper | \ - grep -v ljlatest | \ - wc -l + echo "Current hack count: " ; \ + A=`cd hacks ; ( make -s INSTALL=true install-man | \ + grep true | grep -v helper | grep -v ljlatest | wc -l )` ; \ + echo " X11:" $$A ; \ + B=`cd hacks/glx ; ( make -s INSTALL=true install-man | \ + grep true | grep -v helper | grep -v ljlatest | wc -l )` ; \ + echo " GLX:" $$B ; \ + C=`echo $$A + $$B | bc` ; \ + echo " Total:" $$C ; \ + +#cerebrum:: +# rsync -vax . cerebrum:src/xscreensaver/ \ cerebrum:: - rsync -vax . cerebrum:src/xscreensaver/ \ + rsync -vax . pi@10.0.1.19:xscreensaver/ \ --omit-dir-times \ --delete-during \ --exclude .git \ @@ -376,6 +423,12 @@ cerebrum:: --exclude build \ --exclude gen \ --exclude videos \ + --exclude config.h \ + --exclude XScreenSaver_ad.h \ + --include xscreensaver-getimage-file \ + --include xscreensaver-getimage-video \ + --include xscreensaver-text \ + --exclude '*~' \ --include '*.asm' \ --include '*.c' \ --include '*.gif' \ @@ -389,6 +442,10 @@ cerebrum:: --include '*.po' \ --include '*.xml' \ --include '*.xpm' \ + --include '*.man' \ + --include '*.ttf' \ + --include '*.otf' \ + --include '*.ui' \ --include 'configure*' \ --include '*/' \ --exclude '*' diff --git a/OSX/InvertedSlider.h b/OSX/InvertedSlider.h index 2ad6fd5a..869e7f2b 100644 --- a/OSX/InvertedSlider.h +++ b/OSX/InvertedSlider.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2013 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2020 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -26,8 +26,12 @@ { BOOL inverted; BOOL integers; + double increment; } +- (double) increment; +- (void) setIncrement:(double)v; + - (id) initWithFrame:(NSRect)r inverted:(BOOL)_inv integers:(BOOL)_int; # ifdef HAVE_IPHONE diff --git a/OSX/InvertedSlider.m b/OSX/InvertedSlider.m index e53e3611..60dd2cb8 100644 --- a/OSX/InvertedSlider.m +++ b/OSX/InvertedSlider.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2015 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2020 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -34,11 +34,27 @@ } +-(double) increment +{ + return increment; +} + + +-(void) setIncrement:(double)v +{ + increment = v; +} + + -(double) transformValue:(double) value { - double v2 = (integers - ? (int) (value + (value < 0 ? -0.5 : 0.5)) - : value); + double v2 = value; + + if (increment) + v2 = round (v2 / increment) * increment; + if (integers) + v2 = (int) (v2 + (v2 < 0 ? -0.5 : 0.5)); + double low = [self minValue]; double high = [self maxValue]; double range = high - low; diff --git a/OSX/Makefile b/OSX/Makefile index 845fb52c..350c2c45 100644 --- a/OSX/Makefile +++ b/OSX/Makefile @@ -1,4 +1,4 @@ -# XScreenSaver for MacOS X, Copyright (c) 2006-2015 by Jamie Zawinski. +# XScreenSaver for MacOS X, Copyright © 2006-2021 Jamie Zawinski. XCODE_APP = /Applications/Xcode.app @@ -67,8 +67,19 @@ Sparkle.framework: BASE = xscreensaver/screenshots/ URL = https://www.jwz.org/$(BASE) -WGET = wget -q -U xscreensaver-build-osx --content-on-error=0 -CVT = -thumbnail '200x150^' -gravity center -extent 200x150 \ + +# I find wget easier to deal with, but curl is usually installed by default. +#WGET = wget -q -U xscreensaver-build-osx --content-on-error=0 -O- +WGET = curl -s -A xscreensaver-build-osx -f + +# Apple savers have "thumbnail.png" at 90x58 and "thumbnail@2x.png" at 180x116. +# System Preferences stretches those to fill a bordered 170x105 frame. +# These args take our source images (usually 200x150) and fits them into a +# 180x116 box, cropping either horizontally or vertically as needed. +# It also makes the alpha mask have rounded corners. +# +THUMB_SIZE=180x116 +CVT = -thumbnail $(THUMB_SIZE)'^' -gravity center -extent $(THUMB_SIZE) \ \( +clone -alpha extract \ -draw 'fill black polygon 0,0 0,6 6,0 fill white circle 6,6 6,0' \ \( +clone -flip \) -compose Multiply -composite \ @@ -93,10 +104,10 @@ $(THUMBDIR)/%.png: cp -p "$$HOME/www/$(BASE)/$$FILE1" "$$TMP" ; \ else \ echo "downloading $$URL..." ; \ - $(WGET) -O"$$TMP" "$$URL" ; \ + $(WGET) "$$URL" > "$$TMP" ; \ if [ ! -s "$$TMP" ]; then \ echo "downloading $$URL2..." ; \ - $(WGET) -O"$$TMP" "$$URL2" ; \ + $(WGET) "$$URL2" > "$$TMP" ; \ fi ; \ if [ ! -s "$$TMP" ]; then \ rm -f "$$TMP" ; \ @@ -114,11 +125,29 @@ $(THUMBDIR)/%.png: rm -f "$$TMP" ; \ fi +$(THUMBDIR)/randomxscreensaver.png: + @\ + SRC="iSaverRunner1024.png" ; \ + CVT2="-gravity center -background #249ff5 -extent 200%x100%" ; \ + FILE1=`echo "$@" | sed 's!^.*/\([^/]*\)\.png$$!\1.jpg!'` ; \ + FILE2="$@" ; \ + TMP="$$FILE2".tmp.png ; \ + if [ ! -d $(THUMBDIR) ]; then mkdir -p $(THUMBDIR) ; fi ; \ + rm -f "$$FILE2" "$$TMP" ; \ + set +e ; \ + convert "$$SRC" $$CVT2 "$$TMP" ; \ + convert "$$TMP" $(CVT) "$$FILE2" ; \ + if [ ! -s "$$FILE2" ]; then \ + echo "$$FILE2 failed" >&2 ; \ + rm -f "$$FILE2" "$$TMP" ; \ + exit 1 ; \ + fi + check_versions: @\ SRC=../utils/version.h ; \ - V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' $$SRC` ; \ + V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' $$SRC | head -1` ; \ DIR=build/Release ; \ RESULT=0 ; \ for S in $$DIR/*.{saver,app} ; do \ @@ -199,21 +228,23 @@ ios-function-table.m:: @./build-fntable.pl build/Debug-iphonesimulator/XScreenSaver.app $@ -echo_tarfiles: - @echo `( find . \ +list_tarfiles: + @( find . \ \( \( -name '.??*' -o -name build -o -name CVS -o -name '*~*' \ -o -name 'jwz.*' -o -name 'Screen Savers' \ -o -name xscreensaver.xcodeproj \) \ -prune \) \ -o \( -type f -o -type l \) -print ; \ - echo xscreensaver.xcodeproj/project.pbxproj ) \ + echo xscreensaver.xcodeproj/project.pbxproj ; \ + find xscreensaver.xcodeproj/xcshareddata -type f ; \ + ) \ | sed 's@^\./@@' \ - | sort` + | sort update_plist_version: @ \ SRC=../utils/version.h ; \ - V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' $$SRC` ; \ + V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' $$SRC | head -1` ; \ T=/tmp/xs.$$$$ ; \ for S in *.plist ; do \ /bin/echo -n "Updating version number in $$S to \"$$V\"... " ; \ @@ -238,7 +269,7 @@ updates.xml:: test_sig:: @ \ U=../utils/version.h ; \ - V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ;]*\).*/\1/p' < $$U` ; \ + V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ;]*\).*/\1/p' < $$U | head -1` ; \ BASE="xscreensaver-$$V" ; \ OUTDIR="../archive" ; \ DMG="$$OUTDIR/$$BASE.dmg" ; \ @@ -265,7 +296,7 @@ build/Release/installer.pkg: installer.rtf installer.xml installer.sh installer. @\ set -e ; \ SRC=../utils/version.h ; \ - V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' $$SRC` ; \ + V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' $$SRC | head -1` ; \ \ DIST="installer.xml" ; \ STAGE="build/Release/pkg_stage" ; \ @@ -304,7 +335,7 @@ _dmg:: @ \ set -e ; \ SRC=../utils/version.h ; \ - V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' $$SRC` ; \ + V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' $$SRC | head -1` ; \ TMPDIR="build" ; \ SRC="build/Release" ; \ EXTRAS=../../xdaliclock/OSX/build/Release/*.saver ; \ @@ -429,7 +460,7 @@ notarize:: @ \ set -e ; \ SRC=../utils/version.h ; \ - V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' $$SRC` ; \ + V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' $$SRC | head -1` ; \ BASE="xscreensaver-$$V" ; \ OUTDIR="../archive" ; \ DMG="$$OUTDIR/$$BASE.dmg" ; \ @@ -483,7 +514,7 @@ staple:: @ \ set -e ; \ SRC=../utils/version.h ; \ - V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' $$SRC` ; \ + V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' $$SRC | head -1` ; \ BASE="xscreensaver-$$V" ; \ OUTDIR="../archive" ; \ DMG="$$OUTDIR/$$BASE.dmg" ; \ diff --git a/OSX/PrefsReader.m b/OSX/PrefsReader.m index 80211fcf..8fbebffa 100644 --- a/OSX/PrefsReader.m +++ b/OSX/PrefsReader.m @@ -217,6 +217,10 @@ - (NSString *) makeKey:(NSString *)key { # ifdef HAVE_IPHONE + if ([key isEqualToString:@"globalCycle"] || + [key isEqualToString:@"globalCycleTimeout"]) + return key; // These two are global, not per-saver. + NSString *prefix = [saver_name stringByAppendingString:@"."]; if (! [key hasPrefix:prefix]) // Don't double up! key = [prefix stringByAppendingString:key]; @@ -381,6 +385,7 @@ NSObject *val = [d objectForKey:key]; NSLog (@"%@ = %@", key, val); } +# ifndef HAVE_IPHONE // They are the same NSLog(@"globalDefaults:"); d = [globalDefaults dictionaryRepresentation]; for (NSObject *key in [[d allKeys] @@ -388,6 +393,7 @@ NSObject *val = [d objectForKey:key]; NSLog (@"%@ = %@", key, val); } +# endif #endif } diff --git a/OSX/PxPlus_IBM_VGA8.ttf b/OSX/PxPlus_IBM_VGA8.ttf deleted file mode 100644 index 0368d2bbae0b02dfeeb66950db2f79109714756e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70956 zcmd?S3!GKec|N?>I>T@qF2i^PZ#cs^fQrH}3@D-jL_|eIL`1v-GhCEg5REa`7&}d^ zwU$_8t+6&SX-bSus4?<3bPy?sOJG9U2&Ik>)Y-O{z4m+k$}vlD*$o@lZ+PE#`fmb1ccaWxj#rJ+ZrwwIlwjSKzT&a=Y@kvU>t%hexgYhw4r@>>@R#R&9n_VBs zF`c!R8q?l&gvGkHzm@p78}QZX?w9Z2TO-dbI&;C9?r!G}9WWkhw))LCI``Ed{KC1g zt+W@HfFE*JeB*4|pi9@GFZRj9j(En7^7FdPZO{J8|8K|3_Rf#f1=ZK{Jj>)%jZXSx z`R-dzg-5)`uIqla@zec0xk_6Hcu3z8|2$_~`VYUQW6@Ko-uRA%KFLAEC0lGaD`&RO zX;mKejGw$dqsQ<0m8lLpmtUJGcR!Q6-5QL@lo`E7=3W z@~dKO^y7F{dS~Q`(M-nPjBv!D?P)Ypw4! zHCwR%vAf&Vx)tt&{)7HO{|WzPe<+*~E)TbdzYBjKc9rfb-B-H5^oi2TrB_P(YHq0c zNT28W{G`vmlTJ8k^hsk!{?^Dp8TsFhLmSJDqZ-FFPH1dvY;T;}IIVGd;ajt>wj*Z?t@?7!?kzH#*O(JMyZJf`8DaOeOs z6>cAoa=sl#NY1ZA&etGk7vy}P^hwF-YBod8SNgme<-8km{tR*sYaHG<8gfpAoM%JM z^Cagc$oZkhPxc_^{H80KHcQSvlCvIi9ye-al=H?>9hsbsy~sJg>Pa)Ee$@2CmwxycKfK}f^IxC&`i$4ldwufj?XORI zz4i48uaAFy-0LUpIk@MYJ#X*%;hsHvez52Jdp^A9{d?ZGXU(3~dzS5)v1j_8A-fOk z{?zU#c7I~`$96xu`;pxr-TmP1-`Rcd?lrrw+bx+^#R~ zdV1IAcRjW1GrOMH^|4(K?fSi4ckEiZt8>?~T{rBycGvt}b9SA-Yuc`Jc1_wfe%H8N zr|cTB^KW;)u=8(rero3vJ3q1W@$dbj-+A*X&MlEpD_M)i(TUboTR;x@Tk-EHoD?soTncZd6cyVL!KyUTr$ z(J2g|i4nB^|E`HYb)R-y+>`EU_ht9j?gjTZ?rZLE-HYz)XlY(@fA7BGzUf|e|KPsm zUUA=cJKR6He|Fz-ue$HK@4B6CS6J#k;(pV0xqHKM_lNFz_xtX?@PPZM`=aBd^&tKJn6p>zTke>eat`R{?7f2`?$Nu{a*OIUmBhXTipHbvC!c@ z9Yr+j-h5MxY ztb4*eR0?Wb#Bu6?WT zv3;lZUDEf%eV^+4T;Co2T)$)bP4CyyudClv{l49AfB%vFXZ2sv|Ka|h>;Gc^?+>UQ z&^X|{0oM+=eZV6Fwhh=laPYv>22LNiY~bAkpBnhhfp6E<)lICMRo79sq3)i#PuFd) z`|+RwgU%eZV9*_d9v$?|pl=WQ<>0!(V+YR~eB>oOK=(wS?hu(zOhlf5jbVt3bKdpXR{k`>%*1uH$lVK+g8#nB%VH<|sIqczK zTZio!_Oph54Wk-nHq38W(Qs$O;|;GI)9;vzk9p*nZO6P(ZY(b`-m+gzCGgLabu60bKI)q?mzBx$Gv*o z+s8K^zu@?;^neA~%SoczkkZ=?O}XneHsrN)Czr!_5Wda&t* zrXQnKoIC2SQCmmtZ0^@Qx%tNChnu%IzjaFEDGN{OI_23@e%f+cO9xuOS4Y>O&D%8k z$9o#vNxodd7=q{Ort;=!oBS=GHU6KmOS9^Tyvd{-p`E6Q)nNbHZ09>~0;vnQ^Z_{hW;C+=$-**33jW80%`+uMFQY4oJUle#8toAk5x(d`S{ zH@APi{q@QHCZ95S{^SQHzcl&nDU+tGnDW?^9cR^@HSw%#&+0mB>si~+`uL zF*7I5oHujD%=>3|3{0Gi|?)-n9bmW3orig#ZO-R^2I;9WW*)Y zE?IQR9hW?Q$@WX$m|HjZthv|Ey<_epbGOd@=G^aJ8ZK?Tbn2x`F73K>>!sT--F@j> z^M=ivIB)*Eb@MjQduHBimkqdV>SfC=yYI5kUAFVGx8@%^f71Mg^KYB~@cftN@4I}| z<jMp;wH(V%ilq zUUByok6*FvitjHRuyE|csS6h`+_3QegrhtEOEw@2XW--E-ArSAFTKm#=zbaacTJ z@#w{i7q45qdGV(gzp(iGi}znW;OdcAPr7>X)oZTqy87{}pS$|CC2mRMlF3VEExB>Y zZA%_q@|7j8EcwYb{jM2x&BfQOy5`Pn?!D&eYhJ&0=(T5F+i~qzu6^UW5!cPUZrybc zUib3#!>(U={o~i~ykXQ0>uz}ZhPQ5|w_^K>oh#m4*>B~@m6KM^ zTiLPlj+GCsd}`&3D}TK5;HnX;Ca;>es$*5xs>fG-Y1ON%ez|(Y>RGE7tiFErn$>r# zzIXM*H!Zk%+nQBtZd-HTnn%_=wdN~pURm?z+J0-tu3fVBuC))X-MV(?+PBt?Teo=K zL+iG!+q=GQ{e<-k*59`Nq4i%{|JwS48%AxIi}nGdaB(zmIC3C&oNsGyDmRy#>)Yzv z+S}Tj`K`XG-k00j(Lw9z*xu36aj>qV)OfIN`@s!0bGL8rIJg7vV+qaV@ zN7^v%HW2xi1DQ6EXsT~6H<3;UM)MACV6n|89kw0ZabQbFsjEX>vc6f_l1euqLpuRk znQI3}4aQr0slBb-)ZE_I05*M7xv3uKQU7M+LQEc*6&4@Z5*CBg{kzFH`NPM7Sv+CY z)ns)IL_R3_Q446bk=6EwavQj9Yj1%X`m{Hf!8XcoA$hRR>Oj1s1JrbEx}gy4Epptk z5j3Sy(GgW>w%iP@Hn)Qcb;%7KV$gzKL6sYelLmAH8n8+|Rmc}P!b?;V9V=s>MkhZb z`^pwwuteg<=+Geb(4@YRne7L6fTQhXXB-b`*MmC_?&yG(OeWa0t2cgN5zvBMQ4dnm zc9__>k+h26B^; zC~^hB*!k!>(HumZ54q6kFrOSx^VTR5g? zL?Dx(fez-G0@5fa8r!)+ZQK1mW0IyLQ4FNehYvj_A07hVfDg-m85Zcr&C~?c4D}Ho zLJa)sPC@y=td7!NYOz*|BxXwTu9MNL8si)dF@`cT#u#%zVsksrl|A0{?mlJ28!&^H zeK1yRN6aC^;1Iy1^fB@zcf=`H8U3$jE)meGI#^Gvi^{+Y*G6$WYUb*TeN>mvd`}z` zu=b*&;^z0+!8^}rkNSl{#6RF>3a%$+WM$(49Epc^Nhb(WEXie*B%Nfb$?RG}Z&vYi z3W_66*AI_-l#H7n7q&tBum|_FVT{9r(C2kcP_h&)Y=8i8YaHO}EeK{^`|pG(fa<{w z7=Mcx2-~2?HuP&w7F>g%LqA`vRu$(pCU6Z1bBj_e8y$51_s1UGEmDDs_KgOLz4POgT+Np@s@8 zHrIncaJPLsqYpPUI+%qk@PRT@BF@d?jQfURwtTP^Hxv)(bCMh4Gjr6zO8*=vL=q&bhIDZGw&VAsE6kl|1EbP#HB8_yTvT zLp1Fp#uj~{s3sevMOy}a!21hYY%@Q^#ikZy4^`K*ZI=#IQ*(RLH8Txql5GV_g~ch~ zXkg}22E6O(CS}As840ZpLBp)O+9UORgAbE& zZE;6KNSzjM)V8%?%#4Tv`7AZHYNCj*j3+~^0G<%zjWb*@DGV3TDbxQl;4O+cL@!v25F<~1GqkmjF_S(;%|T30E#d5To^L@}1ORN3Az|gPI7#fy@+duIoW{G$*{~wcaA4CsN8aM1K20qqzCZE4FoI9LlEHq^kUPK#r;9DlX)ez zP^NzPmT8fnWOD5#{*fCH4|+*&&XZ`*fBov8FM>jIrL(B zEo}|Tzzp9_>`7U2ov5NmCA4Q^6XpefDkmgGZW(FhJ#F=4;9};bRJ!@Pg)V%nlL|q# z*lr?D0?*9Cz#F*ZJLjto9kMz?Bk}~XErt~NVQ(q=w?*efp$)`nJ+?U_K}q4IG-K*E z6>Pw^PWdFniQ$gw()AK&$M(`*>H--F=s^(bxrnK(*T&*S9g`C(pNds}26>X&$sAQ3 z1=Ba0j>Kg@$!C3GYKAsr=8rciiXL+$s+%;eWwF*AXX#P_AGi>09`iPOF9@}_nRhWm zQ~QGtUBk>y-Us`ZbsfEz*u^KxJ^Ybvt5^ZD;XA=ctni1ivs+ZEhV5ph!GK+x6^Eud?0FPkpa9Y zQq?!13rf{yEn;k=BDk6SG0lRpNUnfU_Mg}f5dd<8wg?aG;aRf-)@X1xTvf2lWZN6Z zL6VM)9mD}yLnvjwM^B-)@uzqo`uxHqUuUVRsIR>?E|77jNYGqHR3U%h&YXwEZMegz zkm&+n)R@V~LhW*89$9=vCPa0M20tJpM3k7yPH!_}TF^+2yAqZVi5ExD|x)xSVog%)WCI&SbN)|8DMvlx}JYH(;MGU7FZ3qz#Iu-aS=%0o|S)jpi zODjl*O8pxtoRbrA;a(LF2@$ysshbD_R}xYNKri3{b+d>98OH>`_z1%B zz?RDT^0H-dA1z;5){lc~fo&De@oQs@xyR=*I!63#ln%kT0{5&nnuHpIHOnO&#M}Z1 zt?)-iLzQQ)jy6=|Y58~|&D(@brk!d}Z3IWpu;J5;#*~a5zak$!MF+~yE`Ev*P(;QH zl5J?=V4d-kV-oFxwdp9USB#{Jr$oMF)F>|XO0nyjvY z4K+R5U~HqIf-y2lHu8+4aL)=H!B5n$6e5-P0B{&R#z+I-6&Qx!Q)KW7n~+z%Bng@1 z8(SRWKuxTVTM@UgsQC^lhz0|;+9FeZsS9D6E%r9l4wV-03;hweraG#N-^2u!CzbLW ztIYV(0pm6iZhIa`2T6C}sX^R`pQOJy4qysgtd@hF^cWV3GJ&tGH3Cb@w^Gt1_7GN} zG4e&ADMaEhHQnM?2Es`&r&ycf5;GGRlsOk#LIMj{z)|!1HQvi^bm3**DMe|#mo?jF z83T{W2{-feVtpu$3NfC+frbrqjQt~I2lklI2L=x6DG^_>)}(wRDfQEz@=g36I;+%p z=rOjuWoU_GTasgYsmt#JUG@>pj;W8h*G!c#0JlWl@@RN6TWVd-JOr4BLYX>Hhe$cl zTF_qzX8l8g<}qmyvk>&Mh-UM<`Z&74k#&?JUP@ik5_QmpIf~6uSI}4*2a3@J;G@O} zM$2QAddQQkbtV_!AddxD@6ED&v22t>Eg&dB1SU=>B0(e*oiR2`DMmsc^;jcg8i5=+ z4-HU{uEwyPvB3a9UPus|31j@Q{R2N1X`xfaBUzMu;jIGFW-Ln8f;*6cZY-YAW5EyF zxia(s8jM8r1$q`W!}yI6V^$BI=4(7AF;O zLpnej*kHV6)5C@6`FK-*tSaKjfG}<2C8!fcnaxolNFhpl84rTPIn}ALSoU~Th-_ob z32}u5tVhA2Zn_0bQnM9>bGufy^OPGeV$AeuT!RDYPn-)Gge&wwTc(U{9!Tl9Zot^h4k zGCuf8WMy=SEyxegiI^u|%|;RLng59dio!ZTdbBgjrnWrB*f@T`H~>2K65eG7SiPbx zr}-;4*_|L{TMoWrd^P`TCyMA#^cETwlEFOMTVTQPP{BU3D>Q`C2m{)qg^eMJBP~pu z?NjvvOwtF(!g)1bsbxoftQ2WCGG@NXb`g6=Y|k;1j2MK#yw8&LN*zM~?SumKN3HQ2 zJqDadkHI%qNsr;%KFsy`m8#HI#98Etl2Z<5eZ&U)0E8uTvkj6zEG8_t<@$$hPl|a4 z*#Q9tvFybl&k+kKhCLl@pn71Ic#F*8e;@}rrB@rvX@Hc(7^9%s1rdxOLqUc3eUb^% zfHeeXl;`*a#~$`tzaMi$;0B|o8vO&Fcu_?iU{{w2gF+5;NBYDd_K+J#=3r(+w&$R4 zQGm#m_JOoAuN1xzYT`zj7&{P9N}MN%Eisj3cyFt3Q39IvziD`B2<;a)h{hA5lkyFl zFUwH}*yi&AxSY_TjZ0lrYLpk_$%wO z$=(2=nJ5BJ3N(VUw}~QRn2L(J1WB5VUXlC{y3yPNku8&fCxXUC7D>Db$&W_8G{{87 z$TcY?$Z8`9a9TLXZHyU>2J@6Cr>K?{?^zq(jG~g5l4Ao#xig|1jKN0z9|g8x>qC$I zKX7gle3kZ!FO7$>Wu|`V7s%Q)Q_M_KI5poP#@L4gW*8M)IiLzFcpjrPVr{tr#|YAj zah!~y4%LAn{w;vXI7l)$Z(HKXVdO#CLIdf+!GRjM5BiwR7GN1`*np`Sfz#5+gg*EK zeZ-mu&M3ubFYKns*CJ#y@T4;~Q%GExcj_pE3@uyO4Bzloq(hiHWTxAUSy;qzio^JV zwyekbhNA8$TN%0GNpZBM9_@oTYA$n*n_n6ru*bU(f-PB#8*E|fOo~LsI7Dut=&Rl~ zI;6%&X)o?poXdUz?ZPz;@+WbR^NJBz&7meb)30I)^oc5YJ$CuJCXVSMsV>f3)KpHaBi6RIT?2$aEyl{rI%`vJ#kd3Z#zziqE1N#ugye_TokJ}z94f= zLFVzc_T;cqi-VjC0;Hkb)*i>O$q;4~iyJC8j&#y`jotK;7qIpc+ELt~;hEQH+>Sj3 zyl922hpzbwl4JhG_-qlCo`b`fYrw9ggK>!lShg9_#3+H5UWljpj01Fxvza~Bpo2Xc zGp32f*$29goabojh${e_%U~bS&9W=hL8!=Xm33IOKx5dgj+5Ei^dN`o5JG^Hp6X$^ z)HrlDdKKkKk;!T+%F|3=I80s8n0hrm*B8@IlTNe#?1(ZOOf~X5B?J~_r@6AXX0Usy zHLFRzc|#AiXh>stW~Y~1UX$v8^um0^19M-kle2oLH~4Y^4T@>8wL+GPmVW*@jkT~HYSc$ zADlIfZJPlK)RK>wO$0Rj50r^iXc>Pb%f1sKrwVyasV{v-TjCi$V;-Xzr%pjTc-A-V zafB!sJ%->F1$+=j9Db(+k^+M0$W{PKCDGpWOJu~zv!QP21$t&;hgxErub2xNkoCaA z)Q+WM(mShRlabJr>07+hOAgDs`3h$RI{*>Xy zup|G4Fj(ITESZN9(B@Z$ZE~h)WGyjV7b@edT=Y}O*brL@;F=T}6PRn*8g3v)3WINz ziFPq-?G7oGx^NEjXLquWgLMg(KuaD|Z4G=H?S<=O1$?w(i9JfPYYs%ZAR5(Y>Er%8 z(cQpyczR~kc1&Mn^ni=*)HqGZ6$u21*>_0nUoq1VZ(NDNd>*Eu!Q=dXTH{fK8yJ;p zp@K^O)RSflo@kaVa%Gw<@JaQ7D8#PhmWtID6;Km-wthvHBNS>tJ5k@HHo`P&@+WU2 zAZ0GnLzN`QaX|LwE^QAFxi8zZxADTb=9Jl^#n z8Ij0XQe6vC*|Ri>cC^c3Bw^p0IA`Y9gid009i$JFtD0_gbtO?02Z4j0;~;P=FCg03 zA`ogU3HE6b0Zpb!Cz&Gazo6R@$2>4rYvaD+*Ro3RZM>5%af&3>TvdY)(2ksh{)PWy zE9iyeTTRizpn|{;F4eMf>O?GyQLS%7{%ajZ;a_a4(KXgtjn$+!A+?QjHHOw}9kJhx zIyvgD(YZn$VwkN^UWJKJEkjGMGIaBYZgoig)q=4dXprjJT^Ox>Pxr+8Yc#imddC580?UnwhmL zb56q#RBTNcR^yAL*{VnrI#9$f@+q1Tl+d)GoOlHpwJ6;vM;wSY^g9q5sGD*U3hs$B<+Io)t}7gp`lSnCfs0fElEN-fQfkDJt$c=^TEOWT z>^0M}fwy=F39vt|!lt;-oHDL$VTM6FPXR#bdmQa+w{^nOoV0I2fjk%_0U^~ddho-( zpcm(Ds zOFn5=dQL)2C9guFsm}-(jhgtaF`ddU^PXR#t{E#zPy0#(Mz6?fVv}scJhpxUI@P!d zIkjw=Hi9?e-4MA}q@>{R6gZv|Q~EYp%je7!(=?UQ2Cr-%91V}q8vy_%pf{zpyqHB$ z9>I1Q{33`Wsetj>L=()=XIz6*n6Inmk`ja8vT}Pc2b$ne-zph2b5V`SPBxay-ai6q zZXqyN7`@|cmaqf2j$@u&IFrOJtRkmRrrZ~@7kX&j^J`J9%z3l9ix`ozq`HFN!;RTW z540cFd#RJ1^UX0YcH$K1<47aJGFga?Cwj8xZWS^#A2#33YE+nJREB%d0V}Gr2y61B z48CaFUS-037Ay;iP*16wOvDLqsZ->xv zB+BSSwegsn@XmOLKCC2RYoRy}f0P;ErG_rr2D4?7iP^52G4M)uB?z@g7}*(yLH?`M zg^xl#xzDn-KrMwll^QepitmD~3~!`FTq4-`p$Mn`8u`a4{gL=@$fd)`MU@QH4Vdmp zie&nPFU6i@k)GthIZB84qZYO(3#GBf!VHo}jk4XP;_OSV%Dmf63dXiypnn$!8 zsW@I#X$LUQ_BG>~@wlk`5>~LhYrO-VL=rrr2fed~o>Zi>kUiKtgEfQgy>`X zB~ejEEQ1ZH0KEB!IEMydE2B-;PR4dT&*PB6vBixo4W1Fhm6lcgNVbu}ij*#v>0t?j z;`fO2D%P^Io=U!Lwu2}^*e`G|IZ|_0$$wh2B0J{%1BsxX%Tggn-iVR1+Gp0s zb{Ae-rG5GnfzlIn2rPjo=71Rc=~44V>dnko3hUD|`mCoy@kSjuD#n5nG>d&Wy;np7 zCJG7v0Fc5#4=75}r@J5YI(7qBOX0a74c&lZFg&x3&tU{P%&X~aC03*yg0bz46y2e+T;MA{SusF~PtH0dzpRKYhyzCOBps0K;f_thLwJu8X`G0tVUxz4He8{bF{7Q3 zBOcLC<`1UTYPskaa=za2Sd1l_mqu^U`oj1u<*wFDlgqozxk_D-XEO)Q_*^wH4?E<3 zOj?B&0s6tZn&h|E3qU@R?p!gNZ1b%}*g(@7RWR;Pwgt?9Kx2b7kZGjNNrpe+!S)a9-u}0@`L>| ztpjZUXXt|=l-Sw_NW{oUUZ`Zy(8{WA+(tv?#2H{lJk?mN z)7Cmrmr)xPx}e{QMy#DU0talR4$R7VNBsjimLi)}(jgxi72||NvhicK`GBo#jaB;K zB9pw>3d6h#JCH_UJnDd?7_l*)9%(2OiBwQ`kp{n#&Nvh?GLX)6A~LYG^`Gz=*P&q5 zYLO$xzsQLeFhxCBkc;<1A*bl|UMN(S`Jimpmt*bpXx_`xD$&_ZAehM~R{Q{UY@i`8 zRL1esC@04{B`ZsFMG5C2s5+Dfq{S)y%LHbk0w3Xea0t17ckza>yq_oEz#NYef;W&9 zY?{Rd>I+DSr~+yEZ??#QT+jD_KNiL>1AVm!#& zk3wb$N|2s5RwZnH>xZj3#wliPBo3mYY#)m9&?aQC#0Rc!9PlczpZJG;DsngDJJv%jA{>MSB!kxI4`OVNx`@2kN-~KebmYo_ zP9lwL*`~0-_6%6oJY7bsjORm*Z4s}x_ML26OeM1t9Z-n+pvEk);((5VG!7n) zBUy-ikX(LW4>URj1S82v4gf(nwLOblq{<*+@j|UJT!3NKctcyKnG(dVvR?FJdM|vc z!8nX-Sj3S{IYQ91;>=PH&`SACHuplEkXC%A3_)KWt}~nmm4FnjhiO307SR0*{%>nG zd*HDcV@zq}(^Tfi$@KZ-C8!MI8oV-w!QbPYPU1DKZe+x2$a$4r3u7zQ08C@D5YUFsp~7Pzb8*H+)iOidN@tkeK-TbyMzM@1dR zZL$~dpVwV^ypO#M=1S3SYHOHxN}Cj%YQXPsAs^#gWb|2xIgEHksR_o2CbPH}XP8U+ zaqrB>Fo!0AGh0WSWV6Y-yB-N58$j|PE>M4(JLV#@EC{Ub_^75aV`bkG>6<81sW2`}=K&+?csnt{tllrp~1iAxhOU@oRLDTdkd z$pRjjGuk{SGXu#<`yG*Pky$_j3LwKZ1e@|-%AIB=Gs?CyQ_WX1*OObyg4!T91_sV~%5Q)3$A}b60h70U|D_0J(}^mJN9%VNM^6z`{JTo0zu3o*rT z?<>NJzR0|*if29>+%it!u+)_v;KnoqtX1%q-T7g>;huZ(8E1F6v=0U`M(7u5Az6ja zV9lb=;2<(3RhIZj`+~N>jH#-EpNchp&=oNu-TNY6k(@P3Id>$OahS;oEay3OW?4oE zORCCEyfZU#NJzltxZs=vdV2IjwnV`6S3@Pj=d53xa_XXW#qkv2#-5TFwW+ZHIbVfN z$u&0IM5LvKm3(LVu(fZ>3P2sREMT9SNqoaj0uNHYio0}-cp*=>z9Aw|LS%#JU{)e( z81o(^Z1Y4SOAO$z2!veG3YUf0R)Ge#JZUCb?HvfwojH6_KxSl;YR&rbndEA&3sk5H zFo@Nj8L1)=j8@WRo_D2nFD$JWwa9ma!9d4kkAlX$j{ON+D5u4asIl0GPqeuv3mLWa z*^M@pnI{}MeX?mPW$wuVDRf}4#nuN$&_#;v;vJN%?Md823%;6nDuoROhY2JEr>OX5 zyi1cxxt@XHjCVsA;~abrZ{VVmcWRlLG6v%m+#~-SHQ=Bcw*vRXvGLD3)TixH0+^Eb zv`RC^eI19%df{HKrw`8QRNh%mt_fT|A~AbW7TsekP>V@6BkX`-ldspAxpe|($O+Cs zVP@P7HWRaI_kuz#w45lXlHgRoXvg0gCepZJ!PRxKOH;@OtPSFf@` zd*Z!XF03%2eA$4w;5#>e*c8r5V{Y<^v8=5Q+&4)3wbc3GZX9NH)~i zhUEZ+qe{ndkyuilQe`cgN6zynv;yjha!r?BC?6pWYZxC&zUU1J$Vxzs6Y?m2lvm*C zLTVScYNUzJMaZ7}K;3YZA%9K=#Ws~$`-`U>aiku2wNViYD(^%~jJ*<9h^^Llx= z1IIk%v9tp%i5jz~Gc*X@TKlUJ8fX-9;BATp;_;_&%^@(8FWDG)N&RZ5jlF8NDHVfP zJd1N|&t%I&1R?-!`GTNKoAIs6X;?dmAyM<7y4Tq3nEet2GcjQTb)>tEbL8 zH4WxIsDL!})OLgl8$-iD-7MtrH4!VkXP27G?^+Y;D(@6gFGTX#YG7K!%tFB^40{>E zrOxA2{I_r!bBcYw%gU@=HTKvH?;L&-jsPlDF$o=lR>ftNX6+Drd0Qk3ja z1sQ=t;G;T@hS;a1K>YE8b2G(}ZDR@^Ld-JjP|Si(smw?ec7$QENmPC_9w9a2eEe;n z^z=WATxLOf0;C5#bsrpgGqQM!3tO!Ok4P8aK^QSTK6?w%GEmLE6@O~CU^`{4WMO| z@cgY(m!44uIv$$CHT-2q)&U$q%XaT1CCK7yd=8zYhQ!bWGaKwUpGoZCLAk6OQLCJ? zb;KXUJInJRJL#j{h5TI(nU z!>5tc7`%&XpCCDXTz&WAofeADv=uGekk9?mSZbfy;y}jOQPZM)+G$0Joan_ z@*W#v5p@GKDFHBrXo-+D%dr<#uz}sZ1cZSKK4X?sW~(pS%mDa&Bk@bhIh61Psz-HN z5`Zsw0yZD{z@vgOET^I#iPPARqWo!O0TvagOA8fbSQ*PJ-eTZ zW`CqP<%L8EaRT(RmF8YAv{j-BN)#&Um}oJ?K*^SU%7_)T5x0vT8a=c6_f2y9(B9w& zqZQ&r)&>u3a^i1$F>Pj(jHq0NSAAtWkIjZFbcsO#x`PVe^>3&Y^h_N9d*H?}NbfWr zP=h3wo@p)lPMkiiv>RHPYU^u878)lJY$TSOo=4Tcslt^+%1o#udINX@FDzIQ8mNi? z`R}9Tw&BV_)=5C|dw3c=EV589Q(k#Iw%yI_UAZG#J8MkNSqX*`(GNYRpW{3wA- zaxeW_Y#v?rbMn*s>GNvHhA!jWn`usDY=*@0wFn1RozJ;~(mhRcrnL~o*g`ANs~J$RCvO!|B@>+O9%PP9Ans1d#}CtUUm;_I ztYR6&Q9SD{r}4i#2ATUT*Jh)q#CU34A$(GP$ZhxJGj>2o=1Ueop*6a&9FluRQu+)V z(vaa;?Xp$_GKEE2P7CAHMi_BO%b+-KBm+|FvUXqO6Fu-5`-X8%7;^_$L)>!DXM2z^ ziX+6(eL2j}u*OeL9jP851@=hsJ;o{hMgXJ(P0=825nvG;fwz{730byQ2)PWOg2HD> z$1!v2jV%zf%Q&K-d`28Gj*uyveE?JJUKZQl6#Fy|hE=USTcXkeRoa&yM?DcI;EaB3 zDwn>Xc-(P?NJ>%B!y`(uF)Uca4D0gVNk}e!4aXX1C0+2Ql|s^fnIx!l`h!|t`G?0> zDo*-Vd?Q?F1?ZIN7tbL|jKk9_wQw}Yigc-G!dPTYc!{jXUlJ!_AVuMnOag=^g(QJi z@eG(455X_uA=i0Ufv=s{=Ae^Z>_c%X{@xbjlwtrw68xXCQd%4d#GuO*gS0r*Pm&N7 zEgP7N`7r-S?b=2gM?DgI%;76goX}f|T!uFSSM9=aT&WfHpR!3>*euY_-}s~cscY#4 zmD3-@89hS>Y&PX?T(}#bGX!1PlTjdAJ7_e3Hz<~f<(6imvN$d*C}$H6a5c39d04!i z$1JGA{J?K~S_5dj!3Fa+3+shZ8()yZEJZP>>nvLlD;z@rEq%bLagMVL8S-4VCi4a6>rDbgW3aQ@149AMzbJFUo^L(N-K6p-zDr@KP^z zBK%NzLmOp?*o6EsZU|NCH=_)Ld_*_(*M%>2lpb1O<{5QhxX9uT^_WR+DLLuTMPvue z!|Bj$N{pD~8RkJxPn(MIFd{vh8Bm|sAL0>yT;kYvJ+y5uI!LaYk=LYvvk{4CFrtcl{lo?JsLnvX@@@E!x3 z9|s@QDrvRyP`-vb4Z~Ei?uGB0IIf)LCXTI#t1LDXl2bAtzC$6iwOV&^-e1T?#^b#a5EAPrw0>a?(6T z59-blq@oQojwD)vBTF#Sd;;X^551%{8BxnknTC%;BTGFoE>YVuu^}N-xv87p#c{aE zW5hS;v%i|Mr*bqL>S650=g~ZeGueQ@e|v#cH6EByv2kPb+Pzl>!Rb>H)LV1RXo# z*YX`US7s%dN->zsiDP3I73o{Cj^;E^OO){yb5lfT)DTgq-?dUvfI^uRC_#GjW&Xoj zNQwgfQ!bD84Yol@1j7geD9grKjH*}izta!P^@Z%sVyLyJj5>%hYR7G0CyP~iT(EHm zMJZYx?84Jp5Vxc|8VBVuUW)@T&ru7U(4bCEL(z^SWqMUmiMEJT(s~(igGe3;<@_V+ zwkBo4!istHdxDJd1j6LdBZUIyD*TZcfzpYVGWNnt9-A1M1ZIAaL4q)je6fkb|I=OK zf^>%KG@cthT$CB_INpt#Vrvztmb&O3=@z9p4qr{Luu1^B$Jh$F=1e+pNPL4f1P62Y z1cpJ-6v_saX29$Knx0Y@1i_Z&JBX#ZE=kvH0uI&mQUQc2l*wKwn=cH}=Jrf-(!V5` zX)#}6pxVHTbY%|BQ)X6+e!1~DEOPiA5AW_W{;h4zqG%_-5cdjDF# zA^xt$zqzhNIz_JlVo)tI70d+H!n3Jgj=#vaqmv6)P%x#@JPht(ZUg{wyysCjY6XOa zRq36$kC9Svg|(7mt3<ly%=@y^A)_697$NU~PL4R6aP>kADk(vl$BjxvT35do6 zV)_49j%Ua5Cp@hqYv~oWEc3yXhJMSO5vl^ez#zvx6fO}p*pBh`HvQffG((TBzCNel zW;jp8k$sGaZJgq9dd2lfNh8pH2kt)J%9Zh@d>Rg zom&$c97bS68GqLy^)Kw6_Ef)GS7u(r@n-#q44frYS%y(E1J1L!m3YXq9m{p_YYJ=+ zW2n?3Hac7kn3ca-fZUiER9s-ZlrJFmGjdu?mTZ*HqMkyZh=V;k2X;g#2jVP}$w`Vl zYF$aP23rq~b}}Jgg_08={L_@^IR1J!low+}LEqMDBSM2qHkg)WmT|X>Xa)(qf#!7)0s|x1;p|6U?~C6;o`;fv}4%0P>?Wj+0CoF`42V`-T}M zW>}g4FdU#!10{uU(1I`|EB;8Cgfz65auV=Vos+1QXoe-({9rUY7N#+oi|-SM`XC;1 z*$$VFP#35g>_iOF7g2XT|UdqteqT?k-#7u%-A?wHwEA;}JinUTFuoJP(wwTzqc%pe* zN(LsSTOKP@uF!EY&u9nq2xGj6WMu~!4~Da2E|?fhy3S%gTA(aTDU>#kfLDN>jFKwn z$YqgWsS8w%Zf^I=JVRuZXAs*!w|ta3qdfQ`B#2pjXsV)sp(ErNbPujtq4)Qo7ihGX z9D`}7W%pI{`LKDFio^-@ z0Y7d)N!pHa32YSR$hq1q%BFGMd~BPohkRHyp&ViyvCSG_H(1OD=Gfii2K%8cVtM5w z+3HVu9+iM7i&t@89JH+S7=fhF20>^kNW(;>pab?Nzy;N)kZ;%kca)2I!3*EW3+eG~ zABZkI=4MfX%)*W_X7!Rkz?>NKw*Xav&0g|{&5HLzSS6Mt9#aGoZ;3c6m=$^9%1J#b zD2r4qL8+27g+dCOg?Op_L9;Q`M6@y|SSs=d7#j)zIUogyE3_FLtIl%=&|risM-^}h` z(j~@7Irh|)`)ls4eEKO2N(Bk7G6U`hGv{TqZn~1H45@H5#z<_eqlO>yFV>Of)D;!- zT1u#ZoneoCMGa6W9V<5ZMqfdP-9%M@m>B)Hp0nbX3&OHwm+$)F1SG!FnW+Yaec9KB z7I+8+SLIvKNpU<^n5NHyQ@%i(UTY%@Iaz+coA>Zu&#A;)wH zyo&xEX&8ArNJZ+km-S|IqiQp4M4?-&TlIVckWDQxI3|x(EpcSI*v2u>lwR4Q!@`Vg z(1_qjC4dIOtyyj$8RyTNZvR$-cBzUZjY<#E00(jwSg2E`4_7E|M3cdpA_r5M(UqNZR4 zAVvqV zhBJFNXhTgRXnCcfLJ~-K)^-6okr`5vRrW0oAC=!*z z8}cw%M16x{Ue9N$MqM|x+wcZlQO22-`-Y26O_g_Q9cGhHDx5%p>SaoAH=h z$_2*g4~R>#Bxh80T^483HK0z9Ru801KT{T@cmb~Xa}4a9$=zTyDm|wUJerZo9A4<@ zvL2+}dagO^f~p})#t))SeLHl*i{oA~03Vb>K}Vk~a`fd)l~Fd7!y-15{|NP2Iewxp z_!-9h_LaJ*H^nJ%s2D}o>^>6EW}~HRj5e-;T^K#Emy0L{uwBBNBINp#CFT9PnkqvX zfQ%OlqXYw*W<>eC9G^9V*a2JuMR5&3G|VOZ1=@&xxPmWWrLdmO8Vy1|>QnPp82L$7 zH_HRBW!+<3h8(dUN`L38=Z9rv^kR~T+_(8u-_X1lS0+QNrKQJVOuCkcY`!#fiNC%OPw^oBrA5n?%j8`yEDAJ&* zP!S{mOsP200MGG0U#-vP?@W*o5zW1vPa!h$M!N5&j5sl$XL~1J5m(C=PVod8fCx3Q z9^*`TzA2%q9g%?yUzXvvWq*dpX zy9H8E&FshHy0|&sM~r;haL0BEw8%c|tKo;n7a5VXf)Aq}jBfU#GUKa+DmYSMEBJst zFv3q}5p2QjtIpvgokT6dO}amxUM`BDPauFwaZN*RqhJ3%@yhzlxCyJ$UaXL!<67xk z_c=5aWKPAzA;pA5NjCXxp`6yZwyTP=%0WVDBmc0X)HhJ2*lKnIcJT}iO)d_P`^<2F zBl97`Qh5=uh-U{7i|h|05}>I$umwIYIh6k$dW^W?^JIwXI6lR+Oq_^sSL#Z5=DquX z1Db!{x396W?5=&IDPGmbPJk$=C;@}xeT6Mnm1?Api@YhFv077|b}6qTN+DmCDcN`{ zy+{>g59dM7qj8Ah^@#Zxzo1Bz+!6)#Wht2wbEH?mS5^id3JowxHdUb!!m|=^PY>H$ zIwdzXH~7ltM_A6wD_4dR;MMdN_8*Cp7(pymq-|iWSSQDkkx3!)04-4wv2ygDn%m3# zoh^n1Y*v4KUWL&GZIJ6h1~z&yI4FSZaFc-)qEA8wws;^Sr-z;yVPZ^EnRe-bKFdvu z`%^B8Yz}?HE@2K(fz3Fulkp)s75C!UGhz6=4UmfN%`So3UbZg4G20pB(7!MH{ zY)ix^*`^Y7EwH0&p*Kb*K^8_+4lSWg_fc!=f>6}7nFy3(;ojowdB9=fH zhVfCoDcs}~epQw&4H+$){R+5b32cOAp)Op{QPYG;W+fP7;P?tFikMWx30y`wZOnv% z7LZAF@dPWJjA8uF#AJlh@skY`% z{T{+veu-~XB;RxqbR*a~lLRya4$%drXn5n#{*!3JNBBe{GdExYM;COAxQMC}9K}18 zO;yqlf2dJd;yKWj{`4XJlV{N9T!3cl4U<^63a#V*1XL=dS?0ie4g?b4e1r+e&%z`D z`gN+4<~7^G7JLFsiT!yXqMbcKj&tC}Pf+5OETq2rW;{&`w;*NnjnZWopPj`x#a9%W zLgHn*ByS8l(lf4s#GnZN7rsz?NamRH#W*n>uLY~BbvqNA?f-Z|~HlLCQ zL`*@Qv0ucoy>^u5$lU<8olQ2|Gp zC^i`d+A4H-}9Sv|}q(deV^FLI3cde&V0H6z^oB6#&N%aSHuh{VkrvxoG? zpvanfSQ!Ea80Ej@v$@Z;!ZEB3Bsz3#BSY2@hmwC3TKnO8$J#2z@&7 z$kB4cTjlRWV!VlX6UaDuiw*oyg#~P#%->S1$ZAEa0#&>l2&Pl)gl$PE-xz=>wjvi# zN5g_~j2LrJlK+yfYbxqZ&msry>{UQBeiZ=PX((IG1W{_l^SV_X>z9hmvGm^x9xRrc z0#baB{T62RZAT-2^6bQge7eAh(2MVM@18YbTv!p<0Je-goa)ZaIiQSDV(CKPE3`7j za7nyJjffYDXRd7EVMWokbDpAF_%CCm@YxL)<8!W}eJc2%b$rf+=06MMSO;Oj%Gs5P z6;>LiP6fztg+9*CYd*3*8mKST&RC#zEIsPN*dSZ+t-2FmED{x0=^x{d7Vl2nZ7&j%?5nCC^&QHV|*{Z@)J!r_p&Otzq*x!u6 z&=CO}uc*+D`o#tRVas&n2m;#}Vi^mY%6-AFl#zYVZ-5p`i-TBk+*vG%9z<>6Jn&kK zC#Sn}j>=L6t01-%HKeAeeVN2RHDYG+J^pVPKIL|$mZz(MYM z*IKSnUge5>(Rx$dB}d>(wO3*s+B<4K6W+z+;TYxxwng+s0Pq~TLj`?WMs(p(@Lg%~ zqvknU9u*%}#TC{+jGj+LJKO3mI5NMcWwyUZuVM12Cin=?)*9oPYy^f_6BJ5nS;t@sxCi{!Q<+tY211&pJ+(Bt=%rD9Tm(HLZ&d!>rTn`I{ddq;Jf{{wS6LeNsJL0bc~@px zGo+%U^kJM^MhY)u<#x{^b;~s{ag`dmHypLq_xxJ{q@Ow&|N+^j#3d5<*5!X6xsDPii*|BuHV4>RtqI@BkE zKcjB=7z9EugQCHDFq&FJbffs74m|zQ<~N8BjIJYw#3wJr=X5A{=QA~Qmk4z&R1pU@ z&?9Ov21dPDH+^+6qrGOW${deJ<;JHYX<^GPsn9T7#rHkl?x@BBZbbP3oP#(}*L@cW|7`LsY&Q z3GIzSrgAb8=NwD%`M~<64;g%U!>pA(f;cCQ3oP!)7bC7>&)52d=>9fHS^BEVwZ@XpH6n4PqX266Vq7Vr2qF!C({~ zeZx5_;ux_An8)B32P6c1&18`ZLdx4e?Q;yM$#*eNz~6JpRwXd}Ft9@o#ykcuR*Y+V zoLg0Wq5)*VZ8@J;v-MZc*G|V*;|23&@J|m;@vH5P=;VP{xLp@%Vi*K{fBv7bL!|*> z+*R0Uvan9@$MT3PO`r~%bv0Wto1;sNFV%0?fC|SF@Py~BFsUXs6Ca?%d0o+AO%xBj zg4F)qWH<4Xu45Dr*@tCTI-^do=Mf2I@papN6&t~MOBVfZiX|8buZC!_mdU~kW!;cZWqLHGF zKugberX-LDv}7mLPFr#AM*0Cg$<1qZCEg! zV|t~o?n}}%hCB^p$Nb&cM4j|uW8vC(iP|u18z>mE;P>%b+1Yr(KnPP^&_=>QUgQah z7v&1TgxLknb$b(jD*^>{Ju4tMB5|!ljTk9lRC-B16#Yod%aepV=|(M#S~YG<#`*Qehe%N|1}l=~xVPAi_m|qV8h8qbELsN8W$Q3>6CJ07=9Z7x0C} zU{UqSAEXodEOBUlOUaOp5a9$a-8YXh;Eq=l;e1gS)`jDx!nyd$d@bV(s~BPp(L)c` zsSYAu6?FkW)E#)sVwJQ9-l#d$$|%W*MfMDzxP2SAGknU%rahZ|G}J)|!44)ykTcw| zbufP^A<`I+h+4#**_pCXaf~|(VfF(~Tm(iQqds6S^*Lo-lm(}JK~D0B6xnu>2)rYr zQueE&!MgRzbW7U_pWqrq|5o@FI zRQN_dtzL>F&(J;ABS3=`m3l%-k>dmBk<#isA39K>EBw#s9o!HdMdkeFye{_B)Bkv! z_&{5P$e#VT5p&Jye?%~6SJO(DH0Lx$<7(%-3o%A?nY+SW<*sozxaDr8yVx+F~we$;f%`-EG506#lkU&lXWi%B7u=WKU%9Wk zuerZ--*De@|Kz^ozUO}6e(3(q{fGN6_uuXp?j3hX{TkV!TBp=2&mn3b*{-lnE3Yf; z`IPhGyp{tj{9cOm5?%fh5}#~bj&EUu*T?gS`@$Lj zFFI)-&+8W>a9jZioBpmi)eR*T|CP0?&QyL?sH!-{oWFA88C+*z!6!S&8JZ%}wq#)H z4$eC>a>)zWy|#5+Xj!=x*)Vu>AWq8+4bABj*YX}WY(|Sn2Yw=X!+MP6 z$7Y!3IA^;%8?#z7Fy48QyVPCou5?$s>)cY;=~lb7?!E3-_kQ;q?nBnEhKbv&-soAY zcg-;ev|H)FQ!;y(+wfGN@^B70Vc&qgM;VTr^UZY`Ct(_xd#)Sej4;3JfA~J8aE%GZ zPj%gyx#3S=`I&81cC%};|5hLT>iLQ@-IQs@E=C%*05USok0aEFPqYag=o|9>6U6-~ zahxNzBSHV$rvITw!vBsztBK3e=2&* zZycEda#>x8HU<}C42m?kexApm!1JgJJfQv0=8@rcd?g*&uxwnXB05;tVE6FEEAxRe zcEnWjuQiy!3?y}LriXh;Mkc$!+#q?<|lfGqps>AGvK8@COa@10zTID7vG$V;M z4J3hxM9C~&jNu6jG|Zm>k@^T)EwQ2(q$wh&<(cF0q>qREwR&=b4eMbFc zr{u#C|MD4%fWQoK@T+Lxig6Itf_+Z1U__Dkd6v422gJ2QkI8r9no5-e3T*G;(I^5j z03vk2pb7W_o)`*o(5^7Kh_=x>J?KKAin>t$i@j8nLi|!2L?}Md|DZOtrYq49A9x~T zD@p@)f+FMxD;$Dh0!J$B!$S$O4)%hzZihyXFnJ3cs$IFEPVhy(p%jow+30|I^>p(Zmhcv`{g*d-fhJ15I5@kM)Xrx1WR<87TAZ&|&5UE|p0r#4QU(AwU( zX!V*-TsR-Pn2%Dof^s8r+?mL7N$Eo5yl3Ixx6fa5>n)8J&Aha6(SCF&Xu>WS&DP$nzPkxaQq5 z+-qgMlf5D8;f88G+yFh?V0y^qHLi;qNM}~TdYjw^Hx+AM$IG&tAms$N3ewZ6E1g@l zY14+OemeYuB&4rE$il zO&eD)yLA(AcE%N}mTv5vv1awnosE;uoX~jDx=o!M*WvQ@>z1NurHsp~cwb(@dD7K* zakm`2P@Yb_$3v3$14XxhpYhH(9-rxSd1P<7aYyBjU$c67=ek=uZyCSr{b$^=bUZl2 z_3su@h$PIVv7y(%X3*lKh)RzVZOm1 z=}uir4g%_M`0%a6s%z$jR-v!apE+rydDQ#oe51bUQEPl zsY&SFPR5$4v(U$#iqWxY=;@w^wP(|Tgqgt4EcAM3BNEI33NFT|*<8eid5Bc=(GOk# z+$==Ze<2!%sKI1;+ zPjUCT@4DY~f8bmEX!m;<@wpe{JKy(X+~e*^_j9+;z2%;8fA0PsV?LjQjhDO4(DOH7 z^X={>i~)Vq{eyei{kvO%(V$n{KVp<AL~!`r}@*7C!FC9 zxP$&oKi*I9t?rO_exh&llf3usezKq9&+=#css0>4&7bSf^Y8J~-7np*{0u+SpYLb+ z3;b+^f&sYewknHJA9{K;aB=qezm{J-|W};wSJx3>i)v7_Z$3s{YHO_-{f!gxB2(^ z+c6@x-~Frmk$=Cx!+*fv>3_rD1_}}zh{ObxO%y03Z@lX2C`ltM#`_K8$`>p;j{L}sm{u%#8|0Vxr z{}un2{#pN5ew+Vm|D6A-f8PI%f5Csvzv%zgf8GC`-|qk3zvRE+zv=(MzwE!|U-AFw zzwQ6Y@9_WZU-jSdulaxR-}T?~JKe|pF8_W11Haqv@vr+I`hWF5@;~W%fIRWkN=tfZ>0M__iy=M_+R>8`M3Q$e!oB95BfvF1s_5vg__VO)P}yH zU+5nOgn^+h3<`t8kT5jVhhd>1923gn*f2bd2*-uv!wKQUa8eii~rv%=Y7YB(oM3+IOO!h6E>FeA(i z=Z9J0f-pN=80LhF!o}f|FgIKp=7r0`{BU_#5UvOd!-wpSN-wO|f-w&I^N5X^Q55hy?qv7H3hvAX%N8!=%vG7><F{S^OZZH9GJG~X75+SYE_^<04Sx}y4qph*gfE6Kg)fJ% zgue{WhQD%;U>sme_-ps5`y=;X;koct_owc`@O=0i_ZUWre?Pq79&#TIUkfjWzYSjx ze;2lgzYi~kZ-j4#e+Vy!Z-rOFKZb9Ie+oOoKZjStcfxDoU&438_rlJwD||ovAnXo% z!t3FO;a|g#!jHqhg}ve5!%xD0grA203~z-03U7x06Mh!{JM0TT4{wEEgkOeVg}1{y zVShLf4u(S|SMsIc{<2gm)s*^_YD;}f{Yw2y14;u+b)`Y2!KERkp{4rLuu?8$=8tZM1^|r=(TVuVgvEJ4wUu&$tHP$~R?q@_kX2k1e zMm}anK4zZXcgEVK%QvoH*LSJyYiBIm*m+xL?NaUf&RD;4{kqPZ`!2Qp!1I@{-njhM zwJX+i-ac@7emvm(j`f?CE=T*nX~6RAuy)q+r666~VY^wVXX&QC7sLuXV}%!3g`L_B zxF9P%pffw{dqHHQ)AqF&7{yNQ240vmGH_*nJmA8Nz<`z6VcmtyS(X~Jbt?;B2F}UL z4qTNV*UVYAbYsmbeAHgFY4w_p&f3-5^}Q%cvN}p~kx8=JRCiJ2dA04sMHh$FHx0Zv zr#tYb{J8Ft0wZ-dSA1Eyv9ojCnx*SHRxhueyL9=jn>uUPXjeD4c-@-9m)g0epf%cI zaCH5qnl<>SooD6OS^0T|B6aHuUux%B`E{n?bxSv_zh%?L^&3`omM&Pgvedb5W#7x9 z@av=SmznVEwHtKVs$18sT)OerwQH8%x@pk*;#@(wb);m%RuF}{Y+#zUZMZT!)Vp){AoO9T2IM@-MsYWru z-p;;M_2NWI=X{mL)l%W&7!NOPbl0%jC`kKU&p}+zK|D}%8xPf7#m}g@$_w}Hy2y)a zdzL0;Ql*tF4R*5iGM2C(=S7`lNg5CL*Hwx@qSns76=F$V}LfXE#EbL3^VimV9$4yUr)4s4w+h_1|p-L6a&Uh&78IMlt3r%?t zQ%4Mwjfl43i0U2@k3^>%Rd1R~r7hccCb-;Qh~Vs5lGSlf+v?mwMO#$XGBjb#zAi({ zWN6CC-7{9+Shvz%q2gP}@{@ zO;^goKsJ_8xv{67Pu_ug9{R4^kLPL1T$g(W1&k0UbX@C`E+8}_6cUOEjSU(R+enRN z-`%4+!^M2E%g7odYmBUMvc}0{ZmhVR{N!Yhlb@U{bF$3IvPYIZvh0y%kNUzR4v#oI z;_!&WBMy%^eB$tl!zT`(IDFzb?iZgpeB$tl!zYdrc{QRIBWf|C79(mAl2;-55|S?= z`4W=lkSvE}IV8&=S&qnZMDa$%5fMj391(Fu#1RokL>v)ujEQ4R9An}b6UUf1#>6ou zj~#azS1T*Jj&6AyDuJj_+|x*wSD24lo^ z9K*49W7RSUM|y++jTEauid7)RDv)9oh}!Bg0G%EK0;$LZQjrOyA`^%>^k@(|;?Sc( z=!ip)2I%x?5QsSRXb?K$(4#@LqAgDihPiFkEG~dF_Uut$RIJ(viB217DtThxeiF*?Gf_=-cPC;D}!2h84Fa%EMQw$Qq{|}ob~IYLV`;65(|`fEKuID zKzYXk!7QIt$yTyj*SFCZJ-ooJu-uc5bG44;oQ(%XSue$FZ=4OW z@h*nURBTK;$&Dtx8D~j8O;nq)3dVC?ds#G9vW*dz6^nElXLvsxh{hPHS-mDWskbg2 zV5Y-I0EqxFij~HNEm?&ztO4FAlqND@Y{1BX(11V#-`L@%d0;34W7#uyxY2NP4L5eA z6t4Q_V$Zn22^e;6{P75wD&J5rV@E24Wo}&c>0)EqH~!$sfsb&*Se9W4O+W#X9jU>a z-y|!h*X5lG@TJ1d7iC*%v$>LGt;;pm6SKsY=icnPl>K>{WtcyTTitW$q|oc0V^QEM z5im?VqPoQJ=pnNaFPgQIr7q8MRnF#Ju{6pO*&c5@X?}CkplvOXsu~pQB-hGng+$jp zo+cQ7H>uFBn!G#5oSmdvuY|m29t+2u$jt2wTE-C z>&mGHQcg7o2M2pHNpa%A17t8n)s4v_f0DhHW~$AO}behmDL^)>Ka>swg3XWhd!KUm-6eBZhc&F|Kaz<*eOv^wp9 R^=He$?&EgLd4Nx=^)H(@vR(iH diff --git a/OSX/README b/OSX/README index 1ca1b27b..065e2169 100644 --- a/OSX/README +++ b/OSX/README @@ -2,19 +2,87 @@ This directory contains the MacOS-specific code for building a Cocoa version of xscreensaver without using X11. -To build it, just type "make", or use the included XCode project. The -executables will show up in the "build/Release/" and/or "build/Debug/" -directories. - -If you build using anything later than Xcode 5.0.2, the resultant savers -will require MacOS 10.7 or later. To support 10.4 through 10.6, you must -use Xcode 5.0.2 or earlier. Apple's longstanding corporate policy of -planned obsolescence means that they make it as difficult as possible for -you to support anything that's more than two years old, six months for iOS. - -This is how you add a new screen saver to the Xcode project. It's a -ridiculously long list of steps! I tried to automate it with Applescript -but that appears to be impossible. +############################################################################ +# +# To set up your macOS and iOS development environment: +# +############################################################################ + +Installation: + + - Install the latest Xcode from the App Store. Note: it is + mind-bogglingly gigantic. + + - Install ImageMagick ("convert"). Either MacPorts or Homebrew are + good choices for installing open source software on macOS. + + +Make sure everything works: + + - Open "xscreensaver.xcodeproj" in Xcode. + + - Select "All Savers" on the "Scheme" menu in the upper left, to the + right of the "Play / Pause" buttons. + + - ⌘B "Product / Build" + + - There will probably be a build error related to Sonar and ICMP. + Click on the red error icon to see the error message and follow the + instructions there to fix it. + + +To build and test a macOS saver: + + - Select the saver you want on the "Scheme" menu in the upper left, + to the right of the "Play / Pause" buttons. + + - Select "My Mac" from the "platform" menu to the right of that. + + - Press "Play". This will run the "SaverTester" app under the debugger. + SaverTester is a testing framework that will load and run your selected + ".saver" bundle in the same manner that "System Preferences" and + "ScreenSaverEngine" will. + + - To get the system's screen saver to use your debug builds, you can + do something like this: + + ln -s ~/xscreensaver/OSX/build/Debug/*.saver ~/Library/Screen\ Savers/ + + +To build and test an iOS saver: + + - Pay Apple $100 per year for an iOS developer account. There's no way + to build and debug iOS code without doing this, because they are evil. + + - Select "XScreenSaver-iOS" on the "Scheme" menu. + + - On the platform menu, select your physically attached iOS device, or + select one of the simulators. Press "Play". + + - If you have already installed the App Store version of XScreenSaver + on your physical iOS device, you may need to delete it before you + can install your own debug build. + + +Building for older operating systems: + + Basically, you can't. If you build using anything later than Xcode 5.0.2, + the resultant savers will require MacOS 10.7 or later. To support macOS + 10.4 through 10.6, you would need to be running Xcode 5.0.2 or earlier. + Apple's longstanding corporate policy of planned obsolescence means that + they make it as difficult as possible for you to support anything that's + more than two years old on desktop, or six months on mobile. + + +############################################################################ +# +# To add a new screen saver to the Xcode project: +# +############################################################################ + + It is a ridiculously long list of steps! This list is here mostly for + my benefit. I tried to automate some of this with Applescript but that + appears to be impossible. 1: Duplicate a target (Dangerball for GL, or Attraction for X11). 2: Rename it, and drag it to the right spot in the list. diff --git a/OSX/Randomizer.h b/OSX/Randomizer.h new file mode 100644 index 00000000..d171c57b --- /dev/null +++ b/OSX/Randomizer.h @@ -0,0 +1,18 @@ +/* xscreensaver, Copyright (c) 2020 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#import +#import + +@interface Randomizer : ScreenSaverView +{ +} +@end diff --git a/OSX/Randomizer.m b/OSX/Randomizer.m new file mode 100644 index 00000000..c0137149 --- /dev/null +++ b/OSX/Randomizer.m @@ -0,0 +1,1590 @@ +/* xscreensaver, Copyright © 2020-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* This is a screen saver that runs other screen savers, and then stops them + and runs a different one after a timeout. + */ + +#import "Randomizer.h" +#import "yarandom.h" + +# undef ya_rand_init +# undef abort + +#import // For IODisplayCreateInfoDictionary +#import +#import + +#define CYCLE_TIME "cycleTime" +#define CYCLE_DEFAULT (5 * 60) + + +// Returns a string that (hopefully) uniquely identifies the NSScreen, +// and will survive reboots. Also the pretty name of that screen. +// +static NSArray * +screen_id (NSScreen *screen) +{ + NSDictionary *d = [screen deviceDescription]; + + // This is the CGDirectDisplayID. "A display ID can persist across + // processes and typically remains constant until the machine is + // restarted." It does not always persist across reboots. + // + unsigned long id = [[d objectForKey:@"NSScreenNumber"] unsignedLongValue]; + + // The EDID of a display contains manufacturer, product ID, and most + // importantly, serial number. So that should persist. + // + io_service_t display_port = CGDisplayIOServicePort(id); + if (display_port == MACH_PORT_NULL) { + // No physical device to get a name from... are we in Screen Sharing? + NSLog(@"no device for display %lu", id); + return @[ [NSString stringWithFormat:@"%08lX", id], + @"unknown" ]; + } + + NSDictionary *d2 = (NSDictionary *) // CFDictionaryRef + IODisplayCreateInfoDictionary (display_port, kIODisplayOnlyPreferredName); + NSData *edid = [d2 objectForKey: + [NSString stringWithUTF8String:kIODisplayEDIDKey]]; + NSString *b64; + if (!edid) { + // For ancient monitors and safe-mode graphics drivers. + b64 = [NSString stringWithFormat:@"%08lX", id]; + } else { + // But the EDID is 256 binary bytes. That's annoyingly big. + // So let's hash and base64 it for use as the resource key. + // That's 43 characters. + // + const char *bytes = [edid bytes]; + unsigned char out[CC_SHA256_DIGEST_LENGTH + 1]; + CC_SHA256 (bytes, edid.length, out); + b64 = [[NSData dataWithBytes:bytes length:CC_SHA256_DIGEST_LENGTH] + base64EncodedStringWithOptions:0]; + // Replace irritating b64 characters with safer ones. + b64 = [[[b64 stringByReplacingOccurrencesOfString:@"+" withString:@"-"] + stringByReplacingOccurrencesOfString:@"/" withString:@"_"] + stringByReplacingOccurrencesOfString:@"=" withString:@""]; + } + + // Now get the human-readable name of the screen. + // The dict has an entry like: "DisplayProductName": { "en_US": "iMac" }; + // + NSString *name = @"unknown"; + NSDictionary *names = + [d2 objectForKey: [NSString stringWithUTF8String:kDisplayProductName]]; + if (names && [names count] > 0) + name = [[names objectForKey:[[names allKeys] objectAtIndex:0]] retain]; + + [d2 release]; + + return @[ b64, name ]; // Analyzer says name leaks? +} + + +static BOOL +get_boolean (NSString *key, NSUserDefaultsController *prefs) +{ + if (! key) return NO; + NSObject *o = [[prefs defaults] objectForKey: key]; + if (!o) { + return NO; + } else if ([o isKindOfClass:[NSNumber class]]) { + double n = [(NSNumber *) o doubleValue]; + return !!n; + } else if ([o isKindOfClass:[NSString class]]) { + NSString *ss = [((NSString *) o) lowercaseString]; + return ([ss isEqualToString:@"true"] || + [ss isEqualToString:@"yes"] || + [ss isEqualToString:@"1"]); + } else { + return NO; + } +} + + +static NSString * +resource_key_for_name (NSString *s, BOOL screen_p) +{ + if (screen_p) { + const char *name = [s UTF8String]; + int n; + char dummy; + if (2 != sscanf (name, "Screen %d %c", &n, &dummy)) + return 0; + + NSArray *dscreens = [NSScreen screens]; + NSScreen *sc = [dscreens objectAtIndex: n-1]; + NSArray *aa = screen_id (sc); + NSString *id = [aa objectAtIndex:0]; + return [NSString stringWithFormat:@"screen_%@_disabled", id]; + + } else { + // Keep risky characters out of the preferences database. + NSMutableCharacterSet *set = + [NSMutableCharacterSet whitespaceAndNewlineCharacterSet]; + [set formUnionWithCharacterSet:[NSCharacterSet controlCharacterSet]]; + [set formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]]; + [set formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]]; + [set formUnionWithCharacterSet:[NSCharacterSet illegalCharacterSet]]; + s = [[[s componentsSeparatedByCharactersInSet: set] + componentsJoinedByString: @""] + lowercaseString]; + return [NSString stringWithFormat:@"saver_%@_disabled", s]; + } +} + + +@interface RandomizerConfig : NSPanel +- (id)initWithSaverNames: (NSArray *)sn + prefs: (NSUserDefaultsController *)p; +@end + +@interface RandomizerAttractMode : ScreenSaverView {} +- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)p + saverBundlePaths:(NSArray *)_paths; +@end + +@interface ExponentialDelayValueTransformer: NSValueTransformer {} +@end + +@implementation Randomizer +{ + ScreenSaverView *saver1; // Currently running, or fading out. + ScreenSaverView *saver2; // Fading in, moved to saver1 when in. + NSTimer *cycle_timer; + NSUserDefaultsController *prefs; + NSArray *bundle_paths_all; + NSArray *bundle_paths_enabled; + BOOL first_time_p; + int fade_duration; + NSTextField *crash_label; + enum { JUMPCUT, FADE, CROSSFADE } crossfade_mode; +} + +- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)p +{ + // On macOS 10.15, isPreview is always YES, so if the window is big, + // assume it should be NO. Fixed in macOS 11.0. + if (p && frame.size.width >= 640) + p = NO; + + if (p && getenv("SELECTED_SAVER")) // Running under SaverTester + p = NO; + + self = [super initWithFrame:frame isPreview:p]; + if (! self) return 0; + + ya_rand_init (0); + + first_time_p = TRUE; + + crossfade_mode = CROSSFADE; // Maybe make this a preference? + + fade_duration = 5; + + NSBundle *nsb = [NSBundle bundleForClass:[self class]]; + NSAssert1 (nsb, @"no bundle for class %@", [self class]); + NSString *name = [nsb bundleIdentifier]; + NSAssert1 (name && [name length], + @"no bundle identifier for class %@", [self class]); + NSUserDefaults *defs = [ScreenSaverDefaults defaultsForModuleWithName:name]; + NSDictionary *extras = @{ + + @CYCLE_TIME: [NSString stringWithFormat:@"%d", CYCLE_DEFAULT], + + // Let's un-check these shitty Apple savers by default. + // #### Oh, except this makes them un-selectable, since we delete + // entries rather than setting them to 0. Oh well. Bummer. + @"saver_albumartwork_disabled": [NSNumber numberWithBool:TRUE], + @"saver_floatingmessage_disabled": [NSNumber numberWithBool:TRUE], + @"saver_itunesartwork_disabled": [NSNumber numberWithBool:TRUE], + @"saver_wordoftheday_disabled": [NSNumber numberWithBool:TRUE], + }; + NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:100]; + // All the example code does this, but it makes it impossible for us to + // check any saver that was un-checked at startup: + // [dict addEntriesFromDictionary: [defs dictionaryRepresentation]]; + [dict addEntriesFromDictionary: extras]; + [defs registerDefaults: dict]; + + prefs = [[[NSUserDefaultsController alloc] initWithDefaults:defs + initialValues:nil] retain]; + prefs.appliesImmediately = YES; // Doesn't work + + [self getSaverPaths]; + + // Text field for showing crashes + // + int margin = 16; + frame.origin.x = frame.origin.y = margin; + frame.size.width = self.frame.size.width - margin*2; + frame.size.height = self.frame.size.height - margin*2; + crash_label = [[NSTextField alloc] initWithFrame:frame]; + int fs = [NSFont systemFontSize] * 2; + NSFont *f = [NSFont fontWithName:@"Andale Mono" size: fs]; + if (!f) f = [NSFont fontWithName:@"Courier Bold" size: fs]; + if (!f) f = [NSFont boldSystemFontOfSize: fs]; + [crash_label setFont: f]; + crash_label.cell.wraps = YES; + [crash_label setStringValue:@""]; + crash_label.selectable = NO; + crash_label.editable = NO; + crash_label.bezeled = NO; + crash_label.drawsBackground = NO; + crash_label.textColor = [NSColor greenColor]; + crash_label.backgroundColor = [NSColor blackColor]; + crash_label.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; + [crash_label retain]; + +# ifndef __OPTIMIZE__ + // Dump the entire resource database. + NSLog(@"defaults for %@", name); + NSDictionary *d = [[prefs defaults] dictionaryRepresentation]; + for (NSObject *key in [[d allKeys] + sortedArrayUsingSelector:@selector(compare:)]) { + NSObject *val = [d objectForKey:key]; + NSLog (@" %@ = %@", key, val); + } + NSLog (@"---"); +# endif + + return self; +} + + +// Finds the full pathname of every available .saver bundle. +// +- (void)getSaverPaths +{ + NSMutableArray *dirs = [NSMutableArray arrayWithCapacity: 10]; + // macOS 10.15+: Use the real home directory, not the container's. + //[dirs addObject:[@"~/Library/Screen Savers" stringByExpandingTildeInPath]]; + [dirs addObject: + [NSString stringWithFormat:@"/Users/%@/Library/Screen Savers", + NSUserName()]]; + [dirs addObject: @"/Library/Screen Savers"]; + [dirs addObject: @"/System/Library/Screen Savers"]; + + NSMutableArray *paths_all = [NSMutableArray arrayWithCapacity: 250]; + NSMutableArray *paths_enabled = [NSMutableArray arrayWithCapacity: 250]; + NSMutableDictionary *seen = [[NSMutableDictionary alloc] init]; + + // Omit these savers entirely. + [seen setObject:@"blacklist" forKey:@"random"]; + [seen setObject:@"blacklist" forKey:@"randomextra"]; + [seen setObject:@"blacklist" forKey:@"randomextra2"]; + [seen setObject:@"blacklist" forKey:@"randomextra3"]; + [seen setObject:@"blacklist" forKey:@"randomxscreensaver"]; + + for (NSString *dir in dirs) { + NSArray *files = [[NSFileManager defaultManager] + contentsOfDirectoryAtPath:dir error:nil]; + if (!files) continue; + int count = 0; + for (NSString *p in files) { + if ([[p pathExtension] caseInsensitiveCompare: @"saver"]) + continue; + NSString *name = [p stringByDeletingPathExtension]; + p = [dir stringByAppendingPathComponent: p]; + + // If there is a saver of the same name in multiple directories, + // only take the first one seen. $HOME overrides System. + NSString *o = [seen objectForKey:[name lowercaseString]]; + if (o) { + // NSLog(@"omitting %@ for %@", p, o); + continue; + } + + [seen setObject:p forKey: [name lowercaseString]]; + + NSString *res = resource_key_for_name (name, FALSE); + BOOL disabled = get_boolean (res, prefs); + if (disabled) { + // NSLog(@"disabled: %@", name); + } else { + [paths_enabled addObject: p]; + } + [paths_all addObject: p]; + count++; + } + + if (count) + NSLog(@"found %d in %@", count, dir); + } + + [seen release]; + + if (bundle_paths_all) [bundle_paths_all release]; + if (bundle_paths_enabled) [bundle_paths_enabled release]; + bundle_paths_all = [[NSArray arrayWithArray: paths_all] retain]; + bundle_paths_enabled = [[NSArray arrayWithArray: paths_enabled] retain]; +} + + +- (BOOL) screenEnabled:(NSScreen *)s verbose:(BOOL)verbose +{ + NSArray *aa = screen_id (s); + NSString *id = [aa objectAtIndex:0]; + NSString *key = [NSString stringWithFormat:@"screen_%@_disabled", id]; + BOOL enabled_p = !get_boolean (key, prefs); + if (!enabled_p && verbose) { + NSString *desc = [aa objectAtIndex:1]; + NSLog (@"savers disabled on screen %@ (%@)", key, desc); + } + return enabled_p; +} + + +- (ScreenSaverView *) loadSaverWithFrame:(NSRect)frame +{ + Class sclass = 0; + ScreenSaverView *saver2 = 0; + NSString *path = 0; + + if (![self isPreview] && + ![self screenEnabled:self.window.screen verbose:YES]) + return nil; + + if ([self isPreview]) { + NSLog(@"loading built-in saver"); + sclass = [RandomizerAttractMode class]; + } else { + if (! [bundle_paths_enabled count]) { + // NSLog(@"no savers available"); + [[NSException exceptionWithName: NSInternalInconsistencyException + reason: @"no savers available" + userInfo: nil] + raise]; + } else { + path = [bundle_paths_enabled objectAtIndex: + (random() % [bundle_paths_enabled count])]; + NSLog(@"loading saver %@", path); + NSBundle *bundle = [NSBundle bundleWithPath:path]; + if (bundle) + sclass = [bundle principalClass]; + } + } + + if (! sclass) { + //NSLog(@"no class in bundle: %@", path); + [[NSException exceptionWithName: NSInternalInconsistencyException + reason: [NSString stringWithFormat: + @"no class in bundle: %@", path] + userInfo: nil] + raise]; + return nil; + } else { + saver2 = [sclass alloc]; + + frame.origin.x = frame.origin.y = 0; // frame -> bounds + + if ([saver2 respondsToSelector: + @selector(initWithFrame:isPreview:saverBundlePaths:)]) { + saver2 = [(RandomizerAttractMode *) saver2 + initWithFrame: frame + isPreview: [self isPreview] + saverBundlePaths: bundle_paths_all]; + } else if ([saver2 respondsToSelector: @selector(initWithFrame:isPreview:)]) + saver2 = [(ScreenSaverView *) saver2 + initWithFrame: frame + isPreview: [self isPreview]]; + else + saver2 = 0; + } + + if (! saver2) { + //NSLog(@"unable to instantiate: %@", path); + [[NSException exceptionWithName: NSInternalInconsistencyException + reason: [NSString stringWithFormat: + @"unable to instantiate: %@", path] + userInfo: nil] + raise]; + return nil; + } + + saver2.wantsLayer = YES; + [saver2 retain]; + [saver2 setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + return saver2; +} + + +- (void) handleException: (NSException *)e in:(NSObject *)o +{ + // This will catch calls to abort and exit (via jwxyz_abort) but not SEGV. + NSLog (@"Caught exception %@: %@", + (o ? [o className] : @""), + [e reason]); + [crash_label setStringValue: + (o + ? [NSString stringWithFormat: @"Error in %@:\n %@\n\n%@", + [o className], [e reason], + [[e callStackSymbols] + componentsJoinedByString: @"\n"]] + : [NSString stringWithFormat: @"Error: %@", [e reason]])]; + + [crash_label removeFromSuperview]; + [self addSubview: crash_label]; +} + + +// Throwing an exception from a signal handler is a terrible idea, but my +// thinking was, "it might work, and what's the worst that can happen? +// We crash anyway?" Well, it turns out, the exception is caught, the +// error text shows up on the screen, and after that we're hung and you +// can't unlock the screen. So... that's worse. +// +#if 0 +static void +signal_exception (int sig) +{ + signal (sig, SIG_DFL); + [[NSException exceptionWithName: NSInternalInconsistencyException + reason: [NSString stringWithFormat: @"Signal %s", + sys_signame[sig]] + userInfo: nil] + raise]; +} + +- (void) initSignalHandlers +{ + signal (SIGABRT, signal_exception); + signal (SIGBUS, signal_exception); + signal (SIGSEGV, signal_exception); + signal (SIGFPE, signal_exception); + signal (SIGILL, signal_exception); + signal (SIGIOT, signal_exception); + signal (SIGSYS, signal_exception); +} +#else +- (void) initSignalHandlers {} +#endif + + +- (void)unloadSaver:(BOOL)firstp +{ + if (cycle_timer) [cycle_timer invalidate]; + cycle_timer = 0; + ScreenSaverView *ss = (firstp ? saver1 : saver2); + if (!ss) return; + NSLog(@"unloading saver %@", [ss className]); + + @try { if ([ss isAnimating]) [ss stopAnimation]; } + @catch (NSException *e) { [self handleException:e in:ss]; } + + [ss removeFromSuperview]; + [ss release]; + if (firstp) + saver1 = 0; + else + saver2 = 0; + + // Is there some way to unload the bundle? Or would its static data screw + // things up if the bundle were to be re-loaded later? +} + + +// Loads a new saver, starts it running while invisible, launches a +// background animation to cross-fade the old and new savers, then +// unloads the old one and calls launchCycleTimer. +// +- (void)fadeSaverOut +{ + NSAssert1 (!saver2, @"should not have saver2: %@", saver2); + if (saver2) abort(); + + switch (crossfade_mode) { + case JUMPCUT: + if (saver1) first_time_p = FALSE; + [self unloadSaver: TRUE]; + + @try { saver1 = [self loadSaverWithFrame:[self frame]]; } + @catch (NSException *e) { [self handleException:e in:nil]; } + + if (saver1) { + [self addSubview: saver1]; + saver1.alphaValue = 1; + [self.window makeFirstResponder: saver1]; + } + [self launchCycleTimer]; + + + break; + + case FADE: // Launch a background animation, then calls fadeSaverIn. + if (!saver1) { + [self fadeSaverIn]; + break; + } + + [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) { + context.duration = fade_duration; + saver1.animator.alphaValue = 0; + } + completionHandler:^{ + [self fadeSaverIn]; + }]; + break; + + case CROSSFADE: + + // Load a new saver, starts it running while invisible, launches a + // background animation, then calls launchCycleTimer. + + @try { saver2 = [self loadSaverWithFrame:[self frame]]; } + @catch (NSException *e) { [self handleException:e in:nil]; } + + if (!saver2) { + [self launchCycleTimer]; + return; + } + + if (saver1) + NSLog(@"crossfade %@ to %@", [saver1 className], [saver2 className]); + else + NSLog(@"fade in %@", [saver2 className]); + + [self addSubview: saver2]; + saver2.alphaValue = 0; + + @try { [saver2 startAnimation]; } + @catch (NSException *e) { + [self handleException:e in:saver2]; + [self unloadSaver: FALSE]; + return; + } + + [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) { + context.duration = fade_duration * (saver1 ? 2 : 1); + if (saver1) + saver1.animator.alphaValue = 0; + saver2.animator.alphaValue = 1; + } + completionHandler:^{ + [self unloadSaver: TRUE]; + saver1 = saver2; + saver2 = 0; + [self.window makeFirstResponder: saver1]; + [self launchCycleTimer]; + first_time_p = FALSE; + }]; + break; + + default: abort(); break; + } +} + + +- (void)fadeSaverIn +{ + if (crossfade_mode != FADE) abort(); + + [self unloadSaver: TRUE]; + + @try { saver1 = [self loadSaverWithFrame:[self frame]]; } + @catch (NSException *e) { [self handleException:e in:nil]; } + + if (!saver1) { + [self launchCycleTimer]; + return; + } + + first_time_p = FALSE; + + [self addSubview: saver1]; + [self.window makeFirstResponder: saver1]; + saver1.alphaValue = 0; + + @try { [saver1 startAnimation]; } + @catch (NSException *e) { + [self handleException:e in:saver1]; + [self unloadSaver: TRUE]; + return; + } + + [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) { + context.duration = fade_duration; + saver1.animator.alphaValue = 1; + } + completionHandler:^{ + [self launchCycleTimer]; + }]; +} + + +- (void)launchCycleTimer +{ + // Parse the cycle time out of whatever garbage is in preferences. + // + NSObject *o = [[prefs defaults] objectForKey: @CYCLE_TIME]; + NSTimeInterval interval = 0; + if (o && [o isKindOfClass:[NSNumber class]]) { + interval = [(NSNumber *) o doubleValue]; + } else if (o && [o isKindOfClass:[NSString class]]) { + interval = [((NSString *) o) doubleValue]; + } + + if (interval <= 0) + interval = CYCLE_DEFAULT; + + // If there are multiple screens, offset the restart time of subsequent + // screens: they will all change every N minutes, but not at the same time. + // But don't let that offset be more than about 5 minutes. + // + if (first_time_p && ![self isPreview]) { + NSArray *dscreens = [NSScreen screens]; + int nscreens = [dscreens count]; + int enabled_screens = 0; + int which_screen = 0; + int which_enabled = 0; + for (int i = 0, j = 0; i < nscreens; i++) { + NSScreen *s = [dscreens objectAtIndex:i]; + if (s == self.window.screen) which_screen = i; + if ([self screenEnabled:s verbose:NO]) { + enabled_screens++; + if (s == self.window.screen) which_enabled = j; + j++; + } + } + + double t2 = interval; + double max = 60*60*10; + if (t2 > max) t2 = max; + double off = (enabled_screens ? t2 * which_enabled / enabled_screens : 0); + interval += off; + if (off) NSLog(@"screen %d cycle offset: %d sec", which_screen, (int) off); + } + + if (cycle_timer) [cycle_timer invalidate]; + cycle_timer = 0; + + if (! [self isPreview]) { + NSLog(@"cycle_timer %.1f", interval); + cycle_timer = + [NSTimer scheduledTimerWithTimeInterval: interval + target: self + selector: @selector(cycleSaver) + userInfo: nil + repeats: NO]; + } +} + + +- (void)cycleSaver +{ + NSLog(@"cycle timer"); + if (cycle_timer) [cycle_timer invalidate]; + cycle_timer = 0; + [self initSignalHandlers]; + [crash_label removeFromSuperview]; + [crash_label setStringValue:@""]; + [self fadeSaverOut]; +} + + +- (NSTimeInterval)animationTimeInterval +{ + NSTimeInterval i = 1/30.0; + if (saver1) i = [saver1 animationTimeInterval]; + else if (saver2) i = [saver2 animationTimeInterval]; + return i; +} + + +- (void)setAnimationTimeInterval:(NSTimeInterval)i +{ + if (saver1) [saver1 setAnimationTimeInterval:i]; + if (saver2) [saver2 setAnimationTimeInterval:i]; + [super setAnimationTimeInterval:i]; +} + + +- (void)startAnimation +{ + // Do the initial load of the saver here rather than in initWithFrame + // so that we have self.window and check whether this screen is disabled. + // + if (!saver1 && !saver2) + [self cycleSaver]; + + if (saver1) { + @try { [saver1 startAnimation]; } + @catch (NSException *e) { + [self handleException:e in:saver1]; + [self unloadSaver: TRUE]; + } + } + + if (saver2) { + @try { [saver2 startAnimation]; } + @catch (NSException *e) { + [self handleException:e in:saver1]; + [self unloadSaver: FALSE]; + } + } + + [super startAnimation]; +} + + +- (void)stopAnimation +{ + if (cycle_timer) [cycle_timer invalidate]; + cycle_timer = 0; + + if (saver1) { + @try { [saver1 stopAnimation]; } + @catch (NSException *e) { + [self handleException:e in:saver1]; + [self unloadSaver: TRUE]; + } + } + + if (saver2) { + @try { [saver2 stopAnimation]; } + @catch (NSException *e) { + [self handleException:e in:saver2]; + [self unloadSaver: FALSE]; + } + } + + [super stopAnimation]; +} + + +- (BOOL)isAnimating +{ + BOOL a = FALSE; + if (saver1) a = [saver1 isAnimating]; + else if (saver2) a = [saver2 isAnimating]; + return a; +} + + +- (BOOL)isPreview +{ + BOOL p = [super isPreview]; + if (saver1) p = [saver1 isPreview]; + else if (saver2) p = [saver2 isPreview]; + return p; +} + + +- (void)animateOneFrame +{ + if (saver1) { + @try { [saver1 animateOneFrame]; } + @catch (NSException *e) { + [self handleException:e in:saver1]; + [self unloadSaver: TRUE]; + } + } + if (saver2) { + @try { [saver2 animateOneFrame]; } + @catch (NSException *e) { + [self handleException:e in:saver2]; + [self unloadSaver: FALSE]; + } + } +} + + +/* On 10.15, if "use random screen saver" is checked, then startAnimation + is never called. This may be related to Apple's buggy code in + ScreenSaverEngine calling nonexistent beginExtensionRequestWithUserInfo, + but on 10.15 we're not even running in that process: now we're in the + not-at-all-ominously-named legacyScreenSaver process. + + Dec 2020, noticed that this also happens on 10.14.6 when *not* in random + mode. Both System Preferences and ScreenSaverEngine fail to call + StartAnimation. + */ +- (void) viewDidMoveToWindow +{ + if (self.window) + [self startAnimation]; +} + +- (void) viewWillMoveToWindow:(NSWindow *)window +{ + if (window == nil) + [self stopAnimation]; +} + + +- (BOOL)hasConfigureSheet +{ + return TRUE; +} + + +- (NSWindow*)configureSheet +{ + NSMutableArray *names = [bundle_paths_all mutableCopy]; + for (int i = 0; i < [names count]; i++) { + [names replaceObjectAtIndex: i + withObject: [[[names objectAtIndex: i] lastPathComponent] + stringByDeletingPathExtension]]; + } + [names sortUsingSelector: @selector(localizedCaseInsensitiveCompare:)]; + return [[RandomizerConfig alloc] + initWithSaverNames: [NSArray arrayWithArray: names] + prefs: prefs]; +} + + +- (void) dealloc +{ + [self unloadSaver: TRUE]; + [self unloadSaver: FALSE]; + [crash_label release]; + [super dealloc]; +} + +@end + + +@implementation ExponentialDelayValueTransformer + +// The cycleTime slider has tick marks [1, 16] which transforms to +// an exponential number of minutes, expressed in seconds. +// +#define SLIDER_EXPONENT 2.0 + ++ (Class)transformedValueClass { return [NSNumber class]; } ++ (BOOL)allowsReverseTransformation { return YES; } + +- (id)transformedValue:(id)value { + double v = [value doubleValue]; + v = (int) (0.5 + pow (v, 1 / SLIDER_EXPONENT)); + v /= 60; + return [NSNumber numberWithDouble: v]; +} + +- (id)reverseTransformedValue:(id)value { + double v = [value doubleValue]; + v = (int) (0.5 + pow (v, SLIDER_EXPONENT)); + v *= 60; + return [NSNumber numberWithDouble: v]; +} +@end + + +/************************************************************************* + + The preferences panel for the randomizer. + + *************************************************************************/ + + +@implementation RandomizerConfig +{ + NSTableView *screen_table, *saver_table; + NSTextField *timerLabel; + NSArray *screens, *savers; + NSUserDefaultsController *prefs; +} + + +- (id)initWithSaverNames: (NSArray *)sn + prefs: (NSUserDefaultsController *) _prefs; +{ + self = [super init]; + if (! self) return 0; + + savers = [sn retain]; + prefs = _prefs; + + NSRect frame; + frame.origin.x = 0; + frame.origin.y = 0; + frame.size.width = 400; + frame.size.height = 480; + [self setFrame:frame display:NO]; + self.minSize = frame.size; + frame.size.height = 99999; + self.maxSize = frame.size; + self.styleMask |= NSResizableWindowMask; + + // In a sane world, almost all of this would be in a .xib file. But after + // I spent 4 hours unsuccessfully trying to figure out how to ctrl-drag + // the little blue line to make an IBOutlet connection show up in my .h + // file, I realized it would be faster to just write all the code by hand. + + NSPanel *panel = self; + int margin = 18; + + // Top label + + frame.origin.x = frame.origin.y = frame.size.width = frame.size.height = 0; + frame.size.width = panel.frame.size.width - margin*2; + NSTextField *lab = [[NSTextField alloc] initWithFrame:frame]; + [lab setFont:[NSFont systemFontOfSize: [NSFont systemFontSize]]]; + lab.cell.wraps = YES; + [lab setStringValue:NSLocalizedString( + @"This screen saver runs a different random screen saver on " + "each monitor, and selects a new one after a while.", + @"")]; + lab.selectable = NO; + lab.editable = NO; + lab.bezeled = NO; + lab.drawsBackground = NO; + [lab sizeToFit]; + lab.autoresizingMask = NSViewMinXMargin | NSViewMaxXMargin | + NSViewMinYMargin; + frame = lab.frame; + frame.size.width = panel.frame.size.width - margin*2; + frame.size.height *= 2; // WTF, wrapping! + frame.origin.x = margin; + frame.origin.y = panel.frame.size.height - frame.size.height - margin*2; + lab.frame = frame; + [panel.contentView addSubview: lab]; + + // Cycle label + + frame.origin.x = frame.origin.y = frame.size.width = frame.size.height = 0; + NSTextField *clab = [[NSTextField alloc] initWithFrame:frame]; + [clab setFont:[NSFont systemFontOfSize: [NSFont systemFontSize]]]; + [clab setStringValue:NSLocalizedString(@"Change saver every", @"")]; + clab.selectable = NO; + clab.editable = NO; + clab.bezeled = NO; + clab.drawsBackground = NO; + [clab sizeToFit]; + clab.autoresizingMask = NSViewMinYMargin; + frame = clab.frame; + frame.origin.x = lab.frame.origin.x; + frame.origin.y = lab.frame.origin.y - lab.frame.size.height; + clab.frame = frame; + [panel.contentView addSubview: clab]; + [clab release]; + + double line_height = frame.size.height; + + + // Cycle slider + + frame.origin.x = clab.frame.origin.x + clab.frame.size.width + margin; + frame.origin.y = clab.frame.origin.y; + frame.size.width = panel.frame.size.width - frame.origin.x - margin; + frame.size.height = clab.frame.size.height; + NSSlider *slider = [[NSSlider alloc] initWithFrame:frame]; + [slider setTarget: self]; + [slider setAction: @selector(cycleTimerSliderChanged:)]; + + slider.minValue = 2; // 4 minutes + slider.maxValue = 22; // 8 hours + slider.numberOfTickMarks = 16; + slider.allowsTickMarkValuesOnly = YES; + + slider.autoresizingMask = NSViewWidthSizable | NSViewMinYMargin; + [slider bind: @"value" + toObject: prefs withKeyPath:@"values." CYCLE_TIME + options: @{ NSValueTransformerNameBindingOption: + @"ExponentialDelayValueTransformer" }]; + [panel.contentView addSubview: slider]; + [slider release]; + + // The checkmarks push the slider up a few pixels. + // Align top of the label to the top of the slider. + frame = clab.frame; + frame.origin.y += 6; + clab.frame = frame; + + + // Low label + + frame.origin.x = frame.origin.y = frame.size.width = frame.size.height = 0; + NSTextField *llab = [[NSTextField alloc] initWithFrame:frame]; + llab.font = [NSFont systemFontOfSize: [NSFont smallSystemFontSize]]; + llab.stringValue = + [self formatTime: 60 * (0.5 + pow (slider.minValue, SLIDER_EXPONENT))]; + llab.selectable = NO; + llab.editable = NO; + llab.bezeled = NO; + llab.drawsBackground = NO; + [llab sizeToFit]; + llab.autoresizingMask = NSViewMaxXMargin | NSViewMinYMargin; + frame = llab.frame; + frame.origin.x = slider.frame.origin.x; + frame.origin.y = slider.frame.origin.y - slider.frame.size.height; + llab.frame = frame; + [panel.contentView addSubview: llab]; + [llab release]; + + // High label + + frame.origin.x = frame.origin.y = frame.size.width = frame.size.height = 0; + NSTextField *hlab = [[NSTextField alloc] initWithFrame:frame]; + hlab.font = [NSFont systemFontOfSize: [NSFont smallSystemFontSize]]; + hlab.stringValue = + [self formatTime: 60 * (0.5 + pow (slider.maxValue, SLIDER_EXPONENT))]; + hlab.selectable = NO; + hlab.editable = NO; + hlab.bezeled = NO; + hlab.drawsBackground = NO; + [hlab sizeToFit]; + hlab.autoresizingMask = NSViewMinXMargin | NSViewMinYMargin; + frame = hlab.frame; + frame.origin.x = slider.frame.origin.x + slider.frame.size.width - + frame.size.width; + frame.origin.y = llab.frame.origin.y; + hlab.frame = frame; + [panel.contentView addSubview: hlab]; + [hlab release]; + + // Middle label + + frame = llab.frame; + NSTextField *mlab = [[NSTextField alloc] initWithFrame:frame]; + mlab.font = [NSFont systemFontOfSize: [NSFont smallSystemFontSize]]; + mlab.stringValue = @"999 hours 99 minutes"; + mlab.selectable = NO; + mlab.editable = NO; + mlab.bezeled = NO; + mlab.drawsBackground = NO; + mlab.alignment = NSCenterTextAlignment; + [mlab sizeToFit]; + mlab.autoresizingMask = NSViewMinXMargin | NSViewMinYMargin; + frame = mlab.frame; + frame.origin.x = slider.frame.origin.x + + (slider.frame.size.width - frame.size.width) / 2; + frame.origin.y = llab.frame.origin.y; + mlab.frame = frame; + mlab.stringValue = @""; + [panel.contentView addSubview: mlab]; + [mlab release]; + timerLabel = mlab; + + // Screen table view + + { + NSArray *dscreens = [NSScreen screens]; + NSMutableArray *s2 = [NSMutableArray arrayWithCapacity: [dscreens count]]; + for (int i = 0; i < [dscreens count]; i++) { + NSScreen *sc = [dscreens objectAtIndex: i]; + NSArray *aa = screen_id (sc); + NSString *desc = [aa objectAtIndex:1]; + [s2 addObject: [NSString stringWithFormat: + @"Screen %d - %d x %d @ %d, %d (%@)", + (i + 1), + (int) sc.frame.size.width, + (int) sc.frame.size.height, + (int) sc.frame.origin.x, + (int) sc.frame.origin.y, + desc]]; + } + screens = [s2 retain]; + } + + NSScrollView *sv = [[NSScrollView alloc] init]; + sv.hasVerticalScroller = YES; + [sv setAutoresizingMask: NSViewMinXMargin | NSViewMaxXMargin | + NSViewMinYMargin]; + [panel.contentView addSubview: sv]; + + frame.origin.x = frame.origin.y = frame.size.width = frame.size.height = 0; + NSTableView *stab = [[NSTableView alloc] initWithFrame:frame]; + NSTableColumn *col1 = [[NSTableColumn alloc] initWithIdentifier:@"check"]; + NSTableColumn *col2 = [[NSTableColumn alloc] initWithIdentifier:@"name"]; + col1.title = @""; + col2.title = NSLocalizedString(@"Run savers on screens", @""); + col1.width = line_height * 1.5; + [stab addTableColumn: col1]; + [stab addTableColumn: col2]; + screen_table = stab; + stab.delegate = self; + stab.dataSource = self; + [stab reloadData]; + sv.contentView.documentView = stab; + + NSSortDescriptor *sd1 = + [NSSortDescriptor sortDescriptorWithKey: col1.identifier ascending: YES + selector: @selector(compare:)]; + NSSortDescriptor *sd2 = + [NSSortDescriptor sortDescriptorWithKey: col2.identifier ascending: YES + selector: @selector(compare:)]; + [col1 setSortDescriptorPrototype: sd1]; + [col2 setSortDescriptorPrototype: sd2]; + [stab setSortDescriptors:@[sd2]]; + [col1 release]; + [col2 release]; + + frame = sv.frame; + frame.size.width = panel.frame.size.width - margin * 2; + frame.size.height = stab.frame.size.height; + frame.size.height += line_height * 2; // tab headers, sigh + int max = line_height * 5; + if (frame.size.height > max) frame.size.height = max; + frame.origin.x = margin; + frame.origin.y = hlab.frame.origin.y - frame.size.height - margin; + sv.frame = frame; + + if ([screens count] <= 1) { // Hide the screens list if there's only one. + [sv removeFromSuperview]; + frame.origin.y += frame.size.height + margin; + frame.size.height = 0; + sv.frame = frame; + } + + + // Select All button + + frame.origin.x = frame.origin.y = frame.size.width = frame.size.height = 0; + NSButton *ball = [[NSButton alloc] initWithFrame:frame]; + ball.font = [NSFont systemFontOfSize: [NSFont systemFontSize]]; + ball.title = NSLocalizedString(@"Select all", @""); + ball.bezelStyle = NSRoundedBezelStyle; + [ball sizeToFit]; + ball.autoresizingMask = NSViewMinXMargin | NSViewMaxXMargin | + NSViewMaxYMargin; + frame = ball.frame; + frame.origin.x = lab.frame.origin.x; + frame.origin.y = margin; + ball.frame = frame; + [panel.contentView addSubview: ball]; + ball.action = @selector(selectAllAction:); + + + // Unselect All button + + frame.origin.x = frame.origin.y = frame.size.width = frame.size.height = 0; + NSButton *bnone = [[NSButton alloc] initWithFrame:frame]; + bnone.font = [NSFont systemFontOfSize: [NSFont systemFontSize]]; + bnone.title = NSLocalizedString(@"Unselect all", @""); + bnone.bezelStyle = NSRoundedBezelStyle; + [bnone sizeToFit]; + bnone.autoresizingMask = NSViewMinXMargin | NSViewMaxXMargin | + NSViewMaxYMargin; + frame = bnone.frame; + frame.origin.x = ball.frame.origin.x + ball.frame.size.width + margin; + frame.origin.y = ball.frame.origin.y; + bnone.frame = frame; + [panel.contentView addSubview: bnone]; + bnone.action = @selector(selectNoneAction:); + + + // OK button + + frame.origin.x = frame.origin.y = frame.size.width = frame.size.height = 0; + NSButton *bok = [[NSButton alloc] initWithFrame:frame]; + bok.font = [NSFont systemFontOfSize: [NSFont systemFontSize]]; + bok.title = NSLocalizedString(@"OK", @""); + bok.bezelStyle = NSRoundedBezelStyle; + [bok sizeToFit]; + bok.autoresizingMask = NSViewMinXMargin | NSViewMaxXMargin | + NSViewMaxYMargin; + frame = bok.frame; + frame.origin.x = panel.frame.size.width - frame.size.width - margin; + frame.origin.y = ball.frame.origin.y; + bok.frame = frame; + [panel.contentView addSubview: bok]; + [bok setKeyEquivalent:@"\r"]; + bok.target = self; + bok.action = @selector(okAction:); + + + // Saver table view + + NSScrollView *sv2 = [[NSScrollView alloc] init]; + sv2.hasVerticalScroller = YES; + [sv2 setAutoresizingMask: NSViewMinXMargin | NSViewMaxXMargin | + NSViewHeightSizable]; + [panel.contentView addSubview: sv2]; + + frame.origin.x = frame.origin.y = frame.size.width = frame.size.height = 0; + NSTableView *stab2 = [[NSTableView alloc] initWithFrame:frame]; + NSTableColumn *col3 = [[NSTableColumn alloc] initWithIdentifier:@"check"]; + NSTableColumn *col4 = [[NSTableColumn alloc] initWithIdentifier:@"name"]; + col3.title = @""; + col4.title = NSLocalizedString(@"Enable these savers", @""); + col3.width = line_height * 2; + [stab2 addTableColumn: col3]; + [stab2 addTableColumn: col4]; + saver_table = stab2; + stab2.delegate = self; + stab2.dataSource = self; + [stab2 reloadData]; + sv2.contentView.documentView = stab2; + + [col3 setSortDescriptorPrototype: sd1]; + [col4 setSortDescriptorPrototype: sd2]; + [stab2 setSortDescriptors:@[sd2]]; + [col3 release]; + [col4 release]; + + frame = sv2.frame; + frame.origin.x = margin; + frame.origin.y = ball.frame.origin.y + ball.frame.size.height + margin; + frame.size.width = panel.frame.size.width - margin * 2; + frame.size.height = sv.frame.origin.y - frame.origin.y - margin; + sv2.frame = frame; + + [lab release]; + [sv release]; + [sv2 release]; + + [self cycleTimerSliderChanged: slider]; + + return self; +} + + +// Convert number of seconds to an approximate string; if it's more than +// 2 hours, round to 15 minute increments. +// +- (NSString *) formatTime: (double) secs +{ + int min = secs / 60; + int hr = min / 60; + int min2 = (min % 60) / 15 * 15; + // int si = secs; NSLog(@"%d:%02d:%02d", si/60/60, (si/60)%60, si%60); + return + (min == 1 ? @"1 minute" : + min < 60 ? [NSString stringWithFormat:@"%d minutes", min] : + hr == 1 ? [NSString stringWithFormat:@"%d hour %d minutes", hr, min%60] : + min2 == 0? [NSString stringWithFormat:@"%d hours", hr] : + [NSString stringWithFormat:@"%d hours %d minutes",hr, min2]); +} + + +- (void) cycleTimerSliderChanged:(NSObject *)arg +{ + [prefs save:self]; + double v = [[[prefs defaults] objectForKey: @CYCLE_TIME] doubleValue]; + timerLabel.stringValue = [self formatTime:v]; +} + + +- (NSInteger)numberOfRowsInTableView:(NSTableView *) tv +{ + if (tv == screen_table) { + return [screens count]; + } else if (tv == saver_table) { + return [savers count]; + } else { + return 0; + } +} + + +- (NSCell *) tableView: (NSTableView *) tv + dataCellForTableColumn: (NSTableColumn *) tc + row: (NSInteger) y +{ + if (! tc) return nil; + + if ([[tc identifier] isEqualToString:@"check"]) { + NSButtonCell *cell = [[NSButtonCell alloc] init]; + [cell setTitle: @""]; + [cell setAllowsMixedState: YES]; + [cell setButtonType: NSSwitchButton]; + //[cell release]; // Analyzer says this leaks? + return cell; + } else { + NSCell *cell = [[NSCell alloc] initTextCell: @""]; + //[cell release]; // Analyzer says this leaks? + return cell; + } +} + + +// Returns the resource key we used to see if this item is disabled. +// +- (NSString *) resourceKeyForTableView: (NSTableView *) tv + tableColumn: (NSTableColumn *) tc + row: (NSInteger) y +{ + BOOL screen_p = (tv == screen_table); + NSString *s = (screen_p + ? [screens objectAtIndex: y] + : [savers objectAtIndex: y]); + return resource_key_for_name (s, screen_p); +} + + +// Feeds labels and checkbox states into the tables. +// +- (id) tableView: (NSTableView *) tv + objectValueForTableColumn: (NSTableColumn *) tc + row: (NSInteger) y +{ + if (!tc) return nil; + + NSString *s; + if (tv == screen_table) { + s = [screens objectAtIndex: y]; + } else { // if (tv == saver_table) { + s = [savers objectAtIndex: y]; + } + + if ([[tc identifier] isEqualToString:@"check"]) { + NSString *res = [self resourceKeyForTableView:tv tableColumn:tc row:y]; + BOOL v = get_boolean (res, prefs); + BOOL checked = !v; // Invert the sense of the checkbox for "disabled" + return [NSNumber numberWithInteger: (checked ? NSOnState : NSOffState)]; + + } else { + return s; // The text in the "name" column + } +} + + +// Called when a checkbox is clicked in a table. +// Inverts the value of the corresponding resource. +// A redisplay will happen afterward that reads it again. +// +- (void) tableView: (NSTableView *) tv + setObjectValue: (id) val + forTableColumn: (NSTableColumn *) tc + row:(NSInteger) y +{ + if ([[tc identifier] isEqualToString:@"check"]) { + NSString *res = [self resourceKeyForTableView:tv tableColumn:tc row:y]; + BOOL checked = !!get_boolean (res, prefs); + if (checked) // checkmark means no "disabled" entry in prefs + [[prefs defaults] removeObjectForKey: res]; + else + [[prefs defaults] setObject:[NSNumber numberWithBool:TRUE] forKey:res]; + [prefs save:self]; + } +} + + +- (void) tableView: (NSTableView *) tv + sortDescriptorsDidChange: (NSArray *) od +{ + BOOL screen_p = (tv == screen_table); + NSArray *aa = (screen_p ? screens : savers); + + // Only one column should be sorting at a time. Surely this is the wrong + // right way to accomplish this, as I don't know which of the two columns + // in the array was the most-recently-clicked one. + // + if ([od count] > 1) { + od = @[ [od objectAtIndex:0] ]; + [tv setSortDescriptors: od]; + } + + for (NSSortDescriptor *sd in od) { + + if ([[sd key] isEqualToString:@"name"]) { + aa = [aa sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { + if ([sd ascending]) + return [a caseInsensitiveCompare: b]; + else + return [b caseInsensitiveCompare: a]; + }]; + + } else { // sorting by checkbox + + NSMutableDictionary *cc = [[NSMutableDictionary alloc] init]; + for (NSString *s in aa) { + NSString *res = resource_key_for_name (s, screen_p); + BOOL checked = !get_boolean (res, prefs); + [cc setObject:[NSNumber numberWithBool: checked] forKey:s]; + } + + aa = [aa sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { + int ba = [[cc objectForKey:a] intValue]; + int bb = [[cc objectForKey:b] intValue]; + if (ba == bb) return NSOrderedSame; + if ([sd ascending]) + return (ba < bb ? NSOrderedAscending : NSOrderedDescending); + else + return (bb < ba ? NSOrderedAscending : NSOrderedDescending); + }]; + } + } + + [aa retain]; + if (tv == screen_table) { + [screens release]; + screens = aa; + } else if (tv == saver_table) { + [savers release]; + savers = aa; + } + + [tv reloadData]; +} + + +- (void) selectAllAction:(NSObject *)arg selected:(BOOL)selected +{ + for (NSString *s in savers) { + NSString *res = resource_key_for_name (s, NO); + if (selected) // checkmark means no "disabled" entry in prefs + [[prefs defaults] removeObjectForKey: res]; + else + [[prefs defaults] setObject:[NSNumber numberWithBool:TRUE] forKey:res]; + } + [prefs save:self]; + [saver_table reloadData]; +} + + +- (void) selectAllAction:(NSObject *)arg +{ + [self selectAllAction:arg selected:YES]; +} + + +- (void) selectNoneAction:(NSObject *)arg +{ + [self selectAllAction:arg selected:NO]; +} + + +- (void) okAction:(NSObject *)arg +{ + [prefs save:self]; + [NSApp endSheet:self returnCode:NSOKButton]; + [self close]; +} + +- (void) dealloc +{ + [screens release]; + [savers release]; + [super dealloc]; +} + +@end + + +/************************************************************************* + + A built-in screen saver that shows the thumbnail images of the others. + + *************************************************************************/ + + +@implementation RandomizerAttractMode +{ + NSArray *imgs; + NSTimer *cycle_timer; + NSImageView *view; +} + +- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)p + saverBundlePaths:(NSArray *)paths +{ + self = [super initWithFrame:frame isPreview:p]; + if (! self) return 0; + + ya_rand_init (0); + + NSMutableArray *a = [NSMutableArray arrayWithCapacity: 300]; + for (NSString *path in paths) { + NSString *dir = [[path stringByAppendingPathComponent:@"Contents"] + stringByAppendingPathComponent:@"Resources"]; + for (NSString *thumb in @[ @"thumbnail@2x.png", @"thumbnail.png" ]) { + thumb = [dir stringByAppendingPathComponent: thumb]; + NSImage *img = [[NSImage alloc] initByReferencingFile: thumb]; + if (img && [img size].width > 1) { + [a addObject: img]; + break; + } + } + } + + imgs = [[NSArray arrayWithArray: a] retain]; + NSLog(@"loaded %lu thumbs", (unsigned long) [imgs count]); + + return self; +} + + +- (void)cycleThumb +{ + if (!imgs || ![imgs count]) + return; + + NSImage *prev = (view ? view.image : 0); + NSImage *img = 0; + + // Pick one at random, but try not to use the one we just used, even if + // there are a small number of them. + for (int i = 0; i < 100; i++) { + img = [imgs objectAtIndex: (random() % [imgs count])]; + if (img != prev) break; + } + + NSRect r = self.bounds; + int margin = 4; + r.origin.x = r.origin.y = margin; + r.size.width -= margin*2; + r.size.height -= margin*2; + NSImageView *view2 = [[NSImageView alloc] initWithFrame: r]; + + view2.imageScaling = NSImageScaleProportionallyUpOrDown; + view2.alphaValue = 0.0; + view2.wantsLayer = YES; + view2.image = img; + + [self addSubview: view2]; + [view2 release]; + + [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) { + context.duration = 0.5; + if (view) + view.animator.alphaValue = 0; + view2.animator.alphaValue = 1; + } + completionHandler:^{ + if (view) [view removeFromSuperview]; + view = view2; + }]; + + NSTimeInterval interval = 0.75; + + if (cycle_timer) [cycle_timer invalidate]; + cycle_timer = 0; + if ([imgs count] <= 1) return; // If there's only one, don't flicker. + cycle_timer = [NSTimer scheduledTimerWithTimeInterval: interval + target:self + selector:@selector(cycleThumb) + userInfo:nil + repeats:NO]; +} + + +- (void)startAnimation +{ + [self cycleThumb]; + [super startAnimation]; +} + +- (void)stopAnimation +{ + if (cycle_timer) [cycle_timer invalidate]; + cycle_timer = 0; + [super stopAnimation]; +} + +- (BOOL)isAnimating { return !!cycle_timer; } +- (NSTimeInterval)animationTimeInterval { return 1/30.0; } +- (BOOL)hasConfigureSheet { return FALSE; } +- (NSWindow*)configureSheet { return 0; } + +- (void) dealloc +{ + if (cycle_timer) [cycle_timer invalidate]; + cycle_timer = 0; + [imgs release]; + [super dealloc]; +} + +@end diff --git a/OSX/Randomizer.plist b/OSX/Randomizer.plist new file mode 100644 index 00000000..e2d4c576 --- /dev/null +++ b/OSX/Randomizer.plist @@ -0,0 +1,36 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ​ Random XScreenSaver + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 6.00 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSPrincipalClass + ${EXECUTABLE_NAME} + LSApplicationCategoryType + public.app-category.entertainment + CFBundleShortVersionString + 6.00 + CFBundleLongVersionString + 6.00 + CFBundleGetInfoString + 6.00 + NSHumanReadableCopyright + 6.00 + + diff --git a/OSX/SaverListController.m b/OSX/SaverListController.m index 56189de9..53a70e8d 100644 --- a/OSX/SaverListController.m +++ b/OSX/SaverListController.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2012-2019 Jamie Zawinski +/* xscreensaver, Copyright (c) 2012-2020 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -39,7 +39,7 @@ // I guess I could add custom key to the Info.plist for this. NSArray *a = [[NSString stringWithCString: screensaver_id - encoding:NSASCIIStringEncoding] + encoding:NSUTF8StringEncoding] componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@" ()-"]]; @@ -172,7 +172,7 @@ s[0] = (i == 'Z'-'A'+1 ? '#' : i+'A'); s[1] = 0; [a addObject: [NSString stringWithCString:s - encoding:NSASCIIStringEncoding]]; + encoding:NSUTF8StringEncoding]]; } return a; } @@ -223,7 +223,7 @@ if (! matchp) continue; - int index = ([name cStringUsingEncoding: NSASCIIStringEncoding])[0]; + int index = ([name cStringUsingEncoding: NSUTF8StringEncoding])[0]; if (index >= 'a' && index <= 'z') index -= 'a'-'A'; if (index >= 'A' && index <= 'Z') @@ -387,8 +387,35 @@ return; NSMutableArray *a = [NSMutableArray arrayWithCapacity: 200]; for (NSArray *sec in letter_sections) - for (NSString *s in sec) + for (NSString *s in sec) { + +# ifdef HAVE_IPHONE + // Check the "SaverName.globalCycleSelected" preference. + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + NSString *key = [s stringByAppendingString:@".globalCycleSelected"]; + NSObject *o = [prefs objectForKey:key]; + BOOL checked_p; + + // Roughly duplicate logic of PrefsReader:getBooleanResource + if (o && [o isKindOfClass:[NSNumber class]]) { + double n = [(NSNumber *) o doubleValue]; + checked_p = !!n; + } else if (o && [o isKindOfClass:[NSString class]]) { + NSString *ss = [((NSString *) o) lowercaseString]; + checked_p = ([ss isEqualToString:@"true"] || + [ss isEqualToString:@"yes"] || + [ss isEqualToString:@"1"]); + } else { + checked_p = YES; // Default true + } + + if (! checked_p) // Omit from list if un-checked + continue; +# endif // HAVE_IPHONE + [a addObject: s]; + } int n = [a count]; if (! n) return; NSString *which = [a objectAtIndex: (random() % n)]; diff --git a/OSX/SaverRunner.h b/OSX/SaverRunner.h index 14c51bf6..f5882bb1 100644 --- a/OSX/SaverRunner.h +++ b/OSX/SaverRunner.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2019 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2020 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -40,14 +40,14 @@ @interface SaverViewController : UIViewController { SaverRunner *_parent; - NSString *_saverName; + NSString *_saver_title; XScreenSaverView *_saverView; BOOL _showAboutBox; UIView *aboutBox; NSTimer *splashTimer; } -@property(nonatomic, retain) NSString *saverName; +@property(nonatomic, retain) NSString *saver_title; @end @@ -60,8 +60,8 @@ # endif { - NSString *saverName; // the one currently loaded - NSArray *saverNames; // Names of available savers + NSString *saver_title; // Display name of currently loaded + NSDictionary *saverNames; // Display and bundle names of available savers NSString *saverDir; // Where we find saver bundles # ifndef HAVE_IPHONE diff --git a/OSX/SaverRunner.m b/OSX/SaverRunner.m index e015efa5..86609baf 100644 --- a/OSX/SaverRunner.m +++ b/OSX/SaverRunner.m @@ -90,8 +90,6 @@ @implementation SaverViewController -@synthesize saverName; - - (id)initWithSaverRunner:(SaverRunner *)parent showAboutBox:(BOOL)showAboutBox { @@ -117,7 +115,7 @@ - (void)dealloc { - [saverName release]; + [_saver_title release]; // iOS: When a UIView deallocs, it doesn't do [UIView removeFromSuperView] // for its subviews, so the subviews end up with a dangling pointer in their // superview properties. @@ -149,9 +147,7 @@ if (!_showAboutBox) return; - NSString *name = _saverName; - NSString *year = [_parent makeDesc:_saverName yearOnly:YES]; - + NSString *year = [_parent makeDesc:_saver_title yearOnly:YES]; CGRect frame = [saverView frame]; CGFloat rot; @@ -163,13 +159,13 @@ # ifdef __IPHONE_7_0 CGSize s = CGSizeMake(frame.size.width, frame.size.height); CGSize tsize1 = [[[NSAttributedString alloc] - initWithString: name + initWithString:_saver_title attributes:@{ NSFontAttributeName: font1 }] boundingRectWithSize: s options: NSStringDrawingUsesLineFragmentOrigin context: nil].size; CGSize tsize2 = [[[NSAttributedString alloc] - initWithString: name + initWithString:_saver_title attributes:@{ NSFontAttributeName: font2 }] boundingRectWithSize: s options: NSStringDrawingUsesLineFragmentOrigin @@ -259,7 +255,7 @@ frame.origin.y = (j == 0 ? 0 : pt1); textview = [[UITextView alloc] initWithFrame:frame]; textview.font = (j == 0 ? font1 : font2); - textview.text = (j == 0 ? name : year); + textview.text = (j == 0 ? _saver_title : year); textview.textAlignment = NSTextAlignmentCenter; textview.showsHorizontalScrollIndicator = NO; textview.showsVerticalScrollIndicator = NO; @@ -345,8 +341,8 @@ [_saverView release]; } - _saverView = [_parent newSaverView:_saverName - withSize:parentView.bounds.size]; + _saverView = [_parent newSaverView: _saver_title + withSize: parentView.bounds.size]; if (! _saverView) { UIAlertController *c = [UIAlertController @@ -422,16 +418,26 @@ */ -- (void)setSaverName:(NSString *)name +- (void)setSaverTitle:(NSString *)title { - [name retain]; - [_saverName release]; - _saverName = name; + [title retain]; + [_saver_title release]; + _saver_title = title; if (_saverView) [self createSaverView]; } +- (void)setSaver_title:(NSString *)title +{ + [self setSaverTitle: title]; +} +- (void)setSaver_Title:(NSString *)title +{ + abort(); +} + + - (void)viewWillTransitionToSize: (CGSize)size withTransitionCoordinator: (id) coordinator @@ -490,19 +496,19 @@ NSLog(@"## completion %@", context); @implementation SaverRunner - -- (XScreenSaverView *) newSaverView: (NSString *) module - withSize: (NSSize) size +- (ScreenSaverView *) newSaverView: (NSString *) title + withSize: (NSSize) size { Class new_class = 0; + NSString *classname = [saverNames objectForKey: title]; + # ifndef HAVE_IPHONE // Load the XScreenSaverView subclass and code from a ".saver" bundle. - NSString *name = [module stringByAppendingPathExtension:@"saver"]; - NSString *path = [saverDir stringByAppendingPathComponent:name]; - + NSString *path = [[saverDir stringByAppendingPathComponent:classname] + stringByAppendingPathExtension:@"saver"]; if (! [[NSFileManager defaultManager] fileExistsAtPath:path]) { NSLog(@"bundle \"%@\" does not exist", path); return 0; @@ -525,12 +531,10 @@ NSLog(@"## completion %@", context); // Determine whether to create an X11 view or an OpenGL view by // looking for the "gl" tag in the xml file. This is kind of awful. + NSString *file = [classname lowercaseString]; NSString *path = [saverDir stringByAppendingPathComponent: - [[[module lowercaseString] - stringByReplacingOccurrencesOfString:@" " - withString:@""] - stringByAppendingPathExtension:@"xml"]]; + [file stringByAppendingPathExtension:@"xml"]]; NSData *xmld = [NSData dataWithContentsOfFile:path]; NSAssert (xmld, @"no XML: %@", path); NSString *xml = [XScreenSaverView decompressXML:xmld]; @@ -550,13 +554,23 @@ NSLog(@"## completion %@", context); rect.size.width = size.width; rect.size.height = size.height; - XScreenSaverView *instance = - [(XScreenSaverView *) [new_class alloc] - initWithFrame:rect - saverName:module - isPreview:YES]; + NSObject *instance = [new_class alloc]; + if ([instance respondsToSelector: + @selector(initWithFrame:title:isPreview:)]) + // If it's one of ours, also pass the title. + instance = [(XScreenSaverView *) instance + initWithFrame: rect + title: title + isPreview: YES]; + else if ([instance respondsToSelector: @selector(initWithFrame:isPreview:)]) + instance = [(ScreenSaverView *) instance + initWithFrame: rect + isPreview: YES]; + else + instance = 0; + if (! instance) { - NSLog(@"Failed to instantiate %@ for \"%@\"", new_class, module); + NSLog(@"Failed to instantiate %@ for \"%@\"", new_class, saver_title); return 0; } @@ -572,7 +586,7 @@ NSLog(@"## completion %@", context); } # endif - return (XScreenSaverView *) instance; + return (ScreenSaverView *) instance; } @@ -653,6 +667,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) NSAssert (sv, @"no saver view"); if (!sv) return; NSWindow *prefs = [sv configureSheet]; + NSAssert (prefs, @"no configureSheet in %@", sv); [NSApp beginSheet:prefs modalForWindow:[sv window] @@ -787,8 +802,8 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) - (void) openPreferences: (NSString *) saver { - XScreenSaverView *saverView = [self newSaverView:saver - withSize:CGSizeMake(0, 0)]; + ScreenSaverView *saverView = [self newSaverView:saver + withSize:CGSizeMake(0, 0)]; if (! saverView) return; NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; @@ -804,11 +819,11 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) -- (void)loadSaver:(NSString *)name +- (void)loadSaver:(NSString *)title { # ifndef HAVE_IPHONE - if (saverName && [saverName isEqualToString: name]) { + if (saver_title && [saver_title isEqualToString: title]) { for (NSWindow *win in windows) { ScreenSaverView *sv = find_saverView ([win contentView]); if (![sv isAnimating]) @@ -817,14 +832,16 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) return; } - saverName = name; + [title retain]; + [saver_title release]; + saver_title = title; for (NSWindow *win in windows) { NSView *cv = [win contentView]; NSString *old_title = [win title]; if (!old_title) old_title = @"XScreenSaver"; - [win setTitle: name]; - relabel_menus (menubar, old_title, name); + [win setTitle: title]; + relabel_menus (menubar, old_title, title); ScreenSaverView *old_view = find_saverView (cv); NSView *sup = old_view ? [old_view superview] : cv; @@ -835,8 +852,8 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) [old_view removeFromSuperview]; } - NSSize size = [cv frame].size; - ScreenSaverView *new_view = [self newSaverView:name withSize: size]; + NSSize size = [sup frame].size; + ScreenSaverView *new_view = [self newSaverView: title withSize: size]; NSAssert (new_view, @"unable to make a saver view"); [new_view setFrame: (old_view ? [old_view frame] : [cv frame])]; @@ -851,18 +868,34 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) [NSUserDefaultsController sharedUserDefaultsController]; [ctl save:self]; +# if 0 + // Dump the entire resource database. + NSBundle *nsb = [NSBundle bundleForClass:[self class]]; + NSLog(@"SaverRunner userDefaults for %@", [nsb bundleIdentifier]); + NSDictionary *d = [[ctl defaults] dictionaryRepresentation]; + for (NSObject *key in [[d allKeys] + sortedArrayUsingSelector:@selector(compare:)]) { + NSObject *val = [d objectForKey:key]; + NSLog (@"%@ = %@", key, val); + } +# endif + # else // HAVE_IPHONE + [title retain]; + [saver_title release]; + saver_title = title; + # if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR - NSLog (@"selecting saver \"%@\"", name); + NSLog (@"selecting saver \"%@\"", saver_title); # endif NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; - [prefs setObject:name forKey:@"selectedSaverName"]; + [prefs setObject:saver_title forKey:@"selectedSaverName"]; [prefs synchronize]; /* Cacheing this screws up rotation when starting a saver twice in a row. - if (saverName && [saverName isEqualToString: name]) { + if (saver_title && [saver_title isEqualToString: title]) { if ([saverView isAnimating]) return; else @@ -870,10 +903,12 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) } */ - saverName = name; + [title retain]; + [saver_title release]; + saver_title = title; if (nonrotating_controller) { - nonrotating_controller.saverName = name; + nonrotating_controller.saver_title = saver_title; return; } @@ -957,7 +992,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) nonrotating_controller = [[SaverViewController alloc] initWithSaverRunner:self showAboutBox:[saverNames count] != 1]; - nonrotating_controller.saverName = name; + nonrotating_controller.saver_title = title; // Necessary to prevent "card"-like presentation on Xcode 11 with iOS 13: nonrotating_controller.modalPresentationStyle = @@ -1004,20 +1039,20 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) - (void)selectedSaverDidChange:(NSDictionary *)change { NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; - NSString *name = [prefs stringForKey:@"selectedSaverName"]; + NSString *title = [prefs stringForKey:@"selectedSaverName"]; - if (! name) return; + if (! title) return; - if (! [saverNames containsObject:name]) { - NSLog (@"saver \"%@\" does not exist", name); + if (! [saverNames objectForKey:title]) { + NSLog (@"saver \"%@\" does not exist", title); return; } - [self loadSaver: name]; + [self loadSaver: title]; } -- (NSArray *) listSaverBundleNamesInDir:(NSString *)dir +- (NSDictionary *) listSaverBundleNamesInDir:(NSString *)dir { # ifndef HAVE_IPHONE NSString *ext = @"saver"; @@ -1028,45 +1063,48 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dir error:nil]; if (! files) return 0; - NSMutableArray *result = [NSMutableArray arrayWithCapacity: [files count]+1]; + NSMutableDictionary *result = + [NSMutableDictionary dictionaryWithCapacity:[files count]+1]; for (NSString *p in files) { - if ([[p pathExtension] caseInsensitiveCompare: ext]) + if ([[p pathExtension] caseInsensitiveCompare: ext]) continue; - NSString *name = [[p lastPathComponent] stringByDeletingPathExtension]; + p = [dir stringByAppendingPathComponent: p]; -# ifdef HAVE_IPHONE - // Get the saver name's capitalization right by reading the XML file. + NSString *classname = [[p lastPathComponent] stringByDeletingPathExtension]; + NSString *title = classname; - p = [dir stringByAppendingPathComponent: p]; + // Get the title's capitalization right by reading the XML file. + +# ifdef HAVE_IPHONE NSData *xmld = [NSData dataWithContentsOfFile:p]; NSAssert (xmld, @"no XML: %@", p); NSString *xml = [XScreenSaverView decompressXML:xmld]; + NSRange r = [xml rangeOfString:@"_label=\"" options:0]; NSAssert1 (r.length, @"no name in %@", p); if (r.length) { xml = [xml substringFromIndex: r.location + r.length]; r = [xml rangeOfString:@"\"" options:0]; - if (r.length) name = [xml substringToIndex: r.location]; + NSAssert1 (r.length, @"no name in %@", p); + if (r.length) + title = [xml substringToIndex: r.location]; } +# else // !HAVE_IPHONE + NSBundle *nsb = [NSBundle bundleWithPath:p]; + title = [[nsb infoDictionary] objectForKey:@"CFBundleName"]; +# endif // !HAVE_IPHONE -# endif // HAVE_IPHONE - - NSAssert1 (name, @"no name in %@", p); - if (name) [result addObject: name]; + [result setObject:classname forKey:title]; } - if (result && [result count]) - return [result sortedArrayUsingSelector: - @selector(localizedCaseInsensitiveCompare:)]; - else - return 0; + return [result count] ? result : 0; } -- (NSArray *) listSaverBundleNames +- (void) listSaverBundleNames { NSMutableArray *dirs = [NSMutableArray arrayWithCapacity: 10]; @@ -1097,11 +1135,11 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) int i; for (i = 0; i < [dirs count]; i++) { NSString *dir = [dirs objectAtIndex:i]; - NSArray *names = [self listSaverBundleNamesInDir:dir]; + NSDictionary *names = [self listSaverBundleNamesInDir:dir]; if (! names) continue; saverDir = [dir retain]; saverNames = [names retain]; - return names; + return; } NSString *err = @"no .saver bundles found in: "; @@ -1112,7 +1150,6 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) err = [err stringByAppendingString:@"/"]; } NSLog (@"%@", err); - return [NSArray array]; } @@ -1128,12 +1165,13 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) rect.size.height = 10; NSPopUpButton *popup = [[NSPopUpButton alloc] initWithFrame:rect pullsDown:NO]; - int i; float max_width = 0; - for (i = 0; i < [saverNames count]; i++) { - NSString *name = [saverNames objectAtIndex:i]; - [popup addItemWithTitle:name]; - [[popup itemWithTitle:name] setRepresentedObject:name]; + NSArray *titles = [[saverNames allKeys] + sortedArrayUsingSelector: + @selector(localizedCaseInsensitiveCompare:)]; + for (NSString *title in titles) { + [popup addItemWithTitle: title]; + [[popup itemWithTitle: title] setRepresentedObject: title]; [popup sizeToFit]; NSRect r = [popup frame]; if (r.size.width > max_width) max_width = r.size.width; @@ -1164,24 +1202,21 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) #else // HAVE_IPHONE -- (NSString *) makeDesc:(NSString *)saver - yearOnly:(BOOL) yearp +- (NSString *) makeDesc:(NSString *) title + yearOnly:(BOOL) yearp { NSString *desc = 0; - NSString *path = [saverDir stringByAppendingPathComponent: - [[saver lowercaseString] - stringByReplacingOccurrencesOfString:@" " - withString:@""]]; - NSRange r; - - path = [path stringByAppendingPathExtension:@"xml"]; + NSString *classname = [saverNames objectForKey: title]; + NSString *file = [classname lowercaseString]; + NSString *path = [[saverDir stringByAppendingPathComponent: file] + stringByAppendingPathExtension:@"xml"]; NSData *xmld = [NSData dataWithContentsOfFile:path]; if (! xmld) goto FAIL; desc = [XScreenSaverView decompressXML:xmld]; if (! desc) goto FAIL; - r = [desc rangeOfString:@"<_description>" - options:NSCaseInsensitiveSearch]; + NSRange r = [desc rangeOfString:@"<_description>" + options:NSCaseInsensitiveSearch]; if (r.length == 0) { desc = 0; goto FAIL; @@ -1260,13 +1295,16 @@ FAIL: { NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:[saverNames count]]; - for (NSString *saver in saverNames) { - [dict setObject:[self makeDesc:saver] forKey:saver]; + for (NSString *title in [saverNames allKeys]) { + [dict setObject:[self makeDesc:title] forKey:title]; } return dict; } +// Called from iOS XScreenSaverView when the "Stop" or "Settings" +// buttons are pressed. +// - (void) wantsFadeOut:(XScreenSaverView *)sender { rotating_nav.view.hidden = NO; // In case it was hidden during startup. @@ -1274,10 +1312,10 @@ FAIL: /* Make sure the most-recently-run saver is visible. Sometimes it ends up scrolled half a line off the bottom of the screen. */ - if (saverName) { + if (saver_title) { for (UIViewController *v in [rotating_nav viewControllers]) { if ([v isKindOfClass:[SaverListController class]]) { - [(SaverListController *)v scrollTo: saverName]; + [(SaverListController *)v scrollTo: saver_title]; break; } } @@ -1291,6 +1329,8 @@ FAIL: } +// Called from iOS XScreenSaverView when the cycle timer fires. +// - (void) didShake:(XScreenSaverView *)sender { # if TARGET_IPHONE_SIMULATOR @@ -1447,7 +1487,8 @@ FAIL: { for (NSWindow *win in windows) { ScreenSaverView *sv = find_saverView ([win contentView]); - if ([sv isAnimating]) + BOOL is = [sv isAnimating]; + if (is) [sv animateOneFrame]; } } @@ -1480,7 +1521,7 @@ FAIL: [win setDelegate:self]; // Get the last-saved window position out of preferences. [win setFrameAutosaveName: - [NSString stringWithFormat:@"XScreenSaverWindow%d", i]]; + [NSString stringWithFormat:@"XScreenSaverWindow%d", i]]; [win setFrameUsingName:[win frameAutosaveName]]; [a addObject: win]; // This prevents clicks from being seen by savers. @@ -1516,7 +1557,7 @@ FAIL: UIViewAutoresizingFlexibleHeight)]; SaverListController *menu = [[SaverListController alloc] - initWithNames:saverNames + initWithNames:[saverNames allKeys] descriptions:[self makeDescTable]]; [rotating_nav pushViewController:menu animated:YES]; [menu becomeFirstResponder]; @@ -1535,18 +1576,22 @@ FAIL: whatever it was last time. */ const char *f = getenv ("SELECTED_SAVER"); - if (f && *f) - forced = [NSString stringWithCString:(char *)f - encoding:NSUTF8StringEncoding]; - - if (forced && ![saverNames containsObject:forced]) { - NSLog(@"forced saver \"%@\" does not exist", forced); - forced = 0; + if (f && *f) { + NSString *ff = [NSString stringWithCString:(char *)f + encoding:NSUTF8StringEncoding]; + for (NSString *title in [saverNames allKeys]) { + if ([ff isEqualToString: [saverNames objectForKey:title]]) { + forced = title; + break; + } + } + if (!forced) + NSLog(@"forced saver \"%@\" does not exist", ff); } // If there's only one saver, run that. if (!forced && [saverNames count] == 1) - forced = [saverNames objectAtIndex:0]; + forced = [[saverNames allValues] objectAtIndex:0]; # ifdef HAVE_IPHONE NSString *prev = [prefs stringForKey:@"selectedSaverName"]; @@ -1554,18 +1599,22 @@ FAIL: if (forced) prev = forced; - if (prev && ! [saverNames containsObject:prev]) { + if (prev && ! [saverNames objectForKey:prev]) { NSLog (@"prev saver \"%@\" does not exist", prev); prev = forced = 0; [prefs removeObjectForKey:@"selectedSaverName"]; [prefs removeObjectForKey:@"wasRunning"]; + rotating_nav.view.hidden = NO; } // If nothing was selected (e.g., this is the first launch) // then scroll randomly instead of starting up at "A". // - if (!prev) - prev = [saverNames objectAtIndex: (random() % [saverNames count])]; + if (!prev) { + NSArray *titles = [saverNames allKeys]; + prev = [titles objectAtIndex: (random() % [titles count])]; + [prefs removeObjectForKey:@"wasRunning"]; + } if (prev) [menu scrollTo: prev]; diff --git a/OSX/SaverRunner.plist b/OSX/SaverRunner.plist index a949df4a..ac6292aa 100644 --- a/OSX/SaverRunner.plist +++ b/OSX/SaverRunner.plist @@ -6,35 +6,35 @@ English CFBundleExecutable ${EXECUTABLE_NAME} - CFBundleGetInfoString - 5.45 - CFBundleIconFile - SaverRunner CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 - CFBundleLongVersionString - 5.45 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL - CFBundleShortVersionString - 5.45 CFBundleSignature ???? CFBundleVersion - 5.45 + 6.00 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} - NSHumanReadableCopyright - 5.45 - NSMainNibFile - SaverRunner NSPrincipalClass NSApplication LSApplicationCategoryType public.app-category.entertainment + CFBundleShortVersionString + 6.00 + CFBundleLongVersionString + 6.00 + CFBundleGetInfoString + 6.00 + NSHumanReadableCopyright + 6.00 + NSMainNibFile + SaverRunner + CFBundleIconFile + SaverRunner diff --git a/OSX/Updater.plist b/OSX/Updater.plist index c2ed39a5..e399326f 100644 --- a/OSX/Updater.plist +++ b/OSX/Updater.plist @@ -4,42 +4,42 @@ CFBundleDevelopmentRegion English - CFBundleDisplayName - XScreenSaver CFBundleExecutable ${EXECUTABLE_NAME} - CFBundleGetInfoString - 5.45 - CFBundleIconFile - SaverRunner CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 - CFBundleLongVersionString - 5.45 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL - CFBundleShortVersionString - 5.45 CFBundleSignature ???? CFBundleVersion - 5.45 - LSApplicationCategoryType - public.app-category.entertainment + 6.00 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} - LSUIElement - + NSPrincipalClass + NSApplication + LSApplicationCategoryType + public.app-category.entertainment + CFBundleShortVersionString + 6.00 + CFBundleLongVersionString + 6.00 + CFBundleGetInfoString + 6.00 NSHumanReadableCopyright - 5.45 + 6.00 NSMainNibFile Updater - NSPrincipalClass - NSApplication + CFBundleIconFile + SaverRunner + CFBundleDisplayName + XScreenSaver + LSUIElement + SUEnableSystemProfiling SUFeedURL diff --git a/OSX/XScreenSaver.plist b/OSX/XScreenSaver.plist index b028d15e..b91d3c55 100644 --- a/OSX/XScreenSaver.plist +++ b/OSX/XScreenSaver.plist @@ -14,19 +14,25 @@ ${PRODUCT_NAME} CFBundlePackageType BNDL - CFBundleShortVersionString - 5.45 CFBundleSignature ???? CFBundleVersion - 5.45 + 6.00 LSMinimumSystemVersion - 10.8 - NSMainNibFile - SaverRunner + ${MACOSX_DEPLOYMENT_TARGET} NSPrincipalClass XScreenSaver${EXECUTABLE_NAME}View LSApplicationCategoryType public.app-category.entertainment + CFBundleShortVersionString + 6.00 + CFBundleLongVersionString + 6.00 + CFBundleGetInfoString + 6.00 + NSHumanReadableCopyright + 6.00 + NSMainNibFile + SaverRunner diff --git a/OSX/XScreenSaverConfigSheet.h b/OSX/XScreenSaverConfigSheet.h index f2b000af..ca9a4d01 100644 --- a/OSX/XScreenSaverConfigSheet.h +++ b/OSX/XScreenSaverConfigSheet.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2019 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2020 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -51,7 +51,8 @@ NSPanel # endif { - NSString *saver_name; + NSString *classname; // "MoebiusGears" + NSString *saver_title; // "Möbius Gears" NSUserDefaultsController *userDefaultsController; NSUserDefaultsController *globalDefaultsController; NSDictionary *defaultOptions; @@ -72,6 +73,7 @@ } - (id)initWithXML: (NSData *) xml_data + classname: (NSString *) _classname options: (const XrmOptionDescRec *) opts controller: (NSUserDefaultsController *) prefs globalController: (NSUserDefaultsController *) globalPrefs diff --git a/OSX/XScreenSaverConfigSheet.m b/OSX/XScreenSaverConfigSheet.m index 26b9359e..cd5c7404 100644 --- a/OSX/XScreenSaverConfigSheet.m +++ b/OSX/XScreenSaverConfigSheet.m @@ -627,16 +627,20 @@ static void layout_group (NSView *group, BOOL horiz_p); /* Normally we read resources by looking up "KEY" in the database - "org.jwz.xscreensaver.SAVERNAME". But in the all-in-one iPhone + "org.jwz.xscreensaver.CLASSNAME". But in the all-in-one iPhone app, everything is stored in the database "org.jwz.xscreensaver" - instead, so transform keys to "SAVERNAME.KEY". + instead, so transform keys to "CLASSNAME.KEY". NOTE: This is duplicated in PrefsReader.m, cause I suck. */ - (NSString *) makeKey:(NSString *)key { # ifdef HAVE_IPHONE - NSString *prefix = [saver_name stringByAppendingString:@"."]; + if ([key isEqualToString:@"globalCycle"] || + [key isEqualToString:@"globalCycleTimeout"]) + return key; // These two are global, not per-saver. + + NSString *prefix = [classname stringByAppendingString:@"."]; if (! [key hasPrefix:prefix]) // Don't double up! key = [prefix stringByAppendingString:key]; # endif @@ -1457,6 +1461,7 @@ hreffify (NSText *nstext) @"arg": @"", @"low": @"", @"high": @"", + @"step": @"", @"default": @"", @"convert": @"" } mutableCopy]; @@ -1468,6 +1473,7 @@ hreffify (NSText *nstext) NSString *arg = [dict objectForKey:@"arg"]; NSString *low = [dict objectForKey:@"low"]; NSString *high = [dict objectForKey:@"high"]; + NSString *step_by = [dict objectForKey:@"step"]; NSString *def = [dict objectForKey:@"default"]; NSString *cvt = [dict objectForKey:@"convert"]; [dict release]; @@ -1512,12 +1518,14 @@ hreffify (NSText *nstext) rect.origin.x = rect.origin.y = 0; rect.size.width = 150; rect.size.height = 23; // apparent min height for slider with ticks... - NSSlider *slider; - slider = [[InvertedSlider alloc] initWithFrame:rect - inverted: !!cvt - integers: !float_p]; + InvertedSlider *slider = + [[InvertedSlider alloc] initWithFrame:rect + inverted: !!cvt + integers: !float_p]; [slider setMaxValue:[high doubleValue]]; [slider setMinValue:[low doubleValue]]; + if (step_by) + [slider setIncrement:[step_by doubleValue]]; int range = [slider maxValue] - [slider minValue] + 1; int range2 = range; @@ -1675,7 +1683,9 @@ hreffify (NSText *nstext) [step setValueWraps:NO]; double range = [high doubleValue] - [low doubleValue]; - if (range < 1.0) + if (step_by) + [step setIncrement:[step_by doubleValue]]; + else if (range < 1.0) [step setIncrement:range / 10.0]; else if (range >= 500) [step setIncrement:range / 100.0]; @@ -1915,13 +1925,17 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) # endif // USE_PICKER_VIEW # endif -# if !defined(HAVE_IPHONE) || defined(USE_PICKER_VIEW) +# if !defined(HAVE_IPHONE) [self placeChild:popup on:parent]; if (disabled) [popup setEnabled:NO]; else [self bindResource:popup key:menu_key]; [popup release]; +# elif defined(USE_PICKER_VIEW) + [self placeChild:popup on:parent]; + [self bindResource:popup key:menu_key]; + [popup release]; # endif # ifdef HAVE_IPHONE @@ -1933,7 +1947,7 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) if (! picker_values) picker_values = [[NSMutableArray arrayWithCapacity:menu_number] retain]; while ([picker_values count] <= menu_number) - [picker_values addObject:[NSArray arrayWithObjects: nil]]; + [picker_values addObject:@{}]; [picker_values replaceObjectAtIndex:menu_number withObject:items]; [popup reloadAllComponents]; @@ -1970,6 +1984,11 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) */ - (void) makeDescLabel:(NSXMLNode *)node on:(NSView *)parent { +# ifdef HAVE_IPHONE + // The "auto-cycle" controls go just above the description. + [self makeCycleSaverControlBox:node on:parent]; +# endif + NSString *text = nil; NSArray *children = [node children]; NSUInteger i, count = [children count]; @@ -2722,6 +2741,76 @@ find_text_field_of_button (NSButton *button) } +#ifdef HAVE_IPHONE + +- (void) makeCycleSaverControlBox:(NSXMLNode *)node on:(NSView *)parent +{ + /* + Select a new saver after timeout [x] + [--------------------------------] + Include this saver in "random" mode [x] + + + + + */ + + NSXMLElement *node2; + + [self placeSeparator]; + + // + + node2 = [[NSXMLElement alloc] initWithName:@"boolean"]; + [node2 setAttributesAsDictionary: + @{ @"id": @"globalCycle", + @"_label": @"Select a new saver after timeout", + @"arg-unset": @"-no-global-cycle" + }]; + [self makeCheckbox:node2 on:parent]; + [node2 release]; + + // + + node2 = [[NSXMLElement alloc] initWithName:@"number"]; + [node2 setAttributesAsDictionary: + @{ @"id": @"globalCycleTimeout", + @"type": @"slider", + @"_label": @"", + @"arg": @"-global-cycle-timeout %", + @"_low-label": @"5 minutes", + @"_high-label": @"4 hours", + @"low": @"300", + @"high": @"14400", + @"default": @"4600", + @"step": @"300", + }]; + [self makeNumberSelector:node2 on:parent]; + [node2 release]; + + // + + node2 = [[NSXMLElement alloc] initWithName:@"boolean"]; + [node2 setAttributesAsDictionary: + @{ @"id": @"globalCycleSelected", + @"_label": @"Include this saver in \"random\" mode", + @"arg-unset": @"-no-global-cycle-selected" + }]; + [self makeCheckbox:node2 on:parent]; + [node2 release]; +} +#endif // HAVE_IPHONE + + #pragma mark Layout for controls @@ -3278,10 +3367,7 @@ wrap_with_buttons (NSWindow *window, NSView *panel) NSAssert (0, @"top level node is not "); } - saver_name = [self parseXScreenSaverTag: node]; - saver_name = [saver_name stringByReplacingOccurrencesOfString:@" " - withString:@""]; - [saver_name retain]; + saver_title = [[self parseXScreenSaverTag: node] retain]; # ifndef HAVE_IPHONE @@ -3400,8 +3486,14 @@ wrap_with_buttons (NSWindow *window, NSView *panel) CGFloat max = 0; for (NSArray *a2 in a) { NSString *s = [a2 objectAtIndex:0]; - // #### sizeWithFont deprecated as of iOS 7; use boundingRectWithSize. - CGSize r = [s sizeWithFont:f]; + //CGSize r = [s sizeWithFont:f]; + CGSize r = pv.frame.size; + r.height = 999999; + r = [s boundingRectWithSize:r + options:NSStringDrawingUsesLineFragmentOrigin + attributes:@{NSFontAttributeName: f} + context:nil].size; + if (r.width > max) max = r.width; } @@ -3443,7 +3535,7 @@ wrap_with_buttons (NSWindow *window, NSView *panel) style: UIBarButtonItemStylePlain target:self action:@selector(resetAction:)]]; - NSString *s = saver_name; + NSString *s = saver_title; if ([self view].frame.size.width > 320) s = [s stringByAppendingString: @" Settings"]; [self navigationItem].title = s; @@ -3481,7 +3573,7 @@ wrap_with_buttons (NSWindow *window, NSView *panel) { // Titles above each vertically-stacked white box. // if (section == 0) -// return [saver_name stringByAppendingString:@" Settings"]; +// return [saver_title stringByAppendingString:@" Settings"]; return nil; } @@ -3522,6 +3614,15 @@ wrap_with_buttons (NSWindow *window, NSView *panel) h = r.size.height; # endif // USE_HTML_LABELS +# ifdef USE_PICKER_VIEW + } else if ([ctl isKindOfClass:[UIPickerView class]]) { + UIPickerView *pv = (UIPickerView *) ctl; + NSArray *a = [picker_values objectAtIndex: [pv tag]]; + int lines = [a count]; + lines = 3; + h = FONT_SIZE * lines + LINE_SPACING * 2; +# endif + } else { // Does this ever happen? h = FONT_SIZE + LINE_SPACING * 2; } @@ -3819,6 +3920,7 @@ wrap_with_buttons (NSWindow *window, NSView *panel) The default size of the view is just big enough to hold them all. */ - (id)initWithXML: (NSData *) xml_data + classname: (NSString *) _classname options: (const XrmOptionDescRec *) _opts controller: (NSUserDefaultsController *) _prefs globalController: (NSUserDefaultsController *) _globalPrefs @@ -3829,7 +3931,6 @@ wrap_with_buttons (NSWindow *window, NSView *panel) self = [super init]; # else // !HAVE_IPHONE self = [super initWithStyle:UITableViewStyleGrouped]; - self.title = [saver_name stringByAppendingString:@" Settings"]; # endif // !HAVE_IPHONE if (! self) return 0; @@ -3838,6 +3939,7 @@ wrap_with_buttons (NSWindow *window, NSView *panel) defaultOptions = _defs; userDefaultsController = [_prefs retain]; globalDefaultsController = [_globalPrefs retain]; + classname = [_classname retain]; haveUpdater = _haveUpdater; NSXMLParser *xmlDoc = [[NSXMLParser alloc] initWithData:xml_data]; @@ -3863,12 +3965,18 @@ wrap_with_buttons (NSWindow *window, NSView *panel) [NSValueTransformer setValueTransformer:t forName:@"TextModeTransformer"]; [t release]; + + NonNilStringTransformer *t2 = [[NonNilStringTransformer alloc] init]; + [NSValueTransformer setValueTransformer:t2 + forName:@"NonNilStringTransformer"]; + [t2 release]; # endif // HAVE_IPHONE [self traverseTree]; xml_root = 0; # ifdef HAVE_IPHONE + self.title = [saver_title stringByAppendingString:@" Settings"]; [self addResetButton]; # endif @@ -3878,7 +3986,8 @@ wrap_with_buttons (NSWindow *window, NSView *panel) - (void) dealloc { - [saver_name release]; + [classname release]; + [saver_title release]; [userDefaultsController release]; [globalDefaultsController release]; # ifdef HAVE_IPHONE diff --git a/OSX/XScreenSaverGLView.m b/OSX/XScreenSaverGLView.m index 84fe653f..7353a07c 100644 --- a/OSX/XScreenSaverGLView.m +++ b/OSX/XScreenSaverGLView.m @@ -48,6 +48,8 @@ extern void check_gl_error (const char *type); # ifdef HAVE_IPHONE return [self contentScaleFactor]; # else + NSAssert (self.window, @"no window in view"); + if (! self.window) abort(); return self.window.backingScaleFactor; # endif } @@ -198,6 +200,19 @@ extern void check_gl_error (const char *type); predictable. Without changing the code, some times a given saver will perform fine with multisampling on, and other times it will perform very badly. Without multisampling, they always perform fine. + + Update, 2021: In this modern world of Retina screens, I don't think + there's any point in trying to get multisampling to work. Modern systems + all have retina / hiDPI screens, meaning that a logical pixel is already + 2 or 3.5 physical pixels, and the whole point of having displays like + that is that software antialiasing isn't necessary any more because the + individual pixels are small enough that human eyes can't see them as + rectangles. If you already have 0.16mm pixels, having 0.08mm "virtual" + pixels is not perceptible. + + So multisample only makes sense on non-retina displays -- and those are + the *old* video cards and GPUs, that are most likely to be resource + limited and most likely to screw up in unpredictable ways! */ // if (ms_p && [[view window] screen] != [[NSScreen screens] objectAtIndex:0]) // ms_p = 0; @@ -330,10 +345,12 @@ extern void check_gl_error (const char *type); GLXContext * init_GL (ModeInfo *mi) { +#if 0 Window win = mi->window; XScreenSaverGLView *view = (XScreenSaverGLView *) jwxyz_window_view (win); NSAssert1 ([view isKindOfClass:[XScreenSaverGLView class]], @"wrong view class: %@", view); +#endif // OpenGL initialization is in [XScreenSaverView startAnimation]. @@ -367,8 +384,10 @@ glXSwapBuffers (Display *dpy, Window window) #endif // JWXYZ_GL XScreenSaverGLView *view = (XScreenSaverGLView *) jwxyz_window_view (window); +#if 0 NSAssert1 ([view isKindOfClass:[XScreenSaverGLView class]], @"wrong view class: %@", view); +#endif #ifndef HAVE_IPHONE NSOpenGLContext *ctx = [view oglContext]; if (ctx) [ctx flushBuffer]; // despite name, this actually swaps diff --git a/OSX/XScreenSaverSubclass.m b/OSX/XScreenSaverSubclass.m index aabfc830..b9048851 100644 --- a/OSX/XScreenSaverSubclass.m +++ b/OSX/XScreenSaverSubclass.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2020 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -14,20 +14,61 @@ XScreenSaver class directly, System Preferences gets really confused. */ +#define INLINE_ALL_CLASSES + #ifndef CLASS ERROR! -DCLASS missing #endif -#ifdef USE_GL -# import "XScreenSaverGLView.h" -# define SUPERCLASS XScreenSaverGLView -#else -# import "XScreenSaverView.h" -# define SUPERCLASS XScreenSaverView -#endif -@interface CLASS : SUPERCLASS { } -@end +#if !defined(INLINE_ALL_CLASSES) || defined(HAVE_IPHONE) + +# ifdef USE_GL +# import "XScreenSaverGLView.h" +# define SUPERCLASS XScreenSaverGLView +# else +# import "XScreenSaverView.h" +# define SUPERCLASS XScreenSaverView +# endif + + @interface CLASS : SUPERCLASS { } + @end + + @implementation CLASS + @end + +#else // INLINE_ALL_CLASSES + + // Let's make these be private classes in each saver, to avoid + // "Class XXX is implemented in both A.saver and B.saver. + // One of the two will be used. Which one is undefined." + // +# define _CLASSHACK_(C,NAME) C##NAME +# define _CLASSHACK(C,NAME) _CLASSHACK_(C,NAME) +# define GlobalDefaults _CLASSHACK(CLASS,GlobalDefaults) +# define PrefsReader _CLASSHACK(CLASS,PrefsReader) +# define InvertedSlider _CLASSHACK(CLASS,InvertedSlider) +# define SimpleXMLNode _CLASSHACK(CLASS,SimpleXMLNode) +# define TextModeTransformer _CLASSHACK(CLASS,TextModeTransformer) +# define NonNilStringTransformer _CLASSHACK(CLASS,NonNilStringTransformer) +# define XScreenSaverConfigSheet _CLASSHACK(CLASS,XScreenSaverConfigSheet) +# ifdef USE_GL +# define XScreenSaverView _CLASSHACK(CLASS,Base) +# define XScreenSaverGLView CLASS +# else +# define XScreenSaverView CLASS +# define XScreenSaverGLView #error +# endif + +# include "XScreenSaverView.m" // Must be first or principalClass is wrong +# include "PrefsReader.m" +# include "InvertedSlider.m" +# include "XScreenSaverConfigSheet.m" +# ifdef USE_GL +# include "XScreenSaverGLView.m" +# else + void check_gl_error (const char *s) {} + void clear_gl_error (void) {} +# endif -@implementation CLASS -@end +#endif // INLINE_ALL_CLASSES diff --git a/OSX/XScreenSaverView.h b/OSX/XScreenSaverView.h index 0a0796b7..ef38b56c 100644 --- a/OSX/XScreenSaverView.h +++ b/OSX/XScreenSaverView.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2019 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2020 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -75,6 +75,7 @@ { struct xscreensaver_function_table *xsft; PrefsReader *prefsReader; + NSString *saver_title; // "Möbius Gears", not "MoebiusGears" BOOL setup_p; // whether xsft->setup_cb() has been run BOOL initted_p; // whether xsft->init_cb() has been run @@ -95,6 +96,7 @@ BOOL _ignoreRotation; // whether hack requested "always portrait". // some want this, some do not. NSTimer *crash_timer; + NSTimer *cycle_timer; NSDictionary *function_tables; @@ -146,7 +148,7 @@ # endif // JWXYZ_GL && HAVE_IPHONE } -- (id)initWithFrame:(NSRect)frame saverName:(NSString*)n isPreview:(BOOL)p; +- (id)initWithFrame:(NSRect)frame title:(NSString*)n isPreview:(BOOL)p; - (void) render_x11; - (NSOpenGLContext *) oglContext; diff --git a/OSX/XScreenSaverView.m b/OSX/XScreenSaverView.m index f953b531..7f911eb0 100644 --- a/OSX/XScreenSaverView.m +++ b/OSX/XScreenSaverView.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2020 Jamie Zawinski +/* xscreensaver, Copyright © 2006-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -134,7 +134,7 @@ extern NSDictionary *make_function_table_dict(void); // ios-function-table.m // Given a lower-cased saver name, returns the function table for it. // If no name, guess the name from the class's bundle name. // -- (struct xscreensaver_function_table *) findFunctionTable:(NSString *)name +- (struct xscreensaver_function_table *) findFunctionTable:(NSString *)title { NSBundle *nsb = [NSBundle bundleForClass:[self class]]; NSAssert1 (nsb, @"no bundle for class %@", [self class]); @@ -149,18 +149,13 @@ extern NSDictionary *make_function_table_dict(void); // ios-function-table.m NSAssert1 (cfb, @"no CFBundle for \"%@\"", path); // #### Analyze says "Potential leak of an object stored into cfb" - if (! name) - name = [[path lastPathComponent] stringByDeletingPathExtension]; - - name = [[name lowercaseString] - stringByReplacingOccurrencesOfString:@" " - withString:@""]; - # ifndef HAVE_IPHONE // CFBundleGetDataPointerForName doesn't work in "Archive" builds. // I'm guessing that symbol-stripping is mandatory. Fuck. - NSString *table_name = [name stringByAppendingString: - @"_xscreensaver_function_table"]; + NSString *classname = [[nsb executablePath] lastPathComponent]; + NSString *table_name = [[classname lowercaseString] + stringByAppendingString: + @"_xscreensaver_function_table"]; void *addr = CFBundleGetDataPointerForName (cfb, (CFStringRef) table_name); CFRelease (cfb); @@ -171,7 +166,7 @@ extern NSDictionary *make_function_table_dict(void); // ios-function-table.m // Depends on the auto-generated "ios-function-table.m" being up to date. if (! function_tables) function_tables = [make_function_table_dict() retain]; - NSValue *v = [function_tables objectForKey: name]; + NSValue *v = [function_tables objectForKey: title]; void *addr = v ? [v pointerValue] : 0; # endif // HAVE_IPHONE @@ -188,14 +183,22 @@ extern NSDictionary *make_function_table_dict(void); // ios-function-table.m NSAssert1 (nsb, @"no bundle for class %@", [self class]); NSString *nsrespath = [nsb resourcePath]; // "Contents/Resources" - NSString *nsexepath = [[nsb executablePath] // "Contents/MacOS/SaverName" + NSString *nsexepath = [[nsb executablePath] // "Contents/MacOS/CLASSNAME" stringByDeletingLastPathComponent]; NSAssert1 (nsrespath, @"no resourcePath for class %@", [self class]); NSAssert1 (nsexepath, @"no executablePath for class %@", [self class]); const char *respath = [nsrespath cStringUsingEncoding:NSUTF8StringEncoding]; const char *exepath = [nsexepath cStringUsingEncoding:NSUTF8StringEncoding]; - const char *opath = getenv ("PATH"); - if (!opath) opath = "/bin"; // $PATH is unset when running under Shark! + + // Only read $PATH once, so that when running under Randomizer.m, + // we don't keep adding more and more to it with each selected saver. + static const char *opath = 0; + if (!opath) { + opath = getenv ("PATH"); + if (!opath) opath = "/bin"; // $PATH is unset when running under Shark! + opath = strdup (opath); // Leaks once, NBD. + } + char *npath = (char *) malloc (strlen (opath) + 2 + strlen (respath) + 2 + strlen (exepath) + 2); @@ -218,9 +221,6 @@ extern NSDictionary *make_function_table_dict(void); // ios-function-table.m // - (void) setResourcesEnv:(NSString *) name { - NSBundle *nsb = [NSBundle bundleForClass:[self class]]; - NSAssert1 (nsb, @"no bundle for class %@", [self class]); - const char *s = [name cStringUsingEncoding:NSUTF8StringEncoding]; if (setenv ("XSCREENSAVER_CLASSPATH", s, 1)) { perror ("setenv"); @@ -299,6 +299,16 @@ add_default_options (const XrmOptionDescRec *opts, "." SUScheduledCheckIntervalKey, XrmoptionSepArg, 0 }, # endif // !HAVE_IPHONE +# ifdef HAVE_IPHONE + // Cycle mode + { "-global-cycle", ".globalCycle", XrmoptionNoArg, "True" }, + { "-no-global-cycle", ".globalCycle", XrmoptionNoArg, "False" }, + { "-global-cycle-timeout", ".globalCycleTimeout", XrmoptionSepArg, 0 }, + { "-global-cycle-selected", ".globalCycleSelected", XrmoptionNoArg,"True"}, + { "-no-global-cycle-selected", ".globalCycleSelected",XrmoptionNoArg, + "False" }, +# endif // HAVE_IPHONE + { 0, 0, 0, 0 } }; static const char *default_defaults [] = { @@ -338,6 +348,12 @@ add_default_options (const XrmOptionDescRec *opts, # undef __objc_no # undef STR1 # undef STR +# endif // !HAVE_IPHONE + +# ifdef HAVE_IPHONE + ".globalCycle: False", + ".globalCycleTimeout: 300", + ".globalCycleSelected: True", # endif // HAVE_IPHONE 0 }; @@ -441,14 +457,15 @@ static void catch_signals (void) - (id) initWithFrame:(NSRect)frame - saverName:(NSString *)saverName + title:(NSString *)_title isPreview:(BOOL)isPreview { if (! (self = [super initWithFrame:frame isPreview:isPreview])) return 0; + saver_title = [_title retain]; catch_signals(); - xsft = [self findFunctionTable: saverName]; + xsft = [self findFunctionTable: saver_title]; if (! xsft) { [self release]; return 0; @@ -462,10 +479,10 @@ static void catch_signals (void) /* The plist files for these preferences show up in $HOME/Library/Preferences/ByHost/ in a file named like - "org.jwz.xscreensaver...plist" + "org.jwz.xscreensaver...plist" */ NSString *name = [NSString stringWithCString:xsft->progclass - encoding:NSISOLatin1StringEncoding]; + encoding:NSUTF8StringEncoding]; name = [@"org.jwz.xscreensaver." stringByAppendingString:name]; [self setResourcesEnv:name]; [self loadCustomFonts]; @@ -514,6 +531,10 @@ static void catch_signals (void) ScreenSaverEngine calling nonexistent beginExtensionRequestWithUserInfo, but on 10.15 we're not even running in that process: now we're in the not-at-all-ominously-named legacyScreenSaver process. + + Dec 2020, noticed that this also happens on 10.14.6 when *not* in random + mode. Both System Preferences and ScreenSaverEngine fail to call + StartAnimation. */ - (void) viewDidMoveToWindow { @@ -531,12 +552,11 @@ static void catch_signals (void) #ifdef USE_TOUCHBAR - (id) initWithFrame:(NSRect)frame - saverName:(NSString *)saverName + title:(NSString *)_title isPreview:(BOOL)isPreview isTouchbar:(BOOL)isTouchbar { - if (! (self = [self initWithFrame:frame saverName:saverName - isPreview:isPreview])) + if (! (self = [self initWithFrame:frame title:_title isPreview:isPreview])) return 0; touchbar_p = isTouchbar; return self; @@ -554,7 +574,7 @@ static void catch_signals (void) - (id) initWithFrame:(NSRect)frame isPreview:(BOOL)p { - return [self initWithFrame:frame saverName:0 isPreview:p]; + return [self initWithFrame:frame title:0 isPreview:p]; } @@ -694,6 +714,9 @@ static void catch_signals (void) userInfo:nil repeats:NO]; + if (cycle_timer) + [cycle_timer invalidate]; + cycle_timer = 0; # endif // HAVE_IPHONE // Never automatically turn the screen off if we are docked, @@ -790,7 +813,13 @@ static void catch_signals (void) // Without this, the GL frame buffer is half the screen resolution! eagl_layer.contentsScale = [UIScreen mainScreen].scale; - ogl_ctx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; + PrefsReader *prefs = [self prefsReader]; + BOOL gles3p = [prefs getBooleanResource:"prefersGLSL"]; + + ogl_ctx = [[EAGLContext alloc] initWithAPI: + (gles3p + ? kEAGLRenderingAPIOpenGLES3 + : kEAGLRenderingAPIOpenGLES1)]; # ifdef JWXYZ_GL ogl_ctx_pixmap = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1 @@ -839,8 +868,21 @@ static void catch_signals (void) # endif // USE_TOUCHBAR } + +/* "The stopAnimation or startAnimation methods do not immediately start + or stop animation. In particular, it is not safe to assume that your + animateOneFrame method will not execute (or continue to execute) after + you call stopAnimation." */ + + - (void)stopAnimation { +# ifdef HAVE_IPHONE + if (cycle_timer) + [cycle_timer invalidate]; + cycle_timer = 0; +# endif // HAVE_IPHONE + if (![self isAnimating]) return; // macOS 10.15 stupidity if (initted_p) { @@ -973,11 +1015,10 @@ static NSString *touchbar_iid = @"org.jwz.xscreensaver.touchbar"; rect.size.width = 200; rect.size.height = 40; touchbar_view = [[[self class] alloc] - initWithFrame:rect - saverName:[NSString stringWithCString:xsft->progclass - encoding:NSISOLatin1StringEncoding] - isPreview:self.isPreview - isTouchbar:True]; + initWithFrame: rect + title: saver_title + isPreview: self.isPreview + isTouchbar: True]; [touchbar_view setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable]; NSCustomTouchBarItem *item = @@ -1095,30 +1136,29 @@ current_device_rotation (void) - (void) handleException: (NSException *)e { NSLog (@"Caught exception: %@", e); - UIAlertController *c = [UIAlertController - alertControllerWithTitle: - [NSString stringWithFormat: @"%s crashed!", - xsft->progclass] - message: [NSString stringWithFormat: - @"The error message was:" - "\n\n%@\n\n" - "If it keeps crashing, try " - "resetting its options.", - e] - preferredStyle:UIAlertControllerStyleAlert]; + UIAlertController *c = + [UIAlertController + alertControllerWithTitle: + [NSString stringWithFormat: @"%@ crashed!", saver_title] + message: [NSString stringWithFormat: + @"The error message was:" + "\n\n%@\n\n" + "If it keeps crashing, try resetting its options.", + e] + preferredStyle: UIAlertControllerStyleAlert]; [c addAction: [UIAlertAction actionWithTitle: NSLocalizedString(@"Exit", @"") style: UIAlertActionStyleDefault handler: ^(UIAlertAction *a) { - exit (-1); - }]]; + exit (-1); + }]]; [c addAction: [UIAlertAction actionWithTitle: NSLocalizedString(@"Keep going", @"") style: UIAlertActionStyleDefault handler: ^(UIAlertAction *a) { - [self stopAndClose:NO]; - }]]; + [self stopAndClose:NO]; + }]]; UIViewController *vc = [UIApplication sharedApplication].keyWindow.rootViewController; @@ -1739,20 +1779,20 @@ gl_check_ver (const struct gl_version *caps, if (_lowrez_p) { resized_p = YES; +# if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR NSSize b = [self bounds].size; CGFloat s = self.hackedContentScaleFactor; -# ifdef HAVE_IPHONE +# ifdef HAVE_IPHONE CGFloat o = self.contentScaleFactor; -# else +# else CGFloat o = self.window.backingScaleFactor; -# endif +# endif -# if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR if (o != s) NSLog(@"lowrez: scaling %.0fx%.0f -> %.0fx%.0f (%.02f)", b.width * o, b.height * o, b.width * s, b.height * s, s); -# endif +# endif // DEBUG } [self resize_x11]; @@ -1807,7 +1847,6 @@ gl_check_ver (const struct gl_version *caps, if (! fps_cb) fps_cb = screenhack_do_fps; } else { fpst = NULL; - fps_cb = 0; } # ifdef HAVE_IPHONE @@ -1816,6 +1855,21 @@ gl_check_ver (const struct gl_version *caps, # endif [self checkForUpdates]; + +# ifdef HAVE_IPHONE + BOOL cyclep = get_boolean_resource (xdpy, "globalCycle", "GlobalCycle"); + int cycle_sec = + (cyclep + ? get_integer_resource(xdpy, "globalCycleTimeout", "GlobalCycleTimeout") + : -1); + NSLog (@"cycle_sec = %d", cycle_sec); + if (cycle_sec > 0) + cycle_timer = [NSTimer scheduledTimerWithTimeInterval: cycle_sec + target:self + selector:@selector(cycleSaver) + userInfo:nil + repeats:NO]; +# endif // HAVE_IPHONE } @@ -1869,8 +1923,8 @@ gl_check_ver (const struct gl_version *caps, An NSTimer won't fire if the timer is already running the invocation function from a previous firing. So, if we use a 30 FPS - animationTimeInterval (33333 µs) and a screenhack takes 40000 µs for a - frame, there will be a 26666 µs delay until the next frame, 66666 µs + animationTimeInterval (33333 µs) and a screenhack takes 40000 µs for a + frame, there will be a 26666 µs delay until the next frame, 66666 µs after the beginning of the current frame. In other words, 25 FPS becomes 15 FPS. @@ -1980,6 +2034,9 @@ gl_check_ver (const struct gl_version *caps, /* drawRect always does nothing, and animateOneFrame renders bits to the screen. This is (now) true of both X11 and GL on both MacOS and iOS. But this null method needs to exist or things complain. + + Note that drawRect is called before startAnimation, with the intent + that it draws the initial state to be exposed by the fade-in. */ - (void)drawRect:(NSRect)rect { @@ -2014,6 +2071,12 @@ gl_check_ver (const struct gl_version *caps, } +- (BOOL)isAnimating +{ + return !!xdpy; +} + + # ifndef HAVE_IPHONE // Doesn't exist on iOS - (void) setFrame:(NSRect) newRect @@ -2098,9 +2161,9 @@ gl_check_ver (const struct gl_version *caps, #endif { NSBundle *bundle = [NSBundle bundleForClass:[self class]]; - NSString *file = [NSString stringWithCString:xsft->progclass - encoding:NSISOLatin1StringEncoding]; - file = [file lowercaseString]; + NSString *classname = [NSString stringWithCString:xsft->progclass + encoding:NSUTF8StringEncoding]; + NSString *file = [classname lowercaseString]; NSString *path = [bundle pathForResource:file ofType:@"xml"]; if (!path) { NSLog (@"%@.xml does not exist in the application bundle: %@/", @@ -2121,6 +2184,7 @@ gl_check_ver (const struct gl_version *caps, NSString *xml = [[self class] decompressXML: xmld]; sheet = [[XScreenSaverConfigSheet alloc] initWithXML:[xml dataUsingEncoding:NSUTF8StringEncoding] + classname:classname options:xsft->options controller:[prefsReader userDefaultsController] globalController:[prefsReader globalDefaultsController] @@ -2285,8 +2349,7 @@ gl_check_ver (const struct gl_version *caps, case NSF12FunctionKey: k = XK_F12; break; default: { - const char *ss = - [ns cStringUsingEncoding:NSISOLatin1StringEncoding]; + const char *ss = [ns cStringUsingEncoding:NSUTF8StringEncoding]; k = (ss && *ss ? *ss : 0); } break; @@ -2473,6 +2536,13 @@ gl_check_ver (const struct gl_version *caps, } +// The cycle timer behaves just like a shake event. +- (void) cycleSaver +{ + [self stopAndClose:YES]; +} + + /* We distinguish between taps and drags. - Drags/pans (down, motion, up) are sent to the saver to handle. @@ -3025,14 +3095,11 @@ gl_check_ver (const struct gl_version *caps, - (void) stopAndOpenSettings { - NSString *s = [NSString stringWithCString:xsft->progclass - encoding:NSISOLatin1StringEncoding]; if ([self isAnimating]) [self stopAnimation]; [self resignFirstResponder]; [_delegate wantsFadeOut:self]; - [_delegate openPreferences: s]; - + [_delegate openPreferences: saver_title]; } diff --git a/OSX/YearlReg.ttf b/OSX/YearlReg.ttf deleted file mode 100644 index 454fef0103da3f86afac5f3d919b5cf11daefc15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44984 zcmeIb2Yg(`wLd;{SK3uyZPQ9C?P{f6)wOzam2KQ{!QGY%wsFINOI*MPl3SC&KGOY+|5_x^c?tC^j>J9p-s zGpEftbA=Q_6o|8gLo7XRR#WSYUuOh`kSC&b>GHM9HniLuI7f)g=|W`qm!G;hDh|5J zgvgzO?<1==tX}KvxuHvl>=pRUrq#hi4dr|868Ct~m$KL#HUEUJvJH2nP<9x?he0B$dJF2mx)Z={T=)# zWVtRK&x=*oV|0IK0equGlrvQSqWCAC72+?39s|a9FsjCcKc5=^j+^jN&jj^9qqPO) zVNoq_6r<#)A|l@xoyK*d)wo;?7C#ZgWwD5=>vZ8ZCW>P5W6>yQh;s3vh{;<-(C~>) z*@@qMi1KYwXM}`D{vP#DalIpo<)6i1RnHVn5|_~`>W!F4u#_)}2IC%-?~5+^39jFZ zq4Kx5el9wI)xk0;+EDKlPl{Uk0s4DG43V#h5ymz6&7VY@k)xh5M1F>QU&n87ulz`q z$anD^zwjD=76tOhA|$_s-+zj0xoF0iJuHoU%;UYj-^v6O18>P`Md@=^uzYo|yB3g`PqR<#DD&<~LtNK19jy1lH=YK~G zGHOJ`_=}jp&&DSrAM+`f=ZhMQy~EfBx~UQ^#D`&sORf6>+e-N!p8I25eE!?G-of-2`n~?!}$N-))@oWd+mVvPn?*9&azJu#0 zxPFf7Q;g|-%<&`h`l($y!l)Cr?_=(~eue8JTrmZMNix>=8Lp(l(MP}~ulLi+4*?^> z`d#4cHC%7u`jKb^Ox(cDTm!V>h=`&5tgd{qlyFk8BJOSz(^UNZKxqt6m;J{UhN2BT*z*00!rYHb+_C>9PTI9uNhN1`*4^y0D&sXKt}@ zqsH`SQKg=95bKDvZjFmLOn@fbxPB-afqjR*j9QZml%a(jq*gcqW&Fbj{Qp<}^=Afu zb(hhHP!5@(6a#2eyE;%(5tYOzWDK)fz~ zD4rE>ij&1@;``zT@qpMSmW#FGN8m#LCSDV#h^^ukae_Eqd|6x~9utp?Z;0o_i{d5m zym&#}kM;A2ctRY)xL+0D74Knvzbv+hZ;FH9;b)3-#Tnu}ake;LTp%tKJH#$=G48ww zvfyjta`C9xE1nkXMX%T|o)V{uXT$-q58r2C)e1mo6!2J#T0UTMC!X~%?%$86ypHkz zT6`}0WQ&|7x5_JwmyCBD&qn>xP&5*)j8;dRqeG)(D=I6hD~(ELrMuEo8LEs_CMqXZ zF0EWy_3~egzCQHJo}+;0-GJO<7{xPy(;Jw>Z&lATRnIRPZ=h#iv^ZJ@VZ)w>{MDXU zpl6AmW#8}nK2rUwKYhI{`kv@}yzkMzvr+5rt76Mx{!#zlzw7-Q!5VkH_t1Oyzx%y+ zUw!w*cfa}Wfp>e~eem5Y-aSKzw;tZJ8WfkzU8Eu;Z8S9^}ovB)O0N%TRYyQ)J zt-I38)A51V3BWihW)*1SM9|4epoUXG1M7gB4WO2dpp?zP>ZzcSt)R<`6do@DeO?AE z5|>vh%Ge9+Xa&`-lD#6s!o1Ve1kLlNfzBBQkD}e`TNT4@AxZrGX#W}d$ z(FeT`+Kx1~3y1NPqHIG{_a((0YyqdfhhyB2$7g_nXCy}Zz|S+lvopY#A)#@N$2Aw% zDqN@H+JP&3@#su2ybLgl3}Gzhvcs=E-XZ9%X&(i{r=0w_`Fn+{sdOJCL}qu-J}?2} zQ#`?iN)T5Kt}a{?aLvQD8rNyK&c~&ma5XA-;W8FCw{&^hJVC!RR$1NA-r3e#G;D!8 zURoOG^$q!Ka@4uH9>=Ul$*bfv;{b-?5*$&&8jHcP7$U#B#~hrK4Nl!)6r%BM5b7b& z;i2Xh8FREbaLExPe9NB3gRJT{L!j{)FkiT7!xgT+M`#}m0hzJhdg<6)X)uWa`ZLg@uU<3wLjFN-yM9D#W zny?&E_o2@3LMZt;iqeI$(kvTLvX54j{JtG!0_9+oyl)6fem~-E$fcoxqf-qa4k!*% zwJy~BYA8eMg-) z9`+tHWk|f``DxR(PnmK)Kd)Ki4adDxmpxV&Ue@K0mlhs#j3*rPPFi|@hEW%vDQD~% z_ZUbEw9^U#YXoh%p+Uv4N)qB$je{z{+oh&U1+QAw>QF0HH9upmsEebedvdwoyn*>;WxTGWG-{KF+uz#IDeA*~^-l%ZMzu8}^8o(J}9XMrdZJ=T?LMsmr?=?d8{@>jn_7?43+_-e@k0zhB zE+-TUIt%5ZuIz%`Ohe|lW6^*#ZY!-VE0|bZnf&q6)(y8lv`M~_=MCmUU6-(zuM#&Y zo>t76TJy6xT62pJ%PUkDxyX+z7wk!WrSHaa>0g|1+M!{v+^!Iz>V8p}!> zhQ~@n4V6AA{gsWOOA_n0Z0&4YyZZPlZ_|Q>%Q}ayUA?O9sN*6v=W<+`(7$t`Vdvs; z7-TjoCAjKv4Z$@DR}Zc=xVGWC5LY(G<-xQ#E+5vhtESsg)81&*bVVE=mNkxumWCQD z{nB627%Gj8Xb8#1&aGS4CA@8`R<9k}xoqKrCU4d8tJeZvZrLTL7!P96%rjwJ02)_P zEQeH*BeGLulgEa`w&hlh9clD_o#TtQb&%vICXB)fuLHEph7SMWQ|bH-0~ z&mOlU<11xr^2?4Z&s$$Cf1bZ>(6v`LZYs!~HZJGxyK~1($M}lD7cwBtbH!qfPcBJA zElLUlCl;kdnRUpb4pa8pW0D+`)Wn{R3M>HX4)~D+Kh8!;$yY^2*wIG57m&?kUwdur zYoC1b$=L6HmkufXs5_1poA%#^cA3CO}?B8P5nX>+;?WUK~{ zx?Q?lp%U4;rL4#wS+NDrC>L)^pR7U06?_JDCz75PlbMtP(j0$t%SbTna^rVzPMfC3 z7wh{RmfIPC(+q2T8ESlr?gi*xfbQY@!!;h)TwJSgor-G*E>pV^pnE`kF`ktTFq8X1 z4M|f$ZnYGUVbnd!;4_q9p+asmKE>Vr)~O8{1m z95MJ02#*YwXmOw{0&22Q&w_RZF$Vx<;!`HRAz#l!J&(UYy#RHRtrvXDqwWl*xW0qv z2Mb71v8}A^huv<#W+y!qm|bR~3%|lvK*>mF!T^W&fWsT$@L+^(^0CJFrq%Jr_V}{3 z@%DL#4$X=;HO1xrcuPw>BRLuHh+u|4HwYug&G$FD58r~Ga4X@r3-Akz8#MGHn7<2G1QVfFLY*|E zU_r$o8{d%RsceN%QeScN7pNDaUa0E(fDFQ!nhU=vMp=w+0;p5{Vp)FF(Suhi{fJND zb4l)HB=-(ZWTb=^5rYm(F&Q@ePPYs|j&wS*vO>Y9@0-^Vzcb$6UUC0kY_DV_m@bzxjS%n@+Kv#99gV1zkn$yY5@FA0x) zd}GbShk6+8VY8hoQaS25Xs_g0~-LK~r#K%J#lp?cw<@d=?deza1VYB%p3oPvr? zUifW)V_-j4AgO~2B|wCALy~X-U~UDl!b5ySP=xRZQ$GXoQ8n`eaGfJ$dvyYu8EYwU zQb+THrMMz8SQL=gX66_BhTR@-nO=HjL4n(Q`>k&8OEVMoulqtCmop>a_XjeZ6SGQ! zg)Q+llfuEmwce7s#RX@M9UgBg@CUQ5^5p0H9gaX=zK3*XU^xl-U1KHWK)#ql$dd`d z{!v3G=OvuUiE~pNIGy2U;qLwnmzr*#$#5$=WSgfg;Bd9cb<>moA>%`qJ-mDOjW^yn zL|&Ra`&ik^T>?$(H(?AV;wFv&6bz{6D%?AOd(yMU_CAb^)L>D32EL(LL0Tq{ATCMm zY$uKLGiifmX$pfj$Jh@YK$4?i)&bP=)T|vqSdP+@^6)$M>p|%=*##6rtxPARry>9a z8+Kb*%A4BbPsTguz4Xl) zX%T8=YNlj{5vA&CV*!Q&Sz%XaTZOBF6AKmvU9<^yyGzOoU&@b!Jf(%cVwokApB;?G zva^jjFTcFFsIoXOClD`@&y|IpS+lP6=M{K^?*N>|K<;h8Yk{cbY%NKeKB@xTMlA`- zHq@?Ix1+0~qe9+Re@tUYE_RmG4X;bSC3hON!!Nr0vQeXU?K*b|Hq0oRp(o3`jfLx6VA zO3gufVMH{FN_8h&$x9NrvmNy&)cNFAl>Dyis2B-j?u`l~EvU7k#;3Q67WB#9bq(VO zmfF*>R9(|3M@aJBw#w?7>KbaT;2-1^O8HP|qd6BK>h3O%lx03w?DLiwE@!~&4LDtf zKT_qn#T_rl%5)VM6&1T&j+rmx-@LL)pDQyrr?TuxZ$ZA#lbh$>8j2U?`aq|epKB_n6Cl9f;x5|L zT(Pz!N~f42zzT8?bWHfsF47QkfyHX38mj;i!PK=uL%~ie_LqiplE0I(Koc*C`thbA zb6$P*FA8hqcA&l*SyJz#<-ykAo{) zVq`)FWW|v>nI}y@d%)7qtnxThPm{Tpvq+D-Z;v_dfS9buorh(kl_ByqtwVrUgSw#S z0w3gqS}J&0RFWf&WoBx5rq_D4*;ePJkAoh z4FH*Tr<7m-QG5z1rJ+r0D#+j$>#%d3cUDUgq^js=Z5o<*knR-#qoyAGssN1+t=K zV{yscAtlAhKgkOYAC8yM7blKBq76N~P;v9)J|f5Fn*5 z3IL`ribe!2G5Xp(4w_=!kIZR{Jr-}8`NR|Ny=OGUT3h0We_(VaKjZ4d+@!n{G*k%6 zE*95oDuRxqXqwC`L+N&y14gR(U9SQ}wpuUL>MXfK%fUh{?+&HrWy&6VUg^{DV-hf_ zzz6bCYNsT{HKwNkMfal?OU@W@PfZbPNVyVCZ|j{c@#IgXFWz1mj#kcn@kPgrFV2oP z8E3b|uZhQ7;&Q~H@!z73JQRB#_h7E&;&RRt1PA<-0As}pC!8If>Xx*PqHgIrTH0E= zBk!_YovhPdq8HoN8cipUJ!4z^QWdu7obxP8Q%h1btyPhl4j{0jOWxxysqjATtqc{i zve#Qt;-2}fZ_Qljjg}O!MSh31f|96rzJGeMWI8vGK(|9p+>&nB>KR*fOL`@5r&dg= z)b^kgwL%4pe0*=yrRgs^`fO;Mk@&O<0V6l1LI7DZ$m5g0fA2k+i!HF3FHU)h_VZxS$HkzJY|AeSzOEPG`meNvD$(PVjy~>Bp(2S#~b~T-VJ;L z8^^A)xsr<#fv|5df}?qb@I9xJ&Qah=#M7vqQ~~B#Lh3&` z@xYup2j)sylKiQ$J^3r?JN#9y6YgY4aR$ca&^8wROq%vAd1wPp?>E-Y0@d)>dQKPM zw_dRjBf*?}m``C!dncZ>7mhHsaO6+nD4i`F;R&%l9w|SExd#QNegW50hmvZu?w_Sr z6D8M~7a)*F&1nc|>Uz*}f!L5{pOCX=4yPqYX_4~G=*jtFBqFZp@qq^dsWM0s2C zc#P#_d6gauZA~d3!C1I|crl@@?Q%lM@+Z@4Z25^aPtogAYdBgOYFJvn<-!yc11Tux zlJn%Iah`O-$;A)gGQx!EB+?3VmANBmX)a1;Jkl6{gD&J(;_b6ue;pDX9^^Oa5z0z3 zddI-lkCb-+*OYJD^?WGbJgL=3?S#^t(oXAR7H#tz(svH-r{{~h7|GU_dFJ-KEoahc zovN3n^=!;Rt6tLFE2fH~h29Zw^U(~PH&2gu#&bB%f%P)7X@QmK<}hjOVHmDpU@x8fRok@&cSF)#BGF=<_wJ!Y=CwJ*EBj1SD|-5?1&0^O?&*| zc*m?~_IaWu?vD6l@Y)~PTiG_3eBgvtcMo^wd5gW{R@Ww);>%CGtvk22eu07?;%MZ3 zfS*f@Bm8WSyd~2IVBB`eYfTo6n>-3r%m7VGA{BlPnK%1pggdq#{;tt7UHMTZ{997# zZ~sF&K!;Xn-ES>y=rjc&p3({_<+CQFQnXY5@|wRmk5X4kAm`5eC-G z2avX{211s^hDb+OsSL_U$B*V+cl|u$Y$Mq&U!g`-0H*Z@`YY7lu>VAVcr2B(FVJ%E z#Dr|gmF8pH@MI&_!1@eyMB6$~`MHov6zU${O76bu& z;oR(H+uV{_iIEveT2Ltpe@Eq#+%-G2fS~3@&P$Z&5=mljd;9l@g1&K%hQZ36;M?)0g~rz7TH+jUqdY8o zjUQvp4beD*UajI2=#|e&;lmuR9f4u4K{S9+K&RN5D3@~k&YdIAtsD~DX*kZ^*?Ded zZfqxFn}6GPrhFN`X@~Ie8U11&TtJ#zzIkqYJEo2CR2dE8JH|`6w^ZYawhd($eubb@ z+(SFbSJM`}VEMcmM#FX2@plG%iURRMec&M>aSne8NdT@->xPs#+-J5mU6K;&Ak@tzO+Iu zSxPIxvP7}sF$5>(MlT69Fl~j})`Gd-Z7MW%M0 z*TIhVcyhskaOJ`~?!fM+ap38yxFdNR$1f3cDddF;C#FqDY*=vD^4;=2TB9a^u(U%i zZm+T{Z2NNnMr;=xalT6{-+O*k&kNF8^}Bn@^-+!5F~G|2Wm)+W2Jw_ z@)H*I)4!<6Te=ptb?sZTJv0M?#nNpII%G5xBH?7J^*}%{^2QP-U4aTtg3H0hzy~Oq zw^xRL^xNd;(Rx`LZ|^C{zw=pH5U=`@oKqE-Pqf6#y#-j|5?)6k*CF!TD=s8PY^g?M zqva4T%*~0qwv#LwXU4PHG;gwE8}24%?1prjqPd7i1C`oC#~M}CEcy!=u}u5AW2993 zv4MledE4duIdcuCw>)&Ov1#+P-{`--j5E=Dpu~%{ z25h@v9~lfDNNbP&5E~~&DIVpfq;#hR@R>{4l@gscl0dr(HJpSSHIG6P(dE-Jj;kBn zKdI%SmiQU<(bqGdemq>+9{!yRcsJEI&1Mbz*~F zS&KV?H1Jewj$G#!=Ou;fU50|xto}BqN?$E%Jsruq5PAi=tI)=cVpty8a?^sI+v4r= z-sC*vz%y{e&m&G|0K?B4uPQz}i#VY+l)*6pJ0xKU9gLkG5Iug2wgzw`bAc!ar5$V6 zZ~qj^@bl4VF&j8Nd z;%-gFqSjt}q|G2U{si7e19`Ga&;@Y+NJtKH*erZOk+UvG}lPgG@ zoT($)QGn?o(8Md%B@7PTGB`=`eulm)2WwZG%x`I(w`0MA^0kX($B34fu-SAVx%Fkt zZ4_pB1Lo!sZJHXWgHZ9X;QWQ!95v-pi?kv~AH6VkV!eCBmAWs?9eOeKa`sB6%zo+} zs(-HVbf31W%8G5$~a4ec4E^Pn&C8~V&0Pvtj6sMv$?M%f+*XIgl}4GZI)u&Puj zS!QxK>3A4q#wC~!^*~dTO4mm;jJY2!*) zNw^AHse&Z5QOG0!@zck#)RHan$IbCv1Kq7eoS~t|*vO+tSTRmgYiw4WFIS!IC$xk2 z(Nlld1_LdQ45rd5hEGXO9Uh4Ad1wRLlwqn6kT0)shbp|k_~h|uQ*-na`QCwWZ4dWz z=UkYmJ||u`dwT+wCE;3vKcm1$Q#u>$IK}(4{m*erj87#yv_FqD4hc`6w+aA z>uaQ3Z4D44R0`D|kFo~1B?!Z~gP8#bH=iDgdR=qnocY`2gUOqxX89{iaFHW6Xk3ss7=uiHXITO|mdc`S>QhJZI#X8J6l}6(yTN9DjLo9zqV#>`ck!Ih zRki?X{_f;lT#UcP*vj$eL(r{LjOExY2->E3f1DrfSvsgm2VYen@1_*4i14wG^_+j< z0_Y=WOY90M-P`yMo|7*wN`H>2quJdKn9~6HH2|0Ptj)37xYTi0nNS+En@HDkF>}@+ zx?=Fcam2$UMr~Agf9d>@SIs%`f})}?pFCgoB=5!q?ve|5VGh`Vk>3LzbH&#=hh9{e z%EF}9Op&V|!ki*qLz<^qL%yS`X?)xJTLZY~fT^alD7Erzb%mj8*!NctW%dedFs*~J z8l*ou+Jewc8gJXYV%6F^Zr-$X&B=Xzk3RajbnJuPCq)-{tJWt>y^A|Y?$i#FJ4Kb$ z@NM}^UD2}nG{3cE0~d$Ai!=a1e{He-E%SnlK%1?~5oH+_+KsrgrS);=K8m}W7EEt$ zpS%W?eQ$E1WS$DBi_qUE>I!K9`i(a{!Yl``2UPd|LPL7q9c zCAnj^8e2u*m*oiXv?_5f>4=ea8SuDK(d51yVa!tVWL;<6LmX|z@OMUVZye~h)~dOy z1#ZWlbhgNT(597nVc>TbUkL!DFtVXdN1#EIQsI?!>9{fkHB@&DmtD#X1)pY=rb-_O z!o*Ir4)Yb~XD(eTrOOlYt@N%&#AaEjq|}vVtUg;721~N!s2O$5iPgihg8qWZuS80M zRhh1uKymoD#7A@A+hUi&Z0~A4=P%TU-$qy@RN&@CapR-IVgA0NZ%2QaQ4WAZV)YfG zl$Z&1Q@s~Ri4ZxYC4;qh!?su|nx&YAKrxe@_w(0E&EJm%Q|%lC&EsxO-Rxh8nCib6 z(9`=}T^_ab*(7x$OIIUuAQ8C)KPjSriu?gT%=&j!&PA(trIF<-EeVymTymv%B@-^B zT>9taYs|Kg6W$3I2di9}HGz`Ik0vwKV%XY5>mZnu@C?d#h;%VNf{JhZZ@Ohk5*LtEShV#mu zQ_n4mVp_<5$6xLzQ!hNAF#{__!Q=1C5bK2^r$L+f7|Fx z96RE`@gi`(G4YYk(Ci|`xzq#1%&I8{w}T|(goKdZBFh#9z7CnfInq` zQEj`2bUZp%1D>LHP3Tj$g5`8jD2!^ohhn;emG2aBCNM;yf5=5O;kNGPa9vHfwYx1` zGwsq#r+q(Mb?K!w;h%-8cI>DM&z$`BG|U-EfAVuD zO6@DM;zo2lAoomZVKR8NBo#etvqW+p9aY7X6s%}X+U49~hqCn(4J>_t0Jqh(yNE*9+K#qKfvt=?pbLr2 zjml#bB{x|rQBqe0`-jq}tSlDY zjU1$0QMBc~V@ZBmfRgKmWl@S7+d&qZ8|!sw1vc(SUzS^#K^F{c)YB(!ve6S`_Sh@& zMm%wqGA4xUDVW-YRI|p+bwaO#4IRl^o!HnIuUdeAb5Fv*1a>Fyo+UQ|4&6=NqetUU z3+(Aa2GD_L4(U5A?}x9i1o0maYD#1NiZi7_@%a{&F@HsCO_p6viDGd`-f2bH(%9E) zjC0{P12bCENypAXV@3=0hy8E}>ns;d4oF!5r2Ocq2t5`xDbhfiOUgTod@WEykQSNB zbh#fpF~4qo<6F^0eN_6VJp6TIXt;98qmRyvw@f{urdsZbS54VuRK@df(2#+%(`L&h z25C4brG^9d2b@h{;n!h`yK$Mh>rMd6iDXSDoPJK^t~-&t?nLgo6S?b7fo% z-gg+VcVeqe|ETPt`Kfj%=<`+wvbfTGqH;+j5Qy;FgFoRgD#isxkw_66&5~=22UbW# z_V0izFM#-;XY~5wNfw$xw4zp_u*~cRCKk}^XXWM;VYUr`S{uqHluf_{`LvxwW(r%I z51D4N-C$D}o_(aH-v-js3!Sl}&1!iwjM@s6rBLKf4N1<-k!Hq%x!*)rTMa_lYn0w( z#nYPUXIPO4s%N0OT{%*R z#=XOkn4-gfJTI@rpPwHn$&(IM^OxjJo|XJ1JoAL>An}?!)8Mj;f{*By9ULjS`13 zbOkfjUpf2i#s?p7NZzo$0R;k0SzMt0s(vPjc4L#V6nbe`pAG?m1UQ5h|D(1*o~L)v zdO^xKC1YflG|FfW3u37Ie?6H_s0l5PyKD_GNIY#KCq z<^l{@(U(jKdzbI@eA3SRG&~TG`Qg%GiF|uB`0t=?u0uROQN56VF=O)wT4j ziIa4BPq6g35hIT)@-zn`{_N=RxgG6uhF9blSNJ*Sa(Nnf&9j(ujd)0N8fu|_Eff8a ziP+25=ehW?7W|Nje#k^WWTGE3(GQvEhfMTCCi+d8$Q4ChRj()p5<0X@i~xQSz#szn zMF77D;1>b>B7k26@QYaRivWI+luU$Xsu__5M|xS0w&q+oIVK%;^32lak@5Jb=2EL{ z^;b58N*XKtI8mkq$KCjivdZBNp-{uHO0$d=C!#)IG*MifDEIlw6VxFQ{w~ME_Hv62 zgpk%8j}k{^3ntSuW;fXOh84y|yM>WfTIZo&Ppyj)+Zl!0mr?*B-4^S>_9RYA=z=x~ zH|~L}XBXtp`Jnrxlcq}fv#D}gvX}>_AU6kR%KqB88*CtT<_dIB(?(NguB1g0!R|kE z!m=JCyi@&F^bIze;Oq1YGh3e-%G{mju6#a5ln+j+<07n`7V5_uzvLYI@Kf7r9+f9#!>WF~r}MZg3s-8Z#QB@9w#N308 zgFY)$77Q&~Z5wMmTGlTmHH}c7Jwf*@G#EghtyL*mm#+7efn2EfRAQ*w$3bl;ssg(Yxw zT?exVw5n>lsOzY|va#{(3mP6zZfRgKyJ0*2KB)c@Rt5$x`49G;e@*bIwKQ9En(--M?9Db*f<`> zsZz2L(mKP+u>OrVKi_AkU|%frjAM~mU4{(n!`G{9>qEg}r_)NozJC@@mQ}gHIFGp! zFd$6Ej9-QGWUcmas(s_qQ`6ci@Jn?^WLSn)-e{O;1W2Omzbcm1oue!^liE# zRB&blzSG%$4umNWp4EjwWtD$v+{5` z&O%W?V4O@FOPv8|k5`Y<$9+c~z+DquIcs|9f+a;|^Gln{GBcOzXWZAbq-=3G3k}P_ zh5LSuXJt6DFn%}aW>x>EY25`d02NSsuxv^0#ORDoW}7nZ)Y@6F$DDvV9Zkma+)};J2;XqM1ToefFk-w(BH`cc}#SJv0avU8|;2N3{Aop~}eAUhz zrbisZ(2gBQw2xUwW5|JnB&598QHR-bDLu^jVyy$DjB2s`5A=L#sZ0GX-6L)9z3S+= zBQp_cXS;-3tx(3rSlpz)uJr{uiu!mboecd&QAd`rX4H`bWF+tHm$A4GG}S+A(HIBf zQob#Dmt%;Ue^m78`P2WBK7aC-zi<8;Dwd~)(9#glyQPFnFO(e%LWD{s^%Vxi&~>3$ zc?o$~N!p3XQ8q-=8omI2+Ktmc$5S&`KT;YkbflO&xtZk}Q_fdUTfZeF@9GCu7uHj- zbbhFX>*)yiPQb!CKJ4N*fO9kG?0!eHf^(G>SIIoObU0W4gK&-=!d@!+BpmHLxG#W? z-dd$=rB9bD-*PZj))K@!q!0hGE-6Zmk#8Y2?=H##l?SPGhNtHu*F~3qh6od+5Ov^ow>7O$55LA3Mzt~n^f2s z#1b2Xnik94>DO)=qMe&|db>xTMQ$^3qMe~CRruW?wS1^1>NB>1$(V~9Sw5v1qQ-sX zv?J|c`|#)~*!=SGmiYG2h6A!b+LT!_Y?!aIscfS+9`TmNV&%sjH~i!o~ z?R)?DQd;}LR6D!3@4q|MzQ&EWa;5rtKGptIEnni{5UqWOjXm%)1+nVNt^Fco$3wd& zz@a~JKM^(P{ETG)^W`e!no_Z}X@IA1M(^lrhGL)UGaz)qP6gp1WR`(LJo91NEub@Z zbUGXj9BbRedPF83$31MyUT&P1>#fOz3|6>I7XXgG!g+jJ@vL4w zw0w{e1E}ydK!BEt-}8wwr6Xjbg*8})7#eMyYz&X5Dq6R4ri zOi!Dz=Z}r1`7=l-c_B%S8EcBRngOKSjXi+RM8FIB>X@IWwcnX)-#8w#b-(d_v_Go*|92Q&xF3m3(qX)wYTxKblx$yL-)CqK8lR-v z_g>MG5Cx+4uQITR5{LYcEQh&` zb~XVm42$XTju7skVn|*XNnv$Bq^fOlptB?Wlu!_qk4V$afSiK?y3Ht^gRpggQe$T& z7{_^>9>>r$g(i$?4Te5*5%8z&iu*7WEWv-aT|wQY7hJ^BpKb50sq@*ip02m>z}UZS zQKaWF(Abq1_0MHE38ruVdgB`{qt->WI0ohBm?o z@{cLiAhmH=rzt0}(2g@|4dAbwm$n`hEvV$19qhfga!_+7l7|6qy(TtI|;ysFt zsVx;Md+8tDD*!Enwy3#LTSw#^59F~9=C*c~==#!1ME`98o{!LPmSxs#{vgjd&#KG& zOh4E6CQjU@s$oQ4lh+LCdj#)yIv3hF?Yl?xy5bHHV=J{}W#ohQ+-Plxk$KE0(7EB3 zJ;L>2`Qd5ZS!zEeFzplWld^7GcczfF>0rR#r>%~nKj=%0&(;bj_opC-xkmy^0EZ#N zldMcXMF}HirpFh=E3Fm>LQU~o%ZJCj0p!nJ(l#d9cS`fAr^-)rYf6%j#5<2$kXu#E zT)Ok*>o{_=B$50fAm0eRV>@ht9E3dHtRbS_n_zMQZT0ShFIVXum>V?`j)+-3jFE=r zrle{CYB@^dw9lOT+nGM*#sp%E&@+_}TN~j+sWR$>y(5xbx{{=3%yZI1#-7`huPrHL3r~?Ci;CZ!Y6OF&03NQ|p)2L?5J{(BqJm zX%mWSpSH%+bC^%idLst4BW7RG+xo?LBF1zK0p}AiG1Utivv9_lDUCpF@1s+NjK7UP zdxl4yQ<^hfPi}ac6kM7%%ldQ)$hE5HdoSi&1YP+JVvsuuJTaR#4}AwT!kN2dVTUJd z@zfIK-SWV@g_M3Bq2d9P@xb8rz`Nyv%I<-8%LDJ02i`3Yyjysq54>AcLrKe6x9CZq zjzYND7SVqN9*ki%R2;F5alJ!Ez1)v}qqK$S;L-sM>8DGlb2$yTxW(R596Swrrz&?A zUHuHj1iQm-1Z?X2jB8-x)rc0U&Sk`T{6OqK8o|?wkz4++zdwSf7ud*A@pQd#URt$= zRIMphYcXqtBBDZ%v}2TW#tm_y^BZX0A~sRKkuU}%@?C2&?EJ>?M#320NEpK#31fI8 zVGM61jOn~To*0{QAM&f)Q<320y$|?t2aeP*JTgfFC`PN@I zVe<9z*m2tywzn_bhJY=Wr;oGZ{>(T(_w{2Y-mosRYiBX0!jokmfvx|ya_((uVlP9G z6zFO0B8fL7)2_rmj3I{`d#U zXYaT}B7ps^c*~+k=RdX7XiT;NN<;C^xcdMvo-t@fvTI+Fj=zUHM|q9(d4pP6rKiJ+ zSqh+TziVMY&dY$bVOvtC=e$rRYIhO69WWUIJ-UauWkRp;eUwZ=Tcr?t?RYr4M z&W^W8xQdeBmK_<}G1>IBKTM31Wtw|pwGyk~o+D9fRkd2w#;F>aE{$BpJ^#z`eJZy7 zzZ}Qci&sBeYkzdAHpZ-3l$RcfV6F6CEa?&OH)+4bf9s0>>jAt2IKY_tNz1yrmQAX+ z%7)nR8I6rIhR3Y(p5cSf>~XK(=$|u?B@A9RvA%xdvcX-t?6QA1A{HAlqkP?lV9%LD zI?h1w$p7K^pUc(%U&OH#OO0jnt41G`Y%_K<4;+Sh+Bqomps8Sm&;^)7Hj*B=AXlZU zS;p#q%GJMSJoCR^47U_BjD_m#q{9D(xX-kmSiB?)|CuKx~Id5^P&oLC^{8yxtvBqF| z9`+tQ7N7B`y&OhxBaThyv*;6~0MjGAckKh*bw_jXL! z>tW1w)6t8=A;@D&`(h}x*3FvGHWY2z2O$q3LL4@GHtrj)Y*SjKInD74K$*a_(w#)u{K9cf|18wbUEghDjB=t6s8=7mD&-mrxxo#`mLB7|Smm3eCk)NAWkQXTTja^gUh4tD-Foh*b&Km9 z85zZ8Bm9N#fXsG9!dqwNm6dqf%4cp3M_k!*@f~vY@8QP6-tn9A3i+RXzib8GFDt*K zUofkFYphnk^$<&d8w2zS8NQ2__Zs7^d+X(`;%3B&WLxL55_^p1$FFd5hWRU>dNnAL zQt?Wx%uK%zM-<=suFqZIe_#u4u9xSdj|1q#d}l&7`hb5U6-j9xAOp{s+fQNu^98U&Fx-$0)AzPgxoDB8!uo? zKK&*adJ9N@mYs+?IIeyJ1G%-ulXWhL-Y5ZelOJ1f&~!wH0bNi`-Z0?;BC603LhVOt zLdPWE*QMP3I_Gug7PG+E>gDwq8{y>>n}{JjHl3?XSz$#?b6oTqrH#pilf%A7UX-4LC@wJj^$(v5BFOY`JTqGg=k>JAYO0=8}Z`O zZ&$V~8{337$6z{`bO;KDYar&1Cb|8 z@`)fGW~FoDRRj%>vy!f>u9~zkQYEF5qSG1 zcvx4r1Mhj`fiUs9Kz&t#S;`E5#GB#Fn^b3(7+hQ5=SH1+A2oeU*AnLN6avD04--ZV zy5kN<#(g7Cr|aA z-Z#TB39-ZF*ePnjD>{dX_Xr0{pL}JfILRyUIV_^eR%axGz~J&x68mHc95f+CKM6}p zF}ByB>_j;TCEFWOMp3q-_{JxszDPr1%3ui!O6M zn4hC4t5EWR{LBaPem;;TA4IV_j6{Z)w1UPO9b^P}S!+jIAmRXr#|sc@JPv$W5%i$B zPNLP=Cp&sh9pgD>^ZYjB_S=p2d7F>%j5&3FhjH1hvTgQ;k)Dz3X0{lz)iY|t>{glF zn|#%1nYnJHJbwI{i@W3#PZ)z2oiW}s{)|O~jRgy2*WxoKcsyga%x{;;{c@bqF(2Kb z);@pB7(AkbVh1$Md?BH7qsuieU@@jZ;nHtz)S1#gl_R}1JvSP^FA%fEZ~n&b30qK> z$~zjJmTv@_5V5|8j29iP*k9{{$90}qsbwT+wi&(a0|1tzwh*jB!xJydhR(p{hc|+E z%V5NCy1EU#y%c=bzLPQP^QOI(A>QAgYBc6jqu>SXhzMjQ(u{%sLS#eW)??ld<~sbIvYzXqa`_6 zUB?{bGcpQe<>f>D{=DQLeWS;8Wx4bG{-M!mg(qWCe)gv9eDz08_6-?5zT&v~a^>9i zW4hbj%_pr{5})XpR&&axQ)*(%*PIZW;5epY?(xe8v&o2%>m zM8@~h)2UBZV5BbsY?YSCU|Q_w=+qQDi9pE`d=)rE;Yb%Hmll&6=>%2pH)XORUmoCz zxzgX4^!uq7$i?!7!gIqr3db$F*tqa`;u_7dyIcB|Ml~$O}WaC~yHI@J) zY^Y7tr}mfzq|JRnkT#x4}tKgE{5_2a}IH+CaL4)p(_xKHebf+<#45{QveueOPt>JNHDnXcNX3`ETa? z?#=fev||nH(@p3#(K}iVXlulxV`M<9@`3asfI!!fse<*5lZ5sof5tk011Eu{evqkN zKCd_KsG!#3_A59 zchaj9uCb0Wk*ut6*`4Yg^EvtMUDiA1ce(R()jQ_zEQ`3Z5IpIaZ@dGhAI6SivDkZq;a1FsV30DuUHMq9nx)7H>&5K@yS`L|KBUfF(E+WeLtiS%NcB zmgv}pt5CTU7vF?_g4qk^jIpjDmCuFTu}?>-RkCOj+NP@oG88r&tt3);2vi=$=b?(q zr=w*iCOZ?8U2L{O8XvJurp%sTQMqid;SsCBZb|zHy1LIgxF!g?R|nTP@k+tA)=uOp z!33>AMhiZ4RaG}hei3xc9l7p`*|Wa3wtLjtD`wBWV%^9|-VrmGcTFA?-JACnBga`X zd_wa2A*<((^zN=~zB#u#Sl8T=D2nBFI!h~J1v8c|oe`Vhkv+vFMZv4Klk{D zH8c&Eh50de(Cu0@ecIx9M1IMcd2DI8JiIqvb53LD{40+O>=yW{wEj*9h(1tIYw|=d zHF-KzXw}jjrd6wTd01u$4}^Wn3jkNn+Q1Jc4WDq*g+reEVBVMoXWlU6hsz&*blSz! z-jZ+QFSq{FV+Q^&Ug&>QywLx}0{s6!7Qlcn<$vQ@bq4&>LjDkEKbJweysqssazLF* z8AXkmYw*#7h0(jqcvgA`>5^b5Y7}*qt)Yx7Gb7E877j79J(QN&KH%8>0cW;H_!9{B zRK&4;M2%^}g?UF#A7N>0E6Ftubxa z_#>G&Z~0Q{byx>;GSwT8&Mk=+dHcN>%cwZKT*vOIcMZrrIOjMZ?$?l`G|?_J`^~vz z{?^_{7V3Ez72k?ShfXkM$);~^C{UXDO*R+?WWWsAoUr5Gbc8zmjDQ4Bjnql7^vdTz zCB}Pnjs!)QN6x+^ZT`J2N4yWra~KCv@I~f``!!C1Pq|neE9O8QTPMzhwsX0TVBIf9 z0|Gj#?_vn8ElQ2)!3~tUE5uTz&Md{ut1%YZ^P^E8jyl_>qnwVmEvU~$eJ<)NP+x`m zDzm-@^);yXpnW~+>&^R5L%jzxJzr%`egy+NUrFwZao=`)w;hVo*%;5oO6s4BF|J5` ze-UFSnbI^F7auynQ2=j03=-Nb^Tb)0!+voIS~e@OzZJEe>N~nuD^#!A_|UO$V}ONT zD0KQeIuUT-WQBDwDNfsj)4&7&Dtx7IvGR2Hc9yKdY;jf6esSTTYTyibtLP}=jgBI2 z+jh`^alyy!7hAI`}5LunZP;b{MC4E1Dw7 z7b4A--r_pEn_@^&qQXBWGZ4skxSRzpk1H$7VdP}zPOu<%P|zV4<%xGds&6r8ICls=p}fX--;r80%U`84DRl0B4?v8ayUmKnt;W(0?*40g!CuMydN!t9kLEI(_k2-0ce_t;?{@#DaDL%l&lJy#-c{Zkyg&05`sVs}_zwDu{Kxv& z`ET>T=Kn>&8Q2gwR5YmQlA=EZ7X)7@ju)R&{B+5nl9?sFp}f%M&?}|!(o;$gm9>_g zRrXl8D13VOmyw~7$0DzlPb)tQ|9u`kHTrSIHI<>tn_}Z*zl)z5zb^iVst2oUt9xtm zYU*pQtSzXWQhR#sFY5~HuBf}IZg<@ibk>wyAQ4JbCt4GW5<3!44JsQ{ zJE(ooV+|)ZeAakdQ?zMN)8MADP1Bo;nk$qhTAX6TrVG4U~D$NXaK z#Ietf8$RwUQ>IM$#nctkUQrk<5D#J@>VL>MHtXEc zm}Axrcvlvib)J*6!mRUiF-ab>rN3ha$1|4TcQhRH?(#xj*dBT&GKcd*GEq~?XS}8o+}YaL(u(_LH+KzgiB1|Di*~fMwzPE)&R?-|)0)-mR&E@MA1_;Xa&+vP zm77+c(z9~e##7d;TRn5->Mf@%+lWUrHa9m98)mgPm|qM-ryav)&unjKZ)|RCY3yho zGUUj6%pV`w+;_au+b0=UL6=U$0gf(KhScd5R_4s_6`mYfzl6N%X zoAqKXl!`9=*M`r7(b|f#MfJ%3W~1LOw6i`5=N`mRcBt=L@QY4-lMjro6r1pz)sQ+X z#YRNU=qE43=aW$%i|=^HN^uGVz)Fl}BWi2#?P@U-pI1WwoT6IwEE?5pnz1iBY{2~u zNBm-#InoZ?I~(7%s~uJLz*#h6tj%yz4EdY=^ndb^qdfAdYSR$;>gU04a(lYZ%9&yoU^WNdj(K>aMvqtk>RAN3IUbIYrNGDi;&ySaI8Pi9 zS3^~}L|i0p#A`Y35IdzI&JkY|7mKfp3#3E5D{g{!=r-|y_?CDH>-_}K)n%ZHZv(dn z#mnNm;uY~7@hZG9KM;q+_rycM_~qht@tXJ{=<`Bx5@_LM(BUbdh+9CBUlJQYA)7!I zo8h%N4R8549gd|l#FwGd>;)hAs`v`T{dVkz{7CE(55wBOOS~aI5O0aM#XI7C@uqlB zTrVEMNdZrYC&dfmF`VQ1O{f{qK@GW2yeOU)&xohQE^)KCMrPoo`fK3|xcc>(>=*Sh;b{`W4GpuG_qF +# Copyright © 2012-2021 Jamie Zawinski # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that @@ -23,7 +23,7 @@ require 5; use strict; my $progname = $0; $progname =~ s@.*/@@g; -my ($version) = ('$Revision: 1.8 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.11 $' =~ m/\s(\d[.\d]+)\s/s); my $verbose = 1; @@ -38,7 +38,8 @@ my %disable = ( 'webcollage' => 1, 'testx11' => 1, 'covid19' => 1, # Fuck you, Apple. - 'co____9' => 1, # Double-fuck you. + #'co____9' => 1, # Double-fuck you. + 'xscreensaver-getimage' => 1, ); # Parse specified variables from a Makefile. @@ -48,7 +49,7 @@ sub parse_makefile_vars($@) { my ($mf, @vars) = @_; - open (my $in, '<', $mf) || error ("$mf: $!"); + open (my $in, '<:utf8', $mf) || error ("$mf: $!"); print STDERR "$progname: reading $mf\n" if ($verbose > 1); local $/ = undef; # read entire file my $body = <$in>; @@ -89,6 +90,8 @@ sub build_h($) { } } + $names{'dnalogo'} = 1; # Not listed in GL_EXES + my @names = sort (keys %names); error ("too few names") if (@names < 100); @@ -112,27 +115,35 @@ sub build_h($) { sub line($$) { my ($s, $suf) = @_; - return "\t[NSValue valueWithPointer:&${s}_${suf}], @\"${s}\",\n"; + + my $xml_file = "../hacks/config/$s.xml"; + open (my $in, '<:utf8', $xml_file) || error ("$xml_file: $!"); + local $/ = undef; # read entire file + my $body = <$in>; + close $in; + my ($title) = ($body =~ m@]*?[ \t]_label=\"([^\"]+)\"@m); + error ("$xml_file: no title") unless $title; + + return "\t@\"${title}\":\t[NSValue valueWithPointer:&${s}_${suf}],\n"; } $body .= ("\n\n" . - "NSDictionary *make_function_table_dict(void)\n{\n" . - " return\n [NSDictionary dictionaryWithObjectsAndKeys:\n" . - "\n" . + "NSDictionary *make_function_table_dict(void) {\n" . + " return \@{\n" . "#if defined(APPLE2_ONLY)\n" . - " " . line('apple2', $suf) . + line('apple2', $suf) . "#elif defined(PHOSPHOR_ONLY)\n" . - " " . line('phosphor', $suf) . + line('phosphor', $suf) . "#elif defined(TESTX11_ONLY)\n" . - " " . line('testx11', $suf) . + line('testx11', $suf) . "#else\n"); foreach my $s (@names) { $body .= line($s, $suf); } $body .= ("#endif\n" . - "\tnil];\n" . + "\t};\n" . "}\n\n"); my $obody = ''; - if (open (my $in, '<', $outfile)) { + if (open (my $in, '<:utf8', $outfile)) { local $/ = undef; # read entire file $obody = <$in>; close $in; @@ -146,7 +157,7 @@ sub build_h($) { print STDERR "$progname: $outfile: unchanged\n" if ($verbose > 1); } else { my $file_tmp = "$outfile.tmp"; - open (my $out, '>', $file_tmp) || error ("$file_tmp: $!"); + open (my $out, '>:utf8', $file_tmp) || error ("$file_tmp: $!"); print $out $body || error ("$file_tmp: $!"); close $out || error ("$file_tmp: $!"); diff --git a/OSX/gallant19.bdf b/OSX/gallant19.bdf deleted file mode 100644 index 75b4fa64..00000000 --- a/OSX/gallant19.bdf +++ /dev/null @@ -1,13691 +0,0 @@ -STARTFONT 2.1 -COMMENT Copyright 2006 Sun Microsystems, Inc. All rights reserved. -COMMENT Use is subject to license terms. -COMMENT This is a derivation of a BDF font from the X consolidation -COMMENT Originally a BSD vfont. -COMMENT Re-built BDF and ISO10646-1 from hex code originally in -COMMENT illumos usr/src/uts/common/font/12x22.c -FONT -Sun-Gallant-Demi-R-Normal--19-190-72-72-C-120-ISO10646-1 -SIZE 19 72 72 -FONTBOUNDINGBOX 12 22 0 -5 -STARTPROPERTIES 18 -FONTNAME_REGISTRY "" -FOUNDRY "Sun" -FAMILY_NAME "Gallant" -WEIGHT_NAME "Demi" -SLANT "R" -SETWIDTH_NAME "Normal" -ADD_STYLE_NAME "" -PIXEL_SIZE 19 -POINT_SIZE 190 -RESOLUTION_X 72 -RESOLUTION_Y 72 -SPACING "C" -AVERAGE_WIDTH 120 -CHARSET_REGISTRY "ISO10646" -CHARSET_ENCODING "1" -FONT_ASCENT 17 -FONT_DESCENT 5 -DEFAULT_CHAR 65533 -ENDPROPERTIES -CHARS 471 -STARTCHAR char0 -ENCODING 0 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -76E0 -76E0 -6060 -6060 -0000 -0000 -6060 -6060 -6060 -0000 -0000 -6060 -6060 -76E0 -76E0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR space -ENCODING 32 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR exclam -ENCODING 33 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0000 -0000 -0600 -0600 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR quotedbl -ENCODING 34 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1980 -1980 -1980 -1980 -1980 -1980 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR numbersign -ENCODING 35 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0330 -0330 -0330 -0660 -1FF0 -1FF0 -0CC0 -0CC0 -1980 -1980 -7FC0 -7FC0 -3300 -6600 -6600 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR dollar -ENCODING 36 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0600 -1F80 -3FC0 -66E0 -6660 -6600 -3E00 -1F80 -07C0 -0660 -0660 -6660 -7FC0 -3F80 -0600 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR percent -ENCODING 37 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -38C0 -4CC0 -4580 -6580 -3B00 -0300 -0600 -0600 -0C00 -0DC0 -1A60 -1A20 -3320 -31C0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ampersand -ENCODING 38 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0700 -0F80 -18C0 -18C0 -18C0 -0F80 -1E00 -3E00 -7700 -6360 -61E0 -61C0 -6180 -3FE0 -1E60 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR quotesingle -ENCODING 39 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0C00 -1E00 -1E00 -0600 -0600 -0C00 -1800 -1000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR parenleft -ENCODING 40 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0180 -0300 -0600 -0600 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0600 -0600 -0300 -0180 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR parenright -ENCODING 41 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1800 -0C00 -0600 -0600 -0300 -0300 -0300 -0300 -0300 -0300 -0300 -0600 -0600 -0C00 -1800 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR asterisk -ENCODING 42 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0F00 -0600 -6660 -76E0 -1980 -0000 -1980 -76E0 -6660 -0600 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR plus -ENCODING 43 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0600 -0600 -0600 -0600 -7FE0 -7FE0 -0600 -0600 -0600 -0600 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR comma -ENCODING 44 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0C00 -1E00 -1E00 -0600 -0600 -0C00 -1800 -1000 -ENDCHAR -STARTCHAR hyphen -ENCODING 45 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -7FE0 -7FE0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR period -ENCODING 46 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0C00 -1E00 -1E00 -0C00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR slash -ENCODING 47 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0060 -00C0 -00C0 -0180 -0180 -0300 -0300 -0600 -0600 -0C00 -0C00 -1800 -1800 -3000 -3000 -6000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR zero -ENCODING 48 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0700 -0F80 -1180 -10C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -3080 -1880 -1F00 -0E00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR one -ENCODING 49 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0200 -0600 -0E00 -1E00 -3600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -3FC0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR two -ENCODING 50 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1F00 -3F80 -61C0 -40C0 -00C0 -00C0 -00C0 -0180 -0300 -0600 -0C00 -1800 -3020 -7FE0 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR three -ENCODING 51 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0F80 -1FC0 -20E0 -4060 -0060 -00E0 -07C0 -0FC0 -00E0 -0060 -0060 -4060 -6040 -3F80 -1F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR four -ENCODING 52 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0180 -0380 -0380 -0580 -0580 -0980 -0980 -1180 -1180 -2180 -3FE0 -7FE0 -0180 -0180 -0180 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR five -ENCODING 53 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0FC0 -0FC0 -1000 -1000 -2000 -3F80 -31C0 -00E0 -0060 -0060 -0060 -4060 -6060 -30C0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR six -ENCODING 54 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0700 -0C00 -1800 -3000 -3000 -6000 -6780 -6FC0 -70E0 -6060 -6060 -6060 -7040 -3F80 -1F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR seven -ENCODING 55 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1FE0 -3FE0 -6040 -0040 -00C0 -0080 -0080 -0180 -0100 -0100 -0300 -0200 -0200 -0600 -0400 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR eight -ENCODING 56 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0F00 -1180 -30C0 -30C0 -30C0 -1880 -0D00 -0600 -0B00 -1180 -30C0 -30C0 -30C0 -1880 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR nine -ENCODING 57 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0F80 -11C0 -20E0 -6060 -6060 -6060 -70E0 -3F60 -1E60 -0060 -00C0 -00C0 -0180 -0700 -3C00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR colon -ENCODING 58 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0C00 -1E00 -1E00 -0C00 -0000 -0000 -0C00 -1E00 -1E00 -0C00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR semicolon -ENCODING 59 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0C00 -1E00 -1E00 -0C00 -0000 -0000 -0C00 -1E00 -1E00 -0600 -0600 -0C00 -1800 -1000 -ENDCHAR -STARTCHAR less -ENCODING 60 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0060 -01C0 -0700 -1C00 -7000 -7000 -1C00 -0700 -01C0 -0060 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR equal -ENCODING 61 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -7FE0 -7FE0 -0000 -0000 -7FE0 -7FE0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR greater -ENCODING 62 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -6000 -3800 -0E00 -0380 -00E0 -00E0 -0380 -0E00 -3800 -6000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR question -ENCODING 63 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0F00 -1F80 -39C0 -20C0 -00C0 -00C0 -0180 -0300 -0600 -0C00 -0C00 -0000 -0000 -0C00 -0C00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR at -ENCODING 64 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0F80 -3FC0 -3060 -6060 -6720 -6FA0 -6CA0 -6CA0 -67E0 -6000 -3000 -3FE0 -0FE0 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR A -ENCODING 65 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0600 -0600 -0B00 -0B00 -0900 -1180 -1180 -1080 -3FC0 -20C0 -2040 -4060 -4060 -E0F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR B -ENCODING 66 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -FF00 -6080 -60C0 -60C0 -60C0 -6180 -7F80 -60C0 -6060 -6060 -6060 -6060 -60C0 -FF80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR C -ENCODING 67 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0FC0 -1060 -2020 -2000 -6000 -6000 -6000 -6000 -6000 -6000 -2000 -3020 -1840 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR D -ENCODING 68 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -FF00 -61C0 -60C0 -6060 -6060 -6060 -6060 -6060 -6060 -6060 -6060 -6040 -6180 -FE00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR E -ENCODING 69 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -7FC0 -3040 -3040 -3000 -3000 -3080 -3F80 -3080 -3000 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR F -ENCODING 70 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -7FC0 -3040 -3040 -3000 -3000 -3080 -3F80 -3080 -3000 -3000 -3000 -3000 -3000 -7800 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR G -ENCODING 71 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0FC0 -1060 -2020 -2000 -6000 -6000 -6000 -6000 -61F0 -6060 -2060 -3060 -1860 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR H -ENCODING 72 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -F0F0 -6060 -6060 -6060 -6060 -6060 -7FE0 -6060 -6060 -6060 -6060 -6060 -6060 -F0F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR I -ENCODING 73 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1F80 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR J -ENCODING 74 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1F80 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0400 -3800 -3000 -ENDCHAR -STARTCHAR K -ENCODING 75 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -F0E0 -6180 -6300 -6600 -6C00 -7800 -7800 -7C00 -6E00 -6700 -6380 -61C0 -60E0 -F070 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR L -ENCODING 76 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -7800 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR M -ENCODING 77 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -E070 -60E0 -70E0 -70E0 -70E0 -5960 -5960 -5960 -4D60 -4E60 -4E60 -4460 -4460 -E4F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR N -ENCODING 78 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -C070 -6020 -7020 -7820 -5820 -4C20 -4620 -4720 -4320 -41A0 -40E0 -40E0 -4060 -E030 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR O -ENCODING 79 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0F00 -11C0 -20C0 -2060 -6060 -6060 -6060 -6060 -6060 -6060 -2040 -3040 -1880 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR P -ENCODING 80 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -7F80 -30C0 -3060 -3060 -3060 -30C0 -3780 -3000 -3000 -3000 -3000 -3000 -3000 -7800 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Q -ENCODING 81 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0F00 -11C0 -20C0 -2060 -6060 -6060 -6060 -6060 -6060 -6060 -3040 -3840 -1F80 -0E00 -1F00 -2390 -01E0 -0000 -0000 -ENDCHAR -STARTCHAR R -ENCODING 82 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -FF00 -6180 -60C0 -60C0 -60C0 -6080 -7F00 -7C00 -6E00 -6700 -6380 -61C0 -60E0 -F070 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR S -ENCODING 83 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1FE0 -3060 -6020 -6020 -7000 -3C00 -1E00 -0780 -01C0 -00E0 -4060 -4060 -60C0 -7F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR T -ENCODING 84 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -7FE0 -4620 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR U -ENCODING 85 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -F070 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -7040 -3FC0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR V -ENCODING 86 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -E0E0 -6040 -3080 -3080 -3080 -1900 -1900 -1900 -0A00 -0E00 -0E00 -0400 -0400 -0400 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR W -ENCODING 87 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -FEF0 -6620 -6620 -6620 -7620 -7740 -3340 -3740 -3BC0 -3B80 -1980 -1980 -1980 -1980 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR X -ENCODING 88 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -F070 -6020 -3040 -3880 -1880 -0D00 -0600 -0600 -0B00 -1180 -11C0 -20C0 -4060 -E0F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Y -ENCODING 89 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -F070 -6020 -3040 -1880 -1880 -0D00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Z -ENCODING 90 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -3FE0 -20C0 -00C0 -0180 -0180 -0300 -0300 -0600 -0600 -0C00 -0C00 -1800 -1820 -3FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR bracketleft -ENCODING 91 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0F80 -0F80 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0F80 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR backslash -ENCODING 92 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -6000 -3000 -3000 -1800 -1800 -0C00 -0C00 -0600 -0600 -0300 -0300 -0180 -0180 -00C0 -00C0 -0060 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR bracketright -ENCODING 93 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1F00 -1F00 -0300 -0300 -0300 -0300 -0300 -0300 -0300 -0300 -0300 -0300 -0300 -1F00 -1F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR asciicircum -ENCODING 94 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0400 -0E00 -1B00 -3180 -60C0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR underscore -ENCODING 95 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -FFF0 -0000 -0000 -ENDCHAR -STARTCHAR grave -ENCODING 96 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0100 -0300 -0600 -0600 -0780 -0780 -0300 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR a -ENCODING 97 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0F80 -18C0 -10C0 -03C0 -1CC0 -30C0 -30C0 -30C0 -39C0 -1EE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR b -ENCODING 98 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -2000 -6000 -E000 -6000 -6000 -6780 -6FC0 -70E0 -6060 -6060 -6060 -6060 -7060 -78C0 -4F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR c -ENCODING 99 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -1F80 -31C0 -20C0 -6000 -6000 -6000 -6000 -7040 -30C0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR d -ENCODING 100 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0060 -00E0 -0060 -0060 -0060 -0F60 -31E0 -20E0 -6060 -6060 -6060 -6060 -70E0 -3960 -1E70 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR e -ENCODING 101 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0F00 -30C0 -6060 -6060 -7FE0 -6000 -6000 -3000 -1860 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR f -ENCODING 102 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0380 -04C0 -04C0 -0C00 -0C00 -0C00 -0C00 -3F80 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -1E00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR g -ENCODING 103 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -1F20 -31E0 -60C0 -60C0 -60C0 -3180 -3F00 -6000 -7FC0 -3FE0 -2060 -4020 -4020 -7FC0 -3F80 -ENDCHAR -STARTCHAR h -ENCODING 104 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1000 -3000 -7000 -3000 -3000 -3780 -39C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -79E0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR i -ENCODING 105 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0600 -0600 -0000 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR j -ENCODING 106 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -00C0 -00C0 -0000 -0000 -03C0 -00C0 -00C0 -00C0 -00C0 -00C0 -00C0 -00C0 -00C0 -00C0 -20C0 -30C0 -3880 -1F00 -0E00 -ENDCHAR -STARTCHAR k -ENCODING 107 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -6000 -E000 -6000 -6000 -6000 -61C0 -6300 -6600 -7C00 -7800 -7C00 -6E00 -6700 -6380 -F1E0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR l -ENCODING 108 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR m -ENCODING 109 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -DDC0 -6EE0 -6660 -6660 -6660 -6660 -6660 -6660 -6660 -EF70 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR n -ENCODING 110 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -2780 -79C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -79E0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR o -ENCODING 111 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0F80 -11C0 -20E0 -6060 -6060 -6060 -6060 -7040 -3880 -1F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR p -ENCODING 112 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -EF80 -71C0 -60E0 -6060 -6060 -6060 -6060 -6040 -7080 -7F00 -6000 -6000 -6000 -6000 -F000 -ENDCHAR -STARTCHAR q -ENCODING 113 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0F20 -11E0 -20E0 -6060 -6060 -6060 -6060 -7060 -38E0 -1FE0 -0060 -0060 -0060 -0060 -00F0 -ENDCHAR -STARTCHAR r -ENCODING 114 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -7380 -34C0 -38C0 -3000 -3000 -3000 -3000 -3000 -3000 -7800 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR s -ENCODING 115 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -1FC0 -30C0 -3040 -3800 -1E00 -0780 -01C0 -20C0 -30C0 -3F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR t -ENCODING 116 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0400 -0400 -0C00 -7FC0 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0C20 -0E40 -0780 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR u -ENCODING 117 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -79E0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -39C0 -1E60 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR v -ENCODING 118 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -F070 -6020 -3040 -3040 -1880 -1880 -0D00 -0D00 -0600 -0600 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR w -ENCODING 119 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FF70 -6620 -6620 -6620 -3740 -3B40 -3B40 -1980 -1980 -1980 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR x -ENCODING 120 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -F8F0 -7040 -3880 -1D00 -0E00 -0700 -0B80 -11C0 -20E0 -F1F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR y -ENCODING 121 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -F0F0 -6020 -3040 -3040 -1880 -1880 -0D00 -0D00 -0600 -0600 -0400 -0C00 -0800 -7800 -7000 -ENDCHAR -STARTCHAR z -ENCODING 122 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -7FE0 -60E0 -41C0 -0380 -0700 -0E00 -1C00 -3820 -7060 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR braceleft -ENCODING 123 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0380 -0600 -0600 -0600 -0600 -0600 -0C00 -3800 -0C00 -0600 -0600 -0600 -0600 -0600 -0380 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR bar -ENCODING 124 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR braceright -ENCODING 125 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1C00 -0600 -0600 -0600 -0600 -0600 -0300 -01C0 -0300 -0600 -0600 -0600 -0600 -0600 -1C00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR asciitilde -ENCODING 126 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -1C20 -3E60 -67C0 -4380 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR nbspace -ENCODING 160 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR exclamdown -ENCODING 161 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0600 -0600 -0000 -0000 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR cent -ENCODING 162 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0600 -0600 -1F80 -36C0 -26C0 -6600 -6600 -6600 -6600 -7640 -36C0 -1F80 -0600 -0600 -0000 -0000 -0000 -ENDCHAR -STARTCHAR sterling -ENCODING 163 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0F80 -1CC0 -18C0 -1800 -1800 -1800 -7E00 -7E00 -1800 -1800 -1800 -1800 -3E20 -7FE0 -61C0 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR currency -ENCODING 164 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -6060 -2F40 -1F80 -30C0 -30C0 -30C0 -30C0 -1F80 -2F40 -6060 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR yen -ENCODING 165 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -6060 -6060 -30C0 -1980 -1980 -0F00 -0600 -0600 -1F80 -1F80 -0600 -0600 -0600 -0600 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR brokenbar -ENCODING 166 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0000 -0000 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR section -ENCODING 167 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1F00 -3180 -3180 -3000 -3000 -1F00 -3180 -3180 -1F00 -0180 -0180 -3180 -3180 -1F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR dieresis -ENCODING 168 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -1980 -1980 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR copyright -ENCODING 169 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -1F80 -2040 -4F20 -59A0 -5820 -5820 -59A0 -4F20 -2040 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ordfeminine -ENCODING 170 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1F00 -3180 -0180 -0780 -1980 -3180 -3180 -3380 -1DC0 -0000 -3FC0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR guillemotleft -ENCODING 171 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0660 -0CC0 -1980 -3300 -6600 -3300 -1980 -0CC0 -0660 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR logicalnot -ENCODING 172 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -3FC0 -3FC0 -00C0 -00C0 -00C0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR softhyphen -ENCODING 173 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -7FE0 -7FE0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR registered -ENCODING 174 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -1F80 -2040 -5F20 -59A0 -59A0 -5F20 -59A0 -59A0 -2040 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR macron -ENCODING 175 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -1F80 -1F80 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR degree -ENCODING 176 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0F00 -1980 -1980 -1980 -0F00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR plusminus -ENCODING 177 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0600 -0600 -0600 -0600 -7FE0 -7FE0 -0600 -0600 -0600 -0600 -0000 -7FE0 -7FE0 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR twosuperior -ENCODING 178 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0F00 -1F80 -3180 -2180 -0300 -0600 -0C00 -1840 -3FC0 -3FC0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR threesuperior -ENCODING 179 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0F00 -1B80 -2180 -0180 -0F00 -0380 -0180 -3180 -3F80 -1F00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR acute -ENCODING 180 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0300 -0600 -0C00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR mu -ENCODING 181 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -39C0 -36E0 -3000 -3000 -6000 -0000 -0000 -ENDCHAR -STARTCHAR paragraph -ENCODING 182 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1FF0 -3CC0 -7CC0 -7CC0 -7CC0 -3CC0 -1CC0 -0CC0 -0CC0 -0CC0 -0CC0 -0CC0 -0CC0 -1CE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR periodcentered -ENCODING 183 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0600 -0F00 -0F00 -0600 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR cedilla -ENCODING 184 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR onesuperior -ENCODING 185 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0200 -0600 -0E00 -1600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ordmasculine -ENCODING 186 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0700 -1980 -10C0 -30C0 -30C0 -30C0 -3080 -1980 -0E00 -0000 -3FC0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR guillemotright -ENCODING 187 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -6600 -3300 -1980 -0CC0 -0660 -0CC0 -1980 -3300 -6600 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR onequarter -ENCODING 188 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1000 -3000 -1000 -1040 -1080 -1100 -3A40 -04C0 -0940 -1240 -2440 -47E0 -0040 -0040 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR onehalf -ENCODING 189 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1000 -3000 -1000 -1040 -1080 -1100 -3A00 -05C0 -0A20 -1020 -20C0 -4100 -0200 -03E0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR threequarters -ENCODING 190 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -3800 -4400 -0400 -1840 -0480 -4500 -3A40 -04C0 -0940 -1240 -2440 -47E0 -0040 -0040 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR questiondown -ENCODING 191 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0300 -0300 -0000 -0000 -0300 -0300 -0600 -0C00 -1800 -3000 -3000 -3040 -39C0 -1F80 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Agrave -ENCODING 192 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0C00 -0600 -0300 -0000 -0600 -0600 -0B00 -0B00 -1980 -1180 -3FC0 -20C0 -6060 -4060 -E0F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Aacute -ENCODING 193 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0300 -0600 -0C00 -0000 -0600 -0600 -0B00 -0B00 -1980 -1180 -3FC0 -20C0 -6060 -4060 -E0F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Acircumflex -ENCODING 194 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0600 -0F00 -1980 -0000 -0600 -0600 -0B00 -0B00 -1980 -1180 -3FC0 -20C0 -6060 -4060 -E0F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Atilde -ENCODING 195 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1C40 -3FC0 -2380 -0000 -0600 -0600 -0B00 -0B00 -1980 -1180 -3FC0 -20C0 -6060 -4060 -E0F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Adieresis -ENCODING 196 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1980 -1980 -0000 -0400 -0600 -0600 -0B00 -0B00 -1980 -1180 -3FC0 -20C0 -6060 -4060 -E0F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Aring -ENCODING 197 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0F00 -1980 -0F00 -0400 -0600 -0600 -0B00 -0B00 -1980 -1180 -3FC0 -20C0 -6060 -4060 -E0F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR AE -ENCODING 198 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -03F0 -0710 -0710 -0B00 -0B00 -0B20 -13E0 -1320 -3F00 -2300 -2300 -4310 -4310 -E7F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ccedilla -ENCODING 199 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0FC0 -1060 -2020 -2000 -6000 -6000 -6000 -6000 -6000 -6000 -2000 -3020 -1840 -0F80 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR Egrave -ENCODING 200 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0C00 -0600 -0100 -7FE0 -3020 -3000 -3000 -3080 -3F80 -3080 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Eacute -ENCODING 201 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0300 -0600 -0800 -7FE0 -3020 -3000 -3000 -3080 -3F80 -3080 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ecircumflex -ENCODING 202 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0700 -0D80 -0000 -7FE0 -3020 -3000 -3000 -3080 -3F80 -3080 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Edieresis -ENCODING 203 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1980 -1980 -0000 -7FE0 -3020 -3000 -3000 -3080 -3F80 -3080 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Igrave -ENCODING 204 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1800 -0C00 -0200 -1F80 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Iacute -ENCODING 205 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0180 -0300 -0400 -1F80 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Icircumflex -ENCODING 206 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0600 -0F00 -1980 -0000 -1F80 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Idieresis -ENCODING 207 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1980 -1980 -0000 -1F80 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Eth -ENCODING 208 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -7F00 -31C0 -30C0 -3060 -3060 -3060 -FC60 -FC60 -3060 -3060 -3060 -3040 -3180 -7E00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ntilde -ENCODING 209 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1C40 -3FC0 -2380 -C070 -6020 -7020 -7820 -5C20 -4E20 -4720 -43A0 -41E0 -40E0 -4060 -E030 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ograve -ENCODING 210 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0C00 -0600 -0100 -0F80 -11C0 -20C0 -2060 -6060 -6060 -6060 -6060 -2040 -3040 -1880 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Oacute -ENCODING 211 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0180 -0300 -0400 -0F80 -11C0 -20C0 -2060 -6060 -6060 -6060 -6060 -2040 -3040 -1880 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ocircumflex -ENCODING 212 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0600 -0900 -1080 -0F00 -11C0 -20C0 -2060 -6060 -6060 -6060 -6060 -2040 -3040 -1880 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Otilde -ENCODING 213 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1C60 -3FC0 -2280 -0F80 -11C0 -20C0 -2060 -6060 -6060 -6060 -6060 -2040 -3040 -1880 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Odieresis -ENCODING 214 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1980 -1980 -0000 -0F80 -11C0 -20C0 -2060 -6060 -6060 -6060 -6060 -2040 -3040 -1880 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR multiply -ENCODING 215 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -6060 -30C0 -1980 -0F00 -0600 -0F00 -1980 -30C0 -6060 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Oslash -ENCODING 216 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0080 -0F80 -11C0 -21C0 -2260 -6260 -6260 -6460 -6460 -6460 -2840 -3840 -1880 -1F00 -1000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ugrave -ENCODING 217 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0C00 -0600 -E330 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -7040 -3FC0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Uacute -ENCODING 218 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0180 -0300 -E630 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -7040 -3FC0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ucircumflex -ENCODING 219 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0700 -0D80 -E8B0 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -7040 -3FC0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Udieresis -ENCODING 220 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1980 -1980 -E030 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -7040 -3FC0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Yacute -ENCODING 221 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0180 -0300 -E670 -6020 -3040 -1880 -0D00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Thorn -ENCODING 222 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -7800 -3000 -3F80 -30C0 -3060 -3060 -3060 -30C0 -3F80 -3000 -3000 -3000 -3000 -3000 -7800 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR germandbls -ENCODING 223 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0F00 -1980 -30C0 -30C0 -30C0 -3180 -3780 -3180 -30C0 -30C0 -30C0 -30C0 -3180 -7700 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR agrave -ENCODING 224 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0C00 -0600 -0300 -0000 -0F80 -18C0 -10C0 -03C0 -1CC0 -30C0 -30C0 -30C0 -39C0 -1EE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR aacute -ENCODING 225 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0180 -0300 -0600 -0000 -0F80 -18C0 -10C0 -03C0 -1CC0 -30C0 -30C0 -30C0 -39C0 -1EE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR acircumflex -ENCODING 226 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0200 -0700 -0D80 -18C0 -0000 -0F80 -18C0 -10C0 -03C0 -1CC0 -30C0 -30C0 -30C0 -39C0 -1EE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR atilde -ENCODING 227 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0E40 -1FC0 -1380 -0000 -0000 -0F80 -18C0 -10C0 -03C0 -1CC0 -30C0 -30C0 -30C0 -39C0 -1EE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR adieresis -ENCODING 228 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1980 -1980 -0000 -0000 -0F80 -18C0 -10C0 -03C0 -1CC0 -30C0 -30C0 -30C0 -39C0 -1EE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR aring -ENCODING 229 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0700 -0D80 -0D80 -0700 -0000 -0F80 -18C0 -10C0 -03C0 -1CC0 -30C0 -30C0 -30C0 -39C0 -1EE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ae -ENCODING 230 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -3DE0 -6630 -4630 -0630 -3FF0 -6600 -C600 -C600 -E730 -7DE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ccedilla -ENCODING 231 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -1F80 -31C0 -20C0 -6000 -6000 -6000 -6000 -7040 -30C0 -1F80 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR egrave -ENCODING 232 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0C00 -0600 -0300 -0000 -0F00 -30C0 -6060 -6060 -7FE0 -6000 -6000 -3000 -1860 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR eacute -ENCODING 233 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0180 -0300 -0600 -0000 -0F00 -30C0 -6060 -6060 -7FE0 -6000 -6000 -3000 -1860 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ecircumflex -ENCODING 234 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0200 -0700 -0D80 -18C0 -0000 -0F00 -30C0 -6060 -6060 -7FE0 -6000 -6000 -3000 -1860 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR edieresis -ENCODING 235 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1980 -1980 -0000 -0000 -0F00 -30C0 -6060 -6060 -7FE0 -6000 -6000 -3000 -1860 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR igrave -ENCODING 236 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1800 -0C00 -0600 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR iacute -ENCODING 237 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0180 -0300 -0600 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR icircumflex -ENCODING 238 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0400 -0E00 -1B00 -3180 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR idieresis -ENCODING 239 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1980 -1980 -0000 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR eth -ENCODING 240 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1C00 -06C0 -0300 -0D80 -00C0 -00C0 -0060 -0F60 -18E0 -3060 -3060 -3060 -3060 -18C0 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ntilde -ENCODING 241 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1C40 -3FC0 -2380 -0000 -0000 -2780 -79C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -79E0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ograve -ENCODING 242 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0C00 -0600 -0300 -0000 -0F80 -11C0 -20E0 -6060 -6060 -6060 -6060 -7040 -3880 -1F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR oacute -ENCODING 243 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0180 -0300 -0600 -0000 -0F80 -11C0 -20E0 -6060 -6060 -6060 -6060 -7040 -3880 -1F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ocircumflex -ENCODING 244 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0200 -0700 -0D80 -18C0 -0000 -0F80 -11C0 -20E0 -6060 -6060 -6060 -6060 -7040 -3880 -1F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR otilde -ENCODING 245 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1C40 -3FC0 -2380 -0000 -0000 -0F80 -11C0 -20E0 -6060 -6060 -6060 -6060 -7040 -3880 -1F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR odieresis -ENCODING 246 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1980 -1980 -0000 -0000 -0F80 -11C0 -20E0 -6060 -6060 -6060 -6060 -7040 -3880 -1F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR divide -ENCODING 247 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0600 -0600 -0000 -0000 -7FE0 -7FE0 -0000 -0000 -0600 -0600 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR oslash -ENCODING 248 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0010 -0FA0 -11C0 -20E0 -6160 -6260 -6460 -6860 -7040 -3880 -5F00 -8000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ugrave -ENCODING 249 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1800 -0C00 -0600 -0000 -79E0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -39C0 -1E60 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR uacute -ENCODING 250 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0180 -0300 -0600 -0000 -79E0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -39C0 -1E60 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ucircumflex -ENCODING 251 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0200 -0700 -0D80 -18C0 -0000 -79E0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -39C0 -1E60 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR udieresis -ENCODING 252 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1980 -1980 -0000 -0000 -79E0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -39C0 -1E60 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR yacute -ENCODING 253 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0180 -0300 -0600 -0000 -F0F0 -6020 -3040 -3040 -1880 -1880 -0D00 -0D00 -0600 -0600 -0400 -0C00 -0800 -7800 -7000 -ENDCHAR -STARTCHAR thorn -ENCODING 254 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -7800 -3000 -3000 -3F80 -30C0 -3060 -3060 -30C0 -3F80 -3000 -3000 -3000 -3000 -3000 -7800 -ENDCHAR -STARTCHAR ydieresis -ENCODING 255 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1980 -1980 -0000 -0000 -F0F0 -6020 -3040 -3040 -1880 -1880 -0D00 -0D00 -0600 -0600 -0400 -0C00 -0800 -7800 -7000 -ENDCHAR -STARTCHAR Amacron -ENCODING 256 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -1F80 -1F80 -0000 -0600 -0600 -0B00 -0B00 -0900 -1180 -1180 -1080 -3FC0 -20C0 -2040 -4060 -4060 -E0F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR amacron -ENCODING 257 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0FC0 -0FC0 -0000 -0000 -0F80 -18C0 -10C0 -03C0 -1CC0 -30C0 -30C0 -30C0 -39C0 -1EE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Abreve -ENCODING 258 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -1B00 -1B00 -0E00 -0600 -0600 -0B00 -0B00 -0900 -1180 -1180 -1080 -3FC0 -20C0 -2040 -4060 -4060 -E0F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR abreve -ENCODING 259 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0D80 -0D80 -0700 -0000 -0000 -0F80 -18C0 -10C0 -03C0 -1CC0 -30C0 -30C0 -30C0 -39C0 -1EE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Aogonek -ENCODING 260 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0600 -0600 -0B00 -0B00 -0900 -1180 -1180 -1080 -3FC0 -20C0 -2040 -4060 -4060 -E0F0 -00C0 -0180 -0300 -01E0 -0000 -ENDCHAR -STARTCHAR aogonek -ENCODING 261 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0F80 -18C0 -10C0 -03C0 -1CC0 -30C0 -30C0 -30C0 -39C0 -1EE0 -00C0 -0180 -0300 -01E0 -0000 -ENDCHAR -STARTCHAR Cacute -ENCODING 262 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0300 -0600 -0C00 -0FC0 -1060 -2020 -2000 -6000 -6000 -6000 -6000 -6000 -6000 -2000 -3020 -1840 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR cacute -ENCODING 263 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0300 -0600 -0C00 -0000 -1F80 -31C0 -20C0 -6000 -6000 -6000 -6000 -7040 -30C0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ccircumflex -ENCODING 264 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0700 -0D80 -0000 -0FC0 -1060 -2020 -2000 -6000 -6000 -6000 -6000 -6000 -6000 -2000 -3020 -1840 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ccircumflex -ENCODING 265 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0400 -0E00 -1B00 -3180 -0000 -1F80 -31C0 -20C0 -6000 -6000 -6000 -6000 -7040 -30C0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Cdotaccent -ENCODING 266 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0000 -0FC0 -1060 -2020 -2000 -6000 -6000 -6000 -6000 -6000 -6000 -2000 -3020 -1840 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR cdotaccent -ENCODING 267 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0600 -0600 -0000 -1F80 -31C0 -20C0 -6000 -6000 -6000 -6000 -7040 -30C0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ccaron -ENCODING 268 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -18C0 -0D80 -0700 -0FC0 -1060 -2020 -2000 -6000 -6000 -6000 -6000 -6000 -6000 -2000 -3020 -1840 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ccaron -ENCODING 269 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -3180 -1B00 -0E00 -0400 -0000 -1F80 -31C0 -20C0 -6000 -6000 -6000 -6000 -7040 -30C0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Dcaron -ENCODING 270 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -3180 -1B00 -0E00 -FF00 -61C0 -60C0 -6060 -6060 -6060 -6060 -6060 -6060 -6060 -6060 -6040 -6180 -FE00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR dcaron -ENCODING 271 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -3180 -1B00 -0E60 -04E0 -0060 -0060 -0060 -0F60 -31E0 -20E0 -6060 -6060 -6060 -6060 -70E0 -3960 -1E70 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Dstroke -ENCODING 272 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -FF00 -61C0 -60C0 -6060 -6060 -6060 -FC60 -6060 -6060 -6060 -6060 -6040 -6180 -FE00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR dstroke -ENCODING 273 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0060 -00E0 -0060 -07F0 -0060 -0F60 -31E0 -20E0 -6060 -6060 -6060 -6060 -70E0 -3960 -1E70 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Emacron -ENCODING 274 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -1F80 -1F80 -0000 -7FC0 -3040 -3040 -3000 -3000 -3080 -3F80 -3080 -3000 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR emacron -ENCODING 275 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1F80 -1F80 -0000 -0000 -0F00 -30C0 -6060 -6060 -7FE0 -6000 -6000 -3000 -1860 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ebreve -ENCODING 276 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0D80 -0D80 -0700 -7FC0 -3040 -3040 -3000 -3000 -3080 -3F80 -3080 -3000 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ebreve -ENCODING 277 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0D80 -0D80 -0700 -0000 -0000 -0F00 -30C0 -6060 -6060 -7FE0 -6000 -6000 -3000 -1860 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Edotaccent -ENCODING 278 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0000 -7FC0 -3040 -3040 -3000 -3000 -3080 -3F80 -3080 -3000 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR edotaccent -ENCODING 279 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0600 -0600 -0000 -0F00 -30C0 -6060 -6060 -7FE0 -6000 -6000 -3000 -1860 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Eogonek -ENCODING 280 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -7FC0 -3040 -3040 -3000 -3000 -3080 -3F80 -3080 -3000 -3000 -3000 -3020 -3020 -7FE0 -00C0 -0180 -0300 -01E0 -0000 -ENDCHAR -STARTCHAR eogonek -ENCODING 281 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0F00 -30C0 -6060 -6060 -7FE0 -6000 -6000 -3000 -1860 -0F80 -0600 -0C00 -1800 -0F00 -0000 -ENDCHAR -STARTCHAR Ecaron -ENCODING 282 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -18C0 -0D80 -0700 -7FC0 -3040 -3040 -3000 -3000 -3080 -3F80 -3080 -3000 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ecaron -ENCODING 283 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -18C0 -0D80 -0700 -0200 -0000 -0F00 -30C0 -6060 -6060 -7FE0 -6000 -6000 -3000 -1860 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Gcircumflex -ENCODING 284 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0700 -0D80 -0000 -0FC0 -1060 -2020 -2000 -6000 -6000 -6000 -6000 -61F0 -6060 -2060 -3060 -1860 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR gcircumflex -ENCODING 285 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0200 -0700 -0D80 -18C0 -0000 -1F20 -31E0 -60C0 -60C0 -60C0 -3180 -3F00 -6000 -7FC0 -3FE0 -2060 -4020 -4020 -7FC0 -3F80 -ENDCHAR -STARTCHAR Gbreve -ENCODING 286 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0D80 -0D80 -0700 -0FC0 -1060 -2020 -2000 -6000 -6000 -6000 -6000 -61F0 -6060 -2060 -3060 -1860 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR gbreve -ENCODING 287 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1B00 -1B00 -0E00 -0000 -0000 -1F20 -31E0 -60C0 -60C0 -60C0 -3180 -3F00 -6000 -7FC0 -3FE0 -2060 -4020 -4020 -7FC0 -3F80 -ENDCHAR -STARTCHAR Gdotaccent -ENCODING 288 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0300 -0300 -0000 -0FC0 -1060 -2020 -2000 -6000 -6000 -6000 -6000 -61F0 -6060 -2060 -3060 -1860 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR gdotaccent -ENCODING 289 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0600 -0600 -0000 -1F20 -31E0 -60C0 -60C0 -60C0 -3180 -3F00 -6000 -7FC0 -3FE0 -2060 -4020 -4020 -7FC0 -3F80 -ENDCHAR -STARTCHAR Gcommaaccent -ENCODING 290 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0FC0 -1060 -2020 -2000 -6000 -6000 -6000 -6000 -61F0 -6060 -2060 -3060 -1860 -0F80 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR gcommaaccent -ENCODING 291 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0600 -0C00 -0E00 -0E00 -0000 -1F20 -31E0 -60C0 -60C0 -60C0 -3180 -3F00 -6000 -7FC0 -3FE0 -2060 -4020 -4020 -7FC0 -3F80 -ENDCHAR -STARTCHAR Hcircumflex -ENCODING 292 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0700 -0D80 -0000 -F0F0 -6060 -6060 -6060 -6060 -6060 -7FE0 -6060 -6060 -6060 -6060 -6060 -6060 -F0F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR hcircumflex -ENCODING 293 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0380 -16C0 -3000 -7000 -3000 -3000 -3780 -39C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -79E0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Hstroke -ENCODING 294 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -F0F0 -6060 -6060 -FFF0 -6060 -6060 -7FE0 -6060 -6060 -6060 -6060 -6060 -6060 -F0F0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR hstroke -ENCODING 295 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1000 -3000 -7000 -7E00 -3000 -3780 -39C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -79E0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Itilde -ENCODING 296 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0E40 -1FC0 -1380 -0000 -1F80 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR itilde -ENCODING 297 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1C80 -3F80 -2700 -0000 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Imacron -ENCODING 298 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -1F80 -1F80 -0000 -1F80 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR imacron -ENCODING 299 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1F80 -1F80 -0000 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ibreve -ENCODING 300 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -1980 -1980 -0F00 -1F80 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ibreve -ENCODING 301 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1B00 -1B00 -0E00 -0000 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Iogonek -ENCODING 302 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1F80 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0600 -0C00 -1800 -0F00 -0000 -ENDCHAR -STARTCHAR iogonek -ENCODING 303 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0600 -0600 -0000 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0600 -0C00 -1800 -0F00 -0000 -ENDCHAR -STARTCHAR Idotaccent -ENCODING 304 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0000 -1F80 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR dotlessi -ENCODING 305 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR IJ -ENCODING 306 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -78F0 -3060 -3060 -3060 -3060 -3060 -3060 -3060 -3060 -3060 -3060 -3060 -3360 -79C0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ij -ENCODING 307 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -3060 -3060 -0000 -0000 -70E0 -3060 -3060 -3060 -3060 -3060 -3060 -3060 -3060 -7860 -0060 -0C60 -0E40 -07C0 -0380 -ENDCHAR -STARTCHAR Jcircumflex -ENCODING 308 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0E00 -1B00 -0000 -1F80 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0400 -3800 -3000 -ENDCHAR -STARTCHAR jcircumflex -ENCODING 309 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0200 -0700 -0D80 -18C0 -0000 -03C0 -00C0 -00C0 -00C0 -00C0 -00C0 -00C0 -00C0 -00C0 -00C0 -20C0 -30C0 -3880 -1F00 -0E00 -ENDCHAR -STARTCHAR Kcommaaccent -ENCODING 310 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -F0E0 -6180 -6300 -6600 -6C00 -7800 -7800 -7C00 -6E00 -6700 -6380 -61C0 -60E0 -F070 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR kcommaaccent -ENCODING 311 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -6000 -E000 -6000 -6000 -6000 -61C0 -6300 -6600 -7C00 -7800 -7C00 -6E00 -6700 -6380 -F1E0 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR kra -ENCODING 312 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -6000 -E1C0 -6300 -6600 -7C00 -7800 -7C00 -6E00 -6700 -6380 -F1E0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Lacute -ENCODING 313 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0C00 -1800 -3000 -7800 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR lacute -ENCODING 314 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0300 -0600 -0C00 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Lcommaaccent -ENCODING 315 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -7800 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3020 -3020 -7FE0 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR lcommaaccent -ENCODING 316 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR Lcaron -ENCODING 317 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0C60 -06C0 -0380 -7900 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR lcaron -ENCODING 318 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -18C0 -0D80 -0700 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ldot -ENCODING 319 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -7800 -3000 -3000 -3000 -3000 -3180 -3180 -3000 -3000 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ldot -ENCODING 320 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1E00 -0600 -0600 -0600 -0600 -0600 -0660 -0660 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Lslash -ENCODING 321 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -7800 -3000 -3000 -3400 -3800 -3000 -3000 -7000 -B000 -3000 -3000 -3020 -3020 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR lslash -ENCODING 322 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1E00 -0600 -0600 -0680 -0700 -0600 -0600 -0E00 -1600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Nacute -ENCODING 323 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0180 -0300 -0600 -C070 -6020 -7020 -7820 -5820 -4C20 -4620 -4720 -4320 -41A0 -40E0 -40E0 -4060 -E030 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR nacute -ENCODING 324 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0180 -0300 -0600 -0000 -2780 -79C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -79E0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ncommaaccent -ENCODING 325 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -C070 -6020 -7020 -7820 -5820 -4C20 -4620 -4720 -4320 -41A0 -40E0 -40E0 -4060 -E030 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR ncommaaccent -ENCODING 326 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -2780 -79C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -79E0 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR Ncaron -ENCODING 327 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -18C0 -0D80 -0700 -C270 -6020 -7020 -7820 -5820 -4C20 -4620 -4720 -4320 -41A0 -40E0 -40E0 -4060 -E030 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ncaron -ENCODING 328 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -18C0 -0D80 -0700 -0200 -0000 -2780 -79C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -79E0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR napostrophe -ENCODING 329 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -E000 -E000 -6000 -6000 -4000 -8000 -2780 -79C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -79E0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Eng -ENCODING 330 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -C070 -6020 -7020 -7820 -5820 -4C20 -4620 -4720 -4320 -41A0 -40E0 -40E0 -4060 -E060 -0060 -0060 -0040 -0380 -0300 -ENDCHAR -STARTCHAR eng -ENCODING 331 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -2780 -79C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -78C0 -00C0 -00C0 -0080 -0700 -0600 -ENDCHAR -STARTCHAR Omacron -ENCODING 332 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -1F80 -1F80 -0000 -0F00 -11C0 -20C0 -2060 -6060 -6060 -6060 -6060 -6060 -6060 -2040 -3040 -1880 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR omacron -ENCODING 333 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1F80 -1F80 -0000 -0000 -0F80 -11C0 -20E0 -6060 -6060 -6060 -6060 -7040 -3880 -1F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Obreve -ENCODING 334 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0D80 -0D80 -0700 -0F00 -11C0 -20C0 -2060 -6060 -6060 -6060 -6060 -6060 -6060 -2040 -3040 -1880 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR obreve -ENCODING 335 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0D80 -0D80 -0700 -0000 -0F80 -11C0 -20E0 -6060 -6060 -6060 -6060 -7040 -3880 -1F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ohungarumlaut -ENCODING 336 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0360 -06C0 -0D80 -0F00 -11C0 -20C0 -2060 -6060 -6060 -6060 -6060 -6060 -6060 -2040 -3040 -1880 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ohungarumlaut -ENCODING 337 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -06C0 -0D80 -1B00 -0000 -0F80 -11C0 -20E0 -6060 -6060 -6060 -6060 -7040 -3880 -1F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR OE -ENCODING 338 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1FE0 -2620 -4620 -4600 -C600 -C610 -C7F0 -C610 -C600 -C600 -4600 -6610 -3610 -1FF0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR oe -ENCODING 339 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -1DE0 -2230 -4230 -C230 -C3F0 -C200 -C200 -E200 -7330 -3DE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Racute -ENCODING 340 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0180 -0300 -0600 -FF00 -6180 -60C0 -60C0 -60C0 -6080 -7F00 -7C00 -6E00 -6700 -6380 -61C0 -60E0 -F070 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR racute -ENCODING 341 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0300 -0600 -0C00 -0000 -7380 -34C0 -38C0 -3000 -3000 -3000 -3000 -3000 -3000 -7800 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Rcommaaccent -ENCODING 342 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -FF00 -6180 -60C0 -60C0 -60C0 -6080 -7F00 -7C00 -6E00 -6700 -6380 -61C0 -60E0 -F070 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR rcommaaccent -ENCODING 343 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -7380 -34C0 -38C0 -3000 -3000 -3000 -3000 -3000 -3000 -7800 -1800 -0C00 -0600 -3C00 -0000 -ENDCHAR -STARTCHAR Rcaron -ENCODING 344 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -3180 -1B00 -0E00 -FF00 -6180 -60C0 -60C0 -60C0 -6080 -7F00 -7C00 -6E00 -6700 -6380 -61C0 -60E0 -F070 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR rcaron -ENCODING 345 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -3180 -1B00 -0E00 -0400 -0000 -7380 -34C0 -38C0 -3000 -3000 -3000 -3000 -3000 -3000 -7800 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Sacute -ENCODING 346 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0180 -0300 -0600 -1FE0 -3060 -6020 -6020 -7000 -3C00 -1E00 -0780 -01C0 -00E0 -4060 -4060 -60C0 -7F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR sacute -ENCODING 347 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0180 -0300 -0600 -0000 -1FC0 -30C0 -3040 -3800 -1E00 -0780 -01C0 -20C0 -30C0 -3F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Scircumflex -ENCODING 348 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0700 -0D80 -0000 -1FE0 -3060 -6020 -6020 -7000 -3C00 -1E00 -0780 -01C0 -00E0 -4060 -4060 -60C0 -7F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR scircumflex -ENCODING 349 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0200 -0700 -0D80 -18C0 -0000 -1FC0 -30C0 -3040 -3800 -1E00 -0780 -01C0 -20C0 -30C0 -3F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Scedilla -ENCODING 350 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1FE0 -3060 -6020 -6020 -7000 -3C00 -1E00 -0780 -01C0 -00E0 -4060 -4060 -60C0 -7F80 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR scedilla -ENCODING 351 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -1FC0 -30C0 -3040 -3800 -1E00 -0780 -01C0 -20C0 -30C0 -3F80 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR Scaron -ENCODING 352 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -18C0 -0D80 -0700 -1FE0 -3060 -6020 -6020 -7000 -3C00 -1E00 -0780 -01C0 -00E0 -4060 -4060 -60C0 -7F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR scaron -ENCODING 353 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -18C0 -0D80 -0700 -0200 -0000 -1FC0 -30C0 -3040 -3800 -1E00 -0780 -01C0 -20C0 -30C0 -3F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Tcedilla -ENCODING 354 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -7FE0 -4620 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR tcedilla -ENCODING 355 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0400 -0400 -0C00 -7FC0 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0C20 -0E40 -0780 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR Tcaron -ENCODING 356 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -18C0 -0D80 -0700 -7FE0 -4620 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR tcaron -ENCODING 357 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -3180 -1B00 -0E00 -0000 -0400 -0400 -0C00 -7FC0 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0C20 -0E40 -0780 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Tstroke -ENCODING 358 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -7FE0 -4620 -0600 -0600 -0600 -0600 -3FC0 -0600 -0600 -0600 -0600 -0600 -0600 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR tstroke -ENCODING 359 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0400 -0400 -0C00 -7FC0 -0C00 -0C00 -3F80 -0C00 -0C00 -0C00 -0C20 -0E40 -0780 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Utilde -ENCODING 360 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0E40 -1FC0 -1380 -F070 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -7040 -3FC0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR utilde -ENCODING 361 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0E40 -1FC0 -1380 -0000 -79E0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -39C0 -1E60 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Umacron -ENCODING 362 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -1F80 -1F80 -0000 -F070 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -7040 -3FC0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR umacron -ENCODING 363 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1F80 -1F80 -0000 -0000 -79E0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -39C0 -1E60 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ubreve -ENCODING 364 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0D80 -0D80 -0700 -F070 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -7040 -3FC0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ubreve -ENCODING 365 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0D80 -0D80 -0700 -0000 -79E0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -39C0 -1E60 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Uring -ENCODING 366 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0700 -0D80 -0D80 -F770 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -7040 -3FC0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR uring -ENCODING 367 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0700 -0D80 -0D80 -0700 -0000 -79E0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -39C0 -1E60 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Uhungarumlaut -ENCODING 368 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -06C0 -0D80 -1B00 -F070 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -7040 -3FC0 -1F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR uhungarumlaut -ENCODING 369 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -06C0 -0D80 -1B00 -0000 -79E0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -39C0 -1E60 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Uogonek -ENCODING 370 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -F070 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -6020 -7040 -3FC0 -1F80 -0180 -0300 -0600 -03C0 -0000 -ENDCHAR -STARTCHAR uogonek -ENCODING 371 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -79E0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -30C0 -39C0 -1E60 -00C0 -0180 -0300 -01E0 -0000 -ENDCHAR -STARTCHAR Wcircumflex -ENCODING 372 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0700 -0D80 -0000 -FEF0 -6620 -6620 -6620 -7620 -7740 -3340 -3740 -3BC0 -3B80 -1980 -1980 -1980 -1980 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR wcircumflex -ENCODING 373 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0200 -0700 -0D80 -18C0 -0000 -FF70 -6620 -6620 -6620 -3740 -3B40 -3B40 -1980 -1980 -1980 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Ycircumflex -ENCODING 374 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0700 -0D80 -0000 -F070 -6020 -3040 -1880 -1880 -0D00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ycircumflex -ENCODING 375 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0200 -0700 -0D80 -18C0 -0000 -F0F0 -6020 -3040 -3040 -1880 -1880 -0D00 -0D00 -0600 -0600 -0400 -0C00 -0800 -7800 -7000 -ENDCHAR -STARTCHAR Ydieresis -ENCODING 376 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -1980 -1980 -0000 -F070 -6020 -3040 -1880 -1880 -0D00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0F00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Zacute -ENCODING 377 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0180 -0300 -0600 -3FE0 -20C0 -00C0 -0180 -0180 -0300 -0300 -0600 -0600 -0C00 -0C00 -1800 -1820 -3FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR zacute -ENCODING 378 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0300 -0600 -0C00 -0000 -7FE0 -60E0 -41C0 -0380 -0700 -0E00 -1C00 -3820 -7060 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Zdotaccent -ENCODING 379 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0300 -0300 -0000 -3FE0 -20C0 -00C0 -0180 -0180 -0300 -0300 -0600 -0600 -0C00 -0C00 -1800 -1820 -3FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR zdotaccent -ENCODING 380 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0600 -0600 -0000 -7FE0 -60E0 -41C0 -0380 -0700 -0E00 -1C00 -3820 -7060 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Zcaron -ENCODING 381 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -18C0 -0D80 -0700 -3FE0 -20C0 -00C0 -0180 -0180 -0300 -0300 -0600 -0600 -0C00 -0C00 -1800 -1820 -3FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR zcaron -ENCODING 382 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -18C0 -0D80 -0700 -0200 -0000 -7FE0 -60E0 -41C0 -0380 -0700 -0E00 -1C00 -3820 -7060 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR longs -ENCODING 383 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0380 -04C0 -04C0 -0C00 -0C00 -0C00 -0C00 -3C00 -0C00 -0C00 -0C00 -0C00 -0C00 -0C00 -1E00 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR gravecomb -ENCODING 768 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0C00 -0600 -0300 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR acutecomb -ENCODING 769 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0300 -0600 -0C00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR circumflexcomb -ENCODING 770 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0400 -0E00 -1B00 -3180 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR tildecomb -ENCODING 771 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -1C80 -3F80 -2700 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR macroncomb -ENCODING 772 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -1F80 -1F80 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR brevecomb -ENCODING 774 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -1B00 -1B00 -0E00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR diaresiscomb -ENCODING 776 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -1980 -1980 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ringcomb -ENCODING 778 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0E00 -1B00 -1B00 -0E00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR caroncomb -ENCODING 780 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -3180 -1B00 -0E00 -0400 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR cedillacomb -ENCODING 807 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0600 -0300 -0180 -0F00 -0000 -ENDCHAR -STARTCHAR ogonekcomb -ENCODING 808 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0600 -0C00 -1800 -0F00 -0000 -ENDCHAR -STARTCHAR Combining Low Line -ENCODING 818 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -FFF0 -ENDCHAR -STARTCHAR hyphen -ENCODING 8208 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -3FC0 -3FC0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char8209 -ENCODING 8209 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -3FC0 -3FC0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR figuredash -ENCODING 8210 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -3FC0 -3FC0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR endash -ENCODING 8211 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -3FC0 -3FC0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR emdash -ENCODING 8212 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -7FE0 -7FE0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR afii00208 -ENCODING 8213 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -7FE0 -7FE0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR dblverticalbar -ENCODING 8214 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -1980 -1980 -1980 -1980 -1980 -1980 -1980 -1980 -1980 -1980 -1980 -1980 -1980 -1980 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR dbllowline -ENCODING 8215 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -3FC0 -0000 -0000 -3FC0 -ENDCHAR -STARTCHAR quoteleft -ENCODING 8216 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0100 -0300 -0600 -0C00 -0C00 -0F00 -0F00 -0600 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR quoteright -ENCODING 8217 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0600 -0F00 -0F00 -0300 -0300 -0600 -0C00 -0800 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR quotesinglebase -ENCODING 8218 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0600 -0F00 -0F00 -0300 -0300 -0600 -0C00 -0800 -0000 -0000 -ENDCHAR -STARTCHAR quotereversed -ENCODING 8219 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0600 -0F00 -0F00 -0C00 -0C00 -0600 -0300 -0100 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR quotedblleft -ENCODING 8220 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0CC0 -1980 -1980 -1980 -1980 -1980 -1980 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR quotedblright -ENCODING 8221 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -1980 -1980 -1980 -1980 -1980 -1980 -3300 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR quotedblbase -ENCODING 8222 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -1980 -1980 -1980 -1980 -1980 -3300 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char8223 -ENCODING 8223 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -1980 -1980 -1980 -1980 -1980 -1980 -0CC0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR dagger -ENCODING 8224 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0600 -0600 -0600 -3FC0 -3FC0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR daggerdbl -ENCODING 8225 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0600 -0600 -0600 -3FC0 -3FC0 -0600 -0600 -0600 -0600 -3FC0 -3FC0 -0600 -0600 -0600 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR bullet -ENCODING 8226 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0700 -0F80 -0F80 -0F80 -0700 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ellipsis -ENCODING 8230 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -2220 -7770 -7770 -2220 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR perthousand -ENCODING 8240 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -3180 -4980 -4B00 -3300 -0600 -0600 -0C00 -0C00 -1800 -1800 -36C0 -3920 -6920 -66C0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR minute -ENCODING 8242 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0600 -0600 -0600 -0600 -0600 -0600 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR second -ENCODING 8243 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -1980 -1980 -1980 -1980 -1980 -1980 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR guilsinglleft -ENCODING 8249 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0180 -0300 -0600 -0C00 -1800 -0C00 -0600 -0300 -0180 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR guilsinglright -ENCODING 8250 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -1800 -0C00 -0600 -0300 -0180 -0300 -0600 -0C00 -1800 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR exclamdbl -ENCODING 8252 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -1980 -1980 -1980 -1980 -1980 -1980 -1980 -1980 -1980 -1980 -1980 -0000 -0000 -1980 -1980 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR overline -ENCODING 8254 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -3FC0 -3FC0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR Euro -ENCODING 8364 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0F80 -1040 -2020 -2000 -6000 -FF80 -6000 -6000 -FF00 -6000 -2000 -3000 -1840 -0F80 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR minus -ENCODING 8722 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -3FC0 -3FC0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9146 -ENCODING 9146 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -FFF0 -FFF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9147 -ENCODING 9147 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -FFF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9148 -ENCODING 9148 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -FFF0 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9149 -ENCODING 9149 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -FFF0 -ENDCHAR -STARTCHAR char18 -ENCODING 9472 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -FFF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char18 -ENCODING 9473 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -FFF0 -FFF0 -FFF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9474 -ENCODING 9474 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9474 -ENCODING 9475 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char13 -ENCODING 9484 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -07F0 -07F0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char13 -ENCODING 9485 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -07F0 -07F0 -07F0 -07F0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char13 -ENCODING 9486 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0FF0 -0FF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char13 -ENCODING 9487 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0FF0 -0FF0 -0FF0 -0FF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char12 -ENCODING 9488 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FE00 -FE00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char12 -ENCODING 9489 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FE00 -FE00 -FE00 -FE00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char12 -ENCODING 9490 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FF00 -FF00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char12 -ENCODING 9491 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FF00 -FF00 -FF00 -FF00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char14 -ENCODING 9492 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -07F0 -07F0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char14 -ENCODING 9493 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -07F0 -07F0 -07F0 -07F0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char14 -ENCODING 9494 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0FF0 -0FF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char14 -ENCODING 9495 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0FF0 -0FF0 -0FF0 -0FF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char11 -ENCODING 9496 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FE00 -FE00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char11 -ENCODING 9497 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FE00 -FE00 -FE00 -FE00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char11 -ENCODING 9498 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FF00 -FF00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char11 -ENCODING 9499 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FF00 -FF00 -FF00 -FF00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char21 -ENCODING 9500 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -07F0 -07F0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char21 -ENCODING 9501 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -07F0 -07F0 -07F0 -07F0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char21 -ENCODING 9502 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0FF0 -0FF0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char21 -ENCODING 9503 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0FF0 -0FF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char21 -ENCODING 9504 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0FF0 -0FF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char21 -ENCODING 9505 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0FF0 -0FF0 -0FF0 -0FF0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char21 -ENCODING 9506 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0FF0 -0FF0 -0FF0 -0FF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char21 -ENCODING 9507 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0FF0 -0FF0 -0FF0 -0FF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char22 -ENCODING 9508 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FE00 -FE00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char22 -ENCODING 9509 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FE00 -FE00 -FE00 -FE00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char22 -ENCODING 9510 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FF00 -FF00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char22 -ENCODING 9511 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FF00 -FF00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char22 -ENCODING 9512 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FF00 -FF00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char22 -ENCODING 9513 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FF00 -FF00 -FF00 -FF00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char22 -ENCODING 9514 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FF00 -FF00 -FF00 -FF00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char22 -ENCODING 9515 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FF00 -FF00 -FF00 -FF00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char24 -ENCODING 9516 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -FFF0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char24 -ENCODING 9517 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FE00 -FFF0 -FFF0 -FE00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char24 -ENCODING 9518 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -07F0 -FFF0 -FFF0 -07F0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char24 -ENCODING 9519 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -FFF0 -FFF0 -FFF0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char24 -ENCODING 9520 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -FFF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char24 -ENCODING 9521 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FF00 -FFF0 -FFF0 -FF00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char24 -ENCODING 9522 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0FF0 -FFF0 -FFF0 -0FF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char24 -ENCODING 9523 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -FFF0 -FFF0 -FFF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char23 -ENCODING 9524 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FFF0 -FFF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char23 -ENCODING 9525 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FE00 -FFF0 -FFF0 -FE00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char23 -ENCODING 9526 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -07F0 -FFF0 -FFF0 -07F0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char23 -ENCODING 9527 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FFF0 -FFF0 -FFF0 -FFF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char23 -ENCODING 9528 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FFF0 -FFF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char23 -ENCODING 9529 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FF00 -FFF0 -FFF0 -FF00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char23 -ENCODING 9530 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0FF0 -FFF0 -FFF0 -0FF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char23 -ENCODING 9531 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FFF0 -FFF0 -FFF0 -FFF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9532 -ENCODING 9532 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FFF0 -FFF0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9532 -ENCODING 9533 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FE00 -FFF0 -FFF0 -FE00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9532 -ENCODING 9534 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -07F0 -FFF0 -FFF0 -07F0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9532 -ENCODING 9535 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FFF0 -FFF0 -FFF0 -FFF0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9532 -ENCODING 9536 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FFF0 -FFF0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9532 -ENCODING 9537 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FFF0 -FFF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char9532 -ENCODING 9538 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FFF0 -FFF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char9532 -ENCODING 9539 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FF00 -FFF0 -FFF0 -FE00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9532 -ENCODING 9540 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0FF0 -FFF0 -FFF0 -07F0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9532 -ENCODING 9541 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FE00 -FFF0 -FFF0 -FF00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char9532 -ENCODING 9542 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -07F0 -FFF0 -FFF0 -0FF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char9532 -ENCODING 9543 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FFF0 -FFF0 -FFF0 -FFF0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9532 -ENCODING 9544 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FFF0 -FFF0 -FFF0 -FFF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char9532 -ENCODING 9545 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FF00 -FFF0 -FFF0 -FF00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char9532 -ENCODING 9546 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0FF0 -FFF0 -FFF0 -0FF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char9532 -ENCODING 9547 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -FFF0 -FFF0 -FFF0 -FFF0 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -0F00 -ENDCHAR -STARTCHAR char9552 -ENCODING 9552 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -0000 -0000 -FFF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9552 -ENCODING 9553 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -ENDCHAR -STARTCHAR char9552 -ENCODING 9554 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -07F0 -0600 -0600 -07F0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9552 -ENCODING 9555 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0FF0 -0FF0 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -ENDCHAR -STARTCHAR char9552 -ENCODING 9556 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0FF0 -0800 -0800 -09F0 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -ENDCHAR -STARTCHAR char9552 -ENCODING 9557 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FE00 -0600 -0600 -FE00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9552 -ENCODING 9558 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FF00 -FF00 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -ENDCHAR -STARTCHAR char9552 -ENCODING 9559 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FF00 -0100 -0100 -F900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -ENDCHAR -STARTCHAR char9552 -ENCODING 9560 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -07F0 -0600 -0600 -07F0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9552 -ENCODING 9561 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0FF0 -0FF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9552 -ENCODING 9562 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -09F0 -0800 -0800 -0FF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9552 -ENCODING 9563 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FE00 -0600 -0600 -FE00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9552 -ENCODING 9564 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -FF00 -FF00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9552 -ENCODING 9565 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -F900 -0100 -0100 -FF00 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9552 -ENCODING 9566 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -07F0 -0600 -0600 -07F0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9552 -ENCODING 9567 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0FF0 -0FF0 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -ENDCHAR -STARTCHAR char9552 -ENCODING 9568 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -09F0 -0800 -0800 -09F0 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -ENDCHAR -STARTCHAR char9552 -ENCODING 9569 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FE00 -0600 -0600 -FE00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9552 -ENCODING 9570 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -FF00 -FF00 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -ENDCHAR -STARTCHAR char9552 -ENCODING 9571 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -F900 -0100 -0100 -F900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -ENDCHAR -STARTCHAR char9552 -ENCODING 9572 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -0000 -0000 -FFF0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9552 -ENCODING 9573 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -FFF0 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -ENDCHAR -STARTCHAR char9552 -ENCODING 9574 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -FFF0 -0000 -0000 -F9F0 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -ENDCHAR -STARTCHAR char9552 -ENCODING 9575 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FFF0 -0000 -0000 -FFF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9552 -ENCODING 9576 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -FFF0 -FFF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9552 -ENCODING 9577 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -F9F0 -0000 -0000 -FFF0 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char9552 -ENCODING 9578 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -FFF0 -0600 -0600 -FFF0 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char9552 -ENCODING 9579 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -FFF0 -FFF0 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -ENDCHAR -STARTCHAR char9552 -ENCODING 9580 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -F9F0 -0000 -0000 -F9F0 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -0900 -ENDCHAR -STARTCHAR char13 -ENCODING 9581 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0070 -01F0 -0380 -0300 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char13 -ENCODING 9582 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -E000 -F800 -1C00 -0C00 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -ENDCHAR -STARTCHAR char13 -ENCODING 9583 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0C00 -1C00 -F800 -E000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char13 -ENCODING 9584 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0600 -0300 -0380 -01F0 -0070 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR ltshade -ENCODING 9617 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -AAA0 -0000 -AAA0 -0000 -AAA0 -0000 -AAA0 -0000 -AAA0 -0000 -AAA0 -0000 -AAA0 -0000 -AAA0 -0000 -AAA0 -0000 -AAA0 -0000 -AAA0 -0000 -ENDCHAR -STARTCHAR shade -ENCODING 9618 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -3330 -CCC0 -3330 -CCC0 -3330 -CCC0 -3330 -CCC0 -3330 -CCC0 -3330 -CCC0 -3330 -CCC0 -3330 -CCC0 -3330 -CCC0 -3330 -CCC0 -3330 -CCC0 -ENDCHAR -STARTCHAR dkshade -ENCODING 9619 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -FFF0 -AAA0 -FFF0 -AAA0 -FFF0 -AAA0 -FFF0 -AAA0 -FFF0 -AAA0 -FFF0 -AAA0 -FFF0 -AAA0 -FFF0 -AAA0 -FFF0 -AAA0 -FFF0 -AAA0 -FFF0 -AAA0 -ENDCHAR -STARTCHAR blackdiamond -ENCODING 9670 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -0000 -0000 -0000 -0600 -0F00 -1F80 -3FC0 -7FE0 -FFF0 -FFF0 -7FE0 -3FC0 -1F80 -0F00 -0600 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -STARTCHAR char65534 -ENCODING 65533 -SWIDTH 631 0 -DWIDTH 12 0 -BBX 12 22 0 -5 -BITMAP -0000 -0000 -7FE0 -7FE0 -6060 -6060 -6060 -6060 -6060 -6060 -6060 -6060 -6060 -6060 -6060 -7FE0 -7FE0 -0000 -0000 -0000 -0000 -0000 -ENDCHAR -ENDFONT diff --git a/OSX/iSaverRunner.ai b/OSX/iSaverRunner.ai index a91e23c9..17b27955 100644 --- a/OSX/iSaverRunner.ai +++ b/OSX/iSaverRunner.ai @@ -1,7 +1,7 @@ %PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[18 0 R 93 0 R]>>/Type/Catalog>> endobj 108 0 obj <>stream +1 0 obj <>/OCGs[18 0 R 93 0 R 109 0 R]>>/Pages 2 0 R/Type/Catalog>> endobj 108 0 obj <>stream - + @@ -13,32 +13,33 @@ - Adobe Illustrator CS3 - 2012-06-04T14:04:08-07:00 - 2012-06-04T14:30:53-07:00 - 2012-06-04T14:30:53-07:00 - + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"> + Adobe Illustrator CS3 + 2012-06-04T14:04:08-07:00 + 2021-02-20T17:34-08:00 + 2021-02-20T17:34-08:00 + - 244 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAD0AwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AG56I+cOxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvRfyZ/46eo/8YE/4nmh7 d+iPvd/2B9cvc9XzmXqHzHnoj5w7FXYq7FXYq7FXYq7FXYq7FUNd6jZ2s1vDcSiKS7cxW3IHi0gU tw5UoCQNgTv2yueSMSATz5NkMUpAkC+Hmlfk7zE+uaSZblUh1K1lkttQtkrSOWNiNgSTQjfKNHqP FhZ2kDRHm363TeFOhvEiwfJPcy3EdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVei/kz/x0 9R/4wJ/xPND279Efe7/sD65e56vnMvUPmPPRHzh2KuxV2KuxV2KuxV2KuxV2KpN5w0Ma15eurJV5 XAAmtd6Umi+JN+1SOJPgcxNbp/FxGPXp73N7P1Pg5ozP03v7uryfQ9d1bQfNX6XIa50zUYRNekfa kiUDnLxHWWIfG/8AsjsDtyWj7VOPLxS6mpfr/HX3vedt+zvDjAx74yOLGfL+afd1+b263uIbiCO4 gcSQzKHikU1DKwqCD7jO2jISFjkXziUTE0eYX5Ji7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXov5M/8dPUf+MCf8TzQ9u/RH3u/7A+uXuer5zL1D5jz0R84dirsVdirsVdirsVdirsVdirsVeZ6 ppixapqOngmIwzi7spQASguP3gYA7UEhkXidiBTpnnfben8PUSFemW/zfevYvLHtDsvwZ/VjNeY/ mn7/AIbLvI3mFtIvxol7+60+4lKWe5K21y3xegCd/Sl3aEn3Xcg023YPadHwZn+qfx+L94fPPars KWGZmBRH1frHl3eXmC9KzrniHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq9F/Jn/AI6eo/8A GBP+J5oe3foj73f9gfXL3PV85l6h8x56I+cOxV2KuxV2KuxV2KuxV2KuxV2KsM85QiLX7C5HS6t5 YJPnCyyR/hJJnJe0+L6J/B9U/wCBfqzHPkxdJRv4/wBjG9ZsYZoWlkjaSMIUuY0+20NeVU/4siYc 4/cU6Mc5ME9NiOXv/UeRfS/aDswajFxAXKI+ceo945j5dWY+TNenuo5NI1GVZdVsFRvrC/ZuraQA w3UfiHUjl4HPQOxe0xqsW/1x5/j73557a7MOly7fRLl+PuZNm5dM7FUgk876HGurysz/AFXReKXN zQem0rVrFGa/E6kAH3OYZ12McZ6Q5nz7g5o0GT0DrPkPLvKbaXfG/wBOtr0wvb/WI1kEMtA6hhUB qE5kYp8cRKqtxssOCRjd0icsa3Yq7FXYq7FXYq7FXYq7FXYq7FXov5M/8dPUf+MCf8TzQ9u/RH3u /wCwPrl7nq+cy9Q+Y89EfOHYq7FXYq7FXYq7FXYq7FXYq7FWL+fVpBpMg6rfcfoe3mBH30OaD2jF 6f8Azh+l7j/geT4e1I/1ZfckWcG/Q6jHHPb6TJq9kK3/AJRn9QoOsuk3dXkhPj6b+oUr9kDLNFrj pNZGX8OTn7xt9or4vlntR2PGccmMfw+qP9WW/wBkr+D0i3niuII54W5xSqrxuOhVhUH7s9VjIEWH xSUSDR5hjfnzzC+maY1tbOUvblHYuv2ooIxWWUe9PhT/ACiPDNX2vrvAx0PrlsP1vQeznZH5zPcv 7rGOKfuG7z3TrEanrmieU4UppNhI1zqrDdJruNQ86nxWMsIRmrwxE8kNOPphvLzPX9Tm6nIYwnqT tKe0PKPSv909pzqnkXYq7FXYq7FXYq7FXYq7FXYq7FXYq9F/Jn/jp6j/AMYE/wCJ5oe3foj73f8A YH1y9z1fOZeofMeeiPnDsVdirsVdirsVdirsVdirsVdirFvPkgKaTAPtPeGQj/Jjt5an/gmXOf8A aSYGnA75Pdf8DvEZdpxPQRl9yR5wj9CrFe7TQJobZuN/52lTT7BSK8NPtw/rXJHgyyvT2IODTaU6 vWQxjlj3P9Y/qr7C+Y+0na0YwyZukhwx/qxvf/OJNe8PQYIrXT7COJSIrW0iCAsdljiWm59lGesx AhGugH3PiJMpyvnKR+95Zrj6hrMN1ewr/puqywW1hG+3CF51jgQ16V58292Oed9odoeLnOQ/TG69 wfdezOwzoexpCv3uXhv/ADpAAfayjy7oFppXnW6sLYlk0XS7W0aQ9XluZHuJJG/ynYVzP9jpHKJ5 pc5H8f7l8+9sAMXBiHID8fezLO4eIdirsVdirsVdirsVdirsVdirsVdir0X8mf8Ajp6j/wAYE/4n mh7d+iPvd/2B9cvc9XzmXqHzHnoj5w7FXYq7FXYq7FXYq7FXYq7FXYqwHXr9dR8xyNGeVtpiG1Rh uGnkIaen+rxRfnyzh/aLVieQQHKH3vtX/Az7Jljxz1Mh9fpj7lCDTZtY1G20aElfrhJupF2MdrHQ zMCOhIIRT/Mwzl8+cYoGZ6cvf0/W9521qTHGMcT6sm3uj/Ef0e8p3oHpaz5m1DXo1VdMsB+idCjU URYYNppEA2o77KfAUzr/AGQ7OOLD4svrn+Px8Xwr2u7R8XL4Ufpj+P2/Jd58vSbO30dD8epMfrFO 1rFQy/8ABkrH8mObXt7V+Fg4R9U9vh1R7E9j/nddHiF48fqkx8sqXOnudljv7F2/1Uu4mP4DPPco uEv6svuL7z20P8GP9aH+7iyiwr/ysXzdy3JXTSp8F+rsAP8AggxzqPYevyx/HWT4X7bX+Yj+OkWQ Z2zxTsVdirsVdirsVdirsVdirsVdirsVei/kz/x09R/4wJ/xPND279Efe7/sD65e56vnMvUPmPPR Hzh2KuxV2KuxV2KuxV2KuxV2KsY81+YponOkaY/G/dQ1zcjcW0TdD4GRx9gdvtHtXR9sdqjTx4Y/ 3h+x7D2S9l59pZrlthjzPf5BjtvbxW8CQRLxjQUUdT8yT1J7nOClIk2X6J0+CGGAxwFRiKCNtrif SvJmp6/BX9K69Iul6GBUEKzGJGXwLN6kte4C5gSxnU6uGEco7n3/AIofN4LtntEAZM97fTH3Dr8d 5e6mXaHpMGkaRaabB/d2sSx16ciB8TH3Zqk57HgxDHARHQPhGfMckzM9SwrUbo33mLUbvrHAwsbf /Vgr6h+mZmH0DOF7f1PiagjpHZ92/wCBx2Z4OiOYj1ZT9g/H2IPVVlbTbn0v75Y2eL/XQcl/4YZp Y1e723aWMz0+SI58Jr39GVw3UbfmNdSxH9xrOj2l/ER0Ijdox8zRxm69h51CeM8wT9n9r4X7bY7l CY6/p/sZJnfvBOxV2KuxV2KuxV2KuxV2KuxV2KuxV6L+TP8Ax09R/wCMCf8AE80Pbv0R97v+wPrl 7nq+cy9Q+Y89EfOHYq7FXYq7FXYq7FXYqkUfnPRGu9Thd2ih0pOdxdsP3RoSrhCCWPBhxO252Fcw o6/EZTjf93zLsMnZmaOPHMjbL9KprPmS3s9BTU7Wk73ioNNQ1HqvMOUfWhA4/E3goOOr1scWHxel bed8mfZvZeXVamOniPUTR8u9htrA0SMZHMtxKxluZ2+1JI27Mf4DsNs83z5pZZmUuZfpvsrs3Fos EcOMbR+0962+E7W5htzS5uWS2tz4STuIkP0M4yniA3PIb/Jl2pnOLTykPqqh75ekfeyrXLW3k86e XtAt142Hl+xa99LtyNLa3B90ClhmX7FaY5c0s0uf4/X9j477Z6nw8McUfx+K+1PNQvI7KwubyT+7 tonmf/VjUsf1Z6bkmIRMj0FvmmLGZyER1NPONMikisIFlNZioeZvGR/ic/SxOeV5ZmUjI9S/VvZe lGDTY8YFcMR8+v2onK3PX2d4YE8o6gx2066ufLt5/qSqGswfYIEP05nez2bwdfKPTJR+ex/2T4v7 X6E/lzHrikR8BvH/AGL0LPTXyh2KuxV2KuxV2KuxV2KuxV2KuxV2KvRfyZ/46eo/8YE/4nmh7d+i Pvd/2B9cvc9XzmXqHzHnoj5w7FXYq7FUi86+YW0Dy7c6kih5UosSnpyc8R+JzXdp6o4cVx+omnY9 l6UZstS+kC3gF351803U7TS6lMHbsjcB9wpnHyyykbJJL2UcUYigAAo/4r8y/wDVzuP+RjYOI97L hHcidN1zzVf30NnFqVxzmYLX1G2Hc9ew3yMshAu3K0WjOfLHHEbyP4+S/wA33jR6jJp1tIy2kEUd uyBtn9P4/i8SHY9e+VYL4b73a+0RgNT4cPpxREB8Of2ksg8hDUL1Hvb24knitv3NmjsSqGg5FQel FoMq1WQ7Rd57G6AEyzkcvSP0/jzLMcwnv19nw/Tejc/sfX7evhXl8P8Aw1Mp1P8AdTr+aXTdt/3I /rxYl+cmr6nZfmNfm0uZID6NulYzxPH0g1NvdjmR2JtpxXefvfMu2N85vuH3MRtNe169uobOfUJ5 Ibh1jkRnJDKxoQR75tZzNFxNHhjPNCNc5Afa9YzUPuLsVUfqLX8Oq6EhIk1i2E2nkbEahYfvYwD2 MsYpXwXKM8vDlDL/ADDR/qy/V+l432j0XFIkf5SP+yjuPmP9y8oPmrzKCQdSuQR1HqNm/wCI975v wDud/ivzL/1c7j/kY2HiPevCO53+K/Mv/VzuP+RjY8R714R3O/xX5l/6udx/yMbHiPevCO53+K/M v/VzuP8AkY2PEe9eEdzv8V+Zf+rncf8AIxseI968I7nf4r8y/wDVzuP+RjY8R714R3Mp8gfmLrlr rVtZX1w91ZXUgiKvuys5oCD7nbfMvR66eGYN+nqHD1mhhmgRQ4uhe8527wzsVdirsVei/kz/AMdP Uf8AjAn/ABPND279Efe7/sD65e56vnMvUPmPPRHzh2KuxV2KsH/OT/lCp/8AjLF/xMZpO3P7of1n edg/3p/q/pfP+cs9W7FWa/lzpy87nU5R8EQ9KM+5FXP0LT78xdTLkHt/Y/Ri555co7D7z8h96Qa9 YzwraX1xtPqySXoQ9o2meNf+CMbH5UyeHIJEgco7fZf6Xk9YTKfiS55Ll8yXonk+2Fv5ds1/adTI x8ebEj8KZiZjci+p+z2Hw9FjHeL+Z/UnOVO6UbyOd4OVuwW5iZJrZz0E0LCSMn/ZqMaB2PI7OH2h pvHwygOfT3jcfaGN/nRFFqF5pXmu0Ui01e2EcoPWO5tyVkjfwZQQv+xOR7HJgJYZc4H7C+V9rwuQ yfzhR8iOYYHorhNYsXPRJ42/4Fwc20/pLidmy4dTjPdOJ+17Nmrfa3YqpXIuVVJ7Rgl7ayLcWjHo JYzyUH/Jb7LexOJiJAxPI7OD2jpTnwmI+rnH+sOXz5HyLAvzK0aGHVYddsIymk6+pu4Af91T1pcw N/lRyV2y7s7KTE45fXj2+HQ/EPkvaODhnxAVGe/uPUfAsOzYuvdirsVdirsVdiqY+XP+Uh0v/mLg /wCTq4q+p89EfOHYq7FXYq9F/Jn/AI6eo/8AGBP+J5oe3foj73f9gfXL3PV85l6h8x56I+cOxV2K uxVg/wCcn/KFT/8AGWL/AImM0nbn90P6zvOwf70/1f0vn/OWerbAqaYq9V06xOneUTDTjKLaSR69 eboW3+XTNdKXFP4vrOk0p03Zpj/F4cifeQT9nJEfmN5C8xa95o0bSPK+my6jLaaDAwt4aFxDDM8Z c1I2BkQfTmP2LPihMnmZk/c+edrw4ZwA5cA/Sr6LDPb6XBbXMbQ3NsDBPEwoySRMY3UjxDKRl2Ue ovpvYmQS0eMj+b92yOyt2rsVQGoW1pJY3enX546NqBEksoFTZ3aikd2o/kP2ZgP2d+xyEokSGSH1 x/2Q/m/q83kfaDsoGJyD6JfV/RP8/wDRL597BtJ/LDz5qmrXmm6RpMt/facVNzFblGZVb7Ei1ILI 3VWGxzbYssckRKPIvnU4Sxzo8w9DtJZJbaN5EMUxFJomBVkkXZ0YHoVYEHNdKNGn2nRakZ8Mcg/i F/r+1VyLlOxVCy6dZ6jbXHl2/cRWWqyCXTrtulrqVKKT4R3A+Fv8r3bKcplCQzR5x+od8f1j8cni /aDswWZfwZD/AKWff7pff72AaT+V3n7WNRvtO0vRpry+01gl7bxFC8dfssVLA8W/Zboc3OLLHJES ibBfPsmOUJGMhRCbf8qB/OT/AKlO+/4Ff+assYO/5UD+cn/Up33/AAK/81Yq035B/nIqlj5Tv6AV NEUnbwAauKsEuLe4triW2uYnhuIXaOaGRSjo6GjKymhBBFCDiqniqY+XP+Uh0v8A5i4P+Tq4q+p8 9EfOHYq7FXYq9F/Jn/jp6j/xgT/ieaHt36I+93/YH1y9z1fOZeofMeeiPnDsVdirsVYP+cn/AChU /wDxli/4mM0nbn90P6zvOwf70/1f0vn/ADlnq0w0Cx+vazaWxAZXkBdT3Rfib/hQchklUSXYdlaX x9TDH0Mt/cNz9j166h9a2mh/34jJ/wAEKZrAaL7Hnx8eOUf5wI+b0f8ALzWFt/zB/LnWnNItZ0+f S7qQnpJLbpPEu/czRFcxuxzw5cuPul+v9j5R2sOLHjn5fj9KT/mz5fbQPzK1q2C8bbU3Gr2Z8Vuy TP8ASLlZD8iM2OpjRt6z2P1nHgliPOBse4/t+9iuYz2DsVcQCKHcHqMUKOlajrHl3WbDUdHuRaah Ytw0i7f+6Cufi0+83HK1m6ISf3beAoVMZnGTMcv4h/vh59/f73ge3+wxD1Q+jp/RPcf6J6fzTtyT fzNqGmapqbeZNNgayg1mZ11jSn+3p+tKOVzbtsKpOAZo2/aPPpSgycwEgJx3BZeyfaJhI6We3WPv 6j9Pz70uzFe9diqyeCGeF4ZkDxSAq6HoQcINNeXFHJExkLieaY6FqGurfLe6VePb+eNFhMul3tdt SskIL2d2vSUrsu++6t1qcxRlOlmJD+5kdx/NPePL8dz572x2SYyMDvKrgf5w/mnzH6j3vrXyH5w0 /wA4+UdM8yWAKQahFzaI/ajlUlJYj7pIrL9GdA8an2KuxV+en/ORyIn52eagqhQbiI0Apu1vESfp JxV5tiqY+XP+Uh0v/mLg/wCTq4q+p89EfOHYq7FXYq9F/Jn/AI6eo/8AGBP+J5oe3foj73f9gfXL 3PV85l6h8x56I+cOxV2KuxVg/wCcn/KFT/8AGWL/AImM0nbn90P6zvOwf70/1f0vn/OWerZZ+XNr 6msSzkVWCI0PgzED9VcxtSfTT1vsfg4tTKf82P2nb7rej5gvpaP0+a9k8lXcWnmms+UL+PV9MG5N I5DdRmny9WMD2zAlLwdXGf8ADkFH7v1F887X0m2TH/NlxR9x3/XH4PZfzqsLLzj+WmkfmDo49Q6b Ct/RfiZtOu1X60hp3hosp8ODDvnRZYcUadB2Jr/yupjM/Sdpe4/q5/B4WCCAQag9DmsfYQbdil2K rZYo5onilUPG4Kuh3BB6g4QaYZMcZxMZC4nmgLyG6ksbySJ2fUbCBTej7TXenRMDFcUqOVxYyBd6 jkmzEhiDHFkGKfCf7vJ/sZfql975x2t2fPTZeKB9UPVE98R+mPI94oq+mX8d9ZR3KEfEKOF3AYbG nt4HuMsnHhNPe9na2Opwxyx68/I9UVkHNdiqlM91BJDf2VPr9jIJ7WuwZlBDRn/JkUlG9jgnATiY y5Sdd2ppDmxHh+uPqj7+748ntf8Azjr5jtoPMuveW4GP6M1iGPzPoanbitxSK8jp24y8TwHTfMjs 3ITi4ZfVA8J+H7HybtHGI5bH0z9Q+P7XvebBwXYq/Pb/AJyR/wDJ2+af+M8P/UNFirzTFUx8uf8A KQ6X/wAxcH/J1cVfU+eiPnDsVdirsVei/kz/AMdPUf8AjAn/ABPND279Efe7/sD65e56vnMvUPmP PRHzh2KuxV2KsH/OT/lCp/8AjLF/xMZpO3P7of1nedg/3p/q/pfP+cs9Wz78s4aW99L3do1HyUN/ XMPVHcPoHsVjqGSXeY/ZbNcxHuFbSdWXRNct9Uk2s3H1TUvAQSMCspH/ABU+5/yS2Y2s0/i4zEfU Nx+r4/fToO29PQGYfw7S/qnr/mn7CXs/5D6xFpWo61+WGp8Xsh6mo+W0kAKSWFyx+sWwB2PoyMdu 4Ynpmx7N1XjYgf4hsff+18z1+m8HKR0O4eS+a/LEvlPzVqXlpw3o2Lh9OkfcyWM1Wt2qftcQDEx7 shwZ4cMve+j+zHaP5jTCJ+vHt8Oh/R8Esyh6R2KuxVTe8bTrm21dByOnyepKgFeduw43EdO/KMmg 8QMhlxeJAw7/AL+n2un7a0/Hh4x9WP1fD+IfL7QEsOnxeXPN99okTV0+7pd6W1RxaGVS6cN6tQK6 E/5AyeDN42ETP1DaXv8Ax97z3s7n8DUy0/8ABP1R/Hu/3Kb4vcuxV2Kpj+XmuN5f8+eWrwtwisdV FlJ2X6jritGeX+TFdIX9qjLNOeHN/Xj9sf2H7HzH2l0nhZDXK+Ie6fP5SB+YfaGbN5V2Kvz2/wCc kf8Aydvmn/jPD/1DRYq80xVMfLn/ACkOl/8AMXB/ydXFX1Pnoj5w7FXYq7FXov5M/wDHT1H/AIwJ /wATzQ9u/RH3u/7A+uXuer5zL1D5jz0R84dirsVdirB/zk/5Qqf/AIyxf8TGaTtz+6H9Z3nYP96f 6v6Xz/nLPVvQ/wAtpFOm3UY+0soJ/wBkv9mYWq5h9G9jJDwJjul+j9jMMxXsmnRXUo4DKwIZTuCD 1BwsZRBFHkUdo+o6t6VlHp0nHzb5Vf695anav+lWqbS2b/zfu/3bD9peJ/mzE4vy2bxB/dz2l5Hv /Hn5PnvbHZZjeLu3ge8fzfeP1HvepfmqdM8//lvo/wCZ+gpWbTUI1ODrIlpIwW6ikA/atZgJN+ih yPtZvMsOKLpewu0PyupEj9B9Mvcf1c3kGa19edirsVcQCCCKg9Rigi0n1O01a4fSIQFki0uQLbXn LjKtmWBa2kB+2q8f3bA1HQjvhxQjEyI/j5jz7/1vIZOws0NTjnjo44SB8xG94+fl9venGB7B2Kux VKPMMcn1eR4m4PJBLEHGxDxgXcJH+V61sqj/AFskDRB7iP1H7C8n7V6bixCfdY/3w+2NfF9x+VNb j17yvpGtx04anZW92AO3rxLJT6OWbV8zTXFX57f85I/+Tt80/wDGeH/qGixV5piqY+XP+Uh0v/mL g/5Orir6nz0R84dirsVdir0X8mf+OnqP/GBP+J5oe3foj73f9gfXL3PV85l6h8x56I+cOxV2KuxV g/5yf8oVP/xli/4mM0nbn90P6zvOwf70/wBX9L5/zlnq2W/l1qKwanLZuaC6Sqf68dSB/wACTmNq Y2L7nr/Y/WCGeWI/5QfbH9lvRswX0l2KqU0UrGOWCU293buJbW5X7Uci9G9x2YdxtiQCCCLBcPXa OOox8J2PMHuPf+vvDOPyk89WekeZ5bLUYkj8secZPqGvacx/c2eryoVWUBj/AHF6m1fHqfhpluhm YfupG6+k98f1jkXyvtbRyx5CSKN1Idx7x5S5hieo6NNoOsaloEzMz6PdS2au/wBp4kNYHPu8DI30 45o1J9F9ntZ4+kiT9UfSfh+ylDKnduxV2KuxV2KuxV2KoPViEsJJynP6sVueH83oMJafTwphAvbv 2+brO2MXHpZ+Q4v9L6v0Pp7/AJxt1Frn8pNMs5X53GjzXemTH/mGuHEY/wCRRTNnjlxRB7w+OTjw yI7np+TYvz2/5yR/8nb5p/4zw/8AUNFirzTFUx8uf8pDpf8AzFwf8nVxV9T56I+cOxV2KuxV6L+T P/HT1H/jAn/E80Pbv0R97v8AsD65e56vnMvUPmPPRHzh2KuxV2KsH/OT/lCp/wDjLF/xMZpO3P7o f1nedg/3p/q/pfP+cs9WrWl1La3UVzEaSQsHU+6muCQsU3afPLFkjOP1RNvZdPvYb6yhu4T+7mUM B4HuD7g7Zq5Ro0+06TUxz4o5I8pC/wBnw5IjIuS7FUv1WCH0pXm2tbmI218f5Y2PKKf5283GT5ch 3xIOxH1RNj9I+I2ea9o9AMmLxAPpFS/q9/8Amnf3WmmpeZ4/MmrrqUhb9MSadYr5gRwQ66jbiS0l 5e7paxvtXZhmTqCDUh1dd7GTkI5YH+Ex+2/1KeYz2zsVdirsVdirsVdiqyaNZYnjb7LqVPyIphBY ZICUTE9RT2b/AJxG1B/0N5k0lz8UNxZamwoPtalZIXp/s4GzP08rj7iR8iQ+I6mJE9/I/MPfsvaH 57f85I/+Tt80/wDGeH/qGixV5piqY+XP+Uh0v/mLg/5Orir6nz0R84dirsVdir0X8mf+OnqP/GBP +J5oe3foj73f9gfXL3PV85l6h8x56I+cOxV2KuxVg/5yf8oVP/xli/4mM0nbn90P6zvOwf70/wBX 9L5/zlnq3Yqzr8utUmCTWMoJt+Y9GTssjhjwr/lLGxHyOYmpx/xPceyHafDI6eR57x9/Ufp+fezn MN9AdirTKrKVYAqRQg7gg4UEAiihbLTLazklkiLFpQiEueVEiBEaA9aKDQV7bdAMJLgaLs3FpjI4 79dfZyHwtF5F2DsVdirsVdirsVdirsVejf8AOM1x9T89NaV4x6v5cjuR4NJZXrQgD3EcwzI0M7Mx 3T/QHxrtSFZAR1H6S+m8z3WPz2/5yR/8nb5p/wCM8P8A1DRYq80xVMfLn/KQ6X/zFwf8nVxV9T56 I+cOxV2KuxV6L+TP/HT1H/jAn/E80Pbv0R97v+wPrl7nq+cy9Q+Y89EfOHYq7FXYqwf85P8AlCp/ +MsX/Exmk7c/uh/Wd52D/en+r+l8/wCcs9W7FXvP/OK/lHTfN0nnPQb+qRXWnQ+jcKKvBMk3KKZP 8qNwG9+h2OAi2ePJKEhKJojdq907U9K1K80bVohBqunSGC7jFeJNKpLHXcxyoQ6HwPjmtyQ4TT7B 2P2lHWYBMfUNpDz/AFHopZW7V2KuxV2KuxV2KuxV2KuxV2KqF7cG3tJZgpd0UlEG5ZzsqgeLNQYQ N3G1eoGHFLIf4R/YPiXpn5XWc1t+bfk/S9ORrqXQtIubfzHPGKxwRy26+h6jdmknTZPA16ZV2OZS OTIR6Zy2+18o7W4RwQv1RG/2PpzN26d+e3/OSP8A5O3zT/xnh/6hosVeaYqmPlz/AJSHS/8AmLg/ 5Orir6nz0R84dirsVdir0X8mf+OnqP8AxgT/AInmh7d+iPvd/wBgfXL3PV85l6h8x56I+cOxV2Ku xVg/5yf8oVP/AMZYv+JjNJ25/dD+s7zsH+9P9X9L5/zlnq3Yq+kP+cJLq2Tzl5htnkVZ5tPRoYia MwjmHMqO/HkK4q9w/PH8rZfM1gnmDQ4gfM2lxlfQFB9dtQSzWxP+/FJLQk/tVU7MSK8mPiFO17I7 Uno8wmN4n6h3j9fc+b4ZkmjDpUA1BVgVZWBoysp3DKRQg9M1xBBovrun1EM0BOBuMl+RbnYq7FXY q7FXYq7FXYq7FUHbNqep+aNP0XQ7f69rDSqbO2/YNyByjeU9orcfvnPsvicn4ByDh6Hn7uvz5fN4 r2n7WECMUeY3Pv8A4R8Pq/0r6/8Ayy/LvTvI3lxdOhf61qdy31nWNUcfvbq6fd5GPXiOiL2HvU5s oxEQAOQfPpSMjZ5ll2SYvzx/5yJube4/OnzVJBIssYukjLoQRzjgjR1qO6upB98Vec4qmPlz/lId L/5i4P8Ak6uKvqfPRHzh2KuxV2KvRfyZ/wCOnqP/ABgT/ieaHt36I+93/YH1y9z1fOZeofMeeiPn DsVdirsVYP8AnJ/yhU//ABli/wCJjNJ25/dD+s7zsH+9P9X9L5/zlnq3Yqr2V9e2N1Hd2NxJa3UR rFcQu0ciGlKq6kMNj2xVOf8AlYXn7/qZdV/6Trn/AJrxVU0Dzlf2eoyzahPLeRXb87p5WMkhc9ZO TEkt4165TlxcQ83oOwu25aOdS3xS5ju8x+N3pdvcQ3EKTwOJIpByR16EZryKfVMOaOSInA3E8iqY Gx2KuxV2KuxV2KuxVJvMvmKDR7StQ13KCII+tP8AKYeA/HLcWMyLpO2+2I6PH35JfSP0ny+95tae Yddsr176x1C5s7uQFXuLeZ4pCrHkVLIVNC25HjmxEQHybLllkkZSNko//lYXn7/qZdV/6Trn/mvC 1tH8wfPrAg+ZdVIOxBvbihH/AAeKpCSSSSak7knrXFWsVTHy5/ykOl/8xcH/ACdXFX1Pnoj5w7FX Yq7FXov5M/8AHT1H/jAn/E80Pbv0R97v+wPrl7nq+cy9Q+Y89EfOHYq7FXYqwf8AOME+SbggbCWK p/56DNJ25/dD+s7zsH+9P9X9L5/zlnq3Yq7FXYq7FU98tearrR5PTYGayc1eGu4/yk8D+vKcuES9 7vuxu3cmjPCfViPMfpH43el6bqthqUAms5RIv7S9GU+DDtmDKBjzfTtFr8OphxY5X9494ReQcx2K uxV2KuxVjvmHzjZ6dG0dsRcXfQU3RT03PcjwH00y/HhMubzPa/tJi0wMcfryfYPf+ofGnm17e3N7 cvcXLmSVzVmOZ0YgCg+aanUzzTM5m5FD5JodirsVdirsVTLy2CfMWl0/5a4P+Ti4q+ps9EfOHYq7 FXYq9F/Jn/jp6j/xgT/ieaHt36I+93/YH1y9z1fOZeofMeeiPnDsVdirsVQGu6NZ6zpc+nXYrDOt CR1B7Ee4zF1emGbGYFytHqjgyCY/AeR3P5G6yszC3vY5If2WYUNPffObl2NnB2o/F6aPbWAjex8F L/lR/mH/AJaYf8/pyP8AI+fuHzZfyzp+8/J3/Kj/ADD/AMtMP+f04/yPn7h81/lnT95+Tv8AlR/m H/lph/z+nH+R8/cPmv8ALOn7z8nf8qP8w/8ALTD/AJ/Tj/I+fuHzX+WdP3n5O/5Uf5h/5aYf8/px /kfP3D5r/LOn7z8lW2/JvzXaSia3v0hkX9tCVNPobBLsbORuB827B7Q48UuLHKUZeVpTN531TSr+ ewuvS1AWzGNplBiZmH2htUbHb7OaSWmHR73Se2GogKyRE/8AYn7NvsR0X5k6UVBmtp0bwTi/6ymU nSy73c4/bPTkeqEx7qP6Qj7DznpV/MIbZW9Q9BNJb24/4OeWJPxyvJiMBZ+wE/cC5Mfa3Sy2An/s R98gySbStbhsfr94LLS7E7i6vruPie/wCATBz7BswPzuMy4Y8U5dwH66ZZvaAiNiAA75SH6Lv5vP /MvnCxo1tp9zJqLdGuGQ21sP9SGrSyfOV+P+RmxwYZneQ4fLmfny+XzeR7S9oc2a4iW3l6Y/rPxN eSQ+XdDufMmq/UluViuWTlGZOjcSBxHSmx2zZ4cRlIRjzLzGbMIRM5cgy7/lR/mH/lph/wA/pzY/ yPn7h83W/wAs6fvPyd/yo/zD/wAtMP8An9OP8j5+4fNf5Z0/efk7/lR/mH/lph/z+nH+R8/cPmv8 s6fvPyd/yo/zD/y0w/5/Tj/I+fuHzX+WdP3n5O/5Uf5h/wCWmH/P6cf5Hz9w+a/yzp+8/J3/ACo/ zD/y0w/5/Tj/ACPn7h81/lnT95+TI/Jf5QnStSj1HVLhZ5ITWGBR8IPSpNTX/P6MvSdjTExLJVDo 4es7agYGOO7PXuem50rzLsVdirsVei/kz/x09R/4wJ/xPND279Efe7/sD65e56vnMvUPmPPRHzh2 KuxV2KuxV2KuxV2KuxV2KuxVhX5k+ebfQdMe1t3DancqViTY8Qdizew/z9tH2trxGJxx+o8/J3vZ HZ5lIZJfSOXmXz8zM7F2JZmJLMdySe+cu9UtxV2Kt8jQCuw3A+eKtYqidN1C506/gvbZuM8Dh0Py 6g07EbHCDW4QQCKL6S8oebNP8x6XHc27gTqAJ4SfiVgN87Ls/XDPGj9Y5/reL7R0BwSsfQeX6k9z YutdirsVdirsVdirsVdirsVdir0X8mf+OnqP/GBP+J5oe3foj73f9gfXL3PV85l6h8x56I+cOxV2 KuxV2KuxV2KuxV2KoLV9a03SLQ3eoTCGEftHufAZi6nV48AuZ5uVpdHkzmoDk8x80fnZGUe30CEl jUfW5QQB7quzffTNBqu2Zz2gOEd/X9j0Ok7EhDfIeI93T9rym9vbu9uXuruVpp5DV5G6n/PwzSEu 8AUMVdirsVdirsVdiqYaLrup6LereafMYpR9ofssPBh3yUJmJsGixnASFSFgvXPLn51aVcosWsxm 0nAoZVBaMn6Nx9Ob7TduEbZBfmP1PP6nsIHfEa8j+t6PbXMF1Ak8DiSKQVRx0Izf4c0ckRKJsF5/ NhlikYyFEKuWtTsVdirsVdirsVdirsVei/kz/wAdPUf+MCf8TzQ9u/RH3u/7A+uXuer5zL1D5jz0 R84dirsVdirsVdirsVdirsVQWq6NpmrQCDUbdLmFTyCOKivjmNqNJjzVxi6cnTavJhJ4DVpV/wAq 78l/9WmD/gRmL/JGn7vtLl/yxqP532B3/Ku/Jf8A1aYP+BGP8kafu+0r/LGo/nfYHf8AKu/Jf/Vp g/4EY/yRp+77Sv8ALGo/nfYHf8q78l/9WmD/AIEY/wAkafu+0r/LGo/nfYHf8q78l/8AVpg/4EY/ yRp+77Sv8saj+d9gd/yrvyX/ANWmD/gRj/JGn7vtK/yxqP532B3/ACrvyX/1aYP+BGP8kafu+0r/ ACxqP532B3/Ku/Jf/Vpg/wCBGP8AJGn7vtK/yxqP532B3/Ku/Jf/AFaYP+BGP8kafu+0r/LGo/nf YHf8q78l/wDVpg/4EY/yRp+77Sv8saj+d9gT21tLe0t0t7aMRQxjiiLsAB2GZ2HDHHHhiKDgZs0s suKRsquWtTsVdirsVdirsVdirsVei/kz/wAdPUf+MCf8TzQ9u/RH3u/7A+uXuer5zL1D5jz0R84d irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVei/kz/x 09R/4wJ/xPND279Efe7/ALA+uXuer5zL1Dyj/lTOp/8AVxg/4B86b+XYfzS8v/IE/wCcHf8AKmdT /wCrjB/wD4/y7D+aV/kCf84O/wCVM6n/ANXGD/gHx/l2H80r/IE/5wd/ypnU/wDq4wf8A+P8uw/m lf5An/ODv+VM6n/1cYP+AfH+XYfzSv8AIE/5wd/ypnU/+rjB/wAA+P8ALsP5pX+QJ/zg7/lTOp/9 XGD/AIB8f5dh/NK/yBP+cHf8qZ1P/q4wf8A+P8uw/mlf5An/ADg7/lTOp/8AVxg/4B8f5dh/NK/y BP8AnB3/ACpnU/8Aq4wf8A+P8uw/mlf5An/ODv8AlTOp/wDVxg/4B8f5dh/NK/yBP+cHf8qZ1P8A 6uMH/APj/LsP5pX+QJ/zg7/lTOp/9XGD/gHx/l2H80r/ACBP+cHf8qZ1P/q4wf8AAPj/AC7D+aV/ kCf84O/5Uzqf/Vxg/wCAfH+XYfzSv8gT/nB3/KmdT/6uMH/APj/LsP5pX+QJ/wA4O/5Uzqf/AFcY P+AfH+XYfzSv8gT/AJwd/wAqZ1P/AKuMH/APj/LsP5pX+QJ/zg7/AJUzqf8A1cYP+AfH+XYfzSv8 gT/nB3/KmdT/AOrjB/wD4/y7D+aV/kCf84O/5Uzqf/Vxg/4B8f5dh/NK/wAgT/nB3/KmdT/6uMH/ AAD4/wAuw/mlf5An/ODv+VM6n/1cYP8AgHx/l2H80r/IE/5wd/ypnU/+rjB/wD4/y7D+aV/kCf8A ODv+VM6n/wBXGD/gHx/l2H80r/IE/wCcHf8AKmdT/wCrjB/wD4/y7D+aV/kCf84O/wCVM6n/ANXG D/gHx/l2H80r/IE/5wd/ypnU/wDq4wf8A+P8uw/mlf5An/ODv+VM6n/1cYP+AfH+XYfzSv8AIE/5 wZN5G8jXflu7up57qOcTxqgCKRShr3zXdo9oxzxAAqnZdndnS08iSbtmOap2zsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir/9k= + 256 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8ANs7x4t2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxVCajqC2lrcvGBPdQQSXCWgYK8gjFaDqaE7VpkJz4QepAumcIWR3XVofy3rttr2 iWmq244pcpyaOvIo42dCdq8WBHTI6fMMsBIdWWfEcczE9Ezy1qdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirEvzCsbpLO116wlNvf6PJz9YDkPq8l FmV1/aQbOw8Aab5ru0oyjDxIfVD7uodj2ZwSyeFk+ie3uPQsA8h+a28tebb3RdQjNppV/OWSNj8F vM5+Ehv99tsvLw4nbfNT2Z2hETr+Cf2H8bO17W7LyQ2kP3kPtH43e2Z07zLsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVU7i3hubeW3mUPDMjRyoej KwowPzBwSiCKPJMZEGw8mutBF3YNFNCLjUNO9WwuUY8TcRRtx4luzMoWWNj9lqHpXPNNVjOHNKF8 j+D+Oj7Jp8ce0NFDKP7wRr310P3juLIfy581NKo8vajMZLu3j56ddOOJubVSV3BrSWIqVkXsQetC c7HsftHxocEvrj+Px3jd8y7W7POGfEPpP4/HcdmeZu3TuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVhGrQi182XiDZL+CG7Hh6iVgk/4VIs4j2lw8 OYT/AJwfUfYPVcWGeI/wmx8ebGfMOkOlxFfWcotZvWWWC5rQQXeypI1dvTmoscv+xY/ZNdNptRLH ISjzj937OnxHV2vb/ZcckTMDY8/f3/Hkfge96D5R8ypr2mGV4zb6jbObfUrNtmhnTZlIO9Cemei6 LVxz4xMPkWr0ssMzEp5mW4zsVaJA67Yq16kfqenyHqU5cKitK0rTwxtaXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqxPzjHw1bRrkdWFzbMfZ0WX/mRnNe02O8U Zdxe19hs3DqzH+dH7t0DNDFPC8Mqh4pFKSIehVhQg5xQNPrE4CQIO4KSRXN3oVyPMqcpBYyR6b5m jFS0tqwH1S+I7uq/A57sD4nNt2P2h+Xz8J+ie4/SPhzHk+a+0HZPFGX86H3fwn9B83qcckcsayRs HjcBkdTUFSKggjxz0QG93zwil2KvMta8yw6nr0mpzyFfK/lgC64q1PrV2GKwU8ayKeHyr0YZpJ6s ZMhlf7rF9sujuxo5YsURX7zN9kUw/LC1vdRF75x1Qk3+rsY7ZN+MVrG1FRAexZfwB75kdnRM7zS+ qX3OJrpCNYo8o/ez3Nm692KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxVjHnenLRB+19fY070+pXIP6xmh9o/wDFv84PVexn/GhH+rL7kvzg32Vdoq6e+satBqBC6ZPo 8h1QnoI0kojN1pRXlplGqsRiY/Vx7fj5Oh7UEPE36wN+69v0oz8sHvH8jaWboksqMsLNsTCsjCIk b0+ACntnqnZxkcEeJ8Z14AzSpU86alKtvFo9q5S71LkJJFNGitVp60gPYnkEX3avbMXtnXeBhofV LYO09nOyjrNSAfojvJ5FrMVxqel6qlrGY9M026C8F2E13I62ttEP8mO3jL/M075y0dRUceEc5XI/ j8cy9Fr8QlqMuXlGHpHuG349z3jStPh07TLSwhFIrWFIUp4IoWv00zvccBCIiOgeAyTMpGR6orJs XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWIebZxNr+mWimv1W Ga7lHgXpDF949T7s5f2mzVCMO/d7r2E0xlqJZOkY/eg7i4htreS4mYJFEpeRj2VRU5xwFmn1PJMQ iZHkEBqthdHTtP8ALJ5Q615ulW81imz22nQ/EsJ8CAKeBbn45k9lab81qhX0Q2H6T+PJ8+7c15hi lI/XP7B0H483osMVvaWqRRhYba3QIi9FREFAPkAM9PAERXQPmhJJvqWA2ty2pXdzrUlT9dIFmD+x aR1EIoenOpkPu2ec9r6zx8xP8I2D7T7LdmfldKCfrnuf0Ie6061tvI3k21hUctT123ubzahYs0jO GPigCr9GYvZV5O0N+lD7Q892v6dIe8kn73peeovmzsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdiqhfX1pYWc15dyiG2gUvLI3QAfrPgO+RnMQBkdgGUIGZEQLJYLayX N3cXOq3SGK4vmDLCesUCCkMZ9wvxN/lE55v2nrPzGYy6dH272c7K/J6YRP1y3kidOsF1fzBb2UtB p9iF1DUmbZeKMfQjYnb45FLGv7KHxzVajL4eMkfVLYfp/Hm39p5bIxdPql7ug+J+5X8lM2uazq/n KYHhfyG00kN+zZW54givT1HFT7jO79mtB4GCzzP4P48nyb2g1vjZqHIfgfjzR3nm7YaXHpkTETat J9XJBoRABzuG/wCRYK/Nhmf2zqvBwGuctmPs72f+a1cYn6RufglSqqqFUAKBQAbAAZ50+5gUgtRf j5P8mTV3svMS20leiotxcREtT2UU+eZPZEuHtD38P+9fPO3Yf4NId0pD5cT0XPUXzN2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KtO6opdyFVQSzE0AA6knElWA3uoN5i vEu2BGj2z8tOhO3rOKj6y48N/wB2PD4upFOG7a7VOWXhw+gfa+p+yfs6MURqMo9Z+kd3mrO6ojO5 CqoJZj0AG5Oc892SALKhqcl1pn5cMYAV1zzncJDAv7Sx3I4xqe442y7+DMchpsR1GsEByh9//SX2 PE9pavhwzynnP7v+kftZrpOm2+maZa6dbCkFrEsSe4UUqfc9TnrWLGIRERyD5TkmZyMj1Ynq85vP NVy1SYtMhS0jHb1ZgJpiP9j6Q+jOM9pNRxZRD+aPvfTfYTRcOOeY/wARoOzm30BKNa5/4E8xRRjl Po+o2uq269wkpjqfb41lOHDPg1WOfeK+I/AeN7aw2MsfMS+f7belQTRzwRzxmscqh0PirCoz1gGx b5ERRpUwq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVks8MQBlkWMHoWIFfvyE8kYby IHvZQxyl9IJU/r9j/wAtEX/Br/XK/wA1i/nx+YbPy2X+bL5F31+x/wCWiL/g1/rj+axfz4/ML+Wy /wA2XyKB1rzFYabp0t0HS4lFEt7ZHXlLK54xoOvVjuew3yrPr8WOBlxA15t+m7PzZckYCJuRrkx6 3/MiCK20WK/iR9U1W7ktXit2okaxTtCZjzqwXYMK9q+GYuHtWMoQMq4p/Z73J1XZUseXJAcode/3 K/m7U1v5o9CtZA0EiibVJENR6FaJBUd5mBr/AJIPjmF252mIY+DGQTLu7nc+yvYZ1GfjyD0Q336l DAAAACgGwAziH2BCalAbuGLTxWuozw2bU/knkCSn6IyxwiXCDL+aCXA7TnWEgfxVH5nf7LTfzNNb 3n5n6NYO6R2uh2Mt8VJCp6s7eii9t1VQwzY+yOOImckyB7/x5vnntPkkYiEQT7vx5Ml+v2P/AC0R f8Gv9c9B/NYv58fmHiPy2X+bL5FgOjym5tXvj9q/mlu6/wCTNIWj+6PiM847QzeJnlLzfcPZ/TeD oscetX80dmG7lStYI59Xl02Y8bfzDY3GmSMegmCNLAx+S+rT3OVZ9oiY5wkJfr/Q6LtfDcgekwY/ pH++TD8utaiuPKNjFdypFeWIayuY3YBla3PpgGp/lAOemaDW45YY3IA13vjut0mQZZVEnfuZL9fs f+WiL/g1/rmZ+axfz4/MOL+Wy/zZfIu+v2P/AC0Rf8Gv9cfzWL+fH5hfy2X+bL5F31+x/wCWiL/g 1/rj+axfz4/ML+Wy/wA2XyLvr9j/AMtEX/Br/XH81i/nx+YX8tl/my+Rd9fsf+WiL/g1/rj+axfz 4/ML+Wy/zZfIu+v2P/LRF/wa/wBcfzWL+fH5hfy2X+bL5F31+x/5aIv+DX+uP5rF/Pj8wv5bL/Nl 8ivinglr6UiyU68WDU+7LIZYz+kg+5rnjlH6gQqZNi7FXYq7FXYq7FXYq7FXYq7FXzR+YPmjVNY8 w3sc0rLbW8rwxW4JCD02Kk077jOJ1GeWWZkXr8GEY4iIYrlLa7FWa/l9YpbxX/mK4WsdhE4gr3k4 1anvx2+nMPVSuoDq9H2FgEBPUS5QBr31+PmwyR2kdnYlmYklj1JOZgedlIk2Xs3kPSRp3ly3qKTX Q+sSn/XHwj6Fpmo1M+KZ8n0TsXS+Fp498vUfjy+xkWUO2W27Imu6G7/YF8gJPi8UiL/w7AZXmH7u XudZ2oPRH+uPuLzb88y5/MW9DVoIrcLXw9JTt9Ncz+yP7ge8vD9p/wB8fgwFRUgeObNwA9/0yEQa baQjpFDGg/2KAZo5myS+qaeHDjjHuiPuRWRbkJqSXBtvWtf97bV0ubSv+/YGEiD5Nx4n2OEAHY8j s4muwnJiIH1cx7xv+x5r+bGmW8PmRdZsR/uM8wQpqNqfBpR+9U/5QepI7VzN7NyE4+CX1QPD+p89 1+MCfEOU92FZsHBdirsVdirsVdirsVZF5J80anoet2rW8zfVpJVSeAklCrMATx8RluHNLHISjzDX lxRyRMTyfTqMHRXHRgCPpztomxbyEhRpdhQ7FXYq7FXYq7FXYq7FXYq+T/Mf/KQ6p/zFz/8AJ1s4 N7RLsVbVSzBQKk7ADFIFvVNW0m4sfJVjoVqnK91CaC14jqZpm5kV8OS0+WayOQHIZnkAS9rrsJ0+ gjiH1SIHxO5/Hc86uNPVNdl06F+SJdNBHJQ1IEhQGnvmfGdwEj3PIRxXk4B/Op7wiKiKiiiqAFA7 AdM0r6mAAKC7FKF1KCea0cW7cLqMrNayfyzQsJIj9DqMMa68nG1mDxcRiOfT3jcfaw/86oY9UOj+ brRCttqEH1W7Q9YrqBm5Rv8A5QqV/wBjlvZR4OLEecTfwP4+14LtSFkT79j5Efj7HmCmjA+BzcOr HN9BWMiyWVvIv2XiRh8ioOaKQ3L6thlcAfIK+BsdirHdf0A6x5e1DQkTlfacZNX0Gg3aJz/ptsvy Y8wO9R4ZKGXw8gn/AAy9Mv8Ael4/tfRUTEf1o/74fp+IeL5vHlHYq7FXYq7FXYq7FUTpv/HRtf8A jNH/AMSGKvrS3/3ni/1F/Vnc4voHueNyfUfeqZNi7FXYq7FXYq7FXYq7FXYq+T/Mf/KQ6p/zFz/8 nWzg3tEuxVkHkTSxqHmS2RhWK3rcS/KPcfe9BlGpnwwLtuxdN4upiDyj6j8P209r0q2juPOOhLKA yQvcThSK/GkDBT9BeuaPUyrDL4fe9d2oLMPeT9jyRPKvmqTW73W7fRb640iw1CX63qMNtNJbRejL ykDzKrRrxHWp2zeQ3xD+r+h4bFLh1AJ6T/S9azUPqDsVdiqUarZ2f1O+tL6o0PU6G+ZRya1uE2jv kXwWgEoHVd+xqd7Eo/XHl5j+b+p5/tfQAgzH0n6vL+l/xXl8XlTeRvNj69caFZaVdalqVupkMNhD JclodqTIIlYmNgwIanfNzhyxyREg8RlxmEuEvV/LKahDo0FlqVrNY6jYgW11Z3EbxTRsgHEOjhWB MZVtx3zV6iNTL6J2NnGTTRP830/L9lJrlLs3Yqh7pLpWgvLJgmoWUgntHPQsAQyNT9iRSUb2ONAg xPIuJrdN4sKH1Dce/wDbyec/mV5Xt0kj80aLERouqOfXgA+K0vK/vbeQD7PxV49vDalczQag/wB1 P64/aOheA1+m4Txgek8/I9Qlq/lT+aLKGXydrjKwqrDTbsgg9x+7zZOub/5VP+af/Um65/3Dbz/q nirv+VT/AJp/9Sbrn/cNvP8AqniqHv8A8t/zE060lvdQ8ravZ2cC8prmewuYokUd2d4wqj5nFWOY q7FUTpv/AB0bX/jNH/xIYq+tLf8A3ni/1F/Vnc4voHueNyfUfeqZNi7FXYq7FXYq7FXYq7FXYq+T /Mf/ACkOqf8AMXP/AMnWzg3tEuxV6V+U+n8bW91BhvI4gjPcBRyb7+S5r9bLcB7L2YwVCWTvNfr/ AEPQtMkEPmrQpiaK08sDH2ltpeP3uqjNZqReKXw+8O07UG0D/Sr5gvS/yOsbXUrP80PIV4SsNxfy zuu1RBrNsVqo26CPNvoJ8WCJ8vu2eD1kOHNIef37vK7NbyOJrW+XhqFlJJaX6VrxuLZzFMP+DQ0z Byw4ZEPovZ+p8bBGfUjf39VfK3MdirRAIodweoxVJmXUNG1CwvtLu/0fe6dIG0LVK0W3kdt7O5/m tJqlVr9gmh+A7XYspgeIf5w7/Meff3+95HtfsoRHFH6en9E939U9O4+TLfNHmSx81+n50gtxp+rq YtK88aOah7W9Wsdpdb7mKano8v8AUHUHMvURGSAnHf8AU4nYOsODMcU9hL7D+NkszXPcuxV2KoKb 0bJriWe3+uaNeqE1zTSKiSMUAnjHUSxDfbdgPELQSgZVRqY+k/o9xdN2nogQcgF/zh3jv94+35PV PyQ87ah5c8xWf5farfHUvLmqQNP5L1WQ1cKi8zZPJ0YCPeP6AOoVdlodX40TYqcdiHiNXpvCltvE 8n0Hma4jsVadEdGR1DIwIZSKgg7EEHFX5feZIIbfzFqtvAgjhhvLiOKNdgqrKwUD5AYqluKonTf+ Oja/8Zo/+JDFX1pb/wC88X+ov6s7nF9A9zxuT6j71TJsXYq7FXYq7FXYq7FXYq7FXyf5j/5SHVP+ Yuf/AJOtnBvaJdir23yRZC08r2CU+KRPWY+PqksP+FIzT6iVzL6R2Pi4NNAd4v57pjqjSxWou4V5 z2Mkd5Eo6s1u4l4/7IKV+nKgL2PXb5t3aGMzwyrmN/lv+x6H5N1uDQvzq0PVI5B+iPOlg2mSSfsG 5jpPauT4yCka/PJdi5DwyxnnEvD9rY/UJjlILvzw8stonnwatCpGneZY/UJH2Uv7ZAkq+3qwhHHi Vc5m6zHtxO19mtZROE9dx+n8eTBs172DsVdiqyWKOaJ4pVDxyAq6MKgqRQgjEGkSiJAg7gpLPa3q PKbVTcaraWjx+ixP+5TSNhNZymhrPbihjf7VOJHxLUXYs3hSv/JyO/8ARl3+4/e8T2r2cYS25jeP mO73x+0Ijy3q0Wo6erpL6zRfCZCAGdf2JGALAFl+0Adm5L2xz4uCXk9J2TrfzGEE/UNj+v4prlLs 3Yq7FUtn+upo11YWTmPU9AkXzB5YlH2l+ruHnhWlD8BNVXwYD9nGMvDzRydJemX6C8h2to+HigOX 1R/3w/HeH2J5P8y2fmfytpXmCz2g1O2juQla8GdauhPijVU/LN88mnGKuxV+YHmz/lKdZ/5jrn/k 82KpViqJ03/jo2v/ABmj/wCJDFX1pb/7zxf6i/qzucX0D3PG5PqPvVMmxdirsVdirsVdirsVdirs VfJ/mP8A5SHVP+Yuf/k62cG9ol6irAUrv08cUjm+hLWBbe1hgX7MKLGPkoAzRSNm31fHDhiI9wpU wM2obO51XyheeX7WRo9d8uyJqHl+VfthY2MlsUr3QhofbY98oM/Bzxy/wz2P6f1vIa/R7Sxd28fd 0/TF7vO9r+cv5K29/Y8I9YkiW6tA231fVrSoaNq/ZVnDRkn/AHW9e+dHKIkKeZwZpYpicecS8FtZ xPAkvBo2bZ4nFHRwaMjA9GVgQR45pZxMTRfUMGaOWAnHlIKuRbXYq7FULfpdCNLqyNNQsnFxZN/x YlfgP+TIpKN7E4QAdjyOxcTXafxcZA+obx9/7eXxY/qKW2h+cbXU7AcNA80wi6t0O3B5KGSOgHVJ GDU6KrNluCRyYjCX149nltDnGn1II/u8v3/sP3sqyl7R2KuxVC3ty9g9tq8aln0yUTyIBUvAQUuE p35RM1B40xMOMGP877+n2uu7TxcWLiHOG/w6/Y9s/wCcX9T9Ly7r3lBpOf8AhnU5Fs96/wCg3tbi 3P8Asm9Q5t9Nl48cZd4/tfO8+PgmY+b2jL2l2KvzA82f8pTrP/Mdc/8AJ5sVSrFUTpv/AB0bX/jN H/xIYq+tLf8A3ni/1F/Vnc4voHueNyfUfeqZNi7FXYq7FXYq7FXYq7FXYq+T/Mf/ACkOqf8AMXP/ AMnWzg3tENYKGvrZWFQZUBHsWGRlyLbgF5I+8PoLNG+rOxVQknu9PvbbWLFTJdWRPOBdjPbvT1Yf mQAy/wCUBglATiYHr9h73X9oaYziJR+uP2jqP1ebOPys84Wnk7z/ABRpOD5I/MBlmtJukdtqzDYH +UTj4SD+1TpxOZfZmoJiccvrht8Hhe0MAjLjj9Mvva/OPysfLnn6W6hXjpXmXne29OiXqU+tx/8A PSqzDxJfwy3WY/4g732a1vPCfeP0j9PzYfmA9a7FXYq7FWO+Y7eOfy3Poco4T2tw2oaBM3wpIZCW uLEuKUZ+TlF/aqFHTJ4iY5RkHIipfol+t4/tjRmNjpfFE+fWP6v2JnoN697o1ldSbySxKZD0qwFG P0kY5I1Ih6bRZTkwxkeZAR+Qcp2KtMqspVhVWFCD0IOKkWn3/OOmsHTPzWj0yRiI9W0mXTnB6tc6 TIGgY/8ARjxP05stIfqHnfz/AG2+a9p4fDyV3bfLl/safVuZjrnYq/MDzZ/ylOs/8x1z/wAnmxVK sVROm/8AHRtf+M0f/Ehir60t/wDeeL/UX9Wdzi+ge543J9R96pk2LsVdirsVdirsVdirsVdir5P8 x/8AKQ6p/wAxc/8AydbODe0QCMVdWBoQQQflimJo2+grO6ju7SC6i/u541kT5OAR+vNFIUafV8WQ TgJDlIWrYGbsVQEtvZG0utB1JuGg6u4MVx/ywX7GscwP7Mcj05dg3szZGYkCMkPrj/sh+v8AHR5z tTQgWf8AJz5/0Zd/uP3+96xomp6h+Z/5U6p5X1VR/wArF8nMjqrfamntwTbXC/5N1Fyicj+Ynaoz dRnHLCxyk8jjnPT5gf4on8fN5haXMd1aw3MX93MiyJXrRhXfNRIUafTsWQTgJDlIWrYGbsVdiqyW KKWNo5UWSNhRkYBlI9wcQaRKIkKIsNoiIioihUUUVVFAAOgAGKgACguxS7FXYql2j6m2hfmf5Z1U HjHHqtozv04xXgayu2r4emIRmbpD6vhX6R95eL9pMNZOLvr9R+6L7bzYvMOxV+YHmz/lKdZ/5jrn /k82KpViqJ03/jo2v/GaP/iQxV9aW/8AvPF/qL+rO5xfQPc8bk+o+9UybF2KuxV2KuxV2KuxV2Ku xV8n+Y/+Uh1T/mLn/wCTrZwb2iXYq9Y/LLWPrejNYyNWayai16mNySPuNR92azV46lfe937O6vxM PAecPuLMsxHoHYqsmhimieGVA8UilXRhUFSKEEYg0xnASBB3BQ2hea9Q8meatO8zKzSy6KEt9U6l rzQp3Ebc6btLaSFd+/wE98ytLPgnX8M/sl+14XtjQnHL3cvOP648vdRTnzHp9vpnm7zBp1qytZxX z3FmUpw+r3yJexBKbcVW54r8sGrjU/e9B7PZuPTAH+Ekfp/SgsxneOxV2KuxV2KuxV2KuxVi3nuC RrFZYfhmEcyxyDqpiC3lR9FmcyNPKj8R+r9LzntHivHGXvH++/3r7l0DVI9W0LTtVjp6eoWsN0lK 0pNGsgpX/WzbPDo7FX5gebP+Up1n/mOuf+TzYqlWKonTf+Oja/8AGaP/AIkMVfWlv/vPF/qL+rO5 xfQPc8bk+o+9UybF2KuxV2KuxV2KuxV2KuxV8n+Y/wDlIdU/5i5/+TrZwb2iXYqnPlLWzo+twXRJ 9Bv3dyB3jbr932voyrPj4407HsvWfl8wl/DyPu/G73BWVlDKQVIqCNwQc0z6UDbeKuxVLdc09ru0 YxJzmRJE9OoX1IpUMc0VTUDmh+E9m4t2yUD+Pudf2no/Hx0PqHL9I+P30hPLN9qt4Z/r8hnWzjtr G1unjaKSSG2j4xeop6PHEUjb/V6nrl+pnxUerrfZ7DLHGYI24u6k9zGeidirsVdirsVdirsVdiqX axaG7S1tgKm4uFtqeIuVa3PXbpLhEqBPcL+W7qu2IcWGv6Q+3b9L6X/5x61c6r+TPla4LcmhtDZt U1I+pyPbgGv+TEM3r5y9ExV+YHmz/lKdZ/5jrn/k82KpViqJ03/jo2v/ABmj/wCJDFX1pb/7zxf6 i/qzucX0D3PG5PqPvVMmxdirsVdirsVdirsVdirsVfJ/mP8A5SHVP+Yuf/k62cG9ol2KuxV7r5cs dT07QtFjvwTDqVhHfaVcHpLB9iVP9aGT4SP5Sh75rNXio8Q5F7n2f1/iY/Cl9UOXu/Z+pNcxHonY q7FXYq7FXYq7FXYq7FXYq7FXYqospfUtIjXdm1G1IH+pKJG/4VCcjM+iX9Uuu7UP7of1o/e9t/5x gueHlHX9FJodF8wX9tGu/wDdMUlQjtQl26ZutNPixxPfEPnWePDkkO4l7HlzU/MDzZ/ylOs/8x1z /wAnmxVKsVROm/8AHRtf+M0f/Ehir60t/wDeeL/UX9Wdzi+ge543J9R96pk2LsVdirsVdirsVdir sVdir5P8x/8AKQ6p/wAxc/8AydbODe0S7FXYq+4/KnkGPzn/AM46+VbWFlh1mxsxdaNdN0S4UuOD kb+lKp4OPA16gZGcBIUW/TaiWHIJx5h5FDJKfUjnha2u7eRoLy1k2khmjPGSN/dT9/XpmmyQMTRf TNJqo58YnHkfs8lTIOQ7FXYq7FXYq7FXYq7FXYq7FXYqoW2p6dYau2r6i/DTvL8DXUpG5e5uFaG3 iQGlWKGQ0+WV5oSlHgj9UzXwG5/Q6HtbUxjIA8oeo+87Aff9j3f/AJx68peY9L0jWPMevwixuvNd zHfRaQOXK2iRCqeoWofUdTVh226GoG80+Hw4CHOnh82XxJmXe9ay5qfmB5s/5SnWf+Y65/5PNiqV YqidN/46Nr/xmj/4kMVfWlv/ALzxf6i/qzucX0D3PG5PqPvVMmxdirsVdirsVdirsVdirsVfJ/mP /lIdU/5i5/8Ak62cG9ol2KuxV95/846fmD5Nuvyn0Ow/S1rb3+lwm1vrS4mjiljdXah4uQSrrurD b6QRiqTfnd5c8v3bv5y8uahZTanEgXWtNhuIS95BGKLLEob4riFRQDq6fD1CjKM+HjHm7bsntM6a e/0HmP0vK7e4huIEngcSQyAMjruCDmpIINF9DhOM4iUTYKpgZOxV2KuxV2KuxV2KuxV2KoTVNStt NsZby4NI4xsKgFmOyqK9yclCJkaDRqdRHDjM5cgn35DeUdJ8yalF5p8239rBoem3LXGm6bcSxoby /NA13IkhB9GEKqQgjen+ty2mHAIni6/o/G583zfWauWaRJ77/H3DyfUX+LPKv/V5sf8ApJh/5qzI cNC6p5/8kaXp8+oX2vWENrbIXlf6xExoOwVWLMx6BQKk9MVfmxrd7Ffa1qF9ECsV1czTxhvtBZJC wrTvQ4qgcVROm/8AHRtf+M0f/Ehir60t/wDeeL/UX9Wdzi+ge543J9R96pk2LsVdirsVdirsVdir sVdir5P8x/8AKQ6p/wAxc/8AydbODe0S7FXYq7FXYqyvyT5zk0aYWl2S+mytv3MTH9pR4eI+73xt Rg49xzd72P2udOeCe+M/Z5/rH4PXIZopokmhcSRSAMjqagg7ggjNURT3kJiQBBsFfiydirsVdirs VdirsVU554beF553EcMYLO7GgAHc4QCTQYzmIAykaAeP+c/N8mt3fpW9U0+EkQqdix6FyPf9X05t MGDgG/N8/wC1+1DqZ1H+7jy8/NjOZLpnYq7FXYq7FUTpv/HRtf8AjNH/AMSGKvrS3/3ni/1F/Vnc 4voHueNyfUfeqZNi7FXYq7FXYq7FXYq7FXYq+T/Mn/KQ6p/zFz/8nWzg3tEuxV2KuxV2KuxVk/lL zveaIwt5gbjTmNWir8SV6mMn9XQ+3XMfPpxPfq7rsvtiem9J9WPu7vd+p6tpesadqtsLixmWVP2g PtKfBl6g5q54zE0XudNqseePFA2EbkXIdirsVdirsVQOq61pulw+reTBKglIxu7U8F/j0HfJwxmX JxtVrMeCNzNfe8n81+c77XH9FawWCmqQA/ap0Lnuf1Zs8OnEPe8J2n2vPUmh6Yd362N5kOodirsV dirsVdiqJ0wE6laACpM0YAH+sMVfWlv/AHEf+ov6s7nF9I9zxuT6j71TJsXYq7FXYq7FXYq7FXYq 7FXlPnn8nZtT1KTUdGlSN5zWa3fZa/zA9s57V9kz4ice4PR3um7TjwgT5jqxj/lR3m7+e3/4PMT+ S8/837Q5P8pYe/7C7/lR3m7+e3/4PH+S8/8AN+0L/KWHv+wu/wCVHebv57f/AIPH+S8/837Qv8pY e/7C7/lR3m7+e3/4PH+S8/8AN+0L/KWHv+wu/wCVHebv57f/AIPH+S8/837Qv8pYe/7C7/lR3m7+ e3/4PH+S8/8AN+0L/KWHv+wq9n+TnnmynWe1uYoJV6OkhU/LbBLsnMRRj9obcPbEMcuKEiD8UK/5 h6zo9/Np+opDqJtm4PNETGSwHxb047Hb7OaSeij0NPW6b2lyxHrAl9h/V9iaQfmroTAetb3ETd+I R1+/kp/DKDopdCHaw9psB+oSHy/Wj7f8w/Lc7hI5HDN05hUH3uyjIS00w5A7f0x6n5MktbTzFexL LZaPM8LiqzyTWyRkfMSu/wBy5hyz4o7GW/uP6m3+VgR6YSPyA+/9DGfM3me00gPDdapBJeDb6hpH 79wfCS8lURR+4WJmzJwQlk3jEgd8tv8AYjf7Q6fWduzGwIH9Xc/6Y7fY8t1bWLnUZ2dwI0Y19MFm JI6F3cs7n/WO3ag2za48QiHl82eWQ3Isr038oPMWpWMN9Zz28ltcIHjfkRsRXoaHNhi0GXJHiiLH vDr8utxwlwyO/uRP/KjvN389v/weWfyXn/m/aGv+UsPf9hd/yo7zd/Pb/wDB4/yXn/m/aF/lLD3/ AGF3/KjvN389v/weP8l5/wCb9oX+UsPf9hd/yo7zd/Pb/wDB4/yXn/m/aF/lLD3/AGF3/KjvN389 v/weP8l5/wCb9oX+UsPf9hd/yo7zd/Pb/wDB4/yXn/m/aF/lLD3/AGFkXkz8mLmx1SK/1mZHFuwe K3j3BYdCW9sydN2TMyvJtFx9R2pARqG5et50boXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FWH/mR51tvLujyRxuG1G5UpbxdSCR9ojwH+fbNV2nrRjjwR+o/YHZdnaQzlxn6R9r5wkkeSRpJG LO5LOx6kk1JzmHoluKuxVXhvr2CGSGG4kihmFJo0dlVx4MAaH6ciYAmyGQkQKBUMkxdir1r8mvPM Vv8A86/qEnFGJaykbpU7lCf8/wAM2vZmsGOXDL6T9hdb2jpDkHFH6h9z2fOneddirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqjc3lraxmS4lWJACasQNh1yvJmhAXIgM8eKUzU Rbzzzd+c2kWCPb6NS+u+glH90p8eXf6PwzTartgcsfz/AFO203ZfXJ8nieravqGrXr3t/MZp5OpP QDwA7DNDKRJs83dRiAKCDwJdirsVdirsVdiq5HdHV0Yq6kFWBoQRuCCMVep+SPzlls447DXw0sK0 VLxd2A/yx/TNpo+05YvTL1R+0Ou1XZ0cnqjtJ63pPmHRtWgWawu45lboFYVrStKeOb/DrMWT6Tv3 dXSZtLkx/UNkxzJcd2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KsQ86fl5B5omj ea/mt0j39JKFSaAVINfDb6c1Os7MOafFxU7LS9oeFDh4bYx/yoLSv+rnP/wKf0zF/kQ/zvs/a5P8 rj+b9rv+VBaV/wBXOf8A4FP6Y/yIf532ftX+Vx/N+13/ACoLSv8Aq5z/APAp/TH+RD/O+z9q/wAr j+b9rv8AlQWlf9XOf/gU/pj/ACIf532ftX+Vx/N+13/KgtK/6uc//Ap/TH+RD/O+z9q/yuP5v2u/ 5UFpX/Vzn/4FP6Y/yIf532ftX+Vx/N+13/KgtK/6uc//AAKf0x/kQ/zvs/av8rj+b9rv+VBaV/1c 5/8AgU/pj/Ih/nfZ+1f5XH837Xf8qC0r/q5z/wDAp/TH+RD/ADvs/av8rj+b9rv+VBaV/wBXOf8A 4FP6Y/yIf532ftX+Vx/N+1MdB/Jyy0fUor6DU7gtHUFPhAYEUoaAZKHYpBB4vsYy7WBBHD9r0XN8 6Z2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kv//Z - + - uuid:82D8E573DAAFE111BF0B8F740ADF4EE3 - uuid:8ccac4a0-f819-bd4b-9966-e33d3f17e366 - + uuid:82D8E573DAAFE111BF0B8F740ADF4EE3 + uuid:fed863d5-f31d-c147-a8e3-4d6e65e58507 + proof:pdf + uuid:b1ac9fe8-11a3-4422-b8f3-ae4b8085b7a8 uuid:5D20892493BFDB11914A8590D31508C8 - + @@ -46,18 +47,18 @@ Print - 1 - False - False - + xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"> + 1 + False + False + 114.000000 114.000000 Pixels - - + + Cyan Magenta @@ -66,505 +67,505 @@ PANTONE 485 CVC PANTONE 152 CVC - - + + - Default Swatch Group - 0 - + Default Swatch Group + 0 + - White - RGB - PROCESS - 255 - 255 - 255 + White + RGB + PROCESS + 255 + 255 + 255 - Black - RGB - PROCESS - 35 - 31 - 32 + Black + RGB + PROCESS + 35 + 31 + 32 - CMYK Red - RGB - PROCESS - 236 - 28 - 36 + CMYK Red + RGB + PROCESS + 236 + 28 + 36 - CMYK Yellow - RGB - PROCESS - 255 - 241 - 0 + CMYK Yellow + RGB + PROCESS + 255 + 241 + 0 - CMYK Green - RGB - PROCESS - 0 - 165 - 81 + CMYK Green + RGB + PROCESS + 0 + 165 + 81 - CMYK Cyan - RGB - PROCESS - 0 - 173 - 238 + CMYK Cyan + RGB + PROCESS + 0 + 173 + 238 - CMYK Blue - RGB - PROCESS - 46 - 49 - 145 + CMYK Blue + RGB + PROCESS + 46 + 49 + 145 - CMYK Magenta - RGB - PROCESS - 235 - 0 - 139 + CMYK Magenta + RGB + PROCESS + 235 + 0 + 139 - C=15 M=100 Y=90 K=10 - RGB - PROCESS - 190 - 30 - 45 + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 - C=0 M=90 Y=85 K=0 - RGB - PROCESS - 238 - 64 - 54 + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 238 + 64 + 54 - C=0 M=80 Y=95 K=0 - RGB - PROCESS - 240 - 90 - 40 + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 240 + 90 + 40 - C=0 M=50 Y=100 K=0 - RGB - PROCESS - 246 - 146 - 30 + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 246 + 146 + 30 - C=0 M=35 Y=85 K=0 - RGB - PROCESS - 250 - 175 - 64 + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 250 + 175 + 64 - C=5 M=0 Y=90 K=0 - RGB - PROCESS - 249 - 236 - 49 + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 236 + 49 - C=20 M=0 Y=100 K=0 - RGB - PROCESS - 214 - 222 - 35 + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 214 + 222 + 35 - C=50 M=0 Y=100 K=0 - RGB - PROCESS - 139 - 197 - 63 + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 139 + 197 + 63 - C=75 M=0 Y=100 K=0 - RGB - PROCESS - 55 - 179 - 74 + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 55 + 179 + 74 - C=85 M=10 Y=100 K=10 - RGB - PROCESS - 0 - 147 - 69 + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 147 + 69 - C=90 M=30 Y=95 K=30 - RGB - PROCESS - 0 - 104 - 56 + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 - C=75 M=0 Y=75 K=0 - RGB - PROCESS - 41 - 180 - 115 + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 41 + 180 + 115 - C=80 M=10 Y=45 K=0 - RGB - PROCESS - 0 - 166 - 156 + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 166 + 156 - C=70 M=15 Y=0 K=0 - RGB - PROCESS - 38 - 169 - 224 + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 38 + 169 + 224 - C=85 M=50 Y=0 K=0 - RGB - PROCESS - 27 - 117 - 187 + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 27 + 117 + 187 - C=100 M=95 Y=5 K=0 - RGB - PROCESS - 43 - 56 - 143 + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 56 + 143 - C=100 M=100 Y=25 K=25 - RGB - PROCESS - 38 - 34 - 97 + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 97 - C=75 M=100 Y=0 K=0 - RGB - PROCESS - 101 - 45 - 144 + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 101 + 45 + 144 - C=50 M=100 Y=0 K=0 - RGB - PROCESS - 144 - 39 - 142 + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 144 + 39 + 142 - C=35 M=100 Y=35 K=10 - RGB - PROCESS - 158 - 31 - 99 + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 - C=10 M=100 Y=50 K=0 - RGB - PROCESS - 217 - 28 - 92 + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 217 + 28 + 92 - C=0 M=95 Y=20 K=0 - RGB - PROCESS - 236 - 41 - 123 + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 236 + 41 + 123 - C=25 M=25 Y=40 K=0 - RGB - PROCESS - 193 - 180 - 154 + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 193 + 180 + 154 - C=40 M=45 Y=50 K=5 - RGB - PROCESS - 154 - 132 - 121 + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 154 + 132 + 121 - C=50 M=50 Y=60 K=25 - RGB - PROCESS - 113 - 101 - 88 + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 113 + 101 + 88 - C=55 M=60 Y=65 K=40 - RGB - PROCESS - 90 - 74 - 66 + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 90 + 74 + 66 - C=25 M=40 Y=65 K=0 - RGB - PROCESS - 195 - 153 - 107 + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 195 + 153 + 107 - C=30 M=50 Y=75 K=10 - RGB - PROCESS - 168 - 124 - 79 + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 168 + 124 + 79 - C=35 M=60 Y=80 K=25 - RGB - PROCESS - 138 - 93 - 59 + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 138 + 93 + 59 - C=40 M=65 Y=90 K=35 - RGB - PROCESS - 117 - 76 - 40 + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 40 - C=40 M=70 Y=100 K=50 - RGB - PROCESS - 96 - 56 - 19 + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 56 + 19 - C=50 M=70 Y=80 K=70 - RGB - PROCESS - 59 - 35 - 20 + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 59 + 35 + 20 - PANTONE 485 CVC - SPOT - 100.000000 - CMYK - 0.000000 - 100.000000 - 91.000000 - 0.000000 + PANTONE 485 CVC + SPOT + 100.000000 + CMYK + 0.000000 + 100.000000 + 91.000000 + 0.000000 - PANTONE 152 CVC - SPOT - 100.000000 - CMYK - 0.000000 - 51.000000 - 100.000000 - 0.000000 + PANTONE 152 CVC + SPOT + 100.000000 + CMYK + 0.000000 + 51.000000 + 100.000000 + 0.000000 - + - Print Color Group - 1 - + Print Color Group + 1 + - C=0 M=30 Y=70 K=0 - RGB - PROCESS - 252 - 186 - 99 + C=0 M=30 Y=70 K=0 + RGB + PROCESS + 252 + 186 + 99 - C=5 M=70 Y=90 K=0 - RGB - PROCESS - 231 - 110 - 52 + C=5 M=70 Y=90 K=0 + RGB + PROCESS + 231 + 110 + 52 - C=5 M=90 Y=75 K=0 - RGB - PROCESS - 228 - 64 - 68 + C=5 M=90 Y=75 K=0 + RGB + PROCESS + 228 + 64 + 68 - C=30 M=0 Y=95 K=0 - RGB - PROCESS - 190 - 214 - 58 + C=30 M=0 Y=95 K=0 + RGB + PROCESS + 190 + 214 + 58 - C=60 M=5 Y=95 K=0 - RGB - PROCESS - 116 - 182 - 74 + C=60 M=5 Y=95 K=0 + RGB + PROCESS + 116 + 182 + 74 - C=30 M=0 Y=10 K=0 - RGB - PROCESS - 174 - 222 - 228 + C=30 M=0 Y=10 K=0 + RGB + PROCESS + 174 + 222 + 228 - C=60 M=10 Y=5 K=0 - RGB - PROCESS - 87 - 182 - 221 + C=60 M=10 Y=5 K=0 + RGB + PROCESS + 87 + 182 + 221 - C=80 M=5 Y=10 K=0 - RGB - PROCESS - 0 - 176 - 216 + C=80 M=5 Y=10 K=0 + RGB + PROCESS + 0 + 176 + 216 - + - Grayscale - 1 - + Grayscale + 1 + - K=100 - GRAY - PROCESS - 255 + K=100 + GRAY + PROCESS + 255 - K=90 - GRAY - PROCESS - 229 + K=90 + GRAY + PROCESS + 229 - K=80 - GRAY - PROCESS - 203 + K=80 + GRAY + PROCESS + 203 - K=70 - GRAY - PROCESS - 178 + K=70 + GRAY + PROCESS + 178 - K=60 - GRAY - PROCESS - 152 + K=60 + GRAY + PROCESS + 152 - K=50 - GRAY - PROCESS - 127 + K=50 + GRAY + PROCESS + 127 - K=40 - GRAY - PROCESS - 101 + K=40 + GRAY + PROCESS + 101 - K=30 - GRAY - PROCESS - 76 + K=30 + GRAY + PROCESS + 76 - K=20 - GRAY - PROCESS - 50 + K=20 + GRAY + PROCESS + 50 - K=10 - GRAY - PROCESS - 25 + K=10 + GRAY + PROCESS + 25 - K=5 - GRAY - PROCESS - 12 + K=5 + GRAY + PROCESS + 12 - + - + @@ -593,15 +594,22 @@ - endstream endobj 2 0 obj <> endobj 18 0 obj <> endobj 93 0 obj <> endobj 94 0 obj [/View/Design] endobj 95 0 obj <>>> endobj 19 0 obj [/View/Design] endobj 20 0 obj <>>> endobj 92 0 obj [93 0 R] endobj 5 0 obj <>/ArtBox[0.0 0.0 114.0 114.0]/Group 73 0 R/MediaBox[0.0 0.0 114.0 114.0]/Thumb 107 0 R/TrimBox[0.0 0.0 114.0 114.0]/Resources<>/Properties<>/ExtGState<>>>/Type/Page/LastModified(D:20120604143053-07'00')>> endobj 103 0 obj <>stream + endstream endobj 2 0 obj <> endobj 5 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 117 0 R/TrimBox[0.0 0.0 114.0 114.0]/Type/Page>> endobj 111 0 obj <>stream H‰ì—KŽ$5†÷y _ Ü¿½¥@#!5õ‚”xõŒ4´šÛóývVV °F jѕi§Ï/Âî§oÏîéùÜ_žÝöt~ îò悷lü֘ù՜{»|؞Þñù§·-¸àÌòüûõ‡íÇíãv›8í³ß»saX{?:›s#ù̵âCÉ]ÞÏeï·S3ßSáý•÷äKk¼ŸZö£Äúlv&o%ºËvL”è;â^ïf²¯ ƒvY§R}ÈÅ]õ\ÇÈȼõzÌ #7f´fx |É÷ŠŒ}ÊR|-‰aö9V‰`&Õ~̼Ιn嘑p“Œ[·»qñqzr7QKw7X¥ç¡bÙaÅ·t[ñ:g¢|¿î1b!åW™wã¥ô˜Ø­:ìV*OµbŒ{O£yS°öàÄä{­·ØÅÌø>Þá.Òæ[¶c¬¬¦#s×ÑÊìeÛÇ+õ¯×ácÉYÀ]@ò»-øìÞñ[Üï.»g÷@ðà?ˆàÏÛ 2ëìÏ°7SAxð©Ýá$iÚ"‡šùÈw¼ai¶v³âT:o‘òº4;„íÃ0·®÷y,Dö‰ì“)`KR"äq¸«¦}ÈþeÊ>V²§¡û8\ń«…Aµ8–óË÷rþfK”åÿ4&a6˜‘1¹$u, ÍÅêkÅä#"°ŸTðÙ\÷]]£úÎQƒï¢}xú¬âk•¯>w—Úì 5™Yسk¤ÖÑXBQæ±°ã^~‡”fmÊæe‹4%™ñ1)£¹Â–ž¦¥©»ÚÑ'7IeÆqzaˆÉ˜ÖA³4œuä ZJZËކa”q©8¢òu1‚BÖ£S]<†¬E§>bâؐp"vq =…ˆ× 4Obrò±WÑä2 ˆš:®VŽÙ‚ øc"`8G01»ã)öÒÄ3ўþö͐Ì.lîѱOÔ ÛêjèF! Õf‡°ŒaDõ‚°“|Y<ðQ‘N³áE2 D”Fd—­#¸U<¤Z`#ëצ…(Âõ´2DJ†65ˆ8H&™UÌЁ•}Âg$2?¨å“¤LsëÓ eŸ0“§Ò&å•(FGöˆÞHÎäÏÜAMwŽZs¿ð÷µ{àüÀù?‰óћãß÷f® bŒ<•Â=ã€9ûG§Ìt–p]E ޓڀ™ÐÜCNx9'ÝPºŽ G$‹ ÇDp&˯¡ØPó˜›4§Å3|鄉’ÉlÀ #…hlhçœëÂÙE/y•SA?8&lì•ô"ä {±´¾ª¤RLW -€»TÃbåh&ÇI0«TE[Dü“u“ëdy(¥#O0â<©`¾á\äÁ™JU“ʲJ7CB%pc,ž;i¯Â\5ß¹%ÂlÆâOÔV4“w] ÑQ¨`tÑo¶©¾¡¹Ï&3™{d"Ì& šHp@s+oºvâ®+cS™…~õ\ÔbºÐª‚v`U, óC³¸ m³)´É¬Ú–Rj A€qz„©UŽ¶–æE7¨ èÊ%EÞ×¼˜ÕZ¿‹ÓO{ÛÕ8õóÿp„>ýWº:éWÏgÇã‹„ endstream endobj 73 0 obj <> endobj 107 0 obj <>stream -8;T`p_%?Z%#Qh!kGhIauV3no3/gB endstream endobj 96 0 obj <> endobj 97 0 obj [/ICCBased 98 0 R] endobj 99 0 obj [/Separation/PANTONE#20152#20CVC 100 0 R<>] endobj 102 0 obj [/Separation/PANTONE#20485#20CVC 100 0 R<>] endobj 100 0 obj [/ICCBased 101 0 R] endobj 101 0 obj <>stream +€»TÃbåh&ÇI0«TE[Dü“u“ëdy(¥#O0â<©`¾á\äÁ™JU“ʲJ7CB%pc,ž;i¯Â\5ß¹%ÂlÆâOÔV4“w] ÑQ¨`tÑo¶©¾¡¹Ï&3™{d"Ì& šHp@s+oºvâ®+cS™…~õ\ÔbºÐª‚v`U, óC³¸ m³)´É¬Ú–Rj A€qz„©UŽ¶–æE7¨ èÊ%EÞ×¼˜ÕZ¿‹ÓO{ÛÕ8õóÿp„>ýWº:éWÏgÇã‹„ endstream endobj 73 0 obj <> endobj 117 0 obj <>stream +8;U$#_%"1&$j/X/fu%13R#,8HFgB_s89K`?FeEuFC;QNE6S:W:b,5@mF*nBB*PK@n?^kC*918@j%$8X"Zp\\/(F%b!+q~> endstream endobj 118 0 obj [/Indexed/DeviceRGB 255 119 0 R] endobj 119 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 109 0 obj <> endobj 120 0 obj [/View/Design] endobj 121 0 obj <>>> endobj 116 0 obj <> endobj 113 0 obj [/ICCBased 122 0 R] endobj 114 0 obj [/Separation/PANTONE#20152#20CVC 123 0 R<>] endobj 115 0 obj [/Separation/PANTONE#20485#20CVC 123 0 R<>] endobj 123 0 obj [/ICCBased 124 0 R] endobj 124 0 obj <>stream H‰””uTÔKÇtKˆ”ˆKJI,‚t(݋»4ìKÇÒÝ%Ò¹´H—4J#‚Ò’‚(H w¹÷þqÏyïyßó~Ï3çù̙gÎ<3ó̄Y9El @¸ ]äÕ!OÔÌ-@ãÀà\€ˆ¹¥+BVKK Àè:øOX×~òþ¿ÿWCa®–iHKL€…À0qÍY¦–Ë `ø5àcü€Âæk–Ë @@ -2041,7 +2049,7 @@ p`+gQ °d *¨°>7 º8P°W% \ò² h¢`3‚^l:®9º3â Ðc<…ÍxWo67µü!ÌõúÊʺî¡Ìó·[ñЈZÙÒI‘ü4Ÿz{z?cŸvTäg‹„‚C |Þ®ø¸˜Xî.þqDh\â1ÓyâXǶC>¨M|;…“egA¸ ¨ð:܂ 8XJæ[7XôIÐ|0|ÿ—ú›¤N‹7€¿ áõw[{çEkvËàŠcàJȬÅþìÈýi%J-žöQ–#¿u¯Ý|FBòËéѵµ<~ÐÔ V©Tõwž|“„ä_¥JvV’—{J,Î͓ɯ)›ál/`¯ ¤ûùR|Vx¯ð¡®fmß „œ96 þpL1c½ÐÆ3Y0†Ïߜ,‡§/ÿ–™N‹ÎPà[@õ¶Q†t´+eK¢TÙeæ9ۏ-pó -âÈ®|BpWãù©×$ˆ ¨ï¿%IHþOÞ¿y­Óé:ß~0?_(g¦‰D¢ô,ñ™¢rE}K¾cШ+)ÊJ_*=ˆÍI,€?!ñ4Ðl=ŗ[ P½Õ®¿=¸м [˜Í÷þö ©}gö˜… OZO$oê!xLõá=é¥5ØdbBCö) ÉO¡Õ´¶>ñRÛIðrþ\šš’r"#;¯@V©2[ƒÙk©þ«‚˜›cç›Ìlz½Œi5a#*¹XÝmþ?”;¼6ñ2.Þ#œ:ĉ֙Li­Ã’¿«ßÌðü_8L+ endstream endobj 98 0 obj <>stream +âÈ®|BpWãù©×$ˆ ¨ï¿%IHþOÞ¿y­Óé:ß~0?_(g¦‰D¢ô,ñ™¢rE}K¾cШ+)ÊJ_*=ˆÍI,€?!ñ4Ðl=ŗ[ P½Õ®¿=¸м [˜Í÷þö ©}gö˜… OZO$oê!xLõá=é¥5ØdbBCö) ÉO¡Õ´¶>ñRÛIðrþ\šš’r"#;¯@V©2[ƒÙk©þ«‚˜›cç›Ìlz½Œi5a#*¹XÝmþ?”;¼6ñ2.Þ#œ:ĉ֙Li­Ã’¿«ßÌðü_8L+ endstream endobj 122 0 obj <>stream H‰œ–yTSwÇoɞ•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)뫔ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= @@ -2050,77 +2058,68 @@ H N'çÎ)Î].ÂuæJ¸rî î÷ wšGä xR^¯‡÷[ÞoƜchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ -¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûۀÜ܊ÝݖÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 105 0 obj [/Indexed/DeviceRGB 255 106 0 R] endobj 106 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 74 0 obj [/ICCBased 98 0 R] endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <>stream -%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.0 %%For: (Jamie Zawinski) () %%Title: (iSaverRunner.ai) %%CreationDate: 6/4/12 2:30 PM %%BoundingBox: 0 -10 117 114 %%HiResBoundingBox: 0 -9.4248 116.3867 114 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 406 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%DocumentCustomColors: (PANTONE 152 CVC) %%+ (PANTONE 485 CVC) %%CMYKCustomColor: 0 0.51 1 0 (PANTONE 152 CVC) %%+ 0 1 0.91 0 (PANTONE 485 CVC) %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_TemplateBox: 57.5 56.5 57.5 56.5 %AI3_TileBox: -231 -299 345 435 %AI3_DocumentPreview: None %AI5_ArtSize: 114 114 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -12 117 8 1190 1089 18 1 0 339 90 1 0 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 100 10 100 10 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 84 0 obj <>stream -%%BoundingBox: 0 -10 117 114 %%HiResBoundingBox: 0 -9.4248 116.3867 114 %AI7_Thumbnail: 124 128 8 %%BeginData: 28588 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C453D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373737FD04FF363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637A9FFFFFF37373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D3737373D3737373D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D3737373D3737373D373737 %3D3737373D3737373D37AFFFFFFF36373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %3637363736373637363736371437A9FFFFFF3D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D37AFFFFFFF3637363736373637 %363736373637363736373637363736373637363736373637363736373637 %36373637363D2F3037373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %36373637363736373637363736373637363736373637A9FFFFFF3D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737372F003D373D3737373D3737373D3737373D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D3737373D373737AFFFFFFF %363736373637363736373637363736373637363736373637363736373637 %36373637363736373637363730280E050D37363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %A8FFFFFF3D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D05280600363D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373737FD04FF3637363736373637363736373637363736373637363736 %3736373637363736373637363736373637363737362027F8063737363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37363736373637A9FFFFFF37373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D374C6820F82F %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D37AFFFFFFF363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363D0D %8C6826F83637373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736371437A9FFFFFF3D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373745B5694A053D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D37AFFFFFFF36373637363736 %373637363736373637363736373637363736373637363736373637363736 %3736373637363737288CB04426053D373736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %3736373637363736373637363736373637363736373637A9FFFFFF3D3737 %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D0D69B0B54A26073D3737373D3737373D3737 %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D373737AFFFFF %FF3637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363721B08D8D26200D3D3637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37A8FFFFFF3D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D374C8CB5B06F4A27373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373737FD04FF36373637363736373637363736373637363736373637 %36373637363736373637363736373637363736373637363D0C8D8DB58D4B %26063737363736373637363736FD04373D36373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37363736373637A9FFFFFF37373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373668B5 %8DB58D6F202F3737373D3737373D3737372F3636063D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D37AFFFFFFF363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %370E6F8DB08DB04474F8363737363736373637372FF837F8063737363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736371437A9FFFFFF3D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D4BB58DB5B0B04A75053D373D373D373D3736F8360CF8373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D37AFFFFFFF36373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637154C8CB08DB5B069744A0D3736373637363721270E %F8063D363736373637363736373637363736373637363736373637363736 %3736373637363736373637363736373637363736373637A9FFFFFF3D3737 %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D373D27B5B0B58DB58D7598273737373D373D %28682F06F8363737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D373737AFFFFF %FF3637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363715288CB58DB08DB044C1203037 %3736370E454406F827143736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37A8FFFFFF3D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D28B5B0B58DB5B04B %C14A0D3D373D372E8C4B044A0661373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373737FD04FF36373637363736373637363736373637363736373637 %36373637363736373637363736373637363736373637363737288CB58DB0 %8D8D4A9FF8FD04373644B0F8754A0D373736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37363736373637A9FFFFFF37373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D27B0 %8DB58DB5449F4A0D373D373D27B08D269F4B0E3D373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D37AFFFFFFF363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %370E4B8DB08DB5684A98F80E37363D0D68B08D4AC1203637373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736371437A9FFFFFF3D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373668B58DB5B04B9F75063D373D37288CB68D75C127363D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D37AFFFFFFF36373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637068D8DB08D8D4AC1F8FD04373644B08D8D4AC1F837 %373736373637363736373637363736373637363736373637363736373637 %36373637363736373637363736373637363736373637A9FFFFFF3D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D144BB0B5B0B544C16E06373D373D27B0B0B58D %75C127143D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D3737373D373737AFFFFFFF %363736373637363736373637363736373637363736373637363736373637 %3637363736373637363736373637152868B08DB56875BA260E3736370E45 %8DB58D8D4AC1203636373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %A8FFFFFF3D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D372F68B58DB5B04B9F99063D37 %3D372F8CB6B0B58D6FC14B0E3D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373737FD04FF3637363736373637363736373637363736373637363736 %37363736373637363736373637363736373637370E44B58DB08D8D4AC120 %303737363721B08DB58DB044C14A0D373736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37363736373637A9FFFFFF37373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373644B08DB58DB5 %44C19805373D373D0D6FB0B58DB5B06F9875073D373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D37AFFFFFFF363736373637363736373637363736 %37363736373637363736373637363736373637363736373637373620B08D %B08DB5694AC14A06373637372E68B58DB08DB568756E0637373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736371437A9FFFFFF3D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %27B5B0B58DB5B06974C12036373D373D27B5B0B58DB5B08D6EC1053D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D37AFFFFFFF36373637363736 %3736373637363736373637363736373637363736373637363736FD053736 %3D068CB0B58DB08DB044C174063737363D1469B0B58DB08DB58D4B982714 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637A9FFFFFF3D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D2F2F %3737373D0E69B0B58DB58DB56975C16E073D3737373668B58DB58DB58DB5 %689F26303737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D3737373D3737373D3737373D373737AFFFFFFF36 %373637363736373637363736373637363736371537363736373637363736 %3714212736F83737278CB58DB08DB5B0696EC120303737363D068D8DB08D %B58DB08D8D6E74053D373736373637363736373637363736373637363736 %3736373637363737373637363736373637363736373637363736373637A8 %FFFFFF3D373D373D373D373D373D373D373D373D373D375A2E2E272E272E %272E272E2727684BF820272768B6B0B58DB5B0B5689FC1272752272E274B %B0B58DB5B0B58DB58D6F9827272E272E272E272E272E272E272E272E272E %272E272E272E272E272E272E2F61373D373D373D373D373D373D373D373D %373737FD04FF3637363736373637363736373637363736373759FD0CF844 %93FD04F820B08DB58DB08DB58D69989FFD06F820B58DB08DB58DB08DB544 %9926FD1FF82E37373736373637363736373637363736373637A9FFFFFF37 %373D3737373D3737373D3737373D3737376127FD0CF8B568FD04F86FB0B5 %8DB58DB58DB5689F9926FD05F845B0B58DB58DB58DB5B08D6E99FD1FF826 %2F3D3737373D3737373D3737373D3737373D37AFFFFFFF36373637363736 %37363736373637363736373027FD0BF845B044FD04F88CB58DB08DB58DB0 %8D69989FFD06F844B08DB58DB08DB58DB08D4B9820FD1FF82F3737363736 %37363736373637363736371437A9FFFFFF3D373D373D373D373D373D373D %373D373D375AFD0CF88DB5FD04F820B5B0B58DB5B0B58DB669999F27FD05 %F86FB0B5B0B58DB5B0B58DB669756EFD1FF82F3D373D373D373D373D373D %373D373D373D37AFFFFFFF3637363736373637363736373637363736372F %27FD0AF820B568FD04F845B0B58DB08DB58DB08D8D4AC120FD05F844B08D %B58DB08DB58DB08DB0449FFD1FF82F373736373637363736373637363736 %373637A9FFFFFF3D3737373D3737373D3737373D3737373D375AFD0BF869 %B0692626F8F869B58DB58DB58DB58DB5B06F9975FD05F86FB0B58DB58DB5 %8DB58DB5B0697475FD1EF82F3D373D3737373D3737373D3737373D373737 %AFFFFFFF3637363736373637363736373637363736373020FD0AF88DB020 %7520F8F88D8DB08DB58DB08DB58DB08C4B98FD05F820B58DB08DB58DB08D %B58DB08D4B9820FD1DF82F373736373637363736373637363736373637A8 %FFFFFF3D373D373D373D373D373D373D373D373D375AFD0AF844B58D4B99 %26F8218DB58DB5B0B58DB5B0B58DB669756EFD04F827B0B58DB5B0B58DB5 %B0B58DB6697574FD1CF8202F3D373D373D373D373D373D373D373D373737 %FD04FF3637363736373637363736373637363736373626FD09F869B08D4A %C1F8F8F893B0B08DB58DB08DB58DB08DB5449920FD04F8938DB08DB58DB0 %8DB58DB08DB5449F4AFD1CF8533737363736373637363736373637363736 %37A9FFFFFF37373D3737373D3737373D3737373D3737375AFD09F8208DB5 %8D75C126F8F868B58DB58DB58DB58DB58DB5B0B54A99FD04F868B58DB58D %B58DB58DB58DB5B0B54AC1FD1CF82F3D3737373D3737373D3737373D3737 %373D37AFFFFFFF3637363736373637363736373637363736372F27FD08F8 %20B08D8D4AC1207E7D698DB58DB08DB58DB08DB58DB08D8D4A74F87E7D4B %8CB58DB08DB58DB08DB58DB08D694A9FF87DA8A87DA87DA87DA87DA87DA8 %7D52FD0BF82F373736373637363736373637363736371437A9FFFFFF3D37 %3D373D373D373D373D373D373D373D375AFD09F86FB0B58D6FC14BA8FF4B %B5B0B58DB5B0B58DB5B0B58DB5B08D4A7527FF7D8DB0B58DB5B0B58DB5B0 %B58DB5B069749F27AFFD0DFF52FD0AF82F3D373D373D373D373D373D373D %373D373D37AFFFFFFF3637363736373637363736373637363736372F27FD %07F8208DB08DB044C14A7DFF7668B58DB08DB58DB08DB58DB08DB5B0694A %4A27FF4BB08DB08DB58DB08DB58DB08DB5B0457499F8A8FD0CFF27FD0AF8 %2F373736373637363736373637363736373637A9FFFFFF3D3737373D3737 %373D3737373D3737373D375AFD08F820B5B0B5B06FC17452FF8469B0B58D %B58DB58DB58DB58DB58DB5B0694A4A52A868B58DB58DB58DB58DB58DB58D %B5B04B9F7527FD0CFF52FD0AF82F3D373D3737373D3737373D3737373D37 %3737AFFFFFFF3637363736373637363736373637363736373020FD07F845 %8DB58DB0449F7427FFFF4B8D8DB58DB08DB58DB08DB58DB08DB5B0694A4A %2E528CB58DB08DB58DB08DB58DB08DB58D4A98207DFD0BFF27FD0AF82F37 %3736373637363736373637363736373637A8FFFFFF3D373D373D373D373D %373D373D373D373D375AFD08F869B6B0B5B09374C120FFFF7D68B6B0B58D %B5B0B58DB5B0B58DB5B0B5B06F744B2E6FB0B58DB5B0B58DB5B0B58DB5B0 %B5689F7452FD0BFF52FD09F8202F3D373D373D373D373D373D373D373D37 %3737FD04FF3637363736373637363736373637363736373626FD07F88D8D %B58DB08D6FC14A52FFA84B8CB58DB08DB58DB08DB58DB08DB58DB08D4B74 %27278DB0B08DB58DB08DB58DB08DB58DB0449F20A8FD0AFF27FD0AF85337 %3736373637363736373637363736373637A9FFFFFF37373D3737373D3737 %373D3737373D3737375AFD07F821B0B58DB5B0B544C19827FFFF7D8DB0B5 %8DB58DB58DB58DB58DB58DB58DB58D75740545B5B0B58DB58DB58DB58DB5 %8DB5B069747452FD0AFF52FD0AF82F3D3737373D3737373D3737373D3737 %373D37AFFFFFFF3637363736373637363736373637363736372F27FD06F8 %20B58DB08DB58D694AC120A8FFAF44B08DB58DB08DB58DB08DB58DB08DB5 %8DB044994AF868B58DB08DB58DB08DB58DB08DB58D4B6E27FD0AFF27FD0A %F82F373736373637363736373637363736371437A9FFFFFF3D373D373D37 %3D373D373D373D373D373D375AFD07F86FB0B58DB5B0B58D4BC17527FFFF %7D68B6B0B58DB5B0B58DB5B0B58DB5B0B5B0B54A9FF84BB0B58DB5B0B58D %B5B0B58DB5B0B5687526A9FD09FF52FD0AF82F3D373D373D373D373D373D %373D373D373D37AFFFFFFF3637363736373637363736373637363736372F %27FD06F868B58DB08DB58DB06875C12084FFA84B8DB58DB08DB58DB08DB5 %8DB08DB58DB0B0697475F893B0B08DB58DB08DB58DB08DB58D8D4A4A59FD %09FF27FD0AF82F373736373637363736373637363736373637A9FFFFFF3D %3737373D3737373D3737373D3737373D375AFD07F893B0B58DB58DB5B0B0 %44C14A52FFFF528DB0B58DB58DB58DB58DB58DB58DB58DB58D6F9F0444B5 %B0B58DB58DB58DB58DB58DB5B06F4A52FD09FF52FD0AF82F3D373D373737 %3D3737373D3737373D373737AFFFFFFF3637363736373637363736373637 %363736373020FD06F868B08DB58DB08DB5B0694AC1F884FFAF44B08DB58D %B08DB58DB08DB58DB08DB58DB0449F4AF88CB58DB08DB58DB08DB58DB08D %B5684A26FD09FF27FD0AF82F373736373637363736373637363736373637 %A8FFFFFF3D373D373D373D373D373D373D373D373D375AFD07F893B0B5B0 %B58DB5B0B5B06F9F9927FFFF7D68B6B0B58DB5B0B58DB5B0B58DB5B0B5B0 %934A9FF893B0B58DB5B0B58DB5B0B58DB5B0B54A4B84FD08FF52FD09F820 %2F3D373D373D373D373D373D373D373D373737FD04FF3637363736373637 %363736373637363736373626FD05F8208DB08DB58DB08DB58DB08C4BC126 %52FFA8458DB58DB08DB58DB08DB58DB08DB58DB08D694A2620B58DB08DB5 %8DB08DB58DB08DB58D6F207DFD08FF27FD0AF85337373637363736373637 %3637363736373637A9FFFFFF37373D3737373D3737373D3737373D373737 %5AFD07F893B0B58DB58DB58DB58DB568759F27A8FF528DB0B58DB58DB58D %B58DB58DB58DB58DB5B06F206FB0B58DB58DB58DB58DB58DB58DB5694A52 %FD08FF52FD0AF82F3D3737373D3737373D3737373D3737373D37AFFFFFFF %3637363736373637363736373637363736372F27FD06F868B58DB08DB58D %B08DB58DB0449F4A27FFAF44B08DB58DB08DB58DB08DB58DB08DB58DB08D %B08DB08DB58DB08DB58DB08DB58DB08D8D2027FD08FF27FD0AF82F373736 %373637363736373637363736371437A9FFFFFF3D373D373D373D373D373D %373D373D373D375AFD07F86FB0B58DB5B0B58DB5B0B5B0B544C1207EFF7D %68B6B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5 %B0B58DB5B04B26FD08FF52FD0AF82F3D373D373D373D373D373D373D373D %373D37AFFFFFFF3637363736373637363736373637363736372F27FD06F8 %20B58DB08DB58DB08DB58DB08D8D4A99F8FFA8458DB58DB08DB58DB08DB5 %8DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB568207DFD07FF %27FD0AF82F373736373637363736373637363736373637A9FFFFFF3D3737 %373D3737373D3737373D3737373D375AFD07F8208DB58DB58DB58DB58DB5 %8DB5B0696E7427FF4BB08DB58DB58DB58DB58DB58DB58DB58DB58DB58DB5 %8DB58DB58DB58DB58DB58DB5B093F87DFD07FF52FD0AF82F3D373D373737 %3D3737373D3737373D373737AFFFFFFF3637363736373637363736373637 %363736373020FD07F8698DB58DB08DB58DB08DB58DB08D696E267E7D68B0 %8DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB5 %8DB0682652FD07FF27FD0AF82F3737363736373637363736373637363736 %37A8FFFFFF3D373D373D373D373D373D373D373D373D375AFD08F820B5B0 %B58DB5B0B58DB5B0B58DB5B06F4A52A869B0B5B0B58DB5B0B58DB5B0B58D %B5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B5B0B5442DFD07FF52FD09F8 %202F3D373D373D373D373D373D373D373D373737FD04FF36373637363736 %37363736373637363736373626FD08F868B58DB08DB58DB08DB58DB08DB5 %694A26846FB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB0 %8DB58DB08DB58DB08D4A26FD07FF27FD0AF8533737363736373637363736 %37363736373637A9FFFFFF37373D3737373D3737373D3737373D3737375A %FD09F845B0B58DB58DB58DB58DB58DB58DB5684A52768DB58DB58DB58DB5 %8DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB54427A8FD %06FF52FD0AF82F3D3737373D3737373D3737373D3737373D37AFFFFFFF36 %37363736373637363736373637363736372F27FD09F8698DB58DB08DB58D %B08DB58DB08D8D202620B08DB08DB58DB08DB58DB08DB58DB08DB58DB08D %B58DB08DB58DB08DB58DB08DB58D6FF87DFD06FF27FD0AF82F3737363736 %37363736373637363736371437A9FFFFFF3D373D373D373D373D373D373D %373D373D375AFD0AF820B5B0B58DB5B0B58DB5B0B58DB5B06F264BB0B58D %B5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0 %B5684A7DFD06FF52FD0AF82F3D373D373D373D373D373D373D373D373D37 %AFFFFFFF3637363736373637363736373637363736372F27FD0AF868B58D %B08DB58DB08DB58DB08DB58D6968B58DB08DB58DB08DB58DB08DB58DB08D %B58DB08DB58DB08DB58DB08DB58DB08DB58D6F4A52FD06FF27FD0AF82F37 %3736373637363736373637363736373637A9FFFFFF3D3737373D3737373D %3737373D3737373D375AFD0BF8208DB58DB58DB58DB58DB58DB58DB5B0B5 %8DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB5 %8DB58DB5697427FD06FF52FD0AF82F3D373D3737373D3737373D3737373D %373737AFFFFFFF3637363736373637363736373637363736373020FD0BF8 %698DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08D %B58DB08DB58DB08DB58DB08DB58DB08DB58DB08D6F7427A8FD05FF27FD0A %F82F373736373637363736373637363736373637A8FFFFFF3D373D373D37 %3D373D373D373D373D373D375AFD0BF852528DB0B58DB5B0B58DB5B0B58D %B5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0 %B58DB5B0B58DB56E9F26FD06FF52FD09F8202F3D373D373D373D373D373D %373D373D373737FD04FF3637363736373637363736373637363736373626 %FD0AF827FF45B08DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08D %B58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08D4BC14A7DFD05 %FF27FD0AF853373736373637363736373637363736373637A9FFFFFF3737 %3D3737373D3737373D3737373D3737375AFD0BF852FFA844B5B0B58DB58D %B58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58D %B58DB58DB58DB58DB5B08D4AC7207DFD05FF52FD0AF82F3D3737373D3737 %373D3737373D3737373D37AFFFFFFF363736373637363736373637363736 %3736372F27FD0AF827FFFF5268B58DB08DB58DB08DB58DB08DB58DB08DB5 %8DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB0449F %4A27A8FD05FF27FD0AF82F373736373637363736373637363736371437A9 %FFFFFF3D373D373D373D373D373D373D373D373D375AFD0BF852FFFFFF4C %8DB58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B5 %8DB5B0B58DB5B0B58DB5B0B58DB58D757427FD07FF52FD0AF82F3D373D37 %3D373D373D373D373D373D373D37AFFFFFFF363736373637363736373637 %3637363736372F27FD0AF827FFFFFFA84B8DB08DB58DB08DB58DB08DB58D %B08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB0B0 %6F4A26A8FD07FF27FD0AF82F373736373637363736373637363736373637 %A9FFFFFF3D3737373D3737373D3737373D3737373D375AFD0BF852FD04FF %7D69B0B58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB5 %8DB58DB58DB58DB58DB58DB5B09320267DFD08FF52FD0AF82F3D373D3737 %373D3737373D3737373D373737AFFFFFFF36373637363736373637363736 %37363736373020FD0BF8FD05FF7D69B0B08DB58DB08DB58DB08DB58DB08D %B58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB044F87DFD09 %FFFD0BF82F373736373637363736373637363736373637A8FFFFFF3D373D %373D373D373D373D373D373D373D375AFD0CF8277D52525259F869B0B5B0 %B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58D %B5B0B58DB669F8F87DFD07527D27FD0AF8202F3D373D373D373D373D373D %373D373D373737FD04FF3637363736373637363736373637363736373626 %FD13F88DB0B58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB5 %8DB08DB58DB08DB58DB06820FD17F8533737363736373637363736373637 %36373637A9FFFFFF37373D3737373D3737373D3737373D3737375AFD15F8 %93B0B58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58D %B58DB58DB58D20FD18F82F3D3737373D3737373D3737373D3737373D37AF %FFFFFF3637363736373637363736373637363736372F27FD15F869B0B58D %B08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08C %20FD19F82F373736373637363736373637363736371437A9FFFFFF3D373D %373D373D373D373D373D373D373D375AFD17F893B0B58DB5B0B58DB5B0B5 %8DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58D27FD1AF82F3D373D37 %3D373D373D373D373D373D373D37AFFFFFFF363736373637363736373637 %3637363736372F27FD17F869B0B08DB58DB08DB58DB08DB58DB08DB58DB0 %8DB58DB08DB58DB08DB56820FD1BF82F3737363736373637363736373637 %36373637A9FFFFFF3D3737373D3737373D3737373D3737373D375AFD19F8 %4B8DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB5B0B544FD1D %F82F3D373D3737373D3737373D3737373D373737AFFFFFFF363736373637 %3637363736373637363736373620FD19F82068B08DB58DB08DB58DB08DB5 %8DB08DB58DB08DB58DB08D8D20FD1EF85337373637363736373637363736 %3736373637A8FFFFFF3D373D373D373D373D373D373D373D373D375B27FD %1BF820938DB5B0B5B0B58DB5B0B58DB5B0B5B0B6B0B5696F20FD1EF82736 %3D373D373D373D373D373D373D373D373737FD04FF363736373637363736 %3736373637363736373736FD1DF82044698DB5B0B0B0B5B0B0B0B58D8D68 %6F4A4AFD1FF8202E3D373736373637363736373637363736373637A9FFFF %FF37373D3737373D3737373D3737373D3737373D375A2E2E282E282E282E %282E282E282E282E282E282E282E282E282E282E27F8F820204B4469446F %696F446F6E997451FD04F82752282E282E282E282E282E282E282E282E28 %2E282E282E282E28522F37373D3737373D3737373D3737373D3737373D37 %AFFFFFFF3637363736373637363736373637363736373637373736373737 %3637373736373737363737373637373736373737363D3627FD09F8262675 %989F4AFD06F8262F37363737373637373736373737363737373637373736 %37373736373637363736373637363736373637363736371437A9FFFFFF3D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D3753FD0DF827FD09F852373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D37AFFFFFFF36373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637375AFD19F853373736373637363736373637363736373637363736 %37363736373637363736373637363736373637363736373637A9FFFFFF3D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D3737373D375B27FD19F8265A373D3737373D3737 %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D373737AFFFFFFF36373637363736373637363736373637363736 %37363736373637363736373637363736373637363736373637155A27FD1C %F85A37373637363736373637363736373637363736373637363736373637 %36373637363736373637363736373637A8FFFFFF3D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D375A27FD1DF82059373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373737FD04FF363736 %373637363736373637363736373637363736373637363736373637363736 %37363736373637373D362EFD21F82E2F3737373637363736373637363736 %373637363736373637363736373637363736373637363736373637A9FFFF %FF37373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D365A2827FD23F8272859363D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D37AF %FFFFFF363736373637363736373637363736373637363736373637363736 %37363736373637363736373027FD29F8272F373637363736373637363736 %37363736373637363736373637363736373637363736371437A9FFFFFF3D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D375AFD2B275A373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D37AFFFFFFF36373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %3736373637363736373637363736373637363736373637A9FFFFFF3D3737 %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D373737AFFFFF %FF3637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37A8FFFFFF3D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373737FD04FF36373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %3637363736373637A9FFFFFF37373D3737373D3737373D3737373D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D3737373D3737373D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D37AFFFFFFF3637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %36373637363736373637363736371437A9FFFFFF37373D3737373D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D3737373D3737373D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D37AFFFFFFF363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736371437A9FFFFFFAFA9 %AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9 %AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9 %AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9 %AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9FDFC %FFFDFCFFFDFCFFFDFCFFFD6FFFFF %%EndData endstream endobj 85 0 obj <>stream -%AI12_CompressedDataxœì½û²Éq§ùõgÿ Ûv åýÂ]³sÕrF¼›ÒhV6ÖuCFh  ––ûôîñû<<ꠛM‘\‘;DlDœª¬S‘_º{ÆWùƒÿåŸþèö‹wÿøêGó‹áæòƒÜ¿õòû÷?¾ñޛŸ¼yóÍ×Þ[×ùÉÍXžUžtû“ã3=ñï^½ÿúõ»·?öùŸìÕ?üÏ/¿|ýêæÿzùo¯ß~ý/¯?¹ùá'åG¿zýáÍ«òÃן¾ü×WïùÍÛ·¯Þ¿xùúÞ·lèáå‡òŒí¯–¿§›éÇóp󋟖ß½ûæí¯ßþúîÝÿýã›áæGãp3Ž{ù»”þŸ¯ùêëëgœ/–i9Ê3¶ó±ñԇwŸóå«·~ñþÝ篾þúþݛwï¿þñÍýo^¾½ùéË_—Ÿ¼¼ùo¯Þ¼y÷o7wo^~þ/—òY×Ϟ^¿yU>֗/?ܜöo2NŸÝ}óúÍ?ûæË|U>ï2lÖ=æ[üۯ˦ÊVíßÖ½ö“/Kϧ¯>|(¿ay¿!ý*÷e¿û’ß䇿¸ýÙ¯~þ³Ç›qnîÿîÞöÍÿÚz—c¥÷þ§ÿí¿¤×ڇ^¬ãÍXþññ­ ö³g÷„´Á_þõ]Þ-¾A{ê?üòÕ¯_û$(ãóß?©ŸóW¯¾üêM+ßÝëþb½Y7û?þ¥g•çÏøÑ4åÿÎóf^֛eÖÏÛp¼ú×ׯþíÇ7?{÷öUÝç·ï?|úúÿ){± \<ëýå7o^½ÿÛ·¯?”]å{ü¬{ü§ï¾xõ¦<7^ûôæ¥ïhŒíÿë~õòý¯_}(³æݛo>øô=ý¨Œèß¼üÍ+‹±¾ÁÏ¿zõöWïþο•YiÏ&ÖY69çÍxø¦çù¼9뻌7uôëØìålw/;ûe>üüýë_¿~ûcýVûgýþõmŽŒƒm?þãÃ{¤¿'ëoY>ð‡¯Þê·.óóþ§i¾ /~úiy×Ç·_Ü¿ûÒöø×vP•q}[†üÍ»_ןſý'ååß|U?·?+ƒó‹÷¯ßÚ6/?óŸŸýâÍ7åGýþÝ7_ýäí?½»ü°rã/?üs9‚^½ýâërì×¾Ú¼©¯(½óú__վ€¯>ùÎíýêýËÏËÛÞüüÿÇ«Ï?”«£ýëÓo^xõÛ7ôé綛Þßܽÿæë¾ùÕ»woâ÷뿦º½×žÿ§ñ¿ð¼ýùÛº§Ÿ¿“žpýNåÐø“{—òìo‡òÃ?å­ß¿|óæõ¯ß¿üêŸ_þ±7øÈÏãêÏ~‡7+ÇøûWíõÞä¿ßcZþæË|÷æõ×_¶Ù˜z~ñòý‡×Ÿ¿yõéo¾þðêËß¾µ‡WÿTΈi·yïãÛ}õæÝW闌ž—o¿¸ù¯/ßõ]›¶aú§×o¿(GˆÏm7¾ûò+;Áß|úÏ/¿zå¿î‡~òg~ú=¦ñ›—o_¾¿ñþؤá§Ìß³Iµ/6º~VÀ˜Ñ÷£}כ»·éÇýþå¯ ml›~ûʇÚs3~rùH_¡üts÷Åå.ÿÇe¨ÆaæaÖò؆}8†³mÃ6nÓ6o˶mûvlçv»Ým÷ÛÃö¸=mOû°û´Ïû²¯û¶ïû±Ÿûí~wÙï÷‡ýqڟŽ¡|Žé(¿ÎQB”c;ÊsŽã8Ûãî¸÷¿Çcy<ÙÞ8Çs:çs)õ,ïvîgyêy^ÎÛò¸;ïËã¡<Ëãé|º-»ï¶ì"Û ·åóÞ.þXË£ü¢·åW¹-ïc/½­îÊÃÿ{ñÞÝÞëñ Ç£?žìq7øcôGÙɗÿÔƲŽ¦§èâ#ʘÞƘ> >®ß1²—2°ãc nÞ2º6¶‡îÝtï£[Çw¼ác>¯Fy¼Ä0oe˜Ï²;æaÓ8ï>ζ«êX?v£½”‰ ¿hȯý#Ã^F]ã^Fý[Çý¢¡×°§>ôö§ŽüÇÇÞÇýCŸ¾ }|ø÷Ë;åc¡Œ$cYGRcYGRj§ýX>Éýc#¹L—îýíci#™Ç²>êˆÚ¡½]t×ØùQcʡ̨Öq½YÑۋ® ïæÃˁ]Ç÷z„cF™qÖAnc}IƒÝ†Û<îò~Ð÷cùúóÿáÇô˜â1§ùXg¤ÍÉD˜ Óò£§Ž:)Yê\¬3Ñæa;_ÔxÎw—2ù}âÍ>çêIâÁNe®-~f¸-óËf×XæÔZ&ÓY&ÑC™>c™8k™0·eš<– 2•9±_ʨޏeè§2Ü{Þ»óÁÚ¥£G9 -eÇ»ùn½ÛË ßÝ=øX>===>=<Ý?Ý -Ÿeúì…:ëÓò4?MOãÓðøôøøøðxÿxWX}–)¶—9¼>–ãq.¤‡‡§‡Ç‡‡‡û‡»ÂôóRfâþ°=¬ËÃü0à÷O÷÷÷÷÷wçýQ¦÷VŽå~¾ŸÊÙv¸{º{¼{¸»/¿Ómù͎òûmå·\Êï:ݍ—»¡œ ˯o0±3ÊY>Î^>ÔZ>Ú\>àx;” ûX¦ï}ùзå£eleÆ/eöOåHÊqñXŽ;Þڞ:Ê´•Ý¶”ãj*Ç×PŽµÇrÌݗ£ï¶#GÙ½e—ݼ”=•]>?–Ý_ᶠÅQ~¼•aY¶ùRŽúqÖ§2ZeÌîÊȝeüö2Šk˹Œè¸ËSÙi…*we¬Ï2â{÷µ0g.ḠóSÑcAÒý¥°é¶Ì’£Ì•­Ì™¥Ìœ©Pl˜žÊ\z(3ꮎg™_{!ÞZfÛüûåGGòá¸üaGòn¸ÄHþÆцñò½Æñ{bÄËdË2„—ï?†å,6NÃøô?ÉX^æå{•ß{4/ c2Fóò»‘u4ËX.7?øìî}IN¬œ¶ÖÚTéùôòƒÏRÏÝח±¶â§Ñ.?+´&­"ñù~Óô‘Œi²Œi‰ŒÉÎsäGÄ`÷ådÇéÎNx³ŸðˆÄì´Gd}z„p¯Ì©L½Ëøq™ ílhçC‹Î,>#B»õ}vïqš¢nÿûägK‹Ú,n+g͋oKÙñ›Ÿ@ â,Œ³@îփ9 çî}¬ìÿœ¥Oö°Q\üänÀ~—‹çgî-úÿ5=6Ûãð‡GQžñÔÿ¿õögvw—øgyøáë“éðmm>¥V½Ûìïí“ËþkÖǽ·ñ8ô(ùR>ùª‰WÿØî)»I»Í÷ñ¸ÇáÛå›?êԜ-¯}|ô°1+2|>ŒõáŸ5ˆu}B,>5æq¼ŒñÇæM<âq?Üu[Ÿs<öëÇŃ1=|§:„V‡ÐbIâÝ ‚@ð§Ñç6è{Œ;N‹ Ž˜SˆoZ `´©¬©¤©¬©¤™|WTÐÜ_ę³pÊ4Î܋3‡O«Ê;6FŸ§>wø½Žö…Ž!¾ Ò>œ èhGœwe-Ëmãgcf‡«ºË¥ü_=–Ë+ÊNìTc';µ,~¼L~‚mìÊIÆN3õDc§š;OÙO?áØ)ÇN:vÚ! ´“Ït±Ydø(ç ; ÙyÈÎDv.ºóÌßrÃE;)ÙiÉNLvj²“Óä'¨Ñ§Ì“¦.~¦²sÕ½Ÿ¯î<­<ý¬eç­ÝÏ]vöZïë18ûYlÒDülöäg4;§=\üÄf§¶;?½Ù îô“ÜásÌNu›Ÿî˜mvڛýÔçóN:Ë úR«µ¢Qçjýs¯Çƒñ¨¿ÐÓýŽ»v Äò‘.údk<6=öxñ8ãE~íÅûKùûñxâÑ]S<æôX.>„õ±¦Ç–{÷8ºÇyý¸<ܶ‡ïÔT4Y?V$û–YÍ©©•ÔlÚë$—T£Jò” -c¹6R+bQ=!^¢båÛ‹×÷΢óxÄãç n/%2Ø 7“Ÿý`Ô/‘]-$è-쨇–Y[ˆQC‹;)žü5uYµ×a'Ìì Y<`{ÒÊ:õloTŸó÷Œ¹š?6Û,­p²é>\EÍ·v¬]Ê`ÙáhokŸüɏsûãDcÓ(×1®#|ëÃëƒëC[vÕ žÌ:£áâ#·_Ê/–qW>ÎCô“…j9ˆ¯O›Òg }òÃûã$ý,½t0}¦´Æ=`EtÕ¢©CEµÛ”¬¸öh'/°~ªœUf«Åñr_¼ÚFí´VO|þÚÇò>óŸÃ»ÿÝýöJœ×ÁxԘnÖcò‡Ï:'Àpñ@áɓ”GOTj²rï°ð‚g}/Åí^–Û¼@·*‡™=¦˜5÷©ÙϜ⒚=è´qç»òô_r÷½¼*ð-ûþâÑJWjfô xÖbý¯S÷ú‡'ÏƒÁ‹ÿçNÙFý{ë%©)Ýc¯µº‹ -v[‡ -y”óÖTÜk‘eÿïÖÚ.ßñDk-{‘þÝÞ6ýûҕõ¯ŠÁÇ´åY-Ë® }–U=FeéÓ©„É -Š†½ZL¬Ì{P5±Ðîâǜ -Ø~tÍe”wóZ¸~ô3i½ÔtD}úQÅÅÅˋ‡Ê9s¼”I̅;[–3¥#õiGÙ­Ÿëyqö’ãî—8֓¡í4x\tô3`GÆÊÅJŏî¾…ŠÇâ!*V.ދ½™'¾2NŠãD…üɏ …B¾[‡bÛzØÝ{<Ã%šv‘¦î¼VÒÏȽG=}YßC‘‹vn.ë÷…ý'…%c”ô×þš]wÉîñbQŠ -ø“┩ºLs§Ëq -WrÀRC-ÆëVm ckJ‘ó©'äGÿçþêñÐ=".¾äàøYˆœÃäë`¹…Ë4ŒNô¥‹¦SD­?ªSX}Z—E×õ NúDêtFÒ´FºÔjy×Õ¼gõ¼Ë·–ôTÔûHMï;«z•õ¾³HûU½gu½Ë÷+Ó~ÿºÞåc…½®*÷b:a¶EaÃxnƒ­³³Åqøâ±í˜Ê‰ÑV­Ë9L¶t̞6ÞL×µ¼ßw;w_—ße˜öeµ‡Ó±•–ìÓ¸n§oã,X6ëó -PùǼ—.ÛÆ2¿æãf_Ìe?·ßé´=ÿÝÚçc£çT>Œojׇ²O9Ùs¦ú1ýÓÍ¥¿L”í©ç–ü÷±ß|`·–“ëY÷ô̇Ùë6_þåõÓ 1oҐýû7ñ»ÔdYþõòM¿ŠåyßÍø—U,YÅò—U,YÅò—U,YÅòüË*–¿¬bùË*–?ەYÅòÿŸ±üŸnËw­Rùm+\þÝÓô‘Œiê3¦»g*Éw©¶Ü·?þ3\Rɉ2unìgwßÒÒ¯§ëÍÞ+è[¹§k]¢–þŸXÅsv™!'÷CÒâÄn!&f½Œ6zÆ»Føpér@ÂIË &k(YIR¿–øÕxñAqb‰/ -ûkhøè!áÜהUä´Xoó“­*?ªŽY+˜ {UùrûX –þùý9dvsävk„ø{ª|æêgª€ªJ]S·(‚Ö+·›³ãˆBç3%UC£69¥êãÚ®ç^¢¦x§ò¡—uu}¾º¢»ëŠnw=7]Ë]× o–qèjÕÓÞ=¶«ÇÚ=–î1çÇåiºzŒÝ£[åã+EÚ£ÿóPþñØÕEïºÇm÷8¯G~\|JyÔ »ßë òýO —ïwÑ ä{œ>.ß'ø]NÎþùýy\Yäª"×ÛŹ]QŒë‰õäӖ6ùåÄK\O¬g¢þŠâ£®(ÞŒ§Ã¯¯´+Š³NO£e#vŠºpEÑ/ßê\ÕVC±DÎ×Dé¼ѤŸ½j4rzc·Eq›–IuõÜa)8ÛsuqÓ?¬ÐHIï­ÖYþQ~‹qïÞü˲‡wø~Œq<ﻙ^Œeï/Žs[üµ5w».¼­å#~ã%‰Û¯¼ö0ê«lþþ7ÞüÏåŸÿ£tþÛÍróӛøïÃÍÞÿ÷¿,ÿіØ𗥫«¿‰½›÷ô¿@îʯ{ëïóóßã’üß¿ücÿŽÿ¤½7°÷ø {øÛoã‹Ý¦nyñVBë;­g=ÆñƟqú°¬Ó¶x{Ù6k/ÛtÞ|^_±Z[°M³=g+ñç ƒ¿¦lËßežW^²–yk]“ý¥½Óbírmþ’ÁÚ>‡÷›ûú«hxßX_r–í¶Â`ë&Ê!·Û0ó.Æ6ëZ÷yò§,Ûáír@Ôv}—²…ø0˛_”Óçæ}ç¸ØSösõ϶”ýmísÝ|k‰ëk–¶2Ò?ïl¿Âò¢œf&ÎnbÑÄ(?ç™×”×{W 6í)û0zûØk³œÌ|/ÛÈéû:ûhŽëê[ÝÌiÜoÚgµv9 ò’2ñ|€g;P¬m|¶_m?”ö¶{»Ìºöš’Zû<*³ç&m£œ’¼9hÚíó¿Y Büx,Á{}ÎâÏ)¡}›¡| -;FÇ!^s ƒeÜë¯6Öm)“È?NI¶ýÐ܆Øó²–픹²Øû”á,ŸÇÚå´sڔØËùÚÚ>Vš4ë>øs–ÑgMI NßÄdCTþ;”®´Kl0µ©yø۔>ÛsÆíô× ûæ‡Ñi x¬=‡€]ã³_÷´ó‹ÐG™ûµ½z{/Á¯©#V>b9ûsŽºKÊK+{Ž½î‚2EÄ˂¼Ë¾ÔÍÛkmÏÃéíu;*ÐÊìµ×<•¿ëR€µõMsÎšãÔHWÚCIÛ:ÒYßTcŸÐk9¶½‘ÎÚã²eҕ®c[é¬=®t֞מt«–[Îž2­tÞ:ÒùV÷FºÒ®Øé¼½ö¤³>ßw"µÏ©‘ζ¹Ì=éì.C#ï´±‘®´'‘/HWú -téJ»ìFºÕÊ­#ݺ ,®´¦}h¤+íe:{ҕ¾m8éJû˜öFºµD_Ãؑ®tMÓ´éJ»Œ#ýü8{ҕ¾Ù /ÒÙwüí[#]ioçړ®ôç¤[÷CÙߐΚûؓÎúŽ­‘ÎÛeŠ‚ºÒíÃfÔYŸá -ԕ¶]é ÔY{zÔÙkΡ¡.mÃPgÍyíQg}ãÜPçÏÙê¼½õ¨ó¾¹¡ÎÚëÔPg¯‚êlGîGCçØPg3ä˜{ԕ‰túNJºÒ´²K ÎçÝØ£Îææ>6ԕv‰;êJÛ_›QgsÜ^êœ-{C·uÞw6Ôùq37Ô9‹†uƚól¨óöÑPgíã|Žº’g,óّκÖm ÔY»œuÖç±C]雷a ÔY{Ž@]iO5\‡t¥g<÷#Hgí2¾A:koÇّnـœýt=§€œ·ëDrÞ5.9kP9kõ r–uç³çÔèÎgͽF„Á8ûdû|ã|o-G0®´7Ë¡2ãJß1Ô>g\iŸåDŒ[ìh,S;1®tͧÅor¥¹U°:ãJsßjŒ+}gÉ݃qËQvè°ãJ{¶ï͐+}«â,‡\iû¾r¥½MÓÖA®ôíb§C®´Ë¹}È-ö;G¹Ò7MG£\i——îP®4Ëiãè(g}S¥SÎÚcN9kÛÇ͔³¾&åJ{]k¤å”³ö<ïå¬oªq£S.mÃ(gÍMÊù[×\Â)gí½ÂÔ)W_³w”ó¾z8åümêA攳=rŽ[G9ۓö=ªPÎFÔv”+#¾Ôäl&YeA[Œ­¶9Ÿx6&Èùä\ö€œµçm Èل^·½ƒÜb'¶uÈùA0œ9og9€\Å̐s Í[†œÃª’Ç!çíi ÈY{ªœì 7ÏWëk‰«?#%®Ö¾N\K_—¸Z;'®¥}¸ZWN\K»K\íç׉ë|t‰«½$'®¾‰>qõ®”¸Z;'®Þ¾J\­/'®ÖΉ«ýf׉«}àœ¸úNK‰ki?K\ç³O\K»K\çóYâZºRâZZ]⺠Ï×Ò×%®ËÐ'®¥}¸.CŸ¸–v—¸–ö³Äuûĵ´»ÄuŸ'®¥/'®¥™Wk^'®Ö—Wk§ÄuŸ'®¥¯K\­Wk_'®Ö—×´ çÜøqõç¤ÄÕÛW‰«÷¥ÄÕß&%®¶ÍëÄÕöcN\m8sâjä:qµy”×ùìW›v׉«O͔¸Z;'®6¯×ùèW?Râêí«ÄÕûRâj휸z»O\­+'®ÞN‰«µ?–¸ÎãóÄÕúRâj͜¸–ö³ÄÕúrâ:}âjí«ÄÕ̜œ¸Z;'®Ö¾N\ç¡K\í)9qõvŸ¸úVSâ:}âêí«ÄÕúrâj휸Ú6¯Wû€9qõ–×y|ž¸ÎcŸ¸–v—¸Îã³ÄužrâZZ]âZÚÏ×Ò×%®¥Ý%®óü,q-]]âZÚ]âj?¿N\K_—¸–v—¸–ö³ÄµôåÄu^ºÄ՚׉«õåÄÕÛ)q—牫õåĵ´»ÄÕÚ׉«½&'®i†:k^'®óÒ'®þœ”¸zû*qõ¾”¸Z;'®öñ®Wۑ9qõñL‰«ÍëÄu»ÄuûÄÕçÝUâjs3'®óØ'®¥ý,qµ9žWgKJ\½}•¸z_J\ý¸I‰«³¨O\59qõvJ\­ý±ÄušŸ%®Ö•WkçÄÕÚ׉kéëWkçĵ´¯×ÒÓ%®ÖΉ«µ¯×iröӜ¸z»O\½+%®ÖΉ«µ¯×iîW{NJ\­y¸Ú'ˉ«ï­”¸–ö³Äµôu‰kiw‰ë´9Sâj휸ڄ¾N\§¹O\ý H‰«·¯WïK‰kÅLK\C}âê°J‰«·Sâjí%®ãú£wK\§3P·[âºv¨Û-q¶@ÝîÓiÔힸ®êö.qÝ-o­ØrÒힷŽ™t¶Q# ¤ÛÚJdtÖÖ±¤Û}×ÍA:;Чz@9évË[+ ƒt»ç­sî𼵑îð¼uêHg5þ£ÆFNºÃòÖaÒž·vA]ÁS™¤¨;=quVª?+Öu§%®Ç¨;=q]ê†g™kéê2×Òî2Wûùuæ:}æ:}æ:Ï3×qè2×qì2Wk^g®Ö—3Wo§ÌuŸg®Ö—3×Òî2Wk_g®öšœ¹¦m8ëÆç™ë8ö™«?'e®Þ¾Ê\½/e®ÖΙë8>Ï\mGæÌÕÆÓ>:¬;Ÿ'®‡ç­#¨³üVéè¨;žç­‡Å£ã¤órù9éåґÎÎmS ٜt‡§­Sîxž¶Z9§ÎŽšyjÝáYë”AwxÖÚ"ºÃ³Ö9@wxÖº<­õôUx™tƒç­K+Ò íû¬,sŽ>®,u=Zî:Xêê»G´,w*VÁÁcŸ¶Æ»ÁÓ× -@Þàùëñ`g3¾LÏ1h7x;œwÖ7ÚáGÇÞ`£pT"ñ†ºòì€_Ï:{yƒå±ûÚg²ƒ'²•`N½Á3Ùi ì žÊŽ[ǽÁrYÛ೏ëčϳٱ‹ñ,›]‚|c—ÍÚò¢¹¦Ç-ijdvnܛ<™]Z6kÉì²÷Ù¬%³•5›õ]4¶l֒Ùõ*›µd6Åx“ï·–ÍΞ̎}ÉΓYyVæ,óH{Ékv–Ì֓T«Ùy2;¶š%³ëÚjv–Í[_³³D´Î§Z³³d¶Ò³Öì,™­íV³ódvn5;Ï?¦¨Ùy2»ô5;Kf÷µÕì€5;Ofç¾f×'³³ç²-™Ÿç²³§²{F¦uÚ[ŒWvˆ‚±ãu¹¬Áv˜÷àžM;_$žÉg“s}ƒ'³Óì<›­uÀ€Ÿn%Y‚~v(ŒË°þ¼ÃNw€ÖiBD0È8xN[3B8xR[#4‡ààYm ·œ‚ƒ§µ‚Ÿ‹‚uûþÃÃëÏí.¢/ßÿææǥ뇷ŸÜüÕ§ÞÛ +è7¬óÛ\Ú-ë~òðÉÍÿfOù/ßú”_ýÆnpçOr0”¹˜ž{wwûùçß|ùËwüv¬õ‰ÿ{ù[þ÷·VŠm¥xù‡- ßn~øÉÍßÿ× £~ùèºè«…æv”^U&­+W&ý@ÞÒ:éóyeÒ¨´ i´]ÂÒ:éóº2é¸ØÓ2鳯LZûº2Y»S°Y´Bú|V™ô®T™tf¥Ê¤3îª2iœós++¤Ï®2iÍëʤ}²\™ô½•*“Ž°«Ê¤=7W&˻ʤñèª2é8j•Iûœ‰å¶®+“¶§reÒH’+“>W•Iâ\™ô!N•I?ž®*“vÐåÊä>ö•I;â¯+“¨LΎ‰óˆb=וIë˕IçSªL:®*“ÖwŒ-Š5ìåʤµ¯+“Ö—+“¾)¢Xk^W&ý­÷ÅZ;W&ëkúʤ÷%˜ûۤʤí‘kš;;SeÒ¶—+“ö±®*“¶7ÍmçåʤO¼«Ê¤OÎT™´v®Lژ]W&}¬SeÒ碖HŸÏ+“Þ77Š'ÌÔ%Òç³Ê¤Ã*U&½*“ÖΕÉï"øݟ2Á¿/½méÈêS¢ Ð×­³| iñy™ÂuקøÜC)èë¶,k -ÐËÔë³ O뼌í“YaëP¯8)@/ÑßP/{·½üÌG0âôÉRÅ%Åé“R–§OÃ^_C˜¾:ä Ó·u¸*L.ÊÁ¹æ0ý¨çýÓË¡Ps„¥Ïåüµ)J_‡á¬OˆÒ·]uƒ¥¯{}k¶$çÎÆ£N÷uØ«¤}jT«(ýÏJñ¥Ÿg­`(JŸÆZx%H?­Z¾õ´¬}5-;Çè^»ŠÑU|!DßÖ#]U/9ãRK»9D?–Æ+D_(Ý*D߆s¹ÑYð@ˆî˜mºÔ>B_ç}KúVsä ×d¶Џ¡ÖT —`AµÐM=¯t›Jc -ÐKà\'›ôòšã¸ -Ð×iªž"ôuQØ£]A¢û|j!ú4ŽËœCô}—ë½Ì‰-ÅèǦJ®—aˬs‡®ÑkúÝ"ôsZëySz9eYªÐ-E¬&B/ymל¬ƒ¬=Eèk -Î>ŠÍ ö­ãº-™*¿Í‘có㘎FöÒa[Ÿþ”Ñþþ*¤6sl»ˆÚ³éàT7[ûØ[@mM›6- ®ŽÚ¨pÚ¥¶½Æ–6­Lq³` §kߤҤ…ÓæQƒ­¶g[§¤pÚ,ºMU˵*pƒ]}#ž6ώP[ßT϶µ\;½ðéG@míáŒ_Ë/õ—¾í¬«Ôfn-5hö€ÚÔ­ùŒO^j›½ãÔj‹#kúQj›ëÚb–Ú·/uՀš¥"ÔåÈٖˆkD=ÖÂ-!µþT1Ú$V{DS5¤6hS ©Çº©©í¼ÚÔ&…žc ¨YC@]Ž¯‘0€ºôõªG ¨í9ºrâuižöuùÙ<ÔðÑ/õ[ÿÜ"êÍ£è[Dmƒ¡õ5Q[{[—ˆ¨mì¬ÖÙ"êªã-Š -¢ö1×R ‹¨Ýà\â5Q[ŸŸÒÙF™këÒBê͖”p¥…Ô~„L³~ ©mú.ñšª ®GQÛ°ÖZ¯Gԛ_Y?#¢öãr×xD]ú¼ÐND]Ú夿QoÒmrDm}[6RÛ&özTxHm¨-Ê!õæ -NDÔ¥¹Lõ`óˆÚ]Ò-¢p¨­o>z gõO#Âöö¸4Ô3•oŸ#¢¶öYÓM¨ Cû܇ÔÖg¡ !µ?§fhR[»Ì=*ÃD슦!'ŒÚA³ž £¶ÄwÝ£¶yZzŒš¿]çI=¢¶e£ïKÏQ;P÷±qÔNÝÇÜ8j‹Ñj»qÔûsi05}ûl,µfõQK­oØK(Œ•¥¦oSÏRÓ·ë1^Yj,YçSÓ··±‡éX£³€©í²ej0- Ykƒi ùñSÓ·×3`êúö¹u0u{;¦ö¹DJ§©ۃdxhj»ëÐîòâ„KRÛÿ»v^ßþ+‚Ò͗ẃRŸÁ­R··õ1 ¥~ôœAR?àŽ©#©ËÛû$u{»ÔÍìeì@êööyH±¹©;Ôu§H͉žÆ9@jíªÊ×Yiîs‡QºëP:Fc ¨[×ÇÖaÔßyÛ£nbk`Ô_S÷%õ®m -ŒúÛ¬{`Ôõõ±£¨íÆuƒ¢UÅ߂¢înos‡Qw·+ó£@£6閵ǨMÌ%(ZZ~AŠŽ±_EÇZ-¢²°¢Ö碣 ˆZ»n¶BÔ¦ÛÜ3T_5 µvýڂÊÐQŸ±g¨‹’uC¸U«{!œ»“ë -áܓœæŽpÖçW·p&1G˜hiŸ:¾™ù\õzǛûÖÇxs1º¶o¦lïõüìxs­ûh|óöÜáÍ»†-ð† Þ¬í×wÞÜã>æÀ›mcX§À›µë—GÝì®ótóݵÜÌf=ǎm&Å mæÍ®ëh3_Û ² m¦ãúLÚLÙ>j`èh[µî+£m]#¬s´™â« èt3eÛ¾Ú¦Ñ͌l?BE73¶°3fg+ º­[œ“œnflûw%o¥m‹u2ÝJW9íìA7ó“íêxs{éèf]¶æºy»¦N7Sž§zê -ºYß6ŽA73´çù ¼YÛJ0™onq×Áôã8¶!¾apg¾ù{×ÄÊ÷žë×5kr¾Õל™oÞµÞü]t„ÞÜYŽŽon¾×ØËùæ£YÙä|³rnSÇ7¶Çúµ~ì¯KéðÍgÞ2w|óÉY3GŸ4å?ãºàL؞׳œMqû$‡l á¼]Ñ„ó¾ú½$N8oo8gÐtt„«_ 1áâ»D8wÀEÀD8·"÷5κ<<ᬽÕ\Öç’ä¸u„3={¯ƒ¸»i9ÀÆ83š·z† ÆYßX#‡œÛÙ5¦ðãÅÚGmäL¦ëÙÓ!çöôÑboW¶å-eƒrÖö+ꢜ ÙûÒQÎÅîz:åÜ$_Ö œ›æ5¨ ÌÙç=s¾ÏæÆ9“\çèL„µÏéLžõš¡Hç®mM"ƒt®än:Ó¶1yÛǸw 3o[A—ƒÎ,_?Wtæm¯sâœIÛû²çLÚ>†58·øš±ãœIÛ˺çLڞ¶çL5^j 3i[Á«ƒÎåc›t yM"ݢ@· tnA×Ü7@gö0¬:kïó s‰{š:ÐYßR‡ÓAÛèÜ®®¥œ¿÷zèü95¯qÐy[iŠ@ç]ë¤ó·YÎ ;éÃԑÎö¤‚^'ç|él†ÌëڑÎfÒZ±ä¤[`®Hç3oÞ;Òùìœ'HgͺUÍç};Й´}.S€ÎÑr®:?&j ó¾š#;è¼]·ë¤sMSG:ßî¸é¼=ìA:äð+Ò¹ ½/™t³­Á]Z¶:k¯Hç¢e ƒtÖ7‡Hg³jrF:š·>[ù -‘Îí½e«Öžö>[5e{=Z¶êòt ùœtޞútÕ·[3'ÝìkÝö µ·š¯é\ÒÞ[ºZÅï%Hçºyï‚tn©O-]µÖҙѺ}ºê&lísҙ=;¯:wm>[u'·f´N:Ó¶·©e«‹-åª$l¤"«¤³‹Ng-Õ¬±?‡¹¼Ó ÝЈì¤+??®@g+3ז®š³½ñ]y³cïóUs¶­å«î(×*@ݨ:f×VZÂêí©%¬îA×Y#]é[†–°.ö;Íc# É4ö¤3‹tj)klҍ¶®¶OYý½k -TIgÏ©ùM%ÝØ2Hg]kKYým––²º¤Þs®ìÈ}h«fe”sÎ&È®ÌÎÙD:ז±Îg]/ç|ÞÍ}Æês³fË6g¬y.-eí;2Ö>eµ)>ׂ€ƒÎÉr¶œuÖRÿ :ï«U·×)@ç(ê9ç›[Îêí¡å¬îyÏrÖÙäîçF­€scÍ҅9¿œíòFiŽãÒ_ß°‰4W&UÌÁ[0g¯9æô•¦`ΦBÕ*æÊäYk¾Ü0gK!굊Š9˱7ÌY»æË s£† ̍ʝÀܨ ”™s¾€õlœ3©»ç+çF%È=ç&_—°eÎM|Á¨8gmÏÖ+è\¤¬b€Îülg*è¬5×ÀË@gJ³®^è&괝©ÐÇÖ2Wûù°õ™«ÙÔóÞ2ת|Ï:o}æêÛm‰«Kܵèê sK¼ntÖçäèÜŸÛ¥\ûÕÆÞèìcK\§º0:@g’ërö‰«‹°ç ›ÊŒË 3×ÖÖ-dҙ’;×äÖI7éëð Ýä_Hzt¤3qûh 3Ë÷ tfmërŽƒÎ¬mˆlYۊCtfmoKË\ÍÚ^ö9@g®1×'Ý䍖¹º¦]+:÷ §¾Fg}k‹ç¼9µÌµÚÕæLÀϖ¸ZûœæÀœµ÷±¿a}ÛØ×؆0gíaëWëšùÌöçÔÇAçí½K\½ki‰+®8 sGýìWۑËÙWÎJ)'Íµ^’ÒÙLڗ–¸NÎàO¼©Ï[mr.õ[}Òè£8gÓù\ú¼Õ¿˜`žƒs–£å­Þ®„ÎùaÒ0çÍzÝÃ1ç º -ç&­›sÓ×ÇsÓ¬s}¹q5°[«b]Æ -sÖöT½~Ö*tgÈYÏ\GpwÍҗâ rÖ¬uÁ`œ9ÏûÒ.AX{ZÛJk/k¿RÅlíºQGœ ßµèçˆóöЯVñÍÖË Î87¼ëe#gœëÜõ˜ ÆYß¾µÕ*U?ƒqÖ^kpŒ³O(v:ãF}›'Œ3—õ8úå*£÷`œy³kÊYM³=÷~¹Šé¸æÀÂ83¶+¿q£U]t½ĕ>B/g\iûÊ9g6ö8.‰qæc{ÉKŒ3{>Úrû¹˜ŒMHk9«éڇb7C\i|õW!F+e¬mµŠË×uå‰#n$ùHˆ©°ˆq# ŒgÊóTóӀœÛ×G[­2Zn5n9kºLä¬oÚj•Ø† gíeëW«ø{/S@Ο£«hK¼¦[­â]s[­âòøÜV«ØÇ378CΌíãh«U|<§) gSä¬×r£}£çҖ«ŒðV”ó©7õËUlzu¥ŒO+§Ï s¥=Ìs¿\ÅfùZ/"8æ,{[®âíš,æüH©™¬s®’fÎ9‰†~¹ŠoghËU¬­ ØÎ9oϖ«øwOî]8ç•Íy ÎÙŽ*P4ΙEy}Þj·Jv»y–ò*鬮ËS:nPgööZ/È:êìÛ”“êì˜ÜZÚºÛÊÙ¥¡ÎÚCET Î6{Œíj«´ÃЮC |gÔ¹8~N:󳧽孻-{^û¼Õ~c ¨³]6n­:g‚ë±õ\½¸¸¶¼Õ¿–rn+óìˆÜ+·u¶®p™Ú…ˆÓöNË[í KϳæN–M u¶àX´¬¨³çc¾a>ö>µ¼Õ|m˜ì¨´¨'£®ªgu¶8}[ë†v¡"X7èë:`ÕøjA ²nT­1³Î5薷z{lyë8ªä™YgöõÑòV3´÷qm¬+íuX{ÖÙ·f -omÀ:_YÜ£ÎÞºfAuö”ÎÕWty«wÍ-ouu|ny먯æêHg÷9ZÞjÃ9 ­>g_†8ï=éÊLÒ}tÆ×}l JlâGŸ·Zu|¬õ8›4VLOte>ïZ5 ;ìR\}‰ƒÎȲïí‚ëQãtþ]Æc»àê¨Yè Eƒ2K@Wú´†Ì9wø5•vÁõð³ýr͹ðAèBt¾"{Qå`O:Hfë k,@väœ#y $ãÎe³Ûy2À $/d˜gkÿ×yn_ÃÉÔCz¡ƒ€½ÐA2÷†jÀ¶e&¡ƒ@>tL¾¦ƒ}Mûš’à:q:q:HŽóðAˆóÙj ‡’=„’Y !ä²!-—•B*‹B*‹’SYé d²è ”ìÐArÉ„’V-“ÅéJvòA¢d§¼†Š|®b÷¢*ýQ±“; !]ÅNBHTìØ;!]ÉΌåa„DÍNFH®ÙI‰š„¨ÙIéjvB"••Qž„.ʓQžŒˆòd„døa„~!„@¿B2þB.„ ­n>HàPGm +¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûۀÜ܊ÝݖÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 112 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Jamie Zawinski) () %%Title: (iSaverRunner.ai) %%CreationDate: 2/20/21 5:34 PM %%Canvassize: 16383 %%BoundingBox: 0 0 114 114 %%HiResBoundingBox: 0 0 114 114 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%DocumentCustomColors: (PANTONE 152 CVC) %%+ (PANTONE 485 CVC) %%CMYKCustomColor: 0 0.51 1 0 (PANTONE 152 CVC) %%+ 0 1 0.91 0 (PANTONE 485 CVC) %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_TemplateBox: 57.5 56.5 57.5 56.5 %AI3_TileBox: -231 -299 345 435 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -10 119 8.67 1190 1089 18 1 0 611 177 1 0 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 100 10 100 10 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 127 0 obj <>stream +%%BoundingBox: 0 0 114 114 %%HiResBoundingBox: 0 0 114 114 %AI7_Thumbnail: 128 128 8 %%BeginData: 29522 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B3761 %5B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B3761 %5B5B37615B5B37615B5B37365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B5B365B375B365B375B365B %375B365B375B365B375B365B375B365B375B365B375B365B375B365B375B %365B375B365B375B365B375B365B375B365B375B365B375B365B375B365B %375B365B375B365B375B365B375B365B375B365B375B365B375B365B375B %365B375B365B375B365B375B365B375B365B375B365B375B365B37365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B36615B5B3761 %5B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B3761 %5B5B37615B5B37615B5B37615B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B5B375B365B375B365B %375B365B375B365B375B365B375B365B375B365B375B365B375B365B375B %365B375B365B5B61282E5B5B365B375B365B375B365B375B365B375B365B %375B365B375B365B375B365B375B365B375B365B375B365B375B365B375B %365B375B365B375B365B375B365B375B365B375B365B375B365B375B3636 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B36363030F85A375B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B615B5B37615B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37615B5B37615B5B37615B5B37615B5B37613627362728613761 %5B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B3761 %5B5B37615B5B37615B5B37615B5B37365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %61282706F82F5B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B5B365B375B365B %375B365B375B365B375B365B375B365B375B365B375B365B375B365B375B %365B375B365B375B375A4427F8273661365B375B365B375B365B375B365B %375B365B375B365B375B365B375B365B375B365B375B365B375B365B375B %365B375B365B375B365B375B365B375B365B375B365B375B365B375B365B %37365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B364C68F8F828375B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B5B37615B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37612F936F27 %202F5B615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B3761 %5B5B37615B5B37615B5B37615B5B37615B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B363745B5444BF836375B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B5B375B365B %375B365B375B365B375B365B375B365B375B365B375B365B375B365B375B %365B375B365B375B365B375B372E93B5444A005B375B375B365B375B365B %375B365B375B365B375B365B375B365B375B365B375B365B375B365B375B %365B375B365B375B365B375B365B375B365B375B365B375B365B375B365B %375B36365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B0D6F93932026055B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B615B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B375B %4BB593934A2607615B5B37615B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B3761 %5B5B37615B5B37615B5B37615B5B37615B5B37365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B36289293936F26F82F61365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B5B365B %375B365B375B365B375B365B375B365B375B365B375B365B375B365B375B %365B375B365B375B365B375B365B3761289393B5936F4A053661375B365B %375B365B375B3661375B3761375B365B375B365B375B365B375B365B375B %365B375B365B375B365B375B365B375B365B375B365B375B365B375B365B %375B365B37365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B372F44B5939368 %4B2006375B365B365B365B365B365B365A3736305B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B3761 %5B61366FB5B593BC6F75F8305B5B37615B5B37615B5B372E2F61F82F5B5B %37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B3761 %5B5B37615B5B37615B5B37615B5B37615B5B37615B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B363721B5FD04934A75F85B375B365B365B365B372F %F85B05F8365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B5B37 %5B365B375B365B375B365B375B365B375B365B375B365B375B365B375B36 %5B375B365B375B365B375B365B375B3661374C93B59393936F754A066137 %5B365B375B375B202F2FF82F61365B375B365B375B365B375B365B375B36 %5B375B365B375B365B375B365B375B365B375B365B375B365B375B365B37 %5B365B375B36365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B28FD0593 %8D4B99F82F5B365B365B3637214B30F8F85B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B615B5B37615B5B37615B5B37615B5B37615B %5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37 %615B2F92BC93B593BC4B9F4A285B5B37615B612F6E2E2FF82F5B5B37615B %5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37 %615B5B37615B5B37615B5B37615B5B37615B5B37365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B366128FD06936F759FF85A375B365B364B682EF8202F %61365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B5B365B375B %365B375B365B375B365B375B365B375B365B375B365B375B365B375B365B %375B365B375B365B375B365B375B372F92B593B593B56975C1263061375B %372F926FF84B205B375B375B365B375B365B375B365B375B365B375B365B %375B365B375B365B375B365B375B365B375B365B375B365B375B365B375B %365B37365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B28FD06936F7475 %005B365B373620B520267427365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B5B37615B5B37615B5B37615B5B37615B5B37615B5B37 %615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B375293 %B593BC93934AC2202F5B615B61289393217599066137615B5B37615B5B37 %615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B %5B37615B5B37615B5B37615B5B37615B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B363721B5939393B544757405375B36612F4B939320C14A28375B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B5B375B365B37 %5B365B375B365B375B365B375B365B375B365B375B365B375B365B375B36 %5B375B365B375B365B375B3661364B93B593B56F4BC1262F61375B372E93 %B59375C14A0661375B365B375B365B375B365B375B365B375B365B375B36 %5B375B365B375B365B375B365B375B365B375B365B375B365B375B365B37 %5B36365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B372F68B59393934B7599 %F85B365B373620B593934AC1262F375B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B615B5B37615B5B37615B5B37615B5B37615B5B37 %615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B376127 %9393BC93934AC8202F5B615B61289393B59375C14B0D615B5B37615B5B37 %615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B %5B37615B5B37615B5B37615B5B37615B5B37365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B0D6F939393B5449F7400365B365B364BFD049344C14A2F37 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B5B365B375B %365B375B365B375B365B375B365B375B365B375B365B375B365B375B365B %375B365B375B365B375B3661372793B693B56951C14A0661375B372F68B5 %93B5936F9F750661365B375B365B375B365B375B365B375B365B375B365B %375B365B375B365B375B365B375B365B375B365B375B365B375B365B375B %365B37365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B362868B59393934B749FF8 %36365B363727FD0493B5449F4A06375B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B5B37615B5B37615B5B37615B5B37615B5B37615B %5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B372F68B593 %BC93934AC84A065B615B61306FB5B593BC936F7599056137615B5B37615B %5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37 %615B5B37615B5B37615B5B37615B5B37615B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B372F44B5939393B544759F262F5B365B372F68B5939393B569759805 %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B5B375B36 %5B375B365B375B365B375B365B375B365B375B365B375B365B375B365B37 %5B365B375B365B375B373644B593B593B5934BC199F85B375B3661279393 %B5FD04934BC1F85B5B5B365B375B365B375B365B375B365B375B365B375B %365B375B365B375B365B375B365B375B365B375B365B375B365B375B365B %375B36365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B373620B5FD05936F4AC82606375B36 %5B304BFD07934B99260D5B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B615B5B37615B5B37615B5B37615B5B37615B5B37615B5B3761 %5B5B37615B5B37615B5B37615B5B37615B61279393B593BC93B6449FC126 %30615B5B37366FB593BC93B593BC4B9F4A2F5B5B37615B5B37615B5B3761 %5B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37615B5B37615B5B37365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B37372F5B375B36610C6EFD0593 %B5934B9F99F85B365B365B28FD08936F7575005B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B5B365B375B365B375B365B375B365B37 %5B365B375B36613761376137613761376137612820372E2F61364B93B593 %B5FD04934BC84A2E5B613761374C93B5939393B593B5936F9F2736613761 %376137613761376137613761376137613761376137613761376137613761 %375B365B375B365B375B365B375B365B375B365B37365B365B365B365B36 %5B365B365B365B365B365B365B2F592F532F592F532F592F59286F442FF8 %28352868B5FD06934475C14A055A2F532F2F44B5FD0793B5449F20282F59 %2F532F592F532F592F532F592F532F592F532F592F532F592F532F592F5A %365B365B365B365B365B365B365B365B365B365B365B5B37615B5B37615B %5B37615B5B37615B5B376137612E27F8F8F820F820F820F820F826934BFD %04F844BC93B593BC93B5936F75C226F8F820F820F86F93BC93B593BC93B5 %936F7575F820F820F820F820F820F820F820F820F820F820F820F820F820 %F820F820F8F8F8525A6137615B5B37615B5B37615B5B37615B5B37615B36 %5B365B365B365B365B365B365B365B365B365B2FFD0DF84493FD05F86FFD %0793B5449F9F26FD06F868B5FD09934B99FD22F852375B365B365B365B36 %5B365B365B365B365B365B5B375B365B375B365B375B365B375B365B375B %362EFD0DF8B569FD04F82793B593B5939393B5936F75C220FD06F8FD0493 %B5939393B593B5449F4AFD21F8265B375B365B375B365B375B365B375B36 %5B375B36365B365B365B365B365B365B365B365B365B365B05FD0CF84BB5 %44FD04F844B5FD0793B568759F26FD06F868B5FD09936F4A9FFD21F8262F %5B365B365B365B365B365B365B365B365B365B615B5B37615B5B37615B5B %37615B5B37615B5B5B2EFD0BF82093B5FD05F89393B593BC93B593BC9393 %4AC826FD06F89393B593BC93B593BC93B5936F9F27FD21F85A5B5B37615B %5B37615B5B37615B5B37615B5B37365B365B365B365B365B365B365B365B %365B365B27FD0BF820B56FFD05F893B5FD09934B9F75FD06F86FB5FD0993 %B5687575FD20F827305B365B365B365B365B365B365B365B365B365B5B36 %5B375B365B375B365B375B365B375B36615B27FD0BF86FB56FF84BF8F820 %B593B5939393B5939393BC697599FD06F89393B5939393B5939393B593B5 %449F26FD20F85A375B375B365B375B365B375B365B375B365B37365B365B %365B365B365B365B365B365B365B365B27FD0AF82093B5204B26F8F84BFD %0C93209F26FD05F844B5FD0B936F4A9FFD1FF827305B365B365B365B365B %365B365B365B365B365B5B37615B5B37615B5B37615B5B37615B5B37615B %27FD0AF844BC934B754BF8F844B693BC93B593BC93B593BC93934A9FFD05 %F86F93BC93B593BC93B593BC93B5936F9F51FD1EF8205A37615B5B37615B %5B37615B5B37615B5B37615B365B365B365B365B365B365B365B365B365B %365B27FD0AF86F939344C126F8F84BFD0D936F5075FD04F820FD0D93694B %9FFD1EF827365B365B365B365B365B365B365B365B365B365B5B375B365B %375B365B375B365B375B365B375B5A28FD09F82093B6936F9F4BF8F820BC %939393B5939393B5939393B5934B754BFD04F893B593B5939393B5939393 %B593B5447575FD1EF85A375B365B375B365B375B365B375B365B375B3636 %5B365B365B365B365B365B365B365B365B365B27FD09F844B593934AC120 %28524B8CFD0C93B5934B7420057D2E6FFD0E93209F4AF8527D527D527D52 %7D527D527D527D5227FD0BF8272F5B365B365B365B365B365B365B365B36 %5B365B615B5B37615B5B37615B5B37615B5B37615B5B5B2EFD09F86F93BC %936FC14B59FF7D9393B593BC93B593BC93B593BC93B5934B7527A8FF4B93 %93BC93B593BC93B593BC93B593934AC12652FD0EFFA827FD0BF85A5B5B37 %615B5B37615B5B37615B5B37615B5B37365B365B365B365B365B365B365B %365B365B365B27FD08F820939393B54AC14A52FFA844B5FD0D93B5694B4A %F8A8A844B5FD0E9326C12027FD0EFF27FD0AF827305B365B365B365B365B %365B365B365B365B365B5B365B375B365B375B365B375B365B375B36615B %27FD08F820B69393936F9F7527FFFF4B93B5939393B5939393B5939393B5 %93B569754A27A87693B593B5939393B5939393B59393936F4BC8F859FD0D %FF52FD0BF85A375B375B365B375B365B375B365B375B365B37365B365B36 %5B365B365B365B365B365B365B365B27FD08F84B939393B5449F99F8A8FF %5269FD0F93B568514A277D6FFD0F934B749FF8AFFD0CFF27FD0AF827305B %365B365B365B365B365B365B365B365B365B5B37615B5B37615B5B37615B %5B37615B5B37615B27FD08F86FBC93B5939375C820A8FFA844BC93B593BC %93B593BC93B593BC93B593BC6F752652529393BC93B593BC93B593BC93B5 %93BC934B9F4B52FD0CFF52FD0AF8205A37615B5B37615B5B37615B5B3761 %5B5B37615B365B365B365B365B365B365B365B365B365B365B27FD08F8FD %0593694BC14A28FFFF5268B5FD0F93B54475202E4BB5FD0D93B569757527 %A8FD0BFF27FD0AF827365B365B365B365B365B365B365B365B365B365B5B %375B365B375B365B375B365B375B365B375B5A28FD07F84B93B593B593B5 %44C29927FFFF846F93B5939393B5939393B5939393B5939393B54A9FF827 %6FB593B5939393B5939393B5939393B64A9F207DFD0BFF52FD0BF85A375B %365B375B365B375B365B375B365B375B36365B365B365B365B365B365B36 %5B365B365B365B27FD07F844B5FD05936F74C1F87DFFFF4BFD12936F4A75 %F84BFD0F936F4A7427FD0BFF27FD0AF8272F5B365B365B365B365B365B36 %5B365B365B365B615B5B37615B5B37615B5B37615B5B37615B5B5B2EFD07 %F86FB5B593BC93B59375C17527FFFF8444BC93B593BC93B593BC93B593BC %93B593BCB56F7551F89393BC93B593BC93B593BC93B593BC936F7527A8FD %0AFF52FD0BF85A5B5B37615B5B37615B5B37615B5B37615B5B37365B365B %365B365B365B365B365B365B365B365B27FD07F868B5FD0593B5449F9FF8 %A8FFFF4B8CB5FD0F93B5934B99F820B5FD0D93B56875207DFD0AFF27FD0A %F827305B365B365B365B365B365B365B365B365B365B5B365B375B365B37 %5B365B375B365B375B36615B27FD07F89393B5939393B593934AC84A52FF %FF7D6F93B5939393B5939393B5939393B5939393BC459F4A006FB593B593 %9393B5939393B5FD04934B5127FD0AFF52FD0BF85A375B375B365B375B36 %5B375B365B375B365B37365B365B365B365B365B365B365B365B365B365B %27FD06F820FD09934B759FF8A8FFFF4BFD13934A9FF84BFD0F936F4A27A8 %FD09FF27FD0AF827305B365B365B365B365B365B365B365B365B365B5B37 %615B5B37615B5B37615B5B37615B5B37615B27FD06F820B593BC93B593BC %93B56F51C14B27FFFF8468BC93B593BC93B593BC93B593BC93B593BC934B %9F51F89393BC93B593BC93B593BC93B593BC6F7520A8FD09FF52FD0AF820 %5A37615B5B37615B5B37615B5B37615B5B37615B365B365B365B365B365B %365B365B365B365B365B27FD06F827FD0993B544759FF87DFFAF4B8CB5FD %0F93B5687575F844B5FD0E934A2652FD09FF27FD0AF827365B365B365B36 %5B365B365B365B365B365B365B5B375B365B375B365B375B365B375B365B %375B5A28FD06F820B5939393B5939393B5939320C27427FFFF7D6F93B593 %9393B5939393B5939393B5939393B6449F264B93B593B5939393B5939393 %B59393936F2652FD09FF52FD0BF85A375B365B375B365B375B365B375B36 %5B375B36365B365B365B365B365B365B365B365B365B365B27FD06F820FD %0B936F4AC1F853FFFF27FD1393444A20FD0F93684A26FD09FF27FD0AF827 %2F5B365B365B365B365B365B365B365B365B365B615B5B37615B5B37615B %5B37615B5B37615B5B5B2EFD06F820BC93B593BC93B593BC93B5936F759F %F8FFFF7D68BC93B593BC93B593BC93B593BC93B593BC93B56F9393B593BC %93B593BC93B593BC93B593934A27A8FD08FF52FD0BF85A5B5B37615B5B37 %615B5B37615B5B37615B5B37365B365B365B365B365B365B365B365B365B %365B27FD07F893B5FD0B934B9F4A05FFAF4BFD1393B5FD11936FF87DFD08 %FF27FD0AF827305B365B365B365B365B365B365B365B365B365B5B365B37 %5B365B375B365B375B365B375B36615B27FD07F89393B5939393B5939393 %B593B5934B9F2059FF7D6F93B5939393B5939393B5939393B5939393B593 %9393B5939393B5939393B5939393B593B56E2652FD08FF52FD0BF85A375B %375B365B375B365B375B365B375B365B37365B365B365B365B365B365B36 %5B365B365B365B27FD07F844B5FD0B93B5685174F8A8FF44B5FD23936FF8 %52FD08FF27FD0AF827305B365B365B365B365B365B365B365B365B365B5B %37615B5B37615B5B37615B5B37615B5B37615B27FD07F82793BC93B593BC %93B593BC93B593BC45754A52FF7693BC93B593BC93B593BC93B593BC93B5 %93BC93B593BC93B593BC93B593BC93B593BC93B5934B27FD08FF52FD0AF8 %205A37615B5B37615B5B37615B5B37615B5B37615B365B365B365B365B36 %5B365B365B365B365B365B27FD08F86FFD0D93B54475F8A87D6FFD249344 %26A8FD07FF27FD0AF827365B365B365B365B365B365B365B365B365B365B %5B375B365B375B365B375B365B375B365B375B5A28FD08F820B593B59393 %93B5939393B5FD04934B4A27AF4BB593B5939393B5939393B5939393B593 %9393B5939393B5939393B5939393B5939393B5936FF8A8FD07FF52FD0BF8 %5A375B365B375B365B375B365B375B365B375B36365B365B365B365B365B %365B365B365B365B365B27FD09F86FFD0E936F4A267D6FFD2393B54A2052 %FD07FF27FD0AF8272F5B365B365B365B365B365B365B365B365B365B615B %5B37615B5B37615B5B37615B5B37615B5B5B2EFD09F84B93BC93B593BC93 %B593BC93B593BC936F2659769393BC93B593BC93B593BC93B593BC93B593 %BC93B593BC93B593BC93B593BC93B593BC936F2059FD07FF52FD0BF85A5B %5B37615B5B37615B5B37615B5B37615B5B37365B365B365B365B365B365B %365B365B365B365B27FD0AF8FD0E93B5694AF84BFD2393B56F2627FD07FF %27FD0AF827305B365B365B365B365B365B365B365B365B365B5B365B375B %365B375B365B375B365B375B36615B27FD0AF844B593B5939393B5939393 %B5939393B64B2620B5939393B5939393B5939393B5939393B5939393B593 %9393B5939393B5939393B5FD04934A27FD07FF52FD0BF85A375B375B365B %375B365B375B365B375B365B37365B365B365B365B365B365B365B365B36 %5B365B27FD0BF86FFD0F93206FFD24936875F8AFFD06FF27FD0AF827305B %365B365B365B365B365B365B365B365B365B5B37615B5B37615B5B37615B %5B37615B5B37615B27FD0BF84B93BC93B593BC93B593BC93B593BC93B593 %BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93 %B593BC93B59393752784FD06FF52FD0AF8205A37615B5B37615B5B37615B %5B37615B5B37615B365B365B365B365B365B365B365B365B365B365B27FD %0CF86FFD34936875267DFD06FF27FD0AF827365B365B365B365B365B365B %365B365B365B365B5B375B365B375B365B375B365B375B365B375B5A28FD %0BF82E4B9393B5939393B5939393B5939393B5939393B5939393B5939393 %B5939393B5939393B5939393B5939393B5939393B5939393B5936F754B52 %FD06FF52FD0BF85A375B365B375B365B375B365B375B365B375B36365B36 %5B365B365B365B365B365B365B365B365B27FD0BF827A844B5FD3193B544 %994A52FD06FF27FD0AF8272F5B365B365B365B365B365B365B365B365B36 %5B615B5B37615B5B37615B5B37615B5B37615B5B5B2EFD0BF852FF7668BC %93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93B5 %93BC93B593BC93B593BC93B593BC93B593BC936F9F9F27FD06FF52FD0BF8 %5A5B5B37615B5B37615B5B37615B5B37615B5B37365B365B365B365B365B %365B365B365B365B365B27FD0BF827FFA84B8CB5FD30934AC14A27FD06FF %27FD0AF827305B365B365B365B365B365B365B365B365B365B5B365B375B %365B375B365B375B365B375B36615B27FD0BF852FFFF7D4B93B5939393B5 %939393B5939393B5939393B5939393B5939393B5939393B5939393B59393 %93B5939393B5939393B593B5687599F87DFD06FF52FD0BF85A375B375B36 %5B375B365B375B365B375B365B37365B365B365B365B365B365B365B365B %365B365B27FD0BF827FFFFFF5268FD2F934B74F87DFD07FF27FD0AF82730 %5B365B365B365B365B365B365B365B365B365B5B37615B5B37615B5B3761 %5B5B37615B5B37615B27FD0BF852FD04FF4B9393B593BC93B593BC93B593 %BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593BC93 %B593BC93934A2652FD08FF52FD0AF8205A37615B5B37615B5B37615B5B37 %615B5B37615B365B365B365B365B365B365B365B365B365B365B27FD0BF8 %27FD04FFAF20FD2C93B54A2627FD09FF27FD0AF827365B365B365B365B36 %5B365B365B365B365B365B5B375B365B375B365B375B365B375B365B375B %5A28FD0BF827FD05FFA844B5939393B5939393B5939393B5939393B59393 %93B5939393B5939393B5939393B5939393B5939393B593B56F2627FD0AFF %27FD0BF85A375B365B375B365B375B365B375B365B375B36365B365B365B %365B365B365B365B365B365B365B27FD0CF8527DA87DA8A85244B5FD2793 %B56F20F87DA8A87DA87DA87DA87D52FD0BF8272F5B365B365B365B365B36 %5B365B365B365B365B615B5B37615B5B37615B5B37615B5B37615B5B5B2E %FD14F84BBC93BC93B593BC93B593BC93B593BC93B593BC93B593BC93B593 %BC93B593BC93B593BC93B593BC934BF827FD17F85A5B5B37615B5B37615B %5B37615B5B37615B5B37365B365B365B365B365B365B365B365B365B365B %27FD15F844B5FD25934BFD19F827305B365B365B365B365B365B365B365B %365B365B5B365B375B365B375B365B375B365B375B36615B27FD16F86FB5 %93B5939393B5939393B5939393B5939393B5939393B5939393B5939393B5 %939393B5B56FFD1BF85A375B375B365B375B365B375B365B375B365B3736 %5B365B365B365B365B365B365B365B365B365B27FD17F844B5FD21936FFD %1BF827305B365B365B365B365B365B365B365B365B365B5B37615B5B3761 %5B5B37615B5B37615B5B37615B27FD18F86FBC93B593BC93B593BC93B593 %BC93B593BC93B593BC93B593BC93B593BC93B5936FFD1CF8205A37615B5B %37615B5B37615B5B37615B5B37615B365B365B365B365B365B365B365B36 %5B365B365B27FD19F844B5FD1B93B5934AFD1DF827365B365B365B365B36 %5B365B365B365B365B365B5B375B365B375B365B375B365B375B365B375B %5A27FD1AF82093B5B593B5939393B5939393B5939393B5939393B5939393 %B593B56F27FD1FF85A375B365B375B365B375B365B375B365B375B36365B %365B365B365B365B365B365B365B365B365B05FD1CF86F93B5FD169344FD %20F827305B365B365B365B365B365B365B365B365B365B615B5B37615B5B %37615B5B37615B5B37615B5B3752FD1DF82745B6B5B693BC93B593BC93B5 %93BC93B593BC93B56F6F2626FD20F827615B5B37615B5B37615B5B37615B %5B37615B5B37365B365B365B365B365B365B365B365B365B365B3627FD1F %F84B6F9393B593B593B593B593B59393696F4A4B26FD21F8205A365B365B %365B365B365B365B365B365B365B365B5B365B375B365B375B365B375B36 %5B375B365B375B36532728272E2728272E2728272E2728272E2728272E27 %28272E2728272E2727F8F8F82744FD046F936F6F4A6F4B75757526FD04F8 %27272E2728272E2728272E2728272E2728272E2728272E2728272E272828 %5A375B365B375B365B375B365B375B365B375B365B37365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B27FD0AF8264A9999C17526FD06F8275B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B5B37615B5B37615B5B37 %615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B %5B37615B5B37615B5B37615A27FD0DF85120FD08F82053615B5B37615B5B %37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B3761 %5B5B37615B5B37615B5B37615B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B362EFD19F827365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B5B %375B365B375B365B375B365B375B365B375B365B375B365B375B365B375B %365B375B365B375B365B375B365B375B36615B53FD1BF8523761375B365B %375B365B375B365B375B365B375B365B375B365B375B365B375B365B375B %365B375B365B375B365B375B36365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B3759FD1DF852365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B615B5B3761 %5B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37615B5B37615B615B59FD1FF8535B6137615B5B37615B5B3761 %5B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B %37615B5B37365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B36613652FD21F82E5A5B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B365B365B365B365B365B365B5B365B375B365B375B365B375B365B375B %365B375B365B375B365B375B365B375B365B375B365B375B36615B5B2F27 %FD23F8272E5A3761375B365B375B365B375B365B375B365B375B365B375B %365B375B365B375B365B375B365B375B365B37365B365B365B365B365B36 %5B365B365B365B365B365B365B365B365B365B365B365B365B365B365B36 %5B2F5327FD28F82E2F5B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B5B37615B5B37615B5B37 %615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B %5B5227FD2BF826525B37615B5B37615B5B37615B5B37615B5B37615B5B37 %615B5B37615B5B37615B5B37615B5B37615B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B3652 %F8270527F8270527F8270527F8270527F8270527F8270527F8270527F827 %0527F8270527F8270527F8270527F853365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B5B375B36 %5B375B365B375B365B375B365B375B365B375B365B375B365B375B365B37 %5B365B375B3661375B365B5A5B365B5A5B365B5A5B365B5A5B365B5A5B36 %5B5A5B365B5A5B365B5A5B365B5A5B365B5A5B365B5A5B3661375B365B37 %5B365B375B365B375B365B375B365B375B365B375B365B375B365B375B36 %5B375B36365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B615B5B37615B5B37615B5B37615B5B37615B %5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37 %615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B %5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37 %615B5B37615B5B37615B5B37615B5B37615B5B37365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B5B36 %5B375B365B375B365B375B365B375B365B375B365B375B365B375B365B37 %5B365B375B365B375B365B375B365B375B365B375B365B375B365B375B36 %5B375B365B375B365B375B365B375B365B375B365B375B365B375B365B37 %5B365B375B365B375B365B375B365B375B365B375B365B375B365B375B36 %5B375B365B37365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B5B37615B5B37615B5B37615B5B37615B %5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37 %615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B %5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37615B5B37 %615B5B37615B5B37615B5B37615B5B37615B5B37615B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %5B375B365B375B365B375B365B375B365B375B365B375B365B375B365B37 %5B365B375B365B375B365B375B365B375B365B375B365B375B365B375B36 %5B375B365B375B365B375B365B375B365B375B365B375B365B375B365B37 %5B365B375B365B375B365B375B365B375B365B375B365B375B365B375B36 %5B375B365B375B36365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B365B365B365B365B365B365B365B %365B365B365B365B365B365B365B365B %%EndData endstream endobj 128 0 obj <>stream +%AI12_CompressedDataxœì½û²Éq§ùõgÿ i»„ò~ᮍٹj9#^ŒMi4+kƒº!#4ІF‹Ë}ú ÷ø}uÐÍæ°µ”VDMDVUVUFä—îžñUþàùå'?¾ýüÝ?¾úñüb¸¹üà÷ï_½üðîýOn|íÍOß¼ùú«ïmÕõ£›±<«<éö§Ç§zâß½zÿÕëwor3n/ðÉ^ýÃÿüò‹×¯nþ¯—¿{ýö«~ý£›þ¨<ôë×Þ¼*¾þä忼zÿ«¯ß¾}õþÅË×?â}ˆ^~(Ϙþjþjo֟ÌËÍ/f¿|û//¿úêõÿóÊÞj>æ²îîÝ×o?ýö7wïþïŸÜ eÇÅþ–‡þÏ׿zõÕ·<þð¿xõöÃ/ß¿ûìÕW_Ý¿{óîýW?¹¹ÿýË·7?{ù›òÈ˛ÿöê͛w¿»¹{óò³¾”ï¼~úôúÍ«òõ¾xùáæ´ïzûÓqúôîë×o>ÿù×_üã«ò½·c²Õó§¾Å¿ýªlªlÕþm«÷OúEYóÉ«ÊÇ*ï7¤r_vô»/ø$?üåíÏý‹Ÿ?ތëtsÿw÷¶þ׶v9VÖÞÿì¿ý—ôZÿ¦/Öñf,ÿøøV{ìÅÙ=!mðW}—wKÝuå©ÿð«W¿y탡ôÓÿQýž¿~õŗoJŸù>^÷ëͺÙø—žUvœ?ãÇÓ<–ÿœçͼ¬7ˬÇ[w¼ú—ׯ~÷“›Ÿ¿{ûªîóÛ÷>©½NçÙÚ_}ýæÕû¿}ûúCÙU›­:ëÿÙ»Ï_½)ύ×>½yé;ºöûo}¯_¾ÿÍ«e¨¼{óõÆÇ ‡JþÍËß¿²¾ëüâËWoýîïüóýx´ÑtÞ/¶ÝþQZÃqތ‡o}Ëîßwÿ÷xS»BÉ6b›`Û{Ùá¿,câï_ÿæõ۟è“íŸþõûן·q2öñÞÅGú{ò·~Òò¥?|xõVŸ¼ŒÑûŸ¥17¼øÙ'å]ß~~ÿî Ûë_Ù±Túöméö7ï~S‹û#åå_Y¿·?-ôË÷¯ßÚ6/?÷GŽOùæëòÐ_¿÷õ—?}ûOï.?¬ ù»WŸP”>üüæÿø?J£ÐÀƒ›_¿ùYÙ@iÇs +¾üÑ·n®|¹÷¯nêƒå•Þäÿÿð«^ýS9€ÛËëÚÇ·ÿòêÍ»/ÓfcÍË·Ÿßüחï¿üÛþ囗o_¾¿ñõ±å¿yý/呗eOµm·ußa£e”|YvŽ¿ÄŸrõßò„ôÐ~£O~ÿÅ?¾{óú«/bËyÍ/_¾ÿðú³7¯>ùýW^}ñ>¶ À÷oñ¶üã·7wï¿þê·7¿~÷îMûØõ z¨uÇû¾Æžûoå]ʳ¿ùʃÿ–·þÉg¾>¶íþ¡Ø¾Vÿ{û—oÞ¼þÍû—_þöõg{£<ïVûã†Ué7¯Þ~þU¼AmöÇp]÷‡éÍãç¯ ä¾á0þÖç|ò»—>ûíß¼þÇ÷/ß¿~õ­oiþŸ^¿ý¼ìõO¾~ýáUÛEï¾øÒ¢›O~ûòËW~Løí“?ó“ØàúiA†ûü-Ô_oîÞ¦‡ÿúýËÏ_—óÉOl÷¼}å,¬knÆ]>²®œÇ¦›»Ï/ÿpù?.Cý3Ó0Ë°–eöáβÜwÃýð0<Ã8ŽÓ8Ë¸ŽÛ¸GYÎñv¼ïËò0>MÃ4NÓ4_¦eZ§mÚ§sº-ËÝô0=NOó0Oó<—ÈcÞæ½Ä‘·óÝ|??̏óÓ2,Ó2/˲.Û²/Çr»Ü-÷ËÃò¸<­ãeÖy]ÖuÝÊr¬çz·Þ¯ëÓ6lã6mó¶lÛ¶oÇvn·ÛÝv¿=lÛÓö´û¸Oû¼/ûºoû¾û¹ßîw—ý~Ø÷§£|Ëò=¦£|œ£bÇv”çÇq·ÇÝqïŽÇ²<ÙÞ8Çs:çs)Ëz–w;÷³<õ Þ¯ßÒ³—Ò±ãctnéÞÒ»Ö·‡÷îÝtï½[ûw¼êác>¯zy¼D7o¥›Ï²;èæaS?ïÞ϶«j_?v½½” ¿¨Ë¯;ý#Ý^zý;ôûE]¯nOÿ¼ëíOíù÷½÷û%º>wüu×ßæÿî}y§¾|Œ#”ž¤/kOª/kOê@ã´ïËç=¹¬'—éÒ²¸/­'s_Ö¥ö¨ÚÛEq=Œ9Õ§Êôjí׫žõ¾éۋw®uïæÝˁ]û÷º‡écz™~ÖAn}}IÝºÛ;\]^øzÈûAß÷å÷ôçÿà Ži™b™Óx¬#ÒÆd"̅aùÑSG”,u,֑h㰝/ê<ç»K|>ðfsõ$ñ`'ˆ2Ö?3ܖñe£k,cj-ƒé,ƒè¡ Ÿ± œµ ˜Û2L˙ʘØ/¥WïŽÇÒõSéî½tïÝùàíRŽÑ£‹…²ãÝ|·Þí¥Óïî¼/ŸžžŸžîŸî +…Ï2|öBõiyšŸ¦§ñix|z|||x¼¼+¬>ËÛË^ˁñ8RŽÃÃÓÃãÃÃÃýÃ]aúy)#qØևåa~˜ +p‡û§ûÇû‡ûûû»ƒóþ(Ã{+ÇÎr?ßOål;Ü=Ý=Þ=ÜݗÏt[>ÙQ>ßV>åR>ët7^î†r‚x,ß`bg”³|½|©µ|µ¹|Áñv(ö± ßûò¥oËW?ÊØʈ_ÊèŸÊ‘0”ãâ±!v +¼µ=u”h+»m)ÇÕTŽ¯¡kå˜»/Gßm9FŽ²{Ë/»y);{*»|(4~,»ÿ¾tÂm銣<¼•nY¶ùRŽúqÖ§Ò[¥ÏîJϝ¥ÿöҋké˹ôè¸ËSÙi…*w¥¯ÏÒã{é÷µ0g.ḠóSÑcAÒý¥°é¶Œ’£Œ•­Œ™¥Œœ©Pl˜žÊXz(#ꮎg_{!ÞZFÛü§õåG{òá¸|¿=y7\¢'¿‡~´n¼|§~üN½X;ñò½ôbéCºðòÝû°œÅÆiŸþƒôåuo^¾ãQù{óò=“Ñ›—?戬½Yúr¹ùÁ§wïKrbEõVßʚO.?ø4­¹ûê2ÖV<íòX¡5i‰Ïw˘¦dL“eLKdLvž#?"»/';Nwv›ý„G$f§="ëÓ#„;eNeè]ƧˆËì\hgC;ZtfñÚ­ï³{Óuûß'?[ZÔfq[9k^Ùb½¸øÉݾ€}–‹çgî-úÍCÀÝÃÀúßÃÂӃÂ[ý÷ÖOØwžÙÝ]âŸeñÃ×ÓáÛÚ|H­z·ÙßÛ—-þ1ër¯å6–CKùʗòÍW ¼úÇvOÙMÚm¶ÜÇrËá‹íò͗:4gËkgï-Öge)ÝçÝX—ÛXŽ´D¬ëbñ¡1ãeŒ?6nbyˆå~¸ë–[s,ûõrñ`L‹ïT‡ÐêZ,I¼ƒAþ4úÜ}`qÇ©c‘Äs +qàM‹Œ6•5•4•5•4“ïŠ +šû‹8sÎ@™Æ™{q¦«Ê;6F§>véø½öö…ŽŽ.¾ ÒޝtèhGœw¥-Ëmýg}f‡«ºË¥ü§Ëåe§vª±‹Z?^&?ÁŒÖwå$c§™z¢±S͝§ì§Ÿpì”c';íÚÉgºØ(2|”s…ì5ò¹w՘Ç#?‡Ü—cãöR"ƒ½°Ñx3ù9áÑÏFýÙÕB‚ÞŽpX°a™µ…5´¸óâÉÏQS—U{VqÂìÁÁnšÅ¶'­¬SÏööGõ9Ï™û ùãa³Ò +'îÃUÔ|kÇÚ¥t–Žö¶ö͟ü8·?N16õríãÚ÷޽޹޵µcWuê©Î¬9z.Þsû¥|ø³|»òu + Ÿ,T³È©@|}Úü›>é“Þ'éw`饃é#0…¤5îñ+¢«M*ªÝF dŵG;éxmôSå¬2[-Ž—ƒøâÕ6j§µzúàã×¾æð™ÿ¾ìþw÷cØ+q^c©1ݬeòÅG`¸x ðäIÊ£'*5Y¹wXxÁ³¾‹—âv/Ëm^ [•ÃÌSL6•1QBSS 2î<иõÂ_Moj‚S“œšæL^,ô#ÅCšðX rwQÞS3ŸšûÔìgNqIMtÚ¸ó]yú‡Ü}/¯ +|˾¿x´R㕚=(žµØAç«eꖡ_<‰x| ^üÿî”mÔ¿·±ØZò‘ºäHñ薽Öê.*Øm@*äQÎ[Sq¯E–ý¿[k»|Ë­µ|ìEúw{ÛôïKWZÔ¿*Ӗg´,»2ôÝü"²ôéTÂdEÃ^-&Væ=¨šXhwñcNl?ºæÒË»÷y-\?ú™´^j:¢>ý¨âââåÅà Œåœ9^Ê æ‚-˙ҏ‘zŽ´£ìÖύõ¼8{Éq÷KœëÉÐN„v<.: ú°#cåb¥âÇNwß@ŋcñ+ïÅÞÌß'Åq¢BþäGÐB!ߏ­C±Æm=ìî=žáM»HSw^+éçäÞ£ž¾¬ï¡ÈE;7—õûÂþ“Â’1JúkÍ®»d÷x±(EåûIqJŽTŽ¸BW/Ç=*\ÉK Y¼·è¯[´5Œ­u*Eמ—þÏýÕòÐ-_rpü,DÎaòu°ÜÂåš?8·Ðù:€Î!tF§@úÒEÓ)¢ÖŸÕ)¬¾ +­‡ËÇ¢ëz'}"u:#iZ#]jµ¼ëjÞ³zÞåKz*ê}¤¦÷­U½‹ÊzßZ¤ý–ªÞ³ºÞ廕i¿{]ïò±Â^W•{1GáàÍð¢dÐDzØ? +€ÏɧÇmÇTNŒ6?n]Îa²ÉqÃxnãÍt]ËûS·s÷ÕÅ^º/ç^uà®åeÛV§ê냽Áî òy/«lËüb˜›}|1—ýÜ>Ó÷´=ÿlÓ¹¯“½µt£½¾œ’Ê“lS»¾”}ËɦNõkú·›Ëú2Pòžú·äŸg†å°W—Sý:ۗÊ3÷Ù73ó•v{½mo_VßÛÓ 4oRÇý©úc곿*ÿzù¦ŸÑò|ÝÍø—-™Ñò—-™Ñò—-™Ñò­üˌ–¿Ìhùˌ–·³ þ2£åÿ?}ùnFË·ÍXùC³]þ§3¦é#ÓÔgLwϪÊw©ÎÜ·?þ˜/—T~¢dÛ{ìîZÚàõgºÞì½2€¾•×t­KÔÕÿ3zÎ.3ää~è¢ÚCœØ-Ä$À¬—ÔFÏx×H.]H8i Ád %k Iê׿/>(N,1âEa =$œûú² +žëm~ò¯æGÕ4k5Ót¯0_nkñÒ¿¿?‡ÌnŽÜnOUÐ\ MÕPU¬kêÑzwsvQô¼s¦¤ÊhÔ)§T‰\ÛµÝKÔïTJôR¡®´ÏWWww]Ýí®í¦ëºËãz¡øýï=šýS7XÏ4ºn÷´wËvµ¬Ý²t˜—ËÓtµŒÝÒÍwò93méÿ<ÔåÂ?» +ñã]·ÜvËyµy¹ø\œ²ÔKÜßéüùÝOŸ—ïvþÔéó;œ{ÙµúKAó­ê[þQ>Å8µÒšÊ£ÒVjU{-yª=i;O/BŸã²o¶¥²~Û½<¬Çao²”ó¿IIbÏÉê¾ËöbØö¥/¶›ücb‘¿}ûöå¯>¿ù Ç±•häck»xä[ÏÝϽ>ó÷!„‡>x¸Ž7¾©ý QÌå#ÈÇ"¨o”Ò3.W+û å¯â×+>ˆ½ Ìã<Ƌ1æpÞj +§Õ‘f§Äã~Ió7í@¯lxPLmõ¦#َa‚é#&mÚÑʔÍ;;4/~\n:&‰¡ëQXçjÎi¢æƒ‡Îw<׉QsMƒ4-ón9͍çýÌÊۘSÙfTZ$Á zÐ§üؤ²3.rîýê1Ê¢|iºšìÓ&úÜkÊä­&LúåüMs&™/9Ç<ɡΐô“؃jµîQkéÞç\m,}ñî_ôßYA\­ÙÜÕoøïüÁ'úøQpÐÇ Ï"Š>Þ¸»ZRœrñIgýrý§‚žúé*~ŸXSù¼¶~YŸ-)¶»Ä?÷gˑ—:­ô›§Ž~ÃÄÑî"Tž á× .^š~6m4M]”†i’ÌÇgŒú|ÑKJ/òt™ë©„y2ažNØ&Ö9¢÷—4AtŒ™…unᦁâÂ÷_hÀ¼hÞEs.ªk!Ç¢M\» €®KÜ{ôf~㌝Ç6cçâAÙ7MÚÑ´¸ ¥‹1s'ÏÝÑ읋®`0…‡IŽëC¯?m;ßoý1¿á¿øTo¨þè…ýÚÕ»7ÿüòæáÝ~£DgÏ×ÝL/Æi½_ç¶ø$kî6·`[½PuëÿýûߕÿûÚëZ·_úšQ¿õ÷¿÷æ.ÿüeåïn–›ŸÝüÃn>¯/üUù?m–wù¢¬êß÷obÞÚ×ôŸ&¯Ê¯{ëïó‹?aŽÇß¿ü×þŒÿ¤½7°÷øõ,[üí·ñžۆÆ[‰¡üýmÝikÖcoü§÷Ñ:m‹·m’Mi/ÛtÞ|V_±š¬²M³=g+üñç ƒ¿¦lËßežW^²–ÃÅVMöJ{9¦ÅÚåpÚü%ƒµ}@ï7÷õ5Vóuc}ÉYÚmÊÊ6ÖM”£a·Ãaæ] {¶jÝçɟ²l‡·ËÑQÛõ]ÊâË,ó´Ùºkþœ‚?k—Nõ/·Žƒ¿M9ß±†rœogÙûóVwÚ1[»0b·öYâZk¯Ë®÷)½:×uóy–×N/æq(_ã(ßxݬ½Ú\k;/ÙgƱ¯ö„s¶ÿ?Ë´ý1—´íÞ.§¿úŠ¹ìÞí´uã0ùsŒþœ¥ôjioeØÃ#ûl~Qά›¯+°³§ìçêßm)ûÛÚçºù&Ö\××,/lª­ßÙ>Âò¢œ&ÎnbÑÀ(óÌkÊë}U‰Òí)û0zûØk³œç|/[Ïéû:{oŽëê[ÝïÌi,ð³¦}Wk—ó#/)Ï;x¶ÅÚkëðÕöCio»·Ë¨k¯Yw]D½IÛ(g+ovû¼Ä'+ñ‰%ë©ÏYü9%gªo3”oaÇè8ÄkŽað# ô{ýhc=Ж2ˆüëLëè‡æ6Ę—µl§Œ•ÅÞ§tgù>Ö.ç Ó†Ä^NåÖö¾Ò Y÷ÁŸ³Œ>jJæuú&&ë¢òÿC9àJ»„ Sš‡¿Mùâ³=g,ç?kûæ‡Ñi3¬=‡€](¶{ÚÉρÅ裌ýÚ^½½—8„×Ô+_±œáý9GÝ%奕=Ç^wA"b€¥¾Ê~ ÑÛkmÏÃéíu;*ÐÊèµ×<•¿ëR€µ­›æ 5Ç©‘®´‡’ïv¤³uSýÄ> ×r0ØÒY{\¶Lº²êؖF:kk#µçµ'Ýj‡å¤³§Lk#·‡Žt¾Õ½‘®´+¶E:o¯=élï;‘ÎÚçÔHgÛ\æžtö—¡‘ÎwÚØHWړȤ+ë +téJ»ìFºÕÊ­#ݺ ,®´¦}h¤+íe:{ҕuÛp6ҕö1ítëf[Gº²jš¦=HWÚ¥ÿéìñãìIWÖÍNx‘Î~sßéJ{;מteÝq®Aºu1”ý 鬹=élݱ5Òy» QPWÚ£}ٌ:[g¸u¥m— uÖ†uöšsh¨KÛ0ÔYs^{ÔÙºqn¨óçì uÞÞzÔùº¹¡ÎÚëÔPg_¯‚êlGîGC÷çØPg#ä˜{ԕtú¤ÙŠºÒ´zU ÎÇÝØ£ÎÆæ>6ԕv‰;êJÛ_›QgcÜ^êœ-{C·u¾îl¨óãfn¨s êŒ5çÙPçí£¡ÎÚÇùu%éXæ³#­Z·5PgírÔY{œÇueݼ K ÎÚÃpêJ{ª±;¤+kFËB µKÿ鬽gGºeröèzN9oׁä|Õ¸ä¬=V@9ä¬=Ô7ÈY +vžc@ΞS£;gœ5÷ãì›íóŒó½µÁ¸ÒÞ,¡ÊŒ+뎡®sƕöYNTÁ¸ÅŽÆ2´ãʪù´ø­B®4· +Vg\i–4Sâj휸Úp¾N\ç£O\ýH‰«·¯W_—WkçÄÕÛ}âj«râê픸Zûc‰ë<>O\m]J\­™×Ò~–¸Úºœ¸ÎCŸ¸ÎóÄÕT¯œ¸Z;'®Ö¾N\ç¡K\í)9qõvŸ¸úVSâ:}âêí«ÄÕÖåÄÕÚ9qµm^'®ösâê;-%®óøq-í.qÇg‰ë<åĵ´ºÄµ´Ÿ%®e]—¸–v—¸Îó³Äµ¬ê×ÒîW{ü:q-ëºÄµ´»Äµ´Ÿ%®e]N\ç¥K\­y¸Úºœ¸z;%®óòqõU)qµvN\­}¸NsŸ¸ÚsRâjÍëÄÕ¾YN\}o¥Äµ´Ÿ%®e]—¸–v—¸N˳ĵ¬Ê‰kiæĵ4Ÿ%®e]—¸NkŸ¸–ö³Äµ¬ë×Òî×Ò~–¸–u]âZÚ]â:mÏ×ië×ië×Ò|–¸Úºœ¸Z;'®Óöqõç¤ÄÕÛW‰«¯K‰«¿MJ\m›×‰«íǜ¸ZwæÄÕÈuâjã(%®ãÖ'®6ì®Wš)qµvN\m8_'®ãÚ'®~¤ÄÕÛW‰«¯K‰«µsâêí>qµU9qõvJ\­ý±Äõ°¼uÙ;Ж·-œ;ì ú u‡%®ëÙ¡î°ÄµF>¢wK\§3P·[âºv¨Û-q¶@ÝîÃiÔힸ®êö.qÝ-o­ØrÒힷŽ™t¶Q# ¤ÛÚJdtÖÖ±¤Û}×ÍA:;Чz@9évË[+ ƒt»ç­sî𼵑îð¼uêHg5þ£ÆFNºÃòÖaÒž·vA]ÁS¤¨;=quVª?+Öu§%®Ç¨;=q]ê†g™kYÕe®¥Ýe®öøuæ:}æ:}æ:Ï3×qè2×qì2Wk^g®¶.g®ÞN™ë8>Ï\m]Î\K»Ë\­}¹Úkr暶ᬟg®ãØg®þœ”¹zû*sõu)sµvÎ\Çñyæj;2g®ÖŸöÕaÝù›µd¶²±f³¾‹Æ–ÍZ2»^e³–̦o²óýÖ²Ùٓٱ/Ùy2« Ïʜei/yÍΒÙz’j5;OfÇV³³dv][ÍÎr£yëkv–ˆÖñTkv–ÌVz֚%³µÝjvžÌέfçùÇ5;Of—¾fgÉ쾶šð fçÉìÜ×ìúdvö\¶%³óó\vöT¶qÏÈ´N{‹ñÊQ0Öb¼.—5Øóܳa·çёÏç"::úOf§-Ø7x6[ë€?;ÜJ(²ýìP—a üù +;ÝeÚJs%‚€@ŽÀÁsښÂÀÁ“Ú¡9Ïjk¸å<­müLü«Û÷^f7ß}ùþ÷7?)«~ø_~tóWŸ|xÿúíon~è7+ô-Úí +ý{»sáÿfOºýÆ'ýôAOq0”±˜žywwûÙg_ñ«wü.Æõ‰ÿ{ù[þ÷·fŠm¦xù‡M ßn~ø£›¿ÿ¯&FÿâòÑyÑWÍí(½ªLÚª\™ôyKó¤Ïç•I£Ò6¤yÒv kHó¤ÏëʤãbOӤϾ2iíëÊd=ìNÁf=Ò éóYeÒW¥Ê¤3+U&qW•I㜟[™!}v•Ik^W&í›åʤï­T™t„]U&í¹¹2Yþ¿«L®*“Ž£V™´ï™Xn»áº2i{*W&$¹2é}qU™´.ΕIïâT™ôãéª2i]®Lîc_™´#þº2iðˆÊäì˜(0(ÖØs]™´u¹2é|J•IGØUeÒÖc‹b {¹2iíëʤ­Ë•IßÆQ¬5¯+“þÖ{‹b­+“õ5}eÒ×%˜ûۤʤí‘kš;;SeÒ¶—+“öµ®*“¶7Ímçåʤ¼«Ê¤ÎT™´v®LZŸ]W&½¯SeÒǢ¦HŸÏ+“¾nnO˜©S¤Ïg•I‡UªLz;U&­+“2ÁïþLÿ®ô¶©#«‰.@_ ´ÎðD¤Åçe×]Ÿâs¦ ¯Û²¬)@/Cg¬ÌZ€>­ó2¶ L¦ˆ­C½â¤½DC½ìÝôò˜÷`Ä铥ŠKŠÓ'¥,9NŸ†½¾†0};uȦoëpU˜0\”ƒsÍaúQÏû¦—C¡æ)JŸËùk?R”¾ÃY/ž¥o»ê9J_÷ûÖ:lI͍-F/œîë°5VI1ú6Ô¨VQú1ž•â9J?ÏZÁP”>µðJ~:[µ }ëiY1új>{ŽÑ½8v£«øBˆ¾­Gºª^rÆ¥–vsˆ~,5ŒWˆ¾PºUˆ¾ çr¢3áÝ1Û"tÿª}„¾Îû–ô­æÈ-@¯Él C­©*@/Á‚j ›z^è6”Æ —À¹6èå5Çq ¯ÓTD÷ñÔBôi—9‡èû<.×!z[ŠÑM•\/ÖQç]¢×ô»Eèç´Öó¦"ôrʲU¡[ŠX!L„^òÚ®9Ù +²ö¡¯)8ø(6/4Ø·Žë6eª|š#ÇæÇ1ìe…m}ú·Œö¯õW!µ™cÃØEÔ&˜M§ºÙÚÇÞjkÚ°iuuÔF…Ó.µí5¶´aeŠ›Õ[8]×M*MZ8m0Øj{¶yJ +§Í¢ÛTµ\«7ØÕ7âi3ñìɵ­›êÙ¶–k§>ü¨­=œñ±üRY·5`µ€ÚÌ­¥ÍP›º5ŸñÍk@m£wœZ@mqdM?j@m#p][ÌR×íKÝ_5 fªu9r¶%âãQµpKHm§?UŒ6‰•ÃÑT © ÚÃÔBê±n*Bj;¯öµI¡çØjæÁP—ãk$Ì# .ëŽzÕ£Ôö]9ñ€º´ Oû€º<65|ôKý¶~nõæQt‹Ž-¢¶ÎÐü¨­½­KDÔÖwVëluÕñEÐQ{Ÿk*EÔnp.ñ¨mŸÒÙFkëÒBêͦ”p¥…Ô~„L³>‹…Ô6|—xMÕ×£‹¨íXk­×#êͯ¬ŸQûq¹Çk<¢.ë¼ÐND]Ú夿QoÒmrDmë¶:l<¤¶Mìõ¨ðÚ$P› +”CêÍœˆ¨Ks™êÁæµ»¤[DáQÛºù<êQ0œÕ?ÛÛãÒP;ÌT¾}ŽˆÚÚgM7=¢6 ísRÛ:  ©ý95CóÚÚeìQþWÄ®h¢q¨4ëÙ0jS|×-0js‘§¥Ç¨ùÛuœÔ#j[†10jññ¾ôµuGíÔ}̍£6­¶Gí°?—SÓ·ÏÆRkVµ±ÔÖ {c©¥‚±²ÔôícêYjúv=Æ+K%ëÜ`júö6ö0kt0µ]¶L ¦…!k]ß`ZB„E~¼ÃÔôíõ ˜º¾}nLÝßގ€©}/‘ÒijÇö šÚî:´»ü°(áR Ôöÿ®·DPºùô®9Pê#¸¢5Pêö¶¾¦¡Ôž3HêÜ1u$uy{?ƒ¤no7º™½ŒHÝÞ>)67 u‡ºî”©9ÑÓ8H­]Uùz"+Í}î0êBwíJÇhlAuëúØ:Œú;o[`ÔMìa Œúkê¾£¾j›£þ6ëu}}ì(j»qÇ hUñ· ¨»ÛÛÜaÔÝíÊ<ÇèÐÁ¨ ºeí1js Š––_¢cì—FѱV ¨,쀨µÇ¹‡è¨Î¢Ö®›­µá6÷ ÕOMC­]¶ 2tÔwìê¢dÝÃnÕì^çîäºB8÷$§¹#œ­ó«ÛN8“˜#L´Æ´OßÌ|®z½ãÍ}ëc ¼¹]ہ7S¶÷z~v¼¹Ö}4¾y{îð櫆-ð† Þ¬í×wÞÜã>æÀ›mcX§À›µëGÝì ®ótóݵÜÌf=ǎm&Å mæÍ®ëh3_Û ² m¦ãúHÚLÙ>j`èh[5ï+£m]#¬s´™â«èt3e{œ÷D73²ýÝÌØÂv̘­7è¶nqNrº™±í¿• ¼•¶MÖÉt+«Êigº™ŸlW·À›ëØKG7[esž¡›·kjàt3åyª§® ›­ÛÆ1èf†ö<Ÿ7k[ &óÍ-îڙ~Ç6Ä7 îÌ7ïšXùÞsýºfMηúš3óÍWm7a†7wև£ã››ï5ör¾yoV69ßl„œÛÔñ̈́í±þ,‡ûëRG:|ó‘·Ìß|pÖÌÑMù¿qÝp&lÏëÙΆ¸ý&„C¶†pÞ®hÂùºú»$N8oo8gÐtt„«? 1áâ·D8wÀEÀD8·"÷5ÎVyx,ÂY{«¹¬Î%Éqëgzö^;qwÓr+€qf4oõ Œ³ucürngטkµ3™z¬gO‡œÛÓGKˆ½]Ù”[4• ÊYÛ¯¨‹r.dïKG9»ëè”s“|Yƒrnš× .0gßGôtÌù>›çLrk@ 3Ö¾¤3yÖk†"»¶5‰ Ò¹’»èLÛÄtæmãށμm]:³|ý\!Й·½Î‰s&mïËœ3iûÖàÜâkƎs&m/ëœ3i{RØfœ3Õx© @€Î¤m¯:S”m +Ð-ä5‰t‹ +7ÝBj$й]sߝ Øð謽ÏS€Î%îiê@gë–ڝºØ†@çvu-åèü½×#@çÏ©yƒÎÛJS:_µ.A:›å Ò¹“>LélO*èuÒywÎGÎFȼ®él$­KNºæŠt>òæ½#Îy‚tÖ¬[uÐÙxÞ×¹IÛç2è-ç óc¢¦á:_Wsd·ëvt΢iêHçÛ÷ ·‡=H‡~E:´÷%“n¶9¸KËVgÍãé\´¬AbÎ֍Ç!ҙÁ¬šœ‘Î…æ­ÏVg~A¤sE{oÙªµ§½ÏVMÙ^–­º<]C>'·§>]õíÖ ÇI7û\·=Hgí­æ+A:—´÷–®Vñ{ Ò¹n^ã» [êSKWgÍu†tf´îCŸ®º [×9é̞×»¶GŸ­º“[3Z'iÛÛÔ²ÕŦrU6Ò €UÒÙE§³Î¦jÖ؟Ã\ÞinhDvҕǏ+ÐÙÌ̵¥«ælo<Ç@WÞìØû|՜íckùª;ʵ +PA7ªŽ™A絕–°z{j «{ÐõDÖHWÖ-CKXûLóØHg]2=éÌ"ZÊۀt£Í«íSVïšUÒÙsj~SI7¶ŒÒÙªµ¥¬þ6KKY]Rï9Wvä>´ŒÕ;³2Ê9gdWæçl kËXç³Î—‡s>îæ>cõ±Y³e3Ö<—–²ÎökŸ²ÚŸkAÀAçd9[Î:kª¯«U·×)@ç(ê9ç›[Îêí¡å¬îyÏrÖÙ'äîçFÍ€scÍ҅9¿qµ¹œ-qõrÒÙYë%‰ ¤}i‰ëä ÐùÀ›ú¼ÕçRõ׍.<Šs6œÏ¥Ï[ý‡ æ98ç`9ZÞêíJèàœ& sÞ¬×=s¢«pnÒ¼)07Íq}Ü17Í:×÷˜Wó»¹*¶ÊÃXaÎڞª×ïZ…î 9[3×Ü]³ô©ø‚œ5k]0gÎó¾´K֞Ö6SÅÚËÚÏT1[»nÔçÂw-ú9â¼=ô³U|³õr‚3Î ïzÙÈç:w=f‚q¶nßÚl•*ŽŸÁ8k¯5¸ ÆÙ7;q£~ÍƙËzýt•Ñ‹‹{0μÙ5嬦ٞ{?]Åt\s`aœە_Ž¸Ñª.º^ âÊ:B/g\iûÌ9g6ö8.‰qæc{ÉKŒ3{>Út{\Ì Æ&¤µœÕtíC±›!®´ ¾ú«£•2Ö6[Ååë:óÄ7’|$čTXĸ‘FŒ3åyªùi@Îíë£ÍV-··€œµG]¦r¶nÚl•Ø† gíeëg«ø{/S@Ο£«hK¼¦›­â«æ6[Ååñ¹ÍV±¯gnp†œÛÇÑf«xNS@ΆÈY¯äFûEÏ¥MWá­(çCoꧫØð<êL6VNŸæJ{˜ç~ºŠòµ^DpÌ9Xö6]ÅÛ5YÌù‘R3Yç\%Íœs ýtßÎЦ«X[°sÞžMWñߞܻpÎ+›óœ³U hœ3‹ò<ú¼Õn•ìvó,%äUÒY!\—§uÜ Îìíµ^uÔÙ¯#(' ÔÙ1¹µ´u·™³KCµ‡Š¨@möÛÕV;h‡¡]‡@ùΨsqüœuægO{Ë[w›ö¼öy«üÆPg»lÜZuÎ×cë/¸zqqmy«ÿ,åÜfæÙ¹Wnêl^á2µ §í–·Ú–žg͝L›êl±hYQg3ÎÇ|!Â|ì}jy«ùÚ0ÙQ7hROF]UÏëüö$kcÝÐ.Tëý\¬³_-T֍ª5fÖ¹ÝòVo-oG•<3ë̾>ZÞj†ö>®u¥½kÏ:ûÕ¬¡å­± Xç3‹{ÔÙ[×,¨¢ÎžÒ¹úŠ.oõUsË[]Ÿ[Þ:꧹:ҕ9-oµîœ†VŸ³Cœ÷žte$é¾:ãë>¶ %6ðÆ£Ï[­:>Özœ +¦‹§º2žw͚ Ðv)®¾ÄAgdÙ÷vÁõ¨Æq:ÿ-ã±]puÔ¬ t†¢A™% +ë4‡Ì9wø5•vÁõð³ýr͹ðAèBt>#{Qå`O:Hfë kL@väœ#y $ãÎe³Ûy2À $/d˜gsÿ×yn_ÃÉÔCz¡ƒ€½ÐA2÷†jÀ¶i&¡ƒ@>tL¾¦ƒ}Mûš’à:q:q:HŽóðAˆóÙj ‡’=„’Y !ä²!-—•B*‹B*‹’SYé d²è ”ìÐArÉ„’V-“ÅéJvòA¢d§¼†Š|®b÷¢*ýQ±“; !]ÅNBHTìØ;!]ÉΌåa„DÍNFH®ÙI‰š„¨ÙIéjvB"••Qž„.ʓQžŒˆòd„døa„~!„@¿B2þB.„ ­n>HàP{m "…@ÀB2à -‚a…@Á°B®0øG4¶ÿØ"¶­ó2 (k#¶6lç[³6¿Ç4ÉÞ²Kp¶VlÝcݸ{#¶Âlݶ0G¬}Öon° hM½ÄՑµÄð|×RïCQøz†:b‹Ú¶±ë]I–0G|œ 3GJ{÷%ÞÁ -³¶tn“zmEkãæÈj_µ·Åoåæˆ-®š«Òa«”|…^µ˜ÝY—º|±\ý -17GlÌåY»9âË+ÇxWþl.ù—Jµmxôƒ9bí­)nŽ¬ö=Sˆ#6]ÏxI½éŠaŠ—ØÄ÷é,g˜#v\a§›9bǦ]ÇÐkÜñ”Sˆ#¶ˆñ¨ÂÑ2jýᾑ‹#õ7Kˆ#¶}‹#¶DÓ8Ósñ{ñKýR7Gle'ߟ²Ö{õìcû*7GlÕ¢‡â2Gbu¨Ì[=z4Ô³¥vKˆ#ö”Yˆ‰#öã&ÕÕQ¾0µz .ŽøsäfÛ+Úºÿ˜#J¥ŽJ¥ŽJåŽt(•;(•=(•>Ò±TúH°TúH°TúHf©ì‘jµG‚§²G:žÊ žÊ žÊéx*{$x*{$€*{¤ªì‘ªì€*y¤ªä‘ªä€ºIÉ@Ý$Ômj´ëù¿Þø*u“<Q7“GÀé&y$ãt“>N7é#àt“>’qºI§[ÕG é&}$Ót“>"šnÕ¦Û÷D -˜n²G€é&{˜n²G2L7¹Àt«ö,ݪ=’QºÉ¥i 5‘”=’QºÉJ7É# t“<’QºÉ¥›ìPºU{$“t“="’n’G é&y$£t“<J7 J%t(­òHTöHTöHGÒjHe¤eönt •=H%H«<ÒqTòHpTòHpTòÈ5G±G2åÐG ú”ÃɔÁrÕ q($™qRH@ - ˆC!IˆÃ q$0NIF ˆÃ q$q$ ƒÄÉ É„Ã p2H8 $™oHÀ xC ÉxC o$à $㠁¼!@8’L8‡BáPH2áPH sÄI!ɄC!á0H@œ ’L8 ‡Aá0H2á°?  ˆÃ Ɍà qiÎ8 ’Ì8 1Æ!dÆÉ q$ ƒ$3ƒDŒC q$™q$0Æ!dÆ!9  ‡A’!‡Aå0HÒLð -H¦‰('È!dÊ!@9(‡@rM9 ’L9(‡BåpH2åpH  œC#ɜC#th$€$‹Ða‘:,’L:,H‡Eé°H2é°H  ¤Ã"ɨÃ"uX$bI† ´C"vH$™v’H€ °C"É°C"vH$ÀNIf ¬C#uh$™uh$°Ö¡‘dØ¡‘vX$À‹$ÓN °Ã"vX$v À‹Øa‘dØa‘»´ ‡I†‰`‡DìH2ì°H  ´Ã"É´Ã"íH I¦ ´C"vH$™vH$ÐN °Ã"É°Ã"vX$À‹$ËD°C"vH$™vH$ЉÚ!‘\Ó‹$Ӎڡ‘@;<’L;<h‡IíPI2íPI * ´C%I´Ã$v˜$Г$Ó“Úa’@;L’L;Lh‡Ií0I2í0I &‰h‡H’i‡Hí$’;D’ ;Dh‡H´“HÒÑN"IЮŠ$;‰$í¤’í†àr¥]UI:ØI% ØI% ØI%é`'•ØÉ$ ØÉ$é`'“$h'“$h7F}µÑNHÐN&IÐN&IG;™$A»¶J;™$íd’@;‰$A»1ò–F;™$A;™$A;7I:ÖÉ$uI`"If" ¬C$uˆ$™uˆ$°“Øa’dØa’;L`‡I’a‡I"Ø!’;‰$™uˆ$°‘Ö!’É%‘ØV¹$òZÉ%]^[õ’Hk¥—DZ+½¤Kk«^Y­ô’(áI/éJxÒK(áÉ.‰žì’®„'»$JxJr¨àÉ.é*x2C¢‚'»$*x²Kº +‚a…@Á°B®0ø¯hlÿk‹Ø6ÏË4 ¬ØÜ°_ÍÚüNÓ${Ë.ÁÙ\±uyãîØ ³uÛ±öY¹Á 5­ôWGÖÃó^K½EáëêˆMjÛBÄ®w%YÂñip2<Ì)íyܗx+ÌÚÔ¹MêµE¬=Žg˜#«ýÔÞŸÊÍ›\5W¥Ãf)ù ½j1»9².uz¦^âæˆMœ:ö3Ì›8µÏ!Žp“ ½¤NH[Â{ñqè·©Ñoâ˜8²úïKJ^–8RÖÙ9qÄæ/ŽõÇ>ü‚«µ×9¤?5ù<Ȫ}¸8bm×($ŽøœÇ­WGlÝQÝZŸÍ`s­¼ØºG<º×k\ñ©bãêˆ=ÇéJêˆ=>ì¡g¸:â{isÄvâ^M7GlGoí%nŽXgô1G|ÒÛ4†9bm›•ÂkÌúðÉrõ'Äܱ>—gíæˆO¯ã5^ù³±ä?*Õ¶áÑ戵·¦t¸9²ÚïN!ŽØp=ã%õ¦+†)^bßo¤³œaŽØq…n戛vC¯qsÄ'PN!ŽØ$Æ£ +G˨ù‡søF.ŽÔ;Ü,!ŽØô{.ŽØMã| ÏÅïÅs,õGܱ™ü~ÊZïÕ³í§Ü±Y‹ŠË‰Ù¡2GlöèÑP;̦Ú-!ŽØSfI &ŽØÃM«³£|bjõ@]ñçÈͶ V´uÿ3˜#J¥ŽJ¥ŽJåŽt(•;(•=(•>Ò±TúH°TúH°TúHf©ì‘jµG‚§²G:žÊ žÊ žÊéx*{$x*{$€*{¤ªì‘ªì€*y¤ªä‘ªä€ºIÉ@Ý$Ômj´ëù¿Þø*u“<Q7“GÀé&y$ãt“>N7é#àt“>’qºI§[ÕG é&}$Ót“>"šnÕ¦Û÷D +˜n²G€é&{˜n²G2L7¹Àt«ö,ݪ=’QºÉ¥i 5‘”=’QºÉJ7É# t“<’QºÉ¥›ìPºU{$“t“="’n’G é&y$£t“<J7 J%t(­òHTöHTöHGÒjHe¤iönt •=H%H«<ÒqTòHpTòHpTòÈ5G±G2åÐG ú”ÃɔÁrÕ q($™qRH@ + ˆC!IˆÃ q$0NIF ˆÃ q$q$ ƒÄÉ É„Ã p2H8 $™oHÀ xC ÉxC o$à $㠁¼!@8’L8‡BáPH2áPH cÄI!ɄC!á0H@œ ’L8 ‡Aá0H2á°?  ˆÃ Ɍà qiÎ8 ’Ì8 1Æ!dÆÉ q$ ƒ$3ƒDŒC q$™q$0Æ!dÆ!9  ‡A’!‡Aå0HÒHð +H¦‰('È!dÊ!@9(‡@rM9 ’L9(‡BåpH2åpH  œC#ɜC#th$€$‹Ða‘:,’L:,H‡Eé°H2é°H  ¤Ã"ɨÃ"uX$bI† ´C"vH$™v’H€ °C"É°C"vH$ÀNIf ¬C#uh$™uh$°Ö¡‘dØ¡‘vX$À‹$ÓN °Ã"vX$v À‹Øa‘dØa‘»´ ‡I†‰`‡DìH2ì°H  ´Ã"É´Ã"íH I¦ ´C"vH$™vH$ÐN °Ã"É°Ã"vX$À‹$ËD°C"vH$™vH$ЉÚ!‘\Ó‹$Ӎڡ‘@;<’L;<h‡IíPI2íPI * ´C%I´Ã$v˜$Г$Ó“Úa’@;L’L;Lh‡Ií0I2í0I &‰h‡H’i‡Hí$’;D’ ;Dh‡H´“HÒÑN"IЮŠ$;‰$í¤’í†àr¥]UI:ØI% ØI% ØI%é`'•ØÉ$ ØÉ$é`'“$h'“$h7F}µÑNHÐN&IÐN&IG;™$A»¶J;™$íd’@;‰$A»1ò–F;™$A;™$A;7I:ÖÉ$uI`"If" ¬C$uˆ$™uˆ$°“Øa’dØa’;L`‡I’a‡I"Ø!’;‰$™uˆ$°‘Ö!’É%‘ØV¹$òZÉ%]^[õ’Hk¥—DZ+½¤Kk«^Y­ô’(áI/éJxÒK(áÉ.‰žì’®„'»$JxJr¨àÉ.é*x2C¢‚'»$*x²Kº žì’¨àµmÔ žì’®„'»„žä’¨áI.éjx²K¢†'»$jx²KºžìÒZÉ%íI.é¢=É%íI.‰hOrI r »†]’v Ä.a—d†]" -"—@ÁK2C.„!—@K®Qøgl—ز[’íë›æKleÅv´›’X{h·ìr¹ÄV[èÆÍZ{™â.¶^co÷ ±ë&Ö5.í.¶&`Ú]þ‹ynI`—ÿý«Öä–ø¢‘£ÝåÏ•´ò^¦µ.ÝÌՒҮ_R/µÄÚÃÃՒÒç÷‘”ZRW³´»üÙ„yîïògë\‹–ZRÚ»TwKlAw×}Í¤Ý ·Ä íí.‹e9á‰Ôo\ýþP2KìÛÜîòg«{nÈ!³„@˜%öšslwù³ŸÛ¥5Ì[¤^ú -ûEϱÝåÏVP ø2K|UÅÑîò·(Ä,±¶‰þ™%¾“–-Ôۉõ^!n–Ø~¶¡ÓKÜ,±¾sowùóõ!g»ËŸ ÝÌN“âëJŽv—?kë~#n–øR¤£¿ËŸõÃr“¶±ËÙêijû«ÇÛX¡Õææt¶»üÙԝÏv—?›Úë{ÀÍ_Á4µ»üÙAea7f‰-M²{÷ê5n–øZ£s µd9뭐¤–ØÂ,MWK¬om·$±-èÆãÐG`úHfúŒCqè#™qè#0}ÆádÆáÀ8ü‡?’‡>"ÆÉqØ#qØ#0{ÆadÆaÀ8ì‡=’'{Äa€8쑌8ì‡>"ÄadÄaÀ8ì‡=’!‡ùä°G€öH†öKÛØey˜<’!‡<ä°G€öH†öÃrØ#rØ#@}È¡dȍ­DjÃrØ#™rØ#P{ÌadÌa€9ì0‡=’1‡=çÐGàúHâöœÃsØ#לÃɜÃçGàòH&ò¤CtÈ# u¸# wÔáŽdÔIêpG@îHBê¨Cu¨#u¨# uÔ¡ŽdÔ¡Ž€:ÔP‡;’Q‡;êpG@îHBêˆP'sÔaŽdÔaŽ€:̑@Ì‘u2GuCc²£NæH‡:™#Á:™#Áº¡]¨ÖÉ ÖIu2G:ÖÉ ÖÉ ÖÉéX'ë#X's$X's¤cÌ‘`]ÛÆ^ñjE âH ®š#Aº±%+A:™#A:™#A:™#édŽ@:ÔH‡:’I'uD Ãt˜#t˜#€sÐaŽdÐaŽ:Ì@‡9’A‡9èPGêHÌ8‡9ç0G®9æH]˜#"]ˆ# .đ̺G€]ˆ#Ð.đ„»ðFà]x#/¼‘L¼GļðF€^x#‰zh#P/´°ÚHæ^h#€/´ȇ6’ÉÚè mö…7’á‡7qž¼‘ˆóää8OÚq^#[ ôdtž¬‘Hf«5¹¬¬‘.—­ÖH¤²²F"••5Ò¥²Õ‰LVÖH”ìdt%;Y#Q²“6BÉNÖHW²“5%;%6Tìdt;Q±“5;Y#]ÅNÖHTìÚ6öjwLZÁ×Jv’F¢f'k$jv²Fºš¬‘¨Ùɉš¬‘®f'k$RYi#åIé¢l8u -mĆ\7qmdv{"^SË~ƒÜv´‘Á.kíͱÓ|ó9ª7b±½~—½^jŸx©£…W¼Äµ»XxNM±ëvûÙ´;0¸ïIÕFF[õ>7m¤ìqÃ9ÚÈXKs j#v}{NÞÈhE˜³y#c¥|LÏÅ·³.I뒹ÐFÒÝÉB±…ÃÙ´‘Qßð6¢ \¯©ÚHù„Øh®Œu!`h#cöÆ´6ªôùmßðFì9çÚ¼ÛkÿÖHÂ(ÒÅF‘F2F‘F„Qœ0Š3’9Š4G‘Fà(ÒHæ(Ò0•5K±F2K¥K¥K¥t,•6,•6Let0•50•50•5ÒÁTÖHÀTÖ0ÅÉ0E¦x#Ðo$Óošº7JñFJÑF@)Ú(EÉ(E¥ÒF )ÚH")Ö$•5HÑF2HÑF)Ú EÉ Eú¤ÒF਴‘ŒÑÐF„ÑÐF„ÑðFFÃFÃFÃi mD mDEI mD mD m$a4´a4¼0Š7’1*oDE¢h#™¢ÒF€(ÚEÉE¢h#@TÚÈØ9cՁ¡x#0o¤chX#p!ˆpaT…4’ÒH%œœñ-œ‘Ä7¤á-¤á-¤‘„·F„·°FÄ7¬‘„7´ð†6ÞÐF2ÞÐFÀڈð&k$Ó kºÉn²F2Ûd€6¬І5’ц6ÚðF@ÞHFÞhÁnx#‰nh#Ð mº¡dº¡@·øæNáMÚH¢ÖtÃoÒF2ÝÐF ÚtCÉtCù€nh#à m$ó-´ñ-´ñ-¼‘Ä·ðFÄ·ðFÄ·ðFßÐF„·ÐF„·ÐFßBßBßBI| mD| oD| o$ñ-¼‘ -¸ÐF¸ÐFàBáBáBI„ mD„CàBI„ oD„ oD„ o¤#܂5Ò· ˆp ÖH%܂4’· TÂ-8#b܂3’· r ҈ · $È-H#‚Ü‚5"È-X#‰r‹´(·Hr‹´‘L¹EÚ”‹z•r‹¬‘Œ¹EÖ˜[dÀ¹EÖHÝ"kÒ-²F Ý"k$“n©Ú [ö±qP ·.J Ð-{Ä\,epoÐ-ÕIœ[¤À¹EÚœ[¤dÎ-ÒFàÜ"mэ$Ða:¬@‡6’I'mС:´‘ :”@‡6èÐF2èBèBèÂI  oD  oD  o¤.´‘.´‘.´‘DºÐFDºmD¤ m$‘.´‘.¼‘nÁI¤[ðF*éi#݂6’@· t ÚÈgÕF贁nAé´‘±sǪ7"Ò-x#"ݲEÞ=|Äi¤ iD¤ k¤’.¤‘DºF*éÂéÂI¤ iD¤ iD¤ i$‘.¤‘.¬‘.¬‘D:´H‡6éÐF2éÐF ڈH‡5’I‡5é°F ÖH&Ö¤“5è°F2èÐF ÞHNÞHGº!â/¤U;ÂA'o$“NÚHn$WÒUm¤´‘´‘´‘ :Y#:Y#:i#褍餍餍t¤“ò¤“6¤“6ґmÒ¡@:¼‘L:¼H‡7éƖ°œñqª6éÐF ]ÕF2çÐFàڈ8ÚHâ\h#â\x#â\x#‰sáT΅6"Ѕ6’@ڈ@ÚÈiG]“@ڈ@ڈ@‡6’8ވ8ވ8ÞHÏ9¬‘Ä9¤8'kD˜CɘCæpFÀÎHÆÒ˜CsH#sH#`kÌadÌI ÌUm$('m¤£œ´‘ œ´('k¤£œ¬‘ œ¬‘ Üw…É7xð5ÊA9Y#¹jt”“6”›ÁŒrx#™rx#PoÌá$Ì¡€9´0‡6’9‡6çÐFàÚHâ֜Ásh#™sh#pmэdΡ|À9´8‡6’9ڈ8ڈ8‡7’0‡7"ʅ7"ʅ7Ò(ڈ(ڈ(ÚHâ\h#âÚ˜CɘCsðÌádÌásh#`m$cmÌ¡€9´‘Œ9´0‡6æÐF2çðFàÞœ#A>b4΅4"΅5RAÒH]H#táŒtáŒ$Ѕ4"Ѕ4"Ѕ4’@҈@ֈ@ÖH´8‡6èÐF2èÐFڈ@‡5’A‡5è°FÖHÖ ÃtX#™th#oÒádÒÉtx#€o$mС:´‘ :´@‡6èÐFè°FÖ CÉ “6çÐFàœ´‘Œ9”0‡6æÐF2æBæBæÂIœ oD  oD  o¤.´.´.´‘ºÐFºÐFDºÐFéBéðFºðFè© CçBIœ mDœ mDœ m$qmD˜ mD˜ m$a.¼a.¼a.¼‘sa4̅4"̅5R1'i$A.¤‘ -¹pF9œ‘ĸFĸFĸFãF„¸°F„¸°FâÐF`ÚŒCɌCqh#bÖHf֌ÁqX#™qX#0kÆadÆ¡À8y# o$#oÆáÀ8¼‘Ä8´‡6ãÐF2㤍€8´‡6’‡5â°F@ÚHFÚŒCqh#r(@mÈ¡dȅ6"ȅ6"ȅ7’ ވ ވ ÞHƒ\h#‚\h#‚\h# r¡r¡r¡$ȍí 'rፈrá$ʅ7R)ڈ0ÚHÂ\h#Â\h#Â\h# s¡ˆs¡ˆs¡$΅7"΅7"΅7Òq.¬‘ƹFĹ°F*çBI¤ i¤’.œ‘.œ‘„ºF„ºF„ºFêF„º°F„º°FêÐF@Ú¨CɨCuh#BÖHFÖ¨ÃuX#uX# kÔadÔ¡€:y# o$£oÔáêädÔI Ô åŠ:i#ꤍ뤍ë†v¡bˆ—¸5¬“5¬“6Ò±NÚH°NÚH°NÚHÇ:)Á:i#Á:i#ëÐF`Ú¬“7’Q‡7êä@º±å+gû0ÇÜòÖÐF ÚH&ڈHڈHÚH"ڈ@ވ@ÞH]x#t¡t¡$Ѕ6"Ѕ6"Ѕ6’@ڈ@ڈ@ÚHވ8ވ8ÞHǹf4Ð5iD¤kÖHE]“Fëš4RaלÑ®9# wMïš4"à5i$¯I#b^³F½f$ꡍ@½ÐFÀ^h#™{¡¾ÐFD>¬‘L¾°F@_X#°/¬‘ ?¬‘ˆódDœ'k¤‹ó¤Dœ—È恞¼‘.Г7ÉlõF"—•7’sÙªD*+m$RYi#]*[µ‘Èd¥DÉNÚH.Ùɉ’¬‘(ÙIéJvÒF¢dWóš¨ØIé*vR>¢b'm$*vÒFºŠÚ;´*vx#¹d‡7BÍo„šÞHªÙ¡P³C¡f‡6’kvh#¤²h#Dyh#9ÊC!ÊÃ!ÊÃIð o¤Â¯i#¢_ÓFþš6"þ…6"þ5m$°i#"`h#"`ÓF›7"6oDlÞÈo]ügbX±Ü\¡¬X߸/¡XÁݖâXÁÝ&×ç—æXþ<¶Gfï$ŽØwÝwqÄú¬2ƒ82—þ\ÎG¬]üÞ_b­m•ÏáaäTK{x#v±a=—x÷F¦z]#¼‘©^9odª58½¦z#SùM«ñâވU§§­‰#ªNë%U1¥â<›8RæoÕlª72^ÝСöùÂËðF†z܄7Ræ}9!Õ(od¨·ˆÂ±eٍ፠uµº^ROLCͦÃêÚÒðF†zã âÈ`k8÷&ŽØqµ®M±cqdô;`…7bדŽ­y#¥m¨ö— ŽØN:Î&ŽŒõ âÈXׯé5U±K¾ãÖđ±†`!ŽLu5 ¯qqdªG|ˆ#6æõ^"U)ïoõ&½Æ Öçf{ۆoq¤´=¦à}¼ÀZæçÔ¼›¼s¼ÄßÆOM¼ÄÄ;l-$âˆg%m -qĎÃQ_âˆ_tYÂ)M¿ ’¼¿D³®Ì÷F¬Ï¼ۂî¹ãވ]ç²aLÏÅ¿UÍ8bmÃ9âˆ]æYÛí†\ñKhÇâˆ]b›IFo»¹¨×Ô›}ވ5-±`Þñ=¼ªð™W½Æ¼Žî?âë« hûwßêcŽt(•:(•:(•;Ò¡TîH TòH TòHÇRÉ#ÁRÉ#ÁRÉ#™¥rG¨Õ žÊéxŠ;OqGà)îHæ)î<ŨÈ#¨È#yD@ÅÉ@Ũ¸#C,ëç ¨áŽ¨áŽˆ¨áŽ$¢†;"¢VwD8 w$á4äá4äá4䑄ӐG*NqGDÓpGMCM‘GӐGLCLCLCI0 yD0EK‘GJ‘G@iڂùÈ#¥È#B)î(ÅÉ(E¥È# TòH&)òˆHŠ;IqG2JqG@)îH TîH‡ÒêŽI%I%t$­òH€TòH€TòHRÉ#€TîH€´º#GåŽGåŽGåŽ\s{$S}Ê¡@9ü‘L9ü(W‡@’'Ä!€8’„8ü‡?ãädą?"ą?"ą?’þˆþˆ‡@’‰‡@R‡?’ø†?"¼…?2Īþê$¼…?"¼…?"¼…?’ðþˆðþˆþH"\$"\$"\$‰p!T…?"Äá$…@"…@"Ä!$…@"…@2¶{Oõô„ D„ Dˆ $1Æ¥m8ãH2ãHÄ8ü‡?’'Ä!€8’Ì81ÆádÆáÀ8ü‡?’‡?äH€I† ”C r$™r$¢œü ‡?’)‡?åðG þÈ5å0H2åPH  - ”Ã!ɔÃ!rH$p‰$s‰Ð!‘:$’:@‡CèpH2éÂ!™â«¢«C2Å·1W‡$‘.‘.‘.$’„ºH„ºH*ëÂ!I° ‡D´ ‡D´ ‡$чD° ‡D° ‡$Á.Á.’!nØåIb]H$b]H$b]H$‰u!‘TօC"օC’`‰`‰`I¢‰`ÉؾÕj«9lÀ.$Á.$Á.$’;$`—¶Q¿@I†‰`‡CìpH2ìH  ´C"É´C"ípH I¦ ´Ã!v8$™v8$ÐN °C"É°C"vH$À‰$ÉD°Ã!v8$™v8$ЇÚá\Ó‹$Ӎڡ‘@;<’L;<h‡HíI2íI " ´C$I´Ã#vx$Џ$Ó.<’)–8WdŠEÄÕ#I´ D´ D´ ‘$Ñ.DÑ.D’J»ðHíÂ#íðH†XÞ_=’»ðHD»ðH I¦ ´“GìðH2íI Ýи|H?®`‡H"Øá‘;<’ ;D`‡HìI2ìI "ɘ.Æ֓Y£" ´C$vˆ$™vI‚vm|㉋$í$’@;y$A»1ò–F;‰$A;‰$A;I:ÖI$uòH`If ¬Ã#ux$™ux$°‘Ø!’dØ!’;D`‡H’a‡H"Øá‘;y$™ux$°Öᑠ°Ã'vø$vø$b]ø$‚]ø$ vá“vá“v!”$؅P"؅PRa>I‚]ø$‚]ø$C,ó¯>I¢]ø$¢]ø$¢]ø$‰vø$‚]ø$‚]ø$ v!”v!”v!”$؅PRa>‰`>I‚]%‚]%‚]% v%b]%bBIB]%B]%B]% u% .mÃQ‡P’Y‡P"Øá“;|’ ;„`‡PìJ2ìJ;|h‡O’i‡Oíä“;|’ ;|`'¡Ö!”dÖ!”À:„X‡P’Y'¡D¨Ã'uø$uø$ ŸÔá“\££$£¥Ô¡”€ºê”dÐá”:¤@'©$s©Î!•À9¤’Ä99%`§Ìá”d̅S"΅S"΅S’8N‰8N‰8RIâ\H%â\H%•sá”$΅S"΅S2ÄBÿê”$΅S"Îá”sá”$̅S"΅S"΅S’8R‰8R‰8RIâRIÅ\8%Â\8% s!•s!•s!•$̅T"΅T"΅T’@R‰@R‰@RIR  KÛpÐ!•dÐ!•t8%€§$ƒ©Ð!•:¤’ :¤§Ðá”dÐá”:œH‡S’I‡SéJ@RIFR ¨C*uH%uH%bN ¬Ã)ɬÃ)u8%°§äšuX%™uh%°­Öá•dÚá•@;Äh‡X’q‡XîKÀbI¼p‡WîðJ2îÂ+îÂ+îÂ+I¸ ¯D¸ ¯D¸ ±$á.Äá.ĒŠ»ðJîÂ+îÂ+Xî/¯$á.¼á¯D¸ ¯$á.¼á.¼p‡W’q‡Xî†FfÇbIÆb‰x‡Wï†ví"x‡XïKàbIæb ¼C,wˆ%™wˆ%ð±Þ!–dÞI, ÞµmTÞU±¤ÃÄpW½’ ÝiK£Ví$–í$–t´“X"Úá•@;¼’L»£¥÷«ßö¦z%À¯$ïØ!–;Ē ;Ä`‡XìK2ìK;¼`‡W’a'¯Öá•À:¼’kօY’aj ´ µ܅[’yn À ¹â…\’‘r Ì ¹è…\’¨n Ü ·ð…[’Én‰È×Ü¡¯¹%‰}Í-üš["ú…\’è×äá¯É%•Í-I ·„x·„x·$Ç{¸%Ä{n5àÃ-Én ‰­ÜòZܒœ×ªˆFZ‹\BZ‹\’ÓZÉ%ÊjqK(áá–är %<äJxÈ%¹„‡\B OI<ä’\ÁC.¡‚‡\B¹$Wð$—D¯m£Vð$—t%<É%Ôðä–D OnIWÓ\5<É%QÓ\ÒÕð$—ÖÊ-‰hOnIíÉ-‰hOnID{rK2qK`È%0䒌ÀK` r ¹$C0äQ· -†[’1n ·†[rÂ?c»ÄŠG¦e»Ä‹LËv‰µí¸Á.™”8~iv‰ª,ôÀ.±ö1/Ø%Ö^ár‰•¿Öu ¹Äê)ZjîµêÒ.¹ÛŽ]bÅ´ó¹Äêm“$“K&[V»…õAµe[u«X{¨kæ].)íuikä].±*ŽMÉ%^À9çK¬€³/ñA\.™æjˆ —”vIî÷°K¦ù궵7Æ_kÖÕ| Ù%S/–LëWbeQ»s^‰—R¹‡¼¯¾V'Ľ/­šd!¯Ä+¶º•^‰•W-’Å+™æšøá•x-wA^‰}Ø2œ!–ØsL{@,ñzÕÂǤú”3±Ävàz†Wbûxm/q¯ÄÆÁï\(¯¤´}šá•X{oîÆQ«¸^õB+±ÑÖ½F\+±Ù°µ…xùoZd¾·mÔۄ¸Tbsnݖxÿö¥å…ó«Äf­ßÔE ½J8·×˜Ub3ÿœ·°JìxÚ«XãV‰“K^Ü*±‚ä<졕L¶–¥êHKý±•¦€k%ö’ó«dÒÂN¬’ÒvÀÇ´\|3þR¬’i«GVɔîL†UbeQ‹‹°J¬þì_ñ/«¤´]lÔkêp­u 3Z‰=ÇfZ‰ý<IJºZÊ dAV‰=eÔÝIlÁ•ƒlù¸I‡PY%PY%PY%Be•Be•Be•d†J* †J* †J*é*«V©$8*©¤ã¨¤’ਤ’ਤ’Ž£’J‚£’J¤’J:J* J* Ê*é@*«$@*«b•L½P"â“@R|’LR|Hê> Å'ÉÅ'£ø$`Ÿ$cŸŒJ(¢%™¢%PTB‰ ŠO’!ŠODñI€(>I‚(2•NC¥“d„¢“€Ð´…z‹—I2B‘I@(6 Å&ÉÅ&¡Ø$ T6I&(6 E' è$¡è$B(6I T6I‡Ðj“Ae“Ae“t­6IT6IT6IPÙ$Ð1®%V€V$óS6IðS6IðS6É5?±I2Ý°I 6 tÃ&ÉtÃ&nÕ&mØ$‰m’I@2 hC&ÉhÃ&ڐI`›d’Œ6dІLڐI2ڐI@2 h“L’ɆLÙ$“6Ù$™k²IÀ6 XÃ&™z‘DXÃ#kx$kx$` ²á‘d²á‘@6<ȆG’ɆGÙI@›D’L6DȆH"´É#ÉdÃ#lx$ $‘ ²¡‘€64’Ì64ؖ¶QïâIf lÃ"mX$™m²H@ hÃ"ÉlÃ"mh$° $³ DlÃ"mX$™mX$À ‹¸a‘d¸a‘@7,è†E’é†Eݤ‘74’D7,è†EÝ°H®é†E’é†EÝ°H I¦ tÃ"oX$‰oH$‰À!‘dÀa‘pH$‰$‰Â!‘@8$’L8$7áH2âH@ ŒÃ"ɐÃ"rX$P‹dêAÈádÈá9ü '$3ÆáÀ8ü‘Ì8ü‡@ãH2äH€‰ ‡?’)'Èá9ü‘9Ô ‡>äÐG2äÐG€\چn rhCrØ#@{$C{Êa@9ì‘L9ì(‡>åÐG2åÐGD9ì(‡=’)‡=åd9ì‘ 9ì ‡=ä°G2ä°G€ú”CI”ÁrØ#P{äšrØ#™rØ#P{ÊadÊa@9ì(‡=’(‡<åG òH¦öˆ(‡<åG2åG ò”CɔCrÈ#Py$SyÊ!@9ì‘L9ì‘ô׶æ Èap;q‰#¢ÞHPNÞHG¹!Â.¤UÐsÈÉé('o$(7‰+åª7ÒANÞH@NâH@NâH9‰#9‰#@NÞH9y#A9y#A9y#™rR>‚rÒF‚rÒF:ÊI ʵmèËMé('i$('k$(7¶%('k$('k$(çÖHÇ8Y#Á8i#0m$3mDŒÃqX#™qX#0kÈadÈa9¬ ‡5’!‡5äÐF€œ´‘Ä8¬‡5ã°Fž1NÖHÇ8Y#Á¸jâdtˆ“5ˆ“5ˆ“5’'i$'i$'i¤Cœ¬'i$'i¤Cœ¤‘@\•F‚p’F:ÂI ÂI ÂIé'i$'i$7Æ:î|“_œÖ\»5ˆ«Ö„“0á¦F¯¡ª -¾~4_Âዀ8|‘Œ8|‡/âðE2ãðE`ÂŒCɌCq#b¾Hf¾ŒÃqø"‰q¨0]Æ¡‹dÆ¡‹À¸´ -dÙöq’E ¶„ÃɄÁpØ"[$3[ÆI ÄIé']ÄÁÚö%n‹tˆ“-ˆ“-ˆ“-Ò!N¶H N¶H N¶H‡8Ù"8é"8é"™q²E‚q²E‚qcäÄã&Ù"™q“l7ÉrÓ1b@n’-ä&Ù"@n’-’ 7Ir“d 7Iɐ›d‹r“d 7Iɐ›ª,ã&É"@n’,’!7¡¸r“d 7Iɐ›$‹9Àä&Ù"r“l‘x®l 7É™zQD”›ä‰@¹IžH¦Ü´táxøò! 7Éɐ›ä‰¹i û±3Éɐ›ä‰¹I¢CɐCrˆ"‚žH†œ<‡'ãä‰$Ä¡x€84‡&’‡&âÒ6êí@\ɌCrX"@K$CKÈa‰9,‘ 9, 7Ir“4‘L¹Išˆ(7UKÈM²D2ä&Y"@nª–Œ›d‰dÆM²D`Ü$KÆM²D2ã¦j‰€¸Išˆ›æ¸SN2Å|ˆ›æ¸d‰\#K$#KÄa‰€¸j‰dÀa‰8,'K$ñ I¾!‰À7$‘Ì7Y"Â’xCÉxCoH"ð I$ó I¾!‰À7$‘Ì7$ø†$ß°D2ß°Dà–|ÙzAD|“ÞðC2ÞðCà~|ÃÉ|Áoø!ð ?$óM~xCo"o"à ADxÃÉxÁoø!ð ?$µÀ¡‡8ô 8ô—¶ñÿR÷v;»äÌyÞÌ9ÌNÛÀ4ûdö¤eo$Xq–ý! c,ç˜ÏmɧŸ®ªû*V?k"ç“cX†`­š~øv³Ù7Éb]UQ -Äá*pÀ!tR:ƒAà CªÀA‡ pà!xH8ð t -R:…ƒAâ CªÄA‡ qÐ!HtH•8è4<)‚ÆA‡ qÐ!ŸR5:ƒAã CªÊA‡ rÐ!¨tH‘9àd8™©2':D2‚̇T™Aæ€C9à*sÀ!Èp2Re8™Aæ CªÌA‡ sÐ!ÈtÈþC$sâB9¸*sp!È\Hʜ¸—̉ I™ÛR‹Cæą¼dN\HêœÀÔ¹-%–Î I‚Ή y霸Ô9q!©sâBªÎ éH’:',ä¥sÂBRçV*ò5’2THª\[û“T9Q!©r¢BRåD…¼TNT*‚ʁ…T•‹„ž#©D*¤ŠT"‚ÈA…T‘ƒ -Aä B9¨*rP!ˆX"RDNT‚ÆA…|j\R!Uä’ -Aå’ -Aæ’ -©:—TB—TJ—TH‘º„Bк„B»„BªÚ%"½K(ÁK(¤*PŠ—P’—PHÕ¼„B½„BP= ªz … { … {I…Tრ-Éõ¨\߉ -a}' „õ]Q5_à‰y-ðăä6xÜ¿Šyí_•g€í«xÜ¾Šym_ƒÉÝ«€tÑ y¹è„¤‹N@.:ñ /xtÑi;ƒ‡N:Ñ ¹}’«;á ¯ÕpVw¢Aru'¤ -4—4ʗ4H•¾¤AÐ>h´/i*~Iƒ ~à ¨_â Eþ’A“A“ù”Àÿ†igmoo¥Â fj­' b;¯kUi¾>ˈpgAlC7 -â{·Ö@Aì¿ÞWþÂY³ÙŒ òüÛgXû÷³Ú‡±å7{t0ÈóïͶÆü g”zTŒ±ëñäƒ<ÿ~^xޖà ¾× ˆÅâlAëþ×lóL$üÂYÛÉØ& Äv1Bgœ±Ê«”C£¨aKÄ6þ^¢O,ˆ¹Nà!f³CI!öÛ@A„à_ÐO|Fr¿Ä±'â>‡íJ"Ä=o ÄÝ%{K ÄîôY÷&bO3„ؾ̪_„Ø¿Ímbÿ¶¡æ¿b½dï ÄzÑδ B|¿¸~ãDˆÙ†¨;Ѷ—c›ˆ{wû¹ª“ŒØšúbÿVGBlŒ<¯–߸¯Ïl­ÓF·uqO(¤YlàÙòïx¹Úg|¶±JØðÝó7±e.?1&ľ€ó¹&Ä>3[ØÀ„Øg8·,h⟤íÎ- &¤Í¨$&Ä6óÀELˆoøcÜ8bM¨ÞŽC!æ± IŽÏÓÛ¹¢jˆ3!öÏ->6gB̯r®ZC΄˜í™z’ 1ŸÁ#ÒüßÎ#ê7$¼h濁 ±ÛÒ&Äzàºïb6[-…Ø¿ï(ìãQT®gû&¤ +"—@ÁK2C.„!—@K®QøïØ.±i6/$Û%¶nšC.±™ÛÑnJbí¡Ý²Ëå›m¡7{8híeŠ»üÙ|½Ý3Ä®›Øªqiwù³9ÃÐîò·XÌ»pK»üï?µ&·Ä'í.6©¤Í÷2­­Ò-Á\-)íú#õRK¬=Ìñ5\-)ëü>’RKêl–v—?›ƒ0Ïý]þl‚kÑRKJ{—Šãn‰M0èîú Ÿ™´›¡á–ø$¡½Ýåo±,'<‘úk‚«ßJf‰½`›Û]þlvÏÀ 9d–0³Ä^sŽí.ö¸]Zó×È,±Aºá¥Ïp°zŽí.6ƒbÀwYâ³*Žv—¿E© f‰µM„ð×È,ñ´l¡–ØN¬÷ +q³Äö³u^âf‰­;÷v—?Ÿr¶»üY×Íì4Y!>¯ähwù³¶î7âf‰OE:ú»üÙºsXnÒ6v [xvõx+´Ú؜Îv—?ºóÙîògC{b¸Yâ3˜¦v—?;¨,ìÆ,±©Ivï^½ÆÍŸktn¡–,g½’Ô›xc¥Aàj‰­[Û-Il º1›%6™É¦ïÇà¬?Ë­-Ý,±öx´»üÙ\ž­Ý“ÈÍŸß³La–ØDªÓdô¶ÛzMí°ò ý'Ò¤–XûØÚ]þŒBeõ=¬ªä©¿– ³ÄÚûÔîòç0›—?ƒYÒaTf •X•XÒaTbI`TbI`TbI樼’਼’਼’Ž£K€iõJ‚¥òJ2K¥•K¥•K¥•t,•V,•V0•VÒÁTZIÀTZIÀT^ISy%Sy%À¯$Á­D0Å*¦X%™¦X%ñ«Üf•€R¬’ŒR¬PŠUJ±J2J±J@©¬’¥ýR‹[%™¤X%TZ‰@ŠU’AŠUH±J)VI)N •UGe•dŒb•€Ñ´ý²–K%£H%`«Œb•dŒb•€Q¬0*«$S«Š¢•@Q´’ŒQ´a«$0*«¤ÃhµJ‚¢²J‚¢cüÄw£hµJ¢²J¢²J:ˆÊ* ˆJ+ ˆV­$3TVI0TVI0TVÉ5CWÍqȄ[e•ˆp«¤·J*Ʉ[%•@¸*•À7¤’Ä79%à §¼á”d¼!•o8%ðMNIÂJ xC)o(%o(%à ¥¼I)ÉtC)nkUJ€ÛZ’̶µ:% m•SÚV9% m«”¡m•QÚV%mëA]ç £º­2J2ÝV%ÐmÝ„¹`¨7è¶nq“…šh¶©µõšA5J2ÝV%Ð ¥Dx“Q’é†QÝ0J FI¦6tÃ(o%™o%ð-mƒ ½KýhÁ7„ø†Qß0J2ßd”€7Œð†Q’ù¶Ê(o«”ø¶J)É|[¥”ˆo«Œø¶Ê(É|[e”¸UF €[e”dÀ­2J Ü*£­2J2áV%n­J €[¥”$­š}áV%nÕ ®kÂa”dÂa”ˆp%¡$¡Â!”À8„’Ä8| ‡OäðI2äJ9| ‡O’(‡NåÐI :I¦: ”ƒP$cÌ¡“À9|’ :|H‡OéðI餓tØ$€›$ƒ›$¾„l@'›$s›Îa“À9l’Ì9l8‡Mç°I2è°I:‰@‡M’I'›Ða“:l’ :L@‡Mè°I2è°I]ÚÆ^e—I2èI6  Ã&É Ã&tØ$›$“›Ò¡“@:t’L:t‘›Òa“dÒa“@:Ù$€›$ƒ›Ða“:l’ :l@‡NéÐIé°I 6 ¤Ã&¹&6I&6‰H‡LéI2éI 2 ¤C&I¤Ã%t¸$—$“™D¤Ã%t¸$‰t¨$•Ò¡’dÒ¡’@:TH‡J’I‡JéPI .I&. ¤“KèpIèPID:L’ L’ŽtC„_•tÕ$ ÐÉ$éH'“$H74";éªIҁN&I€N&I€N&I:™$:©$€N&I:™$A:™$A:™$édéd’éd’t¤“I¤kÛØe|L{Ÿ²"’éd’éƖ­éd’éd’éÜ$é8'“$8'•Ρ’dΡ’ˆs˜$p“$s“Îa’:L’ :L@‡Iè0I2è0I*  “J’8‡Iç0Ià&É3ÎÉ$é8'“ÎU‘$0'‘¤ÃœD’ÀœD’ÀœD’Œ9y$9y$9y$æ$’€9y$9y$sÒHsU# ÊI#é('$('$('¤£œ4’ œ4’ Ü.c¾ïƒÏWÊÉ# ÌU$SN ”›‚`N9,’L9,(‡Eæ°H2æ°HÀ ˜Ã"ɜÃ"sX$p‹$s‹Ρ‘ˆsX$™sX$p‹Îa‘dÎa€À9,8‡E’9‡EçÒ6vùÛÞaN ”Ã"rX$™rX$P‹Êa‘dÎa‘À9i$9i$椑€9x æd‘t˜“E˜“E˜“EÒaNI`NI`NI‡9Y$¹1²ŽŠ9i$™s²H‚s²H‚scäÇç°H2ç°HÄ9$@‡D’A‡DèHI  Ã!t8$tH$  Ã!I “BçPH +I +  C!t($t($€…ÐádÐá:@‡C’H‡B"Òa@: ’L:$€ƒÐadÐa: @‡A’A‡Aè0HI  C!è0H2èdÀ9 8'ƒ$cûÌa€9 ’Œ9 0—¶±Ëô¶>qE t$€ƒ$ƒƒÐa: ’ : @‡BéPH2éPHD:$€ƒ$ƒƒÐÉ s$™s$pƒÎadÎÉ s($`…$aƒÌa€9 ’kÌadÌas$`® +$r$@ÈI IŒÃqø#0$3N‰‡?âðGâÐG`úŒCɌCqè#0}$3}Æ¡À8ü‘Ì8ü‡?ãðGãÐGÄ8Ù# {$#{ÆaÀ8ì‘Ì8ì‡=ã°G2ãd€8ì‡=’‡=âÐG„8쑌8ì‡=ã°G2ä0?€öÃɐÃri»,“G2äG€öÃɐÃrØ#@{$C{È¡9ô‘ ¹±•H rØ#P{$S{Êa€9쑌9ì0‡=æ°G2æ°GàúœCIœÃsØ#p{äšsØ#™sØ#âòœCɤCtÈ#y$¡wÔᎀ:ܑŒ:É#Bî¨ÃI¨Cu¨# u$£uÔ¡Ž€:ԑŒ:ÔP‡:êpG2êpG@î¨ÃI¨CêdŽ€:̑Œ:ÌP‡9¨“9Ò¡NæH nhLvÔÉéP's$X's$X7´ Á:™#Á:©#°NæHÇ:™#Á:™#Á:™#ëd}ëdŽëdŽt¬“9¬kÛØ«ã1^Í(A ÔUs$H7¶d%H's$H's$H's¤#ÌH‡:éPG2餎t˜#€s$ƒsÐaŽ:̑ :Ì@‡9è0G2è0Gê CI “9ç0GàæÈ5çÂÉ  sD¤ qԅ8’Yâ° qڅ8’pÞ¼ oà…7’‰∘ÞÐ o$Qmê…6öBÉÜ mð…6ùÐF2ùB}¡À¾ðF2üðF"Γ7qž¼‘çI!Îkd«ž¬‘.Г5ÉlµF"—•5Òå²Õ‰TVÖH¤²²FºT¶Z#‘Éʉ’¬‘®d'k$JvÒF(ÙÉéJv²F¢d§Ä†Š¬‘®b'ã#*v²F¢b'k¤«ØɉŠ]ÛÆ^íŽI3øZÉNÒHÔìdDÍNÖHW³“55;Y#Q³“5ÒÕìdD*+m$¢®nùP×á¼ø(´ëãÛ2‡5bm»(é1°´‘²n2t˱‹Û6›oÄÚ6[/ñ󒭓óáވµ]¢7âÙ%&H±UÇ0†6bWò,ðA±o³b&H±o<­Kh#ö+þ ØãC( nØª]Ž„Y#¶·j‘¸62kê‹^ãڈõ…ß½PÚHiûÜ´kÇÍ¥|Xwëڈu¹n6âÚÈìöD¼¦–ý¹íh#ƒ]Öڛ7b§ùæsToÄb{}–½^jŸxÿ¨£…W¼Äµ»XxNM±ëvûÙ´;0¸ïIÕFF›õ>7m¤ìqÃ9ÚÈX;Kc j#v}{NÞÈhE˜³y#c¥| ÏÅ·³.I딹ÐFÒÝÉB±‰ÃÙ´‘Q¿ð6¢ \¯©ÚHù†Øh®Œu"`h#cöÆ47ª¬óÛ¾áØsεy#¶×þÖHÂ(ÒÅF‘F2F‘F„Qœ0Š3’9Š4G‘Fà(ÒHæ(Ò0•5K±F2K¥K¥K¥t,•6,•6Let0•50•50•5ÒÁTÖHÀTÖ0ÅÉ0E¦x#Ðo$Óošº7JñFJÑF@)Ú(EÉ(E¥ÒF )ÚH")Ö$•5HÑF2HÑF)Ú EÉ Eú¤ÒF਴‘ŒÑÐF„ÑÐF„ÑðFFÃFÃFÃi mD mDEI mD mD m$a4´a4¼0Š7’1*oDE¢h#™¢ÒF€(ÚEÉE¢h#@TÚÈØ9cՁ¡x#0o¤chX#p!ˆpaT…4’ÒH%œœñ-œ‘Ä7¤á-¤á-¤‘„·F„·°FÄ7¬‘„7´ð†6ÞÐF2ÞÐFÀڈð&k$Ó kºÉn²F2Ûd€6¬І5’ц6ÚðF@ÞHFÞhÁnx#‰nh#Ð mº¡dº¡@·øåNáMÚH¢ÖtÃoÒF2ÝÐF ÚtCÉtCù€nh#à m$ó-´ñ-´ñ-¼‘Ä·ðFÄ·ðFÄ·ðFßÐF„·ÐF„·ÐFßBßBßBI| mD| oD| o$ñ-¼‘ +¸ÐF¸ÐFàBáBáBI„ mD„CàBI„ oD„ oD„ o¤#܂5Ò· ˆp ÖH%܂4’· TÂ-8#b܂3’· r ҈ · $È-H#‚Ü‚5"È-X#‰r‹´(·Hr‹´‘L¹EÚ”‹z•r‹¬‘Œ¹EÖ˜[dÀ¹EÖHÝ"kÒ-²F Ý"k$“n©Ú [ö±qP ·NJ Ð-{Ä\LepoÐ-ÕIœ[¤À¹EÚœ[¤dÎ-ÒFàÜ"mэ$Ða:¬@‡6’I'mС:´‘ :”@‡6èÐF2èBèBèÂI  oD  oD  o¤.´‘.´‘.´‘DºÐFDºmD¤ m$‘.´‘.¼‘nÁI¤[ðF*éi#݂6’@· t ÚÈgÕF贁nAé´‘±sǪ7"Ò-x#"ݲEÞ=|Äi¤ iD¤ k¤’.¤‘DºF*éÂéÂI¤ iD¤ iD¤ i$‘.¤‘.¬‘.¬‘D:´H‡6éÐF2éÐF ڈH‡5’I‡5é°F ÖH&Ö¤“5è°F2èÐF ÞHNÞHGº!â/¤U;ÂA'o$“NÚHn$WÒUm¤´‘´‘´‘ :Y#:Y#:i#褍餍餍t¤“ò¤“6¤“6ґmÒ¡@:¼‘L:¼H‡7éƖ°œñuª6éÐF ]ÕF2çÐFàڈ8ÚHâ\h#â\x#â\x#‰sáT΅6"Ѕ6’@ڈ@ÚÈiG“@ڈ@ڈ@‡6’8ވ8ވ8ÞHÏ9¬‘Ä9¤8'kD˜CɘCæpFÀÎHÆÒ˜CsH#sH#`kÌadÌI ÌUm$('m¤£œ´‘ œ´('k¤£œ¬‘ œ¬‘ Üw…É7xð9ÊA9Y#¹jt”“6”›ÁŒrx#™rx#PoÌá$Ì¡€9´0‡6’9‡6çÐFàÚHâ֜Ásh#™sh#pmэdΡ|À9´8‡6’9ڈ8ڈ8‡7’0‡7"ʅ7"ʅ7Ò(ڈ(ڈ(ÚHâ\h#âÚ˜CɘCsðÌádÌásh#`m$cmÌ¡€9´‘Œ9´0‡6æÐF2çðFàÞœ#A>b4΅4"΅5RAÒH]H#táŒtáŒ$Ѕ4"Ѕ4"Ѕ4’@҈@ֈ@ÖH´8‡6èÐF2èÐFڈ@‡5’A‡5è°FÖHÖ ÃtX#™th#oÒádÒÉtx#€o$mС:´‘ :´@‡6èÐFè°FÖ CÉ “6çÐFàœ´‘Œ9”0‡6æÐF2æBæBæÂIœ oD  oD  o¤.´.´.´‘ºÐFºÐFDºÐFéBéðFºðFè© CçBIœ mDœ mDœ m$qmD˜ mD˜ m$a.¼a.¼a.¼‘sa4̅4"̅5R1'i$A.¤‘ +¹pF9œ‘ĸFĸFĸFãF„¸°F„¸°FâÐF`ÚŒCɌCqh#bÖHf֌ÁqX#™qX#0kÆadÆ¡À8y# o$#oÆáÀ8¼‘Ä8´‡6ãÐF2㤍€8´‡6’‡5â°F@ÚHFÚŒCqh#r(@mÈ¡dȅ6"ȅ6"ȅ7’ ވ ވ ÞHƒ\h#‚\h#‚\h# r¡r¡r¡$ȍí'rፈrá$ʅ7R)ڈ0ÚHÂ\h#Â\h#Â\h# s¡ˆs¡ˆs¡$΅7"΅7"΅7Òq.¬‘ƹFĹ°F*çBI¤ i¤’.œ‘.œ‘„ºF„ºF„ºFêF„º°F„º°FêÐF@Ú¨CɨCuh#BÖHFÖ¨ÃuX#uX# kÔadÔ¡€:y# o$£oÔáêädÔI Ô åŠ:i#ꤍ뤍ë†v¡bˆ—¸5¬“5¬“6Ò±NÚH°NÚH°NÚHÇ:)Á:i#Á:i#ëÐF`Ú¬“7’Q‡7êä@º±å+gû2ÇÜòÖÐF ÚH&ڈHڈHÚH"ڈ@ވ@ÞH]x#t¡t¡$Ѕ6"Ѕ6"Ѕ6’@ڈ@ڈ@ÚHވ8ވ8ÞHǹf4Ð5iD¤kÖHE]“Fëš4RaלÑ®9# wMïš4"à5i$¯I#b^³F½f$ꡍ@½ÐFÀ^h#™{¡¾ÐFD>¬‘L¾°F@_X#°/¬‘ ?¬‘ˆódDœ'k¤‹ó¤Dœ—È恞¼‘.Г7ÉlõF"—•7’sÙªD*+m$RYi#]*[µ‘Èd¥DÉNÚH.Ùɉ’¬‘(ÙIéJvÒF¢dWóš¨ØIé*vR>¢b'm$*vÒFºŠÚ;´*vx#¹d‡7BÍo„šÞHªÙ¡P³C¡f‡6’kvh#¤²h#Dyh#9ÊC!ÊÃ!ÊÃIð o¤Â¯i#¢_ÓFþš6"þ…6"þ5m$°i#"`h#"`ÓF›7"6oDlÞÈ÷3;ùÏoX±Ü\¡¬Øºq_B±‚»M'ı‚» ®Ï.ͱ:ýyl!ŽÌ*ÞI±‡wÝwqÄÖYeqd.ü¹œ!ŽX»tø½¿ÄZÛ*ŸÃÃÈ©–öðFìbÃz.ñîLõºFx#S½rÞÈTkpzMõF¦òI«ñâވU§§­‰#ªNë%U1¥â<›8RÆoÕlª72^ÝС®ó‰—፠õ¸ o¤ŒûrBªQ0ÞÈPo…7b'ʲÃêlu½¤ž˜†šM‡72Ô¹¥á õÆ?þđÁæpîM±ãj]›8bÇ>:âÈèwÀ +oÄ®'[óFJÛPí/A±tœMë"đ±Î_Ókª8b—|Ç­‰#c ÁB™êl^ãâÈTøG¬Ïë½Dª8RÞßêMzþl›ím¾}đÒö˜‚÷ñkŸSóFlðÎñ?5ñGì°¹ˆ#vœ•´)Ä;OD}‰#~Ñe o¤4ý6HòFüͺ2ܱuv0àØtÏ÷Fì:—cx.þ«j~4ÄkÎGì2ÏÚn7äâˆ_B;ÖGìیH2zÛÍE½¦vØìÀðF¬iވíóŽïáU…ϼê5æøstÿŸ_e@Û¿‡û@ýÑæH‡R©#R©#R¹#JåŽJ%J%t,•<,•<,•<’Y*w$€Zݑà©Ü‘Ž§¸#ðwžâŽdžâŽÀSÜ€Š<’Š<P‘GTܑ TÜ€Š;2Ä´~~€1€îH"j¸#"juG„ÓpGNCNCNCI8 y¤âwD4 w$Ñ4äÑyD0 y$Á4äÁ4äÁ4ä‘ӐGSä±y$¡y”¦-ø‘<’QŠ<"”⎀RܑŒRäPŠ<J%d’"ˆ¤¸#w$£w”âŽJåŽt(­îHTòHTòHGÒ*H%H%t •<HåŽH«;ÒqTîHpTîHpTîÈ5G±G2åÐG ú”ÃɔÁrU q$™qH@ ˆC IˆÃqø#0NþHF\ø#B\ø#B\ø# qáqáq$‰p!ˆp$pø#‰oø#Â[ø#CÌê¯þHÂ[ø#Â[ø#Â[ø# oáoᏈpá$…@"…@"…@’I%\ø#BþH"\$"\$BI"\$"\$c»GðTO_A¸HD¸H„¸HãH`\چ3$3DŒÃqø#™qH@ ˆC ɌC ãðG`þHfþŒÃqø#™qø#@È!dÈ!@9(‡@’)‡@"ÊÉrø#™rø#PÊá\Sƒ$S…Ê¡@9’L9(‡DçH2çH  C"I Ã!t8$€‡$“.’)~*º:$SüsuHéÂ!éÂ!éB"I¨ ‰D¨ ‰¤².’»pHD»pHD»pHípH»pH»pHìÂ!ìÂ!â†]î$օD"օD"օD’XIe]8$b]8$ v!‘v!‘v!‘$Ú!‘v!‘ŒíW­¶šÃìB"ìB"ìB"I°C"viõ7$‘dØ!‘v8$À‡$ÉÚ!‘@;$’L;$чÚádÚá@;h‡C’i‡Cí$‘;$’ ;$`‡DìH2ìH;h‡C’i‡CípH É5í°H2íÐH  ´Ã#É´Ã#vˆ$Б$Ó‘Ú!’@;D’D;<h‡GíðH2íÂ#™bŠsõH¦˜D\=’D»ðHD»ðHD»IíB$íB$©´ $Ñ.<яdˆéýÕ#I° D´ Úá‘dÚá‘@;y$À$Ó‘Ú Ë‡ôðã +vˆ$‚ °Ã#É°C$vˆ$À‘$ÑÚ!’Œébl=™5Ú!’@;Dh‡H’i'‘$h׶Á/ž¸HÒÑN" ´“G´#oi´“H´“H´s‘¤cDX'Öá‘dÖá‘À:<X‡G’Y‡GëI€"I†" °C$vˆ$vˆ$‚ °“G’Y‡GëðH`É3ÖÉ$éX'•$X7’³WÔÉ%éP'—$P'™$P'™¤Cd’@d’@d’Œ:¹$:¹$:]:ïP‡Kêä’@:\’L:\H‡KéI2éI 2‰H‡K’I‡KépI†˜âŽ}X. ¤›‚bNºpIéÂ%"ݯ.ÉU‘ê’$ÔÍsìG݌L"ÔÍÈ$‰u32Ie݌K"Ö͸$‰u32‰X2‰X2Ib]È$b]È$b]È$‰u!“ˆu!“ˆu!“$Ö!“Àº´Z¤¯2IFd‘—Òá’dÒ!“@:dH‡L’Y7K&ëä’êä’t¨“K¨ƒ¹ N.I‡:¹$:É$:É$ê$“ê$“ê$“t¨“Lêä’êä’t¬“K¬“K¬#WîX‡M’Y‡NëÐI€>I†> °C(v%v%À¡Ø!”$Øá“;|`‡O’a‡O"օO"؅O’`>‰`>‰`BI‚]%‚]%vá“$؅O"؅O2Ä4ÿê“$څO"څO"څO’h‡O"؅O"؅O’`B‰`B‰`BI‚]%vá“vá“$؅P"؅P"؅P’`‡P"օP"Ö!”$ԅP"ԅP"ԅP’P‡PêÒ6u%™u%‚> °Ã'É°C(v%À¡$áD°Ã'vø$™vø$ÐN> °Ã'É°Ã'vJ`BIfB ¬C(u%™uJ„:|P‡O’Q‡OêðI@>É5ê0J2êPJ@J ¨«NIN  C*t’J2çJàR œC*Iœ“SæpJÀNIÆ\8%â\8%â\8%‰sᔈsᔈs!•$΅T"΅TR9NIâ\8%â\8%CLô¯NIâ\8%âN‰0NIÂ\8%â\8%â\8%‰s!•ˆs!•ˆs!•$Î!•T̅S"̅S’0R‰0R‰0RIÂ\H%â\H%â\H% t!•t!•t!•$Ð!•º´ RIR‰@‡SèpJ2èJR  C*É C*èpJNIN  Ã)t8%™t8%©Ô!•dÔ!•€:¤P‡T’Q‡T"Öá”À:œ’Ì:œX‡SëpJ®Y‡U’Y‡VëÐJ`^I¦^ ´C,vˆ%wˆ%à±Ü!–$ÜÉ+wx%à¯$ã.¼á.¼á.¼’„»ðJ„»ðJ„»KîB,îB,©¸ ¯$á.¼á.¼’éþòJîÂ+îðJ„»ðJîÂ+îÂ+wx%wˆ%ànhdvÜ!–dÜ!–ˆwx%ðnh×.‚wˆ%ð±Þ!–dÞ!–À;Äx‡X’y‡XïKàbIæÄ’à]ÛFå]K:ÜI,wÕ+ ڍ‘¶4Úi†qÐNbIÐNbIG;‰%¢^ ´Ã+É´;Zz¿úmoªWìðJ2ìðJ€b °C,É°C,vˆ%À±$ñD°Ã+vx%vòJ`^ ¬Ã+¹f]˜%v¡–@»PKÀ]¸%™wᖼK ^È%y!—À¼K€^È%‰zá–À½pK_¸%™|ᖈ|Í-úš[’Ø×ÜÁ¯¹%¢_È%‰~M.þš\Rù×ܒÀpKˆ÷pKˆ÷pKr¼‡[B¼×èV>ܒðᖐØÊ-!¯Å-Éy­Šh¤µÈ%¤µÈ%9­•\¢¬·„nI.á!—PÂC.¡„‡\’KxÈ%”ð”äPÁC.É<ä*xÈ%TðKrOrITðÚ6jOrIW“\B OnIÔðä–t5<É%QÓ\5<É%] Or i­Ü’ˆöä–tўܒˆöä–D´'·$·†\C.É ¹"—ÀÀK2C.qK `¸%ƒá–ÂpK a¸%×(üwl—XñȔ¢l—x‘iÃ.±¶7Ø%“çÏ.Í.±B•…Ø%Ö>æ»ÄšãÁ+\.±ò׺®!—X=ESͽV]Ú%wÛ±K¬˜v!—X½m’brÉdÓj·°>¨¶l«nBbõkuμË%¥½.mŽ¼Ë%VűA ¹Ä 8çr‰pö%¾ˆË%Ó\ ä’Ò.ÉývÉ4_Ýö¡®Ãñ×Zu5CvÉԋ%SÁßzà•XYÔî܄Wâ¥TîÆ!¯Ä«¯Õ q¯ÄK«&YÈ+ñŠ­nå„WbåU‹dñJ¦¹&~x%^KÅ]Wb_¶tgˆ%öÓK¼^µ…ð1©>åÌE,±¸žá•Ø>^ÛKÜ+±~ð;Ê+)mfx%Öޛ»qÔ*®W½ÐJ¬·u¯×Jl4líF!^þ›™ïmõ6!.•Ø˜[·%ÞÅ}iyá<Â*±Që7uÑd¯Îí5f•ØÈ?ç-¬;žö*Ö¸UbÇä҄·J¬ 9{h%“Íe©:ÒRö®Òp­Ä^ra•LšØ‰URÚø–‹oÆ_ŠU2mõhÃ*™ÒÉ°J¬,jqV‰ÕŸý'þe•”¶‹zMí®µNaF+±çØhB+±ÇC,«³¥ BTa•ØSFݝÄ&\9Ȗ?ÇýH:„Ê* „Ê* „Ê*é*«$*«$*«$3TRI0TRI0TRIÇPY%€´J%ÁQI%G%•G%•G%•t•T•T •TҁTRI€TRI€TVIRY%RY%€«dꅁŸ’â“d’â“@R÷IÀ(>IÆ(> Å'£ø$£ø$`TB E(ÉE(¢JQ|’ Q| ŠODñID‘A€¨t*$#„¦-Ô[„¸L’ŠLB±I@(6IF(6 Å&¡²I2A±I (: E'ÉE'B±I¡²I:„V›$*›$*›¤#hµI ²I ²I:€Ê& €Žq-±´ê$™Ÿ²I‚Ÿ²I‚Ÿ²I®ù‰M’é†MÝ°I 6I¦6 t«6 lÃ&Il“LڐI@2IF6‰Ð†LÛ$“d´!“€6dІL’цLڐI@›d’L6dÈ&™°É&É\“MÖ°IÀ6Éԋ$ XÃ#ÉXÃ#kx$ $“ ²á‘@6<’L6<ȆHÚ$’d²!’@6D¡MI& dÃ#lx$‰l(  ´¡‘d¶¡‘À¶´z—H2ېH` lÃ"Él“EÚ°H@If lC#mh$™mh$b lÃ"ÉlÃ"nX$À ‹$à ‹ºa‘@7,’L7,è&¸¡‘$ºa‘@7,è†ErM7,’L7,è†EÝ°H2Ý°H  |Ã"I|C"pH$‰$‹D€C"pH$™pH$‰Â!‘dÂ!‘@¸¸é°‡D’‡DâH`I† ”Ã"rX$S'rø#@$CÈá9ù#™qø#0ÆádÆáÀ8‡@’!‡@äH9ü‘L9ù#@Èá$È¡~9ô ‡>’!‡>äÒ6tkCóœ€òÃrØ#rØ#P{ÊadÊa@9ô(‡>’)‡>"Êa@9ì‘L9ì('{ÈadÈa9ì ‡=’!‡=äÐG úH¢ö”ÁrØ#הÃɔÁrØ#P{$S{Êa@9ì‘D9ä(‡<åG2å°GD9ä(‡<’)‡<åG òH¦ò”CrÈ#™rÈ#PyÊadÊa¤Ÿ¸¶9O@{„Û‰KåðF‚ròF:Ê v!}¬‚žCNÞHG9y#A¹!H\)W½‘ròFrGrG:ÈI ÈIròF:ÈÉ ÊÉ ÊÉɔ“ò”“6”“6ÒQNÚHP®mC?hÒHG9I#A9Y#A¹±%(A9Y#A9Y#A9·F:ÆÉ ÆIqh#™qh#bÖŒÃɌÁqX#@k$CkÈa9¬‘ 9¬ ‡6䤍$ÆaÀ8¬‡5òŒq²F:ÆÉ ÆUk$'k¤Cœ¬‘@œ¬‘@œ¬‘Œ8I#8I#8I#âd€8I#8I#â$âª4„“4ÒNÒHNÒHNÒHG8I#A8I#A¸1æqç›<øìä4çÚ­‘@\µF œ„75z UUðù£™pø"_Äá‹dÄዀ8|‡/’‡/ãF`ÂHfÂŒCãðE2ãðE`¾ŒÃIŒCõ€qè"0]$3]Æ¥mh"˶wˆ“,á°E ¶H&¶„ÁpØ"™qØ"0NºH NºH‡8é" Ö¶©p[¤Cœl‘@œl‘@œl‘q²Eq²Eq²E:ÄÉ ÄI ÄIɌ“-Œ“-Œ#'î7ÉɌ›d‹À¸I¶›æˆr“l 7Ér“l‘¹I²›$‹¹I²H†Ü$[D›$‹¹I²H†ÜTe7Ir“d‘ ¹ ÅE›$‹¹I²H†Ü$YÈ. 7Éɐ›d‹Äse‹¹I¶Èԋ"¢Ü$OÊMòD2妅  Çç¹IžH†Ü$OÈMkØIžH†Ü$OÈME€¢H†¢CäðD2ää‰À8<'O$!ÅÄ¡‰€84‘Œ84—¶Qoâ’Hf’ÃrX"rX"@KÈa‰dÈa‰¹Iš”›¤‰dÊMÒDD¹©Z"@n’%’!7ÉrSµD`Ü$K$3n’%ã&Y"0n’%’7UKÄMÒD@Ü4ǝr’)æ¨@Ü4ÇupGÜ$KäqX"qX" KÄUK$KÀa‰8Y"‰oH"ð Iäÿ¥îízvI–´¼_Ðÿ¡O,ÒjUÖWfúlfÁ­el bì-ËB¨ü!õÆføû®ˆ¸¯È¨g­Æ{c `¯èzò­Êʺ332®ô H¤ê›(ɐò$Rå H}A߀Dª¾‰ o@"èHÕ7 ô H}ƒ©ú%‚¾A‰ oP"û‘¾‰AÞàCª¼Á‡ oð!è|HÕ7øô >}ƒ©ú&>yAÞDª¼ˆ o"’7ø*oð!è|úR´AàÀCªÀ‡ p¥(âpH8à:ƒ©‚ÀA‡ pÐ!Uà C8ð<¤ +xˆ:…ƒ© +‚ÂA‡ qÐ!Uâ C8è$:¤Jt‚Ɓ‡ƒAã CÐ8èOƒ©‚ÆA‡ qÐ!Uå CP9èT:¤Èp2‚̇T™"™Aæ€CªÌ‡ sÀ!ÈpH•9àd8™©2‚̇ sÐ!Uæ C9èd:dƒ!’9q!È\H•9¸d.$eN\ÈKæą¤Ìm©Å!sâB^2'.$uN`Hêܖ‡K熤ΠAçą¼tN\HꜸÔ9q!Uç„t¤Î IòÒ9a!©s« ùˆ +I™ *$U®­ýIªœ¨T9Q!©r¢B^*'*• AåÀBªÊEBϑT"RE*‘ƒ +Aä BªÈA… rP!ˆTH9¨D,‘ )"'*ƒ +Aã B>5.©*rI… rI… sI…TK*¡K*¥K*¤H]B!h]B!ˆ]B!Uí’ +‘Þ%‚à%R(ÅK(ÉK(¤j^B!ˆ^B!¨PHU½„B½„Bн¤BªðA…äúNTH®ïD…°¾Âú®¨š/ðă¼xâAr:Ñ é£ ’>:Ñ /hÜ¾ +É՝p×êN8«;Ñ ¹º R…áKåK¤J_Ò h4ڗ4H¿¤AP?pÔ/q"Iƒ €Iƒ €Iƒ|JàÅ4ȳ¶··Ra3µÖ±×µ*4_ŸeD¸³ ¶¡› ñ½[k  ö_ï+á,ˆÙlF†yþí³ ,ˆýûYíÂ؎òŒ›ˆ½@:äù÷f[cþ„3J=*ƃØÆõŒxr‡Až?/#¹_âؓqŸÃv%➎7â%bwú¬{±§™€ +Bl_fÕ¯Bìß涱ÛPóß±^²wb½hgZ!¾_\¿q"ÄlCԈhÛ˱MDˆ½»ý\ÕIFlMýƒ ±«Šˆ#!6FžWËoÜ×g6‡Öi£Ûº¸'Ò,6ðlùw¼\í3>ÛX¥Fløîù›Ø2—Ÿb_Àù\ +bŸ™-l`Bì3œ[4ñOÒvç +ÒfÔ@b›ùà"&Ä7ü1n +±&ToÇ¡sˆØ†$Ççéí\Q5ęûç›3!æW9W­!gBÌöL=Ʉ˜Ï`‡iþoçõ^4óßÀ„Ø¿méb=pÝ÷ +1›­Bìßwöñ(*׳ýÿ&¤ ©R!!©ˆ—ŠAH„¤ y)©ˆTR!©¤"B^J*"$å4TS!!/5’j*$$ÕTHÈKM…„¤š ANE„¼äTDHÊ©ˆ”S!/9’r*"9…©r @@ -2136,1357 +2135,1419 @@ a}' td):1‚ÎAŒ s#Ué FP:#)t"F^B'b$…ÅE脌¼„NÈB'b$…NÄÈKèDŒ¤Ð‰I¡1ò:#)t"FRèDŒ¼”NÈH*‘Tº–Ûäªt#EéFP:€I¼H•:xI¸R.R¥^©ƒAêàEªÔÁ‹ u#HÀH•:#(ÀR0R¥`©‘ÔÁ‹T©ƒAêJŒtۈ˛ïí+¼R/‚ÔÁ‹T­Aë FÐ:¨‘ªu¢F:¨¤j¤HÐR4‚ԍT©Aê€F: ‘*u@#HÐR5R¥NÔJ5‚Ò‰©BòÐ t`#UèÀFºlCB8R•p©AêGŠÔÁ up#HÜH•:¸¤n­ƒ©Z7‚Ö AêGªÔŽHêč tp#UéàFP:¸”n¤*¸„n¡ƒ©B8‚ÐŽ t€#B7R„l¡‘Ð5RejD24‚Ì ©*5‚ÊA rP#UåD r`#ˆØH9°TŽÏ•©*6‚ʁHå FªÊA rP#¨ÔHU¹&j•k¢FP¹&j¤ª\:‚ʵ‹o]ìH¹Ösõå*×Ď rMìHQ¹&t•kBGP¹&t¤ª\ t‘kBG¹&t¤Š\:‚È5¡#ˆ\c RD®ái‘Ê5¶1R¹&v¤Ê\øÌ5Á#È\Re® AæÚXçi{þæ»ÒD smäI¯Ë\=Re®‰Aæšèd®‰©2×D s Åy^íøHÕ¹&|D:×D tMôHº&z¡k¢Gº&z¤ ]=‚Ò5Ñ#(]=R•® Aéšð”®]¹G®J=R”x¥‘ÒÁŽT­ƒ‘ցŽ u #Uì`G;ØÄv¤ŠØÄx±©b<‚؏ vÀ#Uì€G;à‰ìH;ØÄv±ƒ©b;‚ØÁŽ v°#UìH;$ˆI;Ä‚$ÅNI;$)vےe;$/±@’j'€$Õn[G©vHR퐤ډ y©’T;$©v"H^j'ü#ÕNIª’—Ú !Iµ£ Ô. ’—Ø "I± ˆ$µ®å¦å*¿°ÈãÔº–g¾¡ubH^Z'†­ƒ!Aë`HªÖUeêôO8 ¤ˆ¤J‰¤†©ƒ!©RC‚ÔÁ u0$Uê`H:¤†¤J ”ˆ¥"ùPºdHŠÔ%B‚Ö%B"±K‚¤ª]$’»HлHªà%A‚â%A‚ä%AR5/ T/d/’ª{ $è^"$_"$Uù!Aú!‘öATíK‚ñK‚õK‚¤ÊI®õDäZOÉk­'Œ$×zKÛb±'ŽäµØG’[ÚàHrG+Ž¤îhU׈ ­0’ÜÐ #ymh#Éý¬0’tÝ #y¹î„‘¤ëNIºîđ¼\wâHÒu§Ý ž;q$/ϝ ôÜ $Iϝ@’—çN IzîhϝP’—ëN(Iú¤ïN(Iõ݉$IߝH’ô݉$yùîD’ä†V$I®ôD’¼Vz"Ir¥'”$WzBIªü’Hþ’$Aÿ’$©˜$ -I‚&IR%0I4’ L’¤Š`¢$È`¢$è`¢$Bøß2I²?ôBI¶8»M”ÄÔ÷(,ÉfyF’K²…5a[àôž0Éqý$`’Í<)#a‹[¿‚ÁpµŸB’Ì_bҀ$™æ¨9Ï$Iž;Û2\V$És'Ïd‘$ϝø˃$yþ}|’$Ӄ›vH; >îUVÄ6NæáÔO%±!¾Í$Iì<úÞ®$IÆGõ†3ðÝïIºE–Ï’ô_bbñe°@’ÇfO HbÓ¤Åb’Ø4ùÜ?ñŸÛâݶ€$Ýåj$¶ ¸$‰í+,l ’Ä>*/"’dØ2uœü¦”z>˃;I’á•žZ’$CóÿF$‰õ’…üA’ ¯tµ'Ibáíz“$ÃëpíI’Œ_â#‡$™Vpl_¿ÿvÕ#q’dú¡Ê•$‰Þ,É"’Ä¢vL˜V§oŸ!I,ÜÆ&gþŽ¹YmK`ëH’é”U^äyó£Ô=q’äþCUKF|ee–$‰}™ýâ7á"³åûµ@’çMÞÖ#Iš½­¬/ ‰-²÷s$¶þÝî’´PùŸ§“êîºH’ÄǵH’Rc,IˆóZ$ɦ¬ý$[°ŒúM$Û/¢Ã$Ùl|-d«0™â¤ìsØï’Ø5ª6â¡VÏ¿÷ñ·W|ú/D’T!%AHAIRX’*¤°$)0 B -LR•˜%L’J*˜d)©H’”Ó IRME’¼ÔT$Iª©H’TS‘$/5I’j*’$åT(ÉKN…’ §"IRNE’T9H’r*9$©r -H‚œ’ §€$UOIÐSIS@’*¦$ˆ)$ b -IRÅ’1I‚–B’T-…$AKE’ ¥$UJ!IRH¤’¤J)R*’%IR…’!]-„B’T!…$AH!IRH’"¤I’HH“$‘B’M’$t4Aéh‚$EH$‘&H‚’T!H‚ŽB’ £$UGE’ £$È($I•QHÉ( 2*d{d’ ¢€$¨( ɇŠ&IR4.Qi\¢$Ò¸dIŠÆ%K"L"…K˜¤(0‰˜&Iƒ$Aà IP8‘$Uà I8H’¤ -$ I‚À %©úJ"}I‚¼‰$)ê&q$AÜIª¸’ n€$ˆ I7@Ä }$©úI‚¾A’ o$U̮߮úI‚À‰$©úI‚¾A’ p"Iª¾A’ o$è$IÕ7(ô ’ƒ$© -I‚­6Bá IªÂA’ p$($IQ8H \’$¸$IŠÂ%I -— ‰.A’¢p ’Há$‘Â%HR.AI\’$’¸$IŠÄ%I"K’D—$IѸ$IBãI$q ’KD— ‰4.A’K’¤h\¢$Ò¸DI¤qɒK–D—0‰T.a’¢r “Hæ€I9`’”9Hd’™ƒ$©:I‚ÎA’ s$Uç IÐ9Ht”¤ -(‰„’¥ƒ$)RH‚Ö’ u€$Uë’ u€$H I•:@¤©HR•’¥ƒ$Aé IªÒA’ t$($I•:H¤’©ƒ$©Z'’©ƒ$Aê IªÔA u$H$I•:H¤nµRIR¥’©ƒ$Aê IŠÔ%I"­K’DZ—$IѺ$IBë$‘Ö%HR´.Ai]‚$ÒºIŠÖ%H"­ƒ$‘Ô%IR¤.II]’$’º$IŠÔ%IR— ‰´.A’í”H"­KDZ— ɇÖ%IR´.Qi]¢$ÒºdIŠÖ%K"­K˜DZ—0IѺ„I¤uÀ$h0Ij$ ZI‚ÖA’T­ƒ$Aë IÐ:H’ªu$h$ ZJRµ”DZI‚ÖA’­$Aë’ u€$UêIÐ:@’Ô:$/­H’Z IJ@’—Ö‰$I­ÛPei]$/©I’R'’$¥N$ÉKêD’¤Ô‰$I©Iò’:‘$©u"IRëD’¼´NHjH’Ô:‘$/­I’Z—mHëD’¼´N$IjH’Ôº–[–Ô:H´’­ ’¤*$‰”DJ— IQºI¤t ’Hé$)J— ‰”.II]’$Eê’$‘Ô%I"©K’¤H]’$!u ’HêI¶NÖµ?ö6A)]‚$ŸJIR•”¥kìÖCè`IªÐÁ’ tÀ$0I:`„N0I -`’%t"IRèD’¤Ð‰$y H’º IRçD’¼tN$IêœH’Ô9¡$/J‚Ή$IIRuN Iêœ@’ºI^:'$unGÃBçIªÎ’ s€$ I:H„’¡ƒ$©JI‚ÒA’ t$Ué IP:H”’¤*$ JI‚ÒA’T¥ƒAé IP:H’ªt$(Ýj#”N$I:‘$è$ :IRt.Ié\’$Ò¹$IŠÒ%IJH‚Ð’T¡$AèI:@’*t€$$ BIR…’¡ƒ$Aè IªÐA’HèI:@’ªt€$( J×r—üRº$IŠÒ%J"¥K”DR—,I‘ºdI$u “Hê&)R—0‰¤˜©&I©ƒ$Aê I:H’*u"IP:H¤’¤J$ RI‚ԁ’T©%‘Ô­4Ô!u$EêI:@¤¤j ZH‚Ö’T­H‚Ô’ u€$Uê I:H¤’¤J$ RI‚ÔA’T©ƒ$Aê I:H’*u"IP:H”N$I:(„’¡ƒ$©BI‚Э6Bè IªÒA’ u$H$I‘º$I$uI’Hê’$)R—$IH]‚$ÒºIŠÖ%H"­$‘Ô%HR¤.AI$‰”.I’¢tI’Hé’$‘Ò%IR”’$„.A ]‚$ۋ&‹P+ ]‚$ºI>„.I’"t‰’Hè%‘Љ%)2—,‰d.aÉ0IQ¹„I¤rÀ$¨0IªœHD’‘ƒ$©"I‚Êv‡ÊA’T•ƒ$Aå IP9P’ªr $R9HT’¤¨ *H‚Ê’T•$Aå’ r€$UäIP9@T¤ª$ *I‚ÊA’T•I‚ÈA’ r$Uä I9HD’¤Š$ *I‚ÊA’T™ƒAæ I9H’*s$ÈÜj#d’¤Ê$ 2I‚ÌA’™K’D2—$‰d.I’"sI’„Ì%H"™K¤È\‚$’¹I¤s ’KdKî&H ]’$Eè’$‘Ð%I"¡K’¤]’$¡t ’Hé$)J— ‰”.A)]‚$J—$IQºDI¤t‰’Hé’%)Z—,‰´.ai]Â$Eì&‘Ø“ vÀ$)v"I;HÄ’¤Š$ bI‚ØA’T±ƒ$Aì I;P’*v $;HÄ’¤ˆ bH‚Ø’T±$Aì’ v€$UìI;@’;$/±I’b·¡Ë;‘$/±I’j'’$ÕnãÈ¢¨H’T;‘$©v"I^j'’$ÕN$IªH’—Ú‰IµI’j'’ä¥v"IRí² ©]$/±I’b$Ij]ËKj$ ZI‚ÖA’T­ƒ$ ­KDZ— IÑ:@I]‚$’ºIŠÔ%H"©K’DR—$I‘º$I$uI’Hê’$)R—$IH]‚$’ºIŠÔ’Hé$‘Ò%Hò¡t‹$)R·PiÝBI$v‹%)j·XÉ݂I¤w &)‚·`)^Â$H^Â$©yI’ zI’ {I’T݃$A÷’$Aø’$©Ê—$ җ$ ÚJRµ/Q‰_’$¨_’$EþIr­'$×zI^k=$¹ÖKmÓbO Ék±'$·´’äŽVrôÚÑI’Z‘$¹¡IòÚÐI’ûY‘$éºIòr݉$IםH’t݉$y¹îD’¤ë.¶7é¹Iòò܉IϝH’ô܉$yyîD’¤ç.ېçN$ÉËu'’$}w"IÒw'’¤úî IðÝA’ໃ$©¾;HmhIXé’Ô• +=@Vz€$Eþ$‘ü-’Dú·H’"€‹$‘&I"\$I‘ÀE’„&H" \ IÁ’HH"\ Éß!^ù¿IbWÍ?…+Ù=@nq%»ÕcÚ® ø~>V?Ƃ+Ù-Âyd\ùq[å‹. F‰ÁI1º…•ìú>õ‹(_lþËóN¬d·i\ˆWËþ%ÞØWÿýóQf‘$6x-jÁsD’gid!ü ÷×z©™sÕ(ùåöòPY£Ä8¿yæ Éç- ÆC˜µmQy!ÒJ„ôéQ£Äb|®+É;Ë9zhq´Äî³ÚxÃ%60ŸoúLºd³/É -H—ØüöÌ~YuÄù’ ²d37ªèZbӌ }]í‚o-yà0lÉæ\U©RøÁö¦Kž¿õ,ÂñXûÒν­J%Ï=Œž?êQõÇjfÅ5Ηø1Ù¤„&χ^þ3&Ö[Ãw*»’ðÿ²m6{g±wŸžü(Š•<º¿í}+yæ -‚8±`ÕËf2ÏnÙl±Ëb%¿\ªCµJÌ_1óÞÂ+è(hÐ"Qêk„ÓƒZ%¿˜ì¯[;Íq®=“Ýââ¶Uªd7ü±îìöïëŒ"’"LlîôŠ›¯–ðKäÕ³(“ûNÄĪxÙ)‡“Ã_X(ÜþL ö˜œ‰˜†ø´w­’#ʧA˜Øù€Š9ab¾üãʏΠ“ÃBђ(±ßl{a²;â˜CÔ^´¿vÏ¢8±21±xo_.W¡þ,%DLìû|@LLÙn1Áÿ…“ð|ªóÙeõríŸÿùŸýúë_ÿöÿî?þkû“?dQ^â+%ÅW,JŠ¯X”—øŠEA|…¢¤ø -Ey©¯P”T_¡(©¾BQ^ê+%%ØΌm÷„SؤJ0…M` -› Á6©La$˜Â&h0•MŠSØ Ž²4X<Ê[ƒE¤, ’’ “òÒ` ”-q”ax”*Âð()¤¤C¤¼$%&%(¥(0LJ*° ”`¨”—ƒ¥XWyµC*œH³ÂIÑ߬p"ýÍ -'Ò߬pRô7ë“H©pòK“¢¾YàDê»õÍ'E}ÁR¤¾P)¨/TJU_°Ô,õ–RÅ,ñ…KA|áRªúÂ¥ ¾p)©¾âR^ê\ -â+,%ÅWXÊK|KIí–’Ú+,好ÂRR{Å¥¤ö—ò’^q))½âRRzÅ¥ ½¬–áRªÞÁ¥ wp)è\JÕ;¸é]`)¨XJU;a)ˆX -b–RÅ2± 2åL±£ÆIѺ¬q"­Ë'Òº¬qR´.kœHë²Æ‰´Ž"'Kê²Æ‰¤NdJ*Ð”—Ð NIƒNIOyé|ʖdJêhJÕ9ДÔ9ؔ”:à”—ÔA§¤Ô§¤ÔÁ§©OI©ƒOI­ ò’:•”º,v"­£ØI‘º,v"©Ëb'’º,vR¤. •Hê²ØIh]Ö:)b—µN$v«‰»¬uRÄBEb ‚بT±¡‚ÖA¨ u*Uì T;ÄD¥Šˆ -b¢‚؁¨T±Q‘ÚA¨ v*Uí T;äB¥Ê„ -r'DµQ©r¢‚܁¨ w *Ÿr¢RåD¹QAî@TªÜ¨Hî T<•*x*(„ -Š¡RHÅs(¥¯v–;)’—åN$yYîD’—åNŠäe¹I^–;‘äe½“¥yYîDš¤’¢¥òR=8•”=@•”=H•—ì UÙRIՃR©ª¥’ª¦’ª'Nå%z€*)z*)z *Eô URô@URô`U^ª¬’ª—uO¤zY÷¤ÈuO¤zY÷Dª—uOŠêeÍ©^Ö= Õ˲'Eõ²ì‰To5ª—eOŠê«Hõ`UP=X•ªzÀ*È° -²¬ReXكVAö UªìA« {Ð*È´J•=hɞ`TX¥ª° -ª¬‚ê«TÕVAõ U=h•*{Ð*È´ -²­ò){Ð*Uö U=hdZ¥Ê´ŠdXÙV©²¬‚ì« {À*UöàU=çSü%d/+ŸÙËÊ'’½¬|"ÙËÊ'Eö²ò‰d/+ŸHö²ôɒ½¬|"كWIÙXyÉÈJʞ˜•T= •—êA­lÉ«,Ù°ò’½5²ÄÊR=!+oÙ³²doK‰–ìµRUOÐÊR=Q+Kõ„­¼UOÜÊR=J  z”@©ªG d(È%PªìQ¾Ù£Šd -(Uö¨€‚ìe’=* TÙ·‚ì [IÙkliŠì‰[IÙ·’²çÜÊKôÄ­¤è \AôWªè® z€+ˆàJ=À‰Ü -ª·RUnՃ[AõàVªêÁ­ z€+¨žÀ•*z€+ˆà -¢¸òè \y‰žÀ•½WRó®¼4Oà -š'n%5OÜÊKóÄ­¤æ‰[IÍ·òÒ<¡+©yvçû iEPªæQÍS$"(Uò(‚‚äQÉ£ -J‘<Š  yBW–ä‰]yKžè•%yÂW–æ¿ò–<,[¢+)y°+Uò`WRò€WRó W^š¾’š¿’šÀRD~%E€%E‚å%z ,)zY E¢—ÕPŠèe5‰^VC‘èe5”"zYÉD¢—ÕPBô²J½,†"Ñ[M„èQ ¥hžI ’ÁR%„ÉaAò@Xªè° zbXRóÄ°¼4O KjžÔ75O ËKóÄ° yBXR󄰼4OKjž–Ô1.Kø(—‚ðQ.¥ -åR>Ê¥ |”K©ÂG©„r)>ª¥Tá£Z -—MHøT-¥êžt/—”½ÆŽ¦Èž—”=1.){b\^²'ÆÙrAö€\ªì rAõ€\P= —ªz@.R=TÆ¥ªŒ ªã‚êÁ¸TՃqAõ€\P= —ªz‚\= DÈåSôr©ª— ²G„9²—ŒKÕ=g\¦¯À]øq‰]ù…s(—*}Ž¸œî¿ íKÄñKÄ¥ª_R.èŸQ.:j\õRŠf½)ગ" \õRŠå°¹DpÕK‘ -fÁ”¥‚«^Šd0)—ÔÁÄ\^Bè²€"]ÖP¨Ë{(Öeû¹¥È±æòZ -sY[Þ¸õµãzòÞñé²6¼B]ֆW¬KÝðê²ö»b]–—O°ËÛË'Ú%C¦ÝYx¬Ý,œR½|NÁË'š'…Sª“O5óËVÝùø(›R}|”MÁÇg°ËU||ìoª“Ï‹»¤ -º¤—O¬ËËË'Ø%½|‚]ÒË'Øåååì’û]Ñ.¹úíòZý‰vÉ՟h—\ý‰v©:í"LØ!LØ¥*aÂ.H¡Ã.q”Z˜´KÃgh¥. -!LÒ¥*a’.ha’.ˆa’.—°é¿'Òå?7lúïŠÄü“Ÿþ»?ûŽõOüïýÇ¿ú÷Œÿù_ýïÿçeùïþÿâ_ÿÍ_ý‡ŸõïøÓÇ¿£Î“%Zgáícx¼¦E±ümó‚j¶ŸÿÇçÿü¿ãúùüùúùý߶ŸÿÛÿå_ÄáÕæoŦvþöS„Ò—¿õ²ñÛo?hÏlü) gþ¿< x{–T¡•O{Ü°©}”ÇÇ´µ“CBÿÜá¿õ;ü‹Ÿ¾£”þ,>½ëçÿd­Y­AÓôý[ØîùÏÇmñ§Ïê"ÊÉûyS6òoà wè6ÖmÛÔÛ‚‰ŸÓÈàQ՗Öê‡Ïˆñ—/'D¦êß[7%sZVcß¾*ÖÛ?=ñ¶ˆ]+ÒÕ<`Ì–ëˆHÛÎ5Ž˜­ÿÙOq„ÚûýzF;t?ûÌg<[ìéyÈóQ†ËÆcyHΕõç3OõHùïyž/XÒLî#ÒãÏî|ÆózôÇÂË3>ÍNóàó”»‘¹ß”ÄCþª‡l‡Ui:_ÙlN¹{>ä³ÿܯȅïéÃÆb’ËCšSëÚi[Öó8ò!mWo‡zõ!÷Í^yÆ6Ÿ—ou ôæd±¤àåŸ?ü̃W>cÛcuÏC…u½öù”ÃÚ¼<ɧ§ØCvÛÓYäwÍw·Ÿ<ÿ¼žuÕåqßv&ýôô1Z`çáqJ·.\{ö?ÿžëtmÑ¢E‘ö›ÇÃrxöð韾׾­Ý~ö0Û-ÉBõ¯L}ìñH§¨…ËvaÏ^úy×½ªË®}Ø?lí÷¶æuá »ZPjÏßñ×úÜë4àéù÷³XͤõùåúTžûÍ#%üÏyŒóE—ù‚9½ËÌ?aeãD}öü݈;úÌç÷ÍÖ#gö™ -˜¿‹>Û-û¸^}¶Û¢Â"JÔg»}ÑÏ-Ðg»­Sž7Vûl·“aëGõ™9½-ü•>³ÓÛÞUé3ó“›o>³sKòª.3÷ü1ç«Ëö—Òg»¹øƕ}¶›—rµÓž¿¼[@ ãl×æXfQ€û=^f#ÖÈ1¶ú†GèëeßN¤–´@Á[§évi1éÓ·?ï3–¯¿Æ}–œÓîsŒæ8÷¨Q?GdÜ÷3;љWfå÷ú§;|›sM¡<Ýæ¸ýëšúúŸkžÒ³©Ù­Üþø~ó¾\2!iwT‚?¯,UrܶE´?}:ÐÑvÛ{íñ|AO™èœ‚"6Uó™qJryü5{-wNû"îÇjtÚÓí24:Í£쭔N³hûFé´Ãù㖝fñÇ9_vHé´Ã¤8¼ôN³cvü-fq gœÔù­:Òi‡}guš "‹ò¦ÓŽA‡tÚqk ”Nóà V§=:÷¨"ìæUøúI§¹Î>w¿µ™fží'Îþz}îwšÙb^;‹Öv™ÛÓö˜åúy§› ÍÛ¼w$!Ú)/d§~JŽhÜ·@F"ªnh–E*{FÓçãæ'·E<ß®íôµ‡{xZµ}Š->ìT•N.>lâ}îdØ"DŽsóz†TÛíú¿ïqm÷Z}ÌËÿ¶#ttU]â«?äá\…º†¯ôv j±y&—/¶ó¿|ýqGÊ|ﶯ1<•‘Ýæuì¶³E›µÛ,Bp\çÞm‡%@ðr{Ño¶žízõ›­g,@~óõŒJQ¿Ùzæ~w›/gL~Ôm¾žñd±Ñm¶ž9<ÝÎê6[Ï ¯ÉÝv¢­ê6_ÐøYÃê6_Є{%ºÍW4χ¡n³ÏñPnë6ÛSÝfE>}$ŸJUUº­Y˜C¤” îCº²Û|…ä…¿W·Ù -ÉVåt›¯ljV·}.¬s…ôÈýæK$OõýæK¤Ù^ý¶k¹I¿ùÉ"Õo¶F¯^ûg¿¿ÇºìßÿêŸþ»?þ/Ïfî?>û¹/_Âì[¯ú~ú§ÿ·ý—ÿåÏÿý_ÿ‡ÿƒvþÁ?ÿãÿõoõo~ÞÿáOÛÏöüï¿üO?ýõóÿ^{­ï´|Ÿõå™îZÄ!YʋG.SŠ/Ϛ}Pâeþöa>ì kwsmäwÌÙÈýöþçŸÊ®ê֞ëŽÝ•Mi­ÅiâÑw÷}=ƒáò|ó}Ú³ûîfl¹À­Œñº3GÆógÁÿËfaÄ?x"käÛOÿÖÿÃÑG~½û~ÃlÔ¯›wóF˸[D¯/™x “¹C¿êÏ͑=õ,uðÂ=»#Œæъ&ì9~xW¿æíÞ¾Dôÿ`À ·³±›-ÿH§ÑôqoÇó=™ÑBµ¼›î«pg4`Ԇþ˜¯ ýÎÌmõÃ;ø·Öm¦j{ùs¿aÞvzȒńÑ˾Èø,ëdÔ;2㦾4óÜtk^)W­ª'uíï€[³°ƒ[M˜“N·fr@/[Dú[zþagSa¾ã=Û`²xy]z{ÿO=Äe Y­ pçjàÑiµjþÏ_ÕÀ9xÇ¡ÆãYÀÉ(‹£@a±áÏïtŠMÙz¶hñ=j1»ÅóÑÄï=4D½b‹-³l«ºÙVna>ïÎmÙ>[ƍqôì…/Œùœî Ø$cu |4OF÷0y،±n;Ž™ßþ­0³­ÐÂlžÑ0úÌƉmDš[6~ß­§Õìf‡Èfôð—ÁwwóZ2.Füy«Àq­míÂU!ÂØîl`tþÔ\ HŽâ¶Éû÷ÈÕ0zœŠädªuM±ó¼LßdöR÷ÑîÐ3Ó¾p.Úµ,Fܦ‘m­ö~òǭγa|&‰lÀ)^=ïìYˆl©Á#„ç2g@ -«9˜y·ž†-°½Û“®ijÔå $[~×tÔ8¬=>ßÄñiæû6Î랫M†æfkŽ¸ô‘ß}çíœjÑÂøý³ô¾™ô.ÃÕÌ8ñ£mý©¥»^¬ä"±û±#±÷Ö¹öÈÙ°a^s³ 9ßËx÷ˆÞ0Z¬.<¯”L߉닝Xýٖµ+?ŽÝkl¶ê“íÞ×㈸¿5Š]ñF÷Tiïæ4UŒ‹3lšº“V=˜™/¬GȋÙRüÂ…ŒÜhÇJñûËSh6¦—¯/nv£aù}ØnÎ÷e³µwÌ´]_¾nÏûK·£ Úì³X‰ˆÛ¥ÚÖ쾍øú$›.ÆÏ:< «ÂïͶ÷s¡yë¼3ÛÙΚ¢|%hQd Ýy6‡·71˼u\®PÏ ,ŸüiùH¼Ý=&\õâˆKí%r Ã×G»m¨s¹rÛÂn¡ä×öZJíÆ ¬ÁeÆaÛjõêð¯Àl~<ü1\® £Âlköo2÷‹whY ½‰È`¹kÂfé!ÕY¨–™ýWz±Ï‡ôMæ»ó}ŒÕìÑg®àÎSÆûÈáf‹VڍÙ·K«cµ:fË¢8¡w®e¹³]Î#¹Ž¡;nÜùlÝê <æ‹I按ÖvIžòAcû¢Ñ{k =ßzþ‰ÊÕ¸o³rúžà½÷zZí|fîh”OåaôÀsõ¡«¡›E‘ÅcÙ¹2 lƒÜ£d¾éÆfê™_­kÊ~®¯ /þÖ³BZæi íçÛåoÜKû}– ãçWÙÎÚgç ñÝ=i åµE\g!ï!x¿ê÷î-Õӎè¾2IÍ/ÁJ¼—£×äOKÆgZR_ûè–ñ¼1Ú(ŒŒ=jêÖP ½6¤ä¼·1õþ÷9ŽüµŸÎIbcF|4öYYéþÞC3šÇÝDžC H·¶w}n·.í<*b×íºÎ÷­ñsÛÛ7fßi?ÿ‹‡=şßcDœ¶~la²iXۙÔqçX‹ïÊÀú¹«KžE]í8a㶎¡ËôN¿l1˝ÏÌ1°wŒÛÞxç¼ÖèóÌõy¦B_l½Ÿÿš{.{nzf³Éí{ëÑèGªñ÷7õÀ‹Áø¹Ö)ñ¹çüzº¥¥$ÿ”E<̓Ÿûd>U«2‡nLæÓsÞêJû6ÃįßiÏ̌ÛÁ-ÝÌOÇmiQ|}½‡6pKÛ®;Ø-7îàAY%0·ñ¨>ï~Ó*ÅsÀ¬/ ŒN]h™§áf÷d’ÎÑâ$_† F–z–vXÆÜ´»-~o4j•ü°yX}AaÜgØÅ*͖Ÿ Ì-¶Ò?6[l?ÕÝۑ D‰]سùcôœl!7vÚ7Sí,*/P–½ò[K‡}äö¹:×?f“†ž2Ξ:¤{eÌx8\ü¹«ªN8/ž}гc3;cƒd+`Ë4ÍkÜY/÷HP¬Îáû²õrºÁ¼‰4l9V -ÍR%±~ñ†e<™e§ÅSÆ_»sżæ cSÒU¢¥å³Œ¿Ò«5ñ”¸Y_ãZ2ے??ñãbwp巐o·1ÖôÝÄ&`ùIM·ï)cÃ?éñáüœÙüŒT…2¶¾—”q »›m¢±ûë©ãf™Np´x\—Íñ¿ÑQ9¾·»¸Oü3žk×æád_|ϵ|O‘›=ô!VD»Þö¶SemŽ_ÒGÛglòç]œžã’Íä?ÁS¥…ÍóT…q ïñ<‹òž8°Ìœ›Ao 6“{¤]Ôj5\ݳÀ­/)œc–¢ï̽Ýa‡\éؼµy¬G:WoËÈjFËåsÕea‹~™;ÍZê>¥{ààæÖ¹ÙÏpë1–¥rã+²ýÄïӉõ˜vh¾gˆVÏ8hsø|›G]Ç}†qýÜ|p_õógñ}ó°á3ãu𺯉ÌxøÐn[>F -’Ðð -ÌØc}×ê´œ¾Õhü¾EhwôÀ–/a+k(ßçš[E³sáŠí£lHsff–ËZÜ“ÙýkØ¥ùÀVêvÌ6¹QܹsÔMáõòàïTþ-Í×\Ú-7?Ÿ³a¿n,f¾è æ•ñȏ«ùní«-ÉÖn¤Í–^¿aΩÏ÷ 2N”ÙóŽýí[ý(ÍÒ葛XfvXôÏ" zý¿üˆñŸüñß¼ÿßÎÝj ¯óÇ¿óéã0èkØó°¼Oï<[Ó*¾Ìß^fÿz{w‰Šßo)?]Ǎ›‡ø–cÇ駋à9íi‰å‡žÞ²5‹4ŽÖÌ+þ4kÉ†Ì ó›-ìÃÃI6…Û·™º­‡/ðoüRóB[}3ûõØönG¬<éóK--B2_–(ŸÉä§çU~d>vOÙc€§Eó0[©j[ˆ»Þ¯µ5ƒá#í¶{v4NñHóðՉíp"ŽA†dý7³•v˜-þN¸¯ŸÍßq»q‹åĺÈ>ƒV;‘2Þß#l­³í”÷ù؂°p-?å}Æø³4‹NßÎÈÝêãÎ'ïögfö «ß҈¾´µ•åßõ;Š%òc¼U Å:}s¿ïcÔÚÞ_š§™qßp7áýˆí~ŠçŒŠá=ìþ*6cÀ, Á~øà÷ÔmºÑAè= •¹nÝVSÏ÷Xé]õ§ Ïgž¾ýñw zO5›Õw=Öa»°0ú”Á×ÏxŠ{ú쪯ú¹-½ãç}‘ø<©¯Ê‡mwÜæcl³<=>N,UØ30¿È<|À -ôÙQ££•tŸ;©Ýìë®õ%Ê#ƒûµëñϨg¢æÎ9»¶E”–k¢ÝTܼ'pò …¦ÅƒFÕ{{Ða»ë9¹1ü|ÏîzíÀ0ljŸÆz÷ù‰²U]5'Á¹Í®>\'lÑ4㓰€!¯·ÛTxÅê_¯83s@?ÿ°gLUÿúOªVÌċFšT;eêÝ=ΈQö9Ì·.6‚¦êÚ¦Õãfã&äË2-t/fõ˜Ífnˆøü†¯78‹Â÷áê•Áãó¬$ۋ1ò#°Òݗª6aûñdz60·(‘GåÙÔf«”‹/½ÑÀ‘íÞG¦3¥±6;/¿ÃvVËÀ+¾¢HÒ e˜å®Ööd§¯NÚ¾EoÕ3ÛþåOa惱zw±>´ï̒#øçþ—?haí99¼ïæKÁ­±ôyÜÿBtÍnræFïúvÞ¾ÂÚGÜùcÜ´g{Zµ÷ïãÛÊÒÌKãÐýC!¸Gø1ü³1šT߇田\1áúrÁµó‰ýÖë{ŒVˆg;ã l ó—šÝœHõ;h7_èhñÙÎ(±ð ¤Þã3¼Œ7v}1]³Êr6ýäñ‡ãÓã}éç‡Ì–¼#¸ [|mçv7›Kx%å χ¹¦Â“ý °an™ËŒwd/ñν¬Ë~Ihü<ÐÃòv6cÏýåx¾ÛǙÇmX¹D_QY$²5³g?ð}è´N¾N*3wãæa>(wJÿí¿<ù侪w=ÎÍ~º/Âׇުç†ûK½4sók½ïvìd¾®Ïû· ï†Ë_êZφë÷ênîØƅü›OÝ˦j¢ÐæЎʦü û¦þ<†®õ8e_…iºüÁôû“Õ÷Šï&ÁN—¿7µþpþá„ý;“û?\2üpyñÃ¥Èï,Z~4üÞdóÃiéû)ìëïÎv?ž¨{á­z^‡0z0“^kI»¦=†¼•Wô -¬av¿ áåð<¾ÈG×3˜¯Ï_ÿ 9n?Бÿl×­|%7¸ùJ9Ž*«eßsþÔ¯¾·œ†ü£dCžM¨'FÙÙô,.ÏBÛÇ?û8¡í¶<öTé±8–ãÐÂùHÙM‡¶™·èNj±=¡v—Ó=w»vêï[¿#YÐ׏':Bßxоù0Ïn¶gˆyF¡õ¬ñ½^Ý÷#CßZ¤ö~_ëù?Ô}—Å3‡óK#о×!YnvªÕÍq¬NÍpE›Ñ†P¯~íÅø«x„ñûkÇݎïZõSŸ¸û4‘hmàö=„U.¥ãÒµž§I~â-vܗ8ƒÂy_Û#Gg(‘Ue{#ä¯?}ZûDÎÔ—§Ã’Ñ}ËHÛ¶^k©ívy »Ÿ´¸q7¬-öú -iq³ã3n¶àpœ­Sà®,=ª^âb0ܬ}éûÚHW="ì.m¼:{]¹G ‘7éâÆ­‡ûà §+ƒðÑá=Ì^9ŒÛŒ¹u}Ò9æ\¶_uPàŒ]½òù0BÆÌxÒ¶ó²]ׅ6^© éáT+Œeð±YÆ3– Üæ#­l‰Ó®|¶ÐžýC½µýC‹Ñ^åœFËÂ~ß5pF\wcIëðˆÓsD^g5F{„ˆ¿¯Ýsç¾úàeô¬à4€Yþá0óTqˆ`ªwbܵJâfΖ\|98æ<¿3:KËìi®Þìˆ#—0>ïQŒÑ@‹UÜûZŸ¶Ô³Î”½×/ùk·ÄPz—ΖóÃÓvã&Þ{°;a慏|_cíGXÃ"ɦíŒØ/¶ð­y½Ý«sòÉå¸XÑÚên‰´—ñW¬êÔkŸ7§;ÇÅáL5že"y™}íÆmÆùؑ£Àþ”nKFîÀ‹K~^{Gù–|k2^Ñ[ü©¯jÀÑ7‡×8wºý8™ì9DG¶øû[$—~]¹Eµ·mñqÛþ‹¯½ÍM/nìmè€4¹qŸg¼Bé@yïkÏ÷+=ôÔçòk.#;ŽՌ?Z#]uâh{1~>p¹v‹:oÓÎ1bƒêȎ¹cÐÍXr¸9BEܨà 3î1¡˜q?¯b¤w+~^/w¤2~›<·gþ˜Ð‚‡ñI'§–R€]h5v ´æç˜mܜ÷ǵ]ÆÞ}¬ñeä}=ÉÏk÷¨˜;vÏ6pÞF‹æaòz™›Ðö®Âõ~ž:åpãѼŸÎ#êôð{¸G-ãÌ -SŒvнµØ3¿Ì^V0ŒãôƒÅ «]WF[ óuM£MÝ|±?‚‡ç¸Q.µjlqfÄã.3«p‘<=IO~Ÿ‡ïìôÒèóqOŸgÎ-_ރx*ÊÿÃèˆë瀟å W£VYh¤À´pF`L‰Ûâd«\{„6GHʧÉ~‘¾šoN‡±"¬ãÿ_]ÇìµNÜA¸æ}8oþ”/ÜxôþÍ3­æïÓì>¤ÏF}déÏO†›|U×ðcušù¤!ev¤ÜÎOã§Óùø2k%F/Hç³¼IX¬ôOe˜¸žGÝf[dÁ¡/ýYÆÉtêØdd3³ç–Ôj4n¹ðšAO¿>_?nÜu­Ÿv…±…|bL‰Y¨^kYjÐ -OF]F&}÷i½¯­ÆCáUÅxÿ¢œŸf?×ñŠ·t- ¬Æ­õro´›¿9Œš‡y¶;eãç×á[ª×•gÄÙX“’ [õ¡aâaß¿*<Ì#ý®ä†³’G zø™è_ºn3´–Ã-ÛøöQF„ç[¿õ><èòKDœ§ºÈ¥÷K¸§„wîAŒÄV茗Gš‚/±oo‡ng†>=ÛC$Ëö«¼’Ó½ËõJ?r`êðë¥ÚrŽ0…ÆÍ¢++i*å7ßKÛÔE»î©Ï”d/‰yÏP–͐ÂM‘l—…šÄm9²¤èŽôæHŠëë덧MOrJª·±BV˜pìŸn"Ë)ežoÜD#^‹ÉºN2,3x,BmeàÙ9¼[wmðGYXyðzWàåÖµrÛâ<Æ÷ÆÆwö2·?•'®u›§•Š[õõÁ2Ò¯òX¿¯ÕhÛ{xx?wn^f6éÖêá˾Žsûô¨4 xþ~7³4Ü,w<–"?. 4€9= -ö´q`jÛì¹ã»øð!ÚOûù«#uÄzžþÞÃzÈv룱d&'ÆkòzŸ5J+F>¼_»EQñ˜W®t#b¼"t›–Ùà`Œ±lÁˆ=[½ÙOŽ¬®ä¥ðY‡Þ4ê"ÜÅâ®ösÿ0ž^`ÐeŽƒA7î]âH¨êw=øU‡ÁT>¤¯-»öeæÐbSGjù™_¹¥«Œ»íÎ/ÚóœE¬Npš'/׊ÃóëÆâHczÇö”ríìc,†–ñŒsüSËÌ&æmé´óòYn< %õK›ºöêáK3ãœÌ1:{݁›7 ó¥DþXwîº{¿ø9FÈò­.l›SáCa”×ÊÊøÎXöÚ¬pm{1¦ƒ2¾¨zíéïbB×$]ŒW$ð£e–|¹ÎŠXÀpûM&ióáxхς‹¿åY;b1x¼C/-+Ìyä+8¯“ðêôÒϳ¢b=5âϐË }ÌՃ}Ó²7]Üö͝»\´[Üö2âcÇq¿¯-Ÿ†çhÜ?ŒúŒlá…nmÎýÄð7ëù¥Á)¬h1^öé¾µ¼pûÎcðå?ãL‹òfñ1—¦Ü[ÌCÓ³æ\·ÍüýÕ¿7F^ÏO³²†±÷ØVÛ¤=ñɏÙUžcE;kÔ[Ña­£m´µ¬_þ{Œyáÿ¯×î„9é+¶;‚:ø@1_JR½ú¶?âûxk~#7þª“c-fêµ6¿wFÍÃÏx‘„¯rÞÝñ-X¬ç™þKE&Z ®vKËhþ…HBö6¯9ãÀç<֛™ 8Œ<‚þõÚNd´åWÿ0Êk¾˜7E1÷È«¼ãælÈ;ٍ®ÓyŠ3n¶¬Ä|ŸÿwÀkÌŒœ#œÝßØûZyºÌh[zãÀÀû¾Vß÷©iÍÃFãnÊú=ëIS–‘·pŸÇýq­1¹EºÆýa4J’G(æ3 ×/áIÏ)ÔÏÃxÜû(F\ñžxñ}íÁ Ÿ©²9"ìæˆ^Zæ0.©fYü2ž„ ¼Í^ïò‹P˜[®ƒ½+Œïâ„#ëEÅß×ޑX)Œž  ‚F±jé0ƒÝ㝮*ó9îÚé9uÛ \‚ÕxD)O³ÏaÜ:n9¯•iƁ -Fn oýú¸Ö\l'ÌS»¸QžŒùŽýóÚ»—¸Ì2šëçÚ×KÀl¡C1›ñDY:zMÁpÌÊHÚ ¾¯rdƒØ8Òir>Éøñïk¶éڞÇËæçDü¾˜éÃ3ÒÛ»"úÚøÓ8F},óíu”Ã6"Lª:qí[ÃÙëƆq‚ö¾Öcé¢Q+>ò6*Âõe&a‚CŒ’Œ÷䱎C ¤58¬ Z;>î¶ôë2Îup°¬Õë|¥2‚À8nm+F>„gºm׎Ȟ7ÀØ\Æ^v¨Å|v­êØ8$¹VmºmÚ¤;Æ×ĈÛq#zÕ)bÊ z[ׅ±éT –›†7k9úo¤óùØöXrÙq[~#ÖL¶ÃwÄÊÎϺî6[ƍÌ]I­Ü¼/éáP˜ÊöâÓÄ‘W»;\òÐ1·j‡n1mÛà¬Ngóvàû62k¿Y¯µ‰ 'îõbœáfÒì"v®teÏÊ*Ùvëñ -· %¾£^›ñÇ'¶,˜.݁úªEˆb=—˜V‚BÎè3È6‚=YFÎÂ[|GõÚÉI´ÝÁˆ±ý2–G¨æɶÌq:áxyÄoy‘ÇUŒ¹܏ëãZËçç>´¢aÎó:Š1×Q3¸r-=ÛrBx='ìç[°BG;ñ<}úºðÔ¼Œ{ėÇGÔ®aÓ1™î䗸ŽÔl!ï¦^ë¹¼ôu¥ƒb·8âg!·Ì‘ùЍ3úÐÜæ[;¿3zjX捗pF> 8˾ry©¸°ñsÑLåÊ=òÄ»P1Ëèás)\Í^ªîKݛ۞îêìWïð—bLwᶏk-’yc`liüØU²Ýœ‘\(¦Ê;=e3îSSðÉP=v̌5²S_á3BøBï šÍlx2Þ×"2#—‘̳ˆ¿¯„­žþ$ɶX\ê¨í«~/=²‰jd˜DÓº{áí3Nb0U–k=¹ÝYý2ÚöÈHe‘•"túnš)‘ùï_\mM¹Y}gè>¼ßôÝx:•˜BñcfțOóåW£L|x˜{ƘQ+‡£ô‡Æ¡ë|Ƭ+,ãŽÄ5HWLËw†¥¸N_ÚÅ:ÛÆàð€ôx®3·€·þؙÇ{ÍsÏbd:Ïm~\{åòðŠÍǧñ:ûšÂ–™£/½Ëqân¹¾^Ž¹&è?«û ó5´šÃÙÓ|ÁÜ¿3î¹î»s‡Þò¤©^{âî·/o…Éy²þð³47<—~cی#tD"ôhà–¬~÷ölÿèŸÿéËçGÄò?þϊZ¶D±êqà¸Ñ©<»ËüíÃ|D8Ç·F~ǜüñï'Ù½Ècql'`×C"Ó]pŽÇ‡Î1Îʍ]¹ÌAö8¼ð(²0ú|nÖ*òýj@»»®ör“ѝJ4ëî†=võIçâÚXTlçáLnô`Ù¯Þ@øµ0;ø׸FbM`·äî’-2==æQü:Ü®-–ß#ÎY4ÓÕæEßè\Õ!§ãÔÍú²ä›ÌÏÝöWï<«Ô_¶}¨{• ã¡=ΩQ£Ý=B²Ô Á^>Fø™Q̆#ì¼â´$¸z¾àk×µž"J Œx J>õû#ƒJ.ÜCn\àåÜØ"ՂW]j{6À”&)ü&³œ­Ö㿼ñ ÿü‰1ÌxÅrȍžð=ÚµD[·nÌ=ÃÑÀŒõ©ÏóÂ8¹±õ`WTVˆ!ãyÐcO'†yM·htD­çp†EŠß€4õë~7ܔfÿ}úÍî{äï=¥»†lã÷÷ŒßßJ -èFOˆFs{GrÇþ–§Ku£§fõk!:–ö ÷–fQ-_A›1ËÔNyvQ>àٜ‘ÝiŒ9ÙÌW@Mv¿ïC»ÚVžÊ¹F¥Œ°oì&ÉSÉ6è·FÒ]ϔ1³ç ñ·½­ ¨šðin¼ƒ¯|?²Ùûý×¢Ù=Òz®N ã‘è’-c¬™ìHRbæg.Ðín3Ú›/¸Å ]é}ô&/ž×)x­Å§{Ûáå5y°-žVd¼yw8vân# ßŒýÚèñX »qt¾1ÎÀ̬vm$qrsèR…é›ñ¼ÐŽ9AïÕb_›Fá˜íø®gp˜L~‹ñéÄq‚g;ã Äþ6ÿö—ÞŽ<./L“ˆO>Ý+g]©;ðóp D©„.^½Ó±it¼6î »`Äb÷%QŽ>ŸÅ¸)¯º¨ÈQ4c¨G«S£hŒn”‡Çõ¼³kžkcpw/æŒÖ.dWúYuôkø4íÊL‹?•N'½þT,šÝÉ ìzږvϾ~}Lbvt¶jƹ¾iŸeI‰øjî)hQ@Ÿ†Xz à{q¼àº¶7b™”ÃÉPƶŸ9`‡lrÒمç©1Ø÷8,W³ù{ù\ÊìÓë ê·40·ƒoÞο8ø¯t>bÉÓ=QêÐ!“YûÁ øٓ½JÈgZæ¤q)ŒìÜeòÁ„Cpó|{ùmGˆÏí5ÑG¶s™C£èŒ¶X„«Óÿ؜ôLl+½Ýž+èUo·1d™ï=m,ËòÈÚÍÎò(»ö²:äŒ/ϗìF?’>¨kï8£Œ®ÉÏ»_𘤊kfå] ¿~ã$ó?54{tßL2«©â„›=`/Ì÷M¬•obýÍ8sžñÀ=Úuc …KÝح䶮U†=˜MóêNßöÈ ¸n,Œd>»})6#~éŽfî=!$f\S»B§½Ñ#'Ðõnˆœ›¯¸vîï l÷ÑÓx_ÙÀâžLý›ÌrLj96fЉa¼w^¹‡²Ñ¬øy¿š'ÐÑ@ ú_ƒÐÛ³lànèÄ¥µ…å·<šŒ~.òÅsšyE;¯Æ<¾ÛI¡éfÜÛÍmŜғwöQÐÏlày£ê–¹}aéÆ®GÆ%ÐßC%„Â|5EâlqìlF¢Eo"AÝxìü©ƒïæ1 ³ƒÒoe®`I=Zø:Æ+lÓÌgg²‘K˯Õ6îÎÕ _Âh¬ß‡å|¢|®­8ïL‘ò=›ž¡÷l¯ÜZZ¦Ô£—¢ £ç‡Uϲ8±dƒoº[!ò…(ÄÇ[|!÷)Ǥ™½~l´Ñv›%pM±\kƵäñÛhàÈÅÅ­œ’Ïpɐ´ùÃxtÚNœeÂtBý›Ì–”Ûj´à™’â¶B‡{¢eó0žhöÊ-c×Í÷ƒî#ÇÍ8A€í·¹\‰[Ú Ü&ç -ÊFëÃ}œéZº#Ė–ÆæÍ_Q¨4ÐR|(mY<½r­»Yƒ™µë·.žþÔâÆÈÁ–K£a碼”ƒWFY/y°+sNòÕ- ŒAö"­ß0SÒò”n–&å쵸é‹ék%:ɱ¾£0záÚÚcŒ›—Ö¨ùúhàÌî™N¯qãu7s„ú™±çr<_Ã]Tš,òa>ó;ºÕ7w^_oGÆ~æÓö±˜S!ì‘áö1v |pn]F¾8¤h çžèŽ|—_<爐.»V;-Ë%_\'ÈÌk)¬Â“–ôqòÇÔá3CsîÌëæ Ýñ=W·\ÎñÍYºFâØÙÄÚï'SJd#tãž^$›p£;mõRÐÍ‹“c´“ì‘ý:ªv‡Ñ=lš¨øðæ–£7qWn<£Ð1®ô¼4@BDûn]ŠË±GA…/ž¼Ò«¨¬Y"~ß"¼ž6Æ¡Õ躘Qn%/š[²×_jù{˜–}Â4Ð -£âÕÍ(äÒÅ#4[äH_*óMfOø¢‰*žËX°ƒ{(ÿ¦Íøü'ѬB4!Äà´\빶ñÕh/mv{䌋ŽŒ^7` ÅÝ娲ä!vM”žS$wv蹆QŒ‹aù†²+qÇhÔꍚèà=î€õ©ÅG”;h9蕙ôL æÎM¸÷ê‰gh oŒYœÓÎkR¥;öU«ÓÑÀ•~¶ÔÝZ1¸©¨òåF<J0I÷vägwѱww:"¦vÊ}`k`ͪ¡ßd>(+÷j„q¸Äz×ðºËr:Qx¹Ñ¸4¹N½h­Pc%7m6ڎ2梛cr=½ëtîfº*_^/ž=Å¥›1j]çP¢Ýk¿aÎѬ£53*a‘/]/Ú½6Nœá¡Ýµòdb°{¸ÙTt¹ºìO¥ÃѧdP°‚ku¿¸ƒœ¯„wä¹~ï$ékå:mÆ:›¥ïc\.¥‘ËÙÔp(ô@žÜxœ9µé[îÁÂçb¶q3syÚ#ë]u2ݨÓÂ÷`´È©Q¿Sµ:q+æߍ¹:pÍ"6£ŽPk`ä 0ó¶vÄzùåæˆ*µútÈeł¼GdEI?Þ#=¿¿sQ®7æ,ìs£þÒÁ‚<—Þs¹ë{ø†5—yƒœ?n^snÞìÈu~éÂå6ðaÈ›IB¦€Î¨I®W[•¹<ƒÊ1 Ìç :,´oŸ³8f°ÍfŒÌ€1¸Y“šù^Ã{NQjˏ˜#ьŽÜō‰š²4LSëLê­ÊÌôêC†f9d» fÙ¶ºFSÒ!«„"'Eÿ…éÂӋï&ÂËðl&†=²Œyñ=w,ÍÌç)ÿ“™p×åÖ֌lA´xæç3ê×gZM½èaœ_A®„ܬõIWÎÙ0î|ßMéÍ·#×ô*õ ‘µm-¾x&yñ|§¢¸ÂÈ)XÏÂ5nfO¶+oœ!~H!cOïÀb•çDC3R$lªžÂ^fÜž >.·¦/ßõº´G°V·µéZŒšù܇Æû®ä,۝Ëé—qm—sÍdfß;«c•¥ëŽ¢·Ñ€Þ띴@K±Ks®$.Ų¢÷–ǤÑ>ÓƒD›ÙW÷ù·¾ÉZF†Íöaö J® Xs#»f•]Øz„%E«ª2æÁ¥N3[ª©âPÍx¶:ËЀxWkWñï[O)Ydá®Ù±~0 Œ(—3%¬Â ë‡0<Ý=süâ³øh–µ·­&’úctvüñN¶Þée¯a’(ߞø¢–gp}Å7µú´÷€Äk$2ôÛUvÄÒjM^o ?“‡Û¥F8ßWz5îh·'`·“9òì‹RٓRéäٌ,p7+Č{ÚÃɨ¥E&ûŠL©‘g!e)ô4À2µg -§¶ç‰@WiÑ@•Ž»#<ÉÎì¹Ò.½xäyÝ" Žò×XØÞ2!VG¼å÷én•GŒ֗ëÖ7™9ž\©=lúŠîÞhwk¸þÓsïnr끴{Üy<·’æqêªÓäµÌ8œ¼¶…#þàçe LRÜÚÈ»û‰ß“žà&Ð5õ,6‘ÎHNÖG?ÜvmË SPe Ù\Æh`/ÎT´DFy™ý$MçÞp‹Í5 -,sZ®ÞŽFÏãNwJ#M½ÇEjëùû³åïçIþÑɨã1çƏ\7pZ L'£`ÏⅤ¸è -; 2›gyÞlc¢u§ü7™¯¥öj§˜ íááR:CŽ®:òlMqöñ—Ž ˵i‰-E=û*kq²íä4k5HŠãåÜÞ3¸ýù}–U‹þö`úsŸeÞÒÎj}Ï?»å$µs¶™1×3íéL@¶ýáT$Ŧ'le)¶o^j×Òxò1¿¿€£|+šâ j=-oàR¶hËeÛéÔ;½gfnkæ¹àg½~yy<É7ïoÏU²çÍŸ–òmسê³èQ–›¶‰Ëû–ëÇòÌ+¨Ë˜ y â=smyÀ0®ì.Ψé©úÖn+*¤ô@aŽø"¿«O“­ŠÁíovç€ÁÍZœeè—7°BäþÛ³Ø[…N’l+Cª»È°å†Ú¯²‚ò „hÀòõæéý8IQ×;k¶»&g_HˆTó¬ä3‚Nèô™§ƒ9•˜:¦¨œÍî2MO¥1Ž|ùìûq¾fåµä -OCf'¡ÂÞrŠS¦ý..±+]bÖÀ`êHʯUŒVI¿zSŒÍŒY‡Ê3v//Ӆ¿Çü”ò»xÁ]´ó.|Wíæ÷x3$Àc~?êßë{T§‡'H§ -㎥³iàÙä8ìðõwÎ+ùü­­uö«–ò`W&µõoõ½¨2“H‰å‡Þg9Î”¸_A[¿î'ñ.[N¥æúËxdR4L{Åüpcœù¹¹6ßë -Ò*°¯­¬©¢È›IµÜ;FyÏ<‹Æsg—öN˜6؆_œ‘@Û Õº¬j7Þ<—ûhvN‘Ñß2ÝfÌ©%™ç~%ú{a¶ŸgŒ/õWƒ1ÆÅ¥dGË#g…G-Y'Ýí7™WäÙ±Rlo;ß·²{VK"—Щ†f>àÈܟôMæ5Ýq’æ IdÆqf ý ½§R÷ØS0h-“ÃA—Õyß 2‰D?ΚÃa)•ÝnÚ#S¹î¹Ïp\O.œN5…ØzžðMâÑË4€R_™Ú£tc²~«ŠJ¸‚V¡âc®¨3¦;ЩЕe(ì. »UúX—®šc债¹,ãÝòÂ9×ï“&ñà Ž‹d¨;é}[ž»_Åä…5‰n'¯Ÿ×à&„ܽŒP8ŤñÜ|a.l1cÂQücØxÝ匁â)®ÂŒðeW’ÿ¦)zJv!Ùç2ÞÞ3OÆÙ>L#,FF¬úµÉR!…|qíž÷ŚøãÔDeÜºÖ l{ßÄÎ%”Üàž3×ßs/¯–´Ä*ÐjMH_FF·çô¿è¬µf9 _©t– æäɊQ¨³גÇsí26l«ý9P±¬çÚ~ÞQ\M/w²i)~4ÇB¦ôùçÒUËÿ36Œ×¤o=Š‘Õà5Á¥à㻏– ̵×î™U:O l§y¡^qâ[nUù³Ý£%^ÏQöºa›~m~yœ­YíËì]ÍBæYÐ,| ƒÃ7ù•ÇpæÑYÍ%ß¾ŒH«ïñŒu[ºx2¦—¦Æãp²›O¥°³‚——?R~P¦“>Ä£¶çË".ÅžæÇ3_©x¡“‰-„kô ]%õ‰¼ËGƒ‚;î_ä¹|r—¯¼>çr]ÝÉ¡Ù§ã/&—öß`ž4háqÆ>óKœËœY§ûÌ¿NÂXlÍÃÁAF6_©G϶Œ893-Ž*lè̔–QRç/ÄÀy -֞¹]NܨFOQrráÞÒZZF³é;³3å‹~SÖ.Y÷ ‚]æC5K,Ü qÇ -‚x.Ô³z ñ -p5gœ[~“Y¹#ýyu†©p£ß¬ö›àì0晓ÅLhQwÆ*è‹m¬ï†$¦Û™Ú¹8¶3¶àñ{qéÆ=VƒõèäÌÍ3wê2pÎ½í™ ñÌâ=ñ¾É€îɸh€*gzà Yñém-7gAD-÷&g$púò -üy7°9ºÐ91bÔûyîï¶jÑʼEz³,v -(ý@í͸&ŽˆŠã»Û3Ôì.™åµ>°(Qå.ó>Œ€.ó'ð$ß<$rFlÆ7™O‘×AŒ¿øŒôa<Ï[ ¬(Æ=·²™׌„Øœ¾“RXó6Û2oAÔ'Ÿ‡Šy wgù F„k_ç‘c<Ì̓£@¼eXß³»Œ½w¾Úìׇ®Ð¨ˆnǃ›cӃîÖpÆFÔ° û‹oF™P<èþ¢ t$ìÆ|…áoÞîE»ªÝcØ Óqža¼&üÌa0 e[y±Ÿ?H*çÃX70òèö\ÕI |8=«bX’lœ«Yw•Aºã(Ÿý™X ²Õrš@@œÀq@Âïááí|}L®Uŏ3¹Ò‚@ËIaæ[ÞU{°ÀƑˆ ù§b£¼ƒÅ¶o¥ÃˆsÑIGFþž ×±8„×Oº£,o×îclΌö{&)93S¶[OŠIør!¨šuhpÆ©Û§îfV‰ÐZߌҗ¯¾û Û@4"æԘßIšR®0>šÀ£XžJœô8 ðDŠ!<’ͽÊ|¬üÀ–Õ`^d•©4ãFzV¯0÷žAXÓÀ¾¥ÄE ºÙÖ0T «_x£Ð¬œ½Y9Å¡z²‡ÉÐ"dߌŠ(; -xay,¢,¬Ísq6kI3ˆ92dÿIQ%Pü¹Â=00ã ú‡QÞÀH1eîò!ÚÊáŒø†ù$½¼Ÿ`V3+GÇcÜ.îWeê¢vòÔ+ Ý÷w ”^–ZôÎÈhÑß0_IŒŒ Ÿ,+ ‘Á"o ŒÙÖ!«Z ó‘釷u¢Û³ÄúvL¸eˆÆ¾xõžŽ¨ÝÃQˆŸì’?ž€G»rawö ¸ß0wŽcò&®Au;؉9ðê_Üî7ýÁ£t…{&“¹g8ïJ;Ý/B‡œ`ú¢ƒ¢ýÆHðº™3:U Vœép|EœÛ÷7ð5ïŒM™âR¸3V1«.¢ë£K(KœÁzÉâé`Šc1ÌñÒ¹òìãïsc–¨€^¿anÜXÏ|¯ûɉiîmÅè'¦ìø×If&MÞõÛ³J¾ÿüÊt·ÂU®Ls7÷Î!ð–;þ¹¥qå?åd®—ƒód°ÊE„Ò¨"n–-ÿ¢ü{Tôûúƒ»Šaì f׸ßd¾f¢¶à\©ÜCðíǍ¨õ>3±— -·ÿ&3Ò¾8NËC1h¤L˜é¶¬(¬5{s°¬bmÞè½ð¹ E¾¿%yë{áê|aþ晹#ŒUø†yà¹sÏ·7òÍKšÿ‰É¯¿¯òå„Ö¯òå²x\ÅÕßåË?,«|yót„%ÌPöw;ÞË -æÊóƒò,øTZ ŸYÀü¼v,ðCÁ_õ{*»ì iQ+„Ùù7θUÚÆsùÓÀ}s-ѱ^BýP O9«ÛºêRÀ±ÃA@ñ4¬kï_t÷i[õ›¶Î±?Ê`w•¾Uy% X••:òDÁ]ckƒ1ãœ9al„‹/­¤Ó´0¾­Cn‰w;Q½Må,´|#hɍÑÀQ©”u-)z”t -ãž1^«Øƒ™S«ïU@çÌéTó …v­Øø9î¯u¥­ÎÐTß|UUh™ï¬í[»Ï_z–íiêïu-¹Ví<ó8Ví¼¦¬¡6ªç9¡‰Í¤vž%ým½ŽsЫ‚Õ=s tȵ³ðòÔûþYÛڎ"ÈsWRØόCÛqþ¢âXq¯Â=G­´Šü¼+‰rí‘'u«ÈO1ªúï¯?}šI4ëg¬_‡Ê+x}^Ž´F–b žòûZKÈ 1KÅXˀ½Ìy[žÜŸYHûe2ºª]Ç÷F\GÉÀn§Zcö÷µ^ÿ’ÝçéßÆU-«˜/$ɲƒ_d–R:ž(S›¹êhÛÞb€‘×fÒΈ&ÅC¾*†¥­ƒD _ì2rĜu«eË>W|~^iÁ×öѤ¥(× ·µÑ«E<µû¢£¹¬XE–ÅÉÊ=6¨@ÿ¾ö’OT0Õ§±Ô¿¨æ,4”ù-dzE\Ä·£åX¬Q@ƒkÛ$&Ͳ_ím{U/*æR½¨‘¿T$²HG…ÁÔêE«Gâ¼Ö¼h±ê\ՋŠ±V/*æ­Æ¤{Sre¾¦Ý3ÐUc4°[ ªþݵ[¸³¼2°øZzïjbsëCQÁ[„ð}Ñâ®dåÔõ3Ä9Š‘—pJ@˵–¬œ$è„ؤÍn•œùÅÚc¹ÿ~؞…/m£ô,Æ_sË•ʵaªÞ¢žÂ2šRg5ëb¾r=e!ˆ±•YR©•e™‘U´ÊµÆalø|ÉðiôåE4P͌kõ]=éÓ軟¼ƒ4òég›89ôhŠ_ƜSö–kOÅ/Øp:÷—©V3*Fj%#õ‰Œ]ÒÚ©Ö2j -0y_kùûbT­úDÍ£G1Ò}›VåÚ±Óq[÷Aq*yoe5þ ü!njêaTÞ«OÔŒ"¼p|»V%Ù=orŒlEöxZz…ÎåTk™âí¶ØVS…Féc9àWaÖ'ô'¦D÷Hb%oŽ¶âPUbô8—™Ñs -g֔xŸ)櫆9¨¤Åq/¯‰mý⛕ñWùš”ï©^ëEjwuvŠñøe•ÊZÖgXñÉnáÖµ)ZU=ö‹g[}%n5ŽŠØNJy=Ù@àL“È÷—‘—;·(³®µ¥åìªàq©îP1Î÷èùØȉá­(l -ù&ì}ÇÒã¯9 ~p­¢]Ž¬ŸèTÆTŘÌja¼ëFGDþÂsx.£Ï ¦»ÇEÀ§}A»Jù7’"ŽGϚƒŒÖÇ ¹WàX‡Œ«ª—©–è…-K›@”¡3ÌÂ/ëP¶c‡Àï—Uy]¼øùäŒg)ÌVÌ-ƒ7£†v‹‰/ k0¿’#¾­z­÷ňÙÐCYßÆ=J³®]fv“FüƱ¡M\Y®HI6”T¡åJU°X ¥O£GæÊ4͛j6ßY¦ø´¡¿ƒV7eÅÞ1݃¦¥èR®h_sA5:®““Išs¼fÂkó à*cë&¾K%)[×íQš4Úë[û0õí-ó™Aû&ÃjÐl-­¨Q`\óí©Y¹vfí¢ƒ”WÕháôYâ9ÍF—ŸlUöNÞû¨]tÞŘÎÊÛ{ª^{üB¹ÂcfÑeLNSÐ}³vøIæN‚ŠeŒ µ]™Ø¾âçÜü$Þb™O2[P±ÿŠÑ†iË{_V?x7ª i}dJÂÈÄ"€¼\kÓUˆå¾g!µbT´PNm2g°¿Uøž> [°ô™Io”ô #bÛ{Ü@¹6SÙìWbe/£s ŒÀb¦·ª‘¬ )ª²ñ÷•äûu%·jQê;÷¿Í³é@¹ëµy9 {£ÕjôwE˜íÃÒº¹Q -ÏÞÀ}0ˆ†ÆÈÔz¾^{pÚfgÒ:E.Æ3€¡ôöË|ÿ²­Œ37ã5J©HM¨7V¢Û$jϜ…wËzðª¾)>°9u‘ °–¹Ç –)¡b -ñãŠhõ@¼Á$–G:C› ¹qrfŒéî‡è|׆;•òw§jV¦Ðê‡}ñM¤âLÜw{ð̹ø´¯ýºÑü3IÂÎ?ŒlxŸ©~|wí{H+¶BàˆÔ©¿tœ‹›ÄopÄò:ŒJ§w(®-Œ’0âS>‡kƒ vcÖ -ÆQxD™>î@KR“ã‘w “/‡xfÆvÌ[ΖýM¢Œ£å¼_úµ%ðý;PIsµõ¤#reüö¹ï¹ëUHÝ>j±Û~ՈÃUì^kހ˜Rærߜñw£¦ë\x÷£Œ~-Ì ¬º„[¦33à\ÚNG®×ë¤Ë]éïì‘ËIžÖ¿3z+_™íÈB•—öõeŸ‘;틜֛®ÜÉíŽà¦k³8qíX’Ý}ÿ~ÍÐ<æ&èW¾XzùÐ3ý֝:¼$È2RÉGy9].×µJ¥îF¼é®†²­Ã=µNN^ƒ²¿º“ã}ÿ_… -ûÿÇØ L¥JD(‹Oßýþ GxYtœùnG -rp‚§¨Ÿ`g¿É,×»Å!¥§˜?vmH"þ6Ú.ùן>Í -µòQhÁ¿ÐŠ -}ß÷büUO{Þ?¸–jÎ=κ?7Çooó¹ïÄ.ëÊփg£*?+§ }c3,s>h€*L/£cö4€yÕH§«M&3¢ð¯l¾’¾³yxî=̹s­Òj—ñtGXÄ׏avDH#ãH”£éXL@¾±t¡j×ÈèyµšÜêµé Þ³D³° ±EN#?ñPÚ07 -;´fã¼( >ã¯j oýûku¾únUIö=2^GhcÙST~Ǫhpì녛KmžÅ Ló@ïk-Ã{,Óä…KËåÎÿå2õëËPþ [7«€å ,sã× Í­×¶ˆì‹V‚;“í¶ÆJ(¾qšî+ª ݀²ëé #®#.²å}­’û—FM7BX®t@Ö>^WæJa/LF'“o\î5öF$\ÛsßîHÄ}³׋¿8~•-~~R¬\¹>…‡¿Šûç“Æ|EJÔhT'Gå;_CÜâAÛ¸r—WQ`ü{¯ Š°L®¤ûÏ旁k\N$hØ3†QðRѹ6â³!êQÇ|ÙN<’²Å¯ Àëß]yk×öc[VÊþ0‡ßˍÝwR}@«LÏ’¹áÏÿ‡½w]Žã¸ÒEŸ€ï€?Š°#6à¼UfÖè—DÙ>>A_Žå™ñŽ‰ %lƒ-kžþäº|+««A±»š"»Á¶C6´ª*;¯+×ýCîhzIì;ÚQzì'Ä ô”Å,ʹZQJÃNØ٘'Z[g}Th[êBMßíÄØë’wb’óÌAÇeÁ ´Q66J¶YX!JE¬(«ï±¬­ÎÁ”èawš’5Uˆ±8Ø)¼ÎlAÒ ™®h J! -¹ŠÖ < n»U"g:¢NvRZvúc¸Ä¿n %JTÇCD†É»ŒÚ­3 Ø® ‘òÜõóNDü¶V/,#J)h>Nˆ¢;;TáZ}W³Øˆ¨õÕ(å°f ¬Dˆ‹H]¥ÊKªå; Š P£œÉLkB¡¯žŸ±[„j>ùYb˜Í",É!ów&Žvk…ü ¦*q;†`†6Þapºì©Dõɂ™T1'óê3Œê“ OžÄÉ®¬›*‹_}—BcÒ¨|Œ‹±¯§ò+dÞÅB¼&vipÀ‹Ô`q0í&Z½`8k^%~;«D.§ci'›Çg$¬míVBÆ@ÿ)6›“8ډDö';…H„Ÿ‡‰#k…Œìšàdúœjn’/Úˆpºæ>v{×àé}žÓªÛähÅTû¢j °ôGP‰Ðª³žâÉ»d)+`ÇèDD(òdôAîDëÑYYJJ’p†l=J͓ëL‰ÊÈs/æ°B¬CB'+ - ÿ˜ÃMn¦œ€d‰éÅ+Eæ†2{×<lëÕ¦RÎ⅚Β”Ó™¼-IùaâÀÍùû Õ²¤¹šøÓiŠ""5 Riò¹ÚäMò1U½ã-BϪ„‰·ˆ¬!)¨mފ_RÒ­›ُIe­Äµ²ún¬f™ÎQ-0árôT⚢›_ë¤Ä^÷ۈÕ.Øs­…Š§ïêºÉá@De;“Ì59³a§l›CÈjRGÍê.60VafÄ ·ò®§Ñj« ¦iÌn'ÇúWÎìÈbìiÍâ…N¡阾kØj]gã•ÓåT¿ãâ4º‹M$b,¦ ªwNJŽ•  ¨Áiõ]l®•V5»hªãòîT¢jËíê ÉŐÄq?4¹ TW;ñnDõή¹ë½  -þÓnG"h@y«(°wLFØÙ°øuPjŒ°aNMÓ㫙ڝÈVr¶—kM²)q$S3Î?È®êU4Ϟ k´Üc©;YÝðÚf­aF È·ó©)Ów½ÙR¨ÚŒF†{d€x¡ëÉúúê»hbÔªªX!¦i }'3‡¶ª¼¢ö\€.5ªI<° %L­~.g¨5½kþ¯lăõ-)9ڎФ"r¿«™6ˆO›‚{PæÎ[µIŠ‘µ -È·4?æq•8e•¨å§ÐÈÙ*t`8`ÚÉB>Ô)ÓY#]í]oÙн–ï„8¬M§‘á&§Ft¨“¬ÐߘQÝ¡˜•z  «ï¦då…ÔEDÙV—fâNêåºú»+D+L9%öøÉ)Õk¾g¿9uÛَҮ*S³•ŠÁ»rP!–2#˜S²Õ°ì ò°FtÊ[¾Òˆp<:õVãXߍl˜,֜È¿øäÉTõF£‚ -q,N·+§3á¦F–z;,!¢Ú%² Bw†M‰5…É.62jɳš!é9Áj †bØeJœ]õÓwƒ!òz)‰¸B¤ˆÂÞ@'çîߢ4i¯Á1| ¨´'‡ ÄÙU;}Wƒµ8¼ƒñÙV‰Y -.c‚ÜQ Ø?’(ø°2šÏI;&rØôÝ<ZÆ°F䄝 “âQƒ“qcuÁ(’ä4ör´ˆæê×c¸(ĥזëD.mŽ!t²Æᱸ4X˜zèqK+[Ù¢O¦ïF°ÃØ+ÄNi¬C¾yâ9´ß¢à¿q@|vvÚW‘Nm–Êý]º$¤lUkUkmvÒ 5JL¼$…«1þŒø&TÒ5%! - Úí(òñô]gñXÞ´–"†EÌiäz½ŠxI9s$büï's2b@©r–ÙÅiÕ“0ñc!vwh“ÐåPDºýD)ž©ßÆåƒTS ASãxÉg+×/Ýú–YA>r):z`%ñ>©B8°RŒŠ¬=֒Ý\)ÍÞSX ³5"q…èû‰Ÿ’-DŸŒø£úmMmš'êE'{5˜óÒº™f̵NÄiQcÝô]5Qó¡Wˆ\¬ t2Š¾«×†iÈUY!rùi뀒ûº‡Û÷d)6dä ß+*Ïô݈€ŠÂÀ´ªE¹ÁöՄ:}× QæD—âh €Lº -ãæƲ1"{D…Bã:ú껥 ®Á6AÄ&br—¾dpcoÌ'–{{:ÕFW‡Ð('ïfH«āêìF¤#f™Qrí従è‹(”2'÷ Â2蓙!õ]_ÌØ3JTøœØ¶n¯L¡µ¸PiFˆUÓ£DÓ ûBkqÅ4¾ÑÔԘ ُ’R4@Z‰°"*êâä]Æ; ži©"QB¹A„‘Gæïrô–D:i¶Ì„˜Í €\ þ‚æ !?Ø òªÄ,‰*‘-j”6«Ób¸”V2¢^aÔ<¦"džÀ–ØÉy´ô3°½ -‹ÙŠÌNù.ÕîLf7 1%5ŒyN RÍwfM¦ðï­°«ÄZ‘XÍ+ÅãûN¶ -AA–øö¶T.³:‚83NßíE#ƒE¤®å t2°±&­†^ò¶£Tvš÷ öBÿq2±ˆ©%&SP¬ë= çDCa»ŠÊ¡jå -±]—èÀ0“Fð1ÌJv å0”ˆ DæäÝ.¶†×ljg.Oˆ`¿^î…é»”T´*M¬Ÿ@Á3G©CgÚ»Nª.ÔiíŒ"o4 ¿;ÈÚ¤Hü -q2„)1ÈÔی’‡€`ÇDô ×Àû\¥ ´Äå„{¢¯p ©Ã()rä)¬sÜéT©ôõ3U?)2vŒ¾ÉÕG1íÍ š*yp˜ì%(@ˆÀbq–ÒHñ¯ñ¯¡`¦é8À0£÷»ËÕ¼¢J1"q-86VÈoæä¤ —4É«qJDZYcò.w #ÚϏ‰ãšÏäÄü³Ä0%vg¤è݉vk­SUp¦ã*(¤>Œ:T+³åTœ¿«ÖŽÉ¬ûzMÈ}m¹[È{Â.pf¯XÝ1]w›ì®j•bWö!ˆ³= rßÞ&MŽAœ€¿ÚqÞJÕö7ÍVÙÏ ã™»aÊ[fýl“/_© ‘«?®r "ˆdò®ÅTw>´J4žµJVþF­¦¦Üe•8ᚫdå°D v(/æ¾®óíIìÁôÝW. ’86‰•QHVtrå]Ô.͂ØpÊ%„;  W”¢²XÑ€»¯ˆù¢‚¡Dùž4ÀÙLÞåÊ½Ó q•È{ t²••{f‹U‚9S€òQËÅsqe‡ÊY©hmc­W*†4d}ï= 8ÞI«Èâu^’++‹Ì@gïN‰UÓIpJ6q‘Â}r@y+ølúÁT%2*NÞ5©¿‹¶«DƒWÉqZó:k«Ó2ý)ĉ _Ú'§¶‹÷SâD˜’Mmà¸Uv{ )Õ×Nf¬ ¶ -‚[§ï¸ú£âK_]À½ÁD A㫦ïvÕÉ D•õÈEŽüm51-:« ÛY§Ð8¿J„ö‡:Y5Å ‹ê:% 5oªò¡‘í9}×Ě®ÕN‰ xBîÚ2GˆJy)2‰ E"U‰Ö;–½kᄰû˼õÀ4`"G)±Ed1ÅHñs™uq(ßÊȃ`"³ÓØ×É»v˜©Ղ -;q2„)yô 1‰Ê"؝!¥œ‰Kªþ«D0T.f°únH-&jtƒO¢M¢ð¾Õw1³^ÐbæDFæ«à¬AˆE4º=k•Èð-h “±a7ÓfŠæêa¤ÃRÒê»u´L³QM‰Np²fÉq”9ìvÆU¢Ù$WÉj¿ä¸æ\»ñSH.Ÿnåðeg2ò‰eÌ®Ê:‘³0{+ä•ê³å¡˜‰˜ˆ¨=5's²E½ÅÞí¹bmW8#6¹0OˆÒÀèß黫L­j¹ç qb¿Ÿ’Ù°<êE+X¦>ë6µÇü´ ±õwGÃьc¿f:qâę’³`](ӐúyQT䧠1T؈i).×ôMÎBG9â׉lùDÌEr´U¨DNÀ+Ъ€p =ÅQ$ÇáF³ ü˜¥š×œÈCÅ‚¬öqeƺ * 1'¡ù Ê"V*^gïˆkÑ c§D…ÄÃFÙBŸ&û”ÿ^".…HÑQÊMLßM¨7ÔàœWdÃ4­Má ßAÓº“t?u¨rؼ¤Mß­(ÈÓÝ´«Ds鮒QV¾ç7tG1ÿ”G)s*¥ïÌÍlgDEuUO‰_à*Y]àÓV¡{1‹±ºÕÐÒ&I;“7yZQ‚¼ÊæžU’ï;Yln§Ód -*d"U´èçƒ$nfV¬pž½[Ä&W¥Ê|Ï2L®üˆ]ØÉà+D)‰Ä¿$é’JÃïçAº¿‰®&©Þ$D@‚¥^҉Yì€jŽöî@hT3-uB$) €œûî=°p•É1 m¡-Øá‡í݊RU=`fJœ×LɈÃÀ# -Èb!;ÔWTÛµàN’‘Û¼‡qÖX´ÂƒÊK{†™Æ=}²JÕ$äiÍתē¥ÙÔô@N"%§zÉí¦Ú'åoØ.þjFîu\ è¤+R )[8Ÿq@j,QG ÌÁª)LˆQN™|>%£ê²·´–nÓ÷½Fm8ëU¡,Û¥3="¢(¸ W1dJ/Ì•|nÒrrðGŌƒ(2£ÙÈ'D½å1úNvê ô&˜÷ûx2¦éÍŵ¢¤ôòô]‹ÑïÑ F]õ¹“9.;Õ]±b®¯â --ˆ¹ê¸êTÍed©Uô T˜0³Ç¯'=X!£tÈ´U˜Û|7à(C€í~ò.%º`\f 6"UC°Bp²±h®}SPô YÓT“QÕ+?É°¦m ‰}“wû©àRG%­»géåŠÝT7^=Dœ¥›Ä‡ÒMæÄ0%v o|è݇‰ã„87=¯tl´ú“tA–KíTØÄ•±CÜà)ØÏ(qH¶ (»P”B9ºÒäsÛgòfD~_—ΧD7 Ýîdf­x*(жÌrƒò¤ä딈J“n€«ˆ7$c“,¼ÁO5þ¤ÓVº4!÷î»qŽ}œn@”átFÜ`YúýÍòÕ'ÙiÊÄlAœ%$Lè6“ò%+;UÆ•‚pà^­’'‡Óqàfaa'µ>OùÌáôµú®ìš0’U¢12ÔJ«`eÎ#8f…í9/pg+,²g§M˜é„8e¼L‚†€w“~ÌIå‚d±v¢4PÒqún¯XEÿ -DىUŒžÒÀ”l=0/UB«Ù|²g¨È±Eιi1:ƒK R§›/O”ŒwdÚð°‡}ªCè!˜8¤Úlº³'D ·Ç€l vŒ—8u1[ɚdèTJÄ É mïrzï ¯{BœÆtò”Ë“J€8» 6aåîpö:±`LÎMWÖÓÅûêk D|þ§Û›¿Ü]ÝÜ_Ý|z*d.»1}ðäO¯é‰wòèÛÿøýï®®[3O~cžüۓßüýÏþtûâ’þüæêâþêöæü{ðåɯþõêú¦=:mݺ»úîíýå›_Ÿü¯'¿ùêîî|öÆÅW×/î.oèy8ùÍnîû3úŸûŸ^_Ò³_¹/~}ò›¿¹ºhÄo[«7߯¾øÏóë·òæ¿~þEª4BïQ'¸Wû:ŽŸ6ÇOŸ`mo<’¯^Üÿ°ñhôí½Ñ—Wßÿp¿ñðúGÓíwÿ÷òâþëÛ·7/Zÿ¾¾}ÏÙè|É翽zÿfãQ®|óчúÕžuýú‡óç~Ó1^½ho¾gLôÎÿÚ ÇûÂ&ïßÞ}÷öúòæârÓYO7\büÎGÕÍí·÷W÷ïá!}Loøí¿]]_n¾{W¾ùè# ›íæí«?_ܟÿs‹‘M?ùø÷]Ó6Ûwço.wwùßoÛþÝüö›}õÑGHGnÓÞ]¾y{½ù½×7á@ïèºÿ™®?Ìý&—Àåߦìäç;û3óþ‘äêfÓå¸}}yw~{·ñ‚ô>ú6ûööíÝÅåïïÎ_ÿpu±ñ÷ž©˜Þt7{~v®nÞÃ$W>á©yzûêõ훫ûMÍ/Ñ–ÃÞûÛ¿ùæòåɗGmo?ÆqÔööwDGmïQ—>gmïåÝyì¯ÿt{õæ¨ï”¾·ñ¶=<}ocûËQݛ í¨îÕ½£ºwT÷>;uï4<…o›‘ì¹Ê—Ê·ÅˆEåkzÐחÿ¼¼þö‡ó·?~Þ¾¯eê7÷/¾¹üçÕ9uh }aúÑ'’Xç},ÒÀw×oß#Š®$ýûó·oÞ\ß|-c<Yzã#ôbóËëŧ¸½6ÈæòċO!PlsHöýÀß¾|ùæòþëG|ìÿÌ#< ¿±ÀðæõåÅÛë󻧷7oîÏo6_“õ?ú¾Û8áÍÛ»—ç—ß^œ_on#]ýè82¶]ÂßþëõíÍå‚%ìÙàc¡éüóÛ÷LÿàyXפQÀñÅíõíÝ¿ýøƒXD6”ÈÚæÄÉۇ¤›œÎm|P÷ÜÄáÝcÙo#ÇiØf,ÿ³ñXþçÊ ¹½º¹¦æ‹Oa¼üVï‹gÊHzœÎ„-oœ}¿@ÙB¶ö&ì÷šf´“d_˜ÁùÝÕý¯.ï7wÀSØXõûGÜx8ôêÇ9Øx ï± -M’özE6gfÿø¼lóyϐ§ñŸì¦yd^ø­¥}¿:¯¯îÿr~õ>ƒÆg~wŽ®¼½™xë÷‰ò—wß_ÒL´íázŒkñËuà2´Ø öÅ#1§m•²ßÆ4ïCû1ôy%‰<½½½þúîòò6vE<ÆȨW×ç›;cʈq¶qæüÝù‹«·›o]¼~ÖÍýÖ87ȋÍòbŸrh*æoï^ÿp{}ûýO¤šÙÚ±µGÃÌ6Ï`ÙsföhÓØ’™>šØÛ-R¼öü¤o—N±ÏG}ã‘ÚY?¸ˆÛcξz¡.gã0âÃËÙßXÚ<̜ý-ù¾_I¯ÔÞ_I›k8v%d…¯6öA<ýáüææòúÛËëˋmÔéõ?úžûëÆ.£¥ƒ\ÿð£ò=ÑZ“x»4—O”ßòYòî½¹ùnã]¶÷÷ÐÆ#9´{蛫7¯¯Ï/._]ÞÜÿñüõ]F¯Î[S;&A;r'øïÉڟ~åÏMGÍm®`àõ=>_{Ï¿·«5¸Ï¼þÁ'°§ßl¼'Ï/.Þ¾zûþ`ˆéÂM>ùèc»»dÅdãá½xquõÏ-g쯓àþvsåöSh,ïÑ-&>‚ÛÜ oïorÝË»ÛW›3x~ùãÓ\ÿxþÓÆ Ô.åûó»­.qyÿ㟞Çôâ}ÙAÓ(ˆ·wŸL%9¿¹zuþÉJÃjºÓz †Ù3åçâÑÃl>’C³~ƒaöÄÜûøƒa6/;wxÑ0±p V¾ï—Ò£ ‡Ù|$‡v)Ãa\—c8ÌÇäƚÄa„Ã|–¼{ïÃa.M8Ìæ#9´{èóÀªìK8Œÿ\Âa¶àûοM8Ìæ#94žw ‡yÈnòIÃa¶86ûÎM8Ìæ#94ð¡ü?‡ͳŮÜö|}¢5<Ī[„ÊWᗠøœá—ëÀ'úñÃ/ÚøÕžÃ5{žog/ÙHf8œ+êñÖ-ÚÜxt U‹>NðOÅM·©“säh?ÏÑò‘£=FŽ¶ñ²9ڑ£=ŽöÛ»Fø¼E´Kš‚ÇÈώڑŸ}žüì³Ð-?;ÊgG~ö¹ñ³©Sçùv^øGÆÖ6üñ†ïxl696ås>6þxl>ócó¡ îdØ8ÜPºú×-"'_|ô¡5æ÷—«]^ÿåúü§çÛåq>2Îwwùêö}…$«ÖËÕ͋˗W7W››ßï.__žß³Eý䋏>¾ OÚ¡²yóšJÙl:Æc!›c!›cý—­ÆãOü—Áø¡ý¯;iÿ|Ùþnÿÿe{pòز k}¿ù®||böE†ú¸Úã'1¿>*ôÅï¶ARßóHýmÆò¹Æêtä1ú•¶:4{κ”ö>éúöÕëÛ7MñýóÛ÷œòÃå O1ÆbçwW÷?¼º¼ß|¯cØØ|ö÷„ÚL†C¯~|oぼÇË6HÚëٜ£ýãS0´ÍWä=CžÄg>ŒKtKÅà®ÐG[ñƒÜ¡‡ãâX´¦@tL<º“îä=r'oWñèN>º“îä#.Êѝü0;9º“ĝÌ×;9”ƒûr««þèB>º?°bpt!¯®Åхü¡‡tt!†©ë@]È?]^_ßþ¸é¢\_}ÿÃ}{~zAÕ-7^œùgûë§xqõòåÛ7—OooÚ%y³ùö[ûn‡('åÛ­J®¯|óñ¾¯¬·w/›¿ÝØV?Úkž¸ïw•ž‚Çr endstream endobj 86 0 obj <>stream -]m9œÏ¯÷ht;4£Û67öÑòv´¼}ü±-ocyeáËïï./o¾l‚Ë嗍}^}ûå?¯n¯/»|ñåíÝùÍ÷¯æÑ$÷‰MrŸ3ìï¾HU¾nlÂ>ÿŸ«Woïßn9e~xÿ£ï¬¼ñ˜.¯Û¿leeœ|ñÉì=ß\±¦ÿŒä«Oó((ÏTÆ; -ßnŠGosÚø¼y}yѤ¯»­­Në~‚ ä1g¶.ÅoÿõºÉê Ö°x4Aí”Ì/Ó¹‰)ûÃnv›£Ýæh·9ÚmŽv›ÏÐn£V±Û¨‡Í7G»Í\8ÚmŽv›£ÝæcØm>…@õ‹y¦?c#Ô·ªq êqÖÏX ï»Vÿ(3€÷ËTñ‹ð†c }c›:8ÖÐØ·ìy Í‹ìy ƒ²ßÁŒû}^_Ýÿåüê}ž–ãÝy¼;õ§ëÝy¬?µowç¶\y߯ÍEÊô¡\ÇºS»Íý¾\»[¯ç±æÔ6øD?~¬9u@5§¾úÃóo8qûãç ò³qIªcu½oŽù{§Co ¬ùâ§Íýú?}‚½µù@Þs/Lò¯=?$û~ào_¾|syOGâîòÅV¬ìЎÿŸy¤Ÿ‡°|U£&°/«ò¸ñďªÙ!«f§~øbÓ-¹ùõü)nçmF²¹Äô)&ŸÜÆ#ùñêÅá„úöÇQÜ|D?\¾?Bo2$¼þñ%¨ÏѨñY—šÎG£Æn"Êëk‡¦Õ¨Q£>£Ææ95@ý=´ã4j|®:ô¾¬ÊѨq4jì«Qã3SÍîÏ·´|ŒŠÙË»ó‹ûóë?Ý^mØ,o¸Æø¥^6àÛû«û‹÷Øw¦z'½ý·«ë-R²W¾ùø†¡oÞ¾ús[än1´é'?’ólãšAߝ¿¹üÝÝ忽¼¹Ø\í™}õÑxñËE™}ì‘lgÕÚ&xoGr,v´~õ‹}ùi‹mÁµŽ~vxÇZG¿Ky¼µŽÎ6F„º¿Ý\p¾ÝoÑëåÝí«Í¹>¿üчóXk}Î¥‹~£ÑßÞÞ}÷öºÝ‡dG|œµW¶P)ö\9ú8%W>‘w›ü°£©õÁ»ö‹Ç=¶ù8ö‡ç£pÜIAGnLâGuïq«{Ûl³£ÂwTøŽ -ßQá;*|G…ïñ+|˗Qá;Æ¥ªÊ·q͊ÃSù6ÚQ㛠í¨ñ5¾£ÆwÔø¶êÀák|§þ±è|یdϵ¾áÑi}[Œè¨õ=0ÊO®õýçíí‹ïïÎ7¿ï£Ê·±t}¸5" ÆV ð{žÿq¬x±wêϱŒçÏ äXñbG u û:ÖïØ[6¶üü¾ï³­³xk}lgÃu“¿OyhÿöÝõùÅ?¾<Òíëó‹«ûŸþm Óï›ûŸ®7÷Bè۟ì0ýŽ†y@géqZD·ãq¯.«9´ï¨?o¸”ãÓÇÄÐ?ÁáÑüa‹Œõk…?݀ŸLfþÙÇ·_n¬ çÓÛÆlß\Wš·¿C”SòíÅùBÄÊ7?ucÉèíÝËó‹ËíƶúÑQáÝa,ÛÂ×îùŵåp>ƒª->n|ÏÿçêÕÛ-\[öþG_æ¼q™«Ëëö/[ù&_|ôqñ­ûËUOúD2Ö7W|Ã>S'㧈h}`ÆðLŚ£´w Òpc·÷Ö?< -EŸ¦ò Vâ·ÿz}{s¹` û‡GÑo»ÅöÌGyé(/흼t—>|¾UÞp€òÒãô,`Öû~ÿ|œ0éý_§£Éü#Ôü»»ºÿáÕåu݉9l|»ÿã=õb&áW÷x ïq½O’öz ›3´| -~¶±bþ÷¼9ˆÿd·Í#‹µÝÖz¿÷×çõÕý_ίÞg8ޝǻóã3¸ãݹo+²çwçæ+²çwç¶\y߯ÍEÊôñê|WçáØ¡(û( ýâœðÖâ—ëÀm„c)"½J®Ñã…È{ôÕgy ö[ýÛÖ5¬Mn;È"K¯Î[S——8ÆîOœþ÷¡¿Œ²éù¯Íù"^?€óµïã÷íÓ7ï ;\†Á™TÄ<Žñ*yTïçÜv %>N7c÷½ÆÇé£)òñQ QyLþl²\®<Æã âÛZt{¼'hÿý)äo ‘ýí@>Äp¿9ñ!ŠÚK¶Ý¾³‰é˜6În<´³t Âö£»“h³ýýååÝï®îöÁD²/ë|þÝæk|Íp²±#‡ÇþÛY,W¾ùt¥¸ÞÞ\üõ€¸É£Ûegåĝ|ûì÷Ç}ö ÷™ÿ\ØÙן*Ą•ÊÿÛÝù͛— HìÏ~œö%¢Ú¾‹Ÿ óLÁ"CÛ¹úhѕáȹ¯®¯÷`MöeJ–mÖc¬æ6øD?¾üÓ_ýÁ»ç¿½ya0PDˆòüO·7iMpÕ£S!}ùýÕÍôÁ“?½Ö6øÑ·?½úîöš}a—'__ݽøõwòUûçï?>y;ù¯;ù¦ýóç'!'î̕44ïÌ»¡Ö ±6gy¬.ÒÓÇàóÉßϟôœ¿ÿÔþåÿmüßFúñ$üñä¿þ;yA¿ö×'§Õ§pò8œÔÊYÊ­¡WLŽí_jmäa8‹ÕדFŒõ,Ä!5bgÉÏDߺç -óY ¿.¨PÎâ0P»¹ž•6z××3?¦Øˆ¥µŸJdb<ráVdzÜþUð錿.gC-#¿˜Ïr*JôÖbMƒþúèÇQ?.gcD§ÆÑý>Ú»~¨ †ø×ÓY -nÒ@.4þÏb)üêxǪäÍàÛ< ō¡êØýY­µÙ»¶&Dtgmñ=-UUbû)CÀØdzâyö9Œ^½¦Ê¿Õ6D‚Ã(¤èƬ?߶B‰4OC›ï(kڄ·e%bi[&&&Ò<„(ÄR‹·þ—6GDn/”¡ê»µdn•šÊ¼v¡¶á¼MB›çzòôá=õìÉ˶vªócv•74ídÙƵí­HÛ¸íõ6¹îl¤×<ígjs8kßzú%š¾û´žåwTë€Ë²)wÆ»t  Y…”Î\ÛtB†¬SÕ&(;™ªÌýo´6—)Å$MÖÁñêµCû1RÛuÐ]ÞGë+5ÛúWd¡R>+‘¿£Ì£LI{‡º¢Û.æïcn¿Å«ÒþŠ4*™Ôâ" 5g9ÈD‡öØ{ù>D§ßû¡-Š#r¢E/zžÊ8Œ2û9Ë>ucÛ c–A…Ò¦‡¿wí ¥Àät֎:ÿ¾K2C<)Ķ“Ã8ÊVáù—âYͲƒÚV,r¢]•œ¾6m¥ý6[¿Ÿ•Ö@k¾÷@·:½;fy·mÏ?Öö?υ !备¢£ñí„8§G¨Då)¾1ƒ2 U9@¡ý%¿D¿YªM!¶@›‚1 «iÇ?ðoÑf/¡èYo[R7F½Ž [h;3ÐX„UÐ"4•#÷ªí‘:2OÄ~úäwÑñœþq'¥ÿ=+ٕÖ\ã C¦cÖþíÏì>µ3C‡¨MV{ñäï_µ¯¤ñ<ŽA"1çWú õÏËyˆmÈ&lÖÚdD‹’Æóå1Ó s´¶YÖ®Ò%Ä[ªMwÛ*ÊÆ0='àíef§ÒD;v™§¹š 7Ñ6h¹ Ú¾N8]=5éùÚqB±mVèíHû#ñªÒìçäa«bF1HÑUk¢qû!òƒÔsóÒøþ0xYªkÔÍVÓ ÐøҀÚÖ¬4]r1ê‰uC[ø\q8’˜2ʌÞ:@g+0s –=”¤Ûݍ¾Ê!b6,ç¥Ö¤#·Zµ]Hr['KÅér•ç¦]9EÏ¡§­3€8[Œv4»™ÌÎÇeçòóQÙù ì|LþdÊ+[Þ-"zµçŠu êÙ Ù J¥{÷™’‡4$c'¯¶A¡<'Wb™üÈ1ª\Ùvy°Vâè´ßDP›È§ðè½jË0j1ÈÁ[ÿ±§Ö‹¼Ž¥É¤ÑzáõP{‘TMAqAönJM]uæÝà!·w«ô¢5PTl?=¦‚D¹{ ]k›"«„ÖNUә¤kÜD  di^[ç¹ 4mÓé.äW^¤/mÂHffÚ+EÜÎt…®ƒîÙƪ ÕÄP¼#À§ª‚4q¬™¥ié^¤•u‡ëÁ M*J"B¶ÇzE £NrceÒh;ØÑé ±©ϔÜzãõݳ60ºª ¢Œ»q=—«nÍ8´¿žªüÖÎn]{U˜µ©Tk²bóÏs ª4¿og¶ OÛtm>USnK€SõûFt…E¯kĶ´*Êô¦Ï º!jQ´f&!ñ†l|ÝÕ¨[7¸ìU(ME{/,T Y5hméðnkU·®/~„T[Fm m}Áv e/ì°imÂáIáñNõµÐT[=&ÕA‰cÖ) Ó£‹Eš³Ü1˜„eâ#ú}*úb!-ß_tiÀu˜&kÐ{«]Úfƒn¬FnWš~ÏjÖ3UcsÁ¯56Yu\ãè”ظ;¤’Ð@MŽz§·ìÕ¦úB[<> ´è1¬ö%ëOµ[O8MÓmõòs6Wí6ÈƨúÎj -Sá£-‹^ý´®;Ë¥‚uMSÖFé–ÄÆpځÖíx(jtXl -‰º[š@¢ɤ2èÄNövSº‚sSˆøpµVC.¸Šö 4†?€á^m. J3]„‚¬Æ¡A 6OßÅ…̶&C„z¹®1§¬6"U‘¬fg®ñÂQÏg:ó£KÆ7‹>HV@ú¥®Í@GbPÊç¢âbjʨ6Û6LQDˆåª÷Ä,Ä>F‡&d•V¢‡I.äš Æ&g'¶ ÔrD¼fLJǬæ¤0:ᎄ'Ù²#Qä§Ú¦*~®m6ÁLŵPb²Ï/*ïòĉ¼Ö…Á(B†‹^Mc‹wm9‘F1&Š½{4 ʵåÈòb±"™1’ŠtÅ?S²+A»Ð©VQígΉÖ^m¼@‡ÐNz1{øühÃ¥Ý0 -»æZ‡]4ô×È,(Ĥ‰jjC“ƒÑ¯vp¥µj«ÃoÄvJ”XGDéMÆöfçpl×Sñš%™ò¤³d­XǦЌ*V\ DΣ’M‚ìïvڌÉi`)Eöç˜r†³šUICH¬!µ'éÈȄ™!4ž¢œ}²«¦QX¥êÁ‹Â Yi]Ïs£¦! 5ú¨òJcmPÔl$ÉEä•v1ŽÏ(±,pÊ&7ùA߬Ñ8]¦‹ÆKO)©ä:(ë ÅiÀ› ÅË?_Ðx²Ù™YNb ñŒC±ŒßOh—N £]Ϲˆ·GÂ¡m™A×À{3¿;uù2ĸڽ…I¹k±ˆº;ɑu²Ù~`RnäÆ]lÇ•&«¯„Ügm‚½RºcF¯ú+ŽXð£’éJG³¥$¥šø\I©ÚÙþnL éb87l°brÓ¯ªž]¯ºŠ¹+ rò!0]$H'ýìå -bµ%«‹ -Š¾YM«G¯+•}iEõ,ߕóøÑî5—!EŸ܁A÷øqÔÌUB¢Ù0žÆ„ÇF;:/¤Ð#,r`Ší(9IiŠ¥e»Cù‚{ª¹v(q7«¶IÄÒÔ="– R€ËÆë«1?ºò•©vBûªŠ¹¢Ç -,ÛZ„×;ñ2KÕë’|‚ºŠ$þf¥5 jÀQ®Óïe’)<ŽíXb~k€@ cP›¤+Q9 Ka"‰ý(¨ºDÂ]äv“ÞÍD¤Åƒ$Çbëæ(Ķ#´YÚ'p+ОƒU¡•I^ilÀÊ8±~ ,םٓ ñyÙ~ä5lÄ&Sae91ç$»MѾFˆ`exPò8oä¦y译å\¨dag¿,wEӜÕÐAf€¬ÎZ3gk>Åî€ä±ön‹u~-ˆ¡½Y<ˆ¤_¢Æ¡T‚jzoJvö|±“A-klŒÑíÅ6viÀ‹š¢dÊIK¯²”mßgÕ½½‰mK&ÐÒYÆ ¼È»MGOr1µTT–ò$^TÕKHq—ïbd'Ãsm¥mû‘÷-1¯ -hÐ6ÇÉFäÈ rŠº¿Øca†®Ã}¼d½Æq…4=n -l&â‘zçp[€!4U°1/UÝX :³þ)—Mð:1ìV ¸ˆÉÓ zk›ÆàáCEx%½uôê‚áX éAŽNUòlæ–Fnû6 ¹òLÉ¥V՞[ ðñ—aŒ šãúc$RuêÅaÁã™Z;Úu¦ò/ª¾;ðfÊ®·[ÅÒÄ&¡æ²iÉ´ÅŸ)U/22¸ÔÞ-Xa‚8τØD7Dµ•íV˜1ªfTÓÖý®ïªNÞޔP"êÁiZvq<‹¹é&êôj{IÅ<Ai] -Z!û±{ªèðÝðLÉ¥D\6Èvf=\LNÕü{NUƒÆìì†&«•+i"R=Sr -BC°™Ä ñ¬?=Ó3Õ¸ ÊO®VDv¹ê5 ‡CÌNrYÀ%²fˆ²°!&§lî6] -Y•`z8Õ¾þÿ¥ -ãÊXY³yÀfŠÂ³‡ß&Ì¿?›úçÿúÕW/n¿»<ùêîþÏ79¿ÿáäë»·o~8ùÛííõ¯ÙŸÝðïyò…K.ºà|cÝ®ºø;·ú/O_oœ&ÿ¶1‰1? .|ܐž|‘›Ÿëܓ/žÿ¦ýÔJ,íÏ{X$wæ9wáòÅsêF~ñüËöϤóìcñ$›#~IТ^ß±ª„DŠWJU['™iT.‹‰”[&:3q±™¿o‘WõBFêî ƒÅ3ùˆXFr¥©Mg43[ "m^èylW%­s ãꃽ& JT«¦· 5r ‘òPF“™ì«è tE:oÚ¯VîF b‘DÅäɝ3+-1šcÝ[@^3¸|oÎñFEh+Ÿ‚²,ví_ظ–‡ºôŽ½£;³øíÏtkÔ'ð_Û{µNNpæ¹d˜•ÈÙðìáFÔ¯M].I-S|—£õÐ:£dâÖL ÍäIë5šÑJvçjËAü6ë?÷´÷£fm"{Ä1°o¥j?²j¹»ÌUhPb„Õn°"ûaœ4«Dçt»Ð¬g«@Ï)»°ŽØ,yêpÖ¬µ—ŸY#=أ߀>ƒî Ó ßÓ0訫ìÌwDFb²¸‰nk#rE4D`²Æ‚Hê¨fÍ ‘U„tŽÅ~a"Ìä¼q…<@Ž$‰JìüsŨÅ!!“îg/ÛfQµˆ¥G‡íé*hÁ–Þûn©O#oú[A HÁ¢³³7¾v@֙ÃÀä{Š¡ÂFý&°ƒÝ¾C¿Ô-@b±Ch ”@ÚSiÀžãdÿ7g LŽ„L°L)Ä4¸‚&FØ `Lf‹ZMÖ%õÙƀ½ a]"×b×›Þö:[c°fC_rê§ó`#Ï 8]«0¢iÔ -íF¨Dï³;°¬Ñélëàtqèx_œåCFÄ[–òìÄ\ÜûŠMãKÕÕÑ0oÚHlʖ7ë$¹Æ¡0Ò ¶iT¾¦”“S¡q2@àJûc°9ç zpC]oŠSGtLýD¬pîdM³S>@á1’<í–/Qÿ‰!µ f²Ù5½R0¥Y -ª,êàH+"Rxûh.ñê6b I™ ;k¤ɌnG -fx¦äáH‚;­ÇÑ®¦zäaâr2‹8QÅÀ¯ÂÒßÈM“VÇDÒH¾lBÒ!ªŽW-˜Ú0Z»Èìˆ@(DàFÉÊ“Ä5Š¾b."×Q‹Åc w°î MÓ¨wW4Qš&¼À+̝Å:4F¥?ǎ!jä(í“ruU‰¦€;s?’;¯b/½Q“ð1½[D9'H‚9‚/9§>–Àõ,¸ ­Fõ£g3K‘Gr(ýÜ݋d²Ø·ÈÄQ…aâ'5i"ócIáqãîV›$AE±h&kãvÂ^œÔùzŽþîòí`—¢°†Ái«Ý~Ääßž©°ÈVEiuKtÙÔvTÒd~1CªûeáÜ ža—§Í–ˆ·Õ#Ɉ\фºaqˆ:,6¼Àß0¦W&ñ*O¦—‘ ˜å”DÌY­ >ŠŒBDgCÎUk Ä2æ $„ú°uK‰Õ¼ÝA)Ãh÷J’[T‰.a¶‘¦4 -{Ö®“xÌ,»õ0³UAòj… 9Bè÷1bnª†x ’ª¦Ä RŸð6ù~BÖÉ 0DŽb"x` N´+1Ït…\À•çü¨6ÎvŒ¶í<ˆ>m;,;?o—ÈcÒvX½;blÎ.Ýþf(è/I.U ¸v1'¹!bÎìœq~šžk7Ej9ÑÌÚµƒâ5‹xBµ#U2ZÍÞ¶cN]RÊýõñ¹$‘xœž8dÈ_ªzC׃ì‚HÞ¦+w¾R‚ €cÑ2ép›ži¬"„9^ÐDšê¦|r¬¯X̾Q‰8®Çjâ-܈ƒDv(q40Ø ÖªaIF$š™äÜ`[£žkbIq´¸i2±m?Š?ƒH a¨‡Ïœ‹%y}7t •Ö]ãØ [ʄì3„ßQ–ú/ÇhºML:3ޜqDÎ=X‘TDÖð‰~•àÝfsÐhÄX´?/M’$ ?7ôs2û©•a€h’Že±ŽMöy#W¯“îHA»_ƒ\3TŽ\¡¢yg?kG”azHE⺠cgZm½¡”kd -©'ÑTÒQÍŠåw¨.RL'7˜¡vcè®/önꬷZJŸµª³ZŸÇ)‹U½œu,#çlv9[‹5sìxk6­W Ã*V|7t­Ù¿^šžàUŠd¹xeÒ݊,øìá·?7w؇õ2ÔÍÊEœ^†$±o•“PÈrÝýðE¶ðìdx¨GïèÏýÙÙÇ@m¯)%œ"ñÊÈéFCW ciŽg·Ñ·{©Hzbe×djКIEÉ£I¬â0Á–!ޝ -Uã×í©u£º€Ü'ªUnh&%ÓcC»ƒi×5 gݺ9Qn-ϊ:!þFî˜Å(Î:ðԘJÓ%ê¤áWFÆBsÛ³‡ßî¼ —yÛÎ\(DF_bgˆþ k˜r†Å= ȂBl()uÐ^³l -Á=Ú4s8°uÎy¼ ÁÛ[’…ïÙ‘œ5„±k|u@†Y"¾…V^ßîš³\*/…©wµ¢scŠÙt>¤ùÑÔÆ:êäLL‚N|gLž˜›æ±7D樊쿉; Ä‹4L,T,Ns·ÌåbIb@«l»’ÌcŸn” ¡D³²¹Aˆ¥ Ö*üÏÃÊ*\þu* Š¹Ñ-°†¿>¶š0`xÁɶ¢jڌ'D¨Tœr/þŒ*ú²Ù?KB–‹¡Û`‹J8ÿÉö­¦³¿ÏY»9™•£‚‹ƒ'‘1¡tQDŽÚu}ãÂpMÉaÎ6n1í:ÌBûw¸§-i!s9„˜—ŒÝæhBå®þ‡Ýh¾ø0©!QÂԕ®… ¨ÙÔyIÍZõ£Å aê‹Ǧ…ÛfåQ:éÑZ¨‹ô¦C=™jEVœù%c‹#ö’ý‰˜pvV‚vâhÁ~èó•6³ Nvë,³Íš€-M»#oº±_Ôe´¨^.âÙ›4kh=GULb[¸xâ`|éÁK£E%t¯µ Xi“„{º© -¨;â»åÜ»¸öy¯02)ãà SƒwÅÑcµÅLÐçÈ$š˜`V)ÍGa6ª!¶nö;³[µÌ '±A¨†É—.xxèr?‘Q+X™’3² èÁˆlò;kŒ…U)ðÙÃo~î€åvn*89À¯OUU^)y@=ùwf¿Uò ø'¿–ÅU¥úšæ2g»¢äÙ ±zT±(dvºÐX¦ªD)ü†sÓõsŠ‹ùéÉ©fÙýÍ"‰«Æ¸'9½è´®dE¨À€*£I´˜‡ÑöÎîΕ&›·‰,ŽæÞ;Ë(u»Ã<£‰MfZÞÝt®­åå³ýÅó709帛çó{³³'¬ýRF5Ž¤Áœ¢Ð{’ÚÜÏ@.èW²ÍõFà -+“€Z6jX모6òˆtÙ–¡“­$PµEvÑÚúë¿ö´wCM:I*>Z7ª… Y~üúÛ •„A¢„Fz˜Äòȳ‡^í-Ĉ`›a{1¢¤ø`ŠQB°˜ÆŠ5_ÉLËÈ@Ąp¨ÁR؆^š'‰ ÍN⺐sMT™¿œŒ\ÂämÕ±g=îA®0¶Òq² YnDÄTqáEt¹ÉÎh×l•”ú«á1ÓÀ."[4—06²ÖTJf3æ$÷d›C4<^j„ ¦ -›>‘#Î/Ϭµ«V­gld«Í»²mµTÃÊÆ(Z£/ÇI—Cµý2ÙF¬ ÙâŠVÉ9MÞvˆ„Q˜fT+}%ɕÇb[¹Õ:©Uƒ<¬$Jôˆ¦N8jÙJô¥‰r}Ûë6´˜v 1ò€ÓÇÂlÓœ§8ŽèGuv$Ķ­PÈ:!±Ù„:FQ-vDtO4ˆ‡aÂy™³¢q‚­ý`æÐ^õŸ*®%ƒ(ÍáúÁRrˆ\íÝÁfaÔ%TrCdnŸ-9+LF³¼Ý`°ê2yЭ1L6l -Ä Ä ‡™Âç0¹ÈˉRu¨³„å!RŽV݃–¥¨¶Ð¬0‘3îÛ:ûjç%±ª5Z¥ˆ 'Ÿ¤ÎÓP㈬;àûΪr!ù…«Y’ iþ8Úa@Á¶qp³¦`uà*íÌ7gÄ÷à¨AS묃 -V6)Y5ø!‰²ŽÏcÀæˆ=–„z…]áb.dž´ˆ·jL¬×˜"²Ý ªRHËø`¬Õqzì´µÐ&)_dí–Ø/ÙÑڝ\W+ä á`0{=õ"c&8Â-#!eÈ]pË8ú̪lɜ]ëÓkQŒiRݙ{Va^^žwÄê=Մ³ö1’2ö6RFµÖÁ"!‰< *}Èã„lUÖ`ì%bB.’ / v•ÆÔ'E–gãÀ>™´Õ.M\ÛDÅT0;¬f÷} -«'€ó!MÓbII*1¢ÿXL&¢Y„n%©kÅQÇ~Õ¡°`/I·Òƒ€¸ ªwh,³—ˆ,m­ä„Y2.w÷0 ­\`e¡w=’¬XB}Ög\5ö Ù!ptÔ°"Fð&x_x!ò´®noõøË0ÙdÞÒèríW~èÙujCâ# Ý¥x;M&ʓì\xÄ Û,–x%ÕÕ]dN§Çé´G‰±3YDµz;b?8Ëä  Qd1ç^WCjäUDܳÅGKbcE Gˆ`!¬Uõ1M榓GŒÂRŽE–±ÎqBÎ6mÁu‘Š &":9#‚Š‹âbä˜(“| -*næ^ãŽà8°ÈÙbñùm‡²¡oE·«G'ÒévÎÈ«„ŸïñqªÌ¢Œw‡Ô§ÈFㄊpíÉvÈr !ó#²¾kNb"f«ŠÚëÐN -_j W"FÔ¨V—Ȇ›Ô˪’¬3"æœk9¹ŒÊëœ×;q^,ïjõ%&‚%qq+ÂÜE®öfAR£ô)1,ZÞiÂtöÙE;äútÃ<÷ç…Ù LŽCÈ ¬Ké’d[Zð{«nÇÈ ÈëáL^´[ªÝ³(}H‚¯éS§ºâòfÈ}-ª·Ä•a²ÆÕ®ê¨J"Ž‡'ý‡h‚¾±™A ´¿ð·OöيNGdô&òlWõPk‘ËûàêĹèÖïËä\˜é$•~.‚Û¨ÎîóaÂ~BxàžÎV%{EVXÓô» `¦9¿2r­ò;õl˜4&×>m3˜4Þ%¹¬¾ý¹ÑÞٚ˜§ÿn{sò¹"®=€©)vBÕä&vÃÕè®ÅȚòùNؚÖÄ2tM™ƒð5¥Ë6¥ ;albËQ6߱Ϟµ/ŧ±k`‚kh›ò`¼Mñ?삸 ÇrÌMžÛuS¶Ï.¸›ÀÜySšØ {½Ø}X‚Ëñ71™; pÊYÚ ƒó‹ç¿[aýGν¬Ž8œGέq8é}õZþÿ÷ï?Úњ8‡é_ró=¦ãaúӟޥˆlÜ)çd»ô5ôN»¶ãJÐʧ!).FûDËñ>…Eì„ø)Mì„ù)Mì„ú)GaÜOiaäO´°ûF™5ôO¨×;ࢉŠÒÀ. ²Î;¡€b«ì€*Mì„*o,Пᠧ»âÂ ´† ->»TZØ TÄ«pA!¡-FE˱A¥…ÐAa3YÃŃ9B¨ÐwÂEÓk(¡›—ã„J ;!…bRwÀ -ÅÊ®¡…ÊÎÝ /"ùrÄP#k˜¡`(; †Â’¸n(.°¥È¡¢ƒî„Š’B; ‡J/v•&@Ń0Da.XC…={9Ž¨´ð’(ì€%ڛXŒ&Š&vÀ…N¶Q ,ÆíjäbTQ4±†+ŠÎí€,j:órlQ4±†.ŠõÛ_MÌF¾cçj1ʨœípFÁ—#‚y­aÊƒÐFá­ZŽ7 -#㈣pºí€9*wÄ.¨£½…Ÿ£0Ù®!b€Ë±G¥…]ÐG±N;àb¿-G ÅyÚƒœr …vÀ!…°³)ÔõåX¤ha1)´úðH¡×¯!’âÁ&©=XŽJ -iu9.©ˆÌ “vå|†MŠstR¡ï„O -­}„R4–c”J;¡”Âv°§TZØ©F†5¬R¸Uv@+5s9^iw1ÍKåÁN˜¥èÞj)ì€[*M<€\ -‹L]Ž] -µ{Ž^ -úø¥f/ZŠ` -Í SۑsS<ØÇTšxÉæX¦ ¯¡™âäí€gÚÝA`šÚƒ9ª©=XŽkÚ]e`›vd†núŽ/à‡Z Øüß6 H}¾cHêó”:ˆ“~ñ¼‡“žCŽ¡ õ3 ]ðíìÜÜޜ4íÄbv‰¤^}9$0¬ÂËAqÅí l×Ðr``4±XZØ{ox`tb€`HÑ;@?¼Ýp³Pð ¼ûP]|g8Ónð”ðRyNøMM‚i¶sXakn,Ü,†^éÑ^Ø,F ;@ ÷®Ã }4üðÏV[ƒ¶sÀa<ØrM¬ãÁ°Ãð°­ãÁzØ>˜ƒ¯ØKá‡ÑÀ€ô ˆ±•æ Ä ïCl»tDl–B£9±Ñ—ã‰5@b{°’MìJܗk1,16Ír`b´°4ñ»9‰žÛ¥ðÄÆfŝ -†(–&v)–&€)ƃå@Ÿä× Šñ`°b4±®Ø>,ƃ ‹±.;€cwì[Ü/ÍÅÀÅÆΗC—Z ^lÒɾØÄ¢¥Æh` ‚ërckzclM/2¶&C£…ÀŒ­‰ÅpƦ,4¶NÌ!íÁÔØ,‡5¶&–÷M0ƒ6^°5¸±í¼9¼±=XplâÌâ¸?X rÜE¥Å0Ç&"΁ŽMÎYulM,;6QiwlÐðØøïrÈc“Ôƒ›²0‡=îZÄbàc4±úØn¹9øqè–›䶒À²=˜ƒ ۃ9 ²=X„Œ&Ö íÁb0d´°‡læ€Èö`9$2šXŠlÂÞÙ́‘ûƒ42,G6‘{ úÉ&‹Ï ’A_’Œv€IFk@É&å/‡J61–læpɶÀK“ÑÀd²=XšŒ&Ö`“M\œl§il–ƒ'›F4‡O¶‹”;ç™A(S[ ¢ŒÖ`”'LzŠn5y0‡R~‡1rj©|PÙ¬B*ÿŒ]ïåDw™+wÙr­üŽ/Ž¾ø|ñқÑ=œyV;j¯ñ? oèõðƒº†B€îV1 >G~GK«'t º?˜¡Aۃ9tס—"BO;´† -ÝõëŸÐs;ÁöÈÐS¹†ÝÌð¡ßñÅ*Ã]C‰îf8Ѷ]u·FŠFkXÑÖÑåhѦXÎñ¢íA˜!Fۃ9©¹ËQ£M ŸãF›)p9r´qÔ9v´Ù£GÛFãGOŒe¨ÛAÚnØ9†´=XŒ"Ý[˜áH›¹g1’´Íéb,i[®š´Ùz–ãI£‰¥†Eèƒå¨Òfv™áJw›ÉRdiH’;`K›\;G—6‘y1¾´Iãs„i<ØcÚT¶9Êô&¹Ñ»!M›Ò¶kÚô§åhÓ¶b‹ñ¦mÛ,Fœ6ƒÚrÌi3÷ÍQ§M£YŽ;Ýu¥Uäi;q˱§{Ó+èÓÖòrüikb1µ &Ë1¨»l³…º[™ãP[/æHÔö`ŽE݅µÅhÔ}s,Æ£¶Í1G¤î»f1&µ—9*µ=XŽKã¼†LmcS§XŽNmMÌð©Aß¡M„åÕ֋9J5¬áT÷‹‘ªÍ„´«M¬¡Uۃ¥xÕÝT¶±Ú9fµÉ‹Q«Ñ¸Õf\#WãÁvµ=˜£WۃåøՐHÖ¬íÁb k3/ÏQ¬»Ý¹ãXmŽd‹±¬Í4C³6úÏÚÌ­!®aZã‹P­MêœãZ÷3dk{°ÛM¬¡[ãÁb|kÛ=‹®moÏ1®ñ`”ëÎ_f8×ýÁ*Òµq´åX×Æpçh×ö`9ÞµÝsÄk“Ó—b^ÛÝ4G½¶Ëq¯ûí;C¾¶;u9öµ‰sôkÈ:;à_wqi†€mæØ]SYEÁ~‡åpjV| »?˜¡aÿŒnâšcbw‘s†ŠýŽ/Žžœ<9Ð÷ð°#g7/Ä;úç°£Xݟ«ûCæ‡gþçfþæɇôm>€émæ¨Þö`ŽëýŽ¦¦ÎÍнíÁßû¡”aú`1Æ÷J‡æ8ß½§3¤ïw|1ßÞw'¯"~?øújKk¸ßýÁ ùÛ,ÆþF kèßx0Çÿ6úÜÌ1À{K3t²þÅbp4±†Ž%[÷s4p{°ÜöÉÜڞc‚Ûƒ9*x°Š nô92¸=˜cƒGœ£ƒ?𠧕/–#„§[Žþ΃¢vŽnæHávHc…ƒË&æxáF_ŽŽ&Ö0ÃíÁrÔpÌÝnx0CǃåØá%-E·Ý·?¼Ž¥â8Ë1ÄÑÂbq§Â G¼÷m!’xÔfXâÖòr4qk{Ž'næˆâö`Ž)n½YŽ*nMÌqÅíÁY¼÷f[¼¯Æ ]¼x†/n`ŽÓiæãö`)ʸ50Ç7 |)ÒxßÍ«Xã},‹ÑÆ»v0÷8Xã8½DwÀï£YŒ:n›ãŽOÖ`yÜ,Ç·½6Gïføã¶Ï—#[Ë1ÈM¼™£÷KqÈM†\ŽDÞÅй‰¸s4òþ`†G>‘œ,[{\y0Ç$·ËQÉM֚ã’Ûƒ92yÿb†Mn·÷rtò.BÌðÉMè˜!”wú £ÐJy ïOvC*·&æXå&éÍÑÊíÁr¼r“ôfˆåF_ŒYޅËj¹=˜ã–Ûp–#—£‰5ìr{°½Üdù9~¹=XŽ`nk?Ç0ŸïÙ6úŽ¹mé…Hæý Í°Ìñ`Žfnô9ž¹=˜#š÷3LówØ1VkÈæýÁ Ûügìݘ³†pþ~ÙiŽr~t‰¬'·M±ï3ÅvWOùùéܖÜ®Š,ÿàz¯`ÙñÕ¼{þۛßþôê»Ûký÷¯/¿¿ºQʯ¾¾~{yò»ëÛ/ï~ý„ŒõlªÛþK†ä)¸wPCòÈZ"Y‘‹"zS‰½@ïÁøþûùò»,ü˜º0qÀA@Õ@ʊ“€]§“(ˆEމÑ呃‡}Ê{)qãÁ×j[r˜ ÿ wcQÜÇ&hJjÿƒíþï'ß=<ë¿:%T¾±Ñ_÷÷õ×_]\¼}õ×ÛûszwrÚþÝV¨MóY¦ Lºãˊ&(òNº%¿ò¶Éõ'?¶N»’µTôI*'¾b²—д ?PÀ`Ú ÑîÚó‘*Ž¼µ›L UctlÎ}JßW*3L<7F/@D„iŒˆE¬O®oDŠüã2yW"ScÒÔH"Žh•ŠÀrf[Q™FšÃ­… -WNT§Rªkׇ'Ógdœ;Ô8IdÐ$þq®oJaü5à1ý ›# ¾Z/$e0qÐìþù´ôd¤êäƒà;DÍGmDo•„¢F(R$ÏDR—3Æéƒêù4¨‚½¦G›L2}TKU-"4==R¹H-(ÀÂtÁ¤P\$w€"l’,ëؤ0*#Rõ’~ °l„ƒÄ ð‘Š~ -Ĝ0HÙjʟt;ew8W¯n P´ÆT¾à ™ë܃­Š~,)DSÂ3&]‘ú˜E­y5º*ÞîAªªRǸ¼Â)ŸX©ÿ©ºm ^¥úöĞ#cÔ']„F)°‘‰qˆm°fd¥Œ]h/UðÝj¨U*.qZo½cͪRh—ìÂ6®<°ÄZÙ`K ¸É ”»îte-.Z…ÀášÊ§P+|& nÀgYN^’ÒåȪŒ~Lâ])/ÕÆåÚSVÁâ -ܱvÐøð w(ƒLLøÈœä铗s:wò›?ÜÜ·»¨Ý$'·¯^ß¾½yqòæ‡óח'¯n_\N¸ÜÛ'¿úËíõ?ÎO¾¹½?iòÆýå]c‚ÄÖ½1xúïy“K×b ÿçäõ½•GvŒ£â -« I¦—6Ž"³.l\æœ6nÔ£KùI¤;·:Yž [¨mÑ U։ËùÉQ¡ô#ÙÆKý ¤± }Ì06ï)WU¹²Œbº‘:[ûqÊUŠØqÊ6żÅ&±JYn€„á¼½«)qlLk⤨e*9Yo²)´£xñäwï¸Ä¨0Ni|x£;쿟lïc>å¢ÝrpØ'qw^NFÐ€Ï i’ŒÛ…âJlªV¦'D.*è¼ÎÈH¦7XÖs…©º°›¬I ò -)J:£… z¸_5 -G64V¸F’[% ½]ÓH€t)ëJøbdH!ùQˆ^j‰1 ¨Ü8ÀA¦+%·!­TNõ¢ íÅ^~ª@»¬dÑN¤ô0\<ŠK0½ºbO¶q‘ÄO¹Tñ0²u¨©6Á=Šc%^®I‰¤q1w’ ãbt(½¹3eiÒQsc~h7®ìS ;º¢YÛ£”Æe±a¬’VÂ£Ò n"2ˆ -Æ¡>«WÆvI%±X‹üü (\ì ¿Sq%µ èÞ¤‘Ø)èFMV‹o‹§›+®½Ò›WÌi¼²º « 7fé,¾¾8¹ÖÚ*äÉ͛‚ŽïKÛÎ̌4 6)´OüŠ×ëé“o?kz°mÜ,óŽ@ &8«ˆ+¥8Þ7<ºTµˆŒŒ•&…ëI{o –cå02¿oÓPQ¨ðC ®dÀێ£Øqdé² ‰O*’±Æ ¨0|)èM1R¥œ"àN#xè !”$)qþTrW ©Aª²± Ä'働ŽN7›šøfæ#Ïj ý$¿HÚWø:݃H¤N*oÑ®|ÚH¾QÏʇšw¶älTI |¥dI&£ƒ€èbל³Ý$pݘ¤d9šùN%C Bãª܌kúój’j%"±Cö;_|¸#3ˆÎ¢;2äÈTˆâ.šTAɤÅ3-){Vn@*·v¡’´fmŽ£ -–Ax«q…]=ˆ‚×J[9À±¥ -û¦Hñ•Ãc£Z‚“J ÅY­"5ÄUEÀ‹\…¹‰Ž‘á®]ÕÞ­IPRø¾µähÒFX@¯YduݑŽ)ÎrsI‹Rõ—T)4V¼ Lñ…¬°i&Ár_E«¦Ïçò0«næUuáÃR+PÑUÀjÚDQL`BiÓO9 |àõ £J ¨B°¶´I‘BCªz‘oƒ”š#5°÷Î:}L¶_\€5°Í Vd>eL– ùÝ,•Ý8€xKJ¥“£Â1uŠ¹ò#XÁ¡RuŠMz<U.+:ŽZªµÝœ¸£ Ĭ*EâäÆ×Ädàwë[ðâɛ´½Ie))t ››0ْYgÔ᪖9 ãBÑÐ"Gö'±X¨Ž.jŽ“:rL.£ZqTˆ¤AG‘œTËd>Ì[þ,w3íñƒŸÅ5¾Ö‘§EæaËdQ!"snÛV/IÄéA¼Äl]É£ð¸˜a²!üÈãY9'™;|†!)K<ÛF¡¿Óå%o YᗘÀnÜÉä«reRày6áD¶W¸]$[@OÕxC…1ä7Aé¢BˆQ€!&reÐBÀÙä®ü*kÙÌj AT8g¨pÛ$J‘ÈìÊ®Q -B1`{Ç`™ä nIv/ɳfË£ªbU´~B?O¢ÉÇB•"©²!4wNL£6 Eâ¯[k­D30¤QâeÀ®Sò'ýŠ†¨<ìì ¥^&k Å,å‚µÃ¥Ê u”V‰…ia‘¤ÕPÛÍ¢õa›T¥!»è Äh¿"j_Œ0qp9â4šŽŠÂ:ýҍ–¦•¹»~z"Mˆ’ñ ‚ÊÚz:eõ’FýO´k³`rq8š~jhÊd´‰‰ -y´9h‡YW¡tUˆ¤9¹]«3£3™bTI ©cž¤W5> b'"'6¢ \ÀU!î³\-öÈ÷¹¦hC¹Z‚³2»£ °¢8ÂOD<˜áŒx«ÌjpP†¾Ü~@°~ÖbûÿTc:‹!}¹UK°-ÏW_…ÄݬûÅ9½Ši`IϧLIö‹ê)„$©•öûB{0ŠPJ¹jcº©F6€aóȚjÉ0X<²6$´+zÜ -öç`å7èªvz¾œG\)±òc$M(V¶(72 -(†T.]!²b=f”;w£¡@s}6q§°Ý&*+&HÊANt)K;›‘ÔÊñ–¢s¨©†ëLƒó^€Û…‰Õ›p&#œ«å ð¼™vœ|_QĀ‡Õ²I¦R ‹N= >p!nÕKQوò3á])“%¢BQCN€W™³(è@H(k)×RѹÌbFz“šÑZ·´øn O,†%ß«CJæ` ÷&€Xµ{8º‚SX• •™£qèŒ"aŽÔhæý$Ÿ«¤L‚ðc§U*§]0*¹ž©âU³!Æʟÿ¤&~.±ÙԆ"¨ÚW6b{–¶"Îâ(ëÌjºq#:$Îù¶£<Î}„ZáH1³J]°ãl„\¯QåÞ6 Äñ'½šÊ´ƒGêõGé*²7£b0—y €­EsðþX±â÷D‹‰Õ‰c@mê8J°£¹æ”¡iIuž¤XY¢òò­ª.›KdOõúÏ(mzØBÖ啾Ë÷±Xk]†¨Ô.Ò í8yD¬â9þ˜À°Ø†Nnð³AD*Ò²DÿL 'å~sf™%àÀv:v¥¾ù fÚ-©–TCçċKœˆuDí\L4WìkŠsÞeWG û¤ AV Ý 'ášä*ÂíJOu㐤˜*¿ªª!1 ú•‹Ö C:'òU­ÙÑNrbõ¦Ç5%Œµj÷~Š,A ^ž EÖTˆÁ EU¡›Zc0õ]X1÷Eë-À¬¼C²ÀjP=é3uR¨ -"Át¬îF N€P3@¥å{þ%$ÞTÀKµ.gû*Œ‡í‘ˆj’ÿP;Œ°"¥4_ -r%Àe4JäwÒ²•rÄ5ښdP V²€hÄ)ª»#%}£ Wæ¢fč"IY´§ª ªI€¤e-Ì«ÝäõE¥-"z¤âÄ ÐI*ꡛ)F)C-Wx1Ž:Jd9õJ -¶©Ô+(âbš:Â0ª'ÕÒ;ä÷¡8¨$ýTݐðî-ÆöÜ÷jÜ¢GjibªW±Y÷G6cÑ%s(´2<…’xgq•iÀ›žâÍRœä)šªû®–úYXBçhvéü¾‚‹XQ -OÑt0Fí–릘,ãíÍA±Eœ«jW™–ñqƒsH¦–°ÁTd¼Œºa*¼f¸'o(æHtVÄÔ’pÅ«6؝ï͖—Š@1 -LŽS0¨^#aÄià-þ§·Ê>æßãÀWzqˆœÅ—<ºaÑ„ëTT´¼Š0Ý·‰*Æ{H(qO8¯ª\PÄÊÀZºrR/Tmßxp£”K•UW;­àäMHpžÁ”0»ì £úƒvÖ]PÀlò>»!B=’]#8hjrÿ}â+ì=ذ¨±½üþêÍý7ú·Ÿ^«íȝüæëÛÛë•7{sþÝõåïß^½¸|#o…õæ~û¯×·w÷½¡m#Ÿ^ß¾}±ƒ(æ(WH"B´!œ¾D<¢ÉS$1µ]DQÍuø@à (hì¹‚ÍéÙ¬vljþÎ ¥µ¬ù÷Ø]Öì3ª´GÂ{»ø¤ûLµð­óQk‰’ÛƒKô4¢óZ¸iFgEÒnþ"L…²G$9¬kBÖY¼¹bM{“üÆÌQ}툠@ 9÷Nñ˜Ñ£&]”èG­Fq’Z'XÈDQä R\éÇò–Nk‘Êò11«E¨1&5˜Bԃ¢vOÒù9ª’ˆêÇBCVûƒ4@Þ ’ -Ô/s ¾!Ž ú}ÇøcD.™2P 6)~4"éÞ£=ÿ>€’*CRoH>'ßVõêðw -ß~Þ!]nT¼^YŠô:aÿ ¤ÿ¶3rí‘MBgE94†™¨‰ÌÁ dìa;m NÚãP 9 P8ÆÀäwEìr´Æ¬4AÊ¥r„Έ’ ¢ÐíÎS•¦A](AŠ$;bg².mçqð¼ô` ) ;Ñ቏“À—ªÛ˜b¬½NŒ¹ÁèÇÄ©I> 傎µU遁a;²ˆðp0‡)²ôÀ\Kf…®(ÎÎçɶÏߗ$yÙây*!¢R»e …~ÊaZ•¢*î7P$…щ¤pÊm!5I¤ñ©}ñºpµµ@Ó"ìrÃèåfgK -2¨ƋmBF€àvψNÌÁÒR—œÑ²Gý^ƒ'½e4圢ÍÓÂfRZáQ -®PD'2$Gñ:ÉÈ0GqeDֹȇÅütÇ,€âqµ<@RJ¿“kÛ£N®¨S‰ªk"Ý%Âiä6%D­cüêú#ׇ¨Ôkñ}Òo²QÔm!°[,>F b¤í&Þ -6â 煋Hv -ëÖt³¬'²DՉB ÜÁÊò++U#x E°3qÐâæ…W£¥lf&Z¤D-G½ªÁ Š¦<ÖV³…%~“L°âfeÉ<©¬^»0;¬ÆFV.^Â1f8Däå̜NEŒ!ZsÓ¨[• `_$<Ò 9ÊÍ©¡šn­&f1àkÄ&Îk¥§.4¹ôšZ^¤Õh—)Őq!FΪQHªŠDÌee)WF‚uˆ£s ô@↉û³€+¡¬óT}í"ѺBáÙb8Þ¶f‘›ðóãÉ‘Q¾mý?Ö{$†ƒ…9€ï/VyHrf ڍ½°¤”ÏâG͟e':H`‡£3“¬W”S‚GÑð½,.a‹´IŒ•’©=Kԑeczƒ“{èZâR ¢‡R¥Dª…-AÕO7 Å(³v$ǖLjœUÈbx’¼d÷Ï{ßڍÚ,:A¬$1<©Q—o ù}µB±Ê^«}®åSŠ†ˆã¥lq "Á6Ueƒ -GĊ¨ØÈV؅x4É4¯Qg|JÃèÆP¡ô °šPú4;¢È 0Êa“P#R<8o‘˹l^u:Ÿ,c´ß`ÿmÃf¤AÕ⠵ƪâùʙè6ßè5[«dÐJK–%çÈÚ´/Gú,iÍÁ‰@TlDÊ_—˜5’"±E&-ÕW4늈Á!co¤hL9Œ;Ï-iÀI~6ß½’^EåëZ…âZôûAîX>Ï × r7‡¯s!$ÒW ™£ê¬¬ÃˆÇŽ*!£¹HçœÓÛ\@úªãh‰QÃÐÔèJg0Ž¿òÁN@#S…#2¼I©¬Ù$¯3¨È΀‡9}%j`’ã遣¥2¤zâdŽ‹:P SPæD0ˆ¬y…’˜·€pg1³pÕ8T úãèdыøŒ«œ\gï”È*ÔÓ»¿V––ç§ø^ -¡ÐZ®8" 8¤6=Sq´IµjlH…/‰k F“Ò"@Ý5‚¸³ZM›|ò#KÜus·¦Æ$ Åùh‘…÷&¥ýhaa -‰“€øö×ÅK@E|/úÐ@‰ó‚'u*µ¨£äÒuoÅÔrÊ— 5ë¡Qµ5 RÈ7°˜3F‰#8åێŒE(rLžá ä"˜Q§lr -˜9<@®nâ,Q¡%‰®DY2^ƒ,!'Pà°$’ #H-z“½XÜWÜbJ«8ÞZ‡ž,5êl1Ó¢KÐ~3µŸo ®ÝÅÛX´­&e‘ô¡Z»—ª2¬ÖdnՑ† ú"Ý+QL'd¿ˆv ŠÎšÊNٔ6É< IÕ„¬ð†“)/¶A;äבb#8_j¢^a0/–ëYì?V_$7HÔ®S6¹Õ -†ÃÆm‘tG½ÒxmvøË»¢­ðP%ö–ˆêJ¥(å#ì–ìÀÖsNq-ÆîSy±rx¤Ó;ù|TK=Í „rFï šPªº*‡T‰²DoYEÕvýH~6›TԯΒý):%P·q¥@k%#…PkMŒ ù ¬y –2ÉϝY×¸·(J$5@ Xî"ÒA¢ŒÑ%+Fe‘ ˲Óت+ˆR˄ïb…é" FK0 „, mvqĒýTU Ÿ±3]*N;eÍ6(OãOR†Ñ64h>Cašຬ€ÅA}êÿà„BA7J -ö+=€+G9.2Ò ótHay2Žªt@2—†fÑè%Ž˜‰”r >1˜Ú¶Ýb ¤#k±FRõ$f‘‡Ç*EFl\"­D«*R$¬Éù,ÅËùs{²³Ú{ˆ r,-ýRµ¨‡(KYu-䥈ýÅՅN9@r|IøG«¨à$&‡ /9À"Jd¯—"†‹<>r,†*AÂ!òäXd< ªÝ)GvÕÄZјä–:å@y#v†ä-¢Óøžg/õs(øgˆ¢ü.=读F+Å -Ö “$%ŸdÕ¤ªªNÅ9I,§¾›GW ™ŽØFfæQÊ*HzDÔN­iä;XOÕïïÎß¼™UËxû!jflê½bo‰¥ÈGÀ$¯øFám¢v -Á#—©“\O2%ížÂè* b•“1i âÃ/BöC­³KâÒ"â(õ8¹ŒXí¹‘yZSÄê(¹ÄÉ%ü¯©$ƒÉf ˜eßï)e5]<6'b,U7-år‚àEZˆØ}é,™Nï •`C0ÌÈRT’ÈÁ§ùØþA÷OŽ4Eˆ£©Xܵ*E>)ÞXkU4 :GŽtD.e%¨hÆiƒ"Mü#K¡\ -Ú-lH§Pâ‰Ë~К½ÄvÅâÈ­À(”:>Hé̔4D|ÚQjvÈ‹µÔø -!הO(äˆTar-ˆŠÏº´ -Ì^Eª)¢¡µ$’{^ŽcŒb-R)™ç¥jȯ–`”﫬«SÃ!Û·8I¸Z¹íM ³§Ä9š")?›z"æz2úå®HnQ v©÷£¡š߀T‘Bf€ZMR–‚ª¼†TüA -‡ Á$V†2™œæk` #é¥ so)fR@UI=áë˜%§$óâ²s³ÅšÔŸ•(&W6Æu”êºHdC›.¸xè¼d‰Ð˜IqE ïõœ@-Ö.Î%G`Žâ\ºÖ‚Ä‹Ta‚ON*Bƒ FuŽÓÖV,ÒRՉLAÐÒc†)Ÿ=âRã˜@¶óP¨0r£³Æ¯kèˆ~ÀÌ°×Cn'ªã"e3)Tâ¹%D zÊÄÐP5Y“œj1$•^kÀ“Ñ*«¡J”d"5I)˜ÂKEkTGüˆ:ä·#{vµ¸ªF-¢ò‹~öäåzN÷´Ð*dÅâ¸Ñ/žÓ^õ€® ®+Ö[ -sáÄy©ÚÅѤâY`]'@בàU°Ð(Å±È ÄÞa–LÅFÅÛ^ƒ,«Õ#&~¤v#v]YýdúyÏ:#‰¹êK .aR–EQMt4½ŠA^Š¯Õ!$r_̸!”’×0Å4ªÛ*šßCk”XE€Hž•(j_FP#ÅÕQLì㙬`P\sœV1MVTJæNHÔg£ ï¼&eNu"nªV%òH@#ɨ’)@¢+Ùô˜YâÅÕS£!Ö²_²u±KOgó<[Éð"Î>n¢’m¹ú•%%[·srV‰ƒ¬‚‘kiQÓЛh'‚©§ã À©AŽ~:RZŽmd#ó -÷9²„¾JA-¶â ©lª0b"Aݔ,nðSÎÔ¥LeÉrå£Ü!…JbÜ*ÓQT$„®ðsŠRŒZS„=¨5W´B–TKW‡¬“èõéJ“¶á½œ¥,eâ´ rHÉÕIF4¯¾“„À&JÚ݂•—£1òê@¢e¹’z¬åS{ôwÕôBdärECk¶·%áëQç™RÆAÓ%iƒÁúõåhîE3$€.y±N$Íby!(8jZæ «F9F ¢>8Ù -ä^ ·pa­4¼J¡²ZÁD°!*»f«°Î™A"¯·³oRÑ+‡”2>ºä5¸“²q„—–„¦dß{E¤e1Äñ†ÍYt]'ºåŠDáÚ=âx?hõ" (IO±ùõ ˆx¡N¨ù…B‰48—"âÅK=ãNòêÅ16‡kÎ[yJꅓ#²Â8Š©–’•ÑÁŠÌ-PŽŸ¸¶¹]„3¢2=§f:*\(oÓÝùÉEÙß\õ'+kPp’ʤÄKu¡oOJ.Ò Ã"©9"—©%Ž„ùAr™ -@½nw¸s¶ë(°R#'´qaP?¢~¹åâ\6ûâ9…ÎN‹­2ÒÔJØèæzô¢Ñ‚ÑÎbÑÎBÑÎ"Ñ®ÑÎâЮÂÐ΢Ð΂Ð6bÐÆBÐÎ"ÐÎÐÎâÏÎÂÏ6¢Ï6‚ÏbÏ®BÏÎ"Ï6ÏâήÂή¢Î®‚ÎÎbÎ6BÎ6"ÎÎήâÍÎÂÍ΢ͮ‚Í6bÍÎBÍÎ"ÍÎ͟V| ­>çܘª9H 蕒ÕQìGÔʗ¾ø‘wÕ+ -8Ύ‰^ŠGSfÀ?ÓEFçç©6Ð¬UgˆØþ¿ßz¿¨¼,=Pˆ –A(Mû•Ruóc˜DÌR"•†•(8ç´7¢r\"ë± -p,‹¤ÖÁÊ(P܏Â/½^žj”šb³“U5ýÿì}‰bŵíûÿƒäL@¸º«G¸ Á`°±!„BdY¶Œ$'7|ýë5ìê>’ &!ä7\©Ô§Nu »ö¸VêâËÄ@˜#é<ë æ7s*)8äçW£„GC—¢0c:0|¶hhtÍ7öŸˆPÔÁ:;âÉ á”|Ą œÓ#ðÐ *¿ ·=Êâ8´®Ô%VÇ·üt%.:‚Ûétu]Ä -²¼é§ûõ"Nz‡¤¹é÷ÜlÝõÙnÔEI£B߽੅|ã”Nd§Êx<¬•ºêéuµ¢€5žm#CÎÂFEãtEĽA˜5‘¨´)ž3ž•êÉ›{íÐ՘³¡÷‚2ÚSÙén®}Éè͔I=[I hTͷ勏*‘š—³¡*wËÃWKÖrꢹN’€¹,z V…)бÜm#AP‹Ö(¾mZZ«HNd@cÕE¯*çh+…¨ÅêÓu°W](nwL:@ã÷Ê9nƮҴ´Tô¯úlD²‘ž¢ËfOã"W'| ªQ'åsŽÊÓÔ瑗ÕæÆôRl¬Ä•3s `PPtêÆfƒ),5ê\F–¢ž6Œ‚û¼ï}TÔ …VTF¤¡g ^BhÖ `PV3¤ñ0wUsÆ8X º×ÙñQ?‘ۙŒNJ!{kêSƽnvÏ®5ÚÚ¦¾jéTgôqêÎ%Ž›^J–·j4 pŠªÖ ˜©j¹âÏD®Ìs4Ñ$r/{·9CÞË4Ä&ÒÎb±s‚h%1£²"ʗ2€L±…þš¬ÌG‡ý¯$FR"¨ÑõäØþJ܀©8ŸÐZ L:¸¾r˜Áy.æë¦åÏLK ‹P*EøÕ­ÏR%öOŠ91eÖCÀ*s¬raá" ØŒ`´À¯J56¦£-k¸6:ÓǁҁX\Q °-•[Šà«•˜¢5=W{ÃJ Wck‰žT\À—ªk+ÉtäDµ[p”àŽ -éÏò.݉šhuöÍĤšÒœ“óÀ*qóFsãN*¥µøUZá¶DY“½8•ó}ª:„½Ymr/å#äºé=Ñ< ђ½Q·ýòÛHa䫗PËR@úžISÐ9²îÇLzZÜ4”VÒDöaÝEЅ0,a©ùµu¸Ø"»Èœð¡XM·u»æPH†À´Æ¾³’=M½Èœ×¨Á1­†?°É¢¯”°Êu°N,‡Y9í¾ê†ø¼ïr‚)OONç1:-·Ÿ8–S‚1­nÒ¡ ÝrR^-rSX`ÝßGÓÂB%©×áyl¨0ü#M±ðRŽ²E “8«–}í~Cê}Ì©âåú}§Íße¦½ªmz°N¹q™(ѓu¸á¾æÙæj'žŠ[Ѭë½ëTƒ^še‘| ÅFÌQ†ÏN†!l ëdp[ ž.ˆCç›Í:Né»Ý-¾ƒZZ¡gÝò¦3gçªöhÆô ²zË ”»Úïݖd=V©b~¼´Â\þJܮ؇½Ì´1ràSÒtd]¡Cxe¨ ÀB86uЗHw'£\!»rxƒµhÕp5ô¹ñótÈ÷֑Fq´£œ­Õ?HÑ5Ä9ªgN'@ÍïCc“RøOlN=ËmµA§F%6šàºÙPÄ@%¥(3³]7†R]™#¼8kÆÆ.ðºQþ!åk¨Lä¬Ò(·´‘;¯†§â-TùXߊ)‰Xæ}.[ëpˤH e…mqN q­ƒsuËÍó ˜Åß6ö26³¢¨ÑlôWpv¡–¹ŒMÐ Ðcʙ¼7áöq$•nº¦µþÑ)™èªè-—ɳW [©Þ¡úl–K¢zH!ˆQ_ëDpPQôœsÀA UÐn0}4W­ÇŒƒ¤z%PÍY ëî9‡¢1!ê›\>äØ ƒÂ£#ÀÁÒ>E•/îÆØ%@Ñ?§ï A{ÑÔÅÍ ç}(%ÈVÏÁyØ ñkT ëLÛT«hʐåfa°Åý`ó¾‚ -Q±ÛÁ±r#/¨zVB5h­­ïÂmY3!™e®VC  0Ý`¨Ýó,Ô>Ö»’rª±© ~ªÝvVv8²‰c‚æTŸ5J1[(‹—¿J#H¾ºxdÕA¤å•ý½·¢¹íŒ—u¸(‹‚MŒWG¶=­fÎÓDz›áA ‹¯©ÈR¦Kðµh¶> \ð³¸!‡ÁƙpÓùñ®³¯©”n“b­‰T™ ¥K«¬œ!p‹PHקÞþ_êåÚ!¼‚ !ÓK†à:€r›Â/›œýâˆF‚°5.“Š„ ™lڃ¤i-|ƒ,|='Œ m^Cǃá‚øÜ,ÿîÚÊ!¢@Ò–…³Ú1à*W`¤‰ä*ÔZG£æ<à»h±fιeW– aYƒ¤+ÜÜޛÄ“½ -¡þ$ÔùË;Ì7˜j*îW–ã)ËÞ9¬ž®L0˜œ 6*¹Á„Ö -¢÷uÌ˨€Œâ„CUm´c•ò:Ro³’›s$sج•nmàM-By–¨‘5| -8]+úƒ8Çï'?<¥Ó(WßO‰Tó>"C9ø‚èÖ»p,×:²»ã‘îkn$nÁj£TÑ"ÔtšÔ³*~8ØÒöä`±ä n ·D l;’û°xäšëãÚŒµOñÑe‡jM‘ÊL£4Xsø•à‹­K+é™àç/P衶R Ûv^©£Íb,šãóµò5Õ©hç9V£™02‘ìåµ¥z1šË¬'Ò1˺—ëÄ©å©sL¹ËÞÁõÌOB_¯ÓБå`j‡^1OΔïÝJº¤&Ð Mܬöî 龟+i;uš -'roüy­`/¤YËo‡gk…„úù`¶Hõ0_ë2‚*ÂGHûÏV¦Ñœ•èD¬FÉè±Y´óyΏϑW…|ðà €¥1kÁøÅëڕxEå·Ï62[mR`ESKϼ.ò^ðj#8¡eÍœµ“9ˆ0eÒJ*«–,D®‚ý…™ýʖW` ‘woº¦°v×fÍd¿¤TK­B”žý"UxjŒ+›¦ñ€d©ªšb¼¶jJ$hu;åL@«°[ Ý¥¨7U I -ºÑÞã½Ð+Ù[c%ƒ»•¸Ú¢ٝfêkh̵} (ÿµµÆJ}_ë05:J-ÐT”wnqÃ~nÚÖÀÝ,¢¨:É« -Ø*ôz8û*é -Ød¶ ›Ædsè²E¡x™ Ç¥Jr¦3*«`$áµ+ÿ:ŠQƒ¡ï<ê4„'nrÂ[‹"Ô-捹_¢–äl—_”ȹåÍ Û€g$!ñˆ«Åº™qž×ë$‘n(mk4:z›µµAÐ]-\'…PÍÎ"·<Ú¼Ýø`öƒäÒçå^ðkUQ'‚ß1P6›&Î@ÓàR9÷ÚsÆn¦¼Ñ(ºBÒ£!°Å僳2±•7g0°I-søpÇÞØêi÷äŒcT"qFbu¦ËUtF™v0ÇðÕb/~ÎÑÞ šyºäÍ©E-¤; ®—¾jwÁÿ‚Sê«&X¸£Ú€ c< kÊ1w­ßtwUv¶¢µ 7«q¦~áâk-Aâ–ëi(FZ—O¹N ݜÊÀÚI)¬ÒìSãXt7J§ª¤*`>£ˆ¯¼ùÙhÕƇœ¦YädU[(ё°3Œnd˜WsÛ+׈Ͷ Áa’›€€S &u!\€Y¶ý´ƒ£†$¦êb֗+Ə@Ø2CÐ<ݏÑ싗z j¾zr«3ª­&u<‘ú®XPBTمšG]h¬²ðB@²ÜFܕÌ#­šc'5]¸ì–{Á®)Ò¦Æ 4E3„ÿVÉೝ$âl.€BL÷}òI\·¸eª‚Žh0QôŽGt †n²†Ê5˜*µDn• -1ô–›ëšyK‡v}WšSOã*Rkƒ½Å¥Ù67ÄG$_àï#€[^¯2io4bÒsLo QB=¸ þV4+î„f˜³Ñ܌ñ"w™Ù“.5óXÅdbÆ)=’ZjÙU øR$µ i¤Ê˜< "cEä¸lŽª €UÈ2%ÕØ(u& |§ÖŤúxe,oDFޖI…)itÛ`þŽOI“#ñ }ƒØ’¢…(të|v+ÒäºÖý\;¬Y9“̨bsÖ}I¿©u¾PPV—t®Þx¸u VVË^*$ËÕ)mÕô†XDSRU¶©ô¤Q¡+Žy^Ù¹²P’'G;Di¯‚øŠ4±çØ0é$#ÒHYE¦‹’*c®lçwHŽ-†ÿ Y}“áSëj*Ó!õª6Tl´ª‚pÐÙ38¾Uš0âšK)o@ Y…úÀ&q'€z -O$yƒ”…|{̘Jݜ¬Ø¤ÆþºlYHûÉá26Óͤ9?©¸`ò‚˜ªç 0«ô¼oB 刪v‘É;ª‚‘1_!D²2L]10Öü*uÈ8ä`*Iu(5 CZT^U(áŒÉ+#vúP¦¹~hHÞB:´B’¢äñ{å$E zæK*—ÕñúÔϘz‰_5g¾ö²ÇÀR[G΄›Gbp),Ÿ¾sCѨiíf hNFcïïÕæ¨j§¯$,썳¥;•vSG “±T飬ä`È×í\ÝNJífšGå³1Sˆ®ÅD½«û° «½çp0£9§GéYj«ÖžTÆR‰S™PӍ<ˆTn[€eŒ‹¦q -Aý“Å«ûÔAÚ6Îr@ m1¶Ã*µpÐF97\6*,ƒ§{Œ×Â>®¢FŠJ» üµ.°Êd©mU¡®Hu§qC (r/a/š‡Ê*dïÅAm -C’N£ÆZ³6Á³Pðu„íR¤ r-A‘-¥°'¸`k1õ¡ji]]‘œññ¼¨cÇ±¹Í­Ÿ5=zUÍ3Fp•XÒÏbÿ>ýÓÅËîo¯]><¾½góøñڕçG×>=8Ø}…P‰ÓbüáΙ ©™öÆ$ÅÒôϐò´úO¥¿¤I;™ñõnLÝÕ:Õצ;­9s¡ZÃõ”žMê0³™s0_sÛ¾ÆxžAÂp -&û7 ëµß€¬²þ Èú7 ë߀¬²þ Èú¿Èúã3Õ¤í쯵]ól½ç ÿ¡¤Yw·¬ÝØ=øÛöá æ¬÷òÅѾ+zE°}Qüĸ÷ž›Í™Mn º/s„+2Ø+hU›Ó›%E¤^Û¢ï YI¤C~^¯K°6×:ý퓱¡ZohÜÔLÙ --=ê¸dë^Ñ!ˆ·Þ<àb}ÇPTÀN»d"JܷΪ\g¦Æ¶Ô4g¬Ê¥Ž(’å¢ˋ>3?pƒìÜ}Õ8Ÿ+ÊÜàFTüe„lNAc‡,¡>˜0k»Jk•ïL¢%GB:oäšd’t¥X,È®gs.ö¦uY-{Ä=°$HÇwE ©!wj§qñ¤mÙ-k´BäōòªÂ"tn_Ö§FG¢×ÇÊBhÂ)H¸ŸÐ*’#CuvX/ÝEµ ðam9T!FTD6iBHûà å6‡ã_A¨ªu5ä–*o¯`NÒJj;Ç4õ¨ÆØX¥Â¯:?ò±C/U 1©ÇÓ­”v»[žÝŠPctÓÝP,‹F¤Q2˜'÷%תd;:–5X­©z#SJ1í{±ÂroÙñÞg¬¢«¬‹«‡iϬ±Á-JÜÑÚ\KGeo®yD–:“½XJe._ï±n¡ -Za ŒSŽ6™%›/!¤HÖµ˜ÈŽ|ʵ©!ãLvNzuZMÔ©žž±[+&ûSGze¢Tıç_;4”'$ -T0yØ䪇ì©úÖÚ°Ü1Ãå±móàÜ©Šø":#¸Ñ˜ÏT1B uÙgdYG"%Ð@™.’tp+“ý¶ÕÓ]ç[¤"è (?¥}Y#•Ÿ õæÅ7(e욌—8dÞâm§D,י¶slüČ­Në(]¥Œ -`蝜Ôq¤œú(‚âé„OCšÀ}+ùPõÒ¢·ÎÈóenDø`ŒpN¹j«‚YÍe[“êÏD›­é9Ä ‘œZUŠhdCøR;Öµ¡Š¦.ők¤\ãd?'䟒1c¯c½Áêgg‚ÛÜ¥¡}ÈQG¨4r­Ýpì"«ƒ Ì îà·Ž95׎Å1JѶW¢„nêÚá2±±®]±`ŠdÜ·¬KPGÙz5'm3ŸÈœ!0¤R£ÒXóôæa,﹘¹e@O yÏ[\f'|Æ[¨HVGn{±?ÓåKç´ªIÂ1%wwÀzc:“«È¸aD¿ÚJ׺¾uY“ç´l8”˜ÔÈÍé)— –¸œA Š ø±s NÍ»Åkš0¢cS²“*z¨cnÚ1(taþ!r]×)½6I²ü伺‘ÐÃòÔ ]`Á·—ëÂû °È»] ˆ¼ƒ.ëÕ&-A‰ð¶ˆBƇ§Y÷´‘DÉÛT$hú^F–Þ@U_LðHm«W€y|qóâ$[kûôØI­eg}“u “b‰•¼pît34Š+åÒAt¸}kÍc.Üíàò¤À÷àíؘ4˜3ß÷áóLÒPqû£R$Ö¬U"´,èœ{Þ¥ž^Z(NtÅ wk]ÉZj\vƟˆÑÛIE -hî)<kfŠM‰N÷,V^B"—· ›Æwf&4Ê#ˆÆŒúÑHöÛÑ4¼aeNŠÜ-ƒ¹ž9šLèË}ƑošìVŒÃ xJèÞbŠ'¾EÒ¾i”¤[֗v‹¤òÈ@£[¬>ÚL°]\èI³“>eôʜ˜ íA$˂-vsv}¨Ì$+° e7£€MeZZUî1è˜}?ONÌ :Æåäv³×vç— ÍôHy˜'¢ô,w^w$vH8 c(9ó¦لrØx_@‡µþ&*ݱ%G}±r(Qõ»çæA.p*ÓÙR֎٘R­„KcÙñBÀ5"ó$¡ÅPŵ34)÷¾ÀîP„yÜò‘ WƸm}%(ÿ –e‚Ç~~®NÈ¡6Ê5²sî÷l2՜ ¢™Ž’eÀ¶k£¨›‘‚ 1g+ÜÌZÜ-¸¿G§‰ÐÞà5à2g4Z¡êlRihÁ¼Ý†žFn Ë3ð¡t%|—½í^Ø½mY4„û‚l -_­o¢TÍ -æùCN“® -*Z¬B뜴•ºŒ¡ìº¥ñÁ\‹ØB)Ñv‘ÐOˆ a§!ç©Nðú - ÃläŽhŒ¡Õv† TªÂÒ&¨¼ºQN†¬tª±¡œÒä"—E®æF5HÒÈrT|ÁH“Ðì­Osߝ·Ûòã£/v”‹ˆ¬2Õ:;;hï iÓZÆüÝ[^‡4š¯Áµ`yýŒôâФŒ²­âÇU)$TúJ߅~<8Tј4›LÕüMÁX܀S‡Î“`mƒÍ‹ØX|Û¹Àw-¥R¾9³² kDt/‘Mʉ‹Ÿ$Ž³Ê`‘Ï¥ $¤kKaù•\ßÌ¢–eö­pä¨ã¦.Í0H£¦ç–Ýh†$b¦ ׃ÓÕn3pڜ6ÂHXàQˆÜTFù¬K }/•eY3GA[‡è®Š&ìsÉk´ñ‰ïR¤’4u8rŒÂ'ØéEÎ(º8†ùŒýð / ÂéÞ¥i -áf»÷i‚†äð](´°söß(QL¡HӬàgój Sû`Ȏ¶˜åŒ†áo" z5päð°b¨·7 Ürqq+úG¥bù€(î4DꨈB,ƒÉ&hæñ¹åæðõõR¸£9ü\¾£Yµ² U‚À.¨â A øÒpY«¼w98à²R¯Q9׸›Olæ0ƒ]Š‹+ øú%÷Á^e¿A©€BUMS,ëHAƒëh,x)ˆH3%‰9—E‚ ޙÂ((Rê9Üß)î#20 ÆE0¼S“ü7€k‘']º†¦E±Bª¢ø–Ù­ÉIß;å@6ˆ\ry7Ž²pŸ¹s·ž“7Ä@ Ò2qAt`ŠfÜ5ˆÁŒŠ¸$à#w -6dÆ­Gî1¨æ-¦y²¹’ûž J[ÌÍPrýûڈ㹝xGhI4v51âÞÕHfÕÞ>[]ßÓfQaÃIØè´-õy,¢¨ù]}‘ ÄÇãwµ%ï…t76jà ÉLb~e¿ä‘²ô3.ü&,ág”‰·qñMßU#¥njníȃX¯ ɍ·rŽ**Vd c¤[¶ &»Ÿï:]j˜ë¤’[Z €}sg³?,É®t3#’è“Mˆ€Mk« y_Yö˜Y -¹ñ@mz}•èxÛè];§[žÔݨIrø¡‹¼óbLqaçAxMƒŸô­+J•[õêh¸$|LM­h•0ˆgi‰pY\þ_î¨ñkÑز‘ B-쁸¿ˆ*^5Ú/x’P aì3lÕr±N‘ƒL#¶FÌZùƍ aµ©Ñ/{Õ#€(ûÑ²î}Ô³%e¿vJp†åQ‡LøèљüAڅuÄ33êÛZ[5sY€ŠY£ü¬üþŸ"X©)–—֏[qŒ±ãBÁEŸaß{ú诗ÇV´ÉD—wZdí`l R€ 9£èܐkb·bÈpæJ„ñÍ,£‘Ñ„ïÕúÑú¬¢¾£Ñ h k\685·EcjRà -µpJÇ®˜ñ}'*µ­&á꣭QúŒ&9¡‘Ù0Qr%ÞµŒL …£Z¤ìP -"#×!Ú¼¤yÝv0½Þ«ØVEäfc7äã©y\iS‡«ž¤ŽÒÎ§C­$óR)œCÿjÌ؂ƅ -|ҁ30 -/Ø£e^>­ß¶¶ÔqP6CùNkwq½ÄÍ1)nýt^àýoQ£Ãûe²Í§»Ž/eLý‰ÿ—½‰,ÝpÚr˜Ó™±ûAːÐpL¨(G›TTÚDІàq ñê×¥ùXE’™àÙèÔA¬7«—Ø™:2˹Ü;ºu,tÛvyCu„n­œÆpe‚EbãËðDÇK¼qo:Фð÷,¡±ç¢Ÿ¡ïÆ´ ‘5ó½BD´Pn;¯átеW ÉÙFԖ gq167~¯¸a²½†Z/«æðT3¶»ï©Äß~ûß!›^ˆDlÇÌ¢ðJÌ­y¾¾—ãD¶¹£-ÚecÜß*‚\yÎ7ÉþE¯s£ŸŸ[]m¹è³¨úê÷»1öWŒuåÙù]›¢¿¬¾ÿÓ×éÐd9VN„½SÍ©ÍáóßN/-ÔØ:"nŒX®˜‚–Ï2JÍÛgÑëJ#Go67œqÑiUr"¨ÂU¿:ؕgçך;=1159ë8eC[¼ÆњÁÑ!#Á'MšGj5T‹Æ¸nR%ývñ,*+ÚöD¯s£ŸŸ[#yaî³Ài-¿¿™ùˆ—c]<»|×èôäûǼôq6¦ŒÙ ±EÉÇäÕØ5–)‘‡Ü„Š‚&.¡†h’åó]̋€â(éBz pwIËyQa•ëÐðUåÑn(åÌ̆`#Ç\\ÞÒeÙA+›Y Ìïꋆ~b05ÏL½»¸AÍ«Wæ*‡+W.om=Ý»{pÌü»EÊÜ?6}E8xô텡0ö¾ŒiØoØ5¬ÕçÂT$åSÅ]_`¹GRçæ¢fõ¡ÔãËÊäˆ÷B‡;¿WéõÔ„™Ãñƒ¨3òöN5/NT4•+Ž,°Õ¢1Žs˜Æ‹g[¯ô¹lä÷G=šû¥D˜ n䃞C$h¬‹'çwZôyêý11I殤íd=8×GØxÈt›;o'|M;îÓö̐¶Ó9^û›moÕúÃkÎã^Äpt¸‘F%:æ쎼ÆTwÄüЉ«O:´@óÏäDìÔoÌ'8]*:Ng¾t&FáËM*2õ°È¢H§­s. :YۗÍ$µð¹ŠáÏ2J­^[+8³¯_5JÁ2T™:@~„dòøºj‚éômõ3ôP®ÂÛs¯ÄËÉõ¶HsßP[°&ÛÞà‚™ }`~ù‡‘œ+¸\H´ÇëÌKƒœ@¹cQÁ)Às|¯!Þ< O\€™ñžêK®aNÔZIƒÀ$®/Éð!è2&»¼"ɕmêF´Žšø²öteåÜó$Ô)\N´5ö<´^w=çFv¡ê"í¦/Õ«ŽÀàWm‰qÊ å]®Œ ¸Û£={`ú0šJð×ñn“ÚÉ#g>JõÊ)a¯¡IKžÚF‡3üœ5É ôe¹¼‚%w-ן×|¹”侏Wpp  x.¸þx¡NG¦e–m½VD¬l½7uÄvÚ¢î4sò ÁÈ)Ís Ý •¥¡IŒ±&òÌô‘نܿES¾ zä³RnŸºêêQӐJnS9‹½«±Š³6"˜¦ -jÄÅSi©" äø|‘ˆJ­ÔêÎéöÌzd H](2‚>ƒœà сã;Huýd˜pÀ­ÅSQ½€BôB^»¦*óÇZ}ÑP†„åpÊ&BõÊñBKgG㠑™r­]î4j-ªÆpv˜U!§¦w4uæ~ÉcÃæB­ï{·E=¾~ K‡kuÕß?)þþÈ#Êä"¶©Ò:e)Óud¥`Ftcê`"Ò_u«Â—ù3H T|$#>æðD[8Ø«Bp0Ú.CÂÑ¥vÖeɪd 0%RÑh5|²»–pS•#Ó¦rµ–¶øH»<òfhfçÅ¢, f|âÂñÔ¾®Œ«aѨ«%Ä2&YÆ.ç®x¼&%¹óWe÷.G³;5}Xٝ¹x6¥éFœš–aD®ŠÛU ‘Ér·ˆš w››£ëEĹùìL5iÿ`UêO®=8Ú>>Þ>U J])j@끹*Lèm§i”–Þô ŠTŸñÏAÖP]éÅ D‘Cª„‹ÆÉ{VIÄ&&Á¡d™BkÍDá;¡P?û³èÒY€€Ó­Ã•UՁ(ez FÛP×Ջ ­•8ºÌ¿b)Ã[‰9­5´(`ïT—4Ay¨ ú qÐú¦HTѰȃTUÔº¤Þ(4v0j]Ìë×vÁ¦Šdœ¶ä/ò¦SüºQ†Ssc…´.@iŽ c -E¶× ,GŒ}x¶q%QŠò7r应É6«ÍK7ÈMÚB-\•*ßÀŠï”$»Á|§UR^F%dŒÈǐFLw¹ÐWåbÇ*°Ð…œ5eÈêÍÜ¡Æx%:¶a:!ð[GÌAݹnUŸ3][s(£‚HÊcI$a|Ahiõ""Nha¨‡hb ÕN|œõNDéRw zùž5òZyVá”÷¬g;K AKßT5¹M ѕ,ÜÎirZ™^ébj3z*2™µãP3h²Æ!RC‡HŽÈ)’'éùîM“3"3?ñÉÀ½Îa$W‡PÉfIË<‚`X6låì¤ÁO4E±2NcS*×LHÉü+¬ŽÞ -Q%uy(uvM”õa¢p7÷ÁC •K*~% ¥¼ú °ÐAxg­À²}{ ‚¬³‡(Œjj4¦[ aBFE.l´uAúɸÍ"¬,ʱ@ç‚úL¯@uR>‚™õÞbìAøƒBöalõÓÇQå‹ -)2b.âNš‰K¹gqydQ¸gÕ¨5HòÅQ ]Øúdì"ƒJU¯Hérׯž†¾º[$Õ$!€Czc>ç B®–y‘üKmœ)á҅9´ -ÄźT¸Á÷,¦œ0O*UÓÓæÀ+ÃÑu|ªaÎg‹Ô>ò".3ØÝ…ŸŒÁ³ÑD]Ì?Õ -1j,=q@»A⫍ƒÈ4•äœ„☵Z‚ýU:#¸]N×·­3*–5ÄR;[9yœkÁ!á†ãªƒR³óx\õ̇8È;¨JÎB ø Nf#ô©Êð)—È#x`,ˆô² zVÕø¦S¨šâ<¨ãÂrOë0 “ŒaC'7QΊïr­ÒªÄÊY»Þ%6i%ræG“‰"6©jKTûÃ›KœCaRõEY”_ÓF+r‘¦5˛ÍÛ­º~#ÇÏÇ'sÕ#kû(#ãJ óm©õ0ÁچN…wKG‘& Õrª"AL6…Ìïé€7‘T䰂ORpMDqw=CR¨Wàïc[ŽìdÝÇ,ȪÁԘ  `&pôä(J°€î M¬ë¬òL€KŠ‡xFM`Å^»-P?,a4±r–NsjÒBE.ì(v£~‘­îÂs¡ÆÅ¥> -ðØJMTþÀÅ#ž-0ˆ8Ò¦.dhê–0Ã%jbÅðX¬e$nˆP‚èÏ(÷RÐTÒ{UÅ(šºÔO ®ã¼ƒgÝ ¤‘|Бo `”Z >cUJ«!`ûW2ÿ÷\'†…ÇüÙ"C]Ž˜ÙVWŠ¤«ÅäV•†Ü‹Ä©„뮐?^W. -­3OÈ«dୖpÒ.½ $;(è ÂBB%®¨èëÑfÛ×ñ.V„¢m¬æl,S-Ž]±ør$…c-¡mõِ®]°ƒKœt†Ábï:Ò7ŒN6úCeAR¨x Œ‹†q©f™òÌ,EYyPêC„0"pW8W^#R‡ù*¥U{€Õ! ¥Ñ\@âßÉF<ëu1‹´!õg»`qB¢c@övQ/¡‡}¡ -FÒ¾?íìG^8VtP5ÐhkÔe@)ˆEÅA]՟~/€ã¦Ø -©-¨ïFÝ \ƒw73€tŠÁSº¼ó[a\ï^Ù·º‹›¸´êQ|D*Nh‚¬Ä)>$z¬muìæ!#ÉH·!ª?¼À/èENÛ [N}(—WŽ³½Çà’ bJ‡òьÙà%6194q ½Ñû1Uœ¦@0;b®xð˜–Í2–ywڛÐæd˜¸çÅ4wEüAfHm6›™¨³aþԑ…‘¾Øڂ%,+GÖQu…ËD§oAPOn±Ü(‰|^²Õ]‚¡Ø­5içž7o”ü ò)’WiU0ÙGem§¡k9µ“gÐìj.ºõšÚšY-=¯œDüª!@Þë~ÈåøøÀ]” Ѝ  qmT#ó/,Õ.<$! GÞñ`õsúå(7›­ ?ª€µû.QB)V'ÏG/KWŠbEœâê=;ˆG„wªÜ…(‘…yØ CÃCC¨GHoqiI‡©åÉ ä -Žô>êÖ Ì9êÂé‹1KbŒð£•}ǯÁ<ÕÄ‚ûå.™gªY\šÅ´Ø3´Õ0¨%ì'™'#Ñ -)ßn’ ¥ÚŒ„o A¤jQ0Á#ÉS8ªƒV#u^]!ƒ®‚.‰¬Z´ÍchÙ¸h‘F]µÐ’Ðs@«¸r£#)ºå­ìCTRܳ²1J‡¬Õè‚âPàSkZ8wˆšÙà¢áâˆN3³$75*äÓüÚA$ ¨(wKÛÓªðbºpý¡ÐG˜kW‰4E‘C½W„,r8¨ªBÅub*á0+¨?¹€Â¾»H5é¦$nîUIˊ˰†…' ÚNÜRl*ù|ü£ò2ìEIå\ê˧/Ç¥]Þ±*@©ºQÉ72“Lß÷ÁËëÄ$p0G)æ`Z•4q@ɈC)ÏÈ6ýàQÌt 34•+o¼‰€¬mºÕUå»c+3\Š5O¨d+‡”rs»¸ Ku„ááaʶFøö8vM å…=ä¡õ&½sgà(¡¬CÆv°-@BBþ(Pˆæ± -ÏNq̌mh~ˆb_¡¹j¥œ´mL¥ù'Zƒ ÇÐú8ŸlA}ߋ•m¢IëÝsfþuÍú^¥.“[°¶ïµ‘‘% [¬UC!~šìÐZ7TøU`Š(=²yð}t½pdcñQáVq¢.Oqâu®eÜ XŽÉ‰åþ´1‰Z…Zbk .Ï>,-6ÕWt¾ôn  élçD¦s?ˆÞŽ½F©¬¶A”8ü«~7€âWBž5ÿÚ£còTôìÑ¡>òB´nQ̈́ ƒÞ.¤S";ÏÇ«_À3'ĵQ:8ÎhçŒA$Í ¼tÂR‹]da4Õ?¡l¢,ÊîL|_\_t5JÚ à"§$³~ƒ°F*$T•‰ö¨›­ôÆÙ¼& )bµí‘Þ8µBà8=®^Pz'®¹ª‰xÍ´Ýo#/ÒÒD¡³ÎQ+@äÐôÚ Ší ‹MMo0Ø·ìoUü½Áž*  -Ž]o;Å´ 2ƒ¿&ì@(é^õÑßóŽ¢ák›^¤ªù¡ K#‘-™rϝ½XÀvNQ5ÁÁ -Ì»zm•8NÝэð¨Æi˜ªIQ¢…›l`3W!•+:Ï!_ ²•Ê¶G.7”OçöCåÐ9)"€u$ø Ô®-åæB§‹CºâgК6BÖ×Ñ7³!¨b‡“b(ü®‹ 4_–`dD6n¤l°nhkQìÁØ«:Nß8#çà€(0Xb­@4a+ ;ä4£(§Zx:j4UèhZ¿SzÖòÈAŸ!¯pN‚%43ô M°"äí -½tV9ý—ÁuY…€¨Y´ÈNgò8 üQ˜àm#µ -ô ¼nÝ53žÓŸ€;aÔ.² -3ƒ!±dq© -c¤?Ü GUæ))—[Çx4*¥Ÿµñ4ֆø±Mh‰!›®¶ŸeU7&fè`$;õ2Yi³aGÉÆÄýo ½]`]ãÈ ‹ÁüNÝoŠó¤ ãэ®²òXuϺ¼gGt°d– …Êë¯81[x~Zݳ½èÓÀ[!ýj¬ç`8$C¬)œõØ|DøÐ*¸ÜÅÂ<4j\ 󖬣À¯j¤”*}Ù¿Š5ehÓ~cð„1O‚·zgY0:t‚ˏô•zãl¸Ö\™åDo,ÿnÏF¼¼³ *{ÎÅÆ,ñ{(,¬Wêkyy1d£ÝQœ”Ú™„ ÙŸˆ)Tf¤Si+•qþô¬l>4¸gEˆ)›C«Ê¢€ÁÕ*5¾žoÅÞêž Á•e̅U~_ª!ãLƒHa~ì!l¾§LOÅtðz­Í0Øëʦ}Hjhí-âµ9:{ -ëÓ9Á¢ø;ñdWà8é&å*oÊ ºaÅP€˜¢NñH)XL-öeq¢1I·–ˆ( Uv\¨ò° %ÁÄÚA¨8†” ü’e+H„CÃ~ -2Žá tÁ¥š×_èLƒOÀÒòÅMQ-EÆ-¤Úddâêk{¢ûˆþC‘ðaGŸ"ÙP#˜ö@)m\phC®„¬s£b%ÝUáï×°ê`ºP‡B4„×kÓ"ptʾx›ù}A§.?|•²Zš×õn˜ÆA3†›©—²“KQóFájUBç/ëÐU•¦›:Œ¬:ZK=l©×SE¨gîìjZŒ‹ÒÂåilÈ!.!Õ%î{&gilÙ쬷T•Œ+rçIõÍܞÀ®¬†9†JI1ZÙ »g˜ -X¡ÖèvÄ&›®ý¤¦EònÛZ+§YŒôµ 79iuqÀ‰K–d 9/‘E^mXº™]#i0Üp5öF3{@OýMyH•|YvÝõaè‰ ‹ÝŽ³è-§…ËœÂLÍÁZx>¶†v–ãÕ²3ÊŅÕ&X´ÕÐyÁß³"_·|Uåõ‚vã\§Õp)v%®°×ÑÐñPMë?"–ÜVÆòî\}˜øºˆÌ)ì“Tµ¯h]8’T¤Ãx›¸Üž„Ó.Ç>ðöęÅF:xñ/GÏ]äýÁ­=Ðj~‰»¡okµëC¯O¨]d…*ž‰„ ”Ú|BS… S­©Ðžœ!r7zûAeÆ*˹&IéLãÌ3Ô k“$Z1°ÊɘÅBÑÀœ7/ײœ{ø:#Aß.Œ7Ӏ:fðÛUìŽA»I¼¯‡~jK* ¼ðƒI Ðà•…b—–™¼¸d[ú O\‹žWâ#ðY˃ -¼ÞAÌçˆa•L˜ª©Â "ڏ’J=w‹Ø|P ÄqBì0•€âРͬ#Qî2ž,eøW -d?Ri]䐂äS@èb°o‡x¾¼]à †añ¢i`͂ÒØ>ãÔºj„>)•,^lŽ¾çåè¬oŒ²Ù3ë2ûvѼA¶ÈTñê%Ž ¨á‘oRE ˜Â‚¯ üÀ6 ǝ(ŒééäedññšÉ¨ ³VÙî2êaEÑTVc(!­$…&’Bö¤iEõF5+(vJ±µ±­ -Á·;©·«´Pèî©DñG›œŸÎ–³-¹Ã¥ti9ŠTzmÍiÁÜ*ÚÛ§nåe.-LO‚Š­zà óZfÊi™‚ÕÌÅ×i¼¼–ëÊq$ÄK}äõ¨<5òT5Å ×ýD¾´\•s.åÃs¢!­T;]Ÿ áOi~5¸ ©mYáЭÃ8œ@¨ 6®$1 -‘®³Ú5Ž4É©VÏúB±ß#^ªëÓ®†Üê`Ά÷R”~¢©èM*SÑ]¡ a¼ -L ¥Cˆ:†6Œc:ûW ˜Õ{îa¦ ã6¨B_Ó¦ÔÌïŒ œ „‘³?§`@ä¡@ÇÂÒmÒوÈKv\C‡&zM0^÷ç` .F-#¸e"' ߙ—-üìmFx¯bèÚS9ø“>ÛÉWŒ×JÏÓF B¡Ïˋþd~ÎvÄÉç×Æ}¿@iƒÔCqp§¤ˆe* í\³ažDp& -ƒÌª»*cäPϬCk 4oÅ©DisURpûÓËvÒ,aMÈÔ(:ͧ¤VŸz爪böXtﬢÿŠ°¿Ò§0¹ÀhZ)83/‚â¼Ë³£2’öáäÂ÷#W&ƒ‘ÙÊ &„ԫ䋨Zœ‹@äa€“¢ÞC‰ùôꙣ±]DFÃLšLNGB”8¢ºšl• Ê]4†¿ Ë½êΆ†MÖÀ‚Ÿoª&s:º÷…xÒgƒ4Z…lLm=°Ä€7Ý`éœAW¹ìuV4¦³bKu:Èé e)»š¿ü4ŒmèÙð¬+¬³®cƒ¬—§ü •Edg«¨‰ g© ýMÔ­¸{֖^ú½Â­`Æd»„Ú†(ŠZæùvTßAW¡ã¯‰ÕÀñô;§«âæw3:í•a‰{Ё®ÔéWBÕ»T¹UsŽ‘·Nj\Ó±êÅGֆ%šHÕÄuÀ×õöV79ÉÚ=7äL¥ßN”סÂ0ä¤ÇårNØÏòxÐÎDRÕå~¨y–ùÆ Ûe‡æÀ€¹¡¬É<ßü¹x¼!ç‚LšÈf#Æ®q™T›­FÄFÖHÑؙˆ»3¿^q(ÕJ×X=ÌV‚›EiY$5ªB©©‡Á1Ë:@a©Ü)ã•!~ÁñÁÀ½¨nF·¹fÍú¬XU*D¢)VµCµ¢Wá gš¤²ˆr©¹ ú«"‹bAš+’®M’ a*硦ĪžÃ.Ջ1²¢…u®²Û³.pJ&ßÙ̂AÙE­V„ŠQcÛ3NqB™Dµ¨ærD”kLa«1DåÁµ³°/DV¦×FOª«…¢L³¤µV㔠øÉå?#ë©gÈF€Øéj‰–³³œ"™N/bÙ² -žlÀ{õæS…®D¬‚Žœ)BôV«è›žV¥ÚÂe˜Oó³#N1´$V”ùQh­JgŒDÕº¾—XIA曋†ŒÎcx÷Ú°pÀéèÂM&HŠñ ¶tÃÖ>ՑÍy±Ò -þ.è[ò…*Ø~C˜˜Ýh0[ã›H“ ¬BºYµO:¿B¦V0§E\r&D¼¤Ù%Wʾ hìlúb)˜6z Еé’h\Ř{%×\^F¯ÐU˜Æ×F'£<—ä&늚«d àQà?%È¢>”ԁ§ðû¼[I·'ڀJ㔖Iƒv^GŠÂr -Q eP\0˜«að½gªÕÙ=©éDŽ%%ÄLÒTtL@’g·ÐÀÌñ³âî{'™ÎvşŽf…!n‡>\<ò4äH•\uN+˜©‹@aª!AöqF\©Ú„JŠgc§‘RÈ:¼Ò*ßqLŽPpDZ^TP€‹N.¯Àd6hUh7\‘DŒ”ÑÙIæ»_èñ«i¼³‰ኴ羪£¶ ï«à2¿Ø8uŸ/(&P‹UçÆüdáôÑߧrLp¥Ç™âÈ×eµRèە’×W+—ѳ††«zðd¢Ì$€¡Ž¸@"> -•UÉ/ngg2=^£À)qÎü\¬ -h‹ž7øÌz8¢#njuÔ~`X.z§¯©sAè\±#kûE`¿%$І’“šYì ¦E/ƒ òe¤'6•§P¹•ÚÃtö°%„]ç î²&(ÖézŒý ²’A1^IMUŠN„ RQÙÕА™.ú]xÕú²×G“VÂAg_(æGD¹pæ5MÎ>4?òϗüëYg/i¡³wÊaA u%›„Ü›4Ý»V0;’zMqÖêÍޖ¾Œ·Öè¿0h–­•G"–-dW¨ °ýén --O±{:x”=š™Ä ÷éîLÏ1mΡØ£(‹‘͆ǜ¸Ó†:‡Ê.]ŒyÚåƒ/”RŽŠDÒU«(£M0‹ 4Q…"…²ëž®f¨YU„© ¬¨üe,póI±kçiõƒn!lâ礊!;ÁGÒò¨Å ÜÙø”ºBÈ …Viðý&\˜‚Ý•+Îi¡ãc,)ª]çg™û£il‰ÎF<RúÒîg”‹j:u%¥s¤ÖLدtD5yŽ WÎòÝX•#?}ù:›X7ÆåXÒÉ4»|¢ƒcÐ<·ƒuCjȃ€Lƾ•Ê½ÈJI”È5#ºù•P6Þp8ÌÒ¾dž´DO©n˜[_ÈGº^§ò^"zææŽý }¬Ìd”ÿ ˜u„·a>SòÚò‚æ¡hfga©k%ÊÌnåQC^UùÑ«Q¾MzX˜íÔÙtŠŒOÖ¿Õ]¤-)ƒÙe%ÿÊFdšk¯J’)d ©ÅfTQœaìP-~z² š=2€•è‹焺¢0“Nª‰š[”âÏ!@+ÿ¥xë,t$’Jd !橨I:òdKž¡uqÁ?dLÌ1`˜i±g(Ç:#Ò:Ô/¬ÍQ´Á¿Ç {ÊW„Õî)qs,Ü0{zæÔîµ:¸»ÉQ{æœÉC8sՉÆn'»Á»å£Ü qp“õ¡_€N¬­jÚǚx¦ÜBú\®_L¦·Zkðt?¸PjvæsÛυRs²^g5zÏoÜÑzÁFc’ŽÆR&¥në|f”SıŸ1„ F‚‰@ €ô¨Ì™Þt&ÓkE%¡pˆSG K‡5 ê$S¨} ªH«ÖN·0„YŽ².!û÷/üZ•]õ­ÓÜ p­Ó„!ÃÚð’o.Qñ£¶4Ér$ŽFËÃNŸŽ›¢Fµ²ä~ë¥S'顚•: ™V¤ Òh‡©±y¼É'däŸÑ.8ñuÍ?kq6ç—n”T¦”ë Iq+ñK «h”ZÑrŒ¿P§¨Žbx@—³–ic¶þéñìcHKmCy«îh®©Ù"p&è=¢wTnf—=䂉:­ÑN¤•¢ìRÂý˜¨»ñº´Ðž¬Èÿ¿tˆ¢(§nSZ•œš‰…ùáͪÆQ«Âø®/Û`.§lû¤mo$çzL¡eÏy¥°£Ú— /¡È&C˜­&¤¼(y’ÍBb±#‹•+Ö -+C§n#Ðç´3ÍU…L&=Óm›´—ȑ²< æJlÏd)7=`°‘Rüg+dœ¦F&"kB#’€fcYUɞáÔÄØÊÓsÓøàETYu]f¬Œõ\£%,†ßp`ðšÉàAª™Áð®™Îšãf"« Ufêû`\Šª™yôƒ@–SÉB¨B° «`}V4mlF豆Oz©ÔñÇÔ:SÙ¡0‹«!Š?)í¼ï -°M‘ÃÕ¼.¨0˜¨S:êuéõó¸«N¥9s6$Gø¤, ®QwˆPÝ4‘ARÀ Û)°l{9™4²:"âmtt„¶´élðŠrè1lÜךŽØfµ;çäÔØÿl ·Óá?æYçì˜L–J¥\wÊÅ8™0ª¯:êJ!K[p! ]X˜…“táGu¦ }û­‰)-cT „˜MáNÐ4'è6# -w܉"·1‚wp!nb}}™C© Køa$;1`%œ¯£h#P 7ZãDm¼É;àURVo¸DÆH‚ ¡ïAÃ`J -RTF"v£Ön` ΑÙ,\;cR qÎ¥¼S–Ó0ǕäXOG.˜8XËQ™º _£”ŸA:Ì}èùÙ|[Ðà2yQ2³‚…†t-žô=¿uÕ3ŒqÔÒú.6ek´Ã ê6º„ÁiSÏ$ʝr„j¥«É* ‰g€©Üß ²ZO%Ê×®Ñ $ 7ÉEǠǃϒMÛx²UÙ&t9¬±’Ëæ®TÖɨÎD7XOh³Ü{‹jà‚çIF˜±€cáY™4ƒ(¶NÅ#Ñä‘ìÊQV$;µtÂ?õoÁv¸¿oŠ¤ø9Ù¿)ô«†.†ÆtTºu¼2hr¡Ãb­—˜“ÌTìYF+‡ÂXÝ/8‡yïlÈ b,Ó`ÜJó.“â¶ÈáHõܳ·Ì$¤o£ºwu6äŸ=TD Ô×E¿Ämã]†€„KŠ/s<PË!nãò„Œ"*Ѭn˜Ñ3â{¾–]ׇU£0`K¡·­«9ZSÞò·מêÆà1˜§²{\5M*z-BÙ«KI¯BÉ=_ÊÌ1â]bXܚœ†Ø2ìqb=»ˆ|R§'aEVRCæF….Á“‰ ¬ÒÕ g4¤=ë ½ð#Z¡ûó%\=Üq M«Ñ·?|õAþNÒ%ûѶ -Eªn”A’äÃ[®Ø 8C¾F®"Ÿ¬vJf¢¿×‚Gd´c\“—^xÕ£€Ž84xžÆÎٕ’sUÀ"7Äi…V€ZOd×®ìYB%ž–„—•Á¼­ÆÊTR]@ýú3h¨hUg(lBqùL(Ö:ŸE'ÜIØ7([’_"ÔÔtòÐ:‡a躱Æ金6Ùý5ñZV0$£ç&¢w¡®ªg;0—Š5zZR䵩\¯äãÅj"ïwF‘ÆŒÀ@`e™ÁœºÈ~ÀFèxŒ k}\p…õ‘½IŒl®T«cڈ HSl[n”,–+fQX—ª `ße ¿®iŒ&#rOöÑ ¶Ê’Àn\ÓV¥èøç"øiñë×ìߙtƒãI=ØØP3i–8óñüeÐ_îì>þ{ûþ7Û[Çg.^~pp{íÊáÓ£Çkmîo>Ú>\»}ø`ûð•þۚþxuswwçÑáæ“Ç;[~òӃƒÝKkõړã××nÿusúùô£¯¬mL],Ÿoðù•G3e7v7ôyuýŒGÙÅóú¿{ðtÿÁöÍ.úÓ˜–óöþÍãÇ+OßÙÞßÚÙ]ÛXûôñÎ~<Ê.žýüÕǛ‡[ó”<û©+›ìbû0œž9Þ>ÜÆ÷÷7÷¶÷7w×®`-/½²öºvÇ´VöÆϼǞ3‡Ó^š÷ÊôK5méßnmÒë&­hú?“LýÐ8ÿ¡¯Íe_ðkóôï8ý_šþ…_ʽR¾µJ‰ÿ[üû³o»ú²íš^qäÿýk¿´,,¾´ânLúWÖÊVÿ‚ïíOLr?ýû'ùçÜùÏ:¶Ó¸®lâÈrÿ_ZûlçòŸ¸Yÿ¶ aå3¬è‚¼nGA<"ñ¿|)Ÿ3ҐCÏëZ3C¸´Æ…ÚՈV$é‰aÕÏ̋ åç\÷çIái¼§Äðs§¶Vc{º‘Ûà8^{¦ Vmíøž§MÓiB^x·üä õ—iáîÿ}wûèÌ¥÷þ¶Ï_&Åæâå}8..}<~íµ3—.OJÏ_·ã¯—®ì=Á¹½±³;ÍžŸ6ßÎþšPë+õ%?òÚ³>tïxsëÛþЕͣ­å'¾ÝþÁÔüy÷ö¡Ÿ:YêlÓ;ßÝÞÂz>Àõ˜_míE¹­^º¶ýpí͵3kÝÀáóæ¿uíÍ3k—îl?ã]®ì?xºsüœ×øâõ~xÖ~腧¯LÛ{íâgGÛ×ÿº½ûÁ ˜“öOÏBéä9sðo¥ÓxíðàÉڽǛþö -1¿ÕEüMz}sçÉ´;u -¦¶½O/®|üÒ§;Ç»?º&ÙssÿxíâÖÑáF×.ÝݞNüÅ¿n£¹enº¿ûôpå™Ç‡ß£aº-Ýò`óðÛW–Óüds‡Ÿ‰ï¹¿»Ï Ÿ®‹øÌÁ“Í­g¬Áí3¸Iঀi²ä+þ ~t@ -#íÙË´ùÂ,Ÿxne͎¶v_pË^ÙÝÞðo½Küüê&«tÀóHç?w{¹tý··žbü?û,á¶6™ã¿B÷÷éÉã0=Ä¿âÏ=ÓCêcq~¢„,[ûÞ´M§sâj_»ôÙþÎÖÁƒíp_Û9z²»ùwýúʳÄ,m»¸ûRÓÃ#I°=ø«/FÓÝöºG6íüú¹Œ¶pVÃéýSýˆ¨®ÊûmmîÆpߛîÖ»ÓÞX;ùª?¸D—–óôm=÷œEÿ«Ó™pk÷`ëÛ¿ím/ÿöٓ£Ûצ­ºWvw¾/±„"YîLÂîàë¶»üÀåß<=:†âòÛMôÜDÿ)÷ã/ð/“ríoRrÈC@×]µJ0ÀD¼Ý¸ÐCöõ#ü)„Ý¿I¶ß$ÛÿaÉÖý&Ù~aÉf—E²¦VIA³\Q³†ðîXWÝsåˆÐm¿‰¶ßDÛB´õ¿‰¶ÿ -ÑVpÖü&Ýþ»¤Û퟼Aþ ÷Üo2Ñ2qø5ÈÄè›þ‹ƒ¿~ðÏ b~ŽEÿÖºþƒ×ü¿_8^ÛÖ8ºq†k<„€þ”ê_ÊLøÕf^üxÞÅp*ï¢úñ¼‹îò.Šœí,…;ÉÛEnÂÒm»çœsZâÿÜ\Œ_Bh¾·û«”–ÿ&AáIWêã¿òøÿ,6ŒÅ퇏¶‘áøø” Ðßð§ç -Š•¿˜ ¨›rb)'ˇú›ýã'ø½<°·»³÷‚èßµÄ?iE¯Ü/›âÊãé5/Fé£ÃÍ;ÛÓ;Ý+‹]“Êѽòhúä•+ÿ„~«å½ñôûïÿ¾öÑæÑ·§V—ºþðáöÖñs—÷Æö´°˜Ë[Ú¦ð»Óû==úé·×ÿI½æ¿ÿ^¸·u¸sÿþî¯Ñ¤ý?¹ãþcœ`ÐÞ²scÉÀP#vt8å† Ú*yÿÒû÷™²669fãt-þú\Y»8#/&lŸ.+ò÷òþ£Ý핖ëmߞtñÝÍ'¿ß<ܙ£=¯§qPi«œøžçüQÝÙß>:òî?p¾óàXaª9ÿz1¢Ÿ~Qü»6mƒ²Ý…ôÕ0JBëÐMÿô¿E‡þ¹‹âñÎáÁç[w~»*~Þ«â?Iâÿj±Ïô¬r\»zp¸¿}xtJÐó¯Ï•ò'>û¾‰ÌÃU«ÿ£ D`b 'ÄtÂH¬~½F"Xq´ES”=ŒÅ_5@C”Kü›Ý…ÿÉ;£™•‡ÿÄm‘¬ª 6ÒëÈm1ZĽÞ7²´Ý¿xû÷ûŽÓ ßñ¢Ho®Û†“äÅc?Á…œN¹sûéCþÍõð"埦Öͧ»Ç_-Ê{;{Ov‹BùßíÝrÑJå‡ýÎ$‡oÂÊîëûæºî-¿³¹»}|¼Í÷¹sÿÅKN/þéîôñ£ãCZv_½Â©øÃ÷gN¶Ÿ¹³uz®.~þxçx[û'ÏÉ´ì“Vî®8Ø@ŽS-psÜÍ7* ƆĂuN®~ôŇkw·D?>å¯^«–õ‰å3_lï"‚¡ ,Þ§S5?á‰XVüdK_ïno”ª”Dêñ*cÆ?ó‡¯þ}3>;¿<¾ -óï3;D*tÏâaŒ´^ŒæÊîÓX!p wírZ£…ÓÕL@ìÄXKm>|‚{©ÁÁǤxâ•©"bêÇÙÙ[U»öÑ[@ùâ­1­}8ý«ìJð\»vÔsMIÖ®úJSW#zÚ©§¹#®—6? - Iéjª¹~kîdàpÌÓÛÆå<PÛÔc¬FÖJµØì±ExÍgtYÆ1Ì>…1V‘kז7ž{œ¾{õE'Â|vŽci†0)‡E+®±e ¢¿Õ®æ×-îµ!ƒO±úª“;[}Ý2qs—Þsóþš£é~Ã\xxÏ‰³t °äÞìýSs'¹¯¾}f_˜æ†‚H#`·\ 0¦¯Ö;«¯A›·t›wÞº96l™ÿÓ N›jõôtŠNG®nفy~Û':¥ˆ}ÑÛ¥¼r¿Ü.}ù"6›6:ÄÆ uy†/ܬtßZo,œï›˜ÚA2ÁƒbWØÄ+ËàomŠÙ4‹×j~7M!µŠ¨Ôbðœ-;U|¹Iι¥È”€,ë‘É÷°ˆJ,êüÒw9†T>/]Å×eäeWw5:«Û“{9Ià‡ўã]ªØL­$Ïb™Õ÷ÊÁ³e1OEò`ç ýýíR¶é™]fMOµ^I‡ &¦"®ô¬WR—yen—g&S(ÆÙàc+;>¶GÙ²yu¡J×íª¤ åÁ‹S¯ª qxü}‹Ëk^¯Èбq5óþ,´‡®Øm‹xñ=6+sYÞ6´‡†²ˆ;Õ§+·OÜ¡M6¦Ž µiã­Û²î~¶l€.nû’ŸÔD:SE^ -Ž¶\]]ZnÖ"®ËÀfÕ§t£ŽaÉç®1»Æ.hÊ[æÎu1Ær úØ´ø_³”œã¦ôZæ¸H\þÃr­Ê®ëB¨4qãfm2oÛ2ýʮͱyÊT EªÇÀÛ¢qÄÀ½‹Á©Vf9‡€.30Äðs ¿ˆÂâgZQf¸5º6nö]71•³ÿ!d`˕ˍ:Ütý|õµéä¶+×o¹hºSùqEýOË«¡-}sBzu}å>Ò&níìooNµ³&ªNšxÆóîk5I -“ÕÿÂݞ~þùC¬âëâu{úyt{ñóÍ¿n8Ú++èß?-zûjíÉÉO°“;»ßn®];8þIþ”4t^{xìâËzûãëk øܽþï™S­¡×·ú¾òw€ ŸþT´êÖ¾H[y…nÓÜ<}Ç֝G+ -yìÜØ°Ëk¹‡X«OÞjEgëW.žÐËg¼?¥’Ïx:åp°‡b•(¤ûOé€ÿp<=$â)C‰ -K\’‹ÎB·œƒ¤+ZyGñz²³zžÿ4ÿ؅ZPì¿ú‰qUéĸ~jð6ÆE…wEߍ TÈÊä!i|Ñ:,m˜!Þp1¬i;NÇóïG[›pmi®=:s÷K|×ô˜ÂØ:–‰™Ú¦MÈÆa^Ì韬Æ>4Žj슌ÖïEfw‹ïhf¥~þŽb„ ‹ï¨gkgþŽÙjçëÚ¹s¥8­Â7õS  oí/}x‹4 g›ž,šYu@¯D”O9ÔØû?¸X%ýIÐÐèæÿÁuõt{íÊÎ!P¯î<Åÿ¿; ìÆ4L¢MòòÛ´ ŽŽðÈÁ¦å•“€Óêõù£óL];ØzŠRÜk›Ç›@µŽß h½â¡ÅïøèÖǶŸùÇ7×.þïÞîþôçIRO³üôx›±FbeO[ößÒÅÏÐÿâ©iÙwn›¶#Mã¯øÏñߟlë¯_Ú?úú¯›‡Go.è?–þuN4=‹ö£ç<‡O=æ‘­üö:;÷wöL¯Z½ÀäL“xoûøcNÏÏÐòé×~ÙwÜ?Øސ—ï‡Úúí/ònñäÏ´üÿäÛW?øö/´®;›“ì}‘ÿ£+ùŸtÐßøë u<ú ïb¼ÞÖӣヽ_V’ýëöáG›ˆàáΛDNjnÇù¹˜Æò+ÊÃ)=zø·_ñmü ƒ£Ý­ÿtY\ò5ž»´/´¬¿´ÌÝAÓTÿØËüýE^æï¿ôËT v&søGÞæoJêþñ7ú[dÿ¢oðX£ÇÛ;¿ˆ/OþÂï NÏ{¡ûǓ*pkûáñíÝGDÑúÑW;ý™_ÁµOywïàéáÖö¤0þâ÷þt;ýÒCØÛ>Þ|0©Aÿì8ÆrçØïð"»kñ0?ü§¶ì<Ý[»»}t°ûÔH'¡Þ.߬ªµâݘô›§OH®s¼½¿}¸vçpÙ¤ +òÄÌ¥PüÉæƒåòÑÑÙcäÊi:zrp|â©ÍÝïöœ"‹ðÁ“×ÕÖDã2öø¦—o®]~z|°vwóèxûpçûí]^¾9®=Ù|2½ÀÑÎÞÓÝÅh[›žØ<<¾°yø`m ìg¿ßê¼·½ûþæñ4[·¶6w1+Güû³kyö&€ãn^[>¹üó§Ð+ñ­«üöòÍ;›‡Ó7L>º¾wûÁÃƒ‡;»ÛnÿýĜ®<ŠDäiюÊ×ÏêðóÇ;[Ou˜ŠÚ°òð½§÷§Mpã`ÿøè.¦òGFpçÚ bzòþÎîαŸ-É ïíÜßܽ»ýäéî<Ⱦ-ëR¥µ‡eÿr7þº½u|p¸6}ns뤀>ñ¼ýöá_·×þº}ø¾½£S»cåOQ`µv¼ý¿'·&Gœªµémo¯ÝG¥Kæq´syØ´©>Ú>z\ö%7Þâüý`÷ßîl}; fí‘B)åD̝ß~züdzà‡»ïZ°~>o›¯UÓøC¾Ô‹ÇŽ7÷žlN¢këïÓvLg'֏vùˆYyZ躩‡ç?[/¾þGý)݆CèG[ž¬VâNlœO§°výÁÎñær§y‡ž˜·6÷=Ý|´½vçàI,]³‚*î'O7ÑçÚ­í¿nïþðNÞÚÝy2 &ùÿNƒ~4­ðÑ"¶òöÅ"»´H >!âNæŸÜ×ïÜîc¯Ÿ–R-炏œ8kËÖk“¸Ž>î-Göã#á·\šµ¢KßÜ}ZGœÃ“wèÉǞ€æqZ˜íÕ1Ÿ|ìè۝'÷'¹òí+?ø¥‡Ózm‹âj¾‡¸oýààþÍý‡k³$OϛƒgӞ8=eØrO6÷cÿäªi–•'-à×|éÊNÌöå{WoÞÚkÛÐðÇõõõëOÇ;\ùzý‹·ßÎ×.Ý~|óÆæ…÷®Ü{øѹ[ù͏××?Oë/5ïß}÷Ûï;7>úòûáöOßxé½[O¾ÿþûõõWþrm}ýw/Ÿ]_¿øÁÙ3†öÖõÛßÏÿLß²^¿{øÉÍjúáü!~ýôrÿÕ£Ýé‡ ŸLÿ9;¼wåÝí÷8ž—ãïí»¿ÿê»W¦^~™¿^ÿËÖÍðë›üõJÞ|¿ÞÖßþqë üºÅ_/Ÿä'ÓÏ¢ïÿ¹<ÜùæáôÓ+oá×OÏ\xïå×/¿6ýü;}ýêÎѧ—ð+Ú^{ýîÆÑôÃFÅ¿Þ¸º}ø~ý ¿n\ÿËÛß]Ä›ÓÆöJýøþ!廌ÓȺvoþû«¿zëûîÝ“Ç×ïšÎÞøŸkO/¿žo½ó»|åÒƝ˟~wtáÆõ+¿«§¹¾øÕõûçßøÓµ‡/¿áڇOóŸ9eœÌ|æ'ÿÕËçÖ××næêkçÿôFúËï«»ßÿғó‡ïvÝ;ºO7¾øc}}}ãÊ¥Ç{o¿ëqæþË%Æâ}öЋ÷»oÿ¨ÆÅ_ÏNSsî,æùÕ¯Ù8}zjþ`z͗?üóÔüíN<{ö ¬Îí¯§¿Ü¼;¶çn¹òɽw†üåǯWï]ùâw/ß}ðÎKW®_:×`<_ôݟ_½öö·o]éà¿{ïʗÝ_®|ûƃ×Þý+‹­4÷z{Úgèwñú^úö»Ë{žÞøŸ7ow݇[¿¿ºóÖûo¼zý£[ջ߽³Õ¿zý֍»|þéÖ÷ß_úöƒ×_}ûø°÷ íðÆå{¯½»uçуã3ú½/ß~ýÚöÑ;ýõ?>¼qåÝ7>þæÛK>|µé÷þT}vb4½yóèýÛ×ï§×ž^þð‹s§•üæÕ+ã'ºvóÁ͗Ï\¸²ûîn¾²Û^¸ß÷—Žæˇ[7«W¿¿Âñ8ûÉÓ7ß:¸|ïéúãW¯\¯¾w¹:ÜxõÝ«/ß¿xÿ›õõkŸ7Ӟ=¼º¾þÎÇçY¯Õ+¿ûêìú+ÿá»õß½1þŽ{œë:=á{ñ+üvîÆŃ!}ß}¾±ûê»G¯<ð§ ìíõ—ÖϾôÕëç^»öñúùúÕûëúéè¾ôÖívÚû/¿‘Þ[¿øÎîŸÖ_¹~ï`ýw¾ùúú«Ÿœ½²þÚïÿüûõ/¯³þúýWÖ/=Úyk=íÝùd½:ê·×ó¹ãóëùégÝzûÒÿ|°Þ½vîÏë}õõáúðîGy}¼Ñ¼¿þÆgë^s ü~ëo½ôy¿þöÛÜ^ç÷o=Zw¿zuýÊ¿»¶~õOç¾^¿þÒáùõw¾{wýý O¾\¿yûɹõ7ž^^¿µyáëõßyõ•õ;/u7×?¹ygýÞ͏šõÏÒ>[ÿýÓoήÿáàµëëüú­ÇÓ·|ù‡Ïúõ?²ûåú_>m_[¿ÿû»÷ÖüáÉùõ‡Þ¾µþø`óxýۗÒûë{o|ñÝúÁí×ß[ÿnëóï֏_«ß?»~sóéÙsO®|tö¥+ç^:{ññ>;ûêÕwÒٍ£ 9›>Ú|ól®>Ú;sálûÍœ>~ùâÙ7ßØÿòìÛ/oþÏÙw¿øîìÕÇwñ盳7¿º¹{ö֗ïß>{ûÁGÍÙ»»ŸìŸýìø÷Ÿžý"Mý|yy÷ìÙ¯ï­}öþÞôÍß¼YŸÝùlê`ïܓ¯Î>¹3ܜ¾åøåϺsgïž?÷RóÎãs¯ìÜÿüÜƽîýsUþb8×¾”_=7L&ܹÿù˛Ͻ{÷›?ž»öñ·Ï½/Ý8wëóoß:wçËOšsŸ~óÖƹ/νòò¹¯Æ'gÏmN†À¹íG÷öÎ}Sø͙ çöï^}|îè¥ËÎŸ½ýÎÃó/¿võÑùWÿüÞãóéÍ¿9ß®¶w~üòëïοýá“õóW¯U/Ÿ?_Þ8ÿÑ«Ÿ·çï¾vôÖùÏ_ã½ó_^úýó›oœûÓù‡}øøü·9zzþÉñ{¯_Xóé[g.\xéߺðêӗ¿¼P}¼¹¡;¾üÿÙûÿDŽd$@aw±Ï>§s:! ‘$˜!£€$¢ÊePBÈw¾÷~÷ÞûÏÕ=y˜DØ[ÙÛåk3t¬®þvuU·×1¿9•p$©Û=Gî~çÞ±±¾àvìE}KŽÂxëØqñTyqÜ<>D—Wێúíõó”ý¦šrVnv¦|SÏõ©Pt|njv›>ZzXvÙS¹ÈáúÔÆq¥:µ?5½0u²“+M©‡ÐÔ]9|:UMù¦^gÜGΩæьs¦ì?v†Ï}ι¹3gr½r®níÝ8·Ï‹Î£WÝyñz¿á¼¼ÎçüꥳUYZýçL,Ø]¾Ûø±+Ìºc-W&;wìÚ­èÚ¯îM¹ÎΊ׮›µzÞõ”¤"®Vr}ÜíL–¯Ýþ”wÛÍçîŋ¦Ï{I7Ý۾ʍûx-u侪Ù×݉}ÈÅýò {é¯Ç7u:ቜ§_<‹+¡Šg%8YöìLՊžB­|áltæ©<œŸzZµËS¯Û}wî Äj—Þ¹•ñ’7}EÝz7§ÓOÞ£ã†·8Þtx7b>ok|7jsL».'’ӁìêæôüLít:ÓÌ>Lo]7'¦ çÛÁéë«`fú¹T9š¯îWff ïLtvfyfyóåhfýé¶6s> Î\mÌT|»÷3¯w'”Ï›<ÝðE¦JO¾¥û:äâ[?tùóó“¾âúÁŠïi­úä_ ÎûgvwKþØÍD؟z]¹ðoͶ‚þ“ƒµ ?bØÿ²}Q¢\®åy*x0Q¡ÃÅ,µÖڞ ïÒGTi'¦ª/íXuåmšÞtûé…=÷=½Z¤6èƒZ4@—èT®®l/ˁÀ‚ÓHÔ2OõÔE!pìñå7å½hà%?á ºÓ{Õ`$ä¾ -¦ÂWÁíhr-xŸ\ ->æïb¡ñ£-Êæù[)oha>:Z+xÇCǞÉV¨\˜l†šÁÉfØ[ñ´Âñ£èx8—J9Âþ-wøzæŽ -¿L{¢'¹‰ÑW+‘lÒ¿ÙßÝ»Œ”ž\O‘—xa*ê9 E¢q÷Mæ³ÜÅúqô0¨Do5O´yƒæ–­£ØüÊJ=¶žJ†b'‰¹ÍØÃúÒc|bk)”×·ãÉ©Ãz|'s?¿*OÂxÍOÏz -;³³Ùq;è¬ÅÜl¡|_Ÿ}Ø_HÛs“ëOµ¹P*—K§Í¹ýôy~îæhÍ9×*RGó”k"<¿”z|˜ß¾¿^/ÆÎÜó/·'W 3‹…ÔBÂsã^Ø,Þ_/\N®/Ô×ÂÁÄtn½‘XH—ΛëžÕÄåÉô~¢þPŸZœ™IU›óÅ­z~{±˜N/6êÅø’+ç_ZŽK{.‡}éæ¹R_¶_œW–ƒÅӇåÌMánùèîèvùÑY¼O:ç+ÉøÎësr½N5’ÉÜD²Þ¸öÚ)ߦ'˜Z䩽Vk-u[ʦ'_oÒÑ­ÍfzmËçKŸÝ/§ëW{ÿTâ!“Œyܙƒ3ûræÁó\È:›Ù9ÿ}<»Y®dK[­fÎ>ë^ȅgb¹U÷&ä’;w\oä^¼îÆ -_O­¤·••ãûLbåÙót·:½¿žX]v»WN¯S«ñ\cÍýØ\K”'¼k{û÷çk÷‡åĺkë´¹¾prq¸¾[.ÆA_>´ò®X£_¸ $mŽüžsٓ¿?<}ÜpÓöÍÄC2µ±ðØxLÎÙ7½Ñ»ûÍåHætó(<±¹ù<–Þòmdç¶ÒT`ëtüuzë%Sqnî‹Û«‹g¯Û—­‹ÖŽýüöu'–­ïlÅ]›cçÖqïºüÛÔîbð1º{ó/î>o¬íùËS{9ÿniïbË]ß·Ÿy÷cû‹óûÛ³®­ý»ÖméÀs}8q<]Ÿ=8Ù[Ú9hìÏUà ôáÆ}bãðv*óxäNî…lŽ£å»Ûƒ£“˜cü¨q›ÈGVΏ·¼®¹ã»ÊÆuÁ{5-¤ÏJ…óÓ@ìÄ^|¸=™½Ï/žìOÏÖNž3îü)}Ûôœ®ï.No.J‰3÷µý,åx89;+ÕçösߔÍq>·9[:?ØÙ˟×öŸ¢¡bdâbË~r{ñõ\ú2—«.:zy}|ï½r‡V_¯RUºruqÚº.N®–Ί‹K‡Gœ¥í½âëêöNinw{»txs¸]jxJ»×±ÍÖ¡Íq½×¤O¯kë«Å›ÈôÝãÍÎ5Õ¸y>ÍgvbO…Wºü<~üœx^šß{~¾dתNWÜYÍ8é³êµŸZ¨MG}­ÚÚJð¨v_JÌ×ÔÖD}{ïòª^óÚ×lŽ—ØU"ür´Zo؃¾rcÉw~ظôDsM·ã6þï¿€VX¯¦±å݀…@iMÖäÛéì%vKYCYËÜÒ¬ôӍZµv}ߨ=ãK=§¹•M+k䈪–³«Ý/K"€’`,}Èt\m±Í"ၰ^Ņ‚¯>ïÊË¥Úoœ-3(*ý–9=" U_n´þQkT’xÇJdé4šm›U²£lÑY7¿Û¯É¬oÚÝ+ê¤õ‡êfÏ´Ì Ö`éï Y†Cš-ŒÊ­Þ¯Zə6—¯µR±•/þŽÉї%$ÉêYFU~j܂¯ôëSb,ó«Õë§WÔ=Ûµ§‡ëßõ§2nÄ?7¶/¦Ô‚—ÙF¤öА¶b'šDI ’Ú‘.A‡W< \Wo mn8;¦Vs²J´ŠlŸ²^ˆt {…"‹64äãÃØæFGê`Wð$00ª­ç°VEQÏ VÝ)I©#UڄùUò©\¾ÕDW '‹¦ÑtE«UpÞ.-Ú(T}YØ.Ä»…š…Ö݇SÍe¿ñð¼QlTؚºöïaDŽðûûòØ Ù0†b`\4Çþq_®Ž5‹¿¡AR¬Ž­>ZAÇo€N£ØD_3'õ@òü®œo젉“.Mì÷ÚëX´ÙHi,HeÍ$w‡zd4=™ñ?­B㏵j(‰ëòØC ½\{*þŽv‹õ: 4f4_¯ïQñV«éróá®*$ÃäV…þ}…ÒÕn…ìšc¯Õ -:°ÅgLE@Ò׍‡ºdRµéY5¸/Ú0ÔÿÑnùNÔ]ú‚)õ{¦Êï"µ¬¡Ú ÊÐg¸ª5®__ ¬U#NXÊƆ1ÞR*7ÐOöÅIãž)ÕrÃÀh–NGB-´UV-R]g°_D-m¬köZÅêM±ÁM:õ–9è‹Uº—†=î¨1¿Õ¯ÙeÐ áÜQ¹tøPþG/Ó¸~FjµØ*ïß¿>—ªÅ‡§¦~µaP×ëem$,š=ªýW9ô)҅Fa¦Šufý›n]§bÕ,:dJ£Ð~pùZ*^°¶„¬˜–âŸZT¢ ¯a,ñ'ó(o1C՟š-üCû7¬¢¿[äÎVUá]ÊW|j]?5¬fÒy=è»m”_^uPèqI ‘ë¢ýl½¢:(:͝6ôv@ZQƒo‡:jDZ}]Ⱦ|®øT!â$Qˉ\ê9aNÙÒ— H\ô2ºÆл%ˇ=OK/£€áŒ‚>ºÓ/?râ»}­^«}yc‰ÄŒ¯>ŒK/3JT½@É€AA2&¤AéÛz…¡;Ÿ’[¨ZÒÒ08‚U3hL@Er£'bÒA£ßñm•ÔLý¡yýü;çÃã£׉âæ†Ep“Ç Ú"L‹úF ŒH*É¿©' iÕLZ¢ t5”}Q½—´…Þ4Oê”ïsÑØ78kŒ‰H #¡;i@Z&­±)‰–½í‹êH+-í!ƒjÍдµŠU2ֆ’1©S ñ»Úƒ,  Uš¯ÖQ´ñWrñEh½¶“w¢æ–µé ÀT8.È£jìò¸Z­Œ¡ƒÆ$~ë‚ï}µ&x_#Ã2•×šœÏ¦ŠV’€½!5ÂÚüKSÈ"Ÿb-ò»b‹¼Øµ¿Êý‡ŒE:)±H‹}¹™·ù3`Iʚðe&IýÚ0>²Ց¸y3ù¢“ŒÐmõ8_쑬`7–9êª7Bû»Š¹â¶b^3ÜXÌëú­%­*ó+ýºvá)\¯7|L¸¶úÞaM…ì¤M”zOm«¾%^sÁòjv3Vú},Ýxø ßø¥±ŽE¿— öö,®e%Qé^ÇԄ_Â>ÿ†ŒÈZ{5ZÂ÷ ¿Ö*XãÆWkÜù4 Ͼó›ÈÔ¬ü>ê‡KK÷½ß4JŽ_ª?ií/1ï\W›ZM -ï´tÌEõ»çŠ¯É¿­ñN ÙWtÞ¹np–,¥"ßV[¾›'I—(¾Ó|-qµRšxëMߓ« X–¦¯„ÝÊ5_©–ïŠèÂ͗Œ´ða!ï<Ñ×ØêצOdï5ï‹ʂT| í?p·+©ìhþ³îÓÝ·„wЦ°zÁá…ZýZÃ<ˆ_hjT¿póª9éhŒ`ø¹önÜ4 9x4­£ðÛÅjµ¦i5Àoéiáëg‘âpøö|cGåLdÅ(Ï3×ÞÑÖö™{췀ŽðàÞñU_pÃ;Ȳþ ÄHvobTªJ³õÄM(uƆo¨1ÑÏØ÷…>2ò›ú j¹§ªáBՍm£Ÿ0ÝÆÿ‚Ž©ÍyÈ-”¿“¨óf‹ÓZáxHû͆0‡Eês.ónI´a¤1wÖð±îì){M1$èïǵ7Íp$êÚ[­û¢H„5ß+6K­ç¢†ÎA¯2ï4ÚC'pv1ˆÖÕEEoòø¾Ä=µ&ÅZaB†B/ނ -åîÁ!£Šo᥄8-Á\‚§6Ø÷4žmËU©klü0Ó3@Boù tY Ýí­*•÷ñ«0¤‚—¢A墣P¸ÍÍ)üZCt)…ô@»%mGÇÀhé/·D[tzï6$@Wïm±šP4»àןÑVµ´Ô^æKmà]Q© ¼-Sn*X¯Þ¸­Uµ.FX²øp•÷@ûI¡‘²Ë$ Š†\¹(;CÁ›wFÔBRŒjµÅI*¿ÇøëèÉèUƒ þaéͦzÎh0[šÚö-ы5æÂg±…‰]æ^—FŽ -«p¡Æsí+bášéI–(Iæ„K´ÎæžÙð^­øÅQo"|õ.–ü”ß»áñ.Þ·‚è¯@h~g6È?ØáÿÂ悋û­dú6ž«¬Lì.Ó·T!Á? xv#÷vwpeÁ>ãwîÚvo¢2owožÄíÓ÷ðèêÖg÷¾ÎîÙ§7ŽÓöj#@ù -.œ}؞ræ.] -n]%‚ÉX09‰<ŸÌÏ\ekÑ£ u#<¥V.Ë)›£ÑH,”–§ë›kKëñf"¶2äËÖNB‡™ÆÙ •>Éö³ Ë ×´g9Zes NîxS3ž]È/Q«.S!_0Ÿ„k{)ßl4æšûÉô*åí1ÕJ֌e[‡‹ZeŠº™¢qÎ[B²sª9iÇ^½‰œ} -W÷Kºâó7c¹Pìeî>æžàׅ´4Ó³ÆùÆَr¦¹èExvõ§˜éÅäfÞæe+dyXÏ9”3·»MÚÑPÎt›> f=B¦6‡mÓ9½1£’iøÞUt2ʙ†ÜgÞùÀrMdz!›câ þ”Wª+•M®/©d™˜¬6Ü *™.¨ìí析)ÔE”mÎ>?E¯]î+fš[ ì«6oà$±…3Y,e¤}z’|öšÈ£lÝí½ê*OŸh7dªµ‰RžJ²™n;²LÃáç˺© ÉL¶—óûê¾J¦KÅH4;I+fz±xµ«–éŠÍ1t͝)×uÞ~ޜ¸/ï*gº“r'^&ŸóJ™zçžfB¦Ð/RQò,ž,m)g*¨lœÚTÌt<{Ü}l)ejsPÙóó¬J]#ŽJu#¥–i‘ÊM_*gš£–eW´€3µ9ä ܚ˜^d3-̸d ¼¸Z`›7sVÉJ2=™§òÑeê‘ejs4ÇWʵÈnq&ÙFërù͟žU2LD+7Ù µLÓԆç<Ž3E2&«ëêËìÒccsW1Ó½9gP5Óõò^RÊiþÐé µwéWªks|}¥¼yzâv)fzè¬Þ©fºw¿sU™Úíu=ÍQ‡ëõyåLóAÇAvi~A9ÓúÚ¸R¦ “Q¶‡—¹ñ–JŸnQG‹ëiåL7™Ë‹ósÅLÏ·*«8S4¿´×õ±¾Éªdz£Î›O3ʙn>֟·â± ,SÈg{¹:SUmà†cÏkWÉ´p@ež×3mΌۗÎg@A¶³/òAóz½d3-ݲAã>É=8Ӏ3áZ‘Ö4O]yf—Q¦ÓB¦ Ê’}|á”þBCži³6µÀfÚZôÊjj?+žº™L“zUª§̓„rl}íZiu×2MµÚTáÊx„Ét‘^Ÿ‘)Âézh“™i‚“³©uœ)ʅÍv²Ñ(–ª(SJ–i£±\®qò»f—eÚ ?β3ÍâìŽOÖ¼ãµòÕ¾ÅåâeDZ¨•ƒ©‹Ú¬êÓÂý|¨öôžZ¹r¼ -OÛ4?¨Þô”ʯ¡¦¼)®\å¨ìi$F_î³O›•XÛ¨ŒTïǏ•ž3Jq{uöLõi,àÙ½Rz_¼pò-Öþ|90ur­ú4ï­.ԟ–¶n焧²‹Ll_—VT~[™Z™?h2Oo/qÙo¼8½¥ÇgÛZì ´¶WUzÎh¹´·ÒP}zä(ùíêOÏÒ³ \‹)<¿r\D'UŸ>¶¶ë+ªO+‡äŽð´­Åž+Ùąگ¡H;saÕ§kPâX½Å×ÕÒ^^í×Sö©Õ3êÓÌòF©¬út-°8N«·Ø²=0éžUy^¡2 ®Î³®9ÙSïþNs‘}šòÍËGåÊþUγ,<5CÓ»ÒXŠºqž¦XýsåxBOëìr4{fTO²ÖÜdþ’è±@k­0Sö™µxV˜ûˆùÐwYûtz7…Ø^¿ñ«7FG°ùw“œækŒœ Û3¬>‡uŽ%&‚NøáÚ3h¥#þXÕ ëØãWP­ãSßí<Ÿß„ÿa¡äí4ži¼^ùf$ê¶1nsÙ╎J¦‘ ´Î9UÎ4T8QÍ&‘GZ†ÇÄuÅ+ÕLєw­–é8ÓЬ‘EÙÆ6“{¢Lo¦¦&„L1úç3 ʚ¡¾¦¹'I¦î^½Š³•4ðB@5SŒþU2…õ  ÿ !S¨‹¤®çª™B7Cê™"ô¯š©Íðÿ½r]çí>­LóNÕL1¦2Ec_’-Âû’^-ǹìñ_lG¸S'7ÏFÞ»x}®ŠÇ¾Ê›‘‰—‹Ìñ–î{á{VîXm‘„:Ÿ-³Ú²mè^¹žQëìŠ 4‰ìkƒU.S{K²ï˜˜X¢îºÙgëH'1ëýDÝ=_çStá$ñ•ÉG\ŠDÚKúïËiÏvň™µ™mñ/§Q.9qu¯ÖY›ù`¾˜B€öÕõƒÛYu,ªÁö”´y‹˜Z ;˜!<’®’” -U‰¯Ê -%.Òå«Dwc:à\¤Dv4™979hËó×äº^£#ÆžYÌ+ÔÏiW­ŸÍ!Ô3Õäúoo\¿ÿ&øúyXSª!¯e¼ÿjX>™•…ÁÆÒHŒö$³ªIٌˆ;×Xs3I– W’™‘¬ÜÙKç-¯ØînNXIî¹åɓøšv»ÛÔKªzÜíªç"#U=AUÕcÓÝÌÙjC܀|‘% 8Ũå¶»È Ã6°Jy¦3Ó cێ®*·]aÆ®ª¶ÕF%¶Ç)V­0ÞyÕij®\pñpC¯©sëSìn‚bAÒ^Y­Ä³˜¨VåmßÛûmj4¹Ö:ª’†فåܱ¨mùa(–ó+÷î8­ÒMÓuº8é\Áe`ìü]6 ¥>Kß×¼ œäˆ$u”£&¦”nwÑ.§}ܳFǝö¨ƒ¹²8~üªÙ—ôô=Ø©W´IÑ& ]™u¥î„w(bС‚!º]6 ~¼l—­¾H¢rẴrŠ%KäJMµJ.Qåց¿ …µw‰°âÛð¶wÉMN…U=•XÓæP˜ `Fáe@3§-ÕiÉæè¤s¨MV:GOJcÿ&'ÕÓ -µQ&^"µ×TçÊ­]¶xl)oD“Ÿ–uÍÊÀpE¦Nj~7%šÚKïñë}…Ä$;„M¢ÒýA'FÓ.)âLa7Õ¾ì0¤°ó©Í¡? L7(±€¯ã=>|9=†šR?g_$³˜\£5+î6Ö¬È7ð h4E I -fé¥Wv h4nõÚ ‚—'¦¯ÑlwPbÝk4~Tæk}ÐhÐkJ­ã±ét®ÑÚlL:½k4”Jï{¯8Ý é¤‹ßÅñÛJh@2 Ö´VÐâ­CeŒšÞ•ú[š§Í6Ž¾ëu–›_n/êjÈ 2KÁ8ßj) fÆߙš…Äí)Y›CUÍvéý ̇x--Y‰wP ×dNMjF?cÐ^5l‡tzwÀ©¨,¨e;ïúéH7Ý š—vpbý°U3s!ÔϋЅt6„ogzÁ÷"!-Žï6{^ñµf‰lª³áQGø^Û‹ëߟ½(ͅÎb¨×:7iµÏb(^ð½(~.ì~Ãé(à{¥TøÕ«J:FgCí¹k˜³—žgCÉ\x)ß'ƹÀ·}qGBúGÑ‹+%ÎS‚†*¸lht‰¸)§ ì¾÷b«–Ùù!±^G·¨\ -c[Û×Z£Å Á]®'Q.j+"èKŸ¡q®±{š‚ö<ôkX® ¸ÓɊ¤*Ø·GwxÉ'¦”o¦mZJùü†Ö•&¦@òøFÕ=OÝsMe½% kJƒ«Ô쟷-$¦ºwÃ[{Œ:ÔCbÁɹõ|?,$ÐbÑÎ †Š"êÉKŸ!,“˜Ê`/h:ß2aãì÷† -eP"Ú;#3CW˜Ï፪âʂí-×¼³ÏTw.Ñ]ÝûÌrðÅÍe”"蘓[z¡Ïbít²ˆ¡®cè´#è°NîC j¦8‚N5Z°Ã:í:q´`/1tÚtÔ×C v$Z°‡:í:hÁŽbè´#èp´`bè´ßcc«{Ž¡k¸’:~eÑc vÆcú1t‡d³mgV m«ûÀ«Gɜ] IÑқÖwÜö‹—ÊÊÖÈ];æåèWÁ8`ÔÒ{š–Îöuh/-wØ躝æ<q•ÆŠòs¼ËH0Xù±|¨gD‘îñi%¦í‡e¬~ØÖ§9g¸~2ËUûx1Þèþ΋¤ù¨c¹Ò*’RȪKGAs†tMFæ -"øöt@ÕêÈ„ñStéÜl¬f4Æ'ƒõl¯*ÌLhWÍf0ØMê Ù©aK2ôy¯c&ØMmÛFºJÒ vS_Ÿjo8ˆ´eFÓD²4Õ[†ddÑ ’Hac‰I]°èö›RàE/òјÎ*f;ZôâQ©¶ì-Õ](; -1űo£õ×öÐXJ{Ù<k7é+±ºÌL¿=PtšíbÇ*§ -»T£ÀDHI¦ » Çñ½êùÀwÇWҋ™­ÔCÓԃ`´¡t»¼sá~B­PKJ!šêý§ëo؋à&'µ`*öŸÑ8¾XC/&FK¤Þé(±¾Eˆ6„µÈ”Nӗxã-&5°öØbºa¢Æ+)h´®ZLjø $ 3RG§™c½B$—1,Ûfóm_fñC}WÙn©/'KB%Ê¸tFVHâ*pA#v¥9ºW ,öøŸÎbïnÅðbO-¹bIèý̟ªa,T®«º¤ôçÒ( â¦od°iš¤QTšÊ"®Mìµbäl:aζDrµy2høÀëk4\§nk÷wÝe£âñì|ñ´y<;_t:B6U­=LJ½ C!øHdUèuBbšÇÊ(é1ÕaX¨†hµwgëEEAëÏiÀ8Î†J<2¤Ó—@È´ßØ,¦›Žú‘À*§i©¹Y· ¬{šÔ*-;­Ñ=ÝnÃBÁgÚ;é.¨ùˆTz¼[QÕî*"µ8~i ˆÔ`Djq¼dÄd êחˆÔ³—þD¤¢tú‘ŠâÅzHE©ô#"¥cìhْXɯõCS;v2rÏ°½/†Ç=CY(œ²ëw(öç×ôèéG(œb¿ô=®{»¥´Å´×î¬+{…ŸA„ƒá>J(œ‚Uá#„Â)ÛÇ ®Ï -ZÀP¬ -Äç'k>Ý«úª9^ŠÇR>e‘QG/”TؐEр%¦~²]‡¦íáN7DÑèƒ[8Z§ó‚*Wšò„\ôƒ›åqugªÇáÈ'Î:ª0=ãÝ7­”ÛøŠËÄÖ}îé°x™ž¸yÍdã“KÙýÄvfÉßr‚æÏî/F øÚðôI¦±´¼Ù_K%}שTÒ¿Ž.!Ø«sӑãIZdÖâ$ÅRŠ:C«$6FéT=î,¶3»-/i°ÛÜõֆØø,Ê4|ïqÌÛkjv¡Â±V°Û_5S*»ŸÔŠ°sl=lÕ2½ÒÈ47e*Åšõ6EV8y°[èø>ÏßL( wi»Ñ>Y¦ÒûøæžÕ"ì"/‘×3µ`·S­¨³gí»Úþ¾j¦SùòýZ¦eíûøvŽÕ3ÍlžæT›w²œ»TËtGa‡{,[kü+ç³ߛSz±*HÞ å ¥ro3ï±Sg>¢D7¹UR"ûú$ŸPµlÇ\n¥Ö[eê"Ù#ڞªõ'´GßCUn5Q¿ÇêÅ@‘Dûb…ÒsNÕóó`V¯ý¼INéÚ…3U X—´n’ëÈ -wš6ì"© ‰Ï„ìÀ¯Oï9M¿>ãò¤s‰œjý”î}Ó»lÄhýôï0Üèz÷ŒÈÎRëáþ8ãã%WV¿ˆHÕÝÕètږÞn¢éº³ÃtM§´àîâì_4ÁóazŒ¦S² ÊÇKïÑtJ±tÝF>ªGÓ)Ùâ•=í{‰¦“4 ;fÏë)šN))Bºˆ¦ërFî0šNiŸ†Ÿ+ûM§K'^ï÷'šN)–ΠoOÑtJ¶vîöþEÓ)õ.¶ôö5šN ܈}GûM§K§rÚ|ÑtíEºŸPGJÝFÓ)S›£ßÑtJý§à Õc4<)Ý;…»Š¦SÖý¦3Þb½DÓɒ’ï‰÷)š®«ë8šN3ƪoÑtʱÕýŽ¦SJrés4Òn‰Ì¾ÑtJêAºzíG4ÎÎHŸ¢éôç—~DÓ)5†€ÆûM§É՟h:¥X:Õûøz_Î @Éýbݤ~‹Wû%•ò»9 >½è vIã‡jjwÙt_][‘Zh—§ß÷Õ©£ cíÔò:;j'¡•$ž(&SXI€‚JÔ³Z¡dE2ª - Ü.'ݘêªH¨Å P]»¬U$eG -U £ÑN×.«¨L4‹IWD‹ôZS¶" -NÆë:›k[æøÛ²´.ºëùš;Ñ9W!y7×Ü©Þ.·n(VÉà5wj‘\Æé 9Hhû' ÝõÖW¹BÝÈ-3šV*C×ÜéZQÃô|Í‹a´/ºëùš;&öMç¢;c›Gõõ>œs\< µ;ÑxœÅzß\”êëäî:–ª¶à6*Ÿª»<è‚:]ßC=ùDathñ¬i7HgÄ£Ù¦a¨îÄa8¾rÑp;ìÀ‰ µŽªéO*ÉÆn؂œ'œòx"thªj•Î†RÛïÉm?wØ%ñ†¡Òñ7ì Iéúö†‚ÄŒytk;6cÝחÈÇÞ·BЍ‚ǁ³½o0Cw»*¥"òìÚëÇÄ©´E²+F -ëDzãÄ ÖªÝ!¬Ý«¶ÖîUûw* J¬/cƒÒQfâ¹Kµ)÷•šR÷¾W-jOû–.ŠÄk÷ Ö\‰«ùP—›•¾D¦ð'wŽ$ړʿöëCx°­¾ElxìttQµÚîºx­g8Á¤¢åÕÙA:}8%€I§×Ûª™T¸A¨tÂag¾ª:Úáu{†á¡@Cøžo¸ãâ+Õî¸ëb*8Wt{oug7ÜiE>ö0 9Aco¸ëËMyºñDÆnÊë5žˆ¿)¯÷a¨qÝ4.ÉH|H77ÜiÝ÷Šî¸ëü†;£§š£è§ÞkÏ^˜£¶z5X ‰éÛ ÃÜM×]`­<ò1Ü«ýÅn(†CwvÎN§ ½ÙvFJ§/ñœ”±µ˜n:ê±°² &›Þ1øº¼Nâە‚˜Ä»¢HAL· ÃY—NG°kq÷¾ c2Ää\¸¯DE³˜‘0&i%ul§BR|¿¨†1ͺ E¨k.ÛùQ9ë22*19ªrðÝíºò¸£ &5"tw¢ÆLÛ0ŸT¦êԚ]÷¨sSž¿ËWÑøäÝ0 D=ëǸB‘ G=kŸ² Ôù¨r~ôCo+ ûé -Jú׎Òåµ=›#½èÝÛ_¨]y#ðWnG÷eÏ²7gb<ÍL<Ø´+²³I‚ð6wřJâálŽæÄaa[lª’ÞÃ6›:-¨ÄùՃð¯W³´T'ËÂð(Zì_db2ºë>W Â;SÍê2ž­UëJå&NT3u®–|wj÷°¹…LùH.¡·ÃQ¦Òд¦3:%Ü#”E9º]‹§OJ™Ú¨åwÎIÂðŠòØ?qó®Ïo«d™p„6ÓW‚ Vw©‘in2¢žingâD)S|ï[lEZ)ÏtWëÁõCõL3™ƒ¬Ä³ ²Dϧù¿Ø ÌWς_Úû*ïS”ê{âøJêÊ3»l Eïl­•¦I¨s!$üf kí‘Nž) ;1?Ñt›„F »ñnä3}ÇIs3¤½ lÒµ¨‡$µ»V© I²z¡RFB›ô›šýº™tunf1jIJk»V©v]ÛÍ,Á^'.hZQw²“'{ˆJÓñÐdZÉfLžd›^Ö·Z£¸»ŽoYT)R›—–|¼nôŽ¼´l­B©Û‰;+hKu?-¶&uQØb-f;ºï@]Ãdû¶F.få¦Û]o&àNmã+ýëë$%“ÛùõMvø>>U«Jè¥Í ktŽGTî~r.«ovHÖvŸEײiG2ucïèœQ‘dñ/79-Û±.—IäªÏîV‹Fm‡¡€•I¡œâs®4Bõ®4Öé?açý&§¨cXd÷+Þ2ÓAbz·è8åѵ‰Éf•ÞZL7–Çx%¥;—=¶˜î}:µX>t¦’X[¸°:d[¬Ë(@£1€†Ï!Q 3¨án -Ðh `»=¹“(@£1€â;4ˆ­Ö]GJDEc…)÷ƒí, -Ðh j±î£…öÔÖÒ«N£Æòk䮢UŠÔ(Þ¯dÊÓ^«Þ/å3~#[/—ò‰êò/åk³*|”KùôndëÏ¥|L̈6@éýR>›CöýR¾öû‘?Æ¥|ê÷#÷óR>C÷Wör)ŸØª€ -Q-ÛDz¡Áê·úõ~6ÔZ?Ά2x¯Ÿ¡³¡z¾×OTµ>œ ¥v¯_g~JÝÞë§}«_WgC)Üë§mR^‰w~¯Ÿ²ðiž ÕŽ~ú’܏{ý´=CxËU÷úéErõÉ «y«ŸÍёAWõ^?íªÉl]ßë')HÛ­~]Ü¢x¯Ÿv…”ù‹ßïñ^?͉.…g±>Üë§mîè*{ý´—ºŠ^Ð]Üë§&) ½ÞîãëCÌ{G÷úi§‚ìüý¸×O{CÅf8^ßå©ÝÞë§5E·ú‰og z¸×O6 )é­~’3»:O¡ø{ýtã^ûr¯Ÿö­~¼$÷x¯Ÿ¶Ãµ("µ§{ý„ø-%Y”sÕõ½~Ú ˆlîõÓkÍJ°O÷ñy´S1|ŸÎur†ïãëé^?>ÅáÓi4GÛ½~qºÞ¶åNïõÓFòèă~Üë§6‡¶ï$v¿eÎs;‰zÃPï^?íýf©A÷÷úI[[¾Zìö>¾Îœ4ÔïãëÃðáoõëý>>#ALz§7´ûjtvŸ<"µ·{ý$†í¶[ý˜ˆ¡ÞïõãC¥´îíù^?m˜£"cßë§}«_ϧ6±÷úõhë3x¯Ÿ¸×>Üë§}«_Ç÷ñu…+Ӗí÷úu /ºÕO”KO÷úµ›’Å·ú©rÖé½~Úî]²Y¬ë{ý´d6¥®ïõSèÑ­~Úç¿ׯ{»¥´Å:yRYWöp¯Ÿ ¸”nõëÚ{Pv¯Ÿ¦Dˆnéí^?m`Ȭ^{¿×O; –‘{¾×OZIù­~mxÌðIVÒ{ýÔAƒatN²2x¯Ÿ! Óó½~âžlßÀш®UŸÊ÷úiOšQœ} ˆeæ}¿Âôp¢…Ѷ”=>äçJÝ3'*ÊæJøVÝ´«íx/ [”H'cÂîMb¡.ŽƒglSlV.É é« Cù·Ê¾=7%+Ñ|žš÷v˜VÖìÞÓÍIÊ\‰2/¡x*ûäFbÕG¹ªvÿõi=lܯeOçñkæÙíL¾$©•»Í剗×dÄ~V¼ Â_WKŽplnejcëe7üR)œÚÑ°/tÛÈûÖ} {8Ÿ ]%w+‹7{‘£ûýòføåÐU¾ŽíLìïÚ}ދ%{àîåÐ;t.QÙäz’ÊÞ^¯Q¹ÈÔn£qw5š±£ÕæÄE¤Ô —N·ùHË}ï‚æÈÌÇǹ°·G£yVC—ÍÅ'˜Øêv"‰/;É_Ɨ¯wêhAÍ_‰î“|½¢žå¥üšRcáƀ궦P¿'íªuō®¢³¼=qx²Ÿ˜¬6üÙ©@èîuâéÆ~ƒ"I׸àPûët=´‰üÕ6ª8&ѾœÝßwP“å¼Þß®I!{]6| jÛ)QМ`oU ԚR;$"ŽÔ«Í‘>ɖñš©óÜîqd3u3¾äoͯ-ù›7sÙøDe;s´¼€f«&rO‡ÇgË+{ Ò9|á’e®ÏtÑÞJ…2.–æòö®Õòs IòòúÑÑ¥7sx¼‚þ‚ -o?ùPÐî4³¬O„ ¼r¢ü-òF¸l1šØö9¹¿h¶C‹D«ð1êÁQ¿ pVëðqak˜ 'Ìb§ ø"åã~˜õg3$»ByÓӎ׬keu•žvÞ_r]w‹Ä[EþWü カ9øG3âGÑ2ÿÀ/~POÝñhу\òElzÄ߸JøeÜû›ÓâGw¡.M¾ß^™\¢Ð”0I¯Ìdƒè š¨V¡WwÑÇqÚ¥;/jٝiæ•ëÉè,¿/ª‰W’¾žY ÑK~·ôL_/®¢fÛa“½Þ9ÀÉ¢ Öù ÔÚ^[Œ§¥É€{&„Ðÿ¾¨YîÅ¥9&—9´á½›|òÝy–·¯oóéõUûž ’ü¶@JºpuHœÉ€{%;¯”Hr·)îäø“áÖöd9w~»[Þ{|ȜÜlS¨V4–^F’¯ç¯K©‡¢Ÿ¦ü…‹ '^û!QÕӋÑk®ÃŽfpÒ;)4ù9±?‚´Kçèn¶#š…»á#]ÔÐßAæ/éÌ'Ýܒ {~Tj {<è¡Åøa?{¾UseŽ’kI÷SÅØGV’Ê·ß>ìå·æ: ô,Çð «n®Û5ΦӖ—‘äñE“òWÆ}þ‡ñí©àdü¹EQ._3s]y‰ãÁŽý˜±¹>†Ü8J—Îœ-¡³^øÇÇÓ¼.9ƒ_Rx¼¬ø0,Až#>¼¦s>´P^ñ«˜DV(^@¦Dæ ©.äºùBOSÕ+~ôâÛÐ8˜N9Jü·ìxL…†×ºO<öïüéµùEùyŠ -—Ö´Bw[Œ*Hj>F¡ªŸ-‹;žÅ&)ñzú@€XœÛŒimみ#•™‹0tãn É¡ù&ún¾‹½2/O]ÇÖE° go¹š|Û²pü¾'ç ­,?S7ŽjºÑX¨yÄs3¾Èy~fƒŸ:W®x!(€)f^t$'Ó\×S²P.I¿( :{œ£y ‡ÚÄ÷Œ&&ž“ü‰ƒ –PÿÃôlË4÷Ýá ÷]¡áتzƒ“óóWÙK÷éºÍkßÍu‰ô£Z‡Üè,†¸]¸l]^mçN†ˆO°×qb€jçÅë³â´ߊӐ+.õJ$¿$é@½Ë¢¥ G\üñÎ+.H©N‹ pX\ÀÁ’£¯#©‹½`!HèUÜF—@@ìî[/K  è—^—@@Ò\ºZXA¿ôº2°Â’ÜÛÈÀïðö¶2°²õ¾2°²9z^)-€Ðlæìm5¦ÅüS¨\Ü endstream endobj 87 0 obj <>stream -7ª¬Ìo•=L—8ö<ì@‰Aá38Q8‰àâQ¦ˆÁÒ H6V\¸ãєŽv”W8̏w€é™S/hüxšÁ²ƒG²V³µÊ­»Yw@|Ê;6áU -Y?wðJE¼+ -‹… á'uãrͲ­œ˜ÅÕpљ‹Ùyî»%<âÑ®Äî |Ìúx]s5-U’OãÕ,ž¯ð2!¥ÄÍ¿tÁ Ó¶¹·¼Úôbx&¬;þ°Åè`h,ÅÆü»¯OåÆVãáî¡:6m›³ù—Wiú zSË6Êåýò?[éÚõës¹Ú›ó/ï¥VWcátùºvSÃ[s᫨è€&wv×Ql •lG2’™¾ç*+» Åô-UHˆ6+ñRÄ\Y°Ïø»6²šÎÛezÝ>}ÿ¸‡>fpȘj-„WÐ¥ÏDºÜH¾f¼ù#وÂk‹ðS)ó è02¬„gÑùt÷§É«ÍÀ^t}iq>^ÏแµÎIlá"®‚É–P­)»{~3„ªqˆJ Ç>™ŽùíÓî¥%ôíšÝ»3¾i÷^û6уEûÌrðÆ>½q¼b÷¼L€â/¾Ä„A‚½ì -=Eϱ‚“½äÕþv ˲±†Ât~—ÀË v.Bkuôk~­îÇÑpq±=–‘_q³ãÄù‚D_ñ²g]3ì8a†,`6 €z-ná¿J ’ ƒ ç$<êˆkXðŠ'S ܃,;Dà yr°È=Zõ ‚“swËÜ٘@“9 á;qιԴȨy!Î;·êCJ׃÷̋ñ0 -_áÁ.?ìðq{IHû’5vlgñXö~,'±´¡Í‰8ùLñ[еÛ[~¤¼¦!ƒ—Iøx€“õ0ãß> ú7ö*h~Ú÷Šæ'fõ[ÈÏð™^q¹`‰?Kû‹óS³wUçAv>zٔ‹3£¨x Æ©1~‹$%¬¦„•Òc\> §ÈïˆSt¯Åvâ±\vÉYÞO¯Þ,ØÙÑT8¦ùÉ' ™|ÜO—¬xŠ!¾êE±x•¶fðÜÀªÒŸûÒ1E—ò«nøë”f§”ÒE _ @_•Šh ýmÔ4#•‡=ÛóŒ[Cl‘ûÓ/õ-åaÏëvØŸÑØïjnìhf´9ºœ;šmŽ.çƎfFéÄØúª´(ÞC ËÝkä#ŒÛÓÁ“Œwa/sƒŽŠÅ«Ñ˜_?ò -&³Ô~)$1™…W&^"¯\Wy¯¥ílÙ㠁S'µ6ÛÞBᙷí´C…m±q0\ËÊ®ž2 0›™{L¬“´ ÆÔÌàË^:îçdI¨ ։w’i7û]ñÅÃ~W÷¢þ ó`ôFbÔd¤¿#FÍíf« a×rA6$TÐqθ$²h¹” níæ6_3[N³•pd)¿9S•cÀà†OÜÔ5·M‹ÌmÈ&K(…ƒj¹“º7o2—Šöb -b$5;BÖ 6‡´®NÁBŠ­˜|çâ$®·6ÔzÒɜº'-s$­z)äIÇsÞÎË rdpŠ»¶«j0‡Ã(4%n1CՈQñ+$q.“}q“K[ìLþ¦BÛ*¥(Ô^ÓÌí²9´Êh¤’.A䨕ô^‰Ïª*=öØ»áƆ¶PûI¾K -缂K!`ìggþ¤[ƒ0 ;~LHÎ/m?*$NjÎÔÌG†ä"Ìÿ!9sJì#CrÔ/*º\¬a>$?$G2 œ‡äI¡Ë˜‘Ê‚`X“3?\ˌÀâøÌ^îf />SÑD~ÖDOý¢Íÿ3ø"ÚÀÆXfwö,1Æî…ØÑ4ëzáFÓÒ >ʍµƇ¬»Ky;Êj z§ÒO>xæöbéŒÇÎS| L -™oý -–[¯‚Ñv†±×2[ÕѲȍ’ˆ®¤®*Ë7Hƒ>1Àxfrõž7·ºy{PYø},ÜÏ-y\Øàppóß Û´Ò*M_fª7bSÍá€oöÊ­×:z!|™,ß=TóÅßË =ÆüGÁˆGãct 6‡áC}›/Ù\øÝ1Ú=–¯Ú—þåF+ýpÝz¨U‹ßÇfÑWÇùƒÕôØìóî%¼;7æ‚ÒP—ð6¬ÁðÕ?ÆBcc§çÔØ Êh×FÓ!xôlÃõA¿‚Ïyü­ðzr«\;¾Ô¯ˆCq}ÑPœ -Œ‰Š‰RáX Ž¢ã¾T¨ˆ»ð~ˆŠåàÏðØ?lñ ¢è±hØGâA(X€öÑhsî(RÜ -cü7tÌGACŒEƒ¾ Ÿi_,KÙ¸/ŒDQÜ7”/‡Ä¹$áûx,ã2å>§l¡ˆ/N _äm¡0ú¾Ðø¡ /„'tÀ¤¡TÁ¨/ŠA PÁ0$ßD‚Á ÿM}CÇPì7Áˆú7Š>#“&÷1î‹QñptìÚ&|ŒÒÐj\q¨N(ã²à>§lѨ/ Gøoòè›(MÇùo¢ÐÑp€OSøÌåÊ}ËK€+5—…PSô E5E}AG„։ġ+ -®õ"1ø ™ Î -‚ÐàñÈV Àøèp(È÷!ÿ™íeH‚ý†„¼ð+)\’œ$Ʉ/e+iH=͎ÓN„~Ù) DAÐi -†ŠŽE|T$ ¤sß@¡â¡8jî€Z/0ôEa\CãQ0Fb ‡¸/@´ƒ¾pDx$jOCC -¿ñÅCH<ùD™Ï\¶ûM,à SñJƒû‰…c\š±t"¨6Sî#J‚-÷Jƒ-<ÿ#¶v|¢Üg6ÛT[‹ämMM¥͏µ#Û¸Œ¶½„֍Lá± G©î‹@ F‹…a$@Zà{\ŒŠÑ4ÿ†+‡:qßäm2Q,îø7 Ñ|šÜg6Ӕû"ðáÆÏ ß„|‘X<<Æ%ɤèÈ—)÷9eã -Æ}“·qEç¾áªÆ¥ÉfsMÉ[#¯)ל&á 3óŸk{ysk3£R;L¹á»‚è¯ÁÓG$ã0­ÄÆ6lÁ Ô.¦’Ï6PŠñh$“&Œ(È9Õéu BŸ‡ã¾p(š”k~š2…‘„ôo,‹Fàc4! ͇‘‡ßƒš  aMó… WB4“"úAæÄ0)hŠEMŒ ÂÛ"aA¤o¡DQ“@+ã’Àã`4Ê1 š‚B²4U8ă/‹†ÇB (©8Ö1¨ÔX”] <˜äCaH,Œ2ŽPTýˆ -Âl¡¡| *ð9B‡Œ„c¾XÔp8àÕÉÀ¼N: ‡@3‚†„‘`ý2¥ÃÌTˆQ1¤Cã4”f"*JQ] ã# âG OÐTº!Nû¢QÔZh#mLZÀ< -ø¢ahgš‚rGBHîÚށÂL ⯄PƒX«ÆÐ8ÐÌüFÇ!(G4Å3`8ǒ‚©Mgq謱HÚ x—X :!}…#I‡òƒ¬@)¡æ!T¸(ôîmø‹™iA¡DÐ÷¡X´!ôYŒÆ¿Æ`rYˆGB(ø+Œã‚¨¬ ÿÐÉQ$”cR‚ÁüˆÅq⨮4„¢!ø7ò… Í¡‹ƒT,‚; -µx Dý„^‹Å‚¨ Ñ´$2ãÄê,hJÁÐ ºN<²B +üÈÂHh,‚Ft\e b½F€A\2Š -àΧѠGˆ&ŠŠ -=†>œswMó0  Á”$Åz&ŠÍÝ¡j„f`ÆƓ=¤F­¦!Kó`†´Y<m Fi˜Ú@²c1heÈ"ÓC©X0†‹£ b¦ˆðf”Fsm&ô>(:ÊÌo l²ÅâÐÑaÈ2Œ†D0„‚¦3$ -¢(I˜rchˆ1H‚¨ Ãaáü—ª BÃXQF£Á IcЃ„ã¤7‚ðƒš–Pƒ@ÊÌ aDŠ  Ó¾PrŒ!uF¿1õE !„ !ø •i¥¡ý~·Aᢡ0þ `´0JfDÐ× •Hú~³!=ˆ`äŠqHá4;DÙÙi#˜Ä¡úñ ¤pÍ 4ÖXÞ@QBa ”x c ‰¸†‚Š…˜^'q4H@Y ‘FYÅ@!¡R#4…à+h ”´eµ-l<ÿєMF:tq$Ž$ Z$Ž1…ŠƒöD ?ö¦  D@U"í áMèçP€B… -ę¿‚è úW&ç¿Ã09И£âc.÷Øñ‘Ú;¢5Wö©ØÒXpq a0÷ʀŠW~ñD+,ž˜uböá©<+Z2î›-X3Bbð›œÍŸ.ÿöp]ÞÍ%ǎ7m§¢Ï>ImÖF¿¯\/6Š¨.çì/ùYXñ—üŒÜöK´X ± Eø”u -Kx Ð0nÏÇÐ|¦QÒÇ÷FÞGϸßpÿÂÈCŽKR„^‚E5n“t±Uœ…@Xâ1Ûñê;!B„"ôÉh``@ÌYf6›M&‹Åb2Y­V“ihhÈd6™FGGM¦wï`þúðáƒÉôÅ_˜L_}õ•Éô׿þÕdúî»ïL¦¿ýío&ÓÏ?ÿl2ýýï7™ÆÇÇM¦©©)“Éãñ˜L333&MÓ&à@“)›Lóóó&ÓÒҒɔN§M¦\.g2­­­™L&Óöö¶É´··g2˜LÇÇÇ&ÓÉɉÉtvvf2ŸŸ›L———&ÓÕՕÉT,M¦R©d2]__›L777,+—Ëbv{{K؁"Dˆ!BŸŽP"ì3B„"DèÓJ„½qFˆ!B„}:"@‰°7Î"Dˆ¡OG(öÆ!B„"ôéˆ%ÂÞ8#Dˆ!B„> DØg„"DˆÐ§#”{ãŒ!B„útD€aoœ"Dˆ!BŸŽP"ì3B„"DèÓJ„½qFˆ!B„}:"@‰°7Î"Dˆ¡OG(öÆ!B„"ôéˆ%ÂÞ8#Dˆ!B„> DØg„"DˆÐ§#”{ãŒ!B„útD€aoœ"Dˆ!BŸŽP"ì3B„"DèÓJ„½qFˆ!B„}:"@‰°7Î"Dˆ¡OG(öÆ!B„"ôéˆ%ÂÞ8#Dˆ!B„> DØg„"DˆÐ§#”{ãŒ!B„útD€aoœ"Dˆ!BŸŽP"ì3B„} ±¤ÿ&{JˆÐçM(öÆ!B„z¥6(Ô33Eè³!”{ãŒ!BSÿ‘ÁM„>["@‰°7Î"dzF<ƒ<#¸‰!ŽP"ì3B„iR‡ fiø^X§‰¡?8 DØg„R$£F¢ž‘QÀ!BT"@‰°7Î"$§þÀ#3Ró0™}žD€aoœ"DHD½ì«ÀC ôYÖ3x҅LŸº) 2F(öÆ!B„êʄ¤Š‡,=0åD»‚LŸºQ Ò%”{ãŒ!Bc$ãÈȊ4¼1ÖnR*10úCJ„½qFˆÐgOÆ1’x¤„‚††×e†ÀSéS75!BíD€aoœ"ôyS0’6(FÊ]‹ 1LGêҘ¤„‘dð[Š8dôža Ì1û °›ÍÆ2ü‘cï&On’A&U“Y™Z"ôv‰%ÂÞ8#Dèó£¾b$™õH†ŒB̆”¹m€c_H™MÎ$0ª 7qiX -™¬3êÀ˜¤ì$ÃH؄Äm¤ ðˆAFˆ}aúòË/¿öåÀ_þò ¿ü…7qö& ™FåIâÆÔ%Z2´DèJ„½qFˆÐgFF=“Œa$ÖÙ›°õH¾4ìù˨p̾øúë¯ 0á_"Ü4ˆpÓ Jyå1ˆrDùrsؘÚВ°'EK-zD€aoœ"ôY‘!c’Ò†›à³Ù;‡‘äðȄÁÆ> ½¿fØ7ß|óW†}ûí·˜}ÃÿÅ<öõ z±¯nä ӗRÈôA¦w2"È42(30´Dè@(öƙLD ë#ô6I(i{&)“$v$1FàŠ¾a¨ðo¾ÿþ{̾Ø Ç¾D¯ öÍ ORÜ$@&le²!ÈôA™|Ãhi¡¥A‰óAK„Þ( DØgŸQFæ£ÿ Jºnm ™0FBêۇdôÝÀ?üð=Ã@…ÿ€Ùà?þØÆàÁ÷ˆ}7/ àIÀM2+†L L=˜ Œà¦ÿ©%£»nœ÷¶là c¤¯Mœ‰ÅH؄„ìC ìùepllì×A»Ýþw†ö˜™c7£§ˆýj†_`ðÄB&HO€Lß"È$30‰Ð’Y-!ۏ–Ì -hi€ %Bÿ1"@‰°7ΰ$ö1Ù AÒ£^€’–1ékòG2á½6 Fú Á£Ÿ@Sÿ: £‰‰ ûàäääø Ãá˜ÀÌ,a㠃WìfxyÌ?ûՂ “A& ‚L´1gŒ¾³@–ßð&-áí8-™UÑGСOF(öÆBÂzcÿ1,E SoÔ%P’„¹‰=“8cÒ_‘1IðGc$dBBI€Gƒ ®'N§cÐår9ÌÀ¦Ìn·[`ø;‡^™´ÀËÀMv üV€L?[ÐÆ‚LCé{„–¾µ ´dÁh -õ%DŒ–x¿%‚–}R"@‰°7ΰüÖ ûÈøª?¸‰˜tR›wûyԌIß1>ÛØ ïµqv¤±ÀHØzÄÂ#„‡A];Í^¯×…˜Û<==-b`. Ÿ×ì÷û§FQÔ´3øèµÀSb n²ÂϦ¬2Yd²"Èd…äµBF?[ýõ×-9»‡œ—´dQEKRoZRpð f%BƒP"ì3,u„õ‹õ ­Œâ¦.!ÓgN%¥C”vÝ8Ï$Á˜ô Úpû;ÂHölGâ0’kgƒG3fÐÔ>s ð›ƒÁ ß"cðÀg…Wf¬ž¼Vø…Ç - -^€L“VÐüv+20!´ô‹¦„­-YÛÑҗjhI§†–Z"ôQˆ%ÂÞ8ÃG˜CÓe·¬#TÕ9n"É8Jz~Ü(áóð®> -@ðLÂÆ$ä³=€ü‘ð^›#M‹àQ(¢Í ©–H$‚YЍF1 Xá#m…§”Þó[á37aÈä¶BzN+¤Œ LãÈÀ4fEÛq-ýd¸Æ¢%äê-EK6)ZQCKê.K-ê# DØgXÖëëni#(mÜd2´$&@I5àMÉ=  ÚuÞIœ1i|m¸ ¸Ýn§€‘1F -ƒ†GfÀC!s, [@S‡-³³³̬ [áAÈ -¯1n‚Ÿù‡ ™!de‚D]CÈÀ4är¹&† Ë1f;9/ hÉ -hé¯"´„N°@]ދВÂQKÑÒç,R„ú@(öÆ3ÂúÀÁA@UªàÉn"É} ô­ Ÿ€wÝÐIIŒggLš­ì­ì`ãˆC›‘áÃ#3FFsss1ËÂÂBœa‰D"n|³‚ - !Ü4=8øŠ -…B¾¡@ 0=„ LCƦ†–a´dÒFKèZ‚ªÊÑïà=È9x·¹,)¡%B„:&”{ã Ka}`hSF‘i£*U𤄛>2dúÓSïždâܓ„]7Æ3 “°1 ù# ¦¡A+ )jՌ‘Ñœôó¼eyyyÁšL&6o…ïæ‡àéìÐââb|pSt UxR æ¢x“gÔ¿s&‚I- IÐÒ·VgåÐÒ-}¡%äàÐ’ÜeI-‰€AK„z!”{ã ab†¦Ánò^Qdª¨J<ÀM6æZbɨ3·6PÂwß -@  - ¸'q»ndLr `c(dÿ`( - F£Q#â™5öaà‘%•J-Z@?/Y3™Ì’5›Í2 [‚‰!xea^žÃiY™†!©à0$J Cò3Б-9NZ’¡¥o¾ùæ/R´ôŽGKà -hÉ<¨¹ 7ð ¡¾Ò[J›››(}Þ ËaÝ0´÷¢Î´Ñ—‚’'UÜ$ƒLJV&£¦Ï -i%-u”¾3q~Üb÷$¼ë†Nðù|¬1 m¸ ‚BŽ`;ÆHæd2™ÀðÈÈ(iYYYIYWWWÓ–‚É!PÜËÃ7 #È4 iv8‘HD‡çææBñXŒ¥ïChÉ; ù:‡%hé„–~Dhé{-}-BKÈÁÛ"uð6+¸,´D¨ßôŸJ0ô€¬]P"L‘a‘"Lƒ!7à EAə*¾’!(xÒÆM½@¦ÏÚÀdüd’àǍݓ\.³ë6à÷ûÏ$lLDþHf´×fœ“0ƒB^¶€BNYe,ëëëYk>ŸÏY766V†8–‚ï²Cð43 Š;5 ¸ C¦Ä0 ­¹aÀ\1d` -ƒ¾0h °™- Z¡%˜?¾‚rc…`´Ä„Ã!´ôÞ"uðVCKƒ ¸‰L# ÇÓ#ÈÀ4éa´4;yDF ·ÀBK#Jhi||ügZBáp %ýuÊÌ¢%äà=„¼‡@ê¾DhÉfå7á,hÎÂ9x[Z² ´dÖGK&‚–i“ª1I (a•&%¬ú „•eG@ ††2PZYY!@‰0†a[$aÆÌ.ÊlrrRÌð¸ÄL U JOp“*dêÙÀô9/u”ðþ›ì®7á>\îx  Äùq3îIƒ †³Ùlʼ¶¶–3ƒ^·ÎÙDiÇhß -PèÐz~~~<z·0z÷³a`…aøîx´òáèçýøÅÎüvsTøÚèÖÖVnt{ -¡¥E-"´4 -kç„–Ü-9Z²@qAhéÇa7 ¢÷ BK_ !o첄ђ•CKÃÞeI-©¹, üa…†ÐG"í]·.֘X‹bÍ*J^¯· (Áø0”ö÷÷ PúFׄµ1˜DŒ3—Ë%fx4 -L†¯%€'mÜ$ƒLJV&U“vˆÜg¹× ô¥èdntŽJ& À~Ü †ç“ÉäÒ ·ë¶bFÆ$3(ßm èÝ= ÆH r Vж§VP´gC hχ@ǞcÏFàÁɼr</ŒÂÏvG!­QHj}͍æóù”Ô¶Fh‰ÆhiВkdzzzr$vldò—a¿!´ôÝ0Ôè¯Cÿ2„\–†`ú`E›pV¼ 'CKhÎ,%- ªl´DH îIPšK(aM¨ -”°Þ€’ßï×J™L†%ÂD 'AX7 æ™6†Ç Àd˜K£…±nR…L²¹. LoÇý)ђÞaJ(aG%É¥¸b „ÎQBý¦ -”¢R ”1’Y5ƒòÝ4ìZÐ^›åüüœÅH ^/¬ J/‡`˜^ ÝÝ݇ïïï‹Ãð×Õ|w1z—L£ð‹£QP×{£…Ba{ÒˏBʹw-½}Ÿxh)þ£¥x -ú¹ðÔõƒ–@£ËÐÒBK±wڂï T¾wP>Ï;IÇ(¡}Dï—Q¸¿ÀóÝHØ_‡A¸þ2 5ý¡¥C RïZ±ò›p -hI¾ Ç£%bV"dĘÔÑÉ(ᅢP -ëS(a…,¥¹¹¹6 ÃT ”`QÃ%XÙ ô™1ìíO˜ƒéDá¡&0lËÅL²%OnìM‚©I 2 ¾LJ{r‚©Ëí¸ž]½ß:u”ðþ›pF€”¾G(]Š‹p, ” óØãځR¥JØ=iÇ *÷Ð ŠöÄêõÂ㲄1’ Ðý £‡¡———Êp£Ñ¨ 7›ÍÊüõ8ß=ŒÔëõ»Qxïf SñÝÝÝÝù;PÍ Zzz|û= ¥õ÷€–²ïAé/¿´4ÿ~yy9ú~~~>ð$væȤëáä;@xc£ p?Â2ü‡Q°oZúz„CK¶a¨ø{„–F‡8´4dE›p-Y,¼Yɬà²4H6á!RÅH]º'½æ /F±¢ÅÊke¬Â1PZ\\dR6›5”ðJ()¹' ô§`ø@ºfx€ [p1“!-Œ’'n’™šd oÌak²ÒžœÌÀ¤´×%Zú³˜ºö薝ýJ?¢þøuτ ŸÌ͝£D3@‰Ûzc(ߍAл»æ“““#3›3 ¨Ò+ËýýýåéééÎ -éÑ - èi¨ÕjU‡^__kÿýöfÕøø<*£ðÊÃ(¼|û~Vz \¼‡¤Nރ□¥Ì‡õõõ¥0Ì!´Ah‰z29ýJê|ežx¥ÿû;|?(ÿ~„뛘{¾YèËa¨ó‡a¨ý»!ä²4„6á¬hŽAKȬģ¥A³”ˆË!D½“”Ü“”Þ:ºæ ëg¬Ì1P‚*Jb „¯y#@éócøRŒ3<˜”¶Û - GPȕ€ ð$ÃM‚½I2áoÀÀd`;î3w^R2+i{t·Ÿ œ:ù#ê ”Æ¬ÅW˜°@ €Ò€ (ÞÝ3ƒ¶=6ƒŽ=7ƒî,Zo-ÕjõÁúòòòd(TúÇ?þñ2ôûï¿7†ÿõ¯1l>¾ŒüóŸÿ¬nz…÷ßÁ/îÞ=??_¿xx¸xé>@Êû ­€–Ö>loo§ZZüÉdâ@¨C@:ý@=ïAô¦ÞC¹íï¡¿¼ƒÊüíL6ߍ‚\ýuPø_F@¤¾A›p#ôqIUØp3jLvÝ´ý¸ œ Ê-Jø¬I ”„€7(©ž @€ÒŸ‚a‰ Ì8ÃFY%†ýÿ&ƒ[‚À“ 7 ö&%Ȅ7æðZȨI¶'(`ÀyIÛÕûς–zñèn?#€Jv¤›§P¯€VÆ@‰€¾Œ @'Ï! ´<Д -(]šïîînÌOOO÷–———gËëëkÝ -©e<ôÛпÿýïýïÿþïïÃÿ÷ÿ÷ûfðñ£ÿó?ÿóúpSóÝ¿þõ¯ú{€VOïdÝ}¸uý¡%håcèñ=(ø Ûþþ~Î%X¶AYæmPªˆ đ¶dŸ¶ƒA琵ñ f¿~<þã{¨Õ÷ï ~ß¼‘ú -¡¥/F-}Az‡ÐÒÈ02+!´dEhÉbå]–,¼Y©3´Ô¼´¦ºd&‚ úIa$í 7mc’Òy܂{^Pâõ¥’·Ñ“È5oŸ3虰nÞ–1<À0S‚V‚’'7 ¦&2a±àÞ¥I¶׳óҟ-õ1ô=#:‰ºÂºÇƒ´²¥0” ÏۀhÛ hÖKóýý}ÙüüüühiüöÎÃ-ªk}ۙÞ{e``úÐÁ%1ÑhŒ£1‰é‰ PE¤(" ‚¨ HEìÝôœœœs~ß¿õ=ïf6l÷Œƒ€³¹.ŸË™Ù³ÛzÙëæmëÀ29ˆç€¢¦¦æ‚1ȨFÙØØX«:qâD­:$5¼W­Å§UZ S¥Tµ_wøðá}ee%£¥o  ¥DKیx¢o2nß¾}´ô®Á -#,v‰§6ÏnÏ7ÂêØZšf–¬{õ@ñ8(Ü©ÃEZµ°&³3“ACÒ©aCሖ”J„c´v+…iI"›„‹œàMf‹Œbã&ñgÚ?3a¤ˆenI\­›P?n¡ô¤ˆyÜBob¯É¼0Ï¢(Ï-엉'ì/&< âŠÇM<S ÈÄ~Ù£;˜b %.yiú—b-Œ{ÕiiÊÜ8­ŒnáÒ7= ©ë$ Jam¾ã6_‚±œ%ØÁ{’(m!Pú”@é« (•••í•WTTì—v*åuuu‡ǎcŒT§lnn>ªjii9¦>yò$“£¼¬Ó655Õh±Éa6>¨Ç×ÊõÕÕÕ%¢%hék#hés#žÙ[x¶o4–Þ7áïäwL0å·L0ÌE&a± 'škÜeaf©XX’(¯Ç´ãÒäì:\©E‹™É¤…!é5°!-ђZMA8á”ᔥ˜i)šoéŐÑ3¹Iü‰úp§ÏH¼2·XI\ԍk -À[¸$bzÒ´ -ÞDPú§‹¾ŠòÜÂ~x¼µLx@Ń'7q®&!dâr™x19!Ó´Âq3Iõ~ h‰7>gF÷Ó=Ri((åÑSyÒ †vE”` œG)JÒÝ»wÿ £ô$è¦\Î9(¯¯¯¯V?~¼N:ª5¨N:Õ¨jkkkTCŽk Z¼wT‹OkuØ®ZßÐÐpPï–ˆ–ŒØßFìù+Žñ© î-&<à7˜ñ×ñ3þb^e†u.5Þ˜az&\¶ 'žn*((ða\^ìÊc€I9õ°&›†dÖá ZؐNóѨ)G´¤$ZR(CA8Y–(E¢¥©«Ãži¤“¼ƒÑå¹h镰ÛWígúx+#q·çt&EºÅžC7¯…’J¯™°À«(Óö‹#$ÌGËDˆ¥8x⦈ÈÄÜÂì×9¢ƒ‰—ÁÄ ÇÅJKϙêkW“–„@é™Ý1”¾±™4(¹„µÅ<•A #ý.%IP*‘èc¥èÝ ”XF7%?±)5S"__. O1îb †qy”0ðë%0–Ì́ÒNÙþýûKe‡ªÕÖÖ–744ÔʛššŽ)@'”à¡f%ðè¤êܹs­êÎÎÎV ä¤/[´gϞmҁ›ŽëÛÚÚê @«#ÆÆÆƃFÐÒ>hi´ô´´Ã²k×®mw£gð¾VüŽ†¹Ì -#\h¨Y€ç9@y†¹¨¨ÈoƵ$špY#f!§ìm3ÀÌz\¸QóÑ-i4,ËQRʒ‚hI® »•žƒ–BP4—xôœÈôÏý‰ˆGsÂHn\™[tgoq7öç&ûë3zÔ-zz’XðöO6ð¢Ä.Ì÷QØ/'<Œây£Øï` ÈÄþЉî`ŠŽã%/M+ÕûCK›Ø2º…Kß(Q3%zHçРÑ@-’`ðÞ’à¼š%ÉTP’N¥jùñãÇëåäLR€}‚Œ¤µ©ÎŸ?ß®îîînׄ¤M‹÷Nêði³Û7´··×Ož3.(ÁŒKs›`M# Éj€ ™ô˜² :Ì`Z-îˆFˆTqA8¹•Â´$œ²D"JÏbZYnRÈt2ñÝ"Ó˲ݗò3“0¯®mƌÄÜxen¼Ì$¡n®Ö-zԍ—ž4ýÝ¢8wî\›8¥ïêêj6œ={ö¸‘hɄ6cWÐR©åðáÃ?X8𕭤¤d» îÍ6<ï×Ùa¶«í°É·ì8¿E6œi‘ p—k[²dI†óLŠžh€{̘œ&\©Í20eõ˜Át:r+iq[Ôr+©™[ 7LN´$ ÒR”›ºH8an¦)<aÂ-…$"Ég  J¤%úya6®®M(‰ÇHBIIn\™[¬Î$^­[Ĩ›Pz’˜Çý: -nQfA¢Sž„üM[mmí.û¡C‡¾vìÛ·ïSþ‘OùõNXì»N`ür'h}±W쀙å:Àã™v\FŠ&•hƒ5y¬0$§s”Í ó1›põîƒN£Ñè`4j-ìE©Á­R¨yn¥è´D" ‰Œ'|ØÁw9Q<[&ã™È$“DB¦—Ÿs7«?±âQtFŠf‹ÎHìé‘‘¸¤¤è7^™[tg¯÷ô›ˆ ôš iQ¦)ì—$¢D$(7ñüMB^&^LŽ—Á1'”¼kª÷ܵxµi)֌náÅLx¥oO÷ȧ?iç“ëo)=ŸWÑ0N€LàJ’© $e ÔÔÔÔ kkkk‘Ÿ={¶]ì9«u)ÁC=*Ñõå˗{5###½ZÈ^vëñA§›t˜úûûO™{zzš, ¥cÖööö#¶––– -{CCC‰£¦¦æ{geeåβ²²m®;wntáɿօ³Zå‚.uÁê¸`kNXXÀ‰É&Í“òÙqU 6’Û -²[`>³×ë5šÈ­dÀÍÐêq[Ô:؋JKn% ¹•„h)ÜÁ›­¥ Le$¹„èF"EØKd‘ }-,{fÇàÉò§"8˜¢ÐÒkðó"Âl¼þH\í?/iZŒ1àÆ­}˕¹ 9“"¦pO?ê&‚Òk!lE™‰¨„¸IÈËÄ!St“P8.bòÒôS½§ÕFà5 ¥çÌè敾EèG0öMzH¯¢Á[+Áyc”`C_JvíÚ5”Ž=ZK t\º9)çœV€xÎ)º•@¡^ ¨_}åʕÍÕ«W´~Ýèèh¯ïõñi§éâŋfÐR«ß=aÅ^êíØ_•£¹¹¹Üyìر=Îêêêo\Ÿ¹KJJ¶¸ñ0ÿÀ ‹}× s\î†é-vc&)rÃÂr]øƒ<ùhÑ"¿֔h‡!yl¸H§\h³ÀrÌfXŽÁ£Ñ‡F{£Ò™Íf%ђ‚hI®¦ œ-ÉBkéʤ!‘K9ˆ x”áÈhP$± -}M€›¢#“TòÚÓҜ„Ù¢§"Ed$.g;:# %%E¸ñÊÜ¢;“b¨uӓ^[aƒ,ÊlIt‚r:ŀL</ƒ‰ Çñ’—x½¢§zG/ŒûgÐRČîJßp#„Kß(±ÔL‰†b ÏJz>¯¡§òF †{[”~ð@ 8ÓH Ô*ïììì÷ööv){”—.]êW‡Õ×®]Ҍ iÇÇLJt=^öÁM=¦‘‘‘N3hé´´tÒZ:n?{öl£­­í V檯¯ÿÁC~‡ƒ·gϞqxè¯õÀ:WÅaÂXƒ›(ÏwãänL;©.X“Ï CŠwÀ†\v˜ÝŠk¶X0—Í0½Ñåri °µžÜJ:^Ž¥,ñzRBäDKA‘†…GFS‰G%ÁžGžæ&ž¿‰C&AZ -‹-ý=ƒp/+ÌÆë!9FJJ -¸q=“„Êܞә$FÝ^Gá@X”Yà‰ÇMё)ºƒIˆ–¸p¯—@¬©ÞÓZe&-*_¹î”A)DK1”¾9‚¥o¼\3%ê:I#³‚F‹Ò‡ ò6 ,â ÉΝ;ìÛ·o(I(>}ºUÞÕÕuFÞ××w^ìéU€T@¡‹jÑ°æƍ—´7oÞ¼¤ƒ\Ôãå ô™€QÝfl|Î:<<Ün-5Û»»»:Ϝ9Síjmm-w766­­ýÖsðàÁϕB…qÛ¼"´4gsÆ앾 õ`͔у{9 Ï»ôÞ@ºU‚ßA ô=R©d -(˜Jýýý= -Šº)GGG/*AA—Uà¡+àÑUí½{÷®ê £zȈñîÝ»—L@¦A Xª× -Z겏ŒŒœv µ¸z{{¹;;;«ãÚÛÛË=MMM{âëëë¿IÀÁ?óîß¿ÿ#ïîÝ»×ya¬ïxa„˼0¸…^Ì. @ñìx\Fš†ä‹›7o^‚æãvÁrì\³ÅNn%+ìEOn%­)äVz*Ç£%9n®’‰Œãæ -ÍSP„½0Ñ1‘bÏQ„6ÊnšŒL  В4- -W÷òû©Fù™FŠfãº"qa¶R‘ØӇc$ölŠÈH|xM¹jÄË>¶`“6î±ãkgØÁ)×àà`c\OOO­çìÙ³ã[[[KðÖÔÔ|‘XYY¹5±´´tCžòï%áüV$Âô'bb)ö¸r½0©Œ„¥K—úãqUÞ8\_œ–ãtÂh¬Ž””³-))É`%·’ó Ö+QBn%U¸o벤TÂJ‚B´¤’“È]˜LbŽs8ö­é' öl˜*ú Ð§2ˆ.(ø®VF»"ÑÈ°{uø*¢´ˆ´ÄUåIÿ–´4cFší0[DFbOöâú#±¿é„r¶ce$¡¤¤è7љôO¡%vyNnŠŽL3˜xá8!ZŠ˜¼1՛W'ÔF bӥ礥èÝ)_*-ÅJ¼Œîzp͔8PZMò=¯1‚[h'ƒÒ¡C‡X{€ (I§‚’œÒØØØeå͛7GUwïÞSŠÆµ=º®{üøñu=d̹j2Xîß¿ÑvçΝ>;hé¼óêÕ«îK—.µÄõ÷÷‹?þüá£ÜÛÒÒ²;ñرc_'>|x{Ryyù&ßîÝ»ß÷ÁNWù€ìo&aN™Ÿ„óÎOêeyÁÞ© ˜ž’âa>ñq˜Á\nLh6's+%''mäV²0·¬D35ÇÚQ²¥NT*%LE¥€¨å!ÑÈB"LFaÆ Àþ‚"ã >5…¸)(2A4S‘)HK,Nš’ ÑR¸?¦ (I^%PzÎT¤iUüÏ8Ì&”ŠÄõdO)®öŸ—³#ELJšVÀ-Vg’Jwyù¨ñšÊô‘Iˆ–":˜bH^Š˜ê-qmfLKB5qƒpÓ§¥9˜Dž§ôM¨G€P3¥P×ÉeJïÐð¬§qc ô¹–óR %ÉÓ Ô)앏ŒŒ )ÆÇÇG”·nݺ¦ºwïÞ¸ŒtCóäɓ›ºüñ¦þ§Ÿ~ºaÄÿÆÍx犯^¶–·oß¾à¼~ýú9÷èèè)Ïŋã{{{k¼•‰mmm%I'NœøÎW[[ûyòÁƒ·$—––®OÆÓbu2,ñ­dÜB,¬Ð‡¹'; Ö”æ… ùpi ñ˜ÁÜq0»‹ÜJNLw&ûT·’‰ZB –ÔÁæݸ}j¬D­Ä «V°0‘3~á<@!׃"CŠLRÜz&föQLrڎÄ('n"1ȱ½;ÕÉq ­œ—hIN´$ŸBK -FK²Piž,LK“ZŠ ¸•Þxhéïfã¥"qéÚì)ÅõGâÕµMŸ‘„’’"ÜDgÒ?O^>Qü3dúÈk8î9i‰W±¯éҋ ¥—š²4cP•?ÕLi -(Í·çf ´Ž†ì#ÕÏß` .a TI T; ”zzz(õɯ\¹rQع¢¼sçΘêÁƒ7ԏ?¾¥ÝÖýüóÏ·õ¿üòË-#ä†ïY€LWl ¥a¨ªß¾:766vÚæjNÀNë½à°ª$hŸ¯¥¥egò±cǾð>|x«¿¼¼üCÿîÝ»ßóÃ:Wøau‹ý˜bŠ’qö9>_FlÈïŔåMÀ_ùqž¼¼!_Єkˆˆ' @&á Áž­LäSijۙ“ß5*°+ƒ;Õ+°{]ð¸0VFijŽ–‚™S!ZâzL¦¥ÐÚ+ÁüîÈ´ôb^,#E³Eg$^˜k±-”®Íõdñqµÿ¼œíX‰—”4ý€›J¢ˆ"(³L±†ã¢'/q´$”¼4'´knå“i%x¿0·RDPzºG€:˜Ñj¦d ƒÒD3%¡®“SÚs¿M㱎žÙ ”>#c˜¥ƒò@©@©K644Ä@i˜@i”@i\õðáÛê'OžÜր‘îè~ýõ×»úß~ûíŽrˌ—×­øàš ´tف]wïÞ퉻qãÆÙø«W¯¶z‡‡‡ûúúª“:;;˓ÛÚÚvû¿N©­­ÝžRYY¹)gµ6¼*Føf -Ìlžv•— kÊôáOø”$üYŸèÅõyâ1«¹<˜älîôôt‹VbœäV¢ µ ` –4Á5ápç4jX‰V…V«dÀBŽsù0çOˆŒ&ðˆƒ"ìÊXMŽ™ØÎÄlb%±(𠋂¸)ŒLB&vÈ -)ˆ–ÌÅEA¢%%GKáŽOÝħ¸•$|ZzYn¥—ŠÄ ³=gÅ?—ŠÄ…Ùx©H#±gØ c$љ$Š(3—AKLb ¥R½…ÚÌ-E_'.Ör¸ëVz&(=µ<.J¬G@Ä®“!PšGø7ù ô#ìàۈ $ R¿|tttXÎU‚x®«=ztKýÓO?ÝÑüòË/÷tÀ£{ú?þøãžrÇüûï¿ß²â½q;hiÔ  v=xð /îöí۝ñãããmޑ‘‘Iƒƒƒµ¾îîîJ?Ž¶7¥¥¥åÛÔ£G~–ZUUõQÚþýû×¥íÚµë4XâÒTØڂ x¾WH† ¥ú0eù1Å{a/îx˜Š=ÎÜJ&r+&¹•Xßn¶Ê D«¦è4$jb‰’9z˜Ë‡ÍÈ ô -ákVù(rÈqÃrìÙÉD#ä‰C‰˜Ø•ØئÄ׬JB&%ögVbÏ&%ŽaT²ƒ-)´q´‹U)B´ÄzȧÒÒÄJuÜJ|ۚëŸ9f¤ˆÿÃlìÉ=ÌÆëŠÄ-Õ1‰×g›×‰«k‹ÎH±&n‹Œ$Š(³.ÓG¦Âq“—bHõžcZŠÞ˛£%¡æ¯ˆ[I”ð/ -(ñš)E%n“ð‚o4<›'RIIÉÞgƒÒ%9@éªâÞ½{7T?¾­ÝӀ‡îë€Gôÿú׿îÿüóÏ{füï¶ïÝ°ÿúë¯×œªËn|cÀƒïžO¸yóæéÄ«W¯6' ×'÷ööòŸ;w®,õÔ©Sߧ?~|Gڑ#G>N¯¨¨ø }ïÞ½«Óa˜o¥Áà¦Å SaMÙ~ÌQiÉ+V¬HN‚Ñ$$â"Ý 0‡Vb%·’y’[)!!µ `}»uzˆN‡›¦×ÀJôjˆAŀ…=Jæò!ç82Âüë’c§.n¸;(˜ŽÝÊ)âRá&N6v¨ð5» -;°©°+‹ -{6«p “Šf{½ŠhI¢%–>¥ -WåÛ>…iI&@K<·߶æ²ÍŬ0’PW¤R‘bh¬k˜[ΖKEâÂl\*RtFb¾u¡œíXýHbÀMQ^ˆÌ¢ƒ)†ä¥AK¼,o^wJ¡u⢗ý:n¥™×uR¨=7oÁ7J›éAŽqû”†ûÛ7¦‚’„J/^ì—l.Ɂ8×÷ïß¿¡|òäÉõ/¿ür_óûï¿?ЁŒêÿýï?4Bî›!w­@¦[v|:î-]qÿøãCžô$ܾ}ûLâøøøIßå˗ù§œ?~_j{{û䦦¦/Óëêê¶eà„>Ì(--}/ö¼<V·(3NQ¬)'sT†äO^ºt©7 þÇy ñ°[®ÞÂÜJÔ[ÉH½• f`Š!¸x.n•AL1ha%F ±Šš|¼1sÿþýk2wíÚµ2¦·$<^œkÊMÃed¦ÀrR’1—%ú-ZäI„•¸Xü¥ucn4;@&ê­d´àÞM˜HL©F=‰7ͤa¬±¨X€Œ…Ê(r¦à|FSÈ(^&(1ÿ2ñª`„AQãLÔx¯a‚M<|íÅȸ´Ø‹S‹ýٵؽMK´¤ÁqM¢% ós±€ ђ:Tš§R…Ú>)¸µWÂëúJÃn¥àºpaZzC–fËfߘղÿiuEŠ5iúa6^W$¡T$æBJEâõ|aŒ$‚’(¢Ì¦Ì˜–bMõŽµ0.VZê À­|­ª+T7“ Ü s+=”žjÏ}“h ´v*(}3 ”êêê&@ ÔÒ.½p᥁0()™©ï¾ûnŠö’”¼xñâø$.þÆҺɭDÝÌÔ[ÉD œ˜Ì˜HMFˆIB1ë¦@¬j#<¢(™SIxDá³8eÈg„"%¦ÞD%P(IÓKRáIjLÂ>’$MX´D->õj±]‚ßðèðÝ8É¥Ãþœ:ÌçvdÕá¸-ђ–ù¹B´¤Õ`x5Œ–¨í“2ÜM|b¥º0(É_(½ˆ’¶è]‘fÜX[(Ì&Tñk*‘¸T¤çd¤’’DFE”¹‘™$/½|Zâ­ÇþPäh‰—àÍKY -ÂŚÛ=ÇÙJ/ ”ÖÒÝÆ(l%ΣÄ%0 J·”î©ûí·‡Juýõ×ðè‰ñÿûßc3ä/ï:ðÁM6‹ÃƗãúé§þćž÷ݹs§Ý?66v"õòå˵iýýý•]]]{3ÛÚÚ¾Íjllü4«¦¦fs ²²òýÎïí,Øä›Y°°ù™°¦üt˜OVŒ&5ôû’1É%$͟?ßíÅ<ÈâoÁ´î`J¶lÃlÆlj6Â@,Ü*«Ž9u v Þs¨YbøÅ­Â#˜™È(Y…©7Yüj¡_ÇôkC’¬Ã{>’$=¶KÔã\ôøn¼'§ÇN]zœ•C£ÙôDKzX¬YG~.Š -êµT+Í 625ɜ %%%,VF´$ Ӓd-…ãoB´4›x4Û%m3îŠkcíç ³ELEJמFn¢ˆò2dÃq±ÆE¤¥è‘8®;%oå-ELðŽ„›·Òß”V>( 3P‘ß¾}{Lι¥ñL€ÒŸþùX÷Ÿÿüç‰xôÄôÿ÷-‡6¼¼çÀ·\ÿþ÷¿Çâ~ÿý÷‘„Ÿþy ñÑ£Gç}wïÞ=í¿~ýzSêÈÈH]úÀÀ@eÆùóçK²NŸ>ýmVSSÓgººº8«uÒÒÒ·0Ì¥Y°°ù™˜ò3>üðÃ@:þÊOKÅeùü°’&¾8£ú7GÅæÝXà‹¶a1c6µš` V&W›Ž…À(¦aID,§ÛÅ«XH &•¨bx ’‘ -—¢Æԛª†ý¥iòóóÓ´L0 §é ©z&x/ŀM’ 8ŸßH4b^#æîx#F'Έ³r‰–Œ8®ÍÀð9»XË8gõy %Öö‰µWWª ¹•dJr+)Ân%y”d³íVš;FŠ5]{¶kÇf‹Xñ1)zº¶ÈH¢ˆò·”¹K^š1-ñú-ñVÕeòÊḔ%^.b%œ[)b¶Òܹ•^1Pj"P:”T ”À>(ýH ô#Ò¥G6È}ÇÿûßÛn€Ò¸ç?þIøå—_“?~ܝ|ïÞ½Ó)7nÜhJ»råJ]úÐÐÐÁÌîîŽŽŽï8ƒÏ²q.e:th]vYYÙ;Ù0ÖeX؂,RA&,'ŽkIKÅԖìÇtç &*ár],þ¦±»0iÚhÉ\› ©Í.±™pƒìˆCÏB`7%y((>˜gÄâj!r&%mÓµg'ée…ÙDFE”×FfÒtI(q哈 Þƒp1¸•xEpB œÄ›»D¥è ÄғB ¤X×: ”é2S§€Ò|ºWKéOé· >×Ñ}f ô¹cù¤¬¬¬T$9(9vìX}”Ν;7J—/_T()§‚’6J”;3‰@é¾/ï¸ñÁxlrՋ‡“~ùå—^ÿãǏϥ”N¥”Žg^¹råHÖàààìîîîÝ9§OŸþ:·¹¹y{n}}ý¦\àÛÚ\œß*¥7s`Có”Ì=)ôF]' ”|ÁÅL` JñX„Ç ñ8pâm,’HÕg>#>ðX%?¶Ë ¢µ€vŠ ©H3›§ƒÁ-ÐÃô0Ã.1‚‚Þ4á&.5Ã:—ZôKm˜fß´C–8 ‹]xo¡ŸÎÃvEqøFßÍõ`ñ+W®ÌˆÇžâ-ù<À2o;Sœ•ËÈ·;YKŒ¢)¼RÎ³Õ˜0Ð*#ø^©j(È­$×(‘[IŽ¿M%ù³A)2-Et!M‹‘fRöCºö´R‘„Âl#Í]5Û´\H"#‰"ÊßWbH^Šµß’Ð:qÓÂEw+ñ²•bHëæÅß^X¢RDPâò¸(©éŒ´tn ”LDwV:}L6Nò–y&R]>…$P bݬwèÞ­§û¹…¦ŒÂç í÷’}ûö1P:$e ÔÚÚÚ,¥»wïŽ1PҀxîjÙR¸JÁ~ÜÿûßÿYG(›KO'Pº’øûï¿ùÀWüØÁÙTìêdúõë×2GFFögŸ?~WN{{ûW¹MMMÛrëêê6æ\%mhh8*=uêT‹¬³³óŒ¼¿¿¿G’™JêǏAIPº\ -—­ð2z임ÿÝqžnӓþüóÏˉ¿ýöÛ`òO?ýԝòðáδ۷o7gŒÍ‡Up ²ò‡œ¶¶¶/r·æÖÔÔlÈ­¬¬|/·¤¤dEÌlI6Îy^V’Ïú(ñ@É%o®9!ŽEµ@K^Ì"ÑƊóYS#jodd-°]@Ï ÓlËBÒbè0Ã.ÖÃàÞÔão`„+Œ`³•fL©«,¸}o[qoÛa¶o;1¥®rAVÆA–{ðÞ²xL¸KÀM ½0åy‰`þÂDLѹ‰Øi »OOÄ9§$✓¼ ý„Ê«ŠÈ9Y§L7 ßì. _ ¡µ+Ôfð½’ÜJ -Š¿Éu™–‹¿E%”¦ÒÒó–ýÇÐ>2ÖUÚb-iã1R ]‘¦¿~­fEQf(³MKƒpÝJBÙJ\×[ivâos -JÏ*xã:p d ³4Óäc£ÓwєO×Å@).˜R!M* Éßö%k¼KÓÆOÜ⭌’]»vý Ù¿ÿ>iuuu•ôøñã ÔÕÕuF>00У PR^¿~}D¥›Z€ÒJ€Ò@édtŸõã6À{×=\Ô-œž”JyÜé·nÝ:‘qíÚµÚ¬áááÊìÞÞޒœsçÎ}—ÛÚÚúy.NcKî‘#G>È=pàÀ»¹{÷î]žkZœy«8€“Ï 6œ¤>J©Jþ(%%2 hQ²´‹êËì #Ÿ â§~F©&0u†‘ɀsõ#a†]¨Ãþ˜ i™V·Üû[e½cÂqW[`¢ïZöïÙq.ï9`Àïº`Ê«ã ïxðrU>Xá…Q/K„Q/IÂ×ú°ƒbv•ïÃN³}°âL¬85 ¸ïK‚{qB¬¯[€ÅF °˜Ý`^£ô ·'$$h­À -µ…âo&%,@®ƒ’&”¨$ J¼øÛTáãÑÜ1×)†²¡’¶èéÚ±¦" …Ùb]¿V ³‰"Š(±ÉìÐÏ­$„‹îVâŠà¸ÞJBñ·èõo1$*ÍIG¥oÏj¡”|4Û0PʦTJ‹È߶œÜoïÑ܁¹âC nñ6 FáKÉîÝ»wJÊËË÷KÁ%‡¥Çdmmm''Ò•+W&’†ÒÏ?ÿ|Gÿûï¿ß3þùçŸ÷̀¢û´¸Û=;äŽ3ìLŠÇ§W¼\Ô-”žÔLO=:Íò¸Ïœ9óM.Ëã>vìØæ<ê ‹S{''¹,æ³03XQl#7—‘ìÌýÎ;ï0PJNbÞJ0†D7x(É ‹ðÙ!~+$•º?fP3È,#1’ûãÞL0…ÙtŒ‘0¯®0`J}ۈÙtµ ÷ë=3Lt­û¾ ¶û¾¦ü¾ gõ¾6¾Öy//W{ñÁª$l²Â‡—&ãk‹“±ƒù~Øs¡'žë‡)gùq´´ä•+W&û€û‰I\_ñ¼¼<{< Á‡¡4ºùz‡×ëÕÚÀj ÌVeƸ+Œ ”ŒF£L7%þÆ%ÁD¥è 4wŒCÙô’6¡tm¡®HÑS‘æ$Ì&ºDE”§eú5qÓª„r+ñŠàx½•"Æß"Ö¿ 5 -ˆµQ÷œ€Ò´ -ބzM¦æÐßá˜u‹è¾,¦™d1æâ΍Ì ŸH0_IöìÙ³KràÀriMMMµôĉ ²ööö“òóçϟU ö( ”T›5çÒ °ç¶t׺kݵ–îw ;“X­[°)u»sçNKÆøøøÑ,^zÒéÓ§YzÒ'”ǽ1˜Ç½oß¾U¹\Á ¤0 3]Nf¿Ì4Zë-…@)vÀ@ÉGI?I*¿w/X°Àç¤&vjŽmem²‰‘LØ$‡)Ÿ1’~ -#½EŒ´R«{ǀÙô=#îÕZfÎuXìVXñ;,{ƒ¿Ü8µ<õ ÷½5Iø5XíƒÉ¯JÆ-^¿™‚_˜ -Z*Nݼys~*Î>Š£¥ÓÙûýSÚeºAúö®ÅÛ5¹ùz'ˆBk «­0[ÅßFX€Ü JSãooLJT -ÓRdPz±Œq•6# -bËKמq*ҋh)2’(¢ü3%VZŠ„r+ ÁñÒº…âoÜÚ&\ýo¸X•^(M+=)zg€§[(MZ½DB«—HpŸ·K0_KöîÝ»[ZYYy@Z[[{DL9.°´Ê»»»Ï*†††.(GGG‡(i”´¥ëz€Ò-#@éÒ+ èŽ´tË ¹A‹»qΤ‹ÁZ·'OžtRÔ­EÝ2¯]»VGQ·ƒÙ}}}¥”žô}î©S§vðӓX7KO -¼e†:d¦ÁÒR0K¦ø”C ä‹[´hQ25+òSÇTþ—nÁ{™fXI¶‘‰õ‹Ô‡JÚX¬c¤ÕL¤kŒ¸MëL˜9?0Ãb?´Â”7ـB›»wïÞì­ÛWRR²)ò¡òAÞ[ç|®ñïÚµku -N|e*îó²4Øøâ4ìo^:ö\Žcä¤á2Rq )©˜í“h]ßødœ©; ìðb­ñ°]SlWïJJJÒ:”l0[Åß&Jà’ (i(]ž”„Jڞ“‘bm)Ô)zÙ¿#Ś®-”Š$6DEQ^¤L+C¶’PœPü×„’WÿC¢ר{úÝ3¥X£n±æq ¼qÂ-”$ÔkRBM¹%¡¦Ü{¥¬Ö×××Ț››Ë;::N)zzzÎ) ”TJê›7o^f ¤#P2”n(Ý2ÿë_ÿºM t˹á¢pãÀHWþø㏠3É÷ÓO?õP­Û™4ªuË`µnÔ€u;yòäguû(¯ººz=¥'­ÎtL¤'Á@XzËãÎNǵd¤RðÊØ ‚’WšÙ4™@ÉØ!iVb$ZO$ÛÄV!F2„i±>k 2’ÇXkÀºÞÃüЋÝdd}lÇ Ûê,++ÛêÞ·oßǞòòò- !›|û÷ïßàǧëR°Ý{iøÆÛéøîò ìåÍ \‚ ˜wQ¦í\rŠ±èa*-WçK…'øyn ؑ˜——gMÀPš<°]ƒÛçói  X¬²(™ar#R8QIª‰”H$SåÅ1RÄö‘)I¸J(Èïa½Á)Jiv¶ÒÞ Ðl¹&lWhÀ7æ#¸'3v¿VûûÀ€Is£Æú‘yçΝ[ÀkÛl¸WÛ@¡í®ŠŠŠOã*++·Çƒ1?I„lõA¶øñÞ¦ÞiØîýôÒÒÒÕ ¥•™ø]Xš…ëX”EùèY˜±óh]ß@&¦÷´t˜rrڊ+¼)°â8?øÀéÃZA¦xØ®!l¡sy½Þ P‚Ù*(QIN‰JOÒ”D¥ PšJK‚ 4wŒ±}d ­‘"–´M?]{NR‘Ä0›(¢ˆ2 ™±[)bo%Þº¹ÌÁÎëÖ-Ô(@¨QwtPzÎÒ·é‚RìΤçJOʦ /û] îßÊãž(x|/Å|^*=|øðAYCCC¼µµõ„âܹsmÊÞÞÞNÕðððõµk׆4·nݺ¬((J×Í@¡V€ÒuÈhܹ‡—Wâÿý÷á°3©;Ü8‰Ká® Á*&Õº:uŠÕº}œÇ‹ºÁ®Þ Fݨw&KO‚ dQzRºóeª@)‘¦T["x”FK«eØð2‹V¨Í1c“#6žgÀ×#-¥º¶º7®Ö1FÂ1#m2ÀN·˜p‡¶™÷îÝû©Ðö™´Ã ÚáYîðTWWïH8räÈgIíÉx¹-wrK0oc:.a}&îîš,\ÇÛß[ü,àbæÑÅäp1ÙY6lHÏĹøÓAÞ4œi\ -י ¶%a,Í  _çNLLÔ8@*ÌVi!P2(•Â Ì赞|CN" Ó”8<š#źT[¬Œ½5ÇH±–´EO׎¾6›fEQæTb %¡l¥âo1$*qÝ\£îˆݼ֓/¬GÀìDÝ¢§'Ӕ³„@ƒ•Ì)k$,³Æ6ÊãþRJoRLþûd˜è«dÀ”z9€¥IÑÙÙÙ®ìëëëT]ºt©W3666¤%PÒ(J×L¥q PhÜ(w®¹!£¼¼ìÅCIؤ7w×uc“B)ÜUٔÓÝݽ+·££ãkªu۞ǫuÛ³gÏ[\Ô-‹uOÂ<˜NéI”Û“îgöԎȋÑO‰Ç¼šâÆ5§:!évH¦ä‘mƧù&lWddː໬?Òr&×wt[¶lY£#FÒã@› 0̏`¤OL%%%ŸY;_X=_ځG_»p¯¾Ž«­­ý:¾®®î«Äúúú/}ÏýOSñÁÖtlòQ&6ސ…¯½ÀVg³VP¬¹8îý‚üEP˜Y<'€1ÉȂ=û3`ʉé 9O* Áé‡ے0”foff¦!¶«sƒ74Îøøx• f«´Àl唨$ gtK)£[ÂetÓÒoO‰dªðÛG¾TFŠµì?â"¶BŒ4“T$1Ì&Š(¢ÌÌvü-b¢’P£n¡Œîˆ­'甄h):#áŸ7q¾´v¾±ß¾uà6}ï}ïÒ}Ÿ²ü.±±±ñ›dÈW)x¹# lÏÀ&gÕÔÔl -€–Öçà¿—ê÷€¦Ksñk°0ótQÌ;7gÀ”Ÿ’ HÊÀ™zÒ@ -®”yóæÙ|às"ՏáÕŅAÉN d%mDP -Ó”„ZlÏ1#ÅÐ>Rˆ‘b-i›Åtm1Ì&Š(¢Ì•ÄZ½þM(Q)zF·PëI¡Ò·X{Ì”ž–i:“pOÕºñ¢nBݓÂm&%O§'}&Å |+---Ý+;tèÐfö#òæææEGGÇIewww‡jpp°K322Ò«Ò3PzðàÁӓ'OF-?ýôÓU@éªd4ꆌx Ã^0Ò@>½Ìz&±æ’”™”=ïÏéééٝK)Üy'Ožü4¯¡¡á£¼#GŽ¬Ïc)ܬÃ$׊;T떓NQ·ÔPÔ-¢n©uK‰¥Æ#¹ ¼Ì²‘r, ܌p3„n+u°¦wu0®u:L¤u0Â-zØîv¾ÃFúÊ hûÖR]]ýƒ ·Ó -Úåíö455íòâ†íLjiiùÞù6/¿Lð}ž‰‹ÙÀ=ý(‡Å)á*¯¼¼üí¼’’’·òpŒEy8Zq.l|¸R¨QXŽ+.­ª .œQ ×ŒŽŽöé®_¿>d¸sçÎ%#@iÄ Pºb -:EW\ ¥‘8Èp^&RÀÍDz·YÏ$VæFΤ¬°3)‡úävuu}Ÿ×ÞÞþE­ë–G)ÜyUUUkó(…›ßa’ZqgP­[93…¢nÉ\Ô Ÿê!PrCҝL;ܬø ÏütÀmÜVSÀí} -¸}¨Ã-Ù¢ƒa~¢ß³gÏÎàkceeåwf0ÒN+iì³× -*qŠJâ[[[K¼§NÚãkkkە‚ÿý†÷¾ÉÀ§_dáŠ>ͦ„+–™N%|ïçc«óËÊʖçãږäãÚæåÁÐór1½gåà„R(_L9>gïJ=ØýJ^%l7JJ¡Ò7Y¸ôMJÝ JT¥ -Ñ’9f¤ˆËÄÀH±–ýÏ8][LEEQ^ŽL+Q)zF7×Q)†Ò·çì0§ ôÔzí±9“&§p‡¢nv~­[„¨Û›L6«$¡îI©{Ò'RÜñ¯¤‚²PzÒ!9&õ:fûÊsçΝRõööžÕ€iºµ ›>=8gÈâ6}.[@A#v€ÒˆPtÙ <Ž‡ yñ²/‰ÜXöv¨gs&ÕXfçL:{öì7y`‹Oópð(…ûƒ¼ŠŠŠwÉë²"æ³$'œÂM&ƒÅôisVë–æ EÝR)ê–‡ëMsAžr&a»yÆPÖ)‰ÜÖhaWh1‡nÖâ–|¢Ûµk×çzÌלÆ÷Fä.3i¯çWfonnÞçÄéîí?}úô¾ÄŽŽŽ²deI -þ·;ï}Ÿ‰O¿9?ÏaüGYWùµµµë :ônAyyùʂ½{÷¾Y€_ƒùù°öü<œF ó~Z6ʗ…!KÈÀÙ»Ó`Åv?ˆÂâËÎÎ6zÓÓÓõ ”Ü •”¬´ÅJ“ÜJ$Ò°A‰Ã£ËHÑ[ló)†²!FŠØ9RLEEQ^ ™~¢RôŒîi×#€=¤Ùã:VPŠÞu2ÖuLbe¤3é©27n]·ˆÎ$^­[h͒§¢n˜S>’bêøTŠøFÙ-;xð`¹œÒ“”ž¤loooRuuuµ©ûûûÏj/]ºÔ­»víZŸáæ͛ƒ&% @é’  tÙPºì { C þD0҅`ööƒNp²˜3)[À™”O0‘O^—|æLÚ¿ÿÛyäLʅm, -¯ëöT -7Õº%Qԍ9“âi“œIx9áLÂ&Ep[v&­¤ -·wµ°¦uZXØ&-¬n«Æú™·ä+=Øñ{Îe·ŒTjnhhØg#°ƒ"+\@¡Ê8Qex²"©³³³<²/R’ôەdú6´ôe0=½±±qK.pCAuuõšB تÂÒÒÒ¥…8ä‚ÌÝù°ñìÔÂÖ¶haŽŸj÷ìÙó¥”öþСC» 8¡R#©Ü Fª°‚‘:psª\À£*0¯*·éPROOO¥r /Ë2Ο?¿' ›üÍêøðµÏò±ƒ­ØÕÆBìtmÐôí¢²²²e…»víZX»/,ÀUæäá¬ÒsaÔÉÙ@[o&Lٝ+v¤Y’§€’–z¨°€§@ –"ÕÂl'@‰ÜJJ2¦ (‘ÈH¤aaŒ$!F’¼,FŠØb;†ÖHÑW ™mFzùÏSQDå5”9%^¡Uß"vŒJÛs??(ñ)öžIÑ3“x“B)Ü&—áG‚igR­›4u“…¢neò#GŽT€Uj• –ã*ðËI5H¦C{ñâÅNݕ+Wz àœ~ÓíÛ·-÷ïß¿h{ôèÑExè¢d4ä!FJÀÿú’ð^w2>=ÇZ¤ß¹s§9óƍÇW¯^=’}éÒ¥ŠÜþþþ’<ÀÄ÷ù§OŸþ‚b[(mcþáÇ×æ³\gœÚ2* -[”úpS?€¬ðr%©S'¥z)ꊺEw&qÙÛïi1î×À¸6k`uŸh€_h.ßjj»ô¸%¥œU¹±©©©Ò Ø©²{ª5.ðPw¨ÆÛ××W©òC¦õöö–gàƒÒ[³´ôm®rGÁɓ'·666n*ª««[W4}§DöVÑîÝ»b<Š -p.9ù˜ü3raÔþlس7 ×—˜p¤[“aÀ¦DÀ°žzh㞥`3%J:JäVšJ$r‰4,#I^FzÎÖH"#‰"Š(g¢¥XA‰=£7SŠJ\×ÉJ11¯wÄ%ÝX™/3iŠ3iR -·„¥p³“6lø@‚‰e‹76Xë&+--Ý#gQ7Ì݇‚zŠºPwuuÒ`Þ?£îÒq.;ýf`Ï 4d - ¹ECqÀ£xb¤D¼ìñ±€ËÞ¾wï^kÆ­[·³ÆÆÆê²GFF‘3i_8bW>âë|àǧ ‡ -jkk?(À¹¼KiÎ+ò@-Kra ósș .ܙäLJ'g[®„ŸÂŠºqΤ§2“ðÝåagÒûL®5˜H·jp7>×ìÝ»÷ (m§¼V¢«¯¯/7àÔÁŽ‡Í`¤©ÎÑÓÓSïÂÍ9ê¨÷ÖùpY5~Èá4¼W™ ÜÀUîÍa±Å3gÎ|Y€KÝ^ˆ[üQèk}1Žñn1 uy1Ž»¸¿ Ņ˜ãsóq©y8IÆ-1 —±œ%Œ¯)‰@)_M=”Ô#@1©™èFªçL€¹•”„B -’I D/¥SI2­5m_FKÚDE”×C¦J\3%”؃1z×I¡öÜB Ä[Çdv|{š–žÅH1do‡œIægd&1g[®dÕ–JB“‚)ÜRÌ)Û¤ÔaR¶{÷îd ‚R9Õº)Ž;vDIQ7&õfuӂÎê._¾|ÞÎé5ݼy³ßr÷îÝAۃ¥A7ÈhÀé÷B.$‘&n,{TÕDΤ£äLªÎ¹téÒæLÊ;“ -pÈm8øFJÜY[px;à°,œIÔa¨8c>áLÂHg².Ü)\îP㤠3‰¢n™¼ pÎ$ÓTg’–œIL³h0¯~¤ÕmWïÚµë+;}û¾×ÕöjkjjöëŽ?~Ѐó«6âLkÍຣ60RƒŒt܅›sÜsñâÅ/.ë˜RŸ9’†÷ª2ñéKÂÂ7v2&,~V„ým)nhhØP|äȑ÷Š+**V—””,)Â/ļBX{^N-3h’ƒKM à<JÎTX±ÕÏ@ ¬O’ÄJäV -‚p”HdŒ‘è=éTF’Ì1#E_ÎVd$QDå-Ï J¼fJÓ%Þ:&/”¦È³‰—½Í5àŽèL -•¹q™I\?€å“œIÔ8Ijœ4‘Â]YY¹ŸR¸)딧NjTcR?©éíí=­£¨›þʕ+ÝÆñññ^ó­[·ú­÷îÝp…]¥8b¤Ho"i"àFÙÛéÔ - ß8dÕ挌Œ̝êL"˧…'Nœø¨°®®n}!+«¬Èµ,ÉcÎ$L…ÙäLÊÂHgepkߒ3Ér&¥°¨[8…;Ë.s3O-sã9“Ô°°mj܍j܍oÕ ´ÝðÚ>íÑ£G+uMMMՆ¶¶¶:ãÙ³g™ÁŽ6°O“×Ñì5{pYM^Ü¡F¤!R—²¬Îd}4AKûrq'w~[ØÑѱ£¨µµuk1ìÃbÜö5ó€e+‹KKKß,ÆïǼBœP^Á¶mÛ²òp½)98ç¤.Á“ñæ›o:Ó`ÅV?ȃ’!J>Ÿo”`» - lWn¢Ò7lWª£ø%5¹•‚ D"'‘1F"<’rŒDÖ.yNFâõGšFšIk¤é—ý¿ü'¦(¢ˆò“(IA ›DIJ -¸ 5àNLLœè™Ä+s e&- g&Mô9“¾D¾—íß¿¿„œI -PAµ²¹¹ù¨êôéÓMjL꧴ýýýgô`.ÃÕ«W{L7nÜè³Ü¹s§ß~ÿþý'@iÀ 2ꏇôz!Á€›ŸÜ°É©ŒÛ·oŸÈ"gR6vp8—œIyØé^b†ï -ˆ -[ZZ¶;vìÃBr&’3©À²,¶±0œIÔ®:­‚–IΤtL¤i©ÜÚ·agÒ¤nr&…S¸‹LážI:*sÓÂ^‚Î$5Lj‹÷)9“¾VÐvªj¥ðK…ØxX¦©ÓŸ9s¦Áˆs>a#µXÁH'@¡V7 ¨Õƒk;é½víZ³r"/¥ŽŽÖfb“ªl€fy.»èžžžï [_·ƒ7ޝ‡C®*.++[Z¼sçÎùE0ùü\tVø 5 J¬™%›?ÔuÒ@]'ƒ î:) JäVR-)‰‡$rc$²2)¹8F’Dg$¶4â´zHÎN¬mvIt!‰"Š(¯¶L¿ëäŒA‰[ð-VPâVÆ}~PŠ‰‘b ¸MÎÞ~ºw*­^Çz&M*s{#Tæ693éigÒ>yMM s&Ւ3éxЙtá…v€àœ~ddä¼qllì‚ùæ͛}Ö»wïö;îéÎÂÎÎߊÚÛÛ·755mžW__¿netϳ.+¯-(‚Ý€hù€„´\j¦ÀõÆgR×É´ بë$J¬ëä(ÅÅÅ)¬°]¹‰Jß ‹Eª£ø›,Q-)Ɋ$r²2éTF’¼Œ$†ÙDE”¿©¼PâVƝ(±9`& ¢%IP¢1Ò³*Üp4Ã3n¡ìmր;‡³+"çÙ"jC³Œz&½3iI7VæZû6VgRgЙèµÜ¾}»Ï~ïÞ½~r&õÇŠú˜3‰Ü|x9){;“œI7nÔç3)»*ÏØSÐÝÝý]á™3gvPcšÝ¢"g’ŠœI*Ú.PmŸ -ÐvP |«Ñé€t'ô==='€v3®£Ã -:ãÿuáÏz^0a»Қ‚—Mi¸a ™ ¥Z–¼ž{ñâÅ}ù}}}» Á\ßá>Z ûhˆlý<ŒÂêyåååocd…zdçoÞ¼9-'î£fJñ™¸¬É ”m ®“í¹©ëä$P‚¹L€¹•&A‘‚DN"#Ëf"eŒD¦ÆI‘‘XكÈH¢ˆ"Š(s'¯(áò9%É$P -ILŒZŸ„p³ðn¡EJ„²·ƒ ¸©ßæJ & 5ážIS™Ûçá27¡Ì¤g8“l̙tÿþý~’'p#gRõÞ>CΤ¶ lלŜIããã5¹W®\©Ì)”3‰çR)®¯¯__\UUµšŠä—’3©vÀVó(È%gR6&ͬÌõëק§“3)ìãOÆÐúəäOÀõ¦—t£¨­TÂ¥p³ÕÜôkÖ¬YFΤ·5 µj˜ÏF5îƄ3iï޽߫8P¢¯PÜªÕ€˜zMGGÇ -°ñ¤ØØn>c#uZqKº`¤.p°ËsçΝN/.úŒÿk÷㽓i¸aÁ–Qø :rœøm8ñóbp"Ëèþ`^uuõDé۞={á7`”X3%®ëä”öÜ ”ŒAP¢®“.ð‹ÊN=¬ é PñL€(H¢&ZR’(ȶ䌑ddãÒ©Œ$‰ÎH„蓉­žø‰=DFEQ^7ù›ëóü +#M$%ñZJbÞ²ñÛ%q+Þ²EJ¦ô•œÈÞÆ,Ä5àÞ,Áì²}ÒJ%O—¹S -&9“t\f9“¬œI&eoãƒÓéÀ¨ÖLàBc68¢.÷ÚµkUù—/_./ÜSØÓÓ3 \6sMM͚b@Ûª¢Pê…ø¢¼Ðú°9“21´©iäLJ!g’œI‰?EÝRÜJá¨×`¾ßXBýVh1 ¿«ÁþÖ«±çT°° 3IIÎ$%9“”uuu‡T'Nœ¨U·µµ×éZ´€»v=°ñ¬ØØe#u[AA=v\ånIݝéL‚œñ™ÚÒpÃ&úFá¡4öŠ<܃’JT*:{öìŽð=˜\úÆzà×`¢™R¸ëd×1ў{Ñ¢Eë˜P×IoFFÆdP¢Œn+ Xn†ÍÈ 0`©ŽÜJ“DM´¤$QÉÉÀ#ÉÈÆ¥SI2Fâ­×6یŐDFEQ^KyÕA‰ˆä9@ " ‚ÒZš¥)ŒÄÖ¹Ü))†¤$¡vIlÅÛPÀ-R²ì ®¯$¦Ü«mRÜÉ/‚ ¸ËÊÊöÊ@=“@õJPÁä27æLºråÊSΤô»C™I\övЙ”ÆœI‡æÀ­[·ŽåŒÉ­,.-ìëëÛYÔÕÕõUñéÓ§·ÏknnÞ<ïèÑ£ëXØ©䶼 ·¸v0¯Ã]@+žeçà2³@ -ikÖ¬IIŵùýÕä$\j²Cë÷€‘R]IQ·ð²·Á~:ì`õX«ÆN?Ta÷[U8ÐJr&)ə¤¬®®®P6ªNž<É°±YÓÝÝݦ˜èŽâ¹ÀÚ­¡„væZë#lìM€t'áå9?[­…-ýËêýp#jƒ)ZœW 7ûË`FwccãÆ0,® ö fJ¬™uÌ¡®“ê:Ií¹ã”~jÏíÃàO€ Bã‚iL%°Ì@n%¹•4°b‰šDIȤ <’“eËÈÊddèÒ©Œ$á1Ñù$Fb+%ò‰-¦qMÛÙf¤Ùiùò‡¢ˆ"Š(OËëJ¬ëd”$|P‚HÃ2áLšÂHQ·yII¡ -·Ä`…[u©ázo³vIá€Û,à†¹geo,aÙÛ´š›”eoWTTì£܇ µJPë™\©$L]D=<*:“Xö6µKJd½·ñò\* !èLÊbÎ$ U]. «*dd¤¼œIE.\ø¶øìÙ³ŸÏ|<|ðá¼Pi|°â«(´†GQ>¦ÅÜ\Œo בžEΤtÌ°þT\`r2p!™œIÉ À#uKuBXԍuáÎG݂ý´6lX­©¬Soß¾}³ -võ©ØøµÇÝ¥Àì'gR•ØXGØxBÕÙÙyJM­6µÔjSà»`¸~ý:ד<ØjӉˤî¬;µ#ŸHhgEÔA*+”§U•‡]í§D¥]”¨ôu0üˆCn¢k‹éFWíÍBj¦D°˜—‡{I ”B ”%jϝB]' ”L^ê:é¡.*}sÀ€•VJT2Ãpdr+éÈ­¤IÔ$*á‘<ÌH225éTF’1ëÏ*2’(¢ˆ"ÊËß”ØÊS@I”) …‘BÅmOuJâÚnsII8Ϥ–’,à 3ϧ5¸¢‰ -7ê½ýk—^ñvRÀm÷îÝ;){»TF·àjnÍÍÍÇÂËÞNnÀ *èáz&ÙB=“‚Î$°@Ÿ—õކt¥€ΦáÓ¶L Asѐ ¢¨ÉT^ºt©¬¨¿¿gñùó翚×Ñѱ}~KKËæùǎ[7¿ººzõ<–š†[l¶ˆÉ0?㛝»yóæÌl\LZ&9“Ò0 É)˜u}¾3)9ž@)uƒdÚxQ7– ‹öPÃ^6¨`C+af;”{öìùNQ^^^¢` íáV›l;°ñ´„×¥ë]Ёú ¸M¸ÃܶðÄw´p .k%€¼õU¸½ÁnŒM¬]’$pû^Ên˜‰°€›¼±±±ž²·O¨Î;×\Ímhh¨S*èæpS+€{¨÷D_IZì6 Ò€RG6iÍœÈLÔç²\¹r¥¼èâŋ{Š{{{¿×ÙÙ¹c~[[ÛÖù'Nœøp~}}ýšùUUU«¨*~){-æ0SÄ)ÈÕô®(%êO{ûí·}~\ª/ <ä#gR2EÝR¸¨›ujԍ¥pkׯ_ÏR¸ß§îM*L¸Û•°º¯¥¥¥»ÔAQ[[[E íõ -œ_“gÚ¦6žS{4¾îÆE=îÆe#芗?j:ýõ×7äRX Yâ€,t⻹ÉX:3 451> D12{œ‡ýõi*薿xñâW -p´ç -§OŸÞ¥p„ Ž9²S0¥ªÀR" -R³|PËed㮦Б’”†«JL&$љ”#ìˆÃ uЙ” fТn遌ºù³pS¸K¬Ø¶ŠQ·ûL]»vílDÏéj@¿zQß½{÷×õ´^z Ú@·Î$=ÐešM2ǀ_dë-7qV[Ðël¸Ê ~¸èÚ0Ò¦à£Gn -=vìØƈãǏ¯ÆkcñÝJhi‰-4ÏíiC»LJß¼yóh­–”Èè%Xoó)Îú֙ÓãŠ2R•y`[Q!Ï J¸«®t\Œ#•U']¸ÞðDVt°F@,kD¡[ÂÑIL¡LT -B/Ö{T?ô#Å’-¤%D2RôøNR#±·+d$¹)#Im`$ñD‰b®>Fò‰O|â“ßQþt $B ­ƒ’˜ÏAÌ~Åi š%ˆìÁHøOu Viœ”Dj>qÛ«RR[“’`Šî×ó“Hh¦$´ä«áÖ]îß¿_Ü+0Ç#Õ)S¦Œ×Ϛ5k -n3™†3×¼f͚…-§á4Ìx»2æСCËãEt $aÁœ¬2#+OÎÄfcs°ƒay7nÐ;핏ݿQ€½TˆC>]„ƒ?V„Óx 'Ô±§V^€“,l»Ÿ×79KÌܑCšœñÈ#8Sq/’éLrâ^Æ;èLòDÝ#J®Ð¦Q7?4I¡­¡pRG3úÆLá~œ)ÜÏp —õ½zõê¦;öÉZ*ÈmŒ:cƌÉúyóæÍÔ/]ºt¾g¿Ôà[eÞ¶mÛ: .p£mÿþýu~`¤Íà¡-AÀ£-¡'Nœ¨ ?yòdmþ[‹ïVÇcé²D¬·Ð…-f¹óېcE¢’»¢KOæΝ;÷å<0ë3îÂäh’ûóX"! Wœ#Fþ1ɄöätVLACĸXu2= ÄÁ±™™™ö(ft‡'%%™C8Æ ØØX}ºêRl %ÙB1ŒøOÒSTÁHìj -û½Ìþ&{IŒ$&mób$rz³Œ$ž7/Fä?öÿëùÄ'>ñÉ]ÈÿfP’Ü ÄÙEDö€’â/F26e¤æ§oÓ·µyn[LJº‰IIlˆ'YRò9 M÷Š[ÛMîÛ·ïÛòСC)cƌ¡Nžñ‰&-2Ò¿”Ä{Ü ”Äh6€’(NÜJ’7(5¸•d7(AÔ3–z1’ÅÃH"qûŽ¤$¯Äí;“’J˜”TE{ԉ!‡u IIÏ2)ée©!)©·Ì¤$eÔ¨QՉ'Žu;MæΝ;Ã~™Ó4Uy9S•W¹S•Á>kCš¤*¯ŽÝ_/2pðqQÌMÁ*ï¤cå)Y€‰q9[·nžؾ¦¦¦wÁŠ+Þ,yü¥hΜ9ÏO›6íñbÁƒÅ#FŒèX4pàÀòÂÞ½{ äµÇMÎÊÃ%¤±rË= ¶ÖA4ˆgÔ-ŽQ·xFÝâéLJ`ÔÍɨ[rpsQ7N2³p’;…Fø)úÕKúž={¾©Š2Rà’Á"©‚U&«h—™*Øq~͚5Ë ¸Ž5F4É8§ÎrðàÁmÖ#GŽì°?~|§? hWàéÓ§w†œ9sfGdk$>ÖřÖÇ£V'¨–& žñ7ŽLs¹ qºç»®¾– p}>·§K.Úå¡ÜtÌÅI–eãtó³ÐÛ³X˜\”H1ÈX.52‘Cß聱è~QLTŠ@W6‡¢+ƒA<†°ÞI±¡S+@‘l‚HFŠßIzv5•ý^ñ0’Ü”‘¤æI›ØVc$À쌄sþ%FÂ=÷1’O|âŸ4–֝I((‰ÜÕ;AI"ÎH@‰‹z@Ivƒ¤yFÂ*‚‘LnFº3q;ÈSM2Â;qûÎJIÅZ¥$^êC¼òÇu II/1)é øыIIýe˜Þ¡ -X`Œ -L™¤°LgÎl# f {‰@°ÂÄYåØY£^ª …¯ ­¬Ž…¬p@–:ñÝÂd,“¶ÿþàˆIÙÀ€Ñ¹[¶lÚ~ãƍýò= -—-[öZт ž/ž9sæ“ÅS¦Ly¤xìر÷6¬ª¬RZ ÈÏÇ=Ïiû›‘ ó™"¦eÔ-! ·1žQ·8FÝâu‹‹9˜ÂÀ¨[£n)Œºeˆ¨§+±qî[¦pw4³p’‘Q7çY=S¸U4Nwµ¡&ù0eÒ¤Iãœß4uá…sT´Ëb=Øq•~óæÍë h’M&\åV3èp§Œ´ÛFÚã2ÚxöìÙ=ÁçΝÛف[¢AKµqX¥ÆqìرNcí&*Mv'*a÷ƒ³p ÞÙhœ7rpðr9ß].Nèá\Ü·{rzõêUžvSÝådtíÚ5-5RX#À…ÖˆLÄå‡:˜ÑˌŒ [èÆŠŽc -ñЏô~ %ÕFZ²@d3D2R X éÉH*™\á IŒD:Œ$ Fò*¶­1’($©1’xò4FzôÑGëN°¼N‡ëøO3’”|âŸü¯’æÞa¿#(‰·r@Iü0Ö@Iä`4€’DV‘H-ã`’”XwÆ JœüÁ JÀ™$…7(ATJsŒdv'nc"qû—ªIŠ¤¤LZª<)˜'‘”TN£ÔQTJâ/õÇt •’^”X)I‚…í! 0 Ÿ<|øð!ò¸qãF+S§N(Kz°ÀlÃòåË×®]»Ä=œ t³Ú+¾ÖŒ´.Œ´žÃ¹Ö‹á\‘G] YYA/ɒ$€Òü€Ò¬t Ä´¬Ý»wÏÙ¾}ûÈvÀ€Aùëׯ»põêÕo-Y²äåâyóæ=S2cƌÇK&Nœø` XàžâÁƒWõéÓ§¨°[·níòq§³Úᮦ吺uKÌ`BNª \n£nqŒºÅ1êæ`á¤DFÝ\Œº¥²pRIí쌺Y -'ÝkQ7Váf -÷ "…[íÛ·o/•)ÜÌØÅƙ¤ ßQpº Tœørí²V¿mÛ¶Z p«ñàÁƒ;͸ò=֓'O‘öûŒž?~0do(dWÄûï¿¿= -´T ZZï8qâĪD4âb—Hå…ÐØc3ÐBC9GnŸl0ë[9¸3/åLž<ù©œÑ£GwÎAãtÊyûí·+²ñ|f±òf Jqª»$ÿ‹wqè[".?ÌQXX‹þá š¶E€n,¡S0º!¤÷C§VmèVŠ"›)Fˆd`oד‘Tö7ÅÃH²ÆH|H¤æI+¶-Iêøñã5"A™’åNàÂâd€Ò¼4€ÒÌÌ}ûöMÉ(ÍV k¿iÓ¦þëÖ­ëY x½xñâÅ/–€Aº–L›6­sÉøñãï/1bD‡â–õîÝ;¿] '÷7£nh -£nάΝ;'ˆ±ðŒºÅ1ê˨[,£nqŒº9X8©>ê†[›ÎîlNjÏÂIõQ7Q8 †ùQ:ÍÓzô«¿¨ È·TPdExÚ&L˜0VÃMUæϟ?G@.VkjjV©uuuëõ`Ç͐à#®wسß:h#ò -¸xñ⡠ȁPÈÞð .ìŒ-mKmŒï½÷Ö¸ãoÿ–ÌD¥Ô­[·ŽOGÛÏ‘õËB u˞={öË9S¦Ly:·ìќ!C†Ü— Š¬ÊƒSœ zÈË`‰ò4¤‹s‹Œ­èDft;€.Á±èÏÑèÏöôK(ú³)Øc D§Öû£G©vðb…ÈfŠ"°@Ò'%%I*Iñ0’Ü”‘¤6LH¢1’ÜÖ"#‰ÄmÁHâ!n+#ýg’–|âŸü¹¥õ7W‹éI^ $Þ¢â}*~‚¶JâM­’x™ÃšJ|ËK|ßKwJ¡¡¡(ÉnP²Û킖RBRÝ" ÿ F2zÉÂÍꓒ)˜»SÜ6NJ"5®&Ù0}›HÜ®bâv'þ\‰Û]ØÏé<‰Û·%˜ÙAòèÑ£Gʓ&M¯¼óÎ;SU`À,÷H.Xç%Æ 6¬0oÞ¼yMÓ!ïÁHµÁ`¤Ú01䝃¸¢!5î”ÐÒò$,X”p˜›ã?#  4)w×®]£Û†ä×ÖÖö-\»vm·b@Ç+% .|®dÖ¬YO”*;vì½%Æ «(îß¿QQϞ=ÛàžgåãÖ¦åÁ†ºržxâ‰ÄL\ŸƒQ·8FÝbu‹e…ÉXŽu‹cÔÍAg’“…“RèLÊ` -·ˆº0…Ûu3qî[# '`ŸÕ£;¾ªŠ™€Ü_A pS$Îo†²hÑ¢ùʪU«–)hœµ*.¦VvÙfî6â¢÷›N:uÈröìÙÃ60Òû¥K—Ž\¾|ùpäPd8¾Û ZÚ–ª‹Ã5l5[àNTÚ¾}ûDNý62¸: kɒ%=²’¯fO:õÙl´Ðã٠ܲq/;duëÖ­$gß.ב™Æ¡o)€ÀVތIä¬otêXt’€h µ=ˆc 옃ѩ ½?PHµ£{+Vˆl¦˜ˆG,•ôèp’ʯÂN§‘d‘˜'µX$©ÅB’^Œ¤ nÓI<ÉÍ1Rë·ßJ>Zò‰O|òÇÈ]½¥îʙôAIâ{\â]j”ð ¼”h:š%™ $3“Hf¢’LØ ¤x@Iu Ȩž‘ðQ0’É›‘Dâ¶`¤°°°POâv ILqÛ|5ÉJš¦{i•XM’Y±OðòŸ¥uù‹„»ð¦è-Ê£F!Oœ8q]%S‘  s<_ X‘\+LuuukÌ°Øë¬`v0Ò&˜òº £GÖ…À²×v‡lˆÙ6øo•´´,Ì°0  4; 4-Æ|ÞΝ;G¶ß²eËÀPFï"À؛ÅÀ²—JhO—Õ+´=P -8©.ȕ -Šw¹¸ÉíqWSòp/Ù=ö˜ƒQ·8FÝbé9‰á¼n1ŒºÅÆ0›Q·„pü—ĹoSéLÊdÔ-)Ü"êVaQ7˜è‡™Âý¤žQ7µG¯«ýúõë- -“+"$9mÚ´É2Zh–‚Ó]¤€ðV*›6mZ¯ 7ë÷ïß¿SKÝgÄå29s戌tÌ -:n¿råÊqÿ«W¯ „  -Ãwû".^¼¸3úý÷ß߇-6ˆø“º‰D%÷Œ&8ÆètmPæ²eËze͛7ïµìéÓ§?Ÿ=~üø.ÙÇ0(Ù1‹Cß2qöù錬4}KaF7'Že»D8˜¨‹NN큎c C§6£ѳ þ@!ՎΥX)fˆl"Øïõ`$Iõ0’ž'Ӎ){IbbœÔz€_Y$é®n-FÝ|òg0>ñÉÿ~ù7?¦Í9“ZŒºy’øY*^¾w‚’Äw¶Ô,(Á¦4¥œœ ”d‚’L`‘“ “™:Ô()d…´¤…„èIFþg¤˜¸T0’•[ع­¿;q»‘Dâv4Ù,ž÷ª&™×\5I-q›Mò[ҝ¸- 8p€4bĈá2líX0…y73•Å‹ÏSW®\¹„ Ê+Œ`¤µ&0Òz ©ÖFjT(F}K(ÈhsÄ©S§6EC6¸Ý"ønU–.M(-H‡ÝŸ•Pš’‹½Œmã?¬`óæÍý‹Àa=ŠAd¯•à¸Ï—‚Až,¦p?jàÜ·zÎ}Ëî·Ä,w -Nc¨@I™!Iyá…så+V,Upök_­º{÷îí*.p×{Ѐ68lû3ƒ‚NXÁC'í|ðÁIÿk×®„ †-ˆ¸|ùòž¨ .l‹={öl­ˆ¿%ŠÌ.Qœ“‰J©h«±é¸C2–/_þv&xò,`í‹Yh¦'³pÎ0`À=™={ö,ÏÀQŽ~ŸôKMaF·‹î¶DôìH"4=%(`ã ı…¡YBгM %ƒ?º•ÞŽ>®Z!Š…½Ý„ïd#–JzúTU#)F’ïu3šÒlpÛ]9“|´ä*Ÿøä?$ÿ‰ç­Å—›#ý*P’ˆÒ¶”d‚ˆLP’ J2 ¥PâTYt) š)Œ¿)d•¤’‡ô”zF‚‘ÌÍ0R w†“‘¢˜¸ǐŸ¨&™ÌÄí«IŠÄíGy½OÑμÈ{]Cړ‰Ûý¥áǕƍ7Fž:uêdyöìÙï0œ4Ï=ˆ«¦¦f…aÓ¦MkÅhw30`“f{³ ijÕ,°-´-F}kØéÓ§·Dž9sfm6ÄãcM"Ha¥ëäɓKÒ°ò¼LlöN6v0) 4:à5¤»ïS ãß­‡|¹¦ §ñxNèÁ2œZÇ2œdy)N·°¸W¯^¹E¸ûù¸µ)LOrævéÒÅÁô¤8¦'ňzALOŠv”b JQ%:“Cñ19 Ò9÷m 'pîÛ2Nªf -÷ƒ,œô8 '=ËÂI¯¨}úôé¡°p’((%O™2e¢Ìn™)ÜòêÕ«Wȵµµë\Ìfeß¾};U\å~=.ú]ˆç˜ìsÒ -:e#¶}øᇧý>úè£S“Aøx,´ôn8hi_Ô¥K—vÄ­êâhŠô.€×|g4IŒO– KÂöͪ½• hûKÖ¤I“žÊ5jTç,ðd§LÀ]Eš©0Ý©€Žô֗ráRãA‡Q I†Å•””Elü#ѳíaèٖВ)ÝÛàÒÛEª ¢X ² ßÉFþJ0`=IOïªJFR<Œ$“Ó5F’~eâv’’î -”Ú@K>–òÁ“O|ò{È€Ú -2Rs $Þ±M@I"8H¿ J2AI&(ÉnP‚5¨%ÀI=(1"ÁTj™ü¢dú}ÆßêA °£{TҒJ -ғ‡ #ÅD1s…«Ø¸²Ÿ›‘BCCƒÉHaD°HÂX,VŸ”“•ÎÄíúj’eee¥H¡3)øËîB¦pW°pÒ=,œô0S¸ŸÔã/¨ÀÉ×Î}«ÕÑç6Zž>}úyþüù³e6“ ”\-oÞ¼y£²k×®m -I*.õW~Ôâ9iûœ6‘ÎXEgmüñY¿O>ùäLäT>ž2 Ã*"T»£ÏŸ?/âobüÛJw¡nåÌ4ØÄԍ7ŽH_µjUÿ @e÷LÜ·W2ÑVÏdŽ=ú±ÌÁƒߟùöÛoWeà-NgFw*3ºSÐL.ú¸ÃÙ©S§hÚ <ý%8`™ŸŸol[CнÍA  cú¸Þ=LµA »¼‰b$#èXÕc I%#)F’#1q[0’ô;ÎnÛzfR@é7ӒO|ÜäŸÜ)µNFwÅH^ÞJR#PÂoØÆ {)0d¾Öe7(Á®Öƒl€%… ¤”æ)%…è¢4%N•EPRÉ9ª”‚‚‚ô =QÈ@(2RL”ÆŒ„õ#pÛ 2R()‚ŒÔ8) ¿íSy.YLܾcŠ[€ƒ¨&مý,Ûåe]7üéúöíۇ‰Ûƒ%ØÕQÒ¤I“&2’4Æ®²lÙ²E‚‘TÁH[·nÝ`$#‰Š@pÎ0`§«&œ>}zW0 h§»GmE g>nHõ.¬²< ´0›ÍΆɟš‡]ËV +ÄîûÃî÷(]³fÍ«eK—.}®|Þ¼y]Êg̘ñpùĉï-5jTEŒQiŸ>}òŠq™…¸Ó©ù0ŸILOrdãÆeÀôÆpΒhN€ÍèRt¼%ÜA7(…ῤ`|—ˆ¥Yt&µc -w1S¸«8÷í}LáîÌÂIOéы_rGÝ ԇ•7‡2É}yrºLŸ›ÌnyÆ 52ø¥NÞ»wïN¸_ÝVqù'ô.\8e¼råÊYé}  è¼õÓO?=o¿~ýú9ș@||/ Ž…a•w#®^½º7úâŋÛÝñ74Ýjw¡î}ûöÍNÞ¾}ûäTܙQih°éK–,é™1gΜ×2§Nú\& ÷‰Lftgà&WgtïÞ½$7¾}*kt§D’]èD3Å8:vìÁ¸dH zN`$~ø…£{[CÀ>æ ô+c@vv¶ÁP¤Ú Š3D6’‘ d$=¶T2’"‰‰Û2“’$&%I ¸IÍUÜ֜I‚‘Zw&ýJPj2ùêÏÅR¼¹ó‰OîFþPÔÖ×W‹xÔ#µuÃ+Wâ¯T‰ïb‰oe/P’[%… ¤”7(åææ6%¦¼2¦2kHeŽµê% ŽÊ ™žn%=ÙÇ@ -2–Œ„"ÅL±ð;ÁHv®ìïa¤î*œ;&#œ‘œ%ëׯ« ÐñrùâŋŸ)Ÿ;wîcÓ§O b„ Õå#FŒ(+8p`A)Î>§ב^ˆ+JfzR"«'ųzR,ç,‰fMŨ$–Jq¥h‚R$!]A°ÝiX%Û+··a³R vЁ)Ü°pÒcLá~Fe¼ÂÂIݐG™sß289‘)Üï°­ÊLá–7mÚ´AÆÅl•ÑL{”£GRN:uLE¼§¿|ùòYõk×Λ€B̀¢‹ÖÏ>ûì¢rÁò~ i) N†Ò­ñÁìgüm§;þ†Æ^+ -8±û¹.hjJ]]ݘT|p:N£wnÞh°2˜Ñ1|øð‡2˜ÑÞ£G²4ÖèNe¢R2 2ÕÅJSN¦r9ÐU"ÙB¡¬/‰>äⱅ¢KY‚@A¦ttƒ Hoƒ¨ö{3D62m #鱅¤’‘2’BF’p“#1à&‘‘¤Ö«4çLj13©uPj‘–~%<ùä÷âI2ùäÿ’üŽdôû Psâõbl‘‘¢n’Û™t'(ÉôýË̀’BPRš‚’JߍJPR™;­Ò©£6%=ý>zz€ôŒ¿ééV2{  #iÉH2QÌ ÅÆõŒ´ -lÊHQÜs“¡íKæÁ듒pV’’`Šîw'%±š$ÛàEފ×u½zõê©cⶎ‰Ûdœã:U‚ÝŸÍl›…ã¾Ü=Æ}˖-=ŀ¶›@7»Ì`¤=V˜í}vVM €ß2ÚÇ:@{8`ký Ûâ u  ¥õI¥Õ©Xyi@i^6¬ýŒ¼C‡MÌß»wïÈÂ;v *†Éï]ºnݺ7ÊV®\ùbù¢E‹ºV̞=»sä¾ŠqãÆU•Ãî— 0 } .!‹éI©¸¿Iíq/˜ÇÇ<îJÉ%§ÈÀ!(Å”¢8Í[8$1¶;9͔îû›cà -¬<òHS¸;²pÒCLáîÂÂIϳpÒk -ŽÛ‹…“Éh°Ñ2GJŒºI˗/_"áÄ×Hh«MòîÝ»wȸ¶} -šé°‚‹>¡¢qÎè¯^½ú¾tѺl]¶|þùç—m_|ñÅ%?ȅ|<Z:òÉ'Ÿ ÿðÃF^¹rewŒˆ¿‰ú“,ԝÈD¥$€ëôdàåøT|XN£o:Nè­ œÚK ß®#GŽ|$wúÞt\BE¬0—•“̃]¬]î«Ä'°­âÐLa Nqú;ÿpô&[(ØÇ -2€‡ ~½}Mµâ?ÅÌà³ l #鱅¤²$…7E0n2nnnR‹Ó·5çLj1êÖbŽR‹ÈÔVnòÉïE‘¿#7ýñÆÐ'>i*¿~3û´ŽB-’‘†G-2’p&yEÝðj–ù¦ö%… ¤x@I%(©ÌüQ¬†ž¬¢'(é™O­'Äèéò d`üÍ@Î1xŒd#iÉD2ŠÌ ÅÆïì\ª1R0· ##E’‘bÈaÈEOVQ-›ISíyj%<Ó*žx'þR¿#)©gϞ=týû÷ï§ó$nK‘)d&ƒH d`Ê2ÝZ£ÀoPÉHú}ûöm7‚‘v›`ü÷ZÀHûmgϞ=èF:Ȃ‰‚/]º´?ìòåË{™Y³+²-ßÕ%Ö'c½Ui`†%™¥¹9¥ií`íÇìÙ³gxÑöíÛû—lÚ´©GYMMÍ«å0ùÏU,X° Kå̙3ªœiÒ¤§3pº¦ãÄïKg¢R.¦(—•—Œ Ìpq6<'̑t‰ŽCk„³™‚™îQRRbEG·ƒ‚́èíFˆÞ&wìØ15·6ːÐγ]lyüñÇ«˜Â} '=Êî§Y8éel֍…“úq.—á,›0Þ·w$FÝ$FÝ$6˜¨Ü&8p`¯Œ¶zW>}úô …Î$Mr^ö\Ö€®B×L £Í7oÞ¼f…|`‡\ñ2] - þì³ÏÞ ýø㏏F€¯êãoçΝÛÄD¥5 ‡^âd¢R•’Ai£RW¯^=0mñâÅ=Ó½¯¦ãÖ>—ÎғéLTJgéÉ4&*¥¢3´KÆfºp©ÉNtù„ôö˜x4XD Ú%$ -=eËýÂ@KÖ`P9(nô‡ì #½ÿ)Š‰ùzF2’Œ¤#I*IŒÄ€›Üԙ$µ8‡›W=¯Ð[ën¥æ© ðä“ß•,ïž|Èä“ÿ5ò;âQ[¡¨ is/¼¡È ¼üHš3Ic$¼‹e·3IDÝðºVøâ®%ØZÕJz‚’ž ¤'(J-3°F€Àb$º JFÆߌdéÆD·’‰n%±ÇLZ2“‚,ä!+ÉÈÆÿì.à*AD«zFnE¼â¸çDº®’ÉfLJÊå¹òÔÊx¦Ixúã¥>Ífz‰7ùM]Ÿ>}zëXMR7jÔ¨‘:àÇ 2CZ°`Á<?b¢Í*&Ú¸‡·«{÷îÝ®?tèЃ(* F:dfQi«§¨´?xèHÐ|p8rF}_4þÛ4ؖPÚäKÕ¤”Vd”æœ8qbf;€Òä|Åè¢]»v .Ùºukï² 6¼Qkÿbå’%KºVD:WNŸ>½Så„ *+FŽY\>hРveo¿ývVI·nÝR™ÇÄùäªô¡Œô‘ dô±ùÖ­[Yoß¾ý¡ ÿ}à‡ï.€–„[ét(¨ê8ão‡Üñ74âfQ‘ÊqôèÑe‰LTJÌNsᖍMÁÍ’ÊD¥44Ýi ¹ҙ¨”ÎD¥´tLÃŔ¥à²ò“ñ|d»ð¤:YÅ<­ˆ‰ŒE»„Fq‚"***ü9¿‹-´d D73ùŠ vˆÞFŸªß)&,•â`Àʒž54T »¤0à&œIrSg’¤9“~%(5ç[j‘›Ú€Q>i“üJ´j+7ýJdúãͧOþ wÏHmͧnCl¬ ØÓ: -yA‘& ïÓƱ6/FҜIxI+PR J*AIOPÒ{@É@1x@ÉHP2”Œ%ã`&fV›ˆ3&Æß̌¿™É9f…´d!-Y‰B6B‘;şßp©ÆHá$­(2R,wšÀÝ»èKçqsÌgтRV“ìÀs¾N±Î¼À®l—xË^ÓõîÝ[$%õ×ÁÚ×1)IÇÄm‰‰Ût‹,–Ö¬Y³Ò]ˆ£¶˜üúZ‰°ÉŒ`¤wM°ûG,.\8f÷c=éQ&¦üH˜°çý1ønwº¢^¿~ýšþ‹/¾øØúÄ<úÔüÕW_}b|lƒ|è‡ï®`éÅ º•B°ÅÉFñ7‘ FÜÏD¥ܞN€æ •’kjj†¥0Q)•‰JiLTJ×=•ÆD¥40潩œ#7MW˜Œç-Dž§"͉‹NJ@§‰bGÅ¢Õ¢ÑLÁ€ÿ0t.{º¼%(d -ý zDµ@3ɈUdI‡DRAZ’Bg’â%¹)(I-‚’6]I‹´Ô"2µO>iEÚúÞm+rÞ=<µ™|´ä“?#ýf^y jʔ)ÕUcǎ-­6lX~ù€²K{õê•VŒ~êb=îx‹ã€·èLÜÁÈ4€RA)"‘ ›c-@)> ÿ%ã»ä,ÍðÃMγážYÐ*Lè ŒèW0…»+£n/±pқŒºõaÔm(£nãu›A¼œÏ¨Û -FÝÖK–­Zm¯Äné̙3'e\ù9muIùä“O>P?ÿüóô_~ù姆[·n]7‚Œ>3}ýõ××-ß|óͧVü÷±ß]óÇÒˁt+c‹S¡ØV‹¿íˆa¡1kžãÝwß]”ÈD¥$&*¹š#R˜¨”ÊD¥T´ßËi¬¨”ÆD¥4°Þý©}ûö­JéÞ½{q2úFž —šáÄáJÀàˆGÓEÇ¢é£ÑB!‘èWL|·s’kPyy¹9Îè22Ø ª3ń¥²Œ¤§3Ie}V7(1ê&3êö  ä•Ì­Rs´ä…L^ÜÔ¢´á…â“_ÝmÀ¨¹éwD¦?Þ¤úäÿ˜üJFjÚ@Fm  ßp^ïD/Ñޝ ROF xÔ<#áçk=#áM­zœIz¯ ,ób ( JF҈‰ dâ¨23AÉLV±”,% ƒaVÆ߬Œ¿Yé²Ò­d#ì؈=v´äGò§P)Á\àÅH1d¤xîÏI‡U -”IOV“’ -9D9O²#OüڙÇxùOóVü…IIo2)ém&% bRÒ(“’t")‰¸JLÜfèh-Ë$ÖÊ¢Lâv«GŽ9Àz҇ õ¤O°žô{VØýSv Ð)Ñ{A°â'˜x|,ÿŽ†ì-íN (¹®^½º1æ}u@iI@iN;pÄÔØø±E{÷îZº}ûö>å›6mz«²¦¦æ¥ªå˗?Uµ`Á‚ÎfΜy_ }UN¼¸—Ю¼_¿~Y¥@¿ÔbtG'¼9X;6÷2J€R*Œp„‹ Ä‘\‘q¥h‚R$>AX€U2íX¹›әTeBÓÝÇîGY8éiNz™Q·îŒºõgÔm£nu›É¨Û"6Ý*FÝjµ¨›„V;*;w;/£­®(h¡Õ/¾øâõæ͛×õà¡ÏÀ£ÏMß~ûíçfÈgVȧvÐÒG~Xêv+c‹3žøÛA‘%/jSqê¼µÐæÒÐæ'qŠkãƍ£“W¯^=(øÛ+••RYQ)„÷D*XïÁTP_u -Ú¯4v{Ú/ˉöKIàÄ/ñxbcÑù#¢ÑB¡‘h°@Æ*ýXJÁ Z2¢ó›ü!;Do…¨fˆbb-V#ëŒèLÒ”T:“Z%-GI$s7çVjη¤!“&w¾Z*ŸÜ¥Üw¶HPm঑ÉGK>ùó2R‹.¤Öñ¨Å\¡æP艧^¼^Œ^¢½@¤~Ø¿1®­d7i~$ÁHxSëéLғ7 P2’ALŒj™Jf‚’™ d!(Yø²2•ÚJñ7qÆF·’n%;9ÇN·’ƒp~ ú–ÈCB‚(Áü.”Æõ"¹E4·##%r§Éd¤t-‡Ï織’á:ðtïãÅtæ•weÛ¿À;ý:+%õd¥¤LJÁ¤¤ñ:úé:ú¹LJZ*NÖÐ#²QÞ±cÇVØÚ­pÎ Q&Qæ̙c†óçϟ4qÎ 3ëI[AAg좔4 øie/r<r8ßíAíJ„eߒ PڐPZ• ó¾(÷Ô©S³Ú;vlrá¡C‡Fƒ-•mÛ¶­wEmmíë•kÖ¬y¡jéÒ¥Ov˜?þÃp¦÷vœTTáì +‡ ’[êË(íÑ£G2ó¸óѹâòpÑ1Ù¥ ÜÆJIPŠíÔ©STš)6âÁǤ@XìTXìl;îy{+š®ÔŒ®RÍî èُ3êö,£n¯2êÖSª dÔm£n“釛ͨÛŽu[˨[£n»u;(1ê&‰¨.ÿ¢ŒÖø@ùì³Ï>V¾üòËëêíÛ·?׃‡n@F7Œß}÷Ý 3ä ä3¾ûÄK¯`½ËA7nÜ8‚mÇß°ç­±8Æúø£G.OØ¿ÿ¼Ä;wNKb¢’‹‰JÉhÄ·SXQ)uúôé/¦rê·T°Þé ¾{RÐ-ʓÑA -\xt³xòÒ9•°ƒµ:ã˜ãƒö ‹D[…£óû3ûÝÆ✖@þTðì½¢Z Š‰ŒdÄ*^ $5 JLæ ÔÈ­¤Ñ’æ[j™¼\M^՜´þòðÉ/I[ ´EŒj›ZG¦ÖL>Zòɟƒ‘šs!µš#£æxè‰çŽw¢—hïÎÑFük¢¥"ÉÍ2ÞÔõŒ3kdÔÍÈX–‰%„Í%3AÉÂQeV‚’•þAÉF÷Ž Cv‚’cc~t+ùqüéVò'ñø“}è$ -$ -™‚(!”P~Î¥‘ôAEs3ÁH ܕ‹{N£ë*›¹Q화TÌJI•¤¹{y ó¢Ÿ`‹?Çûö -+%u× 0 /+% ÕqŠ[+%é`>gë’’V1½f= ý–’Þ%Ó#"ªÿ¨§OŸ>®‡M~ÏFsnœµÀXŸ³…Îù±”t ø -ƒÄÇÃ1X°ßŒÚå$(¥À²¯O¿xñâʬsçÎ-̃yŸ™PšTtðàÁ‘%»wïX¾uë֞àW«@ÏuX²dÉæΝû`œnÇ°ñeU°ñ•¾œr Kó¸]Eè‰ ðKPŠÎÆ]LÇmŒHÁ w”  M“IÆw®@,MóÃz96lQ`Aß(cÔ­£}÷!Ú¯‹¾gϞϫýû÷Q·ÞŒº fÔm £nSu›Ë¨Û22æ:ŽuÛ¨ÛFÝÞQ7‰Q7éÚµk—e´Æ‡ò_|ñ©róæÍÏÕ¯¾úê†<ô¥dtÓøý÷ßß4ýðÃ_Zðß6|wÝþÍ7ß|äO·R ¶hõ'Y¨›óçmŒÃÑV9p܅‰»vízǹyóæ ®uëÖ O^±bE¿Ðp·Ný–ÊB©£Gîœêë”Ú¬LîÞ½{‘ Ït®žˆËw98M^š$:$…' 8œÀÌ.{0Ȉ'ÀìÏ´6Ø8 ÔÂêbfJ‹ ¤xr”d1êÍË­Ô"-y!“75GP>i»´þfm‹¶T­ç‘µ™Úê`òђOþŒäåBj+y‘Qs<Ôñ4ÿNÔޘwJý|m¢ÄvƒÔû"Òµ…ˆ|$GšI0,„‘øa¢3ÉLP²”¬%+AÉFP²”ì¤?‚’!Ɵ.Æßè - [)€°Hì $-‘–„ŠB(a”p~×#%‘‘RÉa™Ä²<¼çRNëȳ€ýÛùiÞ£—Ü·~ýúÕÜƎ;J7uêÔI:VJÒ-^¼xŽII҆ Ö1jT'¢Fî -‰Ô®‘D)iéŒÖùKIŸ·pº xè<Ëý¼ÏQìgC §Â!'¢`ÏÇ”`Ôw&”6§”ÖeÀ²¯È(-h÷Þ{ïÍ(8zôè„â /…yï_¾e˖î•ëׯ¹ -gõLœßcÕsæ̹¿\Ò¡¯¤ -¬×¾bàÀYe½{÷N-Av2ÛÑÝ,6Ý'* ÷7‚ žL/@‰£Ý#c@). ‚ÑjÉ°Óé~¸ç¹6t†B úU£n÷Ñ©aÔ­+£n/2êö&£n}Xar(˖c…ÉtÆ-`…É:œýÚo›Œ¹Q·#"ê&1ê&¡ ®Êh’ä7n\Wnß¾ý… - -º©Ý2nüñÇ[&ÈM3>Þ°‚–>·cé'þt+Þºuëb0¶=Û(þvéÒ¥]Ñ8F], Äã¸Kp³¸—““pWGºÐ’’-ZÔ#……Rp÷ŸMa¡€Pß)à¿É éžøvN\tf".?ف†HˆC“ÄÄ0Ñ+ -́V df—Ç -ZYÊÜ€ÇÀè1”ô%ՌŠ©”d7(a I$s»AIs+i´$ -ˆApÍ!“ÆMÍÁS‹ÒÚ;Â'¿,ͽw[ÒæXÊ ž¼¸©­ÈÔºƒÉGK>ùOÒ¯d¤æðÈËqÔyAQ‹ìãõÖÓގ͉ö“4Ù-¢†¤¨$Æþ‹T$Gw2’‰Î$ÄLP²0´e¥ïÆÆl ;Aɏ¬âGPò'(0Q)€ Èø[ Á&n¥ rN3°ƒ‰=Á ÒRy(”F‰àw‘\Í`]·pp['™+…Œ”Ácäðù<Râ[ž³¸=Â&~’wFÜ^sÜ<@7zôèáoÓ-\¸pžŽ•’hã×JLJb -òvYþÓm°B¢ -#üžæø¬Œô¾ñ£>ªŸn(tÉ(ºèÛ}!èË/¿<9Ž'¢±àp0jVÞéÂfu¥šL€Ò²ìt^{ì~zá‘#GÆïß¿hÙΝ;ûVà4ު ½Ô§öT5N²sõ¬Y³:UO™2¥²Ì{QÌ{^ŀ2Ë`ÞSJÐw9qI<¼ÅpÀ[d&A) 74ÜEPJ$(Å”˜mMk -I ‚䬒aG?ÈcÔ­ˆQ·Júî}ŒºufÔíiFÝþ -“Ý8Ö­£nÃu›ÈÌ®™Ì~_¤Û¸qãjݶmÛjuûöíÛ¡cR—ŽÓ•ˆ¨›Ä¨›Ä¨›ŒVûD¦3Iùꫯ¾T¾ýöÛ[*xè+=ðè+Ã_ÿúׯLÛfÈM+¾û†¥×ýTºãohâ÷=ñ·w#®\¹²' -»%͹.Ç]æÀÌMܾ}ûTgmm혤5kÖ v±P@òܹs_O™>}úó)`½.)@·’ Ô1½¤Ì…KÍw⢳qù©4„3]\,'2͉g!ˆÎ8Ž´ѱ€Nh d‡è­MAÉHP2”ђˆ¿yhIjJKîÝÍ!“ÆM^ðä%MÞ>¹iýõÚ"š¶ˆV-&á·^å¡Å9i~3-ýñ¦×'ÿKä·0’W˜­…:EwàQ‹däÅC-ÏoBíeقHDÌi+ªk7ˆâ1ì_ˆ×1¸]Hðâ6“‘,d$+iÄFP²”ì$?æù3ðÀáf¥@BLS‡‚È4Át+qBèV -!ñ„’}BIKaD¡0BQ8EàQ¿‹áÒ8ú ÜL0R2÷—N‡U6©=^̪ä銀ÛClÝ'x+žåm|™·nž€ÛVÀÛwÀmÙ²e‹u¬”$qJ2‰IIb<»»Š4S•³gϾ§lÎrºóbº “˜nÖþŠ<¶ 4¤gðve]]ÝU555/vX¾|ù“Õ ,x¸\wo5ढØ1c -«†š[ѯ_¿ô²ž={ºŠq© …è‰qíÐá¢sЯ"3ÑiÂS= ”à¥(HL8$>·Ö„¦KñǍϴ£ýÚYÑKÌè¬u»ŸQ·Çô=zôxFÅÑ^á¼n=8¯ÛÎë6’Ã'KK–,™Í¨åq­—P§hîÒ;v쐎ӕ¸£n`ÌËS¸u».ߺuë …Î$…Œ¤‚‡¾ÖƒŒ¾1üíoûÆùÊ ¹mÁw_Ú~øá‡ÏèVú˜n%»,Ê*1þŽ=páÂö -ˆÅqWÆã $€;g8ќã“X(ÀÅBÉ,üÎ;4 `~*Ô÷H2ãoÉ}ûö­páR ¸èÜDÆßðè&Ås¼X4Nt4ž”ðH4X0Û/€yðv–é´Ò­ä1” VOü Ô8þFÑÆ¿¹+*yIjŠLî9r›ã& ž¼Dc)Ÿ´]~ñUz‡´N¥­ÇH[¼Ø†‰iZ ÇùhÉ'ÿQPº{FjµNF^(¤=’ÚãìõNÔޘ-ˆÔTd·ˆùÚD‰mˆê1ößàNEa¶ÉΨ›#]þ¥²J A)ˆ ̤ê`FÄBˆ3!t+…Ò­J·Ra'ŒØNZ -'E™" EQ”h~Œ¡Äq•zF¶ÉÜKwšÅcäñ…äµržiµ;à†Ö}”7à)Þ­p{ƒ·^ ¸ dÀm$np{Çp[½zõ -úAÖIÛ¶mÛ̀ÛNÓ:ÀâˆGdfÖhU¤õàœKú+&˜è«fPÐ, }Õ&ÿ -=—‚!çÃðñL$œŒ „•÷9= ”Ž]­ÉÆN—äa÷³óq )E¥Ñ¥´AåÛ·oïU Þx­ðíùj€\—jXö‡:²w¬†e/ë˞_˞]˞V˞ÄoN\ËoQð‘!@‰–=ÉJ¬å%G¾sbiª?ÖËbÔ­=£n¥ftàj#º÷ƒ<OèA›Ï© ÍהáÇ÷’Ǐ?HmŽfÍ©)Nr.Sà—é6oÞ\£Ûµk×Krê˜ý®#hêXa’Q·+Òõë×?–@‘ŸÉt&Éß~ûímôµ -úV2úÖðÓO?}k„|c‚Zº%ÜJvÕ§þ@+‘Ö})H‹¿]»vMÄßvFãh›bY( g°Ø:+qëÖ­“œëׯ™´råÊ.Æߒg͚õJò”)SžIF·x,yØ°a÷»s1þ–„÷A»DÆßЛ’ãñè&IJÆy4ºYD$,$F AÉÏ JØ @É;þ&•ÄÐ7Ғ»P€¨¨¤Ñ’™ÜS¿ d¢ðÉÓéÄl¹B4xÒÊK4 òɯ‘_|©6©­ûúšKÇoku¬æLwOK>PòÉïÌH(ý>Œä…G͑Qs<¤=’ÚCìõNôzm6©©ÈMEq‹(±-ÊGB ”útm‘Š$Âlx]ßÁHx­” JA¥`RKA)„J·RÝJat+…Ó NΉ ñD–" @‘D¡(J4‘)†ˏñ\šÀ`]=#a‚‘2¹ç\ú -x¥<É*6S'6¬¸uáíyŽwúUܺ3à֏#܆1à6Ž·ib„›¸é8m+“j6‰€³÷Iǎ;,fÚÅ•+W®œWaã/5ši†þš<ô¡ ûš»¹ ¹†ïÎFbéÉX¬wØAPJ¶ÛSJµØßj‚Òâv¥Y0꓊Áf£ÊöîÝ;°¼Ö³ª¶¶öÕkÖ¬y¶zéÒ¥w<Ð\R]=a„Ò#GŽl_…ËʪèÓ§Oj)pÐYŒ~_€žÃ<î¨lJè\á)èMaNô—pn­”"!±aøèF?H"(¥ù¡ëeÛÐ1 ,è±e&tåŽFôö‡8¯[Îëö‚2hР7˜žô6‹ aó±, -0Eæë"+t@’õZz’ŽéI:Îë¦c…Iu“u“@‘_È_ýõMù»ï¾ûJ}«€‡¾SAFßëþùçï oMoÌøî¶ÕãVòZ}€v¾â»|ùònÆß63þVÇBñ,Àø["Útt ¸–,YÒËÅø[ò´iӞOf¡îdÆß\Œ¿¹Kbü-‘ñ·´ij<ÚÔÇé…cXm! -.4M×rüM€’;þ&Æ¿±P+*ÉîғBD¡n1£‰1G®r“DnÒ !<¹EÀ“&£Z¯|òÛ¤¹wl‹|êÅR^Õú0Fa+~GZò¹•|òïe$ ”ZÌGjŽ‘šs!µ42ÒxH{$ųêõôzcj‚÷©ä-X {DñˆJÑS 1º‡´‰tm‘Š$Âlx] Fò÷f$¼êCJ¡¥0‚R#báęº•"I7‘t+Ev¢„‹&ûD“–bˆB1„¢XJÅÁï¸Ôɕ#¥·#åð")IÜ*Ø`÷°9d‹?Îûñ oÞ_XRòMÜÞfIÉÁá6š·É ¸Íâ·E"àÆXѝ¸íß¿( -ÁÌ—apO+0½gÚ #a?2‚>fíèl°ö2wæƒ@ȕ|¼Žg£< ”à¥TàÖF‚Òª Ø¢v€±™ǏŸX|èСeŒþ@îU7n|¹Fý™jõÇ:2»#ŒzU5®£¸Œz»Êf–觔¢g'rÀ[<'.‰á o‘ðîÎãF¿rƒRoõB‚ò ¨Ú sùä×Hë¤êEUAµ˜˜ß25ç`j-yå-ù‚p>ù·Rë·©u’µNF5`O½hï:¯÷¤öm©©È[(Õ#zŠb¤˜ÜÃþŐ6‘®-R‘ #Q‚É*!¥P‚R8A)‚ŽžH‚R$ÝJQ¥hº•¢É91¤¥bO,(–´G‰' IàÇDJR#FiepW‚‘ÚóEö‡\ „\ ÁwÃaÅÏFݾ}ûdœ% Á^@iAiC&@i%Aia{Øów -;6¡äàÁƒÃËvïÞݯr˖-ݪ֯_ÿ—ê•+W>ݧ۹#N¼SÇ©S§VV7®¨Ð/¯˜QÞ»wïäRæq¡wÆå£ ¢E7¼…3;ŒÞ˜Ç-@©q7A‰éIÉ%‘ǝKP*bzR%Kqw2à èÌô¤§T4ç_˜žÔÕ“úÉhÎáÎj"«'Ídõ¤EºÚÚÚÕDÎM: çN¦'ÔÑ-§cKêX€éIIhÄÏ$FÝ$4ØW2I2(è{<ô£ -2úQÿüãGä#ä{¾ÓÜJ7ì?üðÃuº•>Ôâo¬îy< Ç8£íŒ:sæLm tut‘ ;3 ;1‘…º,ԝÄBÝ.Æß\Œ¿¹s1þ–Äø[ãoNÆßs0þÇø[Œãø7Æ/ëão,«ä)`rƒëOZÐmU u»g4¡è9ÿ›JQD'ce·Hض‘ðk,ĨfEP•O~W¹óõz³¶èúó‚§¹É ™Zw0µ–|A8ŸüÛ©õ€ÛÝ3’æBÒ¼GµNF‰GR{jµw¢×»³A¤fDöˆâì@¥è)Š‘»7QÌ k£ØÝ©Hœ¶ÁÍHX*)”›…Q¹ÓH‚RA)š8CPŠ¡(–ˆGZŠ#-œ–â @Fâä¡J"ÅÉï\\šÌõÒ<Œ$·Ûñ@")©>à†æìÄ&~˜mÿoϳ¼«/s··8‡[Îá6D7qâÄ1œÃmŠnþüù³u˗/_¬«©©YÍ|šZæÓl׉I6p“`ÙOr„ÖYQ‘³‘]U®_¿þ¡JFâ$Ÿr’ëfðÐuwÙhá߀|¹‚ïÜ -@éæ͛‡@ikZ(­ÈÅ1´?uêԌ£GŽ/9pàÀ°rœKßJxëÀoÕ+V¬èÚöü‘Ž°ç÷v„=¯¨†=/ì{ž[ {ž^Î<<îXN\ʼnK"D·%—”¼¼¡ë% -Pòäqç1»ØŒþ\Å<îû˜Çý(«'=ÃêI¯°zRVOÀêI#Y=i«'Ífõ¤%ººººµº;wÖ±9wëX=‰éI'Ez’ŽéI:V˜dzÒçZ薄ûZ¦3Iý €‡þª‚ŒþªþóŸÿü«žb€ü`ÂwßyÜJ7éVú܏iݍâoœÿ-”ñ·pÆß"ϝ;·9úäɓ5±"þ¶wïÞ9 ñ”Dêv2þ–Äø[ u»s1þæbü- =§cãoNÆßsxâo±ÿÍñoLT -c¢RAÉßJ–ž4ùáY0Úð,è-œÖÄÌùßÄD¹Š"©Q :Ù#¶h,Ä(—¨|òûŠ ÒÖ¥EfõB+ Zç& ™4/SsÓÖüfZò¹•|ò»€Rs·»Šµy…Ù¼\Hš÷HÃ#/2Ò È …Ī=ÎÚ˒oѦ"5Ù-ü5ë•¢ç® #wo¢ˆÛŠg †ýûS("Ììv! <‚D¸ ÍÄp±Ü}OZŠ'-9;bOi)”HqŠ„$yð(…«x1’HÜII%lµJOÀí6û£¼Oñ¾½¨ëÑ£ÇëîìmõÆÙÛ°ˆïè`ë³·kkk×éXR’a¢Ý:Q;š7‰7©É$×N²¡ç$ND&&Ù`ÙèÏYßç3w~1ä£ È¡Xp)«œ‹Æʍ@)¹”Öga÷+rq ùù¥éE¥q¥¥¡å Œ>ðöfx«æ€·ŽðÖqæ̙÷tœùÝÄëmÛ³z±”FPâÝîÅM2i^&/“W8îî#q>·’O~+(ýJgR[©9’yùŒ¼ HC!íYÕ^‚Ú»S_´Þ²GŠÊm…è¹?ÅÈc˜x4 ÅꮉÓðsøÇYÕ§k‹T$fƒFŠr3$–+ÇqÛxŠƒ»JàžyŒDÒÉ3pòԒHAIä!%™"ðH„ÙÒ¹ŠÈGÒIKJÒn÷±Åá,-{ûfowãü$}™½=”ÙÛc9?ÉTfoÏaöö滳·iÔwШï§÷ãkG¿ÇQìïsÆVQ;úšûû±6™æý ÷ü?üðÃVÈçöüñº?þû8rÍ Jß~û­”â±í»¥=MAiy@i^>ØlZ(ml©V¦ü x{A xëØ0àížj˜ò²j\V󸳙ǝVÖ½{÷¤ôXG!ëq·cw:aDӓ8qI'. çÄ%¬Ç]J ”RýĀ7¼ŸÝÞLžo,3ùAéy–™|M1bD/–™Ì2“cXfr*ËLÎcFür¶©ÈãÞêÎãƵ‰<îÓ:úæt€˜k:–â–nß¾}CDÝ$4Ø·Òßþö·d:“d2’2úYý¯ÿú¯ŸõŸ ¿IKn·Öûʊ-¾´7¤u·%þ{ðàÁEñŒ¿9´ø:C'ãoIŒ¿%1þ–4f̘ǒs2þæìÙ³gI"ëO:Йñ¬?ÉD¥ftÇ”"J¡¥@‚’_fpê7‹?+;z±ÁŠ~¯· S«ftoÅ‘ èí²"©øm ) ¢“="ai#ѵ.Ø©OþmBzm$^/_/*Õ0Ê ž¼üM^ÈԜƒ©­´ôû¸•þxí“?#ýg’6®­¹X›#i.$-¸¦y4ÇQsd¤ñx8Å«½ù*m*RS‘=¢p !*÷¢§¸S#wo¢˜y4+kãøñ\DU¤ žšÒ&ÒµÃ=.$ÁH1”8J<—:( Ü"‘Û:)IÜ_÷ìâ1’y´d<Å#©”4Šp!5f$ì*ߓ”TÆŠáv/½Óy²·ŸæÍ{‰ÙÛoè`ßêIãƍ©›6mÚDÝܹsëIkÖ¬YÁìíõ"{›©4{tG}—9Ç'DÀMºråÊE™ÞÙk"20Ò Î¯ñ¥‘Sk˜G_2cæ ;ä³|üÄ Jßÿýå–@iK:¬ø:7(±Ö¤”Æ°2À`‚Ro‚ÒëîÊK—.íÂou—t䀷2x˯ fW€ Óʺuë–TÌzÜÌãnÇzÜ9,3™ÁêI) %љä@׋ˆåT¸‘ŽÕrpâ’$ÏÄ%Ù¥|‚RA©#ëq?DPêÂzÜ/”ސïð6Ý=àmÆ bÀÛÝÞ½{›ÍãÖqÎӓthΛ¥¯%´ÚwÒO?ýô£LgAégdôwõ¿ÿû¿…ü¬‡Zú«Is+a‹[ZüÓš\ dü-XÄßÀ¢ÍÆßâ<ñ·Æßs.^¼¸7ão¯'1þ–Äø[ãoNÆߜ¸ò²D¼A -8ÿ[<žýT&*9™ÑNJJQ‘œÿæsê7ÿ`< ö@þàðçÑ~èÏF: ?3ŸFS»víDÖçååIªÜÜ\IèdHÍCÓ>ùO îQó¢½w½HUÃ( ž¼¸Is5i^&-0§9˜š£%¯Hœ6&ÎçVòÉ¿”îޙÔ\R’—ÐVFÒ\Hš÷HÃ#Œ¼ H<âáԞ_ñÆÔ$''GjFd.¢PTn+DÏý¸gaæÑ,<®˜¥MÌ@âÏ -ä#Ìó ¥„»3µBõa¶FrP(‰\Dqqe7K¦¤pW)Üi*w/$GK§hx$ê#åxI$nkIIõ74±(—$²·Ÿäzž7Y+Ðؙ4sæÌ©¬½]_ -`ýúõkiÏ7‰ìm:>0Bt”©4§¤K—.çDdWdæ»'"»uëÖçê×_ý%ç׸Éù5nAF·XÚç&]7ìÏðݧA°Ý†b7(Å`³“ñØÁ»N/P–”ææ³Ö$K(ՃÒöíÛ{WÖÖÖ¾ÆÊÏsÀÛ՜á­ZT€/倷ü*Xñì -N\Âþøã£aŒ¿E0þ剿Å2þÏø›,:>,:,qÙ²e}`Ñ·Dü- øãoŒ¿9ûôéS™Èùߘ¨”ËD¥Œ8<ö.VTr”bJᥐP<؁!tÅ¡[ПÍ~ü9bÃSf°â¡Ó›ù šøHù„(úììlI¥(YYYBt²G¤¦¢óÉ¿]p+ZܲzÑÞÀ^h¥”O7y!“°šƒ©­´$lOs)K>·’Oþ ÔVgRë7-g»uF?$„+Vóyá‘5 Pýcª=Ι™™šHMEöˆÂ•…¨ÜžbàþŒÜ³‰Ç°ðhV×Î3ðç¹]‚yj¡|ºÃÝÙpÎÑî,$\B½ IàÄIqQ’¹ …’Ê•Ó܂mÓ¹!Ü©LŠÀ#áBãÚD¬­ž‘DR’¨ Üð¶¨ÏÞƝy¦©3©7Kx9“f²ÀB:“Vj¥9“˜½M{~Žók\b¥Ÿk^ók¨œ_CÏ9ÈÜSk°X4Ç`ݲB¾´C¾ÀwŸai=(Þ÷€Òá_%ðژҽ{÷*jôªÜ¸qãk8®”æ̙ó gx«æ€·RxkÏoYå½zõJ-E/v¡ŸÆç㍓‡î•ž‘ΚZq'~¯†Ç P#i ”Œ.‚Rº+çZ±Y¡Ù3ÛAÌð†§§+Aé%‚Ò[¥¾%1qÉVx§ÑÄ%À¼úohX¯oWt,3©c·Näqq¾%(ý@Pr;“d2’ (ú§Fú'AézÒAég£æVúûßÿþ5Û^¤uחUӚ0þÌø[(ëO†3þyæ̙MÑ ñ·Åq»víšåؼyó¤„uë֍L?`ü­‡è÷ŠsòäÉÏ2þö¸sèС8ûõë×!±G% èf홨”ÅŒîft'rè[lÚ/’s䆆Áæ”ü J¶ù÷ îQcÑÞÀ_iåÅM^Ȥy™„5v¡uZÒ²¼K® n¥?ÞXûäÏÀHwJ^ΤIËÙöb$-̦1’øq!|´y‘‘ÆCâ¹ÔX홚š*5#²[°ŠBQ¹™ž{ÑsFŠ‰»7ó@VÒƃ‹IlÜ󎈚Ú8¿0wA$œn4Ÿn‘©-²x1‚‘’ÜxI¡¤RÒ(é\%Cˆ„-29xGH%›z„äð£¨!ÙΝÔ„‘Ä<·Ü7Q.©¡övW·3©[·n¯êðË_«+éåLšÓ²3 ˜rŒéƧu—/_¾ &ke£9Yëg2SiÍA£þ5§ÖøšÅ¢¿6 ¯ä–r#ß]'(}DPºâ¥÷Z%Î^¢Ü”F—⬁§Â}ŽSá>Q={ö쫧NZÍÞJ9Ã[{xË‷Tæq;‹ðvŒÏGnjɃÊÂOЈt–âNfÔ͉F EÆà]‰ ÅDŽ €RrVÉð€RA©ÒˆŽÞ‰ Ô™ ôAÉk†·îÞX€¹ñ‹™¿¦™‰K´oW9àíËL”nëғ~”€=?I ¿”þ)ƒŒþ¥ü¿ÿ÷ÿþ¥BþIÑhI¸•~`üí[OZ·VVé*ãoçƒq ÷Dü- wuOîï–(ÆßbÐÎËb¤sãÑÎShç1 hçÁ‰Œ¿9¤o8ÑÎ/8¤O:¤;¤÷$HËðÞ(`¢R3ºÓXz2)íÏ9r£Î ç€ÐPôâ€`<.ö@˜E«?ž(³ž-£ šÁ‚‡NoÆ㧚ð4*F<—²O¨¬ç£«¦¤¤HJƒèäääd·HMEç“ÿ ðVx îV½x‘ªFPâííÅM2‰7¿æ`ÒhIØ -/ZòÊònŽ–ÚêVòÅß|ÒFPj1ꦕëj13©õ€›–³Ý¢É˅$ܳâW‡x˜4Ÿ‘FF ÓþîùkqB!<µ0>Ó¢hd”{œ¿È&’´a œî[#¥ò*ÓX(/ƒ’)á;!Y”l–ƒ’Cd’KÉ£´ã‚ö\/ŸÛ²8q±$’’D´©¸Ý﮽ÝęT_WR8“¼2“´an-f&yœI:1³hX ñS1™(홃ìN­ñ»X´¨ê#¼J_”> Â*…beJçï -”J(äzUnØ°¡”-ZôD‚R‡)S¦Ts†·RÎðöÿ±wÞñQU[ûÏ9Óg23ém’If’„:¡( -Š zTTz•Þ{S:Ò;‚Ò;ÒA¤WQP@¯z½zïõö÷}üžgŸÌœ™ÃLn°Ü{}ßüó|Ó÷>{¯ïYkíµª²Ã[6.Éew&ó¸Ó«âÂL­„]4¥‹üä±ÂdFݼɤt\‰É. ¬+ âŽÇŸÞ\¢eœ”@U•mâ v`JJÍJm J] J=J J£XBi2Ai6A©¨Ãێ;6”ÔÊ'H EÞÀ/7JŸDÜ¿ÿs‚’HOúZö|+€g’”þ ûóŸÿ¬Ð’´dĪ[é «˜_Z·è–{% -ƒ}.8þ¶ñ·mɌ¿¹0ç+[àÆu0Óá]²dÉï¼yóºgΜ9³KæĉÛfŽ5ªYæàÁƒyñóë3Q©&•ª0Q©<3ºË”<.Œs*A)‰ GPŠŽƒ tÄ`õDFa1YtÞÚé˵a½¬X~z3V£Î„u)±Beׯž¢ËÊÊ!gff*"…¯×[*?³ˆ +œ”ñíÀ@¥'±«þ&±Ë‹ý^ìüSXߒšå]|.l¶R¨J”¥ñ·R)!(ýŒÎ$5ঞk ËH’ê=RñHCFb5ŠÅùð)Ex<ž"ÁŸ²_t|²žbàk|ßÏÌw¶p9ÛøivҒ“ß šß%Viˆï—ÈåœÂå, -"¹yäQ’´E#l¤Ge<‚T äS*ú¥Ÿ'¤²"xm Aªóyd¤Z‚‘Øéªû‚>!±\’„íáYŽ}s¿3©ç·(3I=æ6iÒ¤bŽ¹e&8“èó¸LgÒG¢È{Ýa²Ïك쾞íǔ®°Î_°â‘Ulƒ|fÇÿ}…G?&(]'(]J_qÁv¿/@) <€¥sçÎ-Uúá”j8p`¬¥:¥ºøº/Õ[±bE‡ú”f͚ÕøqÀÉõ Jõ†Z•Þ*ðÀ[n-\¶Y5p‰f( „aJ)KÊcÔ-›Q7/®Ä$76ÙSžšIgâ±7ãœãÄ^\ž T… T“ TŸ ô4A©9A©Aé‚RO‚Ò Ð6š 4… 4‡º„ ´– ´™%”v”D‡·÷•ÑõU¸Ñø4‚yܦ/@‰Q7  ô{™Œ$ƒ‘þHPúƒž´d€Zú‰n%³Ï­˜ÖÍø›“ñ·èO>ùä4ãoÇýñ·"þ–‚oµ:Õ›¾iÓ¦)ëÖ­íÁUòš×K/Æß^ʜ_X lÏíø¿;Qxôã<ï£x¼â2A鬔ƒÒúò°ÝËJóTPª¹k×®!u@s}ü Ô±þ… ëÃv7®/@ ¶[€RµÇúõë—_»{÷î¹5 JÌãΨ‚3­"vєòµä<¶+ɦ§C% qŠ ƒ­‚R¦JìòvÜ´V±áR®EPz܄q Ô‚ Ô^Pz‘ Ô‹ ôAi Aiª´xñbJK Jë”V¸,ÝI =L ފ*”nj@)‚éI"êFPú^úá‡þ@Pú£JùË_„ÑR[é+‹šÖí+«¤´5‰bü-†ñ·8Ú!Æßö0þ¶…ñ·u®C‡-cümž{ëÖ­ÓÇøÛPÆßúyñ³^aü­s&®¦Ö™Ã‡oê8p`Co¯^½ê2Q©€ݕұ”MНŠÁÎ%’1°‰‰XqñXìѱX=‚Rd–•ÅSiŽ¤W×Cj°` êÍXÝ:ïlŒX¦²ËYOÑqMëÒÒÒ"d¿HBRSS$¢Tþ5±LO‘hXJ…'•›4È$ö{±ó‡¢%5'ì‡z&N„+©[©”Jå‘)(iκŸÂ-.ÇPÎ$µH’š”$Î4¨ùHÂÏZ<#‰;±ÀB‘‘X—b™úÖ¯¤ˆËå"óO!:ŠžOÖóe¾‰oeæ›ZI_6.b;?Òɏæ׈åJPºÖâKºøuÓ¸ˆE½H¯Ä#þL'Ê!(i©ðË+SªPª²Ëg5¿TgçO!5üRÀj²wz-Y0·FbÀMbö¶ÄÚ۝I¦¢ÄÌ$ óû¢Ô§OŸî,ÀÝ_)À=qâÄb -p«5“|ÇÜN2Fq&EøœI·%áL£EŸVÑ~ŒÇ”®°Î_)y2/l{vüß]'žr› t#”Nº} ´W´0QA©"A©Ê±cǦWÇ·'@©6Aé1€R·ºË—/ïX Ô’ ôlýɓ'7¨L©SÀ¢‚R^F£”°c -Pr•ÇÝgr. 'e3êæ¡3ɍ‰R@)’‡±ÏŒÁ°ç”*ر WU@ ›ï¥g(é1ÎJ/”z”ûAiAi®Jï¼óŽ¥-â½Ê ”®²„’R€ t?‚yÜÁ ô{”E?ÈÀ£t>ù£ž´$ÜJÆ ·RQZ·¨Ö-Ê*aį2þv>Xv*Ÿ{4žñ·Ä3gÎlgümC -0ye*€y!ãoo¤ƒð&e¬Y³f¤gɒ%ëá1cÆ Œ¿µË9rds/®°g¼¸Ög¢R-&*Ue¢R7.Ì‚’—ÕÎӒ9Î¥øؼ˜8€’3†ùQ*T°:±ÀÌvM“ +Ï`¥»×‚Õ¨3a]ꌼÇ1`ÁÊz®i=×´Ž"§¤¤D‘„$''HD©ük„c ˜™"Ñ°”ؤC!“Øۋ§%a!Ô¼%a?Ԕ%µÔR(·’”B¥uþ­4Qéÿ²£ef´cW ¥¡¬ó׊Cò%Aé>Aé3'žòI ž|#p%opN% Á”rJo•(-'(Í'(Í (/( ­Pê[ ôòc¥Nu,XЪA©@éɺ£G~ì1Kõ:@—Šµp—%(eóÀ›‡ÞÜù¸&]åJ)¥ä,f&y0=”\)¬ šÈŠqø3‹]\sØ†óPÂ\ÛJX…!@iAi,Ai:Ai; /#(­'(mU@é½÷Þ;ÂZ“§JçƒAén+øAIäq+Q7‰Î$ÉJ’ÿú׿þIùAï£%Õ­ô[³˜5­Û×-·¨¬Ò'Ÿ|ò!ãoïÅaÄ$`Äw%:ujãok\ï¾ûî’4Œø7F|júºuëÆd`ćx0â}¼ñn^Œx'/~o+/~y/ÐôIÐô1&*UgÜŠÌèÎK^f¹`ÆÒSD–}"A)6+>*ëȍÅnsbY°—¦HÂmXƒ n`ôf¬K‰÷8FÞí°t%=×´.))IH„œ˜˜¨ˆ$$!!!@"Jå{€pRQ1Jå¦PÈ$övÕÁ$v~ - !l…°Â~h‚pª[IÍVú)ñ·ÒD¥R)”~rÔM=æ¦f&…r&©7‘Ã'âÓª)# G>2*Z—¾µ*qýª"+‚tŠàÉz¾ÌÀ70q›ù~V®_ׯw;NÞíÄðn'Žw; ¥dFÒS Jn ßÙCPÊ"(å”ò”“k"5›ŒD¯P?#U'ñÔ ø¥¦_jù¥¶_êÈ<×ÀHLJ’1¦OÉlv+ә$ûœI­%LOG sù‚Ô»wïîÒ AƒúJ#FŒ"?~4S¸'Ô€_ɐÐæÎle’ñ^žÆ:ÌÓXïóØú[¿$œI>g’Ò~LBdû±¯Dû1vÕø†u¢¿QêDèmüƆ?ØAKŸ”>†Å¾¾ºJP:ŸòàÁƒSi@ƒ£˜í}Y0ÛÛrð‘ʝ?~E>@iAåãǏϬ¶˜Pf{A©_m€Ò+¥Î¥Öua¶›Ô…Ù~Š T— T£6Ð¥’¥’2%¯”RË4SrX…ÛJ)n–POÁ¼ PòøA)O%\ÀÕJu,ñ&l¹ -(±àdGæ(u#(õ Ä~¸ãü 4Ÿã¼œ ô–”ö)Ç (±ä›×J¢„’¥¥¯"xà-‚yÜ¥?”~üŒä%•–T·Ò·bDµ«Z­›e•÷îÝ»Ŷ&Œ¿düípü… ö&â mMÆW{‹ñ·å©@猿ÍLß°aÄ €õpÏ¢E‹ú3þÖÝ;mÚ´.ÞqãƵõ6¬™wÀ€X( ¾[FM&*UIÇ~P> #^&—­'ƒ–Œ!NNd] ‚R AÉÃ#QX`V»ÙŽÅn²1$nÅjԛé6a…ꌼÑ1`éÊz.q=W·Ž"ÇÇÇG‘âââ%666"¢T~Iá8gA Fi¸IE&±£‡¢%Õ·$산š \(·’°8ê!¸Òø[©üëA©¤Q7µ®¤zÌMÍL7š€›8ñ ²ùÔX›ÊHª IõiðH,I±B±`¥`‘ý¢ãSô|²/3ò L|+ ßÔÊ·ä9ø‘ÑüðX~x~¡$~5¿¤›e€3J™¥2¥<žä/Ϩ[¾ÌÔl?#US|F‚Œ°œkRjé`§kKEð¨ø×c”º:’ԱⶎŒ¤cIIÛH¦3I¦3I¦3IƲo'c¢:K¸­ï&ῧ4xðàèa¸Än)(…{ »j¬a -÷;þîwiÀ1$ôâé€ UœI<%œI]5XQçëªñ[½¯òáoM?üðÃ7füë++ä‹HÆßxޝhXì[¥k ,¦DPú€ t, ´? ´ ´±,@ie€ÒÂJ¥×«‚-&V(¨‰¯Û¿@éÕ:ø Ï?†Óæ1€Òs”>†ŸZ¯~tA©rM\ãåJ9l…›Éoéù,íS–'Ö J)Y˜ž£ni¬JPr'²zz«^Å`󜘷Š!@éY‚RË 4ÔJ3(IA ´-”>ðg€©µ&5 ô-Aéû ôgùoû›":ȟôø¿?èV"(}gn%MZ·¯­É5çÝ»w/DƒÍ>ˆÅ‡cüí݄³gÏîH:yòäی¿­v¥¢g¹ÓSÒñ;Fg±_ớ7¯ão/y'NœØÁ;räÈB/ ¼1 4ð`©ÃŠJՙ¨”ïÆuš—†Ïta$ӓY´>‰µÇJ±qXGQ%{4˜Í‰¥f±3Y0æÓh…!5X°.õfúMd$#oy XĒž«['„[Ž‰‰QD ¥ò‹ ‡] F©ð¤A&Õˤ:˜TZR#qÂ. ¡  K¢f+©‡àÔJ”%¿•‚R©ü8P*AzRب[¨î°Î$5à&Î>¨ùHªIe$Յô0‰Å)q­ª"ûE§ž¢ç“ |™‘o`æÒµòMm\ºvÞè8y£C·RWm"ïqR¸jSY8 ä•°j³ J¹~L9™Åd˜ÙJ2³²•´#ÁHÄ#bOa9ס<Bêê)~<Ò2’Ž'ÜtÌÞÖљ¤£3IÆ,´–13dL^W™õdÜà÷‘˜Â-;v£AYÚg&k ÎgÔmk ªmow3ꦦpÈzY,úºbÀbWû’ÿ4–(-:©]5 "—X˜hÈ×¥/#ñè}‚Ò]‚ÒDZxíõÖH幁ÇÓñ2oÞ¼¹³ÌÕ«WßÎ(­.PZT ôF0ܤj ¹‘¥5J=j”ºÖY¸paÛ:¥fuJê”ê×°Ô¬t©R€k¼Bu\¶¹l…›U ·–¬ à.‹áLÍÁ¤¸J® FÝPb+>‚’×JePÂ|T·áz ô¤JX”:±…ÉË¥¾~P J+Jü ´_Ò Pºî¥Ï"Xk2<ùu(a8•¨Aéϒ”þJHKEn%µmZ7Ë*9ðA—”´n û Æß%`Øw'bØ7'cØ×¹ðM—¥‚Oç1þ6=Ã>Žñ·a {?Æß^aüíy/†½ ãoϱP@C†½žÃ^a¯ÌD¥riº2©¸ø=)LKÆ-ER"N|<ÖQt,•Æ`ÙGFeeeYXñf;ÓmXñ+Ãäf¬P kUgĪ• ¼ïÑs±ë¹Îu°Ó’¡Šät:$B‡ÃQ*?U4cª -Ç^‘Pð$6iÕˤq0‰]^õ-©yKÂ.¨A¸°n¥°iÝaão?%QéßoÀKå?”JšžT‚¨›zÌMĘÃ:“„ÛUdø©±6•‘TR­Fî˜\¦ªÈ~ÑñQ=ÅÀ'ù2ßÅÂ¥kå;Gò3ü´h~n,A)ß%‰ßÊÅ2Àn‚’‡ ”EPʑð;ÊʬŸ-³øIUEV¶ŽG:Õ{$ð£ñ˜RWå,¤^©ï—Çõ¸?zB‘l ç 7=Ë%éX -@Gg’Ž5“t˜Š¶:֐1«/Ê0Û=dÜà÷“GŒ1Tš0aÂiúôéS¤¹sçΒ–,Yò¦$¢nÂvïرcb‰¶·¡R¸o0êö‰¨ªX´`$Cï”#êŒü˜!ßXñ¿!(=pÀÚ´º+Ž¾‰¬:)¾¹ñ½ø´]ÙøÜM¹.\XSîôéӋóA³+”¦T(®±eË–× -`±{ÖZ±bŋµa±Û׆ÅnQû™Ú°ØOԂŮ]»Z ŒF~5\¶yUØ՞­p=¥t‚RA)5S€›ò”ÒPb+>.ÃN÷e˜F”³`ìŸ4áÞ´ A©•Ë¥”,@ië(© ´ ”¶ J·ý ô…”"| ô'ÁH’‘þ"ÿýïÿ‹Ê­X- (­[”Uºê¼sçNQZ÷µk׎Æ_¼xq_¾Õö¤'NlL:¯t¢ßLN¿áXOJ_µjÕȌE‹ ò̙3§'ão/0þ֞ñ·Œ¿5öôèÑã  -¨÷jé¸NóÝàûÜT b&+0¸“aßR’`î`øbãJQ%{4–šÍ‰eo±Ãhš"qÛb´2BnÁŠ×›±Vu&2’‘7?.v=×¹&ZH„L+.Db·Û$"”DFF–ʏ“PÊ¥ endstream endobj 88 0 obj <>stream -4ܤz™T“JKj$NØ5Ê­¤– Ö¥ñ·Ÿ’¨T -JÿG姀R¨ô¤PgÝÔ¨›šÂ-¼¦šÌ$ՙ$Ü®â<„pŊ8¶kS)"2⎩Öª™¢ãÿ Ñóy¾ÂÈך¹j-|?ßÙÎë䂍ႍã‚Mä‚M‘°`ÓJîl2%lðeØ´¼¬\PPPAƂ­DgR:“4ŒTG/ðH†¤¥¾äñpò„‹]H†ó)=O¸é1ºÏèÙ¤DOg’+¾•»½ŽJt°QÝä~ýúõ’ ÙPc8[´ŽgÔm:[´Îe/û%£n’/ê¶3 ê&l7ì¥Há¾Æ¨Û-žX±î1ꦖöQ:±âwJC Qù¦ü;#äw¥ßZðÀW6ÆßD¢R”?£[9úP:KPzŸ tÈsëÖ­ÝY°Ø›sJëÊ”–VÀ·š[éСCÓªìÙ³gl5€Òào½õVnµÞ|ó͎µf͚ղàäÙZÀ”5ñËë` ª”*”ÊVfWûŠ°Ø™å1ˆ,¡ä.ƒéI#(¥”ÒJn‚RA)ÓJåJ•J5l˜ -”ÌA ÔÙJý‚Ai¦J¢7LP:ýÏAéw<ð”€Gõ‹BK¡ÜJiݘ¼¢´nLèu–Uºuûöícð ދ»|ùòAÆßv%ž±Z­ÿ û…4¥á&LªƒI¥%5'ö{±ó  ᄅÐd+©ñ7a]BÅßÔóoa•JA©T~fP -›Ç­IO -uÖMuS¹…u&©·°Œ$VžÏ£^„GÜ1)²_t=5ðÉF¾ÌDZ2ó­¬|ÓH¾½ƒ͏Œå‡'ðk$KX«©Öjº„µê%(e3=)OÆZ-/ãÇTdÔ­ŠŽe!u0½:feë}ŒTä8‚™}Ü ƒó„FŒAÒÀ/O -F2À¼74`Å?mÀ?k`Ç[=Izܵѳ€3ØUǨ›ŽQ7™Q7yìر#š(û£nì<¶LbÔMÚºuëf)(êvÂu»äºÙn¦Í¨Î$CïX'ú{¥¡†¿ò!Aé;ä[ øš ô¥O¾çÄË>Ýâè€à\ʽ{÷N¦Ý¹sçH@io&@ik ÚúU0tèк5JÕ»wï^¹*§Ïè% ßÅÆejç2ur™Æp™Æq™&²uT -Ûkº™žäaÔ-[Æ×͕±BËәTQ‡[™ªt&Õ`À­–ž%‚©â -"žFæpbÂçY|ÿ÷´ûŒK¼1­sž·jf½P¡ SÑƈééhĄv5ÐXØ[?lØ°Aú±cǎÐÑbëÞxãéò… çÊ+V¬X"¯_¿~­´e˖MҞ={vJ‡: ±Â¤ä«0Yd¶EU_ùâÃêÁ嚎‰Ñ¢–°ÎáVúŽ ô­Õ LTbFwèërâƒΤàƒN¤á#eàÃw{/_¾¼9ûìÙ³ksOž<¹´ìÑ£GçVØ¿ÿ´Š;vì[Ð1¤Êš5kúT]²dÉËÕæ͛שúŒ3ZUŸ0aB“j#FŒxª*¢^•^½zTÆ¥\¥"˜¦B…¶mÛæ•Åè–ÉÅÌdfãêôfâêôdàêô”<¥L‚R™xöèã©· -¥*‚RdP2” PšP*¢%k…–hÀ5òÀ4ÿ2â1 ¿¤„…§°´¤Fâ4A8±ßk²•4ñ7Íù·°…4 $lT)(•Ê¿”JÇ6=I­ ‰º©™Iš€›zfEe$n‘™¢SD€ÄÀç™ø -3—©•oÉ7u”¢øA±üÈ~x²„:U -MgÔ-“Q·¹R¥J™”OgR~Qu:“jêY’û#¸üx¤Ï3–‡åikyÆÒºuëÆ ñ³ vS3†½¹&º¥©k×®mM˜¨NÆ=z¼`ìÛ·ï«ë¾ÂkúñãǏҳ¯›Ž1  Ú|¦m™Ìô$™EDz’täȑChä„.)ª0yãƍügÝ>לÁ’‚ªúüQôÒ(­} Š[É;ý vº(QI”ž(Ý$(]I‡KœL)qãÃ÷zð5¶f;wî­2§NZžwìرåÞ}÷ݙ€*nÚ´ixåµk×ö¯²lÙ²W«ÎŸ?¿Kՙ3g¶­:qâÄfUGŽùt•Aƒ=^üR».êjù¸l+–Çø•+‹©ÈÍÅôdgƒh3½°ØÞ 6ÀMÃ4f²2w N‚¦V¥z"ôf J£F -%Y€†] v>J"s¾d9J¡@éïŠü×ý×ßeH‘[‰A8}[©¨¥Z-€iÝ6_Z÷Gê%Å­„ 8 R= ؝ˆ ØÌ´îu)˜€e©˜€ùi ÕnLÀøô¥K—ÏÀôgZww&  ÓºÛ2­»û¿=Í´îÇY²V.åªé°[Ò0ö¹©ì㽆;æ.…ñ·„܎ÄÆa+ˆŠñz½öh–uÂhZ,wÉz6˜Tƒ…çWÍ< a"(ƒAI/@ &ZR@‰[JÒ¿ÁÿòËÉOá½^ÿÓ$,7…¥%5oIu+©ÙJê!8µ¶’°a•JÑ] -J¥ò˂Rñ%”4•4 ¤ö,9wj»Mz’zÖM­ ¼°¡2“Ä ËHX—B(é)>Åè%K0(9¹B£y+Ç[™D ûs -£nn¦'yu˖±8óèLª@gR%:“ª1{»@X‡7 # Rù`G!kÛ¶m…4bã”gBHc›x2ƹ‰#þœcß‚©heÆÌ´7cò:›`^2ᾇqȐ!ý 0ÖC 0Y£õ3f̘¬g)nKqëxN]†Å~Kfz’Ìô$‰¥¸%¦'ILO’®^½z%âÖ­[J…I%êƳnŒºEø¢n¿W«úôÒð×ò1@þHPú=Aé;‹ˆ¿%*ݍúöÛo?Žýú믯Å”.$>H›K»yóæ»ø;¼.\x;ûôéÓ«r€‹ÊZŠPié?Þ­ôËáÑO¡ NZJÀMaiIãVÒd+©ñ7a ÔóošD%µ­‰°.jG“° ªF@ØbJ¥ ô^~$(iJ(_ ԁ·PyܡғÂFÝ4Τ F’üŒTJ (™ý d#(ÙùÎQ¥X~Z{Ž'KXœ©Œºe0ê–)ã67GÆ o9:“*êpS•Î¤z×Ú ¸Õ5°ä‘8¥¦0’p!ùâeÏÒ®6Q`ƺ© ÒDH¤Ož¥4ŽdgŒ`yVy -»© ÃÞ̆5]hÅ}Ok 樃¥{÷îϛûôéÓÍ4pàÀž¦aÆõ7²è¡Æz¬áõ×_Ÿ¢Çýþ,àêÖ­[·Jf\™ pe–ˆfzÒQ Æð”Äô$I“ž$º³~õÕWJÓ±MÓ±àÑ¥?+n -ýÁD·’ÏÓÄß>SzäÂN;})vúÃdØé©°ÓÝø»<@ˆM™~øáÚ2'NœXš ;=·,ìô´ò°Ócó7lØ0´"ìtßJ°Ó/W‚î\yêÔ©­+ÃN?W vºQE°ããù¡ÚØ~¬\ǎ+屫F‹EgÁXçx™ZœN‹(ÊNÁ„–IÂn›•#(UŒÆüVu>ýôÓ5íÁ D¿^k“”^ ¤góá`PšOPZNPzK€’$ŠVqØC‚RP°³”0`ŃÒ?„È*-ù‚pn¥ "”Õün¥ëŽàjt+Œ?{öìnV (r+®—±ZÀ<Å­ön¥aóæÍëê™0aBïˆ#ÝJØK÷»•Üû@·ÖVJ’p+±ÿ´p+ÅÂ@:·RJJŠÅ‘˜˜hVÜJ°«+Ö¯êVÒùÝJ²Æ­ôk£¥ÉM?…‘¢Ð#IIiIãVÒÄßÔ´naB%*…Êèuô­øa‹)•‚R©””Âå.¾„R¨Êa¼iò¸5ETPRëh2“|uDÂ2’”L -(áµV.ÎH.Nß9š‹3Žw1‰RZZZ -ӓ܌º:“*W®\AW£FÊt&U×ãÕbÀí1l¨†‘„ ©HFÂdè=‰u©ˆÒÔ/MxTȳ<¹Hø§ØÅËÀHÍ#1-m˜™6V6Ï°öìÙ³‹7î/›a§{™`žšÆ7ÜÈ6ëiú… ÎѯX±b±nýúõ«u[¶ly[fÏäñ® 9&1$1YFR›Ž=œžª—ÆŸý ôZˇÖYu+™5ñ7v4Qão±¿ùÍo®Äß¿ÿ\Øìd ->üH¾ÆÞt|¡­Þ3gμ•õþûï¯È9räȂ¼}ûöÍ,»}ûö‰åA#*¬^½z@þâŋ{Tœ3gÎ §OŸÞ¾âøñã[T>|xã|°ã“0BuËcÀ -ÊâÚ­š‹I©X†Å¢³°æyqæ¤ã:Í¡#‡m[s’Øá-R>–µ& J՜x^-;^Qφ×6´ú@©•%#AÉJã”Ô0‚’,@iãƍo)ç }Õ=(©MqC»¯àdI@IúïÿþïëVz¨Z&U­ ÜJWœŸ~úé9µáVÚàV:xðà*.Ÿ7Sq!¹•pq=äV­wdµ€–¬Ö-ÜJOy°ƒº•`ÆÊ ·R*›Æ·Rr[)&.Ø­äd§!áVŠn%ҒEВp+……ÊV -Ÿàýž‰–J@²,#Å#SX·’&[Iìí¡•4…4Ýa¾…­P‚bJ¥å¹Kå‘Aé‘jM–”BxÓTO*>=)lÔM%,É"F‚ø¨ÑJ‚’ d'(EÑÝÊçG&1ê–ʨ[:Ϻeʸ¹-r&aI9“°­èñ³êðÅÙ‘³ÈHL'RðH¸0jÍçØ1ˆŠ8 ͜çœx ©"x^­ðñdf¡…‹¸U$&ªmd÷îÝ;Ú`¢»Z ðŠ…ÍëͰӃL¸£a3Œ7‚¦-Z4Wc½D¿aÆ5ºmÛ¶½#ïÝ»w§|øðá2{–0=éC‰=K$VO’½D4É_ôP¸1þl€ü`ô¹•¾3kâo¥»Q¥c¾úê«kq<¸Hø ~,_ã]÷•+Wvdœ;wîíÌS§N­Î[,ÎeÌÎÛ¹s甲ï¼óΘòk×®\aéÒ¥}òçϟß-æ̙ó'NœØ:äȑÏUº4*ߧOŸÇËá¯]ƒX#—]5Ê°Xtk z0yyé̘a~qn -Ìv^ð¨l¤B,þ¬I®æ„Q T?R€’Hc%+sûA©AiAi¬”æ‰Ô0‚Òz „§dÔ2è‘s¥«¥[á@é{¥PŠPA‰Œ¤€Òô¤¸• Án¥à"”wm¾j×Y- °%pU¸•v)n%àêºàêRV ˜—\®¸•–,YÚ­\mìVªíw+廕Òýn¥DáVŠr+EF±#³•Ìvl -&‘­¤áŠÏí֜„ U2àß_„H•ÉR%@¦G¥âñ¨È––BÅßÂ&*…Êèuôíg%aóJA©TJJ^”;l %Mãqy«ÍÝBxSA©øô$#IŒ”DÔÍJPŠä[9ø¦ÑÁQ7áLJSœI¸wɖ˗//œIùt&Ua)€úúõë×6à·ÕcÀM$%‰|¤@F üD -¾Æ¡Ô«W¯îNGlñœ>}z}æñãǗe P*Šxþ8PòÓÒ#¹•>WÜJ¾j·Ò‘¸óçÏïKÀ×ݖ„Yn¥•!ÝJ˜Õ­ÔÍïVjåÏVzʟ­T@·Ref+ ·RÅ­„;‘4º•’…[)!//¯È­„[({4v%'Áis»C• [`)D%Jé©Yý“߯¤,U<7L?(ih©x·R¨ø›¦P@ñ $쇔„ [L©´üT2˜á¨ëúõëûÓ.^¼¸=ýÃ?Üè=qâĪ¬Ã‡¿™½wïÞY9Û¶m›’ ü]vÕªUƒË.^¼¸w¹9sæt+7mÚ´ÎåƏߺÜðáß+;pàÀ§ó•OäbœËÁÌdãÚ­šÉˆ\±ùé˜FQߧ¼ ´T> xT!R1V‰Á5¢ð”Ú<¹~$^֐ fM•”z6Å51IÌPêÍDúÁ¥1¥©:€Ò‚Ò6\KPÚLPÚÍúCǞ t6”îÞ½û©”ŠRÂ@éO¥¿¨ á¥ÿREu+éT·sí A½MDµ€¢"”˜…‡ÜJ¾"”En¥3gÎìJ|ÿý÷7Ñ­´6Ø­4ÃïVîw+u§[©+ÝJ혭$ÜJÏЭô„ß­TMq+a1å1I,˅;‘ô”êÕ«»’*Uª”˜ˆû”¸xlѱØJ.¸d€ %+]Xb%J#‘I­Û­ïVœt9 –Ÿ³ÚOy«ô, KPa¹©¤´ô#A)-Ó$*…%a!45BS*”–ç.¥Rù׃’ZkRJj‡·° ªÌäÃy܏u3GÝþ¨[,?#Ar¹\"…;)ܦp‡v&=þøãjÀM$%5u Íd$‹`$ Sa$F­•#ÙځÑmãĈ·‰êÞ½{›hHëH+JËXHam‡ç5§4‹Ã,<§J,¤Y hƒçµŒîÑ£G›¨Þ½{·wâ&½³èEû°aúGŽ=º¯ –i°¤0Ê<{öìI&Øé׍¸Õ_`\¿~ýrÃæ͛×ëwíÚµUwðàÁ=º÷Þ{ï°|úôé÷eÐÈY ñŠDc-ÑXKlî¦ÉãVA)ÂJEÅét¿ÃJ2ªiݾøÛW66ʵ3þædü-t=y1þ³Ï>û0ñöíÛï%ôÑGS/_¾¼Ë}öìÙÍ'Ož\ç`,ÍjÌËÞ±cnjœwÞyg|. pxÞÒ¥K”?~²3gÎ|¡ìĉۗµæ"›ä²«}Ư~ÌL,LTA&k zpÙV¦±®˜† Íw5nÜ8?×nÅH¥8l´Ucð@¨¦M›Öq‰·Ã¼7´1¹ÞŠU!@©#Aé%#>H€Òk¥Ñz€ÒÝ… g””Ö°*Ã& €±‹ t‡ Oð°á‚Òe‚Ò ?()%>ý ôAé%¥à \ñn%¥¥ß­ôÉ£¸•4ÙJSüÙJƒƒÝJxN¸•šzqÉ7¤[©ž;HA†˜låûÌI­W¯ž×…"A¸dmnwp%JAK¢Á‰Z·ÛÂNplp¢3²œƒh'ú択pþ¾¹ÚºÁ¡µÇë/"¡>RÍÇ ^¡ªxn*™JJK’$É#¹•J -Jš£oђZLIJ -•‚R©ü@IS”;(iJ(…ª P2P -Láö’©Ø¨[Q -7>ÒŨ›âLb -w‹K8“˜™$²·ë*7_RRc¶³h*Ɋji赶c$Û80Îm›vQ={ölûé¶1@œ¶±6qø³U<¤e<-LÀóZPš'À’4KÀk›Å ÁŸÍãøh,ž×’oÐ&§CÔÀŸw2ä%îÙ{ØǎÛ/rÒ¤IC¬¸™m™;wîdóâŋß0­Zµj¡vz…aëÖ­oé÷ìÙ³UèС½º'N‘?üðÓò¥K—Î1ûªÄ<‰á ö²È«ñ»ßý.¤WC%µè¡šѸ•Óºýýß"a¢?wÀD…ºƒ¼}6&údLô‘˜è}©0ÑÛÜ0Ñ2`¢Wza¢ß̂‰ž• =¥ Lôè˜èÁ¹0Ñ}ra¢_Λ:uêó¹’¶¹ Èæ9ìj_ã÷d6.ïzYÏ?ÿ|m/k zD² c@i˜ÐJ.\»•’AF•LUâñ¯j±ø¿‚h\Ùuœ˜îÇíà«F‘˜î¦<{Øʂ9êh‡½d(õ2W_ã‰ÃQ¥É¥Y:€Ò"‚Òj‚Ò;¥¥¥÷J²iÌ%Veøˆ ô ½yŸûA)ЛWPúŸÿùEd.”[I[„ÒïV -îmÖ­T”­ôð!¸ Jm¥yóæ n%¶ÌíÊÚJíéVjÁ–¹Y[©{I–ì®Î’ÝÝXVeÓ4h•ê/ ävc!ƳÁI iÉ) -,‰'δ´4‹´¤´ƒ³á–Ç`ÁšV›çÊF¬sّôØAÑù$Bö‹N"B‰poÿŒöƒD®*aÑJCPxÒpSXdz$ZRA©xZ -+”Ô£oššbJaAISž»”Jå_ -JÔ·xPÒåVA)l % (åq?T@0ÒÃQ7›uÎ$5ꆍ6™)ÜiLá.r&•+W.Å%óeŸ3©@q&5jÔHTÜ~ÊȤ$ëZXҊÁQ)ÃÙÖºi﵏êÓ§O‡Ò± ›öqvñ¶ 6 x U"žÒ2ö£¥y"^Ö,F]‘üٜÒ"ÏkÅ7h »ß!æµ×^{> -ð’sÔ¨Q=ãǏï >bƒ‰m?þd LÖ¦Õ«W/4nܸq¥aûöí °ÓÛô‡Þ§ƒ¹;"Ÿ={ö”|ùòåóò7®2û–V¹«€,g¨<™"P -®å#kjù–‚ão0ùªuÿ–ñ·ßØð¦÷íxû»N|ÐÇÑ0Ñ×ba¢/Äݹsçt"Lôñd˜è®‹/îJƒ‰Þ”Žï¼6ß~©¿c^&~ьlü¶ eð+G”Y²dÉÀ bϘès&L˜Ð1&ºUŒÕse0ØOgãâoÉd^þg°pWKÄVuá®’Ü´iÓ*‰ªñê± ¨šÑxô1'ž÷„—|#ž[lÊénÉú ”^4Y{”ùAiO¾APz“ ´Š ô¶Œ/¾ƒu>ß%(—Ν;wšaϋ¥ë,_u› ôAé †=¿&(ýŽ ô{Žýû?”þª‚RD0#)ò˹•Ä!¸ ·Ò¢·~ïÅ­4{öì>,Ùý2k+ufÉîÖ,Ùýœà߈àê{°—ÔÌÀÀVIÇ`‹’9©O<ñD&ƒpî68IÂn‘˜P¡B…X¥n7ÛÁ±ËIdîl¬ВYiž‹•l´™ô “ތխ3›d#ŀmDÒûEç“Ù/RQv‘_ü¯õ#Uà v× •£4>(•›J€LÅ;˜~²[),(‰/ù#AISžû§€RigÜRù€’¦î/ -JRI@)(êVäLQ7áLŠã»bSMäÔFÝD=oHg’¯€()ـ·§pkbÆ4³1R;;l@'ˆ§cÌg§؅N›Nq쏛ê øW»DHÛ$<Ð:OiE)LµHÆ˚'ŠI¢$âÿ -‰V­âñŠ¶q°ûb‡ú|ôˆ#^Š‚êáœ4iRûôéӇDÂ<±ÂDO±,_¾|–yíÚµošp¿¿Òˆ;ÿ †ýû÷oÓ=ztŸîäɓGu°Ó§ä+W®œ—a ¯2û–tïÞ½»Ò—_~ù@¥ï¾ûî[æq’8¢Îô$mÑC5ØïÆÐC„[éOn%Ñ-oõµoúE$Þþs€à'ÐàFôƒ.Ç~öÙggãm'oG’ñýö¹ðM·¥-6¦;vlUƻᄏȻsçÎٙ›6mš’µnݺ1Ùø½C²,Xз 0åÕ2ìj_ƒÓ>&º0›ÍZ³€œ2q¡?¡dãR®íÆU\† ­îÂU\-¹yóæÕ1ÉÕã!±ø¿Ú1-[¶¬Õºuë'˜óFvEd‘†–VN7ë3Ò˜1c”F˜$FPz ´PPZIPÚ@PÚ.”ö³ ú1‚ÒL¤¿ÀDúk¥ Jw™öÀJß* $ž%¥Gw+ùz›„r+}àVRk+¹•DÉî™,Ù=!}Ù²e#X²{ Kv÷ðâê|à:x\ÈNpÏz±\ždɀÇ®2W‰A¸ri 6,“Z¿~}OÂ¥±nw2i)ž´‡EZ²GcË°9=Åõk¶™Œ6,gƒȤ·`љ)&¬sÙH1€ $½_t™ñ}U$L׈rX]ìH¿°¨Ÿ&D¤;¡ U…"¨PÜTdú‘´ô#•B}û…AImøV -J¥ò/%M?\q9ßW¥PÝKBÒõ&%Ñ©¤ø¨bd¸îT¦pg°@–äs&UñMUgÒczáLâ 7#n&,5Q&[©þhÃÐ)ŒÄëNQÀžÎьÅÒïãÐ9†´s"¤c¤C2þ¯] -¤M -žÒÚ‚jéÂ+ -]°ç-(ÍSð.BZ$ãÏÂ$<Ú*OnÏ7ˆ>|x—ØÑ£Gw‹?~|(PAŒÒPûܹsÇØ-Z4źbŊY–õë׿iÚ¼yóJã®]»68°]ÔدÿàƒŽêΟ?J¾zõêyùÖ­[טÇý±D;-ùì´ -J¿WӓJEµ||…¡O§ à )Æ­„·ú­E¸•€÷íß~ûíÇ×_}+ -€v-¨v!Ðv:ßêxâµk×&_¸pa—ëôéӛÓÞ{ï½uîC‡-ËسgÏ|ðc¦ 21sÕªU#³/^<( cÐ;›]í³'L˜Ð9‹]5²0ØÍ3œÏÒ¡ÑPdgࢮëîСCí4LhMP¨ PTˆI.H€ÔŠÃŸubð@½(<¥ÿÓ,ðÐ4+¥% Yu°`Ž^0\{˜JŒ˜Š¬a5Aÿæ›oÎÔ””–³4Ã[,Í°• ´ t„ tŠ tNò“*OÞ!(Ýž€ï9 ˜†=UPŠðáÑû%–v+…l™ûÏÝJš’ÝEà0‹Y²[t‚›ÊNpcÙ nˆgΜ9}=Ó¦M{ŋëôy/.Û6, T¢ô²Á ƒpµ„«Æ \> ,å1e)‹)Ké) %i)‰Ísãâ±oDÇaßpÆäääDFggg[Ø<,,bS$v£Íív¬XØz ö‰bAÉB IOÑù$BGˆ¤ -s‰…D„Qäç§H¨7ûŸ*¢š‘ܬ*£BÁS˜Æ˜!“†–ŠÇý‡€’ÚǤxPöHJÂn•‚R©ü§R¨~¸?(ÉÁ ºp’&êæOáö;“D -·—õÊ°¸d9v*©(e& gғìnûŒ F³©cЂqQ)¦·£8‡æ„Ñì ìéœéóÙ5L“y>iĈSð¯Ž.H{×°aÃÚ¦â)­Óxˆ:wÛi@¡©BxTˆՂ,UH´j•„'·å[uˆÇýy—¸qãÆu‹Áízh˜¢þNXç¡vÜǏ‰\²dÉ+¬Õ, ì֛fX°•¦Ý»wo4¨?Ai¸S1ÞPšAPšGPZ¦Ã,¬'(ma «=¬au˜5¬Þg «³¬au… t“ ô)kXÝ£Kï7¥ß”¾ãüð'ť祿”þñO@鑳•ÔCpŽàÚJÁ%»·$a*Ö³Ürv‚[†©xݍ©˜˜Ž©™©äÁTôòª•(EƒöÍ%³>Å \]á -x®r:¶‘òLYU@½lžë&-¥$aóHHÄ⌍ÏÏϏŠ-_¾¼#&///2 -Èdu™Ìv¬dS¤×ë5ÚÀMKFF†Þ љ°Îe#ő„è):<*$BV…õÜ$UØACH„FĦõS$ԛŠbrBDʦ±1jÐJÅ(APa¹é§ ÓO¡¥Ÿ”ÄàJjgÜRP*•ÿ\PšQP’Pò%s‚’Ú×­ø¨›HáQ7M -7¾K.ëT`§’*,À] ó9“ž 3©‘±e˖Ϛð˛‹jƒV S;³Tìd$ìe×(0Í 10/Òåóbüȑ#_LÓ¼4zôè®)ç]Î©ø¿Živn<¥ÕʍW´t3LäÆ´’F!K’ªZ¥°†_c‰°É]â'L˜Ð-¨GÌ̙3ûGáî}¨cá…cì˖-›b[³fÍ,ëÛo¿ý¦yÛ¶m+M0э¸ýßn8qâÄ~ý‡~xTwñâÅtׯ_¿ üñÇ×dJ<¸+}õÕW¤o¿ý6tŠŒ”Ô\⨹Ä2D¡%Ï:º•hÜJ Å­és+}ìüâ‹/®EþùçcéVŠ»yóæ{ W¯^=˜®ÛÂÛâë­OÏYáÞ³gÏÂt0È ‘Évµ÷,^¼xˆwîܹ}½,¨$cØ;x¤æÉdq§ãâoè&-¥bBë»pe×MÆü>–dz,©Û¡C‡Ç£;uêô‹[=ã`V³jicšôÕՂÉën¸ö3M:uAiAiAi.‹}.%(­Õa6”v”2IìAé Aé“Ä>b’Ø'¥Ï J_2Iì”ÄÑ7¶!VcŸPŠ¥¸•Be+ij+Ý v+ -p+áڑ„«I¸•Ö¸ðۖ¤âZ›“¶qãÆié«W¯—ÁJ”Ée*xÝ{y3À Ü3^Œd†Bëx0Îՙ²T‘G˲fCv*hÉCZJMƒLNªQ£F|BÕªUcâ+Uª‹mÄ]®\9[ÉâÀݎَ ʼn5m°Bô–¬¬,™b‚ÈFŠ"éý¢Ãó„DÈB¸# a΢V”êСD4"+„z­xgUĞ(šv5„T´R1J%¨°Ü -™4¹_„–þ“@IX¦RP*•_?(…퇔Ø։KM§%µ]IØÂILáŽNá–pƒZ–õ*ÊÎ$=I:“Œø½Ï™a/[Z0.m­É‘½{÷îì€éíêÄÎÿb4Ó«cÁ>ÝâKÎtK‚ù|)eüøñ/º ]Ó‚pãÿ:¥3&÷Øm3ðäÖ°-3ðÚ ðP‹t¿£ -S™–LÈj›‚—uHbíã„É“'w‹›>}zXܳ÷†=ê$Œ±¯X±bJ$nëgYqƒÿ¦eǎ+MûöíÛhº ß¾}ûšüÙgŸ•”‚Sd¤)2~ZR‚paÝJfZgáV²·’ÃçVº r; †;š;š€¯»? l±#ùäɓ︎=º&uÿþýKÓvîÜ9ύŸ:#?zB}ã åœ:Š=ö.Øö˜¨–éýúõ{ÎݳgÏÆi¤¥T\í \  Ç“q×OÂ$×KÀ…^?òx,þlƒАµ?³ÖsŒ´¶ŒìÛ·o{Þ¯«ïüªJÓ¦Mbœ={öX#@iª 4‡ ´XPZMPzGPÚIP: cŽ³}Ìi;¼HPºNPºÍlúÏxìð ‚Ò×̦ÿAé¡Y Jÿïÿý¿Z -˜0n¥ïMAµ•´%»éVºD·Òº•NЭt(þܹs{O:µ5éرco¥8p`…k×®] Ó6oÞü†¶Á †¤·ƒÓA¸Î^Ÿ‡ï9ž„käŘÖgÊR­ –¹JÇ=I76”\ÒR&i)=‹]ÉuêÔIJ¬Y³f\ö’è¸*Uª8cLöèüü|›‹Øâ7™ìØZŒ6ˆÁ -8Ñ[ :3Å‘DÒã)Šèð2!²v“„p« -‘£Q'ú‘Dób;TE´3…Å)D…,£A©ð¤á&5X -™Ô\¦ ât?-ýÈòÜ¥ T*ÿiò률dn”ä`P -ì}[\»’€¨[Dp -7÷¿òLá®,ã›ÖÐaW®£oØ°¡êLjBgR 36óÖŒU{Ìlg; nWLåK<‚ör pæ•8°Ï« °¯g^Iž4iÒË.ÈKiݐ.éÎ¸½îȲ|íh:ÚðlP+Æ&ZR -=€¢$¨éB7þ¯U*,q[^сoú|"ÌÎKñ¯¿þz¸9sæô‹ ‰Zºténæ§DÂPͲmÙ²åM Œ×Jó»ï¾»Á¶Øneì׃7ŽêaîNénܸq^†‰¾&ÃDL}W‚‰~ ùLô·!Mt˜\bÕ0+Ö9”[I ú˜i…[ÉÊ ÖÙJû؁¯q=Šn¥|µcoÞ¼y"þêÕ«‡Ο?¿7éôéÓےß{ï½ .vµOeWû´mÛ¶Ívû}þò‡20B=3•<~•Ý.}РA…npÎsi¤¥T,ƒF.\÷O&ã’o„I~"—üñqøóÉ<Ð(ëãYÆjæ`;¹½mðàÁ]­œx ¦±¯“2Ø*md¦Ai–P‚Ò*¾éFýzì³·Ÿ t”õN”γ>ÃUÖg¸åŸ…û¬ð•¾ç,ü‘³ð'ÿ,h•"TPòÑÒ#¹•Bv‚³ß»wï*ÝJç£oݺõA̵k׎Å]¼xñ]º•vj+QúK¤3·;cÙ²eÃ=Œ‡2׃A¸xµwàI¸Bõ²zS–êzX” ޕIKåIK9¤%/ §»Ù¸8% w1‰‰µk׎ÇMMtvG –nd4¸Éê7Y S$ÄhÃÂ6X!z Dg¦˜ð€l¤ ’¯PDǽIÇSç²_$vS„Ýê…(}ëÅnJD ÄPêÉêû ýËĹw±O -`_i0JÀ“êƒR¹Iø›4Ȥ6Wh†é4þÓh©”Jå‰üú@I -J=¥”‚œI¡ -'%‰¨[„HáÆ}™’Â-ùêT•ñuké4hPOýY8“әÔÌÔ©S§VfŒK;k÷îÝ;Ù`f»Úap_r:ôåèQ£F½‹í¿;#b=™:” “ÐÝ5uêÔWSa>_vl2 /ÐÉñ< FÇLðö™xrÛ,pS«,¼¶e& na& ¨…—BgHa:¤•Oi›ŠWtHá$͘1ã¥ÄY³fõˆô‹eölôòåËG;až&ÛÁ oØ`ZwïÞ½Ò|ðàÁ ¦ãǏo3~ðÁû à£ú+W®œÒAÎË0E ³¨‚ÒWÿ”„/ÃJÚ ì³Î¹Ý¢œp+Ñ:›h…[ɂúÒJ·Rä7ß|ó©ÖÙyÿþý«QwïÞ=óñÇ{ýúõãñÀŠ l?–äëj¯¤È¸vîܹ0•¾Œ´õë×Ov¯X±bŒC24Ù?Ž·tŒß‹nÆ>âl›FZJ%-¹`§ŸMÁÒx:Ë aVÀS‰˜é'ã!OÅáφ±XÏDc¹4‰êÑ£G3¦¤µ²8°}$f¿‹ ³ÿŠoßǂz͌e‡O2”^'(-$(­`!«·J[YÈj/ YaÅϓ2~ÛY‚Ò‚ÒMúõ>¥_ïýz_Ò¯÷ ýzE‰J”Â%*iAÉOK!ÝJ!:Á™‚:Á}fÃ׸mÇúȁ¯v) -àz&tý~,.ŸÃñW%Ê )¢d€W5·à:†A¸! ÂõõΜ9óž„ëÂxh[v9iΔ¥g˜²ôÓì됖ª“–*’–ʺ›5k–Ú¸qc«§§¥`q&'áV&!ÈdŠŠ­Y³¦#Ü…Elub§1;@¦HˆÑ1X!z Dg£²Qž,(z¼VvàíR‘°=†$„=êUQö5ˆ„ââEó -ñVªˆfb³ä×PZ¾ª¥b”ž4Ü$üMjq: 2©& -©¢J@K%h¨[ -J¥ò«–_-(±¸nxPÂÿEÝTV -wȨ[„/êVFò¥pWb -wuÖ¨££3IߤI“F:“Œø½…& D[ ‹1[{÷îÝ%wÂ/9°Ë¿5räÈî1`¤žq0•½@½’ÀC½R@2=SyBÚýú믿šy™¦_¤­è’‰G;eÁ®vÈƓÛfãe­³AA-³aD -³ -HP-hS -=x U:žÒ†¸Õ!¯}>÷ç/%͝;·{Â… ûÅ.]ºtp4 óh'IÁ;ú7"·o߾кwïÞXç ¦÷Þ{o›ñôéÓû .\8¢¿zõª -JWå{÷îÝR@ ¬RJ0šE äˎ)QЇ"?l…[IµÎ¹Ä´Ît+= [é³HZgº•>rß.Ó:Ÿñô‰÷¼Ú‘ˆ_ôŽH‘IÁ¯\êbWÔ·ß~{f*`qbÚ²eËF¥-X°`°<ٗC×= ,ú"óÃ:1¬mª8qد_¿f)˜Õ&É0ÖÏ$™éeJÀªhĚéOÇâÿÇàѦ,Þœ¥Ñ[ѕØ>’Éú¶1cƼlÅDõ¶`f™1)#M‹/žh\µjÕLVüœÏŠŸËJëXñs³_|· tˆ t‚ t†™b—˜RÿSêo”>gJý¥¯9¿#(N]C¡¦"âaPúï¹ÝÿÌ­„KàžÔ|‡n¥[t+]sÞ¹s炿åq– 8Ð7àº. ·àúº—㤠€ëHáñ$\//%z1XŽ²uæàÁƒ›²xw#ÒR}ÒR-ÒRUFâ*°ÖU®w,Y©X’é.ÜÀ¸’±B“ØÂ8>›LL¢¿víÚIÝ­[·Îé`ý®Ê°Î·äßüæ7wJ÷%PËW’”¾§uþã?%u¦%mÉZg£ß:Ó­ôß­tφop‡}n94}ÔXç= §NÚ–xìر IX•¼{÷îÅ)[¶l™ãÂLO¦LH]²dÉÈÔùóç¿ÆQë“&<|ãǏ)õÄÙCQŸAd`ùª¦I½zõz–?³\zãx -K£7aiôçX½K£·&&w°ãè9nܸ—m€Ù^VLÏ@˼yóF°4úx–FŸNPšKPZb(­ÑæÙû¥b*"ž -û §âoªsO¥ŸÅ­dÆç~áw+©%.; ®!Jåv>|xµkß¾}KØn®È>A¸ñ  cöX/¡^LÅ Œ;·Ïd^&¸óYoß¾}Ÿ$-Õ%-–*gtèС|:bNZaa¡7;Û…&%Ȕ˜Ô¨Q£8ö1ŽŽt8cÁ‘ÑXĶ(ì>Äd‡#!+Ð[ :3ž§3Ჯ•ÙèZbƒ"‰Ç7$n’ŽíÂd!7Ž¹¹IBXžG•ˆ¦M›>$b;T%ÔSÄk…ˆmS?HiS&vQ|—@ª%JÀ“ðA‰Up“ˆÝ‰íU¸š2 /“˜¹LÂÁ$h韶@(™’áJA©Tþ7ɯ -”¤bAIO)%< :“Š¢nXyÑ|«¢¨ 'Eø -'e3êVVò§pËØ}jë°#=®Ãïh¤Ç®ÜÄ œI]ºti+Z Z`*_°ÁJ¾,š¬9GÝ+7Æ}yú¬_<`§"3«SÀCýSyòÊ £Ù‡Õ÷zz!ݳðçËِËàÑçs;Ùx£].^Ö&ÜÔ*¶¶0Ò¢ Þ¯E6¤0 ¶ôâÑ6xr{7^֙Æÿ…ܤ¿š¸téÒ>ñ+W®|-vݺu#£ß~ûí‰Næ™v€Ãb¹…1*3t›Îœ9³ÇpéÒ¥ÃúëׯŸÔ?Îé"WJ7P‚m ô‚ÒoéÆ¥êÆøŸbÝJ v+ýџKü­p+YXÐÇ*N^Ñ:ۃ -úœ‚u)2ÇcÁzâ@}»ØU#$¸>‰L˜¼cǎ7S6mÚ4+eýúõS]—q®E‹ ç| JÅ öNÅl½Âäú\¤¥Ì¥¨kÕ*SÛ" ÈԌu>›&›X½iCt,°Þœ%² -£Xˉ—up°Rƒoõ² v¿—o?€ 4Ì @g(M5”f1‹J« ¥úãǏo'(í#(Ձ7N²ìç9:÷®Ð¹w“νOɬ÷èÜûRE~CPúŽQPûA¥pñ·çVúÁõ;Å­T‰òŽ¶¥¯dÀC¹Ýømo1·’A¸7„›Åì±)Jë®Ý¾^\ò¯0ý<ÍmIKÍIKϐ–ž -Õa¿“ê؂*¥cã)ën×®]–õ¤bÏIKÁ­L2‹©'$bÁÆ&€2¢Ø£Ï‹-(2b‚X“bŒÄ£+DoÁ“uf¼Lg«ÈF¼‹lÀ& áM’¤kÞ¼y„Ž››ÌºÎr˖-#$!Üõa?z!Jgz±'–@ÔWˆ TßY) -öS~¸r²]P•ŠQ*< ”ÊMÂߤA&áe9‘.L*-•¬¦¥RP*•_µüǁRq•¹%z…$bO(aý -ZҀ’)”°Î#•¨Þ †AùÀ¨›¯pR£nå%_ -wŒ=ç1ö¡zü˜g ØȄ3©µ CÒÁŒ»‹6´›mȐ!Ýí#GŽìådþn4Ë=Æg&`瘈èb]b}ú§ƒdúz ½3!=²!¯äà¦ú¥\<Ú%Ïë”»Ú¾,¬x›²xm«<@Vax¨ ªE¤0Ò2´öàyíÒù²4¼Õ .˜ãW’V¬XÑ;a͚5ƒâÞz뭑р„ Nvø°ïÝ»w~$LÖ2+Œ×:3ÌØf Ún#M›Fî}=ÌÝY‚ÒeùÁƒ7eÀɧ¥{á@éOłÒÿHAÊ­Û`EÖY['š'¯nÓ:$N^9ùu£nܸq2æʕ+Gcϟ?¿?îƒ>؏¸)áСCkñ£—%áç/H1¾‘²víÚ))˗/K¨æÂø t;{»HK<ø 7tJf–w2¦¶u+W±zz‹ÖþdAôf¬­Þ<–u­bTÑ Û9q tt°Rƒ}âĉÝ"§M›Öӆ‰êÏ2CÙCfŒ™yõ¥7J ×¥·J[YösË~Òáǜ (!(]bºØG2ñ6ÓÅ>c¢ÒãoF¨(þFÆ|´ø[[é¿B¹•ô­„ùøž´$ÜJšJ”š’åvƒÂw2·É„[–ºk×®ù ÂÍLÇÕ91ƒ•AYÂaS–z‘þ»1U¯ ^µ&-=GZjÄH\}fy×ò`—ªšÍ(?ûPk„f¥™2R±BSSÉÉ؂âÁ1 `‹¨8¬_G Ä ±:!f0Ù!Fžg°âz ¸DgÆȬ¶/ñ~}Ȓ¾mÛ¶’Ÿ!é¸×éð‘2·>ûA„$„Û¡"bwԈ覑PÏ›*ßO±½òÓ"ðáEU¤P ŒR Ö xR¹Iø›Ôò¾™Dj“̉„&ÕÁ¤†ãJVº®ˆ–)Á[ÃH¥ T*¿BùՃ’N%ˆÞïL2ñ Ÿb㓋¢nñññ±þÂIJÔ-"(ê–/á[U•ëÔ©SKÆZ}vŸ†zü¢&lU…FìpíL¦ÎæÞ½{¿h…©|•i)½h ûFMš4i@ÌôéÓŁ‘^K„Ì`Ø`D»a 2‹µ¿F³o¤[’½š 閇G»–]´hQçrà¦åð²¶å`a[•ƒýhInj‘GÉ¥ÐýTHoTk–SlÇdŽn¼K×TÀËÉ°=½×­[70h0<6y|ÔΝ;§;öïß?7’íѬï½÷ÞZËéÓ§7™`˜wa˜À'ôLÎÕ}öÙg”n”>Q@‰Y*4ÌßÐ0GPúƒ”ã=Â0Ó Pú'´$ -,… -ú¨)2>묜¼)26ŠŒãΝ;°ÎF]¿~ýD =c±gϞÝë¼=þرcoÿöÎ;Ί2ËûUusηsNäœÄGTD$ƒ‚$A@ÉÐäÐäÔäÐä&ç$猈*æFGg6Ìλ»³»ïï÷ÜÛ·n_n7³û¾2Ûüq>ô­\OÕ9ß:ç<çø=º>H²27¢ vëÖ­sâ@‘Óâ - Ǔ–FÆHsãAKýâIKq“'Oî7~üø.±làËÒ1ìyϊêm},Êëm<üÓÍ®elÓÁ ¾êDV~ÙÎIu6¦¤±‡Ì` Æh„Ã=ÎPšjäx.¥B=Îo£gºC p= ¸%(áʀø&+5ÜæxÜc¢Ò'nI\åˆñ(ûKÄü·’ÝJųÇ4*¸Þ_‰2¢d@ôÜî¢ì±`;¸sçÎm/ -Â-çL¸,ᐟ²iÓ¦‰LY•†‡?—¯ú0i¯;i©#i©-i©ó–žÉÀ‡É¬ Ð ­wïÞµR¡ ª¦@-U`¡ÐŒ$(£”D(£„x¼«±¬ꋁpûÀV µ±¬ºÅar`‘Ýúô6[hÍØV˦ÖÖýP ÐpŠ{–uxíe-TŸ¬ÅÑd Õ¡BŨPE*T–²T ¡cqºÑE4]\¢ò-½y4½«"“л"¡Iu0 ½AKj$Nä-©YÞj‰ÊÒS–T(Š&ÊA©\<ªâQ%¹8()ÅAIK¡£P£n¦3©ä¨›T,êVC®_¿~]…)Ü -鑦Y³fM´ø~k©Ã‡Ý z܈Ž†>}útc¯Š^f6õ²æåå ´Ã¸æ:óóó‡¹ñM<Â}?2rd<§Z%2¾ÀžWÃÒ@2C2`eÑïÃN÷}*’n*ai÷ÊX¯kOÇ*ج}Xñª€›ÚVÁ®ZW¢¨HQ¿µÉÆÒv™\/ [tbí㗓֬YӓN“¾±[¶lÉõÁòìÝ»w¢ 69ߎ/ú֓'O®°œ?~½éʕ+Û °eûõ°jGu¬åHPº¢ùì³ÏÞ¢ãn”è?ø[@)-E ÂE+èH‘¡u)2&XçÏÌ<+ =^6Xçwì8ç᜸Ž3.\Ñ1®íu/“°|¸Þ-~ âZÿ–ÇìÚµk!oάXR ii\nçÈ8ÒRi)nƌ¯ÆqN«^ueyÐN1@¦~Xì}¬ù#„—²NV{7VyÉÅrXNQ´c=mLÛ·²Rƒ»nf&¹ €6ÅPšÅúè Y}AiAi› ´—•Ž°RÃ)–´º ùàƒ®+E¡Ðw -ñ·Ïèá ÄßdÜ¡eÜ«ŸCñ·¿Å­V2@[Bƒ“ˆ’á¹Ý8Ó`n7ëv{EÝnú,c.]º´+®(·:ñСCK’ð`ÎcÊÒôT¶çcÁ«t¶$-½š!¦8€–:0×*÷¹iÞ·§2† ò†ãê¥õíÛ·F*tX娪lV MO‚‚JN€‚Š‡‚Ša,o „ËáðBXÝf–šXÏ`~è­ØLg†Óš± ûÓ¡~)zCÖᵗµ8¤¬éׯŸ¤¯Iʀ$çò Aƒ‚ê! ¤ÜÜÜR„XEÜVâ®$îYâ1$MÂqƒh%”´PÍ*< ÷“ª†EÄNÕÀÂË$s"<šòUi)"oỈSë-=¼[©”ÊÅ߉øû%üfäÒ²DݤbQ·Z2N­'¸<¡àğѴlÙòy-®­µ×Û^ûÒÅõÕÃ4tèÐÞØËþLÝlŸ>}ú0tûlã(pftìòåËÇijlL¿˜ÙójD:¬ó°Lˆ\6¹X¢o%,xµ2ç•*X¯kUŒNÕ°Y‡j ªb/m)ZžZÑéԊî§Ö9XÚ6 hõb¶è˜ŠtM†%ô>±Û¶mìŒôîß¿‚ –i†6j¾ 6y™å… ëLW¯^Ýf¼yóæ>ýíÛ·ß (Ö²ü5AéM k)°ƒ”>%(}EPúŽ ô#Aég‚Ò?¥¿D¥ÿøÿøwYˆh´TdÿRÜ:«3¯A8}(ÆüñKƒpfXç, ÂÙ)´“(°Îo¿ýöi׍7Žº/_¾|ÀsöìÙ]Þ'Nlö>|xß¾}Ëbvîܹ fóæÍ3IKSbqóbYxŠ³scºb¢âk±°Ó=bXÎ3†ä?~|G?¡ˆD;°DVրxɍ¥\`¤.ì³×Ý1sæÌ^vV ²q¼C6̂1cÆðL"(å”æJË ¥5úS§NmaI«Ý:æŒißzë­ãÌ;§t\erý[LTº£ð¢ãà |ËAùn¥ŸäÒºÿ¥‡r+E‚ks»ƒu»ßÿý‹žhA8<pх‰¸ü¦,ÍNa]*ø~,?$†¥34Ž÷¨'i© [ϼÈ*-3ðMÒ$cÔ¨QO2אe꤁(ª§‚#*¥€#²’¡ÃҒðš&%@}ÅÅC}ùYàÁÃNþgg«KÍN¬gt` k«ëÙ}HNJhZ3àDcĞ5P‹¢ÇÀFցÒd-Þ}Y3|øpIø&)#GŽ”dœš$C)„ 8ý !Ö‚;¸«€àî%\ª$á¸A´,%JÀ“PáBS Õ,´²PÈ"D't±Ì©&‘Ƥ†ã"hIÍòsâDˆ ÜC̈́+¥rñw" PbwïHPi ¡¥ÐQBΤhQ7Dԍê¡b(êVGÆù5dÔíIFݞÕà㬅ØN‡+輻.îf„ªzÕí؏s1#e(mãH×¼yóF{ - - -ÆúaóbéD`òp^ÌñX‚Ñøv‘1483¨"þׯ2¼V…ˆS ë½\ ÜÔ©:6ëPÜôBuì¥-¹©uUØóVU(è~j]6¥m6WÉÄ/¥a]8÷ú•DXâÞq;vì³gϞ^Ø£qî#GŽLsæÚK-/^\c¾víÚ#lòlòaLÛ)-lòE lò ‚ÒmÚä{ -@éÚä/i“¿¥Mþ¡8(ýmòŸK%Š¿§¥€‰~@Š ]%´Î"÷½Ž#}&ú2Ì8É{"„0aÇ%\u0)݉Ë:å¢wƍKÝïaʒ÷øñã›|¬Žàc‚·wh¾ ¥N‡‹´¤%–ñŽaӓú‡b€LÝüé®~Îb÷ÁlwòRxðg'¶Øëâ†=™}öº;aÞ{98µÑÎ,e3p¬¨ÑŒôD3™Mì³bdájgϳöçF=³ÐuÌGç,Ä£œ…xFKG™†é?¤×wèæ{Ÿn¾9(ŸÜJ¼/t+ýn¥?Ê¿Ü­ôoÑÜJQJDËíþ$Ûýå—_ÞQƒpî¢ Ü‰@׶7W¹5þäɓëpå˓p&ãnÌLÁ}™”Š§x4i)—´Ô7CñJç‚r¶§(,Ö<|ژá¸ße&cû“Úi@ˆj©x/+¦€n2“Á9©,š˜ö‰‹‡ðÅB¸9yÑ郰y°Š…óÍNladK†ê­@-cêZ0EcÄ{®À/Š$#ëƎ+kñÚËZ°²¬Á¹H°²¤€•%O„$ã$ƒÏK@HBà) ê!¸E@p/÷'q÷$I8n¥T‚ð¤r“ð7©È$¼L"µI$4 …,&Ð ]¬Ò’ª†EޒÈòŽÐÀjN-ãý ÝJå T.Uñ聒Jx­TFÒ@ ¿AéÁQ7©XÔ­žüÄOüFiܸñS|ˆ5ÕàŠZi¡sÚëp#ºè¡^{¡ z³Ÿ×@ ´Ù ä”ùhÔzž -~¼VwB`gB4ÿxö—ÆÌêŒ-[¶ŒÊ†I^"·þP¢OU,íYëu«kÚ¹6ëPÜôB Xñ¶ä¦ÖÕ`k[U¥ û©UEˆ69X¥]WfØÎ)ØUwVA~-¶g@ €`Ñ ÏOø©N˜§9ösçÎ-¶^¾|y•ùúõ뛍·nÝÚm¸{÷î!ý½{÷NêÀ´ ëš¯¿þúm‚Ò{´É”¾ (}CPú=Aé'‚ÒŸ¢€Òÿ Ò¿…@é¯!PŠ¤¥¨A8zD„/CË_À—AÏ ƒpߑ–¾22gb(ÊÌ œ…yoÞÓ@ˆß™ê³µn­4ÐC•T N…¼¡ɀ§”$°OBD,ë=x9ƒÑ͜|‡«Ø˜Žoq´LNðÑŽ½èmx±uVp‰Ö ҘÀ*¶£Q àE¦‘u8Y‹—µxIƒ³’|)I -žIÁ# ÉBàÉ  g_Š«ÁÍ$îEâþ$îY‚h%0J”€'áÜ$œN"v'I¨u¡¸…¦úY¨f‘ù-’¾…BV#q"oI”sâÔÉÇ"§¦TgÂýB·R9(•‹GU< $—”𧑠Ì\Åʕu“ŠGÝ䢨[cFݚiÚ·oßV‹ë}I‡›ÓM¯ÏWPÈýLТƒ-P›ÃmPi£é?Ès-^¼x‚—óÀý€˜ILž”ÈdU–$ž¶mÛ¶q™€˜1Ù°Î#*B ©Œ?Vł¾Õ`!zÕ çԀÙîR›½TvõŚØK[rSëê0å­ètjY…ÿ«Äß*`•¶ÙX¹=¬S*vÕ-yçΝ½Xl±,,ñPÿáÇÇxŽ?>ÙR˜eÇý"+¾í Í°[M°`; Jõ°jÇu°oçJW J·JïÒDPúœæøk‚Ò÷¥?”þHsü4ÇÿLKü/!Pú×h FK©¾Œ-ї¡/ -Â}k`ìÉH\ -}hf -…ÉôËÀì‘ Žèœ‰[üB&^º,dÿ,‘éIz™2©3¿«³?b¥Tˆ,¶FLcŸš¤Dˆ¸üæç„FO,Þ_'{0Ú½à +ƒ§fVö0:f̘a°cÏz+¸DgÁÐjÍs ¬+<Š§!ëðXÈZœ•¬ÅS"k@Ò#-)P’‚s–d!@ȒŒÑ)šà*Á-$î@â®$ìY’pŒ P ‚ð„g-ÈMôibw™„—I愃I$‚ e.· %¡¤…~ªYdy ­¬¦,‰ œ¨åÍ­Tb¶R‰ ‘ÊA©\ö†ñÁZõg;½>œÚ؛ˆ_õrš–G2’†´ ¦­Ÿ–n “3ëÖ­aÇc1ֆQdÅHO·€ -æ²¥L c´Òtúôéõ¬º•U@÷èÁ±‡8ñD p :jYڑñ7áVº§)îVRBÕÔl%áV’èVŠL+sÝîû ,©A¸÷Yð*„s‰ ®ã¬Wtœ´ôz ®rw®wK<®|m"îÁ2Ò҂ܗ|ÒÒDÒÒ(ÒRn†¢Kj¼’‰ۑEZÛfáÍk–djL/Ó Ì5`æwmN–«Æf?Ùk:“]ýRÙ11¿Å&`©ÝL?súñÛXøÌ «&&U=3ñuVŒ¥Ö²lÙ2 €Æˆ3P P…}ûd^vY °–58II– ²¤à5•Œ%…òÜçϟŸJR˜c3,±¾õÖ[«Í¥Í¥Ý€Ò!ݧŸ~z’ tAóÍ7ß\'(½MPz–øc‚Ò´ÄßÐeñ{‚ÒO¥?âo”Š%*i©tPºŸ–¢á-©A¸ŸtÌÊ Ð3u„ûÌȔ%ӗ_~ù¾™)K¤¥›¤¥«¤¥ v&x“–Þp–v¹Ø˅´´VВGÐ{éza¼fø`­&û`¨Æù˜b䃕æÃHçúR#7õóö¥èCÑۃßú¸™‡L÷b kÛqÀšŽ`Û½1v ÞÆwšc>ÛPZh>zôè2–K_cÂm62'Pá -„wTϸ•.äVÒ2ªÅ\û€[ISÜ­¤Ÿ§º•äb%»ËàVŠ„SÝJQÚó‚pœ%IZ -á>ÿüó·ÙîºK43¾{÷îi¦,õƒÄ^¹re'iiSÑÕI ¥%É ¥¹¤¥éi¸MãÓqÃFpÄ ÎZx-¸Ð- w·Cnvk"ÓóY›§Ùè·t5Õ'7Õd÷Ä*ì"—“ -‘ÁFÈ)Éø-ýcⱞ7[¸˜ˆæ ôÚ8ÃâÆNMN‘Á$ÑÛ0‚: FPkÆs 1áíÖq.Š8£èñ”È:œŸ¬ÅË.kðäHœ³¤àm”¼Î’ŒG*(0Ü!E. n!q[‰{‘°Ó P ‚"‚Ix‚ÜD'V2‰èœÌ “HcŠ %¡Ñ…ö嗄¦JZ ‰ZÞ¥»•ÔIpeMë.¥rñ苿+PÂo"êfåznáDÝD_7ì42ê&‹º5’uSDÔ­cǎ/jpÑ]´}úôéÉÙÁý8ó%—©#™¶gŽdƒfÊðJ¾ªt«aώ¿Ìa>õl‹™EtÉÏ8xðà´,˜ãÉ`ÇUÆÿFW…V ÕÄ*}kÃ8ô¬ÝÙ­4f§ºdŸºÐ˜m‰L­kCm¶¤¿©y Šjø­E,mY뵡›ê…Lì cö÷2M/ÎÂî â?sæÌìÑd,Ó,;Œð"+Œp¡Fx£ Fx'Aé €q\P:§t\%(Ý"(½KPú ôð×4Âß³nÏJJT* ”àeú•†^-ý%"eIGŠ^¤,Á:FKlÀ %\ÖM+¼m`Â󤥓N‡#-íwž={vg€–ØÎ-h PàōË‚38 “é`烝íc="Ó é rÓ/ìjŠ~üÙσýÝl$ãfF² › q -P®(·3džÍ´âó-@µ%fœÆ*“(ŠSÛndxÊÀ@«7œÐ3x¥cK¸•³wBn¥O4ÅÜJß+Å'Á‘–îs+ïéVŠR·ûá‚p,GÉfÆ÷Øuæ.S–Þr‚–®¹AKHK§| ¥#1x÷‘–¶Ç7$‚– -IK)x€g§âyžš†Ç;/oÔ° Ü¿™¸“½²X # /]{"S+"ÓsYàœFY žÇ«›‰—³Ë×WfGÅìTˆô,HJÂ*ñ‰` <¶ð°.„“ÓTíP«;5»@FF'ÆÍ`ÇÀë­ ¬¢5cð4F¼~Š#¨èñšÊ: £¬Å™ÊZ¼y²*)xÅ%—ò‘#G$ƒR„àҀàÊ·•¸ J!ÈR‚ ÈanN'L"X'¼L"¿I8˜D"x-‰HœÈ[]̉)Kj.­‘­$rDm¥_S£nå T.ñk%|ŔJ” ü_0êæv»m|“EÔÍS<ê–Borf êV£FêŒÌוñ1õ'ù´Ü¼yóç\GFÝ^ÒàtÓöïßÿ5Ý°aÃêóòò†¡‚ƘðY:Á•;…³¿g8 ¸g¹ñ¥)Œë<–5œςzœþ<'ZoV”àŒl¨Ã) &T†S¿ ¯1¸&VéWŠ¶WlÑ­.ônçºØAûºP‘íˆL­ë@´¨=7¯‰ÿ5¯NQK[0Š×º¶h—…tH‡¢í’ Ü#ñøñã}Ø=b°öw”÷âŋ9 ,ŸÎ l¥å€Òz‚ÒvÃG}´Ÿ t” t† t™ t“±;4Â0eøS‚ÒW4Âß”~$(ýLPº/þö@Pú(kÊÒ?‡R–-R–´T”²ô%S–>5!> аâË|ðfˆ–ÎÙ9NВCÐÒ¹sçv–6‘–Ö¸qÿ–{p; <œÄÏp\¾VrŠ—u™Á4†È4‚^¦¡ Ìåzé8ò²Þ:ÅÚځ2’Å`øy¨ w„öm´£”&Û1nùlÀ7׊‡¡ÀÂL6—Ygb<Šõ@w1P œ2¦[œáÌÄK:V n%m([I¸•4t­©n%ån¥;ó=dN ÇB[™pś3eé¶ç|Ӊ³¿âÆw΋Gï„á!ÒÒÞ8\ïÖÐÒ:ÒҊd܍…¤¥™ix!&3p=&ƒ 21ýXa£GnlgQ #w¼ËÜ?› ây’f€ê0«©Ë×WLƒÈJÅo©l#”˜„õâØñǏ!sÇb´œœ‚aób|-|“M.Œ–‘£¥·á¸:FKµf ™Æ„gCÃ"XŠŠ¢ÇIÊ:¼o2Ëœ¸¤9qâ„¤à‘’¼~’,.+(0Ȓ$ÿ ®ÜLâ^$ì/ÈRžpÈ 7 “@&áeÑ9‘Õ$RÂ#hIDâDޒÈòJ_èq¡¸EuÊ·’ÈV­NÔIp¢¶R‰ñ·ç¿E£¥rP* xô@IÃ7T×I€’ž"JøÍÂUÔ¨›7uK ‹ºU©R¥²T«V­šœðQ_þÝï~÷„üì³Ï6–uSBQ7 îPí Aƒúêð]6X?~üø‘ÆéÓ§ç™æΝ;™Í)¦Ó9?‹‘•¹n¶;õŠb†ì“ÏIMIÐpóSaçd@áÍ̆%žVbReˆ¼j#k`An-¬Ò¿6V~µ.©{=èÄÎõ°ƒõ ÛQ´&7µ¨ ƒÑ¼þ׬E5,h^Š»%ãym³±m{Y§Tì¹{ÔõkLÎ.hãÜ¥i¥y6ØߥØß5¥-FX°=¥Ã¥S¥‹ôVÜ (½CPzŸ ô1S†¿ (}KP -Æß`9ÿ”‚n¥"Pú÷’@)-Ã?¡ÈB‘²FK,R %vø`ÊÒ'F¶G3}þùçÞ&-Ý°r:œÓá-ÙAK‡IKû´ÄfÁ.6pu³Ó†‡ó÷=¸ãs9ªùdà)t0M 2%2$2 g.Ó/,v.Å`/ñÈ#–æºÙvÏÅZ.< £œýèÀþ&”¦ÛqŒÙ6m!»ð-³à V›q.›D‡Óõë×÷±ÖÕ3¡…[‰ÉdW™Lö–p+i#ÜJ¼ÅÝJ?‡¹•pÿþ,—Í­­ÖUé3áÂÊQ†53A8Ö °‹”%îUVÄ6NæáÔO%±!¾Í$Iì<úÞ®$IÆGõ†3ðÝïIºE–Ï’ô_bbñe°@’ÇfO HbÓ¤Åb’Ø4ùÜ?ñŸÛâݶ€$Ýåj$¶ ¸$‰í+,l ’Ä>*/"’dØ2uœü¦”z>˃;I’á•žZ’$CóÿF$‰õ’…üA’ ¯tµ'Ibáíz“$ÃëpíI’Œ_â#‡$™Vpl_¿ÿvÕ#q’dú¡Ê•$‰Þ,É"’Ä¢vL˜V§oŸ!I,ÜÆ&gþŽ¹YmK`ëH’é”U^äyó£Ô=q’äþCUKF|ee–$‰}™ýâ7á"³åûµ@’çMÞÖ#Iš½­¬/ ‰-²÷s$¶þÝî’´PùŸ§“êîºH’ÄǵH’Rc,IˆóZ$ɦ¬ý$[°ŒúM$Û/¢Ã$Ùl|-d«0™â¤ìsØï’Ø5ª6â¡VÏ¿÷ñg¨øô÷'Iª‚’ ¤ $),IRX„˜!&©J +L‚’ +&I%L²”T$IÊi$©¦"I^j*’$ÕT$Iª©H’—šŠ$I5I’r*”ä%§BIS‘$)§"Iªœ +$I9H‚œ’T9$ANIÐS@’ª§€$詃$ˆ) ISHÄ’1…$©b +I‚˜Š$AK!Iª–B’ ¥"IRH’*¥$H)$ R +IR¥)I‚’Š$©B +I‚®BH!IªB’ ¤$)$IÒ$I$¤I’HH!IŠŽ&I:š ‰t4A’"¤ ’HH$AHIª +$AG!IÐQH’ª£"IQHd’¤Ê($‰dH²½@²IPQ@TäCE“$)—(‰4.Qi\²$Eã’%‘Æ &‘Â%LR˜DL‚À“¤ÀA’ p$(œH’*p$$ IR’ƒ$Aà„’T}%‘¾‰$AÞD’uH‚¸’ n€$UÜI7@Ä ¤Š âH‚¾’T}ƒ$Aß IÐ7H’ªoWfW }ƒ$AàD’T}ƒ$Aß I8‘$Uß IÐ7Hô ’¤êúI‚ÀA’T…ƒ$AáV¡p$Uá IP8H’¤($‰.I \’$Eá’$ …KD +— IQ¸I¤p ’Há$) +— ‰$.II\’$Eâ’$‘Æ%I"K’¤h\’$¡q€$’¸IŠÆ%H"KD— ɇÆ%IR4.Qi\¢$Ò¸dIŠÆ%K"K˜D*—0IQ¹„I$sÀ$È0IÊ$ 2I‚ÌA’Tƒ$Aç IÐ9H’ªs$è$ :JR…”DBI‚ÒA’©$AëIÐ:@’ªuI:@¤¤J RH‚Ô $©JI‚ÒA’ t$Ué IP:H”’¤J$ RI‚ÔA’T­I‚ÔA’ u$Uê @:H¤’¤J$ R·Ú©ƒ$©RI‚ÔA’ u$Eê’$‘Ö%I"­K’¤h]’$¡u ’Hë$)Z— ‰´.Ai]‚$Eë$‘ÖA’Hê’$)R—$‰¤.II]’$Eê’$ ©KDZ— ÉöÊ$‘Ö%H"­KäCë’$)Z—(‰´.Qi]²$Eë’%‘Ö%L"­K˜¤h]Â$Ò:`´˜$µ’­ƒ$Aë IªÖA’ u$h$IÕ:H´’­%©ZJ"­ƒ$Aë IŠÖ’ uI:@’*u€$h Ij@’—Ö $I­ $¥N ÉKëD’¤Öm¨²´.H’—Ô‰$I©I’R'’ä%u"IRêD’¤Ô‰$yIH’Ô:‘$©u"I^Z' +$µN$IjH’—Ö‰$I­Ë6¤u"I^Z'’$µN$Ij]Ë-Kj$ ZI‚ÖIR•’DJH"¥K¤(]‚$RºI¤t ’¥KDJ—$‰¤.I’"uI’Hê’$‘Ô%IR¤.I’ºI$u€$Û 'ëÚû› ‰”.A’O¥ƒ$©JJ‚Ò5vë!t°$Uè`I:`„˜¤ +0 B'˜$…N0É:‘$)t"IRèD’¼„N$I +]$©s"I^:'’$uN$IêœP’—Î %AçD’¤Î‰$©:'$uN I +]€$/H’:·£a¡s€$UçIÐ9@„¤ +$ BI‚ÐA’T¥ƒ$Aé IP:H’ªt$($ JIR•’¥ƒ$Aé IªÒA t$($IU:H”nµJ'’¤ +Ht’ƒ$):—$‰t.Ié\’$Eé’$ ¥$AèIªÐ’ t€$ I:@„’¡ƒ$©BI‚ÐA’ t$Uè I$t€$ IU:@”¥k¹K~)]’$Eé%‘Ò%J"©K–¤H]²$’º„I$u “©K˜DRL‚Ô“¤ÔA’ u$H$I•:‘$($ RIR¥’©ƒ$Aê@IªÔ’HêVê:H’"u€$H RHRµ­$AëIªÖ $AêI:@’*u$H$ RIR¥’©ƒ$Aê IªÔA’ u$H$I•:‘$($ J'’¤ +BI‚ÐA’T¡ƒ$AèV!t$Ué I:H¤’¤H]’$’º$I$uI’©K’$¤.Ai]‚$Eë$‘Ö’Hê$)R— ‰¤’DJ—$IQº$I¤tI’Hé’$)JIB— ‰„.A’íE“E¨•„.A ]‚$B—$IºDI$t‰’HèĒ™K–D2—0‰d˜¤¨\Â$R9`T˜$UN$ "I‚ÈA’T‘ƒ$Aå»Cå IªÊA’ r$¨(IU9P©$ *IRT•$AåIªÊ’ rI9@’*r€$¨ *HRU’•ƒ$Aå IªÊ‰$Aä I9H’*r$ˆ$ "IRE’•ƒ$Aå IªÌA s$È$I•9Hdnµ2IRe’™ƒ$Aæ IŠÌ%I"™K’D2—$I‘¹$IBæ$‘Ì%HRd.AÉ\‚$Ò¹IŠÎ%H²%w$‰„.I’"tI’Hè’$‘Ð%IR„.I’PºI¤t ’¥KDJ— ‰”.A’¥K’¤(]¢$RºDI¤tɒ­K–DZ—0‰´.a’"v “Hì€I;`’;‘$ˆ$ bIRÅ’±ƒ$Aì IªØA’ v$ˆ(I;P‰$ bIRб$AìIªØ’ vI;@’*v€$ˆ IŠ@’—؉$I±ÛÐe‰H’—؉$IµI’j·qdQÔN$IªH’T;‘$/µI’j'’$ÕN$ÉKíD¤Ú‰$IµIòR;‘$©vنÔ.H’—؉$I± ’$µ®åŽ%µ’­ƒ$Aë IªÖA’„Ö%H"­K¤h ‰¤.AI]‚$Eê$‘Ô%I"©K’¤H]’$’º$I$uI’©K’$¤.AI]‚$EêI¤t ’Hé$ùPºE’©[(‰´n¡$»Å’µ[,‰änÁ$Ò»“Á[0‰/a$/a’Ô¼$IP½$I½$IªîA’ {I’ |I’TåK’éK’í%©Ú—(‰Ä/IÔ/I’"€$¹ÖH’k=$¯µž@’\륶i±'äµØH’[ÚIrG+9zíhƒ$É ­H’ÜЊ$ymhƒ$Éý¬H’t݉$y¹îD’¤ëN$IºîD’¼\w"IÒuۛô܉$yyîD¤çN$IzîD’¼Ê,’Äï£E-xŽ¨Qò,,äƒ?áþZ/5s®%¿Ü^*k”øgã7Ϝa#ù¼ÄxÓ£¶-*/DZ‰>ý"j”XŒÏu%Ybg9G-Ž–ØÀ}Vo¸ÄæóMŸI—lö%Y)ð›ßžÙ/«Ž8_²A–læFõBKlš±¡¯«]ð­%†-ٜ«*UJ?ØÞtÉó·žEX "ë`_Ú¹·U©ä¹‡ÑóG=ªþXͬ¸Æù?&ۃ”pÀä¹âðÏË&ÂÄzkøNeWþ_¶Ífï,VâîӓE±’G÷·½¯b%ÏAA'¬zÙL&ãÙ-›-VcY¬ä—KuH¢V‰ù+fÞ[x Z$J}pzP«ä“ýuk§9.õ`²[\ܶJ•ìæ?֝Ýþ}QDR„‰Í¾CabãÕ~‰¼zer߉˜X/;åbrø Ë¡…ÛŸ©Á¾ “Á€3“ßö®UrDù4;Pñ"'L̗\ùÑ9arX(Z%ö›ÍcÏ LvGócˆÚ‹ö×îY'VF &ïmcâ+Âå*ԟ¥ä‘ˆ‰]cŸˆ‰)Û-&ø¿0bòžOu>»¬^®üË¿ü‹_ýÛßþêßüûiò‡,ÊK|Å¢¤øŠEIñ‹ò_±(ˆ¯P”_¡(/õŠ’ê+%ÕW(ÊK}E£¤ۙ±íž` +›T ¦° La$˜Â&U‚)l‚SØ ¦²IÑ` +› ÁÂQ–‹Gyk°ˆ”¥ÁBRRƒaR^ ”²%Ž’" RE%E؁”T`ˆ”—ƒ¤¤ä¤¥†II”’ •ò`°ë*¯vH…éoV8)ú›N¤¿YáDú›NŠþf}é/NB~)pRÔ7 œH}W¡¾Yन/XŠÔ*õ…J©ê –‚ú‚¥ ¾ÂRªø‚¥ ¾p)ˆ/\JU_¸Ô.%ÕW\ÊK}ƒKA|…¥¤ø +Ky‰o`)©½ÂRR{…¥¼´WXJj¯¸”ÔÞàR^Ò+.%¥W\JJ¯¸¤—Õ2\JÕ;¸ô.½ƒK©z—"½ ,µK©j',±KAìÀRªØA¦ vA¦œ)vÔ8)Z—5N¤uYãDZ—5NŠÖei]Ö8‘ÖQädI]Ö8‘Ô‰LI¥šò:Á)©sÐ)©sà)/ƒOْLIM©:š’:›’Rœò’:蔔:ð””:ø”"uà))uð)©uT^R¡’R—ÅN¤u;)R—ÅN$uYìDR—ÅNŠÔe¡I]; ­ËZ'Eì²Ö‰Än5b—µNŠØA¨HìT;•*v"TÐ:´B¥Š„ +b¢‚؁¨T±QAì@T;•*v *R;ÔB¥ª„ +r¡‚ÜA¨T¹ƒPA v *Uî@T;äDåSî@TªÜ¨ w *ȈJ•;É„ +‚¡RBŃPAñ Tªâ© x¥ôµÃÎr'Eò²Ü‰$/˝Hò²ÜI‘¼,w"ÉËr'’¼¬w²4/˝Hó€TRô T^ª§’²¨’²©ò’=¡*[B*©zP*Uõ TRõÀTRõÄ©¼DP%ER%ET¥ˆ¤JŠ¨JŠ¬ÊKõ€URõ²î‰T/ëžÙ£î‰T/ëžHõ²îIQ½¬Y"Õ˺'¡zYö¤¨^–=‘ê­&Bõ²ìIQ=`©¬ +ª«RUXÙVAö€Uªì« {Ð*È´J•=hdZكV©²­"Ù¬‚ê«TÕVAõ€UP=`•ªzÀ*¨´ +²­ReZكVAö U>eZ¥Ê´ +²­‚ìA«TكV‘ì« {À*Uö€U=`dX¥Ê¼ +²ç|Š¢„ìeå“"{YùD²—•O${Yù¤È^V>‘ìeåÉ^–>Y²—•O${ð*){+/ÙYIÙ³’ª´òR=¨•-y•%{V^²·±&Cö‚XYª'då-{bV–ìm)ђ½ Vªê ZYª'je©ž°•·ê‰[YªG T(Uõ(‚ìQÙ£J•=ʗ {”@‘ìQ¥ÊP½lB²G”*{âV=a+){-M‘=q+){âVRöœ[y‰ž¸•=+ˆàJ=ÀDpÑ\©¢¸"у[AõàVªêÁ­ zp+¨ÜJU=¸TpÕ¸REpÑ\AôW¾=+/Ѹ’¢àJjžÀ•—æ \AóÄ­¤æ‰[yiž¸•Ô5œ¥j8 š΂æÎRœEŠ͂â‰f©‚͂àA³ xÐ,Uð´ w´´Ô»,Rô.K£Hð²4Š/K£ÁËÒ(¼,"ÁËÚ(Kð²4Š %¢å%x0-)x@-)xP-/ÁkÙZRï ZªÞA´¤à´¤àÁ´¼¨%ª%¬¥ž¨–Ô;°–Ô;¸–—Þ¶¤Þeé]ÖH)z—5R$xY#E‚—5RŠâe}“• ?XP¼,‘R/K¤HñV¡xY"¥(`˞e•tŠ×R°ÅlAñ[ªâ¶ x-(dKU<ȲɃl©’Ù"ÉlAó[ªæ¶ y€-h`KÕ<ÀD²уl©¢قèA¶ z-Ÿ¢ÙRE²уlAô [ªìA¶Hö[=À–ª{€-è` ºØRuOl ºgáÊ­º—URŠîe•é^VI‘îe•”¢{Y%Eº—UR¤{Y&eé^VI‘îÁ¶¤î·¼t¼%u¾%uÀå¥{.lKêpKÕ=à–Ô=薥{Â[Þº'¾eéޖ"-ÝáRuO€Ë>.Kø¶<ë(Â'Æe åR>Ê¥Tá£\ +ÂG¹„r)Uø(u‚ðQ.EÂGµ”*|TKAø² Ÿª¥TÝã‚î⒲×ØÑÙ㒲'Æ%eOŒËKöĸ {@.ȐK•=A.¨ ªäRUÈEªã‚êÁ¸TՃqAõ`\P=—ªz0.¨ ªäRUO ¢ä‚è¹|Š^B.UõrAöˆ0Gö’q©ºçŒËô¸ Ÿ#.±+¿pâR¥Ï—Óý—¡}‰¸ ~‰¸TõKÊý3ÊEG !€«^JQÀ¬—"\õR$«^JÑ@£\6—®z)RÁ,˜²TpÕK‘ &å’:˜˜ËK]ÖP¤ËZ +uy/źl?·9V€Â\^+@a.kË·¾v¼BOÞ;Þ ]ֆW¨ËÚðŠu©Þ@]Ö~W¬Ëòò vy{ùD»dÈ´; u ›…Sª—Â)xùDóãä£pJuò©&`~Ùª›"eSª²)øø v¹ŠýMuòyq—TAX—ôò‰uyyù»¤—O°Kzù»¼¼|‚]r¿+Ú%W¢]^«?Ñ.¹ú풫?Ñ.U¡]¤ƒ » „ »T%LØ)tØ%Ž’C “v©bø ­Â¥C!„IºT%LÒ-LÒ1LÒåÏ6ýŸ&]þ¾aÓÿ¹HÌ?ùé¿ù‹ÿîøÿÄÿÚ¿ÿ›ûÇø÷_þÍÿþþQ–ÿöçð?ÿË¿û›÷³þýúøwÔy²DËâà,¼} ×´(ÿÛáÿïÿò~½y6ÛÏÿýó?ÿ¯Çø~>þ~þ_ÿ·íç¿ø«Ø.¼þÀoŦ?òó·Ÿ"®¾üᗍß~ûA{fûãO Y]$WÐgsK9ûíÑ̛ëΈbY㘶’rdèÿ‹[ü×~‹õÓwÌÒ_ćxýlÝ{[=­!Ôþ[ØîÙÐÇmѨÏZ#Š×ûySöÜîÞmþ¬Û6­·‡?‚?­1¬Ác¬/­ÜŸã/_΋L;â¿·8|6fæ´Ǿ™Uä·…zhâmñ»V²«yø˜-×q·r1wÿ³Ÿâ@µ÷ûõŒvö™Ïx¶Øáóç£—Îòœ2ë!ÏgÖêQÀò<#z°>¤‡›ÜG>¤G£ÝùŒçõ¨‘#–g|šæÏç)#’#r¿#D‰‡üUÙ«Ùt¾²Ù s÷|Èg7º_‘ß҇E(—‡4×µ5Ò6°çqäCÚߎøêCî›ÃòŒm>/ߪè!Íåb)ÂË3>ø™¯|ƶÇZŸ‡4&ë6–íó)‡µyyÊO U±‡ì¶Ã³8ð[ñn?yþy=«¬Ë£Àí„úééc +?´0Ïã–n;k¸ö8úþ=-òéÚ¢E‹);9ú7ÿ‡eôìáá?}ç}[»ýìn¶[D’î_™Ù£“N1 —íɞõó†/{U—ñ\û°ÿ~؎Ûïm èë<Â]wµ`֞¿ã¯õ¹×iøÓóïgéš)ì-Ìÿô©¬÷›ÇMøŸóˆç‹.ó8sz—™·ÂÊƉúìùÿºñwô™Ïö›­NÎì3;"0ï}¶[höq½úl·%†Å—¨Ïvû¢Ÿ[ Ïv[µj§=y·ðÆÙ®­²:Íb÷{¼:ÍF¬qd4lՏÐ×˾H4iaƒ·ÎÖítÒ"Ô§o~Þg,f!û,@§ÝçÍ%pîQ±~ŽÈ¿ï'6v¾3¯ÌÑïöOwø¦çš +I;€ºÍ#pû™Ö5õõ?×<¤çV³[¹ýñýæ}ñdBÒî¨ ^Y¸ä¸mÃhút¼£í¶Û#Lâùƒ¥2Ñ9…Hlªí3ãÌäòh:*öZî6:ö5DÜÙè´§ÛehtšÇØ[)f±öÒi‡ÓÈ-;Í¢)Žs¾:í4Òi‡Iq”éf‡î\:Í¢Î8·ó[9|¤ÓûÏþê4DóM§=Bé´ãÖ(æ¡¬N{uîQSØ;Íkòõ“Ns}î~k3;ÍüÜ3ΟýõúÜÿî4³3:Ä|x»í2+Ò§í1Ëõ-²P7!›·ùïHI´SlÈΕ*ю»o;ŽŒ´TÝ@-‹[öü¦ÏÆÍOn‹/x¾]/áék+ýð´j»[|Ø!+\|ØÄûÜÉ°EˆÜèæô|©¶÷õßãÚîµú˜—ÿm;Tè誺ÄW~þÈùÊv Ç¿v j±y&—/æ¸|ýqG}ﶯ1<ۖ‘Ýæuì¶³E›µÛ,^pÌçÞm‡¥Cðâ{Ño¶žízõ›­g,\~óõŒ•MQ¿Ùzæ~w›/gL~Ôm¾žñÔ±Ñm¶ž9<ùÎê6[Ï ¯ÐÝv¢­ê6_ÐøÉÃê6_Є³%ºÍW4χ¡n³ÏñP¹në6ÛSÝf%?}$ŸJ\Uº­YÐC$¡îQº²Û|…äeÀW·Ù +ÉVåt›¯ljV·}.¬s…ôÈýæK$OüýæK¤Ù^ý¶k¹I¿ùÉâÕo¶F¯^ûg¿¿ãºìßÿâŸþ›?þOÏÖîß?»»/_Âì±ú~ú§ÿ·ý—ÿå/ÿíßþ»ÿƒvþÁ?ÿãÿåoó¯~ÞÿáO¶áòíÖß>ÿ÷µÙúñVË7Z_žé®ET’%Àxäò0¥øò¬Ù÷,^æoæνv7×F~ǜüÑoïüɽ9Q;øîÏÒÇÿ‡ùE<õÅ1¯ N¾»+ì —oè›Ã-Ïì»»±õ÷lÆënÌ Пÿ/›Eÿà‘¬‘o?ýkÿG#ùõî^ø ³AÀnÞÍ9-ãn¾n¼drþ1Læýª?7GvÕ³NÔ]Xü ÷ì>0šƒ+š°çøá]ýš·{ûÑÿƒñ'ÜnLÇn¶t$aœ¶½{;žʌ©p¨åݜr_Հ{<£ƒ8ôÇ| íwf^¬ÞÁ׸µnSUÛ˟û ó¶ÓC–;&Œ^FÆg]'£Þ‘7õ¥™ç¦[ó¹jU=©kxܚE!ÜjÂ|vº5ÓzyØ*ÒßÒó;ª +óïÙ“…ÏëÒÛûçy‰žãÞ[?'kvP7OX´jþ°óÊ?æýpÛqõ®;¸-tʌŠ{qã#Ã#Ú5óyê!.[ÉÊhUÃ8WP«Us‡þªÎÁ;ö€0Ï +NFYœ +‹Ý~§S|lÊÖ³E ÷Q‹Ù-žž&~ï‘"êûîÍv²¯êsó,JÂxoùûXº…ù¼;·em7Æѳ¾0æszôS4`³Œ•9ðÑ<}Ý[°åa3tÄF¸m9f~û·:À̶D ³9JÃèSs'¶iLM4j^Úø}·žV³›)›Ñ£aßÝÍ7j¹¹ñç­Äǵ¶· c‰c»³ÑùSs5 =8‚sˆØ&ïßYÃèa+’“©4ô5ÅÎÓ4}“Ù+ßG»CÏð4qóýÂøÌûjÀ\ÞѬÅc1à6 lk´÷“¿Õhtž ã3GdÎôêqïø[ÏBdK ¡;—9RWÍÝÌ«õ¤lрÏè՞ôLS£–6!ÙòÛ¸¦ƒÇaíñmø&Ž/3_·Q_÷\m227[sĥπüî3@7o§V‹Æ÷͜w¼fÆù‹tëO-Üõ^ýX…ݏ…½·ÎµGNvçø= óšžM@¨ù^†»Ç÷†Ñ"otáy¥búN\ìÔ¸ê϶¬]ùmìþXc ÐU_l÷¾GD®Aì‚7º'N{70·`«b\œñ`ÓÄ嘴zèÁÌ|a=B]̖êàÏÆ(käƍ‘=/?Z¡Ù˜5f„_¾>¸Ùå÷mh`»9ߗMÖÞ1Óv}ùº}d+d7:Š±KHÜÌ çž¾Éz ±—‡m«Õ«Ã¿³ùañÇp¹F¤ +³‚ßdîïÐrz‘3,À2ل͒Eª³P-3û¯ôbŸé›Ìwçû«Ù£Ï\À§Œ÷‘ÃÍÖ¬´ÿ²oÿ#­ŽÕê˜-ˆR…Þ¹–óÎv9lä2v„î¸qç³uo¨7ð˜/&™3æYÛ%yí‹Fï­5ô|ëù{$*ã¾ÍÊqè[‚÷Þëiµó!˜¹£Q>“‡ÑÃÐՇ®†flSe§Ì4° >p™ù¦›©g~µ®e(û)¿.¼ø[Ïi=˜¥1<¶óе߇­÷Âè4½=í ´ãL³žÁw]Æ{.c|!WwùnÛÉێm;ßw`󷥋ŒRcl$Þ][f?ŸfÔîŽZÆ&X_þJ*zÁæ‡0N-¢.[¥­l·à»ƒøœl—¿q[,í÷Y.ŒŸ_e8ghŸ/Äw÷ü¥-”×Öpu¼äýªß»·TO;¢_løÊ$5¿„.ñ^Ž"\“?edIŸiI}í£[ÆóÆh£00©©[C5 ûڐ’ó>dÜÆÔûßç8ò×~:'‰ñÑØge¥û?zÍh…- ÝÚ6Þõ¹Ýº´óD¨ˆ]·ë:߶ÆÏmkwܘ}£ýtü/~qÚú±5†É¦amgRǝc-¾+Ãìç®.yua´ã„Û:†>,Ò;ý²Å,w>3ÇhtÀÞ1n{ãPœóZ£Ïg0Ôç™ +}±ó~þkn¹ìºé™Í&·ï­G£{©ÆßßÔ{,ãçZ§<Æçžóë9薖^üSÿ4~î“ùTåʺ1™Oπ«+íÛ cð¿~§=>33n·t3?·%DñõõvÚÀ-m»î`·L¹ƒe•døÜÆ£ú¼ûM«Ï³¾€0:ƒ¡eJLœŸÝ“I:G‹sm|.0YêYbsÏî¶ø½±©UòÃæIaõ…qŸ¹¾b[«4[~20·ØIÿØxl±ûTwoG6wýaGÌæÑ3Hh°…ÜØißLµ³½h@9ôÊo-ö‘KØçê\ÿ˜y\LÆ{Ê8{êîa”1ãÁqñ箪:á»xöAÏjŒ½ìŒ ’­€-ï4¯qg½Ü#]±:‡ïËÖËéó&Ò<²åX)4KœÄúÅ–ñd–]íÎóš7ŒTIO‰––Ï2þJ§ÖÄQâf}kÉlKþüď‹ÝÁ•ßB¾ÝvÄXÓw›€å&5ݾ§Œ ÷¤G‹ósfó3ÊØú^:PƁìn¶qˆDò¯§zŒ›å=ÁÏâQ^f4ÇÿFGåøÞîâ=ñ Ìx®]›—}ñ=×òQtEnöЇXízÛÛTL]”µ9~ImŸ±ÉŸwqxÆK6“7þOœ6ÏZÆ-œÇó,È{â¿2sn½ØLQ«ÕðtÏ8·¾¤p~ŒYvˆ¾3÷v‡r¥_óÖæý±é[½-?«-³ÏU—…at ,úeî4k‰Dø”[çfK<Ãs<¬ÇX–Ê‹7®Èý¿OÖc>Ø¡ùž!Z=ã 9Ìáò}lƒ÷5ÆõssÁ}ÕϟÅ÷ÍÆ̌×Ákè¾&2ãyàB»mù (HBÃ+<0cõa\«wÐrúV£ñûÞÑ[¾„­¬¡|ŸknÌj̅'¶²!Í=š™Y.kqÿMf÷;¬a—æ?Xñ§Û1Û@äFqçÎQ7…?ôÓˁÿ½Où·4_?ðh·ÜüãΆýºq°˜ù¢ƒ<¶WÆ#_<žæxµÿµ¶$[»‘6[zý†9§>ß'È8QfÏBößêìGi–FÜ|Ä2ûû°³¢þIÑëÿò#ÆòÇõ:`üO;ºÕÂB_çÿÙ§Ã°aKÌòd<½ólMG¨ø2{™ýëíÝ%*~ÿ½¥üt7n׶EjØIdŸáÛ=^ý±ß΃Ïí‘Øþh‡ O§ÙÒŎGkæZ· Dæ‹ù͌ýaþÁaþ$›Éíl0ÝÖÃ%øw~©9£­hƒ™}¦zl{P¸# Ïù¥–+¡ ™/Ë”f*Ôó*?9»çñ±}ÀÓ¢9š­~µ­ÇÝï×ÚÒÁ˜kwÛÆ=‹ªxzø"Å6:‘ÇÈCJ˜Ùê=Ì'¼ØOƒæö¸Ý¸Åªâ]d_‚ÍÎG×½³uú== ãYG ,hˏzŸ‘þ,ТϷ3ò¹úÓ¸ Ê{ý™Ÿ}Ûêw4¢+m…e9yý†b¡üom±>ßÜûûµÂ÷wæ!jfÜcÙ7ÜYx?’û‡Ÿâ1£JFø»¿‰Í¸0 Kp£Aø=u†nt8$:Ïf®[·ÕÔñß=Ö_{Oýé3ißÞ »½ÃšMñ»žî°-Yý8ʸìgTÅ­}öØWýÜÖáñó¾Çx|ؗèÃö>îó‘¶Y +-–Eìž_ž…ÒŒ,~©xŒóøÅáH¿UO¡ôU¿ßã=Z¾KI½¸™׍y«ß=ëŸ<Þ †¶ õ°µžû¯é>_n [†‡Lׯèrëžø̏È'l7§7ñëÛ÷­“-=}ºûtø¶Å–$><·[Åan‡­¢³‚Û÷ˆ0ÏÆ#’ùÏ·glzÿm³…›g˜ƒÝÑ3ž±w¶4ï§1ÏV3ÃÖ°î’ø*‹Û²ã„˜ ~Ô1÷g±Ï2cä׸ÇA¸O'%ZÝì§Dq}Ã·ç—^±®澟æš3ã4Îƍwàúqí®rÿŸ~¸~O:öa\kþËk†Ê8@bÆ{7>S~\깂]ìG¾,îÓêHÜ!§†'ÙâYÄØiù7~–ǼGcÿB<«‘[Ô3r¡ò ÷ûëOõÏßé<¿1n{¼;ƒ·ûó;Í­?¨“g~©;1ÌèYŽ¥.¾ÿÕ;å_ï3@ï(³`Ɗ韇wÊ~ŠGõ¨Ýa'@žº5:Å}óÃöÔNÞÄmùÿ1š»Bݧ|¯ÞS—[ÿè±þ<"ëÏàGÃvÔ¯ªkçxþ…QZhZ6~§³¾ê÷Vt*úÅ©«xÖíûî-G›E֐føaœnø³º(ñŸÝ¨'Lß¿ºFxžïõOjU`eüìÒLzϝ×nö… +×úšå‘ÄýÚõôgT½ +s§]Û"xËõÑÂoãÞ=͓_(€-žÓC–ü9‡í¬GtåÆðÿ=»î=¶ Ã*~Jë½ç'ÍV›Õœç6wzúp±°UԌÃ∼†Ün³âÓ©ÂVÍ́FþüÞ1…ýÛ?ˀµÊ'^aÒÔۑTïõqF³Ok¾³±q4U$Ѧ5­*7=!e––¡{å«Çl¾2óRÄ·8|e¸™ØY¾Z/#öŸG~Ùޏ!рՁ辄µ)ÜOGžÕ‚yMù”>@EÛyùØH¶£ŒX^ñ-EF­Ï,qÈpå¶';}½Òö-ªÍx«ž÷¯ +3ŸNj…£}m–IÁ¿;wÏüA nOàáÝx7_#nýˆ¢Oíþ¢kvÓ67zзóö5×>âÎã¦-ÝÓª æVÃf^Žî> +õ=ÂÍá_¡§úL<…%– Ϙ«¯_ì·^otØc´ª=ÛO`[›¿ÖLçøªßA»ùPG‹¯wF=†?H&õŸáep²«Œ©›•¡³¡è“?ŸÕè‹A?ƒ¶L Ùzl\µ»yFå3ëÜ+²£ó\…£û`ü6—ïHuâ{Yٖý’Þøq¡e‘åílªûËñä&¶¿3‡Ü°ÚŠ¾È²@e¯FjfO•àÛÔi:|éTfñ§ÑÃ\Tî?Õ,`ÿÝHëH>÷U½ëÑrnöÃÏx¾dôV=‘Ü_ë¥yœ_ëµ$cÙÝkFÏfWnqëÑ3—׌97ªšC‰Ñh#Ì7•v­ß˜=®2í{/Úyw¢ïxm&ó¸ÛñDϞ­µ¼i<­½cqšîÊ –xcGØ0?'vˆõ³/׆9©ækí½Çôç/ܙa_*ï#r¹¹ù²¸‘¸ÖCbpœ=Zõs0¿[CÞZëî:Sñkûër›€[˜<µ×ôí߁ûHÜÌýKegŽüÕî­Å^å»1ûk¬;¬1/ôðü×+JüMÏÑfþÜèL»ýÃçlÖlL›ß ß~¸|7´þðÓï Ã Ø îóß} +ß~ú¯æ‡Ÿ×ï|Š?ülôÿ°cï%üðu}¾ØÿÈøn¸üµ®õä¹~¯î½]Læt÷*«š*´c´³´)×þ©¿C)¡k=ŽÙWcš00ýþtõýԆïâ»ið‡æïM®?œˆ8eÿÎôþÃ¥À ?\`üp1ò;˖M!¿7Ýüpbú~ûú»óݏgÆ#Êdx«ž"Œíä_‡—fÒ&j!oÕ½`k˜ýÀ?ð|x€ä£ëÌ׏g„¯ÿ…<»lÉßÛ·+Šn¾dŽ³ÌjÙ÷œAõ«ï-g°#ÿ(á‘Ý©gËhr].—Ï·`o´ô´‡]4~Ä3«ÇòX>EËç#e7ÚfÞ¢Ÿ?Ænu†bØ]NwêíÚ·¿oýŽÜB_?žè}ãAûæ#Àœ@gLrÏóDëYã{½ºoL0†¾µÈþ¾ÖӅ¨û. x‡˜F }¯-b¶ÜìØ«›ãÜ3üá¤6£ ¡0^ýڋñW5ðã÷׎»ßµêÇBqöi"ÑÚÉí{«üLÇ¥k™ý̓¼åÎûRgP:ïk{¤ô %²"noc$Œüõ§Ok¿Â©hDšºàòìY2º«bi`ÛöÏk-Þ.¯d÷£7îƽŞ_1/nv¼ÆÍ=Žvêܱ¥GÕK\Œ†›µA}_yæj£GÄ奍7@g¯+÷ˆ4ò&]<øõp#œáˆe>:¼‡Ù«)‡q›ÑÀ!W¯O:ǜËö«Ž«W>†‡»mhÚ+Fۜw~¿Ì×:¾ð-#¾ÃÑqã3Ö{xÁ¼ÿneRY½îs©];;NqOö³®¤û/½ÿ¾F°¥- ÷Î]¼2Q·væb°Ýá Û×Û6#ì9mñk;Jß¿»Ò™Øßµ]öšøy1!cf<iÛy Ù®ëB¯TôŽpÞÆ2øXŠ,ãKnó‘Z¶Äiׇ>›hO×þ!‚ÞÚþ!‚Åh¯rΣ%m?ï8#ð;Œ±¤õxÄAŽù%¯³£=bÈß×î¹w_}ð2zqÀ,oqyª¿8Y°?Õ»6n k¥q3ÇN.¾ sžßœ¥eö¬Xï?vÄ1LŸ‰÷(Æh Å*î}­O[êYgÎÞÆë—üŠŠµ[)½\ ÷‡GÓù±j»Îq“ +ï=àž0óÂG¾¯±6Œ#­a¡fÓvFl[8Ù¼¼îÕj?ùär\¬hípu·¼ÛËø«Î\õêµÏ›#ŸãâĦÏ2‘¼Ì¾ö ã6ãÌìÈQ`J·%#wàµ(?¯½£¿|S¾5¯è-þÔW5à숛Ã{;Ý«~œÌv¾¢#[üý-rQ¿®Ü¢8‰Û¶ø8‹mÿEyÚÞ榈7ö6tv‹Ü¸Ï3^¡Œt ¼÷µçû•zj„ù5—‘ÇGŽjÆ­Çi¯:q´½?¸\»E„·éžçH±Aõ?dà1èf,9ܱ$nÔن÷˜P̸ŸW1Ҁ;?¯s˜;2¿Mž +4LÐÁˆcúǤÓTË9À.´»EbósÌ6nÎûãÚ®dï>Öø2ò¾žäçµ{Ø»§#8û0y½ÌM h{Wáƒ?Ov¸ñhÞOçe}x=¤–’æ …)F;üÞZì™_f¯BÆqúŽÁ‚”Õ‰®+ £­„ùº¦ùäÝü±?‚Çï¸QNµjlqvÄã.3«)p‘<=‹O~Ÿ‡ïì,ÓíóqOŸgÎ-"cރx +ø0:û9àgùÂÕ¨")0-œSâ¶8á*סͬòi²_䟯æ[£Ói­ˆø8ÂF×1{­wÅtDp†yΛ?åK7½góĬùû4»é³QYúó“áæá_ÕÀ5ü¬Ý†f>iH™0·óÓxÅYu>¾ÌZI†Ñë×ùGÄ,o+ýS‡&®çQ·ÙnpDTLV£±G2:6ÙÌì¹%µ’Ž[.¼fÐÕ¯Ï׏w]ëÇ^al!ŸS@bª×Z´ÂóI†ÑÃH—‘Iß}Zïk«ñPàU1Þ¿(eç§ÙOôe¼â-]K«qk½ÜÁÅíæp£æ!Åd…íŽGÙøùuø–êuå±7Ö¤dÂE}h˜x\ø¯ +óe¿+¹ál…äa„Þ~8úŗ®Û ­åxË6¾}”áéÙo½Êü¡(ç©.réýQ/Ç)á{ %±:ãåߑÆàKìÛۡۙ¡OÏöPʲý*¯ätïr½Ò˜:<;¢¬¶œ#L¡q³(øÊ* JùÍ÷Ò6uÑ®{*Æ3")ÙKbÞ3¾e3æpSŒÛe'q[Î4)Öc…Ã9³âúzÇzãiÓ³à…’êm,‡Õ1û§›È’N™ç7ш×b²®£ K$‹P[xöïÖ]üQVÝÞMdéŠu­\Àvˆ8ñ½±ñ½ÌmÇOåynÝæy§âV}}°Œô«<Öïk5ÚöÞO㝤—™MºµzøÀ²¯ãÜ>½ªMžîßÍ, 7K܏¥ÈO£K `N‚=m™Ú6{îø.>|ˆvÆÓ~þÇêH²ž§¿÷ß°²Ýúh,Ùɉñš¼ÞgÒŠ‘ÏÆCóß×nQƒ<æ•+݈¯ˆí¦eö9c,[œbÏVçDoö“£+Cy)¾Ö©8º{±(¬ýÜ?Œ§—/X#t™ãhЍ{—8Äú]~Õq°EékË®}™9´¨Õ‘Z~æWnù,ãng»ó‹öDh«œæ¹ÎµâðôȺ±8Tǘޱ=$¥\»˃¡Ð„e<ãÿÔ2³‰yG:í¼Ú–O¢LýÒ¦®½zøÒÌ8'sŒÆ^Fwàæ È|)S„?ÖÝ£»næÞ/~Ž²|« [#ÖæTQåµ²ª¿3–½6+\Û^Œé Œ/ª^{D~¼˜Ð5Iãþh`™%_n£³"20Ü~“IÚÇ|†=^tá³àâoyZX ^'ïÐ+‘Ä +sù +Îë$ð:½ô³Ç¬¨Pø3¤Ànsõ`ß´ìM·}s'Æ.í·½ŒøXçqÜïk˧áI÷£>#…[x]„[›s?1üƒÄðêc~i°EkZŒ—‡‚}ºo-qܾó|ùÏ8Ó¢¼Y„Ì¥)÷h'óÐô¬9×m3õøóÓìÑ­aì=¶Õ6iO|òc6—çXÐõV£Xëh[ íF-ë—ÿcÞAøÿëµ;QGúÊ펰>P̗²‹T¯¾íø>žÅچßȍ¿êäX‹™z­Íïϕ<‚Qóðs^S᫜ww| úy¦ÿRŠ‘«ÝÒ2š!’”½ÍkcgNà8ð9õf&# ‡½¶.m fçÕ?ŒòZà„/æM¡Í=RŠÄ*ï¸9òNv£ëtžâŒ›-+àgÄÄÇðóÀ#çg÷7ö¾Vž.3ږ^Æ80p㾯Õ÷}jZóðѸ[…÷ÆGÏzV•eä-Üçq\kÄLn‘®q £äŠù *öKxÒs +õ3Ä0÷>ŠW¼gf|_{pÂgªl΀»9¢—–9ŒKªY¿Œ'!o³—Çü"Hæ–ë`ï +ä»8¡ÃÈãz ò÷µwd^ +£g0ˆ ‘p¬Z¾Ìã`÷x§«Ê|Ž»vzŽåÅv—`5QyãÓìóE·Ž[ÎKkÆ_šq ‚‘è[¿>®5ÛÉóÜ/n”çc¾°cÿ¼öÀÃî±Ã#³Œæú¹öõ0[èP'ÐË3 +„Òjéè%Ã1+# h/ø¾vʑmbãH§Éù$ãÇ#¼¯=Ú¦k{G,›Ÿñûb¦ÏÈïŠèkãOãyô±Ì·—]ۈ0©êĵo g¯sÆ ÚûZ¦‹F­VÉÛhükԗ™8„5 +áK2ޓÇ:-Öà°.híø¸ÛÒ¯Ë8×ÁÁ²V¯óèÊã¸e´i¬ùžé¶}\;"»fÜcs{Ù¡ó\z´ªS`c“äZµ è¶i“îl_#nǍèõX§(*_0èm]ÆV¤SZn Þ¬%ñ¿‘ÎçcÛcÉeÇmùŒX3ÙJ oÜ+;?ëºÛli73ve½ró¾¤w„Ca*ŒOWD^íîpÉ@‡fܪºÅ´mƒ³:ÍہïÛȬýf½Ö&2œ ¸×‹q†›5H³§Ø¹V$–=+«dÛ­Ç+Ü2 l”øŽzmÄ[œØ²`ºt^kê«!ŠmôdcZ ŠI£Î Ûe9 oñÕk''Ñv#ÆöËX¡š'Û2Gì„èå¿%NW1æRp?®k-¥œŸgøÐ:ˆ†9Ïë(Æ\G5ÎàʵôlË áeôœ±ŸoÁê"íÄóôqèëÂSó2î9_f=R¿†MÇd¸“_â:R³…\¼›z­'ûÒוŠeÜ∟…Ü2GjD7ÎèCs›oíüÎè¹Ch`™7^ ƒâ,ûÊå¥âÂÆÏ7•+÷H îBÅ8,£§ŒÏ¥p5{e»/uon{º«³_½Ã_Š1݅Û>>®µH捁±¥ñcWÉvsFö¡˜*ïô”͸OMÁ'CY0Ù13ÖÈN|…{Ìà ½ƒu6³âÉx\‹ÈŒ8|\F>0O3þ¾v¶znø“Œ+Úbq©£¶¯ú½ôÈ&ª‘aMëîu„·oT`Ì8‰ÁTY®õ$åntgõËh{Ø##=–yDڊÐé»i¦Dæ¿rµ5ånõ¡ûð~ÓwãùVb +ŏ™!ov>͗_þ1ñáaîycF­Lœ’Ò‡®óý°®°Œ;2Û ]1-ß–â:}i댃ÃÒã¹ÎÜÞúcgï5Ïa<‹‘è<·ùqí•ËÃ+6ŸÆëìk +[fŽ~¼¦ô.lj»å~øx9暠sü¬î7Ì×ÐjgOósÿθçºïÎz˓¦z퉻߾¼&çÙüÃÏÒ8Üðdûm3ŽÐ‰Ò£[²úÝ#سý£þ§G,ŸËÿøïµl9ŠbÔã,À£S‰x—ùۇùˆpŽoüŽ9ùãŸ)¾NÈculG`×c"bpÝ§Î1Ðʝ]ºÌIö8ˆ¼ð0²0ú„~Ö2òý‘j@»»®öò”ÑŸJEëþ†=¶õiéâÚXUlçñLnôhÙ¯Þ@¶0;ù×øFbQ`ºäþ’-rA=æQ:Ü®-Öß#Z@ÓÕæEßè`Õ9§ãÔÍúºä›ÌÏÝöWï<ËÔ_¶}¨{– ã¡MÎÉS£Ý=b²Ô _>Fù™QІ#ì¼â¸$¸z¾àk×µžDJ Œ¸N>õû#£J.üCn\àõ ÜØ"ÿ‚×ej{6Àœ&-ü&³¼­ÖãÀ¼ò ýI3ÌxÅzȍž>ÚµT\·nÌ]ÃÑÀŒªÏóÂ8¹±õ`W”^ˆ!ã™ÒcO/†¹M·htDmèð†Eàà4õ 7ܔ¦ÿ}:Îî{äï=细lã÷÷ŒßßJèFO™Fó{GtÇþ–'Tu£'oõk1:–¿ö ÿ–¦Q-_A›R±Û r̳ ó٠΍Ìè^ÓøcLÊf¾‚j²ûµ€ÚÕ¾òT +†0*‘„}cw@Ižl¶Ñ@¿5’îz¨”Dˆ™=ƒXˆGøíÍhHՄ'Qsã}|åû‘ÍÞï¿Íî‘øsuZ”@×lcÑd7@æ3?“nwkãÖ-̍ÜâÈ®ôd?z“Ïk§¼ˆÖâÓ½íôòš<ØO«Š 2Þ¼ˆ;<;q·ÑoÆ~môx,‡Ý8:߇`fVλ6҄8¼9t©âôÍx^hǜ0‚÷ +k±¯M£Æ€Ìv|׀Î38M¦¿Åøtâ<ÁŒ³qb›bÛKoGž.—¦IČ'Ÿîˆ¥³®Ôø8  ¢œ b¯ÞéØ4:aw]0bµû’‰Ç(OŸÏbܔ×eTä(š1Ô£Õ©Q4‹NF‘ 7ÊÅãzÞÙÀ5Ïε1¸»F냲+ý°:ú5œšve ¨ÅŸJǓÞ*VÍnŠ4ö=mK»g_¿>&A;:\5ã\ߋ´Ï’¦D€5÷ ´¨ OC8½Åð½8_ð]ÛÁLÊïd,cÛÏ°C6yéìÂóÔì{œ–«Ùü½œ.eöéuõ[˜ÛÁ7o‡_œýWÞ±ä鍨?uè”ɬýàüðɌ^Fä³ -Ò8ŠFvð2ù`Â#¸yF¾ü¶#ÆÀŒçöš¿h€3 ۺ̡QtÆ [,Â×élNz&ö•ÞnÏ øª·Û²Ì÷žXeyä)ïfgy”]{YÝrƗgTv£ IÔµwRF×äçÝ/€L2 ŵŠ³ò®‰…_¿ñ’ùŸš=ºï&™ÕT“Âͱf›ôumÏwÁîfœ9Ïxäíº“1†Â¥nìV¢[×*Ìͦyu§o{d\7F²¢Ý¾ +›!¿ô G3÷ƒž‰3®©]±ÓÞè‘èz7FÎÍW\;ˆ÷÷6Œûèi¼¯l` qO·þMfy&µ ›N3èÄ0Þ;¯ÜcÙhÖ+½_͈#èh Îý/AìíÙF6p7tâÒÚÂ2`MF?ùâ‰Î<Ñ¢ŒWc.ßí¤Ðt3îíæ¶bNé <û(èg6pžS]À2·Ï@,ÝØõÃÀú{¨ÆP˜¯¦Pœ-ΝÍH¸èM(¨?uðÝå™4³W˜v#Ün³¯)Ö¢k͸–<d ¹¸¸•nò.“Ö#CrND€ +*…5'LGÔ¿Él9B¹­F ž3)n+$q¸+Z6ã‰f¯Ü2vÝ|?è>‹ŒØ~›Ë¥‘¼¥½Àmòw®à¡l´Þ1ÜǙ¾¥;bli`ilÞü¥L£-ŇҘÅÓ+»›E1˜Y»~kàâéO-n¼l¹4v0ÊKÉ1xe˜õ’»2ç$_ÝÒÀØd/ãú ó1)-Wéf™RÎ^{!Œ›¾˜¾V¢C¡ë; +£—¶¡=ƸI~iš³Î\àžéõ7nw3G¬Ÿ{.Çó5ÜE¥É3æ3¿£[}sGiöõvdìg>m«9Ã9pc'žÀçÖeä‹ÓHŠzî‰îH‚ùœŽˆé²kµÓ²lÓùÅuÌ¼öâ*36çÎÌïaÞÐßs…qËåߜ%¼a$ŽM¬ý~2¥DrB7îùáE¶ 7º×V/!Ý|±89F;É)Ù¯£jwÝ扊on2zxåFÑ3Š“ñàJO\AäG´ïæÐ¥¸{”\øâ)-½Îʚ%â÷-ÎëicZ¯‹åVþ¢¹E©{ý¥–¿×‘iÙ'L#­0*`݌b.½Q%Ӏ¢\«ûÅä|¥(Œ¸ƒü Ïõ{GI_+×i»0ÖÙ,}ãr)Ü€XÒ¦†C¡óäÆãÌ©MïÜ¢p>³›™HÕö‰X瘝éF¾£…NúªÕ‰;XAÿnÌՁ h6Áu„Z#g€™·µ#ÖË/7G”±Õ§C2+ä=B+ÂHfòù9øý“ˆ’u¸1gaŸõ—ä¹ôžË]ÜÃ7¬¹Ì$ýqóšsófG®óK.·CþØL2tFÕr½šØªÌåT²Ùh`>_Ð e¡}ûœÅ0n6c$ŒÁ͚ÔÌ÷Þs +S[~ĉftæ.nLؔåašZgR‘Uf¦W24Ë!ÛM4˶Õ5š²Y­9)ú/Lžs|ßx0!^Æg31ì‘f̓‹ï¹Û`9hf>OùŸÌ„».·¶fd ¢Å3?Ÿé P¿>Ójºèå@ãÜø +r%äf­Oº²Ï†qçûnÊy¾¹¦W1 hàˆ´mk!ðÅ³Ì è;ÆFNÁz–¶q33|²]yã ñC +{zÔ¨D'š‘#aS}½î8ð2ãÞðdðq¹5=xù®×¥=¢µÂ¸­ýK×bÔÌç>4ÞwegÙî\N¿Œk»œk&3ûÞY«4]w”ōô^ïÄj`Š]šs%)–+½·œ8&ö™®$Ú̾ºÏ¿õMÖ22l¶³oPrmĚÙ5«"ÃÖ#.)ZUú0.•pšñØRMˆjƳÕY†¼Z» +€ßzJÉB Œw͎õƒáh`D ¹œ)¡`oX?Sn¾yOI¥+å³øh–µ·­&ûctvüñŽ¶Þée¯a’>ߞ£–gp}8µú´÷Åkd2ôÛU˜ÄòjM^o ?“ÇÛ¥F8àWz¹îh·'a·“:òì SÙSé$ڌ4p7+Ä |ÚÃɨ¥EfûŠ\©A‘g!%+ô4À2µg§¶ç‰@WñÑ`•Ž»#< Ïì¹Ò.½xäyÝB Žò×X ØÞ21VG¼å÷én•GŒ֗ëÖ7™9ž\©=lúŠH@Ú¼š¤´+=÷þç&‡±ˆA»ÇÇs+k§®:MnQíŒÃÉk[<â~~PÕÀ$µÁÁ­¼»Ÿø=ù nBýQSÏbéäd­QxÄ3çԞñŽGÄ𾇛!¯¹¶L\ÀšM§b‰%#'{fT¤ÞkRô蹹͔yÇvðušy-8YÂ8‰w³¾=¶l€!ØîEìµÆ§y0#üÞφjŠœygž?õú¬* "­E·ŸÑ\ù4šê=º±«|¨"ÙYêàÂ[)$áÀóJ¶Õ€W ÖûžDÞ=s‰üþY¬p-³Gd­‚Ó˜å¸ê× T{E ùú¶h §Û£…?)R!².é$Íó¸‘50ãçîìD1Èj™t`#ã>™èuvæ‰.Š“pf“ÄXt"ϼº‰Fuæ~¸­<Ý|g:Õœÿ3]kZî°á­ñ‡çdÝáIÝÞXÎ.3­uÀ½Ä«þœøg/©[*,ñ3šûz6£ô&ßd]«ô›Y©+Q³¯|ª;ÿVʸ¹ӘÁ¬=ònçß +‡ò=2ò{ £T³k¶ƼéÝ¥&÷˜§õ淌dÝy-ž>†vç}3/LÖM–õ~ÿL\c,4돐e赑š2Llù$·ƒXVAkö¼wޘ +ø“Ý+þ˜¤==öUa¼Ûšð.ÙðôuZáÍæà:˃­ÉÙ3ð`j­ò,¾ßiœÜ×,Ë4Åxtøृ¯ÏÐÈxØú{§ b  ÕJe3µ°³²FÓÅ{²ƒ±l”9èt8y'Y$¬þ’¢P¸%{gÈ@èY$~.ŸÛâ,>u¿×”=»M½‘Ai‹8÷‘þŒo\!v,ݬ屓Æn‹­žD¦—}Ëä+ßð¾e³{es4Ú-#rˆ[»׃—Šãh,§tÜîÉÈÛ5ÖkŒß·ô ­7¶·²Äqokñ«Õ!³/WyO$}oÁK<"˜ßòF®œC;Ûv»6_Yæ–kyÐÜãå…ÑS©Æ½â&‰R©¹æõÇ_ßøÞâ„`äƂaïkŸÁ»——W,–÷HÇ'º~í}~¸ ìږ)2¦¨Ê²¹ŒÑÀ^œ© +h‰”ò82ûIžÎ½á›kXê´\½þžÇî”Fžz‹ÔÖó÷gËßϓ¤+’QÇcŽ¹nà´"2˜NFÁžu ÉqÑv6d6Ïò¼ÙÆDëNùo2_7JíõP1ÛÃÃ¥&t†]uäٚíã/–kÓ-ZŽz&öUÖâdÚIj *Ö:jNj¼½gpûóû,«ýíÁôç>˼¥Õ !úž€vËIjƒçl37:c®gÚә€lûéHŽMÏØÊRl#Þ¼@Ô6®¥ñ$d~GùV24ÅIÕÜ-2+{.ZÞÀ¥tі̶өwzÏÌÜÖÌsÐz…ó:óx–oÞߞ«dOœ;>5þ,‡'¤Û°gÕgÑ£p7 l—÷½Ê\óJê2æCˆxÏ\[0Œ+»‹óÊ}ª¶ÛŠ +)?P˜#¾ÈïjàÓd«btûÁ›Ý9`p³gúå ¬¹ÿö¬(öV¡“,[çJ‘êÕ.2,AÉ¡ö«¬ <(!°„½yz?NrÔµÆΚíÃî¥ËÙ"Õ<-ù̌ <}æé`de¦Ž)*g³»LÓS¹A $_>û~œ¯Ygy@-{CËӐÙɨ°·œâ”‚i¿‹KìJ—˜50‡:’òk£Uò¯ÞTe3c–¢ò”ÝËË4`áï1?¥ü.^pí¼ƒ ßU»ù=ÞÆ pcã˜ßzã÷:ÅÕéáÙ#ÒéÂ¸cé,Fx¶9;€ýƒóJ@kë@ýªe€<ǕYmý[}/ªŒÆ$Rbù¡÷YΣ3'îÁWÐÖ¯ûI¼Ë–S©¹þ2™ Ó^q?Üg~.G®Í÷º‚t +îk+kª(÷æFrc-÷ŽaÞ3Ï¢ñÜÙ¥½¦ ¶ág$Ð6hu….ë€Ú7Ïå~š]S¤ô·T·™sjIæÉ_‰þ^œ­ÑçãKQրŒqq)[çÑòÈYáãÑ@KÖIwûMæyv¬ÛÛÎ÷­ô^‡“È%tª¡™82÷'}“yCwœ¤9C’E™qœCgFï©Ü=ö ZKåpÐeAužÇ÷‚L"ӏÃæpXÊce·Û€6ÆÈ\®{îã3׳ §SM!¶ž(¼C“xô2  ÔWæö(ݘ,†ßª¢® Uh€ø˜+Jét*te +»ƒ ÈnŽ>VÀ八æXI ®p.Ëx·¼pÎõû¤IüðB£ã"êN~ߖçîWñy…M¢ÛIìçå¹ !wï#N1i<7_˜Ë[̘pÿ6^w¹c øcŠ«0#|ٕè¿iŠ^¤’]Hú¹Œ·÷Ôã“ñFºӈ‹‘«~m2‚”H!aA\»ç=q®&95Q)·®5ÛÞ71€s å7¸§ÇÌõ÷ÜË«%/± +¶ZÒė‘ÑíIý/:k­™FNÂW*eˆ9y²bëlƵäñd»Œ ÛjcT,빶ŸwTWÓ˝¬CZ +‡ͱ)ýpî¹tÕòÿ  ã5é[bd5xMp)øøî£esíµ{¦•Î(Ûi^蟗œø–[U¾Æl·Åh‰×s”½.@ÆAئ_›_gkVþ2{W³y4 ŸAÂà°ÀM~å1œ¹AtVsFÍ·/#ò*Ä{óÀ¯“1Ö[ópp’ÍWêѳ-#NÎ̋c'¤ +:3§°¥”ÔÂù 1pžƒµgr׃7 +’ÆS”¤Àƒd¸7‡´–W§ÑlúÎìLù¢OU_Øz4¬ôìœzã9ó`dë¹´j–l=Q€“£H;•ÏœµKÖ=ˆ`—ùPÑ 7hÜÀ±‚ ž õ¬ƒ@¼\Íç–ßdVòH^á_ªÜè7«}Á&8;Œyæd1Zԝ± +úâAë»!‹év&¤v®ŽíŒ-xüžLÜGºqÆ`U=:Isó@À̝ œso{fH<³zÏc¼oR {6. ŒÄ™G„xC@|z[ˍÁAÑ@˽Éœ¾¼Þ lgŽ.tÎcŒõ~žû»­Z´2oÑ£Þ¬‹J?P{3®‰E£#¢âøîö 5»Kjy­,JTÉ˼# Ëü |É7ωœ›ñMæSäõA€Eã/>#=BÏóV+ŠqÏ­l&È5#!6§ï¤Ö¼MÆv†Ì[õÉç¡êCÃÝE~‚áÚ×yä3óäãhoÖwÆì.c6ûuÅ¡+4*¢ÛñàæØô {…5œ±õ,èþâ›Q*º¿è »1_áEø›·{Ñ®Š÷6ÃtFœgïƒ ?s CÙVblÅç²Êù0Ö Œ<º=WyNÏŪVLJ¤çjÖ]eî8Êg&ˆlŜ&'pgð{xx;_“kUòãL®´ PçrR˜ù–wÕ,°q$"hþ©Fã(ï`±­Æ[é0â\tґ‘¿çÂu,áõ“îh ËÂÛµ;Ä…3£½ÇžIJÎL•í֓j¾\ªfœqêöÅ©»™e"´Ö7#ôå«ï~Â6ˆ95æw’§T•+Œæð($–çƒ'=N<рbdsï…2+A°e5˜i¥A*͸чžÖ+ŒÀ½gÖ4°o)qƒn¶5 ÈêÞ(4+goVNãCq¨žìa2´Ù7£"ʎ^X‹¨ kó\œÍZÒ ¢CŽ Ù¿FRTG ¿F®p Ì8(ÿ¡E”70RL™»É/ïç˜UhÇÌÊÑñ·‹ûUº¨Ï›EmXP[Jqs³–1–fDåz{9 ,5Žb·Ž‚Yœ3OÅÎت~ñÜ:8¦\±›æeIåÌԍ.´A={[ˆT';Ðʵt®ÄÜfæÄ4wè?È:ôב8ËJöçÁ®ÄYVÞg¤£bË¢ló„@wýѕ‰ V Œ×jlóï̔´DõÊC÷ý(§—å½32ÚDô7ÌW#cÃ'Ë +ÅÂBä@°È[c¶uȪÖÂ|dþámèö,²¾Ýn¢±/^½§#j÷p¢Æ'»ä'àÑ®ÜF؝=î7̝㘼‰«ÄGPÞÅÎvb¼<Â×·ûMð(]ážÉßdîλòN÷‹Ð!'˜¾è h¿1¼næŒNƒg:_çöý |Í;cS¦¸îŒUÌ*ŒhÁzÄèRÊò#g°^²x:˜â˜CÌ#s¼ô_®<ûøûܘe*$ ×ßÀo˜7Ö3áë~rbš‡{[F1ú‰);þu’™Y“·@=FÄö¬Z ï?¿RÝ­p•+óÜͽs¼åŽni\ P9™ëå Ã¼¬r¡4ªˆ›eË¿(ÿ%ý¾þà®bØ;ˆ‡Ù5î7™¯™(…-8ÀWj÷|ûq#j½ÏLì¥Êí¿ÉŒ´/ŽÓòd )fº-+ +kÍÞ,«Z›7z/|.H‘ïo@IÞú^¸:_˜ÿ†yfîc¾axîÜãóíǍ|óšæb6ÀëÏU¿œÐúU¿\«¸ú»~ù‡eÕ/ožðÏPÃüQ¥·ã½,aÞ(8/<(ςOµú™ÌÏkWÅ?üU¿§´Ë’ÅB˜Í‘óàŒ[µm<™? Ü7×ë5ÔÕPñœ³º­û¨.;OúöþE'pŸ¶UÀiëû£ vWyàKP•—ŠUY©¡#O$Ü5¶†03ΙÆF¸øÑJ>M #áÛ:ôè–y·ÕÛT?ÁBË7‚–Ü •JYג2¡GM§0î㵪=˜9µú^tΜN5Zh÷ъŸãþZWÚê Mõ}À§ñXe…–ùÎâ¾%°û\ñ¥gÙþ¸‘ þ^גk`Ï3è#`ÏkÊúj£âyžšØLŠçYÖßÖëˆ0½JHQNÑ3B‡\; /Ͻï™Å­í(‚¼Eߝ!îÊVNñP?Cœ£y §´\kÙÊɂNˆMÚìVIš_¬=–ûï‡íYùÒ6JAÏbü5·ŒQú \ë¦ê- +*,£)u–³.æ+×S‚x[™5•ZÙY–yPF«\kƆ¯Á— ŸF_^DÕÌ(°Vßå“>¾ûÉ;H3!Ÿ~¶‰SC¦øøeÌ9U`o¹öTü‚ §s™j9£b¤˜Q0Q2R ÈØ%­j1£¦“÷µ–¿/FÕ*PÔ<êq#Ý·iEQ®;·uT ”÷V&PãÂrÌ(¯Få½±EíÀ(É+Ç·k5pP“Ýó&ÇÈVdç¥Wè\Nµ–*Þn‹m5eh”>–~õf}òAxfúA„qt!Vóæh+U5Fsi‘=§ÐqfQ‰—ñùø—Âa¾j˜ƒjZ÷òšØÖ/¾Y•¯Iùžêµ^¥vW×(`§_V­¬emq†Ÿìn]›¢UÖc¿q¶ÕWbàVä( ˆ}¬˜×“ Î4‰|y¹s‹ª1ëZ[Zή— +ã|™œÞj€Â¶ oÂÞw,m1þšÃà×*ÚåÈŠNeL•ŒÉ¬Fáމ’Æ»ÞøgtDä/<‡ç2ú¼aq°{\|Ú÷´Ë¡4')áxô,Ú9Èh} ’{ŽuȸÊz™j‰^Ø²æ° äAýêSWÛ*ëõ6¯’3ÊÿQÊz½Œ£ÏUÐs–õjî·Ñ€§T—•#¬TÖªÆË\|wíEæ‡RÖ«kY¯—9©+ë¸ôU㢷—õÚWE–õ*ï–Õ7¸ÛUÖ«KY¯e-e½,Nå:eÌAWÒ\2~e™õ´'E×Փ9j¸9Qì$M«— Ï™þð¨µ;ÖÖûŽˆ/ärnuçlÆ-œÁ“÷6í´ç3ÃÁ,ü²e«1vü~Y•×Å«ŸOÎw›¶ü +ífÕ-ÚÒ;x¬‚Í͎ô†ì2?bצÒO4£–'È;Àž‡ VPvœBç½tö֘|Ú +wµ½ .ãdgóÖöÌ4Ò␗ÂuFlƦìf›­?𺎩K³(ÖóˆÃ©…]F›´óm/£…£Tó¡O#«™X¡b +§¸‘¾:/ÊȕkŸ7(#ÐÚËèŸñW7KYYZFOHðwß]{PFEpc¼/clÍ?¥ƒÚ-ó0ÊKvLNÚÃÿØVÛ6s <’Ûó²öY‹öhíÃx–ÊlÅÜ2x3Šh·˜ø²²öó‹!9âÛª×z_Œ˜ =”õmÜ£&<ëÚef7iÄoÚĕõŠô—dCI +Y®T‹µPú4zäa®LÓ¼©h“qñeŠOúKq0huSVáÓm,iZŠ.õŠö5T£ã:9™¤9Çk&¼6Ï®2V°nâ»T’²uݵI£½¾µãQßÞ2Ÿ´o2<(ÍÖÒªƅ1ߞ +’•kg/:HyUNŸ5žÓlt °ñÉVeï住âEç]Œé¬¼½§êµÇ/Ô+,­›µðì Ü€hhŒ A­ç뵧mv&­Säb<Jo¿Ì÷/ÛÊ8s3^󡔊Ԅzc%ºM¢öÌYx·,¯¢á›âËљS™k™{Ì`™*¦¯0®ˆVÄLby¤3´™'gÆ(’î~ˆÎWpm¸SY!wªfu +­€ØßD*ÎÄ}·71 ˜‹OûÚ¯Í?“$ìáüÃȆ÷™êÇwמ±‡´b[ ŽHúKǹ¸IüG,¯Ã¨tz‡âÚÂ( #1åsø¸6j7f±`…GÔéã´$59y:ùrˆgflǼµál‰Ðß$Ê8ZÎû¥_[bß¿’4W[A:"WÆoߙûž»^…Ôí£V»íçQ8\5Ìêµæ ˆ)e.÷Í7ŠºÎ…w?JÁè×òÁÜÀ*L¸e:3Î5 ítäZp½NºÜu‘þΉ°œäiý;£‡±âñ•ÙŽ,„Pym_ÿPö¹Ó¾Èi½éʝÜîánº6«׎%ÙÝ÷/á× -Ácn‚~åËс¥×=ÓoÝ)ÄK‚,Ó(Õ|”‘—Óåx]«Têněîj(Û:ÜXëàä5(ûÛa±¡;ù7Þ÷ÿçªTØÿ_Æ&X`*U""@¡X|úî÷g8ÂË¢ãÌw; +Pø“ƒA_ŽeïñÄÄA càAËÚOr]¾•ÕÕ Ø]MÝPÛ!ZU•×•ëþiqÿI£Ä7„± f€œÎqÓ$…0ÉÉ((ÄĊKî{¯JÁµ`z;§Dä a\~€ûUiòy0ØäÍ~ü5<|•¨qÿ8Ò RUUÏÑäœ÷-Nñ ¾o\5—O™RE(ÓDMËě˜þT öbãR^ŽhVNƒˆààHçéfC|§2ï´‹¤ÒäkJÀ+kofÕÚî§TöŒ,v/&:L_ú€J™\?ÄjÃ'䎆¡—ÄN±£¥Ç~BœÀAOÉQÌò§œ«¥4석y¢µuÖG…¶¥.ÔôÝNŒ½.y'&)`0oÀt\¼@ecÓ©d›…¢4PĊ²únËÚêL‰v§)YQ…‹ƒÂëÌ šéŠª‚ «h=ÐÀÐà¶[%r¦#èd'¥e§?QKüëÖP¢4@uè>YòäIœìÊj±©²øÕw)4&ÊǸû*qŠ!¿Bæ],ÄÁ‹`b—¼H &Ón¢Õ †³æUâ·C°Järê0–v²y|FÂÚÖn%d ôŸb³±9‰£ØId²SˆDø q˜8²VÈÈ® N¦Ï©æF!ù¢Í§kàc·w þîÑÑç1­º}AŽVLµ/ªK/q•­:ë)ž¼K–²AvŒNTA OF$àN±•¥¤$ çaÈփ¡Ô<¹Î”¨Œ<÷b+Ä:ô!t²¢Àð9ÜäfÊ H–˜^¼Rdn(³wÍÁF°^m*å5ecú®7[ +U›ÑÈpÌÏu=Y__}×MŒZÕB+Ä4 ¤ïd†ãÐV•WԞ Ð¥F5Ɂ6¡„É£ÕÏå Õ ¦wÍÿ• €x°¾%"¥1GÛšTDî—b5ÓñiSpÊÜy«6I1²v@ùæÇ<® ²Ç ¬µü9[…Ìì B;Yȇ:%b:kD¢«½ë-º×ò‚µé42¼ÀäԈ5p’ú3ª;ó¡R$‚aõݔ¬¼ºˆ(ÛÁêÒLÜI½\Ww…h…)§Ä?9¥zÍ÷ì·"§n;ÛQÚU%b +r¶R1x7PŽê ÄRfÄAóqª@¶–¡QֈNyËWŽG§Þj뛢‘ “Åš9à߃<™ªÞh”@P!ŽÅévåt&ÜÔÈRo‡%DT»DTèΰ)±¦0ÙÅFF-yV3$='X-ÁP »L‰³«~ún0D^/%WˆQØèäÜý[”&í58†o•öäp8»j§ïj°‡w0>Û*1KÁeìB;*û2Bv"CFó9iÇD›¾;€R«Ãֈœ0a£“¡b²Sž¾ë,˛ֲBä°h “9\¯W/)gŽDŒÿõlNF (õ@Î2»8­úbÆ"~,Äî­`ÒÁºŠHw¢Ÿ(Å2õÛ¸|j +$hj/ùlåú¥[ß2+ÈG.EçC¬$Þ'U¨V*ƒQ‘µÇZ²›+¥Ù{ +«Ab¶F$®}?ñS²…è“T¿­©MSâD½èd¯s>BzB7Ó ‚¹Ö‰8-j¬›¾«¦!j>ô +‘‹µ¡NFÑwõÚ0 ¹*+D.?mPr@÷pûž,ņŒ&ƒ¹ƒBÉNb!¢†1”Èœ¼ÛÅöÁðú8ñÌå ì×˽0}—’ +’V屉õ(x&â(uèL{×IՅ:­±Bä ƒ²áw'C›‰_!N†0%#™z›QòÐì؃ˆôxx—Ë£4–¸œpOô®!u%EŽ<å€uŽ;*•Þ¢~¦ê'EÆ€ƒÑ7¹ú ¦½9á@S%3½X,ÎR)þÕ#þ5ìBÂ4fôþbwÙ šWT)fB$®ÇÆ +Ùà͜œ4áò€#y5N‰h@+kLÞån!cdXóù1q\óùÜ‘q˜”¦ÄîŒô÷½{/ñÞn­uª  +Ît\…Ô§3Q‡je¶œê‘ówÕÚ1Yƒb_¯ ¹¯-w yOØÎì«;¦ën“ÝU­RìÊ>q¶gAîÛÛ¤ É1ˆðW;0Î[©Úþ¦Ù*ûdj¹x.®ìP9+­m¬õJՆ¬o"£â½¤Ç;I`@¼ÎK2pe%bƒèìÝ)Q£j:i"NÉ&.R¸O¨ oŸM?˜ +¡DFÅÃÉ»&õwÑv•hbð*9Nk^gm5`Z¦?e‚8‘âkBûäÔvñ~Jœ¨S²© ×£Ên!¥úÚɌ5Á6AApëôÝWT<`é« ¸7˜ˆ!h|ÕôÝ®:y¨¢¹È‘?£M¢&¦Egt;ëãçW‰ÐþÐ@'«¦8aQ]§ä"á¢æMõO>4²=§ïšXÓµÚ)q¢OÈ][æQ)/E&1" hB¤±*ÑzàaDzw-œv‚·˜Lä(%¶ˆ,¦)~.s .å[yLÄavû:y×3õ ZPa'N†0%>!&QY»3¤”3qIÕ•†ÊÅ Vß ©ÅDî`bðiB´IÞ·ú.fÖ Z̜ÈÂÈ|¼€5±€F·g­¾ t2! ìfzÀLÑ\=ŒtXJZ}·Ž– b6ª)Ñ Î7°BÖ,"Ž2‡ÝθJ4›ä*Yí—לk7~êÉåÓí¡¾ì,CFÞ#±l€ÙU¹C'2pfo…<¢R}¶<3Qµ§ædN¶(°·Ø»=W¬í +gÄ&æ Qý;}×b•©U-÷®ÌXwA4æ$4DYÄJÂëìÝq-d씨xØÈ [èÓ$bŸòßKÄ%£I Ú"J¹‰é» õ&“SâŠl˜¦µ)¼á;hzBw’Ná§U›—£é»yº›v•h.ÝU2ÊÊ÷ü†î(æŸò(ebNe"£ô9 ™íŒ¨¢¨®ê)qâ \%« |Ú*t/f1V·ZÚ$igò&O+JWÙÜ¢*Cò}'‹ÍítšLA…L¤Šý|Ä-Á̊γw‹ØäªT™ïÙA†)Õ± ;\c…(%‘ø—$]Riøýœ H÷7ÑÕ$՛„H°ÔK:1‹PÍÑލj¦¥Nˆƒ$E¢sßý®2¹#¦¡-´;ü°½[QªªÌL‰“àš)ÙqxDY,d‡úŠj»ÜÃI2r›÷0 ΋VxPyiÏ0ÓØ¢ÏV©ƒ„¼3­ùÚC•x²4Á‚šîÉI¤äT/¹ÝTû$¢ü ÛÅßÎÈ£ŽK´bE +t#e g¢â3H!ê(9X5… 1Ê)“ϧdT]ö–ÖÒmú¾×¨ Ï{U(ËvéLˆ( +îèU ™ÒK's%Ÿ›´œœüQ1㠊Ìh6ò QoyŒ¾“ú½ æý>žŒizsq­()½<}×bô{ôB§QW}îÅd@†ËNuW¬˜+«¸B b®:®:UsYj=(&Ììñ+ÄIVÈ(2mæ6ß 8JÄ`»Ÿ¼K‰.—¨HÕ¬܄l,škß}CÖ4ÕdTõÊO2¬iHbßäÝ~*¸ÔQI«ÄîYz³b7ÕÀ·÷gé&ñ¾t“91L‰ÝÂï{÷~â8!ÎMÏ+­>Á$ÝÄAåR;6q…Aeì7x +ö³J’íÊ.¥PŽ®4ùÜãö™¼‘ß×¥ó)ÑMB·;Y+ž +´-³Ü <)ù:%¢Ò¤à*¢À ÉØ$ o°ÀS?鴕.MȽûn@œc§e87X–~³‡|õIvš21[g “Å#¤ÀºÍ¤|ÉÊNUÀƒqD¥ ¸·«äÉát¸YXØI­ÏS>s¸}­¾«»&Œd•hLg… µÒ*X™óŽYa{Î ÜÙ +‹ìÙif:!No'Ӆ !àݤ³ER¹ Y¬( ”tœ¾Û+VQÄ¿Qvb£§40%[ÌÁK•Ðj6Ÿ„ì*rl‘snZŒÎàƒÔéæË%ã™6<¬ÁÄa_èz¦©6[§îì QÃí1 ¨ã%E]ÌV²&:•qB²ÅBÛ»œÞ;Ã랧1<åò¤Ò# ÎîƒMX¹;œ½N,“sӕ†õÃtþ©ú_ýñæúÏ·—×w—×ÿ8=2—ݘ>xöÇwôÄ;yôÍþW­™g¿²?OþãÙ¯þþ‡—¼y}Aþúòüîòæúìö‡{ðåÉ/þýöêº=:mݺ½üöÃÝÅû_žüg¿úêöölöÆùw—W¯o/®éy8ùÕï¯ïú3úŸ»Þ]г_´Yûâ—'¿úÛõåy#ÓÚ½þÇê«ÿ:»ú ï~ùúî»™êÐ»­+úöÿØç}wqùïî6^ð1}õûW_]½ûîì•ßtd—¯Û›Ÿ½óàC¹ùöÿ^œß}}óáúuëÛ×7ÿÞtDoøè´WïÞo¼`+ß<øP7߇?l<¢özŸXÌÉ8þÿÿñîî ›¼ûpû퇫‹ëó‹M§B>Ýp6ð;0ªMÇs{ñþÃÕ欯?üfmbó¦cúöìýÅoo/þëC[Ø͏àì«aØtx×Þþéüîì_›3Ìé'>°ë›oî.ïÎ?!bôñ½ç·ÿzyµÅW¾Ù„}d þGrÿÅ;¹É.þ:e'?ÞãY…=æ—ןإS1„Þ}ðÍöÍ͇Ûó‹ßݞ½ûîò|óam1ªGÔ§ú×GróîâöìîævãñôíÔ¼¸yûîæýåÝ&‡æ§è “Ÿüí_ýúâÍɗGmoÿFtpÚ^:j{GmoÇñdµ½7·gM¾úãÍåû£¾·÷úÞÆ6±ÃT÷6¾ŽêÞQÝ;ª{Guï¨îÕ=UŽÒ“S÷¶Ñ©{__üëâê›ïÎ^ß|ÿ\|§á©èBیäÉjCru²Eâ©\œËÔïï^ÿúâ_—gÔ¡-„ÎéG>¸o¯>|âžÿ ZÞ#É¿;ûðþýåÙõ×2ÆC‘¥7Þo¯7ç"¯ÿ½ÏçõæŒýõcpömɾs³›7oÞ_Ü}ý„ýŸx„tà¯H–¤(Á󛫛Ûÿøþ;Qc6¼s~¸Úܔ¨o?ø¦Û8Èâý‡Û7gçߜŸm3ª•ŽÜa‡±¼wqþ§Ÿ8ì‡g÷õnã Ø&àÃÕÙíoþýîæúâzó±­øð£Üv/n®ßߝ-dÿðt“¦ µÿl:Iÿ½ñ¬ü÷c(›~›±ì¹âIüÙíåÝwo/î6Ñ!]W—w>»ü”.ù3¿;GWÞÞL¼õñ{¤…üÃÅí?.h&HÚöp=ŵøé:p Z*@ùcÈÐA„ ½¸¹¹úúöââ¿7ö+ím¼ÐÏ(Iät‹Í¸ïލòd#£üós±oÏ^_~Ø|—âõGRӞT°×ëË«³Í½ï‡¤ m¼D‡âÔÝ|ϽÞ|Ͻ~LiøæöÝw7W7ÿøá€T“'È֎Ìlï™Ù“ËLÜ<{êÈÌ~J‰ûɄ¬>öíÆ^šƒ9êÛ%íÀY?¸ˆÛ§š³¿ÅÖÚ÷c¿¹Ty ÇÞm.(f큍ƒ¼µÖ8«=°·§íP®¤ƒ¬¢ð‰0“ÉÛ.?â±#6ßU{‘ò„n֍w١ܬ›hkîõÀ#ùËÆ^’ߝ]__\}squq¾ÍfýÇ÷GnìÓZ:ÈõíúõåûwWgço/®ïþpöî€.£·g­©½«‡ ¹ü÷díO¿ò禣æ¿6òðú>sÈ}¿½6¶ÐÌíµ]áΐ½_PóÀ>…ßm±{~F6Ï=Ă%›†l<¢Ÿ€ìËé{³Utڛ˫«m‚¸®aY‡OÈ_Ò§‚¬§Î¤;rõýُ§¤»³Û­Nž¼¿¿œòÍíÍÛÍ7¿üðâíÆ ô-amnW–·÷מ|w³¹æqó¹½`pÓ᜽~}ywù¯ÍÕ©þÁ#˜Æ¯7×ùù‡·>‘2Ùä“GÈhº¾8Û8ýåüìêü7¯7[ÿàáó7–û&«‡Ÿÿ#aÓ\ýê‘T’³ëË·gVöPëНÖc0̞ivçO.fóŠõã ³'æÞ-¶Ö¾û' óԁ7/9w ‡¹ÏÈø˜á0›Ÿ·C¹”2fcùó0Âa¶ØU{ó„îÖ'³ùˆŽá0Çp˜c8Ì1æÞ˜'³‡Ü÷ÛëɅÃl>¢C‘½3f‹uØó3ò¤ÃaΟ\8Ìæ#:ð¹ü?‡ͳÅnË<i ±jàeÇUøÉV᧫&r‹ðÓuà‘~üð‹6~õûW¿æº0¯¶³=±€ÓÍÍ~RµèIÖÌ~À +FÅM·©“säh?ÎÑòϙ£m<ø#G;r´#GÛsŽö›ÛF8ŠhG†¶ï í‚6ꑟùÙ&üì( ùّŸùÙáó³©SçÕv>ë'ÆÖ6ügñ¯†ïxl696åç|l6üñØü̏ÍàN†cðd¼Ù" oòÅÿþþ՟/ÿ}qõ竳^m— +¸ˏ Nu8œïöâíͧÊV­—Ëë×o.¯/77ìÞ^¼»8»ûõ•_&_¬Büб¸[ ©J¤þ6cú¹Åê†'fßÓÌ·Úa{ÎÞ>Õ¿ÏäTzèL›·ïnÞ7Å÷O>Á±>{$žðc< †°±½ðŸŸ°ºM‚^Ýßì½nÎÌþù¼lóù„Cm:´×+ò‰®é@â# d‘ ½ïW憼ïWçÙíåÝwo/î6mõ +ýéë;òz8.ŽEkzLܦGwòѝ<ڊ;y»"~Gwòѝ|t endstream endobj 129 0 obj <>stream +'ÝÉÛ §Gwòѝ|t'ÿTc{º(?w2‹›äPîË­DÏ£ yÍ_ûm(:º.ä£ ù'6ëËfùf«šë+ßì¯Çâõå›7Þ_¼¸¹nR÷õæçgí»âWW7ßo:ΫË|wמŸžSmҍ‡9ÿìáe‰ùû‡Û7MØßn“®~´ß¼pÏ/b=OíºÚrXO¯÷ht;8£Ûøht;ݎF·ŸµÑmÉ÷Ð-o¢|ùÛ‹‹ë/›tyñe»ã.ÿqóå¿.o®.î¾¼½xýåÍíÙõ?6ÞÇG“ÜO»bycãèÅUû—­¬W“/^ö¨ìì¿/ß~¸û¸àôáýG³÷üú’•þ—ÄY+"æ×¢˜¼Tîv@[¾1¡§nµðG³Å˜-Þ¿»8o2×íC$3ìï&ÔIøÍ¿ß5w +èú‡Y²í(·¶õ®x´Ûí6G»ÍÑns´Ûí6G»ÍÑnón4²ÒˆÝF8l¾9ÚmnöS‰=Úmv±Û<+yjAGû`„úF5£´B=ÉTà֌}7Ð<Í"ivz$þtˆ546/t°ç546/=q¬¡±oÙóÛFÄíý¥ù$1Mžv«Ë»?Ÿ]~ʄ¼;÷“ÁíùÝy¬?µow瓩?µH?Û÷ûs[f|¼:÷áê<֝Úmî÷åÚÝz=5§¶éÀ#ýøáלúê÷¯¾ùîìõÍ÷GŸ¿ý<ª2=Áê;VØ/!à@3ò7Ö|ý 4 ûú÷#ì­ÍòÃæùaÏɾs³›7oÞ_Üё¸½x½Ÿ>´ãÿ'éÏCX¾ªOQؗUy§Â,ÈQ5Û;ÕÌ'÷Ŧ[òûË×[„xéÛo Ž›è»‹OGƒM†„×|L]>–5ÞE~࡞úaã­¸¹ìû¢ï6#Ù\ù÷ѨñÈj@>5S«9P£F}*FÍr4j€ú{hÇÿhÔø¹êÐû²*G£ÆѨ±¯F R—ïζÚ9*Ëím~s{v~wvõǛËÍcÑåã g¿ôÀã:ÿéyz$Û­¥¢Ž{¾qIoÏÞ_üööâ¿>\\Ÿo® ̾zx;êÆ!Ã×Þþ©¿m‘c>ýäÁGv}óÍÝåÝù'LÙSÛ½ý×Ë«-¸òÍ·c‘êc±£½)vt¬u´Åµ÷XµŽ6¿÷ÞÜÞ¼ÝüHñˏ0œQƒîn6—oa(ǪM2®cÕ¦=©Ú´…Üûً6=ŠáhóÒE?‰Ñè¯n¿ýpÕ&ûðìˆO¬öÊò÷ž+îTrå‘ì¼Ûä‡M­÷[ ž\üØ#: ø±~9¼úDbôÑ,~ócfñ‡VP6ތûA¶ù8žlüØÝT>{2N +ÕÓ3î»'nÝß8~éhÜ_à̸ÿHÂëQÝÛuoxTøŽ +ßQá»o{¾ŸJáÛX–9*|G…ï¨ð}¶)xªqiOSåÛ¸NÅaj|ï¨ñ5¾£ÆwÔøÖGrÔø¶ïÀÐø†'§ñm1¢ÒøþçÍÍëܞm~žêÞã«{§þ©(|یäɪ|O@bcÕáX%b?”Ù­’úãî@+^ËxþØ@Ž/v”¾âÅ£Œð©1³Ýëw<´)ûª)¿üß^ÿóË!ݼ;;¿¼ûá?¶°Ÿ¾¿ûájs·¾ýð1ÜÛ@MÊiÚjP‡r˜~Kñ€ÎÒ.möÝ0ºÝÛóÛõiâÍ>}™á=×J}ñyÝ!¢n /õÍùÙâÁÊ7oIÞX)¤Ô7׌Ծ¹†4ÿîÁ‡øýw[Ô¸Rð÷Ó îÉ(çŸ=ø 7ŽzÿáöÍÙùÅv{tõ££Â»ÃX¶D>”k[ å§[µ%o\vèâªýËV–æÉSčyÌÙ_¾ý°…ÕÞðA1ß~ÌZC?‰ŒõëK¾k_ªã÷1¢Z˜!¼Ô‹ñ€¤½£¼p”öG^X€²|(2Ãæú0 ¿ù÷»›ë‹-´õ÷WÃB_·V±Ö?<ÊKGy駓—ŽâÒçïÃ7z†P^z’ñÑ ®Ý}—$ž¦3à!壣ÉüóK=ÿü쓅 W>­jãlÎÒþùmó|"b:´×ùD¨é@â# d[›éÞ_šO2vøìöòî»·[€qÒõyuy÷ç³ËO)›Ç»s?ܞߝ› Ç»sßVdÏïÎEúپߟÛ2ããÕy¼:÷üê<;ô¥qe¡Ÿœ%ÀZüt8 ðTK=ALö¿n]&øP<ÖO¾ªî3ïXdéQØûÛ³ÖÔÆU2±û§ÿ½ï/£l:dþkó­ˆ×€ùïûuö»öéûO‡¿²¢wusûÀCáOPpzÒeJ4_ï‘Nҁ–ø8}25>N7–Ï÷½Èǃ¢xLzøÄÝGbWcùÒì¿[eknßÏÑӌä#mÀ¿>DqîCö©Àºìû ò›ƒ€¢¬=]²³í,¨°ýän#ÚlsqûÛËÛ}0‘ìË:ߝ}»ù‚A3œlìà±ÿçv˕o¯ׇëó¿7yr»ìy9q'?}ö»ã>{Ä}æ.ììëÇ +1ae‡²®ÿz{výþÍ(û³ß¦2ì»)d‰¬¶ïòçÓµ†È&ܹúhѕáȹ¯®®ö`MöeJ–mÖc¬æ6x¤ß +þ鋯~ïÝ«ß\¿6(" DyõǛë?·&¸êÑ©¿¾øÇåõôÁ³?¾Ó6øÑ7?¼ýöæŠ}a'__Þ¾þå3wòUûçïß?û0ù¯;ùuûçOÏÜóÒØ»ç®Ä\èïJÎU‚mžç±º8¶?jƒÏ'?{ÖcrþþCû—ÿ·ýñéû“tò‡“ÿýÜÉkú¹¿<;­>…ç!ÃI ©÷cŠXZû©D&ÆçC.Üêø<·•|zÎ_—çC-#¿˜ŸçT”è­Åšýõя£~\žGôûhïú¡‚bà_OÏSp“r¡ñçø<–¯ŽÏãXuøƒ´|›'¡¸1T»^k-Bö®­ Ýó4ø@DOKU•Ø~ +Ä0öñyñ<ûF¯¿^Såßj;¢A‰aRtc֟o[¡Dš§¡Íw”µ mÂÛ²±´-iBb©mo¡ÿ¥Í‘Û e¨ún-™[¥¦2¯]¨møo“Ð湞¼¸O½|ö¦íãÐf¯5Û6rp5%ÞÑmɂlãÚöV¤m<$Z0÷|t~̞ö3µ9Ž22%íZèvˆRl»˜¿¹ý¯Jû+Ò¨dR‹‹4Ô8<ÏA&:´ÇÞË÷!:ýÞmQ‘-zÑóTÆa”ÙÏYö©ÛN³ *”6=ü½k)&§çí¨óï»$3ēR@l;9Œ£lži >¯YvPۊEN´k£’Óצ­´ßfbëwà³ÒhÍ÷èV§wÇ,ï¶mãùÇÚþ繐!¤œôPc4¾çô•¨<Å7fP´*(´¿ä—è7Kµ)ÄhS0&a5íøþ-Úì%=ëmKêÆÈ£×c mg‹°Ê¡1Z„Æ¡rä^µ=RGæ‰ØÃ/žý¶qú/^Ñ?îä/ô¿ÏK[2Úþmsµu¤?Úz·n)·OÅ ÄíÛ\¹6†¿Õ>’¶3%9‰Ä›ßêƒÖ=/Ç!¶= {d°Iks],zFË”E´«¦› ¥Í²tµÙÄ;ªÍvÛ)ÊÆ0=&`íeæ¦ÒD;u™g¹š 7Ñög¹ Ú½NÝ<Äøø í4¡‰Øöª ôv¤í‘xQiòsr€°Sñ¢¤‰èª5јýùAjk9Èqil¼¬T‰5ê^«Îéú7¶4 …¶3+M—Ü‹z`ÝÐÖ=Wœ¤ç¥Œ2c£·ÐÑ +̈c%énw£¯r†˜ Ëq©5é¹È­‡ÖDm÷‘ÄÖÉRq¸\å¹i7NÑcèië ŽÅ£Žš}”´uôx E,µë½ò’4ŒvŽÒ8™Év3bðvÛô•9OÛJ‹W]Œ!{Ý'%—¾žý,IO~[°öSÊgGbÂQ›(Q&{ûEkâ›öÏßÚ?ãÉ/~yò÷ÿIBÔ»©$µtÏáÙùèì|pv>6;š]ÌNfçã²óaÙù¨ì|Pv>&4e‚‰í®¼ÚÆkê~?êÑ É J¥[÷¥’‡4$ˆc'¯¶Aò ž;'b‰ü-È1ªTÙ6y°Vâè´ßP›À§×ïè½hË0j1ȹ[ÿ±֋¼ŽÅµó`½ðz¦½H*†¦ ¸ [7¥¦,Œ:ñnðƒÛ»UzÑ(*¶‹SA‚ܽ=Юµ=‘U>k‡ªiLÒµFnPP²Ç4¯¿­óÜę¶çtò+oAҗ6a$±¿4݇U¢FnGºBӈA·lãTÐib(^ˆ‘Îß U@š0V„̲´t/ÒJºÁõ܅&% #mGÀaÔInœLmç::£!6Å॒[o¼¾Ûdm`tUDùvcz.Wݚqh½Pé­ݺöªðÓs?ºd|³ˆÙƒÄAa¤]êÚ t$•Ÿ|.*-¦¦Šj³mÃÔE‚¨QnzOÌB¬cthBVa%zH0‘ÄBn ‰`lï`rvb¹ ÉHíFÄkƤÄqÌjL +ã îHv’-;’ E~ªÝhªàçÐf“ËTZ %&ûÜù¢â.OœˆkMPˆ‹"D¸èÕ@0F°x×ؖéaS¢È€ÐºG \[Žì .k ’#©HWüK%»´ hÕzæœaíÕÆ tí¤³WyϏ6\Ú=£°k®uØ5ACŒ‚BÌAš¨¦541ýjW +Q렖:lðFl§D‰u9”ÞÔiloVpÇV=•®Y‘)A:KfЊulų́Âiŕ@ä<*9Ñ$Èþn§¡Í˜œ–RdŽ)Ga1«Q•„Ä +Ùz’ŽŒ ¸‘BãÙ)ÊÙ'«jՄUª¼(œ•‘vÐõ<7j²P£*¯46ÑEÍF’\D^ióàøŒË§lr“ô͍Óeºh¼Äó‚ìQâªaLBôIØ›ñ*zÍàÙD"A[äQ•´Æüªq+¶m20KNj„ã¯IubÄ£Nä6óCà]ÀöDѱèX9–u›ØŸð#:Ø)ªŠ¾K6d¯GWUkU-³¤§ldärI7â8ˆ¼ÀR¯(imÇaõdZuQ·F nID.pÐ^*¹íšªB£Úæ™"…£$ž*¦¦ÈÞj̑ˆ/TwÉ+KmC‚&Pi¼ìDÖ,„ØDmÂED#¶A©ÂFj‹ÓĪŠïq1ÐfMUeÑLJ…¾;àbhs•Øhí¯Ó k7Kj«¤ïã&ª‚Ø$½Y™¹Ñ@ +" Ñ“+“ôž0ê5Ær—U³m{2WŒ¬±PG\™U_umBÆĜíó”’J®ƒ²Rœܸ ZLñ°ûó•'›•™å!ÆÏ8KÁøý´vÙé:Ú%Ðñœ‹x{Ô)ږt ¼7ã»óQ'/CŒ«Ý P˜”K±æ‹¨»“ÜHQ'›­÷håFnÜÅvLðPi²zJhÁ}Ö&Ø'¥;fôª?±âˆ/1*™®t4[JRª‰Ï•tªíïƔ ‘.†sÃö*&7ýªêÙõª«˜³"'òÓE‚tÂÑÏ^® V[²z°¢ è›Õ´*QqôºRٗVTÏrñ]9í^sÙRôiÀtˆG­`exPò8oä¦y译á\¨d`g‡¿,wEӜÕÐAf€¬¾Z3gk>Åހä±ön‹u~-„¡½Y<ˆ¤_¢Æ¡T‚jyoJvö|±A-klŒÑíÅ&viÀ‹š¢dÊIK¯²”mßgÕ½½‰mKñ%ÐÒYÆ ¼È»MGOr1µTT–ò$^TÕKHq—ïbc'Ãsm¥mû‘÷-1¯ +hÐ6ÇÉFäÈ rŠº¿Ø_a†®Ã}¼d½Æq…4=n +l&â‘zçp[€!4U°1/UÝX :³þ)—Mð:1ìU ¸ˆÉÑ zk›ÆàáBEx%½uôêáH éAŽNUòlæ–Fnû6 ¹òRÉ¥V՞[ ðð—aŒ šÛúc$RuêÄaÁã¥Z;Úu¦ò/ª¾;ðfÊ®·[ÅÒÄ&¡æ²iÉ´Å_*U/22¸ÔÎ-Xa‚ø΄ØD7ĵ•íV˜1ªfTÓÖý®ïªNÞޔ@"êÁiZvq<‹¹é&êój{IÅ<Ah] +Y!û±wªèðÝðRÉ¥D\6Èvf=\LNÕÜ{NUƒÆìì†&«•+i"R½Tr +C°™Ä Ñ¬?½Ô3Õ¸ ÊO®VÄu¹ê5‡ÌNïsYÀ%²fˆ ²°!&§lî6] +Y•`z8Õ¾~Ÿÿ +ãÊXY³yÀfŠÂËûß&ÌߞÁKýãýâ«×7ß^œ|u{÷§ë?ŸÝ}wòõí‡÷ߝüõææê—ìÎn ø÷??ûÂ%]p¾±nW]ü­[ý—'¯7N“ӘĘ_~ܐž}‘›Ÿãܳ/^ýªýÔJ(í¯zT$wæwáâõ+êÅE~ñêËöϤóìbý,›~QÌ¢Þß±ª!„dŠ·JUc'ÙiT0‹‰´[&:³q±™¿o‘Wõ\­Fêî ƒ…3ùˆPFò¥©M‡43_ "nžëlw%-t óꃞ½&JT³¦·5ò ‘öHF–“™ì«( tEhKŸ‚2-öí_}ÞÀ–ûºô‘}¤;³‚§ºµêX0Çí½]''øs‰\2,Käoxy#êÚ¦>—¤Æ)¾ÎÑzhQ2ñk¦†Œfò¤õÍn%ûsµå ®›õŸ{ÑûQ³6‘=BؽRµYdµÜ½æ*7(1Âp7X ‘ý0NšU¢ƒºÝiÖ³Õ gô]˜Gl>u 8ƒÖÚË/­‘ïÑ/A A÷ŠEjûitÔUvæ>"¦ 1YèD7·¹" ¢Ë0YÃA¤ õU³˜f¶È*r:‡ˆb¿0–ò’-ÀF͗JÎbàŸ+F-a™Ô?{Ù6‹jF,@:lOWA ¶ôÞwc}±xÓß +jC +ž½¹ñµ²Î&ßS6 +L8ulìöú¥ž’Œ¢c ҞJöÔ'û/ ¾¡8[`òõ j‚ÅJ!¦Á41 {2=Ðjʱ.©Î4ì ìÑ»&Øð¶×Ùƒ5;xú’S?ÝpšSyfÀ èb…MWh7B$²8˜˜=؁e¥NÇ`³X§û‹cÇûâŒ)×(2"ŽØ¢0–g'ãÞWl_ª®ŽÆyÓF*`#Æ´¼(É;‘ÎH°M£"6å,˜¨ +¥“bWÚƒÈ9_Ðó8€êzS :¤`í'b…$ƒšòªð§‘åi·|‰r˜øO„ ©y0“Ù>¨õ=Ž)ÍRXeQ[‘âÛGóˆc·ۍ¦Lý5Ò@‚lF×#Å3¼Trð%Á£ÖˆcˆhWs=ò0ñ:™Qœ¨bàWaìoä¦L«o"i,_6!©UÇ«FLí@­]¤vD !¢ð¤deŠI"Ee1¯?‘먿Å2†;XwᇦiÔ»+š0M^àæÎb£ÒŸc߀5v”ìöI¹ú€ªTÀ‘ƒy É£W±—ŠÞ¨Iø˜Þ-¢Ÿ“$Á"Á—œS7Ëàz\ÐV£ºÒ³Y¦È)9”~n‚îE² Yì^dâ¨â0ñ“š4“‚ù‰±¤‚¹q÷«M’ˆ "ÈX´“µqÈ;aGNê|½ G ÷ ¹w„G 0MQdÃà´ÕnBbr„{ˆl /UZdâ´:€%: nj;*i6 ¿˜!VŽý²pnPç°ËÓfKÄÛê”d#D®hB=18DÛ^àrSŠ+“øÑF•'S§ËH¶ ̂rJ"æ¬EF!¢³‰!ÿª5bsP¢}ØÀ¥Äj”a´{%É-ªD—0ÛÈS…=kW‡I;\Ì8º,ÛˆC¸T†ª8í,C ­I‚—Ñn-Ön×ú 3iéô¼ówŠdh–ª»6Û7*„`÷†”`!oÌ0ºd¥g5™ÍnΈ¦s´Ó×n¸&ØÝí|Õ~qãKSÖ&"¥µÙ®¾R¬ðI\ez×g§£Hê–!¢&àPd˜IQ núî¤9/d•w(b‘BlÒPbÄfHd…F³êZ"2‰}h6æQǜ(1ÇȪY%QV•8z}wˆCãE!’‚‚ŸCˆú¤rÆyŸ!£·× Ÿ!¸* Ã1ù,cpn(yBƤ·«¹“¡µ¦ÎµèšGË|u«˜;d´ë¼u‘9d@ ÖªšaIF$ ™äÜ`A[£žkbI¡´»i2±m? +AƒH a¨GАœ‹%y}7t •Ö]ãð [ʄü3DàQšúGÇhºML:3ÞüqDÎ=^ÁTD֐‰~•ààfsÐhÄX´?/M’' ?7ôs2»ª•a€h’Že±ŽMöy#W¯“îHA»_ƒ\3TŽ\¡¢yg?kG”azHEæº cgZm½¡”kp +©'ÑTÒQ͍åw¨.RL'7˜Ñvcè®/önꬷZJŸµ«³ZŸÇ)‹U½œu,#çlv9[‹5sìxk6­· Ã*V|7t­Ù¿Þ˜žàUŠd¹xkÒ݊,øòþ·n±Ïìg ±'š™‹Xü Iâß*'¢Cäª{&,苌áŸÙÍp_>ҟû{³»— ^óJ8O⭑3rŽ†® AËÒR/ïo£oøR‘ùÄ<ʯÈÔ 5“Š’G“#X Äq‚5C4:ªÈ¯ÿÚ ëFu PT®ÝÐ`0MJ¦É†„wÓ¯k@Ϻ}s¢ÞZ²uB|ŽÜ1 Tœuà…±•¦MÔIÃoŒ•æH·—÷¿Ý¹®ó¶3œ9QˆŒ¾ÄÎýs¬aÊ6÷4  +¢¤RÔA{ÍÒ)D÷hÓÌ1ÁÖ9çñ6Doo™¾‹pdF†ÖÆ®óÕif‰8T6Zy}»‹kΪ¼ˆ¦àՊ΍JfÓúë7FS먓31 +:ñž1ybllºgÄ@ð¤*R',Ò0±ñu¬ø©SÄÉ-,{PdøBp¶¯@ãÈ1¡™b/†ìá‚$<±ÜœÈhÖ'Ä:XÞÙt„ƒ¾b8LCµ ?¶>9äözkv°ÓœŽÑXSP4 5[LjfljÂ2k6oW9ƒ~˼mSáÇÆ®í{Ë9¬}ÕQ8ÅN'{j±ÏkßÒN¢ÅmÂ͊Q+:›ú¶Ö*ºcÄ亹°uýµ!ªç-y˜²1Tç±C¹²À‹x%kH’¹CeÀÎçÔ%0~Ó¬Þé»d`îJ=¶h9ÁÆl¿%u‚؝ˆS-¯‹Ã¶ŒKjêMfaÌ® gb +È^Œÿ&ÂE;O A™$úüb4!0:,▉X‘’šCo6V¬Ï š…9ÉOêê±o3l+[ˆì՞w˜“Ù;ˆë†®'LȖÞFºYÆfšΚ+Zæ¼ÕT2ò?Ù±aj‰]¾I3I§H8$ˆö̜t‰mScWß!—z±xEƒã#uj¼Ýþ]»#„¨1cΜ‡Î¼ÓÝǽëÖ ø¤œÐÚɇ mÈm¨%Æ9"_Ë<á\]ÈâÏÔ«Ð&Ãexe½i4MŒ‚ú½Z"œ¬Æè»Þ^vÿ@ÞwƐ»›qB®½Ùl±´¤W3œµæÜ¡c„ñËçf³uaâs/pªzkU#5¹g¾™Œ¢‰Ç›66œŠ¨³õÑV3­Îlý$aèÅYw¬n{ò¡dq®»5`NdÉKÊèÀZeë•Ì`ût£dÅ!š B,e°VáV†Páô¯S•Dȑn¡5,øõ±Õ„ÃNÞ°eÓf6ÿ„ì'þ­<@Û1DD¿ëÌ;eR>:§€î¾rØýÄÞ;W2sÐüv–P­JŒF_Ô°&?)ë þ?Ô©qc¿6ŠGý™„Û—Â#£Ž8ӗr†’Ÿrè>L gý!÷þ[ÄTØé'¢s,ýÓÐ{«i>ôP¤›xáoJ ƒ)6½E\•ÚÚõØÐ+`¡l“›qïø€ƒ’BÆÓ$š2™/“Ú]1RuÝ9Eç¸"n‹çƒßmf¦bñZ·dšÈ6f7â´O#›…D€.ù­ØÕzôôÌúôÖÈÞÈõGlUæU,’.Gó*¬J/ïûççØÁÐMU'¸ö©¶Ê[%¨ªq"ÿÎü·JL^ãÿâײ˜ ªÔ`ӌæl÷A”l{!VZ…ìNçÚ UUâ(…áp†º~N¡1?<;Õ\{x¸Y&bÕ0÷$Ç݂ڕ¬•Pm4‰sïðÏÛæù þ•&·=‰TŽ{&>9Í(x»ÃD£‰M¦ZÞÝt²­ååÓýÅ«÷Ÿ1C帝çó{½»3¬ýTFU§Á¤¢Ü{’ +Ý/A.èX²\ÍõFà +“¨Z¶kX몫6òˆœÙ–¡“­4PÂ"µUvˆÑ +ûë¿ö¢wC­:I*?Z7ªÅ YžüúÛ •†A9¢„Fz½˜Ä"ÉËû^í-Ĉˆ›a{1¢°ø`ºSBĘŒ5ßÊLËÍ@Ą˜¨Á2ن^¢'‰ÍN‚»{MT „™¿œŒ\ÂämU³g=°·Òy²HYnDVqFt¹‰Ïh×̕”¬12Óè."[HW26²ÖVJf6æd÷d›C”<^jÄ +¦ +³>‘#0Ϭµ«†-kld+Ñ»²mµdÃÊÆ(_£/ÇI—Cµý2ÙF¬ ق‹VÉ9MÞv„]˜fT+~%əÇb[ÙÕ:©Yƒd¬$HJô©N8jÙJõ¥‰™r}Ûë6´Àv† +1ò€ÓǕÂlÓœ§8Žè‡uv$Ķ­PÐj!ñلzFQvDtˆQ4 ‡aÂz™µ¢q‚­ý`Ñ^ûŸ*¯%(Í1ûÁòrˆ\íÝÁfaü%TtCxn7Ÿ-9+PF³¼]a0ì2yÐ(­1L6Ì +Ç Ä ‡™bè0¹HΉR}¨³Äæ!\ŽVݲƒ™¥¶¶Ð¬@‘3.Ü:ûj祱ª5Z¥˜ g ¤ÎÓPëˆ <àûΪs!†«Y¦ )ÿ8Úa@á¶qpµ¦`õà*íÌ7gÄ÷à¨Aó묃 +V6)]5þ!‰¾ŽÏcÀæˆ=œ„z…]áe.iž´˜·jL¬×š"²Ý QªRPËø`¬Õqzì´5Ò&)cdí–Ø/ÙÑڝ\W+ä á`0“=õ"c&8È-#+eÈ]rË8ú̪lɜ]ëÓk¡ŒiRå™{VaŽ^žwì=߄“÷1’2ö6RFÕÖÁÂ!‰< 4}Èã„lÕÖ`ï%bBB’ / v•ÆÔ'ŖgãÀ>™´Õ4M\ÛdÅT0;¬i÷} +«gs#M$Ób™I*2¢ÿXL&¢Y„o%©kÅQÇ~Õ¡À`/M·Òƒ€Ð ª{h,³—Š,r­ä„Y2.w÷0 ²\`h¡w=2­XB}Ùg\Uv Ù!ztÔÈ"Fð&8`x!ü´®noeùË0ÙdÞréríW~è)vjFâ# å¥x;M&ʓì\xÛ,–}%ßÕ]¤N§Çé´G‰³3YDÕz;b?8K ä¸ Ql1ç^_£jäUÝ3ÇGËdcM GŠ`!¬Uõ1M榓GŒÂòŽE–±,ÎqBÎ6pÁõ‘Š¸&":D:#ˆŠ‹âbä°(“| +*oæ^ëŽP9°ÈÙòùm‡ò¡rE·«G*'révÎH®„«ïñqªÍ¢Œw‡Ô§ÈFㄊ˜íÉvÈx !ó#²¾k~b"f«ŽÚëÑN +`j)W"F¨V—ȆžÔË«’¬3"ðœk:¹ŒÊëœ×;q^,ïj&&‚%q‘+ÂÜE®öfARCõ);,ZòiÇÂtöÙE;$ütÛ<÷'‡Ù LŽCÔ ¬Ké’d[Zð{«rÇ Hîát^´[ªÝ³(H‚¯éS¬úâòfÈ}-ª·ì•a²ÆÕ®ê¨NJ"Ž‡'ý‡h‚¾±™A ´¿p¹OöيNGdô&òlWõPs‘«üàêĹèæïËä\˜í$•~.‚Û¨ÎîóaÂ~B¸çžÎV-{EVXÓô» `¦9¿5r­òGõl˜4&×>m3˜4>&¹¬¾ýs³£/"|´51"Oÿ! ܃ò™"¯Ý­)v×ä&vƒ×¯Å›òùN›ÖÄ2M™ƒ`6¥ˁ6¥ ;AmbËÁ6?²Ï^¶oÄ«±r ‚k ›ò`ØMñ@ì¼ ÇrèM Û|S¶Ï.ð›ÀÜ€SšØ ‚½Ø„˜‚Ëa81™;qÊYÚ Šó‹W¿]áýG8N½«ŽpœG8έá8é}õNþÿ÷ïßÛɚx‡é_ïóó9¦ãaú9¦?~LÙÀSŽÉ:„'èk žx°ãyK4õ”ÎÁ<íÁέÍ=A_é9íϬ'ììi‚ñrhOëâ}ðžx°ðù‘/&+p̧=˜}v l1Ô'T 5°Oy°îS¾¿ð–C~BN\ ú‰–Ã~ +‡Ø øSšØ úSšØ üSŽÂ.ðŸÒÂ. ha9(L2k  P®w€E‹@¥] @ewÅVÙTšØ TÞ. ?ÂAOw……9i |v94¨´°8¨HW;ÁƒB@[ Š–C„J ;„Âb²Šs P¡ïŠ¦×ÀB!6/‡ •v ŤîŠ•] •»l($òåÀ¡FÖ CÁPv…qøP\`KDEÝ BU…v•^ì#*MÜ$Š;@‰ÂZ°& +kör8Qiá@Q<ØR´7±TMì+ +l1°(X -ÚÕÈÅà¢hb ^Û`Ôtæå£hb dë·Ì(š˜}9Ô(ÎÕb°Q9Û;Á‚.óZƒ•;ŽÂWµv6Æ€GárÛzTîˆ]ÀG{ ‹áGa±] ŗCJ »€bv€!Å~[DŠó´)8å)ìG +ag@R¨ëË!IÑÂbPRhõ;À’B¯_&Ń5hR{°œÒêrxR™ï(íÊù ¢æ ¥Bß ¦Zû@¥h",‡*•&v+…í`9\©´° `)Œ k¥ðªìZj*ærØÒîaš—ʃ Kѽ5ðR<ؾTš¸À™ºÂj÷Äô`LÍ^´ÈšÿP¦¶#ç`¦x°œ©4q )Ì!MA_5ÅÉÛÖ´»ƒî6µspS{°Þ´»Êî8íÉ äô#_Àµ°ù¿mújLjÔWŸ'&u>%ýâU&==F.#êÏ0rÁ·³s}s}Ò´ Ú)zôåÈÀ0 /ÇÆ·:°ÝCËñÑÄr„`iaŒ`l¾P‚щp‚!Fï€|ÿvÃÕv xÁŸ1òîsuñ£ñL‹øÁ}ˆÂ÷Tá45‰§¹[ØÌх­¹9¾p°ax¥Gs”a{°g-ì€4Ü{¸Ž6lô9Þðý¼\il uØÌq‡ñ`äa4±†=Œ; Ãɶ†?Œsbû`ŽÁb,E!FsbÐw@"ÆVšcƒ¾±íÒ9±=XŠHŒæ˜ÄF_ŽJŒ&Öp‰íÁrdb4±6q_®ÅèÄØ4Ëñ‰ÑÂÅç$zn—¢G˜áw.´©XšØ «Xš¸­–ãã–_C,ƃ0‹ÑÄrÔbø·v@.ƺì€]ŒÝ±zq¿4ã;_Ž`l\j1†±I'sc‹–⣁5$cH®Ë±Œ­é9š±5½ÏؚXŒhŒvÀ4¶&£›z°×Ø:1G6¶slc{°ÝؚXŽoÜ7Á áxýÁÖǶóæ(Çö`9α‰3s¤ãþ`1Öq•£›ˆ8Ç;69g9â±5±óØD¥9ê± @sÜcã¿Ë‘MR_Œ}lÊÂý¸k‹ñÑÄrd»åæÈ] [Š‚l’ÛrdHkHÈö`Ž…læhÈö`92šXCD¶‹1‘ÑÂ*²=˜ã"ۃåÈÈhb96² {std{0ÇGîfÉx°#ÙDîJ2è;à$›,>CJ}9V2ZØ-M¬á%›”¿1ÙÄü9f²=˜£&Û/ÅMFkÈÉö`9v2šXCO6Up9~²¦9‚²=XŽ¡lÑEÙ,ÆQîœg†¤lLm1–2ZXCSž0é)ÄÕäÁQù#ÆÈ©¥ò\e{°Š¬ü#v½7Ýe†¯ÜeËÂòG¾8ºãïqÇNwFwræYõ¨ý†yþŒÞ¡ÏÔÃÏ뺺?X…‚6ú ú#-­žÑ5Hèþ` +mæ°Ð]‹^ + =íÐ8t×°ÃCÏ-ÛDOyäHt0ƒ‰þÈ«,w ,º?˜ÁEÛ~ÕuÞ0 ¬AF[G—ƒF›j9‡¶amæp<¦è.6=|mÆÀåÒÆSçÒf \ "mu#=1—§n[ i»cçPÒö`1˜toa'mŸÅ€Ò6§‹!¥m¹f ÒfíY+&v–þ¡–ƒK›áe/Ý­&K¦!Kî1m’ídڄæÅ0Ó&Ï¦ñ`¨iSÚæ`Ó÷<˜$Hï8mjÛrÈiÓ –ƒNۊ-†¶m³xÚLjË¡§Íà7Ÿ6f9ütזV¨íÄ-‡ îM¯€P[ËËa¨­‰Å@Ô&˜,‡¢î²Íb0êng^ Gm½˜Rۃ9$uÖƒR÷ͱ–Ú6ǘºïšÅÐÔv^æàÔö`9<5Žó@µ=X Qmœb9Hµ51ƒ©} j4–CU[/æ`Õx°WÝ,¬6#ÒrÈj4±Zm–ÂVwcÙ"àj<æÐÕ&O,¯F ;ÀW›yu`kÖö`bm–ÃXC"Y²¶‹¡¬ÍÀ<³î–çgm´9 5,†´6Ð ÔÚèsXk{0¶†¸m/v·6©soÝÌ®íÁrˆk4±r‹a®m÷,º¶½=‡ºÆƒÀ®;™Á]÷«€×ÆіC^݃^ۃå°×v́¯MN_ +}mwÓüÚ,‡¿î·ï ÛîÔåØ&vÌA°!ëìƒÝÅ¥¶=˜CawMe û#–éYñHìþ`Šý#v¸‰chÝEÎ8öG¾8úrîñå|FçÃý®œÝGéC>Bv?2d÷çL;ÎüÍüõ³ÏêÞ¼ÚÛÌÁ½íÁÞû#MMý›÷€|ۃ9Ì÷}(ÃôÁb¨ï•Íá¾{Og€ßùb:¾5ØïN^þ¾÷õՖÖà¿ûƒ¸=X ŽÖ@Àñ`nô9¸=˜C÷–f eý‹Åpàhb K¶ næ àö`9,¸í“90¸µ=‡·spðþ`Üès€p{0‡7–8 ¿çAN+_, +7V·*ü£E7ì.ÜÌÃí,† ›ß4MÌa;8M¬A‡Ûƒåàᘻ5øðþ` ŽË!Ä;KZ +"n»o9Œx?KÄq —C‰£…Å`â&O…œxïÛB@ñ.©Í Å­åå âÖöVǗÅíÁZÜz³\ܚ˜Ã‹Ûƒ9ÀxïÍ*Äx_Èxð fÜ6À®ÓÌ¡ÆíÁR°qk`7n"øRÀñ¾›W!ÇûXƒŽwõ`;np°Æqz‰î=ÞG³|Ü:7‡Ÿ¬Á*¹=XAn{mBÞÌ`ÈmŸ/"·&–C‘›x3#ï–‘› ¹¼‹¡3Hrqç äýÁ –|"9YÊö¸ò`Mn–ƒ“›¬5‡'·s€òþÅ ¢Ünïå å]„˜Á”›Ð1*ïôT9$ 5°òþ@ߟÄìXnMÌ!ËMқƒ–Ûƒå°å&é̀ˍ¾º¼ —3ðr{0‡/·á,0Gkæö`9ˆ¹Éòss{°ÈÜÖ~e>߇3mô8sÛÒ ÍûšAšãÁÔÜèsXs{06ïfÐæ±c¬9ÖÎûƒÄùØº1g èüÓ²ÓìüèYÏp9Úb?e‹íޞòãÓ¹-¹7\`þÞõ^´ÿâ«ß{÷ê7ׯ¿ùáí·7Wúï__üãòZ)¿øúêÃÅÉo¯n¾¿¸ýå3²Ö³­þCû/Y’©îiþ„ð=Ð2:ª:B^Ȋ\כ*í²&AúþûÙ3ò¼,ü˜º0ñÀC@%Aʊ—€}§—(ÈEމÑå-‘ƒ‡}Ê{©sãÁÙjÝ.è?éÝXÿ± š¨ç±Þìÿzöíý“þ‹SçÛýe?o_ýÕùù‡·¹¹;£w'‡ío¶@m– ++Ušœvú©l叮m>š¥Èÿ¡ébÝÜqÌC¨û“ï[Ï]ÉZ*ú$Uß2ÙKˆZ&(È0íšhmüHÕ GÞßM0ÐÏ1:¶é¾ ï+Õ&Æ£Ô"Â>FÄ"&(W‹ ‹7"Er$™¼+ª1i’$G´Ja9³-‘èŽL#õáœÄE.'ªSQÕµ;ēý32è +žŠ¡$2‚ÿ8;¥ðþX™~Ðò͑¤_­‡’r™8h ÿ| Z†2R©òAÀ¢f¦6¢·šBQ#©’`i¢©ÑcÇ÷‰A•}š?ÔCˆ^É#!O&™>ª‰Š¥ªš¤©t¤–`‰º`R(>’;@‘6I–ul¢˜G½©€I¿Œ6Eb<øH@oN¸¤ n5 PJ»²[œKY·(êNc+adavîAjE?–¯©ŒŠç  ®H­Ì¢&½]÷ FÕW©c\hᔏ­Tê6‰¯R±{âёáê“.B#ØÈÄ=Ä@X3²SÆ.¹—*`o5Ô*µ—¸­·Þ±zU)ÄKvaWXl­Î ±%‰ÜQÊbwº²­BápWeCŽS܉n»7à3*.'/éérdÕF?&ñŠ®‰›jãr„ó)«à +qîX;h|ø„;”A&¦‰äNòâٛûù;ùÕï¯ïڅԮ““ó›·ïn>\¿>yÿÝÙ»‹“·7¯/&¼îó_üùæêŸg'¿¾¹;iBÇÝÅmc…ÄÛ½qyúïÿö &±˜®ËþÏÉ»gz5ì;GVi“ì/mEf]x¹Ì9mܨG—ò”Hn't²åÞrpü'±w^OÆӀç ù’Œâ…:Kl°V®'D®/è¼NÉHz¦ž7Ø×s…Áº̛,J õ +©K:¥…{¸_5 +K>4V»F’^%²½]ÔHðt+íJcd€ÁŠ`H!z©,NĀúrã7™.•\‡´T9ð‹®´«ù©ÂE[‘òÄpó(JÁ8ôêèŠDÙÆUD?åºÅÃÈ6¢¤ð÷ ¨u”¨x¹'2’ÆÅìInTŒ‹±¢ôêΔ®Ig͍¢]¹²QgìèŽf{ŒR%—冱J~ J£¹‰È*!‡R=®VÜET%Û%=—tÆb-òóƒ£pe°T€H OýÄu”c4 {“vFb× 5kQÐMÕCæԊV ƒ 9 ÏÖ´Jáºz*x’#⠑¾´~ Οý?Ïþg;›ÿŸ‰ˆ{¦ê@î2# ׎êá“hض$ºImœ%ɦ6V¢Tœ¾Ð´3)'R¶îI.ùž÷}GÏ:×`{«7°ØÖxu3V nLÓY¼=,Ù +T¨Ûnସt|§Xw–˜`f¨±8 ·Iõ}â[¼l/ž}ó9XÔ½mãö`ɘw +ÀJ0iìhZEüj,ÍñöáÑ¥ª•ýcd5©f?H|k °<+g’ù~›†ŠÒ…Ÿkp%óvŨ#K—eH|`‘œ5…ŠáËAoŒ‘J* `wãÁJÇ`°¡$Q‰'¨’ïZøH R§">0ŸmttÈÙîÄ74Ÿ|Voè'ÙFR¿b*Ð!D2uR‹‹ŽråCGrŽºY>×¼ÚÍ g£JBå[%Kr„ª×æî&ÑÀšëÆ$Et˜ÈÑíÌ~*ÙJ2øWõ`j\çŸW“T,íˆ+²úüó™Aq9Ø«!G¦B$wѤ Jæ t-ž $¬ˆIÙ´rR¶s•¨5‹s i° åÀ[kîêAWÚÊù3Ž-U Û7…ŠoÕNœTp(Îêj©*®ª‚ `ä*ÌMt$°wíÖ¨önMÂ×®%K“V‚zÍrp º¨t Hs–«KڔªÁ¤*Hé±âzŠïíd…>HC – +Ú5]|>—ûY­p3¯* –Z•®rVÓ*Št›xÊQ௷YUp@U‚€µ¥MŠüRÕû¼x“¤ø©{Á @žsÀS“í`l3¨5šOh…ÅC~7K-H7`ޒTé䨐L"Å@nþEVÀ©T­bûO@•ËŠŽ£om7$'ràèF«JÙ8¹øu1"Þú<öþ3moR]DX +$$Èæ& ¶dVµG¸ªeÈÈP4Îȑ!J,ª«‹ºã¤²“˨Ö"iÒQ%'õ3™ó–ÿ(ËÝL‹ülãg©¯uäm‘YAØ2YVFHʜ+Â6Q©z—1[Yò(<.f˜n“byVÎIfŸaPÊœÀ6`Fèñt¹AÙÛBVø)&°Û&w²ÿª\™žÁN8±í-nÉÞ#$T5âP¡ŒùNн¨ôŸFe‹‰\´4p69„kÁJ[6óãÒ•ÑÙ*Ü6‰n$¢»²k”†Ð¨Œ€ß1X&yë…[’ýKò®Ù©YíŸ Ñ“hô1S€`E¥lªlÍ¥xÓ¨ hÙ8ñÖÚ+Ñ i”à°ë”€EÁIÀ¢(*(û +;r©—ÉÅRq³¹àïpñrƒl¥UbaZh$i}Ôv³hEEØ(UiÈÅî:(1﯈ö#L\ 8¦ª¢ÐN¿t£¥m¥AIbŽd¨ ²v„ºNY¾¤Xÿ íÚ,˜^E‚/‚Ÿ$t€2mb¢C´BmÚaÖU(]"iNn×êÌøL¦¤UHê¥'éUmƒ˜ „ÈI¡(¸çð[ˆ/-W Dò}®)ôP®–à¬ðî(Ьh ŽpZgEf@cTÞ*³JR”¡/·¹Ÿµüþ¿Ô¨Æbð_n@ÝÆlËóÂ×c!q7ë~qN¯bXÒóéX’ý¢z +ÁKjí}EË>׌"”Rîژyªa`Ø<²¦Z24¬ 튷:X9ºªž/çä@J¬üI +‘•-älŠ+•KGˆ¬ÐÝhÐÐ\¯MÜ*l¾‰Êã +¤ ’r#DÊÒÎf$¹rð¥èj±!8;Óà¼4waGbý&ðÉTgnùDBt¦'ßWÔ4!4bµp’ÉTb¤SO‹\X…[õRæ_6b„üLXÊd‰(DÔøBåAV-Š@ʜDʽTÄ.3œ‘Þ¤Ö´Ö--ÇÛË!d‰Ê÷Á*“’YXb¿ 5V­Æ¯àhå\åÆêh:£h˜#5šy?Éç*)“à#ü˜ëG•ÊiŒJ®ÏUñ‹ªÙcåÏPS?Ýl×lœ +í+³=K[gq”uf5ݸç|ÛQç>B­p¤ŒŒ˜Ù¥/؁6B®×so†Aãø€“^M…ÛÁ#õú£tÙ+È¡H1˜ÿ<`ÙÇ"Š9x¬Xq‡{"€ÅÄj(Å1 Zu%òÑ\tÊдȺ +OR¼,QÁù‚VU—MŽ%²zý‰‡”6=l!ëòÊ¿>æÙN¬‚Ñ®±X*°C‚é0°c—Ú)'yªwrîÒUÂÁȏ5Ô*>ñ烈T¤e‰þ™*PÊý.æÌ@K`‚$"ìt²ïJe*.„óYÍ´[$l-©2†Î‰7—8ëˆÚ¹ìh®à!×çÀË0®Ž@öIˆ¬ÇA;Ob7ÉG þT„Û+¼žêÆ!IyU~UUCb$ˆô+­‰tN䫵BŸäÄêMkJ ¢lÕüý X¶¼=A‹®©9‚AŠªB7µdê»:°b^ŒÖ[À[y;†dÕ‚/q{Ò'Öê¤~QD‚éލœ £f MË÷ŠL𼩀—jÎö=TÛ#Õ2ÿ¹váGJ©¾äJ€çh”0ð¤e,åˆkè5É<* H­¤шST¯GJú€P+® +2Ì#D͈E’2i/TAT“IËZ¨'V)ÂÉë‹Ê[DôHÍ/ˆ@”TäC7SŒR˜Z®ðbu”0sê•pS©W,PÄÅ4„±UOªåzÈïCqPIú…º#;¼\Œ÷)`ðÕ +ºE<Ò,ÄT¯b³îlÆ.2¢KRh­x +)ñ€ÒâªҀ7=ś¥$:8ËS4U1ö]%Fõ3²°„ÎÑìÒù} W±(¢¦¢¹a å-×M1YÆۛƒ¢!Š8WÕ®2-ëã+îL-aƒ©ÈxuÄTx͈vOޠ͑+謨©$ûŠWm°;ߛ-/g&˜çß%ÅeP½FbŠÓÀ[ü3No•}Ì¿Ç oõâ9‹/ytâ2MÖ©¨hIa:8º!„oÿTà÷Pôž°_U¹ È•µt夞«Ú&>òàF)Ÿ*«®v:Z)`̛à<Ã+avÙFõí¬» (Úä„æjI¢É®d´Ï5¹›¸ û_÷6ºá(jLÆoþýîæöî¯?¼S«‘;ùÕ×77W«ï\Ÿ}{uñ»—¯/ÞË[ÃzC¹øÇåû»[î]onÛ°ÄW7^¯$Š9Ê5!‡ƒ \Ó'³‘ ƒ‘䥁þÈ©8œÚf¢HgŽD¼'˜ÐßHHf]íôl VÇ@»êDçõÒ׎Ü|ì5krvëU!¾]€R"‡}§Z×ù¨5FÉýÁ¥{Ñy-Ü4$ÉGlÛ¨‰E¸ å”HÊX#ք\&2}s)›ö&ù‘™µú j7@ ˆî‚57¢G±(º%(ýZÀè$ýN€’‰<¢4 ¤Áҏå bDÚ4"ÕëcbVKŠ4PpLú0y†¨E  ¤üs¬%)ö¥‡¬†i€Ü5$Ô_æ@DôûÿÇ`]2d©@ÑRÆiDRÂG³zþ}ª %凤‘|NN®ê5À1d|ûy‡$ºQ¡|e (ôë„l-þgÑÈÇǧ^fE;4²™¨ŸÌÁ +dõac;í NåãÐ A Ø8†ÇäwEþr´Æ¬ 4MAê¨rÎ`“0¢ÀîÎSù¦A})Aª';âk².mçqH½ô`¼) CÑá ˜“@˜ªû˜"¯½NŒùÃèÇÄ»IÎ e‡ŽÕVé!e;2ˆ=jÜ7@ +äë’}ÄÉ«UkZÒ†Ä×%DÎ)•`6Òùû„JOâ•é"AŸ ;Ò»Šç8ƒ¢x+c0ë±çû‰­ó +ŸêªÓ*„ä-¢fQ\mÓáà¹*j‡#2×ÞãUt"q”]‘/H‚§ =G‘ó¡WJãuTœ¼YÈÈIÅêKa"y*SÑPɚFÝÔ3p|[ <…ÞmJð žYµrS«Y‰5·ÔïLFž/Ü!#˜`r¼Ä¦º£áÈHL3f­[ʾaçp¯7cfXÁERõ£Ó˜Ä€H,M)¨;r9™ô’8ً$ rªè'|h(†H<Îl½ rB€J,7KèÓhçbÍ H ÄØ&DÈÉÊÄ›9ž0Z”Èû u€ Dâ®ZQ“½Š!!è¢j¡®IŒP{S*ŠQW9ªá\C9ÚÒáŒkžmU Lž.§!ë5i (õ É™ú=â6²(Œ¼\Ù¼dš}Gö°RøÌ8º0d39G96Z6¹ŒJ®É \æe ð¢ïexUÉíÉ¥r9rLÒ.ÙZ…›RL%Ï Û|<"N +âÉH WyšæGb*QY^ë‰w)áZÇrtbaãï©Â7T° ™CøU¶SÐ@µB:ۄEÿ @¯uRë°Z [1E…–hÛÞz+rɌ„ýҀå#8-˜ÃY~`®%³BWçìó‹däçïK’Ò‚<ƒlú<•˜Q©è2 K?åx­UQ’¨’ÂèDR8嶕š$ôøT£¿x]@MÑ´H#Â2«œÁ0z¹™ÄRã٤ êñb¤ Š‡ý4¢sô´,g íQ¿×(ŠAoFÀ•9gÄló´°½”Vx”2,ቼÉQÜO²2ìR\2‘•/rf1'%Ç1  ]-›RÆïÅöÚö¨“+êT¬ŬHw‰°AZ¹M‰Që¿úÉ"ºõZœ tÀc’}Íñ¿ò£Þ$´ÛÄËBÁçCä¸p…IY©E`–uâ䖨ªQ”OXY~eÝj¤€v&Zó¼0k™”­MÂB‹T®åà;DߔÇÚ*C¹¾Äo’%V¼­,™'€Õy—€rÇCõÂÖÈ8ÂM8Ô Gˆœ™óÂ)®ˆ$Dyvəž‚ŒD§@ê!»9µWӝÕDÂ,v|ß¤8z­>àԓ&W^Ó΋´í*¥P2®ÏÈB5JIUˆy¬L"¥ÎHÌñs®ëƒH1ñ~o%°5p] ZWC(Z[ìÇ[W²#cr“}¾?ùßdœo»@ÿ …áØa$äë‹uœ ˆ¶Gã.,(%À¶øQ“jYç‰N€ØqÁ¸Í$êë” R'Á4|D/«Ë1Ù"l_¥ kÏudјÞàdº•¸~ƒ¨!A@V)1‚jd‹À_PJÆÓÅB!ˬ$I¼%Ó§²¤T/Ùÿ³Äâ·v£D:‹¡N°,I +OjÜå H~_­Q¬º×jŸkM•¢!¢Åx)g\‚°F•Bٰ‘±r¾Ùª½+#ð&™€Æà5úŒ¯Ci`=Â*t¾ÖÊ©f‡Ye²C:ljDŠ+'î b97Í»N”EŒö[ìÀm،A¨Š C<¢×XB\_y.ª ;z ÏÖÒ´Ò’zɹF¢6í‹Ä„>Á/KZsp"ÏU#‘’Ú%v„HDn‘iKÕÍÂ"bFÈXÄ+) +S£†Ò³gKp’´ÍW¯¤[Qgù¶V™¸ý~+–t‚Â5ˆØÍÑì\‰Ô•ƒæ¨*+«0â¹£ÀJˆh.ÒAçt7Óê8jbÔp45¾Ò ã°|°ÐÈTöˆe oB*+6Éë *8²3HbNg‰ ä¸vz਩ ¡žX™ãJË”;@"«E^c¢$ö- ì™CÍ,l5Uƒÿ8JYÔ">ã*&W„ÝGEB%²Êôônc°U†¥eû)ÎWBL(ĖːH)ƒMÍT„mÒ¬RÙKâ¨Ñ¤´¸w +¤`î¬VÙ&ßüÈw@ÝÝ­©1ÉÂDqBZÄ@á½Ii@Zp˜Bã$0¾ý5DqÊR$PýÞË°Î5 F¢Á¼àLJê(¹uÝ+@±µœÂÆÇ%ÃWÍjhTe H$ñ ,åŒQâ Nùºclc‘É£†“‡8(¹–Ô)[œhD»›¸ Dԃ@(J¢*QҌ×`K +@,‰„dÁR †Þdo÷7ØÒ*Ž·Ö§'B:[Ì4…(A´ßLëçˆ zñ6e« Y$~¨Òî¥Ô k5™[u¤ ¨ºH÷JË Ùñ¼$¨¢s –²S¶¤M2ƒŠj¡+¼ád +ě-ÁÐùv¤×ˆü͗š²B üÊ"Ö³Ô*¬¾Hªh]§lq« ‡Ü"莆¥qÛìø—wEYá¡J .Õ¥JÑÊGØO,ق¬èœ÷> {ŒÝ¨òbå0I§±vòù¨{šÈäŒë4ÁTUU­]‰Þ²Êªíú‘¤m¶¨¤_%ÿ R‰J *îãJ×SFú  òCYñ”e’Ÿ…;³6¯ñoQtHj€°ÜE¤‚D£%JV¡ Ë"–%«±UW:¥À ßÅ +ßE +ŒÖ!` YÚìâ%ó©j¾5bgºTœ†ÊŠmQLžÆŸ¤, £phð}†j5`wYÿŠƒú<Õ †‚z”Xz0oŽr]d¤àçé‘‚ódUé€d. Ñ¢Ñ+z1©ï@}b:´f šN¬…I%”˜E«Ì±i‰´­´HA²L$ç³/ÇÏi +ËÎjí!È!µD"LÕB¢,eM#A^ +‹Ð_\qè”$嗄´J8 NBs q™ì¡DF )p)b¸Èê#ÿb¨¢$œ!OþE–Ç“y\É#•X+“\R§//˜ačC‚¢ÃX½EtßÓÅ Q”Ò¤ýõb·h¥Ád²ƒd蓨šTQÕé£p' é³Bôèf!Ã[È,ÎGM½Wì+“™ß¯ä-_(¼MÔJ!°pä9u’ùI2¦dáS4F¥Alrr!&-AlXÃFÈz¨µw)îAúÅ+Ú«xÄuÅzKÑ.œF/•¼8¨Tü +¬ê¨:R¼± +–¥`9Ø7̂©˜¨xÛk¬eµÅďÔlĎ+«©L?ïYe$)W=iÁ%l@J¶(ªˆŽ&¯W1ÇKA°àµV„ð‹7BXò­˜FuZE3ï{(2«ɯEëˈm¤¢:Š‰}|.+î\ÇAq§U,“Փ¹³ÀIiÃG¯I‡S•ˆ…[…‡ªG‰¼×H2ª$ èJæ0-ðG–xqôÔh@v…Ì—l\,ŲÔÙ<ÏÆE²»ˆ«›¨d[®~eIIÄÖ휜Õå £`äúZ”Ë4ô&ډàxêé8(~j£G‡ŸŽ”–hÙÆļÂÁ¹D6cŽ+¡¸¯RPŸ­x0¤HŒXHPF%‹ü”öG)]Y²\ù(H“÷€ju a„ þœ¢<£VaêÏ-˜%ÔÕë$ˆ}ºÒ¤mx/g)Ké8m‚ÜQru’ Í«ï$!섉’}F·`åå(Al¼:hÉ®¤kIÕ^5ËP'™;%å+¹DÑÐ:îmIøzÔy¦L…qЬ‰ÁAÚ`>@}9šs‘Ä  K^ŒI“™D^Š™šVp‡ùGª{‘EŽ„¨N¦¹È)\ØC+MDà±RĬ–r lˆÊ®Ù(¬³AVÈëmãã$œTôÊa¥Œ.yñ¤ds(«Cùy %Ê«:Q¬PNØsä:Ò¡¤  p~’C-Œ"&š0'Ã#㪖œ"i^BQ8J֔}ùšîŒÊN´åBº§̅Bó^Šª–øh²Ãj&MÒº¹ÚÅmE gè¾w$e%€˜³Äùƒ¾m1¾”0+Ùè.k¡½d›ÛZÛÙãÖ)‚Jà8$–ãÓBè3‰àÉÂ)Š8ZYHGAρDá£%¡)Ù÷^jY q¼as@׉n¹"Á¸v8ÞO† Z½HÊÔSˆ>Åbw«Ûƒ”¨/++‡{\k'{ôávô-ªÑ(Fo­½µRôÖ*ÑÛ*Do­½­2ôÖªÐ[+Bo¢=X zkè­ ·VÞZùyÕçMŸ7P{ÞVéyk•çMž7PwÞVÙy[Uçm·VsÞDÉyç­œ·UoÞZ¹ykÕæm›7QkÞZ©yk•æ­šßïÄ~¡×ç€ãHAB S7;NǗŸ¯±t3w`‹rŠö̳cc',iÔˆÎÏcw°ÜOÙ¢Ul4h\þ7ä­\|7Ç´YüÁ´AÔAP­}êVožÜ&!eð°EŽ½Q,qÑìc‘Í{¬E2µunh +Hû1%SöõòØIj¦l‡Wµ¦!^&V ¡Dç¶/X¿Ìå¨P¤à_?å CŠ²ŒåÀðÙ¦} Ñ¥ßØ"GQ‹€±#ž|î@¹GÌç‘À¹9 ¢B`œpÛ£:ŽCZybgqüÄOwâ§#ƝN×0DŒ¢ È›~³_¿aê4:"ÍMêfëÞ¨¾Ȁ£æ(I2&ú…V-§t"?8u†åa¥ÔcȨ«u¬ñl ‚¨sR*—+"îêèÀLŠÄ¨Mñlœñ¢ìPOŽHÞ³C@cÎ¦Ñ ÊhGLå »9û’Ñ—)’z¶rШŠnË95"™—“¡:wË×%k9uќ“$`i‹Àc +,w[%²¨ŽâmËÒZEr»!zU 9GÛ),@-V¿ÎAJÞ ¡¸!ܱèÕßUJ܌C§ié©è?öXŽ]¢ËfOu­«ó=ÕÈI霳Ò4õ{¤e F»1å;ñçLÁæ‚Æ€!˜”¤\mV1˜²ÏB£ÁEd)Êj1)¸¿A?F= 2hEoDvzÑè%„FaÝe·OkEg쀃À{.ŽjüeŠ„ØÁuR9ZV¹2îu3~½A?жô•¥CPÑÏ©8y”88j¬£•,oÕhf.Àu½°PÕr½ŸÉ]™æhòI¤^Žns†\˜iý=ÈN¤Åb—uÑÊ9bBerʗ6€B±õþš¬2sVÊ&®Õ 1ž;pi§wÀ¬+§´,ÅJ«ªkđ\Æëä ŽÎ¸ÚEœ6<›"­9.²ÊòÌ1d§QÑÜéÒÁ7 Cí"˜Â=á—2_{VÕ̽”Â’¢œuÙm½ï¬¹“z˜#ňЎC¬B'jN6G¢dé‚w5]®Cc¦âBO¬'T\šWÒúª2“K Š(¨lVý‰¯…Fu²w QhLB¯Æeiœj?;ù€ð’­K:ö `>¹'Ðh]´˜ÈLú¡âŠ1ÝÔAû I Ã䋊Úä䧩¯G3Ó¦Ô ­(šÍ¹ËܬÒI4‡jFAÈ«´Œú4"5J£ëµÍ¥»… s£×H@áÒ!nõ7/–/û ­Û„° %1¢1«6:õŠH#SÇS•§ˆ™Ï}¶ecpžDd…Á:ç<ªPÓÄÕÍfÁ9‘½ýG¬Êӓ$÷‘"ŠÜçX‹,Ú< ™ûƒ¹s£½/\`e£€Ä”‘Ì+È1ì\[=àMýLgZÞÌÁ0¸y92Öf(Ë(»Kîµ ¥%¹B¤`ãÄâ;}_. tۗ„аìð{ìÐø¬«ú¢²í¬äsVl3UY•Üꩵ}¸›|üP],cE|ÎßN³KCÐHy+-t ¼4˜gÊq¡ÆZ N]Šâüj\Ž\§aѶjj¬¤héšFyò8D6¢óP2©Ê+‚@ÅF‚Ê[¸8°Ä±ŽFÕÛ¢ƒ¢ì£D"‡ê±Òc÷Øé“HZy©©:8ÍXQjüª + ¹±ogèôsS£ !†%W Š¦:Ùÿ¬XƱd›¾A»³PnÓì›jŸ¥Ô‹V–µ9â~ǎ+aµˆ:âªu¸‘j …ñّޮÌC]óÁ +–Ì×æp±Ev‘yâC±Znë~Ï¡†À²Æ¾³’=5oò×5ª8&³ÕÀðÖҐúZ ]'àDrX•Ó!ì«aŠßû..˜òñär£Óv‹çQ(Šs;%Hӊá&úÐ-åÕ"¡Œ1… Ý=`~4-¬S’zžÇŠ@…Q iŠ…—r–-J´ÄUµÃè§ðRïcN/ïÐïmþ¡0íUm“Ô{`vÊňËD‰ž¬Â ÷5ϖ WÑU<‰f]ïà +ôÖ,‹Ð)6b‰"|v2MacX'ƒÛbòÌpA ºÞ¤hÖqHéínñj9h…žõěΝƒkÚ£Ѓ@Êê/P²¿»oÉz¬RÅüxi…¸ ô•¸]±G™isäÀ§Ê‚tdCc”Cxeê ¿BT6u0¶Hw'£Z¡¸rxŸ¥hÝ`5ô¹ñ÷tȏ֑fñ¶£š­×¿ÖGÑ5Å9Ê«g faø¡±¦þ›S·¹­öéÔèÄMÌ7ûŠ¨¢b&ºæPª;ó†7gÍ\íÏUù‡h”¯¡3¹³:H³ÜÒð|œŽ·Pçcý$¦$J@š]¸pl­Ã-“"5”>8õÍ95ÅE·ÎÕ7¯ƒ`c¼melEQ£Ù ° ðB-s›€A Ç´3…y¯áöq$•nºÚ[ÿ‡LtUŒ–ˤÝk99•Q›h¬O%¼l³-Kä˪P§IÔ藗™Ä5ióJ™šÒN|ìꈋ²¢ƒaœí¬§3 Ì7e1 {´É xWçÐjPV2^˜ Àpè5‚¹U,.rYÞ`` 2¸ :yɚæè btÝ`ý%œ4¨õi~j¢±ƒ VCTáU؁¢]ØüY3|÷ƒWql7JG´‰Z­²SÄ ¥Âd×%ï3Ù:üÑóF釉ü„uŠø@ûZž/¾KR‘dÕ5æ`Ri.]Jfu' OõÔæíã“3•~8Ÿ›Ol'üß»8†™×cƒ€’å„2¬"ôIΎˆy.:3Rp»Y8uˆR7íe¤‹ÞÁë1 [©Þ¡õùl–K¢zJ!ˆQ^ëDp0RŒœs AL]°p6L}4w½ÇŒƒ¤z'PÍE ëî9‡¢!ê›\>äØ ƒÂ³#@ÁÒ>E‘/îÆØ%@Ñ¿¦ï H{Ó4ÄÍ ç}(%ÈV/A8ñk ëLÛTëhÊPäfa°Åãdó> ?…àØýäX¹‘T½@+¡›´ÖŠÖá¶ìš™ÈÌ2W»)ðO˜n0ewÀ< u€Ÿî€j¬âvÁ?ew€UŽ¬qLÐ<‘ù3óŸRŒÀƪâå¯Ò’¯.Yu0‘ygï“hîÃf§MceS° õêȶG¢Õ?ûšZå6 ×j¤Ê˜]zeåLZ„Bº1öÿR/×ál$á˜^²çÀË­n69ûō E`oT'y°ÂXËùµA2÷ºÕAˆ›A¨g—ßGÙO6æ(ԔÁ +í.éQ)N¨`ý},OHMßDs•1 + %b²9gE@x¡8z °UkS´‹Š +©&¨pìhúàŸ°ZN?•h +*jÌs$ ôÁa”…×9¦ßÎÎíàl®}x`•8•‹ðõÉþ=‚ÅæN®øҎj%ó]&AZ>ÐÜ}ÙÜ Ê-DkeëÙ0¾(V§¬¸ð ¸|áåO†`þ{µŽÎÏ*ƒ>6¯"C õ ‘ˆÕm*Ý“Ó¶¨Ï«ÑÊ®˜ .[t]Õ‚¦ +„}êãò$T¶²é¦ÜñIééhìƒy8Eð1R¹5&T© N¦ŽS3B†"–Lº” 5O”ã +úÆÜ8¡*Žm­ÌÜÔ#c  ¼8ß)ð~™­+cðŒrٚÿœ(õŽ©nلލ&·5 +ÔzŸØ6Ëjx»µ`/’ìŒ8æYH׬'ž½‹{x‹O×6²D’¨Ü5Ð"rúÙp‹™ªÒ$ú tê Rˆâ÷€ðLV Ýƒ²ïz½€ñ✘N#e0SÅ:Ýx &•'3kxåI9„\ßЬIxØPÆɪX…4·˜fŽ•IÊ(¦Í&ì11Œ]«Bj4žå5§êJY€¤¤VÐe4«˜¾ â‰dƒÁª±‹ô­©ÆJ;ˆˆ€ÏââB&›ö I[g ßàÌmàȉqCü×Ðñæ º L÷>Ë¿‡¾sˆ(õ§m!äªvL¸Ê©‘\…ZëaŒA a-vÓJ"·âʲ),KÀq{…›Û{“¨b²W!Ÿ„:?CzŸù>SMÅËrxÐÀÇRÍÄÚ~ñ¹vå\Qùí+¢ÌV›XÑÔÓs¯‹¼¼Z¦jüFã 1´¬9€³1;™37!­¤³jÉBä.H`˜Ù¿¯lyÆy÷¦«Ã;›<“ý’Y-E´ +Qzö‹dTÁ©1® hšêÉ.RU5Åx¶jJhu;óL «°[Ý¥¨7c ¹ +†ÙÞýÐ+9Zc%‘»•(Û¢ٝêkh,Y¾”ÿÚ[c¥¾¯uXš}D†,ÈT”wuqß~nÚÖ@ݝ,¢¨:É« +Ô*ôz8û*é +Øb¶ykuÅTºì@Q(^æ‚qéRCœ +ÅÆ.ˆIxíÊ¿ŽbEÆ`è;:MáÉ£›œà–Ä¢u‹9Fs ï·¨%Üå%nnû2Ã6àÙIøHH<âj±nf^gÆõ:I‚ûJۚÞ§ª¶>躻ë¤ñªY¸Yäcà–G›·,~”Bú}UîO°vPu"Èc·Ø¨ä Þ³«Ú .póùŽ²Ykœ1è^pa¨„ŸÅøª ʍe‹„'‚ê¦dŒ*f”Ó9ÔÝË<€ÁA=#[R˜LdÐ2ąb V Wø]à‘Wx¦FV]f2ŽCôÊ5qnÒÄÚö‘Á]³{*¡2,92=¥h”ä‡óW ½hÓ@éûMÂ7é6Ԇ}rþ=‚fú”¯ óßWÔè(Â+½uìEwÉ$Í ÐGÆ:ʐ-\Ê„·¨QT¬ ¦_‘8¨‘µÁ ¹ڈóÄy;èޝL&w‰«3èœ×«D[hr2ýmÍ%šS F p*ÊÐjd¥LµU{áâQ®hŒSOQì„ý®ƒPŒG' ++H!ªcRÁ­­óÀ5wúO}(S‘†ÍâÕÐå¾5*tVþ¸¾YÌƘáY9ȄB‘ßÓÞV³‹Ú "MõmÞý{ò9ªÉF*œŸµ½ FÖ$•X©vÊÞ0º'Õü}é”„ö2´Œà벝Sã)G±„HÌy”ÒI8®¦j%mD5J 5LŒ¶TÈ\8å.EÛ«X’îWç«"VPsvi_¨(¿»¨÷K]\üv´K…’ð$šk²÷•n¤µ9G3rˆ¢Ùé‘H»3‚7Ҕ¬&$Ä©ÑLŽÈΚÚ(:ª9Bal–ºÄ\®~mÍ¡ô2ó8š»>¹"¤Å،̃°ÂÑõl³«©­öá16ڝsxv×s!C)Ff–JoƒÐÎ-ˆDÝRñkŽ%GzµµC;†Bá?;A@;çžñ tdz1eg<¶Dp *Ö[)è¸I}{!Tžu’À .… !ê‹Ÿ×IS?ñ€È—"†,Ó#5ÙAðg§´Âþ•¶T[‹“Ò–P¯4‹8iSu!¹0Óú1S;›¤„:WQdi”q•6Ÿz¡Á–:-iE{LÝ3QPHUƒÆ mG„dnvf/æ UW/‚Æ=)¦S•H¤Æ¤Ä±É©¢ê I8\q.(„¾_d½º÷eéZ3“VäHBÀœyX!ûލA;E6Â(بèÀe Ó¨û$šK6Ð>‹c[sV\ÉØÄjî"ÁÍö¹O.#Pc„j¦b¸X4vµ mëA3äû7uv3CTÑ\Æež³™Eˆ%®I©Ïð$¸TŽü½ö܁1p›)o4Š¡qõÁhl±Iùà¬Lìå͙ lGnË>Üy4¶º0Ú=9óU„ÈD\X]†ér‡Y¦ ä9¼A9 ìEÓ9ÛD3Oׁ¼9YÌBºrÞú"\¨=û N©¯b˜`áŽê.Œñ€¡¶cîZ¿åîêìlEknxÒñµVU¢Âq‘mÆf%~£9 ka‚Œ ž2 ‘Ž +5…–naÛmÅÏ|]^ßåkÍ0ìZóÐ,F„¼[srÏ\‡609릍ɘúfcõ‰U^†kˆ\¯¨NnçRR·+³ŸdÅn[á¹ÚMÛÆÞè¤W§)æƒEáî+]Ôɺ¸²QþÔ~-Åf‘LJÇ 1 +˜Ha·A%G¢ÅKGc·1ݱZ8:ʘ[å¡-WW• +N¸®]ç±Yž +\€†ÔÙ_o­9‚Ÿ „ŒŽäu& L]:ðìÔNfàd +:­(¡BÞèY•îtâXdž‹»&ž§±Z„œg +Õ^ªp‡/¬¨99þ‚j•±F­³‹›T²^”“‘ +—K] Õ¢±™#¹›&w`Ôw&••pÈ q Dm’9_Ç@„ G¿F (ùÃ[l¼VÑs9þátã^øŠIô]µ8´ 8ªùóì,d‚>q¬ÃµôÈç•öЍkB}QòŸüì.>ËÎ8S¿pñõ– qˍ4#­Ë€§\§Á†nIm`ý¢LÖiö©qnz˜¥SUR•F0ŸQÄ×¾Œôl´ƒ²ñ!—i5Y×7ft$ìL³æÕ܎Ê5b³-Cðc˜â& àƒICˆ`¶mg?íä¨!i©G˜õ¥ÀŠñ#¶ À4/÷c4û⥂ނlÃWO®auFµÕÁ¢Ž—)Rß«Jˆ*»Pó¨Ë]^¸–ûˆ»’y¤Wsì¤:„ËaÙ9°ìš"{j|@mš!ü·J˜åì$gsb¹è“O¢¼À-StDƒš w<¢su“F·}^g,’ÞhÄ42¤ç˜Ý@#ž£„zrAü“hVÜ Í0g£¹Îñ!u0„¶³ÐSߌíðŠF-´QÎ — +Ëàéžã³°»¨‘â†Ò.­ ¬3Uj\U¨+R]ÄMÜŠÜÄK8æ©³ +9zqP۟„¤Ó¨1+b¶Á&¸ …¯#l—"k¹ˆl)…=Á›Eԇª¥yvuErÆÇ]QÇ cs_z?kv.ôª4š[Fð˜XÒ·‘€ßü§?yqþüh«¯Ïž\ý°÷éÅ«Ëö¾=??ùˆP‰ËbüÛÓþ.Õeo,R,-ÿ™Rù"íþ§Ó_Ò¢,‡øóaLÃãœòg˝V?ø»h Ÿ§t;©ÃJjÎÁü‡pôâ¿0ž[HnÀdÿd½÷õo@Ö¿Yÿdýõo@Ö¿Yÿ5YÿþƒnчÎÎÏöú¡Þ®÷ÜÒðJšõÍы½/NÎÿxtq9ë-q/ŽöÝÑ+‚í‹â'ƽOÝlÎlrå1¼dÌîÈ_¯ U6£7KŠH½vHß²’H‡ü¼Q—`6Ó:ý틱¡zohÜÔL9 -=ê¸dó誣E¼¦ç;†¢vòؙ±×­“†:—™©±o% †ëJ+#Š\¹èÀâb,LÜ'9÷ØU§sE•¼ˆ +¿ÌÍ)Xì$4f¶§4«zg‘,%òÑy!gRIbÐ9*± W\ÏæöÚ»ª–=áXÒ£ã]BªdN4.´C{e Vˆ´¸YNU„Ní+ºâÔè20ôÆXX(5|‚Dû ¥"90”‹k”ê¢R¸°©*›´ ¤|ð7*} ¿¿bP]ïbÈCÇ TÝ ZÁ’¤”dûÆ4ÕjT5ôV©«̏tìPKUALæ1†t;eÄæ–c·#ÒØUç‹å|î+”Å8#²(H̃ƒë’ëM²ŸÍ«6Y«éX,íH'ö½Há'ùÇíw 3ÖÑS6ÄÎÕÎCŽ¬gVØà¿!nŠ`mÉRQÃ[K‘¤Î\/VR™Éµ{,[è‚TXcܔ£MæÈæG(’e-æ±#›r63dÉÁ9¯Îª‰2՛3ödÇbå@¯,”.p8Nàë§JqBž@M+Ò°IUÑӍ½•ayc:FËcۖɩSáEtFp¡1©c€@9RH>#Ç:enqžÀÉt¤c[…Ü·½ž‡Ø"Ag@é¨ì+Á¬ô­÷l0/~Ù¤8)C×$¼Ä!óïåa¹Ì´_Cã×flwZ÷I@é"eCíä¤&ˆ#¥ÔG%ôNç{BÀÑÞ[ɇn”}ø_¦F„ ÆG à”§¶k`ÝZµµhþ̳9\Α# É©W¡ˆF6…(õ+_]šh‚N©FJ5Nv³qRÁý)3:Öû,~v",˜Í]ŠÈ‡ütDJ#ÕÚ]Õ@`ð³!#ИãÞá#gæÚ¯8G%zÀ¢J”ðÁE-sMsvÁ‚ ’qÝ2.ATëݚ³Ít"p¦€JU+¤±:å àÍÓܾ r±pˀœ +ò©·¸¬N¸ ·Ð‘«Ž Ìöâ~¦ʏ Íi¦I¢1%w w€zc6“‹È¸aľÚK׺;uY’ç¬lø“˜ÓÈÍé)—š •·œ1 Ž ð±S‰MÍ»µkš0‚cS²“(zÊ17ý º°þ ¹®ë”N¥Ïœœ77ÒyXœº¯û«ªl{æ‡gI*ÿbîv) ²†¢/[”¥yÀ×"ÝY.£Cg‰ð9”¼M5‚I‚fecé TôÅü¾‰Ì¶ú4àGÆ7o²ztj}d­:«ûkÑ`LJ%æSòÀ±ÓÅPVÂ¥CèpúfMciÄí òž¤À8H]£ÔPŠ8r¥‚6}@p‰¬Çˆ^ÙŌ®Â\e úvP¶˜+Úp;0nÀÉ¥•§Fᖊˆ¸Òâ$HQŽ6T +”€Ê[ì¡Ûi¶¨|¬´½_8d(A\LÏgu"pt"ùŠéGëvXlÖ{ƪT Q!ªC/Ê€pv^wX¢¬ád*Õ—’Ð÷qh•Qęx…¥“‡ÕZù-ŸßêT +¦°ºÙӎân•ã0†µúL|µŽÏ²ÚØ"Œh…’=è'Ûk …œÇŽã­i÷nAìé’¨º‚åԗ¢â…Tĭظ)Ö&z8ÙÚg¬Ç›¼¥gj®ýIåŽÑ~¥6±ÕD—cli•c¦ûÉîÉÁ¹îÔQK[ö)ùk;T³º'ïÈjÖ`Ný8†Ó3IGÅýR‘Xµ^™Ð²Q užz£z~i£8sÐ%'Ü°¹“½T]wÆ"Hgl(U) y¬Þ|E·¡Œ‰A7l–^B#¢°_¯Û3•åDc æidûh~auNŠÜ.“Éž9šLhÌc óÈwMq‚ KÆa=%´o1ÅàBÅ|Ü4&é—õµ†Ý"A€D2ðè6»V¬WzÒð¤S½2)f_{™Á2a›á\\ *Cɪ,CΨ`S–V•{ Zæ8®““„3¨Î°a99ÀÝõÂ!bà|É4ØNœ yÒ+J×ò4ÎHí|@ΐ'É]’O(ˆxXïWQïŽ=9ëÍÊ¢DÝ者'9Á©OKZ»fcNµ.Žeǹ¶-YEçPB ¢>ÊkWpRn~ÁÝ¡*yè3AY®œq›û JPŒË2“ýú\žD}lgݟÚjʜ â™Î’f@·ë£¬›±‚}qg+àÌj2lØ¿g'ŠÐÞçUàBg4Z§lUih±h}¨jdÇP¹]†ˆXÿ¼˜è˕ÇÈÆgØDþûěÈÒ §­„Q]ßt° ÿ„ŠÃq´II¥M$ mׯþ\‘]$›)žN!Äz³Š‰€y!ܪ3³Û½£[ÇB·ï·7ÔP%t³rà V‰IŒ—ቁ;–¸ãÞtVФ8Ž÷,!±ç¢"Ÿ1ðêڇȚ}‚^! "l(Ç ·ÝØp=èÚkål#zKÛ¸‹` ›«¿+nÒZõ±^VÐá°"vm}?û û׿|‡x!1 ‰Â7±¶–õúF€Žٗf’ö B귍q«rçYøà$û7½®@ü~muÕå¦Ï*põÝ÷»1öWŒuçÙõ[kÓ_v¿ÿiìôk²’«FWÂéæԗðüˆ÷ §—Èjì'7FPWŒAÛg®æí³éu§‘#ˆ/[› Ò¸é´k¹‘›tá³ßìγëg­^›˜šÁÜuœ²©oÎãh-Šå萑蓍&Ï£'µ›ºMc\7©“~»y}­×µQˆß¯­‘Å°öÙ`µ¶ï¯+/ñv¬›g·ß^ÿþ˜—1®Ñjê˜Óp[P´¼L^CµL‰|ä®( +š¸„*Q%ÛÆQ҅ôšà7$’¶ó¢- +*×£áUíÑajeÍL‹`#ÇÜ<ßÒeÙA•-, +æ»Æ¦¡_›LÍ­)xîÓo3•î£µÚáÓO?9<|uúÍùÓç6©soÖjýA§a(Ì£/cš÷ûvkuæµ@ÉùÔFq—Ã#Øî‘4¸¹©Yc(õxY›ñ_èGÎRÛ Û5Eï굗sS\[.Ü$q ϬÈão[HƒŸ|‹/֛ß~øÁå;Z—·½€P÷[djÚ­ñÕj£9òˑ%7IØoæ + Þµ†@K«úKnBuàü#ä”3ó‚/‹­ ï†zu1îÚA%Œ“Z©ÖO0ù6*ðÞÜK‘çMԗàdª“B–e.ß:ïêظs©uØË°c~×CÕ tU>ÔÄ)‰IŸ£±EhIÜM×:~æ§k $Çÿµƒƒd³5Fu½LzôÜÀ„8¬äF‹•øª‹Û 8„Þ±›sðÉ%`SéíÛmZÌ3ŒVó1°8ël›ÍGg[ù=²²[ܪ¾|§ƒÚ”¥>°G)Êh¿ñ&[n4Ì)"³\Cd¾Ö€¹§"ôÏÃ6~&¹ò÷v•”0Óúøí+©$õ\l +Lõ< GþT-˜ãޣζ‚½]°ªIèÆæYCáÁ<Æï퓝¥J·^ØÒÚU¾¿Æ¥’s‘™4Z(…®ÌÅbAÁX{KV´üÉæVc&ãC‰<ž['àý‘ù}gî ޙ€}9½Ñ\ìņÑT»>ÎnkÉEß##&Õ¹\{–•¡õZ¯ÛFŽ :X›§¦´^Ã8ßÁj±ïŒv÷Ùõ»Z¯7æ ÔÈŽĞ‘žpz£ys¢¢©]qdƒí6qœÃ4Þ<Ûp|§Ïm#߁ôh·a5¸‘zmn ‘ ±nž\¿iÓçïÇÄ$™»”¶•÷œëÜ;‰)¨9Ëïžén_,d!À©Ç;ýî㴜âEè.Çyï6ÁUúç9Ž§ÑÑG^•ðè˜Ã;ó6G„Ýá;ÐE'n²£¸!Eâ ~cZ‰ÛÀYRS=pHk¸Ô™\„K7©æÔÃ"©"}·ÎÁ$e¶K›Ykázá/žeÈZ½öÖsV— ^5KÏ2r™:@²„DóüH%Âôýöú‚‰¨táô‰9„sbŸ±Æäû‹ê[ä<„‹¨oГýh¬ÁB Š1 À|ÃV +Ü1äÝã­æ¥A’ ¼²(èþ9ÞÄۈÐÆ!Øf¼®Æ–|ò¥WR$ð‚Ä5à]ˆˆ½Ìɞ¯Hze”›*¢½C¨ÀÁ̞®¢Ä‚gž„œÂóD“ãÔCuåÓ&q²ä/’pÆVÌê@ ÎrH—§ìR^éÊ‚×-Û«#f »¡vBÎo[´Ož<ÓSªWN { …ŠXYrØVÑpwfrèe¥}‚x–Ðk>ÉjJòâÇ'8ƅZ<€<Ð* +Ó3ë6o†+ñ5Gˆ§oZO]s ‰MN¡^ZÜèYh.•–5òÇjä#ö#ë ‰ þŠÚކ{=‰‚h©T‡©»ƒmW£y8{Ha×®™>µ«(µÍU:”™7C]}sˆZ.˜Š ÇS?¤¨…Íš …kf +Ï +.ç¡9¾]yð«æ¶a›÷—£ÉžêÆö`jžýII»®¦,‡…âvUc%PY6Á$sss £X™07ø [4_X¤úÆ%£ç—GWWG7êE©2“ZÐT'¦*ŒÝŒlS)ëuL( þ³GÌ5ÊCWzx½(2J•~Q3pj½‘¼l"œZÊÙ,P°Þľ4¡@›J]„tÝ­.À”Ù.t^ݐ7±D];Qv™ŽÅR†·{khQÏ>¨B$5.q‚ò¡aÑÆÚ$ªjXõAæ.j_ÒèŠ ”KJµ/¦ùë‡ WEjNߒyÓ)Œ]•îļÅR­æ† ™Ö@:¦PÜ{ƒ°sÔÁlчg«+‹R”Ñ:×¥H½|mÙzÀuÒ7¦á®ýtü ŒÙ}¦8ǒò2Ò)!cÄE†¤ê ¾+=¸k;V•/¤°is@’ofU×èØFyZyŠÁä‰o]à o’·¡Œ +1©Ì-Ÿ„a§åM:Fï’M¦c¦[(; rÕ;¬KÁå-$ægÖȳ²®ªÑ•O­g;g ±KßT™T§DŽZNwÎÁš;8gN+3 +A]ÄmSEZ³vjí(BòÂÍBõÞbBp“"÷alsÉQ'å‹ +™2"2OZyL¹gqyÍ$UxfÕ 6ÈøÅQ ]ؐú$"‘JU°ÀKÊ0qØ[äÖ$‚Czr¾”` Bʖi ‘ Lmœùá҅9´<ƺT¸ÁO-¦œ=OfU³Õ–€/ÃÑuF|ʪ:‘H#-˜âB5ƒ}0ÌQÊP<ÍÛÅdT­¡ævГ´Kû!ÜÚ<‰[SÏI ŽE«%`%7‚êÙµðAq;ü@ųF\ê§ /'­sªòn8® ›ƒ§ÀãÊ+=â$'¡*;S1À98§H¨ª…À¯\2Èà="‚±. ²Ì‚÷ èX}Tç›]¡«ÍyãOë0ŒšÈa#)×(oÅ»\8‚ì*‘tfW¿Ä&í„GÎdiSÄ&U¡‰ +!J8u {(ˆª±)ë“2å3m´&iZ³ÜÙ4Þªòá à÷0üz|Š!X=²~Œ²â0®”=ß·Âó­í‹ïTð·tiÒP<§’„fSÈü‘~xóJEF+è%…ÞDPw7$E|…?÷íøÀNÖ}Ìò¬>dȃ`à4²§D…‚ô`¤b]gcÔkkRd9„7ªo´í¾!ÿ°¦Ñ<ËE:͍I a)±³ÈŽÆMêº Ñ"—ú,üW@-Õ(‚‹G´[ q8¤O!\HØ4„-aÂKÔȊð±Y9ÊO8ݱ¡Qî¥`­¤÷ª‹QÔÜ +„ ¯ B×yÝÁ«nŒÒÈÁˆƒ*H?0NJÆÏܵ¼Òn +ȵ@dAçdü°ð8€N[œb(ÒQÛ®âJ‘ô¸™ÜªYÐûÉؑ8õx=4ŽÀÉëÊEA²@è ˆ•„¼Ýv.Ú¥d-E³ ‘Pš+& úz´ÙæþÑ&ìÅQ´Íݚ”eæÅyh_邳pÎÚVŸð:Y¸ÄÉ`¸,á¯#‹Ã`eScCT2$…ú ¼×ðȸ¢aš·j–IÔҔÅ)X€¬>5ˆ##‡ø£qåUq<¬P]Å Û¬á*ͦO1Ú¨‹Yi4XÃ<©òÁwˆª z Lls0Røýk'Aò±¢ƒ‚!ÀA{ƒ0ZA¤Ú¨ºñæw+7ÅVH}7é>á|¼‡©™dW ÚÒí Ã|JÂÕ]\ãÒʳè‰öUªPƒ»Ä™>ä}ì|uÖ!#×H·!JA¼À3ÅU; +jN}(¥WŽ“¾Ïàú BL‡òQçb,Á@›§˜š8†â背ƒ ..S ØÙK ðÌÂÎfM˺;„ôM¤sN<óbšÊ"þ  3Â6›MTÚ0r$c$b1ö¶`‰ÒʑS”`á2ÑéÁWã“[¬T咯K¶»K04ã¼õæð<õæú¿I>!ô*» +&û¬äí4am"õ";‡Í.í¢[¯fkfYz.^9‰øª)0߉;ÇÇî¢b¼n\ՅRUæ?Xª]xHBÎâ¿ãÁ×,ÌYn6zþQå,¨åw½ê²y>FYºR@+×òèÙI´"¼Så.D½ä,ÄQ˜B=~‹KK:L–'ƒ’+(ÓǨb'Nç¬ glÆ,yR<2âAÌVöÆU1 ª^ +Ï +6TÝ\šÍ´ö3´Õ0¨%ì™'#Ñ +)¿n‘ ­ôŒüo A¤nS7Á#ÉS8OªŠV#u^]!‚‡î‚=‰$[´Íchŀ¸h‘F•µÐ“Ðsðž@«ž¸r³#)ºå­ìOST<³²1K‡¬Õ‚ñP`T{Z¸1©dv£:¯@uêZÚnÌÜTUÕ§ùµƒ +È@Q&Ñî&˜ö7U#àÇ áúC½ø0×.©M‘CõW„,J8¨ºÆÌum*á0k(@¥ÄÍ»I5£«¦$ªî]IËòË°†Œ'HÚATRl:ù|¤b3ìEIåҊ͗4Tj|p—º2¼c]€T ³rpd&™/~ƒ2–׉9á`ŽRÌÁ´jÙ‖¥RY‘nÆÉ¥ bœ$fªËp¼‰€¬mÜ몋ZÞ¹§.Ś—NT9• ±Ç£XúÍm؊$S±5(¬Æ·Çq¨œö‡¨û>.)z94Tæjy£ðÇŀHÈ˟Ñ`U*$T•ùö¨¢íôÅÅ4' ™bÙöÈè œzÁqÜ×(h½k×\W#^³lE÷[åEښ(tÖÙ"ꅏš^̱ƒQ²©éMÆþ–ý­Â?9ØS”A*’,E,‚à5ƒ¿&ì`*é^õÑ?õ g±ð³Í6ÒG ý4„¥‘HžL¹ÄçÁ^,@='‡¨jP²/ϳ­Ç ¡¢;ºÕ8ÍC5)*µp“ÍÂo«#䳓sÅî9¬áòÀ½ÒÙ¶Ãá(‚é†òéÔÀq +£:G•"˜G‚AÑ@ú¶±Q|.´º8¤§!~&­iоŽ¾‰Á;­S£{Ýl õ²A#²t#cwC[‹šÆÞØØ5 rúÆ9%DÃʼn¢Á[YØ!§ˆE%e¡ë¨ÑÌ¡³YþnèYÛ#}†4Ã%*–àÍÐg6ÁŠ·+ôÒUå`õe"³v‘®\r@ý£0Á×FFjPøÜ<ÔÏéO¡0ŠI†™ÁX¹¸U…æ9Òž…Σbó””Ò­c<#ŠÒÏÚxšŒqC<ÙZ=1„笜ÓØ9M洞8dÝh‚…làlªÑ/X—Y·2íÊÔµÓÒ·ûÞJŽN˨ §0|œ-EÞ`Á ¬xëe :­N¾æ–ZfÚD á1^Ã9ºµúž$’¤˜¤éªŠÜœ7…Èpý5؇>ҟ«51#ÆÝ ‚M|¥É”ær³‡©Af_Uå"Ú=žÅÔ·øÎ$|ÐeÁuu“÷âà,Àœ¶ðüLºá´bÒ0¬ƒ‘F— csÁ  …ú†E1RE 95*±Üt&»<³£2€=²Ž€@øDœáìÜûòŠŠU–9QHG#]¤–}óëÃؑ—’D?Ò¯IÖ؃HŽ-tÕp?ó„õDºÑtačŠÏs|•3Esp³Õ 躹»aÀ-[Õm§;®™šÁFᦎízÊ)`€áŸÇç%<@£ñ¡¨v›$+@,ž¦éå"I*%¥k¶Ëgþ6؜\?„Y¾"‡ÀæÉF™1ô«©¡´Wб¾“‹ž>WøŒÀËa–ȲÝm5n š'ѝÉ.Awêo.Æô#'4ÁÍ$<3w˜¶'¹¤¨)æ¨5MÃ>gø¥BŒƒ)tÑOýî”íúï7ãAC–”ªˆwjÿŽpà÷v¶vCo­bJòɧàÖÕö³  æƼ ŒdŸ^!2M6ì(™˜¸^⋡¶ ¸kހša1˜Þ©ëMažä<ºÐUBV«á¶»{õÓAk fÉȨ¼ýš³‡ã§×5;ŠL ,R¯æ¼Æ¡nmNá«Ç櫒àSßX©àq'óTÕ¸æ%™£Ì¯«Òɧ‚•±í_…š +”i1XØ&ÁK=—U̎œàî#™¥¾¸¾µtæ<Ñ˽€Ë³Š¥wõ`Bc/¥™˜-|}…UëQƒ-'/†lä;ð‹“`»¾¡¡Rk÷ÿŠ| +"e¥3蟞•É‡F¢øì(1ekdUIP"¸Z­Ò·êù^\®î™ˆìÐXæÒØRåö¥2¯±4‰ÖGS9࿞¤áwÊòTHŸ×Û +ƒ¹®dZ‰4¸†ÞÎ"Ž!<›³“§°>ƒó+š»O ›“^R ó¦Ü§V|€ 뎔~Å Ñf^&+^µ\Çxk¥ÆŽ U¶)‚$8°“8<Ljt_¢†ÿˆÐhØOaŸBÆ1:"²£Sóú •iò ؾ¸‰#¨¥¡°¹EŸ”MÝH^®1Û=FðŠ„;²øȆÁ¬JiÄCt} b Øóà+é­ +w¿†•ƒ÷pŠÐm[N›DÀÙûbI¬ë÷‚\]n¹*e´ÔGú6Lã¤ÃÍ4JÙ)­&èy³@¶lW¶uºÎ€Ó5`Z²:[ŽK9ì©ÕSCÈ«wu4m†EB)a“²4öå—ŠrŒƒó^¸†É9‡v;ç-u-ߊDzR|K„F„¼'à+«aŒ¡\RôVvÁžÚÿ¥*Vh5º±Ç–sk/ii‘ºÛ†Ù*i•"cvõ&ç,7Ç\¸¤ A¾³2Wä͆ÈuuŒ¤ÉàÃÝu.‘꛲:y²ì¸ÃÌ[ÖºŸWÉÛ W9…˜x›“•ðÀ~ìô,·«EgԌ ·Mi»ó†6~j=>÷ü UÉ-ÊhžpÞ8Ùi7ZŠ]I…+̵*R:ªe̍–¥ô¡½× ¦@B'¾."q +%å¦ö5­ G’ʁtns.CÄyN»üúÀÞ… +éàͽ=‘ö7{* Õ:ûwÃX«µZGõsz\°M»"GTsL$ì Ô—kš*døœj´ò,¥¾„ƒ†¦º¤‰è Ü˪Ϡ +Â2q3w tè#:܏¼Ísî"3x\¯7|†ÉѶ‰?‰<`r§F4…-/ÆcQÕwV?‹èˆU +~ñ#PcDǘdP^‚Zh£ƒ¡÷E™­ ¨‰÷í0k¿ÖöQÍέ%©žnS«óÜqkšW4õ‹Ò`CŒÏ†̬àâv©Æ¦j>xX~Õî +{PyëÀÇçJðQΡ/á“LzÍz ìÚ ò“ÓÐÖt[.9sAB=H +b5JY&·5°C'§3Cvê@P(’­4–_z¯BSN56ÌPSS¹î^Þ´5HÌ`gjCÙùt½™à¡ï¥õ6b¶ö»=nü—~²1¬› ýÒ`×(]fÈPJ ê‚9t+ ˜ÆoßüÔnIÊOè=Æ h®J"¡w†‹SÚý4¥oW=ìrXå‚NÙ8uôî;M„z¤"EOŒlÄ ƒ +VÚ!ßpnJKˆ€·X¢” òwXƒF®P +>#빖:kì[ç]ÅI¾Â{èæ÷€²“`é"‡°&|•HÅ +ž<͸ü©/ ±5œ­Ár2 ±ÌÊY)É~ |½–‡aˆÐ?S +¾g°ÿaš 77+´8@‰øcH)¦vi5ßí¡)œ_Ù¯4DÂ{ƒEŸ 'C!7Oàbüè +] +„a]g"\ú:1PÃíûL¤0õZš¡|Gª³ƒ'gŠÔÑnP™±JòFªIR6Ó¼ÄLycm’S+Ö9³Y(˜ÓæåY–o¯OôíF€³ h`¿=Åî$œDýÚñ秾eÒÀ ?™Âñ ^Y¨ué™È‹K¶§ËðÚ°éy'<—µ¨ÀîÄƒŽVK„éjn±€´Lšèy؄æã€b b‡ ²„‡pf‰R—õd՘˜)ÿÒðû‘I뇔ŸEŸ}?5ðóí퍐 ›M«‚c»ŒSï¢ú¤\S²ù°Dú™—c°¾1ËdÏ,ËûMó>¹#SÇ«—h‚"ŠGºIq` + ~2Pû€wž0¦g—‘µÇsh&³òk€Ïڻ˨ „ESY¡„ô’šH +Ùë¦Õ•¬ Ö)ÅÖÆ´*ßîß.ÒB»§µ}rz:#Zξ¥·Ê¥í(Rëµ7ÁS«ho߸•·©´0= (îê‰3ÌkyZ ¨e +v+5ß ñòZΝ=âȇ—úÈëQij0ä%¨2Å ×ýZº´\Usnå£sƒ‚!½T;]ŸU@ðȧ´~ÜGÐÔ­pèÖaN€ÔWŽ…È0Xíšgڇ¤XË«¾Ðì÷—êú´ëŸ·<Úð^ŠáB45½IU*0º» ¸á¿0Ü?O ‘¦…2Š!DB›fC2]}ƒ¹…Ìî= ÷0³„qdgÁÁW«ÁJÍÏ@‘ Ê@¹úsD™€,LÝ^PU¼^2ä*šè5 Æx7Ü_‚?¸Yµ üᖉ”tä{^¶ð³÷5¬ðQµÐÙS)ø‹>;È׬×M/ËF ri,ۋþzþ})vÄÉç×Ç}¿ÁjƒÔœ&rv§eˆ* ýZ²až¤s&:ƒÂ¢».pcäP/,Cë@oÇ©Des")¸ýéƒå ;g‚08%ŠÎòi™Õ7¾9‚ª˜=֜Å7«æ¿#ø¯ô)L`Gj0šV +®DŒ <ßøÉ[Î>\€\ØS7ó~äÊ~0[´ ÇÃ|zœ"‹k ˆ\ P`R”{(/Ÿ^=S6æÙ5dt1¬\¡ÉDâô$¸¸µÕ䮣”ãµA‘+zכ ›‚ JßÄM êtôèû úð¢Îƒ´Êؘ"Ú{\‰ánz @828®sѝ¾MŠ-Õéઃ–¥äjþrÔ0¶¡gó®°B)rd¸Œu n°\žòƒ´‘œ­š&曥>ô7¹âîÙÛzé¯õ +·‚éìjø¢(j™B¤t+ªu6r¿â¯‰ÅÀÕàúƒ³Uqs‹ÉŽJ°Ä=è@Wêƒ,¡è]ªÜ®¹GŠ¸\›ãE.åXâ'ëÃMämâBàu£½ÍÄMαvϕªt܉;T†œô¸\Î ûYڙhB¦ºÜÝ$Ï2¿Ô»³ìÐÒ07”4Y֛¿47äñZ/ƒI÷l„Ø5.Sl³Õ¸ØèÃ)Ór¦Ûk¥¦ZéËS€m%¸Y”•E†£.”š…½Ó8°ÿä-F¢ŒÈ7Õ<Š …5#±U]K=÷\Çö<…cc›¬ÖBñpÅ0N§‹,<ºn“ù‘â=Ȃ6rØÛg¸3²5-8ZÁå}K¾pÛos˜ ikxirXH7«öÉ ãWøԊâ´(€K愈—ô1»â +A9ö]Ìf,ÓFp†–¢"]› s¯äš+Ûèº +ó¯(Ûèd–ç’›Á:;C1A¢Í…7¯Vۜc¨~ä£où׫ÒÞ'Bi”Ä‚êNF ‰8i»½`v$6 + Úâ¬!Ô1ZÝ-c+ï­ЃaÐ"¬[/ŸD¬[¯Ð`üÓßjž‚÷ôð( Š4S‰Á7îã ܙ2;£ƒ»3ŒYÆHgËc†Üe S.¡³Kcžv;BÍâ ­”£"‘”Õ.ÊhìbMt¡I¡ìz¤¯zVq*h+*™ê|RðډZã¤k‚ø¹®ãEÌNÌð‘õDj1¶>¥¯2H@¡]š|Á ¦awF劳Zèù˜[Žê0øY—hb{¢³Ï£•¾  %Á"žNCKFœ©5ö+]Qµ¬ÁÁæËÙ~«rä¢3_gëÆÀ B9ƒVŸOtbcÒç~¢nˆ ¹Ê8öíh:q($Q"ãŒèçwBÙøÀYÔà0KǖyÒ<¥#¶aé}A +&ézƒªx]ˆõ™{;¼rð ÐÇÊLÆÒl ÁÛ0£©Leo{CóPÔÕ]ØêZ‰23”H ԐcÕՆÝ, _H¦@lˆÌwêƒz:EÊ'ëßò5î +Â`vYÉ¿³Q™ÖÚ«–e +YB‹Gz±9$Ug;d‹¯ž¤‚æ’ `%:cç5¥®iÌd•ªQs‹òâI á%hÇ⟠Ž¬@RA‰³!ÄB™ô(O¶ä™z'üCÖÄƁYV{µ€J,4B­s@ýÂܜÕI4|L±g¡|GxPmŸ8ÇÊM««gÍ-àfËÁäM‰ì™s*QÍU(B»)؜ì'øåZ +îŒ8¸ÉƆÓ/<'–VÕ¾¡ß±$ž9wµoa»}1—±ÕzƒŸ ÿɅR«7¿ÏbnŽOkézƒõèSñ@ó{pšI:K™üºB`ɨ¦8ˆS¿B@4áљ@½¦ÔëE(¡pˆSGˆ +K‡5 êTS¨} ªHŒ«ÞˆN·0‚Y‰ª.ûö/üzU]ôñmiEd2¼¤C¤Å[kTÀÿ¨-M·©†³Ñò°Ó—㦰QvD–p£^–“QMKÈCæiƒTí05Ž37i…æ&I搬⺎k¶è˜n–X¦œeq/L$«h”ÚÑvŒ +¿@P§°Žjx`<L¹ˆÐ”ߪƒ®C4¼ˆ,V2>0=<)!»e0Rù¨µÑƒ»qÒò\/ o"XAϖ'…çUŸ³Oñº!OQnz_ˆê!â±ð;vÕ×3r÷dQTSÊ»3b›£Ï:ù¸#8Dø  IA6ÒÙiî\@F¾jgÃN;³P(/Œ‡¾´lclô<6jx¦…2‡¬Ö†äÚ¢®Ù¢ÅN7{ޑ‡p2äÑhù’(¿;ÒÎ;îX#S’4èœar ‰ßœ¢4Œ’Åy¶Ï>ÕÌéí¯+î,Gܜ(2cêÄ̗‰Ôþ¬`s`¡!Kd­ßË8{ݳŒ<‚€`:¢Í*ŽÍJŠo¢‡ª2²ÆÈÏÕ° 栁&э’%ÀÈ,«ƒ wJÈïc•ã‹•Â89« ½•Ã:…bec33ð®:éúÅ£ $cÆdZ²äê &–5‚ù6{Íï+, aP?„¦ÚWå½Oäö ÛËfal~䉡¦´U5”Å1¸æŽafž!DÍ»G䩺ÄþPièT(+ç´G‘ŠRK õcÊîêõs]¡ÝX‘üNé&…¢:œŠÍÚ¬ÜÔB(ÌϬÜ#4ÎZ¦ÀcÛk5e?&m"8#9×s +{M+…Õ¯¨dø 6Ál3!ãE¹“lkYªÜ±RX :¹8Ÿ³Î4[C:0—lö\÷ lÒNàFÊîlˆ+± <—­Ú46¡FZa4ҟ­Žlš™‡¬ @šdÕ5{FSC(N/µúÜEPøX9·k#F9×lñŠáW N3™;È43ô¾]õ֙٬Å)nf³ÚWa¦ÞÓR|ÍL£Ÿ±œZz"M؅ÿÂ苂iX3UÆ;éh¤óÿ˜z'*;†Xq7Eí'Ew~@@´)R¸ê#…ÂD¥8˜ÒYŸK§ïšÆÝ ªÌY“!92€'ÁtͺXö…馉’âMØNd;ÊǤ‘åˆ#²1ÐFÐÒ:ØܟäÐbÔx̚ŽØfYpknjìÂ5ÐÙéèÓ¬KqH&à [¡RɃr1®çK£è+GY)di/.d¡ £pŽ.ܨ†Ò¦k¿w#"¥aÌ*Pþ²yÜ ™æüÜj(¢ðÆ]«q›#v‡7ö&V×÷‘8”Ú°„FªÃUÂ÷:‹4Åpaz 2ÞÔðŒ*'k4X"C$ÁƒÕkºg&MH©äScsàkœ#sY¸,vE¤@ãšJ!y§$§i +É­&–ŽÒq°–³2¹á^£Ÿ1:Ì]èùvÒ-¨p˜<”Ѭ!¡![‹'ýÔ_ݍŒcYŒã›²7Öá>õ]Â`´É+“ò`‚‘Z)j² Èä9\ªá6Àv²1ØÖ<ùìÍÀñr“Ò4 :<ø,)µ&ÛµmR¥ÈidÕ +.›‡VY'“ºOÜP=¡ÉrïmŠš'ù`æ wfgÊ bxìÛ6‹ÄÐpGŠ DX‘ìÓFÒùþÔ½];àþr¸)râ×\ÿÚÈ-vÍ\ Ù¨2ss|hJãÄb©—x“Ì ÔÌY+§ÆWÍ/ˆ‡yïìË +b,Ó`ÛJín“â¶ÉáÈô<µ·Ì ¤o£<º8òÏ*#ñ'õºÈ÷—¸­ÎÏeH¨¤x™ÃÁZq—'d1‰Vuôžþ8õµì²Ž8¬…áZÇmîÖ`uQHùÐ_Üw\{ª“Ç`nœÎÎq•4©æµ e,·,’Q…’§¾”™bĻĠ¸™ŒØ2êñpb9»ˆ{Òà¦&aAV ø¨©p£B—`Ýɵ¼éê†3Ò©uQðȬÐ}ùªî8F¦ÕèÛžú`€'åƒrý‰gۅ"•«H’ÆÉáÃ^IØí‘jÚ+¿+zŸÿú_¿??{ºèW‹z°¿¯f’þlÿðÁï_â/“þòôäÕò¿~þßG‡W|øɋóçG{Ÿ^¼ºüa遲³ƒï.ö¾¾xqtñÑýÛÓœœqðò‡ãC?ùíùùÉÇ{yïåÕ£½¯:Xþùæ£íí/]lŸïï}~çÑÂGÙÅ'W¯}^]ßò(»¸«ÿoÎ_½xmßìb¼ùƒe9¿>{zpõÃÎÓOÎOöö÷¾ýáø,e·?ÿø‡ƒ‹ÃóuJnêÓvqvvt.Ï\]œÝòð×g§GgW'{Ÿžc-?þhï‘vDzvöÆ;ÞcwÌᲗֽ²üK·lå¿ÃÞ¢×-ZÑò?¦˜ºoœ¿èµ¥í ¾¶,ÿ—ÿÆKӟñ¥Ü+í­]JüßÍßù{ûݏí÷ô‰3ÿçÏûÒ¶°xiÇî/úWÑÊv†÷Ž×&y\þû†“ü.wþmÇvק8²Üÿïýá çò…Ÿx +YÿÛ,Â5&X!ÏiÝ4Ž,‚xDâùRÞ1ҐCwu¯®£Å>ÞãÂ. +íŸkD;’ôÚ°òíƒyØPÞåºß%…—ñÞÃwNíx[c³‘Ûà*>{¦µ¶v +¼Ï˦4!Þ-oÛÓjýˆ£þ؏üïÛ~ôìêàðÇûôéÁåñáöç?Ýû“Ì>ùúÂÏ.lu¶å›Î¯¾9:Äz¾Àõ˜?mïN¦ÄE$îP%Z=üø³£ïöþa7ýÀãó{|íÞ?|°÷ñӃ‹«[>æñùًWÇWw|Ç=?Ä÷Ý?m÷~1~þößÛzÁ×./ÿt93{þáòèóŸŽÎ¾~ñâŽI¸ç³t?»8¹÷쇃çüˆƒ[?ëCüMztpürٟ:ËGÞ©îüüão¯N^¿v'äëن¢¸vf˜ñ)“›|N(Àô”ÜͬysþºÝù»<<¹àÔ=Zî‡oŽóáù˃C4-âð˳«½ŸŸœ½Ø™Ý—ÇüÍr9û'/.~DK‰†Î/þ ȇsÓó“W;Ïüttqµ}ÏáåÅá÷ì§'Gg/Þbïñ÷»›/¿~òÖY[çþúàãÏÿttø +càøÛÛäÛÞb‘¿‡2îž+õúyXâ_ñÇ;OÄòú؜‡7’m»=[vèr‰l7Ï'/þûÕå®É­út9‡çìñdûøãó“ó‹ãÿižñäö?¼¼<~qôÙ²FhýøwËÝöͲp¿wM‹Ø»w~>Þ^ŒËŽùÐÎ÷ûNü ×»þøgLJç/ŽÂ‘ÿÙñå˓ƒŸõ¯ÝvY€•wȤ2†/µïI¼;Wz€¯w¦¢"„×:@ÕúiÊw²òÙM7©y»×Ü7©Í﫳ewžœþøÇãËßî¢_výäÜ>ìÏ&çúßäÜorî-åÜ8$j@]߸tªÑ,îlä­ ¨„Š°Qß7`ÿM´ý&Ú~¹h~m¿‰¶·m¹ÎPÒÒX:ðº4"]¢mFÏÕsî†;EÝ“n¿I·w)ÝÆߤÛoÒí=‘nyèõߦ€ûúÍçñmœƒ¿ÉÅ×ÈÅé}‹¿èM͍¿ïð;3ïbÙÿ’µ¯¿äUÿŸ\þp„Áé}Ää_ñÖÿ? ½ß¥7‚ç× +\'Fhÿ¿‡«sïReû[8;ñè÷í,þUiSËH`šœ¼1Ý„#œRnj‚)NmFÆZ”òûf8¼GYÃL|dcôYÿ(KÄ"F0˜`6fíèz†e;&V½£\áu¹Ýõ\éõ¹)™¿ŠýÝÉ{)9ßµÌðô* ò×ïĬ‘°øú»ï.®ùÃM ŸøòääÕåÕÅÁÕùÅ£ƒ—·ËŒ^&3jœ›Ó“ãӏtyñÜü÷ÙÕKþ{{âü»Ë«ž¤w¾Ôo¶²Ÿ>o»ãÓ–/ú0’J¿¿8xq|´|Þ4|´Ù>©ÖO¿_~ùé§ï^íÕ"~ñêþç罯.|‹UþâhY_LéW¸IÓo–uùæ÷ÙߦÊó7pQ<;¼8~þüä}4yÿ6÷Üûç(ƒ¹èã¥cº^ÊudJïKåü7õò͔£ ø~•ùV©ÛÓqKÀíÁ‚ws\Þìn݄ØҚdüù‹ï¾^ÔՓƒ—¾xý4÷׿¿¸úÁ_Q.¾þøìèòr矜}ß&jç…ÿrpq¼Få¥ùZWG»Ü2°ÞìÖxçÛpX Á™éT)ÒFãYlÃõC-kt–ÿŒï›møWsuüp|qþÝ«ÃŽ»<Þñåñ^Þï$÷vÙÏbɽÇçgG—o!û¯õó°  %(\ší“XóïG'Šèg =£Ë"©°—¯èS/Ç\¤ÒFuNé€Q±võ»‹££³65‹LmxycΞFÌÔ´\þ³þøñÏñÛpâp¥ ¹Ž4fSùi ?J5 ÞE©îñ§~˜°­»OO^Å*¥œœYý:û\ß2{QЃ¦¦õðÕÁ÷€kp'Ýè~Ía—’Œìq\iëéé4#xœèìì—…øêDòïÿ8§½^þ±­y’É°lÏÌïTç¾^7NÔ+užÑ{ï>Y‚Îþý§~éqí°££i5ªGçŽ6?†\+[NdQÞ*WsW6ýNén¿„_&)õÔ<Íy’>8cC Ç>`'ºÍÆ`=zÄ ìt©ÃZz âãÓÇ¢ +°Gs,/µos°v¸lëŸÞ×Ê\:ÎÚ?Ë.«: 0•v„´oÔ!–§-Nô— ×ÙÝÔõþâ¬BÜæЛFh9ë)W9¹ÃÝ/^æn”¥˜jÏ]2ÏÜG›Ý—ˆÁÇ!f3ñö.Çåg£>z˜¸óÝÚs14îYÀM’ÁӜhU1—M'(¬iwYÖÁ–~羘—C,Á1Öÿ€=?èj\$=o¸ŠBI(»ëÕºîw¥q?÷Ræ™d‘}×ù’´ÐŒcU1ØíÁ wÄ'&‰Rl^lDï<…Aó·9žC3 !>ñù=֝{M­^ü:þŒÛvùeí'‘î’"¶FÄeé¸b¨µoïÛ&Ö7´N§»/ Ø,¶+ՋJ+v»ÏÊV¤ôí’Òvçöµ 1°ŽÂm¨ýÀWæp›{ØrsÇì®1»Æ^¨m‚ËÒ×wî3=ŒCÍi’~ÓW~Ð[ÿ[·b•s\[¯mŽÓØϒ05S ]ä,(.°÷y{†/5.碭æÍÛ¦bÜÙ»8”5‹ÄÏØXÀ™IùP—àIkªIŒÛél›cÁ™˜v&¹ÌËï;M@?*nYv +˜¾ïÒ´Š9ü±;ZwÆЇP¢ëE‡.Úó<ëÊ^, +î¹å¸I›,í2ŒS®ï¹q½ûUôÌԃGèAªuO³Ã"æXߒùš ‘¶—Dߺæ|ŒêùÓçHëxr|vtp±häÎêèîOê¸åy÷µ›-‚<‰Åtp·7Ÿ¿{ˆù ‡˜6Ä×u{óytûá¿üttxnít ÿþǦ·ÿÜ{yýìäéùɏ{Ÿ_½QG7%KT¶ اŸüþÛ¯ÿù^ý¿v3¶eË.GøçËÃ8Ñ´U÷¾ÿàCÜ@ñ.ØíËô²u^í<¨÷jœÖ5^þSÔ8Fc¥ú®Æ¡‰qý{¿¡xG]-õ͂™6ïÈ«©´¾cµŸúõ纙ž~Ú¼cá{„Æ'ǗW[oá&Ã9²×+v½Ý;Aîž;öþKp$»¤? ñÝü_ð‘½:Úûôø¸®OÎ_áÿ³ ì‹e˜ÑäíߖMpy‰GÎ/1-]ÇÑV¯wÎ3õÙùá+Tyvpu°îøwâtï8ƒÁÛñ_½8~uº÷ÍÑåùÉ+{¯×W/ãèöZ?ώ®^½$:ïÕÑÙÑÅÞӋ#‹àµ…øïþ«ë×,–/罯Ž.Øûæàr¹\O¾y›~±lÚí/¾~uõòÕÕk~Óû˜¥½ïÚpOŽ_îžÃuü§½‹eFÎÏ.ïÿÅK|ÀÅOG{ç?]¼Äœú‹ðtíüî.8°ýŸŽ¯–;æùÁÉÁÙa|ûú%?~òåӃ‹eV–g/Ÿ½z¾LÒçKßßà{þùègý Å–Í»ôôÍÑËW'—í#¯¯×ǟ\,¢Bë{>;:ù§ƒ«ea¾DEù—Ÿ]ò¯þåíO>9_Ä –jûìöo–³„·êOi3gÃf +–·wpr|à©úøß¾zòûeËܺ˖þÿtzr¶üyùýr\_]]Þ査‹wÐÿæ©E~œ¼¸8ò:E‚uüÿçêç—Þþßg—ÿõÓÁÅå?lèq¶þtŸ¯žEûåϝµ3æ‘\îüÛ_è윝Ÿ=`b˜pôâ!3O¾£ùK¿ëùñًe Ý¾mÙ‹X•}ý÷mŸ~GËÿ–3ÑÝ;úþcž‡lü×®ê_ÒAÿûŸ|Ôñ诼£ñy‡¯.¯ÎO]IöçۇyÍÊÓrĺÿìçbË{4”¿†SzùÝßãÛøW>—'LJ鲸Íæ´ØðÖ¯ïúÖ?*'ÿõ+üÇHÞÿU¿ +\ì`z}ÍWýptüý‘íÉ_÷»öç}ÖÏù¢ŸíI¯ûŒ?=H¢üڟÑìå»>ãùùÕ¢ +<9úîêë‹ãï‰ÌöÚ¯ºù›÷àÚ§¼{vþêâðèSäá¾Ñ÷—m”=ýýïrýâüâôà.)²ÀïŽOŽî}xglŸþÕOꍿn¿ëêàâû£«E偛íòËÏòu7óo¢¿V\]œ]¾ûÜ·¯¿\þ™µ»Òú×ÍùË«ãSG<ޗ1-–ò¯=„Ó£«ƒWo;Žù-Çñ¿^8ö·yx«jÜL{rpöý«ƒïöžž¿|õÒçðš¨) séåÁ‹×$Ä)ÑGv®ê˗ç×c8'Ç>ä ¸q8/^?R[b–ó“‹öŸ|¹÷É««ó‹».šø5ñ¡{?žþxþêjï{å]ÜóèñåùÉÁÕÑÞs¸Ž~çáyïåÁË£‹½ËãÓW'­\}•™xb«F,ï<~±<CìsÍÓæك‹«çç/ö™’—7Ǻvw>öÀ®¾gùÀÞm2xèAÝ~ç“Ýf€¯}t3€×>ÛÐ ¸'cK>>8ûéàòY›ÇngýžF¬ôÛ£?]í}þâøêàùñÉñ•µ¸»áQz”6ÇãÇO¾üâÕÉIôþ/Gˆn.õt­åXO—?½ù‡Ë£½/O!$?¹Üüìú ¾³ç½gW‹¼¹.éoÿÞ£ò×&o{p½£o›†Û>#~ï¹sþ®ýð˳ÓW‹úo_=}Ðó, ÓFÛûJe‘÷>ó¯Çg/Îÿx3Kâús8;þÓµ ÙüygO_ßXç/¾mѶϬ üìÕóïÎO@4kë­[=ÈÓ²ûð&åÆþ›wödzƒŸÐ *b×8?õôí¢ ì•]máu?ºÜۑ–oð¢dPßèW½ýý¨þ¢W¿èWƒ•ßèWÓõûý!?ÊþQz£_u×vñ=k{çÛ¾îûßvërÝõ“Í4¿Ékþ¿”ü]äa¿Ë·/ókW~áïî،¯ý]}ÝîœÅÛNãg¯^.ÏCé\ñéÑËڟ_\ë˜xWìÊøzó¦i"MËM»è8WË{NüƒÓÊ9¶ï¾þÚo~wþdÑzBäžÜÔÒnþÄ÷Çò›ÓunÒ}ãbóÖE{Ë۞þö3âZýÓ&toçúèÏO_^ýüøèääò¶sí é¿:x‰ìµÕ¸ï%ñ‹o›u÷·>xío[»lçïoŠæ¯‰ƒë5õ× »¼·Q-Iÿ`Ñ”y_¤~„ºèbüîI;oêö>úì_¥_½þ]±@OS0Äðn¿©q{GÞé&á”pO’énb"ÌTd$~‚ŒÄfMn­öGýö±sC¿¹+7”~m•þÙÖRHw=õmSü·9£|D–óÇÿ¢dÑOw’E¯=úõµüÓ×ϒÖîÁӄ‡_3Oêña¥g_;S»Ý>Uzæasåþ®MV·uœ¯É¼{ÇgÌ>¿<¾ºM?¼åüú]¯¾Ñÿûüù#vwpr&õåukâÆ–m±lÿkßpW¿÷?uùãñËçˌü¸{ä®?v±˜«—Gøš‹ûŸ<Z®Á£çß}÷HÑå¦pÝñøéÁŏ—׿mÚw;uy´ˆ¶Oñ¯í€n`Kî™=Ìô'b“%Ëû.¯N½PÜͺ¿{üÌϯȇüæå‹ÓåÏ'gÔËî\y‚í·-õ˗~ìž%XžñÛ½¬]¾ua—ç6:ã|çSۄ—nºë)ڜNŽ¾{à“Wç¾Úú¹ÞÿäÅúú±¿s”zv»A?\öÚ"@_ì=ÿyﳋE¼¸ÐËÙö"¸ù¢Ãk³v÷C?ì*wwuuNà°×vví±‹Î§èܽ_‚½8º<þþìçð­ö¹S;îë‘ÒGö€ç.%¨,Aw–ãæWŸ\<Ây¼ÿ‰Ãó3ÀOÁ½Ï·àÉv>'XÏÝÏ^¼x´X €Œ¹©\_ð»E3”,V¯Üú/Ûû·Þúý£{·žŸqæó¦¸æúS¬ž‹¾^ûÜO÷ãåá˓ßï–Izæðìò¾-¼pyϊó¯îuÜ#y—Ÿß¯d,æÛåëï>õÝ«³Ã{v‰ž±ë!vÊk.þæàì,Rn7ÿö¾û/‘fÙÛUw÷žÀÉéžè3È +’³ŠŠ(&Tðž{žîßþV÷003Ì ƒ°g=ïÓõ|žZa†ŽÕÕß®®êÆoM[\?‹À’ýÀ»ï];j5×ÒXÒÞ¬ÕíûG;ÕºcíØ)K³gÀr"À§„ á´¸zxѐ6œ¿7~ýü/-´5~±Ã_ù2¹N +¯‹–Òb‹J`lc«>üoë©Úêݶ®å[ÏòMòý—†’o‰â²|²»^ÚOý4D›ñ6ž0‡Ö¿â¼>~†¿{ÒZ†Œßå†I³êí'Nø¡/jkoPQLÅïß´^ú£-JíÄâëy•åUI‘§”@öî”FÆ ç×WŠ¡bԕ4+ínt6Ó4ù·³iòÏ$ ºêÉÌTOF*{ÓĚ‹5ã M{{Ù£½“êjÉJj¨|Ä/K<º5NT/3¥¿ÙYêÆÍ0hÙÀÒ#ÜLÃEØÀœ2\B{´KÁÌ4²†oÛ«½Î5̤ü²ÊS£¸ +Ú½¸P¢fe2<=wZ6¬îlh©,Ž2⏠+ž–'ÊǯžÏuçM§@Ðïê +}Zˆ˜¦ô(FŸbag˜/éÙt#NzÔAÂqÁÓºˆÑ- +,2ÞuÇ£F[/ñoOÙ°('IâÓ%ÙÊÆ`VCºx%)-Lpª,ÜöZ¯oãH–éWZžiƒw¶Ú2²Ô§Ÿ‘Úhù´§ZޞÓÁ,ÍC˚G[“3³v.'¯¬€Ó‹/í5t “þ½.¥fBIU3¹Kì (r㺞ª·¯ðCtp˜Úï¦,ÅЦ3J‚?l r0toR±¬ÒÊ_RìLçŸ/ü¡ Øç"ÙìÆû™è®‘µ÷ï”)„Blu^:×÷½Îsk\ 7 iºN§Ré}‡N)i›É¢‹ú°ü øG*Â.á·ü-9øq²7øg§×®iZæTVïp)ZeTúZg០+>ã"i@ŽãÐ÷éF—whõ5ÓђÔjçéAžŠ†*ý§wÍÖt©)»ÇÂñŽqåAkã^¨b ÔSWË0#¤™ƒJµš‡­N¹ +ã²(6v«W—u$JZ½±?h¼ÜŒ|ĵµ/ÜIͅ˜¤â¦ÕªÙ^ën ™›‡ +§v’¶ÖèµÖ÷­µá¶ñZ_p +ûç}ëe­Ï{õ5^Ä7!­!aZkôÑ×ü ;ú(Xŋ}“8qibÿê¼­uA€Ö@m´x™ÆYóÉÝ¡;œ$¹× ³ÑO_ ªkƒJ⺵ö€]UkO¡쮈TRÿíú¯ø’Á[žãdøÜ^ 5ß tÛqöýµ·—6ºeÅ«o&€¤¯{]më«ÐòµÞó¨éµúä©£·÷+âm”ÒÞp‘$»§½1šS‘–h Zµû·çæKãáIŸiSª¥ÐÝ>S[ÿd [ýj¢ÝB%À,N2o{Eƒ mHgW6œÖÈP²Ö¤‹»Oã©LS;ñž+H˜j"«ƒòv¡\üŽZ’½.½@i\2-'j/ñ$£³µ‡Wòük[sÑ4RèüüT›ŒWùєð#MÈ4>ŒŸE©GƒK&ÿqëi jt]²35Dk¶‰Y4ÐUöËtŸ2:ulÌ,TÃ_!KIÿ}‚%Ó0Ř¢n„5VG*eQ±5 tlËjö­*™äÃsÞ{UÛENh„!Ä®íòvÔ^µHë!_´è²Éë^§ÙTÿj ³_³éP³Ïœ¥« ¡Ã¡¦.Ð:˜¬ß²éÑâj¸bM=«Õä~ºX 2-Ô[è!EQÙ·Hµ”º¤Nâq.ãÛ)DÖs K/–Ú¿Ý2U¸õmŠêєÕ_ØKDwƒÈCn«þCxçäí>gÍWº?üðE9®2å´)Ê^2,á@%»óØ ŠMôv‹ üaµdèüî þ°ì3†ó©D+Ëc½GωÃóWüa³áÙ«ëb }\ÇS\x}}Üá_®^GÑÇkü1Þåºð‡ÝˆÒÞH†«·ð—#†>Ö –¼Í›tÃßNô’q/oiosð—{ý:›~è×|è#.h ãÝóôჟæÒ­Þ+úx€>z²WñW;ú£,H±÷Íþˆë’Ïãç¹ôíyì‡ài°{ŸmÖhcn#ó–ôr•M'—òyªÉÚkߒ˦œ,´µý<Û4GÏ2·¶‚%S~ã.p“áÆä Üø®¤‰ºg3En‹Í˜Ï¢ôÕ!³÷ÃÖ®¹—KwÁšçä”ÍRž”ïþ9îúÃ`Aw1꼃Ûaç9Û§ü—¢§æ4ÉˆÚÙu‰¿„_Ã×%¨¦­|_·„wQÔ;;—ð¤¸7.mKKjw3ÌÕ·½L>urº—ܻٴ¦²>“•Çî½{½peâíXÖÚ9væSõàUª½q'^OR"Q§ºr†ÒUÿÆÚ~M>wîÞr¹âN0X¾>L?Ä +QWv«Â$^7¯C®l%·äÌo×?üàk—Ê”+>腆-ôRŠ&÷݉—ôÃÝÍÀ` =×ã^›¡ìém.•ˆn?¶}å[—?ô|ÆÈJ³µ^ìv²MÚý–,Ÿ˜n¡'])Od÷,S¼)Ú –ÔSâ‰K=,ÍPÈ׿咽ë"ãjGÎÑð0î– çJ'¹ÿFÝ»RYö6ŸdzW"mk&ï1së©s™ÔÖV\Þ¥|_þ€eøÊä`<”ÉwýLo +•9òƒÌöÒµY r‡}åpž)Çöñ+åŒFœXÆq¿ÂÃk?GŸL9{'Lÿ<ò<¹}Ç]=ò Ù¦¬”Ñz¥LîÌ6ef]MÊ‚¡kí@ömQ:OÙ7ŸÎ(Gv¿C9Ëë^ʵkLQîËCÊSÏ>RÞ¦ÇAùîbý\Ý¥˜~¨Eq¦™âÞ‚TÀºQ¢‚nÓb.{T8±ÅQ‘œ¿@E¨ jýúzˆŠYBT<^Ú¡6cwTâ…qQ©¨3C¥ÏL—TÖÚ3S¹êk‚*Xºuª¸Ó5QeÏ[’ª4,—Ôö¦ËAU­Á"µÛL>PûÅ-?u@P‡oFê¸ãÎR§—±{È¥~|¢.vŸêÔU-চ‡{ûÔÍq×LÝÞÄ+Ô}§1 ÚVº@=GO^©ÎŽ7O½^½R7[0RÅƛÑÔMm­)“Õh¿?>0ºÒ›´ÑÓ·\é­Æº‘c¶ž cà1Z2†·mvãzô¥nŒÛÆDïä՘¾ßÛ7æ.Ê~cñ¼ød¬Ô ;Ɲ›-¿qïi÷Åx08¬OhH§ž|2/÷©Kcór¾]/²Æ‡HàÙÔ=7v«á"ä2°MÆýžÙdõoޛÍ#“g?X01ÜIØ°r.Sø¹Ñ7m\­ßš{§¦ÌviÇTاs¦ÊQ;fªÖwý¦ÚcÌc:19l¦óH×hjT=SënÿÙôȖ ÓË^úÞÔ·&ïÌƝÍ[³Í¾3».ò÷fz½ühPÏæHýòÕ/w)s:ÃØÌ.é1o¹Žæ=w?f>òFóæºï°jnDMgæÛ­ò½¹}Õ3wy¯…Z‹,ëñvÅâz³Õ-ÌvãÅ$]–mkܒ¢o÷-ùûÝ{ËV9æ°ì‡¼ ˉqpl¹xj¿Zn‚–ÇË«ª¥{{ýl¥n~«­}³kõZŸ»VȸnV™3kâ!i7X¬ùàaÙºuÜ~±Ö¬î˜õt7ß´6è¿õ®8³¾dŽ¼Ö7ãÈfíylž–ïØæ?<÷ÚÖw×ë¶T¹ã·wöolÕz|Óvô`ïÚ.Þî·l·Á—í¹R¼´ ډMжxŒ²{o#Çö`$µÇÃ{6·~lß­h¯½ì[íõzãÚ~SêVìO):h¤ÊF‡-ÕºvøÒ®ª#T©Ä›}¯#ÿšé;ªÞöã¸”>r\u¨²ã!^ƒ\¯Oá€Ó’yu9½Ö3“3xžyunümg3·œ»ÖNÃyÒi]8›Oº³ýp~æt.Ï\Çݹ‹ w.]ëcӕ¹¢o]Ûî̓ëhë¸çjû×ãVØë÷B‹Û~iJ¹Ù\qÛ½á霹³ý܃{çºorŸœW9÷õ—u?7ÛGãK­íñXâ.O(êIz’Û¯GžòÓmÇs¨sž«úі§íÝ»÷¼ÝÒ^WêlË´6Ÿ¼‰û.äâ-ڏ¼‡• ³·Q>(xŸJ/O>c‰Ûðyööš¾ð)àK¿.|;Ñç;=(]ø@¾×êE“¶Û“4w`jӛFŽ. ª&úð.sD7w¹ýù2–¢½b°0̶ÃÇÄö÷L±Ao1Ë4™t‡y)TYËëC’ec6ïdŸØrúâ„=vzó,`áûZ1Ù8Gfÿ… úW\:puÀUC©w1'¸ÇÊ]Øo<Ú¡ ¿ovùc!«¿tâ2úæ¿ubîûûœ¹pµƒ@ä(d äÓiKàÀ·ã\{îèÀ«Û +:©Í`˜¹*s)ß~°¶·l>ٟ‚¯‘kÈY÷CÇMæ³üEù8tgÛ¡›^Çêß ¹ekç(¼Q(tÃåtÊ>¯o‡ʉLji'ÁFØV¹IY»‘ÝìýFäªe†ñÞpG'»ÑhÎHÎÚÌGOZ÷ÝèC-–1XÖÍå§Îº?Ï­g2¶þz-s^Y¿9*ÙÖ úhƒ¶›‰ôãÃFõþº¸Ñׯ·§W1ÏæI:wÞ8bۍûëØ塹ë–\ܝ/÷â±Ló<¾]v㗧[ÐûñîC׺éñ¤Û›ñíÞùæN·RÝläܙÍ^·Iøvò¾D2ÄÙûv •¸ynw“ÔÅy;É5Î’Ù›“»äÑÝÑmòÑÖ¸OÙ6ڏ©ÈîÛsªÜ¥{©‹Tޔêö®]KÚ»íäÒI¶Oï¥ôm3˜1¿ÝdB;ÛýLiÇë͜Ý'3Ý«­ý¬ÏȦÂNGö N%³Î瓜í豟[÷ÝGrÛ­öA®¹3è穨#–xÂù¢crɟ[®·ò¯.G¯@GÊéB¦ÚkŽï³ñ³óé®è®•ãŤÃñX<8»N#ù^ÉñÆn—â-“«´_»?/ݶâeûÎY¿;½8,ÃB8úòaP±‡{'•Ø%›2X*û¶¤³rxö¸å`¨Ã­øC*½U;x`·SëÔ¶+tw¿ f϶¦ííçzfÇ»•[ßÉ\ÐìΙñͽóšmÛªì}ÃT-nÖߪ—ƒ‹Á.u~û¶ÎuŒ»;»Å`Ù½u{v_•ÞÛäC{‡aßæÞóöAißײìç}{Íý‹G·Fë®Z¸¶¹Q«Fí;µ»ÁmóÀy}h:H•£§û‰Ýƒ^m½}¸ˆ1‡[÷ñ­Ã[köñȑÚ÷,Gɻۃ£Ó°ÅxÔ»gƒ…óÇã—}ýø®½u}âº2‡N2ç͓ó36|J5nO£÷•ÍӚ;Ú9}Î:*gÌmßyVæî.În.šñº#vMÕӖ‡Óz½ÙŸSç^«Ár¾¾mžìîWÎ;µ§Ð…¿4]ìP§·!çÁ¥÷à {Y´3¡Ëëã{וÃ_|»J¿0í«‹³ÁuÃ\lÖ›‰Ã£Æi¢ºßx+Vw›ë{Õjóðæ°Úì9›{×áíÁ¡Ár½ßgή;åbã&è¾{¼Ù½¦{7χgŽ–¿DZÕØiªõ”^ß»å +¯×·;GÇo·íÛwDZ\ñngßzy×îw¨{n÷eý¾ê{>¼j÷zþºcýa÷ zöð²]ôù¬^÷ë®çÇî]1֎XŸnڇ™d¨Ýì6ž6²»á§“7¦õl<~Ž?'6öŸŸ/Ø\éÅfØ^²6¦þrí£cwÈ;è” +ÜQç¾ßè²ôŽ©[Ý¿¼êv\TÉ`y _ůGņ±GqÞV/á=?ì]:Cù¾Ãrù¿øhg•y6ò+üµ >ø sÿ8š^éU¥s8"òxänãEp_ŸÜ¦_ç-½H-åù vP«ð̀—øâoÓ®xà*äÚÛÀQW¼½Ðý4B¹ïàÑÕ-@ë·è>åÞ:ÎPz‹¥}±;Î>@¥»þ>Û߂ÂeÚþ͝«8— +saX‚>Ÿnx®rÐGߌŸÒ…ËVÚ`éÎm&ÝÝíR¢éÇō#o®sê?Ìöê§tæ4wRËŒ±kƙ ½ sáÌ»®´Ç¹ùU‚jÕå+KވZlâ¥J¿×[ï× w‘öù÷ùjŒKÖç‡ìE÷•Á9íÓý H;üæŠç)+®8î—LÛëë‡óþðëú#|Ì?Á¯O2ÒLë½ó­ú®r¦ùÐE Z¼ð*fzaÞ¨ Ëvœi𡜷(gºAÙ{}ÆÒSδÊÔýF6êg +Pa”mßæÞò¨d¸·7l'YåLýŽºkƒ½S®),4@ÁšºO¥ºÒ¹T9¡’iÐd~é9b*™ž\йÛíýq¦PQ¶yjÃʔ.kŠ™æ lMµyÙÓxí +g +²ØÌJûô$¹þ¯ l“½j?áΞdêïLˆR…N 3­Úl²LçËî8Ó±$óÙ^öÎï_j*™&ÁPÎÌ(fz±yµ§–iÁ`1söõºr]7¨ó¾é¾µ§œénÚ5?W”2u­?EããL¡_¤¢äÜÓÔ S”*Bw¯§ ÈÖ;©•Š\WÈ4=˜P…cÏt“){dŠÐÝõoó3 gŽ¦Ë8S”Ë0[s¯×h¾ LiY¦½^²Õä·DÉ2í£Ã™f3ºë•5¯±Óºª†ø¡Õ¸ J U8°^t¢ªOOv™çCµ§÷táÊò6~:¡ùAõf¬*¿†>°ºÒB¹[!ÙÓ`˜¹¬ ŸöÛá‰Q|¹7+=ç•bµ­«> ³Î½+õ§÷ Û¨Å&Ÿ'Yëéµêӊëe“UÚܹ]?•µXдc¼nT~.X }þé­í5"ûíëA§·Œ1:ÑbÍÒþ‹Òs^Ëe\ížêÓ#KÓG©?­g¢1¡Åž_Y.BfÕ§ƒj· ú´}ȦvÇO'Z칝‹_¨ýŠ´»P}Zbýñcõ³\¿4÷+j¿¶RÖbÝ©ú4›Üj¶TŸ–ØM#£ÞbIŠ5;¢*O:s +uŽÚ×eO]µÝþæðiÚ»!•…ÚUޙ?÷÷ýî=é +,MßØÎÒCýseyBO»Ãåhî2À«žT§¿Íÿ%ÑcìÀŒV˜iÊSŠœÀ +󱆘}—£Ü™½4bGxý6Z½ñ:b˜_c/%h¾ž‘µÅªž¡>‡uŽÅMœ ~XzÆc­tD#·~±Á:öø T«Ñ +ùÝnŒò3ùbMh'c¶÷våõHÔmÏh°Œ³Å+•Lƒ&´Î9SÎÔrªš)L"Œ ‰ëŠW:ª™¢)ïZ-Óq¦þ}X#‹² o§öE™ÞX­¦q¦ý2åd͋Ðÿ¨¦ù'I¦Ž¼zg+ià«š)Fÿ*™ÂzÐÿÅ8S¨‹¤®çª™B÷ýê™"ô¯š©Á‚ðÿ½r]7(¯V¦›j¦SŒ3Ec_’-Â5I¯¶"Böø¯aG8Ò§7ÏzÞ»x{~}•7ƒ¦×‹ìñÎÔ÷÷C¹j‹Ô¹žjˉ¡{eF­³'2ÐÄso½¡r±î'd#Þ÷`ŠºÇ,ÞµßԆ‹u¤“øõ~¼ëØèŽR´ã$⑂ù—"ɟe@q5²(gn¬š†Ùdz–!sou†`,d0–P¨\¬Ë¿$³>ÚKùî[ˈí‰óÐf¶3z9ƒrɋ«{UÚڔ ÈUøŠí›Sh·Õ±¨U«´G7(0] +X,˜!<’®’” +Վe…éòÍ¢»åfm›´ÈŽ&3â&myþ–*Oktƅçó +õ³Qªõ3XÆ5ÄLµ…þÛ7Nï?Ó¨~ь)Ձ׍ÆÒß,ŸüÊBgci$Æ8S9Õ¤ zÄ]h¬uÏL’5–+ɌÌKV¾þ:{Ë+¶;€›Ó¡$ÏÝòlê4RÒnwƒzcIUcRõ\d¥ª‡SU=†i¢›­{âYҀV^õ(·ÝEa˜a«”ǝuólØv̋r۝x(Uµ­6*±=N±j'ÆÙ«&žÅpå¸ÍÃÚÖ´¦Î—­ÃÝłd\²Z‰g1Q­ZU¯uØûj4 ¹vfª’†فåܱ¨mGÃP,çW+î8£ÒMî.Ó0Û +¸ ¼ÿ C«ÏÒ÷WL‘$c£ŽrbŒÞĔ’Âí.ÚåqNŽ»FNï¸Óu0W6ŒÇoš}ibÜŒ±3—h“bB,@3Ú³e¥î„w(bСcCô¤l@ýFZpR6vvGE• ×eW,Y<ßì«U2A·¾ 6Ù%ãߖk²KnòÓP˜^ÕÓ÷ ՉIf¿ hæl :-,³ôoµIavô¤4öoòR=­ÐX[ñÄ«Q¤ÁfIu®ÜÙ–G¤ƒ"©:¡ë }=«|M`1 óKzðÅ¢ ,fè¿|õyœ/És$¶ÿ¢£\0*u%&Pf-—°Ã;LìD{3K%Ũnî»ì-°Å¤mÆru¥v˜«Pobá:ˆ÷߉Ž%û/Pž‚ÒbP Ð*NÐlêøžš¢ÇD[yT6 •©ãWól e~?v¢' hˤ2n´Ÿ½uNŒV½‹¶”·N¼?š–§š”aA¦ÇËônŠ÷µ—x²‚ %y²(S´€®‚È°åûÚdÊ°„_#»T¦¨»2]ŸÍ°&ç7%¥NF#ßö¼ßôŠ ÚðWÉ|v† TŒ€) £¨>THQv,³ÊôN Ֆhȝ,ÚÓ²^P+½ë}õúÙt4¹A_£K°Ât{†ɏm}E´©w´¡Ê ˜ìy??Ö _8ŅÊšdÿžÓ+ŸÃ+­ÆÒ?ÄU—=x•5ã—4Öhˆã_pæHÛ'à%TéW\uO·.ÔõYH´l %¹IV^-“¬ÌBò\’"x•Eñt“,TM4†½?³™¤„ü¶ôš7F«$yQJoÒiùæ ƒWW{ªLô–þ¾’Í©*vƒEËJ÷\B›»'sÙ}P³L·õÉTŠ½µNP—$‹ô¦ÄÒЕ@éěJƒ¨‡:Y˜F­\–CéYڎÇc¸<íòèµ/p›!›L"Dk±™&² ¿o¼DwÚU›.çåñä7š_Þaî–åóžZ…  IّNzïQ›–€aJŸëk˜Ë)FzƒlªSòÐ:²‰nÚ<$Ʋ|]DSÚ¬²‰ý7P­à;= :êD’œ†òxg³yOÖùx_i¶“îŠêނ„ÄÔì­JÖV~e¡foE‰Í0ø”×K0h –¹7)p¯iOyÝéH’³•f¸'Χ3ïäS­&Ç©:y–tfŸ÷Fë}…Ä$;„³M¢ÒýAFn»q¦±›êBvÒØùÔ`™> uL7(1Ö;óŸ +ˆ@¾œN]M)‚ŸÑWÉ,&×hý¶cB£õÛò <MÑB’††I¼Î«ÑÆMX½Î‚àå‰M×h;H(±÷k´Ñ¨Ìv Ñ ×”4ÚÌcҙ]£MØ.øtæ×h(•ù÷^q:»Aî”}´‹ã3X”Ѐd:ìh­ Å[‡ÊÅïޓú[šgÂ6Ž¾›wV˜_nm¯êjH'2KÃ8ß( fÞ?›š…Ä©™”¬Á¢ªfßéý ̇x--Y‰¿ @¯ÉœšÔ4ÌôtôA{ÕT°ҙߧ¢² –í¼OOGºé®Ó¼¬°›€[„­šŸ ¡~.„.¤³!|ë™ߋ„´aÜëϽâ;>ÒkÍÙ.Tgã™ð½¶ %6?¾¯¿*ͅ³Îb¨×f7iMÎb(yð½(•Ñ\øþY §£€ï•R­^UÒÑ;jυXÃÔ_çž %sá¥|Ÿçß.Ä éE?¬á\)qž»a¨bËžF—ˆ›Ò­c÷íøx[µÌΉÍ;ºEåRÛÚ¾Ö-¦ î +=‰rQ[A_zusÝÓ4´ç¡OÃr¥ÃNV$U‰À¾=S‡—|bJ{=ÓRÚëÓµ®Ô11±©ãU÷”ŒÕה:W³¿8o[HLuïfdíÑëP‰qæõreh±ÐlCÅõä¥W— –OLe°Ÿh:ßòaì÷º +¥S"&×pFæ‡îx>‹¶^WÃ>ÀÑrý;Êó²{‰Ž5ÌRž$wâæ²JtüÉ-óÇЉg±É:YÄлcè´#è°N^@ j¦8‚N5ZpÆ:í:q´à<1tÚtÔ7G v$ZpŽ:í:hÁ™bè´#èp´àbè´ßÆVÏC71p%t£•Åœ1tÚtM¡“8$kD˜Um9%´­î¯ $svÑQ$EKofºã¶S_¼TN¶F~·3lFŽ~Œz-½gél?[׉öø2r‡w·ÓºS"®ÒXÑÑo× ÖzlN3¢H÷ø´ÓöÃÒW?lë›9§»~2ËÕäxÑßè¾Ù‹¤ù8År¥U$¥9T—™‚æt隬ÌdìÛ3[Õ`&WÞLÑdv³±šÑŸ 6·½êÄcÒ®šAg°›ÔrVà –dèóy-Æ|°›Ú¶t•4-ØM}}ª½á ҖYMgÉÒtÚ2$+‹fD +ëKLê‚ÅLîØ4Ù×i‘útV#7Ó¢Jµeo“Sw¡œ)ÄǾméŒ:œ¾¶‡ÆRÚËá±IÓÙ4Ãa;ܕ™Ià·ŠN³ïرʫÂ.Õ(0R’ǁM…]ºãøÞ¦ùÀÏÇלÿb’­ÔCÓԃ`´¡ô¤¼-voR+TB)DS½ÿ¦úÀëö"¸ÉK-˜Šý§7Ž/ܛ£% Rït”ØÂ"D{㝵ȔY›.ñú[Lj`³Å¦†‰ê¯äX£½«Å¤†_6u|â‘::dŽõ +‘\ú°ì„Íwr™5ê{ÊvKíx9Y* ´ÒY!‰+ö‚AìJstt,öF+¾)‹½»‚îŞZrÅw$1íhèçÑ©úBåÞÕC—ôôùE€4ÊÃ…¸M724MÒ(*Me7!öZ1r†)aÎ:¶Ý«úªê9^ŠÇÒÞ)Ë"½Ž^(©€.‹¢2JLýd»1ÌÄ!ón.ˆ¢ÑOtnáhÎ ª\iÊç2=¸YWWW=G>9ÖQ…éa<~Ñ­qn¥ü†}€¯¸ŒïÜ矗ÓÍ[61'.rµx5›ð l ùsµÍÐ ¾6¿,"šN©1Æh|QÑtÓ"¹M§K§zßü @Ïx(¹_l¦£›Ôoñš¼¤R~7‡ÎÀ§×)ƒ]ÒøþŽÚ]6￯n¢H´Ë³èûêÔх¾v¸l3µÓ¸•$ž(&s*°Ð)’•¨gµBɊ¤Wè¸]Nº1õ®"¡ƒBÍtí²V‘”)T5ŒF;i\»¬¢2Ñ,&]m2¥¾lEę#Ý)›k[æF·ei]t7÷5w¢s®tBò÷\s§z»\YW¬’ÎkîÔ"¹ôÒérÐöO_t7__åOºzn™Ñ´RéºænªE5ÌÜ×Ü 1ŒöEws_sÇǾM¹èNßæQ·¼€s®¸ÍF»õÇY”æ¢Ô-!÷»cy j1‡^ùTÝåAÔMõ=œ&Ÿ(Œ-ž5-ðºéôx4¦Gª;qèŽ/„\4Ügp"C­£jú“J²¾¶ g“MO„MU­³ÒÙPjû=ùêó;»$ÞP TSüÁu{CARSýÇt{CAbú<ºµ›±î[Häãü[!èFAãÀ‡½¯3]w»*¥"òìÚ_ÄÄ©LD²+F +Oeljé +¬U»BX»ÿ2X»ÿ²¸SQb ¹ÈË”V2Ï]ªMYSjÊ©÷½jùP;'·tQ$Þ¤µæJ\͇ºÕo/$2etòñìHb2©ÊÛ¢n0„Uõ-bÝcÿ`¦‹ªÕvßÐÅksà >-¯ÎÒYÀ)|:óÞVͧ" B¥góU=ÐÈ0ӯå0 u2è²ÀÏ}Ý_©vÇÝ;†¡‚sÅ{ﭞí†;­ÈÇ9†¡ hÃîrSÞÔx"}7åÍO4º)oþa¨qÝ4.IO|È{n¸ÓºïÝq7û wzO5GÑOóÖÖ_Ç0Gmõª;°›s z€7Ýûk呏yíG(¾pK1z¶s®p:ïЛgD tϹEë[‹MMG=VÄd˜v̾.o–øv¥ &ñ®(Rî‰aµOév-áÞ7aLz‚˜l± ùJT4‹é c’VrŠítœÔ¨_TØ¢v]êšËöѨŒÚõŒJ=AL¶Ø‹|¿w]yáï€XDŒkÚ«~ªZ¿Ìz#ÝL×=â¦TÇc'‹;šêï¾-(ÆõDõhªÙ1L³?ÓuSnÊó½3ÆU4>Gn:¢ž§Ç¸B‘tG=kŸ-@¨#*!åüè‡"Þ +±Z¦Í¤S¾ÒQÆÔ*í,™M×~-Ö¹rá¯|G÷åŽë¹Ö7fø‰›vE¶ãá_’ ¼íÍ=q¦’x8ƒ¥o:<©ŠMUÒ{آ鳕x8‡z^ïí*ÊHu², vªÅþMæОã\-¯®š)ÔŘërªu¥ó¦ÓÕLmŦ÷Ní6Ç8ÓQ$׸«V”©44­o YÇ÷r²(G‡}óìI)Sƒ5°üÎ9I^Cû'nÞòFU%Ó ÉâßÎ\m°òˆ¸KLóæ z¦ù]Ó©R¦øÞ·pAZ)ÏtOëÁò¡z¦ÙìANâÙٚÑs÷è¯aæ›3æ“ö¾Ê{\šV}O_I_9£I)º¢Av&uQØbmäfºï@]Ãä¶Fnääæ½»Þ|ÀÚ8Æ;VÓ¯¯“”LnçŸn²Ã÷ñ©ZUü¯ípov<¢r÷“-v¬¾98[ ÙÄ}s\˦É4SŒUd¦sDE’Å¿ÜäµlÇSѸ¤H"WýánµhÔÎ +Ø6ëåŸs¥ +8íJã)ý7Þy¿ÉOÔÑ- ²{o™™!±i·èØäѵ‰Éf•ùZlj,þJJw.çl±©÷éÌÔb]%±‰pa%t8l±wFêÔ}‰Z€˜®@ ïtQ€zc'íɳDꍟp8{ Þ@lµ~w DT4V˜r?ØÙ¢õÆ¢{à¸=µõ†4ÆjÖ(@½1€£5ò»¢UŠ4(Þ¯äË3Y«ù/åÓ#Û<—ò‰êò /困*|“Kù¦Ýȶ˜Kùø˜m€2ÿ¥|‹*\ø¥|“÷#‹KùÔïG^ä¥|ºî¯œçR>±U*¨Z¨aM V¿Õoþ³¡J‹8Jç½~ºÎ†šû^?QÕp6”Ú½~³ù)½÷^?í[ýÞu6”½~ÚV!å•øì÷ú) ŸæÙPï¸×oº$/â^?mϐ‘åjÎ{ý¦Er-È «y«ŸÁ2“AWõ^?íªÉlï¾×OR‰[ýÞqˆâ½~ÚRòP}Ͻ~ŠáˆZ§šëoݑ²ŠgA¿ã^?퓿F{âsÞë§9Ñ¥ñ,¶€{ý´ÍÂ3@¥q¯ŸöRWÑ ú÷ú)…IŽ‡Þ|÷ñ- æ}¦{ý´SAvþEÜ맽¡bНÎ<ïòˆÔ÷Þë§5E·ú‰og ç¸×O6 ié­~’3»fO¡G÷úM{]Ƚ~Ú·ú$yÎ{ý´®E©sÝë7ŽßR’EÙ9Wï¾×O»1‚]À½~c­ßætŸS;Ý÷ñM¹NN÷}|sÝë7JEqøÌÍ1q¯ŸFÜÃToÛÖ¬÷úi#ytâÁ"îõS›Ã'wß¿¥Î ;‰Ó†á´{ý´÷›¥^ï¿×OÚÚòÕâ{ïã›ÍICý>¾ ŸÑ­~óßǧ'ˆiÚé “¾³]Å'Hï^?‰a{âV?>bhþ{ýF¡RZ÷ŠÎ}¯Ÿ6ÌQ‘±™ïõÓ¾ÕoîS›†÷úÍiëÓy¯ŸŽ¸×Üë§}«ßÌ÷ñ½+ +W¦-'ïõ{0¼èV?Q.sÝë7iJßê§vÊÙ¬÷úi»wÉf±wßë§íè$³)½û^?…~Ýê§}.œþ{ýÞo·”¶Øì1O*ëÊ9îõ+.¥[ýÞí=(»×OS"D7€Ìw¯Ÿ60äW¯óßë§;œ‘ç¾×OZIù­~xL÷IVÒ{ýÔAa¦œd¥ó^?]fî{ýÄ=9¹£]«2>•ïõӞ4£8ËÏû>…éáT £í({|ÈϕºçOT”Í•ð­ºiWÛñ^¶(‘&AÆÆ»7ñXWÏÛ¦†YÙ%3¤·3nÚ·Ó +ŽÚs[²­ôQìÛ¿§`Z)Q®³m3í;n‡ø—P<eފ½´ý…ò]Ÿuý\ヤ‹?GvœvϳÖzMх»í¤éõ-¤êþºJXáõ‚ukçu/ðÚ>93XB¯ÿ:¼•;ö–½=*PÉû¯R{íƒÍ›ý­àÑ}­µx=´·nÍGI‡?óh¬í•ÛѧãNkÓþòzzµô/Ámêh{Ófæìù åö¬Xt¼Ý›Îüz+:û8¶3~PÛ?¤¼®‹ÅÞ½º68[‚Î¥Ê):w{]¢óAë^¯w±÷úá£bßtlöͳê(Ò²æŠùw$'ËGG—®ìáqý®>yQЮ›_ÖÇ'=¼r¢};òF¸ðšØðڄ¿;¶C‹„^àcȉ£~Aá»ð1æÆÆdƒYì¬_¤½Âs¾\–Ý +C²ڕq[ÞröB±È¸m÷—BAËñƒÈ 1zà?¨¸® –Ñ#øÑE¨5zà?è¦ïFу|êEl;Åß؛øeÜûÛnñ£;ÿÎ¶ßoÈÌ M f¦àÉq蚨Óf +›{èã®8íæ µì®›åÚŠŽöÅ@"ñJ1מƒ^ò¡¸¥gæz³ˆšmw˜ìõîNµn˜Pk»Pl1ž–̬ÃãGè¿ endstream endobj 130 0 obj <>stream +&jÖ±™XçsYGÞ{©'ï3Y½¾­dÊEj,’£m´táj‘.8S¬£ÛPJ$ù½)îVb£SAÕÜʟŸ†ï’ûoæ‡ìéM•Fµb°ôò’|Ş¿]$Ò CûN.8A¼j~QÕ3›¡k¡ÃŽ<¸ÙÌǹG>Aì íæ9º›íˆÂÝÀÑ]tÐßÜð¯`²—³ß†ß\5ÝýìåÝãCöºúä€"Vh&²ÕJ==Gš¹lè }¼Lt®³ÙåŒ^ ?¾mǒûçh/ ÒID·ó‘äKÁùŠ~ø€z5›·äϙÄzÇ{ŸØ:x£Š¿å®Obɗfã*— œ²ASôx?{íÞð$k¥7×°ºÁÓp¶IoZS;ƒ‹Mƒ%ýðôeŠEø5å¶ÛøfcÊ'OéۓP;õ8x~>Uò‚z8v@{®‡“»Ù­›É§G¯©'K­šˆîد³×AÇFÒoì@ïßîö/g4ëˆÉÅ"t¸{V ÆrÉx*hé2Åk?¬øÑîyW¨æ•?:¿¤žBåz.ûZâN‚ÛJî½´NFO«‰õ——LÉeƒž>9²£voCwº_7@›Ÿd›‚'¹Sî—R[ëo°OC·4“gvš}:{ÅoÆ-[—ÏcñZ¿}^7§žZ)&Ñ)ôêÐÉÞSš¡Ÿl¹Ì“ñ:¹W«Û²MOâ@Þ";éÚ9~$YxéaœÝĆÇst/¡£ílªþZHߟ]¿¬îÚñšC‘ÛÈs%|žØ>¿ä.g§â¾IL$:m>`ٕâ:a;½Í-jí°þìQêõ¦ gÆ ø7„ɨ» ¶J™·FuÄ6sóÞMú¼d‚Q5?WäçA ÇSéy8@yymÙ0–X{ ¯¾"±ð¢Q ¨÷ÑSßHäêð1Ô3ð“ÇޒIhߏÓFkÈ×ìuû5O¿|ü亇s\«ÚàW ·Ñ3™½\XWÞ^$êC-1b蚶| +3–Ka²òð³ÖÝ/SÚèд/žóBï cúœ3GÚO©'ãKŽñ˜‹÷£IƁ?/ä+F/›ñœ¹h_>áB½¶…„¦–ØpßÜgW]HÎÙn¢÷–³eR•Ãšé&!ЛæD·_|ÉÜú"õ\Æ]³!—ã^ð4xWÏܞ—™Ðúu£š)>¾‚l³ÖœÓ¾i-˜¼–h–7…ï’¯ÉZò¥(|Œ÷ROyÖ=š+ùoه¡vƒ +GüëϵT›9ÞKµÙ%CðÊø]Œù2s˜hea“¡0 §\±ýì }cyÉôz±k«~béÞ(ÐaMךþñz‡.¢ÞBv~>‰+‹<‰·fõ`nøGÿÖS¶$Záï¨Ø rpÙ •Ãä„J/QÅ @]ø$œ< ®x6Nb_zãr€%€å.m¬ã9B‹;“¿¸£ÑúÄ1ü®ñê4X†ß¶.ö¼ß ŒÆӍ¤å;m¾Îø¬”ñÅç‰#gƒÉÖ]9xàõ`0G}E ÕàUÒ¨MDåæ¯Q(7ÎtØŒWµ#x‡ÆQ…¶œ±#lü™|ìÝî(sq×;[ã䷖Ûø8yQՕ’Ð,CØwÉÊ0>…F¹²$Ä]«¯8±†áùÞ/Ó6¤Ô} + œË[Ì.ntñ›uù{¢–•¤({×~(c°¶îŒ·9“½©ZF½×` ]Èì7GY½Hßtð€€/R-5ê’Yám²õh÷mÔ/çƒhIÔʛ•Ê¸<Ò_Ûef ¡ilÔN©¦(®‹4m‡ô׎¡!`ô‘÷B}”¤í$d/ˆ>Ž²â½n²¬8s4]}”ÔÊ)­•SZ.§´\N\.Q‹9¥%sò%çõØòᙀ±Ó•s:Ü®õVÔú ˆyÇ4»[7%_66ÀӇǙ;ӃÁ€$ÌM£ÁB¹ÙÜ6åxxm÷äßåûpy$¹ëÌú¤ñvÉóC¬sL›°ZÓk¶ÀF ¨Ë·5[àøžÄoi¶[¾¥Ù- —ok¶ðØ·5[à•¯a¾¡Ù§'ŽGþ&f ,½øŒˆoi¶À¦ +,cßÒlSA+ñoj¶ÀF ƒå›-°Ñâö±ÙÌØh1²[~+³6Z ÌÿMÍøƒef ´­#LKVŒ±‡Š7vÂÿ ŸÜ’D“ºI¼À~wøRãÕ#¨¿}¬þGۆB_чæVLȑvÒñ +šß– ÎQ¡ÊhoҍñŒÔ¢ïáxàå{úÁuá5+g^ϖ”"f¸ÍÃí²`_2ôà`d»ˆ‡Æ#â|8Åc.ÑwüœO{PÉìhÍÖæí’iÆ~谐¾j'o Ónj¨PòQ¿Ã‹-!Ø0Ãky˜ÂСw; @»ÆlãêÀ ƒô¹”z:»îâ‰%0Üu³ýT;cƒÑ»é·dò±z#µkÉâ‚$2·¶—³—“u•%癙W¬ÇaÎ%Ÿ£îô½ÿ2Å8øïÞú× -'ÏOýû¬Ù×4ó¥å¿+Têb>‚ª›D*£— …«{ÉÈzÙ½?Üzéÿ_Üf8ÿZ˜õ‡×|{oO­ÞNïáîáeÍmX7ø’E†9x¹éäz­V­õ¿ƒLçúí¹õ2X‹®ù’ûéb1È´®;7­5옸˝s¸ 842ˆ·'%Ö^Çgn#ùvÁ´kdn铸ÈU¯Ü\!Fy|¶=F®x{ƒ²´˜2å¾ÜGsü¢7t(î]à¦L«—z˺¶*G2„­§fö5sš Sx!E§³ÞŸ¥®¶ÙýP9±é†×ÞèÆÃFÉN°hSaá:+åØØö£j¢Rø¦Ì™°r; ôm‰rí·)×µw=ؤÜ©xF™^ ¹`‰?…ËøÖè݋íÀ„ÿqÂҗ?Þ{\ nW#caJø’§¨”¿ôҝ¢`ÌÆ):JáÝH8ŸKØZµLñ&F GÓÉ13q,že –!‚}º4 Åë¤áU½!¯æVôîá\Ð<ð žyL3ÍJѝ1à ¯yÁÆ#EúªÙ@øoÖtÙMU3Ôõp"lu£ÛwëÙfÍú:„Ýh ´oãYøho\QØN†?ƒÛ; ^ã¬0æë:jq11êÛ&k™ÚkÖqпÏÙ¯ë^ÐlÒhñèMµí{/©§ÄSMqlj}’µÃì+€G:—¾-30ÏØ-âå +FOÍÓÃûÄáíA.}wק† ŒÐáuàÊ¡ò”}Kß¿å +‰žéb¹íô¼ÁÓàÍ)L@%7îDl¤VŒI±@. <“‹EiE¦S™”'ÚêâJ‚ŒqŽ´Ó9S|jÜñ†tèä(šÞ^’AjëXx+dí÷uÑf < ô»e £( #U«s?—qÜìÑú­éé +½‰;çñBøµ-åŸø>?}.ڟyWÑ= œê'ÄF +»=ÆtÒ8Úí9œØ0bûqäà l¡M›7³¢-{䄓ílñͼ°¯ÕqÊöµúÆ\Î2N€n>±k5þöø¸š%ñ`—8:ÁB¢ÄÛz²õug]?c@Ð2n&áåÝuñw½üwçýK£¾z_O—IËíÅ3™ðeúo“,’m¼µ‚½½ø4"üy~kE É]/º6›NÜ/¸Yð¡ÿ7>×øò€½göBt~°h[CÃÊïÒÞl ƒûp»éB¼Ý%ÞS²gz³oî‰{_m@ïFˆO¥B ¾÷utÄðšÍÑޕDŒ'`oš÷êJ ðn¯jͪWní2ðî•ê¥Gf¼³(¯Á2o5h•b¬¬ÅÜSQHÑ­¶;*N½ç•mòâåýÄ6/z“QOQW%Ýì8+ûX҇·F”Ó’7}NQ¡^¸õªP¤gvì¤s\¢s‰} +&º4Le«díÈì͔\¦À°Å¢îS€bwÖd ¸ÞÌ[Ú¥·ìéu‹îõ6]&X›¶En¯xíÀ9íŽõ[wï*—ô¤rÙð^”Ÿ}ù•Åèn†Ñ2š?pÊBzîe4’±© 鹗ÑÈ)mêBzîe4š‘§.¤ç^FkµÒs/£±›Å´…ôÜËh|ôó´…ôÜËhÀcÓÒs/£QïO]HϽŒFãeêBzîe4´Øô…ôÜËh¼â›¶ž{Í۔¦,¤ç^F,:Òs/£y{ò”…ô\Ëh]HwÌmÉ ¶a…$,\«¡ˆ·y£+h˜‹>¯þŒUëHý÷íå]°îÂî•~ï^™­'`€¢.9šK +î±7&‚ñI¼8 çÅ= = +Œ-øTB  ô0pKº‰†!ÇOXM3núåj´ u}'ӖÑþvy¸í>À¾Peßx:ž&ðvK…z0Nl ‡+U´‹.,ÑQÅëI^±»öA"Ú?¸Ïºî÷²M_Ê$‡ÞKŒ÷2±{å)i'³g™–mPáí÷¾F6”¬¥ýG©€#Øå!«¥Ý¼÷†Ä+ƒÜø» ·©Ó½Òê:nÆeÅߺØrqgÉZÍRmèFB¾=$ÉÕáê5ùqÌ«h3ä2ûr#Þ1X,ðÍ~kðÖE/.S­»‡—Jã_­žYãÿ£á?ÄC‘5† ¯±| o+Mƒ¿»Æ8Ö* Œ—¾doy¸”àGøêŸkþµ­µ³szíeµg`?Ãh¥¡àP'ᛊ…Á¾ƒA?3JSø<Ì4m¾²^Üø•ñ7~o0 ¬ IA0APքL…ÏiƒP0ᛊA(ºðP5!ÍÑça®iykT4ÅZÐã »~^µW“Ûµí, VHí0í€ïþ$¿O‘ˆÃ¤^Û2paM¨]‚|%Ÿ  #¡`&cP³ªÒÚ6ÌAŸ"ހ?Štk~Š2¥Y¬~Ã\p-„!P„ 4Sf~ZÎJďMØ`a|ù>EôƒÌˆ(Ò!ŠBMÁQá Á ©$d¨!Ô$Ðʸ$𘠅A7@QÐH¶‘¢ +9<ø‚áP`Íz’Ž`%†J­@×±þ äÁ'ï™5D$@i:ˆ~Ds0(ˆ +|2~$#°7-`½~z3³: Ú,àÅ +þeƒ‹~Ɇ˜?±a:ŒTh„²ÂDD‡hՕ¥`„1AqÈ#Œçh šƒnˆ0ÞPµÀHÓ X˜ý,h0hg††rýHî&ށÂD â¯øQ9¬TÃhœ~zc"”# +á 0‰`ÉõÃLƒf³tÖZƒ6Bä%†F†Nˆ@ßA!HÒ¡ü +PJ¨¹.}…{þâ'ZP(Aô½?ìm}fðïCa˜A"A?Êþ +qœ‡Ê +òBÒÁ¢9H +ÓŽà*DP]Y4„B~ø—õ{ýÐæÐÅ"ÁæÂÐkÐ⬟CýÍA¯…AáCBahH ÂñãÄê,hFÁÀ ºN<²ü +£‘…ÐZ(è¸ÊÄz(„9\2šfqç3hÐ#@ãÅE…CCÐ4×H|iÀñÌ„ a=ÁâAS·ŸE-ƒÀ Ì`x®‡t¨ d bα0t Í",´$bÂa$Ùá0´2dá‡éÅc*̅qÂ4ôC8ÈÞ 1hªõä€Þ%À„øù c­ü P¶p::YÐPàüø'h:C¢(!„’„7 ‰úy ƒ$ˆæÎ ûḴP]Ú@Æ +Œ2 ^Hc$Ìv ½ÁÁühZB )#,ƒ„)@ +Œd$ÀxýÈ1ŒÔAýÄÔka†=âGà*Ò +Ë÷µ p!ÿ Z% 3"èkJ$}ÿc@zŒ bàŠa‡àšBÃÙi#˜Ä¡úR¸ 4ÖXÞ@QBa ”x paÐDBCAÅü|¯À“$ ,H£¬Â P©˜Bè´ÊÚ2€Ú ¶ žÿ84%A“]Œ I‚ Â|¡" =QE9àhoÚ BT%Òþ,oB?ûYŠðqè úW&çÿ‚ar 1GEÖ쎵ã#µwDk¹ÜSc ¼“$„±Ü*ÞFK'Faéį?sO­¨h)º×è`- +‰Áoò_¦õ?×­½|jíxÛp&ñÃ'魓²Âè÷í·º^Õå|øËÑ,¬øËь<ñK´TâNô(k6-Ëxc·çkh¾ 0(éã{=ï£gÂo„ad­¡Ç%)B/Áb·I¦1hD!–HØp\üé!B„"ôÝèÓ§Ob¶¼¼8#Dˆ!B„¾ DØg„"DˆÐ÷#”ûàŒ!B„ú~D€aœ"Dˆ!BߏP"ìƒ3B„"DèûJ„}pFˆ!B„}?"@‰°Î"Dˆ¡ïG(öÁ!B„"ôýˆ%Â>8#Dˆ!B„¾ DØg„"DˆÐ÷#”ûàŒ!B„ú~D€aœ"Dˆ!BߏP"ìƒ3B„"DèûJ„}pFˆ!B„}?"@‰°Î"Dˆ¡ïG(öÁ!B„"ôýˆ%Â>8#Dˆ!B„¾ DØg„"DˆÐ÷#”ûàŒ!B„ú~D€aœ"Dè[Ð'û„ôÿ˜Éž"ôã&”ûàŒ!BóÒš›-EèGC(öÁ!B„f¦Å##‚›ýh‰%Â>8#DˆNšñ,ÁM„ D€aœ"DH“f1ËHÃÏÃf…L„ý‡J„}pFˆ!EÒk$š-<"ôŸJ(öÁ!B„ä´x´‚Ôü Œ@&B?N"@‰°Î"$¢yöÕtà!PúC67xš +™¾wS"¤P"ìƒ3B„ñô.’*Zƒ)'ú.Èô½•¡©D€aœ"DhfŒ¤}F^› 7)•Š˜ýGJ„}pFˆÐžôc$ðH }A~*Óžæ„Lß»© š$”ûàŒ¡7-#iƒ¢¯H¹k±/<› +ž4¬L-úO%”ûàŒ¡-éõٖ@]ðH…þ h:ûÊ3‚C& nR…L-úO#”ûàŒ¡-̈́‘t˜”htÌ~"g å'¾C/ ý±¯B™#¶ú è“2´Dè?ˆP"ìƒ3B„~Œ¤cÃMi¯mx4ÆC?åÙÏ~ö3EöiÌÐ{ˆý„g(9nB “"Zú„Šû £%}é{÷¡; DØg„ýéÆ$%Œ$ƒGØR$ £Ÿñ ”9f?³OƒaÈðGýŒgð4ÆM2Ȥj`Z‘C&‚–}\"@‰°ÎúñÑB1’Ìz$CF +!f@ÊÜðI`¿2ƒœI`Ôn ÓW)dú<‚LŠ¦Oc DСD(öÁ!B?2šÁ˜¤ì$ÃH؄$l¤áŒûÅÒ/ùË_|öËO¿úÕ¯t0üò/ä¸I°7aÈô9d’¸1½--´Dè;J„}pFˆÐŒôz&éÃHCg#lBÂÖ# <úåÀž_}ŽÙ¯?ýæ7¿ÑÁÆ¿øå2ÂMË7-£”—QË(·e”ï²°1‡}À±i-·ã¤héAK„> DØg„ý¨H—1IiÃm쳍ÙÆv$#ÉáÑ;û€öþ Ï~÷»ßý–g¿ÿýï1ûÝè/þÁ2°ß,£—ûõ2ÂMËdú¥2ý A¦Ÿ"Èô™þkYf`"h‰Ð DØg2%lQŒÐÇ$  ¤í™¤dL’Ø‘Äi Pô;ž +ÿý§?þñ˜ýa̖öûeô +b¿[FàIŠ›Æ [™ 2ý\™|Ãhi¡¥e‰óAK„>( DØgßQFæ£#éJS7Ü&02!aŒ„Ô5¶‘Ñ>ýéOú#Ï@…ÿ ³å?ÿùÏ ü±?,ÃËcð4ÆM2+†L?W40ÐÒ2AK„>. DØgßFÀÓ¿‹d铂{’c’Ìg[jGâ1’Äz4DF€‚þûÓ_þòÌþ¼ *³¿,ÿío2á»?/£÷V€ýi~öÇ„›V7ý~A¦Hþ7+hcnA¦˜!~±260MnÇi£¥e9Zšl¦ïÝq„þ¿&”ûàl,“„-žðô±H†Tݓd.Üøf‘IcÒÐ)I #MH ®ydô ¢O€‡þºü÷¿ÿý¯Ë ½ÿ¦ÄV€ýu½‚Ø_Và^Á¸i ™• A¦ß® 9™0Zúå +Å°2ގ“¡%äê ÓçåYÑ=BߐP"샳ï&#¸éßEª@Iﮛà½-ÛpÃé7K‚iˆ‘° ه0<ú°çoËkkk_¦(ê<í½6f+ûÇ +zŠØßWà< !¤7†L¿GIf`¡¥U´„lK#´´¢€–>´DèßF(öÁ–D¾%û·!(BÓh ¤eLúÍòGZÂ{mŒôþú 4õß?‘‘Éd¢–Íf³qÙb±˜0[‘0#Ïàj^^[…Ÿý}A¦U™VdZEs«ÑV!Ëߍ Lc´„·ãx´´¢Š–„˜8‚–}7"@‰°ΰ6û·a)™æ£w%I˜›Ø3I0&ý“ÆþHbŒ„LH#á‘iÔµyÙf³Y–ív»e˜uÅápŒþβ +¯˜WáeÓ*à&j~;†L]Es2ý7‚LDhé÷«-­b´…úåÈyI-ü–Z"ô]‰%Â>8ÃòGØ{Ø7ÆW‹ÁM„Ä4(MøqOžðs5cÒxŸm쏄÷Ú;ÒÚ'ÀHØz4„G-ƒº¶­¸\.;bŽ·Û-b«Àì«ðÀ¶ +ïYWxB¸i ™þ Óßd£%´· +pí·«Ü~½*8/ÑÒO1ZZQEK«â{âD.KŠh‰¡…J„}p†E°ùØ¢AÖìà‰@&]¤ ””Þd±n²]7Á3é÷Kؘ4Þp“a$lBB†# –12Mí\ñz½®ŸÏçæMÓîUÌà£kž:ãqÓgø™õ3‚LŸdúŒ ÓgHþïŸ!£¿~þûßÿþçUÈ|¸‡œ—ÆhiU-I¼EhIÁÁû1+úD€aœa©#lQlnh¥7½2ýÈi& ¤t(€Ò®›à™46&ý m¸ýa$ê¶# ɾ ˆÇ¹,À#Ï +hjï +˲¾Žã|«2¼ŸáÏgO®Ïð çgPðcÈdþ šŸúŒ L-ýí3L þŒÐÒçI´ôK5´$‡SCKŸZ"ôMˆ%Â>8ÃGØ4†¦Ë÷²™PÕ츉@&ý¤(MóãÆ@ Ÿ€wÝðQcÏ$lLB>۟?Ò'¼×&ÁHn<òûýÌ +hjv5 bÆ­†B!ÌØÏð‘ù OéÏðžï3üƒp†LŽÏží3¤Œ LFd`ZûŒ¶ãZúËg€kC´„\½¥hÉ EKÿ¥†–Ô]–Z"´@"@‰°ΰ¬¶(6;ÜÒFPÚ¸Id"hIL:€’jÀ›’{:@´ë†=“c’ñÚpûäp8lcŒ´Œ1Çq4†G+€‡ü+áp8° +š:°Fƒ˜}Xà3<ð†W8Œ›¾ÀÏ|_ Ïdeú‰Ú¿ Ó»ÝnúY®ñÛqÈyiŒ–>Zú­-¡V¡.?¡%…£–t¢¥³HZ DØgXÌ[Cu¦U©‚'¸‰@&]ô €Òï—ðyx× ”Ä{& Æ$ë'ÐʎeÐÊ®e6Þe€8Ì +2ax´‚‘Ñúúzx5‹ExÇ#ŸÇ ¾ ü‚pÓÐèÜÀWÌ¿ßïý²¬û 20}0fý° £%ê‹6ZB'ˆÐTí'r´4rð^¼'\–”Ð!B3J„}p†%Œ°0´)£È´Q•*xRÂMß2ýO J#÷¤%Á=i¼ëÆ{&acÒ'lLBþHˀièeÐÊcŒZՌ‘Ñú*èçÕd2ûœJ¥Ælã3|·ñžF¿lnnF¾n +}hø©°_sÑ#“ó ¨Û˜Ìc´ôE‚–~ÿÅÄ}ÐÒ/Zú¹-!o„–ä.K +hI”Z"4 DØgX¸34 ¾—!ïE¦Šª´Á“ܤccŽ ¥!éuæÖJøîÛ1P‡ŒÝ“„]7 2&Ù?ac(dß²ßïg—C¡Ð#≮öááÑj:Þ\ýœøœÍfŸs¹ÿ×`›_àAü ¼û/¯cÈôY™¾BRÜWH”þ +É{¾BFb´d³ÙDhé‹ -ýîw¿û•-ýt„–¾* ¥•eÍM¸O?"A"´Púè@i{{›¥7ÃrEØ{Ú{QgÚèK AÉÀ“*n’A&%+“^ӏ -i¥1Zš(ýaIðã»'á]7t +À'¯×;4&¡ ·ePÈAlGÂi%•JÅ1»Z‡.|¹n͚5KtèÛ?'ZšËђŽhI‡ßιDK™DK©DKIZœn<ђOCÓá40='ђMM Þ,e‰Ñ’*DKe8e)2-EJY’ýcFzLÐ#zÔm” ÄzL֋²ž•JÙÙÙÃ@ ßQ ´qãF ”>Fat-É0Á "^222 û6rÂã+£8xŠÎMFuã7á%öã‘ý–d?-Y·É%Ö s 4}úôÁ „/É`P·ç“OÖ¬Y3 ”ð›ä“Oð­J>auH%/ìË$$ÌoË ›AÁ*Ž 8xâqçoŠˆLì/ÂÁ$"÷‘'/ ¹•¢gt¯ÀUôQ+0P +Ö²%L@‰Ê0P’ñ@ ýîzÛ/èc·+Ðw~«Üµk׏ÊòòòUeee© +(T¡Þ¿¥úÀ{5 ŠO+µµµµ:pS™ÛíÒãEú²²²†’’’ìo‹{ÞhÄ1ÖAKˍk×®]H´4׸hÑ¢™Fõ#¬3ß#Ì2ÀôÒ 8ï$® ^‹‰Ñc°që`W(ܪ…I™µ„ Ӓ6LK*s+á~)ÞLKüû/ÑÒþ#E, +==)ú„·ˆµ&Y'Í:xJÜz¸ ”Ø2o(}Ì +FH",ì;]˜£–'lÞZñŠƒ'7ED&˜cîãˆ&Ž–8“P8Ž—¼ôQÒÒ(3ºyS߆SŠ'zM¢æIû„­õ†|(É(¡{Ý¡ÀWr§r÷îÝEʊŠŠÝªªªªrUˆ‘ªÔuuu5š†††}L´m}}}•oTêLåz ÓnÃÞ½{‹ ­0×ãZZmÂ!—™ÐónÂ@𩠆>Ãëœl„%æaz™F\Š¶æ7Êã ¸"¯ è"Z²ë0Y´„#Z2hBA8:„JKò0-ÉĤ,¯©ÈÞ,Òcbû7±Î$.ê=[De®(7”X­IJ܄7”"V@éƒf’ˆæ”–ÿÇ ·8‚âà‰ÇMœ¿I™X`Žýë`â…㸂"’—¢§z(´4–Œîá5@)‰úæ4jôÊ ” +dhËi24òl¥ù²á ´…@ékEQQÑ÷ŠÒÒÒbeeee™²¦¦f +ŒT­íS:t¨V}äȑšÆÆÆZ&xº_wøðá=¸©JðàÁ= U©Udní4-™Ð+iB?¾Á„~•iãƍKL8ƒù&œËÎjš æXh²ç˜&Ožœn„­Œ0³#xÜgÀUyô¸>§&e#Z2ë@KF- IO´¤Õ[‰hIE´¤T…S–”a·ÒÈhiö2Ì15JùD"¨ñ|Œˆ‘¢Ü¢;“„êqséIì%û})”Ç-¶2€´ÌÛÇ,Œš%°6OØŒ‰ZqŃ'Ž›8W‡LÌAÌ%‚ÒÁÄ Ç9yéà¥qœú6P#€ªNRS¤RódQ¯œO 45Jhóa „Þv‹=ë׊âââeee»”{÷î-W‚xöªêêêö©#ŒêÔMMMõšcǎÕkCR§Ãkôxw¿ÈTmUí1ÔÖ֖«««-}g-m'ZÚlF¾Î¼e˖fÐÒb3‚yfXì,3NmŠܞo†Õe™`k©&˜Y’<oŠÇ@án.Ò®‡5Yu™L:’A Òi(G´¤V³ £¥°[)LK2ÅÐ \äïh2^d$Ž›¤Çˆca¤ˆÓÜ":“¸¹nBõ¸…Ò“"æq Mx“jM~ôÂ<‹’ŒZؗ‰'ì—PqÅã&ž¿I2±/{t“Z⒗F^yIìĸ÷–†Œ#Êèžú槚ªNR£dÖæËÐnSehËP‚,‘…@i#ÒV¥o‚ T^^¾[YUUµG Ø©V644ÔªŽ9©A}üøñÚ'NўÞGD<šFŠp㦹Ew&ñwc?7Ù¯ÏèQ·èéI҄·EXÃK"^˜ï5¢°/'<Œây£ØwP2±:ÑLÃq¼ä¥¥z4´$¸—Ñ-<õS¢N:‡e5Ô ï3:äE(Ɇ‚’|(P=zô’œI*°O‘Ô £Í¥K—Zµííí­º´èñÚIÞ=nÄvGM­­­‡Ì'Ož<`-U[@KåVÐR±­ªªê;[YYÙ6{QQÑvôò«èþ—8`¢ó8µÙ˜ÞT; .ß3˲ÃÂRm~+.(ΊKóZ`M.3 Én‚ YŒ²LŒ`z=îˆNˆÔpA8 ¹•Â´$œ²D"JobZYnPÈt2ðÙ1"Ó»²ÝwòK˜7¯m̌ÄÜxÓÜx™IB)ÜÜ\·èQ7^zÒÈó¸%Pú§ ksIF#ì;ӈTŃ'7q®&™¸ÀsGw0ñÂq\AèÉKcž÷¡Ð’Pü-4FÌèŽ>õm FS¢NºúçéÔdŸÉ@¾ e@â2˜Àz¥-CA©\±ÿþjECCÃA%ç°°Ó¤:sæÌ Õùóç[Ôà¡3šŽŽŽ³ÚÎÎΠè mú˗/·ðÆiãŋ›Î;wÔL´dÁj­ØU• ´Tf«­­ýѾwïÞo¥¥¥[è¸×;Ð߯pÂl9a“Ÿ9q~38ÓIÀ]®cÖ¬YévŒ3ÉvPx‚ î³bÇPŸêÄÙ8qâYNWªî·cŠ³á7»× +CrYp¹v3.Üb‚ùËôAZÂ½Ñ ¢¥pNÍ Âq¼Ce¼å|Z +IDRŽA"”DKôxa6n^›P>‘„’’"ܸinbI¼¹n£nBéIR÷‡(¬¹%‰NU®<{öìiÕ¥K—ÚԌ‘E5===íÚk×®µë®_¿Þ®‡\4àµóFpS›éʕ+§ÍDKVÐR£ ´Tg-Õ8Ž=Zᨯ¯/vîÛ·ï[WEEÅV¾Á^~¥»Ø ŒŸë­ÏtÃà&»`f¹.ðx†—‘ì„I%8`M>; ÉmÃå°Â|¬\½É„û`0ÂhtV{Qëp«TZž[):-‘ÈB¢à vðYNTo–ÁŸx#2 Eçd‘éÝç܍ëC,Eg¤èa¶èŒÄzŸˆŒÄ%%E¸ñ¦¹Ew&ñJq¼(€J˜°––d„¾$%"Añ¸‰çoò2ñbr¼ ¦ˆá8¡ä%±©ÞWFàý¦%±Ý‹™ð¦¾ ¯O?i§’ëoõÏ ¨@ &ð%%ÙPP’3PjnnnT´´´œPž;w®Uì9§]Tƒ‡:4 £Ëڛ7ovêz{{;õËZeF7oê[„yÔSagS'½€o™ òÚ (Á†¾–¥Ã‡×(U€nN*Á9gT žóª«W¯¶«B@Q—öÖ­[Wu·oß¾ª‡túúú:x­ÃŒw/X®]»Öf-²á³ÇìØË!'ö·ßuüøñJ÷‘#Gv¹8𝧪ªj›·´´t£ù*/,v±æ8× Ó›éÅH2É Ëõàyº{ƌ¬)Á Cò9p‘n;¸ÐaƒåX­°“Fc0¹\.÷Fc°Z­j¢%ђRKA8!ZR„ÖÒUÈC¢”sñ¨Ã‘Ñ ÈÄ +}L€›¢#“\öÁÓ҄„Ù¢§"Ed$.g;:# %%E¸ñ¦¹Ew&‰˜ë&¥'}°ÂY’ñ’è%ätL</ƒ‰ Çñ’—xµ¢§zGŸ÷qÐRČnSßp#„§¾1Pb5¨˜5Å,jžùÔ?/¥^y­ ͽ9 J?Êx œi"P:¥¼páB›²³³ó¢ª»»»C}ãƍ. x¨[{çΝ]þîÝ»=ÈU#ž^1ƒ›:,½½½¬ ¥3vÐÒIhé¨óܹsu®–––78¬ÜsèС½8ä×18ø—1»víZƒN™Ö¹ ƜÜÔ@y¾'ŸåÅ°“â5ùÝ0¤XlÈã„ù8í¸f› c™Ù +£1š=Þ{ÑÉ­dàáXʯ&%DI´yXxd4”x42ì`42œ›xþ&™i),B´ôÏ Â½«0¯†äXI()I(àÆÕLšæ6Jg’uû…aIÆADÀ›¢#St“-qá8^-±©Þ#Ze,%*ß»ê”A)DK"¦¾¹‚Sßx5¸bJTu’Zfµ¥524òf,b‡¬¨¨èGYEEÅ P’3P:sæÌ)åŋÏ*¯\¹rIìéT€®j€B×´ £ëºû÷ïßÐ?xðà†r͈§Ýf¼qÅŒj·bãóöëׯ·:@Kǝííí‡ÝgϞ=à9uêT¥·©©iWL}}ýN_MMÍ6_yyùÆXœËªXXì¢XXâg±°º>Œ)“|àñœØUšwæ̙I\U¼6ã‚ù¸œ°»c™ÅFn%+ìÅ`Ƙ§3ÁT4Æ!n%!ZRA)$*ùÀl§Ju4«‡m»Ö‡~‰´ôB}ëÖô2µ¨ Åݬ6Äóµ(˜ßô<3šW‚Úl•ƒÍÚfâÒ°¿.É8F(ó>±Ðã¹lO:Š=c'”ò J J+Jë JÛ Jûõ°eGu°jg´°o— J7 JwÖù€ $âo_2¬óAé‡_‹¥-•!Á[‰HYb‚wˆ–~ -}§.|m8¦Ã‘–‘´dew¸â´´—´´Ý ½É…›¸†E͗3y©€–sÃq3é`šJ·ÃDÆäƱªÀ î(ºšF0Ÿ8Å0þ9ÜCFò`•‘nNy'Nç¹°ƒ‰N€ÒTÛ;°ûylÅW`cü͊ƒ¯a?¾Íf ÙNº•ö ·’‘n%ë]³˜ÃU=ÝJ:&×òµ¼Tá¾Ð·±‘´ô#iégŽV¸[©ˆ–ÊìV*c9ʈ”¥¯IKŸ[pV‡R–î8pÎo‘–®ºqç½ ¥“¤¥#¤¥}q¸Þí W®\ِˆÇve2ø  /Éì4<ÙSYÎËÄÃ?ŒSHûgz±2Y—lNe©Œ–9¸ÙMX]¬á©!ãtu3!ª3%¼R:d±ük‹'²>k\"ÆÃǤBw,vêd[@ mY8ú&'Žktà ô6¼Q:+Þ(­ãa2™Æˆ3UXÑAÑáÄe°GÖ⑒5·nݒ¼e’‚Ç, d\e˜TÁ¥ÁÍ$܈ A xÜ$œN™„—ID焃)‚–D$Nä-‰,o1'NáD½%áVRs»E¶’PÜÐAM­¦u‹ø›PÍóß*Q)š(¥rñh‰G”bccï%”LüSDÝl\ÏÉ7ÙÃmƒéIx·"‹PÔgyÚß²(À32ι¹Œëh§à;+¸=4ì§Å‡Ø>ÉFëg̘1Á0oÞ¼i¦¥K—Îb¯ù,ŽSÀT†%.¾e^ÑzêkE<ÔërF¿–¦B½d@¹-ȆҟSbFeˆÉÕ8­&–Ž¨ d\+÷­ZêYÛ¾\Jºc:‰êÃ8´&2µ¨ѬDÓZ5(ªai³ÊX¯EØÚ6YØÁ‹éØU§ì¾{"ìþkœW4-$†{¡wǹ Ç§9 •ç±ÖÐR @i  ´• ´— t˜ tŠ t‘¦÷AéšÞ÷™Ñý1Aé šÞoñ7˜J5þö!Pú—âñ·pZ•–ÂR–ŠÓÒ¿(¡*Kj‚·–Á&¦,ý û駟-} ¥o¾ùæc#§Ã‘–޲ܻwïiébˆ–Žq6àëÇv ZÚ %¶Û`òRÃqóè`šIÓ4f0M"2÷ÁêŽ%2¦«i”æxd@‘<,Éî ™z¢ †yŠô5Ãޝã`ü͎Á[jcZ7ÍñöšÙfVÝJ°¡ÇwîÜ9c¹•-}›NÀwéüCö)ÙöKp+ñn0÷“R”Ûý¤¥0·’üß„S{Â…× (JYúʌ¡øŒ´ôié};û㐖Þta(®x@K缊~0áX¶Õ‰ÇPl%-­K³»<¯ËÂTܗ™é¸C“^‰»6$‹òñ潒ñ蔃ñhÇzÍs0(éoúEƒ,ˆÚ™U3° “Ã3R1 -)쟒„Ä$`WÞ8ìÔÅ÷×áØ[Y©ÕÌü5“g``¹V½ƒ¢³àÔ´&à‘ÆxãÆ …Y÷ -ç(Ê:ê_” “àD%J5þ&ŠPÖªU+8ÿ-Z¢Ò#( oT9(•‹_¯øÿJb~E@ ïŒ&Jx…t$#=…"JXjçz.nᥗ8–ïV"wšÆ¨[XQžFžÕïXàY¹U«V-å:¼¨à*»*}úôyU“››;@;zôèaºI“&ÕϜ9s²aá…ù¬ª2ײvíÚE6ØÁ%Ì9Yî‚Í[é…5-d‘ÇÂ8谕‰  ¡å—¦Ãð-ʵ̫1³2ÄÔjøm|M,U69·.r¿z@œ^õa º5-ul€]½ØÈԆ¦ŒÉ5« є MÏÕÄoM«A<_ë5göS+†÷ÚÑõR*vÚ5 êÝÞ/:v(AiŒzw -Ai6A©€ ThúðÃ7ñ•¿K öº¶ì8}çJW9õíAé]‚Ò‡¥ÏŠÇß~$(‰øÛ?¿ýå¡A©äïHZ¢o¤8-ý¢¥ß“–¾Õƒ-¦Ã…hé¶JK–"Z:]œ–öh‰u ],ÍTïå Ç07¾ÃYŒ´N§ƒi2‘i‚qµ21ÌæU~íÁÒ±˜èq¥ n‚’‹‰JN&*9s`Ûq´•ì^¼ÎJ·’…Õؙ f8ÓS¬zÞÀ–¹z^ƒpwt¸¶€[IK:dîkMq·’"ÜJ¸W‘n%ù –D ‡2Ô `«@ÒÒ§LðþІ¡x׎Ó}ۉ¿AZºDZ:ãÃe‹Œ-튃lNÄc»&ðÒ¼.óÓðFÍHÇ3>1æ‘Y¸kƒ²qÿzgsºhˆç¥1 Üô|îóÓÙ¿¥¨Çbc5Yôµ2+Že§aåt–KNÆâñÕágí1O,FÚéÇ(ØY€ÌêÆqÍ.À‰‘.G˵ê¬85­ã¡14…uV½’Y#TfEu™ýg$D¸TI¯Z@Hü3 ¸Š„Q’¸Yž7 d®&áe&“SiIDâDޒÈòA8QA@¸•D_QË[d+‰>qÐpAµ®ÆßDÉîFç¿EKTÝr£ê.=£»”ÊÅ#-PRŠƒ’¶8()ÌüÍZ<êæã»Ç]%1Ğ( - ғX€¡ø†’( -€3m*·iÓ¦µÜ±cǗ\t7¥_¿~½5C‡Ì&˜#Ùài¼~Μ9ÓXw–©°°pyÆ ‹Yiy¹z·ù «=`š5~z!8Ýlu"Ya -Xey:lÞâ,hÛ fWƟӪAL¬¥£kc½¡uaÔâ¼VJº{ì¥iéEÒRÒR z™šÕ#ՁxŽ9àÏUÇÒ¦U±^³Jà«9ضM&Þ> ;휌c¼’¥Ú‡³°û€£JøTÍ·”°ÖÐr3ôóz‚Òv@i?Aé(­î¦¾\¦Õ}“©/·é£¸ÇøÛ'¥/iu¿ ÅßJOëþ·°´îA© ´D£ - Z -L‡Ó„¼£ÐҗÅié½-Ý$-]%-]ÐLôÑ0ZÂhi #³Æ[¼Ü#h‰û½,%Íb•3ˆLS|ô±È÷xG䦱Bx‹D“œÆyJŒâMvcÛi.ÆߜŒ¿99ÿÍÁcØq´Õla¼ÑÊ3 c/»Î2 ·,çYÖ¿ºÄ²7„{›A¸wu!·’€û%ƒpߒ–~/r»…[‰´t+…r»£ÐÒ¿—•–4¥¥,ýHZú>²Ä~LYúĊ¡ø€´tׁ¡¸EZºîf?f/øà´Cñii?iiG[í$áòW‘–§âu™“Ž7eZôq 4ÏÂ]À™ ½rðvÍÁí|1ԒE3šžÑéԐÁº:ՙéT‰¥Í²R½©) ŒDæƲ¤†/{vÇàÀƺ“¸j`q =«é,x…´&à‘†àªÐͧ0(*sf¢ÌÓ2{ôɬ¨.)ž€¿øâ‹0! ÁÁ•%AP‚›Td^&á`RiIø–D$Nä-‰,o„D½%áVµ¼§M›, &Á©iÝB‹"”êü7¡©…’úYí–QQ©¬Ýå T.iñk%¹, %üÏÌ"êæ`ÔÍÍÍüÜA|XQ€ˆô$à©=͵Íä^x¡­ŒËê¤àò{( è§1bÄöÃ&˜“ôP73 PªID¦ !dà&þž§ñôAMô°F'ÕMscÛ|ão|†:1 Kì‚f§[Ɇgc‹Í. ÝJfXÉ7أó¼‘5YÛá&ƒp·éVzŸãt+ᢿfî{ nď¤¥Ÿ•¢Üî"-=À­T*-•R7€ “Cu‚´¤¦,±Ï²Cqώ3½CZz˅¡¸êÁPœ÷²=3iép,hi_<†b["àd};ï¤àF,JÃ-™ÅÇ{2]§cm’»ÖÓzä`P:åàv¶#75§hLxú=O XôµÃvU3°^…4l‘Á\ñ”dì%!oOL<Þo,†ÛåÇÀÛ½`$+§‹š8 £'dà\oÖŒ·GkÂ9kȬ -=| - ·Êì™(sf¢Ì®3’‚OIÇJ2.:RH\\/OÈ$ât´$"q"oIdy‹ œ¨  º•D¶’è|"&Á‰®º"þ&ª¥¯ÎÕºÕD%Q( ZF÷מ,¥rñH‹_;(%$$„ƒPHK( d 0QX „Uœ\ÙÃÍbøñLOÊÉÉÉb°½’Z€¡ø'”oÌð| ¹}ûö/Ê/¿ür÷¥—2xðàšQ£F ×Lš4)O;sæÌ):¨›Y(žÆuëÖ-1oÙ²e¥u÷îÝk8É{½˜Ô°‘…°7ÆB™oH€¢]— ݾ:ÚvEĒ -ó+C̪†SjbÆՆ®Q[ ®õߧvÐã1¨¾.Aqw -µ%-µ$-5cS”jãÏքhR KŸ«‚õž¯ˆÍZfcm3 ê;”º$â@= JýJC¼¥1¥É¨úY6¨úEÌp.4AËo4@?ï$(¤Á=F÷Ä9Ü+LTz‹ñ·»Œ¿}@Pú”n¥¯J߅âo?‡âoÿDƒûç_+-E$xi‰i8!ZúI[l:œ ¥/ŠÓÒ»Z‚)z“´t…´tþ´Ä"Únæ]³cÜbƒfl'h)ßGöáÄ©ÉD¦‰aÈT$&Pb’ÓdVÌyÊwÔÏfÖø|̉]á –ÙñDl²Ñ­deú”'tȌS;ÎF}gè˸ddéïm½p+qªŸîÛo¿ º•~üñÇ [ wã ÂýQ¹?·»d·R‰´TrÊRQ•¥?êCU–ŒLY2á4¾2c()K6 Å{vðÁm'ÐàMã²Cqև¡8ƒk{=´´;×»…´´6À²,Ïó‚4<Ùù¸9é?•…ñÌú½s0(Ýr8"#ӆâyÂÓÓt:ý&ÖËÂҸϕӱrv*nvZ -^µ¤$ì*Ž3Eýqؽ;rúpH›·ÝÂä>]±F~aèù…¡ãC£e†Ÿ†Ÿ -ß…i~2GAfâ˜Ì2÷2 ^Ilf,±…¢$’\*q=IÀ“ŠL¸/÷ђˆÄ‰¼%‘å-‚p¢‚€p+©ÙJ¢ó‰è'ÒºEümôèÑáóßÔD%µPÀO<=£ûo™úVJåâQ -(iŠƒ’> ”𧅠ì|u]|­¼|­JIObQ†âŸdP¾ Ϲ•Œëè ã*»É}ûöí­ 2d°fìر#5S¦L™ …’™®ƒº™«/,,,0nØ°a¹yûöí«-0rëìÐÀ99f³h!F‡ýÎ4ۜ¶!fvm´íªLjùˆE•ðۜªÓk`• µ@K£ê@5©Zê×Z¯çcL1"-½DZjGZjٚ°3˜ž«G<ªCPª…?Ÿ­Ž¥Mªb½¦•°Eólۚ ôB*vÚ) Ç菣õŽfÄ^[#ÝÐ÷J3Jó JËJëŒÐÊÛ¨ê÷1Žs„ñ·ÓLTºDƒ{ƒn¥wX(à}º•>&(}!‰´nXÝhiÝep+•JKK.‰–~P‹„hé¦ü DKoGн'IKo0Ú"hi·“éՂ–ÜÅiÉË6e¤¥9>Ò|Ì="2M&?‘É/sEb’O€€jªˆÝqRÝ,7³Ÿ˜5¾È….s²[®ZoÇc±Õ†ƒï²âñ9`Á ½a†©<ÅÈÏyá®Ò¡q“éø·9xïsð>&å~®-r+}r+‰Üî?)÷çv@I.›[©dZÒÞ_eé ÅïIKߒ–)KVo,Žáò_»vÍáÅq­nœÙ‰s1:pVÛû￯gíw+uix†4\‚¢â(ü̐92£×2_!‰EÉ$&üIrq! Á¥× p“@&áeŠ %‰yK"Ë[á„[IÔ[ÙJ¢–·˜§ÆßDµ€©S§ç¿E$*uèÐA’ZµjÔÙjF·PÒ¢ô¤:õ-¢F·%8‚xʐÑ]JåâÑ¿nPRÂ@ 稜<¤ €„‘BDݬa ïã¶Áô$¼Ý類%jzÒãLOzŠ'ٔáù62.¦£Œë}Eîß¿_eøðáC”qãƍÑ0ꦝ7oÞL¶ Ÿ¯_½zõãæ͛ M0wkÙÚt£ Êw ­Ú67í6”Ö6~Œn%œlæGð†4hÛ5™À”9‹+áÏyUY&»V™T +©Õ<´¶íߚÿÕÇ°«n ¡½;6„ú¡!Cj¤¥f (êB4fiÆ5 ž%(=W [Œ–p½wMœAÆ{pƒ´t™´tŽµ¼Oڋhé@-ÑcHZZí)NK>•–À>Óýôù™ÁDZšì/â&áošBÏÓTÕtz£f²"ø\Æó2k|‰ ¦|¥£ºÖÁzœtµÃÆVV3`[ããfº•LwïÞ½dÄ9_gî½wéü€ÆúSá¾Ôbð¾!-ý^SÜ­¤ËíþKZz€[©,)K8FԔ% ÎêÒÒv'-}LZº¢¥[‘´Dßi鈃´ä$-¹X2‚–¼,› %ÀÎ\«Iú™¼DZšFZR‘)(B ä5°òæ<Íg<¯@qbñËUN ízt«È.Îà€•~-ì^ÇÞÆçMìÑ ÜMFð6ƒpïÓµñƒpŸÑb¥ÅEÇ Üš‡p+…’TtÛÿÅ­¤ÒR))KE´ô ´ôµhð9iéchî}ÒÒm'Îù¦g…´tŽ´t"Cq(C±'—º5 ÏîZÒÒòT<Ï ÖÎÏ`‡ÒÒ(ÒÒ Ÿ{çà®uãì†D¦ÖMéozŠâñ,,¨›‰Uª39¼ç>dqâEjv•˜ˆÆòýõ±h¸Ûûìðâ9°ºñº˜x]Lv¼.n¶Þ4Õ±³–’Æ€ëPô¸"EGFâm— ©2ï½ÄÏ ‰QPI..$.¸J™„—IВð-‰HœÈ÷SäT·’ÈVÕ)E-o}âDWÝ 6ܗ¨4~üøðŒn¡å;vììh"JOFL}ûo%õ·rP*Œøƒ`ç>P‹#@É@a¤Q7—:¹^0= oT´ô¤Ñғ¤¢ô¤®rïÞ½_“sss)£G©LžÀ Í?Ü Í?ÎÍ?a„¹Œ¿-eüm Ã[J{Â9LP:ÉàÁ~Òºe5­ÖïsI¸•`#Òºÿá—Åßþ3*-E4=‰6®DZ¥–Šhé÷¤¥oIK_EВ©-]'-]"-%-ÑÒ~ÒÒ.AK„ã žâ´äcU$AKþ"ZÊgg›é1D¦âQL7 ‚ž§|ú fÓ5Q¼Eœ^·”EœV²œÓZQÓÁòávº•8OýcyŒÓ¯Î°Áñ%¶£¹nn%\‚êVúD³ý]A·¯,n¥ˆø›¥Ri)"ÁûÏÅi)²d)KE´ôié3+Ní#ÒÒ{œî;¤¥¤¥Ë^€È?äX,®í`<Ö] ŠMIŠÕ)¸ü%ôÖÎ%-M#-ËÄ#?œ_ ýIK½r02]ˆL/P´Èæ×Åï§{ŒùMµ˜éT5 [T`¤:ƒÓë’ù]Ï×Å‹cxØgÅɪ˜v‹ …Ɂûl dřêÌ8g­ g¯áÓ¤0«èèGҒ‘´xàdzódÆ>%!d!p7‚ÿ£TdRiIDâDÞóÂA8áVÙJ¢:¥ˆ¿‰Î'¢Z€èª+æ¿mܸ1X­[ -MàDF÷ˆ#$iÀ€ѧ¾‰Ý¥×(”Ôå T.}ñ聒>J¦(á7{”âããƒéIØA"gi”%=I*JOêÎô¤>òСCs•±cǎV¦N:I3wîܙÚ%K–,Ю^½z™~Ó¦M« ;wîÜh„ Üj†ÛÉÎ{˜F²×ÅV(­}L›Þ»;‘³œS˜Žšm»> ÿ+¬ZZRKçWƒÕͯ …<©66]ú~H}Ö=z :»gChﮤ¥¥¶¥Ì[jÊ9qϲèÒ3u!ž&(=] ž©Šõž­ Ñ4Û6§Õh“†ýµOƞ»$à=ø‰ÜׇÓÂD¥1NXØÉö÷Þ{o–Êwù`%ãoÛÉøÛÆߎ1þv6Ö ~“ÆwÂÒºaÃÝJ0án¥biÝep+E¥‡¢¥¿„J-ýsqZú9’–X˜’´ôíÛG¤¥÷IKwOy+Œ–`”-'-v°`v-±@¤ %/i‰å -´ä/¢¥Ù1E´4ƒ´4 $IüOü–ïÇRAUµ€Õ¡{Dmðcǎ­æ”» ,U°ÕQÝeǀ°Ñ­dÅÓt҂S;o†¿bb`#x÷6ƒï©n%]„[ ÷à'ÒҟDÉ¥¨d@YÜJ¡(hÉ)Kšˆ”%ìùB ޑ)KœÕ§¤¥ìxÌn¹@×=¸„‹>ÐÈ©ÐÒ¤¥ý¤¥í‰¸Þ ÉŠ•ôÖ."-Í"-MÎÄxŒÉÂÊeݲ>¬òڝÈԑ¢ sÏS<…?ÃÔ¦z¼éX¹R*>Q²8³. pwcùûbðêº J‚’ d&(™ìxJ V|¨2~üøÈ2™´ŸU†÷2 uW2´Ù¶4ˆYk*à·å•±ta5¬7«Tý”ÚPõyu¡Ÿ‡Õ‡¦Ðû{•n¥—IK/ѭԎ´Ô’´ôiiiiŽÿþýó™îTÀ¦K™UÈÔñuœr·Ù‰ípöÚqðC6<>Ǭx¤ÎX½9cý:+ˆÞ"ïÞ%ï~ Ç}´™€[I[T2àš¢’ÊV*”Ê@Kÿ¢ÒR §¦, ¾7a¾1ãiú‚´ô± çwώ3½ãÄSwӍçïªhpÞô;<‡ ܓ€Kݒ„¡XKZZFZšŸŽWhFô ¤¥|øfáz•ÞÕ®D¦IKbVh†èžÌ„xŒ T›AêªiÆ -¥ ‚Rr"Æ7>#‹»ëaåp'kˆÛÝxS,Î"P2ÚJÜbY€$”¢Ç}VX£Bæ³&kp½2Ÿ¿#‘O%YüM"‚–T·’ÈVŠˆ¿‰Î'¢YœHTÂ, ft‹BÝ¢ÿ›:õmÔ¨QÁÝjµ™‰(¦¤‚’ZL©”ÊAé£øՂ’R”´D!¡H€’‘Â%Wqse7‹ãˤ¦'U`zRµhՓDz/¦3/¿ӓÈøÔ!Oœ8q¼2sæÌéÊ… çiV¬X±D»~ýúUºíÛ·oÐÃÜm3Bí2Sö±éAÎI:äd8ÄÍ€ôؼ9E¶7‰óvÒ ¶dâÏu9X°²”ïâªPÃsk€–¦Õ‚V_;Qª~Pì¯7ÝJÝ JèVz´ÔŠ´ÔŒn¥&¬·Ô˜%*Ÿ®ñAé©êXúL¬÷lEl֔ÕÍ3 þÛpNu{ªÿ®ìѓñ·~^œÁP‚ÒXÆߦ0þ6›Óx -[ÅøÛ&‚Ò.ÆßDZ÷qÆßÎ1þv•n¥·»KPRÝJÁj0¸?ü­ÕÊJK¿ Ô’JK¢ÔiéAKl¨û)iéCæå¾Ç†º‚–nò¾\%-] -f¯¼c¤¥CZb[¶-a Ö{نÄGZò Zb}$AK±¬Ën!ZÊ'(A‰N§9ªytD‰Þ&>­`‘®Õ³âÔ>²aÞs€–ÞqáÑ{Ó ¹ìÅ(œñ㊎ł–ă–v&‚–6%a(V¥àò§1˜Î¬?ÒÒXÒÒPVyíGZêAZêDіÈԌ ô g<ü–©MõJ5è{­Ì7%›S0ÒJ‰ñxSb J>‚’› äðàîÚ\%³ge"(JzJ¦"P҄@Iá³&k‹@IŒD4•dU¨´¤ú–DN¸•Ôl%5­[T P•D¡‘Ñ}äȑ`¡n|ا¾-Y²D’æ̙s_a„ZŔTPŠVu²DPŠVž»”ÊÅ߉øõ€’JiiiAPÂû¡¡§(:(áO8éIXÙϗ)ž{Iáþ2éI¢¹[ƒ ê‰ænô¤€Ì,·ò†ÚûH ìÖ뜭³? }w*Äö ü¹1buE¬²´ -4ðüêlS[ Z~bؼÑõ€3¹  õú>-ߣ!ôxgÒR{‚Rk‚Rs‚Òs T‹¢£ -U±Þ3•`šä`Ûf™ØK«4ìï–*蔀ctgæEoÒÜ`&*dümão3[@·Òrú#Öѱñ·}¥7;M·Ò¥ân¥÷ JÁj¿Ð­ô° TZú×â´ôçÈ”ìK…–¾`ïOÅhéN§%Ü°-9هͅ{º×G`‡‡}G¼¸÷ë|¤%?«SúY)†´[DKs-ŁŒf³HK³‰Qsc°Þ?ÝJ$­e>ì¥Ð‹ý­ó`ϛY¥`«;íå\¼Cœ•wŒÕ ÎXñp…»•pâ­tOu+éJu+)ãV*•–"S–´E´ô¡”¥?–~OZú–)K_ZpVŸ’–Dî]Fᖠ£pA¸ ><“§bðt‰$싵lKÄõ®OÆ{´‚´´ ï`>ii"iiiiié5:˜^&2µgS+Š&d¤')”ꔪ”*ðMÉ (¥$`|ãã°ûÖ ÷°ÏŠ“ d'(Y(ÙqjF+NR€’Ž ¤5” !PÒ© „‹¥h´æVR³•DüM€RD¢žÄ`¡‘Ñ-**©Sß(­]»6X#@€’è‘+š™D%µêdéå¹ËÐǤ”ÊÅ߉øՁRfffé d 0RXB $ғ<üЉ¡7*{I勝Å÷¨2ӓjªÍÝxVMX3¤«‡tàµu“DzÒü“ÇŽ;Fž:uêeîܹ³|ˆhðI¶R»e˖õ:|ùoÕã+·&k¿ jéêõ ¸9fgn­ Jõ˜øqÔv$ø¯'BìKØ™±% ÖUÀ*+*ÃÖ.ªû6«&¶Rªy,ÝJÃêCëõ {îÕ*¼+A©ÝJmIK-HKM JÏÖ'(±OÜSŒ¿5"(=Åv»O³ñî³`šÒB´`m𶌿u`ü­+óÌ{1þ֟ñ·at+å1þ6•ñ·9œÿ¶˜ñ·ÕŒ¿m¦[i7ão¯3þv‚n¥óJ‘[éVÈ­ô!Aé3I¸•`¿+©Z@én¥2¤uÿÐÒ!Z -–Z‚þ„…)?0Á¾k&-YpKÞ$J^aõ©ó¬;xʁá> %ö¯uÃÌn'-mò²°¶ïĉ…þ£G.‹!-Årî,[ëƑ–âÀC³³¹`.Yj>#v‹b°ÙRFñDöÓFö6xèVâ¼»ÝNº•8ø>'­Ðsª[‰Õß1ªn%\QT·’æáÝJ!P*-E¤,éŠR–~&-E Â}ÂáLÕ Ü/FáS–Ž3eéõ80ëî\êfáV“––¤âÌ%-M#-呖†‘–ú“–zò]èLZj—%¾! žáŒ‡ßRÔ'(Õ$(UN(e'ÓJ‰l§ËïŸGs{q\‡g`uâ\Ì!P2X(áœUPÒè‹@IQA‰A`9J¸Ù’,Dˆ–$AK­S•"2º(‰BÝ”DGÑ(WÔPAI-¦$@)777XuR¨u¡Ç£’(Ï]Jå ô¿V<: „×EG( d -€þ´s‹Q7/·ˆå¶‰LOJczR6w_…qöZŒ¸?HOjÚ´ésœ -ۚ“bEzÒ+’HO†ò¸qãòäéÓ§OSæϟ?WY¾|ùͺuëVi s6jaÁ¶ë`²ö`_7BÑ1Cãlm1+ꤓ³É=°¡'¨T±̑ØՃÉÌ­HãGp&l¨€UVUÆÊKªAÁÏ­]7­6øe|]èçõ¡õÒ­ôÝJÝèVêHPjGPjIPzþ1&n”ž¡[é)º•ÕÄoªc•§ª0´Àø[“l؀fœԊ6àEö‚èÄøÛ+Œ¿õaüm° 4Šñ·‰Œ¿åsþÛBÆßVЮg Ã팿í¹•Î0þv‰ ô&Óºo‡¹• å#ÜJ"­ûέT --…J-E¡¥ûJ-ÑÒw¡Â”Ÿ‡Ñìô]3 SZp_n–.ÛX<ÀÎRKNÜÄ7\,LÉf»=,µäŐmb™öµì°ZCZŠÅ“³8Ž´GZŠg=€xÒR<ñH¤¥¹¤%á~hµ˜´$œS«|t+1¼·™¾œk¹—éq‡èÑ s+±…Ý53Îô¡÷®öüžn%½êVÂ¥~ÏLãÚ­ôגié)KÿLZº/‡QÂáÔ"‚p7„»Ä”¥Ó ½Á Ü~áv0eiƒp+9obS–f2Á{R:ޣќLJZêMïj7Nqè@ъâ92R#&ò5$(ÕáKR T ”Áns)줋w5†?/étãà6'NÃâÀ ™lx@ <*z3wWûp ¢¥’AIMTÝ¢ƒ®:õM€’¨ ‚ÒöíۃŔ–-[v_ÕI”DyîP}LTP}LÊA©”þ7Š_7(iB ¤ãë¢%ü/JXêâzjzRߣtî4‡éIU™žT‡œ±÷§…ž§Û–s=:óz{r¢ìN™!O˜0a¼œŸŸ?C^¸pá|eåʕ˔ 6¬Õìرc³Úg—Ÿõûõ@’ÃF¨×c&(¨“@Ç)ìåilÔi–[9E}z"äq4âP§ì¤2·"lsVYS +/« -¿ :t]~-ìeb˜»Ñõ`pEü­ÝJ¯Ð­$âo/’–Z‘–š”D¢R(Õ"(ѭԈñ·§+a‹ÆŒ¿5¥…hÁø[[F^büíeÆß^eüm`ÃÇøÛ4º•æ2þ¶„ñ·5t+máì)áV:p+Áœgüíão·Jïþ?q+ý×ýWtPzZú—’h)¢ÔÒWAKjñÃ;¤¥[Lð¾nãt8úáÎ:X<ÀÉâ. ÞK-yÙô„eÚ7úYÆ;æøñã+cYq;Ž]uã<¸0¾ˆ–æ’–æ$Òœ€ (Åa麟 -¶[ƒmW2ñi S 60u\(…8Cn%ÝJìFvł§.èVÂX -·Ò‡ª[I÷?åV -óë)E´Ö.2‡Q ™ïÂÝu‚Ñßbî*ƒpç„;Á Ü¡XŒÂá¶0·†n¥¥ ÂÍ#-MgMüqœ7œ´ÔŸß =ù.t&#µ##5§x† ô[‚R}‚RM‚Re~Rd³uJ3ºcqOc J>¾Ø.@Éá(Y Jf‚’ÑŠ§Ä`Æó¢3”Œx†4zÜ]w7Jta>”"ão¥ƒ’˜ú¦ÖP‹)E%Ñ·tPÚ»qãÆѾ•ƒR9(ýo(i‹ƒ’‘ÂLaåo.u@ ïQ0» -–™Ä1ª³iQ]¦'ý† -@-3ù/¦ ¯üUÎÿę £äI“&M”g͚5S.((X¨¬Zµj…²iÓ¦õš]»vmÓÂZíÑAÔXÞ0@³ž0:N³P²˜>~ŽŽ™s.¨Ò³ôПfmáqPªo$âS¨Ö3°`[64ÜúŠÐ»+«`³‚êPð³kb/Sê@5%( Œ¿Á"Šø[‚Rs‚Òs 8͍n¥§kT>)@‰ñ·§{†ñ·&Œ94cü­5ão/2þ֙ñ·Œ¿õeü-—ñ·ÑìÎ0‰n¥™LÈYDWÄJæo`ümÝJ¢ZÀQÆ߄[é²p+ÉEn¥`Ê"·Ò··R±j¿Ø­$)B”NKQ¦ÃEÒR±Â”âºâ¥–˜àý™‘ÅLœgfñ §ÃY9Ž÷ê"«vža°ãÌP;ìƱ߃û¼Ë‹Û¾ÕQØÃÎm±xrVÆ9rdiKJÆãiZÀÂI ¤¥„"Z +‡LÝPd +Ò‹†“¦”B´®)J²÷ ”F™Š4¢ÿc³ ¥"q5$Y/ÅÍýçål‹`¤ˆII# +¸‰u&I ôO—w¨Œ™„h)¢ƒIDòRÄTo´Ä•3- ͉‹„9-MÀ 2š©oB5„Š)…ªN~J ´šg%µ¥¯d°œï ”J(ɆƒÒEwww§²···Gu÷îÝ^õÇïhž>}zW Fº¯{ýúõÃO?ýôÀøóÏ?ß7ã¿»V¼vۆwo:@KÝ®G]vß»wï¼·¯¯ï´ïÚµkM±uñ.\¨Nhii)M9?ëâq}¾XŒj9‡7--Í憕˜¹•(G%X%]pM8Ü9V¢×`„Õ«°£GÅ\>Ìù"£<â »rVçPb$vòDq›ØIl*|¦"n +#“‰‰2HK*¢%sqQ@hIÍÑR¸âÓ@5ñ!n%Ÿ–Þ•[é¤"ñÂl£œñÏ¥"qa6^*ÇH¬{kŒ$9“$‘dìò6h‰‰Z‘ê-TF`|h)ú:qb§Ã½]·ÒAiØò¸(±«N†@i +uð³ù ´Úv°3"(ÉC Ô¥ìëë»®çô©A<÷4/_¾|¨ýùçŸë~ýõקàÑSãŸþùÔ ylýã?ÚñÚ]'h©Ï  ºîyþüù•˜G]ˆ½{÷nK|ooï±Äîîîz{{{uG۝|âĉ)‡ޖ²ÿþ ©{öìY‘Z\\¼0–8'¶6-(žÀd%Á†Rü²ü Æbãa/ÞX˜Š3ÎÜJr+™¹•XÝn¶Ê D¯¦t$Zb ‰š9z˜Ë‡ÍÈ ô +ácvå(r)qÃ]JìÙÍD#ä‰K7˜8ÕØØ¡ÆÇìjB&5ögUcÏ5ŽaV³ƒ-©´q´‹Õ¨B´Äj(‡ÒÒÀJuÜJ|ۚèÇ3RÄÿÃl¬gˆfãUEâ–j‹˜ŠÄ«³Í«ÄÍk‹ÎHb·%F’D’q—‘#“ˆp\Ää%©ÞLKÑkys´$T<à=q+ þ¢€¯˜RtPâÖ1 /øFͳ~(•––î~3(ÝP”n«ž>}z_óêÕ«GZPÐSxè™xôÜø¯ýë™ù¯¿þzjŏìxí¾ó·ß~»ãPÝôâW}ø쥸œI¸}ûöñÄëׯJêììÜ8þ|yÊéÓ§H=zôèöԃ~‘VUUµ*m÷î݋Ò`˜Ÿ¥ÂধÅ S`MÙŒQ©IóæÍKJ„ÑÄ%à"½q0—Vb'·’u[)..Ž• `u» FˆÁ€›fÔÁJŒZˆIÀ…=jæò!ç82ÂøëQb§n¸7(Ž½ê!âÑà &n 6við1§;ph°+›{¶jp ‹†F{£†hI¢%–>¥ ÏÊ –} +ӒB€–xn%¾mMd™‹qa$¡ªH"R‘DÖf㖳åR‘¸0—Š‘˜o](g[¬I +¸I"É[‘qt0‰H^z´ÄËòæU§Z'.út¸÷Ç­46PâªN +•çæ-øÆ@i=uäh·­ÔÜ;? +J2(]»v­K °¹¡âÜQ={öì¾úõë׏µ¿þúë3ÝüñÜ2zaü÷¿ÿý yf…<±™:ñî]7hé–÷§Ÿ~êñ=þ¼#îÑ£GgîÞ½{ÒóæÍ#«W¯Ö&_ºt©"¥µµµ(µ¹¹ù봆††Íé8¡5éeeeKÒaÏsÓ`u3Ò0âLJ…5å¤`ŒJà‚Isæ̉OÄÏÿ˜øÂÂBw,¬Äƒ«·1·ÕV2Sm%“˜b +.ž‹[e2SLzX‰YG¬¢%Q‹MÍBe,h†ª»È£‚…1(Š!(ŠQÁê|*ìÞ§NJJ +ŠfˆÄhñ.¯{´ø˜K‹8µØŸC‹=Û´8U‹CšµíMZ¢¥p@P§¢¥0(…×õ ‚É P’ ÒDÍFx#‰Ò6–T$a6ÖoD³q•#GžŠqî¿PζÄH’Hò^É(Lã“ê-TF`Ì´Ä«N™$°ªîˆR–F4n‚ÝJc)ÏÍ@ wCh“Y|PÚJÍõFPº¥›JšðF ô€@éI”þüóÏ@ÑKãßÿýÒüŸÿüç…ÿ=µƒ–9AP÷Ü¿ÿþ{Ÿ÷—_~¹ûòåËÎø§OŸžO¼ÿþ©¤¾¾¾£žžž)8PeêÙ³gKÒNœ8ñMúáǿ̨­­]›±gϞ¥ÅÅÅóÓaz³ÒÁã“Ó`M¹©¸ŒŒdXNrƲÿŒ3| °O‹¿±´nŒV¨ÑBµ•Ì6ܳ©Ù„!Õl$Ñã¦YtŒU 6 ±PEÎTœÏhŪ°Ó85Æ_&ñaP´8$“8-žÆê˜`ŸŸðêÑ2=öâÖcN=vïÐ-ép\‹ŽhIÇü\, H´¤ MÍÓhBeŸTÜÚ+áu}åa·Rp]¸0-}"HKãe³ŸŒë´ÿUE›Š4ò0¯*’P*s! ¥"ñjH¾5F’@IIÆSÆLKbS½ÅNŒKKB¸•O¸Uu…¦Ã%÷ÖÜJo¥aå¹£¯c ”– ¥ïRCCÃ(ZZå—/_f t5 Jýªçϟ?PÿôÓOO´¿ýöÛsPè¥PôÊFzeþïÿûÒ +ynÇÓÇN¼qß–ºƒoĂ¯®Äƒ´.$bW-IwîÜiJ¾~ýz]jggçÞ´óçÏïJ?uêÔwGݒyðàÁu™{÷î]–¹k×®0ÂÙ°°)é`ï¼4˜OFÊâŋ“°—Ĥ™3gÆ&rñ7–ÖMn%ª`¥ÚJZàÄbÅ@j1Ã@,FŠÕÀ0bײˆáEÉÜjÂ# +ŸÅ¨C>£ ©1ô&¨B‰˜^¢ÇHÔbö“$ꢇ$èñn¼ÛÅð ŸŸ1™<ìÏmÀxî4à@vŽkÓ-陟+DKzšWÇh‰Ê>©ÃÕÄVª ƒ’ò€ÒۘÒ½*Ҙ k …Ù„fü‹MEâ1—Š4JF‘”$1’$’LŒŒ%yéÝÓo8öC‘£%^‚7/eI('6·{‚³•Þ(-£»VX'JœG‰J`”(=Õþþûï/”^þþûï×&àÑkóÿþ÷¿WVÈs;ž>qálÒƒoÆþüóÏ] /^¼¸äüøqk ¿¿ÿXÊ͛7ëS»ººªÓ/^¼¸;£¥¥egfSSÓÖ̺ººõYÕÕÕ˳p~ŸgÂ&gg¦fÀšòÓ`>™©0š”düè÷'a‹Kœ:uª7㠋¿ÓºƒE(ÙJp° «£©Õ ±™p«ìæԁ8uxÍ¥e‰Eà¯F`f~"£$ †Þ$MVVV@ # è˜à}H’ xÍO’hÄv FœKœŸ5â„bŒØ©Çˆ³rq4‡‘hÉ‹µÈÏEQA£j`Só‚… BE2h‰@I ‹U-Éô$DKáø›-'÷”¶1WE[X{”a¶ˆ©HBéÚãÃHRÀMIޅŒc8Nìĸˆ´=ÇU§ä­|£¥ˆ ÞуpããVú§€ÒüQ€Òõë×(õ*=zÔ¯çuፇžÿûßý1üñGoÜ/¿ür5áå˗—üOž<9¸wï^sJoooCÚÕ«W«Ó/]ºTšyæ̙™ÍÍÍÛ²6dá¬Vd•••}žܓ ›šñ(?}͚5Yiø•Ÿš‚Ëò`%q~ |1,þFóß\1 ‡tcwslv؆͊ÑÔnØM\£`˜Ž%±œ"l«a!5˜T‚†á,,HF\²CoŠö—ªËÏÏOÕ3Á œj€¤™àµd6I2á\üf|"ÁŒě1vǚÑ:1fœ•ÇL´dÆq&†oÌÙÅr¨XÆ9›ŸZbeŸXIqup¥º[I¡&·’*ìVR†AI1Þn¥‰c$±éÚã]X[D˜-âŒÿˆ©HÑÓµ%F’D’¤L\òҘi‰Wo‰·ª.ûyțÇ¥,ñ‚pg ¹•"f+Mœ[é=¥f¥3AIÃ@ ìÁÒOJ?(½&Pzé€}z&ùþýûÍ©·nÝjHëéé©Éhoo/Ílkkû> g°-ç²!{ß¾}+²ËËËfÃX?͂…M˄!dÀr²Òp-©)ڒî⃉J¸\‹¿Å€iœ šZ2×áÀ@각KÜ § â2²ÄKID>J'Š 汸Z’5ŒŒp7SµØsº£nºD–¡ÇÑ2 L@ðFHº ’fÆk©fl’bÁÆ ŒÕo7%X±«8+vê³¢‰¼ÍmÁÁb8rvYMà{3eœà}°ì­ë«ãÖõ…(5 ”Ân%JCÜJ5PÇ)mÑi”éÚãXX{‚ÃlbçþKŒ$‰${Zâ͉ãU§äVÕe?#&x ḙpï±[é­ç(E¥'N‚’ + tW Pz¤ùå—_ž(½Ôƒ‚^ÀC?™@F?Yþßÿû¯m (¹O¼ÿý÷]ß¿þõ¯Þøß~û­;ñõë×íIϞ=kK~ðàÁñÔ¾¾¾†t¥ÌŽŽŽ²,÷ûlœÁWهސ³ÿþ•Ù ³‹ŠŠ>͂…MËÄ÷‚ YÙ鸘´TXIR2et³D¥`¡Š¿ù`.ÌÂéÂÍp:€$N†T—â6³èÄK©C>=e`ë`> ÁŒ#W 9ŽÒ´Ø_ºē©ÃÝÌÒÃþ²ôu³ Ó§OÏ6Â&³M$fHI¦odX±Iš§Ø𱀠;ðÛ`± 64Lœ Lj±áhî²ÃY1ø[-hE³fk2±j¬H&¹•hí5¹•TäVRja± + ’šR8þ¦¥QÆßÆ{Ú¿Ø)mÑh‹žŠ4Ž…µÇ1Ì&1’$’|òNi)b-o֑±.MlÊ/Dz¢çvGŸ±¶Ò?”¢ÏzkJ ”º•ýýý ôòåK>(@É9”bàä'P +”Τ(¥Ý¾}»!ãÚµk ”J9PÊ ƒRRNqqñ§ÙJY°¡‚L\Av:L%-ƒ\ yîܹ I¸ÈXJTŠ‰ƒYx|¸z·fárÁ,\Ü— Cª›¼83ËÂÓXe[ëY6åéXpmˆ÷(ˆG:ì9GÓË5`ÀÍ3àhyFÀ{ž Což֙gäZñ4Çɲa“ ;6N·ãc)ì àÀ®üŒâñ#ÖZòÚqjn;†|§ mg£D* ÍÏ3™a¶E2Ck¯hô +¹•”äVR„ÝJAPR %fB‘ãoÑÍv”ŒôÖҵŦ"ñ +k¿0[ôT$i^›$’üÃåВP½%n8֑ELYâá"º•¸Üîèn¥¥uÛü7¡:JƒAiâê(… +Nr•¹ä ”Ν;Ç@©]qãƍP¢ÕK8P¢Êƒ@ÉL d#½²C^8!O ”Æüç?ÿég ”À@駟~â@©™¥¬Ë—/—f(åà ¶A©¶¶vEΞ={ÞJ éD¥8ª¨äc…º}àÃ§Û ñ8˜ï†…»X†ˬÆkñM¢x”DiØɔv”Fx”10Öæé±û|ì¯À*4Á'™qÜIŒº…V¤Àɳã\6ÉvbãL'îº f›âÂù%¹°çDÌ6Ή&ò9Ùù1·hÉÎÒÎY5+ ÁÈVª3ÁlµFp„Æ@n%=Åßt »•äa·R”´4È¢øñ7!ۍˆGï #E¬Š1‰WXûm„ÙÆ1Ib$I$yŸeBʈ¨·Äh‰[U——²1'Ö­ÄËV[[iââo¼kT']4°Ä¼”"Væ-Š[#œ %E4PzÊJ(éYe6áÒ“8Pr(y(ýý÷ßýq¥›JW“^¿~}) Ôš +P:–Þ××WŸ PªÎêèèØM ´“R.RîþýûWäVTT|.J°’´T w Ä¦¾MŸ>ÝÏʈx½¸^7ÌÂë`‘.@‘ÏÊò©)³ÚDÓÒ 4UÍóI¡„ì4=¬)S‡›–­#ï‘t“¯`z“8ÐÆÚ©fØäT (mª•Ä†Ó˜b‡Lvài¡ï¸pÇsÝ0Ûl7†èLë4p+ك=û=8F‚‡ŒuÓIºpV.' ßá`“ôXí§PIq½f«3ï5F4¹Ú@ñ7=Åßt ”`ƒ@i¨[é…XPzŒq’ˆÕµyéÚ«"ELE*¬ýNÃl#I"ɇ%oƒ–xµ¼…ŠD åvGÌVâ&Á Åßxn¥wJÑ×zÑ&×zã-ŠËÒɓ'(µ)®\¹Ò®d t÷îÝ (—y ƒ+¡Ä*ó¸Yzä¹ OŸxJ|¥;J7J]J“Ÿ>}ڒzÿþý&¥ºÌžžž*¥]9mmmß(m%PZO ´<JEEEsrÞJñJ±q/}¾ÂÂÂ/nAŒ fãùl £8+$žæ¡ùiFZ€&¨¥(?›R³3)÷hÀ…„ýê  ØýT#nß4(hºÃì ËÒ¥KgXa3l`ÏÜ×éNü7Í™âÆ“<Ø®ÀƒOäzñÙl/ö’ÛMí¼8ÓD/çÁÄx˜ï Íæd“ô‚µŸ¨¤8[©Î +³Õ™Ä’‘âoäVR’[I¡%P +º•„@)jümdŒ4–ò‘c™Ò1]{|R‘ÞU˜Mb$I$ù`d,E—„"qW>‰˜à1'­ě'´À‰ˆøÛÄ%*E%–ž%­À¢¸öA ”@—™Lx8”¦Ò½šC?¥?'ø\A÷™ÒW2´å÷²òòò2¤FväȑCAP:þü(ݼy³[E ¤ +Jú(½$Pz¬ @Î$¥gn<}ìÅ÷c±Éíxl|=ñ×_í ¼zõê| +@ét@éhÆ­[·fvwwïÍnoo/É9sæÌ·¹Çߒ{èСu¹À·e¹8¿J³s`CS³(™{P荪N(ùƒ‹™À"â”b}°Ÿ âsá>Ä:X5$fŸùÍx#`b3ù±]:MZËÒq!M2À̦`pӌ0½&Œ°³Ì  ÙÜÄ9VXç€~ŽÃìl'd– 2Ӄצ{ñîÔl7)Ÿ(ðá³¹>4@VìüùóÓc1€'û@K~°,>†)ÎÊãä;ݬ¤ZÑ^©Î`ƒÙê,hh|¯65TäVRê ”È­$Ç߁’òÍ ™–"ºFÄHc™ö/"]{D©HBa6Ž‘&n6ۈ\H#I"É?WD$/‰­·$´NÜȃpÑÝJ¼l%iݼøÛ[KTŠJ\7%-‘žÎ’…èÎN§ÁÆMÞ2ß PʤëϧÄ4 +D|J7k!Ý»•t?7Òp€VøJ†¦ýAVQQÁ@iŸœÒ©S§Ž+„@éɓ'ý ”t ž'z¶.R°÷ÿþ÷¿—vàÑsÊãæғî(ÝJøã?züà«Ëìà\ +vu2íÞ½{½½½µYW¯^ݓ}éÒ¥âœÖÖÖor›››7ç644¬Í­©©Yš[VV6?gʁR~& $+œ£ÄRB%Œœ ”b=………q.܇x›nñÓ\ý€o¤˜`4éFšÃfÀÇr)?»À€[t!0ÂÎ0‚Ãf—-[6DŽ;÷©ƒë\+0~® ¨6ÏcëÄݜë†|æÌñâµY1xw†ÛMÅ'&ÅáLóã0NçÄát3â`À©q8P X–ËN'䍡P^n@¾É p0ØѼ:+ø^k`¨É­¤22P‚-A‰ìCNnGÙP·”ĸ•ÄNi9#‰˜öϛÒ&”®=Ž©Hã]4R +³I"ÉÇ.BKB)KBU–D¸•¸Ip¼ÚJ«Œ|þÛxÇߢçq‹%7ùÇ(%¦ÐgÑõ72Púì³Ï>¥[·ˆ¼t«è!C+l—ýH T.«­­Ý/oll<,?}úô Ņ Î*»ºº:” ™A ¤}õêU” ¥gÁ¥pÙ +o £ÁêIøï±ðô ˜žô×_ÝLøý÷ß»“~þùçöä/^´¥>zôèxzÿáLpØþ,¨<‡ü1§¥¥eGnSSӦܺººÕ¹ÕÕÕKrKKKçåÀÌfe㜧dÁJòY%(ùC ‡kŽ‹aQ-ÐR¼ f‘à`“óYQ#*odf%°]–‘1†Ù–…dÄL3`„i„ÁÍ6⟙`„óÌ`³ùV © l¸}ŸÛqŸ;a¶Ÿ»1¤.ð@æÇ@æúðÚ§±pgŁ›¦ÇÔ§$€ù 0Dç&`§Y Ø}ZÎ99çœҏ‹£¼ªX€œ›UÊôò­nà‚Ùú58Àz°Bkß«É­¤¢ø›ÒQè¹ø[$PRð@i(-vÚ¿ˆò‘bWi;¥ÇH"ª"|ýZ)Ì&‰$’ŒQƛ–"á"º•„²•¸Ip\m¥ñ‰¿M((½iÂW€%¥•¾‡†œXº.J©tÁ ” +iP™Nþ¶Ï(Yc1 « .êNOJ¡<K¿sçN}æõë׫³;;;KsΟ?ÿ}î©S§¾ÊÅilÌ=xðàªÜ½{÷.Îݽ{÷ÜXÓÌlŒ[“³pòyÁ‚“TG)…@)¥Äæ¢a-J–öÐü2'ÈÈžQŠLn&F2aã\#ÇHa§°?æBúÔ«›k‚ý-0ZpÜE6˜èb;Ð~‰ç²Ä^ì)/Š,ôáé‚8¼1/FýiŒzV">6ݏLöcWù~ì4Û+ÎðÊSûþDp|NˆÕ5` °8h«ÌkvƒŒÎ¸¸8½X¡µQüÍB d‚(aP҅•„A‰*|<š8FâJ#‰˜ö/4¥-zº¶ØT$¡0›Øõk¥0›$’H"NƇ–xn%¡ \t·7 Ž«­$‹>ÿMD¢Ò„TTŠ0áíM%”"‚’ŸFJٔÊÁ@iùÛæ’ûm +ÖÈp‹7ËÐ +_ËJJJŠd•••{äà’ZySSÓEKKËÉA tëÖ­A ¤c ôË/¿<6þñÇOÍýõ×3+ è-îöÔ yì;“bñî­x.êJO:LOêëë;˜ÕÓÓ³7›åqŸ={ö»\–Ç}äȑõyT §¶0'ùiÌgz6F°I™°Ü \Ff°2÷… (%%2ï %C‚<”è†Eø€’BÕÓ©d¦™ÉÄ&ûãÞ 0…Ù Œ‘0®Î3aHý܌Ñt‘÷k‰&ºÌ‹]î€í.wÁ”—{pV˽°ñe>Ȓ8<]7$b“y~l<' ›™„L Àž 8ñÜL93€£¥&͟??ÉÜOHäêŠçåå9c ¶4¥ÙÈ7ºâããõ°…Ö³ÕXÑî*3%³Ù¬0 ‰¿ñAI0Q):(M#‰˜ö}J›Pº¶PU¤è©Hf“\H’H"Épùœ¸̈́r+ñ&Áñj+EŒ¿Eœÿ&T(@l¡î ¥Mxª5™Fd˜C¿Ã1êN¢û2“F’yĘK‰;×Ê0.|)CS|#ÛµkW±lïÞ½•òºººòcǎ5*Z[[O*/]ºtNÕÝÝÝ¡&PÒlzµ@œ;J÷ ÀžG&Ð Pè‰ PôÄZz\Ü-ìLbs݂E¸¨ÛãǏO¤ß½{÷p&/=é̙3,=éKÊã^Ì㮨¨XËMxƒfb¤ËIÇ藑Jk½%(%Á(ù)é'ÑGÓï½Ó¦Mó»©È£“ŠcÛY™lb$ 6É!FÊgŒdÂHŸ#Í7Âêš0š.1ã^-³`ä\aƒÅ®²ÃŠW;aÙ«Ýø¬öâÔVù +ã Ëã!Kñ5Xä‡É/HÂ-ž€ÏNƉOO-MNY¿~}~ +Î>+GK£³†”Ëô$€ôq ]›¶kñòn…Þ ÖÚa¶Š¿©Ì°¥I”†Æß>”¨¦¥È ôv)â*m½ŸžÄò¸YzRxÂ[F¨2@F*ì 5£d²Ÿ@)!Jþ˜3f$Q±¢ÕwLqà¿4^Ë°ÂJ²ÍÄH¬^¤14¥ÅÚ8FZdÂ@ºÔŒÛ´Â‚‘s•»ÆS^ç +­w•””¬÷àÖ­)--] YY•ˆ×VøŸKÅÅŋ’qâóSpŸ?M…ÏLÅþ¦¤aÏi8FN*.!=—œ‚Ñ>‘ÖõM™zaÀ®x4 =¶k‰í=‰‰‰z’f«¡ø›ÊÂ@ \%=% Ëh@IhJÛ(IlùH¡ÒHѧý 1’Øtm¡T$© ’$’Hò6eDA8ÙJB“à„âo¼"”¼ùo"•¸BÝ#Ïè (‰º‰ÍãšðÆU—P’Q­I喅Šrï–×ÔÔTÉ:T§8~üøQe[[ÛiUGGÇy5’†@IûàÁƒ› ” J&€Ò¥‡Öýë_”º ÷=´n évܟþt&ùþùçšëv6•æº¥³¹nT€u;yòä6ŠºmÈ;pàÀJJOZ” èHO‚°ô$–ǝ†kIO¡àU°¥x\iR,FÓ$¥€’설ډ‘h=‘l [m„Éb¤™ÆP¬-ÈHFc™ cèJ3 s»Îß`}áÄ Ûä.//ßä­¨¨øÂWYY¹1²!²Î¿gϞÕ¼»"Û-IÅ'>OÃgç¦c/³Óq ÓÒaޓÒ1lç’SŒESh¹: +¬8.ÌóúaÀ®„¼¼<{šÒâƒíš¼~¿_ïeèœÀb@É + Pš ”‰JrP"‘ •·ÇHËGòIhÚÄ)m"ª"<I +³I"‰$ c¡%¡Ip"âoÜü7®Z÷È•¸Œîw J +>(‰MO +åqžðl4áM†Ad¥ ð¹Qª ð½ƒz©|ÿþýՊÇ×+Nœ8ѤµœV]¾|ù¼úÚµk—5·oßîÑ(éŸ={vÛPºK tßòûï¿?°‡8@F÷ݐ»^ȝà¸x7èL +V˜|þüykÚ£Gši®Û!šë¶/»«««"çÒ¥KE¹­­­_ D݂õ¸s`*Ó³ÂéI鰃¬Ôå˗§'ãªR(Ë'9Wˆ|¬–#x#™@)ÕÉVZÃkY´[®Ûšð‰©&ÆH îÁŒ„Ý/3ÂþV™0h®5ÃX7X‹ŠŠ¾°×6;p¯¶¸€B[Q·èéI“ișE  Á|Ɣ¥2–ǍQc3åq-§ or þ + ôûÀ”CJK³ê… ­ê+W®\Ðܸq£S×ßßߣ'P2(™Jw,¥»6 Ð] è®xtÇ éóáéÍx¼Ñ“ˆM:“°ñ…àºn¬pR(…{6¥pç´··綵µ}KsݶäñæºíÚµë3.ê–ɪ'aÌN£ô$ÊíI ° öTŽ(­Ÿ‹q5ًkNqCҜ ;È#ۊwó-Øn’™-C‚ϲúHs \6nܸÔ@Œdā֙`˜_˜ÁH_ZJKK·Ù;;ìÀž¯À£o=¸WßÆÔ××ÛÐÐðM¡C‡¾öC¾ +@¶¦àMiØdC6^‰-ÏÂe³RP¬¸8îý´ü"(ÌÆ(ž“…6Iτ=ÒaÊ i 9_ + Á€;єÖøŒŒ S,l×àoèܱ±±ÌVmƒÙ*)QIÎè–SF·ŒË覥߆‰l¨ðËG¾SF;í?â"¶BŒ4–T$)Ì&‰$’L€Œwü-b¢’P¡n¡Œîˆ¥''”„h):#áOy®/ê&Tf2Rz’ 7l9¥'­£ô¤-r4À·r–Ç]UUU©Àð^«"(…i‰JB%¶'˜‘D”b$±SÚÆ1][ +³I"‰$%b'ÁEŸÿ&”¨=£[¨ô¤ÐÔ7±5Æ JÃe„Î$œÁ°¹n¼¨›Põ¤p™IÙðô¤mr4ÊNyYYÙnž}ûö*0²T?~¼QÕÖÖvRÝÞÞÞ¦éîëíííÔß½{·ÇÈ@éùóç·,¯_¿î³ýüóÏ·¥ÛnQŸÒëƒ\#]MÄ»—“XÍ$V\’2“2Âõ²±ç=9%¹”wòäÉ­yò<¸2¥p³ +“\)îÐ\·œ4Šº¥„¢n©uK¡¨[r, (%†ÉIwái¦Œ”cyX(àf¦€›)p›o€5-6À¸V0®5À7a»[L8øv3é+ m§íÀ?:ÀpEnPP±PTâknn.ŽÇ +JO†!f —ž$Ç}Þ.§')jkk«• €:€å¨èrJsùòå³ÚžžžKº¾¾¾+†{÷îõ˜?~|à Pêµ”nفB}.@Ñ-h©7r=O»(àægÙÛ¬f›æFΤ̰3)‡êä^¼xñ‡¼ÖÖÖy´®[¥pçíß¿Y¥pó+LR)îtšë– +BÎH¦¨[uCçø”¼47$ÃI7;Þȳ¸Í£€Û" +¸-§€ÛnÉF óKã®]»¶›pߚ«««¿·‚‘Šì`¤]N°Ïn7(¨Ô (*=uêTiüéÓ§wù[ZZŠ“ñߏ©xí»t¼»#W´5›®Xf:Má[žý-Ê///Ÿ›k›•k›’CÏËÅ𞙃JÉBCù3aʱé8{O +èÁ(((°1PŠ'PòÁvƒ äb šú¦O}“SF÷(…•A)HKô†l‚)â2$"Iì´ÿ1§kK©H’H"É»‘%*EÏèæ**‰˜ú6Ê +JÃÖkçLœÂŠº9ùsÝ"DÝfË0Ø,…ª'­¥êI_ÊqÇ¿‘Š¡ô¤}J ê *ŒöÇÔçϟ?­éìì<§Ó´ëA7WŒàœ3ˆçºìsÓ +êu”z݀¢›^àÑõXHO<ž^Id7–½ª™ÄœI‡²XfçL:wîÜwy`‹­y8øJá^•WUUµ˜¼.óra>³rÂ)ÜTa28™>mÎ溥úCQ·Šº¥ÄàzS=aÎ$l7ŪÀ*%±€ÛR=ìj•cèz=nɗ†ââ⯌ ™oM8ÌÈb+i·çWî<~üx…§»'d´'ö̙3 mmmåI ËÒdüW’†×~ÈÀ»ßf9¿ÊaüGYWùõõõ+ öíÛ·¸ ²²r~ÁîÝ»gàk05֞Ÿ‡ÓÈÊŸŸš†òg¢ÉâÒqöÞTX±3¢°ù³³³ÍñiiiFJ^ЈÆJV;D‚Ò ·‰<,APâðèí2RôÛí_JE’DIþ)òÖ@‰[ÌD¨˜”X1¥±€RÄbJh):#EÉLeêL(œÄ¥p³ +“ä.Ë£ßë¬7Íu“Ñš%Á¨Ѐuû^QQQQªT)>|P…A½Q1þ„¶½½½U×ÝÝ}^ßÛÛÛaìïï¿b~øða·õéÓ§×ì¥ëN€Ò 7@éz ¤'r5ŒÄn—Xö6­æv:X€;ìLÊéééٓ{ùòå’@™PâÕZõ-bÕÉè ±<÷èA‰ÇHâk&EÏLâN +¥pT˜ü†AsÝäᨛ"u+Wxðà’ÉUUUó&—––Κ„/ĔBX{^N-#hœƒKMÈÂ%ø”Ü)°b{€ Ø$JäV +‚p”HŒ‘è5ùPF’M0#E_ÎVb$I$‘䣖Q‚¯˜ÒÈA‰·ŽÉÛ¥!ò&Fâeos¸#:“BÓܸÌ$®ÀÜAÎ$*œ$NHá®®®ÞC)ÜûTMMM êÓ§O7i1¨ŸÔuvvž1PÔÍxëÖ­vóÝ»w;­>ì²?}úôª (Ôí(]!FŠƒt&€‘n”½F¥2ð‰£Y€¬úœÞÞޚܡÎ$ò°l-¨eVs&a,Ì&gR&Z:3[û–œIþ3)™EÝÂ)ܙÎð47ëÐin~üøa͙3gšµÔO뻺ºÎÁM·oßî°Ü¿ÿŠíñãÇ]ÎgϞ]u”®zAF]±ÎxH0à`7lr:ýÑ£GÇ2ə”Ôæ’3);ÝMÌð}1Cá‰'69rdM!9“ +əT`ù4¶1=œIT®:­‚–AΤ4 ¤©)ÜÚ·agÒ nr&…S¸'YÂ5“ 4ÍM{ :“´0©ZÜVr&}« ije:ðK•ØXkÓ4Ϟ=ÛhÆ9³‚‘NØÁH']@¡S^@Ñ)®ídü;wŽû!ǒñôHZ__ßÿgï¼ÿ¢º³ÿ?÷ÞéÌÐ{ÊÐ{G@”ÄÄ$šbLïmí½÷Ž½‚ˆŠˆ"Ø°Fc-jԘ²¦'›l²ûéÃ÷õz_˜&î&»ßñ‡×ƒ™;sç¾Ë½çé9ç}Þ³ñ‘i)Í i¢ÑÕÕÕïd·^Í>—:|2tøH.~²W‘$œIÍÍͳÒ'g€ÆfҙäâRə;wiÓ¦ à"ù²,:“21Än™it&¥Àh&%4(>žÎ¤8°OL4†6†Î¤˜p´7VÝҍQ7îTâLáλ¹YXJgÒ&Ç#FLŸ'è6gÒ¨Q£Þ1Lœ8q´¼6Ñr›aÄÌ5­Y³f±ظÌl\åY__¿ÖŒTé‹.© +#U«B8PF¯µá¯U1xo™¶H-…oˆ £“ßÊ'¾œN݃sg̘Ѷômäȑ…Ù¸Ú@ISrVìTž[€’§ +J¬:~1ø³F€/hº ”@FìÖ"¶þëýгÕ-§W ýššÑ½hÑ¢'°Ø_­ÀbJ™¢˜«N¦²êd2«N²ü-m”¨6Iõ¯Ñ™¤º,Ó£KÖêqá`½Í& Î63zc‡­Üé‰F7yƒ‘vû>}zwÀ™3gvŸ={¶1 mÀ{[l ¥šXôÐzÕӆ~YœÜÒÒ2ÇYKJdt‹ ¬·ù w}ÌíqE©¾Y`[Q!K%Œª=±%²ê¤í ŠaÕIkD°F@(f±9“ÄÀD%_Ìb7°Gë‰y¤X€B²™´d„HŠïIZÁHœí +IîÌHR/IÜQ¢˜«›‘Üâ·¸å>Ê”Dh¡gPû9ˆÝ¯¸ D— ‘UŒ„¿´ªà#“’€H]'n»TJêmRLÑÃÁãb Ýô’„ž|ƒ+܆Ë&LǀÛæx–¶¢¢bnõêÕ ¸­bÎ:S}}ý†îÓpÚw¼Ý~âĉÍQ"º„—Uq8°6Y‘Œ/IÅ×æeàÓ³víÚ51'•‹Ó¿‡z%?ùl~ü‰\ÆÀ|\Py>.­$™ŸƒÑÏÊÆ §‰;Ò`HãS ›ˆ±ŒŽ§3)ce£3Éu‹ (Ù:GÝ<Ñ%ù–öÂIå&̍Lá~’)ÜÏéñC¯éF5Lv+’µ´ ·¹Ú+V,Ñ­_¿~•nÓ¦M•z\ý&€o«iß¾};Ìhà.˱cǚ=ÁH-Þà¡=¾À£=çΝk:þ|S(þjŒÀ{Û¢p´6ŸÛ`Ç7V«ùíÈy"QI­¨Äғ™ëÖ­{- ÌúœZ˜]òpK$dä +3ÄÊ?Æ ™ÐŸÌª“ èˆp;«NÆ`øÛX# "55Õʌ¸8SÇà¡óÆÒz€ hI6SŒÄ#þ’t­`$N5…ó^æ|“Œ$ F›¶¹09½KF÷› #‰[ò÷_ûÿû?õÜâ·¸åä_”$”¸»hP‚ÈPRâÂH†ÎŒÔõömÎÄmç>·Ý&%=DƒÄ¤$vÄÓ,)ù‚„®{]‚­&7nŒÊ–?©iOJz…IIoKÀQLJš ÃôNSÀsµÀ”Å:Ërfà¬1bªŒ°Ø5fAˆ³Õ°Sï £Þà j€oml‹€ÔÙ ›bñކx]›tìر)àˆÅéÀ€9™{ö왖³k×®ñ¹@ùµµµoTUU½X¸jÕª§ +**Λ7ï¡ÂéÓ§—€Uúärs1æ9ߔL˜Ï± ,£nÑIÆ(FÝ"u‹dÔ-2ddc +w4£nqŒº%0ê–â-¢nܮĽo™Â]nbá$£nztÎó:¦pkÑ9õí5ɧ+‹/ž¯àú–i7lØ°V‹~©Ö·êZZZvèÑ%»hå^è°ÕŒtÈ +F:ì2:âsùòåÃ~W®\99Œ—{Â@KM‘øHƒí̙3u±"þÆÚ LTZ¢&*áôSÒðC£ÓÑ9ogàÇ_Êä~w™¸ Ç21ndŒ5ª$ý"¶ºËH:thRk$°F€½ƒæؘÑÁŒîД”K0èÆ€‰côñè½1tž %­…´d†È&ˆd èq@ґ‘´dr…w€`$Y0é\0’$ɥض“‘D!I'#‰;ÏÉH?þxÛÍ –×hЎ6#¹AÉ-nqË¿”tõ » $žÊ½%ñc'(‰ŒvP’È*©EbLRA‰ugTPâæ*({dLRTP‚h)]1’IMÜÆ Dâö/U“II©´TY4R0O")©„F©\TJâÿԟдWJzYb¥$ v„4qâÄñòŒ3¦Êóçϟ£,]ºt‘,éÀkô›7o®2lß¾½F]κÙf…ßîFÚáFjär®F±œ+äôéÓÛà Û"!uô’ÔÄ”*J«“ËÒ:´ cÿþý³²“sÇäoÛ¶íO555¯®_¿þ¹¢+V”Š,KÍS˜ +zÈJa‰ò$¤{‹Œ­°ftۀ.~˜ÏÞa˜ÏÖ`Ìsæ³ÑØcðÁ¤ÖyaFi­à!Å"›(ˆ¤ÇI'iÉHŠƒ‘äΌ$õbC'#‰ÅmÝ2’HÜŒ$nâÞ2Òoq&¹iÉ-nqË[z~ru›žäJâ)*ž§â¿ =ƒ’xR;AI<ÌaM%>å%>ï¥{¥€€'(É*(Y­VAK +)H!iUŒ„¿#Œdæ×ڒ’Úɏ§[ÜvLJ"u¬&Ù¾}›HÜ.câöþw]$naG¼ q$nKLܖ`f'Ësæ̙%/^¼x²råÊ¥Z`Àju%¬saçΝu¦–––úÎKÞwù€‘šüÀHMbÉ;q…AԔÐÒæ8ؘpX— ã¿"  ´8óàÁƒs²ASs›ššÆåoß¾}X! ãõ¢ 6¼P´zõê§úí3oÞ¼‹¦OŸ^Z8a„‚‚‘#GfçaÌÓr1´IY°¡öŒ§žz*&í³1êɨ[£n¬0Áµn‘ŒºÙèLŠeá¤:“R˜Â-¢nyLáV£nFî}k`á$=ìïó:LÇ7´b'à)S¦LPÐC3UŠÄõ­P6nÜX©lݺµVAçl×¢1M:ôË>=pð>f¼pá óå˗OZÀH§¬~øá)ï7nœô…œð‡ Â{‡C@KûÃÁR͑øF{MÄߪÔD¥ýû÷/âÖo³R€«ÓjjjF¤%ßH_ºtéóéè¡'ÓA¹Ó1–ý҆ V”Š«ÏNA;R“¸ô-Íʛá1Üõ͆IíI⤶q<;&?LjƒHçÒZ1½ˆl¢‰Gz•t˜p’–^…“N!#ÉNFbNœÔm‘¤n Iº0’sq›“‘ĝÜ#õpû- ä¦%·¸Å-¿ÜÓSꞜI¿”$>Ç%>Ñ¥îA ÿo%šŽ.@I&(ÉÌ$’™¨$v()PÒª2jc$¼Œdte$‘¸-)000À‘¸NF[Üv]M²/MӃ´J¬&ɬاØüçi]^•0 +ïH €Ñ`’<{öì™ò¢E‹æÓUR¡ˆe˜ãJ0 †+¹êŒÍÍÍõ&Xì`]V0Òn/˜òfßÓ§O7ûò·­v‡ìŒÙ6økk,h©6Ì°!  ´& ´,ÆAVkk묜={öLÊeŒ.Œ½S,{¥€öl Ú}mûNúäŠ y€»Ì< rJF5! c›þÄOØu‹dÔ-‚ž“pîëΨ[D8ó¸u‹Â_qÜû6‘ΤTFݲ˜Â-¢n¥&uƒ‰~Œ)ÜOëuӎ1â-íøñãG‹ÂäŠI.[¶l‰ŒZ­àr7* ¼-ÊîÝ»µÈݱcÇZuhêQšÂxéÒ¥S&0ÒðÐYë͛7ÏzݺuëŒä”?äD Þ;|ýúõÖ°>ø`O$¾±SÄߘԵQ$*©;šà7æ$ã×&§ÖÖ֎J[¿~ý›é˗/1}Á‚CÒg̘ñH:P²<KßRqõ¹ÉŒ´$.}K`F77Ž`¿ۘ¨Ií†I팉ãˆImòÃ<2ø`f뽀BZ+&—âA1Ad#ñHÏy¯#IZ#)œy2ݘ²ƒ‘$&ÆI=ø•E’î)àÖmÔíÞiÉ-Óá·üëË?ø6íʙÔmÔÍ”ÄKÅÃ÷nP’ø̖º%ؔŽ ”‘‘á%™ $Xd†ÀdÃd¦uJ +ÙG!-i‰BBt$#=ÿ2PŒ<*Ƀ߰ò»^jâv;#‰Äí0²YÜ¥šdVWÕ$‰Ûì’Wؓjâ¶4iÒ¤‰Ò̙3gÈ°µód@ónV)ÕÕÕëµ[¶l©a‚rŒ´ÝFj4ƒ‘š,`¤eü`Ô÷€ŒZ‚/\¸°; ²Su‹à½­q8º) T• »¿:  T‘‰³ÌˆñŸž×ÒÒ2¡6¢Döf~÷Å>`§‹AƒŠ.\8 Ï¬Y³úö™:räȒÜyɘ÷éI@¿ÄftÛén‹Á̱¡#"1S|Ã6^!@K æÙ3ÛèZÒ{aZ鬘ãZˆbæl7â=ـ£’Ž>U­ƒ‘#Ɍ÷ªŒD‡¦ôO[ÜvOÎ$7-¹Ê-nù'É?ã~ëöáæÂH¿ +”$"„ÄÿÒö”d‚ˆLP’ J2 ¥PâVYt) š)Œ¿)d-)HKÒQÚ  F2uÁH><•?ODF +eâv$C~¢šd<·»­&)·g{Ÿ¡y™ö–†t$·'H3f̘&͟?®¼téÒ%òš5kV2œ´^]ÄÕÐÐP§ß½{÷v±ÚÝ Øí³Ýbñìõ ìóíó‡QßxñâÅ=!—.]ÚÍD›QxÙRØb?þ|M>¼>_[™Ž,Î(ÍÉxMÍÇéÇÂø+ÂO¾Ö?þ\1.ãÉb\Ð#Ÿ´òb\dI\n~á¨Q£2 0ú)¹Ú¦'Åf2ÄÆô¤H¦'…‹zALO +³”"J¡%:“bð2Þ’¹÷m 'åqïÛbNêÏîGX8éINzž…“^׎;v„ÂÂI¢ ”\QQ±Hf +·ÌnyÛ¶murSSS£‚Æ´(GmÕ¢•Çthô{zÏØç¼ tÁ Fºhùøã/z~òÉ'¼!ç}ñòLhé½ ÐÒÑÐ?üð@8Ъ9J€¦HïxUÚ¹£I`lA°lz2v\*PíO©€¶WÓ/^üLÚìÙ³§'¤îJSÐMùÉÌèNt$'°¾”MŠ†2$YTTä°ñ +Á̶bf›ýAKF_Lo½PHgi-Å ‘xO6ð z|NÒÑ»ª%#)F’ÉéNF’~eâv/’’î ”zAKn–rÓ[Ür?äŸ@½n©+PÏØN $¤_%™ $”d”` Ú@ pÒJŒH0•Z&¿($…~…ñ·6Pìh‰=ZҒ–¤#é)Š‘bâ3?bá‡=UF +ð##ÁBcüµ¶¤$˜¬d&n·U“,..îà W·¸U«Ir‹[‘¸ÍnzCãHܖ¦M›6Uš7oÞ Æ±,Rnè%Qs“·oß^§l׋Š@°ÓÍ& Î`À>+ ø/°À_Øó £ýA ‚½êÒ-ÈNÞÛ‡£u ø\u2¾±. ß]ž‰³,ÌÆùfåá̓ +ð£‹ðko÷Áï¾\\UUõL Œÿà’%K–H 3)Å ¸Éî|¦p—²pÒ,œôS¸ŸÖá7^Ò'ßR¸÷­T›LŸÛyùòåreeå™Ý$%·É---»”ƒîSèLÒ¢©'thùi=ˆç¼ìsÑFºd]¶|ú駗=?ûì³Kސ ¾xyÎÈt*y7@u(ìêÕ«"þ&Ö¿mQ uƒ,W% Ã%îÚµkfòÖ­['¤*‡§bÜ^OE_=—:gΜ'R§L™òpê˜1cÊRpÃ&3£;‘Ý è&»sÜ;`À€0ú (óÅ/ `ã’››k l{øcz›|AAoÌq'f˜ÖQ̜òFŠŒ¤§cU‡oHZ2’â`$Y0·#I÷qw۞3“zJ¿™–Üâæ&·¸ånù(¨g2º'FrYðP’:€þÛ”`/e†ÌǺ¬‚ìj(ÁPRJ +AIa^BPRˆ.JPâVY%-9G«‚’¯¯¯Ž¤# +é EŠ‘Ò‘‘ð9ÁHÞü®/)€ŒLFꘔ„ÿÛ'òZҘ¸}×·QMrý<ûå5Í0üӌ7n,·§H°«³¥Å‹/b$i9ÿ:¥¶¶v£`$­`¤½{÷î4‘DE 38ç€Ðêɪ‰Þ/^<è(jU‹qÕV˜p†àåÎØnÇG6'”6¤àkkÒaò—fáTósÓóqú …°û#úÔ×׿Q¼iÓ¦JÖ¯_?¤dŊ•,Z´èÁ’Ù³g—Ãøô;vlV!Zš‘N̅ùŒcz’-#™ÓÎ=K¸n£KaQ”0‚*(â¯8?¼—胣it&e3…»)ÜeÜûö!¦pfá¤gt˜Å¯¨Q·É“'eåÍiLrŸOž\.Óç&3…[Þ¹sgƒ ~i–9Òª Ç´ ›“Z4ÿœîÚµk 7oÞ¼l#}`]õøóŸÿ|ÕzçΝ+^K>xù¾œ ÄGÞ ¾uë֑°ëׯïWãoèºmj¡î£G®‰ß¿ÿ’DŒÌì$tؤ䚚š‘)k×®}3uéÒ¥/¤zŸJeFw +¹Êðá˒1ð9‰¬Ñ‰·s]`,º)ÜV^^̸¤8fŽOþà„éíáö1ùb^¼ÓÓÓõž€"­¢˜ñR1AdIOFÒá’–Œ¤Fbâ¶Ì¤$‰IInRW·Î$ÁH=;“~%(õ™ÜõÇb©ßßܹÅ-÷"ÿ (êíã«[<ꊑººá‘+ñ©ŸÅŸÊ. $wJ +AI!()*(effv%¦¼2¦e֐–9ÖZ”€8ZÍtt+éÈ>zRž´d )&Š™ï F²òÃ^Fò穂xÒ02R)–¿›ÀÄíT^P«It®&ù Гlïs"q›£úŽ†‰ÛØýI·%€È H²Lœ¬•EZ2ìoZ ³Kœi1lö™`¬]ª&öö¿zõê¡ H«š^ƒ¿šm ¥±8ZPªM‚µ¯J(­ÊG,Ɇɟ›×ÚÚ:µ ¥¥elQcc㟊¯•TWW?W²nݺ'J—/_>°tá…ýKfΜY\¸úŒB´#9-ŠgzR «'E±zR÷, cMÅÐ8–¢ J‘¥0‚R0$:/í¾°ÝIÞøHº'>œcÁ×ú˜q‚~LáÈÂIO0…û9-(ãuN®€<&ÈÜû–ÁÉELá^É¾Ú 3…[Þ½{÷NÙ+£›+§OŸ>¡\¸páŒ}ð¾îƍ—õ·oß¾j +]3Š®{|þùç×­k^|HK~8p>€n¥à>úèão­jü ½] +ˆÅé×ÙñCKš››ç&âǧ$ã2F§`ðÞNA‡½”ÂŒî”3f<šÂŒîä#F'±Fw"•â•‰vVšŠe*— S%„=ÀúR>!˜CžA K¦”ÙdôÆD×{ŠtˆÖÌyo‚ÈF õd$¾!iÉH +I!#É ¸É‚‘p“ÈHRÏUºr&u›™Ô3(uKK¿žÜr¿xҍLnùw’ûHF÷…º—c·ŒÔu“TgÒÝ $Ó÷/wJ +AIé JZún´%-s§µtêh;ƒ’Ž~=@:Æßtt+é‰=z´d )&Š™bá6FZùtf¤Pž9’ÉPьöÅóÇے’pUy’’`ŠV“’XM’}ð2‡â-ͨQ£Fj˜¸­a⶙/Á¸.•`÷×0Ûf׸oV׸ïÙ³g—£Ð~#èæ  ŒtØfû¨•U½aŏù‚ŒŽ²Ða.Ø:H?ȾHHs4h©1 ´-ޔPZŸk¿"ëĉ‹r92+ÿÀ“ aòG÷Ù±cÇÛÅ[¶ly¹dãƍCK׬Y3¸HòPéüùóËJ`÷ ‹'Nœ˜S„&¤1=)1ã—ƒ±Œfw$ó¸Ã(Å”bEA)‚ Êmނ 1þ°Ýñ¾è¦d/Œo†uàÀyƒ *f +w9 '=Êî!,œô" '½©àwG±pÒd6Gæj@‰Q7ióæÍ5.¼^B_í–:t@Fێ*覓 +}N‹Î¹¤»uëÖzÐuPè† dtÃüÅ_Ü°|ùå—zB®yãå_ÐÒÿÏ>ûìLÐÇ|<äæ͛‡ÂEüMԟd¡î&*Å\—Ç/$âǧ'á2Æ%ã‚þ”‚K{%ä;4eÖ¬YƒR0Ò&£ ¥Iè°üD4+#ž;ÛY»<¬;ŠD728éËí"0›,`³(Èè Ò{BtVÌ5­þRL >qÈz2’ߐ´€,IaÀMŒÄ€›Ì€›Ä€›Ä€›Ôíöm]9“ººu›£Ô-2õ–›Ür¿(ò>rÓïo Ýâ–Îò›ñè7³OÏ(Ô-9ñ¨[FÎ$—¨Í2ŸÔ. ¤”(i JZfþh;€¬†Ž¬¢#(é˜O­#Äèèò ¤güMOÎѓx diÉH2ŠL3ÅÂ÷¬<êd$?~7ŒBF +'‡ÙøCvz²’ˆjéLšÊá¥ñJËxáø?õ»’’FŽ9B3a„ñGⶩ€$«Dª’)µ\ºU¯ÀïԒ‘tGÝo#2Âø1ƒ‘ŽY._¾|ÜŒtœßõûðÏ޸qã3k†CöEá½æ@Bc<>·5 ÌP“ +PZ—PZ– k¿ ïðáÃ3 +öïß?¡h÷îÝ#ŠÞ(É¡´ªªjHßU«V=Úwɒ%”Ν;·¤dÚ´iùÅãǏÏ,B;R +0›ò0¾±Ù˨ ˜Ùnî–D  $R•£JᬣBP +Ä_±~x/ÁGSèLÊ¢3©€U¸K¹÷íƒLáÄÂICY8éeNz‡…“Ʋ´Ô44Q·e£n£nÒ®]»$¦pË諃ò©S§ŽËè¦3 +Z~A‹Þ¸¢»}ûöu=è†(tË2úÈüÕW_ݲ|ýõ×7­øëC/¼wÕ´tÉ,u.TuÒÛ!êO²P·ÉÛËD%ûÞ½{%€hg&bÜ&$mØ°ax2zíµäŋ?›‚Ë}<þP2•’И‚D4++ L±s7¼Xt˜-è‰Þb7ù1ÝÝ;¸¨¨È€‰îá +2ù`¶¼ :+ðH끿Ɉ£²Œ¤##i¹ØAˤ$…7áL’ps:“¤ž3“zuëÖ­Ô-õÌMn¹ÿ<ù[àɍLnùƒËoÁ£{‡¢{ºk»}ô¹‘\ "¹:“ð– J2ŸÏNPR˜3¡8@IKPÒv%ã[:‚’N%æo0•ZOž1=•ôLT2q t+èV2Ò­d$™ÈCf‡X(VðâGœŒÀ;)ŠŒË_s&%eÓÏUÀ¤¤R&Ɋ¤¤GÙ¬§hbžg'¾¦a5I‘”¤aÅm ÈCMܖ`òWJ°°•by»¼cǎmJssóNµIOFbÁÄ£&ÿã`¤Ö«W¯¾çþž¨•xóæÍwÕµZƒx¹Ï†ͱ¥ À…-É0ôÓJk2ÁKsJóò:4­pß¾}ãú455 +©¯¯­´¶¶ö¹¾•••Oô]¹råÀ¾0ùýKaòû”L:5·MH/Bc’ +0‘ìÌãŽÎ‚]äæná)0½¡‰°Ä!vtDˆ%ºJÂÂJÁ[^Æù•——'zchÓ< Ù˜íBó“O>YÆî‡X8éq¦p?ËÂI¯)`³a,œ4ž{¹Ì`ل…ô¾­”u“u“Øa rŸôî»ï‘ÑWïÉ/^<§Ð™¤E—\Õ{nè@· @¡ÛFÑǦo¾ùæ¶ä#+䦐éºhéŠßçŸþ~À§Ÿ~z:|Õ»råÊn&*ÕGŸ}º6†‰Jq€Ùev Ù¼ ÞÔD&*%¡ëÞNͽ”ÌD¥d&*%Mœ8±< )N@³rãq¤Ûq$ƲŠy4z-2 +~ âø—––zq‹?hÉìƒifô魝…>U3ÞSŒ8*¸ÄAK:ÖÐÐÙ%…7áL’;;“$§3éW‚RW¾¥n¹©å–^ɯD«ÞrÓ¯D¦ßß|ºåÿ¹wFêm>u/bc½ÀžžQÈŠœÒþ<íksa$§3 iÅJZ‚’– ¤#(é ¤'è d (J‚’‘q0#3«Ä#ão&ÆßLä‰ÇLZ2“–<ˆBB‘+ŋïy󨓑‚HZ¡d¤ž4š§·3ЗÌßÍ`0—E ú°šd?^óCtŠ f‡²_^␽©=z´HJš µŸ¡aR’†‰Û·é©–êëë·¨%€¸jKÉo«•›ü®Œôžvÿ”ùÚµkg, ³ž¬'í-Ê$”Ÿ +ör,ïŠ-틁yoŠ(mO‚¯M½xñbe&beÎɓ'åÃÐÏ*lmmØ§¥¥ed xãÍÒ­[·¾Ø·ººzHÙÚµk-ƒµ /¬}Iߙ3g无 ™}ИæqÇçc6Åä`|£21–áiÁÐd ^H°ÝÉ^ø\Iyt&•˜@Í0…ûQNÂÂI/±pÒ[,œ4šQ·)ŒºÍ¥ n©„‹\'ëj%ôšu“Ž=zHž3geðä%}pMùä“Onjïܹs[÷å—_~ª}fýÙôý÷ßf†|j|ì‰÷nyãèu_º•üñóâo"A¸3Š‰JÑžªX€æ +;•â¦'0Q)‘‰JILTJ×=“ÄD¥$0惉Ü#7]—û-λ")Ž‹Æ¤‰Šb‡F ×ÃÐM~Á€¯@L.«?¦¼Ù(dô}§OŸž[2qâÄô>£FJ*Ä<µ³w4¼ErÁ[X*F0$  LP +Ž!(EaðBÃa¬(Eâ¯?¼)žä, ƼÀŒyPjÄ`À¼Äº½ÂÂIï0ê6–Q·iŒº-`Ômñ²’Q·:FÝ%Ë^ ½vDb +·téÒ¥ó2Z~EF_}¨|öÙgi¿øâ‹Ot_ýõŸõß~ûíÈèsã_þò—;æ~øáÏøëS+޻텣7|èVòÃ7.à»Îøہp +»æÙÞ{m1LTŠc¢’ 93‰J‰LTJDÿ½–ÄŠJILTJë=œ8nܸ²„áÇÆcndÙÑԔXÜöhܶ(t]Xº.( =ä‚yåÍÄw+7yñð-))1ycÂ"ÓïoRÝòo&¿’‘ºÅ£^Q/(¨Û'œË3ÑEœÏÎvi#£v<ꚑðß×6F“Zëp&é¼Ò³Ì‹ž d (H#F‚’‘«ÊL%YÅLP2”Ì †y0þæÁø›=@t+Y;b•d%-y’‡¼(ÞŠ¸0R8)Šç‹¥Ã*?”JOV“’ò¹D /²œ>væ 6ÿYÅ«LJz‡IIc˜”4™II³5LJ҈¤$nà*1q›¡£í,“Ø$‹2‰ï¾ûî!í©S§Þe=é“úözÒçXOú}Øý V Ð/Ñû¾°âç˜x|& ƒ‹-Š&(Ùoݺµ+æ}[ +@©& ´6±46~^Á‘#G¦õÙ¿ÿؒݻwÿ©oCCÃ+e›7o~¦¬ªªjp¿U«V=TC_V† /ì‹&d—Œ?>­Ð/±Ó1– Þl¬Ç‘±  ”#l'(q%WH$A)Œ  ‰ +ÀËX_HðÆGR­øp¶¾VHgR™]÷S¸gá¤gY8é5F݆3ê6Q·™Œº-bÔm£nÙu[ukrFÝ$ôÚiéʕ+dtØU}uSA}¬ýòË/?Ó~óÍ7wtà¡/ À£/Œ?þøã&Èç?[AKŸxâ¨êVòÃ7.9âoÇE–¼¨MÅ­ó¶Û@››¢A›kcщö]»v͉߶mÛäàï¨DVTJdE¥DÞS‰`½GA}ýÐ}âqcçØÑi±è¿„hnü…; "“?8 =‚óa¬Ò“¥,~ %“&¿Ñ ¢·Bt­ ¢Y‹ÕÀ:cz:“t%-I݃’3GI$swåVêÊ·äD&§Üýè¨ÜrrOÜÙ-Aõ‚›ºE&7-¹åËHݺzÆ£ns…ºB¡_$ž6qy0ºˆóÚ.mËþ…ˆumíx$«xäô# F“ZGg’Ž¼¡w€’ bdTËHP2”L%3AÉÌÀ—S©=èã±0þf!ÎXèV²Ò­d%çXéVòdΓäEߒ7yHˆ/ŏïPù¹~#Œß$#Åð¤ñd¤dþZ<—×҇ ׏—û3˜-ʾ‰#ý+%d¥¤‰LJšÉ¤¤úåúuLJÚ$NêéÙ%8p`/lR¸ç†(“¨»téÒýÕ«WϹ熉õ¤=@A—¬¢”4 øE.e?r6r2 ï‹AŒeßPڙPښ +ó¾1ó… «sΜ9³$ÿĉs +Á“‹÷íÛ7º´©©é­¾õõõ/•mÚ´éé~•••õÕ>ØpRZ†«Ïï;uêÔÌP_JŸ#FÄ3;&“+2 O'(¥`ƒ(Å9@)bÀ€¡¡è¦ˆ ˆÍ/ã|`±½`±Ó­ót]¦J¦pÔcf?ɨÛ󌺽Á¨ÛH¨6‰Q·ÙŒº-¡n £n5\붝Q·fFÝ2êv\bÔMQ74ÿºŒÞøHùüóÏ?U¾þúë;Úï¾ûî xè+=Èè+Ã_ÿúׯL/͐Ï-xï3O½íÏÝðýꫯ®øã»ão8óÞüFcÔéÓ§7G;vl}Lkkë²8&*ٙ¨N“ÀŠJ‰Ë—/9‘[¿%‚õKõ=€iQ ’gÇ­›‹;/)†[ ÛX«3’9^áè¿Àô•o&¿³ß-,Îiöá¼Ez+Dçњ!Š‘ŒdÀG\@IꔘÌ-@©ƒ[ÉIKNßRWÈäâjr!¨®¤ç‡‡[~IzK ÝbTÏÜÔ32õì`rӒ[þŒÔ• ©xÔuÅC¿H–¿üòË?+ß|óÍÚï¿ÿþ+xèk=ÈèÃO?ýôñçŸþڌ¿¾´à½;Ö~øá/º•|ðŽñ7Q’…º¹Þ®HüÚV~wCÌÁƒWƶ´´,´ïرcF|]]ÝøÐð°ný–ÈB‰sæÌœêÚì?|øð;îéÌX4:9Í·Û¸M^$º$,$Š;À/œãÍÌ.«ÈÃw€É‹hO.l°p¨™ÕÅL”nAIqä(Éb՛‹[©[ZrA&nꊠÜÒ{éùÉÚ í¨zÎ#ë-2õÖÁä¦%·ü1ÉŅÔ[¤%_Ғ?B‘?%Ä÷ºb¤82R"9,•X–ÅÏ絔äÊyõÙè'ØÏÏrŒ^QnãǏo ¸Í›7o¶féÒ¥‹5¬”¤©®®®Ò0)IÚ¹sçFšEÔH­ÈEí +I”’Öƒ‘.`¯°”ôU3·Û°€‡®²ÜÏ\Å~Ùr!r.öüdA)F½5 Ô’PڑË^—PªÊ~ÿý÷Wä>}zaá»ï¾;£Ìû„’={ö ïÛØØøZ®ê¹~¸¾'ú¯]»öáþà’~ý@xEe`½œÒI“&¥=:±ó9–yܶL³ˆLLŸÐ4Œo0A)(ž6^€W»‡„·ƒRd ^Fû¡×â½a§“=1æ™L†|3æU)£n0©1ê6”Q·—u{‡Q·±¬09eËç³Âä +:ãªXa²Nƒ«ß©AÿíӀ12êvJDÝ$FÝ$ôÁ-]ò‰üÕW_ÝQ¾ûî»/µ  otà¡oõÀ£ï ûÛß¾5B¾1áåW ¥/¬8ú™ÝJ>ß~ûíu?|÷r‡øۇ~x0 ¿ÑÁBQøݚh\ÁšXŒå’8Œê,;zrbüƍG$°P@Fÿù +Hõ Lÿõ‹IÙqÇgǢѩ1h~¼ ‰. g¢W(ºÉ?½æÃÌ.O®ô`)s“7nƒ'DOPÒ”´&¼TŒí $« „oH"™[%§[ÉIK¢P€X×29¹©+xêVzzF¸å—¥«çn·@ÚK¹À“ 7õ™zv0¹iÉ-ÿ,Pú•ŒÔ¹8Žº"#(ê–}\žzΧcWâ|ŠŠÍG:‰¬Š¨!)ê#‰µÿ"IàÑ݌d¤3ÉH1”Ì myÐwca6• äIVñ$(y”¼™¨äMPòaü͇`ãC·’/9ǗØ~Ä??iɟ<@ ¤ó½ c°.’ß°ñ»±d®2R +#ƒ?™ËËèC|ëÇk·Aìâ§92"àö¦p›2eÊD͜9sf¨7nߦٰaÃz +%ÑÆo—˜”Ääý²(ü#¶Û`…D-Œðû:˜ãËz0Ò†O>ù¤m»  Ð‡V@Ñu/Øîk¾_ýõÈÅ ¼<†'#QÇ¢ñáV;¾ÖLPjH(Õfà¤ëspúåù§Nš_xìرiÅ­­­ãJq*ýҗöL\äàþ«W¯п¢¢¢o?˜÷‚2˜÷¬Ò‰'¦ü'aîÆpã’(.x 炷T‚R4ÈNPŠ!(E”˜mFk‰ñŁxo|$ŊyÅ¨[£n}˜»1ê6˜Q·gu{•&‡q­ÛxFÝf0궈™]«˜ý¾Q³k×®mš}ûö5iŽ=z@ä. ·+Q7‰Q7‰Q7½ö™Lg’òý÷ß­üøãßjÁCßë€Gßëÿþ÷¿o„|g‚|ã÷¾´àèOÕÇjü ]ü#þö^ð͛7‡‚c÷„£;wDâwkm¸‚u1û÷ï_ÛÔÔ47®¾¾~Š…â×­[÷VÂòåË_Lë Ir>?yòäòx̒b;šš‹F§Ç ù‰6tDlnºÈtNHº) ÷‚/q^\+hñ¥cÕ“Ð(@É +Ñyt%AIOPê@K"þæ %©3-©5º»B&'7¹À“‹tz +¸å^¤çÇk·hÚ-Zu›„ßs•‡n÷¤ùÍ´ôû›^·ü‹Èoa$—0[7uŠî£nÉȅ‡º!ž»ž„·e7"u±§­¨®Ý.Š*bÙ¿±® ¢W]Hðà6‘‘Ìd$҈… d!(YI(žÌ òbà˛ËÍ|J>„_¦ù’iüèVò#âøÓ­äOâ û–‰B„¢ ŠÀ£P¾Σ‘ôAÙø5ÁHñ<_2Véd¤þx!/¨//WÜeï>Å¡xžÃøn÷©¬0—· +5àV[[[­a¥$‰[’ILJëÙÕ*ÒLAV._¾ü¾`s™Ûm\ÛmÅv°ö7=ÀC7¬0Û7Ôì —‚ñÞ¹0=EPŠÁ7Äã»»“p–íi8ߦLœy]~ciþɓ'甦–à +Æômnn~»¬¡¡áå~›7o~ºUUÕcýÁuöœ”ö›;wn~Ù´iÓ2KǏŸ\ՊþËöÀL,2a²öcÔíaFݞЍ1â9-~íuîë6‚ûºMä¾n³¸Lp‰TSS³†QË :q»MhÖ4jΜ9sBÃíJÔ¨ó†ÄnFÝîÈß~ûí— +I +I ú‹dôƒþ?þã?~0@¾7A¾3㽯-?ÿüóçt+}J·’ˆ¿]óe• ™†\»vm8 Dàw·Dá +ª¢Á+bѝ âX(ÀÎBñ,¿råÊWâÌÏăúÅ3þ?nܸR;šš‹FgÆ0þ[7.ŠæE sÂÂp§… ÃüØÞ̃·²L§‡ÝJ^AIïሿ”:Æß(ÎõojE%2I‘IÝ#·+nr“‹8YÊ-½—_|”Þ%=SiÏ1Ҟ/öbcšnÃqnZrË?”zG=“‘ +9oIçíìòLt>1»©³ÈªˆýÚD‰mˆÖ!bí¿^MEa¶nÉʨ›'#]^%o²ŠAɗ äǤj?FÄü‰3þt+Э@·R a'ØDZ +"™BE¡”0¾ §Dò#mŒ„ïÆó,Ië¥dœª>'­ÉÂé×äâ‡* +JsúÐ&—ìß¿T_ðƛý€o/öÈ éËþh9,{yXöâ~°ì¹e°ì饰ìIÅ°ìq\ðfãÆ%\ðÊoÁ)”hÙã ÄŠ@¡P²ùã½XMôÂçÒuËaÔ­ ¸¿Óû=nˆ§t Í´ Í7•3fŒ’,X0YmÎaÍ© + ¹Ž)𵚖––ÍÁƒ÷hX’SÃìw ASà +“ŒºÝ”îܹó©Šü\¦3IþñÇ¿S@Aт‡~ԁŒ~ÔÿçþçÈFˆ ¥o…[É + ú³ÐJ¤uè댿ݾ}[ÄßZÃðk»#X( +WPmÀ®ŽÙ»wïâØÆÆÆYq[¶l™hgü-~õêÕ¯ÇWTT<iñDüôéÓ¶3þfgü-σìÆߢ1›â£pëFG°Æy¦Yp:Ì?·†AÉS%.l ä‰JbéiI- **9iɁLêÖo™(¼ó4±[®'<9 ÊEœ@å–_#¿øPíR{öõu•ŽßÛêX]9˜î–Ü ä–ûÌHNPº?Œä‚G]‘QW<ä¼%7±Ë3Ñå±ÙI¤Î"wEQb[”„è)méÚ"I„Ù𸾋‘ðX÷&(ù”| J~¤‚’?!&€n¥@º•éV +¢(ˆœLâ &-…€BˆB¡”0"S8%‚/£x4šÁº6F #¥ò̙ ôåñ +úð"ËØMر"à6„ÃóGú ܆3à6ž+ܦ3à6Ÿ·eb…›¸i¸m+“jv‹€³JgΜ9)vÚÅ•›7o^ÕÂÆØa§ úÛfðÐÇXìÛbíºä†äZ Þ»‚£ç#ð¹“6‚R¾»? Ô”‚óm#(Ug”VçÁ¨/.›Í.>räȤRðÚȲ¦¦¦7úÕ××?ßÓ¦MO–ƒF–ƒKú÷_¸paŸ~³fÍÊ)C³ÒJǎ›Ø8[ˆy•‡™Î<îÐtJ˜\A ˜M±˜/A6 ­ +J!ˆ@¼´ùaÄ”’<1õÒ-˜˜yfÌØb#¦r¹³ýQîë6„ûº½¤Lž<ùm¦'aQ€©,`>E–±(@¥ R§’4:ӓ4LOÒp_7 +LŠ¨›Ä¨›ŠüRþË_þòü׿þõ{ô£ú«dô“î¿þë¿þª‡üh„ü`Â{ßy8ÜJž@«O¼ÑÏ7]ão7nÜ8Äø[ ão ‘,ÅBь¿Å OçıP€½¦¦f”ñ·øe˖½ÏBÝñŒ¿Ù³3þÇø[ ãoÑèÓÄ(ôil$·gµ…PL¸€`t]÷ñ7JjüM¬c¡VT’ÕғBD¡n±£‰±G®r“DnÒ!<©"àÉ)£º'_¹å·IWÏØnùԅ¥\ªçeŒÂVÜGZr»•Üòe$'(u›Ô#uåBê9ÉÈÉCÎ[RÜ«.A—'¦Sð<•\d‡(ÑRt½C ê’6‘®-R‘D˜ kÁH^®Œ„G½?A)€ HP +dD,ˆ8L·Ré&„n¥PÂN(ƒpadŸ0ÒR8Q(œPA‰¤Øø^4Æò‘‰[‚‘2ø")IÜJÙa°;a?ÉñxŽƒ÷*KJ¾Ã€Û–”œÂnsp[€Ûj®pÛ(nŒíԈ€Û±cÇ‹ÒÌìY÷¢ÓÛq§ 2’Öù#(èS֎þÄkÿ1sg>òÜôÇËkA8p9ÔJÑPJní"(m͂mÌŒ­Ê;{öì¢Â'NÌ,`L(j /Ûµk×kýaԟë£þD9ó¸ËaÔËú£…ý`Ô³ûNš4)µF=¡fv ¼Eqã’pîðÂoAj7æ• +JQ¥ðN MP²{ã#ɞøp†¾–Ïô¤¦'=Èô¤ALOÊô¤—™žôӓÆ2=i:ӓ0=iӓª4;wîÜÂô¤]LOÚÏô¤c"=ICÚ԰¤„N¼-1ê&¡s¾’ÑaßÉ?ýôÓ +(è¯ +I 2úY÷ßÿýß?ë!? ?šðÞ_Ìt+Y„[©=­û#Güí÷;%öÔcüm_˜ˆ¿>}ºŽñ·J[kkëò˜æææù± ÓâjkkÇÚ+++ß±3þf?µ3þfŸ:uêƒqŒ¿Å1þÃø[4nödLV\$ãoá¸ÃBé¥ füÉðÞ%+AɃ dâÒ7 èE¡µ¢Å êOr×7uGŠºG®SpGi$!„'!¼ßڄå*N ê…8™Ë-¿Fz&UªrT·‰ù]!SW¦^ВKޒ;ç–(õp떑zv!¹àQÏd䄢vìiç³Îå9é|Š¶‹ÔYä‚o(­Ct=Å@1ªËþŒ6‘®-R‘ NFò¥ø‘Uü J¥ ‚R0=!¥º•B Jat+…‘sÂIKáĞPi)’E(͗1”¸ŒÒJá©#åð' x}΀ÛÃìçÁ|– åh½Ä€Û›,)9RÃ7‘%%g²¤äBÜVhXR’+ÜjiÙhٛ5Ž€›ÄÝÈ$ƊDiæýº#|KËÝÈt_}õÕ§Øøόb“ úÏXäçS/ÈmÈ-¼w=Vürèwß}w>R€Ðàˆ ´ ´3 ´… ´!ö|eþ™3g?~|Fñ¡C‡Æ÷ݳgÏ°²ÆÆÆWûoÙ²åÙr\îàr\ø€ò¥K—öí?þü‚~@¿¬¾€À”’Ñ£GÇ÷awfgd.ú LäqsÁ[ó¸¹à-yÜ”:æq”˜žOPyܙ¥¦'õe)îz܃™žôŒÝù*ӓ†±zÒxÝ9CÂU-bõ¤U¬ž´QÓÔÔ´È¹[älezÒq Ýrö¤†E˜žô‰„Nü\bÔMB‡}/ә$ƒ‚~RÀCӂŒþ¦ûŸÿùŸ¿é!? ?ñžÓ­ô•õ矾C·ÒÇÎø«{ž Äo¼Œ_k ½téRS8t[$t£ »*»(†…ºcY¨;Ž…ºíŒ¿Ù³3þfgü-Žñ·8Æßb‹füÍÆø[$ãoáÎø׿1~ÙcY%G¡£ +J¬?iÆ´ÕY¨[Ýф¢ãþoZŠÒ.VEÂw;o°ŽBŒêRU¹å¾Êݏ׻˜µ[ן ֒‘¸ÉƟ¹ÉÆxèŽZ6Zø7 ûBnùã=”Â(}óÍ7'cÚAioR;(Õeâ7ªr.\¸°"ÿôéÓ ŠÞ}÷Ýé%¸–q}¹à­¼õ¯««Z{>¨öüÁrØóÒþ°çùý`Ï3ûž'—0»¨=;‚—„rã’`‘Ç-@Éî%×o˜z1”yÜYÌã.4a>—1û!æq?ÎêIϱzÒ묞4‚Õ“&²zÒ,VOZÌêIkX=©FÓÜܼ]ÓÚÚÚÌî<¤aõ$¦'éI¦'iXa’éI_Hè¡o%tØ_d:“dPÐÏ +xèïZÑßµÿû¿ÿûwEùو÷þêp+}C·ÒžLëîãþoŒ¿1þråʕ–°óçÏ7Dˆøۑ#GÖڀÄ1,ÔËø[ãoq,ÔmgüÍÎø›ñ·8̜ò8Æßb‹füÍ房Epý[׿1Q)‰J¾%/(™YzÒè‰{Á`Á½ 3s[÷åê):ˆ¤uˆÑÈ‘ðŽBŒÒ¸Ê-÷W•ö,Ý2« Z9 ªgnr"“ÓËÔÕ¶5¿™–Ün%·ÜPê*àvO±6—0›‹ Éé=r①9¡È…Ä꼝K>E;‹ÔYdUø¿Y‡h):žJO1ðôFŠ(±m¦XxbÙ¿ś"Âl~ª Ià$Xe$HOÎóEðô‘üÝ(ÒRiÉFر{¢IKѤ J,¡HHœøF‰Û")©ˆ½Ö×pÈnœãñ Çíe͈#ÞR³·aÔ;foÃ"®ÔÀ6¶eo755íа¤$ÃD‡4¢v4nnR§M6n+ÜdCÇM6ô܈Ll²Á²Ñ_°¾Ïçj~1ä_ÈG8ða0>r% îJñí Ô˜†Ó×eâ‡*sJË Jóû”¦•€2ÆrÁÛ;ý¸à­?¼•sÁ[ùªU«(_²dIIÿ9sæä1;£/¼• ½ö"æqç3;‡yܙLOâÆ%";Ўr`4&œ +J¡è¿ Þ| Þ,\ðf Þp–~ÌãÈ<î'µ£Fz^™8qâÌãÉ<îIó¸×’;7©y܇ê˜ÇÍ¢ +LOºªÄ|¤éI\ë&1ê&1êFPúI¦3Iý‡2úOíÿýßÿý§òzÈß xï'Žþ`Æç¾³·’èöNñ·‹âoÀÐ}aèݝጿE;v¬ÒvàÀåÑ»wïž®›Ëø[ãoqÜ(ל7{öìAqS¦L âo±Žø›ëߢÐ/öôPT׿1Q)(˜õ'Yҟÿ¯ðeñUoÞLžÜÿÍÊýß<¸[® ·Öˆù¬ü?öÎ;Ήrûÿ™IO6Û{Ë&Ùeû²,eéMA¤ƒ4EE)JiÒéE@PzA¤J“¦¢€ŠŠÝ{ï÷Þoùã÷ù<“d6c²ßEÅ{ïï»ÿ|^°™ÌLž™gÎ{Î9Ï9fˆl›ƒl„HŠž"CtŠ`(:!ØKŅÌU)˜hž¶Á˜UÃR*A‰g»†›TdR½L“&wû‘¸J·R¥ü^PúÎ¤Š2R0’4># ©(¤ÎUõ!¨>;…ðA«>ý¢§ø]!FîÏD1óÍF±+•#qáʊœ•7][¤"‰0D0R²ÂH4nœÎï:)ܕ‹{vónÒÃ3ððÔ2IA™ä¡,JŠÀ#fËã&"Ie$5)I ¸5爷⠖š½ý0³·{³?É@fogöö8ö'™ÊìíYÌÞ^Ĝc%{›F}3úNz?Þbíèƒ\Åþ>;¶ŠÚÑgô°¿çÕFd&˜÷+J/¿üòŠrÙqóæ͋ø×ùhÈ”nܸ¡€’ßÝCPÚJK«”æԛM+¥««V€)Œ Þº‹oM} ÞîjS^¯ ~VMæq1;·^Ÿ>}2ëàŽÍ¨ÅzÜ%Ì㮊›01ŸéIl\ÏÆ% l\’ÈzÜ^P‚¨ ”.¼áù¬,x³ø¼±Ìd;‚R7–™|T?jÔ¨~,39”e&DzÌäT–™œÃŒø¥S‘ǽAÉãÆoy܇tôÍé1gt,Å-}ú駉¨›„»!}ýõ×_Êt&Éd$=Èè–áǼe„|c‚|m&-)n%l÷™ßøØáKë®Hü-m÷îÝ œŒ¿e¨ñ7Ü ƒ=Œ¿e2þ–Éø[æرcÛd2þæaüÍóä“OÖq³þdF£ÀÉú“LTr1£; ”HPŠ#(E”£ùšÁÖo¶N+îb“÷½Ñ†›Ú`Åí­7CdîvÙ‘ x7ô>ÑÉ~‘ðiѕ/Øi¥Ü1!½–ÍÃWC¥*FiàIãoÒ S0SEiéq+ýóMt¥ük1Òïq&©ëڂÅÚ4Œ¤ºÔàšê=RGÁÈHå!19ńUŒ|”Š(²_ôü†÷b¤˜¸S3wo¡Xy4;Æ3繈ªHÑ<5±¤M¤k'ø]H‚‘R)é'?Í ¸ø 7¿ë¡dr™ÜsQ…G«Âƒgû%‡’K.¤²Œ„]Õð'%ÕãE¬p»›ÞéûüÙ۝yñdööc:Ø7¯3iüøñ£uÓ¦M{N7{öl¯3iŊ˘½½Zdo3•f»nß¾}{˜sü¶¸I§N:.Óû!k‘‘>bÍl­a}̌™+È¥Hü÷C”¾ø⋓¡@i}¬ø*”XkÒJcY`(A©?A©—R`ñâÅí¹àí¾¦à’¦\ðV Þj4 5æÖëÝ»wfmÖã®É<îÖã®Ê2“ù¬ž”ÍàP&I¸õÓØ +7 ’ʵZl\’éo\RDPªAPªGPjÊzÜ÷”Ú³ww‚Òcò¯¼MW¼½úê«bÁÛ«º;vÍãÖ±g‰ŽéI: ç'¥kFísé›o¾¹)әDPº¥}kø駟„Ü2B-}eQÝJøÆU5þƶ&§¢‹ñ7°hÐø[º?þæbüÍÍø›gá…ýë•Éø[&ão™Œ¿yóà—×sã RÓÅþoNÌý&*y˜ÑÎŠJÉIìÿƆy1lýƒ¹àˆâ GD‡ã~6‡qÒÙ8ý¬œ–’’½ "«U«&„KzˆNö‹Dš®”?Kp‚‹úÜՐªŠQ*×ee3êæÁÐ%dàþKL „Gs] +(EªÞJ5 Jõ Jw™°Ó–¬ Ё•z°2Àã2v€Œ.a`'HØÒòåË5 Þ6>w1û€îرc•2J©¥‚Rl&vT,]±Ñ¸í‘¸Ÿ­á| Ã,3Ù1éŒVÎA §¤™3ÔD1IŠ¾°°PˆNö‹(ºJ¹ã‚KQŽà’yE}kÐJ%(žTnÒ “°ªƒ©¢´$lO°”¥J·R¥Ü Pª¨3©ü€›š³]>#‰ áŠU½G<Ґ‘…¼ÓTÎªH"ûEύ…¸#ÅÄý™¹g aãÑì<®ƒgÁs‰"ºÄðÔâ8»”…l8ç% ?ÁëBxñP²(UøA6%‡ç*‚ïæq/Bò¹S!G…$Öµ‰X›—‘DR’¨ Üð´ðfoãÊ<èLêÏRgÒ ,0ŸÎ¤åj)€2Î$foӞa¬ôsFÓ_ÃÀþFö SZk°X4×`]µC>v@®Dâo¢ñ©”€ïûAiïÿJ൱uwìØ1¤>P£_Ã5kÖ<ژ­pPš5kV vxkÂou¹à­:¼Öïׯ_N]ÜŞRܧÎxb¦VÃí˜\„;11 4ٴ⼯&8(‘TPrÅàƒ,‚RžÛñµZV‡7“èð†Ùӑ ô Aé ‚Ò@‚’h\2‘•ž/Ó¸˜ç]ð†Õ,x;¥c™Ió¸u"ˆsƒ ô%AIq&Éd$Pô½Œô=Aé;#i‰ tˬº•¾ýöÛk{‘Öí-«$ښ0þÃø[ëO&0þ–tøðá×R|ñ·…é[·n™±nݺI®U«VvƒŸŸfü­¯è÷°gòäÉ]kë>|ø½žAƒ5v÷íÛ·Ž ·Yu&*2£;›Ýn.}KKÆø%±Gn\&(]ŠÆ&çâ°±¥£·Ju(äú5|õÕW½ ´`Á‚v J§L™Ò„Þê²Ã[uvx+dã’æq{˜Çí¬Ž3µOÑäBùÉe…É*Œº¹1’‰N܉I)ؔDHzþëŽÆ-Z%B€¨ªšC\jÅX€Rs‚Rk‚Rg‚RO‚R‚Ò`‚Òh–PšDPz‘ äíð¶e˖u%µ2ÀA¨wÁøåAé#Ýõë×?#(‰ô¤¯$`Ï- ¤8“ü ô£þ/ù‹BKFҒ ¨n¥ÏmâøÒºE·Ü3‘ìãñ·Œ¿mJbü-×|9ãoóÒqÌðÇßFº/^<È=gΜޞ3f<ä™8qbgÏèÑ£[{† Ò܍Ÿßˆ‰Jµ™¨TÂD¥ftW!(¹R0Ω¥D‚R,A)*&0<³',“ÉN筃¾\;æ›Ñ†ég°`6ê͘—² 3T6rþ(úÌÌL!:Ùãñ("Ûí®”?XÄÀ†^”2â{—* <‰ç¸êoOyñ¼O~ƒ)¤oIÍò.?2[)X%ÊÊø[¥T”þ@g’pS×µ…d$ Iõ©x¤!#1Åäüõ#RÒ¹\.¯à¿²_ôÜØ@1ò»&îÅÌýY¸g+§³Gs–"xQ<—¥-Î/Ó9™ÓYDJçKIÒ HŒ°‘nå)x)¤Qªú¥˜Û ©¦¾[ 5¹])©Ž`$vºjȾ M$–K’ðx¸cßÆïLêÎëëÍLR—¹=÷Üså,s ÈL*ãL¢Ïã4IŠ"?ìAö {}Æd× l?¦tՀuþœ5oˆ¬b;äSþöq$>½LP:OPú |u4¶û]JeÊP:~üø¥.A©Ö›o¾9V€R=‚Rœî£ —/_Þµ‘¥™3g¶h 8i҈ ÔpØ°aÕÙ᭐ Þrêà¶Í¬…[4C% Sr,1—Q·,FÝܸÓ1°I)0婉'ÝÑçì<‹ J%¥Ú¥F¥{JmJ”&(õ%(=-ÚÆ”&”fC”V”Ö³„Òv‚’èðö®2º¾ÊtuÌãÖa˜¾(JŒºI¥d2’ Fú‰ ô£´d„ZúÖL·’ÅçV*›ÖÍø[ãoQ}ôÑÆßÞöÇ߶Šø[2ÎjEª/þö¢sݺu“3V­Z5ƅ»ä7î—'{Ô3iÒ¤®üÔv v 7»)•ê1Q©F»ˆÝ9ì‘ëIÁÐ¥s%a26>S#:–i~%G&“=ÓÊê /7 óÍdÃì6XùcáûŒ “S6bšÊFNgg²ž"gddèT‘„8NEt•òç‡]+¸<^QùJ…' 7iI<ï5¦´¤®‰«@ît+ýóÍv¥ü›€REIš€›º®Md驱¶`Œ$^3„£VƒGÁÈHÌK1M}“XR$==]ˆ¬þ¦W(F~׼˜¹S+woãÂxÈp<’§ÍŠå{è͖¤”ÓÆ9§+eJb![Ý@Ùäœ\"N¾‚Gø½E”ª”bJ5J‰"ؤº_jø¥¦âBÂ&FjÀê%Ü$foK¬½-±‘›¤:“úöí«éx;Š5“¼¸ÕŽ·k×®]­ÔL +Xææu&}ðÁ'u>g’¦µÆ5ÑZCi?Ɔ,ý«ú|n…Ü°C>sàoŸDâÓËÑØîÃ8|ã4Aé˜”Þ +¥Õ°ÝK JsTPª½mÛ¶¡õ@sýý Ô­ÑüùóÛ5‚ínÑH€l·¥õ PT·wïÞ9µ JÌãÎ(Á3­*ž¢Éµ¤\¶+É¢§C% qr +[%Jì^ZK츕ë”›1ΔڔºèJ”ž$(=CPz– 4EZ´h‘¥%¥UJ+\–î$†¾E Þ¼•J5 ¤cz’ˆº”¾—~þùç J?) ô׿þUˆ—–ÜJ7­jZ·¯¬’ÒÖ$’ñ·hÆßbh{ÛÁøÛÆßV¥ìÝ»w)ãosÒ7nÜ8ñ·qŒ¿ cüm€?ëqÆßzxp7uôŒ1¢•{ðàÁÍÜO>ùd&*•2£»Ø‰GA^Y©ì Qr! ›€©‡ÉƒÙNP +‹Ä´²†ÃTZÂèյЭ˜ƒ f·ÞÌ7¦©lät6PôœÓú´´4ìIHjjjÑUʟ#û2‚Ëã K©ð¤r“™Äó^<ùƒÑ’‰öC]§ ÂUÔ­T J•rی ”4kÝÊOá·c0g’Z$IMJkÔ|$ág-Ÿ‘Ä›ˆ˜`ÁÈHÌK1M}óWR$%%EˆÌÿ +ÑS ÜØÀ¯¹3weáNm¤/;'±ƒ‡ŒàÁ£x1<¡x¥k-N2…§›ÆI,êEº%.ñg:Q6AIÃH^<Â/¯F)¡Tg—Ï~©ÉΟBjù¥”Ôfïô:²`$&n+ŒÄ€›Äìm‰µ·%:“$\ŠN3“$\ßG¤þýû÷fîJî‰'–S€[­™ä[ævˆ 4Š3Içs&]‘„3ITŒ}ZEû1vSºjÀ:ßTòd ŸÛ!×øÛÕlr… t!”¥û@é ÑÂD¥ª¥’L«‰³'@©.A©>@©Wƒe˖ukPjOPº¯Ñ¤I“š6¦Ôk`QA)·£á%<1(¥àí3)‡…“²usљ”Ž ¥€R$#cï‰Æ°ç” +x WW@ ß&¥{(0Î] J”ú”†øAi*Ai¶J¯¿þº¥ â7”!þ:(e %¥2A麎y܁ ôƒJ€¢ŸeàÑÏzŸüd - ·’)À­äMëÕºEY%ŒøYÆßNDËÇà¸ûãK8zôèfÆßÖ$“_J0Ïgüí'﹌W^ye”kñâŃëãž>}úÌ¿=à5jT7î°{ݸ×3Q©•ª3Q©07f6AÉÍjçiIg‚R\R7yòä º™3gNg7·9ÝÜÖ±¾(Àý& !¾Íú>^g’°âtwЙô±¨-3Ó¸Lû1vÕPjÀ:¥84 _”®”>À&Ecã ± €3 ØÁq”€û\~PÊ(½šPZFPšKPšNP_ +PV ôT=€ÒcõJÝ̛7¯CC‚RC€Ò] ƌS¿>€¥f= KÕ:¸ÇóJY\ðæ₷ô"ܓ)ù¥d‚RR&3“\¸<”R’Y4bñßLvq͉Àc¸H%<ëúA©… Ó ]PJPKPšFPšÃÎÂK J« JPzçwö±Öäa‚Ò‰@Pºªce?(‰Ô…ïïƈ÷rcÄ»»ñ{;¸ñË[º¦w¹€¦õ™¨T“=r«2£;7 x™™3æL`˜ö ¥˜8ÌøÈÌ£ð(Lv{&˜5öÒÆ@¸sÐhÅ ŒÁ‚y©7óÇÄ·#¦®dàœÖ'&& +ÑÉ ŠHBâããˈ®Rî¸pØË/Š"*F©Ü ™Ä³]u0‰'¿†–„…¶BX a?4A8Õ­¤f+ýžø[e¢R¥” J¿;ê¦.sS3“‚9“Ô€›ÈáñiՏŒ‘„÷HÅ#yç¥o®Jœ¿ªÈŠà½"ØØÀ¯¹3'±…û³qþÚ9|ۉàÛN4ßvbù¶OPJb$=• ”.áœ]¥L‚R6A)WY¹&R³ÉHô +•ø©&‰§¥Ô/µýRÇ/uýRO溶2ŒÄ¤$cz·Ìf·2I²Ï™ÔQÂåé& endstream endobj 131 0 obj <>stream +áZ>,õëׯ·ôôÓO?%9r¨4~üø1LážT¦ øK ­aîÌF&¿ÁÕXoq5Ö»\¶~”ËÖ?Î$Ï™¤´…Ù~ì¦h?Æ®_³Nô×Jhõ¯¬/íøï hé3‚ÒÇQ°ØcÁWg J'’oܸq8 h°ß³½3f{S6¹&ÿĉˋJóª½ýöÛ3j€-&ԂÙNPP ô8A©A©c˜í– `¶ï&(5 (Õª t) T CR… äöƒRj>@39›U¸ý ”œÎêɸn”\~PÊU@ 7p ‚R=+F¼©\”Xp²s”z”ú Pb?Üq~PšËq^FPzÕJ;•å„”XrÍs%QBI€Ò ‚ÒM¼é˜ÇMPú‘ ô³äg$?(©´¤º•n‰« ªØÔjÝ,«~íÚµ3‘lkÂøÛ!Æßފ;yòä 8¡I8µW[– +tžÇøÛ çš5k&d¬G¸.\8ñ·Þî©S§>ä7n\g÷ðáÃ[» Ԝ…¹ðȨÍD¥'žiñ*©¸m]Éì´$ qRëj”¢ JÑ\2‰ f Çd·80ÙÍv†Äm˜ ]ÀfÌP½‰/:FL]ÙÀ)nàìÖS丸8)66¶¬ÄÄÄèt•r'…ã\FxÑ`”†›TdOô`´¤ú–„]B„ æVG]W«”?”*uSëJªËÜÔÌ$ñ2  ¸‰"›Oµ©Œ¤ºTĔ3V +Ù/znbàÆF~ÍĘ¹++wjãîÃx p2ŠáiÄñ„yj)<Ét–Î (yJUJ¹\É_À¨[‘ÌÔl?#ÕP|F‚Œ0kSêèa§ëJ=Eð©øW}J= IêYq[OFÒ³¤¤Œm.ә$ә$ә$cÚ? ãBõðZßK ~_iȐ!ƒ$ÐÉ)ÜR@ +÷bvÕx…)ܯûS¸wӀ`Hè=ÅÓª8“¸K8“ÊvÕ`!D½¯«Æ7_åÃoÌ?ÿüó×üë¦ òyãoáØî“(XìK¥sñ,¦DPz t  ´ËPÚLPZ›Pz© 4¿ ô|u°ÅĚ¥‘µqº딞¨‡Ÿð`}ü˜NõJ÷×(5«ŸÚ°~t)A©ZmÜãù¥l¶Âõ°Ã›³ˆ¥}ò¸b ”œ‰Ë“ìbÔ-5B Jé ¬ž˪WѸ‚¹¸nUƒ€Ò}¥öA@i˜”¦ P’@iS (½çÏSkMj@éAéû  ôù?þã?ÑC~1ào?éV"(}gn%MZ·¯­É¹ˆ«W¯žŒ›½ƒƒ`ümwü±cǶ$:tè5ÆßV¤¦¢g¦§';ñ;Æd±Ÿq͙3çIÆßuOœ8±«{Ô¨Qí܀ò,Ðԅ'H=VTªÉD¥¢tܧ¹iqO +FҙĢõ‰¬=PŠ‰Å<Š$(9¢0Áì˜jV“Ã`>M6R£óÒ`¡ØLF2ñ•ÇˆI,8»õBh±åèèhE$!QQQeDW)w\8ìŠh0J…' 2©^&ÕÁ¤Ò’‰vAXMNX5[I]§V¢¬hü­”*巁RғBF݂¥p‡t&©7±öAÍGRýH*#©.¤_㑘œçª*²_ôŠ`76òk&îÀ©kãN휺¾èDðE'šn¥XÎÚ¾ã$sÖ¦²°“ ä–0k³J9~L¾ÌâG2Ìl±Ì¬l%íH0ñˆØãÅ#Lçz”úA¤âÇ#-#é¹ÂMÏìm=Iz:“d\…Ž2®LW¯§Ìz2^ðûKLá–ÆŽ;šÑ ‰,í3ƒ5ç2궔5Õ¶·ÛuSS¸ßg=€S,}^1à ±«ÆuÉ¿K‹ÇÔ®F‘K,L4ä+‚Òaøô:Aé*Aér ¾{>ž5’Dyn ÁÛNãMÏŋ·V9{öìk¹¥¥…UJ/”€áž«šU +P\ Ô§.@©g½ùóçw®Pj] Ô¼@©Q]Kí:@—’RÜã…5qÛæ°nf1^-3X =ٚ‹’BPJÉ`ÔM%¶â#(¹ý ”§€®GM;îgJw) „i @©;[˜,233ÓŽoq0mЎo´1LnÁ ՛1Wõ&ÌZÙÈ÷'»ó\;-ɑ‘‘:U¤ˆˆˆ2¢S%<<¼R~¯hÆTŽ½"ÁàI<¤U/“ÆÁ$žòªoIÍ[vA …t+…Lëû=‰Jÿ|^)ÿ2 TÑô¤ +DÝÔen"Æҙ$Ü®"ÃOµ©Œ¤ºðÈ;ùÄä4UEö‹žŸ(Fnlâ×Ì܋•S×Æ=‡ñá׀’ÎJ¿F’|ŒôWùïÿû_õ`n¥²ÕÒºEY¥³Ÿ|ò‰7­ûܹsûãN:µ3gµ9ñàÁƒk“Î/¥¢¤§_HX?ç|ùå—Ge,\¸ði׬Y³ú2þö0ão]kËø[ WŸ>}š°P@Ý ¼¸×pâ>-Jßç¤b=¬Àžû–œsà PŠ$(9¢0Õì˜öVŒ¦9 ¯-&#äVÌxƒsUo&#™øòcäd7pžëa¢…èdZq!’‡ÃQFtÁ$,,¬R~›Î`,¥á&Õˤ:˜TZR#q¨A¸`n%µd€°.ˆ¿ýžD¥JPú?*¿”‚¥'[ë¦FÝÔná5Õd&©Î$ávë!„+VıÕX›ÊHx¤SȈOLE0W…È=ÿ&ÄÀíŒü†‰ßµpÖZ¹?;÷ìà„à„æ„å„Mà„M–0aÓJÞl<ðUØ´}zãoÛ:´.iÿþý+[œ +œžŽŸ0Õ¹råʱK–,êš;wîS®3f<Æø[Æß:2þ֊ñ·»Y(  ”:qŸ§ƒïóÓ0ìY,~žÁqNMÄÄIL`õÖ8Ö(‹ÉÍÍ ÂÜ‹äÊÓp€’Łio¶”lx•1X:7cÚëM˜¿²‘o@Nv'»vZ’i¬eZq!’»Ý®ˆîÿ?±Ùlÿ yBŒÒp“@&ÕÁ¤Ò’‰Ï{ñä6@  ¡ÉVRãoº‹¿©ëßB&*U‚R¥üÁ 2[“žl­›&ê¦.s éLRn!IÌ<ŸG݋G|bRd¿è)~jäÆ&~ÍLZ²pW6î4Œ»灢xÈ<ž§‘$a®¦J˜«N sÕMPÊbzR®Œ¹Z ãÇTeÔ­Dϲz˜ÞR=³² >Fò:Ž`f…`pšhÄ Mýr—`$#Ì{3#fü=F ñ}Fv¼5ЙdÀ[Q'ëèq{êuÓ3ê&3ê&;vAeԍÇ–JŒºI7n\/DÝú£nø£n^ÛÍ´ՙäo¨ñëD¯4ÔðW>$(}g†Ü²âƒ¯J_8°ñµ|íãh‘Ñ-–¾Ž'_»víPÚ'Ÿ|²/ ô† ´± +Pmu.8bYÁÁƒçV(M¯P_ç<¼&Îþ©Zø—âõ¨ßÖ±6à¤UmüÞ»K‡ Ö @©´fïÞ½«UÇà”rŠØUƒ äbQn'A) ”ÆÐ[:AÉIîòƒRvPj@Pº;(=.@IϚž· J§* +J:(ý• ô7)”þ¦´Ò­¤6Ãئ¦uRE]¼xñPÌÙ³g÷)i݀ԍ‰LëND/ONÏK¤>ŸHè¤ŽÌ˜?þ ƾ ¿·'׿=Àø[®»—ñ·&Œ¿ÕÍÀ}Z݉Q+LÇøå°ï°'…ý¢“0q’ªW¯ PŠŒfMŽ(H{×  +P +KLL4”ŒV€’ÁÂø¹™ dÂL–œñÎx=¬³L‹-D¢Q׈ÎjµVʝ`¥A&ƒ)-i‚pÁÜJê"8Mü-äú·‰JÈ讥ÿËò.x+¿(€f­›Z@º©¥DTZãLRn"¶-ü¶¿f$‚G|X*‚i*+‚ÿê)nbäÆ&~͹jå®ìÜ©ƒ»à\æ\¥G)A¹$”ÒJ. gš)á¥&[ÆÙç˵jÕ*¢3©šž-Øô¬{äg$aS¼GŠkˆìCìij‚±¾K#æ Âî6a8›™ÈH&Lö&ŒsK#&{k#Œ{#ëp¡zØҍ»·þ™gž çZ7ýøñ㟕¹ÖMž5kÖ 2Ìö|a¶%®u“¸ÖMò­uÛǵn¿Šº‰†°¦Ÿ ÛÍî¯Øy¬lC _/•EWÂ:C¾'(}k ˆ¿]W3ºcDF7vz"éúõëï¥â@û—/_Þå>þüæ,€Òšœ£G¾”Pš_{¾H7±dÓ¦M#k¬]»vP͗_~¹w­… >T +$é\ +l] +Pj^ ˆØ¨æÀëÔèÓ§OõÜ»EŸYs‹ØU#Ãé&(eTÁ5r”Òý ”á¥Ì8(Dâá[M%›”̘^PêׯŸ”&È”XÓSñßJß}÷ +J?”þJÿ!ÿãÿò7J·’‘n%…Yª¨iݗ{oZ7ÆþH4ÆþíX‘֍±ßšt~=iß¾}¯¤ìܹsQêæ͛g1­{Š¿èY¦uq͞=»¿ wX/7îµîî#Ft`ü­¥«oß¾w3þրñ·ZŒ¿3þ–—†‘Ìb½ªŒdLœÔD˜»Ą̈Ø8ØÁ¨< Ja‘˜~¶p®Fu`Jší%› +JŒ¤+ Äw!g¼“]Ò ¡±–…ЀK±X,:Ýÿ 1›ÍwHB2$7©È¤ñ-©yKjNãVvA- ÆßÔjšõoå +¨\úV)w ”n+;dz’ºÖ-dÔ-¤3Ie$ñ:Œ‘øœTð3Tˆžÿbà&Fnlæ×,œ«6î/Œ{ç\äÑbxÜx‚RA)•6lKîazRï3y2ð…t&ëñ>SCÏö" ¸•a$%†&œD°w‘xöÜmö4 ñ·»-âýcÚÜ Fº×Œ!¾Ï„Á¾ß„yÞք«ÐшÙ݅ÆúA#,S/ø ¯½o…ÅÖs­›ž&eV˜”—,Y²H^¹rå +iݺu¯IÛ¶mÛ"ÑlKo¿ý¶w­Ûɓ'ÕµnÞ¨¬©ÚPãkFݔ:Ñ¢é˜J¾2>?‰ Jo-°ÓßØ°ÉÍ0P•HTºÊÝWbD3Ñ»?’‚½~åʕ7]`†­™0Ö¯W±^‘ c½°ÆzfŒõ¤bëÑ%0ÖO׀±î[è÷H-@`—ZS§Nm[kܸq-jÂX7­c]¯:@©f5ÜÀÅÅ«üB€Rv>Æ43w§›mÞ2<¸dN‚RF«'q՛›ÉÜY¥œ@P*U@I\\…V¥ŽFÌ” ‚OUP>¼?”|yÜÎ$J’”ZÒû‚pÁÜJÞ&piݘÖ}:iÝïƜ9sæ­8ó¦uoHüiÃرcGêi±õ/¼ðÂ4yþüù³åå˗/–W¯^½RÚ°aÃ:iǎ[¥½{÷¾)±Â¤ä«0é5Û¢ª¯ü¡w±z`ùÃ2MÇD‰hQËGXgˆp+}GPºeóÅßÊ&*1£;ôu:áƍG“q ƒi8äÞ |»ûôéÓ볎;¶2çСCKòöïß?»p×®]S«nÙ²el5@ÇВW^y¥õŋ?VcΜ9ÝkNŸ>½CÍ &´¬1räÈ»«c –<ù䓥Õp+—TÓvîÜ97£[%WƓ…»ÓíÁÝéÊÀÝé"(¹J‚R•8öè㪷B‚RI8A),(™JF (Mš4i¼”D½*”šV ™;(é0ºe‰òw?(ý‡ÞGK^·Ý|eÜJ¾´îë6µnG@Z÷{t+ˆ=uêÔ.¦uoaZ÷kI¸KV0­{aê¦M›^dZ÷d¦uaZ÷׋/¾ØÏ5eʔ^LëîÆ´îìÿ֒õ'ïfýÉ\ÿVˉû¹˜ñ·¼4̔¬¦x×HM¬^½zbÛÅáu$*Oðh}ÄSÀžœœlq`rší%AÉê%½”d#(yi‰ÆZ¡%pü 0͟F}6=õÔSOa¬Ÿ2‚ž1Œ?~´}ÝôŒéaÐæÊ0mKe¦'É, + ғ¤}ûöí•@#%p‰·Âä… >ô¯uûL³K +¨êó“è¥Q¦D´ô(n%+ìô×vØio¢’(= PºHP:;ž>8” +RؗŽƒ¿áÂilÌ<~üø«U>¼,÷ÀóòwïÞ=£¨1¡êºuëFT[¹råÀ’¥K—>Q}îܹUŸ1cFçê'Nl]}Ô¨Q÷”<ýôӍ«_ê㦮Q„Û¶jÆ/?—"'—'+ DëqÃb»3Ø7 —ÑÃÊܙ,8Y”piUPj(Bo֐ 4zôè2 $ P°«ÁÎ_’Èœ¯XŽR0Pú»"ÿùŸÿùwâu+1gp+y‹PªÕ˜Öm÷¥uRý@q+ጩîÃ؞€ °žiÝ«’q–¦âÌM©NOÇï\²dɈ \€LëîíÂxˆiݝ™ÖݚýßîaZwc֟¬“[¹ºv«0 cŸ“Ê.1)x×HO‚¹Kfü->¯#1±xDF»ÝnGË¿FÀhZÃYî,Œõ<ì0©F+ׯZ¸@ÃLP2‚’A€L´¤€-¶”¤‚ÿåÎÉïáƒÁðû$$7…¤%5oIu+©ÙJê"8µ¶’°!•*Ñ] J•rgA©üJšÊPR{–ˆœ;µ]‰&=I]ë¦Ö^Ø`™Ib‚…d$ÌK!” #71ùAÉJœ¡Q|•‰å«L‚„çs2£néLOr1ê–%cræҙTHgR1I5˜½]jÀ¬Ç€›†‘„ ɋG>ØQˆÇÖ¹sg!-„ØùåÞ ÒÂ.6Æ8·´aÄï·bìÛZq):XpeºXpñz˜a5㾏ièСŒ0ÖC0Yc Ó§OŸd`)n=Kqë¹N]†Å~Ufz’Ìô$‰¥¸%¦'ILO’Ξ={FwéÒ%¥Â¤uãZ7£n:_ÔíµªO™^þZ>FÈO¥JßYEü- Qéjä­[·.Ç|õÕWçâJ'Áï%ƒÍ¤]¼xqwNc‹ûäɓ¯e9räål`ż={öÌ,ؾ}û¤¢õë׏®ºzõꧫ-[¶ìÉjóæÍ{¤ä…^èZBiW2f̘ûª 2ä®b°cƒª¡ÒBÜÀ%]ºt)ÊÅõȈ±ÎÎÂÕÊrãºef0”³É"?Y‰¸ªÙq¬ ‚*òƒRí°–-[6´ãª6³â¢¥§(é} 4]^°`”D-/(ù +{z—ú*s‹Ìùÿ”t*(‘‘ü ¤ÐRP·’(Bùë&p"­û"Óº½n%\}¥Z@,.À®xœäf¦u¯¥[éå”;v,LݸqãL¦uOr¾ôÒKc2ð+ŸaZw?¦u?ê;vl7÷°aÃÚ3­»%ÓºïbZw¦u×bZ·×­„ÍJ©ax(¤&bn%&`–Åű·"ÝJÑ°’a‘¬˜ŽGÅGp+™l%+±ZèV2”LŒ¸UPòђN¥¥y·ÒÃ£ßCAz½>¸T€›BҒƭ¤ÉVRão¨ëß4‰Jj[a]Ԏ&!A)X€Å”*Aéÿ¼üFPҔP*¿2@°oÁò¸ƒ¥'…ŒºiœIŒ$ùÉ J (Yü d'(9¸çH‚R ϞãI&g*£nŒºyd¼æfËxáͧ3©ª/0ÕéLªe€q­Ë€[#K‰Uj +# ’/^víjKv`¬[Ù!-…„ùä>J‹0vÆ”û”M0Ø­ìöÖvÌév6¼÷t´âuµöîÝûAKÿþý{™Ü×<|øð&=4ÂX5>ÿüó“ xߟ©g\ýªU«^–ÙWf\™%¢™ž´_‚1<,1=IÒ¤'‰î¬7oÞTšŽé4MÇKD”þ¢¸1|´ô£™n% ¶ÓÄß>UzäÂN ;ýA<ìôûI°ÓSa§÷¤ã4¶¹€ë<ï¿ÿþÊ*\’;=;vzjìôØ¢5kÖ « +;ýT1ìôcÅ°Ó=ªM™2¥c5Øéû‹a§›W;6.ÂÕ-dû±ünݺ粫F6‹EgÂXg»™Zì¤ÅNe%ã‚VIÄÓ6'ÿÊ'(UÂõ­qÏ=÷Ôv‚ýzÍ>PzL€’Í‡Ai.AiAéUJ’(ZÅa +JÁN/(aÀÊ¥‘UZòáʺ•ŠP–©àw+¬@·Òž¸cǎmgµ¯[ t½”Õæ(n%°·p+ Ϙ3gÎ@Èü ׄ r9²¬[ ϒƮ@·R:ƾ¬[ s+9Q¸•ØZ¸•b` ÷Rrr²5쾂“%é¿þë¿þQ®[éWÕpQÕj­t&âã?>î¯ ÜJ;˸•öìÙór +nŸ©¸‘¼n%Ü\¿r+Ö»±Z@{Vën¥»]x‚”u+ÁŒå ·R*›Æ·RR€[):6ЭÁNC­&ÜJ¤%« %áV +„ –­:ÁûŸ/ <Ý-U€dY.GÊG¦n%M¶’x¶KTÒ +Ðdt‡\ú²F@Š)U–ç®”Û¥Ûª5YP +¶àMS=©üô¤Q7”0%½Œ1òS“”¬%;AÉAPŠ¤»7šŠã!uKeÔÍɵn/·^g¦¤×™„Çz©?«ž?P¬ý9Ûe‰éD + 7F­àQ‘pHëÈýø •"Ø®¥VøØ8W¡­“¸C.Tç°Þ½{w³ÃD÷´ 4èq+›×[`§Ÿ6ã~¤ Ì0Þz˜f\¸pálŒõbÚ5k^ÑoÚ´éuù7ÞØ*¿õÖ[oÊìYÂô¤÷%ö,‘X=IºýÑd$ÑCáÆø‹ò³ÉçVú΢‰¿”®F”.Gß¼yó\ì7N&ÞKÂÁ¤â4v§Ÿ9sfKÆñãÇ_ó>|xEØbQ6(ãÅÜ­[·NÎ{ýõן-X¹råÂ%K–ô/š;wn¯¢3fô(š8qbÇ¢Q£FÝ_ti^пÿÆù¸Çëæakå°«F‹Îd D.^®“3Ì/ÎI†ÙÎMåÅC +cðßâ(\ä0ê”… Péb¬£dfen?(õ'( %(õƒÒ‘FPZ-ð”‚ ’Z rœ t– t)(}ﯣT”t*(‘‘Pú5-)n%c [)°åU»¯ZÀyV ([„¸*ÜJÛ·puU2pu «ÌI®NSÜJ‹/îV®¶ t+Õõ»•ŠÝJN¿[)A¸•âÜJa‘ìÆÈl%‹³ÈVR‚påçvkVÂ+ðÏ/B¤Êod© + ÓmRùxTd +IKÁâo!•‚et[úö‚’°y• T)¥Û/ʲ„’¦q‰¸½ÕænÁ¼© T~z’‘¤2Œ”DÔÍFP +ã®Â¹Ó¨À¨›p&¥)Î$¼»dÉ™TDgR KÔ24jÔ¨®¿­!n")Iä#•e$ŒÀ£¶aµ¶Œ_;F²]8Æ´]¤-¥M$¤u$>h…MŠÂ7‰ÂÄ&¸(íÂq:8ppÀöt0`ÀÃö§Ÿ~ú ÛðáÃû[ñÿŒå¹çže3L0ÁnM7‚Í1®X±b‰Vm•öm½Æz»¼ÿþ=2ä  9*1[ºxñ⇒šÇ-ғJ_.¿R¢njA¥è¡šF )ãVRãoV5þöý÷ßqëÖ­+Q‚c€ā͎&âà“q{SϞ=»Ý ŽØà:räÈjÏÛo¿½4kϞ=s³·oß>=wÆ òV¯^="ùòåƒ +æϟ߻pÒ³pòäÉ] +1m ÀŽ÷åc„îÊT6ÌÅ`×Ɇ®‘Õ©S§j\²".^$êûä¥àªæ%B +â!E±xÚV‹FՌPÕ ‡eoÖ¾}{”¬%‹”z© dðÒT‚Òlù¥—^Z"”V”6”v”Þ*JçΝ;£4(y#ž¿ ”ü´t[n¥Ï·’¯Z€Æ­´/öĉ;ãqº›q„[饠n%\Õ­ÔËïVêàÏVºÛŸ­TJ·R5f+ ·RÅ­„7‘4º•’„[)>77×ëVÂ+”# +O%'Áis»ƒ• Y`)H%JéŽÔ¬þÝû«(K•ÏMå#ÓJZ*ß­,þ¦)P>( û¡%agBSª,Ï])ÿLP +Y”[JšJšÊ!¼© 2=IãL +%7ñ:“(áQê (EÐÓͨ[£n‰Œº¥p­›“)ÜgR1I5 øµ™½­ÜîVr¶Y㈌t?©È$Q2á +ǘvˆ âPÚGR¢ í¢ñA[J›hŒxkÊýÑøF+¿Ü/>ˆ‚´á×ÚEââuŒèÛ·o—ðþýû÷p 4葰!C†(©µ&5 ¤vx JÁÊLþ:û¶¢n–À¨[¸?êÃcÄK)))"…;)Ü.¦pw&5nÜX ¸‰¤¤æ¢¤…ŒdŒ„aj†QëàÀHv ÇèvŠÀˆwŠìÝ»w§(HÇhHJûH»X|Ú6Ûµ¡´ŽÅU¸_•Hëh|Ð6ÛµêÓ§O§È~ýúu‰ÀKzp GÇï6f̘§ì°LCl …Ñ–_|ñ93ìôó&¼êÏ3­^½z™qýúõ« Û¶mۨ߳gÏý;ï¼ó–|äȑweÐÈ1 ñŒDc-ÑXKlî¦ÉãVAI祲EÅêt¿ÃJ¿˜Ô´n_üí¦rŒ¿E0þ…Á!OÅ}úé§ï'\¹r坤?üpOêéÓ§·¥;vl}Æ¡C‡V¹K2s²¶lÙ2=ûõ×_Ÿ‘»dɒAysçÎí“7cƌ‡ó&NœØ%ÔÒ.Ù2‡]í³1~ªàÊÔËą*õ°¢ ·m5ëªi¸ E)-Z´(J½[5R‹mõh|P+²U«Võ"€Ä0ïÍìL®·aVPêFPzԄ Pz† 4ÆPš¬Ÿ?þ‹¥E¥WX•aÀØFPÚÃņ¹Øð(Aé4Aé‚””Ÿ~PúŽ ôcEA)0W¾[I)Béw+}t;n%M¶Òd¶Ò@·Rw.‚n¥VnÜòÍèVjè¤4C\<2 +ûÌNmØ°¡;Š4ᒴ¹Ý•(-‰'jÝn+;Á±Á‰ÞÄNpBŒ¢œè›+zÂùûæj;èŠN#j×;"Á©æc†¯`U>7•L¥%I’¼r[n¥Š‚’fé[ù ¤SҀ’°B• T)ÿ ¤)Ê ”4%”‚U¨(•Máö’¹Ü¨›7…‡LaÔMq&1…;›Å%Ë8“˜™$²·(7_RR ¶³h%ɆjoǨut`$;…cœ;GlˆìÛ·ïQxŸî Äéé‹ÿvˆƒ´Ã§íâ±][J›xX’Öñønë8!øo›X~ƒíÚs¢`qºF<øÁˆ¡C‡>Žwö>Ž±cÇ{î¹ç†Úð2?Æ:{öìI–E‹½`~ùå—ç›`§—7nÜøªaǎ {÷î}CðàÁ}òûï¿HþàƒŽ3û¬Ä<‰á öÒëÕøöÛoƒz5PR‹ª‰1[©lZ·¿ÿ[Lôgá0ÑEâ@¢qÈ3±0ÑÇâa¢%ÂDïK†‰Þ™ +½)&zMLôKn˜è™0Ñ3³`¢'W‰“ =$&ºLôc¹S¦Ly0CÒ9Ù&›]í«`üîÊÂíÝ0óÁ¬ëf D—H–a ( ´8÷nqȨ8ÈT‡ՈÁßJ£pg׋Àånì_5Ãånŵ‡¬¸FÝ,à°GÍ¥'MÀÕg¸âp4AiAi¦ ´ ´‚ ô:Ai+AéM‚Ò;¥÷Ù4æVeø ô½yŸùA©¬7¯ ôßÿýߊÈþ \0·’¶¥ß­ØÛ$¤[ɛ­ôëEp”ÚJsæÌ$ÜJl™Û“µ•ºÐ­Ô–-s[°¶RSž%õX²»&KvWMÇ´ÊKkÚ´ifª¿d€’ۍ‰Ç'Ѥ¥Q`I48‰HKK³:@KJ;8;^yŒVÌiµy®lÂ<—ɀ'ˆ"zŸèd¿H¡DL„{û”¹ª„D+ AiàIÃM!‘é¶hI¥òi)Xü­|PR—¾ijhŠ)…%MyîJPª”?”n«nù ¤)Ê­‚RÈJP +ÈãþU=ÁH¿ŽºÙ•¨›p&©Q7}úô ù… g™Ç}I«\U@ –3XžŒ”kùȚZ>¤¥Àøۏf_µîoûҎ^w`÷W#p ËQ0Ñçb`¢OÆ~òÉ'G`¢ßN‚‰~3åÔ©SÛÒ`¢×9qÎ+3pöKÜøs<øEÓ³ðÛ&TÁ¯YeñâŃ³ˆ}³a¢ɞ0aB·l˜èU0V÷WÁ`ߓ…›¿©‡=ÈÜ"ü#Ö`ᮑ† Z=7pIR«V­J Õã 5c@Pµ£ðiýl×$·|s®[lÅËݞõ(=b³ö%(=í¥ç¸âð‚Ò‚ÒË¥×dœøÖùÜMPz[:~üø†=O”γ|Õ‚Ò§¥ÏöüŠ ô-AéŽýÏû¿”þ¦‚’.‘¹sn%±.À­´°Œ[ ¿÷YÅ­ôâ‹/ögÉîÇX[©KvwdÉîûÝÿæì×ȅgIí l‰ƒ-Jd§6iÒÄà \z2œ$âi‘_XX£Ôíf;8v9 ‹Ä›-´dQšçb&›l@&ƒÈd°`vëÍà&ÙD1â1"ü¢÷‰Nö‹D”§È/þ3D=¤*Ô.à´Ò`”Æ¥rS©|Óïv+…%q’¿”4å¹(UvÆ­”?”4ýpï((I¥€¨›×™$¢n™˽⡚À5¨ÉŒº‰zî Î$_)QR²)n÷0àÖ҂1hm `¤°]#@<Ý"a>»GÃ.t'ØtÏ=÷Ü@Ç´iӆ†Á<=kƒ‰žl]¶lÙLËʕ+˜ñ¾ÿ’ oþkŒ»víÚdØ¿ÿNý¡C‡öëa§ËgΜ9!Þe÷%éÚµkW¥/¾øâ†Jß}÷Ý-æq{AI,Qgz’¶è¡šFìwc ­ôK·’è–‹]}eÃN?Ãî? |4¸uãƍÓ1Ÿ~úé±8@Û¡àÛ¾$œßÎœé¦4°ÅZç^Îؽ{÷B÷Ö­[_ô¬[·nræªU«žÍÂïš5oÞ¼§ªSž¨Â®öU08]²`¢Ûe±Yk&³¹7z%«·rÝtÜÅ¥i¸ 5Sp×HjÓ¦M\äšqÒü­ntûöíDvìرI8®ys—"²HC{/7ë3xAéÙgŸLPed’Aéy‚Ò|=@é%‚Ò‚Òf ´‹Ñ”Þc"ýI&ҟ#(]&(]e~Ø ?(ÝR@I„=+ +J·ïVòõ6 æVz¿Œ[I­­àV%»g°d÷çÒ¥KG²d÷`–ìîãÆÝù0;Áuu2¤;ÁÝçÆt¹‹%ê \e®˜A¸ü´f͚UImÔ¨‘‹+áÒX·;‰´GZŠŽÅ $-9¢ðÈ°G¸\.k8æ¯Åd2Ù16 “ÁŠ'ˆÞB1cžË&Š%ü¢§ÈŒï«"qaºF”Åêâ‰t‡E=š‘z D< …h¨*A㦠+ Óo¤¥ß˜¨léÛ%µá[%(Uʟ +Jš~¸âv,¿® +JÁº—¥_ךü(‰N%åGÝ0ÃB¥p§2…;ƒõ2%Ÿ3©PƙªÎ¤úáLâ +7nfL5Q&[©þhÇÐ)ŒÄëî‘ÀžQŒÅÐï ãÐ#†´G¤["¤kþö@2¤S26阂jŸ‚o´K=oKi“Œ½i›„ÿ¶Kħ°qç8î vĈŌ3¦WÔøñãûD‚ +†Ã( s̞=ûYû… 'ۖ/_>Óºzõêæõë׿dÚ¶mÛZã›o¾¹ÙÔØexï½÷öëOœ8qX>{öì ùÒ¥Kç˜Ç}Y¢–|vZ¥Ôô$‚’·–¯0tÙÕéÂ0CÊq+aWßX…[ pÝqëÖ­O¿úê«K‘´sÑ@µ“±€¶#ñ8«·Ν;·'éäɓÛRŽ9²>íwÞY•¾wïÞ¥;vì˜ë~ÌpD&z^~ùåQ™‹-z:cÐ/‹]í³&L˜Ð#“]521Øm<@ÎûèÐh&²Š3pS7HïÚµkÝ4\ÐÚ)@¡Ò$@Qi.ri<¤N,þ[/4ŒÄ&M#póßíÂ0SÚ³UW+®ÑÀk3@i —b$kXM0,X°`† 4 ´Œ¥^ei†¥¥}¥Ã¥ã’ŸT¹âð‚ÒõÀ ð=/ÀOe.Þ*(é|xô_~)KK¿v+m™û¿»•4%»½àp)±d·è7…àƲÜP׬Y³žrM:õq7îÓݸm;±d€R‰ÒÍ' ÂÕe®ƒpE,°”Ë”¥L¦,9“AK)¤¥D6ύÃs#*ύˆèììì°¨¬¬,[ÖpLbsž &{zzºÑ†‰m°âY¢7SL (Yˆ"(zŸèd!|ð‘Ta.±]0E~~Û©xþ©"ª ÉÍ R1*<…hŒù+dÒÐRùá¸PRû˜”JÂi@IØ­JPª”5P +Ö÷%9”‚NÒDÝü)Ü~g’Háv³@—Ìg§’ªr@f’p&ÝÅî¶÷ša4[Y0m­…‘Â`z»‰uh0šE{zFgzÆÂ|öŒ'Ó$@L9rddü«[ +¤KÊðáÃ;§b“Ži\DÆ·í4 PÛT!\*D‚jK–jG´êˆ;sW]ãð~þPì¸qãzEãu½OLÑÀXça¼Ç?¶xñâÉ6X«™VØ­X°—ÌÛ·o_kÚ³gÏf#ìÛ.,Ý~=lÞ{2@ä¤JW¯^-JR0‡F VIÚZ>ÁÜJ¾"”ß›Ù-Wq+ýðÊ[Éñõ×_ã^ˆÄœŽÆ¹‹½råÊ¡ø?üp_âéÓ§w&;vls +cmÚþýûW¤ïÚµkQÆÖ­[g¹Ö­[7Õ½jÕªqîe˖ ÷°«½ç…^èãµ<âaW F­£0Ñ.æÉd`4sâo’Ž;»a*.h½”x nnê:‰¸Èuâ!uc!õ£ÁH¢pËßÅâV÷„cV´¢±½Ö¾+ Y=laJ½HPaÂ¥o(M'(Í!(-Õã*¬&(m` «¬aõkX½ËVÇXÃê Aé"AécÖ°ºF—Þ—¥oJßñüÈ ð‹âÒóÒß Jÿø_@鶳•ÔEpၵ•KvoHÄ¥XÍNpËØ n^.Åó鸝¸£2p)žváR<éV+QŠ'ì›Kf½›A¸ •r%\5'#LYU@Ýlž›NZJNÄÃ#>“3&®¨¨(2¦   <:777,Èd‹2Y˜Éæ0·Ûm²ƒ›ŒÖŒŒ ƒ¢7cžË&Š" 1PôøTˆNV…õÜ$UØACˆN#â¡õ{$ØNE19!"eSˆx0jÐJÅ(AP!¹é÷ Óï¡¥?”Äà”JjgÜJPª”]Pšï((I +(ù’¹Ë‚’Ú×­ü¨›HáQ7M +7Î%‡õ +Ù©¤„¸Kõ>gR:“š›Ú·oŸ¿¼¨6hÃ0=`g–ŠƒŒ{Ù3Lóp4 Á#tù<7jÔ¨GÀ4'Ž3¦g2äÁHTü­[ätlÒ)Õ!ßhŸÎ0Q:vÐVH…,ՎTÕ!™5üÃH€M~(n„ ½b`€úDϘ1c`$Þއ…ÏŸ?ÿYÇÒ¥K'Û_y啙¶×^{meÓ¦M/™a¢×šðú¿ÙxðàÁ]†÷ß¿þÔ©Sïéϟ?R¾|ùò9Y€Ò7®J7oÞ¼!ݺu+xŠŒ”Ô\⨹Ä2D¡%½Ï:—u+Ñ:—q+·R˜Ï­t9âóÏ??õÙgŸŠ¡[)öâŋïğ={vO"¸n{2oC +Xou~Ìòô;vÌw‚A^ȍLr±«½kÑ¢ECݳgÏ~ÊÍò‡JB1†½«‹@êbžL§…7³tÒR*.h£ÜÙ ’p}ë'™êÇSb! cºvíÚ8ª{÷îw³¸Õ½á¬ãÀjVííÌA³¾zZqñz[®ÌS¦LNPGPšJPšÍbŸKJ+õ¸ +ëJÛ J{˜$v t” ô“Ä>d’ØG¥ÏJ_0Iìk”ÄÒ7¶!VcŸPÒ€RÜJÁ²•4µ•.º•—q+áڒˆ»I¸•^IÁo[œŠ{mVÚÚµk§:W¬X1.ƒ•(]þ’Ê¥à}ïæ˃p÷º1’M +­çÂ8×dÊRU.EÌc͆¬TВ‹´”š„)™”X«V­¸øêÕ«GÇGÆà1âˆÊÏÏ·G™¬áxÛ±8ð@1…aNmƒ533So¡˜!²‰b„H¿è±,„O$!ÌYԊR:˜ˆFd`ß{VE<EÓ!¢†ŠV*F©’›‚!“&0wGhé_ ”„eª¥Jù÷¥ýpC‚Û:qªéµ ¤¶+ Y8‰)ܺÀn /¨y¬PU.---ãL2Йd¤3Ʉß{¿ö²½ãÒن‘ìÖ¯_¿á0½=#ðä$ŠéÕ1`Ÿ^q ‹Ågz%Â|>š<~üøGR =Ó‚HÇߺ;™@ãÄ;vç lÜ1ö£}¾Û.<ÔÖébT»T¦%²:'ãk]Yû8~Ò¤I½b§M›Ö'ïì£`†Ežu,_¾|r^ëgÚð‚¿Àºe˖—Ì;wî\kÚ·oßf#Lô.ÃÑ£G÷ë?øàƒ÷ô~øáIùʕ+çäO?ý´B ˜"#I‘ñӒ„ éV²Ð: ·’@ ¸•Â}n¥3Q ·ã1`¸Ãq ¹ýñ8Ý]‰`‹-I‡z=eÿþý¯¤îÚµkIÚÖ­[ç¤ã§NwâGOÈ /Ãb|ZY§Î„b†ý!l— \¨öÎܟ޷oßi¤¥TÜíMS@A“p7JÄEn½Q¤q þÛ43 k¶`9¬ûimöÔSOu±c=mØó +(M:u¨éÅ_k(M1”f”J+J¯ëJ[ Joʸ +o³}Ì.;ªÊˆÈŽÑˆ¨}[¢Ùxª"ڙ‰ÂŠâ)D…,£A©ð¤á&5X ™Ô\¦€ât-ýÆòܕ T)ÿjòïJÉÜ*(Ɂ T¶÷myíJÊDÝt)Ü|þ0…»šŒ3­¥ÇS¹ž¡Y³fª3©%Im-x˜w´b¬ºØaf{8`p{†ÃT>Ê%hEgû<kðqæñ¤çž{î±È£iGÒ!9!=2ðzݍeù éèĵA›hOiçµ%AµuBÚ¥ãoRa‰;§à]¹Ó`v{þùçûÄΚ5k@4Ð`hä’%Kž ÇËüä0ª™ö 6,°Âx½dÙ½{÷3Øb³”±ËÞØo€¹;¬¿pá &úœ }™&úª}Cò™è[AMtˆ\bÕ0+Ö9˜[I úXh…[ÉÆ ÖÙJ»ŽÓ8I·R4Níý˜‹/Œ;{öì[ñ'Nœx#ñȑ#›’Þyç5)ìjŸÊ®öi›6mz1ÝïËð—?”ê›A¨Ìàò+'Lôן~º]:8çþ4ÒR*¦AóÜ÷w%á–ošˆ‹Ü$·|“8HÓXü÷®h|Ð< +óã>ÆjÎrû!CzÚxá­¸ŒOYpQ†˜AcLÌ#(Í42JPzY3]«§_}öv”ö³>Ãa‚Ò Ög8Ëú —üWá:kÜô_…ïy~âUøÅ´‰J:”|´t[n¥ à×®];K·Ò‰¨K—.½}îܹ±§NÚM·ÒVm%JÉ's»3–.]:ÂÅx(ƒp}„{˜w{W®„kç4hÐ}nVo`ÊR‹‚2Á»i©€´”MZr³pz:''â-&!¡nݺ1qx©‰ŠÅS%<S7, +Üd‹7YÃA#æ0ˆÉŽ‰m´A VˆÞB1ãÙD1B$¾¡ˆžÏ&=WË~‘ØQLv«¢ô­O³`"j “`«û"ú—‰uïâ9)Dt€|¥Á(OªJå&áoÒ “Úd\m ¢ÓøJPª”ÿOäß”¤Ð 1P¼ àL +V8)QDÝt"…ïeJ +·ä«P]ÆéÖÑ7mÚ´¡ÏgáLjAgRks÷îÝ;X0.Øz÷îÝÝ3ÛÓƒûhÄ°aË=zô1xü÷fD¬OS‡’`z§L™2å‰T˜ÏÇÒ 6‡éäx£›¼‹wÎ7uÈÄwÛ{`pÛyEmÝ:CÚ9!Ò±IçT|£k2w8}úôGfΜÙ'@0 †Ù³Q˖-ó4ÉfxÁë<߶}ûö—,{öìYc~ûí·7™Þ{}FðÆ~Ù3gëÁ 'd˜@/(Á,ª tó%áËð’6è#û¬sÙÜnÑ N¸•hÍ´Î­dŁ¾°Ñ­öõ×_ì uŽ¸~ýúÙÈ«W¯žˆ¾|ùò{1çϟ;Xñf<ۏ%úºÚ+)2)[·nŸJ_FÚêÕ«'¥/_¾üÙt É0'(r “Ž7'Æï‘tÆ>âìœFZJ%-¥ÀNߗŒ©qO¦A³D̀»p¥ïŠƒÜ‹ÿ6‹ÁÔ¸7 +Ó¥edŸ>}Z3%­ƒcðàÁ]Âpõ²ãê?nÃîû[q g,8äh3þœ  ôAi9 Y½JPÚÈBVo°Õ>Vü<$ã·#(!(]¤_ïcúõ®Ñ¯÷ýz_Ó¯çMT *QI J~Z +êV +Ò ÎÐ îS;NãŠ'ôa8NíƒH€ëÑ(Ðõ»1¸}ފ#¸ú+Q®I%¸ª¹Ý×g„Ê ÜSî3f<Εp1ڙ]NÚ0eé^¦,5aš}=ÒRMÒRUÒR^zëÖ­³R[´hábõô´dLΤD¼ÊÄ'™bâ€L‘1µk׏7…EbÛ"𤱄ƒ<Ìa“b´A VˆÞŒOe“l,)|W.vÕñuÉ+l! azU”çšFDBqù¢ù†Ø•*¢‡xXò4”–¯*d©¥' 7 “ZœNƒLªƒICKj‡¨ +ÐRêV‚R¥ü[Ë¿-(±¸nhPÂß¼Q7•ÍŸÂ4ê¦óEݪH¾îb¦p×d=€zz:“ -[¶ln¤3ɄßÛΌèle1f[¿~ý +Ûð£áxÊ?9jÔ¨ÞÑ`¤¾±0•ÿ½÷³¢ÌÖ¾«jçœ÷îœ9'uÆ,Šäœ£ Ðäšœš$49GÉ A$+(¢¨ˆqL3s΄÷œ™s®ï¾Ÿ½{W÷fç¼×'ó6¬‹Þ•ë©ZëWk­g­?('<”’éÀÒI³fÍz=¢;'Lw¥­è”Ž¥í3`WÛfbåV™Ø¬E&(¨Y&ŒHÓ ˆ&$¨&´)MS± y2ViIÜj›€m;Æáû¼[Ìüùó{ú-ZÔß³lÙ²¡.æ1’‚_ô³­;wî\dÞ¿ÿ +¬óFÃÛo¿ý¦þìÙ³t—/_>¦ýàƒTPú@¹sçÎÍ (UB £¥Âì˜}(”{­³p+©Ö¹h.1­3ÝJwéVúÜJëL·Ò ðí +­ów¸ ¯pæÕ®®h‹H‘‰ÃU.‹gW„Í›7ÏL,NJ,((ÈM\¸páÐ$ðd?Þºž‰`Ñ®ÌkÏ °V bÆaÿþýÅaTëÇÂX¿Cd +ÐËäÇ[Q—5Ó_öà·zn,mÀÒèY½9]‰m¬LÖ·Œ;¶»ÕDŽ‘lÄ Œ6,Y²d’~ÕªU3Yñ3Ÿ? JëXñs›'¾WP:BP:EP:ÏL±÷™Rƒ)õ·J_0¥þ+‚ÒwŠ JE‡‚®¡hC!Ý Jÿ%·ûan%<wÌ æÛt+ݤ[éšãöíۗÕ(O²dÀ¡"}s®ëŠäv\g%áqœœpÍ Ü`΄ËIã¤Ä4 E{–£l‘>tèÐ,Þ]—´ô ié ÒRuFâ*²ÖU™$|±d$à•LŽÇL|,Þж0öù¡dÜ>¼µ@Ä憺±8& ÃhƒÐ[!t­‰Âˆ¥„¢Çʊ›É: +-ö"ӛ,3?QR„`­g!d-$^xᅠª¹_)Ä„àNƒBT–j§jôªò•À(• TxRk®“Úó@ “êe‰à"—Iu0E”`‰FK÷­ P +J¥â_X<Π¤„AI…Œ¤‚–º¹ÝîPÔ-\8I)Ü¢ +w9œÂ͏Ç:¨ªßkp /hñ![OGg’^8“p_ژ Ç;ZX:‡MÖzˆºØ,e”ã#õñ‚dú`úÅŠúƃdú$Ν;7'¢Ó4z¤AtˀÙ¥²°^»,pSk–Il‘m›gÁž7͚6mZ“LŠ ˆ¦ÌîhžŠ¥-“±r›Dn‹Ó5ÐÓ›ÜÏ»|ùò¡î5kÖä:a˜'Ûi£¬´V–ƒ®0;vlƒñôéÓ;ô°Îûu°ÎÇ´×®]{Gsóæ͋X¿Xç›Ê7ß|s› ô¥ jùV.¥ŸiÿôPŠ°ÎÅi)²d­³>léVú>ìVºcÁÜfAŸ›öˆ‚>jŠ ¬ó>ÿ™3gÞ œ8qbcÌ¡C‡VÅîÝ»wIÜöíÛçÅãLO¦LLXºtéè„üüü!¼k}…‡o„ ]˜Rß^Ì=õDA–¯j“““ó*+~Öc¹ôz> +–F¯ÏÒè Y½ K£· &·µáèd?~|w `6njádZ°`Á(–FŸÀÒèÓ Jó JKu¥5ÚÇoÑ”vkÀz‡8÷ð$çžåÜÃË +†âAécÎ=üŒ tW …tïPˆøÛ_8S{APú_q+qܯÂn%µdÀÁ5JɀPn÷Ñ£GWÇ8p`)ÛÁÍO²Ognƒp#˜=6 ŽÐ4 EƝۤ3/ÜùjZ¿~ý^ -ýž´T›´T5¥mÛ¶’ñ"f'6mÚ4-š&)š&.Ȉ©[·®—}Œ]>@‡ÃÞ°ºð[œÐ>&;„Á¡·BèÌX 5AhŒXOcÀŠÛ*lt-³A‘Ìé2€¬a»0EˆzõêI +•›,Ëó¨BjРÁ=B¨CUD[El+„P›Bð@Á6eB‹â\ŠR•À(APž„JhVÁM"v'Ô«p5 d^&50'r™„ƒIÐÒC[ „p¦¤A¸RP*ÿJâ±%ù ¤¥¨Î¤PÔ ož‹» +EÝX8I*,œ”ɨ[99œÂ­@û<©FzVƒë¨«…V®¯ΤN:µ-PM0•],°’ÝE“5ǘ1cr\ø0îÇÙgý}€fVǁ‡$pæUŒf_VßëÑ3vτ蚅¥³;íØx£ulÖ² ¸©yØÚ¦ÙM²°¿&™M3ðg³4,m™‚•Û$a³4þ]âð‘þz`Ù²e}}+W®âY·nÝh×æ͛'9`˜gÚ -@ˆå&ƨŒœÐm8þü>Ýûï¿T{ýúõw´À‹€ÈU‚ÒGAP‚m ô Aétc¥‡º1þñ@·Òߊ»•þÎ%þA¸•L,èc3¯hmÅ +ú\rÂ:‹™“°Þ!/¨oŸ]5 Áõ1dÂØ]»v½·uëÖ9qëׯŸû2>~ñâÅ#9ƒpû$`´z0¹¾Ké½2!zd㣺[,íTëµ/ »Ú¦¬xËrضyY@VÓ²à¡&$¨&ÙM3!š¥cA‹T¬×:™›%bW]âaŽ{ĬX±¢͚5ƒ½6lí$Lt°Ã‡mÿþýùV˜¬3Œ×:#ÌØ6 Ú^=M›Fî´æîAéŠr÷îݏÀɧ¥;÷¥{ (ýC.&¢¹•Šäv±Î"ëY'š3¯nÑ:ß3¯<]ç‡~øŽûêÕ«Ç=—.]:è}÷Ýwwùp[ýGŽYÀEÄàòƂgÇ­]»vjÜòåËÇ*GÄãþ Šwö‰'-q>bnhË,ïX m‹V®bõô&~ÖþdAôF¬­ÞØúVn•‹a;vvVj°Mš4é5k^^^o j{È g™±FæÕ”f”é®+JJ;XösË~ÑàbN”ΔÞgºØ ˆx‹ébŸ3Qé+™ñ7w(#c>Zü­˜[é?¢¹•´Â­„ñø™´$ÜJ•(#JÜ“Û +ßÍ ÜÖp® aϞ=ù ÂÍLÆÓ9)…•AYÂa0S–rHÿ¯1U¯= ^µ -5$-Õe$îfy?‘ +-U=ʨR2ôPYÖÍH2¥$à Mˆ`ÄÆBù` ·láôâýµ»!,.³Âhǃ BoÁz:3¶ÐšÀ%#v °Ú¾¢Çþdúem«V­d-Ž!k¨ë48¤¤Põ)Ð’,ÕaPí!D÷°m=¡T¹¿ ê•G“pðPiT£Ô‚užTnþ&µ¼¯@&‘Ú$s"¡Iu0©á¸’•® ÑÒ#%xG0R)(•ŠÇP<ö ¤ ‚„6ìL2p‰«X¸r(êæóù<áÂIÁ¨›T,êVIÆYUWžzê©'|¡=£öyI‹+ª¯ƒªjª‡†kmÀmê`ìÓ§OW3LåëLKÉ¡ìçœ zøpK‚à*GŒG±øÛß#æ¿Ýß­T<{L£‚뽕(#JDÏí.Ì µƒ;uêÔ¦¸Â Ü΄›ÇyÉëׯϔ¥©xø²àU/&íu!-µ%-5#-ÕgÞҋéø0yšê¤öìÙ³Z +TÅd¨¥2,šže”œe‡w5†ÕB}·lá`µP˪[\&Ù­OoƒÐY°…ÖŒmµlj­aÝÅ §è±gY‡×^ÖBõÉZMÖP*TŒ +U¤Be) A:§]DÓÅ÷U¾nFMïªÈ$ô®HhRLBïFВ‰yKj–·Z¢òÁ)K*E¥ T*Wñ¸€’\””â ¤¥ÐQ¨Q7Sؙtÿ¨›T,êVE®]»vM…)Ü +Îù9Mýúõ_Öâû­‘v-ô¸m ½zõêÌ^ÝÍlêeÍÍÍíg‡qèÌËËâÆ7ñ0ôýð äð8NµJ`|=¯†¤‚d¥Ã.ôϤ߇î{•%ݔÃÒ.å±^Ç + ž¶°Y« +°â-*€›šUÀ®š”£(KQ¿5ÍÂÒæ\/[´cíãN‰+W®|N“Þ17nèƒ)áÙ¹sçxlrž_ôó¬ÇŽ[j9}úôÓ¹sç¶`ËvëaÕéXˑ tNóÅ_¼Oƍ (Ñð?¥h´-­ O0E†ÖY¤È˜`¿0ó¬,ôxÙ`?°ãœ/9„sâ:NºpE‡=¸¶}^&aùp½ý@ÄUþ={ö, lß¾}>oΌR iiL,nçðXÒR,i)vÚ´i=b9'ŽU¯:²ë£/%(­&(mÖ”v²RÃAVj8ΒVïhnݺuQ) …~ÈP¨ˆ¿}A_0þ&ãý(ã^ýŽ¿ýOÜJEJhïÓà$¢d@ÑÜnœi(·›u»½¢n7}–wß}w{lanEÂþýû%âÁœÃ”¥©)lÏǂWÃèlíGZê‘.¦8€–Z3×8÷¹^:Þ·çÓ ô;†ãj¥öîÝ»J +tXùd¨ª,V MK„‚JŠ‡‚Š‹ƒ‚ +°–7áòA8¼V7„Ù…¥&Ö3؁z+6ÓY á´fìEcÂþ4F(A…_EŠǐuxíe-)krrr$ xMRúöí+)8— û÷ïPA! 8ðB¬¢ +n+qW÷,ñ&á¸!´JZ¨fž„ûIUÃ"b§j`áe9‘ Mùª´‘·$æÄ©õ–Ý­T +J¥â_Düë~3riI¢nR±¨[5§V‡\žVpâ/j5jôª×ÖD‡ëm¥Ç}é`€úêf'(}EPúŽ ô#Aé‚ÒŸ‹ƒÒߣ‚Òý×ýC"-Zç¿·ÎêÌ«`Î@ŠñǼkbÎ ë|Ë œ‘B;‰Âë|ÆyõêÕ®K—.rŸ={vçí·ßÞî=zôè߁VúwíÚµ8°mÛ¶y 6L'-MŠÁM̍aá)ÎÔ_î`9Ï)È?vìض~B+ˆ¶f‰¬Ö¬Ñƍ¥í\`¤ì³×Å1}úôîvV ²q¼C6Ă1eÆðL (å”æJ‹ ¥•úãǏodI«:æŒißÿý#Ì;¥tœgrýûLTº®ð¢ãà |ËAùn¥Ÿåû¤uÿ= JäVŠ×æv‡êvß¼yóŒ'ZÏßÚx\tA.?Ÿ)K3“™F—¾Í‰!i M§á=z´Ô­gZ²JF£t|“¼œ>bĈgŽ{’ej¤‚(*§€#Ê%ƒ#2“ ÃRñš&ÆC}ÅÆA}ùYàÁÃNþgg«KÍN¬gt` k«ëÙ}HNJhZ3àDcĞ5P‹¢ÇÀFցÒd-Þ}Y3tèPIø&)Ç—dœš$C)púaB¬'w qWAÁÝK¸TIÂqCh%XJ”€'¡Â…¦ªYhe¡EˆNèb˜SL"I ÇEВšå-æĉ +A¸Gš W +J¥â_D< Äîޑ  +ÒA BK¡£0„IÑ¢nþˆ¨ÕCÙpÔ­†Œó{’Q·gu««ÁÇYC-.°¹WÞV]ÜÙUÕÃí˜Ã‚9ý™‘2˜¶q¸kΜ9#=ùùù£ý°¹1t"0y87æx4 ÁÈt|;˄œ œé_ÿË)¯W âTÂz*›ÚUÆf­+ƒ›ZTÆ^š‘›šT„=o\‚î§&e`Sšeq• lÑ&;èÀ¹×]`‰{ÆnݺµàÍ7ßæ…=ã>xðà'pa¶ àð†å̙3+Í.\Øh„M~ӛ|@Óv\ ›|F›|‰ t6ùc ômò]Úäoi“(JÿN›ü׃Å?‹ÓRÐD?$E†®Zg„ûÞ@GŠ‘¾ }fœäÇ"„0aÇ%œw0)݉Ë:î¢wƍKÝíaʒ÷ȑ#ë}¬Žàc‚·wh® ¥§Ã-ÁD‡h‰e¼lz (dêìÇHwôs»f»—ƒ?Û±Å^7ìy'öÙëâ„yïîàÔF;³”mÌÀ±b FZ0ÒãÍLd6±ÏŠ‘…« œ=ÏڟëôÌB×1³qâI-e¦ÿ^? ›ï&Ý|·9(w‚n%Þº•~¢[éò¯w+ýg4·R”’Ñr»? ævß½{÷º„sᎃp¸¶1¸ÊMqǎ[+_’ˆ{0? wcz2î˄<Å#IKIK½Ó1]Ó9”³=Ea±àӗŽ{&0ñ۟TOBTJÁ{Y6t“‘ÎIañЄx°Ol„/ÂÍɋN„̓U,œ·hvb # <X2To’hSך€)#ÞsÅ~Qô Y7zôhY‹×^ւ•e ÎEҀ•%¬,)x"$'x^‚BOIQ¡.‚[÷"qw/á@’„ã†XJ%(O*7 “ŠLÂË$R›DB“PÈbÐÅ*-©jXä-‰,ï ¬áÔ2Þ¿Ò­T +J¥âq()E@ ¯•ÊHú (á·(=<ê&‹ºÕ’Ÿ~úéß)/½ôÒó|ˆÕÓàŠk¡sZép#:è¡^»¡ z²ŸW? ´Ù  ä0”ùHÔz® +~¬Vw\,`g\<4ÿXö“ÊÌêô7ŽÈ‚IZb`9üÙ·D¯ŠXúZe¬×¹2¬iû*جupS‹*°âÍÈMM*ÁÖ6®HA÷Sã²M³±JóL®Ì6°í“±«.¬‚üzlO߀`Ñ ×OøÉN˜§YöS§N-´ž={v¹ùâŋŒW®\Ùa¸qãÆ~ýÇ|LÞxG ò¸¨ùú믯”>¢M¾MPú’ ô A饟 JŠJÿ' Jÿ¥†A)’–¢áè¾ -c|A_=' Â}GZúÊÈ œ‰¡(3ƒpæñX™Ñc[œs€2N9ÁG]çϟ?à~çwvyNœ8±ÅsøðáµÞ}ûö-÷±ªiiŽ÷>Ϗ;91@¶ °Vgˆ30ÀN mO"Sw?(¨+ cuö›:z…à4-¬x'7–v¦S±«“ó·̶a³½~¶¥K— +PaÅЎµ`৘1<³X$=ßȶ+ŒÌ'Ó³®ÕN= »zõê1-Õ5"މczÐûDœ|®S¾büí» [‰·I¸•ä{ƒ¢ËVzxɀûåvG¯Û-‚p8ñPŽYp,G¹7Àö|±¸Ô LYZÉ®3o°ë̜äíÛ·OKÁÍGæΎÆý9ã¡gú‚ :gàž¶É`© Ö{5oÞ é@ˆß™j³µnµTÐC… N™d¼¡éI€§äD°O|sÐkãÜ,*ÈJ“Ðò“cYƒ˜q°IÉà¡ ià—q0¹Ù#ÊB )1 "äT†±îQëu­ +CÚ¡lE›j°Ý-«a/ͪÂÂ6©шN§F)ÊcAã²X¥i6Vn™ÍÚ¦bW“Þ|óÍ×X +¹w,X` ÿ­·ÞÁ$ñ®“'Oæ9Μ93Ïvþüù¥ Ä`b‹X±› tˆ ô¶ÐqŽæø=ú-n”n”¾ (}¥ƒ Ä~m‘  ‡ÞîOK÷üpÊ»„Ó1§/ Â}c )Á Ÿ™˜½cGÜ°€(®XYÊÊx×Îd0áaçÙ³g÷¹N:µÃ}ìرMܗ5ŒK.óÒÒlnç4o¢Ŋ¹~@ïp?lÙ ?chD¦ìVO¬d¡ˆó» áÁo¯¹a4»³!ñë.¾ÞNÖþt ²¯Zµj¸ ã–kÅ@MdÛ½<3)f@Â"VJ_nd͆g«þ… »õÄ +ݵk׎k‰Ì»ÈøÛ ç#jˆ$ +½j +ýkŠp+1(­$—lÜ?%·ûžºÝ%Â}ôÑG§™²tÌ÷Þ{ïàwÆàR7Çá¢×––&âF, -ÍHÁ͙˜ŠgT¾sîCN:îd· pDû Üâx鲐}]"Ó³ô2=É4¦Ìü®ÌþˆåR 2Ù1•}j bãñ›Ÿ=1xìÁh÷‚7¬ žšYÙÃè˜6mšÁŽ=ë­àC«5cÌ5,°®ð(zœ†¬Ãc!kqV²O‰¬ KŒ´¤@H +ÎY’…!K2F?(¤h‚«·¸‰»’°gIÂ1B@%JÀžµ7ѧŒÝ d^&˜&‘.”¹P܂–„’úY¨f‘å-´²š²$‚p¢–w4·Ò}³•î JÑ©”JÅã%SPÒA B€’>JøÓDg’us†£nFÝâ#¢nRñ¨›üÒK/½ FݚhÚ·oßZ‹ÑIקOŸîz|°åñý6Ðõ:Ì}:ÚÆæð˜Å‰n(·É^¨¾©@ÌÔ8&£$ÀþNáwò¤4ð˄LØä±Ù£ÊA ­1°ô©²cǎ׫b½nÕ°EÇê@¦¶ÕaR[VÇ^š‘›šT…hDSÃJø_CFì—ÃÒ¦ÙX¹y&©uöÒ!y×®]]™)ۓMIû><Ì{üøñ±n@ÂT>æçØ`¨[`²V™`¼6aÆvéaДN”Þ%(]ÖÀð]#(}LPúŒ t— ô-Aé‚Ò/aPúwá¿Òþޓ¨”¢Ð’êÐú2”pNS„ ‹ÒRaîkË™¸cbʒ0qÝÂúCVÆÛõë×Ïد\¹rÂÁ™÷¤¥½aZÚè-­ö€'—’–ò½‚–Ø’ÌÇ®¬Ú™ëci:˜ûØÆkՇíôzqjcOv îáå4-d$7 i/L[Ž–®Ÿ“3«W¯fÇc1چQ`ÅHOµ€ +f³¥L¾ c´Ìtâĉ5¬º‰U@ßԃc÷s>âÑ`átÔ²´#ão­ô±¦¸[I W P³•„[I~¨[)2q¬Äu»ï-°¤án²àU0çA8\ÇÛ^\ÑÒÒ¾®rG,®wc®|UîÁbÒÒ¼dܗ<ÒÒxÒÒÒÒÀt E/–Ô蚁ۖEZ›eâÍ«Ÿ dz‰^¦§˜«ÃÌïêœ,W‰Í~ʲ×t»ú¥°5bB~‹‰ÇR;/º™~æôã%¶±ð™…VML44:0ªzfâë¬K­eñâōg 0  +ûöÉ:¼ì²`-kp’’ ,)dIÁk*)x$—PDHý¢Bü&W +n+qWw*áÉ a” (O‚›„ÓIø›2 /“ÈoÊÍÍ 9˜Dú·JK·$ÔµÈ[YÞbNœPÍ"eI ©3áT·RD¶R4·’ +J÷¥%u©@«RP*ƒømƒ’\”ð†*|{B Òò]ÕQè)ŒaPQ7;ÑÊŽºÅ¨}Ýø¹”%¢nRñ¨›Ì¨›Ò¨Q£Œº5×@µ´Óâ6uÑõëׯ§~Ø°aýŒø"b‚¶ifK}:Ñ-:ōïÁi^(·¼[f°ôtÎêÉK†žšõ?)sϞ=ãË@䖃^¿ ª Ñ· +è¦g5 S·êØ¢S ˜‰¶5À>­j€‚š‘›šTƒfmDSÃÊñ[#ÆÁzͲ°Y«t¨] +öÜ%ÆÿuVøëƒÏõ!,)”ë>}úôd’Â,;˜a‘õý÷ß_a(m (í0”öë>ÿüóc¥w4ß|óÍE‚ÒU‚ÒG´Ä· J_ÒC—ÅJ?”þŒ¿ P*–¨¢¥ƒÒ½´-'hI Âý¬cVN–˜©Ã ÜF¦,™îÞ½{Ó̔%ÒÒ{¤¥ó¤¥wìLð&-½å,î!-mw±— ii• % %öÒõÂxMóÁZMôÁPñ1ÅÈ+9ć‘ècHÜ”ã…!íMы¢§¿õr3™îÅ>.@V'¶ä€5ƶ{£ì¼q6Œï+Æ|¦ 4ß|èСÅ,—¾Ò„1Ú`dO°Âq+]Ø­¤eT‹¹öA·’¦¸[I)> Nu+ÉÅJv—À­=§º•¢´ç á8K’´ +Âݹsç*{Â]t‰fÆ7nÜ8Á”¥C~àž˜sçÎm#-­Ç#º"´´( ´4›´45·ilnØ0΂èÏY ¯g:gâî¶ÎÄÍnBdz5`ó»ýž®¦Ú䦪ìžX]ä²S ÒÙ99 ¿Å³ßb ëyc±…‹‰hB¯ó0,nìÔäì@½ #¨³`µf<Þnç¢€3ŠO‰¬ÃùÉZ¼ì²OŽ¤Á9K +ÞFIÁë,Éx¤BÃR„àÒ à·•¸ ; • ("˜„)ÄMtbA&9á`iL´$4ºÐÞ¢ü’ÐÔBI«A8QËûÁn%u\IÓºKA©T<þâ_ +”𛈺Y¹žƒ[¸ƒQ7Ñ× ;ŒºIÅ¢nÏɌº)"êÖ¶mۖ\tm¯^½^ãìàÎ|ÈÔÎáL[ȵ@ÇN°A³Nfx%Ï U:ƒÕ°gÀ/³˜O=“Åbf]òÒ÷îÝ;%æxbØÆ1åñ¿‘!†TƂþU±Jïê0¯Õ€îì\³]M²OMhÌfD¦&Õ¡6ÑßÔ  +E%üÖ°–6*‹õšÒMÕ";h›Šýu¢±éÎYØ91`Aþ“'OŽòÀMtÁ2Í°Ã/°Â˜a„×™`„·”öêGt¥SZ@Çy‚Ò‚Ò‡¥OJ_ÐM#ü=ëöüDPzX¢Òý@é! ÞQ¦_iè%ÑÒ_"R–tô¡èEʬóÝ"´Ä,AZÂe½ge‚· Lxš´tÌÁép¤¥Ýηß~{[–ØÎ-h ïōÍ‚Ó8 é`ポéc="Ó  irS_/ìjŠþÌñ`A7ɸ™‘ìÂfƒœ”°+JcíÌűá@Ó­8ä\ Pm‘§±Ü$JâÔ¶ž20PÅê Gõ ^éÆn%Âìõ°[é3M1·Ò÷JñIp¤¥{ÜJÅ;ÁEº•¢Ôí~´ ËQ²™ñÇì:sƒ)Kï;AKÜ ¥wHKÇ} ¥ƒ<‰»HK[ k@K¤¥üd<À3SðÕ±rš@¦.µ Û×ÂZׂblNфÜÔ°: Fƒjø_ý*•° Ay(îFŒç5˶­HdíR°ç.‰Pׯ3¤_,0”]ÐƸJSJsl°¿oX`W”6aÁÞ$( ('(¡·âAé‚ÒM‚Òm¦ IPú– Š¿Árþ) +(…ÜJ… ôûR4Z +…‘…6>"e©-±Hu–Øáƒ)KŸÙÍtçΝIKWIK—¬œgãt8AKvÐÒÒÒ® -±Y°‹ \Ýì´ááü}îølŽjxLãˆL£‰LÉLC™Ë4È ‹=b€—xäKºÙvÏÅZ.< #œýèÀþ&”¦ÚqŒ™6m>»ð-¶à V˜q.ëE‡Óŋw±ÖÕA3¡…[‰Édç™Lö¾p+i#ÜJ¼ÅÝJ¿q+áþýU.™[)Z­«τ+RŽ²H3c„cÝ»HYÂvɅK8ëÁS÷6ié°´´/´´#½‘´´2‘…QIKâí™F7éø4Ü°é¸u8u¡W&†¢K´-«·6˯Ÿây‘Üô4k±ÖÉ +Uˀ¨È¾AeR!ÒS°49 ëų}L<¶õÆb/.f:˜¡fãH[Ü8É V6Øñ–ém(/˜ÖŒҘð‚i 8?E°Qt7™-ûd-¾Id .ARÀ»’‚¯“ ñ˜…®R’„àŸEד¸™„G@’°«F¼‚Ü$œN™D°Nx™D`N8˜"hIDâDޒÈòsâD¡Û… +WÝJ"[IXúYL‚ª9"þ¦ö”zôùo¥ T*WñÛ¥””¹8()ÅAI˗I%#ÿ4s5J…Q7ýű|ÁŠ¨T©REz˜«Ó×ü„üÜsÏ=+¢n2ξ‘‚+j¥àz;jzõêÕ];pàÀ>º‘#GÖCçŒä<áq¦yóæMa’çtlãlìà<÷–-[xÙÅ+@D”j~"û«‘Zæ¦CÍÍ̂fÍ+ ­7©<þ7¶ÄÈ*X0¸Vé[ÈÔ³&4a×Zô +ÕÆZ׆~nNdjB/SCæêW‡xµ*þ|µDý +XÚ°,Vn’…m[d`/mS±ÓNIPáÝ㡽û°Ìß`Tóh7Ð`+ Íä|°|+@i¹&k=Ai»flAéíïiÚß ´¿Wh?$(}JPºCûû5Aé{‚R(þó)•þB«û°øÛÿ÷ÿWñ ï")KJ±”¥-¦,©´ôuZºaæt8ÒÒEÒÒ»‚–l¸GHKûïOK, Íä¥Ù Çåy1ȓ™Á4žÈ”Ë4¦‘D¦a^]§L1HÉ#<Ä #%AÉIPrÁ¦80x3ìÄiEì0S`\c†ÑÜÄêéoš€µûŒt+„[‰gõt+éÂn%bí'ôÿ…ÜJŒFq+a´þDZ*âV’£¹•J„{ÀL¸b)KßOYºeÃ#uƒ´tÅ Ì»è-ñ°¼x(Ü0܇çt}žØ夥EÉxIf§à¡ž’†g|l:þaxËúenݺõu%딅¡hÅ©¡Y¸ãõÈMÏgRÇ]­ ˆªÌ/Ÿ†ß²R±4-ë%±¾Y xøã02V³w±j»Ý‡Ý[‚5»0(áo£ò2A„L´$"q"oIdy‹9qjNT§TÝJBg‹KbÜSO=ÒÏjZw´ø[I•TZŠ˜ðV +J¥â±¿aPJLL¼”¼^oQP‚0P¨ $¢n¾`n¾`E‹dff¦ó@eÕ¨Oè)ù…^x^®_¿~=™Q7voƗ]ØÑ©§vȐ!ýu¹¹¹Ãô“'OÎ5Κ5k¢)??š¨³lлóÐRùü]äeÕç4úqЬ‹¡Ò¦0Œ 7' êuFYˆ) ÆWÂo£ª@渚Uú׀îU“A³ZضcmØé6¤¥µa¬›ÐËÔ°&wýê¯V£`~Ó«ÌtjPj³q66k–C¶NÅþ:$áÝâ¡Ì{Å@d{Òì;ž ”GPšOPZJPZCPÚBPÚ­‡-;¤ƒU;©…};KPz ta[%»Ë°Îw¥~Eü-”´T‚o%"e‰ ÞaZú´ô¸ðµàœGZúجˆ¤%+»Ã§¥¤¥-N˜èõ.Üĕ,j¾„ÉKù´œsŽ›NÓdºÆ3&7†UFù`pGÐÕ4ŒùüC)†ðÏ¡2’« wsÊ;q:ׅŒw”&;خ؁ÝÏa+¾|ãoV|%ûñm0cȶѭ´[¸•Œt+XïšÅÎëéVÒ±0¹–¨å¥2÷¥F¸•ˆ¤¥IK¿p´Šº• +i©Än¥–£ŒHYúš´tǂ³ºNYºîÀ9¿OZ:ïÆuœö‚–Ž‘–’–vÅâz·ÄŸ;wnmÛeIàƒü¼$3SñdObd97ÿN!í“ HèÎÊd²8I”¥2eãf¿ÌêbÏžždœ®fDe¦„—KÂL–Me1ðÖgMÀxø˜TèŽÁNl hc¡- GßäÄqœÞ†7JgÅ¥5cx4L&Óq¦ ++:(:œ¸¬öÈZÃqsè`šNÓf0M 2õÁêŽ&2¤«i„æxxP‘<,Éî ƒ™z¼ †y’ô5Íޝå`ü͎Á{ÃÆ´nšãµì5³Ù¬º•`C¯_¿~Òv+1Zz•NÀéü„Cö9Ùö®F¸•x7„ûY)Ìíþ7ÒR·’ü¿„S{­P˜²ô•CñiéSÒÒM;û㐖.»0ç< ¥S^ ÅQ?˜a ÛêÄa(6‘–V'âÙ]’Œ×e~ +îËô4Ü¡ /ÌÀ]”É‚aYxóºfa<Úec<š³^Fƒl ÊKô7=CQ'¢zDÅt,(ÃäðôŒB2û§Ä'bxìÊ‹ºøþ:|s++µš™¿frâ ,ת·bPtœšÖ<Ò/]º¤0ë^áEY‡§Ifÿ™me .KR@‚’‚!“d!ðè…$ +®'q ۆŠ¤%a÷!dÂqCÑ9á`Š %‰yK"Ë[̉A8QoIu+‰Î'Bý‹’bœ¨D©ÆßDÊjÕª…æ¿EKTú_%á*¥RñÛÿÿƒ’˜_QPÂ;£ ‚^!ÉHOa –Ú¹ž‹[xé%Žá»•À¦2êV¤(O£Ïê¨+7nܸ‘ܺuë– +®²£Ò«W¯šöՎ9rˆn„ £õÓ§OŸh˜?~«ªÌ¶¬Zµj vpsN–¸`ó–yaM Xä± :lY(Hhù7Ò`ødZ攅˜^br%ü6¶*–Ž¨›<°&rN- N÷Ú°ë€–ÚÖÁ®ZÖ25¥ƒ©!crõkBÔcBÓ+Uñ[½J¯VÀz ˜ýԘá½æô_µIÁN;&â@Ýã Ûsбƒ J£Üл“J3 Jù¥Ó'Ÿ|²Þˆ¯üízX°}:ز#ôQœ"(çÔ·+¥ JŸ”¾(û‘ $âo.ûû#ƒÒý¼#i‰¾‘â´ôK˜–þ@ZúVf´œ¦¥k*-Y +iéDqZz3HK¬ébél¦z/a8.Ÿá¸9ôÎ`¤u*L‰Lã|Œ«‘‰a6¯*ðÛH–ŽöÀD!(s”\LTr2QÉÉø›øЎ£-c÷âÕVº•,¬ÀÎ|{Ll0kęgÐÓ¶ÌÕó:„»®ÃµÝJZÒ!ƒp_kŠ»•áV½Št+É¥è´$J8” n[’–>g‚÷'6 ŇvœîU'Nüié]ÒÒI.ëp|°7´´= ²!íÊ$<Ào$ãu™›Š7jZžñqŒ1ÏÄ]럅û×3‹ÓE³A™Õ%Ãò—_~YDHBpAPpeI”à&™„—I8˜TZ¾%‰yK"Ë[áDQoI¸•D-ï)S¦„JˆIpjZ·Ð㢥:ÿMhj¡¤…~V»åFTT*iFw)(•ŠÇZüAI. (A„@ ÿ3sˆº9uss3?wW¤(@Dz‹ðÔ^`Úúr‹-šÉ¸¬v +.¿›Ò·oßÍ°añGø(6Áœ ‡º™f€â™m\±bE¾yýúõ‹­0‹œ³Òm»Š}ÄVûÙ=Æu_+’¡Í +Ò ågB,(ƒÏÒÙåñ¿¼JX0¡ +HftuNK«‰-úՂÖëY;èZêºý ¥VOÀr6%25ª (ª_ âæ2½\‚Óæ^áºzÌoP›5Î(µHÃþÚ&c÷p´œ€Ý—½¶†zJc\P¹SìÐò³9q~Ai%Ai#AéM=,ØlÙ1º'Þa0ç"Aé*Aé#‚Ò§t+Ýaü-äV‚•ü)ìV*šÖýèñ·ÑÒ†iéÿD¡¥Ó&x ZÅ‚ÓႴ$Š0õ9LK¨´d-¤¥ãaZÚëÀ]´´ÙEj)BK°« ƒ´D‡LÓ¼L;òÁPM 2 #Ә 7ñô<¥j¼‡58©nŠÛæ¹ã34߉}ÃÁ.hvº•lx66ZñÐl·Ð­d†•|‹=úŽa9OYQ“µÞcîÝJ79n!·.úká¾×àFüHZúE)ÌíþwÒÒCÜJ¤¥Ô `Ãäp݀-©)Kì³lÅP|lǙ^'-½ïÂPœ÷`(N{ٞ™´t ´´+C±9p²&‘w’q#¤â–Ìàã=‘®ÓQŒ6ÊÂ]Ëát†nÙ”vÙ¸ÍÉM (^"<=CÏS}­Æ°]Åt¬W&[¤3W<9 {‰OÀÛˆÃÛãÁp»üx»ŒdåtQ³§atà„ œ  ³âíњñöhM8g ™U¡‡OaáV™=eÎL”ÙuFRðé!)àXIÆEG +‰ ‚‚ëá)™Dœ.‚–D$Nä-‰,o„T·’ÈVOÄ$8ÑUWÄßDµ¡ôÕùo¢Z·š¨$ +DËè~ôғ¥ T*kñ[¥øøø¢ ÒŠ((L– (a'Wöp³?~BéIÙÙٙ ¶—S‹0ÿ4ƒò/1<ßPnÕªUK¹S§NdܗîʀújFŒ1T3a„\íôéÓ'é nf xæW¯^½È¼qãÆeÖ;v¬ä$ïÕô¬eRÃ:Â^e¾6ŠvutûŠ4hÛ¥™‹Ê@Ì-1£LªˆSºnXMl1 Ô¯:ØA·' ú:<Åݚ´ÔŒ´Ôˆ´TŸLAPªŽÿÕ­ +ñr%,}¥Ö{µ,6k”…4K‡ªoMPꐀ½FPÊ!( ò”F”&: êgØ ê0ùÀ-¿Îý¼ ´—÷0ݧhpÏ1Qé}Æßn0þv‹ ô9ÝJ_”¾ Çß~ Çßþ÷¯¿"þV2ZŠHðÑÓp´ô³¶Øt8AK_§¥ƒ´St™´tŽ´tú!´Ä"Únæ]³cÜBƒfl'h)ÏGöáÄ©‰D¦ñE©PŒ Ä$§‰­˜ó”ç†)ŸÉ¬ñ¹."˜ºÔA,³ã‰Xo£[ÉÊô) Nh¿§v„úNҗñ®‘¥ ¼«záVâT?Ý·ß~r+ýøã!·îÆO ÂýQ¹7·ûþn¥ûÒÒýS– +«,ýQ®²ddʒ §ñ•CLY²a(>²ƒ®9—]Œ³ ÅÛ> ő®m_,hiG<®w#iiU€eq +žçy©x²óÒqsÆÓ:"ã1€õ7zfcP:gs*D6F¦)Å«„§ètú]þ¬•‰¥UÒqŸË§aå¬ÜìÔd¼j‰‰ØU,gŠúc±{wrúpH›·ÝÂä>]±F~aèù…¡ãC£e†Ÿ†Ÿ +ß…i~2GAfâ˜Ì2÷2 ^Ilf,±…¢$’\*q=IÀ“ŠL¸/÷ВˆÄ‰¼%‘å-‚p¢‚€p+©ÙJ¢ó‰è'ÒºEümäȑEç¿©‰Jj¡€§Ÿ~:zF÷ÿdê[)(•ŠÇU<. ¤)Jú" „?-\`ç«ëâkååkõ€ô$`(þYå_æ97–q­e\eg¹wïÞ=•Aƒ Ќ=z¸fÒ¤Iã´P2SuP7³õùƵk×.1oÙ²e…Fnµx'Çl-Äè°ßșfâ¡ÃÖ&ÁÌ®J…¶]žA-Ÿ ± ~›Ubj¬2®hiD ¨æAµ@K9u õ^{‚)F¤¥6¤¥æ¤¥Fu  ë3ƒé•ZÄ£¥jø³ne,}¹"Ö«W[4ÈƶMJ-R°Óv‰8F—8­gšµ?{m wCߏ#(M#(Í%(-&(­6B+o¦ªßÅ8ÎAÆßN0Qé]ÜKt+}ÀB7éVºMPúRiÝ°ºÑÒºKàVz(=*-ýõ~´ôƒZ< LKŸ±0å­0-] %z Ž‘–Þb´EÐÒ'Ó«-¹‹Ó’—mÊHK³| ¤ù˜{Ddš$L~"“_æ +ÅŸ%Õd»ã¤ºnf?1k| ;]ìd·\´ÆŽÇb“ ßnÅã³Ç‚zË Syœ‘ŸÓ §Cã=¦ã_ãàÝäàÝ&åÞѺ•¾ »•Dn÷Ÿ”{s»ƒ $—Ì­tZÒÞ[eé'†â¤¥oIKÁ”%+ž«OHK:pºWIK—ܸ„w½Š“~ Å¡ ÅÒÒ¶x\ïúÄ˗/¯HÆ=X”lœ†·l +ô1xä‡fâáïË,½îÙx5:™Zr.h#Š—)žeÑ×'3± Ãv•X¶£l*^œ ιHá»xúc˜×çÁ1\þ .8¼8®Õ30;q.FÎÊ`»y󦞵ßu¬Ô¥5âÒp Šˆ£ð3CæȌ^Ë|…$%“˜ð'ÉŅ$—J\/ÈM™„—)‚–D$Nä-‰,o„n%QoId+‰ZÞbœÕ&Ožšÿ‘¨ÔºukIjܸqHg«ÝBI‹Ò“êÔ·ˆÝ”ââ)AFw)(•ŠÇKü¶AI)Jx/µä!]” Œ"êf-Jqqq>nJOÂ۝îY¢¦'=Åô¤çy’õžo*ãbÚʸޮrŸ>}z+C‡¤Œ3f”†Q7íœ9s¦³eø\ýŠ+7lØP`‚¹[ÅÖ¦ëlP¾iÕ6»¡h7û ´6óctád?‚צBۮ̦,͆XXΩÈ2ÙU°Ê„jXyT ¨æÁµ°mŸ:Ðü=žÀ®:? íÝöI¨ÿO2¤FZª_G€ñ¨&ÄK,-ðRˆº¥WÊa‹W J2°—füînMŸVGÎ!êÎJ5}|Púƒ=Pú£©ô'Ù¡ôgYa”’–”6Pßïà7ñ>‚ÒQªúÓ¥ ¥+Œ¿}HP +¥u‹¿Es+=zZ÷‡ÅhéÞïÈâšpñ­Z<@ÐçÑ¡%\ï gñ\"-%-b-ïcöBZÚS„–è1$-­ð§%ŸJK`Ÿ©~úŒüÌ`"-Môr“ð7M¢çi2j*½QÓY|6ãyó™5¾ÈS¾Ì‰Q]å`½NºÚjc +«°­ñ3ÝJ¦7n¼kÄ9_dî +½7è¼Ecý9ƒpwµ¼oHKÐw+)År»ÿ…–âV*IÊŽ5eɂ³úŒ´tˎÇìiéŠ CqÁƒ¡xLJ‹9NZ:HZÚ‡¡Ø’€Çvmàeɸ Ré™%-MÌÀxŒÊÄ;3ˆE8zgá®uËfš_6^’fä¦ú/Òéôt~«¥Õ˜éT! /X6ç>¤1a<‰íâøãÅêaåp'?.l|\X\@S“hj´ããBoÅDžŽír´,¯a) +EÛ®èÈHtéÉ$U™oL§¬ÄWH¢gV’UÁß$!¸Jd^&•–D$Nä-‰,o„n%‘Û-²•D-o5þ&ª,Y²$4ÿM”U‰JC†  + +>"£[¨k¡©ÿÇSߢÑR)(•ŠÇKü–@);;[Ž +JxSŠ‚DQPŸV¾Q¾º¡ô¤¤¤$‘ž”Ä7*DÑғ^éI Ï7gzR{÷à5¹_¿~}”áÇUƏŸ«É˲¬7oÞLÔÍ=ÏæM›V˜`äÖZ`7²Xàf~ùouC]oc³mœd¶5Ê|s"ÙúfY¤C,ςx£,ļ +X0£2tñ¤jX9·TóÐZœÉ_ñõ' ³»< Õ׎´Ô’´Ô„¾¥Ìò®W›dT“ŒTâŪXðë2Õ-•ë•Áf 2±ƒ&L"o™ŒjÏéC]cqB½ØtAi„ ¶g<3ºó˜Ñ=Ÿ‰JKMÐÅk˜¨´…¶v7mí!~Ÿdüí,UýejùkŒ¿}LP +¦uKiÝ°— +‚ÒƒÒºKJÑi {ùgd‚÷ýŠ„ié§(´t‡´t›´ôq˜–®DÒ}K¤¥ƒҒ“´äbEÈZò²lV–;³}¬&égòii +iIE¦ƒ’OÔÀʳ˜ó4—ñ¼|QĉÅ/—;1´kÐMv< Ûm8ƒ=Vvøµ°{{Ÿ6±G ƒpï0‚ׄ»I×Ƨ Â}A‹ý•ýƒp?hÁ­T”¤ÂÛþÏ(n%•–²THKߙ@K_›wHK·m ¹›¤¥kNœó{nœý9ÒÒ)ÒÒцb,†âÍx\ê¦D<»«HKKRð<ÏcX;/zHK#HKý|»Ö™³Z™šPÔ£¿éyŠ§2± fV©ÌäðrœûÉ‰)‰ØUBvÃ÷×Ç¢án?î³Ã‹çÀêÆëbvâu1Ùñºl¸Ùz ÐTÇ~ÌZ>H®CÑ㊉·]&¤Ê¼÷?3$FA%¹¸¸@â*Ad^&AK·$"q"ß[L‘SÝJ"[IT§µ¼EüMô‰]u×®]{O¢Òرc‹ft -߶mÛPGQz2bêÛÿ"(©¿•‚R©xlÄo”;÷€^J +#…ˆºÙ¸ÔÉõBéIx£¢¥'U‰–ž$¦'u”{öìùº¨™ôFÍao§×½Á"NËXÎi•(ƒé`ùp;ÝJœ§¾ßŠ±<ÌéW'Ùàø]¶£¹hn%\‚êVúL³ý%]!·¯$n¥ˆø›¥ÒRD‚÷_‹ÓR0eÉ R– +ié+ÒÒVœÚ§¤¥8ÝHK—HKg½‘“~ Éá\ÛÞ8<¬Ûã1ë1+’qù‹è­MZšBZ“G~(¿ú–ºgcd:™ZP4Ìâ×Å3ŒÓ=Áü¦jÌtª˜Š-Ê0RÎéuIü®ˆãëâÁ1<ì³âdUL»ƒÅ…ÇÂäÀ}6 +P²âLufœ³Ö„³×ðiRáUtô#iÉHZœÆ &*rÂÂN´ôÑG3¬P¾ ÈË[ÇøÛ6Æßö0þv˜ñ··ƒiÝPáïñÃøz‘´n˜À¢n%È¢n¥biÝ%p+E¥G¢¥¿‡K-ý¥8-ýIK,LIZú‚öíSÒÒMÒÒuÆSÞ/BK0J‚–Ž–8X0»-±@¤ %/i‰å +ƒ´ä/¤¥™BZšFZšJPÈ$þ'~Ëóc© *ፚÇêÐ =¢6øáÇWpÊÝZ–*ØäÀ¨n·c@÷ØèV²âi:fÁ©6ʟ3± °¼{ŽÁT·’.­„{ð3iéO¢d€RX2 $n¥pôþ)Kšˆ”%ìùÏáïȔ% ÎêsÒÒ-;³¤¥+.PÁE.áŒ4r<Zz‹´´›´´%×»6 C±ŒÞÚ¤¥¤¥‰Q™¸CY·¬«¼v!2µ¥hÊÀÜ«/dâÏß1µ©V:¯JV.—‚O”LάKeE‚„xÜݾľ^]7AÉAP²”Ì%“O‰ÁŠçEOPҙpŸµF\‚Æ @ —¥ð1“µx]d:òdÞq)(ð8J²*ø›¤Ò’ð-©‘8„n%1Nd+EÄßDµ1ÿM$*á¹ + +P3ºEE%ÑÿMú&ô½Z£[%Ñ̤F+¦t_PŠæV*¥RñŠÇ”4aPÒA "JøŸ• ìü¼)šž”ššª¦'e‡Ó“ª«Õ“Ôô$^G[^j7¦'åÈC‡¬Œ;6W™:uêdÍܹsgj/^œ¯]µjÕ2ݦM›V`Õ6aƶšaÁv°éÄ.ÆDö8¡©÷r†Ì^&íf•áLBݞm¶9b]&ÄÊ2ømIy,_ ëͨU?©:T}nMèç!µ¡©ûÖÁþzЭԉ´Ô†n¥æ¤¥F¤¥W J/³ÞÒK”XÚû…ª•°ÊKå±òËe°Ù«4™ÄÑ<§Ö6 Ô™M"^÷øöcÒÅ0ÆßÆ2Qi*•æ 3þ¶Šfv;é”8H·Òq‚ÒÆß.1þöAé£pZ÷‚’šÖýèÕJJ%§¥hÅX;ZSXjéÇ -‰RK ¥»AZ‚¥Si隠% nÉ'Ï°BçI;iɁûwÀÉ®µ. Ù67nñF»´y ii‰ %?i)À$í@!-Mg£Œ¼ TZú›JKÁ œš²4øބQøƌ§éKÒÒmÎïc;ÎôºOÝ{n<ç½@ƒÓ> ßÑ p,.ðÍx\êÆD Å*ÒÒbÒÒÜ4¼BÓÒñ #- ãÃß/¯PzW;™Z’–ĬЗ¢{6⠂Ru©+¦bË”Ò JI ߸8Œt w×ÃÊáNÖ·»ñ¦Xœ… d´”,¸Å:³%AF"ŸJ²*ø›$D-©n%‘­OD³8‘¨„$T(@Íè…ºEÿ7uêۈ#B5ºÕj3QLI%µ˜R)(•‚Òÿ‹â7 JJqPÒ…t„"JF +s”\Å͕}Ü,–/“šžT†éI•¢UOéI¼˜ö¼üîLOê+ãSk˜<~üø±ÊôéÓ§*óçϟ£Yºté"íš5k–ë¶lÙ²Vs·Ùe´ÝLÙÅ6¦{9'i¿“á7 Òc³/ÙE¶3‘óvR!6fàÏÕÙX°¬”ïŠP󫀖¦TƒV[;V ª¾ì¯'ÝJ]JíèVjAZjLZªO·Òˬ·ôKT¾Pây‚Òó•±ôÅ +X¯nYlVÕ Ò¡þ›rNu+ªÿŽìñão9^œÁ`‚ÒhÆß&1þ6“Óxò[ÎøÛz‚ÒvÆßDZ÷ÆßN1þvžn¥÷»APRÝJ¡j0¸?üO«””–~E©%•–D©%ÒÒ7‚–ØP÷sÒÒ'ÌËýˆ u-½Çûrž´ôié{å&-íÒÛ²i µÆË6$>Ғ_Ðë# ZŠa€Îp ÓRA)$Jt:Í"PÍ¡#Jð1ñi)‹t­ðà[ëÂønbåðí,½‡ê²®ø1Ö58mÁù3Ô ·ÒÌíþȀaüT/ÜJ0¸_1·û;í¯w+ýó´T’”%=ž’Ÿ …P§ñié +NíSFá#hé½Ën€ÈY/Fá¤Wt8´´'´´-´´>C±<—¿0•Áì4fý‘–F“–³Êki©i©E3"S}‚Ò‹œñð{¦6Õ"(U¡ïµ<ߔ,NÁH%(%ÄáM‰!(ùJn‚’ûks”Ìœ•‰ d (é(™ +AI%…Ïš¬-%Y0ÑT’U¡Ò’ê[A8áVR³•Ô´nQ-@MT…DF÷ÁƒC…ºñašú¶hÑ"Iš5kÖ=5„!j]SRA)ZÕÉû‚R´òÜ¥ T*þEÄo”ä" ”šš%¼zŠ¢ƒþ´q#˜ž„•ý|™â¸—dî/#˜ž$š»Õ©S§–hîLOjȳdzëˆt”DzôFd„ ]2^ÁçWž’ŸŸ?O³|ùò%ÚuëÖ­ÔmÛ¶mƒl«&p'ۈïeÓý6¨æƒ ȼÅr+oy¡½`·öq¶ÎîDhô)[Òñçº,ˆe±Ê çVf›ÚjÐòãkÀ捬œXZ¯÷Ðòݞ„oOZjEPjBPj@Pz%”ªQTaT¡"Ö{± ÁËÙض~öÒ8ûkÁRíâqŒ.̼èIšÀD¥áŒ¿cümãoóèVZBÄjú#63þ¶‹ ôão'èVz·¸[é&A)T-àWº•”J@KÿQœ–þY˜’}É¢Ðҗ,ãý¹±-}À)àEi 7,HKNöasážîtãØêaß/îýjiÉÏê”~–F +–b +ii– ¥XÑôâbii&1jvëÍóÓ­DÒZìÃ^ +¼Øßjö¼U +¶²ºÓNÎÅÛÏYy‡YÍà¤WQ·N\¸•>VÝJºº•”Gq+=–"S–´…´ôçpÊÒO¤¥?–¾eÊÒ] ÎêsҒÂ}èÀ(\qa.0÷ŽÏäñžÎƒ±€„]q –Í ¸Þ5Ix–’–æ¥âÌ#-'- -õ'-½NS'"S+f05¦x™Œô,œ¥¥J¥2|SÒ JÉñ߸Xì>ÀzáöYq”ì%‹%;NÍhÅI +PÒ”´F‚’! J:”pÑE@)-q+©ÙJ"þ&@)"Q Ob¨P€Èè•Ô©o”V­Zª @IôÈÍL¢’ZuòÁå¹KÐǤ”JÅ¿ˆǿRFFƃAÉ@a¤°„AI¤'yø¡ 7*ž{IዝÉ÷¨<ӓªªÍÝxV/³fHcViÍkë,‰ô¤Aø'=z”ð÷%@ìJ†Ø–±1 V—Á*KËÃÖ.¨û6£*¶Tªy4ÝJCjCëõy{îþ$TxG‚Rkº•š‘–’–ê”êÖ&(±OÜóŒ¿=GPzžív_`ãݺe`êÑB4dmðfŒ¿µfü­#óÌ»3þևñ·!t+å2þ6™ñ·Yœÿ¶ñ·Œ¿m [iãoû;J·Òi¥Ð­t%ìVú„ ô…$ÜJ°ƒßݯZÀƒÝJ%Hëþ¿BK?„i)Tj vú3¦¼e‚ üÐLZ²à–\&Jžcõ©Ó¬;x܁á>¤%ö¯uÃÌn!-­÷²°¶ïèÑ£þC‡-–b8÷?†­ucIK±à¡™Š‹™\0›,5—»lö£x"ûi%#{k=t+qÞÝ'ÝJü Ÿ¿cV è)Õ­ÄjˆU·®(ª[Ióèn¥0(•€–"R–t…)K¿–¢á> áp¦jpŠ)KG˜²´/̺#—ºA¸¤¥E)¸³IKSHK¹¤¥!¤¥>¤¥×ø.´'-5Ïß/rÆÃï)j”ª”Ê'”²¿©¥¶S‰áwÏ‡£¹½8®Ã3°:q.æ0(,”pÎ*(iô… ¤¨ Ä °%ÜlI"LK’ %áVŠˆ¿©‰JÝ”D¡nJ¢£‰h”+j¨ ¤S 4pàÀPÕI¡Ö…J¢ÌÙÚbVÔ1'g“{`CR©f˜ƒñ°«{“˜[‘ʏà ,X[«,/•U‚‚Ÿ]ºnJuðËؚÐÏÃjCëõ£[éuº•:ӭԖ Ôœ Ôˆ ôêLÜ&(½H·Òót+=W¿=W«<_¡Æß^΂ ¨ÏAiZ²D;Æߺ2þ֋ñ·n€ÒÆßÆ3þ–Çùoó[J »†% ·0þ¶;ìV:ÉøÛ»¥ËLë¾VÄ­-áViÝÿ÷ÜJ ¥p©¥(´tO©¥BZú.\˜òNZ‚¾afaJ îË%ÒÒY‹ØYjɉ›ø–‹…)Ùìb‡‡¥–¼²õ,Ó¾ŠV ¤¥<9 cIK±¤¥8Öˆ#-ŏTAZšMZî'V IKÂ9µÜG·Ã{èÛʹ–;™·ŸÍ"n%¶°»`ƙ^!ôÞ0žl [I¯º•p©ß3ÓøÇGv+ýóþ´ôД¥¿–î ÂaŠápjA¸K ½˔¥ ½ŠÜná¶2ei-ƒpË8obS–¦3Á{BÞ£‘éœLJZêIïjgNqhMјâ2ÒsLä{’ Tƒ/I%‚R‚R:»Í%³“J\ ÞÕ?~<^ÒéÆÁmNœ†Å2Ùð€,xTôÿ{ç/E•­í'çœ#9㌊A” Š¢**FTÌbÌ É’%çœsFrΈ æ8:yî½s¿ùÞgWwu8} ×»ÿØ?èP§ºªkí§Þõîµâô£‰ŒÑэ83P²i©|Pò•Œ£ÛtÐõ-}3 djø@iêÔ©žbJC‡-SuÒJ¦&>P2}L ¥ßâðë%· J‘\.Q~ ¤y@I¯¦ò>Ÿ=©ë¨ +­‰=©>ö¤¦üñ‹È½_Fþjv÷:ÖzÜÂ÷íÆBÙX2û¸óùçŸÎùꫯ¾âìß¿?×ðáǺƍ7Æ=mÚ´‰Š>3"u[?7JH²(FáuY¬ÔÊxAǪD͗«“5G­¦ÜÊ*âéŠl‘ÇÒ< Y²S‚·¢šf°‰5õ–Ñuôæ¡õàßi¨X÷ê9ÚÊ M5Ý=u®&\“»Yévd%“»Zj -µ”ŒQɔĐ•š“»¼Ž>q%ù·VÌג»Ž¬ÂMäߺ»‹üÛ`‘{–üÛKÈJo‘Lþm4²Ò$VOYi¡%+i"XOþm+ù·Ý€ÒÁ_DVú׿þ”΀–þV-•Zú$ÚВ¯x€&ÃýÐÒn ÞÛY‡·6™â)HÕɛ—N©¥ šžP¦}|e¼³—/_><‡ŠÛ¹tÕ͝?~ÿ¾af]ªBéZúÕÔ^‘« º¤@ÿš_LX¯ª¦ÔP„[[qwx=}l`Cø7k+}›*4?(õ οiF4ù·ö€Ò5€RËóY憬tù·æMôßK (‘»ŒüÛäß®"çКü[;òo7»…üÛäßî%ÿö0ù·§èÎÐYé5 9"†ãGþm²’©°”ü›‘•Þ7²’Ó++yŠPze¥Ï-Y) ZÀYËJ†‘‚†Ši)Är¸`Z +(Liˆ ,µ„Áûd ÅbYGñ€x–Ã%°Žcµ‘ªkh¶‡Ú¢4ý"æ¦ë8ÏÈÐaŸœ¥³0.›Îm9úå Ï]¼xñ\JJæé×ôN>…“ò¡¥|/-y@ Zꗧ· @ƒLîî]²xÆýd|PÆ5-Mh6žrã._†¶¹šŸãƯ¬´‹s¹¿BYÉr+¹Y)ˆ–*NÂé,%á>EVúÈ^ w˜•pûHÂí ÷>²ÒVÂ-% 7$Üt’pã©0‚•p©²ôz‰ŽFhé)héa@©;«º2Ü#µeh (5gÕۅ€RS.’€R-ŒJUqtáèÎ蔅Q)£R +F¥DŒJñIúYÄP"ÿ…Q)PŠˆ”¢¥H}7—Jƨdh < +ο…2*GwÐÒ7_ÓúÍWLÉWu²bP2}L ¥ððk%S¿,(¹,PÒUá¥üüü +@I¯¦aOÊžäñqתU«Z`™ÉsC•™$5“ -@Kؓ +H½JfèFõ‡–Œ5„Þðld¥,ӅY)Y) Y «Ôâdd¥$틟¬Ä¹ÜK1ÍC4¸;¬uzYÉU‘¬Je$½Šh©2I¸xïJ¸c$á<Þn‘ÂV’pX ·2K_k²Òld¥É$áƐ„Z$fíWŒ¬DïçJõ“¬ +¥7¸_èÝb*gà㾆](ýžú¬çJ¸Hêè³Õ¥ŒJ•rÈ©g¤ë˜¦¦êì'aTJÀ¨‡Q)Æ%“ӎ—É¿Ù äþÅ@iìرþ ôÒK/ýL TngÜ0(…‡ëáWJÎòAI䥼¼¼h®™†8†DžKáÕt.Ýl>æñq뚮ΖËø¸M™Iãã¦Ì$_ë6|Ü÷:zêáèÕ«×3N…‘ +(o9Z»ÆŒ3Ê5eʔ‰nMY3ܚ£æEI–D*¼®ˆVlZ£€¼ž®[±ÐnBbx?E”± »§iYµ–ÁÊ< K 1¡–èÕYÕÛ'×Ô û^}lX}m ?²Òkçh{½ýòoŠÙ÷ž&ÿFQ ”4\zŽ‘•ôê¥äß.#ÿvù·«È9´&ÿ֎ü[Gòo©?yù·û•!ÿö4¬×‡üÛëq^Yiù·ñÈJÓ-YI7øː•Öº¼²ÒN§)B©ØÊ-BY®¬ô?åËJå‚ÒÐÒéŠøhÉ^Ç"ïÏXî}ŠR‚R}ù(åÆëì¡Û׎D ÞÐÒzúç­ÂÏ¿„2ó3tœgeêäMͲ”­3ó^.ÍnóDKïæÑÒ-_´4 Z”Þ¶@)`0z“a©$ëcrz7Y)Y)˖•0‘›Åw–¬”(+ÅW(+Ež¬db¨ü›_…+g-Y¤êú§¿eéïÐRÅ+á># wŠ$œÏÛmd¥$á6“„[‹·{²Ò|ÊQN§åxŠw ÕÉ@Z¼^Œ¬T‚¬Dw¸‡¹ºCK]Á£«˜U¡Z2\ +(]H1¥&€R}@©VžÎeU@©ˆ’y™ºH²È¿¥aTJÁ¨”˜tòäÉxòo±•¢1*E•Ü¶QÉhTrž(™ݕ%ÓÇĀ’iø +”Lg\Jºy ƒR”ÂÃ(Å2Äû’.¡ ”<>nm¯WwûÒr}Ü´>z”&HÏ:^y啗ï¼óN?ç°aÆ:dƸt_6Ù¥‰j–[÷ñ "„Ë"OWG)Š®‹QÝ« rs<}Üq®lIVàތaS†† YtbÈÕ¿–hXT¬WçTQŒVC±}|mź‘õ|!+½ÙXÛ{[w/d¥G‘•îGVºY©ù·KíüÛ¥äߚ“»œú“-È¿µb†hÃsòo¨?ٕü›‘•zóÈJÚ5#+õÃÖ=Yi ¶îÉÈJ³É¿-Âֽʖ•¶Ù²’oEþŸJVª”*¢¥3_÷½Yhð6–%hé8´t$ƒ7¾v“„Û–Dw8R—kñó¯HòDõÑy™¦© –¥l,K9:Gcr5—Èò”¿páÂAô,1´T-‚G¾ZêFõG~„eœNÆódÜOÆeüãÆInÉJ)¶¬D5ƒÍ ?Ÿ¬”Ê£%cY*7 gd¥?D“„³e¥O½ÝñvïIæmCVڈ¬´ŠÛ‘Åô„›M9ÊÉyÈJÈJ…ÈJEÈJ´Ñ}®Y Pº?R7Èè† ­©Ì}­O#ésiûӈ‹¤Úkõ\mª„ÝùTTʦ¢R¥'S)=™Dþ-!ћ‹Á¨dåߢɿ•Êäß ‚’3(™bJ¿PRðõL”~ Syxø €RݺuýAI×B(Eƒ’þ›Ä ©¼%ƒ7çØ>îR¶çóq7áï^hû¸M=nã㾙oéç㦠Òó´CzÕ9`À€þÎáÇsŽ?~¬kúôéS]šË渂EˆîΑ#GŽpNœ8q¼kæ̙Ó]ºŸçVZâV0Z!ÊX©Øù~´ÂæÖÅ«í¦p êšeîHÑô¹-íäɓ[25lÌÖ°6Õ:…zuQ‰Þ7§ªæ­©ÈJ㐕†×ӭꀆša_ÇÖÝ[÷ӀÒ#غï¥Z÷TëîlçßÚ]PQþí#+‘kNýÉËÉ¿µ`¹ÏÕÜO·¡ÿ[ú¿uÊÑDp²R÷t¯¬ô²ÒóÈJ¯`ëöÈJú +A²Òb[VÚ,+‰2~œ¬tæ tF´TÞr8w-ù¼ -‘„û˜6'èìuŒ$Ü!’p{9ç;é)¿%ËR*U–Ò¨²”¡Ó¸ ËR¶û´…‰¹X–ò°,åcY* n!–¥BêqѤˆ:J o›P£Œò4ˆŒÝPrw#r—,Y2&ǖ•2mY)͖•’Y瓕⍬Dm%d¥*)+P*#+”*N•£üsÄi½ÝVɀ$[VJEVJ·e%O̦&Çä\d¥|d¥Á"+ &žeIÛ£$×î”înf¸®XÃÕ —Ó÷w…zK3Úã6än¢6kªekSÅYÚh~†6Ÿ®3žJþ-Y×G’É¿%Øù·Xoþ-PŠο…’•Â ¥ððë~Ý áJ‚¢.Î8 ”ôßd^Hãªõ€’>[„»*WOm6ß0°÷ìÚ5ì®_=n|Üáã~Š’µ}(^ûõþ9G=Ê9iÒ¤‰ÎY³fÍpiRšïƒ,s+”®ŽPXÚ©ûËÍQŠí1Š˜;)…¼‹:;»‘’Ív¤jØF¡¼ÍYÔÎ¥L^]ZŒ¬TEŸ˜Q]±}"²’±un ðz [÷KغŸ%ÿöÕº@Vº Y© Màn‚–®”®½Àԟ$ÿvn@þ̀Ò%äß.%ÿvù·+ª{ù\Ã\ў‰àF&‚[‘•îÌÐß½[wO¼ÉÏ`ëî +DVòô6QÌ6²’ÕÛ$„¬T¦en9²Ò_¬¬ô¯Àát´ÄÌDK¼™ß¾‰ +aYŠÃ²¯£q0*K‰TYJ& —B•¥4ST‹$\&I¸,ê䐄ËÕ©˜§Ó3&_³ÚˆÁλ…X–Š°,‘„3´Tì¥%3˜çúÃRIÖ !m7,oñâÅ£r½²Ò$ÖØMËÔߘ“nËJ)FV¢¶'t›Ÿ¬D'8#+E‡’•tò¾g*7²’'ÿfd¥Êæßìó2 WYo·-+ÅÙ²R¢-+¥ +¥Ù²R&²59¦ç +ÑAhD>µ• +• +u4zӟäIîâ +¸ © xԑ¡M‘†…zî@éü|½ïœ<}¢Iê€Ri–¸¤0C‡3‡¹™ôÈM¥Gn2­ßè‘GG“˜Xòo1ååßü@ÉKKþ­ßBõ1 åQÒ Jú„A) Jáá?”\gJYؓò°'s9Wãꩃ»í<þøÅìK |Üm¨Çݑ/ӕqÑâRöÏ°nöEÒøo±Ddˆs̘1£S¦L™äÔ5Ë¥ùh¡Kб­(º6BasS¤ÔÖ(äÑ +–»)W³‡Ö`{ðù²bxwŠæÐé¶fR-/GÃÚ|M©+Šô¾E¥šWgWSlŸRS±ý½:Š»Ãê+[÷«ØºMY¥'­Yéd¥Û‘•n¾@síõ`놖®>ß^ÿfåß %+ÿ†¬Dÿ·æµ‘•È¿µ¨ê••Ú2a\¬t3¶îÛ2½²ÒCؒŸÀÖý<*Ä+غßAVz—jïE™Þ&š 愐•ü[极¬ô·!+ýëìh)h9œŸÁÛmÓR„]ÁÛX– ¥/˜ø>E+øˆÉð8I¸#& g9‰$ 7¦’„Ã%¿<ƒºY$á²IÂ咄Ë# —O®€$\!I¸"’pEX–Š¡¥b›–¬Ä´4€<Ýàd¥|d%ÌácXT7>[gz +Öñ™,¹30—¤ze¥õ2ØLBu'²Ò>d¥Ã–¬¤Óø?ÅÖmd¥ol[÷VþÍ++UÊÖ]vÝâÿ–Ÿ„;½¬(+%زR²-+¥!+e°ÎÈJÙÈJ9úÉ£¶R>²U‘^bÙ/òÎ=ɰ݇zt;xԉ¡=C+@é² JMóôæ€R-î&ªfaë΂å¥ëpf¥êL§§èúHI"ÿƵ/|‹5ù7p: +°Ž±Ý8Þ܁²’Ënkâ“ (9}u”* Jú]…A) Jáá7J%%%\’”¢-PÒǐÈs)`T:WO6ŸÈ·Aɳà­iÓ¦^xáùŽæ͛{¼iÿ< Þôµ< Þ}ôўêq;^փXҏ¨b|Üï9§N:Å©™iŽKSÑb—¦¶•n…×õn…ÜÍ +–Û#wEë&}/]H÷Qp?“æ>ÖÀìMVÄܝ¦aGÕò²õ܆<…¹Õ…zßÒEÖyUð¦×PlŸP[Qod]cë֖ßlhë>×غ)«t>e••n”ÚJ×J-Ïóæß.³òo,Y‰üÛ¥äß.«IÊP²Á­Y¶¬”ª=xY©*ċñ¦·‰öt¶î YiAYi×/*+…¥P´ä·.”eÉhY +LÂ}”„Óäe’p'™!"J°“pøù·¤°.$Vù¥™$á²IÂ各Ë# —O«“!ÎÈB’pEÔ (¦ÊR1–%CK%В (1Ñiɺ!¤í†å/Y²dTž&ȱ9:ݓpO·d%:Á±o¹‘•(‡ºÉÈJxé Õ´e¥T"ÿYésKVòæߌ¬T­ûÌA©ow¥e¥xÁY)ÉÈJ48I%·NßÜ úæfQÛ5›’ݹú)§ºvêl¿ÆB¶øÉ? ©Ptí…:`×3\[ áJ@éâ|]çJsõ±ºÙÚ@u’Ô%´s, EÓ2X皊51)Q»‘€Æ‹Úcòo,ˆ”",P +”•\>Y)”|•¹Ë-¥0(…‡ß( v*¥ø`PÒû< ¤«§Ä^ðV—¿Q‰o÷³àí1¼=ǂ·Wýû÷Ça|ÜãôpNŸ>}šS1g®S7ýK\š€V»67º,·FhÚÙ©Pµ'JÓÎ>˜d'$ŠŒösÃkú/ìJçÖ7KϽŸ«W×è}FVZˆ¬4 Yi2²Ò˜:ÆÖ­-÷khën¦¿Ûãë{*Ö$át Ž¢$`ªÜ九éóýTVÂQü|~ùÅY$árHÂ咄Ëg%\I¸B’pE$áŠIÂcY*–J¼´d €’!¨(Oƒ EUï`ëÆþ^®˜kBŽÎôÔ,Mš³Œ¬”®9t)µ0WQCܔúÚbÉJ =¿ØÃôÿ=(+ùõ6©¤­»Lþ­²´t&²R¬‘•tØ-Y)Qû¼‡Û‘m)ÔVBVZ™Ž¬”Im×,JvS%r4mSé­|€QŸ)Ðïþ‘úOJ·ÁH7ÁHíZæë¹æ€Ò…yغs°ugcëæn¢ +ä[˜®-çr~3Sô×Ґ“¸SŠ‹óæߢMþ-* ÿfÉJnÓÖÄGK†‘BRPeîr=JaP +ƒRxø%ge@I<͕k’þå%½šÁûr¸~ ؀YðVƒoõ¼5g‡Ì‚·ö.x{Í1@Lj#†;&L˜0Þ9cƌéNMY󝚀–¹‡Ö¸17¹5çm‹Ð å®H…È}Q +Z¢?V!ò±ø²Nø 7¼¦­çž4n}3©–—£W7äé}FVZbËJӐ•Æ#+ ZÀ@ªXÕº‘•L·Üžç*fßwk›‘•:J¬t>² ÔPºÂn”{icd%òo—Ô ”•°u·b]ôµ¤ ®Ë§%²R&‚»pÖ<JVŠ5²RY·R¬´Å–•üÚd¥Ê¼}–%¿$´”„£®I±"ü8&ÞøTö'›I8R3ij³bGwa6I¸\’py”£,ÐI[¨5ªˆ$\±WVT‚e P +¢%J‘¬Š¿i8¾ðÑÈJ㐕&g‹†gPÄin†~9‹•VPs-'ô}|úÛ¼É⃴g9hë¦:ù×!lÝ®²ÕºƒòoƒÒÿž‘¬DóÜ•¢CÈJ :얬”LÉnd¥5i”ìFVš›I'8úŽŒ¥É0–ø¿CU¤W)"öY‰ÚJ!d¥“q”ìNÐî WÙî$ö­)t‚KÕ7Z‘®Ã¾6B3©¤=‘šÚ£rôõ±Îÿ Vü÷á×þ4.¤‡Žº#!u:2´É£Z§çˆö|ÎÖ9€R½,¼˜ÎJ±Ÿ°¾1‡$kfù7üüI8û(´GÉ­˜_þ Y µòon[V²AÉé³'Pr†A) Já! J^PªU«Ö‚’.œL@)×%mÀS@[öT¸øâ‹/â²÷¯ `:¼éëßåx衇z8žÒÃÑGÇz8é᥇c’,x›åÔ,´Ð)ÊXéTØ\ïRŒÝâRˆÜéV”Ú¡€|0R°sf8­p}ŒèxÌäb¸á=‚ëô` +ݪÒé황W·æ(àmÌW(]]¤¨gd¥¹¶¬äW-YéõFT 8G÷é¦T ’•ÎGV‚–ÚÉJ€Òe6(]Ú ÈÖMJlÝ­Je¥œ²²Òc²Ò[±¦e®öyt8ñ§”•¨×üsÈJgDKÁI8w`.’ºI¸OcIÂQ‘ùCù«Ä°^|7•›·±4j‹¤Öà^ŽÍeÇy.jÅt&æÉ:ã +é [LÝbÊQ–„+õÑ™8™˜HŠn0²Ò»¸ÁGà Cáñ” ˜B香™:µóÈ¿-¡»ÊÊÛ֝hçß°Ö¦=ËÁù7lÝg™+”h©YIèOFVÒ7²ÒWFVŠÑ^ŠÕþùd¥}‰º¢v$³d‚«Óô]BG¶9ԆœB•È÷¨ùnE(‘N_Î¥e.yµGó°uEw€G73´gh•‹­Pº([7³¬`¬•­›eETÓÈc‘cËÓ¨§•Le­DÚÆqÏCÝ­èh;ÿf²’(ÙC” ~]ï”"C€R‚ Ji(é͹|ÌW –] Þ~Xàú•ž¦2@_*¼é2dÈ` Þ“õp̙3g¶SSÖb§¦UNEÌ .ÝPnuiºÛå8ìP¼:¡yæh”Y>¤@vœ®`ÇÉÅ|¯àv ×éádš §±P'C¯îÈÖlº9W3ÓºÅÓåÈJ •f†”•h×Y©‰WVzð\…ð»ÏÓ<Øõ<[V:Y PºPj(]Nþ­9ù·K2ԃ–êÐÛ¤&²Rµ²R®WVºƒÛæ{)dd¥§˜\{#+½†¬Ô?PVšJm¥ YiS°¬¤ðüGÉJ^Z:KPª¼e •Ä”„£Ý†„ûÞ$á¢HÂE“„CVú„®ñ'͉'ñzˆRÍû(Ú¼Yi õ ×S€g¥x–²„j>{óôԝ…‰–¬D®XÄ3¬D?½!¥¢¥A¥X–üh‰P";7˜<ÝPŒàÃ È¿å ”Æå’£jÓô¬€üÛòToþm“• °u›ü›ÇÖ­Ùùó +óo ™+Ǩ|ÄÏBVÒÿPú"FGü“Xñ©%+q•HԎïJÒ5¸%Y¿ÉuÆ_N‘T;šAߑñöÀÏ×st1õÎÕÅô$(ÔPº <º•áz,d×0\‰õþâl]çQà¡Q¦>VPªÎD 7ùÍNÖáÌH$ÿ– {ˆ$ÊkÅŸ±ÄJQÓH¤ºˆÛÖmhÉ@KP¢2€SoƒR”ÂC”Ê%]”b¸Râ,PÒ“¹VÓx‹¥< ”t%We{µ© А?dZáþžÝðo…«ïхðн¼ÊCé·=Æ1E ޜš{–8…« +–] +‘Û\‡=nÆnä#Š\Ç …ãQ +×ryÂX|ãã:=š„õ4•…:ézuW¦bg°¬Tꕕ¦"+5²R]ª4  ²Rod¥§Œ¬Ô 깊ãwJÏCV”ÚJ×J-É¿]ÙÄ++57 dåß4˜üÛåՍ¬¤ \¬Ô†Ú1XäӉI¤k¦WVzÐÈJIšlžEVz©—J£™4þK£`2ím0ÅŸ1ÀgÇ4©.""0ÿæÒà%þe‰IgJ¾&aP +ƒRxø÷%såU”"‚AICC(eY ¤ §˜ §Û«Ce€FT]BI_¦+•î¡î#„Œ^—#oPÞ%´¼Gçí©Ô·K拉NÍ8kœŠ“ï;·»÷º„ Ý +ÈG¥ã@‰(…ë“ÄēÖÊqÆ > ­çѺU¥éÕ½šŠ,Y)¯Yi"-sGÕ¡%²Ò[ÈJ/5V|~Y鱦Ší6CV:×ÈJÚ¿NçÙ²Ò¹ÈJͼ²ÒçhÖ½Œü[ó^Y©ym½ïrd¥+«é³-Ké¢NQ™öÈJQ::³BË'+=‚¹å©DŸ¬¤ìcd%í¸OVš¡¯U®¬tØOVÒÄw:YIC¥d¥Z:sY錒pq›¹ÛövûÉJ& ‡·‘ãƒljˆ–¬”ª©m Ù  LÛ«¬D"hKÏgc–™fd¥"¼ÝÅ:G£JHÂAKC¡¥Á-™Lœ™,P*ñ‚Ò°Â%K–Œ,ÐÇÞËәž«MM%ÿ6 PšŸaòo¬£!É¿m ‘ ¹þ­üü› Jù·Ê‚Rð)+4õÊJ_sÄ¿ˆ6²’öïWÙÑxlÝy;ò6sÄ×҇miÏyðé4ªDŽÃ$6ŒÜç;¬a{•lÚóäÕÏÁÖ una¸Žáj*ª_Nšßeé}ͨ²Þ0CŸ­Í‘¬Š@W wæÑé/‹Ã™ŽK>%žü*]<ð |FsLýAÉäß¼´d1R” ~]ï”t5úƒ’®Ë +@Ioö%]Óþ ä-¡Ô"¸„Ò}÷Ýç+¡ô¬UB‰V¸Žaz8ƍ7– 3p3À³Ì©´Ö©`´Ù)`ÙéÒ³Ï%R8(s+~¡v2RáÐL1§X u +‰á$‹™O$²¢9GEª^=®¨·;KóÑ6[VZe»•æT՝°OVfd¥úFVҝpïÆÈJMm4Å[ÑLÁ¼Û¹ÈJçjZìx®¨= t  Ô²©‘•J—7Ö`d¥æõêè-—Õқ¯@VºªJ¹²’Øìn#+an±d%úÑ{d%í©GVÒ4ë/+é»­@VZ,+i-+iêýe¥ò’pAuƒ’pÖÜÍJ8[Vúž¹û[æî¯9>gîþ‘ãs÷±D³úÑÈJ:LÛÓtÀÞ§÷ü:KVÒY]L{ŒyX‹g²kJ!Þî"’pÅ:Q#KH•bY +¤%ß0/ÓPË +2 „Q‰R–ã¥)9•˜èç‘[ŒQi:È:{ý›é¼³P:Táú·àú“®rêOV”Ê iˆ’Ý–¬šFxÑÔ'+}‰¬ô)húWÙøÃáÛC³møÃ6ÐYd%E⦟IÝ£‰¬=E¥†A¸²ß  +hŸlýڟB3z(º ® à ×ò\ ò—C›çePV m®.G²:] ÜY@۟géÌTTº$TºxŠ/ÄŸ”¢"}ù7hÉ%†rAÉ©¸ápè×ä%}·0(…A)<üæ@É J¥¥¥¡@)‘ÿ&óB:oÉæ͞JÚJu»„RcJ(yjM¶jÕê*J(µ¥„ÒM|£Û¥û(¡ô¨_ %’UBÉ1~üøqŽéznæx–;5Ù¬s²àÍ©°´Ó©µß¥pxØ¥ûÆÜ +Í'R>ŠôíûØê +¦IóTœÓÿüÃ$)zõPš"æ>d¥Ù + !e¥j²R=ø· +5BV:Gññ&¶¬ÔLûwÛ¹ÈJÐÒõ€R[@©5 t t tYChɀR]rrµé¥[CŸhQUŸm…¬t­‘•òd¥nX2îK5²’¦„§-YI»æ‘•³CËJú‚••>û?’•BÓRˆ¹»Þnæîo˜»¿Œñz»¬tܖ•öãÙ…wf«‘•2õZM‡ÕeÈJ Yˆ57ýt–¨O*ÂÛ],ZSb’p´d2qÆåm¸iH(Ú ”§ £Ò cTB Y”hTJ²ëOÆûêO•ôüŒJ~ù·rŒJ¡**…¥Šd¥„•,[w¤‘•´CŸ“ñ4Wه é2žûXv¸ƒe‡ïS+{ þ°%i˜C‘†)¬éÕýCÉ,¿M"í%Rj½‹zE÷G·3ÜĪÁv -9~ͱÅ_(5Á_ËWM@© +÷…Î\Rә¤3ÓPé’ã´ €R=õb€Ï¨ÈÀü›[<ä% N38̀; JaP +aP:(E‡¥?PªV­Z>•< Ô¨Q#_­ÉóƒkMjŸM­É;üjM>ÿüóÏ9^ՃZ“ý¥á€ÒxÇ = ôph¢ZáP°\(mq*&î”JG\ +ZÇ݊„'ÑPNE˜ÛpŵO­> +sÆuzŠþç'qT$k8šª·HWlߝ¥ø·-GQÔr+úÁYI~l-x?Y©¡|d¥§Ï ”•š)NÞÚLØsc3M×5] (µ”Z»¢´Ô€¡ž J5õæ+«écFVj],ZjKe™ëYt3K¢o³d%Íç=˜§qØsÈJ/ÇkÿŒ¬4$„¬´Ð’•tHüe%…ÿ Yéd¥/‚e% ¶e¥¿ÿR²Òÿ )+•M y”¼Ý¤„,Y)ÚÈJšø<²’I¼Ú²K²ö°$Ë#+éЭÃd¼2[Çt ËÖçÓvo²ÒÔ€$ÜhCK¥A´d*ÀHÔx—ur˖.] +”¦Cs2)Ô (£Ò˨¤™Ý¿P€vò'0*U”N'+f<­4ý ô ޗäßÌUv’Œç1Œô)’¾›jV[¨þ¸ŽjVË©9ŸÚÓÓô¥Ç³^m8Iå¬a{ €|PzáíA èNðè† ­©Hu9õ;Gµ…féäßÒÈ¿QɳªŠ¹*òÉ¿q8Ó¥TºDTºxàÓ?ÿF[“ښ¸Mþ Zò%ý×JåƒR”ÂC”*Jñ§¥(éê>‡ËåjM^ʾ´´jMPÒw»ƒZ“÷[µ&J¦Öä«v­ÉԚœà „’C÷ì šq (mp*0n”v;5»p)T”>”>r‹ +>‰0ÆÁϬö©¦|³Þ'4ª:• ÿžH¢[UŠÞr8Mño_†8’•rýd¥ÒYitmM©CêꏿÝ@¡ù冚îžk압z4UïÞY©ÙÚµko”n”ÚJ­¥–€Ò•€Òå (1Ôaa\-:ŸT×',Y©DÑöZz^]Gy™) s+ +¬¤Ö#+i‡ú +½§Yh²Òpd¥qQb½2²’ŽË&hi;´´—‰ÀOVrþêd¥²NcO%ŸÒÂÛí'+étgd%ãç×ù=B¥ŸýTúñÈJ:µ‘•Ö°v}9E~Q q.e£g@ªSŠH‹–LÎX–<ڒqySÆÛ0«ã†Ù 4Š"ßc +lPÊ %ÝiÆÑí-Ô½5Ñ8ºµWû㌣Û•| ä5*}‹•æ{Û¨²Q®³Gw Tšþ#0ãéW-#ýWÈJæ*;E‘ô㬠8LTÇßN‘ôI_•¬/¸ˆjG³¨{4‰ +a£ÿÁ¸²ßĻ՗ƒó4šÑÃ@QwZÀtaèÈІçZJ—Ðmø|šè5”ꦐK«”J€RuÏ3h§—ÊrÂ$?£R`þ PŠpÛ²’Ë;8]傒Ό”ÛaP +ƒRxø-€’®ÁJ€Rl… TÀgK)¡Tƒk¦^ (UP”û‰'ž0E¹_°Šr8p€]kr" 4ÓA %@i¥CqrƒCAu›S³Ë@é Sø˜KË —‚à)€àÓ&–7“¯øÂ*H¨¨÷…?‰§ÿB"e…-YIÁò ²ÒžL[VÊ ”•ª +U?|øð8d¥áu¨­TOñõÈJàŸnLƒÏ& +á÷Jw6U°ìÒT“ëMM5Kv”Ú°ôíj@é*òoWJ—×g¨ËP¿w ڟ +µ,-]ƒ¬ÔŽÉú†\#+) ßÆÍw÷4#+i<²’öÊÈJoÇj*‚·{4²Ò$’ped%œ-$áv¹‚d%M½ed%Í¿åÊJÿ]IY©² ’–*tÿ£Z2.ïaf Dåp†”ö6 ô^~9 ´òR(aAöwtÓÑäG9ºÏ”Ê7ÒÖgð³uG˜‡>[7w"äßNPöó(ÌöÓMf'²ß§Vöªf/eýþ\VòOeç{ƒwÓuõ”^&¥ö,rÑ£@Ñ}àÑí 2(«ÄÐ*ƒü[:ù·4òo©äßRÈ¿%“KÒF ÉJç²Ø!3^2-N<9֗Ó®ùåß"LþÍÈJú +e@I/8à¥ð¥J‚’†x(•””dpÍä”J¦(·§{IëÖ­[±PÒìFQnJ¦(÷ !ŠrOtPkPZäB¬”6Ú ´×©HxPúÀ¥‰ï$ ô1,ð)†œÏ‰Æû¥Õç3E,·¾qô_H ¬p’‚àñ½ï²Ò~#+áíÞbËJ¾Np3«R[©²R-[Vª¯)õd¥ç)D>qŽüCMÌïi¢`y{SÁÎ-€RǦÚùö€Òµ€R+@©EC…Ò+h¸Yérd¥+jbúFVºªŠhéjd¥6¤:°lý&–uAVº“ÄÍýÈJ=éG®-Y)ÖÈJšŒ¬4-RÔ7“ûéd%ÑÒ)KVÒüû딕‚¼Ý~JGDŲ65#+%ze¥ÈJ») ½ Yi6ÖÒicEŽñvko’p¬„+ôZ–|´d2q# 2QoÉ # #!&êÕ±ù:ñòt.Ë%ké›”¼KßÙ¥'OÚ ôE¹¥']•ž¬<(•s°Ë]qh +Y}K7s•}Š¬ô+(> ¿ÚA:­í¦çÚVª?®§äŠ$}Ë|ß$'àӁ!{"ÛkdÓ^”ž@8z(º<êÌЁ¡uºž»"ü Ô Pj(ÕN&ÿ–¤ ¢˜ "5+žü[ù·XòoÔ쏷ŒJäß"É¿EøòoA ¤ÿúƒ’Þ|† 4oÞ¼0(…A)<„Aɀ’>Q”¼ÝK.<³î%ƒ è+ÊmÒâŋ= ¤èh@i»S1Ö”œ”ÿ>q v>s³JˆÐ÷%¾²Jì˜IÓKKŸÆë…S‰Š„' ¥c²Òvd¥M¶¬´´Ø++M«†¬TS÷«#jk~XWÑñúŠò}*\÷j¤Àýè9Šã4ÝÜÕDój×&š%;5ÑÎ_(µ”®”Z6R(m(]Q¡æ¥Z€²ÒUU5·*Õg¯EËhµ¸#ùnamÐíÈJ÷0»¤cÈaªã屢Èvú‰l¤³È*zŒ,¦ÚÑlêMÂn7‹Ñ`\ÙoJ}É«=fô0PÔ=FA Úð\ @é’Tòo©äßRÈ¿JՓȿ%’ãÎ!‡U¡qäßbÉ¿Ñ2žz´±6(EE˜ü›®·ZrZòP¢2€%§ÎG”  T PÒså‚RP›7(]sÍ5WÓ½ÄJúªw:zôèa@éI ”Þxã×ƒº—8fϞm@i±ƒ¢Ü€Ò&‡ø`»Ã€’‚àa§ æ8 ô‘JŠfŸJ_r{h̯_Ó(ܤLë…/c迧ç>IЫAK& wZ2²Ò.[VZŸoËJ%t‚CVš\]Q~ ²ÒÐ:Šòýê)>¿Ú@‘ú…†Š“O6¢oÕ9Šè÷ž£ˆÙ Pºµ‰öþFhé:@©  ÔPj‰¬Ô¢>ÚR]h©69¹T^ªF”*úXëbM³m™¢¯§jq'KVÒº‹;ðû™bzbÎx†É¡¯%+‰æàí­}¥ˆî“•–ââZcËJ;*”•¾ +”•þ(+ýãÿTVr…0ÐËJÞ*ÒFVú̖•>$ w4IGãíî÷ +mO·½ÝY^o·/ gVÂͦ%Úq¦|ÏtÞÞ£«îXz Œ+Ðɛï“¦Q h&‹ß­Uo¸r–…J½ƒ’©Jfé›%}ËJ€Ò?Ï”*,dTÝÊ¿Epœ¹Ê¾ˆ"ÿÆ +ŠT0;J7Úô¥ÝI…ìÍÔÊ^KÕì¥I:ÎóXÉ?•¯?Ü7U‡¤_ù7”¢g¥G¢ûÀ£Û:1´O#ÿ–Fþ Pº0…ü T?Y‘¡& T%‘üw¹$¤3©aŸKþ-†üŽâ¨µÃòب;ÿV!(9à¥ð¥ÊƒRÏ¥†%]3gJ}úôéªÍ 4Û¥Õ6(í”öù’攏ˆaŸJ_ •|åöÎ)ߐøÆt££ç×1Ô‰ÕsŸÅëՏ¡%“„û€$Ü!’p{¬”í••Öxe¥y¥ +ŒÓ‘•Æ×PYKyP…È7ëi§^l (ÿlCÚ¡7RïÑXSj÷s4¥Þ~ŽæË[ÎÑôّòÜí¥k¥«¥–€R @éÊÚ 5IÌU§üRU*V–è³m˜˜¯Ë×ö:Rµ¸3­îÀÓq·áYI3ûó šã_AV꫃㑕´ã“HÂÍò“•ôד¡ÜʱÚmËJÇ ¥“!d¥?üªd¥ë²BÊJÈÖ9g·d%ŠjÙ²Òa[Vڕæóv›$–ì$œY DK“)µ4±P§g^Zú +Zú"N/| +-²d%Fãíö” ð68ِ§(¿²PQ~Q±¦±ÙU4›N©¦Ùô½šÚaµE(ýëîܹóµzŠÔ}н!å`)¢ßßXaó®Æš4»œ£oЉ†o×Jí¥k¥V –-[vU= -ê€Lµj«†ý»T»–EWí +´©LÃPêw%…s¥dHÕyԒ•4Côe†xYi I¸–¬¤½Ÿ©ï1ÏOVÒüû¾-+í³d%Ÿ^Vú×V øq²’¯Š´WVú6XVÒ,Lɀ½©>o·¯À’Y W––f²qùÐ)”ñžÌ™™DC݉ “ò5LÎÓsFòŠIs²¼ö¤%é¦à¤¶ìW€Uo¾òܖG)(õö €Ree¥àü[@Š¬ô9KM?¶óoGÈ¿í3ù7ú‰lâ ®bEÚbÖ¦Íf5Â$~»£SÈ¿! ½I6­/rÑÓ ÐÀRwð¨ CÇTòo€R‹½z1 t^2ù7@©n"ù·]’%Ü4äsӐM± º"¦Ä`T”â£È¿Ù JîJºœÃ ¥ððŸ JºüAI<ô³€Ò] ÔÇ”Fë”;ýAIñïˆSó›”>ciʗ”\ޕÔ&„Ç]¯©‘÷­IÈÄÐ=V/|¯·XI¸$ÍBÆÛí+`œ¼Oßܵùº]V$*›_¢è8£ª@dbu!ɨš +õƒk+N¾]W{ör}ͦÏ7Pô~¢¡‚ùC4UÞÛX3çõ nm¼jÕª¥€R[@é@© Ô².Ȅ¬tUM¤¦j8¿«ˆ–®)ÑgÛ"^tÈW¾‘X·Rm¦ežïe…ôÃÌ3O’xx!A;ôJ¼¢w¿XíäÐíîKVRlŸEn²ÒJKVRøß +-Yé ´ä'+AKFVúƖ•þBVú¯²ÒÎ¿…–•héld%»d@B€·{¿ííö%áÖgš•p^˒-Q3}´dºÃMË×ù˜Šàg y¦qŽ¦3Ìk=b’7붔u‹+Meî»àd¢ÝðÍ^õæ3sé]œðˀRˆãRVHÝ&ÿÆMˆ/ÿF‘Ì“ô = +ëàËìâkmæ ®¥ÆÑRÊBÎÃw=5t,£wqe÷K!ÿ–Jþ Pz(º<º¡C»=×Pjž¬{ Ô$I—A=@©fù·x]…\9,qÈd‰Cj F¥hqq‚Jù7·MK(é_fpUœN½Ïi’.!‡C›ò€’~%aP +ƒRxƒÒϯ(õ T”* JŽP ¤0÷ J`N1>Š?Xý¢YÖ -}§W­$\¢>q"¹¬·{[6 N•V5– +Í)ÕŸZU¡~\uíËðš +õk+H¿QW¡¾o}EÌ^ Çk¨°þ`#ÅÎîÄ9·7(ÝB÷ŽSºPj(µ”ZJ-kCK”ª£7UÅÐTªµÁAÜÉ¢#3ñ-8ƒo£ŸÃÝÈJbñxŒÒ½µ//r?ýFœöo I¸њ&Æ#+M·d%Í[K#|²’ŽÚ¦„}” -+iFüµËJÿRV +U‰Í#ޔ Ð×?èíöXÚdu9ё\eŠwÓAwqŽ~~ r5'Ï¥fúlêÎÊәž‰…l†H<šÅ0ÿýnM³ïãÙÙNeîÝ6( Q Œ™ûL=J•`¤ +d%Sx Âü»ö+(> Ê¿QÀh¥Œ¶RÔh=«öW°~+ùg°aI³øŒH{ ¥è…òo@уÐҝ0Ò-)äßx®5 t9 ô»$Ýf€RƒDm  T5^-Š#ÿ†ºš…i/‚¬É´NˆÂ¨iòo”È¿ù’—‘\.#&ù@IŸƒR”ÂC”þo@élRo ô± J_9½ ôË»’ú{ÒÖDK±¬$\I8[Vò/@ßÜœä)Æ®(T´]X,ò˜U*™TM7­cjèöuh-Ëwêh÷^­«Pß»>Åó(¢÷l(°¹¿¡ç®Fú]¡¥›©£t ÔPjSZ”ZՁ–j1Ԕªih]JiVYµCVºžÜN'ÖQuAVº“â3÷aƒ}ŸÇS–¬¤iâÕx…ðw•Þµd%Àdd¥Ù–¬¤ÉËÈJüd%ºÿdYéd¥/cJ'á(°dV…¢¥åÐÒhi!ïçÓŠÏ Óœ\…9xí­<šË0ŸŠ†‘S-t-ûV!&­ELÚhۓL¯7ÿ&¾ÊÜåÔQªìª· +@)€^Ï0ÿF±O—É¿qˆÝ¾ü,jòoTÊü.,GðZíÃuµPÚÄ:´U¬H[ÌòƒÙ,D˜ÄÏvt’ŽÐàdòoˆD}¥§à¡‡ £î0R†øïµÉ®”.N"ÿ–¨ãÜ(Q÷ utˆ«JŀR>W@6 ”(¥Pb,‘Êõñ€’/ÿ‰i/Z:Pҟ ƒR”ÂÃo”~ŒGéG®z;[PrTJ¦ˆ±‰ã?X]ÁŒÄ á»hh)( —èóv+Dšvp{3Œ·[óÖ¦\¼Ýù +´K óJ´Ó«h"PM;4²†f¿Áµ1ߪ£pýr]…ÍçêsOÜ@±ý¡ + ÷6çtk(⹕θ7Qàz@© tmÝ¥K—¶®£áêZZÕÐsWPª‚ý»„ú,°êP@‡Su6±¨dܝ…Õ=ðÂ>NãÙDM;/’}x3NSÑ d¥‘–¬¤¹bz¤€o>²Ò2’pkmYi§‘•HÂAVúВ•t„>·e%_µ€re%_󌟧åO'+ù¼Ý~–’ižk[–¶ÐÎGK¦1܊,Ý¥Ù:΋³A¦lö´™™o Ñ£o­g–ØŒ´’‚ÔkRuf|b’•u ôq³z½´0 ]pò,A)ˆ‘Ê;Îï!þ§”üd%ZåßH š$¡É¿™vuG©]t€*F;©g´™ÊFk©q´”jGs‘?§"„¾—¤c:³ÑۀÒKÉôKÖÏ»'Pt/Œt[2ýßøo[†«’ôꥀÒ€Ò9€R½m¥F¼¶W§-ÄêoäÄ`T¢k* ”d’7ÿM×£(·7ÿævy() +ø’ÓJÚh”  ôӔ8ƒ:JƒBÔQ +¹ê͘¹Aés”¾e¢ÿƒ‹¶X./(ý‘[ß?† ¥ob’p§ %o7%2ñvgk"݀¬´²ow‘&ÒÙ%ڋ)UD#c«k§†ÕÐ: –öñõ:ôd¨K¨¯§ˆþXýõë×?Ø`íÚµÝè»ÜÞ@Øә†o7²ê­ ÔPºPº¦6ÈTdªŽÔT/S©ÞܖR‡×±¬êêÞL ±®´Åº‹*}÷³^¨'>§IdôÆÔúZ¼æŠw˜+Þe®xYi +I¸Ù$á#+­ÂÛmd¥mÌ {lYé[VúYé˲Ò_ ¥¿UZV:«üۏ‘•¬’‘ÞžžJ”ÆÛmjµÓÎNÂY+á¬æ¹ÐRŠ rG*´”-¥ë ®Ïд¸&Sgze¦Žîò,çeYš˜—déœ/6d´˜n¯–ÒÎly#QšzՄüÅ$Ú¼ùìIÆÇØ×êõÐÂ$¨àäÒö'./ÿª•É¿áœG3‰Cãµ:H]ìÝTÈÞÊ´õ,F[β´,?˜Ž:>Q‡i8 Ô?IWÏ«€ÒóhFE0t”næ_×1\ (]–¤·\”¨Óòo€R­xŒJq•buqæÆ`TbhÕŒ©.–iòo•,P²e%?PÒ](‰Y (9à¥ð¥Ÿ¾à¤¯2÷u•¹<³ÊÜ¡@‰Uo”å€Ò.ïœâ%#1˜™“ÞžÐÒ·1šCƒ’pe¼ÝŠ“;H½Ÿ£?¶6O·¥Ë  Šïg–*ÞOªªˆ9ººâýК +›ýj)Þ¿ZG±³w]VðÔS€ïY_QôúBœ»êë ÝF “[¥ñ(u”ÚJm¥k¥ÖÕùW5ô¦R MÔ6lOµžë)fxS®ÀëÖl!X7Z>ܓ®‰å!j?Ùã9d¥—HA¼E +b0)ˆQÑÚÝ ÈJ3"õæGèËxd%}ÁͶ¬´?PVúؖ•¾”•üóo^Yé©PIY)( ÷}Ho·7 çér‚eɦ¥Ý6-m…–Þ‡–6¤ëp®Ë@`ÊÐÑ]•!Z‘©ƒ½"C'~¹=¬ ïëÊt½º:Mï[ÄH©ÞN]!KLbQ˜/ëfٓ°CaÆçãö5Åõõz󀒯…I%*sŸ (9*›cÉ ô5HgàӁ=L¥Ç½Ô|ÜNõǍ&ÿ†Ñz)âY€Ò$~±£ð ÂqôÞ£>PÐSðPÈè.†[“èÍp /\‘¨·üP:Pj¯ Ô”ªJű•b0*‘NcaC2õ2#m£Rù7?PÒà6Œ Jú +Nʶ…A) Já! JgJåözkÂåR‰&A½Þ†èõÔÂd» J‡mP:åH½Y ä ¥?¹Í­/ƒ–¥?D{ié«8oÎòv›ºÝ$á’„Û“¡¿±- ow®‚åê|Ë%…Š÷s‹µ/ÓJuç:¾ªölduéA5u_ûV-î—ëpc\W;ÿd=1ÍÃõD7÷ÕçÜY_Äӕ&7J¥€R»ÚK–,iSSõ5ª!5UÁËDˌvÔîPÀ:úˆÝ’£íÝFG¬»©Ò÷ë…eõ3$2ú +½N®?wÖø³Kn*²ÒKV҄ad¥$á|²Ò![Vú(PVúYé{héO²Ò?~-²ûâU‰²lÎW`é#˲¤aõ„³hIüb´¥ÐÒ¶T͍›Ó4ënJÓᴐ)]È´6]‡xMºfûÕf€ŒÖØx´Ž6°iŒdU˜Ä™ä/&eÝ°'-xs{¼yšâê[ža¯·rsÐû@©üü›+TþK]ƒQÞüÛ~“c™þû,Ø_(-amÚ~¢S°aaåÚÐDý€ß‚}^”ž‡ŒîaèÊp#C›D½ÐPº$Q¿ûót—ÐPªQ)N' PÊ”²¥t@)«^b¤caC´Û++ù@ÉM½—•u %âN”  äJ1§iŠ[³fÍ ”5jÔ÷Rö¥¥ÕWû܉ïvMqïw<®‡ãy=,P ‡c„Ž zX ´P»)®”èõæPè3 tÜqŠÐ(9B€’ÓÌ)€Áܔ~ùs„· º¡¥I¸_%S·o·•„S¼ß’­»>—$\¾ö`Q¡"ðìbíϔR…ͱUµ{ê+v¨©½}£ñ¾¶‚ù³u„3×U(íQo͚5÷Ôìt”ºPp²fÒu€R»ZÚJmª1TÕ mKIÑ“¬£QFGš‰Ýœ£MuÍÒFM[¬û(Õ÷p +U“iCG6ãd¥·‘•†„­?1ŠvÈJ •–“„[‡¬´…Éa²Òd¥£ÉÉO ¥/œ^Y©Ü"”¿œ­û,d¥²I¸ ËÒGñ:ÉÁ´”D&.Y8³+EGm{ªN÷ÖTÍñ›S 2é˜n4ܔ¦C¼!5`ؘ¢6¥è-›i»5PGÚc/s3Τ£”gü0&@LòeÝü|Ün¯=é/•~Pú1ù7VKrßJ_²HïS@ÉäߎQ û u±wSøq  ´ŽR_ËY9Ÿñ4ŒEãȜ Ãlô¶£W ç ¥Ç £ûî`蔨¡= ÔPjž ÷](5‰Ç¨§ß}Í8ŒJ±•b0*ñ»Ï ùœ +(%q—àJÈJžü›¡% þ „`¥0(…‡ß((5hР² W(å[ ¤­T”ê²ùs]tÑùŽË.»ìRG«V­Z:Ú·oßÎ%}­Û÷ëáxL@é9Ç«z8úëᮇc¼Žz8èá¬p68t§¹ PÚ(r(êy@é3Œ–_Q΀’&– Pú³J&Q`$3sjøc´„¬ô/ gX²¼ÝÉx»Sñv§“„ËTÄ|?[Ö$ᖙ$\‘ÂæÌäIUšGWUZ]AÿšÔ®¥8Þ»¶Âú3uÖ¯_ÿhݵk×>XwõêÕÝëŠï”neÁ['@é@© Ô¾ÆâŋÛV™ª2”êÕöô_í@{úhOß)sx¶héŽLmùú>ô ^ßc¬³îÅB¢¾Ü©¿Á=û@d¥áÈJ㐕¦‘„›‹·{ ²Òjd¥MÜYoç~z/²ÒaŽäqd%cëþŒÃùUed¥ŸÁÖ}²R ·û/À±_;¸Àæ¹Æ²dzÂùÑR‚ÎôáDAÌhi´´;)EÇo{Šˆg[ŠNü–¸)E¿É a‹GÛès¶Ãf$£#í'ávˆÂÕGM=ۙdÄ$Så:¨zRÅö$Pª¸„Òƒ’#”Œ¬„’U^þÍÀÑÃNÑUíx”c…þ6– m`1ÚJÖï/ãgôX´62A?ہ`Ïk€Ò  Ð@уàѝ ·0t`h@¡@é">Ñ Pj‡Q Pª +(Å`TŠÆ¨Äï> 959Ò6*ExóoQüøƒA‰’®@Pr†A) Já! Jþ uPқýAI×´¥Æ(5oÞü@é*@©­£S§N7ñnwܧ‡ãQ=Ï=÷ܳŽWôp¼£‡c˜Žqz8¦ëáJ€õE­Å¿=!É!‡¢ÞÅݏlPúÒñ-UâAÉé»7 u¼ƒ–~€–Ê$áìKVN“×Á4…ÍÝVN1vcŽþöê<…Í% +ús‹ô§•(vŽ¯¢ ?²šepuý·kPF¯–âý µ۟ª­xúHÑÍýuÄ9wÓ÷v@©3ö¤›¥H½u”ÚW×Ю*C੄êo(-ݔ‡/<‡x–èëî ŠÐü¡'µhžÂìћlÆ«Ü®÷cÐPd¥1Ü^OBVš…¬´0‚¶vÈJ둕¶2CìFV:ˆ¬t Yéd ¬ôãªü˜ü[(Z +±”½\ow`β,…¢¥8h)ÞKKGuº&ê0íOÒۛ2%éÄïJÖop'Îdý¶û†$ ;v&êÕ]t…ÝCdz}&×F4#ù%ÜN#&fÝζÍ[Åǹ¢üÛÿçßд (YN@ô:Î•Lwê#1*JG¨ô¸š;¨þ¸ {õjÖd.fuæl§q2N‡ÄLÄëùéP‚ŽÚÁMŸ¬A¿Æýö`„£ƒF=Š÷âё8}öŒdrmþŒ„{ÛN¸ùê„“*Ⱥý\ T&ÿæ%Oþ Pryóo¦0þW€Òg + ÿöF¥CÔÅÞCþm+ù·õÔ­XŽÊ¹½s:ù²ñx±‡“CëO¡@éyPè1 è~ðè†N íy®U&ï;t»¹“µñû(KuOЪò‡BÚ>Pr”¥¿:½SÌßBВϲäIÂùÊQ’„KÐ6O$)è5I¸T’pé + Û25ûmÌ& —K._ô6¯P·¯Ó‹sJ©GUQ(R•^VÕt×ûjuÅöÞ56lØðLMáߣ5W¯^Ý£Öʕ+ï¡{I7*t”:J¥Ž€Ò U4\_Ê¿Šy®Ho¹±@o¾9“S ¼,RyÚèiëׯïI¿¬§’ÏC7Ú¯à”}›©h֍QÈJ¹ÇžÁ=öd¥åÌ됕6sg½ Yi?²ÒQd¥ÀçÇVþ ”ô“•ÊV øùlݕöv%á|–%·mY +IKˆ!ц–ôÍ?…–>ö L™â 2é03ܯ£vÄôc8lGl2:êÃ#:Å~èó#ùt$#Eznßùê¸tQÿµngÔá­²‡øìŒJ6(}ç¶ JVþB؇£ŒQ‰B,AÛÈb´•ü!uÎDôœˆ{$Ë×J¯@½¥'¢Á£;:3tˆ×s­¥Ëyßï¥fq•b1*ÅbT”Š¥\@)“{ƒ´HcT¢£I„1*‘ó% (é9J.?P”¸› ƒR”Âÿ1(™på@É (EpIPŠæJ‰µ@ICÏ¥Z TZZš‹£» Tá©ŖX}L.¾ø⋸ì/§>stream +–ü’pVO8}_îx’f5ÿ$œbì–LEþõÙ$árEç+ Ï)ThžZ¤P:®DázDîAUYù\MAõåêŠò/ÔÐ-èS5Ā=k +q¬)ع‡¢ÜÝj@Kø¸;J¥¥Ž€Rdž"½pSÞrsžÞ|k®héöl²x™äóÒÉìÑ ë d¥g‘•^LÐüñ&²Ò@d¥ÈJ㐕¦1uÌeêX‚¬´šYcÆv¼{‘•#+GV:…¬dÙºe¥3²uÿhPª¬·»|˒ñªÒÒ÷‘Æå­ÓýM”¾êWL_@KŸ)Æ “ÉG±Bœ“±:B'@&ÃMÇã4›šá3ÀCÇíáÃX¯zt2FŸ5ÒÇÑƳŠ‘poûnnï²ÍʊIgmOªDþÍ[( ÜüÛ]^£Ò7n¯Qé:Ϟ”ŽJû©ù¸“êïãZ̓%äßæà)š‡Q Uh‰´7I©õ…žŠº3t‰Ç¨Äp-/\ (ýP:Pjk•b0*EÛF%~í鑶Q)Â6*¹½²RPÒ«.jMú@ÉéJܹ…A) Já! JPŠ÷%½š(åX T³fÍ*~å¹M1¥På¹oÑ#°˜Ò!‹)U¶F€oé›]#À,}”¾w(\Pú³”œ ô7Kb`Ž/? §XI¸øÀ$\Šæ¼½i$á2HÂe)Š®ÍQ^ž«X¼0_¡tV¡î“'ioß+эç°Ríü€ªŠüoTSä©šHæ¹ê +¯OVÝqÖ „· JaP +ÿ ä +¥H?PÊÏÏ7 ”Ȑb’Þ—Ãõ[ÀÕSʦ<Ŕ¼5. F@s«˜R@€;üj<§GÈgµôí+³ô G·¥?:B€’•2ðóKȔ¥%¿$\œ„Kԟ8–l’pš ÷¤‘„ËP(ݔ¥Pº&G¡ti®Âÿü|íãŒBÅӉEÚåÑ%„ÿRÅñþUY_¯ª(ß·š¾Õ³Õ6OT_µjÕÃÕõMï§{IwJ(u”ºJ¥[JEJ¥› y._o¹Yé¶Ô¨,t© *d¥ž©ÚüS4Ízbǯ +½ d0þQLO¸ÑžÁö|d¥eLk¹Çތ¬´Yi?²Òd¥‘•>FV2¶î¯¶î?ŸÆÖýÓæßÎ< 矉+–"¼´ô‡Hf{ŸÀåE¦/@¦Ï£uH>ƒx>eøn2ƒA!yóŸzäÃ##!y<Û!ÉèÞ®´˜ôS€Rùù7G(Yù7§×¨dåß\ÞüÛWnÛ¨DûÙ"m£²·’[¨¯ÙïÓ¥ñä߆Jý‰^”žCVz (º<ºƒ¡C{žk(5”.ŒÕÖPª£­ÔˆÁ¨(J9QF%?PÒO>ZŠ +%w”  (Õ¬Y34(é"‰†‘b,PÒà%T:WO6ŸÈçê)áêñÔhÚ´ic–¾yj´lÙò*ö¯­µôM_Ëé[/G¹Kßæt–~Œ£Û,}«„£›¥o•þHþíÏcT*”üh)"À²œ„‹5I8mùT‚fºM.Yáÿ@ª‚ê®tíÀÖ ÅÝ YâU9"%¹Š§sóE#Ó +u_;¡ˆ> ÅdJþûUQlµÊ† úT]·n]¯j«W¯~¼Úʕ+¦îý徛JÝ¥Û¥[¥Î€Ò-E €Rç^È-ݖƒ…¬ÔYétdªTmùIzŠšÊ}/QÈïMcAVÎÌ4Ž9j*óÇæ%ÈJ«‘•62klGVڋ¬tYé8²ÒGÈJŸ!+yòo@e…ÕºÎü[Z +µ.Ðà’–Üöš¸ t\ 2} 2}%ø’á °ÇOŸG•¬·ᑝf³<Ûå1R¨R~ËÜ*#&ý ôÿB‚’mTr +”þ`ŒJnÛ¨(YF%*=cÛˆQn•1*±@m?/öÈ8ó;Ũõ”žŠîd¸…¡CF%@éò8**ÅêMc1*JµbôC¯íutçFyJ©Ü$E£ù7·7ÿE2DX $Œr™Ê(é³N'r6€ +@‰õ(aP +ƒRxø÷%G0(U«V-(EÙ g’†d”²È¿åYž¥oºzêØKßÎÃÑíYúÖ¦M›k‰ž¥oÝõÀÑý°åè~QÝoý$Žî¯}ŽncTrxÝPòN;~´ä %#+ý)°x÷×1Þ$ܧÐÒGÐÒñ¤¯¿þú0I¸}ÐÒÎtíÅæ ßuYšVähX”« :;_sÀÔÍ㊽G+Ž*Qø»TQþ•*ëׯï]Eß«V­z¬êŠ+ªª{ t7 ÞºJ·J]¥[¥[ ¥.y¼š Ue‹–ºgBZ0Wš6úxŠ6ߋVY}©á÷Z‚¹S×n¼Ë¤4†éi2²Ò,揅Ì+¸Ñ^¬´Yi7¶îÈJǐ•üóoP¤ÓäßÐál[÷™çßΔBÉJ¡VÂULK÷9ûmZò L?Ðòõ{hÉB¦H}ýo#…8ßDz¹ÉO~C YdéSÊâ‘ǏT1#yn?§˜T®^W¡QÉiŒJ”JnÛ¨DiÇ£‘¶Q)Ê6*ñû[‚À9‡TÙd’f£Q…“H{Pê += =GE%†[nà¹kxõ +@é÷€Ò¹€RÃʼnڀRÕhãèƨå5*¥£’Jڗ8·.Ýh)Êí%ý×íò‚’Ë©Ý ƒR”ÂC” (骈…üAIgC‚Jz!«ÖJúl ¼ª•j³ù†8º›áèþ×þ¶£ûú`G÷“z„ttOœ8qRp{ÜÓ63ùÜ6*yÝ•È¿ýŐóÌ= V—OßòZ*7 ÷I<Ì`’pÐÒ¡Í{SaÒuƒú~†î>×f?~|yŽ`nA®îfgå+\O. XLÍŠ5 ,QŒ}³DßêåÒuëÖ½PeõêÕOWâ@énìIÝ`¤Û‹5t-Z°`A—B†þ (ݞ PeƒVY@V¸•x¥*„?CóõÞÈJ¯PÄømd¥!gG±,hwÛ3¸Ûž©}^†¬´–ŒÄû¸6v"+íGV:‚¬T&ÿJúåß8~vþíg^ÿV‰$\HZr–ÍÄý=X`2-oB S„71÷5nò  ßÀs6™äZ<*+!…εyÂíg¥Pù7«P€Ó®¨dŒJ.Û¨(YF¥Û¨é5*m6F%@i) 47Æ•ôÃ|CöPioJ/AA½€¢Gº2ÜÈÛJ-xËŀÒy€R#@©N F¥h¯£;?ª£R\„”¢"a¤ŠAÉ¥0(…‡ß(9Ë%]—”b-PҐ-¥ò–Lä§\.b£[Û«‰QÉ8º›Úíq=Žîëô°Úãvãk> ‡_×·J43 2*)ô*¯ôd°Q Y鯎r@)-…JÂ}ëKÂÅÙI¸DÍG“HÂ¥+v§j/¶¥+²nÌTd]¥Ý[š£‰`~®vwF¾ÂëÄz€*˜¿[¤9 ±Bý%új/•(Ú>_*ºyªT_÷Q:¼õ(ûÜW" +ꎏûN@é@év@é¶þ•Ïs¹¼šUeÁWÈJ=Òa®TÑ×S)â°çi•õ2²Ò›,)ˆ¬4Yi²ÒTf«¹Üm/AVZÍü±‘Yc;²Ò^d¥CÈJÇ]gšûïÀüÛÏJ?š–ÌOÀGKÈä@¦ nò ^ +ò ß[ƒ÷-?„Â#³ùÀum0’7áöÏ ·Pbҏ;°giTâàXF%ì]–Q‰Öo>£R¤1* S¶’ð5F¥åÐú|¸}:2Ð8@iÄóù·W  çà¡G!£û`¤Ûnâ¿íZÆê-—Æꊺ¾:'Æ•t©Õˆ¦ô¤1*Ù ”ÁA +?ôDd¥xòo±ÈJþ ¤ÿº]z¡ò DÙ·0(…A)<ü6@É EÀC”¢¹fbâý@I—PoÎácäßJ¹„jpu×èäqt7oÞÜÓõ­{ª™É³z„4*™Ò“AF¥ Ò“&ÿfŒJåTTò•B‚’Ó;Kúh)´eÉî KÎÐÒ§qv.Qq$ é%EwÌ»Rµ+[ҁ7dèÎuU–Bóâ…×¹¹Úåiyš&(Ǝ*TDZ¤/ôN±‚þëÅ™KÖ¬Yó\‰çÉÁNO—ô”î+ +u”JwJwäóß\½pgoÉ­2ùX:@Vz2…& Æ^¤!ÄÈJ•†™»w¦§ÉLT³•q·½’ùc=7Ú[‘•vS„ò ²’'ÿ†ª†¬*ÿVÙú“?!(%-ýOZò˜\^Z +B&ÓÝìOö`°Ç"(w¹CÀ'€–%‹Ôö¥(ÐîHÓþlN­ËÐíëŠ,$[1vv.ù…<ʸ|}‘š*Úö+Ú°aÃkÅ +¹}‹õMŸ-^±bœ´ÂíI=îԚ¼{Ò=€Ò݀Ò]€Ò€Ò¹ü7G¯vφª2ùDŸMc+ÈJÏ&‹Ãú"+½FÅãw•†"+6Zf’˜8 +-gYˍöf\žü8Hþí²ÒÇÈJŸ#+ý¸üÛOJ§¡%G…´tzd*ÃMAðTáàk8h'×þXÖëï?GŸ„ôß¾=ýnäß@ÉGK£’ñÿùŒJd(%Q‰bT¶QéF¥}ÇށQiÏj@i1?ÂـÒ$gF¥A`ÏP@éI ¨xtCç8ÛÑ (]Îû~Z5‹±ÝѶQ)Ê8ºé‘é3*é +õ•ôk±@IC$C„(é͕%Z +„A) Jáá7Jº>< ¤Ë%Š!Ƒ““Ç¿’y5  Ê"ÿ–Ç•\Ħ6_}xü BÅû· ׯ_ÿjњ5kú­ZµªWÑòå˟¤Ã[OÊLö 2Àýø¸ï…‘ºÃHwç1JÝ¥{²yK&oÎàcÈJO¤²)d¥>IlYémjfqÑHd¥ñ&끬4yk)“Èî¶7!+mGVÚKµ€ÃVþMtx*0ÿö²Òvþ­L¡€Ÿ?ÿöãhÉNÇ9½´ +™þîG76<ù±O¹ƒy_ÀÇþÊa¤Vš‘~>P:­Qéo!JTV°ŒJ¥“–£Û•¼Žî͐ùcTŠö:º§4( ”Þ€^´Ý3t‡‘ºØŽîk¥+cmGwŒí蔪aT*Š²ݑúûƒ’~èPÒå6 ¤E¸´“n¼Prù@ɉKÒ”Xl¥0(…‡ÿ(ѸÒ%”Œpt‚’º¼«‚’¹ZPršòóóÝ/¿x!Œ¬EV*à½%쥻»?‰ü[­¢’FsŽêJzäÞ@ÜÛønd¶x0©Gn¦BñüÛÐìù7™úbù7™×bù7%+U›3ÅoYO½[éÝT“š„Ù-U‘•¾O«@n«G¨l£Áŧ,K‚kK‚[·n’)wfDfÛ©9àGT¸nL‹|òåà¿,y¼o¡LëŸÉÝ [±|µNÅS¦Ly¿D&ß·J&L˜ðjiEEEkZá>G=î§) +ВoJJ¥Gò%<–'¯¶ŒÊÆOåð¶ˆìàÅÐøñãÛÙ)²Òû´ÏR-µ>FVúœZýIP áN2Yiù·)¤%fâq­{)ù·Õ€Òòo[•v +íAVŠ•8WœÝ¿BK«6ÿö塞´T½À”†LÿL嗿W Öƒ9%ü=%áQv é?ËHUA)³Q)”Ì©¥'-TQPŽn@I•ÖÚŽnŒJš£ëÐ8Íθ£»7œÓ]9ºaŸ·ÝqG÷3™ÝîTG·+îè>)££[>-‡ü[Yɏ¬ä…–ÜÐR ”ä_6‹ü-Jr³¼Í%”Œ`€R”¬ IPd’AI‚ŸBl’ÃÆù ¦b†smöWNþíD>è4òoMÉ¿] åßä ¯åÀU¡€?üKù·ÃZÿ¦d¥”õoZþ͔”Òh©&–¥xn‹„ð¢ºø䖰< ·„ÅA¹%Ì É¼;#,äQ™#:.J‘½\™¸‡æ˔;¨@n ½ enïY(S}×"™þ;WVV¾W,\øf ˆS2vìØÖtx{ŽzÜO³Öí ²n”+ JJOD¨žÎáyï‹ÈJm‚²¿·ìY©eU»ˆÏ•úñ0?˜ÇúÜI*xäžÌýcù·yäߖ[Iþmù·t£R"ÿö«•Ž€–™þ‘NPՅ¬oûgêg¤áÑ¡Öµý›鐠¤‚îè֍JSJº£{sG·Vzґpt;ŽnWª£ +jãÎâèn‘pt_œÝÑ-{.ÑÝ+W®Œ9ºåÃé $Á‘J2j“AIÆGÍA©k×®( d„c”,@ÉÁèq<üê#Ld¥<ÞVÈj1˜ê±çFŒóSøHU(à<­PÀo8@U( ¦ù·¬…ºUþ­úú“ñF¹ûrc ¤d%²#JV2e¥TZªÆàMÚ)Ͳ-­÷"½øזÈ[å)uNHæÝéa™š'ç"Q™³Gæ¢âäÉSï€|™w{È-á“B™|» v(’oúnф Þ,†sŠe.n (µ¢zÒ3EÂCO’u{Pj (µ”žÈ“ðdT^}&‡#¼-\QQÑ&È®²Ó÷ü²ûŽ´fïÊìOYÝ—çø¯xîΝä[î$“ÈŽL'ÿ6—üÛbòo+È¿­EVڄ`°üÛ.òo1PâVù«•jJK‘ɤ#SVnJ!(=TA¡ªVFJ ”dàè ä&(P +ðj˜¡Ë¿•••Åòo5Rù·Æ‰üÛ9ËEZG“ÃÊ¿eZÿ–µþ¤Þ(7‹­;cþ-IVJ• ,i´”fY‚ +쩖%ààÆëìAu–VùHYä¾° (G6;$óî´0%‰#ÐHTæÝá¹ò çɌÞ?_¾Ð2Õw/ï÷aaeeeûB™†Û?þ"`‡æn­i\Ҋ¢ÏJO“u{*_@éÉ< Oåò7@éÙªç#cƌiÄlCþíÍÀĉßó˞;ëJïўÈJ}ÈR âvò ÏÝcÔ͋Gîiäßæ[Dþm9ù7ͨDþm²Ò.ͨ$g#fTRù7ݨÄ9ý5A)ë}¿Ȕ•›EP©<¤‡CQ ðè?ÄHՀRµŽns6G·5áè”4G7ÞéÊÑ ¿ŒIst»âŽî÷ ×Ýzn é5ºyõ²LŽn­F7Žn­F·L¹š£[fŒ M®qJ@ÉEpX(Éßl +”,i $û‹6” P2± J¦$PÎ1§‚’²i ”››ë$¸ ^þæçÕÛ%çßdD*ÿv­üd/ÔÝF~LmåÇÔI~L=ä'½þ¤àB…InôS´þo2Ÿ. ÿ¶,©ÿÛaغ5P2eñd¢¥X݄e ZÚç åijã’ûÂV7áAzñ’­ò‘· +ÈAÍÊ <3D™0®"2gÉ8–‹ž“‡²“'÷…ÏòeÒÿ¸`êÔ© &OžüA¡ÐMÛÂqãƽQñг¤5e&Ÿg­Ûs€Ò³€Ò3€Ò3€Ò³€R+@酈PÕKa™Ç_ ÉÞDVzÏ/;íà“ÝDþíÚEô&ÿ6ˆ‡ù¡ÜNF“›Àd*i‰Ùäß’[FY¥5äߔQi+ ´“ü›Jê.™Í¨ôŸut¡ÀT=2%“Â…jvZ<úO2R¦ü[MÝæTG·¥fŽîɎ„£¦èRU¾5ºŽî3Ôè¾U¯ÑíÎR£»<áèV ”ÇåA5 Ú( y ¥* $¯Z-²Å,Çg1@É%# %K*(Ù5PŠF£.‚‡_ý¼DVŠ0~ó•bù·úõëWÉ¿'?IëßZÈõ'o×òoÕןüœIgÀ€™‡¾Iïÿ–©¬RMmÝ©ù7SJ…¿*´”jð¶VMÂé´´ZÚ-mð ¿xY2æ#yå'¤Cˆå>a™®ÇG–/_>:G¾ÁÐ(¢N®|¡>yr_ø4_¦ánùS¦Lé\ _·]ÁøñãÛ&¾AÜ6”â~‰2“/’p{žÐŠ¬[+@©U”¿å-½(½ (½’÷¾”½¼ç—ýuðɞ?¢ãè'äßT=ä<|åv2ŠûÖxî$S¸—Í"ÿ¶€üÛRòo«É¿mÀ¨´…õo;È¿íAVÚÏ]²zG÷¯J5˜ªpÓ!áé0Ãÿ¥šµþ›ð( (¥;ºMY݉ݖDnÍÑ-—OÌÑ-—ÔB{¢F·#Q£;áèîåJÔè†}ނ‚^JÔè֗¾)G÷ „+µ¥o2zšÁW§'ÝõŽîbÓ|.[>ܟJœ;bRP’è d>aëž}[wu²ÒÏ©²Ò?LÙ » ZJ«à£%ÔeYràÙqÊÍa» ó{ïÞ½ë=‚k«½;vìX擃Zè'—$ç’£–¸""3ðș̿ŽÎŸ?`.O®Lú=óäFÐ5¯²²²SþĉÛå7îü±cǾAs·W)œô2EZÃH/^”^”^”^ŠÈ&m²ñë!yÛÛ +”È¿uðÉN?¢+û'´ÔêEáõÿ57ªQ1j!iI8¢–2€·2†n%¿èÂL·’‡n%7ÝJL•:â [Ɏs s+q,ßa1Í÷ØàîCÝJú»•”ÒÜJ tŸK¯4Z*KÎR4îCá‚¹Ý …k Â]àL¸“~\Öaº•öÒ­´•A¸µ Â-K³ÎO¡[‰¼Ç§á‘žÎÒü^èI2ê,*g0»9ÿ÷ Aé·¬ÏZŸ Tƒ/IåDl›EPJe¢R"•bS÷zpO].Œ¾‰JV&*™™¨d €’ˆ¿áÄ…@Ióÿ ”Ö¯_JÓ¦Mû¥;㖃R¹x¤Å¯”ä’A ¥øøxß#…™ÂÆߜ\êá«Ã͂yÜx§³¸çûò¸E™I‘ÇÍ2“¼¬îÌãî+ Å?)//o¬ 52U†B™+Cµ,QÖ®]»ZÙ¶mÛf LÖ. lÔ-ä Ôë tÓ#òyvݺÈÚKt1\v‚2.1ÝS´¬:ËÁÉxˆ£ILBMÅÒ=™Ðí[s`a×UÂf+ªb éVšY û›ƒÎîû€ø‹@ âÉZ­„¥O2þöãoÏ0þք1‡fŒ¿µfü­=ão]X²ãoýèVÂøÛ²ÞdÆßf™‹ÜJ…Œ¿m¤[igÀ­„üct+UŠÜJ7eQ„º]u+•X„²D·Ò¿—ìV*”‚–T<@¥¥Ðt8Nòþ†Ó½¿`)ÁOX}ù–|ׂ[ò6»}½ic‚7ié<ûçb>ÿ,qЋû¼Ç‡ÁÛîgÊR Ff]›Ýƃ––dz¥[hiQ"i‰ 4/Jńð7 –ZÄ`Ý&9-¥[)†n%È­Ä$r1ù.àVrw+YJu+é­$nb´ø[X…+¹-HUùkxÊÒ_HK¥Ï„û†A¸/„Ss»…[é&ƒpW„;ËÜîct+d9ʝ,G¹‘Å» Ù꤀­Nf¥Ð­”J·»Ãåò èMZêF<ê.f…BÆ&Hã¤3fL—,X0_^±bÅ2Jf­‚ï²­ - Õ ¾ã_×?Žé OOë¡EÏ¡@/š` ¯XØǝ™+WPÜW˜ÀpÉ qÁÏN qøßñDˆÃ)Xº/:vG6tûƊÐu«ª@ù.¦[iNMìo*ÓºóèVF·Rº•zÑ­T†øۓ¡øۓŒ¿5büíi֟|–ñ·¦´-ùÅ܎ñ·Ž¬?ٍñ7áVÄø[Э„Sn¥ùLë^F·ÒZ¦uo¥[i/ão‡™Ö}*äVºr+…÷6æÿïr+•J¥ÑÒÃO‡û£˜§+žà-R–HK“–î™™àÍF_·„»ngw8†.Ï2Ÿÿ„›)K¬>zÀ'šÚ0e)†)K±£µq°e…ñLYJ8tèÐâDö,´”DZJ"©‚´4Ÿµî§ÅtD‰L'‘ó$²ŸD”ș䷒3äVb5ƒ+Öÿ9·RP*‰–DÊR‰A8áVúÙÀ \È­ôuñÜîw™Ûý¶˜wn¥‹t+âçÈö„ÛËr”[ãéVJ¤[)‰n¥dº•ØFw|*ÝJ¥þÌGêI2êLю¢+s?Ãֈ¿e#ézlûSƒ/I%ú^³â°«TÖèN`E¥VTò²ô¤‹¥'팿YmEñ7#•ñ7ãoÅ•î‹¿ <*Jr4PŔ~% å$™rPú5˜òrñ¿”*W®Jx"@I JøÓÎ.®âåʱ¡<î4îOÍã®Íã6 åq‹zÜ"»¯2,›M&°R¾¼hÑ¢…òʕ+WÈ7n\¯ìܹs»[¶OtX ò8¡ƒ=«‡¾h€B¾Âî×ÌìµÅXÌu;Øâ]òWÙÛó’Ÿ >c©ÑðÛÑd,=˜†õvÓ­´¥tûÚÊØÁ2º•æ׀֛Á´î t+¤[iA©7A©{Düí1Æ߈øK(©‰JŒ¿ýŽñ·'{Šñ·gXò9Æߚ3þ֚_ÌíÙЪ ão=…[‰mM†Ò­4–’)t+ͦq-0ÞïV:XÜ­tån¥¢"”án%ØËÝJыP>(ýÂ⁔%m(Á›öí}””%3S–,LY²2eÉƔ%;S–œLYr1eɃ{؋[¼Ï;¾3†)K±LYŠcÊR‡v ‡ëW÷}ø¸¥díÓ¯}…zÿ#FŒî7nÜXç´iÓ¦¸4)Ív‹AºJ—F),­ŒÖýåêaÅú8E̍”BÞDÍÉH ©ŠfÒ5¬£PÞêj çS¦HÏ.(EVª£wL©¯Ø>YÉغßn!ðz [÷sغŸ ÿöÕºïAVº Y©;Mஆ–.”.ý©?IþíԀü›¥³É¿Cþí\òoç×÷.ò¹„¹¢3ÁUL×#+ݚ¥¿{7¶î^x“ÇÖýLb€¬4 YÉÓÛD1ÛÈJVo“²Rµ–¹ad¥¿¨¬ôÃÑh‰™=ˆ–j6x3¿}²”€e)QgcgU–’©²”J.*K¦¨I¸l’p9Ô È# —¯¯bL¾ž‘…šÕ† vÞ)ƲT‚e©„$œ¡¥R/-™Á<ö,5€dÝ ÒvC -æϟ?<ß++cÝ¤lý™¶¬”fd%j+ñ…®ó“•ègd¥ØP²’¾¼ï™Ê¬äÉ¿Y©¶ù7û{ ™„«­·Û–•lY)ٖ•Ò•2lY)Y‰š“ó•è 4´ÚJEÈJÅ:ýèOòw ÷q܎„Ô<êÊбDC»b=v6 tz¡^wrÞь$u@©¨Ï&šÞ&:ҁغƒd¥9!d¥M?«¬ -”Bђßr¸P–%W e)0 ÷}tPN“—IÂbF܇ˆ°+ÉNÂáç_“ÆJ¸ ’pXåd“„Ë% —G®€$\!­NŠ„8ÊI•P7 ”*K¥X– -•AKf0 Ä`D§$둶RXQQ1¼@äûyúºÇáŸlÉJt‚cÞ"#+Qõ#+á¥3T¿Ó–•R‰üd¥Ï-Yɛ3²R ¶îc¥0ÞîZËJ‰,‚3²RŠ‘•hp’Nn;“¾¹YôÍÍ¡¶k.%»óõS~—êÚoQgû%²õå'ßRO è6†ë‹u®`¸´HÀÒY…º>N”NÊ×ۚæjõIR—Ñሠ-üyMËbk:ÖĔdFc0–:“¨ß4=K_íj:-L§%ù·U|¡kiî»91°Z@¶îÚæ߃Rme%·OV¢¶RYéP%»“ôƒÛÉU¶9E§}màÒõ‰gê´Ï¥ÐT*i¥¦öð<}ü¬ó…ÿOók ÒýG=nº2t, Z_ÏÙíé|['JÍrôå5ÀtVŽý¬ˆõy$Y³SÈ¿áçOÁٟD¡­JnÅÅùòoÈJ¨•sÛ²’ JNŸ=ɀ’3JPŠ Pò‚R£FŽ”tádJù(ižÊÚ³§2ÀYgu&—½eÓáMÿ6Ç}÷Ý×Óñ¨6ÇÓÚ¯hs Ôæ®Í1N Þ¦95 ÍuŠ2–86«\Š±k\ -‘݊R[£wF vvà {c®÷÷™\ 7¼{pîL£[U&½=³õìÚ<¼U… -¥KKõŒ¬4Ӗ•üª +½ÜŠj'ëï>ֆjA²ÒéÈJÐÒeA² t® Jç´²uS„[w‡²@Y)¯º¬ôP ¬ôZ¼i™«cŽý1e%ê5ÿ²Ò1ÑRpΘ„‹¦n@`îHYi[²®¨ ©,™ 0ÇÒ ýD+èÈ6ƒÚ¨ùõ"ßÉ£%Òéóù´Ì%¯ö`¶n èfðè†Î ò±uJgæaëÆ`ւŒ²°u³ì¡„j,rÌa¹cõ´R©¬•L[Àî™â¨»kçß,PBVò%{ˆ€R”"ïkøuƒRtPJ²A)Ã%½8Ÿ·ù*4²+œB‡·ßV¸"De€Ç¨ ð •^u 4èm Þãµ9f̘1Ý©)k¾SÓN¥Ss¥K7”k]šî6¹Û£¯vEižÙc–) +Ør1ûÜöá:ݝJô êdéÙ ¹šMWçkfZQ¤xºYi²ÒԐ²MàNBVj핕î=U!üöÓ4Þpš-+†¬(](µ”Î#ÿ֖üÛ9-šAKMèmÒY©^Y)ß++ÝÌmó2²Ò£L®ý•^BVz+PVšHm¥ Yéƒ`YIáÿÀ ÉJ^Z:NPª½e •Ä”„£Ý†„ûÞ$ábHÂŒ„CVú”®ñ‡ÌOâu¥š·Q´y#²ÒêVQ€§’R< XB5›“=yzb‘¾…±–¬D®TÄ3¤L?½A墥åX–üh‰P";÷6yºÁÁß-"ÿV(P•OþªM“sòo‹Ò½ù·¬ü[€­Ûäß<¶nÍΟטû{Èü[£Rð?YIgü@é‹8ñOãŧ–¬ÄU¶#Y¾)E×àšTý&WP=FæPíh -}GFsڇR4²?k<_ÎÓÅÔ/_Ó# PO@é6ðèz†+°]ÂpÖû³ruiœF‡VÙz[@©>7eÜHRd47U§3+™ü[’î!R(¯•|Æ (ÅpN£‘ꢢl[·¡%W-y@‰ÊN½8JPŠ P - Jº4 (Åq¥$X ¤ÿ¦r­fðJ(éJ®ËþS %È´Âý‡áß -WŸ£;á¡G¸Êƒé·=Ò1A›ƒoNÍ=NaÅR§‚å*—Bä:—Àa‹[q‡[yO”"×>Há@ŒÂõGÜA4ßDEǸN÷¦`=Mg¡N¦žÝ”­Ø,+•{e¥‰ÈJïY©)ÕZÐY©²Ò£FV:ꩊã7Jם†¬(](](µ'ÿvAk¯¬Ôր’•Ó`òoçÕ7²’vp²RGjÇta‘O7&‘²½²Ò½FVJÑdó²Òsád¥©$áŽQV -Ó î§“•þïX’pÿò%á܁I8[Vò%á>³d%}òèº?ÿú¥nAVZÏ´md¥åÙúV3cÏcƞÉŸBæg|1Þî¼Ý¥‚¡e$áÊIÂùѾ%™‚A‰µsÃ)Îô>ešÆæi“rÉ¿eæßÒòo›È¿mÿióo!ù4¬¬äª.+}Ïÿ6F‡ñU¬Îøg¶¬t€3¾;Ig|+g|=g|…ñ+©š=>N%íñÙú`uÿ õ5$½g1i?Ž®÷êѝ 7‚GW3t¢êU{@éÊ:üPj (5£ŒhÃL]’u¨Á^L5û|*fÓø/ƒ€©´·IÂü•|ÆŸ1œÓh¤º¨¨Àü›Kƒ”ø—%&(ùZ˜D@)J‘áߔ̕W;PŠ -% A ”c’.œR.œzì¯ •ZQ t %}˜¨ p­p dô!xl I{΂O'Q%r&±!ä>ßd ۋdӞ"¯öp¶n èðèZ†Ë.¢¢úy4¡ù}Ž^w -UÖ[f齍9“uèJáÎ:ýåp:3qɧ%’C¥K>ãÏXΩ?(™ü›—–,FŠ€R”"ïkøu‚’®FPÒuY(éÅþ ¤kÚ”¼%”Ú—Pºë®»|%”ž°J(Ñ -×1D›cÔ¨Qïd&nfx:‚–;ŒV;,]šb¶¹D -»¥}n…Ï¢ÃE+š)æ0k¡#1b1óÁdV4§â¨H׳;2õ6çh>ZgËJ•¶[iF]Ý ûd¥!FVjnd%Ý ÷; Y©µ í6x+NQ0¿åTd¥S5-v=UÔPºPjßÆÈJ¥óNÒ`d¥¶Íšè%ç6ҋÏGVº°NXYIlv»‘•0·X²ýè=²’ŽÔ#+išõ—•ôÙ#+UËJšBËJšzFY)\.¨.bPΚ»Y gËJß3wËÜý"ÇçÌݟ rdîޗlV?YI§i}†N؇ôž_aÉJúVçÓcÖ⩬ÁšPŒ·»„$\©¾¨ae$áʱ,Ғox/Ó`Ë )1 „Q‰R–£¥ y•˜èg‘›Qi1:È -{ý›é¼³PÚUãú·àú“®0õ'kJÕÐ4DÉnKVM£¼hꓕ¾DV:š~ÌU¶Ø.üa[¨`¶ØJ:‹,¡HÃ\ÜôS©{4–µ‡Ã©Ô0Wö+T}:W¿öGьîŠnG‚ëÎp%Ã¥<֎üåYÐæiY”UB›kʙ¬@WwÑö'Ó™E:3•.•.‘â ñÀ§¥˜h_þ Z²@‰!,(97ýš< ¤Ï¥(E†ÿ8PrƒRyyy(PJæ¿©<‘ÉKry±§„’öRß.¡t%”<µ&;tèp!%”:QBéj>ÑM€Ò]”PzЯ„’@É*¡ä=zô(Çdm„›ÙžENM6+œ,xs*,mt*@mw)îvé¾q¿[¡ù BÊÇÑÞ¢}ŸX]Á4iNÐ`úŸ”‚£"MÏîÊPÄ܆¬´1W4¤¬T/PVj¦ÿZ d¥VÈJ'+0>Üږ•NÑñÝx*²´t Ô PºPºP:P:·%´d@©)9¹ÆôÒm w´««÷v@VºÔÈJ…²Ò-X2îJ7²’¦„Ç,YI‡æ‘•³CËJú€µ•>û…d¥Ð´b·›¹ûæî/ã¼Þn#+°e¥íxg6áYkd¥lý†–Òau!²Ò\bÍÀM?™%êãJðv—Š–F–™$\-™LœqynJÅ6(hƨ4Å•Cæe•Rìú“‰¾ú“AF%}"?£’_þ-ŒQ)TE¥Ð T“¬ôϲ’eëŽ6²’ès2žæ*û4ÝCÆsË7°ìðCje/ÃVA‘†i˜Àšþ÷XÝ?˜Ìòë$Ҟ#¥Ö¹¨PtxtÃÕ¬¼Œ¡=ç¯-¶ø3¥Öxã›cùj(ÕᢘәOj:›tf*]j‚# PJ §^ð˜s‹‡< ¤Ái§ðqG@)J‘!JG¥Ø ”æJõêÕ+¤2€”Zµjå«5yzp­I³©5y³_­É§žzêINjڨ5ù ô. 4Ú1E›cŽ6‡&ªÅË*@iS1q ´PÚãRÐ:àV$<„†r8Ê܆+®±ú\(Ì×éaúŸJÆQ‘ªaoº^²#S±}sŽâߺŒô;)’¾™jVk¨þ¸‚jV‹¨9›Ú“3ô¡G³^í]’ÊýYÃöÙPêðv/Pt+xt-C†‹©Huõ;Oµ…S2É¿e£’g= -T•rU$“ãtfJi¨tɨt‰À§þ¶&Q´5q›ü´äJú¯”(Ê¥(E†(Õ -”J ,PÒÕ}2—Ëï¨5yÇÒÞª5i@IŸífjMÞm՚(™Z“/Úµ&‡RkrŒƒJݳÏuhÆ1 ´Ò©À¸PÚìÔì²Ã¥PµPúPúØ-*ø4Ê;?³Ú§šòÍ -xŸÒ¨êp’þ{0…nUizÉî Å¿mYâKVÊWô“•Êd¥5¥jª?þz …æç[jº{ò$¯¬Ô³âx6ÈJ§,_¾ü@éJ@é2@éb@©= t t^KJ MX׈Î'õõKV*S´½”žW—S^æ* -È\O‚Â#+i†õÈJ: §‘•^NÐ,ÔYé]d¥Q1b½j²’ÎËÐÒzhi+Ÿ¬äüÕÉJ՝ƞK>¥#„·ÛOVÒ×}$ÁÈJÆϯïw•~¶SéÇ#+é«]…¬´Œµë‹(ò3jˆ3)=RPB®T´d’pƲäіŒË›2ކ‘X7Ä¥áùYdƒR~(áèÎ0Žno¡îµÉÆÑ­£Úž`Ýƨä%¯Qé[¬4ßÛF¥raÝ5€RMhúÏÀŒ§_µŒô_!+™«ì0EÒ°‚b7½C¶R=EÒWQ$½2UpՎ¦Q÷h†þoãÊ~ïÖ3œœÇЌîŠzЦ;CW†Ž<ÖP:›nçÓDï$@©iù·T±J T(åQ÷<‹vzé,'Lñ3*æߥ(·-+¹¼ƒÓ”ôÍx@I°¥(E†ÿPÒ5X PŠ¯”Šxo9%”pÍ4 ¥Šr÷îÝÛåîkå0`@»ÖäX@iªƒJ€Ò‡âäJ‡‚ê:§f—-€ÒN§"ð>—&–ƒ.ÁÃÁ‘(&–(7“¯øÂ*H¨¨÷…?M¤ÿB2e…-YIÁr'²Ò–l[V*”•ê +Õß½{÷(d¥w›P[©™ãË-•Z)À?v >[+„ß (ÝÚFÁ²{M®W·Ñ,ÙPêÈÒ·‹¥ É¿](×œ¡)CcüÞ h‚¬Ô¾\´t ²ÒeLÖWæYIaøFn¾{dYIGà‘•tTFVz=^SÑ ¼Ý#•Æ‘„«&+éä¬! ·É$+iê­&+iþ ++ý«–²RmA)$-Õè4þg8Yé;d¥¯-YIßt¬´ Yi+²Ò*ý¬FVªÊÑI¬DVZ@íè9$á¦Ól2­5ÆCK£K½–%-—÷3P¢ò]†¡”ö6 ô^aPšƒy”° û;ºéhrBŽîc¥ðFúÀú ~¶î(³âÐgëæN„üÛAÊ~ÙvºÉl¤Bö‡ÔÊ^FÕì¬ßŸÉJþ‰¬â|sðN¦®£7¥çI©=\ô PtxtC·,Ê*1tÈ"ÿ–Iþ-ƒü[:ù·4òo©äßR´Ób²Òù,vÈNԟÌHÐO÷åßth~ù·(“3²’>B5PÒÎ(E@)2D@©– ¤!‘ÁJeeeY\3yá@Éåöt/¹øâ‹;p|PÒ¼…¢Ü”LQî¾!ŠruPkPšçBTJ«lPÚêT$Ü(íwiâ;(} Áó9ñÏ8`¿´ú\`¦ˆçÖ7þ I”NQ<¦×íAVÚnd%¼ÝklYÉ× nj]j+5@VjdËJÍ5¥¾€¬ôT+…ÈÞ'+Àß×ZÁüŽÖ -–7µì\ (um£ƒï (] -(u”ÚµT(½ …†ó•ÎCV:¿!¦od¥ 눖.BVêHú§ ËÖ¯fYPwd¥[IÜ܍¬Ô‹~ôYIáڒ•â¬¤ÉÁÈJ“¢E}31¹MV-¶d%Í¿¿NY)ÈÛí§tDÕ,+aS3²R²WVځ¬´™Ò됕> ÓÆr:m,Î3ÞnÍݳ -MŽ•pÅ^˒–L&n˜A&ê-™a˜a¤Ĥb=û~¡¾ø1ú.’µôÍJIÞ¥o»ìғ‡lPú"léIWM¥'kJaNv؇¦Õ·t“1WÙd¥YA±Ÿþj;é´¶™žkk©þXEÈÅ)ú”sø¼SH:ŽÁ§5CvD¶—Ȧõ”z#Ý Ý -]ÇЅáâL=v~ù7@é@©% Ô8•ü[Š.ˆR.ˆt֜Dòo äßâÉ¿Q³?Ñ2*‘‹&ÿåË¿’þëJzñ1‚Ò¬Y³" ¥È%JzG5Pòv/9ãغ— 8p€¯(·JóçÏ÷€’¢£¥õNÅX?PrPRüûÔ%ØùÌÍ*!BߗttúÊ*±c&M/-IÔ‡“ BKûe¥õÈJز҂R¯¬4©²RCݯm¬ùm@SEÇWš+Ê?ÓRáºO+îOV¿§µèæ¶ÖšWoh­Y²[kü€R'@é@©}+…Òv€ÒùÍš`^j(!+]XWÓq‡r½÷R´ŒÎX‹»R‘ïZÖ݄¬t³Ë}ô£ïÍ]´GVÒäà‘•4) 瑕Û璄ûÙd¥ã¥“•˜À‘•~!+}Š¬tˆvû©‹¸‹¾dÛÒ4ÝmDVZ“e{»s·['v®„›j[–,Z²–ÃyK-`0x4‚ö'†‘Þ#ë6ªP¯[ w˜UoS|©·,oêÍJ«mPò-}Ûç%ké[”Yú¦õݏ¼ô­'ûŸ~²TJÙÏ¢¼ù7­›ü+(>¢cÈnªão¥‹Èzú‰¬¢³H%=FæSíh:uÆa·Åèm\Ù¯JϐW{ Íè~ ¨G&‚º2tä±v€ÒÙéäßÒÉ¿¥‘”꧐K&ÿƝC«B³ȿœ£ d"õhãmPŠ‰2ù7] n7´ä2´ä< DeJN}PŠ€Rdˆ€R-@I…¥ 6oPºä’K.¢{‰”ôQouôìÙӀÒ#(½òÊ+/u/qLŸ>݀Ò|E¹¥âƒõJ -‚»‚˜€ÒÇ()š}(}Éí¡1¿~M£p“0­¾Œ£ÿB‚û4IÏ~ -™$ÜhÉÈJ›lY©ªÐ–•Ê臬4¾¾¢üHd¥ÁMåßh¦øüb Eê¾-'iEߪ“Ñï=PFéËSè“&Q h*‹ß­Uo¸r†J½ƒ’©Jfé›%}ÊZ€Òÿ(ÕXÈ*¨>º•‹â»Rž»3 t) t ÔPj(]И¡!‰¹ú”_ªKÅÊ2½·#óå…Ú_Wª_G+‡›ñtÜÁm¸GVÒÌþT’æø•Þˆ×ÉñÈJ:ðq$á¦ùÉJú€Ud(×r®6Û²Ò>héPY鏿*Y)嬐²r‡õ3‹[²EµlYi·-+mÊðy»MŽKvά„ ¢¥ñ”Z[¬¯g4MOü›‘Æ1)_/žLÅé¬éšÅZøù¸rQAԔç^2õæ¥êŔjnf”~¼ü›Ëο¹É¿Eæßè¥ö1íg÷SÖ¶Ðsm-¥ª¨µ˜:‡R›SX’0»ÝP ÙýÓÉ¿aÒî›Aþ áè^ èVðè:†. §³þ-ü tJ*ù·òo)ºêJ¥€R ”(eÚ ”K¡nª÷ÇQp-6Êο¹½²’ËåLÖ-JPŠ ¿ôðÛ%í´¹ÕWíÌ@PêJ=”ÛŠ¶{¥¥Ã ô5 ô •Q¾%Uñ­ÕçÂKK_AK_$è‰#ÐÒaKVR`4ÞnOÉoƒ“•ŠòKŠåç•j›^G³é„zšMßk¨ÃÒX„òVӍ7¾ÔL‘úé´CoI9˜VŠèwŸ¤°yÛIš4»Ÿ¬OЍ†oWJ—J—JZ,\¸ðÂfÚ5™14 ;Wûw¹Þv)‹®.+Ò®®4 C©_|)œÛ(%sOºÎȃ–¬¤âfˆW•„jÉJ:úIÑú³üd%Í¿Ú²Ò6KVÒÙøñe¥ÿ;Æj'&+ùªH{e¥oƒe%Íâ>Yɔ ؚîóvû -,™•pÕii*K'‘@ïñ|3ãh¨;–a\¡†ñzÌÃH^1iFŽ×žT‘i -NjÏ~åXõæ+Ïmy”‚Ro?(ÕVV -οE¤ÈJŸ³Ôô;ÿ¶‡üÛ6“£ŸÈ|ÀJV¤ÍgmÚtV#Œã·;"üÒЫdӞA.z ºPêugèšNþ Pj—¦gÏ”NK%ÿ(5M&ÿ–¤K²Œ›†Bnr©3–EWÄ´8ŒJ€Rb ù7”bAÉ}â ¤Ë9JPŠ ¿]PÒàJ⡟”n ¥§ý@i„¶ ¤ØéJŠ{œšß| ôKS¾4 äò®¤6!ü;îzM¼oMB&Ž&èñzâóD½ÄJÂ¥h2Þn_ÉÓàäCúæ./ÔÍèÂQÙì2EÇ)u"cë I†7T¨»±âäëMudÏ7×lúT EïÞ-Ìïk¥©òΓ4sÞ|’>Áõ'UVV^(u”:J—J¥öMA&d¥ "5ÕÃù]G´tI™ÞÛ ñ¢K¡ÂðU´Àºžj3·PæùNVHßÏ<󉇾I: ½ßˆ×AŽÓᎴd%Åöi$áæ!+-±d%…ÿµÐ’‘•vBK~²´dd¥olYéO!d¥ÿ -!+pþ-´¬@KÇ#+Ù%’¼ÝÛmo·/ W•mVÂy-K~´DÍôiВé7©PßÇD?k(Ð0‰ïh2ÃT°Ö#&y³n X·¸ÄTæN³ N&Û ßìUo>3÷§ÑÞÅ ?(…8Ï!e%€Ômòo܄øòoÉÌ&>Öj>àrj- ,ä,|×QCßÇbô®ì7ÒÈ¿¥“”ŠînbèÆpYšk(µMՉý Ô:E—A3@©aù·D]Å\y,qÈf‰CzF¥Xqq’Jù7·MK(é_fpUœN½Îi’.!‡C»ò€’~%PŠ€Rdˆ€ÒO¯(=¨(Õ”¡@Iaî”þȜb|´$ú/IJ¬Zú2AÏZI¸d½ã`juo÷º\œ +U 5*•f”ëO¬«P?ª¾Žå݆ -õ+H¿ÒT¡þ™æŠ˜}Z(Ž?ÔRaýÞVŠ=Z‰snj%Pº–†o])¦t9 ÔPºPê(µo -PªÞTCS¹ÞÖqg$‹®ÌÄ×â ¾‘~·#+݋Åã!VH÷IÖ±<Ëýô+ :¾$á†Æjš¬4ْ•4o-ˆòÉJ:k˜¶Q6&´¬¤ñ×.+ýWHY)T%J4DS2@_ ·ÛW`é«Ë‰Îd¥)ÞMÝùyúùÍÉל<“šéÓ©:­@ßôT,dSÌ@zÔàÑ4†øïga+››í“¬¬[ºñqkšýÏÎz*so¶AiOˆòÕÌÜÇêQª#Õ +™Â5æß8´¯XAñYPþF[(e´–¢FU¬Ú_Ìúý9¬äŸÂj„1$͆â3êO"í%”¢¾iä߀¢{¡¥[a¤kÓÈ¿ñØŀÒy€ÒïStvO”Z$k¥º‰ÚiIù7ÔÕL{dM¥}tR F¥h“3 DþÍ”¼Œär1ÉJzG”" " ôˀÒñ¤Þ@锾rzAé;—w%õ÷¤¬!ˆ–â5XI¸$’p¶¬ä_2€¾¹y48)PŒ]\¬h;·Tä1­\ 2®žnZG6ÐíëàF -–o6Ñá½ØT¡¾_sŠçµPDïÕR`swK!Îm­ô1n€–®¡ŽÒ•€Rg@©csh PêÐZjÄÐPª§áârJ °Êê2d¥+ÈítcUwd¥[)>s6ØðyƒL3òõ-ÌÀko àÑL†ÙTt0Œ4Ÿj¡ iÙW‰˜´1i•mO2½Þü[˜ø*s‡©£TÛUo5€R½cþbŸ.“ã»}ù7XÔäߨ”ù]XöàµÚ†ëj= ôëÐ*Y‘6ŸåÓYˆ0ŽŸíˆ¡·SÉ¿!=(= -Ýõ€‘º3\É/MÕp tV -ù·dçVɺ_h’¤S\P*” -¹r¥L@)cÉT®O”|ù·hL{QÐÒñ€’þd”" þc@éDLã‰dM;ϒ}x5ASÑ@d¥a–¬¤¹br´€o6²ÒB’pËmYi£‘•HÂíAVúȒ•t†>·e%_µ€°²’¯yÆOS„òǓ•|Þn¿K©4ϵ-Kkè ç£%ÓnqŽÎî‚\çù¹ S®NûÚÌ̶‡9èÑ7Ö36#-¡ õ²t}3>1Éʺú¸÷Y½ÞZ˜„.8yœ ÄHáγÃ{ŠÿÇJ~²­‰ƒòo¤M’ÐäßL»º½Ô.ÚA£Ô3ZMe£åÔ8Z@µ£™ÈŸBßKÑ9ŒÙèu@é¹Tú¿¥êçÝ (ºFº1•þoü·Å)zö@éw€ÒɀR³$í¥A¢öWž =ÅëoäÅaT¢k: ”b’7ÿK×£·7ÿævy() -ø’ÓJÚi”" " ôã”8†:JCÔQ -¹ê͘¹Aés”¾e¢ÿ£‹¶X./(ý‰[ß?… ¥oâ’p‡¡%o7%²ñvçj"]‰¬´¤ow‰&Òée:Š uD#ï××A i 9´#ãËMèÉДPßLý¡æUUU÷¶X¾|yú,7µö\G÷«XõÖPº PºPº¤1ÈÔdªÔT/S¹^܉R‡—³¬êJê^C ±h‹uUúîf½P/|‘È臩õ¥DÍo2W¼Ã\ñ²Ò’pÓIÂÍGVªÄÛmd¥uÌ [lYi¿-+AVú2„¬ôWhéﵖ•Ž+ÿv"²’U2 ÚÛsÃS‰Òx»M­vÚÁÙI8k%œÕ<ZJTnH‡–2 ¥LÄª,M‹Ë²õM/ÉÖÙ]”£ó¼0GsEŽ¾óùf€ŒæÓíÕàÑڙ- -b$JS@5!1‰6o>{’ñq6ŵz½E´0 *8yL tŒý‰Ãåß@µjù7œó¨`&qh¼V;©‹½™ -ÙkY‚VÅb´E,K›ÃòƒÉh £“ušÞ”ÞJÑÕó" ôšÑÃ@Ñ= ·J×ð¯Ë.”ÎMÑKÎL֏¿Mù7@©Q"F¥ŒJñº8óã0*± 4ƒêb©TKŠ6ù7ŒJ(Ù²’(é¿. ”Ĭ”œPŠ€Rdˆ€Ò_pÒW™ûòÀÊÜ÷[eîP Äª7JŽ0 ôƒË;§x@ÉH f椷'´ômœæР$\5o·âä’pæé-/Ðmé¢"AǜRÅû©åŠ÷ãê*bŽ¨¯x?¸¡Âæï_l¢ØÙ¯)+xš)À÷j®(zOs!ÎmÍõn¤…ɵ€ÒUx”ºJ—J¥K¥‹ëó¯zèM嚨mؙj=WPÌðê|×õ¹B°[hùpG¦&–û¨UܳǓÈJϑ‚xÄÛ¤ †ÇêpÇ +M‰ÖG˜¥㑕ôWÛ²Òö@Yé[Vú:PVòÏ¿ye¥Ÿ¥Z@-e¥ $Ü÷!½ÝÞ$œ§Ë –%›–6Û´´ZúZZ™©Ó¹" )Kg·2K´8['{q–¾øEö°˜¾¯K2õìÒ ½ny#Q¤z=u…,1‰Ea¾¬›eOÂm„ŸÛ×××ëÍJ¾&µ¨Ì}, ä¨mþ%€Ò× »ÃVþM'v7•·Róq=ÕW™üFëy¤ˆ§JãøÅÇg4ÇÑ+xž†‚…‡zBF·1\ŸB¿h†Kxâüd½ä€Ò©€RËDí 1 TP*Ç¨‡Q‰ t R©—‘m•¢È¿ù’·a¤`PÒGpR¶-JPŠ P:P -Ûë­5—K-Z˜õz¢×[P “õ6(í¶Aé°# õf’3”þì6·¾ >Z”þ륥¯¼I8ËÛmêv“„ÛInK–þƺ¼Ýù -–K ,+Šïg–êX&•ëÎut]Ù°ú -Òê¾öµF -ÜÏ7áƸ©þ‘fbšû›‰nîj.ιµ¹ˆçZ˜\(u”ºJ—5®¨¨èØPÃ¥ ê!5ÕÁËDˌ˨ÿÜ¥ˆtô»6Oû»‘ŽX·S¥ïÖ =È:ëÇId<¬ô2I¸·¸³õû$á&"+Í°d%MFVZEÎ'+í²e¥e¥o‘•¾‡–þ(+ýó×"+q,îP•(«'á|–>¶,K:VO8‹–Ä/F[Ú-­K×ܸ:C³î:2e -™–gê/ËÔl¿Ô Ñ2VÐve #­ƒ‘¬ -“8“üŤ ¬ö¤ onï‚7OS\}Êcìõö<½.”Âçß\¡òoœXêŒñæ߶›üËô?dÁþ2@©‚µi3ø‰NÀ†=’•kƒ“õ~ öyPzz2ºƒá†«:&ë‰v€ÒÙÉúݟž¤»„“¥¦‰•ô”J…€R. ” (¥aÕKŽ¶óo,lˆu{e%(¹©7â²²nA D܉€R”"C”üA)î(Mq6lXfR«V­‚šâžÃ±´·šâ꘻ñÙn¦)îݎ‡µ9žÒfRmŽ¡Úc´Y 4W›Ý×Jôzs(ôP:à8Lè”!@Éiæ@‰`nJ¿ü%ÊÛÝÐRÈ$\’¯À’©Û·ÛJÂ)Þ¯ÉUŒ­Ê' W¨#˜W¬<½TÇ3¡\aóýº:¼!õ;û7ÔѾ҈xßXÁü‰&™‡›*”öl¶lÙ²;š vn”ºSp²fÒå€Òe4t”:Öc¨«':•“¢+%YG£Œ®4»&O»º!G;5m±î¢TßýiT O¥ ٌ•^GVDnD¬üØZØ!+ÍAVZDn²Ò&‡MÈJ;•ör&r&?…–¾pze¥°E(>[÷qÈJՓpA–¥õ%ÓR -™¸Tá̦4µõéúº×¦kŽ_nIçt•á¦ â•éê4=ñAš^²š†°ku¤-ö27ãLÚKyƏâÄ$_ÖÍÏÇíöړþXàG¥É¿±ZûPú’EzG%“ÛG5ìÔÅÞLáÇ5€Ò -J}-buælRē0"s6³Ñ›ØŽ^€ž„–‚Œîf¸™¡[²†Î€R{@©m’^w Ô:£R‚~÷ 0*ÅcTŠÃ¨Äï>‹äs: ”Â]‚(!+yòo†–4øƒ‚u”" þCA©E‹µ¥„p Th’öRPjÊîOvœy晧;Î=÷Üs:thïèܹóe(écÝä¸[›ã!m€Ò“Žµ9ÞÒæxW›c´6ÇmŽ9Ú¢‚ÅaÀJ‡î4×J[¥]E=(}†Ñò+ÊÂPÒÄJ±@É$ -ŒÄ`fN Š–•¾ó%áìK–·;ow:ÞîL’pي˜æêϚ$ÜB“„+Q؜Z¦€<®ŽBóˆº -҃ë+è¿ÙzÍÇû5VX¼IUUՃM—/_~oÓ¥K—öh*¼PºžoÝ¥+¥.€RçóçÏïTdªËP®g;Óµ í鯤=}·|Ìá¹¢¥›³µç;èûГz}±Îº ‰žáNýîÙ +½‹¬4 -YiI¸™x»+•–"+}Àõz"+íæL@V2¶îÏ8_ÕFVú lÝÇ!+z»ÿ -ûµƒ lžk,K¦'œ-%é›Þ,ˆÙ-mƒ–6§"0¥éü­Oñ¬KÓ¿& nJÓo2hXcãÑ:úœm°ÉèHÛI¸í¢põ^SÀv&1ÉT¹ªžT³=É”j.¡tÌ ä%#+¡d…Ë¿¸3zØaºªˆ±óo¬Ð_Ç´•,F[Âúý¹`üT€~ ‹Ö†%ég;ìy Pê -õŠîne¸–¡ ÃÅI -”Îä§J-0*Ju¥’8ŒJ±•øÝg §¦FÛF¥(oþ-†0(ÑAÒJÎ(E@)2D@É”bŽJz±?(éš6 t’JmÛ¶=PºPêäèÖ­ÛÕ|¢›wis<¨Íñä“O>áxA›ãMmŽ!Ú£´9&kó%a@•C‘p­Cño‹CH²Ë¡¨·ß¡¸û± J_:¾¥J\ (9}wàf¡ŽwðÑÒÐRµ$œ]`ÉJÂiòڙ¡°¹ÙJÂ)Æ®ÊÓß^Z °YQ¤ ?³DAR™bçè: -úÃê‰PÞ®¯ ÿzÊè5R¼ïÛX±ýÑƊ§4ÝÜÝDœs;Mqo”®Ãžt5 t%©·.€Rçú.«ËPx*#EG£ú+‹DKWà ÏÃ!ž#úº=‹b4èE-šG1{ô#›ñ"·ëo°h0²ÒHn¯Ç!+MCVšE[;d¥*d¥µÌ›‘•v"+íCV:(+Xµ€É¿…¢¥KÙÃz»“p–e)-%@K‰^Zړ¬¯{g²NÓö°­) SŠ¾øM©ú ndؐªŸÀzߐ¢aÃÆd=»‰®°[èx¶ÍäÚh€æc$¿„ÛQĤÀ¬Ûñ¶y«ù<הûïàüš–%Ë ˆ^Ò£’éNýI4F%@i•·QóqÕ?À^½”5™óY9OÑxÜE#¥·q½šD¡@é1@é>Èèv†î W2\ -(]„Q)£R¢ÞÖ -PjQ)£ T(åJ™Ü ¤F£MøÝÇYù7d4´ä%É¥Ç" ¥È¥c¥$†TžÈÀ¨”Ë ¸pJ¹pêqM7q´iÓ¦•ãŒ3Î8 P:ËѾ}ûvZG÷*>̍Ž;µ9zis<ñÄ}Ïk#Œ¼A@y‡Ðò>Af’c¶6z'-"­ ­¡¼ÛfZìô%Å°#Å5Jß8 (ivù™=”þfUË3ƒYCDK¡VÂÙI¸4Ð튝›²HÂ各ËÓ̹¤@óà¼"ÅÎé%‘ eB’÷ëNÞ­«˜= >A¿‹ž*¬?ÙH8Ó»±ÀæþÆBœ» vn£(÷œ¼ŽòWJWJ]¥Ëë1Ôa(ƒ JPžŠõâ« ±„çcwÊÅø”Mú‡Þ‡¬Ô›uÖO’ÈxŽ;õWqm ĵ1 ×Æh¼Ý“™5f1k,DVZîƲÎ\±Yi²Ò¸ó#[Vúܖ•¾ƒ–~°d%J8!mÝ´t"ù·ZÈJµHÂùºœxh r-Å{ié`¢¾îý‰:/{“t†v'é;ߙ¬¶=Y_ü¶dMù[A¦- ›“Í ƒù׆­Izɶ$¯„´<ڝà͵YŒDeF_Â-șômT˜dŠxíIÿüQ|ܵ•þ'PV²@É`T -›;DiÇ}4YÛA‘M,Ó_͂ýåäß uΔ&ôï%R¨PzPz¹¨<Ô+‰Bàэüë*†N£’WVŠ‚‘üAÉ,xÓ·ïtê‹w: (±œ„Z%PÒAF@)J‘á7 JÎ`Py@IdT ”t­z@IŽ”t%×c­[·nÅ:•¿{‡q£S§N—:®ºêª®|Žî„‡Šk#x<ëx]›c°6Ç{Úµ9fjsˆ -8„Ë F« K›¸“ÛAÉ·}ô]:äJŠÊß8þHóïPú«3”þæö-…MÂ%ØI¸ä $œ"ë†lÅN+ —¯ypa¡ÀmN±èÔEþqeŠü#ë(\¿SWû­úk×®}¹"ú3 àû4RP}¸Ñ²eËîkTYYyg#ϭԚ¼PºPºPê -(]QoÞ¼y]¥.åü·Œ*Öë®*Ô;®ÉÇ锋ç)÷S–ölډ>”f¼°ú»O³šèen×ßb>Â=ö{ÜcOˆ¡ÌA´Ž~>²R%³ÆJ&Œu¤ ¶ +íBVڏ¬ô1²’eëæœúòoúYmÝ¡iÉ'+Ք„ó³,Yµ"ìžp1†–ôMZú<ÎВ¾îà :‡tJŒÀ´?QgȇL»’tÖv&iúÜa ú5n·#í4êQ¢ö$è½û`$“kóg$ÜÛvÂÍW ”˜TCÖí§¥jù7/(yòo€’Ë›3…ñ¿”>‹¢Pù·ý•vQ{ ù·µäߪ¨[±•szçdòe£ñb¿Kí­D -JOBEwƒG73tcèÌc1*%bTJÀ¨(5Ç¨(•ÇiÏű¶Q %5=Ú6*qƒOþ-–äsŒ‘•,PÒ¿ÜPŠ€Rdˆ€RPÒµP ”t¥$0øƒ’žÍæÅù¼­„+¹.Ž¥–ŽÓO?ýÇÙgŸýG»víÎwtìØñBÁ•ŽîÝ»_ïèÑ£ÇíŽûï¿ÿ>ÇcÚÏhs¼öÚk¯:isŒÔ映Í1C›CTPá,£É‡Ýnn$@mGüÞËR݃´ªüÔ¡ö…”ÕAéoNïó÷´ä³,y’p¾r”$ᒴσ) -ú{M.$\¦èºlÍ~«rIÂ哄+½Í*ÖíëäÁܘ2EêáuJÕ¥—U=Ýõ¾X_±½_ƒ•+W>ÞPø÷`Ã¥K—öl´dɒ;è^r •n”®”ºJ]¥+ëh¸¢œ•òX‰^rU‘^|M&§<x9¤ò²´Ó{2ªªªzÑ/ëÑTãóЍö 8e_g*„uc8²ÒXp=Yi³Æ -d¥ÕÜYoBVڎ¬´Yé ðù‰•%ýd¥êÕ~:[w­½ÝAI8ŸeÉm[–BÒbH¬¡%}ò#ÐÒ'>É S‚A&¦}†›uÖöXƒ~ »íaMF{}xD§Ø|~$ŸŽäc¤hoÂí;_=w€.ê¿Öí˜:¼ÕöŸQÉ¥ïÜv¡@ÉÊ¿Q{wŒ1*Q(€%h«XŒ¶„_â<¤Î©ˆžcñbcùÚ@ée¨ ôPt/xt+Ãu ]õØŀÒy¼î÷€Ò) •â1*ÅcT”J¥|@)›{ƒŒhcT¢£I”1*‘ó% Q(é1J.?P”¸›‹€R”"ÿ1(™pí@É (EqIPŠåJ‰·@IC -¥[ T^^ž£»˜ÔáÂiĞ[X}LÎ:ë¬3¹ìÏ£<÷ÅV}„ëü:ã>ú裡¾­Pú» Jwy'MO!g/-ù%ᬞp -ú¾$܁ÍjþI8ÅØ5يüU¹$áòEç* Ï(VhžX¢P:ªLázhîuYù\OAõùúŠò}èôÑbÀ^ …8÷6ìÜAQî[@Kø¸¯”ºJWJ]¥®e %zâê"½äš½øú|ÑÒM¹dñ²Éçe’Ù£AVod¥'•žMÒüñ*²Òd¥¡ÈJ£•&1uÌdê¨@VZʬñÆz¼[‘•v#+@V:Œ¬dÙºe¥c²uŸ0(ÕÖÛÞ²d¼j´ô}´qyëëþ&Fõ+¦/ ¥ÏŒÀgI§äãx!Ρx¡ƒ “ᦠšMÍ°ß ðÐ{ø(Þ«ŠÓ{„ôI¬ñl‡b$ÜÛ¾„›Û»l³¶bÒqۓj‘ó -›û“ËkTúÆí5*}Jçك€Ò^@i;57RýñC\CKY`PAþmž¢ñ •P…‘H{•”Ú3 Ðc@ÑýàQ†î‰•.å‰ ¥?J§J­âm£RF¥Xۨį=3Ú6*EÙF%·WVªJzÖE­I(9ý@‰;·(E@)2D@ÉJ‰~ ¤g³¥< ”6lXǯ<·)¦ª<÷µÚ‹)õYL©¶5|Kßìfé ô½CáڀÒ_| ä ¥¿[s|ø$œvb%á“pišó¶f„Ë" —£(ºR_tó@}È{hóփZ“·J7`Oº®®Èè@éj@é*@éê ݊ôì5…zÝõùŠÏ7æê½·fk/wf‰¾zfˆÃ¢7ÖãÈJO#+½„¬ô&²Ò;ÈJ#Y:=žíid$æ1u,aê¨bÖX‹¬´™ÚJ;‘•ö!+BVò·u{«ü¼ÕºCy»}²R0-Jµ ¥?ùÑ=´d¥ãŒÀëE¦#™âô[;çå&<Š >6dçU }ëÅ#ÓÍò#ùt$›‘< ·€en!Ť/ëvœù7¿B.ۨ䶍JQ¶Q‰";è"²‰eúkX°¿œüÛB¸} 4è} Ùï@Õõ6½ëWVVÞ__Ÿônº—ô „Ò-€Ò €Òu€Òµå¢Æne €Ò5ÅT•+Zê‘ ieÁ\ÚéÃiÚ}Ze=C ¿—’̝ºã&¥‘LO㑕¦1ÌeþX̍v²Òd¥Íغw +íCVòÏ¿A‘N“C‡³mÝǞ;NP -%+…Z W3-ýÃçì·iÉ'0ý@Ë×ï¡% ™¢õñ¿â|íå&<ù Pd‘Q´O=ªŽG?R͌äM¸ý”bRX½®F£’Ó• (•Ü¶Q‰ÒŽ{£m£RŒmTâ÷WÀ9ƒTÙx’f#P…Þ&‘ö* ô (ôPt_•®g¸’Ç.áÙó¥?J§J-ã'Juc££RŒ×¨”aŒJ(éXܺtã ¥·”ô_·Ë J.§7JPŠ P2 ¤«" -ò%]œ I(é‰ ®Z(é½%$ðêbTjÌî[âè>G÷ï¹öÏ·ÝW;ºÑÒÑ=vìØqÁíqÚÌäsÛ¨äqtcT"ÿöWG@þÍ3÷0X]>}kÈh)lîÓD˜ endstream endobj 89 0 obj <>stream -Á$á ¥]iš¶¦#ÂdêõÃ,Ý}.Ï9pàÀ¢<Áܜ|ÝÍN+T¸_D±˜š5”jP¦ûj™>Õóå+V¬è[géÒ¥Õâ@• ZåYYàVà•®þ8Í×û!+½@ãב•aœβ 1ÜmOán{v´Žy!²Òr2âÚ؈¬´Yi²Rµü(é—ãüÙù·Ÿxý[-’p!iÉY=÷`É´¼ LQÞÄÜwÖ`¸É7€B~Ùdd’kÕ𨺄:×vì ·Ÿ”Bå߬BN»¢’1*¹l£ d•¢l£R´×¨´Ú•¥€ÒÌ8cTÒó= كI¤½(=õŠ`¸Fºá*þÛPjÇKΔN”ZJMâ0*Åz݅1aŒJ Q^PŠeˆ†‘j%g”" þÓ@É”t]PŠ·@IC -´”ÎK²‘Ÿò¹ˆ=Žní¯!F%ãènc·Çõ8º/×fµÇ½…y6¿®oµhfdTRèÛ®ôd°Q YéoŽ0 Š–B%á¾õ%áì$\²æ€½)$á҄›Óuë2YWe+².ÍÑá-ÈÓD0;_‡;¥Pául=@‹Ìß)ÑðV©Bý+eúhϕ)Ú>U.ºy´\÷A:¼õ,ûÜU& -ꁏûV@éf@é&@éÆ"þUÈcù<›UåÀWÈJ=3a®tÑ×£iâ°§h•õ<²Ò«,)€¬4Yi²ÒDf«™ÜmW +-eþXŬ±Yi+²Ò.d¥®cÍ¿ý+0ÿöÒ Ӓù øh)™ÜÈÄMžÁKA¾á{kð¾ä‡Pxdv¸®­Fò&Üþ'DÂ-”˜tb'ö8Jœ˨„½Ë2*ÑúÍgTŠ6F%aÊZ¾Æ¨´ZŸ ·OF( xÞ$ÿöô$<ô dtŒtÃÕü÷2†öñzÉ9ñº¢~_gŒJºÔÄRzÒ•lPÊ⎠z2²R"ù·xd%PÒÝ.=Q{P¢ì[”" þ3@É EÁC”b¹fâý@I—P/ÎãmEäßʹ„pu7èäqt·mÛÖÓõí2Ž2T3“'´…4*™Ò“AF¥ Ò“&ÿfŒJa**ùŒJ!AÉé%}´Ú²dwÐ% ghéH‚„KGìIAzIÓó¦tʚLEà•Yºs­ÌQhžŸ§ð:3_‡<©@Á˜"ÅØáŊèƒKôÞ,UйT8ólÙ²e˞,â£J@ÉcT¢•mTڃQiű7`Túg) 4Ÿát@iˆ3£Ò@°çèi@é ¨'xtÃu ¶£P:×ý´:%ÎvtÇÚF¥ãè¦Gn´Ï¨¤+ÔcTÒ¯=Î% Ñ Q~ ¤× -”h)¥(E†ÿPÒõá%].1 qŽ¼¼¼þ•ÄÊ³Uù·®ävå1*éªÁ¨t$ȨÔO›ãemá+*™ü›`b¥C±sÝ1 -°ŒJ”˜ÏÿœÜ¢¥–%›–¾…–¾Šƒâa†Dè! Á%é%U¸¶ZZŸ¡üa&Б~ä"¹¬ïÉ×l0¾@qüýBEôw‹à+Þ¿^\UUõbɲe˞.©¬¬ìS²hÑ¢Gèð֋2“=© p7>î;a¤0Òí €R@éŽ\^’Í‹³x²Rïtv…¬ôt -»GVzÚÇo³¸h²Òh“õ@VšÅ¼µ€IdwÛ +­GVÚJµ€ÝVþMtx80ÿö²Òvþ­Z¡€Ÿ>ÿvb´d§ãœ^Z -…Lÿð£žüØ'ì`^ð¶„Ä£0Œô?µf¤Ÿ”ŽjTú{H£•,£’@éåè6F%¯£{5d¾Ì•b½Žî $ÍFJƒ¥× gmG÷ý =`¤î¶£ûR@é‚xÛÑg;º¥z•JblGw´~ãþ ¤º”4ĸ (é_Q.¤›o”\>Prâ’ô%›D@)J‘á·JŽ ¤«ÑJº$= $Fò€’J)tÁí]\QQÑ«Xt t t tgÁìÙ³ï”îÌã±\žÍ-õÌ♼7½¤±?d¥è.ú²Ò@d¥¡¤9Fq?ÑLTÌ$ó1qTâv]…¬´Yi ²Ò.òoû‘•>&ÿv„üۗäß¾u£ þBÇIKµA&ûgš›‚@(bøçQð¨zš­V¹¶—‘NĨôg˨äute@ÉmŒJú í§¿ÚNݛù…­Á¨´PZÈïo 4 PzÎy‡üÛ€Òsñ^Gw/†;a¤}Žn@©/9Û8º¥“‚ݔž4F¥hãèƨå5*%¸E”bü@É”œG%WF@)J‘áß”ÌÏ»:(9k¥XGnnn;(ábªËžq·àOšBgZ….âM¡€ÚæßÂê6ù·šëOzåþÑn”ë%#+‘1²’#(ÒR oÒNA–%hé`"ÒK’pmg -y«TÝ¥®OSÜý0]¡yy& ’¥˜=7'Gw½rwGåiJ–¯àûvhðÍ}җ *++Ÿ+„s -‹ûJP=é¡ñÐdÝî”î”î”îÏÑð@–ž}(“gð¶ôE‹õMeW)Úé+ÉÚý[´fÌì¬ÇË}üî»g3“,`&YFväCòoÈ¿m#ÿ¶›üÛd¥ÃŸ‘ûŠü›”˜*q£Rmi)$29|È–›Ê7TC¡êU{y%Yû{3I{DÇÑaäßL=ä‰Ü|Ï`:™Ç¼µ„™¤Š¹l-ù·ÍäßvÛGþíF¥OYÿöù·o•þÈ,Y³£û—¥Ú -LÕ¸é¨ðtŒÃÿšµ~Mx”‚ݎ°Žn»F·Ë®Ñm9ºõóñ8ºõ“Úm×莱ktێîQqvnØçy(è »F·oé›qtwb¸ÐZú¦«çtøê$ÛÑ]ßvt"˜æòóö8ºõǓý@IC,C4bR5PÒ| ä<6PB2€R”"ÿ;( vª’ (<Šñ% I<‘ÂKÒyq—U—UûóäßtEyòo:ßú· ú“7„¬?Y½ÿÛX?[·fû%¶­{ÝQlÝ5ÉJÿ”•þågصi)¨‚·‡–PSŒe)ÏN¬&‡Ïã0<Çûí·„kû¿ø⋝I:¨-Éä²RÉ9¤éh—§+/ÊPž›©`>=kÓ¦M³Ñx²ô‡çh"œ³bŊþ¹K—.}-wñâÅ/æ.\¸ðYš»õ£pғè#=Îð ô ô8 ôD†^Ò7]/~&Mo{Á€ù·7“´ÓAteFK­Q®1÷ñә¨æqß½˜Eّ5äß6Ù ´P:HþíS—”¾ö¥êF¥_jéۏL¡áéX‡Úÿ¡_ú¼ÍÑ]”jáè>ªF·åèƹÇïoŠµôMׂYúö ô"ô”½ôínéf†n V3žõkfoš™h/ âlGw¬”²øy{@IG-Å(9# ¥ÈðÛ%óãJyyyn®PÒuËϐÈcFVJãř\Ĺ\΅ÈJ¥ì¹mRšÐÿ­%×þ©DßshçÓÿíbŽ¾ ýß®åãß¾ÿ[-Ê*…²u×\­[qPÒËã6 $Œr»th.—Þ”(Z‚Ð}Œ Ô½{÷(E@)2ü[‚’“«ÑJn@)ŠK(Ú%]¡qü+ÁÈJ©ÈJ\[Ù\[ùìª[w®ó†üµæôk­û ú¿µÅÖíéÿv5ŸæF>ëÚ½´ÕÆÖ­ÉžŸ­ÛTë6¶î j݊ş…«\­Û—ó%³:¨rsÍ´„ûZ:-}¯â@ëÆ?ûì³íItQOÆ¡‘‚(U÷«•i -áé”YŠíS3‹Çg)迟¥94°Éq²—,Yò½o_¢¯Ûó”â~&™Ô× 0Rß ý¥g¥çÓô◥×RtæúcTŒQi8ù·Q•&’3«Žæ2x@IÇç%ÞvŒJ{0*}„QÉ”H´üöÎ;Ωjëß9é=™Þ‡†¢""*‚ »`Çk/Ø®½‹Š½¡ØQ”* -"½w¤w¡÷^­×ÛÞ÷÷[Ï>IN’I†ëû¾gþXf’œœÎÚyöw}÷ڇ JF>øßá¦ÿ÷§AÄC¥*݀’á莀 -dléÛ*Gté›êÑ­ݕ–¾-Z´(n3ïÁ73áÑ }éôߐ›º> T ›x‰K-}ÃÑJrû•aÐQݺȏeˆü$wë>Ôn?¥ìPûWuh)¶1[¥þ‚¬¤hi¿ƒ¥`áv©"œ‹B•o——d>֒ù©>älgð¦„d–}d† ÈC2d>=0S¾!úfɇì•5mÚ´îY“'OÖi)[°ç}6À}—=KÞ¦qR{Öº½™ í3äoo…åÑw¥€R'@© ŽîOqtÎ7N”äÝ(ÔAI.äT¦Ü³(ÉÕ¬À¨´£’JÊ°‹Qi/õ7”´£”Ž©P%(¥stWZúut'/}s›™HŒuG73ùŠ–ñ½àœOè`ñ>·h;(èyÐþ nÛû`¤Ö„ëùõ -¸ˆ§œÍ“› “*P:æ*G¦*u³ô PʍRˆ{Ü-ђüê°Év«œ•JÖ ¤%㓠J&(™áH%u£WJØc¥®fÕAIòÒN29Š–Ü/øI°O΄¯r• -H°ÝÖ]¯^½ˆ­»1;Í)[wsùI¶u·fàP¶îÇäÇò¬üX^“Ý֝ԭ;¡[Àx‹|ÛO‹ÉJ‹tYIu ¨¼ \ê&”•»ÄÉJ–4]šãŠpÖXΖP„S´dX–¶ºaÜØ4<Ø4¼ô“ñ Ì-ò˙ΠȨ<#(£÷ä|‚±aJ`a\C2*̔á¿O¦ Í=³¦NÚ=KÆ珳&L˜Ð™½o?`»’´â~—en塚 ïJBTƒòä΀ÒǀRw@©_1}™®”†è $_ ñ $çW]P:¥¤¥o’fJf8äT.¬îÒ·„ÍLv%nf²ÆØÌÄÛÌPçfé5”ÔrLÕA¾#ìó& -^€‡žä¶}Fºƒp¿^Éó”s¸ŸO”±MÏñt¿P Tƒ#¢ZåRèË¢þ¦@)`€’=(ÉY)P²¦%¦o&(™ d†c”${âA); .‚‡¿ùx4¨ËJ’eÙdY‡ŠØºëÔ©SλU²u_ ?ɶÊ֝ԭ;©[ÀWèÛF·€4›ÀfÊ$ËJÑ=J«AK¿ÅÑR¬ç çdy˜*¹¨>¸ù®ð°úÇ+ßK}x€ü2>ÏàMʨ<1$£ò˜|W ˧œä“!_}2§OŸÞ3sʔ)Ý3僒)´ô[ºub»’Ž´â~ŸZ[`¤÷“>”> Ž?¾K@@éS@© ô_1ýøbùPúŽ*Å(@i‚JrBP’ Y ”öíۗ”°ªT Jº¥ofHª¥Ç,}i—¾íK\ú¦ïúæˆ-}sƖ¾¹ØfÐ-wÝpp揀Mo/Kߥ؝°=ô<ԆÛöAV#ÜI¸‘_¯"\£Íi¥ÚP:P:Pªx•qä"T«¼(…‘•" $ÁMpé $T%9” J&(™áØ%•(iq $ydƒŒìê"¸ùÕË£DY)7&+•røZt ¨ÇûžH·€S»u·ˆëÖ­º¨nÝIÝޓŸôÝÔ&pJVR›ÀBÊÞ-à_)e¥$ZJ²,ñ5a‹á¨"œƒ"œë³Q„sãÕðy¬ðnÞ¼y‰ONt¾KP`åʕӂò &úF‡dh–ïŠÁaþ¿Ê T–”!´ôY†`O× ¡¥Ù©¤3]¸?¤qR§p4|#u¦êÖ%(Ïë -(u÷Ëk{úä(½ùv( ”†J£uP’/‡i€Òì(ý@î•,}[ËÒ7”Ž•ÊÑýïCYú¶G÷vcé›Cî¡ -ÝKœôËPKߥ €ÒϲeËJ}¥îÀ·>“· —Ù~çiZË?D¸ Pº‰µ"´àÑsy^3Ъ1Õ€£ÔU ä‘Œ*¦þ¦ƒ¶¨(­Y³Æ-y(ÙåW”lò”(Ék# $G6AÉ%3[ ¤" (Yã@I’S’S% ^ðÇd¥Œ˜¬”¬TŒ¬TÆÕÑ»D»uŸÎ p¶Þ-ÀèÖ}+Su xD~’»$mgÈJcèb’¦ eM(«/+%t H®¿¥ ¥&ÓR´gÐҏvU„cõS«“„^„Ãíf ‡"œWÎq±Odž_é™~ôœ^¡ |aŒ -.X°`hH¾+…eRýUXé>ah)Œ4-uƒ–ºÒ€ûcšKvQ! #&u”ºdlÿPúÂ7}úô¾8`R×øP(”&¡(©7s¥… -”ìQPZg3@I.dõAÉØÃÃ¥#'æÒ·Ÿ0*íOZú(­wÄzJó]ìúæ’û~¢[²v$ 4Pêë•Ûñ3=¥wüô…žŠ&Ü (ÝÌ¿®!´äÑóxÞ€Ò)>J’=u9TÍ(åSãËÖAiÕªU§% ©(É´E%k(i‹o5”LP2ñJ’$iAÉFrÚÉ-'AÉJ‚/&+…yYVLV*Ôe¥òòòÚ¤}}œä épj\·€–-[¦î´ œ’•ºÈ.+õëׯ¯eðàÁFÊñ4¡ü’•b ”Ž–ª°,áÕ°S‚PE8hi‡“%@á6BKkݬ%ó°üÞ»qãÆE>»¹~½¿÷Ë`>%€a( ÓáQA$Ÿ|¾A!h)$#u_héË0úPXè³0ÈD_ÉOi …G„î:# Zõ¢ádÜ¥oXN=PGi 4Pš¥E€Ò2@iU*P²š tt‡C¥ØÒ7›%f v”XÓà U ´Pš (M”Fy$s¿õ -—ôƒnzø„s>”Þ€^õËÍß6 ·í£!£¿ä.¾…ý…p)œÏSÎôÓ#P:‘ÔãPµ¼B_%”äÏÀäF×AÉ%§M¨”d¸‰€ K҃£— J&(™áh%K(eggk¤¤%+yi#­(9b´/+ÉóB1Y)‡ÄŽÈJ’j5y·ºUv ¨´ œ’•ž‘6‹oBÙ­[7Մò‹XÊJ²’ Œ©e%A’m±½Möbë> Y)=-ŊpÖE8{¬ç -mq±W(²Ò7öŽi/‹Ì|k×®ã“³Ÿá—Azr@>˸€ õ#-e¤D ‚–ú…¨¡…‰Br z†à!<Û=bás©'Τ/“úPuëOÕm «„³{{FŒ”Ƴêm - 4“oy€Òb@i¹Jò%·PÚ (mW¥7@i_ܪ7”Ž²pH=ÐTAIï`—ÉÉV;.=@iµ“N¹å¸ä–Ÿé–[~²[àd4 4Pêï“Ûñs8§‹_ˆç=Ø絀ܱÏÂCAF÷n%\K¸Œ.à)g)Pâe 9@}ŸJ2(à=r܉ Dˆ€’üËiW $O±ÙäÉ6”¬&(™ d”@I((”$9'ÁÅß"²’P ( ånÿ -°éÅÝþ wûûÜíí‚@ÏÇ@龐„Ö„ëWðÀEAš)ñ¼&€ÒI¹½ó+P’ì)E«*ðÊd Ç#o” (… P"¸ò«Ó.8ì -”äÉ6›Jrd”LP2ƒ JI $e%/m$˜JN‚›<¥B@)W%y·%??´äå¾×AÉ¡@IžbOJV”LP2Ã1 J’.Uƒ’T³œº¬$ÁãJV -T)+ÕBVªWeÊ+A®c,‰ÈJ=öØ£4¡|†½M^±¼óÎ;Y©{÷îñ²Ò°aÒd¥ïãd%ú*hB/+ œìL!+ý¢ï— +ý#­¬”¶Ë’–X„³ÆŠp:-Q„³G‹pÛH4NùþØà’S[ãš«p³Ò̍•ÚƒWÈK1Ì»|ùòé&CK((ŒaYÐH?ÒnW…LC@&ÅMßúŒÀÔچŒDK¿±ˆIé‡î -|ÜkXð¶Aù¸¥íú‚7ù{Ùëí{½)PúUo§s¨ ôÏf¨"¤%Bl‚?7P ÄJ[ԛ%¹Ñ79£ T¥¹€Òt¯ÜããYÄ0œE _³ˆáË %¹Y?{ڇ£ Ô†¬ÐXì „«øÛ%<ڜ睖[þä T $‡ª}¢Ìæú%„Úi凖¼.Jò/§C*Jòd›MRÍj“,‹€Ò´iÓ4m„ q ¤™ d‚’Ž9P’ÒHÉ(InYɲ(y½^Áɯ†¬äK!+åÆÉJ M(Є2"+É9Gd¥«®ºêJšP^Ç5¸½Mî¥ eDVzíµ×^ao“·ØÛ¤{›|ÊÞ&_°·ÉWìmò{›ŒfËÜIìmò={›Ìco“%‰²ÒFd¥­1Yi²Ò~]V’¯üêËJFÅC-ÂýȊ ½‡c³í­Ì¶7ñ%²žeA«]¸¨]1Zr˔[ÑÒlì¨ßCKSYË3™åÏh­7Ž¶1céÒ7†v{£ÃüHcéU<FšÇHr¼™|CÌELZ'&ɬž´N¯ºÉùmÕíIòÅ·PÚ(ý(é Þb T骙 tĆô͔ҁүɠÄ.рÒf@i¶¼ -V{.aµg(ù£ ô  ÔPê’›º}WÛÓ¥þ¥Œ((=˜)xt'áFÂU™€4Ï =·%^v¨Ã¡jä–/òGA)K%¢€JtPBXu8ä)Õ¥þýûG@éã?6AÉ%3 ¤Ò (YAI‹’<²’hÉÍSª!+•¥ØÛä4}o9ûˆ¬$°{›Dd¥‡~8"+½ôÒKϳ·I;ö6y½Mº°"7"+ 2d­rG°·Éxö6Q²Òld¥…ìm²Œ½M"²’ қuYIe7M(#²’Œí?JY)II’• P2¾5Òá~OU„³E‹pñ´D} ZZç”)w„–wb´4Ÿa}.‹™4†™N/½©ž(2MTÜ©0>ö¯ …G2èO†‘¦ÂH3`¤Y4•™‹˜´1i1kݖ9bbö¤õTÝ6cOږž¤@)bOR µ'¥¥ÿ6Aéˆ -‡JQýÔ¥=Üã;tP’{( ”æÑc:m1&ÐDlDP -ÊÝه|º‡¥ Éä·(±ùáS@ÑCì}'á&ÂÕYò·‹_Y)-y¡%7Sùáp*P’'G@IPí  ¤™ d‚’Ž1P²Ä’$X”$߬:(IúE@IB%YIQÉJá8YÉØ2·¼¼¼ãA¼¬tæ™g6¥ esšP^LÊ+hBy×å6ö6¹‡&”Ð„ò† —ŒÚ³·É4¡ìJÊ^4¡@·€!4¡Eʉìm2Yi.M(#+-§ ¥’•6 +mÁÖ½[÷êoJVúQ—•PI•þ–^VJ¥êђnYbmPœe‰Þ|{(Âí¤åÌv,KI´´ZZɾëËÙüá—|»èȄub%1ÞÏÕyHõ« -ò”ùº„$bµ¶%ºŽ$—d·Uq7yóMʙ”BLŠ¬uKªºª=É¥#$TJQý´ -P’´Š€’ÜHëSR@@}bPîɑ!¹O‡…êûf,Y²ä³L@) PÊìy%PÊ`y8PÊ”­-€§óx´Y6 Ä+ðÚº¥,P -ÉAó¨ìeQã û£ äK%9ƒ8P²› d‚’LPª(i:(IæÙbÁNP´äªŽ¬TRR/+5hÐàxºœDÊÓèpM(ϧ[@K>o+.ÄM\Ä;iBùM(Ÿ [Às4¡|nï҄ò#º|F·€>t ø†nÃè0–nSè0‹n hB¹”&”+±u¯ÃÖ½ Yiõ·]Ôß Yé'd¥_¥ß, ½þQ Yɒ¦§o‹(½ùTî@*Z²Gii´´žíD×BK«Ø*«Â)t³Ü™€L‹Ù‹}a!ð üª“OQxäT’¼v9:R…®#É÷ÖZ -në퐛“¶ &mGLڕ,&!¼ébR”â«n†ŸË¥£ ”¬I $w„Ú¿' ”¶$’On¸ù~¹ÿ¾7@) (eJ™€R– Nçl@)PÊ”r¥<¢»ón&´"´äoçñh3€ª1¯hÀkëfÉP–!ÄS”B -”ä=tPBVòAKn¬É äH¥©S§jÖñãÇ[¬&(™ d”ô”LJÖdP’àÔiIÉJ’†[©’¬TVVV¢ËJrBõp¦9ñ¦t hÎǺ˜nWðñ¯å -ÝJ·€¿bë~˜nOÓ-à%lÝíY‘ÛƒÀ'غ{bëîO·€oé0’n°uOÇÖ=‡n‹è°[÷jº¬ÇÖmÈJ»‘•öÅd¥Ÿ-jÿ2%+¥r)W)+YÒÉJZBî¶|ˆÐož‚–¶Úqy³ùúö]琯˜5:2Á91dZ¦ˆ°ŠÑ–9E%¤•åGRµ¶4Œ´1i7bÒ>åL²bRBÕíïZšª› JGzˆ%BJP’ÿýdPr $œ­ƒ’Pò*P’»N¥  ŠR& ”(e ¦tΔr¥<@)PÊ”ò%B+BKþv6ãyyEƒÉýºÙ€R& „L•”‚€²RÀ¯@I‚J”°ùìNyr<(Éá5› J&(™Á¥ƒ€’¦ƒ’ä -&+ÉAՖ¹Ù¤}@gPFÊrNí8ºœÄ9ŸÆG8“Ot>ÝZÒ-àj.ɍغï [ÀýغÇÖýÝ^ÃÖýÝ:cë»7¶î¯±uÅÖ=[÷dºÌÄÖ=ŸnK±uWP[Kým#¶î­ÈJ;‘•ö +픪%+É·ÆaáªAK6Ê]ÐÒ¶ÊÚ-m†–6Æ&™” ¤°Gç¦(<­0‚.IX©*l -Ôka¤uʏ”ÈHÛ(¸í´Ei/bÒþôbRÕU7Ӟtd‡jƒ’-(9% ä6@Iîµ¥~@) ·ã÷AÉƉa@)PÊ”²—.]úY ”+œóv ”?gΜ§ ¥@©P"´"´äoçåJù€Rž<¹An ”²¥LJr䬠Œ²’Ûk€’°T”dÜ0AÉ%3˜ ” -”T2ES2J’t(Yã@IB%Y)Õ"¸üüü\Þ2"+Õ©S§¶îzœdlݍ±u7e9[÷Eغ/çB\Ë¥»[÷ÝغÆÖý¶î-:uz[÷û–/¿üòcËÀ?g¸~غc끭{<¶îiغgS[Hým¶îUغ×Sی­{;¶î]€Ò^êo¥ˆ¬Diø=QVª‚–ŠpÿJQ„‹l¹³,)Z²¦¢%é´¤¦;wn¶G‘)¢2¡ -éÜ…§Õ‰!ò€RÉËmTǃ‘¶ê:’ÁH˜Ü F²¦s&i•»(T!&™ t„…?”6ë $7ðJ_”æ%g„¥Œ5k֌̔ä”%¬Ò7Pʺù0PÊ” -¥B@©R%B«B[w lÝWs™n`¸ÛÙî>lݏ± ܳt-y•™ÜÛÔß>d¸ntëþ’úÛWÔß¾£þ6šMà&± Ü÷ÔßæQ[‚­{õ·5Ôß6PÛJýmõ·=Ôߔ¬ô# dÈJ;tY)±gì$OKH4)hi?´´×F“GUK˜ dڄ*´Q—†T -UPªç©W¨×* I¾¼¶ÁH;Ô{$3Rª‚K 1)]Õí¿ÌªÛѪ¥$’=(yäÞ]獁R Já(eJÙÂ*}rgºçJù€RÏ˅€R«ÞŠ¥b@‰ÐŠÐ‚¿Ë£Í -%¨ªA> „$U–#ÄS” (eÆ@ YI%ÁE@Iþ¦ƒ’ PrJŽT 4bÄ‹Õ¥Ï?ÿÜ%”Ìp ‚’J«hJ ¡%IIª%+Iž‡°ugòn9غ 8êo5±u×ÅÖ}'~2Ÿãt>Ö9Ôß.¤þv×å/ 7·P»›úÛCtënCýíêoí¨¿u [wºu÷ þ֗n݃èÖ=œúÛ8êoS©¿Í¢þ¶€úÛغWbë^Gýmõ·mÔߒd¥Ÿ¥_¥ßb²ÒEKŠ7hé—-ý¨™AKû %]`ÒqÆ@¦¨i ì³E ƒ pƒÇýM=O©GQ<ŠHHx¶9üž¸Z›b$úKŵH,¸DL2«nGvøïdPªlæ>(¹%w(UøåÆ\¢@)¥ ™J#²¥@)PÊ” -„sÞ*”Š„}ž*”J¥@‰p5¡E1 DhV(AU'ÀWuòæϟ_–¥,@)Pby]YÉ«@‰ÞJ.ïÁAÉf‚’ Jf0Aé  e¤(%ÑR´e@¼¬$ RË þ–ÍûæQ+¢þVƒú[9ݺ£þ֐ÁãT†‘3¨¿Gýí®ÆU\¿ë©¿µ¦þv¯å•W^y”úÛ3Ôß^aýÛ[Ôß> þ֕ú[/êo¨¿ ¡þ6ŠúÛDêoÓi«4—¶J‹¨¿-§þ¶šúÛzêo[¨¿mGVڍ¬´/&+ý -U*ÂEAéŸ1PJU„Kkð®DKÑJœ¢¥Ÿc´tÀ-Çí!Ón™ô °²'[4l‘ÑŽD<Ú­ª{¶£ŒdÔڒéo±æ’ê#ü³Úb’ JGXHÞÂDg¤(YӁ’Prʽ»PÚn€’/JA¥¹aI¿é€R ”# ôM®Kï|IÓnJ -¥b!ž—J¥@©TÒùÎR@‰p5¡;‚j -K UP(ˆS'PÊ”r¥l ¬Ì(…¥@”œ -”< -”äɕ@iʔ)•@©_¿~Õ%5Ž› d‚’ŽNP²$‚R*ZªBV -‡Ãâ2r8ƒ…†‡š u9稿5bý[>àÙ¬» q×êÖ¿ÝLýíNÖ¿=Àú·'©¿=Ïú·×©¿½Ëú·Xÿöõ·ÞÔß¾¦þ6”úÛXêo“©¿Í¤þ6ŸõoK¨¿U`ë^Kým#õ·­ÈJ;¥=€Ò~d¥e¥¿é²ßՔ•ªKKñ.ï„rœ.0¥D¦(7Eô¦(AíŒñÐÎØ£»b¯ØcS¶<:`ø‘¬ µ¶xFªÆ2·4b’ JGR¨””=I%Ó@é—(íK¥M^¹×*P -Hª-6@)S@i|¶dãpJy€R T( (µ/”J…}ÚÔ -z° Tƒ½ÞW.!4‡–šÂR'JE€R ”(áyÒA Y)”¡@I‚YÉí7@Iµ»(ɛG@I¯ÙMP2AÉ &((i‡ÃQIVŠº•";ÁIb{Iq?ɤþæ-³¨¿åq.…ÔßJ9ÉÚ¬«Ï¶&'²­É)lkҌÏ{.×à®Ð•¬»ŽÑç6Æ¡{Xÿöۚ{ý'ï·¼óÎ;[:wîü¬¥{÷î¯ÒòúO~HÿÉnôŸü’þ“_Ñò;úOŽ¦ÿä$Ö¿Í`ýÛ\êo‹©¿-§þ¶šúÛêo[¨¿í@Vڍ¬´PR²ÒÏÈJ¿Æd¥ße¥Ã¤¥T.o––JȔ 2ÅsS5B”Œ"êQ â$$Þò :ReF2Ť£,¤öq§%»%´WJ.@É­@iÿþý}’Vk¥åA™“, - (Í”¦JcsV¯^=4¯¢¢b`°ÊEÂ*]‹l:–J¾QCXå…2aŸ'kJß_SxèöZ‚.×®$\ 2AŽèÔ¨P*”Š% -x…xžrs”2³“@I‚; @Iþæð&’š J&(™Á¥Ã%ƒ–*ÉJj'8%+Éñ<Ôß|€RõoaúOfaTÊŨTÈù•bTªÅ¸Q¤«1F¥¦•šsI.âÒ]ŽQéZŒJ·Ð(ànŒJaTjC£€Ùÿí ŒJØÿ­ F¥•úZd¬û†þ“Ãé?9£Òêo³¨¿- þ¶”ú[õ·µÔß6"+mEVډ¬´Yi¿.+É÷‚!+U*ÂU J)hɒDKÑqå¸2ý‡LÑœÁM?ÅØ'mø)ŽŒ <’ðkœ„”´®­2#U¿àfŠIGfHÚæ- (ý=”~v ½:Qa¥nRPÚ(­(-”†·lÙ2+S2oJ¶LVÆä -(}—/)ùU¡K¯bÉÐOJlÞ¯!œÓ®LˆçùšÂ>OÔ -º¯–ðPëڒÎ×՞1cÆüë"hélª ¢ÓI5äÉÇ!D•ão*M%º„²%êoސ J&(™Á¥? ”T"¦¥xY)¡þæ"»Ý€’—÷ðón!F N#›FÝùŒŌeœx9Ÿã8ŒJ'Y.»ì²Ó0*ÉÕ8«Ö£ÒU4ê¾ÁòÒK/µÆ¨t/ºŨÔÖÒ«W¯W0*½…QéŒJ]1*õ¨4£Ò·•F²ÿÛö›N£€9ôŸ\Dýmõ·UÔßÖ#+m”¶J»•öJ•âiIÉJ-%õ[J˜â‘) 7ý’‚  ú9éyÉꑁG‰e¶CёL1騩ªnÿ•èãŽo¡„ÄJÕ-”˜aJ[¼ -”dþ± -Pú!$Y¶ Còmf–€Òä¥Ñy’ˆC -”ú °ô”>.]¸pá{eJ¯×”¬}®–°Ïcµ…î…Œn+—pm¹äôå„ ùÛYÔiˆN'•EA©6þ¦Ò"!žÌá9y’ûI ä1@É%›§JP²™ d‚’LP:4PªDKJVRûæJ†:uP’<÷ñ>Þ-À(f<Èbdȵԯ_¿€ŽJ%tTª…£».•ÐQéd:*NG¥³¹VÒQé26ʽ†ŽJ7ÓQé.¨è¨ô$å>ÏF¹¯³Q:³QnwŒJ½1* ¤QÀPŒJc0*M¦þö=õ·yÔߖP[Aým ²Òêo[¨¿í”v#+EŠpòåð3 ”T„û{µ‹p ´ôoƒ–RLi‘)‰›~‹±OÚð[Ü+¢dT 韇ËH¦˜tƃ-x3|Ü©¼!ÀJ;< -”˜uø”Vwîܹ4$Y6?cóæÍßgÉeRÎÚµkGåI"~[°bŊ~EÂ*=J”>ª!iúnM¥×jIÖ¶­-ìóh¹ Ð=0Ò­uþB¸ Pº€¿ -ŠèÔù©>®¦Z€R –ðÌá9ù@€R0”\Á((Ù ”¬‰ ¤™ d‚’ŽaP2QxÈRPRÛÁÉÊEž»Éx/Žn?ïÄѝÁ eãèÎãL‹pt×ÀÑ]Ž£»>Žî†|èS¸gp™ÎÅÑ} Žî+Œ®ÃÑ}Žî{è¨ôŽî§qt¿„£ûM:*½OG¥é¨ô9F¥~•aTŽQi¦R›Eýmý'—R«@VZKým#²ÒVd¥ÐÒ@i?²Ò‰²ÒááRÑR’À”™’¸é÷ñŒGӒQ¢„¤e¶ªÉ,¸e¡zU·T>î¸oؓ¶ããÞì“Ý@)„£;“SË¡õd­'Kø5ùDuø€ÇÓz²­'›p…Îbเ!¨%ŽîV´ž¼‘Ö“wàè¾G÷㴞|G÷«8ºßÆÑÝ G÷§tTú‚ŽJ0* ¡QÀ(ŒJ©¿M§þ6£Ò"êoː•VQ[¬´Yi; ´ Y)R„“¯‰? w˜ÈT™›â *M¨ôä„ãý3=™Œtl„d1)E›É”>nªn?:“|Ü,xS>î€dԊ ÞðqÏÉdÁ[6òè PÀ‚·":”Р¥·jÑPz -PzFº«®@ÑM„« -çAKͥƀRêtuc TœJa@)”‰ du(uéÒÅ%”Ì`‚R(YtFª -”lÀΡ1PrãèöJ~Î (epjY,}Ë” -YúVÊÒ·Ú,}«ÇÒ·Yú֘á¦)¶9Kß.²´mÛör–¾ý…¥o·X>üðûi=ù­'Ûàè~Ö“ípt¿g™4iÒG8º?ÃÑÝ£Òו†bTC£€É4 -øžúÛ<êoK•VP[ƒ¬´Yi ²R¤' ´Yé@•E¸$ZJ…GtT™â -sQnªO‡âuÈx”–‘LP:‚CuA©ö¤­Þ÷rìI ±'Íƞ4{ÒXìIC±' ĞôU·®€RGªnoÖ¢3@9 Þ“¨+ù{dtC½éÓ§_UWÂ%üÚPj -F ((Õ”ÊjH²Ñd Pʪ(ùªJÇ·X T(=÷Üs&(™ d”„‘*ђщR’¼ÖNš*Prrx ä”|œA€¥o!–¾eJ9œs>=º‹Ù#·Œ¥œÏ{×à$.Ω\É3->úèy€R zt_eyûí·¯gé[k–¾ÝËÒ·G,_}õÕ38º_¶Œ=º=ŽîŽ8º?Á¨ô9•úaT„QiF¥q•¦R›Eým²ÒRêoÈJk‘•6"+m”v"+%á"´-¥퐔ªL ܯ7J0xä$<2éØ •ÿWõÛѨºiQ1éïÖh›É¤~ܺ=‰6“†=iU@2êìI °'ÍĞ4{ÒhìIC¨º  êÖ³wÙ… ;Puk‡˜ôøà&K×®]ïdéÛý,}{œ=rŸµŒ9òUÝoãèîÄÖoŸâèþ£ÒW•†`T…Qi"õ·éÔßæ +-¢þ¶ Yi²Ò:d¥MÈJÛ‹pûS¬„«nóîT T]nªO)0*U"£ÃÄ#“‘Ž–pU7[b÷$£w¬ÍdĞÄÆ%´™œG÷¤TÝ&æ²n¾¤ßàÂå˗÷+~é=é#ªnïRu{ wÛ:J"&ÝÝ -]K¸œp!á,8 P: P:Pª]S§4”2c ä? Pš˜ô0(t7Pts=™í\C¸”p>;YéTêo'JõXúV E©P*”r(½eJÁ(yR’7J.9 M%9r”ÆŽJ}ûöµh=zôøߥ4ÝíLP2ÃLPR d”쀒ƒ7rÆ@Éùøh¦à$ÀR&ƒGÃHŸ­PªÉǯc¹å–[Žçú5²<üðçJgÒLé|š)µ”®¦™Ò €RkzÜ (= -(=ÃÒ·—qt·ÇÑÝG÷'8º?ǨÔ£Ò êo鿍£þ6Yiõ·ùÈJK‘•*•Ö +E¸ВaYJÝ7 Á»jí&>&A&‘ULF:ªBJ1ɒ(&¥ªºÙäæÿ PÚï ê椛½ªºy¨º±¹Û*¿L8–eê±0,“Y™2™’½víÚ1¹«V­š¿bŊ¯ -…P¾(ˆéZC˜¦c™Ð͛¨B/‚=mPŠ…î„Œn$\MhA8—ÐŒGJ ð(Õ”jJŘ¹ó1sg'‚’/J®(Ù%Û!’–J–T ¤¾ P’Ñ,2f› d‚’Ž1P²$‚’ÚN’5”켑PrJnÎÅ (ù9É  ”Áà‘Å0’Çg+¤ëd)¿ TK×PjL×ÉÓÙ÷@éB¶Ç½ŒfJ×ÐLé&zÜI€èðKߞ£G÷k8ºßÁÑÝ G÷§•¾ þ6€úÛ·ÔßFR›@ÿÉiÈJ³‘•"+ý€¬´Y)©W…e)–V„KÅH•©å?!¨´PT-22ñèh Iÿ¿‰ÄmˆIZ”‘~·Ê=þbÒ/6¹ù´KìsHBìvÊDb»[¦›=’3ë|»víªðK- JFÍKn}Ÿ)ӑIÙ21•[QQñm¾¤_ÿBf,´âîB+î÷@œ×çhô8t_]á¡Û ×כ:uꕄ‹ çð·Óë(L€xEºN–q”"@)PÊ”€R@}”<ôQrÑGÉH%k( ¯%ƒ’uØ°aë7ß|J}ô‘…Õ·ÖáZX‘kaÉIä‹@ ë©@IÔ -”êׯo‚’ JÇf8¦AI‹’P²%‚’Prq.@ÉËI2B€R&ÃH6Ÿ-P*æã—Jå\ºãhÏÝP:P:ƒ®“çÒuò¶Ç½‚fJ×J·Zd4û+=bé[–¾½€£»Žî÷0*}„Qé3êo½©¿ dýÛwÔßF#+MBVš[i.²Ò"d%U„[¥áäËasu,KÆV'‡EKÕâ—Œ:¤WTLF:êBš‚ÛÅJºqbR ”þf•{\‰IzÕÍþË/¿ìuHBìtJjlu˔b£g÷îÝk|2ÍXî߶mÛâ dԜð† ¦eÊtd|6+(rW¬XñM¾¤_ŸBá—ÏÀ™Î´Ó~‡ÆÚ¯Òg»-›”},ÚgŸ}V-PºöÚkãAI ×j¤nØ°¡ J&(ÃáØ%ËÁAÉÆÙ% ää\܀’éÙ(¥0&‹}Lr¥>~ —¤&—®. t‚¥M›6hÏÝP: P:Pji‘‘ëjš)Ý@3¥Öô¸—¥o²ôí‹Œz/ãènQé}êoÓQésÖ¿õ¥þö ²Ò0d¥±ÈJS•fR„›--–VP„S–¥ á¶è–¥¤.K•ié÷t´ô‚’IFf8\P2ĤØJÄ-›u1É“~BLÚoGLrHBìpIjlqïÙ³g½G&«|’=?$éè–Üš’¹zõê±Ù21š+„20_Òï‹B™±|ʶl” -Ý´gwۗj -öLJ6CK¾qIJ¹jµÙǤ t" Ô˜Ö%M1œC{î ¥Ë,½{÷¾†fJ7±=îìúöKßgéÛ³8º_Ũô6õ·NÔߺR녬ÔYi0n¥ÈJã¡¥©Ð’²,-H´,Å÷ 0º,E·:Q´ô3´ôë@K&™áš‘RˆI±ž]‘šéé®Ä$vüÙ&wûi¯]Ò`—Cb›KRc“[’d­‡¦}’=Kl”Œš¦·k¦dÙ¨ìå˗K ¬?{Õ~^(‰Ø¥XÀ¦C©äe»;Ï×8y¢–PÐýµ…‡n/2º¡Ž°ÊU„KÍëÈߚ–Ë£kËóԒWԅ¯jÖÒ*.•¹P~ñܹs³9|F¾°OPòe -y2åÍ] -”‚€R\ %yŠ%M’P²Ëa±Ë,Ëb“ùV<(É cѺwïJ¯¾újjPRCx(zê©ñ ¤Æ璒’xPR£² Jf8Šƒ J©@ÉÆ[Úi©æà\œ€’ PòJ>Î>À‡ 1 dòQs¥|.I1W­ P*g÷ãhÛÿä©èÞgОû\Ús_B×É+h¦t-͔n¥GÀÝ,}{GwŒJϳGîëÔßÞeý[gd¥îÈJ_"+}Å"¸!áFAK)ÂM§7G·,ÉWÂÐÒJ½o€ÐÒ¦ä­NŒá Z¢r‘HKÿ<8-™°c†ÿYFúïDFªBL’›Zí©ü“Mæûírßïq8p`‡sß¾}[\ÂHÜ2¥XíÙ¶mÛ2ŸdÏ€äÑì …%·ÆeJ– ÇJý ÔÒ;Á‚Ý %?,$y»DòòÕBýôS‹Ö©S' ýÜ,4,±°"×’“ÈP¯@IÆ°ÈÀ}þùçǃ’¤ëÕ«JùùùÕ¥è~å&(™áˆ &( ¤Å@ɚ Jµk×vJ.@ÉÍÙ{Fü (A>j†¥U«VـR¬P*”j³·¶€€RcÚs7¥=÷9t¼—±ôíÝ7áè¾£ÒýÔߣQ@[Ö¿½‚¬ô²RGº|-õ„–úQ„- ‡–Æê}ä‹`¦ÞeIhi ´´‚5q«õáä«c3´´ZÚ-íE`Ú2ý2ý-ý£¥¿§ ¥JËù«¦¥ÿgêHføÉ“ToRµ½M”‘~gc刘$÷óOV¹½÷ÛäFßcFÚᐠØâFÚà’‰Äj·$ÉrϦM›ù${æø%¦…‘ƳD† É ,É·¾9’y=ò„‘>*y·PRòõbA’çJ„}¯!iz_™ÀÉí5Ǎw=áÊZ.!4'4­)6†¥”É+ê֐×Ö,•£Ë4(¿P²;ËƂ9Â>~Þכ!´ä 9ƒ~ vŸ„¸KâìIƂ7zMZcÛ¼iýû÷·h2ÈX´®]»Z´Ž;Zèçf¡a‰……&œ”‘Q^ æ2†Y,-[¶´°ã·…½¿-ìJ5k֌¥ìììÔ£r*1É%3©á˜%K2(…B¡$P²a\´J¤g'"´›Y–PòJ†–Ÿ<“«‘õʷÜÿýÅ´))cyI9¶€ã˜Î5¤=÷©4SjF€sYúv1Žî+0*]‹QéêowQ{Yé d¥çp+½†[éÁu¢÷)E8eY-©¾# ¥ñÐÒTh)~«™OW@Kk˜6@K[˜’hé@ -Zúý?§¥ÿûï_3üùCU·d1ɒ(&irÛFÄ$¹ŸXåÎÞk“iÁ.»0Ò6‡dÀ&‡0Ò:—¤ÆJ·$ÉRäÌ|¯dÏL¿Ì:&eþ1&$Œ44CXe`–€È9´ÈÏFú _èæ­BIɗ‹„xž.ž0aÂÃ¥Â%­1vìØ[kÈôæ/e.'\XSÂÙeò@“2yJ£’ÎÇCUåðU H«¨húôéyÐWV¾ÀN8wΜ9lyK_¦ä¹‡3p…Šœ v¿›—à‘Ü†˜¤ªn†=ÉXð¦Z(M¹?þøc ÍI,,*±°ׂ҂A 2ÀË/2z·hÑ"Jj¤nܸ±…ýÀ#ã³%54› d‚Ò±Ž!P2h)”ÔQ PÒXá@ɚJv@É(¹%7ó-/ŠŸ¡%È'[n¸á†,.S.ín X}[‚k²&jw]¦s'0^5¢™Òi8ºÏÄÑ}F¥lfr­'¯§þv²Ò_‘•FVz -·Ò áÚAKïAK˒Œò_BK_Q‰‚oi.ï ¬‰›F9n6帅”ã~ÐiI¾:ÖBK˜¶BK;˜vCKûBK|=œ–LP2Ã!3Ru nÿÒoÂD1I“ÛöéGi¿Uîì=6™ì° #m±Ë|aƒCraµSi¹[’d‘gíÚµs¼’=ÓýÂH¨o ¡ Î`é—)Œôy¶L—\ÉÁy“'OnW )ù|¡`ÏE’¡=úŽ™ÙÜX*áê#GŽlI8¯†üzF yôTêÄRyrýyYíb9@i‘ª `êÔ©¹ùBK™pX(Gh)%ìãåÍÝaA!WP’Ýá—`÷I°y#É£VΤ81ɨºö¤¤oª3€ê5©öÃ}þùç-¨ÝtïÈØ.#—ÅrÕUWEÆl5\ t 'DÆç²²²ÈМ——w8 d ¾&(™áˆ Ç8(©\U $Ç3@IÓAIÞÜ -(Ù8«(Éé:‘£]€’‡å”ü 2AËõ×_ŸA“Ûl®n‹JŠ0”¢v×f:W Xúv2ŽîÓ1*Íf&P»”F­•nDVº·Ò½t x”EpÏ@K˒ÐÒûÐR*q= ¥>4ïþšž”C˜F#0MB`šÀ4iÓ2¦•ÐÒ:¦M:-±tZڃÀ´dúZúZúÕ¤%3ü‡ƒ2R\Á;ñ–(#ý FúU‹ÜXåVÞk•yÀ.›L ¶ÁH›ìró¯uÈÌ¡Â)Œ´Ô%I2ß³jÕª™^ɞɬ%FFú2S¤[–àL§œI“&½;a„Wò…xž) ‹G¡dè=E2©¹­xøðáוH¸‚pQ©„sMKäѓÁ¨ªºÅòښE’ÓÅàV~¾$vvž>#GÞ(˜-s!¦¤¸7,´äIž;r.¿»W‚Í#¹åQ«K1Î$‡ Ò=Iµ™TU7™oY¬ ˆØ“ ·Ñ@µPJÚ½DF.‹åÊ+¯´X.¾øb‹¥yóæKÓ¦M#ƒ´¥:uêD@©¨¨(JjT‡Ã‘QYO(%1’ Jf8ƒ J‘£$RNNN”JJJ(Ù¨ÑÛ9] ääs¸ùX>¥A&À…q…2¹ˆ9x%ó1Ó# Œé\9KߎÃÑݐ]ßNa3“fÔߚÓ(à"d¥Ë±u_ƒ[éfºÜIî~héqh©-´ô -´ô–eÑ¢Eñ-}‚ËûszRö¥÷ Ó0¦±L“˜¾G`š‹À´iÓ*¦u Ó&¦mÐÒN&EKûuZ¢š£¥¿%ÒÒ?MZ2êQp‹îš¬ܸÿnQŒDÁ FúYFúFÚ#í¶ÊM½Ã&÷øi½]nþÕ™9,wJV,rI’Ìq¯X±bºW²g‚Oòh$H28( Ö/$èòy†0ÈǙ ²…nÞȑl|!O°§M¾ÐȃÆ »«P&57}÷Ýw­—K8Ÿpf±ˆ÷q«oFg£)·±ÍÛ9çœcaKK [DÆçòòòÈМ -”Òî‡k‚’Žü`‚’J–DPÒb d¥2oãüìTëíÈÑæ[.f^n†/ÚOǶ HÂ\¿,,¹ô(ÀÑ]‚Q©&ãUv};žúÛIÔßN¥QÀÈJçÒ¨ûÜJWÐ-àZŠp·@Kwë–%OŸ¤÷}»_Ó»,ÉLXmuҁ©Si0Óp¦qLS˜f"0ÍC`ZŒÀ´i5Ózhi³NKˆÐ†Ø8ZâKI}=é´¤¦õ‡EK†og3üÂ!˜’ 1éïJLâvü FúEªÿIS7¹÷ÀH;­ÂH[m2#Øh—»}­]nþ -‡0ÒR§dÅ|—0ÒL·0ÒdÜÑc|ÂHCý ÂH_†$Õº……d>Ì7nÜÛY‚8¯f µÍöy,O’óÞü!C†´.IÍõƒ¾²PÂńæ„f…ò@ãByJƒByr=¨ª|Uiä -såäȑ3³%±C™;~°Ìöqå \A!‡OòÜî•`óÜò7«‹Z›FrÈË4»ê€3IßÜM‰Ij­›êž¤ªnj‡·:Äۓ”;iÁ[ªJÆî%j›7” - ãGe”þ _åf0Aé%R’Yã=4jïvEÓP dåülˆÐvNÜÁ|ËÉ>&.> ‡AÆËúZ?×%ÈUËÀѝÆ‡Q©é\)»¾ÕÂ/P—ŽJ'°þ­²RuŸ…[é|º´ w´±,ɘøW*qã[R]–^@`zé]©3S7Ú|2 ÀÁô-5¹‘ Óxi*Ó,¦ùLK˜V 0­F`ڀÀ´™rÜvhiÓÞ-ý-ýGKêÛ*–þ•HKÿeҒ҆ꙒRܸ ÿfQ7a¤Ÿa¤šÜ±û¬rïî² -øo·ÊM½Ù&Œ´Þ&wû*»0Ò2‡¤ÁB§dÅl—0Ò46OAk„Wòh°O&!ýÂHŸ%Õ>IÒuÈ°y#Sä…,!ž6Ù"å 4è®\™Ïܜ÷õ×__“?pàÀËH8‹Ð¤@h”/Ï;>_2¹Nž SYž¤sQ®*/Gr:;[è+#SÞ#˜!ïæ Oš4É”ìv™œ~Iq‡O‚Ý#gesË¿¬.yÀê”óÓòdÍ>~üxÍ®IÜbÎ$«!&©¦IU7µ®aO2|ÜƂ·¤Îi›r«QÙhÊm‚’Žâp¬R’¬däjBšV¥²²2+5zgjCŽ¶³‰ƒOädææózn|\’×*Ä%Τ©[“¸|êoEtTªAß·Ú¬«ÏŽ&'âVjL·€Ó)MîBh)bY’‘ðF*q·ã[º—íàE`zé%é Æu™>¢&×dê 2 ¤&7d2M &7šÜliÓR¦ -¦5L˜¶ 0mG`2héå8ƒ–~3iÉ ‡Ÿ‘ô‚›b$K”‘~„‘ökÂH{4¹wwXå.Þj•)Àimýúõ+ìÂHKóœ2‡øÞ%ù1 côh0Òw^É£¯|‚)_ú%Áº$Õ:…$éÞKú½š!xÔ6S°ç±,‘{³e*Ó:gÀ€×çöïßÿÊ\á’Kò$œKh–';%O=1OžW/W2¹TUš#é\˜-Ȕ›5lØ°ÌL9| „åÝ|¡qãÆy‚L.ÿĉ>Iq»WNÈæ&¸äW«S°:ä)šCž¬ÙiÀ­ɦ‰enVÕ@u˜4Ä$µÖM5Hªº©á_ٓÒú¸“:¤ê5™v÷’´Œd‚’ŽÀ`‚R|®ª#‡ÃawÓ¨ÂkÔã5NȊôlE„¶!Gۙoٙy9XúæÂÑíf¸ñr5|\¦W2Lý-“I\&ÊÚâ#+•!+•ãV:Žn )‚·;bY’ö" ޗS‰»ßÒM¸¼ï@`ºdz dj 2½ 2µ™Þ™º€L=@¦> Ó× Ów Óhi"6¦éLs¨É-¤&÷SÓZhicŒ–v@K»uZb➎–þnҒªªf¤$SReFÒ nœ¿ï?irc*FÚ«íÙ³g§&÷î6i“U¦ë`¤•6™ü`FZàFšå„˜êF‡ßg¸[gGò¨¯Wð£‡Oð£K@R­CP’¤ß aÁ£6Â>f -ݕէOŸ›³Ù}([ä² Î&4ɑåÈSŽÏ‘$®“#èR–-¯-ÎdÊÏdÊÎðÊȐÃÂLþ ÀŽ7 ‰íö˛;}’ÝÎÅî‘`sK°ºNy@sUiö‘#GjªÖfS}%#áÞ¶ª‚›ê '©“JL’É™…iZ¤)€êž¤xc‡7µn’=Éðqfg”Ìp”„£”Ò2RÚ*W•|¬*î -”ä}5êñ‚³†ôlE„¶rÎ6æ[v>Œ£’“Å".†7ÂËÅñs邬,É`—Åú·\Æ«BdðÜJ5™ñ©"Üñx»•eé4hé *qçÒ·û|KWàò¾éé.}c8;Ÿ™ž™^™Þ¢0×dú„ÂÜç S_éiÎï1ؘ&acšAMnÓB¦˜V"0­¥·‘rÜVÊq;(Çí¦·/Ž–Ô·ÕaÑRªž”†oq3üo€R#¥5nǛ’éWégàý€&¿FÚ¥Éͺ]Û¾}ûfi½UîçÕ0Òr›Üè‹ìÂHsí’3ÂHY[?Ê%™2Ä-‰3$ùÂ+õ©OÐ¥“_Rí­€$Ý+A™¬´ =¹7Cò²ufϞ=¯Ï¹2«G—Î͖ЌpJ¶”m%+…˜Äe +e3^åÑ- Ep¥ájAKõtËÒ'Ÿ|҈J\|KgÑeé|šw·@`ºdºdº•éné!lLOR˜{Î"ãýk´_z/S'©+ÈÔdê2 ™†ãü‹i2Ó÷Ls©É-B`Z†ƒIÑÒ:Êq›þZú·IKf¨Þâ¶*LIŠ‘(¸qÿýhQŒ´wïÞÝ0Òi«¶e˖0ÒëÚµk+¬+W®\b[¶lÙ|›0ÒL»0Òd¶‹z˜Sék—Ì5ú€$Ÿy„U>ò -º¼ç’i痤{> é÷dPˆçÁ0È]a™ÅÜîÖ­Û5B#—eÈÌæ‚L gšeÊÇgÊSêdʓË2žŠ3$“óÃY9!9^F¨oß¾¡`ÿþýýÉi¯_`Çí4hË+‰íð7ÙݒÝ6Á)Áꀌò€f—óÓl¬k³áÙV~$+µ6«ÁHôLÒTÁM-sSÎ$Õ8I‰IÊ­x5ŽMŒª›êǝ֞t˜>ncÈ5AÉ G`0A)ÕÒ·xPŠ•4fTF%+§k¥þfãsب¿Ù©¿9ø¼.>¾=ÛÃòqýÈJ!ÜJ™ŒW9x*ó™çAK˒ nõ©ÄÈr¸ÆlwºEÚ³1/]2µ™®™n —wklL÷°¡îÃlÒ/Ó –Ñ£G¿ŽÔô.öïA¦OA¦^ S -sƒÙe8‹åÆQ“›BMî{¦yL‹˜–SŽ[E9.BKØ> ¥)héçDZúݤ%3$…ê-nK]p‹·ã^ûEg$LI†÷P"Þ©íرcŒ´I“ÛvŒ´FúÁ*wöB›L fÛ䖟fFϲú™M ¦–Õß%9Ó.ùÄ-øÑÑ3`À€öÞ>}ú¼ì°yÆ/øñH@¦-÷…‚n J^^êҥ˕!¡‘KÂlo–„mÆ¿Nɐpb†¿¼‘Ç'9íöÊû:=’Ø·PšÝ%ÙmsJ°ªà ÙåÍ.ÏÓl -¬ìObU~$Uk‹1’¦ö¾U7µÌMí릜Iªq’!&©ÍÝÔZ75H'U݌~ÜUۓª%à ‘jÜ5AÉ GB8êAI1’Ò•R媗ŒJ"´«¿Y©¿ÙøDv5"+µjÕʍ¬äå‚ù¹œAš„õ"ÜSO=¥h©Z*†–ʘ–ã[:—wCzRž‚ÀÔd:dºdºŒ^­°1ÝHCÛq~ߋÔôRÓÓHM/"5½Auî=©3ÈÔ dúd2}K,–GMn -ÓL¦yL‹q0-§·ŠrÜ:ÌKŠ–¶©o&ý;*JK?ê•5ß7iÉ ‰á?a$u#%0ÒOÜu õ½Ü‰»(o׶nݺFZ¯ ä¯Òä^#-² -#͵É=>Ã&Œ4‰½>F³×ÇwX}:…‘¾tÊ4£\ò¡[’éàÇkžž={>ç$Ô ÉSÊBòäâ ¼,?(™œnÊôËñB~Ig¿OèÆënr{%§]Éi‡[ÞÜîx²9%»U°:vù›f—G5›9‰tO™Î@ejN/‹°1]Î>q×àeº ©é¤¦û04=†Ôô RÓKHMo"5u™>™ºƒL_âeú -û÷jr#©ÉG`šŠÀ4 Ó|–È-‰ÑÒjhi=´´™o¦xZ¢þaҒR…?†‘bÆí#íãþÛ͝¸ƒñmÓ¦M`¤50Ò -Mnà%0Ò|«0ÒL«ÜãSlÂHcmÂHÃXQÿ VŸ¾™WôpÊ4£‹S²§ƒK’é ·àNjɲ§<‚G{?þêì¹Õ'Ùx­ÿÝwß½Â/ rq@&5ÍíÛ·oF8…pbPþVŸj$Kò䀼,×/ü’å—ÉOØ'Ç z%}^IgG¸ÉíØqºË.Il»SÎÀæ”ì¶:v š]þ¦ÙäQÍ&ϳX©°YÁ#«²"ÑMRcÅmš¡#)S’j ÜÛj€WËÜԘ­œIIb’jÅ­ö,Q£rªªÛ!õãNb$”Ìp¤”ªaT²¤¨¿i¬³RÆ7d%͝Ïë %‰“ ››‹)ÂÉõ pC:-=úè£ÙTâ"]–^xá…RÖÄÕb>ÙN†ÜF Ói´¨<“ÂܹpÓ%HMWÀM×ÂM7ÃMwÂMà©©-RÓË,›k2½2u™>ÃËÔ/Ó@ËÔ©S‡ 0B`š€À4 Ó,Êqó)Ç-Á¼´óÒjÌKëùfJEKûñ֚´d†?ˆ‘*·ÔiϞ=»Ñ6wÀí[¹'7jrw®ÕV¯^]#-Õ÷ÀH³`¤©Va¤ñ0Ò:3†‘úۅ‘z9$?º¢Ø|àìÕ«×[.aW\’Vm݂y$ßîó~Üî2ºÁ+˜«}íÚµké“ä<ß/“š3ý¯¾úêi„“Çêð@™_žRìã7ò}ò²ŸÀS¦W29ä•ãù=ÂM^ïqË4Èå’wsº$§íNa3»CÈæÓ°Ú£A³Éß4›<ªY)®YQ¬r€!!it“Ôä "‹Û”Žd0’êÕ®Æl5R«AZÏIb’²p'­uûcªnIF%”ÌpĄc ” ZªÚ¨T¹þfÑëo†¬T¯^=2¾•¡ÅªËJÊ­$ÕÎJ[6åí®DKÊàýÀDº,ɐ–‘ ˆ5˜Ö™êL P™N¦0ׄíO΂›Î§:×nºnºnº•Ý]pӃÁŸ D÷,RÓ+¸šÞ™:‚LS˜ë—©+澦&÷Ó(¦ 8˜¦QŽ›M9n´´󒢥5É´´K~ª¤¥¿2-™;Ÿ©!ÕÚÿê1Ò?éoɌ¤n.a¤=0ÒNi*ç&îÉuܝ+µ+V,ƒ‘i ,˜£Íž={ºUnê‰ÖI“&² -#}NJú¯lƒþÒ. ѝ‚Vg‡dÊ»Iœ×Á”ç]‚.Oº?t ~Üåü¸Ù#ìódãåޗ^zé"¯€È9Þ矾©OBcßsÏ=׀P_kù˜íø$ yr®W^–å~ {$“ƒ9žÏ-3 [ÒÙíxr:åÝNÉi»CÊæ²ÚU×lò/=X©«Y!#++þ5œÚ:a×ÖT™Mu“T~$UkKÅHFÁM5—TËÜÎ>ûì*Ĥ¤=KÒVÝÒvi1AÉ G~8vA©êŽJ©êoê\Ôú·T²’ 2j\|îâ‹/v&ÒR¤o@ëÖ­ƒ\â0îÊL†´¦|ö;)f¬+™Ê™Ö§0w"۟4†›N‡›Î†›.@oj 7]…Þt=Üt ,ÿJ§‡X;÷$RÓs Ó« ÓÛ¨LP˜û„NŸ³b®/5¹¯˜†â`Í))ÇM§7›† 0/)ZªÀê­hiCŒ–¶›´d†Ãb¤(É]ñê0’Üe;Y[ i35áõ蝫¹;—krŸ.†‘æÂHßkÂH“a¤10ÒP«0Ò70RV‹õ°õîÝ» U­vɔ7;w~ ByÚ)õˆSì—àÇm®—_~ùz·äà•nÉÆK<Ï<óÌyIÎ3–AKv][R•8¥œxÜ\!×ʇÀ @ˆË™ÁÕÍæ:çqí ù¯(e¬7ÕeÊx<®¦“˜AžŠÔ~kçšÃMÁM—ÁM×P§»‰ž·#5݋µéT¦§P™^¤0׎vï"0}HMîS¦^8˜úӍiå¸a´û‹y)BKóçϯDKê+ëPi© -—wÚr\ZÝâÿŽÉPµ„tP?R#Uj nŸèâ¶#Ém¶‘n-k2+Xoð^º…Ô‰g£N‡‘&ÂH£4¹‹¿Ó¾ýöہšLzÃHÝi8ô«ÅÞ³ -#½a“¬xÑ&óŠ§Ðn¶KöÜ°Üfˆ¹Þ!Yv•C¤…CÒï<§$â™NIÉӜ2žä”áðx§¤iB¡˜PÀ9„LžrÊ(pÈk}^=ÊåÒrÚ%vIg»MæB6›¼›U«°”–i´ŠÔЌ4êjš"#5f«‘ÚÀ#CBRëÚÔX¬üHÆ0œÄHª¯dÒ¬–¹¥r&UWLªzGr”Ìpd…c”ÉÖ­æQ ‹à*á ËR-5mÚÔÎ'wp Ôº.®Kd]¹V>®Z€ëBeÊäšf[n¹å–<.v—½”ÿ…Zü§Ôå?êêt˜Kž†ètÜt.Üt1Üt9uº¿P§» ©éé>éQT¦§é9ð"íÞÀþýSgú2uÃÁôå¸þ”ãÓî{8楱˜—&cõŽÐÒâŋê_Tê+K}yý1´¤œ+‡º0Τ¥ÿ­P +Ò!¬k«BGJh°5‘‘VÆiŒ4FšAÅxjèi(Œô5ŒÔGFêÁ&±ÃHï[e¾Ð;ôËø}ž±½üòˏÚ$]î³µiÓæv»äэðK+»€È¥É· 2ôíhݺõéõNvȨ×À!4RÏ!iZ‹PJ($äò@!Ìó‚Ib¿C’Øk—¸í’É.»Ïa—‘Õn“ÃÛl2ÚÚl’ÓV« -2*kFФ5†fQYcT֌YÅòñðê!©$$µö_Àʳ­üHU3’Qp3z&©ïÄ¤ª·Ž2AÉ G`8†@ÉjµFÂ!ÉJÕËßx˒AK5²é¾%µÕÉgœá çԷѕëâæ -y¹V~ö‰ 2…™ -fr9s¸°ùèMELk0&ÖÆzPÿü÷4â« ¢Ó™pÓyèM—P§»‚:Ý_šn™î™î§0÷…¹gèþ5¹7˜ÞÃôݙ–LÝèÆô~ï4Œy©-͛7o.´´(FK+ÓӒ2â&ђ|5FhI}_V¦¥Ã±z›å¸ÿaF:D+ÒÈHëÖ­[‹„©i™~멛Pé{i2Œ45t¤?Fê#õÔzôèñ M? áÐ[0Ò«0Ò³˜~ž°J~<`“Ɲè97ÛdþñÐårpæ"»ŒuÍí2Ì5³Kžb—ll萼¬ï)wHšÖ ò ÿŸ½÷“«ºÒµuٜ:çVF‰$ DY˜ŒÉ`’É"ƒÈ9#rΓL49ç`›Œ±1×qlό=cÏÜ wî̝ÿù¿wªÚÝG§ÊՒ0ªŸÇß3ƒº«ÎNk¿g­µ×îäÚ’–„~¯˜ØyçóüY–H2–©@+9èC–sà˔ú¾¾ÈÄóµº=Ï Ö6L®gPd>#³»v‰Ù]óÙ]$†GVCÒÂlvößεÙÕ$–a$—”äêJÆÙ]s&™9¹3© JMùBËW”âh©¦[©~Î¥,9Zr¾%Ë[²«NìLœÀÁ”äÅ.2¥1dYÞør¤1°p%º®nêÀôuѧ½¼(§‹uœH·¯ÌLc(ÖddÖf´6`çâoڒ8ݶ¸šv™ö™ö'0w•-¢LÓI8˜ÎÀÁt>L—QZàÂq7“ï}'ÉK÷‘¼d´ô$©ÞÏSyéƽU›–,¤1Zú×!´Tq0ýße:×t0-o Ähgým*ÐJNú¨„¯åøúäÀךö}PÏÓW:åaYCÑï•m¬ùŒÌÐ鋖°¶†GVCÒ\Hvößεř\ÇH–”äêJÖÌÞ¹3© JMùBK”? Â5@KvՉ‰S+ƒÐÁ4cƌ/vIÌW -C–æ/‹k<‡…+ÀM%Þ[é¿2 ºyQìÃ&bÇÑÏ+a1W¦ï§ãtZ‹ñX‡áـњË0n‰«i[i¼L{˜ÛŸr+‡ruÊÑÄäNâ°Ü$}ŸOiËÈ÷¾†Ú•7“¼´˜ËQŒ–!Õ;ž–,2,÷i•–~Ғ•¿1Z²²¶7Ú.Yƒ–O^ªŽk:˜>sRýcÿ5êl»³ÿCϵ-ÉH¿ÂH?ÖÏpFz›IèéIéé>Ž)ÜI -ÞM0ÒÕ0Ò¥0Ò¹0Òiœ¨?žÄè#}-ˆƒüÃ;lb^»úZ3Ûû{î¹çVÓ<ðhÀf`gÍ@ÖlZ ·˜)–ä„@‹sL »Öô HRâ_ H.ÐËO†¿Hó·)_+9é룾–sàk9û&ž¾Ã E«ÛÉ(þ[(!™»È,«ùŒÌ¼šãȂkfc#xd†Ö\HvößεYÎv}Fru%ãn^¯ñÚ7jc› Ô”M¾Ì T“‘ ÂEj+5JK–·dYÞv&Îî;1“)À坙 S’ŽH˜ËÐ/Y,\n*`ðZèµ6ŽÍuЉÝØÄ>út4ð4³9‰Î^…nŸÎ¬ÅPÌÆ9¿!c4qۊÝ/Ó.æö"—éL‡á`:†Ãr É`:“pÜä{/"yéZn–»™ä¥Å¤zßÏ-reZ²íÉúø¾~BZú‘~ÂãHŸê'¤%+zc%ëÓRce–ÆÁÔD¦ÏâR‘â«äεÕô#Õ`¤×˜„/0Ÿbb> -#Ý#-†‘nÆCz ç.ƒ‘΃‘Nçlý‰0ÒŽŒLNô7|™¹ÝwíàkÍÌÇ©³©¯Å´‘¯e5°™á v¦@+Zˆ+Z’c½Ô Z¡½HW ێ´ðÿ‘¼¯_Éúúå4’ò9Íá뾘&ðõy'ñ=­iÏÓ9e2ÊÄPÈÄL©A‘ùŒ™eµàšÃ#ٗrmgc­¤k‹Ú©~®k‚RS¾0ò¥Fƒp‘“pq´äÖ´Uðv…)Õ"dòI0d -@¦-Oòž—¤#Òص ý’ÅߔÇà1}-ÀSðԉMì¡'û§ÑtìxLé$¸i¸i5üM3ÈX˜Í lÄðÌc´¶b·g¿N.ÓÞÄä ÒÀa–;†sr ǝI!¦ H^ZÄ )גê}K”–ì¾-½×-™ÿ BKÚBÿõ/§z/Ž‹Ô¨ç`j"ӈñh™ÃlîNۚŒäÎþ7ÊH/¾øâPFÒÄ|Fº‹L»[`¤ka¤EøJ/à=à é$éhéO/ û‘½é?;yZ$ÛÛÜ×ꙃËg=_–k&L³:œ3Õ×ʛäË|÷µ$Gû²a}¾Vh7ÒáëE§)ñÿæ‘’á÷ÒüEÒ§f?xú”ÀÓröCÑ'{¡­LF™„É×FA&–gdÔÜEEfJ-5Ûr,¸æ¼GfYí.Ã#çB²³ÿv®ÍÙؚŒÔÀ%%Ë|Ƹ JMYÁ¥ JCi©ærŽKYªIKv1œ]£ëLB&¿ŠLM 0_ ZžÄ!ž¢#ÒX¸ oY ^x*ÒW-XÂvà©ك±ìÇvŽÁžŽ‡›&ÑÏSéñÕèû Óº ÓF Ϧx™¶&|{†vWL{ã`: ¦Ã ÇK¾÷B -ŸIòÒTú^Dª÷µád¯ëöâna£¥çõS¥¥7ÃCHïé'JK¿Ð½Ë´dþ£¥úã*¦ÿ\Φ&2-Õ¬ŠÔ@*R徶?Æ2’¥¸ÕÈGrŒô"Œô4ŒôXÈHÂø»™¢·ÂHבsw9Œt!Œt&'òFpŒ·`Á‚Ã`¤ý=Ùµ=ɎÞÙÛu×]·õvÜqÇ-ˆomâm¹å–ëã홅h _ lUèf2Ø3Á×ãk5öûZ—=H§¯eچ”|Y³ÿWÉ i~%…$=ALÂã,â{ú(ßâxCDßá…¡ˆ821Ûé È¬¨‘‘åg[pÍyÌ¨Êæ”ñÈ,«…Ù\!I3Z.)Ž‘HJjàxq”šòE•&(5~®>-¹ÕmïezCóxz/t0UÉ¯"SÀÛ]€<«)‰]KáoJó˜Áàåèœ+ƒG+3ãàœA¨×ÓBìò´$Û=-ÎVOË´ˆä‘’AÒH’_I a⇢OñF™ˆs¼vꋙHKÃ6qPdfӑ‘PËώà‘e!E\H‘³ÿ‘|¤‘3ÒÈß>ÿº d;S”š²‚ƒ’ÅÙëƒR¤æÙgJžç•eYh)’å]ÓÁ$‹äñêVF¦J`ÎÇ|ù´2Àš4:…Kò˜Â¤é,ð”Ã0Œ%Ld+ƲÚEÿõÂMtçX\òA¦) Óªôø$~Î"t=r™6fx6c´æ3x;ŽÛáއêß‘¼txø®ÍæäðÕü¢‹.º0Lû¸îºë"´t´ô0%*ŸiéeýPÐû -z7¤¥ôæœXdÅђ+#P3Õ»F8®NSý˜\£ÈôEö7ý¡Œô¿%"lúß w!Y(ôÿTi R$Iˆ44][ˆôëнhŒT¹‹ÄՐü~LÎv}FºFºF:‡i{*øøጴ/Œ´¦jª•ÍÇ@mƪØؓmZ—Ô¡„ÀV#J¶ -x4 <ïi•†nú`ŸnO ±ÃӒlõ´8KHÁÓZÍ!$¤$ÿš@Ä÷,SÑNxØ¡ØaR¶±pb143‘ŠÌg!#³Î{äðȕt.$wö¿œíFé³%ky}P²}¦ JMYÑ@É>s äêÂÖ¥úÅa?cPZ>´TÓÁäIfÉ‚LW“ óie<%0n ZžÄà¥Ö¥é,–0‡a,ÐC%,f+Ö7uѽø›éαtìDi -È´*¹5ÈešELn=NÏÁÁ´9á¸ù„ãvdTwc¸÷ 7ÛbŒ–,|qöÙg—iéòË//ÓÒ-·Ür3E—S¢ò>JT–iéYý §¥w(èýƒ0žb^ƒHÑ¥a©Þ5“—꜎k™â¼L#妞%£á‘s!-a‹;ÍV?ÉɯB¤Ÿ‡îÅʝ¶†¡Zc¤J ÉWCFzJ?Cr¶ãé’K.Y‚‘„ûG2•¿Ye¤ÝÙw„‘¶ Ifi«b=ÖÇLÒV'¶=•ØØd¼GÀ£1žVY?ˆÓìtzâ’6O«±ÅÓº,xZ¡9$‹¤‘’DH0ÊD¿ìW¥|Ì£"eÎ1âqâþÁ‰FKÃ6‰@‘ùŒYp-â=2<Š¸"a¶iù*^> dûG dûQ”lßj‚RSþú ©û™€RbGJq´Ts‰7JKÎÁ4 ™¼™Ôã&nòi ] °p‰PÔò$¦/…ÌÐY cYÀl–°§­tX¯›Ýø›úp5 ‚Lcñ2MÄòO¡³§Ñík0³Èü^ŸÃrs£Í±Û0‚;2ªKÐÒñÇ?”–.¼ð BZºV?UZºZºZzˆ‚ޏ‡´ô’~(èý:½ß ã)Ãh)’ê½DòÒR:˜C¦xWÓ_<6÷yaÔÿ•<ÐÿÄàÑÿŽGÿ=$ÂVq! Å£Š é?B’ºþߪ§Ùâ\H¨¦"ý.öHÛÇüã0,[¹ÓÖÝEòJ˜öfŒô¨~HŠ³sm2Ò&ðÁLåoTi§‘¶Új«Í«Œ´>n×Y0Ò£U1FS0FXLcXV¼ô@FQ»§5Øâi5=­Ë¼§še™fµ*I†¯<’ *~ՇìEÅÌ\}1 -rb<EŽŒ\î‘3›Î{äð(f[ŽŒ´”ÕW\ÃgJ¶G5A©)Ÿ-(í³Ï>Ë ”j^7Ô@)ýú÷2FÖôÈAiä´Ô2I<žÞÃhyUnòi›I€q 0s  Eö/…9ÌÐf•ótNn*ÁMmtX½WSV~>‡cz"y +ã`š†ƒiM"øk3ëx˜Ãëõæá&b¯Ü °tŽƒ>ø ÆÒÒ)§œr2eÎ ii‘~ ¥k(Qy%*鸞÷½ô6Zú½Ÿ óK,Šbñ”%‹.-‘¼ Ç5à`ZfdªéjZ*Óç*ÿS‹Œ¢xäAF¡Ð%Èyà‘G¯!ÿéGxäGx䑅䁫ž¸õŸ=CX Ì?1FfûÝï~÷Û!©H.]ûÇ?þñGa0ö‡?üáÂí›o¾ù)n/Wï"q5$ï¯2’ksùHF:!†‘ö¨2Ò×`¤-0F›TimìКl³ÓX)Sx͘ˆ‹àM¤—ÖÅzkSZY~EVcɱ83,Ó4’ª®Z[¿AøTy òb¤Ì9õÅQC!ÇC(2Ÿ‘s–##”ân?ˆ€’í ¶CXv–%ÛI" d•¦FJ¶¿5A©)Ÿ(¹;‡l*üΡ]`]”¿ˆ–"¦2 ã&/D¦aÜ䇢˜9“¦/I˓˜C³ÅŒe6´Ôêœ"Ö»…¾jâwÐuÝ S¯ÃƒæƑ˴ý¼2=>¾_“pÃÚá†a¯×ö¢m´´óÎ;ïÈÐîƘïÃ,)ÓÒqÇg´´0¤¥ ô-]F‰Ê«)Qy%*ï  ÷=ô~‚ޏ…ù%E±xJ¥èÒ÷BO‡~øAè]0?Òá¸È鸈ƒiè¹¥D¦ÜTÓß´"ÔÿÔ$#¯"ÿoˆ,‰Gÿ5*ŒÁ£ÿþ=Ä#uóÿ†‘þÅ­þFú“§áøGïüã< Ñß{®÷Ûßþöoqþ* ³}úé§? S‘¬~»Ý{óƒüàÝÐÑøÆo¼N¨ö%Rܞ ÷–öfÇîÒIqîì¿ËÙ®ÉHûUiçáŒ4—)¿Œ´NÈHz‡˜Žvei%ÖÌ8VÏ Î‹>ÞDºY`,µV]‰5X`5æX—$Í2M…kU’_y*â^ƒ¼!bÖlDbä$ÂCŠâȨ&E\H2ÒR‚’ûКê–”lO‰%«bÞ¥¦¬¸ dSt)A)îâ¡ú 4ò£o#¥ú´Ô2 s5y¡7Uàɧm&Ï$A£“ØD³Åf•Í>g1#y:§ˆ-i¡¯Ú0( S7¯Ã}8˜FóŠ<Ž.^‰×æ•ÃhÛ&ì¥:BK¼xZ:âˆ#Œ–Ž¡èÒBŠ.-O‰ÊK)Qi´t#´t;´ô­0óÖòK,Š2¬ŒÀD[¾ú>øàƒ÷C?Cp\$ß;â`“«LÃr™FÈMÂÓòª%è/òÐPGF à‘ä?b\He<ª¸þäáBòW’Gn™Öz\[ãq9²ÇM¶ÞÏ~ö³O<;óh©HV‘Ôî½1÷â믿þÚ Õ>#=†o-íÍànÑIqׅG/+gÿÏ®kÛÛäi[¦[Æ0ÒZUFZ…· ÇH£CFÒ:êfEu€Gm,µxT`ùåXY$ÍâL…+ÔÖjeÕC^~Ì}G7Š£ 9(ªIFâÑgÂHË|Ÿ¦í¶D@ÉNF@É -q6A©)+.(Ù­ €RÜ-Ö6åmòÛ¹ŽåxCãȗxýß-Å!S nòhBY*ðäÓ6“ÓÐÞb¶Ø¬ršŽÈ`³³ôK^¤›Z@¦6^‚;Ã×aõd_hþ–ìµÙhIÛD™–®kSƒi}R½ç0dCii÷Ýwߍ7Z:0¤¥c=Öh餐–Î?ÿüó(Qi´t½o  ÷maæ­å—TŠ.=z Ì`ž„wÞyçíл`~ÛM+á¸OÂ[ãÙuÃkã"¦JÓИ\cÈTÇÕÇMõái™1ªA‰E¡%É过Ë !#Éÿ­âÑùôò¾úæß}õÒ¿ùê¯õÁ#_}ø/>xä«sËx¤ÿ#.¤À…ôw¸~g.$’÷Ë_þòç×ýy@¯þz€°ÇéGoX*Ò«a‰ígžyæiœß!hû`¾µ´7K€³ƒ—ë'§Cs-ÝÎç1-E^}[—`u]'/Æ=¼"÷‡´d¯Íömᣥ™3gÖ¤¥ù¼yí-íÊèïÍ,9Kvƒ–Žµpᓸ_÷thé\hé -z_æÛZV‰Ý-1¬ŒÀã¡ÿÀ< ¯¿þú«áýº‘pœ9˜>ù䓟V/ÙýEÌ©8˜Ü¹HL®QdŠw5ž%¨¥¯žüw-BF>däCFȆ¢¦ýŸFðH=⑯>ý'<òñæùêñ¿÷E«¿÷W_ûë¨ Ôõ>úè£=ðׄ=N?z¸=—ŠdÕÝÍåøàƒ~;tCÞyçw„io–g,)ÎTÉê#9$ÉIvhg'Ä1ÒliF”‘dnâI먍Uf$­²<ë-ËÊË°Ó,Éd(Z¡‰êZõ‡‹7\–›‘‹C¡8(ªIF àQýÛmGtÌ­cÃõﯔí -J¶/Øae¤(Ùµv”lŸ±Çöže%·6Aé«,‚’õr%«ÊoÓہ’M~JvÖÚw@–ã]#g¤8PªOKõ‘©ÂMÞ©p“Š„b¹bŸS¡¹6í.Ʌ/¼fÖí%XF¦=4úFK¶ؖ0ZڌZ¶q´t´t(½¢ ÷‰ÐÒiô>‡“H…÷HTJTÞL¦‰;÷ ©ÞáIx -Ÿ‚»ÅÂqïŽ+;˜ØkcL¿Kñ4†Lq¹LÿžÚªÁMÃSµ$Uý©KAeZ’‡ÊPT“Œ*xôÈ¿ÿPŸþ>Pïþ6P?ÿ&¤þÊWßÿܸ~ê aê f샵¾÷=Ôõ^üõ^{íµW<Ø#Ìæq"Ò#ÉÃÑèÙ­8æ|¼ñƯ'|{%io—wΏØÑK;V`Ç1]}$YŸ`¤¯Å2ÒÚk¯]f¤éÓ§O%ø<#3¡ÊH,^IW•‘Za¤‹©ËHZƒeF²uibkµ"^ŒÄƒÍ²HŠÅ£8Fª J#7›q†1bÿê§'¹ÊP²›¶C8P²ýÁ’í.P²]Èö#ۙvÜqÇ¡ d;˜íe5AÉm†MPúŠÊR‚’›p ´ë®»–§žMÂ(m¾ùæåikb;P²‹(Yi~[5ï1‰$*ÅÅß ¥å-q6§&(Õ¤¥Šñ†#“?D*V91„–Ìp› Wod«´Th„–êù–fanփ–6®ÒÒÖChIó`O¦Ê~\r0ןÉõ'ÇCK§T¯?±¢K—E¹ŠxÊ ¡×àž{î¹ OÂ}$/=DòÒwH^zšpÜ „ã^!7ÔÁôÁ¼‡ƒéL?ÆÁd1¹Ÿ“û919‡L 2 õ2 Kÿ^ÂÕ´$7 ÓEà©‚ÆRN– ªÊü¡âò‡†K-Eƒ¢ -ýÛ2’üoðè_À£N€G ð(¡ÖÿSB½ñ ð(!<ú‡x”0û´û ±G˜Í“½;ï¼ó6Oè|£wÝu×]íá|ôÌ yÞyçM ÷TàN î(ŽŠ½:;´w•‘v ‹¥Vii¶ÊuBFZk­µVã°ÈTLËdLËŒ$ÓRf$[$¶\c¤D”‘–\µŸ%#Õ³ ËJK Oõí_Íê¼Î™T?=Éx‹»½Ä’í.¶Ï؎S”l·j‚RS>OP²ñvQ³]°ã@ɪNÆ݌©9úV?þw“cý°#7KÉC#À£:n¥F}KÃ"qÙjÞÒ´T3Ë۝‰«Tp´´.#¸´4¯JKÛBK;3#vgÒì^­[¹,î2oO"¿ä42MÎ!žr‘•E¤z_C´åF’—n'yénŽ<ÝO8îaR|¿C8îiNÇ=ƒéeL¯ã`²#rß«"Óû!2ýô§?x™Ê¹J.Óo†Dç†qÓ³sæo²Ô¦Jœn xrž§AE0jX(/JUá¡ûºâWäß"Tä_‡8‰*£?'%Jêiÿ) %!£¤Úö‡¤ùI5÷ï“jýï“àQRýò·Iáѯ“ê°_&Õu?Oª?M‚GÉO?ýôã„úùG õø õý{‰÷Þ{ïû !ì;Á;ï¼óFðÆo¼¼òÊ+//¼ðÂ3QUÿñÇÔøᇿíßÿý÷øwß}÷˜ì ˜¯÷„ÎWz—_~ù¥žpú|O`}¦g÷1ŸtÒIÇÒ]weªöÇúìE.É®ÃïkÛ<ÊH묳ÎZQF’U™À6;«2€U)3’¬JV¥7F)\.¶pl YÀ-’4̙ä)”>??҈i9ÆúGëß÷T?êæғâ*Ä݇k;Ž»æÍö#ۙš Ô”ϔ܅o”j–çŽ;ú—¨äâo‘B5ït¬Yqv)ÇòF¡¸Œî%å/¥,Uò–Õc7KВ‰3óom 2AeZ҆ÑÃÖÑÏ&©·4%¼ÔÁ®wXo½õfòš¡¥-î¯AK; ¿Z÷@héPhé(òKN ÓäTrNÎ"²r1–KIõ¾Šä¥ëI^º…ä¥; ÇÝC8®ì`zöÙgŸÀÁô ¦È`z… ¦78"÷61¹ï‘ôýCª -üÍpdúIˆL•\¦ò‰9s5Yx nrqº%àÉe:¹t§FE¼Q  -ŋˆU'ªŠ_KÂL¢aòωaòç(UÉ(!Hé‘ÿ!¥ü}J­ú}J­ü]JíýmJÍÿMJxô«”úå)áÑÿJ©Ã~–R×ý4¥>ùä“%?þøã÷“êç÷’êñw“ÂÕw’×7o½õÖ«‰×^{í¥ÄK/½ô\ðÜsÏ=<ù䓏=öØCÁƒ>xŸ¯¡½Ë× ßæßzë­7ú`²O˜Í=Aô¹žpút°öpHzæš#}³´1ÿ=a¤]02ÛÃH[Wﴝ™·róÆH3f̘ŽAYƒ2)d$í°c0(”^öß. J¥ÌHÚ¢ ár±Ãm•¤$ÇH %%ýuAiùÔò±„õ-\Í+ #EŠÄEÝ\zRýʑÛK" äîÃm‚RS>3Pªyá[”jSŠ;úITªsn¥Fi©þiÙe1-# žÆeɔÍƏù3q²ò®‚€UÆ˅AWWW©Zo©=¬·¤­£§ZrÅhibxñ•ìЪᅡ²ÐÒlÆrCüÙsä-óm˜;`dveÒì-íÏé¤CÈÁ=Z:Žœ“…dŸœÁÁ¸ó8w1©Þ—“¼t-ÉK7Ž»Zwq:î>Lá`zŒ ¦'É`z–ÛP^$&÷j 2Es–þý1éßvbîÓ(7¹³sÆM§‹ƒ§až§¡UÁ¨K¹ÔñP<'â—?‡u­:QEþÌq³! “?%†É?%œ“¨"eEiÉߥõŒ¿Oë‘—V3þ6­fý&­þ*­öþ2­æÿ<­Žø4­~ù$­úIZŒùã4x”V'¾Ÿþ裏~˜úàƒ¾ŸR?¿“R¿™|ûí·_K -\_J¾òÊ+Ï'_xᅧO?ýôã‰Çüá„ïàøV@|5ÐÐÞâk¯÷5ÜWùøK}M ’ĘАݛÐà-N,^¼øրøj ¡½&Ð _î/Z´èbÿ¢‹.:×?÷ÜsÏð5Nö.\xœ§ ²À¬½C9äOÓgoϜ”b¤`¤¯ÁH[ÂHó°%±® #ͪ2Ò´ðRC™‘Iì¦ãÙWDŽ—¶i¯íe¢wñnÐ^H"3âŠmçÃE"Pʄk¦RH2.+·ÊÜʳ…8¢*Ÿ±¬p6lÉۛ–¸(ܬ·«q&ÅEÝ"WáÖÌãye€æ}¸MYΠÔ@1¥2º#×ãÆÅßÌãÉVj”–"ÈT³X[£UKF$5¿h)eÉÒu^µ‚÷Ð2ÞJVË[½‘ oX°»*e¼sámU¥" äî‰ë ï‰ÓÆÒÇ3Èf3–W· l@“±HS±H«1xkAKkcŒÖgóšƒÚZڊɰ-dg¦ÏîԻهKBK‡’¡»€ƒqÇs0îdR½Ï Õû<’—.&yérÂq×PwðL·â`ZŒƒéJ>À¹‡‰É9dr^& ÌY.Ó[ä2}—–ߣsæjrÜd‰àÆMV¡ÉâtV¦É.'sðäQ‘¿K“ߧ*ò»4(T•¿Š~B‘äWY=Á/³zž_dõxÿ+«Gþ4«&ü,§ý4§¶}œSS?Ê©åæÔïgÕ%ïeÕCïfÕWßˊ6ßΪßȏ^ͼõÖ[/eÔÏϧÕãO§Ÿþù'ÒO?ýô£©ï|ç;¦ðÿ%ñ&ñ &ñ&ð&®»îº+\H1׀è«öÙgŸêŸvÚi'ú'tÒ1þ1Çs¸wÄG|Ó;øàƒ÷ódnöô´e}Ý3'¥¹+Íq©i6— ·!Œ4›ËL,ÈXilšÆH+±‘ŽgKµv¼Ó’ñÊÛjÊG.mˇKÃjÝ[Õ{«?¬âv.0·ÞâVãò^ñ ùLÌ\¤>f"±¶8F2+q&EŠD¢nqéIõ¼5‹r7å¯ -JõkÔOTŠ‹¿Õt+¹j.çhÉEâ"wf×¼ ©æŸ±Ä=ÁÄ] çįÞT+âtIùž8»½S}eWÄ墷êÊ,µÑÅ i7f©—`(Æðþ6­h›Ò*˜¥éŒàšlY³°Hë1È1æó˜[2#¾Æ,ّ9´+´´´´§˜&W÷ÆCª÷‰$/JòÒY„ã. w §ã®àtܵ8˜nÂÁtL‹9"w1¹ˆÉ9dz²ŠL–ËdéßvbîÍÐÕd9àâ¦w‡pӏ~ô#+þ£ðZ^«liÅÀ ž¬`“yžâJò«ð.:Ã(»Ã×XJò·á•&vš‰jtBa"“ *áq3’ªM’U 3‰‚f¿¶ÈÙ'Q…‡~nP”Ó·}šÓ—ÿ,§GùiNOö“Ì«mïçÕÔ÷òjôò£ïçÕ%ïä…GoåÔW¯çD›¯äԉ/f_ýõ粯¼òÊÓYõóã™gžyæÑÌO<ñ`úÑG½/­A¹;…ÿ/µxñâ›S·ÞzëõI¼ƒIü„‰Ë/¿üÂÄÅ_|NpÞyç} ˆÃú'œpÂÿ裏>Ô?üðÃôe‡öõddv÷dUvödK¶ódF¶öÄH›…ŽK1ÒL¸u˜z3˜„«3We¿œÂ]‰·,;Ài‡,ñÎRðºxhÇx´bSe{&Ò.ÐÒœôޗóLRFàPÆ- Õû8’—’¼t:á¸sÇ]ˆƒé2LW’Át·¡ÜÄ¹ÛˆÉ E&ó2iŒÃr–Ëô ,íÄÜK¡«ÉŽÍU¸é°ž¥Uh²¢–”I OÑÙmsvɽª OvU¯#(ÉÏ›{FI~n,åq›/7žý‚{=~^îa%¬]~˜ˆdBIT%ÎI~œ3'<„|½oPTÔW¾WÔü ¨‡z·¤‡ü^IüNIíx«¤f½QR+_+ ^. ^, -ž+ªsž.¾úê«O„Gž{ O=õÔ·óÒ{óêç»r<ðÀY À-Y£qìÕB¦é«¯¾ú’ô¢E‹ÎO]|ñÅg¥HDKjTOJj|Mh¤L}ôчý̓}}͈=|rÚ|͒í}í`ó=ٍ-<Í¡¹žvº =íyëzæ¸4¦ð|:Öb¬Åd¬Å¬ÅX¬…¥ÖY’;™ÊíLêV¦w‰‰^§¼&¿½*dXi–†½C$Ãåb ǖ-&[V‘¥fËïó6+ªD È‘‘Ye‡Gf³#±¶#EŽ¹Õw&Տº-KzR”š²¬ T3Q©~ü͝‹s+ÙKƒ½>¸ œ£%‰³µq0EÉq“ƒ''n%qdX¼¨¨•~UšÐ‰PÔ9Iº)E‡¥1Pú/|æéÓ"½[¢Ÿ[éñvú¾‹QèÁJõ32££qìV¡ÜÉX©©X©ÕÚ5y“[µ¶i#ÞßæBK[@KÛ0‘¶‡–váô÷”¨Ü—ƒqê}ÉKGŽ;–p܉8˜NÅÁtLçQPÀiIßed2/Ó½÷Þ{+µ+邏¥ۉ¹o‡®&qÓca¥çŸþ©°ž¥Uh²¢–VÜ®N±Ûæ„ oBPo“éôÝðª^#(ÅÀ¨‚QïQƒ#ê}ÇR\qö¡Pq!ì<‚z&vZ(œÅ LÄ/%L„V%«’Ýü(]•ŒäÌ°çì䃜þß÷‘¿É#¡“HòòýŠômï´è1Þjѽ٢‡|½Eüj‹Zðr‹Zôb‹ñ¹µ÷™5ÿÉõÆwJêœGJ£Kêµû‹?þø=ÅGydqA@z{Aý|s~ñâÅ×ç4Wçn¼ñÆ˳×^{í%™+®¸â‚ŒFëì´Æíô´Fpaê´ÓN;.¹pᣒÇwÜa‰ ” ½?‘Ù+Ù5ñØÑ'§Í—ÉØÊ]o#́‘6ð4›f{šW3<Í°ÕC¦öƕõI ûxà} †bƒ‹-lÜÉ6稹IKLïÖ"ǔÏ2ù3á2°¡¥‘ ׇ-“aëȏ]j_X ò™Z¤¡PäÈ(œ ©&#En5Iî¬[\Ôm™Ó“š Ô”º ´”‰Jõ ¸ø[\¶’;×-9“C&{;‰p“ƒ''ný~±EñbħÑ&a’ _ôP’¾JÑkiú/ƒ•Êҝyâ"%ï  èµV}Û«­z‚—[õ@/¶éùžoÓ3?Û¦&<ݦ=Ù¦~§Mí}´UͨU½ñ@«ðèÞáÑÝ-£;K>øà­%uçMEõîu…Ûo¿ýêÂÍ7ß|yž<²ÜUW]uAî²Ë.;;{á…žž!;?sÆgŸô:á„O „NqÄû'Ç{'HïOèh2lh˚ïkÛ—˜ë“çæi“[ϛ7oÞÚ0ÒZ0ÒjžÌƒºœ:3Í­iÈ®íÓÒèz™§,îÀF˜KԜ£E&uém/Y¦|&œü¶ ´ ’áÒ°EbË¥²püpE֖·,ûS"6Ö_GFfŸ™õ6;^“‘\ÀÍskÀ™ÔhÔmYғš ô•’¸Ñy¢RÍø›;ÿVÓ­„s%»-™Öb֖ággââ)ÂMžœØÒý‰G³"âÓr“€Þ0IÐ9&I:,Å&’¦ÿ2tgS•ÇTèç=ÞJß·3 -ŒG7#ÓË 0Zc·ñŒàJØ«)Ø«UäÕîµ0Ukó:·Ób#fÉ{_»Øñ[í£Åm£ÛÛÔM·´ª×nh¹ûm†^YRï.*ŠO/.ªÛÏ/,Z´èìüÅ_|zN0{rNX{BöÔSO=:Cž~šŒý´ô€Ô¡‡ºoRe¤6 ¯'´)퐐øZ€ )ж©/œžãkkÛÀ'ÏÍ'ãÍÛxã×ð4¥¦ÃH«xÚíÔåÜ c ¾Œf&ö‡ð®Ùi!b ·1w[˜ÅEæsóczgÉnSÞ&¿‰-[¶Hl¹Ø‰,&[`ùüûŠ*ëŒo„ŒÌ{Á#³èfÛÍÊ×d¤È17—™q&5u[æô¤&(}õd9Æß"çßâÒº#ÙJ‘ \„–"¾%Ëës&[`/“‰­F[—‚rõe¶EħùeQ—H‚JÐaI$Ş’¦3ôi{•£‹ tv‘ÞÞÛŠ¥‹áée ú²Ñ Þ8†q"ø;·Ò*ŒôtÆ|MìÕLÐy6¦j¦ÊlÓ¦L©-™p_£èҌۅpÜ„ãö¡–Àþä{“òK‡swÜPdºôÒK-0w&•¾-ýû\M—ÀM‹Âpq“•²¼êß7§³yïžîž¾<݇çé’Ä † Å%÷Ôãø ž£ž"€÷ õlˆQBça©å  èñ ¨C_ùH§ã¡N=Õ·;õ¤÷wêÁïíÞÝ©¶-îTSoïPËoéPGÜØ®~¹®]Ýtu›zíŠ6u⥭7ÜpÃE-êÝóJðiñ’K.9­xÁ,,aÏ fÎi ŽÈjÈÉuÔQf?üð}Ó²*{¦4¾»¦4Ò;%5æÛ&4ú['d64#æšš%ëùš/kûš9kùd¼ÁH«zÚ W†‘Vòf͚5F# ÂH}LÇ&f'S´=zÍظˆQÈ3ŸsÌìL8½m¢kÞ'YÉphUUñÃåYB¶¬*òù/ñZ"6ÖßÙ®Ã#çB2Ûîò‘#Ùnà)p¹3©™žÔ”¿*(5«éVª„«IK¶zl9“-0{‰p“­FçtŠ`T¨¾Ri‘#>Í/‹º$Eݔ Ã’t]*õd†ŽÍb´rôsH-Ò÷-ŒB+ãÑÎÈt1F=ŒV–kËXNÀrMÂr­ŒåZ•_£µ3bm&Èz˜ª˜>s™R›3׶æ`ܶ„ãv$÷uL{ïA&ó2Y`îXn‘;‘Ú•–þm'æΆ›Îƒ›.ÂßtiXœé¦›n² S®žnë€S1¼mÎ.èå¦ êê^bw÷ƒQßÆõõ0õõXˆQO<ñÄãžxã –òÄR&Où‘§Ã aqN„÷ì´„ —²$I1O‰_ž1I ­žÉ YÍ39ÉÓ9AÖÓyÉSɓEaϓ%É-’Ç[õß¾Ó&y4tIîÐ<=`PÔ¥o»·KOð­.=Ð]]zÈ;ºõà·u=öØc·t©Y7v©•×u©åWw -®èT¿\Öqë­·^Ü.Ú¼ íÚk¯=§Mxtf+TÚ¢Î>©$\=¾¨Q8ºpòÉ'QÐð’Û˜;âˆ#¾‘¥DFc¹kZæa§´ŒÂv) ÷ü¤^œ¶Hj -ÌKh2lœÐ´X?À…hªÌô5iÖðµñM÷5‘V‘&ÃH½™3gŽó4×ìÁó¯7tkšƒS¦ )j!âRˆöšÀy$Ë|Î0½í …$™÷‰P´‚ªøá"©±z¼`u¯ÀgTÉuf8BFf³ÍzG\HFr~$—”än‘cn‘̤8gRÜY·&(5eYA).Q)îê·úiݑl%„³ÙnNÔ8Z²•b9|vâÁÂqd²7‘8nrðäÄlMq {–úMxCD6ñCQ—˜t“I‚^KÒIz2EŸ¦éÝ –+Ggç±\ ÄP´2(í O'Õ͐õ2x ãtæk"æk2æk*æk:–k ¦ÅLhiæËúLŸ™Mó˜f[ê=Ÿpܶ8˜vÄÁôu2˜–@& ̝uÖYGâj:n:nZ7Y]¦3)eyqºó§‹€§KÃ[S®¿þú+ñ<]Ãý)×AP7@P7CP·»»‚ºÔb0ên0ê[`Ô½TÀ¼–º–zÀƒ¥¼‡zèA ò*¿”/yÄU=p5l@Œ/!ªz4i"jy4Åù¼´&2Z=šµƒø¢›GòvæLõpQòPIò`‹äÛ­’Ú$÷·KîëÐïÝÓ©?ûV—ä®.}èânƒ"}åm=úò[zô,7õèùnèÑã^Û£&\ÝsÏ=÷\Ñ­V^Ö­F_Ü¥>¸ KPyn§ð謎+¯¼òôvÁçÉí°hÛ¹çž{lë™gžyT gK'žxâÁEqìÑ¾ùC=t¯œìÆnYY†3Ðí3ڏ¶Iëui˔Æ|Ó¤Öþœ¤æÁ -ûuZö³\HæËj>.$_she_³i’§y5Fëi® zÚ/íAk¿‹éØÁÄl ]š¬E¦m œ !_ó9ƒ¤™ÞFÿö2EË ¨JyUDÖÌ0ùŠÏÁúD¬­ƒ¢™ÍŽÃ#³òfï#±¶8Fr7wÌ­¦3)î¬[£Q·&(5%”–£[)R­;.çR–-Ùª°õa™{vÎÁL™œ—É–šã¦<9‚Šˆ[¿_>Q½ñ鍲¨‡‚PÔa‰PԉIº3EǦٙ2ôs–ÏÓ÷F¡Äx´02mŒQ£ÕŸõ0‚ýŒå £:–ñ€ ›„ [¶*“a5¦ÅZ̒YX®Ù­ ˜Ms˜aó˜[à`2dÚ.D&çe:þøã÷&ó{?Ë7ى¹#(2pTxlN;û‰ÄéNžì”39Ewž§óð<]HõK ¨Ë ¨ËG‰®‚ ®Áu>¨ëÁ¨Á¨›Á¨[¨€y,u;,u,µØKÝ剥îòDw{•_ʍÜHîåÚ³{¢ª{톏¤¨ê>+fUݛF2B«{)Qtoá4þ=„ƒgß*Yzµä®V±Ïâ6ɝäÝÑ!¹½Srk—~ù–nã!}ԍ@Ñõ½ú¢k{õ½W÷ê1®ìÕ£]ޫǽ´WOq¯ZtAxnÚ{V·úàônAå)]ꡓ:/ºè¢ã;ԉǴ«OlSÖªÿf‹`ÿ҂ ö-jdö,Èx욏ràQNc¹MV/I[fô~´YZýIŠòZ)"lI"l ío3DØ͗i.$’ É×¼#†‘`¤^OS¯›Ih9ríLÌV¦h‰ÉjáΩ@Hr[°xñâÛ¢ªÛdI%%·§¸ë#-´º=CÕñ,E¡rH^Ls[Ahuk)‰sni‘ÜÜ*¹©Mrc»ä†Éõ9“\Ó­_¾ºÇxHŸrE¯>yQŸ¾ãÒ>}ïÅ}zŒ ûôTçõéIÏé»ñÆÏìScNïUÛNéÔ£æߣ.9¦[x´ K½vx'ÚÁQÄöãŽ;n¿6‘ê>­”uhJÆ*RP´åÁ£œÖùfYjŽfÄÅ¥µƒ­—­“¢ÐV’[B³dzBóej -pJ@’¯Ù4ÞDžäkaÂHýàQÒåYfœ&f[ÿ•”s7:=%&µ9BS!îWÄ^‚ªøÃŋ‘ÏÕ~1%bcñu9BFf½ãðÈì½Y~Ûl7h€‘\À­Ì¤fÔ­)Ë”jž«ïVª„s)Kõi)â`²%ä¼L枍p“ƒ'GPNl­Æ‰[Î_lY²m^TÔ&~(ê¦ u]"ug’ŽMÑÅi:; eéû£g< -ŒL kÖÊhµ1n€R ÔCü­×ø &m,&m<&m%æÁfÄTæÆtfÉ̗LŸµ1dë2¯2•½Lš§å\&qÓpÓÎø›¬ÈÀžT±ÜxÚx:`]˜ru$u4u,uéN'AP§àƒ: Œ:Œ: Œ:Œ:Œºoԅ`ÔÅx£.¥.ƒ¥yŒË=ÕžxãJïšk®¹Ê¨|1ÈÕ>Ω@@u ·Â^›U]›ä4“ùRi¡Õµ2γÜ֒£ÌA^rMA`sMQ|uu Ò*عªMre»äŠÉ坒E]’K»õ+—ôH.î5Ҝߧ=¯_N¿¾í¬~=ÁéýzªSûõ'÷ë™OìW;Žï"ÓwÁ,èÞ#<:´›Àf·zmÿ.áѾTohíÞFý«V Ŏ-™íJ¨ùEíB[À£¼t“x”%)£å¼Nš¤”fĚ)Îù')Pš I;¡94)Дš…öq!ùUxԉ´{š±­LÛ¤2’ÄbÂY$º?%æM†Ì_÷à/FV„õû…šV4bmvPäÈÈ×"xä\Hd°pÈ©æ1·úΤfÔ­)#¥ev+¹ \£´ä²¼í$ƒ­ˆƒÉ–-¦79“-?GPNÜ2uâÐêK*•¦z±¢~ñ‡ˆz-E=™ O“¡¨‹StvšnÏ0Y†"Ç ž"&­…!kŤµcÒ:ËnFµ»6ÀHfÌÇ1ú˜“˜S˜SyœÎ|Yƒ™SF¦Š—iæÚfå2Yú÷VLÛmÈjÚxډ³s_'|÷°ú·jj?ÜO‚Q‡wó -£Ž£€QǀQÇÅ;Œ:‰JN'ÃR§â: –:–:‹xÞÙ°Ô9°Ôyžã|O@u' ºÐP]ä‹<.ò¡ªª -ðPqãÙ% QÕ¥Iî‡M]uÕU—RÇúÒ4IS¡Õ¥YÒÎóœÙ+ EñÕÅ%ÑÍÅ-’‹ZY¶#’ :Å>çwéÿ:·[rNäì^séÏÎèל2 _8 o;q@_~ü€žåØ=ßÑzÜ#ûՄÃûÕ¬CúDŒõ©åôª7¾Ñ£Ú»[½¶Ge®:Õ»;w¨Çwh×:߶Uƒ²u‹öž-JT^/‚GmTåñåÀ£,x”ÒàQ -®Krl·ä˜ÉQ½ú‡}’#ûõ‡èoÐG}sP_tà ¾wÿA=Æ7õhû êI÷ î> ÆìÚ¯îܧFï؋o®G³M·zmë.uçêìM;4›´kx6nՐmТa\·¤¡]»À£Ø¢G³Y·zmn—zwN§`ÍÑzí·Ù­ÕY-¤f—HÍ.’š]ò∕sâ’ÉYËJAÌø´ÀflŠë”“ÜȖ\uÕUû’ž`êÔ©]H‡/iCZ‘’ÇA6¤(å`¤¬g6IºzÀ` Fª‹ƒ!ÎQ=‰ûZà6𸭼)KiP†Rg‘Ž##³íqxä\Hîì$©>#<àÖt&5eYi)âVZJZryKîL\ÄÁA&[85¹ÉÁ“#(‡QqâVíWR*áŊºÎ.k’ ³M’ @*GÉ0˜Ó£~Ù°[¶~—†bÝNÖÚՙmø5[5sVoJ\ÁVäšÚo hëA}ÑVƒ”óÔ³l6 G›7 Çݤ_O¿q¿Z´aŸZ¹~¯Z¾nºdn®5îÒø®Õ¡­mv툫µ 0Vmåöµn¨- -S&À£2E¸ÉÁ“#('nIF¨ª)Kˆ:Ç«%þQÇUIT%ɤª’F2HÉ!K SÅËd1¹¤‹êFì°\?_9ˆŒæ!Ç"ã±»‘IØâ)áõr’U±ÔӑՑ5‘È,dd]~o}d>`#d:—lÆ÷nγlÉäڊ¹¶5³n>“p¦ã×´<·~Ȧ*iíØ¢µc«d‡v-°í;ÈQï$½šëm»%_ë‘lÓ+™ßÇ0ýú½-ô[à)Ú|@µé P4¨/ÚdPß»ñ€cÃnÜëד®×¯§ŸÝÇÅŽjåÌ5z­nõÆ]ÚèWëQLëjLm§jv+‡ÖZH;* X&….ã -£1y1Í`NˆÓŸñôeÄ>=i¡PWj¥•VêLNœ8±iKHZI )ÜÈæë÷rÐRZÊx¢¥4´””R€RPJ†Ùô½A˜ŠäÂlŽ‘"x$(ò€"oŹ6êïìqòù/ÓNâl¬£ 'ÎH;ÃGFâ‘+$Ù(#<àÖ¥¦,+-ÕÂ-%-9S}nrðGPNܒ¬/nÕdÉÞðj‰?\‚á’@’UI!éªd,A¦VÔҘZ1¯m_;,×ÉÎÔÍæÕˆև °ÉfÏÃî7™Àf¸{ã$d -N„UU‘éÈêÈÈZÈLd¿¼².°²Ÿ·!²ß1‡oۄïËcÌã6åÑ6óô¤›{zæ--}¨Ê‡ª|ͺ­ÍÄ­MÌ­š§[sÏÙü¤&ðü”¦òü´&õüŒ¦÷ü¬fûüœæýü¼VÀÖ­…­‹H‹–ÆV­Z$[µI¶lך٢!ÇzónÉf=’M{Icï“Ìí3'‘ñþv£}žAÑú@Ñ·è Öî×SÍê×CÎèÃ׫Ƭѫ®Ö£öNëVoLío¬Ü!ü˜ÜNÉ£6­µ’vÔBÚQÇQaêÔ©ƒyMNœÓ›ñôd@]é &t¦Çߞ’´%Ǎג”b ÿV@ò¾~/çë/²¾)ãéSҞh)(%q+YørT;çoÙ,SÛ¥"Y˜Í1RÅ{äÕN‚‰Ä{â6úÈö·ÑÅ¥Q£±ÅÎH;Ãí È‘Q$¸Ö5©)+.(-%-5€LqÜd 'ÂMžœ8ŒŠ°T£â–sS¼Zâ— *‰ª$±Ž&)d(29/“æ,—IRbß*–Ó†ÖÆþÖÁN×ɞ×Åîgפô²#öã:dƒŒe¿GðeÛçJÈ$<SU©È4d:²:²²¿<™Å¬¬ÃçÍæ“×CÖçÛ6à{7ä 6ôDUyz =€Ê7ª|=ó&ž~.÷¾Îåv³¹ |UI5u^Jž—VÌ£zõ¼¬ºi^ÉkêÍ-hÆÎ¥:ÑÜÉU­šè›´Iæ´kÞÏélÜ)Ù¨K²a·dƒ šIÖëÓוֹÌÆS´N¿>eP4³_?£__¹f¿ž`>=Ðj}z¾é½zÜU{Ԏ©=jÖÊÝjïä.z­S 2±ƒãüm£q­b•1-¢–Áqµ"Ž£x”âtçD<]Y±OGF(Ԟ;vlkj̘1-II )&$$è_sHÖ×_d ¥4´”ò¸”ZJâVJJ‰°n¼¾<¨‚’?”,SÛbm5ÉáQ$&ô‰Ûü#{|d£ÿJÊÈMiÄGxÈAQ„ŒjâQ.¤F©¤¤&(5å¯EK‘¼¥8SMdŠ¸šjú›"åÄ­Æú!­¦DċŠ¬ž‰?\‚Pd"Mâ‘ÉhÉbrÚ¨2lYåÌoíeyvµr}íâ%¶»V=mlíl†l‹]@Œ]ÆÛÃ~هw¡Ÿís¨ÌhvÓ±È8"5‰l³“ÉÈdd*2 ™Îצּ¬Îß®¬ÅçÍ@fòñ³ø¢Y|åڞdnºŸíé1f{z u¹Þu]_@µ^`¢Ç]Ÿ‹ÍÖO¨ ë'µ¯ŸR‹Ö§fõúiµrý aÀ¬Z¾~)¨#Ö/r3Z‰Ev¿iS¯Ín—¬Ó‰tIÖîVwÎ궠™dá³µzqõéSV¯BÑ´>}Ûª}úò©½z–•{õhSzô¸“ºõô+u«YºÔÊñƒì—Œiç¼Z Ù-ÄÕJ£Þ"Ž£Ž£¼8§3'2êÈ -€Ú2£GnM¶ ¥ÔÀÀ@1))$$y$貁~/ãë/Ò¾h)åëRžh)鉹’€RP -<»r¤JåR‘VIY>ÝïœI•XÛ5œ#Õ$£šžŽ¸>N>ïÅùùI–5bÅA‘#£8ïQŹFÎHMgRS>3PZJZŠ8˜ê#SMnŠƒ§ˆ¸5‘Z5å/Ñæ0ñB‘Œˆí,KMd2Z²˜ÜÖ¤1iß*g~k?Ï°«eÙßr0Rž=¯ÀîWìš”¶ÅV6È6X¥tédçìbívzIdéc_µçÙfGsëÂd2žýw2™„LF¦ð¯+#« SùÛU‘i|Ôt>t5du¾c ®$3YÓӗ¯ÉU®kq©«É î/›ÁMf3=éLn’„B¹ê™iµhfF{üÌ,±Àœš:3/ˆ™Aa¢E5FI[þZ­ˆ9kG:ÔCkt’„ÕU‘ÕºIÌêÑ¿N#|¶j¯ñ>`•*MîÕMêÕ÷®Ô£g™Ø£§šÐ­‡×TvªEc:é°µ| ]xÔß&<êm%ã¨ÇQ‘ZÇQ^ˆÓžñ´eÅ>­QPK¦¿¿¿˜îëë+¤$ù¤$g’dI&Я¤ýrÊן¥ ¥$´”ôô¡ Oô•À­xvk­¾¼|á0Pò†€Ò0gR9I;RÈ9Ž‘HŒ©‰õ–F< |Õ¤¦ÝØgg½ÕtÕÇ£ˆ ©~Îv“‘š²¢Ñ҈L5‘)Ž›"ð!¨8–j@âpë«+5 žÄÃ&–ÅÁ“ďE&£% Ìi{J„¹LÚ²’l^)©\Z@»}&,Éd,9|ùðšm‹vo ›Ôm<¤˜MŠÆ÷EÝúʱÝzŒ1]z Ñ]TÈî¤d‡ÚÑ×®¶õ¶©½=m£îVáQW‹ð¨£DH­ˆã¨€ã(å„=¥¬¨˜éíí-¤{zzò)I.ÕÝݝM" I&¡ÿ–$©@¿—òõI_„–ž>4áéãÜJn%·’‚’]Þl·êI½PúK—¦F©æ‰ªHvLì4J_ ‘e3ÍëñÕÌ=ŠÃ£š.¤åKBKõ‘)ÂM5á)BP‰,ɯ®ÄÙ«šÒJ2Åq“£%‹ÉiSò« TA)Á6–`C³jLI)#¥Ãšß"€ .¤lx³œvûŒ”'"VÀ{Tdû,…÷¥j£oe_mc‡m‡n:€ÎQœN5iÒ¤îQڄ{FMœ8±é¥¹@‘ÑȘªŒEÆñË㑠|€ÉD>o%6õI¸@L&5šLE “)ÔTœ試$pX™$TS¨Â8%% š’V¦d¬€j -刦äS -’ÉœÁŸ\BZÄ“Z‘6õÁJí$™tH&S4¾“Èá³ÐIÔåxHŸ< tqmH§ž ¯SÏÒÛ¡çëéÐ3w·ëé»ÚÔ¢ÎV5µ£…\ìÒرcÛJ"™Ö"!µd”‡ŒrQVìSÈ…òé®®®\ª³³3‹d’HB’FRþ5è÷’¾þ"éëoÐRZ -<Wàé‹|ÜJ>n%”’žÊc@ËÖ(Ùí„PZâvywíEęäüHqŒI®ªÉ#ZVŸ¿øëJM«±Þ(Š8ŽêãQŒٞšŒÔ”ˆ–j†ãj"SÜO‚ŠHdI~Õ¤¦©j*kTeÿ¨IKÞZ²¤oRù°œ•Øb‹-a5¦M)`9wîÜ$~ò5)ÚSl†i¶Å dŸBRŽ`Xž=4ÏnZŠQ‰m¶œi…nZ¶Qìû£È§¥=¹s”6ÿ.¤é¥ÍÚ¤éCú‘þÕdÍߚŒá£LƲ½›ŒÃ#2Ž~¼o¢'…¢A(4!×*i" ˜Ò3O àÐJMȨ¨D4>‡ä T㋒q%Nãۙ³V’ˆÚ,“H2ºÛA:,r&0'<4Š:ñ¯uèÛº!£.#£vȨ 2jÓÓ··ªEm-äb—Ôü–¢H¦ ¢›b2ÊAFYÈ(¥;::²éöööLJ’NV$•@I2Я$ýrÂן%|}@-ž>Ù÷„`>n%·’Ïhy¨ÇXz¸ï<Øc¸½ðÂU»–Í@Éîͨ J[Ô½û"Ž‘â҈ãPhD@PŸ¾ôRÓ*Ǚð8(ªIFKéBj2RS¾´T™jºšâà)Ž ª/½Ô´M#BɚU™- ¥ræ·%í[åjLV¶ÒªXZÍï9ܐ¢=/Áî— ïá={v -FJÁHi)^ù¥í3ËFšÅ÷òàQ<*@FEH¦â”Àž–QäӌÒæߊöév¤cT___gUºîªôð+½UéãoMúù¼~6úP@+¶üAßD¼J ḈøÑ \Wԝ2Ñ3¦êÐè ’U;)G4˜C8~?X fX⠔LÔèþ¤•°¢I›ÍÈ)j§v»9‰ªž¢vÊ=Eíú¶Ȩ2jƒŒZ[!£z¨Dv‰4ì"ÉFàQ!å!£œ`'—…Œ2Qº­­Í$jmmM%+’LT$è_Cñõ¯ %ßsùž>ÞiI_îáVò7aôPü-ƒ’Я|[½’ݺ% ½Õ¼g>Rá¹æ!ôÈQ«¸´™úØ3òå÷ù›ŒÏXêéšPTŸŒ"x´”a¶å󤥥D¦úÜTžâªQ©¿ˆ¿|2"¾ªŸV³„C”´=•« -X5&m^>ۘ’ÏÖæã (ß'·á†0RFJ°#Ú}^å«+ì& «×,4HÃHi¶Ô ›kD<ʁG9ð(Ó@œØS¥Ý¹4Jû´IË(a@kUÚFio¯JG(ú‡Îªtñg&Ý¡èóºÙò{<¨*¨Ê7ї‡Â‰¯P¸®83JJ|ЛÒ3÷¦‘ŒH¡7k¢ÆôæÄ4=y¤@à°hIÕH i±$"„t¢Îªt„N¢*µQϨUÒ -µ@F-Q©ET42*ÑCEµ#_ Ù¨ ¦æòQ2ÊBFYÈ(#J§MZZZR©R©”JJ’& IÂ$п&¾~9ðõ·>´ä{úP߫ВG‡yžžÀcÈ<ÏuËn%ï(<†£ðŽ"þ6ŠÉP%»¦Öni³[I"9Jq¥@©æqôš 4õaçó_ñŸ±,¥Ý3áSß-‹ ©ÉHMYÁi)™å¦8xŠ“š@õe–e¡ÃrÁ"´T”F… dÎ$%mT[V¹Ò·É.L)_%§M®|¯6¾_Aù/»«Â®®#Yaä(«E¨=4Énšb_MáŠHKƒG¼=ð( eašœ“‡}ò£´YBCÑ.^ªJKUZ«ÒÆ‡¢0éðL *¤Óƒª|}o($2‡Â)°P’z¾NŽÐwr˜¾“cõ¡pÔ¾3k"zèÌIì¤Y(Μ-½!Ѻ-s U¤¥…RFHÉAQKŠJøŒŒŒŠtŽ‘QAOŸ²àQ&WÁ£´áQ2JCF©b±˜4IJÉB¡HT$ôßBñõ˾¯?ó¡%ßhÉÓ'{t˜G7y0¦Ç@yŒ›7ªâVùŽ"þ6ŠáÅÀb -Œ -ão³fÍ5$QÉ@ɕˆ$s7 -J5¦(•fäñùۍÏX0×qPÔ(ÕÄ£eE“ú´4rdªÉM5᩾4ºV¿,2r ŠC¦š´Ô(m_­ý9̙äñª_¾JnÞ¼yå+x‘6Ø`»¬«\sÙ* Z1fm>…`”•!¤ !~¤Œ”d_M²Ã&ÙkS¸RàQoO<ʀG˜& âdÁžì(mÛ¹P´‹ç«R¥Ý¤8Dô¥ª´ }€I«gU…¢/jõA+"N¡× -çÁBI -SBIéqÛÒ&zú֌‰¢5‹äL8n–¯JÁ’ˆbEŠCĜD&Ø¡H’«’QÖȨ@òu¾JF9È( e!£ d%ӆGB!“D2ÿÿ³wPQeËÌ:Ž3cÎ9GÌ9aBŒˆEQ‚ ˆ("¨¨`BŜEŌ9çœ3æŒ9çљqæN¸÷UÕ>§O÷á4ÓHìWµÖû×]omÛßÙ»þ]{ŸÚ™3“¤N£“Ô²X[Ãbm ÂZ疬¬àC­ðDZn þr+*+!-+ä– -ËJ©°¬” -ѦBÈ©ôÊJÊþ›RV¢ý7*+Å}PI9Ìmêåª*£¤å‘ⵉô•îᛕøOÒFç{£"þöˆ=Kʐ„X¦¸}SÜæɉÿÐýf%^Ê·dªQRú|*]Ñi1OËzƒb’“¤^ÊÔ1úâÐÝ]Õ«W—Ú RÿðHôªxjLš©1}¦ÆDš=RôHiÐ#¥Á\›³nZ,!¥E”íQ:´GéÐ¥GO“-N4@RA'É(2{&CÉl(ß ÿX‘,$Vh¨ôþŽ,XHù )z‚'œ…¤o%_’ÜI–ôðí³dÐ ¾d&$ªFÉ,Kf’ï D*É¢oŠtÎ(3þ$äŒ2ᣌ$²=J›QztF(iÒÉÎ(MÚL™2¥Nc Ö©ubM"»%+tKVVðyVVä–ào“Ü–•Q*t´©°¬” -1¦B ©p5VY‰ößTe%ÚS••´z¨ÊJÊaÞâîrÿ36 ñߎ$d’Ž{ú;u˜{’?A²°J‚-“©æ)ñ¬Õ7&ñ2Oq»¥x%¥˜¤4:W.ƒ¡Å<-ëiOK}òHte)ݗÒ{Cɨ!™„ÀŸPIf+4TzQfkEà/ϜšëW$iHàûeNK_7s:à[eB2€Ð›f™2HÆL±Eß -ɒ>™"Ù¥3tFig„’†œQz4EhR§C?Dö(mƌS§‘Å:µ¡XƒX¡Q’þ¬•º%+Å-QY ¾A*t¯©T*D– -á¥Â-S3”•â>Öm´¬”`£dêd3ڊ”. ™¸MMlX¾}1á)Ž¿o2£úfå+͓Q·d‚Q2ZL2²á¦í‘(ƒÑ e5zm‰<u¬V­šÔ0‡Þ§Wžè-qz_¼D‰䑬SÑÛäà‘¬Ñ#YcšM 75¦ÞÔè‘R£GJ) z¤4hÒ 3"I‹Æ&-:I ³§S äýôzÿ?’ FÅ -½”žÀß!Ěþ^!©I°ˆE’† KÆ´ŠÀwΘNå%³ bKúŒ±%Å¡O$S¤çŒð'ÑsF²=J­gÐ¡X“3J“!C!© ÄÊZtKV$薬·[*,+¥B©O*•*~e¥¸O+ÑÓÿÓJZe¥¸·ÞTF)^)‘ Æ·#_9ߛšN’?û±°Ä[âe™lž,EÌ㠌º¥¸’V1é«6ܤlEy‹2å2Êj”ß(ÓQÎ#Dí©Ñ y$j>H¯AÑ Qôj½$…]x0¹ZcšµÆ„k©×“°5z¤Ô˜“S£GJö(5Ú#’4hÒ »‘2;IZ!òU’N-ðß)¢g¨¬HÐUé ümé­ %5±IƒÕ-Eð52=IGBç©5$ƒ,iÕ¢ø!Å8£Ô*g¤³GÖi ‘°GéÓ§'±"±VDg”¬Hd£” -ÿå©Ð(¥Â²R*D!¥—•âõ=ZÝ´6áL(+™`”L°GIæ-¾Eùʄ‘ü™Ž…Å|ò•Ã€½”é6ʨ[2j”Tg”Œ“T§·UnF=å-òH”Ë(«Q~£LG9²åAʈÔI‡zêPwê³C¯FÑKRô^9½8E‡‚ñ­sL½ä‘¬1[ã^›5z$k´GÖhR AC€ÆFHï$iÔ6@%i…ÄöRz‚N!–`™ÊZ%ð]Òáù紊àËcz’V~¿LHºØ’&b€´„üNÒ)ÎH¶GÖiI{¤ª霑¦GÒ z¤TBà$ѹ% %*+‘QŠY žý²’Vo¥$ۄÓÚz3Õ(ý?·BfœþÙ±üÿsœoVÌh™L5Jq“âu(‰<’jÃMñH”·(ƒQ.£¬Fù2å<Ê~”i£…rc‰%¤|©“È#ÑëR²G²JEǃñ 0&a+LÇV˜˜UFÉ=’5Ú#IÐ èŒRjtA&ˆ–ƒR›,+•`ՊÄZ,g‘¤V‹]$i E¥¦wÎdIM’NKT~ÿåiIg¤³Gi ì‘ m©ý»=Je¥ˆ†QÂ;U*Å(QYIkÿ̈́²=TVRÎv“±6aη¤´ Ð:Ûÿ²R¼,,,)Vâ–L5J¦“âCI*¤u(Éè†åAʈªb’–Q¢R„l”¤ÔKI˜Ò1%æØ¥XnIË2˜'-‰UŠS¬HЕQR‰Î#Y%H4<’µ,©ÐiŠÕ¿Kª¸=’Ö֛ÖA¥ø—•ŒnÂi]÷•]–ŒY2º §*+™j”Øo°°°°˜*æ6JF‹IF7Üâ~¹‰›‘ -¨b…´übŠŒ:#U I呔:’jÃM呌“T 'öQb£ÄÂÂ’Èb£¤å–TFIkÿMëX·–[RՖ”sKq[&•oR™'•ƒRÙ(ÅKi‰’WYRª…§‚¬X!Å)¦HU32ꌔ’Ö^›â‘Tnª#ܪb’Ö®›Ö…oÜG‰………%‘%!¹RVÒڄ‹Û-i˜T–I围̓â T6JñRZ¢äP–oNŒRUÑWù!Å™àŒT%$Å#)·ãöHZïºÅ«˜Ä¹YXXXE’â ’ª¬dô%8•[RÎ-Åm™T¾É¨yRD±QŠ—R‰ÊZÅ-J†eI‰--ܪ'Bå‡S¤ÚWÓrFª’ѽ6•GÒÚpÓ*&ñ® KÒJ‚÷ßÌã–Tç–L°LZ¾IË<©”b£T¢dD£¢²[,)ZLª2@ªú–RLQÜÎH«„”()Á»nl”XXXX▄%­²’¹Ý’–eRù&U½I1OŠ(©Må¥T¢¤EË£€êQQ=Hʦ¸u-gdª=ÒÚk‹Û#™PLb£ÄÂÂÂbnI”²RüݒQˤª2)¾IË<©”ª¥ªFÅ-ª,Éò ‹ ¸UHË -)~HË©œ‘–=úJ”à“Iì‘XXXX"f,+ÅË-™j™Œú&•yR9(•Ò2T_)ªÌɒb$ÁhµžÕ#¥ø!-S¤8#UõȨ=Š¿Gâb KҊÖšÈnI«À¤²LZ¾IË<)¢$*•—R‰ÊZ}¥h¥O–äóPUy•¨ž0Õ󧪩œQÜöÈÔ½63z$6J,,,,ñ’x¥„¸¥¸-“–o2Á¦éOÙ²çȑ#'DŽÙ³é°*Ty¨¦äЛ|)SD ->stream -–(­r¹0†!Ôì¹ò,Zª\åjµضhݾc—nN½œ!z9uïâؾ R­Q¥B™E„Yⴚ2#ÔBÅJ•·Ù·©][‡ÎÝ{:÷éÛ·__—>ÎNÝ:uhc‡Tm*” ,¥U.§ÀЀZ ÖmÜܾ½cW'gW7ww×¾}zuïìШ֩nS¾4˜%J«¼ZM‰¡,i¨ªÔ¬×¤E띻SO¯¼<=Üú:÷è"Q­ŒÍ§ÕF ÖoÒ²CW§>®^Þ}}úx{º÷ëíÔ¥cۖ¶ jW«„f‰ÓjJ ½âƒÔZõm[¶uìÖËÅÝÓÛ×oðÁƒ ÐßµSW‡6-›Ô¯Uµ"š%N«)4ô+J°N͕W†j×α»s?¾ƒý‡øäãéÖ§g‡6-šÔ«YÍRþ<¼ZM™¡_ûÅâCAp¿0ýÔN=z»zúøù  -æï7ÐËÍÅ©‹CëæÁ—W¥U¦š‚B²¿ -Ô¢°¤‘ öqóò4bdpðÈAC|½Üû8uî`߬š%N«)6äùÖ4Y²þ”#O"%ËÙԨׄ ºä8bÔè1!cFæï;À ¨¶oÕ´!š%¬AäÄs\Na¡o³þ˜#wþ"%ÊV¨-Û"To¿¡AÁcBǎ76dôÈ@ÿA@µG§vv¶ Ð,QZÍÆi5ŅjM“;áe+U¯Û¸E[G‚0bTè¸ 'N?vLpÿ /·ÞÝÛ¶³D5]Zå½Õ”zN ío¾BÅËT¬V§Qó6ŽÝêàa#nj6iòäILJŒ -êëåêÜ­c›`–*—+%¥Õ,œVSVÄvJ¥+T­Ý°YëŽÝ{Ԑña“çN Ÿ2iBè¨áC}=ûõê -¸Q¬ApZM‘¡ç”¾“œØßMíº9»ÔàÐ “§MŸ1cÚÔÉǎîïëÙ·g—­š6¨-¥ÕœœVSZh%UpJ¶­:téå:À Nœî½»9´Ö¥U<²¤š€­R"Õoø-u†ÖïúÍTͱ5e+QRíÞ§ÿ a£ÆÔÅËV®‰Z»6jõÊe‹çÏ -Ÿ0&hð×^]:´RV«â$°~ãýy7µ~Ão]kh]whîúmî°2(*Ñ¢¦bµ:[¶ïêì>0 xܔ™ó/_µný†õë¢VՙáãG‚YêٙҪ´·ª·®Ñ§ª‡Tâ©×ZêúÍTÍE¥¹qQS¥vÃm;÷róö9v2B]½vÃÆM›6®_ Tç͜2.8À·?¦UQ–Óª²®±6œx•~ßô"½è–{¹›? æ_iQCIթ߀!#B'͘·xùšu7oÙºe󆵫—E̛1y,˜%L«öÍÔªZ¡tq: ¬¿®Ñ¿ÞF¿9´è­4‡æ¦ß‰VúE%±¨©T’ª‹§_PHØt„º~ÓÖmÛ·oÛ²qP;=,tøo7±Z­iS^Z×èï×ÄF*šCgÖõ†Æv³õ°2Us†Ö¢†’joßÀѧͨ6oÛ±sçÎí[7ÕEs¦M„iµSۖëV¯ŒåBÃ3£©•ûP¨çlÑî;‹®;t–,Ôô;£Üš©š7ôæ_yQS¥%UpJ£&L±°®iÚ@Ú¯ÑunÁºB:É áÄKݾ±5´è /_^ì °J-¿¹‹¥¹CQ#'UX©¶éÔÓÍ'`ôÄé󗮨û=q¨nÛ¸fÙBH«#ý}p]£š€3‹…ŠdD·o@š‡ZC”ZCȟOjùMTy¨š=b%UZ©Úwìќ҄ió–®Þ°m÷ÃÇNœØ«ŸS§¶-ô&`ê܂e¼[ CÃ0ÅÎÐyóÀÎТ5tÑ"… !V¬@5Ëw†C5¹Ë1ÿâN¹.©V«ÓÄ®Cw¯!#ÇM»dB=rüÔé3gNŸª»¶®_¹dÞ´‰£‡ùöïÓ]LÀà€ Š ø;ªe”³i¶ˆ;C+¡ßºÜñû{Uoèäþ9,#¤ùWo¥Z¾JíF-Ûw§4|ì”9‹W®¨GOœ>{îÜÙ3§ŽÞ·sóÚsÂa]ããæl8ÿHÞ'“(6dUš}+Q²Tì M­¡K–(V¤pÁüԘTš²ù”©YCIªb¥Z¸D9›š ›·íìì1(0dò¬E+ÖmÝ}ðèÉ3ç.\¸pþì©c‡öîصláÌÉ¡4£֕ ²¡£ý.³Xšþ˜ ™¡Ë–¯P±b¥J•°3tÙÒ%±áw~͆ßÉý{XF¨’*Åò8¥ÃÆLš¹p9B=vê셋ÑÑ/ Õ=Û7®^:º˜€ÑK5à|Øg–ŸXÌ*¦Þ| Å^ßrch]gèÔƝ&`>åoþЭTEùW*?Øwtêç=tÔÄ –­Ý‚PÏ]¼tùòåh zôànH«‹ç„Ç ¸WçvX/8æBï“õ{º‰*;öo—z}W²©Z­†ÔºZ›JåËUƒ~ߜTͪò¯(?4±sèÞwØßéó#£6ï:pìôùèËW®^½réÂٓG÷ïÚ¼v¹4÷íѱu³†µ¤¾èhñþ¿Ÿ¤©·hñRe+TªR­FMê -5†®R [)ˆÿ½ÞüËPÍåßì¹tN©[ÏÁ#ÆM·t€zéʵëׯ]ª'ïÛð<œ€º÷îÚÁN>‘/7~ -L½`êŶÐUkÔªSÚB7jÔ°~½:5«W‘Û}çŠÕ="¹ UùՔz£ý Ÿ»dõ¦õÂ¥«×oܼqýêå gŽÚ³mýJtÀ#† €Å*z¥jظ¨æʑ=;óˆ–üå+U©^«®ÔºY3ê ]·P-Wšþsýî Õ|aTÑ)‰šRgg÷AA¡°¦Y½‘ ^¾vãÖí[·nÀX=}ìÀ®ÍQËÌ 8½’Ø/Ç.wùòäʕ3-N!–­P¹*vúnÒ´y ;;ê Ý̶QƒºµªÙT([RôšUšG0TóE,§„ö·©°¿!“gG¬Ú¸cÿQ€zýæí;wî Õó§Žà¼dîTðJÞ®=;·mјÞZ…5_Þ{âО­ë–/š59$ÈÏÓEª+U(S‚®Ã:/®d V¯]¯‘ms»ÖmÛwpèØÑÁ¡}ÛÖ­Z4mT¿vu› -4]¶še¨æ -UMI²¿­zàš&læÂë·ïC¨7nߍ¹T¯\zTo^‹>{üà®ÍC–50úJ—,Q²TÙò•À"5´maßΡS×={÷éÓÛ¹—S·ÎÛÙ·°mPÇu1÷6Ø(™1”B!žÍWHZÓtŅêøió—­ÝŠP¯Þ¼{ÿá£Ç=ˆ¹sãʅSG¤¡4ˆvkš5ÄDY®L©R¥J—)‡¶·nClóíØ¥G¯Þ.ý\]]ûõÕšÞpe¨‰škšæmi¡:nê¼H„zŠ >züäɓGîݾ~Iª`€ýÉÃP­U­r…òe˖-‡—‹Ó¦-[wèÔÍ©w_Wwþžý=Ü]]œº:¶kÕ¼±~ïÊ,¼¤1¨ ,^¦r Z¨z ÂêÃÒ¨-{ԏž<}úôÉ£ûwoŠ¡ºnùB\«úzЉ}°?U+WªP¡BÅÊUªã](-ÛtèܽWWÏÞ>>Þ¼<\]zuïÜ¡µhHªw¸”¡š;ä}ò õªÍÚtêåîª@½uïÁã§Ïž?{úäa Õ;7®^<'|ìˆÁ^}:ÁPmP»nÃØT©Z£61uèÜù¯»§÷ÀA~~~ƒ|}€j§.¢w0CMÔP-T +]©z½¦­j`è”9KÖlÙ- >|òìù‹çϟ>~C ðž-k#çOŸ0 -wË»b“ÑzµkV¯V­ZõšuêãU(]zôîç1` ßÿ¡C±u°—{ß^ÝÛÚÙÖ¯UUõ;z¹ŠÍ¯YÃ`¡*ªÕ±§ÛÀÀ„ºYúâåËÏp¨^‹>stßv°J3'…ê mÖ«S«fÍZµë6Lz»ö÷4; - 2È»?çîRãJ|¹*_îìâ=H¨æ-¨¶öŽRpÉêÍ»PŸT úøþ—ÎIóXÖïÙ¹½}ó& ë×­S§ný†MšÙµ¦}Ü<}ü†ùêÕ«—ÏŸ<¼‡óï¡Ý[¢`©J›å؍ҮY“F 4hØضy+ÁÔkà€áÁ£CBCCƌ4t·» 5Pñå¾çMb„RR’ê„2Tu“ꋗ¯_¿zùâ飘ÛW/ž>²wëÚe fй—ÚÛ·lfÛ¸qcÛf-d¦¾CGŒ7~„ñãBF6اߞµ>A,Z0oÎl¼¢Iœˆµ‚Q¨¯^Uš¯ë%Uz·±‹CÛV-›7kÚ¬yKûvSÿÀà1ã°Ã줰‰ãB‚ƒüb×JÝ«­òä”Ì/û$s‡ #ŒÒí˜GÏê›7¯_>üà,jŽíß±aeÄìɡÇ puîæؾM+»–-[¶j­c:>lJøÔ©Sé)6˜•¡Ò±RÅüò@5oÍ©>ºœªƒú† >yp÷ÆeZ©®Â•êH÷>=ºtl×ÆÞÞ¾uÛöŽè{‘é¨Ð “§NŸ1sæŒéá“ƇŒ D-ÓìlñüK‰"ùs³OJ¤Ð\ҀûE£" >uñÚíûŸ½|P_S¨²ýÅsÝû»ôìÖÉ¡}Û¶mÛ;8v¦žé؉S¦Íœ=gîÜÙ³¦O™ˆ}ð°aÇó‡…Éüêù¤äþ%,( Ϊש“¥uª&ԃ;7‰ó0­:wïâèСƒCÇN‚é`>cöÜù ,ÀF¤“ÆaËJ€Ú®e“ºÕ+•ej.Ù'qJ5s«(õt“+J{ŸVA} TuÔ°A^®½ºuîäèØ©K7§Þýúû D¦3çÌ_±xqÄÂù³§O?šZká–zjqE#™_ž}͆‡”òjÕ~Ô;:¨"§JÕ_Õo€›K¯]»tîÒµ{OdŠýÚEÒ¥‘‘‘K/œ;3|ÂtTjU\¦¢ùeŸ”(¡±õ¦·K3/2 -÷S£¯ßyðø¹õ™Îý¢QPÝû:;uïÖ­{`êáí7ldèÄð™Ø…tùŠ•+–/˜?[çÔÕ®ZW4ÂürJ5¨7Éq?µ¡þ~ê¶}GÏ Ô'U¬S¥âï<þ‹P½=úõîåÔég¯>ÀtPÀˆ Ètéò•«×¬Y½rù’…s¦‡Q¯ˆžÚ6oX«Jù’’ù•|Ts†Ö{oòɇ‘xòaݶ}ÇÎ^ºq— ¾F¨OÅܺz‘vTW,š=e\0BuuqîÕ«—300hèð1ã§Ì˜»héŠÕQëÖ­[»fedÄ\©HÏNm*.S *—#ôV4òÁ³*µ·ìÐÍÅkHð„é —¯ß¾_õ– uµß=[Ö._8k2.U¼û»öíÓ»w—~´@7y:2]³nÃƍׯ]½|ñü“©ôïäئYƒš6åpEÃ>)‘By—\uD´ï€¡£&ÎÄs¿ŽŸ»|óîC ªn—´D.€82 ºõsqqéëêá5pH`ðØ°isÓõ7oÙ²yÓú¨K̔¡¶nV¿Få²ÒŠ†}Rb„ª•ò.£«OÀ˜I³"VmÜyðÄù+7ïTܤÁz>¤TôI«—Ì›2bè oOw×~}û¹º{ù 21|ւ%+”¾†k©«–€Ú±uÓú5p™š7'û¤Ä‰XM'ñˆ’´¢¡ÚƒØy»"m§¾ÂMò÷ðýÅþ;c†T7WW7OoH¨£ÇO™I½*±­á®;¶m^¿:r¡€Ú·GG{ÛzÕ+•Áe*CMœP·ç> ͯ‡ŸrîìâÕ[1bü Ôû° 9wâàî-QØ~güè _oO77w`êë8jì$H¨ËVӝ»÷ìÙ³kǖ k–¡£"¨­lëVÇڃþŠ†g_3†ÒȎnœÏ] H)< Oï§!ó»vÛÞ£§£¯ÝŽyP!žMï{ú(ξKçϘ468pBu¦âÕ§Î^¸tÕºÍÛvíÙ·ÿ¾=;·mŒZ1_}ôêÛÝ¡U“ºÕ*–Æe*®hØüš=´Z®W¯k+½J3q¾Jƒæ÷úûž>¦8PïÞÀ/öl]³ï´‰!#àÙß™ú‰Éwþ’k7mÛµwÿÁCìÛ½]êèP]jjX{àMâ„n êúˆ–}D¥Fä“ÐüÞ ¨Ïñ,!;;{œÞQ¥ÙwøP?„ÚßÓËg¿p¾‹–­Ù°u×Þ‡Ž9rèÀޝ[Öa—µƒV Ké/SÙüš3ôۈ~O·XSw|‘ÜcP¾H¾}˜ß»ê3ÝYî}Û7¬¯ÿ Ÿžžž^Þ¾ƒFàÕ' –®Z¿eçÞ‡;vìÈ¡}»Dëq#{¹t#¨¢ ¤¿LMîŸÂbB5P¥ /ê6i%:žÉoÒèŽr?{F•ÞºØ½eíòEXÐ1l°¯·0ÅÉ7hÔ¸IÓç-†Éwûê~'7¿[µx.Bõ¨-צ*a.†ša%Y_ÃKTkbçžøÊqØÌEôvê™èkõé3ù¥‹ÓG©™Çü™“Ǎ‚Ù×ÛËËk€Ï !’KŠÄŽ†û;yêôéSǏÜP—̝ŠPûtkß²B-œŸ -JªyÃ` êß &f_êø° R*ø¤Û1?yúôÉcz=ê½JŽ6),tdà˜}ª·¨“gÌ[¼rݖû;yúìÙ³§O;´w;íÑéA-W²°ª ”Ü?†…„`*Y_q1cñ²•t¹aöµe÷á“çÑ'!Ô'â@ÅõÌÎMk"M -€Ùw€Á@]¶fãö=ÔûîüùsgO?¼oǦÕK%¨]j­*r闗©æ +Õ@͉µ|¬s§‡‘MÂÙw€2P—¬\·u×þ#'Μ»pñâ…sgNÙOÍd¨-Õ²a¨‰zL偊 «×mbס[OÑCT̾”R* Ô«¢å®gÂ'ŒEª¯z nÚ±÷ÐñÓç.F_ºM=Òvnf¨IVºÉ—ne$ë+ Ô6zºz5a:xß-{ÄìPñ5r¨—ÏQDZžä/l’¨c'á@]¿u÷£ÔÎðʕKϝ¢¾K‘ó¦g¨‰ -SÉ%‘õµkŸþƒ‚B&ϊX¹a»<ûRk€‡1Ò@ÅÂâÙúU·F¥ºïð‰³.]¹zíê•KçOãú'*rþ´ñ#jb†Siò…5j© -b Š[i¦Q_ƒ'Î^‚Ù¡>zHõüÉ#{©ð0C¨Äz‹I“¦Ïë‹Íd¥n†×¯^¾xæø!XÔ.C¨Cj⅜PÉùÒä‹͗£;É!£ö2i,R·aåá -;4P£Ï?¸K&`ÙW¼¥ªï,¼cǾ#'ÏE_¹vãæÍׯˆ^ZT/ZÒ0ÔD…)&Tiò-^¦bµ:âöj¨Ø@mҙh1û>’*Vifò8¨¸F¥ -!Ù¤is"V¬ÃÁgD3ÃÛØösðÖuËLŸP]¤u*C5sXé'ÔLße¥É\’MÍúMí¥+q ®Û¶mÒõÛ÷ª®…L¦¸;>Q7P=qö¥õ Þy²êÕ·îܹsûæ5| °é@ f¨‰Vª„*M¾e+ƒKjÙ¾K/7°¾ÓÄ@=vl’˜}q b%¥B(*îÏ (lÒìEË×nمJêexçÖu**n_¿|ጉÁþtµ_éÜW”̱˜þ”#M¾Uk7jÞÆÑ©¯×àᡓEFÕ¨°F½uMj6i°‘Ú¿?;Á¡aÓçá•'ð§Î¹ºs/æ~ <´¡¾}ý -€:Ê@_Üz“ -ú Õ\!˜JU)¡æ+T¬48ß0ùvëãá; ¤–Üú•ZÉ™SÄ@õêïáÑ7Rƒ$›D=Ÿ/J­ ï kEo².š6j¨wßî¼õfæ°Ò1•M’”PÑù6±ÃÉ×Ûä¸ð9‹qzä”ýiò§£cX!D#+N<„…Žµ?7ó–f߅ËÀ&Á£péÚí{=¡bñ<ÐthצՋgO3l [OG<"*<ã3J_Va­b*V¨˜Pë7mÕ¡«38_œ|#V®—ýL¾Àô±d“äáb zz¸»¹{xùÐì;m.^"Få -ÜÕyB{êØíÂÉû7¯Y2gJH ¯[ÏN­›Šs¿yrü¤ÿ~S5)¬¬b¥;àÓ -¦Y~& V¨P[¶ëÜÓuÀp¾3¥‡.é.N£O°ì+Ù$ù`(T¯þînnîý½–f_± -Š†úP42|LçIOÞ³%jéÜðРAî½:·iF'ôՇ¹™ê¿…Ni¼‡™fý‰LRÉr°BmÜ¢­c¾ž~c¦#½É÷‰ÞFª´ž‘å{¸!Ô¾8ûŠE*SgŸÓ!a|EC´\Šœ7uìp?ç.m›7¨‰ïÒä͙-«þ»4LÕ0ÔcR'ò”¯€OOדñ%“T­N£æ˜P=|FM˜ -³¨´Ø¼N©O±<‚Ù×&vâKQ3' _µpÇW-Äì»JÚՑû¾|þTn¹´miï­]‹†µôßzK§»èØܑÜXâÿþ/RãD „TaJÆM¬P!¡ºcB2{•oÑùÞ¢ÔA†Gw0t.†úÉïÏxù 6g_X¤î¢MØJà¾MõâÙcê$plÿöõË Š¿åõÞO×÷% -ÖoñWàL“FðL+_kdš§™¤šõmq… - u%Ô¨Ít¿¬Kî?Ô?zîÄ!Å& ñµŸ«¬R‡Ž¢Ù©‡OÊoȽ†ï²bϏV,’JJv´P•Þ»È$®ïCª‰Ž#¹ñi„1z±BtN4}zéji¼²«ƒ¥ËÛÔ$“äÔÏË/ˆêjÜ;;EçÈî ßypïÖµhqsI¤°I~>0Pûõsuï/ºÑ;h“DϏ·oވ·Î¯œ—ª£¥…j½ê¢;‹®…3PMÇ¿&¡‘‚¹§™Z#œéÒ ž4c&éø칀)_a’\ú6z¡Ñ%T` -v‡ êŽåc5i"Ù¤þî®Õ4#CiöÅ=õs—é¥óWoÞ¾{÷›~Ü¿}õÂÉC»7ãB5ªðUù­cùþ>Âjî0Î6¹QÊ¡æiä’&MCœ‚&ò̈7K'ßž™‚ñ•MÒÀ€àñáTèÛ}H:l†Lå·o\&ï+fßQh“<`öíçF¯Ž?Eš}OQkJ¨oß½÷î ö\ºƒöW¬iÆ òpîÜV×ôAºk¨¦¥/`ՀSV}¢j~Ê «„ΌNºW:‹¸²¯7•˜6lfïЭ·»ÿȱSf-\¾V®ãßE¦/ñ5ãç¸0¡¶ùRC\¤úxŠª?ûîØLêãòêÍ»÷Þ¿ûúÅӇwÑþòÉ_zEJ´†Å[jºtêA‚Cÿç1$›2°ê!Upêó3Œô -N™æwx«ô÷Y³Òµt³t‘âÀ´Zí†`|Á$y:i&í²ˆêÝûÔ´ùµèÚsëšx%u•AC|wÜǏ¼ïyö›ôôåk`úñÃûwo^>{NIgƒÉ)µ¢wÉE}¼k±¦Oûßa†0 ¬€M~¬ -R ¨a¦”"ƒ^N¢™õ‡~ü‘.¬ÅÛM *Z¢ty`Ú i«ö]zöó,›¤í’I"¦ÔbGjÇ".Z)*þà}Ý]]]±ò0DTVH³ïí˜ÇÏ_½¦?Õ·¯ž=&§„û4‹f†¡Sê)õg) C5WvA5SƌÌz?Lz]lòc5@*ˆÊ>VÂ'E&%äÁù= NA3[6¼®6g®Ü€o7-S¡ru`jÆ·¯ç @2I+×oÛsøš$j®ö­Ô¶î&–åu)•4înn4PEåa‰Þìûâõ;`ú3P}ûúùᔰ¤?gJ(&Õ.íZ6ªS­béÆë²fùî»Ì™3™3ô~–Œ2dA6Îi'#UC¤PÝԊø2 „ºÈ’E¢©œÙs Í\¹sãݦùÅ­‰e+Ú@>¦œ\úûŒ’MÒAa’h¥ùöí»·oåþ¾çN¤]7<LjP=ÜÝÝi‘½Ln[¿†MùRt/nöl?þõûï³dùÎÜ!ý6d"+qMf¬2SRÝÂ$³Â"«.ð®w18 'Ñ̛7_¾üù ,T¸HÑâ%Ä {u‰iCƒÇM™µHg’d¦ïÞ¿ÇeÉs¬õÑV7žy˜1Yîò@güÀ&M íqÜ ¹x©Ïa þüéóçϟ>¾ûòÙû7.9¶Ϟ͘8j¨u²kD×誹rdφ÷Óg5g|¯ ü‰¾3‚\e¬ÉCU¦¢hKµƒLÂÆÒÌJü~$†rÐD+N›ùòš… -ÏbÅJ”,U¦\…JtsW³VÀ3`|'뙤›ÔÝìÍÛ÷ï?@V|óRê™Ì°u‡—g:¨lcsˆ»žâ@ýôù—_>ÃP}ûêù£˜›¢ãóʈY“CyôîÚ;®Ó5º…ðÊëœ9²gϖí'ó†ô»ü@‹˜ l† :¬ÉDU7Le¤¢v…l¬œ( 9)rI3m^16apÍâÅK”,Yªt¼_/c«Û IsûöÈÔÇDè¤&é1Ì è_%‹ &/žÑïÇBç}•—-t4Wpö}õöÃÏÀôW úñÝëOäòÃ|q$]N߶Ec¼™±LÉbE -â×¹s墯žÃ¼?N6|\.%®3ÆšlLEžj´.ɦK”"¯ˆ|4Ñ(XPŒM¤Yª4Ðœ*VªlS¥Z º*¼e›]œ\€éðÝ9@4I2ӏÑê¼{óJ@ў°¢‡¸‡öõñööñoEџ¦ šk·ï£Múøé—_!~ùôóû7/1©FŸgéÂé¿:5l*–-U¢X‘B ä‡/-¾}sþ8ø¸Þl8Ç#×̙ÅÂ8™¨*L¥í²Ì2Q\—H3+òC‚" -aÆ¡ 3-Òc³ÒÄ«õªU¯Q³vz 7maß®cמ}‰)Z+Ih|_’}%«ó¡ÆÈPéÀïøÑ#† ñóõõ4Ø?pd½…6é8ö¥„E* Ô_ûí·_?ãü +UºFadžU³uNµj -T«T*_¶TÉâŊ)\¾xAóþ0ðûÀãxqŽ—¸J£5Y¨ÆfŠH©v]¬”'¤À{†‹—(A-ҔÇ&ÀšµjÏú 5¶mÞÒ¾­CçîÎýúLñm Izúâõ[d -Nçg°:¯žËPqú]0sʄ‘Aþƒ24pĘñôž1¡!Ú$¨¿}ùò U˜ŸÓJçߨÈùÓ廉ÚáݸµªÙTªP®LéR%K”À¯^̬?L|\ -âTs¹‚„]óäëvʛ0aB»¼ŠŠŠ¶ôu{3oôèѯQ8© kÝ^†‘^ŠÆÃˀÒ+€Ò«€Ò€Ò;A!­÷¥Ž•>òÉ-æšDôâ~4€{Ê×d)Fr;ÇS~%¹‰äßæ).F¥••ÖJ›É¿m'ÿ¶[st³6\Ý*9±U@)«Qé×™Žˆ›~ÑðkŸƒê)ò_qto¦ô交Ý)Kß&àè…î3°éËåø °ÓPz WÍLžËÚ̄W/ñ¨¥oòŽ3܉¥o€W ”䉪€ç€(—wY)`×AI‚“à°*PŒ²ZäÐ,yGfP¢h B÷a‚Ò]wÝe€’JF8*AÉÌhÔAÉ +(ÙBv ”d„ºø—‡ d¥ ²R„±•ËØ*dWµ°u×eœ7äÓN¦ÿÛغϥÿÛÅغcýß~Ç·¹›ïúü˜ž’ŸšØºåæ?*ÉÖ­ªu+[wZµn™‹·e«^­[Ï¿%’ZV¹¹zZJIÂ퀖¶BKÝr‡XëaݘwÛ¶mK|tQ÷ãÐ` +ÊóꄐLác‚)Ã"2·Α¹¸T&ý/¢ò%{ä6¹ NîøñãÛÑû¶-}ÝÞ¢÷ë¹ðΤ6*ÀHm"^”^”Þ +ÉÆm¥v9s0*uŨԓü[/ŒJÉ¿©UG#¹Ä@IŽ/JBxK0*­Ä¨´£R2(‘h9RPúoäƒÿ 7ý¿ÿDó4Z"¥’pNÌ<.üÏnœÐyYFæc…´ŸV™‹+ƒ2É7–iý›ˆLð_æȄÜ/G¦ÿÏ£Â4=¢B7Eáœ\!žrǎû.ÍÝÞ¦Âä›TOzFz]鍰„·¥w¥÷‚rÒÚJ¥n PêQ)Jòá#¹[#A%Aºy•§‚Ò&ŒJ±¥o:(ÅÝ?qNN•ŽFP:AQøõþ0Ãa€ÒπÒOéKßdìL8º7`TZmSÍLx^ÈÚÌÄ­š™È5©-}”^‡‚´¥o¤ð²ôp³Zú(]Æ&çs=Ÿ(ª’쪞K-}“+»Á4—Ë;‚’¥@É(y.I’P²%Ò’%K’A‰§4” P2ÂñJ¦jAÉʲi $#ÊIpó«—ülBVÊa€å1ÀŠØ_턭û„l¶îßÔÄÖýSMW&U­{€ü˜†ÊOzµîíðCÆj)ù·ք–áh•zYIÑÒ~;KÁHÂíRI8'‰*Þ7.+ȼ¬%ó‘}ðËÑNàMÊ^’}TX&ä¡ayž‘;Dßù’ŸçL™2¥GΤI“4ZŠ +ö|@Ü÷èYҖÂIo³Öí­H<¼–¿½’Wß”ÚJ¥.8º?ÆÑý)wœ>(ɧ)P¥’œÈJ¹gØuP’³¹£ÒZŒJ()Ã.F¥½äß4P2ã t\…jA)›£»ÊÒ·¸£;}é›Cof"#`¬+ÞÌd %ã?‡sºRÁâ.Ñ7  Aû'¹lÿ #ÝE¸•_¯ã…ËÙä6nŠLª@阫™ª–‹¥o€R^”‚\ã>h)”äW»U^°Yä¨4P²d%s(1? d€’ŽvPRzu d{,äÕ,(ɸ´1˜ìEK.‚‡| ° Gà«\d¥BX©fënØ°aÌÖ݄NsÊÖÝ\~ÒmÝw1q([wKù1=/?¦×äG³u§UëN©0Î$wû) Yi&+©jU›Àe.BYµZ@’¬dÊR¥9) gI$á¬)I8EKºei«ƅMÍMÃC=¯ÀÜŸé,¿ÌÊÓ2{O +Ê7"Â5–YyPD¦ÿ>™š?Ë©¬¬ì‘#óóG9ãǏïLïÛ´+iG)î÷Xæö® +áxxPj j;JJ=¥Ï¹Åôåq} 4T%¹%$ƒ’_MAé@”Ò–¾ý—S2Âa‡´taM—¾¥43ٕÚÌdÞÌđhf(U¸XúF£æA€’ZŽ©*È·‡}Þ¢ Ekxè).ۇ`¤» ·ñëõ¼p›\Èõ|6 tmzN¤ú…¥Úì¹Õ*D_ù7J~”l™@IŽJ’%;(ñøf€’JF8þ@IFO2(…B!ÁIpó7/¯4YIFY”Q–Ï®b¶îúõë—óiUlݗÊOº­û>N‚²u§UëN«0}[¯¥ Ü¡ü{º¬ïQZZú)‰–I8;I8ËÃTÎIöÁŽÂÍêÜ+{ñùd~žéÀ›YyBPfåoƒr¯’o5$Œä–AŸÈÔ©S?‹Lž<¹GD¾x׈Ð҇´tëH»’ö”âþ€\[;`¤“:JãƍëâPúPê (}Á-¦7–/¥oÈRŒ”Æk $%9‘U@iß¾}™A «Jµ ô_·ôÍÙBu ô? K_Ö¥oûR—¾i]ß쉥oŽÄÒ7'm]rՍg¾r Øôö°ô Pê@w·¡ —ᡧ¹lf5Â=„ßñë „+yµ9¥T›J§J'Jõ¯2ö\Œj•Ÿ¥²R ”$¸N ”ä…* $»2@É%#Ÿ ¤††Jæ$P’qd…Œl;#ÔIpñ«‡Wý©²R^BVªÅîëR- !Ÿ{2ÕÎH­Ö}URµnU-@UëN«ð¾üd¯ šÀ)YI5;Œ"”ߺZÀ?3ÊJi´”fYâ6a'á¨$œ$œ볞„sáÕp y,÷lÞ¼y‘Wt®KåʕSò ÆúÆej’{ՐLÿäÊÂhAa¡¥O‚=ÝÂBKÑ©¤3U¸;Q8©c(:ÁHÉºu ÈvÝ¥>yïg^ÙKoî.¥Á€Ò0@iŒJrs˜(ÍL€Òjt¯déÛZ–¾ t¼„LŽîÿ9œ¥o»qtoח¾ÙåZ£{‘ƒzjé 4Pé^ºté`@© ÔØéä8yz…ö;ÏRZþ½€Òíü«á*^½ˆíέšYÙKJnQ%äß4PÂ¥5kÖx¡%·%›üª’U6‰’¼7J²g” P2ÂñJj@d%K(ÉàT äÐ@I‚‡| Y)œ• +•J•Êø úZµ€xµî³™.ЪèÕºïäkªjÉOzµ€´&pº¬ô-UL²¡\AʚËJ)ÕÒóohéé´OÂé´ô½M%áXýcÇÔê ¡%áðD»Xä& ç‘c\è$™ã“Izº=ǏW( 7ŒÑyóæ ʽbpHª†d’î‚–BHCÐRwh©¸?¢¸d‚ñðbR7@©»_æöO¥/¼S§Ní‹vy¯¥€Ò·€ÒD%Uàf 4_’-Jë¬:(ɉ¬9(é=< P:zÂ.}û£Òþ´¥o€Òz{¢F 4×I×7§\÷\2jGJC¥¾¹?ñR#Pz×GPè9 èQÂ}€Òïù×M„«yõb¶;P:ë@IFOvU'Jäø¢(­ZµÊïP $Á #U%ylÑ@ɒJf3‹oÍ( d„ã ”dd%+ƒÓÆØr”¬ä&x²Rˆ·å$d¥"MV*//¯Ç°o„“üªœ™T-àꫯÎ\- ­ œ’•ºÈ&+õëׯ¯iȐ!zÊq¡ü7ÉJ PÊFKÕX–ðjØHA¨$´´ÃÁ ’p¡¥µ.֒¹Y~ïÙ¸qã¯ÀÝlŸÌÞßùd2ŸìÇ0ä—ÇáÑ$Ÿ |¿ÁAh)(3u_h©W}($ôId¢®äǔЂÂ#B‘­>§àdÜ¥¯XN=P‰G©Pš(MK€Ò@i) ´*(Y P:¶ÃáƒRbé›UO 6”XÓ`§T 4Pš(M”F»eä~í.éÝôô +ç|(½½ê“‹¿•_.ÛÇýBFòËU|ÿú-á7¼p ›œç£F t2;hÈ®êz„¾JÝ:(É5ÆàB×@É%‡U^¨”dº‰ K²ƒ³—J(áX%S(E£Q3CR’…qieX)P²'h)YV’í‚ Y)—“•d¨ÕáÓT[- J8%+='?4K.BÙ½{wU„ò‹DÊ*²’LŒ™e%A’m‰Þ&{±u¬”–I8K†$œ-‘„³“‡€–¶8銬´Æ…ýǍcÚÃ"3ïÚµkgyåè§ùd’žä—ïRᗩ~”¢¥€ÌÔChAÐR¿ 9´ "QPNÁgAxÏvÏDøFú gÒˆI}Ⱥõ'ë6ˆUBCX€=œž£¥q¬z› (Mç®1PZ(-Ó@Inrë¥Í€Òv•z”ö%­z3@é ‡U#M5”´6y8ÙjÃ¥(­vP#À!—ü<§\òÓ]rÉOr œŒ”†Jý½r9~ +çtñ ñ¼û¼æ—+öyx¨%dt?áNÂ̈́kxáR69_o;…4òê $Ï…|F®+”1P’9l +”d«U6¶ê d1@É%# ”JBAÉ $ƒÓNpœü-&+Év~Þ¡ËJù Y©6²R9c?sµ€«å'©ZÀ=œ„‡~8V„²uëÖiE(»P„RÉJý•†P„2YV’ûþ,z›Äd%™úb²’Üè·P„2y\UY)Ó"¸4PúÓ¡“p= GB%álÜ5•vÙIÂ9pm8ÜÖ#+­vÉñ-w ’,òœÌõàò’ó ºLôÉ,_ᗙz”_¦–¾ „}ú*++{…z€"À£^„ÞèH}}Š‘䃓cOú†’3#)b<–¶X¥)¬ŸžÁ]c. ´ˆUoËYÕ½Z%9:(íÎJ?™3•0@éè 5%ÍÑmI¥ï­< d%JÕJó¥€Òd·ÀÉ·žå˗ãœ(}棘ÄÓÎ/—üëPÐ \÷O(¦Døáfµ¼p™%¿\Ùgùe*8Å'¼ry×óR#À“ +JˆXhɧ’§=(É{-9–Œ dÖA‰B&( d„c”L© dN%+ƒÓÆ(³œüêâ›Äd%t‘„¬TÈ8/Õd%U- ±üh՚ɏV-à +ùI/B)'L/B©d¥6¡|‡"”1Y©wïÞ½(B“•ÆŽû-½M&ÑÛ$&+ɜ˜,+ɬœUVú![ËܤÞèuPúŸj-K?'hé/ÈJ?ZI8•vª$œƒdN¹u¬s +ˆ¬rmÙ²e™{ãƍ Ýr̊–fxåÖ1ՋuÈGnÌ'“þhhi8·Ž¡+J* ´Í&Ïí¬û”–9éé㔫}¦K®öJ@i, 4Œ«} `ó9W{W®ö¸Úß½˜¥?%ÜE¸…p/\ ˜Û5”NõËå}‚O’ŒžZhU…yÈuËE¥ J—]~uØä»M’llµê ${6@É%# ”J2¢,ŒK+L%ÁÅ n6Q²R !+E5YIö\¬¡T²R¼å©ÕYäyT ˆ¡¼é¦›ZðUUÊ{E(Ÿ¢ek|‘o0ûÄd%™‘To“~ô6¬ÉJ2s£·I²¬$ÓaLV’ 9“¬´/!+ý˜.+e«P--iK€,ú]ƒT”FK$#´´Zځ¬´Å±{÷îN”AK+]Â%KÝB( ÝÂ*s<2qÏð$h‰ù~3ÿ´G’d†/ãk¬¬ƒ±·~IDííXào0ÒW0Òé,Ü#“F#&Uu›ˆ=i + Þ¦ãq(- '×RZ˜¬¤üÍZ@i# ´•:J;¥=€Ò~@锎ÕP (¥\÷ú%_”(¾jg%C”–+PrQLI%Á” +ÀÉ0¯ÀÉ DÔ/Q»;í2¦ß€Z©: =Hø#áVÂõ¼p9¾ (ñŽÓ(±—r3jy”Š¥< ”äӂ¤ü|В‡ë^%»%ÙĖ ”,( d„ã”d¸TJV†šàÐd% n^U²’¿ZY©.²RÃj‹P^Ç r sILVjÙ²åã¡|ŽÞ&mLï¾ûnLVêÑ£G²¬4|øð4Yé»$YI¦¾¡L–•Nvf•jàRd¥¿g••²VY2§&á,‰$œFK$álñ$Üv;CîœrhkœBs+\¬4sa¥vãò ó,[¶l*ɃIÐÒx +ß²,h”i·«B¦¡ “⦯½zàrmÃtF¢¤ßXĤ ÔCž¬‰Irë˜Å“õ<†ª.ïË¥U´0YG “M¬ôޖJ¬O%Uw0J7 +N !{€ôjd¥Ý€Òv ”h~蠝úB.ôYn¹Ð§ ŸVm(} (õ›÷1Þ¼ö¬û|+(ðK,þ|*$õC!Á£» ·®çoWðê…lw6ï8- ú‰~¹ÐËYQÛ(±û<SÄ­@IÆV(9RAÉVP¢ ¥J(á8%S*(™ dI%{‚–\(Év¾„¬Î(+ŋPž(B©d%½e²¬$çåÓ#<ò0E(c²Ò[o½“•d2R²RO&¨¾š¬$“V²¬$Sä,z›(Yi)²Ò*d¥õ Yi{6Yé/5–•Rž¬““p¼-kŽûÇ~•„ãþ±ÓÎ +2hi³´´š§íî5,xÛ |܀ÒvmÁ›|…½ôz;@¯7JÑÊé.(ýú,`„jBfP"$’Ÿ (±’Á÷æÅ@I.ôMŽ8(­H€Òl@iªG®ñq,bÁ"†/YÄÐ+ @I.Ö`ÏÛ¡8(=Mև(,v7á6 üíJ^mÎvg‡ä’?=((É®jC_E(³y^@ ¡6È°òAK§%ù—Ã.%ÙØj•¡f±Ê(‹Ò”)SÌæñãÇ'’Ù%”Œp܁’ !3C2J2¶,Œ²(y<;ÁÁ¯º¬äÍ +å%ÉJ)E(S„2&+É1Çd¥n¸ázŠPÞÂ9ø½M eLVzíµ×ÚÐÛäz›t¤·ÉÇô6ù‚Þ&émò ½MÆÐ2w"½M¾£·Éz›,J••6"+mMÈJ{•ök²’Üòk.+éE7 ÷=+‚´$þ2@É%# ¤†AP2¥‚’9JðÈJH£%›Ô@V*ËÐÛä,­·‰}LV’/؂Þ&1YéÑGÉJ/¿üò‹ô6yƒÞ&ïÓÛ¤ +rc²ÒСCS*w$½MÆÑÛDÉJ3‘•æÓÛd)½Mb²’Lқ5YIe7E(c²’Ìí?J1Y)MI“•tPÒïY’p?gJÂYãI¸dZ"¿-­sÈ#wŒ–w´4—i}.‹é†™J-½Jw™&(n‚‡T—ø×x·Â#™ô'ÁH•0Ò4iEef#&ÍCLZÈZ·¥ö„˜„=i=Y·Íؓ¶e°')PŠÙ“(ÅíIYAéÿ P:ªÂaR\?ÕAi×ø ”äJ¥9”ŘJYŒñé”ruö¡“O –‘üŽ%š>=B¿è{·n̑¿]Å ÑMºŸÎÛNbõƒrñ—QµËg1i %BØ¢ü<xV.gP²ÅAÉb‘×@É¢@iÔ¨Q( d”dHf%y1P’àäÕ*²’ì*‚C<³¬tÊ)§4¦e­·ÉÅ_ܜÞ&WðÝ®çûÞÂÙøóËýÌ4ÓÛä9z›´¡å;ô6é@ʏémò½M”¬4”Þ&cèm“•dŠŒÉJBˑ•ÖP„r#E(«ÈJüe¥ØŠ = ڎÑI8L{ÉMì¢,ŸfY‚–6byM§%§ÐÒB—<|ÏÄ:;ª˜2M™¦€LŠ›&ëA‘V¤).%!ÉÆߥ3’ìT1ÒĤåˆI«51IN““¶uÛ(í”öJ2ù¸ÍY+ tt†”TµUy:(­”'@iš%? DËÃÁ´<ì”Âù(E„}^ɑ1ý PôHT½Q@‰p#¿^Å åΜÃÆM"³gÏ>),ˆSŸ6Óe€W1íòý +”dÄ@IB ”ä_NÖ4h dW $3ˆJ֚‚ÕLÒA‰Öß( d„c”ÔÀ© +Jfx(J2èTH£¥˜¬$ï¨"+©Þ&JVŠ÷6)Oô69•Þ&gQ„ò|æKémòŠP¶àëßÎiº‡"”Q„ò)z›¼HÊ×émò>½M>¤·IOz›ô¥·ÉW¡AÊ +ŠPVÒÛdE(ç!+-AVZIÊuš¬$H¢d¥]ÈJ{É¿8„¬e••LÙd¥Äúi–ô$œ¢¥=é´DºËž %êά€––BK‹(g¬ L³©7<“¦Ÿ3èÓ0ðdªÿ.ñëtðh&~¤Y<;ρ‘ækŒ$;ÕÉ®nò‘k“6èb(v’uÛ£²n=ëV½=I_ðf€ÒÑ2€’9”þ‘”äÚØÏBO ”hⳙ²ôë(K¿’ÞЋé =‡ÞÐÓèv8P• ”"2ˆÛæö¼Pz6*ÀòH. ” (Z®‚–.âÕsr Ä{°—²J²ûr|!d%?´ä–\E(/¡ZÀÕ|ßœˆÛ9‰÷P„ò!ŠP>Iµ€(Bù:ÕÞ£å‡T ø„j}¨ðÕ†S-`,Õ&S-`ÕæQ„r1E(Wbë^‡­{²Ò6òo»È¿é²ÒÈJ¥ŸL)µþ^Yɔ% §µÅ”ôÚ|* w -Ùâ´´ ZZO;ѵÐÒ*Ze­pÝ,s¤ ÓBz±/ Ìžb_52b…G%!É{—¡#­Ðt$¹o­%á¶Þ&¹ 1i bÒvĤ]éb›&&ÅA)9ë¦û¹ P:Â!@ɒJrE¨þ=i ´% ”¼rÁÍõÉõ÷J!@) (E¥AœÎQ@)PÊ”ò¥|¢ûò~OhA¸š¿]Ì«çTMxGcÞÛ G&€²°OIP +*P’ÏÐ@ YÉ -¹°þ¥ƒ’= ”*++͖qãƙ,( d”´!™ ”,é $Á¡Ñ’’•d4ên¥*²RYYY©&+É5dzh̑6áÀ›Q- 9_ë +ª\Ç׿™3t'Õþ„­ûQª<-mµáò¦ùúzŠ®³Ë-f†LpN™–*",†‡’Cü…¥…Gq i¥]ù‘T®- #íDLڍ˜´O9“,º˜”’uû›9KÖÍ¥£=$ƒ!#(Éÿ~:(ÙuPÎÖ@É (y(ÉU§RP +&@)(åJQÁ”ι€R ”(åJ€R DhA¸š¿]Ì«ç°]ÞÑ8WÆ~ƒ( ”©òC€RPBVòû(IÐ@‰¶#ŸÍ!'ƒ’ìÞl5@É%# tP2k $cК‡’•d§ªen”aŸÏPÌ”Q„²œC;j§rÌgñÎã]Bµ€«©p#§äwغï¦ZÀƒØºŸÀÖýÕ^ÃÖý.Õ:cë»7¶î/±uÃÖý-¶îIT ˜Ž­{.Õcë^Aþm-ù·Øº·"+íDVڃ¬´Pª‘¬$w#HÂՀ–¬¤» ¥´ÊÚ-m†–6&& ™” ¤°Gã¦8<-׃&IX©2l +Ô{a¤uʏ”ÊHÛH¸í´Æi/bÒþìbRõY7Þtt‡ƒ’5(9%' äÒAI®µÅ>@É/—ãwB€RPÊ”¢‹/þ$PÊÎi›(̚5ëÙB@©P*”-Wó·‹ ¥@)_6nœ—¥@)¢@Iöœ” PBVrytP–Š’Ì( d”2’Lñ!%t:(Y’@IBY)Ó"¸‚‚‚<>2&+Õ¯_¿.¶î†dclÝM°u7c¹[÷åغ¯åDÜÌ©»[÷}غÅÖý ¶î—L;v| [÷¦^½z}d4hЧ4ë‡­{¶î‘غÇa랂­{&ù·ùäߖbë^…­{=ù·Íغ·cëÞ(í%ÿvPŠÉJ¤`ŸSe¥jh)% ÷Ï I¸XËõ„eIђ%-QÀH£%%0íܹs³-ŽL1• UHã¦8<­N ±”z¤ðHÞ¦ðh£ÚŒ´UӑtFÂä®3’%›3É\µŠB5b’JGYøe@i³Jr¯ôÆAiN@Æà´  ^³fͨˆ ÎÁ9Â*}s¥<¡›Nù€R T(JEx”Šñ(ZáQâoƒQçJPUã|@)PBœ*ÎY¸pa~PBVÒ@ Y)Jò/'ëHí®4P’·Ø2½¹uP2 d€’ŽcPŠ‹Iæ#ÕHVÒk+)Y)???&+ɇ3Ôff(ÇÖ}¶îS°uŸ‰­û#‘2%ÜX¨‹IÙ²nÿkdݎ…P=(ý= ”lÙ@É-×î:O”ü P +%@)PŠ +«ôÉœé‘(J…B<¯JŬz+”J%B ÂUüí"^=§P‚ªJHRe¹B<ÅQ@)’%d% ”X%ù›JN@É(Ù3Òȑ#M”>ýôS” P2ÂqJjXҤJ1Z’!©Bd%çAlÝ>-[w!‡QJþ­¶îغOâÀOç{œÍ׺üÛeäß®á¼ü–éæòo÷‘{„jÝO“kMþí òoí¨Ö݅jÝ=É¿õ¥Z÷`ªu ÿVAþ­’üÛ òoóÈ¿-ÁÖ½[÷:òo›È¿m#ÿ–&+ý(”~JÈJ¿-)ÞH¡¥ƒ Zú^-2ƒ–öAKšÀ¤áŒŽLqÓØg‹@:AáOú›ÚN©Gq<ŠIHx¶Ùýž¤\›b$êK%•HM¸BL2²nGwø¿tPªjæ>(9%W +(­ðɅ¹HR0Jã#J#£€R. ”(J…Â9ïJÅÂ>ϔJ¥€R) D¸‘pU  D8§P‚ªN‚¯êçϝ;·,/J9€RPbyYÉ£@‰ÚJNÏ¡AÉj€’JF0@鐠g¤(¥ÑR¼d@²¬$;  “‹ò¹ùäߊɿÕ&ÿVNµîÈ¿Âäq&Óȹäß.&ÿv%gãÎß­äßî"ÿö€©M›6“{Žü[Ö¿½Cþ­ù·näß>'ÿ6€üÛPòo£É¿M ÿ6•²J³)«´€üÛ2òo«É¿­'ÿ¶…üÛvd¥ÝÈJû²ÒÐR•$\”þ‘¥LI¸¬ï*´ÏÄ)Zú1AK,ñtÜÞ2í֑I +{ [j°ÆÃöíHÅ£Ýj§šg;ÎHz®-‘þš(.©¾Â?j,& t”…ô&#%@ɒ ”쀒C®Ý݀Òv”¼ P +(ÍÉð›”r¥\¥¯òXzÈ0í^( Ô±P*ây¹P*”jÉp¾§ D¸‘p»‚jKUT$ˆS¿PÊ”r¥¨PN$JA@É%‡%·%Ù¸ +(Mž<¹ +(õëׯ栤æq” P2± J¦TPÊDKÕÈJ¡PÈÏîƒ|P„ —#(dR(ez¨ÃDрc>‰üÛi¬kʼ€õo—q"®á\ÝÄú·ß“»‡õo±þí)òo/²þíuòoï±þíCÖ¿}Bþ­7ù·/É¿ #ÿ6–üÛ$òoÓÉ¿ÍeýÛ"òo+°u¯%ÿ¶‘üÛVd¥€Ò@i?²Ò÷©²Ò_5Y‰{E e¥šÒR²Ë;%§ L‘)ÎM1½)NP;<´3ñê®Ä;öXU†-è~$KJ®-™‘j°Ì-‹˜d€ÒѪ%eOÒ@ÉÊã t0JûRAi“G®Äµ +”ü2Ôê P•Ñ8BR> T(J%Jo—Jµ„}ž®-ôpm@©6½Þ7®$4‡–šÁR§—JŀR! T(áyÒ@ Y)V $Áƒ¬äòé $¯Ú\ +”äÃc $»7Û P2@É((™Mv»½Š¬w+Å:ÁÉÀö0Ä} öù·™Cþ-Ÿc)"ÿV‹ƒ¬Çú·F´59™¶&gÐÖä¾ïEœƒ+9C׳þífŸ?0ÝÏú·Çhkò,õ'_¦­É[¬kÏú·®&™Í>cý[?Ö¿ ¡þäHêOŽ#ÿ6…üÛLòoóÉ¿-%ÿ¶ŠüÛ:òo›¥mäßv‘Û (@VŠ%á’“p:-e••jJK‰5qæx½¥4é‡T•i¿âœ7Å੺°WK®¥á‘’ÔîÕº¶LŒT]ÂÍ“ŽÅ”þ™J @é§(}Ÿ¥]€Ò6w”|»víZ®@)( 4+, 4%GÆ` 4hz÷ÝwŸ0uîÜùyS=^¥þä»ÔŸìDýÉîԟìEýɁԟü†ú“c¨?9‘õoÓXÿ6›üÛBòoËÈ¿­&ÿ¶üÛòo;•v#+í””¬ô#²Ò_²ÒÏ©²ÒÒR&—·FKKdJQ™’¹©!NF1õ(GIy©*#bÒ12û¸³’MÚ«%' äR ´ÿþ^Vk¥ey&YPš (UJcsW¯^=,Ŋƒ +…U¾(VéV"`Ó¾– Ø7k «´.öyªŽ âëý±® Ë­„ë W€LBPg#:V P*”Š%xExžòò”"Ñ4P’àò+P’¿Ù=i $€f€’JF0@éÈAI§¥*²’ê§d%ٟ›ü›P +°þ-DýÉŒJy•Š8¾Z•ê2o4diÌ×j‚Q©F¥æœ’Ë9u×bTº£Ò +¸£Ò#•ž¦PÀKô{£R;ú¿uÁ¨Ô£R_“Ìu_Qrõ'+0*M&ÿ6ƒüÛ<òo‹É¿­ ÿ¶–üÛFd¥­ÈJ;‘•ö +í×d%¹/è²R•$\õ ”–Li´¯ ”ŽK Ó_’)ž˜Ó¹é‡ûd ?$‘‘ŽGþ’$!¥­k«ÊH5O¸bÒÑÒÚ¼e¥¿¥‚ҏv´W*, ´ÓÅ”6J«ýJK¥ù¡-[¶ÌˆÈț•‡•oó”¾)!9°H€åó¡]Kl>¨-œóF™ϋu„}ž¬+ôçºÂCwՓá|K½iÓ¦]Ç¿.‡–.€ š":Z[6>!ªS­4P¢ú@0P"ÿæ  d€’ PúÅ@I Ä, ”,+¥äߜŒn äá3||ZY ÌaD)Ô]ÀQÂlQƁ—ó=NÀ¨tªéšk®9 £Òyœ‹9kWaTºBÝ·™^~ùå»0*=@¡îÇ1*µ2}þùçm0*½ƒQ©F¥n•>Ǩ4£ÒוFÑÿm<ýߦR(`õ'[Jþmù·õÈJ›¥í€Ò.d¥½€Òd¥dZR²Ò/AKiõ–Ò¦ddÊÂM3”ÎC?¦m—®éx”šf;É“Ž‰)ëö¿©>îäJH¬dݒA‰' @i‹G’<¬”–e”Í Ëx›ž# 4)W@iL¾ Ä¡…Jý‹X>”>ª5þü÷Ë”^¯#£ö…ºÂ>-ë +=ý¡\ÂÍå2¦¯%\Æß· ÎBt:µ,Jõð7Õ*â)Äž›/c? ”Ü:(ùâ duW JV” P2‚J‡JUhIÉJªo®ŒP‡J2Î݌x/Ÿæg1ä03ä™5jTHE¥R**ÕÅÑ݀ŠJ©¨t:•Î¦¢Òœ«Ë¨¨t ro¢¢Ò難t/ÔCTTzŠF¹/Ò(÷u徇Q©3r{`TêQi…†aTú£Ò$òoߑ›Cþmù·åäßÖ +m ÿ¶…üÛ@i7²R, '7‡¥´$Üßjœ„K¡¥ÿÑi)ƒÀ”™Ò¸é§ûd ?%½#NFUð(…‘þq¤ŒdˆIGm8Ԃ7ÝǝiÁ, ´Ã­@‰§Ÿ€ÒÊÀΝ;e”Í oÞ¼ù»yD™˜»víÚÑù2¿.\¾|y¿ba•ž¥J֖aú^¥×êʨmUOØçñrA¡ûa¤;ë ý–p  t);Z:Ñéä§F¸šêJ¥X 1‡ç…¥@*(9qP²(YRAÉl€’JF8ŽAIˆÂC¦š€’j';°³+'ãÜň÷àèöñ¹Ýa(Š£;Ÿ#-ÆÑ]Gw9ŽîF8ºOáKŸÁ‰8—ÓtŽî+qt_Ïdt Žî?à辟ŠJáè~G÷Ë8ºß¢¢ÒTTúˆŠJŸbTê‡Qi0F¥•*(PIþmù·yԟ\Lþm²ÒZòo‘•¶"+턖öJû‘•¾O••Ž$ —‰–Ò¦,ȔÆM?'ˆG'¨ä ¿š•ŒR%$³žf«ž‘Œ„Û1j–uËäãNZð†=i;>îÍ^Gë|,x”…”æD”¦E”ÆçÉðY  4¸H@©O‰ŒËOj ¦t.£Ödáœ6õ„Už+§(w}º—Ô§{ Œtá7„K ¥s¡¥3N”–ÉÛêԊƒR U D=Ë@T>ÈKg9w((ÉÆ( d”~P²ÙlÉ´¤J¨’Ý) ä`§Nv8ºý€RGw„CË¥ôd!¥'Kù +uøFõù‚'Rzò4JO6å ÏÄs)SÐÕ8º[Pzòw”ž¼G÷ƒ8ºŸ ôäó8º_ÅÑÝGwGÝSQé ** À¨4”B£1*M ÿ6•üÛ,ŒJ È¿-EVZEþm=²Òfd¥í€Ò.d¥XNn¿@î‘©*7%T–Peã”ýý#;Œt|„t1)C™ÉŒ>n²nß;Ò|Ü,xS>n¿Œ¨å¼áãžaÁ[”ÊùT(dÁ[1•J© P›Ê€Ò;u© (=(=#ÝÛ@ èv„«CKçJM¥Æäé$@©$”B€’?(ÙSAÉâ:,PêÒ¥‹J(Á¥P2iŒT(Yف]Ù äÂÑí”|AP +sh9,}Ë”ŠXúV‹¥oõXú֐¥o'³ô­ ÓM3Nls–¾]njÕªÕµ,}û-Kßî0uêÔé>JO>Béɧqt·¦ôä8ºß7Mœ8ñCݟàèîQéKŒJÃ0*}K¡€I +øŽüÛòo‹•–“[ƒ¬´Yi ²R, ' ´Yé@µI¸4ZʄG:tÔ™’sqnªO‡’vuØx”•‘ P:ŠCMA©ö¤­ž÷2ìIó±'ÍĞT‰=i,ö¤aؓaOú‚¬[7@©=Y··êR œoˆI5ñ{7dt[éS§ÞÐ@•üÚPjF((Õ”ÊjË`/¦È@> ”SPò֔FŒa² <¸Pzá… P2@É( #U¡%½¥%y¯aª@ÉÁ’Pòr~–¾Yú”r9æjt—Ð#·Œ ¥œï{çàTNɜÉóL?þøŀÒUÔè¾ÁÔ¶mÛ[YúvKß`éÛc¦>‡£ûӘ1cÞÆÑÝGwWŒJŸRQ©F¥Á•FbTªÀ¨TIþmù·yÈJ‹É¿­@VZ‹¬´Yi+ ´Y)- £¥x.k݀¬ TsdJá¦d½ép‚¾ƒÔ=§á‘ÁHÇO¨ú¿ª]ŽzÖÍ“þf‰—™L«Ç­Ù“(3©Û“VùeD-Áž4{ÒtìI“°'Áž4”¬Û²nŸÕÂÇ]6þüvdÝÞ@Lz1é @éÏ@Ñ] %Ü +(]G¸ZºÎ”NÃÆt" T(Õ”Š¥¼â8( ä”\€’# ”è^¢’ Z(™Jï¿ÿ¾ 3À/JjjÎÍÍ5@É¥c?o ¤ËJqP²2LmìÔÎÒ7 ä¢F€›^@)(…¥jäJE€R)J]¾ojœÄy93y65. FÀeÔø 5n2uèÐávS·nÝîaéۃ,}{‚¹Ï›Fõ*Žî¶8º;ÒúícÝ_`TˆQi(F¥Ñ•&›Jþm²ÒòoK‘•V!+­CVڄ¬´-5 ·?ÃJ¸šïÎJ5å¦*𔣲ñP2:B<2éX Gu³¦VOÒëq'ÊLÆìI4.¡Ìäª'M#ë6!V¸2ü†-[¶¬_‰ðKOìI’u{¬ÛkX¸[ÕPz1é~xèNðèfµ„ËçóÂY€Ò©€Ò €R½:‚8µRA)’%߀ҤI“ P2@É((™RAɜ%K(ɏ’|PrJ@É(8È0 ”ò™FŠ™PjSL© Ôˆór2çï @éÓ³Ï>ÛPºÂôöÛo_G€›¥;ifrŸ©ÿþ°ôíi–¾µ¦F÷8ºßÇÑý!ŽîOhýևŠJ_bT†Qé[òo“È¿}‡¬4‡üÛBd¥eÈJ«‘•Ö#+m†–¶J»¥½‰$Ü¡,KqZª¬Ts‚ª +O5 +58‚êñÈð#;¡:1)JȐib’•¬]pØɺ9¨f冷½*3é‘Ñ£ÊL.§zÒBª'Í¢zÒª'£zÒª'}Eõ¤ÞèQ‹V¸hKÖí•z2VŸELzº(ú}CyÚ¹‰ðÂ%üíȑ%7Ç⥘’Ÿƒ J&\¦‘B¾[  T‡¯_ßtÇwœÈù;Íô裏ž(G1¥K(¦t5 t#Ŕn”î¢FÀ€Òã€Òs,}{G÷Û8ºÛãèûSŒJý0* &ÿ6‚ü[ù·ÉÈJ3È¿ÍEVZŒ¬´Yi ²’ž„Û-閥Ìu²¼«×n’ÃÔY ðÈ`¤c*d“L©bR¦¬›U.þ¥ýv²nªÙ«¬››¬ÍÝVùäci@=æ‡ä!dFDG&G×®]ûmÞªU«†,_¾|`‘Ê¥1Ýj Ó´/ºy Uè%°çi”¢‡A¡{ £ßn$\E¸ˆp¯6”ãQj(Õ”J0s`掦‚’7JÎ(Ù%ëa’9”L™@IÝtP’Ù,6g d€’Ž3P2¥‚’j §@ɒ +J6>È(9%Çâ”|dP +3yä0äó݊¨:Y‹¯_PjÈ©k (5¡êäٴǽPºŒö¸×PLé&Š)ÝN€{¨ð5ždéÛ Ôè~ G÷»8º;âèþ£ÒäߐûšüÛ(òoã©?9Yi&²Ò|d¥%ÈJ+‘•Ò’pÕX–RhéPI¸LŒT•Zþ‚Ê +E5"#ŽÅöÿ›Jܺ˜dŽ3ÒϹÆBL:h•‹ÿ{› ƒ}v»ò ±Ý%›Ý2fÖywíÚµÂ'ãhq@FÔܐŒ­ï"ò821*&£óV¬Xñu ¿þE<±PŠ» ¥¸ßq^v^ 4ÒПý‘pkÃÊÊÊë W.äog×P:'ñŽúT,c/ŀR> ”(…%¿%ê(¹©£ä¤Ž’ÝŸJ–$P^K%ËðáÃM–¯¾ú*”>üðC«oM¬Ã5±"×Ē“؍@Më™@IÍÔ +”5jd€’JÇg8®Aɜ%  dM% ääX܀’‡ƒô3e¥ÓH”ïV(•ðõË¥rNÝ ”ç>P:P:—ª“QuòJÚã^G1¥[¥;M2›ý‰°ôíi–¾µÆÑýŽî÷1*}ˆQéòo½É¿ býÛ7äßÆ +MDVš†[i6²Òd%•„[¥%áäæ°¹&–%½ÕÉÑRø%£ë5Å#ƒ‘Ž¹%áö¿‰”n’˜”¥¿ZäWb’–u³©(Ý|óÍÉ ¤¦k5SŸrÊ)( t‡ã ”L‡%+d”쀒ƒcqJn¤g/ ä”B|™ú˜äJ…|ýRNIN]@é$ÓÓO?}幛JçJ—JW›d溑bJ·QLé.j<ÀÒ·ÇYúöœIf½Wpt¿QéòoQQéSÖ¿õ%ÿö²Òpd¥±ÈJ“‘•¦“„›--‚––“„S–¥ $á¶h–¥´*KUiéçl´ô ‚’AFF8RPÒŤÄJÔ–Íš˜d‰‹I? &í·!&Ùe@ìpÊÐØâÚ³gÏz·<\¬òÊèYâ—q4/@EאŒ­É‘Õ«WÊƒÉ°R.(to}!£ßZ4˜4iÒՄK ¥s!¨3Ë”NfãF€R]¾•²«B@)W%ùŒ`ž€’¦¸šâºBA—ø•4P’-Ny¯Ù!»R dJ%™PL™Z’A©sçÎ&ʔÄ@©U«V&ÖæÆf~5£+P’ÙÌļf€’JF8ŽAɔ +Jæ(Y’@I>R%' ä”<€’£ðeÂL(Q¦–|¾sJjqÖêÑǤ! t2 Ô„Ò%Í0\HyîË¥kL½{÷¾‰bJ·Ó÷º¾=ÄÒ·'Xúö<ŽîW1*µ%ÿ֑ü[7òoŸ#+õGV‚[i$²Ò8h©ZR–¥y©–¥äºz•¥x«EK?BKùhÉ ##ü»)ƒ˜”¨ÙkÔLMw%&ÑaðG«\í`¤½6»ì2 ¶9ehlrÉ Yë¦Ã´WFÏ"?í2¢¦…¨í‘Q6:ºlÙ²¯Iõ§Wí§E2»”Ø´«%ãòÚ;/Ö8y²®PЃõ„‡þX.dt[}a•Wš×—¿5+—W›Ô“íוw4€¯êÔÒ*©%ÏB%³gώ²ûp°OPòF…Üùp§¥ ”TBI6Q dV d”l2e˜lò”e²ÊóV2(É$c2÷èÑ#”^}õÕÌ ¤¦ð4P:óÌ3“AIÍÏ¥¥¥É ¤fe”Œp ”2’•´QRÍα8%' ä”¼½Ÿ/dB‰ðUs¥NI g­ P*§áÛ ”À=ÿä™èÞçRžû"Ês_IÕÉë(¦t3Ŕî¤FÀ},}{G÷Ó•^¤GîëäßÞcý[gd¥ÈJ½•²n(I¸ÑÐÒ’pSIÂÍÒ,KrKX-­Ôê-mJou¢7†Ói‰ÌE*-ýãдdÀŽþ½Œô©ŒT˜$µê©üƒUž öÛäºßc?pàÀǾ}û¶8…‘6¸ä‘bµ{Û¶mK½2zæûeÍ Ð(($c«""£lVꯠ–ÞóæÍëQ$±S± IÛR—¯ÖâiU&ìóxA¡ûë ÝYO0åær ×.#\P./4­'›œVWÆô‰ugÊË”j×P*.PÊ/–=ç +(…òeœûs˼9€RP +Jp$Ø|q1)æ㖣2;ä½f»ìÊl“c1Yå)Ëd•ç-“Ež¼Ly3™e’1™»wïn2wêÔÉD=7•ÝL”.1±676ßßqÇU@é¼óΫ9(eíÀi€’Žþp¼‚’)”Ì P²$@É +(Ù8{”\€’‡£÷òeL(!¾j ”GgÜBNX©é¡‡ªC÷€ÒI€Òi<Î5¥<÷ù”羄ª“WSLéF–¾Ý†£û.Ýàè~ £Ò³äß^&ÿöù·vÈJ]•z"+õ–¾$ 7 Zú–’ɖ%¹%$WY’{…NKÛ˜v‚LŠ–ö'ÑK…Riéï Zúg*-KЌð¥ 7S +#%‹IÂH?Z“¬©b’C69eh¬umß¾}…{˖-‹½2zæúè:X½zõÄЊ+Æ°Ò웨0Ҁ\yŸç t+”Ø¾Xé­Ra¤—j —<][†é#u„‡î­+„ò{B‹zò s5á’zòëyÀәu…–N¨Võ€¬ZàVa‰€W^ѬY³"sæÌ æɧù¢BAžˆ|¸+$#^’Ý(©êIž¸˜”¼àM¯5)Ÿk²Êó–É"O^&‹<ƒ™Ì2ɘÌü±ÉܱcGõÜL,1±"×Ē“ØT¯@Iæ°ØÄ}É%—$ƒ’š¤6l˜ J5¥x¿r”ŒpT”tP2'@ɒJõêÕsJN@ÉÅÑ{˜F|L(¾jØÔ¢E‹( ”Ï +”jJõX‡Û[@c@© 幛QžûBªN^F€kXúvŽîÛqtߍQéAòo-)Њõom•ÞAVjOµ€®ÐÒgÐR?’pƒ¡¥ÐÒX­n€Ü¦kU–„–AKËY·Zk '·ŽÍÐÒvhi´´i?ÈôÈtZú)AKË@KU–óWOKÿÏБŒð/2’.&©Ú¤ª½Mœ‘~¦±rLL’ëù‹\Þû­r¡ï± #í°ËØâFÚà”‰Õ.$Ëܛ6mZà•Ñ3Ë'ãhJ@i ñG†IçÈxë›+#¯g¾0҇…B#ïɐ|½Dä…RaŸ'jË0ýs™ÀÉëTTTÜJ¸¾®„+ Í ÍêÈ«M`©ÆeòŽµå½ujÉ^JJä1¨ HFw c\aŸë -¹BEŽ€»O‚Í+!©qI’=I_ðF­IK¢Í›¹ÿþ&³L2&s·nÝLæöíۛ¨çf¢`‰‰…&&œ”±Y^Mæ2‡™LW_}µ‰Žß&z›èž JuêÔI¥h4šyVÎ$& d„£5× dJ¥`0˜JVŒ‹6@Ɏôì@„vñ”唼€’Ÿ©%È7p6r9W¦|°„2%e,/)Çps§PžûLŠ)C€‹XúvŽîë0*݌Qéòo÷’{YéId¥p+½†[é]Áu$ ÷1I8eY-©º#¡¥qÐR%´”ÜêDž§W@Kk˜6@K[˜Òhé@Zúù_§¥_ÿþk„ÿþP]Â-]L2¥ŠIf¹lcb’\Ï,reïµÊcÁ.›0Ò6»Œ€Mva¤uN+]2H»eÌÌõÈè™î“§ŽIyþø6(Œ4,,¬2(G@ä‹\Jäç #u(ºy§H†ä+ÅB<ϖŒ?þÑZÂ%ª=vìØ;kËãÍoË$\K¸¬Ž„ Ê䅦e²Éiµe8ŸU•ÃWµ!­ââ©S§æC_9;¡¼Y³fù£ò‘ÞˆŒs7Gà +9ül> VÁ #¹t1IeÝt{’¾àM•PҋrôÑG&Š“˜XTbb® ÿ¤ ƒ@l‚—G¼Øì}ÕUWÅ@IÍÔMš41Ñ<6?+PRS³J(?á8%–R@IíE%3k8(YRAÉ(Ù%' äâyËÄâcj ðÍC¦Ûn»-‡Ó”G¹ÛBVߖ⚬ƒÚ݀ǹ“˜¯N£˜ÒY8ºÏÃÑ}1F¥«hfr¥'o%ÿöd¥?!+=Š¬ô n¥Ö$áހ–Þ‡–b–%™å{AKÉÄ Å·4—÷xÖÄM!7“tÜ|ÒqK4Z’[ÇZhi#ÓVhiÓnhiß!h‰ÛÓ¡iÉ%#6#Õ4áöOí"L“ÌrÙ„‘¾‡‘ö[äÊÞc•Ç‚6a¤-6y^Ø`—±°Ú!Œ´Ì%ƒd{íÚµ³<2z¦ú„‘Æ“ßB`éFú4*$Ó%OÆ`»üI“&½Q(CòÅ"Áž'‹e„>T2f̘»KåÉæwµ$ÜX{Ô¨QW.®-¿ž[[^=‚:¹–lܨTÞV¯DvP«XvUXXYY™W ´Ã‚¹BKþaî + +92Øí> 6¯«G1’¼jqâLJ“ô¬›nOJ[ð¦*¨Z“ªî‹/¾hBí6¡{Çæv™¹L¦n¸!6g«éZ¥“N:)6?—••Å¦æüüü#%}ò5@ÉGM8ÎAIUJ²?”Ì(ɇ[%+G%9\r´Próµ<€’I&`ºõÖ[ùrvóYTRŒ jw=çR# 1KßNÇÑ}6F¥ hfr)ù·ßP( ²Òþˆ[éª<Î"¸ç ¥˜eIhéh© ™¸žÐRŠwIMÊaLc˜&"0MC`š…À´i)ÓJhiÓ&–X: -íA`Ú2}-ý-ýÅ %#ü›Ã!))áƕøwSœ‘þ +#ýÅO¸°È¥¼×"Ï»¬òX° FÚd“‹­]žV8„‘;eÌu¯ZµjºGFÏ$֒}ëFFêéž#8Ó1wâĉmóƏߦ@ˆç¹Bªxɽ¿XjþP2bĈ[J%\G¸¼–„ ÍJåÕÓÁ¨“ª%òÞ:Å2¦KÀ­‚ØÑ|Ù}8W>(•g!_D†¸'$´ä +Ê8wøåXì> 6«FrÉ«§b$œIvÙA¬z’*3©²nò¼e² 0 fOÒ}ÜzeUB)­{‰Ì\&Óõ×_o2]qÅ&SóæÍM¦f͚Å&iJõë׏Rqqq ”Ô¬ +…b³²"ž4PJc$”Œp”b{I¥ÜÜÜ(•––*P²’£·q¸v@ÉÁ÷pñµÜ|K/“ŒŸä E8‰¹x% 0”P# ŒÇ¹r–¾€£ûº¾A3“sÈ¿5§PÀåÈJ×bë¾ ·Òï©pI¸¡¥' ¥VÐRhéӂ Úã[êŠËûSjRö%÷Óp¦±L“˜¾C`šÀ´i)Ó*¦u Ó&¦mÐÒN&EKû5Z"›‘ ¥¿¦ÒÒ? Z2¿jp‹wMÖn\‰3)F"á#ýhFúFÚ#í¶ÈE½Ã*×øi½M.þÕvyrXæQ±À)ƒd–kùòåS=2zÆ{eI†d€õ +º|ù(" Ò.*tóf®ŒÆÖù‚=O<\8|øð{‹ä¡æöâo¾ù¦á7%.!œW"/œU"›œZ,#ù„âQ£F• -Õ.œ).ýåç -åä +-…¢òAþˆŒnoXØÇ”#pÕ>"»W‚Í#Á꒿)F²8#M™2%æLÒÅ$U@•™TY7™ZLæ®]»šÌ:tHöq«oze½(·Þæí /4ÑÒÒD+‚Øü\^^›š3RÖ~¸(áè(é dJ%s”,dæ­Ÿl½ 9ÚÎó–“'/S‹‡/í£b[€$!Î_€]ßN$ÿv*ù·3)p.²ÒEê¾·ÒuT ¸™$ÜÐÒ}šeIæÓ§ÈĽ@Ýî×´*Kò$¬ZtC`ú©?È4iSÓd¦éLs˜"0-C`ZÀ´ZÚ¬Ñҁb´„!6‰–¸)©Û“FKê±þˆhé¿áîl„ÿ†p¦$]Lú›“¸‚‘š…ê0«„›\À{`¤a¤­Vy"Øh“«}­M.þva¤ÅsÂHÓ]ÂH“pGëFæäFꔡÖ=$$Ó)RQQÑ6GçÕ¨àQ«ÍLÞL>ÞÌYž-ˆÐVähÏ[6ž¼ì,}sâèv1Ýx8^N“Ÿ3"ÿá!.e!eqK•Ê•Êq+@µ€SH·;fY’‰ör Þג‰» ßÒí¸¼ïF`zdj 2µ™^™Þ™>™º€L=A¦> ӗ Ó7 Ӑi6¦©L³ÈÉÍ''·iÓZhic‚–v@K»5ZâÁ=-ýÍ %#Ô TÏHi¦¤ªŒ¤%Ü8ï?˜åÂTŒ´×¼gϞf¹v·ÁH›,ò°FZi•gƒ%6a¤yva¤v•a¤ +ü>#\2p»eõõ~ôô +~tñËPkA÷fP†_ëàÑÓaaŸ‡#‚B÷æôéÓç÷QºEI®É•páBÓ\yá´\ÙäÄ\Äõs]Ê¢òޒA¦‚A¦hDÀ+–ÝB‚L¾€ÀŽÇ/Ûå“wxetÛ9›[‚Õ%Áâ$8ä³]¨Êl5j”YåÚ¬ª®¤b$ÜÛ•pSõTá$UaR‰Iòpfâ1-V@UOR¼ÞáMµÂM³'é>î#¬ `€’Ž‘pŒ‚RVFÊZ#@U%«Œ»%ù\3ùx3‚³éقmᘭûìֈÐÈõ9={ö¼’pQTÂ9„3¢òÂÉQÙ¤QÎçŸ^/Gà©VDFr•nå„™BAÙ½?0dȯ_`Ç퓁íôÊÀvx„›ìnA!›K‚Õ)Áâ Øå³M61Û²ÌVüHV•kKc$•p£¯›Y9“ä‘,&&©æn-[¶4áˆÍèzÖMM׺=©iÓ¦U|Üi Þ(é ÞþPJ1? d„ÿ¾p|€’Õj­A1¥()!YIÊqG·ÁÙÌ¡Y¡-8º­½•'/F%;“Œƒ/íä¸Ñ³½(ÛJV +òFVŠ2_åS- ˆEpµHÂՅ–j–¥®]»žF&®)¾¥ó©²t Å»¯B`ºdºdº•é>élLO‘˜{Á$óýk”_j‹—©#ÈÔ dú dê2 ™Fàü‹iÓwL³ÉÉ-@`ZŠƒIÑÒ:Òq›~Zúƒ–ŒP³Åm՘’#‘pãúûÞ¤iïÞ½»a¤0ÒVó–-[6ÂHk,k×®]aY¹rå"ëÒ¥KçZ…‘¦Û„‘&ÑBv,vèáa¤/ò¬Ñ$ùÄ-¬ò¡GÐå}¯Ì>t/úeø=ây8( roHžb~êÞ½ûMa¡‘kÂòdsiD„¦„Ó"ò‰Ù¤~D6. <•„e$„²rƒ²¿p°oß¾Á@ÿþý}~ÓŸÀŽË;xð`§G¶Ý-ÜdsÉè¶:  ;dd—Ì69>³•umV<Ûʏd!×fщšIf•pSËܔ3INRb’²p« ^ÍãzQ=ë¦êqgµ'¡[Ÿr P2ÂQ PÊ´ô-”âF%3OTfŒJ×BþÍÊ÷°’³‘³ó}|}z¶›3äåüù‘•‚¸•"ÌW¹x* xÎ+†–b–%™Ü‘‰;™åpMhw¶I&Ú 0/] +2] 2Ý2ÝF-ï»°1ÝOCÝGiò4^¦Ö¦1cƼŽÔôöïN ÓÇ Óç SsCh‰2‚Årää&““ûiÓB¦e¤ãV‘Ž‹Ñ¶higZú1•–~6hÉi¡f‹Û2'ÜâÆퟸÖjŒ„)‰ÄðRÄ;Í;vìØ#m2Ëe»FZ #-±È•=ß*3­rÉO± #cYýH»(4reˆöÖ!°çð¯3ÂNË B²I½l\+$o+ +ÊHÎ +7åd!¿ ç€OèÆë“r{eL»<ò¹· l»K(Íæ”ÑmuH°¨`—`¶É f›lg¶*Î>¯ÐÇ#ÜäòȘvºeLÛ]òá6§À“Õ!£[‹`“¿™mòªÙ*ۙ­ +d>0YT5Iú“¨Åm錤Zº)÷¶*.©Ú•èÎ$5g+ ·Þ³D­uӋ¨YY/3y„ö$”Œpô”ª7*Å>\7*Éñ™9R .G‹–kÚ´©•ï¦ËJ΁“SâæÑÍéóqbÌWa¬Š–ò4Z’)­‘¼–‚ú0O¤öÉ©tÐ=d:•©9µ.ÇÆt-}ânÂËt;RÓÝHMÆÐÔ©é9¤¦—‘šÞBjj2}2õ™záeˆý{(9¹QääÆ!0U"0ÍÀÁ4—%r‹´´ZZ-mæΔLKä? Z2Âÿgï<À¬ª²´í 7WÎI@QEELfŒPQÌ1€‚9!FÌY ˜sÎ9k›Úˆi Ým‡i§»g¦§ûŸðÏÿüß»NUíªS÷Þ¾Øb{yžùži)nݳ÷^k¿g­µ×Î'K‡‘º ·»é¬¿ß³KŠøWÞ/~ñ‹¯a¤/`¤Ežðû0ÒÛ¾é5_kü…@Œôd FzˆõwSêsKBï ’z͸,)ë9?%cš›~œ˜‘•Íʏ¦g…ûç„={äd;Uœ{î¹ÛTD6«ÔKÍF•óæÍ[Œ¬Ò[™¿R)ûP©n«Ô?kª¿ÔWèå§&§Ï«ÊʜsY™s&#nJ§;É´°,‘’a‡I}ƒ )ëöH(ñBý7/Ðßz~n9Ÿ ›ùVŠD7IûI<·y.ŽdEIÖ +Àª·ÍÁÛ17óÙV™ &Y+n»³Ä¼r¾¬[¿úqÇ© Jeù±J”J(TZ.OþÍãü›O߅•ÜMÈó&hI’ä…-Íàt&á4~•ŒsuDK3fÌh ×Ùeé„NÀ™¸Á¼v^ '—; +dC‹ÊõH̍‡›6'Ô´ Ü´Ü´;Ü´Üt5àGjšM¨édŽÍÍ™æƒL—L×RËtµLw.÷â‹/ÞO€é1LÏ`z‰ +¦×IǽM:î}Š—Q¼ô9ÅK_±3壥?R[[¦¥²,%Fê[¸ý¯#}÷Ýw¿'¶ù[¸ý[Öä7žVç?yŸþù'0ÒžpÿéuéE_Œô4Œôn ÅH7$dW±¹0yà 7œ•ƒœ’’YÍN ?ŽÈÈÞÊ?öʊŒ¦dõ³}îŒ3ÎØ2'ãœP¡—šõ*N=õÔ1ÈêÈpd(1¨B?ÒQ1wîܖœþYcNðT—•%WgõyqS–Ï¤õ”Jé·%S²é0)6   ¡¯á‡]âúo^ ¿õ|’k>Ñ#_ЉG„<ºIzú‡Û,ŽäÉ\½¹póÙæ©ÍI›Ž“¬„;vÖmédÝb…JeP*ˏF~j äh©x¡RßüÛrQþͅ•† æ‘Æ÷q-~V²j%=jÈIÛ/lVÛ݇–¬ÀûCéì²$—ÖB!A;ò>8d2 Ê´‰¹µ¹þd}¸iÙ¹-à¦mᦝá¦=HÑí 7J!øQ¤èæj:…ª¦³@¦ @¦ËIÌ- –éfNÌÝENîL`z† +¦—HǽA:îh銗Œ–¾ˆÓÒ?ëOQZúk¿i©|óɏUòý/‘þ»7#ý5ÎH¶¸ÄHßÁH¿ƒ‘~M”ó¬É/YŸz‹-úFú¹÷Î;ïüÌ{ã7^öµ¨ŸõŸ{î¹Ç|1Òœ¨¿#¸÷Þ{†2ˆkHh]’¥œ›áœ¦Ÿº~š~ì›~ìžû옑5n=餓6Í +D6Ìüñcs’5sÇwÜdÿspŽ·œì·nÊêŸÕgÅ/5YrUFŸ—Kë (“–9§S‚§dR¿-‘”M‡ Tù¡‰LÜ ôÿEâ“Wó!#Ÿÿ•ÚQ®íYšÍºIZ=’åÚò1’K¸YsI;æ¶Á &Åî,)˜u+Ø¥¥ JeùñËO”ŠwTʗ³ïbçßò…•ädì\Ï$Üf›m–ìMK}¦M›VÅ×P]Y‡Kk$ÀÔÂ}'øºA ӊ¼®Lbn$ן¬ 7­7m7M$Þ´%Ü´ñ¦]à¦=i`¹?ãìÜфšŽ™N™Î&Êt!‰¹+è4p'æn!'w¦©`zœRž%÷2é¸7h(ðÅKFKŸPêm´ôu7-ý¦LKeY,Fê%­Šÿ*…‘´Ê~ÇÙc¤_’þŠxçç¬Î=­Ó÷`¤7a¤W=1Òó0Ò0҃¾énéfN‹-nºé¦ËÈjÊRÎL\rÉ%'A(Ç$eQ‡'e`¤„{¦N>ùä]Ò²ÁmÓ²ÆÍ3Ç{ìÆç¸Ì¬Y³ÖÊ̜9s5ddEdÑΏ´ðà ý³Ú´ªšO©H˒³)ÁS:%sN%eÎÉägœ&DòÈ#7HË8×N~øák¤§OŸ¾*²²ÿmy¤•iâ‡ëÓ2âþm%Ÿ’Kɒ3I}h:)ºI&DP‰„`' eÓA¨ß뛲nÏÄ×ÿìbFy5ÃþHÑ#ÏðÈú#YÉε™÷¶z$;Üc$ë+iÙnÖ3És³.ܱ`’+á.žuËÇH±«£Š»Ü2(•e™”2(¿ú-XÉU+u‚뙄³–®dÉhÉŖä¯2QOÊ]vÙ¥ób8i-ã\ÏØ7áëÚx)\ž¶'+ÀMC ¦‡›V#Þ4šª¦ui²!yºMà¦IpÓpÓ®´˜Æº5M§CÓ,éétéj™."'w%9¹ë 0ÝJÓ=T0=D:î‰å´ã‘> òùTÿ:Œô’§µû4Œô¨'FºFºFº‘õWsZìâ@¶pNpÑEÊHŽ'ŠstxÚi§ +µì›Ð;ÉԄÀfǤ8gë¤ÌoÓ¤d£”LrݔÞgF§ä;G"+§ä6‡ ùŸíHsJöÛÀצ=ôÐ*þmER•å£Ò Yr*¡ON$dÎa¨_„²é FùÝâù½¤Šè…ddäAFž>´ó4›á‘9nóÔæŸÍ5›W.ÈHÖ +À%Üìî[;æVB0©àY·‚w#”A©,?Vù‰ƒR çßò…•ìü‡%áäP\΋Zè±-…QlÉ2qòRIjҌP†±Ê`ª¤@5ÃYËè60Î͌}S1'8nZ‰WÆáT5­ÎäZ„ÚÇqvn#¸iS¸iÜ4™<Ýnô؋PӁ”6N”iQ¦I̝A»s 0]LNî*L7PÁtݘî!÷í¾Ÿ¤x©“–Þ~ûí>´d[Vi©H•wÁt\Á¸Å ?I)Bú›õH1FêÓÀ–O×á¶NFÒ2û†÷OœÉü„óRK÷.yâ7ˆ¾ #= #=æi?àÝwß}wzz¸ Fº††C—rZì<_Œ47Uœè½b±›é¡¬ç€eÏP³KBV¶]B ²EBæ·qR†¸^R&9&)w¸zRîpxRf:„t ­üE#RÇÏU'åE+ú·¹„Ük†J%DZÉPæœeÎa w¡ ÐoóM|±”ã!V‘1#¼šgdd>Û<µÃ#B²sm拭ɹá#Y_ɘ¶cnù*“J &¿‘¼ JeùqÉO”úUÖmïQ½ÁõI¹’¥-;6äÉŒÝ ›b\:¯ÑÕXåµJƯš(ScÚ°ÜÔ©S›ìv†}³0˜IY‰‰Z•<Ý(Þ%Çt7‡›6ƒ›¶&O·#yºÝ5í 22Í Êt =N¤ÝÀ\Ê¿Ï#Àt }™®¦‚éFÒq·‘Ž»—vßS¼ô$ÅKÏSêÝIKï½÷Þ»ÑFe[–m^K‡–¬r¥¿ãÊ´ô÷’J‘úq®­H©W€o{3ҧ݌ôség0Ò+dŒŸ#úŒô ŒtŒt³'FZÀ%±—ÃHó}½/Ì£údê}Ž N>ùäÌå `æ̙{…²£]á—BÈV ÙÛĄ\߉iÓ¦­“×[#!¯7"!–™F mHQÔðsU qEBFœ õéP–œ +õy‰Pž5 ôñA o²iß7‘Wöœx8i×ìá•=¼²ç²ùbýŽžnØzHZÉÎþ›¶šm«G*ÎH.áæz&™ÃëW0©øÕQeP*ˏP~B äû~§ô+¬Tšýö,Yr´4jÔ¨ ª[²«Nƍ— —Œ®ÑÕ¸¤¡,cUÁ=qUx¸^ëÎF¶…xS;/Šñ‰C(=Æ|Œ`zF1[ktZnژxÓæäé¶!O·#¡¦ÝA¦}@¦ƒIÌAbîXú€ŸDNn.¦ó(ú¾„–LWӍéFê½o§¡À½/õ¡¥·ÞzëMhéçÝ´ôiaZ²BÜ-ikì¤%Û/ûÒÒâ”z—Óqß3#õ³i)2җ_~ùO„0‘>Š–ž-B1Ò«0Òó0ғDC‚ôn…‘®÷,XpM/¤áÐY0Ò©0ÒŠ~Žòe‡zÃ؇xÎîÞ?v]¶g6 åë6 +åæÖ eƒ£CYãj ÙåÊ ÑȊ ™é@¤iAø‹ºPRêç*ÝvÚ)Ç?Ëð©@Î2Ȓ>4 d΁/WêûúE&ž/ëö<'xÛHp¹žA‘ÅŒÌïÚ $æw-zdw‘YIK³ÙÙ;×fW“X=RŒ‘\Q’ë+™ÏïZ0ÉÜaÿƒIeP*ˏZ~’ ”– +†•Š'á\ɒ£%[²º%»êÄÎÄé¡CL ^ì’ S +G–á/KS®Š¡«›êq}Œi /Šäéâ‡0ì+3#˜Š5˜™µ™­õ™Æ ě¶ O·-¡¦@¦© Ó¾$榳å´išM€édLgRÁt>­.%w õÞ7R¼t;ÅKFKPêý—žç`Ü«…iÉÊHJ£¥?÷ ¥®Ó-ÑÁ¸r€iiãÑℐ–.#} #}ÖÍHï±ôފ¡éš\<Å·ÉßK\ô6éé*ébéN?Æã}™ÁÑTþæuÔQûù²”=¹Ãùºmy¸ÍÁ™™ÚzüژP ²z¨·˜á¡œÛÐPƹB($Y>”­¶"MH=ÿ­©äGr)ö@Fœôo“,9è£B_æøúäÀ—Mû¾¨‰çéW:YÎóF¢Ÿëô±32Gkd¤_ÔÇÛYI !ÙÙ;זÏå:F²¢$×W²`õvÿƒIeP*ˏZÊ Tú!¸X®Z²«NìLœž2ˆL£Gy±Kྒ8²o|BãY<\ÜTÅû` ãWO…A/Š­øļã ÆyE<æʌýH‚Nk2ë0=ë3[˜Æ-5m 2íL”i*‰¹}i·rW§INn6‡åN¦èûLZ œO½÷¥ô®¼†â¥…\Žb´t¥Þùiɒ ½2q_tÓÒ/#Z²ö7FKÖ6ÐöFÛ% ÐRéÅKÓqåÓ÷B*~ì¿@Ÿmwö¿ç¹¶¾Œô‹Œô±þôf¤×X„Ž‘‘nç˜Â”à] #]###È‰úYFîË ð=ôÐi伦ø²™íý©S§nȘ&‚Gë6ë;kòf#½Å d’ƒç€@~­ iFZ¤Š¿­@²^~Òü‹ÿ6é˒¾>*ôe΁/söM<ý/Y·“åøo‘DʼFºFZ#]C„ôRÎ/œ#ͅ‘Nâlý±0Ò ŽŒDMôÞ¾ÜÜ®¤»vðe3“êlâ˘6ôeVc›Ñ¾`g$´r C\1I ôRÓÈB[Æ@[‡Tó?+‘œ¯Éøúá’ô9ÍáëB_Løú¼À“øžlÚÄóô‹œ,g²œ‰¡‰¹Rƒ"‹922ÏjÉ5‡Gò/}¶µF’v®-æhK`¤â ¸ûߺ® JeùÑÈO”JMÂÅNÂå£%gÓÖÁÛ5¦Ôù “O1€!S2…%ðdÎ~$úd/¡•Ér&QñµQ‰Õ™µp‘A‘¹R+ͶÚ#K®¹è‘yV»‹Äðȅì쿝ks>¶ #•pIÉŸ1.ƒRY–q)ƒROZ*hÎùJ– +Ғ] g×躓ÉïF¦€G p_!Ož žd Rx¸4o^xªd¬ªñ„uÀS.²gنï€?]nÊ8gÄWcìGƒLë‚L2=›eڊBðí™Ú)˜ö$À´?L‡‘Ž;šzï94þ>…â¥ytúžO©÷eÑd¯ëöâni£¥§ô§›–^‰!½«?qZúJhèÝIK?0Z*~0®+ÀôŸK9ÀTF¦%À£‚]‘J(Eêº¯í»¼Œd%nê‘#=#=#=1’0þf–èérjî.€‘΂‘Ná$ÃÞŽòf̘q(Œ´¯'¿6•ê蝼)S¦lëMžÛ’k.zdNU>§Ì³ZšÍ5’4§åê‘ò1R EI%/.ƒRY~¬R¥ÒO§%gÝö^¦74oïE¦.dò»‘)àí. jJàגěR¼¦qxY'‡¬žªqŒuÀSã׌mg8ÀMƒyñ\‰qNp~uÆ~-fa]i# +š6¡–i+&ofu +K`Oú ìOðÃHÇMãïã8w*í—Îbۙ½¤ç£¥Gô'¢¥çõ‡•¯Ðú¯“–>Ð.˜XÄõ'ŸwÓÒ/¢‹ÑRÁ6%/åë%PF¦%Ã#ýßÿö/„T°© #YP±oIwö¿TFº«# è¯`±^# # +##MÏÖÃx7Ø—¶'Œ´ ÅÒÛyz‘Øқ4iÒOæ²¾§Žuï¬áÉ¢F€.Û!žŒn (ÔîË[|!Iƒ/ã¬Cª}Ùj%’C2ž$åé/’HÂ#َç:ߣ3-âyúPo¹.Y®°XÍx(E3rddgØ,¹æ¢G1<Š…“‘ò9Ú2(•åS¾P²Ã?2P*˜„+NKκݙ¸^&¯2uE™|œ–ÏSpSÀC‡øµï~I"…ÃKãú²ÀS#T…c¬aÀêp–Œ_ ÜÔÎp€›oZ‰PÓªŒøêŒýZÌÂ8ŠA7bz6e¶&1y;0¡S˜øi¤ã Þû0.L餥3Î8ãÔèÕü /¼ ¢¥ \K…tõ¾ƒ£Ø´ô¤þÄiéý‰Ó’eV,~`´;W°x)_:®x€©oN®dú‡=1·$x¤ÿûŸRBH]ŒÔ3ͦ©ìY®ÝëNÛ_FŒd!GÇHVìÖFº.ÎHZ¶§Q}w<Œ4Fš#€#›F‡)XÀöžla+i"Õ@xo¼ñX’akzrP# ù¬ ­Î ‚s: O†ØèÉ$ë<g'3­DrHI#)$Á„HÀ¿0ñ#ѧx˙ˆs¼vŠ‹¹H+Ã6qPdnӑ‘9P«ÏŽá‘U!ÅBH±³ÿ±z¤þ3Rÿß>ÿ¾ d;S”ʲŒƒ’åًƒR¬çÙ÷JžçuʒÐR¬Ê»`€IÉãÕ­™ºs>îËç)¼YÀC‡x¸oIüAŠÑÈOYŠÂÏ1ƒŽ£–i#¦gSfk“·é¸]™îitÿ>€â¥Ã¢×pm6ÇE¯ægŸ}öYQÙÇå—_£¥Û¡¥{iQùpDKÏé ½_¦¡÷-½¯?Q͉eV-¹6K½ ¤ãŠT0ÏɕŠL?æxÓÿ‹¤ÿx¤ÿë“aÓÿýwï’¥BÿO7#õ !ÅJ‘„H=˵…H¿ˆÂ‹ÆH]w‘¸’oæ©Ù.ÎHÁHçÀH§³lO`ÏêÍH{ÁH»âªv [Ù$Ô¦XÅFž|Óº”&¶Y²UÀ£¡àÑ +ž¬lyè¦öiòdˆõžL²Æ“qV!žl5‹¤‘’DümˆˆïY¥¢ð°C±½¤ÓÿÅÄþ‰åÐÌE:(²˜QŒŒÌwºè‘Ã#×>҅ÜÙÿj¶Ke¤ï”ìɋƒ’í3eP*˲J®ñ™%׶8(oû=ƒÒÒ¡¥‚&‡LrK^dê +5ùø0Ÿ§ €§çòä ^’d]ŠÑÈà ³8Æ +F¨ +YÀÕÃMŒ_ ñ¦†s ;d2­JbnµLcÈɍãdñxL›‘Ž›D:n2³º+Ó=-ÚXl‹1Z²ôÅi§ÖIK\pA'-]{íµ×Ðti!-*o§Ee'-=¡?½iéuz¿åS,jkºÔ«Ô»`ñR‘Óq¥"S¾(S¹iل§Rɨ_xäBH}2lùN³/E2F²Ä«éË(¼Øu§íQªÖ©«‡ä #=ª?=j¶ó1Ò¹çžÛ‡‘„û‡³”ìf¤ÝØ'ÃH[GŒ$·4«‡}¬EùÏê䶇“[‰èÑ`ðh€'+kqšO\RëÉ«=Ùe…' Í"$…$‘"Ár&úa¿[:ytI'çñ8qáÄ£•a›Ä ÈbFŽŒ,¹‹ÅBH±4[ Œ´t/P²ý£P²ý(J¶o•A©,PŠuˆý^@©„±ý¥|´TÐÄK¥%`ê…L^„Lzã&nòy@¿àáÂHôä \_'˜f428Æ,.²·Y…?­aÀêyÝl"ÞÔJ¨©dH”ižƒ=‚aÅŒ¡ò{=ˍgŽ6ÃolÍ NfVûÐÒ¬Y³zÒÒYg5/¢¥Ëô§›–n„–nƒ–î¡¡÷C-=«?4ô~‰†Þ¯Gù”^´+õîS¼´˜¦Ò)¨éo›û¡0êÿÅ¥_èóàÑÿíGÿÓ#ÃÖBê‰G]!¤¿F!$ ýtŸfËBú}w)Ò¯ói[´hÑÇQZ¶ëN[wÉóQٛ1ÒýúCQœk+•‘f°€b)ïÝÍH;FŒ´å–[nÖÍHëv#Â­Š3†3Œ1 À¬Úy;i†Œ £:O6XíÉ+=ÙeΓ…f0Ótd«’DôÊ# ºÅïŽ!{q17W\Œ‚œåƒ"GF®öȹM=rxK³-EFZÌî+®€áû%ۣʠT–M›¶´@©àuC%´Ò/~/c̦ûJý§¥Iâñí=œ–×ÍM>ÏfàÜÜ\ÈC'"‘ÿKâӌ†yåƒS7UÁMµ X=½‰PS+^¾ƒ1D`zu +`A€i 2øk3ë‘xÏëõfÑ&b¯Ü– °rŽƒ:èÆÑÒñÇmN‰hi¾þ@K—Ò¢òjZTÞHCïÛhèm´ô ½êK,‹bù”¾M—ú/ÅÒq%˜–™ +†š+ÞôƒÊÿ"£8yQ$ òßxä1jÈzà‘yà‘yT!yàª'nýWÏVóæè»i¶_ÿú×ßö(EråÚüñGQ2öwÞy;JоòÊ+/Sâö\÷]$®‡ä݌dçÚ\=RŒ‘ŽÉÃH»w3Ò60Òæ8£»imüÐl³#°”a¼f Á ĵó&҂5bou`J æW‰5æ,ƙÆLSH²ÛjÍ~ƒè ¨ë5ÈË#œS\9r<ƒ"‹¹ÀQ¿ðh)2RÿA)ßí1P²}Áv«Îr d;I ”¬ÓTÿAÉö·2(•å%wç-åþß9Ô¯ ¬‹ƒR©ù·~ÑR,ÀC¦^ÜäEÈԋ›üHô€nÎ$Äõ%xòîÐ|qg™‰<µ§ï]ÍXÕâÑëº&©•×ásƒ¨eZ‘q^™ÁدAºaíhð×k{Ñ6ZÚi§&3µ»2çÓX%´4sæL£¥9-ÍÓhé|ZT^B‹Ê«iQy ½o¥¡÷Ý4ô~ ª/±,ŠåSºš.ý,Š$|ðÁïGÑ‹3ôMÇÅNÇÅL=È-&2ংñ¦e‰ þ· y]ò{H_<úïxÔÅH1<ú+xô—4Ìÿ#ý›'ZýŒôGOÓñ/Þwß}÷{OSô;Àõ¾ýöÛ_"ü&J³}ñÅŸG¥HÖ¿Ýî½yûí·ßŠ/¿üòK¤jŸ¥Äí‰(}keov\à&ý¡(Νýw5ÛiŸnFÚ©7#M`ɯ#­1’Þ!F€]FZ›„õt¼håM¤ «ÇÔj0º*l°kÌb—i$…™&#[•„Ñ+O—¸× ¯‡˜7ë—9‰ñƒ¢|dTb!¤Ri1AÉ}hÁuKJ¶§ä%ëb^¥²,» dKt1A)ßÅCÅA©ÿGßúJÅi©dêjò"1nê‚'Ÿg3 px&!À'š/6¯lþ9ƒÉ18•ø’jƪ‡Ò25ñ:ÜJ€iy^‘1Ä+òÚ¼rômۄ½TÇhI“—Ÿ–¦OŸn´tM—æÐtédhéLZTžG‹J£¥« ¥ë¡¥[¢Ê[«/±,J¯6/“my#Š)¼ÿþûïEq†é¸X½w,ÀÔ3'W™zÕ2õ“›J…§¥T}èoòP(ÊGF%à‘ä¯yBHxÔBú£GÉ\=BHµeXëqmÇåÈ7ÙzŸþùgžy´R$ëHj÷ÞXxñ¥—^z‘í3¤j‡‘ŠÒ·Vöfp×êEq—GG/»ÎþŸV(׶¾É1Ò¶L·ÈÃHkv3Ò*¼M8FZ>b$ÙQUÕbjUàQæ—Å3H +ãLFj¶ÚeµA— ÇÄÑM©â((ÆCŠ +’Q©xô½0Òߧi{€í1P²Ó€1P²FœeP*˲ Jvkc  ”ïk[ò¶øí\ÇR¼¡±ÿ&^ÜâK ¥|ÈT€›<¡SºàÉçÙL\_Àó†ˆùbóÊ)"ÏÎ0.9\x%ÃT 2Õòܽk$[#÷o´d¯ÍFKÚ&:iIàº6=˜Ö£Ô{£üÕ×ØüÅ×(ý‡¯ñú³ùÃóÁ#_ƒÛ‰Gñï!ý3!¤ßBúµ…ë(ÙB’úXŠ×4. -¥- 0D&‰!S/nò#Ñ‘ȍ˜NtûçTä®å¸³øñ®¥’Wßêè%XC×À‹q3¯Èm-Ùk³½@[ºÁhi­µÖ*HK“xóÚZšÂìïÉ*ٟKv…–Ž\nΜ9³¹_÷$hé hé\z_ÕÛZU‰Ý-Ñ«ÀCQüÀ" /½ôÒ Ñýº±tœ˜>ûì³O»/Ùý*Jæt˜Ü¹XN®TdÊjê<•JP‹'^1ùŸB҃Œ|ÈȇŒÿŒDöJÁ#\„G¾Æô>xäÍó5â¿óE«¿ñW_û‹x Ôõ>úè£<ðׄ=N?z„=WŠdÝÝ-äx÷Ýwß…!o¼ñÆ¢²7+€³ƒVg‡ ºÉú#Þ£ÉI~h''äc¤±0Òè8#ÉÝäg$ÙQ-ÕÉH²²ö–ÁòÒb +“LD" »mÕï-^oé6ý‡Bù ¨ •€GÅo·í×1·Ž ¿s¼«moOP²}Ávk#å@É®µs dûŒí8¶÷, (¹-° J?e)” ¬—"(YW~[Þ”lñ;P²°®Ñ¾ë²ïjì?#å¥â´T™º¸Éë!]ÜäG¢ "1‡Ü埓‘»6Ç­!ÉF/¼æÖí%XN¦.rúFK¶ؖÐZڔ^¶ùhi?hézACïc¡¥iè}:'‘ÎŽî‘èjQy •&î`Üݔz?@$áQb +îKǽN:®3ÀÄ^›'ÀôUԊ§4dÊWËôçèÔVn*žJÀ¨¾Tõ7¤(u¢P_ꄢ‚dԅGEþò7ðH։Güã¿ó5¦x¤qþ¯ÿÖ×ØÿÒ¸~íBò³ŸûÂÚOüE‹}ä ußó€^ï­·Þú™{¤Ù¼çž{¢Gxѳ@£Ý!hÁÇn¸á:Ò·WFeoóçÏ?F:F:%:L0kÖ,×CòÀŒ$ŸÓ‡‘ÖXc c¤á½ãHz0’<1R]ÄH²¨NF’•e±·4–—“H» {X¨³Z÷òÓ%}p&–/Î>ù¤×ûÖß"£•ÀH¥¶Ýî?îâ׍»û ÌóÛ`»A ”¬1¹%ÛS(M˜0aÉ@É“Ê ô“—â Ë¿Å@iêԩ˱}ö¥í¶Ûn9õ,GÕKçbµek Øîtt d­ùmÉ»›­óRñ£o%4‘]b³/ÈHù@)-åC¦^ÜäEҋ›œß ºr9é|´dn=-ÙFàhIî¦ÿ´´=Ó½ ë`Ö˾ÐÒÁÝ´t ½Oˆ:#w5ô¶¦K—’E¹š|ÊõdVn!~p'ٖû(õ~˜èÂ/Y:îEÒq¯RÈò3JZ,ÀôõÞ`ú$ª þꫯ\NîÝ99kòC¦ÎĜ• 5õä&—§sâà)Aå+|*.v¿WZ¬¸ü—“¼<ƒ"‰AÑ_È(€Œÿôhô¤ÿèÁÿ-Ðük ÁøS ?àQ ¡û}ðÝwßý.Иþ&Ðè~hœR¿ñ5ö_ú×/|!짾`öc¬õ¸ïú ®ôzà¯÷â‹/>ïÄi6‘¥HFÏnűàãUW]uéۋ({;—¸¹89:B`G/íXÇtý‘ä}v„‘¶ÉËHk¯½v'#9r8Éç•p2ƒ»©ÓhÁH»©FªÂ˜*ò2’l°“‘Ì.MÌV»ÄË#ùÁfI$E¥âQ>F*Jýw›ùcÌÿ/Orb d 6m‡p dû‡%Û]b d»íG¶3Mž<¹'(Ùf{YAPr›a”~¢²˜ dÍ&(M™2¥séÙ"ŒÒf›mÖ¹líBlJv±£%kÍofPð“X¡R¾ü[ ´´´%ŸÏ)Ji©Ëƒx½‘Éï!]^9ìAKæ¸Í…k42Ý´TQ +-‹-Á݌ƒ–6ꦥ­zВÖÁT–Ê>\rןÎõ'³ ¥ã»¯?±¦Kç“E¹˜|ʕQÔàÖ[o½‰HÂí/ÝCñ҃/=F:îiÒqϓŽë`zÿý÷ß%Àô>¦ 0YNîsrr_’“sÈô+©g”©WùwŸPS_nꙧ‹ÁS Ջ¥œô¡ª®3ø=ÅÕõ–B(ÔŠE]dô=ÈHòïàÑ¿Gÿ‚G!xêéÿj4þ%BáÑ?‡àQhx¤AìÄ#î7Æù«@úE \ý,¸. +>þøã}`ÖÖ¾í¸>¨ë½>ø랐øOp|¿wÏ=÷ÜåÝ~ûí·zBçåB2+—Sê}-ٖ)õ¾•â¥»(^ºŸtÜ#¤ãž ÷,§ã^¤ÏŽ˜Þ Àô6¦ŸSÁôAdúòË/ó#“KÌqv=O¨©'7õŠ7õ„'yŠT>ŒŠ¥òòH÷ù²ÂÒ£ˆ¨¯üÅÏÇC½ èÏ!dBF¡‘‘äOàџÀ£?‚Gÿ}ý¾~j„~‚G¡†î—á·ß~ûMøË_þò«P£ûE¨qþ,Ԉ/ +4ö×÷‚÷Þ{ï@0ûf ¬}-xõÕW_ò_|ñÅç|AïSþO<ñ˜û ±GšÍ“½o¼ñ:Oè|•wùå—_â|ô, 9wîÜÓHäž@Ü1”ÂÁ‚CðWûá‡öìf¤ÉQ³Ô.FÚFZŸ­rˆ‘Ö\sÍÕ8,2ײ®¥#ɵt2’‰™KiŒÆ©¯Õ~ŸŒT̃,(-&<÷»óº`Rñò$wà-ßí%”lw±}Ævœ‚ d»U”ÊòC‚’õˆ·‹ší‚JÖu2ß͸±±£oÅóoùnr,~¶ÿŽb1y¨xT$¬Tjl©W&.Ó]·Ô‡– +Vy»3q]-­Ë n-M즥m¡¥X»±höŠ®Öíº,î(*ogS_r"•&§“O9›ÌÊ|J½/%ÛrÅK×S¼t3Gžî w/%¾’Ž{ŒÓqO`zŽÓK˜ìˆÜϺ‘é½™>ýôÓX”©31×UËôËÙ¹^ÜôûèìœÅ›¬´©+Oמ\ä)FP1Œê•Ê‹SUt辨ø]ò1 ºäÏ=‚D]<Ô E’ »bFJHþ˜Ð·ýC2J@F =ÛïzÈNèq—ÐÓÿ&%4.¿J~‘Ѐ}ÐÐ}™Ð ~‘_|ñÅ¢Pãüa¨?ÔØ¿¾ûî»o†BØ׃×_ýåàå—_~!xþùçŸ ž~úéDzªþC=t¿ï½÷ÞåßqÇ·ú7ß|ó˜ì ˜¯ð„Îy\pÁyžpúLO`}Šg÷1Ϟ={)ÝQrW®j_¼ÏԒLé}_ÛfqFZgu֌3’¼Ê`¶Ùx•v¼J'#É«ÔãUjcTEæb†c&d ·X=R¯`’c¤| ôÃőú…LKÑ1?ú[ü¾§âY7Wž”¯3@¾ûpmÇq×¼Ù~d;S”Êòƒƒ’»ð́RÁöÜùŽ¾å+Trù·X£€‚w:ì8»˜Îci£P¾Šî¾ò·J–ºê–Âîc7}hÉÎęû·À¶¹ NZ҆ÑÌÖÑÆ&ë·4,ºÔÁ®w7nÜZ¼¦Åhi ¦{hiÇÞWëî--A}É1Tšœ@ÍÉ©dVæ‘c9Rï‹)^º‚â¥k)^º‘tÜ­¤ã:LO<ñÄØ'Àô4LÏSÁô2Gä^#'÷3Š¾ß¡«ÀÏ{#Ó'2uÕ2už˜³P“Õ€à&—§ëO®Òɕ;Å0*êªH¼˜Xw¢nñ ITIÔKþ5ì%ŠCQ7%!#ä÷I}åNê ~—ÔSý&©§üuRÏûmRÿˤð蛤Æ嫤ð蟒°Ï“ºO“àQò³Ï>û0±hÑ¢÷çwñ·ÂÕ××WÂW_}õ…ðÅ_|6|öÙgŸ ž|òÉGƒGyäà¸'¸ûî»o÷5µ7ùšäëü \åƒÉ>i6töÑgxÂé“<ÀÚ# éYhRŒt nirþSa¤q2ÛÃH[ußi;>j2oí捑F=‡² +ehÄHÚaàPÚq(-쿍8”zJ'#i‹®ˆÌÅ·u%9F*©(éï JK‡ –Ž',îá +^Yà)Ö _Ö͕'ï »½$Jî>Ü2(•å{¥‚¾Å@©`3¥|Gßb…Jóo.¬T*-?-»$®¥ÄSºô-Ù,ý8œ;'/ï:Xg¼l´466Vu÷[ª‹ú-iëhîîNÙÁÆb´4$ºøJ~hÕèÂPMÙhhi,s¹ñì LòæÌùÖ,p2SX4{@Kûr:é`jp‡–fRs2‡ê““97—ƒqçPê}ÅK—Q¼t5é¸ëé%p§ãn'Àt¦¨`z„ +¦'¸ årr/äA¦XbÎÊ¿Qþm'澈s“;;gÜdyº|ðÔ+òԓ º0*ÆR®t<ωøåOQßFëNÔ%â¸Y zÉÃ^ò‡Ð‰º¤“‡zCQJò۔¾ãoRúÊ¿Né1~•Òcý2¥ü&¥çý:¥Çÿ2¥ø"¥qù,¥ú$%Æü8¥4ˆï¥>úè£w’ï¿ÿþ›IóëIø+‰×^{íńÀõÙÄóÏ?ÿTâ駟~,|ì±Ç +zè¡{CMޝÁwÞyK@~5ÐÔ^ëk’¯ð5Ýûšøó|-yž鞖Š8íi©é ±õ,4iAJ¹›ÝØËv¢ªd;iK6¾M`¤p(ã"F;vìd`FâKVÁ— eK]ÍuÛl;n [ocw#ɚ¨‘¤|IE&I] ’Ýgÿ;<Üö÷(ÜîE÷ß²Jpd}{íæO¸¹Ê$óò³n¶Cä«ã.µ3Àb^óæ@©ÌH?QùžoÆu=bGß +*Å:*å +¹n1ZÊw¥QAnZ–¤ØIàX—¥â­–zö[Ò¸¤¢>ÂÖQØz ËÙmU½¼åŒØDb7Ÿ ä­mom+ጆãŒVcÞFó¶´´>´´13½?‰u°=´´3+g*´´7´t Õ¸‡Q—{Õ'ÇR‡r"¥Þ§Qê=â¥ó9òt1é¸+HÇY€éNÇÝB€éL÷RÁô ·¡œ]"ñc"ºù— ·„’ïœDI³.ùçA¢.êEi}‹oӐQZ_ôiÈ(­'ø:­Çú2­ü§´ž÷ó´žüÓ´bQZCòQZ#ôAZxôó4x”Rï¾ûîë©·Þzë•Ôo¼ñbJ#þlò…^x*ùÌ3Ï<–xâ‰'J<òÈ#÷%ˆ†š²ÛBMÞÂpá… ò«¦öÒ@“|?þüsü³Ï>û ÿŒ3Î8Ù×b8Λ3gÎLO d†X{|ð~ž–Ïžž)ÅH;ÂHÛÀH[ÀHñ%²® #éf¤Ñ¥†r#CÙMW`_]Ú¦½¶……ÞÈ»A]t!‰Üˆk¶‹ŒD ”Žl¦«‘d"2+geÎòÌûÕà{–e·õ½½©ÏEáæ½]?€X0)_Ö-vnÁ:îþw(߇[–¥ J%4S*¡¢;v=n¾ü›E\cÕJ¥ÒR ™ +6k+µkI¿¤à/ZLéÛºÎëîàݳ·’õòÖh$¢쮅®6ÞÙè¶*R% äî‰kˆî‰ÓÆÒÊÓÁf3W·Ál@+ᑆã‘Vcòք–ÖÆ­Çæ5?´ ´´%‹a[ÈN,ŸÝèw3KûCK‡P¡;ƒƒq³8w¥Þ'Sê=—â¥s(^º€tÜ¥ô¼’ÓL 0ÝJkÂ;9"w/99‡L.Êd‰9«ez•Z¦7h`ùf”³P“ã&+7n²M–§³6Mv9™ƒ'yr%ùŒúuoŒr,It÷™:™D=‰8Zæ$p"Îù]Ø%¿Mô’ß$»ä×)P¨[~ý2‚"É7}ƒ¯3ú>_eôõþ)£¯üEFðyVOôiV϶(«Gý(«'ÿ «x/£!y7£z+£±úYF´ùZFƒørZxôBúÕW_}6­q~*¥,õÔSO=œzì±ÇîO>øàƒw'‰ÿ%ˆ&ˆ &ˆ†Ä ÃË/¿ü¢€R@Î5 ûêŸvÚi'ø'žxâ±þìÙ³ò:ê¨Ã¼éÓ§ètÐAûxr7S=mY»x¤´p¥.µÌ&°à6€‘Æ’cY 2 +2‚MÓiE6ÒØR­†ï´b¼Î‹mµäc—¶å"Ó°^÷ÖõÞúß÷ê¸Dæì-Ÿ5.m‹ÿ{È÷âæbý1cx˵åc$óò±`R¬)@,떯<©ø·rSî²ü]A©x€â…JùòoÃJ®[€KÂ9Zr™¸ØÙoB*xÀ÷,ù¾A?Ä] çÄï¾'.è¾'ވ ’Î{âìöN•]—ßª+·TË׃¦M¸¥& ©ÀûÛ`¶¢¡lJ«à–F2ƒk°eÁ#c’7dÎ'²¶`ElÃ*™Ìš-í-íÃ)¦ƒ¨ÕÎÁ¸£(õ>–â¥(^:•tÜ<Òqçr:îBNÇ]F€éjL×QÁ´#r·’“»“œœC¦Gº‘Éj™¬üÛN̽…š¬\ÜôVnúðíø‡Ñµ¼ÖÙҚ n–Þháê,ÇUÙ/‡±DWä-ËpÚá+¼³¼FÞêp58*Î#„Ýnk÷(š¥Ännë2«>·’8k\B›þÞåpiÎåºè‘I¬É1R,áfþ>_0É5ˆeÝb—ô«Ž» JeY* Tj3¥|Ý%äß\XÉ]ý«VŠ%áÌ¢\lÉÕ-å»[;ß5’1Y☖¶ü¦/’^mvÞÀ©ç "Ñã‡Ý·™'œ$n)ŀepKY1(U⛪ñMµŒs=¾©‘±oaÚy‰ÀKÜ +ø¦¡¼Ä­ŒoÁ4ŽbBׂ–Æ2Ó@KCK›±,&±T¶g!í -íÎIï½8Ï´?má`Ü J½gR¼4‡â¥“HǝN:î,Lç`ºˆ +¦Ë¹ åjŽÈ]GN®'2Y”Iø–³Z¦Çi`i'枍BMvl®‹›^úYZ‡&kjI›ÄèÝ6g—Ü‹ :áÉ®êu%ù<º¹×a”äKc)Û|¹ñì+îõø*ºÜÃZX;º|˜ˆd" »%:sf•ÕÝU!QÒÌâC.H$ù ú4§ÿù2ú¨B_åà +}³÷+ôM^¡ïýn…æí +á›zÊ7*ÞÿýW+4/W^¨=W¡±z:'Ú|"§A|4ûÌ3Ï<˜Þ—Õ8ߝyànÏÜsÏ=7§57¤5)צD´W¤®¹æšK’¢ÜùIÊÏ"ß¹ 1ð)¡høøP\|L0gΜ#ò°YÿCÙǗ§Ù×W™âɗLöôª¿ Œ´…'籉'FÚ( +\j \›ÍpMi5áp\ÆJ,Ì!,Q;¶iEvm,àf˜ß¤uøüFK¾"ZüfòéÈ*Ì>ÌRÌp$A·1õ¹ÝÖÙ`13]ÜÈå¥ò‘‘ !¹z$G2îª·Íßç«LrÁ$Û5Jͺ-fw”ÊR"(/T²eV¼P)_þ-Ö(Àâ§ùÂJ. çj»-¹Lœ 0™ù¹(“Ùe>xúыÇÃÄÄçQMß$d4BÆ%Á%«£–Æ7eÉ T‰ƒªÆAÕ2Øõ8¨F& pma—'¬4ˆ$܊8¨a8¨UqP«3«£y‰[‡é^·4ZÚg´%.h[ÖЎt ÜZÚZڇƒqRê}¥ÞG’Ž;†tÜñô8…Ó˜Î&Àt>·¡\LNîrrrÈdQ¦®ÄœÕ2ÝC»o;1÷P”³pmùOoz6:;G»òt¯O¯OoD·Ú<ٕsvÓ=÷¹F—Ïõ"¨"Œo,êÁR’O=€*ºñ̄Š(ŸàTt͇ mŸ‘Ìça·$ÄW&Ÿ%»%eED]òI†ÐPF±(+ù8kA"xù(zÏ ¨R¿òÝJ}ƒ·+õ¥ÞªÒ—üY•¾òëUzŽW«ôX/Wé)_¬=W%ù住>úè]9ém9óMÙ;ï¼ó†Œ&àÚ éÑ´8ö’4)ÓÔ%—\rnjþüùg&Ï9çœS“¢%4«³šß£CÍôáá‘Gyp Ùß/Ð:ØË׊Øݧ¦Í×*ÙÞ×6ɓßØÜÓšài§ÛÀӞ·®gK a +ÏGâ-VÁ[¬„·Œ·ˆ·°Ò:+²³rK¹ŽE]Ãò®b¡WDK^‹ß^ÒD +Ó°wˆDd.f8fBfLfV1S3óû¡À²*1(rdd^Ùá‘ùìX®-ÆH±cnŃIųnKRžT¥²,)(,T*žsçßò…•ì¥Á^\ÎђËęmÅL1drÜäàɉ³äôz/.zJ¿[?`4ÂH48 †)ɀ¥pPiÆ/ |æÓJF·Šq®aÄëûFf¡/ÕÆÌ,Ï b·宄—Ž—Z©]ƒ7¹µqPãðMòþ6ZÚZښ…´=´´3§¿w§Eå^ŒÛRïƒ)^:œtÜѤãŽ%Àt¦S©`šKCC¦ù}w"“E™n»í¶ô®¼‘nLVþm'æîŠBM⦢NO=õÔ£Q?KëÐdM-­¸]b·Í ^ ^£Òéèª^#(ÅÛ`Ô;`Ô»`ÔÏ D½çXŠ+Î>ð*.„ýÐ#©gb EÂY¼ÀDüòQh"´ú(Ñ-IÑ͇©nIK>H {>ÈHÞÏ꾇ü<‡DA"ý³ˆ‡7#(Òo{½Z_ãÕj}¡Wªõ%_ªÖW~¡ZOð\µžè™j!â“ÕzÞÇ«õøTk4¬ÒàÜW%<º»J£vGåC=tkå}÷Ý·°B@z}…ÆùšÜ… ¯Èj.É^uÕUd.»ì²sÓ^xá¼´f봔æí¤”fpNòÄOœ™˜3gΉ™3gΘ1【òþ@Nf@ndJ ç1Ù§¦Í—ËØÒ]o +#‡‘Ö÷´šÆzZW£=­°Õ£¦öƕõ¡ û +ÀûE;K[Ú¸lÁQ “V±¼+ðY–|†ÅŸŽÌÀ B¦‘ˆìÃÌŤ—ùyMíGëA¾WÔŠåÃ#B*ÈH±„[Á`’;ë–/ë¶ÄåIeP*KQPZÌB¥â\þ-_µ’;W-¹“C&{;‰q“ƒ''Î~Ü¢‡ñòˆÏC› „Iȸ„ŒP‚±J2j)Æ/—Ê0œ9òd.ªˆ(Õð:WÇ40ÍLJ+ÓÓÁD dÊ㪆âªVaVG0¿£x[ /5ZZŸ1·´)‹fKVÓ¶,½ÉÐÒš.íA©÷Þ/@ñÒ¡¤ãfp:n&¦ÙT0ÈÝq1d²(“%欖é*.G¹–PÓõ„šn‚›nŽÍQs³v?þøÃôxxzxz2º?Å®œ³[zEP/@P/‘»{Œz5"(Æë=0Jò¦±”'”zˈ¼Í…°&ïp¯G§X k®b1‰Z6"Qw"É;INš¥º%-Èz;Ó%oe%oæ +Éϐ7*õs¯WI^«2Òç½ ½X£ßöB¾Ás5úBÏÔêû=U«ïüD­á±Z=Ñ#µzÀkõ¼÷×èñï©ÑhÜY#<º­Zxtsµðèƪ»ï¾{A•†óêJîå×_ý%×\sÍ9êȲ_|ñ¼ìùçŸZ欳Î:)Mu~úä“Ož•ô™<æ˜cK +„JLŸ>}߄àxϐòþBÿ@‹aû@[Ö$_;Øæ¾|ÄŸ:7O›Ü8oâĉkÃHkÂH«yrvêrXÌ´°¦!»¶O+£kaZ²¸a!Q ŽV²¨+XÞö2aɧ£Åof ƒHD¦aFbæÒe8~dG1ےÑyˀÙ/›ó±Îù:22ÿìðȼ·ùñ‚Œänî˜[ Á¤R³nKRžT¥Ÿ”ä›ýþ*Ì¿¹óoÃJù’p®e·£%‹ÂZÎÚ*üìL\>dŠq“ƒ''fºÿ@âñX1ñyr“€Ñ0 “–dI1~i†3ƒ«Êáª*ç*F¼†±¯c˜&f¦…9jg¶0o+0ƒ+⯆á¯Ve’Wgº×ÄU­ÍëÜ8–ņ¬’‰¬œÍYM“XÛÓÐ{'ÚìF©÷ž/íC:î@L‡`:‚ +¦NdÒÆÜ™´cŸEkó¨eºPÓ%„š®ˆjÀÅM ঈ7ÝDiÓ­äéZZpëli·ÍÙ½"¨G!¨Ç!¨'!¨§ ¨gˆA= F=F½@ïEXê%Xêe–âØW¼×^{íUÏ.;ƒª|2{¾]îÁÅuRÖÌÚ$êۈX‹¢”ä5N㿖F2VYÝ%¯ä¬’HòR¥äÅ*âC¤Ïž¯îâ¡gkôQOGP¤_ôD~ùcuúÖé«=\§/ú@¾ü}uz˜{êž~úé;ëžxâ‰ÛëĎ·Ô Ö +®¯Õ0][£Q»²úæ›o¾¬ZzQ•Fw~¥øôœJ û™óçÏ?-wÎ9眔Ì—Ö“9á„ŽLS§Ÿ¢b?¥ Ý/yÈ!‡ì•CÙ=¡ h—P›Ò¡|Ä6!¤@;Ø&¾pz¼¯­m}Ÿ:7ŸŠ7o£6åiI„‘Vñ´-Ú©ËÁ„’|Yž•ØÁ»V§¥ˆ-Y\ËÚ­fW²žs¸‡,Ë;-t[ò¶øMÌ Ì4ÌHÌ\ÌpbÆdÖ%?¼±/«ó±ÎùÆÈÈ¢G1<2n¾Ý¼|AFŠss•I±`R Y·%.O*ƒÒOO–bþ-vþ-_Yw¬Z)–„‹ÑR,¶du}.Àd‹2™˜5š]ÆÊaÔ?šx<[L|¿S4$2B!–@’ì))1͘fðWY†¸‚Á®¤@ š·÷Z¦¢žIidzZ˜¨6¦ly&oÓ8ü]‰°Ò*ÌôHæ| üÕZ óX\Õú,•ñø¦MXR[°à¶¡éҌۙtÜî¤ã¦ÑK`_꽤ýÒaÜ×™Î;ï­<÷ÜsO¬œ7oޜ +!쬜`öȬ&jzFSvpæˆ#ŽØ?}Øa‡í•’W™šÔüNIj¦wLhη 5û[…r +›Z­ ­’q¾ÖËÚ¾VΚ>o0Òªž6Õa¤½1cƬ# €‘:`¤V–c3 ³%Z½Vl ¸§c=gYÙéhyÛB׺O`‰È dA·ø‘¹ÄLÈ̪K~x_¦%æcó‘‘½á:0ꁣ~øá‡<ñÆÃ,剥Lõ"EÂœ +HïÙh¡ —²$(1OŠ_7I ­O#ÍãYÉcYAÖc9É£’G*…=TI®–Èd‰¹SO=õpBMGÁMÇÀMsà&ëËt +­,O'Ow&ðt6ðt^tkÊW\q‘§K¹?årêJêj¹»ë!¨ˆA-£n£n£n£æí°Ô°Ô,åÝsÏ=w{•PùÄ¥|ÑÈ}¾¨ê¾€«ar|¡¨êþ„‰¨åþ$çóR֘ÈDhuÆâ‹nîËٙ3AÖ½•’{ª$wWKÜY+¹£Nr{½~îÖý³[%75êC6éW^׬_~m³¾ËÕÍú~W6ëë^Ö¬G¸¤ùÖ[o½°IOy~“úœFÁ¼FAå £Së/ºè¢“êŸÇÕÁ¢µgœqÆÑ5§œrÊ՜Q¬:öØcªÇîW¡9Ú+wÈ!‡ì‘•ßØ5#Ï°SZº}ZûÑÖ)½.m‘Ôœo’íOh¬Êì× eöcBHÖËj>!$_khe_«i¨§u5Fèi­uxÚ/íA3¶ßÈr¬gaÖF¡N-ÖJ–m 8A¾ÖsI±¼þíe ŒDftK§UÄl¦—üˆÅà}bÞÖAQŒŒÌgçÃ#óòæïc¹¶|Œänî˜[Á`R¾³n¥fÝÊ T–< ´ÃJ±nÝù’p®dÉђY…Ù‡UîÙ9 09drQ&35ÇM1xrg¿ÿx¢ôòˆÏhtŠF(ˆDF¢AL0œI6ÅΔfœ3ŒxŽ±¯`ª˜jf¦–9ªg¶™·ff°¹ì`V2¿ƒñaCña+ãÃVe1¬Æ²X“U2Ï5§µ>«i<+l"ëosL†LÛEÈä¢L³fÍړÊï}8,wÜd'æ¦Ódàˆè؜vöcÉÓ<م)§pŠît"Os‰<E÷s!¨ó!¨ –\ A]J êrbPW€QWQ׀Q×Òó:XêzXêXj¡'–ºÉKÝä‰ÛÞzcxd^Þü½yþâŒK¸ÅšK &-ñY·2(ý”eI@©`µR¾$œk£%—‰sUÞ±S ™,<ë¸ÉśA9Œrâ€ê\¼HôÐ1ñ“€±2 ¿‘L I6Å§ì ¯xY& ‚©¨dRª™žYŽ¬Pj”ZÉ¿µ3µ˜äAL÷&~%–À*8²8²ÕY%kâÃÖfù¬Ëjڀ6ž·IodږL“©ü¶Z&+ÿÞnڛðýˆ7Y_¦C§Ã§#§™DžŽ%òt‘§¢»yEP§Qîtu&1¨³ˆA FFÍ£.¤jüb0ê¢Q—ÁR—ÃRWxb©+=XÊK]í-X°à òT |‚Säº`á…ׅ¢ªëBª¤’ë“Üõ‘Z]Ÿ¦ëx†¦PY$'¦¹®Bhµ ©ç\[-¹¦Fru­äª:ɕõ’+,s&¹´I?|I³ñ>åÂ}òüVýŽóZõ{ÏiÕ×8«Ußjn«¾éé­W]uÕ)­z˜“ZôlÇ·f7ëñg5kHŽjÍhÔ¨ցÖs±næ̙ûԊT§ÕÐÖ¡<ª¢1V% E+À£x”•oš¡çhZ\¼aJ;ظ¤ðh$¶dØB­’‘¡ÖËð@[ఀ*$_«iŸ’/ÃÚÀ£f¤Ñ³Ê8-ÌÚ(ÿ+©B*X»¹(è)I³¨-šŒp¿Kì è¿·xy䇷Ú§Ä|¬s¾Î!ÇÈȼw><2ožßöÛ J`$—p+¡2©œu+ËR¥‚çߊ‡•Š'á\ÉRqZŠ˜Ì„\”ɳ1nrðäʉÙj>qæü㖾ÏæÅEaâG¢a +"ÑЅ‘h8 l’!N1Ø)ð(ÃØg™…óQÁÌTáÍj˜­Zæ­Pj”šÉ¿µïÀ¥ Ä¥­€K[‘u0Œ1œµ1’U2Šõ2šå³6Žl]֕C¦Î(“Öig-“¸i¸i'âMÖd`*],§OûOû“¬³ S… ‡ Ž„ Ž† Ž¡Üi6u<1¨Á¨“Á¨SÁ¨ÓÁ¨¹`Ô<¢QgQç:–:–šï 0.ðTz⍋¼K/½ôb òÅ —ø§Õ¥Ü +{Y(ªº,Áh&Iê¥RB«ËÒTœg¸­%K›ƒœäÒ +Í¥•â«Kª‘ÁÎŵ’‹ê$ÖK.hÌo”œ×¤9·YrN‹ñ>àÌV}èÜ6}üémúm§¶éœÔ¦ouB›¾äqmúÎǶé9fµ +j7oތáÑaÍ£CšHl6iÔömíUO÷†:áÑnµô¿ªÑTL®ÖÌlW¥‰šT©]h‹ +ð(§ Ý8 e(@J˜×IQ€”ÔŠX#É9ÿ JCŠ´C­¡¡–Ôà€*$ðhyŸ’ßB:O+¶†e[TFŒ$±œpIGáO‰Bów‰{ð{‹—G–ûýQHA/ó¶Î ;(rdä’k1§ó»Î!›Ž‘‘ùñÅBH¶ؾàê‘bŒ”/ᖯgÒ“Ê T–<´Ôÿ°R¾ÞJ±’¥-¹º%Wå 0ŐɌ)7ÅàɉgLÌjj¢'÷òˆÏ0uŠÆ/ˆDÃF¢!N IF<Åا™… 󑅑rLO%³U…_«aòj™Æz&´n”Z™évæ|³?ˆu0„WÁ¡¼ +®!“Ü\'2Y”I im–Ôºøºõ£òo;1§U·)‹p‹¨/“V綬ÓíY»;²žw£v£¦‚QÓDí FíF@ï`XêPXj:Ѩ°Ô‘°ÔQ°ÔLXêXêXXjq©ã`©ã=XÊeœè ¨Nò*_äqŠú駟ˆªNå.ØÓB!Éi¡¨ê´Ù¾¤0åô7ÅÒÌúôŒ¨ê4ëۘ£;-ŠN­¤y•7ZR+9¹Žòêzaω’š$Ç7ë¿×"™Ýª>¶Mÿl‘¢™íú¼£€¢#:ô‹ïÐï=¬Cßå}µƒÚõu÷o×#ìÛ¦'Ú«íØcÝ³•â¯ ĔfáÑÎMµÉÉídÝ[×kØ·¬ÓTlV«é™X­Ù_¥Ü <ªràQ<ʀGið(¥5´JR‹k¥¤vÉ! mš+„Ú\†œóÄ4m`§Åç ›?räÈ¤Î“Ô ÕH¥×ÅHx¤։GúË'ر݁Р‡ôzðجóIÏ]¼,‹éUúˆs¾æcPäÈÈü¸‹™—wÇþ]É^¥K`¤| ·Ž¹•ƒIeYP*!¬T°·R©´«òÎ`2s1Ãq‰93+ã¦<9‚råÄÕOZ¼H4$NüH4j&#i2º& ;É؛¤˜Š4~-ÃÌ䘣 +f«’y«ÆÃÕ0uLhSÛÄ$·VjcÎ; ¥,AÐÒ–EOd²(“%æ$åßZMcq‚ëEM¬/“ÖÚDVÝf¬?»^nRtǜÖäö¬ÎY§;³lweïÎzޓå½,µ,µ,u,uq©ƒªCa©é°Ôá°Ô âRGTGyª£=XÊjÌò*_@uŒ/ü86P͈Pq!ì섨jNBT5')L™“UÍIs×GFè2'+ªš““Ì®ÎÌ®ZÍ®æ—!Î1µH½d5Ö3%G7IŽj–Ñ¢¿˜Ñ*9¼Mÿâ°výÛCÛõQEvèíß¡ß»o‡¾ÆÞújÓ:ôM÷h îÖ®‡™Ò¦Ü©U=¹…Ø\³gë&ÚVÎÍ4؛Ôk*6®ÓôlT£)[¿ZÓ¸n•¦víJð¨<ʁGY-ŸU3àQ"Ã}hYñˌœÐjF…ÐjF•˜æðjn¾«á0_ý6ëé Õ@…Ö7Ij‘h™³6Éþmúá}ۍ‡ô){E{ES;ô+wëÐטҡoµs‡¾äŽíúÎ;´ë9¶k“‰oݪçݪEc°y³gÓ&Ú„FîøMÀõš£quš·±5šÕ1ՔfWQš]Iivx”G¬œ—¬”°¬˜ĬØ Lrr‚Ù«®ºjk(i†ވÔû’Z¤©ò8ȆTJY)ãY†M’ê>`Ї‘º’ÅAà¨¾‰—÷µÀmàù¶ò²,¦CéIANœCvN:™oχG.„äÎþÇꑊ3Rÿnå`RY–”–ba¥Å¤%W·äÎÄÅL1d2Ã)ÈMžA9ŒÊ'Îj’Ò5^^ÑÐù½%``MBÛ$Á$#Ñ|¤4ӓA²ÌVóV‰T15H-³Z42É=‘ÉE™,1'‚ E†E'æ$#ÕQÈhd Ëg,2YŸ%µ²12Òڔµ¶²KokÜ붬ÄíY“;°:wdîŒ£Â²Ý•¼;Ky*‹z–÷ž,ôiž–üޞÿÞ@åT¾,e?_&´_ ªÚ?UíÏ]°$DU$DU$E(¤Èû¥¹)–fÖd…Vä1Нhÿ*1ÍþÕ\\ƒÔ‰¯ö­—ìÓ âÙ»Q²W³dZ‹%Íô{´I¦¶YHÿv×}Ê.@ÑNúø;ôÛvèÐ/ß®Cße›}¿IíúÎ[¶ë6o£Iz«žwB‹Æ`|³Æeƒ& ØzšŠu4[k×kVתÕįQ£•³z5xTÅl•\S›²¢–!AÌ +i1ÍÀ”gù”ˆ§=)jM¬²Ê*Í!7²!õw"5¾¤©ôé…äé‡s€RÉxV©Ý‹‘:Ól}ñ(èGŠ@¢=Þ+e+Éo¦Ëºt¯Î;ŠAQŒŒ\rÍá‘kK³Åj¶“‘ÊÁ¤²|o Tj.-Å2q¶Æó˜2¹2¦‚܃''Îc@U–˜x=DcåÄï-ë$dØ‘h’H +I3=$‹ä˜² +¤©fkžÈdQ&KÌIڐd2Œ¬ˆX˕£V–’‘ˆ]/·2ƒŒEÆñ/ÖG6DƳ& ›°®6c…mÁZÛ™ÄÒۆE¸-Ëq{ò¬ÎɬӝX±;³vwñ´Š§x¢ª]=-ê]}-ïÝ|¨Êגß=ÐâŸÈ ¦†„©2=²”=’²™=R2¡=Ò2«=2²·=²¢ª=r´µ®ÉL­¢EQ5ñí4~Ðj·zÉ® ðkDš%»´Hvj•ìØJۄ6ýðíð‘¢m;ôy[E[uèmÙA;Ï}—MÛõÕ&¶ëënܦo¿Q›žhƒV=åz-zòu›5$ë4q­q£æwÍzmm£ê´#®V+ÀXµ†Ûת¹¡¶R˜2´<ʁGY1ÍÀ̈#–O vÚSžÖä°aړ+­´RcBÒ:´© ¸‘-à6A_RáëçrÐRÖÓ?Ë@Ki@)åYG/Rg¥vWROFê…G~<ê"£Î0iŒ}JÝԗD~h›þá$æwC6'í ¨ ¹è‘ã|!¤XÍöÒa¤r0©,Z²åX-0G¦79xråędŒªÊÒG48^!ñ{ˆ6薰[L@²[RHÉ Y¤2uE™,'W4òQMˆ–kãWv Ëó%"+àw‡ CñÅâëå$«â©G"«#k £‘1È:ȺüÜzÈú|À†Èx>t¿c"²)¿w3¾Ë,®-Yk[±ê&±·f9nãianëi‰nçT>@åkïà˅OL´¨w µ¼wL«JhÉï˜Ôâ·Ë=vLË vÌÈ4vÌrZŽ[?*¨¦ª’M®–EM®‘ìP'Û¾žõÊ«©±Þ¶I²M³dëɤV®€iÓÏmÑ®±9‘¢ÍÚõQ›tEúEwè÷nÔ®¯±A;7îµé›ŽkÓ·ÛÊÅÅ-zʵšõÐk6i4F5j£_­AD1¢^¨1¼Ž®Ù5Z«¦ì¨JÀ2¸Rè2¨Bx4 '¦éÈ +qÚ2"žÖ´Ø§9%jL®¸âŠ ‰!C†Ô!µ¡¤:T!•7²ùú¹,´”–Òžh)-¥¥$ ””ÑA6ýÞ *Eri6ÇH1<y@‘׃Œò…6Šïìùä‡7ÓeNòùXGANœ“vŽ;•ŠG®‘d©ŒÔÿ„[”ʲ¤´T< ·˜´äLŹÉÁS>‚râL²¸8#þ©IßÑð +‰ß[‚Þ"‰nI"©nI#$†LUxQ+cªÁ½Öâ|í°\;S›W Z+ÒÎ&·<{Þv¿AÈ`6ÃÙ‡"Ã"¬‚¬ŠŒDVGF!k"k!cøáuuù€qÈú|ÞȆüŽñü¶ù½øùB›ðÕ6õôM7óô7G¶ð¡*ªòµê¶ ´· +´0· +µN·âž³I -àII-åI)-êIi-ïI­öIY­ûI9YÀV²…­*‘j™Æ–52’-k%[ÔÉf6o@¨±Þ¬I²i³d“ÊØ[%Z-Hd<¤»a»>Ï h½v ¨[‰Ûõ ÖnÓ·Ó¦/9º•\‹fT‹pµf=ïˆ&ÆðFñÆÊõ•êhyTË¡µʎª);ª$pT1|øðŽœÀ¦-+ÎiɈxšÓ ÆÔàÁƒR+¬°B]RR›4hPu(©B*ý· +$çëç²¾þEÆ2¥=}JÊ-%¥a%ëßÙÕÎùÛA6«Ôv¥H–fsŒÔ=ò +ÁÄò=ù6úØöžo£ÿ‰K©N5拝“vŽÛA‘#£Xr­<*3RY–]PZLZ*™òq“NŒ›<9qc©RřsY¼Bâ÷– [ÂnIàM’HOdrQ&KÌY-“¤Š}«ó°œ6´Zö·zvºö¼Fv?»&¥…±ÐAäòÈ@öËA$_³}®ˆ %â0 YŽŒ@F"«#£5ùáÑÈ>`md>o,Ÿ<Yß¶>¿w¾Áž¨jCO_h# òM *_ßyã@ß~÷¾Nàv³ !±ª„ubR=1¥1˜H÷ê‰ ÓÄ,’ÓқP¡;îDª(®ªÑB߸V2¾Në~|½d£Ɇ’ š$ë7[ÒL2®U?·.2–HÑ:mú”1@ÑZmúøÑmú•k´éŒjÕZ­Ußod‹¾îªÍzŽáÍz¬•›ô¼+52j ‘!õç¯ ª« ¨µtT‘W«$pTå„8MYOcFìSŸ +Õ¥X“0`@uBR…T†’ +$èo³HÆ׿HCK)h)éq)3´” ¬JaÔ7^¿<è%¿(Y¥¶åÚ +2’ãX%L,é“oóíñ±þ')ýw¥1_ã!E12*ˆG%„Je¤Š’Ê T–¿-Åê–ò˜ +"S,ÔT0Þ#('΋KŒ´Ê/.òz&~o "‘‹4ɏLFK–“ÓF•fËê¬üÖ^–cWëì/ ]¼Ší®†@O-[`›a=Ûb#c—ñ6³_¶]hcûì +³<»é@d™šÁȶ١ÈJÈ0dd82ÉÏ­†üöÎ:ªdkÛé¸ I 8„àîNp×@° wÜÝÝÝÝÝÝep†½wæþßÕï]çôé>œîÛM:$ÌݵÖ÷®oÝ!“~OÕ~jWÕ®âø³%PJâç•B‰À/¿¨4þÊ2:²xÓ}9}1@ú!«ø#º`ä̌14a'7²dÁ¸J7ÎgÃ0›o]ȁ’ %7Æß<(yQBQò£„á-€R¥þla”"øQEñC‹¡ÇßQ¯$# ×Á/Ç«\K⥮$¥ðþ²Rx“Y„ ×ÝáOðˆ)……‰JyÁŸ_ÊB~I_:s– ž¡¸ +³,ÅqcVü×"¸|V8˜x>  ŠòÃ/ + †ß›/ž%oXåÚ¾ƒÂ~ …2¡àë‚ HpOQX H~\> $‚ȋP”¡(wBQ üʜð92Ãeό²°¤?üY2ÁßìoàQ /àQfÀ#o\RóÂđ'&Ž<ŒÜ{¼Ý€¼\ƒƒƒ=]‚‚‚<œAܝݜPA\ásqqv€çl?ádà„´ä¨ƒuÔÁÇ;`ZÉÓJö˜V² D—7Óí„ð¤: Púo—¦ªÉä‰*Õî-ر”þ7Ī‘UkhVÞªœ‘ɽGZxd2…ÄŒÄò'¡%óȤâ&“ð¤"(•¨ºäÿ®hW&Å”$dÒâ&…–hM‚’½”ô äˆaÌUcrBFrFFr5¿\1…ä&n–ƒhä+bž˜=òÂðé-îK…@ï‹qÕ#l&¤„;<nhA8È.oÞ¼Á(Yì 0gE AɆ’%‡^r¢äÂœ%~I^ü¼|$ÔC1B’WòcE ’0¬©æOæˆ +'ª0¬Âæ @æB˜+ŠU–# +ó óɏgðó{£ø„ú¢øÁw/n""ñɃ{ŠràÊ.Ÿ‰$Qf…‡à“³!…dÆkCà ²À³ûÃóùÃ3f‚§ÏìQ€/ü©þ>¸Û;gΜ~Þ@2¾^¸¤æ‰dädäŽdäìãé +(äá’9sfw瀀7W'Ggø¯Îðïœìá'œìág‘–‘–t^:øEö˜V²Ç´’½<• •.¬%P¢Û ePúävyåÚ U2IÉ#i1’jó°É%!“|`U·JÿQàˊÉQY5z« H•82G0’*<1#±d Z2¹g™,à&-xR”JT]òMLU–B¥I‚’ã‡IZÒÐmúP’ËQiºuë:ŠjLµ°€e5œ0/ ]“!Ѓ¡ †EW ®˜SpÃ’;.†y` õÀhê‰xä…däaÖqÆéÆaÇÏã¾ƒ˜`Á?3J Jk’`”,(YQBð¿’dCɎ?K’?Š$'†w’\˜Ʌ>·= <,”‹åqĬ• `@gxæ(¾¸¬HâG‹f¸§(ÖÀÎDI"}¦(–{D(òÏ¿ÍÉ(’‘’‘¯/’‘~CÞ¸ Û·a{áf#Ä#O$#$#w€w7$#W$#???g___g'Yœeqt€ÿ*Ä~ÂÁ>ÀiÉ^Ìe¯ƒ·´¿\‡i%ú¦Cuh¨ñW%@?é¶z%ºuUJ´ôfòžyU…g“‡ÐUG­´¶Í˜Çë»_úi,æi“PdžŒTxô™ËlÌH,éIKŸ‰Læ¹É$/éê +ºÉ‚ê5¸ #¹`HuÅàê†ù7Ä#wÄ#wÄ#dODOÄ/;ˆÎÞv§I|ì|õâgQ<“^ü…ÀÐKfü1’@!ðyòƒtHUBªìIà— Á_B1u…gæ…8;Ã3» ¸)»‘ÀìLäâ‰ ‡^´©ÅŇ6¡àv¢½ø‹$‘ž‡ü°ž‘/ˆ/’‘’‘’‘·<‘‘7~C^ðwxxâf#OøSÝ=ŒÜ‘ŒÜŒÜŒ\€\\H|||œ½½½@œHAIà¿:ØÃ?v°‡ŸµGZ²×Á‡ÚëdZÒá¦ÓÁèÐ2š§CԕÒJà¯f í0wh‡ëovø2H D×ÔÒ-mt+‰j’VFÉP2yÝäó°“þ=>å3Ç]­!\5Ô[@F©I!1#±dpZÒB&K¹I ž´Ä$Pý™%5thÁ^0-™%;J”L"P‚@¥Ã%UúF¢ S¤«ä ÈI÷ðBàsÀ\tÝUAWW#Qa';ªE1Ô £©3ÆUgLE¸à²˜ â‘+f{\ÜÜiܑs<}<ì X{ + ðQÜ[/>zñՋþ;’LBàHüu$HU(:¤*{ø½Bp#³<&Ä ž/Ðàaú@â«#Aª¿È×Ñ +Wœ„à¾f!xLˆ`Šgx\?xz_W@_7wT‡_ŽNÐür¥•Ð-úf‡i%;L+Ù¡µvh²AZIYSÒJ´þFi%ó•”Íܖ^®ª%-F²jé3éá«ëi“ã½Éa=1#±d I 2™ç&óðdXßu¿Z±Š , %KAI©ó©TE§É3­”jPJÿ±‰………%ãÈg‚’ùd’jÁͪÃmPmÜÖª@±Œ¢Å7U2IkgÅK“ ¤•QR@É$-)¢Šñ`”J”l¡h2UÒ{kÅÎbÑӒÎj1MFZy$-F"Ë̃’jýM뜒VR +,™\„³jƒ·Éãp–.ÂY°þf(¥ÿˆÄÂÂ’ÁÄ6 dé‚[j·imJ2¹àf2™¤s3¹êf”L¦•T¹%E”P®O6yõ©ÖÕboµ˜þ<*ydV4ÿ@՗¨‘‚G*FÒZu#­%¥¶’ù´’õ‹p‡3¿g2­Ä ÄÂÂ’&b(i­º™O&Y°àfÕÆm“•’T'ܔd’ÖÎ$Õª›ÉŒ’j3·yZÒB&Uª)cˆÎ¼PmëÏ >ޔXü'¨¾X´òHªd’rêØ<(©ÖßLîVRÒJªE8­*K©Ù²dô3 ‹õ’êd’yP2¹àfUÅm“ n&“I&WÝ´@IÙ£¤læVÒJZ´¤B&7i”–hëÅüï0%º//Ÿù¤jR%ŽÌ㑒LR‰hXÙ£d()‡à´ÒJÖ/Â)´dé"\š¤•ÒbaaaÉ°b=(YŸL2Â͂JIZ n©%eéMÙÌ­•VRђ +™´¸I%J(ÿjD—ZI›GÓúv•ïÞ$©òH +#)É$beÕқyP²*­ô™uRVbPbaaa±¤(¥:™d”̯ºi’j’VZI¡%e˒ +™´¸I… ´DÙÓAÌ?Ÿ­%RE +©ðH‹‘”oÄHÊ©7e’()7ÁYJ¶ÙÛm”L¦•”XXXXR#–nO²t wªw&Yºêf”´2JÊfnUZÉ<-©Iá&žT¥%€³Ø@L~ϊ*2ÒÂ#U‰ÜW%“T›¹­Ê(YºþfÕn%­CpŸ¹þÆ ÄÂÂÂb•¤ú¬›¥«nÖs³”TKoÊ©7UZÉ$-QäTÉ$7)¢„c-–bI#ÑúÚS·È<óx¤ä‘TŒDt­œzSíQÒ%ó•>ó–ë×߬ߨ”þã KF”4ޞd¾€Öª›Öö$-PÒZzSö(i­¿™¤%ŠZȤp“<)¥%D³¤¥h}÷*{È2…ŒLâ‘j­Í$#)«nªÍܖf”,¨ ¬¿™¬&•Ò0baaaɈòÅ@ÉÒíId”T{””ÍÜZi%…–T¹%ŠƒZȤâ&žT¥Â(-Qâ4‹MÅä7®²GñM‹Œ”ì‘Ñ«b’‘”d’êԛj’m@IµQ‰wt³°°°|1Épû¸M‚’j3·Öú›rôM¡%Un‰bž*ÁD±QÅM +>stream +bPbaaaIc± (iђ +”´Öß´¶ukђ*·¤ì[2L*nRÁ“Š T¥°”–(q•%£ŠIóT&+(¤ðEªœ‘I2RRHZkm +#©ÜT[¸UÉ$­U7­ ߸Ž KKj*s§&­¤µgž–´L*dRq“<)¥Â(…¥´D‰¡,_˜tU徊‡(²€ŒT)$…‘”ÛæI묛UÉ$®ÌÍÂÂ’&ò%6*©ÒJ&Á©hIÙ·d™TÜdžQ0Ja)•¨Ðʼ(–%]Ä*·´ìV½*R Hµ®¦EFª’ɵ6#i-¸i%“xՍ………åËJª×ßlCKª}K “7iÁ“Š ŒR‰MŠ +·X2´X`¨ +€Tù!-R È<i¥Ò„‘R½êÆ ÄÂÂÂb^RJZi%[Ӓ2©¸I•oRàI%´©XJ%JXdùs‹ÉW@õª¨^$å Sh]‹Œ,Å#­µ6óŒdA2‰A‰………Å֒&i%ëiÉ$2©²L +7iÁ“Š T9(U6ʼ¨¢$ËW,Ø­ -RxH ŠTd¤…GŸÉH©Þ™ÄŒÄÂÂ’±aZÉ*Z²™Lr“ +žT¥Â(- úLQEN– #©¶Vë}Q½R +iA‘BFªì‘I<²ž‘8™ÄÂÂÂòeEkMcZÒJ0©I‹›´àI%P©XJ%*´úLÑ +Ÿ,é'¶qUÅ>*Q½aª÷O•3R‘‘y<²t­Í†ŒÄ ÄÂÂÂb•XJ©¡%óȤÅMÀ“F©DÕ¬U”dÉВj»Uì£Õ[§¼“Zdd)ن‘8™ÄÂÂ’&b}ZÉ<-™Üå­J0i!“InRÁ“Š ´XʤhAËÿ²XðÒh½k*҂"-2ÒÂ#Õ2[Ú1ƒ ËgJÚђyd2ÉM&áÉ$F™§ªT‹ÉPɒaÄ֞«ØG%Zï¤òÆZJFæñˆ‰………%ƒˆ¥ d=-Y€L&¹I žTe^´b ‹…bÁ¦õvª^`åͶ +>“‘”XXXXÒNlCKÖ#“7©àÉ$Fi‰VðbaI…˜á´ÞS©ÈÈzO>óí4ÿÊ[JFÌH,,,,S̏ʩA&KáÉùÌÆÂbر@,è©Á#f$–t i É*xJc´baI[ìI Y…GÌH,,,,I,¸­â¦4a)–t’Ô¼÷ŒG,,,,± +™lO,,:±¾ ¥ßgaaaa±J>™£Xþìbî‘þýœ…………Å6bÃàÀÂò?+éߓYXXXX¾„¤Äaaù$ýû* K–ôT,,i!éß·XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,nܸqãƍ7nܸqãƍ7nÔtú–ÞOÂÍM§ÑÒû™¸¥¦i9ʾ~ÕM±Ð^nlë×Ý>1ôgÓû ¹YÙԎ:PSùšÞÉͪfh©ƒª±­_gS,EšÞWvõ«jzO%G šä+»ú•5ÙSa)élЄ¯ÂVvõ«iJ7%KÁHƒF¾’­rgMïçåöߛa7EK]\\]]ݤÿ/úŠ¶*5½Ÿ˜ÛkzOKÝÜܱy ±z[ÙÕ¯¢IñTò,EG=<<åæÖJ¶²«_K3ðº)Z +†zyyËÍË }uÃA:+»ú54µ§d©·¯¯¯ŸŸ¨7؊½•]ýZš> ê=KÁÏLþ¢eÊäç+luC°ìjz?87“MßQ1ž‚§ÂÒLþ™3g„–9s€¿ÞVÅU ¾à)vS´ü +Î-88(|E[±³²«_AS:ªÔO}|¡—‚£Y²†„dƒ’5KpPæè­Þ^bfW3xÓð4 sPp֐lÙs䤖#{¶¬`«&ÉU™–ØÔŒÚ Mu÷€±7tÓ,!Ùrä̕;O^hyrç_C²dòõñ¢ç« K¶Iè+Tò48+Xš;O¾ÐüùÃÂòç͗7O®ÙB²@gõ3r•àŒÙ :* ¾~þäi®<ùò‡(X¨PáB… + Ͷ*®rXÍØM˜ +è‹_ÿÌAY³å̝74¬`á"E‹/^¬XÑ"… †…æ͝3[V-WÓû/àöI“L¥ˆ +5S@P–l9rçÍ_ pÑb%ÂK–*Uªdx‰âEÁÖ|yrfÏ,\•˜ÃjÆlŠ©Qýü3‡äȕ7ÁÂÅJ”Œ(]¦,´2¥K•,Q´püys Wa¾ŠÌa5ƒ6}H¥Ñ;* ¾ài‘báeʕ¯P±R¥Šʗ+^¼HAÙU_oOK<gÈf4úbD…Žš;´@að´lùŠ•«T­V­ZÕ*•*–+SªDÑBaùÀՠ̙ØÕ Ý F_w}³d˕7¬zZ¡rÕê5kÕª]«VÍêU+W(^Lræ«zXâ8ã5Ð*F_ì¨EJ€§UªÕ¬]·^ddd½ºujÕ¨Z©|é’Å +K®J°Äa5C6½©R}3Áè µP±’e*T®^«ndƒ†7nÔ°AdZÕ+W(S²xá°¼¹²e Xâ8c64ÕA2B*Ž¾ù°£–«T­VÝúš4mÖ¼yófM7¨W»F• +eK¡«9ÑU«·)¦'f͞;´`Qè¨Uk‚§M›·lݺMëÖ-›7mT¿nͪ˖,V(žœ!Á–8¬fÈ&›Jðëç!5OþBÅK•«T½vd£¦-Z·mß¡C‡öíÚ´jÞ¤A½Z²«9B–(¬rº06cS‚Brä +\"¢|•šu6mѦ]T§hh¢Ú·iÙ´ºZ¦dт¡¹,qX͘íSsæ +£o­ÈÆÍ[·ïÝ¥[·îݺv‰ŽjתY£Ht5¼h@`)¬r86 S €©«×iдeÛ¨è®1±qññq1ݺtjߺycpµBéð"–(¬òl5#6eJ£˜Z´dÙJ5ê6lÖº=xŸØ³gbB|l·èm$WK #,qX͐̈́©•kÔkÔ¼mT—˜øÄ^½ûôéÔ+!®{ç¨6-׫Y¥|Dq„%«µ$ L-W¹f½Æ-Ûuê—ЫO¿þú÷ïÛ»g˜.Qm›7ªW£r¹RÅ–8¬fÐf˜Q‚yjPVÙÔÈ&-ÛGwïÙ§ÿÀAƒØ¿oRBl—Žmš7ª[£RْKÙ²ðl5c6ÃÜ/&rýÂ𠦶êÐ9&!©ßÀÁC‡ 6tÈÀ~½c»FµiÞ°Nu@à"ª°Ê®f &á¯bj˜ÒH¦v‰Mì3`ð°#““GŽ6x@ŸÄ¸.Q­›5¨] a‰Ãj†mòø s/ŸL™³dϝ¿px™J5ÈÔ¸ž}1jô˜”1£“‡اg,¸Ú´~­ªK˜ƒÄ}œÎ`Í}ü2gËZ¨˜Z¯1šÚ«ß aÉcƎ?~\Êè‘CöW;´jY³ +Â…U«®©æ4ÁÙr…*^ºbõº[’©ƒGŒ;~â¤I'Œ“cÆôiS&Ž5|PŸ„îÚW«€9«²’§DJ€¿Uj5hÞ.:LM;qÊô™³fϞ9cê¤q£‡ì“Эc›fõkU)/…Õ@«­iU ¥šõ›µéÓ³˜:iêÌÙsç͛;{æ´ÉèjïÝ¢Z,UÆ„fø¿ýBƒö…þÊÿµf<þRP-Q±z½&­;vO$S§Íš;Á‚óçΚ>yüèa’â»t X*n]Xՙh_ôïýŸhÆ3UÌ)aP­V·q«¨n }ÑÔé³ç-\´xñ¢…óç̘<~Ô°½â:·oÑÂjiðú_`SŽ²¯iÐT3UTËURêеGŸÁ#ÇNž1gþ¢%˖-[²hÁœSƍÚ¿gltÛæ jW•Ãª¼¶jr^c`Ÿvqh¶Õ¶Æ_iRƒ 5rPmÞ®s|ïAdê‚%ËV¬\¹bْ…sgN—<¤_b÷NmšÖ¯Y¹œ©°ªSý ?¹êw6¼ûAšÔäÌ 3Պ5"›¶‰ŽM8"eҌ¹ —®XµzõêU+–.œ;cò¸‘ƒ£Z51«¦æ5*K5ŠCsyh›7£ñ'5y¤ Ú1¦gÿácÀÔEËV®^»nÝÚÕ+—-WǎÔ;¾k‡–êRXU¯­uU#G%+ JCsÕï4j†kª8©Áœ~Yª-;tKì7tÌÄé`ꪵë7lØ°~í*tuRÊðIqÛ5o¨«¸eI5ëìŒ-5,ø-U†6¬úͮڴ}:©)Tœ‚jû.=ú5L]¾zÝÆM›7oÚ°nõòEs§O3¬ϘNmšÕWf«b'°aáÃq×Á°à·¾4´¾:4Wý¶uÓ%•hRS,¢BõzMÛFÇõœ<~ڜEË׬ߴe붭[6­WçLŸ0z(ÀRÇÖV¥µUƒy¡«–J~Ԇ–ª~³«¶oFI¥ÌÁ8©)Y¾jÝÆ­;Åö8rÜT4uÃæmÛwìؾu3¸ºpδñɃûôÀ°*’ÀrXUæ5öƯRïÛÕ ¹ˆêÐN\ËÝöÍhü•&5T£º÷0bì”Ù —¯Ù¸eûÎ]»wíܶyÃêe gO°„aµAí*åJ-vÎk ¯·1,-ªC+Å¡¹èwÚ4aRILjŠ—¦ Ú5¡ß°”ɳÐÔ­;vïÙ»wÏ®í[ÀÕ³&> W¬˜­– /"Ík ×k>µT‡öÐ׆Ær³n¶²«¶lZ“ +ªãû =iæ0uÛÎ=ûöïß¿w÷puéü™“Æ ðڪq½êK—Àt¡ñžQå>ª9ë*Ê}{é«C{yQÑo7¹:4»jÛf0þʓš’å(¨)š8cÁ²5›¶íÚ{àà¡C÷ïWW-™7}¨!}!¬¶hTÇ`^#mƒp’'¡J wrÔ[‡¦æãÆzRaWÅU6ÕVM?þ*“še*cPé50yÂôù`êöÝû>räÈ¡{wnY¿rñ\€% +«ÍÔªR¶$íUK"JÊ#¯¾Ü7ֆΔI”†Îä'Uöàšßiь“JbR#‚j·Ä#ÆM›·tõÆí{ö>zìø±£‡ÑÕu+͞2vĀ^1Z7‰ó£ØIÎ2ÈUù½DµïQ$À 8´«lª­šœÔ§Óú Ù´]—ý†:w šzàȱ'Ož8~äàÞ›×._8 ÃjB·(1¯1€…«RžA®à.ª}gÿ ¢ÚÐh«ÞU®MjÓfT}• Ú¤M4Ò˜É³¯S9~êôéÓ§NW7­Y6ÆÄQƒûÄwyM­*Òz¾r æœ%@—ª}cihQ:$$+ֆ[¥’ß\ÅÒÖÍpR#U˜©6jÕ16iðèI³­Ü¦=qú,´ÓàêžíW/°:r`ÎkT°‡˜¨H€$ª}ƒ¥Y¨4t©4töl!RÉor•»ªÍÛ'A•fª Ztè¤4q敶í9xìä™sç/œ?wæ$¸ºmÃÊų§¤ ïŸØ=ªUãº0UnÁ´Þ-†…¡¡›beè¬Ù²cehQ:Oî\9ÑVè¬àª—§qWMï¯ãÏÑÄø‹+åú Q¡Fd³ö]Œ?cÁŠõhꩳ.^ºtñ<¸z`÷Öu+Μ4zHŸ]ڋ8‡€=)_ä&GSÿÌh)V†ÎjX:§\ñÛ[U:½¿Ž?G“Æ_ƒ™j‘’å«ÕkÚHiø¸ió—¯Û +¦ž>wñò•+—/]8sòÈþ›×.›?æ5I±ÑÆ°±»H6ø(žó†æ+ˆ•¡©4tþм¹såÈF…I¥!›w™Ú´)AUÌTs…/[µNãÖÑñ}‡¦L»tí–ݏŸ>éʵk×®^¾pæÄá};6­^2gêX€‘€õ)$ZO15õóGO³‹ÂЅŠ-V¬xñâXºPüXð;›fÁïôþ>þMTq£(¦€”z3eΒ5hê™ —¯]¿qãú5tõÐÞíV.š%`$`)‚uFaú‰ A1ô†äȕk}˅¡õ•¡C©Œ; À¼ËßöM?Sé_)ýРET÷^ƒFMš½xõæ]hê•ë7oݺu\=}ü „Õåó§OÀ¸Së&˜ƒ}|¼é&ª¬ß.Õú.^*¢ŒT:¢dxñ"…ÀU£zßTmÚTé_‘~¨Ù¼}·ž€¿³­Ú´óÀ±3¯Þ¸uûΝÛ7¯]>ú聝›×Hp·-Ö®ZNª€D‹÷ÿe’†Þ<ù +-^2¢LYª -†.YKç΁ÿÞ`üeSm֌ҿAzRj×%¡ÿˆñ3®Ü(L½yûî½{wçNÙðB€{ÇunÛ,RÞŒI…L˜A‚¡7; ½XºT™r*QYèjÕªV®T¡lé’r¹ï OªG¤÷×ñ'iªô’å”:#þN_°bÎý`굛wîÝpÿޝ[×.=qhÏÖuHÀ#ô„É*²RnWƒ2`R0‹(É_¤xÉÒå*Je¡kצºÐˁ«… Ð?7¬áΦڮU$%‘Sj×wØX˜ÓlØN¦Þº{ÿᣇïC_½xæ؁›V/ž3yÌоÈJb½«Ü…d -}H=&ìÛ± {lϞ>9l„ æL¦‘«°Éƒ¨’MúM†ú›˜ñøÃé 8-té*g§®xëTkûVv-[´€¯Þ̌?‰­mx^p*¨]«Fµ*•Á“•,^¤Pþ¼¹r¨¨& T+ƒWÓè”Xn¦ÅJR\hÖoظ ^hGüZ·nƒÑ¢]»öí;Lyd:÷F–nîýñÎ÷° @‹3qÊô9 —®\+1•Œï»Ÿ”éSŒ4X”Àüyú؁][ׯ^¶xþœ™Ó§L™>mÆìyÀtÝfJÈWh ’M¦ÿ ¡úQX%©÷ݺ‹çRCÃ!½ÜûöîÙ½kgǎÚ·k׿|óü&öð¸ØáU‘M5¬_§Vª6˕.Q¬p|¹s"Õ̙ôÓjRALé5¦œb ´, ­ Í&M›·l%Æ"ðsìÑ¢ D×®x?Œγ82&Öó|ºÒV!ÃÀàŒ7qÊ´Yó#–­$ØwãâUÉø~ ïŠ#í÷ßå•æcêzâÐÞ›×­Z¶xÁÜÙ3g̘1söÜ‹—Si ã@}ÏÄ/¿!Ó?‘ªn¨ÒS½w֒Õ7zx€ß@/×¾½{õìѽ[·®ðÅ;›/ð÷èä ÞØ6¾¸‡ù77WW|^œ{9uïÉ»]s[¬wT._†¨æPŽ½% TÝ@¥É—^y)HL«×nФ¹]›Ž]{ôì킧Iˆß@¬ÙAøA ¾öT³E8Ɣ)“ñy?.tLðˆÀ¡~>žn.=»vlk‡T+—+U¬P¾$ª:¨Ò@Å÷ ËVÂ㜭Úu½¿€áÁ!ã&L‚ÁHü`f; )Ă .B–Ò¸D–ˆrÓ¦Í[¶nÛ¶}ÐØ»ÿàá£ÇéÅË×ðU~<éðîÃÏ:¦+êx(ûÞíëW¢ÏŸ9yìÈ¡ƒöC8tøè‰S0Ò¯áKÆb‰ ³·îÄGP^Æ ¦p¤zöäу8‡o\µjÅòÈ%‹#-\¸¿ø<óüsçÌÆçeÚÔ)a¼ƒƒ†úy÷ïçÜͱ]Óµ«U* °ª“æRtiöM'.‘Ú‘U­ÕÀÖ˜övÃ+ò‚CÆO -Ÿ>s¬+ÄĺoŸ\±‡%²”anÞº•PîÞ½gïÞ}ûwFû¾Ý;¶anŽZ³zÕÊ˗/Çoi¾€ßc =/óaM==‘êÍkW¢/œ?{æôéS§OŸ9{^»‰³72¥å4ùþóQÕMÀb´?Œ¹sóÚ¥ gO?zèÀÞÝ;wlÛºyÓÆ Ö¯_‡Wrš/àçX³f5]‰>fDÀ /WçnÛ´h\&à’b¨J¯h%v‹ƒÙ÷Çì¹óQßÀÚ ›·vèæ L‡ã5Âs.Ž\±*j-Å-[¶BlÃؾ}ûŽ;Ÿܷ_ŒKT€ï)8sæì¹óÀâÒel Héå -±ª0•‘ü‰³'!y‹ïš>Œ¹{ëƵ+—£/^¼páÂŋô!·ÄcA¡›|ÿùGùí¸1Tñ¦¢[×Åp?~ôðÁýûö`zÞ±¾ô6³þ[·àu7¬_»fՊHðÚ3Â'†ŽDª½ºâYšÚU+âP͕Þ¦L‚ù×Jº„‚.ÕÃû -Š”,g#½DÚÏËû+L›º¨õ·lݾc F{÷aP²Ãa‰,Ò°„qyöܹóˆ!:ú¸z€Þº}›t<a -S/mÌ0HÄZU¢úäÑý{wnß¼qíêÕ+W®\½v]<žH…d•O0ü|³ññƒ˜;ˆõâù³§O8~ôÈáCÀ½ÏŒ?ÆÞ=ø¼ìؾuóÆõQXڜ=- ·‡<ûõìÜήI½b¨æHªkÑ­”+MñZ§¼…ð¶˜:Øc®ž»‹7ÎF®ŒÚ€7äícñÈLrÇaTâ°<%†%°$’ˆòÚõë7ç­ÛwîދÁþHOŸ¿x<èPÑÓô'` úßöø ¸ÞºuSþ@J…šé!ª¿‰R3¶¸ƒãý’˜ÇOÆ+fžám¨¯ßЛLxÌAÍTœ}!$Þ½}ý -_A~òø~|Êk¦úC]÷ øâÁ@ªx6†üև÷cyãú51—_6gào ÏËùsx/Αƒ{wnÝ°f9vÉèçÙ·‡cëf è²ûú÷}&¦S’}’|O­tW—]{¨ôfðìEÀtÛîGŽŸ:{܊†#Æ­[8(iTJ,‘äc¼äéSìàðüù‹/( RDúIBªbª?Îh»+b}‰ï–S<Ï|ÈϪ¡þßÿƦúÇÀG¼yýò>4àïÞ½sçömüÊ7Íðk\¿~ §HÞ§°Þ±m#Þá>.x¨¾¢Õ¸N5]‹‚$Hª:¨º{jñ¦Ä¦ö{H±¥ù6¼Í/ ËC!ÅýûºQ‰,‘$‚Ä8¯^½zýpâËûï?Ð9P<¹"•ÿ6ò_%­"U|‹°¾}óú•òsñI5Ôÿ«þŒ?c?҈_¾nŒY H44àìÌIÜ4Ü°_˜ òótéî`o[¯F%ùbô$¸íÞJ¹|˜R*z_º¨§›ÏÐàñØçh=Þ=pê¬ûo¢‡½/O«"ž¨%’Dï ÞãK2xþþÓgÒXÃԐªëÇïß¿{÷ö­ø,å¹ÀX-¦JjÖÿˆwødXòOŸâ×}lÞ Žÿb* ¥õ9Ü -¦«!§Žö÷víÙI¼"[¢pþ$ºÅU6¿ä“¤ Øê4nÙ¾ko¼°€zâì:pô–\EßÖ'às/Ä˜Ô JA’@"J„ù3¾ÿŒ¯»QÃéÿþ÷?="‰]8:]øéÓÏ?üøáƒø0ù¹øë¹øßÿ´?C|ÄGiÈã{ê/ÌÏE`§ ˜ -ÜÇ:RÝ¿½Íè+^‘­]µ|©"ÔËï[N›PŸ$_éÐÝÅkðlŋï­ÁnØ9ð±°<†#…4$” -H|¿ð3Òžx^Oçêê˜þ/61X @ùüù“ô\èþ©÷ÿûŸò!†Ÿ!?اAÿÆÌA¿Å+1Ç?¦*V4žºÀÖ2s¦ŒN~Úé.ÑN’›Ñ ÌoμxYWzM[;:I÷:EŠ÷V¨ï#Zh¾¡©PŠò0Ò“2G -:ü‰‡¨ !¯Nÿ«D!" ´?ð(@ÁSÞÒ穞‹XaøŽy@+úïÍïDöÇ.$â.³ãøÎtäüi`þí׃š9a/SUÛË抅ß|…Š—­\³A³6x«Þ°1“fꮋÁí®§/^ ¯Båñ¨“2JGÁ㊻áF*Dä&qų£Êsñ»ás¡ùò`•°"×ßèÉø¬7ì6s|¹ûsá^°¸scÅ™a£©™ö2Õk{™DPÓT4¿Â'uq–î4¥kÂϊ¾ Xr¥÷Ó@Ý2’zEà $qºá/±%£ÉTŸˆ„¹"ý#ÎçBë3þž 1êՍ|³Æg‘»ßáVÂ×F6®Z<{r¨ÜÌ©¦ÞG‰ÝõÝpE“¿pÉrUj7ŸÔÇRêÔyK£ä×{éõ4\÷þE"¨ GJ}Œ:”N=¢ŠCÒ$¢CB`ÿcðiq?ZŸñ ìïb܋øÍÌñ«°ÚØˉH—Þ{;ܯï®íZè]ãšø—nèC¥MùªµÛuè¦M8½Þ+¿ö"e6õpTPrüKÁ)5‚T&"#ù[ˆÐ ž ­Ï½¯ú»¹ƒr·Ák{Göên'Ã^¦Iz5ºU,SqEÓÄΡ{ßþ£&ÎX¸bývl®€¯÷¾^{ùò»þXTÈ?Õu!îå%¥S™Èÿ‘™Hd >2îçÂë?«Žÿ$Nü!­­qÏï½ÌsæØ>½]è&•RIu“Š€*×p™J+šý¼‡âÝï+7ì8p\´¶y¥{I¢á€Œ…RÇÒ¨1*¬2XcF|>CÿKþiþ [÷E÷2»®A-]£Ü¤R inR‰–©¶ö\}ÆLš±j㮃'Ï_½%^F;ÛÒ9ÛØ50Æ¢'Q}$ÿÕúýŠ×gù®æé9ùîرx™]Ý Vë&•¤€Š¥Ò«×³µ‡e*¬h&Ï^¼zÓ®C'/Ы xtšÎü‹ç¿QŒR}$j²ñùcŸ‘hdé éev¥íÚìIc†ÉP oRID¨¥_jÓ֎=݆Lž³dõæ݇O]¼vç¾ -ªw"ó_FÑWóŒäë?ÇðÏø承u§Þ>}x‹b®]„”úñÓ¯_ôΏüÁx“4 ¬9>ü!a¥So0ÿb‡‚»×£OÞ³E\ƒPñzœŠ¥‹%%Ô´zP+U¯P{¹û†N™ ËTTL©ê¿ýZŒqsIø'$^ UõóÇwÔ#uéœ)¡¾î½ÄG¥ñÎ#QÑO2¨TÏ/S©Fý¦mjPh8BÝ{äLô»ž½~)õ÷?þŒ½ßefŠ‰‰F‡*Ì¿Ÿ~÷úÙ£»7¢ÏÙ+Ýy$ Ö—.²J‚mM¨Xúu$ nÝ{ôÌ¥÷=ýþgH©b ~k$7dªø‚Ào¿üüþõóG÷n\Âþà -Tq‘•|;YAÍ uløÜHãP“û§LA'Ô±x;Y2A•·SÔν<ê¼Èµõfl¨ÉýC¦¨ˆ õ&A]9/6T±÷–¼P÷= PëCe¦ê@ªzPÔ³G÷ÉP=ä{“**A½|3æñó7Ô¿jì ¨KPß<sórʄ:œ nÛwŒ¡þkhA=¶Oº7Tê·ÚP·¥t¨/jaõCµ„`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`0T †jÁP-0ªCµÀ`¨ Õƒ¡Z`|£PŸ3Ô8Âêó”u+C5!´¡nMaP{y -NP -¨¯ªñ0€úZ@=JPÃÇ òè•¡^ºyOúCõ/꽛—RÔN½Üe¨{ž¨ô¡2UU S}¨ê™£{e¨î½:% Ôô¿û>6Ô¹K£êØP™ªÿ õAZ:76Ôï¿Ë˜>¹ ú…Æ •©Êñß8¡†ù&'ÔÔêõ›¶V nÙ{äLô»ž½~÷ñóo¿ÿPeªfŠdçaŽ¦õßûüñÝëgîވ>sdïjë¦õ« ¨?&Ô4 -Ôҕª×PC§ÌYºf˞#§£¯ß}øì@ýõËb¨š•ª~|Cõã1Pÿøò+@}õìáÝëѧìÙ²féœ)¡j½ê•J+PÓ$ Ô̵@±ÒªcO·!Sæ,Y³yÏa êۏŸ~ýBó/RM<®‰H6q¾.ýÓìûå×OßJPïÙ¼fɜ)!Ýz:"Ԋ¥‹@¨™*Pµ¶ÖƒZ¡ÚÚ#Ôa!“g/^½y÷áS¯ÝyðôåÛŸ ©ÒP•°š5« ³ÅßÄfß_>}xûòéƒ;×.ž:¼{óêų'‡ C¨ö¶µ¨TkëDcªµZ][ûŽN®>ÃÆLš½xÕ¦]‡N^¸zûþ,þ~¦¡úç_ˆÕlambUÃ0Oüõן4P?cé÷ÉýÛW/œ<´kӪų'æãêÔÑÞ¶nµäš=w¢¥*ÔVúùŒž4+bÕƝOœ¿r KJï>Š¡JXÿ2/Y 5Xó#5?Ì¿‘ç_„T TðIÏÇܺrþÄÁWE̚4:À§ŸSÇVµB©¢rgO:¨ie¨EJU¨Z§I+‡ý¼‡Žš8sъ ;?wùæ½GT?ÀPýíwÕ,ñ—^5/V¤z$¤0Ç¿‘þþ ԐRÝ»yùÜñ;6¬X4s⨡Þýz8´jR§j…REd¨i“ -j–²çÎ_¤TùªuÛuèÞw€ð„é –¯Û¶ïè™èëw~òìù‹—¯^½¦x“àxûŸwHЊt-aÕ£š`¦4Léohg0ù}Dˆ`$,ÄOñêÕËϟ=yü0æÎÍ«ÑçNÀ@]¿2bö”±Ã{ºtë`×D®=üô}RA¥my¡ -öœRgwßacÂf,ˆŒÚ´sÿ‘“@õÆí»1=~òôÙ³gÏE¼H`¼| O<"8úßË\똁ª”Oe¦RÌ}ˆq -ˆ„ü¤ß~‘§O?zs÷ö `zòÈþ›¢"Ì3Ì×ݹ ø$0¿Ê25q7i +ú¸¦ûkS³$U'Woÿ‘ãÂçD¬\·uׁ£'Ï]¼|íæí;÷bî?xøðÄã„ƈ§Oágã%NëÄ°brý§`™jBª<õþ.?cX"‹§Oñ[$ì߁?ÆÇîÇÜ»sûæµËϝAÕ-TÁþ*^¦Rz¶­º»xú…„͘¿tõ†m»9qæ|ôå«×oÞº}çîÿ±÷`U]éÂÿu2™$–Ø6,)ґ¢é é½÷*(  Ò¥¨ˆŠ¢bÁ®Ø{ï½ÅkŒILf2-sÿsŸ{ÿßû®½÷)¨QñöqÏúÝç›;ßscK;Å0…uäÏ?ýFA(‰¬÷ïÝ»{?ɝù*0·nݼqýڕËϝ>qôàžöÍëW-]P=· '%&ÄÏÝÑÚÌP[]T'É]ªÄš¦gï¾aRUÕÒ3±°›ê‘ž7»lþ¢e`uÇîý‡Žž8uæ܅‹—._¹rå*píã¸~ýú7oÞºM‚Ä>yöµþLö­X«UQò%ó)8Å0}E*T0úðÁ}ˆ,ââÆ ø$ñ=p(`D._ºxáܙS'ŽÚ¿{8]¶h~Ùì¼ô„ˆ@ï©v&zZª0¥ì+*~帢—¿L¥4x˜ò8 #¨= T“³f–TÔ6.[µnãÖö=û9vüä©ÓgΞ=œÿ./Âäò•«ü·nß!U¬™^þˆûV$V¹iµ³R1Pÿ‡<çü8Žïž?}ü-N~$´®‚‹K/â§éüwÁÁ8{öÌéS';rpÿžö­×­ZÖX[Q23+Õj_#qÊÃsu’|‹_©J &U&ÿ˜ZB¨„Ç¥æ”VÔ.ZÚ²¦mÓ¶ö]{ö8tøÈѣǎGN|'OžW§¾ŒÆúõëÖ®m]½²eùÒÅ ëk*æΞ™“ž:Ý{ª½•¹‘®”ICõc²¯Üë$ѤJò¯(Tõ'Bv«Q ©Yy%s+ªk66-YÖ¼|ùŠ`凳JÄêÕ«[׬ŸGÛÆMÔwíÙè.™®Þ¸ VŸ½ n?&T¹ì+ -ÔW?~OœÞ¼vùüPz`ïîöí[7oÚÐ:Ö´¶®^-þtú½p8V,_Þ¼lISã†Úꊹ%yY© QàÔ ’ïD}É@Åì+ç)U2ÿ2¥„ªŠÆHÀ6h5$2.9='¿ xNYEUMm]… -jll\Ü)šK–,Yº~+ZV­^³®mӖí;A뱓g/â3>úñ՟ÙcnÿÓ©Ë;ÿ'q—êO/¿{úèÁ[×.?}üÈÁ½»vlÝ É²uÕÊ`cÙRøHÌgëė‚ÑX´há uµ5UesŠ òsғã"CЩ $ß *¨¤Lê’ìËIÅú—ªª#Ǩjêš«þAá1 )Ù3fÎ.™3¯¬¼²²ªºº†0¿SÔuuõ ðóh\¼dÙò–UXƒmßµ÷àQ°zõæ7÷AfB•Ë¿“ʝÅeõñû· NO?¼wûÖMmkW¯\±liSã"ÐQ__WŸ«_‡ŠêêªÊÊò²ysJfΜ‘‘’äOœšêhªŽ‰ -eÖ¾] U”™PÅXy¬š–®Zê铐œ–™›7³ °hvqIIiiéœg.˼yðÛ(¯€ÇüÚú‹š–._Ùº~ÓÖv´zîÒµ[w>†PýùÏ¢üû1RIöeŠ]A§ûvmß¼aíê˖@¶¬›_S]YQQ^VŸ‹ûˆøÍ`–`+V­ÝˆV:On=}Áœ]üH©Ük<FõêÅ3'ïßµ}Óú֖æ¦E µ5•åóæ–!…øéf}à7b†"/oƌܜ쬌´Ô¤„Ø舐@?owû)Ä©ú8eL¾8£ŠË¤.‘Ê…jï~+Á´ -V M&YÙ:Nõðö  -ˆŠ‰‹OLJNIIMMKKKÿ028233³²²ñ·‘7sfô²J¨¬a¼vÃ֝ûŸ8sñ*„ê’ÿ&ºæñR#§æxñìyz}êèÝàtõŠ¥ µUåsK‹‹ -fæƒ0’NôA3>àÛÁx¤¦¦¤$'%ÆÇÅDE„øy{Lu´µšdbNaBU< _oq Ê_ªD¨bŒ xØH´ªc0ÑÜbŠÓTw¯i~ÓƒCÃ""£¢¢cbb‘¸$žˆ?Ô´ô̬œ¼™…PUÕ.XÜ ±º}÷£§Î_¹qçÉ¿ùë?¸kv#•=ŒûôÛ{·®]ÕÉnŠ…ùDt:r&_RúvQ J†*IÀ}ú«ãÔ4'è™L²œbçèìêîé=Í×z@`PPppC膄‡‡GÀ/#:&6.!195#+7¿°d^åüMËW¯ßÒ¾÷ð‰³—®ß¾ÿè™èBÀGJe¯B¼üîÉÃ;7¯œ‡@ݵmnãÕU••͚3`JRB|,8‰ŒŒˆ'ó¾;ÁÁAAÓý}§y{º»:;ÚM±œdb¤?ASmqÚ¿(ùvTQ kULÀ}Ñê屪ÚºƦæÖ6vN.®nîž^ÞÞ>>ÓßÁàïï?}zü0‚CBÃ!ŸÇ'¦¤gçÍ*ž[Y»pIËՃÇΐCndRýH©¢âë¤çÜÁ³C‡÷âc±æFÜó)ÌÏÉ$S`dxXHpP H™‘ù¬ïÿÝÈhøøx{{yz¸»¹º89ØÙX[˜›èjk¨ŽUNû’ä kÔ. -T©Pý²;kUi„òuÔjdb6ÉÂjŠ½ƒ£“³³‹ËÔ©S]ß71‡'ü,|¦ùúù…„EÆÄ'¥eÍ((žWUßؼºmëN<“ªÌ¥Btÿ›ë—Î?´gûÆ5+–,˜_^Z˜Ÿž’NR¦ï4°âéááTü±ßëkˆ¸¸8;;9:ØÛÙL±²˜dfb„JÕUÆ(Pb²É·«¤¾Éêà¡ÃGŽ«ª®©­£gh<ÑÔ|ÒdK+kë)666¶¶¶vï=‹àèèääì2CÞËÇ×?0$<*¬æ–VÌ_¸tåºÍíûŽÀ¤zS6RÿW,ïBÜ¿}ýâ™cwoÛÐÚ¼¸¾Šlä%ÇGCY“ äL7שċ£#|RîS¿ç—„q™bmme9y’¹éDcC=mMuÕ±£G:˜§(•MÀ¬Õ>ý ‚ù=‘h7Ÿdaimc+%ßÜ[ΜQ8‡•Šé÷ê-,”dTýþ7[ýB¡ôÍu&RQjMYñÌìÔ„è° ?Wg[œÍÍ ÐŒ9;÷ Þã˨hkkiijhŒWWS£Ê#‡ƒRÓ¾½¿îÉ8%ß.’ÚÁ*¬l Xûö­C”†9Jyô0«¢ª¦¦¦Œ/445áÇ ?ÐLÒ8)¼Ðª‡pDlR'•Ì©P(q'Å=&>ÔªäæƒHê (”ð@.‘:;?+5>*4À×Ë œZ[N23hdh@Bñ0_à=¾* -Œª -ø3ZyÔÈԆ€Òþ}!La-ËS «d¬öè 3+Dë@âuø4« ?à:•½±a5 -ÃH ™>Í÷ À)(Õ¡Ú r<RUÅÏÎ}w~aeô9b81:¢fSÓ¯ØÜÛÕN;XeµB´öë^ª¤4lØp Œ|F”•ñ—€¿ƒqæ Ši]}£‰f“,mìÝ¼1R“3ófÏ«Y°tÞ8~öÒõo<~þ’i1!Ùâçܲ‡Y©?ÿðâé·wo]9òðÞ×,ÇSa³rÈÏi¸ŸËJXƒú²§*„ÛXt„Ÿžùïüºd\†6LIièÁh´?¥D)_N‰TÎ* VF+„+Š³ vð!C†¾%Æáσœäï1àJ.(¥ ŒM‰TˆÔÈøÔì™%嵋š[7lßsø$sm’4#~JþþVÿOZê?ØûÝP)]8}tÿÎÍk[šê«ææ¦'F‡LóÄMÚÉf õa¢¡®Ê&Pqh =qü>Q()£”M½"§]*•³Ê+§½öîÛ¯p vßÍ îG€!Næe¦ž ËHupñ˜€fr pJmÁ)•ì=Üûw %:üüoǎ<ïw>TbK‰ì>p“ê¼Ùy™É±áA~^®NvÖ(UOG Žƒ)cNì‰ð®oƒcÔ"´Oo4Ê)唧¬­„»÷ b¿&jA.C¿wҟù  aÌݨ¬ª¨±R'[Ù:¹zùEÄ%gåÏ.«Y¸L*û~/êóoÉ ÈæT$•i¯—¹ü»¸®¢tVNZBTÈtòˆÌ¤NÐÒP#NqRd’è@FTÿw|YvTp€@ç×Dhîx‰R>JZå´¢W"Í"_sô~Ì/å’Zk¨ÒpXóŽ‡Rõ 'š[N‘ ÔÊúÅ+ֈV©Ì“·_ÅG¥{¶¼—ÑÿåNçã¡ß_™goä60Y©®\º@2Tñ!™©‘¾‘:z.FH¡CŽUõ;ˆÆ„ŒúD¡hT¤”?§µ²^‰X0KÜz¾ÖïÞ$oV™ý)5 m Tk;R&EƧdÍ,.›Ou×f;_üŒœ»&ՉkìMcr3Š}JÎméo'¡Z‰s£C¦y¸8ؐPevö PIñJ)xÄÕï ÓWŒPÖ(ßJ%¬Š´‚W f¿$r9ºÿ>Œz‹ZûÄH§:žyžgeëˆÉ7Kߢ¹Õ M-ÌvÒ¹ËÜÓÔ?s‘úïNöáúѵTöàÙ<ú¥ÙX¶p~9·ªñqw¶‡YÕØ@Gk¼Ú¸1Ê(•]Lړ•õ6$F…ŒÒD(+åÕ)k•ÓŠ^Q,še܊øò÷!ڙ2«„ê !JÃGâcL¾&æ–äôS`XL"¹P×¥ï¶ÝŽæÎ=°R“h°öfEM¯Èõñ°Ç~Ÿ>"j Twl‚¸¡pJ\D°¿·ÖJ¦øøBUy$‘Ú¿_¶ÚéÎÙz RãBFêsF(+åÏ©”V╈%f?é}_°9‹,Ü R1P!ùêâ„jã0•L¨ i9³JÊñ Íz(}1P¯³‡ QêßÙVl°Æ4­Â»ÆŒÔgoB¨Ãçä­Ëë*çÎÈà*`<{b¤VUÆ°{¶ÌÎAvvduý¢1ú#'”U¥b­ŒWF,«–ãówð'¶Æb70ȳ|7^K׀8%ERT,Q‹çU7ä{° Á՛}ñ07Hý+ۇë¿;×`izÅ5­"‡¹B©„¡º¯Ü5¬%÷]’bDŒ L«xTa¸»Oö¾ä²éۑvÄþ a”w¥H7)¯"³ïF$ýOâÍÆ~$P!ùŽÇcOfœÓxöùÌâå­ø|üÈÉs—®ß¾û•ú¶¯Gçû«‘nIlO€W¤sHôØÁÝÛ7®mÁ'åø¬&1&<З³ª«=ž9¬À<1c÷øþ$òö~£À [7RŠt󇼏Ùϙ½F”ÊïIõÀӉø¼=ÈNqêƒ×9R2g0G ùnہʜÏ'·`Ú?þJn¯Fš_ýJº±üô#sñî­ë—ÏŸ:vpώÍëð¤RÕ¼Ù3³Ó¢«6hUGSϊ ÅPýšHe·„^óöf:ŒßßD·Ddõsñãöƒ•˜clzF¦“ñ|8qšœ1£ ¤¼Ï¶m!¹Ï]ºv“\{#m^1í•>ª»éDFÚ±¼$«Pê• gðþ6HÀKÕVÎ)ÊÏJe¬N…媙±þ 5HÀª¢§ÛŸ‹œ~Ð`ð-ïwù`­ì³|,Û»ï€AP%ᄪkh2ÙÚÞٝ}Šš;«¸¬º¾qÙʵ¨‡Ÿ>]}î= ÍHžŸØÖYщŒ´"ûñì\…mŽð&ㅳ'€P]¿z9¹\ |²Š›x¤^¦UHÀª˜™sû|ðù&Þ­•‘úåWÌÙp TH¾P$M²²ub.]%‘{¯x4tEkۖ»9q/¨ÞÆ&ÙX«ZV,Ç^; êjªÊ±GÀŒ¬ôäø¨° ?<!½¦¡Rÿ«ãœ*¹L5#‡X¦AþŽO«ù³Kæ–UT׀ׅ‹71 ³–/_A:ªu¦¥Ú;š’­À¶dÍ˖.iZ܈­¬æWW–Ï+-ÆÆGé)¤Kžì¶±4#…Sż¹úU×bžÐ8»yû†FĀÕ̜3 ŠJæ€×ÊêšùµL¿,짆 Õ:ÛRí­=ÉH[2ìK¶ ¡¾®v~MuUE9ée5+/â4!&2Ûä8ÛO™LÚäðÒREQyó:•lçÚÆqª‡ZŽKLaûmÍ.)3w^YyEEeeUUu5×P­³-ÕÞܓŒ´%«®ªªª¬¬(/›7wNiIqQá¬ü 45)>&"4Ð߇ôÉ!ÏTñéóœ†J•ÞQêÁí(a¦ZÛáýE¿€à°È˜¸ÄäÔôÌìœyù3g1í²ŠKH7µNõS{Ÿ¶dؘ¬¤¸x6ö&›53?oi·“’ˆ7U™S…zÚ¢}é%¾—7ºI5Pc»2S‡PÅcؕÉÛwz`HXdtl|B6TÊÈÌÊÎÉÉ%½Ô¸njk¨öûmÉHg²¼3˜VX™¤}RŽ  šîëM.5Zàù_MÉgo]ØüHaKåžÒ°Þðp¨…µ£ ¶{𠋈ĆJñ ‰Iɤ“¶RûàfjBéM†Íɒ“âãb££"Hw_O7G;k<©¯«%ñ”¼•ú_M™þô%“1T•Ù#¿f“ñ -¹‹éÎ2=0($4ŒtˊŠŽŽŽa[©u¦Úû6&#½Ébb¢I{²ˆð°ÐàÀìhåá6ÕÉކ\iÔÕfγ0­è”ŠHLª_âq–~a÷b•Üa´&m<Ü<<™†JØ-‹ôQuRëL?µ÷ëKÆ6'#íɦû“öIž`ÔÙÑ{0­Ôؓgä8KWwÊQH¤>°çY†“ãùZ:ä¹…¶gqr& •<<½¼¼±ÓGíÛ©}`k2¦=iP†½°Hû$'ҜÅ[«oãFÂöGÜiÂÏ?ïÒN9 -‰T¨²¶ˆUUr7;>`ßl¨äà€í²œ]Hµ÷ï£ö‘L% Ê\œI+,Ò=ÉÚÊb²¹éD#Ý šãUÑ©_-­I©X³VG’‹ŒZtõ &š`K% KÒ/‹m¢ö!mÔ>ò—Ù`‹²)Ø ›'™™>̵c呬ӯپ*ÿáÈ‘nRV1÷åmÃ›äÚtõ H5ì ffNz¨½o5ã$s¦IéRf §;A[s¼šŠ¨§U_î(7­r‘T®Ñ±J.3B´’þiÚØ@MOß;¨‘jïÛCMF1=Ê áèëaë$mÒ¦L…4µRÂ9í.Õ+‡ïqåéP•nŸ6jô˜±¤ùÎx MÒ@ ;¨½g 5ق/ÛKƒi´3v ¶P’èSö?=­®–°Š½A«¸}Ú8¦ii ö¾-Ôd ó÷b—2UU•qâ>e¨´?wá\£ùŒÎ¨ˆä1}®ÍVoìÆÄ5j³¤ژ1ïÙ@M>¿~4¶)cû” …Ä‹MH $ÑÕ¨ÿèÓ¡b$­Šµöašl ÆÖJJl߬÷ìŸ&Ø6eLŸ2¶!K?QW+‰HÔéIwOc¬¾¹{Ú»û§Éò!ÞШ¬{ÇFe|©ÀÔÿLtý˜h%ÝÓúŠ»§½Oû493@ܨŒ4ØéÅ)ß`ü½CÓ‘U6X¿`ûz XéæiïÓ>MNôw*#=®˜ÎV¤÷Ü|7*SHºI«tó´žRÍÓÞÝ>M.|-Õ©¬ç;•Q§Òt“ V‘×ož&_ºS™ÂYíØ<­cï´w·O“RŸ@1;•) Ý$µ~öÖÞiïìž&':|Q{+…êT¦€ˆµŠšâ}Xï´®AºÅÕgÒM;øCÅ£›„ÖNõN“7ŸD«2…£›”W‘Y¥c3$¾GOaéÖ­£XÅüöîV|œbÓMŠ÷jÆҟ’ï1ûèö)Á÷`}Rð-ë=à{ˆ>yøÈÀ÷(P( -…B¡P( -…B¡P( -…B¡P( -…B¡P( -…B¡P( -…B¡P( -…B¡P( -…B**v)Q¶áYá½ü{©X;…Âÿß+<3+:£—[/=e÷^ºÊ±ÌÿÁ>>)ڌù¯S¢cãSØJ}¼²ž²¿üs:¶Ñ9ñ‘ÑáyÊþ6½•u'è*ëâÿà1˜`¢oll¬¬§g0A_ÏÐD9XÙÐØTÙHOOY_Ù?î}þyü¿q†ûß&ð×ÃÿÀ?ÿCeò/襢B>"~13e}Sccý^þNÝÿ -…B¡P( -…B¡P( -¢$‚ïOB‘Jo€ïÏDùÞd”zý¤y»Rªõå÷•R­Ÿ ïVJ­~j¼—Sªõ“â}R«Ÿïï”ZýTø§Ôê§Á‡9¥V?>Ô)µªø|¸SjUÑéŒSjUÁéœTjU‘é¤SjU‘¡R…G§R«ŠËGH¥V”qJ­*(Tªù8©Ôª"ò‘N©UE䣥R«Š•*@>^*µªpÈ@*µª`ÈÂ)•ª`ÈD*µªXÈF*µªPÈH*µªHP©DVR©UBfR©UÅAvR©U…J 2”J­* -²”J­*2•J­*Tª‘­TjU!±TjU! V•*@d-•ZUd.•ZåÙK¥Vù‡J ²—J­òŽ¤R«|ÓåR©ÿ.  ­vêG@éòú&Mü(G.R;Júð?Aù(äoµ„òqÈ[jgþ å#‘T¥NýÛyA!©ÄPgþ EÈÁgçá{0„ߥá{4„ߥá{4ߥá{4ß;À÷p¾5v€ïá|[ìßÃ! ø¶Ø¾ÇCð-±#|‡0àÛbøaÀ·ÅŽð=‚€o‰á{<„ß;À÷p¾-v€ïá|[ìßã!ø–ؾÇCðm±|‡0àÛbøaÀ·Åð=€o‹à{8ߥá{4ߥá{4ߥá{4ߥá{4ߥá{4„ߥà{0„ߥà{0„ߥà{0„ߥà{0„ߥà{0„ߥà{0„ß%á{,ß"%á{,„ß&%à{(„ß&%à{(„ß&%à{(„ß&Åð=‚o•bø Á·J1|„pàÛ¤¾GB@ð­R ß#! øV)†ï‘|«Ã÷H¾UŠà{ „ß.Eð=‚o•bø Á·J1|„€à[¥¾GB@ð­Rß! øV)†ï‘|«Ã÷H¾MJÀ÷P¾MJÀ÷P¾EJÂ÷X¾EJÀ÷P¾EJÂ÷X¾=JÁ÷`¾=JÁ÷`¾5JÃ÷h¾-v€ïá|Kìßã!øvø|ˆàÛákð= €o…¯Ã÷ˆ|úðmð ð=$Ÿ<| ||É§ßþÞ߃ò‰Ã·¾7Ã÷¨|Úðmï-ð=,Ÿ4|Ë{|Ë' ßêÞß#ó©Â··ß‡ïÑùá[Ù»á{„>%øvõþð=RŸ|[úPø/E‡o?ƒïQS,ø¶¡ ð­åCá{¼>AøVö{ð=6Ÿ8|ë{|‰ à[¢|†€à[%ßã 0ø։ð=„*$T© ¡J…u*H¨S!B -êTˆP§B„:"Ô©¡R…u*D¨TB -*U€P§B„J Ô©¡Ru*D¨TB¥ -êTˆP©„J Ô©¡R…•*@¨TB¥ -*U€P§B„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€ÈG*µÊ'rrJ¥ò •*@¨TB¥ -*U€P©„J Tª¡R•*@¨TB¥ -*U€P©D^R©Uþ›S*•?¨TB¥ -*U€ÈO*µÊrtJ¥ò•*@¨T"O©Ô*?ÈÕ)•ÊTª‘¯Tj•äì”JåyK¥V»¹;¥R»ùK¥V»š.pJ¥v5]!•ZíZºÄ)•ÚµtTjµ+é"§ÔjÒeN©Õ.£ R©]EWJ¥V»†.uJ­v ]ì”ZíºÜ)Õ*oøPJ­ÊžœR«r„7§T«¼àS)Õ*øVŠð=ƒo|ƒ€à[¥|† à[â›à{L>iø–÷»ð=8Ÿ |+û`ø0…„o)r„ï¡•?|0ð=æò†ïñå¾]Þð=¾üÀ÷¨Ë¾G—'øvùÂ÷èòßÃ._ø]žà{Øå ߣË|»|á{ty‚ïa—/|.Oð=ìò…ïÑå ¾‡]¾ð=º<Á÷°Ë¾G—'øvùÂ÷èòßÃ.Wø\Þà{àå ßcË|¼<á{lyƒï—'|-oð=ðò„ï±å ¾^žð=¶üÁ÷È˾G–GøzùÁ÷ÈòßC/?øY>á{ìåßãÊ+|¾¼à{\ù…ïї|*Ïð=üòïQå¾Ç_ð=¦¼Ã·9À÷*|+=|¨"À·YÃ÷x*|[-|¦¢À·YÂ÷X*|›|¤"Á· YÁ÷8*|ë|¡âÁ·‘‡ïTHø–òqð=z - ßb:ß#§Øðm§3ð=fŸ|;ú ø¬O -¾e½|Ñ'ßø -…B¡P( -…B¡P( -…B¡P( -…B¡P( -…B¡P( -…B¡P( -…B¡P( -…B¡P(á¿( -…B¡P( -…B¡P(H7|Š,èöøþL”áMF©×O±Â?pP­Ÿ6¯ }Í,ߟòt4ú¡ƒW¾?$僐TúY¨ÖO±R´øG)D^©ÕO -‘SÖèç°^©ÕO Î)£DþIÆ+£•Zýd‡)Q -"¿€x%Z¹`åûóRލd˜¢Ò/¾øòË/¿bÿŠ^Q«8XùþĔw!r*VúÕWݑøD¬H+µúIÀΧ¬SPŠF{ôèÉÑÔ²Z©ÕO §¦¨„öêõ5G¯^èõ+L¬Ôê§@G§Dé×½{÷éÓ§oß¾ðŸ½{ Z1Z©ÕOф*r -JÁg¿þ ýúõíÃhýŠIÁœU¾?8孈çSpÊ(í×ÀÀè/Ò*¶JCU‘‘H¾àÕ‚ÏÁC† † <¼¢V Vjõ@¨lœöîQ -F‡* 66LièÁ@´~݋IÁÔª‚ó§¢4løˆ‘£#G ¦Zû÷c­rÕ•ª¨HJíÞro?ӡƏ¥^CCSCc¼ºšÊ8Ð*¶J§Uņ‘ -¥/*$ßþ+ 5z¬ŠÚxM-í ::&hkiŽWS;zÔp¥7YåûP^ƒ•JfTÔ~>rôXUuMí ºzúúzº:Ú uܘQ#”†0VÙ˜N«Š‰X*Ψ}û2l¤òXÕñštõ Œ'ÆFúºÚšêªc•«°^ŘN« -ŠhJ%Ù’/8՚ ghlbjf>i’¹™©‰±¡žŽÖxÎjŸ¯{2ÅMÀ -‰TöÅu´Šº&8hj>ÙÂÒÊÊÊÒb’¹‰±®¶†Ú8°:x`?jU¡‘ȾÝ1û:\y¬š:5›limckkgkkcm9Ùl¢¡ÞÖ*¬WEÅMÀŠ‡ä”Êd_ T-]pjaecçàèäääè`o;År’©‘þMÖ*[,ÑiU!IÅ)µO?Ⱦ0£jLÐ76›lmëàä2ÕÕÍÍuª‹“½­õd3c}Mµ±ÊÇ‚Š%š€”ú+¦T̾ã0PM&YÙ:8»º{xzyyyº»¹8ÚM±0›h€VG¡U:­*.b©¤N¤4b´ÊxmTKpêáåãëëçëëãåáêì`ci>Q‚†ê˜QÆ0ŝVN*)~ûö‡)uŒª†ŽÉ$k;'Wo_ÿ€ÀÀÀ€é~Ó¼Ü]m9«#‡A±D¦Uº]¨€HK0xØÈ1jšº†¦6S=¼ý¦…„!A~>®hÕX_{¼Êh¦X¢ÓªbòšÔQcÕ´ô ûÚ:¹yù‡†GFFEF„‡MŸæéê„Võ´Õ¡f§Uº ¬€¼Aª:H5·¶wñðñ -ˆŽ‰‹‹Ž  ðõr«fFzZêP,‘i•®Vñ’F,U[â¤)S=}Ài\BbRRbB\Ldh kUK`,–è´ª¼Eêä)Ž®^þAáÑq‰É©ii©)É ±QaA~ÞnŽ6¦†:X,ÑiUQ‘Ø|j2ÙÆÑÍgzHDlBrZFfVffzjR|tx¿—«ã”É&°X¢Óª‚"¹£ëÔÁJœT'wŸ€Ð¨¸¤´ÌìœÜÜÜìÌô”„˜ð`?/W‡)“&êc±4|(]­*&’{¿¸ù0ª_H¿ uZ`XtBJFvn^þÌü¼Ù©‰1A~^Sí­¡Öê0­R« -[þŠ¥Ž% +5<&1-+7VAaaÁ¬üܬ´ÄØð _O;+,–è´ª°pùÖ4½z÷8tÄhUM=ãISˆÔؤôì¼YE³‹KŠgΜ‘–V=œm-±XÂ=ˆAx‚n+’åoヌ ­¢¡ RÝPjrFN~aq霹sç”Ì.ÈËN«Óܝl,°X"Ój:­*Ö4C†+«hè™[;¸ù©¹³ŠJ疕——Í›S\˜ŸžàãæÅكM«ôÙª"!Q)aù;lÔ¸ñ ͬì]}@j挂â9e•UU•åóJŠòsÒ£C§{»:@±¤«©ÆN«½è´ªX¼^)©k˜ZÚMõ#RKæUTÕ̟_S]YVZ43'-!*ÄJ`+3܃ ÓªB"Q)õd+%(-l]¼¦‡Æ€ÔÂҲʚںúúÚùUåsfÏÌNKˆ öót¶µ0e§ÕAtZU4Þ4©B¥dãì靔RË«jë,\¸ ¾¶º­¦ÆGùB±4÷ Þ¸ ü®¿P‚.ú–ÿiHç_2©êš[;ºûG%©Õu 566.ZPWS1wv~VJ\x )–Œõ>lZíöºôûþG ½RÅ=%œT­ܦE&¤£Ôšú…‹›–,iZ¼¨a~ÅÜ¢ü¬äØ°oW˜V$§Õw$à·¥^å@‡•*3©šX@¥Ÿ–[PZ1¿aQÓÒæææ¥M ó+çåe&ńú{¹ØYrÓ*÷lõ­ë }onMµÊ’ÙE >¨á&U¯éaq©9DjãÒæ--+š—.^P[9§pFFbTˆŸ‡³Íd“·M«Ý:ü oðI»~ˑnÜévQ3j,¬Tͧ8yø…ƤdÏ*)Ÿ¿`ñ²+W­ZµrŲŠæWÌ)ȅ8hš»ô´ú¶uM¥ohMÛCË©ü‹‹š1j줝”9³¤65·¬j]³¦uUKsX--ÈI‹ôqu ÓjÇg«R¡*e”U)Ñšvý–’ÏTqQƒ{úaRõ ŒLÌÈ+.«©+[×®[·nmëJ´Z^23;%6lº×TÑ´ŠG–:$ànÿ%­T²á7ÛZ²ë7µ*S^_ÔhèI5 <>}FÑ<º|՚õm6´­[³jyӂš²âṳ̈è?Ogñj•9 ,Ù8@2ï~&Ùð[ÔZÔšvý–5ݤ6•È¢f‚¡™µ£‡hljnáÜꆦå«×¶mÜ´yÓƶµ`µ¡fÞì<(–‚}É´Ê>[•X×HZ•PÊú”è Ívý¦VeÔ¦ÒÀ!¸¨Ñ7µtpó ‰IÎ.˜S…R×mؼeëÖ-›6€ÕÅ Õs sÓâqZe6¹iU¼®ùƒtâ÷ûþR‚/˜îПÓ^î²G*ÿ²‹2©E%eÍ*­¬_¼|õú[¶mß±}Ûæ ëV5/®¯šÅN«.v&ÚêãÈI`Éuäëm$›C3Ý¡ÅÍ¡iÓoùÐMrS‰YÔè‘I5"!#¿¤¢¥nÚº£}çÎöí[6‚ÕƺŠÒ™YÉ1Ìju¢ž»®‘|^óºR¦9tQohl7û•„VjU–¼iQC&Õ°¸´¼Ù嵍 uó¶ö]»wïÞ¹c+X]¶¨¶¼8§ÕinŽÖæFº¸](}fô3ñûPHÏÙ/™vß½DÝ¡{õ"M¿¿âºCS«²E"ÿr‹}2©B¥TT6¿±yuÛæí;÷ìÝ·oïîv°ºréšyE3ÒaZõvµ—X×°Ç >ç¡âîÄè×LshBïÞ ¶'i#ü¥Ø*•*+DùW¼¨Ñ5žŒ“jtrvἚE uˎÝ{÷8p`ߞÛ6®mY²Š%2­zºØZLÔ'gFÅKÌ,Ée^Q»oì ݯÓº__¶‹pÚó[Ho*1‹fRL̚5§zá²Uë·´ïÞðÐáC÷£Õ5+šê+Kge%G‡øº;1ë©ü9·ËÀuåïÅtûÀ4‡†ÿ ÑZÂ*•*+¸M}rûB4©:yLÏÈ/­Z°¥î9pèÈÑ£GØ»së†Öå‹ëpZMˆ bÖ5 ˜±Êî3pܙn߃2dÈPøƒIohÔ*²J{“ÊÉIµxRu÷ …J©¸¢~ÉJº÷ÀácǏ?vä Xm[ݼh~YQnZ\8¬kl-Øç5¢Î-¸¯ð'¶@ÂÄKº}ckh¦7ô°aJØzhe[~Ó.–²FrQÃMª°Ru“’;»¼®©eH=xäøIà8Xmß²~ÕR˜V ²Sp]Ó!÷`*lÄtû¥CIkè‘lkèDZ-¿‰Uª2çµI•¬T]¼£ R*«]ܲnsûÞCGOœ:}æô©GÁêæu-Kê+Kff&FMssHÀ¤s n+à»Å°14„)v†V>;C3­¡ÇŒV…Z!XÁj¯žÒ¡Ê÷p&ÿâ“rѤjh6ÅÉ3 "1«`îüÆkQ걓gΞ;wö4XݳcӚ‹kËgÏH‹`0TÀ#™ܓì}Åͦý¢Rì =VE²5ô(®ã÷×zCó=€Ϳ+U-}S+G¨”fΩ^´|Í&züÔÙó.œ?wæÄÑ»·mhm^T뚔˜PéܗÔ>ݙ͆ÞâfßcUTÕÆcghÒZUeìhå‘ÃIcR6eÓS¦2E<©2+UeM½‰–ön¾¡qéy%U –µnܱ÷ðñÓç.\ºtéâù3'ŽìßµµmÕ҆ªR’€±mAôNJ¶gfiÚ·?:Á4†ÖÐҞ0AGG;Ck¨«bÃïáoløÍ÷xƒ“*Åí¨”RgW6,]ROœ9éò•+—/¡Õ};·¬kiªc0VÀìð0ì3 -ËOÜìͤÞa#•Ç`¯o®1´¨3´ -iãN0=å/{D+Ufû—Ý~pñŠJÎ)*¯_²jÃv”záòÕk×®]«Çï…iuù¢šy˜€C|Ýq˜¹à8kŸÞ_“7Q Àþíl¯o=Cc¶1´¡¾žŽ–X•ê÷M'U™Òaû—Ù~˜âä™åo]Óʶm{8{ñʵë7n\¿zéüéã÷lÛ°šMÀ‘ÞSí,MؾXÑâûÿú±©wÌ85 m}C㉤/4ÛZ_[‰ÿ¼Dþ¥Re†Ôöï€Á¢JizxB欹ó·¬g¤^½~óÖ­›7Àê©£vA^Œ 856ÌßӉ;1ln*ôÃ$H½# õb[hc³I¤-´••åäIfô¹v߃_ëÁ÷p„ÛX)‘=¥0,kW¬Ûº¤^ºzãÖíonߺqíÒ¹“GöµoZƒð¬¬$X¬b­dˆ[Àêàà¦àP¦%¿–Ž¾‘‰9ÛÚΎô…67«šêä—ìáN¥Ê©I+%fOÉ746=¿Ö4붩×nÞ¾s÷ΝÛ«gOÚ³­mՒ†Šâ¼t¬•˜çåØånØÐÁƒ &‹S˜N5´u °Ó÷[{''ÒÚÎÆÊÂÜÄPO[C•é5+nA¥ÊŽ×*%,m™ò·¤jaóÚ-»©·¾¹{ïÞ=´zñÌ1LÀ+çC­”ìëæ`Mn­BF¦4tèP¥a°’ÁéTÏÐÄÜBÔšk Í4V—lö͔¿Tª¬WJ잒úCRþF§äή\°lÍf"õú­;÷^Ë^sKlóíãùZOhrÕJ•o\ÓØ»‘…êÜù‹W¢Ô3DꓧϞ={òèÁÝ[W¹P…8›Àª&†ºÚZšør1pjë8ÕsÚô °Èèظø„ø¸ØèˆÐ wg{kÉޕ½è’Föt:rÜx]c²PKÇ݇–¶íûŽ©ž<{þüù³'ßÞÿ† Ս«—âZ5-ŽœØ‡òÇ@WG[[{‚®¾¾ ÅÑÕÓ7 $<:.!)9%%9)1.:"$À×s*ӐTâp)•*k¸çä_~%±Pµs›–_*–zçÁ£§Ï¿{ñÝóg’P=´{˺å‹jæÌÊLŒ š¡jajŒaôô ŒM‰S/ßÀÐÈ؄äÔôŒŒŒô´°äÇô¦RåJ‡…êȱê:F“l§¢Ô¼ÒêE+ÖoßËH}üì»ß¿xñüé#U(€÷mß°²©®¬Ÿ–ûc“ÑI¦ &šMÆW¡xù†EÅ%¥fdeçäæ`ëàÄØȐé>nN6“M DR{’ËU´ø•)R Uf÷¥úǤ敠Ômb©ß¿|ùýwª7¯œ;~`'”J •%yéñظÐÆr’™Éĉ&¦æŒÓ °èøäô,ì<3?/7+=9>*4€m\‰—«† À܃¤*kÞ$ÕÆŇÝ'\±nÛÞ#§©/@*X}úí½ÛW/°ù·znëûz¸ØO±œlnff>ÙrŠ“8 IHÉÈɛYPXTT8+?735‘t#u–yþâå?üðòųÇ0ÿÙ»½ –ªäa9v£t²›beaaaimcïÌ8MLÍʝY8»¤´´¤¸¨ ?'=96‚4f¤âå>_Ӎ<o)±û„œÔFêV‘Ôï_þøã/¿þäáÝ—ÏÛ¿cê%õä\KDà4G;kkk;ÎiZVÞ¬Ù%s畕͛[R4kFfJ|d0JŒGnjTԟ®häÃkRµß*õ‡Á*É¿·$&Ur·ÑÏËÍÙÑÞÎÖÎÞÑÅݛqšWX<;ÌVV”Ï-)ÌÏNÅ®•¢«­#†b‹_Z'ɚ÷ˆT(”î>|òHýé§_¾xúè,jNܵyMóªҙYIÑ¡Ó}<\§Šœæ–Ϋ¨®™?~ iEŠ f9©äX©¸ø¥*[Þ:§¦ˆæT‘ÔŸˆÔgîß¾FVªkq¥Zèçíîêââ2ÕÍÃë^tZTZV5¿®¾¡¡¾®¦r^IAn:i™ædƒç_TFBë$9ñÆ% T¿X(•0Rž¹|óî·O¿{ù#Jý*%Ê•¿x®;5>"xú4/777/pš -Nç”W×6,\ÔظpA]u9öÁÆ=xÏ*“âW¢Nâ{$„ÔyŽëÔ*vúF©‡woeÎ?äBZ ðóñòôôòžÆ8ͧ5õ ›–,Y‚H+çbËJêî8ÅÜHg<,SsuReÌÛv”‚c¸¥}GÏvúˆTFjьôÄè° é¾Ó||¦ùM -‹ŠOÉÊC§ ‹š–5/_Þ¼´ia]õ¼Ù¤µ>R73œ€+¶ø¥ÙWæHRRzÓÞï1zO$•™SÙÝ_FjFRLDH ¿Ÿ¯Ÿ@0:Å~íLҖ•+W¶,_ÚØPSVŒ#՗©XüÒ:I.¼áћÄSšÅ+Ûðyê•[÷=}ÁJýNTýb¡ÄH -˜>= œÆ%gÌ((-¯iÀ.¤«[×´®ninZˆ­ ³˜sjV¦Ú¸¢aŠ_:¥ÊžŽÉñyª¥äóÔöÇÏ¡ÔgD*³Ne77ãñ_”šNÓsg•”¡Ó–ÕkÖ­_¿nÍêKÕU^ÁÓÜì-MôµTÙ◭“h Ê’7Ý{ãN>àɇíNœ¿zû>‘ú#J}þä᝗ÉÕÖe «ç¢ÔèˆÐPpš”ž3³x^u}㲖Öum7nÜ°~ÍÊæF¶Hð4WŠËT"•n=ȉ wðLßÔÚÑszDbVaYÝÒ՛vIý· E{¿û¶oX½tA.U’ã£#ÃÃÂÂ#¢âÈunU:]¿qó–-[6mX·zyS}Ùúòqµ³˜¨§‰+Z'É ñ]òGD#“rŠÊðÜ®}sÿ1+Uô”´¬\X Rc¢""""£ãS³ò -çTÔ.Z -N7mÙ¶}û¶­›ÚZW,ià¤Nµ›l¬«Á®hh$:´²ßeŒNÉ-®\мvËîç.^ÿæ‘Šip?¦T¬“Ö­X\WQ2+'=9!6:*2*:61%3· ¤¼fÁ’­â¾†HW-Fª÷TÛÉƸLUDë$ùðZÓI<¢Ä®hÈÞóäí:û8õ|HþèR"G±ÿNñL"5&::&.!&ÔÙóªH¯Jlk¸g÷®öm›Ö­\ÊH ôv±™d¤3—©Tª|è؞›©“°øËŸ;»|ãÎCæù÷¨ß‚æ©Ã{··aûy³ó³Ó’âbbbÁiZv^ќJ˜PW­§»÷îÛ·oÏ®í›×¯ÂŠŠHõr¶17½É ;2DÜȎ¼q~ȈÑjx@ŸÜOÍ"Åï†öýÇÏ^¹y÷ᐠ-|eÔ¾gcömiª¯œS˜—…RcÁiR*¾ú¯|þÂ¥-k7nkß³ïÀÁƒöínßÒ¶ºy!^}LŒ ðržbn8A—©¸¢¡Å¯ÌySËu#sö*My=^¥Áâ÷Ö½oŸ<ÿœb Þ¿/öíØÙ·¶¼dVnfjRB|:Í`’oÓŠÖ [Û÷ì?xøÈáCöîd;º€Ô”jfˆ{tE#D*ê#ªÂôey: ‹ßÛDê ÒýŽk~·vy#JM©ŽÖ¦d—p0•*º±¥¯ôKT'bç`¼r\Ñ°ŒÜN=wå&‘úü;îÒÅÙ㤙GSCÕÜÙù}““RÒ³Ø*i%v4º¢q>J Ÿîáh…R•‡“ ¥/©TÙ"¨’oc²/éø°¦T¨“î>|üôÙóçϞ’ëQÈUr,“*J ò² û‚Ôd&P«ê/_³qûîGNœ>{þüù³§OÙ¿“<£“ª©ªÜaC‰ïÁŒS¶ôe^Ì8NCGԙ²ïâ•mÛ÷=}ë$”úìéc T\ÏìÞº~åR&åBöM’ -ÔUë·ìÜGzß]¼xáü™“GìÚº®…•êRMô¹­_ºL•-Ý:ê T-}Üy˜“ŠÙ4xür‡{Œ`=Ó¥Oc])“0û&‰uŚ;ö&û>©xõÚÒñYÏåg3e¨s*1P7íØ{è8igxýúÕËΐ¾K+×ΣRå‹Ø)[%‘Ò— Tÿðøôü’ªÍk6ïä²/i ðø!¨¸ñ°l¡d ŠÖ¨$P=uþÒÕë7nÞ¸~õâY\ÿ´­lªW@¥Ê §lò…5ªš6¨Ì[ijI_ÂçÎ_…ì‹RŸ<&zñô±ýd㡞 Ô$f=ƒ›I•uPúb3Y¶›á­×.Ÿ;yµ«Pj•*?¸ •T¾$ùâ‹æ5É;ÉaFOÏ+©\‹ÔvÜy¸N²/@õʹ“‡÷0e¸íËl<$³»¾ ðý»;}áÊõ›·¿ùæö­ëL/-Vj"YÒP©r@ì'T6ùŽ?ÁЌy{5*6Å2éÜ&û>áwÉ󙪹¨¸F%;„¤Lª]ÔܺŸcšÞŶw8ïظjI]H`שTªŒé&9¡vïٛ$_¨’ô&N¶ua_Ɉº±}?–I·î> RE-” ™âÓñrQ &`ö%ë|çÉN¨7nß¹wïÞÝonâϛ~€ÔB*U^të0¡²ÉWCª$G¿˜(}k™@=qÊ$&ûb b%ñ!¨ø|&)•)“.[½aûüSl/Ã{wn‘Mŝ›V/­//ÌNíý²çÎ莒LxÍi¿CIò50µ²wõ ŠL̜YZĄ̊’ -kÔ;7Ùf“RRããIö-,­¨[Œ¯<?uŠ«{~û~äúÎM­ µ(;)½±úTª¬`œ²»ì„:lÔXu¨|- ùNK›ïŽZIZrK*iuÆí6T3šRóÙ2‰ô|¾Ì¶2ü–)­ÈMÖe E9ɑ^ôћŒé&rÊI섊•ï'L¾ÉÙsk-Ç5ê±3\ ÂzæÛw$vk+J -H ÆÔ¤ÔŒÜY%åó±LÚ±ïÈ) T(®øC7™[7kšTÌÎMŽ -ē’ɩԏ¢[·n¢ÜË8…jÿAJ#F㶩|Iò-ÁW—à[.Nž¿"ٓP¼ñÀž7KO†@Å£I˜}çT’2‰é áÍþ)òPçðî-k›Tç¦Dy»Ø˜w8ÎBO>tŽnÝDJY§Xø’"i¸² -N¨–vS½ÂãIò],²#½Cˆ…,sâ¡¢´`j<9o–Ìfߥ« L‚ŸÂ՛w†/_<çZ.µoÄÍ_òìÍÝÁÒDòÖ۟D/:–5|kùPÞý:êD¡D©Ø))|±H‚*L¨±8¡V/\F¶o±ò½C¦F€<¢ƒ¡¸ñ“ÁݟILɜQ€Ù©{ȉ&l%ð=Þ¦úþ»§¤“À‰ƒ;7­–ÚüՒ¸ŸÊ¼¾O.Z?ŝÐùÇ?2>?ç^kt:t)’&N¶Á*L¨³È„Ú¶¼_Ö%ß>–<záÔq™”•–«Ô¬¼"’}a‘zô4wCîG€¹ËŠ=?vmn]Æn)y9‘…*{ï¢;óú>´*w­ßúÞÀÛ콆dtŒÐ/¾`_-¯¬ÅÝAu-½‰¤H -ŠJÌÈ'ê:|vv†œw åÖ;ܹy…ysÉJ¦LÊH@ŠŠŽÇ‹nÅ¢ì‹eÓóãÕO?1·Î¯_䪳مê$#¦;‹¨…3Xýìw¾ÍÇ¢À^ßnó³7 Öù§?1>QèWÝÙ7À NIáËIñé3f—5¢ œB¹C¤ŠŽåãnR9)“âc£Qj,h -JIöÅgꮑKç?üôêçŸ_aӏoïÞ¸túÈÞm¸P-Á…ê4¼ ÊÝ:æÞßG´Êš·»å[%GGŸoù"üã¥u26ÑçWøféžÜÛ•Ð)¾\‘”š[8¯†lôí=Â6C§ÜíÅÛ×HíËdß",“â ûFŐ«ãEóªÙì{†´¦„@}õó/?ÿüö\º‡å/³¦™“Ÿêë&júÀ¾k¬~N>´Äv¬HZ%vô'ΰb$t~Åê$ï•îż²_oÊ:µ´sñš›’]0§zÁÒÕ¸}üûèô%^3~ Ò6Ÿm€‹Ô”&P%³ï®ƒ'Ø>.?üôó/þå—W?~ÿüñ},÷“³ÜÉ_rEŠi ‹oe«úSÇoðÑH´YÅÐ*¡T¬Sҟ4_ˆur6{â[¥¿îݛ¼±–¼Yzô8pjhj …/IÉY3K+ÈSf…zÿ[Ò´ùG¦kóÃ;7™+©k¥àÝñ” Rû.á²/”IÏ_þNÿòç_~þéåwO R•¿…¤Rr&wəúø®yÔúů eX,–­b¥¬P陒åK ¤ƒ“ØìݧO߾䅵øvӣƨ¨kS [g¿à¨ÄL®HÚÉIÄ)i±Ã¶ca^0´†ÙyȆÚ76::w²˜‡V6ûÞ}øôůÀé¯`õÕß=%•>§YÖP•R0۟EBuðÆj÷¯¾úR¦H Ì"»œXþµJ)eŒru,«¥».8¿&ÁÉØìß_W;hðPŠo7¯­kN ðLHÏ#EҚMíûŽžÂ"‰4W‡ -öÛ¶îܖM©dAC•ÙyX!‘}¿ÿñgpú+X}õã‹gL¥„[ú‹ªKqRõsw´23œ0ž}ãuŸÞ½zöìÑ£»,‘–¯8ɌÙ?Š*m­J+e…ŠR+êëÁ(Ñ«kSœ¢ÍÁC†à»M‡3oMԘ ó)8Ÿ–[ÄI‡™"‰¬4_½úùÕ+®¿ï…S‡ÉS7<ǒ‡RãbccÉ"µpN$î6.ûB™ôÓ/ùõ¯ýë¯þù§ïŸ?ºw‹©”V’Cúä2¹Ídc=-5ò^Üýûöéýõ×½zõ”5ìØ°’‰YÖ+ÏZ9§"¥¢…I±?Boø®w&8‰NbSIiØ°áÃGŒ¥߯‡/c3·˜bïâNS²g•VÖKIO!ƒbýÊ°Ø`òò9É~,伯ø²…èÍu̾?¼úó¯àô`õ/?ÿøý3nûa=^g, /§ws°Æ73ŽW;z$¾ózÈàÁ䣔-88ýñçrÁ,ñúÕW¯iåÍ)³OöȺ¤¿h¢D%†a$ю9’‰M´©¦6A§ö]=}CcòªpGWO¿ p:³Dt‹$Îé_þ‚¥ÎÏ?ýÀHў°¢aqçd¦¥$'§¤1·¢ÈŸ&hnÞýˤ¿üõïÿþþ×_ùé%NªWÎ2gÉ OØþ™ëMÐPS;zÔÈÃáC3Ÿ~¨,ÁÁÁŸ èí9½öèÁ,Œy²*vÊ>.ëÁÅu ›YÑd…(chB¦E›Llj£M|µž¡‘ñDS³I–Ö¶.îÞþÁ‘Ä)9´Àí$aáû’”¯¤Ôù¥>䤒¿ófϚ‘•‘–––ž™WPBnEa™tûRÂ"•ê?þùÏþão˜a¥J^£°kóÚ慢N9ۂU}- 5ÕqcnjVV†>R¶àÀÀøÀÏôbŽg½²ÑʋÕם¢R²w0«Xvžh€ï§¢B-Úäbd‚MSð9ÙÂÊÚÆÞÑÅÍË7 4*>•qŠ·%DEÒóï|…N¡ÒùJ^pR1ý.i¨.+)ÈÏÍÎÌÌÌÊɛU<Ü3Æã/d‹Ë$ ÔþöÛ?!T!ÿ¾ +UÌ¿m+›ê¸w¹ã»qM õt´5Ç««©ª¨àG+Sp`FãÏe$¦Èñèµ2Û˜‚9«])•uŠ©—݇ï?p¡Ê¢y¢OÐÀ—Ò‚KÉÙD™fææ`ÓÒÊzŠ­ƒ£‹«»—ïô`|w Yd.j†Â—-’ ð§L¥ówR¿‚T&ýÜÕï҅ó+æ̞•—›““3#¿`6Ó6©9ÇB©?ýòëßÐ)Zýäßïqû÷ -9¦ßJB5;%6,ÀÇÝÙÎz²ÙD#}= ÚZššðÉÇËUUø­Œ!9^ j2¢’pw&ÖµGi˜@eOÒ3Ëú¢R¥a#F)Á*–E𠺀žžž¾¾È¦X¦½ƒ£“³‹+¾eÄ/ 8<:>Ÿ¯ ”Õ å )’ÈÆ)̉gêW¦7{h[ÝÜXW5¯¤¨`f~~þ¬Ââ9LÛ¤vöI*)“ Pûí_ÿúí7UÌ¿—cìÙº¾¥©®¢8?3)&¬º8ØXM6Ç÷sèëéágב%8,Úä炩r¼2ÖdCP+“ƒ¿ü¢Ë­J;e—Òá£cUÔÔ54ÙÌj`¹²+a"`‚iVÒ¦½ƒ“³³ËTW7w|ň¯@PhDt-"Í!›Á)^?¼x ‹$‘S˜ÿ“âϸ)¥¾±zûÆ5+š̯˜W:»¨°°pvÉ܊šl›´=pƔI¨ÿ~û§(ÿÞ`_cζgOŒ ôõtuv°bi1ÉÜÌÔÄ>¹±,ÁA1„Ÿ‹¾ž.¤M uR“Á -j³‹…V%bµëœþÌ§ìé“þd^yÌ8Uu X–è2Ó$¤ÖI“&#ˆ¥¥••5Èdm™àÒÛgš¯Ÿÿô€ `|ñ{l^!"ã”}„úÙú+©sþÉNŠ˜?™>;í›×­\ÖX_S1oNiII露ʚ†Æe؍…\»ù†+“þñÛ¿þø×o$ÿBý{Ÿ}ÈÓ¶ -›9æ¦'ńûûxº¹89ØÙL±¶²²´Ä?Y†À¨˜ÃÏÅÔSžî- uÕq̃µWÏîìóù®›V»‰®~Á:ÅÇe£ÆŒS¯ MX–@0’XD€booïàààˆimbdúLC—ø΂аðl´Ÿœš‘=cÖl|sLÓòVâôîbáûÔ9¢9¤Â¤øü1é1yìÀ®­Øc{a}MUEYYYyEu-8]¹›<0Ê–Iÿä¤þ“É¿xüá{œ,tÉ«Bƒüñ­SS]œà£ÛÉ›)ð{ÁT`jbl¨¯ 5™ê¸Ñ£†+ ØÁj×Hí&u5œa:V”êáBs²¥õ|¢ñ7uª+⸻{xx™\d††¡Ë˜Ø¸¸x|ç{*¬Dr±Ä)¯®[´´eÍÖ)[øþü翊Ó'i°(üyöÄ¡=;6­[µ¼iQCmMuuuMmýÂÅàtã62!_'JÊ$púÿ$Tÿ”Jlﻍ­ËICìÔÄØÈ°à_o/Owwwüð®²ÆÄ~.NøªÈ)V–“ÍLŒ ô&hª«ŒU1lÈ ´Ú£»ä´ÚUR§äÓ æ¨( Í)¶öŽÎL,‚?Ÿi€/àøûãûa‚0Ïbd‚LÜÏKI…ue¬Brg@3»tnyu킦æUë@ öݸ|ƒ-|ÿLjWŒ´ý‹[i>%COÙ¿kÛƵ«–/i\ØP__ß°°qÉòUà” t Ôà7ñ÷¢Ó£UQ¨’_öÞÙ@J­¹³gæf¤&ÆEG†…LŸîÜWvàxLóŸ ü^Ü\]œím¬-'™èjk¨=²ƒÕ®‘*Tæj^y!@u ŒM'[ÙØ;¹`ËfÖ à`|}‘ ¡ 2“’S9—yyù3gÍ..3¯¢j>FYKkÛæ{X§Lá+vÊ¥O¬”ᕘ3Çímß²aíª˖4-^¼¸iisËjøQìÜǜæ ¨ÿ TágÁÎÊ·I¯H૛×W—•æ“{èñ±1Q‘ááðÁCeE!88(~/þ~Ó¼=Ý]ñ•½¨U_‚•³Ú“}}`×X*{iÈ°QcTÇkëšL²´±wvõðžElHh8ëˆÃÇ&@Bîʦ02³sf ËBp …Íœ¹óÊ+*« o.h\ÒÜÒºnã֝{;Mn·="…ï¯#3"ɞhÿ`'U¼=qþÔÑ{vlÙ°®uUËòåÍËW¬\½¶mÓ¶]ûŸ`·ŒÅúï3VágÁì*1]‚±Ma[ër¨ +a]43/'+#-%ÛFÀ“811ÑÑø{ -ðƒÉÛÕÉÞ÷;tµÆ«ÅÇÞºDª(PIò%W^F§F¦Sì\=}üƒÃ"ð4 ñ—Š{v@ùÿÚ;¸*ŽµÞ{s“›„$j=ìâéŎØŊ½€  ¢""ØÁ‚ ˆ {AAA)" -‚€¢(°€Ø{/IŒ7¦|ï;³»ç°pèÙ»O~÷*+gÏìüç}gfwæÙé®®3f`db`ÎC˜‹—x#K|=mÀŠU«ñM‰›·nߺgoôø¤ÔŒ“”)3ð¥LÈ™á+æ_˜ÔœÍ:~ôHB\̾ð°];ƒƒwïÜƝáL3r& -Ÿ~ ¢¡JÐ×ÑÔ03-éÐþ}»wnÛ¸vÕr_ïEž0ßõ˜é6ÃÕuút,û´²Ԉ“¶—Iímm ó>°v7í¨QHÚªµ¾¥ËÞ**Tu•ÝÜиE©²]g³^懌c5Þ~âä©0æqA3+h6hΜ9sç΃À$‘¹˜Àô”+eàÚµëÖoØHBlç®Ýáû¢c%&§Ï:“S˜)3¦O$LpáïÉ ¤º?j_Ğݠ=û¢öÇ%9 -­‚Ðyϛåæ2u’­ÕÈ!zw뤑·m ˜†ê*æ¥èLöý7}±cG&Sw2ë LÇÙã+òæy-ñõ_±*æ4±n÷ÏmíÀ°D–,ÌÈèh‚òàÁCññ ‡“Ž$§MK?~"+ûl„)®}@™þò«.’ß~£C%4|i*úçœ9uòxú±£©(rŽSÙçr/Q¦ì Âß0Pÿøãr -Ò.^‘‡=·H´gŸ<ўp06ûæ°Ð]!;ƒwì؁%*;A}l%íe=Ì©Wøû,ñšç1ÃÙÁÎjԐþ½ÈZšæMÔ­MB•l‘-ïü«—}ÓÖVd³wÿ!ÀtŠËÌ9žK|—㻡·lÛLù……í&ƒ—={ÂÃÃ#ظ$,”À29%õèÑ´céÇÑaùÌ9@š_pýæ{x_éº}"¤O¤z1ç\ö©¬™Çg?žy" æ\ÄìLÉtˆI¾üA¨r ˜Fûõ‚¼‹9gNÈHK=’ð@lLtä¾½áá{ð•œe'¨ŽÐÐ]Ð^vÀìkÓzòJtÏ93§M¶³iѯ§i{HÀMi¨2[´ÊÛ"F/ûVÿ¶v]â¨éÜÃ|ðH+`ê>_#¼vã– à°Ý$£¢¢A1¨ýû÷ÇÆ q™p˜Æ% Ä÷dfž8™,ΜECH@J6WШZ¦,’ß0{$q¯éõ‚üKrΝÍ>}úÔ©S§O““\¢Í‚œ‚K¾ü¡=F;>ªø¦¢K¹4ÜÓR““'Âî96 -SfªˆŽÂ×Aîßcí•þKÎEª–#p-Ff‚¡Zë[²›²òo5æ%ä¥zø¾‚†M[I˜M¤¶“]Ð_!` Þ  ß½?6‚¢1>E:; Kd™JÂâòÄɓYˆ!;û 8€^ºœ&· L!õ’3zL):We¨ÞºqõJÞå‹rΟ?wîÜùœ\Ú,nÜbš3t֞Aÿ¸³ñ浂<Äz:ëÄñŒci©)ÉG’’±‹N(CAeÄÂö»?:roxÞÚ\àƒ‡lÇлk% Õï*êµèÕ´¯4Å×:Õi€o‹i‡s£qÝõ¼EøÆÙ aø†¼x‹))ØÉ¥ATbXfа–„$¢ÌÉͽ8/]ÎË¿R€þH·ïÞ{<È¢¢×…˜þ¡›€êCÜíýZp½té"{@JšEa¦‚´T¡ ºf´ÈÃx?CóxFzú±cPä£e'ÒáC$〒|LdDØΠM+|Íusžd3Ê¢_Õ6d‹¬ŽEA9Cý‡îKõÈÛbˆ/îàÇõœ+ÖmÆYî'/ނá -Í«™'ˆN‚²hXR–H’0¸œ——ŸŸp^½†ž+·ïܽûHŸÑgm:LuˆL©B¤Ý¹^ÎW ®€ + ¢É)„ÓBEK”ÂJß5jÕ©Iu¡k׬V¥b¹ˆð¢…ò‹Z³Jñ6ÕvíRBü­%ð7eê¼eë·ï;zL½÷àÑãǏÑÕ«Ná¼bÁ `¥^1[7®[N­Âˆ’5K–,YC`&ƒá4<¢\Å*úªÐrYhQ@¸€a±o¿lª­šBJRN©@±Âߘ¤Á£§Ì]ºn™zûÞÃÇß|ó͓G÷ïܸ|îÄ¡Ý[Ö,;5eX¿„®R^©hÁPºF ó¼8“pZº|¥j5ëD6lÜ´Yó-š7oÚ¸aýºµªU._:¼( ×Æ¥fÙT[5UNIÂßúÍ;àœfòœ%k·î=‚¦Þôä鳧OÁÕÛ×/9¶Çƕ gN4˜Ö”(R\͙#向J–)_¹zíz 7kѪu›¶mڈªÐuŒ«B³©iьð—…¥ÊWl&æ4³—¬ÙºG˜úø›gϟ?úäá½[Wϟ<¼gëZèªc¥®Z»JyRCñ2ÇÜyò"•©P¥FúRM訨¨íÛ¶nÑ´Qdíê•ÊEˆîÆüÙT›µOñWšÓ$9aÖâÕ[ö>¦>xüôù‹—/ÀÕwo\>{üÀN£® +Óè}ò烖?¬P‘â€HUkÖmФy«¶:FwîÒ¥st§¨v­[4iP·f•òدóŸÚ`P²aS…¸O4$§4§i‹Õ 3­Þ¼M½óàɳ/_½zùüéãû·¯]8%uՔa}iµ¦vU ”… †……(X±·bU,óݲM‡N»v‰‰éÞ퓚Ðt•MMƒ¦9§©Ó˜&ªãg,\…¦^ S_¾zýúõËçß<ºwSîªÀ €¡«–‹(Q´H¡B… +ãåbài­z ›µjÕ¹[L\|„ñq1]££Ú¶lR¿NuÃڕ^<¥±}S™š#_Áeh¢ß³+7í:t’L}þòõ›7o^¿|öäèª[Ö,Á¹jŸxÚ±øSªDñ¢E‹+Q²4ޅR¯Q³Öí;u‰‰OèÙ+)©WÏÄø˜®Ú·nÖP$5Ø\ʦںÉëä®nÕڍZuŠë3l¬bêÃož¿zóíÛoß¼~ñ”ºê±ýÛ7,Ÿ?}܈þ‰Ý¢ZAW­R¾ .ė,U¦Iàj—¨6¢v0›š¦M5Q͑·@ñҕj5DS‡Ž6ÅÆ]…©/^ûö»·oß¼z]øЮ͚ͫ8 +WËÛb‘ÑJå˖Žˆˆ(]¶Be¼ +¥y›»Ç÷ìÝoÀÀAƒaéàĸnÚµlY³r¹RzS=épïM›ÑDUdÐԖc{MASw*¦~÷ý÷ß}‹]õîK§ìTš3%ehß]±paͪ•*”+[¶\ùŠU„§Qczôê;+6tð€¾½ztn/®ÄÃU!Áâ$wT[7-Sk6h)å WlØyðÄyaê[0\}õìñý›W¤ñwÚ8LëwlÝ´AU+W¬P¡båª5jG6O»Ä&$õ4tøÈäQ£’G Ü¿w"U#­o¸³MåÑ×æMR*P,¢"å {3uÞrÙÔ§/ß¼ýþÝ»wß¿}ýâOܵ ¦ª´XŽÕ(#kרV¥J•ªÕkÖ©/ºsýâ©Ã»7¯^<›öµtíЪiƒzµkV¯^½fíº²§} 1:eü„‰'ŒO5bHÿ¤Ý:¢©•q bžYýyF“6íS‹š4õÝà*¿÷ ‚*mlÓ¼qýzujת]§^ƒ&-„§‡&f§Lž4>%yØÀÞXµR´5{–@ ~™“lÝ,è©Jž¾üL}ÿþ‡ïß¾zþ&5gŽîÛ¶nÙ¼©c‡èÝ®eÓFõ#ëÕ«W¿¡ÞÓaÉc'Lž6}ƌÓ©)˜•M¥m¥ +ürGµm3S“ô1Uoê{2õõó'÷oÑLu=ÎTGLŠëÒ¡M‹&4hаqӖȽè騱§Î˜5{Μٳ¦O™2rp_*™Y÷¿„æÎ̜”FMsJô‹ ”"L=yáúÝGÏ^}ûýhê; %0UÆ_Ü×Ý»G׎íZ5oÚ¸qã¦Í[¶Ozƒ§ã&M›9gÞü æ͝5mÖÁÂ=¸÷æ"ø5à¤ôþ&þDÍh?¡zž:Uš§jšz|ÿ±ÿa0 «ÑíÛ´lÞ¬Y󭄧ÀÓÉÓgÏ[°hñâÅXˆtÊx,Y ¦6©W£béâaš$s‡T7S¥Ž±rFéÐɋ*SŸK=U˜:jHßĘÎQíZ·jÙ²U›vQ»÷H0=3ÑÒe˗/[²hÞ¬iFSi-\R¯Q g4üòèkóf¼I)«Vî÷˜úXoªˆ©RöW˜Ú¯gl×NÚ¶iݦmûŽè)ÖkeHW®Zµjåò% æLŸ8‰J˜Z +§©¿ÌIiÒ4–Þ Vi®Ú„ë©7î=~þê­dê·zúEP¦Æu‹Žjß®]ûài|¯~CFŽ4}V!]³vÝÚ5+—-š‡¥ ˆ}jÕʗ*Š3¿Rmßԋ丞ZÕp=uϑӗÐÔ×dª˜§JÉßm¸ýMíß½s§¨Q;uOû‘2=]¹f݆7¬[³bÉüY“©VDÇVëT-W²H~ ~%NâŽj˦uîMÞù0w>lÙsäÌå›÷Ÿ©? ©o^>}xç:­¨®]:oÚød45¦kt§N¢ÁӞ} 3aÚìKW®Ý°i˖-›7®[µlT¤c«F`*NSÉTN=¤E3˜ÑÈÏJ–¯^¯Y»®‰’'ÎZ²fëÞ£zSßašPŸû=´kóš%s§âT¥W˜n]:wîÒµ{käßAG}š+çŽܵ ËïL=l`Ÿ^ ñ±±qàiŸCG›uõðtÿÁC‡Ø·kÛÆÕHTdjóú5+–Æ܃ጆG_6¥Ý8œ=wnЧó©~7ï9|ú⍻ž¾S¡} ˜ì{ñ4Ž¾+͞2.yè45<íÙ¯þ›4cޒ•ë·ìÜsàБ£GÚ¿gû¦5ËæáÑÇÄní›×¯Q1¢Xœ¦âŒ†á×æM«äzéŠ5¥£4“fãQ„ß{Ÿ½|ó-xŠõÉ}züÄñcGî•*º€©]ÑÔ +˜{àMÚ4}GÕ× uD¥BÄI¿÷ÉÔ·¸—¶]>KgTiô>¨šÚ#!1©ï@A¾KWoܶûÀác'N:uâØáý»¶`•aj³H̆NS~m٠ˈzÓ-ÖT’Ç÷†É7"'ü>yN¦~«ßË}dï¶õÀ¾8úì›Ô3!!!±WŸþƒGàÕ'‹W®ßºkÿác'OŸ9sæԉ#Déñ#ú'vmG¦Š„’á45½¿Š?MSuTé‹Š5ꋊgòIýVîo¿¥ŽJ§.îÚ¼f)&tG éߧW"xŠƒï°Qã§ÌZ¸ß½‡¨ú\ünýòhj˜Z¯zyʱ©iÐtú_¢Z«8wÄ#Ǔç,¥Ó©—nÜ%Sß|+º¸xšŠy,š3uüèa0úöJLLì™Ôw€DI«°¢áѓgÎ_¸xñÂÙÓǁ©+Ì@S»´kZ¯šš+%”\ÙTÛ6£Žjx3˜}©âéÀIž¾xõú͛ׯèxÔ:JŽ˜4yìÈ¡`ôS{‰Ž:uöÂåë¶ìÚäęó/_¾|ñü™‡÷ҝ©…óçR%”ÒûËø“4ᩄ¾âbÆ|…Šë+sÃè»pÕ¦]Ož¿Šœ„¦¾~õ;*Îgöïظj1aÒ`}{uÔÕ·ï=Dµï®^½rùÂٓGöíØ°R2µ-˜Z®¤œúåiªm›NÕQ±£)‰™‡Vb{ãè xì4•3¼}ûæõ+¨îÒª…3'°©iÛO%J"ôµm—}‡¥L»lݶ½òèK¥^<•:*&–Î3ì¨ú9*uÔ#'Ï]¾vóö»wnß¼zç?›V-š9a$›š–ÍÀSið…9jXQÑQÅ­43©.áñs—oÂ苦¾|AõêùS‡)ñ0[ê¨=Å|“ISf-ôÅb²R5Ã{wn]¿töLjW£©ØÔ´kr@%ò¥Á/š/Lw’CDíÑwhʔ¹0I݃™‡Û4úB£ŽzãÒÙãDâa"¦}E⡗”õ‹÷cì;rêü•·ïÞðàþ½Û¢––dj"MiØÔ4hŠ§P¥Á7_ÁbÄíÕØQ±€(bÒ¥bô})wTÌÒúÌÔñÐQqŽJB¤™ó—­Ý‚‚/‰b†°ìÆàÝ[V/ž5Lí*ÍSÙT7a@u÷ô¡Á()¼låZ ¤+±£nÙs1éÞ£oÈT} %Lqu|’¾£&àèKó¼ód/uÔ;÷>~üøу»ø`Ñ05™MM«¦STið-T(©^Ó6b“}gŠŽzæ`’}±£b%%C(:*®Ïôì-0iÞÒ5›wÀŸ’j>~x’Š{·®Y2{RòÀžúܯ´ïŒ3J6iŸxš)s|K•¯V§Q˨n‰ý‡*"ªaG…9êûR±I£…Ô=hôM;yÖB¼ò~ê +ÀÕãož>{ +ï-¨ïݺL5°g7\z“úlª­šðTÊ:H5$gÞ@¾U`ðm×%¾Ï¼;j•ä6ì¨TêLÎΙ&:jbøø¸:LÂ$ªù|]*eøL d]:gò¨A½ºµoÎKo6n:½§2$IÉ·F$¾½Ž?}þrœ£žº wT˜Ï<ûæ¡A†pæ䔑ÔQãÁԞ½û ‘2ibÒîC'ÎaG¸‚?tWœºY·lîäу{uï€; ÉÙÔT5N§{…§0Cõ̚=7¦ˆ|iðMÁ«K𖋳—oÖ$TÒ~³¾½ £âÖ$}ÇM!LՁ¡{K?E‹:Ç÷o_¿lî”1ƒ“b¢Z4¨YQµ…w>|^Óéô–Jž"ø$eËŠµjí†-ÚwéAƒïB½;ÆBY±ãaòؑC £ö ýf½¤ÑwÉjÀ$xnÞ}ôÍó—¯)Yü748°cÃòySÇ éÛ±%n•7žñ¥Ïj:£f¯òTÌP1 V®U¿YÛh _|—­Û*ó ¾àé+ “äÓEGMˆ‹‹OL¢Ñwæ¼DŒÒ¸ªóšÖÔ±:Úµó'îܸbþ´”¡}b;¶jXKìû͒9“áù(vÕ¢¦Ó}ê(Ýï$<õò3T¨õš´îÓsï©Ç!%=Áaô5¦}%L’7†bGMì×#±wiô³ ÐQ_ˆB†¯h?酓‡vmZ¹`úØa}ã:µnT›vè«7s³«ÿ­iÙ)[êˆ÷£§>™’ò†jõº[vè–Ðoè˜É³ÐƒÁ÷µÁBª4Ÿ‘·åÇÇ¢©=ûàè+&©¸MMì=|K›„ñˆ†(¹´jáŒqÃûÅG·i\§JYƒGMœ£¨4Ù¼G¡w±¼„Ñç&Çö㡨9SÇ'ZÄáQ 1ú®—Vuä:†ß¿}#—\Ú³“¿´öÖ¤nÕr†§ÞœõÛº¥·-Ö¶ÿþ©íDCÉRÅS_„$˜¡B@Ã€:mÞRJß"ù>¤Ð€G¿1t&õ“ÏÏ$&õ2G_˜¤ MXJà;t5ÍmŖÞöi4Sî}Ò {'Ù) uq‘®–Æ+k1;X HxY‚¤¨î‰ý†Q@݀kgh¿áòÎóoÞ½!n.Y%0©_tÔîÝcâzàA·1úÑ1IÔüøðþ½8u~ûªºuc}Ñé®!pՉ: ŒUœ‘l5tTíŸ2Â*ÍÀN7ÉNºWÚK\Y‹×›JžV­Ý y»ÎqIGŽ›6wɚÍrÿ zú=3~‹*›/ÀIjR‚訆£ï¾£g¤:.ïÞüñ§üðÃwo^K~èªAÂUw77W›6ƒ/ÆEï®llúÛjd©pTæXÉ>©¹+MîœÞÔ9…›þþx]m`P0XŠ·›,Z¢4x àÛ-¡ïP‚¤u[÷:y!‰Š«Á~ÊÖ=À´¼>¤Ò„&.6–:ªÈ<¬0}¿ûá#xú ¸úᇷ¯)aJþ´±TÛ4©W­BD±‚ҍ׾>^žžî¶l_‹›l²pÖQOÚé誱¥’¡ú¡íóꛗ—䦾sdF7ƒ‚ƒñnÓlâÖÄBÅÂ!ž‚§­¢ºöè3x” IÇ$ÑLóǏ>Èõ}¯œ;N«n¸e(šG“ÔäqSaàÞ$¾€Iïüù—_ýõ—Ÿ>¾ÿîÍóÇ÷)­¢Mút˜¼få2áEÂè^Ü?_oo//O[7黑L&g%_ÓÙVÙS½¥ú‰‰‡â5}ûÞEç$;ÉͬYCB²e˞#g®Üyò…Šö*’§ºÆ÷”<~ÚÜ¥zH’=ýøã8-y‹¹>ZêÆ=³§ÊUhÏC?À¤‰´<Ž 4×ïÀ$õ-tÔ_~ýí·ß~ýùÇßûâÉý›—ÎÁ½g³'”D•ìªÑ5ºyÀÕ Ìþx?½-›·¾áWä)F4Vø*ۚ>®*ÝT$m)wà.0–FVòϏ<” ´rçľ’-;¸™3ø™7ohþ°‚…‹§›»j×Oa2à;ՒPu³÷~üñ'ˆŠï¿—jæŸ1.ݑ˜Ðƒ¶†U–DZ8ēço°£þúÛ_þòtÕïÞ¾|ú@T|^·lîԔ¡}ã;·m†×éݜxåu`æ€ÿL¶mÒ÷âK¯‹ ÐXWW½­é䪾›Ê–ŠÜa¬(Ñ@©R ’FÚ¬¢oBç7óå ͟?¬@A¼_/c«X¥FMÑÓ¤#ÆN™mI¯`E~• L^¿dX…öû*‡-ô 4·qô}÷á§_ÀÓ¿‚«?üá»×rúa#gI—Ó7®[of,˜?oîxçupP=zfÛ6ürüñusÁYòÕÍí[ÓÍS‘‡§ÜÍKüõ ¤–U´h³çÈ!ú&ºVÜ;‹+^"¼dDº*¼^£fm¢º‚§ÃSôû’dOþQçãûwÂTÜè 3±‰{Pÿ>I½z%õ§¢è§iæî£gˆI?ÿú—¿Bû˯¿üøþ{ ª7.Š½¿tá‰tá_…2áÅ +……æ͝3GölðÐâé³Ø²á—ƒ¯ Øëc<úêá!&Æéäªâ©´\æ!;ŠóidEÿÐAÑrb˅]FZtSôÍ¢è&^­QºLÙò*U­^«nƒ&-ÚvìFžÒ¦9“„àû=á+¡ÎhêSÙTÚð;aôˆ!úõéÓ§oÿCG¦Ð©(Ĥ³X—&©ÔQÿúûï¿ÿõ7a¦J×(ìÛ¶~Ù<ý…Sõk«%‹)–?_Þ<¹så‚Ïaۆ_ |?𺀽8ÆK¾J½5]\ýÔS´”rÁH±RœÿÐAjxÏp¾ÐPhÑM¹o‚™àf¹òàgå*ժ׬S¯Aãæ­ÛGwïÑ[xŠ§%ôôæ»> §@:¿ê¼{+›ŠÃïâ9Ó&¦Œ6x`ÿþý :bÌ:gŒÛ_(Eˆ˜„õ÷?þøº*Œ¿oi¦Šãï¦U‹fÉw5Á»qËE„/Z¸`°ü¡¡øèymÚð‹É¯K +`ŒG_ÑV‘îÀ!XvõKš*yŠC¯”‡÷ÏŽ‚¡¹ôqz#´‚Ô +ᥴà%˜)»‰fV¨XܬZ­zšµj×­× Q“æ­ÛuÄ»ch’9€¯I¾à© ¿¿‚©bø=ºèwɼ“Ǎ1tð Aƒ† 9Z”MÚ$ö±Ð$õý¿ü†ž¢«¿Áøû¦oÐ6ýµÔU&Åunß²IýÚÕ+W([ºdxñbE‹. O^Ж ¿ønòç…w%ñYÉÈV„ÝÅìðe·ÒˆŽ*í¤Ëe~hi֐ì9såAŠ•ú"øR+-<<¼dÉRz73kש[/²~ƒFxËH›ö»Äôè…ë+hÊ0å(A­°O!&þEð«¨ÄÛ6­Y¶`ÖÔ )£F6l؈ä1ã&‹²I{¤•TÂ$è¨üñ·¿ýñtU_|C—cرqå¢Y“Ç ëß36\mP·fµÊñ~ÎR%ÃÃñً۲á×R”^ +`ŒÏ…LŒ¶Š1ØÕ勻jì©X.K³AÍV Paid-c+Œ®ÔÊB+‡Ã¬¡›uêF֯ߠa£ÆMšâ#­Û¶Šî[‹¨8ä2ð^½…¤÷bâ_ (~Ĥ ÞX½k˺‹æΘË&í”6œ LŽú7hü®ïHטKåÙc:whݬQýºµjT­R©b…òåÊÁ“—±eÃ/%^—’á%`((\¨1Ì ‚E ]5è«_ÎS{Š§ÒîÊÃçʓ/B0- /!Â$ ­•*UÆV[ÕªÕªU3%7ÉLð²EËV­Û´m×>ª#^ü—€Ç_( +O¥%Ô§"ô+qÎïRPÄñSÔÙÙ³mê¥ fOŸgÁR¬ÆBÇnȘô×?þöÿ ý큟H‹<›Vc1çäÁ}{Ævéضe³Æ "ëÖ®Y£zµjU«âÃW¶aƒo¥"¼.åËáP^¢X‘Bòçcì¬^žîÒúü— «:ýRÉS\.˙'_XÁÂ0фi tFê‹è´ÚØêÔ©S·nÝz8Ì¢›Ø3[¶B/ñ΂èÎ]ºb¡å ½z÷8dÄh¼9fÑòµäé9Ì"ø¾ÎÑÇD0‚â›Tcòԑ};°Æö¼ÙÓ§Nž8qâ¤ÉÓf‚§«Öc‘ÑQ%Lú]6õw1þâö‡kÒFpšèÒU +ÑQmñÖ©† êGÖ«[½¶ ~%5kր÷‡‚òåÊD”,L–?_îœÙ²eV¹úeLÕM£]bÁÐMóæKÃq¢Y¹jõxb$ù×°a#l¡5iÒ´i32Sî™ÑÑËظøøxç{o˜‰ Fę4mÖü%+×m–<•À÷ãO¿*çèi0)ñóâ™cvoÝ°zù¢ùsfNŸ6mÚô™³ç-O·ì¤€|›:*axúШ«þ,PIª}·eíòTÐp@ïĸn;¶oÛºe‹æ͚6iÒ¾‘í|' àu‰Ä«"kT«Z¹B¹2¥Â‹.š7Wöà@tÕÃÝ0¬~)S…§tŒ)P,KËÂD³F­:õꋾþµl­5´6ÐÚ¶Åûa¢pœÅž fb>/©7Ì+ûÁ,dðœÑcÇOš6sî¢e«7€%Xwãú |"vŞö·¿É3ÍWT9ô܉ÃûvnY¿zùâóæ̞={μ‹—¯O¥ŽŽõ¼ù=ý;ºªïªôV`íÍ„ZãGܯwb|L·Î:vhß®][xðÖ¶kø}´j ¯ ¼/5¨_¯NÍêU+•/SªDÑBaùrçP¹úeLU:ª8š†G^h ´x©2å+W«Y'²B¬4²Fuìˆ×‡`ëܹs—.]±gB×3{öê-{9tè°á#FŽ=fì¸ “§ÎÀ^¶rí¦m»Hž +ðU<•‡O$¥çx$æÂéc÷lß¼~õŠ¥‹-\¸pђe+×ÀK±÷ØÍÿaGý;4èªðZHQù>Õê|Ͳ…³§M›<ŒÎ¡÷ˆ‹íÞ­k—.ðàѶj¨uìïKÛ6­Z4kÒ¯ìE[K‡Î*»ê)]øe\U:ªtŒ)8$gžü‹†G”«Tµfúš¶hÛ)º‹ä´x\6–€YÙ$aæÀACÐËdðÀfÜø “&O™ +ãæÜ‹—­\»aˎ½:O§ÛžøþòED=¡£ýU +ªxzâò¹“GìÞ¾yÃÚÕ+—/_¶|Ū5ë7mݹïÐñ3RÊXé¨ÿ»p^ ‘UU‚±Lᦵˁ §À¼høÐAúõIê…e#àÁãm×ðûˆ‰Á÷%ºSTû6¼EÖ©‰ùŽE +’«™•mo_ÄT}G¥Á—Ž¼ä OK—¯R£Nd£f-Ûvèع+î&!ÿzcÎZ?hýû0p öLì˜Éhæø ÑK¼žvæ¬9sñ¦Äe+V¯Û¸eûîý‡Ÿ¾pEx*¯ðù? _qü…IÍ­«Ϝ8r`ώ­›6¬[»vÍÚu6é?áæ]‰œ©£ÂOÿšèª _`QÃKgÚ»cóº•K̙1eâ¸10ß:xÐÀú÷Çgïk»ßHïÞø¾ôˆíÞ‚w›–`kíê•Ë—/J®ˆmo_ª«tTù\pîЂEK–©Pµf½†M[¶ŠîŸØ ˜gÀ@1²BmĈ#G&CǤž9žÌœVÎ/ç/X°pÑâ%ÔÅÖmؼuÇî}‡Ž<{ñêÍ»jOE?“b"y‚¯\@W÷îÚ±mËfh[¶íص÷À‘gà­ uu‘ʧŽúH®J]×dïßØ:ŽqyÆå93§M™8~\ʘQ£’GÂs·UFmèÐ!Cð}釵ñ‚«m[6mP·f• +à*ŒÀÙ³ÀìþÅ®D7ªïI…6p+}x\ÖnܼM‡ènq‰I}ûæÁ þ…±FWh&L˜H^N&™IV./W¬\µ:Øú›Èý‡Žž8sþòµ[÷ +O)i+wéêM –^¿uòãN‡?ý¢÷ôŸJG£ünÊþæѽÛ7®^:æԉãǎB;vâäés §ßÅCÆbŠ £·þÄGP\ƆptõòùÓÇq ß¾eÓúµkV­X¾lé’%‹ñÁÚ®Á×±`þ<|_fΘ6‚wò°AýzõèÝ®e“ÈZUÊG/°èªn_æRtiôu‹HåÈJ•«R3<í‹Wä%§L˜2}֜ù0¯ëJ¼}vÕjhk°[¢—²™;wï&+‚Þ‹ßh±ç5õöW.Bo?rpߌ͛6nX¿níš5kðÉWÙ®Á÷±‚Þ—E0§ž5}ò„”ä¡û$ÄD·oÙ¸í¥)/gH0uU:"›Öã¯Ñè+m-L‡½·O{öÑÕwo߸võò¥‹/\¼xéòU°ôî½ÑSšIƒï¿þE®ê`ÑÛ_<}üàîÍk—/œ=}âØáƒû÷íÙ½sÇömÛ¶n݂WrÚ®Á×±qãx_ÖÀìké"º}̈Á}c¢ÛµhT·zE€ó‹®*ÑJë1F£¯_@pÕ ,_µNÃæí¢ÁÓ!Éxð‚%ËW­]¿i3õÅ]»vCۃmïÞ½ûöíýòÈQÑ/¡S•xOÁ¥K—¯\/nÞ‚`)® ¨Š§²%Çѓ,ù€gM_<}òðþÝÛ·n\¿~íÚµë×éCŠ×‚>B?øþë_ÊG`oDžpo*zxOt÷³§O?zä†ç}ûà¡÷جáW±{^¹}ÛÖÍׯ]¬={ú¤±#ÑÕNmq/MùRÅ°«ÐiÊ/0þê¤K(èR=¼¯ wþÂáÒ!Òî‰ý°¾ÂÌy˜ Û´uû®Ý{÷€Î½ñðlì°[¢—§©[B¿¼|åÊU´áƍ›àĝ;`èÃGO°HÇkè¦0ôÒŒ‘§Â1W•\}ýòÙ7=¸÷Ν۷oß¹{O¼/_K¯…„ÎÊ'žl|õüéc´õúÕË/œ;{úÔÉǏÃ}Ć ¾ŒÃ‡ð}Ù·w÷Îí[7ajsÞÌɸ<”нcë&‘5*•]5ó—º]§\iŠ×:e͉·ÅTÀspßuò8¼qvÕºMÛð†¼Ã¢/ž:…AŽÚYè•Ø-/ˆn ^’“håÝ{÷=~òÍS¬ôæíwïÀÚTô‡ÊÓÀàêxÚÿÅó§àëÇäOKéµP{úohŠ«¿‹B3–xŒýý¦Ç/œ?î<òÛ5 +øðœD ƒA~ÏÎm›Ö­Z:֔q#õéѵ}‹Fu «¥#²% +ÒØT{ÃKõ趪ċ'øq?笅Ëð"˽tñàŠW/]¦vÚUÑ-…—è$yðèñã'Ož|v>{Ž5WÞ|ûö{~B<{þüù ,ù +¯˜ùoCýá=dÂmjO ûÙdÉO?üð ¿~õ’~|ÊØM »ºþð3ċ®âÞÚð¶¾xöô tø÷ïÝcù-[6ü.n܀÷åê¼çÔñÃûwoÛ¸«dŽÚ/¡[‡– kW¡Ëî³Þ÷™–¤$s’|O­tWWdSè¨t2xÞRðtÏÁc§Î^¸|hE2º#¶‡±SR¯”¼D'_á $oÞ`‡·o¿ûî{4:)Zú«d©ÊSÃ~FËåÐYÑÖïñl9µ·â½€ùEÕÕÿýïO]ý7ÇÀG¼ÿáûïðÅ ÿäÉãǏá#?°iƒoãÞ½»8@ð¾€ùŽ=Ûñ×éã“%Åâ­ê"ô% +¾@P՛ª¿§oJ¬Õ E©p –4߃·ùà儵iÃï 8»t ·mÀÓ)Ãú%tmß¼AÍJeŠË£ÛîuÊåÃR‘}é + Ž±Iƒ’'`£­x÷À…+0ï€ ûLVE{­î”è$ í#´ñ î¿ÿõ7½¥ŸtScWõ¶þüӏ?~üøáƒø,å½ÀX-O•ÐløñÍc¡Ë¿yƒûʶ*þ‹¡€¦ÖWp)˜®†œ1!y`¯˜Ž­ÄÙÐ\Ù¾Ð-®2ü'I°U¨^¯iÛÎñxaÕÄ9pìôL¹Šº­¯…o©?~'ú¤¾S +'ÉH´Íü7ßÿ†Ç]ÀQa‡±§ÿùÏ ù‡X…£Ý…¿þúË/?ÿüÓOâÃä÷âOދÿüGû3ÄGü,uy<§í;[¶·¢a¥  +ž?Ã<ºzt?n{›=yÌÐ>âˆlùREÂrS-S¼oÙé ˜ªp’|ýeóö]ûÀR¼xnåVƒÄʁ¯ò Ô©II²R1Ïþ†n‚Ÿ¸_wçê-Õ{úŸO<S~ûíW©Ñ{¡·ôïŸñŸÿ(büò«ñ³èóÔéßÛ¸ÑwñNŒñ¯(‹uw]`i™ùÓÆ § ?#õ—h‘›Ñà70+^ÖU¦R­†-£¤{V‰s+TŠ÷%M4ßÓP(µŸändÐ'e©ÑæOÜ,ˆ† +7äÙé¿ Q‘:Úÿíh` +îò–>Oõ^|òƟaôj`Ÿk¥^ÿӏ6nEôÇ*$â.³³xfzÕ¢™aüíށŠ9a-SUÙË´7¿!9ó*Q¶JíFx«Þ1Sæ诋Áå®7ß½¬BÊýQß'e+õ> +/±ý?2WÃMXª8"w4ÉWÜ;ª¼3~/4?C­èëïôfüfÐí±qûYÄn¬Ï…kÁâ΍µKæLMŜ°–©AÙË/dª ™Šð+8©M´t§)]~YÔeÀ”+Oê{q—4ðQ4܁$v7üC,Éhzjèˆd úŠ¶¾fß ­ÏøÒ»!zý_õ=ߦí7»?âRmÂc#Û×/Ÿ7u¬\Ì©¬ÁGi]õÝxF“-WþÂ%ËWNê’!uÆ•›äã½t< çý¿ýErPéŽz+ mÔ[)Ùià¨BHšŽè-!cÿÏèÓÌ¿ZŸñ’±ý^´ßmÜþ*Pk9Ñ©«Ò¹çéã†÷ëѹm“º׸¦ý¥†¦ÒŒ¦H©òÕ#›µ3¼&œŽ÷ÊÇ^¤È¦îŽŠ•Æ>þC±SvԄ¥²#²%ÿ"þ?{ïVU’®mÓ9ض9+fD‘¬PE ‚äœDPT@%‹¢bsˆŠY1gÌ9gmíî鞞žþfæÌÿ×[k­[½©MÍ{Ÿë›3ßuZ{ïºwU½U«êY +|Ä¿Cúq(|Ôª:w+]Û+Û+{;d™Öê«ÑåR…e*¬h8¸xD&Lɜ½hÕ¦®×{_ˆ×^~ÿ§b_¬Ð#ÿUQ£ iã^ZRVâT2òßÿ“œˆf•þÊ?ÿ](iý¿ÿTüqü?õð‡¸¶†g~/èežÓG÷)$t §oRéV[oR¤J{°L¥+¯À¨ñðî÷՛w8&DÛ¼’]FR”¨Ü!ßQ)s©$ô}:*h•Ä¾ï‡Q•¿CñCþKõвîwÙevY@-}=ŽüM*mkçM*ïH%ËTGWï èÄÔì9KÖl)=xâܕ›Âe$áɶxÎö]•h|ÇæŸUTòßÊþÅ¿ªJÇ{>«*'ÿOvìX¸Ì^1 ¶²7©Ô†TØPÒîeÒ×Ƒ,SɊ&gîÒµ[K8O¯‚ÂÑizÖà_ïøüÅ*(UTRÑlUþ–÷ýj3Koˆ—Ùå±ks³S'HR•ß¤¢F©J[¿’TÛ!#FÇ$¥åÌ[¶vÛîÃ'/\½ý®‚*œÈü@/ª¶Ïw•TÿïQþ3ïéøªá?²So¿üôb®^8yX!u¸v_#—J·~a—¤Ž›”–;oÙºâ=e§Ê¯ÝyH¦ÔŸùíw…ó#2Xe“'V‡jµÒSodü…„‚;×ÊOÞS,¼¤ÂëqziwªM©Ÿ)HÕ3éG¤ú„Ä&¥ç’eªL*L©‚Ô­®Æ?÷Ró¿A}€UAê¯?¿¥–©EórӓbC|„wiÃ;„ýZ“J÷ó»ëõîg;¤&§çÔ½e§Ë¯ßyôìõ[2¥þó½û¼KÅՋڬBW%ãï¯{ûúÙ£;×ËO—íßy$Hí'¾ÈªÓT*¶~Câ©Û÷9}ñúÝGÏ_ÿø72¥ +µ®™T/’U¸ ð¿ÿíÇ×Ïݽ~òÁåR…YIo'«%©_V"uZ^áò÷KeݔğJo'c$Uzœ*Huó ©ó—o Ro¼+•uCjïJ½A¥nX>ÿ]©Â³7¶R÷9C¤>V”ŠN+V¤>&RÏÙ'I •Þ#ÈX*¯j4«žK[ã?tôýý·_~~#J=¼gÛºeórӒb‚G©½´;µ©ß¨[*±ú׿*HíRmAꄴœ¹K×nÛ}ø䅫·<}ùæ§_ȤJ»ª¨U¥¨Ýk%&TƨS2úþý—ŸÞ¼|úàöÕ 'ïÞ¶véܜ´ ÕѤvTú׿ªÍi%R-l]½ƒ¢'¤fÏ]ºfké¡ç¯Üºÿ6¥]õ_ÿ­*ã=jÕe´¢ Õðïÿ‹vÔ_aë÷Éý[WΟ8TºuÍÒ¹Ù©¢ƒ¼]m,ŒÙHmÒ¢mÇnºDê`WïÀèÄ©Ùs–¬Ù²ëàñs—o–Ò۟…®Jµþ[µfŠbU¯Tõ2ÿ>ÿM• +•ÔIÏß»yùÜñƒ»¶¬Y2'{jbt ·ë`"U·[Ƕ-šÔžÔÏ$©ºé™ìâ5~JfÁâU›w8vöҍ»È¤úéªÿø§ U%ü[%³ªÕª¤TÁ„ˆ*¾ (ýç?HGý‰L©îÞ¸tö؁›W-.Ȝ2>*ÐËeðs#Ýn$©ŸÕ–Ôúß7iѦC·žFæÖÃ="&gÌZ¸rcɾ#§Ë¯Ý~ðätUbõw¢•xUJ‚e^UgU©š‘÷,хjøƒ(ý8…ŽúâɃÛ×ÊOÙW²qåÂY“"<‡;X›õìÖ¡M‹&ßׯe©ÍÛtèÚÓÐÌÚÞÙÃ?">eFþ‚å¶ï);yáÊ­{Ÿ½úáGbõïD+ñZsþP@’«èUEZ••Š>E2jüe~'JÿNœþøëgïݺrádٞí–/ȟ‘áïálomfسk‡6ÍkUê—Djãæ­µºô04í?hب1ac'Â>áºm¥‡ŽŸ»tãÎÃ'/^½ùñ翁ÖßþQs~—#)ÌÊ´ªÄªÌ©Ì¨ ST!£†ßæ7Pú·Ÿ|ó꜇wn\:wüPé¶u°K8qlؘQÃõ75ìÑE«uóÆDꗵ&õkQªŽA«Nn¾¡±I°¦Y³eçþ£§Ë¯Þº÷èé‹W?¼ý‰hýå×_ÿ®~‹Ã:í¯ +U%Nÿ#¨ÿFÊ +Ž +¾È¯¿þB”þôö‡W/ž>ºwëjùé£ûwnY+š¤ØP_7§V} tD©_זÔωԍ›µjßYGŸnþ’…jâÔ¬‚EdRÝ{øĹK×oß«¯ß¼ýñ§Ÿþùo5æ‘_¥?P+y{« +¬Ê»©X þAGÊP“ðo–>Å/5û2¤E~úñí›×àôþíë—Ν8¼—L©‹ +²¦&’e*ÝúÕ×éܾU³Æ êÃCuK­'Jý¶A£f­èæo_²Põ +„J)>Œ¿Žž¾påƝûž<#ZxóæíÛkÎOÂ/Dèý öŸÿ”i­±U¥nJ•ÂÜG„þJ-‚ +š~—·oß¼ù(}öäÑý;7®\8}ôŒ¾óó¡N +ôr…½ØúmÕL|òö©:7”¥Âca÷a€Ãpÿðq§åÎ]²zéªÇϖ_¹qûÞÃÇOž=ñòիהj̛7ð y †‰Zaºµ*X­±SÚMAé? œÉïg *ˆŒš!4Å«W/_<öäñÃ{·o\)?{œtÔM«—Ì͝6q\¸¿Çp‡ÒÞC£ïjK*}L#-TIùK*%wßØ ©Y³._¿u×þ²Äêõ[wî=xôøÉÓgϞ=xQC^¾$¿òÞÿ£ä•hýãXçSÉ©¨æ>Ð :ˆ +BM¾€Ø¤Ež>yüèÁ½;·®§'ÊöïÚº~ùÂÙY©bC|ÝIDŠ_ù2U½i”wôaMCÊ_ƒ>–dRõŠJH™ž7oÉêÛK9qöÂ¥«7nݾ{ïþƒ‡ה'„§OÉO„ü6^°N½­0¹þC°dµ&Uzÿ),:þs)‰Kpñô)|Šš}hŒ‡Ü¿w÷ö­W/]8{âȁÒíW/™—7=%!*țL©–} Hñ +šZØϧRe URþ¶ïÜ]¯w_›Á.žþác“Ó²f/(Z»¹d÷²ã§Ï•_ºríÆÍ[·ïܹs—p¯†Ü'<€_ÈcèýdX'^A«ØY¥¾ZÝ®*|E§’Ò×t¨„žõèáƒȧ¨Ñ׀¦ -rûÖÍ×®\*?wúxفÝ%›×-˜•–<6ÜßÓe°MßÞzÝ;·V4²eªú¥Ê*%m]cskûaî>ÁÑãS¦çÎY´bÝæ’Òý‡ž8}îBù¥ËW®^»výúõ5ä&áÖ­ÛäB;ÿ#˜®_¾­ö­«Õ€•B7%ëÈ·?¼&F‰PÚ³îÞ¹}ûÖ-ø$7kòUHk\»võÊåKåΝ>qôðþҒÍëV,š“;=e|t°û0{ksc]mY¤v© +kšo4lJ&Õ®= L-톸zù‡Ç%M͘9o1±º}×Þ‡?yúì¹óÊËË/.Ռ˗/_¹rõêµë´ó±ž<­o龕hµú]U6øÒù”8…nú†V¨Äè½»wHÏ¢.®\!Ÿ¤ßš‚´È…óçΞ>yüèá{wm'Nϛ™15).ÜßËuˆ¥©AÏ®dJmÚPVüªqE#/…J©yk­Î:z&¤þu&]5*~bZV~áâk7n-)Ý»ÿPّcÇOœ\Vv8ZŽ;vüø ò9}æ,Œê0[S­Ï©UkÖUeUÉ© ”½|‘t­3§O$2Ž“Sí/B[¢¬ìðáCìÛSº³dÛ¦õ«‹ÍËÏJOêçI:ª•™‘0ú +Sªºë¤Š“jÓm:té¡ß»ïûanÞáq‰ÄêÌ9 –,_½nã–mÛKvî*ݽgÏ^¾°ŸpàÀAò);rôø‰SgΞ/¿|•¬™î?$•ZýûoJp5œþWê¨P#Ó—ÏŸ>zp÷öMRÏ\ BO?v”Ê8xàù<Õþ2Ð{öì.ݵ³dû¶-×­^¾dÁœ™Äib\x€·Û0û}{ë÷èÒ¡M‹¦µ4¥Ê¤ÒíÛCW5µ´u>Ê'0‚XMËȝ=oᒢ•kÖmظyËÖmۊ‹·SJªËŽ;vîÜ¿½ûö<|äñJ´^£τ¾J¦ÕšI•uTúœ“ôSâô>,$ɪƒ%cåý{‰ bc'ù@Õû&BCoÛ¶uËæÖ­YY´dá¼Ù¹iÄiD Ï¨áŽ¶–¦ÐQÛÓÑWaJU£TY¥DÇßFÍZ’RIGßÄ¢ÿÀ!®¾Aqã'Nž•7{îüEK‹–¯\µfÍÚuëÖ¯_¿¡šl¤lÚ´ióòû(Þ¾ƒꇏ'Z/^‘¬¾ý‰žQ8¼X}©¿Ã„ßNo^»LV'Ž•Ü¿w7ô­b°±yÓ&ásUë+‘ÖX·níš5«V./ZºhþÜÙyYÓ§Näëá:d` }R&µlÖH}Õ^'É&U:þʺªa2;«á1ñI)iÓ³ró æ.X¸xÉҥˊË«Î ++W®\µz5ùy¬ß¸‰ ê;K÷8K¦‹W®«OžÓG·5éªÒè+ë¨o^¿ N¯^ºpæ$Qºo÷®’â­›7mXOt¬^µjåJù§«ê÷‚æX¶té’Å Î-ÈÏ͚ž–’Hœ:‘Á·¡bG…ÑWÍSªâø+”J¤«vÑéE`°ê7>9%uZFVN^þ¬‚9sçΛWXX8¿Z, ,\¸pÑ"òóXV´båêµë7m)ÞA´–;u¶˜áqÐë7?‰ÇÜþ]­Ë;ÿU8‹K;ê/Ÿ=~p÷æµKçϜ8rhÿîÛ·n&ƒåª˗‹‘$|¶j|)Òóæ͝;§`V~^NVƴԔäñqQ¡>àԆ ¾½tº@G¥eR­Œ¾’T¨a©Jºj»Ž]{è›Q«£¼ý‚ãÇ&L˜8yjÚ´™ÙÙ9¹¹y”™Õ"Ÿ0kÖìòó(œ¿pñÒ¢Pƒïܽÿ0±zñê;È,tUiü­žTé,®ØQÞ»uôÓGîÝU²uÓú5+—/[¼hAá<¢cöìY³ÈçªÆך"77';;3cÆ´´©“'NHìç=Š:53Öëѵc;訤L‚Ú·¤ÊÆ_¡«B¬Õ©[O}°:d¸›§pxT츄Ĥ‰)“§LMMKKOOŸVu¦‹Ì˜A~™YäÇ13öœy -]¾jݦ­%`õôùK×nÝ{Hºê۟dãoM¤ÒÑWè¨ðP¬œîÙY¼yڕË/$£å¬™y¹ÙYY™äsI±ŠßŒ´GZZêÔ)“S&&%&Œ‹ +ö÷ñt>œšè÷ìÖI J_YGUûè«0þBWý®! ÀZµ©Õ‡¹º{ùø…„GÆύOŸ8aBRR2ebՙDHI!¿ òãH'?+w&”`ËV¬ÙVˎŸ'·?Î.ÖPªtÀŽƒÑŽzñÜÉ£÷î,Þ´nUђó +òó²3gLO§B&§¤À§›TÅo$4ER҄ ‰ãâÇÆÆD†‡ùûx¹»s8€:Õ/̨ò2©V¤J]µA£&Í[‘i•X56íÛßÖ~ˆ³«»§·¯`phXDdTttLLlll\Õ+1nܸøøøm$Mœ#zF6©¬É:x͆­;öœð)«ôÅhkøñíåá>ÒeØ»–}ŒôÀi»Ö0øÒÒ·–:ªbW¥ð÷©ÕÎÝzô241ík5ÀÎ~ðÐaÃ]Gºòðôòö=ÚGÀ·JŒüüüüÉ/#(8$4<"*fl|bòä´Ù3ç,Xºrݖ’ݏž:ùúOdj(U¼ +ñòÙ£{7¯–Ÿ!uç¶ °7+'#}ʤ dŒŽ  !NüýýüèǬÂ×Ûbôhoo/OQn#]‡:ØÞn€U_SÃ^=ºu¦N/|kGª¬&kU€‚Õ¶Zºêèêõ6³°´¶±äà8Ôi˜ópW×#FnUÁ2jÔ(OòÃíãëGÆó°ˆè¸„¤I©Ó³óç.,ZMºêþ²“ôTk(UVüBôôáݛpvèànx,¶¤ö|&'G§À¿1>£½½ˆò…Ïúñߍ¶Æˆ®®.݇9 utdgcmiaÖÛH_W§k'­¶à´!|ɵ–:ªRWýòkÑj«¶Z»hƒVSó¾–ýØØ dï0x°£ã!C†~$Nr†œ‡“ŸÅˆ‘nî£<½}ƇEÆÆOHI‘3»pÉÊõ[wÀq(2©ª\*©“îܸ|þԑ¥ÅW/[8gffúä䄸èð@?:dºA¬ wvv†*ÿØõ5I‹8:ì`?h Í€þ–}ÍMM@©v—ŽZm[‰NÅÁ·¶¤VfµyË6í:têªÝCWÏÀ¸w3‹¾ý¬ú[[°±±±µµµûhŠ "ØÛ;8 v]Þe„Û(/¿ÀPb5irzÖ̹‹–¯Ý\²ç™T¯ªFêÿÉ¥Â]ˆ;×/Ÿ;Y¶׶ «–ÌŸC7ò¢Â‚HYC&A2f: B½ØۓO*}êü’¤EH» °¶îoÕ¯¯…YŸÞÆzº=´»vêЮMËælœ‚Tq­~ߨI32·ïЉô֞ī¡±Iï>¦fææ}ûöí÷qXJXú÷~¶ví‡8 wuóðC¬ÆŸ˜š‘;gaњMÛ÷<Rï©XêT*©“Êöíܺ~Åbx06y¸èð ?O÷.Æ:†^fk3Ìô‡Ï+ûðóMI›XX˜››™öémblHŒö$½´S‡ödèmÖ¤Ñ÷2§âà[+R…®ª`•ÔÀÐY©ÖÎ]µ»÷èÙKOßÀÐÐÈÈØ؄Ðûãè#bjjjf¿òs°ìo=Àv ý`¨©=Fû…ÇÄ'O™ž3{Á2"u· Uu=õùð+JݲnÅ¢¹33Ò&‹ =W硎ömmH7³ì'¸1#Xúìó=¡IŒŒ ôõzõìÑ]»kgªº)©{ÖVG•uU2 V¿ý®ACÒY‰Ö6í´ˆ×.Ý´»ëèôèÙSW·W¯^z…¾ˆÁþLho·èkiem3VJnž°·;vÐjß®mëV-ˆÒÆ I7%k&N¬~*Xýæ[2³’ÞڔzmÓÌjuèСcǎ>‚Î"]]»ÂOöt]2ˆ™ôe’í Ça𼤒á·`aÑÚ-;„{;w<}¡°£Tõª²sRÃ+X§Š×!6¬„CaÐSÃ|qJ”¡ºDew0Ôµ+|vé{|ð “v!­£>Û¶¡F›’^JfSÒM¿ÇÞÚvZÁª¨•ôÖFÁkó-[µjݺ ‘Kh÷´§hiÁ/~I7'bI1­ohÒǼ¯•ÍÀÁN®ÐS£Æ%M‘7gÑ +¸ päÔùË7î>|úRˆ˜PŒø©šSñ0‹ õí«çïߺV~æØÁÝÛ7®^ +§Â&§O½ð=>øui»´iÓºu«V-[4£Ñ^J•²rJ¥JVig´’î +b‰Y¢¶y‹-Z~€V2Z·†Ÿtr:~w$^IÉEJi£ÞfT*é©>a1 Ó2óç-Yµ¡¸ôà1áÚ$ #P~JþñVÿ«,õ7ñ~7©”Ξ8¼wÇæ5E fçL›œ4ÆsäpؤígÞÇؐ¬Bt´»Š(íq` 6<ÐÇc}DfA¤öê©Ó:…IQD› +¢àˊ­ Dt~G…~ó5x©R–N­JZÁ+ fï$|ári­Õ²U²æíؤ÷±° ØQ³gÏ_¶Z¶Jž¼ýM~ôW9³å£ŒþŸt:ýþMxöFoӕêòEs»*<$331Ô£R;´‡Å-th·Uý ²6¡->A(•)eç´¢VÑ+KÌR·”o?ˆè¿A:n7iJ¬ +ûSÝttõ £ZÛÑ2) ,:~bjÆLÚQwî¶óåÏÈ¥kRՈXoӛQâSriK¿˜vÕl8˜äë9ÒÙq íªÂÎ騴x¥©Ðñ¨«?Ejh¦¯¡¢QÖJ¬Ê´¯ –˜ý’Ê•øúÏÔ± µqÓf‚ÔÎ]» ÏóúÛÚÃàë¥ï”é¹ Š„í¤Ó¤§©?I=õ_ÕÌáú·ìZªxðì} ¥ÝX!ãïUÒUËà9ùª¥…³²§Mž0Vª€á쉉±Ú¥£¸g+ì|#Ύ¢®?CÖFŸJB©Q P*×*xĊj%>ûŸ‹5–¸AŸ Àƒ¼î=õ¨SZ$†“%jêŒÜú€¼B.^%£/æ&Rs¸þ¨^Àšz%…VÑÃÜ÷H©]uO ½k˜Oï»Dˊ%S2­êÀQ…6­Äxºwð¥4š¾¥Ö[ì¯ +F™+ê)y•™ý02éŸË7юJßîpìÉÜRr&>Ÿ™¿t<?tìôùË×oÝ¥þ,æzT?_¦%‰™ohŽpH´lÿ®âkŠàI9<«‰öór“¬êëv+OÌÄ=¾ÏeÞ>®¤f«§AJzrþZ1û™°×R…'îíaBÕ3ì-:õð $…oҔiÙ³æ-^±vóöÒ4-è ×…ü‡¿ÿVƒ|5H¾¢a,? +×Àø{ºêŽ­ëW-%ÓjFêÄñ±Ác¼Ü†«V}Œô{v'0íª Aª°É÷Ù}Vl$…öc­R‰zÊTüØïåùžÔ7p:ž·‹وSX Ž€ëÑã&GÈà»m'é¨Âù|z›ñ•ÿ@󕪯FïþFÓX~x-Üc¼uíò…3ÇËö—nß¼N*å̘:1!6EMœ”š‘;»pñò5ÐQ9qR}nߥá4„ç1:«Id4Šìõ+H®‚˜#¸ÉxöÔ±CûHW]·r)½<™,làÉ*lBÀ‘z2­’˜tU…s +û|ø¬Œk¤~ù•p6:*|I‘Ô·¿­ƒpé*’Þ{…£¡ËV­ß²}×¾CGOÀÕëðPÌà’³ª®öZEöò$ìÑU4çèÔ±ÃûwïغqÍòÅô¨h +Y؄J›¡úÎp¨^8€ý•â9Ž,~°g'½|±pn~6=W"lBØö·€Xèªâi]%©¬[˜JR¿–®æÐ Wtð3¤Hš”:#gÖ¼…ËV®Ý´m‘zäø©³ç/«7nݦÙJ +ÑjÕÏV{$†‘¡GvóúÕ+Ũ#¸ù¶~uÑ₼L2˧U2˺*½ÿ"»+QëO¸5e©ÒÍ2£’ŽjaE_Øñ ŽˆMHž2tÔÂEE«ÖmÚVR +1M'ˆÕò‹ÀsCÌÍ¢ÉjÕÎVþ0¤‘ݦ¡IW¯\*?ö´p‘œJ…È 誓e°]‹>´«¾sæWjŋ9ÂèÛ fTŎ +UÒôì™sæ/&R7nݾs÷¾ƒbø–¬tõê5¬VÃd5ø ëê•ËHvþì™S'Ž•Ú¿gWÉ6AêÜY9Âm~©«ö35ÖëWJ+\?¬½³G=勑 e£¯‰¹¥ðh&Hȑ˜‘?gþ¢e+×lؼ­d×î}•Aü+‡Ô,!W­FÁjô/òÈΟ; ±IǏ9|pÿžÒÅ[6®[E¥æfÀ ŒØiVµ271Æ_:©ÖòÉz ¤‚T˜RÛu £¯0úÂQ3}©Ô™… —._µ–XÝ.$oA®Ò1š%ĪÕ0XMˆ#;Mþ2!ëhÙáCö텏-ׯY±lñü9ùpý-™”Jòñ··¡n÷.ÚÕþ¥RM¥¢T:¥vÕéeØÇ¢¿Y£zÀ5–ôÔÔéYy³à9±º2Zvì*…X¥ÑP5!U­f¹jâ_QFÉ<°ßÞ=´S )«iäQÁÌìpÿM.Õº¯Â¤ŠR©_ ­ÛƒTX¤JR#bâ'Lš:-#g¦Ï-7oÙV¼½dÇÎ]¥¥»ÅPµšÅªÉóÈ ‘lÏîÝ¥»víÜQ²}$í¬[³jù²Å + òs3§§¦$%ÄF†–ˆT#y¥„Rÿ¢ õ‹J¥’á—ƽŒOžœ:=“XS¸ZV­^»nýˆÌÚJ#ÕÄLµ¤ª)&’m/†L²m[·lÙ¼iã†õkiÔΒ…óiêь´)ÇÅDû–z*•Ú^”*E¡Ôw¤ÂðKW4^cèýÅDš  -ó.^²¬hùŠ•«V¯Y³ví:©VýPµÊ"É ”lÝZ!kEѲ¥µ3·`V^N&dLˆ‹ + ãíg ”×4(õ/çTÅeª9=Ä2’Œ¿AaQÄjrÊÔ´éY¹yÄëÜyóYK—.£‰jՉTû@(Ù2ˆ%[²xÑÂó !ÊjfnvæŒôT>Š‹¦)9p²ÛÆʜJ8§Ê©¼úÕî)<¡ìäêîåëL¬Ž?abʔ´iÄkvnÞÌ|!/ òÔ P­º‘jïÍ$£±dK6§`ö¬ü™y¹9Y™4ËjRÒxÒOÃ|!&gðÀýhL“HM¥òu*ÝÎ'kû!Î#ÀjPhD´˜·5ejZú´é322³²²³srrs¥@µêFªUžIFcÉrsrr²³³23fLŸ–ž–:eò¤ä DiLdX°¿¯×¨4'‡>S…§oÂs”ª¼£ô´£ÔQ|˜jm÷Ý=G ˆŠ‰—0~BRòÄIB\VjMS«VžÚÇĒA0YZjêTÈ&›419iÛ‰Ž ôóñ‚›ªÂ©B]َ¾òŽëÆeF=¥51•©³6éªpìR™\Ý<¼|Æ…„…GB ÒØqñ ãÇ'Ò,5)M­zjKF“É’&L¢°ÆÑø¤Hb4(ÀÏÇÛÃ͕^j´„ó¿=Ÿ½Õbø‘Æ"—*=¥½ÁáPKk;{Gˆ{å9ÚgŒ*……GDFÑ$5ˆR«r˜ZUˆ¥ÙdNèOÓYÜF wr´·³†“úú=ž’ƒRÿ¢Êôù—Âø ]UK<òkÞ®;:Ñt/oß14-+0(((XŒR«NœÚÇ“Ñl²àà Oæï7Æ×g´—'$Z9; qhC¯4êë +çY„D+œR…IõK8ÎÒ¨I3Hï¡VéFkãáä<\T‚´,š£&KR«NžÚÇ咉ád4žÌËÓÓcONŒ¶B¢U7ñä=ÎRÛI9‰òÑñ€¡D'éҘ².4ÔªU Éé×JY9¬Û•)Ê]U9>­}‡ŽhøNw4@ Ô>2BMµÀ¿WLÁÒ‚v:u„h€V +9e_±É´ÒH¤XÁ*d­òø´ÎBh PûØ5U"ü{!¥¬k×.å9e ´±tá^£ùgT@ñ˜¾³ÕҘ¤ b–æ§uìø‘jêþë;@L™˜S֒ ¼‚D#dW£þ§O‡ÊQ´*×ú½²Õ¢•Z‰¹Y™Ÿ¦Ę2!§L di$KµRH@B§QNO¬Vžžöáü4uC?D%Ae_W *cݤ€tPÿÙõcª•¦§5”§§}L|šši"*£;õ%¥òŒÿ³wh*"³*vÖ/Ä\«žö1ñij¢¡<©Œf\ ÉV4{î ÖAeI=åΪžö­RxڇãÓÔÂwJIeßVšT†N•©§ØYe^«ž¦^4:©L‘¬V O«˜öáø4õ ô 43©L©§¨õ“÷f§}0=MMTø²x+J*Ó@äZe¡xUËN«”#®>Qí`݆šG=­ÕÊNS7u"ªL㨧äUfVC©†Äºõ4–zõ*ŠÕ,ÁïO·bÝršM=%>*8Œʟ’u›ÕêÕ%X7V‚µ¬€uÕyX `Ý +‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚pB—.vс¶~ñ~õGÙ×ïbí`âKþÿ.~ãâƒÆÖwªo 5¬¾¾Vˆðd.ü×A!aÑâ?¥Ý]Ë@kÔ òÏéٍ 4Ö/Ik”M}/-ý^†ÆZúð?ð_Œz™öîÝ[ËÀÀ¨—¡±©Öh-ãÞfZ&Z†Z£B?柇ÿ›ôg¤ÿmJþõäÈ?Gþc-úÔï҅~DøbæZ†Ff½{Öåðõÿ‡ ‚ ‚ ‚ ‚­d°þ$ˆ*hU ¬?R*3Š^ë4ïWŠZë(®µÖA>¬­Ö5>Ê)j­S|¬S´Zwøx§hµ®P§hµnP5§hµ.PU§hUó©ºS´ªéTÇ)ZÕpª'­j2ÕtŠV5”ÊÕvŠV5—HE«JMœ¢U ¥rHͤ¢UM¤†NѪ&Rc©hUó@©Rs©hUãPT´ªa¨Â)JÕ0T"­jª‘ŠV5 +IE«šJåUIE«„ʤ¢UÍAuRѪƀR9D…RѪ¦ J©hUCP©T´ª TQ­T´ª¨X*ZÕÐ*‡ TQµT´ª¨\*Zeê¥¢Uö TQ½T´Ê5HE«¬©u©è¿¨E«Õú Õ@R+ÓTå?€TµH­(©ê©ê·Z?‚Ô uK­ÎŸAjˆz¤¶ªÖßδ!¸B=R©¡êüD¨ÁgõaݼÀÚ£2¬[ƒX{T†ukpkÊ°n N`­±¬›ƒXk¬ëæàÖ+Àº9ø€µÅŠ°n.`-±"¬ÛƒX[¬ëæàÖ+º=¸€µÄŠ°n>`m±¬›ƒX[¬ëæàÖ+º=¸€µÄŠ°n>`m±¬›ƒX[¬ëæàÖ+Àº9ø€µÅ +°nN`­QÖ­Á ¬5*ú58µFeX·'°Ö¨ ëÖàÖ•aݼÀÚ£¬ƒX{T‚ucðkJ°n ^`íQ ֍Á ¬=*Áº1xµG%X7/°ö¨ë¶àÖ"aÝüÀÚ¤¬›‚X›T€uSðk“ +°n +~`mRë–àÖ*å°n Ž`­Rë–àÖ&å°n Ž`­Rë–àÖ*å°n Ž`­Rë–àÖ*e°nž`íRë†àÖ*å°n Ž`­Rë–àÖ*å°n Ž`­Rë†àÖ*å°n Ž`­Rë–àÖ&`ÝüÀÚ¤¬›‚X‹T„u[pk‘ +°n +n`-RÖmÁ ¬=*Áº1xµG%X7'°Ö¨ ëÖàÖ+Àº9¸€µÄŠ°n`íðX7°vø¬„X+|Ö-R÷am°X7I‡µÀÊ`Ý&uÖþ*…u£ÔqXë«Ö­R·amï=°n–: kyïƒu»ÔaX«{?¬[¦®ÂÚ۟úuê ¬•}Ö-T—`íêãaÝRu֖ª +ëöÒtXû©¬[M³`mCCa­¥ª°n¯:ke붩ã°ÖW ¬›„ XKT‚ucpk•¬Û3XëX·‡ R.A¥\‚Jyr :åtÊ#è”GÐ) SA§‚RyòJåtÊ#(•CÐ) TA§<‚R9òJå”Ê!è”GP*‡ TA§‚Ry¥rJå”Ê!(•CÐ) TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJåtÊ#(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rJå”Ê!(•CÔ#­²DMNQ*KP*‡ TA©‚R9¥rJå”Ê!(•CP*‡ TA©‚R9¥rˆº¤¢Uv¨Í)JeJå”Ê!(•CÔ'­²BNQ*+P*‡ TQ§T´Êµ:E©l@©¢^©h•jvŠRY n©hµöQ»S”Zû¨_*Z­mjÁ)J­mjC*Z­]jÅ)J­]jG*Z­MjÉ)Z­EjÍ)Z­5jÑ)J­-jS*Z­jÕ)Z­jÙ)Z­jÝ)jU7,”¢UõÂÈ)ZU#̜¢VuÁR)jU ¬•¬Û€3Xë”`ÝÁZ¥¬ƒ XK¬ ÖmR§a-ïOaÝ8uÖʪ ëÓHXKQ#¬›Vý°na°nsuú}™ÀºÑÕ ëöeëVW/¬[—¬›]½°n]F°nvõºuÁºÙÕ ëÖeëfW/¬[—¬›]½°n]F°nvõºuÁºÙÕ ëÖeëfW/¬[—¬›]½°n]F°nvµÂºq™ÁºáÕ ë¶eë†W'¬Û–¬^°n[f°nxuºm™ÁºáÕ ë¶eë–W¬[–!¬›^}°nY†°nzõÁºeYºíÕëve +ëÆW¬Û•-¬[_=°nUÆ°n~õÀºUYúýÕë6ekj€u“j¬¨Ö-ª °v jX·§fÀڂjaݚškª„u[j¬M¨Ö-©I°v¡*X·£†ÁZ‡*`݆šk#5‡u j$¬¥Ô Ö­§±°S}X·œfÃÚNu`Ýfu֎ªëƪS°–õ°n¢:k¬[AAAAAAAAAAAAAAAANø ‚ ‚ ‚ ‚ ԓÁú“ ª ^%°þLHM¨Ì(z­ÓÈþUµÖmÞúŽY֟©"~B©à•õ‡Dª„¢ÒO*€Zë&r¥`ñS%d^ÑjBæT4ú™¢W´Zǐœ +J‰Èϼ +ZÑjAÞM©R"ò ¨WªUꬬ?/òa»)(ýâ‹/¿üò+ò_Á+h•wV֟ù2§r¥_}õ5ð ü+ӊVëâ|*:%JÁè7ß|+ñ Q+jE«u§¤›‚R"´~ýï$êׯ_Á L:+Z­ TtJ•~× Á÷ßß°aCòŸ |G´BoE«uل*sJ”Ÿ 4jÔð{AëWÂ,YeýÁ‘÷"ë¨0Ÿ§‚ÒF›4mÚ´¡iÓ&eZåV±«j2 +ƒ/q +Ý”ŸÍ[´hIhÑ¢y3â´BgE«uyGûiƒïI/%F[¶jݺ ¡uëV-[4oڄôÖïê C0ZÕp*qÚ¤ió­Z·iÛ®=¥]Û6­[­‰V¥j ¥j*ŠR¿þ†Œ½H7mÙºM»öZ:v"tìЁxmݲE³&¾oPŸŽÀ°^ÅbIcK_iB¥N[´"J;tìÜ¥k×nݺvíÒ¹SG­vmZ·$µ¡’U€5…ŽJ߆©S­Ž»vÓÓCG§»v·.‰V¹UœV5A*)}¡£’Á·qÓæ­Ú´ïЩK·î=zêöÒÓëÕK·gîݺtêоM«Ê¬²þÈ;ˆRéŒJ:j£&Í[¶iסSWíº½ô ŒŒ ôõt‰ÖÎÛ·mÕB°*–À8­j&r©0£6lÜ´EëvZºvïÑKßÐؤwBo#C}ÝÚ];i VÉzJ`œV5ٔJG_è¨dð%N{ö20îmjfnÑ·¯…¹™ioc½žÝ%«ß÷­P,ᬑ(¾0£’ŽÚ¡‹vⴏ™E?K«þýû[Yöµ0ím¤¯«Ó­3±Ú¼i#´ªÑ(Œ¾_ÃèÛ¬e­NÝtÀ©y?+k[[;[[k«~æ}Œ z‰VÉzUV,á¬y(N©Âè µ§>qjÙßÆn½ƒƒƒý ¶¬úš™öê!Z‹%œV5™T˜R¿oDF_2£êô2ìmÞÏÚvƒã¡NNC‡8: ´µîgÞÛP¯G·NZmZ6#%0)–pÖL@ê'¢T2¥ÂèÛ:ªißþ¶ƒæ<ÜÅÅeø0'G{»–æ}ŒÀj{°ŠÓªæ"—Jë¤f­ÚvèÒ]—tT+âÔÙe„››»›Û硃ÙXYô1ì¥ÓµcûÖ-„b §UD’J‹ß†É”Ú±«Žž‘i_k;‡¡Î®n£<½¼¼<=ÜGº s´·•¬¶kMŠ%:­âv¡¢,µIóÖí:vë¡olfi3hˆ³«»‡·/ÁÇÛÓ}„óP°ÚÛP·{—B±„ÓªfòŽÔöºõ4 £¯­ƒ“‹›çh_¿€€À?_o‘Ç:€U]mR‹Ó*nk •HÕ&R-¬::åíëàçãéæâD¬š›ôÔ&ŝVqµª‰È—4r©º†}ú4d¸›'qàëå.ZՇŠ%œV5’÷Hí7À~¨Ë(o¿ Ðˆ¨˜Øؘè¨ðÀ1Þî®Nö6–fÆzP,á´ª©(l>(H5ígcï4ÂÃÇ?$<*vì¸øqãâb"Âü¼G¹ µÐÏÔ¨K8­j(Š;JdÚ¼•$ÕaØOßÀÐÈØq ãÆÅE‡ûvw:h@ß>†P,µi‰«UÍDqï6Ú‘ê— ¿DêH¯1AáÑc“’'&'MHìïíî2d 5){V˜VѪ!–¿r©ɒF”Ꟙ<)eòä”Iɉñ±!~ÞnÃíúC±„ÓªÆ"¿dMS¿A£¦-ÛvèÚàwßTjHd\BÒ¤)SSÓR§Nž8!!62˜XulkÅìA4ƒs¸ ¬a(–¿ 6mѦC}"ÕÞ ¤FŸ<95}ÚôéÓÒ¦¦$%Ä«^#‡9ØXB±D§ÕÆ8­jÖ4-ÚhuÑÑ3±°ä4‚JMœ4%}zFffƌi©““â"‚ÇxŽp²'Å݃M«ølU“P¨” ümݾs÷^ÆæýáI¤Ž›’:-#+;'';sFڔäñ±A¾®C‘bI¿G7qZ­Óªfñn¥¤­kdfe7ÄÕs •š6#+'oæ̼ÜìŒô)ÇdžúŒ"%ps؃ÀiU#Q¨”¾+%RþZÚ:ºxø©“Ó3²óòg͞?3'sÚԉ ±á£Ý‡¶µ4§Õf8­j•Mª¤R²<ÜÝ'(r,‘š™“?{ÎܹsfççfÕ˜°o7R,õƒ=ˆJ7?ô/T –¾åÿÊã/TõŒ-¬í‡¹Œ Rsg͙WXX8oά¼¬éS“ã£Cý¼h±ÔÛ jÓj½÷P«ß÷å•*ì)Á¤ÚÓHï€ð8š7{îü .˜?¯`fÖô)ÉñQ!c<]‡’iÕDqZýÀü>£èU TX© +“ª©%©”¼üÃbSÒ³fÌ[°hɒ%‹Ì̞6%i\d°ï(G;+iZ•ž­¾w]£ ¯òphÔªZèø+.jàA4©ºxŒ O¥.Z²¬¨hْEóçägO›X¾ZN+(Ž»Ÿ(~Ë¢¡eéИú­jê)m*ÑEM/csk{çQ¾!1‰“§ç,XºrÍú›6oÚ¸~ ±Z7cj)–F»ÑiU|¶ª°®Q´ª Tô© -¦~£UÕ£´©Ô´,j ͬ9¹ùG%¤LË©k7lÞ²uë–MˆÕù¹Ó''ƆÁ´*lKÓª|]óWåWž÷ý¥_éПa–»êQÅE T½#ã'¥gϞ¿t庍[¶o/Þ¶yÃÚKæÏΙFŠ%˜Ví,Mtµ;ӓÀŠëÅ×Û(†C éÐòph ýVõ7•„Ež TýÃÇ&§eÍ©›¶n/Ù±£¤xËFbµpVVúÄø¨`aµÚÇ §¸®Q|^ó®R!úY64ÄÍ~¥ ­ª’Ê5tR›453¿Hݼ­dç®]»vlßJ¬.ž—Ÿ™š ÓêH'{k }Ø.T>3ú‰ü}(4söK!,º~}úý•”VU‹Âø+-j Mé¤J*¥)3 —¬\¿¹xGéî={vï*!V—/š›7cʄ82­º¨°®A|&-BåîÔèwB84¥A"ö[#ü¥Ü*JU²ñW¾¨ÑïÝ&Õ ¨„É3òæ©[¶ïÚ½wß¾}{JwlÛ¸¦háR,Ñiu¸£­eCzfT¾±$̒ÒÈ+‹û†lèF„hèF Åáo0ó[(o* ‹aR ˆˆŸ4-wîâ붔ìÚ»ÿÀÁû÷‚ÕÕËÌÎNŸäã6ÌAX×( ÀŸI» R*}!í»‰Mþ£‰B8´‚U”ª*¤M}zûB6©:8{ø…MNϙ³¤–î;pèðáC÷íÞ±uê¥ógÁ´à-¬k`Áª¸Ï %¸ iß͚7oÑ¢EKòÿšÓlhÐ*³ŠÙ¤*EqRý^>©s÷%•RjÖì…ˉÔÝû–9r¤ìÐ~buýÊ%óffLIŒ õ#ë[Kñy,¹ö> $xiÚ7DC ÙЭ[·‚lèfD«ù)–ªFqQ#Mªd¥:täèàèÄ©™³­%R÷:rŒp„X-Ù²nÅ"2­¦$Dú¦Âü°P $!í›(mI£¡Û‰ÑÐmÛ´#¿©Uìª*çI•®T]½I¥”‘?¿híæ’Ý=~âä‰ãG«›×-œ6q\D ÷H§A +0Mnmx·C“n +ÉЭڴ…dh!ºc­ö •tVbµþ·Ê]•usð0þ“rÙ¤jl>Àa¸§D|Êô™…ËրԲc'O>}ê±Zº}Óêeóó3§Nˆ óó`R·àoé~ÑWÒlÚ¸)(…dèN]£¡ÛK‰ßßUȆfÝ| Ž¿ ++՞†fýíG‘Jiâ´ÜyKWo"R?uæìÙ3§O=¼o׶ «–ÌË#ëšè`_å¸!­}¾6Èþ;uéÚ­;$CÓhè®]:uÐj׆“ŠC6ž2U)òIUX©juéaÐÇj “›oh\RZΜū6nß}ðȉÓgϟ?îÌÉ£‡öîܺ~Å¢‚œt:C,ۂh í·ßKӆÁi[!Z§§n¯^zzz ­£Ý¿ÛTøͺ=ø Â¤ +EaûTJ1R³ ­©GOž9¡¼üÂy°ºgǖµE f 0TÀâpkÈ%ËOØl ½­Ûiu„¬o)Z– ݅ƸÓOù«ÙJUØþ·]½£ÆOɜ½pņbzöÂÅK—.•«Gî&ÓêÒyy3`öq{ÀÂÇæPû4øŽ¾‰ª ䷋YßzFƽÅ`hcC½ž:ĪRÞ7Nª*¥Âö¯°ý0ÀÁÅ3 ’”¿³,_¿­ôÀÑSçÊ/]¾råòÅógNÙ_ºmÃJqðrbge*æ@E ïÿk$½;wÓÑÕ34î݇æB‹ÁІz!Ü¡üó +ã/JUJÛ¿MšË*%¿ðq“¦Ïœ_´NzñòÕk×®^!VÞ·“ ÀóaŽ 3j¸ƒt +¢u ØTh;HdèmK†^ˆ…6êmjޗÆB÷ïoÕ¯¯yC)î»ù;鬛ƒ*l?@¥D÷”Æ@ù›W¸líÖ]Dêù‹W®]¿qýڕKçO;´§dÓj¨€'ÅG’Å*ÔJÆÜB¬6oÚ¤ l +¶"ù{ꚘZˆ±Ðvv4Ú”Xí¡MÿqÅ w”ª:”&U¨”„=%7ߐ¸ät²¦Y»…J½tõúÍ[7o^'}õÔÑ¥ÛÖ¯XX•šµ’ð¼RîZ·lÞ¼Ysº8%Ó©Ž®¾$}°8ÈÁæBÛÙô·´056ÐÕé*dÍÊÃ#Pªêx§R‚ò×V(Óræ.Y³eçþ#Dêµ·nß¾ Vϝ,ƒxYáLR+EvsdMo­’µu«–-[¶jMV20›ZXÊR¡¥Xh!@X[1ì[(QªªWJ➒v/cZþE'N͞³xõf*õòµ›·ïÞ½{çÖõ+ågŽÚ³}ãÊÅsrҒdžû‹ûJºÝ»Ð׈Á>/¬dÈtjbÖ·¿Í@‡!NÎÃ]\]]\œ† dÛ¿Ÿ™‰.®•£fQªª¨°§$–¿ƒ]¼`M“U°hÕ¦û@êõ[wîÝ¿wX½|áôÑ»¶®+šŸŸ¡°¬Ñï©M¬¶o׎î!‘É°·Y?k;{G§á®#ÝÜG¹» ©Ð•S¡Qª:P*éF¡‘™µÃpaM3{ÑÊM%‚ÔÛwï?xðàޝ›×.;qxoɦU¤«¦‹]ÕÎÒ †Ô.ð2Ç;Ó©·¹å€ƒÅLhooo/ÏQn®ÎCì¬ûš îÊüQªÊx·ü×4ñ)3f-\±±do‘zãö½=$Vo\-?sì`é6¥®J–5¤÷iwíLèÚM§§)‘¬l9s9Êk´ï?¿1¾>Þn®ÃÙXšA¿î¤|k %"ß(„s¢­Û‹kšQ°P‘¿`ņí õʍ;÷>züøу{·¯_>²LìªiÉqôiL”=ºwëÖM»{({-¬ æ{„»—ÏÿÀ   À€w2¡é W”ª*]Ó t¢ Õé3ç/©'©ÔGŸ.iTO©í:w×ïMª¡q°ûP´¾xÏa*õÁ£'OŸ>}òèþBWݸr¬UcCé‰}RþéëéêêöÒ74w¡Øîæéãäïãé6|ˆHªp¸¥ªé9ù—_),T톎ô ‰MN—K½y÷Áã§Ïž?{úäá=ÚUìÚ²vé¼¼i“ÆEx$]ÕÒ¬7<†104êmFº¸yù„„GÅč;6.6šXõóv²ƒQªZ©°Pm×I[Ϥ¯íš”ž;oÙºâ݂ԇOž=ñüùÓÇHW%ðžâ ËÌʘOËGAÈh_³>&ÆÆÆ&}ÌûÁ«P\ܽƆFƌOŸ8¢ƒ#B|}LÍ,,§Þc‚¢ââ!9xbrRb|\TX ¯§\ —«Z·h"܃Ďªj*“jã8BÜ'\¶vÛîC'©Ï‰TbõñýÛ×/žÇßÜi°­?ÚÍÙqà«~ææý¬Ø98§~ÁáÑcÇ'ML™.*ğ RáÆò÷ßáŠFÈ·”Ä}BIj´ u«Lꋗ¯_¿zùâé£{·®\8U¶wû† gÓs-þ^#ííl¬­­mìINcã“&MM›>##cÆô´)“&Œ‹  RûÁĎíZ5kŒ+õðŽTÝ÷J}õšX¥ãï5…I•Þmtwql?ÐÎÖn ½ã0WÁiBÒäÔé0›•9=mrrB ¤VÊ®¶¶mÙL,~±NR5ÑSI¡tëÞ£gDê?¼~ùüñƒÛdQstÿÎÍ«—ÌÍIŸäë1Âyè`{{ûÁCdN“'§ÏÈÊ͛9sf"…€YI*=V*/~±£ª–÷ΩѲ9U&õ*õɃ;×/ѕêX©¦$D‡øy¹»êèè8ÄÉyÔ½àtJzFÎÌY³ +fÏÊ˞‘–’G#ÓlàüK—mZ`¤&*]Ґê +¥4Aêá“®ÞºÿøÙË× õ©”ˆT©ü…sÝ1aþ£=Fº8;999»ŒEœ†Ç§Ó2só æÎ+,œ;gVn&äàA`‡ó‡Z´øU¨“X·G('¬¸NÍש•J=¸k«pþ!‘ «¾žî#\†wq)8'N³òfÏ-\°páB"͞‘•Dê0û&zÝÉ2µ¹T'ᔪbÞ·£4:XÚQÚsøT©Ğ*H2!."hŒ·‡ÛÈ#Fº{x ‹ŽO§ó,^²té’E æÎʝ1•FkÁ#usã^°¢‹_}UŽò!¥V•íý–©·eR…9UÜý¤Ž ö÷ñåîæ>Ês48…¼v!†´hùòåEKäe¤BE%H5‚e*¿X'©…J½)<¥™¿|=l,ÙwôÌÅëw¨Ô× õé£{7¯\ OTW-ž›;}2H ò÷õñññ%N#ãÆOL‘;»pqѪµë7nܸaÝêåK +ŐÑ#‡©°L¥RqëA(¬h¤ƒg†fÖöÃ=ü#â'gÌZ´rӎý2©¯`›P¶÷»§xÃÊEsr`©à7fŒŸ`(] NϙN×mܼe˖MÖ®\º`vÝú÷1ÔβAXÑ`¤&äwÉ+ ˆ?%³Îý8vöҍ;E©²§4p eùBÒS‰Ôà@ÿ€ Ðˆ˜ø¤ÉÓ²òç-"N7mÙV\¼më¦õ«–-,¤±ë×[_G\Ñ`¤*DÙÉï2E'¦fÏY²fË®ƒÇÏ]¾q—J…‡4°ŸO¦T¨“Ö.›?++mÒø¸¨ð À€À ˆèq‰)i™ys.[%Ï5Ü@Sµ©®Clûõ†ej«fX'©‡wB'ሒ¸¢¡{“·ËâãÔWðüÁ]8¤DþBþNêD*58((84<ŠL¨SgäЬJˆ5,ݵ³dÛ¦µË R¼\múšèu‡e*JU㹅: Šßбòsg®Ü¼'<#A:ê}² 9{üàîâõ¿3cjrBlTxhppq›4eZ6™PW¬%NwíÞ³gOéÎâÍëV@EE¥º ¶±0½Å Ž¾*DdGß8ߢm‡np@ŸÞO§Å½GN•_½uï‘JxFÊ$Rûž:£oтÙÙÓ&'ŃÔâ42^ý—9s5·•”îÙ·ÿ¾=»J¶¬_¹d.\}Œðt<À¸—6,SaEƒÅ¯Ê©,rÝÄÂF¼J“9®Ò@ñ{íöýGOŸ§ÐQï\‡‹{¶o$£o~fÚ¤Äq1‘áa¡àt¬0ø.X¶jÃ֒ҽû:x`ßîb¢ ‘êR͍aïW4êAÖQe9¢]„Q1ȃÖIPü^§RŸÃYBzììÌ1zG•Ž¾Ǐ©aáÑq Bå»xźÍÛK÷8TVVvèÀÞ]Å!%B:Üv »).S±øU%Š1¢ßÑ·XÓt¸H— É×ADŠß;¨Ôg²³Üûvl^Cj_}â¢#ÃÃÃ#¢bÇ%N‚WŸ,,Z³©x×Þ‡=z´ìоR!úcú¤qþTª°¡¤¸LeÝÜP¡£Š/¼°0XH<“nÒȎr?{F;*½u±»xÃÊÅ°¡;i¸بâßä)Ó³gÍ_Jß{hú~·fi!H 'Rí­Íè.as”ªꉥ¯òKTû@Šóh¸rœU°˜ÞN=]~•J}úLºtqê óXP3}j2}£""""£ãâÅ*i9$î?|ôÄÉS§N;rp‘º¬p&Hõóp¶ïRµÚÐ ¥/QªjQꨊoF_šø°•L©¤Nºuïáã'OŸ>yL¯G¥WÉ¡LÊJOIŠ'£/‘%tԜÙó—®ÞX¼kß¡£'N9sæԉ£‡öî Ïè¤öèªUaC‰ucp‚àT,}…3vÖѓ%s“ÑwþòõÅ»Ÿ8uH}òø!tTXÏìÚºnùBZ&%’Ñ7R©£®X·eÇš}wîÜÙ3'Þ·sëÚ"Qê("ÕÔPÚúÅeªj©W¡£6ƒŽÚÓvFúÇÀèK4püB…{ŒgÉz¦„”>…³²h™£o¤¼£.[½q{éþ²ã§Ïž¿páüÙÓÇËöÓ0Iê þ¦(U-(8•:*šX pîá.dˆ +£/RA*í¨W„ÈXÏäe¤’EjltŎºuçÞCÇN½P~ñb9ÍHÛµ ¥Öõdƒ/}+#-}Ŏ:täè ¨ñS2f‘Ú·x0úÞ#Rá9騗ÎÒÄa=3%9A(“„Ž:-:ê¦í»¡q†—/_¼pö$Í]Z>?JU/r§b•DK_¡£Žò ‹KN˙³dõæÒèK£Þ;*l<,ž«ØQekTÚQ÷>~æüÅËW®^¹|ñÜ)Xÿ¬_¾ F +JU' +NÅÁ—¬Q»é +Ux+M>Í%vˆ,jW€Ôx”ª>¤ •V¾tð…Í÷ ï$'3jX\RZö²H-‡Ëtô%ЎZ~úØÁRaã!¶}…‡(q×w¼cç¾²gË/_½~ãÆõk—…,-Qj]Ò T5 w +ª8øvîÞËØ\x{5tT…2ét¹0ú>’:*ìÒç39ÓIG…5*Ý!¤eRþ¼%«6B@ði!ÌðÄÞÁ¼}㊅³2ˆTqŠRUL=Å õëoÐÁ—TI}úÙ:Š¯d„Žº±d/”I×nÝ¥ReJd0…§ã™²Ž£/]ÏÀ;OvЎzåúÍÛ·oߺq~úA¤NF©ê¢^… U|uôI•dïìîMJß|¡£=MÊ$aô…Ž + JòB¡£Âó™È¡Lš»xå†âRøSb–áí›×è¦âŽM+Í̜)Ûûϝ᎒JxÇi£¦-éàkdÖàÐÞã&¦ç3ªbG%kԛWÅ°I¥©aatôœž5k>¼ò„ü©³¤¸º}÷Þý{äw@¨ïØ´ŠH’ÞÄ }”ª*§â®ƒ8¡¶nßI›T¾–dðõ𠍝ïŽZN#¹;*:“v r…ŽR“Å2‰f>_£ ï ¥½Éº¸ kÊø¨O|ô¦bêɜJE’8¡Bå;Àߨ„”éyó–µì¤ÔQÉzæþݛ +;„ùYi)´£†©‘1c'¥e΄2iûžCÇ¡£’âŠ@þÐUáÖÍê%s²¦&FzÁÉŇä(µFÔ«WO6ö +NÉ +µq³Vm;À¶­|éà›¯.·\;S®˜I(ßxϛÅE‘Ž +G“`ô–MË$!˜toñOч:wmY³dNvjbt·«£E…ã,xò¡zÔ«'S*:…—Im´ºÀ„je7ÄÕÓ/Œ¾óev”w¡N§‡„ኆ¹´|þÌidžúº; ´ìwiZ5kÜ@ñ. ZU¦bŸ¬D'ø”^ÿ} 1-|i‘dlÞ L¨¡±‰S2f’QT\l^£S#œbyDF_X›Ø—¢ +r¦ONŠ'®Z„ÀU aô]#>Ցr _>*E.•l„Í_úìmØ +SÅ[oŸË^t¬jXk©*þFu‚PªTP$‘*™PC`B͝»˜nßBå{“NZðȆÂÆÃø±Òý™ˆèqR`ô%‹ÔRz¢ ¢^ÀmªÏÓ$£ûwlZ©´ùÛSá~ªðú>µh­+Š«¡óÓOŸŸI¯ 'kpÚ²--’úô³*™P'Ñ uý6ú~!².¹ÿPñ`èÙã‡äeR|l$騁AÁd•Ÿ4…Ž¾d‘zø„tCî5A¸Ë +™;7¯Z,n)¹8Ѕªxïâkáõ}`UíZÖú*á}öÞA±wR‚Ð/¾_- ¯¬…ÝAíž}h‘ä16™N¨káÙÙIzށ–;Pï<¸{ój¹ðæ’åB™46štÔÀÀ 0¸è–*}¡L2?Þüðƒpëüò9i¡:U\¨ö5ÒYdÎÄê'òmjŠ{}¿ÍO*A®óóÏŸ ô«¯Å7À7iNœÒÂW(’üÃâ&LÍ jd*qJÊ*Uv,v“2i™RÃɂ&%Ž¾ðLýì%zéüÕoÞ¾}¡÷o]9âÐîm°PMƒ…êH¸ *Ý:–ÞßGµªš÷»e­R¢¢Ï÷|‘O?ýTY§`|~o–þVz[x+pJ +_©HŠIœ<#nôí>$6§ÒíÅë—hí+Œ¾S L +%£o`0½:>eF®8úž¤Ñ”¤£¾yûãÛ·?@æÒm(…5Í´ä¸P_7'Yèƒø®!bõ3ú¡Õ ¶¢`MÒªh´¢?ù+GAçW¢Nú^éúÂ+káõ¦¢S+;G1!Ñ )Órç,Z¹AÚÇ¿N_Â5ãç°0¡±ùb ,R£Ã…Žª8úîÜTÌqyõÃÛúñÇ7¯_<}xÊß½ôìƒtò—^‘¢aᭌÄêçŸWü5F±y”Íj†V¥rŠþ”ùB®S²ù-¼Uú» èk雥;t&NÍ¬HáKŠ¤¨ø‰éÙô)‹°B½óÿ·wpUëß½÷æ&1!ÆhÔXÄœ^°"šb** ŠA¬ØEE» bì(Š+bïb%7&¹ïóÌìî9ŒRàÝÿþòI"+gÏì|çyæ™Ù™g®“¤ÍiÖæ¼Ë9tKj‚^BÜ;îíGbß%¬÷…0éîÃÇÀôÅógOŸ<¼w "%.ü &‘’ÙKNsèãYóˆõë¯ ?‡¤GX ¶â±j‘2@õ{JFßèHß8 Í*?þXµ*9°O7­× ‘±iK`Ú¶£]÷~ƒÝGú³AÒv&H"LIŠ& =`h-y ±ï0œy 3ñŒ÷½’wûþ£|`ú¨æ?ºw›DJøžfÙ¼Œ”3ùYLÀTkV§T+ûí7•NÅ|ÍÑeÁV$á+ už!Ô<*Yð6uÒø?__ß1þcƒ&‡’]Q&Ƽ”0H%†úæíÛ·o^£ÿ…‘*9F!uSÂò܁SvªÔ¢eó¦&M7j(AÁëVX1P?Ð\/úx†+c­Bµ0SDJæjaËô“À á9ÃMŒ‰£Eš¬mL ©ÖÏ6mÛ[Yw¶±ïÖ³ï÷>”)î–à‚¤»ç#Sˆt^B¨óè> Ýï’yQᡓ'Œëïï4)$Œì3Æå/dŠÃ$4Ô·ïÞ½Sÿ{ŸŒTÑÿ&­Z<‡=›ÈÏÆUË%f-š™6516Æ¢76¨°bbs©®|ñW¿ÒLܸì!iÍòØ9³ÂB§Lž8a„IÁ!Ó#hÚ¤æM* “ÀPß½{ÿþÝ;0Uô¿7¯‘Ã1Ò¶$Æ-ž2Á”§ PµïbݾM+<ŸS&•H°ì†V‹i.è +ÀNj0&«…X©þæër§ªÏ”¾.¤uÁF75mނñ¬29øVð®D*ݬ.ÍÎ]líììºvsìŽGŒôu0ÈÅÍc8.-"É!—SÜ~˜uƒ$Ž)ô‰¿B§ø'… ÔÁ«·mX»rñüÙaÓ¦N ž:#"z¦MÚÊ,8£aê{л·œÿ=ÏcΤgé1d`ß]íºtìЮmëV–µJ®4¤°RäÐ\¤1¸‚ÍMIL#¨Zt ©êØjù1ýéO™Õ'ÕÈ<¼¨QÓæ0,‘È䴛×ÚºuT[T»víÛ[L†& ,{õîÓ·ŸSÿƒãÁïüpû é)SæjzE✷L§ˆþ“æÙIÙ´nղعÑaÓ§…†N›=/vfc!Ûn.±aқwï½Gü/Ä¿¹ÌKž¤Õ˜Ì9xܘQž®ƒz÷èfoÛ¥“u«öí۵÷1  VZAsѨÑHÄæ-››š4¡c4V£ï+3ïç˯[­Äm!ýšaŠ¯Ë4jÒ´Y h°Œ‘Ø"òuBuîܹK—.6èf‘&Zfï>ÈÏ,pâꆉ–Gxöñ;~ÒT<9fñŠxÂôÎbàûâ®O¨Ð)Þ½IrLfìI݂9¶̍ž>3"*˜®JÀ$ÔP™0é- õ-õ¿¸ü᳜ tÉQ +.ƒœðÔ){;[›.] è (¬këÐ^ÐhÔJ¹T 1™I“† êÖ®ùsªåµ’ÞÖ4²J¬˜ic@*Áf›vVðD[ÂÏÁ¡+ªÈѱ{÷&k™.C¥ç°áÃGà™ï>0‡!Į̂9 —Æ­]Ï0eߧÏ_iÝ'µ4”€ÿ<~h_ZòÆu«W,^8/&:***:fî‚EÀtÃVÒ!Ÿ#†JÂ$`ú1Õ4Tbrßmˆ_KøŒ6tÈàN}{÷êÙ£»££#¾«áubÍŏŠìо]KµR&1oajÜXT¯N­Hõ»ÊºÝjyA¥LÉ6¦ôhs@ª‚f‡Žmì¨-¿Þ}@}Aý@NNx>Ì ô³h™çó¼}`\飐qã!À™:mÆ̨˜ù‹—¯^H0ïÆéóLàûœÄ®hiïß³#ÍÛ$sè‘»S·nHX½bIì‚ysçΝ· vɊÕÀ”1t4ÔGÐ&~}‹LGªœ©’V¹w֓PkÆԉãü|F÷:ÄyðÀýû;AÁûNX}zCsöÒ­«½Mgk«v­5J™Ø¬yÓ& ë Z>Pµ†J·¦á–ò +ÔB¦Ô´ioÝÙÖƒXƳ<A 2ÄÕÕ -L`Žíò +š0qÒä)SC¦M‹˜5­,.>iSrÔ¾Z¦¬ûÄHén‰9vpßΔÍëV¯\¶dñ¢E‹/]·Åö]t5ÿ5]Cý¦ +͂é•/’\=àÀ×,_47*|Zð²}Ä0O÷¡n®®PpCəhðàAƒ ½8õëÓ«‡cW<²±J-ÀXYªß3Ç–U­¡2ۘjÕiÐȤ™™D®nÝκ³]×î½ú@ëìâÊð Ç×& //œ•õ¦0ÇŽG–ÁÀ›é3ÂfFDο9?vÉò¸øu¶lß¹/ã(ÙÝvƒ¾/_“‘xO0´7L§Š»'NIߓ–¼yýºøÕq+V,_±r՚„¤[Swí?ÄLk õ÷ß)UhtV‰f Æ4…Iñ+ ‚Ž„qÑÄ À?_ïј6 +>ÜpÂúðôôðÀöââ8gòùûŒ‹–‰†Œ0g„…#K<ž6fμùxRâò•«×&n؜¼c÷þƒÇNR¦LàK™‘ÿ0á+ú_ԜÍ:~èÀž´”-“Ö­_¿v]w‡39LäL >ýDM•Ð71©aæáý»¶oY¿6niì¼Ù‘áÓC`¼4.pl@€¿?–}Œá5âãƒíeÄpOw7è¼ûõ¬¬Úh3Bµfuºì­¼LUÇPÙ}Á ›™I•–í¬mº÷vä2ÔsøÈÑ󌥞44iҤɓƒÁ0‰eÎ 0£å\`¹06vÑâ%K‰‰­]·~ã–äÔ]ûÒÏ:“S)µ3¦O$LpáïÉcHuû¶-›6¬mØ´eÛö´=A« ïÕéT>1ÔªŒ©â;ًg!Øڏýò:ì—çÅDE†Ï˜2eJðd(÷DCiQPÐøñØ^ü0w"p5Щwwû.Öm-*xàzµkV\¹ÜŽD×ËïImàRz‰_kwëÙo ËÐa#½ÇøB̃$𛾼+(,,,œ°œÅÀ$(—˕q«Vƒ%$&;ví=pèè‰Sg/\¦Lɤ-eŠDØ>ñ}¥zñ¦¤;°w׎íÉÛ¶‚¶¥¤¦í†VÁZ:Ó#£¡~øðÇ°¦Jï€+ÁØس#ystÌK-œ7gv4X†EŸ1Ý`‚ + ™:šË„ñÐy{ ê2°oÏ®6ÛՖ¦d- 8àï*3¦ZÖPõ •ÛoˆË9í{÷wv6ÒÇ?0hҔi´“œã‹h<ûükL̜9s©a²0%°\—˜æµqÓfÀD÷ìK?t43+ûÜÅ+×(S̼ӵ³ÿ€ÿý'• WÍ»B¨ÎØ¿w÷δ 4¸ÅƒG2³Îà~sÎÒÉ þøƒ¥Ê;ÞáÂÙS™‡Ó÷îܾuÓú„5«V,[²(vÁüysḉbÏ6˜¢QQQ³°½„͘<)(ÐÏÛËÓm°S¯n¶HUÜ¢iãuÊÕT9¨Œ¡â~Ã渜Óα¾[ñö718tFx$#áž5v¤ %K–.]†,»D–ˆr˖­Û’SR¶§Ý{÷§< HOŸÍÁ­ü¸Òáéó—Ó?´†FæpQöµ+Îege=”q`ÿ¾½ }Ò9–žƒ›Œé¼7wz Ò/£ŽTO=¸}øæ I ñkV­\±|ÙÒ¥K°à‹ '¨ŽØ… °½Ä̎Š€Î;xB ßèî.ý{;Úvl«‘[4LMõÛò9ñ¾ÿ¦‹0éÈdê¶Ö¶Àtˆ'‘=gÞBWPLJ§Ï®Z Zƒf‰,Y˜[““ ʝ;wíÞ½gï¾ýÒ3>züDVöÙ0S\ úˆ2}û^Éï¿ÓP MÅü9gN<~ôÈ¡ƒ(rSÙç.\¦LÙ ÂßÑPÿüóOr Ò.^“—=wˆµgŸ<Ö¾ggj +öÍI‰ëÖƯY³K¾Êp‚úXIÚËbSωŽ ëëåá2 w7²–Æ´Iƒ:µˆ©’-²eíõ¼/“´µÙìÝ­70å7nRHXäl<zEÜêxÊ/)i= ^6lظqã&Ö. K%°LÏ8xèÐá#GÇ ËgÎÒܼ›·ï=ÀI|=¦êö‰`hà>‘꥜sÙ§²Nd?~ìøñÌY€4çzodJ†CŒóýóOB•sÀÔÚoæ]½”sæԉc‡Ø·{çŽÔ”ä­[6oÚ´qã<’Óp‚êHL\íe Œ¾–-&G¢‡L7f¤‡Kÿ^]»XµlBM•Ù¢UÖ)bô¼oÕêµê¼švzöw¦ãƒñáØ¥+VÅ'$­'¶¸m[2(µ}ûöÔÔÔ.÷ì¥v F(ñœ‚ÌÌ'³€Å™³˜’Íôª–)‹äwôžI>î5½™—{ùbι³Ù§OŸ:uêôir“Ë´Y[pÎ÷Ï?µ·@kÇ@O*º|šûáƒéû÷îمÝsj*:Å`ªHކÇAnÞ´q}bBü*ˆµçFϜ6©:;áZÌMµfu²›²üo%æ +r¨žWÐФ…„ÙDê>Òó+Ä,À º¤›·%oOMckܽE:;4Kdy˜%Ø剓'³Cvö qþ<½|%“tÜ3×K^Ìè1¥HèX•¡zçÖõkW¯\º˜sþü¹sçÎç\ ÍâÖ¦Y0¡³öú·À·oä]E¬§³N?väðÁŒôû÷ïÃ.z•±{¶—ÔíÉ[7oL©Í1øzÈË}p_GÛ­•ÔT.¯cÑ+i4Åcj7ÀÓb,1ÇÜ@\w<Oœ]µ6iž·›ÚbFvrD‡Á*Ñ,Q³–„$¢Ì¹pá"à¼|åjîµ<̏t÷þƒGÀƒ,*zW€éŸº¨>ÆÝþ7oä×˗/±w¤¤YdúHKõ-mÐ5cúˆ«hïg¨?vôè‘#PäC†éð¡FÒ1 'Ÿ²uSÒÚUËΉœ>9Ðw„Û€^];ƒ©š‘-²:) +Êê?tÕ#§ÅL¼¸ƒ×sÎY´²ÜNނp…úÕÌD'AYÔ,)K$I\¹z577÷à¼~s®Ü½wÿ!î#}Nßµé0Õ!B0¥ +–vï.ær¾žw ”—·KÇí¸z»SzºTŸ{¿‘—{åòÅ çϝ=“ Ž<+ Š|‚ÊÀnÿè‘ÇðX²´í[7®[½<E;ÚÓ¥_w0UÀ"âÙNµ| ÒsjÙC(H2H¿ ¸mpùš¤ÍÉi{ög`ü ÆHÜ* $:w®€U^Í%®ß¸qã&¦Ž¼GÌÜÃÓP?!;™p™CA¦ºvöŽ yþ4ÿñ#܂|çö-"¼Üå1š©®©swÀ{ІTqm YðXo^Ï˃¿tñBõåg )¬‹ìlh/Y'ñ\œŒý»w$oJ\ƒY2C‚ü¼†ìíЩ-9쾞îyŸe)±q{N-sV—mw0T²3xÁ2`š²s_Æác'² Za‚9¢._F£$VÉ°D’·ñ’»w1ƒÃýûÀ†A >7÷êÕ+W°È— *¨ rÐ@ç} ç;R6ã®Ñ3‚½=q‹–•¥œKQP*•;§OJìhßk “8Sš§ài>xø y@DHtý:g•ÈI"H́óèѣǏ'nÞöœ¬ŕ+ÌÔàú@þÒv«HwQÖü'1bÛÅ«¦þWÁ{ü^¸e0 -à4é¸=WoaJÏñV—ê#ï× -ò/_º{þÜÙ3ِȳ² È'ÊRPØí§K;Š¯%‹Û¾kûæµøZôSí­†„PUÀXDò/Û©V TúžZö%Ä Òenܼ#lot\BR -Ž?!IZ„DçΊʼ|Bàêµk×®£uäM|ÅÌ|êÃGd'.s(ÌT7Î^$Ϟ<~ø· ߺyƒÏgyˆaªêÜð´a U\CüÖëW ò!à/^ÈÍ¡¹ülY -ë";ÚKÖI|/NJRüèˆÐè’ééáâ0~ôóîÈËîÔ}ßgyŽ”ØqûžZæ]]½B ’Ák6Әƒ‰)i'²`´Â„pD]º„AI¢’a‰$oâHnßF‡»wïÝ»@!HéKi!¦ºqF—C°"Öû¸·œè.mp’…BýÏ?‹R}‹càÞ¿‡ ƒ|~~^ÞåËXä‹e*¨ÜÜLÐygàýŽ˜½øWÿÅóÜíq‹–i;9gQP*•{O-¾)±[_‹ÑŒq ZšÇàÛ|ðådÈC"B¢«W¹¨D–HA¢΃>œ¸yÿé3²W®0·×ò§¶[Eª¸‹°>~ôð#¶]¼,ê>ÇoE[ñס P܂2Öt4$à,3Fì Ó^³\lF îkÖAٖ}1z¼í¾šöåäKű/yÐX{G·yKÐç(ß=qæýq {•M«T· -%’D ' §¸I×ß¿|Å!-¦úT9¬ÏŸ=}úäÉãÇô\ÚvO`ßÅTÛ5ëžâ ¶ !û6÷fي8þÓT@¦Ö'ñQ0y5äò%ófLµ;”n‘5Õ« ·¸²ƒ_2Nb^ÀÖδ×Àã&⠈'N\bjÞr¥¾­·(À»$ïј䂒’$ %Â|‹ï_áv Jqè3ý믿tˆ¼¥OáÈê—/_¼xþüÙ3z2¶]¼.Ò.þúëÝç §x΄<îSÝ+KÝ¥B§ H×®â}0¤zø.{[éãéáL·Èjd­›5$^¦ø¾åO*ªvœÄ¾þrð(›ÉÓç /î[IA7Ht¼I‡<„#H J-HÜ_ø -iO\/ˆ«s9¤Ó¿Š¡Á -LÊ«W/‘vÁ!ýMçý¥=‰þ9ئñœÆ< úGe,RhŽ¿Iîbe㪠´– ô[4›¼ð³7÷í -y3ºÞà÷û:ø².e‡næCÆ0ïu -¢ûVˆï 2Ñ|DR!£gléÄ$ˑˆ,þÄł”Ò`g§êÑaí .E(¸Ê›9_¡vQäúçÐk󀖉úgOËXOhï.$ô]fi¸g:h}€7ä_ÛÑÄÌ ½L Ù^–?T¼ñ[·A“–bU§îýð­z«¸×Åàã®Û÷б -ÈÆ#“,JŽ#e‰zC€âÓð÷ ÕaáŠkGµíâWývñÎs°ÁÊ`E®¿–ñJ'ì_”±žÓ¾ý¹ðY0}çFðÆU> ˆ™z™êØ^VÔO TüÒqÒp+杦ä5á'¨/Þr%ûÓ(@.‚ôCR‡#®@¢«ÞÒG2ïdªK„A‚\‹nÃø`»x×9Þ0mƒFýÏ\䗩^Ѿû >Š ¤pÛÈސ-k–-d͜T:ï<*o×wýM=QÓVRM'Y;@—º|ݶ0v{/ٞ†óþW?1µáÈ¡ÔÅÈ¡dpêՎÞI„CBÀþWïlnï:Ç°¿Ò¸§ú¥Œõ3j£—Y •Åì{ö_4ÛeÒ¸zê¼Æµü_º¡ •ÌhZË4¦½Ô}M8ÙÞËn{az¶Âá¨E©Ïñ­'Kô=HY",’ßé‚£]¼ëlãÐ)ê¯e-ÒwëmÛK‰çÞN†^¦újt-T:MÅM×ރGŸ2cþҕƒÃ÷£¹nï½Çl{yý«n,ŠÈß -cäÄÞ¸g§”ï`Êùó– CVï”nzXÿø½pãøoùè 3·Æg~÷ÈfžÌ£ :]ƒÈ›TšUԛT(TöÞNSɌf´íT7|÷ûΈØÄ4jmó€ÛŒ¤ Q? ‹ äXê}ŽBXY°ïk†œC·¿•½È°î5·™3¨%¯ÇѾIåNJy“J¨0M5ëk1ÆÎq¦§ïêÍ!{ã’Ò³Î_¢›‘è“mfmQ€ïÀX„æ‰ê"ùó]çÑ=•AçxOYËBL;ù/·ì˜nf/lPû®7©TT¼¡ÔÜDÑÁ¬/LSaF³l͖]û⎤Ÿ"[Aqé4Ykð[ž£hR]$…Ér–÷£ÜȒÌfv­íÚ_Owªþ›Tʪޭ_j7ó!cí<¼–nÝy09ãtNÞ5Ü -ª³"ó#QTbžE‘”ü<úŸyOà—~çV½½|öbrNg$ë¸Wìëq´PÉ­_¼KˆP‡Žµwöðò Üu(åxvnþuèRŸ¿üùµÎú‘4˜dñÀ–Å9ÊV V²ê ò/:äçfO>E_ƒPñõ8&ÍW$ÔOt ¶Ut¨–œ=ú­…i*»T -õcDKŠñÃ\J†òR¥P_=Â@M¨Ûýz8O°¤ïb þ.@-*õwꣻ7 .ž­šPg¨1 G¨Õ» M`^‰T¨?½jLU‡zO€úéC½'@僨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPS¨w¨>Ô»Uj´µz7Ôè*Õrâ´Y‹ü ÔT -õ¡õý҃úBM%Pý͚6Ѳ -B=sñŠê[jQ¨oµP¯\yþê—_ßT–j©Òy”…€)@}óë/¯ž?yxçFþ…ì̔ø(-TónjõŠ‚ú/-Ôæm(T…~ÛB£¥ÏÎÍ¿~ç@ýùõªeJUW#Žºúƒê›×?Ôw®ççfO9º-Ðo¡…ÚAѶ¹ê¿*êõÇÆÍMꐱöN^~[C#%3P?ùók’‘jùq-G²åS\R¿“ìûúç—Ï3P“E†n ôóòp²;¡š4oü#Bý¢¼¡ÕüCj#„jÖ¡º{-[³eWäÁäŒÓ9y×nßüì%tª$T¬eªrçúe¦ß SȾ?½|öøþíky9§3’FîÚ²f™—;Bík†Pé@ýÇ?ʍé; Êۛõµcçèîé»fKȾ¸#é§Î_¾z oþ¾"¡úÛ[ÄZfzÚò"ZFÙèíÛßH ¾Â[¿·®^>*ýHܾ-k|=ÝíÆXô5k/¯¨ßÖþ±Q³6µÅ[Ǚ |WoÙ{ éXÖ¹KxKéÉsªëÛ²%‹* ¶ì‘–=Ìߑç[‚”*Œ“îÞ,¸t.ëXҁ½!›Wû.˜éh;Æ¢@mӬяµ¿­8¨Ÿ°P6k#k×µÏàѶSÝæ/]µ)8"61íäًWn@§ú Bõ—_)Ö2Ñ[é‘-[¬zHuH0*‹+A¤¿þú ºÔW.ž=™–¼iÕÒùnSmGîÓµ¬M³†,ÔO* -ªÑ7ßÖ®×°YkY;ÓރFŸ2cž÷Š ;öÄ$¤ffçæ]»uC¨¾¬ÀµÌ¤˜ãZvTõF3ÚÈbX”ÞÒ×ÀõÞ­ky¹Ù™© 1{vlXá=oƔñ£õ6m'kݬa½Úß~cTÁPkÕkØ´µTcÚkàH›É®s—¬Ú}(%ãôùË7ïzpçfÁåó§3REïZ°d®ëd›‘{™j¤­›6¬W«B¡~PkÖª+2n%Uwé9`ĸI.³ñ>ahdܑcYg/æ_¿uïÁã§Ï_ ֟)½^kÅ"¦d9¬eB•cÊ¥8œJy5?#Òϟ>~pïÖõü‹g³Ž‰‹ Å»„³]&1 gµ´•±¨n­šõ³ -ƒú9µ¥DÕ¹GÿaV=pN²7öðÑÌìœË7nß{ðèÉ3ÀúòÕ«ŸÊD?S1Œ™´NâU'X˄éït€ú͔¿RŠÌחÁ…¼zõ>{òèÁ½Û7 -.çdg=»7g4έ†õïÑY%iÉ@ý¼¢ þ ~]óû: š´“›¿0Q¹ÀgÕFèTã“Ó³Î^È»ŠT>~òôÙóçÏ_”Z/½zEš¢e¹2ÑZTµaÊ PߐLù !‰ß̖âeé.jäÙÓ'"Ó«yÎf¥'ÇC—ºq•Ï‚™0M%·~Å-›4¨ó}ͯð!MyC­Æ@ýòëß×!7;ÀDu´-Ž”ÖaþM<šyúüÅü«7nݬ?~òäiéõŒŠ¶ýö×_9¬¥¦ª¦)ö}ô¡ˆ(¨J{-Ož<~üÞ¹uãjþÅó§3&bö]€ã$ÛÑxïoýÖùžyòö¯ò¼¡¤ Óл]{iã0}ö"¿5›w†C¨;™}þb^Áõ›·îܽwÿÁƒ‡DJ­Ç±…y 5|çæ5~‹fOw°9¨wWöÞC¯* -*yLÃNTaø #¥áVœÝ=}Vn -ÛwàpJ:P½p9¿àڍ›·nß¹sç.Õ½Rêþ}h!ÐD0úŸ²\ë›7e@•éOY¦ Rìû'â Ò\SP#·oݼq­ ÿò`šžrøÀ¾°  +}<ݝ'X ‡q ~µÓÔò}H£Gç40ü•¨:A§:Ænꌹ‹ý7ïÜ—˜š~òôٜ‹—ó®\½výú ÐÍÒêèömh"Ð6îcZ'\+v®o0³TK¨lêý•N:^`ß™X"‹Û·±¥»¬Œëׯ]-¸’wùbÎÙÓ'ÓSã¢÷ìÜè¿xvc Kí¤’Ààg4p?Ÿ@å&ª0ümФE[e³>ƒGÙ8¸ÌòòY¹~Û®ˆ˜ƒ‰)Ç2³²ÏžÏ½xér^~~þPA)ut [ÈMŒ~HëÀ±2ÁÊÆjICU›|¦,҇$Ubdݸ~íÚ5(E©.«j$ïò¥‹¹çÏfgeKI<±kÛú•>^³\lF îcÖAÙ¶E“tFÃMSË*7RjÞFÞδ׀á–öŽnsû­Þ¸=4"&îpòÑô̬ÓÙgϝÏÉͽpáÂÅRêèòåz,#ódÖ©ÓÙÙÙg@gK§sçΝ?Ÿ““{?€½që6b}Bî[1TKª\ò%ý)0Å0}LF¨@´àJ>Daqþ<”¤ׁU5rúTÖÉ̌cG“ãDÓMË½xLs°maÞ½“ZÒº)t©ßUç¿å8£ÑéH©V]Q“–m0þ¡:Õu¶—OÀÚMÛwíÙøHJjÚ±ôŒãÇ3A'J£“ ¬,h §³Ï@ðç^¸DFa0gºÿï[‘Xe»Õ’BÅ@}Kžs¾&LñÞÀÛ7¯_ÅΏ„Ö`q*+ KSòkÁÊ8~<#ýXZjʑÃñq1ûöìÚ¾im€×lש¨aì«hÛ²‰¨n-vœT¾ƒ_½‘tª4ÿÊ4!TGYOtr›»Ð' p㶝aá‘1±q‡“Ž$'§¤¤¢Ž–Biiiǎ¥CÉþ+׬۸e[ÐŽà]¡¡aaa»K¨=Dááá{¡}DEï'I=9õ`=sž¥úäY;£³x±äP_や§)ÓK¹ç`֑ž–’t8þ ÆV҈§å*Ñ%Am„†î - Þ´mËÆukVúû,^0ÛmÚd;«‘æ=º´Wˆ[Â0é‡ïkÐì[îã$®S%ù— U© -p jëàäê1×k±_Àª5k×oØ´y˖­Û@A†k;§;vïÜ Í#lO8$õظøÄ#8e:sþP½u—<º-M¨²Ù— ÔÇï¦9gOŸÈ¤ ÄDí‹ß8vïØ¡-¡×…Õ±u˖͛6¬_»fU€ŸÏb¯¹®N¶À´?$_•T7P1û–s—ª›éP BÕ¸¥ $`3¤j9~âÔin³æz.òöYæ°bÕê5k×®]»®DZO´aƍ¡ylݶ}ÇÎ]aá{£ö֔´ãYx‹=|üŒYæö¶D›wþÔY‹KõÑý;7¯]¹”{öԉôÔ#‡ÆFd¼=h+ÐØ´ŠDËV‚‹‚Ú \³fõªþË|¼yΝå6mêÄñ–ÈÔ ’¯IKc T2LªìËBÅñ/NU!Të7jÚª­\C¨Žcmïàè2Ã}ö¼^‹–x/õõ]æççO´¼D -­X±r4µë6lÚ²m;ŽÁ¢bNªgr.æ_ƒLC•Í¿%ƒÊ®ÅeõzÁå\ˆÓôÔ¤ø1ûÂÃBvmÝ´qýÚ@À±råŠP®\­ -?¿e¾¾K½—,òZ0o¶û G{ë1#S¼m«¦êc Â0 Ǿ•Ë¿4Tq,jܬµXTÍ eicï0ÕyúŒ™³çΛ¿ÀÓËká…‹ ×bFK–@ÛXêcyÀÊՁë7n - ߃T3OÍ½\pBõÉ3.ÿ–*ɾ4Pñ¡X62=±;dÇÖM [®Xîïçëã³ÔÛÊÅÑÀ+ƒúðòò\0ÞÜÙ3gLwžê`oc9jØ sdª·nÖX„C_.PË=ûêä_ Õ¯ªc5iN¨víÑw€Åðі6v¦89»¸Îp›éîîá1‹h¶ášš;Ú4Ž…ø>~Ëq¶u{Ȥšrì>¹½vó.]»XJ¨ìk\FõLVÆѤøبðÐàm›×® -ð÷]ºdñBdÞܹXº9^­ -w÷™n3\]œ¦8L°³±=Üb@ß] ÓæMD˜|±GÕ“**ª_×ø¶VèVª\Ý¡K·^æ-†ceck?qÒä)Sœœ§&VÓ§OwumÃcöÌèÞ¾0²†ypÈî}û%ÍÈ:¡zƒäßWÜ6R@}MVÍ?¸{ëyz},9á0ݱuãÚU˖.^è9îìYˆ¸BḂºpuPNNŽŽS§Lž4ÑÞÖÆj̨áÍ{uëÒA-¦Ð¡Ö©õm¯µZþPuBÀ˜€ëÖGªmeªöºvïm>`ðÐá#Gµg3ÞÖÖÎÞ~j¢šDäàà0›†“ó´é®n³çÁlYÀêu›!V£$$;‘}þÒ’Ÿ¿ü™ÝfW¨ÌbܛWórÏfe¤&ŒÙ¼uCà -¥ÎŸƒù⠈L™ …£¥4èÂHmØÛÛÙڎ·g5vôÈáC0ïݽk§ö*Y[dZ¿.&_2ô­ @Õ U’€¿©I¨6iÖÊDªPwèܵ{¯>ý ²:lÄÈQ£ÇŒ;֒ÊÊ CY[[Û@Ë°³Ÿ0ÑaòT'י³æy-ñ]¾zý–¡{c&=~ê܅ük·¸ ¥„Êl…¸çFÁ¥œì¨±‘»ñ6ފeÞ çÏq‡ÐqŠÃ¤ ÀdüxkkRL.‹©‹±cnj=jäˆaC- èקW÷®;¨R“V͚¦5¿á’oÅ@åÀ0WÅ\©þ(jÜ´e±L©ißÉÔ¬{ÏÞ}ûõ0pÐ` ‹!C†¢†¢áD#FŒ9r4Œ±–V֐Ï'Mvœ6ÃcŽçb߀5¶í„P=œ’A¹‘Nµ”P¹Á/Ž“n_¿r ×%ÄÇb›×â=Ÿy³Ü¦“.p¼õ8˱cF”‘PDZÖâ_©!C,,8 ¿¾½{v73íÔ^£”‰Û´lÚXô#2­N’/ÌQ+(PõBõ³Ïªu~52nŽXêv:uéjÖ½GÏ^½ûôéÛ×Üܼ_1Õ_« A³2tØð£ÆXŽo?iŠ³«û\Ï%ËV®Ý¼#lß~\j™C…qRþÅs§Ž§&ÆEíÙ¹uÃêåKΛ5cš£Ã[k’2‡ T 8 ª-v±.j¤oß>}z÷êÙ£»Y×.:´S+isãF¢ë0L™ä[QPßEµÖõê7lÜ´y«6m%r¥JÓ¾CÇÎ]LM»š™™uëÖ­{±ÕƒQOP¯^½{÷ékŽ!?xÈ°£-­m'Uy }–¯Ù´+"æÐèTsÊêZ¨¸"ÿ¹¬Œ”Ã"wo^·r¹‘7u’ k „œÙ¿Ÿ9áÒ«””-u1/jꥫ©i—Î;´×¨”rIÛ6­š7mÜ°~½jUS„Ê$`†ê75¾ýRpƒ†!Z[W©\¡T©5íÚµoß¡C‡ŽÅS'VA]ºÐ6Ñ­{^½ûš÷d1lä˜q@ušÛlOo¿Õ¶…„GJJC¨e õ -㤔„Ø}aÛ7ჱyîÓì¬-G 2x@¿¾}0ʺ™uE2]°¼\á‹s¥P'íÛ·k§Q«” -¹ˆ¶†(mÜ°¤Þï¿­ñ ǔI¾•†ªUc°¬Mš6oѪµI[±D*•ÉärHY<©©Õj[4‡N]L»vëÑ«Ž©GŽµ¶spr5ñ²•ë·ԃjÙEêmúe î ݾqÍro¯9nÓ¦LÀ{ûõíÕ£›„Y§Ž” -̖½8׉U"—ËdR©DÜÖ¤u«͛6!H1LaÜ«Ë´¢• UHÀ”ê—_}]‚°Ö«/®Æ͚·hÙ²UëÖmژ˜˜´-–ÄŒ$ )i -íí;têljÖgJÃFá½åéîó1P1ýžÉŁR~ß0£_(]ý-0R§N÷X°ÄõÆí¸ õø©s¯\¿}ŸZLèZüƔYÌB¡>yp÷æÕ˹Ù'ҒFïÙ¹W…Íq#O<‡âý<˜V„Œo {6…pkŒŒ°ôô:>z¹¤^êÕ«[·Nj×B¢5k(%H+‹)ÊR%ÁJ±B¸"X hkÕ®]û‡¨§ºu±`“üݸ †Ò2¥†@…Hµ?ÉiÆl¯¥›ƒwGÅ%¥Ñm“ÄŒ@ÿ)yñ©þ©õgf7Œ”N¦'ÇïÙ¶~å²EófN›l7nÔÐAx“¶c;•\ -³–Í›2 ”DRBN¬>xáP7PCßO -AJ‘2©—cZ¡PYªL°²X‘ë×ß@ÄÖ¨YØݏë{*¶`ˆ“~™¤MÄjϾ‡ŽÂ33çb—º »Trï!ï*Þ%Ôqøù£°#O1Įչ¥Dî>°ê’Ó§N°3|p¿ÞÝMª¤mkdÚ¸¦PŒ9-'¢]5VÔQ ˆÐo¾F¢,R6L+i!ª+$áÏ¿ `¿"h.Uª&mHs7bªÆͨ»tëÝoðð16§ºÎZàí¿f“^ö½ÇyÁü¦»Ù0¦Tj¯›Ùü»n…ÏÂ9nζ–#‡GdíªIë–ÍSìiýŽ‚ªù‘‹ej+p~E€~ñ9$^‚´2™êRe±"WÉ¢¾bõõGD[Â%c­êԃ9o£&U"WµïÜU7P}W®Ûº“›¥Ò'o/´Kõ=[ŠEôvu>.ú}AŸ½‘ÝÀd¦´qµn¨âC2Bږ@mØ'#d CŽAõquBjy"P$Ê!­<¦…±2\ X KØ}ùQ1ü¿þšäío¿ªôþT³–mÚb šv'äñ“]g{z/'›@oçkŸ‘³Û¤J`±Æì4&;£˜§äì-ý(ª¾¸0w²Õ¨¡ûö4#¡JïìA ’Á+I¤4ð«Š­¬¦ÿP  ÑÊFªC•Ã -\,ýŒÀeõù‡EÑXÄZó»ï)Ô&M[Ðçy]ºõÂäkCßù‹ýV­ßFo'ežfŸ¦>c#õ·úp½å¶¥2 ÏnàÒ*‘û›Ö,_ÊÎj† èÓzU¥¬më͚4!TfBB2é— ¬÷I§VH-}J€Q-ÒJeÊPe±"W‹d)[NŸ}X;f}¡ú}í:õêãcL¾êöÉê§Ñãì'“-+ÖÂÐ7ò@BJ:»îúZÇ`ͲœéÙ>þ3³ì÷æ5ò B5:À«ü0;N´;¢?Ž•4øøBUTŸ@­Yãf´ó9Kë=Ò«RSŸP HT‹´ò˜êa%\ XBöïGô)“³q…·0T TH¾bìPÍzš“ÕÁÙmŽ×R|B -C_ ÔsÌbB„úcPBƒ5jZ…{)Ô[s TSð9yð–µ+|ÍswaGÀ¸öD!ªÆ˜{¶ôÎÁLïÈàú¸:ú ”­HµX)W -–AË꓏èßÌ‹¹Až àƒ¼­Å2” ’l`Šê¹Äoy@‡&gr ûâbn€ú’ñázS2ƒ5jzŚV‘ÅÜ0TÂP=Cöý.Sì¹Á’ºÕ–¸T¡^æF<¹wð›Mß/½Úajì:D+)ªšWŽìÇÅAÿ·öfc ¨|[ಧvX¦“˜ç3ë¶ãóñ#i™§Î]¸\À@}Îøz”Ü_¸%1ž‰]$šrø@Ԟmø¤ŸÕL¶·=Œ¥*nӂ.V O̘{|ÿ港Øj«V…¢ªiõB*ÙOè½F„JŸ¸7Àµ­TÉ0ii _ù‹|WnÚ¾+":.‘¸…à}º‘ú?üôs)üÕÐùŠ˜±<¥Û¯aþÍÂPÝ¿/,x t«Þž³Ýœ'ۏ=lPíÜ^%·n ˜„ju„Joò}òQž…+I§þ*¥žªé«p±ß«jïI}«ñy;³ ˜âunçpœîN—<@òŒ…@¥ëóÉnÆÔþø+•Ø^˜_½ n,Ò}Œ—sϝ>q,åp\tÄ.\©´lɂÙ3œì(U3¤Ú¶Us\+ö†êW*sK¨·w«P­U6Äw©šâ¨~¢}Üþ]­:t›D¡éˆëà ө.îs½–úã:°½d!w橳9dÛ± xLí•Jå®FœÈˆË}b\…P³Ofà"ýHHÀ|͟åêD©šÃtµRjÒ²$` Uîéö'Sƒ*£²á}PcežõàcÙ¯«û=Œ’°CËÕM{ôÀx¾KÇJ¡~öº6’/ ’:té֛nºšBö½âÒЭÁa{£$9šŽT/ IÀuƃ‡:g•Ì\í!gEvÿ:ìPë*âst<-ùðÁýûö„m"KEçÂÄf"{‚.ªo‚‹êéìÿè®CáÅ⋍Uº0‘."þGIM[´µ³Y¯~xÓ&yÌ[¸ÔYš¿/&.ìOE€KyW -ˆÏ­Û:Þj†¹«q"^dh™„;À4÷ü™S'2ҒŒÍÖø’u…S&Лݺ´ÇLC•Y­«µ²k¸2¤õsvkÙpE’/3™AÒÏ%ËVnغcWxä~€šzìøÉSg€êÅËyÄ[éÚuj­VroµŒE;²KrΟa¬Žpç[ØÎm›Ö®ò_ - XÛ­BæB•ìáöJTøî*#}¨ìÎèQ!PÛw†ä‹w|í';Ϙ5êڍۂCÃ#câЦ)¨fŸAž‹ŒoqV+±·ý0º‘åÓ¤œóg³OÌ¤É T´ÜÀP3“KÀÝ»´W‘P-²æjá94û6ÆU7Pq”´Øwùêu›êž}ѱ’ó-ꬔ““KŒÕJ鬆g@ ¬œóçАìÔÉÇÓÓRŽ>t &’B]³b™7ÝÍφjGµ¼m+ÜRZhûaÅ­í¬rª¦¿1²:—}í:™ÑG3vÔGb‰oÀêu·îÙsà`Bâ‘´ßAc¥SèšE}ÕJe¬FN@ýÈNeDÛ¤ci©ÉI‡ÅíÚ»'4˜@õóÆΓÙ^µs;…„Í¿¤S­à•õUP… b—Z¿!d_ ;¸Ô ³/º|ÕÚ [‚‚wÕh꼅¾JiÄ4‹Úª•ÒXÚ‘eÂɨ Öєä#‰ ñhâ±wOXÈö­›Ö­Àío³`¨¤Í¿Ji›Æ ëWü¦ÒªªÂPI—Ú´¥‰TÕ¾Kw˜£ŽÄ9ª3Dªçbÿ¸‹¨†¡GËþqh«”˜t„˜ªQWµÒùª1§H!ŽdG’'ÄB£(tñØI,V-÷]‚ûß´PM;ètªT”ÔÏ©…DÝ'©,ÔÉN®îs,ò^¶œÚ3¡E˞ˆ½‘QÑ1ûcÄÅdLÕJg«¦õ#CG²CÆ8»?&:vBC‚ƒ¶nZ¿vU€ßÒŞs=f8O™0ž.X¨2íHI€ú:P?}'TH¿ÄîÅmÖ<ÏÅKêêµëÑ¡%xç®Ð°Ýh™µXª1žj¥pUÓu$‹ŽBO²È}{÷F„ïÙ¶‹XílÞ°Ž¸-ñš?{æt§Éö6cÙH%P0PYë#j¨˜~Ɍfô8²q&qðõCƒ–u6mÞº-hûŽà!!»v…Kµ’›ª½Ë’ MÉBwQ¬íÛ¶nA¯5«Vø/[Šî®Ó¦N²7f8®ÐŸÓPÿ¯pŸª;MmG± …ük7i*P5w×bo?àº&pÝzj˜µeËVâ¨VKµ˜’mE[²Í›6nX¿n-ZY-÷ó]ºd¡'Ms$.9¸²Û¬s;2PúT­Þ=úmޚ>¡éÓßbøh+{ :ÝÍ}öÜù^‹€«¯Ÿÿòꗅ~jh¨VRKµ÷z’[2ô%[½j劀åþ~Ë|–/«9n§öã­Ð&§O®‰MN¥XªTU½{žJnçܦ—ùÀ!HÕnâdGÆokþ¯…‹/ñ^êããë»l™Ÿk¨VRKµw{’[2¿e˖ùúú,õ^²xÑB/ÏùóæÌr¤NS&ÙÛX1„øägªøô>§ êßQú‚½£Ôˆy˜jÚ÷/5vÜxû‰“§:M›>ÃÍÝcÖì9Ô.ËӋ¸©•ÈO­8¶dhLæåé¹½Éæ̞åáNìv'Oš`km9wªÒU…’6Ü}ý;J•]¹•¦jzjŒ+S“檸ì]™,†m9n¼Ý„ISÐPÉeºë 7·™ÄKuS+™¡Ú‡mɈ3™‡»;µÂšN쓦Q»ñ֖cF³ ›;áúßVºÏÞ*Ðü¨ÊJ •}JíAÃF‰ùN‹–­ˆ:¨ÓB­l…ß˸`µ¤F;¡5@Ÿ²ÿTŽ§U•;Ö¡Š^‡€UkŸÖ„šfµâZ¨•¥è÷¢KYÓ¦ÆM´>eˆ´&»ál£ù§Ð£¢t—é³6[_£kÔd‰Z£FÅ4P+‘¯oˆ6eŒOِxщX q[£þ§W‡j¥KU‹õj²U ­•ê0¾YÅôO+16eÔ§Œ1d©Á¹Zé8 LÿOß=R}·{ÚÇýÓÊ[¤ï0*û¼°QYeWi»PÿŸÜöc‚•¸§U׺§Ç>­œõ­Ö¨Œì±Hµ;ÿg÷ÐG• ÖO_«ožVû´rRu­Sñ¸¢ÎVÄ{îÓÊ6*«’ª¦¬úæi_ꙧ}Ü>­\ô•žSٗït*˜ê«šn°r\ 7O+_Ui§²*(–jaó´ÂÞi·O+镠j:•UAUÓÅúÏ÷z§}Ô=­œT¨œ½U•r*«‚ÒbåLñ óN«é[\ýSß´£²ë°ê©šÖy§•·þVeUNÕô¸rd«¨ -›!UvíUYU«VlÕü~w«Ê®¹ª­jz*–qX%H¿”•]gUû;©²+ëo¥Ê†U UvýíUÙ©*» $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A<‘±qwGÛnÖ®ÖF#z›öVXÁσ­§»Ú¹õ0j$‰M4"±H*’ˆFx‰á¯#l”¢æ-D#†̀ÿÄ¢Fb•\#–Âï*Uj¹LBþ"V¨Õøi±D£„#ä¿Öðûƒá÷åbFÔ~äþ No¢Í4ÒÈLÄb‰H¥0K52ÑT#©ÄD¢T(¸#æF‰\*SsG$j±D¢©d&J‰ZªýYb¢V©DfFì©ÔD"Sªð챉L'gO Ç5j¹\Ä~)û³™‘\i¢‘h˜ÉxŽÀŸR©F$—™Heð/©‰L¥’©LdrµD$êËp -8¢”ÉdÜs<"Qã9˜#2¥‰Z*SáÏR¹šûQc¢k*Ñx#í™JUȞ@—#W*DìW°?›©T&R¥BÉ1Ç#*‰DÃQA]¨RîœÚŸÙoe0ÅbOÀ–šý -í•âoˆ¥+E¥¶v”@çbkO©†ŸáË´Î4m…käÐФRîˆFi"QÈeCîg†2œ‚9Â4sí¦¥°§d[R¡ÆgfdcdlÕÖÔŵۤñ®“œ­]´~H·j0WhLr%dH®ødøRˆ$Ì¿j™R¤R*Ȅ¨& D¦>iNYDN2ÚD!…¼"—Ð3â*¥HEÀ$ ’BQTX2%ÞH©€@a¾ÁF†%Pa•@-“’À?ËTjHŽ -Èblۘ©J >¥Z¥É!QŠ5$K¨á¢D -HvR¹¾ƒž^®€x—«¡‰¨øÅJ±X‰Ë 7PJ |ÐTàg¥DŽmD¡6Qk +¤&:à4b  -éL!‡Ìþ”*eRü¤T%QЮHª«1‡j$PVè‰Ä*± ¯U*–HE -ˆ0‰š8|‡štPb`ÐHLT*¬- `ÌÆbH RèåR•êY"†r+åØîŠüºmh^ð+r¼DɪjŒs¥„öo œÊ¡R©H¨ÐhH˕CWƒÝ™`‰”2¨# xh/j5T2@Ð;(„[:”Ú -”®\Ž…S+BþF{ZH(J<.WË!3µ„|^¥†ÎڂF)Ç/€¿©dr–Ú?@Vaëâ7ÊàLP è¤j ¹ ^«CH%‡?¥r9Ô9 –‰ÕJlØ2HðXãR¹ yˀšZ-Ã2¨ÔP pŒÆ54G¸æB!] -õ:ÝȒC[á"‹Œ„DJŒ(§Â/†f40¢ VËHÉÄb)/Á ÇˆáÐ'Aß­ÄnG8rèò @d*’gdx°ï–K±fp4=6éìá< -¬E…¾š¹L -¡u¦‘BÝÁ UèÚ e«ÕPËðr|ËƔZ¦&EP‹ƒZI‹¿©’`_+‡N’€DEû72(À±•”M­Ð -øJ†4™œ|»3l -0LPá)¡ËUÃIåtƒ-H,“@8CŒJåðRZ¸\h´ -Ä -D™ƒNM=ؘɸó† > Çn +ΌƒlŒ˜X`¨ ‘CQHLäøF5¦~š)¤W2 d48‚Ö*úó0‚©ä -ò£)ð”Ð#B¾†V‰­ÏÍó˜TIF®d"Ãñö*¦7Àl8\¾FgÏ5¨’-H{ƒD …R’©!±&§Tà_4$,°IãW©!!a©q4…ÃWÈøP— -¬[ 6%éÿdØ%A•*0C.Vj°%A(jZ( dO¼P™ ÆO½ÅPØ”*1ûK%ð›ÀY.c¡¤ú7þ þY¨{@˜ ý@¥aæ Cßù·Î؊ŒÞŒ­fÀÿÄô¯†Ìcð·¹Y ž¡wÉ!d­ŠLaŒ­ŠNb †Ncà#E&2:NJ=•1¶*2™COgŒ­ŠNhÈ1æ4ðƒ'5ÆVE§5䘁øŒ¡Sú5ú“8fðô†k&º ŸâÀg -Ortwšclõ¡!,d²cH ˜Âosø|‘)ö˜!“øTái2xâƒ_^xê£s¬¸“üH‘é4xT´†ðDši“L„ðÿ M… ¸HÍ™iB'+2%‚Ôfè¤>RdZ¤s¬Ø#¸„"S#8fðä¨Hí˜4h¯AƒácÓ$ ›Â%¨É"S%HÁ†N– ï8]" Ï° “±•ÁS&øˆA“&òN› ±ÁВ›@½ç÷ڎèg>´w7Q;Qón.NÎÓ'ZÛ:Íl!j/jnÚ["¶‚À¿¶µ¦Ÿv±¦Ÿ‚™ÎpuѧO“fÙµµµpu™ä8ü*~ÜÖÉÆÎÊ´·Æj€Ít;7;[«¾vVô—¦Ó32÷四::9’bšwåžk™[{ع´icdl<Ðz‚ÝëISì\Œ&L·v³Y;::¹Z»Ú9ÿˆ&¸ØMwur±MŸè4ÀGØ_76î> ‡ÑÿTŸ endstream endobj 104 0 obj <> endobj xref 0 109 0000000003 65535 f +ÅÍ3¨°. £!®Ç`™Gñ¥á¦u¸a:t‚Ÿ—Û€žöÖ­•ìÁèåpÚ}%íáäKÅؗ4ØÓ;08 ómijŽ„qÿ%Œa¯³n•êNA£D’ôô 7ÉàúûW¯9¤…ÌTŸ*‡õÅógϞ>Íϧ÷Ò¶ |û1¦Ú®Y÷O±eX0ù»w±¸· +’ñŸº2´>‰¯‚Éѐ³Ã‚ÇŽö܇n‘5Õ-§S\Ùà—ÄIÌl–V6ݝ† Ç HNœ´}á”+ÍÛz‡¼OìñµIÎ()IQ"̗¸øþ5nw¢‡>Óÿþ÷¿:D>зpduá«W/_¾xñü9½Û.ÞjÿýïÇïAoñ‚1yܧz`HݧÂLAà +n\Çy0¤ºw.{›äK·Èjd-›6$¹Lñ¼å¯Êª6Nb¿ì9Àm¤ÿ$LŋûV20$f¼MCH̑ˆ1$¥$î/|4'®ÄÕ¹RŽé ¡Æ +LÊëׯ‘vÁ!ý]çÿý¯ö&ú÷`›Æ jóÄèŸX¤.Q›Ìbe㪠L-³0júDrà§-wˆv¹œŒ®üÖ¨‡u)[wtè=ˆ9×iÝ·BRñÞ"Í'Ä2zΚ‘ŽM²‰ÈâO\,ˆ@) vtú—.-ÆÐ~Ã¥hWy3÷+Ð. +ÝBÿzMmÐ2Vÿü™õ”öþ˜…„žev÷L¯Zþ×} I愹L ¤½,{¨8ñ[§A“æbUÛN]ñT½ñ!‘ó¸ãbðu×ݏh¬B²öÈÙ$‹’ãHY¢~#@ñmøß Õa áŠkGµíâ½~»øè=Xce°"×·¤e¼Ö1û—Ö Úwc~.|LÏ܈_:/b*I愹LuÒ^–Ô¯ T ~iœÔυ9Ӕ~‚æeÀ)W²?ä,Hß$u8Rá +$ººá}%óQ¦ºD$ȱè6ŒO¶‹Ýã7¦mP«ÃY¾AõšöÝOñUY …ÛF6'¬X0k›ÌI¥sæQYg}×ÑÔ™´jÚCœäê]êìEqIìö^²= Çý¯ej͑C©‹‘CÉàÔ!ª>J„CBÀþGïnŸn»Ç°ï©ÝS½5°ÞÐPs9‘RY̾çèéýF qrì¢sŒkÙº¡ •ŒhZÊ4V¶=úëN¶÷²Û^˜ž­ 9jQêsü ÅÉý¤,ÉtA„ŽŠÐ.>v¶qèõ½¡Eún½m{»¹ÓÉ0—i¹®…J‡©8¢é`ÛsÀÐQc§Ìœ»4~ãvL®€Û{0Û^Þ½×µÅù{AŒœØ‰{vHù¦,‘¿þd™0dõnùév¡‡õÏ? +6Žÿ”~cÆÖøÎïÙ̓yhN†®ä$•¦åu’ +…ÊÎ=à0•Œhºijß×nJÝw˜¦¶yÄmF҅¨o…Pr,õ€þŽXY°×0ŠsÝBþnx‘°î·™KPKŽÇў¤R¯|NR)†©Öö½yx ‰œ¿{|ÿÖµ‹g0?¸*=Ȋ=¬œ ~ó¨Ó£cWý=Ԋ®Ê/HŸ„:O'« ¨ìëT +µ¯óp„ºhÕzõRa¨]‘_” +C½D ®_µ¨0Túî­b¡î9x Þօ*0-(¤ªõ6@=qp u8{Ž`CÅ7oÓg3PÏ^Ê»}ÿ õja¨0PŸÜ¿wéì— u"š²çõ³úÔC{˜Ã!ñ…ªõO‡šò¥C} @ý„ô¡> òATJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py(*%@塨<”•‡ òPTJ€ÊC Py¨ÿQ¨÷¨Ÿ>Ôû_:Ôdjôq¨É_Tçác&L&PR¨¨/=¨)ԃjôô c†;PÏ\º¦…úA€ZXê-Ôk—Î|yPû8c¡î>˜ PoéB¨2Յz  fÜÍBæܧB ~ýí÷?†—D ^, U ªÕ_…¡^$P“âb Cýáûo¿®(¨¾¦}ª@•Õ_Ÿ„:m‚oEB­J¡*ÚttÐBݶ;#3ûbî­{Ÿ¾xýöýo•¥j U8C˜ÔßÞ¿}ýâéã{·r/fgfìÞ¦…êб‚B­Z^Pÿ¥…jj¡hM¡M‹Z—¸mWÆñì ¹7ï=¨oÞýFMÕ Tuõ?ÄQWRCýíÝ€úèÞÍÜ ÙÇ3vmKŒ[5-ˆBm­°0ÕBýWù@ý¡ÖkljŽP{öô +Z¸2që®tjþ‹WoÞÿ‹Tˎk’-›â’Úøƒxßwo^½Èg ¦ïښ¸raThçàÞÕÜ´q=„ú]YCªÿø‡ÔFÕÚ¡Žµ`ź­;ӏÎ¹zãîÃü篠S%¦Ê`5¨ÊœëGHL¦à}}õ<ÿáÝWsNKß¹u݊³BÇ#T{k„ÚHê?þQfL?UÞÊÚ¾× ïñ!‘ V$lI;pôÔù+×ïàäïkbª¿@¬Óß -+¢aF>üN õ5NýÞ¹~åü©£Ò¶$¬X2ÞÛcP/{ëVòŠZ½V½FMͪ]¯AîÞã¦FÎ_ž°yÇþ#Yç.ã”ÒÓÔT Ö†%‹*ÖðH óäù ¥† +qÒýÛy—ÏeÙ¿csÂòù‘SÇy»êeP͚6ªW«zùAýŠ…Ú°©™Ì²ƒ]ρ̜·,~Sê¾Ã'Ï^ºv :Õç`ªoßS¬Ñé‘5,V=¤:$âIéû·`¨Ï¡K½uíÒٓ‡÷¥nŠ_6oæ”ÀÑî{Úu°”™5mÈBýª¼ ýX½V݆M[Ê,­l{ :jlpøœ%k6¤ì9˜™}áê;ÐTê;À +\ &=ÀWÃQՋf´–Å°0Œ~¤ï€)êƒ;7®^ÈÎ<¸'eÚ%sƒǎ: ‡­•¥¬eӆukUÿѨœ¡Ö¬ÛФ¥TceÓ½¿ÛȀÉa1‹W­Oޕqìôù+y·ï=zò ¨þ +Xkéõ›ŽX¸º\ „U)Ó!Á©Ôóþ +LŸ=ytïvޕó§eìJ^¿jqLØ䀑ný»ÛXi¤-MÖ­Y®P¿¨ÕjÖ·ªÛwqt2Âo"Î&nM;p$ëì¥Ü›w<Êöâ%b}ó¶ôz§‹˜’å°„*ǔ#Jq2(8•òiÞ Ò—/žå?zpçfYG¤mMÄY‰~#†89vi¯–¶0Õ©Y  ~SnP+3P›KTí:wëë2Ü7Ç4 ›S÷ÊÌι’wëîƒGOž>¬¯^¿þÕ zCÅ0fÜ:±Wc5Ó?h€ú;õ”ï)Eæë ð ¯_¿¤ÏŸ>yôàî­¼+9ٙ‡ö¦nNÀMïp—¾Ý:·SIš3P+—ÔÔ*ÕjÔnФ¹˜LþÂ@uÜԈyK¡Sݝ~4ëìūבêãü§Ïž¿xñâe©õŠÑëפ‰ Z–+c­ ª5S&@ýxÊ·„$~3[ŠW¥{¨‘çϞæ?F¦×¯^<›u4}7t©KçELÃT2õ+nÞ¤AíÕªáKš²†Z‰ú}•ŸjÔ&“¿­a :Ð#¥˜Eè÷Ê<}þRîõ[wîÖ'ùùOŸ>+½žSÑB­Á¾Ïa-5U=3%H±ï ¯ EDAUÚgyú4?ÿ ½wçÖõÜKçOgڇÞwQ ÆIî{áÜNýÖ®Á¼yûWYN(éBÅ×4tö¡ƒmþn^þ§G-X¾v#˜ê‘“Ùç/]Í»yûνû>zô˜èI©•Ÿ-ä)´´»f°êP-5Sb¦ˆô-†3Øù½@ˆ`”N´*=zøàþ½;·oæ]½t>ûä0ԍk—/ˆš>ÑßË­ÛìÜÃO?”Tòš†¨Bø ‘R?—a¾ãC"æ.Y•´eÇތ£@õâ•Ü¼·nß¹{ïÞ½ûTJ©‡¡…@AëÆr¬¿ýfªLÊ2eb߇8 •æ˜z€¹{çö­y¹W.Ó£{wlIZµdnDÈxßa.ý N‚àW;L-ۗ4ú3ú8¦ðW¢j ê Ñc'ψ^¸|í†ä´}ž<}6çҕ«×ò®ß¸yóèviut÷.4hÑ­®€;×ßгTKc¨¬ë}O/±ïO ,‘ÅÝ»XŠÒ=VÆ͛7®ç]»zåRÎÙÓ'ܗ–¼aíò…Ñ3&í1ºÔ¶* ¿8¢)‡ù|•¨BøÛ I3 ekk»žܼü&„FÌ]·nSÊÎ}G2³²Ïž¿péò•«¹¹¹×@y¥ÔuÐ l!·ÑúÁ­WÄÊ+k«%5U­óe˜²HW‰–uëæ7 ¥z ¬ +¨‘«W._ºpþlvV摌};S6­‹[<7"t‚Ÿ—Û€žvÖ­•͚4 #n˜ZöP¹HÉÔLnieãØÏÙÓ;pòŒ¨ùKW'nJIۛ~èhfÖéì³çÎç\¸pñâÅK¥ÔeЕ+W¡…㿅ÝõÃGˆõ%·¢TKî€õ™¢™Â8òé“Ç@€˺–{õê•+X’Ë¥y¨ rΟ;›}:+óè¡ô½i)›W/5cr ·§s?G+K¹™)'•9T1Í÷Uªþ ªIK‰ºm'‡^ݼÆM Ÿ½pPMÞ±{_ú¡#Ç2Of:}t¶t:wîÜùó99.ã°·îÜE¬OɼCµä¦Ê9_ҟS4Ó|¡Ѽk¹`Y„ÅùóP’R<VÔÈéSY'39”¾o÷Žd`ºláìð©Ac¼ÜörèÔV-ii]êÏU¹à· G4Úð—FJ5눚4·P@üÛLutÀÄЈ˜Øe«×mؒ’¶{ƒ‡=vüx&èDit”• ätö0þ /“( ÆLã¼±U¶[-)T4Ôä=ç;Âçîݽ}ó:v~Ĵ΋SYYXš’? VÆñãǎ9|0ãÀÞÝi)[6¬[½,6&"tbÀh0Ôîû*,š7Õ©ÉÆIeüêEJЩRÿ+Ó´Sà:Ü'pò´ˆ˜…KãÖ&mܚ’š¶kϾýÒÓ32¢•B‡>rä(4Ì'Ñ«coM°Þ'TÑ—ÎT9CÕcJ‘ÑsgÀ´Nd?0Ž@aJü ¤&22ÒÓìß·gWZjÊ֍Ikã–.Œ‰˜69Ðg¸ë0Ôvõ¾´K-ë8©`§ús­º [ˆ•­;Ø8ö4ÔkÌ8 :{þâå«Ö&nؼ59%uGÚÎ]»vƒö”B{Aûö퇒qðБ£ÇOœ<•}.ÆL×o‚±ª¿¾ÑsÀ%`úk¨#!Ӈ÷ïÞºqíêeˆgNÐcG"0öïÛå)ñÃ`eìÚµ3mGjJòÖÍ×®Z¾xþl`:nŒ×ÐA}m:´VŠ[7¬[ëçrêR9¨dúýo4Uuێö=œœÝGÕÐ𨹠—,[“¸~æÍ[¶nݶ-™(¥¤Ú¾}{jêl»÷ìݟ~ð0p¬ÈÇ=j«Ð­–*g¨ä='Ø)0½ŽIuQð•ûöî@# +T²'¡±mÛÖ­[6oÚ°>1aMÜò% çF…‡ӑîÎN=ì;¶U£¡6 ÞW§K-C¨\¤DüïO5~P©¹XѪ}g‡^ý]!a]bbRRÒújÑƍ7m†ö±-y;qêéÖ3çYªOŸ“µ3:‹Kõ.Hx–O™^¾pFGgìß»{'ÚÖ6¤±iãFZ®=ÔFb⺄„ø5«âV,]´`ntČ©njôpéßË¡sûV +qs“~©ñõ¾e'q*ñ¿œ©JUà€»Uw/Ÿ€ É¡3"¢bæ-ˆ]¼dÙò+VƁV_«9­Y³&~íZhI6‚SOMÛ½ï™Îœ¿TïÜ'¯nKcª¬÷å 5ÿñÂ4çìéÇ鞝;R¶mÙ´q}àX¿f¶tÅ}.¬Ž•+V,_¶dqì‚y1Q3B'øx¹Ónà|UR]CEï[Æ]ª®ÿ¥¡˜ªqsspÀÖHÕyèðÑc'L™1+:fμù ,\»¨DZL´dɒ¥K¡y¬Œ[½fíº¤›·m¬‡gá3¾zœÿœYæö¡D›wþÒY‹K õÉÃ{·o\»|áì©GØ»35yË&p–ñ«W­˖B‘hÙJðPP .X0ޜ˜èYáÓC&O3zøPgdj Î×¼¹1* “ÊÅû²P1þÅ¡*˜jýF&-,äBÕi«§—·ßØñƒ§†N Ÿ9+**šhv‰š3gîÔGhhÈÔ)Á“'ëï;ÚËÓÍy@ßÈT!nÙ´±C_ÎPËÜûêø_4Õª¢51%T;t¶wìÕo ³›Ç0¯Q>¾~cǍ4hbñ5 4y2´ hÓÀð#¢fc¶ru¤šqä¾¹½qû>]»XJ¨ìk\F õLÖ±Cûw§nۘ·|ñÂy1ё3ÃfL#@‚'OÆÒM*æѪ +?~\àØ?_ŸQ^Ã<ܜöëåhß¹ajÚD„Î{Tm˜T.PYS­òSõšµ¡[ªruëömº÷ê7`‹›»çð#GöööññõõS<ù±ò÷÷‹m#hâ$ôèá‘YÃ88aý–í»ö:–uLõñ¿¯¹m¥€úŽ¬štÿÎ òöúHúžÀtÍÊ¥±óbf͜1-dÊä‰ €Âqõ+ÆÓA}øøx{5rÄpOw7—Aúõêî`Ó±}kµ˜B‡Z»fõŸªh µì¡ê˜*Àè€ëÔGª2U«¶:Ù:8öìÓ¯ÿÀÁ.C܆º»{xzC /¦FyyyÄ¦áã;Æ? 0hb0D`³bæ/Z¶ºmǞô#'²Ï_¾Füï‹WoØmv¥Ê,ƽ}ýꅳYÇîۙ²9)~咅s0J2 ý%Ø5 +GKY¬#µáééáî>ÔmˆËàýûõééè`Û©CÛV*™2­_/ }ËÉPuM•8૪Mš¶0—*Ô­Ûuèdc×Õ±G¯>}ú8hÐàÁÎT.ÅÒ”«««´ ÏaýFŽöñ 7!84,röüÅ+Ö$nNÙ¹ÿÐñSç.æÞ¸Ãm(%Tf+ÄÃ{·ò.çdŸCMݺ§ñæÌ +Ÿ6eÒxè½GyL†ussu%Å,Æc1u1xð AôwêÛ§WÇ®v6:´k­VHÍ[4mB˜Vû‘s¾å• €a¬Š¸*R­'jlÒÜL,SjZµµ²îÔÅÖ¾k7Çî=zöêÕ»wTß⨑““Sÿþ a vvq>b¤÷˜±A“BfDÆ,X·LuoÆ1²Ètª¥„Ê¿'ݽyí2®Ú¿_‹-Å9Ÿà þ¤ ê:Äy𠁥?‘–µèÏFj£wï^½zöèîØ­«½m—NÖVm[i”2±Ys“Æ¢zÈ´*q¾0F-'CÕ3Õo*3Tk×526E¬ +µeë¶í;XwêÜÅÆÖÎÎÞÞÁÁ¡kÕM+GP÷î= YôîÓ·ŸÓ€AÎC†zŽå0~rHج¹±Ë×$mَˡ S58Tˆ“r/;uüྴmÖ®\2öÌiÁƎñöæîJ\fß>½JîÝ»cAµÅ.ÒcBØÛÛÙÙÚtéÜɺCû¶­-Õ +DjjÜHT¯6Ôq¾åõcTkþR·~ÃÆ&¦-Ì,$r¥JÓªu›ví­¬:X[[wìرS‘Õ™Q­­½š|ÏÞ}:»ºªAÁÓ"f/Xºjݦ”] SÍ1 Ô?µPq/DîÅsYÇ2öîغ>~ù¢¹³ÈDÞèÖ@'>³[WÂÅÆJʖºˆ 5õÒÁʪ}»6­[iTJ¹Ä¬…©Iã†õëþR³b˜"TÆ3Tü©z pÁ 6km \¥r…R¥ÖXZ¶jÕºuë6ES[Ví@íÛÓ6ѱSg[{‡n=zõí?hP81$x:Ýï™ ((úý‰~!PºtŽZ*B™8ÖÇËcÈ ~½»wµëÒ;ÂV–`hJ–ˆ}‚"<,Ԋ™Y˖-š7ofÚÔˆŠêפ`¦U«üð=eÊ9ßr‚Z€*ŒlÀX«V¬µjשW¿¨a# klÒ´iSSP³"©9U‹ÐZBcÌč“À ©vïí4ØmØ(?*éS!Pb7NjsL—ªîäõ<J¸ —@:!Àg„»Ë€¾=»S«v­-5*…\FLòÑ(£b¥@ݘÏF E ê׫S» ­VÌÆ2ÂT‡ê¿(Õヌž¬õgµn=$+jØ°a£FAMƒLL°)K7'.S¨p˜Ô±‹½#¾/@¨à~ç-‰[·y;Ý·“{ãâ¿PåÖ=°yá8•Ù±~ . +CK1Ô¹Ÿî8OL©€šÊfHÈÄËÎ>ÇgêjG„<ëÕ%D+…ÞÌô[Æ÷–7ÓT¬`­?UC®5kýR»v:u.¨~ԀH$–€í  ˜9€…`Z,U¨,[·³îl×­Zêhÿ ©aÑó—®Æ½Ÿ:wéÚÍ»iŠ Ý?ÅcÊ,f¡PŸ>ºûú• Ù'ïߙ¼aí +\6)¼ñìƒóy0¬„1‰oÀ{š€¹5FFXzúŸ}\R/uëÖ©S»ö/µj"Ñj?+%H+Š)ÊR%ÆJ±‚¹"X hkÖªUë—Ϩ6§:u° ‘ÿݸBÈ¡´L©!PÁR‡Žð;1tfÌÂåñë·¥í?L·M’dúoɋNõ/}¨o˜ýÝ)<š¾{û¦„¸ÅsgM7f¤Ç}zà$mK•\ +£æ¦&Œ%‡”«O>8Ô ÔP à‰@ÁH)RÆõrLË*K•1V+r­ò#XìOÕª[ ûyÕ bš8é—i m.¦P»Øwï3̌›Œ]jv©dîáêuœ%ÔÉðógÁŒTgJ‰Ì>°jØÔ ÿÑÃ\õëÙÕ¶“B•X´D¦¡ E›Ór"úÜScå@ýúc$Ê"eÍ´˜ J°‚®üûA p©~ú¬ªÑ6€„Ñw#V jܔÚ¦}GÛ®=û r>:`ÂÔðèËô¼ï.Ìﺐ‹Ç”ƒJÓkàf`Öÿ.š1mR ¯—»sÿÞäY+€jÞ²ySÂ;EêD¦ ª}æa™ZÁ +œ? ßUÇKV$S]ª,VäJÀ"YÔ¬ª|F´ \kýR».Œy5A¨¹ªU»º†9wÑʵÜ(•¾y{©]ú«Ÿ³¥HDÿdWçã¢ß—ôÝÙ LFª«–Î×5U|I¦QH-Ԇ p0Bbv ªOˆ«RCȁ"QiÅ1-ˆ•áJÀY–èûϊá_¥ +ñÛÕªt~ªis3 4T«N$L:Â;`bHølb¨©{èt¾ö9»Mª)֘Ædg󖜝ÒßFL5æŽôpЧ»}kbªtf •¯Ä‘RÃ#¬>)¶j°š¾¥@¢T‡*‡¸"X û Ëªò§EÑXÄZíçj“fô}^ûŽ6è|]1ô2#jÞâ8:”yš}›úœµÔßK˜‡ë·-•Yxv —>@¨Dæ–-˜=“Õôv´ë ½ªRfѲYÓ&D•Oú=ëï¤S+¤–¾&@¨i…2e¨²X‘+‚E²”-§o>-‚†Y?‚©Ö¨U»n}|íƒÎWݪYý4pˆçH²`N,„¾[wìÉ8Ê®{` ¾ÓI°V ²\Ò+²}ü ³ì÷ö ò¢L5y#Àó¢Ð{wìÔ«ÆJ|ý ¦*ªO VûéG&Ú©ÌÒúéÕ ©©¯(P$ªEZqLõ°®,!û‡÷3úšñÙd၊† +ÎWŒªuÒ¡zùN +‰oh!ôEC=Ç,&D¨¿2©J˜`&­Â½Æêð¿9`ªøž<~EìœÈéÁãýØמ($@Õ¸3gKg¾czGקÄÕÑ¿X „è€T‹•r¥`´¬¾úŒþÍÄXÌy7€/òšµËS$¹{Á5$,jyAž†IÎä€÷ÅÅÜõ“‡ë·’%X£I¯Ø¤Ud1w„Jhª»RÈ^òße”',©¡[mŽKêÖf&âÉÜÁ7¬7ý{éÕScÿÐ!ZáHQ•ô¸rd?/ú¿µ“?CçÛ —=Y¶e™Ž`ÞÏ,ZïÇÎÝÎHó?üú¦ùÕ0óIÆòŒnc¼þ7 Muû–¤øЭ†‡L ôé9d`ß@µ]+•Lܲ8`bªU*äûê³< V’NýU4J=UÒWÁbÿ­þ©“úW'âûvf!0ÅjoÜÎáí?ž.yç»5 •®Ï'»Ñô$¿R‰Ó«‘äW/I6–'é>Æ+Ν>q$coZò¦u¸RiVØԉc}½<(Uk¤jÑÂ׊ý‚¦úÊL âöq¨µŠ†ø1U*¦8ª_i_·ÿ\³6]Æ&QhÚàúpÂt´ßøÉ¡3£qaÒf²;óÔٲ퍤 ȧé•J•]d"#éX’ÄU5ûä1\¤¿ð҅1‘Ó§Lð¡T`¸j©”š7o +M•{»ýÇ´X•QÑð>©bceÞõàkÙ*U«×€( ;T±\Ýƪ³#óuܤð¨¹±ËV% ¡î?xôfõ¹z$ Ixž0©³J‘‰Œ¤"{ü3Waš#ÜÉxòøá{ÀT׬ ›ƒƒa`ƒoVq—ÔK [ ¦Šþ—®ëԙçãϏéóX)Ôo¾¥kÃÑPÁùBÔº}G[ºéjÙ÷ŠKCWÆ'mNÞ±çÀ¡£¸Aõ"& ¸Éä࡙³J–\í1—ŠìáÌ°CSW‘ ‚Šî—Œh!ûǑ̑Q˜ eђeËWÆ­Z½&~mBºu‰$¥Zɓª},%&%K\Gó`­Ž[¹sí,˜7'zÖLÌ0>`ÌèîCõÃ5úcêÿ+اêS-É"–>à=FŒª&O  \,\´˜&ÌZ±b%ɨV’”jŸIJ¶Ӓ-_¶tÉâE±˜ÊjvTäÌ°i!˜øhŒ7ɒƒ+»­ÛY’@IèSµúxôkڒ¾¡±ëÖ«ß@7O ê8~âä)¡ÓkdTôìš/ ó©aBµ’¦Tûۜd$-æ%›?oÙÑQ³"f’\V“‚ÁN½<‡º`š»Îڐ49’RåKÕÇÇ©d:Æ46Ý{#Uá#½™|[S¦†N›>#,|fDDdä¬YQQlBµ’¦TûxN2’–,jÖ¬Y‘‘3ÃÃfLŸ2%x҄ñ€ÔgÔO7—N½IžòNß¾Ñ÷4Tý¥ïØ¥FÌËT«N¸±ß€ÁC†z9ÚgŒÿØÀñA&N¢é²BBI6µåS+JZ2LL2s“Mš8!hµ¢å%c’“‘ôd èïDÒ'õ¢v61GÍhՔYyF–³”w¦œ/RúK˜õ,uÉòü–dyÛö˜žÅ֎$TêÞ£gÏ^˜FæQ+~2µb¦&£éÉH‚2̅EÒ'ْä,m1EÙúÖ¤aLÄ®&üê«r͔óEJÏT™L[„ª ٛŠ0ï&TêÒÓeÙٓ,jEÏ£VJ9eöv$ɞdÕ¾m›V•B&6oÑ̙֮¨”V_¨t¡bÌP­O62¶4Kå +•S*µmGòe1IԊ“F­t"_f)Ê:`",Lžd©&y<è¶cQ}†éL^•ÿã¯ÈQ•ô¨¢®Ê&Új‚;ÉÍÌÅI †Ô,[‘jEM¢f á7¶nE“”‘,e2‰ØܬE³¦Æ\N«ªìRî +H•óŠƒÊ&Ú"TÉfF°V’?Í ¨I¤2Ì FR¨5‡š¤ 9ÊäP©S'™‘4eÆ$©UíZ,ÓÊz¹r*º^+Tú¦ªŸ>­AÃFIòfÍ[j˜A­ˆ)Ô +ü^& Vsšh§q#L P['OÙ·“Óê‹ëPÅ\‡€U›>­ MšE¨5…š!E¿³”™˜7Ñæ)C¤ÕØ odÍ?…¥»LŸM³U³1±‰Z€,ɟ֨Q¨•È×7Ä4eLž²_Àñb$’‰Ûõzu¨VºTµX¤I¶jbj¥ÚLÞ¬"æO+1iÊhž2&!ËO\V+ HÓÿ§Ÿ=Rýxö´ÏçO+k‘B|$QY傉Ê*ºJ¿± õÿÉm?&XIö´ªÚìiEIŸVƪ®MTFì±Hµ;ÿÏî¡)(Ž*c¬_3y=¬~ò´¢¤O+#UÕf*#9®hf+’{îëŠNTöEª’¾±ê'Oû^/yÚçÓ§•‰~ÐËTöýG3• LõUI×X9®ÅOžV¶ú¢3•}b©LžV0wÚçÓ§•ôJðef*ûUIë?ÿ6wÚg³§•‘ +‚KoõEe*û¥ÅÊ%Å+^î´ò‘~Š«ê'í¨è:üòTIk‰r§•µþ'R•}qª¤Ç•#û…ª`2¤Š®½/V•*ûeþûìV]s_¶*é©H‰Ã*@ú¥¬è:û_P¥ÿ%UteýO©¢aA]Eÿóªh€T] ‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H žÈظ“·{G×W#'#c+[… üÜÓÕ?ÀÃϨ³Q#‰Hl®‰ER‘Däd$†?:¹)E¦ÍDNýŒÆÂ?b‘£‘Ø\¥Kñw•*R-#K¥Rü´X¢”‹Ää'Wøõžðër1H#ê?JØ¿ƒ»›+DãŒ42s±X"R)ÌÅRL4ÚH*1—( +‘Dc.—ÊÔ܉Ú\,‘¨D*™¹R¢–j–˜«U*‘µ{A*5—È”*¼{El.ÓÀÍÙ[ÂuZ.±_Êþlm$Wšk$Ú Fr^€+ð©T#’ËÌ¥2ø‰Ô\&RÉTæ2¹Z"’@mˆe +¸\QÊd2îŠ^‘¨ñÌ™Ò\-•©ðg©\Íý¨1W‹5 +•h¨‘öŠL%*do Ç‘+"ö+؟­T*s©R¡ä®8à•D¢á®¨ .T +)wOíÏì·²W˜b±7`KÍ~…öIñ7°EhŸY`K`kG©p/¶ö”jø¾L[áLCÐV¸Fn®’K¥ÜÒ\¢Ë8†ÜÏ e¸s…iÚ LKaoɶ¤ÏÚÈ LÀiüÇÊ·èÍÜÊHMAª‚Ö,C««DJs±R#“Csf¯À7kä¬S)–&ÉÌUJ± +jH † Vi¸ Ð~eæ +¥ö7 ùÂ#J ¶´Ÿ1×ȱ r7¥?³_ ·`®¨¥æ +±F÷`¯ÀMÔr©ˆ½§Z¤ÔpOú¥ìx ¦`ì%¼SxîCÌÓq7ef¾ÖºP8ùƒ€:&ž„©B ùü… êP ÍK¦‹dÀY…½ UCc—¨Ej…ÀÃuòers±Z"á~ËCñ äì#)´~4ö +ü_©”K¸{²?3_jmÄ^PJÍI;h¯È͕jBÄÞR  šƒˆýRögk#¶`ì#¶èìöÑØ{r?3ßj]°6 ‰¢Æö íP!!Õ´»U·ÞŽÝ:yÁgúZ7ƒkã¡ÛÁßzŸ>N¤u5’©¡ýãÓ+飌6/¦Q)•")šÜ_ -ü£Züs…\ ¦ÞPS‡/K‰ÃT˔"•~Të’@ehÀ”4ðyðKr0{9q js…lE.¡wÄ(TJ‘Š€V«’BQTøÀ2%ÞH©€F-C K Â‡º$%¿–©ÔàÍ`Úbl§èZJ1$¥Z¥ÉÁ³‰5ĬÕðP"x'©\ ßAo/W(%"¹‚Z_¬‹•ø!± Ü·Råƒ?+%rl +µ¹Z~S!5—Ë€™R ìÀÿ(äàÊÀ¥Áÿ¥J™?)UI´ïªÅjtz ”º±J,Ãg•Š%R‘¬E¢„† ß¡&^jC, ‰¹J…µ…ƈîS &.…ŽK.oõ,C¹•rl]…~ +ý,4"ø9>¢Œ¸A5Ú¬RB;$‰nåP©T¤ËRh4¤}Ê¡oÀþG°DJÔ/´µ* h€BíÊmJ O.Ç©€¡ ¢]#8%^—«åàـ™ZB>¯RComA£”ãÀŸT2 ¹ƒ Ë +­ «°uHñep'(8t©ZCAƒÏ*ECQÉáÿR¹¹êËÄj%6l™¨AKå2ä-jjpÞP•jn ‘Që…æÏ\À$° a + Óµ,9´βHè"R¢E8~14s ¦ZFJ&K | š6† rpPT †?ª j†bóKÀ 0$‘C"So"÷‚­\Š5ƒáôF¤w†û(°øJhæ2)˜ԙF +u7TIÔjlÙj5Ô2|…ÜO…C›RËÔ¤j1pP+iá7Uìåààñ÷Á HT´¯"½8Crh P6µ@+à+h +Ð drò우)@¿®Â[B渚›Êiԁ-H,“€9ƒJåðRZx\h´ +Ø +X™nM¢lÌ$P@¿!ƒȱ‹Á +;cô ôí9´…Ä\®oT£;Pà' ™‚Ua/¯ £Á¨Z«ê/È +§’+ÈG ¨Rà-¡w¯ ­[_ ú1©’„š$pa}€Šñù荠C†Ç×ÈàC¹@¼ioà(¡0PJb25x"¶¢àÁä” +üœ6iü*58$,5†?o‚·À¯€ºT`Ý¢±)I/'ΪT>|±Rƒ- jD©PÓBiÀ{âƒÊdð€÷C=`CP‚«Dï/•Àog¹TŒ…’jèŸdø7øÿí<̤‘†|úOÆ.$¨2v ÿŠé‹1†À_æFx;¸î%’ƒõ»>»@@Š;„€Dè\+ò0ÂØ¥Ð@.{(aìRx0A®o8)ö€ÂØ¥ð‚\+æ >SÜaýý\+öЂk&ºŠ?¼€Ï`è\*êÃØÅ þµ°ò è8bhÀoW¿ ‘%\jÿjm… AŠa'VðËÜ0>^h ¢½Vœ¡|ªà`.{8‚_^p@¢s­¨CüH¡A ^,ö°¤p áü?I†u]0pÁÿº€m‘š/4|Ñ^*únVhž­¸ƒøH¡aŒÎµ"dà + eàZ±3…jÇá³æ@û j Ÿð Õò@Mô€.î°ÜN1>ÄßoècìRìÁ|¤XÃòŁc)öˆô{ÅÁ÷”`D`s D»Îb …H;*Þ`JVÌá|¢¸"(Wq‡Dð‘bŠ¨™~v`„;4"ÁFÁ<`1‡G¤o€D,¯˜C$øšb’àÅ&Á‡Š;P"VQ¼¡1‰b–àk>7\‚Û~vÀЋ=dÒ6”¢š ,Å6K)æÀ‰­˜C'ÒOfðDÍ©Ï'{>íðéo~Ï©«Cێ"K‘iG?_ÿá®î>㚉Z‰L­l%bøüm3QKúi?Wú)øK‘ÕØ}ï3b‚G3‘E¯¿ÞÃȯâÇÝ}Ü<\¬l5.Žnþ~î.öA.ô—üéI!%ð»Þ>Þ¤˜:çÌMŽ@"O ›ëU©À'&?)$$ÖW`ÈÑ,ZéÇÄ8i íKã*1N™‚‰ÊTl±s·³6"Ÿ”Ê$ð«bz?p²"öSÌW“»áŸ­ØïÁŸpF›)ùEü—½þÀÜÙZï Œ†õ3òþ»Ÿø;–ªCk‡Ÿ™™‘±qw×a½ý\GŒòð3æïè!rõöö p ðð…¿ óóððñóù÷‡Wà#ì¯wrìlôÿNH}Ú endstream endobj 74 0 obj [/ICCBased 122 0 R] endobj 18 0 obj <> endobj 93 0 obj <> endobj 94 0 obj [/View/Design] endobj 95 0 obj <>>> endobj 19 0 obj [/View/Design] endobj 20 0 obj <>>> endobj 110 0 obj [109 0 R] endobj 134 0 obj <> endobj xref 0 135 0000000003 65535 f 0000000016 00000 n -0000051018 00000 n +0000049679 00000 n 0000000004 00000 f 0000000006 00000 f -0000051468 00000 n +0000049730 00000 n 0000000007 00000 f 0000000008 00000 f 0000000009 00000 f @@ -3498,10 +3559,10 @@ Ortw 0000000015 00000 f 0000000016 00000 f 0000000017 00000 f -0000000021 00001 f -0000051069 00000 n -0000051327 00000 n -0000051358 00000 n +0000000021 00000 f +0000868499 00000 n +0000868757 00000 n +0000868788 00000 n 0000000022 00000 f 0000000023 00000 f 0000000024 00000 f @@ -3514,7 +3575,7 @@ Ortw 0000000031 00000 f 0000000032 00000 f 0000000033 00000 f -0000000034 00001 f +0000000034 00000 f 0000000035 00000 f 0000000036 00000 f 0000000037 00000 f @@ -3554,40 +3615,66 @@ Ortw 0000000071 00000 f 0000000072 00000 f 0000000075 00000 f -0000053130 00000 n -0000447035 00000 n +0000051397 00000 n +0000868463 00000 n 0000000076 00000 f -0000000077 00001 f +0000000077 00000 f 0000000078 00000 f 0000000079 00000 f 0000000080 00000 f 0000000091 00000 f -0000447070 00000 n -0000447144 00000 n -0000447428 00000 n -0000448499 00000 n -0000477276 00000 n -0000542864 00000 n -0000608452 00000 n -0000674040 00000 n -0000739628 00000 n -0000805216 00000 n -0000000000 00001 f -0000051443 00000 n -0000051140 00000 n -0000051211 00000 n -0000051242 00000 n -0000053446 00000 n -0000053559 00000 n -0000443823 00000 n -0000053594 00000 n -0000053953 00000 n -0000053990 00000 n -0000053773 00000 n -0000051857 00000 n -0000866269 00000 n -0000446471 00000 n -0000446521 00000 n -0000053192 00000 n -0000000163 00000 n -trailer <<1913AC01336D494EA4250E05957BB203>]>> startxref 866446 %%EOF \ No newline at end of file +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000868570 00000 n +0000868641 00000 n +0000868672 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000180 00000 n +0000052289 00000 n +0000868873 00000 n +0000050124 00000 n +0000445504 00000 n +0000052595 00000 n +0000052632 00000 n +0000052808 00000 n +0000052481 00000 n +0000051459 00000 n +0000051725 00000 n +0000051775 00000 n +0000052363 00000 n +0000052395 00000 n +0000442855 00000 n +0000052984 00000 n +0000053021 00000 n +0000445580 00000 n +0000445873 00000 n +0000446961 00000 n +0000476660 00000 n +0000542249 00000 n +0000607838 00000 n +0000673427 00000 n +0000739016 00000 n +0000804605 00000 n +0000868900 00000 n +trailer <<9525EDA8860B4C8696815887BFBDA0E5>]>> startxref 869077 %%EOF \ No newline at end of file diff --git a/OSX/iSaverRunner.plist b/OSX/iSaverRunner.plist index 0d0fe2b8..a65d7be1 100644 --- a/OSX/iSaverRunner.plist +++ b/OSX/iSaverRunner.plist @@ -4,49 +4,49 @@ CFBundleDevelopmentRegion English - CFBundleDisplayName - ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} - CFBundleGetInfoString - 5.45 - CFBundleIcons - - CFBundleIcons~ipad - CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 - CFBundleLongVersionString - 5.45 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL - CFBundleShortVersionString - 5.45 CFBundleSignature ???? CFBundleVersion - 5.45 - LSRequiresIPhoneOS - - NSHumanReadableCopyright - 5.45 + 6.00 LSApplicationCategoryType public.app-category.entertainment + CFBundleShortVersionString + 6.00 + CFBundleLongVersionString + 6.00 + CFBundleGetInfoString + 6.00 + NSHumanReadableCopyright + 6.00 NSMainNibFile iSaverRunner + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleIcons + + CFBundleIcons~ipad + + LSRequiresIPhoneOS + NSPhotoLibraryUsageDescription XScreenSaver displays manipulated versions of your photos. UIAppFonts OCRAStd.otf - YearlReg.ttf - PxPlus_IBM_VGA8.ttf - luximr.ttf + SpecialElite.ttf + clacon.ttf gallant12x22.ttf + luximr.ttf UILaunchStoryboardName LaunchScreen diff --git a/OSX/ios-function-table.m b/OSX/ios-function-table.m index f6f542ef..c0a19346 100644 --- a/OSX/ios-function-table.m +++ b/OSX/ios-function-table.m @@ -1,5 +1,5 @@ /* Generated file, do not edit. - Created: Mon Dec 7 06:35:16 2020 by build-fntable.pl 1.8. + Created: Thu Dec 24 07:44:49 2020 by build-fntable.pl 1.10. */ #import @@ -42,6 +42,7 @@ extern struct xscreensaver_function_table circuit_xscreensaver_function_table, cityflow_xscreensaver_function_table, cloudlife_xscreensaver_function_table, + co____9_xscreensaver_function_table, companioncube_xscreensaver_function_table, compass_xscreensaver_function_table, coral_xscreensaver_function_table, @@ -65,6 +66,7 @@ extern struct xscreensaver_function_table discoball_xscreensaver_function_table, discrete_xscreensaver_function_table, distort_xscreensaver_function_table, + dnalogo_xscreensaver_function_table, drift_xscreensaver_function_table, dymaxionmap_xscreensaver_function_table, endgame_xscreensaver_function_table, @@ -243,252 +245,251 @@ extern struct xscreensaver_function_table zoom_xscreensaver_function_table, testx11_xscreensaver_function_table; -NSDictionary *make_function_table_dict(void) -{ - return - [NSDictionary dictionaryWithObjectsAndKeys: - +NSDictionary *make_function_table_dict(void) { + return @{ #if defined(APPLE2_ONLY) - [NSValue valueWithPointer:&apple2_xscreensaver_function_table], @"apple2", + @"Apple ][": [NSValue valueWithPointer:&apple2_xscreensaver_function_table], #elif defined(PHOSPHOR_ONLY) - [NSValue valueWithPointer:&phosphor_xscreensaver_function_table], @"phosphor", + @"Phosphor": [NSValue valueWithPointer:&phosphor_xscreensaver_function_table], #elif defined(TESTX11_ONLY) - [NSValue valueWithPointer:&testx11_xscreensaver_function_table], @"testx11", + @"Test X11": [NSValue valueWithPointer:&testx11_xscreensaver_function_table], #else - [NSValue valueWithPointer:&abstractile_xscreensaver_function_table], @"abstractile", - [NSValue valueWithPointer:&anemone_xscreensaver_function_table], @"anemone", - [NSValue valueWithPointer:&anemotaxis_xscreensaver_function_table], @"anemotaxis", - [NSValue valueWithPointer:&antinspect_xscreensaver_function_table], @"antinspect", - [NSValue valueWithPointer:&antmaze_xscreensaver_function_table], @"antmaze", - [NSValue valueWithPointer:&antspotlight_xscreensaver_function_table], @"antspotlight", - [NSValue valueWithPointer:&apollonian_xscreensaver_function_table], @"apollonian", - [NSValue valueWithPointer:&apple2_xscreensaver_function_table], @"apple2", - [NSValue valueWithPointer:&atlantis_xscreensaver_function_table], @"atlantis", - [NSValue valueWithPointer:&attraction_xscreensaver_function_table], @"attraction", - [NSValue valueWithPointer:&atunnel_xscreensaver_function_table], @"atunnel", - [NSValue valueWithPointer:&barcode_xscreensaver_function_table], @"barcode", - [NSValue valueWithPointer:&beats_xscreensaver_function_table], @"beats", - [NSValue valueWithPointer:&binaryring_xscreensaver_function_table], @"binaryring", - [NSValue valueWithPointer:&blaster_xscreensaver_function_table], @"blaster", - [NSValue valueWithPointer:&blinkbox_xscreensaver_function_table], @"blinkbox", - [NSValue valueWithPointer:&blitspin_xscreensaver_function_table], @"blitspin", - [NSValue valueWithPointer:&blocktube_xscreensaver_function_table], @"blocktube", - [NSValue valueWithPointer:&boing_xscreensaver_function_table], @"boing", - [NSValue valueWithPointer:&bouboule_xscreensaver_function_table], @"bouboule", - [NSValue valueWithPointer:&bouncingcow_xscreensaver_function_table], @"bouncingcow", - [NSValue valueWithPointer:&boxed_xscreensaver_function_table], @"boxed", - [NSValue valueWithPointer:&boxfit_xscreensaver_function_table], @"boxfit", - [NSValue valueWithPointer:&braid_xscreensaver_function_table], @"braid", - [NSValue valueWithPointer:&bsod_xscreensaver_function_table], @"bsod", - [NSValue valueWithPointer:&bubble3d_xscreensaver_function_table], @"bubble3d", - [NSValue valueWithPointer:&bumps_xscreensaver_function_table], @"bumps", - [NSValue valueWithPointer:&cage_xscreensaver_function_table], @"cage", - [NSValue valueWithPointer:&carousel_xscreensaver_function_table], @"carousel", - [NSValue valueWithPointer:&ccurve_xscreensaver_function_table], @"ccurve", - [NSValue valueWithPointer:&celtic_xscreensaver_function_table], @"celtic", - [NSValue valueWithPointer:&circuit_xscreensaver_function_table], @"circuit", - [NSValue valueWithPointer:&cityflow_xscreensaver_function_table], @"cityflow", - [NSValue valueWithPointer:&cloudlife_xscreensaver_function_table], @"cloudlife", - [NSValue valueWithPointer:&companioncube_xscreensaver_function_table], @"companioncube", - [NSValue valueWithPointer:&compass_xscreensaver_function_table], @"compass", - [NSValue valueWithPointer:&coral_xscreensaver_function_table], @"coral", - [NSValue valueWithPointer:&crackberg_xscreensaver_function_table], @"crackberg", - [NSValue valueWithPointer:&crumbler_xscreensaver_function_table], @"crumbler", - [NSValue valueWithPointer:&crystal_xscreensaver_function_table], @"crystal", - [NSValue valueWithPointer:&cube21_xscreensaver_function_table], @"cube21", - [NSValue valueWithPointer:&cubenetic_xscreensaver_function_table], @"cubenetic", - [NSValue valueWithPointer:&cubestack_xscreensaver_function_table], @"cubestack", - [NSValue valueWithPointer:&cubestorm_xscreensaver_function_table], @"cubestorm", - [NSValue valueWithPointer:&cubetwist_xscreensaver_function_table], @"cubetwist", - [NSValue valueWithPointer:&cubicgrid_xscreensaver_function_table], @"cubicgrid", - [NSValue valueWithPointer:&cwaves_xscreensaver_function_table], @"cwaves", - [NSValue valueWithPointer:&cynosure_xscreensaver_function_table], @"cynosure", - [NSValue valueWithPointer:&dangerball_xscreensaver_function_table], @"dangerball", - [NSValue valueWithPointer:&decayscreen_xscreensaver_function_table], @"decayscreen", - [NSValue valueWithPointer:&deco_xscreensaver_function_table], @"deco", - [NSValue valueWithPointer:&deepstars_xscreensaver_function_table], @"deepstars", - [NSValue valueWithPointer:&deluxe_xscreensaver_function_table], @"deluxe", - [NSValue valueWithPointer:&demon_xscreensaver_function_table], @"demon", - [NSValue valueWithPointer:&discoball_xscreensaver_function_table], @"discoball", - [NSValue valueWithPointer:&discrete_xscreensaver_function_table], @"discrete", - [NSValue valueWithPointer:&distort_xscreensaver_function_table], @"distort", - [NSValue valueWithPointer:&drift_xscreensaver_function_table], @"drift", - [NSValue valueWithPointer:&dymaxionmap_xscreensaver_function_table], @"dymaxionmap", - [NSValue valueWithPointer:&endgame_xscreensaver_function_table], @"endgame", - [NSValue valueWithPointer:&energystream_xscreensaver_function_table], @"energystream", - [NSValue valueWithPointer:&engine_xscreensaver_function_table], @"engine", - [NSValue valueWithPointer:&epicycle_xscreensaver_function_table], @"epicycle", - [NSValue valueWithPointer:&eruption_xscreensaver_function_table], @"eruption", - [NSValue valueWithPointer:&esper_xscreensaver_function_table], @"esper", - [NSValue valueWithPointer:&etruscanvenus_xscreensaver_function_table], @"etruscanvenus", - [NSValue valueWithPointer:&euler2d_xscreensaver_function_table], @"euler2d", - [NSValue valueWithPointer:&fadeplot_xscreensaver_function_table], @"fadeplot", - [NSValue valueWithPointer:&fiberlamp_xscreensaver_function_table], @"fiberlamp", - [NSValue valueWithPointer:&filmleader_xscreensaver_function_table], @"filmleader", - [NSValue valueWithPointer:&fireworkx_xscreensaver_function_table], @"fireworkx", - [NSValue valueWithPointer:&flame_xscreensaver_function_table], @"flame", - [NSValue valueWithPointer:&flipflop_xscreensaver_function_table], @"flipflop", - [NSValue valueWithPointer:&flipscreen3d_xscreensaver_function_table], @"flipscreen3d", - [NSValue valueWithPointer:&fliptext_xscreensaver_function_table], @"fliptext", - [NSValue valueWithPointer:&flow_xscreensaver_function_table], @"flow", - [NSValue valueWithPointer:&fluidballs_xscreensaver_function_table], @"fluidballs", - [NSValue valueWithPointer:&flyingtoasters_xscreensaver_function_table], @"flyingtoasters", - [NSValue valueWithPointer:&fontglide_xscreensaver_function_table], @"fontglide", - [NSValue valueWithPointer:&fuzzyflakes_xscreensaver_function_table], @"fuzzyflakes", - [NSValue valueWithPointer:&galaxy_xscreensaver_function_table], @"galaxy", - [NSValue valueWithPointer:&gears_xscreensaver_function_table], @"gears", - [NSValue valueWithPointer:&geodesic_xscreensaver_function_table], @"geodesic", - [NSValue valueWithPointer:&geodesicgears_xscreensaver_function_table], @"geodesicgears", - [NSValue valueWithPointer:&gflux_xscreensaver_function_table], @"gflux", - [NSValue valueWithPointer:&gibson_xscreensaver_function_table], @"gibson", - [NSValue valueWithPointer:&glblur_xscreensaver_function_table], @"glblur", - [NSValue valueWithPointer:&glcells_xscreensaver_function_table], @"glcells", - [NSValue valueWithPointer:&gleidescope_xscreensaver_function_table], @"gleidescope", - [NSValue valueWithPointer:&glhanoi_xscreensaver_function_table], @"glhanoi", - [NSValue valueWithPointer:&glknots_xscreensaver_function_table], @"glknots", - [NSValue valueWithPointer:&glmatrix_xscreensaver_function_table], @"glmatrix", - [NSValue valueWithPointer:&glplanet_xscreensaver_function_table], @"glplanet", - [NSValue valueWithPointer:&glschool_xscreensaver_function_table], @"glschool", - [NSValue valueWithPointer:&glslideshow_xscreensaver_function_table], @"glslideshow", - [NSValue valueWithPointer:&glsnake_xscreensaver_function_table], @"glsnake", - [NSValue valueWithPointer:&gltext_xscreensaver_function_table], @"gltext", - [NSValue valueWithPointer:&goop_xscreensaver_function_table], @"goop", - [NSValue valueWithPointer:&grav_xscreensaver_function_table], @"grav", - [NSValue valueWithPointer:&gravitywell_xscreensaver_function_table], @"gravitywell", - [NSValue valueWithPointer:&greynetic_xscreensaver_function_table], @"greynetic", - [NSValue valueWithPointer:&halftone_xscreensaver_function_table], @"halftone", - [NSValue valueWithPointer:&halo_xscreensaver_function_table], @"halo", - [NSValue valueWithPointer:&handsy_xscreensaver_function_table], @"handsy", - [NSValue valueWithPointer:&headroom_xscreensaver_function_table], @"headroom", - [NSValue valueWithPointer:&helix_xscreensaver_function_table], @"helix", - [NSValue valueWithPointer:&hexadrop_xscreensaver_function_table], @"hexadrop", - [NSValue valueWithPointer:&hexstrut_xscreensaver_function_table], @"hexstrut", - [NSValue valueWithPointer:&hilbert_xscreensaver_function_table], @"hilbert", - [NSValue valueWithPointer:&hopalong_xscreensaver_function_table], @"hopalong", - [NSValue valueWithPointer:&hydrostat_xscreensaver_function_table], @"hydrostat", - [NSValue valueWithPointer:&hypertorus_xscreensaver_function_table], @"hypertorus", - [NSValue valueWithPointer:&hypnowheel_xscreensaver_function_table], @"hypnowheel", - [NSValue valueWithPointer:&ifs_xscreensaver_function_table], @"ifs", - [NSValue valueWithPointer:&imsmap_xscreensaver_function_table], @"imsmap", - [NSValue valueWithPointer:&interaggregate_xscreensaver_function_table], @"interaggregate", - [NSValue valueWithPointer:&interference_xscreensaver_function_table], @"interference", - [NSValue valueWithPointer:&intermomentary_xscreensaver_function_table], @"intermomentary", - [NSValue valueWithPointer:&jigglypuff_xscreensaver_function_table], @"jigglypuff", - [NSValue valueWithPointer:&jigsaw_xscreensaver_function_table], @"jigsaw", - [NSValue valueWithPointer:&juggler3d_xscreensaver_function_table], @"juggler3d", - [NSValue valueWithPointer:&julia_xscreensaver_function_table], @"julia", - [NSValue valueWithPointer:&kaleidescope_xscreensaver_function_table], @"kaleidescope", - [NSValue valueWithPointer:&kaleidocycle_xscreensaver_function_table], @"kaleidocycle", - [NSValue valueWithPointer:&klein_xscreensaver_function_table], @"klein", - [NSValue valueWithPointer:&kumppa_xscreensaver_function_table], @"kumppa", - [NSValue valueWithPointer:&lament_xscreensaver_function_table], @"lament", - [NSValue valueWithPointer:&lavalite_xscreensaver_function_table], @"lavalite", - [NSValue valueWithPointer:&loop_xscreensaver_function_table], @"loop", - [NSValue valueWithPointer:&m6502_xscreensaver_function_table], @"m6502", - [NSValue valueWithPointer:&maze_xscreensaver_function_table], @"maze", - [NSValue valueWithPointer:&maze3d_xscreensaver_function_table], @"maze3d", - [NSValue valueWithPointer:&memscroller_xscreensaver_function_table], @"memscroller", - [NSValue valueWithPointer:&menger_xscreensaver_function_table], @"menger", - [NSValue valueWithPointer:&metaballs_xscreensaver_function_table], @"metaballs", - [NSValue valueWithPointer:&mirrorblob_xscreensaver_function_table], @"mirrorblob", - [NSValue valueWithPointer:&moebius_xscreensaver_function_table], @"moebius", - [NSValue valueWithPointer:&moebiusgears_xscreensaver_function_table], @"moebiusgears", - [NSValue valueWithPointer:&moire_xscreensaver_function_table], @"moire", - [NSValue valueWithPointer:&moire2_xscreensaver_function_table], @"moire2", - [NSValue valueWithPointer:&molecule_xscreensaver_function_table], @"molecule", - [NSValue valueWithPointer:&morph3d_xscreensaver_function_table], @"morph3d", - [NSValue valueWithPointer:&mountain_xscreensaver_function_table], @"mountain", - [NSValue valueWithPointer:&munch_xscreensaver_function_table], @"munch", - [NSValue valueWithPointer:&nerverot_xscreensaver_function_table], @"nerverot", - [NSValue valueWithPointer:&noof_xscreensaver_function_table], @"noof", - [NSValue valueWithPointer:&noseguy_xscreensaver_function_table], @"noseguy", - [NSValue valueWithPointer:&pacman_xscreensaver_function_table], @"pacman", - [NSValue valueWithPointer:&pedal_xscreensaver_function_table], @"pedal", - [NSValue valueWithPointer:&peepers_xscreensaver_function_table], @"peepers", - [NSValue valueWithPointer:&penetrate_xscreensaver_function_table], @"penetrate", - [NSValue valueWithPointer:&penrose_xscreensaver_function_table], @"penrose", - [NSValue valueWithPointer:&petri_xscreensaver_function_table], @"petri", - [NSValue valueWithPointer:&phosphor_xscreensaver_function_table], @"phosphor", - [NSValue valueWithPointer:&photopile_xscreensaver_function_table], @"photopile", - [NSValue valueWithPointer:&piecewise_xscreensaver_function_table], @"piecewise", - [NSValue valueWithPointer:&pinion_xscreensaver_function_table], @"pinion", - [NSValue valueWithPointer:&pipes_xscreensaver_function_table], @"pipes", - [NSValue valueWithPointer:&polyhedra_xscreensaver_function_table], @"polyhedra", - [NSValue valueWithPointer:&polyominoes_xscreensaver_function_table], @"polyominoes", - [NSValue valueWithPointer:&polytopes_xscreensaver_function_table], @"polytopes", - [NSValue valueWithPointer:&pong_xscreensaver_function_table], @"pong", - [NSValue valueWithPointer:&popsquares_xscreensaver_function_table], @"popsquares", - [NSValue valueWithPointer:&projectiveplane_xscreensaver_function_table], @"projectiveplane", - [NSValue valueWithPointer:&providence_xscreensaver_function_table], @"providence", - [NSValue valueWithPointer:&pulsar_xscreensaver_function_table], @"pulsar", - [NSValue valueWithPointer:&pyro_xscreensaver_function_table], @"pyro", - [NSValue valueWithPointer:&qix_xscreensaver_function_table], @"qix", - [NSValue valueWithPointer:&quasicrystal_xscreensaver_function_table], @"quasicrystal", - [NSValue valueWithPointer:&queens_xscreensaver_function_table], @"queens", - [NSValue valueWithPointer:&raverhoop_xscreensaver_function_table], @"raverhoop", - [NSValue valueWithPointer:&razzledazzle_xscreensaver_function_table], @"razzledazzle", - [NSValue valueWithPointer:&rdbomb_xscreensaver_function_table], @"rdbomb", - [NSValue valueWithPointer:&ripples_xscreensaver_function_table], @"ripples", - [NSValue valueWithPointer:&rocks_xscreensaver_function_table], @"rocks", - [NSValue valueWithPointer:&romanboy_xscreensaver_function_table], @"romanboy", - [NSValue valueWithPointer:&rorschach_xscreensaver_function_table], @"rorschach", - [NSValue valueWithPointer:&rotzoomer_xscreensaver_function_table], @"rotzoomer", - [NSValue valueWithPointer:&rubik_xscreensaver_function_table], @"rubik", - [NSValue valueWithPointer:&rubikblocks_xscreensaver_function_table], @"rubikblocks", - [NSValue valueWithPointer:&sballs_xscreensaver_function_table], @"sballs", - [NSValue valueWithPointer:&scooter_xscreensaver_function_table], @"scooter", - [NSValue valueWithPointer:&shadebobs_xscreensaver_function_table], @"shadebobs", - [NSValue valueWithPointer:&sierpinski_xscreensaver_function_table], @"sierpinski", - [NSValue valueWithPointer:&sierpinski3d_xscreensaver_function_table], @"sierpinski3d", - [NSValue valueWithPointer:&skytentacles_xscreensaver_function_table], @"skytentacles", - [NSValue valueWithPointer:&slidescreen_xscreensaver_function_table], @"slidescreen", - [NSValue valueWithPointer:&slip_xscreensaver_function_table], @"slip", - [NSValue valueWithPointer:&sonar_xscreensaver_function_table], @"sonar", - [NSValue valueWithPointer:&speedmine_xscreensaver_function_table], @"speedmine", - [NSValue valueWithPointer:&sphereeversion_xscreensaver_function_table], @"sphereeversion", - [NSValue valueWithPointer:&spheremonics_xscreensaver_function_table], @"spheremonics", - [NSValue valueWithPointer:&splitflap_xscreensaver_function_table], @"splitflap", - [NSValue valueWithPointer:&splodesic_xscreensaver_function_table], @"splodesic", - [NSValue valueWithPointer:&spotlight_xscreensaver_function_table], @"spotlight", - [NSValue valueWithPointer:&sproingies_xscreensaver_function_table], @"sproingies", - [NSValue valueWithPointer:&squiral_xscreensaver_function_table], @"squiral", - [NSValue valueWithPointer:&stairs_xscreensaver_function_table], @"stairs", - [NSValue valueWithPointer:&starfish_xscreensaver_function_table], @"starfish", - [NSValue valueWithPointer:&starwars_xscreensaver_function_table], @"starwars", - [NSValue valueWithPointer:&stonerview_xscreensaver_function_table], @"stonerview", - [NSValue valueWithPointer:&strange_xscreensaver_function_table], @"strange", - [NSValue valueWithPointer:&substrate_xscreensaver_function_table], @"substrate", - [NSValue valueWithPointer:&superquadrics_xscreensaver_function_table], @"superquadrics", - [NSValue valueWithPointer:&surfaces_xscreensaver_function_table], @"surfaces", - [NSValue valueWithPointer:&swirl_xscreensaver_function_table], @"swirl", - [NSValue valueWithPointer:&tangram_xscreensaver_function_table], @"tangram", - [NSValue valueWithPointer:&tessellimage_xscreensaver_function_table], @"tessellimage", - [NSValue valueWithPointer:þbird_xscreensaver_function_table], @"thornbird", - [NSValue valueWithPointer:&timetunnel_xscreensaver_function_table], @"timetunnel", - [NSValue valueWithPointer:&topblock_xscreensaver_function_table], @"topblock", - [NSValue valueWithPointer:&triangle_xscreensaver_function_table], @"triangle", - [NSValue valueWithPointer:&tronbit_xscreensaver_function_table], @"tronbit", - [NSValue valueWithPointer:&truchet_xscreensaver_function_table], @"truchet", - [NSValue valueWithPointer:&twang_xscreensaver_function_table], @"twang", - [NSValue valueWithPointer:&unicrud_xscreensaver_function_table], @"unicrud", - [NSValue valueWithPointer:&unknownpleasures_xscreensaver_function_table], @"unknownpleasures", - [NSValue valueWithPointer:&vermiculate_xscreensaver_function_table], @"vermiculate", - [NSValue valueWithPointer:&vfeedback_xscreensaver_function_table], @"vfeedback", - [NSValue valueWithPointer:&vigilance_xscreensaver_function_table], @"vigilance", - [NSValue valueWithPointer:&voronoi_xscreensaver_function_table], @"voronoi", - [NSValue valueWithPointer:&wander_xscreensaver_function_table], @"wander", - [NSValue valueWithPointer:&whirlwindwarp_xscreensaver_function_table], @"whirlwindwarp", - [NSValue valueWithPointer:&winduprobot_xscreensaver_function_table], @"winduprobot", - [NSValue valueWithPointer:&wormhole_xscreensaver_function_table], @"wormhole", - [NSValue valueWithPointer:&xanalogtv_xscreensaver_function_table], @"xanalogtv", - [NSValue valueWithPointer:&xflame_xscreensaver_function_table], @"xflame", - [NSValue valueWithPointer:&xjack_xscreensaver_function_table], @"xjack", - [NSValue valueWithPointer:&xlyap_xscreensaver_function_table], @"xlyap", - [NSValue valueWithPointer:&xmatrix_xscreensaver_function_table], @"xmatrix", - [NSValue valueWithPointer:&xrayswarm_xscreensaver_function_table], @"xrayswarm", - [NSValue valueWithPointer:&xspirograph_xscreensaver_function_table], @"xspirograph", - [NSValue valueWithPointer:&zoom_xscreensaver_function_table], @"zoom", + @"Abstractile": [NSValue valueWithPointer:&abstractile_xscreensaver_function_table], + @"Anemone": [NSValue valueWithPointer:&anemone_xscreensaver_function_table], + @"Anemotaxis": [NSValue valueWithPointer:&anemotaxis_xscreensaver_function_table], + @"Ant Inspect": [NSValue valueWithPointer:&antinspect_xscreensaver_function_table], + @"Ant Maze": [NSValue valueWithPointer:&antmaze_xscreensaver_function_table], + @"Ant Spotlight": [NSValue valueWithPointer:&antspotlight_xscreensaver_function_table], + @"Apollonian": [NSValue valueWithPointer:&apollonian_xscreensaver_function_table], + @"Apple ][": [NSValue valueWithPointer:&apple2_xscreensaver_function_table], + @"Atlantis": [NSValue valueWithPointer:&atlantis_xscreensaver_function_table], + @"Attraction": [NSValue valueWithPointer:&attraction_xscreensaver_function_table], + @"Atunnel": [NSValue valueWithPointer:&atunnel_xscreensaver_function_table], + @"Barcode": [NSValue valueWithPointer:&barcode_xscreensaver_function_table], + @"Beats": [NSValue valueWithPointer:&beats_xscreensaver_function_table], + @"Binary Ring": [NSValue valueWithPointer:&binaryring_xscreensaver_function_table], + @"Blaster": [NSValue valueWithPointer:&blaster_xscreensaver_function_table], + @"Blink Box": [NSValue valueWithPointer:&blinkbox_xscreensaver_function_table], + @"Blit Spin": [NSValue valueWithPointer:&blitspin_xscreensaver_function_table], + @"Block Tube": [NSValue valueWithPointer:&blocktube_xscreensaver_function_table], + @"Boing": [NSValue valueWithPointer:&boing_xscreensaver_function_table], + @"Bouboule": [NSValue valueWithPointer:&bouboule_xscreensaver_function_table], + @"Bouncing Cow": [NSValue valueWithPointer:&bouncingcow_xscreensaver_function_table], + @"Boxed": [NSValue valueWithPointer:&boxed_xscreensaver_function_table], + @"Box Fit": [NSValue valueWithPointer:&boxfit_xscreensaver_function_table], + @"Braid": [NSValue valueWithPointer:&braid_xscreensaver_function_table], + @"BSOD": [NSValue valueWithPointer:&bsod_xscreensaver_function_table], + @"Bubble 3D": [NSValue valueWithPointer:&bubble3d_xscreensaver_function_table], + @"Bumps": [NSValue valueWithPointer:&bumps_xscreensaver_function_table], + @"Cage": [NSValue valueWithPointer:&cage_xscreensaver_function_table], + @"Carousel": [NSValue valueWithPointer:&carousel_xscreensaver_function_table], + @"C Curve": [NSValue valueWithPointer:&ccurve_xscreensaver_function_table], + @"Celtic": [NSValue valueWithPointer:&celtic_xscreensaver_function_table], + @"Circuit": [NSValue valueWithPointer:&circuit_xscreensaver_function_table], + @"City Flow": [NSValue valueWithPointer:&cityflow_xscreensaver_function_table], + @"Cloud Life": [NSValue valueWithPointer:&cloudlife_xscreensaver_function_table], + @"Co____9": [NSValue valueWithPointer:&co____9_xscreensaver_function_table], + @"Companion Cube": [NSValue valueWithPointer:&companioncube_xscreensaver_function_table], + @"Compass": [NSValue valueWithPointer:&compass_xscreensaver_function_table], + @"Coral": [NSValue valueWithPointer:&coral_xscreensaver_function_table], + @"Crackberg": [NSValue valueWithPointer:&crackberg_xscreensaver_function_table], + @"Crumbler": [NSValue valueWithPointer:&crumbler_xscreensaver_function_table], + @"Crystal": [NSValue valueWithPointer:&crystal_xscreensaver_function_table], + @"Cube 21": [NSValue valueWithPointer:&cube21_xscreensaver_function_table], + @"Cubenetic": [NSValue valueWithPointer:&cubenetic_xscreensaver_function_table], + @"Cube Stack": [NSValue valueWithPointer:&cubestack_xscreensaver_function_table], + @"Cube Storm": [NSValue valueWithPointer:&cubestorm_xscreensaver_function_table], + @"Cube Twist": [NSValue valueWithPointer:&cubetwist_xscreensaver_function_table], + @"Cubic Grid": [NSValue valueWithPointer:&cubicgrid_xscreensaver_function_table], + @"C Waves": [NSValue valueWithPointer:&cwaves_xscreensaver_function_table], + @"Cynosure": [NSValue valueWithPointer:&cynosure_xscreensaver_function_table], + @"Danger Ball": [NSValue valueWithPointer:&dangerball_xscreensaver_function_table], + @"Decay Screen": [NSValue valueWithPointer:&decayscreen_xscreensaver_function_table], + @"Deco": [NSValue valueWithPointer:&deco_xscreensaver_function_table], + @"Deep Stars": [NSValue valueWithPointer:&deepstars_xscreensaver_function_table], + @"Deluxe": [NSValue valueWithPointer:&deluxe_xscreensaver_function_table], + @"Demon": [NSValue valueWithPointer:&demon_xscreensaver_function_table], + @"Discoball": [NSValue valueWithPointer:&discoball_xscreensaver_function_table], + @"Discrete": [NSValue valueWithPointer:&discrete_xscreensaver_function_table], + @"Distort": [NSValue valueWithPointer:&distort_xscreensaver_function_table], + @"DNA Logo": [NSValue valueWithPointer:&dnalogo_xscreensaver_function_table], + @"Drift": [NSValue valueWithPointer:&drift_xscreensaver_function_table], + @"Dymaxion Map": [NSValue valueWithPointer:&dymaxionmap_xscreensaver_function_table], + @"Endgame": [NSValue valueWithPointer:&endgame_xscreensaver_function_table], + @"Energy Stream": [NSValue valueWithPointer:&energystream_xscreensaver_function_table], + @"Engine": [NSValue valueWithPointer:&engine_xscreensaver_function_table], + @"Epicycle": [NSValue valueWithPointer:&epicycle_xscreensaver_function_table], + @"Eruption": [NSValue valueWithPointer:&eruption_xscreensaver_function_table], + @"Esper": [NSValue valueWithPointer:&esper_xscreensaver_function_table], + @"Etruscan Venus": [NSValue valueWithPointer:&etruscanvenus_xscreensaver_function_table], + @"Euler 2D": [NSValue valueWithPointer:&euler2d_xscreensaver_function_table], + @"Fade Plot": [NSValue valueWithPointer:&fadeplot_xscreensaver_function_table], + @"Fiber Lamp": [NSValue valueWithPointer:&fiberlamp_xscreensaver_function_table], + @"Film Leader": [NSValue valueWithPointer:&filmleader_xscreensaver_function_table], + @"Fireworkx": [NSValue valueWithPointer:&fireworkx_xscreensaver_function_table], + @"Flame": [NSValue valueWithPointer:&flame_xscreensaver_function_table], + @"Flip Flop": [NSValue valueWithPointer:&flipflop_xscreensaver_function_table], + @"Flip Screen 3D": [NSValue valueWithPointer:&flipscreen3d_xscreensaver_function_table], + @"Flip Text": [NSValue valueWithPointer:&fliptext_xscreensaver_function_table], + @"Flow": [NSValue valueWithPointer:&flow_xscreensaver_function_table], + @"Fluid Balls": [NSValue valueWithPointer:&fluidballs_xscreensaver_function_table], + @"Flying Toasters": [NSValue valueWithPointer:&flyingtoasters_xscreensaver_function_table], + @"Font Glide": [NSValue valueWithPointer:&fontglide_xscreensaver_function_table], + @"Fuzzy Flakes": [NSValue valueWithPointer:&fuzzyflakes_xscreensaver_function_table], + @"Galaxy": [NSValue valueWithPointer:&galaxy_xscreensaver_function_table], + @"Gears": [NSValue valueWithPointer:&gears_xscreensaver_function_table], + @"Geodesic": [NSValue valueWithPointer:&geodesic_xscreensaver_function_table], + @"Geodesic Gears": [NSValue valueWithPointer:&geodesicgears_xscreensaver_function_table], + @"GFlux": [NSValue valueWithPointer:&gflux_xscreensaver_function_table], + @"Gibson": [NSValue valueWithPointer:&gibson_xscreensaver_function_table], + @"GL Blur": [NSValue valueWithPointer:&glblur_xscreensaver_function_table], + @"GL Cells": [NSValue valueWithPointer:&glcells_xscreensaver_function_table], + @"Gleidescope": [NSValue valueWithPointer:&gleidescope_xscreensaver_function_table], + @"GL Hanoi": [NSValue valueWithPointer:&glhanoi_xscreensaver_function_table], + @"GL Knots": [NSValue valueWithPointer:&glknots_xscreensaver_function_table], + @"GL Matrix": [NSValue valueWithPointer:&glmatrix_xscreensaver_function_table], + @"GL Planet": [NSValue valueWithPointer:&glplanet_xscreensaver_function_table], + @"GL School": [NSValue valueWithPointer:&glschool_xscreensaver_function_table], + @"GL Slideshow": [NSValue valueWithPointer:&glslideshow_xscreensaver_function_table], + @"GL Snake": [NSValue valueWithPointer:&glsnake_xscreensaver_function_table], + @"GL Text": [NSValue valueWithPointer:&gltext_xscreensaver_function_table], + @"Goop": [NSValue valueWithPointer:&goop_xscreensaver_function_table], + @"Grav": [NSValue valueWithPointer:&grav_xscreensaver_function_table], + @"Gravity Well": [NSValue valueWithPointer:&gravitywell_xscreensaver_function_table], + @"Greynetic": [NSValue valueWithPointer:&greynetic_xscreensaver_function_table], + @"Halftone": [NSValue valueWithPointer:&halftone_xscreensaver_function_table], + @"Halo": [NSValue valueWithPointer:&halo_xscreensaver_function_table], + @"Handsy": [NSValue valueWithPointer:&handsy_xscreensaver_function_table], + @"Headroom": [NSValue valueWithPointer:&headroom_xscreensaver_function_table], + @"Helix": [NSValue valueWithPointer:&helix_xscreensaver_function_table], + @"Hexadrop": [NSValue valueWithPointer:&hexadrop_xscreensaver_function_table], + @"Hex Strut": [NSValue valueWithPointer:&hexstrut_xscreensaver_function_table], + @"Hilbert": [NSValue valueWithPointer:&hilbert_xscreensaver_function_table], + @"Hopalong": [NSValue valueWithPointer:&hopalong_xscreensaver_function_table], + @"Hydrostat": [NSValue valueWithPointer:&hydrostat_xscreensaver_function_table], + @"Hypertorus": [NSValue valueWithPointer:&hypertorus_xscreensaver_function_table], + @"Hypnowheel": [NSValue valueWithPointer:&hypnowheel_xscreensaver_function_table], + @"IFS": [NSValue valueWithPointer:&ifs_xscreensaver_function_table], + @"IMS Map": [NSValue valueWithPointer:&imsmap_xscreensaver_function_table], + @"Interaggregate": [NSValue valueWithPointer:&interaggregate_xscreensaver_function_table], + @"Interference": [NSValue valueWithPointer:&interference_xscreensaver_function_table], + @"Intermomentary": [NSValue valueWithPointer:&intermomentary_xscreensaver_function_table], + @"Jiggly Puff": [NSValue valueWithPointer:&jigglypuff_xscreensaver_function_table], + @"Jigsaw": [NSValue valueWithPointer:&jigsaw_xscreensaver_function_table], + @"Juggler 3D": [NSValue valueWithPointer:&juggler3d_xscreensaver_function_table], + @"Julia": [NSValue valueWithPointer:&julia_xscreensaver_function_table], + @"Kaleidescope": [NSValue valueWithPointer:&kaleidescope_xscreensaver_function_table], + @"Kaleidocycle": [NSValue valueWithPointer:&kaleidocycle_xscreensaver_function_table], + @"Klein": [NSValue valueWithPointer:&klein_xscreensaver_function_table], + @"Kumppa": [NSValue valueWithPointer:&kumppa_xscreensaver_function_table], + @"Lament": [NSValue valueWithPointer:&lament_xscreensaver_function_table], + @"Lavalite": [NSValue valueWithPointer:&lavalite_xscreensaver_function_table], + @"Loop": [NSValue valueWithPointer:&loop_xscreensaver_function_table], + @"m6502": [NSValue valueWithPointer:&m6502_xscreensaver_function_table], + @"Maze": [NSValue valueWithPointer:&maze_xscreensaver_function_table], + @"Maze 3D": [NSValue valueWithPointer:&maze3d_xscreensaver_function_table], + @"Mem Scroller": [NSValue valueWithPointer:&memscroller_xscreensaver_function_table], + @"Menger": [NSValue valueWithPointer:&menger_xscreensaver_function_table], + @"Meta Balls": [NSValue valueWithPointer:&metaballs_xscreensaver_function_table], + @"Mirror Blob": [NSValue valueWithPointer:&mirrorblob_xscreensaver_function_table], + @"Möbius": [NSValue valueWithPointer:&moebius_xscreensaver_function_table], + @"Möbius Gears": [NSValue valueWithPointer:&moebiusgears_xscreensaver_function_table], + @"Moiré": [NSValue valueWithPointer:&moire_xscreensaver_function_table], + @"Moiré 2": [NSValue valueWithPointer:&moire2_xscreensaver_function_table], + @"Molecule": [NSValue valueWithPointer:&molecule_xscreensaver_function_table], + @"Morph 3D": [NSValue valueWithPointer:&morph3d_xscreensaver_function_table], + @"Mountain": [NSValue valueWithPointer:&mountain_xscreensaver_function_table], + @"Munch": [NSValue valueWithPointer:&munch_xscreensaver_function_table], + @"Nerve Rot": [NSValue valueWithPointer:&nerverot_xscreensaver_function_table], + @"Noof": [NSValue valueWithPointer:&noof_xscreensaver_function_table], + @"Nose Guy": [NSValue valueWithPointer:&noseguy_xscreensaver_function_table], + @"Pac-Man": [NSValue valueWithPointer:&pacman_xscreensaver_function_table], + @"Pedal": [NSValue valueWithPointer:&pedal_xscreensaver_function_table], + @"Peepers": [NSValue valueWithPointer:&peepers_xscreensaver_function_table], + @"Penetrate": [NSValue valueWithPointer:&penetrate_xscreensaver_function_table], + @"Penrose": [NSValue valueWithPointer:&penrose_xscreensaver_function_table], + @"Petri": [NSValue valueWithPointer:&petri_xscreensaver_function_table], + @"Phosphor": [NSValue valueWithPointer:&phosphor_xscreensaver_function_table], + @"Photo Pile": [NSValue valueWithPointer:&photopile_xscreensaver_function_table], + @"Piecewise": [NSValue valueWithPointer:&piecewise_xscreensaver_function_table], + @"Pinion": [NSValue valueWithPointer:&pinion_xscreensaver_function_table], + @"Pipes": [NSValue valueWithPointer:&pipes_xscreensaver_function_table], + @"Polyhedra": [NSValue valueWithPointer:&polyhedra_xscreensaver_function_table], + @"Polyominoes": [NSValue valueWithPointer:&polyominoes_xscreensaver_function_table], + @"Polytopes": [NSValue valueWithPointer:&polytopes_xscreensaver_function_table], + @"Pong": [NSValue valueWithPointer:&pong_xscreensaver_function_table], + @"Pop Squares": [NSValue valueWithPointer:&popsquares_xscreensaver_function_table], + @"Projective Plane": [NSValue valueWithPointer:&projectiveplane_xscreensaver_function_table], + @"Providence": [NSValue valueWithPointer:&providence_xscreensaver_function_table], + @"Pulsar": [NSValue valueWithPointer:&pulsar_xscreensaver_function_table], + @"Pyro": [NSValue valueWithPointer:&pyro_xscreensaver_function_table], + @"Qix": [NSValue valueWithPointer:&qix_xscreensaver_function_table], + @"Quasi-Crystal": [NSValue valueWithPointer:&quasicrystal_xscreensaver_function_table], + @"Queens": [NSValue valueWithPointer:&queens_xscreensaver_function_table], + @"Raver Hoop": [NSValue valueWithPointer:&raverhoop_xscreensaver_function_table], + @"Razzle Dazzle": [NSValue valueWithPointer:&razzledazzle_xscreensaver_function_table], + @"RD-Bomb": [NSValue valueWithPointer:&rdbomb_xscreensaver_function_table], + @"Ripples": [NSValue valueWithPointer:&ripples_xscreensaver_function_table], + @"Rocks": [NSValue valueWithPointer:&rocks_xscreensaver_function_table], + @"Roman Boy": [NSValue valueWithPointer:&romanboy_xscreensaver_function_table], + @"Rorschach": [NSValue valueWithPointer:&rorschach_xscreensaver_function_table], + @"Rot Zoomer": [NSValue valueWithPointer:&rotzoomer_xscreensaver_function_table], + @"Rubik": [NSValue valueWithPointer:&rubik_xscreensaver_function_table], + @"Rubik Blocks": [NSValue valueWithPointer:&rubikblocks_xscreensaver_function_table], + @"SBalls": [NSValue valueWithPointer:&sballs_xscreensaver_function_table], + @"Scooter": [NSValue valueWithPointer:&scooter_xscreensaver_function_table], + @"Shade Bobs": [NSValue valueWithPointer:&shadebobs_xscreensaver_function_table], + @"Sierpinski": [NSValue valueWithPointer:&sierpinski_xscreensaver_function_table], + @"Sierpinski 3D": [NSValue valueWithPointer:&sierpinski3d_xscreensaver_function_table], + @"Sky Tentacles": [NSValue valueWithPointer:&skytentacles_xscreensaver_function_table], + @"Slide Screen": [NSValue valueWithPointer:&slidescreen_xscreensaver_function_table], + @"Slip": [NSValue valueWithPointer:&slip_xscreensaver_function_table], + @"Sonar": [NSValue valueWithPointer:&sonar_xscreensaver_function_table], + @"Speed Mine": [NSValue valueWithPointer:&speedmine_xscreensaver_function_table], + @"Sphere Eversion": [NSValue valueWithPointer:&sphereeversion_xscreensaver_function_table], + @"Spheremonics": [NSValue valueWithPointer:&spheremonics_xscreensaver_function_table], + @"Split-Flap": [NSValue valueWithPointer:&splitflap_xscreensaver_function_table], + @"Splodesic": [NSValue valueWithPointer:&splodesic_xscreensaver_function_table], + @"Spotlight": [NSValue valueWithPointer:&spotlight_xscreensaver_function_table], + @"Sproingies": [NSValue valueWithPointer:&sproingies_xscreensaver_function_table], + @"Squiral": [NSValue valueWithPointer:&squiral_xscreensaver_function_table], + @"Stairs": [NSValue valueWithPointer:&stairs_xscreensaver_function_table], + @"Starfish": [NSValue valueWithPointer:&starfish_xscreensaver_function_table], + @"Star Wars": [NSValue valueWithPointer:&starwars_xscreensaver_function_table], + @"Stoner View": [NSValue valueWithPointer:&stonerview_xscreensaver_function_table], + @"Strange": [NSValue valueWithPointer:&strange_xscreensaver_function_table], + @"Substrate": [NSValue valueWithPointer:&substrate_xscreensaver_function_table], + @"Superquadrics": [NSValue valueWithPointer:&superquadrics_xscreensaver_function_table], + @"Surfaces": [NSValue valueWithPointer:&surfaces_xscreensaver_function_table], + @"Swirl": [NSValue valueWithPointer:&swirl_xscreensaver_function_table], + @"Tangram": [NSValue valueWithPointer:&tangram_xscreensaver_function_table], + @"Tessellimage": [NSValue valueWithPointer:&tessellimage_xscreensaver_function_table], + @"Thornbird": [NSValue valueWithPointer:þbird_xscreensaver_function_table], + @"Time Tunnel": [NSValue valueWithPointer:&timetunnel_xscreensaver_function_table], + @"Top Block": [NSValue valueWithPointer:&topblock_xscreensaver_function_table], + @"Triangle": [NSValue valueWithPointer:&triangle_xscreensaver_function_table], + @"Tron Bit": [NSValue valueWithPointer:&tronbit_xscreensaver_function_table], + @"Truchet": [NSValue valueWithPointer:&truchet_xscreensaver_function_table], + @"Twang": [NSValue valueWithPointer:&twang_xscreensaver_function_table], + @"Unicrud": [NSValue valueWithPointer:&unicrud_xscreensaver_function_table], + @"Unknown Pleasures": [NSValue valueWithPointer:&unknownpleasures_xscreensaver_function_table], + @"Vermiculate": [NSValue valueWithPointer:&vermiculate_xscreensaver_function_table], + @"VFeedback": [NSValue valueWithPointer:&vfeedback_xscreensaver_function_table], + @"Vigilance": [NSValue valueWithPointer:&vigilance_xscreensaver_function_table], + @"Voronoi": [NSValue valueWithPointer:&voronoi_xscreensaver_function_table], + @"Wander": [NSValue valueWithPointer:&wander_xscreensaver_function_table], + @"Whirlwind Warp": [NSValue valueWithPointer:&whirlwindwarp_xscreensaver_function_table], + @"Windup Robot": [NSValue valueWithPointer:&winduprobot_xscreensaver_function_table], + @"Wormhole": [NSValue valueWithPointer:&wormhole_xscreensaver_function_table], + @"XAnalogTV": [NSValue valueWithPointer:&xanalogtv_xscreensaver_function_table], + @"XFlame": [NSValue valueWithPointer:&xflame_xscreensaver_function_table], + @"XJack": [NSValue valueWithPointer:&xjack_xscreensaver_function_table], + @"XLyap": [NSValue valueWithPointer:&xlyap_xscreensaver_function_table], + @"XMatrix": [NSValue valueWithPointer:&xmatrix_xscreensaver_function_table], + @"XRaySwarm": [NSValue valueWithPointer:&xrayswarm_xscreensaver_function_table], + @"XSpirograph": [NSValue valueWithPointer:&xspirograph_xscreensaver_function_table], + @"Zoom": [NSValue valueWithPointer:&zoom_xscreensaver_function_table], #endif - nil]; + }; } diff --git a/OSX/textclient-ios.m b/OSX/textclient-ios.m index 283d1cf0..09d620a8 100644 --- a/OSX/textclient-ios.m +++ b/OSX/textclient-ios.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2012-2019 Jamie Zawinski +/* xscreensaver, Copyright (c) 2012-2020 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -89,13 +89,20 @@ textclient_mobile_date_string (void) encoding: NSUTF8StringEncoding error: &e]; if (!self.result || [self.result length] == 0) { - // Aug 2019: loading URLs in the simulator no longer works, hooray! NSLog(@"URL error: %@: %@", self.url, e); - self.result = [[[[self.url host] + NSString *s = [[[[self.url host] stringByAppendingString:@": "] stringByAppendingString: (e ? [e localizedDescription] : @"null response")] stringByAppendingString:@"\n\n"]; + +# if TARGET_IPHONE_SIMULATOR + // Aug 2019: loading URLs in the simulator no longer works, hooray! + // Print that, because I keep forgetting. + s = [@"Simulator can't load URLs:\n\n" stringByAppendingString:s]; +# endif + + self.result = s; } # ifndef __OPTIMIZE__ NSLog(@"textclient thread finished %@ (length %d)", self.url, diff --git a/OSX/update-info-plist.pl b/OSX/update-info-plist.pl index 3e0fb8f5..f29b8a7e 100755 --- a/OSX/update-info-plist.pl +++ b/OSX/update-info-plist.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# Copyright © 2006-2017 Jamie Zawinski +# Copyright © 2006-2020 Jamie Zawinski # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that @@ -27,7 +27,7 @@ use IO::Compress::Gzip qw(gzip $GzipError); my ($exec_dir, $progname) = ($0 =~ m@^(.*?)/([^/]+)$@); -my ($version) = ('$Revision: 1.47 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.54 $' =~ m/\s(\d[.\d]+)\s/s); $ENV{PATH} = "/usr/local/bin:$ENV{PATH}"; # for seticon $ENV{PATH} = "/opt/local/bin:$ENV{PATH}"; # for macports wget @@ -98,6 +98,7 @@ sub read_saver_xml($) { return () if ($name eq 'XScreenSaver'); return () if ($name eq 'SaverTester'); return () if ($name eq 'XScreenSaverUpdater'); + return () if ($name eq 'RandomXScreenSaver'); my $file = "$app_dir/Contents/Resources/" . lc($name) . ".xml"; my $file2 = "$app_dir/" . lc($name) . ".xml"; @@ -253,7 +254,7 @@ sub update_saver_xml($$) { print STDERR "$progname: wrote $filename\n" if ($verbose); } - return ($desc1, $desc2); + return ($desc1, $desc2, $name); } @@ -330,28 +331,38 @@ sub set_icon($) { sub set_thumb($) { my ($app_dir) = @_; + error ("$app_dir: no name") + unless ($app_dir =~ m@/([^/.]+).(app|saver)/?$@x); + my $name = $1; + my $oname = $name; + return unless ($app_dir =~ m@\.saver/?$@s); - my $name = $app_dir; + $name = $app_dir; $name =~ s@^.*/@@s; $name =~ s@\..*?$@@s; $name = lc($name); $name = 'rd-bomb' if ($name eq 'rdbomb'); # sigh - if (! -f "$thumbdir/$name.png") { - system ("make", "$thumbdir/$name.png"); + my $src = "$thumbdir/$name.png"; + + if (! -f $src) { + print STDERR "$progname: exec: make \"$src\"\n" if ($verbose); + system ("make", $src); my $exit = $? >> 8; exit ($exit) if $exit; error ("unable to download $name.png") - unless (-f "$thumbdir/$name.png"); + unless (-f $src); } $app_dir =~ s@/+$@@s; $app_dir .= "/Contents/Resources"; - error ("$app_dir does not exist") unless (-d $app_dir); + if (! -d $app_dir) { + mkdir ($app_dir) || error ("mkdir: $app_dir: $!"); + } - system ("cp", "-p", "$thumbdir/$name.png", "$app_dir/thumbnail.png"); + system ("cp", "-p", $src, "$app_dir/thumbnail.png"); my $exit = $? >> 8; exit ($exit) if $exit; } @@ -418,37 +429,46 @@ sub update($) { unless ($plist =~ m@CFBundleShortVersionString\s* ([^<>]+)@sx); my $vers = $1; - my ($ignore, $info_str) = update_saver_xml ($app_dir, $vers); + my ($ignore, $info_str, $name) = update_saver_xml ($app_dir, $vers); # No, don't do this -- the iOS version reads the XML file in a few # different places, and most of those places don't understand gzip. if ($app_name eq 'XScreenSaver') { compress_all_xml_files ($app_dir); - } elsif (! defined($info_str)) { - print STDERR "$progname: $filename: no XML file\n" if ($verbose > 1); } else { - $info_str =~ m@^([^\n]+)\n@s || - error ("$filename: unparsable copyright"); - my $copyright = "$1"; - $copyright =~ s/\b\d{4}-(\d{4})\b/$1/; - - # Lose the Wikipedia URLs. - $info_str =~ s@https?:.*?\b(wikipedia|mathworld)\b[^\s]+[ \t]*\n?@@gm; - - $info_str =~ s/(\n\n)\n+/$1/gs; - $info_str =~ s/(^\s+|\s+$)//gs; - $plist = set_plist_key ($filename, $plist, - "NSHumanReadableCopyright", $copyright); - $plist = set_plist_key ($filename, $plist, - "CFBundleLongVersionString",$copyright); - $plist = set_plist_key ($filename, $plist, - "CFBundleGetInfoString", $info_str); $plist = set_plist_key ($filename, $plist, "CFBundleIdentifier", "org.jwz.xscreensaver." . $app_name); + error ("$filename: no bundle identifier") + unless ($plist =~ m@>CFBundleIdentifier\s*[^<>]*@s); + + if (!defined($info_str)) { + print STDERR "$progname: $filename: no XML file\n" if ($verbose > 1); + } else { + $info_str =~ m@^([^\n]+)\n@s || + error ("$filename: unparsable copyright"); + my $copyright = "$1"; + $copyright =~ s/\b\d{4}-(\d{4})\b/$1/; + + # Lose the Wikipedia URLs. + $info_str =~ s@https?:.*?\b(wikipedia|mathworld)\b[^\s]+[ \t]*\n?@@gm; + + $info_str =~ s/(\n\n)\n+/$1/gs; + $info_str =~ s/(^\s+|\s+$)//gs; + $plist = set_plist_key ($filename, $plist, + "NSHumanReadableCopyright", $copyright); + $plist = set_plist_key ($filename, $plist, + "CFBundleLongVersionString",$copyright); + $plist = set_plist_key ($filename, $plist, + "CFBundleGetInfoString", $info_str); + + $plist = set_plist_key ($filename, $plist, "CFBundleName", $name) + unless ($app_name eq $name); # Some names contain spaces. + } + if ($oplist eq $plist) { print STDERR "$progname: $filename: unchanged\n" if ($verbose > 1); } else { diff --git a/OSX/updates.xml b/OSX/updates.xml index c0d11739..a51bf274 100644 --- a/OSX/updates.xml +++ b/OSX/updates.xml @@ -7,6 +7,18 @@ https://www.jwz.org/xscreensaver/updates.xml Updates to xscreensaver. en + + Version 6.00 + https://www.jwz.org/xscreensaver/xscreensaver-6.00.dmg + • Updates to `cubicgrid'.
• Added a `Random XScreenSaver' screen saver, which implements cycle mode, among other things. ]]>
+ Thu, 01 Apr 2021 02:18:28 -0700 + +
Version 5.45 https://www.jwz.org/xscreensaver/xscreensaver-5.45.dmg @@ -43,18 +55,6 @@ length="36839532" type="application/octet-stream" /> - - Version 5.43 - https://www.jwz.org/xscreensaver/xscreensaver-5.43.dmg - • GLPlanet now supports the Mercator projection.
• Bouncing Cow has mathematically ideal cows (spherical, frictionless).
• Foggy toasters.
• Unknown Pleasures can now use an image file as a clip mask.
• Updated `webcollage' for recent changes.
• Fixed BSOD fonts on UWQHD+ displays. ]]>
- Mon, 01 Jul 2019 15:58:08 -0700 - -
Version 5.34 https://www.jwz.org/xscreensaver/xscreensaver-5.34.dmg diff --git a/OSX/xscreensaver.xcodeproj/project.pbxproj b/OSX/xscreensaver.xcodeproj/project.pbxproj index 4fa133bd..e6030013 100644 --- a/OSX/xscreensaver.xcodeproj/project.pbxproj +++ b/OSX/xscreensaver.xcodeproj/project.pbxproj @@ -320,6 +320,7 @@ dependencies = ( AFCAD5F90992DFE00009617A /* PBXTargetDependency */, AF36340118540D050086A439 /* PBXTargetDependency */, + AF81E01A25845D3500CFC475 /* PBXTargetDependency */, AF480D60098EED6900FB32B8 /* PBXTargetDependency */, AF480D5E098EED6900FB32B8 /* PBXTargetDependency */, AF480D5C098EED6900FB32B8 /* PBXTargetDependency */, @@ -361,6 +362,10 @@ AF083A4A099311FF00277BE9 /* atunnel.c in Sources */ = {isa = PBXBuildFile; fileRef = AF083A31099311CE00277BE9 /* atunnel.c */; }; AF083A4B0993120900277BE9 /* atunnel.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258720988A468000655EE /* atunnel.xml */; }; AF083A59099312B000277BE9 /* tunnel_draw.c in Sources */ = {isa = PBXBuildFile; fileRef = AF083A58099312B000277BE9 /* tunnel_draw.c */; }; + AF0CA52125D3B92E00DEDA90 /* SpecialElite.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AF0CA52025D3B92E00DEDA90 /* SpecialElite.ttf */; }; + AF0CA52225D3B92E00DEDA90 /* SpecialElite.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AF0CA52025D3B92E00DEDA90 /* SpecialElite.ttf */; }; + AF0CA52425D3C2F000DEDA90 /* clacon.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AF0CA52325D3C2F000DEDA90 /* clacon.ttf */; }; + AF0CA52525D3C2F000DEDA90 /* clacon.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AF0CA52325D3C2F000DEDA90 /* clacon.ttf */; }; AF0D117D0E41566300BB14A4 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; }; AF0DC7B10C4C73F600D76972 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AF0DC7B20C4C73F600D76972 /* analogtv.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4CFA09B5AC94006E59CF /* analogtv.c */; }; @@ -1317,6 +1322,8 @@ AF21078C1FD23D5000B61EA9 /* esper.c in Sources */ = {isa = PBXBuildFile; fileRef = AF21078B1FD23D5000B61EA9 /* esper.c */; }; AF21078D1FD23D5000B61EA9 /* esper.c in Sources */ = {isa = PBXBuildFile; fileRef = AF21078B1FD23D5000B61EA9 /* esper.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF2107901FD23FEC00B61EA9 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; }; + AF21B16C2594EE6F00671377 /* glsl-utils.c in Sources */ = {isa = PBXBuildFile; fileRef = AF88B0382593A2EE006F9EB1 /* glsl-utils.c */; }; + AF21B16D2594EEC300671377 /* glsl-utils.c in Sources */ = {isa = PBXBuildFile; fileRef = AF88B0382593A2EE006F9EB1 /* glsl-utils.c */; }; AF241F83107C38DF00046A84 /* dropshadow.c in Sources */ = {isa = PBXBuildFile; fileRef = AF241F81107C38DF00046A84 /* dropshadow.c */; }; AF2C2A8A22754C31002112B9 /* deepstars.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF449F722754B2300DB8EDB /* deepstars.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF2C31E615C0F7FE007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; @@ -1628,7 +1635,6 @@ AF41E95F201D49DB0098E253 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; AF41E960201D49DB0098E253 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; }; AF41E961201D49DB0098E253 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; }; - AF41E96A201D4B6B0098E253 /* razzledazzle.c in Sources */ = {isa = PBXBuildFile; fileRef = AF41E969201D4B6B0098E253 /* razzledazzle.c */; }; AF41E96B201D4B6B0098E253 /* razzledazzle.c in Sources */ = {isa = PBXBuildFile; fileRef = AF41E969201D4B6B0098E253 /* razzledazzle.c */; }; AF41E96C201D4B6B0098E253 /* razzledazzle.c in Sources */ = {isa = PBXBuildFile; fileRef = AF41E969201D4B6B0098E253 /* razzledazzle.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF41E96E201D4B940098E253 /* razzledazzle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF41E96D201D4B940098E253 /* razzledazzle.xml */; }; @@ -1807,23 +1813,19 @@ AF4808C5098C3BDC00FB32B8 /* colors.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC25B990988BC08000655EE /* colors.c */; }; AF4808C6098C3BDF00FB32B8 /* erase.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD530981E3CB00F7970E /* erase.c */; }; AF4808C7098C3BE600FB32B8 /* hsv.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD550981E3CB00F7970E /* hsv.c */; }; - AF4808C8098C3BE800FB32B8 /* InvertedSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD420981E32E00F7970E /* InvertedSlider.m */; }; AF4808C9098C3BEC00FB32B8 /* jwxyz.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD440981E32E00F7970E /* jwxyz.m */; }; - AF4808CA098C3BEE00FB32B8 /* PrefsReader.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD480981E32E00F7970E /* PrefsReader.m */; }; AF4808CC098C3BF200FB32B8 /* spline.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD570981E3CB00F7970E /* spline.c */; }; AF4808CD098C3BF400FB32B8 /* usleep.c in Sources */ = {isa = PBXBuildFile; fileRef = AFB5A0ED0981FF8B00871B16 /* usleep.c */; }; - AF4808CE098C3BF800FB32B8 /* XScreenSaverConfigSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC2578009888F5A000655EE /* XScreenSaverConfigSheet.m */; }; - AF4808CF098C3BFB00FB32B8 /* XScreenSaverView.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC254C509882C97000655EE /* XScreenSaverView.m */; }; AF4808D0098C3BFD00FB32B8 /* yarandom.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD5B0981E3CB00F7970E /* yarandom.c */; }; AF480C5C098E305900FB32B8 /* helix.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480C2F098E2A6700FB32B8 /* helix.c */; }; AF480C69098E309E00FB32B8 /* helix.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C40988A468000655EE /* helix.xml */; }; AF480D85098EEE3100FB32B8 /* drift.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258990988A468000655EE /* drift.xml */; }; AF480D88098EEE5B00FB32B8 /* drift.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480C82098E336D00FB32B8 /* drift.c */; }; - AF480FCC09901DF900FB32B8 /* gltrackball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480EB0098F63D600FB32B8 /* gltrackball.c */; }; - AF480FCD09901E0000FB32B8 /* rotator.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480EB7098F646400FB32B8 /* rotator.c */; }; - AF480FCE09901E0400FB32B8 /* sphere.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480EBB098F649600FB32B8 /* sphere.c */; }; + AF480FCC09901DF900FB32B8 /* gltrackball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480EB0098F63D600FB32B8 /* gltrackball.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AF480FCD09901E0000FB32B8 /* rotator.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480EB7098F646400FB32B8 /* rotator.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AF480FCE09901E0400FB32B8 /* sphere.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480EBB098F649600FB32B8 /* sphere.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF480FCF09901E0700FB32B8 /* trackball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480EAD098F63BE00FB32B8 /* trackball.c */; }; - AF480FD009901E0A00FB32B8 /* tube.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480ED2098F652A00FB32B8 /* tube.c */; }; + AF480FD009901E0A00FB32B8 /* tube.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480ED2098F652A00FB32B8 /* tube.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF4811030990A02700FB32B8 /* dangerball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480DD1098F4F6200FB32B8 /* dangerball.c */; }; AF4811440990A35B00FB32B8 /* dangerball.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258920988A468000655EE /* dangerball.xml */; }; AF4812580990CE2700FB32B8 /* gears.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4812250990CB8C00FB32B8 /* gears.c */; }; @@ -1832,7 +1834,6 @@ AF4812C90990D41E00FB32B8 /* buildlwo.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4812760990CF5D00FB32B8 /* buildlwo.c */; }; AF4812CA0990D42000FB32B8 /* pipeobjs.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4812780990CF5D00FB32B8 /* pipeobjs.c */; }; AF4812CB0990D42100FB32B8 /* pipes.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4812790990CF5D00FB32B8 /* pipes.c */; }; - AF4812FA0990D9AE00FB32B8 /* XScreenSaverGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = AF4812F80990D9AE00FB32B8 /* XScreenSaverGLView.m */; }; AF48DEF60A0C25E000F94CF9 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AF48E1680A0C268500F94CF9 /* glschool_alg.c in Sources */ = {isa = PBXBuildFile; fileRef = AF48E1620A0C268400F94CF9 /* glschool_alg.c */; }; AF48E1690A0C268500F94CF9 /* glschool_gl.c in Sources */ = {isa = PBXBuildFile; fileRef = AF48E1640A0C268500F94CF9 /* glschool_gl.c */; }; @@ -1854,6 +1855,8 @@ AF51FD3915845FCB00E5741F /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; }; AF561DF615969BC3007CA5ED /* grabclient-ios.m in Sources */ = {isa = PBXBuildFile; fileRef = AF561DF515969BC3007CA5ED /* grabclient-ios.m */; }; AF561DF815969C5B007CA5ED /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF561DF715969C5B007CA5ED /* AssetsLibrary.framework */; }; + AF5967C725DA32CC0084ED6C /* xscreensaver-text in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */; }; + AF59BFAF25A611CD007DA2C2 /* glsl-utils.c in Sources */ = {isa = PBXBuildFile; fileRef = AF88B0382593A2EE006F9EB1 /* glsl-utils.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF5BEEFD1D2AFE21002E6D51 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; }; AF5C9AFD1A0CCE6E00B0147A /* dangerball.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258920988A468000655EE /* dangerball.xml */; }; AF5C9B001A0CCE6E00B0147A /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; @@ -1880,7 +1883,7 @@ AF5ECEC42116B2CC00069433 /* vfeedback.c in Sources */ = {isa = PBXBuildFile; fileRef = AF5ECEC22116B2CC00069433 /* vfeedback.c */; }; AF5ECEC62116B2FE00069433 /* vfeedback.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF5ECEC52116B2FE00069433 /* vfeedback.xml */; }; AF5ECEC72116B2FE00069433 /* vfeedback.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF5ECEC52116B2FE00069433 /* vfeedback.xml */; }; - AF6048FB157C07C600CA21E4 /* jwzgles.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6048F8157C07C600CA21E4 /* jwzgles.c */; }; + AF6048FB157C07C600CA21E4 /* jwzgles.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6048F8157C07C600CA21E4 /* jwzgles.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF6048FC157C07C600CA21E4 /* jwzgles.h in Headers */ = {isa = PBXBuildFile; fileRef = AF6048F9157C07C600CA21E4 /* jwzgles.h */; }; AF6048FD157C07C600CA21E4 /* jwzglesI.h in Headers */ = {isa = PBXBuildFile; fileRef = AF6048FA157C07C600CA21E4 /* jwzglesI.h */; }; AF62D61F2180070600C57C42 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; @@ -1909,9 +1912,8 @@ AF633C1B1EE0BC5A00AB33BD /* vigilance.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF633C181EE0BC4900AB33BD /* vigilance.xml */; }; AF633C1C1EE0BCA100AB33BD /* vigilance.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C191EE0BC4A00AB33BD /* vigilance.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF633C1D1EE0BCA700AB33BD /* vigilance.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C191EE0BC4A00AB33BD /* vigilance.c */; }; - AF633C211EE0BDCD00AB33BD /* seccam.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C201EE0BDCD00AB33BD /* seccam.c */; }; AF633C221EE0BDCD00AB33BD /* seccam.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C201EE0BDCD00AB33BD /* seccam.c */; }; - AF633C231EE0BDCD00AB33BD /* seccam.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C201EE0BDCD00AB33BD /* seccam.c */; }; + AF633C231EE0BDCD00AB33BD /* seccam.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C201EE0BDCD00AB33BD /* seccam.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF63A7F81AB4EDDB00593C75 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AF63A7FA1AB4EDDB00593C75 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; AF63A7FB1AB4EDDB00593C75 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; @@ -2109,10 +2111,10 @@ AF77781609B6504400EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AF77782709B650D200EA3033 /* starwars.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591B0988A469000655EE /* starwars.xml */; }; AF77782A09B650FF00EA3033 /* starwars.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77782809B650FF00EA3033 /* starwars.c */; }; - AF77783409B6516900EA3033 /* grab-ximage.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5607909936FDD00F3E977 /* grab-ximage.c */; }; - AF77783709B6518400EA3033 /* texfont.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77780809B64F4900EA3033 /* texfont.c */; }; - AF77783A09B651AF00EA3033 /* glut_stroke.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56E0B0996A0ED00BA26F7 /* glut_stroke.c */; }; - AF77783D09B651C700EA3033 /* glut_swidth.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56E0C0996A0ED00BA26F7 /* glut_swidth.c */; }; + AF77783409B6516900EA3033 /* grab-ximage.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5607909936FDD00F3E977 /* grab-ximage.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AF77783709B6518400EA3033 /* texfont.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77780809B64F4900EA3033 /* texfont.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AF77783A09B651AF00EA3033 /* glut_stroke.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56E0B0996A0ED00BA26F7 /* glut_stroke.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AF77783D09B651C700EA3033 /* glut_swidth.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56E0C0996A0ED00BA26F7 /* glut_swidth.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF77784B09B6528100EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AF77786709B6536000EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AF77787709B653DC00EA3033 /* dnalogo.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77787609B653DC00EA3033 /* dnalogo.c */; }; @@ -2377,8 +2379,23 @@ AF7ACFD919FF0BA600BD752B /* geodesicgears.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF7ACFD819FF0BA600BD752B /* geodesicgears.xml */; }; AF7ACFDA19FF0BA600BD752B /* geodesicgears.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF7ACFD819FF0BA600BD752B /* geodesicgears.xml */; }; AF7F54A417DC249500CE1158 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78377C17DBA85D003B9FC0 /* libz.dylib */; }; + AF81DFFE2583C14400CFC475 /* co____9.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF42888257D30BE001BC8CE /* co____9.xml */; }; + AF81DFFF2583C15A00CFC475 /* co____9.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF42886257D3071001BC8CE /* co____9.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AF81E00A25845C2A00CFC475 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; + AF81E00B25845C2A00CFC475 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; + AF81E00C25845C2A00CFC475 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AF81E00D25845C2A00CFC475 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; + AF81E01825845D1600CFC475 /* Randomizer.m in Sources */ = {isa = PBXBuildFile; fileRef = AF81E01725845D1600CFC475 /* Randomizer.m */; }; AF84AF2015829AF000607E4C /* SaverListController.m in Sources */ = {isa = PBXBuildFile; fileRef = AF84AF1E15829AF000607E4C /* SaverListController.m */; }; AF84FD4209B1209E00F3AB06 /* GLUT.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF84FD4109B1209E00F3AB06 /* GLUT.framework */; }; + AF87CEF3258933B7004E9BDF /* XScreenSaverView.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC254C509882C97000655EE /* XScreenSaverView.m */; }; + AF87CEF4258933BF004E9BDF /* XScreenSaverGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = AF4812F80990D9AE00FB32B8 /* XScreenSaverGLView.m */; }; + AF87CEF5258933D6004E9BDF /* PrefsReader.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD480981E32E00F7970E /* PrefsReader.m */; }; + AF87CEF6258933DC004E9BDF /* InvertedSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD420981E32E00F7970E /* InvertedSlider.m */; }; + AF87CEF7258933FA004E9BDF /* XScreenSaverConfigSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC2578009888F5A000655EE /* XScreenSaverConfigSheet.m */; }; + AF88B03A2593A2EF006F9EB1 /* glsl-utils.c in Sources */ = {isa = PBXBuildFile; fileRef = AF88B0382593A2EE006F9EB1 /* glsl-utils.c */; }; + AF88B03B2593A2EF006F9EB1 /* glsl-utils.c in Sources */ = {isa = PBXBuildFile; fileRef = AF88B0382593A2EE006F9EB1 /* glsl-utils.c */; }; + AF88B03C2593A2EF006F9EB1 /* glsl-utils.c in Sources */ = {isa = PBXBuildFile; fileRef = AF88B0382593A2EE006F9EB1 /* glsl-utils.c */; }; AF918983158FC00A002B5D1E /* iSaverRunner.xib in Resources */ = {isa = PBXBuildFile; fileRef = AF56019B157DAA3D00DB2055 /* iSaverRunner.xib */; }; AF918986158FC00A002B5D1E /* SaverRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD400981E32E00F7970E /* SaverRunner.m */; }; AF918987158FC00A002B5D1E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; @@ -3086,11 +3103,11 @@ AFA55A500993351F00F3E977 /* s1_b.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A460993351F00F3E977 /* s1_b.c */; }; AFA55A510993351F00F3E977 /* sproingies.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A470993351F00F3E977 /* sproingies.c */; }; AFA55A520993351F00F3E977 /* sproingiewrap.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A480993351F00F3E977 /* sproingiewrap.c */; }; - AFA55A530993353500F3E977 /* gllist.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A3E0993351F00F3E977 /* gllist.c */; }; + AFA55A530993353500F3E977 /* gllist.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A3E0993351F00F3E977 /* gllist.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AFA55A540993353500F3E977 /* gllist.h in Headers */ = {isa = PBXBuildFile; fileRef = AFA55A3F0993351F00F3E977 /* gllist.h */; }; AFA55A8D0993366F00F3E977 /* lament.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D60988A468000655EE /* lament.xml */; }; AFA55A8F0993369100F3E977 /* lament.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A8E0993369100F3E977 /* lament.c */; }; - AFA55A95099336D800F3E977 /* normals.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A93099336D800F3E977 /* normals.c */; }; + AFA55A95099336D800F3E977 /* normals.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A93099336D800F3E977 /* normals.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AFA55A96099336D800F3E977 /* normals.h in Headers */ = {isa = PBXBuildFile; fileRef = AFA55A94099336D800F3E977 /* normals.h */; }; AFA55AE309933D1C00F3E977 /* bubble3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587F0988A468000655EE /* bubble3d.xml */; }; AFA55AE509933D3800F3E977 /* bubble3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55AE409933D3800F3E977 /* bubble3d.c */; }; @@ -3228,6 +3245,7 @@ AFAAE3A0207D6420007A515C /* maze3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFAAE39E207D6420007A515C /* maze3d.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AFAAE3A2207D6439007A515C /* maze3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFAAE3A1207D6438007A515C /* maze3d.xml */; }; AFAAE3A3207D6439007A515C /* maze3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFAAE3A1207D6438007A515C /* maze3d.xml */; }; + AFAC5F772584666400C0F575 /* yarandom.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD5B0981E3CB00F7970E /* yarandom.c */; }; AFACE87A1CC83458008B24CD /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AFACE87C1CC83458008B24CD /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; AFACE87D1CC83458008B24CD /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; @@ -3270,7 +3288,7 @@ AFBE744119A7C6EF0018AA35 /* robot.c in Sources */ = {isa = PBXBuildFile; fileRef = AFBE743F19A7C6930018AA35 /* robot.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AFBF893E0E41D930006A2D66 /* fps.c in Sources */ = {isa = PBXBuildFile; fileRef = AFBF893C0E41D930006A2D66 /* fps.c */; }; AFBF893F0E41D930006A2D66 /* fps.h in Headers */ = {isa = PBXBuildFile; fileRef = AFBF893D0E41D930006A2D66 /* fps.h */; }; - AFBF89AF0E423FC3006A2D66 /* fps-gl.c in Sources */ = {isa = PBXBuildFile; fileRef = AFBF89AE0E423FC3006A2D66 /* fps-gl.c */; }; + AFBF89AF0E423FC3006A2D66 /* fps-gl.c in Sources */ = {isa = PBXBuildFile; fileRef = AFBF89AE0E423FC3006A2D66 /* fps-gl.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AFBF89B20E424036006A2D66 /* fpsI.h in Headers */ = {isa = PBXBuildFile; fileRef = AFBF89B10E424036006A2D66 /* fpsI.h */; }; AFBFE74F178642DC00432B21 /* SaverRunner.nib in Resources */ = {isa = PBXBuildFile; fileRef = AF9772E10989DFC6001F8B92 /* SaverRunner.nib */; }; AFBFE750178642DC00432B21 /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; }; @@ -3305,9 +3323,6 @@ AFC0E8C61CDC60DB008CAFAC /* hydrostat.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC0E8C31CDC60A9008CAFAC /* hydrostat.xml */; }; AFC0E8C71CDC60DE008CAFAC /* hydrostat.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC0E8C31CDC60A9008CAFAC /* hydrostat.xml */; }; AFC211950E4E30C800D87B6E /* teapot.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC211930E4E30C800D87B6E /* teapot.c */; }; - AFC43E741C68364B00C89999 /* PxPlus_IBM_VGA8.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AFC43E731C68364B00C89999 /* PxPlus_IBM_VGA8.ttf */; }; - AFC43E771C684BE400C89999 /* PxPlus_IBM_VGA8.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AFC43E731C68364B00C89999 /* PxPlus_IBM_VGA8.ttf */; }; - AFC43E7B1C6AA77900C89999 /* YearlReg.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68381BD6CDF9004C1B64 /* YearlReg.ttf */; }; AFC43E7C1C6AA78800C89999 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; }; AFC523C31FED9420001C300A /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; }; AFC5CFDD2044AA23004CEB5E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; @@ -3327,6 +3342,7 @@ AFC7592D158D8E8B00C5458E /* textclient.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC7592B158D8E8B00C5458E /* textclient.c */; }; AFC7592E158D8E8B00C5458E /* textclient.h in Headers */ = {isa = PBXBuildFile; fileRef = AFC7592C158D8E8B00C5458E /* textclient.h */; }; AFC75930158D9A7A00C5458E /* textclient-ios.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC7592F158D9A7A00C5458E /* textclient-ios.m */; }; + AFCA3EED25856B6200CBCF16 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFCA3EEC25856B6200CBCF16 /* IOKit.framework */; }; AFCCCBB009BFE4B000353F4D /* rdbomb.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFCCCBAD09BFE4B000353F4D /* rdbomb.xml */; }; AFCCCBB309BFE51900353F4D /* thornbird.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259230988A469000655EE /* thornbird.xml */; }; AFCE26332337332000BDCE10 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AFCE26322337332000BDCE10 /* LaunchScreen.storyboard */; }; @@ -3463,14 +3479,12 @@ AFD77E6820C23F8600A3638D /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; AFD77E6920C23F8600A3638D /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; }; AFD77E6A20C23F8600A3638D /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; }; - AFD77E7320C2418000A3638D /* filmleader.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD77E7220C2417F00A3638D /* filmleader.c */; }; AFD77E7420C2418000A3638D /* filmleader.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD77E7220C2417F00A3638D /* filmleader.c */; }; AFD77E7520C2418000A3638D /* filmleader.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD77E7220C2417F00A3638D /* filmleader.c */; }; AFD77E7720C2419600A3638D /* filmleader.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFD77E7620C2419600A3638D /* filmleader.xml */; }; AFD77E7820C2419600A3638D /* filmleader.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFD77E7620C2419600A3638D /* filmleader.xml */; }; - AFD9D5BE201E686B0070E99D /* ships.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD9D5BD201E686A0070E99D /* ships.c */; }; AFD9D5BF201E686B0070E99D /* ships.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD9D5BD201E686A0070E99D /* ships.c */; }; - AFD9D5C0201E686B0070E99D /* ships.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD9D5BD201E686A0070E99D /* ships.c */; }; + AFD9D5C0201E686B0070E99D /* ships.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD9D5BD201E686A0070E99D /* ships.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AFDA11251934424D003D397F /* aligned_malloc.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDA11211934424D003D397F /* aligned_malloc.c */; }; AFDA11261934424D003D397F /* aligned_malloc.h in Headers */ = {isa = PBXBuildFile; fileRef = AFDA11221934424D003D397F /* aligned_malloc.h */; }; AFDA11271934424D003D397F /* thread_util.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDA11231934424D003D397F /* thread_util.c */; }; @@ -3527,7 +3541,6 @@ AFEC23E81CB6EC6800DE138F /* dymaxionmap.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEC23E51CB6EBDA00DE138F /* dymaxionmap.xml */; }; AFEC23E91CB6EC7F00DE138F /* dymaxionmap.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEC23E41CB6EBC400DE138F /* dymaxionmap.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AFEC68371BD6CA85004C1B64 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; }; - AFEC68391BD6CDF9004C1B64 /* YearlReg.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68381BD6CDF9004C1B64 /* YearlReg.ttf */; }; AFEE10541D13406000AAC8F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AFEE10561D13406000AAC8F7 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; AFEE10571D13406000AAC8F7 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; @@ -3625,7 +3638,7 @@ CE3D01691B76F88A00993C75 /* testx11.xml in Resources */ = {isa = PBXBuildFile; fileRef = CE3D01681B76F83E00993C75 /* testx11.xml */; }; CE3D016B1B76F93700993C75 /* testx11.c in Sources */ = {isa = PBXBuildFile; fileRef = CE3D016A1B76F8E200993C75 /* testx11.c */; }; CE43C2BF1C055157004C2BC6 /* jwxyz-cocoa.m in Sources */ = {isa = PBXBuildFile; fileRef = CE43C2BE1C055157004C2BC6 /* jwxyz-cocoa.m */; }; - CE55645A1C25141000645458 /* jwxyz-gl.c in Sources */ = {isa = PBXBuildFile; fileRef = CE5564591C25141000645458 /* jwxyz-gl.c */; }; + CE55645A1C25141000645458 /* jwxyz-gl.c in Sources */ = {isa = PBXBuildFile; fileRef = CE5564591C25141000645458 /* jwxyz-gl.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; CE8EA1C21C35CF10002D1020 /* jwxyz-common.c in Sources */ = {isa = PBXBuildFile; fileRef = CE8EA1C11C35CF10002D1020 /* jwxyz-common.c */; }; CE9289D319BD00E300961F22 /* async_netdb.c in Sources */ = {isa = PBXBuildFile; fileRef = CE9289D119BD00E200961F22 /* async_netdb.c */; }; CE9289D419BD00E300961F22 /* async_netdb.h in Headers */ = {isa = PBXBuildFile; fileRef = CE9289D219BD00E300961F22 /* async_netdb.h */; }; @@ -6391,6 +6404,20 @@ remoteGlobalIDString = AFA56119099378CB00F3E977; remoteInfo = molecules.h; }; + AF81E00225845C2A00CFC475 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF4808C0098C3B6C00FB32B8; + remoteInfo = jwxyz; + }; + AF81E01925845D3500CFC475 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF81E00025845C2A00CFC475; + remoteInfo = RandomXScreenSaver; + }; AF918979158FC00A002B5D1E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -7837,6 +7864,8 @@ AF083A48099311D700277BE9 /* Atunnel.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Atunnel.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF083A58099312B000277BE9 /* tunnel_draw.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = tunnel_draw.c; path = hacks/glx/tunnel_draw.c; sourceTree = ""; }; AF083A5D099312DB00277BE9 /* tunnel_draw.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = tunnel_draw.h; path = hacks/glx/tunnel_draw.h; sourceTree = ""; }; + AF0CA52025D3B92E00DEDA90 /* SpecialElite.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = SpecialElite.ttf; path = ../hacks/fonts/SpecialElite.ttf; sourceTree = ""; }; + AF0CA52325D3C2F000DEDA90 /* clacon.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = clacon.ttf; path = ../hacks/fonts/clacon.ttf; sourceTree = ""; }; AF0DC7BD0C4C73F600D76972 /* m6502.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = m6502.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF0DCA320C4C74A200D76972 /* asm6502.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = asm6502.c; path = hacks/asm6502.c; sourceTree = ""; }; AF0DCA330C4C74A200D76972 /* asm6502.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = asm6502.h; path = hacks/asm6502.h; sourceTree = ""; }; @@ -7846,8 +7875,8 @@ AF0DCA5F0C4CBB7300D76972 /* voronoi.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = voronoi.c; path = hacks/glx/voronoi.c; sourceTree = ""; }; AF0DCA610C4CBB8E00D76972 /* voronoi.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = voronoi.xml; sourceTree = ""; }; AF0F46DC104E1809000A929C /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; - AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.perl; name = "xscreensaver-text"; path = "../driver/xscreensaver-text"; sourceTree = ""; }; - AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.perl; name = "xscreensaver-getimage-file"; path = "../driver/xscreensaver-getimage-file"; sourceTree = ""; }; + AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.perl; name = "xscreensaver-text"; path = "../hacks/xscreensaver-text"; sourceTree = ""; }; + AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.perl; name = "xscreensaver-getimage-file"; path = "../hacks/xscreensaver-getimage-file"; sourceTree = ""; }; AF0FAF3B159BAC7B00BCE2F7 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreText.framework; sourceTree = DEVELOPER_DIR; }; AF142BAC1EE75DBF0005C0A8 /* settings.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = settings.png; sourceTree = ""; }; AF142BAD1EE75DBF0005C0A8 /* stop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = stop.png; sourceTree = ""; }; @@ -8103,7 +8132,7 @@ AF63A8091AB4EF5D00593C75 /* romanboy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = romanboy.c; path = hacks/glx/romanboy.c; sourceTree = ""; }; AF63F44E1C3465BE0033E133 /* Apple2.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Apple2.app; sourceTree = BUILT_PRODUCTS_DIR; }; AF63F4741C34682A0033E133 /* Phosphor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Phosphor.app; sourceTree = BUILT_PRODUCTS_DIR; }; - AF63F49A1C3469FC0033E133 /* TestX11.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TestX11.app; sourceTree = BUILT_PRODUCTS_DIR; }; + AF63F49A1C3469FC0033E133 /* TestX11-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "TestX11-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; AF642405099FF9C2000F4CD4 /* Extrusion.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Extrusion.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF642409099FFAF0000F4CD4 /* extrusion-helix2.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "extrusion-helix2.c"; path = "hacks/glx/extrusion-helix2.c"; sourceTree = ""; }; AF64240A099FFAF0000F4CD4 /* extrusion-helix3.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "extrusion-helix3.c"; path = "hacks/glx/extrusion-helix3.c"; sourceTree = ""; }; @@ -8142,7 +8171,7 @@ AF6C6D89226AE4FC0065A748 /* GravityWell.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GravityWell.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF6C6D8B226AE6120065A748 /* gravitywell.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gravitywell.c; path = hacks/glx/gravitywell.c; sourceTree = ""; }; AF6C6D8D226AE6370065A748 /* gravitywell.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = gravitywell.xml; sourceTree = ""; }; - AF70D21422A59A080004BAAD /* gallant12x22.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = gallant12x22.ttf; sourceTree = ""; }; + AF70D21422A59A080004BAAD /* gallant12x22.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = gallant12x22.ttf; path = ../hacks/fonts/gallant12x22.ttf; sourceTree = ""; }; AF73FF201A08AB9400E485E9 /* iSaverRunner57t.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iSaverRunner57t.png; sourceTree = ""; }; AF73FF361A09877F00E485E9 /* BinaryRing.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BinaryRing.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF73FF381A09889700E485E9 /* binaryring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = binaryring.c; path = hacks/binaryring.c; sourceTree = ""; }; @@ -8206,11 +8235,15 @@ AF7ACFD419FF0A9200BD752B /* GeodesicGears.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GeodesicGears.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF7ACFD619FF0B7A00BD752B /* geodesicgears.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = geodesicgears.c; path = hacks/glx/geodesicgears.c; sourceTree = ""; }; AF7ACFD819FF0BA600BD752B /* geodesicgears.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = geodesicgears.xml; sourceTree = ""; }; + AF81E01525845C2A00CFC475 /* RandomXScreenSaver.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RandomXScreenSaver.saver; sourceTree = BUILT_PRODUCTS_DIR; }; + AF81E01725845D1600CFC475 /* Randomizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Randomizer.m; sourceTree = ""; }; AF84AF1E15829AF000607E4C /* SaverListController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SaverListController.m; sourceTree = ""; }; AF84FD4109B1209E00F3AB06 /* GLUT.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLUT.framework; path = /System/Library/Frameworks/GLUT.framework; sourceTree = ""; }; + AF88B0382593A2EE006F9EB1 /* glsl-utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "glsl-utils.c"; path = "hacks/glx/glsl-utils.c"; sourceTree = ""; }; + AF88B0392593A2EE006F9EB1 /* glsl-utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "glsl-utils.h"; path = "hacks/glx/glsl-utils.h"; sourceTree = ""; }; AF91898F158FC00A002B5D1E /* XScreenSaver.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XScreenSaver.app; sourceTree = BUILT_PRODUCTS_DIR; }; AF939AD220351BFC0032DD23 /* font-retry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "font-retry.c"; path = "utils/font-retry.c"; sourceTree = ""; }; - AF939AD42038C0040032DD23 /* luximr.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = luximr.ttf; sourceTree = ""; }; + AF939AD42038C0040032DD23 /* luximr.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = luximr.ttf; path = ../hacks/fonts/luximr.ttf; sourceTree = ""; }; AF94E7411A16E93600289B93 /* xscreensaver.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = xscreensaver.xcconfig; sourceTree = ""; }; AF95059925670ECC00C1F257 /* COVID19.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = COVID19.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF95059B25670FE900C1F257 /* covid19.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = covid19.c; path = hacks/glx/covid19.c; sourceTree = ""; }; @@ -8469,6 +8502,8 @@ AFAAE39C207D6343007A515C /* Maze3D.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Maze3D.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AFAAE39E207D6420007A515C /* maze3d.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = maze3d.c; path = hacks/glx/maze3d.c; sourceTree = ""; }; AFAAE3A1207D6438007A515C /* maze3d.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = maze3d.xml; sourceTree = ""; }; + AFAC5F7A258479A000C0F575 /* Randomizer.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Randomizer.plist; sourceTree = ""; }; + AFAC5F7C258479B000C0F575 /* Randomizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Randomizer.h; sourceTree = ""; }; AFACE8881CC83458008B24CD /* EnergyStream.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EnergyStream.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AFACE88A1CC83578008B24CD /* energystream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = energystream.c; path = hacks/glx/energystream.c; sourceTree = ""; }; AFACE88B1CC83578008B24CD /* energystream.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = energystream.xml; sourceTree = ""; }; @@ -8704,7 +8739,6 @@ AFC25B5E0988BA63000655EE /* deco.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = deco.c; path = hacks/deco.c; sourceTree = ""; }; AFC25B990988BC08000655EE /* colors.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = colors.c; path = utils/colors.c; sourceTree = ""; }; AFC25B9A0988BC08000655EE /* colors.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = colors.h; path = utils/colors.h; sourceTree = ""; }; - AFC43E731C68364B00C89999 /* PxPlus_IBM_VGA8.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = PxPlus_IBM_VGA8.ttf; sourceTree = ""; }; AFC5CFEB2044AA23004CEB5E /* Crumbler.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Crumbler.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AFC5CFED2044AB03004CEB5E /* quickhull.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = quickhull.c; path = hacks/glx/quickhull.c; sourceTree = ""; }; AFC5CFEE2044AB03004CEB5E /* crumbler.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = crumbler.c; path = hacks/glx/crumbler.c; sourceTree = ""; }; @@ -8712,6 +8746,7 @@ AFC7592B158D8E8B00C5458E /* textclient.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = textclient.c; path = utils/textclient.c; sourceTree = ""; }; AFC7592C158D8E8B00C5458E /* textclient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = textclient.h; path = utils/textclient.h; sourceTree = ""; }; AFC7592F158D9A7A00C5458E /* textclient-ios.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "textclient-ios.m"; path = "OSX/textclient-ios.m"; sourceTree = ""; }; + AFCA3EEC25856B6200CBCF16 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; AFCCCBAD09BFE4B000353F4D /* rdbomb.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = rdbomb.xml; sourceTree = ""; }; AFCE26322337332000BDCE10 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; AFCF83501AF5B515008BB7E1 /* SplitFlap.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SplitFlap.saver; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -8849,8 +8884,7 @@ AFEC23E21CB6EAE100DE138F /* DymaxionMap.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DymaxionMap.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AFEC23E41CB6EBC400DE138F /* dymaxionmap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dymaxionmap.c; path = hacks/glx/dymaxionmap.c; sourceTree = ""; }; AFEC23E51CB6EBDA00DE138F /* dymaxionmap.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = dymaxionmap.xml; sourceTree = ""; }; - AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = OCRAStd.otf; sourceTree = ""; }; - AFEC68381BD6CDF9004C1B64 /* YearlReg.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = YearlReg.ttf; sourceTree = ""; }; + AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = OCRAStd.otf; path = ../hacks/fonts/OCRAStd.otf; sourceTree = ""; }; AFEE10621D13406000AAC8F7 /* CubeTwist.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CubeTwist.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AFEE10641D1341E300AAC8F7 /* cubetwist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cubetwist.c; path = hacks/glx/cubetwist.c; sourceTree = ""; }; AFEE10651D1341E300AAC8F7 /* cubetwist.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = cubetwist.xml; sourceTree = ""; }; @@ -10546,6 +10580,18 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF81E00825845C2A00CFC475 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AF81E00A25845C2A00CFC475 /* ScreenSaver.framework in Frameworks */, + AF81E00B25845C2A00CFC475 /* QuartzCore.framework in Frameworks */, + AF81E00C25845C2A00CFC475 /* Cocoa.framework in Frameworks */, + AF81E00D25845C2A00CFC475 /* Carbon.framework in Frameworks */, + AFCA3EED25856B6200CBCF16 /* IOKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF918989158FC00A002B5D1E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -12991,7 +13037,7 @@ CE3D01661B76F4C100993C75 /* TestX11.saver */, AF63F44E1C3465BE0033E133 /* Apple2.app */, AF63F4741C34682A0033E133 /* Phosphor.app */, - AF63F49A1C3469FC0033E133 /* TestX11.app */, + AF63F49A1C3469FC0033E133 /* TestX11-iOS.app */, AFEC23E21CB6EAE100DE138F /* DymaxionMap.saver */, AF46E9E41CBBA2B300240FBC /* Unicrud.saver */, AFACE8881CC83458008B24CD /* EnergyStream.saver */, @@ -13021,6 +13067,7 @@ AF95059925670ECC00C1F257 /* COVID19.saver */, AF96015325758F9F007FA31B /* Headroom.saver */, AF688ACE257C04D200C91EAE /* Beats.saver */, + AF81E01525845C2A00CFC475 /* RandomXScreenSaver.saver */, ); name = Products; path = ..; @@ -13059,17 +13106,18 @@ 8D1107310486CEB800E47090 /* XScreenSaver.plist */, AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */, AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */, + AF0CA52325D3C2F000DEDA90 /* clacon.ttf */, AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */, - AFEC68381BD6CDF9004C1B64 /* YearlReg.ttf */, - AFC43E731C68364B00C89999 /* PxPlus_IBM_VGA8.ttf */, AF939AD42038C0040032DD23 /* luximr.ttf */, AF70D21422A59A080004BAAD /* gallant12x22.ttf */, + AF0CA52025D3B92E00DEDA90 /* SpecialElite.ttf */, AF142BAC1EE75DBF0005C0A8 /* settings.png */, 557BF07A1EE90C8B00846DCE /* settings@2x.png */, 557BF07B1EE90C8B00846DCE /* settings@3x.png */, AF142BAD1EE75DBF0005C0A8 /* stop.png */, 557BF07C1EE90C8B00846DCE /* stop@2x.png */, 557BF07D1EE90C8B00846DCE /* stop@3x.png */, + AFAC5F7A258479A000C0F575 /* Randomizer.plist */, ); name = Resources; sourceTree = ""; @@ -13077,6 +13125,7 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( + AFCA3EEC25856B6200CBCF16 /* IOKit.framework */, AFD5E98425672E8500704C83 /* WebKit.framework */, AF142BB01EFEFBA20005C0A8 /* Photos.framework */, AF1ADA171850180E00932759 /* Sparkle.framework */, @@ -13128,6 +13177,8 @@ AFE1FD3F0981E32E00F7970E /* SaverRunner.h */, AFE1FD400981E32E00F7970E /* SaverRunner.m */, AFAA6B441773F07700DE720C /* ios-function-table.m */, + AFAC5F7C258479B000C0F575 /* Randomizer.h */, + AF81E01725845D1600CFC475 /* Randomizer.m */, ); name = SaverRunner; sourceTree = ""; @@ -13409,6 +13460,8 @@ AF48E1630A0C268500F94CF9 /* glschool_alg.h */, AF48E1640A0C268500F94CF9 /* glschool_gl.c */, AF48E1650A0C268500F94CF9 /* glschool_gl.h */, + AF88B0382593A2EE006F9EB1 /* glsl-utils.c */, + AF88B0392593A2EE006F9EB1 /* glsl-utils.h */, AF7777E709B64CF700EA3033 /* glslideshow.c */, AFA55C8C099349EE00F3E977 /* glsnake.c */, AFD56E080996A07A00BA26F7 /* gltext.c */, @@ -15699,7 +15752,7 @@ ); name = "TestX11-iOS"; productName = SaverTester; - productReference = AF63F49A1C3469FC0033E133 /* TestX11.app */; + productReference = AF63F49A1C3469FC0033E133 /* TestX11-iOS.app */; productType = "com.apple.product-type.application"; }; AF6423F2099FF9C2000F4CD4 /* Extrusion */ = { @@ -16342,6 +16395,26 @@ productReference = AF7ACFD419FF0A9200BD752B /* GeodesicGears.saver */; productType = "com.apple.product-type.bundle"; }; + AF81E00025845C2A00CFC475 /* RandomXScreenSaver */ = { + isa = PBXNativeTarget; + buildConfigurationList = AF81E01225845C2A00CFC475 /* Build configuration list for PBXNativeTarget "RandomXScreenSaver" */; + buildPhases = ( + AF81E00325845C2A00CFC475 /* Resources */, + AF81E00525845C2A00CFC475 /* Sources */, + AF81E00825845C2A00CFC475 /* Frameworks */, + AF81E01025845C2A00CFC475 /* Rez */, + AF81E01125845C2A00CFC475 /* Run Update Info Plist */, + ); + buildRules = ( + ); + dependencies = ( + AF81E00125845C2A00CFC475 /* PBXTargetDependency */, + ); + name = RandomXScreenSaver; + productName = Attraction; + productReference = AF81E01525845C2A00CFC475 /* RandomXScreenSaver.saver */; + productType = "com.apple.product-type.bundle"; + }; AF918977158FC00A002B5D1E /* XScreenSaver-iOS */ = { isa = PBXNativeTarget; buildConfigurationList = AF91898C158FC00A002B5D1E /* Build configuration list for PBXNativeTarget "XScreenSaver-iOS" */; @@ -19127,9 +19200,9 @@ productReference = AFD77E7020C23F8600A3638D /* FilmLeader.saver */; productType = "com.apple.product-type.bundle"; }; - AFDA658E178A52B70070D24B /* Unknown Pleasures */ = { + AFDA658E178A52B70070D24B /* UnknownPleasures */ = { isa = PBXNativeTarget; - buildConfigurationList = AFDA659E178A52B70070D24B /* Build configuration list for PBXNativeTarget "Unknown Pleasures" */; + buildConfigurationList = AFDA659E178A52B70070D24B /* Build configuration list for PBXNativeTarget "UnknownPleasures" */; buildPhases = ( AFDA6591178A52B70070D24B /* Resources */, AFDA6593178A52B70070D24B /* Sources */, @@ -19142,7 +19215,7 @@ dependencies = ( AFDA658F178A52B70070D24B /* PBXTargetDependency */, ); - name = "Unknown Pleasures"; + name = UnknownPleasures; productName = DangerBall; productReference = AFDA65A1178A52B70070D24B /* UnknownPleasures.saver */; productType = "com.apple.product-type.bundle"; @@ -19828,6 +19901,9 @@ AF7ACFC019FF0A9200BD752B = { DevelopmentTeam = 4627ATJELP; }; + AF81E00025845C2A00CFC475 = { + DevelopmentTeam = 4627ATJELP; + }; AF918977158FC00A002B5D1E = { DevelopmentTeam = 4627ATJELP; }; @@ -20574,7 +20650,7 @@ AF998EDA0A083DB30051049D /* TopBlock */, AF3581FB143330F900E09C51 /* TronBit */, AF46E9CF1CBBA2B300240FBC /* Unicrud */, - AFDA658E178A52B70070D24B /* Unknown Pleasures */, + AFDA658E178A52B70070D24B /* UnknownPleasures */, AF633C011EE0BA6F00AB33BD /* Vigilance */, AF0DCA420C4CBB0D00D76972 /* Voronoi */, AF39E282198A11F60064A58D /* WindupRobot */, @@ -20606,6 +20682,7 @@ AF9771D60989DC4A001F8B92 /* SaverTester */, AF918977158FC00A002B5D1E /* XScreenSaver-iOS */, AF1AD9E118500F9F00932759 /* XScreenSaverUpdater */, + AF81E00025845C2A00CFC475 /* RandomXScreenSaver */, ); }; /* End PBXProject section */ @@ -21138,6 +21215,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + AF0CA52125D3B92E00DEDA90 /* SpecialElite.ttf in Resources */, AF4778D9099DDD14001F091E /* xjack.xml in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -21520,7 +21598,6 @@ buildActionMask = 2147483647; files = ( AF77787A09B6545E00EA3033 /* dnalogo.xml in Resources */, - AFC43E7B1C6AA77900C89999 /* YearlReg.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -21583,6 +21660,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF81E00325845C2A00CFC475 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF91897B158FC00A002B5D1E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -21592,8 +21676,6 @@ AF73FF211A08AB9400E485E9 /* iSaverRunner57t.png in Resources */, 550FB6001AD64424001A4FA5 /* Media-iOS.xcassets in Resources */, AFEC68371BD6CA85004C1B64 /* OCRAStd.otf in Resources */, - AFC43E741C68364B00C89999 /* PxPlus_IBM_VGA8.ttf in Resources */, - AFEC68391BD6CDF9004C1B64 /* YearlReg.ttf in Resources */, AF939AD72038C5F00032DD23 /* luximr.ttf in Resources */, AF70D21522A59A080004BAAD /* gallant12x22.ttf in Resources */, AF142BAE1EE75DBF0005C0A8 /* settings.png in Resources */, @@ -21639,6 +21721,7 @@ AF918AD5158FC53D002B5D1E /* companioncube.xml in Resources */, AF918AD6158FC53D002B5D1E /* compass.xml in Resources */, AF918AD7158FC53D002B5D1E /* coral.xml in Resources */, + AF81DFFE2583C14400CFC475 /* co____9.xml in Resources */, AF918AD8158FC53D002B5D1E /* crackberg.xml in Resources */, AFC5CFF52044AB28004CEB5E /* crumbler.xml in Resources */, AF918ADA158FC53D002B5D1E /* crystal.xml in Resources */, @@ -21751,6 +21834,7 @@ AF918B41158FC53D002B5D1E /* noof.xml in Resources */, AF918B42158FC53D002B5D1E /* noseguy.xml in Resources */, AF918B43158FC53D002B5D1E /* pacman.xml in Resources */, + AF0CA52525D3C2F000DEDA90 /* clacon.ttf in Resources */, AF918B44158FC53D002B5D1E /* pedal.xml in Resources */, AF3EC991203517AE00180A35 /* peepers.xml in Resources */, AF918B45158FC53D002B5D1E /* penetrate.xml in Resources */, @@ -21805,6 +21889,7 @@ AF918B70158FC53E002B5D1E /* starwars.xml in Resources */, AF918B71158FC53E002B5D1E /* stonerview.xml in Resources */, AF918B72158FC53E002B5D1E /* strange.xml in Resources */, + AF0CA52225D3B92E00DEDA90 /* SpecialElite.ttf in Resources */, AF918B73158FC53E002B5D1E /* substrate.xml in Resources */, AF918B74158FC53E002B5D1E /* superquadrics.xml in Resources */, AF918B75158FC53E002B5D1E /* surfaces.xml in Resources */, @@ -22120,9 +22205,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + AF0CA52425D3C2F000DEDA90 /* clacon.ttf in Resources */, AF9D4DC209B5B862006E59CF /* bsod.xml in Resources */, AF0FAF1709CA712600EE1051 /* xscreensaver-getimage-file in Resources */, - AFC43E771C684BE400C89999 /* PxPlus_IBM_VGA8.ttf in Resources */, AF939AD52038C0050032DD23 /* luximr.ttf in Resources */, AF70D21622A5A0840004BAAD /* gallant12x22.ttf in Resources */, ); @@ -22688,6 +22773,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + AF5967C725DA32CC0084ED6C /* xscreensaver-text in Resources */, AFD56E9F0996A23800BA26F7 /* gltext.xml in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -23878,6 +23964,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF81E01025845C2A00CFC475 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF95059425670ECC00C1F257 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; @@ -24930,6 +25023,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -24945,6 +25039,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -24979,6 +25074,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -24994,6 +25090,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25009,6 +25106,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25024,6 +25122,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25039,6 +25138,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25054,6 +25154,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25069,6 +25170,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25084,6 +25186,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25099,6 +25202,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25114,6 +25218,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25129,6 +25234,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25144,6 +25250,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25159,6 +25266,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25174,6 +25282,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25189,6 +25298,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25204,6 +25314,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25219,6 +25330,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25234,6 +25346,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25264,6 +25377,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25279,6 +25393,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25294,6 +25409,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25309,6 +25425,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25324,6 +25441,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25339,6 +25457,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25354,6 +25473,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25369,13 +25489,14 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX\n"; showEnvVarsInLog = 0; }; AF63F24F1C3465BE0033E133 /* Update Function Table */ = { @@ -25398,6 +25519,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25427,6 +25549,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25456,6 +25579,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25471,6 +25595,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25486,6 +25611,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25501,6 +25627,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25516,6 +25643,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25531,6 +25659,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25546,6 +25675,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25561,6 +25691,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25598,12 +25729,29 @@ shellPath = /bin/sh; shellScript = "$SOURCE_ROOT/icmp-warning.pl"; }; + AF81E01125845C2A00CFC475 /* Run Update Info Plist */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", + ); + name = "Run Update Info Plist"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q \"$BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX\"\n"; + showEnvVarsInLog = 0; + }; AF91898A158FC00A002B5D1E /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25633,6 +25781,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25648,6 +25797,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25663,6 +25813,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25678,6 +25829,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25693,6 +25845,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25708,6 +25861,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25723,6 +25877,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25738,6 +25893,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25753,6 +25909,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25768,6 +25925,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25783,6 +25941,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25798,6 +25957,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25813,6 +25973,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25828,6 +25989,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25843,6 +26005,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25858,6 +26021,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25873,6 +26037,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25888,6 +26053,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25903,6 +26069,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25918,6 +26085,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25933,6 +26101,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25948,6 +26117,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25963,6 +26133,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25978,6 +26149,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -25993,6 +26165,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26008,6 +26181,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26023,6 +26197,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26038,6 +26213,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26053,6 +26229,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26068,6 +26245,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26083,6 +26261,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26098,6 +26277,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26113,6 +26293,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26128,6 +26309,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26143,6 +26325,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26158,6 +26341,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26173,6 +26357,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26188,6 +26373,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26203,6 +26389,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26218,6 +26405,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26233,6 +26421,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26248,6 +26437,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26263,6 +26453,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26278,6 +26469,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26293,6 +26485,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26308,6 +26501,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26323,6 +26517,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26338,6 +26533,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26353,6 +26549,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26368,6 +26565,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26383,6 +26581,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26398,6 +26597,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26413,6 +26613,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26428,6 +26629,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26443,6 +26645,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26458,6 +26661,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26473,6 +26677,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26488,6 +26693,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26503,6 +26709,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26518,6 +26725,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26533,6 +26741,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26548,6 +26757,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26563,6 +26773,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26578,6 +26789,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26593,6 +26805,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26608,6 +26821,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26623,6 +26837,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26638,6 +26853,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26653,6 +26869,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26668,6 +26885,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26683,6 +26901,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26698,6 +26917,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26713,6 +26933,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26728,6 +26949,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26743,6 +26965,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26758,6 +26981,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26773,6 +26997,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26788,6 +27013,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26803,6 +27029,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26818,6 +27045,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26833,6 +27061,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26848,6 +27077,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26863,6 +27093,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26878,6 +27109,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26893,6 +27125,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26908,6 +27141,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26923,6 +27157,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26938,6 +27173,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26953,6 +27189,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26968,6 +27205,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26983,6 +27221,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -26998,6 +27237,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27013,6 +27253,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27028,6 +27269,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27043,6 +27285,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27058,6 +27301,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27073,6 +27317,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27088,6 +27333,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27103,6 +27349,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27118,6 +27365,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27133,6 +27381,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27148,6 +27397,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27163,6 +27413,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27178,6 +27429,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27193,6 +27445,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27208,6 +27461,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27223,6 +27477,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27238,6 +27493,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27253,6 +27509,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27268,6 +27525,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27283,6 +27541,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27298,6 +27557,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27313,6 +27573,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27328,6 +27589,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27343,6 +27605,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27358,6 +27621,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27373,6 +27637,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27388,6 +27653,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27403,6 +27669,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27418,6 +27685,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27433,6 +27701,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27448,6 +27717,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27463,6 +27733,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27478,6 +27749,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27493,6 +27765,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27508,6 +27781,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27523,6 +27797,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27538,6 +27813,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27553,6 +27829,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27568,6 +27845,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27583,6 +27861,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27598,6 +27877,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27613,6 +27893,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27628,6 +27909,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27643,6 +27925,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27658,6 +27941,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27673,6 +27957,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27688,6 +27973,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27703,6 +27989,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27718,6 +28005,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27733,6 +28021,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27748,6 +28037,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27763,6 +28053,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27778,6 +28069,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27793,6 +28085,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27808,6 +28101,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27823,6 +28117,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27838,6 +28133,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27853,6 +28149,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27868,6 +28165,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27883,6 +28181,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27898,6 +28197,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27913,6 +28213,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27928,6 +28229,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27943,6 +28245,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27958,6 +28261,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27973,6 +28277,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -27988,6 +28293,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28003,6 +28309,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28018,6 +28325,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28033,6 +28341,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28048,6 +28357,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28063,6 +28373,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28078,6 +28389,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28093,6 +28405,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28108,6 +28421,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28123,6 +28437,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28138,6 +28453,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28153,6 +28469,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28168,6 +28485,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28183,6 +28501,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28198,6 +28517,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28213,6 +28533,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28228,6 +28549,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28243,6 +28565,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28258,6 +28581,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28273,6 +28597,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28288,6 +28613,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28303,6 +28629,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28318,6 +28645,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28333,6 +28661,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28348,6 +28677,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28363,6 +28693,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28378,6 +28709,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28393,6 +28725,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28408,6 +28741,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28423,6 +28757,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28438,6 +28773,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28453,6 +28789,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28468,6 +28805,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28483,6 +28821,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28498,6 +28837,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28513,6 +28853,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28528,6 +28869,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28543,6 +28885,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28558,6 +28901,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28573,6 +28917,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28588,6 +28933,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28603,6 +28949,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28618,6 +28965,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28651,6 +28999,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28666,6 +29015,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28709,6 +29059,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28724,6 +29075,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28739,6 +29091,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28754,6 +29107,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28769,6 +29123,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28784,6 +29139,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28799,6 +29155,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28814,6 +29171,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28829,6 +29187,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28844,6 +29203,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28859,6 +29219,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28874,6 +29235,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28889,6 +29251,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28904,6 +29267,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28919,6 +29283,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28934,6 +29299,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28949,13 +29315,14 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX\n"; showEnvVarsInLog = 0; }; AFE6A4290CDD7FAA002805BF /* Run Update Info Plist */ = { @@ -28964,13 +29331,14 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX\n"; showEnvVarsInLog = 0; }; AFEC23DE1CB6EAE100DE138F /* Run Update Info Plist */ = { @@ -28979,6 +29347,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -28994,6 +29363,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -29009,6 +29379,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -29024,6 +29395,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -29039,6 +29411,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -29054,6 +29427,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -29069,6 +29443,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -29084,6 +29459,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -29099,6 +29475,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -29114,6 +29491,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -29129,6 +29507,7 @@ files = ( ); inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", ); name = "Run Update Info Plist"; outputPaths = ( @@ -29225,6 +29604,7 @@ buildActionMask = 2147483647; files = ( AF2D0D40241D7D7F0001D8B8 /* etruscanvenus.c in Sources */, + AF21B16D2594EEC300671377 /* glsl-utils.c in Sources */, AF2D0D2C241D7C870001D8B8 /* XScreenSaverSubclass.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -29781,28 +30161,21 @@ AF4808C6098C3BDF00FB32B8 /* erase.c in Sources */, AF4808C7098C3BE600FB32B8 /* hsv.c in Sources */, AFBF893E0E41D930006A2D66 /* fps.c in Sources */, - AFD77E7320C2418000A3638D /* filmleader.c in Sources */, AFBF89AF0E423FC3006A2D66 /* fps-gl.c in Sources */, 5501D1961DBDCC3D00624BE9 /* xshm.c in Sources */, - AF4808C8098C3BE800FB32B8 /* InvertedSlider.m in Sources */, - AF633C211EE0BDCD00AB33BD /* seccam.c in Sources */, AF4808C9098C3BEC00FB32B8 /* jwxyz.m in Sources */, - AF4808CA098C3BEE00FB32B8 /* PrefsReader.m in Sources */, AFDA11251934424D003D397F /* aligned_malloc.c in Sources */, AF4808CC098C3BF200FB32B8 /* spline.c in Sources */, AF2D8F321CEBA10300198014 /* jwxyz-timers.c in Sources */, AF939AD320351BFD0032DD23 /* font-retry.c in Sources */, AF4808CD098C3BF400FB32B8 /* usleep.c in Sources */, CE55645A1C25141000645458 /* jwxyz-gl.c in Sources */, - AF4808CE098C3BF800FB32B8 /* XScreenSaverConfigSheet.m in Sources */, - AF4808CF098C3BFB00FB32B8 /* XScreenSaverView.m in Sources */, AF4808D0098C3BFD00FB32B8 /* yarandom.c in Sources */, AF480FCC09901DF900FB32B8 /* gltrackball.c in Sources */, AF480FCD09901E0000FB32B8 /* rotator.c in Sources */, AF480FCE09901E0400FB32B8 /* sphere.c in Sources */, AF480FCF09901E0700FB32B8 /* trackball.c in Sources */, AF480FD009901E0A00FB32B8 /* tube.c in Sources */, - AF4812FA0990D9AE00FB32B8 /* XScreenSaverGLView.m in Sources */, AF083A21099310CF00277BE9 /* xlockmore.c in Sources */, AFA55866099324D800F3E977 /* minixpm.c in Sources */, AFA55A530993353500F3E977 /* gllist.c in Sources */, @@ -29811,7 +30184,6 @@ AF975C93099C929800B05160 /* ximage-loader.c in Sources */, CE8EA1C21C35CF10002D1020 /* jwxyz-common.c in Sources */, AF4774E8099D8D8C001F091E /* logo.c in Sources */, - AFD9D5BE201E686B0070E99D /* ships.c in Sources */, AF4775C0099D9E79001F091E /* resources.c in Sources */, AF9D468F09B51567006E59CF /* grabclient-osx.m in Sources */, AF9D473809B52EE0006E59CF /* colorbars.c in Sources */, @@ -29821,13 +30193,13 @@ AF77783A09B651AF00EA3033 /* glut_stroke.c in Sources */, AF77783D09B651C700EA3033 /* glut_swidth.c in Sources */, AFAD462309D5F4DA00AB5F95 /* grabclient.c in Sources */, - AF41E96A201D4B6B0098E253 /* razzledazzle.c in Sources */, AF6048FB157C07C600CA21E4 /* jwzgles.c in Sources */, AFC7592D158D8E8B00C5458E /* textclient.c in Sources */, AFC75930158D9A7A00C5458E /* textclient-ios.m in Sources */, AF561DF615969BC3007CA5ED /* grabclient-ios.m in Sources */, CE9289D319BD00E300961F22 /* async_netdb.c in Sources */, 55374E321E1582C6005E2362 /* pow2.c in Sources */, + AF59BFAF25A611CD007DA2C2 /* glsl-utils.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -29964,6 +30336,7 @@ buildActionMask = 2147483647; files = ( AF63A80C1AB4EF5D00593C75 /* romanboy.c in Sources */, + AF21B16C2594EE6F00671377 /* glsl-utils.c in Sources */, AF63A7F81AB4EDDB00593C75 /* XScreenSaverSubclass.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -30311,6 +30684,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF81E00525845C2A00CFC475 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AF81E01825845D1600CFC475 /* Randomizer.m in Sources */, + AFAC5F772584666400C0F575 /* yarandom.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF918985158FC00A002B5D1E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -30318,6 +30700,11 @@ AFAA6B451773F07800DE720C /* ios-function-table.m in Sources */, AF918987158FC00A002B5D1E /* main.m in Sources */, AF918986158FC00A002B5D1E /* SaverRunner.m in Sources */, + AF87CEF3258933B7004E9BDF /* XScreenSaverView.m in Sources */, + AF87CEF4258933BF004E9BDF /* XScreenSaverGLView.m in Sources */, + AF87CEF5258933D6004E9BDF /* PrefsReader.m in Sources */, + AF87CEF7258933FA004E9BDF /* XScreenSaverConfigSheet.m in Sources */, + AF87CEF6258933DC004E9BDF /* InvertedSlider.m in Sources */, AF918988158FC00A002B5D1E /* SaverListController.m in Sources */, AF918993158FC2BE002B5D1E /* abstractile.c in Sources */, AF918994158FC2BE002B5D1E /* anemone.c in Sources */, @@ -30473,6 +30860,7 @@ AF9189A7158FC311002B5D1E /* companion_disc.c in Sources */, AF9189A8158FC311002B5D1E /* companion_heart.c in Sources */, AF9189A9158FC311002B5D1E /* companion_quad.c in Sources */, + AF81DFFF2583C15A00CFC475 /* co____9.c in Sources */, AF918A3B158FC3BB002B5D1E /* cow_face.c in Sources */, AF918A3C158FC3BB002B5D1E /* cow_hide.c in Sources */, AF918A3D158FC3BB002B5D1E /* cow_hoofs.c in Sources */, @@ -31293,6 +31681,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + AF88B03B2593A2EF006F9EB1 /* glsl-utils.c in Sources */, AFA55F400993626E00F3E977 /* klein.c in Sources */, AF9CCADA09959DB60075E99B /* XScreenSaverSubclass.m in Sources */, ); @@ -31302,6 +31691,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + AF88B03A2593A2EF006F9EB1 /* glsl-utils.c in Sources */, AFA55F5A099362DF00F3E977 /* hypertorus.c in Sources */, AF9CCADB09959DBB0075E99B /* XScreenSaverSubclass.m in Sources */, ); @@ -32054,6 +32444,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + AF88B03C2593A2EF006F9EB1 /* glsl-utils.c in Sources */, AFFAB31C19158CE40020F021 /* XScreenSaverSubclass.m in Sources */, AFFAB33219158EA80020F021 /* projectiveplane.c in Sources */, ); @@ -33876,6 +34267,16 @@ target = AFA56119099378CB00F3E977 /* molecules.h */; targetProxy = AF7E07FF15925DFE00D81407 /* PBXContainerItemProxy */; }; + AF81E00125845C2A00CFC475 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; + targetProxy = AF81E00225845C2A00CFC475 /* PBXContainerItemProxy */; + }; + AF81E01A25845D3500CFC475 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF81E00025845C2A00CFC475 /* RandomXScreenSaver */; + targetProxy = AF81E01925845D3500CFC475 /* PBXContainerItemProxy */; + }; AF918978158FC00A002B5D1E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; @@ -34708,7 +35109,7 @@ }; AFDA65AA178A54690070D24B /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = AFDA658E178A52B70070D24B /* Unknown Pleasures */; + target = AFDA658E178A52B70070D24B /* UnknownPleasures */; targetProxy = AFDA65A9178A54690070D24B /* PBXContainerItemProxy */; }; AFE2A4570E2E904600ADB298 /* PBXTargetDependency */ = { @@ -34948,14 +35349,12 @@ AF137D420F075C9C004DE3B2 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - PRODUCT_NAME = Obsolete; }; name = Debug; }; AF137D430F075C9C004DE3B2 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - PRODUCT_NAME = Obsolete; }; name = Release; }; @@ -35012,7 +35411,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -35023,7 +35421,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -35034,7 +35431,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -35045,7 +35441,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -35056,7 +35451,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -35067,7 +35461,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -35158,7 +35551,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -35169,7 +35561,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -35180,7 +35571,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = WindupRobot; }; name = Debug; }; @@ -35191,7 +35581,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = WindupRobot; }; name = Release; }; @@ -35222,7 +35611,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -35233,7 +35621,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -35244,7 +35631,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -35255,7 +35641,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -35280,7 +35665,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -35291,7 +35675,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -35874,6 +36257,7 @@ AF4808C3098C3B8B00FB32B8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ""; INSTALL_PATH = /usr/local/lib; PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}"; SKIP_INSTALL = YES; @@ -35884,6 +36268,7 @@ AF4808C4098C3B8B00FB32B8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ""; INSTALL_PATH = /usr/local/lib; PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}"; SKIP_INSTALL = YES; @@ -36166,7 +36551,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -36177,7 +36561,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -36210,7 +36593,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = RomanBoy; }; name = Debug; }; @@ -36221,7 +36603,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = RomanBoy; }; name = Release; }; @@ -36241,7 +36622,6 @@ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO; INFOPLIST_FILE = iSaverRunner.plist; INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)"; PRODUCT_NAME = Apple2; PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; @@ -36265,7 +36645,6 @@ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO; INFOPLIST_FILE = iSaverRunner.plist; INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)"; PRODUCT_NAME = Apple2; PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; @@ -36289,7 +36668,6 @@ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO; INFOPLIST_FILE = iSaverRunner.plist; INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)"; PRODUCT_NAME = Phosphor; PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; @@ -36313,7 +36691,6 @@ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO; INFOPLIST_FILE = iSaverRunner.plist; INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)"; PRODUCT_NAME = Phosphor; PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; @@ -36337,8 +36714,6 @@ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO; INFOPLIST_FILE = iSaverRunner.plist; INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)"; - PRODUCT_NAME = TestX11; PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; WRAPPER_EXTENSION = app; @@ -36361,8 +36736,6 @@ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO; INFOPLIST_FILE = iSaverRunner.plist; INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)"; - PRODUCT_NAME = TestX11; PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; WRAPPER_EXTENSION = app; @@ -36492,7 +36865,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -36503,7 +36875,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -36528,7 +36899,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -36539,21 +36909,18 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; AF73FF341A09877F00E485E9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - PRODUCT_NAME = BinaryRing; }; name = Debug; }; AF73FF351A09877F00E485E9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - PRODUCT_NAME = BinaryRing; }; name = Release; }; @@ -36564,7 +36931,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = Kaleidocycle; }; name = Debug; }; @@ -36575,7 +36941,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = Kaleidocycle; }; name = Release; }; @@ -36874,7 +37239,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = GeodesicGears; }; name = Debug; }; @@ -36885,7 +37249,22 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = GeodesicGears; + }; + name = Release; + }; + AF81E01325845C2A00CFC475 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = Randomizer.plist; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + AF81E01425845C2A00CFC475 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = Randomizer.plist; + PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -36943,7 +37322,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -36954,7 +37332,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -36965,7 +37342,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -36976,7 +37352,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -37190,7 +37565,6 @@ CODE_SIGN_IDENTITY = "Apple Development"; INFOPLIST_FILE = SaverRunner.plist; INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}"; WRAPPER_EXTENSION = app; }; name = Debug; @@ -37201,7 +37575,6 @@ CODE_SIGN_IDENTITY = "Apple Development"; INFOPLIST_FILE = SaverRunner.plist; INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}"; WRAPPER_EXTENSION = app; }; name = Release; @@ -37399,7 +37772,6 @@ buildSettings = { CODE_SIGN_IDENTITY = "Apple Development"; PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}"; - PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Debug; @@ -37409,7 +37781,6 @@ buildSettings = { CODE_SIGN_IDENTITY = "Apple Development"; PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}"; - PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Release; @@ -37421,7 +37792,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -37432,7 +37802,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -37443,7 +37812,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -37454,7 +37822,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -38611,7 +38978,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -38622,7 +38988,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -38647,7 +39012,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -38658,7 +39022,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -38669,7 +39032,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -38680,7 +39042,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -38755,7 +39116,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -38766,7 +39126,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -38799,7 +39158,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = SplitFlap; }; name = Debug; }; @@ -38810,7 +39168,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = SplitFlap; }; name = Release; }; @@ -39259,7 +39616,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = UnknownPleasures; }; name = Debug; }; @@ -39270,7 +39626,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = UnknownPleasures; }; name = Release; }; @@ -39353,7 +39708,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -39364,7 +39718,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -39375,7 +39728,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -39386,7 +39738,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -39397,7 +39748,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -39408,7 +39758,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -39419,7 +39768,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -39430,7 +39778,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -39441,7 +39788,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = QuasiCrystal; }; name = Debug; }; @@ -39452,7 +39798,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = QuasiCrystal; }; name = Release; }; @@ -39463,7 +39808,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = Geodesic; }; name = Debug; }; @@ -39474,7 +39818,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = Geodesic; }; name = Release; }; @@ -39485,7 +39828,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; @@ -39496,7 +39838,6 @@ "USE_GL=1", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); - PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; @@ -39558,7 +39899,6 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD)"; - BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}"; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; @@ -39598,6 +39938,8 @@ "STANDALONE=1", "HAVE_GL=1", "HAVE_GLBINDTEXTURE=1", + "HAVE_GLES3=1", + "HAVE_GLSL=1", "HAVE_UNAME=1", "HAVE_ICMP=1", "HAVE_GETIFADDRS=1", @@ -39648,6 +39990,7 @@ "OTHER_CFLAGS[sdk=macosx*]" = "$(OBJC_GC_CFLAGS)"; OTHER_CODE_SIGN_FLAGS = "--timestamp"; "OTHER_LDFLAGS[sdk=macosx*]" = "-headerpad_max_install_names"; + PRODUCT_BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; SDKROOT = macosx; @@ -39666,7 +40009,6 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD)"; - BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}"; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; @@ -39705,6 +40047,8 @@ "STANDALONE=1", "HAVE_GL=1", "HAVE_GLBINDTEXTURE=1", + "HAVE_GLES3=1", + "HAVE_GLSL=1", "HAVE_UNAME=1", "HAVE_ICMP=1", "HAVE_GETIFADDRS=1", @@ -39755,6 +40099,7 @@ "OTHER_CFLAGS[sdk=macosx*]" = "$(OBJC_GC_CFLAGS)"; OTHER_CODE_SIGN_FLAGS = "--timestamp"; "OTHER_LDFLAGS[sdk=macosx*]" = "-headerpad_max_install_names"; + PRODUCT_BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; SDKROOT = macosx; @@ -40899,6 +41244,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + AF81E01225845C2A00CFC475 /* Build configuration list for PBXNativeTarget "RandomXScreenSaver" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AF81E01325845C2A00CFC475 /* Debug */, + AF81E01425845C2A00CFC475 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; AF91898C158FC00A002B5D1E /* Build configuration list for PBXNativeTarget "XScreenSaver-iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -42177,7 +42531,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - AFDA659E178A52B70070D24B /* Build configuration list for PBXNativeTarget "Unknown Pleasures" */ = { + AFDA659E178A52B70070D24B /* Build configuration list for PBXNativeTarget "UnknownPleasures" */ = { isa = XCConfigurationList; buildConfigurations = ( AFDA659F178A52B70070D24B /* Debug */, diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Abstractile.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Abstractile.xcscheme new file mode 100644 index 00000000..e6194e44 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Abstractile.xcscheme @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers (OpenGL).xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers (OpenGL).xcscheme new file mode 100644 index 00000000..de8d206a --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers (OpenGL).xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers (XLockmore).xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers (XLockmore).xcscheme new file mode 100644 index 00000000..88504548 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers (XLockmore).xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers (XScreenSaver).xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers (XScreenSaver).xcscheme new file mode 100644 index 00000000..f3be5b35 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers (XScreenSaver).xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers.xcscheme new file mode 100644 index 00000000..ae2fe753 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/All Savers.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Anemone.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Anemone.xcscheme new file mode 100644 index 00000000..1ec9a1c6 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Anemone.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Anemotaxis.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Anemotaxis.xcscheme new file mode 100644 index 00000000..757553fe --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Anemotaxis.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Ant.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Ant.xcscheme new file mode 100644 index 00000000..a840122e --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Ant.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/AntInspect.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/AntInspect.xcscheme new file mode 100644 index 00000000..f7247442 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/AntInspect.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/AntMaze.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/AntMaze.xcscheme new file mode 100644 index 00000000..e7cf7bdb --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/AntMaze.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/AntSpotlight.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/AntSpotlight.xcscheme new file mode 100644 index 00000000..89528af7 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/AntSpotlight.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apollonian.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apollonian.xcscheme new file mode 100644 index 00000000..2041a517 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apollonian.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apple2-OSX.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apple2-OSX.xcscheme new file mode 100644 index 00000000..11dab621 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apple2-OSX.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apple2-iOS.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apple2-iOS.xcscheme new file mode 100644 index 00000000..eabf0537 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apple2-iOS.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apple2.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apple2.xcscheme new file mode 100644 index 00000000..1d6b5169 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Apple2.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Atlantis.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Atlantis.xcscheme new file mode 100644 index 00000000..2b39bb2b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Atlantis.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Attraction.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Attraction.xcscheme new file mode 100644 index 00000000..5fdb7ad5 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Attraction.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Atunnel.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Atunnel.xcscheme new file mode 100644 index 00000000..d635dab2 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Atunnel.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BSOD.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BSOD.xcscheme new file mode 100644 index 00000000..cab1f555 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BSOD.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Barcode.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Barcode.xcscheme new file mode 100644 index 00000000..086faa44 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Barcode.xcscheme @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Beats.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Beats.xcscheme new file mode 100644 index 00000000..89438664 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Beats.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BinaryRing.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BinaryRing.xcscheme new file mode 100644 index 00000000..125059fe --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BinaryRing.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Blaster.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Blaster.xcscheme new file mode 100644 index 00000000..e0b400a8 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Blaster.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BlinkBox.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BlinkBox.xcscheme new file mode 100644 index 00000000..a93b04ca --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BlinkBox.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BlitSpin.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BlitSpin.xcscheme new file mode 100644 index 00000000..58b76880 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BlitSpin.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BlockTube.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BlockTube.xcscheme new file mode 100644 index 00000000..55160c26 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BlockTube.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Boing.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Boing.xcscheme new file mode 100644 index 00000000..88c335eb --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Boing.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bouboule.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bouboule.xcscheme new file mode 100644 index 00000000..838f2c2c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bouboule.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BouncingCow.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BouncingCow.xcscheme new file mode 100644 index 00000000..520ab38f --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BouncingCow.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BoxFit.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BoxFit.xcscheme new file mode 100644 index 00000000..bc396f33 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/BoxFit.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Boxed.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Boxed.xcscheme new file mode 100644 index 00000000..7bc1c69b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Boxed.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Braid.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Braid.xcscheme new file mode 100644 index 00000000..0638a7ab --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Braid.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bubble3D.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bubble3D.xcscheme new file mode 100644 index 00000000..438b9564 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bubble3D.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bubbles.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bubbles.xcscheme new file mode 100644 index 00000000..6f12a735 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bubbles.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bumps.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bumps.xcscheme new file mode 100644 index 00000000..d95c1ec9 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Bumps.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CCurve.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CCurve.xcscheme new file mode 100644 index 00000000..169d91a9 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CCurve.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/COVID19.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/COVID19.xcscheme new file mode 100644 index 00000000..0eab606c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/COVID19.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CWaves.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CWaves.xcscheme new file mode 100644 index 00000000..a962a3e6 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CWaves.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cage.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cage.xcscheme new file mode 100644 index 00000000..8dcd5d51 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cage.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Carousel.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Carousel.xcscheme new file mode 100644 index 00000000..8091949a --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Carousel.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Celtic.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Celtic.xcscheme new file mode 100644 index 00000000..a967dd69 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Celtic.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Circuit.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Circuit.xcscheme new file mode 100644 index 00000000..ed7fde14 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Circuit.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cityflow.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cityflow.xcscheme new file mode 100644 index 00000000..73d344fb --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cityflow.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CloudLife.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CloudLife.xcscheme new file mode 100644 index 00000000..1e7a9c1d --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CloudLife.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CompanionCube.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CompanionCube.xcscheme new file mode 100644 index 00000000..b755acb3 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CompanionCube.xcscheme @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Compass.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Compass.xcscheme new file mode 100644 index 00000000..ceb92dd4 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Compass.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Coral.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Coral.xcscheme new file mode 100644 index 00000000..e8392f6a --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Coral.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Crackberg.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Crackberg.xcscheme new file mode 100644 index 00000000..793df6f6 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Crackberg.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Critical.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Critical.xcscheme new file mode 100644 index 00000000..3b913192 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Critical.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Crumbler.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Crumbler.xcscheme new file mode 100644 index 00000000..bb648f08 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Crumbler.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Crystal.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Crystal.xcscheme new file mode 100644 index 00000000..764327d5 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Crystal.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cube21.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cube21.xcscheme new file mode 100644 index 00000000..569a3b34 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cube21.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubeStack.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubeStack.xcscheme new file mode 100644 index 00000000..1adc913a --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubeStack.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubeStorm.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubeStorm.xcscheme new file mode 100644 index 00000000..7402d9e3 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubeStorm.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubeTwist.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubeTwist.xcscheme new file mode 100644 index 00000000..e8b9b0b1 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubeTwist.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cubenetic.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cubenetic.xcscheme new file mode 100644 index 00000000..537182ee --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cubenetic.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubicGrid.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubicGrid.xcscheme new file mode 100644 index 00000000..9f4312d8 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/CubicGrid.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cynosure.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cynosure.xcscheme new file mode 100644 index 00000000..90102121 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Cynosure.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DNAlogo.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DNAlogo.xcscheme new file mode 100644 index 00000000..5a8a2584 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DNAlogo.xcscheme @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DangerBall.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DangerBall.xcscheme new file mode 100644 index 00000000..84e382b9 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DangerBall.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DecayScreen.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DecayScreen.xcscheme new file mode 100644 index 00000000..6eaf3ff9 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DecayScreen.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Deco.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Deco.xcscheme new file mode 100644 index 00000000..73e315e3 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Deco.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DeepStars.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DeepStars.xcscheme new file mode 100644 index 00000000..5165f9da --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DeepStars.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Deluxe.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Deluxe.xcscheme new file mode 100644 index 00000000..514c0647 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Deluxe.xcscheme @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Demon.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Demon.xcscheme new file mode 100644 index 00000000..4210ca30 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Demon.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Discoball.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Discoball.xcscheme new file mode 100644 index 00000000..c4a16f8c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Discoball.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Discrete.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Discrete.xcscheme new file mode 100644 index 00000000..8e82b068 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Discrete.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Distort.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Distort.xcscheme new file mode 100644 index 00000000..a0982316 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Distort.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Drift.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Drift.xcscheme new file mode 100644 index 00000000..d07a828a --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Drift.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DymaxionMap.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DymaxionMap.xcscheme new file mode 100644 index 00000000..35c31a9a --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/DymaxionMap.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Endgame.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Endgame.xcscheme new file mode 100644 index 00000000..d2c94171 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Endgame.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/EnergyStream.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/EnergyStream.xcscheme new file mode 100644 index 00000000..2f2b8932 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/EnergyStream.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Engine.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Engine.xcscheme new file mode 100644 index 00000000..ab23edb5 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Engine.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Epicycle.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Epicycle.xcscheme new file mode 100644 index 00000000..3ddb79ab --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Epicycle.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Eruption.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Eruption.xcscheme new file mode 100644 index 00000000..60feddf7 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Eruption.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Esper.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Esper.xcscheme new file mode 100644 index 00000000..172518b0 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Esper.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/EtruscanVenus.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/EtruscanVenus.xcscheme new file mode 100644 index 00000000..0bb550b6 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/EtruscanVenus.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Euler2D.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Euler2D.xcscheme new file mode 100644 index 00000000..66945d94 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Euler2D.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Extrusion.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Extrusion.xcscheme new file mode 100644 index 00000000..3877559f --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Extrusion.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FadePlot.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FadePlot.xcscheme new file mode 100644 index 00000000..a0d3895d --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FadePlot.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Fiberlamp.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Fiberlamp.xcscheme new file mode 100644 index 00000000..60b75009 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Fiberlamp.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FilmLeader.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FilmLeader.xcscheme new file mode 100644 index 00000000..42cc58a9 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FilmLeader.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Fireworkx.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Fireworkx.xcscheme new file mode 100644 index 00000000..af5a51cc --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Fireworkx.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Flag.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Flag.xcscheme new file mode 100644 index 00000000..79cd520e --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Flag.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Flame.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Flame.xcscheme new file mode 100644 index 00000000..5de2437a --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Flame.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlipFlop.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlipFlop.xcscheme new file mode 100644 index 00000000..937224e8 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlipFlop.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlipScreen3D.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlipScreen3D.xcscheme new file mode 100644 index 00000000..ff36f3e4 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlipScreen3D.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlipText.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlipText.xcscheme new file mode 100644 index 00000000..a3472490 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlipText.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Flow.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Flow.xcscheme new file mode 100644 index 00000000..eb2cab67 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Flow.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FluidBalls.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FluidBalls.xcscheme new file mode 100644 index 00000000..f0c9c2e8 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FluidBalls.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlyingToasters.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlyingToasters.xcscheme new file mode 100644 index 00000000..2d46b3e4 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FlyingToasters.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FontGlide.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FontGlide.xcscheme new file mode 100644 index 00000000..846d5d83 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FontGlide.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Forest.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Forest.xcscheme new file mode 100644 index 00000000..7db49a34 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Forest.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FuzzyFlakes.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FuzzyFlakes.xcscheme new file mode 100644 index 00000000..199a8930 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/FuzzyFlakes.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GFlux.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GFlux.xcscheme new file mode 100644 index 00000000..26a3c88a --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GFlux.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLBlur.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLBlur.xcscheme new file mode 100644 index 00000000..1fbb3952 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLBlur.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLCells.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLCells.xcscheme new file mode 100644 index 00000000..f6ea23b8 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLCells.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLForestFire.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLForestFire.xcscheme new file mode 100644 index 00000000..669a7b27 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLForestFire.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLHanoi.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLHanoi.xcscheme new file mode 100644 index 00000000..582977c1 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLHanoi.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLKnots.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLKnots.xcscheme new file mode 100644 index 00000000..13a4be07 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLKnots.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLMatrix.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLMatrix.xcscheme new file mode 100644 index 00000000..9fd7da04 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLMatrix.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLPlanet.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLPlanet.xcscheme new file mode 100644 index 00000000..f9beeb91 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLPlanet.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLSchool.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLSchool.xcscheme new file mode 100644 index 00000000..abf33685 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLSchool.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLSlideshow.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLSlideshow.xcscheme new file mode 100644 index 00000000..d1a423ed --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLSlideshow.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLSnake.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLSnake.xcscheme new file mode 100644 index 00000000..7d30f3b5 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLSnake.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLText.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLText.xcscheme new file mode 100644 index 00000000..3f224943 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GLText.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Galaxy.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Galaxy.xcscheme new file mode 100644 index 00000000..1a71b6e5 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Galaxy.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Gears.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Gears.xcscheme new file mode 100644 index 00000000..64b9daa6 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Gears.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Geodesic.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Geodesic.xcscheme new file mode 100644 index 00000000..a863da65 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Geodesic.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GeodesicGears.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GeodesicGears.xcscheme new file mode 100644 index 00000000..aaf46529 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GeodesicGears.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Gibson.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Gibson.xcscheme new file mode 100644 index 00000000..2c134833 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Gibson.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Gleidescope.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Gleidescope.xcscheme new file mode 100644 index 00000000..1cf71711 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Gleidescope.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GlitchPEG.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GlitchPEG.xcscheme new file mode 100644 index 00000000..f763228b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GlitchPEG.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Goop.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Goop.xcscheme new file mode 100644 index 00000000..070a7d50 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Goop.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Grav.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Grav.xcscheme new file mode 100644 index 00000000..b9f57c0b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Grav.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GravityWell.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GravityWell.xcscheme new file mode 100644 index 00000000..c044fb5c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/GravityWell.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Greynetic.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Greynetic.xcscheme new file mode 100644 index 00000000..016124e0 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Greynetic.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Halftone.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Halftone.xcscheme new file mode 100644 index 00000000..b288c77e --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Halftone.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Halo.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Halo.xcscheme new file mode 100644 index 00000000..dffe3d53 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Halo.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Handsy.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Handsy.xcscheme new file mode 100644 index 00000000..21fe106e --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Handsy.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Headroom.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Headroom.xcscheme new file mode 100644 index 00000000..b11f8228 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Headroom.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Helix.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Helix.xcscheme new file mode 100644 index 00000000..2d4e45ad --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Helix.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hexadrop.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hexadrop.xcscheme new file mode 100644 index 00000000..d27daa31 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hexadrop.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hexstrut.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hexstrut.xcscheme new file mode 100644 index 00000000..d5aa6f52 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hexstrut.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hilbert.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hilbert.xcscheme new file mode 100644 index 00000000..32704238 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hilbert.xcscheme @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hopalong.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hopalong.xcscheme new file mode 100644 index 00000000..2789c4b7 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hopalong.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hydrostat.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hydrostat.xcscheme new file mode 100644 index 00000000..ca67bd8c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hydrostat.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/HyperBall.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/HyperBall.xcscheme new file mode 100644 index 00000000..7c5ecbdf --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/HyperBall.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/HyperCube.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/HyperCube.xcscheme new file mode 100644 index 00000000..0a39373f --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/HyperCube.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hypertorus.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hypertorus.xcscheme new file mode 100644 index 00000000..ba875f01 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hypertorus.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hypnowheel.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hypnowheel.xcscheme new file mode 100644 index 00000000..d3ce61f9 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hypnowheel.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/IFS.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/IFS.xcscheme new file mode 100644 index 00000000..459259b9 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/IFS.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/IMSMap.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/IMSMap.xcscheme new file mode 100644 index 00000000..078809b7 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/IMSMap.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Interaggregate.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Interaggregate.xcscheme new file mode 100644 index 00000000..7bcc22f9 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Interaggregate.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Interference.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Interference.xcscheme new file mode 100644 index 00000000..8667cdd0 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Interference.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Intermomentary.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Intermomentary.xcscheme new file mode 100644 index 00000000..df9ac547 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Intermomentary.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/JigglyPuff.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/JigglyPuff.xcscheme new file mode 100644 index 00000000..e8237c68 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/JigglyPuff.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Jigsaw.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Jigsaw.xcscheme new file mode 100644 index 00000000..f58c42b8 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Jigsaw.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Juggle.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Juggle.xcscheme new file mode 100644 index 00000000..0b0abe7d --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Juggle.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Juggler3D.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Juggler3D.xcscheme new file mode 100644 index 00000000..fb6ed1df --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Juggler3D.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Julia.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Julia.xcscheme new file mode 100644 index 00000000..624658cd --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Julia.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Kaleidescope.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Kaleidescope.xcscheme new file mode 100644 index 00000000..6fc4c835 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Kaleidescope.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Kaleidocycle.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Kaleidocycle.xcscheme new file mode 100644 index 00000000..89dbff47 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Kaleidocycle.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Klein.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Klein.xcscheme new file mode 100644 index 00000000..fc1aa3f5 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Klein.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Kumppa.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Kumppa.xcscheme new file mode 100644 index 00000000..8a730ea2 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Kumppa.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/LCDscrub.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/LCDscrub.xcscheme new file mode 100644 index 00000000..4a11584f --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/LCDscrub.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/LMorph.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/LMorph.xcscheme new file mode 100644 index 00000000..2b4ab90c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/LMorph.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lament.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lament.xcscheme new file mode 100644 index 00000000..e83ce63b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lament.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Laser.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Laser.xcscheme new file mode 100644 index 00000000..21802c44 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Laser.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lavalite.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lavalite.xcscheme new file mode 100644 index 00000000..96c87b0d --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lavalite.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lightning.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lightning.xcscheme new file mode 100644 index 00000000..0ee925a2 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lightning.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lisa.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lisa.xcscheme new file mode 100644 index 00000000..4cd4f436 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lisa.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lissie.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lissie.xcscheme new file mode 100644 index 00000000..001a766f --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lissie.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lockward.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lockward.xcscheme new file mode 100644 index 00000000..9d312ad5 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Lockward.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Loop.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Loop.xcscheme new file mode 100644 index 00000000..aa70ac52 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Loop.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Maze.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Maze.xcscheme new file mode 100644 index 00000000..dc1e1e6c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Maze.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Maze3D.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Maze3D.xcscheme new file mode 100644 index 00000000..515a447b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Maze3D.xcscheme @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MemScroller.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MemScroller.xcscheme new file mode 100644 index 00000000..46798947 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MemScroller.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Menger.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Menger.xcscheme new file mode 100644 index 00000000..bab252d0 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Menger.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MetaBalls.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MetaBalls.xcscheme new file mode 100644 index 00000000..a274ac02 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MetaBalls.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MirrorBlob.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MirrorBlob.xcscheme new file mode 100644 index 00000000..f964e1cd --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MirrorBlob.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Moebius.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Moebius.xcscheme new file mode 100644 index 00000000..24153f3c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Moebius.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MoebiusGears.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MoebiusGears.xcscheme new file mode 100644 index 00000000..eee3e986 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/MoebiusGears.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Moire.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Moire.xcscheme new file mode 100644 index 00000000..5328ee0f --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Moire.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Moire2.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Moire2.xcscheme new file mode 100644 index 00000000..f0e070a1 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Moire2.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Molecule.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Molecule.xcscheme new file mode 100644 index 00000000..4614a77c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Molecule.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Morph3D.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Morph3D.xcscheme new file mode 100644 index 00000000..5c6a9205 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Morph3D.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Mountain.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Mountain.xcscheme new file mode 100644 index 00000000..df77db12 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Mountain.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Munch.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Munch.xcscheme new file mode 100644 index 00000000..f97a3ceb --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Munch.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/NerveRot.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/NerveRot.xcscheme new file mode 100644 index 00000000..e8540040 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/NerveRot.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Noof.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Noof.xcscheme new file mode 100644 index 00000000..c6f0b059 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Noof.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/NoseGuy.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/NoseGuy.xcscheme new file mode 100644 index 00000000..ea920c5c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/NoseGuy.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Obsolete.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Obsolete.xcscheme new file mode 100644 index 00000000..67265a5a --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Obsolete.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pacman.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pacman.xcscheme new file mode 100644 index 00000000..5c53f670 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pacman.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pedal.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pedal.xcscheme new file mode 100644 index 00000000..ff95f5a2 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pedal.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Peepers.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Peepers.xcscheme new file mode 100644 index 00000000..ecbf1274 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Peepers.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Penetrate.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Penetrate.xcscheme new file mode 100644 index 00000000..a47c1f15 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Penetrate.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Penrose.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Penrose.xcscheme new file mode 100644 index 00000000..c9e8d6e4 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Penrose.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Petri.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Petri.xcscheme new file mode 100644 index 00000000..fb49dd67 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Petri.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Phosphor-OSX.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Phosphor-OSX.xcscheme new file mode 100644 index 00000000..6442518b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Phosphor-OSX.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Phosphor-iOS.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Phosphor-iOS.xcscheme new file mode 100644 index 00000000..e3260c43 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Phosphor-iOS.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Phosphor.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Phosphor.xcscheme new file mode 100644 index 00000000..7617d53f --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Phosphor.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Photopile.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Photopile.xcscheme new file mode 100644 index 00000000..58833914 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Photopile.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Piecewise.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Piecewise.xcscheme new file mode 100644 index 00000000..8e0ab697 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Piecewise.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pinion.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pinion.xcscheme new file mode 100644 index 00000000..e82d7396 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pinion.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pipes.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pipes.xcscheme new file mode 100644 index 00000000..7cd689b8 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pipes.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Polyhedra.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Polyhedra.xcscheme new file mode 100644 index 00000000..617f8cac --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Polyhedra.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Polyominoes.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Polyominoes.xcscheme new file mode 100644 index 00000000..a0ae5f69 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Polyominoes.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Polytopes.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Polytopes.xcscheme new file mode 100644 index 00000000..c573edae --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Polytopes.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pong.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pong.xcscheme new file mode 100644 index 00000000..b0cda5c0 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pong.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/PopSquares.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/PopSquares.xcscheme new file mode 100644 index 00000000..cf034234 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/PopSquares.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/ProjectivePlane.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/ProjectivePlane.xcscheme new file mode 100644 index 00000000..5ccafc83 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/ProjectivePlane.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Providence.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Providence.xcscheme new file mode 100644 index 00000000..5eddc81e --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Providence.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pulsar.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pulsar.xcscheme new file mode 100644 index 00000000..6fa92900 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pulsar.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pyro.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pyro.xcscheme new file mode 100644 index 00000000..816f0b3a --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Pyro.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Qix.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Qix.xcscheme new file mode 100644 index 00000000..f4111416 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Qix.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/QuasiCrystal.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/QuasiCrystal.xcscheme new file mode 100644 index 00000000..5f77051e --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/QuasiCrystal.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Queens.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Queens.xcscheme new file mode 100644 index 00000000..8779974c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Queens.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RDbomb.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RDbomb.xcscheme new file mode 100644 index 00000000..473357b9 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RDbomb.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RandomXScreenSaver.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RandomXScreenSaver.xcscheme new file mode 100644 index 00000000..f2c8dcb7 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RandomXScreenSaver.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RaverHoop.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RaverHoop.xcscheme new file mode 100644 index 00000000..465640d0 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RaverHoop.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RazzleDazzle.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RazzleDazzle.xcscheme new file mode 100644 index 00000000..c209a298 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RazzleDazzle.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Ripples.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Ripples.xcscheme new file mode 100644 index 00000000..0d166b06 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Ripples.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rocks.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rocks.xcscheme new file mode 100644 index 00000000..910614f0 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rocks.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RomanBoy.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RomanBoy.xcscheme new file mode 100644 index 00000000..57f547b6 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RomanBoy.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rorschach.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rorschach.xcscheme new file mode 100644 index 00000000..1fdd7d65 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rorschach.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RotZoomer.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RotZoomer.xcscheme new file mode 100644 index 00000000..4c1d14f3 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RotZoomer.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rotor.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rotor.xcscheme new file mode 100644 index 00000000..437b53ad --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rotor.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rubik.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rubik.xcscheme new file mode 100644 index 00000000..88575c07 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Rubik.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RubikBlocks.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RubikBlocks.xcscheme new file mode 100644 index 00000000..99ff6f77 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/RubikBlocks.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SBalls.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SBalls.xcscheme new file mode 100644 index 00000000..a7e3dbb1 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SBalls.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SaverTester.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SaverTester.xcscheme new file mode 100644 index 00000000..0a08f477 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SaverTester.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Scooter.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Scooter.xcscheme new file mode 100644 index 00000000..d14ad737 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Scooter.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/ShadeBobs.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/ShadeBobs.xcscheme new file mode 100644 index 00000000..afdc1c7e --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/ShadeBobs.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sierpinski.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sierpinski.xcscheme new file mode 100644 index 00000000..89d5771b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sierpinski.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sierpinski3D.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sierpinski3D.xcscheme new file mode 100644 index 00000000..97297e69 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sierpinski3D.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SkyTentacles.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SkyTentacles.xcscheme new file mode 100644 index 00000000..003f48f6 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SkyTentacles.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SlideScreen.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SlideScreen.xcscheme new file mode 100644 index 00000000..76e74d56 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SlideScreen.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Slip.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Slip.xcscheme new file mode 100644 index 00000000..fa3de301 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Slip.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sonar.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sonar.xcscheme new file mode 100644 index 00000000..130d85c7 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sonar.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SpeedMine.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SpeedMine.xcscheme new file mode 100644 index 00000000..24e6851f --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SpeedMine.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sphere.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sphere.xcscheme new file mode 100644 index 00000000..15d48ffe --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sphere.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SphereEversion.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SphereEversion.xcscheme new file mode 100644 index 00000000..3c1fec14 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SphereEversion.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Spheremonics.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Spheremonics.xcscheme new file mode 100644 index 00000000..51425f47 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Spheremonics.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Spiral.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Spiral.xcscheme new file mode 100644 index 00000000..5bdba88f --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Spiral.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SplitFlap.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SplitFlap.xcscheme new file mode 100644 index 00000000..a36e6ce4 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/SplitFlap.xcscheme @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Splodesic.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Splodesic.xcscheme new file mode 100644 index 00000000..720f5189 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Splodesic.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Spotlight.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Spotlight.xcscheme new file mode 100644 index 00000000..4ed48506 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Spotlight.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sproingies.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sproingies.xcscheme new file mode 100644 index 00000000..ffc7ae2b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Sproingies.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Squiral.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Squiral.xcscheme new file mode 100644 index 00000000..03161b24 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Squiral.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Stairs.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Stairs.xcscheme new file mode 100644 index 00000000..73efc606 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Stairs.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/StarWars.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/StarWars.xcscheme new file mode 100644 index 00000000..e46664e5 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/StarWars.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Starfish.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Starfish.xcscheme new file mode 100644 index 00000000..d325f57b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Starfish.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/StonerView.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/StonerView.xcscheme new file mode 100644 index 00000000..d4054f9c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/StonerView.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Strange.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Strange.xcscheme new file mode 100644 index 00000000..5e9ac76d --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Strange.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Substrate.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Substrate.xcscheme new file mode 100644 index 00000000..c4eb3408 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Substrate.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Superquadrics.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Superquadrics.xcscheme new file mode 100644 index 00000000..050b30ea --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Superquadrics.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Surfaces.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Surfaces.xcscheme new file mode 100644 index 00000000..a6ea79ba --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Surfaces.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Swirl.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Swirl.xcscheme new file mode 100644 index 00000000..7c8875cb --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Swirl.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/T3D.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/T3D.xcscheme new file mode 100644 index 00000000..a65bcda9 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/T3D.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Tangram.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Tangram.xcscheme new file mode 100644 index 00000000..04e38376 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Tangram.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Tessellimage.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Tessellimage.xcscheme new file mode 100644 index 00000000..71a164ee --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Tessellimage.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TestX11-iOS.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TestX11-iOS.xcscheme new file mode 100644 index 00000000..a6d5e273 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TestX11-iOS.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TestX11.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TestX11.xcscheme new file mode 100644 index 00000000..4f1ae56b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TestX11.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Thornbird.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Thornbird.xcscheme new file mode 100644 index 00000000..a8341fcd --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Thornbird.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TimeTunnel.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TimeTunnel.xcscheme new file mode 100644 index 00000000..8624aa97 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TimeTunnel.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TopBlock.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TopBlock.xcscheme new file mode 100644 index 00000000..92877d08 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TopBlock.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Triangle.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Triangle.xcscheme new file mode 100644 index 00000000..d49e62dd --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Triangle.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TronBit.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TronBit.xcscheme new file mode 100644 index 00000000..1ab4559e --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/TronBit.xcscheme @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Truchet.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Truchet.xcscheme new file mode 100644 index 00000000..0b33a059 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Truchet.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Twang.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Twang.xcscheme new file mode 100644 index 00000000..b24e45c5 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Twang.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Unicrud.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Unicrud.xcscheme new file mode 100644 index 00000000..436c818a --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Unicrud.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/UnknownPleasures.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/UnknownPleasures.xcscheme new file mode 100644 index 00000000..77a37341 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/UnknownPleasures.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/VFeedback.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/VFeedback.xcscheme new file mode 100644 index 00000000..c7bc389c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/VFeedback.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Vermiculate.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Vermiculate.xcscheme new file mode 100644 index 00000000..e6b9b7fd --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Vermiculate.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Vigilance.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Vigilance.xcscheme new file mode 100644 index 00000000..88dba388 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Vigilance.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Vines.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Vines.xcscheme new file mode 100644 index 00000000..20e0849b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Vines.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Voronoi.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Voronoi.xcscheme new file mode 100644 index 00000000..9461d955 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Voronoi.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Wander.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Wander.xcscheme new file mode 100644 index 00000000..cfb23746 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Wander.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/WebCollage.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/WebCollage.xcscheme new file mode 100644 index 00000000..719b1c81 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/WebCollage.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/WhirlWindWarp.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/WhirlWindWarp.xcscheme new file mode 100644 index 00000000..4952dc9b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/WhirlWindWarp.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Whirlygig.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Whirlygig.xcscheme new file mode 100644 index 00000000..6cfa7f39 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Whirlygig.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/WindupRobot.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/WindupRobot.xcscheme new file mode 100644 index 00000000..7c16c24c --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/WindupRobot.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Worm.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Worm.xcscheme new file mode 100644 index 00000000..c6279c9b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Worm.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Wormhole.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Wormhole.xcscheme new file mode 100644 index 00000000..df4ded41 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Wormhole.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XAnalogTV.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XAnalogTV.xcscheme new file mode 100644 index 00000000..459706f3 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XAnalogTV.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XFlame.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XFlame.xcscheme new file mode 100644 index 00000000..0246da0b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XFlame.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XJack.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XJack.xcscheme new file mode 100644 index 00000000..7700f380 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XJack.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XLyap.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XLyap.xcscheme new file mode 100644 index 00000000..01b1c118 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XLyap.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XMatrix.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XMatrix.xcscheme new file mode 100644 index 00000000..4e69756f --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XMatrix.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XRaySwarm.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XRaySwarm.xcscheme new file mode 100644 index 00000000..5d305c84 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XRaySwarm.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XScreenSaver-iOS.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XScreenSaver-iOS.xcscheme new file mode 100644 index 00000000..572d38bd --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XScreenSaver-iOS.xcscheme @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XScreenSaverUpdater.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XScreenSaverUpdater.xcscheme new file mode 100644 index 00000000..d1f2016b --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XScreenSaverUpdater.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XSpirograph.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XSpirograph.xcscheme new file mode 100644 index 00000000..b2d59374 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/XSpirograph.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Zoom.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Zoom.xcscheme new file mode 100644 index 00000000..ea4f3110 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Zoom.xcscheme @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/enable_gc.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/enable_gc.xcscheme new file mode 100644 index 00000000..19341f6d --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/enable_gc.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/images_png_h.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/images_png_h.xcscheme new file mode 100644 index 00000000..7c1b26a3 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/images_png_h.xcscheme @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/jwxyz.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/jwxyz.xcscheme new file mode 100644 index 00000000..33e82596 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/jwxyz.xcscheme @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/m6502.h.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/m6502.h.xcscheme new file mode 100644 index 00000000..3df5b2a4 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/m6502.h.xcscheme @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/m6502.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/m6502.xcscheme new file mode 100644 index 00000000..888f3434 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/m6502.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/molecules.h.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/molecules.h.xcscheme new file mode 100644 index 00000000..60771f8d --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/molecules.h.xcscheme @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..f4201d17 --- /dev/null +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist @@ -0,0 +1,2862 @@ + + + + + SchemeUserState + + Abstractile.xcscheme + + orderHint + 6 + + All Savers (OpenGL).xcscheme + + orderHint + 3 + + All Savers (XLockmore).xcscheme + + orderHint + 2 + + All Savers (XScreenSaver).xcscheme + + orderHint + 1 + + All Savers.xcscheme + + orderHint + 0 + + Anemone.xcscheme + + orderHint + 7 + + Anemotaxis.xcscheme + + orderHint + 8 + + Ant.xcscheme + + orderHint + 9 + + AntInspect.xcscheme + + orderHint + 10 + + AntMaze.xcscheme + + orderHint + 11 + + AntSpotlight.xcscheme + + orderHint + 12 + + Apollonian.xcscheme + + orderHint + 13 + + Apple2-OSX.xcscheme + + orderHint + 16 + + Apple2-iOS.xcscheme + + orderHint + 15 + + Apple2.xcscheme + + orderHint + 14 + + Atlantis.xcscheme + + orderHint + 17 + + Attraction.xcscheme + + orderHint + 18 + + Atunnel.xcscheme + + orderHint + 19 + + BSOD.xcscheme + + orderHint + 33 + + Barcode.xcscheme + + orderHint + 20 + + Beats.xcscheme_^#shared#^_ + + orderHint + 21 + + BinaryRing.xcscheme + + orderHint + 22 + + Blaster.xcscheme + + orderHint + 23 + + BlinkBox.xcscheme + + orderHint + 24 + + BlitSpin.xcscheme + + orderHint + 25 + + BlockTube.xcscheme + + orderHint + 26 + + Boing.xcscheme + + orderHint + 27 + + Bouboule.xcscheme + + orderHint + 28 + + BouncingCow.xcscheme + + orderHint + 29 + + BoxFit.xcscheme + + orderHint + 31 + + Boxed.xcscheme + + orderHint + 30 + + Braid.xcscheme + + orderHint + 32 + + Bubble3D.xcscheme + + orderHint + 34 + + Bubbles.xcscheme + + orderHint + 35 + + Bumps.xcscheme + + orderHint + 36 + + CCurve.xcscheme + + orderHint + 39 + + COVID19.xcscheme_^#shared#^_ + + orderHint + 47 + + CWaves.xcscheme + + orderHint + 58 + + Cage.xcscheme + + orderHint + 37 + + Carousel.xcscheme + + orderHint + 38 + + Celtic.xcscheme + + orderHint + 40 + + Circuit.xcscheme + + orderHint + 41 + + Cityflow.xcscheme + + orderHint + 42 + + CloudLife.xcscheme + + orderHint + 43 + + CompanionCube.xcscheme + + orderHint + 44 + + Compass.xcscheme + + orderHint + 45 + + Coral.xcscheme + + orderHint + 46 + + Crackberg.xcscheme + + orderHint + 48 + + Critical.xcscheme + + orderHint + 50 + + Crumbler.xcscheme + + orderHint + 49 + + Crystal.xcscheme + + orderHint + 51 + + Cube21.xcscheme + + orderHint + 52 + + CubeStack.xcscheme + + orderHint + 54 + + CubeStorm.xcscheme + + orderHint + 55 + + CubeTwist.xcscheme + + orderHint + 56 + + Cubenetic.xcscheme + + orderHint + 53 + + CubicGrid.xcscheme + + orderHint + 57 + + Cynosure.xcscheme + + orderHint + 59 + + DNAlogo.xcscheme + + orderHint + 69 + + DangerBall.xcscheme + + orderHint + 60 + + DecayScreen.xcscheme + + orderHint + 61 + + Deco.xcscheme + + orderHint + 62 + + DeepStars.xcscheme_^#shared#^_ + + orderHint + 63 + + Deluxe.xcscheme + + orderHint + 64 + + Demon.xcscheme + + orderHint + 65 + + Discoball.xcscheme + + orderHint + 66 + + Discrete.xcscheme + + orderHint + 67 + + Distort.xcscheme + + orderHint + 68 + + Drift.xcscheme + + orderHint + 70 + + DymaxionMap.xcscheme + + orderHint + 71 + + Endgame.xcscheme + + orderHint + 72 + + EnergyStream.xcscheme + + orderHint + 73 + + Engine.xcscheme + + orderHint + 74 + + Epicycle.xcscheme + + orderHint + 75 + + Eruption.xcscheme + + orderHint + 76 + + Esper.xcscheme + + orderHint + 77 + + EtruscanVenus.xcscheme_^#shared#^_ + + orderHint + 78 + + Euler2D.xcscheme + + orderHint + 79 + + Extrusion.xcscheme + + orderHint + 80 + + FadePlot.xcscheme + + orderHint + 81 + + Fiberlamp.xcscheme + + orderHint + 82 + + FilmLeader.xcscheme + + orderHint + 83 + + Fireworkx.xcscheme + + orderHint + 84 + + Flag.xcscheme + + orderHint + 85 + + Flame.xcscheme + + orderHint + 86 + + FlipFlop.xcscheme + + orderHint + 87 + + FlipScreen3D.xcscheme + + orderHint + 88 + + FlipText.xcscheme + + orderHint + 89 + + Flow.xcscheme + + orderHint + 90 + + FluidBalls.xcscheme + + orderHint + 91 + + FlyingToasters.xcscheme + + orderHint + 92 + + FontGlide.xcscheme + + orderHint + 93 + + Forest.xcscheme + + orderHint + 94 + + FuzzyFlakes.xcscheme + + orderHint + 95 + + GFlux.xcscheme + + orderHint + 100 + + GLBlur.xcscheme + + orderHint + 102 + + GLCells.xcscheme + + orderHint + 103 + + GLForestFire.xcscheme + + orderHint + 105 + + GLHanoi.xcscheme + + orderHint + 106 + + GLKnots.xcscheme + + orderHint + 108 + + GLMatrix.xcscheme + + orderHint + 109 + + GLPlanet.xcscheme + + orderHint + 110 + + GLSchool.xcscheme + + orderHint + 111 + + GLSlideshow.xcscheme + + orderHint + 112 + + GLSnake.xcscheme + + orderHint + 113 + + GLText.xcscheme + + orderHint + 114 + + Galaxy.xcscheme + + orderHint + 96 + + Gears.xcscheme + + orderHint + 97 + + Geodesic.xcscheme + + orderHint + 98 + + GeodesicGears.xcscheme + + orderHint + 99 + + Gibson.xcscheme_^#shared#^_ + + orderHint + 101 + + Gleidescope.xcscheme + + orderHint + 104 + + GlitchPEG.xcscheme + + orderHint + 107 + + Goop.xcscheme + + orderHint + 115 + + Grav.xcscheme + + orderHint + 116 + + GravityWell.xcscheme_^#shared#^_ + + orderHint + 117 + + Greynetic.xcscheme + + orderHint + 118 + + Halftone.xcscheme + + orderHint + 119 + + Halo.xcscheme + + orderHint + 120 + + Handsy.xcscheme + + orderHint + 121 + + Headroom.xcscheme_^#shared#^_ + + orderHint + 122 + + Helix.xcscheme + + orderHint + 123 + + Hexadrop.xcscheme + + orderHint + 124 + + Hexstrut.xcscheme + + orderHint + 125 + + Hilbert.xcscheme + + orderHint + 126 + + Hopalong.xcscheme + + orderHint + 127 + + Hydrostat.xcscheme + + orderHint + 128 + + HyperBall.xcscheme + + orderHint + 129 + + HyperCube.xcscheme + + orderHint + 130 + + Hypertorus.xcscheme + + orderHint + 131 + + Hypnowheel.xcscheme + + orderHint + 132 + + IFS.xcscheme + + orderHint + 133 + + IMSMap.xcscheme + + orderHint + 134 + + Interaggregate.xcscheme + + orderHint + 135 + + Interference.xcscheme + + orderHint + 136 + + Intermomentary.xcscheme + + orderHint + 137 + + JigglyPuff.xcscheme + + orderHint + 138 + + Jigsaw.xcscheme + + orderHint + 139 + + Juggle.xcscheme + + orderHint + 140 + + Juggler3D.xcscheme + + orderHint + 141 + + Julia.xcscheme + + orderHint + 142 + + Kaleidescope.xcscheme + + orderHint + 145 + + Kaleidocycle.xcscheme + + orderHint + 144 + + Klein.xcscheme + + orderHint + 146 + + Kumppa.xcscheme + + orderHint + 147 + + LCDscrub.xcscheme + + orderHint + 151 + + LMorph.xcscheme + + orderHint + 155 + + Lament.xcscheme + + orderHint + 148 + + Laser.xcscheme + + orderHint + 149 + + Lavalite.xcscheme + + orderHint + 150 + + Lightning.xcscheme + + orderHint + 152 + + Lisa.xcscheme + + orderHint + 153 + + Lissie.xcscheme + + orderHint + 154 + + Lockward.xcscheme + + orderHint + 156 + + Loop.xcscheme + + orderHint + 157 + + Maze.xcscheme + + orderHint + 160 + + Maze3D.xcscheme + + orderHint + 161 + + MemScroller.xcscheme + + orderHint + 162 + + Menger.xcscheme + + orderHint + 163 + + MetaBalls.xcscheme + + orderHint + 164 + + MirrorBlob.xcscheme + + orderHint + 165 + + Moebius.xcscheme + + orderHint + 166 + + MoebiusGears.xcscheme + + orderHint + 167 + + Moire.xcscheme + + orderHint + 168 + + Moire2.xcscheme + + orderHint + 169 + + Molecule.xcscheme + + orderHint + 170 + + Morph3D.xcscheme + + orderHint + 172 + + Mountain.xcscheme + + orderHint + 173 + + Munch.xcscheme + + orderHint + 174 + + NerveRot.xcscheme + + orderHint + 175 + + Noof.xcscheme + + orderHint + 176 + + NoseGuy.xcscheme + + orderHint + 177 + + Obsolete.xcscheme + + orderHint + 178 + + Pacman.xcscheme + + orderHint + 179 + + Pedal.xcscheme + + orderHint + 180 + + Peepers.xcscheme + + orderHint + 181 + + Penetrate.xcscheme + + orderHint + 182 + + Penrose.xcscheme + + orderHint + 183 + + Petri.xcscheme + + orderHint + 184 + + Phosphor-OSX.xcscheme + + orderHint + 187 + + Phosphor-iOS.xcscheme + + orderHint + 186 + + Phosphor.xcscheme + + orderHint + 185 + + Photopile.xcscheme + + orderHint + 188 + + Piecewise.xcscheme + + orderHint + 189 + + Pinion.xcscheme + + orderHint + 190 + + Pipes.xcscheme + + orderHint + 191 + + Polyhedra.xcscheme + + orderHint + 192 + + Polyominoes.xcscheme + + orderHint + 193 + + Polytopes.xcscheme + + orderHint + 194 + + Pong.xcscheme + + orderHint + 195 + + PopSquares.xcscheme + + orderHint + 196 + + ProjectivePlane.xcscheme + + orderHint + 197 + + Providence.xcscheme + + orderHint + 198 + + Pulsar.xcscheme + + orderHint + 199 + + Pyro.xcscheme + + orderHint + 200 + + Qix.xcscheme + + orderHint + 201 + + QuasiCrystal.xcscheme + + orderHint + 202 + + Queens.xcscheme + + orderHint + 203 + + RDbomb.xcscheme + + orderHint + 206 + + RandomXScreenSaver.xcscheme_^#shared#^_ + + orderHint + 280 + + RaverHoop.xcscheme + + orderHint + 205 + + RazzleDazzle.xcscheme + + orderHint + 204 + + Ripples.xcscheme + + orderHint + 207 + + Rocks.xcscheme + + orderHint + 208 + + RomanBoy.xcscheme + + orderHint + 209 + + Rorschach.xcscheme + + orderHint + 210 + + RotZoomer.xcscheme + + orderHint + 212 + + Rotor.xcscheme + + orderHint + 211 + + Rubik.xcscheme + + orderHint + 213 + + RubikBlocks.xcscheme + + orderHint + 214 + + SBalls.xcscheme + + orderHint + 216 + + SaverTester.xcscheme + + orderHint + 215 + + Scooter.xcscheme_^#shared#^_ + + orderHint + 217 + + ShadeBobs.xcscheme + + orderHint + 218 + + Sierpinski.xcscheme + + orderHint + 219 + + Sierpinski3D.xcscheme + + orderHint + 220 + + SkyTentacles.xcscheme + + orderHint + 221 + + SlideScreen.xcscheme + + orderHint + 222 + + Slip.xcscheme + + orderHint + 223 + + Sonar.xcscheme + + orderHint + 224 + + SpeedMine.xcscheme + + orderHint + 225 + + Sphere.xcscheme + + orderHint + 226 + + SphereEversion.xcscheme_^#shared#^_ + + orderHint + 227 + + Spheremonics.xcscheme + + orderHint + 228 + + Spiral.xcscheme + + orderHint + 229 + + SplitFlap.xcscheme + + orderHint + 230 + + Splodesic.xcscheme + + orderHint + 231 + + Spotlight.xcscheme + + orderHint + 232 + + Sproingies.xcscheme + + orderHint + 233 + + Squiral.xcscheme + + orderHint + 234 + + Stairs.xcscheme + + orderHint + 235 + + StarWars.xcscheme + + orderHint + 237 + + Starfish.xcscheme + + orderHint + 236 + + StonerView.xcscheme + + orderHint + 238 + + Strange.xcscheme + + orderHint + 239 + + Substrate.xcscheme + + orderHint + 240 + + Superquadrics.xcscheme + + orderHint + 241 + + Surfaces.xcscheme + + orderHint + 242 + + Swirl.xcscheme + + orderHint + 243 + + T3D.xcscheme + + orderHint + 244 + + Tangram.xcscheme + + orderHint + 245 + + Tessellimage.xcscheme + + orderHint + 246 + + TestX11-iOS.xcscheme + + orderHint + 248 + + TestX11.xcscheme + + orderHint + 247 + + Thornbird.xcscheme + + orderHint + 249 + + TimeTunnel.xcscheme + + orderHint + 250 + + TopBlock.xcscheme + + orderHint + 251 + + Triangle.xcscheme + + orderHint + 252 + + TronBit.xcscheme + + orderHint + 253 + + Truchet.xcscheme + + orderHint + 254 + + Twang.xcscheme + + orderHint + 255 + + Unicrud.xcscheme + + orderHint + 256 + + UnknownPleasures.xcscheme + + orderHint + 257 + + VFeedback.xcscheme + + orderHint + 259 + + Vermiculate.xcscheme + + orderHint + 258 + + Vigilance.xcscheme + + orderHint + 260 + + Vines.xcscheme + + orderHint + 261 + + Voronoi.xcscheme + + orderHint + 262 + + Wander.xcscheme + + orderHint + 263 + + WebCollage.xcscheme + + orderHint + 264 + + WhirlWindWarp.xcscheme + + orderHint + 265 + + Whirlygig.xcscheme + + orderHint + 266 + + WindupRobot.xcscheme + + orderHint + 267 + + Worm.xcscheme + + orderHint + 268 + + Wormhole.xcscheme + + orderHint + 269 + + XAnalogTV.xcscheme + + orderHint + 270 + + XFlame.xcscheme + + orderHint + 271 + + XJack.xcscheme + + orderHint + 272 + + XLyap.xcscheme + + orderHint + 273 + + XMatrix.xcscheme + + orderHint + 274 + + XRaySwarm.xcscheme + + orderHint + 275 + + XScreenSaver-iOS.xcscheme + + orderHint + 278 + + XScreenSaverUpdater.xcscheme + + orderHint + 279 + + XSpirograph.xcscheme + + orderHint + 276 + + Zoom.xcscheme + + orderHint + 277 + + enable_gc.xcscheme + + orderHint + 4 + + images_png_h.xcscheme + + orderHint + 5 + + jwxyz.xcscheme + + orderHint + 143 + + m6502.h copy.xcscheme + + orderHint + 263 + + m6502.h.xcscheme + + orderHint + 158 + + m6502.xcscheme + + orderHint + 159 + + molecules.h.xcscheme + + orderHint + 171 + + + SuppressBuildableAutocreation + + AF01291F157D2F6800C396E1 + + primary + + + AF072578157AD6B4002379C8 + + primary + + + AF08398F09930B6B00277BE9 + + primary + + + AF083A32099311D700277BE9 + + primary + + + AF0DC7AB0C4C73F600D76972 + + primary + + + AF0DCA420C4CBB0D00D76972 + + primary + + + AF137D410F075C9B004DE3B2 + + primary + + + AF1A17610D6D6EE3008AF328 + + primary + + + AF1AD9E118500F9F00932759 + + primary + + + AF1AD9FF18500FA000932759 + + primary + + + AF1B0FA71D7AB4740011DBE4 + + primary + + + AF2107711FD23BDD00B61EA9 + + primary + + + AF2D0D25241D7C870001D8B8 + + primary + + + AF2D4D7F13E902F5002AA818 + + primary + + + AF2D4F6A13E91093002AA818 + + primary + + + AF32D9E00F3AD0B40080F535 + + primary + + + AF3581BF1431D47B00E09C51 + + primary + + + AF3581FB143330F900E09C51 + + primary + + + AF35E88A0E63823600691F2F + + primary + + + AF39381A1D0FBD6A00205406 + + primary + + + AF39E282198A11F60064A58D + + primary + + + AF3C71450D624BF50030CC0D + + primary + + + AF3EC9782035154C00180A35 + + primary + + + AF41E952201D49DB0098E253 + + primary + + + AF4363FC241D84CE00966603 + + primary + + + AF46E9CF1CBBA2B300240FBC + + primary + + + AF476FB5099D154F001F091E + + primary + + + AF476FDA099D1686001F091E + + primary + + + AF47704C099D4385001F091E + + primary + + + AF477169099D4786001F091E + + primary + + + AF47717F099D4803001F091E + + primary + + + AF4771A7099D4949001F091E + + primary + + + AF4771DB099D4D9A001F091E + + primary + + + AF4771F2099D4E63001F091E + + primary + + + AF477208099D4EE8001F091E + + primary + + + AF47721E099D4F67001F091E + + primary + + + AF477253099D5717001F091E + + primary + + + AF47726B099D57B9001F091E + + primary + + + AF477283099D5926001F091E + + primary + + + AF477382099D65A1001F091E + + primary + + + AF47739A099D6648001F091E + + primary + + + AF4773C1099D67B9001F091E + + primary + + + AF477401099D69E7001F091E + + primary + + + AF477426099D7C70001F091E + + primary + + + AF477442099D7D33001F091E + + primary + + + AF477483099D89E4001F091E + + primary + + + AF477499099D8A74001F091E + + primary + + + AF4774B4099D8B5F001F091E + + primary + + + AF4774CE099D8BFF001F091E + + primary + + + AF47755D099D9A1A001F091E + + primary + + + AF477583099D9C28001F091E + + primary + + + AF47759F099D9CF7001F091E + + primary + + + AF4775D8099D9F69001F091E + + primary + + + AF4775F2099DA030001F091E + + primary + + + AF477613099DA26C001F091E + + primary + + + AF477644099DA6D0001F091E + + primary + + + AF47765A099DA78E001F091E + + primary + + + AF477670099DA849001F091E + + primary + + + AF47768F099DAA6F001F091E + + primary + + + AF4776AA099DABDD001F091E + + primary + + + AF4776C0099DAC8A001F091E + + primary + + + AF4776DB099DADDF001F091E + + primary + + + AF4776F1099DAE7A001F091E + + primary + + + AF47770D099DAF9F001F091E + + primary + + + AF477723099DB044001F091E + + primary + + + AF477752099DB61E001F091E + + primary + + + AF477774099DB965001F091E + + primary + + + AF477790099DBA90001F091E + + primary + + + AF4777D1099DC183001F091E + + primary + + + AF4778AB099DDB79001F091E + + primary + + + AF4778C7099DDCAE001F091E + + primary + + + AF4778E8099DDDC8001F091E + + primary + + + AF477909099DE379001F091E + + primary + + + AF47792A099DE4C7001F091E + + primary + + + AF4808C0098C3B6C00FB32B8 + + primary + + + AF480AAF098C669800FB32B8 + + primary + + + AF480C49098E301400FB32B8 + + primary + + + AF480D58098EED3D00FB32B8 + + primary + + + AF480D59098EED5100FB32B8 + + primary + + + AF480D5A098EED5E00FB32B8 + + primary + + + AF480D72098EEDDE00FB32B8 + + primary + + + AF4810EB09909FBA00FB32B8 + + primary + + + AF4812500990CE2700FB32B8 + + primary + + + AF4812B30990D3D900FB32B8 + + primary + + + AF48DEEF0A0C25E000F94CF9 + + primary + + + AF4A3449102A593600A81B2A + + primary + + + AF4FD6E60CE7A486005EE58E + + primary + + + AF4FF4930D52CA0800666F98 + + primary + + + AF4FF4BA0D52CBDE00666F98 + + primary + + + AF5C9AF91A0CCE6E00B0147A + + primary + + + AF5ECEA92116B1A400069433 + + primary + + + AF62D6182180070600C57C42 + + primary + + + AF633C011EE0BA6F00AB33BD + + primary + + + AF63A7F11AB4EDDB00593C75 + + primary + + + AF63F2471C3465BE0033E133 + + primary + + + AF63F4501C34682A0033E133 + + primary + + + AF63F4781C3469FC0033E133 + + primary + + + AF6423F2099FF9C2000F4CD4 + + primary + + + AF6425CC09A18855000F4CD4 + + primary + + + AF6425EC09A189EC000F4CD4 + + primary + + + AF64260F09A18D6C000F4CD4 + + primary + + + AF64262C09A18F54000F4CD4 + + primary + + + AF64264F09A19229000F4CD4 + + primary + + + AF64267B09A194B0000F4CD4 + + primary + + + AF64277109A1D37A000F4CD4 + + primary + + + AF6427A809A2DE36000F4CD4 + + primary + + + AF688AB9257C04D200C91EAE + + primary + + + AF68A47E19196CF800D41CD1 + + primary + + + AF6C6D74226AE4FC0065A748 + + primary + + + AF73FF221A09877F00E485E9 + + primary + + + AF7510FF1782B5B900380EA1 + + primary + + + AF7776E409B63ABF00EA3033 + + primary + + + AF77771A09B6416100EA3033 + + primary + + + AF77773E09B6446500EA3033 + + primary + + + AF77777409B6497800EA3033 + + primary + + + AF77778E09B64A5200EA3033 + + primary + + + AF7777A809B64B2600EA3033 + + primary + + + AF7777D009B64C6B00EA3033 + + primary + + + AF7777EA09B64E3100EA3033 + + primary + + + AF77781009B6504400EA3033 + + primary + + + AF77784409B6528100EA3033 + + primary + + + AF77786109B6536000EA3033 + + primary + + + AF77787F09B6563500EA3033 + + primary + + + AF7778A509B659C800EA3033 + + primary + + + AF78D175142DD8F3002AAF77 + + primary + + + AF794F64099748450059A8B0 + + primary + + + AF794F8E09974A320059A8B0 + + primary + + + AF794FCD09974FA60059A8B0 + + primary + + + AF7ACFC019FF0A9200BD752B + + primary + + + AF81E00025845C2A00CFC475 + + primary + + + AF918977158FC00A002B5D1E + + primary + + + AF95058425670ECC00C1F257 + + primary + + + AF96013E25758F9F007FA31B + + primary + + + AF97572D099C317000B05160 + + primary + + + AF975775099C374A00B05160 + + primary + + + AF9757C2099C3E6300B05160 + + primary + + + AF975808099C41D500B05160 + + primary + + + AF975865099C475900B05160 + + primary + + + AF975A36099C681F00B05160 + + primary + + + AF975A6C099C6AB200B05160 + + primary + + + AF975A86099C6BC300B05160 + + primary + + + AF975AD7099C6EB100B05160 + + primary + + + AF975AFC099C6FE400B05160 + + primary + + + AF975C12099C8C1500B05160 + + primary + + + AF975C3D099C8DCF00B05160 + + primary + + + AF975C5D099C8F3F00B05160 + + primary + + + AF975D52099CA0F000B05160 + + primary + + + AF976FBB0989CAA2001F8B92 + + primary + + + AF9770290989D1E6001F8B92 + + primary + + + AF9770660989D2F6001F8B92 + + primary + + + AF9771D60989DC4A001F8B92 + + primary + + + AF998EDA0A083DB30051049D + + primary + + + AF9D466609B5109C006E59CF + + primary + + + AF9D474409B5300A006E59CF + + primary + + + AF9D475F09B53166006E59CF + + primary + + + AF9D48DB09B53322006E59CF + + primary + + + AF9D48F409B535DA006E59CF + + primary + + + AF9D492B09B53CBA006E59CF + + primary + + + AF9D495409B53FC9006E59CF + + primary + + + AF9D496C09B5411D006E59CF + + primary + + + AF9D499709B544C2006E59CF + + primary + + + AF9D4C6909B59F27006E59CF + + primary + + + AF9D4CE709B5AA8E006E59CF + + primary + + + AF9D4D7E09B5B2DC006E59CF + + primary + + + AF9D4DAF09B5B71E006E59CF + + primary + + + AF9D4DEC09B5BB19006E59CF + + primary + + + AF9E7EBE190F4C1B00A8B01F + + primary + + + AFA0B11E241CE69E0071E35D + + primary + + + AFA2118C1CD59DAF00C0D2A1 + + primary + + + AFA3392E0B058505002B0E7D + + primary + + + AFA33BC60B058740002B0E7D + + primary + + + AFA33C020B058E17002B0E7D + + primary + + + AFA55946099330B000F3E977 + + primary + + + AFA5596D0993317900F3E977 + + primary + + + AFA559920993322100F3E977 + + primary + + + AFA559B50993328000F3E977 + + primary + + + AFA559CF0993330600F3E977 + + primary + + + AFA55A030993340300F3E977 + + primary + + + AFA55A20099334A000F3E977 + + primary + + + AFA55A790993364300F3E977 + + primary + + + AFA55ACF09933CEF00F3E977 + + primary + + + AFA55B0909933E0500F3E977 + + primary + + + AFA55B2509933E8D00F3E977 + + primary + + + AFA55B7909933F7200F3E977 + + primary + + + AFA55B9109933FDA00F3E977 + + primary + + + AFA55BAB099340CE00F3E977 + + primary + + + AFA55BE40993429100F3E977 + + primary + + + AFA55C0E0993431300F3E977 + + primary + + + AFA55C77099349A600F3E977 + + primary + + + AFA55CA909934BB200F3E977 + + primary + + + AFA55CCC09934CE400F3E977 + + primary + + + AFA55D3C0993565300F3E977 + + primary + + + AFA55D620993584B00F3E977 + + primary + + + AFA55D7F099358C400F3E977 + + primary + + + AFA55DC809935D7000F3E977 + + primary + + + AFA55DF009935E4900F3E977 + + primary + + + AFA55E0D09935EDC00F3E977 + + primary + + + AFA55E2F09935F8E00F3E977 + + primary + + + AFA55E4E09935FF900F3E977 + + primary + + + AFA55EC7099360E300F3E977 + + primary + + + AFA55F06099361B700F3E977 + + primary + + + AFA55F2A0993622F00F3E977 + + primary + + + AFA55F420993629000F3E977 + + primary + + + AFA55F720993643600F3E977 + + primary + + + AFA55FD309936BFA00F3E977 + + primary + + + AFA55FF909936C6D00F3E977 + + primary + + + AFA5601409936CC800F3E977 + + primary + + + AFA5603209936D5100F3E977 + + primary + + + AFA5604A09936E2100F3E977 + + primary + + + AFA5606209936F3800F3E977 + + primary + + + AFA560AE0993718D00F3E977 + + primary + + + AFA560FD0993781600F3E977 + + primary + + + AFA56119099378CB00F3E977 + + primary + + + AFA5615609937C0D00F3E977 + + primary + + + AFA5617B09937CF100F3E977 + + primary + + + AFA5619D09937D7E00F3E977 + + primary + + + AFA562060993849F00F3E977 + + primary + + + AFA5621F0993852500F3E977 + + primary + + + AFA562BF099392C600F3E977 + + primary + + + AFA562DA099393C900F3E977 + + primary + + + AFA562F20993943B00F3E977 + + primary + + + AFA563130993951000F3E977 + + primary + + + AFA56331099395ED00F3E977 + + primary + + + AFA56351099396C000F3E977 + + primary + + + AFA56379099397B300F3E977 + + primary + + + AFA563A4099398BB00F3E977 + + primary + + + AFA6AAF020999950006D2685 + + primary + + + AFAAE387207D6343007A515C + + primary + + + AFAC36B6202E7F79001A684C + + primary + + + AFACE8731CC83458008B24CD + + primary + + + AFADD32B24B67100005456DC + + primary + + + AFB591A7178B812C00EA4005 + + primary + + + AFBFE74B178642DC00432B21 + + primary + + + AFBFE767178647FE00432B21 + + primary + + + AFC0E8AB1CDC601A008CAFAC + + primary + + + AFC5CFD62044AA23004CEB5E + + primary + + + AFCF833B1AF5B515008BB7E1 + + primary + + + AFD51B1B0F063B4A00471C02 + + primary + + + AFD56DF10996A03800BA26F7 + + primary + + + AFD56EAE0996A72600BA26F7 + + primary + + + AFD56EDA0996A95700BA26F7 + + primary + + + AFD56F0B0996AAFA00BA26F7 + + primary + + + AFD56F230996AB8A00BA26F7 + + primary + + + AFD56F4F0996AEEE00BA26F7 + + primary + + + AFD56F6B0996B01600BA26F7 + + primary + + + AFD56F8C0996B09400BA26F7 + + primary + + + AFD56FA30996B10F00BA26F7 + + primary + + + AFD56FB90996B18F00BA26F7 + + primary + + + AFD56FCF0996B20900BA26F7 + + primary + + + AFD56FF80996B43800BA26F7 + + primary + + + AFD5700F0996B4CC00BA26F7 + + primary + + + AFD570260996B56D00BA26F7 + + primary + + + AFD570430996B61600BA26F7 + + primary + + + AFD570590996B6A300BA26F7 + + primary + + + AFD5706F0996B72700BA26F7 + + primary + + + AFD570850996B80300BA26F7 + + primary + + + AFD5709B0996B88E00BA26F7 + + primary + + + AFD570B10996B93000BA26F7 + + primary + + + AFD570C90996B9F800BA26F7 + + primary + + + AFD570EA0996BBBF00BA26F7 + + primary + + + AFD571130996BE9300BA26F7 + + primary + + + AFD5712C0996BF2E00BA26F7 + + primary + + + AFD571430996C01700BA26F7 + + primary + + + AFD571590996C0CE00BA26F7 + + primary + + + AFD571B50996D9DC00BA26F7 + + primary + + + AFD572220996E4A300BA26F7 + + primary + + + AFD5726D0996EE8500BA26F7 + + primary + + + AFD572A50996F99600BA26F7 + + primary + + + AFD572C20996FC0F00BA26F7 + + primary + + + AFD572F9099701C000BA26F7 + + primary + + + AFD5735D0997411200BA26F7 + + primary + + + AFD77E5B20C23F8600A3638D + + primary + + + AFDA658E178A52B70070D24B + + primary + + + AFE2A4560E2E904600ADB298 + + primary + + + AFE30BE80E52B14700CCF4A5 + + primary + + + AFE6A1820CDD7B2E002805BF + + primary + + + AFE6A41B0CDD7FAA002805BF + + primary + + + AFEC23CD1CB6EAE100DE138F + + primary + + + AFEE104D1D13406000AAC8F7 + + primary + + + AFEE106C1D15EB0700AAC8F7 + + primary + + + AFEE108B1D17E20B00AAC8F7 + + primary + + + AFF2867F17860E830050A578 + + primary + + + AFF3C9E817CCAC440028F240 + + primary + + + AFF449E02275494400DB8EDB + + primary + + + AFF463360C4403E400EE6509 + + primary + + + AFF463580C440AEF00EE6509 + + primary + + + AFFAB31519158CE40020F021 + + primary + + + CE3D01511B76F4C100993C75 + + primary + + + + + diff --git a/README b/README index 692c739a..ddb97869 100644 --- a/README +++ b/README @@ -18,33 +18,77 @@ that you install a binary release rather than trying to compile it yourself. Executables are available for almost all platforms, including macOS, iOS, and Android. See the XScreenSaver web site for details. + +=============================================================================== To compile for a Unix system with X11: +=============================================================================== + + ./configure --help + + ./configure --prefix=/usr + make + sudo make install + make clean - ./configure - make - make install + xscreensaver & + xscreensaver-settings - If you are on an "apt"-based system, "apt-get build-dep xscreensaver" - might install most of the compilation dependencies. You may need to - uncomment a line in /etc/apt/sources.list first. + There are many compilation dependencies. The configure script will + tell you what is missing. At the least, you will need development + versions of these libraries: + + perl pkg-config gettext intltool libx11 libxext libxi libxt + libxft libxinerama libxrandr libxxf86vm libgl libglu libgle + libgtk2 gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 libxml2 libpam + dbus libsystemd elogind + + BSD systems might need gmake instead of make. + + +=============================================================================== +To compile for macOS or iOS: +=============================================================================== -To compile for macOS X or iOS: + See OSX/README. Use the included Xcode project. - Use the included XCode project. Probably requires XCode 11 or newer. +=============================================================================== To compile for Android: +=============================================================================== See android/README. + +=============================================================================== Interested in writing a new screen saver? +=============================================================================== See the README.hacking file. -=============================================================================== - -XScreenSaver has an extensive manual -- please read it! =============================================================================== +Version History +=============================================================================== + +6.00 * X11: Major refactor of the `xscreensaver' daemon for improved + security, dividing it into three programs: `xscreensaver', + `xscreensaver-gfx' and `xscreensaver-auth'. + * X11: Dropped support for systems older than X11R7 (2009). + * X11: Renamed `xscreensaver-demo' to `xscreensaver-settings'. + * X11: Unlock dialog has user-selectable color schemes. + * X11: Everything uses XFreeType for fonts now. + * X11: Install a few custom fonts needed by some savers. + * X11: Fading works on systems without gamma (e.g. Raspberry Pi). + * X11: Use EGL instead of GLX when available. + * X11: `xscreensaver-systemd' now detects when a video player has + inhibited screen blanking and then exits without uninhibiting. + * Improved GLSL and GLES3 support: Phong shading in `etruscanvenus', + `hypertorus', `klein', `projectiveplane',`romanboy' and + `sphereeversion'. + * Updates to `cubicgrid'. + * macOS: Added a `Random XScreenSaver' screen saver, which implements + cycle mode, among other things. + * iOS: Also added cycle mode. 5.45 * New hacks, `covid19', `headroom', `sphereeversion' and `beats'. * Shader updates to `hypertorus'. @@ -554,7 +598,7 @@ XScreenSaver has an extensive manual -- please read it! run `gdmflexiserver'. Experimental! * Fixed non-ASCII display bug in `starwars'. * Configure finds a default for imageDirectory. - * "xscreensaver-command -lock" now works even if in "screensaver + * `xscreensaver-command -lock' now works even if in "screensaver disabled" mode. * If a bad password is typed while CapsLock is on, the unlock dialog says "CapsLock?" instead of "Sorry". @@ -650,7 +694,7 @@ XScreenSaver has an extensive manual -- please read it! 4.12 * New GL hacks, `flipflop', `antspotlight', and `polytopes'. * Added VMS to `bsod'. - * Compile without warnings in "gcc -pedantic". + * Compile without warnings in `gcc -pedantic'. * Updates to `webcollage' and `queens'. * Fixed a bug that could cause PAM to hang. @@ -738,8 +782,8 @@ XScreenSaver has an extensive manual -- please read it! * Fixed a bug in `webcollage' (due to recent Alta Vista url changes) that was causing it to try and load incorrect image URLs. * Made `xscreensaver-getimage' use gdk_pixbuf if it is available: this - means that those hacks that load images will no longer rely on "xv", - "xloadimage", etc. This will close a race condition that could + means that those hacks that load images will no longer rely on `xv', + `xloadimage', etc. This will close a race condition that could sometimes cause your desktop background to be changed; and also makes it possible for those programs to operate on image files when running in windowed mode. @@ -1142,7 +1186,7 @@ XScreenSaver has an extensive manual -- please read it! * Made xscreensaver notice when there has been a sudden large jump in wall-clock time, and if so, lock right away, instead of waiting for "lockTimeout" to expire first. (Laptops need this for safer - recovery from ``hibernation.'') + recovery from hibernation.) * Added `-throttle' option to `xscreensaver-command'. 3.10 * Added `phosphor', `xmatrix', and `pulsar' hacks. @@ -1214,7 +1258,7 @@ XScreenSaver has an extensive manual -- please read it! 3.04 * Added an `xscreensaver.spec' file, to make it easier for other folks to generate RPMs. * Made the password code work on HPUX in the situation where: - ``enhanced security'' is available; but not used; but the user typed + "enhanced security" is available; but not used; but the user typed a password more than 8 characters long anyway. FTSOHPUX. 3.03 * Made locking work when passwd aging is enabled. @@ -1360,7 +1404,7 @@ XScreenSaver has an extensive manual -- please read it! * Added a `timestamp' resource that makes the `-verbose' messages include the time at which they were printed. -2.23 * The fix for SGI's ``scheme'' nonsense broke things, and let the +2.23 * The fix for SGI's "scheme" nonsense broke things, and let the user's "*background" resource show through. Fixed it in a different way. @@ -1393,7 +1437,7 @@ XScreenSaver has an extensive manual -- please read it! xscreensaver-command, which does a totally different thing. * Removed xscreensaver's `-demo' command-line option for a similar reason; use `xscreensaver-command -demo' instead. - * Disabled SGI's ``scheme'' nonsense in a better way than + * Disabled SGI's "scheme" nonsense in a better way than fully-qualifying the background colors in every single hack. * Fixed some other minor cosmetic problems when *sgiMode is turned on. * Fixed an X error in `bsod -root' (how ironic...) @@ -1514,7 +1558,7 @@ XScreenSaver has an extensive manual -- please read it! 2.06 * Merged in VMS support from Patrick Moreau. 2.05 * Fixed a MIT-SCREEN-SAVER-related crash, and tweaked - configure to detect the extra-random -Xss library. + configure to detect the extra-random -lXss library. 2.04 * HP configure tweaks. Detect and warn about LessTif. * Fixed low-color behavior of `goop', `pyro', `starfish', @@ -1666,5 +1710,6 @@ XScreenSaver has an extensive manual -- please read it! * Fixed a BadDrawable error in non-XIdle mode. * Added `blitspin' and `imsmap'. -1.01 * Current list of included hacks is now: qix, helix, rorschach, - attraction, greynetic, rocks, pyro, hopalong, and noseguy. +1.01 * Current list of included hacks is now: `qix', `helix', `rorschach', + `attraction', `greynetic', `rocks', `pyro', `hopalong', and + `noseguy'. diff --git a/README.VMS b/README.VMS deleted file mode 100644 index d1903443..00000000 --- a/README.VMS +++ /dev/null @@ -1,57 +0,0 @@ -OpenVMS port of Xscreensavser version 2.10 October 1997 -========================================== - -Xscreensaver distribution can be found in 3 subdirectories: - -[.DRIVER] The Xscreensaver and Xscreensaver-command programs. -[.HACKS] Graphic demos ,can be run either through the xscreensaver program - or standalone. -[.UTILS] A small libraries of various utilities. - -This port has been tested with VAX VMS 6.1 (compiled with DEC 5 5.0 and -Motif 1.2) and AXP VMS 6.2 (compiled with DEC C 5.0 and Motif 1.2-4). - -To rebuild, you need to rebuild [.UTILS] directory first and create the -object library (look at the end of COMPILE*.COM procedure). - -You can now build the [.HACKS] directory and the [.DRIVER] directory. - -A one-step build is now available via the MAKEVMS.COM script. - -WARNING : before building [.HACKS], you may need to correct some of the -DECwindows bitmap files. Some files are bogus !! (they have a long line of -null chars at the end). These files are under -SYS$COMMON:[DECW$INCLUDE.BITMAPS] directory: - -STIPPLE.XBM -HLINES2.XBM -LIGHT_GRAY.XBM -ROOT_WEAVES.XBM -VLINES2.XBM - -These files are all used by Greynetic demo. - -Nota: link procedure automagically select appropriate X and Motif Libraries -(X11R4/Motif 1.1 - X11R5/Motif 1.2). - -The SETUP.COM procedure gives you a definition of all DCL foreign command -symbols needed to run Xscreensaver and all the graphic hacks. You need to -modify this procedure if you install these programs in another directory tree. - -You can easily add new graphic demos without recompiling Xscreensaver. You just -need to add them in resource file XSCREENSAVER.DAT. This file (originally -present in [.DRIVER] directory ) can be installed under your SYS$LOGIN -directory for a per-user customization basis. You can also install it under -the system-wide user resource directory SYS$COMMON:[DECW$DEFAULT.USER] -(with (W:RE) protections). The new graphics hack must be run in root-window -mode to be accepted by Xscreensaver. - -The graphic demos are spawn into subprocess created by the system() call (in -the Unix version the execvp() call is used). - -The VMS passord checking programs were picked up in the Xlock distribution. - -Enjoy, - -Patrick MOREAU - CENA/Athis-Mons - FRANCE (pmoreau@cena.dgac.fr) - (moreau_p@decus.decus.fr) diff --git a/README.hacking b/README.hacking index 09147f73..39f9e141 100644 --- a/README.hacking +++ b/README.hacking @@ -210,4 +210,30 @@ macOS, iOS and Android To check that an X11 saver will fit well on a mobile device, test it with -geometry 640x1136 and 640x960. That's a good first step, anyway. + +========================================================================== +Theory behind the ifdefs +========================================================================== + + HAVE_ macros indicate that an API is available. + USE_ macros indicate that a feature is requested. + + Some notable ones: + + HAVE_GL The OpenGL 1.3 API is available, natively or through emulation. + HAVE_GLES The OpenGLES 1.x API is available. + HAVE_COCOA The Cocoa API is available, meaning compiling for macOS or iOS. + HAVE_IPHONE Compiling for iOS, including iPad. + HAVE_ANDROID Compiling for Android. + HAVE_MOBILE iOS or Android, typically used for things related to rotation + or screen size that apply to all phones and tablets. + HAVE_JWXYZ Compiling on a system where the X11 API is emulated + (macOS, iOS or Android). + HAVE_JWZGLES Compiling on a system where the OpenGL 1.3 API is emulated + (iOS, Android, possibly Linux). + HAVE_GLSL Compiling against a library that supports the GL Shading + Language. Note that using GLSL also requires a runtime check + to see which version of GLSL the *running* system supports. + HAVE_EGL OpenGL interfaces with native windows via EGL instead of GLX. + ========================================================================== diff --git a/aclocal.m4 b/aclocal.m4 index bebda607..45eab984 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,4 +1,4 @@ -# generated automatically by aclocal 1.16.2 -*- Autoconf -*- +# generated automatically by aclocal 1.16.3 -*- Autoconf -*- # Copyright (C) 1996-2020 Free Software Foundation, Inc. diff --git a/android/Makefile b/android/Makefile index 149825fa..1a09b869 100644 --- a/android/Makefile +++ b/android/Makefile @@ -1,4 +1,5 @@ # XScreenSaver for Android +# The rest of this Makefile is in xscreensaver/jni/Android.mk export TERM=dumb GRADLE = ./gradlew @@ -10,15 +11,24 @@ all:: release local.properties: touch local.properties -clean:: local.properties - @\ - if [ "x" = x"$$JAVA_HOME" ] && ! ( which java >&- 2>&- ) ; then \ - echo "android: not cleaning: no java" >&2 ; \ - else \ - echo $(GRADLE) clean ; \ - $(GRADLE) clean ; \ - fi - +clean:: + rm -rf .gradle + rm -rf xscreensaver/.idea + rm -f android.iml + rm -rf build + rm -rf gen + rm -rf xscreensaver/build + rm -rf xscreensaver/libs + rm -rf xscreensaver/obj + rm -rf xscreensaver/res/values + rm -rf xscreensaver/res/xml + rm -rf xscreensaver/src/org/jwz/xscreensaver/gen + rm -f xscreensaver/AndroidManifest.xml + rm -f GLWallpaperService/build + + +# "make clean" should not require a functional gradle. +# $(GRADLE) clean distdepend:: local.properties @@ -290,7 +300,12 @@ ANDROID_TODO= \ # Android actually wants these to be 160x160 but our source is 200x150. URL = https://www.jwz.org/xscreensaver/screenshots/ -WGET = wget -q -U xscreensaver-build-android + +# I find wget easier to deal with, but curl is usually installed by default. +#WGET = wget -q -U xscreensaver-build-android --content-on-error=0 -O- +WGET = curl -s -A xscreensaver-build-osx -f + +# ImageMagick isn't installed by default, but neither is anything similar. CVT = -thumbnail '150x150^' -gravity center -extent 150x150 \ \( +clone -alpha extract \ -draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \ @@ -304,13 +319,15 @@ CVT = -thumbnail '150x150^' -gravity center -extent 150x150 \ # If we are making the m6502 hack, create the header file for Android m6502.h:: - @for h in $(ANDROID_HACKS) ; do \ - if [ $${h} = "m6502" ] ; then \ - echo "Making $${h} header ..."; \ - ../hacks/m6502.sh ../hacks/m6502.h ../hacks/images/m6502/*.asm ; \ - echo "Made $${h} header"; \ - fi; \ - done + ../hacks/m6502.sh ../hacks/m6502.h ../hacks/images/m6502/*.asm + +molecules.h:: + cd ../hacks/glx && \ + ./molecules.sh molecules.h ../images/molecules/*.pdb + +images_png_h: + cd ../hacks/images && make + xscreensaver/res/drawable/%.png: @\ @@ -321,7 +338,7 @@ xscreensaver/res/drawable/%.png: URL="$(URL)$$FILE1" ; \ echo "converting $$URL..." ; \ rm -f "$$FILE2" ; \ - $(WGET) -O- "$$URL" | \ + $(WGET) "$$URL" | \ convert jpg:- $(CVT) "$$FILE2" ; \ if [ ! -s "$$FILE2" ]; then \ echo "$$FILE2 failed" >&2 ; \ @@ -345,8 +362,8 @@ distclean:: clean_thumbs clean EXTRA_TARFILES = xscreensaver/res/drawable/thumbnail.png \ -echo_tarfiles: - @FILES=`find . $(EXTRA_TARFILES) \( \( \ +list_tarfiles: + @find . $(EXTRA_TARFILES) \( \( \ -name .DS_Store \ -o -name '*~' \ -o -name '*.jks' \ @@ -372,18 +389,14 @@ echo_tarfiles: -o \( \( -type f -o -type l \) \ -print \) \ | sed 's@^\./@@' \ - | sort` ; \ - echo $$FILES - -images_png_h: - cd ../hacks/images && $(MAKE) + | sort run_check:: ../hacks/check-configs.pl --build-android $(ANDROID_HACKS) -debug:: local.properties m6502.h run_check images_png_h +debug:: local.properties m6502.h molecules.h run_check images_png_h $(GRADLE) assembleDebug -release:: local.properties m6502.h run_check images_png_h +release:: local.properties m6502.h molecules.h run_check images_png_h export APP_ABI=all ; \ $(GRADLE) assembleRelease @@ -425,8 +438,10 @@ sign_release:: apk:: release @\ - VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' ../utils/version.h` ; \ - HEAD="xscreensaver-$$VERS" ; \ + SRC=../utils/version.h ; \ + VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. \"]*\).*/\1/p' < $$SRC | \ + head -1`; \ + HEAD="xscreensaver-$$VERS" ; \ if [ ! -s $(APK_SIGNED) -o $(APK_UNSIGNED) -nt $(APK_SIGNED) ]; then \ $(MAKE) sign_release ; \ fi ; \ diff --git a/android/README b/android/README index 4459a977..ec6a05fc 100644 --- a/android/README +++ b/android/README @@ -29,6 +29,8 @@ us know: On MacOS, the value you want is probably ~/Library/Android/sdk/ Also set "ndk.dir" in local.properties. + Install ImageMagick ("convert"). + ############################################################################ # @@ -63,7 +65,7 @@ us know: $ANDROID_HOME/sdk/tools/emulator -avd Nexus_5 - To load it into the currently-running emulator or device: + To load xscreensaver into the currently-running emulator or device: $ANDROID_HOME/platform-tools/adb install -r \ xscreensaver/build/outputs/apk/xscreensaver-debug.apk @@ -121,11 +123,16 @@ us know: xscreensaver/res/drawable-mdpi/ xscreensaver/res/drawable/ + Fonts: + xscreensaver/assets/fonts/ + Files that we generate: + Most of the XML is generated by ../hacks/check-configs.pl + gen/function-table.h xscreensaver/AndroidManifest.xml - xscreensaver/res/drawable/*.png + xscreensaver/res/drawable/*.png (except for thumbnail.png) xscreensaver/res/values/settings.xml xscreensaver/res/values/strings.xml xscreensaver/res/xml/*.xml @@ -133,6 +140,7 @@ us know: Other files generated as a part of the build process: + build/ gen/ .gradle/ xscreensaver/build/ @@ -217,11 +225,11 @@ When adding a new hack, edit android/Makefile, then "make clean" and "make". - Retrieving GL_MODELVIEW_MATRIX doesn't seem to work. Affects: - - discoball (back faces not masked out) + - discoball (back faces not masked out, billboarded lights) - energystream (blank) - glsnake (blank) - molecule (billboarded atom labels) - - raverhoop (blank) + - raverhoop (blank, billboarded lights) - starwars (blank) - winduprobot (billboarded word bubbles) @@ -234,6 +242,13 @@ When adding a new hack, edit android/Makefile, then "make clean" and "make". - polyominoes (can't texture the objects) - spotlight (everything) + Dave says: + jwxyz_blit() just needs a GCFunction parameter that swaps out that + memmove() when it's not GXcopy. I think xscreensaver_logo() is the only + thing that needs GC functions under jwxyz-image.c, and that doesn't need + fancy blending like jwxyz.m provides, so for instance GXxor could be + implemented as `a ^ b` instead of `abs(a - b)`. + - Complex polygon fills (XFillPolygon) are not implemented. Affects: - pedal @@ -251,6 +266,15 @@ When adding a new hack, edit android/Makefile, then "make clean" and "make". - molecule (shells are not transparent) - winduprobot (dome is not transparent) + - Weird outliers: + + - kumppa and slip are special-cased to use jwxyz-gl instead of jwxyz-image + because otherwise they are too slow, as they do tons of XCopyArea. and + OpenGL ES 1.1 doesn't have glCopyPixels or glBlitFramebuffer. + + - petri is similar, except with tons of XFillRectangle, which, at two + triangles each, is a lot of geometry. + - Undiagnosed problems: - antinspect has some kind of masking problem. @@ -259,7 +283,6 @@ When adding a new hack, edit android/Makefile, then "make clean" and "make". - endgame is insanely slow. - esper images display as black. - glblur is grayscale instead of color. Endian or packing problem? - - maze lines are not all the same thickness (aliased?) - queens is insanely slow. - sonar doesn't display properly, but once it does, test icmp. - xmatrix is pretty slow. diff --git a/android/android.iml b/android/android.iml deleted file mode 100644 index 8b87f105..00000000 --- a/android/android.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/screenhack-android.c b/android/screenhack-android.c index 451d594b..a54914ae 100644 --- a/android/screenhack-android.c +++ b/android/screenhack-android.c @@ -173,7 +173,18 @@ glXSwapBuffers (Display *dpy, Window window) GLXContext * init_GL (ModeInfo *mi) { - // Window win = mi->window; + /* The X11 version of this function is in hacks/glx/xlock-gl-utils.c + That version: + - Does the GLX or EGL initialization; + - Does glDrawBuffer GL_BACK/GL_FRONT depending on GL_DOUBLEBUFFER; + - Parses the "background" resource rather than assuming black. + */ + glClearColor (0, 0, 0, 1); + glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glClearColor(0,0,0,1); + + glClearColor(0,0,0,1); // Caller expects a pointer to an opaque struct... which it dereferences. // Don't ask me, it's historical... diff --git a/android/xscreensaver/#build.gradle# b/android/xscreensaver/#build.gradle# deleted file mode 100644 index 06e69cf9..00000000 --- a/android/xscreensaver/#build.gradle# +++ /dev/null @@ -1,114 +0,0 @@ -apply plugin: 'android' - -dependencies { - implementation fileTree(include: '*.jar', dir: 'libs') - implementation "com.android.support:support-v4:27.1.1" -} - -android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 - } - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src'] - resources.srcDirs = ['src'] - aidl.srcDirs = ['src'] - renderscript.srcDirs = ['src'] - res.srcDirs = ['res'] - assets.srcDirs = ['assets'] - // jniLibs.srcDirs = ['jni'] - jniLibs.srcDirs = ['libs'] - jniLibs.srcDir = 'src/main/jniLibs' - jni.srcDirs = [] // disable automatic ndk-build call - } - - // Move the tests to tests/java, tests/res, etc... - androidTest.setRoot('tests') - - // Move the build types to build-types/ - // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... - // This moves them out of them default location under src//... which would - // conflict with src/ being used by the main source set. - // Adding new build types or product flavors should be accompanied - // by a similar customization. - debug.setRoot('build-types/debug') - release.setRoot('build-types/release') - } - project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9] - //versionCode digit for each supported ABI, with 64bit>32bit and x86>armeabi-* - - - // put ndk-build in build's path, or replace below with its full path - task ndkBuild(type: Exec) { - Properties properties = new Properties() - properties.load(project.rootProject.file('local.properties').newDataInputStream()) - def ndkDir = properties.getProperty('ndk.dir') - commandLine "$ndkDir/ndk-build", '-C', file('jni').absolutePath, - '-j' + Runtime.getRuntime().availableProcessors().toString() - } - - // generate files early in the process - task perlBuild(type: Exec) { - commandLine 'sh', '-c', - 'cd ..; ../hacks/check-configs.pl --build-android $ANDROID_HACKS' - } - - task perlClean(type: Delete) { - delete('../gen') - delete('res/values') - delete('res/xml') - delete('src/org/jwz/xscreensaver/gen') - delete('AndroidManifest.xml') - } - - task objlibClean(type: Delete) { - delete('./build') - delete('./libs') - delete('./obj') - } - - task downloadNeededDrawables(type: Exec) { - commandLine 'sh', '-c', - 'cd ../ ; \ - for f in $ANDROID_HACKS; do \ - f=`echo "$f" | sed s/rd-bomb/rdbomb/` ; \ - make -s xscreensaver/res/drawable/$f.png ; \ - done' - } - preBuild.dependsOn downloadNeededDrawables - - preBuild.dependsOn perlBuild - - clean.dependsOn perlClean - clean.dependsOn objlibClean - - tasks.withType(JavaCompile) { - options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" - } - - tasks.withType(JavaCompile) { - compileTask -> compileTask.dependsOn ndkBuild - } - - - defaultConfig { - // Previous applicationId was "org.jwz.xscreensaver" but I had - // to change it because I managed to lose the signing key... - // Note that the Java class tree is still "org.jwz.xscreensaver". - applicationId "org.jwz.android.xscreensaver" - minSdkVersion 15 - targetSdkVersion 30 - } - productFlavors { - } - buildTypes { - debug { - jniDebuggable true - } - } -} diff --git a/android/xscreensaver/assets/fonts/OCRAStd.otf b/android/xscreensaver/assets/fonts/OCRAStd.otf index 62593454..2c701bf6 120000 --- a/android/xscreensaver/assets/fonts/OCRAStd.otf +++ b/android/xscreensaver/assets/fonts/OCRAStd.otf @@ -1 +1 @@ -../../../../OSX/OCRAStd.otf \ No newline at end of file +../../../../hacks/fonts/OCRAStd.otf \ No newline at end of file diff --git a/android/xscreensaver/assets/fonts/SpecialElite.ttf b/android/xscreensaver/assets/fonts/SpecialElite.ttf new file mode 120000 index 00000000..80d4e88c --- /dev/null +++ b/android/xscreensaver/assets/fonts/SpecialElite.ttf @@ -0,0 +1 @@ +../../../../hacks/fonts/SpecialElite.ttf \ No newline at end of file diff --git a/android/xscreensaver/assets/fonts/clacon.ttf b/android/xscreensaver/assets/fonts/clacon.ttf new file mode 120000 index 00000000..6444c9da --- /dev/null +++ b/android/xscreensaver/assets/fonts/clacon.ttf @@ -0,0 +1 @@ +../../../../hacks/fonts/clacon.ttf \ No newline at end of file diff --git a/android/xscreensaver/assets/fonts/gallant12x22.ttf b/android/xscreensaver/assets/fonts/gallant12x22.ttf index 55e9e77d..98b84bda 120000 --- a/android/xscreensaver/assets/fonts/gallant12x22.ttf +++ b/android/xscreensaver/assets/fonts/gallant12x22.ttf @@ -1 +1 @@ -../../../../OSX/gallant12x22.ttf \ No newline at end of file +../../../../hacks/fonts/gallant12x22.ttf \ No newline at end of file diff --git a/android/xscreensaver/assets/fonts/luximr.ttf b/android/xscreensaver/assets/fonts/luximr.ttf index 41f9ebeb..e87ed579 120000 --- a/android/xscreensaver/assets/fonts/luximr.ttf +++ b/android/xscreensaver/assets/fonts/luximr.ttf @@ -1 +1 @@ -../../../../OSX/luximr.ttf \ No newline at end of file +../../../../hacks/fonts/luximr.ttf \ No newline at end of file diff --git a/android/xscreensaver/build.gradle b/android/xscreensaver/build.gradle index 8927a8e3..139583c2 100644 --- a/android/xscreensaver/build.gradle +++ b/android/xscreensaver/build.gradle @@ -1,4 +1,4 @@ -apply plugin: 'android' +apply plugin: 'com.android.application' dependencies { implementation fileTree(include: '*.jar', dir: 'libs') @@ -100,14 +100,14 @@ android { // to change it because I managed to lose the signing key... // Note that the Java class tree is still "org.jwz.xscreensaver". applicationId "org.jwz.android.xscreensaver" - minSdkVersion 15 + minSdkVersion 18 targetSdkVersion 30 } productFlavors { } buildTypes { debug { - jniDebuggable true + debuggable true } } } diff --git a/android/xscreensaver/gradle/wrapper/gradle-wrapper.jar b/android/xscreensaver/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 13372aef5e24af05341d49695ee84e5f9b594659..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53636 zcmafaW0a=B^559DjdyHo$F^PVt zzd|cWgMz^T0YO0lQ8%TE1O06v|NZl~LH{LLQ58WtNjWhFP#}eWVO&eiP!jmdp!%24 z{&z-MK{-h=QDqf+S+Pgi=_wg$I{F28X*%lJ>A7Yl#$}fMhymMu?R9TEB?#6@|Q^e^AHhxcRL$z1gsc`-Q`3j+eYAd<4@z^{+?JM8bmu zSVlrVZ5-)SzLn&LU9GhXYG{{I+u(+6ES+tAtQUanYC0^6kWkks8cG;C&r1KGs)Cq}WZSd3k1c?lkzwLySimkP5z)T2Ox3pNs;PdQ=8JPDkT7#0L!cV? zzn${PZs;o7UjcCVd&DCDpFJvjI=h(KDmdByJuDYXQ|G@u4^Kf?7YkE67fWM97kj6F z973tGtv!k$k{<>jd~D&c(x5hVbJa`bILdy(00%lY5}HZ2N>)a|))3UZ&fUa5@uB`H z+LrYm@~t?g`9~@dFzW5l>=p0hG%rv0>(S}jEzqQg6-jImG%Pr%HPtqIV_Ym6yRydW z4L+)NhcyYp*g#vLH{1lK-hQQSScfvNiNx|?nSn-?cc8}-9~Z_0oxlr~(b^EiD`Mx< zlOLK)MH?nl4dD|hx!jBCIku-lI(&v~bCU#!L7d0{)h z;k4y^X+=#XarKzK*)lv0d6?kE1< zmCG^yDYrSwrKIn04tG)>>10%+ zEKzs$S*Zrl+GeE55f)QjY$ zD5hi~J17k;4VSF_`{lPFwf^Qroqg%kqM+Pdn%h#oOPIsOIwu?JR717atg~!)*CgXk zERAW?c}(66rnI+LqM^l7BW|9dH~5g1(_w$;+AAzSYlqop*=u5}=g^e0xjlWy0cUIT7{Fs2Xqx*8% zW71JB%hk%aV-wjNE0*$;E-S9hRx5|`L2JXxz4TX3nf8fMAn|523ssV;2&145zh{$V z#4lt)vL2%DCZUgDSq>)ei2I`*aeNXHXL1TB zC8I4!uq=YYVjAdcCjcf4XgK2_$y5mgsCdcn2U!VPljXHco>+%`)6W=gzJk0$e%m$xWUCs&Ju-nUJjyQ04QF_moED2(y6q4l+~fo845xm zE5Esx?~o#$;rzpCUk2^2$c3EBRNY?wO(F3Pb+<;qfq;JhMFuSYSxiMejBQ+l8(C-- zz?Xufw@7{qvh$;QM0*9tiO$nW(L>83egxc=1@=9Z3)G^+*JX-z92F((wYiK>f;6 zkc&L6k4Ua~FFp`x7EF;ef{hb*n8kx#LU|6{5n=A55R4Ik#sX{-nuQ}m7e<{pXq~8#$`~6| zi{+MIgsBRR-o{>)CE8t0Bq$|SF`M0$$7-{JqwFI1)M^!GMwq5RAWMP!o6G~%EG>$S zYDS?ux;VHhRSm*b^^JukYPVb?t0O%^&s(E7Rb#TnsWGS2#FdTRj_SR~YGjkaRFDI=d)+bw$rD;_!7&P2WEmn zIqdERAbL&7`iA^d?8thJ{(=)v>DgTF7rK-rck({PpYY$7uNY$9-Z< ze4=??I#p;$*+-Tm!q8z}k^%-gTm59^3$*ByyroqUe02Dne4?Fc%JlO>*f9Zj{++!^ zBz0FxuS&7X52o6-^CYq>jkXa?EEIfh?xdBPAkgpWpb9Tam^SXoFb3IRfLwanWfskJ zIbfU-rJ1zPmOV)|%;&NSWIEbbwj}5DIuN}!m7v4($I{Rh@<~-sK{fT|Wh?<|;)-Z; zwP{t@{uTsmnO@5ZY82lzwl4jeZ*zsZ7w%a+VtQXkigW$zN$QZnKw4F`RG`=@eWowO zFJ6RC4e>Y7Nu*J?E1*4*U0x^>GK$>O1S~gkA)`wU2isq^0nDb`);Q(FY<8V6^2R%= zDY}j+?mSj{bz2>F;^6S=OLqiHBy~7h4VVscgR#GILP!zkn68S^c04ZL3e$lnSU_(F zZm3e`1~?eu1>ys#R6>Gu$`rWZJG&#dsZ?^)4)v(?{NPt+_^Ak>Ap6828Cv^B84fa4 z_`l$0SSqkBU}`f*H#<14a)khT1Z5Z8;=ga^45{l8y*m|3Z60vgb^3TnuUKaa+zP;m zS`za@C#Y;-LOm&pW||G!wzr+}T~Q9v4U4ufu*fLJC=PajN?zN=?v^8TY}wrEeUygdgwr z7szml+(Bar;w*c^!5txLGKWZftqbZP`o;Kr1)zI}0Kb8yr?p6ZivtYL_KA<+9)XFE z=pLS5U&476PKY2aKEZh}%|Vb%!us(^qf)bKdF7x_v|Qz8lO7Ro>;#mxG0gqMaTudL zi2W!_#3@INslT}1DFJ`TsPvRBBGsODklX0`p-M6Mrgn~6&fF`kdj4K0I$<2Hp(YIA z)fFdgR&=qTl#sEFj6IHzEr1sYM6 zNfi!V!biByA&vAnZd;e_UfGg_={}Tj0MRt3SG%BQYnX$jndLG6>ssgIV{T3#=;RI% zE}b!9z#fek19#&nFgC->@!IJ*Fe8K$ZOLmg|6(g}ccsSBpc`)3;Ar8;3_k`FQ#N9&1tm>c|2mzG!!uWvelm zJj|oDZ6-m(^|dn3em(BF&3n12=hdtlb@%!vGuL*h`CXF?^=IHU%Q8;g8vABm=U!vX zT%Ma6gpKQC2c;@wH+A{)q+?dAuhetSxBDui+Z;S~6%oQq*IwSMu-UhMDy{pP z-#GB-a0`0+cJ%dZ7v0)3zfW$eV>w*mgU4Cma{P$DY3|w364n$B%cf()fZ;`VIiK_O zQ|q|(55+F$H(?opzr%r)BJLy6M&7Oq8KCsh`pA5^ohB@CDlMKoDVo5gO&{0k)R0b(UOfd>-(GZGeF}y?QI_T+GzdY$G{l!l% zHyToqa-x&X4;^(-56Lg$?(KYkgJn9W=w##)&CECqIxLe@+)2RhO*-Inpb7zd8txFG6mY8E?N8JP!kRt_7-&X{5P?$LAbafb$+hkA*_MfarZxf zXLpXmndnV3ubbXe*SYsx=eeuBKcDZI0bg&LL-a8f9>T(?VyrpC6;T{)Z{&|D5a`Aa zjP&lP)D)^YYWHbjYB6ArVs+4xvrUd1@f;;>*l zZH``*BxW+>Dd$be{`<&GN(w+m3B?~3Jjz}gB8^|!>pyZo;#0SOqWem%xeltYZ}KxOp&dS=bg|4 zY-^F~fv8v}u<7kvaZH`M$fBeltAglH@-SQres30fHC%9spF8Ld%4mjZJDeGNJR8+* zl&3Yo$|JYr2zi9deF2jzEC) zl+?io*GUGRp;^z+4?8gOFA>n;h%TJC#-st7#r&-JVeFM57P7rn{&k*z@+Y5 zc2sui8(gFATezp|Te|1-Q*e|Xi+__8bh$>%3|xNc2kAwTM!;;|KF6cS)X3SaO8^z8 zs5jV(s(4_NhWBSSJ}qUzjuYMKlkjbJS!7_)wwVsK^qDzHx1u*sC@C1ERqC#l%a zk>z>m@sZK{#GmsB_NkEM$$q@kBrgq%=NRBhL#hjDQHrI7(XPgFvP&~ZBJ@r58nLme zK4tD}Nz6xrbvbD6DaDC9E_82T{(WRQBpFc+Zb&W~jHf1MiBEqd57}Tpo8tOXj@LcF zwN8L-s}UO8%6piEtTrj@4bLH!mGpl5mH(UJR1r9bBOrSt0tSJDQ9oIjcW#elyMAxl7W^V(>8M~ss0^>OKvf{&oUG@uW{f^PtV#JDOx^APQKm& z{*Ysrz&ugt4PBUX@KERQbycxP%D+ApR%6jCx7%1RG2YpIa0~tqS6Xw6k#UN$b`^l6d$!I z*>%#Eg=n#VqWnW~MurJLK|hOQPTSy7G@29g@|g;mXC%MF1O7IAS8J^Q6D&Ra!h^+L&(IBYg2WWzZjT-rUsJMFh@E)g)YPW_)W9GF3 zMZz4RK;qcjpnat&J;|MShuPc4qAc)A| zVB?h~3TX+k#Cmry90=kdDoPYbhzs#z96}#M=Q0nC{`s{3ZLU)c(mqQQX;l~1$nf^c zFRQ~}0_!cM2;Pr6q_(>VqoW0;9=ZW)KSgV-c_-XdzEapeLySavTs5-PBsl-n3l;1jD z9^$^xR_QKDUYoeqva|O-+8@+e??(pRg@V|=WtkY!_IwTN~ z9Rd&##eWt_1w$7LL1$-ETciKFyHnNPjd9hHzgJh$J(D@3oYz}}jVNPjH!viX0g|Y9 zDD`Zjd6+o+dbAbUA( zEqA9mSoX5p|9sDVaRBFx_8)Ra4HD#xDB(fa4O8_J2`h#j17tSZOd3%}q8*176Y#ak zC?V8Ol<*X{Q?9j{Ys4Bc#sq!H;^HU$&F_`q2%`^=9DP9YV-A!ZeQ@#p=#ArloIgUH%Y-s>G!%V3aoXaY=f<UBrJTN+*8_lMX$yC=Vq+ zrjLn-pO%+VIvb~>k%`$^aJ1SevcPUo;V{CUqF>>+$c(MXxU12mxqyFAP>ki{5#;Q0 zx7Hh2zZdZzoxPY^YqI*Vgr)ip0xnpQJ+~R*UyFi9RbFd?<_l8GH@}gGmdB)~V7vHg z>Cjy78TQTDwh~+$u$|K3if-^4uY^|JQ+rLVX=u7~bLY29{lr>jWV7QCO5D0I>_1?; zx>*PxE4|wC?#;!#cK|6ivMzJ({k3bT_L3dHY#h7M!ChyTT`P#%3b=k}P(;QYTdrbe z+e{f@we?3$66%02q8p3;^th;9@y2vqt@LRz!DO(WMIk?#Pba85D!n=Ao$5NW0QVgS zoW)fa45>RkjU?H2SZ^#``zs6dG@QWj;MO4k6tIp8ZPminF`rY31dzv^e-3W`ZgN#7 z)N^%Rx?jX&?!5v`hb0-$22Fl&UBV?~cV*{hPG6%ml{k;m+a-D^XOF6DxPd$3;2VVY zT)E%m#ZrF=D=84$l}71DK3Vq^?N4``cdWn3 zqV=mX1(s`eCCj~#Nw4XMGW9tK>$?=cd$ule0Ir8UYzhi?%_u0S?c&j7)-~4LdolkgP^CUeE<2`3m)I^b ztV`K0k$OS^-GK0M0cNTLR22Y_eeT{<;G(+51Xx}b6f!kD&E4; z&Op8;?O<4D$t8PB4#=cWV9Q*i4U+8Bjlj!y4`j)^RNU#<5La6|fa4wLD!b6?RrBsF z@R8Nc^aO8ty7qzlOLRL|RUC-Bt-9>-g`2;@jfNhWAYciF{df9$n#a~28+x~@x0IWM zld=J%YjoKm%6Ea>iF){z#|~fo_w#=&&HRogJmXJDjCp&##oVvMn9iB~gyBlNO3B5f zXgp_1I~^`A0z_~oAa_YBbNZbDsnxLTy0@kkH!=(xt8|{$y<+|(wSZW7@)#|fs_?gU5-o%vpsQPRjIxq;AED^oG%4S%`WR}2(*!84Pe8Jw(snJ zq~#T7+m|w#acH1o%e<+f;!C|*&_!lL*^zRS`;E}AHh%cj1yR&3Grv&0I9k9v0*w8^ zXHEyRyCB`pDBRAxl;ockOh6$|7i$kzCBW$}wGUc|2bo3`x*7>B@eI=-7lKvI)P=gQ zf_GuA+36kQb$&{ZH)6o^x}wS}S^d&Xmftj%nIU=>&j@0?z8V3PLb1JXgHLq)^cTvB zFO6(yj1fl1Bap^}?hh<>j?Jv>RJdK{YpGjHxnY%d8x>A{k+(18J|R}%mAqq9Uzm8^Us#Ir_q^w9-S?W07YRD`w%D(n;|8N%_^RO`zp4 z@`zMAs>*x0keyE)$dJ8hR37_&MsSUMlGC*=7|wUehhKO)C85qoU}j>VVklO^TxK?! zO!RG~y4lv#W=Jr%B#sqc;HjhN={wx761vA3_$S>{j+r?{5=n3le|WLJ(2y_r>{)F_ z=v8Eo&xFR~wkw5v-{+9^JQukxf8*CXDWX*ZzjPVDc>S72uxAcY+(jtg3ns_5R zRYl2pz`B)h+e=|7SfiAAP;A zk0tR)3u1qy0{+?bQOa17SpBRZ5LRHz(TQ@L0%n5xJ21ri>^X420II1?5^FN3&bV?( zCeA)d9!3FAhep;p3?wLPs`>b5Cd}N!;}y`Hq3ppDs0+><{2ey0yq8o7m-4|oaMsWf zsLrG*aMh91drd-_QdX6t&I}t2!`-7$DCR`W2yoV%bcugue)@!SXM}fJOfG(bQQh++ zjAtF~zO#pFz})d8h)1=uhigDuFy`n*sbxZ$BA^Bt=Jdm}_KB6sCvY(T!MQnqO;TJs zVD{*F(FW=+v`6t^6{z<3-fx#|Ze~#h+ymBL^^GKS%Ve<)sP^<4*y_Y${06eD zH_n?Ani5Gs4&1z)UCL-uBvq(8)i!E@T_*0Sp5{Ddlpgke^_$gukJc_f9e=0Rfpta@ ze5~~aJBNK&OJSw!(rDRAHV0d+eW#1?PFbr==uG-$_fu8`!DWqQD~ef-Gx*ZmZx33_ zb0+I(0!hIK>r9_S5A*UwgRBKSd6!ieiYJHRigU@cogJ~FvJHY^DSysg)ac=7#wDBf zNLl!E$AiUMZC%%i5@g$WsN+sMSoUADKZ}-Pb`{7{S>3U%ry~?GVX!BDar2dJHLY|g zTJRo#Bs|u#8ke<3ohL2EFI*n6adobnYG?F3-#7eZZQO{#rmM8*PFycBR^UZKJWr(a z8cex$DPOx_PL^TO<%+f^L6#tdB8S^y#+fb|acQfD(9WgA+cb15L+LUdHKv)wE6={i zX^iY3N#U7QahohDP{g`IHS?D00eJC9DIx0V&nq!1T* z4$Bb?trvEG9JixrrNRKcjX)?KWR#Y(dh#re_<y*=5!J+-Wwb*D>jKXgr5L8_b6pvSAn3RIvI5oj!XF^m?otNA=t^dg z#V=L0@W)n?4Y@}49}YxQS=v5GsIF3%Cp#fFYm0Bm<}ey& zOfWB^vS8ye?n;%yD%NF8DvOpZqlB++#4KnUj>3%*S(c#yACIU>TyBG!GQl7{b8j#V z;lS})mrRtT!IRh2B-*T58%9;!X}W^mg;K&fb7?2#JH>JpCZV5jbDfOgOlc@wNLfHN z8O92GeBRjCP6Q9^Euw-*i&Wu=$>$;8Cktx52b{&Y^Ise-R1gTKRB9m0*Gze>$k?$N zua_0Hmbcj8qQy{ZyJ%`6v6F+yBGm>chZxCGpeL@os+v&5LON7;$tb~MQAbSZKG$k z8w`Mzn=cX4Hf~09q8_|3C7KnoM1^ZGU}#=vn1?1^Kc-eWv4x^T<|i9bCu;+lTQKr- zRwbRK!&XrWRoO7Kw!$zNQb#cJ1`iugR(f_vgmu!O)6tFH-0fOSBk6$^y+R07&&B!(V#ZV)CX42( zTC(jF&b@xu40fyb1=_2;Q|uPso&Gv9OSM1HR{iGPi@JUvmYM;rkv#JiJZ5-EFA%Lu zf;wAmbyclUM*D7>^nPatbGr%2aR5j55qSR$hR`c?d+z z`qko8Yn%vg)p=H`1o?=b9K0%Blx62gSy)q*8jWPyFmtA2a+E??&P~mT@cBdCsvFw4 zg{xaEyVZ|laq!sqN}mWq^*89$e6%sb6Thof;ml_G#Q6_0-zwf80?O}D0;La25A0C+ z3)w-xesp6?LlzF4V%yA9Ryl_Kq*wMk4eu&)Tqe#tmQJtwq`gI^7FXpToum5HP3@;N zpe4Y!wv5uMHUu`zbdtLys5)(l^C(hFKJ(T)z*PC>7f6ZRR1C#ao;R&_8&&a3)JLh* zOFKz5#F)hJqVAvcR#1)*AWPGmlEKw$sQd)YWdAs_W-ojA?Lm#wCd}uF0^X=?AA#ki zWG6oDQZJ5Tvifdz4xKWfK&_s`V*bM7SVc^=w7-m}jW6U1lQEv_JsW6W(| zkKf>qn^G!EWn~|7{G-&t0C6C%4)N{WRK_PM>4sW8^dDkFM|p&*aBuN%fg(I z^M-49vnMd%=04N95VO+?d#el>LEo^tvnQsMop70lNqq@%cTlht?e+B5L1L9R4R(_6 z!3dCLeGXb+_LiACNiqa^nOELJj%q&F^S+XbmdP}`KAep%TDop{Pz;UDc#P&LtMPgH zy+)P1jdgZQUuwLhV<89V{3*=Iu?u#v;v)LtxoOwV(}0UD@$NCzd=id{UuDdedeEp| z`%Q|Y<6T?kI)P|8c!K0Za&jxPhMSS!T`wlQNlkE(2B*>m{D#`hYYD>cgvsKrlcOcs7;SnVCeBiK6Wfho@*Ym9 zr0zNfrr}0%aOkHd)d%V^OFMI~MJp+Vg-^1HPru3Wvac@-QjLX9Dx}FL(l>Z;CkSvC zOR1MK%T1Edv2(b9$ttz!E7{x4{+uSVGz`uH&)gG`$)Vv0^E#b&JSZp#V)b6~$RWwe zzC3FzI`&`EDK@aKfeqQ4M(IEzDd~DS>GB$~ip2n!S%6sR&7QQ*=Mr(v*v-&07CO%# zMBTaD8-EgW#C6qFPPG1Ph^|0AFs;I+s|+A@WU}%@WbPI$S0+qFR^$gim+Fejs2f!$ z@Xdlb_K1BI;iiOUj`j+gOD%mjq^S~J0cZZwuqfzNH9}|(vvI6VO+9ZDA_(=EAo;( zKKzm`k!s!_sYCGOm)93Skaz+GF7eY@Ra8J$C)`X)`aPKym?7D^SI}Mnef4C@SgIEB z>nONSFl$qd;0gSZhNcRlq9VVHPkbakHlZ1gJ1y9W+@!V$TLpdsbKR-VwZrsSM^wLr zL9ob&JG)QDTaf&R^cnm5T5#*J3(pSpjM5~S1 z@V#E2syvK6wb?&h?{E)CoI~9uA(hST7hx4_6M(7!|BW3TR_9Q zLS{+uPoNgw(aK^?=1rFcDO?xPEk5Sm=|pW%-G2O>YWS^(RT)5EQ2GSl75`b}vRcD2 z|HX(x0#Qv+07*O|vMIV(0?KGjOny#Wa~C8Q(kF^IR8u|hyyfwD&>4lW=)Pa311caC zUk3aLCkAFkcidp@C%vNVLNUa#1ZnA~ZCLrLNp1b8(ndgB(0zy{Mw2M@QXXC{hTxr7 zbipeHI-U$#Kr>H4}+cu$#2fG6DgyWgq{O#8aa)4PoJ^;1z7b6t&zt zPei^>F1%8pcB#1`z`?f0EAe8A2C|}TRhzs*-vN^jf(XNoPN!tONWG=abD^=Lm9D?4 zbq4b(in{eZehKC0lF}`*7CTzAvu(K!eAwDNC#MlL2~&gyFKkhMIF=32gMFLvKsbLY z1d$)VSzc^K&!k#2Q?(f>pXn){C+g?vhQ0ijV^Z}p5#BGrGb%6n>IH-)SA$O)*z3lJ z1rtFlovL`cC*RaVG!p!4qMB+-f5j^1)ALf4Z;2X&ul&L!?`9Vdp@d(%(>O=7ZBV;l z?bbmyPen>!P{TJhSYPmLs759b1Ni1`d$0?&>OhxxqaU|}-?Z2c+}jgZ&vCSaCivx| z-&1gw2Lr<;U-_xzlg}Fa_3NE?o}R-ZRX->__}L$%2ySyiPegbnM{UuADqwDR{C2oS zPuo88%DNfl4xBogn((9j{;*YGE0>2YoL?LrH=o^SaAcgO39Ew|vZ0tyOXb509#6{7 z0<}CptRX5(Z4*}8CqCgpT@HY3Q)CvRz_YE;nf6ZFwEje^;Hkj0b1ESI*8Z@(RQrW4 z35D5;S73>-W$S@|+M~A(vYvX(yvLN(35THo!yT=vw@d(=q8m+sJyZMB7T&>QJ=jkwQVQ07*Am^T980rldC)j}}zf!gq7_z4dZ zHwHB94%D-EB<-^W@9;u|(=X33c(G>q;Tfq1F~-Lltp|+uwVzg?e$M96ndY{Lcou%w zWRkjeE`G*i)Bm*|_7bi+=MPm8by_};`=pG!DSGBP6y}zvV^+#BYx{<>p0DO{j@)(S zxcE`o+gZf8EPv1g3E1c3LIbw+`rO3N+Auz}vn~)cCm^DlEi#|Az$b z2}Pqf#=rxd!W*6HijC|u-4b~jtuQS>7uu{>wm)PY6^S5eo=?M>;tK`=DKXuArZvaU zHk(G??qjKYS9G6Du)#fn+ob=}C1Hj9d?V$_=J41ljM$CaA^xh^XrV-jzi7TR-{{9V zZZI0;aQ9YNEc`q=Xvz;@q$eqL<}+L(>HR$JA4mB6~g*YRSnpo zTofY;u7F~{1Pl=pdsDQx8Gg#|@BdoWo~J~j%DfVlT~JaC)he>he6`C`&@@#?;e(9( zgKcmoidHU$;pi{;VXyE~4>0{kJ>K3Uy6`s*1S--*mM&NY)*eOyy!7?9&osK*AQ~vi z{4qIQs)s#eN6j&0S()cD&aCtV;r>ykvAzd4O-fG^4Bmx2A2U7-kZR5{Qp-R^i4H2yfwC7?9(r3=?oH(~JR4=QMls>auMv*>^^!$}{}R z;#(gP+O;kn4G|totqZGdB~`9yzShMze{+$$?9%LJi>4YIsaPMwiJ{`gocu0U}$Q$vI5oeyKrgzz>!gI+XFt!#n z7vs9Pn`{{5w-@}FJZn?!%EQV!PdA3hw%Xa2#-;X4*B4?`WM;4@bj`R-yoAs_t4!!` zEaY5OrYi`3u3rXdY$2jZdZvufgFwVna?!>#t#DKAD2;U zqpqktqJ)8EPY*w~yj7r~#bNk|PDM>ZS?5F7T5aPFVZrqeX~5_1*zTQ%;xUHe#li?s zJ*5XZVERVfRjwX^s=0<%nXhULK+MdibMjzt%J7#fuh?NXyJ^pqpfG$PFmG!h*opyi zmMONjJY#%dkdRHm$l!DLeBm#_0YCq|x17c1fYJ#5YMpsjrFKyU=y>g5QcTgbDm28X zYL1RK)sn1@XtkGR;tNb}(kg#9L=jNSbJizqAgV-TtK2#?LZXrCIz({ zO^R|`ZDu(d@E7vE}df5`a zNIQRp&mDFbgyDKtyl@J|GcR9!h+_a$za$fnO5Ai9{)d7m@?@qk(RjHwXD}JbKRn|u z=Hy^z2vZ<1Mf{5ihhi9Y9GEG74Wvka;%G61WB*y7;&L>k99;IEH;d8-IR6KV{~(LZ zN7@V~f)+yg7&K~uLvG9MAY+{o+|JX?yf7h9FT%7ZrW7!RekjwgAA4jU$U#>_!ZC|c zA9%tc9nq|>2N1rg9uw-Qc89V}I5Y`vuJ(y`Ibc_?D>lPF0>d_mB@~pU`~)uWP48cT@fTxkWSw{aR!`K{v)v zpN?vQZZNPgs3ki9h{An4&Cap-c5sJ!LVLtRd=GOZ^bUpyDZHm6T|t#218}ZA zx*=~9PO>5IGaBD^XX-_2t7?7@WN7VfI^^#Csdz9&{1r z9y<9R?BT~-V8+W3kzWWQ^)ZSI+R zt^Lg`iN$Z~a27)sC_03jrD-%@{ArCPY#Pc*u|j7rE%}jF$LvO4vyvAw3bdL_mg&ei zXys_i=Q!UoF^Xp6^2h5o&%cQ@@)$J4l`AG09G6Uj<~A~!xG>KjKSyTX)zH*EdHMK0 zo;AV-D+bqWhtD-!^+`$*P0B`HokilLd1EuuwhJ?%3wJ~VXIjIE3tj653PExvIVhE& zFMYsI(OX-Q&W$}9gad^PUGuKElCvXxU_s*kx%dH)Bi&$*Q(+9j>(Q>7K1A#|8 zY!G!p0kW29rP*BNHe_wH49bF{K7tymi}Q!Vc_Ox2XjwtpM2SYo7n>?_sB=$c8O5^? z6as!fE9B48FcE`(ruNXP%rAZlDXrFTC7^aoXEX41k)tIq)6kJ*(sr$xVqsh_m3^?? zOR#{GJIr6E0Sz{-( z-R?4asj|!GVl0SEagNH-t|{s06Q3eG{kZOoPHL&Hs0gUkPc&SMY=&{C0&HDI)EHx9 zm#ySWluxwp+b~+K#VG%21%F65tyrt9RTPR$eG0afer6D`M zTW=y!@y6yi#I5V#!I|8IqU=@IfZo!@9*P+f{yLxGu$1MZ%xRY(gRQ2qH@9eMK0`Z> zgO`4DHfFEN8@m@dxYuljsmVv}c4SID+8{kr>d_dLzF$g>urGy9g+=`xAfTkVtz56G zrKNsP$yrDyP=kIqPN9~rVmC-wH672NF7xU>~j5M06Xr&>UJBmOV z%7Ie2d=K=u^D`~i3(U7x?n=h!SCSD1`aFe-sY<*oh+=;B>UVFBOHsF=(Xr(Cai{dL z4S7Y>PHdfG9Iav5FtKzx&UCgg)|DRLvq7!0*9VD`e6``Pgc z1O!qSaNeBBZnDXClh(Dq@XAk?Bd6+_rsFt`5(E+V2c)!Mx4X z47X+QCB4B7$B=Fw1Z1vnHg;x9oDV1YQJAR6Q3}_}BXTFg$A$E!oGG%`Rc()-Ysc%w za(yEn0fw~AaEFr}Rxi;if?Gv)&g~21UzXU9osI9{rNfH$gPTTk#^B|irEc<8W+|9$ zc~R${X2)N!npz1DFVa%nEW)cgPq`MSs)_I*Xwo<+ZK-2^hD(Mc8rF1+2v7&qV;5SET-ygMLNFsb~#u+LpD$uLR1o!ha67gPV5Q{v#PZK5X zUT4aZ{o}&*q7rs)v%*fDTl%}VFX?Oi{i+oKVUBqbi8w#FI%_5;6`?(yc&(Fed4Quy8xsswG+o&R zO1#lUiA%!}61s3jR7;+iO$;1YN;_*yUnJK=$PT_}Q%&0T@2i$ zwGC@ZE^A62YeOS9DU9me5#`(wv24fK=C)N$>!!6V#6rX3xiHehfdvwWJ>_fwz9l)o`Vw9yi z0p5BgvIM5o_ zgo-xaAkS_mya8FXo1Ke4;U*7TGSfm0!fb4{E5Ar8T3p!Z@4;FYT8m=d`C@4-LM121 z?6W@9d@52vxUT-6K_;1!SE%FZHcm0U$SsC%QB zxkTrfH;#Y7OYPy!nt|k^Lgz}uYudos9wI^8x>Y{fTzv9gfTVXN2xH`;Er=rTeAO1x znaaJOR-I)qwD4z%&dDjY)@s`LLSd#FoD!?NY~9#wQRTHpD7Vyyq?tKUHKv6^VE93U zt_&ePH+LM-+9w-_9rvc|>B!oT>_L59nipM-@ITy|x=P%Ezu@Y?N!?jpwP%lm;0V5p z?-$)m84(|7vxV<6f%rK3!(R7>^!EuvA&j@jdTI+5S1E{(a*wvsV}_)HDR&8iuc#>+ zMr^2z*@GTnfDW-QS38OJPR3h6U&mA;vA6Pr)MoT7%NvA`%a&JPi|K8NP$b1QY#WdMt8-CDA zyL0UXNpZ?x=tj~LeM0wk<0Dlvn$rtjd$36`+mlf6;Q}K2{%?%EQ+#FJy6v5cS+Q-~ ztk||Iwr$(CZQHi38QZF;lFFBNt+mg2*V_AhzkM<8#>E_S^xj8%T5tXTytD6f)vePG z^B0Ne-*6Pqg+rVW?%FGHLhl^ycQM-dhNCr)tGC|XyES*NK%*4AnZ!V+Zu?x zV2a82fs8?o?X} zjC1`&uo1Ti*gaP@E43NageV^$Xue3%es2pOrLdgznZ!_a{*`tfA+vnUv;^Ebi3cc$?-kh76PqA zMpL!y(V=4BGPQSU)78q~N}_@xY5S>BavY3Sez-+%b*m0v*tOz6zub9%*~%-B)lb}t zy1UgzupFgf?XyMa+j}Yu>102tP$^S9f7;b7N&8?_lYG$okIC`h2QCT_)HxG1V4Uv{xdA4k3-FVY)d}`cmkePsLScG&~@wE?ix2<(G7h zQ7&jBQ}Kx9mm<0frw#BDYR7_HvY7En#z?&*FurzdDNdfF znCL1U3#iO`BnfPyM@>;#m2Lw9cGn;(5*QN9$zd4P68ji$X?^=qHraP~Nk@JX6}S>2 zhJz4MVTib`OlEAqt!UYobU0-0r*`=03)&q7ubQXrt|t?^U^Z#MEZV?VEin3Nv1~?U zuwwSeR10BrNZ@*h7M)aTxG`D(By$(ZP#UmBGf}duX zhx;7y1x@j2t5sS#QjbEPIj95hV8*7uF6c}~NBl5|hgbB(}M3vnt zu_^>@s*Bd>w;{6v53iF5q7Em>8n&m&MXL#ilSzuC6HTzzi-V#lWoX zBOSBYm|ti@bXb9HZ~}=dlV+F?nYo3?YaV2=N@AI5T5LWWZzwvnFa%w%C<$wBkc@&3 zyUE^8xu<=k!KX<}XJYo8L5NLySP)cF392GK97(ylPS+&b}$M$Y+1VDrJa`GG7+%ToAsh z5NEB9oVv>as?i7f^o>0XCd%2wIaNRyejlFws`bXG$Mhmb6S&shdZKo;p&~b4wv$ z?2ZoM$la+_?cynm&~jEi6bnD;zSx<0BuCSDHGSssT7Qctf`0U!GDwG=+^|-a5%8Ty z&Q!%m%geLjBT*#}t zv1wDzuC)_WK1E|H?NZ&-xr5OX(ukXMYM~_2c;K}219agkgBte_#f+b9Al8XjL-p}1 z8deBZFjplH85+Fa5Q$MbL>AfKPxj?6Bib2pevGxIGAG=vr;IuuC%sq9x{g4L$?Bw+ zvoo`E)3#bpJ{Ij>Yn0I>R&&5B$&M|r&zxh+q>*QPaxi2{lp?omkCo~7ibow#@{0P> z&XBocU8KAP3hNPKEMksQ^90zB1&&b1Me>?maT}4xv7QHA@Nbvt-iWy7+yPFa9G0DP zP82ooqy_ku{UPv$YF0kFrrx3L=FI|AjG7*(paRLM0k1J>3oPxU0Zd+4&vIMW>h4O5G zej2N$(e|2Re z@8xQ|uUvbA8QVXGjZ{Uiolxb7c7C^nW`P(m*Jkqn)qdI0xTa#fcK7SLp)<86(c`A3 zFNB4y#NHe$wYc7V)|=uiW8gS{1WMaJhDj4xYhld;zJip&uJ{Jg3R`n+jywDc*=>bW zEqw(_+j%8LMRrH~+M*$V$xn9x9P&zt^evq$P`aSf-51`ZOKm(35OEUMlO^$>%@b?a z>qXny!8eV7cI)cb0lu+dwzGH(Drx1-g+uDX;Oy$cs+gz~?LWif;#!+IvPR6fa&@Gj zwz!Vw9@-Jm1QtYT?I@JQf%`=$^I%0NK9CJ75gA}ff@?I*xUD7!x*qcyTX5X+pS zAVy4{51-dHKs*OroaTy;U?zpFS;bKV7wb}8v+Q#z<^$%NXN(_hG}*9E_DhrRd7Jqp zr}2jKH{avzrpXj?cW{17{kgKql+R(Ew55YiKK7=8nkzp7Sx<956tRa(|yvHlW zNO7|;GvR(1q}GrTY@uC&ow0me|8wE(PzOd}Y=T+Ih8@c2&~6(nzQrK??I7DbOguA9GUoz3ASU%BFCc8LBsslu|nl>q8Ag(jA9vkQ`q2amJ5FfA7GoCdsLW znuok(diRhuN+)A&`rH{$(HXWyG2TLXhVDo4xu?}k2cH7QsoS>sPV)ylb45Zt&_+1& zT)Yzh#FHRZ-z_Q^8~IZ+G~+qSw-D<{0NZ5!J1%rAc`B23T98TMh9ylkzdk^O?W`@C??Z5U9#vi0d<(`?9fQvNN^ji;&r}geU zSbKR5Mv$&u8d|iB^qiLaZQ#@)%kx1N;Og8Js>HQD3W4~pI(l>KiHpAv&-Ev45z(vYK<>p6 z6#pU(@rUu{i9UngMhU&FI5yeRub4#u=9H+N>L@t}djC(Schr;gc90n%)qH{$l0L4T z;=R%r>CuxH!O@+eBR`rBLrT0vnP^sJ^+qE^C8ZY0-@te3SjnJ)d(~HcnQw@`|qAp|Trrs^E*n zY1!(LgVJfL?@N+u{*!Q97N{Uu)ZvaN>hsM~J?*Qvqv;sLnXHjKrtG&x)7tk?8%AHI zo5eI#`qV1{HmUf-Fucg1xn?Kw;(!%pdQ)ai43J3NP4{%x1D zI0#GZh8tjRy+2{m$HyI(iEwK30a4I36cSht3MM85UqccyUq6$j5K>|w$O3>`Ds;`0736+M@q(9$(`C6QZQ-vAKjIXKR(NAH88 zwfM6_nGWlhpy!_o56^BU``%TQ%tD4hs2^<2pLypjAZ;W9xAQRfF_;T9W-uidv{`B z{)0udL1~tMg}a!hzVM0a_$RbuQk|EG&(z*{nZXD3hf;BJe4YxX8pKX7VaIjjDP%sk zU5iOkhzZ&%?A@YfaJ8l&H;it@;u>AIB`TkglVuy>h;vjtq~o`5NfvR!ZfL8qS#LL` zD!nYHGzZ|}BcCf8s>b=5nZRYV{)KK#7$I06s<;RyYC3<~`mob_t2IfR*dkFJyL?FU zvuo-EE4U(-le)zdgtW#AVA~zjx*^80kd3A#?vI63pLnW2{j*=#UG}ISD>=ZGA$H&` z?Nd8&11*4`%MQlM64wfK`{O*ad5}vk4{Gy}F98xIAsmjp*9P=a^yBHBjF2*Iibo2H zGJAMFDjZcVd%6bZ`dz;I@F55VCn{~RKUqD#V_d{gc|Z|`RstPw$>Wu+;SY%yf1rI=>51Oolm>cnjOWHm?ydcgGs_kPUu=?ZKtQS> zKtLS-v$OMWXO>B%Z4LFUgw4MqA?60o{}-^6tf(c0{Y3|yF##+)RoXYVY-lyPhgn{1 z>}yF0Ab}D#1*746QAj5c%66>7CCWs8O7_d&=Ktu!SK(m}StvvBT1$8QP3O2a*^BNA z)HPhmIi*((2`?w}IE6Fo-SwzI_F~OC7OR}guyY!bOQfpNRg3iMvsFPYb9-;dT6T%R zhLwIjgiE^-9_4F3eMHZ3LI%bbOmWVe{SONpujQ;3C+58=Be4@yJK>3&@O>YaSdrevAdCLMe_tL zl8@F}{Oc!aXO5!t!|`I zdC`k$5z9Yf%RYJp2|k*DK1W@AN23W%SD0EdUV^6~6bPp_HZi0@dku_^N--oZv}wZA zH?Bf`knx%oKB36^L;P%|pf#}Tp(icw=0(2N4aL_Ea=9DMtF})2ay68V{*KfE{O=xL zf}tcfCL|D$6g&_R;r~1m{+)sutQPKzVv6Zw(%8w&4aeiy(qct1x38kiqgk!0^^X3IzI2ia zxI|Q)qJNEf{=I$RnS0`SGMVg~>kHQB@~&iT7+eR!Ilo1ZrDc3TVW)CvFFjHK4K}Kh z)dxbw7X%-9Ol&Y4NQE~bX6z+BGOEIIfJ~KfD}f4spk(m62#u%k<+iD^`AqIhWxtKGIm)l$7=L`=VU0Bz3-cLvy&xdHDe-_d3%*C|Q&&_-n;B`87X zDBt3O?Wo-Hg6*i?f`G}5zvM?OzQjkB8uJhzj3N;TM5dSM$C@~gGU7nt-XX_W(p0IA6$~^cP*IAnA<=@HVqNz=Dp#Rcj9_6*8o|*^YseK_4d&mBY*Y&q z8gtl;(5%~3Ehpz)bLX%)7|h4tAwx}1+8CBtu9f5%^SE<&4%~9EVn4*_!r}+{^2;} zwz}#@Iw?&|8F2LdXUIjh@kg3QH69tqxR_FzA;zVpY=E zcHnWh(3j3UXeD=4m_@)Ea4m#r?axC&X%#wC8FpJPDYR~@65T?pXuWdPzEqXP>|L`S zKYFF0I~%I>SFWF|&sDsRdXf$-TVGSoWTx7>7mtCVUrQNVjZ#;Krobgh76tiP*0(5A zs#<7EJ#J`Xhp*IXB+p5{b&X3GXi#b*u~peAD9vr0*Vd&mvMY^zxTD=e(`}ybDt=BC(4q)CIdp>aK z0c?i@vFWjcbK>oH&V_1m_EuZ;KjZSiW^i30U` zGLK{%1o9TGm8@gy+Rl=-5&z`~Un@l*2ne3e9B+>wKyxuoUa1qhf?-Pi= zZLCD-b7*(ybv6uh4b`s&Ol3hX2ZE<}N@iC+h&{J5U|U{u$XK0AJz)!TSX6lrkG?ris;y{s zv`B5Rq(~G58?KlDZ!o9q5t%^E4`+=ku_h@~w**@jHV-+cBW-`H9HS@o?YUUkKJ;AeCMz^f@FgrRi@?NvO3|J zBM^>4Z}}!vzNum!R~o0)rszHG(eeq!#C^wggTgne^2xc9nIanR$pH1*O;V>3&#PNa z7yoo?%T(?m-x_ow+M0Bk!@ow>A=skt&~xK=a(GEGIWo4AW09{U%(;CYLiQIY$bl3M zxC_FGKY%J`&oTS{R8MHVe{vghGEshWi!(EK*DWmoOv|(Ff#(bZ-<~{rc|a%}Q4-;w z{2gca97m~Nj@Nl{d)P`J__#Zgvc@)q_(yfrF2yHs6RU8UXxcU(T257}E#E_A}%2_IW?%O+7v((|iQ{H<|$S7w?;7J;iwD>xbZc$=l*(bzRXc~edIirlU0T&0E_EXfS5%yA zs0y|Sp&i`0zf;VLN=%hmo9!aoLGP<*Z7E8GT}%)cLFs(KHScNBco(uTubbxCOD_%P zD7XlHivrSWLth7jf4QR9`jFNk-7i%v4*4fC*A=;$Dm@Z^OK|rAw>*CI%E z3%14h-)|Q%_$wi9=p!;+cQ*N1(47<49TyB&B*bm_m$rs+*ztWStR~>b zE@V06;x19Y_A85N;R+?e?zMTIqdB1R8>(!4_S!Fh={DGqYvA0e-P~2DaRpCYf4$-Q z*&}6D!N_@s`$W(|!DOv%>R0n;?#(HgaI$KpHYpnbj~I5eeI(u4CS7OJajF%iKz)*V zt@8=9)tD1ML_CrdXQ81bETBeW!IEy7mu4*bnU--kK;KfgZ>oO>f)Sz~UK1AW#ZQ_ic&!ce~@(m2HT@xEh5u%{t}EOn8ET#*U~PfiIh2QgpT z%gJU6!sR2rA94u@xj3%Q`n@d}^iMH#X>&Bax+f4cG7E{g{vlJQ!f9T5wA6T`CgB%6 z-9aRjn$BmH=)}?xWm9bf`Yj-f;%XKRp@&7?L^k?OT_oZXASIqbQ#eztkW=tmRF$~% z6(&9wJuC-BlGrR*(LQKx8}jaE5t`aaz#Xb;(TBK98RJBjiqbZFyRNTOPA;fG$;~e` zsd6SBii3^(1Y`6^#>kJ77xF{PAfDkyevgox`qW`nz1F`&w*DH5Oh1idOTLES>DToi z8Qs4|?%#%>yuQO1#{R!-+2AOFznWo)e3~_D!nhoDgjovB%A8< zt%c^KlBL$cDPu!Cc`NLc_8>f?)!FGV7yudL$bKj!h;eOGkd;P~sr6>r6TlO{Wp1%xep8r1W{`<4am^(U} z+nCDP{Z*I?IGBE&*KjiaR}dpvM{ZFMW%P5Ft)u$FD373r2|cNsz%b0uk1T+mQI@4& zFF*~xDxDRew1Bol-*q>F{Xw8BUO;>|0KXf`lv7IUh%GgeLUzR|_r(TXZTbfXFE0oc zmGMwzNFgkdg><=+3MnncRD^O`m=SxJ6?}NZ8BR)=ag^b4Eiu<_bN&i0wUaCGi60W6 z%iMl&`h8G)y`gfrVw$={cZ)H4KSQO`UV#!@@cDx*hChXJB7zY18EsIo1)tw0k+8u; zg(6qLysbxVbLFbkYqKbEuc3KxTE+%j5&k>zHB8_FuDcOO3}FS|eTxoUh2~|Bh?pD| zsmg(EtMh`@s;`(r!%^xxDt(5wawK+*jLl>_Z3shaB~vdkJ!V3RnShluzmwn7>PHai z3avc`)jZSAvTVC6{2~^CaX49GXMtd|sbi*swkgoyLr=&yp!ASd^mIC^D;a|<=3pSt zM&0u%#%DGzlF4JpMDs~#kU;UCtyW+d3JwNiu`Uc7Yi6%2gfvP_pz8I{Q<#25DjM_D z(>8yI^s@_tG@c=cPoZImW1CO~`>l>rs=i4BFMZT`vq5bMOe!H@8q@sEZX<-kiY&@u3g1YFc zc@)@OF;K-JjI(eLs~hy8qOa9H1zb!3GslI!nH2DhP=p*NLHeh^9WF?4Iakt+b( z-4!;Q-8c|AX>t+5I64EKpDj4l2x*!_REy9L_9F~i{)1?o#Ws{YG#*}lg_zktt#ZlN zmoNsGm7$AXLink`GWtY*TZEH!J9Qv+A1y|@>?&(pb(6XW#ZF*}x*{60%wnt{n8Icp zq-Kb($kh6v_voqvA`8rq!cgyu;GaWZ>C2t6G5wk! zcKTlw=>KX3ldU}a1%XESW71))Z=HW%sMj2znJ;fdN${00DGGO}d+QsTQ=f;BeZ`eC~0-*|gn$9G#`#0YbT(>O(k&!?2jI z&oi9&3n6Vz<4RGR}h*1ggr#&0f%Op(6{h>EEVFNJ0C>I~~SmvqG+{RXDrexBz zw;bR@$Wi`HQ3e*eU@Cr-4Z7g`1R}>3-Qej(#Dmy|CuFc{Pg83Jv(pOMs$t(9vVJQJ zXqn2Ol^MW;DXq!qM$55vZ{JRqg!Q1^Qdn&FIug%O3=PUr~Q`UJuZ zc`_bE6i^Cp_(fka&A)MsPukiMyjG$((zE$!u>wyAe`gf-1Qf}WFfi1Y{^ zdCTTrxqpQE#2BYWEBnTr)u-qGSVRMV7HTC(x zb(0FjYH~nW07F|{@oy)rlK6CCCgyX?cB;19Z(bCP5>lwN0UBF}Ia|L0$oGHl-oSTZ zr;(u7nDjSA03v~XoF@ULya8|dzH<2G=n9A)AIkQKF0mn?!BU(ipengAE}6r`CE!jd z=EcX8exgDZZQ~~fgxR-2yF;l|kAfnjhz|i_o~cYRdhnE~1yZ{s zG!kZJ<-OVnO{s3bOJK<)`O;rk>=^Sj3M76Nqkj<_@Jjw~iOkWUCL+*Z?+_Jvdb!0cUBy=(5W9H-r4I zxAFts>~r)B>KXdQANyaeKvFheZMgoq4EVV0|^NR@>ea* zh%<78{}wsdL|9N1!jCN-)wH4SDhl$MN^f_3&qo?>Bz#?c{ne*P1+1 z!a`(2Bxy`S^(cw^dv{$cT^wEQ5;+MBctgPfM9kIQGFUKI#>ZfW9(8~Ey-8`OR_XoT zflW^mFO?AwFWx9mW2-@LrY~I1{dlX~jBMt!3?5goHeg#o0lKgQ+eZcIheq@A&dD}GY&1c%hsgo?z zH>-hNgF?Jk*F0UOZ*bs+MXO(dLZ|jzKu5xV1v#!RD+jRrHdQ z>>b){U(I@i6~4kZXn$rk?8j(eVKYJ2&k7Uc`u01>B&G@c`P#t#x@>Q$N$1aT514fK zA_H8j)UKen{k^ehe%nbTw}<JV6xN_|| z(bd-%aL}b z3VITE`N~@WlS+cV>C9TU;YfsU3;`+@hJSbG6aGvis{Gs%2K|($)(_VfpHB|DG8Nje+0tCNW%_cu3hk0F)~{-% zW{2xSu@)Xnc`Dc%AOH)+LT97ImFR*WekSnJ3OYIs#ijP4TD`K&7NZKsfZ;76k@VD3py?pSw~~r^VV$Z zuUl9lF4H2(Qga0EP_==vQ@f!FLC+Y74*s`Ogq|^!?RRt&9e9A&?Tdu=8SOva$dqgYU$zkKD3m>I=`nhx-+M;-leZgt z8TeyQFy`jtUg4Ih^JCUcq+g_qs?LXSxF#t+?1Jsr8c1PB#V+f6aOx@;ThTIR4AyF5 z3m$Rq(6R}U2S}~Bn^M0P&Aaux%D@ijl0kCCF48t)+Y`u>g?|ibOAJoQGML@;tn{%3IEMaD(@`{7ByXQ`PmDeK*;W?| zI8%%P8%9)9{9DL-zKbDQ*%@Cl>Q)_M6vCs~5rb(oTD%vH@o?Gk?UoRD=C-M|w~&vb z{n-B9>t0EORXd-VfYC>sNv5vOF_Wo5V)(Oa%<~f|EU7=npanpVX^SxPW;C!hMf#kq z*vGNI-!9&y!|>Zj0V<~)zDu=JqlQu+ii387D-_U>WI_`3pDuHg{%N5yzU zEulPN)%3&{PX|hv*rc&NKe(bJLhH=GPuLk5pSo9J(M9J3v)FxCo65T%9x<)x+&4Rr2#nu2?~Glz|{28OV6 z)H^`XkUL|MG-$XE=M4*fIPmeR2wFWd>5o*)(gG^Y>!P4(f z68RkX0cRBOFc@`W-IA(q@p@m>*2q-`LfujOJ8-h$OgHte;KY4vZKTxO95;wh#2ZDL zKi8aHkz2l54lZd81t`yY$Tq_Q2_JZ1d(65apMg}vqwx=ceNOWjFB)6m3Q!edw2<{O z4J6+Un(E8jxs-L-K_XM_VWahy zE+9fm_ZaxjNi{fI_AqLKqhc4IkqQ4`Ut$=0L)nzlQw^%i?bP~znsbMY3f}*nPWqQZ zz_CQDpZ?Npn_pEr`~SX1`OoSkS;bmzQ69y|W_4bH3&U3F7EBlx+t%2R02VRJ01cfX zo$$^ObDHK%bHQaOcMpCq@@Jp8!OLYVQO+itW1ZxlkmoG#3FmD4b61mZjn4H|pSmYi2YE;I#@jtq8Mhjdgl!6({gUsQA>IRXb#AyWVt7b=(HWGUj;wd!S+q z4S+H|y<$yPrrrTqQHsa}H`#eJFV2H5Dd2FqFMA%mwd`4hMK4722|78d(XV}rz^-GV(k zqsQ>JWy~cg_hbp0=~V3&TnniMQ}t#INg!o2lN#H4_gx8Tn~Gu&*ZF8#kkM*5gvPu^ zw?!M^05{7q&uthxOn?%#%RA_%y~1IWly7&_-sV!D=Kw3DP+W)>YYRiAqw^d7vG_Q%v;tRbE1pOBHc)c&_5=@wo4CJTJ1DeZErEvP5J(kc^GnGYX z|LqQjTkM{^gO2cO#-(g!7^di@$J0ibC(vsnVkHt3osnWL8?-;R1BW40q5Tmu_9L-s z7fNF5fiuS-%B%F$;D97N-I@!~c+J>nv%mzQ5vs?1MgR@XD*Gv`A{s8 z5Cr>z5j?|sb>n=c*xSKHpdy667QZT?$j^Doa%#m4ggM@4t5Oe%iW z@w~j_B>GJJkO+6dVHD#CkbC(=VMN8nDkz%44SK62N(ZM#AsNz1KW~3(i=)O;q5JrK z?vAVuL}Rme)OGQuLn8{3+V352UvEBV^>|-TAAa1l-T)oiYYD&}Kyxw73shz?Bn})7 z_a_CIPYK(zMp(i+tRLjy4dV#CBf3s@bdmwXo`Y)dRq9r9-c@^2S*YoNOmAX%@OYJOXs zT*->in!8Ca_$W8zMBb04@|Y)|>WZ)-QGO&S7Zga1(1#VR&)X+MD{LEPc%EJCXIMtr z1X@}oNU;_(dfQ_|kI-iUSTKiVzcy+zr72kq)TIp(GkgVyd%{8@^)$%G)pA@^Mfj71FG%d?sf(2Vm>k%X^RS`}v0LmwIQ7!_7cy$Q8pT?X1VWecA_W68u==HbrU& z@&L6pM0@8ZHL?k{6+&ewAj%grb6y@0$3oamTvXsjGmPL_$~OpIyIq%b$(uI1VKo zk_@{r>1p84UK3}B>@d?xUZ}dJk>uEd+-QhwFQ`U?rA=jj+$w8sD#{492P}~R#%z%0 z5dlltiAaiPKv9fhjmuy{*m!C22$;>#85EduvdSrFES{QO$bHpa7E@&{bWb@<7VhTF zXCFS_wB>7*MjJ3$_i4^A2XfF2t7`LOr3B@??OOUk=4fKkaHne4RhI~Lm$JrHfUU*h zgD9G66;_F?3>0W{pW2A^DR7Bq`ZUiSc${S8EM>%gFIqAw0du4~kU#vuCb=$I_PQv? zZfEY7X6c{jJZ@nF&T>4oyy(Zr_XqnMq)ZtGPASbr?IhZOnL|JKY()`eo=P5UK9(P-@ zOJKFogtk|pscVD+#$7KZs^K5l4gC}*CTd0neZ8L(^&1*bPrCp23%{VNp`4Ld*)Fly z)b|zb*bCzp?&X3_=qLT&0J+=p01&}9*xbk~^hd^@mV!Ha`1H+M&60QH2c|!Ty`RepK|H|Moc5MquD z=&$Ne3%WX+|7?iiR8=7*LW9O3{O%Z6U6`VekeF8lGr5vd)rsZu@X#5!^G1;nV60cz zW?9%HgD}1G{E(YvcLcIMQR65BP50)a;WI*tjRzL7diqRqh$3>OK{06VyC=pj6OiardshTnYfve5U>Tln@y{DC99f!B4> zCrZa$B;IjDrg}*D5l=CrW|wdzENw{q?oIj!Px^7DnqAsU7_=AzXxoA;4(YvN5^9ag zwEd4-HOlO~R0~zk>!4|_Z&&q}agLD`Nx!%9RLC#7fK=w06e zOK<>|#@|e2zjwZ5aB>DJ%#P>k4s0+xHJs@jROvoDQfSoE84l8{9y%5^POiP+?yq0> z7+Ymbld(s-4p5vykK@g<{X*!DZt1QWXKGmj${`@_R~=a!qPzB357nWW^KmhV!^G3i zsYN{2_@gtzsZH*FY!}}vNDnqq>kc(+7wK}M4V*O!M&GQ|uj>+8!Q8Ja+j3f*MzwcI z^s4FXGC=LZ?il4D+Y^f89wh!d7EU-5dZ}}>_PO}jXRQ@q^CjK-{KVnmFd_f&IDKmx zZ5;PDLF%_O);<4t`WSMN;Ec^;I#wU?Z?_R|Jg`#wbq;UM#50f@7F?b7ySi-$C-N;% zqXowTcT@=|@~*a)dkZ836R=H+m6|fynm#0Y{KVyYU=_*NHO1{=Eo{^L@wWr7 zjz9GOu8Fd&v}a4d+}@J^9=!dJRsCO@=>K6UCM)Xv6};tb)M#{(k!i}_0Rjq z2kb7wPcNgov%%q#(1cLykjrxAg)By+3QueBR>Wsep&rWQHq1wE!JP+L;q+mXts{j@ zOY@t9BFmofApO0k@iBFPeKsV3X=|=_t65QyohXMSfMRr7Jyf8~ogPVmJwbr@`nmml zov*NCf;*mT(5s4K=~xtYy8SzE66W#tW4X#RnN%<8FGCT{z#jRKy@Cy|!yR`7dsJ}R z!eZzPCF+^b0qwg(mE=M#V;Ud9)2QL~ z-r-2%0dbya)%ui_>e6>O3-}4+Q!D+MU-9HL2tH)O`cMC1^=rA=q$Pcc;Zel@@ss|K zH*WMdS^O`5Uv1qNTMhM(=;qjhaJ|ZC41i2!kt4;JGlXQ$tvvF8Oa^C@(q6(&6B^l) zNG{GaX?`qROHwL-F1WZDEF;C6Inuv~1&ZuP3j53547P38tr|iPH#3&hN*g0R^H;#) znft`cw0+^Lwe{!^kQat+xjf_$SZ05OD6~U`6njelvd+4pLZU(0ykS5&S$)u?gm!;} z+gJ8g12b1D4^2HH!?AHFAjDAP^q)Juw|hZfIv{3Ryn%4B^-rqIF2 zeWk^za4fq#@;re{z4_O|Zj&Zn{2WsyI^1%NW=2qA^iMH>u>@;GAYI>Bk~u0wWQrz* zdEf)7_pSYMg;_9^qrCzvv{FZYwgXK}6e6ceOH+i&+O=x&{7aRI(oz3NHc;UAxMJE2 zDb0QeNpm$TDcshGWs!Zy!shR$lC_Yh-PkQ`{V~z!AvUoRr&BAGS#_*ZygwI2-)6+a zq|?A;+-7f0Dk4uuht z6sWPGl&Q$bev1b6%aheld88yMmBp2j=z*egn1aAWd?zN=yEtRDGRW&nmv#%OQwuJ; zqKZ`L4DsqJwU{&2V9f>2`1QP7U}`6)$qxTNEi`4xn!HzIY?hDnnJZw+mFnVSry=bLH7ar+M(e9h?GiwnOM?9ZJcTJ08)T1-+J#cr&uHhXkiJ~}&(}wvzCo33 zLd_<%rRFQ3d5fzKYQy41<`HKk#$yn$Q+Fx-?{3h72XZrr*uN!5QjRon-qZh9-uZ$rWEKZ z!dJMP`hprNS{pzqO`Qhx`oXGd{4Uy0&RDwJ`hqLw4v5k#MOjvyt}IkLW{nNau8~XM z&XKeoVYreO=$E%z^WMd>J%tCdJx5-h+8tiawu2;s& zD7l`HV!v@vcX*qM(}KvZ#%0VBIbd)NClLBu-m2Scx1H`jyLYce;2z;;eo;ckYlU53 z9JcQS+CvCwj*yxM+e*1Vk6}+qIik2VzvUuJyWyO}piM1rEk%IvS;dsXOIR!#9S;G@ zPcz^%QTf9D<2~VA5L@Z@FGQqwyx~Mc-QFzT4Em?7u`OU!PB=MD8jx%J{<`tH$Kcxz zjIvb$x|`s!-^^Zw{hGV>rg&zb;=m?XYAU0LFw+uyp8v@Y)zmjj&Ib7Y1@r4`cfrS%cVxJiw`;*BwIU*6QVsBBL;~nw4`ZFqs z1YSgLVy=rvA&GQB4MDG+j^)X1N=T;Ty2lE-`zrg(dNq?=Q`nCM*o8~A2V~UPArX<| zF;e$5B0hPSo56=ePVy{nah#?e-Yi3g*z6iYJ#BFJ-5f0KlQ-PRiuGwe29fyk1T6>& zeo2lvb%h9Vzi&^QcVNp}J!x&ubtw5fKa|n2XSMlg#=G*6F|;p)%SpN~l8BaMREDQN z-c9O}?%U1p-ej%hzIDB!W_{`9lS}_U==fdYpAil1E3MQOFW^u#B)Cs zTE3|YB0bKpXuDKR9z&{4gNO3VHDLB!xxPES+)yaJxo<|}&bl`F21};xsQnc!*FPZA zSct2IU3gEu@WQKmY-vA5>MV?7W|{$rAEj4<8`*i)<%fj*gDz2=ApqZ&MP&0UmO1?q!GN=di+n(#bB_mHa z(H-rIOJqamMfwB%?di!TrN=x~0jOJtvb0e9uu$ZCVj(gJyK}Fa5F2S?VE30P{#n3eMy!-v7e8viCooW9cfQx%xyPNL*eDKL zB=X@jxulpkLfnar7D2EeP*0L7c9urDz{XdV;@tO;u`7DlN7#~ zAKA~uM2u8_<5FLkd}OzD9K zO5&hbK8yakUXn8r*H9RE zO9Gsipa2()=&x=1mnQtNP#4m%GXThu8Ccqx*qb;S{5}>bU*V5{SY~(Hb={cyTeaTM zMEaKedtJf^NnJrwQ^Bd57vSlJ3l@$^0QpX@_1>h^+js8QVpwOiIMOiSC_>3@dt*&| zV?0jRdlgn|FIYam0s)a@5?0kf7A|GD|dRnP1=B!{ldr;N5s)}MJ=i4XEqlC}w)LEJ}7f9~c!?It(s zu>b=YBlFRi(H-%8A!@Vr{mndRJ z_jx*?BQpK>qh`2+3cBJhx;>yXPjv>dQ0m+nd4nl(L;GmF-?XzlMK zP(Xeyh7mFlP#=J%i~L{o)*sG7H5g~bnL2Hn3y!!r5YiYRzgNTvgL<(*g5IB*gcajK z86X3LoW*5heFmkIQ-I_@I_7b!Xq#O;IzOv(TK#(4gd)rmCbv5YfA4koRfLydaIXUU z8(q?)EWy!sjsn-oyUC&uwJqEXdlM}#tmD~*Ztav=mTQyrw0^F=1I5lj*}GSQTQOW{ z=O12;?fJfXxy`)ItiDB@0sk43AZo_sRn*jc#S|(2*%tH84d|UTYN!O4R(G6-CM}84 zpiyYJ^wl|w@!*t)dwn0XJv2kuHgbfNL$U6)O-k*~7pQ?y=sQJdKk5x`1>PEAxjIWn z{H$)fZH4S}%?xzAy1om0^`Q$^?QEL}*ZVQK)NLgmnJ`(we z21c23X1&=^>k;UF-}7}@nzUf5HSLUcOYW&gsqUrj7%d$)+d8ZWwTZq)tOgc%fz95+ zl%sdl)|l|jXfqIcjKTFrX74Rbq1}osA~fXPSPE?XO=__@`7k4Taa!sHE8v-zfx(AM zXT_(7u;&_?4ZIh%45x>p!(I&xV|IE**qbqCRGD5aqLpCRvrNy@uT?iYo-FPpu`t}J zSTZ}MDrud+`#^14r`A%UoMvN;raizytxMBV$~~y3i0#m}0F}Dj_fBIz+)1RWdnctP z>^O^vd0E+jS+$V~*`mZWER~L^q?i-6RPxxufWdrW=%prbCYT{5>Vgu%vPB)~NN*2L zB?xQg2K@+Xy=sPh$%10LH!39p&SJG+3^i*lFLn=uY8Io6AXRZf;p~v@1(hWsFzeKzx99_{w>r;cypkPVJCKtLGK>?-K0GE zGH>$g?u`)U_%0|f#!;+E>?v>qghuBwYZxZ*Q*EE|P|__G+OzC-Z+}CS(XK^t!TMoT zc+QU|1C_PGiVp&_^wMxfmMAuJDQ%1p4O|x5DljN6+MJiO%8s{^ts8$uh5`N~qK46c`3WY#hRH$QI@*i1OB7qBIN*S2gK#uVd{ zik+wwQ{D)g{XTGjKV1m#kYhmK#?uy)g@idi&^8mX)Ms`^=hQGY)j|LuFr8SJGZjr| zzZf{hxYg)-I^G|*#dT9Jj)+wMfz-l7ixjmwHK9L4aPdXyD-QCW!2|Jn(<3$pq-BM; zs(6}egHAL?8l?f}2FJSkP`N%hdAeBiD{3qVlghzJe5s9ZUMd`;KURm_eFaK?d&+TyC88v zCv2R(Qg~0VS?+p+l1e(aVq`($>|0b{{tPNbi} zaZDffTZ7N|t2D5DBv~aX#X+yGagWs1JRsqbr4L8a`B`m) z1p9?T`|*8ZXHS7YD8{P1Dk`EGM`2Yjsy0=7M&U6^VO30`Gx!ZkUoqmc3oUbd&)V*iD08>dk=#G!*cs~^tOw^s8YQqYJ z!5=-4ZB7rW4mQF&YZw>T_in-c9`0NqQ_5Q}fq|)%HECgBd5KIo`miEcJ>~a1e2B@) zL_rqoQ;1MowD34e6#_U+>D`WcnG5<2Q6cnt4Iv@NC$*M+i3!c?6hqPJLsB|SJ~xo! zm>!N;b0E{RX{d*in3&0w!cmB&TBNEjhxdg!fo+}iGE*BWV%x*46rT@+cXU;leofWy zxst{S8m!_#hIhbV7wfWN#th8OI5EUr3IR_GOIzBgGW1u4J*TQxtT7PXp#U#EagTV* zehVkBFF06`@5bh!t%L)-)`p|d7D|^kED7fsht#SN7*3`MKZX};Jh0~nCREL_BGqNR zxpJ4`V{%>CAqEE#Dt95u=;Un8wLhrac$fao`XlNsOH%&Ey2tK&vAcriS1kXnntDuttcN{%YJz@!$T zD&v6ZQ>zS1`o!qT=JK-Y+^i~bZkVJpN8%<4>HbuG($h9LP;{3DJF_Jcl8CA5M~<3s^!$Sg62zLEnJtZ z0`)jwK75Il6)9XLf(64~`778D6-#Ie1IR2Ffu+_Oty%$8u+bP$?803V5W6%(+iZzp zp5<&sBV&%CJcXUIATUakP1czt$&0x$lyoLH!ueNaIpvtO z*eCijxOv^-D?JaLzH<3yhOfDENi@q#4w(#tl-19(&Yc2K%S8Y&r{3~-)P17sC1{rQ zOy>IZ6%814_UoEi+w9a4XyGXF66{rgE~UT)oT4x zg9oIx@|{KL#VpTyE=6WK@Sbd9RKEEY)5W{-%0F^6(QMuT$RQRZ&yqfyF*Z$f8>{iT zq(;UzB-Ltv;VHvh4y%YvG^UEkvpe9ugiT97ErbY0ErCEOWs4J=kflA!*Q}gMbEP`N zY#L`x9a?E)*~B~t+7c8eR}VY`t}J;EWuJ-6&}SHnNZ8i0PZT^ahA@@HXk?c0{)6rC zP}I}_KK7MjXqn1E19gOwWvJ3i9>FNxN67o?lZy4H?n}%j|Dq$p%TFLUPJBD;R|*0O z3pLw^?*$9Ax!xy<&fO@;E2w$9nMez{5JdFO^q)B0OmGwkxxaDsEU+5C#g+?Ln-Vg@ z-=z4O*#*VJa*nujGnGfK#?`a|xfZsuiO+R}7y(d60@!WUIEUt>K+KTI&I z9YQ6#hVCo}0^*>yr-#Lisq6R?uI=Ms!J7}qm@B}Zu zp%f-~1Cf!-5S0xXl`oqq&fS=tt0`%dDWI&6pW(s zJXtYiY&~t>k5I0RK3sN;#8?#xO+*FeK#=C^%{Y>{k{~bXz%(H;)V5)DZRk~(_d0b6 zV!x54fwkl`1y;%U;n|E#^Vx(RGnuN|T$oJ^R%ZmI{8(9>U-K^QpDcT?Bb@|J0NAfvHtL#wP ziYupr2E5=_KS{U@;kyW7oy*+UTOiF*e+EhYqVcV^wx~5}49tBNSUHLH1=x}6L2Fl^4X4633$k!ZHZTL50Vq+a5+ z<}uglXQ<{x&6ey)-lq6;4KLHbR)_;Oo^FodsYSw3M-)FbLaBcPI=-ao+|))T2ksKb z{c%Fu`HR1dqNw8%>e0>HI2E_zNH1$+4RWfk}p-h(W@)7LC zwVnUO17y+~kw35CxVtokT44iF$l8XxYuetp)1Br${@lb(Q^e|q*5%7JNxp5B{r<09 z-~8o#rI1(Qb9FhW-igcsC6npf5j`-v!nCrAcVx5+S&_V2D>MOWp6cV$~Olhp2`F^Td{WV`2k4J`djb#M>5D#k&5XkMu*FiO(uP{SNX@(=)|Wm`@b> z_D<~{ip6@uyd7e3Rn+qM80@}Cl35~^)7XN?D{=B-4@gO4mY%`z!kMIZizhGtCH-*7 z{a%uB4usaUoJwbkVVj%8o!K^>W=(ZzRDA&kISY?`^0YHKe!()(*w@{w7o5lHd3(Us zUm-K=z&rEbOe$ackQ3XH=An;Qyug2g&vqf;zsRBldxA+=vNGoM$Zo9yT?Bn?`Hkiq z&h@Ss--~+=YOe@~JlC`CdSHy zcO`;bgMASYi6`WSw#Z|A;wQgH@>+I3OT6(*JgZZ_XQ!LrBJfVW2RK%#02|@V|H4&8DqslU6Zj(x!tM{h zRawG+Vy63_8gP#G!Eq>qKf(C&!^G$01~baLLk#)ov-Pqx~Du>%LHMv?=WBx2p2eV zbj5fjTBhwo&zeD=l1*o}Zs%SMxEi9yokhbHhY4N!XV?t8}?!?42E-B^Rh&ABFxovs*HeQ5{{*)SrnJ%e{){Z_#JH+jvwF7>Jo zE+qzWrugBwVOZou~oFa(wc7?`wNde>~HcC@>fA^o>ll?~aj-e|Ju z+iJzZg0y1@eQ4}rm`+@hH(|=gW^;>n>ydn!8%B4t7WL)R-D>mMw<7Wz6>ulFnM7QA ze2HEqaE4O6jpVq&ol3O$46r+DW@%glD8Kp*tFY#8oiSyMi#yEpVIw3#t?pXG?+H>v z$pUwT@0ri)_Bt+H(^uzp6qx!P(AdAI_Q?b`>0J?aAKTPt>73uL2(WXws9+T|%U)Jq zP?Oy;y6?{%J>}?ZmfcnyIQHh_jL;oD$`U#!v@Bf{5%^F`UiOX%)<0DqQ^nqA5Ac!< z1DPO5C>W0%m?MN*x(k>lDT4W3;tPi=&yM#Wjwc5IFNiLkQf`7GN+J*MbB4q~HVePM zeDj8YyA*btY&n!M9$tuOxG0)2um))hsVsY+(p~JnDaT7x(s2If0H_iRSju7!z7p|8 zzI`NV!1hHWX3m)?t68k6yNKvop{Z>kl)f5GV(~1InT4%9IxqhDX-rgj)Y|NYq_NTlZgz-)=Y$=x9L7|k0=m@6WQ<4&r=BX@pW25NtCI+N{e&`RGSpR zeb^`@FHm5?pWseZ6V08{R(ki}--13S2op~9Kzz;#cPgL}Tmrqd+gs(fJLTCM8#&|S z^L+7PbAhltJDyyxAVxqf(2h!RGC3$;hX@YNz@&JRw!m5?Q)|-tZ8u0D$4we+QytG^ zj0U_@+N|OJlBHdWPN!K={a$R1Zi{2%5QD}s&s-Xn1tY1cwh)8VW z$pjq>8sj4)?76EJs6bA0E&pfr^Vq`&Xc;Tl2T!fm+MV%!H|i0o;7A=zE?dl)-Iz#P zSY7QRV`qRc6b&rON`BValC01zSLQpVemH5y%FxK8m^PeNN(Hf1(%C}KPfC*L?Nm!nMW0@J3(J=mYq3DPk;TMs%h`-amWbc%7{1Lg3$ z^e=btuqch-lydbtLvazh+fx?87Q7!YRT(=-Vx;hO)?o@f1($e5B?JB9jcRd;zM;iE zu?3EqyK`@_5Smr#^a`C#M>sRwq2^|ym)X*r;0v6AM`Zz1aK94@9Ti)Lixun2N!e-A z>w#}xPxVd9AfaF$XTTff?+#D(xwOpjZj9-&SU%7Z-E2-VF-n#xnPeQH*67J=j>TL# z<v}>AiTXrQ(fYa%82%qlH=L z6Fg8@r4p+BeTZ!5cZlu$iR?EJpYuTx>cJ~{{B7KODY#o*2seq=p2U0Rh;3mX^9sza zk^R_l7jzL5BXWlrVkhh!+LQ-Nc0I`6l1mWkp~inn)HQWqMTWl4G-TBLglR~n&6J?4 z7J)IO{wkrtT!Csntw3H$Mnj>@;QbrxC&Shqn^VVu$Ls*_c~TTY~fri6fO-=eJsC*8(3(H zSyO>=B;G`qA398OvCHRvf3mabrPZaaLhn*+jeA`qI!gP&i8Zs!*bBqMXDJpSZG$N) zx0rDLvcO>EoqCTR)|n7eOp-jmd>`#w`6`;+9+hihW2WnKVPQ20LR94h+(p)R$Y!Q zj_3ZEY+e@NH0f6VjLND)sh+Cvfo3CpcXw?`$@a^@CyLrAKIpjL8G z`;cDLqvK=ER)$q)+6vMKlxn!!SzWl>Ib9Ys9L)L0IWr*Ox;Rk#(Dpqf;wapY_EYL8 zKFrV)Q8BBKO4$r2hON%g=r@lPE;kBUVYVG`uxx~QI>9>MCXw_5vnmDsm|^KRny929 zeKx>F(LDs#K4FGU*k3~GX`A!)l8&|tyan-rBHBm6XaB5hc5sGKWwibAD7&3M-gh1n z2?eI7E2u{(^z#W~wU~dHSfy|m)%PY454NBxED)y-T3AO`CLQxklcC1I@Y`v4~SEI#Cm> z-cjqK6I?mypZapi$ZK;y&G+|#D=woItrajg69VRD+Fu8*UxG6KdfFmFLE}HvBJ~Y) zC&c-hr~;H2Idnsz7_F~MKpBZldh)>itc1AL0>4knbVy#%pUB&9vqL1Kg*^aU`k#(p z=A%lur(|$GWSqILaWZ#2xj(&lheSiA|N6DOG?A|$!aYM)?oME6ngnfLw0CA79WA+y zhUeLbMw*VB?drVE_D~3DWVaD>8x?_q>f!6;)i3@W<=kBZBSE=uIU60SW)qct?AdM zXgti8&O=}QNd|u%Fpxr172Kc`sX^@fm>Fxl8fbFalJYci_GGoIzU*~U*I!QLz? z4NYk^=JXBS*Uph@51da-v;%?))cB^(ps}y8yChu7CzyC9SX{jAq13zdnqRHRvc{ha zcPmgCUqAJ^1RChMCCz;ZN*ap{JPoE<1#8nNObDbAt6Jr}Crq#xGkK@w2mLhIUecvy z#?s~?J()H*?w9K`_;S+8TNVkHSk}#yvn+|~jcB|he}OY(zH|7%EK%-Tq=)18730)v zM3f|=oFugXq3Lqn={L!wx|u(ycZf(Te11c3?^8~aF; zNMC)gi?nQ#S$s{46yImv_7@4_qu|XXEza~);h&cr*~dO@#$LtKZa@@r$8PD^jz{D6 zk~5;IJBuQjsKk+8i0wzLJ2=toMw4@rw7(|6`7*e|V(5-#ZzRirtkXBO1oshQ&0>z&HAtSF8+871e|ni4gLs#`3v7gnG#^F zDv!w100_HwtU}B2T!+v_YDR@-9VmoGW+a76oo4yy)o`MY(a^GcIvXW+4)t{lK}I-& zl-C=(w_1Z}tsSFjFd z3iZjkO6xnjLV3!EE?ex9rb1Zxm)O-CnWPat4vw08!GtcQ3lHD+ySRB*3zQu-at$rj zzBn`S?5h=JlLXX8)~Jp%1~YS6>M8c-Mv~E%s7_RcvIYjc-ia`3r>dvjxZ6=?6=#OM zfsv}?hGnMMdi9C`J9+g)5`M9+S79ug=!xE_XcHdWnIRr&hq$!X7aX5kJV8Q(6Lq?|AE8N2H z37j{DPDY^Jw!J>~>Mwaja$g%q1sYfH4bUJFOR`x=pZQ@O(-4b#5=_Vm(0xe!LW>YF zO4w`2C|Cu%^C9q9B>NjFD{+qt)cY3~(09ma%mp3%cjFsj0_93oVHC3)AsbBPuQNBO z`+zffU~AgGrE0K{NVR}@oxB4&XWt&pJ-mq!JLhFWbnXf~H%uU?6N zWJ7oa@``Vi$pMWM#7N9=sX1%Y+1qTGnr_G&h3YfnkHPKG}p>i{fAG+(klE z(g~u_rJXF48l1D?;;>e}Ra{P$>{o`jR_!s{hV1Wk`vURz`W2c$-#r9GM7jgs2>um~ zouGlCm92rOiLITzf`jgl`v2qYw^!Lh0YwFHO1|3Krp8ztE}?#2+>c)yQlNw%5e6w5 zIm9BKZN5Q9b!tX`Zo$0RD~B)VscWp(FR|!a!{|Q$={;ZWl%10vBzfgWn}WBe!%cug z^G%;J-L4<6&aCKx@@(Grsf}dh8fuGT+TmhhA)_16uB!t{HIAK!B-7fJLe9fsF)4G- zf>(~ⅅ8zCNKueM5c!$)^mKpZNR!eIlFST57ePGQcqCqedAQ3UaUEzpjM--5V4YO zY22VxQm%$2NDnwfK+jkz=i2>NjAM6&P1DdcO<*Xs1-lzdXWn#LGSxwhPH7N%D8-zCgpFWt@`LgNYI+Fh^~nSiQmwH0^>E>*O$47MqfQza@Ce z1wBw;igLc#V2@y-*~Hp?jA1)+MYYyAt|DV_8RQCrRY@sAviO}wv;3gFdO>TE(=9o? z=S(r=0oT`w24=ihA=~iFV5z$ZG74?rmYn#eanx(!Hkxcr$*^KRFJKYYB&l6$WVsJ^ z-Iz#HYmE)Da@&seqG1fXsTER#adA&OrD2-T(z}Cwby|mQf{0v*v3hq~pzF`U`jenT z=XHXeB|fa?Ws$+9ADO0rco{#~+`VM?IXg7N>M0w1fyW1iiKTA@p$y zSiAJ%-Mg{m>&S4r#Tw@?@7ck}#oFo-iZJCWc`hw_J$=rw?omE{^tc59ftd`xq?jzf zo0bFUI=$>O!45{!c4?0KsJmZ#$vuYpZLo_O^oHTmmLMm0J_a{Nn`q5tG1m=0ecv$T z5H7r0DZGl6be@aJ+;26EGw9JENj0oJ5K0=^f-yBW2I0jqVIU};NBp*gF7_KlQnhB6 z##d$H({^HXj@il`*4^kC42&3)(A|tuhs;LygA-EWFSqpe+%#?6HG6}mE215Z4mjO2 zY2^?5$<8&k`O~#~sSc5Fy`5hg5#e{kG>SAbTxCh{y32fHkNryU_c0_6h&$zbWc63T z7|r?X7_H!9XK!HfZ+r?FvBQ$x{HTGS=1VN<>Ss-7M3z|vQG|N}Frv{h-q623@Jz*@ ziXlZIpAuY^RPlu&=nO)pFhML5=ut~&zWDSsn%>mv)!P1|^M!d5AwmSPIckoY|0u9I zTDAzG*U&5SPf+@c_tE_I!~Npfi$?gX(kn=zZd|tUZ_ez(xP+)xS!8=k(<{9@<+EUx zYQgZhjn(0qA#?~Q+EA9oh_Jx5PMfE3#KIh#*cFIFQGi)-40NHbJO&%ZvL|LAqU=Rw zf?Vr4qkUcKtLr^g-6*N-tfk+v8@#Lpl~SgKyH!+m9?T8B>WDWK22;!i5&_N=%f{__ z-LHb`v-LvKqTJZCx~z|Yg;U_f)VZu~q7trb%C6fOKs#eJosw&b$nmwGwP;Bz`=zK4 z>U3;}T_ptP)w=vJaL8EhW;J#SHA;fr13f=r#{o)`dRMOs-T;lp&Toi@u^oB_^pw=P zp#8Geo2?@!h2EYHY?L;ayT}-Df0?TeUCe8Cto{W0_a>!7Gxmi5G-nIIS;X{flm2De z{SjFG%knZoVa;mtHR_`*6)KEf=dvOT3OgT7C7&-4P#4X^B%VI&_57cBbli()(%zZC?Y0b;?5!f22UleQ=9h4_LkcA!Xsqx@q{ko&tvP_V@7epFs}AIpM{g??PA>U(sk$Gum>2Eu zD{Oy{$OF%~?B6>ixQeK9I}!$O0!T3#Ir8MW)j2V*qyJ z8Bg17L`rg^B_#rkny-=<3fr}Y42+x0@q6POk$H^*p3~Dc@5uYTQ$pfaRnIT}Wxb;- zl!@kkZkS=l)&=y|21veY8yz$t-&7ecA)TR|=51BKh(@n|d$EN>18)9kSQ|GqP?aeM ztXd9C&Md$PPF*FVs*GhoHM2L@D$(Qf%%x zwQBUt!jM~GgwluBcwkgwQ!249uPkNz3u@LSYZgmpHgX|P#8!iKk^vSKZ;?)KE$92d z2U>y}VWJ0&zjrIqddM3dz-nU%>bL&KU%SA|LiiUU7Ka|c=jF|vQ1V)Jz`JZe*j<5U6~RVuBEVJoY~ z&GE+F$f>4lN=X4-|9v*5O*Os>>r87u z!_1NSV?_X&HeFR1fOFb8_P)4lybJ6?1BWK`Tv2;4t|x1<#@17UO|hLGnrB%nu)fDk zfstJ4{X4^Y<8Lj<}g2^kksSefQTMuTo?tJLCh zC~>CR#a0hADw!_Vg*5fJwV{~S(j8)~sn>Oyt(ud2$1YfGck77}xN@3U_#T`q)f9!2 zf>Ia;Gwp2_C>WokU%(z2ec8z94pZyhaK+e>3a9sj^-&*V494;p9-xk+u1Jn#N_&xs z59OI2w=PuTErv|aNcK*>3l^W*p3}fjXJjJAXtBA#%B(-0--s;1U#f8gFYW!JL+iVG zV0SSx5w8eVgE?3Sg@eQv)=x<+-JgpVixZQNaZr}3b8sVyVs$@ndkF5FYKka@b+YAh z#nq_gzlIDKEs_i}H4f)(VQ!FSB}j>5znkVD&W0bOA{UZ7h!(FXrBbtdGA|PE1db>s z$!X)WY)u#7P8>^7Pjjj-kXNBuJX3(pJVetTZRNOnR5|RT5D>xmwxhAn)9KF3J05J; z-Mfb~dc?LUGqozC2p!1VjRqUwwDBnJhOua3vCCB-%ykW_ohSe?$R#dz%@Gym-8-RA zjMa_SJSzIl8{9dV+&63e9$4;{=1}w2=l+_j_Dtt@<(SYMbV-18&%F@Zl7F_5! z@xwJ0wiDdO%{}j9PW1(t+8P7Ud79yjY>x>aZYWJL_NI?bI6Y02`;@?qPz_PRqz(7v``20`- z033Dy|4;y6di|>cz|P-z|6c&3f&g^OAt8aN0Zd&0yZ>dq2aFCsE<~Ucf$v{sL=*++ zBxFSa2lfA+Y%U@B&3D=&CBO&u`#*nNc|PCY7XO<}MnG0VR764XrHtrb5zwC*2F!Lp zE<~Vj0;z!S-|3M4DFxuQ=`ShTf28<9p!81(0hFbGNqF%0gg*orez9!qt8e%o@Yfl@ zhvY}{@3&f??}7<`p>FyU;7?VkKbh8_=csozU=|fH&szgZ{=NDCylQ>EH^x5!K3~-V z)_2Y>0uJ`Z0Pb58y`RL+&n@m9tJ)O<%q#&u#DAIt+-rRt0eSe1MTtMl@W)H$b3D)@ z*A-1bUgZI)>HdcI4&W>P4W5{-j=s5p5`cbQ+{(g0+RDnz!TR^mxSLu_y#SDVKrj8i zA^hi6>jMGM;`$9Vfb-Yf!47b)Ow`2OKtNB=z|Kxa$5O}WPo;(Dc^`q(7X8kkeFyO8 z{XOq^07=u|7*P2`m;>PIFf=i80MKUxsN{d2cX0M+REsE*20+WQ79T9&cqT>=I_U% z{=8~^Isg(Nzo~`4iQfIb_#CVCD>#5h>=-Z#5dH}WxYzn%0)GAm6L2WdUdP=0_h>7f z(jh&7%1i(ZOn+}D8$iGK4Vs{pmHl_w4Qm-46H9>4^{3dz^DZDh+dw)6Xd@CpQNK$j z{CU;-cmpK=egplZ3y3%y=sEnCJ^eYVKXzV8H2_r*fJ*%*B;a1_lOpt6)IT1IAK2eB z{rie|uDJUrbgfUE>~C>@RO|m5ex55F{=~Bb4Cucp{ok7Yf9V}QuZ`#Gc|WaqsQlK- zKaV)iMRR__&Ak2Z=IM9R9g5$WM4u{a^C-7uX*!myEym z#_#p^T!P~#Dx$%^K>Y_nj_3J*E_LwJ60-5Xu=LkJAwcP@|0;a&+|+ZX`Jbj9P5;T% z|KOc}4*#4o{U?09`9Hz`Xo-I!P=9XfIrr*MQ}y=$!qgv?_J38^bNb4kM&_OVg^_=Eu-qG5U(fw0KMgH){C8pazq~51rN97hf#20-7=aK0)N|UM H-+%o-(+5aQ diff --git a/android/xscreensaver/gradle/wrapper/gradle-wrapper.properties b/android/xscreensaver/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index e8b8f549..00000000 --- a/android/xscreensaver/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Tue Dec 08 07:15:24 PST 2020 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/android/xscreensaver/gradlew b/android/xscreensaver/gradlew deleted file mode 100644 index 9d82f789..00000000 --- a/android/xscreensaver/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/android/xscreensaver/gradlew.bat b/android/xscreensaver/gradlew.bat deleted file mode 100644 index aec99730..00000000 --- a/android/xscreensaver/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/android/xscreensaver/jni/Android.mk b/android/xscreensaver/jni/Android.mk index 8e792452..ac3e0fab 100644 --- a/android/xscreensaver/jni/Android.mk +++ b/android/xscreensaver/jni/Android.mk @@ -6,7 +6,6 @@ SHARED_CFLAGS = \ -Wall \ -Wstrict-prototypes \ -Wmissing-prototypes \ - -DGL_GLEXT_PROTOTYPES \ -DSTANDALONE=1 \ -DHAVE_ANDROID=1 \ -DHAVE_GL=1 \ @@ -23,6 +22,8 @@ SHARED_CFLAGS = \ -DGETTIMEOFDAY_TWO_ARGS=1 \ -DHAVE_ICMP=1 \ -DHAVE_PTHREAD=1 \ + -DHAVE_GLSL=1 \ + -DHAVE_GLES3=1 \ SHARED_C_INCLUDES = \ $(LOCAL_PATH) \ @@ -41,6 +42,7 @@ LOCAL_SRC_FILES := \ hacks/glx/dropshadow.c \ hacks/glx/chessmodels.c \ hacks/glx/fps-gl.c \ + hacks/glx/trackball.c \ hacks/glx/gltrackball.c \ hacks/glx/glut_stroke.c \ hacks/glx/glut_swidth.c \ @@ -50,7 +52,7 @@ LOCAL_SRC_FILES := \ hacks/glx/rotator.c \ hacks/glx/sphere.c \ hacks/glx/texfont.c \ - hacks/glx/trackball.c \ + hacks/glx/glsl-utils.c \ hacks/glx/tube.c \ # Some savers occupy more than one source file: @@ -193,7 +195,8 @@ LOCAL_SRC_FILES += \ hacks/pacman_ai.c \ hacks/pacman_level.c \ -LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lEGL -latomic -landroid -ljnigraphics +# "NDK: WARNING: non-system libraries in linker flags: -latomic" +LOCAL_LDLIBS := -lGLESv1_CM -lGLESv3 -ldl -llog -lEGL -landroid -ljnigraphics LOCAL_C_INCLUDES := $(SHARED_C_INCLUDES) LOCAL_CFLAGS += $(SHARED_CFLAGS) diff --git a/android/xscreensaver/jni/Application.mk b/android/xscreensaver/jni/Application.mk index 311946db..7739f4ef 100644 --- a/android/xscreensaver/jni/Application.mk +++ b/android/xscreensaver/jni/Application.mk @@ -1,7 +1,7 @@ # Get this value from android/Makefile APP_ABI := $(shell echo $$APP_ABI) APP_STL := c++_static -APP_PLATFORM := android-16 +APP_PLATFORM := android-18 # ^^ APP_PLATFORM is minimum API version supported # https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md#target-api-set-higher-than-device-api diff --git a/android/xscreensaver/project.properties b/android/xscreensaver/project.properties index 1e1e7a3c..b8d6f360 100644 --- a/android/xscreensaver/project.properties +++ b/android/xscreensaver/project.properties @@ -12,4 +12,4 @@ android.library.reference.1= # Project target. -target=android-19 +target=android-18 diff --git a/android/xscreensaver/xscreensaver.iml b/android/xscreensaver/xscreensaver.iml deleted file mode 100644 index 4a0908cb..00000000 --- a/android/xscreensaver/xscreensaver.iml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ax_pthread.m4 b/ax_pthread.m4 index d383ad5c..e5858e50 100644 --- a/ax_pthread.m4 +++ b/ax_pthread.m4 @@ -1,5 +1,5 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_pthread.html +# https://www.gnu.org/software/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS @@ -14,24 +14,28 @@ # flags that are needed. (The user can also force certain compiler # flags/libs to be tested by setting these environment variables.) # -# Also sets PTHREAD_CC to any special C compiler that is needed for -# multi-threaded programs (defaults to the value of CC otherwise). (This -# is necessary on AIX to use the special cc_r compiler alias.) +# Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is +# needed for multi-threaded programs (defaults to the value of CC +# respectively CXX otherwise). (This is necessary on e.g. AIX to use the +# special cc_r/CC_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, -# but also link it with them as well. e.g. you should link with +# but also to link with them as well. For example, you might link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # -# If you are only building threads programs, you may wish to use these +# If you are only building threaded programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" +# CXX="$PTHREAD_CXX" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant -# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name -# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the # PTHREAD_PRIO_INHERIT symbol is defined when compiling with @@ -55,6 +59,7 @@ # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2011 Daniel Richard G. +# Copyright (c) 2019 Marc Stevens # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the @@ -67,7 +72,7 @@ # Public License for more details. # # You should have received a copy of the GNU General Public License along -# with this program. If not, see . +# with this program. If not, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure @@ -82,35 +87,41 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 21 +#serial 30 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ -AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_CANONICAL_TARGET]) +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PROG_SED]) AC_LANG_PUSH([C]) ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on True64 or Sequent). +# requires special compiler flags (e.g. on Tru64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) + AS_IF([test "x$PTHREAD_CXX" != "x"], [CXX="$PTHREAD_CXX"]) CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) - AC_TRY_LINK_FUNC([pthread_join], [ax_pthread_ok=yes]) + AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) + AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) AC_MSG_RESULT([$ax_pthread_ok]) - if test x"$ax_pthread_ok" = xno; then + if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different @@ -118,12 +129,14 @@ fi # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" which indicates that we try without +# any flags at all, and "pthread-config" which is a program returning +# the flags for the Pth emulation library. -ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: @@ -132,82 +145,163 @@ ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mt # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# ... -mt is also the pthreads flag for HP/aCC +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) -case ${host_os} in +case $target_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], + [ +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + ], + [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) + ;; + solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthreads/-mt/ - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" + ;; +esac + +# Are we compiling with Clang? + +AC_CACHE_CHECK([whether $CC is Clang], + [ax_cv_PTHREAD_CLANG], + [ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], + [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + ], + [ax_cv_PTHREAD_CLANG=yes]) + fi + ]) +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC + +AS_IF([test "x$GCC" = "xyes"], + [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"]) + +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first + +AS_IF([test "x$ax_pthread_clang" = "xyes"], + [ax_pthread_flags="-pthread,-lpthread -pthread"]) - ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $target_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" ;; - darwin*) - ax_pthread_flags="-pthread $ax_pthread_flags" + aix*) + ax_pthread_check_macro="_THREAD_SAFE" ;; -esac -# Clang doesn't consider unrecognized options an error unless we specify -# -Werror. We throw in some extra Clang-specific options to ensure that -# this doesn't happen for GCC, which also accepts -Werror. + *) + ax_pthread_check_macro="--" + ;; +esac +AS_IF([test "x$ax_pthread_check_macro" = "x--"], + [ax_pthread_check_cond=0], + [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) -AC_MSG_CHECKING([if compiler needs -Werror to reject unknown flags]) -save_CFLAGS="$CFLAGS" -ax_pthread_extra_flags="-Werror" -CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument" -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([int foo(void);],[foo()])], - [AC_MSG_RESULT([yes])], - [ax_pthread_extra_flags= - AC_MSG_RESULT([no])]) -CFLAGS="$save_CFLAGS" -if test x"$ax_pthread_ok" = xno; then -for flag in $ax_pthread_flags; do +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do - case $flag in + case $ax_pthread_try_flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"]) + ;; + -*) - AC_MSG_CHECKING([whether pthreads work with $flag]) - PTHREAD_CFLAGS="$flag" + AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) + PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; pthread-config) AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) - if test x"$ax_pthread_config" = xno; then continue; fi + AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) - AC_MSG_CHECKING([for the pthreads library -l$flag]) - PTHREAD_LIBS="-l$flag" + AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) + PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we @@ -218,8 +312,18 @@ for flag in $ax_pthread_flags; do # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include - static void routine(void *a) { a = 0; } +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } static void *start_routine(void *a) { return a; }], [pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); @@ -227,101 +331,187 @@ for flag in $ax_pthread_flags; do pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */])], - [ax_pthread_ok=yes], - []) + [ax_pthread_ok=yes], + []) - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" AC_MSG_RESULT([$ax_pthread_ok]) - if test "x$ax_pthread_ok" = xyes; then - break; - fi + AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`AS_ECHO(["$ac_link"]) | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [ac_link="$ax_pthread_2step_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [break]) + ]) + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + ]) + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + + + # Various other checks: -if test "x$ax_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_MSG_CHECKING([for joinable pthread attribute]) - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], - [int attr = $attr; return attr /* ; */])], - [attr_name=$attr; break], - []) - done - AC_MSG_RESULT([$attr_name]) - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then - AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$attr_name], - [Define to necessary symbol if this constant - uses a non-standard name on your system.]) - fi - - AC_MSG_CHECKING([if more special flags are required for pthreads]) - flag=no - case ${host_os} in - aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; - osf* | hpux*) flag="-D_REENTRANT";; - solaris*) - if test "$GCC" = "yes"; then - flag="-D_REENTRANT" - else - # TODO: What about Clang on Solaris? - flag="-mt -D_REENTRANT" - fi - ;; - esac - AC_MSG_RESULT([$flag]) - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi + AC_CACHE_CHECK([for joinable pthread attribute], + [ax_cv_PTHREAD_JOINABLE_ATTR], + [ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $ax_pthread_attr; return attr /* ; */])], + [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], + []) + done + ]) + AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes"], + [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], + [$ax_cv_PTHREAD_JOINABLE_ATTR], + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + ax_pthread_joinable_attr_defined=yes + ]) + + AC_CACHE_CHECK([whether more special flags are required for pthreads], + [ax_cv_PTHREAD_SPECIAL_FLAGS], + [ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $target_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + ]) + AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes"], + [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes]) AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], - [ax_cv_PTHREAD_PRIO_INHERIT], [ - AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[int i = PTHREAD_PRIO_INHERIT;]])], - [ax_cv_PTHREAD_PRIO_INHERIT=yes], - [ax_cv_PTHREAD_PRIO_INHERIT=no]) + [ax_cv_PTHREAD_PRIO_INHERIT], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[int i = PTHREAD_PRIO_INHERIT; + return i;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) ]) - AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], - [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes"], + [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) + ax_pthread_prio_inherit_defined=yes + ]) - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" # More AIX lossage: compile with *_r variant - if test "x$GCC" != xyes; then - case $host_os in + if test "x$GCC" != "xyes"; then + case $target_os in aix*) AS_CASE(["x/$CC"], - [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], - [#handle absolute path differently from PATH based program lookup - AS_CASE(["x$CC"], - [x/*], - [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], - [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) + [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], + [#handle absolute path differently from PATH based program lookup + AS_CASE(["x$CC"], + [x/*], + [ + AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"]) + AS_IF([test "x${CXX}" != "x"], [AS_IF([AS_EXECUTABLE_P([${CXX}_r])],[PTHREAD_CXX="${CXX}_r"])]) + ], + [ + AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC]) + AS_IF([test "x${CXX}" != "x"], [AC_CHECK_PROGS([PTHREAD_CXX],[${CXX}_r],[$CXX])]) + ] + ) + ]) ;; esac fi fi test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" AC_SUBST([PTHREAD_LIBS]) AC_SUBST([PTHREAD_CFLAGS]) AC_SUBST([PTHREAD_CC]) +AC_SUBST([PTHREAD_CXX]) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$ax_pthread_ok" = xyes; then +if test "x$ax_pthread_ok" = "xyes"; then ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) : else diff --git a/config.guess b/config.guess index 256083a7..0fc11edb 100755 --- a/config.guess +++ b/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2018 Free Software Foundation, Inc. +# Copyright 1992-2020 Free Software Foundation, Inc. -timestamp='2018-03-08' +timestamp='2020-11-07' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -32,7 +32,7 @@ timestamp='2018-03-08' # Please send patches to . -me=`echo "$0" | sed -e 's,.*/,,'` +me=$(echo "$0" | sed -e 's,.*/,,') usage="\ Usage: $0 [OPTION] @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2018 Free Software Foundation, Inc. +Copyright 1992-2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -84,8 +84,6 @@ if test $# != 0; then exit 1 fi -trap 'exit 1' 1 2 15 - # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a @@ -96,41 +94,47 @@ trap 'exit 1' 1 2 15 # Portable tmp directory creation inspired by the Autoconf team. -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > "$dummy.c" ; - for c in cc gcc c89 c99 ; do - if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=$( (umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null) && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then +if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +UNAME_MACHINE=$( (uname -m) 2>/dev/null) || UNAME_MACHINE=unknown +UNAME_RELEASE=$( (uname -r) 2>/dev/null) || UNAME_RELEASE=unknown +UNAME_SYSTEM=$( (uname -s) 2>/dev/null) || UNAME_SYSTEM=unknown +UNAME_VERSION=$( (uname -v) 2>/dev/null) || UNAME_VERSION=unknown case "$UNAME_SYSTEM" in Linux|GNU|GNU/*) @@ -138,7 +142,7 @@ Linux|GNU|GNU/*) # We could probably try harder. LIBC=gnu - eval "$set_cc_for_build" + set_cc_for_build cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) @@ -146,17 +150,15 @@ Linux|GNU|GNU/*) #elif defined(__dietlibc__) LIBC=dietlibc #else + #include + #ifdef __DEFINED_va_list + LIBC=musl + #else LIBC=gnu #endif + #endif EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" - - # If ldd exists, use it to detect musl libc. - if command -v ldd >/dev/null && \ - ldd --version 2>&1 | grep -q ^musl - then - LIBC=musl - fi + eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g')" ;; esac @@ -175,19 +177,20 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + UNAME_MACHINE_ARCH=$( (uname -p 2>/dev/null || \ "/sbin/$sysctl" 2>/dev/null || \ "/usr/sbin/$sysctl" 2>/dev/null || \ - echo unknown)` + echo unknown)) case "$UNAME_MACHINE_ARCH" in + aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) - arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` - endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + arch=$(echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,') + endian=$(echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p') machine="${arch}${endian}"-unknown ;; *) machine="$UNAME_MACHINE_ARCH"-unknown ;; @@ -199,7 +202,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval "$set_cc_for_build" + set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then @@ -218,7 +221,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in case "$UNAME_MACHINE_ARCH" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' - abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + abi=$(echo "$UNAME_MACHINE_ARCH" | sed -e "$expr") ;; esac # The OS release @@ -231,24 +234,24 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in release='-gnu' ;; *) - release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + release=$(echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2) ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "$machine-${os}${release}${abi}" + echo "$machine-${os}${release}${abi-}" exit ;; *:Bitrig:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + UNAME_MACHINE_ARCH=$(arch | sed 's/Bitrig.//') echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + UNAME_MACHINE_ARCH=$(arch | sed 's/OpenBSD.//') echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + UNAME_MACHINE_ARCH=$(arch | sed 's/^.*BSD\.//') echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) @@ -260,6 +263,9 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:SolidBSD:*:*) echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; + *:OS108:*:*) + echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" + exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; @@ -269,26 +275,29 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; + *:Twizzler:*:*) + echo "$UNAME_MACHINE"-unknown-twizzler + exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) - echo mips-dec-osf1 - exit ;; + echo mips-dec-osf1 + exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $3}') ;; *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $4}') ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + ALPHA_CPU_TYPE=$(/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1) case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE=alpha ;; @@ -326,7 +335,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + echo "$UNAME_MACHINE"-dec-osf"$(echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 @@ -360,7 +369,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then + if test "$( (/bin/universe) 2>/dev/null)" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd @@ -373,28 +382,28 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in + case $(/usr/bin/uname -p) in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) - echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + echo "$UNAME_MACHINE"-ibm-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')" exit ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + echo sparc-hal-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + echo sparc-sun-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval "$set_cc_for_build" + set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null @@ -402,30 +411,30 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in SUN_ARCH=x86_64 fi fi - echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + echo "$SUN_ARCH"-pc-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + echo sparc-sun-solaris3"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" exit ;; sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in + case "$(/usr/bin/arch -k)" in Series*|S4*) - UNAME_RELEASE=`uname -v` + UNAME_RELEASE=$(uname -v) ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + echo sparc-sun-sunos"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/')" exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + UNAME_RELEASE=$( (sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null) test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 - case "`/bin/arch`" in + case "$(/bin/arch)" in sun3) echo m68k-sun-sunos"$UNAME_RELEASE" ;; @@ -482,7 +491,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) - eval "$set_cc_for_build" + set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ @@ -505,8 +514,8 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && - dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`"$dummy" "$dummyarg"` && + dummyarg=$(echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p') && + SYSTEM_NAME=$("$dummy" "$dummyarg") && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos"$UNAME_RELEASE" exit ;; @@ -533,11 +542,11 @@ EOF exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + UNAME_PROCESSOR=$(/usr/bin/uname -p) + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then - if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ - [ "$TARGET_BINARY_INTERFACE"x = x ] + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x then echo m88k-dg-dgux"$UNAME_RELEASE" else @@ -561,17 +570,17 @@ EOF echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) - echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + echo mips-sgi-irix"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/g')" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + exit ;; # Note that: echo "'$(uname -s)'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` + if test -x /usr/bin/oslevel ; then + IBM_REV=$(/usr/bin/oslevel) else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi @@ -579,7 +588,7 @@ EOF exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval "$set_cc_for_build" + set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include @@ -591,7 +600,7 @@ EOF exit(0); } EOF - if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") then echo "$SYSTEM_NAME" else @@ -604,15 +613,15 @@ EOF fi exit ;; *:AIX:*:[4567]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + IBM_CPU_ID=$(/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }') if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi - if [ -x /usr/bin/lslpp ] ; then - IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | - awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + if test -x /usr/bin/lslpp ; then + IBM_REV=$(/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/) else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi @@ -640,14 +649,14 @@ EOF echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//') case "$UNAME_MACHINE" in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + if test -x /usr/bin/getconf; then + sc_cpu_version=$(/usr/bin/getconf SC_CPU_VERSION 2>/dev/null) + sc_kernel_bits=$(/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null) case "$sc_cpu_version" in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 @@ -659,8 +668,8 @@ EOF esac ;; esac fi - if [ "$HP_ARCH" = "" ]; then - eval "$set_cc_for_build" + if test "$HP_ARCH" = ""; then + set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE @@ -694,13 +703,13 @@ EOF exit (0); } EOF - (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=$("$dummy") test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ "$HP_ARCH" = hppa2.0w ] + if test "$HP_ARCH" = hppa2.0w then - eval "$set_cc_for_build" + set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler @@ -722,11 +731,11 @@ EOF echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//') echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) - eval "$set_cc_for_build" + set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int @@ -752,7 +761,7 @@ EOF exit (0); } EOF - $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; @@ -772,7 +781,7 @@ EOF echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then + if test -x /usr/sbin/sysversion ; then echo "$UNAME_MACHINE"-unknown-osf1mk else echo "$UNAME_MACHINE"-unknown-osf1 @@ -821,14 +830,14 @@ EOF echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + FUJITSU_PROC=$(uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz) + FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///') + FUJITSU_REL=$(echo "$UNAME_RELEASE" | sed -e 's/ /_/') echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///') + FUJITSU_REL=$(echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/') echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) @@ -840,15 +849,26 @@ EOF *:BSD/OS:*:*) echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=$(uname -p) + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabihf + fi + exit ;; *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` + UNAME_PROCESSOR=$(/usr/bin/uname -p) case "$UNAME_PROCESSOR" in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac - echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + echo "$UNAME_PROCESSOR"-unknown-freebsd"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin @@ -881,21 +901,21 @@ EOF echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin + echo x86_64-pc-cygwin exit ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + echo powerpcle-unknown-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" exit ;; *:GNU:*:*) # the GNU system - echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + echo "$(echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,')-unknown-$LIBC$(echo "$UNAME_RELEASE"|sed -e 's,/.*$,,')" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + echo "$UNAME_MACHINE-unknown-$(echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]")$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')-$LIBC" exit ;; - i*86:Minix:*:*) - echo "$UNAME_MACHINE"-pc-minix + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" @@ -905,7 +925,7 @@ EOF echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + case $(sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null) in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; @@ -922,7 +942,7 @@ EOF echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) - eval "$set_cc_for_build" + set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then @@ -971,23 +991,51 @@ EOF echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) - eval "$set_cc_for_build" + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el + MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} + MIPS_ENDIAN= #else - CPU= + MIPS_ENDIAN= #endif #endif EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" - test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } + eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI')" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" @@ -1006,7 +1054,7 @@ EOF exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + case $(grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2) in PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; @@ -1046,7 +1094,17 @@ EOF echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) - echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + set_cc_for_build + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI="$LIBC"x32 + fi + fi + echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI" exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" @@ -1086,7 +1144,7 @@ EOF echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; i*86:*:4.*:*) - UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + UNAME_REL=$(echo "$UNAME_RELEASE" | sed 's/\/MP$//') if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else @@ -1095,19 +1153,19 @@ EOF exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in + case $(/bin/uname -X | grep "^Machine") in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + UNAME_REL=$( (/bin/uname -X|grep Release|sed -e 's/.*= //')) (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 @@ -1157,7 +1215,7 @@ EOF 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ @@ -1168,7 +1226,7 @@ EOF NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ @@ -1201,7 +1259,7 @@ EOF exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` + UNAME_MACHINE=$( (uname -p) 2>/dev/null) echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv @@ -1235,7 +1293,7 @@ EOF echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then + if test -d /usr/nec; then echo mips-nec-sysv"$UNAME_RELEASE" else echo mips-unknown-sysv"$UNAME_RELEASE" @@ -1283,44 +1341,48 @@ EOF *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; + arm64:Darwin:*:*) + echo aarch64-apple-darwin"$UNAME_RELEASE" + exit ;; *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - eval "$set_cc_for_build" - if test "$UNAME_PROCESSOR" = unknown ; then - UNAME_PROCESSOR=powerpc + UNAME_PROCESSOR=$(uname -p) + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build fi - if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac - fi - # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc - if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_PPC >/dev/null - then - UNAME_PROCESSOR=powerpc - fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then - # Avoid executing cc on OS X 10.9, as it ships with a stub - # that puts up a graphical alert prompting to install - # developer tools. Any system running Mac OS X 10.7 or - # later (Darwin 11 and later) is required to have a 64-bit - # processor. This is not true of the ARM version of Darwin - # that Apple uses in portable devices. - UNAME_PROCESSOR=x86_64 + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE fi echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` + UNAME_PROCESSOR=$(uname -p) if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc @@ -1358,6 +1420,7 @@ EOF # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. + # shellcheck disable=SC2154 if test "$cputype" = 386; then UNAME_MACHINE=i386 else @@ -1387,10 +1450,10 @@ EOF echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) - echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + echo "$UNAME_MACHINE"-unknown-dragonfly"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')" exit ;; *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` + UNAME_MACHINE=$( (uname -p) 2>/dev/null) case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; @@ -1400,7 +1463,7 @@ EOF echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + echo "$UNAME_MACHINE"-pc-skyos"$(echo "$UNAME_RELEASE" | sed -e 's/ .*$//')" exit ;; i*86:rdos:*:*) echo "$UNAME_MACHINE"-pc-rdos @@ -1414,8 +1477,148 @@ EOF amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; + *:Unleashed:*:*) + echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" + exit ;; esac +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=$( (hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null); + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=$($dummy) && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + echo "$0: unable to guess system type" >&2 case "$UNAME_MACHINE:$UNAME_SYSTEM" in @@ -1438,6 +1641,12 @@ copies of config.guess and config.sub with the latest versions from: https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess and https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub +EOF + +year=$(echo $timestamp | sed 's,-.*,,') +# shellcheck disable=SC2003 +if test "$(expr "$(date +%Y)" - "$year")" -lt 3 ; then + cat >&2 </dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` +uname -m = $( (uname -m) 2>/dev/null || echo unknown) +uname -r = $( (uname -r) 2>/dev/null || echo unknown) +uname -s = $( (uname -s) 2>/dev/null || echo unknown) +uname -v = $( (uname -v) 2>/dev/null || echo unknown) -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` +/usr/bin/uname -p = $( (/usr/bin/uname -p) 2>/dev/null) +/bin/uname -X = $( (/bin/uname -X) 2>/dev/null) -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` +hostinfo = $( (hostinfo) 2>/dev/null) +/bin/universe = $( (/bin/universe) 2>/dev/null) +/usr/bin/arch -k = $( (/usr/bin/arch -k) 2>/dev/null) +/bin/arch = $( (/bin/arch) 2>/dev/null) +/usr/bin/oslevel = $( (/usr/bin/oslevel) 2>/dev/null) +/usr/convex/getsysinfo = $( (/usr/convex/getsysinfo) 2>/dev/null) UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF +fi exit 1 diff --git a/config.h-vms b/config.h-vms deleted file mode 100644 index 7a30b196..00000000 --- a/config.h-vms +++ /dev/null @@ -1,284 +0,0 @@ -/* This is a config.h file that has been pregenerated (from config.h.in) - * with settings that are correct for VMS. - */ - - - -/* config.h.in --- xscreensaver, Copyright (c) 1998 Jamie Zawinski. - * - * The best way to set these parameters is by running the included `configure' - * script. That examines your system, and generates `config.h' from - * `config.h.in'. - * - * If something goes very wrong, you can edit `config.h' directly, but beware - * that your changes will be lost if you ever run `configure' again. - */ - - -/* ************************************************************************* - CONFIGURING SERVER EXTENSIONS - ************************************************************************* */ - -/* Define this if you have the XReadDisplay extension (I think this is an - SGI-only thing; it's in .) A few of the - screenhacks will take advantage of this if it's available. - */ -#undef HAVE_READ_DISPLAY_EXTENSION - -/* Define this if you have the Iris Video Library (dmedia/vl.h on SGI.) - A few of the screenhacks will take advantage of this if it's available. - */ -#undef HAVE_SGI_VIDEO - -/* Define this if you have the XHPDisableReset function (an HP only thing.) - */ -#undef HAVE_XHPDISABLERESET - -/* First, some background: there are three distinct server extensions which - * are useful to a screen saver program: they are XIDLE, MIT-SCREEN-SAVER, - * and SCREEN_SAVER. - * - * The XIDLE extension resides in .../contrib/extensions/xidle/ on the X11R5 - * contrib tape. This extension lets the client get accurate idle-time - * information from the X server in a potentially more reliable way than by - * simply watching for keyboard and mouse activity. However, the XIDLE - * extension has apparently not been ported to X11R6. - * - * The SCREEN_SAVER extension is found (as far as I know) only in the SGI - * X server, and it exists in all releases since (at least) Irix 5. The - * relevant header file is /usr/include/X11/extensions/XScreenSaver.h. - * - * The similarly-named MIT-SCREEN-SAVER extension came into existence long - * after the SGI SCREEN_SAVER extension was already in use, and resides in - * .../contrib/extensions/screensaver/ on the X11R6 contrib tape. It is - * also found in certain recent X servers built in to NCD X terminals. - * - * The MIT extension does basically the same thing that the XIDLE extension - * does, but there are two things wrong with it: first, because of the way - * the extension was designed, the `fade' option to XScreenSaver will be - * uglier: just before the screen fades out, there will be an unattractive - * flicker to black, because this extension blanks the screen *before* - * telling us that it is time to do so. Second, this extension is known to - * be buggy; on the systems I use, it works, but some people have reported - * X server crashes as a result of using it. XScreenSaver uses this - * extension rather conservatively, because when I tried to use any of its - * more complicated features, I could get it to crash the server at the - * drop of a hat. - * - * In short, the MIT-SCREEN-SAVER extension is a piece of junk. The older - * SGI SCREEN_SAVER extension works great, as does XIDLE. It would be nice - * If those two existed on more systems, that is, would be adopted by the - * X Consortium in favor of their inferior "not-invented-here" entry. - */ - -/* Define this if you have the XIDLE extension installed. If you have the - * XIDLE extension, this is recommended. (You have this extension if the - * file /usr/include/X11/extensions/xidle.h exists.) Turning on this flag - * lets XScreenSaver work better with servers which support this extension; - * but it will still work with servers which do not suport it, so it's a good - * idea to compile in support for it if you can. - */ -#undef HAVE_XIDLE_EXTENSION - -/* Define this if you have the MIT-SCREEN-SAVER extension installed. See the - * caveats about this extension, above. (It's available if the file - * /usr/include/X11/extensions/scrnsaver.h exists.) - */ -#undef HAVE_MIT_SAVER_EXTENSION - -/* Define this if you have the SGI SCREEN_SAVER extension. This is standard - * on Irix systems, and not available elsewhere. - */ -#undef HAVE_SGI_SAVER_EXTENSION - -/* Define this if you have the SGI-VIDEO-CONTROL extension. This is standard - * on Irix systems, and not available elsewhere. - */ -#undef HAVE_SGI_VC_EXTENSION - -/* Define this if you have the XDPMS extension. This is standard on - * sufficiently-recent XFree86 systems, and possibly elsewhere. (It's - * available if the file /usr/include/X11/extensions/dpms.h exists.) - */ -#define HAVE_DPMS_EXTENSION 1 - - -/* ************************************************************************* - CONFIGURING GRAPHICS TOOLKITS - ************************************************************************* */ - -/* Define this if you have Motif. - */ -#define HAVE_MOTIF 1 - -/* Define this if you have the XmComboBox Motif widget (Motif 2.0.) - */ -#undef HAVE_XMCOMBOBOX - -/* Define this if you have the XPM library installed. Some of the demos can - * make use of this if it is available. - */ -#define HAVE_XPM 1 - -/* Define this if you have the Xmu library. This is standard part of X, and - * if your vendor doesn't ship it, you should report that as a bug. - */ -#define HAVE_XMU 1 - -/* Define this if you have OpenGL. Some of the demos require it, so if you - * don't have it, then those particular demos won't be built. (This won't - * affect the screen saver as a whole.) - */ -#undef HAVE_GL - -/* Define this if you have OpenGL, but it's the MesaGL variant. (The - libraries have different names.) (HAVE_GL should be defined too.) - */ -#undef HAVE_MESA_GL - -/* Define this if your version of OpenGL has the glBindTexture() routine. - This is the case for OpenGL 1.1, but not for OpenGL 1.0. - */ -#undef HAVE_GLBINDTEXTURE - -/* Define this if you have the X Shared Memory Extension. - */ -#undef HAVE_XSHM_EXTENSION - - -/* ************************************************************************* - CONFIGURING PASSWORD AUTHENTICATION - ************************************************************************* */ - -/* Define this to remove the option of locking the screen at all. - */ -#undef NO_LOCKING - -/* Define this if you want to use Kerberos authentication to lock/unlock the - * screen instead of your local password. This currently uses Kerberos V4, - * but a V5 server with V4 compatibility will work. WARNING: DO NOT USE AFS - * string-to-key passwords with this option. This option currently *only* - * works with standard Kerberos des_string_to_key. If your password is an - * AFS password and not a kerberos password, it will not authenticate - * properly. See the comments in driver/kpasswd.c for more information if you - * need it. - */ -#undef HAVE_KERBEROS - - -/* Define this if your system uses `shadow' passwords, that is, the passwords - * live in /etc/shadow instead of /etc/passwd, and one reads them with - * getspnam() instead of getpwnam(). (Note that SCO systems do some random - * other thing; others might as well. See the ifdefs in driver/passwd.c if - * you're having trouble related to reading passwords.) - */ -#undef HAVE_SHADOW_PASSWD - -/* Define this if your system is Digital or SCO Unix with so-called ``Enhanced - Security'', that is, the passwords live in /tcb/files/auth// - instead of in /etc/passwd, and one reads them with getprpwnam() instead - of getpwnam(). - */ -#undef HAVE_ENHANCED_PASSWD - -/* Define this if your system is Solaris with ``adjunct'' passwords (this is - the version where one gets at the passwords with getpwanam() instead of - getpwnam().) I haven't tested this one, let me know if it works. - */ -#undef HAVE_ADJUNCT_PASSWD - -/* Define this if you are running HPUX with so-called ``Secure Passwords'' - (if you have /usr/include/hpsecurity.h, you probably have this.) I - haven't tested this one, let me know if it works. - */ -#undef HAVE_HPUX_PASSWD - -/* Define this if you are on a system that supports the VT_LOCKSWITCH and - VT_UNLOCKSWITCH ioctls. If this is defined, then when the screen is - locked, switching to another virtual terminal will also be prevented. - That is, the whole console will be locked, rather than just the VT on - which X is running. - */ -#define HAVE_VT_LOCKSWITCH 1 - - -/* ************************************************************************* - OTHER C ENVIRONMENT JUNK - ************************************************************************* */ - -/* Define this to void* if you're using X11R4 or earlier. */ -#undef XPointer - -/* Define if you have the nice function. */ -#undef HAVE_NICE - -/* Define if you have the setpriority function. */ -#undef HAVE_SETPRIORITY - -/* Define to empty if the keyword does not work. */ -#undef const - -/* Define if you have that is POSIX.1 compatible. */ -#undef HAVE_SYS_WAIT_H - -/* Define as __inline if that's what the C compiler calls it. */ -#undef inline - -/* Define to `int' if doesn't define. */ -#undef mode_t - -/* Define to `int' if doesn't define. */ -#undef pid_t - -/* Define as the return type of signal handlers (int or void). */ -#define RETSIGTYPE void - -/* Define to `unsigned' if doesn't define. */ -#undef size_t - -/* Define if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define if you can safely include both and . */ -#undef TIME_WITH_SYS_TIME - -/* Define if you have the gettimeofday function. */ -#undef HAVE_GETTIMEOFDAY - -/* Define if gettimeofday requires two arguments. */ -#undef GETTIMEOFDAY_TWO_ARGS - -/* Define if you have the putenv function. */ -#undef HAVE_PUTENV - -/* Define if you have the select function. */ -#undef HAVE_SELECT - -/* Define if you have the getcwd function. */ -#undef HAVE_GETCWD - -/* Define if you have the getcwd function. */ -#undef HAVE_GETWD - -/* Define if you have the uname function. */ -#undef HAVE_UNAME -#if (__VMS_VER >= 70000000) -# define HAVE_UNAME 1 -#endif - -/* Define if you have the fcntl function. */ -#undef HAVE_FCNTL - -/* Define if you have the sigaction function. */ -#undef HAVE_SIGACTION - -/* Define if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define if you have the header file. */ -#undef HAVE_CRYPT_H - -/* Define to use sigaction() instead of signal() for SIGCHLD-related activity. - This is necessary at least on SCO OpenServer 5, due to a Unix kernel bug. - */ -#undef USE_SIGACTION diff --git a/config.h.in b/config.h.in index b7258187..11a0ab9e 100644 --- a/config.h.in +++ b/config.h.in @@ -1,37 +1,24 @@ /* config.h.in. Generated from configure.ac by autoheader. */ -/* config.h.in --- xscreensaver, Copyright (c) 1991-2020 Jamie Zawinski. - * - * The best way to set these parameters is by running the included `configure' - * script. That examines your system, and generates `config.h' from - * `config.h.in'. - * - * If something goes very wrong, you can edit `config.h' directly, but beware - * that your changes will be lost if you ever run `configure' again. +/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski. + * Generate this file by running 'configure' rather than editing it by hand. */ -/* Define this to allow the root password to unlock the screen. */ +/* Define this to allow root to unlock, when not using PAM. */ #undef ALLOW_ROOT_PASSWD /* always defined to indicate that i18n is enabled */ #undef ENABLE_NLS -/* Some screenhacks like to run an external program to generate random pieces - of text; set this to the one you like. Note that this is just the default; - X resources can be used to override it. */ -#undef FORTUNE_PROGRAM - /* This is the name of the gettext package to use. */ #undef GETTEXT_PACKAGE -/* Define this if gettimeofday() takes two arguments. */ +/* Define this if gettimeofday takes two arguments. */ #undef GETTIMEOFDAY_TWO_ARGS -/* Define this if your system is Solaris with ``adjunct'' passwords (this is - the version where one gets at the passwords with getpwanam() instead of - getpwnam().) I haven't tested this one, let me know if it works. */ +/* Define this for Solaris getpwanam. */ #undef HAVE_ADJUNCT_PASSWD /* Define to 1 if you have the `bind_textdomain_codeset' function. */ @@ -46,12 +33,11 @@ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define this if you have Gnome and want to build support for the - xscreensaver control panel in the Gnome Control Center (gnomecc). (This is - needed only with Gtk 1.x.) */ + xscreensaver control panel in the Gtk 1.x Gnome Control Center. */ #undef HAVE_CRAPPLET /* Define this if HAVE_CRAPPLET is defined, and the function - capplet_widget_changes_are_immediate() is available. */ + capplet_widget_changes_are_immediate is available. */ #undef HAVE_CRAPPLET_IMMEDIATE /* Define to 1 if you have the header file. */ @@ -70,21 +56,19 @@ /* Define this if you have the XDPMS extension. */ #undef HAVE_DPMS_EXTENSION -/* Define this if your system is Digital or SCO Unix with so-called ``Enhanced - Security'', that is, the passwords live in /tcb/files/auth// - instead of in /etc/passwd, and one reads them with getprpwnam() instead of - getpwnam(). */ +/* Define this if OpenGL bindings are via EGL instead of GLX. */ +#undef HAVE_EGL + +/* Define this for DEC/SCO "Enhanced Security" with getprpwnam. */ #undef HAVE_ENHANCED_PASSWD /* Define to 1 if you have the `fcntl' function. */ #undef HAVE_FCNTL -/* Define this if you have the 'forkpty' function: This allows 'phosphor' and - 'apple2' to run curses-based programs, or be used as terminal windows. */ +/* Define this if you have forkpty. */ #undef HAVE_FORKPTY -/* Define this if you have the GDK_Pixbuf library installed. Some of the demos - can make use of this if it is available. */ +/* Define this if you have GDK_Pixbuf. */ #undef HAVE_GDK_PIXBUF /* Define this if you have the gdk_pixbuf_apply_embedded_orientation function @@ -97,76 +81,71 @@ /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD -/* Define this if you have the getifaddrs() function. */ +/* Define this if you have getifaddrs. */ #undef HAVE_GETIFADDRS /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT -/* Define this if you have the gettimeofday function. */ +/* Define this if you have gettimeofday. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the `getwd' function. */ #undef HAVE_GETWD -/* Define this if you have OpenGL. Some of the demos require it, so if you - don't have it, then those particular demos won't be built. (This won't - affect the screen saver as a whole.) */ +/* Define this if you have OpenGL. */ #undef HAVE_GL -/* Define this if your version of OpenGL has the glBindTexture() routine. This - is the case for OpenGL 1.1, but not for OpenGL 1.0. */ +/* Define this if the OpenGL version is 1.1 or newer. */ #undef HAVE_GLBINDTEXTURE -/* Define this if you have the -lgle and -lmatrix libraries (GL extrusion.) */ +/* Define this if you have the GL Extrusion library. */ #undef HAVE_GLE -/* Define this if you have the -lgle from GLE version 3 */ +/* Define this if GL Extrusion is version 3. */ #undef HAVE_GLE3 -/* Define this if your OpenGL implementation supports the OpenGL Shading - Language (GLSL). This requires at least OpenGL 2.0. HAVE_GL should be - defined, too. */ +/* Define this if the native OpenGL library is OpenGLES 1.x. */ +#undef HAVE_GLES + +/* Define this if the native OpenGL library is OpenGLES 2.x. */ +#undef HAVE_GLES2 + +/* Define this if the native OpenGL library is OpenGLES 3.x. */ +#undef HAVE_GLES3 + +/* Define this if OpenGL supports the OpenGL Shading Language. */ #undef HAVE_GLSL -/* Define this if you have Gtk (any version.) */ +/* Define this if you have Gtk */ #undef HAVE_GTK /* Define this if you have Gtk 2.x. */ #undef HAVE_GTK2 -/* Define this if you have HPUX with so-called "Secure Passwords". */ +/* Define this for HPUX so-called "Secure Passwords". */ #undef HAVE_HPUX_PASSWD -/* Define this if you do pings with a `struct icmp' and an `icmp_id' slot. */ +/* Define this if ping uses struct icmp.icmp_id. */ #undef HAVE_ICMP -/* Define this if you do pings with a `struct icmphdr' and an `un.echo.id' - slot. */ +/* Define this if ping uses struct icmphdr.un.echo.id. */ #undef HAVE_ICMPHDR /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H -/* Define this if you have the Independent JPEG Group's JPEG library - installed. Some of the demos can make use of this if it is available. */ +/* Define this if you have the JPEG Group's JPEG library. */ #undef HAVE_JPEGLIB -/* Define this to target the OpenGL ES 1.x API instead of OpenGL 1.3. */ +/* Define this to emulate OpenGL 1.3 in terms of OpenGLES 1.x. */ #undef HAVE_JWZGLES /* Define this if you want to use Kerberos authentication to lock/unlock the - screen instead of your local password. This currently uses Kerberos V4, but - a V5 server with V4 compatibility will work. WARNING: DO NOT USE AFS - string-to-key passwords with this option. This option currently *only* - works with standard Kerberos des_string_to_key. If your password is an AFS - password and not a kerberos password, it will not authenticate properly. - See the comments in driver/kpasswd.c for more information if you need it. - */ + screen instead of PAM. */ #undef HAVE_KERBEROS -/* Define this if you have Kerberos 5, meaning we need to use the Kerberos 4 - compatibility layer. */ +/* Define this if you have Kerberos 5. */ #undef HAVE_KERBEROS5 /* Define if your file defines LC_MESSAGES. */ @@ -175,9 +154,7 @@ /* Define this if your system has libcap. */ #undef HAVE_LIBCAP -/* Define this if the Portable Network Graphics library is installed. It is - basically required, but many things will more-or-less limp along without - it. */ +/* Define this if you have the Portable Network Graphics library. */ #undef HAVE_LIBPNG /* Define this if you have libsystemd. */ @@ -189,10 +166,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H -/* Define this if you have OpenGL, but it's the MesaGL variant. (The libraries - have different names.) (HAVE_GL should be defined too.) */ -#undef HAVE_MESA_GL - /* Using the MIT-SCREEN-SAVER extension means that the X server will crash at random times, and fading and hysteresis won't work. Don't use this. You'll be sorry. See comment in xscreensaver.c. */ @@ -207,27 +180,26 @@ /* Define to 1 if you have the `nice' function. */ #undef HAVE_NICE -/* Define this if you have the XML library headers in their old, - non-namespaced location (you lack the gnome-xml/libxml symlink) */ +/* Define this if you the XML library headers lack the gnome-xml/libxml + symlink. */ #undef HAVE_OLD_XML_HEADERS -/* Define this if you want to use PAM (Pluggable Authentication Modules) to - lock/unlock the screen, instead of standard /etc/passwd authentication. */ +/* Define this if you have Pluggable Authentication Modules. */ #undef HAVE_PAM -/* Define this if you have pam_fail_delay function. see driver/passwd-pam.c. - */ +/* Define this if you have pam_fail_delay. */ #undef HAVE_PAM_FAIL_DELAY /* Define this if you have a Linux-like /proc/interrupts file which can be - examined to determine when keyboard activity has occurred. */ + examined to determine when keyboard activity has occurred, and you use PS/2 + input devices instead of USB. */ #undef HAVE_PROC_INTERRUPTS /* Define this if you have a Linux-like /proc/.../oom_score_adj file which can - be adjusted by root to exempt us from the out-of-memory . */ + be adjusted by root to exempt us from the out-of-memory killer. */ #undef HAVE_PROC_OOM -/* Define this if your system supports POSIX threads. */ +/* Define this if you have POSIX threads. */ #undef HAVE_PTHREAD /* Have PTHREAD_PRIO_INHERIT. */ @@ -239,6 +211,9 @@ /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV +/* Define this if your system uses getpwnam_shadow. */ +#undef HAVE_PWNAM_SHADOW_PASSWD + /* Define this if you have the Resize and Rotate extension. */ #undef HAVE_RANDR @@ -275,11 +250,7 @@ /* Define this if you have the SGI-VIDEO-CONTROL extension. */ #undef HAVE_SGI_VC_EXTENSION -/* Define this if your system uses 'shadow' passwords, that is, the passwords - live in /etc/shadow instead of /etc/passwd, and one reads them with - getspnam() instead of getpwnam(). (Note that SCO systems do some random - other thing; others might as well. See the ifdefs in driver/passwd-pwent.c - if you're having trouble related to reading passwords.) */ +/* Define this if your system uses /etc/shadow. */ #undef HAVE_SHADOW_PASSWD /* Define to 1 if you have the `sigaction' function. */ @@ -341,31 +312,20 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UTIL_H -/* Define this if you have the XF86MiscSetGrabKeysState function (which allows - the Ctrl-Alt-KP_star and Ctrl-Alt-KP_slash key sequences to be temporarily - disabled. Sadly, it doesn't affect Ctrl-Alt-BS or Ctrl-Alt-F1.) */ -#undef HAVE_XF86MISCSETGRABKEYSSTATE - -/* Define this if you have the functions XF86VidModeGetModeLine() and - XF86VidModeGetViewPort(), in support of virtual desktops where the X - server's root window is bigger than the actual screen. */ +/* Define this if you have XF86VidModeGetViewPort, for virtual desktops. */ #undef HAVE_XF86VMODE -/* Define this if you have the functions XF86VidModeGetGamma() and - XF86VidModeSetGamma(), which allow clients to change the gamma response of - the monitor. */ +/* Define this if you have XF86VidModeSetGamma, for fading. */ #undef HAVE_XF86VMODE_GAMMA -/* Define this if you have the functions XF86VidModeGetGammaRamp() and - XF86VidModeSetGammaRamp(), which provide finer-grained control than - XF86VidMode[GS]etGamma(). */ +/* Define this if you have XF86VidModeSetGammaRamp, for fading. */ #undef HAVE_XF86VMODE_GAMMA_RAMP /* Define this if you have libXft2. */ #undef HAVE_XFT -/* Define this if you have the XHPDisableReset function (an HP only thing - which allows the Ctrl-Sh-Reset key sequence to be temporarily disabled.) */ +/* Define this if you have XHPDisableReset, which allows Ctrl-Sh-Reset to be + temporarily disabled. */ #undef HAVE_XHPDISABLERESET /* Define this if you have the X11R5 XIDLE extension. */ @@ -374,23 +334,22 @@ /* Define this if you have the Xinerama extension. */ #undef HAVE_XINERAMA -/* Define this if you have the Xinput extension. */ +/* Define this if you have the XInput2 extension. */ #undef HAVE_XINPUT -/* Define this if you have the XmComboBox Motif widget (Motif 2.0.) */ +/* Define this if you have the X Keyboard Extension. */ +#undef HAVE_XKB + +/* Define this if you have the XmComboBox Motif 2.0 widget. */ #undef HAVE_XMCOMBOBOX /* Define this if you have the XML library. */ #undef HAVE_XML -/* Define this if you have the Xmu library. This is standard part of X, and if - your vendor doesn't ship it, you should report that as a bug. */ -#undef HAVE_XMU - /* Define this if you have the X Shared Memory Extension. */ #undef HAVE_XSHM_EXTENSION -/* Define this if you have the function Xutf8DrawString(). */ +/* Define this if you have the function Xutf8DrawString. */ #undef HAVE_XUTF8DRAWSTRING /* Define this to remove the option of locking the screen at all. */ @@ -415,37 +374,26 @@ #undef PACKAGE_VERSION /* Whether PAM should check the result of account modules when authenticating. - Only do this if you have account configured properly on your system. */ + */ #undef PAM_CHECK_ACCOUNT_TYPE -/* If PAM is being used, this is the name of the PAM service that xscreensaver - will authenticate as. The default is "xscreensaver", which means that the - PAM library will look for an "xscreensaver" line in /etc/pam.conf, or (on - recent Linux systems) will look for a file called /etc/pam.d/xscreensaver. - Some systems might already have a PAM installation that is configured for - xlock, so setting this to "xlock" would also work in that case. */ +/* The name of the "xscreensaver" PAM service. */ #undef PAM_SERVICE_NAME -/* Define if you have PAM and pam_strerror() requires two arguments. */ +/* Define if pam_strerror requires two arguments. */ #undef PAM_STRERROR_TWO_ARGS -/* Set the name of the password helper program, if any */ -#undef PASSWD_HELPER_PROGRAM - /* Define to necessary symbol if this constant uses a non-standard name on your system. */ #undef PTHREAD_CREATE_JOINABLE -/* Define as the return type of signal handlers (`int' or `void'). */ +/* Return type of signal handlers */ #undef RETSIGTYPE /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS -/* Define to 1 if you can safely include both and . */ -#undef TIME_WITH_SYS_TIME - -/* Define this to void* if you're using X11R4 or earlier. */ +/* Stare into the void. */ #undef XPointer /* Define to 1 if the X Window System is missing or not being used. */ diff --git a/config.sub b/config.sub old mode 100644 new mode 100755 index 9ccf09a7..c874b7a9 --- a/config.sub +++ b/config.sub @@ -1,8 +1,8 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2018 Free Software Foundation, Inc. +# Copyright 1992-2020 Free Software Foundation, Inc. -timestamp='2018-03-08' +timestamp='2020-11-07' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -50,7 +50,7 @@ timestamp='2018-03-08' # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. -me=`echo "$0" | sed -e 's,.*/,,'` +me=$(echo "$0" | sed -e 's,.*/,,') usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS @@ -67,7 +67,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2018 Free Software Foundation, Inc. +Copyright 1992-2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -89,7 +89,7 @@ while test $# -gt 0 ; do - ) # Use stdin as input. break ;; -* ) - echo "$me: invalid option $1$help" + echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) @@ -110,1223 +110,1167 @@ case $# in exit 1;; esac -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ - kopensolaris*-gnu* | cloudabi*-eabi* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - android-linux) - os=-linux-android - basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown - ;; - *) - basic_machine=`echo "$1" | sed 's/-[^-]*$//'` - if [ "$basic_machine" != "$1" ] - then os=`echo "$1" | sed 's/.*-/-/'` - else os=; fi - ;; -esac +# Split fields of configuration type +# shellcheck disable=SC2162 +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 ;; - -lynx*) - os=-lynxos + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 ;; - -ptx*) - basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac ;; - -psos*) - os=-psos + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac ;; esac -# Decode aliases for certain CPU-COMPANY combinations. +# Decode 1-component or ad-hoc basic machines case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arceb \ - | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ - | avr | avr32 \ - | ba \ - | be32 | be64 \ - | bfin \ - | c4x | c8051 | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | e2k | epiphany \ - | fido | fr30 | frv | ft32 \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia16 | ia64 \ - | ip2k | iq2000 \ - | k1om \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa32r6 | mipsisa32r6el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64r6 | mipsisa64r6el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipsr5900 | mipsr5900el \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 | nios2eb | nios2el \ - | ns16k | ns32k \ - | open8 | or1k | or1knd | or32 \ - | pdp10 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pru \ - | pyramid \ - | riscv32 | riscv64 \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | visium \ - | wasm32 \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - leon|leon[3-9]) - basic_machine=sparc-$basic_machine - ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) - basic_machine=$basic_machine-unknown - os=-none + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) + op50n) + cpu=hppa1.1 + vendor=oki ;; - ms1) - basic_machine=mt-unknown + op60c) + cpu=hppa1.1 + vendor=oki ;; - - strongarm | thumb | xscale) - basic_machine=arm-unknown + ibm*) + cpu=i370 + vendor=ibm ;; - xgate) - basic_machine=$basic_machine-unknown - os=-none + orion105) + cpu=clipper + vendor=highlevel ;; - xscaleeb) - basic_machine=armeb-unknown + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple ;; - - xscaleel) - basic_machine=armel-unknown + pmac | pmac-mpw) + cpu=powerpc + vendor=apple ;; - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | aarch64-* | aarch64_be-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | ba-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | c8051-* | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | e2k-* | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ - | ip2k-* | iq2000-* \ - | k1om-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ - | microblaze-* | microblazeel-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa32r6-* | mipsisa32r6el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64r6-* | mipsisa64r6el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipsr5900-* | mipsr5900el-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* | nios2eb-* | nios2el-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | or1k*-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pru-* \ - | pyramid-* \ - | riscv32-* | riscv64-* \ - | rl78-* | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | visium-* \ - | wasm32-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-pc - os=-bsd - ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att + cpu=m68000 + vendor=att ;; 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - asmjs) - basic_machine=asmjs-unknown - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=-linux + cpu=we32k + vendor=att ;; bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec + cpu=powerpc + vendor=ibm + basic_os=cnk ;; decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 + cpu=pdp10 + vendor=dec + basic_os=tops10 ;; decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 + cpu=pdp10 + vendor=dec + basic_os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx + cpu=m68k + vendor=motorola ;; dpx2*) - basic_machine=m68k-bull - os=-sysv3 - ;; - e500v[12]) - basic_machine=powerpc-unknown - os=$os"spe" - ;; - e500v[12]-*) - basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=$os"spe" - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd + cpu=m68k + vendor=bull + basic_os=sysv3 ;; encore | umax | mmax) - basic_machine=ns32k-encore + cpu=ns32k + vendor=encore ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} ;; fx2800) - basic_machine=i860-alliant + cpu=i860 + vendor=alliant ;; genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 + cpu=ns32k + vendor=ns ;; h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp + cpu=hppa1.0 + vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp + cpu=m68000 + vendor=hp ;; hp9k3[2-9][0-9]) - basic_machine=m68k-hp + cpu=m68k + vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp + cpu=hppa1.0 + vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm + cpu=hppa1.0 + vendor=hp ;; i*86v32) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=-sysv32 + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=sysv32 ;; i*86v4*) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=-sysv4 + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=sysv4 ;; i*86v) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=-sysv + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=sysv ;; i*86sol2) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=-solaris2 + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=solaris2 ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - vsta) - basic_machine=i386-unknown - os=-vsta + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} ;; iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) + cpu=mips + vendor=sgi + case $basic_os in + irix*) ;; *) - os=-irix4 + basic_os=irix4 ;; esac ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - leon-*|leon[3-9]-*) - basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=-linux - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze*) - basic_machine=microblaze-xilinx - ;; - mingw64) - basic_machine=x86_64-pc - os=-mingw64 - ;; - mingw32) - basic_machine=i686-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos + cpu=m68000 + vendor=convergent ;; - moxiebox) - basic_machine=moxie-unknown - os=-moxiebox - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` - ;; - msys) - basic_machine=i686-pc - os=-msys - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - nacl) - basic_machine=le32-unknown - os=-nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint ;; news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv + cpu=mips + vendor=sony + basic_os=newsos ;; next | m*-next) - basic_machine=m68k-next - case $os in - -nextstep* ) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) ;; - -ns2*) - os=-nextstep2 + ns2*) + basic_os=nextstep2 ;; *) - os=-nextstep3 + basic_os=nextstep3 ;; esac ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - nsv-tandem) - basic_machine=nsv-tandem - ;; - nsx-tandem) - basic_machine=nsx-tandem + cpu=np1 + vendor=gould ;; op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k + cpu=hppa1.1 + vendor=oki + basic_os=proelf ;; pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=-linux + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 ;; pbd) - basic_machine=sparc-tti + cpu=sparc + vendor=tti ;; pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc + cpu=m68k + vendor=tti ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` + pc532) + cpu=ns32k + vendor=pc532 ;; pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm + cpu=pn + vendor=gould ;; - ppc | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` + power) + cpu=power + vendor=ibm ;; - ppc64) basic_machine=powerpc64-unknown + ps2) + cpu=i386 + vendor=ibm ;; - ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` + rm[46]00) + cpu=mips + vendor=siemens ;; - ppc64le | powerpc64little) - basic_machine=powerpc64le-unknown + rtpc | rtpc-*) + cpu=romp + vendor=ibm ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} ;; - ps2) - basic_machine=i386-ibm + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks ;; - pw32) - basic_machine=i586-unknown - os=-pw32 + tower | tower-32) + cpu=m68k + vendor=ncr ;; - rdos | rdos64) - basic_machine=x86_64-pc - os=-rdos + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu ;; - rdos32) - basic_machine=i386-pc - os=-rdos + w65) + cpu=w65 + vendor=wdc ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf ;; - rm[46]00) - basic_machine=mips-siemens + none) + cpu=none + vendor=none ;; - rtpc | rtpc-*) - basic_machine=romp-ibm + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine ;; - s390 | s390-*) - basic_machine=s390-ibm + leon-*|leon[3-9]-*) + cpu=sparc + vendor=$(echo "$basic_machine" | sed 's/-.*//') ;; - s390x | s390x-*) - basic_machine=s390x-ibm + + *-*) + # shellcheck disable=SC2162 + IFS="-" read cpu vendor <&2 - exit 1 + # Recognize the canonical CPU types that are allowed with any + # company name. + case $cpu in + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | abacus \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ + | alphapca5[67] | alpha64pca5[67] \ + | am33_2.0 \ + | amdgcn \ + | arc | arceb \ + | arm | arm[lb]e | arme[lb] | armv* \ + | avr | avr32 \ + | asmjs \ + | ba \ + | be32 | be64 \ + | bfin | bpf | bs2000 \ + | c[123]* | c30 | [cjt]90 | c4x \ + | c8051 | clipper | craynv | csky | cydra \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | elxsi | epiphany \ + | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ + | h8300 | h8500 \ + | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i*86 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle \ + | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ + | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ + | m88110 | m88k | maxq | mb | mcore | mep | metag \ + | microblaze | microblazeel \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64eb | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mmix \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nfp \ + | nios | nios2 | nios2eb | nios2el \ + | none | np1 | ns16k | ns32k | nvptx \ + | open8 \ + | or1k* \ + | or32 \ + | orion \ + | picochip \ + | pdp10 | pdp11 | pj | pjl | pn | power \ + | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ + | pru \ + | pyramid \ + | riscv | riscv32 | riscv64 \ + | rl78 | romp | rs6000 | rx \ + | s390 | s390x \ + | score \ + | sh | shl \ + | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \ + | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \ + | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \ + | spu \ + | tahoe \ + | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \ + | tron \ + | ubicom32 \ + | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ + | vax \ + | visium \ + | w65 \ + | wasm32 | wasm64 \ + | we32k \ + | x86 | x86_64 | xc16x | xgate | xps100 \ + | xstormy16 | xtensa* \ + | ymp \ + | z8k | z80) + ;; + + *) + echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 + exit 1 + ;; + esac ;; esac # Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` +case $vendor in + digital*) + vendor=dec ;; - *-commodore*) - basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` + commodore*) + vendor=cbm ;; *) ;; @@ -1334,203 +1278,213 @@ esac # Decode manufacturer-specific aliases for certain operating systems. -if [ x"$os" != x"" ] +if test x$basic_os != x then + +# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=$(echo $basic_os | sed -e 's|gnu/linux|gnu|') + ;; + os2-emx) + kernel=os2 + os=$(echo $basic_os | sed -e 's|os2-emx|emx|') + ;; + nto-qnx*) + kernel=nto + os=$(echo $basic_os | sed -e 's|nto-qnx|qnx|') + ;; + *-*) + # shellcheck disable=SC2162 + IFS="-" read kernel os <&2 - exit 1 + # No normalization, but not necessarily accepted, that comes below. ;; esac + else # Here we handle the default operating systems that come with various machines. @@ -1543,254 +1497,352 @@ else # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. -case $basic_machine in +kernel= +case $cpu-$vendor in score-*) - os=-elf + os=elf ;; spu-*) - os=-elf + os=elf ;; *-acorn) - os=-riscix1.2 + os=riscix1.2 ;; arm*-rebel) - os=-linux + kernel=linux + os=gnu ;; arm*-semi) - os=-aout + os=aout ;; c4x-* | tic4x-*) - os=-coff + os=coff ;; c8051-*) - os=-elf + os=elf + ;; + clipper-intergraph) + os=clix ;; hexagon-*) - os=-elf + os=elf ;; tic54x-*) - os=-coff + os=coff ;; tic55x-*) - os=-coff + os=coff ;; tic6x-*) - os=-coff + os=coff ;; # This must come before the *-dec entry. pdp10-*) - os=-tops20 + os=tops20 ;; pdp11-*) - os=-none + os=none ;; *-dec | vax-*) - os=-ultrix4.2 + os=ultrix4.2 ;; m68*-apollo) - os=-domain + os=domain ;; i386-sun) - os=-sunos4.0.2 + os=sunos4.0.2 ;; m68000-sun) - os=-sunos3 + os=sunos3 ;; m68*-cisco) - os=-aout + os=aout ;; mep-*) - os=-elf + os=elf ;; mips*-cisco) - os=-elf + os=elf ;; mips*-*) - os=-elf + os=elf ;; or32-*) - os=-coff + os=coff ;; *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 + os=sysv3 ;; sparc-* | *-sun) - os=-sunos4.1.1 + os=sunos4.1.1 ;; pru-*) - os=-elf + os=elf ;; *-be) - os=-beos + os=beos ;; *-ibm) - os=-aix + os=aix ;; *-knuth) - os=-mmixware + os=mmixware ;; *-wec) - os=-proelf + os=proelf ;; *-winbond) - os=-proelf + os=proelf ;; *-oki) - os=-proelf + os=proelf ;; *-hp) - os=-hpux + os=hpux ;; *-hitachi) - os=-hiux + os=hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv + os=sysv ;; *-cbm) - os=-amigaos + os=amigaos ;; *-dg) - os=-dgux + os=dgux ;; *-dolphin) - os=-sysv3 + os=sysv3 ;; m68k-ccur) - os=-rtu + os=rtu ;; m88k-omron*) - os=-luna + os=luna ;; *-next) - os=-nextstep + os=nextstep ;; *-sequent) - os=-ptx + os=ptx ;; *-crds) - os=-unos + os=unos ;; *-ns) - os=-genix + os=genix ;; i370-*) - os=-mvs + os=mvs ;; *-gould) - os=-sysv + os=sysv ;; *-highlevel) - os=-bsd + os=bsd ;; *-encore) - os=-bsd + os=bsd ;; *-sgi) - os=-irix + os=irix ;; *-siemens) - os=-sysv4 + os=sysv4 ;; *-masscomp) - os=-rtu + os=rtu ;; f30[01]-fujitsu | f700-fujitsu) - os=-uxpv + os=uxpv ;; *-rom68k) - os=-coff + os=coff ;; *-*bug) - os=-coff + os=coff ;; *-apple) - os=-macos + os=macos ;; *-atari*) - os=-mint + os=mint + ;; + *-wrs) + os=vxworks ;; *) - os=-none + os=none ;; esac + fi +# Now, validate our (potentially fixed-up) OS. +case $os in + # Sometimes we do "kernel-abi", so those need to count as OSes. + musl* | newlib* | uclibc*) + ;; + # Likewise for "kernel-libc" + eabi | eabihf | gnueabi | gnueabihf) + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ + | hiux* | abug | nacl* | netware* | windows* \ + | os9* | macos* | osx* | ios* \ + | mpw* | magic* | mmixware* | mon960* | lnews* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* | twizzler* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | mirbsd* | netbsd* | dicos* | openedition* | ose* \ + | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \ + | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | mint* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \ + | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + none) + ;; + *) + echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* ) + ;; + uclinux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) vendor=acorn ;; - -sunos*) + *-sunos*) vendor=sun ;; - -cnk*|-aix*) + *-cnk* | *-aix*) vendor=ibm ;; - -beos*) + *-beos*) vendor=be ;; - -hpux*) + *-hpux*) vendor=hp ;; - -mpeix*) + *-mpeix*) vendor=hp ;; - -hiux*) + *-hiux*) vendor=hitachi ;; - -unos*) + *-unos*) vendor=crds ;; - -dgux*) + *-dgux*) vendor=dg ;; - -luna*) + *-luna*) vendor=omron ;; - -genix*) + *-genix*) vendor=ns ;; - -mvs* | -opened*) + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) vendor=ibm ;; - -os400*) + s390-* | s390x-*) vendor=ibm ;; - -ptx*) + *-ptx*) vendor=sequent ;; - -tpf*) + *-tpf*) vendor=ibm ;; - -vxsim* | -vxworks* | -windiss*) + *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; - -aux*) + *-aux*) vendor=apple ;; - -hms*) + *-hms*) vendor=hitachi ;; - -mpw* | -macos*) + *-mpw* | *-macos*) vendor=apple ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; - -vos*) + *-vos*) vendor=stratus ;; esac - basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` ;; esac -echo "$basic_machine$os" +echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: diff --git a/configure b/configure index 7d7f55c2..4a03e1e8 100755 --- a/configure +++ b/configure @@ -620,7 +620,7 @@ DEPEND APPDEFAULTS ANIM_LIBS ANIM_OBJS -GTK_EXTRA_OBJS +FONT_DIR HACK_CONF_DIR PO_DATADIR GTK_DATADIR @@ -641,22 +641,16 @@ GL_EXES JPEG_EXES LOCK_OBJS LOCK_SRCS -SAVER_GL_LIBS -SAVER_GL_OBJS -SAVER_GL_SRCS XFT_LIBS XFT_OBJS XFT_SRCS -XMU_LIBS -XMU_OBJS -XMU_SRCS PASSWD_OBJS PASSWD_SRCS MEN_OSX SCRIPTS_OSX +SYSTEMD_LIBS EXES_SYSTEMD EXES_OSX -OBJCC WITH_BROWSER DEFAULT_TEXT_FILE DEFAULT_IMAGE_DIRECTORY @@ -666,11 +660,10 @@ NEW_LOGIN_COMMAND COMMENT_PAM_CHECK_ACCOUNT HAVE_PAM_FAIL_DELAY INSTALL_PAM -NEED_SETUID INSTALL_DIRS SETCAP_HACKS SETUID_HACKS -INSTALL_SETUID +SETUID_AUTH PROG_SETCAP LIBCAP_LIBS LIBCAP_CFLAGS @@ -690,11 +683,16 @@ SAVER_LIBS ALL_DEMO_PROGRAMS PREFERRED_DEMO_PROGRAM INCLUDES -setcap_program PTHREAD_CFLAGS PTHREAD_LIBS +PTHREAD_CXX PTHREAD_CC ax_pthread_config +SED +target_os +target_vendor +target_cpu +target login_manager_tmp gnome_url_show_program gnome_open_program @@ -824,6 +822,7 @@ with_app_defaults with_hackdir enable_subdir with_configdir +with_fontdir with_dpms_ext with_xf86vmode_ext with_xinerama_ext @@ -836,6 +835,7 @@ with_sgivc_ext with_readdisplay with_xshm_ext with_xdbe_ext +with_xkb_ext with_proc_interrupts with_proc_oom with_systemd @@ -846,22 +846,21 @@ with_pam_service_name enable_pam_check_account_type with_kerberos with_shadow -with_passwd_helper with_gtk with_motif with_login_manager with_image_directory with_text_file with_browser +with_pthread +with_gles with_gl +with_glx with_gle -with_gles with_jpeg with_png with_pixbuf with_xft -with_pthread -with_setcap_hacks with_setuid_hacks with_record_animation ' @@ -1460,6 +1459,7 @@ X features: System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi @@ -1474,14 +1474,15 @@ Installation Options: --with-app-defaults=DIR Where to install the default settings file. --with-hackdir=DIR Where to install the hundreds of demo executables. --with-configdir=DIR Where to install the GUI configuration files. + --with-fontdir=DIR Where to install the extra font files. Server Extension Options: --with-dpms-ext Include support for power management. --with-xf86vmode-ext Include support for virtual screens. --with-xinerama-ext Include support for multiple monitors. - --with-randr-ext Include different support for multiple monitors. - --with-xinput-ext Include support for the XInput extension. + --with-randr-ext Include support for multiple monitors. + --with-xinput-ext Include support for the XInput2 extension. --with-xf86gamma-ext Include support for XFree86 gamma fading. --with-xidle-ext Include support for the X11R5 XIDLE extension. --with-sgi-ext Include support for the SGI SCREEN_SAVER extension. @@ -1489,16 +1490,17 @@ Server Extension Options: --with-readdisplay Include support for the SGI XReadDisplay extension. --with-xshm-ext Include support for the Shared Memory extension. --with-xdbe-ext Include support for the DOUBLE-BUFFER extension. - --with-proc-interrupts Include support for consulting the /proc/interrupts - file to notice keyboard activity. - --with-proc-oom Include support for disabling the OOM-killer. + --with-xkb-ext Include support for the X Keyboard extension. + --with-proc-interrupts Include support for consulting /proc/interrupts to + notice activity on PS/2 keyboards and mice. + --with-proc-oom Include support to duck the out-of-memory killer. --with-systemd Support systemd requests to lock on suspend, and to allow video players to inhibit the screen saver. Screen Locking Options: --disable-locking Do not allow locking of the display at all. - --with-pam Include support for PAM (Pluggable Auth Modules.) + --with-pam Include support for PAM (Pluggable Auth Modules). --with-pam-service-name Set the name of the xscreensaver PAM service. --enable-pam-account Whether PAM should check the result of account modules when authenticating. Only do this if you @@ -1506,8 +1508,6 @@ Screen Locking Options: --enable-root-passwd Allow the root passwd to unlock, if not using PAM. --with-kerberos Include support for Kerberos authentication. --with-shadow Include support for shadow password authentication. - --with-passwd-helper Include support for an external password - verification helper program. User Interface Options: @@ -1522,18 +1522,17 @@ User Interface Options: Graphics Options: --with-gl Build those demos which depend on OpenGL. - --with-gle Build those demos which depend on GLE (extrusion). - --with-gles Target OpenGL ES 1.x API instead of OpenGL 1.3. + --with-gles Emulate OpenGL 1.3 in terms of OpenGL ES 1.x. + --with-glx Use GLX to interface OpenGL and X11 instead of EGL. + --with-gle Include support for the GL Extrusion library. --with-jpeg Include support for the JPEG library. --with-png Include support for the PNG library. --with-pixbuf Include support for the GDK-Pixbuf library, which allows the display of JPEG, PNG, GIF and SVG images. --with-xft Include support for the X Freetype library. --with-pthread Enables POSIX threads, for SMP support. - --with-setcap-hacks Build the "sonar" demo with libcap, which allows - it to ping other hosts without being setuid. --with-setuid-hacks Install the "sonar" demo as setuid root, which is - needed in order to ping other hosts without setcap. + needed in order to ping other hosts. --with-record-animation Include code for generating MP4 videos. Some influential environment variables: @@ -1702,48 +1701,6 @@ fi } # ac_fn_c_try_cpp -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using @@ -1831,6 +1788,48 @@ fi } # ac_fn_c_check_header_mongrel +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in @@ -2444,12 +2443,45 @@ echo "command line was: $0 $@" # ############################################################################### +# Defines in config.h are dumped out alphabetically rather than in any kind +# of sane order, sigh. + +# +# OS stuff. +# + +# +# X11 server stuff. +# + # This only ever existed in X11R4 and X11R5. # This only ever existed on SGI hardware. # This only ever existed on SGI hardware. +#AH_TEMPLATE([HAVE_XCOMPOSITE_EXTENSION], +# [Define this if you have the X Composite Extension.]) + +# +# GUI stuff. +# + +# +# Image loading. +# + +# +# Graphics libraries. +# + +# +# Locking. +# + +#AH_TEMPLATE([PASSWD_HELPER_PROGRAM], +# [Define this to use a third-party password helper program.]) + # After checking to see that --srcdir is correct (which AC_INIT does) # check for some random other files that come later in the tar file, # to make sure everything is here. @@ -2465,39 +2497,15 @@ for d in utils jwxyz hacks hacks/glx driver ; do fi done -############################################################################### -# -# Function to figure out how to run the compiler. -# -############################################################################### - ############################################################################### # # Check for availability of various gcc command-line options. # ############################################################################### -# Need to disable Objective C extensions in ANSI C on MacOS X to work -# around an Apple-specific gcc bug. -# - ############################################################################### # -# Function to figure out how to disable // comments in ANSI C code. -# -# (With recent gcc, this is done with "-std=c89". With older gcc, this -# is done by passing "-lang-c89" to cpp, by passing "-Wp,-lang-c89" to -# gcc. Old gcc doesn't support -std, and new gcc doesn't support -lang. -# so much for compatibility!) -# -# UPDATE: apparently there is NO WAY to tell gcc 3.2.2 to require that -# declarations preceed statements, without resorting to "-pedantic". -# This means that there is no way to get gcc3 to issue warnings that -# ensure that your code complies with the ANSI/ISO C89 standard, without -# also drowning in totally useless warnings. Thank you master may I -# have another. -# -# So, I give up, let's just use -pedantic. +# Function to figure out how to run the compiler. # ############################################################################### @@ -2524,12 +2532,6 @@ done perl_version_cmd='print $]' -############################################################################### -# -# Function to demand "bc". Losers. -# -############################################################################### - ############################################################################### # # Functions to check how to do ICMP PING requests. @@ -2544,6 +2546,7 @@ perl_version_cmd='print $]' # Try and find the app-defaults directory. # It sucks that autoconf doesn't do this already... +# (AC_PATH_X_APP_DEFAULTS_XMKMF is no longer used.) # # Random special-cases for X on certain pathological OSes. @@ -2562,14 +2565,14 @@ perl_version_cmd='print $]' # Like AC_EGREP_HEADER, but it uses the already-computed -I directories. # -# Like AC_TRY_COMPILE, but it uses the already-computed -I directories. +# Like AC_COMPILE_IFELSE but it uses the already-computed -I directories. # # Like AC_CHECK_LIB, but it uses the already-computed -I and -L directories. # Use this sparingly; it probably doesn't work very well on X programs. # -# Like AC_TRY_RUN, but it uses the already-computed -I directories. +# Like AC_RUN_IFELSE but it uses the already-computed -I directories. # (But not the -L directories!) # @@ -2597,6 +2600,10 @@ perl_version_cmd='print $]' ############################################################################### ############################################################################### +# Default $PATH might not contain /sbin and thus miss /sbin/setcap. +# +export PATH="$PATH:/usr/bin:/bin:/usr/sbin:/sbin" + # WTF! autoconf emits this *way* too late. Do it earlier. test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' @@ -3517,165 +3524,233 @@ $as_echo "Solaris: adding -D__EXTENSIONS__" >&6; } CC="$CC -D__EXTENSIONS__" ;; esac + + # Prior to 1996, XScreenSaver was written in K&R C, because ANSI C + # compilers (function prototypes!) were not yet universally deployed. + # And even after the conversion to ANSI C, GNU C's various non-standard + # extensions (such as allowing C++ style "//" comments in C code, and + # declarations after statements) were not supported by non-gcc compilers + # for many years, so we continued to use "-std=c89" to prevent those + # GNU-isms from sneaking in to the code. Well, these days various + # vendors have sloppily allowed non-ANSI syntax to slip into their + # library header files. GTK and OpenGL have been major offenders in this + # way. So... as of 2021, I guess we are forced to use "-std=gnu89", to + # allow those extensions, and hope that the warnings generated by + # "-pedantic" are heeded. + # + if test -n "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -std=gnu89" >&5 +$as_echo_n "checking whether gcc accepts -std=gnu89... " >&6; } +if ${ac_cv_gcc_accepts_gnu89+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -rf conftest.$ac_ext + touch conftest.$ac_ext + if ( ( gcc -c -std=gnu89 conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ + grep unrecognized >/dev/null ); then + ac_cv_gcc_accepts_gnu89=no + else + ac_cv_gcc_accepts_gnu89=yes + CC="$CC -std=gnu89" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_gnu89" >&5 +$as_echo "$ac_cv_gcc_accepts_gnu89" >&6; } + ac_gcc_accepts_gnu89="$ac_cv_gcc_accepts_gnu89" fi - OBJCC="$CC" + if test -n "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -pedantic" >&5 +$as_echo_n "checking whether gcc accepts -pedantic... " >&6; } +if ${ac_cv_gcc_accepts_pedantic+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -rf conftest.$ac_ext + touch conftest.$ac_ext + if ( ( gcc -c -pedantic conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ + grep unrecognized >/dev/null ); then + ac_cv_gcc_accepts_pedantic=no + else + ac_cv_gcc_accepts_pedantic=yes + CC="$CC -pedantic" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_pedantic" >&5 +$as_echo "$ac_cv_gcc_accepts_pedantic" >&6; } + ac_gcc_accepts_pedantic="$ac_cv_gcc_accepts_pedantic" + fi - # This test makes cross-compiling fail, so let's just assume that nobody - # is using a K&R compiler any more... - # -# AC_MSG_CHECKING([whether the compiler works on ANSI C]) -# AC_TRY_RUN([ main(int ac, char **av) { return 0; } ], -# AC_MSG_RESULT(yes), -# AC_MSG_RESULT(no) -# AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.), -# AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.)) - - if test -n "$GCC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: Turning on gcc compiler warnings." >&5 -$as_echo "Turning on gcc compiler warnings." >&6; } - CC="$CC -pedantic -Wall -Wstrict-prototypes -Wnested-externs -Wmissing-prototypes" - OBJCC="$OBJCC -Wall" - # As of gcc 3.4, we have "-Wdeclaration-after-statement" - # and so perhaps now we can do without -pedantic? - else - case "$host" in - *-irix5* |*-irix6.0-3* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: Turning on SGI compiler warnings." >&5 -$as_echo "Turning on SGI compiler warnings." >&6; } - CC="$CC -fullwarn -use_readonly_const -rdata_shared -g3" - ;; -# *-dec-osf* ) -# if test -z "$GCC"; then -# AC_MSG_RESULT(Turning on DEC C compiler warnings.) -# CC="$CC -migrate -w0 -verbose -warnprotos" -# fi -# ;; - esac + if test -n "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wall" >&5 +$as_echo_n "checking whether gcc accepts -Wall... " >&6; } +if ${ac_cv_gcc_accepts_Wall+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -rf conftest.$ac_ext + touch conftest.$ac_ext + if ( ( gcc -c -Wall conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ + grep unrecognized >/dev/null ); then + ac_cv_gcc_accepts_Wall=no + else + ac_cv_gcc_accepts_Wall=yes + CC="$CC -Wall" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_Wall" >&5 +$as_echo "$ac_cv_gcc_accepts_Wall" >&6; } + ac_gcc_accepts_Wall="$ac_cv_gcc_accepts_Wall" fi -if test -n "$GCC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wno-overlength-strings" >&5 -$as_echo_n "checking whether gcc accepts -Wno-overlength-strings... " >&6; } -if ${ac_cv_gcc_accepts_no_overlength+:} false; then : + if test -n "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wnested-externs" >&5 +$as_echo_n "checking whether gcc accepts -Wnested-externs... " >&6; } +if ${ac_cv_gcc_accepts_wnested_externs+:} false; then : $as_echo_n "(cached) " >&6 else rm -rf conftest.$ac_ext touch conftest.$ac_ext - if ( ( gcc -c -Wno-overlength-strings conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ + if ( ( gcc -c -Wnested-externs conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ grep unrecognized >/dev/null ); then - ac_cv_gcc_accepts_no_overlength=no + ac_cv_gcc_accepts_wnested_externs=no else - ac_cv_gcc_accepts_no_overlength=yes - CC="$CC -Wno-overlength-strings" + ac_cv_gcc_accepts_wnested_externs=yes + CC="$CC -Wnested-externs" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_wnested_externs" >&5 +$as_echo "$ac_cv_gcc_accepts_wnested_externs" >&6; } + ac_gcc_accepts_wnested_externs="$ac_cv_gcc_accepts_wnested_externs" + fi + + if test -n "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wstrict-prototypes" >&5 +$as_echo_n "checking whether gcc accepts -Wstrict-prototypes... " >&6; } +if ${ac_cv_gcc_accepts_wstrict_prototypes+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -rf conftest.$ac_ext + touch conftest.$ac_ext + if ( ( gcc -c -Wstrict-prototypes conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ + grep unrecognized >/dev/null ); then + ac_cv_gcc_accepts_wstrict_prototypes=no + else + ac_cv_gcc_accepts_wstrict_prototypes=yes + CC="$CC -Wstrict-prototypes" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_wstrict_prototypes" >&5 +$as_echo "$ac_cv_gcc_accepts_wstrict_prototypes" >&6; } + ac_gcc_accepts_wstrict_prototypes="$ac_cv_gcc_accepts_wstrict_prototypes" + fi + + if test -n "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wmissing-prototypes" >&5 +$as_echo_n "checking whether gcc accepts -Wmissing-prototypes... " >&6; } +if ${ac_cv_gcc_accepts_wmissing_prototypes+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -rf conftest.$ac_ext + touch conftest.$ac_ext + if ( ( gcc -c -Wmissing-prototypes conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ + grep unrecognized >/dev/null ); then + ac_cv_gcc_accepts_wmissing_prototypes=no + else + ac_cv_gcc_accepts_wmissing_prototypes=yes + CC="$CC -Wmissing-prototypes" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_overlength" >&5 -$as_echo "$ac_cv_gcc_accepts_no_overlength" >&6; } - ac_gcc_accepts_no_overlength="$ac_cv_gcc_accepts_no_overlength" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_wmissing_prototypes" >&5 +$as_echo "$ac_cv_gcc_accepts_wmissing_prototypes" >&6; } + ac_gcc_accepts_wmissing_prototypes="$ac_cv_gcc_accepts_wmissing_prototypes" fi -if test -n "$GCC"; then + if test -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wdeclaration-after-statement" >&5 $as_echo_n "checking whether gcc accepts -Wdeclaration-after-statement... " >&6; } -if ${ac_cv_gcc_accepts_no_decl_after+:} false; then : +if ${ac_cv_gcc_accepts_declaration_after+:} false; then : $as_echo_n "(cached) " >&6 else rm -rf conftest.$ac_ext touch conftest.$ac_ext if ( ( gcc -c -Wdeclaration-after-statement conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ grep unrecognized >/dev/null ); then - ac_cv_gcc_accepts_no_decl_after=no + ac_cv_gcc_accepts_declaration_after=no else - ac_cv_gcc_accepts_no_decl_after=yes + ac_cv_gcc_accepts_declaration_after=yes CC="$CC -Wdeclaration-after-statement" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_decl_after" >&5 -$as_echo "$ac_cv_gcc_accepts_no_decl_after" >&6; } - ac_gcc_accepts_no_decl_after="$ac_cv_gcc_accepts_no_decl_after" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_declaration_after" >&5 +$as_echo "$ac_cv_gcc_accepts_declaration_after" >&6; } + ac_gcc_accepts_declaration_after="$ac_cv_gcc_accepts_declaration_after" fi -if test -n "$GCC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -no-cpp-precomp" >&5 -$as_echo_n "checking whether gcc accepts -no-cpp-precomp... " >&6; } -if ${ac_cv_gcc_accepts_no_cpp_precomp+:} false; then : + # "string length is greater than ISO C89 compilers required to support" + if test -n "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wno-overlength-strings" >&5 +$as_echo_n "checking whether gcc accepts -Wno-overlength-strings... " >&6; } +if ${ac_cv_gcc_accepts_no_overlength_strings+:} false; then : $as_echo_n "(cached) " >&6 else rm -rf conftest.$ac_ext touch conftest.$ac_ext - if ( ( gcc -c -no-cpp-precomp conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ + if ( ( gcc -c -Wno-overlength-strings conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ grep unrecognized >/dev/null ); then - ac_cv_gcc_accepts_no_cpp_precomp=no + ac_cv_gcc_accepts_no_overlength_strings=no else - ac_cv_gcc_accepts_no_cpp_precomp=yes - CC="$CC -no-cpp-precomp" + ac_cv_gcc_accepts_no_overlength_strings=yes + CC="$CC -Wno-overlength-strings" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_cpp_precomp" >&5 -$as_echo "$ac_cv_gcc_accepts_no_cpp_precomp" >&6; } - ac_gcc_accepts_no_cpp_precomp="$ac_cv_gcc_accepts_no_cpp_precomp" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_overlength_strings" >&5 +$as_echo "$ac_cv_gcc_accepts_no_overlength_strings" >&6; } + ac_gcc_accepts_no_overlength_strings="$ac_cv_gcc_accepts_no_overlength_strings" fi -if test -n "$GCC"; then - - case "$host" in - *-darwin* ) - # Fucking Apple let // comments sneak into OpenGL headers, so - # we *must* allow // comments when compiling on Mac OS 10.6! FUCK! - ;; - *) - if test -n "$GCC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -std=c89" >&5 -$as_echo_n "checking whether gcc accepts -std=c89... " >&6; } -if ${ac_cv_gcc_accepts_std+:} false; then : + # Ignore warnings about using "inline" + if test -n "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wno-language-extension-token" >&5 +$as_echo_n "checking whether gcc accepts -Wno-language-extension-token... " >&6; } +if ${ac_cv_gcc_accepts_no_language_ext_token+:} false; then : $as_echo_n "(cached) " >&6 else rm -rf conftest.$ac_ext touch conftest.$ac_ext - if ( ( gcc -c -std=c89 conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ + if ( ( gcc -c -Wno-language-extension-token conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ grep unrecognized >/dev/null ); then - ac_cv_gcc_accepts_std=no + ac_cv_gcc_accepts_no_language_ext_token=no else - ac_cv_gcc_accepts_std=yes - CC="$CC -std=c89" + ac_cv_gcc_accepts_no_language_ext_token=yes + CC="$CC -Wno-language-extension-token" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_std" >&5 -$as_echo "$ac_cv_gcc_accepts_std" >&6; } - ac_gcc_accepts_std="$ac_cv_gcc_accepts_std" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_language_ext_token" >&5 +$as_echo "$ac_cv_gcc_accepts_no_language_ext_token" >&6; } + ac_gcc_accepts_no_language_ext_token="$ac_cv_gcc_accepts_no_language_ext_token" fi - ;; - esac + # Xlib headers use named variadic macros. + if test -n "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wno-variadic-macros" >&5 +$as_echo_n "checking whether gcc accepts -Wno-variadic-macros... " >&6; } +if ${ac_cv_gcc_accepts_no_variadic_macros+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -rf conftest.$ac_ext + touch conftest.$ac_ext + if ( ( gcc -c -Wno-variadic-macros conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ + grep unrecognized >/dev/null ); then + ac_cv_gcc_accepts_no_variadic_macros=no + else + ac_cv_gcc_accepts_no_variadic_macros=yes + CC="$CC -Wno-variadic-macros" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_variadic_macros" >&5 +$as_echo "$ac_cv_gcc_accepts_no_variadic_macros" >&6; } + ac_gcc_accepts_no_variadic_macros="$ac_cv_gcc_accepts_no_variadic_macros" + fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: Disabling C++ comments in ANSI C code." >&5 -$as_echo "Disabling C++ comments in ANSI C code." >&6; } - # - # The reason that // comments are banned from xscreensaver is that gcc is - # basically the only compiler in the world that supports them in C code. - # All other vendors support them only in their C++ compilers, not in their - # ANSI C compilers. This means that it's a portability problem: every time - # these comments have snuck into the xscreensaver source code, I've gotten - # complaints about it the next day. So we turn off support for them in gcc - # as well to prevent them from accidentially slipping in. - # - if test "$ac_gcc_accepts_std" = yes ; then - # - # -std=c89 defines __STRICT_ANSI__, which we don't want. - # (That appears to be the only additional preprocessor symbol - # it defines, in addition to the syntax changes it makes.) - # - # -std=gnu89 is no good, because // comments were a GNU extension - # before they were in the ANSI C 99 spec... (gcc 2.96 permits // - # with -std=gnu89 but not with -std=c89.) - # - # $CC already contains "-std=c89" via AC_GCC_ACCEPTS_STD - CC="$CC -U__STRICT_ANSI__" -# else -# # The old way: -# CC="$CC -Wp,-lang-c89" - fi fi ac_ext=c @@ -3938,21 +4013,6 @@ _ACEOF ;; esac -ac_bc_result=`echo 6+9 | bc 2>/dev/null` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bc" >&5 -$as_echo_n "checking for bc... " >&6; } - if test "$ac_bc_result" = "15" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - echo '' - as_fn_error $? "Your system doesn't have \"bc\", which has been a standard - part of Unix since the 1970s. Come back when your vendor - has grown a clue." "$LINENO" 5 - fi - # stuff for Makefiles # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -4442,72 +4502,9 @@ _ACEOF fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 -$as_echo_n "checking return type of signal handlers... " >&6; } -if ${ac_cv_type_signal+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include - -int -main () -{ -return *(signal (0, 0)) (0) == 1; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_signal=int -else - ac_cv_type_signal=void -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 -$as_echo "$ac_cv_type_signal" >&6; } - cat >>confdefs.h <<_ACEOF -#define RETSIGTYPE $ac_cv_type_signal -_ACEOF - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 -$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } -if ${ac_cv_header_time+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include - -int -main () -{ -if ((struct tm *) 0) -return 0; - ; - return 0; -} +#define RETSIGTYPE void _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_time=yes -else - ac_cv_header_time=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 -$as_echo "$ac_cv_header_time" >&6; } -if test $ac_cv_header_time = yes; then - -$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h - -fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } @@ -4729,24 +4726,7 @@ _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_gettimeofday_args=2 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #include -int -main () -{ -struct timeval tv; gettimeofday(&tv); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : ac_gettimeofday_args=1 -else - ac_gettimeofday_args=0 -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_gettimeofday_args=$ac_gettimeofday_args @@ -5188,14 +5168,12 @@ else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - #include - #include + #include + #include int main () { - - socklen_t socklen; - +socklen_t socklen; ; return 0; } @@ -6132,11 +6110,28 @@ fi ;; *-darwin*) - # On MacOS X (10.x with "fink"), many things are under /sw/. - # + # MacPorts on macOS + if test -d /opt/local/include ; then + X_CFLAGS="-I/opt/local/include $X_CFLAGS" + X_LIBS="-L/opt/local/lib $X_LIBS" + fi + + # Fink on macOS if test -d /sw/include ; then X_CFLAGS="-I/sw/include $X_CFLAGS" - X_LIBS="-L/sw/lib $X_LIBS" + X_LIBS="-L/sw/lib $X_LIBS" + fi + + # Homebrew on macOS Intel + if test -d /usr/local/include ; then + X_CFLAGS="-I/usr/local/include $X_CFLAGS" + X_LIBS="-L/usr/local/lib $X_LIBS" + fi + + # Homebrew on macOS ARM + if test -d /opt/homebrew/include ; then + X_CFLAGS="-I/opt/homebrew/include $X_CFLAGS" + X_LIBS="-L/opt/homebrew/lib $X_LIBS" fi ;; esac @@ -6177,9 +6172,43 @@ $as_echo "$ac_cv_xpointer" >&6; } $as_echo "#define XPointer char*" >>confdefs.h fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xt" >&5 +$as_echo_n "checking for Xt... " >&6; } +if ${ac_cv_libxt+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include +int +main () +{ +Widget foo = (Widget) 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_libxt=yes +else + ac_cv_libxt=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$ac_save_CPPFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libxt" >&5 +$as_echo "$ac_cv_libxt" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this is MacOS X" >&5 -$as_echo_n "checking whether this is MacOS X... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this is macOS" >&5 +$as_echo_n "checking whether this is macOS... " >&6; } ac_macosx=no ac_irix=no case "$host" in @@ -6339,6 +6368,14 @@ $as_echo "no" >&6; } # ############################################################################### +# Wow, this is complete madness. Why does po/Makefile.in.in exist?? Why does +# aclocal.m4 exist?? Why can't I upgrade it without everything breaking?? +# This IT_PROG_INTLTOOL nonsense has so many self-modifying levels of insanity +# that it *must* have been written by RMS. Or an equally demented protégé. +# Won't someone please have mercy on us all and write a normal po/Makefile.in +# that uses wildcards, and write a sane set of rules to detect gettext(3) and +# msgfmt(1) and just do the obviously straightforward thing? + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. @@ -7469,127 +7506,6 @@ $as_echo "$LINGUAS" >&6; } MKINSTALLDIRS="$INSTALL_DIRS" -############################################################################### -# -# Check for -lXmu (some fucked up vendors don't ship it...) -# -############################################################################### - -have_xmu=no - - ac_save_CPPFLAGS="$CPPFLAGS" - if test \! -z "$includedir" ; then - CPPFLAGS="$CPPFLAGS -I$includedir" - fi - CPPFLAGS="$CPPFLAGS $X_CFLAGS" - CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_compile "$LINENO" "X11/Xmu/Error.h" "ac_cv_header_X11_Xmu_Error_h" "#include - #include - #include -" -if test "x$ac_cv_header_X11_Xmu_Error_h" = xyes; then : - have_xmu=yes -fi - - CPPFLAGS="$ac_save_CPPFLAGS" -if test "$have_xmu" = no ; then - XMU_SRCS='$(UTILS_SRC)/xmu.c' - XMU_OBJS='$(UTILS_BIN)/xmu.o' - XMU_LIBS='' -else - XMU_SRCS='' - XMU_OBJS='' - XMU_LIBS='-lXmu' - $as_echo "#define HAVE_XMU 1" >>confdefs.h - -fi - -############################################################################### -# -# Check for the SunOS 4.1.x _get_wmShellWidgetClass bug. -# See comp.windows.x FAQ question 124. The right fix is to -# get OpenWindows 3.0 patches 100512-02 and 100573-03. -# -############################################################################### - -if test "$have_xmu" = yes ; then - case "$host" in - *-sunos4*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the SunOS 4.1.x _get_wmShellWidgetClass bug" >&5 -$as_echo_n "checking for the SunOS 4.1.x _get_wmShellWidgetClass bug... " >&6; } -if ${ac_cv_sunos_xmu_bug+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_LDFLAGS="$LDFLAGS" - if test \! -z "$x_libraries" ; then - LDFLAGS="$LDFLAGS -L$x_libraries" - fi - # Note: this trick never works! (Generally.) - # We're only getting away with using AC_TRY_LINK - # with X libraries because we know it's SunOS. - LDFLAGS="$LDFLAGS -lXmu -lXt -lX11 -lXext -lm" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_sunos_xmu_bug=no -else - ac_cv_sunos_xmu_bug=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$ac_save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sunos_xmu_bug" >&5 -$as_echo "$ac_cv_sunos_xmu_bug" >&6; } - if test "$ac_cv_sunos_xmu_bug" = yes ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler understands -static" >&5 -$as_echo_n "checking whether the compiler understands -static... " >&6; } -if ${ac_cv_ld_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -static" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_ld_static=yes -else - ac_cv_ld_static=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$ac_save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ld_static" >&5 -$as_echo "$ac_cv_ld_static" >&6; } - if test "$ac_cv_ld_static" = yes ; then - LDFLAGS="$LDFLAGS -static" - else - LDFLAGS="$LDFLAGS -Bstatic" - fi - fi - ;; - esac -fi - ############################################################################### # # The --with-x-app-defaults option @@ -7767,6 +7683,40 @@ else fi fi +############################################################################### +# +# Handle the --with-fontdir option +# +############################################################################### + +have_fontdir=yes +with_fontdir_req=unspecified + +# Check whether --with-fontdir was given. +if test "${with_fontdir+set}" = set; then : + withval=$with_fontdir; with_fontdir="$withval"; with_fontdir_req="$withval" +else + with_fontdir=yes +fi + +if test x"$with_fontdir" = xyes; then + FONT_DIR='${datarootdir}/fonts/xscreensaver' + if test "$ac_macosx" = yes; then + FONT_DIR='/Library/Fonts' + fi +elif test x"$with_fontdir" = xno; then + FONT_DIR='' +else + # there must be a better way than this... + if test -z "`echo $with_fontdir | sed 's@^/.*@@'`" ; then + # absolute path + FONT_DIR="$with_fontdir" + else + # relative path + FONT_DIR='${datarootdir}/fonts/'"$with_fontdir" + fi +fi + ############################################################################### # # Check for the DPMS server extension. @@ -8681,7 +8631,7 @@ fi $as_echo "#define HAVE_RANDR 1" >>confdefs.h # Now check for version 1.2 in the same libs. - # Try to compile, since on MacOS 10.5.7, headers are older than libs! + # Try to compile, since on macOS 10.5.7, headers are older than libs! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenResources" >&5 $as_echo_n "checking for XRRGetScreenResources... " >&6; } if ${ac_cv_randr_12+:} false; then : @@ -8732,87 +8682,6 @@ elif test "$with_randr" != no; then exit 1 fi -############################################################################### -# -# Check for XF86MiscSetGrabKeysState (but only bother if we are already -# using other XF86 stuff.) -# -############################################################################### - -have_xf86miscsetgrabkeysstate=no -if test "$have_xf86gamma" = yes -o "$have_xf86vmode" = yes; then - - ac_save_CPPFLAGS="$CPPFLAGS" - ac_save_LDFLAGS="$LDFLAGS" -# ac_save_LIBS="$LIBS" - - if test \! -z "$includedir" ; then - CPPFLAGS="$CPPFLAGS -I$includedir" - fi - # note: $X_CFLAGS includes $x_includes - CPPFLAGS="$CPPFLAGS $X_CFLAGS" - - if test \! -z "$libdir" ; then - LDFLAGS="$LDFLAGS -L$libdir" - fi - # note: $X_LIBS includes $x_libraries - LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" - - CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XF86MiscSetGrabKeysState in -lXxf86misc" >&5 -$as_echo_n "checking for XF86MiscSetGrabKeysState in -lXxf86misc... " >&6; } -if ${ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lXxf86misc -lXext -lX11 $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char XF86MiscSetGrabKeysState (); -int -main () -{ -return XF86MiscSetGrabKeysState (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState=yes -else - ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState" >&5 -$as_echo "$ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState" >&6; } -if test "x$ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState" = xyes; then : - have_xf86miscsetgrabkeysstate=yes -else - true -fi - - CPPFLAGS="$ac_save_CPPFLAGS" - LDFLAGS="$ac_save_LDFLAGS" -# LIBS="$ac_save_LIBS" - - if test "$have_xf86miscsetgrabkeysstate" = yes ; then - SAVER_LIBS="$SAVER_LIBS -lXxf86misc" - $as_echo "#define HAVE_XF86MISCSETGRABKEYSSTATE 1" >>confdefs.h - - fi -fi - ############################################################################### # # Check for the XINPUT server extension. @@ -8821,6 +8690,7 @@ fi have_xinput=no with_xinput_req=unspecified +xinput_halfassed=no # Check whether --with-xinput-ext was given. if test "${with_xinput_ext+set}" = set; then : @@ -8874,7 +8744,7 @@ $as_echo "not found ($d: no such directory)" >&6; } if test "$with_xinput" = yes; then - # first check for Xinput.h + # first check for Xinput2.h ac_save_CPPFLAGS="$CPPFLAGS" if test \! -z "$includedir" ; then @@ -8882,9 +8752,9 @@ if test "$with_xinput" = yes; then fi CPPFLAGS="$CPPFLAGS $X_CFLAGS" CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XInput.h" "ac_cv_header_X11_extensions_XInput_h" "#include + ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XInput2.h" "ac_cv_header_X11_extensions_XInput2_h" "#include " -if test "x$ac_cv_header_X11_extensions_XInput_h" = xyes; then : +if test "x$ac_cv_header_X11_extensions_XInput2_h" = xyes; then : have_xinput=yes fi @@ -8893,6 +8763,7 @@ fi # if that succeeded, then check for libXi if test "$have_xinput" = yes; then have_xinput=no + xinput_halfassed=yes ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -8912,9 +8783,9 @@ fi CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XListInputDevices in -lXi" >&5 -$as_echo_n "checking for XListInputDevices in -lXi... " >&6; } -if ${ac_cv_lib_Xi_XListInputDevices+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XISelectEvents in -lXi" >&5 +$as_echo_n "checking for XISelectEvents in -lXi... " >&6; } +if ${ac_cv_lib_Xi_XISelectEvents+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8928,28 +8799,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char XListInputDevices (); +char XISelectEvents (); int main () { -return XListInputDevices (); +return XISelectEvents (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_Xi_XListInputDevices=yes + ac_cv_lib_Xi_XISelectEvents=yes else - ac_cv_lib_Xi_XListInputDevices=no + ac_cv_lib_Xi_XISelectEvents=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xi_XListInputDevices" >&5 -$as_echo "$ac_cv_lib_Xi_XListInputDevices" >&6; } -if test "x$ac_cv_lib_Xi_XListInputDevices" = xyes; then : - have_xinput=yes; SAVER_LIBS="$SAVER_LIBS -lXi" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xi_XISelectEvents" >&5 +$as_echo "$ac_cv_lib_Xi_XISelectEvents" >&6; } +if test "x$ac_cv_lib_Xi_XISelectEvents" = xyes; then : + have_xinput=yes; xinput_halfassed=no; + SAVER_LIBS="$SAVER_LIBS -lXi" else true fi @@ -10158,67 +10030,180 @@ fi ############################################################################### # -# Check for HP XHPDisableReset and XHPEnableReset. +# Check for the COMPOSITE server extension. # ############################################################################### -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XHPDisableReset in X11/XHPlib.h" >&5 -$as_echo_n "checking for XHPDisableReset in X11/XHPlib.h... " >&6; } - - ac_save_CPPFLAGS="$CPPFLAGS" - if test \! -z "$includedir" ; then - CPPFLAGS="$CPPFLAGS -I$includedir" - fi - CPPFLAGS="$CPPFLAGS $X_CFLAGS" - CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "XHPDisableReset" >/dev/null 2>&1; then : - $as_echo "#define HAVE_XHPDISABLERESET 1" >>confdefs.h - - SAVER_LIBS="-lXhp11 $SAVER_LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -rm -rf conftest* - - CPPFLAGS="$ac_save_CPPFLAGS" +#have_xcomposite=no +#with_xcomposite_req=unspecified +#AC_ARG_WITH(xcomposite-ext, +#[ --with-xcomposite-ext Include support for the XCOMPOSITE extension.], +# [with_xcomposite="$withval"; with_xcomposite_req="$withval"], +# [with_xcomposite=yes]) +# +#HANDLE_X_PATH_ARG(with_xcomposite, --with-xcomposite-ext, XCOMPOSITE) +# +#if test "$with_xcomposite" = yes; then +# +# AC_CHECK_X_HEADER(X11/extensions/Xcomposite.h, [have_xcomposite=yes],, +# [#include ]) +# if test "$have_xcomposite" = yes; then +# AC_DEFINE(HAVE_XCOMPOSITE_EXTENSION) +# SAVER_LIBS="-lXcomposite $SAVER_LIBS" +# fi +# +#elif test "$with_xcomposite" != no; then +# echo "error: must be yes or no: --with-xcomposite-ext=$with_xshm" +# exit 1 +#fi ############################################################################### # -# Check for /proc/interrupts. +# Check for the XKB server extension. # ############################################################################### -have_proc_interrupts=no -with_proc_interrupts_req=unspecified +have_xkb=no +with_xkb_req=unspecified -# Check whether --with-proc-interrupts was given. -if test "${with_proc_interrupts+set}" = set; then : - withval=$with_proc_interrupts; with_proc_interrupts="$withval"; with_proc_interrupts_req="$withval" +# Check whether --with-xkb-ext was given. +if test "${with_xkb_ext+set}" = set; then : + withval=$with_xkb_ext; with_xkb="$withval"; with_xkb_req="$withval" else - with_proc_interrupts=yes + with_xkb=yes fi -if test "$with_proc_interrupts" = yes; then + case "$with_xkb" in + yes) ;; + no) ;; - # Note that we may be building in an environment (e.g. Debian buildd chroot) - # without a proper /proc filesystem. If /proc/interrupts exists, then we'll - # check that it has the bits we need, but otherwise we'll just go on faith. - # - have_proc_interrupts=yes + /*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XKB headers" >&5 +$as_echo_n "checking for XKB headers... " >&6; } + d=$with_xkb/include + if test -d $d; then + X_CFLAGS="-I$d $X_CFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi - if test -f /proc/interrupts; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether /proc/interrupts contains keyboard data" >&5 -$as_echo_n "checking whether /proc/interrupts contains keyboard data... " >&6; } -if ${ac_cv_have_proc_interrupts+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XKB libs" >&5 +$as_echo_n "checking for XKB libs... " >&6; } + d=$with_xkb/lib + if test -d $d; then + X_LIBS="-L$d $X_LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi + + # replace the directory string with "yes". + with_xkb_req="yes" + with_xkb=$with_xkb_req + ;; + + *) + echo "" + echo "error: argument to --with-xkb-ext must be \"yes\", \"no\", or a directory." + echo " If it is a directory, then \`DIR/include' will be added to" + echo " the -I list, and \`DIR/lib' will be added to the -L list." + exit 1 + ;; + esac + +if test "$with_xkb" = yes; then + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + ac_fn_c_check_header_compile "$LINENO" "X11/XKBlib.h" "ac_cv_header_X11_XKBlib_h" "#include +" +if test "x$ac_cv_header_X11_XKBlib_h" = xyes; then : + have_xkb=yes +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + if test "$have_xkb" = yes; then + $as_echo "#define HAVE_XKB 1" >>confdefs.h + + fi + +elif test "$with_xkb" != no; then + echo "error: must be yes or no: --with-xkb-ext=$with_xshm" + exit 1 +fi + +############################################################################### +# +# Check for HP XHPDisableReset and XHPEnableReset. +# +############################################################################### + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XHPDisableReset in X11/XHPlib.h" >&5 +$as_echo_n "checking for XHPDisableReset in X11/XHPlib.h... " >&6; } + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "XHPDisableReset" >/dev/null 2>&1; then : + $as_echo "#define HAVE_XHPDISABLERESET 1" >>confdefs.h + + SAVER_LIBS="-lXhp11 $SAVER_LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -rf conftest* + + CPPFLAGS="$ac_save_CPPFLAGS" + +############################################################################### +# +# Check for /proc/interrupts. +# +############################################################################### + +have_proc_interrupts=no +with_proc_interrupts_req=unspecified + +# Check whether --with-proc-interrupts was given. +if test "${with_proc_interrupts+set}" = set; then : + withval=$with_proc_interrupts; with_proc_interrupts="$withval"; with_proc_interrupts_req="$withval" +else + with_proc_interrupts=no +fi + +if test "$with_proc_interrupts" = yes; then + + # Note that we may be building in an environment (e.g. Debian buildd chroot) + # without a proper /proc filesystem. If /proc/interrupts exists, then we'll + # check that it has the bits we need, but otherwise we'll just go on faith. + # + have_proc_interrupts=yes + + if test -f /proc/interrupts; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether /proc/interrupts contains keyboard data" >&5 +$as_echo_n "checking whether /proc/interrupts contains keyboard data... " >&6; } +if ${ac_cv_have_proc_interrupts+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_have_proc_interrupts=no @@ -10248,6 +10233,7 @@ fi # ############################################################################### +setuid_auth=no have_proc_oom=no with_proc_oom_req=unspecified @@ -10287,6 +10273,10 @@ $as_echo "$ac_cv_have_proc_oom" >&6; } if test "$have_proc_oom" = yes; then $as_echo "#define HAVE_PROC_OOM 1" >>confdefs.h + # Only root can write to /proc/$$/oom_score_adj, even though it's us. + { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabling setuid to opt out of OOM-killer." >&5 +$as_echo "enabling setuid to opt out of OOM-killer." >&6; } + setuid_auth=yes fi elif test "$with_proc_oom" != no; then @@ -10426,7 +10416,6 @@ fi # we have the headers, now check for the libraries have_systemd=no systemd_halfassed=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for libsystemd usability..." >&5 $as_echo "checking for libsystemd usability..." >&6; } @@ -10485,7 +10474,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sd_bus_open_system" >&5 $as_echo "$ac_cv_lib_c_sd_bus_open_system" >&6; } if test "x$ac_cv_lib_c_sd_bus_open_system" = xyes; then : - have_systemd=yes + have_systemd=yes; systemd_halfassed=no fi CPPFLAGS="$ac_save_CPPFLAGS" @@ -10503,10 +10492,12 @@ fi if test "$have_systemd" = yes; then INCLUDES="$INCLUDES $ac_systemd_config_cflags" EXES_SYSTEMD='$(EXES_SYSTEMD)' + SYSTEMD_LIBS="$ac_systemd_config_libs" $as_echo "#define HAVE_LIBSYSTEMD 1" >>confdefs.h else EXES_SYSTEMD='' + SYSTEMD_LIBS='' fi ############################################################################### @@ -10526,9 +10517,9 @@ if test "${enable_locking+set}" = set; then : enable_locking="$enableval" else if test "$ac_macosx" = yes; then - # We can't lock on MacOS X, so default to not compiling in support for it. + # We can't lock on macOS, so default to not compiling in support for it. # But allow --enable-locking to override that, so I can debug Linux locking - # under MacOS X11. + # under macOS X11. enable_locking=no else enable_locking=yes @@ -10556,7 +10547,7 @@ if test "${enable_root_passwd+set}" = set; then : enableval=$enable_root_passwd; # This is documented elsewhere because of --enable/--with option sorting. enable_root_passwd="$enableval" else - enable_root_passwd=yes + enable_root_passwd=no fi if test "$enable_root_passwd" = yes; then @@ -10576,8 +10567,12 @@ fi case "$host" in *-solaris*) - # Solaris systems tend to come with PAM misconfigured. - # Don't build it by default, even if the headers exist. + # Solaris systems tend to have the PAM runtime misconfigured and unusable. + with_pam_default=no + ;; + *-freebsd* ) + # FreeBSD's PAM implementation requires the calling process to be setuid + # the whole time, which is unacceptable. with_pam_default=no ;; *) @@ -11194,7 +11189,7 @@ $as_echo "$as_me: WARNING: Cannot find compat lib (libkrb4) needed to use Kerber PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err" - # jwz: MacOS X uses -lkrb5, but not -lcrypt + # jwz: macOS uses -lkrb5, but not -lcrypt ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -11323,8 +11318,6 @@ fi # ############################################################################### -need_setuid=no - have_shadow=no with_shadow_req=unspecified @@ -11432,7 +11425,7 @@ $as_echo "$ac_cv_sun_adjunct" >&6; } if test "$ac_cv_sun_adjunct" = yes; then have_shadow_adjunct=yes have_shadow=yes - need_setuid=yes + setuid_auth=yes fi fi @@ -11489,7 +11482,7 @@ $as_echo "$ac_cv_enhanced_passwd" >&6; } if test $ac_cv_enhanced_passwd = yes; then have_shadow_enhanced=yes have_shadow=yes - need_setuid=yes + setuid_auth=yes # On SCO, getprpwnam() is in -lprot (which uses nap() from -lx) # (I'm told it needs -lcurses too, but I don't understand why.) @@ -11628,7 +11621,7 @@ $as_echo "$ac_cv_hpux_passwd" >&6; } if test "$ac_cv_hpux_passwd" = yes; then have_shadow_hpux=yes have_shadow=yes - need_setuid=yes + setuid_auth=yes # on HPUX, bigcrypt is in -lsec { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bigcrypt in -lsec" >&5 @@ -11701,7 +11694,62 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_master_passwd" >&5 $as_echo "$ac_cv_master_passwd" >&6; } if test "$ac_cv_master_passwd" = yes; then - need_setuid=yes + setuid_auth=yes + fi +fi + +############################################################################### +# +# Check for OpenBSD-style shadow passwords. +# It's getpwnam_shadow instead of getpwnam, and it only works as root. +# +############################################################################### + +if test "$with_shadow" = yes ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenBSD-style shadow passwords" >&5 +$as_echo_n "checking for OpenBSD-style shadow passwords... " >&6; } +if ${ac_cv_pwnam_shadow+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + #include + #include +int +main () +{ +struct spwd *p = getspnam_shadow("nobody"); + const char *pw = p->pw_passwd; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_pwnam_shadow=yes +else + ac_cv_pwnam_shadow=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$ac_save_CPPFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_pwnam_shadow" >&5 +$as_echo "$ac_cv_pwnam_shadow" >&6; } + if test "$ac_cv_pwnam_shadow" = yes; then + have_pwnam_shadow=yes + + # If we also have PAM, assume that we don't need to be setuid. + if test $have_pam != yes; then + setuid_auth=yes + fi fi fi @@ -11752,7 +11800,11 @@ fi $as_echo "$ac_cv_shadow" >&6; } if test "$ac_cv_shadow" = yes; then have_shadow=yes - need_setuid=yes + + # If we also have PAM, assume that we don't need to be setuid. + if test $have_pam != yes; then + setuid_auth=yes + fi # On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc. have_getspnam=no @@ -11935,14 +11987,53 @@ fi fi fi -# Most of the above shadow mechanisms will have set need_setuid to yes, +############################################################################### +# +# Strongly suspect that this hasn't been used in years. Also, the same +# goal is achieved by xscreensaver-auth in XScreenSaver 6. -- jwz, 2021 +# +# Check for external password helper +# On SuSE in 1993, instead of having xscreensaver be a setuid program, +# they fork an external program that takes the password on stdin, and +# returns true if that password is a valid one. Then only that smaller +# program needs to be setuid. +# +# (Note that this external program is not a GUI: the GUI is still +# all in xscreensaver itself; the external program just does auth.) +# +############################################################################### + +#have_passwd_helper=no +#with_passwd_helper_req=unspecified +# +#AC_ARG_WITH(passwd-helper, +#[ --with-passwd-helper Include support for external password verification.], +# [with_passwd_helper="$withval"; with_passwd_helper_req="$withval"],[with_passwd_helper=no]) +## no HANDLE_X_PATH_ARG for this one +# +#if test "$enable_locking" = no ; then +# with_passwd_helper_req=no +# with_passwd_helper=no +#fi +# +#case "$with_passwd_helper" in +# ""|no) : ;; +# /*) +# AC_DEFINE_UNQUOTED(PASSWD_HELPER_PROGRAM, "$with_passwd_helper") +# have_passwd_helper=yes;; +# *) +# echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2 +# exit 1 +#esac + +# Most of the above shadow mechanisms will have set setuid_auth to yes, # if they were found. But, on some systems, we need setuid even when # using plain old vanilla passwords. # -if test "$enable_locking" = yes ; then +if test "$enable_locking" = yes -a "$have_pam" = no ; then case "$host" in - *-hpux* | *-aix* | *-netbsd* | *-freebsd* | *-openbsd* ) - need_setuid=yes + *-hpux* | *-aix* | *-netbsd* | *-freebsd* ) + setuid_auth=yes ;; esac fi @@ -11959,51 +12050,11 @@ elif test "$have_shadow_hpux" = yes ; then elif test "$have_shadow" = yes ; then $as_echo "#define HAVE_SHADOW_PASSWD 1" >>confdefs.h -fi - -############################################################################### -# -# Check for external password helper -# On SuSE, instead of having xscreensaver be a setuid program, they -# fork an external program that takes the password on stdin, and -# returns true if that password is a valid one. Then only that -# smaller program needs to be setuid. -# -# (Note that this external program is not a GUI: the GUI is still -# all in xscreensaver itself; the external program just does auth.) -# -############################################################################### - -have_passwd_helper=no -with_passwd_helper_req=unspecified - -# Check whether --with-passwd-helper was given. -if test "${with_passwd_helper+set}" = set; then : - withval=$with_passwd_helper; with_passwd_helper="$withval"; with_passwd_helper_req="$withval" -else - with_passwd_helper=no -fi - -# no HANDLE_X_PATH_ARG for this one +elif test "$have_pwnam_shadow" = yes ; then + $as_echo "#define HAVE_PWNAM_SHADOW_PASSWD 1" >>confdefs.h -if test "$enable_locking" = no ; then - with_passwd_helper_req=no - with_passwd_helper=no fi -case "$with_passwd_helper" in - ""|no) : ;; - /*) - cat >>confdefs.h <<_ACEOF -#define PASSWD_HELPER_PROGRAM "$with_passwd_helper" -_ACEOF - - have_passwd_helper=yes;; - *) - echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2 - exit 1 -esac - ############################################################################### # # Check for -lgtk (and Gnome stuff) @@ -12081,20 +12132,6 @@ if test "$with_gtk" != yes -a "$with_gtk" != no ; then exit 1 fi -parse_gtk_version_string() { - # M4 sucks!! - - maj=`echo $ac_gtk_version_string | sed -n 's/\..*//p'` - min=`echo $ac_gtk_version_string | sed -n 's/[^.]*\.\([^.]*\).*/\1/p'` - - ac_gtk_version=`echo "$maj * 1000 + $min" | bc` - if test -z "$ac_gtk_version"; then - ac_gtk_version=unknown - ac_gtk_version_string=unknown - fi -} - -jurassic_gtk=no gtk_halfassed=no if test "$with_gtk" = yes; then @@ -12110,16 +12147,11 @@ if test "$with_gtk" = yes; then if test "$have_gtk" = no; then if test -n "$ac_gtk_version_string" ; then - gtk_halfassed="$ac_gtk_version_string" + gtk_halfassed=yes gtk_halfassed_lib="$req" fi fi - if test "$have_gtk" = yes; then - parse_gtk_version_string - jurassic_gtk=no - fi - if test "$have_gtk" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Gtk includes" >&5 $as_echo_n "checking for Gtk includes... " >&6; } @@ -12144,7 +12176,6 @@ $as_echo "$ac_cv_gtk_config_libs" >&6; } ac_gtk_config_cflags=$ac_cv_gtk_config_cflags ac_gtk_config_libs=$ac_cv_gtk_config_libs - GTK_EXTRA_OBJS="" GTK_DATADIR="" if test "$have_gtk" = yes; then GTK_DATADIR=`$pkg_config --variable=prefix gtk+-2.0` @@ -12898,69 +12929,9 @@ fi ;; - /*) - # absolute path specified on cmd line - set dummy $with_login_manager_req ; login_manager_tmp=$2 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $login_manager_tmp" >&5 -$as_echo_n "checking for $login_manager_tmp... " >&6; } - if test -x "$login_manager_tmp" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - with_login_manager="" - fi - ;; - - *) - # relative path specified on cmd line - set dummy $with_login_manager_req ; login_manager_tmp=$2 - unset ac_cv_path_login_manager_tmp # don't cache - # Extract the first word of "$login_manager_tmp", so it can be a program name with args. -set dummy $login_manager_tmp; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_login_manager_tmp+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $login_manager_tmp in - [\\/]* | ?:[\\/]*) - ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path. - ;; *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -login_manager_tmp=$ac_cv_path_login_manager_tmp -if test -n "$login_manager_tmp"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5 -$as_echo "$login_manager_tmp" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test -z "$login_manager_tmp" ; then - with_login_manager="" - else - with_login_manager="$login_manager_tmp" - fi + # Just believe whatever command was specified. + with_login_manager="$with_login_manager_req" ;; esac ac_cv_login_manager_program="$with_login_manager" @@ -13016,28 +12987,41 @@ $as_echo "no" >&6; } yes) with_imagedir="" - #### Could use some more defaults here... + fallback_imgdir="" for dd in \ - "/usr/share/rpd-wallpaper" \ - "/usr/share/backgrounds/images/" \ - "/usr/share/wallpapers/" \ - "/Library/Desktop Pictures/" \ + "/usr/share/rpd-wallpaper/" \ + "/usr/share/backgrounds/images/" \ + "/usr/share/wallpapers/" \ + "/usr/share/backgrounds/" \ + "/usr/share/pixmaps/backgrounds/" \ + "/usr/share/lxde/wallpapers/" \ + "/Library/Desktop Pictures/" \ ; do if test -z "$with_imagedir"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for image directory $dd" >&5 $as_echo_n "checking for image directory $dd... " >&6; } - if test -d "$dd" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + if test -d "$dd"; then + if ( ls "$dd" | grep -q ... ) >&- 2>&- ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - with_imagedir="$dd" + with_imagedir="$dd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: empty" >&5 +$as_echo "empty" >&6; } + if test -z "$fallback_imgdir"; then + fallback_imgdir="$dd" + fi + fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi done - - ;; + if test -z "$with_imagedir"; then + with_imagedir="$fallback_imgdir" + fi +;; no) with_imagedir="" ;; @@ -13179,11 +13163,1034 @@ ac_cv_browser="$with_browser" ############################################################################### # -# Check for -lGL or -lMesaGL. +# Check for pthreads. Must come before checking for OpenGL, +# since some versions of OpenGL require it. # ############################################################################### -#### H1 +have_pthread=no +with_pthread_req=unspecified + +# AX_PTHREAD is from the GNU Autoconf Archive. +# https://savannah.gnu.org/projects/autoconf-archive/ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_pthread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. It +# sets the PTHREAD_LIBS output variable to the threads library and linker +# flags, and the PTHREAD_CFLAGS output variable to any special C compiler +# flags that are needed. (The user can also force certain compiler +# flags/libs to be tested by setting these environment variables.) +# +# Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is +# needed for multi-threaded programs (defaults to the value of CC +# respectively CXX otherwise). (This is necessary on e.g. AIX to use the +# special cc_r/CC_r compiler alias.) +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also to link with them as well. For example, you might link with +# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# +# If you are only building threaded programs, you may wish to use these +# variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# CXX="$PTHREAD_CXX" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant +# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the +# PTHREAD_PRIO_INHERIT symbol is defined when compiling with +# PTHREAD_CFLAGS. +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads library +# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it +# is not found. If ACTION-IF-FOUND is not specified, the default action +# will define HAVE_PTHREAD. +# +# Please let the authors know if this macro fails on any platform, or if +# you have any other suggestions or comments. This macro was based on work +# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help +# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by +# Alejandro Forero Cuervo to the autoconf macro repository. We are also +# grateful for the helpful feedback of numerous users. +# +# Updated for Autoconf 2.68 by Daniel Richard G. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2011 Daniel Richard G. +# Copyright (c) 2019 Marc Stevens +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 30 + +# This is what autoupdate's m4 run will expand. It fires +# the warning (with _au_warn_XXX), outputs it into the +# updated configure.ac (with AC_DIAGNOSE), and then outputs +# the replacement expansion. + +# This is an auxiliary macro that is also run when +# autoupdate runs m4. It simply calls m4_warning, but +# we need a wrapper so that each warning is emitted only +# once. We break the quoting in m4_warning's argument in +# order to expand this macro's arguments, not AU_DEFUN's. + +# Finally, this is the expansion that is picked up by +# autoconf. It tells the user to run autoupdate, and +# then outputs the replacement expansion. We do not care +# about autoupdate's warning because that contains +# information on what to do *after* running autoupdate. + +# Check whether --with-pthread was given. +if test "${with_pthread+set}" = set; then : + withval=$with_pthread; # This is documented after --with-gl in --with-xft. + with_pthread="$withval"; with_pthread_req="$withval" +else + with_pthread=yes +fi + +if test "$with_pthread" = yes; then + # AX_PTHREAD might want a different compiler. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if ${ac_cv_target+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; +esac +target=$ac_cv_target +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -rf conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -rf conftest.sed + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on Tru64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + if test "x$PTHREAD_CC" != "x"; then : + CC="$PTHREAD_CC" +fi + if test "x$PTHREAD_CXX" != "x"; then : + CXX="$PTHREAD_CXX" +fi + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 +$as_echo_n "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_join (); +int +main () +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +$as_echo "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xno"; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" which indicates that we try without +# any flags at all, and "pthread-config" which is a program returning +# the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case $target_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 +$as_echo "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} +fi +rm -rf conftest* + + ;; + + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" + ;; +esac + +# Are we compiling with Clang? + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 +$as_echo_n "checking whether $CC is Clang... " >&6; } +if ${ax_cv_PTHREAD_CLANG+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1; then : + ax_cv_PTHREAD_CLANG=yes +fi +rm -rf conftest* + + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 +$as_echo "$ax_cv_PTHREAD_CLANG" >&6; } +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC + +if test "x$GCC" = "xyes"; then : + ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" +fi + +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first + +if test "x$ax_pthread_clang" = "xyes"; then : + ax_pthread_flags="-pthread,-lpthread -pthread" +fi + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $target_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; + + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" + ;; +esac +if test "x$ax_pthread_check_macro" = "x--"; then : + ax_pthread_check_cond=0 +else + ax_pthread_check_cond="!defined($ax_pthread_check_macro)" +fi + +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in + none) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +$as_echo_n "checking whether pthreads work without any flags... " >&6; } + ;; + + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 +$as_echo_n "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } + ;; + + -*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 +$as_echo_n "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ax_pthread_config+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ax_pthread_config"; then + ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ax_pthread_config="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" +fi +fi +ax_pthread_config=$ac_cv_prog_ax_pthread_config +if test -n "$ax_pthread_config"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +$as_echo "$ax_pthread_config" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ax_pthread_config" = "xno"; then : + continue +fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 +$as_echo_n "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac + + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } + static void *start_routine(void *a) { return a; } +int +main () +{ +pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +$as_echo "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xyes"; then : + break +fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 +$as_echo_n "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } +if ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + if test "x$ax_pthread_try" = "xunknown"; then : + break +fi + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_link="$ax_pthread_2step_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + if test "x$ax_pthread_try" = "x"; then : + ax_pthread_try=no +fi + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 +$as_echo "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + +# Various other checks: +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +$as_echo_n "checking for joinable pthread attribute... " >&6; } +if ${ax_cv_PTHREAD_JOINABLE_ATTR+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +int attr = $ax_pthread_attr; return attr /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 +$as_echo "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } + if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes"; then : + +cat >>confdefs.h <<_ACEOF +#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR +_ACEOF + + ax_pthread_joinable_attr_defined=yes + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 +$as_echo_n "checking whether more special flags are required for pthreads... " >&6; } +if ${ax_cv_PTHREAD_SPECIAL_FLAGS+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $target_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 +$as_echo "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } + if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes"; then : + PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 +$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; } +if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +int i = PTHREAD_PRIO_INHERIT; + return i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_PTHREAD_PRIO_INHERIT=yes +else + ax_cv_PTHREAD_PRIO_INHERIT=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 +$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } + if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes"; then : + +$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h + + ax_pthread_prio_inherit_defined=yes + +fi + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $target_os in + aix*) + case "x/$CC" in #( + x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : + #handle absolute path differently from PATH based program lookup + case "x$CC" in #( + x/*) : + + if as_fn_executable_p ${CC}_r; then : + PTHREAD_CC="${CC}_r" +fi + if test "x${CXX}" != "x"; then : + if as_fn_executable_p ${CXX}_r; then : + PTHREAD_CXX="${CXX}_r" +fi +fi + ;; #( + *) : + + for ac_prog in ${CC}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_PTHREAD_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +$as_echo "$PTHREAD_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + + if test "x${CXX}" != "x"; then : + for ac_prog in ${CXX}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_PTHREAD_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PTHREAD_CXX"; then + ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX +if test -n "$PTHREAD_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5 +$as_echo "$PTHREAD_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + test -n "$PTHREAD_CXX" && break +done +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + +fi + + ;; +esac + ;; #( + *) : + ;; +esac + ;; + esac + fi +fi + +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test "x$ax_pthread_ok" = "xyes"; then + if test "$CC" = "$PTHREAD_CC" -o -z "$ac_original_cc"; then + have_pthread=yes + else + ac_prog_cc_no_pthread=yes + fi + + : +else + ax_pthread_ok=no + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + if test "$have_pthread" = yes; then + $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h + + CC="$PTHREAD_CC" + fi +fi + +############################################################################### +# +# Handle --with-gles +# Must come before --with-gl +# +############################################################################### + +with_jwzgles_req=unspecified +have_jwzgles=no + +# Check whether --with-gles was given. +if test "${with_gles+set}" = set; then : + withval=$with_gles; # This is documented after --with-gl + with_jwzgles="$withval"; with_jwzgles_req="$withval" +else + with_jwzgles=no +fi + + case "$with_jwzgles" in + yes) ;; + no) ;; + + /*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JWZGLES headers" >&5 +$as_echo_n "checking for JWZGLES headers... " >&6; } + d=$with_jwzgles/include + if test -d $d; then + X_CFLAGS="-I$d $X_CFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JWZGLES libs" >&5 +$as_echo_n "checking for JWZGLES libs... " >&6; } + d=$with_jwzgles/lib + if test -d $d; then + X_LIBS="-L$d $X_LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi + + # replace the directory string with "yes". + with_jwzgles_req="yes" + with_jwzgles=$with_jwzgles_req + ;; + + *) + echo "" + echo "error: argument to --with-gles must be \"yes\", \"no\", or a directory." + echo " If it is a directory, then \`DIR/include' will be added to" + echo " the -I list, and \`DIR/lib' will be added to the -L list." + exit 1 + ;; + esac + +if test "$with_jwzgles" = yes; then + have_jwzgles=yes + JWZGLES_OBJS='$(JWXYZ_BIN)/jwzgles.o' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: emulating OpenGL 1.3 in terms of OpenGLES 1.x." >&5 +$as_echo "emulating OpenGL 1.3 in terms of OpenGLES 1.x." >&6; } +elif test "$with_jwzgles" != no; then + echo "error: must be yes or no: --with-gles=$with_jwzgles" + exit 1 +fi + +############################################################################### +# +# Check for -lGL or -lMesaGL. +# +############################################################################### + +#### H1 have_gl=no ac_have_mesa_gl=no @@ -13241,8 +14248,13 @@ $as_echo "not found ($d: no such directory)" >&6; } ;; esac -ac_mesagl_version=unknown -ac_mesagl_version_string=unknown +# Some GL libraries require pthreads, so use the pthreads flags when +# testing them, then set them back after. +# +ac_save_pthreads_CFLAGS="$CFLAGS" +ac_save_pthreads_LIBS="$LIBS" +CFLAGS="$PTHREAD_CFLAGS $CFLAGS" +LIBS="$PTHREAD_LIBS $LIBS" if test "$with_gl" = yes; then @@ -13259,8 +14271,8 @@ else have_gl=no fi - CPPFLAGS="$ac_save_CPPFLAGS" - if test "$have_gl" = yes ; then + CPPFLAGS="$ac_save_CPPFLAGS"; + if test "$have_gl" = yes; then ac_save_CPPFLAGS="$CPPFLAGS" if test \! -z "$includedir" ; then @@ -13268,112 +14280,83 @@ fi fi CPPFLAGS="$CPPFLAGS $X_CFLAGS" CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_compile "$LINENO" "GL/glx.h" "ac_cv_header_GL_glx_h" "#include -" -if test "x$ac_cv_header_GL_glx_h" = xyes; then : + ac_fn_c_check_header_mongrel "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_glu_h" = xyes; then : have_gl=yes else have_gl=no fi - CPPFLAGS="$ac_save_CPPFLAGS" - fi - - # If we have the headers, try and figure out which vendor it's from. - # - if test "$have_gl" = yes ; then - - # We need to know whether it's MesaGL so that we know which libraries - # to link against. - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GL is really MesaGL" >&5 -$as_echo_n "checking whether GL is really MesaGL... " >&6; } -if ${ac_cv_have_mesa_gl+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_have_mesa_gl=no - if test "$ac_macosx" = no; then - # WTF! MacOS 10.5.0 ships the Mesa GL headers! - # It's not really Mesa, is it? - - ac_save_CPPFLAGS="$CPPFLAGS" - if test \! -z "$includedir" ; then - CPPFLAGS="$CPPFLAGS -I$includedir" + CPPFLAGS="$ac_save_CPPFLAGS"; fi - CPPFLAGS="$CPPFLAGS $X_CFLAGS" - CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Mesa|MESA" >/dev/null 2>&1; then : - ac_cv_have_mesa_gl=yes fi -rm -rf conftest* - CPPFLAGS="$ac_save_CPPFLAGS" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_mesa_gl" >&5 -$as_echo "$ac_cv_have_mesa_gl" >&6; } - ac_have_mesa_gl=$ac_cv_have_mesa_gl +if test "$with_gl" = yes; then + # + # Since the OpenGL and GLES specifications are a complete dumpster fire, + # it's not easy to figure out how what libraries to use. + # + # OpenGLES library names: + # + # 1.x: libGLESv1_CM + # 2.x: libGLESv2 + # 3.x: libGLESv2 on Windows, libGLESv3 on Android + # + # On modern Linux systems, these libraries exist: + # + # libGL - a superset of everything up to and including OpenGL 4.6 + # libGLESv1_CM - OpenGLES 1.1, meaning it omits much of OpenGL 1.3 + # libGLESv2 - OpenGLES 2 and 3, meaning it omits even more of OpenGL 1.3 + # + # Since Linux systems support OpenGL 1.3, those link against only libGL. + # + # Unless we are using --with-gles on Linux, in which case we are attempting + # to simulate a system that does not natively support OpenGL 1.3. In that + # case, we use the v1 and/or v2 libraries instead. + # + # Common practice on Android seems to be to link against the v1, v2 and v3 + # libraries in order, and then do runtime checks to see which set of + # functions is actually supported by the runtime. Just because you linked + # against a GLES3 library doesn't mean that the hardware supports it: most + # of these functions are just syscall-like stubs. + # + # See the commentary atop jwxyz/jwzgles.c for discussion of OpenGL versions. + # + if test "$have_gl" = yes; then + have_gl=no - gl_lib_1="" - GL_LIBS="" + if test "$have_jwzgles" = yes; then - if test "$ac_macosx" = yes; then + # Only check for the v1/2/3 libraries on Linux when using --with-gles + # to emulate a system that does not natively support OpenGL 1.3. - # Without these, every link against libGL gets a bunch of useless - # warnings. - # - osx_crud="-bind_at_load -multiply_defined suppress" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: adding \"$osx_crud\" to GL_LIBS" >&5 -$as_echo "adding \"$osx_crud\" to GL_LIBS" >&6; } - GL_LIBS="$GL_LIBS $osx_crud" - unset osx_crud - - # New lossage in 10.5.0: without this, we get: - # ld: cycle in dylib re-exports with /usr/X11/lib/libGL.dylib - # - osx_crud="/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib" - osx_crud="-Wl,-dylib_file,${osx_crud}:${osx_crud}" - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: adding \"$osx_crud\" to GL_LIBS" >&5 -$as_echo "adding \"$osx_crud\" to GL_LIBS" >&6; } - GL_LIBS="$GL_LIBS $osx_crud" - unset osx_crud - - # New lossage in 10.6.8: we can't allow -L/opt/local/lib to be in the - # link line, or at runtime XQueryExtension gets a segv due to some kind - # of library version skew. Libs must come from /usr/X11/lib even if - # $prefix and/or $exec_prefix are set to /opt/local/. - # - { $as_echo "$as_me:${as_lineno-$LINENO}: result: omitting \"$libdir\" from LDFLAGS" >&5 -$as_echo "omitting \"$libdir\" from LDFLAGS" >&6; } - libdir='' + # Check for GLES 3.x - # Looks like as of OSX 10.12, gcc can't do ObjC. - OBJCC="clang -Wall" + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" - fi + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + # note: $X_CFLAGS includes $x_includes + CPPFLAGS="$CPPFLAGS $X_CFLAGS" - # Some versions of MesaGL are compiled to require -lpthread. - # So if the Mesa headers exist, and -lpthread exists, then always - # link -lpthread after the Mesa libs (be they named -lGL or -lMesaGL.) - # - # Oftentimes, AX_PTHREAD will bring in -lpthread as well; but that ends - # up before -l(Mesa)GL, instead of after where it would belong. - # - if test "$ac_have_mesa_gl" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 -$as_echo_n "checking for pthread_create in -lpthread... " >&6; } -if ${ac_cv_lib_pthread_pthread_create+:} false; then : + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" + + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glDrawElements in -lGLESv3" >&5 +$as_echo_n "checking for glDrawElements in -lGLESv3... " >&6; } +if ${ac_cv_lib_GLESv3_glDrawElements+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" +LIBS="-lGLESv3 $GL_LIBS -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13383,38 +14366,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char pthread_create (); +char glDrawElements (); int main () { -return pthread_create (); +return glDrawElements (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pthread_pthread_create=yes + ac_cv_lib_GLESv3_glDrawElements=yes else - ac_cv_lib_pthread_pthread_create=no + ac_cv_lib_GLESv3_glDrawElements=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 -$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } -if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : - GL_LIBS="-lpthread" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv3_glDrawElements" >&5 +$as_echo "$ac_cv_lib_GLESv3_glDrawElements" >&6; } +if test "x$ac_cv_lib_GLESv3_glDrawElements" = xyes; then : + have_gl=yes + gl_lib_1="GLESv3" + GL_LIBS="-lGLESv3 $GL_LIBS" fi - fi - - # If we have Mesa headers, check to see if we can link against -lMesaGL. - # If we don't have Mesa headers, or we don't have -lMesaGL, try -lGL. - # Else, warn that GL is busted. (We have the headers, but no libs.) - # + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" - if test "$ac_have_mesa_gl" = yes ; then + # Check for GLES 2.x ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -13434,13 +14416,13 @@ fi CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXCreateContext in -lMesaGL" >&5 -$as_echo_n "checking for glXCreateContext in -lMesaGL... " >&6; } -if ${ac_cv_lib_MesaGL_glXCreateContext+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glDrawElements in -lGLESv2" >&5 +$as_echo_n "checking for glDrawElements in -lGLESv2... " >&6; } +if ${ac_cv_lib_GLESv2_glDrawElements+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lMesaGL -lMesaGLU $GL_LIBS -lX11 -lXext $VIDMODE_LIBS -lm $LIBS" +LIBS="-lGLESv2 $GL_LIBS -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13450,38 +14432,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char glXCreateContext (); +char glDrawElements (); int main () { -return glXCreateContext (); +return glDrawElements (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_MesaGL_glXCreateContext=yes + ac_cv_lib_GLESv2_glDrawElements=yes else - ac_cv_lib_MesaGL_glXCreateContext=no + ac_cv_lib_GLESv2_glDrawElements=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_MesaGL_glXCreateContext" >&5 -$as_echo "$ac_cv_lib_MesaGL_glXCreateContext" >&6; } -if test "x$ac_cv_lib_MesaGL_glXCreateContext" = xyes; then : - gl_lib_1="MesaGL" - GL_LIBS="-lMesaGL -lMesaGLU $VIDMODE_LIBS $GL_LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv2_glDrawElements" >&5 +$as_echo "$ac_cv_lib_GLESv2_glDrawElements" >&6; } +if test "x$ac_cv_lib_GLESv2_glDrawElements" = xyes; then : + have_gl=yes + gl_lib_1="GLESv2" + GL_LIBS="-lGLESv2 $GL_LIBS" fi CPPFLAGS="$ac_save_CPPFLAGS" LDFLAGS="$ac_save_LDFLAGS" # LIBS="$ac_save_LIBS" - fi - - if test "$gl_lib_1" = "" ; then + # Check for GLES 1.x ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -13501,13 +14482,13 @@ fi CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXCreateContext in -lGL" >&5 -$as_echo_n "checking for glXCreateContext in -lGL... " >&6; } -if ${ac_cv_lib_GL_glXCreateContext+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glDrawElements in -lGLESv1_CM" >&5 +$as_echo_n "checking for glDrawElements in -lGLESv1_CM... " >&6; } +if ${ac_cv_lib_GLESv1_CM_glDrawElements+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lGL -lGLU $GL_LIBS -lX11 -lXext $VIDMODE_LIBS -lm $LIBS" +LIBS="-lGLESv1_CM $GL_LIBS -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13517,145 +14498,39 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char glXCreateContext (); +char glDrawElements (); int main () { -return glXCreateContext (); +return glDrawElements (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_GL_glXCreateContext=yes + ac_cv_lib_GLESv1_CM_glDrawElements=yes else - ac_cv_lib_GL_glXCreateContext=no + ac_cv_lib_GLESv1_CM_glDrawElements=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glXCreateContext" >&5 -$as_echo "$ac_cv_lib_GL_glXCreateContext" >&6; } -if test "x$ac_cv_lib_GL_glXCreateContext" = xyes; then : - gl_lib_1="GL" - GL_LIBS="-lGL -lGLU $VIDMODE_LIBS $GL_LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv1_CM_glDrawElements" >&5 +$as_echo "$ac_cv_lib_GLESv1_CM_glDrawElements" >&6; } +if test "x$ac_cv_lib_GLESv1_CM_glDrawElements" = xyes; then : + have_gl=yes + gl_lib_1="GLESv1_CM" + GL_LIBS="-lGLESv1_CM $GL_LIBS" fi CPPFLAGS="$ac_save_CPPFLAGS" LDFLAGS="$ac_save_LDFLAGS" # LIBS="$ac_save_LIBS" - fi - - if test "$gl_lib_1" = "" ; then - # we have headers, but no libs -- bail. - have_gl=no - ac_have_mesa_gl=no - gl_halfassed=yes - else - # linking works -- we can build the GL hacks. - $as_echo "#define HAVE_GL 1" >>confdefs.h - - if test "$ac_have_mesa_gl" = yes ; then - $as_echo "#define HAVE_MESA_GL 1" >>confdefs.h - - fi - fi - fi - - # Now that we know we have GL headers and libs, do some more GL testing. - # - - if test "$have_gl" = yes ; then - # If it's MesaGL, we'd like to issue a warning if the version number - # is less than or equal to 2.6, because that version had a security bug. - # - if test "$ac_have_mesa_gl" = yes; then - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking MesaGL version number" >&5 -$as_echo_n "checking MesaGL version number... " >&6; } -if ${ac_cv_mesagl_version_string+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat > conftest.$ac_ext < -#ifndef MESA_MAJOR_VERSION -# include -# ifdef XMESA_MAJOR_VERSION - /* Around Mesa 3.2, they took out the Mesa version number, so instead, - we have to check the XMesa version number (the number of the X protocol - support, which seems to be the same as the Mesa version number.) - */ -# define MESA_MAJOR_VERSION XMESA_MAJOR_VERSION -# define MESA_MINOR_VERSION XMESA_MINOR_VERSION -# else - /* Oh great. Some time after 3.4, they took out the xmesa.h header file, - so we have no way of telling what version of Mesa this is at all. - So, we'll guess that the osmesa version (the "offscreen protocol") - is less than or equal to the real mesa version number. Except that - if OSmesa is 3.3, assume at least Mesa 3.4, since OSmesa was 3.3 in - Mesa 3.4. And Mesa 3.3 had xmesa.h. What a complete load of shit! - */ -# include -# define MESA_MAJOR_VERSION OSMESA_MAJOR_VERSION -# define MESA_MINOR_VERSION OSMESA_MINOR_VERSION or newer, probably? -# if OSMESA_MAJOR_VERSION == 3 && OSMESA_MINOR_VERSION == 3 -# undef MESA_MINOR_VERSION -# define MESA_MINOR_VERSION 4 or newer, probably? -# endif -# endif -#endif -configure: MESA_MAJOR_VERSION MESA_MINOR_VERSION -EOF - - ac_save_CPPFLAGS="$CPPFLAGS" - if test \! -z "$includedir" ; then - CPPFLAGS="$CPPFLAGS -I$includedir" - fi - CPPFLAGS="$CPPFLAGS $X_CFLAGS" - - mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | grep configure:` - - # M4 sucks!! - - mglv=`echo "$mglv" | sed -n \ - 's/^configure: *\([0-9][0-9]*\) *\([0-9].*\)$/\1.\2/p'` - - rm -rf conftest.$ac_ext - - CPPFLAGS="$ac_save_CPPFLAGS" - - if test "$mglv" = ""; then - ac_mesagl_version=unknown - ac_mesagl_version_string=unknown - else - ac_mesagl_version_string="$mglv" - # M4 sucks!! - - maj=`echo "$mglv" | sed -n 's/^\([0-9][0-9]*\)\..*$/\1/p'` - min=`echo "$mglv" | sed -n 's/^.*\.\([0-9][0-9]*\).*$/\1/p'` + else # $have_jwzgles = no - ac_mesagl_version=`echo "$maj * 1000 + $min" | bc` - if test -z "$ac_mesagl_version"; then - ac_mesagl_version=unknown - ac_mesagl_version_string=unknown - fi - fi - ac_cv_mesagl_version=$ac_mesagl_version - ac_cv_mesagl_version_string=$ac_mesagl_version_string - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_mesagl_version_string" >&5 -$as_echo "$ac_cv_mesagl_version_string" >&6; } - ac_mesagl_version=$ac_cv_mesagl_version - ac_mesagl_version_string=$ac_cv_mesagl_version_string - fi - - # Check for OpenGL 1.1 features. - # + # Check for OpenGL 1.x and/or OpenGL 4.x ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -13675,14 +14550,13 @@ $as_echo "$ac_cv_mesagl_version_string" >&6; } CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glBindTexture" | $as_tr_sh` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glBindTexture in -l$gl_lib_1" >&5 -$as_echo_n "checking for glBindTexture in -l$gl_lib_1... " >&6; } -if eval \${$as_ac_Lib+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glEnable in -lGL" >&5 +$as_echo_n "checking for glEnable in -lGL... " >&6; } +if ${ac_cv_lib_GL_glEnable+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS" +LIBS="-lGL $GL_LIBS -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13692,57 +14566,38 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char glBindTexture (); +char glEnable (); int main () { -return glBindTexture (); +return glEnable (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - eval "$as_ac_Lib=yes" + ac_cv_lib_GL_glEnable=yes else - eval "$as_ac_Lib=no" + ac_cv_lib_GL_glEnable=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -eval ac_res=\$$as_ac_Lib - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : - $as_echo "#define HAVE_GLBINDTEXTURE 1" >>confdefs.h - -else - true +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glEnable" >&5 +$as_echo "$ac_cv_lib_GL_glEnable" >&6; } +if test "x$ac_cv_lib_GL_glEnable" = xyes; then : + have_gl=yes + gl_lib_1="GL" + GL_LIBS="-lGL $GL_LIBS" fi CPPFLAGS="$ac_save_CPPFLAGS" LDFLAGS="$ac_save_LDFLAGS" # LIBS="$ac_save_LIBS" - # Check for OpenGL GLSL features. - # - - ac_save_CPPFLAGS="$CPPFLAGS" - if test \! -z "$includedir" ; then - CPPFLAGS="$CPPFLAGS -I$includedir" - fi - CPPFLAGS="$CPPFLAGS $X_CFLAGS" - CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_compile "$LINENO" "GL/glext.h" "ac_cv_header_GL_glext_h" "#include -" -if test "x$ac_cv_header_GL_glext_h" = xyes; then : - have_glext=yes -else - have_glext=no -fi - - CPPFLAGS="$ac_save_CPPFLAGS" - if test "$have_glext" = yes ; then + # Check for MesaGL 1.x, but only if libGL doesn't exist. + if test "$have_gl" = no; then ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -13762,14 +14617,13 @@ fi CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glUseProgram" | $as_tr_sh` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glUseProgram in -l$gl_lib_1" >&5 -$as_echo_n "checking for glUseProgram in -l$gl_lib_1... " >&6; } -if eval \${$as_ac_Lib+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glEnable in -lMesaGL" >&5 +$as_echo_n "checking for glEnable in -lMesaGL... " >&6; } +if ${ac_cv_lib_MesaGL_glEnable+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS" +LIBS="-lMesaGL $GL_LIBS -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13779,169 +14633,118 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char glUseProgram (); +char glEnable (); int main () { -return glUseProgram (); +return glEnable (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - eval "$as_ac_Lib=yes" + ac_cv_lib_MesaGL_glEnable=yes else - eval "$as_ac_Lib=no" + ac_cv_lib_MesaGL_glEnable=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -eval ac_res=\$$as_ac_Lib - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : - $as_echo "#define HAVE_GLSL 1" >>confdefs.h - -else - true +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_MesaGL_glEnable" >&5 +$as_echo "$ac_cv_lib_MesaGL_glEnable" >&6; } +if test "x$ac_cv_lib_MesaGL_glEnable" = xyes; then : + have_gl=yes + gl_lib_1="MesaGL" + GL_LIBS="-lMesaGL $GL_LIBS" fi CPPFLAGS="$ac_save_CPPFLAGS" LDFLAGS="$ac_save_LDFLAGS" # LIBS="$ac_save_LIBS" + fi fi fi -elif test "$with_gl" != no; then - echo "error: must be yes or no: --with-gl=$with_gl" - exit 1 -fi - -############################################################################### -# -# Check for -lgle. -# -############################################################################### - -have_gle=no -with_gle_req=unspecified -gle_halfassed=no - -# Check whether --with-gle was given. -if test "${with_gle+set}" = set; then : - withval=$with_gle; with_gle="$withval"; with_gle_req="$withval" -else - with_gle=yes -fi - - case "$with_gle" in - yes) ;; - no) ;; - - /*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLE headers" >&5 -$as_echo_n "checking for GLE headers... " >&6; } - d=$with_gle/include - if test -d $d; then - X_CFLAGS="-I$d $X_CFLAGS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 -$as_echo "$d" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 -$as_echo "not found ($d: no such directory)" >&6; } - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLE libs" >&5 -$as_echo_n "checking for GLE libs... " >&6; } - d=$with_gle/lib - if test -d $d; then - X_LIBS="-L$d $X_LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 -$as_echo "$d" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 -$as_echo "not found ($d: no such directory)" >&6; } - fi - - # replace the directory string with "yes". - with_gle_req="yes" - with_gle=$with_gle_req - ;; - - *) - echo "" - echo "error: argument to --with-gle must be \"yes\", \"no\", or a directory." - echo " If it is a directory, then \`DIR/include' will be added to" - echo " the -I list, and \`DIR/lib' will be added to the -L list." - exit 1 - ;; - esac - -GLE_LIBS="" - -if test "$have_gl" = no ; then - true -elif test "$with_gle" = yes; then + # Figure out whether the GLU functions are in the main GL libraries or + # in -lGLU. Since Android does not have GLU, we don't link against libGLU + # when using --with-gles on Linux. + # + if test "$have_gl" = yes -a "$have_jwzgles" = no; then ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" + if test \! -z "$includedir" ; then CPPFLAGS="$CPPFLAGS -I$includedir" fi + # note: $X_CFLAGS includes $x_includes CPPFLAGS="$CPPFLAGS $X_CFLAGS" - CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_compile "$LINENO" "GL/gle.h" "ac_cv_header_GL_gle_h" "#include -" -if test "x$ac_cv_header_GL_gle_h" = xyes; then : - have_gle3=yes -else - have_gle3=no -fi - - CPPFLAGS="$ac_save_CPPFLAGS" - if test "$have_gle3" = yes ; then - have_gle=yes; - else - ac_save_CPPFLAGS="$CPPFLAGS" - if test \! -z "$includedir" ; then - CPPFLAGS="$CPPFLAGS -I$includedir" + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" fi - CPPFLAGS="$CPPFLAGS $X_CFLAGS" + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_compile "$LINENO" "GL/gutil.h" "ac_cv_header_GL_gutil_h" "#include -" -if test "x$ac_cv_header_GL_gutil_h" = xyes; then : - have_gle=yes + LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` + as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_gluBuild2DMipmaps" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluBuild2DMipmaps in -l$gl_lib_1" >&5 +$as_echo_n "checking for gluBuild2DMipmaps in -l$gl_lib_1... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 else - have_gle=no + ac_check_lib_save_LIBS=$LIBS +LIBS="-l$gl_lib_1 $GL_LIBS -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gluBuild2DMipmaps (); +int +main () +{ +return gluBuild2DMipmaps (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_LIB$gl_lib_1" | $as_tr_cpp` 1 +_ACEOF - CPPFLAGS="$ac_save_CPPFLAGS" - if test "$have_gle" = yes ; then + LIBS="-l$gl_lib_1 $LIBS" - ac_save_CPPFLAGS="$CPPFLAGS" - if test \! -z "$includedir" ; then - CPPFLAGS="$CPPFLAGS -I$includedir" - fi - CPPFLAGS="$CPPFLAGS $X_CFLAGS" - CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_compile "$LINENO" "GL/tube.h" "ac_cv_header_GL_tube_h" "#include -" -if test "x$ac_cv_header_GL_tube_h" = xyes; then : - have_gle=yes else - have_gle=no + have_gl=no fi CPPFLAGS="$ac_save_CPPFLAGS" - fi - fi + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" - if test "$have_gle" = yes ; then - have_gle=no - gle_halfassed=yes + if test "$have_gl" = no; then ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -13961,13 +14764,13 @@ fi CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gleCreateGC in -lgle" >&5 -$as_echo_n "checking for gleCreateGC in -lgle... " >&6; } -if ${ac_cv_lib_gle_gleCreateGC+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluBuild2DMipmaps in -lGLU" >&5 +$as_echo_n "checking for gluBuild2DMipmaps in -lGLU... " >&6; } +if ${ac_cv_lib_GLU_gluBuild2DMipmaps+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lgle $GL_LIBS -lX11 -lXext -lm $LIBS" +LIBS="-lGLU $GL_LIBS -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13977,52 +14780,46 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char gleCreateGC (); +char gluBuild2DMipmaps (); int main () { -return gleCreateGC (); +return gluBuild2DMipmaps (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_gle_gleCreateGC=yes + ac_cv_lib_GLU_gluBuild2DMipmaps=yes else - ac_cv_lib_gle_gleCreateGC=no + ac_cv_lib_GLU_gluBuild2DMipmaps=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gle_gleCreateGC" >&5 -$as_echo "$ac_cv_lib_gle_gleCreateGC" >&6; } -if test "x$ac_cv_lib_gle_gleCreateGC" = xyes; then : - have_gle=yes; gle_halfassed=no; GLE_LIBS="-lgle" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLU_gluBuild2DMipmaps" >&5 +$as_echo "$ac_cv_lib_GLU_gluBuild2DMipmaps" >&6; } +if test "x$ac_cv_lib_GLU_gluBuild2DMipmaps" = xyes; then : + have_gl=yes + GL_LIBS="-lGLU $GL_LIBS" +else + have_gl=no + gl_halfassed=yes fi CPPFLAGS="$ac_save_CPPFLAGS" LDFLAGS="$ac_save_LDFLAGS" # LIBS="$ac_save_LIBS" + fi fi - if test "$have_gle" = yes ; then - have_gle=no - gle_halfassed=yes - # sometimes the libmatrix stuff is included in libgle. look there first. -# -# I don't get it. For some reason, this test passes on SGI, as if -# uview_direction_d() was in libgle -- but it's not, it's in libmatrix. -# Yet the link is succeeding. Why??? -# -# AC_CHECK_X_LIB(gle, uview_direction_d, -# [have_gle=yes; gle_halfassed=no], -# [], $GL_LIBS -lX11 -lXext -lm) + if test "$have_gl" = yes; then - # As of GLE 3 this is in libgle, and has changed name to uview_direction! - # *sigh* - if test "$have_gle3" = yes ; then + $as_echo "#define HAVE_GL 1" >>confdefs.h + + # OpenGL 1.0 didn't have multiple textures. ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -14042,13 +14839,14 @@ fi CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uview_direction in -lgle" >&5 -$as_echo_n "checking for uview_direction in -lgle... " >&6; } -if ${ac_cv_lib_gle_uview_direction+:} false; then : + as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glBindTexture" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glBindTexture in -l$gl_lib_1" >&5 +$as_echo_n "checking for glBindTexture in -l$gl_lib_1... " >&6; } +if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lgle $GL_LIBS -lX11 -lXext -lm $LIBS" +LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14058,37 +14856,39 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char uview_direction (); +char glBindTexture (); int main () { -return uview_direction (); +return glBindTexture (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_gle_uview_direction=yes + eval "$as_ac_Lib=yes" else - ac_cv_lib_gle_uview_direction=no + eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gle_uview_direction" >&5 -$as_echo "$ac_cv_lib_gle_uview_direction" >&6; } -if test "x$ac_cv_lib_gle_uview_direction" = xyes; then : - have_gle=yes; gle_halfassed=no +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + $as_echo "#define HAVE_GLBINDTEXTURE 1" >>confdefs.h + +else + true fi CPPFLAGS="$ac_save_CPPFLAGS" LDFLAGS="$ac_save_LDFLAGS" # LIBS="$ac_save_LIBS" - fi - # if it wasn't in libgle, then look in libmatrix. - if test "$have_gle" = no ; then + # Check for native GLES1 ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -14108,13 +14908,14 @@ fi CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uview_direction_d in -lmatrix" >&5 -$as_echo_n "checking for uview_direction_d in -lmatrix... " >&6; } -if ${ac_cv_lib_matrix_uview_direction_d+:} false; then : + as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glBindBuffer" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glBindBuffer in -l$gl_lib_1" >&5 +$as_echo_n "checking for glBindBuffer in -l$gl_lib_1... " >&6; } +if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lmatrix $GL_LIBS -lX11 -lXext -lm $LIBS" +LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14124,209 +14925,127 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char uview_direction_d (); +char glBindBuffer (); int main () { -return uview_direction_d (); +return glBindBuffer (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_matrix_uview_direction_d=yes + eval "$as_ac_Lib=yes" else - ac_cv_lib_matrix_uview_direction_d=no + eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_matrix_uview_direction_d" >&5 -$as_echo "$ac_cv_lib_matrix_uview_direction_d" >&6; } -if test "x$ac_cv_lib_matrix_uview_direction_d" = xyes; then : - have_gle=yes; gle_halfassed=no; - GLE_LIBS="$GLE_LIBS -lmatrix" +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + $as_echo "#define HAVE_GLES 1" >>confdefs.h + +else + true fi CPPFLAGS="$ac_save_CPPFLAGS" LDFLAGS="$ac_save_LDFLAGS" # LIBS="$ac_save_LIBS" - fi - fi - - if test "$have_gle" = yes ; then - $as_echo "#define HAVE_GLE 1" >>confdefs.h - - if test "$have_gle3" = yes ; then - $as_echo "#define HAVE_GLE3 1" >>confdefs.h + # Check for GLSL and GLES2 - fi + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" fi - -elif test "$with_gle" != no; then - echo "error: must be yes or no: --with-gle=$with_gle" - exit 1 - -fi - -############################################################################### -# -# Handle --with-gles -# -############################################################################### - -with_gles_req=unspecified - -# Check whether --with-gles was given. -if test "${with_gles+set}" = set; then : - withval=$with_gles; with_gles="$withval"; with_gles_req="$withval" -else - with_gles=no -fi - - case "$with_gles" in - yes) ;; - no) ;; - - /*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JWZGLES headers" >&5 -$as_echo_n "checking for JWZGLES headers... " >&6; } - d=$with_gles/include - if test -d $d; then - X_CFLAGS="-I$d $X_CFLAGS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 -$as_echo "$d" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 -$as_echo "not found ($d: no such directory)" >&6; } - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JWZGLES libs" >&5 -$as_echo_n "checking for JWZGLES libs... " >&6; } - d=$with_gles/lib - if test -d $d; then - X_LIBS="-L$d $X_LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 -$as_echo "$d" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 -$as_echo "not found ($d: no such directory)" >&6; } - fi - - # replace the directory string with "yes". - with_gles_req="yes" - with_gles=$with_gles_req - ;; - - *) - echo "" - echo "error: argument to --with-gles must be \"yes\", \"no\", or a directory." - echo " If it is a directory, then \`DIR/include' will be added to" - echo " the -I list, and \`DIR/lib' will be added to the -L list." - exit 1 - ;; - esac - -if test "$with_gles" = yes; then - have_gles=yes - $as_echo "#define HAVE_JWZGLES 1" >>confdefs.h - - JWZGLES_OBJS='$(JWXYZ_BIN)/jwzgles.o' - { $as_echo "$as_me:${as_lineno-$LINENO}: result: using OpenGL ES compatiblity shim" >&5 -$as_echo "using OpenGL ES compatiblity shim" >&6; } -elif test "$with_gles" != no; then - echo "error: must be yes or no: --with-gles=$with_gles" - exit 1 -fi - -############################################################################### -# -# Check for -ljpeg -# -############################################################################### - -have_jpeg=no -with_jpeg_req=unspecified -jpeg_halfassed=no - -# Check whether --with-jpeg was given. -if test "${with_jpeg+set}" = set; then : - withval=$with_jpeg; with_jpeg="$withval"; with_jpeg_req="$withval" -else - with_jpeg=yes -fi - - case "$with_jpeg" in - yes) ;; - no) ;; - - /*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG headers" >&5 -$as_echo_n "checking for JPEG headers... " >&6; } - d=$with_jpeg/include - if test -d $d; then - X_CFLAGS="-I$d $X_CFLAGS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 -$as_echo "$d" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 -$as_echo "not found ($d: no such directory)" >&6; } - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG libs" >&5 -$as_echo_n "checking for JPEG libs... " >&6; } - d=$with_jpeg/lib - if test -d $d; then - X_LIBS="-L$d $X_LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 -$as_echo "$d" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 -$as_echo "not found ($d: no such directory)" >&6; } - fi - - # replace the directory string with "yes". - with_jpeg_req="yes" - with_jpeg=$with_jpeg_req - ;; - - *) - echo "" - echo "error: argument to --with-jpeg must be \"yes\", \"no\", or a directory." - echo " If it is a directory, then \`DIR/include' will be added to" - echo " the -I list, and \`DIR/lib' will be added to the -L list." - exit 1 - ;; - esac - -if test "$with_jpeg" != yes -a "$with_jpeg" != no ; then - echo "error: must be yes or no: --with-jpeg=$with_jpeg" - exit 1 + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + ac_fn_c_check_header_compile "$LINENO" "GL/glext.h" "ac_cv_header_GL_glext_h" "#include +" +if test "x$ac_cv_header_GL_glext_h" = xyes; then : + have_glext=yes +else + have_glext=no fi -if test "$with_jpeg" = yes; then - - have_jpeg=no + CPPFLAGS="$ac_save_CPPFLAGS" + if test "$have_glext" = yes ; then ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" + if test \! -z "$includedir" ; then CPPFLAGS="$CPPFLAGS -I$includedir" fi + # note: $X_CFLAGS includes $x_includes CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" -if test "x$ac_cv_header_jpeglib_h" = xyes; then : - have_jpeg=yes + LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` + as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glUseProgram" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glUseProgram in -l$gl_lib_1" >&5 +$as_echo_n "checking for glUseProgram in -l$gl_lib_1... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char glUseProgram (); +int +main () +{ +return glUseProgram (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + $as_echo "#define HAVE_GLSL 1" >>confdefs.h + + $as_echo "#define HAVE_GLES2 1" >>confdefs.h + fi CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" - if test "$have_jpeg" = yes; then - # we have the header, now check for the library - have_jpeg=no - jpeg_halfassed=yes + fi + + # Check for GLES3 ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -14346,13 +15065,14 @@ fi CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_start_compress in -ljpeg" >&5 -$as_echo_n "checking for jpeg_start_compress in -ljpeg... " >&6; } -if ${ac_cv_lib_jpeg_jpeg_start_compress+:} false; then : + as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glBlitFramebuffer" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glBlitFramebuffer in -l$gl_lib_1" >&5 +$as_echo_n "checking for glBlitFramebuffer in -l$gl_lib_1... " >&6; } +if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-ljpeg $LIBS" +LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14362,31 +15082,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char jpeg_start_compress (); +char glBlitFramebuffer (); int main () { -return jpeg_start_compress (); +return glBlitFramebuffer (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_jpeg_jpeg_start_compress=yes + eval "$as_ac_Lib=yes" else - ac_cv_lib_jpeg_jpeg_start_compress=no + eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_start_compress" >&5 -$as_echo "$ac_cv_lib_jpeg_jpeg_start_compress" >&6; } -if test "x$ac_cv_lib_jpeg_jpeg_start_compress" = xyes; then : - have_jpeg=yes - jpeg_halfassed=no - JPEG_LIBS="-ljpeg" - $as_echo "#define HAVE_JPEGLIB 1" >>confdefs.h +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + $as_echo "#define HAVE_GLES3 1" >>confdefs.h fi @@ -14394,34 +15112,45 @@ fi LDFLAGS="$ac_save_LDFLAGS" # LIBS="$ac_save_LIBS" + if test "$have_jwzgles" = yes; then + $as_echo "#define HAVE_JWZGLES 1" >>confdefs.h + + $as_echo "#define HAVE_GLES 1" >>confdefs.h + + fi + fi + +elif test "$with_gl" != no; then + echo "error: must be yes or no: --with-gl=$with_gl" + exit 1 fi ############################################################################### # -# Check for -lpng +# Handle --with-glx # ############################################################################### -have_png=no -with_png_req=unspecified -png_halfassed=no +have_glx=no +have_egl=no +with_egl_req=unspecified -# Check whether --with-png was given. -if test "${with_png+set}" = set; then : - withval=$with_png; with_png="$withval"; with_png_req="$withval" +# Check whether --with-glx was given. +if test "${with_glx+set}" = set; then : + withval=$with_glx; with_egl="$withval"; with_egl_req="$withval" else - with_png=yes + with_glx=no fi - case "$with_png" in + case "$with_glx" in yes) ;; no) ;; /*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG headers" >&5 -$as_echo_n "checking for PNG headers... " >&6; } - d=$with_png/include + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLX headers" >&5 +$as_echo_n "checking for GLX headers... " >&6; } + d=$with_glx/include if test -d $d; then X_CFLAGS="-I$d $X_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 @@ -14431,9 +15160,9 @@ $as_echo "$d" >&6; } $as_echo "not found ($d: no such directory)" >&6; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG libs" >&5 -$as_echo_n "checking for PNG libs... " >&6; } - d=$with_png/lib + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLX libs" >&5 +$as_echo_n "checking for GLX libs... " >&6; } + d=$with_glx/lib if test -d $d; then X_LIBS="-L$d $X_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 @@ -14444,45 +15173,112 @@ $as_echo "not found ($d: no such directory)" >&6; } fi # replace the directory string with "yes". - with_png_req="yes" - with_png=$with_png_req + with_glx_req="yes" + with_glx=$with_glx_req ;; *) echo "" - echo "error: argument to --with-png must be \"yes\", \"no\", or a directory." + echo "error: argument to --with-glx must be \"yes\", \"no\", or a directory." echo " If it is a directory, then \`DIR/include' will be added to" echo " the -I list, and \`DIR/lib' will be added to the -L list." exit 1 ;; esac -if test "$with_png" != yes -a "$with_png" != no ; then - echo "error: must be yes or no: --with-png=$with_png" +if test "$with_glx" = yes; then + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + ac_fn_c_check_header_mongrel "$LINENO" "GLX/glx.h" "ac_cv_header_GLX_glx_h" "$ac_includes_default" +if test "x$ac_cv_header_GLX_glx_h" = xyes; then : + have_glx=yes +else + have_glx=no +fi + + CPPFLAGS="$ac_save_CPPFLAGS" +elif test "$with_glx" != no; then + echo "error: must be yes or no: --with-glx=$with_glx" exit 1 fi -if test "$with_png" = yes; then +if test "$have_gl" = yes; then - have_png=no + # See if GLX functions are in -LGL. ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" + if test \! -z "$includedir" ; then CPPFLAGS="$CPPFLAGS -I$includedir" fi + # note: $X_CFLAGS includes $x_includes CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" -if test "x$ac_cv_header_png_h" = xyes; then : - have_png=yes + LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` + as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glXCreateContext" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXCreateContext in -l$gl_lib_1" >&5 +$as_echo_n "checking for glXCreateContext in -l$gl_lib_1... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-l$gl_lib_1 $GL_LIBS -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char glXCreateContext (); +int +main () +{ +return glXCreateContext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + have_glx=yes +else + have_glx=no fi CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" - if test "$have_png" = yes; then - # we have the header, now check for the library - have_png=no - png_halfassed=yes + # See if EGL functions are in -LGL. + egl_lib="" ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -14502,13 +15298,82 @@ fi CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_create_read_struct in -lpng" >&5 -$as_echo_n "checking for png_create_read_struct in -lpng... " >&6; } -if ${ac_cv_lib_png_png_create_read_struct+:} false; then : + as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_eglCreatePlatformWindowSurface" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for eglCreatePlatformWindowSurface in -l$gl_lib_1" >&5 +$as_echo_n "checking for eglCreatePlatformWindowSurface in -l$gl_lib_1... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-l$gl_lib_1 $GL_LIBS -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char eglCreatePlatformWindowSurface (); +int +main () +{ +return eglCreatePlatformWindowSurface (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + have_egl=yes +else + have_egl=no +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" + + if test "$have_egl" = no; then + # See if EGL functions are in -lEGL. + + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" + + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + # note: $X_CFLAGS includes $x_includes + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" + + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for eglCreatePlatformWindowSurface in -lEGL" >&5 +$as_echo_n "checking for eglCreatePlatformWindowSurface in -lEGL... " >&6; } +if ${ac_cv_lib_EGL_eglCreatePlatformWindowSurface+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lpng $LIBS" +LIBS="-lEGL $GL_LIBS -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14518,32 +15383,31 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char png_create_read_struct (); +char eglCreatePlatformWindowSurface (); int main () { -return png_create_read_struct (); +return eglCreatePlatformWindowSurface (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_png_png_create_read_struct=yes + ac_cv_lib_EGL_eglCreatePlatformWindowSurface=yes else - ac_cv_lib_png_png_create_read_struct=no + ac_cv_lib_EGL_eglCreatePlatformWindowSurface=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_create_read_struct" >&5 -$as_echo "$ac_cv_lib_png_png_create_read_struct" >&6; } -if test "x$ac_cv_lib_png_png_create_read_struct" = xyes; then : - have_png=yes - png_halfassed=no - PNG_LIBS="-lpng" - $as_echo "#define HAVE_LIBPNG 1" >>confdefs.h - +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_EGL_eglCreatePlatformWindowSurface" >&5 +$as_echo "$ac_cv_lib_EGL_eglCreatePlatformWindowSurface" >&6; } +if test "x$ac_cv_lib_EGL_eglCreatePlatformWindowSurface" = xyes; then : + have_egl=yes + egl_lib="EGL" +else + have_egl=no fi CPPFLAGS="$ac_save_CPPFLAGS" @@ -14551,47 +15415,68 @@ fi # LIBS="$ac_save_LIBS" fi + + # If both GLX and EGL exist, use GLX only if requested. + if test "$with_glx" = yes -a "$have_glx" = yes; then + have_egl=no + fi + + if test "$have_egl" = yes; then + $as_echo "#define HAVE_EGL 1" >>confdefs.h + + if test \! -z "$egl_lib"; then + GL_LIBS="-l$egl_lib $GL_LIBS" + fi + fi + + # One of them is required + if test "$have_egl" = no -a "$have_glx" = no; then + have_gl=no + gl_halfassed=yes + fi + + # --with-gles means that we are emulating a system that supports GLES but + # does not support OpenGL 1.3 (e.g., using Linux to simulate an Android-like + # environment). On such a system, GLE is required and GLX wouldn't exist. + # There is no way to request a GLES 3.0 runtime context using GLX. + # + if test "$have_jwzgles" = yes -a "$have_egl" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Using --with-glx and --with-gles together is a bad idea." >&5 +$as_echo "$as_me: WARNING: Using --with-glx and --with-gles together is a bad idea." >&2;} + fi + fi +# Restore flags after testing OpenGL libraries. +# +CFLAGS="$ac_save_pthreads_CFLAGS" +LIBS="$ac_save_pthreads_LIBS" + ############################################################################### # -# Check for -lgdk_pixbuf. -# These tests are for gdk_pixbuf usage of the hacks, -# not xscreensaver-demo (thus we have to test again to get -# the libraries right: don't want to pull in all of GTK -# for the hacks.) +# Check for -lgle. # ############################################################################### -have_gdk_pixbuf=no -with_gdk_pixbuf_req=unspecified +have_gle=no +with_gle_req=unspecified +gle_halfassed=no -# Check whether --with-pixbuf was given. -if test "${with_pixbuf+set}" = set; then : - withval=$with_pixbuf; with_gdk_pixbuf="$withval"; with_gdk_pixbuf_req="$withval" +# Check whether --with-gle was given. +if test "${with_gle+set}" = set; then : + withval=$with_gle; with_gle="$withval"; with_gle_req="$withval" else - with_gdk_pixbuf=yes + with_gle=yes fi -# if --with-pixbuf=/directory/ was specified, remember that directory so that -# we can also look for the `gdk-pixbuf-config' program in that directory. -case "$with_gdk_pixbuf" in - /*) - gdk_pixbuf_dir="$with_gdk_pixbuf" - ;; - *) - gdk_pixbuf_dir="" - ;; -esac - - case "$with_gdk_pixbuf" in + case "$with_gle" in yes) ;; no) ;; /*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GDK_PIXBUF headers" >&5 -$as_echo_n "checking for GDK_PIXBUF headers... " >&6; } - d=$with_gdk_pixbuf/include + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLE headers" >&5 +$as_echo_n "checking for GLE headers... " >&6; } + d=$with_gle/include if test -d $d; then X_CFLAGS="-I$d $X_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 @@ -14601,9 +15486,9 @@ $as_echo "$d" >&6; } $as_echo "not found ($d: no such directory)" >&6; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GDK_PIXBUF libs" >&5 -$as_echo_n "checking for GDK_PIXBUF libs... " >&6; } - d=$with_gdk_pixbuf/lib + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLE libs" >&5 +$as_echo_n "checking for GLE libs... " >&6; } + d=$with_gle/lib if test -d $d; then X_LIBS="-L$d $X_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 @@ -14614,69 +15499,43 @@ $as_echo "not found ($d: no such directory)" >&6; } fi # replace the directory string with "yes". - with_gdk_pixbuf_req="yes" - with_gdk_pixbuf=$with_gdk_pixbuf_req + with_gle_req="yes" + with_gle=$with_gle_req ;; *) echo "" - echo "error: argument to --with-pixbuf must be \"yes\", \"no\", or a directory." + echo "error: argument to --with-gle must be \"yes\", \"no\", or a directory." echo " If it is a directory, then \`DIR/include' will be added to" echo " the -I list, and \`DIR/lib' will be added to the -L list." exit 1 ;; esac -if test "$with_gdk_pixbuf" != yes -a "$with_gdk_pixbuf" != no ; then - echo "error: must be yes or no: --with-pixbuf=$with_gdk_pixbuf" - exit 1 -fi - -if test "$with_gdk_pixbuf" = yes; then - have_gdk_pixbuf=no - - pkgs='' - ok="yes" +GLE_LIBS="" - pkg_check_version gdk-pixbuf-2.0 2.0.0 - pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0 - pkg_check_version gio-2.0 2.0.0 - have_gdk_pixbuf="$ok" +if test "$have_gl" = no ; then + true +elif test "$with_gle" = yes; then - if test "$have_gdk_pixbuf" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk-pixbuf includes" >&5 -$as_echo_n "checking for gdk-pixbuf includes... " >&6; } -if ${ac_cv_gdk_pixbuf_config_cflags+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_gdk_pixbuf_config_cflags=`$pkg_config --cflags $pkgs` -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gdk_pixbuf_config_cflags" >&5 -$as_echo "$ac_cv_gdk_pixbuf_config_cflags" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk-pixbuf libs" >&5 -$as_echo_n "checking for gdk-pixbuf libs... " >&6; } -if ${ac_cv_gdk_pixbuf_config_libs+:} false; then : - $as_echo_n "(cached) " >&6 + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + ac_fn_c_check_header_compile "$LINENO" "GL/gle.h" "ac_cv_header_GL_gle_h" "#include +" +if test "x$ac_cv_header_GL_gle_h" = xyes; then : + have_gle3=yes else - ac_cv_gdk_pixbuf_config_libs=`$pkg_config --libs $pkgs` + have_gle3=no fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gdk_pixbuf_config_libs" >&5 -$as_echo "$ac_cv_gdk_pixbuf_config_libs" >&6; } - fi - - ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags - ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs - - if test "$have_gdk_pixbuf" = yes; then - # - # we appear to have pixbuf; check for headers/libs to be sure. - # - ac_save_gdk_pixbuf_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $ac_gdk_pixbuf_config_cflags" - have_gdk_pixbuf=no - - # check for header A... + CPPFLAGS="$ac_save_CPPFLAGS" + if test "$have_gle3" = yes ; then + have_gle=yes; + else ac_save_CPPFLAGS="$CPPFLAGS" if test \! -z "$includedir" ; then @@ -14684,17 +15543,16 @@ $as_echo "$ac_cv_gdk_pixbuf_config_libs" >&6; } fi CPPFLAGS="$CPPFLAGS $X_CFLAGS" CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_mongrel "$LINENO" "gdk-pixbuf/gdk-pixbuf.h" "ac_cv_header_gdk_pixbuf_gdk_pixbuf_h" "$ac_includes_default" -if test "x$ac_cv_header_gdk_pixbuf_gdk_pixbuf_h" = xyes; then : - have_gdk_pixbuf=yes + ac_fn_c_check_header_compile "$LINENO" "GL/gutil.h" "ac_cv_header_GL_gutil_h" "#include +" +if test "x$ac_cv_header_GL_gutil_h" = xyes; then : + have_gle=yes +else + have_gle=no fi CPPFLAGS="$ac_save_CPPFLAGS" - - # if that worked, check for header B... - if test "$have_gdk_pixbuf" = yes; then - have_gdk_pixbuf=no - gdk_pixbuf_halfassed=yes + if test "$have_gle" = yes ; then ac_save_CPPFLAGS="$CPPFLAGS" if test \! -z "$includedir" ; then @@ -14702,46 +15560,102 @@ fi fi CPPFLAGS="$CPPFLAGS $X_CFLAGS" CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_mongrel "$LINENO" "gdk-pixbuf/gdk-pixbuf-xlib.h" "ac_cv_header_gdk_pixbuf_gdk_pixbuf_xlib_h" "$ac_includes_default" -if test "x$ac_cv_header_gdk_pixbuf_gdk_pixbuf_xlib_h" = xyes; then : - have_gdk_pixbuf=yes - gdk_pixbuf_halfassed=no + ac_fn_c_check_header_compile "$LINENO" "GL/tube.h" "ac_cv_header_GL_tube_h" "#include +" +if test "x$ac_cv_header_GL_tube_h" = xyes; then : + have_gle=yes +else + have_gle=no fi CPPFLAGS="$ac_save_CPPFLAGS" + fi + fi - # yay, it has a new name in Gtk 2.x... - if test "$have_gdk_pixbuf" = no; then - have_gdk_pixbuf=no - gdk_pixbuf_halfassed=yes + if test "$have_gle" = yes ; then + have_gle=no + gle_halfassed=yes ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" + if test \! -z "$includedir" ; then CPPFLAGS="$CPPFLAGS -I$includedir" fi + # note: $X_CFLAGS includes $x_includes CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_mongrel "$LINENO" "gdk-pixbuf-xlib/gdk-pixbuf-xlib.h" "ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h" "$ac_includes_default" -if test "x$ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h" = xyes; then : - have_gdk_pixbuf=yes - gdk_pixbuf_halfassed=no + LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gleCreateGC in -lgle" >&5 +$as_echo_n "checking for gleCreateGC in -lgle... " >&6; } +if ${ac_cv_lib_gle_gleCreateGC+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgle $GL_LIBS -lX11 -lXext -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gleCreateGC (); +int +main () +{ +return gleCreateGC (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gle_gleCreateGC=yes +else + ac_cv_lib_gle_gleCreateGC=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gle_gleCreateGC" >&5 +$as_echo "$ac_cv_lib_gle_gleCreateGC" >&6; } +if test "x$ac_cv_lib_gle_gleCreateGC" = xyes; then : + have_gle=yes; gle_halfassed=no; GLE_LIBS="-lgle" fi CPPFLAGS="$ac_save_CPPFLAGS" - fi - fi - CPPFLAGS="$ac_save_gdk_pixbuf_CPPFLAGS" - fi + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" - if test "$have_gdk_pixbuf" = yes; then - # we have the headers, now check for the libraries - have_gdk_pixbuf=no - gdk_pixbuf_halfassed=yes + fi + if test "$have_gle" = yes ; then + have_gle=no + gle_halfassed=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for gdk_pixbuf usability..." >&5 -$as_echo "checking for gdk_pixbuf usability..." >&6; } + # sometimes the libmatrix stuff is included in libgle. look there first. +# +# I don't get it. For some reason, this test passes on SGI, as if +# uview_direction_d() was in libgle -- but it's not, it's in libmatrix. +# Yet the link is succeeding. Why??? +# +# AC_CHECK_X_LIB(gle, uview_direction_d, +# [have_gle=yes; gle_halfassed=no], +# [], $GL_LIBS -lX11 -lXext -lm) - # library A... + # As of GLE 3 this is in libgle, and has changed name to uview_direction! + # *sigh* + if test "$have_gle3" = yes ; then ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -14761,13 +15675,13 @@ $as_echo "checking for gdk_pixbuf usability..." >&6; } CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_new_from_file in -lc" >&5 -$as_echo_n "checking for gdk_pixbuf_new_from_file in -lc... " >&6; } -if ${ac_cv_lib_c_gdk_pixbuf_new_from_file+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uview_direction in -lgle" >&5 +$as_echo_n "checking for uview_direction in -lgle... " >&6; } +if ${ac_cv_lib_gle_uview_direction+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS" +LIBS="-lgle $GL_LIBS -lX11 -lXext -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14777,37 +15691,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char gdk_pixbuf_new_from_file (); +char uview_direction (); int main () { -return gdk_pixbuf_new_from_file (); +return uview_direction (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_c_gdk_pixbuf_new_from_file=yes + ac_cv_lib_gle_uview_direction=yes else - ac_cv_lib_c_gdk_pixbuf_new_from_file=no + ac_cv_lib_gle_uview_direction=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_new_from_file" >&5 -$as_echo "$ac_cv_lib_c_gdk_pixbuf_new_from_file" >&6; } -if test "x$ac_cv_lib_c_gdk_pixbuf_new_from_file" = xyes; then : - have_gdk_pixbuf=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gle_uview_direction" >&5 +$as_echo "$ac_cv_lib_gle_uview_direction" >&6; } +if test "x$ac_cv_lib_gle_uview_direction" = xyes; then : + have_gle=yes; gle_halfassed=no fi CPPFLAGS="$ac_save_CPPFLAGS" LDFLAGS="$ac_save_LDFLAGS" # LIBS="$ac_save_LIBS" - # library B... - if test "$have_gdk_pixbuf" = yes; then - have_gdk_pixbuf=no + fi + # if it wasn't in libgle, then look in libmatrix. + if test "$have_gle" = no ; then ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -14827,13 +15741,13 @@ fi CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_xlib_init in -lc" >&5 -$as_echo_n "checking for gdk_pixbuf_xlib_init in -lc... " >&6; } -if ${ac_cv_lib_c_gdk_pixbuf_xlib_init+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uview_direction_d in -lmatrix" >&5 +$as_echo_n "checking for uview_direction_d in -lmatrix... " >&6; } +if ${ac_cv_lib_matrix_uview_direction_d+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS" +LIBS="-lmatrix $GL_LIBS -lX11 -lXext -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14843,29 +15757,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char gdk_pixbuf_xlib_init (); +char uview_direction_d (); int main () { -return gdk_pixbuf_xlib_init (); +return uview_direction_d (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_c_gdk_pixbuf_xlib_init=yes + ac_cv_lib_matrix_uview_direction_d=yes else - ac_cv_lib_c_gdk_pixbuf_xlib_init=no + ac_cv_lib_matrix_uview_direction_d=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_xlib_init" >&5 -$as_echo "$ac_cv_lib_c_gdk_pixbuf_xlib_init" >&6; } -if test "x$ac_cv_lib_c_gdk_pixbuf_xlib_init" = xyes; then : - have_gdk_pixbuf=yes - gdk_pixbuf_halfassed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_matrix_uview_direction_d" >&5 +$as_echo "$ac_cv_lib_matrix_uview_direction_d" >&6; } +if test "x$ac_cv_lib_matrix_uview_direction_d" = xyes; then : + have_gle=yes; gle_halfassed=no; + GLE_LIBS="$GLE_LIBS -lmatrix" fi CPPFLAGS="$ac_save_CPPFLAGS" @@ -14875,17 +15789,107 @@ fi fi fi - if test "$have_gdk_pixbuf" = yes; then - INCLUDES="$INCLUDES $ac_gdk_pixbuf_config_cflags" - PNG_LIBS="$ac_gdk_pixbuf_config_libs" - $as_echo "#define HAVE_GDK_PIXBUF 1" >>confdefs.h + if test "$have_gle" = yes ; then + $as_echo "#define HAVE_GLE 1" >>confdefs.h - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for gdk_pixbuf usability... no" >&5 -$as_echo "checking for gdk_pixbuf usability... no" >&6; } + if test "$have_gle3" = yes ; then + $as_echo "#define HAVE_GLE3 1" >>confdefs.h + + fi fi - if test "$have_gdk_pixbuf" = yes; then +elif test "$with_gle" != no; then + echo "error: must be yes or no: --with-gle=$with_gle" + exit 1 + +fi + +############################################################################### +# +# Check for -ljpeg +# +############################################################################### + +have_jpeg=no +with_jpeg_req=unspecified +jpeg_halfassed=no + +# Check whether --with-jpeg was given. +if test "${with_jpeg+set}" = set; then : + withval=$with_jpeg; with_jpeg="$withval"; with_jpeg_req="$withval" +else + with_jpeg=yes +fi + + case "$with_jpeg" in + yes) ;; + no) ;; + + /*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG headers" >&5 +$as_echo_n "checking for JPEG headers... " >&6; } + d=$with_jpeg/include + if test -d $d; then + X_CFLAGS="-I$d $X_CFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG libs" >&5 +$as_echo_n "checking for JPEG libs... " >&6; } + d=$with_jpeg/lib + if test -d $d; then + X_LIBS="-L$d $X_LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi + + # replace the directory string with "yes". + with_jpeg_req="yes" + with_jpeg=$with_jpeg_req + ;; + + *) + echo "" + echo "error: argument to --with-jpeg must be \"yes\", \"no\", or a directory." + echo " If it is a directory, then \`DIR/include' will be added to" + echo " the -I list, and \`DIR/lib' will be added to the -L list." + exit 1 + ;; + esac + +if test "$with_jpeg" != yes -a "$with_jpeg" != no ; then + echo "error: must be yes or no: --with-jpeg=$with_jpeg" + exit 1 +fi + +if test "$with_jpeg" = yes; then + + have_jpeg=no + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" +if test "x$ac_cv_header_jpeglib_h" = xyes; then : + have_jpeg=yes +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + + if test "$have_jpeg" = yes; then + # we have the header, now check for the library + have_jpeg=no + jpeg_halfassed=yes ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -14905,13 +15909,13 @@ $as_echo "checking for gdk_pixbuf usability... no" >&6; } CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_apply_embedded_orientation in -lc" >&5 -$as_echo_n "checking for gdk_pixbuf_apply_embedded_orientation in -lc... " >&6; } -if ${ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_start_compress in -ljpeg" >&5 +$as_echo_n "checking for jpeg_start_compress in -ljpeg... " >&6; } +if ${ac_cv_lib_jpeg_jpeg_start_compress+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS" +LIBS="-ljpeg $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14921,45 +15925,127 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char gdk_pixbuf_apply_embedded_orientation (); +char jpeg_start_compress (); int main () { -return gdk_pixbuf_apply_embedded_orientation (); +return jpeg_start_compress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation=yes + ac_cv_lib_jpeg_jpeg_start_compress=yes else - ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation=no + ac_cv_lib_jpeg_jpeg_start_compress=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" >&5 -$as_echo "$ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" >&6; } -if test "x$ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" = xyes; then : - $as_echo "#define HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION 1" >>confdefs.h +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_start_compress" >&5 +$as_echo "$ac_cv_lib_jpeg_jpeg_start_compress" >&6; } +if test "x$ac_cv_lib_jpeg_jpeg_start_compress" = xyes; then : + have_jpeg=yes + jpeg_halfassed=no + JPEG_LIBS="-ljpeg" + $as_echo "#define HAVE_JPEGLIB 1" >>confdefs.h + +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" + + fi +fi + +############################################################################### +# +# Check for -lpng +# +############################################################################### + +have_png=no +with_png_req=unspecified +png_halfassed=no + +# Check whether --with-png was given. +if test "${with_png+set}" = set; then : + withval=$with_png; with_png="$withval"; with_png_req="$withval" +else + with_png=yes +fi + + case "$with_png" in + yes) ;; + no) ;; + + /*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG headers" >&5 +$as_echo_n "checking for PNG headers... " >&6; } + d=$with_png/include + if test -d $d; then + X_CFLAGS="-I$d $X_CFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG libs" >&5 +$as_echo_n "checking for PNG libs... " >&6; } + d=$with_png/lib + if test -d $d; then + X_LIBS="-L$d $X_LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi + + # replace the directory string with "yes". + with_png_req="yes" + with_png=$with_png_req + ;; + + *) + echo "" + echo "error: argument to --with-png must be \"yes\", \"no\", or a directory." + echo " If it is a directory, then \`DIR/include' will be added to" + echo " the -I list, and \`DIR/lib' will be added to the -L list." + exit 1 + ;; + esac +if test "$with_png" != yes -a "$with_png" != no ; then + echo "error: must be yes or no: --with-png=$with_png" + exit 1 fi - CPPFLAGS="$ac_save_CPPFLAGS" - LDFLAGS="$ac_save_LDFLAGS" -# LIBS="$ac_save_LIBS" +if test "$with_png" = yes; then + + have_png=no + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" +if test "x$ac_cv_header_png_h" = xyes; then : + have_png=yes fi -############################################################################### -# -# Check for -lXft -# -############################################################################### + CPPFLAGS="$ac_save_CPPFLAGS" -have_xutf8drawstring=no + if test "$have_png" = yes; then + # we have the header, now check for the library + have_png=no + png_halfassed=yes ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -14979,13 +16065,13 @@ have_xutf8drawstring=no CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xutf8DrawString in -lX11" >&5 -$as_echo_n "checking for Xutf8DrawString in -lX11... " >&6; } -if ${ac_cv_lib_X11_Xutf8DrawString+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_create_read_struct in -lpng" >&5 +$as_echo_n "checking for png_create_read_struct in -lpng... " >&6; } +if ${ac_cv_lib_png_png_create_read_struct+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lX11 -lX11 -lXext -lm $LIBS" +LIBS="-lpng $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14995,60 +16081,80 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char Xutf8DrawString (); +char png_create_read_struct (); int main () { -return Xutf8DrawString (); +return png_create_read_struct (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_X11_Xutf8DrawString=yes + ac_cv_lib_png_png_create_read_struct=yes else - ac_cv_lib_X11_Xutf8DrawString=no + ac_cv_lib_png_png_create_read_struct=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_Xutf8DrawString" >&5 -$as_echo "$ac_cv_lib_X11_Xutf8DrawString" >&6; } -if test "x$ac_cv_lib_X11_Xutf8DrawString" = xyes; then : - have_xutf8drawstring=yes -else - true +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_create_read_struct" >&5 +$as_echo "$ac_cv_lib_png_png_create_read_struct" >&6; } +if test "x$ac_cv_lib_png_png_create_read_struct" = xyes; then : + have_png=yes + png_halfassed=no + PNG_LIBS="-lpng" + $as_echo "#define HAVE_LIBPNG 1" >>confdefs.h + fi CPPFLAGS="$ac_save_CPPFLAGS" LDFLAGS="$ac_save_LDFLAGS" # LIBS="$ac_save_LIBS" -if test "$have_xutf8drawstring" = yes ; then - $as_echo "#define HAVE_XUTF8DRAWSTRING 1" >>confdefs.h - + fi fi -have_xft=no -with_xft_req=unspecified -xft_halfassed=no +############################################################################### +# +# Check for -lgdk_pixbuf. +# These tests are for gdk_pixbuf usage of the hacks, +# not xscreensaver-settings (thus we have to test again to get +# the libraries right: don't want to pull in all of GTK +# for the hacks.) +# +############################################################################### -# Check whether --with-xft was given. -if test "${with_xft+set}" = set; then : - withval=$with_xft; with_xft="$withval"; with_xft_req="$withval" +have_gdk_pixbuf=no +with_gdk_pixbuf_req=unspecified + +# Check whether --with-pixbuf was given. +if test "${with_pixbuf+set}" = set; then : + withval=$with_pixbuf; with_gdk_pixbuf="$withval"; with_gdk_pixbuf_req="$withval" else - with_xft=yes + with_gdk_pixbuf=yes fi - case "$with_xft" in +# if --with-pixbuf=/directory/ was specified, remember that directory so that +# we can also look for the `gdk-pixbuf-config' program in that directory. +case "$with_gdk_pixbuf" in + /*) + gdk_pixbuf_dir="$with_gdk_pixbuf" + ;; + *) + gdk_pixbuf_dir="" + ;; +esac + + case "$with_gdk_pixbuf" in yes) ;; no) ;; /*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft headers" >&5 -$as_echo_n "checking for Xft headers... " >&6; } - d=$with_xft/include + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GDK_PIXBUF headers" >&5 +$as_echo_n "checking for GDK_PIXBUF headers... " >&6; } + d=$with_gdk_pixbuf/include if test -d $d; then X_CFLAGS="-I$d $X_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 @@ -15058,9 +16164,9 @@ $as_echo "$d" >&6; } $as_echo "not found ($d: no such directory)" >&6; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft libs" >&5 -$as_echo_n "checking for Xft libs... " >&6; } - d=$with_xft/lib + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GDK_PIXBUF libs" >&5 +$as_echo_n "checking for GDK_PIXBUF libs... " >&6; } + d=$with_gdk_pixbuf/lib if test -d $d; then X_LIBS="-L$d $X_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 @@ -15071,234 +16177,134 @@ $as_echo "not found ($d: no such directory)" >&6; } fi # replace the directory string with "yes". - with_xft_req="yes" - with_xft=$with_xft_req + with_gdk_pixbuf_req="yes" + with_gdk_pixbuf=$with_gdk_pixbuf_req ;; *) echo "" - echo "error: argument to --with-xft must be \"yes\", \"no\", or a directory." + echo "error: argument to --with-pixbuf must be \"yes\", \"no\", or a directory." echo " If it is a directory, then \`DIR/include' will be added to" echo " the -I list, and \`DIR/lib' will be added to the -L list." exit 1 ;; esac -if test "$with_xft" != yes -a "$with_xft" != no ; then - echo "error: must be yes or no: --with-xft=$with_xft" +if test "$with_gdk_pixbuf" != yes -a "$with_gdk_pixbuf" != no ; then + echo "error: must be yes or no: --with-pixbuf=$with_gdk_pixbuf" exit 1 fi -if test "$with_xft" = yes; then +if test "$with_gdk_pixbuf" = yes; then + have_gdk_pixbuf=no pkgs='' ok="yes" - pkg_check_version xft 2.1.0 - have_xft="$ok" - if test "$have_xft" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft includes" >&5 -$as_echo_n "checking for Xft includes... " >&6; } -if ${ac_cv_xft_config_cflags+:} false; then : + pkg_check_version gdk-pixbuf-2.0 2.0.0 + pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0 + pkg_check_version gio-2.0 2.0.0 + have_gdk_pixbuf="$ok" + + if test "$have_gdk_pixbuf" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk-pixbuf includes" >&5 +$as_echo_n "checking for gdk-pixbuf includes... " >&6; } +if ${ac_cv_gdk_pixbuf_config_cflags+:} false; then : $as_echo_n "(cached) " >&6 else - ac_cv_xft_config_cflags=`$pkg_config --cflags $pkgs` + ac_cv_gdk_pixbuf_config_cflags=`$pkg_config --cflags $pkgs` fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_xft_config_cflags" >&5 -$as_echo "$ac_cv_xft_config_cflags" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft libs" >&5 -$as_echo_n "checking for Xft libs... " >&6; } -if ${ac_cv_xft_config_libs+:} false; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gdk_pixbuf_config_cflags" >&5 +$as_echo "$ac_cv_gdk_pixbuf_config_cflags" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk-pixbuf libs" >&5 +$as_echo_n "checking for gdk-pixbuf libs... " >&6; } +if ${ac_cv_gdk_pixbuf_config_libs+:} false; then : $as_echo_n "(cached) " >&6 else - ac_cv_xft_config_libs=`$pkg_config --libs $pkgs` + ac_cv_gdk_pixbuf_config_libs=`$pkg_config --libs $pkgs` fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_xft_config_libs" >&5 -$as_echo "$ac_cv_xft_config_libs" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gdk_pixbuf_config_libs" >&5 +$as_echo "$ac_cv_gdk_pixbuf_config_libs" >&6; } fi - ac_xft_config_cflags=$ac_cv_xft_config_cflags - ac_xft_config_libs=$ac_cv_xft_config_libs + ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags + ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs - if test "$have_xft" = yes; then + if test "$have_gdk_pixbuf" = yes; then # - # we appear to have Xft; check for headers/libs to be sure. + # we appear to have pixbuf; check for headers/libs to be sure. # - ac_save_xft_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $ac_xft_config_cflags" - - have_xft=no - - ac_save_CPPFLAGS="$CPPFLAGS" - if test \! -z "$includedir" ; then - CPPFLAGS="$CPPFLAGS -I$includedir" - fi - CPPFLAGS="$CPPFLAGS $X_CFLAGS" - CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_mongrel "$LINENO" "X11/Xft/Xft.h" "ac_cv_header_X11_Xft_Xft_h" "$ac_includes_default" -if test "x$ac_cv_header_X11_Xft_Xft_h" = xyes; then : - have_xft=yes -fi - - CPPFLAGS="$ac_save_CPPFLAGS" - - CPPFLAGS="$ac_save_xft_CPPFLAGS" - fi - - if test "$have_xft" = yes; then - # we have the headers, now check for the libraries - have_xft=no - xft_halfassed=yes - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for Xft usability..." >&5 -$as_echo "checking for Xft usability..." >&6; } - - ac_save_CPPFLAGS="$CPPFLAGS" - ac_save_LDFLAGS="$LDFLAGS" -# ac_save_LIBS="$LIBS" - - if test \! -z "$includedir" ; then - CPPFLAGS="$CPPFLAGS -I$includedir" - fi - # note: $X_CFLAGS includes $x_includes - CPPFLAGS="$CPPFLAGS $X_CFLAGS" - - if test \! -z "$libdir" ; then - LDFLAGS="$LDFLAGS -L$libdir" - fi - # note: $X_LIBS includes $x_libraries - LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" + ac_save_gdk_pixbuf_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $ac_gdk_pixbuf_config_cflags" - CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XftDrawStringUtf8 in -lc" >&5 -$as_echo_n "checking for XftDrawStringUtf8 in -lc... " >&6; } -if ${ac_cv_lib_c_XftDrawStringUtf8+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lc $ac_xft_config_libs -lX11 -lXext -lm $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + have_gdk_pixbuf=no -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char XftDrawStringUtf8 (); -int -main () -{ -return XftDrawStringUtf8 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_c_XftDrawStringUtf8=yes -else - ac_cv_lib_c_XftDrawStringUtf8=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_XftDrawStringUtf8" >&5 -$as_echo "$ac_cv_lib_c_XftDrawStringUtf8" >&6; } -if test "x$ac_cv_lib_c_XftDrawStringUtf8" = xyes; then : - have_xft=yes + # check for header A... + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + ac_fn_c_check_header_mongrel "$LINENO" "gdk-pixbuf/gdk-pixbuf.h" "ac_cv_header_gdk_pixbuf_gdk_pixbuf_h" "$ac_includes_default" +if test "x$ac_cv_header_gdk_pixbuf_gdk_pixbuf_h" = xyes; then : + have_gdk_pixbuf=yes fi CPPFLAGS="$ac_save_CPPFLAGS" - LDFLAGS="$ac_save_LDFLAGS" -# LIBS="$ac_save_LIBS" - fi + # if that worked, check for header B... + if test "$have_gdk_pixbuf" = yes; then + have_gdk_pixbuf=no + gdk_pixbuf_halfassed=yes - if test "$have_xft" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for Xft usability... no" >&5 -$as_echo "checking for Xft usability... no" >&6; } + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + ac_fn_c_check_header_mongrel "$LINENO" "gdk-pixbuf/gdk-pixbuf-xlib.h" "ac_cv_header_gdk_pixbuf_gdk_pixbuf_xlib_h" "$ac_includes_default" +if test "x$ac_cv_header_gdk_pixbuf_gdk_pixbuf_xlib_h" = xyes; then : + have_gdk_pixbuf=yes + gdk_pixbuf_halfassed=no fi -if test "$have_xft" = yes; then - INCLUDES="$INCLUDES $ac_xft_config_cflags" - XFT_LIBS="$ac_xft_config_libs" - XFT_SRCS='' - XFT_OBJS='' - $as_echo "#define HAVE_XFT 1" >>confdefs.h + CPPFLAGS="$ac_save_CPPFLAGS" -else - XFT_LIBS='' - XFT_SRCS='$(UTILS_SRC)/xft.c' - XFT_OBJS='$(UTILS_BIN)/xft.o' -fi + # yay, it has a new name in Gtk 2.x... + if test "$have_gdk_pixbuf" = no; then + have_gdk_pixbuf=no + gdk_pixbuf_halfassed=yes -# Also check for the standard X11 bitmap fonts, since Debian likes to not -# install any of those by default. The unlock dialog requires them. -# -have_bitmap_fonts=no -ff='helvB14.pcf.gz helvB14-ISO8859-1.pcf.gz' -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for bitmap font files" >&5 -$as_echo_n "checking for bitmap font files... " >&6; } -for d in /usr/share/fonts/X11 \ - /usr/share/X11/fonts \ - /opt/X11/share/fonts \ -; do - for r in 100dpi 75dpi ; do - for f in $ff ; do - if test -f "$d/$r/$f" ; then - have_bitmap_fonts=yes - fi - done - done -done -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_bitmap_fonts" >&5 -$as_echo "$have_bitmap_fonts" >&6; } - -# In case we didn't guess the font directory properly, check RPMs and DEBs too. -if test $have_bitmap_fonts != yes ; then - for r in 100dpi 75dpi ; do - for f in xfonts-$r \ - xorg-x11-fonts-$r \ - xorg-x11-fonts-ISO8859-1-$r \ - ; do - if test $have_bitmap_fonts != yes ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $f" >&5 -$as_echo_n "checking for $f... " >&6; } - if ( rpm -q "$f" 2>&- >&- ) || - ( dpkg -s "$f" 2>&- | grep -q '^Status:.*installed' ) ; then - have_bitmap_fonts=yes - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_bitmap_fonts" >&5 -$as_echo "$have_bitmap_fonts" >&6; } - fi - done - done + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + ac_fn_c_check_header_mongrel "$LINENO" "gdk-pixbuf-xlib/gdk-pixbuf-xlib.h" "ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h" "$ac_includes_default" +if test "x$ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h" = xyes; then : + have_gdk_pixbuf=yes + gdk_pixbuf_halfassed=no fi -############################################################################### -# -# Check for pty support: this allows 'phosphor' and 'apple2' -# to run curses-based programs, or be used as terminal windows. -# -############################################################################### + CPPFLAGS="$ac_save_CPPFLAGS" + fi + fi + CPPFLAGS="$ac_save_gdk_pixbuf_CPPFLAGS" + fi -PTY_LIBS= -for ac_header in pty.h util.h sys/termios.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + if test "$have_gdk_pixbuf" = yes; then + # we have the headers, now check for the libraries + have_gdk_pixbuf=no + gdk_pixbuf_halfassed=yes -fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for gdk_pixbuf usability..." >&5 +$as_echo "checking for gdk_pixbuf usability..." >&6; } -done + # library A... ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -15318,13 +16324,13 @@ done CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lutil" >&5 -$as_echo_n "checking for forkpty in -lutil... " >&6; } -if ${ac_cv_lib_util_forkpty+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_new_from_file in -lc" >&5 +$as_echo_n "checking for gdk_pixbuf_new_from_file in -lc... " >&6; } +if ${ac_cv_lib_c_gdk_pixbuf_new_from_file+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lutil $LIBS" +LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15334,39 +16340,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char forkpty (); +char gdk_pixbuf_new_from_file (); int main () { -return forkpty (); +return gdk_pixbuf_new_from_file (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_util_forkpty=yes + ac_cv_lib_c_gdk_pixbuf_new_from_file=yes else - ac_cv_lib_util_forkpty=no + ac_cv_lib_c_gdk_pixbuf_new_from_file=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_forkpty" >&5 -$as_echo "$ac_cv_lib_util_forkpty" >&6; } -if test "x$ac_cv_lib_util_forkpty" = xyes; then : - PTY_LIBS="-lutil" - ac_have_forkpty=yes - $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h - +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_new_from_file" >&5 +$as_echo "$ac_cv_lib_c_gdk_pixbuf_new_from_file" >&6; } +if test "x$ac_cv_lib_c_gdk_pixbuf_new_from_file" = xyes; then : + have_gdk_pixbuf=yes fi CPPFLAGS="$ac_save_CPPFLAGS" LDFLAGS="$ac_save_LDFLAGS" # LIBS="$ac_save_LIBS" -if test "$ac_have_forkpty" != yes ; then - # we don't need (or have) -lutil on MacOS 10.4.2... + # library B... + if test "$have_gdk_pixbuf" = yes; then + have_gdk_pixbuf=no ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -15386,13 +16390,13 @@ if test "$ac_have_forkpty" != yes ; then CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lc" >&5 -$as_echo_n "checking for forkpty in -lc... " >&6; } -if ${ac_cv_lib_c_forkpty+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_xlib_init in -lc" >&5 +$as_echo_n "checking for gdk_pixbuf_xlib_init in -lc... " >&6; } +if ${ac_cv_lib_c_gdk_pixbuf_xlib_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lc $LIBS" +LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15402,187 +16406,76 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char forkpty (); +char gdk_pixbuf_xlib_init (); int main () { -return forkpty (); +return gdk_pixbuf_xlib_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_c_forkpty=yes + ac_cv_lib_c_gdk_pixbuf_xlib_init=yes else - ac_cv_lib_c_forkpty=no + ac_cv_lib_c_gdk_pixbuf_xlib_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_forkpty" >&5 -$as_echo "$ac_cv_lib_c_forkpty" >&6; } -if test "x$ac_cv_lib_c_forkpty" = xyes; then : - PTY_LIBS="" - $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h - +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_xlib_init" >&5 +$as_echo "$ac_cv_lib_c_gdk_pixbuf_xlib_init" >&6; } +if test "x$ac_cv_lib_c_gdk_pixbuf_xlib_init" = xyes; then : + have_gdk_pixbuf=yes + gdk_pixbuf_halfassed=no fi CPPFLAGS="$ac_save_CPPFLAGS" LDFLAGS="$ac_save_LDFLAGS" # LIBS="$ac_save_LIBS" -fi - -############################################################################### -# -# Query AX_PTHREAD, and figure out which compiler gets used. -# -############################################################################### - -have_pthread=no -with_pthread_req=unspecified - -# AX_PTHREAD is from the GNU Autoconf Archive. -# https://savannah.gnu.org/projects/autoconf-archive/ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_pthread.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) -# -# DESCRIPTION -# -# This macro figures out how to build C programs using POSIX threads. It -# sets the PTHREAD_LIBS output variable to the threads library and linker -# flags, and the PTHREAD_CFLAGS output variable to any special C compiler -# flags that are needed. (The user can also force certain compiler -# flags/libs to be tested by setting these environment variables.) -# -# Also sets PTHREAD_CC to any special C compiler that is needed for -# multi-threaded programs (defaults to the value of CC otherwise). (This -# is necessary on AIX to use the special cc_r compiler alias.) -# -# NOTE: You are assumed to not only compile your program with these flags, -# but also link it with them as well. e.g. you should link with -# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS -# -# If you are only building threads programs, you may wish to use these -# variables in your default LIBS, CFLAGS, and CC: -# -# LIBS="$PTHREAD_LIBS $LIBS" -# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" -# CC="$PTHREAD_CC" -# -# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant -# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name -# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). -# -# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the -# PTHREAD_PRIO_INHERIT symbol is defined when compiling with -# PTHREAD_CFLAGS. -# -# ACTION-IF-FOUND is a list of shell commands to run if a threads library -# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it -# is not found. If ACTION-IF-FOUND is not specified, the default action -# will define HAVE_PTHREAD. -# -# Please let the authors know if this macro fails on any platform, or if -# you have any other suggestions or comments. This macro was based on work -# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help -# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by -# Alejandro Forero Cuervo to the autoconf macro repository. We are also -# grateful for the helpful feedback of numerous users. -# -# Updated for Autoconf 2.68 by Daniel Richard G. -# -# LICENSE -# -# Copyright (c) 2008 Steven G. Johnson -# Copyright (c) 2011 Daniel Richard G. -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 21 - -# This is what autoupdate's m4 run will expand. It fires -# the warning (with _au_warn_XXX), outputs it into the -# updated configure.ac (with AC_DIAGNOSE), and then outputs -# the replacement expansion. - -# This is an auxiliary macro that is also run when -# autoupdate runs m4. It simply calls m4_warning, but -# we need a wrapper so that each warning is emitted only -# once. We break the quoting in m4_warning's argument in -# order to expand this macro's arguments, not AU_DEFUN's. - -# Finally, this is the expansion that is picked up by -# autoconf. It tells the user to run autoupdate, and -# then outputs the replacement expansion. We do not care -# about autoupdate's warning because that contains -# information on what to do *after* running autoupdate. + fi + fi -# This affects CC, LIBS, and CFLAGS, instead of defining new variables. + if test "$have_gdk_pixbuf" = yes; then + INCLUDES="$INCLUDES $ac_gdk_pixbuf_config_cflags" + PNG_LIBS="$ac_gdk_pixbuf_config_libs" + $as_echo "#define HAVE_GDK_PIXBUF 1" >>confdefs.h -# Check whether --with-pthread was given. -if test "${with_pthread+set}" = set; then : - withval=$with_pthread; with_pthread="$withval"; with_pthread_req="$withval" -else - with_pthread=yes -fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for gdk_pixbuf usability... no" >&5 +$as_echo "checking for gdk_pixbuf usability... no" >&6; } + fi -if test "$with_pthread" = yes; then - # AX_PTHREAD might want a different compiler. + if test "$have_gdk_pixbuf" = yes; then -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" -ax_pthread_ok=no + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + # note: $X_CFLAGS includes $x_includes + CPPFLAGS="$CPPFLAGS $X_CFLAGS" -# We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on True64 or Sequent). -# It gets checked for in the link test anyway. + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" -# First of all, check if the user has set any of the PTHREAD_LIBS, -# etcetera environment variables, and if threads linking works using -# them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 -$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_apply_embedded_orientation in -lc" >&5 +$as_echo_n "checking for gdk_pixbuf_apply_embedded_orientation in -lc... " >&6; } +if ${ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -15591,543 +16484,409 @@ $as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD #ifdef __cplusplus extern "C" #endif -char pthread_join (); +char gdk_pixbuf_apply_embedded_orientation (); int main () { -return pthread_join (); +return gdk_pixbuf_apply_embedded_orientation (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ax_pthread_ok=yes + ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation=yes +else + ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 -$as_echo "$ax_pthread_ok" >&6; } - if test x"$ax_pthread_ok" = xno; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" +LIBS=$ac_check_lib_save_LIBS fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" >&5 +$as_echo "$ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" >&6; } +if test "x$ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" = xyes; then : + $as_echo "#define HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION 1" >>confdefs.h -# We must check for the threads library under a number of different -# names; the ordering is very important because some systems -# (e.g. DEC) have both -lpthread and -lpthreads, where one of the -# libraries is broken (non-POSIX). - -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. - -ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" +fi -# The ordering *is* (sometimes) important. Some notes on the -# individual items follow: + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" -# pthreads: AIX (must check this before -lpthread) -# none: in case threads are in libc; should be tried before -Kthread and -# other compiler flags to prevent continual compiler warnings -# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc -# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# ... -mt is also the pthreads flag for HP/aCC -# pthread: Linux, etcetera -# --thread-safe: KAI C++ -# pthread-config: use pthread-config program (for GNU Pth library) + fi +fi -case ${host_os} in - solaris*) +############################################################################### +# +# Check for -lXft +# +############################################################################### - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthreads/-mt/ - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: +have_xutf8drawstring=no - ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" - ;; + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" - darwin*) - ax_pthread_flags="-pthread $ax_pthread_flags" - ;; -esac + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + # note: $X_CFLAGS includes $x_includes + CPPFLAGS="$CPPFLAGS $X_CFLAGS" -# Clang doesn't consider unrecognized options an error unless we specify -# -Werror. We throw in some extra Clang-specific options to ensure that -# this doesn't happen for GCC, which also accepts -Werror. + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler needs -Werror to reject unknown flags" >&5 -$as_echo_n "checking if compiler needs -Werror to reject unknown flags... " >&6; } -save_CFLAGS="$CFLAGS" -ax_pthread_extra_flags="-Werror" -CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xutf8DrawString in -lX11" >&5 +$as_echo_n "checking for Xutf8DrawString in -lX11... " >&6; } +if ${ac_cv_lib_X11_Xutf8DrawString+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lX11 -lX11 -lXext -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -int foo(void); + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char Xutf8DrawString (); int main () { -foo() +return Xutf8DrawString (); ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_X11_Xutf8DrawString=yes else - ax_pthread_extra_flags= - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + ac_cv_lib_X11_Xutf8DrawString=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -CFLAGS="$save_CFLAGS" +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_Xutf8DrawString" >&5 +$as_echo "$ac_cv_lib_X11_Xutf8DrawString" >&6; } +if test "x$ac_cv_lib_X11_Xutf8DrawString" = xyes; then : + have_xutf8drawstring=yes +else + true +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" -if test x"$ax_pthread_ok" = xno; then -for flag in $ax_pthread_flags; do +if test "$have_xutf8drawstring" = yes ; then + $as_echo "#define HAVE_XUTF8DRAWSTRING 1" >>confdefs.h - case $flag in - none) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 -$as_echo_n "checking whether pthreads work without any flags... " >&6; } - ;; +fi - -*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 -$as_echo_n "checking whether pthreads work with $flag... " >&6; } - PTHREAD_CFLAGS="$flag" - ;; +have_xft=no +with_xft_req=unspecified +xft_halfassed=no - pthread-config) - # Extract the first word of "pthread-config", so it can be a program name with args. -set dummy pthread-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ax_pthread_config+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ax_pthread_config"; then - ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. +# Check whether --with-xft was given. +if test "${with_xft+set}" = set; then : + withval=$with_xft; with_xft="$withval"; with_xft_req="$withval" else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ax_pthread_config="yes" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + with_xft=yes +fi + + case "$with_xft" in + yes) ;; + no) ;; + + /*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft headers" >&5 +$as_echo_n "checking for Xft headers... " >&6; } + d=$with_xft/include + if test -d $d; then + X_CFLAGS="-I$d $X_CFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft libs" >&5 +$as_echo_n "checking for Xft libs... " >&6; } + d=$with_xft/lib + if test -d $d; then + X_LIBS="-L$d $X_LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 +$as_echo "$d" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 +$as_echo "not found ($d: no such directory)" >&6; } + fi + + # replace the directory string with "yes". + with_xft_req="yes" + with_xft=$with_xft_req + ;; + + *) + echo "" + echo "error: argument to --with-xft must be \"yes\", \"no\", or a directory." + echo " If it is a directory, then \`DIR/include' will be added to" + echo " the -I list, and \`DIR/lib' will be added to the -L list." + exit 1 + ;; + esac + +if test "$with_xft" != yes -a "$with_xft" != no ; then + echo "error: must be yes or no: --with-xft=$with_xft" + exit 1 +fi + +if test "$with_xft" = yes; then + + pkgs='' + ok="yes" + pkg_check_version xft 2.1.0 + have_xft="$ok" - test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" -fi + if test "$have_xft" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft includes" >&5 +$as_echo_n "checking for Xft includes... " >&6; } +if ${ac_cv_xft_config_cflags+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_xft_config_cflags=`$pkg_config --cflags $pkgs` fi -ax_pthread_config=$ac_cv_prog_ax_pthread_config -if test -n "$ax_pthread_config"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 -$as_echo "$ax_pthread_config" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_xft_config_cflags" >&5 +$as_echo "$ac_cv_xft_config_cflags" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft libs" >&5 +$as_echo_n "checking for Xft libs... " >&6; } +if ${ac_cv_xft_config_libs+:} false; then : + $as_echo_n "(cached) " >&6 else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + ac_cv_xft_config_libs=`$pkg_config --libs $pkgs` fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_xft_config_libs" >&5 +$as_echo "$ac_cv_xft_config_libs" >&6; } + fi - if test x"$ax_pthread_config" = xno; then continue; fi - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; + ac_xft_config_cflags=$ac_cv_xft_config_cflags + ac_xft_config_libs=$ac_cv_xft_config_libs - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 -$as_echo_n "checking for the pthreads library -l$flag... " >&6; } - PTHREAD_LIBS="-l$flag" - ;; - esac + if test "$have_xft" = yes; then + # + # we appear to have Xft; check for headers/libs to be sure. + # + ac_save_xft_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $ac_xft_config_cflags" - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags" + have_xft=no - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - static void routine(void *a) { a = 0; } - static void *start_routine(void *a) { return a; } -int -main () -{ -pthread_t th; pthread_attr_t attr; - pthread_create(&th, 0, start_routine, 0); - pthread_join(th, 0); - pthread_attr_init(&attr); - pthread_cleanup_push(routine, 0); - pthread_cleanup_pop(0) /* ; */ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ax_pthread_ok=yes + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + ac_fn_c_check_header_mongrel "$LINENO" "X11/Xft/Xft.h" "ac_cv_header_X11_Xft_Xft_h" "$ac_includes_default" +if test "x$ac_cv_header_X11_Xft_Xft_h" = xyes; then : + have_xft=yes fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 -$as_echo "$ax_pthread_ok" >&6; } - if test "x$ax_pthread_ok" = xyes; then - break; - fi + CPPFLAGS="$ac_save_CPPFLAGS" - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi + CPPFLAGS="$ac_save_xft_CPPFLAGS" + fi -# Various other checks: -if test "x$ax_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + if test "$have_xft" = yes; then + # we have the headers, now check for the libraries + have_xft=no + xft_halfassed=yes - # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 -$as_echo_n "checking for joinable pthread attribute... " >&6; } - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -int attr = $attr; return attr /* ; */ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - attr_name=$attr; break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 -$as_echo "$attr_name" >&6; } - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for Xft usability..." >&5 +$as_echo "checking for Xft usability..." >&6; } -cat >>confdefs.h <<_ACEOF -#define PTHREAD_CREATE_JOINABLE $attr_name -_ACEOF + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" - fi + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + # note: $X_CFLAGS includes $x_includes + CPPFLAGS="$CPPFLAGS $X_CFLAGS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 -$as_echo_n "checking if more special flags are required for pthreads... " >&6; } - flag=no - case ${host_os} in - aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; - osf* | hpux*) flag="-D_REENTRANT";; - solaris*) - if test "$GCC" = "yes"; then - flag="-D_REENTRANT" - else - # TODO: What about Clang on Solaris? - flag="-mt -D_REENTRANT" - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag" >&5 -$as_echo "$flag" >&6; } - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 -$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; } -if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then : + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XftDrawStringUtf8 in -lc" >&5 +$as_echo_n "checking for XftDrawStringUtf8 in -lc... " >&6; } +if ${ac_cv_lib_c_XftDrawStringUtf8+:} false; then : $as_echo_n "(cached) " >&6 else - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $ac_xft_config_libs -lX11 -lXext -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XftDrawStringUtf8 (); int main () { -int i = PTHREAD_PRIO_INHERIT; +return XftDrawStringUtf8 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ax_cv_PTHREAD_PRIO_INHERIT=yes + ac_cv_lib_c_XftDrawStringUtf8=yes else - ax_cv_PTHREAD_PRIO_INHERIT=no + ac_cv_lib_c_XftDrawStringUtf8=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext - +LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 -$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } - if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"; then : - -$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h - +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_XftDrawStringUtf8" >&5 +$as_echo "$ac_cv_lib_c_XftDrawStringUtf8" >&6; } +if test "x$ac_cv_lib_c_XftDrawStringUtf8" = xyes; then : + have_xft=yes fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" - # More AIX lossage: compile with *_r variant - if test "x$GCC" != xyes; then - case $host_os in - aix*) - case "x/$CC" in #( - x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : - #handle absolute path differently from PATH based program lookup - case "x$CC" in #( - x/*) : - if as_fn_executable_p ${CC}_r; then : - PTHREAD_CC="${CC}_r" -fi ;; #( - *) : - for ac_prog in ${CC}_r -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_PTHREAD_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$PTHREAD_CC"; then - ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_PTHREAD_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 fi -done - done -IFS=$as_save_IFS - -fi -fi -PTHREAD_CC=$ac_cv_prog_PTHREAD_CC -if test -n "$PTHREAD_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 -$as_echo "$PTHREAD_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - test -n "$PTHREAD_CC" && break -done -test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" - ;; -esac ;; #( - *) : - ;; -esac - ;; - esac - fi -fi - -test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" - -# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$ax_pthread_ok" = xyes; then - if test "$CC" = "$PTHREAD_CC" -o -z "$ac_original_cc"; then - have_pthread=yes - else - ac_prog_cc_no_pthread=yes - fi - - : -else - ax_pthread_ok=no -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test "$have_xft" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for Xft usability... no" >&5 +$as_echo "checking for Xft usability... no" >&6; } + fi +fi - if test "$have_pthread" = yes; then - $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h +if test "$have_xft" = yes; then + INCLUDES="$INCLUDES $ac_xft_config_cflags" + XFT_LIBS="$ac_xft_config_libs" + XFT_SRCS='' + XFT_OBJS='' + $as_echo "#define HAVE_XFT 1" >>confdefs.h - CC=$PTHREAD_CC - fi +else + XFT_LIBS='' + XFT_SRCS='$(UTILS_SRC)/xft.c' + XFT_OBJS='$(UTILS_BIN)/xft.o' fi ############################################################################### # -# Check for libcap, which allows "sonar" to work without setuid. +# Check for pty support: this allows 'phosphor' and 'apple2' +# to run curses-based programs, or be used as terminal windows. # ############################################################################### -have_libcap=no -setcap_hacks_default=yes -setcap_hacks="$setcap_hacks_default" -setcap_hacks_req=unspecified +PTY_LIBS= +for ac_header in pty.h util.h sys/termios.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF -# Check whether --with-setcap-hacks was given. -if test "${with_setcap_hacks+set}" = set; then : - withval=$with_setcap_hacks; setcap_hacks="$withval"; setcap_hacks_req="$withval" -else - setcap_hacks=yes fi - case "$setcap_hacks" in - yes) ;; - no) ;; - - /*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setcap hacks headers" >&5 -$as_echo_n "checking for setcap hacks headers... " >&6; } - d=$setcap_hacks/include - if test -d $d; then - X_CFLAGS="-I$d $X_CFLAGS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 -$as_echo "$d" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 -$as_echo "not found ($d: no such directory)" >&6; } - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setcap hacks libs" >&5 -$as_echo_n "checking for setcap hacks libs... " >&6; } - d=$setcap_hacks/lib - if test -d $d; then - X_LIBS="-L$d $X_LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 -$as_echo "$d" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 -$as_echo "not found ($d: no such directory)" >&6; } - fi - - # replace the directory string with "yes". - setcap_hacks_req="yes" - setcap_hacks=$setcap_hacks_req - ;; +done - *) - echo "" - echo "error: argument to --with-setcap-hacks must be \"yes\", \"no\", or a directory." - echo " If it is a directory, then \`DIR/include' will be added to" - echo " the -I list, and \`DIR/lib' will be added to the -L list." - exit 1 - ;; - esac + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" -if test "$setcap_hacks" != yes -a "$setcap_hacks" != no ; then - echo "error: must be yes or no: --with-setcap-hacks=$setcap_hacks" - exit 1 -fi + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + # note: $X_CFLAGS includes $x_includes + CPPFLAGS="$CPPFLAGS $X_CFLAGS" -if test "$setcap_hacks" = yes; then + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" - for ac_prog in setcap -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_setcap_program+:} false; then : + CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` + LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lutil" >&5 +$as_echo_n "checking for forkpty in -lutil... " >&6; } +if ${ac_cv_lib_util_forkpty+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$setcap_program"; then - ac_cv_prog_setcap_program="$setcap_program" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_setcap_program="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + ac_check_lib_save_LIBS=$LIBS +LIBS="-lutil $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -fi -fi -setcap_program=$ac_cv_prog_setcap_program -if test -n "$setcap_program"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $setcap_program" >&5 -$as_echo "$setcap_program" >&6; } +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char forkpty (); +int +main () +{ +return forkpty (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_util_forkpty=yes else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + ac_cv_lib_util_forkpty=no fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_forkpty" >&5 +$as_echo "$ac_cv_lib_util_forkpty" >&6; } +if test "x$ac_cv_lib_util_forkpty" = xyes; then : + PTY_LIBS="-lutil" + ac_have_forkpty=yes + $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h - test -n "$setcap_program" && break -done - - if test "$setcap_program" != ''; then - - ac_save_CPPFLAGS="$CPPFLAGS" - if test \! -z "$includedir" ; then - CPPFLAGS="$CPPFLAGS -I$includedir" - fi - CPPFLAGS="$CPPFLAGS $X_CFLAGS" - CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_mongrel "$LINENO" "sys/capability.h" "ac_cv_header_sys_capability_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_capability_h" = xyes; then : - have_setcap=yes fi CPPFLAGS="$ac_save_CPPFLAGS" - fi - if test "$have_setcap" = yes; then + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" + +if test "$ac_have_forkpty" != yes ; then + # we don't need (or have) -lutil on macOS 10.4.2... ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" @@ -16147,13 +16906,13 @@ fi CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cap_set_flag in -lcap" >&5 -$as_echo_n "checking for cap_set_flag in -lcap... " >&6; } -if ${ac_cv_lib_cap_cap_set_flag+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lc" >&5 +$as_echo_n "checking for forkpty in -lc... " >&6; } +if ${ac_cv_lib_c_forkpty+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lcap $LIBS" +LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -16163,31 +16922,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char cap_set_flag (); +char forkpty (); int main () { -return cap_set_flag (); +return forkpty (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_cap_cap_set_flag=yes + ac_cv_lib_c_forkpty=yes else - ac_cv_lib_cap_cap_set_flag=no + ac_cv_lib_c_forkpty=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cap_cap_set_flag" >&5 -$as_echo "$ac_cv_lib_cap_cap_set_flag" >&6; } -if test "x$ac_cv_lib_cap_cap_set_flag" = xyes; then : - have_libcap=yes - PROG_SETCAP="$setcap_program" - LIBCAP_LIBS="-lcap" - $as_echo "#define HAVE_LIBCAP 1" >>confdefs.h +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_forkpty" >&5 +$as_echo "$ac_cv_lib_c_forkpty" >&6; } +if test "x$ac_cv_lib_c_forkpty" = xyes; then : + PTY_LIBS="" + $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h fi @@ -16195,13 +16952,51 @@ fi LDFLAGS="$ac_save_LDFLAGS" # LIBS="$ac_save_LIBS" - fi fi ############################################################################### # -# Option to prevent "sonar" from working properly. -# It must be setuid on systems without libcap. +# Check for libcap, which allows "sonar" to work without setuid. +# Except, nevermind, that's bad. See comments in sonar-icmp.c. +# +############################################################################### + +have_libcap=no +setcap_hacks_default=no +setcap_hacks="$setcap_hacks_default" +setcap_hacks_req=unspecified + +#AC_ARG_WITH(setcap-hacks, +#[ --with-setcap-hacks Build the "sonar" demo with libcap, which allows +# it to ping other hosts without being setuid.], +# [setcap_hacks="$withval"; setcap_hacks_req="$withval"], +# [setcap_hacks=yes]) +# +#HANDLE_X_PATH_ARG(setcap_hacks, --with-setcap-hacks, setcap hacks) +# +#if test "$setcap_hacks" != yes -a "$setcap_hacks" != no ; then +# echo "error: must be yes or no: --with-setcap-hacks=$setcap_hacks" +# exit 1 +#fi +# +#if test "$setcap_hacks" = yes; then +# +# AC_CHECK_PROGS(setcap_program, setcap) +# if test "$setcap_program" != ''; then +# AC_CHECK_X_HEADER(sys/capability.h, [have_setcap=yes]) +# fi +# if test "$have_setcap" = yes; then +# AC_CHECK_X_LIB(cap, cap_set_flag, +# [have_libcap=yes +# PROG_SETCAP="$setcap_program" +# LIBCAP_LIBS="-lcap" +# AC_DEFINE(HAVE_LIBCAP)]) +# fi +#fi + +############################################################################### +# +# Sonar must be setuid to be able to ping other hosts. # ############################################################################### @@ -16371,11 +17166,11 @@ fi PREFERRED_DEMO_PROGRAM='' ALL_DEMO_PROGRAMS= if test "$have_motif" = yes; then - PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Xm + PREFERRED_DEMO_PROGRAM=xscreensaver-settings-Xm ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS" fi if test "$have_gtk" = yes; then - PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Gtk + PREFERRED_DEMO_PROGRAM=xscreensaver-settings-Gtk ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS" fi @@ -16393,10 +17188,10 @@ if test "$enable_pam_check_account_type" = yes; then else COMMENT_PAM_CHECK_ACCOUNT="#" fi -if test "$have_passwd_helper" = yes; then - PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)" - PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)" -fi +#if test "$have_passwd_helper" = yes; then +# PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)" +# PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)" +#fi PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)" PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)" @@ -16418,12 +17213,10 @@ else MEN_OSX= fi -INSTALL_SETUID='$(INSTALL_PROGRAM) $(SUID_FLAGS)' - -if test "$need_setuid" = yes; then - NEED_SETUID=yes +if test "$setuid_auth" = yes; then + SETUID_AUTH=yes else - NEED_SETUID=no + SETUID_AUTH=no fi if test "$setuid_hacks" = yes; then @@ -16503,6 +17296,7 @@ $as_echo "$PO_DATADIR/locale" >&6; } # canonicalize slashes. HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'` +FONT_DIR=`echo "${FONT_DIR}" | sed 's@/$@@;s@//*@/@g'` # gcc 3.0 likes to issue this warning for every file: # @@ -16522,7 +17316,7 @@ INCLUDES=`echo "$INCLUDES" | sed 's@ -I${prefix}/include@@g;'` APPDEFAULTS=$ac_x_app_defaults -ac_config_files="$ac_config_files Makefile utils/Makefile jwxyz/Makefile hacks/Makefile hacks/images/Makefile hacks/glx/Makefile po/Makefile.in driver/Makefile driver/xscreensaver.pam driver/XScreenSaver.ad" +ac_config_files="$ac_config_files Makefile utils/Makefile jwxyz/Makefile hacks/Makefile hacks/fonts/Makefile hacks/images/Makefile hacks/glx/Makefile po/Makefile.in driver/Makefile driver/xscreensaver.pam driver/XScreenSaver.ad" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -17218,6 +18012,7 @@ do "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;; "jwxyz/Makefile") CONFIG_FILES="$CONFIG_FILES jwxyz/Makefile" ;; "hacks/Makefile") CONFIG_FILES="$CONFIG_FILES hacks/Makefile" ;; + "hacks/fonts/Makefile") CONFIG_FILES="$CONFIG_FILES hacks/fonts/Makefile" ;; "hacks/images/Makefile") CONFIG_FILES="$CONFIG_FILES hacks/images/Makefile" ;; "hacks/glx/Makefile") CONFIG_FILES="$CONFIG_FILES hacks/glx/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; @@ -17920,6 +18715,14 @@ if test "$with_xdbe_req" = yes -a "$have_xdbe" = no ; then warn 'The DOUBLE-BUFFER extension was requested, but was not found.' fi +#if test "$with_xcomposite_req" = yes -a "$have_xcomposite" = no ; then +# warn 'The XCOMPOSITE extension was requested, but was not found.' +#fi + +if test "$with_xkb_req" = yes -a "$have_xkb" = no ; then + warn 'The X Keyboard extension was requested, but was not found.' +fi + if test "$with_sgivc_req" = yes -a "$have_sgivc" = no ; then warn 'The SGI-VIDEO-CONTROL extension was requested, but was not found.' fi @@ -17959,21 +18762,13 @@ else fi if test "$gtk_halfassed" != no ; then - warnL "GTK version $gtk_halfassed was found, but at least one supporting" - warn2 "library ($gtk_halfassed_lib) was not, so GTK can't be used." - warn2 "Perhaps some of the development packages are not installed?" - if test "$have_gtk" = yes ; then - v="$ac_gtk_version_string" - warn2 "GTK $v is also installed, so it will be used instead." - warn2 "Please read the above output and the \`config.log' file" - warn2 "for more details." - fi + warnL "GTK was found, but $gtk_halfassed_lib was not, so GTK can't be used." fi motif_warn2() { warn2 'Though the Motif front-end to xscreensaver is still' warn2 'maintained, it is no longer being updated with new' - warn2 'features: all new development on the xscreensaver-demo' + warn2 'features: all new development on the xscreensaver-settings' warn2 'program is happening in the GTK version, and not in the' warn2 'Motif version. It is recommended that you build against' warn2 'GTK instead of Motif. See .' @@ -17983,12 +18778,12 @@ if test "$have_motif" = no -a "$have_gtk" = no; then if test "$with_motif" = yes; then warnL "Neither the GTK nor Motif libraries were found; the" - warn2 "\`xscreensaver-demo' program requires one of these." + warn2 "\`xscreensaver-settings' program requires one of these." echo '' motif_warn2 else warnL "The GTK libraries do not seem to be available; the" - warn2 "\`xscreensaver-demo' program requires them." + warn2 "\`xscreensaver-settings' program requires them." # echo '' # warn2 'You can use Motif or Lesstif instead of GTK (use the' # warn2 "\`--with-motif' option) but that is NOT recommended." @@ -17999,25 +18794,14 @@ elif test "$with_motif_req" = yes -a "$have_motif" = no ; then warnL "Use of Motif was requested, but it wasn't found;" warn2 "Gtk will be used instead." -elif test "$jurassic_gtk" = yes ; then - - pref_gtk=2.0 - - v="$ac_gtk_version_string" - if test "$with_gtk_req" = yes -a "$ac_gtk_version" = "unknown" ; then - warnL "Use of Gtk was requested, but its version number is unknown;" - elif test "$with_gtk_req" = yes ; then - warnL "Use of Gtk was requested, but it is version $v;" - else - warnL "Gtk was found on this system, but it is version $v;" - fi - - warn2 "Gtk $pref_gtk or newer is required." - elif test "$with_gtk_req" = yes -a "$have_gtk" = no ; then warnL "Use of Gtk was requested, but it wasn't found." fi +if test "$ac_cv_libxt" != yes ; then + warnL 'The Xt library was not found. It is required.' +fi + if test "$have_gtk" = yes -a "$have_gdk_pixbuf" = no ; then warn "GTK is being used, but the GDK-Pixbuf library and/or" warn2 "headers were not found. That can't be good. Please" @@ -18048,6 +18832,12 @@ if test "$have_motif" = yes -a "$have_gtk" = no ; then motif_warn2 fi +halfassery() { + echo '' + warn2 "More specifically, we found the headers but not the" + warn2 "libraries. Possibly a 'devel' package is needed." +} + if test "$with_gdk_pixbuf_req" = yes -a "$have_gdk_pixbuf" = no; then warnL 'Use of GDK-Pixbuf was requested, but it was not found.' fi @@ -18063,14 +18853,7 @@ if test "$have_gdk_pixbuf" = no -o "$gdk_pixbuf_halfassed" = yes || \ warnL 'The GDK-Pixbuf library was not found.' fi - if test "$gdk_pixbuf_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'libraries; so either GDK-Pixbuf is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' - fi - + if test "$gdk_pixbuf_halfassed" = yes ; then halfassery ; fi if test "$have_png" = yes ; then echo '' warn2 'The PNG library is being used instead.' @@ -18086,21 +18869,14 @@ if test "$have_jpeg" = no ; then if test "$with_jpeg_req" = yes ; then warnL 'Use of libjpeg was requested, but it was not found.' elif test "$with_jpeg_req" = no ; then - noteL 'The JPEG library is not being used.' + warnL 'The JPEG library is not being used.' else - noteL 'The JPEG library was not found.' - fi - - if test "$jpeg_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'library; so either JPEG is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' - echo '' + warnL 'The JPEG library was not found.' fi + if test "$jpeg_halfassed" = yes ; then halfassery ; fi if test "$have_gdk_pixbuf" = no ; then + echo '' warn2 "This means that it won't be possible for the image-manipulating" warn2 "display modes to load files from disk; and it also means that" warn2 "the \`webcollage' program will be much slower." @@ -18113,48 +18889,23 @@ if test "$have_png" = no ; then if test "$with_png_req" = yes ; then warnL 'Use of libpng was requested, but it was not found.' elif test "$with_png_req" = no ; then - noteL 'The PNG library is not being used.' + warnL 'The PNG library is not being used.' else - noteL 'The PNG library was not found.' - fi - - if test "$png_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'library; so either PNG is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' - echo '' + warnL 'The PNG library was not found.' fi + if test "$png_halfassed" = yes ; then halfassery ; fi warn2 "Many things aren't going to work right." fi -if test "$have_xft" = no ; then - if test "$with_xft_req" = yes ; then - warnL "Use of libXft was requested, but it was not found." - elif test "$with_xft_req" = no ; then - noteL 'The Xft library is not being used.' - else - noteL "The Xft library was not found." - fi - - if test "$xft_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'libraries; so either Xft is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' - echo '' - fi - - warn2 "This means that fonts won't be anti-aliased." +if test "$have_xinput" = no ; then + warnL 'The XInput2 library was not found. It is required.' + if test "$xinput_halfassed" = yes ; then halfassery ; else echo '' ; fi fi -if test "$have_bitmap_fonts" = no ; then - warnL 'The standard bitmap fonts do not seem to be installed.' - warn2 'That is not going to work out well for you.' - warn2 'Install "xfonts-100dpi" or "xorg-x11-fonts-100dpi".' +if test "$have_xft" = no ; then + warnL 'The XFreeType library was not found. It is required.' + if test "$xft_halfassed" = yes ; then halfassery ; else echo '' ; fi fi if test "$have_systemd" = no ; then @@ -18176,12 +18927,7 @@ if test "$have_systemd" = no ; then fi if test "$systemd_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'libraries; so either systemd is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' - echo '' + halfassery systemd_warned=yes fi @@ -18194,28 +18940,6 @@ if test "$have_systemd" = no ; then fi fi -if test "$have_gl" = yes -a "$ac_have_mesa_gl" = yes ; then - preferred_mesagl=3.4 - mgv="$ac_mesagl_version_string" - pgl="$preferred_mesagl" - - if test "$ac_mesagl_version" = unknown; then - true - # warnL "Unable to determine the MesaGL version number!" - # warn2 "Make sure you are using version $preferred_mesagl or newer." - - elif test \! "$ac_mesagl_version" -gt 2006; then - warnL "MesaGL version number is $mgv --" - warn2 "MesaGL 2.6 and earlier have a security bug. It is strongly" - warn2 "recommended that you upgrade to at least version $preferred_mesagl." - - elif test \! "$ac_mesagl_version" -gt 3003; then - warnL "MesaGL version number is $mgv --" - warn2 "MesaGL 3.3 and earlier have some bugs; it is recommended" - warn2 "that you upgrade to $pgl or newer." - fi -fi - if test "$have_gl" = no ; then if test "$with_gl_req" = yes ; then warnL 'Use of GL was requested, but it was not found.' @@ -18226,11 +18950,11 @@ if test "$have_gl" = no ; then fi if test "$gl_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'libraries; so either GL is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' + halfassery + if test "$have_glx" = no -a "$have_egl" = no; then + echo '' + warn2 'Neither EGL nor GLX were found.' + fi fi echo '' @@ -18258,13 +18982,7 @@ if test "$have_gl" = yes -a "$have_gle" = no ; then warn2 'library was not.' fi - if test "$gle_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'libraries; so either GLE is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' - fi + if test "$gle_halfassed" = yes ; then halfassery ; fi echo '' warn2 'Some of the OpenGL (3D) demos (those that depend on GLE)' @@ -18285,6 +19003,12 @@ fi if test "$with_pam_req" = yes -a "$have_pam" = no ; then warn 'Use of PAM was requested, but it was not found.' +elif test "$have_pam" = no ; then + if test -d /etc/pam.d -o -f /etc/pam.conf ; then + warn "Your system seems to have PAM, but PAM is not being used." + warn2 "That is probably not going to work out well." + + fi fi if test "$with_shadow_req" = yes -a "$have_shadow" = no ; then @@ -18295,27 +19019,34 @@ if test "$setcap_hacks_req" = yes -a "$have_libcap" = no ; then warn 'Use of libcap was requested, but it was not found.' fi -if test "$ac_macosx" = yes ; then - if test "$enable_locking" = yes ; then - warn "You have specified --enable-locking on MacOS X." - warn2 "THIS DOES NOT WORK! Don't do this!" - fi +if test "$ac_macosx" = yes -a "$enable_locking" = yes ; then + warn "You have specified --enable-locking on macOS." + warn2 "THIS DOES NOT WORK! Don't do this!" fi # You are in a twisty maze of namespaces and syntaxes, all alike. +# Expand all of these as the Makefile will probably expand them. # Fuck the skull of Unix. # bindir=`eval eval eval eval eval eval eval echo $bindir` HACKDIR=`eval eval eval eval eval eval eval echo $HACKDIR` HACK_CONF_DIR=`eval eval eval eval eval eval eval echo $HACK_CONF_DIR` +FONT_DIR=`eval eval eval eval eval eval eval echo $FONT_DIR` # canonicalize slashes. bindir=`echo "${bindir}" | sed 's@/$@@;s@//*@/@g'` HACKDIR=`echo "${HACKDIR}" | sed 's@/$@@;s@//*@/@g'` HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'` +FONT_DIR=`echo "${FONT_DIR}" | sed 's@/$@@;s@//*@/@g'` + +if test -z "$FONT_DIR" ; then + FONT_DIR='not installed'; +else + FONT_DIR="${FONT_DIR}/" +fi # Sanity check the hackdir -for bad_choice in xscreensaver xscreensaver-demo xscreensaver-command ; do +for bad_choice in xscreensaver xscreensaver-settings xscreensaver-command ; do if test "${HACKDIR}" = "${bindir}/${bad_choice}" ; then echo "" as_fn_error $? "\"--with-hackdir=${bindir}/${bad_choice}\" won't work. @@ -18325,96 +19056,98 @@ for bad_choice in xscreensaver xscreensaver-demo xscreensaver-command ; do fi done -# Now let's warn if there's a previous RPM version already installed. -# But don't bother with this test if we are currently *building* an RPM. +# Warn if there's a previous RPM package installed. +rpm_vers= if test -z "$RPM_PACKAGE_VERSION" ; then - - rpmnames="xscreensaver xscreensaver-base xscreensaver-extras" + # Don't bother with this test if we are currently *building* an RPM. + rpmnames="xscreensaver xscreensaver-base xscreensaver-extras + xscreensaver-data xscreensaver-data-extra" # M4 sucks!! - rpmv=`(rpm -qv $rpmnames) 2>/dev/null | \ - sed -n 's/^[-a-z]*-\([0-9][0-9]*[.][0-9][0-9a-z]*\)-.*$/\1/p' | \ - head -1` - - if test \! -z "$rpmv" ; then - - # M4 sucks!! + pkg_vers=`(rpm -qv $rpmnames) 2>&- | \ + sed -n 's/^[-a-z]*-\([0-9][0-9]*[.].*\)/\1/p' | head -1` + rpm_vers="$pkg_vers" - rpmbdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'` - rpmhdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares$@\1@p'` - rpmcdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'` - rpmadir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)XScreenSaver$@\1@p'` +fi - err=" (DIFFERS)" - if test -z "$rpmbdir" ; then rpmbdir='???' - elif test "$rpmbdir" != "${bindir}/" ; then rpmbdir="$rpmbdir$err";fi +if test \! -z "$rpm_vers" ; then - if test -z "$rpmhdir" ; then rpmhdir='???' - elif test "$rpmhdir" != "${HACKDIR}/" ; then rpmhdir="$rpmhdir$err";fi + # M4 sucks!! - if test -z "$rpmcdir" ; then rpmcdir='???' - elif test "$rpmcdir" != "${HACK_CONF_DIR}/"; then rpmcdir="$rpmcdir$err";fi + pkg_bindir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)xscreensaver-settings$@\1@p'` + pkg_bindir2=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'` + pkg_hackdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares$@\1@p'` + pkg_confdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'` + pkg_fontdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)\.ttf$@\1@p'` + pkg_addir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)XScreenSaver$@\1@p'` - if test -z "$rpmadir" ; then rpmadir='???' - elif test "$rpmadir" != "${APPDEFAULTS}/" ; then rpmadir="$rpmadir$err";fi + if test -z "$pkg_bindir" ; then pkg_bindir="$pkg_bindir2" ; fi - warning=no - warnL "There is already an installed RPM of xscreensaver" - warn2 "version \"$rpmv\" on this system." - echo "" - warn2 "It is currently installed in these directories:" - echo "" - warn2 "User programs: $rpmbdir$berr" - warn2 "Screen savers: $rpmhdir$herr" - warn2 "Configuration: $rpmcdir$cerr" - warn2 "App Defaults: $rpmadir$aerr" - fi fi -# Also warn if there's a Debian package installed. +# Warn if there's a previous Debian package installed. # -debnames="xscreensaver xscreensaver-data xscreensaver-data-extra" -debv='' -for dpkg in $debnames ; do - if test -z "$debv"; then - debv=`dpkg -s $dpkg 2>/dev/null | sed -n 's/^Version: \(.*\)$/\1/p'` - fi -done +deb_vers= +if test -z "$pkg_vers" ; then + debnames="xscreensaver xscreensaver-data xscreensaver-data-extra" + pkg_vers='' + for dpkg in $debnames ; do + if test -z "$pkg_vers"; then + pkg_vers=`dpkg -s $dpkg 2>/dev/null | sed -n 's/^Version: \(.*\)$/\1/p'` + deb_vers="$pkg_vers" + fi + done +fi -if test \! -z "$debv" ; then +if test \! -z "$deb_vers" ; then # M4 sucks!! - debbdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/bin/\)xscreensaver$@\1@p'` - debhdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares$@\1@p'` - debcdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'` - debadir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)XScreenSaver[^/]*$@\1@p'` + pkg_bindir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)xscreensaver-settings$@\1@p'` + pkg_bindir2=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'` + pkg_hackdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares$@\1@p'` + pkg_confdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'` + pkg_fontdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)\.ttf$@\1@p'` + pkg_addir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)XScreenSaver[^/]*$@\1@p'` + + if test -z "$pkg_bindir" ; then pkg_bindir="$pkg_bindir2" ; fi +fi + +bindir_err= +hackdir_err= +confdir_err= +fontdir_err= +addir_err= +if ! test -z "$pkg_vers" ; then err=" (DIFFERS)" - if test -z "$debbdir" ; then debbdir='???' - elif test "$debbdir" != "${bindir}/" ; then debbdir="$debbdir$err"; fi - if test -z "$debhdir" ; then debhdir='???' - elif test "$debhdir" != "${HACKDIR}/" ; then debhdir="$debhdir$err"; fi + if test -z "$pkg_bindir" ; then pkg_bindir='???' + elif test "$pkg_bindir" != "${bindir}/" ; then bindir_err="$err" ; fi + + if test -z "$pkg_hackdir" ; then pkg_hackdir='???' + elif test "$pkg_hackdir" != "${HACKDIR}/" ; then hackdir_err="$err"; fi - if test -z "$debcdir" ; then debcdir='???' - elif test "$debcdir" != "${HACK_CONF_DIR}/" ; then debcdir="$debcdir$err"; fi + if test -z "$pkg_confdir" ; then pkg_confdir='???' + elif test "$pkg_confdir" != "${HACK_CONF_DIR}/" ; then confdir_err="$err"; fi - if test -z "$debadir" ; then debadir='???' - elif test "$debadir" != "${APPDEFAULTS}/" ; then debadir="$debadir$err"; fi + if test -z "$pkg_fontdir" ; then pkg_fontdir='none' + elif test "$pkg_fontdir/" != "${FONT_DIR}" ; then fontdir_err="$err"; fi + + if test -z "$pkg_addir" ; then pkg_addir='???' + elif test "$pkg_addir" != "${APPDEFAULTS}/" ; then addir_err="$err" ; fi warning=no - warnL "There is already an installed dpkg of xscreensaver" - warn2 "version \"$debv\" on this system." - echo "" - warn2 "It is currently installed in these directories:" + warnL "There is already an installed package of xscreensaver" + warn2 "version \"$pkg_vers\", in these directories:" echo "" - warn2 "User programs: $debbdir$berr" - warn2 "Screen savers: $debhdir$herr" - warn2 "Configuration: $debcdir$cerr" - warn2 "App Defaults: $debadir$aerr" + warn2 "User programs: $pkg_bindir$bindir_err" + warn2 "Screen savers: $pkg_hackdir$hackdir_err" + warn2 "Configuration: $pkg_confdir$confdir_err" + warn2 "Extra fonts: $pkg_fontdir$fontdir_err" + warn2 "App Defaults: $pkg_addir$addir_err" fi echo "" @@ -18422,8 +19155,9 @@ echo "$warnsep" echo "" echo " XScreenSaver will be installed in these directories:" echo "" -echo " User programs: ${bindir}/" -echo " Screen savers: ${HACKDIR}/" -echo " Configuration: ${HACK_CONF_DIR}/" -echo " App Defaults: ${APPDEFAULTS}/" +echo " User programs: ${bindir}/$bindir_err" +echo " Screen savers: ${HACKDIR}/$hackdir_err" +echo " Configuration: ${HACK_CONF_DIR}/$confdir_err" +echo " Extra Fonts: ${FONT_DIR}$fontdir_err" +echo " App Defaults: ${APPDEFAULTS}/$addir_err" echo "" diff --git a/configure.ac b/configure.ac index 9d7b8e15..c3f0b5b5 100644 --- a/configure.ac +++ b/configure.ac @@ -1,8 +1,11 @@ -# configure.in --- xscreensaver, Copyright (c) 1997-2020 Jamie Zawinski. +# configure.in --- xscreensaver, Copyright © 1997-2021 Jamie Zawinski. # -AC_PREREQ(2.52) -AC_INIT(driver/subprocs.c) +# Note: upgrading past 2.69_5 breaks the world. +AC_PREREQ([2.69]) + +AC_INIT +AC_CONFIG_SRCDIR([driver/subprocs.c]) AC_CONFIG_HEADERS([config.h]) echo "current directory: `pwd`" @@ -15,34 +18,60 @@ echo "command line was: $0 $@" ############################################################################### AH_TOP([ -/* config.h.in --- xscreensaver, Copyright (c) 1991-2020 Jamie Zawinski. - * - * The best way to set these parameters is by running the included `configure' - * script. That examines your system, and generates `config.h' from - * `config.h.in'. - * - * If something goes very wrong, you can edit `config.h' directly, but beware - * that your changes will be lost if you ever run `configure' again. +/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski. + * Generate this file by running 'configure' rather than editing it by hand. */ ]) +# Defines in config.h are dumped out alphabetically rather than in any kind +# of sane order, sigh. + +# +# OS stuff. +# +AH_TEMPLATE([HAVE_PTHREAD], + [Define this if you have POSIX threads.]) + +AH_TEMPLATE([HAVE_SIGTIMEDWAIT], + [Define to 1 if you have the `sigtimedwait' function.]) + +AH_TEMPLATE([HAVE_FORKPTY], + [Define this if you have forkpty.]) + +AH_TEMPLATE([HAVE_GETTIMEOFDAY], + [Define this if you have gettimeofday.]) + +AH_TEMPLATE([GETTIMEOFDAY_TWO_ARGS], + [Define this if gettimeofday takes two arguments.]) + +AH_TEMPLATE([HAVE_ICMP], + [Define this if ping uses struct icmp.icmp_id.]) + +AH_TEMPLATE([HAVE_ICMPHDR], + [Define this if ping uses struct icmphdr.un.echo.id.]) + +AH_TEMPLATE([HAVE_GETIFADDRS], + [Define this if you have getifaddrs.]) + +AH_TEMPLATE([HAVE_LIBCAP], + [Define this if your system has libcap.]) + +# +# X11 server stuff. +# +AH_TEMPLATE([XPointer], + [Stare into the void.]) + AH_TEMPLATE([HAVE_READ_DISPLAY_EXTENSION], [Define this if you have the SGI XReadDisplay extension.]) -AH_TEMPLATE([HAVE_XHPDISABLERESET], - [Define this if you have the XHPDisableReset function (an HP only - thing which allows the Ctrl-Sh-Reset key sequence to be - temporarily disabled.)]) +AH_TEMPLATE([HAVE_XINPUT], + [Define this if you have the XInput2 extension.]) # This only ever existed in X11R4 and X11R5. AH_TEMPLATE([HAVE_XIDLE_EXTENSION], [Define this if you have the X11R5 XIDLE extension.]) -AH_TEMPLATE([HAVE_MIT_SAVER_EXTENSION], - [Using the MIT-SCREEN-SAVER extension means that the X server - will crash at random times, and fading and hysteresis won't work. - Don't use this. You'll be sorry. See comment in xscreensaver.c.]) - # This only ever existed on SGI hardware. AH_TEMPLATE([HAVE_SGI_SAVER_EXTENSION], [Define this if you have the SGI SCREEN_SAVER extension.]) @@ -51,36 +80,30 @@ AH_TEMPLATE([HAVE_SGI_SAVER_EXTENSION], AH_TEMPLATE([HAVE_SGI_VC_EXTENSION], [Define this if you have the SGI-VIDEO-CONTROL extension.]) +AH_TEMPLATE([HAVE_MIT_SAVER_EXTENSION], + [Using the MIT-SCREEN-SAVER extension means that the X server + will crash at random times, and fading and hysteresis won't work. + Don't use this. You'll be sorry. See comment in xscreensaver.c.]) + AH_TEMPLATE([HAVE_DPMS_EXTENSION], [Define this if you have the XDPMS extension.]) AH_TEMPLATE([HAVE_XF86VMODE], - [Define this if you have the functions XF86VidModeGetModeLine() - and XF86VidModeGetViewPort(), in support of virtual desktops - where the X server's root window is bigger than the actual - screen.]) + [Define this if you have XF86VidModeGetViewPort, for + virtual desktops.]) AH_TEMPLATE([HAVE_XF86VMODE_GAMMA], - [Define this if you have the functions XF86VidModeGetGamma() and - XF86VidModeSetGamma(), which allow clients to change the gamma - response of the monitor.]) + [Define this if you have XF86VidModeSetGamma, for fading.]) AH_TEMPLATE([HAVE_XF86VMODE_GAMMA_RAMP], - [Define this if you have the functions XF86VidModeGetGammaRamp() - and XF86VidModeSetGammaRamp(), which provide finer-grained - control than XF86VidMode[GS]etGamma().]) + [Define this if you have XF86VidModeSetGammaRamp, for fading.]) AH_TEMPLATE([HAVE_XINERAMA], [Define this if you have the Xinerama extension.]) -AH_TEMPLATE([HAVE_XINPUT], - [Define this if you have the Xinput extension.]) - -AH_TEMPLATE([HAVE_XF86MISCSETGRABKEYSSTATE], - [Define this if you have the XF86MiscSetGrabKeysState function - (which allows the Ctrl-Alt-KP_star and Ctrl-Alt-KP_slash key - sequences to be temporarily disabled. Sadly, it doesn't affect - Ctrl-Alt-BS or Ctrl-Alt-F1.)]) +AH_TEMPLATE([HAVE_XHPDISABLERESET], + [Define this if you have XHPDisableReset, which allows + Ctrl-Sh-Reset to be temporarily disabled.]) AH_TEMPLATE([HAVE_RANDR], [Define this if you have the Resize and Rotate extension.]) @@ -88,227 +111,172 @@ AH_TEMPLATE([HAVE_RANDR], AH_TEMPLATE([HAVE_RANDR_12], [Define this if the RANDR library is version 1.2 or newer.]) +AH_TEMPLATE([HAVE_XSHM_EXTENSION], + [Define this if you have the X Shared Memory Extension.]) + +AH_TEMPLATE([HAVE_DOUBLE_BUFFER_EXTENSION], + [Define this if you have the X Double Buffer Extension.]) + +#AH_TEMPLATE([HAVE_XCOMPOSITE_EXTENSION], +# [Define this if you have the X Composite Extension.]) + +AH_TEMPLATE([HAVE_XKB], + [Define this if you have the X Keyboard Extension.]) + +AH_TEMPLATE([HAVE_LIBSYSTEMD], + [Define this if you have libsystemd.]) + AH_TEMPLATE([HAVE_PROC_INTERRUPTS], [Define this if you have a Linux-like /proc/interrupts file which can be examined to determine when keyboard activity has - occurred.]) + occurred, and you use PS/2 input devices instead of USB.]) AH_TEMPLATE([HAVE_PROC_OOM], [Define this if you have a Linux-like /proc/.../oom_score_adj file which can be adjusted by root to exempt us from the out-of-memory - .]) + killer.]) -AH_TEMPLATE([HAVE_MOTIF],[Define this if you have Motif.]) +# +# GUI stuff. +# +AH_TEMPLATE([HAVE_MOTIF], + [Define this if you have Motif.]) AH_TEMPLATE([HAVE_XMCOMBOBOX], - [Define this if you have the XmComboBox Motif widget (Motif 2.0.)]) + [Define this if you have the XmComboBox Motif 2.0 widget.]) -AH_TEMPLATE([HAVE_GTK],[Define this if you have Gtk (any version.)]) -AH_TEMPLATE([HAVE_GTK2],[Define this if you have Gtk 2.x.]) +AH_TEMPLATE([HAVE_GTK], + [Define this if you have Gtk]) +AH_TEMPLATE([HAVE_GTK2], + [Define this if you have Gtk 2.x.]) AH_TEMPLATE([HAVE_CRAPPLET], [Define this if you have Gnome and want to build support for the - xscreensaver control panel in the Gnome Control Center - (gnomecc). (This is needed only with Gtk 1.x.)]) + xscreensaver control panel in the Gtk 1.x Gnome Control Center.]) AH_TEMPLATE([HAVE_CRAPPLET_IMMEDIATE], [Define this if HAVE_CRAPPLET is defined, and the function - capplet_widget_changes_are_immediate() is available.]) + capplet_widget_changes_are_immediate is available.]) -AH_TEMPLATE([HAVE_XML],[Define this if you have the XML library.]) +AH_TEMPLATE([HAVE_XML], + [Define this if you have the XML library.]) AH_TEMPLATE([HAVE_OLD_XML_HEADERS], - [Define this if you have the XML library headers in their old, - non-namespaced location (you lack the gnome-xml/libxml symlink)]) + [Define this if you the XML library headers lack the + gnome-xml/libxml symlink.]) AH_TEMPLATE([HAVE_GDK_PIXBUF], - [Define this if you have the GDK_Pixbuf library installed. Some - of the demos can make use of this if it is available.]) + [Define this if you have GDK_Pixbuf.]) AH_TEMPLATE([HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION], [Define this if you have the gdk_pixbuf_apply_embedded_orientation function (gdk-pixbuf 2.12).]) +# +# Image loading. +# AH_TEMPLATE([HAVE_JPEGLIB], - [Define this if you have the Independent JPEG Group's JPEG - library installed. Some of the demos can make use of this if it - is available.]) + [Define this if you have the JPEG Group's JPEG library.]) AH_TEMPLATE([HAVE_LIBPNG], - [Define this if the Portable Network Graphics library is installed. - It is basically required, but many things will more-or-less limp - along without it.]) - -AH_TEMPLATE([HAVE_XMU], - [Define this if you have the Xmu library. This is standard part - of X, and if your vendor doesn't ship it, you should report that - as a bug.]) + [Define this if you have the Portable Network Graphics library.]) AH_TEMPLATE([HAVE_XUTF8DRAWSTRING], - [Define this if you have the function Xutf8DrawString().]) + [Define this if you have the function Xutf8DrawString.]) AH_TEMPLATE([HAVE_XFT], [Define this if you have libXft2.]) -AH_TEMPLATE([HAVE_LIBSYSTEMD], - [Define this if you have libsystemd.]) - +# +# Graphics libraries. +# AH_TEMPLATE([HAVE_GL], - [Define this if you have OpenGL. Some of the demos require it, - so if you don't have it, then those particular demos won't be - built. (This won't affect the screen saver as a whole.)]) + [Define this if you have OpenGL.]) -AH_TEMPLATE([HAVE_MESA_GL], - [Define this if you have OpenGL, but it's the MesaGL variant. - (The libraries have different names.) (HAVE_GL should be defined - too.)]) +AH_TEMPLATE([HAVE_GLES], + [Define this if the native OpenGL library is OpenGLES 1.x.]) -AH_TEMPLATE([HAVE_GLBINDTEXTURE], - [Define this if your version of OpenGL has the glBindTexture() - routine. This is the case for OpenGL 1.1, but not for OpenGL - 1.0.]) +AH_TEMPLATE([HAVE_GLES2], + [Define this if the native OpenGL library is OpenGLES 2.x.]) -AH_TEMPLATE([HAVE_GLSL], - [Define this if your OpenGL implementation supports the OpenGL - Shading Language (GLSL). This requires at least OpenGL 2.0. - HAVE_GL should be defined, too.]) +AH_TEMPLATE([HAVE_GLES3], + [Define this if the native OpenGL library is OpenGLES 3.x.]) -AH_TEMPLATE([HAVE_GLE], - [Define this if you have the -lgle and -lmatrix libraries (GL - extrusion.)]) +AH_TEMPLATE([HAVE_JWZGLES], + [Define this to emulate OpenGL 1.3 in terms of OpenGLES 1.x.]) -AH_TEMPLATE([HAVE_GLE3],[Define this if you have the -lgle from GLE version 3]) +AH_TEMPLATE([HAVE_EGL], + [Define this if OpenGL bindings are via EGL instead of GLX.]) -AH_TEMPLATE([HAVE_JWZGLES],[Define this to target the OpenGL ES 1.x API - instead of OpenGL 1.3.]) +AH_TEMPLATE([HAVE_GLSL], + [Define this if OpenGL supports the OpenGL Shading Language.]) -AH_TEMPLATE([HAVE_XSHM_EXTENSION], - [Define this if you have the X Shared Memory Extension.]) +AH_TEMPLATE([HAVE_GLBINDTEXTURE], + [Define this if the OpenGL version is 1.1 or newer.]) -AH_TEMPLATE([HAVE_DOUBLE_BUFFER_EXTENSION], - [Define this if you have the X Double Buffer Extension.]) +AH_TEMPLATE([HAVE_GLE], + [Define this if you have the GL Extrusion library.]) + +AH_TEMPLATE([HAVE_GLE3], + [Define this if GL Extrusion is version 3.]) -AH_TEMPLATE([FORTUNE_PROGRAM], - [Some screenhacks like to run an external program to generate - random pieces of text; set this to the one you like. Note that - this is just the default; X resources can be used to override - it.]) -AH_TEMPLATE([PASSWD_HELPER_PROGRAM], - [Set the name of the password helper program, if any]) +AH_TEMPLATE([HAVE_RECORD_ANIM], + [Define this to enable recording of videos.]) +# +# Locking. +# AH_TEMPLATE([NO_LOCKING], [Define this to remove the option of locking the screen at all.]) -AH_TEMPLATE([ALLOW_ROOT_PASSWD], - [Define this to allow the root password to unlock the screen.]) - -AH_TEMPLATE([HAVE_KERBEROS], - [Define this if you want to use Kerberos authentication to - lock/unlock the screen instead of your local password. This - currently uses Kerberos V4, but a V5 server with V4 - compatibility will work. WARNING: DO NOT USE AFS string-to-key - passwords with this option. This option currently *only* works - with standard Kerberos des_string_to_key. If your password is - an AFS password and not a kerberos password, it will not - authenticate properly. See the comments in driver/kpasswd.c for - more information if you need it.]) - -AH_TEMPLATE([HAVE_KERBEROS5], - [Define this if you have Kerberos 5, meaning we need to use the - Kerberos 4 compatibility layer.]) - AH_TEMPLATE([HAVE_PAM], - [Define this if you want to use PAM (Pluggable Authentication - Modules) to lock/unlock the screen, instead of standard - /etc/passwd authentication.]) + [Define this if you have Pluggable Authentication Modules.]) AH_TEMPLATE([PAM_SERVICE_NAME], - [If PAM is being used, this is the name of the PAM service that - xscreensaver will authenticate as. The default is - "xscreensaver", which means that the PAM library will look for - an "xscreensaver" line in /etc/pam.conf, or (on recent Linux - systems) will look for a file called /etc/pam.d/xscreensaver. - Some systems might already have a PAM installation that is - configured for xlock, so setting this to "xlock" would also work - in that case.]) + [The name of the "xscreensaver" PAM service.]) AH_TEMPLATE([HAVE_PAM_FAIL_DELAY], - [Define this if you have pam_fail_delay function. - see driver/passwd-pam.c.]) + [Define this if you have pam_fail_delay.]) AH_TEMPLATE([PAM_CHECK_ACCOUNT_TYPE], [Whether PAM should check the result of account modules - when authenticating. Only do this if you have account - configured properly on your system.]) + when authenticating.]) AH_TEMPLATE([PAM_STRERROR_TWO_ARGS], - [Define if you have PAM and pam_strerror() requires two - arguments.]) + [Define if pam_strerror requires two arguments.]) -AH_TEMPLATE([HAVE_SIGTIMEDWAIT], - [Define to 1 if you have the `sigtimedwait' function.]) +AH_TEMPLATE([HAVE_KERBEROS], + [Define this if you want to use Kerberos authentication to + lock/unlock the screen instead of PAM.]) + +AH_TEMPLATE([HAVE_KERBEROS5], + [Define this if you have Kerberos 5.]) + +AH_TEMPLATE([ALLOW_ROOT_PASSWD], + [Define this to allow root to unlock, when not using PAM.]) AH_TEMPLATE([HAVE_SHADOW_PASSWD], - [Define this if your system uses 'shadow' passwords, that is, the - passwords live in /etc/shadow instead of /etc/passwd, and one - reads them with getspnam() instead of getpwnam(). (Note that - SCO systems do some random other thing; others might as well. - See the ifdefs in driver/passwd-pwent.c if you're having trouble - related to reading passwords.)]) + [Define this if your system uses /etc/shadow.]) + +AH_TEMPLATE([HAVE_PWNAM_SHADOW_PASSWD], + [Define this if your system uses getpwnam_shadow.]) AH_TEMPLATE([HAVE_ENHANCED_PASSWD], - [Define this if your system is Digital or SCO Unix with so-called - ``Enhanced Security'', that is, the passwords live in - /tcb/files/auth// instead of in /etc/passwd, and one - reads them with getprpwnam() instead of getpwnam().]) + [Define this for DEC/SCO "Enhanced Security" with getprpwnam.]) AH_TEMPLATE([HAVE_ADJUNCT_PASSWD], - [Define this if your system is Solaris with ``adjunct'' passwords - (this is the version where one gets at the passwords with - getpwanam() instead of getpwnam().) I haven't tested this one, - let me know if it works.]) + [Define this for Solaris getpwanam.]) AH_TEMPLATE([HAVE_HPUX_PASSWD], - [Define this if you have HPUX with so-called "Secure Passwords".]) - -AH_TEMPLATE([HAVE_SYSLOG], - [Define this if you the openlog(), syslog(), and closelog() - functions. This is used for logging failed login attempts.]) - -AH_TEMPLATE([HAVE_ICMP], - [Define this if you do pings with a `struct icmp' and an - `icmp_id' slot.]) - -AH_TEMPLATE([HAVE_ICMPHDR], - [Define this if you do pings with a `struct icmphdr' and an - `un.echo.id' slot.]) - -AH_TEMPLATE([HAVE_GETIFADDRS], - [Define this if you have the getifaddrs() function.]) - -AH_TEMPLATE([HAVE_FORKPTY], - [Define this if you have the 'forkpty' function: - This allows 'phosphor' and 'apple2' to run curses-based - programs, or be used as terminal windows.]) - -AH_TEMPLATE([HAVE_GETTIMEOFDAY], - [Define this if you have the gettimeofday function.]) - -AH_TEMPLATE([GETTIMEOFDAY_TWO_ARGS], - [Define this if gettimeofday() takes two arguments.]) - -AH_TEMPLATE([XPointer], - [Define this to void* if you're using X11R4 or earlier.]) + [Define this for HPUX so-called "Secure Passwords".]) -AH_TEMPLATE([HAVE_PTHREAD], - [Define this if your system supports POSIX threads.]) +#AH_TEMPLATE([PASSWD_HELPER_PROGRAM], +# [Define this to use a third-party password helper program.]) -AH_TEMPLATE([HAVE_LIBCAP], - [Define this if your system has libcap.]) +AH_TEMPLATE([HAVE_SYSLOG], + [Define this if you have openlog/syslog/closelog.]) -AH_TEMPLATE([HAVE_RECORD_ANIM], - [Define this to enable recording of videos.]) # After checking to see that --srcdir is correct (which AC_INIT does) # check for some random other files that come later in the tar file, @@ -325,6 +293,30 @@ for d in utils jwxyz hacks hacks/glx driver ; do fi done +############################################################################### +# +# Check for availability of various gcc command-line options. +# +############################################################################### + +AC_DEFUN([AC_CHECK_GCC_ARG], + [if test -n "$GCC"; then + AC_CACHE_CHECK([whether gcc accepts [$2]], + ac_cv_gcc_accepts_[$1], + [rm -rf conftest.$ac_ext + touch conftest.$ac_ext + if ( ( gcc -c [$2] conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ + grep unrecognized >/dev/null ); then + ac_cv_gcc_accepts_[$1]=no + else + ac_cv_gcc_accepts_[$1]=yes + CC="$CC [$2]" + fi]) + ac_gcc_accepts_[$1]="$ac_cv_gcc_accepts_[$1]" + fi +]) + + ############################################################################### # # Function to figure out how to run the compiler. @@ -362,139 +354,33 @@ AC_DEFUN([AC_PROG_CC_ANSI], CC="$CC -D__EXTENSIONS__" ;; esac - fi - - OBJCC="$CC" - - # This test makes cross-compiling fail, so let's just assume that nobody - # is using a K&R compiler any more... - # -# AC_MSG_CHECKING([whether the compiler works on ANSI C]) -# AC_TRY_RUN([ main(int ac, char **av) { return 0; } ], -# AC_MSG_RESULT(yes), -# AC_MSG_RESULT(no) -# AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.), -# AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.)) - - if test -n "$GCC"; then - AC_MSG_RESULT(Turning on gcc compiler warnings.) - CC="$CC -pedantic -Wall -Wstrict-prototypes -Wnested-externs -Wmissing-prototypes" - OBJCC="$OBJCC -Wall" - # As of gcc 3.4, we have "-Wdeclaration-after-statement" - # and so perhaps now we can do without -pedantic? - else - case "$host" in - *-irix5* |*-irix6.[0-3]* ) - AC_MSG_RESULT(Turning on SGI compiler warnings.) - CC="$CC -fullwarn -use_readonly_const -rdata_shared -g3" - ;; -# *-dec-osf* ) -# if test -z "$GCC"; then -# AC_MSG_RESULT(Turning on DEC C compiler warnings.) -# CC="$CC -migrate -w0 -verbose -warnprotos" -# fi -# ;; - esac - fi -]) - - -############################################################################### -# -# Check for availability of various gcc command-line options. -# -############################################################################### - -AC_DEFUN([AC_CHECK_GCC_ARG], - [if test -n "$GCC"; then - AC_CACHE_CHECK([whether gcc accepts [$2]], - ac_cv_gcc_accepts_[$1], - [rm -rf conftest.$ac_ext - touch conftest.$ac_ext - if ( ( gcc -c [$2] conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \ - grep unrecognized >/dev/null ); then - ac_cv_gcc_accepts_[$1]=no - else - ac_cv_gcc_accepts_[$1]=yes - CC="$CC [$2]" - fi]) - ac_gcc_accepts_[$1]="$ac_cv_gcc_accepts_[$1]" - fi -]) - -AC_DEFUN([AC_NO_LONG_STRING_WARNINGS], - [AC_CHECK_GCC_ARG(no_overlength, -Wno-overlength-strings)]) - -AC_DEFUN([AC_NO_MISPLACED_DECLARATIONS], - [AC_CHECK_GCC_ARG(no_decl_after, -Wdeclaration-after-statement)]) - -# Need to disable Objective C extensions in ANSI C on MacOS X to work -# around an Apple-specific gcc bug. -# -AC_DEFUN([AC_NO_OBJECTIVE_C], - [AC_CHECK_GCC_ARG(no_cpp_precomp, -no-cpp-precomp)]) - -############################################################################### -# -# Function to figure out how to disable // comments in ANSI C code. -# -# (With recent gcc, this is done with "-std=c89". With older gcc, this -# is done by passing "-lang-c89" to cpp, by passing "-Wp,-lang-c89" to -# gcc. Old gcc doesn't support -std, and new gcc doesn't support -lang. -# so much for compatibility!) -# -# UPDATE: apparently there is NO WAY to tell gcc 3.2.2 to require that -# declarations preceed statements, without resorting to "-pedantic". -# This means that there is no way to get gcc3 to issue warnings that -# ensure that your code complies with the ANSI/ISO C89 standard, without -# also drowning in totally useless warnings. Thank you master may I -# have another. -# -# So, I give up, let's just use -pedantic. -# -############################################################################### - -AC_DEFUN([AC_GCC_ACCEPTS_STD], [ - case "$host" in - *-darwin* ) - # Fucking Apple let // comments sneak into OpenGL headers, so - # we *must* allow // comments when compiling on Mac OS 10.6! FUCK! - ;; - *) - AC_CHECK_GCC_ARG(std, -std=c89) - ;; - esac -]) -AC_DEFUN([AC_NO_CPLUSPLUS_COMMENTS_IN_C_CODE], - [if test -n "$GCC"; then - AC_GCC_ACCEPTS_STD - AC_MSG_RESULT(Disabling C++ comments in ANSI C code.) - # - # The reason that // comments are banned from xscreensaver is that gcc is - # basically the only compiler in the world that supports them in C code. - # All other vendors support them only in their C++ compilers, not in their - # ANSI C compilers. This means that it's a portability problem: every time - # these comments have snuck into the xscreensaver source code, I've gotten - # complaints about it the next day. So we turn off support for them in gcc - # as well to prevent them from accidentially slipping in. - # - if test "$ac_gcc_accepts_std" = yes ; then - # - # -std=c89 defines __STRICT_ANSI__, which we don't want. - # (That appears to be the only additional preprocessor symbol - # it defines, in addition to the syntax changes it makes.) - # - # -std=gnu89 is no good, because // comments were a GNU extension - # before they were in the ANSI C 99 spec... (gcc 2.96 permits // - # with -std=gnu89 but not with -std=c89.) - # - # $CC already contains "-std=c89" via AC_GCC_ACCEPTS_STD - CC="$CC -U__STRICT_ANSI__" -# else -# # The old way: -# CC="$CC -Wp,-lang-c89" - fi + # Prior to 1996, XScreenSaver was written in K&R C, because ANSI C + # compilers (function prototypes!) were not yet universally deployed. + # And even after the conversion to ANSI C, GNU C's various non-standard + # extensions (such as allowing C++ style "//" comments in C code, and + # declarations after statements) were not supported by non-gcc compilers + # for many years, so we continued to use "-std=c89" to prevent those + # GNU-isms from sneaking in to the code. Well, these days various + # vendors have sloppily allowed non-ANSI syntax to slip into their + # library header files. GTK and OpenGL have been major offenders in this + # way. So... as of 2021, I guess we are forced to use "-std=gnu89", to + # allow those extensions, and hope that the warnings generated by + # "-pedantic" are heeded. + # + AC_CHECK_GCC_ARG(gnu89, -std=gnu89) + AC_CHECK_GCC_ARG(pedantic, -pedantic) + AC_CHECK_GCC_ARG(Wall, -Wall) + AC_CHECK_GCC_ARG(wnested_externs, -Wnested-externs) + AC_CHECK_GCC_ARG(wstrict_prototypes, -Wstrict-prototypes) + AC_CHECK_GCC_ARG(wmissing_prototypes, -Wmissing-prototypes) + AC_CHECK_GCC_ARG(declaration_after, -Wdeclaration-after-statement) + # "string length is greater than ISO C89 compilers required to support" + AC_CHECK_GCC_ARG(no_overlength_strings, -Wno-overlength-strings) + # Ignore warnings about using "inline" + AC_CHECK_GCC_ARG(no_language_ext_token, -Wno-language-extension-token) + # Xlib headers use named variadic macros. + AC_CHECK_GCC_ARG(no_variadic_macros, -Wno-variadic-macros) fi ]) @@ -559,16 +445,13 @@ AC_DEFUN([AC_PROG_INSTALL_DIRS], AC_DEFUN([AC_GETTIMEOFDAY_ARGS], [AC_MSG_CHECKING(how to call gettimeofday) AC_CACHE_VAL(ac_cv_gettimeofday_args, - [AC_TRY_COMPILE([#include + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([#include #include ], - [struct timeval tv; struct timezone tzp; - gettimeofday(&tv, &tzp);], - [ac_gettimeofday_args=2], - [AC_TRY_COMPILE([#include - #include ], - [struct timeval tv; gettimeofday(&tv);], - [ac_gettimeofday_args=1], - [ac_gettimeofday_args=0])]) + [struct timeval tv; struct timezone tzp; + gettimeofday(&tv, &tzp);])], + [ac_gettimeofday_args=2], + [ac_gettimeofday_args=1]) ac_cv_gettimeofday_args=$ac_gettimeofday_args]) ac_gettimeofday_args=$ac_cv_gettimeofday_args if test "$ac_gettimeofday_args" = 1 ; then @@ -607,26 +490,6 @@ AC_DEFUN([AC_PROG_PERL], ]) -############################################################################### -# -# Function to demand "bc". Losers. -# -############################################################################### - -AC_DEFUN([AC_DEMAND_BC], - [ac_bc_result=`echo 6+9 | bc 2>/dev/null` - AC_MSG_CHECKING([for bc]) - if test "$ac_bc_result" = "15" ; then - AC_MSG_RESULT(yes) - else - AC_MSG_RESULT(no) - echo '' - AC_MSG_ERROR([Your system doesn't have \"bc\", which has been a standard - part of Unix since the 1970s. Come back when your vendor - has grown a clue.]) - fi - ]) - ############################################################################### # # Functions to check how to do ICMP PING requests. @@ -635,7 +498,8 @@ AC_DEFUN([AC_DEMAND_BC], AC_DEFUN([AC_CHECK_ICMP], [AC_CACHE_CHECK([for struct icmp], ac_cv_have_icmp, - [AC_TRY_COMPILE([#include + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([#include #include #include #include @@ -669,16 +533,17 @@ AC_DEFUN([AC_CHECK_ICMP], #else ip.ip_hl = 0; #endif - ], - [ac_cv_have_icmp=yes], - [ac_cv_have_icmp=no])]) + ])], + [ac_cv_have_icmp=yes], + [ac_cv_have_icmp=no])]) if test "$ac_cv_have_icmp" = yes ; then AC_DEFINE(HAVE_ICMP) fi]) AC_DEFUN([AC_CHECK_ICMPHDR], [AC_CACHE_CHECK([for struct icmphdr], ac_cv_have_icmphdr, - [AC_TRY_COMPILE([#include + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([#include #include #include #include @@ -707,9 +572,9 @@ AC_DEFUN([AC_CHECK_ICMPHDR], i.un.echo.id = 0; i.un.echo.sequence = 0; si.sin_family = AF_INET; - ip.ip_hl = 0;], - [ac_cv_have_icmphdr=yes], - [ac_cv_have_icmphdr=no])]) + ip.ip_hl = 0;])], + [ac_cv_have_icmphdr=yes], + [ac_cv_have_icmphdr=no])]) if test "$ac_cv_have_icmphdr" = yes ; then AC_DEFINE(HAVE_ICMPHDR) fi]) @@ -723,6 +588,7 @@ AC_DEFUN([AC_CHECK_ICMPHDR], # Try and find the app-defaults directory. # It sucks that autoconf doesn't do this already... +# (AC_PATH_X_APP_DEFAULTS_XMKMF is no longer used.) # AC_DEFUN([AC_PATH_X_APP_DEFAULTS_XMKMF],[ rm -fr conftestdir @@ -833,6 +699,14 @@ AC_DEFUN([AC_XPOINTER], AC_DEFINE(XPointer,[char*]) fi]) +AC_DEFUN([AC_XT], + [AC_CACHE_CHECK([for Xt], ac_cv_libxt, + [AC_TRY_X_COMPILE([#include + #include ], + [Widget foo = (Widget) 0;], + [ac_cv_libxt=yes], + [ac_cv_libxt=no])])]) + # Random special-cases for X on certain pathological OSes. # You know who you are. @@ -955,38 +829,58 @@ AC_DEFUN([AC_X_RANDOM_PATHS], ;; *-darwin*) - # On MacOS X (10.x with "fink"), many things are under /sw/. - # + # MacPorts on macOS + if test -d /opt/local/include ; then + X_CFLAGS="-I/opt/local/include $X_CFLAGS" + X_LIBS="-L/opt/local/lib $X_LIBS" + fi + + # Fink on macOS if test -d /sw/include ; then X_CFLAGS="-I/sw/include $X_CFLAGS" - X_LIBS="-L/sw/lib $X_LIBS" + X_LIBS="-L/sw/lib $X_LIBS" + fi + + # Homebrew on macOS Intel + if test -d /usr/local/include ; then + X_CFLAGS="-I/usr/local/include $X_CFLAGS" + X_LIBS="-L/usr/local/lib $X_LIBS" + fi + + # Homebrew on macOS ARM + if test -d /opt/homebrew/include ; then + X_CFLAGS="-I/opt/homebrew/include $X_CFLAGS" + X_LIBS="-L/opt/homebrew/lib $X_LIBS" fi ;; esac]) AC_DEFUN([AC_CHECK_GETIFADDRS], [AC_CACHE_CHECK([for getifaddrs], ac_cv_have_getifaddrs, - [AC_TRY_COMPILE([#include + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([#include #include #include #include ], [struct ifaddrs *ifa; getifaddrs (&ifa); ifa->ifa_next = 0; - ifa->ifa_addr->sa_family = 0;], - [ac_cv_have_getifaddrs=yes], - [ac_cv_have_getifaddrs=no])]) + ifa->ifa_addr->sa_family = 0;])], + [ac_cv_have_getifaddrs=yes], + [ac_cv_have_getifaddrs=no])]) if test "$ac_cv_have_getifaddrs" = yes ; then AC_DEFINE(HAVE_GETIFADDRS) fi]) AC_DEFUN([AC_TYPE_SOCKLEN_T], [AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t, - [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #include ]], [[ - socklen_t socklen; - ]])],[ac_cv_type_socklen_t=yes],[ac_cv_type_socklen_t=no])]) + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([ + #include + #include ], + [socklen_t socklen;])], + [ac_cv_type_socklen_t=yes], + [ac_cv_type_socklen_t=no])]) if test "$ac_cv_type_socklen_t" != yes; then AC_DEFINE(socklen_t, int, [Define to `int' if or does not define.]) @@ -1022,7 +916,7 @@ AC_DEFUN([AC_EGREP_X_HEADER], [ AC_EGREP_HEADER([$1], [$2], [$3], [$4]) CPPFLAGS="$ac_save_CPPFLAGS"]) -# Like AC_TRY_COMPILE, but it uses the already-computed -I directories. +# Like AC_COMPILE_IFELSE but it uses the already-computed -I directories. # AC_DEFUN([AC_TRY_X_COMPILE], [ ac_save_CPPFLAGS="$CPPFLAGS" @@ -1031,7 +925,7 @@ AC_DEFUN([AC_TRY_X_COMPILE], [ fi CPPFLAGS="$CPPFLAGS $X_CFLAGS" CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - AC_TRY_COMPILE([$1], [$2], [$3], [$4]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$1], [$2])],[$3],[$4]) CPPFLAGS="$ac_save_CPPFLAGS"]) @@ -1063,7 +957,7 @@ AC_DEFUN([AC_CHECK_X_LIB], [ # LIBS="$ac_save_LIBS" ]) -# Like AC_TRY_RUN, but it uses the already-computed -I directories. +# Like AC_RUN_IFELSE but it uses the already-computed -I directories. # (But not the -L directories!) # AC_DEFUN([AC_TRY_X_RUN], [ @@ -1073,7 +967,7 @@ AC_DEFUN([AC_TRY_X_RUN], [ fi CPPFLAGS="$CPPFLAGS $X_CFLAGS" CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - AC_TRY_RUN([$1], [$2], [$3], [$4]) + AC_RUN_IFELSE([AC_LANG_SOURCE([$1])],[$2],[$3],[$4]) CPPFLAGS="$ac_save_CPPFLAGS"]) @@ -1141,6 +1035,11 @@ AC_DEFUN([HANDLE_X_PATH_ARG], [ ############################################################################### ############################################################################### +# Default $PATH might not contain /sbin and thus miss /sbin/setcap. +# +export PATH="$PATH:/usr/bin:/bin:/usr/sbin:/sbin" + + # WTF! autoconf emits this *way* too late. Do it earlier. test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' @@ -1151,15 +1050,10 @@ AC_CANONICAL_HOST ac_original_cc=$CC AC_PROG_CC AC_PROG_CC_ANSI -AC_NO_LONG_STRING_WARNINGS -AC_NO_MISPLACED_DECLARATIONS -AC_NO_OBJECTIVE_C -AC_NO_CPLUSPLUS_COMMENTS_IN_C_CODE AC_PROG_CPP AC_C_CONST AC_C_INLINE AC_EXEEXT -AC_DEMAND_BC # stuff for Makefiles AC_PROG_INSTALL @@ -1174,13 +1068,11 @@ AC_PROG_MAKE_SET INSTALL_SCRIPT='${INSTALL}' # random libc stuff -AC_HEADER_STDC AC_CHECK_HEADERS(unistd.h inttypes.h) AC_TYPE_MODE_T AC_TYPE_PID_T AC_TYPE_SIZE_T -AC_TYPE_SIGNAL -AC_HEADER_TIME +AC_DEFINE_UNQUOTED([RETSIGTYPE],[void],[Return type of signal handlers]) AC_HEADER_SYS_WAIT AC_HEADER_DIRENT AC_GETTIMEOFDAY_ARGS @@ -1189,7 +1081,7 @@ AC_CHECK_FUNCS(select fcntl uname nice setpriority getcwd getwd putenv sbrk) AC_CHECK_FUNCS(sigaction syslog realpath setrlimit) AC_CHECK_FUNCS(setlocale sqrtf) AC_CHECK_FUNCS(getaddrinfo) -AC_CHECK_MEMBERS([struct sockaddr.sa_len],,, [[#include ]]) +AC_CHECK_MEMBERS([struct sockaddr.sa_len],,, [#include ]) AC_CHECK_ICMP AC_CHECK_ICMPHDR AC_CHECK_GETIFADDRS @@ -1210,8 +1102,10 @@ fi AC_X_RANDOM_PATHS AC_XPOINTER +AC_XT + -AC_MSG_CHECKING(whether this is MacOS X) +AC_MSG_CHECKING(whether this is macOS) ac_macosx=no ac_irix=no case "$host" in @@ -1273,6 +1167,14 @@ pkg_check_version() { # ############################################################################### +# Wow, this is complete madness. Why does po/Makefile.in.in exist?? Why does +# aclocal.m4 exist?? Why can't I upgrade it without everything breaking?? +# This IT_PROG_INTLTOOL nonsense has so many self-modifying levels of insanity +# that it *must* have been written by RMS. Or an equally demented protégé. +# Won't someone please have mercy on us all and write a normal po/Makefile.in +# that uses wildcards, and write a sane set of rules to detect gettext(3) and +# msgfmt(1) and just do the obviously straightforward thing? + IT_PROG_INTLTOOL GETTEXT_PACKAGE=xscreensaver AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", @@ -1284,71 +1186,6 @@ AM_GLIB_GNU_GETTEXT MKINSTALLDIRS="$INSTALL_DIRS" -############################################################################### -# -# Check for -lXmu (some fucked up vendors don't ship it...) -# -############################################################################### - -have_xmu=no -AC_CHECK_X_HEADER(X11/Xmu/Error.h, [have_xmu=yes],, - [#include - #include - #include ]) -if test "$have_xmu" = no ; then - XMU_SRCS='$(UTILS_SRC)/xmu.c' - XMU_OBJS='$(UTILS_BIN)/xmu.o' - XMU_LIBS='' -else - XMU_SRCS='' - XMU_OBJS='' - XMU_LIBS='-lXmu' - AC_DEFINE(HAVE_XMU) -fi - - -############################################################################### -# -# Check for the SunOS 4.1.x _get_wmShellWidgetClass bug. -# See comp.windows.x FAQ question 124. The right fix is to -# get OpenWindows 3.0 patches 100512-02 and 100573-03. -# -############################################################################### - -if test "$have_xmu" = yes ; then - case "$host" in - *-sunos4*) - AC_CACHE_CHECK([for the SunOS 4.1.x _get_wmShellWidgetClass bug], - ac_cv_sunos_xmu_bug, - [ac_save_LDFLAGS="$LDFLAGS" - if test \! -z "$x_libraries" ; then - LDFLAGS="$LDFLAGS -L$x_libraries" - fi - # Note: this trick never works! (Generally.) - # We're only getting away with using AC_TRY_LINK - # with X libraries because we know it's SunOS. - LDFLAGS="$LDFLAGS -lXmu -lXt -lX11 -lXext -lm" - AC_TRY_LINK(,, - [ac_cv_sunos_xmu_bug=no], - [ac_cv_sunos_xmu_bug=yes]) - LDFLAGS="$ac_save_LDFLAGS"]) - if test "$ac_cv_sunos_xmu_bug" = yes ; then - AC_CACHE_CHECK([whether the compiler understands -static], - ac_cv_ld_static, - [ac_save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -static" - AC_TRY_LINK(,,[ac_cv_ld_static=yes],[ac_cv_ld_static=no]) - LDFLAGS="$ac_save_LDFLAGS"]) - if test "$ac_cv_ld_static" = yes ; then - LDFLAGS="$LDFLAGS -static" - else - LDFLAGS="$LDFLAGS -Bstatic" - fi - fi - ;; - esac -fi - ############################################################################### # # The --with-x-app-defaults option @@ -1438,6 +1275,39 @@ fi +############################################################################### +# +# Handle the --with-fontdir option +# +############################################################################### + +have_fontdir=yes +with_fontdir_req=unspecified +AC_ARG_WITH(fontdir, +[ --with-fontdir=DIR Where to install the extra font files.], + [with_fontdir="$withval"; with_fontdir_req="$withval"], + [with_fontdir=yes]) + +if test x"$with_fontdir" = xyes; then + FONT_DIR='${datarootdir}/fonts/xscreensaver' + if test "$ac_macosx" = yes; then + FONT_DIR='/Library/Fonts' + fi +elif test x"$with_fontdir" = xno; then + FONT_DIR='' +else + # there must be a better way than this... + if test -z "`echo $with_fontdir | sed 's@^/.*@@'`" ; then + # absolute path + FONT_DIR="$with_fontdir" + else + # relative path + FONT_DIR='${datarootdir}/fonts/'"$with_fontdir" + fi +fi + + + ############################################################################### # # Check for the DPMS server extension. @@ -1595,7 +1465,7 @@ fi have_randr=no with_randr_req=unspecified AC_ARG_WITH(randr-ext, -[ --with-randr-ext Include different support for multiple monitors.], +[ --with-randr-ext Include support for multiple monitors.], [with_randr="$withval"; with_randr_req="$withval"],[with_randr=yes]) HANDLE_X_PATH_ARG(with_randr, --with-randr-ext, RANDR) @@ -1633,7 +1503,7 @@ if test "$with_randr" = yes; then AC_DEFINE(HAVE_RANDR) # Now check for version 1.2 in the same libs. - # Try to compile, since on MacOS 10.5.7, headers are older than libs! + # Try to compile, since on macOS 10.5.7, headers are older than libs! AC_CACHE_CHECK([for XRRGetScreenResources], ac_cv_randr_12, [ac_cv_randr_12=no AC_TRY_X_COMPILE([#include @@ -1657,25 +1527,6 @@ elif test "$with_randr" != no; then fi -############################################################################### -# -# Check for XF86MiscSetGrabKeysState (but only bother if we are already -# using other XF86 stuff.) -# -############################################################################### - -have_xf86miscsetgrabkeysstate=no -if test "$have_xf86gamma" = yes -o "$have_xf86vmode" = yes; then - AC_CHECK_X_LIB(Xxf86misc, XF86MiscSetGrabKeysState, - [have_xf86miscsetgrabkeysstate=yes], - [true], -lXext -lX11) - if test "$have_xf86miscsetgrabkeysstate" = yes ; then - SAVER_LIBS="$SAVER_LIBS -lXxf86misc" - AC_DEFINE(HAVE_XF86MISCSETGRABKEYSSTATE) - fi -fi - - ############################################################################### # # Check for the XINPUT server extension. @@ -1684,23 +1535,26 @@ fi have_xinput=no with_xinput_req=unspecified +xinput_halfassed=no AC_ARG_WITH(xinput-ext, -[ --with-xinput-ext Include support for the XInput extension.], +[ --with-xinput-ext Include support for the XInput2 extension.], [with_xinput="$withval"; with_xinput_req="$withval"], [with_xinput=yes]) HANDLE_X_PATH_ARG(with_xinput, --with-xinput-ext, XINPUT) if test "$with_xinput" = yes; then - # first check for Xinput.h - AC_CHECK_X_HEADER(X11/extensions/XInput.h, [have_xinput=yes],, + # first check for Xinput2.h + AC_CHECK_X_HEADER(X11/extensions/XInput2.h, [have_xinput=yes],, [#include ]) # if that succeeded, then check for libXi if test "$have_xinput" = yes; then have_xinput=no - AC_CHECK_X_LIB(Xi, XListInputDevices, - [have_xinput=yes; SAVER_LIBS="$SAVER_LIBS -lXi"], + xinput_halfassed=yes + AC_CHECK_X_LIB(Xi, XISelectEvents, + [have_xinput=yes; xinput_halfassed=no; + SAVER_LIBS="$SAVER_LIBS -lXi"], [true], -lXext -lX11) fi @@ -2027,7 +1881,7 @@ if test "$with_xdbe" = yes; then AC_CHECK_X_HEADER(X11/extensions/Xdbe.h, [have_xdbe=yes],, [#include ]) if test "$have_xdbe" = yes; then - AC_DEFINE(HAVE_DOUBLE_BUFFER_EXTENSION) + AC_DEFINE(HAVE_DOUBLE_BUFFER_EXTENSION) fi elif test "$with_xdbe" != no; then @@ -2036,6 +1890,65 @@ elif test "$with_xdbe" != no; then fi +############################################################################### +# +# Check for the COMPOSITE server extension. +# +############################################################################### + +#have_xcomposite=no +#with_xcomposite_req=unspecified +#AC_ARG_WITH(xcomposite-ext, +#[ --with-xcomposite-ext Include support for the XCOMPOSITE extension.], +# [with_xcomposite="$withval"; with_xcomposite_req="$withval"], +# [with_xcomposite=yes]) +# +#HANDLE_X_PATH_ARG(with_xcomposite, --with-xcomposite-ext, XCOMPOSITE) +# +#if test "$with_xcomposite" = yes; then +# +# AC_CHECK_X_HEADER(X11/extensions/Xcomposite.h, [have_xcomposite=yes],, +# [#include ]) +# if test "$have_xcomposite" = yes; then +# AC_DEFINE(HAVE_XCOMPOSITE_EXTENSION) +# SAVER_LIBS="-lXcomposite $SAVER_LIBS" +# fi +# +#elif test "$with_xcomposite" != no; then +# echo "error: must be yes or no: --with-xcomposite-ext=$with_xshm" +# exit 1 +#fi + + +############################################################################### +# +# Check for the XKB server extension. +# +############################################################################### + +have_xkb=no +with_xkb_req=unspecified +AC_ARG_WITH(xkb-ext, +[ --with-xkb-ext Include support for the X Keyboard extension.], + [with_xkb="$withval"; with_xkb_req="$withval"], + [with_xkb=yes]) + +HANDLE_X_PATH_ARG(with_xkb, --with-xkb-ext, XKB) + +if test "$with_xkb" = yes; then + + AC_CHECK_X_HEADER(X11/XKBlib.h, [have_xkb=yes],, + [#include ]) + if test "$have_xkb" = yes; then + AC_DEFINE(HAVE_XKB) + fi + +elif test "$with_xkb" != no; then + echo "error: must be yes or no: --with-xkb-ext=$with_xshm" + exit 1 +fi + + ############################################################################### # # Check for HP XHPDisableReset and XHPEnableReset. @@ -2059,10 +1972,10 @@ AC_EGREP_X_HEADER(XHPDisableReset, X11/XHPlib.h, have_proc_interrupts=no with_proc_interrupts_req=unspecified AC_ARG_WITH(proc-interrupts, -[ --with-proc-interrupts Include support for consulting the /proc/interrupts - file to notice keyboard activity.], +[ --with-proc-interrupts Include support for consulting /proc/interrupts to + notice activity on PS/2 keyboards and mice.], [with_proc_interrupts="$withval"; with_proc_interrupts_req="$withval"], - [with_proc_interrupts=yes]) + [with_proc_interrupts=no]) if test "$with_proc_interrupts" = yes; then @@ -2099,10 +2012,11 @@ fi # ############################################################################### +setuid_auth=no have_proc_oom=no with_proc_oom_req=unspecified AC_ARG_WITH(proc-oom, -[ --with-proc-oom Include support for disabling the OOM-killer.], +[ --with-proc-oom Include support to duck the out-of-memory killer.], [with_proc_oom="$withval"; with_proc_oom_req="$withval"], [with_proc_oom=yes]) @@ -2128,6 +2042,9 @@ elif test "$with_proc_oom_req" = unspecified; then if test "$have_proc_oom" = yes; then AC_DEFINE(HAVE_PROC_OOM) + # Only root can write to /proc/$$/oom_score_adj, even though it's us. + AC_MSG_RESULT(enabling setuid to opt out of OOM-killer.) + setuid_auth=yes fi elif test "$with_proc_oom" != no; then @@ -2199,9 +2116,9 @@ if test "$with_systemd" = yes; then # we have the headers, now check for the libraries have_systemd=no systemd_halfassed=yes - AC_MSG_RESULT(checking for libsystemd usability...) - AC_CHECK_X_LIB(c, sd_bus_open_system, [have_systemd=yes],, + AC_CHECK_X_LIB(c, sd_bus_open_system, + [have_systemd=yes; systemd_halfassed=no],, $ac_systemd_config_libs -lX11 -lXext -lm) fi @@ -2213,9 +2130,11 @@ fi if test "$have_systemd" = yes; then INCLUDES="$INCLUDES $ac_systemd_config_cflags" EXES_SYSTEMD='$(EXES_SYSTEMD)' + SYSTEMD_LIBS="$ac_systemd_config_libs" AC_DEFINE(HAVE_LIBSYSTEMD) else EXES_SYSTEMD='' + SYSTEMD_LIBS='' fi @@ -2234,9 +2153,9 @@ AC_ARG_ENABLE(locking, [], # This is documented elsewhere because of --enable/--with option sorting. [enable_locking="$enableval"], [if test "$ac_macosx" = yes; then - # We can't lock on MacOS X, so default to not compiling in support for it. + # We can't lock on macOS, so default to not compiling in support for it. # But allow --enable-locking to override that, so I can debug Linux locking - # under MacOS X11. + # under macOS X11. enable_locking=no else enable_locking=yes @@ -2259,7 +2178,7 @@ fi AC_ARG_ENABLE(root-passwd, [], # This is documented elsewhere because of --enable/--with option sorting. - [enable_root_passwd="$enableval"],[enable_root_passwd=yes]) + [enable_root_passwd="$enableval"],[enable_root_passwd=no]) if test "$enable_root_passwd" = yes; then AC_DEFINE(ALLOW_ROOT_PASSWD) true @@ -2277,8 +2196,12 @@ fi case "$host" in *-solaris*) - # Solaris systems tend to come with PAM misconfigured. - # Don't build it by default, even if the headers exist. + # Solaris systems tend to have the PAM runtime misconfigured and unusable. + with_pam_default=no + ;; + *-freebsd* ) + # FreeBSD's PAM implementation requires the calling process to be setuid + # the whole time, which is unacceptable. with_pam_default=no ;; *) @@ -2296,7 +2219,7 @@ AC_ARG_WITH(pam,[ Screen Locking Options: --disable-locking Do not allow locking of the display at all. - --with-pam Include support for PAM (Pluggable Auth Modules.)], + --with-pam Include support for PAM (Pluggable Auth Modules).], [with_pam="$withval"; with_pam_req="$withval"],[with_pam=$with_pam_default]) AC_ARG_WITH([pam_service_name], @@ -2378,12 +2301,13 @@ if test "$enable_locking" = yes -a "$with_pam" = yes; then AC_CACHE_VAL(ac_cv_pam_fail_delay, [ac_save_LDFLAGS="$LDFLAGS" LDFLAGS="-lpam" - AC_TRY_LINK([#include ], - [pam_handle_t *pamh = 0; + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([#include ], + [pam_handle_t *pamh = 0; unsigned int usec = 1; - int status = pam_fail_delay (pamh, usec);], - [ac_pam_fail_delay=yes], - [ac_pam_fail_delay=no]) + int status = pam_fail_delay (pamh, usec);])], + [ac_pam_fail_delay=yes], + [ac_pam_fail_delay=no]) ac_cv_pam_fail_delay=$ac_pam_fail_delay, LDFLAGS=$ac_save_LDFLAGS]) @@ -2461,7 +2385,7 @@ if test "$enable_locking" = yes -a "$with_kerberos" = yes; then PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err" - # jwz: MacOS X uses -lkrb5, but not -lcrypt + # jwz: macOS uses -lkrb5, but not -lcrypt AC_CHECK_X_LIB(crypt, crypt, [PASSWD_LIBS="$PASSWD_LIBS -lcrypt"]) elif test "$have_kerberos" = yes ; then @@ -2484,8 +2408,6 @@ fi # ############################################################################### -need_setuid=no - have_shadow=no with_shadow_req=unspecified @@ -2522,7 +2444,7 @@ if test "$with_shadow" = yes ; then if test "$ac_cv_sun_adjunct" = yes; then have_shadow_adjunct=yes have_shadow=yes - need_setuid=yes + setuid_auth=yes fi fi @@ -2552,7 +2474,7 @@ if test "$with_shadow" = yes ; then if test $ac_cv_enhanced_passwd = yes; then have_shadow_enhanced=yes have_shadow=yes - need_setuid=yes + setuid_auth=yes # On SCO, getprpwnam() is in -lprot (which uses nap() from -lx) # (I'm told it needs -lcurses too, but I don't understand why.) @@ -2587,7 +2509,7 @@ if test "$with_shadow" = yes ; then if test "$ac_cv_hpux_passwd" = yes; then have_shadow_hpux=yes have_shadow=yes - need_setuid=yes + setuid_auth=yes # on HPUX, bigcrypt is in -lsec AC_CHECK_LIB(sec, bigcrypt, [PASSWD_LIBS="$PASSWD_LIBS -lsec"]) @@ -2615,7 +2537,35 @@ if test "$with_shadow" = yes ; then ac_cv_master_passwd=no fi]) if test "$ac_cv_master_passwd" = yes; then - need_setuid=yes + setuid_auth=yes + fi +fi + + +############################################################################### +# +# Check for OpenBSD-style shadow passwords. +# It's getpwnam_shadow instead of getpwnam, and it only works as root. +# +############################################################################### + +if test "$with_shadow" = yes ; then + AC_CACHE_CHECK([for OpenBSD-style shadow passwords], ac_cv_pwnam_shadow, + [AC_TRY_X_COMPILE([#include + #include + #include + #include ], + [struct spwd *p = getspnam_shadow("nobody"); + const char *pw = p->pw_passwd;], + [ac_cv_pwnam_shadow=yes], + [ac_cv_pwnam_shadow=no])]) + if test "$ac_cv_pwnam_shadow" = yes; then + have_pwnam_shadow=yes + + # If we also have PAM, assume that we don't need to be setuid. + if test $have_pam != yes; then + setuid_auth=yes + fi fi fi @@ -2639,7 +2589,11 @@ if test "$with_shadow" = yes ; then [ac_cv_shadow=no])]) if test "$ac_cv_shadow" = yes; then have_shadow=yes - need_setuid=yes + + # If we also have PAM, assume that we don't need to be setuid. + if test $have_pam != yes; then + setuid_auth=yes + fi # On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc. have_getspnam=no @@ -2670,14 +2624,55 @@ if test "$enable_locking" = yes ; then fi -# Most of the above shadow mechanisms will have set need_setuid to yes, +############################################################################### +# +# Strongly suspect that this hasn't been used in years. Also, the same +# goal is achieved by xscreensaver-auth in XScreenSaver 6. -- jwz, 2021 +# +# Check for external password helper +# On SuSE in 1993, instead of having xscreensaver be a setuid program, +# they fork an external program that takes the password on stdin, and +# returns true if that password is a valid one. Then only that smaller +# program needs to be setuid. +# +# (Note that this external program is not a GUI: the GUI is still +# all in xscreensaver itself; the external program just does auth.) +# +############################################################################### + +#have_passwd_helper=no +#with_passwd_helper_req=unspecified +# +#AC_ARG_WITH(passwd-helper, +#[ --with-passwd-helper Include support for external password verification.], +# [with_passwd_helper="$withval"; with_passwd_helper_req="$withval"],[with_passwd_helper=no]) +## no HANDLE_X_PATH_ARG for this one +# +#if test "$enable_locking" = no ; then +# with_passwd_helper_req=no +# with_passwd_helper=no +#fi +# +#case "$with_passwd_helper" in +# ""|no) : ;; +# /*) +# AC_DEFINE_UNQUOTED(PASSWD_HELPER_PROGRAM, "$with_passwd_helper") +# have_passwd_helper=yes;; +# *) +# echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2 +# exit 1 +#esac + + + +# Most of the above shadow mechanisms will have set setuid_auth to yes, # if they were found. But, on some systems, we need setuid even when # using plain old vanilla passwords. # -if test "$enable_locking" = yes ; then +if test "$enable_locking" = yes -a "$have_pam" = no ; then case "$host" in - *-hpux* | *-aix* | *-netbsd* | *-freebsd* | *-openbsd* ) - need_setuid=yes + *-hpux* | *-aix* | *-netbsd* | *-freebsd* ) + setuid_auth=yes ;; esac fi @@ -2691,48 +2686,11 @@ elif test "$have_shadow_hpux" = yes ; then AC_DEFINE(HAVE_HPUX_PASSWD) elif test "$have_shadow" = yes ; then AC_DEFINE(HAVE_SHADOW_PASSWD) +elif test "$have_pwnam_shadow" = yes ; then + AC_DEFINE(HAVE_PWNAM_SHADOW_PASSWD) fi -############################################################################### -# -# Check for external password helper -# On SuSE, instead of having xscreensaver be a setuid program, they -# fork an external program that takes the password on stdin, and -# returns true if that password is a valid one. Then only that -# smaller program needs to be setuid. -# -# (Note that this external program is not a GUI: the GUI is still -# all in xscreensaver itself; the external program just does auth.) -# -############################################################################### - -have_passwd_helper=no -with_passwd_helper_req=unspecified - -AC_ARG_WITH(passwd-helper, -[ --with-passwd-helper Include support for an external password - verification helper program.], - [with_passwd_helper="$withval"; with_passwd_helper_req="$withval"],[with_passwd_helper=no]) -# no HANDLE_X_PATH_ARG for this one - -if test "$enable_locking" = no ; then - with_passwd_helper_req=no - with_passwd_helper=no -fi - -case "$with_passwd_helper" in - ""|no) : ;; - /*) - AC_DEFINE_UNQUOTED(PASSWD_HELPER_PROGRAM, "$with_passwd_helper") - have_passwd_helper=yes;; - *) - echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2 - exit 1 -esac - - - ############################################################################### # # Check for -lgtk (and Gnome stuff) @@ -2769,20 +2727,6 @@ if test "$with_gtk" != yes -a "$with_gtk" != no ; then fi -parse_gtk_version_string() { - # M4 sucks!! - changequote(X,Y) - maj=`echo $ac_gtk_version_string | sed -n 's/\..*//p'` - min=`echo $ac_gtk_version_string | sed -n 's/[^.]*\.\([^.]*\).*/\1/p'` - changequote([,]) - ac_gtk_version=`echo "$maj * 1000 + $min" | bc` - if test -z "$ac_gtk_version"; then - ac_gtk_version=unknown - ac_gtk_version_string=unknown - fi -} - -jurassic_gtk=no gtk_halfassed=no if test "$with_gtk" = yes; then @@ -2798,16 +2742,11 @@ if test "$with_gtk" = yes; then if test "$have_gtk" = no; then if test -n "$ac_gtk_version_string" ; then - gtk_halfassed="$ac_gtk_version_string" + gtk_halfassed=yes gtk_halfassed_lib="$req" fi fi - if test "$have_gtk" = yes; then - parse_gtk_version_string - jurassic_gtk=no - fi - if test "$have_gtk" = yes; then AC_CACHE_CHECK([for Gtk includes], ac_cv_gtk_config_cflags, [ac_cv_gtk_config_cflags=`$pkg_config --cflags $pkgs`]) @@ -2818,7 +2757,6 @@ if test "$with_gtk" = yes; then ac_gtk_config_cflags=$ac_cv_gtk_config_cflags ac_gtk_config_libs=$ac_cv_gtk_config_libs - GTK_EXTRA_OBJS="" GTK_DATADIR="" if test "$have_gtk" = yes; then GTK_DATADIR=`$pkg_config --variable=prefix gtk+-2.0` @@ -3070,28 +3008,9 @@ case "$with_login_manager_req" in ;; - /*) - # absolute path specified on cmd line - set dummy $with_login_manager_req ; login_manager_tmp=$2 - AC_MSG_CHECKING([for $login_manager_tmp]) - if test -x "$login_manager_tmp" ; then - AC_MSG_RESULT(yes) - else - AC_MSG_RESULT(no) - with_login_manager="" - fi - ;; - *) - # relative path specified on cmd line - set dummy $with_login_manager_req ; login_manager_tmp=$2 - unset ac_cv_path_login_manager_tmp # don't cache - AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, []) - if test -z "$login_manager_tmp" ; then - with_login_manager="" - else - with_login_manager="$login_manager_tmp" - fi + # Just believe whatever command was specified. + with_login_manager="$with_login_manager_req" ;; esac ac_cv_login_manager_program="$with_login_manager" @@ -3140,25 +3059,37 @@ case "$with_imagedir" in yes) with_imagedir="" - #### Could use some more defaults here... + fallback_imgdir="" for dd in \ - "/usr/share/rpd-wallpaper" \ - "/usr/share/backgrounds/images/" \ - "/usr/share/wallpapers/" \ - "/Library/Desktop Pictures/" \ + "/usr/share/rpd-wallpaper/" \ + "/usr/share/backgrounds/images/" \ + "/usr/share/wallpapers/" \ + "/usr/share/backgrounds/" \ + "/usr/share/pixmaps/backgrounds/" \ + "/usr/share/lxde/wallpapers/" \ + "/Library/Desktop Pictures/" \ ; do if test -z "$with_imagedir"; then AC_MSG_CHECKING([for image directory $dd]) - if test -d "$dd" ; then - AC_MSG_RESULT(yes) - with_imagedir="$dd" + if test -d "$dd"; then + if ( ls "$dd" | grep -q ... ) >&- 2>&- ; then + AC_MSG_RESULT(yes) + with_imagedir="$dd" + else + AC_MSG_RESULT(empty) + if test -z "$fallback_imgdir"; then + fallback_imgdir="$dd" + fi + fi else AC_MSG_RESULT(no) fi fi done - - ;; + if test -z "$with_imagedir"; then + with_imagedir="$fallback_imgdir" + fi +;; no) with_imagedir="" ;; @@ -3261,29 +3192,90 @@ AC_ARG_WITH(browser, [with_browser=no ]) # no HANDLE_X_PATH_ARG for this one -case "$with_browser" in - no ) - ;; - * ) - WITH_BROWSER=$with_browser - gnome_open_program=$with_browser - AC_MSG_CHECKING([for browser $with_browser]) - with_browser_fullpath=`which $with_browser 2>/dev/null` - case $with_browser_fullpath in - /* ) - AC_MSG_RESULT(yes) - have_browser=yes - ;; - * ) - AC_MSG_RESULT(no) -# Only warning: we don't want to install all packages for the -# dependency of the browser in building stage... - echo "WARNING: browser not found: --with-browser=$with_browser" - ;; - esac - ;; -esac -ac_cv_browser="$with_browser" +case "$with_browser" in + no ) + ;; + * ) + WITH_BROWSER=$with_browser + gnome_open_program=$with_browser + AC_MSG_CHECKING([for browser $with_browser]) + with_browser_fullpath=`which $with_browser 2>/dev/null` + case $with_browser_fullpath in + /* ) + AC_MSG_RESULT(yes) + have_browser=yes + ;; + * ) + AC_MSG_RESULT(no) +# Only warning: we don't want to install all packages for the +# dependency of the browser in building stage... + echo "WARNING: browser not found: --with-browser=$with_browser" + ;; + esac + ;; +esac +ac_cv_browser="$with_browser" + + +############################################################################### +# +# Check for pthreads. Must come before checking for OpenGL, +# since some versions of OpenGL require it. +# +############################################################################### + +have_pthread=no +with_pthread_req=unspecified + +# AX_PTHREAD is from the GNU Autoconf Archive. +# https://savannah.gnu.org/projects/autoconf-archive/ +m4_include(ax_pthread.m4) + +AC_ARG_WITH([pthread], +[], # This is documented after --with-gl in --with-xft. + [with_pthread="$withval"; with_pthread_req="$withval"], + [with_pthread=yes]) + +if test "$with_pthread" = yes; then + # AX_PTHREAD might want a different compiler. + AX_PTHREAD( + [if test "$CC" = "$PTHREAD_CC" -o -z "$ac_original_cc"; then + have_pthread=yes + else + ac_prog_cc_no_pthread=yes + fi + ]) + + if test "$have_pthread" = yes; then + AC_DEFINE([HAVE_PTHREAD]) + CC="$PTHREAD_CC" + fi +fi + + +############################################################################### +# +# Handle --with-gles +# Must come before --with-gl +# +############################################################################### + +with_jwzgles_req=unspecified +have_jwzgles=no +AC_ARG_WITH(gles, +[], # This is documented after --with-gl + [with_jwzgles="$withval"; with_jwzgles_req="$withval"],[with_jwzgles=no]) + +HANDLE_X_PATH_ARG(with_jwzgles, --with-gles, JWZGLES) + +if test "$with_jwzgles" = yes; then + have_jwzgles=yes + JWZGLES_OBJS='$(JWXYZ_BIN)/jwzgles.o' + AC_MSG_RESULT(emulating OpenGL 1.3 in terms of OpenGLES 1.x.) +elif test "$with_jwzgles" != no; then + echo "error: must be yes or no: --with-gles=$with_jwzgles" + exit 1 +fi ############################################################################### @@ -3303,226 +3295,251 @@ AC_ARG_WITH(gl, [ Graphics Options: - --with-gl Build those demos which depend on OpenGL.], + --with-gl Build those demos which depend on OpenGL. + --with-gles Emulate OpenGL 1.3 in terms of OpenGL ES 1.x.], [with_gl="$withval"; with_gl_req="$withval"],[with_gl=yes]) HANDLE_X_PATH_ARG(with_gl, --with-gl, GL) -ac_mesagl_version=unknown -ac_mesagl_version_string=unknown +# Some GL libraries require pthreads, so use the pthreads flags when +# testing them, then set them back after. +# +ac_save_pthreads_CFLAGS="$CFLAGS" +ac_save_pthreads_LIBS="$LIBS" +CFLAGS="$PTHREAD_CFLAGS $CFLAGS" +LIBS="$PTHREAD_LIBS $LIBS" if test "$with_gl" = yes; then - AC_CHECK_X_HEADER(GL/gl.h, have_gl=yes, have_gl=no) - if test "$have_gl" = yes ; then - AC_CHECK_X_HEADER(GL/glx.h, have_gl=yes, have_gl=no, - [#include ]) + AC_CHECK_X_HEADER(GL/gl.h, have_gl=yes, have_gl=no); + if test "$have_gl" = yes; then + AC_CHECK_X_HEADER(GL/glu.h, have_gl=yes, have_gl=no); fi +fi - # If we have the headers, try and figure out which vendor it's from. +if test "$with_gl" = yes; then + # + # Since the OpenGL and GLES specifications are a complete dumpster fire, + # it's not easy to figure out how what libraries to use. + # + # OpenGLES library names: + # + # 1.x: libGLESv1_CM + # 2.x: libGLESv2 + # 3.x: libGLESv2 on Windows, libGLESv3 on Android + # + # On modern Linux systems, these libraries exist: + # + # libGL - a superset of everything up to and including OpenGL 4.6 + # libGLESv1_CM - OpenGLES 1.1, meaning it omits much of OpenGL 1.3 + # libGLESv2 - OpenGLES 2 and 3, meaning it omits even more of OpenGL 1.3 + # + # Since Linux systems support OpenGL 1.3, those link against only libGL. + # + # Unless we are using --with-gles on Linux, in which case we are attempting + # to simulate a system that does not natively support OpenGL 1.3. In that + # case, we use the v1 and/or v2 libraries instead. # - if test "$have_gl" = yes ; then + # Common practice on Android seems to be to link against the v1, v2 and v3 + # libraries in order, and then do runtime checks to see which set of + # functions is actually supported by the runtime. Just because you linked + # against a GLES3 library doesn't mean that the hardware supports it: most + # of these functions are just syscall-like stubs. + # + # See the commentary atop jwxyz/jwzgles.c for discussion of OpenGL versions. + # + if test "$have_gl" = yes; then + have_gl=no + + if test "$have_jwzgles" = yes; then + + # Only check for the v1/2/3 libraries on Linux when using --with-gles + # to emulate a system that does not natively support OpenGL 1.3. + + # Check for GLES 3.x + AC_CHECK_X_LIB(GLESv3, glDrawElements, + [have_gl=yes + gl_lib_1="GLESv3" + GL_LIBS="-lGLESv3 $GL_LIBS"], + [], $GL_LIBS -lm) + + # Check for GLES 2.x + AC_CHECK_X_LIB(GLESv2, glDrawElements, + [have_gl=yes + gl_lib_1="GLESv2" + GL_LIBS="-lGLESv2 $GL_LIBS"], + [], $GL_LIBS -lm) + + # Check for GLES 1.x + AC_CHECK_X_LIB(GLESv1_CM, glDrawElements, + [have_gl=yes + gl_lib_1="GLESv1_CM" + GL_LIBS="-lGLESv1_CM $GL_LIBS"], + [], $GL_LIBS -lm) + + else # $have_jwzgles = no + + # Check for OpenGL 1.x and/or OpenGL 4.x + AC_CHECK_X_LIB(GL, glEnable, + [have_gl=yes + gl_lib_1="GL" + GL_LIBS="-lGL $GL_LIBS"], + [], $GL_LIBS -lm) + + # Check for MesaGL 1.x, but only if libGL doesn't exist. + if test "$have_gl" = no; then + AC_CHECK_X_LIB(MesaGL, glEnable, + [have_gl=yes + gl_lib_1="MesaGL" + GL_LIBS="-lMesaGL $GL_LIBS"], + [], $GL_LIBS -lm) + fi + fi + fi - # We need to know whether it's MesaGL so that we know which libraries - # to link against. - # - AC_CACHE_CHECK([whether GL is really MesaGL], ac_cv_have_mesa_gl, - [ac_cv_have_mesa_gl=no - if test "$ac_macosx" = no; then - # WTF! MacOS 10.5.0 ships the Mesa GL headers! - # It's not really Mesa, is it? - AC_EGREP_X_HEADER(Mesa|MESA, GL/glx.h, [ac_cv_have_mesa_gl=yes]) - fi]) - ac_have_mesa_gl=$ac_cv_have_mesa_gl - - gl_lib_1="" - GL_LIBS="" - - if test "$ac_macosx" = yes; then - - # Without these, every link against libGL gets a bunch of useless - # warnings. - # - osx_crud="-bind_at_load -multiply_defined suppress" - AC_MSG_RESULT(adding "$osx_crud" to GL_LIBS) - GL_LIBS="$GL_LIBS $osx_crud" - unset osx_crud + # Figure out whether the GLU functions are in the main GL libraries or + # in -lGLU. Since Android does not have GLU, we don't link against libGLU + # when using --with-gles on Linux. + # + if test "$have_gl" = yes -a "$have_jwzgles" = no; then + AC_CHECK_X_LIB($gl_lib_1, gluBuild2DMipmaps, + [], + [have_gl=no], $GL_LIBS -lm) + if test "$have_gl" = no; then + AC_CHECK_X_LIB(GLU, gluBuild2DMipmaps, + [have_gl=yes + GL_LIBS="-lGLU $GL_LIBS"], + [have_gl=no + gl_halfassed=yes], + $GL_LIBS -lm) + fi + fi - # New lossage in 10.5.0: without this, we get: - # ld: cycle in dylib re-exports with /usr/X11/lib/libGL.dylib - # - osx_crud="/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib" - osx_crud="-Wl,-dylib_file,${osx_crud}:${osx_crud}" + if test "$have_gl" = yes; then - AC_MSG_RESULT(adding "$osx_crud" to GL_LIBS) - GL_LIBS="$GL_LIBS $osx_crud" - unset osx_crud + AC_DEFINE(HAVE_GL) - # New lossage in 10.6.8: we can't allow -L/opt/local/lib to be in the - # link line, or at runtime XQueryExtension gets a segv due to some kind - # of library version skew. Libs must come from /usr/X11/lib even if - # $prefix and/or $exec_prefix are set to /opt/local/. - # - AC_MSG_RESULT(omitting "$libdir" from LDFLAGS) - libdir='' + # OpenGL 1.0 didn't have multiple textures. + AC_CHECK_X_LIB($gl_lib_1, glBindTexture, [AC_DEFINE(HAVE_GLBINDTEXTURE)], + [true], $GL_LIBS -lX11 -lXext -lm) - # Looks like as of OSX 10.12, gcc can't do ObjC. - OBJCC="clang -Wall" + # Check for native GLES1 + AC_CHECK_X_LIB($gl_lib_1, glBindBuffer, + [AC_DEFINE(HAVE_GLES)], + [true], $GL_LIBS -lX11 -lXext -lm) + # Check for GLSL and GLES2 + AC_CHECK_X_HEADER(GL/glext.h, have_glext=yes, have_glext=no, + [#include ]) + if test "$have_glext" = yes ; then + AC_CHECK_X_LIB($gl_lib_1, glUseProgram, + [AC_DEFINE(HAVE_GLSL) + AC_DEFINE(HAVE_GLES2)], + [], + $GL_LIBS -lX11 -lXext -lm) fi + # Check for GLES3 + AC_CHECK_X_LIB($gl_lib_1, glBlitFramebuffer, + [AC_DEFINE(HAVE_GLES3)], + [], + $GL_LIBS -lX11 -lXext -lm) - # Some versions of MesaGL are compiled to require -lpthread. - # So if the Mesa headers exist, and -lpthread exists, then always - # link -lpthread after the Mesa libs (be they named -lGL or -lMesaGL.) - # - # Oftentimes, AX_PTHREAD will bring in -lpthread as well; but that ends - # up before -l(Mesa)GL, instead of after where it would belong. - # - if test "$ac_have_mesa_gl" = yes; then - AC_CHECK_LIB(pthread, pthread_create, [GL_LIBS="-lpthread"], [],) + if test "$have_jwzgles" = yes; then + AC_DEFINE(HAVE_JWZGLES) + AC_DEFINE(HAVE_GLES) fi + fi - # If we have Mesa headers, check to see if we can link against -lMesaGL. - # If we don't have Mesa headers, or we don't have -lMesaGL, try -lGL. - # Else, warn that GL is busted. (We have the headers, but no libs.) - # - if test "$ac_have_mesa_gl" = yes ; then - AC_CHECK_X_LIB(MesaGL, glXCreateContext, - [gl_lib_1="MesaGL" - GL_LIBS="-lMesaGL -lMesaGLU $VIDMODE_LIBS $GL_LIBS"], - [], -lMesaGLU $GL_LIBS -lX11 -lXext $VIDMODE_LIBS -lm) - fi +elif test "$with_gl" != no; then + echo "error: must be yes or no: --with-gl=$with_gl" + exit 1 +fi - if test "$gl_lib_1" = "" ; then - AC_CHECK_X_LIB(GL, glXCreateContext, - [gl_lib_1="GL" - GL_LIBS="-lGL -lGLU $VIDMODE_LIBS $GL_LIBS"], - [], -lGLU $GL_LIBS -lX11 -lXext $VIDMODE_LIBS -lm) - fi - if test "$gl_lib_1" = "" ; then - # we have headers, but no libs -- bail. - have_gl=no - ac_have_mesa_gl=no - gl_halfassed=yes - else - # linking works -- we can build the GL hacks. - AC_DEFINE(HAVE_GL) - if test "$ac_have_mesa_gl" = yes ; then - AC_DEFINE(HAVE_MESA_GL) - fi - fi - fi +############################################################################### +# +# Handle --with-glx +# +############################################################################### +have_glx=no +have_egl=no +with_egl_req=unspecified +AC_ARG_WITH(glx, +[ --with-glx Use GLX to interface OpenGL and X11 instead of EGL.], + [with_egl="$withval"; with_egl_req="$withval"], + [with_glx=no]) - # Now that we know we have GL headers and libs, do some more GL testing. - # +HANDLE_X_PATH_ARG(with_glx, --with-glx, GLX) - if test "$have_gl" = yes ; then - # If it's MesaGL, we'd like to issue a warning if the version number - # is less than or equal to 2.6, because that version had a security bug. - # - if test "$ac_have_mesa_gl" = yes; then - - AC_CACHE_CHECK([MesaGL version number], ac_cv_mesagl_version_string, - [cat > conftest.$ac_ext < -#ifndef MESA_MAJOR_VERSION -# include -# ifdef XMESA_MAJOR_VERSION - /* Around Mesa 3.2, they took out the Mesa version number, so instead, - we have to check the XMesa version number (the number of the X protocol - support, which seems to be the same as the Mesa version number.) - */ -# define MESA_MAJOR_VERSION XMESA_MAJOR_VERSION -# define MESA_MINOR_VERSION XMESA_MINOR_VERSION -# else - /* Oh great. Some time after 3.4, they took out the xmesa.h header file, - so we have no way of telling what version of Mesa this is at all. - So, we'll guess that the osmesa version (the "offscreen protocol") - is less than or equal to the real mesa version number. Except that - if OSmesa is 3.3, assume at least Mesa 3.4, since OSmesa was 3.3 in - Mesa 3.4. And Mesa 3.3 had xmesa.h. What a complete load of shit! - */ -# include -# define MESA_MAJOR_VERSION OSMESA_MAJOR_VERSION -# define MESA_MINOR_VERSION OSMESA_MINOR_VERSION or newer, probably? -# if OSMESA_MAJOR_VERSION == 3 && OSMESA_MINOR_VERSION == 3 -# undef MESA_MINOR_VERSION -# define MESA_MINOR_VERSION 4 or newer, probably? -# endif -# endif -#endif -configure: MESA_MAJOR_VERSION MESA_MINOR_VERSION -EOF +if test "$with_glx" = yes; then + AC_CHECK_X_HEADER(GLX/glx.h, have_glx=yes, have_glx=no) +elif test "$with_glx" != no; then + echo "error: must be yes or no: --with-glx=$with_glx" + exit 1 +fi - ac_save_CPPFLAGS="$CPPFLAGS" - if test \! -z "$includedir" ; then - CPPFLAGS="$CPPFLAGS -I$includedir" - fi - CPPFLAGS="$CPPFLAGS $X_CFLAGS" - - mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&AC_FD_CC | grep configure:` - - # M4 sucks!! - changequote(X,Y) - mglv=`echo "$mglv" | sed -n \ - 's/^configure: *\([0-9][0-9]*\) *\([0-9].*\)$/\1.\2/p'` - changequote([,]) - - rm -f conftest.$ac_ext - - CPPFLAGS="$ac_save_CPPFLAGS" - - if test "$mglv" = ""; then - ac_mesagl_version=unknown - ac_mesagl_version_string=unknown - else - ac_mesagl_version_string="$mglv" - # M4 sucks!! - changequote(X,Y) - maj=`echo "$mglv" | sed -n 's/^\([0-9][0-9]*\)\..*$/\1/p'` - min=`echo "$mglv" | sed -n 's/^.*\.\([0-9][0-9]*\).*$/\1/p'` - changequote([,]) - ac_mesagl_version=`echo "$maj * 1000 + $min" | bc` - if test -z "$ac_mesagl_version"; then - ac_mesagl_version=unknown - ac_mesagl_version_string=unknown - fi - fi - ac_cv_mesagl_version=$ac_mesagl_version - ac_cv_mesagl_version_string=$ac_mesagl_version_string - ]) - ac_mesagl_version=$ac_cv_mesagl_version - ac_mesagl_version_string=$ac_cv_mesagl_version_string - fi +if test "$have_gl" = yes; then + # See if GLX functions are in -LGL. + AC_CHECK_X_LIB($gl_lib_1, glXCreateContext, + [have_glx=yes], + [have_glx=no], + $GL_LIBS -lm) + + # See if EGL functions are in -LGL. + egl_lib="" + AC_CHECK_X_LIB($gl_lib_1, eglCreatePlatformWindowSurface, + [have_egl=yes], + [have_egl=no], + $GL_LIBS -lm) + if test "$have_egl" = no; then + # See if EGL functions are in -lEGL. + AC_CHECK_X_LIB(EGL, eglCreatePlatformWindowSurface, + [have_egl=yes + egl_lib="EGL"], + [have_egl=no], + $GL_LIBS -lm) + fi - # Check for OpenGL 1.1 features. - # - AC_CHECK_X_LIB($gl_lib_1, glBindTexture, [AC_DEFINE(HAVE_GLBINDTEXTURE)], - [true], $GL_LIBS -lX11 -lXext -lm) + # If both GLX and EGL exist, use GLX only if requested. + if test "$with_glx" = yes -a "$have_glx" = yes; then + have_egl=no + fi - # Check for OpenGL GLSL features. - # - AC_CHECK_X_HEADER(GL/glext.h, have_glext=yes, have_glext=no, - [#include ]) - if test "$have_glext" = yes ; then - AC_CHECK_X_LIB($gl_lib_1, glUseProgram, [AC_DEFINE(HAVE_GLSL)], - [true], $GL_LIBS -lX11 -lXext -lm) + if test "$have_egl" = yes; then + AC_DEFINE(HAVE_EGL) + if test \! -z "$egl_lib"; then + GL_LIBS="-l$egl_lib $GL_LIBS" fi fi -elif test "$with_gl" != no; then - echo "error: must be yes or no: --with-gl=$with_gl" - exit 1 + # One of them is required + if test "$have_egl" = no -a "$have_glx" = no; then + have_gl=no + gl_halfassed=yes + fi + + # --with-gles means that we are emulating a system that supports GLES but + # does not support OpenGL 1.3 (e.g., using Linux to simulate an Android-like + # environment). On such a system, GLE is required and GLX wouldn't exist. + # There is no way to request a GLES 3.0 runtime context using GLX. + # + if test "$have_jwzgles" = yes -a "$have_egl" = no; then + AC_MSG_WARN([Using --with-glx and --with-gles together is a bad idea.]) + fi + fi +# Restore flags after testing OpenGL libraries. +# +CFLAGS="$ac_save_pthreads_CFLAGS" +LIBS="$ac_save_pthreads_LIBS" + + ############################################################################### # # Check for -lgle. @@ -3533,7 +3550,7 @@ have_gle=no with_gle_req=unspecified gle_halfassed=no AC_ARG_WITH(gle, -[ --with-gle Build those demos which depend on GLE (extrusion).], +[ --with-gle Include support for the GL Extrusion library.], [with_gle="$withval"; with_gle_req="$withval"],[with_gle=yes]) HANDLE_X_PATH_ARG(with_gle, --with-gle, GLE) @@ -3608,29 +3625,6 @@ elif test "$with_gle" != no; then fi -############################################################################### -# -# Handle --with-gles -# -############################################################################### - -with_gles_req=unspecified -AC_ARG_WITH(gles, -[ --with-gles Target OpenGL ES 1.x API instead of OpenGL 1.3.], - [with_gles="$withval"; with_gles_req="$withval"],[with_gles=no]) - -HANDLE_X_PATH_ARG(with_gles, --with-gles, JWZGLES) - -if test "$with_gles" = yes; then - have_gles=yes - AC_DEFINE(HAVE_JWZGLES) - JWZGLES_OBJS='$(JWXYZ_BIN)/jwzgles.o' - AC_MSG_RESULT(using OpenGL ES compatiblity shim) -elif test "$with_gles" != no; then - echo "error: must be yes or no: --with-gles=$with_gles" - exit 1 -fi - ############################################################################### # # Check for -ljpeg @@ -3713,7 +3707,7 @@ fi # # Check for -lgdk_pixbuf. # These tests are for gdk_pixbuf usage of the hacks, -# not xscreensaver-demo (thus we have to test again to get +# not xscreensaver-settings (thus we have to test again to get # the libraries right: don't want to pull in all of GTK # for the hacks.) # @@ -3854,7 +3848,8 @@ have_xft=no with_xft_req=unspecified xft_halfassed=no AC_ARG_WITH(xft, -[ --with-xft Include support for the X Freetype library.], +[ --with-xft Include support for the X Freetype library. + --with-pthread Enables POSIX threads, for SMP support.], [with_xft="$withval"; with_xft_req="$withval"], [with_xft=yes]) @@ -3923,46 +3918,6 @@ else fi -# Also check for the standard X11 bitmap fonts, since Debian likes to not -# install any of those by default. The unlock dialog requires them. -# -have_bitmap_fonts=no -ff='helvB14.pcf.gz helvB14-ISO8859-1.pcf.gz' -AC_MSG_CHECKING(for bitmap font files) -for d in /usr/share/fonts/X11 \ - /usr/share/X11/fonts \ - /opt/X11/share/fonts \ -; do - for r in 100dpi 75dpi ; do - for f in $ff ; do - if test -f "$d/$r/$f" ; then - have_bitmap_fonts=yes - fi - done - done -done -AC_MSG_RESULT($have_bitmap_fonts) - -# In case we didn't guess the font directory properly, check RPMs and DEBs too. -if test $have_bitmap_fonts != yes ; then - for r in 100dpi 75dpi ; do - for f in xfonts-$r \ - xorg-x11-fonts-$r \ - xorg-x11-fonts-ISO8859-1-$r \ - ; do - if test $have_bitmap_fonts != yes ; then - AC_MSG_CHECKING(for $f) - if ( rpm -q "$f" 2>&- >&- ) || - ( dpkg -s "$f" 2>&- | grep -q '^Status:.*installed' ) ; then - have_bitmap_fonts=yes - fi - AC_MSG_RESULT($have_bitmap_fonts) - fi - done - done -fi - - ############################################################################### # # Check for pty support: this allows 'phosphor' and 'apple2' @@ -3978,93 +3933,57 @@ AC_CHECK_X_LIB(util, forkpty, AC_DEFINE(HAVE_FORKPTY)]) if test "$ac_have_forkpty" != yes ; then - # we don't need (or have) -lutil on MacOS 10.4.2... + # we don't need (or have) -lutil on macOS 10.4.2... AC_CHECK_X_LIB(c, forkpty, [PTY_LIBS="" AC_DEFINE(HAVE_FORKPTY)]) fi -############################################################################### -# -# Query AX_PTHREAD, and figure out which compiler gets used. -# -############################################################################### - -have_pthread=no -with_pthread_req=unspecified - -# AX_PTHREAD is from the GNU Autoconf Archive. -# https://savannah.gnu.org/projects/autoconf-archive/ -m4_include(ax_pthread.m4) - -# This affects CC, LIBS, and CFLAGS, instead of defining new variables. - -AC_ARG_WITH([pthread], -[ --with-pthread Enables POSIX threads, for SMP support.], - [with_pthread="$withval"; with_pthread_req="$withval"], - [with_pthread=yes]) - -if test "$with_pthread" = yes; then - # AX_PTHREAD might want a different compiler. - AX_PTHREAD( - [if test "$CC" = "$PTHREAD_CC" -o -z "$ac_original_cc"; then - have_pthread=yes - else - ac_prog_cc_no_pthread=yes - fi - ]) - - if test "$have_pthread" = yes; then - AC_DEFINE([HAVE_PTHREAD]) - CC=$PTHREAD_CC - fi -fi - - ############################################################################### # # Check for libcap, which allows "sonar" to work without setuid. +# Except, nevermind, that's bad. See comments in sonar-icmp.c. # ############################################################################### have_libcap=no -setcap_hacks_default=yes +setcap_hacks_default=no setcap_hacks="$setcap_hacks_default" setcap_hacks_req=unspecified -AC_ARG_WITH(setcap-hacks, -[ --with-setcap-hacks Build the "sonar" demo with libcap, which allows - it to ping other hosts without being setuid.], - [setcap_hacks="$withval"; setcap_hacks_req="$withval"], - [setcap_hacks=yes]) - -HANDLE_X_PATH_ARG(setcap_hacks, --with-setcap-hacks, setcap hacks) - -if test "$setcap_hacks" != yes -a "$setcap_hacks" != no ; then - echo "error: must be yes or no: --with-setcap-hacks=$setcap_hacks" - exit 1 -fi - -if test "$setcap_hacks" = yes; then - AC_CHECK_PROGS(setcap_program, setcap) - if test "$setcap_program" != ''; then - AC_CHECK_X_HEADER(sys/capability.h, [have_setcap=yes]) - fi - if test "$have_setcap" = yes; then - AC_CHECK_X_LIB(cap, cap_set_flag, - [have_libcap=yes - PROG_SETCAP="$setcap_program" - LIBCAP_LIBS="-lcap" - AC_DEFINE(HAVE_LIBCAP)]) - fi -fi +#AC_ARG_WITH(setcap-hacks, +#[ --with-setcap-hacks Build the "sonar" demo with libcap, which allows +# it to ping other hosts without being setuid.], +# [setcap_hacks="$withval"; setcap_hacks_req="$withval"], +# [setcap_hacks=yes]) +# +#HANDLE_X_PATH_ARG(setcap_hacks, --with-setcap-hacks, setcap hacks) +# +#if test "$setcap_hacks" != yes -a "$setcap_hacks" != no ; then +# echo "error: must be yes or no: --with-setcap-hacks=$setcap_hacks" +# exit 1 +#fi +# +#if test "$setcap_hacks" = yes; then +# +# AC_CHECK_PROGS(setcap_program, setcap) +# if test "$setcap_program" != ''; then +# AC_CHECK_X_HEADER(sys/capability.h, [have_setcap=yes]) +# fi +# if test "$have_setcap" = yes; then +# AC_CHECK_X_LIB(cap, cap_set_flag, +# [have_libcap=yes +# PROG_SETCAP="$setcap_program" +# LIBCAP_LIBS="-lcap" +# AC_DEFINE(HAVE_LIBCAP)]) +# fi +#fi ############################################################################### # -# Option to prevent "sonar" from working properly. -# It must be setuid on systems without libcap. +# Sonar must be setuid to be able to ping other hosts. # ############################################################################### @@ -4077,7 +3996,7 @@ fi setuid_hacks="$setuid_hacks_default" AC_ARG_WITH(setuid-hacks, [ --with-setuid-hacks Install the "sonar" demo as setuid root, which is - needed in order to ping other hosts without setcap.], + needed in order to ping other hosts.], [setuid_hacks="$withval"], [setuid_hacks="$setuid_hacks_default"]) HANDLE_X_PATH_ARG(setuid_hacks, --with-setuid-hacks, setuid hacks) @@ -4147,11 +4066,11 @@ fi PREFERRED_DEMO_PROGRAM='' ALL_DEMO_PROGRAMS= if test "$have_motif" = yes; then - PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Xm + PREFERRED_DEMO_PROGRAM=xscreensaver-settings-Xm ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS" fi if test "$have_gtk" = yes; then - PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Gtk + PREFERRED_DEMO_PROGRAM=xscreensaver-settings-Gtk ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS" fi @@ -4170,10 +4089,10 @@ if test "$enable_pam_check_account_type" = yes; then else COMMENT_PAM_CHECK_ACCOUNT="#" fi -if test "$have_passwd_helper" = yes; then - PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)" - PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)" -fi +#if test "$have_passwd_helper" = yes; then +# PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)" +# PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)" +#fi PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)" PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)" @@ -4197,12 +4116,10 @@ else fi -INSTALL_SETUID='$(INSTALL_PROGRAM) $(SUID_FLAGS)' - -if test "$need_setuid" = yes; then - NEED_SETUID=yes +if test "$setuid_auth" = yes; then + SETUID_AUTH=yes else - NEED_SETUID=no + SETUID_AUTH=no fi if test "$setuid_hacks" = yes; then @@ -4283,6 +4200,7 @@ AC_MSG_RESULT($PO_DATADIR/locale) # canonicalize slashes. HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'` +FONT_DIR=`echo "${FONT_DIR}" | sed 's@/$@@;s@//*@/@g'` # gcc 3.0 likes to issue this warning for every file: # @@ -4316,16 +4234,16 @@ AC_SUBST(PTY_LIBS) AC_SUBST(GL_LIBS) AC_SUBST(GLE_LIBS) AC_SUBST(XDPMS_LIBS) +AC_SUBST(PTHREAD_LIBS) AC_SUBST(XINERAMA_LIBS) AC_SUBST(PASSWD_LIBS) AC_SUBST(LIBCAP_CFLAGS) AC_SUBST(LIBCAP_LIBS) AC_SUBST(PROG_SETCAP) -AC_SUBST(INSTALL_SETUID) +AC_SUBST(SETUID_AUTH) AC_SUBST(SETUID_HACKS) AC_SUBST(SETCAP_HACKS) AC_SUBST(INSTALL_DIRS) -AC_SUBST(NEED_SETUID) AC_SUBST(INSTALL_PAM) AC_SUBST(HAVE_PAM_FAIL_DELAY) AC_SUBST(COMMENT_PAM_CHECK_ACCOUNT) @@ -4336,23 +4254,17 @@ AC_SUBST(DEFAULT_IMAGE_DIRECTORY) AC_SUBST(DEFAULT_TEXT_FILE) AC_SUBST(WITH_BROWSER) -AC_SUBST(OBJCC) AC_SUBST(EXES_OSX) AC_SUBST(EXES_SYSTEMD) +AC_SUBST(SYSTEMD_LIBS) AC_SUBST(SCRIPTS_OSX) AC_SUBST(MEN_OSX) AC_SUBST(PASSWD_SRCS) AC_SUBST(PASSWD_OBJS) -AC_SUBST(XMU_SRCS) -AC_SUBST(XMU_OBJS) -AC_SUBST(XMU_LIBS) AC_SUBST(XFT_SRCS) AC_SUBST(XFT_OBJS) AC_SUBST(XFT_LIBS) -AC_SUBST(SAVER_GL_SRCS) -AC_SUBST(SAVER_GL_OBJS) -AC_SUBST(SAVER_GL_LIBS) AC_SUBST(LOCK_SRCS) AC_SUBST(LOCK_OBJS) AC_SUBST(JPEG_EXES) @@ -4373,7 +4285,7 @@ AC_SUBST(HACKDIR_FULL) AC_SUBST(GTK_DATADIR) AC_SUBST(PO_DATADIR) AC_SUBST(HACK_CONF_DIR) -AC_SUBST(GTK_EXTRA_OBJS) +AC_SUBST(FONT_DIR) AC_SUBST(ANIM_OBJS) AC_SUBST(ANIM_LIBS) @@ -4385,16 +4297,18 @@ AC_SUBST(DEPEND_FLAGS) AC_SUBST(DEPEND_DEFINES) AC_SUBST(PERL) -AC_OUTPUT(Makefile +AC_CONFIG_FILES([Makefile utils/Makefile jwxyz/Makefile hacks/Makefile + hacks/fonts/Makefile hacks/images/Makefile hacks/glx/Makefile po/Makefile.in driver/Makefile driver/xscreensaver.pam - driver/XScreenSaver.ad) + driver/XScreenSaver.ad]) +AC_OUTPUT ############################################################################### # @@ -4484,6 +4398,14 @@ if test "$with_xdbe_req" = yes -a "$have_xdbe" = no ; then warn 'The DOUBLE-BUFFER extension was requested, but was not found.' fi +#if test "$with_xcomposite_req" = yes -a "$have_xcomposite" = no ; then +# warn 'The XCOMPOSITE extension was requested, but was not found.' +#fi + +if test "$with_xkb_req" = yes -a "$have_xkb" = no ; then + warn 'The X Keyboard extension was requested, but was not found.' +fi + if test "$with_sgivc_req" = yes -a "$have_sgivc" = no ; then warn 'The SGI-VIDEO-CONTROL extension was requested, but was not found.' fi @@ -4523,21 +4445,13 @@ else fi if test "$gtk_halfassed" != no ; then - warnL "GTK version $gtk_halfassed was found, but at least one supporting" - warn2 "library ($gtk_halfassed_lib) was not, so GTK can't be used." - warn2 "Perhaps some of the development packages are not installed?" - if test "$have_gtk" = yes ; then - v="$ac_gtk_version_string" - warn2 "GTK $v is also installed, so it will be used instead." - warn2 "Please read the above output and the \`config.log' file" - warn2 "for more details." - fi + warnL "GTK was found, but $gtk_halfassed_lib was not, so GTK can't be used." fi motif_warn2() { warn2 'Though the Motif front-end to xscreensaver is still' warn2 'maintained, it is no longer being updated with new' - warn2 'features: all new development on the xscreensaver-demo' + warn2 'features: all new development on the xscreensaver-settings' warn2 'program is happening in the GTK version, and not in the' warn2 'Motif version. It is recommended that you build against' warn2 'GTK instead of Motif. See .' @@ -4547,12 +4461,12 @@ if test "$have_motif" = no -a "$have_gtk" = no; then if test "$with_motif" = yes; then warnL "Neither the GTK nor Motif libraries were found; the" - warn2 "\`xscreensaver-demo' program requires one of these." + warn2 "\`xscreensaver-settings' program requires one of these." echo '' motif_warn2 else warnL "The GTK libraries do not seem to be available; the" - warn2 "\`xscreensaver-demo' program requires them." + warn2 "\`xscreensaver-settings' program requires them." # echo '' # warn2 'You can use Motif or Lesstif instead of GTK (use the' # warn2 "\`--with-motif' option) but that is NOT recommended." @@ -4563,26 +4477,15 @@ elif test "$with_motif_req" = yes -a "$have_motif" = no ; then warnL "Use of Motif was requested, but it wasn't found;" warn2 "Gtk will be used instead." -elif test "$jurassic_gtk" = yes ; then - - pref_gtk=2.0 - - v="$ac_gtk_version_string" - if test "$with_gtk_req" = yes -a "$ac_gtk_version" = "unknown" ; then - warnL "Use of Gtk was requested, but its version number is unknown;" - elif test "$with_gtk_req" = yes ; then - warnL "Use of Gtk was requested, but it is version $v;" - else - warnL "Gtk was found on this system, but it is version $v;" - fi - - warn2 "Gtk $pref_gtk or newer is required." - elif test "$with_gtk_req" = yes -a "$have_gtk" = no ; then warnL "Use of Gtk was requested, but it wasn't found." fi +if test "$ac_cv_libxt" != yes ; then + warnL 'The Xt library was not found. It is required.' +fi + if test "$have_gtk" = yes -a "$have_gdk_pixbuf" = no ; then warn "GTK is being used, but the GDK-Pixbuf library and/or" warn2 "headers were not found. That can't be good. Please" @@ -4614,6 +4517,11 @@ if test "$have_motif" = yes -a "$have_gtk" = no ; then motif_warn2 fi +halfassery() { + echo '' + warn2 "More specifically, we found the headers but not the" + warn2 "libraries. Possibly a 'devel' package is needed." +} if test "$with_gdk_pixbuf_req" = yes -a "$have_gdk_pixbuf" = no; then warnL 'Use of GDK-Pixbuf was requested, but it was not found.' @@ -4630,14 +4538,7 @@ if test "$have_gdk_pixbuf" = no -o "$gdk_pixbuf_halfassed" = yes || \ warnL 'The GDK-Pixbuf library was not found.' fi - if test "$gdk_pixbuf_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'libraries; so either GDK-Pixbuf is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' - fi - + if test "$gdk_pixbuf_halfassed" = yes ; then halfassery ; fi if test "$have_png" = yes ; then echo '' warn2 'The PNG library is being used instead.' @@ -4654,21 +4555,14 @@ if test "$have_jpeg" = no ; then if test "$with_jpeg_req" = yes ; then warnL 'Use of libjpeg was requested, but it was not found.' elif test "$with_jpeg_req" = no ; then - noteL 'The JPEG library is not being used.' + warnL 'The JPEG library is not being used.' else - noteL 'The JPEG library was not found.' - fi - - if test "$jpeg_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'library; so either JPEG is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' - echo '' + warnL 'The JPEG library was not found.' fi + if test "$jpeg_halfassed" = yes ; then halfassery ; fi if test "$have_gdk_pixbuf" = no ; then + echo '' warn2 "This means that it won't be possible for the image-manipulating" warn2 "display modes to load files from disk; and it also means that" warn2 "the \`webcollage' program will be much slower." @@ -4682,50 +4576,25 @@ if test "$have_png" = no ; then if test "$with_png_req" = yes ; then warnL 'Use of libpng was requested, but it was not found.' elif test "$with_png_req" = no ; then - noteL 'The PNG library is not being used.' + warnL 'The PNG library is not being used.' else - noteL 'The PNG library was not found.' - fi - - if test "$png_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'library; so either PNG is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' - echo '' + warnL 'The PNG library was not found.' fi + if test "$png_halfassed" = yes ; then halfassery ; fi warn2 "Many things aren't going to work right." fi -if test "$have_xft" = no ; then - if test "$with_xft_req" = yes ; then - warnL "Use of libXft was requested, but it was not found." - elif test "$with_xft_req" = no ; then - noteL 'The Xft library is not being used.' - else - noteL "The Xft library was not found." - fi - - if test "$xft_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'libraries; so either Xft is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' - echo '' - fi - - warn2 "This means that fonts won't be anti-aliased." +if test "$have_xinput" = no ; then + warnL 'The XInput2 library was not found. It is required.' + if test "$xinput_halfassed" = yes ; then halfassery ; else echo '' ; fi fi -if test "$have_bitmap_fonts" = no ; then - warnL 'The standard bitmap fonts do not seem to be installed.' - warn2 'That is not going to work out well for you.' - warn2 'Install "xfonts-100dpi" or "xorg-x11-fonts-100dpi".' +if test "$have_xft" = no ; then + warnL 'The XFreeType library was not found. It is required.' + if test "$xft_halfassed" = yes ; then halfassery ; else echo '' ; fi fi @@ -4748,12 +4617,7 @@ if test "$have_systemd" = no ; then fi if test "$systemd_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'libraries; so either systemd is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' - echo '' + halfassery systemd_warned=yes fi @@ -4767,28 +4631,6 @@ if test "$have_systemd" = no ; then fi -if test "$have_gl" = yes -a "$ac_have_mesa_gl" = yes ; then - preferred_mesagl=3.4 - mgv="$ac_mesagl_version_string" - pgl="$preferred_mesagl" - - if test "$ac_mesagl_version" = unknown; then - true - # warnL "Unable to determine the MesaGL version number!" - # warn2 "Make sure you are using version $preferred_mesagl or newer." - - elif test \! "$ac_mesagl_version" -gt 2006; then - warnL "MesaGL version number is $mgv --" - warn2 "MesaGL 2.6 and earlier have a security bug. It is strongly" - warn2 "recommended that you upgrade to at least version $preferred_mesagl." - - elif test \! "$ac_mesagl_version" -gt 3003; then - warnL "MesaGL version number is $mgv --" - warn2 "MesaGL 3.3 and earlier have some bugs; it is recommended" - warn2 "that you upgrade to $pgl or newer." - fi -fi - if test "$have_gl" = no ; then if test "$with_gl_req" = yes ; then warnL 'Use of GL was requested, but it was not found.' @@ -4799,11 +4641,11 @@ if test "$have_gl" = no ; then fi if test "$gl_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'libraries; so either GL is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' + halfassery + if test "$have_glx" = no -a "$have_egl" = no; then + echo '' + warn2 'Neither EGL nor GLX were found.' + fi fi echo '' @@ -4813,7 +4655,6 @@ if test "$have_gl" = no ; then fi - if test "$have_gl" = yes -a "$have_gle" = no ; then # nobody cares about this; don't print the warning unless it was @@ -4832,13 +4673,7 @@ if test "$have_gl" = yes -a "$have_gle" = no ; then warn2 'library was not.' fi - if test "$gle_halfassed" = yes ; then - echo '' - warn2 'More specifically, we found the headers, but not the' - warn2 'libraries; so either GLE is half-installed on this' - warn2 "system, or something else went wrong. The \`config.log'" - warn2 'file might contain some clues.' - fi + if test "$gle_halfassed" = yes ; then halfassery ; fi echo '' warn2 'Some of the OpenGL (3D) demos (those that depend on GLE)' @@ -4860,6 +4695,12 @@ fi if test "$with_pam_req" = yes -a "$have_pam" = no ; then warn 'Use of PAM was requested, but it was not found.' +elif test "$have_pam" = no ; then + if test -d /etc/pam.d -o -f /etc/pam.conf ; then + warn "Your system seems to have PAM, but PAM is not being used." + warn2 "That is probably not going to work out well." + + fi fi if test "$with_shadow_req" = yes -a "$have_shadow" = no ; then @@ -4870,32 +4711,38 @@ if test "$setcap_hacks_req" = yes -a "$have_libcap" = no ; then warn 'Use of libcap was requested, but it was not found.' fi -if test "$ac_macosx" = yes ; then - if test "$enable_locking" = yes ; then - warn "You have specified --enable-locking on MacOS X." - warn2 "THIS DOES NOT WORK! Don't do this!" - fi +if test "$ac_macosx" = yes -a "$enable_locking" = yes ; then + warn "You have specified --enable-locking on macOS." + warn2 "THIS DOES NOT WORK! Don't do this!" fi # You are in a twisty maze of namespaces and syntaxes, all alike. +# Expand all of these as the Makefile will probably expand them. # Fuck the skull of Unix. # bindir=`eval eval eval eval eval eval eval echo $bindir` HACKDIR=`eval eval eval eval eval eval eval echo $HACKDIR` HACK_CONF_DIR=`eval eval eval eval eval eval eval echo $HACK_CONF_DIR` +FONT_DIR=`eval eval eval eval eval eval eval echo $FONT_DIR` # canonicalize slashes. bindir=`echo "${bindir}" | sed 's@/$@@;s@//*@/@g'` HACKDIR=`echo "${HACKDIR}" | sed 's@/$@@;s@//*@/@g'` HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'` +FONT_DIR=`echo "${FONT_DIR}" | sed 's@/$@@;s@//*@/@g'` +if test -z "$FONT_DIR" ; then + FONT_DIR='not installed'; +else + FONT_DIR="${FONT_DIR}/" +fi # Sanity check the hackdir -for bad_choice in xscreensaver xscreensaver-demo xscreensaver-command ; do +for bad_choice in xscreensaver xscreensaver-settings xscreensaver-command ; do if test "${HACKDIR}" = "${bindir}/${bad_choice}" ; then echo "" - AC_MSG_ERROR([\"--with-hackdir=${bindir}/${bad_choice}\" won't work. + AC_MSG_ERROR(["--with-hackdir=${bindir}/${bad_choice}" won't work. There will be an executable installed with that name, so that can't be the name of a directory as well. Please re-configure with a different directory name.]) @@ -4903,99 +4750,100 @@ for bad_choice in xscreensaver xscreensaver-demo xscreensaver-command ; do done -# Now let's warn if there's a previous RPM version already installed. -# But don't bother with this test if we are currently *building* an RPM. +# Warn if there's a previous RPM package installed. +rpm_vers= if test -z "$RPM_PACKAGE_VERSION" ; then - - rpmnames="xscreensaver xscreensaver-base xscreensaver-extras" + # Don't bother with this test if we are currently *building* an RPM. + rpmnames="xscreensaver xscreensaver-base xscreensaver-extras + xscreensaver-data xscreensaver-data-extra" # M4 sucks!! changequote(X,Y) - rpmv=`(rpm -qv $rpmnames) 2>/dev/null | \ - sed -n 's/^[-a-z]*-\([0-9][0-9]*[.][0-9][0-9a-z]*\)-.*$/\1/p' | \ - head -1` + pkg_vers=`(rpm -qv $rpmnames) 2>&- | \ + sed -n 's/^[-a-z]*-\([0-9][0-9]*[.].*\)/\1/p' | head -1` + rpm_vers="$pkg_vers" changequote([,]) +fi - if test \! -z "$rpmv" ; then - - # M4 sucks!! - changequote(A,B) - rpmbdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'` - rpmhdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares$@\1@p'` - rpmcdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'` - rpmadir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)XScreenSaver$@\1@p'` - changequote([,]) - - err=" (DIFFERS)" - if test -z "$rpmbdir" ; then rpmbdir='???' - elif test "$rpmbdir" != "${bindir}/" ; then rpmbdir="$rpmbdir$err";fi - - if test -z "$rpmhdir" ; then rpmhdir='???' - elif test "$rpmhdir" != "${HACKDIR}/" ; then rpmhdir="$rpmhdir$err";fi - - if test -z "$rpmcdir" ; then rpmcdir='???' - elif test "$rpmcdir" != "${HACK_CONF_DIR}/"; then rpmcdir="$rpmcdir$err";fi - - if test -z "$rpmadir" ; then rpmadir='???' - elif test "$rpmadir" != "${APPDEFAULTS}/" ; then rpmadir="$rpmadir$err";fi +if test \! -z "$rpm_vers" ; then - warning=no - warnL "There is already an installed RPM of xscreensaver" - warn2 "version \"$rpmv\" on this system." - echo "" - warn2 "It is currently installed in these directories:" - echo "" - warn2 "User programs: $rpmbdir$berr" - warn2 "Screen savers: $rpmhdir$herr" - warn2 "Configuration: $rpmcdir$cerr" - warn2 "App Defaults: $rpmadir$aerr" - fi + # M4 sucks!! + changequote(A,B) + pkg_bindir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)xscreensaver-settings$@\1@p'` + pkg_bindir2=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'` + pkg_hackdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares$@\1@p'` + pkg_confdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'` + pkg_fontdir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)\.ttf$@\1@p'` + pkg_addir=`rpm -ql $rpmnames | sed -n 's@^\(.*/\)XScreenSaver$@\1@p'` + + if test -z "$pkg_bindir" ; then pkg_bindir="$pkg_bindir2" ; fi + changequote([,]) fi -# Also warn if there's a Debian package installed. + +# Warn if there's a previous Debian package installed. # -debnames="xscreensaver xscreensaver-data xscreensaver-data-extra" -debv='' -for dpkg in $debnames ; do - if test -z "$debv"; then - debv=`dpkg -s $dpkg 2>/dev/null | sed -n 's/^Version: \(.*\)$/\1/p'` - fi -done +deb_vers= +if test -z "$pkg_vers" ; then + debnames="xscreensaver xscreensaver-data xscreensaver-data-extra" + pkg_vers='' + for dpkg in $debnames ; do + if test -z "$pkg_vers"; then + pkg_vers=`dpkg -s $dpkg 2>/dev/null | sed -n 's/^Version: \(.*\)$/\1/p'` + deb_vers="$pkg_vers" + fi + done +fi -if test \! -z "$debv" ; then +if test \! -z "$deb_vers" ; then # M4 sucks!! changequote(A,B) - debbdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/bin/\)xscreensaver$@\1@p'` - debhdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares$@\1@p'` - debcdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'` - debadir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)XScreenSaver[^/]*$@\1@p'` + pkg_bindir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)xscreensaver-settings$@\1@p'` + pkg_bindir2=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)xscreensaver-demo$@\1@p'` + pkg_hackdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares$@\1@p'` + pkg_confdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)popsquares\.xml$@\1@p'` + pkg_fontdir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)\.ttf$@\1@p'` + pkg_addir=`dpkg -L $debnames 2>&- | sed -n 's@^\(.*/\)XScreenSaver[^/]*$@\1@p'` changequote([,]) + if test -z "$pkg_bindir" ; then pkg_bindir="$pkg_bindir2" ; fi +fi + +bindir_err= +hackdir_err= +confdir_err= +fontdir_err= +addir_err= +if ! test -z "$pkg_vers" ; then + err=" (DIFFERS)" - if test -z "$debbdir" ; then debbdir='???' - elif test "$debbdir" != "${bindir}/" ; then debbdir="$debbdir$err"; fi - if test -z "$debhdir" ; then debhdir='???' - elif test "$debhdir" != "${HACKDIR}/" ; then debhdir="$debhdir$err"; fi + if test -z "$pkg_bindir" ; then pkg_bindir='???' + elif test "$pkg_bindir" != "${bindir}/" ; then bindir_err="$err" ; fi + + if test -z "$pkg_hackdir" ; then pkg_hackdir='???' + elif test "$pkg_hackdir" != "${HACKDIR}/" ; then hackdir_err="$err"; fi - if test -z "$debcdir" ; then debcdir='???' - elif test "$debcdir" != "${HACK_CONF_DIR}/" ; then debcdir="$debcdir$err"; fi + if test -z "$pkg_confdir" ; then pkg_confdir='???' + elif test "$pkg_confdir" != "${HACK_CONF_DIR}/" ; then confdir_err="$err"; fi - if test -z "$debadir" ; then debadir='???' - elif test "$debadir" != "${APPDEFAULTS}/" ; then debadir="$debadir$err"; fi + if test -z "$pkg_fontdir" ; then pkg_fontdir='none' + elif test "$pkg_fontdir/" != "${FONT_DIR}" ; then fontdir_err="$err"; fi + + if test -z "$pkg_addir" ; then pkg_addir='???' + elif test "$pkg_addir" != "${APPDEFAULTS}/" ; then addir_err="$err" ; fi warning=no - warnL "There is already an installed dpkg of xscreensaver" - warn2 "version \"$debv\" on this system." - echo "" - warn2 "It is currently installed in these directories:" + warnL "There is already an installed package of xscreensaver" + warn2 "version \"$pkg_vers\", in these directories:" echo "" - warn2 "User programs: $debbdir$berr" - warn2 "Screen savers: $debhdir$herr" - warn2 "Configuration: $debcdir$cerr" - warn2 "App Defaults: $debadir$aerr" + warn2 "User programs: $pkg_bindir$bindir_err" + warn2 "Screen savers: $pkg_hackdir$hackdir_err" + warn2 "Configuration: $pkg_confdir$confdir_err" + warn2 "Extra fonts: $pkg_fontdir$fontdir_err" + warn2 "App Defaults: $pkg_addir$addir_err" fi echo "" @@ -5003,8 +4851,9 @@ echo "$warnsep" echo "" echo " XScreenSaver will be installed in these directories:" echo "" -echo " User programs: ${bindir}/" -echo " Screen savers: ${HACKDIR}/" -echo " Configuration: ${HACK_CONF_DIR}/" -echo " App Defaults: ${APPDEFAULTS}/" +echo " User programs: ${bindir}/$bindir_err" +echo " Screen savers: ${HACKDIR}/$hackdir_err" +echo " Configuration: ${HACK_CONF_DIR}/$confdir_err" +echo " Extra Fonts: ${FONT_DIR}$fontdir_err" +echo " App Defaults: ${APPDEFAULTS}/$addir_err" echo "" diff --git a/driver/Makefile.in b/driver/Makefile.in index 070a8b76..0e986a9d 100644 --- a/driver/Makefile.in +++ b/driver/Makefile.in @@ -1,9 +1,9 @@ -# driver/Makefile.in --- xscreensaver, Copyright (c) 1997-2010 Jamie Zawinski. +# driver/Makefile.in --- xscreensaver, Copyright © 1997-2021 Jamie Zawinski. # the `../configure' script generates `driver/Makefile' from this file. @SET_MAKE@ .SUFFIXES: -.SUFFIXES: .c .m .o +.SUFFIXES: .c .m .o .desktop .desktop.in srcdir = @srcdir@ VPATH = @srcdir@ @@ -19,43 +19,36 @@ datadir = @datadir@ localedir = @PO_DATADIR@/locale mandir = @mandir@ libexecdir = @libexecdir@ -mansuffix = 1 -manNdir = $(mandir)/man$(mansuffix) +sysconfdir = @sysconfdir@ -INTLTOOL_MERGE = @INTLTOOL_MERGE@ +# A = suffix for user commands in /usr/bin/ +# B = suffix for helper programs in /usr/libexec/xscreensaver/ +mansuffixA = 1 +mansuffixB = 6 GTK_DATADIR = @GTK_DATADIR@ GTK_APPDIR = $(GTK_DATADIR)/applications GTK_ICONDIR = $(GTK_DATADIR)/pixmaps GTK_UIDIR = $(GTK_DATADIR)/xscreensaver/ui -OLD_GLADEDIR = $(GTK_DATADIR)/xscreensaver/glade + +HACKDIR = @HACKDIR@ HACK_CONF_DIR = @HACK_CONF_DIR@ CC = @CC@ -OBJCC = @OBJCC@ CFLAGS = @CFLAGS@ LDFLAGS = @LDFLAGS@ DEFS = @DEFS@ -INTL_DEFS = -DLOCALEDIR=\"$(localedir)\" -SUBP_DEFS = -DDEFAULT_PATH_PREFIX='"@HACKDIR@"' -GTK_DEFS = -DDEFAULT_ICONDIR='"$(GTK_UIDIR)"' -CONF_DEFS = -DHACK_CONFIGURATION_PATH='"$(HACK_CONF_DIR)"' LIBS = @LIBS@ -INTL_LIBS = @INTLLIBS@ -JPEG_LIBS = @JPEG_LIBS@ -PERL = @PERL@ DEPEND = @DEPEND@ DEPEND_FLAGS = @DEPEND_FLAGS@ DEPEND_DEFINES = @DEPEND_DEFINES@ -SHELL = /bin/sh INSTALL = @INSTALL@ SUID_FLAGS = -o root -m 4755 INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_SETUID = @INSTALL_SETUID@ +INSTALL_SETUID = $(INSTALL_PROGRAM) $(SUID_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_DIRS = @INSTALL_DIRS@ @@ -63,8 +56,11 @@ X_CFLAGS = @X_CFLAGS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ -XMU_LIBS = @XMU_LIBS@ PNG_LIBS = @PNG_LIBS@ +XFT_LIBS = @XFT_LIBS@ + +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTL_LIBS = @INTLLIBS@ # Note: # @@ -75,15 +71,18 @@ PNG_LIBS = @PNG_LIBS@ # (e.g., -lsocket, -lnsl, etc.) # # I think (but am not totally sure) that LIBS is also really "LDFLAGS". -# -# SAVER_LIBS is the link line for "xscreensaver", and -# CMD_LIBS is the link line for "xscreensaver-command". -# GETIMG_LIBS is the link line for "xscreensaver-getimage". AD_DIR = @APPDEFAULTS@ -PAM_DIR = /etc/pam.d -PAM_CONF = /etc/pam.conf + +# $(sysconfdir) is either /usr/local/etc or /usr/etc but this must be /etc. +PAM_ROOT = /etc +PAM_DIR = $(PAM_ROOT)/pam.d +PAM_CONF = $(PAM_ROOT)/pam.conf + +ICON_SRC = $(UTILS_SRC)/images +LOGO = $(ICON_SRC)/logo-50.xpm +GTK_ICONS = $(ICON_SRC)/screensaver-*.png UTILS_SRC = $(srcdir)/../utils UTILS_BIN = ../utils @@ -91,11 +90,40 @@ UTILS_BIN = ../utils INCLUDES_1 = -I. -I$(srcdir) -I$(UTILS_SRC) -I.. INCLUDES = $(INCLUDES_1) @INCLUDES@ -MOTIF_SRCS = demo-Xm.c demo-Xm-widgets.c -MOTIF_OBJS = demo-Xm.o demo-Xm-widgets.o +LIBS_PRE = $(LIBS) $(X_LIBS) $(X_PRE_LIBS) +LIBS_POST = $(X_EXTRA_LIBS) -GTK_SRCS = demo-Gtk.c demo-Gtk-conf.c -GTK_OBJS = demo-Gtk.o demo-Gtk-conf.o @GTK_EXTRA_OBJS@ +XDPMS_LIBS = @XDPMS_LIBS@ +XINERAMA_LIBS = @XINERAMA_LIBS@ $(FIXME) +XINPUT_LIBS = -lXi +XML_LIBS = @XML_LIBS@ + +DAEMON_DEFS = -DDEFAULT_PATH_PREFIX='"@HACKDIR@"' -DAD_DIR='"$(AD_DIR)"' +DAEMON_SRCS = xscreensaver.c blurb.c atoms.c clientmsg.c xinput.c prefs.c +DAEMON_OBJS = xscreensaver.o blurb.o atoms.o clientmsg.o xinput.o prefs.o \ + $(UTILS_BIN)/xmu.o +DAEMON_LIBS = $(LIBS_PRE) $(XINPUT_LIBS) -lX11 $(LIBS_POST) + +GFX_DEFS = -DLOCALEDIR=\"$(localedir)\" +GFX_SRCS = xscreensaver-gfx.c screens.c windows.c subprocs.c \ + exec.c prefsw.c dpms.c fade.c exts.c atomswm.c +GFX_OBJS = xscreensaver-gfx.o screens.o windows.o subprocs.o \ + exec.o prefsw.o dpms.o fade.o exts.o atomswm.o \ + prefs.o blurb.o atoms.o clientmsg.o xinput.o \ + $(UTILS_BIN)/xmu.o \ + $(UTILS_BIN)/yarandom.o \ + $(UTILS_BIN)/resources.o \ + $(UTILS_BIN)/visual.o \ + $(UTILS_BIN)/usleep.o \ + $(UTILS_BIN)/font-retry.o \ + $(UTILS_BIN)/logo.o \ + $(UTILS_BIN)/minixpm.o \ + $(UTILS_BIN)/xft.o \ + $(UTILS_BIN)/utf8wc.o \ + $(UTILS_BIN)/xshm.o \ + $(UTILS_BIN)/aligned_malloc.o +GFX_LIBS = $(LIBS_PRE) $(XFT_LIBS) $(XDPMS_LIBS) $(XINERAMA_LIBS) \ + @SAVER_LIBS@ -lXt -lX11 -lXext -lXi $(LIBS_POST) $(INTL_LIBS) PWENT_SRCS = passwd-pwent.c PWENT_OBJS = passwd-pwent.o @@ -109,209 +137,186 @@ PAM_OBJS = passwd-pam.o PWHELPER_SRCS = passwd-helper.c PWHELPER_OBJS = passwd-helper.o -LOCK_SRCS_1 = lock.c passwd.c -LOCK_OBJS_1 = lock.o passwd.o -NOLOCK_SRCS_1 = lock.c -NOLOCK_OBJS_1 = lock.o - -SYSTEMD_SRCS = xscreensaver-systemd.c -SYSTEMD_OBJS = xscreensaver-systemd.o $(UTILS_BIN)/yarandom.o -SYSTEMD_LIBS = -lsystemd - -TEST_SRCS = test-passwd.c test-uid.c test-xdpms.c test-grab.c \ - test-apm.c test-fade.c test-xinerama.c test-vp.c \ - test-randr.c xdpyinfo.c test-mlstring.c test-screens.c \ - test-yarandom.c -TEST_EXES = test-passwd test-uid test-xdpms test-grab \ - test-apm test-fade test-xinerama test-vp \ - test-randr xdpyinfo test-mlstring test-screens \ - test-yarandom - -MOTIF_LIBS = @MOTIF_LIBS@ @PNG_LIBS@ $(XMU_LIBS) -GTK_LIBS = @GTK_LIBS@ $(XMU_LIBS) -XML_LIBS = @XML_LIBS@ - -XDPMS_LIBS = @XDPMS_LIBS@ -XINERAMA_LIBS = @XINERAMA_LIBS@ -XINPUT_LIBS = @XINPUT_LIBS@ - PASSWD_SRCS = @PASSWD_SRCS@ PASSWD_OBJS = @PASSWD_OBJS@ -PASSWD_LIBS = @PASSWD_LIBS@ LOCK_SRCS = @LOCK_SRCS@ LOCK_OBJS = @LOCK_OBJS@ -XMU_SRCS = @XMU_SRCS@ -XMU_OBJS = @XMU_OBJS@ -GL_SRCS = @SAVER_GL_SRCS@ -GL_OBJS = @SAVER_GL_OBJS@ -GL_LIBS = @SAVER_GL_LIBS@ - -ICON_SRC = $(UTILS_SRC)/images -LOGO = $(ICON_SRC)/logo-50.xpm -GTK_ICONS = $(ICON_SRC)/screensaver-*.png - -DEMO_UTIL_SRCS = $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \ - $(UTILS_SRC)/visual.c $(XMU_SRCS) -DEMO_UTIL_OBJS = $(UTILS_BIN)/resources.o $(UTILS_BIN)/usleep.o \ - $(UTILS_BIN)/visual.o $(XMU_OBJS) - -SAVER_UTIL_SRCS = $(UTILS_SRC)/fade.c $(UTILS_SRC)/overlay.c \ - $(UTILS_SRC)/logo.c $(UTILS_SRC)/yarandom.c \ - $(UTILS_SRC)/minixpm.c $(UTILS_SRC)/font-retry.c \ - $(DEMO_UTIL_SRCS) -SAVER_UTIL_OBJS = $(UTILS_BIN)/fade.o $(UTILS_BIN)/overlay.o \ - $(UTILS_BIN)/logo.o $(UTILS_BIN)/yarandom.o \ - $(UTILS_BIN)/minixpm.o $(UTILS_BIN)/font-retry.o \ - $(DEMO_UTIL_OBJS) - -GETIMG_SRCS_1 = xscreensaver-getimage.c -GETIMG_OBJS_1 = xscreensaver-getimage.o - -GETIMG_SRCS = $(GETIMG_SRCS_1) \ - $(UTILS_BIN)/colorbars.o $(UTILS_BIN)/resources.o \ - $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/visual.o \ - $(UTILS_BIN)/usleep.o $(UTILS_BIN)/hsv.o \ - $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabscreen.o \ - $(UTILS_BIN)/logo.o $(UTILS_BIN)/minixpm.o prefs.o \ - $(XMU_SRCS) - -GETIMG_OBJS = $(GETIMG_OBJS_1) \ - $(UTILS_BIN)/colorbars.o $(UTILS_BIN)/resources.o \ - $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/visual.o \ - $(UTILS_BIN)/usleep.o $(UTILS_BIN)/hsv.o \ - $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabscreen.o \ - $(UTILS_BIN)/logo.o $(UTILS_BIN)/minixpm.o prefs.o \ - $(XMU_OBJS) - -SAVER_SRCS_1 = xscreensaver.c windows.c screens.c timers.c subprocs.c \ - exec.c xset.c splash.c setuid.c stderr.c mlstring.c -SAVER_OBJS_1 = xscreensaver.o windows.o screens.o timers.o subprocs.o \ - exec.o xset.o splash.o setuid.o stderr.o mlstring.o - -SAVER_SRCS = $(SAVER_SRCS_1) prefs.c dpms.c $(LOCK_SRCS) \ - $(SAVER_UTIL_SRCS) $(GL_SRCS) -SAVER_OBJS = $(SAVER_OBJS_1) prefs.o dpms.o $(LOCK_OBJS) \ - $(SAVER_UTIL_OBJS) $(GL_OBJS) +AUTH_DEFS = -DLOCALEDIR=\"$(localedir)\" -DAD_DIR='"$(AD_DIR)"' +AUTH_SRCS = xscreensaver-auth.c dialog.c passwd.c setuid.c +AUTH_OBJS = xscreensaver-auth.o $(AUTH_OBJS_1) +AUTH_OBJS_1 = dialog.o passwd.o setuid.o \ + @PASSWD_OBJS@ \ + blurb.o screens.o xinput.o prefs.o atoms.o atomswm.o \ + $(UTILS_BIN)/xft.o \ + $(UTILS_BIN)/xftwrap.o \ + $(UTILS_BIN)/utf8wc.o \ + $(UTILS_BIN)/font-retry.o \ + $(UTILS_BIN)/yarandom.o \ + $(UTILS_BIN)/usleep.o \ + $(UTILS_BIN)/resources.o \ + $(UTILS_BIN)/logo.o \ + $(UTILS_BIN)/minixpm.o +AUTH_LIBS = $(LIBS_PRE) $(XFT_LIBS) $(XINPUT_LIBS) $(XINERAMA_LIBS) \ + @SAVER_LIBS@ -lXt -lX11 -lXext -lXi \ + @PASSWD_LIBS@ $(LIBS_POST) $(INTL_LIBS) + +SYSTEMD_DEFS = +SYSTEMD_SRCS = xscreensaver-systemd.c +SYSTEMD_OBJS = xscreensaver-systemd.o blurb.o $(UTILS_BIN)/yarandom.o +SYSTEMD_LIBS = $(LIBS_PRE) @SYSTEMD_LIBS@ -lX11 $(LIBS_POST) +CMD_DEFS = CMD_SRCS = remote.c xscreensaver-command.c -CMD_OBJS = remote.o xscreensaver-command.o - -DEMO_SRCS_1 = prefs.c dpms.c -DEMO_OBJS_1 = prefs.o dpms.o - -DEMO_SRCS = $(DEMO_SRCS_1) remote.c exec.c $(DEMO_UTIL_SRCS) -DEMO_OBJS = $(DEMO_OBJS_1) remote.o exec.o $(DEMO_UTIL_OBJS) - -PDF2JPEG_SRCS = pdf2jpeg.m -PDF2JPEG_OBJS = pdf2jpeg.o -PDF2JPEG_LIBS = -framework Cocoa - -SAVER_LIBS = $(LIBS) $(X_LIBS) $(XMU_LIBS) @SAVER_LIBS@ \ - $(XDPMS_LIBS) $(XINERAMA_LIBS) $(GL_LIBS) $(X_PRE_LIBS) \ - -lXt -lX11 -lXext $(X_EXTRA_LIBS) \ - $(PASSWD_LIBS) $(INTL_LIBS) - -CMD_LIBS = $(LIBS) $(X_LIBS) \ - $(X_PRE_LIBS) -lX11 -lXext $(X_EXTRA_LIBS) - -GETIMG_LIBS = $(LIBS) $(X_LIBS) $(PNG_LIBS) $(JPEG_LIBS) \ - $(X_PRE_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) - -EXES = xscreensaver xscreensaver-command xscreensaver-demo \ - xscreensaver-getimage @EXES_OSX@ @EXES_SYSTEMD@ -EXES2 = @ALL_DEMO_PROGRAMS@ -EXES_OSX = pdf2jpeg +CMD_OBJS = remote.o xscreensaver-command.o blurb.o atoms.o clientmsg.o +CMD_LIBS = $(LIBS_PRE) $(XINPUT_LIBS) -lX11 -lXext $(LIBS_POST) + +GTK_DEFS = -DHACK_CONFIGURATION_PATH='"$(HACK_CONF_DIR)"' \ + -DDEFAULT_PATH_PREFIX='"@HACKDIR@"' \ + -DDEFAULT_ICONDIR='"$(GTK_UIDIR)"' \ + -DLOCALEDIR=\"$(localedir)\" \ + -I$(ICON_SRC) +GTK_SRCS = demo-Gtk.c demo-Gtk-conf.c +GTK_OBJS = demo-Gtk.o demo-Gtk-conf.o \ + blurb.o exec.o prefs.o prefsw.o dpms.o remote.o \ + clientmsg.o atoms.o \ + $(UTILS_BIN)/xmu.o \ + $(UTILS_BIN)/resources.o \ + $(UTILS_BIN)/visual.o \ + $(UTILS_BIN)/usleep.o +GTK_LIBS = $(LIBS_PRE) $(INTL_LIBS) $(XDPMS_LIBS) \ + $(XINERAMA_LIBS) $(XML_LIBS) @GTK_LIBS@ \ + -lXt -lX11 -lXext -lXi $(LIBS_POST) + +MOTIF_DEFS = -DHACK_CONFIGURATION_PATH='"$(HACK_CONF_DIR)"' \ + -DDEFAULT_PATH_PREFIX='"@HACKDIR@"' +MOTIF_SRCS = demo-Xm.c demo-Xm-widgets.c +MOTIF_OBJS = demo-Xm.o demo-Xm-widgets.o \ + blurb.o exec.o prefs.o prefsw.o dpms.o remote.o \ + clientmsg.o atoms.o \ + $(UTILS_BIN)/xmu.o \ + $(UTILS_BIN)/resources.o \ + $(UTILS_BIN)/visual.o \ + $(UTILS_BIN)/usleep.o +MOTIF_LIBS = $(LIBS_PRE) $(XDPMS_LIBS) $(XDPMS_LIBS) @MOTIF_LIBS@ \ + @PNG_LIBS@ -lXt -lX11 -lXext -lXi $(LIBS_POST) + +TEST_SRCS = test-passwd.c test-uid.c test-xdpms.c test-grab.c \ + test-fade.c test-xinerama.c test-vp.c test-randr.c \ + xdpyinfo.c test-screens.c test-yarandom.c test-xinput.c \ + test-xkb.c +TEST_EXES = test-passwd test-uid test-xdpms test-grab \ + test-fade test-xinerama test-vp test-randr \ + xdpyinfo test-screens test-yarandom test-xinput \ + test-xkb + +EXES = xscreensaver xscreensaver-command xscreensaver-settings +UTIL_EXES = xscreensaver-gfx @EXES_SYSTEMD@ +SETUID_EXES = xscreensaver-auth +DEMO_EXES = @ALL_DEMO_PROGRAMS@ EXES_SYSTEMD = xscreensaver-systemd -SCRIPTS_1 = xscreensaver-getimage-file xscreensaver-getimage-video \ - xscreensaver-text -SCRIPTS_OSX = xscreensaver-getimage-desktop -SCRIPTS = $(SCRIPTS_1) @SCRIPTS_OSX@ - HDRS = XScreenSaver_ad.h XScreenSaver_Xm_ad.h \ xscreensaver.h prefs.h remote.h exec.h \ - demo-Gtk-conf.h auth.h mlstring.h types.h -MEN_1 = xscreensaver.man xscreensaver-demo.man \ - xscreensaver-command.man \ - xscreensaver-text.man \ - xscreensaver-getimage.man \ - xscreensaver-getimage-file.man \ - xscreensaver-getimage-video.man \ - xscreensaver-systemd.man -MEN_OSX = xscreensaver-getimage-desktop.man pdf2jpeg.man -MEN = $(MEN_1) @MEN_OSX@ + demo-Gtk-conf.h auth.h types.h blurb.h atoms.h clientmsg.h \ + screens.h xinput.h fade.h +MENA = xscreensaver.man xscreensaver-settings.man \ + xscreensaver-command.man +MENB = xscreensaver-gfx.man xscreensaver-auth.man \ + xscreensaver-command.man xscreensaver-systemd.man EXTRAS = README Makefile.in \ XScreenSaver.ad.in XScreenSaver-Xm.ad xscreensaver.pam.in \ - xscreensaver-demo.ui \ - screensaver-properties.desktop.in \ + xscreensaver.ui screensaver-properties.desktop.in \ .gdbinit -VMSFILES = compile_axp.com compile_decc.com link_axp.com link_decc.com \ - vms-getpwnam.c vms-pwd.h vms-hpwd.c vms-validate.c \ - vms_axp.opt vms_axp_12.opt vms_decc.opt vms_decc_12.opt -TARFILES = $(EXTRAS) $(VMSFILES) $(SAVER_SRCS_1) $(SYSTEMD_SRCS) \ - $(MOTIF_SRCS) $(GTK_SRCS) $(PWENT_SRCS) $(PWHELPER_SRCS) \ - $(KERBEROS_SRCS) $(PAM_SRCS) $(LOCK_SRCS_1) $(DEMO_SRCS_1) \ - $(CMD_SRCS) $(GETIMG_SRCS_1) $(PDF2JPEG_SRCS) $(HDRS) \ - $(SCRIPTS_1) $(SCRIPTS_OSX) $(MEN_1) $(MEN_OSX) \ - $(TEST_SRCS) +TARFILES = $(DAEMON_SRCS) $(GFX_SRCS) $(AUTH_SRCS) $(SYSTEMD_SRCS) \ + $(CMD_SRCS) $(GTK_SRCS) $(MOTIF_SRCS) $(PWENT_SRCS) \ + $(PWHELPER_SRCS) $(KERBEROS_SRCS) $(PAM_SRCS) \ + $(HDRS) $(MENA) $(MENB) $(TEST_SRCS) $(EXTRAS) +default: $(EXES) $(UTIL_EXES) $(SETUID_EXES) +all: $(EXES) $(UTIL_EXES) $(SETUID_EXES) $(DEMO_EXES) +tests: $(TEST_EXES) -default: $(EXES) -all: $(EXES) $(EXES2) -tests: $(TEST_EXES) -install: install-program install-ad install-scripts \ - install-gnome install-man install-xml install-pam -uninstall: uninstall-program uninstall-ad \ - uninstall-gnome uninstall-man uninstall-xml +############################################################################## +# +# Installation +# +############################################################################## -install-strip: - $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \ - install +install: install-program install-ad install-man install-xml \ + install-pam install-gnome +uninstall: uninstall-program uninstall-ad uninstall-man uninstall-xml \ + uninstall-gnome -install-program: $(EXES) - @if [ ! -d $(install_prefix)$(bindir) ]; then \ - $(INSTALL_DIRS) $(install_prefix)$(bindir) ; \ +install-strip: + $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install + +install-program:: $(EXES) + @if [ ! -d $(install_prefix)$(bindir) ]; then \ + $(INSTALL_DIRS) $(install_prefix)$(bindir) ; \ + fi ; \ + if [ ! -d $(install_prefix)$(HACKDIR) ]; then \ + $(INSTALL_DIRS) $(install_prefix)$(HACKDIR) ; \ fi - @inst="$(INSTALL_PROGRAM)" ; \ - if [ @NEED_SETUID@ = yes ]; then \ - me=`PATH="$$PATH:/usr/ucb" whoami` ; \ - if [ "$$me" = root ]; then \ - inst="$(INSTALL_SETUID)" ; \ - else \ - e=echo ; \ - $$e "" ;\ - $$e " ####################################################################";\ - $$e " Warning: xscreensaver has been compiled with support for shadow" ;\ - $$e " passwords. If your system actually uses shadow passwords," ;\ - $$e " then xscreensaver must be installed as a setuid root" ;\ - $$e " program in order for locking to work. To do this, you" ;\ - $$e " must run 'make install' as 'root', not as '$$me'." ;\ - $$e "" ;\ - $$e " For now, xscreensaver will be installed non-setuid, which" ;\ - $$e " means that locking might not work. (Try it and see.)" ;\ - $$e " ####################################################################";\ - $$e "" ;\ - fi ; \ - fi ; \ - echo $$inst xscreensaver $(install_prefix)$(bindir)/xscreensaver ; \ - $$inst xscreensaver $(install_prefix)$(bindir)/xscreensaver - @for exe in xscreensaver-command xscreensaver-demo \ - xscreensaver-getimage @EXES_OSX@ @EXES_SYSTEMD@ ; do \ - echo $(INSTALL_PROGRAM) $$exe $(install_prefix)$(bindir)/$$exe ; \ - $(INSTALL_PROGRAM) $$exe $(install_prefix)$(bindir)/$$exe ; \ + +install-program:: $(EXES) + @inst="$(INSTALL_PROGRAM)" ; \ + for exe in $(EXES); do \ + echo $$inst $$exe $(install_prefix)$(bindir)/$$exe ; \ + $$inst $$exe $(install_prefix)$(bindir)/$$exe ; \ + done + +install-program:: $(UTIL_EXES) + @inst="$(INSTALL_PROGRAM)" ; \ + for exe in $(UTIL_EXES); do \ + echo $$inst $$exe $(install_prefix)$(HACKDIR)/$$exe ; \ + $$inst $$exe $(install_prefix)$(HACKDIR)/$$exe ; \ done +install-program:: $(SETUID_EXES) + @inst="$(INSTALL_PROGRAM)" ; \ + idir="$(install_prefix)$(HACKDIR)" ; \ + if [ @SETUID_AUTH@ = yes ]; then \ + inst="$(INSTALL_SETUID)" ; \ + else \ + inst="$(INSTALL_PROGRAM)" ; \ + fi ; \ + for exe in $(SETUID_EXES); do \ + echo $$inst $$exe $$idir/$$exe ; \ + if $$inst $$exe $$idir/$$exe ; then \ + true ; \ + elif [ @SETUID_AUTH@ = yes ]; then \ + echo $(INSTALL_PROGRAM) $$exe $$idir/$$exe ; \ + if $(INSTALL_PROGRAM) $$exe $$idir/$$exe ; then \ + echo "" ; \ + echo "WARNING: unable to install $$exe setuid." ; \ + echo "WARNING: authentication may not work!" ; \ + echo "" ; \ + else \ + exit 1 ; \ + fi ; \ + else \ + exit 1 ; \ + fi ; \ + done + + +# Symlink from xscreensaver-demo -> xscreensaver-settings in /usr/bin/ +install-program:: + @D=$(install_prefix)$(bindir) ; \ + echo ln -sf xscreensaver-settings $$D/xscreensaver-demo ; \ + ln -sf xscreensaver-settings $$D/xscreensaver-demo + install-ad: XScreenSaver.ad @if [ ! -d $(install_prefix)$(AD_DIR) ]; then \ $(INSTALL_DIRS) $(install_prefix)$(AD_DIR) ; \ - fi - @-echo $(INSTALL_DATA) XScreenSaver.ad \ + fi ; \ + echo $(INSTALL_DATA) XScreenSaver.ad \ $(install_prefix)$(AD_DIR)/XScreenSaver ; \ if $(INSTALL_DATA) XScreenSaver.ad \ $(install_prefix)$(AD_DIR)/XScreenSaver ; then \ @@ -332,101 +337,106 @@ install-ad: XScreenSaver.ad $$e "" ;\ $$e " ####################################################################";\ $$e " Warning: unable to install $(install_prefix)$(AD_DIR)/XScreenSaver" ;\ - $$e " The directory is unwritable. This is probably ok;" ;\ - $$e " xscreensaver should work without that file." ;\ + $$e " This is probably ok; it should work without that file." ;\ $$e " ####################################################################";\ $$e "" ;\ exit 0 ; \ fi \ fi -install-scripts: $(SCRIPTS) munge-scripts - @for program in $(SCRIPTS); do \ - if [ -r $$program ] ; then \ - p=$$program ; \ - else \ - p=$(srcdir)/$$program ; \ - fi ; \ - echo $(INSTALL_SCRIPT) $$p \ - $(install_prefix)$(bindir)/$$program ; \ - $(INSTALL_SCRIPT) $$p \ - $(install_prefix)$(bindir)/$$program ; \ - done - -munge-scripts: $(SCRIPTS) - @tmp=/tmp/mf.$$$$ ; \ - perl="${PERL}" ; \ - rm -f $$tmp ; \ - for program in $(SCRIPTS); do \ - sed "s@^\(#!\)\(/[^ ]*/perl[^ ]*\)\(.*\)\$$@\1$$perl\3@" \ - < $(srcdir)/$$program > $$tmp ; \ - if cmp -s $(srcdir)/$$program $$tmp ; then \ - true ; \ - else \ - echo "$$program: setting interpreter to $$perl" >&2 ; \ - cat $$tmp > ./$$program ; \ - fi ; \ - done ; \ - rm -f $$tmp - # When installing man pages, we install "foo.man" as "foo.N" and update # the .TH line in the installed file with one like # # .TH XScreenSaver N "V.VV (DD-MMM-YYYY)" "X Version 11" # -# where N is the manual section suffix. +# where N is the manual section suffix (usually 1 or 6, depending). # -install-man: $(MEN) - @men="$(MEN)" ; \ +install-man:: $(MENA) $(MENB) + @ \ U=$(UTILS_SRC)/version.h ; \ - V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U` ; \ - T=/tmp/xs$$$$.$(mansuffix) ; \ - TH=".TH XScreenSaver $(mansuffix) \"$$V\" \"X Version 11\"" ; \ - echo "installing man pages: $$TH" ; \ + V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U | \ + head -1` ; \ + T=/tmp/xs$$$$.man ; \ + SUFA=$(mansuffixA) ; \ + SUFB=$(mansuffixB) ; \ \ - if [ ! -d $(install_prefix)$(manNdir) ]; then \ - $(INSTALL_DIRS) $(install_prefix)$(manNdir) ; \ - fi ; \ + INST() { \ + TH=".TH XScreenSaver $$SUF \"$$V\" \"X Version 11\"" ; \ + DIR="$(install_prefix)$(mandir)/man$$SUF" ; \ + if [ ! -d $$DIR ]; then \ + echo $(INSTALL_DIRS) $$DIR ; \ + $(INSTALL_DIRS) $$DIR ; \ + fi ; \ \ - for man in $$men; do \ - instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \ - manbase=`echo $$man | sed 's/\.man$$//'` ; \ - TH=".TH $$manbase $(mansuffix) \"$$V\" \"X Version 11\" \"XScreenSaver manual\"" ; \ sed -e "s/^\.TH.*/$$TH/" \ - -e 's/^\(\.BR xscr.*(\)[^()]\(.*\)/\1$(mansuffix)\2/' \ - -e 's@(MANSUFFIX)@($(mansuffix))@g' \ + -e "s/^\(\.BR xscreens[^ ]* (\)[0-9]\(.*\)/\1$$SUFA\2/" \ + -e "s@(MANSUFFIX)@($$SUFB)@g" \ < $(srcdir)/$$man > $$T ; \ - echo $(INSTALL_DATA) $(srcdir)/$$man \ - $(install_prefix)$(manNdir)/$$instname ; \ - $(INSTALL_DATA) $$T \ - $(install_prefix)$(manNdir)/$$instname ; \ - done ; \ + manbase=`echo $$man | sed 's/\.man$$//'` ; \ + echo $(INSTALL_DATA) $$man $$DIR/$$manbase.$$SUF ; \ + $(INSTALL_DATA) $$T $$DIR/$$manbase.$$SUF ; \ + } ; \ + \ + SUF=$$SUFA ; for man in $(MENA); do INST ; done ; \ + SUF=$$SUFB ; for man in $(MENB); do INST ; done ; \ rm -f $$T -uninstall-program: - @for program in $(EXES) $(SCRIPTS); do \ +# Symlink from xscreensaver-demo.1 -> xscreensaver-settings.1 in /usr/man/man1/ +install-man:: + @D=$(install_prefix)$(mandir)/man$(mansuffixA) ; \ + F1=xscreensaver-settings.$(mansuffixA) ; \ + F2=xscreensaver-demo.$(mansuffixA) ; \ + echo ln -sf $$F1 $$D/$$F2 ; \ + ln -sf $$F1 $$D/$$F2 + +# These used to be in driver/ and installed into $(bindir) +# Now they are in hacks/ and are installed into ${libexecdir}/xscreensaver/ +OLD_EXES = xscreensaver-getimage xscreensaver-getimage-file \ + xscreensaver-getimage-video xscreensaver-text \ + xscreensaver-systemd +OLD_MEN = xscreensaver-getimage.man xscreensaver-getimage-file.man \ + xscreensaver-getimage-video.man xscreensaver-text.man \ + xscreensaver-demo.man +uninstall-program:: + @for program in $(EXES) $(OLD_EXES); do \ echo rm -f $(install_prefix)$(bindir)/$$program ; \ rm -f $(install_prefix)$(bindir)/$$program ; \ done +uninstall-program:: + @for program in $(UTIL_EXES) $(SETUID_EXES); do \ + echo rm -f $(install_prefix)$(HACKDIR)/$$program ; \ + rm -f $(install_prefix)$(HACKDIR)/$$program ; \ + done + uninstall-ad: rm -f $(install_prefix)$(AD_DIR)/XScreenSaver uninstall-man: - @men="$(MEN)" ; \ + @men="$(MEN) $(OLD_MEN)" ; \ for man in $$men; do \ instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \ - echo rm -f $(install_prefix)$(manNdir)/$$instname* ; \ - rm -f $(install_prefix)$(manNdir)/$$instname* ; \ + echo rm -f $(install_prefix)$(manAdir)/$$instname* ; \ + rm -f $(install_prefix)$(manAdir)/$$instname* ; \ done install-pam: xscreensaver.pam - @src="xscreensaver.pam" ; \ - dest=`sed -n 's/.*PAM_SERVICE_NAME[ ]*"\([^"]*\)".*$$/\1/p' \ + @src="xscreensaver.pam" ; \ + name=`sed -n 's/.*PAM_SERVICE_NAME[ ]*"\([^"]*\)".*$$/\1/p' \ < ../config.h` ; \ dir="$(install_prefix)$(PAM_DIR)" ; \ conf="$(PAM_CONF)" ; \ \ + if [ -z "$$name" ]; then \ + echo "PAM not configured, not installing" >&2 ; \ + exit 0 ; \ + fi ; \ + \ + if [ ! -d $(install_prefix)$(PAM_ROOT) ]; then \ + echo $(INSTALL_DIRS) $(install_prefix)$(PAM_ROOT) ; \ + $(INSTALL_DIRS) $(install_prefix)$(PAM_ROOT) ; \ + fi ; \ + \ if [ -d $$dir ] ; then \ \ if [ -f $$dir/xdm ]; then \ @@ -436,52 +446,50 @@ install-pam: xscreensaver.pam fi ; \ \ if [ -z "$$src2" ]; then \ - echo $(INSTALL_DATA) $$src $$dir/$$dest ; \ - $(INSTALL_DATA) $$src $$dir/$$dest ; \ + echo $(INSTALL_DATA) $$src $$dir/$$name ; \ + $(INSTALL_DATA) $$src $$dir/$$name ; \ else \ - src="xscreensaver.pam.$$$$" ; \ - echo "grep '^#%\|^auth\|^@include' $$src2 > $$src" ; \ - grep '^#%\|^auth\|^@include' $$src2 > $$src ; \ - echo $(INSTALL_DATA) $$src $$dir/$$dest ; \ - $(INSTALL_DATA) $$src $$dir/$$dest ; \ - echo rm -f $$src ; \ - rm -f $$src ; \ + tmp="xscreensaver.pam.$$$$" ; \ + grep '^#%\|^auth\|^@include' $$src2 > $$tmp ; \ + if cmp -s $$tmp $$dir/$$name ; then \ + echo "$$dir/$$name unchanged" ; \ + else \ + echo "Updating contents of $$dir/$$name from $$src2" ; \ + $(INSTALL_DATA) $$tmp $$dir/$$name ; \ + fi ; \ + rm -f $$tmp ; \ fi ; \ \ - if [ ! -f $$dir/$$dest ]; then \ + if [ ! -f $$dir/$$name ]; then \ e=echo ; \ $$e "" ;\ $$e " ####################################################################";\ $$e " Warning: xscreensaver has been compiled with support for Pluggable" ;\ $$e " Authentication Modules (PAM). However, we were unable to" ;\ - $$e " install the file $$dir/$$dest. PAM is unlikely" ;\ - $$e " to work without this file (and old-style password" ;\ - $$e " authentication will be used instead, which may or may not" ;\ - $$e " work.)" ;\ + $$e " install the file \"$$dir/$$name\". XScreenSaver is" ;\ + $$e " unlikely to work without this file." ;\ $$e " ####################################################################";\ $$e "" ;\ fi ; \ - elif [ -f $$conf -a "x$$dest" != "x" ]; then \ - if ( grep $$dest $$conf >/dev/null ); then \ - echo "$$conf unchanged: already has an entry for $$dest" ; \ + elif [ -f $$conf -a "x$$name" != "x" ]; then \ + if ( grep $$name $$conf >/dev/null ); then \ + echo "$$conf unchanged: already has an entry for $$name" ; \ else \ - src="pam.conf.$$$$" ; \ - echo "grep -v $$dest $$conf > $$src" ; \ - grep -v $$dest $$conf > $$src ; \ - extras=`sed -n "s/^login\(.*auth.*\)$$/$$dest\1/p" $$conf`; \ - echo "$$extras" >> $$src ; \ + tmp="pam.conf.$$$$" ; \ + grep -v $$name $$conf > $$tmp ; \ + extras=`sed -n "s/^login\(.*auth.*\)$$/$$name\1/p" $$conf`; \ + echo "$$extras" >> $$tmp ; \ if [ "x$$extras" = "x" ]; then \ echo "Error: no login rules in $$conf?" >&2 ; \ else \ - echo "adding $$dest rules to $$src:" ; \ + echo "adding $$name rules to $$conf:" ; \ + echo "" ; \ echo "$$extras" | sed 's/^/ /' ; \ fi ; \ - echo $(INSTALL_DATA) $$src $$conf ; \ - $(INSTALL_DATA) $$src $$conf ; \ - echo rm -f $$src ; \ - rm -f $$src ; \ + $(INSTALL_DATA) $$tmp $$conf ; \ + rm -f $$tmp ; \ fi ; \ - if ( grep $$dest $$conf >/dev/null ); then \ + if ( grep $$name $$conf >/dev/null ); then \ echo ; \ else \ e=echo ; \ @@ -490,12 +498,17 @@ install-pam: xscreensaver.pam $$e " Warning: xscreensaver has been compiled with support for Pluggable" ;\ $$e " Authentication Modules (PAM). However, we were unable to" ;\ $$e " install xscreensaver rules in the file $$conf." ;\ - $$e " PAM is unlikely to work without this (and old-style" ;\ - $$e " password authentication will be used instead, which may" ;\ - $$e " or may not work.)" ;\ + $$e " XScreenSaver is unlikely to work without this." ;\ $$e " ####################################################################";\ $$e "" ;\ fi ; \ + else \ + e=echo ; \ + $$e "" ;\ + $$e " ####################################################################";\ + $$e " Warning: $$dir/ does not exist, not installing PAM config." ;\ + $$e " ####################################################################";\ + $$e "" ;\ fi # screensaver-properties.desktop @@ -546,18 +559,18 @@ install-gnome:: done ;\ fi -# xscreensaver-demo.ui +# xscreensaver.ui # into /usr/share/xscreensaver/ui/ -install-gnome:: xscreensaver-demo.ui +install-gnome:: xscreensaver.ui @if [ "$(GTK_DATADIR)" != "" ]; then \ if [ ! -d "$(install_prefix)$(GTK_UIDIR)" ]; then \ echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_UIDIR)" ;\ $(INSTALL_DIRS) "$(install_prefix)$(GTK_UIDIR)" ;\ fi ;\ - target=xscreensaver-demo.ui ;\ - echo $(INSTALL_DATA) $$target \ + target=xscreensaver.ui ;\ + echo $(INSTALL_DATA) $(srcdir)/$$target \ $(install_prefix)$(GTK_UIDIR)/$$target ;\ - if $(INSTALL_DATA) $$target \ + if $(INSTALL_DATA) $(srcdir)/$$target \ $(install_prefix)$(GTK_UIDIR)/$$target ;\ then true ;\ else \ @@ -566,7 +579,7 @@ install-gnome:: xscreensaver-demo.ui $$e " ####################################################################";\ $$e " Warning: unable to install $$target into" ;\ $$e " $(install_prefix)$(GTK_UIDIR)/." ;\ - $$e " Without this file, xscreensaver-demo will not" ;\ + $$e " Without this file, xscreensaver-settings will not" ;\ $$e " be able to run properly." ;\ $$e " ####################################################################";\ $$e "" ;\ @@ -604,18 +617,23 @@ uninstall-gnome:: done ;\ fi -# xscreensaver-demo.ui +# xscreensaver.ui # into /usr/share/xscreensaver/ui/ uninstall-gnome:: @if [ "$(GTK_DATADIR)" != "" ]; then \ - target=xscreensaver-demo.ui ;\ - echo rm -f $(install_prefix)$(GTK_UIDIR)/$$target ;\ - rm -f $(install_prefix)$(GTK_UIDIR)/$$target ;\ + for target in xscreensaver.ui xscreensaver-demo.ui ; do \ + echo rm -f $(install_prefix)$(GTK_UIDIR)/$$target ;\ + rm -f $(install_prefix)$(GTK_UIDIR)/$$target ;\ + done ;\ + rmdir "$(GTK_UIDIR)" ;\ + rmdir "$(GTK_DATADIR)/xscreensaver" ;\ + exit 0 ;\ fi # /usr/share/xscreensaver/glade/ no longer used uninstall-gnome:: - -rm -rf $(OLD_GLADEDIR) + -rm -rf $(GTK_DATADIR)/xscreensaver/glade + # /usr/share/xscreensaver/config/README install-xml: @@ -632,8 +650,16 @@ install-xml: uninstall-xml: rm -f $(install_prefix)$(HACK_CONF_DIR)/README + +############################################################################## +# +# Clean and dependencies +# +############################################################################## + clean: - -rm -f *.o a.out core $(EXES) $(EXES2) $(TEST_EXES) \ + -rm -f *.o a.out core $(EXES) $(UTIL_EXES) $(SETUID_EXES) \ + $(DEMO_EXES) $(TEST_EXES) \ XScreenSaver_ad.h XScreenSaver_Xm_ad.h distclean: clean @@ -649,7 +675,7 @@ depend: XScreenSaver_ad.h XScreenSaver_Xm_ad.h $(DEPEND) -s '# DO NOT DELETE: updated by make depend' \ $(DEPEND_FLAGS) -- \ $(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \ - $(SAVER_SRCS) $(CMD_SRCS) $(GETIMG_SRCS_1) + $(SAVER_SRCS) $(CMD_SRCS) # Adds some dependencies to Makefile.in -- not totally accurate, but pretty # close. This excludes dependencies on files in /usr/include, etc. It tries @@ -662,8 +688,8 @@ distdepend: check_men update_ad_version XScreenSaver_ad.h XScreenSaver_Xm_ad.h $(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \ $(SAVER_SRCS_1) $(SYSTEMD_SRCS) $(MOTIF_SRCS) $(GTK_SRCS) \ $(PWENT_SRCS) $(PWHELPER_SRCS) $(KERBEROS_SRCS) $(PAM_SRCS) \ - $(LOCK_SRCS_1) $(DEMO_SRCS_1) $(CMD_SRCS) $(GETIMG_SRCS_1) \ - $(PDF2JPEG_SRCS) $(TEST_SRCS) 2>/dev/null | \ + $(LOCK_SRCS_1) $(DEMO_SRCS_1) $(CMD_SRCS) \ + $(TEST_SRCS) 2>/dev/null | \ sort -d | \ ( \ awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \ @@ -686,7 +712,7 @@ update_ad_version:: @ \ files="XScreenSaver.ad.in ../hacks/config/README ../OSX/bindist.rtf" ; \ U=$(UTILS_SRC)/version.h ; \ - V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' < $$U` ; \ + V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^ ]*\).*/\1/p' < $$U | head -1` ; \ Y=`date '+%Y'` ; \ D=`date '+%d-%b-%Y'` ; \ for S in $$files ; do \ @@ -708,9 +734,9 @@ TAGS: tags tags: find $(srcdir) -name '*.[chly]' -print | xargs etags -a -echo_tarfiles: +list_tarfiles: @$(MAKE) XScreenSaver_ad.h XScreenSaver_Xm_ad.h 2>&1 >/dev/null - @echo $(TARFILES) + @find $(TARFILES) -type f -print | sort check_men: @badmen="" ; \ @@ -730,11 +756,12 @@ check_men: fi -# Rules for noticing when the objects from the utils directory are out of -# date with respect to their sources, and going and building them according -# to the rules in their own Makefile... +############################################################################## # -$(UTILS_BIN)/fade.o: $(UTILS_SRC)/fade.c +# Dependencies on utils/ +# +############################################################################## + $(UTILS_BIN)/overlay.o: $(UTILS_SRC)/overlay.c $(UTILS_BIN)/resources.o: $(UTILS_SRC)/resources.c $(UTILS_BIN)/usleep.o: $(UTILS_SRC)/usleep.c @@ -747,151 +774,219 @@ $(UTILS_BIN)/colorbars.o: $(UTILS_SRC)/colorbars.c $(UTILS_BIN)/hsv.o: $(UTILS_SRC)/hsv.c $(UTILS_BIN)/colors.o: $(UTILS_SRC)/colors.c $(UTILS_BIN)/grabscreen.o: $(UTILS_SRC)/grabscreen.c +$(UTILS_BIN)/utf8wc.o: $(UTILS_SRC)/utf8wc.c +$(UTILS_BIN)/xftwrap.o: $(UTILS_SRC)/xftwrap.c $(UTILS_BIN)/font-retry.o: $(UTILS_SRC)/font-retry.c - -UTIL_OBJS = $(SAVER_UTIL_OBJS) $(UTILS_BIN)/colorbars.o \ - $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o \ - $(UTILS_BIN)/grabscreen.o +$(UTILS_BIN)/xshm.o: $(UTILS_SRC)/xshm.c +$(UTILS_BIN)/aligned_malloc.o: $(UTILS_SRC)/aligned_malloc.c + + +UTIL_OBJS = $(UTILS_BIN)/overlay.o \ + $(UTILS_BIN)/resources.o \ + $(UTILS_BIN)/usleep.o \ + $(UTILS_BIN)/visual.o \ + $(UTILS_BIN)/xmu.o \ + $(UTILS_BIN)/logo.o \ + $(UTILS_BIN)/minixpm.o \ + $(UTILS_BIN)/yarandom.o \ + $(UTILS_BIN)/colorbars.o \ + $(UTILS_BIN)/hsv.o \ + $(UTILS_BIN)/colors.o \ + $(UTILS_BIN)/grabscreen.o \ + $(UTILS_BIN)/xft.o \ + $(UTILS_BIN)/xftwrap.o \ + $(UTILS_BIN)/utf8wc.o \ + $(UTILS_BIN)/font-retry.o \ + $(UTILS_BIN)/xshm.o \ + $(UTILS_BIN)/aligned_malloc.o $(UTIL_OBJS): cd $(UTILS_BIN) ; \ $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" + +############################################################################## +# +# Compiling the daemon: xscreensaver, xscreensaver-gfx, xscreensaver-auth, +# xscreensaver-systemd and xscreensaver-comand. +# +############################################################################## + # How we build object files in this directory. CC_ALL=$(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) .c.o: $(CC) -c $(CC_ALL) $< -.m.o: - $(OBJCC) -c $(CC_ALL) $< -# subprocs takes an extra -D option. -subprocs.o: subprocs.c - $(CC) -c $(CC_ALL) $(SUBP_DEFS) $(srcdir)/subprocs.c +# # subprocs takes an extra -D option. +# subprocs.o: subprocs.c +# $(CC) -c $(CC_ALL) $(SUBP_DEFS) $< # xscreensaver takes an extra -D option. xscreensaver.o: xscreensaver.c - $(CC) -c $(CC_ALL) $(INTL_DEFS) $(srcdir)/xscreensaver.c - -# demo-Gtk and demo-Gtk-conf take extra -D and -I options. -DEMO_GTK=$(CONF_DEFS) $(SUBP_DEFS) $(GTK_DEFS) $(INTL_DEFS) -I$(ICON_SRC) -demo-Gtk.o: demo-Gtk.c - $(CC) -c $(CC_ALL) $(DEMO_GTK) $(srcdir)/demo-Gtk.c -demo-Gtk-conf.o: demo-Gtk-conf.c - $(CC) -c $(CC_ALL) $(DEMO_GTK) $(srcdir)/demo-Gtk-conf.c + $(CC) -c $(CC_ALL) $(DAEMON_DEFS) $< +xscreensaver-auth.o: XScreenSaver_ad.h +xscreensaver-auth.o: xscreensaver-auth.c + $(CC) -c $(CC_ALL) $(AUTH_DEFS) $< -# How we build the default app-defaults file into the program. -# -XScreenSaver_ad.h: XScreenSaver.ad - $(SHELL) $(UTILS_SRC)/ad2c XScreenSaver.ad > XScreenSaver_ad.h +xscreensaver: $(DAEMON_OBJS) + $(CC) $(LDFLAGS) -o $@ $(DAEMON_OBJS) $(DAEMON_LIBS) -XScreenSaver_Xm_ad.h: XScreenSaver-Xm.ad - $(SHELL) $(UTILS_SRC)/ad2c XScreenSaver-Xm.ad > XScreenSaver_Xm_ad.h +xscreensaver-gfx.o: XScreenSaver_ad.h +xscreensaver-gfx.o: xscreensaver-gfx.c + $(CC) -c $(CC_ALL) $(GFX_DEFS) $< +xscreensaver-gfx: $(GFX_OBJS) + $(CC) $(LDFLAGS) -o $@ $(GFX_OBJS) $(GFX_LIBS) -@INTLTOOL_DESKTOP_RULE@ +dialog.o: dialog.c + $(CC) -c $(CC_ALL) $(AUTH_DEFS) $< +xscreensaver-auth: $(AUTH_OBJS) + $(CC) $(LDFLAGS) -o $@ $(AUTH_OBJS) $(AUTH_LIBS) -# The executables linked in this directory. -# -xscreensaver: $(SAVER_OBJS) - $(CC) $(LDFLAGS) -o $@ $(SAVER_OBJS) $(SAVER_LIBS) $(INTL_LIBS) +xscreensaver-systemd: $(SYSTEMD_OBJS) + $(CC) $(LDFLAGS) -o $@ $(SYSTEMD_OBJS) $(SYSTEMD_LIBS) -lm xscreensaver-command: $(CMD_OBJS) $(CC) $(LDFLAGS) -o $@ $(CMD_OBJS) $(CMD_LIBS) -xscreensaver-demo: @PREFERRED_DEMO_PROGRAM@ +############################################################################## +# +# Compiling the GUI, xscreensaver-settings +# +############################################################################## + +demo-Gtk.o: XScreenSaver_ad.h +demo-Gtk.o: demo-Gtk.c + $(CC) -c $(CC_ALL) $(GTK_DEFS) $< +demo-Gtk-conf.o: demo-Gtk-conf.c + $(CC) -c $(CC_ALL) $(GTK_DEFS) $< + +xscreensaver-settings-Gtk: $(GTK_OBJS) + $(CC) $(LDFLAGS) -o $@ $(GTK_OBJS) $(GTK_LIBS) + + +demo-Xm.o: XScreenSaver_ad.h +demo-Xm.o: demo-Xm.c + $(CC) -c $(CC_ALL) $(GTK_DEFS) $< +demo-Xm-widgets.o: demo-Xm-widgets.c + $(CC) -c $(CC_ALL) $(GTK_DEFS) $< + +xscreensaver-settings-Xm: $(MOTIF_OBJS) + $(CC) $(LDFLAGS) -o $@ $(MOTIF_OBJS) $(MOTIF_LIBS) + +xscreensaver-settings: @PREFERRED_DEMO_PROGRAM@ @if [ "@PREFERRED_DEMO_PROGRAM@" = "" ]; then \ echo "WARNING: neither GTK nor Motif are available," \ - "therefore no xscreensaver-demo!" ; \ + "therefore no xscreensaver-settings!" ; \ rm -f $@@EXEEXT@ ; \ else \ echo cp -p @PREFERRED_DEMO_PROGRAM@@EXEEXT@ $@@EXEEXT@ ; \ cp -p @PREFERRED_DEMO_PROGRAM@@EXEEXT@ $@@EXEEXT@ ; \ fi -DEMO_XM_CC=$(DEMO_OBJS) $(MOTIF_OBJS) $(LIBS) $(X_LIBS) $(MOTIF_LIBS) -DEMO_GTK_CC=$(DEMO_OBJS) $(GTK_OBJS) $(LIBS) $(X_LIBS) $(GTK_LIBS) $(XML_LIBS) -DEMO_CC2=$(INTL_LIBS) $(X_PRE_LIBS) -lXt -lX11 $(XDPMS_LIBS) $(XINERAMA_LIBS) -DEMO_CC3=-lXext $(X_EXTRA_LIBS) -xscreensaver-demo-Xm: $(DEMO_OBJS) $(MOTIF_OBJS) - $(CC) $(LDFLAGS) -o $@ $(DEMO_XM_CC) $(DEMO_CC2) $(DEMO_CC3) -xscreensaver-demo-Gtk: $(DEMO_OBJS) $(GTK_OBJS) - $(CC) $(LDFLAGS) -o $@ $(DEMO_GTK_CC) $(DEMO_CC2) $(DEMO_CC3) +# How we build the default app-defaults file into the program. +# +XScreenSaver_ad.h:: + @TMP=/tmp/xs$$$$.h ; \ + IN="XScreenSaver.ad" ; \ + OUT=XScreenSaver_ad.h ; \ + $(UTILS_SRC)/ad2c $$IN > $$TMP ; \ + if cmp -s $$TMP $$OUT ; then \ + rm -f "$$TMP" ; \ + else \ + echo $(UTILS_SRC)/ad2c $$IN \> $$OUT ; \ + mv $$TMP $$OUT ; \ + fi -demo-Gtk.o: XScreenSaver_ad.h -demo-Xm.o: XScreenSaver_Xm_ad.h -xscreensaver.o: XScreenSaver_ad.h -xscreensaver-getimage.o: XScreenSaver_ad.h +XScreenSaver_Xm_ad.h:: + @TMP=/tmp/xs$$$$.h ; \ + IN="XScreenSaver-Xm.ad" ; \ + OUT=XScreenSaver_Xm_ad.h ; \ + $(UTILS_SRC)/ad2c $$IN > $$TMP ; \ + if cmp -s $$TMP $$OUT ; then \ + rm -f "$$TMP" ; \ + else \ + echo $(UTILS_SRC)/ad2c $$IN \> $$OUT ; \ + mv $$TMP $$OUT ; \ + fi -xscreensaver-getimage: $(GETIMG_OBJS) - $(CC) $(LDFLAGS) -o $@ $(GETIMG_OBJS) $(GETIMG_LIBS) -lm -pdf2jpeg: $(PDF2JPEG_OBJS) - $(OBJCC) $(LDFLAGS) -o $@ $(PDF2JPEG_OBJS) $(PDF2JPEG_LIBS) -lm +# Replace this with @INTLTOOL_DESKTOP_RULE@ once +# https://bugs.launchpad.net/intltool/+bug/1749904 is fixed. +.desktop.in.desktop: $(INTLTOOL_MERGE) $(top_srcdir)/po/*.po + $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) \ + $(INTLTOOL_V_MERGE_OPTIONS) -d -u \ + -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@ -xscreensaver-systemd: $(SYSTEMD_OBJS) - $(CC) $(LDFLAGS) -o $@ $(SYSTEMD_OBJS) $(SYSTEMD_LIBS) -lm -TEST_PASSWD_OBJS = test-passwd.o $(LOCK_OBJS_1) $(PASSWD_OBJS) \ - subprocs.o setuid.o splash.o prefs.o mlstring.o exec.o \ - $(SAVER_UTIL_OBJS) -test-passwd.o: XScreenSaver_ad.h +############################################################################## +# +# Debugging utilities, not built by default +# +############################################################################## -test-passwd: $(TEST_PASSWD_OBJS) XScreenSaver_ad.h - $(CC) $(LDFLAGS) -o $@ $(TEST_PASSWD_OBJS) $(SAVER_LIBS) +TESTPASS_OBJS = test-passwd.o test-passwd-b.o $(AUTH_OBJS_1) +TESTPATH_DEFS = -Dxscreensaver_auth_conv=test_auth_conv $(AUTH_DEFS) +test-passwd-b.o: XScreenSaver_ad.h +test-passwd-b.o: $(srcdir)/xscreensaver-auth.c + $(CC) -c $(CC_ALL) $(TESTPATH_DEFS) $< -o $@ +test-passwd: $(TESTPASS_OBJS) + $(CC) $(LDFLAGS) -o $@ $(TESTPASS_OBJS) $(AUTH_LIBS) test-uid: test-uid.o $(CC) $(LDFLAGS) -o $@ test-uid.o -test-xdpms: test-xdpms.o - $(CC) $(LDFLAGS) -o $@ test-xdpms.o $(LIBS) $(X_LIBS) $(XDPMS_LIBS) \ - $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) +TESTDPMS_LIBS = $(LIBS_PRE) $(XDPMS_LIBS) -lXt -lX11 -lXext $(LIBS_POST) +test-xdpms: test-xdpms.o blurb.o + $(CC) $(LDFLAGS) -o $@ test-xdpms.o blurb.o $(TESTDPMS_LIBS) -test-xinerama: test-xinerama.o - $(CC) $(LDFLAGS) -o $@ test-xinerama.o $(LIBS) $(X_LIBS) $(SAVER_LIBS) \ - $(X_PRE_LIBS) $(XINERAMA_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) +TESTXINPUT_OBJS = test-xinput.o blurb.o xinput.o +TESTXINPUT_LIBS = $(LIBS_PRE) $(XDPMS_LIBS) -lXi -lXt -lX11 -lXext $(LIBS_POST) +test-xinput: $(TESTXINPUT_OBJS) + $(CC) $(LDFLAGS) -o $@ $(TESTXINPUT_OBJS) $(TESTXINPUT_LIBS) -test-vp: test-vp.o - $(CC) $(LDFLAGS) -o $@ test-vp.o $(LIBS) $(X_LIBS) $(SAVER_LIBS) \ - $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) +TESTXIN_LIBS = $(LIBS_PRE) $(XINERAMA_LIBS) -lXi -lXt -lX11 -lXext $(LIBS_POST) +test-xinerama: test-xinerama.o blurb.o + $(CC) $(LDFLAGS) -o $@ test-xinerama.o blurb.o $(TESTXIN_LIBS) -test-randr: test-randr.o - $(CC) $(LDFLAGS) -o $@ test-randr.o $(LIBS) $(X_LIBS) $(SAVER_LIBS) \ - $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) +TESTXKB_OBJS = test-xkb.o blurb.o +TESTXKB_LIBS = $(LIBS_PRE) $(XDPMS_LIBS) -lXi -lXt -lX11 -lXext $(LIBS_POST) +test-xkb: $(TESTXKB_OBJS) + $(CC) $(LDFLAGS) -o $@ $(TESTXKB_OBJS) $(TESTXKB_LIBS) -test-grab: test-grab.o - $(CC) $(LDFLAGS) -o $@ test-grab.o $(SAVER_LIBS) +test-vp: test-vp.o blurb.o + $(CC) $(LDFLAGS) -o $@ test-vp.o blurb.o $(GFX_LIBS) -test-apm: test-apm.o - $(CC) $(LDFLAGS) -o $@ test-apm.o $(SAVER_LIBS) -lapm +test-randr: test-randr.o blurb.o + $(CC) $(LDFLAGS) -o $@ test-randr.o blurb.o $(GFX_LIBS) -test-mlstring.o: mlstring.c -test-mlstring: test-mlstring.o - $(CC) -DTEST $(LDFLAGS) -o $@ test-mlstring.o $(SAVER_LIBS) +TESTGRAB_LIBS = $(LIBS_PRE) -lXt -lX11 -lXext $(LIBS_POST) +test-grab: test-grab.o blurb.o + $(CC) $(LDFLAGS) -o $@ test-grab.o blurb.o $(TESTGRAB_LIBS) -TEST_FADE_OBJS = test-fade.o $(UTILS_BIN)/fade.o $(DEMO_UTIL_OBJS) -test-fade: test-fade.o $(UTILS_BIN)/fade.o - $(CC) $(LDFLAGS) -o $@ $(TEST_FADE_OBJS) $(SAVER_LIBS) +TEST_FADE_OBJS = test-fade.o fade.o blurb.o atoms.o clientmsg.o xinput.o \ + $(UTILS_BIN)/visual.o $(UTILS_BIN)/resources.o $(UTILS_BIN)/usleep.o \ + $(UTILS_BIN)/logo.o $(UTILS_BIN)/minixpm.o $(UTILS_BIN)/xshm.o \ + $(UTILS_BIN)/xmu.o $(UTILS_BIN)/aligned_malloc.o +test-fade: $(TEST_FADE_OBJS) + $(CC) $(LDFLAGS) -o $@ $(TEST_FADE_OBJS) $(GFX_LIBS) -TEST_SCREENS_OBJS = test-screens.o $(DEMO_UTIL_OBJS) -test-screens.o: screens.c -test-screens: test-screens.o - $(CC) $(LDFLAGS) -o $@ $(TEST_SCREENS_OBJS) $(SAVER_LIBS) +TEST_SCREENS_OBJS = test-screens.o screens.o blurb.o +test-screens: $(TEST_SCREENS_OBJS) + $(CC) $(LDFLAGS) -o $@ $(TEST_SCREENS_OBJS) $(GFX_LIBS) -test-yarandom: test-yarandom.o - $(CC) -DTEST $(LDFLAGS) -o $@ test-yarandom.o $(UTILS_BIN)/yarandom.o +test-yarandom: test-yarandom.o blurb.o + $(CC) -DTEST $(LDFLAGS) -o $@ test-yarandom.o blurb.o $(UTILS_BIN)/yarandom.o +XDPY_DEFS = -DHAVE_GLX $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) +XDPY_LIBS = $(LIBS_PRE) -lGL -lX11 -lXext $(LIBS_POST) xdpyinfo.o: xdpyinfo.c - $(CC) -c $(INCLUDES) -DHAVE_GLX $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) \ - $(srcdir)/xdpyinfo.c - + $(CC) -c $(INCLUDES) $(XDPY_DEFS) $(srcdir)/xdpyinfo.c xdpyinfo: xdpyinfo.o - $(CC) $(LDFLAGS) -o $@ xdpyinfo.o \ - $(LIBS) $(X_LIBS) @GL_LIBS@ \ - $(X_PRE_LIBS) -lX11 -lXext $(X_EXTRA_LIBS) -lm - + $(CC) $(LDFLAGS) -o $@ xdpyinfo.o $(XDPY_LIBS) ############################################################################## # @@ -901,154 +996,89 @@ demo-Gtk-conf.o: ../config.h demo-Gtk-conf.o: $(srcdir)/demo-Gtk-conf.h demo-Gtk-conf.o: $(UTILS_SRC)/xscreensaver-intl.h demo-Gtk.o: XScreenSaver_ad.h +demo-Gtk.o: $(srcdir)/atoms.h +demo-Gtk.o: $(srcdir)/blurb.h demo-Gtk.o: ../config.h demo-Gtk.o: $(srcdir)/demo-Gtk-conf.h -demo-Gtk.o: $(srcdir)/prefs.h demo-Gtk.o: $(srcdir)/remote.h demo-Gtk.o: $(srcdir)/types.h demo-Gtk.o: $(UTILS_SRC)/resources.h demo-Gtk.o: $(UTILS_SRC)/usleep.h demo-Gtk.o: $(UTILS_SRC)/version.h demo-Gtk.o: $(UTILS_SRC)/visual.h +demo-Gtk.o: $(UTILS_SRC)/xmu.h demo-Gtk.o: $(UTILS_SRC)/xscreensaver-intl.h +demo-Xm.o: XScreenSaver_Xm_ad.h +demo-Xm.o: XScreenSaver_ad.h +demo-Xm.o: $(srcdir)/atoms.h +demo-Xm.o: $(srcdir)/blurb.h demo-Xm.o: ../config.h +demo-Xm.o: $(srcdir)/remote.h +demo-Xm.o: $(srcdir)/types.h +demo-Xm.o: $(UTILS_SRC)/resources.h +demo-Xm.o: $(UTILS_SRC)/version.h +demo-Xm.o: $(UTILS_SRC)/visual.h +demo-Xm.o: $(UTILS_SRC)/xmu.h demo-Xm-widgets.o: ../config.h -dpms.o: ../config.h -dpms.o: $(srcdir)/prefs.h -dpms.o: $(srcdir)/types.h -dpms.o: $(srcdir)/xscreensaver.h -exec.o: ../config.h -exec.o: $(srcdir)/exec.h -lock.o: $(srcdir)/auth.h -lock.o: ../config.h -lock.o: $(srcdir)/mlstring.h -lock.o: $(srcdir)/prefs.h -lock.o: $(srcdir)/types.h -lock.o: $(UTILS_SRC)/resources.h -lock.o: $(srcdir)/xscreensaver.h -mlstring.o: $(srcdir)/mlstring.h +passwd-helper.o: $(srcdir)/auth.h +passwd-helper.o: $(srcdir)/blurb.h passwd-helper.o: ../config.h -passwd-helper.o: $(srcdir)/prefs.h -passwd-helper.o: $(srcdir)/types.h -passwd-helper.o: $(srcdir)/xscreensaver.h +passwd-kerberos.o: $(srcdir)/auth.h +passwd-kerberos.o: $(srcdir)/blurb.h passwd-kerberos.o: ../config.h -passwd.o: $(srcdir)/auth.h -passwd.o: ../config.h -passwd.o: $(srcdir)/prefs.h -passwd.o: $(srcdir)/types.h -passwd.o: $(srcdir)/xscreensaver.h passwd-pam.o: $(srcdir)/auth.h +passwd-pam.o: $(srcdir)/blurb.h passwd-pam.o: ../config.h -passwd-pam.o: $(srcdir)/types.h +passwd-pwent.o: $(srcdir)/auth.h +passwd-pwent.o: $(srcdir)/blurb.h passwd-pwent.o: ../config.h -prefs.o: ../config.h -prefs.o: $(srcdir)/prefs.h -prefs.o: $(srcdir)/types.h -prefs.o: $(UTILS_SRC)/resources.h -prefs.o: $(UTILS_SRC)/version.h +remote.o: $(srcdir)/atoms.h +remote.o: $(srcdir)/blurb.h +remote.o: $(srcdir)/clientmsg.h remote.o: ../config.h remote.o: $(srcdir)/remote.h -screens.o: ../config.h -screens.o: $(srcdir)/prefs.h -screens.o: $(srcdir)/types.h -screens.o: $(UTILS_SRC)/visual.h -screens.o: $(srcdir)/xscreensaver.h -setuid.o: ../config.h -setuid.o: $(srcdir)/prefs.h -setuid.o: $(srcdir)/types.h -setuid.o: $(srcdir)/xscreensaver.h -splash.o: ../config.h -splash.o: $(srcdir)/prefs.h -splash.o: $(srcdir)/types.h -splash.o: $(UTILS_SRC)/font-retry.h -splash.o: $(UTILS_SRC)/resources.h -splash.o: $(srcdir)/xscreensaver.h -stderr.o: ../config.h -stderr.o: $(srcdir)/prefs.h -stderr.o: $(srcdir)/types.h -stderr.o: $(UTILS_SRC)/resources.h -stderr.o: $(UTILS_SRC)/visual.h -stderr.o: $(srcdir)/xscreensaver.h -subprocs.o: ../config.h -subprocs.o: $(srcdir)/exec.h -subprocs.o: $(srcdir)/prefs.h -subprocs.o: $(srcdir)/types.h -subprocs.o: $(UTILS_SRC)/visual.h -subprocs.o: $(UTILS_SRC)/yarandom.h -subprocs.o: $(srcdir)/xscreensaver.h -test-apm.o: ../config.h +test-fade.o: $(srcdir)/atoms.h +test-fade.o: $(srcdir)/blurb.h test-fade.o: ../config.h -test-fade.o: $(srcdir)/prefs.h +test-fade.o: $(srcdir)/fade.h +test-fade.o: $(srcdir)/screens.h test-fade.o: $(srcdir)/types.h -test-fade.o: $(UTILS_SRC)/fade.h +test-fade.o: $(UTILS_SRC)/resources.h test-fade.o: $(srcdir)/xscreensaver.h +test-grab.o: $(srcdir)/blurb.h test-grab.o: ../config.h -test-mlstring.o: $(srcdir)/mlstring.c -test-mlstring.o: $(srcdir)/mlstring.h -test-passwd.o: XScreenSaver_ad.h test-passwd.o: $(srcdir)/auth.h +test-passwd.o: $(srcdir)/blurb.h test-passwd.o: ../config.h -test-passwd.o: $(srcdir)/prefs.h -test-passwd.o: $(srcdir)/types.h -test-passwd.o: $(UTILS_SRC)/resources.h -test-passwd.o: $(UTILS_SRC)/version.h -test-passwd.o: $(UTILS_SRC)/visual.h -test-passwd.o: $(srcdir)/xscreensaver.h +test-randr.o: $(srcdir)/blurb.h test-randr.o: ../config.h +test-screens.o: $(srcdir)/blurb.h test-screens.o: ../config.h -test-screens.o: $(srcdir)/prefs.h -test-screens.o: $(srcdir)/screens.c -test-screens.o: $(srcdir)/types.h +test-screens.o: $(srcdir)/screens.h test-screens.o: $(UTILS_SRC)/visual.h -test-screens.o: $(srcdir)/xscreensaver.h test-uid.o: ../config.h +test-vp.o: $(srcdir)/blurb.h test-vp.o: ../config.h +test-xdpms.o: $(srcdir)/blurb.h test-xdpms.o: ../config.h +test-xinerama.o: $(srcdir)/blurb.h test-xinerama.o: ../config.h +test-xinput.o: $(srcdir)/blurb.h +test-xinput.o: ../config.h +test-xinput.o: $(srcdir)/xinput.h +test-xkb.o: $(srcdir)/blurb.h +test-xkb.o: ../config.h +test-yarandom.o: $(srcdir)/blurb.h test-yarandom.o: ../config.h test-yarandom.o: $(UTILS_SRC)/yarandom.h -timers.o: ../config.h -timers.o: $(srcdir)/prefs.h -timers.o: $(srcdir)/types.h -timers.o: $(srcdir)/xscreensaver.h -windows.o: ../config.h -windows.o: $(srcdir)/prefs.h -windows.o: $(srcdir)/types.h -windows.o: $(UTILS_SRC)/fade.h -windows.o: $(UTILS_SRC)/visual.h -windows.o: $(srcdir)/xscreensaver.h +xscreensaver-command.o: $(srcdir)/atoms.h +xscreensaver-command.o: $(srcdir)/blurb.h xscreensaver-command.o: ../config.h xscreensaver-command.o: $(srcdir)/remote.h xscreensaver-command.o: $(UTILS_SRC)/version.h -xscreensaver-getimage.o: ../config.h -xscreensaver-getimage.o: XScreenSaver_ad.h -xscreensaver-getimage.o: $(srcdir)/prefs.h -xscreensaver-getimage.o: $(srcdir)/types.h -xscreensaver-getimage.o: $(UTILS_SRC)/colorbars.h -xscreensaver-getimage.o: $(UTILS_SRC)/grabscreen.h -xscreensaver-getimage.o: $(UTILS_SRC)/resources.h -xscreensaver-getimage.o: $(UTILS_SRC)/utils.h -xscreensaver-getimage.o: $(UTILS_SRC)/version.h -xscreensaver-getimage.o: $(UTILS_SRC)/visual.h -xscreensaver-getimage.o: $(UTILS_SRC)/vroot.h -xscreensaver-getimage.o: $(UTILS_SRC)/yarandom.h -xscreensaver.o: XScreenSaver_ad.h -xscreensaver.o: $(srcdir)/auth.h -xscreensaver.o: ../config.h -xscreensaver.o: $(srcdir)/prefs.h -xscreensaver.o: $(srcdir)/types.h -xscreensaver.o: $(UTILS_SRC)/resources.h -xscreensaver.o: $(UTILS_SRC)/usleep.h -xscreensaver.o: $(UTILS_SRC)/version.h -xscreensaver.o: $(UTILS_SRC)/visual.h -xscreensaver.o: $(UTILS_SRC)/yarandom.h -xscreensaver.o: $(srcdir)/xscreensaver.h +xscreensaver-systemd.o: $(srcdir)/blurb.h xscreensaver-systemd.o: ../config.h xscreensaver-systemd.o: $(UTILS_SRC)/queue.h xscreensaver-systemd.o: $(UTILS_SRC)/version.h xscreensaver-systemd.o: $(UTILS_SRC)/yarandom.h -xset.o: ../config.h -xset.o: $(srcdir)/prefs.h -xset.o: $(srcdir)/types.h -xset.o: $(srcdir)/xscreensaver.h diff --git a/driver/XScreenSaver-Xm.ad b/driver/XScreenSaver-Xm.ad index 6b04ae97..560c48e5 100644 --- a/driver/XScreenSaver-Xm.ad +++ b/driver/XScreenSaver-Xm.ad @@ -1,4 +1,4 @@ -! Resources for the Motif dialog boxes of the "xscreensaver-demo" program. +! Resources for the Motif dialog boxes of the "xscreensaver-settings" program. ! *fontList: *-helvetica-medium-r-*-*-*-120-*-*-*-iso8859-1 *demoDialog*label1.fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1 diff --git a/driver/XScreenSaver.ad.in b/driver/XScreenSaver.ad.in index 828e32b6..bfc64142 100644 --- a/driver/XScreenSaver.ad.in +++ b/driver/XScreenSaver.ad.in @@ -4,8 +4,8 @@ ! a screen saver and locker for the X window system ! by Jamie Zawinski ! -! version 5.45 -! 08-Dec-2020 +! version 6.00 +! 01-Apr-2021 ! ! See "man xscreensaver" for more info. The latest version is always ! available at https://www.jwz.org/xscreensaver/ @@ -47,9 +47,8 @@ *memoryLimit: 0 *lock: False *verbose: False -*timestamp: True *fade: True -*unfade: False +*unfade: True *fadeSeconds: 0:00:03 *fadeTicks: 20 *splash: True @@ -65,32 +64,11 @@ *textProgram: fortune *textURL: https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss -! When a saver writes an error message to stdout/stderr, it can be printed -! on the screen. -! -*captureStderr: True -*overlayStderr: True -*overlayTextForeground: #FFFF00 -*overlayTextBackground: #000000 -*font: *-medium-r-*-140-*-m-* - -! The default is to use these server extensions if available (as noted.) -*sgiSaverExtension: True -*xidleExtension: True -*procInterrupts: True - -! Turning this on makes pointerHysteresis not work. -*xinputExtensionDev: False - -! Set this to True if you are experiencing longstanding XFree86 bug #421 -! (xscreensaver not covering the whole screen) -*GetViewPortIsFullOfLies: False - ! This is what the "Settings" button on the splash screen runs. -*demoCommand: xscreensaver-demo +*demoCommand: xscreensaver-settings ! This is the URL loaded by the "Help" button on the splash screen, -! and by the "Documentation" menu item in xscreensaver-demo. +! and by the "Documentation" menu item in xscreensaver-settings. *helpURL: https://www.jwz.org/xscreensaver/man.html ! loadURL -- how the "Help" buttons load the helpURL (/bin/sh syntax.) @@ -98,11 +76,13 @@ ! ! And there are so very many options to choose from! ! -! Gnome 2.4, 2.6: (yelp can't display man pages, as of 2.6.3) +! Gnome 2.4, 2.6: ! @GNOME24@*loadURL: @WITH_BROWSER@ '%s' -@GNOME24@*manualCommand: gnome-terminal --title '%s manual' \ -@GNOME24@ --command '/bin/sh -c "man %s; read foo"' +@GNOME24@*manualCommand: yelp man:%s || \ +@GNOME24@ x-terminal-emulator -t '%s manual' \ +@GNOME24@ -e /bin/sh -c "man %s; read foo" + ! ! Gnome 2.2: ! @@ -117,21 +97,21 @@ ! ! non-Gnome systems: ! -@NOGNOME@*loadURL: firefox '%s' || mozilla '%s' || netscape '%s' +@NOGNOME@*loadURL: x-www-browser '%s' || firefox '%s' || chromium-browser '%s' @NOGNOME@*manualCommand: xterm -sb -fg black -bg gray75 -T '%s manual' \ @NOGNOME@ -e /bin/sh -c 'man "%s" ; read foo' -! The format used for printing the date and time in the password dialog box -! (see the strftime(3) manual page for details.) -*dateFormat: %d-%b-%y (%a); %I:%M %p -! For day month date: -! *dateFormat: %a %b %d, %I:%M %p -! To show the time only: +! The strftime(3) format string for printing the time on the password dialog. +*dateFormat: %I:%M %p, %a %b %e +! DD MMM: +! *dateFormat: %I:%M %p, %e %b (%a) +! 12 hour time only: ! *dateFormat: %I:%M %p -! For 24 hour time: +! 24 hour time only: ! *dateFormat: %H:%M - +! ISO 8601: +! *dateFormat: %Y-%m-%d %H:%M:%S ! This command is executed by the "New Login" button on the lock dialog. ! (That button does not appear on the dialog if this program does not exist.) @@ -141,13 +121,11 @@ ! @NEW_LOGIN_COMMAND_P@*newLoginCommand: @NEW_LOGIN_COMMAND@ - -! Change these at your peril: -! -XScreenSaver.pointerPollTime: 0:00:05 +! Mouse motions less than this many pixels per second are ignored. +! This helps with cats, trucks and earthquakes. XScreenSaver.pointerHysteresis: 10 -XScreenSaver.initialDelay: 0:00:00 -XScreenSaver.windowCreationTimeout: 0:00:30 + +! Change this at your peril: XScreenSaver.bourneShell: /bin/sh @@ -157,176 +135,179 @@ XScreenSaver.bourneShell: /bin/sh ! !============================================================================= -! Note, the daemon uses Xlib XLoadFont, not Xft. If these fonts don't -! exist, arcane heuristics are applied until we find something similar. -! -*Dialog.headingFont: -*-helvetica-bold-r-*-*-*-180-*-*-*-*-iso8859-1 -*Dialog.bodyFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1 -*Dialog.labelFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1 -*Dialog.unameFont: -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1 -*Dialog.buttonFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1 -*Dialog.dateFont: -*-helvetica-medium-r-*-*-*-80-*-*-*-*-iso8859-1 - -! Helvetica asterisks look terrible. -*passwd.passwdFont: -*-courier-bold-r-*-*-*-140-*-*-*-iso8859-1 - -! Whether to display the local host name in the unlock dialog. -*passwd.uname: True - -! Whether typed passwords should echo as asterisks (true) or nothing (false) -*passwd.asterisks: True - +! Which of the following color schemes is in use for the unlock dialog. +*dialogTheme: default -! The default color scheme for the unlock and splash dialogs. -! This looks pretty close to the default Gtk theme. -! -*Dialog.foreground: #000000 -*Dialog.background: #E6E6E6 -*Dialog.Button.foreground: #000000 -*Dialog.Button.background: #F5F5F5 -*Dialog.text.foreground: #000000 -*Dialog.text.background: #FFFFFF -*Dialog.topShadowColor: #FFFFFF -*Dialog.bottomShadowColor: #CECECE -*Dialog.logo.width: 210 -*Dialog.logo.height: 210 -*Dialog.internalBorderWidth: 24 -*Dialog.borderWidth: 1 -*Dialog.shadowThickness: 2 -*passwd.thermometer.foreground: #4464AC -*passwd.thermometer.background: #FFFFFF -*passwd.thermometer.width: 8 +! Resources for theme names are downcased with spaces stripped. +*themeNames: Default, Borderless, Dark Gray, Borderless Black, \ + Green Black, White, Blue, Aqua Black, Wine +*Dialog.headingFont: sans-serif bold 16 +*Dialog.bodyFont: sans-serif 14 +*Dialog.errorFont: sans-serif bold 14 +*Dialog.labelFont: sans-serif bold 14 +*Dialog.unameFont: sans-serif 12 +*Dialog.buttonFont: sans-serif bold 14 +*Dialog.dateFont: sans-serif 9 -! A few other example color schemes. -! -! A convenient way to debug these is to build and run "driver/test-passwd". -! Remember that configure overwrites XScreenSaver.ad from XScreenSaver.ad.in. - +! Whether to display the local host name in the unlock dialog. +*passwd.uname: True + +! Whether typed passwords should echo as asterisks, or as nothing. +*passwd.asterisks: True + +! The default theme is similar to the Gtk defaults. +! +*default.Dialog.foreground: #000000 +*default.Dialog.background: #E6E6E6 +*default.Dialog.button.foreground: #000000 +*default.Dialog.button.background: #F5F5F5 +*default.Dialog.logo.background: #BBBBBB +*default.Dialog.text.foreground: #000000 +*default.Dialog.error.foreground: #FF0000 +*default.Dialog.text.background: #FFFFFF +*default.Dialog.topShadowColor: #FFFFFF +*default.Dialog.bottomShadowColor: #CECECE +*default.Dialog.shadowWidth: 2 +*default.Dialog.logo.width: 210 +*default.Dialog.logo.height: 210 +*default.Dialog.thermometer.foreground: #4464AC +*default.Dialog.thermometer.background: #FFFFFF +*default.Dialog.thermometer.width: 8 +*default.Dialog.borderColor: #CECECE +*default.Dialog.borderWidth: 0 +*default.Dialog.internalPadding: 24 ! Borderless theme: ! -! *Dialog.topShadowColor: #E6E6E6 -! *Dialog.bottomShadowColor: #E6E6E6 -! *passwd.thermometer.width: 6 - +*borderless.Dialog.topShadowColor: #E6E6E6 +*borderless.Dialog.button.background: #FFFFFF +*borderless.Dialog.bottomShadowColor: #E6E6E6 +*borderless.Dialog.logo.background: #E6E6E6 +*borderless.Dialog.borderColor: #888888 +*borderless.Dialog.thermometer.width: 6 +*borderless.Dialog.borderWidth: 1 ! Dark gray theme: ! -! *Dialog.foreground: #CCCCCC -! *Dialog.background: #333333 -! *Dialog.topShadowColor: #444444 -! *Dialog.bottomShadowColor: #111111 -! *Dialog.text.foreground: #DDDDDD -! *Dialog.text.background: #666666 -! *Dialog.Button.foreground: #CCCCCC -! *Dialog.Button.background: #666666 -! *passwd.thermometer.foreground: #4464AC -! *passwd.thermometer.background: #666666 - - -! Black borderless theme: -! -! *Dialog.foreground: #CCCCCC -! *Dialog.background: #000000 -! *Dialog.topShadowColor: #000000 -! *Dialog.bottomShadowColor: #000000 -! *Dialog.text.foreground: #CCCCCC -! *Dialog.text.background: #000000 -! *Dialog.Button.foreground: #CCCCCC -! *Dialog.Button.background: #333333 -! *passwd.thermometer.foreground: #CCCCCC -! *passwd.thermometer.background: #333333 -! *passwd.thermometer.width: 3 - +*darkgray.Dialog.foreground: #CCCCCC +*darkgray.Dialog.background: #333333 +*darkgray.Dialog.topShadowColor: #444444 +*darkgray.Dialog.bottomShadowColor: #111111 +*darkgray.Dialog.borderColor: #111111 +*darkgray.Dialog.text.foreground: #DDDDDD +*darkgray.Dialog.text.background: #666666 +*darkgray.Dialog.button.foreground: #CCCCCC +*darkgray.Dialog.button.background: #666666 +*darkgray.Dialog.logo.background: #444444 +*darkgray.Dialog.thermometer.foreground: #4464AC +*darkgray.Dialog.thermometer.background: #666666 +*darkgray.Dialog.borderWidth: 0 + +! Borderless black theme: +! +*borderlessblack.Dialog.foreground: #CCCCCC +*borderlessblack.Dialog.background: #000000 +*borderlessblack.Dialog.topShadowColor: #000000 +*borderlessblack.Dialog.bottomShadowColor: #000000 +*borderlessblack.Dialog.text.foreground: #CCCCCC +*borderlessblack.Dialog.text.background: #000000 +*borderlessblack.Dialog.button.foreground: #CCCCCC +*borderlessblack.Dialog.button.background: #333333 +*borderlessblack.Dialog.logo.background: #000000 +*borderlessblack.Dialog.thermometer.foreground: #CCCCCC +*borderlessblack.Dialog.thermometer.background: #333333 +*borderlessblack.Dialog.thermometer.width: 3 +*borderlessblack.Dialog.borderColor: #333333 +*borderlessblack.Dialog.borderWidth: 1 ! Green on black theme: ! -! *Dialog.foreground: #00FF00 -! *Dialog.background: #000000 -! *Dialog.topShadowColor: #000000 -! *Dialog.bottomShadowColor: #000000 -! *Dialog.shadowThickness: 1 -! *Dialog.text.foreground: #00FF00 -! *Dialog.text.background: #006600 -! *Dialog.Button.foreground: #00FF00 -! *Dialog.Button.background: #006600 -! *passwd.thermometer.foreground: #00CC00 -! *passwd.thermometer.background: #006600 - +*greenblack.Dialog.foreground: #00FF00 +*greenblack.Dialog.background: #000000 +*greenblack.Dialog.topShadowColor: #000000 +*greenblack.Dialog.bottomShadowColor: #000000 +*greenblack.Dialog.shadowWidth: 1 +*greenblack.Dialog.text.foreground: #00FF00 +*greenblack.Dialog.text.background: #006600 +*greenblack.Dialog.button.foreground: #00FF00 +*greenblack.Dialog.button.background: #006600 +*greenblack.Dialog.logo.background: #000000 +*greenblack.Dialog.thermometer.foreground: #00CC00 +*greenblack.Dialog.thermometer.background: #006600 +*greenblack.Dialog.borderColor: #006600 +*greenblack.Dialog.borderWidth: 1 ! White theme: ! -! *Dialog.foreground: #000000 -! *Dialog.background: #FFFFFF -! *Dialog.topShadowColor: #CCCCCC -! *Dialog.bottomShadowColor: #CCCCCC -! *Dialog.shadowThickness: 1 -! *Dialog.text.foreground: #000000 -! *Dialog.text.background: #FFFFFF -! *Dialog.Button.foreground: #000000 -! *Dialog.Button.background: #FFFFFF - +*white.Dialog.foreground: #000000 +*white.Dialog.background: #FFFFFF +*white.Dialog.topShadowColor: #CCCCCC +*white.Dialog.bottomShadowColor: #CCCCCC +*white.Dialog.shadowWidth: 1 +*white.Dialog.borderColor: #CCCCCC +*white.Dialog.text.foreground: #000000 +*white.Dialog.text.background: #FFFFFF +*white.Dialog.button.foreground: #000000 +*white.Dialog.button.background: #FFFFFF +*white.Dialog.logo.background: #FFFFFF +*white.Dialog.borderWidth: 0 ! Blue theme: ! -! *Dialog.foreground: #000000 -! *Dialog.background: #BBCCDD -! *Dialog.topShadowColor: #CCDDEE -! *Dialog.bottomShadowColor: #AABBCC -! *Dialog.text.foreground: #000000 -! *Dialog.text.background: #DDEEFF -! *Dialog.Button.foreground: #000000 -! *Dialog.Button.background: #DDEEFF -! *passwd.thermometer.foreground: #5566AA -! *passwd.thermometer.background: #BBCCDD - +*blue.Dialog.foreground: #000000 +*blue.Dialog.background: #BBCCDD +*blue.Dialog.topShadowColor: #CCDDEE +*blue.Dialog.bottomShadowColor: #AABBCC +*blue.Dialog.borderColor: #AABBCC +*blue.Dialog.text.foreground: #000000 +*blue.Dialog.text.background: #DDEEFF +*blue.Dialog.button.foreground: #000000 +*blue.Dialog.button.background: #DDEEFF +*blue.Dialog.logo.background: #BBCCDD +*blue.Dialog.thermometer.foreground: #5566AA +*blue.Dialog.thermometer.background: #BBCCDD +*blue.Dialog.borderWidth: 0 ! Aqua on black borderless theme: ! -! *Dialog.foreground: #00EFEF -! *Dialog.background: #000000 -! *Dialog.topShadowColor: #000000 -! *Dialog.bottomShadowColor: #000000 -! *Dialog.Button.foreground: #000000 -! *Dialog.Button.background: #2244EE -! *Dialog.text.foreground: #2244EE -! *Dialog.text.background: #EEEEEE -! *Dialog.internalBorderWidth: 36 -! *Dialog.borderWidth: 4 -! *Dialog.shadowThickness: 2 -! *passwd.thermometer.foreground: #2244EE -! *passwd.thermometer.background: #000088 - +*aquablack.Dialog.foreground: #00EFEF +*aquablack.Dialog.background: #000000 +*aquablack.Dialog.topShadowColor: #000000 +*aquablack.Dialog.bottomShadowColor: #000000 +*aquablack.Dialog.shadowWidth: 2 +*aquablack.Dialog.button.foreground: #000000 +*aquablack.Dialog.button.background: #2244EE +*aquablack.Dialog.logo.background: #000000 +*aquablack.Dialog.text.foreground: #2244EE +*aquablack.Dialog.text.background: #EEEEEE +*aquablack.Dialog.thermometer.foreground: #2244EE +*aquablack.Dialog.thermometer.background: #000088 +*aquablack.Dialog.borderColor: #000066 +*aquablack.Dialog.borderWidth: 1 +*aquablack.Dialog.internalPadding: 36 ! Wine theme, similar to the login screen of "Ubuntu 18.04 Community". ! -! *Dialog.foreground: #AD8FA6 -! *Dialog.background: #2C041E -! *Dialog.topShadowColor: #2C041E -! *Dialog.bottomShadowColor: #2C041E -! *Dialog.text.foreground: #706B70 -! *Dialog.text.background: #F9F9F8 -! *Dialog.Button.foreground: #CFC8CB -! *Dialog.Button.background: #4D2946 -! *passwd.thermometer.foreground: #AD8FA6 -! *passwd.thermometer.background: #4D2946 -! *passwd.thermometer.width: 6 +*wine.Dialog.foreground: #AD8FA6 +*wine.Dialog.background: #2C041E +*wine.Dialog.topShadowColor: #2C041E +*wine.Dialog.bottomShadowColor: #2C041E +*wine.Dialog.text.foreground: #706B70 +*wine.Dialog.text.background: #F9F9F8 +*wine.Dialog.button.foreground: #5F585B +*wine.Dialog.logo.background: #2C041E +*wine.Dialog.thermometer.foreground: #AD8FA6 +*wine.Dialog.thermometer.background: #4D2946 +*wine.Dialog.borderColor: #4D2946 +*wine.Dialog.thermometer.width: 6 +*wine.Dialog.borderWidth: 1 -! Static text in the dialog boxes: +! For displaying error messages about crashed screen savers. ! -*passwd.heading.label: XScreenSaver %s -*passwd.body.label: This screen is locked. -*passwd.unlock.label: OK -*passwd.login.label: New Login -*passwd.user.label: Username: - -*splash.heading.label: XScreenSaver %s -*splash.body.label: Copyright \251 1991-2020 by -*splash.body2.label: Jamie Zawinski -*splash.demo.label: Settings -*splash.help.label: Help +*errorFont: sans-serif bold 18 +*errorColor: #FF0000 !============================================================================= @@ -337,7 +318,7 @@ XScreenSaver.bourneShell: /bin/sh ! If you want to disable a screensaver, DO NOT remove it from this list: ! instead, mark it as inactive by placing a "-" at the beginning of the line. ! -! You can use the `xscreensaver-demo' program to edit the current list of +! You can use the `xscreensaver-settings' program to edit the current list of ! screen savers interactively. ! !============================================================================= @@ -591,105 +572,120 @@ XScreenSaver.bourneShell: /bin/sh !============================================================================= ! ! Pretty names for the hacks that have unusual capitalization. -! Used by xscreensaver-demo. +! Used by xscreensaver-settings. ! !============================================================================= -*hacks.antinspect.name: AntInspect -*hacks.antmaze.name: AntMaze -*hacks.antspotlight.name: AntSpotlight -*hacks.binaryring.name: BinaryRing -*hacks.blinkbox.name: BlinkBox -*hacks.blitspin.name: BlitSpin -*hacks.blocktube.name: BlockTube -*hacks.bouncingcow.name: BouncingCow -*hacks.boxfit.name: BoxFit +*hacks.antinspect.name: Ant Inspect +*hacks.antmaze.name: Ant Maze +*hacks.antspotlight.name: Ant Spotlight +*hacks.apple2.name: Apple ][ +*hacks.binaryring.name: Binary Ring +*hacks.blinkbox.name: Blink Box +*hacks.blitspin.name: Blit Spin +*hacks.blocktube.name: Block Tube +*hacks.bouncingcow.name: Bouncing Cow +*hacks.boxfit.name: Box Fit *hacks.bsod.name: BSOD -*hacks.bubble3d.name: Bubble3D -*hacks.ccurve.name: CCurve -*hacks.cloudlife.name: CloudLife -*hacks.companioncube.name: CompanionCube +*hacks.bubble3d.name: Bubble 3D +*hacks.ccurve.name: C Curve +*hacks.cityflow.name: City Flow +*hacks.cloudlife.name: Cloud Life +*hacks.companioncube.name: Companion Cube *hacks.covid19.name: COVID19 -*hacks.cubestack.name: CubeStack -*hacks.cubestorm.name: CubeStorm -*hacks.cubetwist.name: CubeTwist -*hacks.cubicgrid.name: CubicGrid -*hacks.cwaves.name: CWaves -*hacks.dangerball.name: DangerBall -*hacks.decayscreen.name: DecayScreen -*hacks.deepstars.name: DeepStars +*hacks.cube21.name: Cube 21 +*hacks.cubestack.name: Cube Stack +*hacks.cubestorm.name: Cube Storm +*hacks.cubetwist.name: Cube Twist +*hacks.cubicgrid.name: Cubic Grid +*hacks.cwaves.name: C Waves +*hacks.dangerball.name: Danger Ball +*hacks.decayscreen.name: Decay Screen +*hacks.deepstars.name: Deep Stars *hacks.dnalogo.name: DNA Logo -*hacks.dymaxionmap.name: DymaxionMap -*hacks.energystream.name: EnergyStream -*hacks.etruscanvenus.name: EtruscanVenus -*hacks.euler2d.name: Euler2D -*hacks.fadeplot.name: FadePlot -*hacks.filmleader.name: FilmLeader -*hacks.flipflop.name: FlipFlop -*hacks.flipscreen3d.name: FlipScreen3D -*hacks.fliptext.name: FlipText -*hacks.fluidballs.name: FluidBalls -*hacks.flyingtoasters.name: FlyingToasters -*hacks.fontglide.name: FontGlide -*hacks.fuzzyflakes.name: FuzzyFlakes -*hacks.geodesicgears.name: GeodesicGears +*hacks.dymaxionmap.name: Dymaxion Map +*hacks.energystream.name: Energy Stream +*hacks.etruscanvenus.name: Etruscan Venus +*hacks.euler2d.name: Euler 2D +*hacks.fadeplot.name: Fade Plot +*hacks.fiberlamp.name: Fiber Lamp +*hacks.filmleader.name: Film Leader +*hacks.flipflop.name: Flip Flop +*hacks.flipscreen3d.name: Flip Screen 3D +*hacks.fliptext.name: Flip Text +*hacks.fluidballs.name: Fluid Balls +*hacks.flyingtoasters.name: Flying Toasters +*hacks.fontglide.name: Font Glide +*hacks.fuzzyflakes.name: Fuzzy Flakes +*hacks.geodesicgears.name: Geodesic Gears *hacks.gflux.name: GFlux +*hacks.glblur.name: GL Blur +*hacks.glcells.name: GL Cells *hacks.gleidescope.name: Gleidescope -*hacks.glforestfire.name: GLForestFire +*hacks.glforestfire.name: GL Forest Fire +*hacks.glhanoi.name: GL Hanoi *hacks.glitchpeg.name: GlitchPEG -*hacks.gravitywell.name: GravityWell -*hacks.hyperball.name: HyperBall -*hacks.hypercube.name: HyperCube +*hacks.glknots.name: GL Knots +*hacks.glmatrix.name: GL Matrix +*hacks.glplanet.name: GL Planet +*hacks.glschool.name: GL School +*hacks.glslideshow.name: GL Slideshow +*hacks.glsnake.name: GL Snake +*hacks.gltext.name: GL Text +*hacks.gravitywell.name: Gravity Well +*hacks.hexstrut.name: Hex Strut *hacks.ifs.name: IFS -*hacks.imsmap.name: IMSMap -*hacks.jigglypuff.name: JigglyPuff -*hacks.juggler3d.name: Juggler3D -*hacks.lcdscrub.name: LCDscrub +*hacks.imsmap.name: IMS Map +*hacks.jigglypuff.name: Jiggly Puff +*hacks.juggler3d.name: Juggler 3D +*hacks.lcdscrub.name: LCD Scrub *hacks.lmorph.name: LMorph *hacks.m6502.name: m6502 -*hacks.maze3d.name: Maze3D -*hacks.memscroller.name: MemScroller -*hacks.metaballs.name: MetaBalls -*hacks.mirrorblob.name: MirrorBlob -*hacks.moebiusgears.name: MoebiusGears -*hacks.morph3d.name: Morph3D -*hacks.nerverot.name: NerveRot -*hacks.noseguy.name: NoseGuy -*hacks.popsquares.name: PopSquares -*hacks.projectiveplane.name:ProjectivePlane -*hacks.quasicrystal.name: QuasiCrystal -*hacks.raverhoop.name: RaverHoop -*hacks.razzledazzle.name: RazzleDazzle -*hacks.rd-bomb.name: RDbomb -*hacks.rdbomb.name: RDbomb -*hacks.romanboy.name: RomanBoy -*hacks.rotzoomer.name: RotZoomer -*hacks.rubikblocks.name: RubikBlocks +*hacks.maze3d.name: Maze 3D +*hacks.memscroller.name: Mem Scroller +*hacks.metaballs.name: Meta Balls +*hacks.mirrorblob.name: Mirror Blob +*hacks.moebius.name: Möbius +*hacks.moebiusgears.name: Möbius Gears +*hacks.moire.name: Moiré +*hacks.moire2.name: Moiré 2 +*hacks.morph3d.name: Morph 3D +*hacks.nerverot.name: Nerve Rot +*hacks.noseguy.name: Nose Guy +*hacks.pacman.name: Pac-Man +*hacks.photopile.name: Photo Pile +*hacks.popsquares.name: Pop Squares +*hacks.projectiveplane.name:Projective Plane +*hacks.quasicrystal.name: Quasi-Crystal +*hacks.raverhoop.name: Raver Hoop +*hacks.razzledazzle.name: Razzle Dazzle +*hacks.rd-bomb.name: RD-Bomb +*hacks.rd-bomb.name: RD-Bomb +*hacks.romanboy.name: Roman Boy +*hacks.rotzoomer.name: Rot Zoomer +*hacks.rubikblocks.name: Rubik Blocks *hacks.sballs.name: SBalls -*hacks.shadebobs.name: ShadeBobs -*hacks.sierpinski3d.name: Sierpinski3D -*hacks.skytentacles.name: SkyTentacles -*hacks.slidescreen.name: SlideScreen -*hacks.speedmine.name: SpeedMine -*hacks.sphereeversion.name: SphereEversion -*hacks.splitflap.name: SplitFlap -*hacks.starwars.name: StarWars -*hacks.stonerview.name: StonerView +*hacks.shadebobs.name: Shade Bobs +*hacks.sierpinski3d.name: Sierpinski 3D +*hacks.skytentacles.name: Sky Tentacles +*hacks.slidescreen.name: Slide Screen +*hacks.speedmine.name: Speed Mine +*hacks.sphereeversion.name: Sphere Eversion +*hacks.splitflap.name: Split-Flap +*hacks.starwars.name: Star Wars +*hacks.stonerview.name: Stoner View *hacks.t3d.name: T3D -*hacks.testx11.name: TestX11 -*hacks.timetunnel.name: TimeTunnel -*hacks.topblock.name: TopBlock -*hacks.tronbit.name: TronBit -*hacks.unknownpleasures.name:UnknownPleasures +*hacks.testx11.name: Test X11 +*hacks.timetunnel.name: Time Tunnel +*hacks.topblock.name: Top Block +*hacks.tronbit.name: Tron Bit +*hacks.unknownpleasures.name:Unknown Pleasures *hacks.vfeedback.name: VFeedback -*hacks.vidwhacker.name: VidWhacker -*hacks.webcollage.name: WebCollage -*hacks.whirlwindwarp.name: WhirlWindWarp -*hacks.winduprobot.name: WindupRobot +*hacks.vidwhacker.name: Vid Whacker +*hacks.webcollage.name: Web Collage +*hacks.whirlwindwarp.name: Whirlwind Warp +*hacks.winduprobot.name: Windup Robot *hacks.xanalogtv.name: XAnalogTV *hacks.xrayswarm.name: XRaySwarm -! obsolete, but still used by xscreensaver-demo-Xm. -*hacks.documentation.isInstalled: True - ! (xrdb prevention kludge: whole file) */ diff --git a/driver/XScreenSaver_ad.h b/driver/XScreenSaver_ad.h index e4b4eb45..22e213a9 100644 --- a/driver/XScreenSaver_ad.h +++ b/driver/XScreenSaver_ad.h @@ -19,9 +19,8 @@ "*memoryLimit: 0", "*lock: False", "*verbose: False", -"*timestamp: True", "*fade: True", -"*unfade: False", +"*unfade: True", "*fadeSeconds: 0:00:03", "*fadeTicks: 20", "*splash: True", @@ -35,62 +34,150 @@ "*textFile: ", "*textProgram: fortune", "*textURL: https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss", -"*captureStderr: True", -"*overlayStderr: True", -"*overlayTextForeground: #FFFF00", -"*overlayTextBackground: #000000", -"*font: *-medium-r-*-140-*-m-*", -"*sgiSaverExtension: True", -"*xidleExtension: True", -"*procInterrupts: True", -"*xinputExtensionDev: False", -"*GetViewPortIsFullOfLies: False", -"*demoCommand: xscreensaver-demo", +"*demoCommand: xscreensaver-settings", "*helpURL: https://www.jwz.org/xscreensaver/man.html", -"*loadURL: firefox '%s' || mozilla '%s' || netscape '%s'", -"*manualCommand: xterm -sb -fg black -bg gray75 -T '%s manual' \ - -e /bin/sh -c 'man \"%s\" ; read foo'", -"*dateFormat: %d-%b-%y (%a); %I:%M %p", -"XScreenSaver.pointerPollTime: 0:00:05", +"*loadURL: gnome-open '%s'", +"*manualCommand: yelp man:%s || \ + x-terminal-emulator -t '%s manual' \ + -e /bin/sh -c \"man %s; read foo\"", +"*dateFormat: %I:%M %p, %a %b %e", +"*newLoginCommand: no-such-login-manager", "XScreenSaver.pointerHysteresis: 10", -"XScreenSaver.initialDelay: 0:00:00", -"XScreenSaver.windowCreationTimeout: 0:00:30", "XScreenSaver.bourneShell: /bin/sh", -"*Dialog.headingFont: -*-helvetica-bold-r-*-*-*-180-*-*-*-*-iso8859-1", -"*Dialog.bodyFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1", -"*Dialog.labelFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1", -"*Dialog.unameFont: -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1", -"*Dialog.buttonFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1", -"*Dialog.dateFont: -*-helvetica-medium-r-*-*-*-80-*-*-*-*-iso8859-1", -"*passwd.passwdFont: -*-courier-bold-r-*-*-*-140-*-*-*-iso8859-1", -"*passwd.uname: True", -"*passwd.asterisks: True", -"*Dialog.foreground: #000000", -"*Dialog.background: #E6E6E6", -"*Dialog.Button.foreground: #000000", -"*Dialog.Button.background: #F5F5F5", -"*Dialog.text.foreground: #000000", -"*Dialog.text.background: #FFFFFF", -"*Dialog.topShadowColor: #FFFFFF", -"*Dialog.bottomShadowColor: #CECECE", -"*Dialog.logo.width: 210", -"*Dialog.logo.height: 210", -"*Dialog.internalBorderWidth: 24", -"*Dialog.borderWidth: 1", -"*Dialog.shadowThickness: 2", -"*passwd.thermometer.foreground: #4464AC", -"*passwd.thermometer.background: #FFFFFF", -"*passwd.thermometer.width: 8", -"*passwd.heading.label: XScreenSaver %s", -"*passwd.body.label: This screen is locked.", -"*passwd.unlock.label: OK", -"*passwd.login.label: New Login", -"*passwd.user.label: Username:", -"*splash.heading.label: XScreenSaver %s", -"*splash.body.label: Copyright \\251 1991-2020 by", -"*splash.body2.label: Jamie Zawinski ", -"*splash.demo.label: Settings", -"*splash.help.label: Help", +"*dialogTheme: default", +"*themeNames: Default, Borderless, Dark Gray, Borderless Black, \ + Green Black, White, Blue, Aqua Black, Wine", +"*Dialog.headingFont: sans-serif bold 16", +"*Dialog.bodyFont: sans-serif 14", +"*Dialog.errorFont: sans-serif bold 14", +"*Dialog.labelFont: sans-serif bold 14", +"*Dialog.unameFont: sans-serif 12", +"*Dialog.buttonFont: sans-serif bold 14", +"*Dialog.dateFont: sans-serif 9", +"*passwd.uname: True", +"*passwd.asterisks: True", +"*default.Dialog.foreground: #000000", +"*default.Dialog.background: #E6E6E6", +"*default.Dialog.button.foreground: #000000", +"*default.Dialog.button.background: #F5F5F5", +"*default.Dialog.logo.background: #BBBBBB", +"*default.Dialog.text.foreground: #000000", +"*default.Dialog.error.foreground: #FF0000", +"*default.Dialog.text.background: #FFFFFF", +"*default.Dialog.topShadowColor: #FFFFFF", +"*default.Dialog.bottomShadowColor: #CECECE", +"*default.Dialog.shadowWidth: 2", +"*default.Dialog.logo.width: 210", +"*default.Dialog.logo.height: 210", +"*default.Dialog.thermometer.foreground: #4464AC", +"*default.Dialog.thermometer.background: #FFFFFF", +"*default.Dialog.thermometer.width: 8", +"*default.Dialog.borderColor: #CECECE", +"*default.Dialog.borderWidth: 0", +"*default.Dialog.internalPadding: 24", +"*borderless.Dialog.topShadowColor: #E6E6E6", +"*borderless.Dialog.button.background: #FFFFFF", +"*borderless.Dialog.bottomShadowColor: #E6E6E6", +"*borderless.Dialog.logo.background: #E6E6E6", +"*borderless.Dialog.borderColor: #888888", +"*borderless.Dialog.thermometer.width: 6", +"*borderless.Dialog.borderWidth: 1", +"*darkgray.Dialog.foreground: #CCCCCC", +"*darkgray.Dialog.background: #333333", +"*darkgray.Dialog.topShadowColor: #444444", +"*darkgray.Dialog.bottomShadowColor: #111111", +"*darkgray.Dialog.borderColor: #111111", +"*darkgray.Dialog.text.foreground: #DDDDDD", +"*darkgray.Dialog.text.background: #666666", +"*darkgray.Dialog.button.foreground: #CCCCCC", +"*darkgray.Dialog.button.background: #666666", +"*darkgray.Dialog.logo.background: #444444", +"*darkgray.Dialog.thermometer.foreground: #4464AC", +"*darkgray.Dialog.thermometer.background: #666666", +"*darkgray.Dialog.borderWidth: 0", +"*borderlessblack.Dialog.foreground: #CCCCCC", +"*borderlessblack.Dialog.background: #000000", +"*borderlessblack.Dialog.topShadowColor: #000000", +"*borderlessblack.Dialog.bottomShadowColor: #000000", +"*borderlessblack.Dialog.text.foreground: #CCCCCC", +"*borderlessblack.Dialog.text.background: #000000", +"*borderlessblack.Dialog.button.foreground: #CCCCCC", +"*borderlessblack.Dialog.button.background: #333333", +"*borderlessblack.Dialog.logo.background: #000000", +"*borderlessblack.Dialog.thermometer.foreground: #CCCCCC", +"*borderlessblack.Dialog.thermometer.background: #333333", +"*borderlessblack.Dialog.thermometer.width: 3", +"*borderlessblack.Dialog.borderColor: #333333", +"*borderlessblack.Dialog.borderWidth: 1", +"*greenblack.Dialog.foreground: #00FF00", +"*greenblack.Dialog.background: #000000", +"*greenblack.Dialog.topShadowColor: #000000", +"*greenblack.Dialog.bottomShadowColor: #000000", +"*greenblack.Dialog.shadowWidth: 1", +"*greenblack.Dialog.text.foreground: #00FF00", +"*greenblack.Dialog.text.background: #006600", +"*greenblack.Dialog.button.foreground: #00FF00", +"*greenblack.Dialog.button.background: #006600", +"*greenblack.Dialog.logo.background: #000000", +"*greenblack.Dialog.thermometer.foreground: #00CC00", +"*greenblack.Dialog.thermometer.background: #006600", +"*greenblack.Dialog.borderColor: #006600", +"*greenblack.Dialog.borderWidth: 1", +"*white.Dialog.foreground: #000000", +"*white.Dialog.background: #FFFFFF", +"*white.Dialog.topShadowColor: #CCCCCC", +"*white.Dialog.bottomShadowColor: #CCCCCC", +"*white.Dialog.shadowWidth: 1", +"*white.Dialog.borderColor: #CCCCCC", +"*white.Dialog.text.foreground: #000000", +"*white.Dialog.text.background: #FFFFFF", +"*white.Dialog.button.foreground: #000000", +"*white.Dialog.button.background: #FFFFFF", +"*white.Dialog.logo.background: #FFFFFF", +"*white.Dialog.borderWidth: 0", +"*blue.Dialog.foreground: #000000", +"*blue.Dialog.background: #BBCCDD", +"*blue.Dialog.topShadowColor: #CCDDEE", +"*blue.Dialog.bottomShadowColor: #AABBCC", +"*blue.Dialog.borderColor: #AABBCC", +"*blue.Dialog.text.foreground: #000000", +"*blue.Dialog.text.background: #DDEEFF", +"*blue.Dialog.button.foreground: #000000", +"*blue.Dialog.button.background: #DDEEFF", +"*blue.Dialog.logo.background: #BBCCDD", +"*blue.Dialog.thermometer.foreground: #5566AA", +"*blue.Dialog.thermometer.background: #BBCCDD", +"*blue.Dialog.borderWidth: 0", +"*aquablack.Dialog.foreground: #00EFEF", +"*aquablack.Dialog.background: #000000", +"*aquablack.Dialog.topShadowColor: #000000", +"*aquablack.Dialog.bottomShadowColor: #000000", +"*aquablack.Dialog.shadowWidth: 2", +"*aquablack.Dialog.button.foreground: #000000", +"*aquablack.Dialog.button.background: #2244EE", +"*aquablack.Dialog.logo.background: #000000", +"*aquablack.Dialog.text.foreground: #2244EE", +"*aquablack.Dialog.text.background: #EEEEEE", +"*aquablack.Dialog.thermometer.foreground: #2244EE", +"*aquablack.Dialog.thermometer.background: #000088", +"*aquablack.Dialog.borderColor: #000066", +"*aquablack.Dialog.borderWidth: 1", +"*aquablack.Dialog.internalPadding: 36", +"*wine.Dialog.foreground: #AD8FA6", +"*wine.Dialog.background: #2C041E", +"*wine.Dialog.topShadowColor: #2C041E", +"*wine.Dialog.bottomShadowColor: #2C041E", +"*wine.Dialog.text.foreground: #706B70", +"*wine.Dialog.text.background: #F9F9F8", +"*wine.Dialog.button.foreground: #5F585B", +"*wine.Dialog.logo.background: #2C041E", +"*wine.Dialog.thermometer.foreground: #AD8FA6", +"*wine.Dialog.thermometer.background: #4D2946", +"*wine.Dialog.borderColor: #4D2946", +"*wine.Dialog.thermometer.width: 6", +"*wine.Dialog.borderWidth: 1", +"*errorFont: sans-serif bold 18", +"*errorColor: #FF0000", "*programs: \ maze -root \\n\ GL: superquadrics -root \\n\ @@ -334,97 +421,114 @@ GL: gibson -root \\n\ GL: headroom -root \\n\ GL: sphereeversion -root \\n", -"*hacks.antinspect.name: AntInspect", -"*hacks.antmaze.name: AntMaze", -"*hacks.antspotlight.name: AntSpotlight", -"*hacks.binaryring.name: BinaryRing", -"*hacks.blinkbox.name: BlinkBox", -"*hacks.blitspin.name: BlitSpin", -"*hacks.blocktube.name: BlockTube", -"*hacks.bouncingcow.name: BouncingCow", -"*hacks.boxfit.name: BoxFit", +"*hacks.antinspect.name: Ant Inspect", +"*hacks.antmaze.name: Ant Maze", +"*hacks.antspotlight.name: Ant Spotlight", +"*hacks.apple2.name: Apple ][", +"*hacks.binaryring.name: Binary Ring", +"*hacks.blinkbox.name: Blink Box", +"*hacks.blitspin.name: Blit Spin", +"*hacks.blocktube.name: Block Tube", +"*hacks.bouncingcow.name: Bouncing Cow", +"*hacks.boxfit.name: Box Fit", "*hacks.bsod.name: BSOD", -"*hacks.bubble3d.name: Bubble3D", -"*hacks.ccurve.name: CCurve", -"*hacks.cloudlife.name: CloudLife", -"*hacks.companioncube.name: CompanionCube", +"*hacks.bubble3d.name: Bubble 3D", +"*hacks.ccurve.name: C Curve", +"*hacks.cityflow.name: City Flow", +"*hacks.cloudlife.name: Cloud Life", +"*hacks.companioncube.name: Companion Cube", "*hacks.covid19.name: COVID19", -"*hacks.cubestack.name: CubeStack", -"*hacks.cubestorm.name: CubeStorm", -"*hacks.cubetwist.name: CubeTwist", -"*hacks.cubicgrid.name: CubicGrid", -"*hacks.cwaves.name: CWaves", -"*hacks.dangerball.name: DangerBall", -"*hacks.decayscreen.name: DecayScreen", -"*hacks.deepstars.name: DeepStars", +"*hacks.cube21.name: Cube 21", +"*hacks.cubestack.name: Cube Stack", +"*hacks.cubestorm.name: Cube Storm", +"*hacks.cubetwist.name: Cube Twist", +"*hacks.cubicgrid.name: Cubic Grid", +"*hacks.cwaves.name: C Waves", +"*hacks.dangerball.name: Danger Ball", +"*hacks.decayscreen.name: Decay Screen", +"*hacks.deepstars.name: Deep Stars", "*hacks.dnalogo.name: DNA Logo", -"*hacks.dymaxionmap.name: DymaxionMap", -"*hacks.energystream.name: EnergyStream", -"*hacks.etruscanvenus.name: EtruscanVenus", -"*hacks.euler2d.name: Euler2D", -"*hacks.fadeplot.name: FadePlot", -"*hacks.filmleader.name: FilmLeader", -"*hacks.flipflop.name: FlipFlop", -"*hacks.flipscreen3d.name: FlipScreen3D", -"*hacks.fliptext.name: FlipText", -"*hacks.fluidballs.name: FluidBalls", -"*hacks.flyingtoasters.name: FlyingToasters", -"*hacks.fontglide.name: FontGlide", -"*hacks.fuzzyflakes.name: FuzzyFlakes", -"*hacks.geodesicgears.name: GeodesicGears", +"*hacks.dymaxionmap.name: Dymaxion Map", +"*hacks.energystream.name: Energy Stream", +"*hacks.etruscanvenus.name: Etruscan Venus", +"*hacks.euler2d.name: Euler 2D", +"*hacks.fadeplot.name: Fade Plot", +"*hacks.fiberlamp.name: Fiber Lamp", +"*hacks.filmleader.name: Film Leader", +"*hacks.flipflop.name: Flip Flop", +"*hacks.flipscreen3d.name: Flip Screen 3D", +"*hacks.fliptext.name: Flip Text", +"*hacks.fluidballs.name: Fluid Balls", +"*hacks.flyingtoasters.name: Flying Toasters", +"*hacks.fontglide.name: Font Glide", +"*hacks.fuzzyflakes.name: Fuzzy Flakes", +"*hacks.geodesicgears.name: Geodesic Gears", "*hacks.gflux.name: GFlux", +"*hacks.glblur.name: GL Blur", +"*hacks.glcells.name: GL Cells", "*hacks.gleidescope.name: Gleidescope", -"*hacks.glforestfire.name: GLForestFire", +"*hacks.glforestfire.name: GL Forest Fire", +"*hacks.glhanoi.name: GL Hanoi", "*hacks.glitchpeg.name: GlitchPEG", -"*hacks.gravitywell.name: GravityWell", -"*hacks.hyperball.name: HyperBall", -"*hacks.hypercube.name: HyperCube", +"*hacks.glknots.name: GL Knots", +"*hacks.glmatrix.name: GL Matrix", +"*hacks.glplanet.name: GL Planet", +"*hacks.glschool.name: GL School", +"*hacks.glslideshow.name: GL Slideshow", +"*hacks.glsnake.name: GL Snake", +"*hacks.gltext.name: GL Text", +"*hacks.gravitywell.name: Gravity Well", +"*hacks.hexstrut.name: Hex Strut", "*hacks.ifs.name: IFS", -"*hacks.imsmap.name: IMSMap", -"*hacks.jigglypuff.name: JigglyPuff", -"*hacks.juggler3d.name: Juggler3D", -"*hacks.lcdscrub.name: LCDscrub", +"*hacks.imsmap.name: IMS Map", +"*hacks.jigglypuff.name: Jiggly Puff", +"*hacks.juggler3d.name: Juggler 3D", +"*hacks.lcdscrub.name: LCD Scrub", "*hacks.lmorph.name: LMorph", "*hacks.m6502.name: m6502", -"*hacks.maze3d.name: Maze3D", -"*hacks.memscroller.name: MemScroller", -"*hacks.metaballs.name: MetaBalls", -"*hacks.mirrorblob.name: MirrorBlob", -"*hacks.moebiusgears.name: MoebiusGears", -"*hacks.morph3d.name: Morph3D", -"*hacks.nerverot.name: NerveRot", -"*hacks.noseguy.name: NoseGuy", -"*hacks.popsquares.name: PopSquares", -"*hacks.projectiveplane.name:ProjectivePlane", -"*hacks.quasicrystal.name: QuasiCrystal", -"*hacks.raverhoop.name: RaverHoop", -"*hacks.razzledazzle.name: RazzleDazzle", -"*hacks.rd-bomb.name: RDbomb", -"*hacks.rdbomb.name: RDbomb", -"*hacks.romanboy.name: RomanBoy", -"*hacks.rotzoomer.name: RotZoomer", -"*hacks.rubikblocks.name: RubikBlocks", +"*hacks.maze3d.name: Maze 3D", +"*hacks.memscroller.name: Mem Scroller", +"*hacks.metaballs.name: Meta Balls", +"*hacks.mirrorblob.name: Mirror Blob", +"*hacks.moebius.name: Möbius", +"*hacks.moebiusgears.name: Möbius Gears", +"*hacks.moire.name: Moiré", +"*hacks.moire2.name: Moiré 2", +"*hacks.morph3d.name: Morph 3D", +"*hacks.nerverot.name: Nerve Rot", +"*hacks.noseguy.name: Nose Guy", +"*hacks.pacman.name: Pac-Man", +"*hacks.photopile.name: Photo Pile", +"*hacks.popsquares.name: Pop Squares", +"*hacks.projectiveplane.name:Projective Plane", +"*hacks.quasicrystal.name: Quasi-Crystal", +"*hacks.raverhoop.name: Raver Hoop", +"*hacks.razzledazzle.name: Razzle Dazzle", +"*hacks.rd-bomb.name: RD-Bomb", +"*hacks.rd-bomb.name: RD-Bomb", +"*hacks.romanboy.name: Roman Boy", +"*hacks.rotzoomer.name: Rot Zoomer", +"*hacks.rubikblocks.name: Rubik Blocks", "*hacks.sballs.name: SBalls", -"*hacks.shadebobs.name: ShadeBobs", -"*hacks.sierpinski3d.name: Sierpinski3D", -"*hacks.skytentacles.name: SkyTentacles", -"*hacks.slidescreen.name: SlideScreen", -"*hacks.speedmine.name: SpeedMine", -"*hacks.sphereeversion.name: SphereEversion", -"*hacks.splitflap.name: SplitFlap", -"*hacks.starwars.name: StarWars", -"*hacks.stonerview.name: StonerView", +"*hacks.shadebobs.name: Shade Bobs", +"*hacks.sierpinski3d.name: Sierpinski 3D", +"*hacks.skytentacles.name: Sky Tentacles", +"*hacks.slidescreen.name: Slide Screen", +"*hacks.speedmine.name: Speed Mine", +"*hacks.sphereeversion.name: Sphere Eversion", +"*hacks.splitflap.name: Split-Flap", +"*hacks.starwars.name: Star Wars", +"*hacks.stonerview.name: Stoner View", "*hacks.t3d.name: T3D", -"*hacks.testx11.name: TestX11", -"*hacks.timetunnel.name: TimeTunnel", -"*hacks.topblock.name: TopBlock", -"*hacks.tronbit.name: TronBit", -"*hacks.unknownpleasures.name:UnknownPleasures", +"*hacks.testx11.name: Test X11", +"*hacks.timetunnel.name: Time Tunnel", +"*hacks.topblock.name: Top Block", +"*hacks.tronbit.name: Tron Bit", +"*hacks.unknownpleasures.name:Unknown Pleasures", "*hacks.vfeedback.name: VFeedback", -"*hacks.vidwhacker.name: VidWhacker", -"*hacks.webcollage.name: WebCollage", -"*hacks.whirlwindwarp.name: WhirlWindWarp", -"*hacks.winduprobot.name: WindupRobot", +"*hacks.vidwhacker.name: Vid Whacker", +"*hacks.webcollage.name: Web Collage", +"*hacks.whirlwindwarp.name: Whirlwind Warp", +"*hacks.winduprobot.name: Windup Robot", "*hacks.xanalogtv.name: XAnalogTV", "*hacks.xrayswarm.name: XRaySwarm", -"*hacks.documentation.isInstalled: True", diff --git a/driver/atoms.c b/driver/atoms.c new file mode 100644 index 00000000..e8b6addc --- /dev/null +++ b/driver/atoms.c @@ -0,0 +1,70 @@ +/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include /* for CARD32 */ +#include +#include + +#include "atoms.h" + +Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE, + XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO, XA_EXIT, + XA_BLANK, XA_LOCK, XA_ACTIVATE, XA_SUSPEND, XA_NEXT, XA_PREV, + XA_DEACTIVATE, XA_CYCLE, XA_RESTART, XA_PREFS, + XA_NET_WM_PID, XA_NET_WM_STATE, XA_NET_WM_STATE_ABOVE, + XA_NET_WM_STATE_FULLSCREEN, XA_NET_WM_BYPASS_COMPOSITOR, + XA_NET_WM_WINDOW_TYPE, XA_NET_WM_WINDOW_TYPE_SPLASH, + XA_NET_WM_WINDOW_TYPE_DIALOG, XA_NET_WM_WINDOW_TYPE_NOTIFICATION, + XA_NET_WM_WINDOW_TYPE_NORMAL; + +void +init_xscreensaver_atoms (Display *dpy) +{ +# define A(N) XInternAtom (dpy, (N), False) + XA_SCREENSAVER = A("SCREENSAVER"); + XA_SCREENSAVER_ID = A("_SCREENSAVER_ID"); + XA_SCREENSAVER_VERSION = A("_SCREENSAVER_VERSION"); + XA_SCREENSAVER_STATUS = A("_SCREENSAVER_STATUS"); + XA_SCREENSAVER_RESPONSE = A("_SCREENSAVER_RESPONSE"); + + XA_ACTIVATE = A("ACTIVATE"); + XA_DEACTIVATE = A("DEACTIVATE"); + XA_SUSPEND = A("SUSPEND"); + XA_RESTART = A("RESTART"); + XA_CYCLE = A("CYCLE"); + XA_NEXT = A("NEXT"); + XA_PREV = A("PREV"); + XA_SELECT = A("SELECT"); + XA_EXIT = A("EXIT"); + XA_DEMO = A("DEMO"); + XA_PREFS = A("PREFS"); + XA_LOCK = A("LOCK"); + XA_BLANK = A("BLANK"); + + XA_NET_WM_PID = A("_NET_WM_PID"); + XA_NET_WM_STATE = A("_NET_WM_STATE"); + XA_NET_WM_STATE_ABOVE = A("_NET_WM_STATE_ABOVE"); + XA_NET_WM_STATE_FULLSCREEN = A("_NET_WM_STATE_FULLSCREEN"); + XA_NET_WM_BYPASS_COMPOSITOR = A("_NET_WM_BYPASS_COMPOSITOR"); + XA_NET_WM_WINDOW_TYPE = A("_NET_WM_WINDOW_TYPE"); + XA_NET_WM_WINDOW_TYPE_SPLASH = A("_NET_WM_WINDOW_TYPE_SPLASH"); + XA_NET_WM_WINDOW_TYPE_DIALOG = A("_NET_WM_WINDOW_TYPE_DIALOG"); + XA_NET_WM_WINDOW_TYPE_NOTIFICATION = A("_NET_WM_WINDOW_TYPE_NOTIFICATION"); + XA_NET_WM_WINDOW_TYPE_NORMAL = A("_NET_WM_WINDOW_TYPE_NORMAL"); +# undef A +} diff --git a/driver/atoms.h b/driver/atoms.h new file mode 100644 index 00000000..b5a7b7c3 --- /dev/null +++ b/driver/atoms.h @@ -0,0 +1,38 @@ +/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifndef _XSCREENSAVER_ATOMS_H_ +#define _XSCREENSAVER_ATOMS_H_ + +extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE, + XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO, XA_EXIT, + XA_BLANK, XA_LOCK, XA_ACTIVATE, XA_SUSPEND, XA_NEXT, XA_PREV, + XA_DEACTIVATE, XA_CYCLE, XA_RESTART, XA_PREFS, + XA_NET_WM_PID, XA_NET_WM_STATE, XA_NET_WM_STATE_ABOVE, + XA_NET_WM_STATE_FULLSCREEN, XA_NET_WM_BYPASS_COMPOSITOR, + XA_NET_WM_WINDOW_TYPE, XA_NET_WM_WINDOW_TYPE_SPLASH, + XA_NET_WM_WINDOW_TYPE_DIALOG, XA_NET_WM_WINDOW_TYPE_NOTIFICATION, + XA_NET_WM_WINDOW_TYPE_NORMAL; + +extern void init_xscreensaver_atoms (Display *dpy); +extern void xscreensaver_set_wm_atoms (Display *, Window, + int width, int height, + Window for_window); + +/* You might think that to store an array of 32-bit quantities onto a + server-side property, you would pass an array of 32-bit data quantities + into XChangeProperty(). You would be wrong. You have to use an array + of longs, even if long is 64 bits (using 32 of each 64.) + */ +typedef long PROP32; + + +#endif /* _XSCREENSAVER_ATOMS_H_ */ diff --git a/driver/atomswm.c b/driver/atomswm.c new file mode 100644 index 00000000..887dc2c3 --- /dev/null +++ b/driver/atomswm.c @@ -0,0 +1,101 @@ +/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include /* for CARD32 */ +#include +#include +#include + +#include "atoms.h" + +#ifdef HAVE_UNAME +# include /* for uname() */ +#endif /* HAVE_UNAME */ + + +/* Set some properties to hopefully tell the window manager to leave us alone. + This is used by xscreensaver-gfx and xscreensaver-auth but not xscreensaver. + */ +void +xscreensaver_set_wm_atoms (Display *dpy, Window window, int width, int height, + Window for_window) +{ + XClassHint class_hints; + XSizeHints size_hints; +# ifdef HAVE_UNAME + struct utsname uts; +# endif + Atom va[10]; + long vl[10]; + class_hints.res_name = "xscreensaver"; /* not progname */ + class_hints.res_class = "XScreenSaver"; + size_hints.flags = PMinSize | PMaxSize; + size_hints.min_width = size_hints.max_width = width; /* non-resizable */ + size_hints.min_height = size_hints.max_height = height; + XStoreName (dpy, window, "XScreenSaver"); + XSetClassHint (dpy, window, &class_hints); + XSetWMNormalHints (dpy, window, &size_hints); + + /* XA_WM_COMMAND and _NET_WM_PID are later updated by spawn_screenhack. */ + XChangeProperty (dpy, window, XA_WM_COMMAND, + XA_STRING, 8, PropModeReplace, + (unsigned char *) class_hints.res_name, + strlen (class_hints.res_name)); + +# ifdef HAVE_UNAME + if (! uname (&uts)) + XChangeProperty (dpy, window, + XA_WM_CLIENT_MACHINE, XA_STRING, 8, + PropModeReplace, (unsigned char *) uts.nodename, + strlen (uts.nodename)); +# endif + + /* In the olden days, OverrideRedirect meant that the window manager did + not see or touch our window, but these days, compositing WMs like to + get up to all sorts of shenanigans. I don't know whether setting these + properties has any effect, but they *might* tell the WM to keep its + grubby paws off of our windows. + */ + + vl[0] = 1; /* _NET_WM_BYPASS_COMPOSITOR = 1 */ + XChangeProperty (dpy, window, XA_NET_WM_BYPASS_COMPOSITOR, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *) vl, 1); + + /* _NET_WM_STATE = [ _NET_WM_STATE_ABOVE, _NET_WM_STATE_FULLSCREEN ] */ + va[0] = XA_NET_WM_STATE_ABOVE; + va[1] = XA_NET_WM_STATE_FULLSCREEN; + XChangeProperty (dpy, window, XA_NET_WM_STATE, XA_ATOM, 32, + PropModeReplace, (unsigned char *) va, 2); + + /* As there is no _NET_WM_WINDOW_TYPE_SCREENSAVER, which property is + most likely to effectively communicate "on top always" to the WM? + _NET_WM_WINDOW_TYPE = NORMAL, SPLASH, DIALOG or NOTIFICATION? */ + va[0] = XA_NET_WM_WINDOW_TYPE_NOTIFICATION; + XChangeProperty (dpy, window, XA_NET_WM_WINDOW_TYPE, XA_ATOM, 32, + PropModeReplace, (unsigned char *) va, 1); + + if (for_window) /* This is the error dialog for a saver window */ + { + va[0] = for_window; + /* _WM_TRANSIENT_FOR = screensaver_window */ + XChangeProperty (dpy, window, + XA_WM_TRANSIENT_FOR, XA_WINDOW, 32, + PropModeReplace, (unsigned char *) va, 1); + } +} diff --git a/driver/auth.h b/driver/auth.h index 65e00f33..40594eaa 100644 --- a/driver/auth.h +++ b/driver/auth.h @@ -1,9 +1,7 @@ /* auth.h --- Providing authentication mechanisms. - * + * Copyright © 1993-2021 Jamie Zawinski * (c) 2007, Quest Software, Inc. All rights reserved. - * - * This file is part of XScreenSaver, - * Copyright (c) 1993-2004 Jamie Zawinski + * This file is part of XScreenSaver. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -13,10 +11,8 @@ * software for any purpose. It is provided "as is" without express or * implied warranty. */ -#ifndef XSS_AUTH_H -#define XSS_AUTH_H - -#include "types.h" +#ifndef __XSCREENSAVER_AUTH_H__ +#define __XSCREENSAVER_AUTH_H__ #undef Bool #undef True @@ -25,7 +21,9 @@ #define True 1 #define False 0 -struct auth_message { +extern Bool verbose_p; + +typedef struct { enum { AUTH_MSGTYPE_INFO, AUTH_MSGTYPE_ERROR, @@ -33,22 +31,61 @@ struct auth_message { AUTH_MSGTYPE_PROMPT_ECHO } type; const char *msg; -}; +} auth_message; -struct auth_response { +typedef struct { char *response; -}; +} auth_response; -int -gui_auth_conv(int num_msg, - const struct auth_message auth_msgs[], - struct auth_response **resp, - saver_info *si); -void -xss_authenticate(saver_info *si, Bool verbose_p); +/* To run all authentication methods. + */ +extern void disavow_privileges (void); +extern Bool lock_priv_init (void); +extern Bool lock_init (void); + +/* Returns true if authenticated. */ +extern Bool xscreensaver_auth (void *closure, + Bool (*conv_fn) (void *closure, + int nmsgs, + const auth_message *msg, + auth_response **resp), + void (*finished_fn) (void *closure, + Bool authenticated_p)); -void -auth_finished_cb (saver_info *si); +/* The implementations, called by xscreensaver_auth. + */ +#ifdef HAVE_KERBEROS +extern Bool kerberos_lock_init (void); +extern Bool kerberos_passwd_valid_p (void *closure, const char *plaintext); #endif + +#ifdef HAVE_PAM +extern Bool pam_priv_init (void); +extern Bool pam_try_unlock (void *closure, + Bool (*conv_fn) (void *closure, + int nmsgs, + const auth_message *msg, + auth_response **resp)); +#endif + +#ifdef PASSWD_HELPER_PROGRAM +extern Bool ext_priv_init (void); +extern Bool ext_passwd_valid_p (void *closure, const char *plaintext); +#endif + +extern Bool pwent_lock_init (void); +extern Bool pwent_priv_init (void); +extern Bool pwent_passwd_valid_p (void *closure, const char *plaintext); + +/* GUI conversation function to pass to xscreensaver_auth. */ +extern Bool xscreensaver_auth_conv (void *closure, + int num_msg, + const auth_message *msg, + auth_response **resp); +extern void xscreensaver_auth_finished (void *closure, Bool authenticated_p); +extern void xscreensaver_splash (void *root_widget); + +#endif /* __XSCREENSAVER_AUTH_H__ */ + diff --git a/driver/blurb.c b/driver/blurb.c new file mode 100644 index 00000000..d732a9b1 --- /dev/null +++ b/driver/blurb.c @@ -0,0 +1,50 @@ +/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "blurb.h" + +#include +#include + +const char *progname = ""; +int verbose_p = 0; + +const char * +blurb (void) +{ + static char buf[255] = { 0 }; + struct tm tm; + time_t now; + int i; + + now = time ((time_t *) 0); + localtime_r (&now, &tm); + i = strlen (progname); + if (i > 40) i = 40; + memcpy (buf, progname, i); + buf[i++] = ':'; + buf[i++] = ' '; + buf[i++] = '0' + (tm.tm_hour >= 10 ? tm.tm_hour/10 : 0); + buf[i++] = '0' + (tm.tm_hour % 10); + buf[i++] = ':'; + buf[i++] = '0' + (tm.tm_min >= 10 ? tm.tm_min/10 : 0); + buf[i++] = '0' + (tm.tm_min % 10); + buf[i++] = ':'; + buf[i++] = '0' + (tm.tm_sec >= 10 ? tm.tm_sec/10 : 0); + buf[i++] = '0' + (tm.tm_sec % 10); + buf[i] = 0; + return buf; +} + diff --git a/driver/blurb.h b/driver/blurb.h new file mode 100644 index 00000000..6e33c761 --- /dev/null +++ b/driver/blurb.h @@ -0,0 +1,11 @@ +/* progname plus timestamp */ + +#ifndef __BLURB_H__ +#define __BLURB_H__ + +extern const char *progname; +extern int verbose_p; +extern const char *blurb (void); + +#endif /* __BLURB_H__ */ + diff --git a/driver/clientmsg.c b/driver/clientmsg.c new file mode 100644 index 00000000..f3d9d71c --- /dev/null +++ b/driver/clientmsg.c @@ -0,0 +1,123 @@ +/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +#include "blurb.h" +#include "atoms.h" +#include "clientmsg.h" + +extern Bool verbose_p; + +static int +error_handler (Display *dpy, XErrorEvent *error) +{ + return 0; +} + + +Window +find_screensaver_window (Display *dpy, char **version) +{ + int i; + Window root = RootWindowOfScreen (DefaultScreenOfDisplay (dpy)); + Window root2, parent, *kids; + unsigned int nkids; + XErrorHandler old_handler; + Window ret = 0; + + XSync (dpy, False); + old_handler = XSetErrorHandler (error_handler); + + if (version) *version = 0; + + if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) + abort (); + if (root != root2) + abort (); + if (parent) + abort (); + if (! (kids && nkids)) + goto DONE; + for (i = 0; i < nkids; i++) + { + Atom type; + int format; + unsigned long nitems, bytesafter; + unsigned char *v = 0; + int status; + + /* We're walking the list of root-level windows and trying to find + the one that has a particular property on it. We need to trap + BadWindows errors while doing this, because it's possible that + some random window might get deleted in the meantime. (That + window won't have been the one we're looking for.) + */ + status = XGetWindowProperty (dpy, kids[i], + XA_SCREENSAVER_VERSION, + 0, 200, False, XA_STRING, + &type, &format, &nitems, &bytesafter, + &v); + if (status == Success && type != None) + { + ret = kids[i]; + if (version) + *version = (char *) v; + else + XFree (v); + goto DONE; + } + if (v) XFree (v); + } + + DONE: + if (kids) XFree (kids); + XSetErrorHandler (old_handler); + return ret; +} + + +void +clientmessage_response (Display *dpy, XEvent *xev, Bool ok, const char *msg) +{ + char *proto; + int L = 0; + + if (verbose_p || !ok) + { + Atom cmd = xev->xclient.data.l[0]; + char *name = XGetAtomName (dpy, cmd); + fprintf (stderr, "%s: ClientMessage %s: %s\n", blurb(), + (name ? name : "???"), msg); + } + + L = strlen (msg); + proto = (char *) malloc (L + 2); + if (!proto) return; + proto[0] = (ok ? '+' : '-'); + memcpy (proto+1, msg, L); + L++; + proto[L] = 0; + + XChangeProperty (dpy, xev->xclient.window, + XA_SCREENSAVER_RESPONSE, XA_STRING, 8, + PropModeReplace, (unsigned char *) proto, L); + free (proto); +} diff --git a/driver/clientmsg.h b/driver/clientmsg.h new file mode 100644 index 00000000..cd836d80 --- /dev/null +++ b/driver/clientmsg.h @@ -0,0 +1,19 @@ +/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifndef __CLIENTMSG_H__ +#define __CLIENTMSG_H__ + +extern Window find_screensaver_window (Display *, char **version); +extern void clientmessage_response (Display *, XEvent *, Bool ok, + const char *msg); + +#endif /* __CLIENTMSG_H__ */ diff --git a/driver/compile_axp.com b/driver/compile_axp.com deleted file mode 100644 index d6ed0e8a..00000000 --- a/driver/compile_axp.com +++ /dev/null @@ -1,15 +0,0 @@ -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DEMO.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DIALOGS-XM.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) LOCK.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) PASSWD.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) STDERR.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) SUBPROCS.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) TIMERS.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) WINDOWS.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-COMMAND.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) XSCREENSAVER.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSET.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-GETPWNAM.C -$!!! CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) GETPWUID.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-HPWD.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-VALIDATE.C diff --git a/driver/compile_decc.com b/driver/compile_decc.com deleted file mode 100644 index d6ed0e8a..00000000 --- a/driver/compile_decc.com +++ /dev/null @@ -1,15 +0,0 @@ -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DEMO.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DIALOGS-XM.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) LOCK.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) PASSWD.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) STDERR.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) SUBPROCS.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) TIMERS.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) WINDOWS.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-COMMAND.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) XSCREENSAVER.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSET.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-GETPWNAM.C -$!!! CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) GETPWUID.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-HPWD.C -$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-VALIDATE.C diff --git a/driver/demo-Gtk-conf.c b/driver/demo-Gtk-conf.c index cc3b6a3b..6d042150 100644 --- a/driver/demo-Gtk-conf.c +++ b/driver/demo-Gtk-conf.c @@ -1333,7 +1333,7 @@ parameters_to_cmd_line (GList *parms, gboolean default_p) { int L = g_list_length (parms); int LL = 0; - char **strs = (char **) calloc (sizeof (*parms), L); + char **strs = (char **) calloc (sizeof (*strs), L); char *result; char *out; int i, j; @@ -1441,7 +1441,7 @@ parse_command_line_into_parameters (const char *filename, char *option = rest->data; rest->data = 0; - if (option[0] != '-' && option[0] != '+') + if (option && option[0] != '-' && option[0] != '+') { if (debug_p) fprintf (stderr, "%s: WARNING: %s: not a switch: \"%s\"\n", @@ -1750,7 +1750,8 @@ get_description (GList *parms, gboolean verbose_p) s++; else if (s[1] == ' ' || s[1] == '\t') s++; /* next line is indented: leave newline */ - else if (!strncmp(s+1, "http:", 5)) + else if (!strncmp(s+1, "http:", 5) || + !strncmp(s+1, "https:", 5)) s++; /* next line begins a URL: leave newline */ else s[0] = ' '; /* delete newline to un-fold this line */ @@ -1783,7 +1784,7 @@ get_description (GList *parms, gboolean verbose_p) } #if 0 - if (verbose_p) + /*if (verbose_p)*/ { fprintf (stderr, "%s: text read is \"%s\"\n", blurb(),doc->string); fprintf (stderr, "%s: description is \"%s\"\n", blurb(), d); diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c index c938ef22..b5e82e26 100644 --- a/driver/demo-Gtk.c +++ b/driver/demo-Gtk.c @@ -1,5 +1,5 @@ /* demo-Gtk.c --- implements the interactive demo-mode and options dialogs. - * xscreensaver, Copyright (c) 1993-2020 Jamie Zawinski + * xscreensaver, Copyright © 1993-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -16,6 +16,8 @@ #ifdef HAVE_GTK /* whole file */ +#include "blurb.h" + #include #include @@ -35,18 +37,13 @@ # include #endif /* ENABLE_NLS */ -#ifndef VMS -# include /* for getpwuid() */ -#else /* VMS */ -# include "vms-pwd.h" -#endif /* VMS */ - #ifdef HAVE_UNAME # include /* for uname() */ #endif /* HAVE_UNAME */ #include #include +#include /* for getpwuid() */ #include #include @@ -68,16 +65,6 @@ #include #include -#ifdef HAVE_XMU -# ifndef VMS -# include -# else /* VMS */ -# include -# endif -#else -# include "xmu.h" -#endif - #ifdef HAVE_XINERAMA # include #endif /* HAVE_XINERAMA */ @@ -118,16 +105,19 @@ #include "version.h" -#include "prefs.h" +#include "types.h" #include "resources.h" /* for parse_time() */ -#include "visual.h" /* for has_writable_cells() */ #include "remote.h" /* for xscreensaver_command() */ +#include "visual.h" +#include "atoms.h" #include "usleep.h" +#include "xmu.h" #include "logo-50.xpm" #include "logo-180.xpm" #include "demo-Gtk-conf.h" +#include "atoms.h" #include #include @@ -186,14 +176,6 @@ static void hack_subproc_environment (Window preview_window_id, Bool debug_p); #define countof(x) (sizeof((x))/sizeof((*x))) -/* You might think that to read an array of 32-bit quantities out of a - server-side property, you would pass an array of 32-bit data quantities - into XGetWindowProperty(). You would be wrong. You have to use an array - of longs, even if long is 64 bits (using 32 of each 64.) - */ -typedef long PROP32; - -char *progname = 0; char *progclass = "XScreenSaver"; XrmDatabase db; @@ -251,13 +233,6 @@ typedef struct { a closure object of our own down into the various widget callbacks. */ static state *global_state_kludge; -Atom XA_VROOT; -Atom XA_SCREENSAVER, XA_SCREENSAVER_RESPONSE, XA_SCREENSAVER_VERSION; -Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO; -Atom XA_ACTIVATE, XA_SUSPEND, XA_BLANK, XA_LOCK, XA_RESTART, XA_EXIT; -Atom XA_NEXT, XA_PREV; - - static void populate_demo_window (state *, int list_elt); static void populate_prefs_page (state *); static void populate_popup_window (state *); @@ -306,33 +281,14 @@ void settings_switch_page_cb (GtkNotebook *, GtkNotebookPage *, gint page_num, gpointer user_data); void settings_cancel_cb (GtkButton *, gpointer user_data); void settings_ok_cb (GtkButton *, gpointer user_data); +void preview_theme_cb (GtkWidget *, gpointer user_data); static void kill_gnome_screensaver (void); static void kill_kde_screensaver (void); - /* Some random utility functions */ -const char *blurb (void); - -const char * -blurb (void) -{ - time_t now = time ((time_t *) 0); - char *ct = (char *) ctime (&now); - static char buf[255]; - int n = strlen(progname); - if (n > 100) n = 99; - strncpy(buf, progname, n); - buf[n++] = ':'; - buf[n++] = ' '; - strncpy(buf+n, ct+11, 8); - strcpy(buf+n+9, ": "); - return buf; -} - - static GtkWidget * name_to_widget (state *s, const char *name) { @@ -347,7 +303,7 @@ name_to_widget (state *s, const char *name) /* First try to load the UI file from the current directory; if there isn't one there, check the installed directory. */ -# define UI_FILE "xscreensaver-demo.ui" +# define UI_FILE "xscreensaver.ui" const char * const files[] = { UI_FILE, DEFAULT_ICONDIR "/" UI_FILE }; int i; @@ -814,22 +770,21 @@ wm_toplevel_close_cb (GtkWidget *widget, GdkEvent *event, gpointer data) G_MODULE_EXPORT void about_menu_cb (GtkAction *menu_action, gpointer user_data) { +#if 1 + /* Let's just pop up the splash dialog instead. */ + preview_theme_cb (NULL, user_data); +#else char msg [2048]; - char *vers = strdup (screensaver_id + 4); - char *s, *s2; char copy[1024]; - char year[5]; char *desc = _("For updates, check https://www.jwz.org/xscreensaver/"); - s = strchr (vers, ','); + char *version = strdup (screensaver_id + 17); + char *year = strchr (version, '-'); + char *s = strchr (version, ' '); + *s = 0; + year = strchr (year+1, '-') + 1; + s = strchr (year, ')'); *s = 0; - s += 2; - - s2 = vers; - s2 = strrchr (vers, '-'); - s2++; - strncpy (year, s2, 4); - year[4] = 0; /* Ole Laursen says "don't use _() here because non-ASCII characters aren't allowed in localizable string keys." @@ -851,7 +806,7 @@ about_menu_cb (GtkAction *menu_action, gpointer user_data) #ifdef HAVE_CRAPPLET { const gchar *auth[] = { 0 }; - GtkWidget *about = gnome_about_new (progclass, vers, "", auth, desc, + GtkWidget *about = gnome_about_new (progclass, version, "", auth, desc, "xscreensaver.xpm"); gtk_widget_show (about); } @@ -886,7 +841,7 @@ about_menu_cb (GtkAction *menu_action, gpointer user_data) vbox = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); - label1 = gtk_label_new (vers); + label1 = gtk_label_new (version); gtk_box_pack_start (GTK_BOX (vbox), label1, TRUE, TRUE, 0); gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label1), 0.0, 0.75); @@ -943,6 +898,7 @@ about_menu_cb (GtkAction *menu_action, gpointer user_data) gdk_window_show (GET_WINDOW (GTK_WIDGET (dialog))); gdk_window_raise (GET_WINDOW (GTK_WIDGET (dialog))); } +#endif /* 0 */ } @@ -962,11 +918,11 @@ doc_menu_cb (GtkAction *menu_action, gpointer user_data) } help_command = (char *) malloc (strlen (p->load_url_command) + - (strlen (p->help_url) * 4) + 20); + (strlen (p->help_url) * 5) + 20); strcpy (help_command, "( "); sprintf (help_command + strlen(help_command), p->load_url_command, - p->help_url, p->help_url, p->help_url, p->help_url); + p->help_url, p->help_url, p->help_url, p->help_url, p->help_url); strcat (help_command, " ) &"); if (system (help_command) < 0) fprintf (stderr, "%s: fork error\n", blurb()); @@ -1013,7 +969,7 @@ restart_menu_cb (GtkWidget *widget, gpointer user_data) flush_dialog_changes_and_save (s); xscreensaver_command (GDK_DISPLAY(), XA_EXIT, 0, False, NULL); sleep (1); - if (system ("xscreensaver -nosplash &") < 0) + if (system ("xscreensaver -splash &") < 0) fprintf (stderr, "%s: fork error\n", blurb()); await_xscreensaver (s); @@ -1099,12 +1055,6 @@ demo_write_init_file (state *s, saver_preferences *p) { Display *dpy = GDK_DISPLAY(); -#if 0 - /* #### try to figure out why shit keeps getting reordered... */ - if (strcmp (s->prefs.screenhacks[0]->name, "DNA Lounge Slideshow")) - abort(); -#endif - if (!write_init_file (dpy, p, s->short_version, False)) { if (s->debug_p) @@ -1500,6 +1450,25 @@ flush_checkbox (GtkTreeModel *model, #endif /* HAVE_GTK2 */ + +static char * +theme_name_strip (const char *s) +{ + const char *in = s; + char *s2 = strdup(s); + char *out = s2; + for (; *in; in++) + if (*in >= 'A' && *in <= 'Z') + *out++ = *in + ('a'-'A'); + else if (*in == ' ' || *in == '\t') + ; + else + *out++ = *in; + *out = 0; + return s2; +} + + /* Flush out any changes made in the main dialog window (where changes take place immediately: clicking on a checkbox causes the init file to be written right away.) @@ -1507,6 +1476,7 @@ flush_checkbox (GtkTreeModel *model, static Bool flush_dialog_changes_and_save (state *s) { + Display *dpy = GDK_DISPLAY(); saver_preferences *p = &s->prefs; saver_preferences P2, *p2 = &P2; #ifdef HAVE_GTK2 @@ -1593,7 +1563,6 @@ flush_dialog_changes_and_save (state *s) #if 0 CHECKBOX (p2->verbose_p, "verbose_button"); - CHECKBOX (p2->capture_stderr_p, "capture_button"); CHECKBOX (p2->splash_p, "splash_button"); #endif @@ -1611,7 +1580,6 @@ flush_dialog_changes_and_save (state *s) TEXT (p2->text_url, "text_url_entry"); } - CHECKBOX (p2->install_cmap_p, "install_button"); CHECKBOX (p2->fade_p, "fade_button"); CHECKBOX (p2->unfade_p, "unfade_button"); SECONDS (&p2->fade_seconds, "fade_spinbutton"); @@ -1625,12 +1593,13 @@ flush_dialog_changes_and_save (state *s) /* Warn if the image directory doesn't exist, when: - not being warned before - image directory is changed and the directory doesn't exist - - image directory does not begin with http:// + - image directory is not a URL */ if (p2->image_directory && *p2->image_directory && !directory_p (p2->image_directory) && - strncmp(p2->image_directory, "http://", 6) && + strncmp(p2->image_directory, "http://", 7) && + strncmp(p2->image_directory, "https://", 8) && ( !already_warned_about_missing_image_directory || ( p->image_directory && *p->image_directory && @@ -1663,11 +1632,33 @@ flush_dialog_changes_and_save (state *s) : -1); } + /* Theme menu. */ + { + GtkComboBox *cbox = GTK_COMBO_BOX (name_to_widget (s, "theme_menu")); + char *themes = get_string_resource (dpy, "themeNames", "ThemeNames"); + int menu_index = gtk_combo_box_get_active (cbox); + char *token = themes; + char *name, *last; + int i = 0; + while ((name = strtok_r (token, ",", &last))) + { + token = 0; + if (i == menu_index) + { + char *name2 = theme_name_strip (name); + if (p->dialog_theme) free (p->dialog_theme); + p2->dialog_theme = name2; + } + i++; + } + } + # define COPY(field, name) \ if (p->field != p2->field) { \ changed = True; \ if (s->debug_p) \ - fprintf (stderr, "%s: %s => %d\n", blurb(), name, (int) p2->field); \ + fprintf (stderr, "%s: %s => %ld\n", blurb(), \ + name, (unsigned long) p2->field); \ } \ p->field = p2->field @@ -1687,7 +1678,6 @@ flush_dialog_changes_and_save (state *s) #if 0 COPY(verbose_p, "verbose_p"); - COPY(capture_stderr_p, "capture_stderr_p"); COPY(splash_p, "splash_p"); #endif @@ -1702,6 +1692,7 @@ flush_dialog_changes_and_save (state *s) COPY(grab_video_p, "grab_video_p"); COPY(random_image_p, "random_image_p"); + COPY(dialog_theme, "dialog_theme"); # undef COPY # define COPYSTR(FIELD,NAME) \ @@ -1729,14 +1720,7 @@ flush_dialog_changes_and_save (state *s) if (changed) { - Display *dpy = GDK_DISPLAY(); - Bool enabled_p = (p->dpms_enabled_p && p->mode != DONT_BLANK); - sync_server_dpms_settings (dpy, enabled_p, p->dpms_quickoff_p, - p->dpms_standby / 1000, - p->dpms_suspend / 1000, - p->dpms_off / 1000, - False); - + sync_server_dpms_settings (GDK_DISPLAY(), p); changed = demo_write_init_file (s, p); } @@ -2305,7 +2289,12 @@ browse_text_program_cb (GtkButton *button, gpointer user_data) } - +G_MODULE_EXPORT void +preview_theme_cb (GtkWidget *w, gpointer user_data) +{ + if (system ("xscreensaver-auth --splash &") < 0) + fprintf (stderr, "%s: splash exec failed\n", blurb()); +} G_MODULE_EXPORT void @@ -2761,6 +2750,7 @@ update_list_sensitivity (state *s) static void populate_prefs_page (state *s) { + Display *dpy = GDK_DISPLAY(); saver_preferences *p = &s->prefs; Bool can_lock_p = True; @@ -2813,7 +2803,6 @@ populate_prefs_page (state *s) TOGGLE_ACTIVE ("lock_button", p->lock_p); #if 0 TOGGLE_ACTIVE ("verbose_button", p->verbose_p); - TOGGLE_ACTIVE ("capture_button", p->capture_stderr_p); TOGGLE_ACTIVE ("splash_button", p->splash_p); #endif TOGGLE_ACTIVE ("dpms_button", p->dpms_enabled_p); @@ -2821,7 +2810,6 @@ populate_prefs_page (state *s) TOGGLE_ACTIVE ("grab_desk_button", p->grab_desktop_p); TOGGLE_ACTIVE ("grab_video_button", p->grab_video_p); TOGGLE_ACTIVE ("grab_image_button", p->random_image_p); - TOGGLE_ACTIVE ("install_button", p->install_cmap_p); TOGGLE_ACTIVE ("fade_button", p->fade_p); TOGGLE_ACTIVE ("unfade_button", p->unfade_p); @@ -2866,6 +2854,58 @@ populate_prefs_page (state *s) p->tmode == TEXT_URL); + /* Theme menu */ + { + GtkComboBox *cbox = GTK_COMBO_BOX (name_to_widget (s, "theme_menu")); + + /* Without this, pref_changed_cb gets called an exponentially-increasing + number of times on the themes menu, despite the call to + gtk_list_store_clear(). */ + static Bool done_once = False; + + if (cbox && !done_once) + { + char *themes = get_string_resource (dpy, "themeNames", "ThemeNames"); + char *token = themes; + char *name, *name2, *last; + GtkListStore *model; + GtkTreeIter iter; + int i = 0; + done_once = True; + + g_object_get (G_OBJECT (cbox), "model", &model, NULL); + if (!model) abort(); + gtk_list_store_clear (model); + + gtk_signal_connect (GTK_OBJECT (cbox), "changed", + GTK_SIGNAL_FUNC (pref_changed_cb), (gpointer) s); + + while ((name = strtok_r (token, ",", &last))) + { + int L; + token = 0; + + /* Strip leading and trailing whitespace */ + while (*name == ' ' || *name == '\t' || *name == '\n') + name++; + L = strlen(name); + while (L && (name[L-1] == ' ' || name[L-1] == '\t' || + name[L-1] == '\n')) + name[--L] = 0; + + gtk_list_store_append (model, &iter); + gtk_list_store_set (model, &iter, 0, name, -1); + + name2 = theme_name_strip (name); + if (!strcmp (p->dialog_theme, name2)) + gtk_combo_box_set_active (cbox, i); + free (name2); + i++; + } + } + } + + /* Map the `saver_mode' enum to mode menu to values. */ { GtkComboBox *opt = GTK_COMBO_BOX (name_to_widget (s, "mode_menu")); @@ -2879,27 +2919,8 @@ populate_prefs_page (state *s) } { - Bool found_any_writable_cells = False; - Bool fading_possible = False; Bool dpms_supported = False; - Display *dpy = GDK_DISPLAY(); - int nscreens = ScreenCount(dpy); /* real screens, not Xinerama */ - int i; - for (i = 0; i < nscreens; i++) - { - Screen *s = ScreenOfDisplay (dpy, i); - if (has_writable_cells (s, DefaultVisualOfScreen (s))) - { - found_any_writable_cells = True; - break; - } - } - - fading_possible = found_any_writable_cells; -#ifdef HAVE_XF86VMODE_GAMMA - fading_possible = True; -#endif #ifdef HAVE_DPMS_EXTENSION { @@ -2923,7 +2944,6 @@ populate_prefs_page (state *s) */ SENSITIZE ("dpms_frame", dpms_supported); SENSITIZE ("dpms_button", dpms_supported); - SENSITIZE ("dpms_quickoff_button", dpms_supported); SENSITIZE ("dpms_standby_label", dpms_supported && p->dpms_enabled_p); SENSITIZE ("dpms_standby_mlabel", dpms_supported && p->dpms_enabled_p); @@ -2934,24 +2954,26 @@ populate_prefs_page (state *s) SENSITIZE ("dpms_off_label", dpms_supported && p->dpms_enabled_p); SENSITIZE ("dpms_off_mlabel", dpms_supported && p->dpms_enabled_p); SENSITIZE ("dpms_off_spinbutton", dpms_supported && p->dpms_enabled_p); + SENSITIZE ("dpms_quickoff_button", dpms_supported); - /* Colormaps - */ - SENSITIZE ("cmap_frame", found_any_writable_cells || fading_possible); - SENSITIZE ("install_button", found_any_writable_cells); - SENSITIZE ("fade_button", fading_possible); - SENSITIZE ("unfade_button", fading_possible); - - SENSITIZE ("fade_label", (fading_possible && - (p->fade_p || p->unfade_p))); - SENSITIZE ("fade_spinbutton", (fading_possible && - (p->fade_p || p->unfade_p))); + SENSITIZE ("fade_label", (p->fade_p || p->unfade_p)); + SENSITIZE ("fade_spinbutton", (p->fade_p || p->unfade_p)); # undef SENSITIZE } } +/* Allow the documentation label to re-flow when the text is changed. + http://blog.borovsak.si/2009/05/wrapping-adn-resizing-gtklabel.html + */ +static void +cb_allocate (GtkWidget *label, GtkAllocation *allocation, gpointer data) +{ + gtk_widget_set_size_request (label, allocation->width - 8, -1); +} + + static void populate_popup_window (state *s) { @@ -2962,6 +2984,9 @@ populate_popup_window (state *s) gtk_label_set_selectable (doc); */ + g_signal_connect (G_OBJECT (doc), "size-allocate", + G_CALLBACK (cb_allocate), NULL); + # ifdef HAVE_XML if (s->cdata) { @@ -2998,6 +3023,14 @@ populate_popup_window (state *s) gtk_label_set_text (doc, (doc_string ? _(doc_string) : _("No description available."))); + + { + GtkWidget *w = name_to_widget (s, "dialog_vbox"); + gtk_widget_hide (w); + gtk_widget_unrealize (w); + gtk_widget_realize (w); + gtk_widget_show (w); + } } @@ -3471,10 +3504,11 @@ initialize_sort_map (state *s) char *name = (hack->name && *hack->name ? strdup (hack->name) : make_hack_name (dpy, hack->command)); - char *str; - for (str = name; *str; str++) - *str = tolower(*str); - sort_hack_cmp_names_kludge[i] = name; + gchar *s2 = g_str_to_ascii (name, 0); /* Sort "Möbius" properly */ + gchar *s3 = g_ascii_strdown (s2, -1); + free (name); + free (s2); + sort_hack_cmp_names_kludge[i] = s3; } /* Sort list->hack map alphabetically @@ -3782,7 +3816,7 @@ get_best_gl_visual (state *s) char *av[10]; int ac = 0; - av[ac++] = "xscreensaver-gl-helper"; + av[ac++] = "xscreensaver-gl-visual"; av[ac] = 0; if (pipe (fds)) @@ -4395,7 +4429,9 @@ gnome_screensaver_window (Screen *screen) &bytesafter, &name) == Success && type != None - && !strcmp ((char *) name, "gnome-screensaver")) + && (!strcmp ((char *) name, "gnome-screensaver") || + !strcmp ((char *) name, "mate-screensaver") || + !strcmp ((char *) name, "cinnamon-screensaver"))) { gnome_window = kids[i]; break; @@ -4464,11 +4500,9 @@ the_network_is_not_the_computer (state *s) lhost = ""; else lhost = uts.nodename; -# elif defined(VMS) - strcpy (lhost, getenv("SYS$NODE")); -# else /* !HAVE_UNAME && !VMS */ +# else /* !HAVE_UNAME */ strcat (lhost, ""); -# endif /* !HAVE_UNAME && !VMS */ +# endif /* !HAVE_UNAME */ if (p && p->pw_name) luser = p->pw_name; @@ -4791,10 +4825,7 @@ main (int argc, char **argv) progname = real_progname; - s->short_version = (char *) malloc (5); - memcpy (s->short_version, screensaver_id + 17, 4); - s->short_version [4] = 0; - + s->short_version = XSCREENSAVER_VERSION; /* Register our error message logger for every ``log domain'' known. There's no way to do this globally, so I grepped the Gtk/Gdk sources @@ -5007,7 +5038,7 @@ main (int argc, char **argv) dpy = XtDisplay (toplevel_shell); db = XtDatabase (dpy); - XtGetApplicationNameAndClass (dpy, &progname, &progclass); + XtGetApplicationNameAndClass (dpy, (char **) &progname, &progclass); XSetErrorHandler (demo_ehandler); /* Let's just ignore these. They seem to confuse Irix Gtk... */ @@ -5046,6 +5077,7 @@ main (int argc, char **argv) p->db = db; s->nscreens = screen_count (dpy); + init_xscreensaver_atoms (dpy); hack_environment (s); /* must be before initialize_sort_map() */ load_init_file (dpy, p); @@ -5069,26 +5101,7 @@ main (int argc, char **argv) } #endif - - /* Intern the atoms that xscreensaver_command() needs. - */ - XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False); - XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False); - XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION",False); - XA_SCREENSAVER_STATUS = XInternAtom (dpy, "_SCREENSAVER_STATUS", False); - XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False); - XA_SCREENSAVER_RESPONSE = XInternAtom (dpy, "_SCREENSAVER_RESPONSE", False); - XA_SELECT = XInternAtom (dpy, "SELECT", False); - XA_DEMO = XInternAtom (dpy, "DEMO", False); - XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False); - XA_SUSPEND = XInternAtom (dpy, "SUSPEND", False); - XA_BLANK = XInternAtom (dpy, "BLANK", False); - XA_LOCK = XInternAtom (dpy, "LOCK", False); - XA_NEXT = XInternAtom (dpy, "NEXT", False); - XA_PREV = XInternAtom (dpy, "PREV", False); - XA_EXIT = XInternAtom (dpy, "EXIT", False); - XA_RESTART = XInternAtom (dpy, "RESTART", False); - + init_xscreensaver_atoms (dpy); /* Create the window and all its widgets. */ @@ -5300,7 +5313,7 @@ main (int argc, char **argv) the_network_is_not_the_computer (s); - if (senesculent_p()) + if (time ((time_t *) 0) - XSCREENSAVER_RELEASED > 60*60*24*30*17) warning_dialog (s->toplevel_widget, _("Warning:\n\n" "This version of xscreensaver is VERY OLD!\n" @@ -5313,7 +5326,6 @@ main (int argc, char **argv) ), D_NONE, 7); - /* Run the Gtk event loop, and not the Xt event loop. This means that if there were Xt timers or fds registered, they would never get serviced, and if there were any Xt widgets, they would never have events delivered. diff --git a/driver/demo-Xm-widgets.c b/driver/demo-Xm-widgets.c index cbe33934..d47259b1 100644 --- a/driver/demo-Xm-widgets.c +++ b/driver/demo-Xm-widgets.c @@ -79,6 +79,8 @@ tab_cb (Widget button, XtPointer client_data, XtPointer ignored) } +extern Widget create_xscreensaver_demo (Widget parent); + Widget create_xscreensaver_demo (Widget parent) { @@ -539,14 +541,12 @@ create_options_page (Widget parent) timeoutLabel cycleLabel fadeSecondsLabel - fadeTicksLabel lockLabel passwdLabel timeoutText cycleText fadeSecondsText - fadeTicksText lockText passwdText @@ -566,11 +566,11 @@ create_options_page (Widget parent) Arg av[64]; int ac = 0; Widget children[100]; - Widget timeout_label, cycle_label, fade_seconds_label, fade_ticks_label; + Widget timeout_label, cycle_label, fade_seconds_label; Widget lock_label, passwd_label, hr; Widget preferences_form; - Widget timeout_text, cycle_text, fade_text, fade_ticks_text; + Widget timeout_text, cycle_text, fade_text; Widget lock_timeout_text, passwd_timeout_text, verbose_toggle; Widget install_cmap_toggle, fade_toggle, unfade_toggle; Widget lock_toggle, prefs_done, prefs_cancel; @@ -601,10 +601,6 @@ create_options_page (Widget parent) "fadeSecondsLabel", av, ac); ac = 0; XtSetArg(av[ac], XmNalignment, XmALIGNMENT_END); ac++; - fade_ticks_label = XmCreateLabelGadget (preferences_form, "fadeTicksLabel", - av, ac); - ac = 0; - XtSetArg(av[ac], XmNalignment, XmALIGNMENT_END); ac++; lock_label = XmCreateLabelGadget (preferences_form, "lockLabel", av, ac); ac = 0; XtSetArg(av[ac], XmNalignment, XmALIGNMENT_END); ac++; @@ -613,8 +609,6 @@ create_options_page (Widget parent) timeout_text = XmCreateTextField (preferences_form, "timeoutText", av, ac); cycle_text = XmCreateTextField (preferences_form, "cycleText", av, ac); fade_text = XmCreateTextField (preferences_form, "fadeSecondsText", av, ac); - fade_ticks_text = XmCreateTextField (preferences_form, "fadeTicksText", - av, ac); lock_timeout_text = XmCreateTextField (preferences_form, "lockText", av, ac); passwd_timeout_text = XmCreateTextField (preferences_form, "passwdText", @@ -684,20 +678,6 @@ create_options_page (Widget parent) XmNrightWidget, fade_text, NULL); - XtVaSetValues (fade_ticks_label, - XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, - XmNtopOffset, 0, - XmNtopWidget, fade_ticks_text, - XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET, - XmNbottomOffset, 0, - XmNbottomWidget, fade_ticks_text, - XmNleftAttachment, XmATTACH_FORM, - XmNleftOffset, 20, - XmNrightAttachment, XmATTACH_WIDGET, - XmNrightOffset, 4, - XmNrightWidget, fade_ticks_text, - NULL); - XtVaSetValues (lock_label, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopOffset, 0, @@ -751,7 +731,7 @@ create_options_page (Widget parent) XmNleftWidget, cycle_text, NULL); - XtVaSetValues (fade_ticks_text, + XtVaSetValues (lock_timeout_text, XmNtopAttachment, XmATTACH_WIDGET, XmNtopOffset, 2, XmNtopWidget, fade_text, @@ -760,15 +740,6 @@ create_options_page (Widget parent) XmNleftWidget, fade_text, NULL); - XtVaSetValues (lock_timeout_text, - XmNtopAttachment, XmATTACH_WIDGET, - XmNtopOffset, 2, - XmNtopWidget, fade_ticks_text, - XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET, - XmNleftOffset, 0, - XmNleftWidget, fade_ticks_text, - NULL); - XtVaSetValues (passwd_timeout_text, XmNtopAttachment, XmATTACH_WIDGET, XmNtopOffset, 4, @@ -822,10 +793,10 @@ create_options_page (Widget parent) XtVaSetValues (unfade_toggle, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopOffset, 0, - XmNtopWidget, fade_ticks_text, + XmNtopWidget, lock_timeout_text, XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET, XmNbottomOffset, 0, - XmNbottomWidget, fade_ticks_text, + XmNbottomWidget, lock_timeout_text, XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET, XmNleftOffset, 0, XmNleftWidget, fade_toggle, @@ -836,10 +807,10 @@ create_options_page (Widget parent) XtVaSetValues (lock_toggle, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopOffset, 0, - XmNtopWidget, lock_timeout_text, + XmNtopWidget, passwd_timeout_text, XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET, XmNbottomOffset, 0, - XmNbottomWidget, lock_timeout_text, + XmNbottomWidget, passwd_timeout_text, XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET, XmNleftOffset, 0, XmNleftWidget, unfade_toggle, @@ -872,13 +843,11 @@ create_options_page (Widget parent) children[ac++] = timeout_label; children[ac++] = cycle_label; children[ac++] = fade_seconds_label; - children[ac++] = fade_ticks_label; children[ac++] = lock_label; children[ac++] = passwd_label; children[ac++] = timeout_text; children[ac++] = cycle_text; children[ac++] = fade_text; - children[ac++] = fade_ticks_text; children[ac++] = lock_timeout_text; children[ac++] = passwd_timeout_text; children[ac++] = verbose_toggle; diff --git a/driver/demo-Xm.c b/driver/demo-Xm.c index 3497641d..547bbe9a 100644 --- a/driver/demo-Xm.c +++ b/driver/demo-Xm.c @@ -1,5 +1,5 @@ /* demo-Xm.c --- implements the interactive demo-mode and options dialogs. - * xscreensaver, Copyright (c) 1993-2003, 2005 Jamie Zawinski + * xscreensaver, Copyright © 1993-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -16,23 +16,20 @@ #ifdef HAVE_MOTIF /* whole file */ +#include "blurb.h" + #include #ifdef HAVE_UNISTD_H # include #endif -#ifndef VMS -# include /* for getpwuid() */ -#else /* VMS */ -# include "vms-pwd.h" -#endif /* VMS */ - #ifdef HAVE_UNAME # include /* for uname() */ #endif /* HAVE_UNAME */ #include +#include /* for getpwuid() */ #include /* for CARD32 */ #include /* for XA_INTEGER */ @@ -48,18 +45,6 @@ # include #endif /* HAVE_XPM */ -#ifdef HAVE_XMU -# ifndef VMS -# include -# else /* VMS */ -# include -# endif -#else -# include "xmu.h" -#endif - - - #include #include #include @@ -78,11 +63,12 @@ #endif /* HAVE_XMCOMBOBOX */ #include "version.h" -#include "prefs.h" +#include "types.h" #include "resources.h" /* for parse_time() */ -#include "visual.h" /* for has_writable_cells() */ #include "remote.h" /* for xscreensaver_command() */ -#include "usleep.h" +#include "visual.h" +#include "atoms.h" +#include "xmu.h" #include #include @@ -92,7 +78,6 @@ #define countof(x) (sizeof((x))/sizeof((*x))) -char *progname = 0; char *progclass = "XScreenSaver"; XrmDatabase db; @@ -102,20 +87,12 @@ typedef struct { static void *global_prefs_pair; /* I hate C so much... */ -char *blurb (void) { return progname; } - extern Widget create_xscreensaver_demo (Widget parent); extern const char *visual_menu[]; static char *short_version = 0; -Atom XA_VROOT; -Atom XA_SCREENSAVER, XA_SCREENSAVER_RESPONSE, XA_SCREENSAVER_VERSION; -Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO; -Atom XA_ACTIVATE, XA_SUSPEND, XA_BLANK, XA_LOCK, XA_RESTART, XA_EXIT; - - static void populate_demo_window (Widget toplevel, int which, prefs_pair *pair); static void populate_prefs_page (Widget top, prefs_pair *pair); @@ -297,7 +274,7 @@ run_hack (Widget widget, int which, Bool report_errors_p) /* Button callbacks */ -void +static void exit_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) { apply_changes_and_save (XtParent (button)); @@ -313,7 +290,7 @@ wm_close_cb (Widget widget, GdkEvent *event, XtPointer data) } #endif -void +static void cut_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) { /* #### */ @@ -323,7 +300,7 @@ cut_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) } -void +static void copy_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) { /* #### */ @@ -333,7 +310,7 @@ copy_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) } -void +static void paste_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) { /* #### */ @@ -343,7 +320,7 @@ paste_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) } -void +static void about_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) { char buf [2048]; @@ -356,8 +333,8 @@ about_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) sprintf (buf, "%s\n%s\n" "\n" - "This is the Motif version of \"xscreensaver-demo\". The Motif\n" - "version is no longer maintained. Please use the GTK version\n" + "This is the Motif version of \"xscreensaver-settings\".\n" + "It is no longer maintained. Please use the GTK version\n" "instead, which has many more features.\n" "\n" "For xscreensaver updates, check https://www.jwz.org/xscreensaver/", @@ -368,7 +345,7 @@ about_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) } -void +static void doc_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) { prefs_pair *pair = (prefs_pair *) client_data; @@ -385,39 +362,39 @@ doc_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) } help_command = (char *) malloc (strlen (p->load_url_command) + - (strlen (p->help_url) * 4) + 20); + (strlen (p->help_url) * 5) + 20); strcpy (help_command, "( "); sprintf (help_command + strlen(help_command), p->load_url_command, - p->help_url, p->help_url, p->help_url, p->help_url); + p->help_url, p->help_url, p->help_url, p->help_url, p->help_url); strcat (help_command, " ) &"); system (help_command); free (help_command); } -void +static void activate_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) { run_cmd (XtParent (button), XA_ACTIVATE, 0); } -void +static void lock_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) { run_cmd (XtParent (button), XA_LOCK, 0); } -void +static void kill_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) { run_cmd (XtParent (button), XA_EXIT, 0); } -void +static void restart_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) { #if 0 @@ -427,7 +404,7 @@ restart_menu_cb (Widget button, XtPointer client_data, XtPointer ignored) apply_changes_and_save (button); xscreensaver_command (XtDisplay (button), XA_EXIT, 0, False, NULL); sleep (1); - system ("xscreensaver -nosplash &"); + system ("xscreensaver -splash &"); #endif await_xscreensaver (button); @@ -641,7 +618,7 @@ apply_changes_and_save (Widget widget) return 0; } -void +static void run_this_cb (Widget button, XtPointer client_data, XtPointer ignored) { int which = selected_hack_number (XtParent (button)); @@ -651,7 +628,7 @@ run_this_cb (Widget button, XtPointer client_data, XtPointer ignored) } -void +static void manual_cb (Widget button, XtPointer client_data, XtPointer ignored) { prefs_pair *pair = (prefs_pair *) client_data; @@ -695,7 +672,7 @@ manual_cb (Widget button, XtPointer client_data, XtPointer ignored) } -void +static void run_next_cb (Widget button, XtPointer client_data, XtPointer ignored) { prefs_pair *pair = (prefs_pair *) client_data; @@ -725,7 +702,7 @@ run_next_cb (Widget button, XtPointer client_data, XtPointer ignored) } -void +static void run_prev_cb (Widget button, XtPointer client_data, XtPointer ignored) { prefs_pair *pair = (prefs_pair *) client_data; @@ -781,7 +758,7 @@ hack_time_text (Widget button, const char *line, Time *store, Bool sec_p) } -void +static void prefs_ok_cb (Widget button, XtPointer client_data, XtPointer ignored) { prefs_pair *pair = (prefs_pair *) client_data; @@ -825,7 +802,6 @@ prefs_ok_cb (Widget button, XtPointer client_data, XtPointer ignored) MINUTES (&p2->timeout, "timeoutText"); MINUTES (&p2->cycle, "cycleText"); SECONDS (&p2->fade_seconds, "fadeSecondsText"); - INTEGER (&p2->fade_ticks, "fadeTicksText"); MINUTES (&p2->lock_timeout, "lockText"); SECONDS (&p2->passwd_timeout, "passwdText"); CHECKBOX (p2->verbose_p, "verboseToggle"); @@ -848,7 +824,6 @@ prefs_ok_cb (Widget button, XtPointer client_data, XtPointer ignored) COPY(lock_timeout); COPY(passwd_timeout); COPY(fade_seconds); - COPY(fade_ticks); COPY(verbose_p); COPY(install_cmap_p); COPY(fade_p); @@ -863,7 +838,7 @@ prefs_ok_cb (Widget button, XtPointer client_data, XtPointer ignored) } -void +static void prefs_cancel_cb (Widget button, XtPointer client_data, XtPointer ignored) { prefs_pair *pair = (prefs_pair *) client_data; @@ -996,8 +971,6 @@ populate_prefs_page (Widget top, prefs_pair *pair) XtVaSetValues (name_to_widget (top, "passwdText"), XmNvalue, s, NULL); format_time (s, p->fade_seconds); XtVaSetValues (name_to_widget (top, "fadeSecondsText"), XmNvalue, s, NULL); - sprintf (s, "%u", p->fade_ticks); - XtVaSetValues (name_to_widget (top, "fadeTicksText"), XmNvalue, s, NULL); XtVaSetValues (name_to_widget (top, "verboseToggle"), XmNset, p->verbose_p, NULL); @@ -1009,42 +982,6 @@ populate_prefs_page (Widget top, prefs_pair *pair) XmNset, p->unfade_p, NULL); XtVaSetValues (name_to_widget (top, "lockToggle"), XmNset, p->lock_p, NULL); - - - { - Bool found_any_writable_cells = False; - Display *dpy = XtDisplay (top); - int nscreens = ScreenCount(dpy); - int i; - for (i = 0; i < nscreens; i++) - { - Screen *s = ScreenOfDisplay (dpy, i); - if (has_writable_cells (s, DefaultVisualOfScreen (s))) - { - found_any_writable_cells = True; - break; - } - } - -#ifdef HAVE_XF86VMODE_GAMMA - found_any_writable_cells = True; /* if we can gamma fade, go for it */ -#endif - - XtVaSetValues (name_to_widget (top, "fadeSecondsLabel"), XtNsensitive, - found_any_writable_cells, NULL); - XtVaSetValues (name_to_widget (top, "fadeTicksLabel"), XtNsensitive, - found_any_writable_cells, NULL); - XtVaSetValues (name_to_widget (top, "fadeSecondsText"), XtNsensitive, - found_any_writable_cells, NULL); - XtVaSetValues (name_to_widget (top, "fadeTicksText"), XtNsensitive, - found_any_writable_cells, NULL); - XtVaSetValues (name_to_widget (top, "cmapToggle"), XtNsensitive, - found_any_writable_cells, NULL); - XtVaSetValues (name_to_widget (top, "fadeToggle"), XtNsensitive, - found_any_writable_cells, NULL); - XtVaSetValues (name_to_widget (top, "unfadeToggle"), XtNsensitive, - found_any_writable_cells, NULL); - } } @@ -1054,7 +991,7 @@ sensitize_demo_widgets (Widget toplevel, Bool sensitive_p) const char *names[] = { "cmdLabel", "cmdText", "enabled", "visLabel", "combo", "demo", "man" }; int i; - for (i = 0; i < sizeof(names)/countof(*names); i++) + for (i = 0; i < countof(names); i++) { Widget w = name_to_widget (toplevel, names[i]); XtVaSetValues (w, XtNsensitive, sensitive_p, NULL); @@ -1063,7 +1000,7 @@ sensitize_demo_widgets (Widget toplevel, Bool sensitive_p) /* I don't know how to handle these yet... */ { const char *names2[] = { "cut", "copy", "paste" }; - for (i = 0; i < sizeof(names2)/countof(*names2); i++) + for (i = 0; i < countof(names2); i++) { Widget w = name_to_widget (toplevel, names2[i]); XtVaSetValues (w, XtNsensitive, FALSE, NULL); @@ -1208,7 +1145,7 @@ pixmapify_buttons (Widget toplevel) -char * +static char * get_hack_blurb (Display *dpy, screenhack *hack) { char *doc_string; @@ -1301,8 +1238,8 @@ get_hack_blurb (Display *dpy, screenhack *hack) # endif /* 0 */ doc_string = strdup ( "\n" - "This is the Motif version of \"xscreensaver-demo\". The Motif " - "version is no longer maintained. Please use the GTK version " + "This is the Motif version of \"xscreensaver-settings\"." + "It is no longer maintained. Please use the GTK version " "instead, which has many more features." "\n\n" "If you were running the GTK version, there would be a preview " @@ -1475,10 +1412,10 @@ sanity_check_resources (Widget toplevel) { const char *names[] = { "demoTab", "optionsTab", "cmdLabel", "visLabel", "enabled", "demo", "man", "timeoutLabel", - "cycleLabel", "fadeSecondsLabel", "fadeTicksLabel", + "cycleLabel", "fadeSecondsLabel", "lockLabel", "passwdLabel" }; int i; - for (i = 0; i < sizeof(names)/countof(*names); i++) + for (i = 0; i < countof(names); i++) { Widget w = name_to_widget (toplevel, names[i]); const char *name = XtName(w); @@ -1566,11 +1503,9 @@ the_network_is_not_the_computer (Widget parent) lhost = ""; else lhost = uts.nodename; -# elif defined(VMS) - strcpy (lhost, getenv("SYS$NODE")); -# else /* !HAVE_UNAME && !VMS */ +# else /* !HAVE_UNAME */ strcat (lhost, ""); -# endif /* !HAVE_UNAME && !VMS */ +# endif /* !HAVE_UNAME */ if (p && p->pw_name) luser = p->pw_name; @@ -1738,7 +1673,7 @@ main (int argc, char **argv) dpy = XtDisplay (toplevel_shell); db = XtDatabase (dpy); - XtGetApplicationNameAndClass (dpy, &progname, &progclass); + XtGetApplicationNameAndClass (dpy, (char **) &progname, &progclass); XSetErrorHandler (demo_ehandler); /* Complain about unrecognized command-line arguments. @@ -1758,9 +1693,9 @@ main (int argc, char **argv) } } - short_version = (char *) malloc (5); - memcpy (short_version, screensaver_id + 17, 4); - short_version [4] = 0; + short_version = strdup (screensaver_id + 17); + s = strchr (short_version, ' '); + *s = 0; /* Load the init file, which may end up consulting the X resource database and the site-wide app-defaults file. Note that at this point, it's @@ -1789,22 +1724,7 @@ main (int argc, char **argv) #endif - /* Intern the atoms that xscreensaver_command() needs. - */ - XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False); - XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False); - XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION",False); - XA_SCREENSAVER_STATUS = XInternAtom (dpy, "_SCREENSAVER_STATUS", False); - XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False); - XA_SCREENSAVER_RESPONSE = XInternAtom (dpy, "_SCREENSAVER_RESPONSE", False); - XA_SELECT = XInternAtom (dpy, "SELECT", False); - XA_DEMO = XInternAtom (dpy, "DEMO", False); - XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False); - XA_SUSPEND = XInternAtom (dpy, "SUSPEND", False); - XA_BLANK = XInternAtom (dpy, "BLANK", False); - XA_LOCK = XInternAtom (dpy, "LOCK", False); - XA_EXIT = XInternAtom (dpy, "EXIT", False); - XA_RESTART = XInternAtom (dpy, "RESTART", False); + init_xscreensaver_atoms (dpy); /* Create the window and all its widgets. */ diff --git a/driver/dialog.c b/driver/dialog.c new file mode 100644 index 00000000..fce74c4d --- /dev/null +++ b/driver/dialog.c @@ -0,0 +1,2507 @@ +/* dialog.c --- the password dialog and splash screen. + * xscreensaver, Copyright © 1993-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + + +/* This file renders the unlock dialog and splash screen, using Xlib and Xft. + * One significant complication is that it must read raw XInput2 events to + * get keyboard and mouse input, as the "xscreensaver" process has the mouse + * and keyboard grabbed while this is running. + * + * It might be possible to implement this file using Gtk instead of Xlib, + * but the grab situation might make that tricky: those events would have to + * be re-sent to the toolkit widgets in a way that it would understand them. + * Also, toolkits tend to assume that a window manager exists, and this + * window must be an OverrideRedirect window with no focus management. + * + * Crashes here are interpreted as "unauthorized" and do not unlock the + * screen. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_UNISTD_H +# include +#endif + +#ifdef HAVE_UNAME +# include +#endif /* HAVE_UNAME */ +#include +#include + +#include /* for CARD32 */ +#include +#include +#include +#include + +#ifdef ENABLE_NLS +# include +# include +# define _(S) gettext(S) +#else +# define _(S) (S) +#endif + +#ifdef HAVE_XKB +# include +# include +#endif + +#include "version.h" +#include "blurb.h" +#include "auth.h" +#include "atoms.h" +#include "screens.h" +#include "xft.h" +#include "xftwrap.h" +#include "xinput.h" +#include "resources.h" +#include "visual.h" +#include "font-retry.h" +#include "prefs.h" +#include "usleep.h" + +extern Bool debug_p; + +#undef DEBUG_METRICS +#undef DEBUG_STACKING + +#define LOCK_FAILURE_ATOM "_XSCREENSAVER_AUTH_FAILURES" + +#undef MAX +#undef MIN +#define MAX(a,b) ((a)>(b)?(a):(b)) +#define MIN(a,b) ((a)<(b)?(a):(b)) + +#define MAX_BYTES_PER_CHAR 8 /* UTF-8 uses up to 6 bytes */ +#define MAX_PASSWD_CHARS 280 /* Longest possible passphrase */ + +typedef struct window_state window_state; + + +typedef enum { + AUTH_READ, /* reading input or ready to do so */ + AUTH_SUCCESS, /* auth success, unlock */ + AUTH_FAIL, /* auth fail */ + AUTH_CANCEL, /* user canceled, or typed blank password */ + AUTH_TIME, /* timed out */ + AUTH_FINISHED, /* user pressed enter */ + AUTH_NOTIFY /* displaying message after finished */ +} auth_state; + + +/* A mini-toolkit for rendering text labels, input fields, and buttons. + */ +typedef enum { CENTER, LEFT, RIGHT } line_align; + +typedef struct { + Bool down_p; + XRectangle rect; + char *cmd; + void (*fn) (window_state *ws); + Bool disabled_p; +} line_button_state; + + +typedef struct { + char *text; + XftFont *font; + XftColor fg; + Pixel bg; + enum { LABEL, BUTTON, TEXT, TEXT_RO } type; + line_align align; + Bool float_p; + Bool i_beam; + line_button_state *button; +} dialog_line; + + +/* Global state. + */ +struct window_state { + XtAppContext app; + Display *dpy; + Screen *screen; + Position cx, cy, x, y; + Dimension min_height; + Window window; + Colormap cmap; + + Bool splash_p; + auth_state auth_state; + int xi_opcode; + int xkb_opcode; + + /* Variant strings + */ + char *version; + char *user; + int nmsgs; + const auth_message *msgs; + + /* "Characters" in the password may be a variable number of bytes long. + plaintext_passwd contains the raw bytes. + plaintext_passwd_char_size indicates the size in bytes of each character, + so that we can make backspace work. + censored_passwd is the asterisk version. + + Maybe it would be more sensible to use uint32_t and utils/utf8wc.c here, + but the multi-byte string returned by XLookupString might not be UTF-8 + (see comment in handle_keypress). + */ + char plaintext_passwd [MAX_PASSWD_CHARS * MAX_BYTES_PER_CHAR]; + char censored_passwd [MAX_PASSWD_CHARS * MAX_BYTES_PER_CHAR]; + char plaintext_passwd_char_size [MAX_PASSWD_CHARS]; + + XComposeStatus compose_status; + + XtIntervalId timer; + + XtIntervalId cursor_timer; /* Blink the I-beam */ + int i_beam; + + double start_time, end_time; + + Bool show_stars_p; /* "I regret that I have but one asterisk for my country." + -- Nathan Hale, 1776. */ + Bool caps_p; /* Whether we saw a keypress with caps-lock on */ + + char *dialog_theme; + char *heading_label; + char *body_label; + char *hostname_label; + char *date_format; + char *kbd_layout_label; + char *newlogin_cmd; + + /* Resources for fonts and colors */ + XftDraw *xftdraw; + XftFont *heading_font; + XftFont *body_font; + XftFont *error_font; + XftFont *label_font; + XftFont *date_font; + XftFont *button_font; + XftFont *hostname_font; + + Pixel foreground; + Pixel background; + XftColor xft_foreground; + XftColor xft_text_foreground; + XftColor xft_button_foreground; + XftColor xft_error_foreground; + Pixel passwd_background; + Pixel thermo_foreground; + Pixel thermo_background; + Pixel shadow_top; + Pixel shadow_bottom; + Pixel border_color; + Pixel button_background; + Pixel logo_background; + + Dimension preferred_logo_width; + Dimension preferred_logo_height; + Dimension thermo_width; + Dimension internal_padding; + Dimension shadow_width; + Dimension border_width; + + Pixmap logo_pixmap; + Pixmap logo_clipmask; + unsigned int logo_width, logo_height; + int logo_npixels; + unsigned long *logo_pixels; + + line_button_state newlogin_button_state; + line_button_state unlock_button_state; + line_button_state demo_button_state; + line_button_state help_button_state; +}; + + +static void +draw_shaded_rectangle (Display *dpy, Window window, + int x, int y, + int width, int height, + int thickness, + unsigned long top_color, + unsigned long bottom_color) +{ + XPoint points[4]; + XGCValues gcv; + GC gc1, gc2; + if (thickness == 0) return; + + gcv.foreground = top_color; + gc1 = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = bottom_color; + gc2 = XCreateGC (dpy, window, GCForeground, &gcv); + + points [0].x = x; + points [0].y = y; + points [1].x = x + width; + points [1].y = y; + points [2].x = x + width - thickness; + points [2].y = y + thickness; + points [3].x = x; + points [3].y = y + thickness; + XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin); + + points [0].x = x; + points [0].y = y + thickness; + points [1].x = x; + points [1].y = y + height; + points [2].x = x + thickness; + points [2].y = y + height - thickness; + points [3].x = x + thickness; + points [3].y = y + thickness; + XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin); + + points [0].x = x + width; + points [0].y = y; + points [1].x = x + width - thickness; + points [1].y = y + thickness; + points [2].x = x + width - thickness; + points [2].y = y + height - thickness; + points [3].x = x + width; + points [3].y = y + height - thickness; + XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin); + + points [0].x = x; + points [0].y = y + height; + points [1].x = x + width; + points [1].y = y + height; + points [2].x = x + width; + points [2].y = y + height - thickness; + points [3].x = x + thickness; + points [3].y = y + height - thickness; + XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin); + + XFreeGC (dpy, gc1); + XFreeGC (dpy, gc2); +} + +#define IBEAM_WIDTH 2 + +static void +draw_i_beam (Display *dpy, Drawable d, Pixel color, int x, int y, int height) +{ + XGCValues gcv; + GC gc; + gcv.foreground = color; + gcv.line_width = IBEAM_WIDTH; + gc = XCreateGC (dpy, d, GCForeground | GCLineWidth, &gcv); + XDrawLine (dpy, d, gc, x, y, x, y + height); /* Ceci n'est pas une pipe */ + XFreeGC (dpy, gc); +} + + +static int +draw_dialog_line (window_state *ws, Drawable d, dialog_line *line, + int left, int right, int y, Bool clear_p) +{ + int w = right - left; + int h; + int xpad = 0, ypad = 0; + XGlyphInfo overall; + line_align align = line->align; + int oleft = left; + int tleft = left; + int oright = right; + int clip_w = 0; + int gutter = 0; + XRectangle rect; + int xoff2 = 0; + int yoff2 = 0; + char *text2 = 0; + char *text = line->text; + int nlines = 1; + + /* Adjust left/right margins based on the type of the line. + */ + switch (line->type) { + case LABEL: + if (line->float_p && line->align == LEFT) + { + /* Add 1px to leave a little padding between the top border of the + label and the ascenders. */ + ypad = ws->shadow_width + 1; + right = left + w/2 - ws->shadow_width * 2 - line->font->ascent / 2; + align = RIGHT; + } + + if (*line->text) + text = text2 = xft_word_wrap (ws->dpy, line->font, line->text, + right - left); + break; + + case BUTTON: /* box is fixed width at 1/3, text centered */ + align = CENTER; + xpad = 0; + /* make the buttons a little taller than everything else */ + /* Add 1px as above */ + ypad = ws->shadow_width + line->font->ascent / 2 + 1; + gutter = ws->shadow_width; + clear_p = True; + + switch (line->align) { + case LEFT: + right = left + w/3 - xpad; + break; + case CENTER: + xpad = ws->shadow_width * 2; + left += w/3 + xpad; + right -= w/3 + xpad; + break; + case RIGHT: + left = right - w/3 + xpad; + break; + } + oright = right; + xpad = 0; + break; + + case TEXT: /* box is fixed width at 1/2, text left */ + case TEXT_RO: + align = LEFT; + oleft = left + xoff2; + clear_p = True; + xpad = ws->shadow_width + line->font->ascent / 4; + /* Add 1px as above */ + ypad = ws->shadow_width + 1; + gutter = ws->shadow_width; + if (gutter < 2) gutter = 2; + + switch (line->align) { + case LEFT: + right = left + w/2; + break; + case RIGHT: + left = right - w/2; + break; + case CENTER: + abort(); + break; + } + + /* If the text is longer than the field, scroll horizontally to show + the end of the text instead of the beginning. + */ + XftTextExtentsUtf8_multi (ws->dpy, line->font, (FcChar8 *) text, + strlen(text), &overall); + if (overall.width >= w/2 - ws->shadow_width * 2 - IBEAM_WIDTH) + { + align = RIGHT; + left = right - w/2; + } + break; + + default: abort(); break; + } + + /* Clear out the area we're about to overwrite. + */ + h = nlines * (line->font->ascent + line->font->descent) + ypad*2; + if (clear_p) + { + GC gc; + XGCValues gcv; + gcv.foreground = line->bg; + gc = XCreateGC (ws->dpy, d, GCForeground, &gcv); + XFillRectangle (ws->dpy, d, gc, left, y, oright-left, h); + XFreeGC (ws->dpy, gc); + } + + /* Draw borders if necessary. + */ + switch (line->type) { + case LABEL: break; + case BUTTON: case TEXT: case TEXT_RO: + { + Bool in_p = (line->type != BUTTON); + if (line->button) + { + line->button->rect.x = left; + line->button->rect.y = y; + line->button->rect.width = right-left; + line->button->rect.height = h; + in_p = line->button->down_p || line->button->disabled_p; + } + tleft = left; + draw_shaded_rectangle (ws->dpy, d, + left, y, right-left, h, + ws->shadow_width, + (in_p ? ws->shadow_bottom : ws->shadow_top), + (in_p ? ws->shadow_top : ws->shadow_bottom)); + clip_w = ws->shadow_width; + } + break; + default: abort(); break; + } + + /* Draw the text inside our box. + */ + nlines = XftTextExtentsUtf8_multi (ws->dpy, line->font, (FcChar8 *) text, + strlen(text), &overall); + w = overall.width - overall.x; + switch (align) { + case LEFT: left = left + xpad; break; + case RIGHT: left = right - w - xpad; break; + case CENTER: + oleft = left; + left = left + xpad + (right - left - w) / 2; + if (left < oleft) left = oleft; + break; + default: abort(); break; + } + + rect.x = MAX (oleft, MAX (left, tleft + clip_w)); + rect.width = MIN (oright, right) - rect.x - clip_w; + rect.y = y + ypad - overall.y + line->font->ascent; + rect.height = overall.height; + + XftDrawSetClipRectangles (ws->xftdraw, 0, 0, &rect, 1); + + if (line->type == BUTTON && + line->button && + (line->button->down_p || line->button->disabled_p)) + xoff2 = yoff2 = MIN (ws->shadow_width, line->font->ascent/2); + + XftDrawStringUtf8_multi (ws->xftdraw, &line->fg, line->font, + left + xoff2, + y + ypad + yoff2 + line->font->ascent, + (FcChar8 *) text, strlen (text), + (align == LEFT ? 1 : align == CENTER ? 0 : -1)); +# ifdef DEBUG_METRICS + { + GC gc; + XGCValues gcv; + int yy = y + ypad + yoff2 + line->font->ascent; + gcv.foreground = line->fg.pixel; + gc = XCreateGC (ws->dpy, d, GCForeground, &gcv); + /* draw a line on the baseline of the text */ + XDrawLine (ws->dpy, d, gc, 0, yy, right, yy); + yy -= line->font->ascent; + /* a line above the ascenders */ + XDrawLine (ws->dpy, d, gc, left, yy, right, yy); + yy += line->font->ascent + line->font->descent; + /* and below the descenders */ + XDrawLine (ws->dpy, d, gc, left, yy, right, yy); + XFreeGC (ws->dpy, gc); + } +# endif + + if (line->i_beam) + draw_i_beam (ws->dpy, d, + ws->foreground, + left + xoff2 + overall.width, + y + ypad + yoff2, + line->font->ascent + line->font->descent); + + XftDrawSetClip (ws->xftdraw, 0); + + if (text2) free (text2); + + y += ypad*2 + (nlines * (line->font->ascent + line->font->descent)) + gutter; + return y; +} + + +static int +draw_dialog_lines (window_state *sp, Drawable d, dialog_line *lines, + int left, int right, int top) +{ + int i; + int maxy = 0; + for (i = 0; lines[i].text; i++) + { + Bool clear_p = (i > 0 && lines[i-1].float_p ? False : True); + int y = draw_dialog_line (sp, d, &lines[i], left, right, top, clear_p); + if (y > maxy) maxy = y; + if (! lines[i].float_p) + top = maxy; + } + return top; +} + + +static pid_t +fork_and_exec (Display *dpy, int argc, char **argv) +{ + char buf [255]; + pid_t forked = fork(); + switch ((int) forked) { + case -1: + sprintf (buf, "%s: couldn't fork", blurb()); + perror (buf); + break; + + case 0: + close (ConnectionNumber (dpy)); /* close display fd */ + execvp (argv[0], argv); /* shouldn't return. */ + + sprintf (buf, "%s: pid %lu: couldn't exec %s", blurb(), + (unsigned long) getpid(), argv[0]); + perror (buf); + exit (1); /* exits child fork */ + break; + + default: /* parent fork */ + if (verbose_p) + { + int i; + fprintf (stderr, "%s: pid %lu: launched", + blurb(), (unsigned long) forked); + for (i = 0; i < argc; i++) + fprintf (stderr, " %s", argv[i]); + fprintf (stderr, "\n"); + } + break; + } + + return forked; +} + + +/* Loading resources + */ +static void +resource_keys (window_state *ws, const char **name, const char **rclass) +{ + const char *theme = ws->dialog_theme; + const char *name2 = (ws->splash_p ? "splash" : "passwd"); + const char *class2 = "Dialog"; + static char res[200], rclass2[200]; + char *s; + + /* First try $THEME."Dialog.value" */ + sprintf (res, "%s.%s.%s", theme, name2, *name); + sprintf (rclass2, "%s.%s.%s", theme, class2, *rclass); + s = get_string_resource (ws->dpy, res, rclass2); + if (s && *s) goto DONE; + + /* Next try "default.Dialog.value" */ + if (s) free (s); + theme = "default"; + sprintf (res, "%s.%s.%s", theme, name2, *name); + sprintf (rclass2, "%s.%s.%s", theme, class2, *rclass); + s = get_string_resource (ws->dpy, res, rclass2); + if (s && *s) goto DONE; + + /* Next try "Dialog.value" */ + if (s) free (s); + sprintf (res, "%s.%s", theme, *name); + sprintf (rclass2, "%s.%s", theme, *rclass); + s = get_string_resource (ws->dpy, res, rclass2); + if (s && *s) goto DONE; + + DONE: + *name = res; + *rclass = rclass2; + if (s) free (s); +} + + +static char * +get_str (window_state *ws, const char *name, const char *rclass) +{ + resource_keys (ws, &name, &rclass); + return get_string_resource (ws->dpy, (char *) name, (char *) rclass); +} + + +static XftFont * +get_font (window_state *ws, const char *name) +{ + const char *rclass = "Font"; + XftFont *f; + char *s; + resource_keys (ws, &name, &rclass); + s = get_string_resource (ws->dpy, (char *) name, (char *) rclass); + if (!s || !*s) + s = "sans-serif 14"; + f = load_xft_font_retry (ws->dpy, DefaultScreen(ws->dpy), s); + if (!f) abort(); + return f; +} + +static unsigned long +get_color (window_state *ws, const char *name, const char *rclass) +{ + resource_keys (ws, &name, &rclass); + return get_pixel_resource (ws->dpy, DefaultColormapOfScreen (ws->screen), + (char *) name, (char *) rclass); +} + +static void +get_xft_color (window_state *ws, XftColor *ret, + const char *name, const char *rclass) +{ + char *s; + resource_keys (ws, &name, &rclass); + s = get_string_resource (ws->dpy, (char *) name, (char *) rclass); + if (!s || !*s) s = "black"; + XftColorAllocName (ws->dpy, + DefaultVisualOfScreen(ws->screen), + DefaultColormapOfScreen (ws->screen), + s, ret); +} + +static int +get_int (window_state *ws, const char *name, const char *rclass) +{ + resource_keys (ws, &name, &rclass); + return get_integer_resource (ws->dpy, (char *) name, (char *) rclass); +} + + +/* Decide where on the X11 screen to place the dialog. + This is complicated because, in the face of RANDR and Xinerama, we want + to center it on a *monitor*, not on what X calls a 'Screen'. So get the + monitor state, then figure out which one of those the mouse is in. + */ +static void +splash_pick_window_position (Display *dpy, Position *xP, Position *yP) +{ + Window pointer_root, pointer_child; + int root_x = 0, root_y = 0, win_x, win_y; + unsigned int mask; + monitor **monitors; + monitor *m = 0; + int i; + + XQueryPointer (dpy, RootWindow (dpy, 0), + &pointer_root, &pointer_child, + &root_x, &root_y, &win_x, &win_y, &mask); + + monitors = scan_monitors (dpy); + if (!monitors || !*monitors) abort(); + + for (i = 0; monitors[i]; i++) + { + monitor *m0 = monitors[i]; + if (m0->sanity == S_SANE && + root_x >= m0->x && + root_y >= m0->y && + root_x < m0->x + m0->width && + root_y < m0->y + m0->height) + { + m = m0; + break; + } + } + + if (!m) + { + if (verbose_p) + fprintf (stderr, "%s: mouse is not on any monitor?\n", blurb()); + m = monitors[0]; + } + else if (verbose_p) + fprintf (stderr, + "%s: mouse is at %d,%d on monitor %d %dx%d+%d+%d \"%s\"\n", + blurb(), root_x, root_y, m->id, + m->width, m->height, m->x, m->y, + (m->desc ? m->desc : "")); + + *xP = m->x + m->width/2; + *yP = m->y + m->height/2; + + free_monitors (monitors); +} + + +static void unlock_cb (window_state *ws); + + +/* This program only needs one option from the init file, so it + just reads the .ad file and the .xscreensaver file directly rather + than going through Xt and Xrm. + */ +static void init_line_handler (int lineno, + const char *key, const char *val, + void *closure) +{ + window_state *ws = (window_state *) closure; + if (val && *val && !strcmp (key, "dialogTheme")) + { + if (ws->dialog_theme) free (ws->dialog_theme); + ws->dialog_theme = strdup (val); + } +} + +static void +read_init_file_simple (window_state *ws) +{ + const char *home = getenv("HOME"); + const char *fn1 = AD_DIR "/XScreenSaver"; + char *fn2; + if (!home || !*home) return; + fn2 = (char *) malloc (strlen(home) + 40); + sprintf (fn2, "%s/.xscreensaver", home); + + if (debug_p) + fprintf (stderr, "%s: reading %s\n", blurb(), fn1); + parse_init_file (fn1, init_line_handler, ws); + + if (debug_p) + fprintf (stderr, "%s: reading %s\n", blurb(), fn2); + parse_init_file (fn2, init_line_handler, ws); + + if (verbose_p) + fprintf (stderr, "%s: theme: %s\n", blurb(), + (ws->dialog_theme ? ws->dialog_theme : "none")); +} + + +static void +grab_keyboard_and_mouse (window_state *ws) +{ + /* If we have been launched by xscreensaver, these grabs won't succeed, + and that is expected. But if we are being run manually for debugging, + they are necessary to avoid having events seen by two apps at once. + (We don't bother to ungrab, that happens when we exit.) + */ + Display *dpy = ws->dpy; + Window root = RootWindowOfScreen (ws->screen); + XGrabKeyboard (dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime); + XGrabPointer (dpy, root, True, + (ButtonPressMask | ButtonReleaseMask | + EnterWindowMask | LeaveWindowMask | + PointerMotionMask | PointerMotionHintMask | + Button1MotionMask | Button2MotionMask | + Button3MotionMask | Button4MotionMask | + Button5MotionMask | ButtonMotionMask), + GrabModeAsync, GrabModeAsync, root, + None, CurrentTime); +} + + +static void +get_keyboard_layout (window_state *ws) +{ +# ifdef HAVE_XKB + XkbStateRec state; + XkbDescPtr desc = 0; + Atom name = 0; + char *namestr = 0; + + if (! ws->xkb_opcode) + { + if (! XkbQueryExtension (ws->dpy, 0, &ws->xkb_opcode, 0, 0, 0)) + { + ws->xkb_opcode = -1; /* Only try once */ + if (verbose_p) + fprintf (stderr, "%s: XkbQueryExtension failed\n", blurb()); + return; + } + + if (! XkbSelectEvents (ws->dpy, XkbUseCoreKbd, + XkbMapNotifyMask | XkbStateNotifyMask, + XkbMapNotifyMask | XkbStateNotifyMask)) + { + if (verbose_p) + fprintf (stderr, "%s: XkbSelectEvents failed\n", blurb()); + } + } + + if (XkbGetState (ws->dpy, XkbUseCoreKbd, &state)) + { + if (verbose_p) + fprintf (stderr, "%s: XkbGetState failed\n", blurb()); + return; + } + desc = XkbGetKeyboard (ws->dpy, XkbAllComponentsMask, XkbUseCoreKbd); + if (!desc || !desc->names) + { + if (verbose_p) + fprintf (stderr, "%s: XkbGetKeyboard failed\n", blurb()); + goto DONE; + } + name = desc->names->groups[state.group]; + namestr = (name ? XGetAtomName (ws->dpy, name) : 0); + if (!namestr) + { + if (verbose_p) + fprintf (stderr, "%s: XkbGetKeyboard returned null layout\n", blurb()); + goto DONE; + } + + if (ws->kbd_layout_label) + free (ws->kbd_layout_label); + ws->kbd_layout_label = namestr; + + if (verbose_p) + fprintf (stderr, "%s: kbd layout: %s\n", blurb(), + namestr ? namestr : "null"); + + DONE: + if (desc) XFree (desc); +# endif /* HAVE_XKB */ +} + + +static double +double_time (void) +{ + struct timeval now; +# ifdef GETTIMEOFDAY_TWO_ARGS + struct timezone tzp; + gettimeofday(&now, &tzp); +# else + gettimeofday(&now); +# endif + + return (now.tv_sec + ((double) now.tv_usec * 0.000001)); +} + + +static void +create_window (window_state *ws, int w, int h) +{ + XSetWindowAttributes attrs; + unsigned long attrmask; + Window ow = ws->window; + + attrmask = CWOverrideRedirect | CWEventMask; + attrs.override_redirect = True; + attrs.event_mask = ExposureMask | VisibilityChangeMask; + ws->window = XCreateWindow (ws->dpy, + RootWindowOfScreen(ws->screen), + ws->x, ws->y, w, h, 0, + DefaultDepthOfScreen (ws->screen), + InputOutput, + DefaultVisualOfScreen(ws->screen), + attrmask, &attrs); + XSetWindowBackground (ws->dpy, ws->window, ws->background); + XSetWindowColormap (ws->dpy, ws->window, ws->cmap); + xscreensaver_set_wm_atoms (ws->dpy, ws->window, w, h, 0); + + if (ow) + { + XMapRaised (ws->dpy, ws->window); + XDestroyWindow (ws->dpy, ow); + } +} + + +/* Loads resources and creates and returns the global window state. + */ +static window_state * +window_init (Widget root_widget, Bool splash_p) +{ + Display *dpy = XtDisplay (root_widget); + Screen *screen = XtScreen (root_widget); + window_state *ws; + Bool resource_error_p = False; + + ws = (window_state *) calloc (1, sizeof(*ws)); + if (!ws) abort(); + + ws->splash_p = splash_p; + ws->dpy = dpy; + ws->screen = screen; + ws->app = XtWidgetToApplicationContext (root_widget); + + /* Read default theme from resources before the init file. */ + ws->dialog_theme = + get_string_resource (ws->dpy, "dialogTheme", "DialogTheme"); + if (!ws->dialog_theme || !*ws->dialog_theme) + ws->dialog_theme = strdup ("default"); + + /* Read theme from init file before any other resources. */ + read_init_file_simple (ws); + + { + struct passwd *p = getpwuid (getuid()); + if (!p || !p->pw_name || !*p->pw_name) abort(); + ws->user = p->pw_name; + } + + ws->cmap = XCreateColormap (dpy, RootWindowOfScreen (screen), /* Old skool */ + DefaultVisualOfScreen (screen), + AllocNone); + + ws->newlogin_cmd = get_str (ws, "newLoginCommand", "NewLoginCommand"); + ws->date_format = get_str (ws, "dateFormat", "DateFormat"); + ws->show_stars_p = + get_boolean_resource (ws->dpy, "passwd.asterisks", "Passwd.Boolean"); + + /* Put the version number in the label. */ + { + char *version = strdup (screensaver_id + 17); + char *year = strchr (version, '-'); + char *s = strchr (version, ' '); + *s = 0; + year = strchr (year+1, '-') + 1; + s = strchr (year, ')'); + *s = 0; + ws->heading_label = (char *) malloc (100); + ws->version = strdup(version); + sprintf (ws->heading_label, "XScreenSaver %.4s, v%.10s", year, version); + + if (splash_p) + { + ws->body_label = (char *) malloc (100); + sprintf (ws->body_label, + _("Copyright \xC2\xA9 1991-%.4s by\nJamie Zawinski "), + year); + } + } + + ws->heading_font = get_font (ws, "headingFont"); + ws->button_font = get_font (ws, "buttonFont"); + ws->body_font = get_font (ws, "bodyFont"); + ws->error_font = get_font (ws, "errorFont"); + ws->label_font = get_font (ws, "labelFont"); + ws->date_font = get_font (ws, "dateFont"); + ws->hostname_font = get_font (ws, "unameFont"); + + ws->foreground = get_color (ws, "foreground", "Foreground"); + ws->background = get_color (ws, "background", "Background"); + + get_xft_color (ws, &ws->xft_foreground, "foreground", "Foreground"); + get_xft_color (ws, &ws->xft_text_foreground, + "text.foreground", "Text.Foreground"); + get_xft_color (ws, &ws->xft_error_foreground, + "error.foreground", "Error.Foreground"); + get_xft_color (ws, &ws->xft_button_foreground, + "button.foreground", "Button.Foreground"); + + ws->shadow_top = get_color (ws, "topShadowColor", "Foreground"); + ws->shadow_bottom = get_color (ws, "bottomShadowColor", "Background"); + ws->border_color = get_color (ws, "borderColor", "BorderColor"); + ws->passwd_background = get_color (ws, "text.background", "Text.Background"); + ws->button_background = + get_color (ws, "button.background", "Button.Background"); + ws->thermo_foreground = + get_color (ws, "thermometer.foreground", "Thermometer.Foreground"); + ws->thermo_background = + get_color ( ws, "thermometer.background", "Thermometer.Background"); + ws->logo_background = get_color ( ws, "logo.background", "Logo.Background"); + + if (resource_error_p) + { + /* Make sure the error messages show up. */ + ws->foreground = BlackPixelOfScreen (screen); + ws->background = WhitePixelOfScreen (screen); + } + + ws->preferred_logo_width = get_int (ws, "logo.width", "Logo.Width"); + ws->preferred_logo_height = get_int (ws, "logo.height", "Logo.Height"); + ws->thermo_width = get_int (ws, "thermometer.width", "Thermometer.Width"); + ws->shadow_width = get_int (ws, "shadowWidth", "ShadowWidth"); + ws->border_width = get_int (ws, "borderWidth", "BorderWidth"); + ws->internal_padding = + get_int (ws, "internalPadding", "InternalPadding"); + + if (ws->preferred_logo_width == 0) ws->preferred_logo_width = 150; + if (ws->preferred_logo_height == 0) ws->preferred_logo_height = 150; + if (ws->internal_padding == 0) ws->internal_padding = 15; + if (ws->thermo_width == 0) ws->thermo_width = ws->shadow_width; + + if (ws->splash_p) ws->thermo_width = 0; + +# ifdef HAVE_UNAME + if (!splash_p && + get_boolean_resource (ws->dpy, "passwd.uname", "Passwd.Boolean")) + { + struct utsname uts; + if (!uname (&uts) && *uts.nodename) + ws->hostname_label = strdup (uts.nodename); + } +# endif + + get_keyboard_layout (ws); + + /* Load the logo pixmap, based on font size */ + { + int x, y; + unsigned int bw, d; + Window root = RootWindowOfScreen(ws->screen); + Visual *visual = DefaultVisualOfScreen (ws->screen); + int logo_size = (ws->heading_font->ascent > 24 ? 2 : 1); + ws->logo_pixmap = xscreensaver_logo (screen, visual, root, ws->cmap, + ws->background, + &ws->logo_pixels, &ws->logo_npixels, + &ws->logo_clipmask, logo_size); + if (!ws->logo_pixmap) abort(); + XGetGeometry (dpy, ws->logo_pixmap, &root, &x, &y, + &ws->logo_width, &ws->logo_height, &bw, &d); + } + + splash_pick_window_position (ws->dpy, &ws->cx, &ws->cy); + + ws->x = ws->y = 0; + create_window (ws, 1, 1); + + /* Select SubstructureNotifyMask on the root window so that we know + when another process has mapped a window, so that we can make our + window always be on top. */ + { + Window root = RootWindowOfScreen (ws->screen); + XWindowAttributes xgwa; + XGetWindowAttributes (ws->dpy, root, &xgwa); + XSelectInput (ws->dpy, root, + xgwa.your_event_mask | SubstructureNotifyMask); + } + + + ws->newlogin_button_state.cmd = ws->newlogin_cmd; + ws->demo_button_state.cmd = + get_string_resource (ws->dpy, "demoCommand", "Command"); + { + char *load = get_string_resource (ws->dpy, "loadURL", "Command"); + char *url = get_string_resource (ws->dpy, "helpURL", "URL"); + if (load && *load && url && *url) + { + char *cmd = (char *) malloc (strlen(load) + (strlen(url) * 5) + 10); + sprintf (cmd, load, url, url, url, url, url); + ws->help_button_state.cmd = cmd; + } + } + + ws->unlock_button_state.fn = unlock_cb; + + grab_keyboard_and_mouse (ws); + + return ws; +} + + +#ifdef DEBUG_STACKING +static void +describe_window (Display *dpy, Window w) +{ + XClassHint ch; + char *name = 0; + if (XGetClassHint (dpy, w, &ch)) + { + fprintf (stderr, "0x%lx \"%s\", \"%s\"\n", (unsigned long) w, + ch.res_class, ch.res_name); + XFree (ch.res_class); + XFree (ch.res_name); + } + else if (XFetchName (dpy, w, &name) && name) + { + fprintf (stderr, "0x%lx \"%s\"\n", (unsigned long) w, name); + XFree (name); + } + else + { + fprintf (stderr, "0x%lx (untitled)\n", (unsigned long) w); + } +} +#endif /* DEBUG_STACKING */ + + +/* Returns true if some other window is on top of this one. + */ +static Bool +window_occluded_p (Display *dpy, Window window) +{ + int screen; + +# ifdef DEBUG_STACKING + fprintf (stderr, "\n"); +# endif + + for (screen = 0; screen < ScreenCount (dpy); screen++) + { + int i; + Window root = RootWindow (dpy, screen); + Window root2 = 0, parent = 0, *kids = 0; + unsigned int nkids = 0; + Bool saw_our_window_p = False; + Bool saw_later_window_p = False; + if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) + { +# ifdef DEBUG_STACKING + fprintf (stderr, "%s: XQueryTree failed\n", blurb()); +# endif + continue; + } + + for (i = 0; i < nkids; i++) + { + if (kids[i] == window) + { + saw_our_window_p = True; +# ifdef DEBUG_STACKING + fprintf (stderr, "%s: our window: ", blurb()); + describe_window (dpy, kids[i]); +# endif + } + else if (saw_our_window_p) + { + saw_later_window_p = True; +# ifdef DEBUG_STACKING + fprintf (stderr, "%s: higher window: ", blurb()); + describe_window (dpy, kids[i]); +# endif + break; + } + else + { +# ifdef DEBUG_STACKING + fprintf (stderr, "%s: lower window: ", blurb()); + describe_window (dpy, kids[i]); +# endif + } + } + + if (kids) + XFree ((char *) kids); + + if (saw_later_window_p) + return True; + else if (saw_our_window_p) + return False; + /* else our window is not on this screen; keep going, try the next. */ + } + + /* Window doesn't exist? */ +# ifdef DEBUG_STACKING + fprintf (stderr, "%s: our window isn't on the screen\n", blurb()); +# endif + return False; +} + + +/* Strip leading and trailing whitespace. */ +static char * +trim (const char *s) +{ + char *s2; + int L; + if (!s) return 0; + while (*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n') + s++; + s2 = strdup (s); + L = strlen (s2); + while (L > 0 && + (s2[L-1] == ' ' || s2[L-1] == '\t' || + s2[L-1] == '\r' || s2[L-1] == '\n')) + s2[--L] = 0; + return s2; +} + + +/* Repaint the entire window. + */ +static void +window_draw (window_state *ws) +{ + Display *dpy = ws->dpy; + Screen *screen = DefaultScreenOfDisplay (dpy); + Window root = RootWindowOfScreen (screen); + Visual *visual = DefaultVisualOfScreen(screen); + int depth = DefaultDepthOfScreen (screen); + XWindowAttributes xgwa; + +# define MIN_COLUMNS 22 /* Set window width based on headingFont ascent. */ + + int ext_border = (ws->internal_padding / 2 + + ws->shadow_width + ws->border_width); + + Pixmap dbuf; + unsigned int logo_frame_width, logo_frame_height; + unsigned int window_width, window_height; + unsigned int text_left, text_right; + unsigned int thermo_x; + unsigned int x, y; + GC gc; + XGCValues gcv; + char date_text[100]; + time_t now = time ((time_t *) 0); + struct tm *tm = localtime (&now); + double ratio = 1 - ((double_time() - ws->start_time) / + (ws->end_time - ws->start_time)); + dialog_line *lines = + (dialog_line *) calloc (ws->nmsgs + 40, sizeof(*lines)); + Bool emitted_user_p = False; + int i = 0, j; + + XGetWindowAttributes (ws->dpy, ws->window, &xgwa); + + if (!lines) abort(); + + strftime (date_text, sizeof(date_text)-2, ws->date_format, tm); + + logo_frame_width = (ws->logo_width + ws->internal_padding * 2 + + ws->shadow_width * 2); + logo_frame_height = logo_frame_width; + if (logo_frame_width < ws->preferred_logo_width) + logo_frame_width = ws->preferred_logo_width; + if (logo_frame_height < ws->preferred_logo_height) + logo_frame_height = ws->preferred_logo_height; + + thermo_x = ext_border * 1.5 + logo_frame_width + ws->shadow_width; + text_left = (thermo_x + ws->internal_padding + + (ws->thermo_width + ? ws->thermo_width + ws->shadow_width * 3 + : 0)); + text_right = text_left + ws->heading_font->ascent * MIN_COLUMNS; + window_width = text_right + ws->internal_padding + ext_border; + window_height = window_width * 3; /* reduced later */ + + dbuf = XCreatePixmap (dpy, root, window_width, window_height, depth); + gc = XCreateGC (dpy, dbuf, 0, &gcv); + XSetForeground (dpy, gc, ws->background); + XFillRectangle (dpy, dbuf, gc, 0, 0, window_width, window_height); + + if (ws->xftdraw) + XftDrawDestroy (ws->xftdraw); + ws->xftdraw = XftDrawCreate (dpy, dbuf, visual, xgwa.colormap); + + lines[i].text = ws->heading_label; /* XScreenSaver */ + lines[i].font = ws->heading_font; + lines[i].fg = ws->xft_foreground; + lines[i].bg = ws->background; + lines[i].type = LABEL; + lines[i].align = CENTER; + i++; + + if (time ((time_t *) 0) - XSCREENSAVER_RELEASED > 60*60*24*30*17) + { + lines[i].text = _("Update available!\nThis version is very old.\n"); + lines[i].font = ws->error_font; + lines[i].fg = ws->xft_error_foreground; + lines[i].bg = ws->background; + lines[i].type = LABEL; + lines[i].align = CENTER; + i++; + } + else if (strstr (ws->version, "a") || + strstr (ws->version, "b")) + { + lines[i].text = _("PRE-RELEASE VERSION"); + lines[i].font = ws->error_font; + lines[i].fg = ws->xft_error_foreground; + lines[i].bg = ws->background; + lines[i].type = LABEL; + lines[i].align = CENTER; + i++; + } + + if (ws->hostname_label && *ws->hostname_label) + { + lines[i].text = ws->hostname_label; + lines[i].font = ws->hostname_font; + lines[i].fg = ws->xft_foreground; + lines[i].bg = ws->background; + lines[i].type = LABEL; + lines[i].align = CENTER; + i++; + } + +# define BLANK_LINE \ + lines[i].text = ""; \ + lines[i].font = ws->body_font; \ + lines[i].fg = ws->xft_foreground; \ + lines[i].bg = ws->background; \ + lines[i].type = LABEL; \ + lines[i].align = CENTER; \ + i++ + + BLANK_LINE; + + if (debug_p && !ws->splash_p) + { + lines[i].text = + _("DEBUG MODE:\nAll keystrokes are being logged to stderr.\n"); + lines[i].font = ws->error_font; + lines[i].fg = ws->xft_error_foreground; + lines[i].bg = ws->background; + lines[i].type = LABEL; + lines[i].align = CENTER; + i++; + } + + if (ws->body_label && *ws->body_label) + { + lines[i].text = ws->body_label; /* Copyright or error message */ + lines[i].font = ws->body_font; + lines[i].fg = ws->xft_foreground; + lines[i].bg = ws->background; + lines[i].type = LABEL; + lines[i].align = CENTER; + i++; + + BLANK_LINE; + } + + for (j = 0; j < ws->nmsgs; j++) /* PAM msgs */ + { + switch (ws->msgs[j].type) { + case AUTH_MSGTYPE_INFO: + case AUTH_MSGTYPE_ERROR: + lines[i].text = trim (ws->msgs[j].msg); + lines[i].font = (ws->msgs[j].type == AUTH_MSGTYPE_ERROR + ? ws->error_font + : ws->body_font); + lines[i].fg = (ws->msgs[j].type == AUTH_MSGTYPE_ERROR + ? ws->xft_error_foreground + : ws->xft_foreground); + lines[i].bg = ws->background; + lines[i].type = LABEL; + lines[i].align = CENTER; + i++; + break; + + case AUTH_MSGTYPE_PROMPT_NOECHO: + case AUTH_MSGTYPE_PROMPT_ECHO: + + /* Show the logged in user before the first password field. */ + if (!emitted_user_p) + { + lines[i].text = _("Username:"); + lines[i].font = ws->label_font; + lines[i].fg = ws->xft_foreground; + lines[i].bg = ws->background; + lines[i].type = LABEL; + lines[i].align = LEFT; + lines[i].float_p = True; + i++; + + lines[i].text = ws->user; /* $USER */ + lines[i].font = ws->label_font; + lines[i].fg = ws->xft_text_foreground; + lines[i].bg = ws->passwd_background; + lines[i].type = TEXT_RO; + lines[i].align = RIGHT; + i++; + } + + lines[i].text = trim (ws->msgs[j].msg); /* PAM prompt text */ + lines[i].font = ws->label_font; + lines[i].fg = ws->xft_foreground; + lines[i].bg = ws->background; + lines[i].type = LABEL; + lines[i].align = LEFT; + lines[i].float_p = True; + i++; + + lines[i].text = (ws->auth_state == AUTH_FINISHED + ? _("Checking...") : + ws->msgs[j].type == AUTH_MSGTYPE_PROMPT_ECHO + ? ws->plaintext_passwd /* Hopefully UTF-8 */ + : ws->show_stars_p + ? ws->censored_passwd + : ""); + lines[i].font = ws->label_font; + lines[i].fg = ws->xft_text_foreground; + lines[i].bg = ws->passwd_background; + lines[i].type = TEXT; + lines[i].align = RIGHT; + lines[i].i_beam = (ws->i_beam && ws->auth_state != AUTH_FINISHED); + i++; + + /* Show the current time below the first password field only. */ + if (*date_text && !emitted_user_p) + { + lines[i].text = date_text; + lines[i].font = ws->date_font; + lines[i].fg = ws->xft_foreground; + lines[i].bg = ws->background; + lines[i].type = LABEL; + lines[i].align = RIGHT; + i++; + } + + /* Show the current keyboard layout below that. */ + if (ws->kbd_layout_label && *ws->kbd_layout_label && !emitted_user_p) + { + lines[i].text = ws->kbd_layout_label; + lines[i].font = ws->date_font; + lines[i].fg = ws->xft_foreground; + lines[i].bg = ws->background; + lines[i].type = LABEL; + lines[i].align = RIGHT; + i++; + } + + emitted_user_p = True; + break; + + default: + abort(); + break; + } + } + + lines[i].text = 0; + y = draw_dialog_lines (ws, dbuf, lines, + text_left, text_right, + ws->border_width + ws->internal_padding + + ws->shadow_width); + window_height = y; + window_height += (ws->button_font->ascent * 4); + window_height += (ws->internal_padding + ws->shadow_width * 2 + + ws->border_width); + + + /* Keep logo area square or taller */ + if (window_height < logo_frame_height + ws->shadow_width * 4) + window_height = logo_frame_height + ws->shadow_width * 4; + + /* Fitt's Law: It is distracting to reduce the height of the window + after creation. */ + if (window_height < ws->min_height) + window_height = ws->min_height; + ws->min_height = window_height; + + + + /* Now do a second set of lines for the buttons at the bottom. */ + + memset (lines, 0, sizeof(*lines)); + i = 0; + + if (ws->splash_p) + { + lines[i].text = _("Settings"); + lines[i].font = ws->button_font; + lines[i].fg = ws->xft_button_foreground; + lines[i].bg = ws->button_background; + lines[i].type = BUTTON; + lines[i].align = LEFT; + lines[i].float_p = True; + lines[i].button = &ws->demo_button_state; + i++; + + lines[i].text = _("Help"); + lines[i].font = ws->button_font; + lines[i].fg = ws->xft_button_foreground; + lines[i].bg = ws->button_background; + lines[i].type = BUTTON; + lines[i].align = RIGHT; + lines[i].button = &ws->help_button_state; + i++; + } + else + { + if (ws->newlogin_cmd && *ws->newlogin_cmd) + { + lines[i].text = _("New Login"); + lines[i].font = ws->button_font; + lines[i].fg = ws->xft_button_foreground; + lines[i].bg = ws->button_background; + lines[i].type = BUTTON; + lines[i].align = LEFT; + lines[i].float_p = True; + lines[i].button = &ws->newlogin_button_state; + i++; + } + + lines[i].text = _("OK"); + lines[i].font = ws->button_font; + lines[i].fg = ws->xft_button_foreground; + lines[i].bg = ws->button_background; + lines[i].type = BUTTON; + lines[i].align = RIGHT; + lines[i].button = &ws->unlock_button_state; + i++; + } + + lines[i].text = 0; + y = draw_dialog_lines (ws, dbuf, lines, + text_left, text_right, + window_height - ws->internal_padding - + ext_border - + ws->shadow_width - + (ws->button_font->ascent * 2)); + + /* The thermometer */ + if (ws->thermo_width) + { + if (ws->auth_state != AUTH_NOTIFY) + { + int thermo_w = ws->thermo_width; + int thermo_h = window_height - ext_border * 2; + int thermo_h2 = thermo_h - ws->shadow_width * 2; + int thermo_h3 = thermo_h2 * (1.0 - ratio); + + XSetForeground (dpy, gc, ws->thermo_foreground); + XFillRectangle (dpy, dbuf, gc, + thermo_x + ws->shadow_width, + ext_border + ws->shadow_width, + thermo_w, thermo_h2); + if (thermo_h3 > 0) + { + XSetForeground (dpy, gc, ws->thermo_background); + XFillRectangle (dpy, dbuf, gc, + thermo_x + ws->shadow_width, + ext_border + ws->shadow_width, + thermo_w, thermo_h3); + } + } + + draw_shaded_rectangle (dpy, dbuf, + thermo_x, ext_border, + ws->thermo_width + ws->shadow_width * 2, + window_height - ext_border * 2, + ws->shadow_width, + ws->shadow_bottom, ws->shadow_top); + } + + /* The logo, centered vertically. + */ + { + int bot = window_height - ext_border * 2; + int xoff = (logo_frame_width - ws->logo_width) / 2; + int yoff = (bot - ws->logo_height) / 2; + x = ext_border; + y = ext_border; + XSetForeground (dpy, gc, ws->logo_background); + XFillRectangle (dpy, dbuf, gc, x, y, logo_frame_width, bot); + XSetForeground (dpy, gc, ws->foreground); + XSetBackground (dpy, gc, ws->background); + XSetClipMask (dpy, gc, ws->logo_clipmask); + XSetClipOrigin (dpy, gc, x + xoff, y + yoff); + XCopyArea (dpy, ws->logo_pixmap, dbuf, gc, 0, 0, + ws->logo_width, ws->logo_height, + x + xoff, y + yoff); + XSetClipMask (dpy, gc, 0); + draw_shaded_rectangle (dpy, dbuf, + x, y, + logo_frame_width, + bot, + ws->shadow_width, + ws->shadow_bottom, ws->shadow_top); + } + + /* The window's shadow */ + draw_shaded_rectangle (dpy, dbuf, + ws->border_width, ws->border_width, + window_width - ws->border_width * 2, + window_height - ws->border_width * 2, + ws->shadow_width, + ws->shadow_top, ws->shadow_bottom); + + /* The window's border */ + draw_shaded_rectangle (dpy, dbuf, + 0, 0, window_width, window_height, + ws->border_width, + ws->border_color, ws->border_color); + + + /* Now that everything has been rendered into the pixmap, reshape the window + and copy the pixmap to it. This double-buffering is to prevent flicker. + + You'd think we could just reshape the window and then XMapRaised, but no. + With the XCompose extension enabled and the "Mutter" window manager, the + dialog window was sometimes not appearing on the screen, despite the fact + that XQueryTree reported it as the topmost window. The mouse pointer also + reflected it being there, but it wasn't visible. This is probably related + to the "XCompositeGetOverlayWindow" window in some way, which is a magic, + invisible window that is secretly excluded from the list returned by + XQueryTree, but I can't figure out what was really going on, except that + XMapRaised did not make my OverrideRedirect window appear topmost on the + screen. + + However! Though XMapRaised was not working, it turns out that destroying + and re-creating the window *does* make it appear. So we do that, any time + the window's shape has changed, or some other window has raised above it. + + Calling XQueryTree at 30fps could conceivably be a performance problem, + if there are thousands of windows on the screen. But here we are. + */ + { + Bool size_changed_p, occluded_p; + + /* It's distracting to move or shrink the window after creating it. */ + if (xgwa.height > 100 && xgwa.height > window_height) + window_height = xgwa.height; + if (! ws->x) + { + ws->x = ws->cx - (window_width / 2); + ws->y = ws->cy - (window_height / 2); + } + + /* If there is any change to the window's size, or if the window is + not on top, destroy and re-create the window. */ + size_changed_p = !(xgwa.x == ws->x && + xgwa.y == ws->y && + xgwa.width == window_width && + xgwa.height == window_height); + occluded_p = (!size_changed_p && + window_occluded_p (ws->dpy, ws->window)); + + if (size_changed_p || occluded_p) + { +# if 0 /* Window sometimes disappears under Mutter 3.30.2, Feb 2021. */ + XWindowChanges wc; + wc.x = ws->x; + wc.y = ws->y; + wc.width = window_width; + wc.height = window_height; + if (verbose_p) + fprintf (stderr, "%s: reshaping window %dx%d+%d+%d\n", blurb(), + wc.width, wc.height, wc.x, wc.y); + XConfigureWindow (ws->dpy, ws->window, CWX|CWY|CWWidth|CWHeight, &wc); +# else + if (verbose_p) + fprintf (stderr, "%s: re-creating window: %s\n", blurb(), + size_changed_p ? "size changed" : "occluded"); + create_window (ws, window_width, window_height); +# endif + XMapRaised (ws->dpy, ws->window); + XInstallColormap (ws->dpy, ws->cmap); + } + } + + XFreeGC (dpy, gc); + gc = XCreateGC (dpy, ws->window, 0, &gcv); + XCopyArea (dpy, dbuf, ws->window, gc, 0, 0, + window_width, window_height, 0, 0); + XSync (dpy, False); + XFreeGC (dpy, gc); + XFreePixmap (dpy, dbuf); + free (lines); + + if (verbose_p > 1) + { + static time_t last = 0; + static int count = 0; + count++; + if (now > last) + { + double fps = count / (double) (now - last); + fprintf (stderr, "%s: FPS: %0.1f\n", blurb(), fps); + count = 0; + last = now; + } + } +} + + +/* Unmaps the window and frees window_state. + */ +static void +destroy_window (window_state *ws) +{ + XEvent event; + + memset (ws->plaintext_passwd, 0, sizeof(ws->plaintext_passwd)); + memset (ws->plaintext_passwd_char_size, 0, + sizeof(ws->plaintext_passwd_char_size)); + memset (ws->censored_passwd, 0, sizeof(ws->censored_passwd)); + + if (ws->timer) + { + XtRemoveTimeOut (ws->timer); + ws->timer = 0; + } + + if (ws->cursor_timer) + { + XtRemoveTimeOut (ws->cursor_timer); + ws->cursor_timer = 0; + } + + while (XCheckMaskEvent (ws->dpy, PointerMotionMask, &event)) + if (verbose_p) + fprintf (stderr, "%s: discarding MotionNotify event\n", blurb()); + + if (ws->window) + { + XDestroyWindow (ws->dpy, ws->window); + ws->window = 0; + } + + if (ws->heading_label) free (ws->heading_label); + if (ws->date_format) free (ws->date_format); + if (ws->hostname_label) free (ws->hostname_label); + if (ws->kbd_layout_label) free (ws->kbd_layout_label); + + if (ws->heading_font) XftFontClose (ws->dpy, ws->heading_font); + if (ws->body_font) XftFontClose (ws->dpy, ws->body_font); + if (ws->label_font) XftFontClose (ws->dpy, ws->label_font); + if (ws->date_font) XftFontClose (ws->dpy, ws->date_font); + if (ws->button_font) XftFontClose (ws->dpy, ws->button_font); + if (ws->hostname_font) XftFontClose (ws->dpy, ws->hostname_font); + + XftColorFree (ws->dpy, DefaultVisualOfScreen (ws->screen), + DefaultColormapOfScreen (ws->screen), + &ws->xft_foreground); + XftColorFree (ws->dpy, DefaultVisualOfScreen (ws->screen), + DefaultColormapOfScreen (ws->screen), + &ws->xft_button_foreground); + XftColorFree (ws->dpy, DefaultVisualOfScreen (ws->screen), + DefaultColormapOfScreen (ws->screen), + &ws->xft_text_foreground); + XftColorFree (ws->dpy, DefaultVisualOfScreen (ws->screen), + DefaultColormapOfScreen (ws->screen), + &ws->xft_error_foreground); + XftDrawDestroy (ws->xftdraw); + +# if 0 /* screw this, we're exiting anyway */ + if (ws->foreground != black && ws->foreground != white) + XFreeColors (ws->dpy, ws->cmap, &ws->foreground, 1, 0L); + if (ws->background != black && ws->background != white) + XFreeColors (ws->dpy, ws->cmap, &ws->background, 1, 0L); + if (ws->button_background != black && ws->button_background != white) + XFreeColors (ws->dpy, ws->cmap, &ws->button_background, 1, 0L); + if (ws->passwd_background != black && ws->passwd_background != white) + XFreeColors (ws->dpy, ws->cmap, &ws->passwd_background, 1, 0L); + if (ws->thermo_foreground != black && ws->thermo_foreground != white) + XFreeColors (ws->dpy, ws->cmap, &ws->thermo_foreground, 1, 0L); + if (ws->thermo_background != black && ws->thermo_background != white) + XFreeColors (ws->dpy, ws->cmap, &ws->thermo_background, 1, 0L); + if (ws->logo_background != black && ws->logo_background != white) + XFreeColors (ws->dpy, ws->cmap, &ws->logo_background, 1, 0L); + if (ws->shadow_top != black && ws->shadow_top != white) + XFreeColors (ws->dpy, ws->cmap, &ws->shadow_top, 1, 0L); + if (ws->shadow_bottom != black && ws->shadow_bottom != white) + XFreeColors (ws->dpy, ws->cmap, &ws->shadow_bottom, 1, 0L); +# endif + + if (ws->logo_pixmap) + XFreePixmap (ws->dpy, ws->logo_pixmap); + if (ws-> logo_clipmask) + XFreePixmap (ws->dpy, ws->logo_clipmask); + if (ws->logo_pixels) + { + if (ws->logo_npixels) + XFreeColors (ws->dpy, ws->cmap, ws->logo_pixels, ws->logo_npixels, 0L); + free (ws->logo_pixels); + ws->logo_pixels = 0; + ws->logo_npixels = 0; + } + + XSync (ws->dpy, False); + memset (ws, 0, sizeof(*ws)); + free (ws); + +} + + +static void +unlock_cb (window_state *ws) +{ + if (ws->auth_state == AUTH_READ) + ws->auth_state = AUTH_FINISHED; +} + + +/* We store the count and last time of authorization failures on a property + on the root window, so that on subsequent runs of this program that + succeed, we can warn the user that someone tried to log in and failed. + */ +static void +persistent_auth_status_failure (window_state *ws, + Bool increment_p, Bool clear_p, + int *count_ret, + time_t *time_ret) +{ + Display *dpy = ws->dpy; + Window w = RootWindow (dpy, 0); /* always screen 0 */ + Atom prop = XInternAtom (ws->dpy, LOCK_FAILURE_ATOM, False); + int count = 0; + time_t tt = 0; + + Atom type; + unsigned char *dataP = 0; + int format; + unsigned long nitems, bytesafter; + + if (increment_p && clear_p) abort(); + + /* Read the old property so that we can increment it. */ + if (XGetWindowProperty (dpy, w, prop, + 0, 999, False, XA_INTEGER, + &type, &format, &nitems, &bytesafter, + &dataP) + == Success + && type == XA_INTEGER + && nitems >= 2 + && dataP) + { + count = ((PROP32 *) dataP) [0]; + tt = ((PROP32 *) dataP) [1]; /* Y2038 bug: unsigned 32 bit time_t */ + if (verbose_p) + fprintf (stderr, "%s: previous auth failures: %d @ %lu\n", + blurb(), count, (unsigned long) tt); + } + + if (dataP) + XFree (dataP); + + if (clear_p) + { + XDeleteProperty (dpy, w, prop); + if (verbose_p) + fprintf (stderr, "%s: deleted auth failure property\n", blurb()); + } + else if (increment_p) + { + PROP32 vv[2]; + count++; + + /* Remember the time of the *oldest* failed login. A failed login + 5 seconds ago does not mean we should skip warning about a failed + login yesterday. + */ + if (tt <= 0) tt = time ((time_t *) 0); + + vv[0] = (PROP32) count; + vv[1] = (PROP32) tt; + XChangeProperty (dpy, w, prop, XA_INTEGER, 32, + PropModeReplace, (unsigned char *) vv, 2); + if (verbose_p) + fprintf (stderr, "%s: saved auth failure: %d @ %lu\n", + blurb(), count, (unsigned long) tt); + } + + if (count_ret) *count_ret = count; + if (time_ret) *time_ret = tt; +} + + + +static void +handle_keypress (window_state *ws, XKeyEvent *event) +{ + unsigned char decoded [MAX_BYTES_PER_CHAR * 10]; /* leave some slack */ + KeySym keysym = 0; + + /* XLookupString may return more than one character via XRebindKeysym; + and on some systems it returns multi-byte UTF-8 characters (contrary + to its documentation, which says it returns only Latin1.) + + It seems to only do so, however, if setlocale() has been called. + See the code inside ENABLE_NLS in xscreensaver-auth.c. + + The X Keyboard Extension X11R6.4 documentation says: "When Xkb is + present, XLookupString is allowed, but not required, to return strings + in character sets other than ISO Latin-1, depending on the current + locale." So I guess that means that multi-byte strings returned by + XLookupString might not be UTF-8, and thus might not be compatible + with XftDrawStringUtf8. + */ + int decoded_size = XLookupString (event, (char *)decoded, sizeof(decoded), + &keysym, &ws->compose_status); + + if (decoded_size > MAX_BYTES_PER_CHAR) + { + /* The multi-byte character returned is too large. */ + XBell (ws->dpy, 0); + return; + } + + decoded[decoded_size] = 0; + + /* Add 10% to the time remaining every time a key is pressed, but don't + go past the max duration. */ + { + time_t now = time ((time_t *) 0); + int max = get_seconds_resource (ws->dpy, "passwdTimeout", "Time"); + int remain = ws->end_time - now; + remain *= 1.1; + if (remain > max) remain = max; + if (remain < 3) remain = 3; + ws->end_time = now + remain; + } + + + if (decoded_size == 1) /* Handle single-char commands */ + { + switch (*decoded) + { + case '\010': case '\177': /* Backspace */ + { + /* kludgey way to get the number of "logical" characters. */ + int nchars = strlen (ws->plaintext_passwd_char_size); + int nbytes = strlen (ws->plaintext_passwd); + if (nbytes <= 0) + XBell (ws->dpy, 0); + else + { + int i; + for (i = ws->plaintext_passwd_char_size[nchars-1]; i >= 0; i--) + { + if (nbytes < 0) abort(); + ws->plaintext_passwd[nbytes--] = 0; + } + ws->plaintext_passwd_char_size[nchars-1] = 0; + } + } + break; + + case '\012': case '\015': /* Enter */ + unlock_cb (ws); + break; + + case '\033': /* Escape */ + ws->auth_state = AUTH_CANCEL; + break; + + case '\025': case '\030': /* Erase line */ + memset (ws->plaintext_passwd, 0, sizeof (ws->plaintext_passwd)); + memset (ws->plaintext_passwd_char_size, 0, + sizeof (ws->plaintext_passwd_char_size)); + break; + + default: + if (*decoded < ' ' && *decoded != '\t') /* Other ctrl char */ + XBell (ws->dpy, 0); + else + goto SELF_INSERT; + break; + } + } + else + { + int nbytes, nchars; + SELF_INSERT: + nbytes = strlen (ws->plaintext_passwd); + nchars = strlen (ws->plaintext_passwd_char_size); + if (nchars + 1 >= sizeof (ws->plaintext_passwd_char_size)-1 || + nbytes + decoded_size >= sizeof (ws->plaintext_passwd)-1) + XBell (ws->dpy, 0); /* overflow */ + else if (decoded_size == 0) + ; /* Non-inserting keysym (Shift, Ctrl) */ + else + { + ws->plaintext_passwd_char_size[nchars] = decoded_size; + ws->plaintext_passwd_char_size[nchars+1] = 0; + memcpy (ws->plaintext_passwd + nbytes, decoded, decoded_size); + ws->plaintext_passwd[nbytes + decoded_size] = 0; + } + } + + /* Construct the string of asterisks. */ + { + char *out = ws->censored_passwd; + int i; + *out = 0; + for (i = 0; i < MAX_PASSWD_CHARS && ws->plaintext_passwd_char_size[i]; i++) + { + const char *b = /* "\xE2\x80\xA2"; */ /* U+2022 Bullet */ + "\xe2\x97\x8f"; /* U+25CF Black Circle */ + strcat (out, b); + out += strlen(out); + } + } +} + + +static Bool +handle_button (window_state *ws, XEvent *xev, line_button_state *bs) +{ + Bool mouse_in_box = + (xev->xbutton.x_root >= (ws->x + bs->rect.x) && + xev->xbutton.x_root < (ws->x + bs->rect.x + bs->rect.width) && + xev->xbutton.y_root >= (ws->y + bs->rect.y) && + xev->xbutton.y_root < (ws->y + bs->rect.y + bs->rect.height)); + + bs->down_p = (!bs->disabled_p && + mouse_in_box && + xev->xany.type != ButtonRelease); + + if (xev->xany.type == ButtonRelease && mouse_in_box && !bs->disabled_p) + { + bs->disabled_p = True; /* Only allow them to press the button once. */ + if (bs->fn) + bs->fn (ws); + else if (bs->cmd) + { + int ac = 0; + char *av[10]; + av[ac++] = "/bin/sh"; + av[ac++] = "-c"; + av[ac++] = bs->cmd; + av[ac] = 0; + fork_and_exec (ws->dpy, ac, av); + } + else + XBell (ws->dpy, 0); + } + return mouse_in_box; +} + + +static Bool +handle_event (window_state *ws, XEvent *xev) +{ + Bool refresh_p = False; + switch (xev->xany.type) { + case KeyPress: + if (ws->splash_p) + ws->auth_state = AUTH_CANCEL; + else + { + handle_keypress (ws, &xev->xkey); + ws->caps_p = (xev->xkey.state & LockMask); + if (ws->auth_state == AUTH_NOTIFY) + ws->auth_state = AUTH_CANCEL; + } + refresh_p = True; + break; + + case ButtonPress: + case ButtonRelease: + { + if (! (handle_button (ws, xev, &ws->newlogin_button_state) || + handle_button (ws, xev, &ws->unlock_button_state) || + handle_button (ws, xev, &ws->demo_button_state) || + handle_button (ws, xev, &ws->help_button_state))) + if (ws->splash_p && xev->xany.type == ButtonRelease) + ws->auth_state = AUTH_CANCEL; + refresh_p = True; + } + default: + break; + } + return refresh_p; +} + + +/* Blink the I-beam cursor. */ +static void +cursor_timer (XtPointer closure, XtIntervalId *id) +{ + window_state *ws = (window_state *) closure; + int timeout = 0.7 * 1000 * (ws->i_beam ? 0.25 : 0.75); + if (ws->cursor_timer) + XtRemoveTimeOut (ws->cursor_timer); + ws->cursor_timer = + XtAppAddTimeOut (ws->app, timeout, cursor_timer, (XtPointer) ws); + ws->i_beam = !ws->i_beam; +} + + +/* Redraw the window for the thermometer, and exit if the time has expired. + */ +static void +thermo_timer (XtPointer closure, XtIntervalId *id) +{ + window_state *ws = (window_state *) closure; + int timeout = 1000/30; /* FPS */ + double now = double_time(); + if (now >= ws->end_time) + ws->auth_state = AUTH_TIME; + if (ws->timer) XtRemoveTimeOut (ws->timer); + ws->timer = XtAppAddTimeOut (ws->app, timeout, thermo_timer, (XtPointer) ws); +} + + +static void +gui_main_loop (window_state *ws, Bool splash_p, Bool notification_p) +{ + int timeout; + Bool refresh_p = True; + + if (splash_p) + { + timeout = get_seconds_resource (ws->dpy, "splashDuration", "Time"); + if (timeout <= 1) timeout = 1; + } + else if (ws->auth_state == AUTH_NOTIFY) + timeout = 5; + else + { + timeout = get_seconds_resource (ws->dpy, "passwdTimeout", "Time"); + if (timeout <= 5) timeout = 5; + cursor_timer (ws, 0); + } + + ws->start_time = double_time(); + ws->end_time = ws->start_time + timeout; + + /* Since the "xscreensaver" process holds the mouse and keyboard grabbed + while "xscreensaver-auth" is running, we don't receive normal KeyPress + events. That means that the XInput2 extension is required in order to + snoop on the keyboard in a way that bypasses grabs. + */ + if (! ws->xi_opcode) + { + Bool ov = verbose_p; + verbose_p = False; + init_xinput (ws->dpy, &ws->xi_opcode); + verbose_p = ov; + } + + thermo_timer (ws, 0); + window_draw (ws); + + while (ws->auth_state == AUTH_READ || + ws->auth_state == AUTH_NOTIFY) + { + XEvent xev; + XtInputMask m = XtAppPending (ws->app); + + if (m & XtIMXEvent) + /* Process timers then block on an X event (which we know is there) */ + XtAppNextEvent (ws->app, &xev); + else + { + if (m) + /* Process timers only, don't block */ + XtAppProcessEvent (ws->app, m); + else + { + if (refresh_p) + { + /* Redraw when outstanding events have been processed. */ + window_draw (ws); + refresh_p = False; + } + + /* No way to say "block until timer *or* X pending". + Without this, the timer that changes auth_state will fire but + then we will still be blocked until the next X event. */ + usleep (1000000/30); + } + continue; + } + + if ((m & ~XtIMXEvent) && !ws->splash_p) + refresh_p = True; /* In auth mode, all timers refresh */ + + if (verbose_p || debug_p) + print_xinput_event (ws->dpy, &xev, ""); + + /* Convert XInput events to Xlib events, for simplicity and familiarity. + */ + if (xev.xcookie.type == GenericEvent && + xev.xcookie.extension == ws->xi_opcode && + (xev.xcookie.data || XGetEventData (ws->dpy, &xev.xcookie))) + { + XEvent ev2; + Bool ok = + xinput_event_to_xlib (xev.xcookie.evtype, xev.xcookie.data, &ev2); + XFreeEventData (ws->dpy, &xev.xcookie); + if (ok) + xev = ev2; + } + + if (handle_event (ws, &xev)) + refresh_p = True; + + XtDispatchEvent (&xev); + + switch (xev.xany.type) { + + /* I don't think we ever receive these, but if we do, redraw. */ + case Expose: case GraphicsExpose: + refresh_p = True; + break; + + /* Likewise, receiving this event would be ideal, but we don't. */ + case VisibilityNotify: + refresh_p = True; + if (verbose_p > 1) + fprintf (stderr, "%s: VisibilityNotify\n", blurb()); + break; + + /* When another override-redirect window is raised above us, + we receive several ConfigureNotify events on the root window. */ + case ConfigureNotify: + if (verbose_p > 1) + fprintf (stderr, "%s: ConfigureNotify\n", blurb()); + break; + + case MappingNotify: + /* This event is supposed to be sent when the keymap is changed. + You would think that typing XK_ISO_Next_Group to change the + keyboard layout would count as such. It does not. */ + if (verbose_p) + fprintf (stderr, "%s: MappingNotify\n", blurb()); + get_keyboard_layout (ws); + refresh_p = True; + break; + + default: + break; + } + + /* Since MappingNotify doesn't work, we have to do this crap instead. */ + if (xev.xany.type == ws->xkb_opcode) + { + XkbEvent *xkb = (XkbEvent *) &xev; + if (verbose_p) + fprintf (stderr, "%s: XKB event %d\n", blurb(), xkb->any.xkb_type); + get_keyboard_layout (ws); + refresh_p = True; + } + } + + /* Re-raw the window one last time, since it might sit here for a while + while PAM does it's thing. */ + window_draw (ws); + XSync (ws->dpy, False); + + if (verbose_p) { + const char *kind = (splash_p ? "splash" : + notification_p ? "notification" : "authentication"); + switch (ws->auth_state) { + case AUTH_FINISHED: + fprintf (stderr, "%s: %s input finished\n", blurb(), kind); break; + case AUTH_CANCEL: + fprintf (stderr, "%s: %s canceled\n", blurb(), kind); break; + case AUTH_TIME: + fprintf (stderr, "%s: %s timed out\n", blurb(), kind); break; + default: break; + } + } +} + + +/* Pops up a dialog and waits for the user to complete it. + Returns 0 on successful completion. + Updates 'resp' with any entered response. + */ +static Bool +dialog_session (window_state *ws, + int nmsgs, + const auth_message *msgs, + auth_response *resp) +{ + int i; + + ws->auth_state = AUTH_READ; + ws->nmsgs = nmsgs; + ws->msgs = msgs; + + memset (ws->plaintext_passwd, 0, sizeof(ws->plaintext_passwd)); + memset (ws->plaintext_passwd_char_size, 0, + sizeof(ws->plaintext_passwd_char_size)); + memset (ws->censored_passwd, 0, sizeof(ws->censored_passwd)); + ws->unlock_button_state.disabled_p = False; + + gui_main_loop (ws, False, False); + + if (ws->auth_state != AUTH_FINISHED) + return True; /* Timed out or canceled */ + + /* Find the (at most one) input field in the previous batch and return + the entered plaintext to it. */ + for (i = 0; i < nmsgs; i++) + { + if (msgs[i].type == AUTH_MSGTYPE_PROMPT_ECHO || + msgs[i].type == AUTH_MSGTYPE_PROMPT_NOECHO) + { + if (resp[i].response) abort(); + resp[i].response = strdup(ws->plaintext_passwd); + } + } + + ws->nmsgs = 0; + ws->msgs = 0; + + return False; +} + + +/* To retain this across multiple calls from PAM to xscreensaver_auth_conv. */ +window_state *global_ws = 0; + + +/* The authentication conversation function. + + Like a PAM conversation function, this accepts multiple messages in a + single round. We can only do one text entry field in the dialog at a + time, so if there is more than one entry, multiple dialogs will be used. + + PAM might call this multiple times before authenticating. We are unable + to combine multiple messages onto a single dialog if PAM splits them + between calls to this function. + + Returns True on success. If the user timed out or cancelled, we just exit. + */ +Bool +xscreensaver_auth_conv (void *closure, + int nmsgs, + const auth_message *msgs, + auth_response **resp) +{ + Widget root_widget = (Widget) closure; + int i; + int prev_msg = 0; + int field_count = 0; + auth_response *responses; + window_state *ws = global_ws; + + if (!ws) + ws = global_ws = window_init (root_widget, False); + + responses = calloc (nmsgs, sizeof(*responses)); + if (!responses) abort(); + + for (i = 0; i < nmsgs; i++) + { + if (msgs[i].type == AUTH_MSGTYPE_PROMPT_ECHO || + msgs[i].type == AUTH_MSGTYPE_PROMPT_NOECHO) + { + /* A text input field. */ + + if (field_count > 0) + { + /* This is the second one -- we must run the dialog on + the field collected so far. */ + if (dialog_session (ws, + i - prev_msg, + msgs + prev_msg, + responses + prev_msg)) + goto END; + prev_msg = i; + field_count = 0; + } + + field_count++; + } + } + + if (prev_msg < i || nmsgs == 0) + /* Run the dialog on the stuff that's left. This happens if there was + more than one text field. */ + dialog_session (ws, + i - prev_msg, + msgs + prev_msg, + responses + prev_msg); + + END: + + switch (ws->auth_state) { + case AUTH_CANCEL: + case AUTH_TIME: + /* No need to return to PAM or clean up. We're outta here! + Exit with 0 to distinguish it from our "success" or "failure" + exit codes. */ + destroy_window (ws); + exit (0); + break; + case AUTH_FINISHED: + *resp = responses; + return True; + default: + abort(); + break; + } +} + + +/* Called after authentication is complete so that we can present a "nope" + dialog if it failed, or snitch on previous failed login attempts. + */ +void +xscreensaver_auth_finished (void *closure, Bool authenticated_p) +{ + Widget root_widget = (Widget) closure; + window_state *ws = global_ws; + char msg[1024]; + int unlock_failures = 0; + time_t failure_time = 0; + Bool prompted_p = !!ws; + + /* If this was called without xscreensaver_auth_conv() ever having been + called, then either PAM decided that the user is authenticated without + a prompt (e.g. a bluetooth fob); or there was an error initializing + passwords (e.g., shadow passwords but not setuid.) + */ + if (!ws) + ws = global_ws = window_init (root_widget, False); + + if (authenticated_p) + { + /* Read the old failure count, and delete it. */ + persistent_auth_status_failure (ws, False, True, + &unlock_failures, &failure_time); + } + else + { + /* Increment the failure count. */ + persistent_auth_status_failure (ws, True, False, + &unlock_failures, &failure_time); + } + + /* If we have something to say, put the dialog back up for a few seconds + to display it. Otherwise, don't bother. + */ + if (!authenticated_p && !prompted_p) + strcpy (msg, _("Password initialization failed")); + else if (!authenticated_p && ws && ws->caps_p) + strcpy (msg, _("Authentication failed (Caps Lock?)")); + else if (!authenticated_p) + strcpy (msg, _("Authentication failed!")); + else if (authenticated_p && unlock_failures > 0) + { + time_t now = time ((time_t *) 0); + int sec = now - failure_time; + int min = (sec + 30) / 60; + int hours = (min + 30) / 60; + int days = (hours + 12) / 24; + char ago[100]; + int warning_slack = + get_integer_resource (ws->dpy, "authWarningSlack", "AuthWarningSlack"); + + if (sec < warning_slack) + { + if (verbose_p) + fprintf (stderr, "%s: ignoring recent unlock failures:" + " %d within %d sec\n", + blurb(), unlock_failures, warning_slack); + goto END; + } + else if (days > 1) sprintf (ago, _("%d days ago"), days); + else if (hours > 1) sprintf (ago, _("%d hours ago"), hours); + else if (min > 1) sprintf (ago, _("%d minutes ago"), min); + else sprintf (ago, _("just now")); + + if (unlock_failures == 1) + sprintf (msg, _("There has been 1 failed login attempt, %s."), ago); + else + sprintf (msg, + _("There have been %d failed login attempts, oldest %s."), + unlock_failures, ago); + } + else + { + /* No need to pop up a window. Authenticated, and there are no previous + failures to report. + */ + goto END; + } + + if (!*msg) abort(); + ws->body_label = strdup (msg); + + ws->auth_state = AUTH_NOTIFY; + gui_main_loop (ws, False, True); + + END: + destroy_window (global_ws); +} + + +void +xscreensaver_splash (void *closure) +{ + Widget root_widget = (Widget) closure; + window_state *ws = window_init (root_widget, True); + ws->auth_state = AUTH_READ; + gui_main_loop (ws, True, False); + destroy_window (ws); + exit (0); +} diff --git a/driver/dpms.c b/driver/dpms.c index a0dd7b87..15721eae 100644 --- a/driver/dpms.c +++ b/driver/dpms.c @@ -1,5 +1,5 @@ -/* dpms.c --- syncing the X Display Power Management values - * xscreensaver, Copyright (c) 2001-2017 Jamie Zawinski +/* dpms.c --- syncing the X Display Power Management System values + * xscreensaver, Copyright © 2001-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -10,81 +10,33 @@ * implied warranty. */ -/* Display Power Management System (DPMS.) - - On XFree86 systems, "man xset" reports: - - -dpms The -dpms option disables DPMS (Energy Star) features. - +dpms The +dpms option enables DPMS (Energy Star) features. - - dpms flags... - The dpms option allows the DPMS (Energy Star) - parameters to be set. The option can take up to three - numerical values, or the `force' flag followed by a - DPMS state. The `force' flags forces the server to - immediately switch to the DPMS state specified. The - DPMS state can be one of `standby', `suspend', or - `off'. When numerical values are given, they set the - inactivity period before the three modes are activated. - The first value given is for the `standby' mode, the - second is for the `suspend' mode, and the third is for - the `off' mode. Setting these values implicitly - enables the DPMS features. A value of zero disables a - particular mode. - - However, note that the implementation is more than a little bogus, - in that there is code in /usr/X11R6/lib/libXdpms.a to implement all - the usual server-extension-querying utilities -- but there are no - prototypes in any header file! Thus, the prototypes here. (The - stuff in X11/extensions/dpms.h and X11/extensions/dpmsstr.h define - the raw X protcol, they don't define the API to libXdpms.a.) - - Some documentation: - Library: ftp://ftp.x.org/pub/R6.4/xc/doc/specs/Xext/DPMSLib.ms - Protocol: ftp://ftp.x.org/pub/R6.4/xc/doc/specs/Xext/DPMS.ms - */ - #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include +#include -#ifdef HAVE_DPMS_EXTENSION /* almost the whole file */ +#include "xscreensaver.h" -# include -# include -/*# include */ +#ifndef HAVE_DPMS_EXTENSION /* almost the whole file */ - /* Why this crap is not in a header file somewhere, I have no idea. Losers! - */ - extern Bool DPMSQueryExtension (Display *, int *event_ret, int *err_ret); - extern Status DPMSGetVersion (Display *, int *major_ret, int *minor_ret); - extern Bool DPMSCapable (Display *); - extern Status DPMSInfo (Display *, CARD16 *power_level, BOOL *state); - extern Status DPMSEnable (Display *dpy); - extern Status DPMSDisable (Display *dpy); - extern Status DPMSForceLevel (Display *, CARD16 level); - extern Status DPMSSetTimeouts (Display *, CARD16 standby, CARD16 suspend, - CARD16 off); - extern Bool DPMSGetTimeouts (Display *, CARD16 *standby, - CARD16 *suspend, CARD16 *off); - -#endif /* HAVE_DPMS_EXTENSION */ - - -/* This file doesn't need the Xt headers, so stub these types out... */ -#undef XtPointer -#define XtAppContext void* -#define XrmDatabase void* -#define XtIntervalId void* -#define XtPointer void* -#define Widget void* +void +sync_server_dpms_settings (Display *dpy, struct saver_preferences *p) +{ + if (p->verbose_p) + fprintf (stderr, "%s: DPMS not supported at compile time\n", blurb()); +} -#include "xscreensaver.h" +Bool monitor_powered_on_p (Display *dpy) { return True; } +void monitor_power_on (saver_info *si, Bool on_p) { return; } + +#else /* HAVE_DPMS_EXTENSION -- whole file */ + +# include +# include -#ifdef HAVE_DPMS_EXTENSION static Bool error_handler_hit_p = False; @@ -97,9 +49,7 @@ ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) void -sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p, - int standby_secs, int suspend_secs, int off_secs, - Bool verbose_p) +sync_server_dpms_settings (Display *dpy, struct saver_preferences *p) { int event = 0, error = 0; BOOL o_enabled = False; @@ -107,11 +57,29 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p, CARD16 o_standby = 0, o_suspend = 0, o_off = 0; Bool bogus_p = False; + Bool enabled_p = (p->dpms_enabled_p && p->mode != DONT_BLANK); + Bool dpms_quickoff_p = p->dpms_quickoff_p; + int standby_secs = p->dpms_standby / 1000; + int suspend_secs = p->dpms_suspend / 1000; + int off_secs = p->dpms_off / 1000; + Bool verbose_p = p->verbose_p; + static Bool warned_p = False; + + /* If the monitor is currently powered off, defer any changes until + we are next called while it is powered on. */ + if (! monitor_powered_on_p (dpy)) + return; + + /* Why did I do this? It makes DPMS never happen. + XSetScreenSaver (dpy, 0, 0, 0, 0); + XForceScreenSaver (dpy, ScreenSaverReset); + */ + if (dpms_quickoff_p && !off_secs) - { - /* To do this, we might need to temporarily re-enable DPMS first. */ - off_secs = 0xFFFF; - } + { + /* To do this, we might need to temporarily re-enable DPMS first. */ + off_secs = 0xFFFF; + } if (standby_secs == 0 && suspend_secs == 0 && off_secs == 0) /* all zero implies "DPMS disabled" */ @@ -134,22 +102,25 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p, if (! DPMSQueryExtension (dpy, &event, &error)) { - if (verbose_p) - fprintf (stderr, "%s: XDPMS extension not supported.\n", blurb()); + if (verbose_p && !warned_p) + fprintf (stderr, "%s: XDPMS extension not supported\n", blurb()); + warned_p = True; return; } if (! DPMSCapable (dpy)) { - if (verbose_p) - fprintf (stderr, "%s: DPMS not supported.\n", blurb()); + if (verbose_p && !warned_p) + fprintf (stderr, "%s: DPMS not supported\n", blurb()); + warned_p = True; return; } if (! DPMSInfo (dpy, &o_power, &o_enabled)) { - if (verbose_p) - fprintf (stderr, "%s: unable to get DPMS state.\n", blurb()); + if (verbose_p && !warned_p) + fprintf (stderr, "%s: unable to get DPMS state\n", blurb()); + warned_p = True; return; } @@ -157,19 +128,20 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p, { if (! (enabled_p ? DPMSEnable (dpy) : DPMSDisable (dpy))) { - if (verbose_p) - fprintf (stderr, "%s: unable to set DPMS state.\n", blurb()); + if (verbose_p && !warned_p) + fprintf (stderr, "%s: unable to set DPMS state\n", blurb()); + warned_p = True; return; } else if (verbose_p) - fprintf (stderr, "%s: turned DPMS %s.\n", blurb(), + fprintf (stderr, "%s: turned DPMS %s\n", blurb(), enabled_p ? "on" : "off"); } if (bogus_p) { if (verbose_p) - fprintf (stderr, "%s: not setting bogus DPMS timeouts: %d %d %d.\n", + fprintf (stderr, "%s: not setting bogus DPMS timeouts: %d %d %d\n", blurb(), standby_secs, suspend_secs, off_secs); return; } @@ -177,7 +149,7 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p, if (!DPMSGetTimeouts (dpy, &o_standby, &o_suspend, &o_off)) { if (verbose_p) - fprintf (stderr, "%s: unable to get DPMS timeouts.\n", blurb()); + fprintf (stderr, "%s: unable to get DPMS timeouts\n", blurb()); return; } @@ -188,34 +160,34 @@ sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p, if (!DPMSSetTimeouts (dpy, standby_secs, suspend_secs, off_secs)) { if (verbose_p) - fprintf (stderr, "%s: unable to set DPMS timeouts.\n", blurb()); + fprintf (stderr, "%s: unable to set DPMS timeouts\n", blurb()); return; } else if (verbose_p) - fprintf (stderr, "%s: set DPMS timeouts: %d %d %d.\n", blurb(), + fprintf (stderr, "%s: set DPMS timeouts: %d %d %d\n", blurb(), standby_secs, suspend_secs, off_secs); } } Bool -monitor_powered_on_p (saver_info *si) +monitor_powered_on_p (Display *dpy) { Bool result; int event_number, error_number; BOOL onoff = False; CARD16 state; - if (!DPMSQueryExtension(si->dpy, &event_number, &error_number)) + if (!DPMSQueryExtension(dpy, &event_number, &error_number)) /* Server doesn't know -- assume the monitor is on. */ result = True; - else if (!DPMSCapable(si->dpy)) + else if (!DPMSCapable(dpy)) /* Server says the monitor doesn't do power management -- so it's on. */ result = True; else { - DPMSInfo(si->dpy, &state, &onoff); + DPMSInfo(dpy, &state, &onoff); if (!onoff) /* Server says DPMS is disabled -- so the monitor is on. */ result = True; @@ -235,17 +207,19 @@ monitor_powered_on_p (saver_info *si) void monitor_power_on (saver_info *si, Bool on_p) { - if ((!!on_p) != monitor_powered_on_p (si)) + if ((!!on_p) != monitor_powered_on_p (si->dpy)) { XErrorHandler old_handler; int event_number, error_number; + static Bool warned_p = False; if (!DPMSQueryExtension(si->dpy, &event_number, &error_number) || !DPMSCapable(si->dpy)) { - if (si->prefs.verbose_p) + if (si->prefs.verbose_p && !warned_p) fprintf (stderr, - "%s: unable to power %s monitor: no DPMS extension.\n", + "%s: unable to power %s monitor: no DPMS extension\n", blurb(), (on_p ? "on" : "off")); + warned_p = True; return; } @@ -269,36 +243,12 @@ monitor_power_on (saver_info *si, Bool on_p) XSetErrorHandler (old_handler); /* Ignore error_handler_hit_p, just probe monitor instead */ - if ((!!on_p) != monitor_powered_on_p (si)) /* double-check */ + if ((!!on_p) != monitor_powered_on_p (si->dpy)) /* double-check */ fprintf (stderr, - "%s: DPMSForceLevel(dpy, %s) did not change monitor power state.\n", + "%s: DPMSForceLevel(dpy, %s) did not change monitor power state\n", blurb(), (on_p ? "DPMSModeOn" : "DPMSModeOff")); } } -#else /* !HAVE_DPMS_EXTENSION */ - -void -sync_server_dpms_settings (Display *dpy, Bool enabled_p, - Bool dpms_quickoff_p, - int standby_secs, int suspend_secs, int off_secs, - Bool verbose_p) -{ - if (verbose_p) - fprintf (stderr, "%s: DPMS support not compiled in.\n", blurb()); -} - -Bool -monitor_powered_on_p (saver_info *si) -{ - return True; -} - -void -monitor_power_on (saver_info *si, Bool on_p) -{ - return; -} - -#endif /* !HAVE_DPMS_EXTENSION */ +#endif /* HAVE_DPMS_EXTENSION -- whole file */ diff --git a/driver/exec.c b/driver/exec.c index 38ca88a0..8d1c45ae 100644 --- a/driver/exec.c +++ b/driver/exec.c @@ -1,5 +1,5 @@ /* exec.c --- executes a program in *this* pid, without an intervening process. - * xscreensaver, Copyright (c) 1991-2013 Jamie Zawinski + * xscreensaver, Copyright © 1991-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -69,14 +69,6 @@ /* and also setrlimit() and RLIMIT_AS */ #endif -#ifdef VMS -# include -# include /* for close */ -# include /* for getpid */ -# define pid_t int -# define fork vfork -#endif /* VMS */ - #include "exec.h" extern const char *blurb (void); @@ -84,8 +76,6 @@ extern const char *blurb (void); static void nice_process (int nice_level); -#ifndef VMS - static void exec_simple_command (const char *command) { @@ -161,26 +151,12 @@ exec_complex_command (const char *shell, const char *command) execvp (av[0], av); /* shouldn't return. */ } -#else /* VMS */ - -static void -exec_vms_command (const char *command) -{ - system (command); - fflush (stderr); - fflush (stdout); - exit (1); /* Note that this only exits a child fork. */ -} - -#endif /* !VMS */ - void exec_command (const char *shell, const char *command, int nice_level) { int hairy_p; -#ifndef VMS nice_process (nice_level); hairy_p = !!strpbrk (command, "*?$&!<>[];`'\\\"="); @@ -204,10 +180,6 @@ exec_command (const char *shell, const char *command, int nice_level) else /* Otherwise, we can just exec the program directly. */ exec_simple_command (command); - -#else /* VMS */ - exec_vms_command (command); -#endif /* VMS */ } @@ -242,7 +214,7 @@ nice_process (int nice_level) } #else fprintf (stderr, - "%s: don't know how to change process priority on this system.\n", + "%s: don't know how to change process priority on this system\n", blurb()); #endif diff --git a/driver/exts.c b/driver/exts.c new file mode 100644 index 00000000..641325d3 --- /dev/null +++ b/driver/exts.c @@ -0,0 +1,238 @@ +/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* Some random diagnostics printed in -verbose mode about what extensions + are available on the server, and their version numbers. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#include + +#ifdef HAVE_XSHM_EXTENSION +# include +#endif /* HAVE_XSHM_EXTENSION */ + +#ifdef HAVE_DPMS_EXTENSION +# include +#endif /* HAVE_DPMS_EXTENSION */ + + +#ifdef HAVE_DOUBLE_BUFFER_EXTENSION +# include +#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ + +#ifdef HAVE_XF86VMODE +# include +#endif /* HAVE_XF86VMODE */ + +#ifdef HAVE_XINERAMA +# include +#endif /* HAVE_XINERAMA */ + +#ifdef HAVE_RANDR +# include +#endif /* HAVE_RANDR */ + +#ifdef HAVE_XCOMPOSITE_EXTENSION +# include +#endif + +#ifdef HAVE_XKB +# include +#endif + +#include "xscreensaver.h" + + +void +print_available_extensions (saver_info *si) +{ + int i, j; + static struct { + const char *name; const char *desc; + Bool useful_p; + Status (*version_fn) (Display *, int *majP, int *minP); + } exts[] = { + +# if 0 + { "MIT-SCREEN-SAVER", "MIT Screen-Saver", + False, 0 + }, +# endif + { "MIT-SHM", "Shared Memory", +# ifdef HAVE_XSHM_EXTENSION + True, (Status (*) (Display*,int*,int*)) XShmQueryVersion /* 4 args */ +# else + False, 0 +# endif + }, { "DOUBLE-BUFFER", "Double-Buffering", +# ifdef HAVE_DOUBLE_BUFFER_EXTENSION + True, XdbeQueryExtension +# else + False, 0 +# endif + }, { "DPMS", "Power Management", +# ifdef HAVE_DPMS_EXTENSION + True, DPMSGetVersion +# else + False, 0 +# endif + }, { "GLX", "GLX", +# ifdef HAVE_GL + True, 0 +# else + False, 0 +# endif + }, { "XFree86-VidModeExtension", "XF86 Video-Mode", +# ifdef HAVE_XF86VMODE + True, XF86VidModeQueryVersion +# else + False, 0 +# endif + }, { "XC-VidModeExtension", "XC Video-Mode", +# ifdef HAVE_XF86VMODE + True, XF86VidModeQueryVersion +# else + False, 0 +# endif + }, { "XINERAMA", "Xinerama", +# ifdef HAVE_XINERAMA + True, XineramaQueryVersion +# else + False, 0 +# endif + }, { "RANDR", "Resize-and-Rotate", +# ifdef HAVE_RANDR + True, XRRQueryVersion +# else + False, 0 +# endif + }, { "Composite", "Composite", +# ifdef HAVE_XCOMPOSITE_EXTENSION + True, XCompositeQueryVersion +# else + True, 0 +# endif + }, { "XKEYBOARD", "XKeyboard", +# ifdef HAVE_XKB + True, 0, +# else + False, 0 +# endif + }, { "DRI", "DRI", True, 0 + }, { "NV-CONTROL", "NVidia", True, 0 + }, { "NV-GLX", "NVidia GLX", True, 0 + }, { "Apple-DRI", "Apple-DRI", True, 0 + }, { "Apple-WM", "Apple-WM", True, 0 + }, { "XInputExtension", "XInput", True, 0 + }, + }; + + fprintf (stderr, "%s: running on display \"%s\"\n", blurb(), + DisplayString(si->dpy)); + fprintf (stderr, "%s: vendor is %s, %d\n", blurb(), + ServerVendor(si->dpy), VendorRelease(si->dpy)); + + fprintf (stderr, "%s: useful extensions:\n", blurb()); + for (i = 0; i < countof(exts); i++) + { + int op = 0, event = 0, error = 0; + char buf [255]; + int maj = 0, min = 0; + int dummy1, dummy2, dummy3; + + /* Most of the extension version functions take 3 args, + writing results into args 2 and 3, but some take more. + We only ever care about the first two results, but we + pass in three extra pointers just in case. + */ + Status (*version_fn_2) (Display*,int*,int*,int*,int*,int*) = + (Status (*) (Display*,int*,int*,int*,int*,int*)) exts[i].version_fn; + + if (!XQueryExtension (si->dpy, exts[i].name, &op, &event, &error)) + continue; + sprintf (buf, "%s: ", blurb()); + strcat (buf, exts[i].desc); + + if (!strcmp (exts[i].desc, "XInput")) + { + int maj = 999, min = 999; /* Desired */ + XIQueryVersion (si->dpy, &maj, &min); /* Actual */ + sprintf (buf+strlen(buf), " (%d.%d)", maj, min); + } + else if (!version_fn_2) + ; + else if (version_fn_2 (si->dpy, &maj, &min, &dummy1, &dummy2, &dummy3)) + sprintf (buf+strlen(buf), " (%d.%d)", maj, min); + else + strcat (buf, " (unavailable)"); + + if (!exts[i].useful_p) + strcat (buf, " (disabled at compile time)"); + fprintf (stderr, "%s\n", buf); + } + +# ifdef HAVE_LIBSYSTEMD + fprintf (stderr, "%s: libsystemd\n", blurb()); +# else + fprintf (stderr, "%s: libsystemd (disabled at compile time)\n", blurb()); +# endif + + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + unsigned long colormapped_depths = 0; + unsigned long non_mapped_depths = 0; + XVisualInfo vi_in, *vi_out; + int out_count; + + if (!ssi->real_screen_p) continue; + + vi_in.screen = ssi->real_screen_number; + vi_out = XGetVisualInfo (si->dpy, VisualScreenMask, &vi_in, &out_count); + if (!vi_out) continue; + for (j = 0; j < out_count; j++) { + if (vi_out[j].depth >= 32) continue; + if (vi_out[j].class == PseudoColor) + colormapped_depths |= (1 << vi_out[j].depth); + else + non_mapped_depths |= (1 << vi_out[j].depth); + } + XFree ((char *) vi_out); + + if (colormapped_depths) + { + fprintf (stderr, "%s: screen %d colormapped depths:", blurb(), + ssi->real_screen_number); + for (j = 0; j < 32; j++) + if (colormapped_depths & (1 << j)) + fprintf (stderr, " %d", j); + fprintf (stderr, "\n"); + } + if (non_mapped_depths) + { + fprintf (stderr, "%s: screen %d non-colormapped depths:", + blurb(), ssi->real_screen_number); + for (j = 0; j < 32; j++) + if (non_mapped_depths & (1 << j)) + fprintf (stderr, " %d", j); + fprintf (stderr, "\n"); + } + } +} diff --git a/driver/fade.c b/driver/fade.c new file mode 100644 index 00000000..94515827 --- /dev/null +++ b/driver/fade.c @@ -0,0 +1,1749 @@ +/* xscreensaver, Copyright © 1992-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* There are several different mechanisms here for fading the desktop to + black, and then fading it back in again. + + - Colormaps: This only works on 8-bit displays, which basically haven't + existed since the 90s. It takes the current colormap, makes a writable + copy of it, and then animates the color cells to fade and unfade. + + - XF86 Gamma or RANDR Gamma: These do the fade by altering the brightness + settings of the screen. This works on any system that has the "XF86 + Video-Mode" extension (which is every modern system) AND ALSO has gamma + support in the video driver. But it turns out that as of 2021, the + Raspberry Pi HDMI video driver still does not support gamma. And there's + no way to determine that the video driver lacks gamma support even though + the extension exists. Since the Pi is probably the single most popular + platform for running X11 on the desktop these days, that makes this + method pretty much useless now. + + - SGI VC: Same as the above, but only works on SGI. + + - XSHM: This works by taking a screenshot and hacking the bits by hand. + It's slow. Also, in order to fade in from black to the desktop (possibly + hours after it faded out) it has to retain that first screenshot of the + desktop to fade back to. But if the desktop had changed in the meantime, + there will be a glitch at the end as it snaps from the screenshot to the + new current reality. + + In summary, everything is terrible because X11 doesn't support alpha. + + + The fade process goes like this: + + Screen saver activates: + - Fade out: + - Desktop is visible + - Save screenshot for later + - Map invisible temp windows + - Fade from desktop to black + - Erase saver windows to black and raise them + - Destroy temp windows + + Screen saver deactivates: + - Fade out: + - Saver graphics are visible + - Map invisible temp windows + - Do not save a screenshot + - Fade from graphics to black + - Erase saver windows to black and raise them + - Destroy temp windows + + - Fade in: + - Screen is black + - Map invisible temp windows + - Do not save a screenshot + - Unmap saver windows + - Fade from black to saved screenshot + - Destroy temp windows + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#ifdef HAVE_JWXYZ +# include "jwxyz.h" +#else /* real X11 */ +# include +# include +# include +# include +#endif /* !HAVE_JWXYZ */ + +#include "blurb.h" +#include "visual.h" +#include "usleep.h" +#include "fade.h" +#include "xshm.h" +#include "atoms.h" +#include "clientmsg.h" +#include "xmu.h" + +/* Since gamma fading doesn't work on the Raspberry Pi, probably the single + most popular desktop Linux system these days, let's not use this fade + method even if the extension exists (which it does). + */ +#undef HAVE_XF86VMODE_GAMMA + +/* I'm not sure that the RANDR fade method brings anything to the party + that the XF86 method does See below. + */ +#undef HAVE_RANDR_12 + +#define HAVE_XINPUT2 1 /* Mandatory */ + + +#ifdef HAVE_XINPUT2 +# include +# include "xinput.h" +#endif + + +typedef struct { + int nscreens; + Pixmap *screenshots; +} fade_state; + + +/* #### There's a bunch of duplicated code in the back half of the + four _fade and _whack functions that could probably be combined. + */ +#ifdef HAVE_SGI_VC_EXTENSION +static int sgi_gamma_fade (XtAppContext, Display *, Window *wins, int count, + double secs, Bool out_p); +#endif +#ifdef HAVE_XF86VMODE_GAMMA +static int xf86_gamma_fade (XtAppContext, Display *, Window *wins, int count, + double secs, Bool out_p); +#endif +#ifdef HAVE_RANDR_12 +static int randr_gamma_fade (XtAppContext, Display *, Window *wins, int count, + double secs, Bool out_p); +#endif +static int colormap_fade (XtAppContext, Display *, Window *wins, int count, + double secs, Bool out_p, Bool from_desktop_p); +static int xshm_fade (XtAppContext, Display *, + Window *wins, int count, double secs, + Bool out_p, Bool from_desktop_p, fade_state *); + + +static double +double_time (void) +{ + struct timeval now; +# ifdef GETTIMEOFDAY_TWO_ARGS + struct timezone tzp; + gettimeofday(&now, &tzp); +# else + gettimeofday(&now); +# endif + + return (now.tv_sec + ((double) now.tv_usec * 0.000001)); +} + + +#ifdef HAVE_XINPUT2 +static int xi_opcode = -1; +#endif + +/* Closure arg points to a Bool saying whether motion events count. + Motion aborts fade-out, but only clicks and keys abort fade-in. + */ +static Bool +user_event_p (Display *dpy, XEvent *event, XPointer arg) +{ + Bool motion_p = *((Bool *) arg); + + switch (event->xany.type) { + case KeyPress: case ButtonPress: + return True; + break; + case MotionNotify: + if (motion_p) return True; + break; +# ifdef HAVE_XINPUT2 + case GenericEvent: + { + XIRawEvent *re; + if (event->xcookie.extension != xi_opcode) + return False; + if (! event->xcookie.data) + XGetEventData (dpy, &event->xcookie); + if (! event->xcookie.data) + return False; + re = event->xcookie.data; + + if (re->evtype == XI_RawKeyPress || + re->evtype == XI_RawButtonPress) + return True; + else if (motion_p && re->evtype == XI_RawMotion) + return True; + + /* Calling XFreeEventData here is bad news */ + } + break; +# endif /* HAVE_XINPUT2 */ + default: break; + } + + return False; +} + + +static Bool +user_active_p (XtAppContext app, Display *dpy, Bool fade_out_p) +{ + XEvent event; + XtInputMask m; + Bool motion_p = fade_out_p; /* Motion aborts fade-out, not fade-in. */ + motion_p = False; /* Naah, never abort on motion only */ + +# ifdef HAVE_XINPUT2 + if (xi_opcode == -1) + { + Bool ov = verbose_p; + xi_opcode = 0; /* only init once */ + verbose_p = False; /* xscreensaver already printed this */ + init_xinput (dpy, &xi_opcode); + verbose_p = ov; + } +# endif + + m = XtAppPending (app); + if (m & ~XtIMXEvent) + { + /* Process timers and signals only, don't block. */ + if (verbose_p > 1) + fprintf (stderr, "%s: Xt pending %ld\n", blurb(), m); + XtAppProcessEvent (app, m); + } + + /* If there is user activity, bug out. (Bug out on keypresses or + mouse presses, but not motion, and not release events. Bugging + out on motion made the unfade hack be totally useless, I think.) + */ + if (XCheckIfEvent (dpy, &event, &user_event_p, (XPointer) &motion_p)) + { + if (verbose_p > 1) + { + XIRawEvent *re = 0; + if (event.xany.type == GenericEvent && !event.xcookie.data) + { + XGetEventData (dpy, &event.xcookie); + re = event.xcookie.data; + } + fprintf (stderr, "%s: user input %d %d\n", blurb(), + event.xany.type, + (re ? re->evtype : -1)); + } + XPutBackEvent (dpy, &event); + return True; + } + + return False; +} + + +static void +flush_user_input (Display *dpy) +{ + XEvent event; + Bool motion_p = True; + while (XCheckIfEvent (dpy, &event, &user_event_p, (XPointer) &motion_p)) + if (verbose_p > 1) + { + XIRawEvent *re = 0; + if (event.xany.type == GenericEvent && !event.xcookie.data) + { + XGetEventData (dpy, &event.xcookie); + re = event.xcookie.data; + } + fprintf (stderr, "%s: flushed user event %d %d\n", blurb(), + event.xany.type, + (re ? re->evtype : -1)); + } +} + + +/* This bullshit is needed because the VidMode and SHM extensions don't work + on remote displays. */ +static Bool error_handler_hit_p = False; + +static int +ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) +{ + if (verbose_p > 1) + XmuPrintDefaultErrorMessage (dpy, error, stderr); + error_handler_hit_p = True; + return 0; +} + + +/* Returns true if canceled by user activity. */ +Bool +fade_screens (XtAppContext app, Display *dpy, + Window *saver_windows, int nwindows, + double seconds, Bool out_p, Bool from_desktop_p, + void **closureP) +{ + int status = False; + fade_state *state = 0; + + if (nwindows <= 0) abort(); + if (!saver_windows) abort(); + + if (!closureP) abort(); + state = (fade_state *) *closureP; + if (!state) + { + state = (fade_state *) calloc (1, sizeof (*state)); + *closureP = state; + } + + if (from_desktop_p && !out_p) + abort(); /* Fading in from desktop makes no sense */ + + if (out_p) + flush_user_input (dpy); /* Flush at start of cycle */ + +# ifdef HAVE_SGI_VC_EXTENSION + /* First try to do it by fading the gamma in an SGI-specific way... */ + status = sgi_gamma_fade (app, dpy, saver_windows, nwindows, seconds, out_p); + if (status == 0 || status == 1) + return status; /* faded, possibly canceled */ +# endif + +# ifdef HAVE_RANDR_12 + /* Then try to do it by fading the gamma in an RANDR-specific way... */ + status = randr_gamma_fade (app, dpy, saver_windows, nwindows, seconds, out_p); + if (status == 0 || status == 1) + return status; /* faded, possibly canceled */ +# endif + +# ifdef HAVE_XF86VMODE_GAMMA + /* Then try to do it by fading the gamma in an XFree86-specific way... */ + status = xf86_gamma_fade(app, dpy, saver_windows, nwindows, seconds, out_p); + if (status == 0 || status == 1) + return status; /* faded, possibly canceled */ +# endif + + if (has_writable_cells (DefaultScreenOfDisplay (dpy), + DefaultVisual (dpy, 0))) + { + /* Do it the old-fashioned way, which only really worked on + 8-bit displays. */ + status = colormap_fade (app, dpy, saver_windows, nwindows, seconds, + out_p, from_desktop_p); + if (status == 0 || status == 1) + return status; /* faded, possibly canceled */ + } + + /* Else do it the hard way, by hacking a screenshot. */ + status = xshm_fade (app, dpy, saver_windows, nwindows, seconds, out_p, + from_desktop_p, state); + status = (status ? True : False); + + return status; +} + +/**************************************************************************** + + Colormap fading + + ****************************************************************************/ + + +/* The business with `cmaps_per_screen' is to fake out the SGI 8-bit video + hardware, which is capable of installing multiple (4) colormaps + simultaneously. We have to install multiple copies of the same set of + colors in order to fill up all the available slots in the hardware color + lookup table, so we install an extra N colormaps per screen to make sure + that all screens really go black. + + I'm told that this trick also works with XInside's AcceleratedX when using + the Matrox Millennium card (which also allows multiple PseudoColor and + TrueColor visuals to co-exist and display properly at the same time.) + + This trick works ok on the 24-bit Indy video hardware, but doesn't work at + all on the O2 24-bit hardware. I guess the higher-end hardware is too + "good" for this to work (dammit.) So... I figured out the "right" way to + do this on SGIs, which is to ramp the monitor's gamma down to 0. That's + what is implemented in sgi_gamma_fade(), so we use that if we can. + + Returns: + 0: faded normally + 1: canceled by user activity + -1: unable to fade because the extension isn't supported. + */ +static int +colormap_fade (XtAppContext app, Display *dpy, + Window *saver_windows, int nwindows, + double seconds, Bool out_p, Bool from_desktop_p) +{ + int status = -1; + Colormap *window_cmaps = 0; + int i, j, k; + int cmaps_per_screen = 5; + int nscreens = ScreenCount(dpy); + int ncmaps = nscreens * cmaps_per_screen; + Colormap *fade_cmaps = 0; + Bool installed = False; + int total_ncolors; + XColor *orig_colors, *current_colors, *screen_colors, *orig_screen_colors; + int screen; + + window_cmaps = (Colormap *) calloc(sizeof(Colormap), nwindows); + if (!window_cmaps) abort(); + for (screen = 0; screen < nwindows; screen++) + { + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, saver_windows[screen], &xgwa); + window_cmaps[screen] = xgwa.colormap; + } + + error_handler_hit_p = False; + + if (verbose_p > 1) + fprintf (stderr, "%s: colormap fade %s\n", + blurb(), (out_p ? "out" : "in")); + + total_ncolors = 0; + for (i = 0; i < nscreens; i++) + total_ncolors += CellsOfScreen (ScreenOfDisplay(dpy, i)); + + orig_colors = (XColor *) calloc(sizeof(XColor), total_ncolors); + current_colors = (XColor *) calloc(sizeof(XColor), total_ncolors); + + /* Get the contents of the colormap we are fading from or to. */ + screen_colors = orig_colors; + for (i = 0; i < nscreens; i++) + { + Screen *sc = ScreenOfDisplay (dpy, i); + int ncolors = CellsOfScreen (sc); + Colormap cmap = (from_desktop_p || !out_p + ? DefaultColormapOfScreen(sc) + : window_cmaps[i]); + for (j = 0; j < ncolors; j++) + screen_colors[j].pixel = j; + XQueryColors (dpy, cmap, screen_colors, ncolors); + + screen_colors += ncolors; + } + + memcpy (current_colors, orig_colors, total_ncolors * sizeof (XColor)); + + + /* Make the writable colormaps (we keep these around and reuse them.) */ + if (!fade_cmaps) + { + fade_cmaps = (Colormap *) calloc(sizeof(Colormap), ncmaps); + for (i = 0; i < nscreens; i++) + { + Visual *v = DefaultVisual(dpy, i); + Screen *s = ScreenOfDisplay(dpy, i); + if (has_writable_cells (s, v)) + for (j = 0; j < cmaps_per_screen; j++) + fade_cmaps[(i * cmaps_per_screen) + j] = + XCreateColormap (dpy, RootWindowOfScreen (s), v, AllocAll); + } + } + + /* Run the animation at the maximum frame rate in the time allotted. */ + { + double start_time = double_time(); + double end_time = start_time + seconds; + double prev = 0; + double now; + int frames = 0; + double max = 1/60.0; /* max FPS */ + while ((now = double_time()) < end_time) + { + double ratio = (end_time - now) / seconds; + if (!out_p) ratio = 1-ratio; + + /* For each screen, compute the current value of each color... + */ + orig_screen_colors = orig_colors; + screen_colors = current_colors; + for (j = 0; j < nscreens; j++) + { + int ncolors = CellsOfScreen (ScreenOfDisplay (dpy, j)); + for (k = 0; k < ncolors; k++) + { + /* This doesn't take into account the relative luminance of the + RGB components (0.299, 0.587, and 0.114 at gamma 2.2) but + the difference is imperceptible for this application... */ + screen_colors[k].red = orig_screen_colors[k].red * ratio; + screen_colors[k].green = orig_screen_colors[k].green * ratio; + screen_colors[k].blue = orig_screen_colors[k].blue * ratio; + } + screen_colors += ncolors; + orig_screen_colors += ncolors; + } + + /* Put the colors into the maps... + */ + screen_colors = current_colors; + for (j = 0; j < nscreens; j++) + { + int ncolors = CellsOfScreen (ScreenOfDisplay (dpy, j)); + for (k = 0; k < cmaps_per_screen; k++) + { + Colormap c = fade_cmaps[j * cmaps_per_screen + k]; + if (c) + XStoreColors (dpy, c, screen_colors, ncolors); + } + screen_colors += ncolors; + } + + /* Put the maps on the screens, and then take the windows off the + screen. (only need to do this the first time through the loop.) + */ + if (!installed) + { + for (j = 0; j < ncmaps; j++) + if (fade_cmaps[j]) + XInstallColormap (dpy, fade_cmaps[j]); + installed = True; + + if (!out_p) + for (j = 0; j < nwindows; j++) + { + XUnmapWindow (dpy, saver_windows[j]); + XClearWindow (dpy, saver_windows[j]); + } + } + + XSync (dpy, False); + + if (error_handler_hit_p) + goto DONE; + if (user_active_p (app, dpy, out_p)) + { + status = 1; /* user activity status code */ + goto DONE; + } + frames++; + + if (now < prev + max) + usleep (1000000 * (prev + max - now)); + prev = now; + } + + if (verbose_p > 1) + fprintf (stderr, "%s: %.0f FPS\n", blurb(), frames / (now - start_time)); + } + + status = 0; /* completed fade with no user activity */ + + DONE: + + if (orig_colors) free (orig_colors); + if (current_colors) free (current_colors); + + /* If we've been given windows to raise after blackout, raise them before + releasing the colormaps. + */ + if (out_p) + { + for (i = 0; i < nwindows; i++) + { + XClearWindow (dpy, saver_windows[i]); + XMapRaised (dpy, saver_windows[i]); + } + XSync(dpy, False); + } + + /* Now put the target maps back. + If we're fading out, use the given cmap (or the default cmap, if none.) + If we're fading in, always use the default cmap. + */ + for (i = 0; i < nscreens; i++) + { + Colormap cmap = window_cmaps[i]; + if (!cmap || !out_p) + cmap = DefaultColormap(dpy, i); + XInstallColormap (dpy, cmap); + } + + /* The fade (in or out) is complete, so we don't need the black maps on + stage any more. + */ + for (i = 0; i < ncmaps; i++) + if (fade_cmaps[i]) + { + XUninstallColormap(dpy, fade_cmaps[i]); + XFreeColormap(dpy, fade_cmaps[i]); + fade_cmaps[i] = 0; + } + free (window_cmaps); + free(fade_cmaps); + fade_cmaps = 0; + + if (error_handler_hit_p) status = -1; + return status; +} + + +/**************************************************************************** + + SGI gamma fading + + ****************************************************************************/ + +#ifdef HAVE_SGI_VC_EXTENSION + +# include + +struct screen_sgi_gamma_info { + int gamma_map; /* ??? always using 0 */ + int nred, ngreen, nblue; + unsigned short *red1, *green1, *blue1; + unsigned short *red2, *green2, *blue2; + int gamma_size; + int gamma_precision; + Bool alpha_p; +}; + + +static void sgi_whack_gamma(Display *dpy, int screen, + struct screen_sgi_gamma_info *info, float ratio); + +/* Returns: + 0: faded normally + 1: canceled by user activity + -1: unable to fade because the extension isn't supported. + */ +static int +sgi_gamma_fade (XtAppContext app, Display *dpy, + Window *saver_windows, int nwindows, + double seconds, Bool out_p) +{ + int nscreens = ScreenCount(dpy); + struct timeval then, now; + int i, screen; + int status = -1; + struct screen_sgi_gamma_info *info = (struct screen_sgi_gamma_info *) + calloc(nscreens, sizeof(*info)); + + if (verbose_p > 1) + fprintf (stderr, "%s: sgi fade %s\n", + blurb(), (out_p ? "out" : "in")); + + /* Get the current gamma maps for all screens. + Bug out and return -1 if we can't get them for some screen. + */ + for (screen = 0; screen < nscreens; screen++) + { + if (!XSGIvcQueryGammaMap(dpy, screen, info[screen].gamma_map, + &info[screen].gamma_size, + &info[screen].gamma_precision, + &info[screen].alpha_p)) + goto FAIL; + + if (!XSGIvcQueryGammaColors(dpy, screen, info[screen].gamma_map, + XSGIVC_COMPONENT_RED, + &info[screen].nred, &info[screen].red1)) + goto FAIL; + if (! XSGIvcQueryGammaColors(dpy, screen, info[screen].gamma_map, + XSGIVC_COMPONENT_GREEN, + &info[screen].ngreen, &info[screen].green1)) + goto FAIL; + if (!XSGIvcQueryGammaColors(dpy, screen, info[screen].gamma_map, + XSGIVC_COMPONENT_BLUE, + &info[screen].nblue, &info[screen].blue1)) + goto FAIL; + + if (info[screen].gamma_precision == 8) /* Scale it up to 16 bits. */ + { + int j; + for(j = 0; j < info[screen].nred; j++) + info[screen].red1[j] = + ((info[screen].red1[j] << 8) | info[screen].red1[j]); + for(j = 0; j < info[screen].ngreen; j++) + info[screen].green1[j] = + ((info[screen].green1[j] << 8) | info[screen].green1[j]); + for(j = 0; j < info[screen].nblue; j++) + info[screen].blue1[j] = + ((info[screen].blue1[j] << 8) | info[screen].blue1[j]); + } + + info[screen].red2 = (unsigned short *) + malloc(sizeof(*info[screen].red2) * (info[screen].nred+1)); + info[screen].green2 = (unsigned short *) + malloc(sizeof(*info[screen].green2) * (info[screen].ngreen+1)); + info[screen].blue2 = (unsigned short *) + malloc(sizeof(*info[screen].blue2) * (info[screen].nblue+1)); + } + +#ifdef GETTIMEOFDAY_TWO_ARGS + gettimeofday(&then, &tzp); +#else + gettimeofday(&then); +#endif + + /* If we're fading in (from black), then first crank the gamma all the + way down to 0, then take the windows off the screen. + */ + if (!out_p) + { + for (screen = 0; screen < nscreens; screen++) + sgi_whack_gamma(dpy, screen, &info[screen], 0.0); + + for (screen = 0; screen < nwindows; screen++) + { + XUnmapWindow (dpy, saver_windows[screen]); + XClearWindow (dpy, saver_windows[screen]); + XSync(dpy, False); + } + } + + /* Run the animation at the maximum frame rate in the time allotted. */ + { + double start_time = double_time(); + double end_time = start_time + seconds; + double prev = 0; + double now; + int frames = 0; + double max = 1/60.0; /* max FPS */ + while ((now = double_time()) < end_time) + { + double ratio = (end_time - now) / seconds; + if (!out_p) ratio = 1-ratio; + + for (screen = 0; screen < nwindows; screen++) + sgi_whack_gamma (dpy, screen, &info[screen], ratio); + + if (error_handler_hit_p) + goto FAIL; + if (user_active_p (app, dpy, out_p)) + { + status = 1; /* user activity status code */ + goto DONE; + } + frames++; + + if (now < prev + max) + usleep (1000000 * (prev + max - now)); + prev = now; + } + + if (verbose_p > 1) + fprintf (stderr, "%s: %.0f FPS\n", blurb(), frames / (now - start_time)); + } + + status = 0; /* completed fade with no user activity */ + + DONE: + + if (out_p) + { + for (screen = 0; screen < nwindows; screen++) + { + XClearWindow (dpy, saver_windows[screen]); + XMapRaised (dpy, saver_windows[screen]); + } + XSync(dpy, False); + } + + /* I can't explain this; without this delay, we get a flicker. + I suppose there's some lossage with stale bits being in the + hardware frame buffer or something, and this delay gives it + time to flush out. This sucks! */ + usleep(100000); /* 1/10th second */ + + for (screen = 0; screen < nscreens; screen++) + sgi_whack_gamma(dpy, screen, &info[screen], 1.0); + XSync(dpy, False); + + FAIL: + for (screen = 0; screen < nscreens; screen++) + { + if (info[screen].red1) free (info[screen].red1); + if (info[screen].green1) free (info[screen].green1); + if (info[screen].blue1) free (info[screen].blue1); + if (info[screen].red2) free (info[screen].red2); + if (info[screen].green2) free (info[screen].green2); + if (info[screen].blue2) free (info[screen].blue2); + } + free(info); + + if (verbose_p > 1 && status) + fprintf (stderr, "%s: SGI fade %s failed\n", + blurb(), (out_p ? "out" : "in")); + + if (error_handler_hit_p) status = -1; + return status; +} + +static void +sgi_whack_gamma (Display *dpy, int screen, struct screen_sgi_gamma_info *info, + float ratio) +{ + int k; + + if (ratio < 0) ratio = 0; + if (ratio > 1) ratio = 1; + for (k = 0; k < info->gamma_size; k++) + { + info->red2[k] = info->red1[k] * ratio; + info->green2[k] = info->green1[k] * ratio; + info->blue2[k] = info->blue1[k] * ratio; + } + + XSGIvcStoreGammaColors16(dpy, screen, info->gamma_map, info->nred, + XSGIVC_MComponentRed, info->red2); + XSGIvcStoreGammaColors16(dpy, screen, info->gamma_map, info->ngreen, + XSGIVC_MComponentGreen, info->green2); + XSGIvcStoreGammaColors16(dpy, screen, info->gamma_map, info->nblue, + XSGIVC_MComponentBlue, info->blue2); + XSync(dpy, False); +} + +#endif /* HAVE_SGI_VC_EXTENSION */ + + +/**************************************************************************** + + XFree86 gamma fading + + ****************************************************************************/ + +#ifdef HAVE_XF86VMODE_GAMMA + +#include + +typedef struct { + XF86VidModeGamma vmg; + int size; + unsigned short *r, *g, *b; +} xf86_gamma_info; + +static int xf86_check_gamma_extension (Display *dpy); +static Bool xf86_whack_gamma (Display *dpy, int screen, + xf86_gamma_info *ginfo, float ratio); + +/* Returns: + 0: faded normally + 1: canceled by user activity + -1: unable to fade because the extension isn't supported. + */ +static int +xf86_gamma_fade (XtAppContext app, Display *dpy, + Window *saver_windows, int nwindows, + double seconds, Bool out_p) +{ + int nscreens = ScreenCount(dpy); + int screen; + int status = -1; + xf86_gamma_info *info = 0; + + static int ext_ok = -1; + + if (verbose_p > 1) + fprintf (stderr, "%s: xf86 fade %s\n", + blurb(), (out_p ? "out" : "in")); + + /* Only probe the extension once: the answer isn't going to change. */ + if (ext_ok == -1) + ext_ok = xf86_check_gamma_extension (dpy); + + /* If this server doesn't have the gamma extension, bug out. */ + if (ext_ok == 0) + goto FAIL; + +# ifndef HAVE_XF86VMODE_GAMMA_RAMP + if (ext_ok == 2) ext_ok = 1; /* server is newer than client! */ +# endif + + info = (xf86_gamma_info *) calloc(nscreens, sizeof(*info)); + + /* Get the current gamma maps for all screens. + Bug out and return -1 if we can't get them for some screen. + */ + for (screen = 0; screen < nscreens; screen++) + { + if (ext_ok == 1) /* only have gamma parameter, not ramps. */ + { + if (!XF86VidModeGetGamma(dpy, screen, &info[screen].vmg)) + goto FAIL; + } +# ifdef HAVE_XF86VMODE_GAMMA_RAMP + else if (ext_ok == 2) /* have ramps */ + { + if (!XF86VidModeGetGammaRampSize(dpy, screen, &info[screen].size)) + goto FAIL; + if (info[screen].size <= 0) + goto FAIL; + + info[screen].r = (unsigned short *) + calloc(info[screen].size, sizeof(unsigned short)); + info[screen].g = (unsigned short *) + calloc(info[screen].size, sizeof(unsigned short)); + info[screen].b = (unsigned short *) + calloc(info[screen].size, sizeof(unsigned short)); + + if (!(info[screen].r && info[screen].g && info[screen].b)) + goto FAIL; + +# if 0 + if (verbose_p > 1 && out_p) + { + int i; + fprintf (stderr, "%s: initial gamma ramps, size %d:\n", + blurb(), info[screen].size); + fprintf (stderr, "%s: R:", blurb()); + for (i = 0; i < info[screen].size; i++) + fprintf (stderr, " %d", info[screen].r[i]); + fprintf (stderr, "\n%s: G:", blurb()); + for (i = 0; i < info[screen].size; i++) + fprintf (stderr, " %d", info[screen].g[i]); + fprintf (stderr, "\n%s: B:", blurb()); + for (i = 0; i < info[screen].size; i++) + fprintf (stderr, " %d", info[screen].b[i]); + fprintf (stderr, "\n"); + } +# endif /* 0 */ + + if (!XF86VidModeGetGammaRamp(dpy, screen, info[screen].size, + info[screen].r, + info[screen].g, + info[screen].b)) + goto FAIL; + } +# endif /* HAVE_XF86VMODE_GAMMA_RAMP */ + else + abort(); + } + + /* If we're fading in (from black), then first crank the gamma all the + way down to 0, then take the windows off the screen. + */ + if (!out_p) + { + for (screen = 0; screen < nscreens; screen++) + xf86_whack_gamma(dpy, screen, &info[screen], 0.0); + for (screen = 0; screen < nwindows; screen++) + { + XUnmapWindow (dpy, saver_windows[screen]); + XClearWindow (dpy, saver_windows[screen]); + XSync(dpy, False); + } + } + + /* Run the animation at the maximum frame rate in the time allotted. */ + { + double start_time = double_time(); + double end_time = start_time + seconds; + double prev = 0; + double now; + int frames = 0; + double max = 1/60.0; /* max FPS */ + while ((now = double_time()) < end_time) + { + double ratio = (end_time - now) / seconds; + if (!out_p) ratio = 1-ratio; + + for (screen = 0; screen < nscreens; screen++) + xf86_whack_gamma (dpy, screen, &info[screen], ratio); + + if (error_handler_hit_p) + goto FAIL; + if (user_active_p (app, dpy, out_p)) + { + status = 1; /* user activity status code */ + goto DONE; + } + frames++; + + if (now < prev + max) + usleep (1000000 * (prev + max - now)); + prev = now; + } + + if (verbose_p > 1) + fprintf (stderr, "%s: %.0f FPS\n", blurb(), frames / (now - start_time)); + } + + status = 0; /* completed fade with no user activity */ + + DONE: + + if (out_p) + { + for (screen = 0; screen < nwindows; screen++) + { + XClearWindow (dpy, saver_windows[screen]); + XMapRaised (dpy, saver_windows[screen]); + } + XSync(dpy, False); + } + + /* I can't explain this; without this delay, we get a flicker. + I suppose there's some lossage with stale bits being in the + hardware frame buffer or something, and this delay gives it + time to flush out. This sucks! */ + usleep(100000); /* 1/10th second */ + + for (screen = 0; screen < nscreens; screen++) + xf86_whack_gamma(dpy, screen, &info[screen], 1.0); + XSync(dpy, False); + + FAIL: + if (info) + { + for (screen = 0; screen < nscreens; screen++) + { + if (info[screen].r) free(info[screen].r); + if (info[screen].g) free(info[screen].g); + if (info[screen].b) free(info[screen].b); + } + free(info); + } + + if (verbose_p > 1 && status) + fprintf (stderr, "%s: xf86 fade %s failed\n", + blurb(), (out_p ? "out" : "in")); + + if (error_handler_hit_p) status = -1; + return status; +} + + +static Bool +safe_XF86VidModeQueryVersion (Display *dpy, int *majP, int *minP) +{ + Bool result; + XErrorHandler old_handler; + XSync (dpy, False); + error_handler_hit_p = False; + old_handler = XSetErrorHandler (ignore_all_errors_ehandler); + + result = XF86VidModeQueryVersion (dpy, majP, minP); + + XSync (dpy, False); + XSetErrorHandler (old_handler); + XSync (dpy, False); + + return (error_handler_hit_p + ? False + : result); +} + + + +/* VidModeExtension version 2.0 or better is needed to do gamma. + 2.0 added gamma values; 2.1 added gamma ramps. + */ +# define XF86_VIDMODE_GAMMA_MIN_MAJOR 2 +# define XF86_VIDMODE_GAMMA_MIN_MINOR 0 +# define XF86_VIDMODE_GAMMA_RAMP_MIN_MAJOR 2 +# define XF86_VIDMODE_GAMMA_RAMP_MIN_MINOR 1 + + + +/* Returns 0 if gamma fading not available; 1 if only gamma value setting + is available; 2 if gamma ramps are available. + */ +static int +xf86_check_gamma_extension (Display *dpy) +{ + int event, error, major, minor; + + if (!XF86VidModeQueryExtension (dpy, &event, &error)) + return 0; /* display doesn't have the extension. */ + + if (!safe_XF86VidModeQueryVersion (dpy, &major, &minor)) + return 0; /* unable to get version number? */ + + if (major < XF86_VIDMODE_GAMMA_MIN_MAJOR || + (major == XF86_VIDMODE_GAMMA_MIN_MAJOR && + minor < XF86_VIDMODE_GAMMA_MIN_MINOR)) + return 0; /* extension is too old for gamma. */ + + if (major < XF86_VIDMODE_GAMMA_RAMP_MIN_MAJOR || + (major == XF86_VIDMODE_GAMMA_RAMP_MIN_MAJOR && + minor < XF86_VIDMODE_GAMMA_RAMP_MIN_MINOR)) + return 1; /* extension is too old for gamma ramps. */ + + /* Copacetic */ + return 2; +} + + +/* XFree doesn't let you set gamma to a value smaller than this. + Apparently they didn't anticipate the trick I'm doing here... + */ +#define XF86_MIN_GAMMA 0.1 + + +static Bool +xf86_whack_gamma(Display *dpy, int screen, xf86_gamma_info *info, + float ratio) +{ + XErrorHandler old_handler; + XSync (dpy, False); + error_handler_hit_p = False; + old_handler = XSetErrorHandler (ignore_all_errors_ehandler); + + if (ratio < 0) ratio = 0; + if (ratio > 1) ratio = 1; + + if (info->size == 0) /* we only have a gamma number, not a ramp. */ + { + XF86VidModeGamma g2; + + g2.red = info->vmg.red * ratio; + g2.green = info->vmg.green * ratio; + g2.blue = info->vmg.blue * ratio; + +# ifdef XF86_MIN_GAMMA + if (g2.red < XF86_MIN_GAMMA) g2.red = XF86_MIN_GAMMA; + if (g2.green < XF86_MIN_GAMMA) g2.green = XF86_MIN_GAMMA; + if (g2.blue < XF86_MIN_GAMMA) g2.blue = XF86_MIN_GAMMA; +# endif + + if (! XF86VidModeSetGamma (dpy, screen, &g2)) + return -1; + } + else + { +# ifdef HAVE_XF86VMODE_GAMMA_RAMP + + unsigned short *r, *g, *b; + int i; + r = (unsigned short *) malloc(info->size * sizeof(unsigned short)); + g = (unsigned short *) malloc(info->size * sizeof(unsigned short)); + b = (unsigned short *) malloc(info->size * sizeof(unsigned short)); + + for (i = 0; i < info->size; i++) + { + r[i] = info->r[i] * ratio; + g[i] = info->g[i] * ratio; + b[i] = info->b[i] * ratio; + } + + if (! XF86VidModeSetGammaRamp(dpy, screen, info->size, r, g, b)) + return -1; + + free (r); + free (g); + free (b); + +# else /* !HAVE_XF86VMODE_GAMMA_RAMP */ + abort(); +# endif /* !HAVE_XF86VMODE_GAMMA_RAMP */ + } + + XSync (dpy, False); + XSetErrorHandler (old_handler); + XSync (dpy, False); + + return status; +} + +#endif /* HAVE_XF86VMODE_GAMMA */ + + +/**************************************************************************** + + RANDR gamma fading + + **************************************************************************** + + + Dec 2020: I noticed that gamma fading was not working on a Raspberry Pi + with Raspbian 10.6, and wrote this under the hypothesis that the XF86 + gamma fade code was failing and maybe the RANDR version would work better. + Then I discovered that gamma simply isn't supported by the Raspberry Pi + HDMI driver: + + https://github.com/raspberrypi/firmware/issues/1274 + + I should have tried this first and seen it not work: + + xrandr --output HDMI-1 --brightness .1 + + Since I still don't have an answer to the question of whether the XF86 + gamma fading method works on modern Linux systems that also have RANDR, + I'm leaving this new code turned off for now, as it is largely untested. + The new code would be useful if: + + A) The XF86 way doesn't work but the RANDR way does, or + B) There exist systems that have RANDR but do not have XF86. + + But until Raspberry Pi supports gamma, both gamma methods fail to work + for far too many users for them to be used in XScreenSaver. + */ +#ifdef HAVE_RANDR_12 + +# include + +typedef struct { + RRCrtc crtc; + Bool enabled_p; + XRRCrtcGamma *gamma; +} randr_gamma_info; + + +static int +randr_check_gamma_extension (Display *dpy) +{ + int event, error, major, minor; + if (! XRRQueryExtension (dpy, &event, &error)) + return 0; + + if (! XRRQueryVersion (dpy, &major, &minor)) { + if (verbose_p > 1) fprintf (stderr, "%s: no randr ext\n", blurb()); + return 0; + } + + /* Reject if < 1.5. It's possible that 1.2 - 1.4 work, but untested. */ + if (major < 1 || (major == 1 && minor < 5)) { + if (verbose_p > 1) fprintf (stderr, "%s: randr ext only version %d.%d\n", + blurb(), major, minor); + return 0; + } + + return 1; +} + + +static void randr_whack_gamma (Display *dpy, int screen, + randr_gamma_info *ginfo, float ratio); + +/* Returns: + 0: faded normally + 1: canceled by user activity + -1: unable to fade because the extension isn't supported. + */ +static int +randr_gamma_fade (XtAppContext app, Display *dpy, + Window *saver_windows, int nwindows, + double seconds, Bool out_p) +{ + int xsc = ScreenCount (dpy); + int nscreens = 0; + int j, screen; + int status = -1; + randr_gamma_info *info = 0; + + static int ext_ok = -1; + + if (verbose_p > 1) + fprintf (stderr, "%s: randr fade %s\n", + blurb(), (out_p ? "out" : "in")); + + /* Only probe the extension once: the answer isn't going to change. */ + if (ext_ok == -1) + ext_ok = randr_check_gamma_extension (dpy); + + /* If this server doesn't have the RANDR extension, bug out. */ + if (ext_ok == 0) + goto FAIL; + + /* Add up the virtual screens on each X screen. */ + for (screen = 0; screen < xsc; screen++) + { + XRRScreenResources *res = + XRRGetScreenResources (dpy, RootWindow (dpy, screen)); + nscreens += res->noutput; + XRRFreeScreenResources (res); + } + + if (nscreens <= 0) + goto FAIL; + + info = (randr_gamma_info *) calloc(nscreens, sizeof(*info)); + + /* Get the current gamma maps for all screens. + Bug out and return -1 if we can't get them for some screen. + */ + for (screen = 0, j = 0; screen < xsc; screen++) + { + XRRScreenResources *res = + XRRGetScreenResources (dpy, RootWindow (dpy, screen)); + int k; + for (k = 0; k < res->noutput; k++, j++) + { + XRROutputInfo *rroi = XRRGetOutputInfo (dpy, res, res->outputs[j]); + RRCrtc crtc = (rroi->crtc ? rroi->crtc : + rroi->ncrtc ? rroi->crtcs[0] : 0); + + info[j].crtc = crtc; + info[j].gamma = XRRGetCrtcGamma (dpy, crtc); + + /* #### is this test sufficient? */ + info[j].enabled_p = (rroi->connection != RR_Disconnected); + +# if 0 + if (verbose_p > 1 && out_p) + { + int m; + fprintf (stderr, "%s: initial gamma ramps, size %d:\n", + blurb(), info[j].gamma->size); + fprintf (stderr, "%s: R:", blurb()); + for (m = 0; m < info[j].gamma->size; m++) + fprintf (stderr, " %d", info[j].gamma->red[m]); + fprintf (stderr, "\n%s: G:", blurb()); + for (m = 0; m < info[j].gamma->size; m++) + fprintf (stderr, " %d", info[j].gamma->green[m]); + fprintf (stderr, "\n%s: B:", blurb()); + for (m = 0; m < info[j].gamma->size; m++) + fprintf (stderr, " %d", info[j].gamma->blue[m]); + fprintf (stderr, "\n"); + } +# endif /* 0 */ + + XRRFreeOutputInfo (rroi); + } + XRRFreeScreenResources (res); + } + + /* If we're fading in (from black), then first crank the gamma all the + way down to 0, then take the windows off the screen. + */ + if (!out_p) + { + for (screen = 0; screen < nscreens; screen++) + randr_whack_gamma(dpy, screen, &info[screen], 0.0); + for (screen = 0; screen < nwindows; screen++) + { + XUnmapWindow (dpy, saver_windows[screen]); + XClearWindow (dpy, saver_windows[screen]); + XSync(dpy, False); + } + } + + /* Run the animation at the maximum frame rate in the time allotted. */ + { + double start_time = double_time(); + double end_time = start_time + seconds; + double prev = 0; + double now; + int frames = 0; + double max = 1/60.0; /* max FPS */ + while ((now = double_time()) < end_time) + { + double ratio = (end_time - now) / seconds; + if (!out_p) ratio = 1-ratio; + + for (screen = 0; screen < nwindows; screen++) + { + if (!info[screen].enabled_p) + continue; + + randr_whack_gamma (dpy, screen, &info[screen], ratio); + } + + if (error_handler_hit_p) + goto FAIL; + if (user_active_p (app, dpy, out_p)) + { + status = 1; /* user activity status code */ + goto DONE; + } + frames++; + + if (now < prev + max) + usleep (1000000 * (prev + max - now)); + prev = now; + } + + if (verbose_p > 1) + fprintf (stderr, "%s: %.0f FPS\n", blurb(), frames / (now - start_time)); + } + + status = 0; /* completed fade with no user activity */ + + DONE: + + if (out_p) + { + for (screen = 0; screen < nwindows; screen++) + { + XClearWindow (dpy, saver_windows[screen]); + XMapRaised (dpy, saver_windows[screen]); + } + XSync(dpy, False); + } + + /* I can't explain this; without this delay, we get a flicker. + I suppose there's some lossage with stale bits being in the + hardware frame buffer or something, and this delay gives it + time to flush out. This sucks! */ + /* #### That comment was about XF86, not verified with randr. */ + usleep(100000); /* 1/10th second */ + + for (screen = 0; screen < nscreens; screen++) + randr_whack_gamma (dpy, screen, &info[screen], 1.0); + XSync(dpy, False); + + FAIL: + if (info) + { + for (screen = 0; screen < nscreens; screen++) + { + if (info[screen].gamma) XRRFreeGamma (info[screen].gamma); + } + free(info); + } + + if (verbose_p > 1 && status) + fprintf (stderr, "%s: randr fade %s failed\n", + blurb(), (out_p ? "out" : "in")); + + return status; +} + + +static void +randr_whack_gamma (Display *dpy, int screen, randr_gamma_info *info, + float ratio) +{ + XErrorHandler old_handler; + XRRCrtcGamma *g2; + int i; + + XSync (dpy, False); + error_handler_hit_p = False; + old_handler = XSetErrorHandler (ignore_all_errors_ehandler); + + if (ratio < 0) ratio = 0; + if (ratio > 1) ratio = 1; + + g2 = XRRAllocGamma (info->gamma->size); + for (i = 0; i < info->gamma->size; i++) + { + g2->red[i] = ratio * info->gamma->red[i]; + g2->green[i] = ratio * info->gamma->green[i]; + g2->blue[i] = ratio * info->gamma->blue[i]; + } + + XRRSetCrtcGamma (dpy, info->crtc, g2); + XRRFreeGamma (g2); + + XSync (dpy, False); + XSetErrorHandler (old_handler); + XSync (dpy, False); + + return 0; +} + +#endif /* HAVE_RANDR_12 */ + + +/**************************************************************************** + + XSHM screen-shot fading + + ****************************************************************************/ + +typedef struct { + GC gc; + Window window; + Pixmap screenshot; + XImage *src, *intermediate; +} xshm_fade_info; + + +static int xshm_whack (Display *, XShmSegmentInfo *, + xshm_fade_info *, float ratio); + +/* Returns: + 0: faded normally + 1: canceled by user activity + -1: unknown error + */ +static int +xshm_fade (XtAppContext app, Display *dpy, + Window *saver_windows, int nwindows, double seconds, + Bool out_p, Bool from_desktop_p, fade_state *state) +{ + int screen; + int status = -1; + xshm_fade_info *info = 0; + XShmSegmentInfo shm_info; + Window saver_window = 0; + XErrorHandler old_handler = 0; + + XSync (dpy, False); + old_handler = XSetErrorHandler (ignore_all_errors_ehandler); + error_handler_hit_p = False; + + if (verbose_p > 1) + fprintf (stderr, "%s: SHM fade %s\n", + blurb(), (out_p ? "out" : "in")); + + info = (xshm_fade_info *) calloc(nwindows, sizeof(*info)); + if (!info) goto FAIL; + + saver_window = find_screensaver_window (dpy, 0); + if (!saver_window) goto FAIL; + + /* Retrieve a screenshot of the area covered by each window. + Windows might not be mapped. + Bug out and return -1 if we can't get one for some screen. + */ + + for (screen = 0; screen < nwindows; screen++) + { + XWindowAttributes xgwa; + Window root; + XGCValues gcv; + GC gc; + unsigned long attrmask = 0; + XSetWindowAttributes attrs; + + XGetWindowAttributes (dpy, saver_windows[screen], &xgwa); + root = RootWindowOfScreen (xgwa.screen); + + info[screen].src = + create_xshm_image (dpy, xgwa.visual, xgwa.depth, + ZPixmap, &shm_info, xgwa.width, xgwa.height); + if (!info[screen].src) goto FAIL; + + info[screen].intermediate = + create_xshm_image (dpy, xgwa.visual, xgwa.depth, + ZPixmap, &shm_info, xgwa.width, xgwa.height); + if (!info[screen].intermediate) goto FAIL; + + if (!out_p) + { + /* If we are fading in, retrieve the saved screenshot from + before we faded out. */ + if (state->nscreens <= screen) goto FAIL; + info[screen].screenshot = state->screenshots[screen]; + } + else + { + /* Create a pixmap and grab a screenshot into it. */ + info[screen].screenshot = + XCreatePixmap (dpy, root, xgwa.width, xgwa.height, xgwa.depth); + if (!info[screen].screenshot) goto FAIL; + + gcv.function = GXcopy; + gcv.subwindow_mode = IncludeInferiors; + gc = XCreateGC (dpy, root, GCFunction | GCSubwindowMode, &gcv); + XCopyArea (dpy, root, info[screen].screenshot, gc, + xgwa.x, xgwa.y, xgwa.width, xgwa.height, 0, 0); + XFreeGC (dpy, gc); + } + + /* Create the fader window for the animation. */ + attrmask = CWOverrideRedirect; + attrs.override_redirect = True; + info[screen].window = + XCreateWindow (dpy, root, xgwa.x, xgwa.y, + xgwa.width, xgwa.height, xgwa.border_width, xgwa.depth, + InputOutput, xgwa.visual, + attrmask, &attrs); + if (!info[screen].window) goto FAIL; + /* XSelectInput (dpy, info[screen].window, + KeyPressMask | ButtonPressMask); */ + + /* Copy the screenshot pixmap to the source image */ + if (! get_xshm_image (dpy, info[screen].screenshot, info[screen].src, + 0, 0, ~0L, &shm_info)) + goto FAIL; + + gcv.function = GXcopy; + info[screen].gc = XCreateGC (dpy, info[screen].window, GCFunction, &gcv); + } + + /* If we're fading out from the desktop, save our screen shots for later use. + But not if we're fading out from the savers to black. In that case we + don't want to overwrite the desktop screenshot with the current screenshot + which is of the final frames of the just-killed graphics hacks. */ + if (from_desktop_p) + { + if (!out_p) abort(); + for (screen = 0; screen < state->nscreens; screen++) + if (state->screenshots[screen]) + XFreePixmap (dpy, state->screenshots[screen]); + if (state->screenshots) + free (state->screenshots); + state->nscreens = nwindows; + state->screenshots = calloc (nwindows, sizeof(*state->screenshots)); + if (!state->screenshots) + state->nscreens = 0; + for (screen = 0; screen < state->nscreens; screen++) + state->screenshots[screen] = info[screen].screenshot; + } + + for (screen = 0; screen < nwindows; screen++) + { + if (out_p) + /* Copy the screenshot to the fader window */ + XSetWindowBackgroundPixmap (dpy, info[screen].window, + info[screen].screenshot); + else + { + XSetWindowBackgroundPixmap (dpy, info[screen].window, None); + XSetWindowBackground (dpy, info[screen].window, BlackPixel (dpy, 0)); + } + + XMapRaised (dpy, info[screen].window); + + /* Now that we have mapped the screenshot on the fader windows, + take the saver windows off the screen. */ + if (out_p) + { + XUnmapWindow (dpy, saver_windows[screen]); + XClearWindow (dpy, saver_windows[screen]); + } + } + + /* Run the animation at the maximum frame rate in the time allotted. */ + { + double start_time = double_time(); + double end_time = start_time + seconds; + double prev = 0; + double now; + int frames = 0; + double max = 1/60.0; /* max FPS */ + while ((now = double_time()) < end_time) + { + double ratio = (end_time - now) / seconds; + if (!out_p) ratio = 1-ratio; + + for (screen = 0; screen < nwindows; screen++) + if (xshm_whack (dpy, &shm_info, &info[screen], ratio)) + goto FAIL; + + if (error_handler_hit_p) + goto FAIL; + if (user_active_p (app, dpy, out_p)) + { + status = 1; /* user activity status code */ + goto DONE; + } + frames++; + + if (now < prev + max) + usleep (1000000 * (prev + max - now)); + prev = now; + } + + if (verbose_p > 1) + fprintf (stderr, "%s: %.0f FPS\n", blurb(), frames / (now - start_time)); + } + + status = 0; /* completed fade with no user activity */ + + DONE: + + /* If we're fading out, we have completed the transition from what was + on the screen to black, using our fader windows. Now raise the saver + windows and take the fader windows off the screen. Since they're both + black, that will be imperceptible. + */ + if (out_p) + { + for (screen = 0; screen < nwindows; screen++) + { + XClearWindow (dpy, saver_windows[screen]); + XMapRaised (dpy, saver_windows[screen]); + if (info[screen].window) + XUnmapWindow (dpy, info[screen].window); + } + } + + XSync (dpy, False); + + FAIL: + + /* After fading in, take the saver windows off the screen before + destroying the occluding screenshot windows. */ + if (!out_p) + { + for (screen = 0; screen < nwindows; screen++) + { + XUnmapWindow (dpy, saver_windows[screen]); + XClearWindow (dpy, saver_windows[screen]); + } + } + + if (info) + { + for (screen = 0; screen < nwindows; screen++) + { + if (info[screen].src) + destroy_xshm_image (dpy, info[screen].src, &shm_info); + if (info[screen].intermediate) + destroy_xshm_image (dpy, info[screen].intermediate, &shm_info); + if (info[screen].window) + XDestroyWindow (dpy, info[screen].window); + if (info[screen].gc) + XFreeGC (dpy, info[screen].gc); + } + free (info); + } + + /* If fading in, delete the screenshot pixmaps, and the list of them. */ + if (!out_p && saver_window) + { + for (screen = 0; screen < state->nscreens; screen++) + if (state->screenshots[screen]) + XFreePixmap (dpy, state->screenshots[screen]); + if (state->screenshots) + free (state->screenshots); + state->nscreens = 0; + state->screenshots = 0; + } + + XSync (dpy, False); + XSetErrorHandler (old_handler); + + if (error_handler_hit_p) status = -1; + if (verbose_p > 1 && status) + fprintf (stderr, "%s: SHM fade %s failed\n", + blurb(), (out_p ? "out" : "in")); + + return status; +} + + +static int +xshm_whack (Display *dpy, XShmSegmentInfo *shm_info, + xshm_fade_info *info, float ratio) +{ + unsigned char *inbits = (unsigned char *) info->src->data; + unsigned char *outbits = (unsigned char *) info->intermediate->data; + unsigned char *end = (outbits + + info->intermediate->bytes_per_line * + info->intermediate->height); + unsigned char ramp[256]; + int i; + + XSync (dpy, False); + + if (ratio < 0) ratio = 0; + if (ratio > 1) ratio = 1; + + for (i = 0; i < sizeof(ramp); i++) + ramp[i] = i * ratio; + while (outbits < end) + *outbits++ = ramp[*inbits++]; + + put_xshm_image (dpy, info->window, info->gc, info->intermediate, 0, 0, 0, 0, + info->intermediate->width, info->intermediate->height, + shm_info); + XSync (dpy, False); + return 0; +} diff --git a/utils/fade.h b/driver/fade.h similarity index 58% rename from utils/fade.h rename to driver/fade.h index bedae936..56725b59 100644 --- a/utils/fade.h +++ b/driver/fade.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1992-1997, 2003 Jamie Zawinski +/* xscreensaver, Copyright © 1992-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -12,10 +12,9 @@ #ifndef __FADE_H__ #define __FADE_H__ -extern Colormap copy_colormap (Screen *, Visual *, Colormap from, Colormap to); -extern void blacken_colormap (Screen *, Colormap cmap); -extern void fade_screens (Display *dpy, - Colormap *cmaps, Window *black_windows, int nwindows, - int seconds, int ticks, - Bool out_p, Bool clear_windows); +/* Returns true if canceled by user activity. */ +extern Bool fade_screens (XtAppContext app, Display *dpy, + Window *black_windows, int nwindows, + double seconds, Bool out_p, Bool from_desktop_p, + void **closureP); #endif /* __FADE_H__ */ diff --git a/driver/link_axp.com b/driver/link_axp.com deleted file mode 100644 index a1418927..00000000 --- a/driver/link_axp.com +++ /dev/null @@ -1,15 +0,0 @@ -$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new -$! X11R5 libraries -$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version -$ if f$extract(4,3,decw$version).eqs."1.2" -$ then -$! DECW/Motif 1.2 : link with X11R5 libraries -$ link xscreensaver-command,vms_axp_12.opt/opt -$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, - - windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_axp_12.opt/opt -$ else -$! Else, link with X11R4 libraries -$ link xscreensaver-command,vms_axp.opt/opt -$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, - - windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_axp.opt/opt -$ endif diff --git a/driver/link_decc.com b/driver/link_decc.com deleted file mode 100644 index d1de0d0a..00000000 --- a/driver/link_decc.com +++ /dev/null @@ -1,15 +0,0 @@ -$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new -$! X11R5 libraries -$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version -$ if f$extract(4,3,decw$version).eqs."1.2" -$ then -$! DECW/Motif 1.2 : link with X11R5 libraries -$ link xscreensaver-command,vms_decc_12.opt/opt -$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, - - windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_decc_12.opt/opt -$ else -$! Else, link with X11R4 libraries -$ link xscreensaver-command,vms_decc.opt/opt -$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, - - windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_decc.opt/opt -$ endif diff --git a/driver/lock.c b/driver/lock.c deleted file mode 100644 index 8bcd2e04..00000000 --- a/driver/lock.c +++ /dev/null @@ -1,2285 +0,0 @@ -/* lock.c --- handling the password dialog for locking-mode. - * xscreensaver, Copyright (c) 1993-2020 Jamie Zawinski - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ - -/* Athena locking code contributed by Jon A. Christopher */ -/* Copyright 1997, with the same permissions as above. */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include -#include /* for time() */ -#include -#include -#include "xscreensaver.h" -#include "resources.h" -#include "mlstring.h" -#include "auth.h" - -#ifndef NO_LOCKING /* (mostly) whole file */ - -#ifdef HAVE_XHPDISABLERESET -# include - static void hp_lock_reset (saver_info *si, Bool lock_p); -#endif /* HAVE_XHPDISABLERESET */ - -#ifdef HAVE_XF86VMODE -# include - static void xfree_lock_mode_switch (saver_info *si, Bool lock_p); -#endif /* HAVE_XF86VMODE */ - -#ifdef HAVE_XF86MISCSETGRABKEYSSTATE -# include - static void xfree_lock_grab_smasher (saver_info *si, Bool lock_p); -#endif /* HAVE_XF86MISCSETGRABKEYSSTATE */ - -#ifdef HAVE_RANDR -# include -#endif /* HAVE_RANDR */ - -#ifdef _VROOT_H_ -ERROR! You must not include vroot.h in this file. -#endif - -#ifdef HAVE_UNAME -# include /* for hostname info */ -#endif /* HAVE_UNAME */ -#include - -#ifndef VMS -# include -#else /* VMS */ - -extern char *getenv(const char *name); -extern int validate_user(char *name, char *password); - -static Bool -vms_passwd_valid_p(char *pw, Bool verbose_p) -{ - return (validate_user (getenv("USER"), typed_passwd) == 1); -} -# undef passwd_valid_p -# define passwd_valid_p vms_passwd_valid_p - -#endif /* VMS */ - -#define SAMPLE_INPUT "MMMMMMMMMMMM" - - -#undef MAX -#define MAX(a,b) ((a)>(b)?(a):(b)) - -typedef struct info_dialog_data info_dialog_data; - - -#define MAX_BYTES_PER_CHAR 8 /* UTF-8 uses no more than 3, I think */ -#define MAX_PASSWD_CHARS 128 /* Longest possible passphrase */ - -struct passwd_dialog_data { - - saver_screen_info *prompt_screen; - int previous_mouse_x, previous_mouse_y; - - /* "Characters" in the password may be a variable number of bytes long. - typed_passwd contains the raw bytes. - typed_passwd_char_size indicates the size in bytes of each character, - so that we can make backspace work. - */ - char typed_passwd [MAX_PASSWD_CHARS * MAX_BYTES_PER_CHAR]; - char typed_passwd_char_size [MAX_PASSWD_CHARS]; - - XtIntervalId timer; - int i_beam; - - float ratio; - Position x, y; - Dimension width; - Dimension height; - Dimension border_width; - - Bool echo_input; - Bool show_stars_p; /* "I regret that I have but one asterisk for my country." - -- Nathan Hale, 1776. */ - - char *heading_label; - char *body_label; - char *user_label; - mlstring *info_label; - /* The entry field shall only be displayed if prompt_label is not NULL */ - mlstring *prompt_label; - char *date_label; - char *passwd_string; - Bool passwd_changed_p; /* Whether the user entry field needs redrawing */ - Bool caps_p; /* Whether we saw a keypress with caps-lock on */ - char *unlock_label; - char *login_label; - char *uname_label; - - Bool show_uname_p; - - XFontStruct *heading_font; - XFontStruct *body_font; - XFontStruct *label_font; - XFontStruct *passwd_font; - XFontStruct *date_font; - XFontStruct *button_font; - XFontStruct *uname_font; - - Pixel foreground; - Pixel background; - Pixel border; - Pixel passwd_foreground; - Pixel passwd_background; - Pixel thermo_foreground; - Pixel thermo_background; - Pixel shadow_top; - Pixel shadow_bottom; - Pixel button_foreground; - Pixel button_background; - - Dimension preferred_logo_width, logo_width; - Dimension preferred_logo_height, logo_height; - Dimension thermo_width; - Dimension internal_border; - Dimension shadow_width; - - Dimension passwd_field_x, passwd_field_y; - Dimension passwd_field_width, passwd_field_height; - - Dimension unlock_button_x, unlock_button_y; - Dimension unlock_button_width, unlock_button_height; - - Dimension login_button_x, login_button_y; - Dimension login_button_width, login_button_height; - - Dimension thermo_field_x, thermo_field_y; - Dimension thermo_field_height; - - Pixmap logo_pixmap; - Pixmap logo_clipmask; - int logo_npixels; - unsigned long *logo_pixels; - - Cursor passwd_cursor; - Bool unlock_button_down_p; - Bool login_button_down_p; - Bool login_button_p; - Bool login_button_enabled_p; - Bool button_state_changed_p; /* Refers to both buttons */ - - Pixmap save_under; - Pixmap user_entry_pixmap; -}; - -static void draw_passwd_window (saver_info *si); -static void update_passwd_window (saver_info *si, const char *printed_passwd, - float ratio); -static void destroy_passwd_window (saver_info *si); -static void undo_vp_motion (saver_info *si); -static void finished_typing_passwd (saver_info *si, passwd_dialog_data *pw); -static void cleanup_passwd_window (saver_info *si); -static void restore_background (saver_info *si); - -extern void xss_authenticate(saver_info *si, Bool verbose_p); - -static int -new_passwd_window (saver_info *si) -{ - passwd_dialog_data *pw; - Screen *screen; - Colormap cmap; - saver_screen_info *ssi = &si->screens [mouse_screen (si)]; - - pw = (passwd_dialog_data *) calloc (1, sizeof(*pw)); - if (!pw) - return -1; - - /* Display the button only if the "newLoginCommand" pref is non-null. - */ - pw->login_button_p = (si->prefs.new_login_command && - *si->prefs.new_login_command); - - pw->passwd_cursor = XCreateFontCursor (si->dpy, XC_top_left_arrow); - - pw->prompt_screen = ssi; - - screen = pw->prompt_screen->screen; - cmap = DefaultColormapOfScreen (screen); - - pw->show_stars_p = get_boolean_resource(si->dpy, "passwd.asterisks", - "Boolean"); - - pw->heading_label = get_string_resource (si->dpy, "passwd.heading.label", - "Dialog.Label.Label"); - pw->body_label = get_string_resource (si->dpy, "passwd.body.label", - "Dialog.Label.Label"); - pw->user_label = get_string_resource (si->dpy, "passwd.user.label", - "Dialog.Label.Label"); - pw->unlock_label = get_string_resource (si->dpy, "passwd.unlock.label", - "Dialog.Button.Label"); - pw->login_label = get_string_resource (si->dpy, "passwd.login.label", - "Dialog.Button.Label"); - - pw->date_label = get_string_resource (si->dpy, "dateFormat", "DateFormat"); - - if (!pw->heading_label) - pw->heading_label = strdup("ERROR: RESOURCES NOT INSTALLED CORRECTLY"); - if (!pw->body_label) - pw->body_label = strdup("ERROR: RESOURCES NOT INSTALLED CORRECTLY"); - if (!pw->user_label) pw->user_label = strdup("ERROR"); - if (!pw->date_label) pw->date_label = strdup("ERROR"); - if (!pw->unlock_label) pw->unlock_label = strdup("ERROR (UNLOCK)"); - if (!pw->login_label) pw->login_label = strdup ("ERROR (LOGIN)") ; - - /* Put the version number in the label. */ - { - char *s = (char *) malloc (strlen(pw->heading_label) + 20); - sprintf(s, pw->heading_label, si->version); - free (pw->heading_label); - pw->heading_label = s; - } - - /* Get hostname info */ - pw->uname_label = strdup(""); /* Initialy, write nothing */ - -# ifdef HAVE_UNAME - { - struct utsname uts; - - if (uname (&uts) == 0) - { -#if 0 /* Get the full hostname */ - { - char *s; - if ((s = strchr(uts.nodename, '.'))) - *s = 0; - } -#endif - char *s = strdup (uts.nodename); - free (pw->uname_label); - pw->uname_label = s; - } - } -# endif - - pw->passwd_string = strdup(""); - - pw->heading_font = - splash_load_font (si->dpy, "passwd.headingFont", "Dialog.Font"); - pw->button_font = - splash_load_font (si->dpy, "passwd.buttonFont", "Dialog.Font"); - pw->body_font = - splash_load_font (si->dpy, "passwd.bodyFont", "Dialog.Font"); - pw->label_font = - splash_load_font (si->dpy, "passwd.labelFont", "Dialog.Font"); - pw->passwd_font = - splash_load_font (si->dpy, "passwd.passwdFont", "Dialog.Font"); - pw->date_font = - splash_load_font (si->dpy, "passwd.dateFont", "Dialog.Font"); - pw->uname_font = - splash_load_font (si->dpy, "passwd.unameFont", "Dialog.Font"); - - pw->show_uname_p = get_boolean_resource(si->dpy, "passwd.uname", "Boolean"); - - pw->foreground = get_pixel_resource (si->dpy, cmap, - "passwd.foreground", - "Dialog.Foreground" ); - pw->background = get_pixel_resource (si->dpy, cmap, - "passwd.background", - "Dialog.Background" ); - pw->border = get_pixel_resource (si->dpy, cmap, - "passwd.borderColor", - "Dialog.borderColor"); - - if (pw->foreground == pw->background) - { - /* Make sure the error messages show up. */ - pw->foreground = BlackPixelOfScreen (screen); - pw->background = WhitePixelOfScreen (screen); - } - - pw->passwd_foreground = get_pixel_resource (si->dpy, cmap, - "passwd.text.foreground", - "Dialog.Text.Foreground" ); - pw->passwd_background = get_pixel_resource (si->dpy, cmap, - "passwd.text.background", - "Dialog.Text.Background" ); - pw->button_foreground = get_pixel_resource (si->dpy, cmap, - "splash.Button.foreground", - "Dialog.Button.Foreground" ); - pw->button_background = get_pixel_resource (si->dpy, cmap, - "splash.Button.background", - "Dialog.Button.Background" ); - pw->thermo_foreground = get_pixel_resource (si->dpy, cmap, - "passwd.thermometer.foreground", - "Dialog.Thermometer.Foreground"); - pw->thermo_background = get_pixel_resource ( si->dpy, cmap, - "passwd.thermometer.background", - "Dialog.Thermometer.Background"); - pw->shadow_top = get_pixel_resource ( si->dpy, cmap, - "passwd.topShadowColor", - "Dialog.Foreground" ); - pw->shadow_bottom = get_pixel_resource (si->dpy, cmap, - "passwd.bottomShadowColor", - "Dialog.Background" ); - - pw->preferred_logo_width = get_integer_resource (si->dpy, - "passwd.logo.width", - "Dialog.Logo.Width"); - pw->preferred_logo_height = get_integer_resource (si->dpy, - "passwd.logo.height", - "Dialog.Logo.Height"); - pw->thermo_width = get_integer_resource (si->dpy, "passwd.thermometer.width", - "Dialog.Thermometer.Width"); - pw->internal_border = get_integer_resource (si->dpy, - "passwd.internalBorderWidth", - "Dialog.InternalBorderWidth"); - pw->shadow_width = get_integer_resource (si->dpy, "passwd.shadowThickness", - "Dialog.ShadowThickness"); - - if (pw->preferred_logo_width == 0) pw->preferred_logo_width = 150; - if (pw->preferred_logo_height == 0) pw->preferred_logo_height = 150; - if (pw->internal_border == 0) pw->internal_border = 15; - if (pw->shadow_width == 0) pw->shadow_width = 4; - if (pw->thermo_width == 0) pw->thermo_width = pw->shadow_width; - - - /* We need to remember the mouse position and restore it afterward, or - sometimes (perhaps only with Xinerama?) the mouse gets warped to - inside the bounds of the lock dialog window. - */ - { - Window pointer_root, pointer_child; - int root_x, root_y, win_x, win_y; - unsigned int mask; - pw->previous_mouse_x = 0; - pw->previous_mouse_y = 0; - if (XQueryPointer (si->dpy, RootWindowOfScreen (pw->prompt_screen->screen), - &pointer_root, &pointer_child, - &root_x, &root_y, &win_x, &win_y, &mask)) - { - pw->previous_mouse_x = root_x; - pw->previous_mouse_y = root_y; - if (si->prefs.verbose_p) - fprintf (stderr, "%s: %d: mouse is at %d,%d.\n", - blurb(), pw->prompt_screen->number, - pw->previous_mouse_x, pw->previous_mouse_y); - } - else if (si->prefs.verbose_p) - fprintf (stderr, "%s: %d: unable to determine mouse position?\n", - blurb(), pw->prompt_screen->number); - } - - /* Before mapping the window, save a pixmap of the current screen. - When we lower the window, we restore these bits. This works, - because the running screenhack has already been sent SIGSTOP, so - we know nothing else is drawing right now! */ - { - XGCValues gcv; - GC gc; - pw->save_under = XCreatePixmap (si->dpy, - pw->prompt_screen->screensaver_window, - pw->prompt_screen->width, - pw->prompt_screen->height, - pw->prompt_screen->current_depth); - gcv.function = GXcopy; - gc = XCreateGC (si->dpy, pw->save_under, GCFunction, &gcv); - XCopyArea (si->dpy, pw->prompt_screen->screensaver_window, - pw->save_under, gc, - 0, 0, - pw->prompt_screen->width, pw->prompt_screen->height, - 0, 0); - XFreeGC (si->dpy, gc); - } - - si->pw_data = pw; - return 0; -} - - -Bool debug_passwd_window_p = False; /* used only by test-passwd.c */ - - -/** - * info_msg and prompt may be NULL. - */ -static int -make_passwd_window (saver_info *si, - const char *info_msg, - const char *prompt, - Bool echo) -{ - XSetWindowAttributes attrs; - unsigned long attrmask = 0; - passwd_dialog_data *pw; - Screen *screen; - Colormap cmap; - Dimension max_string_width_px; - saver_screen_info *ssi = &si->screens [mouse_screen (si)]; - - cleanup_passwd_window (si); - - if (! ssi) /* WTF? Trying to prompt while no screens connected? */ - return -1; - - if (!si->pw_data) - if (new_passwd_window (si) < 0) - return -1; - - if (!(pw = si->pw_data)) - return -1; - - pw->ratio = 1.0; - - pw->prompt_screen = ssi; - if (si->prefs.verbose_p) - fprintf (stderr, "%s: %d: creating password dialog (\"%s\")\n", - blurb(), pw->prompt_screen->number, - info_msg ? info_msg : ""); - - screen = pw->prompt_screen->screen; - cmap = DefaultColormapOfScreen (screen); - - pw->echo_input = echo; - - max_string_width_px = ssi->width - - pw->shadow_width * 4 - - pw->border_width * 2 - - pw->thermo_width - - pw->preferred_logo_width - - pw->internal_border * 2; - /* As the string wraps it makes the window taller which makes the logo wider - * which leaves less room for the text which makes the string wrap. Uh-oh, a - * loop. By wrapping at a bit less than the available width, there's some - * room for the dialog to grow without going off the edge of the screen. */ - max_string_width_px *= 0.75; - - if (!info_msg && senesculent_p()) - info_msg = ("\n" - "This version of XScreenSaver\n" - "is very old! Please upgrade!\n"); - - pw->info_label = mlstring_new(info_msg ? info_msg : pw->body_label, - pw->label_font, max_string_width_px); - - { - int direction, ascent, descent; - XCharStruct overall; - - pw->width = 0; - pw->height = 0; - - /* Measure the heading_label. */ - XTextExtents (pw->heading_font, - pw->heading_label, strlen(pw->heading_label), - &direction, &ascent, &descent, &overall); - if (overall.width > pw->width) pw->width = overall.width; - pw->height += ascent + descent; - - /* Measure the uname_label. */ - if ((strlen(pw->uname_label)) && pw->show_uname_p) - { - XTextExtents (pw->uname_font, - pw->uname_label, strlen(pw->uname_label), - &direction, &ascent, &descent, &overall); - if (overall.width > pw->width) pw->width = overall.width; - pw->height += ascent + descent; - } - - { - Dimension w2 = 0, w3 = 0, button_w = 0; - Dimension h2 = 0, h3 = 0, button_h = 0; - const char *passwd_string = SAMPLE_INPUT; - - /* Measure the user_label. */ - XTextExtents (pw->label_font, - pw->user_label, strlen(pw->user_label), - &direction, &ascent, &descent, &overall); - if (overall.width > w2) w2 = overall.width; - h2 += ascent + descent; - - /* Measure the info_label. */ - if (pw->info_label->overall_width > pw->width) - pw->width = pw->info_label->overall_width; - h2 += pw->info_label->overall_height; - - /* Measure the user string. */ - XTextExtents (pw->passwd_font, - si->user, strlen(si->user), - &direction, &ascent, &descent, &overall); - overall.width += (pw->shadow_width * 4); - ascent += (pw->shadow_width * 4); - if (overall.width > w3) w3 = overall.width; - h3 += ascent + descent; - - /* Measure the (dummy) passwd_string. */ - if (prompt) - { - XTextExtents (pw->passwd_font, - passwd_string, strlen(passwd_string), - &direction, &ascent, &descent, &overall); - overall.width += (pw->shadow_width * 4); - ascent += (pw->shadow_width * 4); - if (overall.width > w3) w3 = overall.width; - h3 += ascent + descent; - - /* Measure the prompt_label. */ - max_string_width_px -= w3; - pw->prompt_label = mlstring_new (prompt, pw->label_font, - max_string_width_px); - - if (pw->prompt_label->overall_width > w2) - w2 = pw->prompt_label->overall_width; - - h2 += pw->prompt_label->overall_height; - - w2 = w2 + w3 + (pw->shadow_width * 2); - h2 = MAX (h2, h3); - } - - /* The "Unlock" button. */ - XTextExtents (pw->label_font, - pw->unlock_label, strlen(pw->unlock_label), - &direction, &ascent, &descent, &overall); - button_w = overall.width; - button_h = ascent + descent; - - /* Add some horizontal padding inside the button. */ - button_w += ascent; - - button_w += ((ascent + descent) / 2) + (pw->shadow_width * 2); - button_h += ((ascent + descent) / 2) + (pw->shadow_width * 2); - - pw->unlock_button_width = button_w; - pw->unlock_button_height = button_h; - - w2 = MAX (w2, button_w); - h2 += button_h * 1.5; - - /* The "New Login" button */ - pw->login_button_width = 0; - pw->login_button_height = 0; - - if (pw->login_button_p) - { - pw->login_button_enabled_p = True; - - /* Measure the "New Login" button */ - XTextExtents (pw->button_font, pw->login_label, - strlen (pw->login_label), - &direction, &ascent, &descent, &overall); - button_w = overall.width; - button_h = ascent + descent; - - /* Add some horizontal padding inside the buttons. */ - button_w += ascent; - - button_w += ((ascent + descent) / 2) + (pw->shadow_width * 2); - button_h += ((ascent + descent) / 2) + (pw->shadow_width * 2); - - pw->login_button_width = button_w; - pw->login_button_height = button_h; - - if (button_h > pw->unlock_button_height) - h2 += (button_h * 1.5 - pw->unlock_button_height * 1.5); - - /* Use (2 * shadow_width) spacing between the buttons. Another - (2 * shadow_width) is required to account for button shadows. */ - w2 = MAX (w2, - button_w + pw->unlock_button_width + - (pw->shadow_width * 4)); - } - - if (w2 > pw->width) pw->width = w2; - pw->height += h2; - } - - pw->width += (pw->internal_border * 2); - pw->height += (pw->internal_border * 4); - - pw->width += pw->thermo_width + (pw->shadow_width * 3); - - if (pw->preferred_logo_height > pw->height) - pw->height = pw->logo_height = pw->preferred_logo_height; - else if (pw->height > pw->preferred_logo_height) - pw->logo_height = pw->height; - - pw->logo_width = pw->logo_height; - - pw->width += pw->logo_width; - } - - attrmask |= CWOverrideRedirect; attrs.override_redirect = True; - - if (debug_passwd_window_p) - attrs.override_redirect = False; /* kludge for test-passwd.c */ - - attrmask |= CWEventMask; - attrs.event_mask = (ExposureMask | KeyPressMask | - ButtonPressMask | ButtonReleaseMask); - - /* Figure out where on the desktop to place the window so that it will - actually be visible; this takes into account virtual viewports as - well as Xinerama. */ - { - saver_screen_info *ssi = &si->screens [mouse_screen (si)]; - int x = ssi->x; - int y = ssi->y; - int w = ssi->width; - int h = ssi->height; - if (si->prefs.debug_p) w /= 2; - pw->x = x + ((w + pw->width) / 2) - pw->width; - pw->y = y + ((h + pw->height) / 2) - pw->height; - if (pw->x < x) pw->x = x; - if (pw->y < y) pw->y = y; - } - - pw->border_width = get_integer_resource (si->dpy, "passwd.borderWidth", - "Dialog.BorderWidth"); - - /* Only create the window the first time around */ - if (!si->passwd_dialog) - { - si->passwd_dialog = - XCreateWindow (si->dpy, - RootWindowOfScreen(screen), - pw->x, pw->y, pw->width, pw->height, pw->border_width, - DefaultDepthOfScreen (screen), InputOutput, - DefaultVisualOfScreen(screen), - attrmask, &attrs); - XSetWindowBackground (si->dpy, si->passwd_dialog, pw->background); - XSetWindowBorder (si->dpy, si->passwd_dialog, pw->border); - - /* We use the default visual, not ssi->visual, so that the logo pixmap's - visual matches that of the si->passwd_dialog window. */ - pw->logo_pixmap = xscreensaver_logo (ssi->screen, - /* ssi->current_visual, */ - DefaultVisualOfScreen(screen), - si->passwd_dialog, cmap, - pw->background, - &pw->logo_pixels, &pw->logo_npixels, - &pw->logo_clipmask, True); - } - else /* On successive prompts, just resize the window */ - { - XWindowChanges wc; - unsigned int mask = CWX | CWY | CWWidth | CWHeight; - - wc.x = pw->x; - wc.y = pw->y; - wc.width = pw->width; - wc.height = pw->height; - - XConfigureWindow (si->dpy, si->passwd_dialog, mask, &wc); - } - - restore_background(si); - - XMapRaised (si->dpy, si->passwd_dialog); - XSync (si->dpy, False); - - move_mouse_grab (si, si->passwd_dialog, - pw->passwd_cursor, - pw->prompt_screen->number); - undo_vp_motion (si); - - si->pw_data = pw; - - if (cmap) - XInstallColormap (si->dpy, cmap); - draw_passwd_window (si); - - return 0; -} - - -static void -draw_passwd_window (saver_info *si) -{ - passwd_dialog_data *pw = si->pw_data; - XGCValues gcv; - GC gc1, gc2; - int spacing, height; - int x1, x2, x3, y1, y2; - int sw; - int tb_height; - - /* Force redraw */ - pw->passwd_changed_p = True; - pw->button_state_changed_p = True; - - /* This height is the height of all the elements, not to be confused with - * the overall window height which is pw->height. It is used to compute - * the amount of spacing (padding) between elements. */ - height = (pw->heading_font->ascent + pw->heading_font->descent + - pw->info_label->overall_height + - MAX (((pw->label_font->ascent + pw->label_font->descent) + - (pw->prompt_label ? pw->prompt_label->overall_height : 0)), - ((pw->passwd_font->ascent + pw->passwd_font->descent) + - (pw->shadow_width * 2)) * (pw->prompt_label ? 2 : 1)) + - pw->date_font->ascent + pw->date_font->descent); - - if ((strlen(pw->uname_label)) && pw->show_uname_p) - height += (pw->uname_font->ascent + pw->uname_font->descent); - - height += ((pw->button_font->ascent + pw->button_font->descent) * 2 + - 2 * pw->shadow_width); - - spacing = ((pw->height - 2 * pw->shadow_width - - pw->internal_border - height) - / 10); - - if (spacing < 0) spacing = 0; - - gcv.foreground = pw->foreground; - gc1 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground, &gcv); - gc2 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground, &gcv); - x1 = pw->logo_width + pw->thermo_width + (pw->shadow_width * 3); - x3 = pw->width - (pw->shadow_width * 2); - y1 = (pw->shadow_width * 2) + spacing + spacing; - - /* top heading - */ - XSetFont (si->dpy, gc1, pw->heading_font->fid); - sw = string_width (pw->heading_font, pw->heading_label); - x2 = (x1 + ((x3 - x1 - sw) / 2)); - y1 += spacing + pw->heading_font->ascent + pw->heading_font->descent; - XDrawString (si->dpy, si->passwd_dialog, gc1, x2, y1, - pw->heading_label, strlen(pw->heading_label)); - - /* uname below top heading - */ - if ((strlen(pw->uname_label)) && pw->show_uname_p) - { - XSetFont (si->dpy, gc1, pw->uname_font->fid); - y1 += spacing + pw->uname_font->ascent + pw->uname_font->descent; - sw = string_width (pw->uname_font, pw->uname_label); - x2 = (x1 + ((x3 - x1 - sw) / 2)); - XDrawString (si->dpy, si->passwd_dialog, gc1, x2, y1, - pw->uname_label, strlen(pw->uname_label)); - } - - /* the info_label (below uname) - */ - x2 = (x1 + ((x3 - x1 - pw->info_label->overall_width) / 2)); - y1 += spacing + pw->info_label->font_height / 2; - mlstring_draw(si->dpy, si->passwd_dialog, gc1, pw->info_label, - x2, y1); - y1 += pw->info_label->overall_height; - - - tb_height = (pw->passwd_font->ascent + pw->passwd_font->descent + - (pw->shadow_width * 4)); - - /* the "User:" prompt - */ - y2 = y1; - XSetForeground (si->dpy, gc1, pw->foreground); - XSetFont (si->dpy, gc1, pw->label_font->fid); - y1 += (spacing + tb_height + pw->shadow_width); - x2 = (x1 + pw->internal_border + - MAX(string_width (pw->label_font, pw->user_label), - pw->prompt_label ? pw->prompt_label->overall_width : 0)); - XDrawString (si->dpy, si->passwd_dialog, gc1, - x2 - string_width (pw->label_font, pw->user_label), - y1 - pw->passwd_font->descent, - pw->user_label, strlen(pw->user_label)); - - /* the prompt_label prompt - */ - if (pw->prompt_label) - { - y1 += tb_height - pw->label_font->ascent + pw->shadow_width; - mlstring_draw(si->dpy, si->passwd_dialog, gc1, pw->prompt_label, - x2 - pw->prompt_label->overall_width, y1); - } - - /* the "user name" text field - */ - y1 = y2; - XSetForeground (si->dpy, gc1, pw->passwd_foreground); - XSetForeground (si->dpy, gc2, pw->passwd_background); - XSetFont (si->dpy, gc1, pw->passwd_font->fid); - y1 += (spacing + tb_height); - x2 += (pw->shadow_width * 4); - - pw->passwd_field_width = x3 - x2 - pw->internal_border; - pw->passwd_field_height = (pw->passwd_font->ascent + - pw->passwd_font->descent + - pw->shadow_width); - - XFillRectangle (si->dpy, si->passwd_dialog, gc2, - x2 - pw->shadow_width, - y1 - (pw->passwd_font->ascent + pw->passwd_font->descent), - pw->passwd_field_width, pw->passwd_field_height); - XDrawString (si->dpy, si->passwd_dialog, gc1, - x2, - y1 - pw->passwd_font->descent, - si->user, strlen(si->user)); - - /* the password/prompt text field - */ - if (pw->prompt_label) - { - y1 += (spacing + pw->prompt_label->overall_height + pw->shadow_width*2); - - pw->passwd_field_x = x2 - pw->shadow_width; - pw->passwd_field_y = y1 - (pw->passwd_font->ascent + - pw->passwd_font->descent); - } - - /* The shadow around the text fields - */ - y1 = y2; - y1 += (spacing + (pw->shadow_width * 3)); - x1 = x2 - (pw->shadow_width * 2); - x2 = pw->passwd_field_width + (pw->shadow_width * 2); - y2 = pw->passwd_field_height + (pw->shadow_width * 2); - - draw_shaded_rectangle (si->dpy, si->passwd_dialog, - x1, y1, x2, y2, - pw->shadow_width, - pw->shadow_bottom, pw->shadow_top); - - if (pw->prompt_label) - { - y1 += (spacing + pw->prompt_label->overall_height + pw->shadow_width*2); - draw_shaded_rectangle (si->dpy, si->passwd_dialog, - x1, y1, x2, y2, - pw->shadow_width, - pw->shadow_bottom, pw->shadow_top); - } - - - /* The date, below the text fields - */ - { - char buf[100]; - time_t now = time ((time_t *) 0); - struct tm *tm = localtime (&now); - memset (buf, 0, sizeof(buf)); - strftime (buf, sizeof(buf)-1, pw->date_label, tm); - - XSetForeground (si->dpy, gc1, pw->foreground); - XSetFont (si->dpy, gc1, pw->date_font->fid); - y1 += pw->shadow_width; - y1 += (spacing + tb_height); - y1 += spacing/2; - sw = string_width (pw->date_font, buf); - x2 = x1 + x2 - sw; - XDrawString (si->dpy, si->passwd_dialog, gc1, x2, y1, buf, strlen(buf)); - } - - /* Set up the GCs for the "New Login" and "Unlock" buttons. - */ - XSetForeground(si->dpy, gc1, pw->button_foreground); - XSetForeground(si->dpy, gc2, pw->button_background); - XSetFont(si->dpy, gc1, pw->button_font->fid); - - /* The "Unlock" button */ - x2 = pw->width - pw->internal_border - (pw->shadow_width * 2); - - /* right aligned button */ - x1 = x2 - pw->unlock_button_width; - - /* Add half the difference between y1 and the internal edge. - * It actually looks better if the internal border is ignored. */ - y1 += ((pw->height - MAX (pw->unlock_button_height, pw->login_button_height) - - spacing - y1) - / 2); - - pw->unlock_button_x = x1; - pw->unlock_button_y = y1; - - /* The "New Login" button - */ - if (pw->login_button_p) - { - /* Using the same GC as for the Unlock button */ - - sw = string_width (pw->button_font, pw->login_label); - - /* left aligned button */ - x1 = (pw->logo_width + pw->thermo_width + (pw->shadow_width * 3) + - pw->internal_border); - - pw->login_button_x = x1; - pw->login_button_y = y1; - } - - /* The logo - */ - x1 = pw->shadow_width * 6; - y1 = pw->shadow_width * 6; - x2 = pw->logo_width - (pw->shadow_width * 12); - y2 = pw->logo_height - (pw->shadow_width * 12); - - if (pw->logo_pixmap) - { - Window root; - int x, y; - unsigned int w, h, bw, d; - XGetGeometry (si->dpy, pw->logo_pixmap, &root, &x, &y, &w, &h, &bw, &d); - XSetForeground (si->dpy, gc1, pw->foreground); - XSetBackground (si->dpy, gc1, pw->background); - XSetClipMask (si->dpy, gc1, pw->logo_clipmask); - XSetClipOrigin (si->dpy, gc1, - x1 + ((x2 - (int)w) / 2), - y1 + ((y2 - (int)h) / 2)); - if (d == 1) - XCopyPlane (si->dpy, pw->logo_pixmap, si->passwd_dialog, gc1, - 0, 0, w, h, - x1 + ((x2 - (int)w) / 2), - y1 + ((y2 - (int)h) / 2), - 1); - else - XCopyArea (si->dpy, pw->logo_pixmap, si->passwd_dialog, gc1, - 0, 0, w, h, - x1 + ((x2 - (int)w) / 2), - y1 + ((y2 - (int)h) / 2)); - } - - /* The thermometer - */ - XSetForeground (si->dpy, gc1, pw->thermo_foreground); - XSetForeground (si->dpy, gc2, pw->thermo_background); - - pw->thermo_field_x = pw->logo_width + pw->shadow_width; - pw->thermo_field_y = pw->shadow_width * 5; - pw->thermo_field_height = pw->height - (pw->shadow_width * 10); - -#if 0 - /* Solid border inside the logo box. */ - XSetForeground (si->dpy, gc1, pw->foreground); - XDrawRectangle (si->dpy, si->passwd_dialog, gc1, x1, y1, x2-1, y2-1); -#endif - - /* The shadow around the logo - */ - draw_shaded_rectangle (si->dpy, si->passwd_dialog, - pw->shadow_width * 4, - pw->shadow_width * 4, - pw->logo_width - (pw->shadow_width * 8), - pw->logo_height - (pw->shadow_width * 8), - pw->shadow_width, - pw->shadow_bottom, pw->shadow_top); - - /* The shadow around the thermometer - */ - draw_shaded_rectangle (si->dpy, si->passwd_dialog, - pw->logo_width, - pw->shadow_width * 4, - pw->thermo_width + (pw->shadow_width * 2), - pw->height - (pw->shadow_width * 8), - pw->shadow_width, - pw->shadow_bottom, pw->shadow_top); - -#if 1 - /* Solid border inside the thermometer. */ - XSetForeground (si->dpy, gc1, pw->foreground); - XDrawRectangle (si->dpy, si->passwd_dialog, gc1, - pw->thermo_field_x, pw->thermo_field_y, - pw->thermo_width - 1, pw->thermo_field_height - 1); -#endif - - /* The shadow around the whole window - */ - draw_shaded_rectangle (si->dpy, si->passwd_dialog, - 0, 0, pw->width, pw->height, pw->shadow_width, - pw->shadow_top, pw->shadow_bottom); - - XFreeGC (si->dpy, gc1); - XFreeGC (si->dpy, gc2); - - update_passwd_window (si, pw->passwd_string, pw->ratio); -} - -static void -draw_button(Display *dpy, - Drawable dialog, - XFontStruct *font, - unsigned long foreground, unsigned long background, - char *label, - int x, int y, - int width, int height, - int shadow_width, - Pixel shadow_light, Pixel shadow_dark, - Bool button_down) -{ - XGCValues gcv; - GC gc1, gc2; - int sw; - int label_x, label_y; - - gcv.foreground = foreground; - gcv.font = font->fid; - gc1 = XCreateGC(dpy, dialog, GCForeground|GCFont, &gcv); - gcv.foreground = background; - gc2 = XCreateGC(dpy, dialog, GCForeground, &gcv); - - XFillRectangle(dpy, dialog, gc2, - x, y, width, height); - - sw = string_width(font, label); - - label_x = x + ((width - sw) / 2); - label_y = (y + (height - (font->ascent + font->descent)) / 2 + font->ascent); - - if (button_down) - { - label_x += 2; - label_y += 2; - } - - XDrawString(dpy, dialog, gc1, label_x, label_y, label, strlen(label)); - - XFreeGC(dpy, gc1); - XFreeGC(dpy, gc2); - - draw_shaded_rectangle(dpy, dialog, x, y, width, height, - shadow_width, shadow_light, shadow_dark); -} - -static void -update_passwd_window (saver_info *si, const char *printed_passwd, float ratio) -{ - passwd_dialog_data *pw = si->pw_data; - XGCValues gcv; - GC gc1, gc2; - int x, y; - XRectangle rects[1]; - - pw->ratio = ratio; - gcv.foreground = pw->passwd_foreground; - gcv.font = pw->passwd_font->fid; - gc1 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground|GCFont, &gcv); - gcv.foreground = pw->passwd_background; - gc2 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground, &gcv); - - if (printed_passwd) - { - char *s = strdup (printed_passwd); - if (pw->passwd_string) free (pw->passwd_string); - pw->passwd_string = s; - } - - if (pw->prompt_label) - { - - /* the "password" text field - */ - rects[0].x = pw->passwd_field_x; - rects[0].y = pw->passwd_field_y; - rects[0].width = pw->passwd_field_width; - rects[0].height = pw->passwd_field_height; - - /* The user entry (password) field is double buffered. - * This avoids flickering, particularly in synchronous mode. */ - - if (pw->passwd_changed_p) - { - pw->passwd_changed_p = False; - - if (pw->user_entry_pixmap) - { - XFreePixmap(si->dpy, pw->user_entry_pixmap); - pw->user_entry_pixmap = 0; - } - - pw->user_entry_pixmap = - XCreatePixmap (si->dpy, si->passwd_dialog, - rects[0].width, rects[0].height, - DefaultDepthOfScreen (pw->prompt_screen->screen)); - - XFillRectangle (si->dpy, pw->user_entry_pixmap, gc2, - 0, 0, rects[0].width, rects[0].height); - - XDrawString (si->dpy, pw->user_entry_pixmap, gc1, - pw->shadow_width, - pw->passwd_font->ascent, - pw->passwd_string, strlen(pw->passwd_string)); - - /* Ensure the new pixmap gets copied to the window */ - pw->i_beam = 0; - - } - - /* The I-beam - */ - if (pw->i_beam == 0) - { - /* Make the I-beam disappear */ - XCopyArea(si->dpy, pw->user_entry_pixmap, si->passwd_dialog, gc2, - 0, 0, rects[0].width, rects[0].height, - rects[0].x, rects[0].y); - } - else if (pw->i_beam == 1) - { - /* Make the I-beam appear */ - x = (rects[0].x + pw->shadow_width + - string_width (pw->passwd_font, pw->passwd_string)); - y = rects[0].y + pw->shadow_width; - - if (x > rects[0].x + rects[0].width - 1) - x = rects[0].x + rects[0].width - 1; - XDrawLine (si->dpy, si->passwd_dialog, gc1, - x, y, - x, y + pw->passwd_font->ascent + - pw->passwd_font->descent-1); - } - - pw->i_beam = (pw->i_beam + 1) % 4; - - } - - /* the thermometer - */ - y = (pw->thermo_field_height - 2) * (1.0 - pw->ratio); - if (y > 0) - { - XSetForeground (si->dpy, gc1, pw->thermo_background); - XFillRectangle (si->dpy, si->passwd_dialog, gc1, - pw->thermo_field_x + 1, - pw->thermo_field_y + 1, - pw->thermo_width-2, - y); - XSetForeground (si->dpy, gc1, pw->thermo_foreground); - XFillRectangle (si->dpy, si->passwd_dialog, gc1, - pw->thermo_field_x + 1, - pw->thermo_field_y + 1 + y, - pw->thermo_width-2, - MAX (0, pw->thermo_field_height - y - 2)); - } - - if (pw->button_state_changed_p) - { - pw->button_state_changed_p = False; - - /* The "Unlock" button - */ - draw_button(si->dpy, si->passwd_dialog, pw->button_font, - pw->button_foreground, pw->button_background, - pw->unlock_label, - pw->unlock_button_x, pw->unlock_button_y, - pw->unlock_button_width, pw->unlock_button_height, - pw->shadow_width, - (pw->unlock_button_down_p ? pw->shadow_bottom : - pw->shadow_top), - (pw->unlock_button_down_p ? pw->shadow_top : - pw->shadow_bottom), - pw->unlock_button_down_p); - - /* The "New Login" button - */ - if (pw->login_button_p) - { - draw_button(si->dpy, si->passwd_dialog, pw->button_font, - (pw->login_button_enabled_p - ? pw->passwd_foreground - : pw->shadow_bottom), - pw->button_background, - pw->login_label, - pw->login_button_x, pw->login_button_y, - pw->login_button_width, pw->login_button_height, - pw->shadow_width, - (pw->login_button_down_p - ? pw->shadow_bottom - : pw->shadow_top), - (pw->login_button_down_p - ? pw->shadow_top - : pw->shadow_bottom), - pw->login_button_down_p); - } - } - - XFreeGC (si->dpy, gc1); - XFreeGC (si->dpy, gc2); - XSync (si->dpy, False); -} - - -void -restore_background (saver_info *si) -{ - passwd_dialog_data *pw = si->pw_data; - saver_screen_info *ssi = pw->prompt_screen; - XGCValues gcv; - GC gc; - - gcv.function = GXcopy; - - gc = XCreateGC (si->dpy, ssi->screensaver_window, GCFunction, &gcv); - - XCopyArea (si->dpy, pw->save_under, - ssi->screensaver_window, gc, - 0, 0, - ssi->width, ssi->height, - 0, 0); - - XFreeGC (si->dpy, gc); -} - - -/* Frees anything created by make_passwd_window */ -static void -cleanup_passwd_window (saver_info *si) -{ - passwd_dialog_data *pw; - - if (!(pw = si->pw_data)) - return; - - if (pw->info_label) - { - mlstring_free(pw->info_label); - pw->info_label = 0; - } - - if (pw->prompt_label) - { - mlstring_free(pw->prompt_label); - pw->prompt_label = 0; - } - - memset (pw->typed_passwd, 0, sizeof(pw->typed_passwd)); - memset (pw->typed_passwd_char_size, 0, sizeof(pw->typed_passwd_char_size)); - memset (pw->passwd_string, 0, strlen(pw->passwd_string)); - - if (pw->timer) - { - XtRemoveTimeOut (pw->timer); - pw->timer = 0; - } - - if (pw->user_entry_pixmap) - { - XFreePixmap(si->dpy, pw->user_entry_pixmap); - pw->user_entry_pixmap = 0; - } -} - - -static void -destroy_passwd_window (saver_info *si) -{ - saver_preferences *p = &si->prefs; - passwd_dialog_data *pw = si->pw_data; - saver_screen_info *ssi = pw->prompt_screen; - Colormap cmap = DefaultColormapOfScreen (ssi->screen); - Pixel black = BlackPixelOfScreen (ssi->screen); - Pixel white = WhitePixelOfScreen (ssi->screen); - XEvent event; - - cleanup_passwd_window (si); - - if (si->cached_passwd) - { - char *wipe = si->cached_passwd; - - while (*wipe) - *wipe++ = '\0'; - - free(si->cached_passwd); - si->cached_passwd = NULL; - } - - move_mouse_grab (si, RootWindowOfScreen (ssi->screen), - ssi->cursor, ssi->number); - - if (pw->passwd_cursor) - XFreeCursor (si->dpy, pw->passwd_cursor); - - if (p->verbose_p) - fprintf (stderr, "%s: %d: moving mouse back to %d,%d.\n", - blurb(), ssi->number, - pw->previous_mouse_x, pw->previous_mouse_y); - - XWarpPointer (si->dpy, None, RootWindowOfScreen (ssi->screen), - 0, 0, 0, 0, - pw->previous_mouse_x, pw->previous_mouse_y); - XSync (si->dpy, False); - - while (XCheckMaskEvent (si->dpy, PointerMotionMask, &event)) - if (p->verbose_p) - fprintf (stderr, "%s: discarding MotionNotify event.\n", blurb()); - -#ifdef HAVE_XINPUT - if (si->using_xinput_extension && si->xinput_DeviceMotionNotify) - while (XCheckTypedEvent (si->dpy, si->xinput_DeviceMotionNotify, &event)) - if (p->verbose_p) - fprintf (stderr, "%s: discarding DeviceMotionNotify event.\n", - blurb()); -#endif - - if (si->passwd_dialog) - { - if (si->prefs.verbose_p) - fprintf (stderr, "%s: %d: destroying password dialog.\n", - blurb(), pw->prompt_screen->number); - - XDestroyWindow (si->dpy, si->passwd_dialog); - si->passwd_dialog = 0; - } - - if (pw->save_under) - { - restore_background(si); - XFreePixmap (si->dpy, pw->save_under); - pw->save_under = 0; - } - - if (pw->heading_label) free (pw->heading_label); - if (pw->body_label) free (pw->body_label); - if (pw->user_label) free (pw->user_label); - if (pw->date_label) free (pw->date_label); - if (pw->login_label) free (pw->login_label); - if (pw->unlock_label) free (pw->unlock_label); - if (pw->passwd_string) free (pw->passwd_string); - if (pw->uname_label) free (pw->uname_label); - - if (pw->heading_font) XFreeFont (si->dpy, pw->heading_font); - if (pw->body_font) XFreeFont (si->dpy, pw->body_font); - if (pw->label_font) XFreeFont (si->dpy, pw->label_font); - if (pw->passwd_font) XFreeFont (si->dpy, pw->passwd_font); - if (pw->date_font) XFreeFont (si->dpy, pw->date_font); - if (pw->button_font) XFreeFont (si->dpy, pw->button_font); - if (pw->uname_font) XFreeFont (si->dpy, pw->uname_font); - - if (pw->foreground != black && pw->foreground != white) - XFreeColors (si->dpy, cmap, &pw->foreground, 1, 0L); - if (pw->background != black && pw->background != white) - XFreeColors (si->dpy, cmap, &pw->background, 1, 0L); - if (!(pw->button_foreground == black || pw->button_foreground == white)) - XFreeColors (si->dpy, cmap, &pw->button_foreground, 1, 0L); - if (!(pw->button_background == black || pw->button_background == white)) - XFreeColors (si->dpy, cmap, &pw->button_background, 1, 0L); - if (pw->passwd_foreground != black && pw->passwd_foreground != white) - XFreeColors (si->dpy, cmap, &pw->passwd_foreground, 1, 0L); - if (pw->passwd_background != black && pw->passwd_background != white) - XFreeColors (si->dpy, cmap, &pw->passwd_background, 1, 0L); - if (pw->thermo_foreground != black && pw->thermo_foreground != white) - XFreeColors (si->dpy, cmap, &pw->thermo_foreground, 1, 0L); - if (pw->thermo_background != black && pw->thermo_background != white) - XFreeColors (si->dpy, cmap, &pw->thermo_background, 1, 0L); - if (pw->shadow_top != black && pw->shadow_top != white) - XFreeColors (si->dpy, cmap, &pw->shadow_top, 1, 0L); - if (pw->shadow_bottom != black && pw->shadow_bottom != white) - XFreeColors (si->dpy, cmap, &pw->shadow_bottom, 1, 0L); - - if (pw->logo_pixmap) - XFreePixmap (si->dpy, pw->logo_pixmap); - if (pw-> logo_clipmask) - XFreePixmap (si->dpy, pw->logo_clipmask); - if (pw->logo_pixels) - { - if (pw->logo_npixels) - XFreeColors (si->dpy, cmap, pw->logo_pixels, pw->logo_npixels, 0L); - free (pw->logo_pixels); - pw->logo_pixels = 0; - pw->logo_npixels = 0; - } - - if (pw->save_under) - XFreePixmap (si->dpy, pw->save_under); - - if (cmap) - XInstallColormap (si->dpy, cmap); - - memset (pw, 0, sizeof(*pw)); - free (pw); - si->pw_data = 0; - - si->unlock_dismiss_time = time((time_t *) 0); -} - - -#if defined(HAVE_XF86MISCSETGRABKEYSSTATE) || defined(HAVE_XF86VMODE) - -static Bool error_handler_hit_p = False; - -static int -ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) -{ - error_handler_hit_p = True; - return 0; -} - -#endif /* HAVE_XF86MISCSETGRABKEYSSTATE || HAVE_XF86VMODE */ - - -#ifdef HAVE_XHPDISABLERESET -/* This function enables and disables the C-Sh-Reset hot-key, which - normally resets the X server (logging out the logged-in user.) - We don't want random people to be able to do that while the - screen is locked. - */ -static void -hp_lock_reset (saver_info *si, Bool lock_p) -{ - static Bool hp_locked_p = False; - - /* Calls to XHPDisableReset and XHPEnableReset must be balanced, - or BadAccess errors occur. (It's ok for this to be global, - since it affects the whole machine, not just the current screen.) - */ - if (hp_locked_p == lock_p) - return; - - if (lock_p) - XHPDisableReset (si->dpy); - else - XHPEnableReset (si->dpy); - hp_locked_p = lock_p; -} -#endif /* HAVE_XHPDISABLERESET */ - - -#ifdef HAVE_XF86MISCSETGRABKEYSSTATE - -/* This function enables and disables the Ctrl-Alt-KP_star and - Ctrl-Alt-KP_slash hot-keys, which (in XFree86 4.2) break any - grabs and/or kill the grabbing client. That would effectively - unlock the screen, so we don't like that. - - The Ctrl-Alt-KP_star and Ctrl-Alt-KP_slash hot-keys only exist - if AllowDeactivateGrabs and/or AllowClosedownGrabs are turned on - in XF86Config. I believe they are disabled by default. - - This does not affect any other keys (specifically Ctrl-Alt-BS or - Ctrl-Alt-F1) but I wish it did. Maybe it will someday. - */ -static void -xfree_lock_grab_smasher (saver_info *si, Bool lock_p) -{ - saver_preferences *p = &si->prefs; - int status; - int event, error; - XErrorHandler old_handler; - - if (!XF86MiscQueryExtension(si->dpy, &event, &error)) - return; - - XSync (si->dpy, False); - error_handler_hit_p = False; - old_handler = XSetErrorHandler (ignore_all_errors_ehandler); - XSync (si->dpy, False); - status = XF86MiscSetGrabKeysState (si->dpy, !lock_p); - XSync (si->dpy, False); - if (error_handler_hit_p) status = 666; - - if (!lock_p && status == MiscExtGrabStateAlready) - status = MiscExtGrabStateSuccess; /* shut up, consider this success */ - - if (p->verbose_p && status != MiscExtGrabStateSuccess) - fprintf (stderr, "%s: error: XF86MiscSetGrabKeysState(%d) returned %s\n", - blurb(), !lock_p, - (status == MiscExtGrabStateSuccess ? "MiscExtGrabStateSuccess" : - status == MiscExtGrabStateLocked ? "MiscExtGrabStateLocked" : - status == MiscExtGrabStateAlready ? "MiscExtGrabStateAlready" : - status == 666 ? "an X error" : - "unknown value")); - - XSync (si->dpy, False); - XSetErrorHandler (old_handler); - XSync (si->dpy, False); -} -#endif /* HAVE_XF86MISCSETGRABKEYSSTATE */ - - - -/* This function enables and disables the C-Alt-Plus and C-Alt-Minus - hot-keys, which normally change the resolution of the X server. - We don't want people to be able to switch the server resolution - while the screen is locked, because if they switch to a higher - resolution, it could cause part of the underlying desktop to become - exposed. - */ -#ifdef HAVE_XF86VMODE - -static void -xfree_lock_mode_switch (saver_info *si, Bool lock_p) -{ - static Bool any_mode_locked_p = False; - saver_preferences *p = &si->prefs; - int screen; - int real_nscreens = ScreenCount (si->dpy); - int event, error; - Bool status; - XErrorHandler old_handler; - - if (any_mode_locked_p == lock_p) - return; - if (!XF86VidModeQueryExtension (si->dpy, &event, &error)) - return; - - for (screen = 0; screen < real_nscreens; screen++) - { - XSync (si->dpy, False); - old_handler = XSetErrorHandler (ignore_all_errors_ehandler); - error_handler_hit_p = False; - status = XF86VidModeLockModeSwitch (si->dpy, screen, lock_p); - XSync (si->dpy, False); - XSetErrorHandler (old_handler); - if (error_handler_hit_p) status = False; - - if (status) - any_mode_locked_p = lock_p; - - if (!status && (p->verbose_p || !lock_p)) - /* Only print this when verbose, or when we locked but can't unlock. - I tried printing this message whenever it comes up, but - mode-locking always fails if DontZoom is set in XF86Config. */ - fprintf (stderr, "%s: %d: unable to %s mode switching!\n", - blurb(), screen, (lock_p ? "lock" : "unlock")); - else if (p->verbose_p) - fprintf (stderr, "%s: %d: %s mode switching.\n", - blurb(), screen, (lock_p ? "locked" : "unlocked")); - } -} -#endif /* HAVE_XF86VMODE */ - - -/* If the viewport has been scrolled since the screen was blanked, - then scroll it back to where it belongs. This function only exists - to patch over a very brief race condition. - */ -static void -undo_vp_motion (saver_info *si) -{ -#ifdef HAVE_XF86VMODE - saver_preferences *p = &si->prefs; - int screen; - int real_nscreens = ScreenCount (si->dpy); - int event, error; - - if (!XF86VidModeQueryExtension (si->dpy, &event, &error)) - return; - - for (screen = 0; screen < real_nscreens; screen++) - { - saver_screen_info *ssi = &si->screens[screen]; - int x, y; - Bool status; - - if (ssi->blank_vp_x == -1 && ssi->blank_vp_y == -1) - break; - if (!XF86VidModeGetViewPort (si->dpy, screen, &x, &y)) - return; - if (ssi->blank_vp_x == x && ssi->blank_vp_y == y) - return; - - /* We're going to move the viewport. The mouse has just been grabbed on - (and constrained to, thus warped to) the password window, so it is no - longer near the edge of the screen. However, wait a bit anyway, just - to make sure the server drains its last motion event, so that the - screen doesn't continue to scroll after we've reset the viewport. - */ - XSync (si->dpy, False); - usleep (250000); /* 1/4 second */ - XSync (si->dpy, False); - - status = XF86VidModeSetViewPort (si->dpy, screen, - ssi->blank_vp_x, ssi->blank_vp_y); - - if (!status) - fprintf (stderr, - "%s: %d: unable to move vp from (%d,%d) back to (%d,%d)!\n", - blurb(), screen, x, y, ssi->blank_vp_x, ssi->blank_vp_y); - else if (p->verbose_p) - fprintf (stderr, - "%s: %d: vp moved to (%d,%d); moved it back to (%d,%d).\n", - blurb(), screen, x, y, ssi->blank_vp_x, ssi->blank_vp_y); - } -#endif /* HAVE_XF86VMODE */ -} - - - -/* Interactions - */ - -static void -passwd_animate_timer (XtPointer closure, XtIntervalId *id) -{ - saver_info *si = (saver_info *) closure; - int tick = 166; - passwd_dialog_data *pw = si->pw_data; - - if (!pw) return; - - pw->ratio -= (1.0 / ((double) si->prefs.passwd_timeout / (double) tick)); - if (pw->ratio < 0) - { - pw->ratio = 0; - if (si->unlock_state == ul_read) - si->unlock_state = ul_time; - } - - update_passwd_window (si, 0, pw->ratio); - - if (si->unlock_state == ul_read) - pw->timer = XtAppAddTimeOut (si->app, tick, passwd_animate_timer, - (XtPointer) si); - else - pw->timer = 0; - - idle_timer ((XtPointer) si, 0); -} - - -static XComposeStatus *compose_status; - -static void -handle_login_button (saver_info *si, XEvent *event) -{ - saver_preferences *p = &si->prefs; - Bool mouse_in_box = False; - Bool hit_p = False; - passwd_dialog_data *pw = si->pw_data; - saver_screen_info *ssi = pw->prompt_screen; - - if (! pw->login_button_enabled_p) - return; - - mouse_in_box = - (event->xbutton.x >= pw->login_button_x && - event->xbutton.x <= pw->login_button_x + pw->login_button_width && - event->xbutton.y >= pw->login_button_y && - event->xbutton.y <= pw->login_button_y + pw->login_button_height); - - if (ButtonRelease == event->xany.type && - pw->login_button_down_p && - mouse_in_box) - { - /* Only allow them to press the button once: don't want to - accidentally launch a dozen gdm choosers if the machine - is being slow. - */ - hit_p = True; - pw->login_button_enabled_p = False; - } - - pw->login_button_down_p = (mouse_in_box && - ButtonRelease != event->xany.type); - - update_passwd_window (si, 0, pw->ratio); - - if (hit_p) - fork_and_exec (ssi, p->new_login_command); -} - - -static void -handle_unlock_button (saver_info *si, XEvent *event) -{ - Bool mouse_in_box = False; - passwd_dialog_data *pw = si->pw_data; - - mouse_in_box = - (event->xbutton.x >= pw->unlock_button_x && - event->xbutton.x <= pw->unlock_button_x + pw->unlock_button_width && - event->xbutton.y >= pw->unlock_button_y && - event->xbutton.y <= pw->unlock_button_y + pw->unlock_button_height); - - if (ButtonRelease == event->xany.type && - pw->unlock_button_down_p && - mouse_in_box) - finished_typing_passwd (si, pw); - - pw->unlock_button_down_p = (mouse_in_box && - ButtonRelease != event->xany.type); -} - - -static void -finished_typing_passwd (saver_info *si, passwd_dialog_data *pw) -{ - if (si->unlock_state == ul_read) - { - update_passwd_window (si, "Checking...", pw->ratio); - XSync (si->dpy, False); - - si->unlock_state = ul_finished; - update_passwd_window (si, "", pw->ratio); - } -} - -static void -handle_passwd_key (saver_info *si, XKeyEvent *event) -{ - passwd_dialog_data *pw = si->pw_data; - unsigned char decoded [MAX_BYTES_PER_CHAR * 10]; /* leave some slack */ - KeySym keysym = 0; - - /* XLookupString may return more than one character via XRebindKeysym; - and on some systems it returns multi-byte UTF-8 characters (contrary - to its documentation, which says it returns only Latin1.) - - It seems to only do so, however, if setlocale() has been called. - See the code inside ENABLE_NLS in xscreensaver.c. - */ - int decoded_size = XLookupString (event, (char *)decoded, sizeof(decoded), - &keysym, compose_status); - -#if 0 - { - const char *ks = XKeysymToString (keysym); - int i; - fprintf(stderr, "## %-12s\t=> %d\t", (ks ? ks : "(null)"), decoded_size); - for (i = 0; i < decoded_size; i++) - fprintf(stderr, "%c", decoded[i]); - fprintf(stderr, "\t"); - for (i = 0; i < decoded_size; i++) - fprintf(stderr, "\\%03o", ((unsigned char *)decoded)[i]); - fprintf(stderr, "\n"); - } -#endif - - if (decoded_size > MAX_BYTES_PER_CHAR) - { - /* The multi-byte character returned is too large. */ - XBell (si->dpy, 0); - return; - } - - decoded[decoded_size] = 0; - pw->passwd_changed_p = True; - - /* Add 10% to the time remaining every time a key is pressed. */ - pw->ratio += 0.1; - if (pw->ratio > 1) pw->ratio = 1; - - if (decoded_size == 1) /* Handle single-char commands */ - { - switch (*decoded) - { - case '\010': case '\177': /* Backspace */ - { - /* kludgey way to get the number of "logical" characters. */ - int nchars = strlen (pw->typed_passwd_char_size); - int nbytes = strlen (pw->typed_passwd); - if (nbytes <= 0) - XBell (si->dpy, 0); - else - { - int i; - for (i = pw->typed_passwd_char_size[nchars-1]; i >= 0; i--) - { - if (nbytes < 0) abort(); - pw->typed_passwd[nbytes--] = 0; - } - pw->typed_passwd_char_size[nchars-1] = 0; - } - } - break; - - case '\012': case '\015': /* Enter */ - finished_typing_passwd (si, pw); - break; - - case '\033': /* Escape */ - si->unlock_state = ul_cancel; - break; - - case '\025': case '\030': /* Erase line */ - memset (pw->typed_passwd, 0, sizeof (pw->typed_passwd)); - memset (pw->typed_passwd_char_size, 0, - sizeof (pw->typed_passwd_char_size)); - break; - - default: - if (*decoded < ' ' && *decoded != '\t') /* Other ctrl char */ - XBell (si->dpy, 0); - else - goto SELF_INSERT; - break; - } - } - else - { - int nbytes, nchars; - SELF_INSERT: - nbytes = strlen (pw->typed_passwd); - nchars = strlen (pw->typed_passwd_char_size); - if (nchars + 1 >= sizeof (pw->typed_passwd_char_size)-1 || - nbytes + decoded_size >= sizeof (pw->typed_passwd)-1) /* overflow */ - XBell (si->dpy, 0); - else - { - pw->typed_passwd_char_size[nchars] = decoded_size; - pw->typed_passwd_char_size[nchars+1] = 0; - memcpy (pw->typed_passwd + nbytes, decoded, decoded_size); - pw->typed_passwd[nbytes + decoded_size] = 0; - } - } - - if (pw->echo_input) - { - /* If the input is wider than the text box, only show the last portion, - to simulate a horizontally-scrolling text field. */ - int chars_in_pwfield = (pw->passwd_field_width / - pw->passwd_font->max_bounds.width); - const char *output = pw->typed_passwd; - if (strlen(output) > chars_in_pwfield) - output += (strlen(output) - chars_in_pwfield); - update_passwd_window (si, output, pw->ratio); - } - else if (pw->show_stars_p) - { - int nchars = strlen (pw->typed_passwd_char_size); - char *stars = 0; - stars = (char *) malloc(nchars + 1); - memset (stars, '*', nchars); - stars[nchars] = 0; - update_passwd_window (si, stars, pw->ratio); - free (stars); - } - else - { - update_passwd_window (si, "", pw->ratio); - } -} - - -static void -passwd_event_loop (saver_info *si) -{ - saver_preferences *p = &si->prefs; - char *msg = 0; - - /* We have to go through this union bullshit because gcc-4.4.0 has - stricter struct-aliasing rules. Without this, the optimizer - can fuck things up. - */ - union { - XEvent x_event; -# ifdef HAVE_RANDR - XRRScreenChangeNotifyEvent xrr_event; -# endif /* HAVE_RANDR */ - } event; - - passwd_animate_timer ((XtPointer) si, 0); - reset_watchdog_timer (si, False); /* Disable watchdog while dialog up */ - - while (si->unlock_state == ul_read) - { - XtAppNextEvent (si->app, &event.x_event); - -#ifdef HAVE_RANDR - if (si->using_randr_extension && - (event.x_event.type == - (si->randr_event_number + RRScreenChangeNotify))) - { - /* The Resize and Rotate extension sends an event when the - size, rotation, or refresh rate of any screen has changed. */ - - if (p->verbose_p) - { - /* XRRRootToScreen is in Xrandr.h 1.4, 2001/06/07 */ - int screen = XRRRootToScreen(si->dpy, event.xrr_event.window); - fprintf (stderr, "%s: %d: screen change event received\n", - blurb(), screen); - } - -#ifdef RRScreenChangeNotifyMask - /* Inform Xlib that it's ok to update its data structures. */ - XRRUpdateConfiguration(&event.x_event); /* Xrandr.h 1.9, 2002/09/29*/ -#endif /* RRScreenChangeNotifyMask */ - - /* Resize the existing xscreensaver windows and cached ssi data. */ - if (update_screen_layout (si)) - { - if (p->verbose_p) - { - fprintf (stderr, "%s: new layout:\n", blurb()); - describe_monitor_layout (si); - } - resize_screensaver_window (si); - } - } - else -#endif /* HAVE_RANDR */ - - if (event.x_event.xany.window == si->passwd_dialog && - event.x_event.xany.type == Expose) - draw_passwd_window (si); - else if (event.x_event.xany.type == KeyPress) - { - handle_passwd_key (si, &event.x_event.xkey); - si->pw_data->caps_p = (event.x_event.xkey.state & LockMask); - } - else if (event.x_event.xany.type == ButtonPress || - event.x_event.xany.type == ButtonRelease) - { - si->pw_data->button_state_changed_p = True; - handle_unlock_button (si, &event.x_event); - if (si->pw_data->login_button_p) - handle_login_button (si, &event.x_event); - } - else if (event.x_event.xany.type == ClientMessage && - event.x_event.xclient.message_type == XA_SCREENSAVER && - event.x_event.xclient.format == 32) - { - const char *msg = - "ClientMessage ignored while authentication dialog is active"; - clientmessage_response (si, event.x_event.xclient.window, - True, msg, msg); - } - else - XtDispatchEvent (&event.x_event); - } - - switch (si->unlock_state) - { - case ul_cancel: msg = ""; break; - case ul_time: msg = "Timed out!"; break; - case ul_finished: msg = "Checking..."; break; - default: msg = 0; break; - } - - if (p->verbose_p) - switch (si->unlock_state) { - case ul_cancel: - fprintf (stderr, "%s: input cancelled.\n", blurb()); break; - case ul_time: - fprintf (stderr, "%s: input timed out.\n", blurb()); break; - case ul_finished: - fprintf (stderr, "%s: input finished.\n", blurb()); break; - default: break; - } - - if (msg) - { - si->pw_data->i_beam = 0; - update_passwd_window (si, msg, 0.0); - XSync (si->dpy, False); - - /* Swallow all pending KeyPress/KeyRelease events. */ - { - XEvent e; - while (XCheckMaskEvent (si->dpy, KeyPressMask|KeyReleaseMask, &e)) - ; - } - } - - reset_watchdog_timer (si, True); /* Re-enable watchdog */ -} - - -static void -handle_typeahead (saver_info *si) -{ - passwd_dialog_data *pw = si->pw_data; - int i; - if (!si->unlock_typeahead) - return; - - pw->passwd_changed_p = True; - - i = strlen (si->unlock_typeahead); - if (i >= sizeof(pw->typed_passwd) - 1) - i = sizeof(pw->typed_passwd) - 1; - - memcpy (pw->typed_passwd, si->unlock_typeahead, i); - pw->typed_passwd [i] = 0; - { - int j; - char *c = pw->typed_passwd_char_size; - for (j = 0; j < i; j++) - *c++ = 1; - *c = 0; - } - - memset (si->unlock_typeahead, '*', strlen(si->unlock_typeahead)); - si->unlock_typeahead[i] = 0; - update_passwd_window (si, si->unlock_typeahead, pw->ratio); - - free (si->unlock_typeahead); - si->unlock_typeahead = 0; -} - - -/** - * Returns a copy of the input string with trailing whitespace removed. - * Whitespace is anything considered so by isspace(). - * It is safe to call this with NULL, in which case NULL will be returned. - * The returned string (if not NULL) should be freed by the caller with free(). - */ -static char * -remove_trailing_whitespace(const char *str) -{ - size_t len; - char *newstr, *chr; - - if (!str) - return NULL; - - len = strlen(str); - - newstr = malloc(len + 1); - if (!newstr) - return NULL; - - (void) strcpy(newstr, str); - chr = newstr + len; - while (isspace(*--chr) && chr >= newstr) - *chr = '\0'; - - return newstr; -} - - -/* - * The authentication conversation function. - * Like a PAM conversation function, this accepts multiple messages in a single - * round. It then splits them into individual messages for display on the - * passwd dialog. A message sequence of info or error followed by a prompt will - * be reduced into a single dialog window. - * - * Returns 0 on success or -1 if some problem occurred (cancelled, OOM, etc.) - */ -int -gui_auth_conv(int num_msg, - const struct auth_message auth_msgs[], - struct auth_response **resp, - saver_info *si) -{ - int i; - const char *info_msg, *prompt; - struct auth_response *responses; - - if (si->unlock_state == ul_cancel || - si->unlock_state == ul_time) - /* If we've already cancelled or timed out in this PAM conversation, - don't prompt again even if PAM asks us to! */ - return -1; - - if (!(responses = calloc(num_msg, sizeof(struct auth_response)))) - goto fail; - - for (i = 0; i < num_msg; ++i) - { - info_msg = prompt = NULL; - - /* See if there is a following message that can be shown at the same - * time */ - if (auth_msgs[i].type == AUTH_MSGTYPE_INFO - && i+1 < num_msg - && ( auth_msgs[i+1].type == AUTH_MSGTYPE_PROMPT_NOECHO - || auth_msgs[i+1].type == AUTH_MSGTYPE_PROMPT_ECHO) - ) - { - info_msg = auth_msgs[i].msg; - prompt = auth_msgs[++i].msg; - } - else - { - if ( auth_msgs[i].type == AUTH_MSGTYPE_INFO - || auth_msgs[i].type == AUTH_MSGTYPE_ERROR) - info_msg = auth_msgs[i].msg; - else - prompt = auth_msgs[i].msg; - } - - { - char *info_msg_trimmed, *prompt_trimmed; - - /* Trailing whitespace looks bad in a GUI */ - info_msg_trimmed = remove_trailing_whitespace(info_msg); - prompt_trimmed = remove_trailing_whitespace(prompt); - - if (make_passwd_window(si, info_msg_trimmed, prompt_trimmed, - auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_ECHO - ? True : False) - < 0) - goto fail; - - if (info_msg_trimmed) - free(info_msg_trimmed); - - if (prompt_trimmed) - free(prompt_trimmed); - } - - compose_status = calloc (1, sizeof (*compose_status)); - if (!compose_status) - goto fail; - - si->unlock_state = ul_read; - - handle_typeahead (si); - passwd_event_loop (si); - - if (si->unlock_state == ul_cancel) - goto fail; - - responses[i].response = strdup(si->pw_data->typed_passwd); - - /* Cache the first response to a PROMPT_NOECHO to save prompting for - * each auth mechanism. */ - if (si->cached_passwd == NULL && - auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_NOECHO) - si->cached_passwd = strdup(responses[i].response); - - free (compose_status); - compose_status = 0; - } - - *resp = responses; - - return (si->unlock_state == ul_finished) ? 0 : -1; - -fail: - if (compose_status) - free (compose_status); - compose_status = 0; - - if (responses) - { - for (i = 0; i < num_msg; ++i) - if (responses[i].response) - free (responses[i].response); - free (responses); - } - - return -1; -} - - -void -auth_finished_cb (saver_info *si) -{ - char buf[1024]; - const char *s; - - /* If we have something to say, put the dialog back up for a few seconds - to display it. Otherwise, don't bother. - */ - - if (si->unlock_state == ul_fail && /* failed with caps lock on */ - si->pw_data && si->pw_data->caps_p) - s = "Authentication failed (Caps Lock?)"; - else if (si->unlock_state == ul_fail) /* failed without caps lock */ - s = "Authentication failed!"; - else if (si->unlock_state == ul_success && /* good, but report failures */ - si->unlock_failures > 0) - { - if (si->unlock_failures == 1) - s = "There has been\n1 failed login attempt."; - else - { - sprintf (buf, "There have been\n%d failed login attempts.", - si->unlock_failures); - s = buf; - } - si->unlock_failures = 0; - - /* ignore failures if they all were too recent */ - if (time((time_t *) 0) - si->unlock_failure_time - < si->prefs.auth_warning_slack) - goto END; - } - else /* good, with no failures, */ - goto END; /* or timeout, or cancel. */ - - make_passwd_window (si, s, NULL, True); - XSync (si->dpy, False); - - { - int secs = 4; - time_t start = time ((time_t *) 0); - XEvent event; - while (time ((time_t *) 0) < start + secs) - if (XPending (si->dpy)) - { - XNextEvent (si->dpy, &event); - if (event.xany.window == si->passwd_dialog && - event.xany.type == Expose) - draw_passwd_window (si); - else if (event.xany.type == ButtonPress || - event.xany.type == KeyPress) - break; - XSync (si->dpy, False); - } - else - usleep (250000); /* 1/4 second */ - } - - END: - if (si->pw_data) - destroy_passwd_window (si); -} - - -Bool -unlock_p (saver_info *si) -{ - saver_preferences *p = &si->prefs; - time_t now = time ((time_t *) 0); - - if (!si->unlock_cb) - { - fprintf(stderr, "%s: Error: no unlock function specified!\n", blurb()); - return False; - } - - raise_window (si, True, True, True); - - /* If your cat is sitting on the return key, don't thrash the window. - Only one failed/cancelled unlock per 2 seconds. - */ - if (si->unlock_dismiss_time >= now - 1) - { - if (p->verbose_p) - fprintf (stderr, "%s: unlock: thrashing: RET held down?\n", blurb()); - XSync (si->dpy, False); -# undef sleep - sleep (2); /* This is less than ideal, but fine */ - } - - xss_authenticate(si, p->verbose_p); - - return (si->unlock_state == ul_success); -} - - -void -set_locked_p (saver_info *si, Bool locked_p) -{ - si->locked_p = locked_p; - -#ifdef HAVE_XHPDISABLERESET - hp_lock_reset (si, locked_p); /* turn off/on C-Sh-Reset */ -#endif -#ifdef HAVE_XF86VMODE - xfree_lock_mode_switch (si, locked_p); /* turn off/on C-Alt-Plus */ -#endif -#ifdef HAVE_XF86MISCSETGRABKEYSSTATE - xfree_lock_grab_smasher (si, locked_p); /* turn off/on C-Alt-KP-*,/ */ -#endif - - store_saver_status (si); /* store locked-p */ -} - - -#else /* NO_LOCKING -- whole file */ - -void -set_locked_p (saver_info *si, Bool locked_p) -{ - if (locked_p) abort(); -} - -#endif /* !NO_LOCKING */ diff --git a/driver/mlstring.c b/driver/mlstring.c deleted file mode 100644 index fdba1ee5..00000000 --- a/driver/mlstring.c +++ /dev/null @@ -1,229 +0,0 @@ -/* - * (c) 2007, Quest Software, Inc. All rights reserved. - * - * This file is part of XScreenSaver, - * Copyright (c) 1993-2009 Jamie Zawinski - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ - -#include -#include - -#include - -#include "mlstring.h" - -#define LINE_SPACING 1.2 - -static mlstring * -mlstring_allocate(const char *msg); - -static void -mlstring_calculate(mlstring *str, XFontStruct *font); - -mlstring* -mlstring_new(const char *msg, XFontStruct *font, Dimension wrap_width) -{ - mlstring *newstr; - - if (!(newstr = mlstring_allocate(msg))) - return NULL; - - newstr->font_id = font->fid; - - mlstring_wrap(newstr, font, wrap_width); - - return newstr; -} - -mlstring * -mlstring_allocate(const char *msg) -{ - const char *s; - mlstring *ml; - struct mlstr_line *cur, *prev = NULL; - size_t linelength; - int the_end = 0; - - if (!msg) - return NULL; - - ml = calloc(1, sizeof(mlstring)); - - if (!ml) - return NULL; - - for (s = msg; !the_end; msg = ++s) - { - /* New string struct */ - cur = calloc(1, sizeof(struct mlstr_line)); - if (!cur) - goto fail; - - if (!ml->lines) - ml->lines = cur; - - /* Find the \n or end of string */ - while (*s != '\n') - { - if (*s == '\0') - { - the_end = 1; - break; - } - - ++s; - } - - linelength = s - msg; - - /* Duplicate the string */ - cur->line = malloc(linelength + 1); - if (!cur->line) - goto fail; - - strncpy(cur->line, msg, linelength); - cur->line[linelength] = '\0'; - - if (prev) - prev->next_line = cur; - prev = cur; - } - - return ml; - -fail: - - if (ml) - mlstring_free(ml); - - return NULL; -} - - -/* - * Frees an mlstring. - * This function does not have any unit tests. - */ -void -mlstring_free(mlstring *str) { - struct mlstr_line *cur, *next; - - for (cur = str->lines; cur; cur = next) { - next = cur->next_line; - free(cur->line); - free(cur); - } - - free(str); -} - - -void -mlstring_wrap(mlstring *mstring, XFontStruct *font, Dimension width) -{ - short char_width = font->max_bounds.width; - int line_length, wrap_at; - struct mlstr_line *mstr, *newml; - - /* An alternative implementation of this function would be to keep trying - * XTextWidth() on space-delimited substrings until the longest one less - * than 'width' is found, however there shouldn't be much difference - * between that, and this implementation. - */ - - for (mstr = mstring->lines; mstr; mstr = mstr->next_line) - { - if (XTextWidth(font, mstr->line, strlen(mstr->line)) > width) - { - /* Wrap it */ - line_length = width / char_width; - if (line_length == 0) - line_length = 1; - - /* First try to soft wrap by finding a space */ - for (wrap_at = line_length; wrap_at >= 0 && !isspace(mstr->line[wrap_at]); --wrap_at); - - if (wrap_at == -1) /* No space found, hard wrap */ - wrap_at = line_length; - else - wrap_at++; /* Leave the space at the end of the line. */ - - newml = calloc(1, sizeof(*newml)); - if (!newml) /* OOM, don't bother trying to wrap */ - break; - - if (NULL == (newml->line = strdup(mstr->line + wrap_at))) - { - /* OOM, jump ship */ - free(newml); - break; - } - - /* Terminate the existing string at its end */ - mstr->line[wrap_at] = '\0'; - - newml->next_line = mstr->next_line; - mstr->next_line = newml; - } - } - - mlstring_calculate(mstring, font); -} - -#undef MAX -#define MAX(x, y) ((x) > (y) ? (x) : (y)) - -/* - * Calculates the overall extents (width + height of the multi-line string). - * This function is called as part of mlstring_new(). - * It does not have any unit testing. - */ -void -mlstring_calculate(mlstring *str, XFontStruct *font) { - struct mlstr_line *line; - - str->font_height = font->ascent + font->descent; - str->overall_height = 0; - str->overall_width = 0; - - /* XXX: Should there be some baseline calculations to help XDrawString later on? */ - str->font_ascent = font->ascent; - - for (line = str->lines; line; line = line->next_line) - { - line->line_width = XTextWidth(font, line->line, strlen(line->line)); - str->overall_width = MAX(str->overall_width, line->line_width); - /* Don't add line spacing for the first line */ - str->overall_height += (font->ascent + font->descent) * - (line == str->lines ? 1 : LINE_SPACING); - } -} - -void -mlstring_draw(Display *dpy, Drawable dialog, GC gc, mlstring *string, int x, int y) { - struct mlstr_line *line; - - if (!string) - return; - - y += string->font_ascent; - - XSetFont(dpy, gc, string->font_id); - - for (line = string->lines; line; line = line->next_line) - { - XDrawString(dpy, dialog, gc, x, y, line->line, strlen(line->line)); - y += string->font_height * LINE_SPACING; - } -} - -/* vim:ts=8:sw=2:noet - */ diff --git a/driver/mlstring.h b/driver/mlstring.h deleted file mode 100644 index ce362056..00000000 --- a/driver/mlstring.h +++ /dev/null @@ -1,57 +0,0 @@ -/* mlstring.h --- Multi-line strings for use with Xlib - * - * (c) 2007, Quest Software, Inc. All rights reserved. - * - * This file is part of XScreenSaver, - * Copyright (c) 1993-2004 Jamie Zawinski - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ -#ifndef MLSTRING_H -#define MLSTRING_H - -#include - -/* mlstring means multi-line string */ - -struct mlstr_line; - -typedef struct mlstring mlstring; -struct mlstring { - struct mlstr_line *lines; /* linked list */ - Dimension overall_height; - Dimension overall_width; - /* XXX: Perhaps it is simpler to keep a reference to the XFontStruct */ - int font_ascent; - int font_height; - Font font_id; -}; - -struct mlstr_line { - char *line; - Dimension line_width; - struct mlstr_line *next_line; -}; - -mlstring * -mlstring_new(const char *str, XFontStruct *font, Dimension wrap_width); - -/* Does not have to be called manually */ -void -mlstring_wrap(mlstring *mstr, XFontStruct *font, Dimension width); - -void -mlstring_free(mlstring *str); - -void -mlstring_draw(Display *dpy, Drawable dialog, GC gc, mlstring *string, int x, int y); - -#endif -/* vim:ts=8:sw=2:noet - */ diff --git a/driver/passwd-helper.c b/driver/passwd-helper.c index a3a6b924..4b17c635 100644 --- a/driver/passwd-helper.c +++ b/driver/passwd-helper.c @@ -1,6 +1,6 @@ /* passwd-helper.c --- verifying typed passwords with external helper program + * xscreensaver, Copyright © 1993-2021 Jamie Zawinski * written by Olaf Kirch - * xscreensaver, Copyright (c) 1993-2005 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -11,6 +11,18 @@ * implied warranty. */ + +/***************************************************************************** + + I strongly suspect that this code has not been used in decades, and I + am considering removing it. These details should be hidden behind PAM. + If you are using this code, email me and tell me why. -- jwz, Feb 2021 + + *****************************************************************************/ + +#error "email jwz@jwz.org about passwd-helper.c" + + /* The idea here is to be able to run xscreensaver without any setuid bits. * Password verification happens through an external program that you feed * your password to on stdin. The external command is invoked with a user @@ -35,18 +47,6 @@ #ifndef NO_LOCKING /* whole file */ -#include /* not used for much... */ - -/* This file doesn't need the Xt headers, so stub these types out... */ -#undef XtPointer -#define XtAppContext void* -#define XrmDatabase void* -#define XtIntervalId void* -#define XtPointer void* -#define Widget void* - -#include "xscreensaver.h" - #include #ifdef HAVE_UNISTD_H # include @@ -57,11 +57,14 @@ #include #include #include - #include +#include "blurb.h" +#include "auth.h" + + static int -ext_run (const char *user, const char *typed_passwd, int verbose_p) +ext_run (const char *user, const char *typed_passwd) { int pfd[2], status; pid_t pid; @@ -70,10 +73,7 @@ ext_run (const char *user, const char *typed_passwd, int verbose_p) return 0; if (verbose_p) - fprintf (stderr, "%s: ext_run (%s, %s)\n", - blurb(), PASSWD_HELPER_PROGRAM, user); - - block_sigchld(); + fprintf (stderr, "%s: EXT: %s\n", blurb(), PASSWD_HELPER_PROGRAM); if ((pid = fork()) < 0) { close(pfd[0]); @@ -89,7 +89,7 @@ ext_run (const char *user, const char *typed_passwd, int verbose_p) /* Helper is invoked as helper service-name [user] */ execlp(PASSWD_HELPER_PROGRAM, PASSWD_HELPER_PROGRAM, "xscreensaver", user, NULL); if (verbose_p) - fprintf(stderr, "%s: %s\n", PASSWD_HELPER_PROGRAM, + fprintf(stderr, "%s: EXT: %s\n", PASSWD_HELPER_PROGRAM, strerror(errno)); exit(1); } @@ -106,14 +106,11 @@ ext_run (const char *user, const char *typed_passwd, int verbose_p) if (errno == EINTR) continue; if (verbose_p) - fprintf(stderr, "%s: ext_run: waitpid failed: %s\n", + fprintf(stderr, "%s: EXT: waitpid failed: %s\n", blurb(), strerror(errno)); - unblock_sigchld(); return 0; } - unblock_sigchld(); - if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) return 0; return 1; @@ -126,37 +123,36 @@ ext_run (const char *user, const char *typed_passwd, int verbose_p) to root. */ int -ext_passwd_valid_p (const char *typed_passwd, int verbose_p) +ext_passwd_valid_p (void *closure, const char *typed_passwd) { struct passwd *pw; int res = 0; if ((pw = getpwuid(getuid())) != NULL) - res = ext_run (pw->pw_name, typed_passwd, verbose_p); + res = ext_run (pw->pw_name, typed_passwd); endpwent(); #ifdef ALLOW_ROOT_PASSWD if (!res) - res = ext_run ("root", typed_passwd, verbose_p); + res = ext_run ("root", typed_passwd); #endif /* ALLOW_ROOT_PASSWD */ return res; } -int -ext_priv_init (int argc, char **argv, int verbose_p) +Bool +ext_priv_init (void) { /* Make sure the passwd helper exists */ if (access(PASSWD_HELPER_PROGRAM, X_OK) < 0) { fprintf(stderr, - "%s: warning: %s does not exist.\n" - "%s: password authentication via " - "external helper will not work.\n", + "%s: EXT: warning: %s does not exist.\n" + "%s: EXT password authentication will not work.\n", blurb(), PASSWD_HELPER_PROGRAM, blurb()); - return 0; + return False; } - return 1; + return True; } #endif /* NO_LOCKING -- whole file */ diff --git a/driver/passwd-kerberos.c b/driver/passwd-kerberos.c index 202e0eb1..7d94ebd5 100644 --- a/driver/passwd-kerberos.c +++ b/driver/passwd-kerberos.c @@ -1,6 +1,6 @@ /* kpasswd.c --- verify kerberos passwords. - * written by Nat Lanza (magus@cs.cmu.edu) for - * xscreensaver, Copyright (c) 1993-2004 Jamie Zawinski + * xscreensaver, Copyright © 1993-2021 Jamie Zawinski + * written by Nat Lanza (magus@cs.cmu.edu) * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -11,6 +11,17 @@ * implied warranty. */ +/***************************************************************************** + + I strongly suspect that this code has not been used in decades, and I + am considering removing it. These details should be hidden behind PAM. + If you are using this code, email me and tell me why. -- jwz, Feb 2021 + + *****************************************************************************/ + +#error "email jwz@jwz.org about passwd-kerberos.c" + + #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -48,9 +59,7 @@ # include #endif /* !HAVE_KERBEROS5 */ -#if !defined(VMS) && !defined(HAVE_ADJUNCT_PASSWD) -# include -#endif +#include #ifdef __bsdi__ @@ -60,13 +69,9 @@ # endif #endif /* __bsdi__ */ -/* blargh */ -#undef Bool -#undef True -#undef False -#define Bool int -#define True 1 -#define False 0 +#include "blurb.h" +#include "auth.h" + /* The user information we need to store */ #ifdef HAVE_DARWIN @@ -78,10 +83,6 @@ static const char *tk_file; #endif /* !HAVE_DARWIN */ -/* warning suppression: duplicated in passwd.c */ -extern Bool kerberos_lock_init (int argc, char **argv, Bool verbose_p); -extern Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p); - /* Called at startup to grab user, instance, and realm information from the user's ticketfile (remember, name.inst@realm). Since we're @@ -102,7 +103,7 @@ extern Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p); We don't use the arguments we're given, though. */ Bool -kerberos_lock_init (int argc, char **argv, Bool verbose_p) +kerberos_lock_init (void) { # ifdef HAVE_DARWIN @@ -182,7 +183,7 @@ key_to_key(char *user, char *instance, char *realm, char *passwd, C_Block key) some sites. So, we do a quick, painful hack with a tmpfile. */ Bool -kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p) +kerberos_passwd_valid_p (void *closure, const char *typed_passwd) { # ifdef HAVE_DARWIN return (klNoErr == @@ -201,10 +202,10 @@ kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p) /* temporarily switch to a new ticketfile. I'm not using tmpnam() because it isn't entirely portable. this could probably be fixed with autoconf. */ - newtkfile = malloc(80 * sizeof(char)); - memset(newtkfile, 0, sizeof(newtkfile)); - - sprintf(newtkfile, "/tmp/xscrn-%i.XXXXXX", getpid()); + char *tmpdir = getenv("TMPDIR"); + if (!tmpdir || !*tmpdir) tmpdir = "/tmp"; + newtkfile = malloc (strlen(tmpdir) + 40); + sprintf (newtkfile, "%s/xscreensaver.XXXXXX", tmpdir); if( (fh = mkstemp(newtkfile)) < 0) { diff --git a/driver/passwd-pam.c b/driver/passwd-pam.c index 457fed50..87942ab4 100644 --- a/driver/passwd-pam.c +++ b/driver/passwd-pam.c @@ -1,7 +1,6 @@ /* passwd-pam.c --- verifying typed passwords with PAM - * (Pluggable Authentication Modules.) - * written by Bill Nottingham (and jwz) for - * xscreensaver, Copyright (c) 1993-2017 Jamie Zawinski + * xscreensaver, Copyright © 1993-2021 Jamie Zawinski + * By Bill Nottingham and jwz. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -10,26 +9,37 @@ * documentation. No representations are made about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. - * - * Some PAM resources: - * - * PAM home page: - * http://www.us.kernel.org/pub/linux/libs/pam/ - * - * PAM FAQ: - * http://www.us.kernel.org/pub/linux/libs/pam/FAQ - * - * PAM Application Developers' Guide: - * http://www.us.kernel.org/pub/linux/libs/pam/Linux-PAM-html/Linux-PAM_ADG.html - * - * PAM Mailing list archives: - * http://www.linuxhq.com/lnxlists/linux-pam/ - * - * Compatibility notes, especially between Linux and Solaris: - * http://www.contrib.andrew.cmu.edu/u/shadow/pam.html - * - * The Open Group's PAM API documentation: - * http://www.opengroup.org/onlinepubs/8329799/pam_start.htm + */ + +/* PAM sucks in that there is no way to tell whether a particular service is + configured at all. That is, there is no way to tell the difference between + "authentication of the FOO service is not allowed" and "the user typed the + wrong password." + + On RedHat 5.1 systems, if a service name is not known, it defaults to being + not allowed (because the fallback service, /etc/pam.d/other, is set to + `pam_deny'.) + + On Solaris 2.6 systems, unknown services default to authenticating normally. + + So, we require that an "xscreensaver" PAM service exist. This has a bad + failure mode, however: if that service doesn't exist, then XScreenSaver + will lock the screen, but is unable to unlock. (With the non-PAM password + code, XScreenSaver can refuse to lock, because it is able to determine up + front that it was unable to retrieve the password info.) + + At startup, we check for the existence of /etc/pam.d/xscreensaver or + /etc/pam.conf, and if those don't exist, we print a warning that PAM is + probably not configured properly. This isn't *necessarily* correct, since + those files are not a part of PAM's C API, but it's how real-world systems + actually work. + + Also note that FreeBSD's implementation of PAM requires the calling process + to be running as root during the entire interactive PAM conversation: it + can't ever disavow privileges. Linux's PAM implementation uses a setuid + helper so that a non-root process can still authenticate, as is right and + proper. Consequently, XScreenSaver does not support PAM on FreeBSD. + Dear FreeBSD, get your shit together. */ #ifdef HAVE_CONFIG_H @@ -43,36 +53,17 @@ # include #endif -extern char *blurb(void); - - #include #include #include +#include #include #include #include -#include -#include -#include - -#include +#include "blurb.h" #include "auth.h" -extern sigset_t block_sigchld (void); -extern void unblock_sigchld (void); - -/* blargh */ -#undef Bool -#undef True -#undef False -#define Bool int -#define True 1 -#define False 0 - -#undef countof -#define countof(x) (sizeof((x))/sizeof(*(x))) /* Some time between Red Hat 4.2 and 7.0, the words were transposed in the various PAM_x_CRED macro names. Yay! @@ -89,10 +80,14 @@ static int pam_conversation (int nmsgs, struct pam_response **resp, void *closure); -void pam_try_unlock(saver_info *si, Bool verbose_p, - Bool (*valid_p)(const char *typed_passwd, Bool verbose_p)); +typedef struct { + Bool (*conv_fn) (void *closure, + int nmsgs, + const auth_message *msg, + auth_response **resp); + void *conv_fn_closure; +} pam_conv_closure; -Bool pam_priv_init (int argc, char **argv, Bool verbose_p); #ifdef HAVE_PAM_FAIL_DELAY /* We handle delays ourself.*/ @@ -116,52 +111,6 @@ Bool pam_priv_init (int argc, char **argv, Bool verbose_p); #endif /* !PAM_STRERROR_TWO_ARGS */ -/* PAM sucks in that there is no way to tell whether a particular service - is configured at all. That is, there is no way to tell the difference - between "authentication of the FOO service is not allowed" and "the - user typed the wrong password." - - On RedHat 5.1 systems, if a service name is not known, it defaults to - being not allowed (because the fallback service, /etc/pam.d/other, is - set to `pam_deny'.) - - On Solaris 2.6 systems, unknown services default to authenticating normally. - - So, we could simply require that the person who installs xscreensaver - set up an "xscreensaver" PAM service. However, if we went that route, - it would have a really awful failure mode: the failure mode would be that - xscreensaver was willing to *lock* the screen, but would be unwilling to - *unlock* the screen. (With the non-PAM password code, the analogous - situation -- security not being configured properly, for example do to the - executable not being installed as setuid root -- the failure mode is much - more palettable, in that xscreensaver will refuse to *lock* the screen, - because it can know up front that there is no password that will work.) - - Another route would be to have the service name to consult be computed at - compile-time (perhaps with a configure option.) However, that doesn't - really solve the problem, because it means that the same executable might - work fine on one machine, but refuse to unlock when run on another - machine. - - Another alternative would be to look in /etc/pam.conf or /etc/pam.d/ at - runtime to see what services actually exist. But I think that's no good, - because who is to say that the PAM info is actually specified in those - files? Opening and reading those files is not a part of the PAM client - API, so it's not guarenteed to work on any given system. - - An alternative I tried was to specify a list of services to try, and to - try them all in turn ("xscreensaver", "xlock", "xdm", and "login"). - This worked, but it was slow (and I also had to do some contortions to - work around bugs in Linux PAM 0.64-3.) - - So what we do today is, try PAM once, and if that fails, try the usual - getpwent() method. So if PAM doesn't work, it will at least make an - attempt at looking up passwords in /etc/passwd or /etc/shadow instead. - - This all kind of blows. I'm not sure what else to do. - */ - - /* On SunOS 5.6, the `pam_conv.appdata_ptr' slot seems to be ignored, and the `closure' argument to pc.conv always comes in as random garbage. So we get around this by using a global variable instead. Shoot me! @@ -172,97 +121,70 @@ Bool pam_priv_init (int argc, char **argv, Bool verbose_p); static void *suns_pam_implementation_blows = 0; -/** - * This function is the PAM conversation driver. It conducts a full - * authentication round by invoking the GUI with various prompts. +/* This function invokes the PAM conversation. It conducts a full + authentication round by presenting the GUI with various prompts. */ -void -pam_try_unlock(saver_info *si, Bool verbose_p, - Bool (*valid_p)(const char *typed_passwd, Bool verbose_p)) +Bool +pam_try_unlock (void *closure, + Bool (*conv_fn) (void *closure, + int nmsgs, + const auth_message *msg, + auth_response **resp)) { const char *service = PAM_SERVICE_NAME; pam_handle_t *pamh = 0; int status = -1; struct pam_conv pc; -# ifdef HAVE_SIGTIMEDWAIT - sigset_t set; - struct timespec timeout; -# endif /* HAVE_SIGTIMEDWAIT */ + struct passwd *p = getpwuid (getuid()); + const char *user = (p && p->pw_name && *p->pw_name ? p->pw_name : 0); + pam_conv_closure conv_closure; + + if (!user) + { + fprintf (stderr, "%s: PAM: unable to get current user\n", blurb()); + return False; + } + conv_closure.conv_fn = conv_fn; + conv_closure.conv_fn_closure = closure; + pc.appdata_ptr = &conv_closure; pc.conv = &pam_conversation; - pc.appdata_ptr = (void *) si; /* On SunOS 5.6, the `appdata_ptr' slot seems to be ignored, and the `closure' argument to pc.conv always comes in as random garbage. */ - suns_pam_implementation_blows = (void *) si; + suns_pam_implementation_blows = pc.appdata_ptr; /* Initialize PAM. */ - status = pam_start (service, si->user, &pc, &pamh); + status = pam_start (service, user, &pc, &pamh); if (verbose_p) - fprintf (stderr, "%s: pam_start (\"%s\", \"%s\", ...) ==> %d (%s)\n", - blurb(), service, si->user, + fprintf (stderr, "%s: PAM: pam_start (\"%s\", \"%s\", ...) ==> %d (%s)\n", + blurb(), service, user, status, PAM_STRERROR (pamh, status)); if (status != PAM_SUCCESS) goto DONE; - /* #### We should set PAM_TTY to the display we're using, but we - don't have that handy from here. So set it to :0.0, which is a - good guess (and has the bonus of counting as a "secure tty" as - far as PAM is concerned...) - */ { - char *tty = strdup (":0.0"); + char *tty = getenv ("DISPLAY"); + if (!tty || !*tty) tty = ":0.0"; status = pam_set_item (pamh, PAM_TTY, tty); if (verbose_p) fprintf (stderr, "%s: pam_set_item (p, PAM_TTY, \"%s\") ==> %d (%s)\n", blurb(), tty, status, PAM_STRERROR(pamh, status)); - free (tty); } - /* Try to authenticate as the current user. - We must turn off our SIGCHLD handler for the duration of the call to - pam_authenticate(), because in some cases, the underlying PAM code - will do this: - - 1: fork a setuid subprocess to do some dirty work; - 2: read a response from that subprocess; - 3: waitpid(pid, ...) on that subprocess. - - If we (the ignorant parent process) have a SIGCHLD handler, then there's - a race condition between steps 2 and 3: if the subprocess exits before - waitpid() was called, then our SIGCHLD handler fires, and gets notified - of the subprocess death; then PAM's call to waitpid() fails, because the - process has already been reaped. - - I consider this a bug in PAM, since the caller should be able to have - whatever signal handlers it wants -- the PAM documentation doesn't say - "oh by the way, if you use PAM, you can't use SIGCHLD." - */ - PAM_NO_DELAY(pamh); if (verbose_p) fprintf (stderr, "%s: pam_authenticate (...) ...\n", blurb()); -# ifdef HAVE_SIGTIMEDWAIT - timeout.tv_sec = 0; - timeout.tv_nsec = 1; - set = -# endif /* HAVE_SIGTIMEDWAIT */ - block_sigchld(); status = pam_authenticate (pamh, 0); -# ifdef HAVE_SIGTIMEDWAIT - sigtimedwait (&set, NULL, &timeout); - /* #### What is the portable thing to do if we don't have it? */ -# endif /* HAVE_SIGTIMEDWAIT */ - unblock_sigchld(); if (verbose_p) fprintf (stderr, "%s: pam_authenticate (...) ==> %d (%s)\n", blurb(), status, PAM_STRERROR(pamh, status)); - if (status == PAM_SUCCESS) /* Win! */ + if (status == PAM_SUCCESS) /* So far so good... */ { int status2; @@ -341,22 +263,16 @@ pam_try_unlock(saver_info *si, Bool verbose_p, (status2 == PAM_SUCCESS ? "Success" : "Failure")); } - if (status == PAM_SUCCESS) - si->unlock_state = ul_success; /* yay */ - else if (si->unlock_state == ul_cancel || - si->unlock_state == ul_time) - ; /* more specific failures ok */ - else - si->unlock_state = ul_fail; /* generic failure */ + return (status == PAM_SUCCESS); } Bool -pam_priv_init (int argc, char **argv, Bool verbose_p) +pam_priv_init (void) { /* We have nothing to do at init-time. However, we might as well do some error checking. - If "/etc/pam.d" exists and is a directory, but "/etc/pam.d/xlock" + If "/etc/pam.d" exists and is a directory, but "/etc/pam.d/xscreensaver" does not exist, warn that PAM probably isn't going to work. This is a priv-init instead of a non-priv init in case the directory @@ -375,8 +291,8 @@ pam_priv_init (int argc, char **argv, Bool verbose_p) { if (stat (file, &st) != 0) fprintf (stderr, - "%s: warning: %s does not exist.\n" - "%s: password authentication via PAM is unlikely to work.\n", + "%s: PAM: warning: %s does not exist.\n" + "%s: PAM: password authentication is unlikely to work.\n", blurb(), file, blurb()); } else if (stat (file2, &st) == 0) @@ -396,8 +312,8 @@ pam_priv_init (int argc, char **argv, Bool verbose_p) if (!ok) { fprintf (stderr, - "%s: warning: %s does not list the `%s' service.\n" - "%s: password authentication via PAM is unlikely to work.\n", + "%s: PAM: warning: %s does not list the `%s' service.\n" + "%s: PAM: password authentication is unlikely to work.\n", blurb(), file2, PAM_SERVICE_NAME, blurb()); } } @@ -406,8 +322,8 @@ pam_priv_init (int argc, char **argv, Bool verbose_p) else { fprintf (stderr, - "%s: warning: neither %s nor %s exist.\n" - "%s: password authentication via PAM is unlikely to work.\n", + "%s: PAM: warning: neither %s nor %s exist.\n" + "%s: PAM: password authentication is unlikely to work.\n", blurb(), file2, file, blurb()); } @@ -416,23 +332,22 @@ pam_priv_init (int argc, char **argv, Bool verbose_p) } +/* This is pam_conv->conv */ static int pam_conversation (int nmsgs, const struct pam_message **msg, struct pam_response **resp, - void *vsaver_info) + void *closure) { - int i, ret = -1; - struct auth_message *messages = 0; - struct auth_response *authresp = 0; + int i; + auth_message *messages = 0; + auth_response *authresp = 0; struct pam_response *pam_responses; - saver_info *si = (saver_info *) vsaver_info; - Bool verbose_p; + pam_conv_closure *conv_closure; /* On SunOS 5.6, the `closure' argument always comes in as random garbage. */ - si = (saver_info *) suns_pam_implementation_blows; - - verbose_p = si->prefs.verbose_p; + closure = suns_pam_implementation_blows; + conv_closure = closure; /* Converting the PAM prompts into the XScreenSaver native format. * It was a design goal to collapse (INFO,PROMPT) pairs from PAM @@ -443,11 +358,9 @@ pam_conversation (int nmsgs, * pass along whatever was passed in here. */ - messages = calloc(nmsgs, sizeof(struct auth_message)); - pam_responses = calloc(nmsgs, sizeof(*pam_responses)); - - if (!pam_responses || !messages) - goto end; + messages = calloc (nmsgs, sizeof(*messages)); + pam_responses = calloc (nmsgs, sizeof(*pam_responses)); + if (!pam_responses || !messages) abort(); if (verbose_p) fprintf (stderr, "%s: pam_conversation (", blurb()); @@ -483,44 +396,25 @@ pam_conversation (int nmsgs, if (verbose_p) fprintf (stderr, ") ...\n"); - ret = si->unlock_cb(nmsgs, messages, &authresp, si); - - /* #### If the user times out, or hits ESC or Cancel, we return PAM_CONV_ERR, - and PAM logs this as an authentication failure. It would be nice if - there was some way to indicate that this was a "cancel" rather than - a "fail", so that it wouldn't show up in syslog, but I think the - only options are PAM_SUCCESS and PAM_CONV_ERR. (I think that - PAM_ABORT means "internal error", not "cancel".) Bleh. - */ - - if (ret == 0) - { - for (i = 0; i < nmsgs; ++i) - pam_responses[i].resp = authresp[i].response; - } + /* This opens the dialog box and runs the X11 event loop. + It only returns if the user entered a password. + If they hit cancel, or timed out, it exited. + */ + conv_closure->conv_fn (conv_closure->conv_fn_closure, nmsgs, messages, + &authresp); -end: - if (messages) - free(messages); + for (i = 0; i < nmsgs; ++i) + pam_responses[i].resp = authresp[i].response; - if (authresp) - free(authresp); + if (messages) free (messages); + if (authresp) free (authresp); if (verbose_p) - fprintf (stderr, "%s: pam_conversation (...) ==> %s\n", blurb(), - (ret == 0 ? "PAM_SUCCESS" : "PAM_CONV_ERR")); - - if (ret == 0) - { - *resp = pam_responses; - return PAM_SUCCESS; - } - - /* Failure only */ - if (pam_responses) - free(pam_responses); + fprintf (stderr, "%s: pam_conversation (...) ==> PAM_SUCCESS\n", + blurb()); - return PAM_CONV_ERR; + *resp = pam_responses; + return PAM_SUCCESS; } #endif /* NO_LOCKING -- whole file */ diff --git a/driver/passwd-pwent.c b/driver/passwd-pwent.c index bb0edfc2..b6c74de7 100644 --- a/driver/passwd-pwent.c +++ b/driver/passwd-pwent.c @@ -1,5 +1,5 @@ /* passwd-pwent.c --- verifying typed passwords with the OS. - * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski + * xscreensaver, Copyright © 1993-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -28,13 +28,8 @@ #include #include #include -#ifndef VMS -# include -# include -#else /* VMS */ -# include "vms-pwd.h" -#endif /* VMS */ - +#include +#include #ifdef __bsdi__ # include @@ -47,6 +42,7 @@ #if defined(HAVE_SHADOW_PASSWD) /* passwds live in /etc/shadow */ # include +# define PWNAME "spnam" # define PWTYPE struct spwd * # define PWPSLOT sp_pwdp # define GETPW getspnam @@ -56,6 +52,7 @@ # include # include +# define PWNAME "prpwnam" # define PWTYPE struct pr_passwd * # define PWPSLOT ufld.fd_encrypt # define GETPW getprpwnam @@ -66,6 +63,7 @@ # include # include +# define PWNAME "pwanam" # define PWTYPE struct passwd_adjunct * # define PWPSLOT pwa_passwd # define GETPW getpwanam @@ -75,43 +73,33 @@ # include # include +# define PWNAME "spwnam" # define PWTYPE struct s_passwd * # define PWPSLOT pw_passwd # define GETPW getspwnam # define HAVE_BIGCRYPT -#endif +#elif defined(HAVE_PWNAM_SHADOW_PASSWD) +# define PWNAME "pwnam_shadow" +# define PWTYPE struct passwd * +# define PWPSLOT pw_passwd +# define GETPW getpwnam_shadow -/* blargh */ -#undef Bool -#undef True -#undef False -#define Bool int -#define True 1 -#define False 0 +#endif +#include "blurb.h" +#include "auth.h" -extern const char *blurb(void); +#ifdef ALLOW_ROOT_PASSWD static char *encrypted_root_passwd = 0; -static char *encrypted_user_passwd = 0; - -#ifdef VMS -# define ROOT "SYSTEM" -#else -# define ROOT "root" -#endif - -#ifndef VMS -Bool pwent_priv_init (int argc, char **argv, Bool verbose_p); -Bool pwent_lock_init (int argc, char **argv, Bool verbose_p); -Bool pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p); #endif +static char *encrypted_user_passwd = 0; +#define ROOT "root" -#ifndef VMS static char * user_name (void) @@ -140,17 +128,6 @@ user_name (void) return (u ? strdup(u) : 0); } -#else /* VMS */ - -static char * -user_name (void) -{ - char *u = getenv("USER"); - return (u ? strdup(u) : 0); -} - -#endif /* VMS */ - static Bool passwd_known_p (const char *pw) @@ -162,24 +139,28 @@ passwd_known_p (const char *pw) static char * -get_encrypted_passwd(const char *user) +get_encrypted_passwd (const char *user) { char *result = 0; + const char *pwtype = "pwnam"; -#ifdef PWTYPE +# ifdef PWTYPE if (user && *user && !result) { /* First check the shadow passwords. */ PWTYPE p = GETPW((char *) user); if (p && passwd_known_p (p->PWPSLOT)) - result = strdup(p->PWPSLOT); + { + result = strdup(p->PWPSLOT); + pwtype = PWNAME; + } } -#endif /* PWTYPE */ +# endif /* PWTYPE */ if (user && *user && !result) { /* Check non-shadow passwords too. */ struct passwd *p = getpwnam(user); if (p && passwd_known_p (p->pw_passwd)) - result = strdup(p->pw_passwd); + result = strdup(p->pw_passwd); } /* The manual for passwd(4) on HPUX 10.10 says: @@ -200,15 +181,20 @@ get_encrypted_passwd(const char *user) *s = 0; } -#ifndef HAVE_PAM - /* We only issue this warning if not compiled with support for PAM. - If we're using PAM, it's not unheard of that normal pwent passwords - would be unavailable. */ + /* We only issue this warning in non-verbose mode if not compiled with + support for PAM. If we're using PAM, it's common for pwent passwords + to be unavailable. */ - if (!result) - fprintf (stderr, "%s: couldn't get password of \"%s\"\n", - blurb(), (user ? user : "(null)")); -#endif /* !HAVE_PAM */ + if (!result && + (verbose_p +# ifdef HAVE_PAM + || 0 +# else + || 1 +# endif + )) + fprintf (stderr, "%s: %s: couldn't get password of \"%s\"\n", + blurb(), pwtype, (user ? user : "(null)")); return result; } @@ -221,10 +207,8 @@ get_encrypted_passwd(const char *user) locking isn't possible. (It will also have written to stderr.) */ -#ifndef VMS - Bool -pwent_priv_init (int argc, char **argv, Bool verbose_p) +pwent_priv_init (void) { char *u; @@ -235,7 +219,9 @@ pwent_priv_init (int argc, char **argv, Bool verbose_p) u = user_name(); encrypted_user_passwd = get_encrypted_passwd(u); +#ifdef ALLOW_ROOT_PASSWD encrypted_root_passwd = get_encrypted_passwd(ROOT); +#endif if (u) free (u); if (encrypted_user_passwd) @@ -246,7 +232,7 @@ pwent_priv_init (int argc, char **argv, Bool verbose_p) Bool -pwent_lock_init (int argc, char **argv, Bool verbose_p) +pwent_lock_init (void) { if (encrypted_user_passwd) return True; @@ -287,7 +273,7 @@ passwds_match_p (const char *cleartext, const char *ciphertext) to root. */ Bool -pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p) +pwent_passwd_valid_p (void *closure, const char *typed_passwd) { if (encrypted_user_passwd && passwds_match_p (typed_passwd, encrypted_user_passwd)) @@ -305,8 +291,6 @@ pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p) return False; } -#else /* VMS */ -Bool pwent_lock_init (int argc, char **argv, Bool verbose_p) { return True; } -#endif /* VMS */ - +#else /* NO_LOCKING */ +int _ignore_; #endif /* NO_LOCKING -- whole file */ diff --git a/driver/passwd.c b/driver/passwd.c index 68e1a0b7..11ca134f 100644 --- a/driver/passwd.c +++ b/driver/passwd.c @@ -1,5 +1,5 @@ /* passwd.c --- verifying typed passwords with the OS. - * xscreensaver, Copyright (c) 1993-2019 Jamie Zawinski + * xscreensaver, Copyright © 1993-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -14,8 +14,6 @@ # include "config.h" #endif -#ifndef NO_LOCKING /* whole file */ - #include #include #include @@ -26,11 +24,7 @@ #include #include -#ifndef VMS -# include /* for getpwuid() */ -#else /* VMS */ -# include "vms-pwd.h" -#endif /* VMS */ +#include /* for getpwuid() */ #ifdef HAVE_SYSLOG # include @@ -41,8 +35,24 @@ #include "xscreensaver.h" #include "auth.h" + +#ifdef NO_LOCKING + +Bool lock_init (void) { return 0; } +Bool lock_priv_init (void) { return 0; } +Bool xscreensaver_auth (void *closure, + Bool (*conv_fn) (void *closure, + int nmsgs, + const auth_message *msg, + auth_response **resp), + void (*finished_fn) (void *closure, Bool status)) +{ + return False; +} + +#else /* NO_LOCKING -- whole file */ + extern const char *blurb(void); -extern void check_for_leaks (const char *where); /* blargh */ @@ -58,100 +68,39 @@ extern void check_for_leaks (const char *where); struct auth_methods { const char *name; - Bool (*init) (int argc, char **argv, Bool verbose_p); - Bool (*priv_init) (int argc, char **argv, Bool verbose_p); - Bool (*valid_p) (const char *typed_passwd, Bool verbose_p); - void (*try_unlock) (saver_info *si, Bool verbose_p, - Bool (*valid_p)(const char *typed_passwd, Bool verbose_p)); + Bool (*init) (void); + Bool (*priv_init) (void); + Bool (*valid_p) (void *closure, const char *plaintext); + Bool (*try_unlock) (void *closure, + Bool (*conv_fn) (void *closure, + int nmsgs, + const auth_message *msg, + auth_response **resp)); Bool initted_p; Bool priv_initted_p; }; -#ifdef HAVE_KERBEROS -extern Bool kerberos_lock_init (int argc, char **argv, Bool verbose_p); -extern Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p); -#endif -#ifdef HAVE_PAM -extern Bool pam_priv_init (int argc, char **argv, Bool verbose_p); -extern void pam_try_unlock (saver_info *si, Bool verbose_p, - Bool (*valid_p)(const char *typed_passwd, Bool verbose_p)); -#endif -#ifdef PASSWD_HELPER_PROGRAM -extern Bool ext_priv_init (int argc, char **argv, Bool verbose_p); -extern Bool ext_passwd_valid_p (const char *typed_passwd, Bool verbose_p); -#endif -extern Bool pwent_lock_init (int argc, char **argv, Bool verbose_p); -extern Bool pwent_priv_init (int argc, char **argv, Bool verbose_p); -extern Bool pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p); - -Bool lock_priv_init (int argc, char **argv, Bool verbose_p); -Bool lock_init (int argc, char **argv, Bool verbose_p); -Bool passwd_valid_p (const char *typed_passwd, Bool verbose_p); - -/* The authorization methods to try, in order. - Note that the last one (the pwent version) is actually two auth methods, - since that code tries shadow passwords, and then non-shadow passwords. - (It's all in the same file since the APIs are randomly nearly-identical.) + +/* The authorization methods to try, in order of preference. + The first that initializes successfully is used and others are ignored. */ struct auth_methods methods[] = { # ifdef HAVE_PAM - { "PAM", 0, pam_priv_init, 0, pam_try_unlock, - False, False }, + { "PAM", 0, pam_priv_init, 0, pam_try_unlock, 0, }, # endif # ifdef HAVE_KERBEROS - { "Kerberos", kerberos_lock_init, 0, kerberos_passwd_valid_p, 0, - False, False }, + { "KRB", kerberos_lock_init, 0, kerberos_passwd_valid_p, 0, }, # endif # ifdef PASSWD_HELPER_PROGRAM - { "external", 0, ext_priv_init, ext_passwd_valid_p, 0, - False, False }, + { "EXT", 0, ext_priv_init, ext_passwd_valid_p, 0, }, # endif - { "normal", pwent_lock_init, pwent_priv_init, pwent_passwd_valid_p, 0, - False, False } + { "pwnam", pwent_lock_init, pwent_priv_init, pwent_passwd_valid_p, 0, } }; -# ifdef HAVE_PROC_OOM -/* On some recent Linux systems you can tell the kernel's OOM-killer to - consider the possibility of maybe sometimes not killing you in low-memory - situations. Because that would unlock the screen. And that would be bad. - - Linux >= 2.6.11: echo -17 > /proc/$$/oom_adj <-- ignoring this. - Linux >= 2.6.37: echo -1000 > /proc/$$/oom_score_adj <-- trying this. - */ -static void -oom_assassin_immunity (Bool verbose_p) -{ - char fn[1024]; - struct stat st; - FILE *out; - sprintf (fn, "/proc/%d/oom_score_adj", getpid()); - if (stat(fn, &st) != 0) - { - if (verbose_p) - fprintf (stderr, "%s: OOM: %s does not exist\n", blurb(), fn); - return; - } - out = fopen (fn, "w"); - if (!out) - { - if (verbose_p) - { - char b[2048]; - sprintf (b, "%s: OOM: unable to write %s\n", blurb(), fn); - perror(b); - } - return; - } - fputs ("-1000\n", out); - fclose (out); -} -# endif /* HAVE_PROC_OOM */ - - Bool -lock_priv_init (int argc, char **argv, Bool verbose_p) +lock_priv_init (void) { int i; Bool any_ok = False; @@ -160,26 +109,17 @@ lock_priv_init (int argc, char **argv, Bool verbose_p) if (!methods[i].priv_init) methods[i].priv_initted_p = True; else - methods[i].priv_initted_p = methods[i].priv_init (argc, argv, - verbose_p); + methods[i].priv_initted_p = methods[i].priv_init(); if (methods[i].priv_initted_p) any_ok = True; - else if (verbose_p) - fprintf (stderr, "%s: initialization of %s passwords failed.\n", - blurb(), methods[i].name); } - -# ifdef HAVE_PROC_OOM - oom_assassin_immunity (verbose_p); -# endif - return any_ok; } Bool -lock_init (int argc, char **argv, Bool verbose_p) +lock_init (void) { int i; Bool any_ok = False; @@ -191,70 +131,75 @@ lock_init (int argc, char **argv, Bool verbose_p) if (!methods[i].init) methods[i].initted_p = True; else - methods[i].initted_p = methods[i].init (argc, argv, verbose_p); + methods[i].initted_p = methods[i].init(); if (methods[i].initted_p) any_ok = True; else if (verbose_p) - fprintf (stderr, "%s: initialization of %s passwords failed.\n", + fprintf (stderr, "%s: %s: passwords initialization failed\n", blurb(), methods[i].name); } return any_ok; } -/* A basic auth driver that simply prompts for a password then runs it through - * valid_p to determine whether the password is correct. +/* For those auth methods that have a 'valid_p' function instead of a + 'try_unlock' function, this does a PAM-like conversation that first + prompts for a password and then tests it with the 'valid_p' function. */ -static void -try_unlock_password(saver_info *si, - Bool verbose_p, - Bool (*valid_p)(const char *typed_passwd, Bool verbose_p)) +static Bool +try_valid_p (void *closure, + const char *name, + Bool (*valid_p) (void *closure, const char *typed_passwd), + Bool (*conv_fn) (void *closure, + int nmsgs, + const auth_message *msg, + auth_response **resp)) { - struct auth_message message; - struct auth_response *response = NULL; + auth_message message; + auth_response *response = NULL; + Bool ok = False; - memset(&message, 0, sizeof(message)); + memset (&message, 0, sizeof(message)); if (verbose_p) - fprintf(stderr, "%s: non-PAM password auth.\n", blurb()); + fprintf (stderr, "%s: %s: non-PAM password auth\n", blurb(), name); - /* Call the auth_conv function with "Password:", then feed - * the result into valid_p() - */ + /* Call the auth_conv function with "Password:", then feed the result + into valid_p() */ message.type = AUTH_MSGTYPE_PROMPT_NOECHO; message.msg = "Password:"; - si->unlock_cb(1, &message, &response, si); + ok = conv_fn (closure, 1, &message, &response); + if (!response || !response->response) + ok = False; - if (!response) - return; + if (ok) + ok = valid_p (closure, response->response); - if (valid_p (response->response, verbose_p)) - si->unlock_state = ul_success; /* yay */ - else if (si->unlock_state == ul_cancel || - si->unlock_state == ul_time) - ; /* more specific failures ok */ - else - si->unlock_state = ul_fail; /* generic failure */ + if (response) + { + if (response->response) + free (response->response); + free (response); + } - if (response->response) - free(response->response); - free(response); + return ok; } /* Write a password failure to the system log. */ static void -do_syslog (saver_info *si, Bool verbose_p) +do_syslog (void) { # ifdef HAVE_SYSLOG struct passwd *pw = getpwuid (getuid ()); - char *d = (si->dpy ? DisplayString (si->dpy) : 0); + char *d = getenv ("DISPLAY"); char *u = (pw && pw->pw_name ? pw->pw_name : "???"); int opt = 0; int fac = 0; + int pri = LOG_NOTICE; # ifdef LOG_PID opt = LOG_PID; @@ -270,115 +215,57 @@ do_syslog (saver_info *si, Bool verbose_p) if (!d) d = ""; -# undef FMT -# define FMT "FAILED LOGIN %d ON DISPLAY \"%s\", FOR \"%s\"" - - if (verbose_p) - fprintf (stderr, "%s: syslog: " FMT "\n", blurb(), - si->unlock_failures, d, u); - openlog (progname, opt, fac); - syslog (LOG_NOTICE, FMT, si->unlock_failures, d, u); + syslog (pri, "Failed login on display \"%s\" for \"%s\"", d, u); closelog (); # endif /* HAVE_SYSLOG */ } - -/** - * Runs through each authentication driver calling its try_unlock function. - * Called xss_authenticate() because AIX beat us to the name authenticate(). +/* Runs through each authentication driver calling its try_unlock function. */ -void -xss_authenticate(saver_info *si, Bool verbose_p) +Bool +xscreensaver_auth (void *closure, + Bool (*conv_fn) (void *closure, + int nmsgs, + const auth_message *msg, + auth_response **resp), + void (*finished_fn) (void *closure, Bool status)) { - int i, j; - - si->unlock_state = ul_read; + int i; + Bool ok = False; for (i = 0; i < countof(methods); i++) { if (!methods[i].initted_p) continue; - if (si->cached_passwd != NULL && methods[i].valid_p) - si->unlock_state = (methods[i].valid_p(si->cached_passwd, verbose_p) == True) - ? ul_success : ul_fail; - else if (methods[i].try_unlock != NULL) - methods[i].try_unlock(si, verbose_p, methods[i].valid_p); + if (methods[i].try_unlock) + ok = methods[i].try_unlock (closure, conv_fn); else if (methods[i].valid_p) - try_unlock_password(si, verbose_p, methods[i].valid_p); - else /* Ze goggles, zey do nozing! */ - fprintf(stderr, "%s: authentication method %s does nothing.\n", - blurb(), methods[i].name); - - check_for_leaks (methods[i].name); - - /* If password authentication failed, but the password was NULL - (meaning the user just hit RET) then treat that as "cancel". - This means that if the password is literally NULL, it will - work; but if not, then NULL passwords are treated as cancel. - */ - if (si->unlock_state == ul_fail && - si->cached_passwd && - !*si->cached_passwd) - { - if (verbose_p) - fprintf (stderr, "%s: assuming null password means cancel.\n", - blurb()); - si->unlock_state = ul_cancel; - } - - if (si->unlock_state == ul_success) - { - /* If we successfully authenticated by method N, but attempting - to authenticate by method N-1 failed, mention that (since if - an earlier authentication method fails and a later one succeeds, - something screwy is probably going on.) - */ - if (verbose_p && i > 0) - { - for (j = 0; j < i; j++) - if (methods[j].initted_p) - fprintf (stderr, - "%s: authentication via %s failed.\n", - blurb(), methods[j].name); - fprintf (stderr, - "%s: authentication via %s succeeded.\n", - blurb(), methods[i].name); - } - goto DONE; /* Successfully authenticated! */ - } - else if (si->unlock_state == ul_cancel || - si->unlock_state == ul_time) - { - /* If any auth method gets a cancel or timeout, don't try the - next auth method! We're done! */ - if (verbose_p) - fprintf (stderr, "%s: authentication via %s %s.\n", - blurb(), methods[i].name, - (si->unlock_state == ul_cancel - ? "cancelled" : "timed out")); - goto DONE; - } + ok = try_valid_p (closure, methods[i].name, methods[i].valid_p, + conv_fn); + else + abort(); /* method must have one or the other function */ + + /* Only try the first method that initialized properly. That means that + if PAM initialized correctly, we will never try pwent or Kerberos. + If we did, then typing an incorrect password at PAM would result in a + second password prompt that would only go to pwent. There's no + sensible way to re-use the password typed the first time, if there + even was one. With fingerprint readers or OTP fobs, there might have + been 0, 2, or more passwords entered. */ + break; } - if (verbose_p) - fprintf(stderr, "%s: All authentication mechanisms failed.\n", blurb()); + if (!ok) + do_syslog (); - if (si->unlock_state == ul_fail) - { - /* Note the time of the first failure */ - if (si->unlock_failures == 0) - si->unlock_failure_time = time((time_t *) 0); - si->unlock_failures++; - do_syslog (si, verbose_p); - } + if (finished_fn) + finished_fn (closure, ok); -DONE: - if (si->auth_finished_cb) - si->auth_finished_cb (si); + return ok; } #endif /* NO_LOCKING -- whole file */ diff --git a/driver/pdf2jpeg.m b/driver/pdf2jpeg.m deleted file mode 100644 index a9975e8d..00000000 --- a/driver/pdf2jpeg.m +++ /dev/null @@ -1,152 +0,0 @@ -/* pdf2jpeg -- converts a PDF file to a JPEG file, using Cocoa - * - * Copyright (c) 2003, 2008 by Jamie Zawinski - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - * Inspired by clues provided by Jan Kujawa and Jonathan Hendry. - */ - -#import -#include -#include - -int -main (int argc, char** argv) -{ - const char *progname = argv[0]; - const char *infile = 0, *outfile = 0; - double compression = 0.85; - double scale = 1.0; - int verbose = 0; - int i; - - for (i = 1; i < argc; i++) - { - char c; - if (argv[i][0] == '-' && argv[i][1] == '-') - argv[i]++; - if (!strcmp (argv[i], "-q") || - !strcmp (argv[i], "-qual") || - !strcmp (argv[i], "-quality")) - { - int q; - if (1 != sscanf (argv[++i], " %d %c", &q, &c) || - q < 5 || q > 100) - { - fprintf (stderr, "%s: quality must be 5 - 100 (%d)\n", - progname, q); - goto USAGE; - } - compression = q / 100.0; - } - else if (!strcmp (argv[i], "-scale")) - { - float s; - if (1 != sscanf (argv[++i], " %f %c", &s, &c) || - s <= 0 || s > 50) - { - fprintf (stderr, "%s: scale must be 0.0 - 50.0 (%f)\n", - progname, s); - goto USAGE; - } - scale = s; - } - else if (!strcmp (argv[i], "-verbose")) - verbose++; - else if (!strcmp (argv[i], "-v") || - !strcmp (argv[i], "-vv") || - !strcmp (argv[i], "-vvv")) - verbose += strlen(argv[i])-1; - else if (argv[i][0] == '-') - { - fprintf (stderr, "%s: unknown option %s\n", progname, argv[i]); - goto USAGE; - } - else if (!infile) - infile = argv[i]; - else if (!outfile) - outfile = argv[i]; - else - { - USAGE: - fprintf (stderr, - "usage: %s [-verbose] [-scale N] [-quality NN] " - "infile.pdf outfile.jpg\n", - progname); - exit (1); - } - } - - if (!infile || !outfile) - goto USAGE; - - - // Much of Cocoa needs one of these to be available. - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - //Need an NSApp instance to make [NSImage TIFFRepresentation] work - NSApp = [NSApplication sharedApplication]; - [NSApp autorelease]; - - if (verbose) - fprintf (stderr, "%s: reading %s...\n", progname, infile); - - // Load the PDF file into an NSData object: - NSData *pdf_data = [NSData dataWithContentsOfFile: - [NSString stringWithCString:infile - encoding:NSUTF8StringEncoding]]; - - // Create an NSPDFImageRep from the data: - NSPDFImageRep *pdf_rep = [NSPDFImageRep imageRepWithData:pdf_data]; - - // Create an NSImage instance - NSRect rect; - rect.size = [pdf_rep size]; - rect.size.width *= scale; - rect.size.height *= scale; - rect.origin.x = rect.origin.y = 0; - NSImage *image = [[NSImage alloc] initWithSize:rect.size]; - - // Draw the PDFImageRep in the NSImage - [image lockFocus]; - [pdf_rep drawInRect:rect]; - [image unlockFocus]; - - // Load the NSImage's contents into an NSBitmapImageRep: - NSBitmapImageRep *bit_rep = [NSBitmapImageRep - imageRepWithData:[image TIFFRepresentation]]; - - // Write the bitmapImageRep to a JPEG file: - if (bit_rep == nil) - { - fprintf (stderr, "%s: error converting image?\n", argv[0]); - exit (1); - } - - if (verbose) - fprintf (stderr, "%s: writing %s (%d%% quality)...\n", - progname, outfile, (int) (compression * 100)); - - NSDictionary *props = [NSDictionary - dictionaryWithObject: - [NSNumber numberWithFloat:compression] - forKey:NSImageCompressionFactor]; - NSData *jpeg_data = [bit_rep representationUsingType:NSBitmapImageFileTypeJPEG - properties:props]; - - [jpeg_data writeToFile: - [NSString stringWithCString:outfile - encoding:NSUTF8StringEncoding] - atomically:YES]; - [image release]; - - [pool release]; - exit (0); -} diff --git a/driver/pdf2jpeg.man b/driver/pdf2jpeg.man deleted file mode 100644 index 9d80dd76..00000000 --- a/driver/pdf2jpeg.man +++ /dev/null @@ -1,43 +0,0 @@ -.TH XScreenSaver 1 "07-Sep-2003 (4.13)" "X Version 11" -.SH NAME -pdf2jpeg - converts a PDF file to a JPEG file using Cocoa -.SH SYNOPSIS -.B pdf2jpeg -[\--verbose] [\--quality \fINN\fP] infile.pdf outfile.jpg -.SH DESCRIPTION -This reads a PDF file (for example, as written by the -.BR screencapture (1) -program) and writes a JPEG file. -.SH OPTIONS -.I pdf2jpeg -accepts the following options: -.TP 4 -.B --verbose -Print diagnostics. -.TP 4 -.B --quality \fINN\fP -JPEG compression factor. Default 85%. -.SH BUGS -The input and output files must be files: pipes don't work. - -This program is Cocoa-specific, so it won't work on non-MacOS systems. - -This shouldn't need to be a part of the XScreenSaver distribution at -all, but Apple is COMPLETELY INSANE and made -.BR screencapture (1) -only write PDFs, with no simple way to convert that to something -less crazy. -.SH SEE ALSO -.BR screencapture (1), -.BR xscreensaver\-getimage\-desktop (1) -.SH COPYRIGHT -Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy, -modify, distribute, and sell this software and its documentation for -any purpose is hereby granted without fee, provided that the above -copyright notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting documentation. -No representations are made about the suitability of this software for -any purpose. It is provided "as is" without express or implied -warranty. -.SH AUTHOR -Jamie Zawinski , 20-Oct-03. diff --git a/driver/prefs.c b/driver/prefs.c index ab97ffad..a65b6793 100644 --- a/driver/prefs.c +++ b/driver/prefs.c @@ -1,5 +1,5 @@ -/* dotfile.c --- management of the ~/.xscreensaver file. - * xscreensaver, Copyright (c) 1998-2020 Jamie Zawinski +/* prefs.c --- reading and writing the ~/.xscreensaver file. + * xscreensaver, Copyright © 1998-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -14,309 +14,20 @@ # include "config.h" #endif -#include - -#ifdef HAVE_UNISTD_H -# include -#endif - #include -#include +#include #include #include #include #include -#include /* for PATH_MAX */ -#include -#include - -#ifndef VMS -# include -#else /* VMS */ -# include "vms-pwd.h" -#endif /* VMS */ - - -/* This file doesn't need the Xt headers, so stub these types out... */ -#undef XtPointer -#define XtAppContext void* -#define XtIntervalId void* -#define XtPointer void* -#define Widget void* - - -/* Just in case there's something pathological about stat.h... */ -#ifndef S_IRUSR -# define S_IRUSR 00400 -#endif -#ifndef S_IWUSR -# define S_IWUSR 00200 -#endif -#ifndef S_IXUSR -# define S_IXUSR 00100 -#endif -#ifndef S_IXGRP -# define S_IXGRP 00010 -#endif -#ifndef S_IXOTH -# define S_IXOTH 00001 +#ifdef HAVE_UNISTD_H +# include #endif - -#include "version.h" +#include "blurb.h" #include "prefs.h" -#include "resources.h" - -/* don't use realpath() on fedora system */ -#ifdef _FORTIFY_SOURCE -#undef HAVE_REALPATH -#endif - - -extern char *progname; -extern char *progclass; -extern const char *blurb (void); - - - -static void get_screenhacks (Display *, saver_preferences *); -static char *format_command (const char *cmd, Bool wrap_p); -static void merge_system_screenhacks (Display *, saver_preferences *, - screenhack **system_list, int count); -static void stop_the_insanity (saver_preferences *p); - - -static char * -chase_symlinks (const char *file) -{ -# ifdef HAVE_REALPATH - if (file) - { -# ifndef PATH_MAX -# ifdef MAXPATHLEN -# define PATH_MAX MAXPATHLEN -# else -# define PATH_MAX 2048 -# endif -# endif - char buf[PATH_MAX]; - if (realpath (file, buf)) - return strdup (buf); - -/* sprintf (buf, "%.100s: realpath %.200s", blurb(), file); - perror(buf);*/ - } -# endif /* HAVE_REALPATH */ - return 0; -} - - -static Bool -i_am_a_nobody (uid_t uid) -{ - struct passwd *p; - - p = getpwnam ("nobody"); - if (! p) p = getpwnam ("noaccess"); - if (! p) p = getpwnam ("daemon"); - - if (! p) /* There is no nobody? */ - return False; - - return (uid == p->pw_uid); -} - - -const char * -init_file_name (void) -{ - static char *file = 0; - - if (!file) - { - uid_t uid = getuid (); - const char *home = getenv("HOME"); - - if (i_am_a_nobody (uid) || !home || !*home) - { - /* If we're running as nobody, then use root's .xscreensaver file - (since ~root/.xscreensaver and ~nobody/.xscreensaver are likely - to be different -- if we didn't do this, then xscreensaver-demo - would appear to have no effect when the luser is running as root.) - */ - struct passwd *p = getpwuid (uid); - uid = 0; - if (!p || !p->pw_name || !*p->pw_name) - { - fprintf (stderr, "%s: couldn't get user info of uid %d\n", - blurb(), getuid ()); - } - else if (!p->pw_dir || !*p->pw_dir) - { - fprintf (stderr, "%s: couldn't get home directory of \"%s\"\n", - blurb(), (p->pw_name ? p->pw_name : "???")); - } - else - { - home = p->pw_dir; - } - } - if (home && *home) - { - const char *name = ".xscreensaver"; - file = (char *) malloc(strlen(home) + strlen(name) + 2); - strcpy(file, home); - if (!*home || home[strlen(home)-1] != '/') - strcat(file, "/"); - strcat(file, name); - } - else - { - file = ""; - } - } - - if (file && *file) - return file; - else - return 0; -} - - -static const char * -init_file_tmp_name (void) -{ - static char *file = 0; - if (!file) - { - const char *name = init_file_name(); - const char *suffix = ".tmp"; - - char *n2 = chase_symlinks (name); - if (n2) name = n2; - if (!name || !*name) - file = ""; - else - { - file = (char *) malloc(strlen(name) + strlen(suffix) + 2); - strcpy(file, name); - strcat(file, suffix); - } - - if (n2) free (n2); - } - - if (file && *file) - return file; - else - return 0; -} - -static int -get_byte_resource (Display *dpy, char *name, char *class) -{ - char *s = get_string_resource (dpy, name, class); - char *s2 = s; - int n = 0; - if (!s) return 0; - - while (isspace(*s2)) s2++; - while (*s2 >= '0' && *s2 <= '9') - { - n = (n * 10) + (*s2 - '0'); - s2++; - } - while (isspace(*s2)) s2++; - if (*s2 == 'k' || *s2 == 'K') n <<= 10; - else if (*s2 == 'm' || *s2 == 'M') n <<= 20; - else if (*s2 == 'g' || *s2 == 'G') n <<= 30; - else if (*s2) - { - LOSE: - fprintf (stderr, "%s: %s must be a number of bytes, not \"%s\".\n", - progname, name, s); - free (s); - return 0; - } - s2++; - if (*s2 == 'b' || *s2 == 'B') s2++; - while (isspace(*s2)) s2++; - if (*s2) goto LOSE; - - free (s); - return n; -} - - -static const char * const prefs[] = { - "timeout", - "cycle", - "lock", - "lockVTs", /* not saved */ - "lockTimeout", - "passwdTimeout", - "visualID", - "installColormap", - "verbose", - "timestamp", - "splash", - "splashDuration", - "quad", - "demoCommand", - "prefsCommand", - "newLoginCommand", - "helpURL", /* not saved */ - "loadURL", /* not saved */ - "newLoginCommand", /* not saved */ - "nice", - "memoryLimit", - "fade", - "unfade", - "fadeSeconds", - "fadeTicks", - "captureStderr", - "captureStdout", /* not saved -- obsolete */ - "logFile", /* not saved */ - "ignoreUninstalledPrograms", - "font", - "dpmsEnabled", - "dpmsQuickOff", - "dpmsStandby", - "dpmsSuspend", - "dpmsOff", - "grabDesktopImages", - "grabVideoFrames", - "chooseRandomImages", - "imageDirectory", - "mode", - "selected", - "textMode", - "textLiteral", - "textFile", - "textProgram", - "textURL", - "", - "programs", - "", - "pointerPollTime", - "pointerHysteresis", - "windowCreationTimeout", - "initialDelay", - "sgiSaverExtension", /* not saved -- obsolete */ - "mitSaverExtension", /* not saved -- obsolete */ - "xidleExtension", /* not saved -- obsolete */ - "GetViewPortIsFullOfLies", - "procInterrupts", - "xinputExtensionDev", - "overlayStderr", - "overlayTextBackground", /* not saved -- X resources only */ - "overlayTextForeground", /* not saved -- X resources only */ - "bourneShell", /* not saved -- X resources only */ - "authWarningSlack", - 0 -}; static char * strip (char *s) @@ -334,85 +45,49 @@ strip (char *s) return s; } - -/* Reading - */ - -static int -handle_entry (XrmDatabase *db, const char *key, const char *value, - const char *filename, int line) -{ - int i; - for (i = 0; prefs[i]; i++) - if (*prefs[i] && !strcasecmp(key, prefs[i])) - { - char *val = strdup(value); - char *spec = (char *) malloc(strlen(progclass) + strlen(prefs[i]) +10); - strcpy(spec, progclass); - strcat(spec, "."); - strcat(spec, prefs[i]); - - XrmPutStringResource (db, spec, val); - - free(spec); - free(val); - return 0; - } - - fprintf(stderr, "%s: %s:%d: unknown option \"%s\"\n", - blurb(), filename, line, key); - return 1; -} - -static int -parse_init_file (saver_preferences *p) +/* Parse the .xscreensaver or XScreenSaver.ad file and run the callback + for each key-value pair. +*/ +int +parse_init_file (const char *name, + void (*handler) (int lineno, + const char *key, const char *val, + void *closure), + void *closure) { - time_t write_date = 0; - const char *name = init_file_name(); int line = 0; struct stat st; FILE *in; int buf_size = 1024; - char *buf; + char *buf = 0; if (!name) return 0; + if (stat (name, &st) != 0) goto FAIL; - if (stat(name, &st) != 0) - { - p->init_file_date = 0; - return 0; - } + buf = (char *) malloc (buf_size); + if (!buf) goto FAIL; in = fopen(name, "r"); if (!in) { - char *buf = (char *) malloc(1024 + strlen(name)); - sprintf(buf, "%s: error reading \"%s\"", blurb(), name); - perror(buf); - free(buf); - return -1; + sprintf (buf, "%s: error reading \"%.100s\"", blurb(), name); + perror (buf); + goto FAIL; } - if (fstat (fileno(in), &st) == 0) + if (fstat (fileno (in), &st) != 0) { - write_date = st.st_mtime; - } - else - { - char *buf = (char *) malloc(1024 + strlen(name)); - sprintf(buf, "%s: couldn't re-stat \"%s\"", blurb(), name); - perror(buf); - free(buf); + sprintf (buf, "%s: couldn't re-stat \"%.100s\"", blurb(), name); + perror (buf); + free (buf); return -1; } - buf = (char *) malloc(buf_size); - while (fgets (buf, buf_size-1, in)) { char *key, *value; - int L = strlen(buf); + int L = strlen (buf); line++; while (L > 2 && @@ -425,13 +100,13 @@ parse_init_file (saver_preferences *p) L -= 2; } buf_size += 1024; - buf = (char *) realloc(buf, buf_size); - if (!buf) exit(1); + buf = (char *) realloc (buf, buf_size); + if (!buf) goto FAIL; line++; if (!fgets (buf + L, buf_size-L-1, in)) break; - L = strlen(buf); + L = strlen (buf); } /* Now handle other backslash escapes. */ @@ -453,7 +128,7 @@ parse_init_file (saver_preferences *p) } } - key = strip(buf); + key = strip (buf); if (*key == '#' || *key == '!' || *key == ';' || *key == '\n' || *key == 0) @@ -462,1316 +137,23 @@ parse_init_file (saver_preferences *p) value = strchr (key, ':'); if (!value) { - fprintf(stderr, "%s: %s:%d: unparsable line: %s\n", blurb(), - name, line, key); + fprintf (stderr, "%s: %s:%d: unparsable line: %s\n", blurb(), + name, line, key); continue; } else { *value++ = 0; - value = strip(value); + value = strip (value); } - if (!p->db) abort(); - handle_entry (&p->db, key, value, name, line); + handler (line, key, value, closure); } fclose (in); - free(buf); - - p->init_file_date = write_date; + free (buf); return 0; -} - - -Bool -init_file_changed_p (saver_preferences *p) -{ - const char *name = init_file_name(); - struct stat st; - - if (!name) return False; - - if (stat(name, &st) != 0) - return False; - - if (p->init_file_date == st.st_mtime) - return False; - - return True; -} - - -/* Writing - */ - -static int -tab_to (FILE *out, int from, int to) -{ - int tab_width = 8; - int to_mod = (to / tab_width) * tab_width; - while (from < to_mod) - { - fprintf(out, "\t"); - from = (((from / tab_width) + 1) * tab_width); - } - while (from < to) - { - fprintf(out, " "); - from++; - } - return from; -} - -static char * -stab_to (char *out, int from, int to) -{ - int tab_width = 8; - int to_mod = (to / tab_width) * tab_width; - while (from < to_mod) - { - *out++ = '\t'; - from = (((from / tab_width) + 1) * tab_width); - } - while (from < to) - { - *out++ = ' '; - from++; - } - return out; -} - -static int -string_columns (const char *string, int length, int start) -{ - int tab_width = 8; - int col = start; - const char *end = string + length; - while (string < end) - { - if (*string == '\n') - col = 0; - else if (*string == '\t') - col = (((col / tab_width) + 1) * tab_width); - else - col++; - string++; - } - return col; -} - - -static void -write_entry (FILE *out, const char *key, const char *value) -{ - char *v = strdup(value ? value : ""); - char *v2 = v; - char *nl = 0; - int col; - Bool programs_p = (!strcmp(key, "programs")); - int tab = (programs_p ? 32 : 16); - Bool first = True; - - fprintf(out, "%s:", key); - col = strlen(key) + 1; - - if (strlen(key) > 14) - col = tab_to (out, col, 20); - - while (1) - { - if (!programs_p) - v2 = strip(v2); - nl = strchr(v2, '\n'); - if (nl) - *nl = 0; - - if (first && programs_p) - { - col = tab_to (out, col, 77); - fprintf (out, " \\\n"); - col = 0; - } - - if (first) - first = False; - else - { - col = tab_to (out, col, 75); - fprintf (out, " \\n\\\n"); - col = 0; - } - - if (!programs_p) - col = tab_to (out, col, tab); - - if (programs_p && - string_columns(v2, strlen (v2), col) + col > 75) - { - int L = strlen (v2); - int start = 0; - int end = start; - while (start < L) - { - while (v2[end] == ' ' || v2[end] == '\t') - end++; - while (v2[end] != ' ' && v2[end] != '\t' && - v2[end] != '\n' && v2[end] != 0) - end++; - if (string_columns (v2 + start, (end - start), col) >= 74) - { - col = tab_to (out, col, 75); - fprintf(out, " \\\n"); - col = tab_to (out, 0, tab + 2); - while (v2[start] == ' ' || v2[start] == '\t') - start++; - } - - col = string_columns (v2 + start, (end - start), col); - while (start < end) - fputc(v2[start++], out); - } - } - else - { - fprintf (out, "%s", v2); - col += string_columns(v2, strlen (v2), col); - } - - if (nl) - v2 = nl + 1; - else - break; - } - - fprintf(out, "\n"); - free(v); -} - -int -write_init_file (Display *dpy, - saver_preferences *p, const char *version_string, - Bool verbose_p) -{ - int status = -1; - const char *name = init_file_name(); - const char *tmp_name = init_file_tmp_name(); - char *n2 = chase_symlinks (name); - struct stat st; - int i, j; - - /* Kludge, since these aren't in the saver_preferences struct as strings... - */ - char *visual_name; - char *programs; - Bool overlay_stderr_p; - char *stderr_font; - FILE *out; - - if (!name) goto END; - - if (n2) name = n2; - - /* Throttle the various timeouts to reasonable values before writing - the file to disk. */ - stop_the_insanity (p); - - - if (verbose_p) - fprintf (stderr, "%s: writing \"%s\".\n", blurb(), name); - - unlink (tmp_name); - out = fopen(tmp_name, "w"); - if (!out) - { - char *buf = (char *) malloc(1024 + strlen(name)); - sprintf(buf, "%s: error writing \"%s\"", blurb(), name); - perror(buf); - free(buf); - goto END; - } - - /* Give the new .xscreensaver file the same permissions as the old one; - except ensure that it is readable and writable by owner, and not - executable. Extra hack: if we're running as root, make the file - be world-readable (so that the daemon, running as "nobody", will - still be able to read it.) - */ - if (stat(name, &st) == 0) - { - mode_t mode = st.st_mode; - mode |= S_IRUSR | S_IWUSR; /* read/write by user */ - mode &= ~(S_IXUSR | S_IXGRP | S_IXOTH); /* executable by none */ - - if (getuid() == (uid_t) 0) /* read by group/other */ - mode |= S_IRGRP | S_IROTH; - - if (fchmod (fileno(out), mode) != 0) - { - char *buf = (char *) malloc(1024 + strlen(name)); - sprintf (buf, "%s: error fchmodding \"%s\" to 0%o", blurb(), - tmp_name, (unsigned int) mode); - perror(buf); - free(buf); - goto END; - } - } - - /* Kludge, since these aren't in the saver_preferences struct... */ - visual_name = get_string_resource (dpy, "visualID", "VisualID"); - programs = 0; - overlay_stderr_p = get_boolean_resource (dpy, "overlayStderr", "Boolean"); - stderr_font = get_string_resource (dpy, "font", "Font"); - - i = 0; - { - char *ss; - char **hack_strings = (char **) - calloc (p->screenhacks_count, sizeof(char *)); - - for (j = 0; j < p->screenhacks_count; j++) - { - hack_strings[j] = format_hack (dpy, p->screenhacks[j], True); - i += strlen (hack_strings[j]); - i += 2; - } - - ss = programs = (char *) malloc(i + 10); - *ss = 0; - for (j = 0; j < p->screenhacks_count; j++) - { - strcat (ss, hack_strings[j]); - free (hack_strings[j]); - ss += strlen(ss); - *ss++ = '\n'; - *ss = 0; - } - free (hack_strings); - } - - { - struct passwd *pw = getpwuid (getuid ()); - char *whoami = (pw && pw->pw_name && *pw->pw_name - ? pw->pw_name - : ""); - time_t now = time ((time_t *) 0); - char *timestr = (char *) ctime (&now); - char *nl = (char *) strchr (timestr, '\n'); - if (nl) *nl = 0; - fprintf (out, - "# %s Preferences File\n" - "# Written by %s %s for %s on %s.\n" - "# https://www.jwz.org/xscreensaver/\n" - "\n", - progclass, progname, version_string, whoami, timestr); - } - - for (j = 0; prefs[j]; j++) - { - char buf[255]; - const char *pr = prefs[j]; - enum pref_type { pref_str, pref_int, pref_bool, pref_byte, pref_time - } type = pref_str; - const char *s = 0; - int i = 0; - Bool b = False; - Time t = 0; - - if (pr && !*pr) - { - fprintf(out, "\n"); - continue; - } - -# undef CHECK -# define CHECK(X) else if (!strcmp(pr, X)) - if (!pr || !*pr) ; - CHECK("timeout") type = pref_time, t = p->timeout; - CHECK("cycle") type = pref_time, t = p->cycle; - CHECK("lock") type = pref_bool, b = p->lock_p; - CHECK("lockVTs") continue; /* don't save, unused */ - CHECK("lockTimeout") type = pref_time, t = p->lock_timeout; - CHECK("passwdTimeout") type = pref_time, t = p->passwd_timeout; - CHECK("visualID") type = pref_str, s = visual_name; - CHECK("installColormap") type = pref_bool, b = p->install_cmap_p; - CHECK("verbose") type = pref_bool, b = p->verbose_p; - CHECK("timestamp") type = pref_bool, b = p->timestamp_p; - CHECK("splash") type = pref_bool, b = p->splash_p; - CHECK("splashDuration") type = pref_time, t = p->splash_duration; -# ifdef QUAD_MODE - CHECK("quad") type = pref_bool, b = p->quad_p; -# else /* !QUAD_MODE */ - CHECK("quad") continue; /* don't save */ -# endif /* !QUAD_MODE */ - CHECK("demoCommand") type = pref_str, s = p->demo_command; - CHECK("prefsCommand") type = pref_str, s = p->prefs_command; -/* CHECK("helpURL") type = pref_str, s = p->help_url; */ - CHECK("helpURL") continue; /* don't save */ -/* CHECK("loadURL") type = pref_str, s = p->load_url_command; */ - CHECK("loadURL") continue; /* don't save */ -/* CHECK("newLoginCommand") type = pref_str, s = p->new_login_command; */ - CHECK("newLoginCommand") continue; /* don't save */ - CHECK("nice") type = pref_int, i = p->nice_inferior; - CHECK("memoryLimit") type = pref_byte, i = p->inferior_memory_limit; - CHECK("fade") type = pref_bool, b = p->fade_p; - CHECK("unfade") type = pref_bool, b = p->unfade_p; - CHECK("fadeSeconds") type = pref_time, t = p->fade_seconds; - CHECK("fadeTicks") type = pref_int, i = p->fade_ticks; - CHECK("captureStderr") type = pref_bool, b = p->capture_stderr_p; - CHECK("captureStdout") continue; /* don't save */ - CHECK("logFile") continue; /* don't save */ - CHECK("ignoreUninstalledPrograms") - type = pref_bool, b = p->ignore_uninstalled_p; - - CHECK("font") type = pref_str, s = stderr_font; - - CHECK("dpmsEnabled") type = pref_bool, b = p->dpms_enabled_p; - CHECK("dpmsQuickOff") type = pref_bool, b = p->dpms_quickoff_p; - CHECK("dpmsStandby") type = pref_time, t = p->dpms_standby; - CHECK("dpmsSuspend") type = pref_time, t = p->dpms_suspend; - CHECK("dpmsOff") type = pref_time, t = p->dpms_off; - - CHECK("grabDesktopImages") type =pref_bool, b = p->grab_desktop_p; - CHECK("grabVideoFrames") type =pref_bool, b = p->grab_video_p; - CHECK("chooseRandomImages")type =pref_bool, b = p->random_image_p; - CHECK("imageDirectory") type =pref_str, s = p->image_directory; - - CHECK("mode") type = pref_str, - s = (p->mode == ONE_HACK ? "one" : - p->mode == BLANK_ONLY ? "blank" : - p->mode == DONT_BLANK ? "off" : - p->mode == RANDOM_HACKS_SAME - ? "random-same" - : "random"); - CHECK("selected") type = pref_int, i = p->selected_hack; - - CHECK("textMode") type = pref_str, - s = (p->tmode == TEXT_URL ? "url" : - p->tmode == TEXT_LITERAL ? "literal" : - p->tmode == TEXT_FILE ? "file" : - p->tmode == TEXT_PROGRAM ? "program" : - "date"); - CHECK("textLiteral") type = pref_str, s = p->text_literal; - CHECK("textFile") type = pref_str, s = p->text_file; - CHECK("textProgram") type = pref_str, s = p->text_program; - CHECK("textURL") type = pref_str, s = p->text_url; - - CHECK("programs") type = pref_str, s = programs; - CHECK("pointerPollTime") type = pref_time, t = p->pointer_timeout; - CHECK("pointerHysteresis")type = pref_int, i = p->pointer_hysteresis; - CHECK("windowCreationTimeout")type=pref_time,t= p->notice_events_timeout; - CHECK("initialDelay") type = pref_time, t = p->initial_delay; - CHECK("sgiSaverExtension") continue; /* don't save */ - CHECK("mitSaverExtension") continue; /* don't save */ - CHECK("xidleExtension") continue; /* don't save */ - CHECK("procInterrupts") type = pref_bool, b = p->use_proc_interrupts; - CHECK("xinputExtensionDev") type = pref_bool, b = p->use_xinput_extension; - CHECK("GetViewPortIsFullOfLies") type = pref_bool, - b = p->getviewport_full_of_lies_p; - CHECK("overlayStderr") type = pref_bool, b = overlay_stderr_p; - CHECK("overlayTextBackground") continue; /* don't save */ - CHECK("overlayTextForeground") continue; /* don't save */ - CHECK("bourneShell") continue; /* don't save */ - CHECK("authWarningSlack") type = pref_int, i = p->auth_warning_slack; - else abort(); -# undef CHECK - - switch (type) - { - case pref_str: - break; - case pref_int: - sprintf(buf, "%d", i); - s = buf; - break; - case pref_bool: - s = b ? "True" : "False"; - break; - case pref_time: - { - unsigned int hour = 0, min = 0, sec = (unsigned int) (t/1000); - if (sec >= 60) - { - min += (sec / 60); - sec %= 60; - } - if (min >= 60) - { - hour += (min / 60); - min %= 60; - } - sprintf (buf, "%u:%02u:%02u", hour, min, sec); - s = buf; - } - break; - case pref_byte: - { - if (i >= (1<<30) && i == ((i >> 30) << 30)) - sprintf(buf, "%dG", i >> 30); - else if (i >= (1<<20) && i == ((i >> 20) << 20)) - sprintf(buf, "%dM", i >> 20); - else if (i >= (1<<10) && i == ((i >> 10) << 10)) - sprintf(buf, "%dK", i >> 10); - else - sprintf(buf, "%d", i); - s = buf; - } - break; - default: - abort(); - break; - } - - if (pr && (!strcmp(pr, "mode") || !strcmp(pr, "textMode"))) - fprintf(out, "\n"); - - write_entry (out, pr, s); - } - - fprintf(out, "\n"); - - if (visual_name) free(visual_name); - if (stderr_font) free(stderr_font); - if (programs) free(programs); - - if (fclose(out) == 0) - { - time_t write_date = 0; - - if (stat(tmp_name, &st) == 0) - { - write_date = st.st_mtime; - } - else - { - char *buf = (char *) malloc(1024 + strlen(tmp_name) + strlen(name)); - sprintf(buf, "%s: couldn't stat \"%s\"", blurb(), tmp_name); - perror(buf); - unlink (tmp_name); - free(buf); - goto END; - } - - if (rename (tmp_name, name) != 0) - { - char *buf = (char *) malloc(1024 + strlen(tmp_name) + strlen(name)); - sprintf(buf, "%s: error renaming \"%s\" to \"%s\"", - blurb(), tmp_name, name); - perror(buf); - unlink (tmp_name); - free(buf); - goto END; - } - else - { - p->init_file_date = write_date; - - /* Since the .xscreensaver file is used for IPC, let's try and make - sure that the bits actually land on the disk right away. */ - /* Update 2020: Apparently here in the future, this sometimes takes - 3+ seconds, so let's not. */ - /* sync(); */ - - status = 0; /* wrote and renamed successfully! */ - } - } - else - { - char *buf = (char *) malloc(1024 + strlen(name)); - sprintf(buf, "%s: error closing \"%s\"", blurb(), name); - perror(buf); - free(buf); - unlink (tmp_name); - goto END; - } - - END: - if (n2) free (n2); - return status; -} - - -/* Parsing the resource database - */ - -void -free_screenhack (screenhack *hack) -{ - if (hack->visual) free (hack->visual); - if (hack->name) free (hack->name); - free (hack->command); - memset (hack, 0, sizeof(*hack)); - free (hack); -} - -static void -free_screenhack_list (screenhack **list, int count) -{ - int i; - if (!list) return; - for (i = 0; i < count; i++) - if (list[i]) - free_screenhack (list[i]); - free (list); -} - - - -/* Populate `saver_preferences' with the contents of the resource database. - Note that this may be called multiple times -- it is re-run each time - the ~/.xscreensaver file is reloaded. - - This function can be very noisy, since it issues resource syntax errors - and so on. - */ -void -load_init_file (Display *dpy, saver_preferences *p) -{ - static Bool first_time = True; - - screenhack **system_default_screenhacks = 0; - int system_default_screenhack_count = 0; - - if (first_time) - { - /* Get the programs resource before the .xscreensaver file has been - parsed and merged into the resource database for the first time: - this is the value of *programs from the app-defaults file. - Then clear it out so that it will be parsed again later, after - the init file has been read. - */ - get_screenhacks (dpy, p); - system_default_screenhacks = p->screenhacks; - system_default_screenhack_count = p->screenhacks_count; - p->screenhacks = 0; - p->screenhacks_count = 0; - } - - if (parse_init_file (p) != 0) /* file might have gone away */ - if (!first_time) return; - - first_time = False; - - p->xsync_p = get_boolean_resource (dpy, "synchronous", "Synchronous"); - p->verbose_p = get_boolean_resource (dpy, "verbose", "Boolean"); - p->timestamp_p = get_boolean_resource (dpy, "timestamp", "Boolean"); - p->lock_p = get_boolean_resource (dpy, "lock", "Boolean"); - p->fade_p = get_boolean_resource (dpy, "fade", "Boolean"); - p->unfade_p = get_boolean_resource (dpy, "unfade", "Boolean"); - p->fade_seconds = 1000 * get_seconds_resource (dpy, "fadeSeconds", "Time"); - p->fade_ticks = get_integer_resource (dpy, "fadeTicks", "Integer"); - p->install_cmap_p = get_boolean_resource (dpy, "installColormap", "Boolean"); - p->nice_inferior = get_integer_resource (dpy, "nice", "Nice"); - p->inferior_memory_limit = get_byte_resource (dpy, "memoryLimit", - "MemoryLimit"); - p->splash_p = get_boolean_resource (dpy, "splash", "Boolean"); -# ifdef QUAD_MODE - p->quad_p = get_boolean_resource (dpy, "quad", "Boolean"); -# endif - p->capture_stderr_p = get_boolean_resource (dpy, "captureStderr", "Boolean"); - p->ignore_uninstalled_p = get_boolean_resource (dpy, - "ignoreUninstalledPrograms", - "Boolean"); - - p->initial_delay = 1000 * get_seconds_resource (dpy, "initialDelay", "Time"); - p->splash_duration = 1000 * get_seconds_resource (dpy, "splashDuration", "Time"); - p->timeout = 1000 * get_minutes_resource (dpy, "timeout", "Time"); - p->lock_timeout = 1000 * get_minutes_resource (dpy, "lockTimeout", "Time"); - p->cycle = 1000 * get_minutes_resource (dpy, "cycle", "Time"); - p->passwd_timeout = 1000 * get_seconds_resource (dpy, "passwdTimeout", "Time"); - p->pointer_timeout = 1000 * get_seconds_resource (dpy, "pointerPollTime", "Time"); - p->pointer_hysteresis = get_integer_resource (dpy, "pointerHysteresis","Integer"); - p->notice_events_timeout = 1000*get_seconds_resource(dpy, - "windowCreationTimeout", - "Time"); - - p->dpms_enabled_p = get_boolean_resource (dpy, "dpmsEnabled", "Boolean"); - p->dpms_quickoff_p = get_boolean_resource (dpy, "dpmsQuickOff", "Boolean"); - p->dpms_standby = 1000 * get_minutes_resource (dpy, "dpmsStandby", "Time"); - p->dpms_suspend = 1000 * get_minutes_resource (dpy, "dpmsSuspend", "Time"); - p->dpms_off = 1000 * get_minutes_resource (dpy, "dpmsOff", "Time"); - - p->grab_desktop_p = get_boolean_resource (dpy, "grabDesktopImages", "Boolean"); - p->grab_video_p = get_boolean_resource (dpy, "grabVideoFrames", "Boolean"); - p->random_image_p = get_boolean_resource (dpy, "chooseRandomImages", "Boolean"); - p->image_directory = get_string_resource (dpy, - "imageDirectory", - "ImageDirectory"); - - p->text_literal = get_string_resource (dpy, "textLiteral", "TextLiteral"); - p->text_file = get_string_resource (dpy, "textFile", "TextFile"); - p->text_program = get_string_resource (dpy, "textProgram", "TextProgram"); - p->text_url = get_string_resource (dpy, "textURL", "TextURL"); - - p->shell = get_string_resource (dpy, "bourneShell", "BourneShell"); - - p->demo_command = get_string_resource(dpy, "demoCommand", "URL"); - p->prefs_command = get_string_resource(dpy, "prefsCommand", "URL"); - p->help_url = get_string_resource(dpy, "helpURL", "URL"); - p->load_url_command = get_string_resource(dpy, "loadURL", "LoadURL"); - p->new_login_command = get_string_resource(dpy, - "newLoginCommand", - "NewLoginCommand"); - p->auth_warning_slack = get_integer_resource(dpy, "authWarningSlack", - "Integer"); - - /* If "*splash" is unset, default to true. */ - { - char *s = get_string_resource (dpy, "splash", "Boolean"); - if (s) - free (s); - else - p->splash_p = True; - } - - /* If "*grabDesktopImages" is unset, default to true. */ - { - char *s = get_string_resource (dpy, "grabDesktopImages", "Boolean"); - if (s) - free (s); - else - p->grab_desktop_p = True; - } - - p->use_xidle_extension = get_boolean_resource (dpy, "xidleExtension","Boolean"); -#if 0 /* obsolete. */ - p->use_sgi_saver_extension = get_boolean_resource (dpy, - "sgiSaverExtension", - "Boolean"); -#endif -#ifdef HAVE_XINPUT - p->use_xinput_extension = get_boolean_resource (dpy, "xinputExtensionDev", - "Boolean"); -#endif -#if 0 /* broken and evil. */ - p->use_mit_saver_extension = get_boolean_resource (dpy, - "mitSaverExtension", - "Boolean"); -#endif - - p->use_proc_interrupts = get_boolean_resource (dpy, - "procInterrupts", "Boolean"); - - p->getviewport_full_of_lies_p = - get_boolean_resource (dpy, "GetViewPortIsFullOfLies", "Boolean"); - - get_screenhacks (dpy, p); /* Parse the "programs" resource. */ - - { - char *s = get_string_resource (dpy, "selected", "Integer"); - if (!s || !*s) - p->selected_hack = -1; - else - p->selected_hack = get_integer_resource (dpy, "selected", "Integer"); - if (s) free (s); - if (p->selected_hack < 0 || p->selected_hack >= p->screenhacks_count) - p->selected_hack = -1; - } - - { - char *s = get_string_resource (dpy, "mode", "Mode"); - if (s && !strcasecmp (s, "one")) p->mode = ONE_HACK; - else if (s && !strcasecmp (s, "blank")) p->mode = BLANK_ONLY; - else if (s && !strcasecmp (s, "off")) p->mode = DONT_BLANK; - else if (s && !strcasecmp (s, "random-same")) p->mode = RANDOM_HACKS_SAME; - else p->mode = RANDOM_HACKS; - if (s) free (s); - } - - { - char *s = get_string_resource (dpy, "textMode", "TextMode"); - if (s && !strcasecmp (s, "url")) p->tmode = TEXT_URL; - else if (s && !strcasecmp (s, "literal")) p->tmode = TEXT_LITERAL; - else if (s && !strcasecmp (s, "file")) p->tmode = TEXT_FILE; - else if (s && !strcasecmp (s, "program")) p->tmode = TEXT_PROGRAM; - else p->tmode = TEXT_DATE; - if (s) free (s); - } - - if (system_default_screenhack_count) /* note: first_time is also true */ - { - merge_system_screenhacks (dpy, p, system_default_screenhacks, - system_default_screenhack_count); - free_screenhack_list (system_default_screenhacks, - system_default_screenhack_count); - system_default_screenhacks = 0; - system_default_screenhack_count = 0; - } - - if (p->debug_p) - { - p->xsync_p = True; - p->verbose_p = True; - p->timestamp_p = True; - p->initial_delay = 0; - } - - /* Throttle the various timeouts to reasonable values after reading the - disk file. */ - stop_the_insanity (p); -} - - -/* If there are any hacks in the system-wide defaults that are not in - the ~/.xscreensaver file, add the new ones to the end of the list. - This does *not* actually save the file. - */ -static void -merge_system_screenhacks (Display *dpy, saver_preferences *p, - screenhack **system_list, int system_count) -{ - /* Yeah yeah, this is an N^2 operation, but I don't have hashtables handy, - so fuck it. */ - - int made_space = 0; - int i; - for (i = 0; i < system_count; i++) - { - int j; - Bool matched_p = False; - - for (j = 0; j < p->screenhacks_count; j++) - { - char *name; - if (!system_list[i]->name) - system_list[i]->name = make_hack_name (dpy, - system_list[i]->command); - - name = p->screenhacks[j]->name; - if (!name) - name = make_hack_name (dpy, p->screenhacks[j]->command); - - matched_p = !strcasecmp (name, system_list[i]->name); - - if (name != p->screenhacks[j]->name) - free (name); - - if (matched_p) - break; - } - - if (!matched_p) - { - /* We have an entry in the system-wide list that is not in the - user's .xscreensaver file. Add it to the end. - Note that p->screenhacks is a single malloc block, not a - linked list, so we have to realloc it. - */ - screenhack *oh = system_list[i]; - screenhack *nh = (screenhack *) malloc (sizeof(screenhack)); - - if (made_space == 0) - { - made_space = 10; - p->screenhacks = (screenhack **) - realloc (p->screenhacks, - (p->screenhacks_count + made_space + 1) - * sizeof(screenhack)); - if (!p->screenhacks) abort(); - } - - nh->enabled_p = oh->enabled_p; - nh->visual = oh->visual ? strdup(oh->visual) : 0; - nh->name = oh->name ? strdup(oh->name) : 0; - nh->command = oh->command ? strdup(oh->command) : 0; - - p->screenhacks[p->screenhacks_count++] = nh; - p->screenhacks[p->screenhacks_count] = 0; - made_space--; - -#if 0 - fprintf (stderr, "%s: noticed new hack: %s\n", blurb(), - (nh->name ? nh->name : make_hack_name (dpy, nh->command))); -#endif - } - } -} - - - -/* Parsing the programs resource. - */ - -screenhack * -parse_screenhack (const char *line) -{ - screenhack *h = (screenhack *) calloc (1, sizeof(*h)); - const char *s; - - h->enabled_p = True; - - while (isspace(*line)) line++; /* skip whitespace */ - if (*line == '-') /* handle "-" */ - { - h->enabled_p = False; - line++; - while (isspace(*line)) line++; /* skip whitespace */ - } - - s = line; /* handle "visual:" */ - while (*line && *line != ':' && *line != '"' && !isspace(*line)) - line++; - if (*line != ':') - line = s; - else - { - h->visual = (char *) malloc (line-s+1); - strncpy (h->visual, s, line-s); - h->visual[line-s] = 0; - if (*line == ':') line++; /* skip ":" */ - while (isspace(*line)) line++; /* skip whitespace */ - } - - if (*line == '"') /* handle "name" */ - { - line++; - s = line; - while (*line && *line != '"') - line++; - h->name = (char *) malloc (line-s+1); - strncpy (h->name, s, line-s); - h->name[line-s] = 0; - if (*line == '"') line++; /* skip "\"" */ - while (isspace(*line)) line++; /* skip whitespace */ - } - - h->command = format_command (line, False); /* handle command */ - return h; -} - - -static char * -format_command (const char *cmd, Bool wrap_p) -{ - int tab = 30; - int col = tab; - char *cmd2 = (char *) calloc (1, 2 * (strlen (cmd) + 1)); - const char *in = cmd; - char *out = cmd2; - while (*in) - { - /* shrink all whitespace to one space, for the benefit of the "demo" - mode display. We only do this when we can easily tell that the - whitespace is not significant (no shell metachars). - */ - switch (*in) - { - case '\'': case '"': case '`': case '\\': - /* Metachars are scary. Copy the rest of the line unchanged. */ - while (*in) - *out++ = *in++, col++; - break; - - case ' ': case '\t': - /* Squeeze all other whitespace down to one space. */ - while (*in == ' ' || *in == '\t') - in++; - *out++ = ' ', col++; - break; - - default: - /* Copy other chars unchanged. */ - *out++ = *in++, col++; - break; - } - } - - *out = 0; - - /* Strip trailing whitespace */ - while (out > cmd2 && isspace (out[-1])) - *(--out) = 0; - - return cmd2; -} - - -/* Returns a new string describing the shell command. - This may be just the name of the program, capitalized. - It also may be something from the resource database (gotten - by looking for "hacks.XYZ.name", where XYZ is the program.) - */ -char * -make_hack_name (Display *dpy, const char *shell_command) -{ - char *s = strdup (shell_command); - char *s2; - char res_name[255]; - - for (s2 = s; *s2; s2++) /* truncate at first whitespace */ - if (isspace (*s2)) - { - *s2 = 0; - break; - } - - s2 = strrchr (s, '/'); /* if pathname, take last component */ - if (s2) - { - s2 = strdup (s2+1); - free (s); - s = s2; - } - - if (strlen (s) > 50) /* 51 is hereby defined as "unreasonable" */ - s[50] = 0; - - sprintf (res_name, "hacks.%s.name", s); /* resource? */ - s2 = get_string_resource (dpy, res_name, res_name); - if (s2) - { - free (s); - return s2; - } - - for (s2 = s; *s2; s2++) /* if it has any capitals, return it */ - if (*s2 >= 'A' && *s2 <= 'Z') - return s; - - if (s[0] >= 'a' && s[0] <= 'z') /* else cap it */ - s[0] -= 'a'-'A'; - if (s[0] == 'X' && s[1] >= 'a' && s[1] <= 'z') /* (magic leading X) */ - s[1] -= 'a'-'A'; - if (s[0] == 'G' && s[1] == 'l' && - s[2] >= 'a' && s[2] <= 'z') /* (magic leading GL) */ - s[1] -= 'a'-'A', - s[2] -= 'a'-'A'; - return s; -} - - -char * -format_hack (Display *dpy, screenhack *hack, Bool wrap_p) -{ - int tab = 32; - int size; - char *h2, *out, *s; - int col = 0; - - char *def_name = make_hack_name (dpy, hack->command); - - /* Don't ever write out a name for a hack if it's the same as the default. - */ - if (hack->name && !strcmp (hack->name, def_name)) - { - free (hack->name); - hack->name = 0; - } - free (def_name); - - size = (2 * (strlen(hack->command) + - (hack->visual ? strlen(hack->visual) : 0) + - (hack->name ? strlen(hack->name) : 0) + - tab)); - h2 = (char *) malloc (size); - out = h2; - - if (!hack->enabled_p) *out++ = '-'; /* write disabled flag */ - - if (hack->visual && *hack->visual) /* write visual name */ - { - if (hack->enabled_p) *out++ = ' '; - *out++ = ' '; - strcpy (out, hack->visual); - out += strlen (hack->visual); - *out++ = ':'; - *out++ = ' '; - } - - *out = 0; - col = string_columns (h2, strlen (h2), 0); - - if (hack->name && *hack->name) /* write pretty name */ - { - int L = (strlen (hack->name) + 2); - if (L + col < tab) - out = stab_to (out, col, tab - L - 2); - else - *out++ = ' '; - *out++ = '"'; - strcpy (out, hack->name); - out += strlen (hack->name); - *out++ = '"'; - *out = 0; - - col = string_columns (h2, strlen (h2), 0); - if (wrap_p && col >= tab) - out = stab_to (out, col, 77); - else - *out++ = ' '; - - if (out >= h2+size) abort(); - } - - *out = 0; - col = string_columns (h2, strlen (h2), 0); - out = stab_to (out, col, tab); /* indent */ - - if (out >= h2+size) abort(); - s = format_command (hack->command, wrap_p); - strcpy (out, s); - out += strlen (s); - free (s); - *out = 0; - - return h2; -} - - -static void -get_screenhacks (Display *dpy, saver_preferences *p) -{ - int i, j; - int start = 0; - int end = 0; - int size; - char *d; - - d = get_string_resource (dpy, "monoPrograms", "MonoPrograms"); - if (d && !*d) { free(d); d = 0; } - if (!d) - d = get_string_resource (dpy, "colorPrograms", "ColorPrograms"); - if (d && !*d) { free(d); d = 0; } - - if (d) - { - fprintf (stderr, - "%s: the `monoPrograms' and `colorPrograms' resources are obsolete;\n\ - see the manual for details.\n", blurb()); - free(d); - } - - d = get_string_resource (dpy, "programs", "Programs"); - - free_screenhack_list (p->screenhacks, p->screenhacks_count); - p->screenhacks = 0; - p->screenhacks_count = 0; - - if (!d || !*d) - return; - - size = strlen (d); - - - /* Count up the number of newlines (which will be equal to or larger than - one less than the number of hacks.) - */ - for (i = j = 0; d[i]; i++) - if (d[i] == '\n') - j++; - j++; - - p->screenhacks = (screenhack **) calloc (j + 1, sizeof (screenhack *)); - - /* Iterate over the lines in `d' (the string with newlines) - and make new strings to stuff into the `screenhacks' array. - */ - p->screenhacks_count = 0; - while (start < size) - { - /* skip forward over whitespace. */ - while (d[start] == ' ' || d[start] == '\t' || d[start] == '\n') - start++; - - /* skip forward to newline or end of string. */ - end = start; - while (d[end] != 0 && d[end] != '\n') - end++; - - /* null terminate. */ - d[end] = 0; - - p->screenhacks[p->screenhacks_count++] = parse_screenhack (d + start); - if (p->screenhacks_count >= i) - abort(); - - start = end+1; - } - - free (d); - - if (p->screenhacks_count == 0) - { - free (p->screenhacks); - p->screenhacks = 0; - } -} - - -/* Make sure all the values in the preferences struct are sane. - */ -static void -stop_the_insanity (saver_preferences *p) -{ - if (p->passwd_timeout <= 0) p->passwd_timeout = 30000; /* 30 secs */ - if (p->timeout < 15000) p->timeout = 15000; /* 15 secs */ - if (p->cycle != 0 && p->cycle < 2000) p->cycle = 2000; /* 2 secs */ - if (p->pointer_timeout <= 0) p->pointer_timeout = 5000; /* 5 secs */ - if (p->notice_events_timeout <= 0) - p->notice_events_timeout = 10000; /* 10 secs */ - if (p->fade_seconds <= 0 || p->fade_ticks <= 0) - p->fade_p = False; - if (! p->fade_p) p->unfade_p = False; - - /* The DPMS settings may have the value 0. - But if they are negative, or are a range less than 10 seconds, - reset them to sensible defaults. (Since that must be a mistake.) - */ - if (p->dpms_standby != 0 && - p->dpms_standby < 10 * 1000) - p->dpms_standby = 2 * 60 * 60 * 1000; /* 2 hours */ - if (p->dpms_suspend != 0 && - p->dpms_suspend < 10 * 1000) - p->dpms_suspend = 2 * 60 * 60 * 1000; /* 2 hours */ - if (p->dpms_off != 0 && - p->dpms_off < 10 * 1000) - p->dpms_off = 4 * 60 * 60 * 1000; /* 4 hours */ - - /* suspend may not be greater than off, unless off is 0. - standby may not be greater than suspend, unless suspend is 0. - */ - if (p->dpms_off != 0 && - p->dpms_suspend > p->dpms_off) - p->dpms_suspend = p->dpms_off; - if (p->dpms_suspend != 0 && - p->dpms_standby > p->dpms_suspend) - p->dpms_standby = p->dpms_suspend; - - /* These fixes above ignores the case - suspend = 0 and standby > off ... - */ - if (p->dpms_off != 0 && - p->dpms_standby > p->dpms_off) - p->dpms_standby = p->dpms_off; - - - if (p->dpms_standby == 0 && /* if *all* are 0, then DPMS is disabled */ - p->dpms_suspend == 0 && - p->dpms_off == 0 && - !(p->dpms_quickoff_p) /* ... but we want to do DPMS quick off */ - ) - p->dpms_enabled_p = False; - - - /* Set watchdog timeout to about half of the cycle timeout, but - don't let it be faster than 1/2 minute or slower than 1 minute. - */ - p->watchdog_timeout = p->cycle * 0.6; - if (p->watchdog_timeout < 27000) p->watchdog_timeout = 27000; /* 27 secs */ - if (p->watchdog_timeout > 57000) p->watchdog_timeout = 57000; /* 57 secs */ - - if (p->pointer_hysteresis < 0) p->pointer_hysteresis = 0; -/* if (p->pointer_hysteresis > 100) p->pointer_hysteresis = 100; */ - - if (p->auth_warning_slack < 0) p->auth_warning_slack = 0; - if (p->auth_warning_slack > 300) p->auth_warning_slack = 300; -} - - -Bool -senesculent_p (void) -{ - /* If you are in here because you're planning on disabling this warning - before redistributing my software, please don't. - - I sincerely request that you do one of the following: - - 1: leave this code intact and this warning in place, -OR- - - 2: Remove xscreensaver from your distribution. - - I would seriously prefer that you not distribute my software at all - than that you distribute one version and then never update it for - years. - - I am *constantly* getting email from users reporting bugs that have - been fixed for literally years who have no idea that the software - they are running is years out of date. Yes, it would be great if we - lived in the ideal world where people checked that they were running - the latest release before they report a bug, but we don't. To most - people, "running the latest release" is synonymous with "running the - latest release that my distro packages for me." - - When they even bother to tell me what version they're running, I - say, "That version is three years old!", and they say "But this is - the latest version my distro ships". Then I say, "your distro - sucks", and they say "but I don't know how to compile from source, - herp derp I eat paste", and *everybody* goes away unhappy. - - It wastes an enormous amount of my time, but worse than that, it - does a grave disservice to the users, who are stuck experiencing - bugs that are already fixed! These users think they are running the - latest release, and they are not. They would like to be running the - actual latest release, but they don't know how, because their distro - makes that very difficult for them. It's terrible for everyone, and - kind of makes me regret ever having released this software in the - first place. - - So seriously. I ask that if you're planning on disabling this - obsolescence warning, that you instead just remove xscreensaver from - your distro entirely. Everybody will be happier that way. Check - out gnome-screensaver instead, I understand it's really nice. - - Of course, my license allows you to ignore me and do whatever the - fuck you want, but as the author, I hope you will have the common - courtesy of complying with my request. - - Thank you! - - jwz, 2014, 2016, 2018. - - PS: In particular, since Debian refuses to upgrade software on any - kind of rational timeline, I have asked that they stop shipping - xscreensaver at all. They have refused. Instead of upgrading the - software, they simply patched out this warning. - - If you want to witness the sad state of the open source peanut - gallery, look no farther than the comments on my blog: - http://jwz.org/b/yiYo - - Many of these people fall back on their go-to argument of, "If it is - legal, it must be right." If you believe in that rhetorical device - then you are a terrible person, and possibly a sociopath. - - There are also the armchair lawyers who say "Well, instead of - *asking* people to do the right thing out of common courtesy, you - should just change your license to prohibit them from acting - amorally." Again, this is the answer of a sociopath, but that aside, - if you devote even a second's thought to this you will realize that - the end result of this would be for distros like Debian to just keep - shipping the last version with the old license and then never - upgrading it again -- which would be the worst possible outcome for - everyone involved, most especially the users. - */ - time_t now = time ((time_t *) 0); /* d */ - struct tm *tm = localtime (&now); /* o */ - const char *s = screensaver_id; /* n */ - char mon[4], year[5]; /* ' */ - int m, y, mrnths; /* t */ - s = strchr (s, ' '); if (!s) abort(); s++; /* */ - s = strchr (s, '('); if (!s) abort(); s++; /* d */ - s = strchr (s, '-'); if (!s) abort(); s++; /* o */ - strncpy (mon, s, 3); /* o */ - mon[3] = 0; /* */ - s = strchr (s, '-'); if (!s) abort(); s++; /* e */ - strncpy (year, s, 4); /* e */ - year[4] = 0; /* t */ - y = atoi (year); /* , */ - if (!strcmp(mon, "Jan")) m = 0; /* */ - else if (!strcmp(mon, "Feb")) m = 1; /* s */ - else if (!strcmp(mon, "Mar")) m = 2; /* t */ - else if (!strcmp(mon, "Apr")) m = 3; /* o */ - else if (!strcmp(mon, "May")) m = 4; /* p */ - else if (!strcmp(mon, "Jun")) m = 5; /* , */ - else if (!strcmp(mon, "Jul")) m = 6; /* */ - else if (!strcmp(mon, "Aug")) m = 7; /* s */ - else if (!strcmp(mon, "Sep")) m = 8; /* t */ - else if (!strcmp(mon, "Oct")) m = 9; /* a */ - else if (!strcmp(mon, "Nov")) m = 10; /* a */ - else if (!strcmp(mon, "Dec")) m = 11; /* a */ - else abort(); /* h */ - mrnths = ((((tm->tm_year + 1900) * 12) + tm->tm_mon) - /* h */ - (y * 12 + m)); /* h */ - /* p */ - return (mrnths >= 17); /* . */ + FAIL: + if (buf) free (buf); + return -1; } diff --git a/driver/prefs.h b/driver/prefs.h index cd1016d0..14d5542e 100644 --- a/driver/prefs.h +++ b/driver/prefs.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1993-2018 Jamie Zawinski +/* xscreensaver, Copyright © 1993-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -12,26 +12,10 @@ #ifndef __XSCREENSAVER_PREFS_H__ #define __XSCREENSAVER_PREFS_H__ -#include "types.h" - -extern void load_init_file (Display *, saver_preferences *); -extern Bool init_file_changed_p (saver_preferences *); -extern int write_init_file (Display *, - saver_preferences *, const char *version_string, - Bool verbose_p); -const char *init_file_name (void); -extern Bool senesculent_p (void); - -extern screenhack *parse_screenhack (const char *line); -extern void free_screenhack (screenhack *); -extern char *format_hack (Display *, screenhack *, Bool wrap_p); -char *make_hack_name (Display *, const char *shell_command); - -/* From dpms.c */ -extern void sync_server_dpms_settings (Display *, Bool enabled_p, - Bool dpms_quickoff_p, - int standby_secs, int suspend_secs, - int off_secs, - Bool verbose_p); +extern int parse_init_file (const char *name, + void (*handler) (int lineno, + const char *key, const char *val, + void *closure), + void *closure); #endif /* __XSCREENSAVER_PREFS_H__ */ diff --git a/driver/prefsw.c b/driver/prefsw.c new file mode 100644 index 00000000..2bbf94fc --- /dev/null +++ b/driver/prefsw.c @@ -0,0 +1,1555 @@ +/* prefs.c --- reading and writing the ~/.xscreensaver file. + * xscreensaver, Copyright © 1998-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#ifdef HAVE_UNISTD_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include /* for PATH_MAX */ +#include + +#include +#include +#include + +#include "version.h" +#include "types.h" +#include "prefs.h" +#include "resources.h" +#include "blurb.h" + +/* don't use realpath() on fedora system */ +#ifdef _FORTIFY_SOURCE +# undef HAVE_REALPATH +#endif + + +extern char *progclass; + +static void get_screenhacks (Display *, saver_preferences *); +static char *format_command (const char *cmd, Bool wrap_p); +static void merge_system_screenhacks (Display *, saver_preferences *, + screenhack **system_list, int count); +static void stop_the_insanity (saver_preferences *p); + +static char *format_hack (Display *, screenhack *, Bool wrap_p); + +static char * +chase_symlinks (const char *file) +{ +# ifdef HAVE_REALPATH + if (file) + { +# ifndef PATH_MAX +# ifdef MAXPATHLEN +# define PATH_MAX MAXPATHLEN +# else +# define PATH_MAX 2048 +# endif +# endif + char buf[PATH_MAX]; + if (realpath (file, buf)) + return strdup (buf); + +/* sprintf (buf, "%.100s: realpath %.200s", blurb(), file); + perror(buf);*/ + } +# endif /* HAVE_REALPATH */ + return 0; +} + + +static Bool +i_am_a_nobody (uid_t uid) +{ + struct passwd *p; + + p = getpwnam ("nobody"); + if (! p) p = getpwnam ("noaccess"); + if (! p) p = getpwnam ("daemon"); + + if (! p) /* There is no nobody? */ + return False; + + return (uid == p->pw_uid); +} + + +const char * +init_file_name (void) +{ + static char *file = 0; + + if (!file) + { + uid_t uid = getuid (); + const char *home = getenv("HOME"); + + if (i_am_a_nobody (uid) || !home || !*home) + { + /* If we're running as nobody, then use root's .xscreensaver file + (since ~root/.xscreensaver and ~nobody/.xscreensaver are likely + to be different -- without this, xscreensaver-settings would + appear to have no effect when the luser is running as root.) + */ + struct passwd *p = getpwuid (uid); + if (!p || !p->pw_name || !*p->pw_name) + { + fprintf (stderr, "%s: couldn't get user info of uid %d\n", + blurb(), getuid ()); + } + else if (!p->pw_dir || !*p->pw_dir) + { + fprintf (stderr, "%s: couldn't get home directory of \"%s\"\n", + blurb(), (p->pw_name ? p->pw_name : "???")); + } + else + { + home = p->pw_dir; + } + } + if (home && *home) + { + const char *name = ".xscreensaver"; + file = (char *) malloc(strlen(home) + strlen(name) + 2); + strcpy(file, home); + if (!*home || home[strlen(home)-1] != '/') + strcat(file, "/"); + strcat(file, name); + } + else + { + file = ""; + } + } + + if (file && *file) + return file; + else + return 0; +} + + +static const char * +init_file_tmp_name (void) +{ + static char *file = 0; + if (!file) + { + const char *name = init_file_name(); + const char *suffix = ".tmp"; + + char *n2 = chase_symlinks (name); + if (n2) name = n2; + + if (!name || !*name) + file = ""; + else + { + file = (char *) malloc(strlen(name) + strlen(suffix) + 2); + strcpy(file, name); + strcat(file, suffix); + } + + if (n2) free (n2); + } + + if (file && *file) + return file; + else + return 0; +} + +static const char * const prefs[] = { + "timeout", + "cycle", + "lock", + "lockVTs", /* not saved */ + "lockTimeout", + "passwdTimeout", + "visualID", + "installColormap", + "verbose", + "splash", + "splashDuration", + "quad", + "demoCommand", + "prefsCommand", + "newLoginCommand", + "helpURL", /* not saved */ + "loadURL", /* not saved */ + "newLoginCommand", /* not saved */ + "nice", + "memoryLimit", /* not saved */ + "fade", + "unfade", + "fadeSeconds", + "fadeTicks", /* not saved */ + "logFile", /* not saved */ + "ignoreUninstalledPrograms", + "font", + "dpmsEnabled", + "dpmsQuickOff", + "dpmsStandby", + "dpmsSuspend", + "dpmsOff", + "grabDesktopImages", + "grabVideoFrames", + "chooseRandomImages", + "imageDirectory", + "mode", + "selected", + "textMode", + "textLiteral", + "textFile", + "textProgram", + "textURL", + "dialogTheme", + "", + "programs", + "", + "pointerHysteresis", + "bourneShell", /* not saved -- X resources only */ + "authWarningSlack", + 0 +}; + +static char * +strip (char *s) +{ + char *s2; + while (*s == '\t' || *s == ' ' || *s == '\r' || *s == '\n') + s++; + for (s2 = s; *s2; s2++) + ; + for (s2--; s2 >= s; s2--) + if (*s2 == '\t' || *s2 == ' ' || *s2 == '\r' || *s2 =='\n') + *s2 = 0; + else + break; + return s; +} + + +/* Reading + */ + +static int +handle_entry (XrmDatabase *db, const char *key, const char *value, + const char *filename, int line) +{ + int i; + for (i = 0; prefs[i]; i++) + if (*prefs[i] && !strcasecmp(key, prefs[i])) + { + char *val = strdup(value); + char *spec = (char *) malloc(strlen(progclass) + strlen(prefs[i]) +10); + strcpy(spec, progclass); + strcat(spec, "."); + strcat(spec, prefs[i]); + + XrmPutStringResource (db, spec, val); + + free(spec); + free(val); + return 0; + } + + /* fprintf(stderr, "%s: %s:%d: unknown option \"%s\"\n", + blurb(), filename, line, key); */ + return 1; +} + + +struct parser_closure { + const char *file; + saver_preferences *prefs; +}; + +static void line_handler (int lineno, + const char *key, const char *val, + void *closure) +{ + struct parser_closure *c = (struct parser_closure *) closure; + saver_preferences *p = c->prefs; + if (!p->db) abort(); + handle_entry (&p->db, key, val, c->file, lineno); +} + +static int +parse_init_file_1 (saver_preferences *p) +{ + time_t write_date = 0; + const char *name = init_file_name(); + struct parser_closure C; + struct stat st; + int status; + + if (!name) return 0; + + C.file = name; + C.prefs = p; + + if (stat(name, &st) == 0) + write_date = st.st_mtime; + else + { + p->init_file_date = 0; + return 0; + } + + status = parse_init_file (name, line_handler, &C); + + p->init_file_date = write_date; + return status; +} + + +Bool +init_file_changed_p (saver_preferences *p) +{ + const char *name = init_file_name(); + struct stat st; + + if (!name) return False; + + if (stat(name, &st) != 0) + return False; + + if (p->init_file_date == st.st_mtime) + return False; + + return True; +} + + +/* Writing + */ + +static int +tab_to (FILE *out, int from, int to) +{ + int tab_width = 8; + int to_mod = (to / tab_width) * tab_width; + while (from < to_mod) + { + fprintf(out, "\t"); + from = (((from / tab_width) + 1) * tab_width); + } + while (from < to) + { + fprintf(out, " "); + from++; + } + return from; +} + +static char * +stab_to (char *out, int from, int to) +{ + int tab_width = 8; + int to_mod = (to / tab_width) * tab_width; + while (from < to_mod) + { + *out++ = '\t'; + from = (((from / tab_width) + 1) * tab_width); + } + while (from < to) + { + *out++ = ' '; + from++; + } + return out; +} + +static int +string_columns (const char *string, int length, int start) +{ + int tab_width = 8; + int col = start; + const char *end = string + length; + while (string < end) + { + if (*string == '\n') + col = 0; + else if (*string == '\t') + col = (((col / tab_width) + 1) * tab_width); + else + col++; + string++; + } + return col; +} + + +static void +write_entry (FILE *out, const char *key, const char *value) +{ + char *v = strdup(value ? value : ""); + char *v2 = v; + char *nl = 0; + int col; + Bool programs_p = (!strcmp(key, "programs")); + int tab = (programs_p ? 32 : 16); + Bool first = True; + + fprintf(out, "%s:", key); + col = strlen(key) + 1; + + if (strlen(key) > 14) + col = tab_to (out, col, 20); + + while (1) + { + if (!programs_p) + v2 = strip(v2); + nl = strchr(v2, '\n'); + if (nl) + *nl = 0; + + if (first && programs_p) + { + col = tab_to (out, col, 77); + fprintf (out, " \\\n"); + col = 0; + } + + if (first) + first = False; + else + { + col = tab_to (out, col, 75); + fprintf (out, " \\n\\\n"); + col = 0; + } + + if (!programs_p) + col = tab_to (out, col, tab); + + if (programs_p && + string_columns(v2, strlen (v2), col) + col > 75) + { + int L = strlen (v2); + int start = 0; + int end = start; + while (start < L) + { + while (v2[end] == ' ' || v2[end] == '\t') + end++; + while (v2[end] != ' ' && v2[end] != '\t' && + v2[end] != '\n' && v2[end] != 0) + end++; + if (string_columns (v2 + start, (end - start), col) >= 74) + { + col = tab_to (out, col, 75); + fprintf(out, " \\\n"); + col = tab_to (out, 0, tab + 2); + while (v2[start] == ' ' || v2[start] == '\t') + start++; + } + + col = string_columns (v2 + start, (end - start), col); + while (start < end) + fputc(v2[start++], out); + } + } + else + { + fprintf (out, "%s", v2); + col += string_columns(v2, strlen (v2), col); + } + + if (nl) + v2 = nl + 1; + else + break; + } + + fprintf(out, "\n"); + free(v); +} + +int +write_init_file (Display *dpy, + saver_preferences *p, const char *version_string, + Bool verbose_p) +{ + int status = -1; + const char *name = init_file_name(); + const char *tmp_name = init_file_tmp_name(); + char *n2 = chase_symlinks (name); + struct stat st; + int i, j; + + /* Kludge, since these aren't in the saver_preferences struct as strings... + */ + char *visual_name; + char *programs; + Bool overlay_stderr_p; + char *stderr_font; + FILE *out; + + if (!name) goto END; + + if (n2) name = n2; + + /* Throttle the various timeouts to reasonable values before writing + the file to disk. */ + stop_the_insanity (p); + + + if (verbose_p) + fprintf (stderr, "%s: writing \"%s\"\n", blurb(), name); + + unlink (tmp_name); + out = fopen(tmp_name, "w"); + if (!out) + { + char *buf = (char *) malloc(1024 + strlen(name)); + sprintf(buf, "%s: error writing \"%s\"", blurb(), name); + perror(buf); + free(buf); + goto END; + } + + /* Give the new .xscreensaver file the same permissions as the old one; + except ensure that it is readable and writable by owner, and not + executable. Extra hack: if we're running as root, make the file + be world-readable (so that the daemon, running as "nobody", will + still be able to read it.) + */ + if (stat(name, &st) == 0) + { + mode_t mode = st.st_mode; + mode |= S_IRUSR | S_IWUSR; /* read/write by user */ + mode &= ~(S_IXUSR | S_IXGRP | S_IXOTH); /* executable by none */ + + if (getuid() == (uid_t) 0) /* read by group/other */ + mode |= S_IRGRP | S_IROTH; + + if (fchmod (fileno(out), mode) != 0) + { + char *buf = (char *) malloc(1024 + strlen(name)); + sprintf (buf, "%s: error fchmodding \"%s\" to 0%o", blurb(), + tmp_name, (unsigned int) mode); + perror(buf); + free(buf); + goto END; + } + } + + /* Kludge, since these aren't in the saver_preferences struct... */ + visual_name = get_string_resource (dpy, "visualID", "VisualID"); + programs = 0; + overlay_stderr_p = get_boolean_resource (dpy, "overlayStderr", "Boolean"); + stderr_font = get_string_resource (dpy, "font", "Font"); + + i = 0; + { + char *ss; + char **hack_strings = (char **) + calloc (p->screenhacks_count, sizeof(char *)); + + for (j = 0; j < p->screenhacks_count; j++) + { + hack_strings[j] = format_hack (dpy, p->screenhacks[j], True); + i += strlen (hack_strings[j]); + i += 2; + } + + ss = programs = (char *) malloc(i + 10); + *ss = 0; + for (j = 0; j < p->screenhacks_count; j++) + { + strcat (ss, hack_strings[j]); + free (hack_strings[j]); + ss += strlen(ss); + *ss++ = '\n'; + *ss = 0; + } + free (hack_strings); + } + + { + struct passwd *pw = getpwuid (getuid ()); + char *whoami = (pw && pw->pw_name && *pw->pw_name + ? pw->pw_name + : ""); + time_t now = time ((time_t *) 0); + char *timestr = (char *) ctime (&now); + char *nl = (char *) strchr (timestr, '\n'); + if (nl) *nl = 0; + fprintf (out, + "# %s Preferences File\n" + "# Written by %s %s for %s on %s.\n" + "# https://www.jwz.org/xscreensaver/\n" + "\n", + progclass, progname, version_string, whoami, timestr); + } + + for (j = 0; prefs[j]; j++) + { + char buf[255]; + const char *pr = prefs[j]; + enum pref_type { pref_str, pref_int, pref_bool, pref_byte, pref_time + } type = pref_str; + const char *s = 0; + int i = 0; + Bool b = False; + Time t = 0; + + if (pr && !*pr) + { + fprintf(out, "\n"); + continue; + } + +# undef CHECK +# define CHECK(X) else if (!strcmp(pr, X)) + if (!pr || !*pr) ; + CHECK("timeout") type = pref_time, t = p->timeout; + CHECK("cycle") type = pref_time, t = p->cycle; + CHECK("lock") type = pref_bool, b = p->lock_p; + CHECK("lockVTs") continue; /* don't save, unused */ + CHECK("lockTimeout") type = pref_time, t = p->lock_timeout; + CHECK("passwdTimeout") type = pref_time, t = p->passwd_timeout; + CHECK("visualID") type = pref_str, s = visual_name; + CHECK("installColormap") type = pref_bool, b = p->install_cmap_p; + CHECK("verbose") type = pref_bool, b = p->verbose_p; + CHECK("splash") type = pref_bool, b = p->splash_p; + CHECK("splashDuration") type = pref_time, t = p->splash_duration; + CHECK("quad") continue; /* don't save */ + CHECK("demoCommand") type = pref_str, s = p->demo_command; + CHECK("prefsCommand") continue; /* don't save, unused */ + CHECK("helpURL") continue; /* don't save */ + CHECK("loadURL") continue; /* don't save */ + CHECK("newLoginCommand") continue; /* don't save */ + CHECK("dialogTheme") type = pref_str, s = p->dialog_theme; + CHECK("nice") type = pref_int, i = p->nice_inferior; + CHECK("memoryLimit") continue; /* don't save */ + CHECK("fade") type = pref_bool, b = p->fade_p; + CHECK("unfade") type = pref_bool, b = p->unfade_p; + CHECK("fadeSeconds") type = pref_time, t = p->fade_seconds; + CHECK("fadeTicks") continue; /* don't save */ + CHECK("captureStdout") continue; /* don't save */ + CHECK("logFile") continue; /* don't save */ + CHECK("ignoreUninstalledPrograms") + type = pref_bool, b = p->ignore_uninstalled_p; + + CHECK("font") type = pref_str, s = stderr_font; + + CHECK("dpmsEnabled") type = pref_bool, b = p->dpms_enabled_p; + CHECK("dpmsQuickOff") type = pref_bool, b = p->dpms_quickoff_p; + CHECK("dpmsStandby") type = pref_time, t = p->dpms_standby; + CHECK("dpmsSuspend") type = pref_time, t = p->dpms_suspend; + CHECK("dpmsOff") type = pref_time, t = p->dpms_off; + + CHECK("grabDesktopImages") type =pref_bool, b = p->grab_desktop_p; + CHECK("grabVideoFrames") type =pref_bool, b = p->grab_video_p; + CHECK("chooseRandomImages")type =pref_bool, b = p->random_image_p; + CHECK("imageDirectory") type =pref_str, s = p->image_directory; + + CHECK("mode") type = pref_str, + s = (p->mode == ONE_HACK ? "one" : + p->mode == BLANK_ONLY ? "blank" : + p->mode == DONT_BLANK ? "off" : + p->mode == RANDOM_HACKS_SAME + ? "random-same" + : "random"); + CHECK("selected") type = pref_int, i = p->selected_hack; + + CHECK("textMode") type = pref_str, + s = (p->tmode == TEXT_URL ? "url" : + p->tmode == TEXT_LITERAL ? "literal" : + p->tmode == TEXT_FILE ? "file" : + p->tmode == TEXT_PROGRAM ? "program" : + "date"); + CHECK("textLiteral") type = pref_str, s = p->text_literal; + CHECK("textFile") type = pref_str, s = p->text_file; + CHECK("textProgram") type = pref_str, s = p->text_program; + CHECK("textURL") type = pref_str, s = p->text_url; + + CHECK("programs") type = pref_str, s = programs; + CHECK("pointerHysteresis")type = pref_int, i = p->pointer_hysteresis; + CHECK("overlayStderr") type = pref_bool, b = overlay_stderr_p; + CHECK("overlayTextBackground") continue; /* don't save */ + CHECK("overlayTextForeground") continue; /* don't save */ + CHECK("bourneShell") continue; /* don't save */ + CHECK("authWarningSlack") type = pref_int, i = p->auth_warning_slack; + else + { + fprintf (stderr, "%s: internal error: key %s\n", blurb(), pr); + abort(); + } +# undef CHECK + + switch (type) + { + case pref_str: + break; + case pref_int: + sprintf(buf, "%d", i); + s = buf; + break; + case pref_bool: + s = b ? "True" : "False"; + break; + case pref_time: + { + unsigned int hour = 0, min = 0, sec = (unsigned int) (t/1000); + if (sec >= 60) + { + min += (sec / 60); + sec %= 60; + } + if (min >= 60) + { + hour += (min / 60); + min %= 60; + } + sprintf (buf, "%u:%02u:%02u", hour, min, sec); + s = buf; + } + break; + case pref_byte: + { + if (i >= (1<<30) && i == ((i >> 30) << 30)) + sprintf(buf, "%dG", i >> 30); + else if (i >= (1<<20) && i == ((i >> 20) << 20)) + sprintf(buf, "%dM", i >> 20); + else if (i >= (1<<10) && i == ((i >> 10) << 10)) + sprintf(buf, "%dK", i >> 10); + else + sprintf(buf, "%d", i); + s = buf; + } + break; + default: + abort(); + break; + } + + if (pr && (!strcmp(pr, "mode") || !strcmp(pr, "textMode"))) + fprintf(out, "\n"); + + write_entry (out, pr, s); + } + + fprintf(out, "\n"); + + if (visual_name) free(visual_name); + if (stderr_font) free(stderr_font); + if (programs) free(programs); + + if (fclose(out) == 0) + { + time_t write_date = 0; + + if (stat(tmp_name, &st) == 0) + { + write_date = st.st_mtime; + } + else + { + char *buf = (char *) malloc(1024 + strlen(tmp_name) + strlen(name)); + sprintf(buf, "%s: couldn't stat \"%s\"", blurb(), tmp_name); + perror(buf); + unlink (tmp_name); + free(buf); + goto END; + } + + if (rename (tmp_name, name) != 0) + { + char *buf = (char *) malloc(1024 + strlen(tmp_name) + strlen(name)); + sprintf(buf, "%s: error renaming \"%s\" to \"%s\"", + blurb(), tmp_name, name); + perror(buf); + unlink (tmp_name); + free(buf); + goto END; + } + else + { + p->init_file_date = write_date; + + /* Since the .xscreensaver file is used for IPC, let's try and make + sure that the bits actually land on the disk right away. */ + /* Update 2020: Apparently here in the future, this sometimes takes + 3+ seconds, so let's not. */ + /* sync(); */ + + status = 0; /* wrote and renamed successfully! */ + } + } + else + { + char *buf = (char *) malloc(1024 + strlen(name)); + sprintf(buf, "%s: error closing \"%s\"", blurb(), name); + perror(buf); + free(buf); + unlink (tmp_name); + goto END; + } + + END: + if (n2) free (n2); + return status; +} + + +/* Parsing the resource database + */ + +static void +free_screenhack (screenhack *hack) +{ + if (hack->visual) free (hack->visual); + if (hack->name) free (hack->name); + free (hack->command); + memset (hack, 0, sizeof(*hack)); + free (hack); +} + +static void +free_screenhack_list (screenhack **list, int count) +{ + int i; + if (!list) return; + for (i = 0; i < count; i++) + if (list[i]) + free_screenhack (list[i]); + free (list); +} + + + +/* Populate `saver_preferences' with the contents of the resource database. + Note that this may be called multiple times -- it is re-run each time + the ~/.xscreensaver file is reloaded. + + This function can be very noisy, since it issues resource syntax errors + and so on. + */ +void +load_init_file (Display *dpy, saver_preferences *p) +{ + static Bool first_time = True; + + screenhack **system_default_screenhacks = 0; + int system_default_screenhack_count = 0; + + if (first_time) + { + /* Get the programs resource before the .xscreensaver file has been + parsed and merged into the resource database for the first time: + this is the value of *programs from the app-defaults file. + Then clear it out so that it will be parsed again later, after + the init file has been read. + */ + get_screenhacks (dpy, p); + system_default_screenhacks = p->screenhacks; + system_default_screenhack_count = p->screenhacks_count; + p->screenhacks = 0; + p->screenhacks_count = 0; + } + + if (parse_init_file_1 (p) != 0) /* file might have gone away */ + if (!first_time) return; + + first_time = False; + + p->xsync_p = get_boolean_resource (dpy, "synchronous", "Synchronous"); + p->verbose_p = get_boolean_resource (dpy, "verbose", "Boolean"); + p->lock_p = get_boolean_resource (dpy, "lock", "Boolean"); + p->fade_p = get_boolean_resource (dpy, "fade", "Boolean"); + p->unfade_p = get_boolean_resource (dpy, "unfade", "Boolean"); + p->fade_seconds = 1000 * get_seconds_resource (dpy, "fadeSeconds", "Time"); + p->install_cmap_p = get_boolean_resource (dpy, "installColormap", "Boolean"); + p->nice_inferior = get_integer_resource (dpy, "nice", "Nice"); + p->splash_p = get_boolean_resource (dpy, "splash", "Boolean"); +# ifdef QUAD_MODE + p->quad_p = get_boolean_resource (dpy, "quad", "Boolean"); +# endif + p->ignore_uninstalled_p = get_boolean_resource (dpy, + "ignoreUninstalledPrograms", + "Boolean"); + + p->splash_duration = 1000 * get_seconds_resource (dpy, "splashDuration", "Time"); + p->timeout = 1000 * get_minutes_resource (dpy, "timeout", "Time"); + p->lock_timeout = 1000 * get_minutes_resource (dpy, "lockTimeout", "Time"); + p->cycle = 1000 * get_minutes_resource (dpy, "cycle", "Time"); + p->passwd_timeout = 1000 * get_seconds_resource (dpy, "passwdTimeout", "Time"); + p->pointer_hysteresis = get_integer_resource (dpy, "pointerHysteresis","Integer"); + + p->dpms_enabled_p = get_boolean_resource (dpy, "dpmsEnabled", "Boolean"); + p->dpms_quickoff_p = get_boolean_resource (dpy, "dpmsQuickOff", "Boolean"); + p->dpms_standby = 1000 * get_minutes_resource (dpy, "dpmsStandby", "Time"); + p->dpms_suspend = 1000 * get_minutes_resource (dpy, "dpmsSuspend", "Time"); + p->dpms_off = 1000 * get_minutes_resource (dpy, "dpmsOff", "Time"); + + p->grab_desktop_p = get_boolean_resource (dpy, "grabDesktopImages", "Boolean"); + p->grab_video_p = get_boolean_resource (dpy, "grabVideoFrames", "Boolean"); + p->random_image_p = get_boolean_resource (dpy, "chooseRandomImages", "Boolean"); + p->image_directory = get_string_resource (dpy, + "imageDirectory", + "ImageDirectory"); + + p->text_literal = get_string_resource (dpy, "textLiteral", "TextLiteral"); + p->text_file = get_string_resource (dpy, "textFile", "TextFile"); + p->text_program = get_string_resource (dpy, "textProgram", "TextProgram"); + p->text_url = get_string_resource (dpy, "textURL", "TextURL"); + + p->shell = get_string_resource (dpy, "bourneShell", "BourneShell"); + + p->demo_command = get_string_resource(dpy, "demoCommand", "Command"); + p->help_url = get_string_resource(dpy, "helpURL", "URL"); + p->load_url_command = get_string_resource(dpy, "loadURL", "Command"); + p->new_login_command = get_string_resource(dpy, "newLoginCommand", + "Command"); + p->dialog_theme = get_string_resource(dpy, "dialogTheme", "String"); + p->auth_warning_slack = get_integer_resource(dpy, "authWarningSlack", + "Integer"); + + /* If "*splash" is unset, default to true. */ + { + char *s = get_string_resource (dpy, "splash", "Boolean"); + if (s) + free (s); + else + p->splash_p = True; + } + + /* If "*grabDesktopImages" is unset, default to true. */ + { + char *s = get_string_resource (dpy, "grabDesktopImages", "Boolean"); + if (s) + free (s); + else + p->grab_desktop_p = True; + } + + get_screenhacks (dpy, p); /* Parse the "programs" resource. */ + + { + char *s = get_string_resource (dpy, "selected", "Integer"); + if (!s || !*s) + p->selected_hack = -1; + else + p->selected_hack = get_integer_resource (dpy, "selected", "Integer"); + if (s) free (s); + if (p->selected_hack < 0 || p->selected_hack >= p->screenhacks_count) + p->selected_hack = -1; + } + + { + char *s = get_string_resource (dpy, "mode", "Mode"); + if (s && !strcasecmp (s, "one")) p->mode = ONE_HACK; + else if (s && !strcasecmp (s, "blank")) p->mode = BLANK_ONLY; + else if (s && !strcasecmp (s, "off")) p->mode = DONT_BLANK; + else if (s && !strcasecmp (s, "random-same")) p->mode = RANDOM_HACKS_SAME; + else p->mode = RANDOM_HACKS; + if (s) free (s); + } + + { + char *s = get_string_resource (dpy, "textMode", "TextMode"); + if (s && !strcasecmp (s, "url")) p->tmode = TEXT_URL; + else if (s && !strcasecmp (s, "literal")) p->tmode = TEXT_LITERAL; + else if (s && !strcasecmp (s, "file")) p->tmode = TEXT_FILE; + else if (s && !strcasecmp (s, "program")) p->tmode = TEXT_PROGRAM; + else p->tmode = TEXT_DATE; + if (s) free (s); + } + + if (system_default_screenhack_count) /* note: first_time is also true */ + { + merge_system_screenhacks (dpy, p, system_default_screenhacks, + system_default_screenhack_count); + free_screenhack_list (system_default_screenhacks, + system_default_screenhack_count); + system_default_screenhacks = 0; + system_default_screenhack_count = 0; + } + + if (p->debug_p) + { + p->xsync_p = True; + p->verbose_p = True; + } + + /* Throttle the various timeouts to reasonable values after reading the + disk file. */ + stop_the_insanity (p); +} + + +/* If there are any hacks in the system-wide defaults that are not in + the ~/.xscreensaver file, add the new ones to the end of the list. + This does *not* actually save the file. + */ +static void +merge_system_screenhacks (Display *dpy, saver_preferences *p, + screenhack **system_list, int system_count) +{ + /* Yeah yeah, this is an N^2 operation, but I don't have hashtables handy, + so fuck it. */ + + int made_space = 0; + int i; + for (i = 0; i < system_count; i++) + { + int j; + Bool matched_p = False; + + for (j = 0; j < p->screenhacks_count; j++) + { + char *name; + if (!system_list[i]->name) + system_list[i]->name = make_hack_name (dpy, + system_list[i]->command); + + name = p->screenhacks[j]->name; + if (!name) + name = make_hack_name (dpy, p->screenhacks[j]->command); + + matched_p = !strcasecmp (name, system_list[i]->name); + + if (name != p->screenhacks[j]->name) + free (name); + + if (matched_p) + break; + } + + if (!matched_p) + { + /* We have an entry in the system-wide list that is not in the + user's .xscreensaver file. Add it to the end. + Note that p->screenhacks is a single malloc block, not a + linked list, so we have to realloc it. + */ + screenhack *oh = system_list[i]; + screenhack *nh = (screenhack *) malloc (sizeof(screenhack)); + + if (made_space == 0) + { + made_space = 10; + p->screenhacks = (screenhack **) + realloc (p->screenhacks, + (p->screenhacks_count + made_space + 1) + * sizeof(*p->screenhacks)); + if (!p->screenhacks) abort(); + } + + nh->enabled_p = oh->enabled_p; + nh->visual = oh->visual ? strdup(oh->visual) : 0; + nh->name = oh->name ? strdup(oh->name) : 0; + nh->command = oh->command ? strdup(oh->command) : 0; + + p->screenhacks[p->screenhacks_count++] = nh; + p->screenhacks[p->screenhacks_count] = 0; + made_space--; + +#if 0 + fprintf (stderr, "%s: noticed new hack: %s\n", blurb(), + (nh->name ? nh->name : make_hack_name (dpy, nh->command))); +#endif + } + } +} + + + +/* Parsing the programs resource. + */ + +static screenhack * +parse_screenhack (const char *line) +{ + screenhack *h = (screenhack *) calloc (1, sizeof(*h)); + const char *s; + + h->enabled_p = True; + + while (isspace(*line)) line++; /* skip whitespace */ + if (*line == '-') /* handle "-" */ + { + h->enabled_p = False; + line++; + while (isspace(*line)) line++; /* skip whitespace */ + } + + s = line; /* handle "visual:" */ + while (*line && *line != ':' && *line != '"' && !isspace(*line)) + line++; + if (*line != ':') + line = s; + else + { + h->visual = (char *) malloc (line-s+1); + strncpy (h->visual, s, line-s); + h->visual[line-s] = 0; + if (*line == ':') line++; /* skip ":" */ + while (isspace(*line)) line++; /* skip whitespace */ + } + + if (*line == '"') /* handle "name" */ + { + line++; + s = line; + while (*line && *line != '"') + line++; + h->name = (char *) malloc (line-s+1); + strncpy (h->name, s, line-s); + h->name[line-s] = 0; + if (*line == '"') line++; /* skip "\"" */ + while (isspace(*line)) line++; /* skip whitespace */ + } + + h->command = format_command (line, False); /* handle command */ + return h; +} + + +static char * +format_command (const char *cmd, Bool wrap_p) +{ + int tab = 30; + int col = tab; + char *cmd2 = (char *) calloc (1, 2 * (strlen (cmd) + 1)); + const char *in = cmd; + char *out = cmd2; + while (*in) + { + /* shrink all whitespace to one space, for the benefit of the "demo" + mode display. We only do this when we can easily tell that the + whitespace is not significant (no shell metachars). + */ + switch (*in) + { + case '\'': case '"': case '`': case '\\': + /* Metachars are scary. Copy the rest of the line unchanged. */ + while (*in) + *out++ = *in++, col++; + break; + + case ' ': case '\t': + /* Squeeze all other whitespace down to one space. */ + while (*in == ' ' || *in == '\t') + in++; + *out++ = ' ', col++; + break; + + default: + /* Copy other chars unchanged. */ + *out++ = *in++, col++; + break; + } + } + + *out = 0; + + /* Strip trailing whitespace */ + while (out > cmd2 && isspace (out[-1])) + *(--out) = 0; + + return cmd2; +} + + +/* Returns a new string describing the shell command. + This may be just the name of the program, capitalized. + It also may be something from the resource database (gotten + by looking for "hacks.XYZ.name", where XYZ is the program.) + */ +char * +make_hack_name (Display *dpy, const char *shell_command) +{ + char *s = strdup (shell_command); + char *s2; + char res_name[255]; + + for (s2 = s; *s2; s2++) /* truncate at first whitespace */ + if (isspace (*s2)) + { + *s2 = 0; + break; + } + + s2 = strrchr (s, '/'); /* if pathname, take last component */ + if (s2) + { + s2 = strdup (s2+1); + free (s); + s = s2; + } + + if (strlen (s) > 50) /* 51 is hereby defined as "unreasonable" */ + s[50] = 0; + + sprintf (res_name, "hacks.%s.name", s); /* resource? */ + s2 = get_string_resource (dpy, res_name, res_name); + if (s2) + { + free (s); + return s2; + } + + for (s2 = s; *s2; s2++) /* if it has any capitals, return it */ + if (*s2 >= 'A' && *s2 <= 'Z') + return s; + + if (s[0] >= 'a' && s[0] <= 'z') /* else cap it */ + s[0] -= 'a'-'A'; + if (s[0] == 'X' && s[1] >= 'a' && s[1] <= 'z') /* (magic leading X) */ + s[1] -= 'a'-'A'; + if (s[0] == 'G' && s[1] == 'l' && + s[2] >= 'a' && s[2] <= 'z') /* (magic leading GL) */ + s[1] -= 'a'-'A', + s[2] -= 'a'-'A'; + return s; +} + + +static char * +format_hack (Display *dpy, screenhack *hack, Bool wrap_p) +{ + int tab = 32; + int size; + char *h2, *out, *s; + int col = 0; + + char *def_name = make_hack_name (dpy, hack->command); + + /* Don't ever write out a name for a hack if it's the same as the default. + */ + if (hack->name && !strcmp (hack->name, def_name)) + { + free (hack->name); + hack->name = 0; + } + free (def_name); + + size = (2 * (strlen(hack->command) + + (hack->visual ? strlen(hack->visual) : 0) + + (hack->name ? strlen(hack->name) : 0) + + tab)); + h2 = (char *) malloc (size); + out = h2; + + if (!hack->enabled_p) *out++ = '-'; /* write disabled flag */ + + if (hack->visual && *hack->visual) /* write visual name */ + { + if (hack->enabled_p) *out++ = ' '; + *out++ = ' '; + strcpy (out, hack->visual); + out += strlen (hack->visual); + *out++ = ':'; + *out++ = ' '; + } + + *out = 0; + col = string_columns (h2, strlen (h2), 0); + + if (hack->name && *hack->name) /* write pretty name */ + { + int L = (strlen (hack->name) + 2); + if (L + col < tab) + out = stab_to (out, col, tab - L - 2); + else + *out++ = ' '; + *out++ = '"'; + strcpy (out, hack->name); + out += strlen (hack->name); + *out++ = '"'; + *out = 0; + + col = string_columns (h2, strlen (h2), 0); + if (wrap_p && col >= tab) + out = stab_to (out, col, 77); + else + *out++ = ' '; + + if (out >= h2+size) abort(); + } + + *out = 0; + col = string_columns (h2, strlen (h2), 0); + out = stab_to (out, col, tab); /* indent */ + + if (out >= h2+size) abort(); + s = format_command (hack->command, wrap_p); + strcpy (out, s); + out += strlen (s); + free (s); + *out = 0; + + return h2; +} + + +static void +get_screenhacks (Display *dpy, saver_preferences *p) +{ + int i, j; + int start = 0; + int end = 0; + int size; + char *d = get_string_resource (dpy, "programs", "Programs"); + + free_screenhack_list (p->screenhacks, p->screenhacks_count); + p->screenhacks = 0; + p->screenhacks_count = 0; + + if (!d || !*d) + return; + + size = strlen (d); + + + /* Count up the number of newlines (which will be equal to or larger than + one less than the number of hacks.) + */ + for (i = j = 0; d[i]; i++) + if (d[i] == '\n') + j++; + j++; + + p->screenhacks = (screenhack **) calloc (j + 1, sizeof (screenhack *)); + + /* Iterate over the lines in `d' (the string with newlines) + and make new strings to stuff into the `screenhacks' array. + */ + p->screenhacks_count = 0; + while (start < size) + { + /* skip forward over whitespace. */ + while (d[start] == ' ' || d[start] == '\t' || d[start] == '\n') + start++; + + /* skip forward to newline or end of string. */ + end = start; + while (d[end] != 0 && d[end] != '\n') + end++; + + /* null terminate. */ + d[end] = 0; + + p->screenhacks[p->screenhacks_count++] = parse_screenhack (d + start); + if (p->screenhacks_count >= i) + abort(); + + start = end+1; + } + + free (d); + + if (p->screenhacks_count == 0) + { + free (p->screenhacks); + p->screenhacks = 0; + } +} + + +/* Make sure all the values in the preferences struct are sane. + */ +static void +stop_the_insanity (saver_preferences *p) +{ + if (p->passwd_timeout <= 0) p->passwd_timeout = 30000; /* 30 secs */ + if (p->timeout < 15000) p->timeout = 15000; /* 15 secs */ + if (p->cycle != 0 && p->cycle < 2000) p->cycle = 2000; /* 2 secs */ + if (p->fade_seconds <= 0) + p->fade_p = False; + if (! p->fade_p) p->unfade_p = False; + + /* The DPMS settings may have the value 0. + But if they are negative, or are a range less than 10 seconds, + reset them to sensible defaults. (Since that must be a mistake.) + */ + if (p->dpms_standby != 0 && + p->dpms_standby < 10 * 1000) + p->dpms_standby = 2 * 60 * 60 * 1000; /* 2 hours */ + if (p->dpms_suspend != 0 && + p->dpms_suspend < 10 * 1000) + p->dpms_suspend = 2 * 60 * 60 * 1000; /* 2 hours */ + if (p->dpms_off != 0 && + p->dpms_off < 10 * 1000) + p->dpms_off = 4 * 60 * 60 * 1000; /* 4 hours */ + + /* suspend may not be greater than off, unless off is 0. + standby may not be greater than suspend, unless suspend is 0. + */ + if (p->dpms_off != 0 && + p->dpms_suspend > p->dpms_off) + p->dpms_suspend = p->dpms_off; + if (p->dpms_suspend != 0 && + p->dpms_standby > p->dpms_suspend) + p->dpms_standby = p->dpms_suspend; + + /* These fixes above ignores the case + suspend = 0 and standby > off ... + */ + if (p->dpms_off != 0 && + p->dpms_standby > p->dpms_off) + p->dpms_standby = p->dpms_off; + + if (p->dpms_standby == 0 && /* if *all* are 0, then DPMS is disabled */ + p->dpms_suspend == 0 && + p->dpms_off == 0 && + !p->dpms_quickoff_p) /* ... but we want to do DPMS quick off */ + p->dpms_enabled_p = False; + + + /* Set watchdog timeout to about half of the cycle timeout, but + don't let it be faster than 1/2 minute or slower than 1 minute. + */ + p->watchdog_timeout = p->cycle * 0.6; + if (p->watchdog_timeout < 27000) p->watchdog_timeout = 27000; /* 27 secs */ + if (p->watchdog_timeout > 57000) p->watchdog_timeout = 57000; /* 57 secs */ + + if (p->pointer_hysteresis < 0) p->pointer_hysteresis = 0; + + if (p->auth_warning_slack < 0) p->auth_warning_slack = 0; + if (p->auth_warning_slack > 300) p->auth_warning_slack = 300; +} + + +Bool +senescent_p (void) +{ + /* If you are in here because you're planning on disabling this warning + before redistributing my software, please don't. + + I sincerely request that you do one of the following: + + 1: leave this code intact and this warning in place, -OR- + + 2: Remove xscreensaver from your distribution. + + I would seriously prefer that you not distribute my software at all + than that you distribute one version and then never update it for + years. + + I am *constantly* getting email from users reporting bugs that have + been fixed for literally years who have no idea that the software + they are running is years out of date. Yes, it would be great if we + lived in the ideal world where people checked that they were running + the latest release before they report a bug, but we don't. To most + people, "running the latest release" is synonymous with "running the + latest release that my distro packages for me." + + When they even bother to tell me what version they're running, I + say, "That version is three years old!", and they say "But this is + the latest version my distro ships". Then I say, "your distro + sucks", and they say "but I don't know how to compile from source, + herp derp I eat paste", and *everybody* goes away unhappy. + + It wastes an enormous amount of my time, but worse than that, it + does a grave disservice to the users, who are stuck experiencing + bugs that are already fixed! These users think they are running the + latest release, and they are not. They would like to be running the + actual latest release, but they don't know how, because their distro + makes that very difficult for them. It's terrible for everyone, and + kind of makes me regret ever having released this software in the + first place. + + So seriously. I ask that if you're planning on disabling this + obsolescence warning, that you instead just remove xscreensaver from + your distro entirely. Everybody will be happier that way. Check + out gnome-screensaver instead, I understand it's really nice. + + Of course, my license allows you to ignore me and do whatever the + fuck you want, but as the author, I hope you will have the common + courtesy of complying with my request. + + Thank you! + + jwz, 2014, 2016, 2018, 2021. + + PS: In particular, since Debian refuses to upgrade software on any + kind of rational timeline, I have asked that they stop shipping + xscreensaver at all. They have refused. Instead of upgrading the + software, they simply patched out this warning. + + If you want to witness the sad state of the open source peanut + gallery, look no farther than the comments on my blog: + http://jwz.org/b/yiYo + + Many of these people fall back on their go-to argument of, "If it is + legal, it must be right." If you believe in that rhetorical device + then you are a terrible person, and possibly a sociopath. + + There are also the armchair lawyers who say "Well, instead of + *asking* people to do the right thing out of common courtesy, you + should just change your license to prohibit them from acting + amorally." Again, this is the answer of a sociopath, but that aside, + if you devote even a second's thought to this you will realize that + the end result of this would be for distros like Debian to just keep + shipping the last version with the old license and then never + upgrading it again -- which would be the worst possible outcome for + everyone involved, most especially the users. + + Also, some have incorrectly characterized this as a "time bomb". + It is a software update notification, nothing more. A "time bomb" + makes software stop working. This merely alerts the user that the + security-critical software that they are running is dangerously out + of date. + */ + + time_t now = time ((time_t *) 0); /* d */ + struct tm *tm = localtime (&now); /* o */ + const char *s = screensaver_id; /* n */ + char mon[4], year[5]; /* ' */ + int m, y, mrnths; /* t */ + s = strchr (s, ' '); if (!s) abort(); s++; /* */ + s = strchr (s, '('); if (!s) abort(); s++; /* d */ + s = strchr (s, '-'); if (!s) abort(); s++; /* o */ + strncpy (mon, s, 3); /* o */ + mon[3] = 0; /* */ + s = strchr (s, '-'); if (!s) abort(); s++; /* e */ + strncpy (year, s, 4); /* e */ + year[4] = 0; /* t */ + y = atoi (year); /* , */ + if (!strcmp(mon, "Jan")) m = 0; /* */ + else if (!strcmp(mon, "Feb")) m = 1; /* s */ + else if (!strcmp(mon, "Mar")) m = 2; /* t */ + else if (!strcmp(mon, "Apr")) m = 3; /* o */ + else if (!strcmp(mon, "May")) m = 4; /* p */ + else if (!strcmp(mon, "Jun")) m = 5; /* , */ + else if (!strcmp(mon, "Jul")) m = 6; /* */ + else if (!strcmp(mon, "Aug")) m = 7; /* s */ + else if (!strcmp(mon, "Sep")) m = 8; /* t */ + else if (!strcmp(mon, "Oct")) m = 9; /* a */ + else if (!strcmp(mon, "Nov")) m = 10; /* a */ + else if (!strcmp(mon, "Dec")) m = 11; /* a */ + else abort(); /* h */ + mrnths = ((((tm->tm_year + 1900) * 12) + tm->tm_mon) - /* h */ + (y * 12 + m)); /* h */ + /* p */ + return (mrnths >= 17); /* . */ +} diff --git a/driver/remote.c b/driver/remote.c index 218aa6ad..123bc28b 100644 --- a/driver/remote.c +++ b/driver/remote.c @@ -1,4 +1,4 @@ -/* xscreensaver-command, Copyright (c) 1991-2020 Jamie Zawinski +/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -33,102 +33,61 @@ #include /* for XGetClassHint() */ #include +#ifdef HAVE_DPMS_EXTENSION +# include +#endif + +#include "blurb.h" +#include "atoms.h" #include "remote.h" +#include "clientmsg.h" #ifdef _VROOT_H_ ERROR! you must not include vroot.h in this file #endif -extern char *progname; -extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE; -extern Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_EXIT; -extern Atom XA_VROOT, XA_SELECT, XA_DEMO, XA_BLANK, XA_LOCK; -extern Atom XA_ACTIVATE, XA_SUSPEND, XA_NEXT, XA_PREV, XA_EXIT; - - -static XErrorHandler old_handler = 0; -static Bool got_badwindow = False; +static Bool error_handler_hit_p = False; static int -BadWindow_ehandler (Display *dpy, XErrorEvent *error) +ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) { - if (error->error_code == BadWindow) - { - got_badwindow = True; - return 0; - } - else - { - fprintf (stderr, "%s: ", progname); - if (!old_handler) abort(); - return (*old_handler) (dpy, error); - } + error_handler_hit_p = True; + return 0; } - -static Window -find_screensaver_window (Display *dpy, char **version) +/* See comment in xscreensaver.c for why this is here instead of there. + */ +static void +reset_dpms_timer (Display *dpy) { - int i; - Window root = RootWindowOfScreen (DefaultScreenOfDisplay (dpy)); - Window root2, parent, *kids; - unsigned int nkids; - - if (version) *version = 0; - - if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) - abort (); - if (root != root2) - abort (); - if (parent) - abort (); - if (! (kids && nkids)) - return 0; - for (i = 0; i < nkids; i++) - { - Atom type; - int format; - unsigned long nitems, bytesafter; - unsigned char *v; - int status; - - /* We're walking the list of root-level windows and trying to find - the one that has a particular property on it. We need to trap - BadWindows errors while doing this, because it's possible that - some random window might get deleted in the meantime. (That - window won't have been the one we're looking for.) - */ - XSync (dpy, False); - if (old_handler) abort(); - got_badwindow = False; - old_handler = XSetErrorHandler (BadWindow_ehandler); - status = XGetWindowProperty (dpy, kids[i], - XA_SCREENSAVER_VERSION, - 0, 200, False, XA_STRING, - &type, &format, &nitems, &bytesafter, - &v); - XSync (dpy, False); - XSetErrorHandler (old_handler); - old_handler = 0; +# ifdef HAVE_DPMS_EXTENSION - if (got_badwindow) - { - status = BadWindow; - got_badwindow = False; - } + XErrorHandler old_handler; + int event_number, error_number; + BOOL enabled = False; + CARD16 power = 0; - if (status == Success && type != None) - { - Window ret = kids[i]; - if (version) - *version = (char *) v; - XFree (kids); - return ret; - } - } + XSync (dpy, False); + error_handler_hit_p = False; + old_handler = XSetErrorHandler (ignore_all_errors_ehandler); - if (kids) XFree (kids); - return 0; + if (! DPMSQueryExtension (dpy, &event_number, &error_number)) + goto DONE; + if (! DPMSCapable (dpy)) + goto DONE; + if (! DPMSInfo (dpy, &power, &enabled)) + goto DONE; + if (!enabled) + goto DONE; + + /* Do this even if power == DPMSModeOn to reset the timer */ + DPMSForceLevel (dpy, DPMSModeOn); + + DONE: + XSync (dpy, False); + XSetErrorHandler (old_handler); + +# endif /* HAVE_DPMS_EXTENSION */ } @@ -239,7 +198,7 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg, if (data) free (data); fprintf (stdout, "\n"); fflush (stdout); - fprintf (stderr, "bad status format on root window.\n"); + fprintf (stderr, "bad status format on root window\n"); status = -1; goto DONE; } @@ -301,7 +260,7 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg, if (dataP) XFree (dataP); fprintf (stdout, "\n"); fflush (stdout); - fprintf (stderr, "no saver status on root window.\n"); + fprintf (stderr, "no saver status on root window\n"); status = -1; goto DONE; } @@ -316,7 +275,6 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg, XEvent event; long arg1 = arg; long arg2 = 0; - if (arg < 0) abort(); else if (arg == 0 && command == XA_SELECT) @@ -327,6 +285,9 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg, arg2 = arg; /* since it didn't use to take an argument. */ } + if (command == XA_DEACTIVATE) + reset_dpms_timer (dpy); + event.xany.type = ClientMessage; event.xclient.display = dpy; event.xclient.window = window; @@ -336,10 +297,11 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg, event.xclient.data.l[0] = (long) command; event.xclient.data.l[1] = arg1; event.xclient.data.l[2] = arg2; - if (! XSendEvent (dpy, window, False, 0L, &event)) + + if (! XSendEvent (dpy, window, False, PropertyChangeMask, &event)) { - sprintf (err, "XSendEvent(dpy, 0x%x ...) failed.\n", - (unsigned int) window); + sprintf (err, "XSendEvent(dpy, 0x%x ...) failed\n", + (unsigned int) window); if (error_ret) *error_ret = strdup (err); else @@ -416,10 +378,11 @@ xscreensaver_command_response (Display *dpy, Window window, int format; unsigned long nitems, bytesafter; unsigned char *msg = 0; + XErrorHandler old_handler; XSync (dpy, False); - if (old_handler) abort(); - old_handler = XSetErrorHandler (BadWindow_ehandler); + error_handler_hit_p = False; + old_handler = XSetErrorHandler (ignore_all_errors_ehandler); st2 = XGetWindowProperty (dpy, window, XA_SCREENSAVER_RESPONSE, 0, 1024, True, @@ -428,9 +391,8 @@ xscreensaver_command_response (Display *dpy, Window window, &msg); XSync (dpy, False); XSetErrorHandler (old_handler); - old_handler = 0; - if (got_badwindow) + if (error_handler_hit_p) { if (exiting_p) return 0; @@ -491,110 +453,87 @@ xscreensaver_command_response (Display *dpy, Window window, } -/* Wait until the window has been mapped, blanking the screen. +/* Wait until xscreensaver says the screen is blanked. Catches errors, times out after a few seconds. */ static int -xscreensaver_command_wait_for_blank (Display *dpy, Window window, +xscreensaver_command_wait_for_blank (Display *dpy, Bool verbose_p, char **error_ret) { + Window w = RootWindow (dpy, 0); /* always screen 0 */ time_t start = time((time_t*)0); int max = 10; char err[2048]; - Status status = -1; - while (1) { - XWindowAttributes xgwa; - xgwa.map_state = IsUnmapped; + Atom type; + int format; + unsigned long nitems, bytesafter; + unsigned char *dataP = 0; + time_t now; + struct timeval tv; - if (!window) - got_badwindow = True; - else + /* Wait until the status property on the root window changes to + BLANK or LOCKED. */ + if (XGetWindowProperty (dpy, w, + XA_SCREENSAVER_STATUS, + 0, 999, False, XA_INTEGER, + &type, &format, &nitems, &bytesafter, + &dataP) + == Success + && type == XA_INTEGER + && nitems >= 3 + && dataP) { - XSync (dpy, False); - if (old_handler) abort(); - got_badwindow = False; - old_handler = XSetErrorHandler (BadWindow_ehandler); - status = XGetWindowAttributes (dpy, window, &xgwa); - XSync (dpy, False); - XSetErrorHandler (old_handler); - old_handler = 0; - } + Atom state = ((Atom *) dataP)[0]; - if (got_badwindow) - { - /* If we got a BadWindow, it might be that in the course of - activating, xscreensaver had to destroy and re-create the - window to get one with the proper Visual. So wait for a - new window to come into existence. - */ - if (window && verbose_p > 1) - fprintf (stderr, - "%s: BadWindow 0x%08x waiting for screen to blank\n", - progname, (unsigned int) window); - window = find_screensaver_window (dpy, 0); - if (window && verbose_p > 1) - fprintf (stderr, "%s: new window is 0x%08x.\n", - progname, (unsigned int) window); - got_badwindow = False; + if (verbose_p > 1) + { + PROP32 *status = (PROP32 *) dataP; + int i; + fprintf (stderr, "%s: read status property: 0x%lx: %s", progname, + (unsigned long) w, + (status[0] == XA_LOCK ? "LOCK" : + status[0] == XA_BLANK ? "BLANK" : + status[0] == 0 ? "0" : "???")); + for (i = 1; i < nitems; i++) + fprintf (stderr, ", %lu", status[i]); + fprintf (stderr, "\n"); + } + + if (state == XA_BLANK || state == XA_LOCK) + { + if (verbose_p > 1) + fprintf (stderr, "%s: screen blanked\n", progname); + break; + } } - else if (status == 0) + + now = time ((time_t *) 0); + if (now >= start + max) { - sprintf (err, "error on 0x%08x waiting for screen to blank", - (unsigned int) window); + strcpy (err, "Timed out waiting for screen to blank"); if (error_ret) *error_ret = strdup (err); else fprintf (stderr, "%s: %s\n", progname, err); return -1; } - else if (xgwa.map_state == IsViewable) + else if (verbose_p == 1 && now > start + 3) { - if (verbose_p > 1) - fprintf (stderr, "%s: window 0x%08x mapped.\n", - progname, (unsigned int) window); - return 0; + fprintf (stderr, "%s: waiting for status change\n", progname); + verbose_p++; } - else - { - time_t now = time((time_t*)0); - if (now >= start + max) - { - sprintf (err, "Timed out waiting for screen to blank on 0x%08x", - (unsigned int) window); - if (error_ret) - *error_ret = strdup (err); - else - fprintf (stderr, "%s: %s\n", progname, err); - return -1; - } - else if (verbose_p && now > start + 3) - { - fprintf (stderr, "%s: waiting for window 0x%08x to map\n", - progname, (unsigned int) window); - verbose_p++; - } - } - -# if defined(HAVE_SELECT) - { - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 1000000L / 10; - select (0, 0, 0, 0, &tv); - } -# else - sleep (1); -# endif + tv.tv_sec = 0; + tv.tv_usec = 1000000L / 10; + select (0, 0, 0, 0, &tv); } return 0; } - int xscreensaver_command (Display *dpy, Atom command, long arg, Bool verbose_p, char **error_ret) @@ -615,8 +554,7 @@ xscreensaver_command (Display *dpy, Atom command, long arg, Bool verbose_p, command == XA_NEXT || command == XA_PREV || command == XA_SELECT)) - status = xscreensaver_command_wait_for_blank (dpy, w, verbose_p, - error_ret); + status = xscreensaver_command_wait_for_blank (dpy, verbose_p, error_ret); fflush (stdout); fflush (stderr); @@ -649,7 +587,7 @@ server_xscreensaver_version (Display *dpy, if (version_ret) { unsigned char *v = 0; - XGetWindowProperty (dpy, window, XA_SCREENSAVER_VERSION, 0, 1, + XGetWindowProperty (dpy, window, XA_SCREENSAVER_VERSION, 0, 100, False, XA_STRING, &type, &format, &nitems, &bytesafter, &v); if (v) @@ -697,12 +635,16 @@ server_xscreensaver_version (Display *dpy, } - if (user && *user && *user != '?') + if (!user_ret) + ; + else if (user && *user && *user != '?') *user_ret = strdup (user); else *user_ret = 0; - if (host && *host && *host != '?') + if (!host_ret) + ; + else if (host && *host && *host != '?') *host_ret = strdup (host); else *host_ret = 0; diff --git a/driver/remote.h b/driver/remote.h index e1db3517..6b1763fa 100644 --- a/driver/remote.h +++ b/driver/remote.h @@ -1,5 +1,4 @@ -/* xscreensaver-command, Copyright (c) 1991-1998 - * by Jamie Zawinski +/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that diff --git a/driver/screens.c b/driver/screens.c index 5aeb55d5..dc87e51c 100644 --- a/driver/screens.c +++ b/driver/screens.c @@ -1,5 +1,5 @@ /* screens.c --- dealing with RANDR, Xinerama, and VidMode Viewports. - * xscreensaver, Copyright (c) 1991-2020 Jamie Zawinski + * xscreensaver, Copyright © 1991-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -11,115 +11,114 @@ */ /* There are a bunch of different mechanisms for multiple monitors - * available in X. XScreenSaver needs to care about this for two - * reasons: first, to ensure that all visible areas go black; and - * second, so that the windows of screen savers exactly fill the - * glass of each monitor (instead of one saver spanning multiple - * monitors, or a monitor displaying only a sub-rectangle of the - * screen saver.) + * available in X. XScreenSaver needs to care about this for two reasons: + * first, to ensure that all visible areas go black; and second, so that + * the windows of screen savers exactly fill the glass of each monitor + * (instead of one saver spanning multiple monitors, or a monitor + * displaying only a sub-rectangle of the screen saver.) * * 1) Multi-screen: * - * This is the original way. Each monitor gets its own display - * number. :0.0 is the first one, :0.1 is the next, etc. The - * value of $DISPLAY determines which screen windows open on by - * default. A single app can open windows on multiple screens - * with the same display connection, but windows cannot be moved - * from one screen to another. The mouse can be moved from one - * screen to another, though. Screens may be different depths - * (e.g., one can be TrueColor and one can be PseudoColor.) - * Screens cannot be resized or moved without restarting X. + * This is the original way. Each monitor gets its own display number. + * ":0.0" is the first one, ":0.1" is the next, and so on. The value + * of $DISPLAY determines which screen windows open on by default. A + * single app can open windows on multiple screens with the same + * display connection, but windows cannot be moved from one screen to + * another. The mouse can be moved from one screen to another, though. + * Screens may be different depths (e.g., one can be TrueColor and one + * can be PseudoColor.) Screens cannot be resized or moved without + * restarting X. * - * Everyone hates this way of doing things because of the - * inability to move a window from one screen to another without - * restarting the application. + * Everyone hates this way of doing things because of the inability to + * move a window from one screen to another without restarting the + * application. * * 2) Xinerama: * - * There is a single giant root window that spans all the - * monitors. All monitors are the same depth, and windows can be - * moved around. Applications can learn which rectangles are - * actually visible on monitors by querying the Xinerama server - * extension. (If you don't do that, you end up with dialog - * boxes that try to appear in the middle of the screen actually - * spanning the gap between two monitors.) + * There is a single giant root window that spans all the monitors. + * All monitors are the same depth, and windows can be moved around. + * Applications can learn which rectangles are actually visible on + * monitors by querying the Xinerama server extension. (If you don't + * do that, you end up with dialog boxes that try to appear in the + * middle of the screen actually spanning the gap between two + * monitors.) * - * Xinerama doesn't work with DRI, which means that if you use - * it, you lose hardware acceleration on OpenGL programs. Also, - * screens can't be resized or moved without restarting X. + * Xinerama didn't? work with DRI, which means that Xinerama precluded + * hardware acceleration in OpenGL programs. Also, screens couldn't + * be resized or moved without restarting X. * * 3) Vidmode Viewports: * + * No longer supported as of XScreenSaver 6. + * * With this extension, the root window can be bigger than the - * monitor. Moving the mouse near the edges of the screen - * scrolls around, like a pan-and-scan movie. There can also be - * a hot key for changing the monitor's resolution (zooming - * in/out). + * monitor. Moving the mouse near the edges of the screen scrolls + * around, like a pan-and-scan movie. There was also a hot-key for + * changing the monitor's resolution (zooming in/out). * - * Trying to combine this with Xinerama crashes the server, so - * you can only use this if you have only a single screen, or are - * in old-multi-screen mode. + * Trying to combine this with Xinerama crashes the server, so you + * could only use this if you had only a single screen, or were in old + * multi-screen mode. * - * Also, half the time it doesn't work at all: it tends to lie - * about the size of the rectangle in use. + * Also, half the time it didn't work at all: it tended to lie about + * the size of the rectangle in use. * * 4) RANDR 1.0: * * The first version of the "Resize and Rotate" extension let you * change the resolution of a screen on the fly. The root window * would actually resize. However, it was also incompatible with - * Xinerama (did it crash, or just do nothing? I can't remember) - * so you needed to be in single-screen or old multi-screen mode. - * I believe RANDR could co-exist with Vidmode Viewports, but I'm - * not sure. + * Xinerama (did it crash, or just do nothing? I can't remember) so + * you needed to be in single-screen or old multi-screen mode. I + * believe RANDR could co-exist with Vidmode Viewports, but I'm not + * sure. * * 5) RANDR 1.2: * * Finally, RANDR added the functionality of Xinerama, plus some. * Each X screen (in the sense of #1, "multi-screen") can have a - * number of sub-rectangles that are displayed on monitors, and - * each of those sub-rectangles can be displayed on more than one - * monitor. So it's possible (I think) to have a hybrid of - * multi-screen and Xinerama (e.g., to have two monitors running - * in one depth, and three monitors running in another?) - * Typically though, there will be a single X screen, with - * Xinerama-like division of that large root window onto multiple - * monitors. Also everything's dynamic: monitors can be added, - * removed, and resized at runtime. - * - * I believe that as of RANDR 1.2, the Xinerama extension still - * exists but only as a compatiblity layer: it's actually - * returning data from the RANDR extension. - * - * Though RANDR 1.2 allows the same image to be cloned onto more - * than one monitor, and also allows one monitor to show a - * subsection of something on another monitor (e.g., the - * rectangles can be enclosed or overlap). Since there's no way - * to put seperate savers on those duplicated-or-overlapping - * monitors, xscreensaver just ignores them (which allows them to - * display duplicates or overlaps). + * number of sub-rectangles that are displayed on monitors, and each + * of those sub-rectangles can be displayed on more than one monitor. + * So it's possible (I think) to have a hybrid of multi-screen and + * Xinerama (e.g., to have two monitors running in one depth, and + * three monitors running in another?) Typically though, there will + * be a single X screen with one giant root window underlying the + * rectangles of multiple monitors. Also everything is dynamic: + * monitors can be added, removed, and resized at runtime, with + * notification events. * - * 5a) Nvidia fucks it up: + * RANDR rectangles can overlap, meaning one monitor can mirror + * another, or show a sub-rectangle of another, or just overlap in + * strange ways. The proper way to respond to weird layouts is... not + * always obvious. * - * Nvidia drivers as of Aug 2008 running in "TwinView" mode - * apparently report correct screen geometry via Xinerama, but - * report one giant screen via RANDR. The response from the - * nvidia developers is, "we don't support RANDR, use Xinerama - * instead." Which is a seriously lame answer. So, xscreensaver - * has to query *both* extensions, and make a guess as to which - * is to be believed. + * Also sometimes RANDR says stupid shit like, "You have one screen, + * and it has no available sizes or orientations." * - * 5b) Also sometimes RANDR says stupid shit like, "You have one - * screen, and it has no available orientations or sizes." + * Sometimes RANDR and Xinerama report the same info, and sometimes + * not, so we look at both and see which looks most plausible. * + * Also, Nvidia fucked it up: their drivers that were popular in 2008, + * when running in "TwinView" mode, reported correct sizes via + * Xinerama, but reported one giant screen via RANDR. Nvidia's + * response was, "We don't support RANDR, use Xinerama instead", which + * is another reason that XScreenSaver historically had to query both + * extensions and make a guess. Maybe this is no longer necessary. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif +#include +#include +#include #include +#ifndef HAVE_RANDR_12 +# undef HAVE_RANDR /* RANDR 1.1 is no longer supported */ +#endif + #ifdef HAVE_RANDR # include #endif /* HAVE_RANDR */ @@ -132,37 +131,14 @@ # include #endif /* HAVE_XF86VMODE */ -/* This file doesn't need the Xt headers, so stub these types out... */ -#undef XtPointer -#define XtAppContext void* -#define XrmDatabase void* -#define XtIntervalId void* -#define XtPointer void* -#define Widget void* - -#include "xscreensaver.h" -#include "visual.h" - - -typedef enum { S_SANE, S_ENCLOSED, S_DUPLICATE, S_OVERLAP, - S_OFFSCREEN, S_DISABLED } monitor_sanity; - -/* 'typedef monitor' is in types.h */ -struct _monitor { - int id; - char *desc; - Screen *screen; - int x, y, width, height; - monitor_sanity sanity; /* I'm not crazy you're the one who's crazy */ - int enemy; /* which monitor it overlaps or duplicates */ - char *err; /* msg to print at appropriate later time; - exists only on monitor #0. */ -}; +#include "blurb.h" +#include "screens.h" -static Bool layouts_differ_p (monitor **a, monitor **b); +#undef countof +#define countof(x) (sizeof((x))/sizeof((*x))) -static void +void free_monitors (monitor **monitors) { monitor **m2 = monitors; @@ -231,122 +207,6 @@ xinerama_scan_monitors (Display *dpy, char **errP) #endif /* HAVE_XINERAMA */ -#ifdef HAVE_XF86VMODE - -static monitor ** -vidmode_scan_monitors (Display *dpy, char **errP) -{ - int event, error, nscreens, i; - monitor **monitors; - - /* Note that XF86VidModeGetViewPort() tends to be full of lies on laptops - that have a docking station or external monitor that runs in a different - resolution than the laptop's screen: - - http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=81593 - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=208417 - http://bugs.xfree86.org/show_bug.cgi?id=421 - - Presumably this is fixed by using RANDR instead of VidMode. - */ - -# ifdef HAVE_XINERAMA - /* Attempts to use the VidMode extension when the Xinerama extension is - active can result in a server crash! Yay! */ - if (XQueryExtension (dpy, "XINERAMA", &error, &event, &error)) - return 0; -# endif /* !HAVE_XINERAMA */ - - if (! XF86VidModeQueryExtension (dpy, &event, &error)) - return 0; - - nscreens = ScreenCount (dpy); - monitors = (monitor **) calloc (nscreens + 1, sizeof(*monitors)); - if (!monitors) return 0; - - for (i = 0; i < nscreens; i++) - { - monitor *m = (monitor *) calloc (1, sizeof (monitor)); - XF86VidModeModeLine ml; - int dot; - Screen *screen = ScreenOfDisplay (dpy, i); - - monitors[i] = m; - m->id = i; - m->screen = screen; - - if (! safe_XF86VidModeGetViewPort (dpy, i, &m->x, &m->y)) - m->x = m->y = -1; - - if (XF86VidModeGetModeLine (dpy, i, &dot, &ml)) - { - m->width = ml.hdisplay; - m->height = ml.vdisplay; - } - - /* On a system that has VidMode but does not have RANDR, and that has - "Option Rotate" set, WidthOfScreen/HeightOfScreen are the rotated - size, but XF86VidModeModeLine contains the unrotated size. - Maybe there's something in 'flags' that indicates this? - Or, we can just notice that the aspect ratios are inverted: - */ - if (m->width > 0 && - m->height > 0 && - ((m->width > m->height) != - (WidthOfScreen(screen) > HeightOfScreen(screen)))) - { - int swap = m->width; - m->width = m->height; - m->height = swap; - } - - - /* Apparently, though the server stores the X position in increments of - 1 pixel, it will only make changes to the *display* in some other - increment. With XF86_SVGA on a Thinkpad, the display only updates - in multiples of 8 pixels when in 8-bit mode, and in multiples of 4 - pixels in 16-bit mode. I don't know what it does in 24- and 32-bit - mode, because I don't have enough video memory to find out. - - I consider it a bug that XF86VidModeGetViewPort() is telling me the - server's *target* scroll position rather than the server's *actual* - scroll position. David Dawes agrees, and says they may fix this in - XFree86 4.0, but it's nontrivial. - - He also confirms that this behavior is server-dependent, so the - actual scroll position cannot be reliably determined by the client. - So... that means the only solution is to provide a ``sandbox'' - around the blackout window -- we make the window be up to N pixels - larger than the viewport on both the left and right sides. That - means some part of the outer edges of each hack might not be - visible, but screw it. - - I'm going to guess that 16 pixels is enough, and that the Y dimension - doesn't have this problem. - - The drawback of doing this, of course, is that some of the screenhacks - will still look pretty stupid -- for example, "slidescreen" will cut - off the left and right edges of the grid, etc. - */ -# define FUDGE 16 - if (m->x > 0 && m->x < m->width - ml.hdisplay) - { - /* Not at left edge or right edge: - Round X position down to next lower multiple of FUDGE. - Increase width by 2*FUDGE in case some server rounds up. - */ - m->x = ((m->x - 1) / FUDGE) * FUDGE; - m->width += (FUDGE * 2); - } -# undef FUDGE - } - - return monitors; -} - -#endif /* HAVE_XF86VMODE */ - - #ifdef HAVE_RANDR static monitor ** @@ -354,7 +214,6 @@ randr_scan_monitors (Display *dpy, char **errP) { int event, error, major, minor, nscreens, i, j; monitor **monitors; - Bool new_randr_p = False; if (! XRRQueryExtension (dpy, &event, &error)) return 0; @@ -362,30 +221,17 @@ randr_scan_monitors (Display *dpy, char **errP) if (! XRRQueryVersion (dpy, &major, &minor)) return 0; - if (major <= 0) /* Protocol was still in flux back then -- fuck it. */ - return 0; - -# ifdef HAVE_RANDR_12 - new_randr_p = (major > 1 || (major == 1 && minor >= 2)); -# endif + if (! (major > 1 || (major == 1 && minor >= 2))) + return 0; /* 1.2 ir newer is required */ - if (! new_randr_p) - /* RANDR 1.0 -- no Xinerama-like virtual screens. */ - nscreens = ScreenCount (dpy); - else /* RANDR 1.2 or newer -- built-in Xinerama */ + /* Add up the virtual screens on each X screen. */ + nscreens = 0; + for (i = 0; i < ScreenCount (dpy); i++) { -# ifdef HAVE_RANDR_12 - int xsc = ScreenCount (dpy); - nscreens = 0; - /* Add up the virtual screens on each X screen. */ - for (i = 0; i < xsc; i++) - { - XRRScreenResources *res = - XRRGetScreenResources (dpy, RootWindow (dpy, i)); - nscreens += res->noutput; - XRRFreeScreenResources (res); - } -# endif /* HAVE_RANDR_12 */ + XRRScreenResources *res = + XRRGetScreenResources (dpy, RootWindow (dpy, i)); + nscreens += res->noutput; + XRRFreeScreenResources (res); } if (nscreens <= 0) @@ -401,88 +247,43 @@ randr_scan_monitors (Display *dpy, char **errP) for (i = 0, j = 0; i < ScreenCount (dpy); i++) { Screen *screen = ScreenOfDisplay (dpy, i); - - if (! new_randr_p) /* RANDR 1.0 */ + int k; + XRRScreenResources *res = + XRRGetScreenResources (dpy, RootWindowOfScreen (screen)); + for (k = 0; k < res->noutput; k++, j++) { - XRRScreenConfiguration *rrc; monitor *m = (monitor *) calloc (1, sizeof (monitor)); - monitors[i] = m; + XRROutputInfo *rroi = XRRGetOutputInfo (dpy, res, + res->outputs[k]); + RRCrtc crtc = (rroi->crtc ? rroi->crtc : + rroi->ncrtc ? rroi->crtcs[0] : 0); + XRRCrtcInfo *crtci = (crtc ? XRRGetCrtcInfo(dpy, res, crtc) : 0); + + monitors[j] = m; m->screen = screen; - m->id = i; + m->id = (i * 1000) + j; + m->desc = (rroi->name ? strdup (rroi->name) : 0); - rrc = XRRGetScreenInfo (dpy, RootWindowOfScreen (screen)); - if (rrc) + if (crtci) { - SizeID size = -1; - Rotation rot = ~0; - XRRScreenSize *rrsizes; - int nsizes = 0; - - size = XRRConfigCurrentConfiguration (rrc, &rot); - rrsizes = XRRConfigSizes (rrc, &nsizes); - - if (nsizes <= 0) /* WTF? Shouldn't happen but does. */ - { - m->width = DisplayWidth (dpy, i); - m->height = DisplayHeight (dpy, i); - } - else if (rot & (RR_Rotate_90|RR_Rotate_270)) - { - m->width = rrsizes[size].height; - m->height = rrsizes[size].width; - } - else - { - m->width = rrsizes[size].width; - m->height = rrsizes[size].height; - } - - /* don't free 'rrsizes' */ - XRRFreeScreenConfigInfo (rrc); + /* Note: if the screen is rotated, XRRConfigSizes contains + the unrotated WxH, but XRRCrtcInfo contains rotated HxW. + */ + m->x = crtci->x; + m->y = crtci->y; + m->width = crtci->width; + m->height = crtci->height; } - } - else /* RANDR 1.2 or newer */ - { -# ifdef HAVE_RANDR_12 - int k; - XRRScreenResources *res = - XRRGetScreenResources (dpy, RootWindowOfScreen (screen)); - for (k = 0; k < res->noutput; k++, j++) - { - monitor *m = (monitor *) calloc (1, sizeof (monitor)); - XRROutputInfo *rroi = XRRGetOutputInfo (dpy, res, - res->outputs[k]); - RRCrtc crtc = (rroi->crtc ? rroi->crtc : - rroi->ncrtc ? rroi->crtcs[0] : 0); - XRRCrtcInfo *crtci = (crtc ? XRRGetCrtcInfo(dpy, res, crtc) : 0); - - monitors[j] = m; - m->screen = screen; - m->id = (i * 1000) + j; - m->desc = (rroi->name ? strdup (rroi->name) : 0); - - if (crtci) - { - /* Note: if the screen is rotated, XRRConfigSizes contains - the unrotated WxH, but XRRCrtcInfo contains rotated HxW. - */ - m->x = crtci->x; - m->y = crtci->y; - m->width = crtci->width; - m->height = crtci->height; - } - if (rroi->connection == RR_Disconnected) - m->sanity = S_DISABLED; - /* #### do the same for RR_UnknownConnection? */ + if (rroi->connection == RR_Disconnected) + m->sanity = S_DISABLED; + /* #### do the same for RR_UnknownConnection? */ - if (crtci) - XRRFreeCrtcInfo (crtci); - XRRFreeOutputInfo (rroi); - } - XRRFreeScreenResources (res); -# endif /* HAVE_RANDR_12 */ + if (crtci) + XRRFreeCrtcInfo (crtci); + XRRFreeOutputInfo (rroi); } + XRRFreeScreenResources (res); } /* Work around more fucking brain damage. */ @@ -566,7 +367,7 @@ randr_versus_xinerama_fight (Display *dpy, monitor **randr_monitors, if (!xinerama_monitors) return randr_monitors; - if (! layouts_differ_p (randr_monitors, xinerama_monitors)) + if (! monitor_layouts_differ_p (randr_monitors, xinerama_monitors)) { free_monitors (xinerama_monitors); return randr_monitors; @@ -582,9 +383,8 @@ randr_versus_xinerama_fight (Display *dpy, monitor **randr_monitors, } else { - *errP = append (*errP, - "WARNING: RANDR and Xinerama report different\n" - " screen layouts! Believing RANDR."); + *errP = append (*errP, /* This is "normal" now, I guess. */ + "RANDR and Xinerama report different screen layouts"); free_monitors (xinerama_monitors); return randr_monitors; } @@ -642,7 +442,6 @@ debug_scan_monitors (Display *dpy, char **errP) index = (index+1) % countof(geoms); return monitors; } - #endif /* DEBUG_MULTISCREEN */ @@ -683,42 +482,36 @@ quadruple (monitor **monitors, Bool debug_p, char **errP) #endif /* QUAD_MODE */ -static monitor ** -scan_monitors (saver_info *si) +monitor ** +scan_monitors (Display *dpy) { - saver_preferences *p = &si->prefs; monitor **monitors = 0; char *err = 0; # ifdef DEBUG_MULTISCREEN - if (! monitors) monitors = debug_scan_monitors (si->dpy, &err); + if (! monitors) monitors = debug_scan_monitors (dpy, &err); # endif # ifdef HAVE_RANDR - if (! p->getviewport_full_of_lies_p) - if (! monitors) monitors = randr_scan_monitors (si->dpy, &err); + if (! monitors) monitors = randr_scan_monitors (dpy, &err); # ifdef HAVE_XINERAMA - monitors = randr_versus_xinerama_fight (si->dpy, monitors, &err); + monitors = randr_versus_xinerama_fight (dpy, monitors, &err); # endif # endif /* HAVE_RANDR */ -# ifdef HAVE_XF86VMODE - if (! monitors) monitors = vidmode_scan_monitors (si->dpy, &err); -# endif - # ifdef HAVE_XINERAMA - if (! monitors) monitors = xinerama_scan_monitors (si->dpy, &err); + if (! monitors) monitors = xinerama_scan_monitors (dpy, &err); # endif - if (! monitors) monitors = basic_scan_monitors (si->dpy, &err); + if (! monitors) monitors = basic_scan_monitors (dpy, &err); # ifdef QUAD_MODE if (p->quad_p) monitors = quadruple (monitors, p->debug_p, &err); # endif - if (monitors && err) monitors[0]->err = err; + if (monitors && *monitors && err) monitors[0]->err = err; return monitors; } @@ -778,7 +571,7 @@ plausible_aspect_ratio_p (monitor **monitors) /* Mark the ones that overlap, etc. */ -static void +void check_monitor_sanity (monitor **monitors) { int i, j, count = 0; @@ -862,8 +655,8 @@ check_monitor_sanity (monitor **monitors) } -static Bool -layouts_differ_p (monitor **a, monitor **b) +Bool +monitor_layouts_differ_p (monitor **a, monitor **b) { if (!a || !b) return True; while (1) @@ -886,10 +679,21 @@ layouts_differ_p (monitor **a, monitor **b) } +static int +screen_number (Screen *screen) +{ + Display *dpy = DisplayOfScreen (screen); + int i; + for (i = 0; i < ScreenCount (dpy); i++) + if (ScreenOfDisplay (dpy, i) == screen) + return i; + return 0; +} + + void -describe_monitor_layout (saver_info *si) +describe_monitor_layout (monitor **monitors) { - monitor **monitors = si->monitor_layout; int count = 0; int good_count = 0; int bad_count = 0; @@ -904,7 +708,7 @@ describe_monitor_layout (saver_info *si) count++; } - if (monitors[0]->err) /* deferred error msg */ + if (monitors && *monitors && monitors[0]->err) /* deferred error msg */ { char *token = strtok (monitors[0]->err, "\n"); while (token) @@ -980,131 +784,3 @@ describe_monitor_layout (saver_info *si) blurb()); } } - - -/* Synchronize the contents of si->ssi to the current state of the monitors. - Doesn't change anything if nothing has changed; otherwise, alters and - reuses existing saver_screen_info structs as much as possible. - Returns True if anything changed. - */ -Bool -update_screen_layout (saver_info *si) -{ - monitor **monitors = scan_monitors (si); - int count = 0; - int good_count = 0; - int i, j; - int seen_screens[100] = { 0, }; - - if (! layouts_differ_p (monitors, si->monitor_layout)) - { - free_monitors (monitors); - return False; - } - - free_monitors (si->monitor_layout); - si->monitor_layout = monitors; - check_monitor_sanity (si->monitor_layout); - - while (monitors[count]) - { - if (monitors[count]->sanity == S_SANE) - good_count++; - count++; - } - - if (si->ssi_count == 0) - { - si->ssi_count = 10; - si->screens = (saver_screen_info *) - calloc (sizeof(*si->screens), si->ssi_count); - } - - if (si->ssi_count <= good_count) - { - si->ssi_count = good_count + 10; - si->screens = (saver_screen_info *) - realloc (si->screens, sizeof(*si->screens) * si->ssi_count); - memset (si->screens + si->nscreens, 0, - sizeof(*si->screens) * (si->ssi_count - si->nscreens)); - } - - if (! si->screens) abort(); - - si->nscreens = good_count; - - /* Regenerate the list of GL visuals as needed. */ - if (si->best_gl_visuals) - free (si->best_gl_visuals); - si->best_gl_visuals = 0; - - for (i = 0, j = 0; i < count; i++) - { - monitor *m = monitors[i]; - saver_screen_info *ssi = &si->screens[j]; - Screen *old_screen = ssi->screen; - int sn; - if (monitors[i]->sanity != S_SANE) continue; - - ssi->global = si; - ssi->number = j; - - sn = screen_number (m->screen); - ssi->screen = m->screen; - ssi->real_screen_number = sn; - ssi->real_screen_p = (seen_screens[sn] == 0); - seen_screens[sn]++; - - ssi->default_visual = - get_visual_resource (ssi->screen, "visualID", "VisualID", False); - ssi->current_visual = ssi->default_visual; - ssi->current_depth = visual_depth (ssi->screen, ssi->current_visual); - - /* If the screen changed (or if this is the first time) we need - a new toplevel shell for this screen's depth. - */ - if (ssi->screen != old_screen) - initialize_screen_root_widget (ssi); - - ssi->last_poll_mouse.root_x = -1; - ssi->last_poll_mouse.root_y = -1; - - ssi->x = m->x; - ssi->y = m->y; - ssi->width = m->width; - ssi->height = m->height; - -# ifndef DEBUG_MULTISCREEN - { - saver_preferences *p = &si->prefs; - if (p->debug_p -# ifdef QUAD_MODE - && !p->quad_p -# endif - ) - ssi->width /= 2; - } -# endif - - j++; - } - - for (; j < count; j++) - { - saver_screen_info *ssi = &si->screens[j]; - if (!ssi->screensaver_window) - continue; - fprintf (stderr, "%s: %d: screen now unused, disabling.\n", - blurb(), j); - /* Undo store_saver_id() so that xscreensaver-command doesn't attempt - to communicate with us through this window. It might make more - sense to destroy the window, but I'm not 100% sure that there are - no outstanding grabs on it that have yet been transferred. - */ - XDeleteProperty (si->dpy, ssi->screensaver_window, - XA_SCREENSAVER_VERSION); - } - - si->default_screen = &si->screens[0]; - return True; -} diff --git a/driver/screens.h b/driver/screens.h new file mode 100644 index 00000000..1e3501c5 --- /dev/null +++ b/driver/screens.h @@ -0,0 +1,37 @@ +/* xscreensaver, Copyright © 1993-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifndef __XSCREENSAVER_SCREENS_H__ +#define __XSCREENSAVER_SCREENS_H__ + +typedef struct _monitor monitor; + +typedef enum { S_SANE, S_ENCLOSED, S_DUPLICATE, S_OVERLAP, + S_OFFSCREEN, S_DISABLED } monitor_sanity; + +struct _monitor { + int id; + char *desc; + Screen *screen; + int x, y, width, height; + monitor_sanity sanity; /* I'm not crazy you're the one who's crazy */ + int enemy; /* which monitor it overlaps or duplicates */ + char *err; /* msg to print at appropriate later time; + exists only on monitor #0. */ +}; + +extern monitor **scan_monitors (Display *); +extern Bool monitor_layouts_differ_p (monitor **a, monitor **b); +extern void free_monitors (monitor **monitors); +extern void describe_monitor_layout (monitor **monitors); +extern void check_monitor_sanity (monitor **monitors); + +#endif /* __XSCREENSAVER_SCREENS_H__ */ diff --git a/driver/screensaver-properties.desktop.in b/driver/screensaver-properties.desktop.in index de425279..9cc17e6b 100644 --- a/driver/screensaver-properties.desktop.in +++ b/driver/screensaver-properties.desktop.in @@ -1,5 +1,5 @@ [Desktop Entry] -Exec=xscreensaver-demo +Exec=xscreensaver-settings Icon=xscreensaver Terminal=false _Name=Screensaver diff --git a/driver/setuid.c b/driver/setuid.c index 3ac78e4f..164576f2 100644 --- a/driver/setuid.c +++ b/driver/setuid.c @@ -1,5 +1,5 @@ /* setuid.c --- management of runtime privileges. - * xscreensaver, Copyright (c) 1993-1998, 2005 Jamie Zawinski + * xscreensaver, Copyright © 1993-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -14,24 +14,20 @@ # include "config.h" #endif -#include /* not used for much... */ - -/* This file doesn't need the Xt headers, so stub these types out... */ -#undef XtPointer -#define XtAppContext void* -#define XrmDatabase void* -#define XtIntervalId void* -#define XtPointer void* -#define Widget void* - -#include "xscreensaver.h" - -#ifndef EPERM -#include +#include +#include +#ifdef HAVE_UNISTD_H +# include #endif +#include #include /* for getpwnam() and struct passwd */ #include /* for getgrgid() and struct group */ +#include + +#include "blurb.h" +#include "auth.h" + static const char * uid_gid_string (uid_t uid, gid_t gid) @@ -49,31 +45,6 @@ uid_gid_string (uid_t uid, gid_t gid) } -void -describe_uids (saver_info *si, FILE *out) -{ - uid_t uid = getuid(); - gid_t gid = getgid(); - uid_t euid = geteuid(); - gid_t egid = getegid(); - char *s1 = strdup (uid_gid_string (uid, gid)); - char *s2 = strdup (uid_gid_string (euid, egid)); - - if (si->orig_uid && *si->orig_uid && - (!!strcmp (si->orig_uid, s1) || - !!strcmp (si->orig_uid, s2))) - fprintf (out, "%s: initial effective uid/gid was %s\n", blurb(), - si->orig_uid); - - fprintf (out, "%s: running as %s", blurb(), s1); - if (uid != euid || gid != egid) - fprintf (out, "; effectively %s", s2); - fprintf(out, "\n"); - free(s1); - free(s2); -} - - /* Returns true if we need to call setgroups(). Without calling setgroups(), the process will retain any supplementary @@ -113,7 +84,7 @@ setgroups_needed_p (uid_t target_group) static int -set_ids_by_number (uid_t uid, gid_t gid, char **message_ret) +set_ids_by_number (uid_t uid, gid_t gid) { int uid_errno = 0; int gid_errno = 0; @@ -121,9 +92,6 @@ set_ids_by_number (uid_t uid, gid_t gid, char **message_ret) struct passwd *p = getpwuid (uid); struct group *g = getgrgid (gid); - if (message_ret) - *message_ret = 0; - /* Rumor has it that some implementations of of setuid() do nothing when called with -1; therefore, if the "nobody" user has a uid of -1, then that would be Really Bad. Rumor further has it that such @@ -150,13 +118,12 @@ set_ids_by_number (uid_t uid, gid_t gid, char **message_ret) if (uid_errno == 0 && gid_errno == 0 && sgs_errno == 0) { - static char buf [1024]; - sprintf (buf, "changed uid/gid to %.100s/%.100s (%ld/%ld).", - (p && p->pw_name ? p->pw_name : "???"), - (g && g->gr_name ? g->gr_name : "???"), - (long) uid, (long) gid); - if (message_ret) - *message_ret = buf; + if (verbose_p) + fprintf (stderr, "%s: changed uid/gid to %.100s/%.100s (%ld/%ld)\n", + blurb(), + (p && p->pw_name ? p->pw_name : "???"), + (g && g->gr_name ? g->gr_name : "???"), + (long) uid, (long) gid); return 0; } else @@ -176,7 +143,7 @@ set_ids_by_number (uid_t uid, gid_t gid, char **message_ret) else { errno = sgs_errno; - perror(buf); + perror (buf); } fprintf (stderr, "%s: effective group list: ", blurb()); @@ -206,11 +173,11 @@ set_ids_by_number (uid_t uid, gid_t gid, char **message_ret) (g && g->gr_name ? g->gr_name : "???"), (long) gid); if (gid_errno == -1) - fprintf(stderr, "%s: unknown error\n", buf); + fprintf (stderr, "%s: unknown error\n", buf); else { errno = gid_errno; - perror(buf); + perror (buf); } } @@ -241,121 +208,63 @@ set_ids_by_number (uid_t uid, gid_t gid, char **message_ret) lock-mode.) *** WARNING: DO NOT DISABLE ANY OF THE FOLLOWING CODE! - If you do so, you will open a security hole. See the sections - of the xscreensaver manual titled "LOCKING AND ROOT LOGINS", - and "USING XDM". + If you do so, you will open a security hole. + Do not log in to an X11 desktop as root. + Log in as a normal users and 'sudo' as needed. */ void -hack_uid (saver_info *si) +disavow_privileges (void) { + uid_t euid = geteuid(); + gid_t egid = getegid(); + uid_t uid = getuid(); + gid_t gid = getgid(); + struct passwd *p; - /* Discard privileges, and set the effective user/group ids to the - real user/group ids. That is, give up our "chmod +s" rights. - */ - { - uid_t euid = geteuid(); - gid_t egid = getegid(); - uid_t uid = getuid(); - gid_t gid = getgid(); - - si->orig_uid = strdup (uid_gid_string (euid, egid)); - - if (uid != euid || gid != egid) - if (set_ids_by_number (uid, gid, &si->uid_message) != 0) - saver_exit (si, 1, 0); - } - - - /* Locking can't work when running as root, because we have no way of - knowing what the user id of the logged in user is (so we don't know - whose password to prompt for.) - - *** WARNING: DO NOT DISABLE THIS CODE! - If you do so, you will open a security hole. See the sections - of the xscreensaver manual titled "LOCKING AND ROOT LOGINS", - and "USING XDM". - */ - if (getuid() == (uid_t) 0) + if (uid != euid || gid != egid) { - si->locking_disabled_p = True; - si->nolock_reason = "running as root"; + if (verbose_p) + fprintf (stderr, "%s: initial effective uid/gid was %s\n", blurb(), + uid_gid_string (euid, egid)); + if (set_ids_by_number (uid, gid) != 0) + exit (1); /* already printed error */ } - - /* If we're running as root, switch to a safer user. This is above and - beyond the fact that we've disabling locking, above -- the theory is - that running graphics demos as root is just always a stupid thing - to do, since they have probably never been security reviewed and are - more likely to be buggy than just about any other kind of program. - (And that assumes non-malicious code. There are also attacks here.) - - *** WARNING: DO NOT DISABLE THIS CODE! - If you do so, you will open a security hole. See the sections - of the xscreensaver manual titled "LOCKING AND ROOT LOGINS", - and "USING XDM". + /* If we're still running as root, or if the user we are running at seems + to be in any way hinky, exit and do not allow password authentication + to continue. */ - if (getuid() == (uid_t) 0) - { - struct passwd *p; - - p = getpwnam ("nobody"); - if (! p) p = getpwnam ("noaccess"); - if (! p) p = getpwnam ("daemon"); - if (! p) - { - fprintf (stderr, - "%s: running as root, and couldn't find a safer uid.\n", - blurb()); - saver_exit(si, 1, 0); - } + uid = getuid (); /* get it again */ + p = getpwuid (uid); - if (set_ids_by_number (p->pw_uid, p->pw_gid, &si->uid_message) != 0) - saver_exit (si, -1, 0); + if (!p || + uid == (uid_t) 0 || + uid == (uid_t) -1 || + uid == (uid_t) -2 || + p->pw_uid == (uid_t) 0 || + p->pw_uid == (uid_t) -1 || + p->pw_uid == (uid_t) -2 || + !p->pw_name || + !*p->pw_name || + !strcmp (p->pw_name, "root") || + !strcmp (p->pw_name, "nobody") || + !strcmp (p->pw_name, "noaccess") || + !strcmp (p->pw_name, "operator") || + !strcmp (p->pw_name, "daemon") || + !strcmp (p->pw_name, "bin") || + !strcmp (p->pw_name, "adm") || + !strcmp (p->pw_name, "sys") || + !strcmp (p->pw_name, "games")) + { + fprintf (stderr, + "%s: running as user \"%s\" -- authentication disallowed\n", + blurb(), + (p && p->pw_name && *p->pw_name + ? p->pw_name + : "")); + exit (1); } - - /* If there's anything even remotely funny looking about the passwd struct, - or if we're running as some other user from the list below (a - non-comprehensive selection of users known to be privileged in some way, - and not normal end-users) then disable locking. If it was possible, - switching to "nobody" would be the thing to do, but only root itself has - the privs to do that. - - *** WARNING: DO NOT DISABLE THIS CODE! - If you do so, you will open a security hole. See the sections - of the xscreensaver manual titled "LOCKING AND ROOT LOGINS", - and "USING XDM". - */ - { - uid_t uid = getuid (); /* get it again */ - struct passwd *p = getpwuid (uid); /* get it again */ - - if (!p || - uid == (uid_t) 0 || - uid == (uid_t) -1 || - uid == (uid_t) -2 || - p->pw_uid == (uid_t) 0 || - p->pw_uid == (uid_t) -1 || - p->pw_uid == (uid_t) -2 || - !p->pw_name || - !*p->pw_name || - !strcmp (p->pw_name, "root") || - !strcmp (p->pw_name, "nobody") || - !strcmp (p->pw_name, "noaccess") || - !strcmp (p->pw_name, "operator") || - !strcmp (p->pw_name, "daemon") || - !strcmp (p->pw_name, "bin") || - !strcmp (p->pw_name, "adm") || - !strcmp (p->pw_name, "sys") || - !strcmp (p->pw_name, "games")) - { - static char buf [1024]; - sprintf (buf, "running as %.100s", - (p && p->pw_name && *p->pw_name - ? p->pw_name : "")); - si->nolock_reason = buf; - si->locking_disabled_p = True; - si->dangerous_uid_p = True; - } - } + if (verbose_p) + fprintf (stderr, "%s: running as user \"%s\"\n", blurb(), p->pw_name); } diff --git a/driver/splash.c b/driver/splash.c deleted file mode 100644 index b971ade1..00000000 --- a/driver/splash.c +++ /dev/null @@ -1,917 +0,0 @@ -/* xscreensaver, Copyright (c) 1991-2018 Jamie Zawinski - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include - -#include "xscreensaver.h" -#include "resources.h" -#include "font-retry.h" - -#undef MAX -#define MAX(a,b) ((a)>(b)?(a):(b)) - -void -draw_shaded_rectangle (Display *dpy, Window window, - int x, int y, - int width, int height, - int thickness, - unsigned long top_color, - unsigned long bottom_color) -{ - XPoint points[4]; - XGCValues gcv; - GC gc1, gc2; - if (thickness == 0) return; - - gcv.foreground = top_color; - gc1 = XCreateGC (dpy, window, GCForeground, &gcv); - gcv.foreground = bottom_color; - gc2 = XCreateGC (dpy, window, GCForeground, &gcv); - - points [0].x = x; - points [0].y = y; - points [1].x = x + width; - points [1].y = y; - points [2].x = x + width - thickness; - points [2].y = y + thickness; - points [3].x = x; - points [3].y = y + thickness; - XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin); - - points [0].x = x; - points [0].y = y + thickness; - points [1].x = x; - points [1].y = y + height; - points [2].x = x + thickness; - points [2].y = y + height - thickness; - points [3].x = x + thickness; - points [3].y = y + thickness; - XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin); - - points [0].x = x + width; - points [0].y = y; - points [1].x = x + width - thickness; - points [1].y = y + thickness; - points [2].x = x + width - thickness; - points [2].y = y + height - thickness; - points [3].x = x + width; - points [3].y = y + height - thickness; - XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin); - - points [0].x = x; - points [0].y = y + height; - points [1].x = x + width; - points [1].y = y + height; - points [2].x = x + width; - points [2].y = y + height - thickness; - points [3].x = x + thickness; - points [3].y = y + height - thickness; - XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin); - - XFreeGC (dpy, gc1); - XFreeGC (dpy, gc2); -} - - -int -string_width (XFontStruct *font, char *s) -{ - return XTextWidth(font, s, strlen(s)); -} - - -static void update_splash_window (saver_info *si); -static void draw_splash_window (saver_info *si); -static void destroy_splash_window (saver_info *si); -static void unsplash_timer (XtPointer closure, XtIntervalId *id); - -static void do_demo (saver_screen_info *ssi); -#ifdef PREFS_BUTTON -static void do_prefs (saver_screen_info *ssi); -#endif /* PREFS_BUTTON */ -static void do_help (saver_screen_info *ssi); - - -XFontStruct * -splash_load_font (Display *dpy, char *name, char *class) -{ - char *s = get_string_resource (dpy, name, class); - XFontStruct *f; - if (!s || !*s) - s = "-*-helvetica-bold-r-*-*-*-140-*-*-*-*-*-*"; - f = load_font_retry (dpy, s); - if (!f) abort(); - return f; -} - - -struct splash_dialog_data { - - saver_screen_info *prompt_screen; - XtIntervalId timer; - - Dimension width; - Dimension height; - - char *heading_label; - char *body_label; - char *body2_label; - char *body3_label; - char *body4_label; - char *demo_label; -#ifdef PREFS_BUTTON - char *prefs_label; -#endif /* PREFS_BUTTON */ - char *help_label; - - XFontStruct *heading_font; - XFontStruct *body_font; - XFontStruct *button_font; - - Pixel foreground; - Pixel background; - Pixel border; - Pixel button_foreground; - Pixel button_background; - Pixel shadow_top; - Pixel shadow_bottom; - - Dimension logo_width; - Dimension logo_height; - Dimension internal_border; - Dimension shadow_width; - - Dimension button_width, button_height; - Dimension demo_button_x, demo_button_y; -#ifdef PREFS_BUTTON - Dimension prefs_button_x, prefs_button_y; -#endif /* PREFS_BUTTON */ - Dimension help_button_x, help_button_y; - - Pixmap logo_pixmap; - Pixmap logo_clipmask; - int logo_npixels; - unsigned long *logo_pixels; - - int pressed; -}; - - -void -make_splash_dialog (saver_info *si) -{ - saver_preferences *p = &si->prefs; - int x, y, bw; - XSetWindowAttributes attrs; - unsigned long attrmask = 0; - splash_dialog_data *sp; - saver_screen_info *ssi; - Colormap cmap; - - Bool whyne = senesculent_p (); - - if (whyne) - { - /* If locking is not enabled, make sure they see the message. */ - if (!p->lock_p) - { - si->prefs.splash_p = True; - if (si->prefs.splash_duration < 5000) - si->prefs.splash_duration = 5000; - } - si->prefs.splash_duration += 3000; - } - - if (si->sp_data) - return; - if (!si->prefs.splash_p || - si->prefs.splash_duration <= 0) - return; - - ssi = &si->screens[mouse_screen (si)]; - - if (!ssi || !ssi->screen) - return; /* WTF? Trying to splash while no screens connected? */ - - cmap = DefaultColormapOfScreen (ssi->screen); - - sp = (splash_dialog_data *) calloc (1, sizeof(*sp)); - sp->prompt_screen = ssi; - - sp->heading_label = get_string_resource (si->dpy, - "splash.heading.label", - "Dialog.Label.Label"); - sp->body_label = get_string_resource (si->dpy, - "splash.body.label", - "Dialog.Label.Label"); - sp->body2_label = get_string_resource (si->dpy, - "splash.body2.label", - "Dialog.Label.Label"); - sp->demo_label = get_string_resource (si->dpy, - "splash.demo.label", - "Dialog.Button.Label"); -#ifdef PREFS_BUTTON - sp->prefs_label = get_string_resource (si->dpy, - "splash.prefs.label", - "Dialog.Button.Label"); -#endif /* PREFS_BUTTON */ - sp->help_label = get_string_resource (si->dpy, - "splash.help.label", - "Dialog.Button.Label"); - - - - if (whyne) - { - sp->body3_label = strdup("WARNING: This version is very old!"); - sp->body4_label = strdup("Please upgrade!"); - } - - if (!sp->heading_label) - sp->heading_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY"); - if (!sp->body_label) - sp->body_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY"); - if (!sp->body2_label) - sp->body2_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY"); - if (!sp->demo_label) sp->demo_label = strdup("ERROR"); -#ifdef PREFS_BUTTON - if (!sp->prefs_label) sp->prefs_label = strdup("ERROR"); -#endif /* PREFS_BUTTON */ - if (!sp->help_label) sp->help_label = strdup("ERROR"); - - /* Put the version number in the label. */ - { - char *s = (char *) malloc (strlen(sp->heading_label) + 20); - sprintf(s, sp->heading_label, si->version); - free (sp->heading_label); - sp->heading_label = s; - } - - sp->heading_font = - splash_load_font (si->dpy, "splash.headingFont", "Dialog.Font"); - sp->body_font = - splash_load_font (si->dpy, "splash.bodyFont", "Dialog.Font"); - sp->button_font = - splash_load_font (si->dpy, "splash.buttonFont", "Dialog.Font"); - - sp->foreground = get_pixel_resource (si->dpy, cmap, - "splash.foreground", - "Dialog.Foreground"); - sp->background = get_pixel_resource (si->dpy, cmap, - "splash.background", - "Dialog.Background"); - sp->border = get_pixel_resource (si->dpy, cmap, - "splash.borderColor", - "Dialog.borderColor"); - - if (sp->foreground == sp->background) - { - /* Make sure the error messages show up. */ - sp->foreground = BlackPixelOfScreen (ssi->screen); - sp->background = WhitePixelOfScreen (ssi->screen); - } - - sp->button_foreground = get_pixel_resource (si->dpy, cmap, - "splash.Button.foreground", - "Dialog.Button.Foreground"); - sp->button_background = get_pixel_resource (si->dpy, cmap, - "splash.Button.background", - "Dialog.Button.Background"); - sp->shadow_top = get_pixel_resource (si->dpy, cmap, - "splash.topShadowColor", - "Dialog.Foreground"); - sp->shadow_bottom = get_pixel_resource (si->dpy, cmap, - "splash.bottomShadowColor", - "Dialog.Background"); - - sp->logo_width = get_integer_resource (si->dpy, - "splash.logo.width", - "Dialog.Logo.Width"); - sp->logo_height = get_integer_resource (si->dpy, - "splash.logo.height", - "Dialog.Logo.Height"); - sp->internal_border = get_integer_resource (si->dpy, - "splash.internalBorderWidth", - "Dialog.InternalBorderWidth"); - sp->shadow_width = get_integer_resource (si->dpy, - "splash.shadowThickness", - "Dialog.ShadowThickness"); - - if (sp->logo_width == 0) sp->logo_width = 150; - if (sp->logo_height == 0) sp->logo_height = 150; - if (sp->internal_border == 0) sp->internal_border = 15; - if (sp->shadow_width == 0) sp->shadow_width = 4; - - { - int direction, ascent, descent; - XCharStruct overall; - - sp->width = 0; - sp->height = 0; - - /* Measure the heading_label. */ - XTextExtents (sp->heading_font, - sp->heading_label, strlen(sp->heading_label), - &direction, &ascent, &descent, &overall); - if (overall.width > sp->width) sp->width = overall.width; - sp->height += ascent + descent; - - /* Measure the body_label. */ - XTextExtents (sp->body_font, - sp->body_label, strlen(sp->body_label), - &direction, &ascent, &descent, &overall); - if (overall.width > sp->width) sp->width = overall.width; - sp->height += ascent + descent; - - /* Measure the body2_label. */ - XTextExtents (sp->body_font, - sp->body2_label, strlen(sp->body2_label), - &direction, &ascent, &descent, &overall); - if (overall.width > sp->width) sp->width = overall.width; - sp->height += ascent + descent; - - /* Measure the optional body3_label. */ - if (sp->body3_label) - { - XTextExtents (sp->heading_font, - sp->body3_label, strlen(sp->body3_label), - &direction, &ascent, &descent, &overall); - if (overall.width > sp->width) sp->width = overall.width; - XTextExtents (sp->heading_font, - sp->body4_label, strlen(sp->body4_label), - &direction, &ascent, &descent, &overall); - if (overall.width > sp->width) sp->width = overall.width; - sp->height += (ascent + descent) * 5; - } - - { - Dimension w2 = 0, w3 = 0, w4 = 0; - Dimension h2 = 0, h3 = 0, h4 = 0; - - /* Measure the Demo button. */ - XTextExtents (sp->button_font, - sp->demo_label, strlen(sp->demo_label), - &direction, &ascent, &descent, &overall); - w2 = overall.width; - h2 = ascent + descent; - -#ifdef PREFS_BUTTON - /* Measure the Prefs button. */ - XTextExtents (sp->button_font, - sp->prefs_label, strlen(sp->prefs_label), - &direction, &ascent, &descent, &overall); - w3 = overall.width; - h3 = ascent + descent; -#else /* !PREFS_BUTTON */ - w3 = 0; - h3 = 0; -#endif /* !PREFS_BUTTON */ - - /* Measure the Help button. */ - XTextExtents (sp->button_font, - sp->help_label, strlen(sp->help_label), - &direction, &ascent, &descent, &overall); - w4 = overall.width; - h4 = ascent + descent; - - w2 = MAX(w2, w3); w2 = MAX(w2, w4); - h2 = MAX(h2, h3); h2 = MAX(h2, h4); - - /* Add some horizontal padding inside the buttons. */ - w2 += ascent; - - w2 += ((ascent + descent) / 2) + (sp->shadow_width * 2); - h2 += ((ascent + descent) / 2) + (sp->shadow_width * 2); - - sp->button_width = w2; - sp->button_height = h2; - -#ifdef PREFS_BUTTON - w2 *= 3; -#else /* !PREFS_BUTTON */ - w2 *= 2; -#endif /* !PREFS_BUTTON */ - - w2 += ((ascent + descent) * 2); /* for space between buttons */ - - if (w2 > sp->width) sp->width = w2; - sp->height += h2; - } - - sp->width += (sp->internal_border * 2); - sp->height += (sp->internal_border * 3); - - if (sp->logo_height > sp->height) - sp->height = sp->logo_height; - else if (sp->height > sp->logo_height) - sp->logo_height = sp->height; - - sp->logo_width = sp->logo_height; - - sp->width += sp->logo_width; - } - - attrmask |= CWOverrideRedirect; attrs.override_redirect = True; - attrmask |= CWEventMask; - attrs.event_mask = (ExposureMask | ButtonPressMask | ButtonReleaseMask); - - { - int sx = 0, sy = 0, w, h; - - x = ssi->x; - y = ssi->y; - w = ssi->width; - h = ssi->height; - if (si->prefs.debug_p) w /= 2; - x = sx + (((w + sp->width) / 2) - sp->width); - y = sy + (((h + sp->height) / 2) - sp->height); - if (x < sx) x = sx; - if (y < sy) y = sy; - } - - bw = get_integer_resource (si->dpy, - "splash.borderWidth", - "Dialog.BorderWidth"); - - si->splash_dialog = - XCreateWindow (si->dpy, - RootWindowOfScreen(ssi->screen), - x, y, sp->width, sp->height, bw, - DefaultDepthOfScreen (ssi->screen), InputOutput, - DefaultVisualOfScreen(ssi->screen), - attrmask, &attrs); - XSetWindowBackground (si->dpy, si->splash_dialog, sp->background); - XSetWindowBorder (si->dpy, si->splash_dialog, sp->border); - - - sp->logo_pixmap = xscreensaver_logo (ssi->screen, - /* same visual as si->splash_dialog */ - DefaultVisualOfScreen (ssi->screen), - si->splash_dialog, cmap, - sp->background, - &sp->logo_pixels, &sp->logo_npixels, - &sp->logo_clipmask, True); - - XMapRaised (si->dpy, si->splash_dialog); - XSync (si->dpy, False); - - si->sp_data = sp; - - sp->timer = XtAppAddTimeOut (si->app, si->prefs.splash_duration, - unsplash_timer, (XtPointer) si); - - draw_splash_window (si); - XSync (si->dpy, False); -} - - -static void -draw_splash_window (saver_info *si) -{ - splash_dialog_data *sp = si->sp_data; - XGCValues gcv; - GC gc1, gc2; - int vspacing, height; - int x1, x2, x3, y1, y2; - int sw; - -#ifdef PREFS_BUTTON - int hspacing; - int nbuttons = 3; -#endif /* !PREFS_BUTTON */ - - height = (sp->heading_font->ascent + sp->heading_font->descent + - sp->body_font->ascent + sp->body_font->descent + - sp->body_font->ascent + sp->body_font->descent + - sp->button_font->ascent + sp->button_font->descent); - vspacing = ((sp->height - - (4 * sp->shadow_width) - - (2 * sp->internal_border) - - height) / 5); - if (vspacing < 0) vspacing = 0; - if (vspacing > (sp->heading_font->ascent * 2)) - vspacing = (sp->heading_font->ascent * 2); - - gcv.foreground = sp->foreground; - gc1 = XCreateGC (si->dpy, si->splash_dialog, GCForeground, &gcv); - gc2 = XCreateGC (si->dpy, si->splash_dialog, GCForeground, &gcv); - x1 = sp->logo_width; - x3 = sp->width - (sp->shadow_width * 2); - y1 = sp->internal_border; - - /* top heading - */ - XSetFont (si->dpy, gc1, sp->heading_font->fid); - sw = string_width (sp->heading_font, sp->heading_label); - x2 = (x1 + ((x3 - x1 - sw) / 2)); - y1 += sp->heading_font->ascent; - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1, - sp->heading_label, strlen(sp->heading_label)); - y1 += sp->heading_font->descent; - - /* text below top heading - */ - XSetFont (si->dpy, gc1, sp->body_font->fid); - y1 += vspacing + sp->body_font->ascent; - sw = string_width (sp->body_font, sp->body_label); - x2 = (x1 + ((x3 - x1 - sw) / 2)); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1, - sp->body_label, strlen(sp->body_label)); - y1 += sp->body_font->descent; - - y1 += sp->body_font->ascent; - sw = string_width (sp->body_font, sp->body2_label); - x2 = (x1 + ((x3 - x1 - sw) / 2)); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1, - sp->body2_label, strlen(sp->body2_label)); - y1 += sp->body_font->descent; - - if (sp->body3_label) - { - XSetFont (si->dpy, gc1, sp->heading_font->fid); - y1 += sp->heading_font->ascent + sp->heading_font->descent; - y1 += sp->heading_font->ascent; - sw = string_width (sp->heading_font, sp->body3_label); - x2 = (x1 + ((x3 - x1 - sw) / 2)); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1, - sp->body3_label, strlen(sp->body3_label)); - y1 += sp->heading_font->descent + sp->heading_font->ascent; - sw = string_width (sp->heading_font, sp->body4_label); - x2 = (x1 + ((x3 - x1 - sw) / 2)); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1, - sp->body4_label, strlen(sp->body4_label)); - y1 += sp->heading_font->descent; - XSetFont (si->dpy, gc1, sp->body_font->fid); - } - - /* The buttons - */ - XSetForeground (si->dpy, gc1, sp->button_foreground); - XSetForeground (si->dpy, gc2, sp->button_background); - -/* y1 += (vspacing * 2);*/ - y1 = sp->height - sp->internal_border - sp->button_height; - - x1 += sp->internal_border; - y2 = (y1 + ((sp->button_height - - (sp->button_font->ascent + sp->button_font->descent)) - / 2) - + sp->button_font->ascent); -#ifdef PREFS_BUTTON - hspacing = ((sp->width - x1 - (sp->shadow_width * 2) - - sp->internal_border - (sp->button_width * nbuttons)) - / 2); -#endif - - x2 = x1 + ((sp->button_width - string_width(sp->button_font, sp->demo_label)) - / 2); - XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1, - sp->button_width, sp->button_height); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2, - sp->demo_label, strlen(sp->demo_label)); - sp->demo_button_x = x1; - sp->demo_button_y = y1; - -#ifdef PREFS_BUTTON - x1 += hspacing + sp->button_width; - x2 = x1 + ((sp->button_width - string_width(sp->button_font,sp->prefs_label)) - / 2); - XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1, - sp->button_width, sp->button_height); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2, - sp->prefs_label, strlen(sp->prefs_label)); - sp->prefs_button_x = x1; - sp->prefs_button_y = y1; -#endif /* PREFS_BUTTON */ - -#ifdef PREFS_BUTTON - x1 += hspacing + sp->button_width; -#else /* !PREFS_BUTTON */ - x1 = (sp->width - sp->button_width - - sp->internal_border - (sp->shadow_width * 2)); -#endif /* !PREFS_BUTTON */ - - x2 = x1 + ((sp->button_width - string_width(sp->button_font,sp->help_label)) - / 2); - XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1, - sp->button_width, sp->button_height); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2, - sp->help_label, strlen(sp->help_label)); - sp->help_button_x = x1; - sp->help_button_y = y1; - - - /* The logo - */ - x1 = sp->shadow_width * 6; - y1 = sp->shadow_width * 6; - x2 = sp->logo_width - (sp->shadow_width * 12); - y2 = sp->logo_height - (sp->shadow_width * 12); - - if (sp->logo_pixmap) - { - Window root; - int x, y; - unsigned int w, h, bw, d; - XGetGeometry (si->dpy, sp->logo_pixmap, &root, &x, &y, &w, &h, &bw, &d); - XSetForeground (si->dpy, gc1, sp->foreground); - XSetBackground (si->dpy, gc1, sp->background); - XSetClipMask (si->dpy, gc1, sp->logo_clipmask); - XSetClipOrigin (si->dpy, gc1, x1 + ((x2 - (int)w) /2), y1 + ((y2 - (int)h) / 2)); - if (d == 1) - XCopyPlane (si->dpy, sp->logo_pixmap, si->splash_dialog, gc1, - 0, 0, w, h, - x1 + ((x2 - (int)w) / 2), - y1 + ((y2 - (int)h) / 2), - 1); - else - XCopyArea (si->dpy, sp->logo_pixmap, si->splash_dialog, gc1, - 0, 0, w, h, - x1 + ((x2 - (int)w) / 2), - y1 + ((y2 - (int)h) / 2)); - } - - /* Solid border inside the logo box. */ -#if 0 - XSetForeground (si->dpy, gc1, sp->foreground); - XDrawRectangle (si->dpy, si->splash_dialog, gc1, x1, y1, x2-1, y2-1); -#endif - - /* The shadow around the logo - */ - draw_shaded_rectangle (si->dpy, si->splash_dialog, - sp->shadow_width * 4, - sp->shadow_width * 4, - sp->logo_width - (sp->shadow_width * 8), - sp->logo_height - (sp->shadow_width * 8), - sp->shadow_width, - sp->shadow_bottom, sp->shadow_top); - - /* The shadow around the whole window - */ - draw_shaded_rectangle (si->dpy, si->splash_dialog, - 0, 0, sp->width, sp->height, sp->shadow_width, - sp->shadow_top, sp->shadow_bottom); - - XFreeGC (si->dpy, gc1); - XFreeGC (si->dpy, gc2); - - update_splash_window (si); -} - - -static void -update_splash_window (saver_info *si) -{ - splash_dialog_data *sp = si->sp_data; - int pressed; - if (!sp) return; - pressed = sp->pressed; - - /* The shadows around the buttons - */ - draw_shaded_rectangle (si->dpy, si->splash_dialog, - sp->demo_button_x, sp->demo_button_y, - sp->button_width, sp->button_height, sp->shadow_width, - (pressed == 1 ? sp->shadow_bottom : sp->shadow_top), - (pressed == 1 ? sp->shadow_top : sp->shadow_bottom)); -#ifdef PREFS_BUTTON - draw_shaded_rectangle (si->dpy, si->splash_dialog, - sp->prefs_button_x, sp->prefs_button_y, - sp->button_width, sp->button_height, sp->shadow_width, - (pressed == 2 ? sp->shadow_bottom : sp->shadow_top), - (pressed == 2 ? sp->shadow_top : sp->shadow_bottom)); -#endif /* PREFS_BUTTON */ - draw_shaded_rectangle (si->dpy, si->splash_dialog, - sp->help_button_x, sp->help_button_y, - sp->button_width, sp->button_height, sp->shadow_width, - (pressed == 3 ? sp->shadow_bottom : sp->shadow_top), - (pressed == 3 ? sp->shadow_top : sp->shadow_bottom)); -} - -static void -destroy_splash_window (saver_info *si) -{ - splash_dialog_data *sp = si->sp_data; - saver_screen_info *ssi = sp->prompt_screen; - Colormap cmap = DefaultColormapOfScreen (ssi->screen); - Pixel black = BlackPixelOfScreen (ssi->screen); - Pixel white = WhitePixelOfScreen (ssi->screen); - - if (sp->timer) - XtRemoveTimeOut (sp->timer); - - if (si->splash_dialog) - { - XDestroyWindow (si->dpy, si->splash_dialog); - si->splash_dialog = 0; - } - - if (sp->heading_label) free (sp->heading_label); - if (sp->body_label) free (sp->body_label); - if (sp->body2_label) free (sp->body2_label); - if (sp->body3_label) free (sp->body3_label); - if (sp->body4_label) free (sp->body4_label); - if (sp->demo_label) free (sp->demo_label); -#ifdef PREFS_BUTTON - if (sp->prefs_label) free (sp->prefs_label); -#endif /* PREFS_BUTTON */ - if (sp->help_label) free (sp->help_label); - - if (sp->heading_font) XFreeFont (si->dpy, sp->heading_font); - if (sp->body_font) XFreeFont (si->dpy, sp->body_font); - if (sp->button_font) XFreeFont (si->dpy, sp->button_font); - - if (sp->foreground != black && sp->foreground != white) - XFreeColors (si->dpy, cmap, &sp->foreground, 1, 0L); - if (sp->background != black && sp->background != white) - XFreeColors (si->dpy, cmap, &sp->background, 1, 0L); - if (sp->button_foreground != black && sp->button_foreground != white) - XFreeColors (si->dpy, cmap, &sp->button_foreground, 1, 0L); - if (sp->button_background != black && sp->button_background != white) - XFreeColors (si->dpy, cmap, &sp->button_background, 1, 0L); - if (sp->shadow_top != black && sp->shadow_top != white) - XFreeColors (si->dpy, cmap, &sp->shadow_top, 1, 0L); - if (sp->shadow_bottom != black && sp->shadow_bottom != white) - XFreeColors (si->dpy, cmap, &sp->shadow_bottom, 1, 0L); - - if (sp->logo_pixmap) - XFreePixmap (si->dpy, sp->logo_pixmap); - if (sp->logo_clipmask) - XFreePixmap (si->dpy, sp->logo_clipmask); - if (sp->logo_pixels) - { - if (sp->logo_npixels) - XFreeColors (si->dpy, cmap, sp->logo_pixels, sp->logo_npixels, 0L); - free (sp->logo_pixels); - sp->logo_pixels = 0; - sp->logo_npixels = 0; - } - - memset (sp, 0, sizeof(*sp)); - free (sp); - si->sp_data = 0; -} - -void -handle_splash_event (saver_info *si, XEvent *event) -{ - splash_dialog_data *sp = si->sp_data; - saver_screen_info *ssi; - int which = 0; - if (!sp) return; - ssi = sp->prompt_screen; - - switch (event->xany.type) - { - case Expose: - draw_splash_window (si); - break; - - case ButtonPress: case ButtonRelease: - - if (event->xbutton.x >= sp->demo_button_x && - event->xbutton.x < sp->demo_button_x + sp->button_width && - event->xbutton.y >= sp->demo_button_y && - event->xbutton.y < sp->demo_button_y + sp->button_height) - which = 1; - -#ifdef PREFS_BUTTON - else if (event->xbutton.x >= sp->prefs_button_x && - event->xbutton.x < sp->prefs_button_x + sp->button_width && - event->xbutton.y >= sp->prefs_button_y && - event->xbutton.y < sp->prefs_button_y + sp->button_height) - which = 2; -#endif /* PREFS_BUTTON */ - - else if (event->xbutton.x >= sp->help_button_x && - event->xbutton.x < sp->help_button_x + sp->button_width && - event->xbutton.y >= sp->help_button_y && - event->xbutton.y < sp->help_button_y + sp->button_height) - which = 3; - - if (event->xany.type == ButtonPress) - { - sp->pressed = which; - update_splash_window (si); - if (which == 0) - XBell (si->dpy, False); - } - else if (event->xany.type == ButtonRelease) - { - if (which && sp->pressed == which) - { - destroy_splash_window (si); - sp = si->sp_data; - switch (which) - { - case 1: do_demo (ssi); break; -#ifdef PREFS_BUTTON - case 2: do_prefs (ssi); break; -#endif /* PREFS_BUTTON */ - case 3: do_help (ssi); break; - default: abort(); - } - } - else if (which == 0 && sp->pressed == 0) - { - /* click and release on the window but not in a button: - treat that as "dismiss the splash dialog." */ - destroy_splash_window (si); - sp = si->sp_data; - } - if (sp) sp->pressed = 0; - update_splash_window (si); - } - break; - - default: - break; - } -} - -static void -unsplash_timer (XtPointer closure, XtIntervalId *id) -{ - saver_info *si = (saver_info *) closure; - if (si && si->sp_data) - destroy_splash_window (si); -} - - -/* Button callbacks */ - -#ifdef VMS -# define pid_t int -# define fork vfork -#endif /* VMS */ - - -static void -do_demo (saver_screen_info *ssi) -{ - saver_info *si = ssi->global; - saver_preferences *p = &si->prefs; - const char *cmd = p->demo_command; - - if (cmd && *cmd) - fork_and_exec (ssi, cmd); - else - fprintf (stderr, "%s: no demo-mode command has been specified.\n", - blurb()); -} - -#ifdef PREFS_BUTTON -static void -do_prefs (saver_screen_info *ssi) -{ - saver_info *si = ssi->global; - saver_preferences *p = &si->prefs; - const char *cmd = p->prefs_command; - - if (cmd && *cmd) - fork_and_exec (ssi, cmd); - else - fprintf (stderr, "%s: no preferences command has been specified.\n", - blurb()); -} -#endif /* PREFS_BUTTON */ - -static void -do_help (saver_screen_info *ssi) -{ - saver_info *si = ssi->global; - saver_preferences *p = &si->prefs; - char *help_command = 0; - - if (!p->load_url_command || !*p->load_url_command) - { - fprintf (stderr, "%s: no URL command has been specified.\n", blurb()); - return; - } - if (!p->help_url || !*p->help_url) - { - fprintf (stderr, "%s: no Help URL has been specified.\n", blurb()); - return; - } - - help_command = (char *) malloc (strlen (p->load_url_command) + - (strlen (p->help_url) * 4) + 10); - sprintf (help_command, p->load_url_command, - p->help_url, p->help_url, p->help_url, p->help_url); - - fork_and_exec (ssi, help_command); - free (help_command); -} diff --git a/driver/stderr.c b/driver/stderr.c deleted file mode 100644 index 140f6c1d..00000000 --- a/driver/stderr.c +++ /dev/null @@ -1,568 +0,0 @@ -/* stderr.c --- capturing stdout/stderr output onto the screensaver window. - * xscreensaver, Copyright (c) 1991-2020 Jamie Zawinski - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ - -/* stderr hackery - Why Unix Sucks, reason number 32767. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include - -#include -#include - -#ifdef HAVE_UNISTD_H -# include -#endif - -#ifdef HAVE_FCNTL -# include -#endif - -#include - -#include "xscreensaver.h" -#include "resources.h" -#include "visual.h" - -FILE *real_stderr = 0; -FILE *real_stdout = 0; - - -/* It's ok for these to be global, since they refer to the one and only - stderr stream, not to a particular screen or window or visual. - */ -static char stderr_buffer [4096]; -static char *stderr_tail = 0; -static time_t stderr_last_read = 0; - -static int stderr_stdout_read_fd = -1; - -static void make_stderr_overlay_window (saver_screen_info *); - - -/* Recreates the stderr window or GCs: do this when the xscreensaver window - on a screen has been re-created. - */ -void -reset_stderr (saver_screen_info *ssi) -{ - saver_info *si = ssi->global; - - if (si->prefs.debug_p) - fprintf ((real_stderr ? real_stderr : stderr), - "%s: resetting stderr\n", blurb()); - - ssi->stderr_text_x = 0; - ssi->stderr_text_y = 0; - - if (ssi->stderr_gc) - XFreeGC (si->dpy, ssi->stderr_gc); - ssi->stderr_gc = 0; - - if (ssi->stderr_overlay_window) - XDestroyWindow(si->dpy, ssi->stderr_overlay_window); - ssi->stderr_overlay_window = 0; - - if (ssi->stderr_cmap) - XFreeColormap(si->dpy, ssi->stderr_cmap); - ssi->stderr_cmap = 0; -} - -/* Erases any stderr text overlaying the screen (if possible) and resets - the stderr output cursor to the upper left. Do this when the xscreensaver - window is cleared. - */ -void -clear_stderr (saver_screen_info *ssi) -{ - saver_info *si = ssi->global; - ssi->stderr_text_x = 0; - ssi->stderr_text_y = 0; - if (ssi->stderr_overlay_window) - XClearWindow (si->dpy, ssi->stderr_overlay_window); -} - - -/* Draws the string on the screen's window. - */ -static void -print_stderr_1 (saver_screen_info *ssi, char *string) -{ - saver_info *si = ssi->global; - Display *dpy = si->dpy; - Screen *screen = ssi->screen; - Window window = (ssi->stderr_overlay_window ? - ssi->stderr_overlay_window : - ssi->screensaver_window); - int h_border = 20; - int v_border = 20; - char *head = string; - char *tail; - - if (! ssi->stderr_font) - { - char *font_name = get_string_resource (dpy, "font", "Font"); - if (!font_name) font_name = strdup ("fixed"); - ssi->stderr_font = XLoadQueryFont (dpy, font_name); - if (! ssi->stderr_font) ssi->stderr_font = XLoadQueryFont (dpy, "fixed"); - ssi->stderr_line_height = (ssi->stderr_font->ascent + - ssi->stderr_font->descent); - free (font_name); - } - - if (! ssi->stderr_gc) - { - XGCValues gcv; - Pixel fg, bg; - Colormap cmap = ssi->cmap; - - if (!ssi->stderr_overlay_window && - get_boolean_resource(dpy, "overlayStderr", "Boolean")) - { - make_stderr_overlay_window (ssi); - if (ssi->stderr_overlay_window) - window = ssi->stderr_overlay_window; - if (ssi->stderr_cmap) - cmap = ssi->stderr_cmap; - } - - fg = get_pixel_resource (dpy,cmap,"overlayTextForeground","Foreground"); - bg = get_pixel_resource (dpy,cmap,"overlayTextBackground","Background"); - gcv.font = ssi->stderr_font->fid; - gcv.foreground = fg; - gcv.background = bg; - ssi->stderr_gc = XCreateGC (dpy, window, - (GCFont | GCForeground | GCBackground), - &gcv); - } - - - if (ssi->stderr_cmap) - XInstallColormap(si->dpy, ssi->stderr_cmap); - - for (tail = string; *tail; tail++) - { - if (*tail == '\n' || *tail == '\r') - { - int maxy = HeightOfScreen (screen) - v_border - v_border; - if (tail != head) - XDrawImageString (dpy, window, ssi->stderr_gc, - ssi->stderr_text_x + h_border, - ssi->stderr_text_y + v_border + - ssi->stderr_font->ascent, - head, tail - head); - ssi->stderr_text_x = 0; - ssi->stderr_text_y += ssi->stderr_line_height; - head = tail + 1; - if (*tail == '\r' && *head == '\n') - head++, tail++; - - if (ssi->stderr_text_y > maxy - ssi->stderr_line_height) - { -#if 0 - ssi->stderr_text_y = 0; -#else - int offset = ssi->stderr_line_height * 5; - XWindowAttributes xgwa; - XGetWindowAttributes (dpy, window, &xgwa); - - XCopyArea (dpy, window, window, ssi->stderr_gc, - 0, v_border + offset, - xgwa.width, - (xgwa.height - v_border - v_border - offset), - 0, v_border); - XClearArea (dpy, window, - 0, xgwa.height - v_border - offset, - xgwa.width, offset, False); - ssi->stderr_text_y -= offset; -#endif - } - } - } - if (tail != head) - { - int direction, ascent, descent; - XCharStruct overall; - XDrawImageString (dpy, window, ssi->stderr_gc, - ssi->stderr_text_x + h_border, - ssi->stderr_text_y + v_border - + ssi->stderr_font->ascent, - head, tail - head); - XTextExtents (ssi->stderr_font, tail, tail - head, - &direction, &ascent, &descent, &overall); - ssi->stderr_text_x += overall.width; - } -} - -static void -make_stderr_overlay_window (saver_screen_info *ssi) -{ - saver_info *si = ssi->global; - unsigned long transparent_pixel = 0; - Visual *visual = get_overlay_visual (ssi->screen, &transparent_pixel); - if (visual) - { - int depth = visual_depth (ssi->screen, visual); - XSetWindowAttributes attrs; - XWindowAttributes xgwa; - unsigned long attrmask; - XGetWindowAttributes (si->dpy, ssi->screensaver_window, &xgwa); - - if (si->prefs.debug_p) - fprintf(real_stderr, - "%s: using overlay visual 0x%0x for stderr text layer.\n", - blurb(), (int) XVisualIDFromVisual (visual)); - - ssi->stderr_cmap = XCreateColormap(si->dpy, - RootWindowOfScreen(ssi->screen), - visual, AllocNone); - - attrmask = (CWColormap | CWBackPixel | CWBackingPixel | CWBorderPixel | - CWBackingStore | CWSaveUnder); - attrs.colormap = ssi->stderr_cmap; - attrs.background_pixel = transparent_pixel; - attrs.backing_pixel = transparent_pixel; - attrs.border_pixel = transparent_pixel; - attrs.backing_store = NotUseful; - attrs.save_under = False; - - ssi->stderr_overlay_window = - XCreateWindow(si->dpy, ssi->screensaver_window, 0, 0, - xgwa.width, xgwa.height, - 0, depth, InputOutput, visual, attrmask, &attrs); - XMapRaised(si->dpy, ssi->stderr_overlay_window); - } -} - - -/* Draws the string on each screen's window as error text. - */ -static void -print_stderr (saver_info *si, char *string) -{ - saver_preferences *p = &si->prefs; - int i; - - /* In verbose mode, copy it to stderr as well. */ - if (p->verbose_p) - fprintf (real_stderr, "%s", string); - - for (i = 0; i < si->nscreens; i++) - print_stderr_1 (&si->screens[i], string); -} - - -/* Polls the stderr buffer every few seconds and if it finds any text, - writes it on all screens. - */ -static void -stderr_popup_timer_fn (XtPointer closure, XtIntervalId *id) -{ - saver_info *si = (saver_info *) closure; - char *s = stderr_buffer; - if (*s) - { - /* If too much data was printed, then something has gone haywire, - so truncate it. */ - char *trailer = "\n\n<< stderr diagnostics have been truncated >>\n\n"; - int max = sizeof (stderr_buffer) - strlen (trailer) - 5; - if (strlen (s) > max) - strcpy (s + max, trailer); - /* Now show the user. */ - print_stderr (si, s); - } - - stderr_tail = stderr_buffer; - si->stderr_popup_timer = 0; -} - - -/* Called when data becomes available on the stderr pipe. Copies it into - stderr_buffer where stderr_popup_timer_fn() can find it later. - */ -static void -stderr_callback (XtPointer closure, int *fd, XtIntervalId *id) -{ - saver_info *si = (saver_info *) closure; - Bool shutting_down_p = (id == 0); /* Called from shutdown_stderr() */ - char *s; - int left; - int size; - int read_this_time = 0; - - if (!fd || *fd < 0 || *fd != stderr_stdout_read_fd) - abort(); - - if (stderr_tail == 0) - stderr_tail = stderr_buffer; - - left = ((sizeof (stderr_buffer) - 2) - (stderr_tail - stderr_buffer)); - - s = stderr_tail; - *s = 0; - - /* Read as much data from the fd as we can, up to our buffer size. */ - if (left > 0) - { - while ((size = read (*fd, (void *) s, left)) > 0) - { - left -= size; - s += size; - read_this_time += size; - } - *s = 0; - } - else - { - char buf2 [1024]; - /* The buffer is full; flush the rest of it. */ - while (read (*fd, (void *) buf2, sizeof (buf2)) > 0) - ; - } - - stderr_tail = s; - stderr_last_read = time ((time_t *) 0); - - /* Now we have read some data that we would like to put up in a dialog - box. But more data may still be coming in - so don't pop up the - dialog right now, but instead, start a timer that will pop it up - a second from now. Should more data come in in the meantime, we - will be called again, and will reset that timer again. So the - dialog will only pop up when a second has elapsed with no new data - being written to stderr. - - However, if the buffer is full (meaning lots of data has been written) - then we don't reset the timer. - */ - if (read_this_time > 0 && !shutting_down_p) - { - if (si->stderr_popup_timer) - XtRemoveTimeOut (si->stderr_popup_timer); - - si->stderr_popup_timer = - XtAppAddTimeOut (si->app, 1 * 1000, stderr_popup_timer_fn, - (XtPointer) si); - } -} - -/* If stderr capturing is desired, this replaces `stdout' and `stderr' - with a pipe, so that any output written to them will show up on the - screen as well as on the original value of those streams. - */ -void -initialize_stderr (saver_info *si, Bool inhibit_p) -{ - static Boolean done = False; - int fds [2]; - int in, out; - int new_stdout, new_stderr; - int stdout_fd = 1; - int stderr_fd = 2; - int flags = 0; - Boolean stderr_dialog_p; - - if (done) return; - done = True; - - real_stderr = stderr; - real_stdout = stdout; - - if (inhibit_p) - return; - - stderr_dialog_p = get_boolean_resource (si->dpy, "captureStderr", "Boolean"); - - if (!stderr_dialog_p) - return; - - if (pipe (fds)) - { - perror ("error creating pipe:"); - return; - } - - in = fds [0]; - out = fds [1]; - -# ifdef HAVE_FCNTL - -# if defined(O_NONBLOCK) - flags = O_NONBLOCK; -# elif defined(O_NDELAY) - flags = O_NDELAY; -# else - ERROR!! neither O_NONBLOCK nor O_NDELAY are defined. -# endif - - /* Set both sides of the pipe to nonblocking - this is so that - our reads (in stderr_callback) will terminate, and so that - out writes (in the client programs) will silently fail when - the pipe is full, instead of hosing the program. */ - if (fcntl (in, F_SETFL, flags) != 0) - { - perror ("fcntl:"); - return; - } - if (fcntl (out, F_SETFL, flags) != 0) - { - perror ("fcntl:"); - return; - } - -# endif /* !HAVE_FCNTL */ - - if (stderr_dialog_p) - { - FILE *new_stderr_file; - FILE *new_stdout_file; - - new_stderr = dup (stderr_fd); - if (new_stderr < 0) - { - perror ("could not dup() a stderr:"); - return; - } - if (! (new_stderr_file = fdopen (new_stderr, "w"))) - { - perror ("could not fdopen() the new stderr:"); - return; - } - real_stderr = new_stderr_file; - - close (stderr_fd); - if (dup2 (out, stderr_fd) < 0) - { - perror ("could not dup() a new stderr:"); - return; - } - - - new_stdout = dup (stdout_fd); - if (new_stdout < 0) - { - perror ("could not dup() a stdout:"); - return; - } - if (! (new_stdout_file = fdopen (new_stdout, "w"))) - { - perror ("could not fdopen() the new stdout:"); - return; - } - real_stdout = new_stdout_file; - - close (stdout_fd); - if (dup2 (out, stdout_fd) < 0) - { - perror ("could not dup() a new stdout:"); - return; - } - close (out); - } - - stderr_stdout_read_fd = in; - XtAppAddInput (si->app, in, (XtPointer) XtInputReadMask, stderr_callback, - (XtPointer) si); -} - - -/* If the "-log file" command-line option has been specified, - open the file for append, and redirect stdout/stderr there. - This is called very early, before initialize_stderr(). - Returns true if logging to a file. - */ -Bool -stderr_log_file (saver_info *si) -{ - int stdout_fd = 1; - int stderr_fd = 2; - const char *filename = get_string_resource (si->dpy, "logFile", "LogFile"); - int fd; - - if (!filename || !*filename) - return False; - - fd = open (filename, O_WRONLY | O_APPEND | O_CREAT, 0666); - - if (fd < 0) - { - char buf[255]; - FAIL: - sprintf (buf, "%.100s: %.100s", blurb(), filename); - perror (buf); - fflush (stderr); - fflush (stdout); - exit (1); - } - - fprintf (stderr, "%s: logging to file %s\n", blurb(), filename); - - if (dup2 (fd, stdout_fd) < 0) goto FAIL; - if (dup2 (fd, stderr_fd) < 0) goto FAIL; - - fprintf (stderr, "\n\n" - "##########################################################################\n" - "%s: logging to \"%s\" at %s\n" - "##########################################################################\n" - "\n", - blurb(), filename, timestring(0)); - return True; -} - - -/* If there is anything in the stderr buffer, flush it to the real stderr. - This does no X operations. Call this when exiting to make sure any - last words actually show up. - */ -void -shutdown_stderr (saver_info *si) -{ - fflush (stdout); - fflush (stderr); - - if (!real_stderr || stderr_stdout_read_fd < 0) - return; - - /* Copy any stragglers from the stderr pipe into stderr_buffer */ - stderr_callback ((XtPointer) si, &stderr_stdout_read_fd, 0); - - if (stderr_tail && - stderr_buffer < stderr_tail) - { - *stderr_tail = 0; - fprintf (real_stderr, "%s", stderr_buffer); - stderr_tail = stderr_buffer; - } - - if (real_stdout) fflush (real_stdout); - if (real_stderr) fflush (real_stderr); - - if (stdout != real_stdout) - { - dup2 (fileno(real_stdout), fileno(stdout)); - fclose (real_stdout); - real_stdout = stdout; - } - if (stderr != real_stderr) - { - dup2 (fileno(real_stderr), fileno(stderr)); - fclose (real_stderr); - real_stderr = stderr; - } - if (stderr_stdout_read_fd != -1) - { - close (stderr_stdout_read_fd); - stderr_stdout_read_fd = -1; - } -} diff --git a/driver/subprocs.c b/driver/subprocs.c index a589b732..2b3453d0 100644 --- a/driver/subprocs.c +++ b/driver/subprocs.c @@ -1,5 +1,5 @@ /* subprocs.c --- choosing, spawning, and killing screenhacks. - * xscreensaver, Copyright (c) 1991-2020 Jamie Zawinski + * xscreensaver, Copyright © 1991-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -19,6 +19,8 @@ #include #include /* not used for much... */ +#include +#include /* For XtAppAddSignal */ #ifndef ESRCH # include @@ -35,169 +37,23 @@ # include /* for setrlimit() and RLIMIT_AS */ #endif -#ifdef VMS -# include -# include /* for close */ -# include /* for getpid */ -# define pid_t int -# define fork vfork -#endif /* VMS */ - #include /* for the signal names */ #include -#if !defined(SIGCHLD) && defined(SIGCLD) -# define SIGCHLD SIGCLD -#endif - -#if 0 /* putenv() is declared in stdlib.h on modern linux systems. */ -#ifdef HAVE_PUTENV -extern int putenv (/* const char * */); /* getenv() is in stdlib.h... */ -#endif +#ifdef ENABLE_NLS +# include +# include +# define _(S) gettext(S) +#else +# define _(S) (S) #endif -extern int kill (pid_t, int); /* signal() is in sys/signal.h... */ - -/* This file doesn't need the Xt headers, so stub these types out... */ -#undef XtPointer -#define XtAppContext void* -#define XrmDatabase void* -#define XtIntervalId unsigned long -#define XtPointer void* -#define Widget void* - #include "xscreensaver.h" #include "exec.h" #include "yarandom.h" -#include "visual.h" /* for id_to_visual() */ - -extern saver_info *global_si_kludge; /* I hate C so much... */ - - -/* Used when printing error/debugging messages from signal handlers. - */ -static const char * -no_malloc_number_to_string (long num) -{ - static char string[128] = ""; - int num_digits; - Bool negative_p = False; - - num_digits = 0; - - if (num == 0) - return "0"; - - if (num < 0) - { - negative_p = True; - num = -num; - } - - while ((num > 0) && (num_digits < sizeof(string) - 1)) - { - int digit; - digit = (int) num % 10; - num_digits++; - string[sizeof(string) - 1 - num_digits] = digit + '0'; - num /= 10; - } - - if (negative_p) - { - num_digits++; - string[sizeof(string) - 1 - num_digits] = '-'; - } - - return string + sizeof(string) - 1 - num_digits; -} - -/* Like write(), but runs strlen() on the arg to get the length. */ -static int -write_string (int fd, const char *str) -{ - return write (fd, str, strlen (str)); -} - -static int -write_long (int fd, long n) -{ - const char *str = no_malloc_number_to_string (n); - return write_string (fd, str); -} - - -/* RLIMIT_AS (called RLIMIT_VMEM on some systems) controls the maximum size - of a process's address space, i.e., the maximal brk(2) and mmap(2) values. - Setting this lets you put a cap on how much memory a process can allocate. - - Except the "and mmap()" part kinda makes this useless, since many GL - implementations end up using mmap() to pull the whole frame buffer into - memory (or something along those lines) making it appear processes are - using hundreds of megabytes when in fact they're using very little, and - we end up capping their mallocs prematurely. YAY! - */ -#if defined(RLIMIT_VMEM) && !defined(RLIMIT_AS) -# define RLIMIT_AS RLIMIT_VMEM -#endif - -static void -limit_subproc_memory (int address_space_limit, Bool verbose_p) -{ - -/* This has caused way more problems than it has solved... - Let's just completely ignore the "memoryLimit" option now. - */ -#undef HAVE_SETRLIMIT - -#if defined(HAVE_SETRLIMIT) && defined(RLIMIT_AS) - struct rlimit r; +#include "visual.h" /* for id_to_visual() */ +#include "atoms.h" - if (address_space_limit < 10 * 1024) /* let's not be crazy */ - return; - - if (getrlimit (RLIMIT_AS, &r) != 0) - { - char buf [512]; - sprintf (buf, "%s: getrlimit(RLIMIT_AS) failed", blurb()); - perror (buf); - return; - } - - r.rlim_cur = address_space_limit; - - if (setrlimit (RLIMIT_AS, &r) != 0) - { - char buf [512]; - sprintf (buf, "%s: setrlimit(RLIMIT_AS, {%lu, %lu}) failed", - blurb(), r.rlim_cur, r.rlim_max); - perror (buf); - return; - } - - if (verbose_p) - { - int i = address_space_limit; - char buf[100]; - if (i >= (1<<30) && i == ((i >> 30) << 30)) - sprintf(buf, "%dG", i >> 30); - else if (i >= (1<<20) && i == ((i >> 20) << 20)) - sprintf(buf, "%dM", i >> 20); - else if (i >= (1<<10) && i == ((i >> 10) << 10)) - sprintf(buf, "%dK", i >> 10); - else - sprintf(buf, "%d bytes", i); - - fprintf (stderr, "%s: limited pid %lu address space to %s.\n", - blurb(), (unsigned long) getpid (), buf); - } - -#endif /* HAVE_SETRLIMIT && RLIMIT_AS */ -} - - -/* Management of child processes, and de-zombification. - */ enum job_status { job_running, /* the process is still alive */ @@ -220,10 +76,107 @@ struct screenhack_job { static struct screenhack_job *jobs = 0; -/* for debugging -- nothing calls this, but it's useful to invoke from gdb. +static void clean_job_list (void); +static void await_dying_children (saver_info *si); +static void describe_dead_child (saver_info *, pid_t, int wait_status, + struct rusage); + +static XtSignalId xt_sigterm_id = 0; +static int sigterm_received = 0; + +static XtSignalId xt_sigchld_id = 0; +static int sigchld_received = 0; + + +const char * +signal_name (int signal) +{ + /* sys_signame[], sys_siglist[], strsignal() and sigabbrev_np() + are an unportable mess. */ + switch (signal) { + case SIGHUP: return "SIGHUP"; + case SIGINT: return "SIGINT"; + case SIGQUIT: return "SIGQUIT"; + case SIGILL: return "SIGILL"; + case SIGTRAP: return "SIGTRAP"; +#ifdef SIGABRT + case SIGABRT: return "SIGABRT"; +#endif + case SIGFPE: return "SIGFPE"; + case SIGKILL: return "SIGKILL"; + case SIGBUS: return "SIGBUS"; + case SIGSEGV: return "SIGSEGV"; + case SIGPIPE: return "SIGPIPE"; + case SIGALRM: return "SIGALRM"; + case SIGTERM: return "SIGTERM"; +#ifdef SIGSTOP + case SIGSTOP: return "SIGSTOP"; +#endif +#ifdef SIGCONT + case SIGCONT: return "SIGCONT"; +#endif +#ifdef SIGUSR1 + case SIGUSR1: return "SIGUSR1"; +#endif +#ifdef SIGUSR2 + case SIGUSR2: return "SIGUSR2"; +#endif +#ifdef SIGEMT + case SIGEMT: return "SIGEMT"; +#endif +#ifdef SIGSYS + case SIGSYS: return "SIGSYS"; +#endif + case SIGCHLD: return "SIGCHLD"; +#ifdef SIGPWR + case SIGPWR: return "SIGPWR"; +#endif +#ifdef SIGWINCH + case SIGWINCH: return "SIGWINCH"; +#endif +#ifdef SIGURG + case SIGURG: return "SIGURG"; +#endif +#ifdef SIGIO + case SIGIO: return "SIGIO"; +#endif +#ifdef SIGVTALRM + case SIGVTALRM: return "SIGVTALRM"; +#endif +#ifdef SIGXCPU + case SIGXCPU: return "SIGXCPU"; +#endif +#ifdef SIGXFSZ + case SIGXFSZ: return "SIGXFSZ"; +#endif +#ifdef SIGDANGER + case SIGDANGER: return "SIGDANGER"; +#endif + default: + { + static char buf[50]; + sprintf(buf, "signal %d\n", signal); + return buf; + } + } +} + + +/* Management of child processes, and de-zombification. */ -void show_job_list (void); +static char * +timestring (time_t when) +{ + static char buf[255] = { 0 }; + struct tm tm; + localtime_r (&when, &tm); + sprintf (buf, "%02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec); + return buf; +} + +#ifdef DEBUG +void show_job_list (void); void show_job_list (void) { @@ -231,27 +184,24 @@ show_job_list (void) fprintf(stderr, "%s: job list:\n", blurb()); for (job = jobs; job; job = job->next) { - char b[] = " ??:??:?? "; - char *t = (job->killed ? timestring (job->killed) : - job->launched ? timestring (job->launched) : b); - t += 11; - t[8] = 0; - fprintf (stderr, " %5ld: %2d: (%s) %s %s\n", - (long) job->pid, - job->screen, - (job->status == job_running ? "running" : - job->status == job_stopped ? "stopped" : - job->status == job_killed ? " killed" : - job->status == job_dead ? " dead" : " ???"), - t, job->name); + fprintf (stderr, " %5ld: %2d: (%s) %s %s\n", + (long) job->pid, + job->screen, + (job->status == job_running ? "running" : + job->status == job_stopped ? "stopped" : + job->status == job_killed ? " killed" : + job->status == job_dead ? " dead" : " ???"), + (job->killed ? timestring (job->killed) : + job->launched ? timestring (job->launched) : + "??:??:??"), + job->name); } fprintf (stderr, "\n"); } +#endif /* DEBUG */ -static void clean_job_list (void); - -static struct screenhack_job * +static void make_job (pid_t pid, int screen, const char *cmd) { struct screenhack_job *job = (struct screenhack_job *) malloc (sizeof(*job)); @@ -288,8 +238,6 @@ make_job (pid_t pid, int screen, const char *cmd) job->killed = 0; job->next = jobs; jobs = job; - - return jobs; } @@ -317,8 +265,7 @@ free_job (struct screenhack_job *job) } -/* Cleans out dead jobs from the jobs list -- this must only be called - from the main thread, not from a signal handler. +/* Cleans out dead jobs from the jobs list. */ static void clean_job_list (void) @@ -367,80 +314,8 @@ find_job (pid_t pid) return 0; } -static void await_dying_children (saver_info *si); -#ifndef VMS -static void describe_dead_child (saver_info *, pid_t, int wait_status, - struct rusage); -#endif - - -/* Semaphore to temporarily turn the SIGCHLD handler into a no-op. - Don't alter this directly -- use block_sigchld() / unblock_sigchld(). - */ -static int block_sigchld_handler = 0; - - -#ifdef HAVE_SIGACTION - sigset_t -#else /* !HAVE_SIGACTION */ - int -#endif /* !HAVE_SIGACTION */ -block_sigchld (void) -{ -#ifdef HAVE_SIGACTION - struct sigaction sa; - sigset_t child_set; - - memset (&sa, 0, sizeof (sa)); - sa.sa_handler = SIG_IGN; - sigaction (SIGPIPE, &sa, NULL); - - sigemptyset (&child_set); - sigaddset (&child_set, SIGCHLD); - sigprocmask (SIG_BLOCK, &child_set, 0); - -#else /* !HAVE_SIGACTION */ - signal (SIGPIPE, SIG_IGN); -#endif /* !HAVE_SIGACTION */ - - block_sigchld_handler++; - -#ifdef HAVE_SIGACTION - return child_set; -#else /* !HAVE_SIGACTION */ - return 0; -#endif /* !HAVE_SIGACTION */ -} - -void -unblock_sigchld (void) -{ - if (block_sigchld_handler <= 0) - abort(); - - if (block_sigchld_handler <= 1) /* only unblock if count going to 0 */ - { -#ifdef HAVE_SIGACTION - struct sigaction sa; - sigset_t child_set; - - memset(&sa, 0, sizeof (sa)); - sa.sa_handler = SIG_DFL; - sigaction(SIGPIPE, &sa, NULL); - - sigemptyset(&child_set); - sigaddset(&child_set, SIGCHLD); - sigprocmask(SIG_UNBLOCK, &child_set, 0); - -#else /* !HAVE_SIGACTION */ - signal(SIGPIPE, SIG_DFL); -#endif /* !HAVE_SIGACTION */ - } - - block_sigchld_handler--; -} -int +static int kill_job (saver_info *si, pid_t pid, int signal) { saver_preferences *p = &si->prefs; @@ -449,12 +324,6 @@ kill_job (saver_info *si, pid_t pid, int signal) clean_job_list(); - if (in_signal_handler_p) - /* This function should not be called from the signal handler. */ - abort(); - - block_sigchld(); /* we control the horizontal... */ - job = find_job (pid); if (!job || !job->pid || @@ -472,7 +341,6 @@ kill_job (saver_info *si, pid_t pid, int signal) job->killed = time ((time_t *) 0); break; #ifdef SIGSTOP - /* #### there must be a way to do this on VMS... */ case SIGSTOP: job->status = job_stopped; break; case SIGCONT: job->status = job_running; break; #endif /* SIGSTOP */ @@ -493,7 +361,7 @@ kill_job (saver_info *si, pid_t pid, int signal) { if (errno == ESRCH) fprintf (stderr, - "%s: %d: child process %lu (%s) was already dead.\n", + "%s: %d: child process %lu (%s) was already dead\n", blurb(), job->screen, (unsigned long) job->pid, job->name); else { @@ -507,53 +375,148 @@ kill_job (saver_info *si, pid_t pid, int signal) await_dying_children (si); DONE: - unblock_sigchld(); - if (block_sigchld_handler < 0) - abort(); - clean_job_list(); return status; } -#ifdef SIGCHLD -static RETSIGTYPE -sigchld_handler (int sig) +/* We use Xt-style signal handling. A Unix signal fires, and we inform Xt of + that. Then after we return to the top-level command loop on the main + stack, Xt runs our callback function for that signal. Just like Xt timers. + */ +static void +catch_signal (int sig, RETSIGTYPE (*handler) (int)) { - saver_info *si = global_si_kludge; /* I hate C so much... */ - in_signal_handler_p++; - - if (si->prefs.debug_p) +# ifdef HAVE_SIGACTION + struct sigaction a; + a.sa_handler = handler; + sigemptyset (&a.sa_mask); + a.sa_flags = 0; + if (sigaction (sig, &a, 0) < 0) +# else /* !HAVE_SIGACTION */ + if (((long) signal (sig, handler)) == -1L) +# endif /* !HAVE_SIGACTION */ { - /* Don't call fprintf() from signal handlers, as it might malloc. - fprintf(stderr, "%s: got SIGCHLD%s\n", blurb(), - (block_sigchld_handler ? " (blocked)" : "")); - */ - write_string (STDERR_FILENO, blurb()); - write_string (STDERR_FILENO, ": got SIGCHLD"); - - if (block_sigchld_handler) - write_string (STDERR_FILENO, " (blocked)\n"); - else - write_string (STDERR_FILENO, "\n"); + char buf [255]; + sprintf (buf, "%s: couldn't catch signal %s", blurb(), + signal_name (sig)); + perror (buf); + abort(); } +} + + +/* Exiting gracefully. + + When xscreensaver sends a SIGTERM signal to xscreensaver-gfx, rather + than exiting immediately, we want it to do two things: + + - Send a SIGTERM to each running screenhack. They would *probably* + die of a BadWindow X error once their window was deleted, but this + is cleaner and more immediate. - if (block_sigchld_handler < 0) - abort(); - else if (block_sigchld_handler == 0) + - Fade the screens in from black. This might take several seconds. + + Should another signal come in while that is ongoing, we should just + die immediately. + */ + +static RETSIGTYPE +saver_sigterm_handler (int sig) +{ + /* This is the actual signal handler, running on the signal stack. + After firing once, set this signal back to the default behavior. */ + sigterm_received = sig; + catch_signal (sig, SIG_DFL); + + /* The first time a signal fires, inform Xt of that so that it will run + xt_signal_handler(). "XtNoticeSignal is the only Intrinsics function + that can safely be called from a signal handler". */ + if (xt_sigterm_id) + XtNoticeSignal (xt_sigterm_id); +} + + +static void +xt_sigterm_handler (XtPointer data, XtSignalId *id) +{ + /* This runs from the Xt event loop on the main stack, some time after + the signal fired. */ + saver_info *si = (saver_info *) data; + saver_preferences *p = &si->prefs; + static Bool hit_p = False; + int i; + + if (xt_sigterm_id) + XtRemoveSignal (xt_sigterm_id); + xt_sigterm_id = 0; + + if (hit_p) + fprintf (stderr, "%s: second signal: %s: exiting\n", blurb(), + signal_name (sigterm_received)); + else { - block_sigchld(); - await_dying_children (si); - unblock_sigchld(); + hit_p = True; + if (p->verbose_p) + fprintf (stderr, "%s: %s: unblanking\n", blurb(), + signal_name (sigterm_received)); + + /* Kill before unblanking, to stop drawing as soon as possible. */ + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (ssi->cycle_id) + { + XtRemoveTimeOut (ssi->cycle_id); + ssi->cycle_id = 0; + ssi->cycle_at = 0; + } + kill_screenhack (ssi); + } + unblank_screen (si); + + if (p->verbose_p) + fprintf (stderr, "%s: %s: exiting\n", blurb(), + signal_name (sigterm_received)); } - init_sigchld(); - in_signal_handler_p--; + /* Exit with the original signal received. */ + kill (getpid(), sigterm_received); + abort(); } -#endif /* SIGCHLD */ -#ifndef VMS +/* SIGCHLD handling. Basically the same deal as SIGTERM. + */ + +static RETSIGTYPE +sigchld_handler (int sig) +{ + /* This is the actual signal handler, running on the signal stack. + After firing once, set this signal to fire again. */ + sigchld_received = sig; +# ifndef HAVE_SIGACTION + catch_signal (SIGCHLD, sigchld_handler); +# endif + + if (xt_sigchld_id) + XtNoticeSignal (xt_sigchld_id); +} + + +static void +xt_sigchld_handler (XtPointer data, XtSignalId *id) +{ + /* This runs from the Xt event loop on the main stack, some time after + the signal fired. */ + saver_info *si = (saver_info *) data; + + if (si->prefs.debug_p) + fprintf(stderr, "%s: got SIGCHLD\n", blurb()); + + await_dying_children (si); /* Their first album was better */ +} + static void await_dying_children (saver_info *si) @@ -570,29 +533,11 @@ await_dying_children (saver_info *si) if (si->prefs.debug_p) { if (kid < 0 && errno) - { - /* Don't call fprintf() from signal handlers, as it might malloc. - fprintf (stderr, "%s: waitpid(-1) ==> %ld (%d)\n", blurb(), - (long) kid, errno); - */ - write_string (STDERR_FILENO, blurb()); - write_string (STDERR_FILENO, ": waitpid(-1) ==> "); - write_long (STDERR_FILENO, (long) kid); - write_string (STDERR_FILENO, " ("); - write_long (STDERR_FILENO, (long) errno); - write_string (STDERR_FILENO, ")\n"); - } + fprintf (stderr, "%s: waitpid(-1) ==> %ld (%d)\n", blurb(), + (long) kid, errno); else - { - /* Don't call fprintf() from signal handlers, as it might malloc. - fprintf (stderr, "%s: waitpid(-1) ==> %ld\n", blurb(), - (long) kid); - */ - write_string (STDERR_FILENO, blurb()); - write_string (STDERR_FILENO, ": waitpid(-1) ==> "); - write_long (STDERR_FILENO, (long) kid); - write_string (STDERR_FILENO, "\n"); - } + fprintf (stderr, "%s: waitpid(-1) ==> %ld\n", blurb(), + (long) kid); } /* 0 means no more children to reap. @@ -616,277 +561,179 @@ describe_dead_child (saver_info *si, pid_t kid, int wait_status, struct screenhack_job *job = find_job (kid); const char *name = job ? job->name : ""; int screen_no = job ? job->screen : 0; + char msg[1024]; + *msg = 0; if (WIFEXITED (wait_status)) { int exit_status = WEXITSTATUS (wait_status); - /* Treat exit code as a signed 8-bit quantity. */ if (exit_status & 0x80) exit_status |= ~0xFF; - /* One might assume that exiting with non-0 means something went wrong. - But that loser xswarm exits with the code that it was killed with, so - it *always* exits abnormally. Treat abnormal exits as "normal" (don't - mention them) if we've just killed the subprocess. But mention them - if they happen on their own. - */ - if (!job || - (exit_status != 0 && - (p->verbose_p || job->status != job_killed))) - { - /* Don't call fprintf() from signal handlers, as it might malloc. - fprintf (stderr, - "%s: %d: child pid %lu (%s) exited abnormally (code %d).\n", - blurb(), screen_no, (unsigned long) kid, name, exit_status); - */ - write_string (STDERR_FILENO, blurb()); - write_string (STDERR_FILENO, ": "); - write_long (STDERR_FILENO, (long) screen_no); - write_string (STDERR_FILENO, ": child pid "); - write_long (STDERR_FILENO, (long) kid); - write_string (STDERR_FILENO, " ("); - write_string (STDERR_FILENO, name); - write_string (STDERR_FILENO, ") exited abnormally (code "); - write_long (STDERR_FILENO, (long) exit_status); - write_string (STDERR_FILENO, ").\n"); - } - else if (p->verbose_p) - { - /* Don't call fprintf() from signal handlers, as it might malloc. - fprintf (stderr, "%s: %d: child pid %lu (%s) exited normally.\n", - blurb(), screen_no, (unsigned long) kid, name); - */ - write_string (STDERR_FILENO, blurb()); - write_string (STDERR_FILENO, ": "); - write_long (STDERR_FILENO, (long) screen_no); - write_string (STDERR_FILENO, ": child pid "); - write_long (STDERR_FILENO, (long) kid); - write_string (STDERR_FILENO, " ("); - write_string (STDERR_FILENO, name); - write_string (STDERR_FILENO, ") exited normally.\n"); - } - + sprintf (msg, _("crashed with status %d"), exit_status); + if (p->verbose_p) + fprintf (stderr, + "%s: %d: child pid %lu (%s) exited abnormally" + " with status %d\n", + blurb(), screen_no, (unsigned long) kid, name, exit_status); if (job) job->status = job_dead; } else if (WIFSIGNALED (wait_status)) { - if (p->verbose_p || - !job || - job->status != job_killed || - WTERMSIG (wait_status) != SIGTERM) + const char *sig = signal_name (WTERMSIG (wait_status)); + if (job && + job->status == job_killed && + WTERMSIG (wait_status) == SIGTERM) { - /* Don't call fprintf() from signal handlers, as it might malloc. - fprintf (stderr, "%s: %d: child pid %lu (%s) terminated with %s.\n", - blurb(), screen_no, (unsigned long) kid, name, - signal_name (WTERMSIG(wait_status))); - */ -# ifdef LOG_CPU_TIME - long u_ms = rus.ru_utime.tv_usec / 1000 + rus.ru_utime.tv_sec * 1000; - long s_ms = rus.ru_stime.tv_usec / 1000 + rus.ru_stime.tv_sec * 1000; -# endif /* LOG_CPU_TIME */ - write_string (STDERR_FILENO, blurb()); - write_string (STDERR_FILENO, ": "); - write_long (STDERR_FILENO, (long) screen_no); - write_string (STDERR_FILENO, ": child pid "); - write_long (STDERR_FILENO, (long) kid); - write_string (STDERR_FILENO, " ("); - write_string (STDERR_FILENO, name); - write_string (STDERR_FILENO, ") terminated with signal "); - write_long (STDERR_FILENO, WTERMSIG(wait_status)); - write_string (STDERR_FILENO, ".\n"); -# ifdef LOG_CPU_TIME - write_string (STDERR_FILENO, blurb()); - write_string (STDERR_FILENO, ": "); - write_long (STDERR_FILENO, (long) screen_no); - write_string (STDERR_FILENO, ": CPU used: "); - write_long (STDERR_FILENO, (u_ms / 1000)); /* msec -> sec */ - write_string (STDERR_FILENO, "."); - write_long (STDERR_FILENO, (u_ms % 1000) / 100); - write_string (STDERR_FILENO, "u, "); - write_long (STDERR_FILENO, (s_ms / 1000)); /* msec -> sec */ - write_string (STDERR_FILENO, "."); - write_long (STDERR_FILENO, (s_ms % 1000) / 100); - write_string (STDERR_FILENO, "s.\n"); -# endif /* LOG_CPU_TIME */ + /* Expected notification after we killed it. */ + sprintf (msg, _("exited normally with %.100s"), sig); + if (p->verbose_p) + fprintf (stderr, "%s: %d: child pid %lu (%s)" + " exited normally with %s\n", + blurb(), screen_no, (unsigned long) kid, name, sig); + } + else + { + /* Unexpected signal. */ + sprintf (msg, _("crashed with %.100s"), sig); + if (p->verbose_p) + fprintf (stderr, "%s: %d: child pid %lu (%s)" + " unexpectedly terminated with %s\n", + blurb(), screen_no, (unsigned long) kid, name, sig); } - if (job) job->status = job_dead; } else if (WIFSTOPPED (wait_status)) { if (p->verbose_p) - { - /* Don't call fprintf() from signal handlers, as it might malloc. - fprintf (stderr, "%s: child pid %lu (%s) stopped with %s.\n", - blurb(), (unsigned long) kid, name, - signal_name (WSTOPSIG (wait_status))); - */ - write_string (STDERR_FILENO, blurb()); - write_string (STDERR_FILENO, ": "); - write_long (STDERR_FILENO, (long) screen_no); - write_string (STDERR_FILENO, ": child pid "); - write_long (STDERR_FILENO, (long) kid); - write_string (STDERR_FILENO, " ("); - write_string (STDERR_FILENO, name); - write_string (STDERR_FILENO, ") stopped with signal "); - write_long (STDERR_FILENO, WSTOPSIG(wait_status)); - write_string (STDERR_FILENO, ".\n"); - } - + fprintf (stderr, "%s: child pid %lu (%s) stopped with %s\n", + blurb(), (unsigned long) kid, name, + signal_name (WSTOPSIG (wait_status))); if (job) job->status = job_stopped; } else { - /* Don't call fprintf() from signal handlers, as it might malloc. + /* Didn't exit, signal or stop; is this even possible? */ + sprintf (msg, _("crashed mysteriously")); fprintf (stderr, "%s: child pid %lu (%s) died in a mysterious way!", blurb(), (unsigned long) kid, name); - */ - write_string (STDERR_FILENO, blurb()); - write_string (STDERR_FILENO, ": "); - write_long (STDERR_FILENO, (long) screen_no); - write_string (STDERR_FILENO, ": child pid "); - write_long (STDERR_FILENO, (long) kid); - write_string (STDERR_FILENO, " ("); - write_string (STDERR_FILENO, name); - write_string (STDERR_FILENO, ") died in a mysterious way!"); if (job) job->status = job_dead; } - /* Clear out the pid so that screenhack_running_p() knows it's dead. +# ifdef LOG_CPU_TIME + if (p->verbose_p && job && job->status == job_dead) + { + long u = rus.ru_utime.tv_usec / 1000 + rus.ru_utime.tv_sec * 1000; + long s = rus.ru_stime.tv_usec / 1000 + rus.ru_stime.tv_sec * 1000; + fprintf (stderr, "%s: %d: CPU used: %.1fu, %.1fs\n", + blurb(), screen_no, u / 1000.0, s / 1000.0); + } +# endif /* LOG_CPU_TIME */ + + /* Clear out the pid so that any_screenhacks_running_p() knows it's dead. */ if (!job || job->status == job_dead) { - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - if (kid == ssi->pid) - ssi->pid = 0; - } -# ifdef HAVE_LIBSYSTEMD - if (kid == si->systemd_pid) - si->systemd_pid = 0; -# endif + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (kid == ssi->pid) + { + ssi->pid = 0; + if (*msg) + screenhack_obituary (ssi, name, msg); + } + } } } -#else /* VMS */ -static void await_dying_children (saver_info *si) { return; } -#endif /* VMS */ - void -init_sigchld (void) +init_sigchld (saver_info *si) { -#ifdef SIGCHLD - -# ifdef HAVE_SIGACTION /* Thanks to Tom Kelly */ + static Bool signals_initialized_p = 0; + if (signals_initialized_p) return; + signals_initialized_p = True; - static Bool sigchld_initialized_p = 0; - if (!sigchld_initialized_p) - { - struct sigaction action, old; - - action.sa_handler = sigchld_handler; - sigemptyset(&action.sa_mask); - action.sa_flags = 0; - - if (sigaction(SIGCHLD, &action, &old) < 0) - { - char buf [255]; - sprintf (buf, "%s: couldn't catch SIGCHLD", blurb()); - perror (buf); - } - sigchld_initialized_p = True; - } + catch_signal (SIGTERM, saver_sigterm_handler); /* kill */ + catch_signal (SIGINT, saver_sigterm_handler); /* shell ^C */ + catch_signal (SIGQUIT, saver_sigterm_handler); /* shell ^| */ + catch_signal (SIGCHLD, sigchld_handler); -# else /* !HAVE_SIGACTION */ - - if (((long) signal (SIGCHLD, sigchld_handler)) == -1L) - { - char buf [255]; - sprintf (buf, "%s: couldn't catch SIGCHLD", blurb()); - perror (buf); - } -# endif /* !HAVE_SIGACTION */ -#endif /* SIGCHLD */ + xt_sigchld_id = XtAppAddSignal (si->app, xt_sigchld_handler, si); + xt_sigterm_id = XtAppAddSignal (si->app, xt_sigterm_handler, si); } +static void +hack_subproc_environment (Screen *screen, Window saver_window) +{ + /* Store $DISPLAY into the environment, so that the $DISPLAY variable that + the spawned processes inherit is correct. First, it must be on the same + host and display as the value of -display passed in on our command line + (which is not necessarily the same as what our $DISPLAY variable is.) + Second, the screen number in the $DISPLAY passed to the subprocess should + be the screen on which this particular hack is running -- not the display + specification which the driver itself is using, since the driver ignores + its screen number and manages all existing screens. - + Likewise, store a window ID in $XSCREENSAVER_WINDOW -- this is necessary + in a Xinerama or RANDR world where a single X11 'Screen' spans multiple + monitors, and we want to run a hack on each piece of glass, not spanning + them. In that case, multiple hacks have the same $DISPLAY, screen and + root window. + */ + Display *dpy = DisplayOfScreen (screen); + const char *odpy = DisplayString (dpy); + char *ndpy = (char *) malloc (strlen(odpy) + 20); + char *nssw = (char *) malloc (40); + char *s, *c; -static Bool -select_visual_of_hack (saver_screen_info *ssi, screenhack *hack) -{ - saver_info *si = ssi->global; - saver_preferences *p = &si->prefs; - Bool selected; + strcpy (ndpy, "DISPLAY="); + s = ndpy + strlen(ndpy); + strcpy (s, odpy); - if (hack->visual && *hack->visual) - selected = select_visual(ssi, hack->visual); - else - selected = select_visual(ssi, 0); + /* We have to find the last colon since it is the boundary between + hostname & screen - IPv6 numeric format addresses may have many + colons before that point, and DECnet addresses always have two colons */ + c = strrchr(s,':'); /* skip to last colon */ + if (c != NULL) s = c+1; + while (isdigit(*s)) s++; /* skip over dpy number */ + while (*s == '.') s++; /* skip over dot */ + if (s[-1] != '.') *s++ = '.'; /* put on a dot */ + sprintf(s, "%d", screen_number (screen)); /* put on screen number */ - if (!selected && (p->verbose_p || si->demoing_p)) - fprintf (stderr, - (si->demoing_p - ? "%s: warning, no \"%s\" visual for \"%s\".\n" - : "%s: no \"%s\" visual; skipping \"%s\".\n"), - blurb(), - (hack->visual && *hack->visual ? hack->visual : "???"), - hack->command); + sprintf (nssw, "XSCREENSAVER_WINDOW=0x%lX", (unsigned long) saver_window); - return selected; + if (putenv (ndpy)) + abort (); + if (putenv (nssw)) + abort (); + + /* don't free ndpy/nssw -- some implementations of putenv (BSD 4.4, + glibc 2.0) copy the argument, but some (libc4,5, glibc 2.1.2) + do not. So we must leak it (and/or the previous setting). Yay. + */ } +#ifdef ABORT_TESTER /* Shoot down processes after a bit, for debugging */ static void -print_path_error (const char *program) +abort_debug_timer (XtPointer closure, XtIntervalId *id) { - char buf [512]; - char *cmd = strdup (program); - char *token = strchr (cmd, ' '); - - if (token) *token = 0; - sprintf (buf, "%s: could not execute \"%.100s\"", blurb(), cmd); - free (cmd); - perror (buf); - - if (errno == ENOENT && - (token = getenv("PATH"))) + saver_screen_info *ssi = (saver_screen_info *) closure; + if (ssi->pid) { -# ifndef PATH_MAX -# ifdef MAXPATHLEN -# define PATH_MAX MAXPATHLEN -# else -# define PATH_MAX 2048 -# endif -# endif - char path[PATH_MAX]; - fprintf (stderr, "\n"); - *path = 0; -# if defined(HAVE_GETCWD) - if (! getcwd (path, sizeof(path))) - *path = 0; -# elif defined(HAVE_GETWD) - getwd (path); -# endif - if (*path) - fprintf (stderr, " Current directory is: %s\n", path); - fprintf (stderr, " PATH is:\n"); - token = strtok (strdup(token), ":"); - while (token) - { - fprintf (stderr, " %s\n", token); - token = strtok(0, ":"); - } - fprintf (stderr, "\n"); + fprintf (stderr, "%s: %d: %ld: born to ill\n", blurb(), ssi->number, + (unsigned long) ssi->pid); + kill (ssi->pid, SIGILL); } } +#endif /* ABORT_TESTER */ /* Executes the command in another process. @@ -896,15 +743,10 @@ print_path_error (const char *program) Otherwise, -1 is returned and an error may have been printed to stderr. */ -pid_t +static pid_t fork_and_exec (saver_screen_info *ssi, const char *command) { - return fork_and_exec_1 (ssi->global, ssi, command); -} - -pid_t -fork_and_exec_1 (saver_info *si, saver_screen_info *ssi, const char *command) -{ + saver_info *si = ssi->global; saver_preferences *p = &si->prefs; pid_t forked; @@ -920,35 +762,60 @@ fork_and_exec_1 (saver_info *si, saver_screen_info *ssi, const char *command) case 0: close (ConnectionNumber (si->dpy)); /* close display fd */ - limit_subproc_memory (p->inferior_memory_limit, p->verbose_p); if (ssi) hack_subproc_environment (ssi->screen, ssi->screensaver_window); - if (p->verbose_p) - fprintf (stderr, "%s: %d: spawning \"%s\" in pid %lu.\n", - blurb(), (ssi ? ssi->number : 0), command, - (unsigned long) getpid ()); - exec_command (p->shell, command, p->nice_inferior); - - /* If that returned, we were unable to exec the subprocess. - Print an error message, if desired. - */ - if (! p->ignore_uninstalled_p) - print_path_error (command); - + /* If that returned, we were unable to exec the subprocess. */ exit (1); /* exits child fork */ break; default: /* parent */ - (void) make_job (forked, (ssi ? ssi->number : 0), command); + make_job (forked, (ssi ? ssi->number : 0), command); + if (p->verbose_p) + fprintf (stderr, "%s: %d: forked \"%s\" in pid %lu" + " on window 0x%lx\n", + blurb(), (ssi ? ssi->number : 0), command, + (unsigned long) forked, + (unsigned long) ssi->screensaver_window); break; } +# ifdef ABORT_TESTER + if (forked) + XtAppAddTimeOut (si->app, 1000 * (5 + (5 * ssi->number)), + abort_debug_timer, (XtPointer) ssi); +# endif + return forked; } +static Bool +select_visual_of_hack (saver_screen_info *ssi, screenhack *hack) +{ + saver_info *si = ssi->global; + saver_preferences *p = &si->prefs; + Bool selected; + + if (hack->visual && *hack->visual) + selected = select_visual(ssi, hack->visual); + else + selected = select_visual(ssi, 0); + + if (!selected && (p->verbose_p || si->demoing_p)) + fprintf (stderr, + (si->demoing_p + ? "%s: warning, no \"%s\" visual for \"%s\"\n" + : "%s: no \"%s\" visual; skipping \"%s\"\n"), + blurb(), + (hack->visual && *hack->visual ? hack->visual : "???"), + hack->command); + + return selected; +} + + void spawn_screenhack (saver_screen_info *ssi) { @@ -956,13 +823,21 @@ spawn_screenhack (saver_screen_info *ssi) saver_preferences *p = &si->prefs; XFlush (si->dpy); - if (!monitor_powered_on_p (si)) + if (!monitor_powered_on_p (si->dpy)) { if (si->prefs.verbose_p) fprintf (stderr, "%s: %d: X says monitor has powered down; " - "not launching a hack.\n", blurb(), ssi->number); - return; + "not launching a hack\n", blurb(), ssi->number); + ssi->current_hack = -1; + + /* Hooray, this doesn't actually clear the window if it was OpenGL. */ + XClearWindow (si->dpy, ssi->screensaver_window); + + /* Even though we aren't launching a hack, do launch the cycle timer, + in case the monitor powers back up at some point without us having + un-blanked. */ + goto DONE; } if (p->screenhacks_count) @@ -1036,9 +911,7 @@ spawn_screenhack (saver_screen_info *ssi) if (new_hack < 0) /* don't run a hack */ { ssi->current_hack = -1; - if (si->selection_mode < 0) - si->selection_mode = 0; - return; + goto DONE; } ssi->current_hack = new_hack; @@ -1066,7 +939,7 @@ spawn_screenhack (saver_screen_info *ssi) */ if (p->verbose_p) fprintf(stderr, - "%s: %d: no programs enabled, or no suitable visuals.\n", + "%s: %d: no programs enabled, or no suitable visuals\n", blurb(), ssi->number); return; } @@ -1074,12 +947,6 @@ spawn_screenhack (saver_screen_info *ssi) goto AGAIN; } - /* Turn off "next" and "prev" modes now, but "demo" mode is only - turned off by explicit action. - */ - if (si->selection_mode < 0) - si->selection_mode = 0; - forked = fork_and_exec (ssi, hack->command); switch ((int) forked) { @@ -1087,17 +954,95 @@ spawn_screenhack (saver_screen_info *ssi) case 0: /* child fork (can't happen) */ sprintf (buf, "%s: couldn't fork", blurb()); perror (buf); - restore_real_vroot (si); - saver_exit (si, 1, "couldn't fork"); + exit (1); break; default: ssi->pid = forked; break; } + + XChangeProperty (si->dpy, ssi->screensaver_window, XA_WM_COMMAND, + XA_STRING, 8, PropModeReplace, + (unsigned char *) hack->command, + strlen (hack->command)); + XChangeProperty (si->dpy, ssi->screensaver_window, XA_NET_WM_PID, + XA_CARDINAL, 32, PropModeReplace, + (unsigned char *) &ssi->pid, 1); } - store_saver_status (si); /* store current hack number */ + DONE: + + if (ssi->current_hack < 0) + XDeleteProperty (si->dpy, ssi->screensaver_window, XA_WM_COMMAND); + + store_saver_status (si); /* store current hack numbers */ + + /* Now that the hack has launched, queue a timer to cycle it. */ + if (!si->demoing_p && p->cycle) + { + time_t now = time ((time_t *) 0); + Time how_long = p->cycle; + + /* If we're in "SELECT n" mode, the cycle timer going off will just + restart this same hack again. There's not much point in doing this + every 5 or 10 minutes, but on the other hand, leaving one hack + running for days is probably not a great idea, since they tend to + leak and/or crash. So, restart the thing once an hour. + */ + if (si->selection_mode > 0 && ssi->pid) + how_long = 1000 * 60 * 60; + + /* If there are multiple screens, stagger the restart time of subsequent + screens: they will all change every N minutes, but not at the same + time. But don't let that offset be more than about 5 minutes. + + I originally did this by just adding an offset to the very first + cycle only, but after a few days, the cycles would synchronize again! + Are Xt timers implemented with Huygens pendulums?? So compare this + screen's target time against the previous screen's, and offset it as + needed. + */ + if (ssi->number > 0 && + p->mode != RANDOM_HACKS_SAME) + { + saver_screen_info *prev = &si->screens[ssi->number-1]; + time_t cycle_at = now + how_long / 1000; + time_t prev_at = prev->cycle_at; + + Time max = 1000 * 60 * 60 * 10; + Time off = (how_long > max ? max : how_long) / si->nscreens; + + if (cycle_at < prev_at + off / 1000) + { + time_t old = cycle_at; + cycle_at = prev_at + off / 1000; + how_long = 1000 * (cycle_at - now); + + if (p->verbose_p && cycle_at - old > 2) + fprintf (stderr, "%s: %d: offsetting cycle time by %ld sec\n", + blurb(), ssi->number, + cycle_at - old); + } + } + + if (p->debug_p) + fprintf (stderr, "%s: %d: starting cycle_timer (%ld)\n", + blurb(), ssi->number, how_long); + + if (ssi->cycle_id) + XtRemoveTimeOut (ssi->cycle_id); + ssi->cycle_id = + XtAppAddTimeOut (si->app, how_long, cycle_timer, (XtPointer) ssi); + ssi->cycle_at = now + how_long / 1000; + + if (p->verbose_p) + { + time_t t = time((time_t *) 0) + how_long/1000; + fprintf (stderr, "%s: %d: next cycle in %lu sec at %s\n", + blurb(), ssi->number, how_long/1000, timestring(t)); + } + } } @@ -1108,42 +1053,14 @@ kill_screenhack (saver_screen_info *ssi) if (ssi->pid) kill_job (si, ssi->pid, SIGTERM); ssi->pid = 0; -} - -void -suspend_screenhack (saver_screen_info *ssi, Bool suspend_p) -{ -#ifdef SIGSTOP /* older VMS doesn't have it... */ - saver_info *si = ssi->global; - if (ssi->pid) - kill_job (si, ssi->pid, (suspend_p ? SIGSTOP : SIGCONT)); -#endif /* SIGSTOP */ + /* Hooray, this doesn't actually clear the window if it was OpenGL. */ + XClearWindow (si->dpy, ssi->screensaver_window); } -/* Called when we're exiting abnormally, to kill off the subproc. */ -void -emergency_kill_subproc (saver_info *si) -{ - int i; -#ifdef SIGCHLD - signal (SIGCHLD, SIG_IGN); -#endif /* SIGCHLD */ - - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - if (ssi->pid) - { - kill_job (si, ssi->pid, SIGTERM); - ssi->pid = 0; - } - } -} - Bool -screenhack_running_p (saver_info *si) +any_screenhacks_running_p (saver_info *si) { Bool any_running_p = False; int i; @@ -1151,104 +1068,21 @@ screenhack_running_p (saver_info *si) { saver_screen_info *ssi = &si->screens[i]; if (ssi->pid) any_running_p = True; + /* Consider it running if an error dialog is posted, so that we + don't prematurely clear the window. */ + if (ssi->error_dialog) any_running_p = True; } return any_running_p; } - -/* Environment variables. */ - -/* Modifies $PATH in the current environment, so that if DEFAULT_PATH_PREFIX - is defined, the xscreensaver daemon will search that directory for hacks. +/* Fork "xscreensaver-gl-visual" and wait for it to print the IDs of + the GL visual that should be used on this screen. */ -void -hack_environment (saver_info *si) -{ -#if defined(HAVE_PUTENV) && defined(DEFAULT_PATH_PREFIX) - static const char *def_path = DEFAULT_PATH_PREFIX; - if (def_path && *def_path) - { - const char *opath = getenv("PATH"); - char *npath; - if (! opath) opath = "/bin:/usr/bin"; /* WTF */ - npath = (char *) malloc(strlen(def_path) + strlen(opath) + 20); - strcpy (npath, "PATH="); - strcat (npath, def_path); - strcat (npath, ":"); - strcat (npath, opath); - - if (putenv (npath)) - abort (); - - /* don't free (npath) -- some implementations of putenv (BSD 4.4, - glibc 2.0) copy the argument, but some (libc4,5, glibc 2.1.2) - do not. So we must leak it (and/or the previous setting). Yay. - */ - } -#endif /* HAVE_PUTENV && DEFAULT_PATH_PREFIX */ -} - - -void -hack_subproc_environment (Screen *screen, Window saver_window) -{ - /* Store $DISPLAY into the environment, so that the $DISPLAY variable that - the spawned processes inherit is correct. First, it must be on the same - host and display as the value of -display passed in on our command line - (which is not necessarily the same as what our $DISPLAY variable is.) - Second, the screen number in the $DISPLAY passed to the subprocess should - be the screen on which this particular hack is running -- not the display - specification which the driver itself is using, since the driver ignores - its screen number and manages all existing screens. - - Likewise, store a window ID in $XSCREENSAVER_WINDOW -- this will allow - us to (eventually) run multiple hacks in Xinerama mode, where each hack - has the same $DISPLAY but a different piece of glass. - */ - Display *dpy = DisplayOfScreen (screen); - const char *odpy = DisplayString (dpy); - char *ndpy = (char *) malloc (strlen(odpy) + 20); - char *nssw = (char *) malloc (40); - char *s, *c; - - strcpy (ndpy, "DISPLAY="); - s = ndpy + strlen(ndpy); - strcpy (s, odpy); - - /* We have to find the last colon since it is the boundary between - hostname & screen - IPv6 numeric format addresses may have many - colons before that point, and DECnet addresses always have two colons */ - c = strrchr(s,':'); /* skip to last colon */ - if (c != NULL) s = c+1; - while (isdigit(*s)) s++; /* skip over dpy number */ - while (*s == '.') s++; /* skip over dot */ - if (s[-1] != '.') *s++ = '.'; /* put on a dot */ - sprintf(s, "%d", screen_number (screen)); /* put on screen number */ - - sprintf (nssw, "XSCREENSAVER_WINDOW=0x%lX", (unsigned long) saver_window); - - /* Allegedly, BSD 4.3 didn't have putenv(), but nobody runs such systems - any more, right? It's not Posix, but everyone seems to have it. */ -#ifdef HAVE_PUTENV - if (putenv (ndpy)) - abort (); - if (putenv (nssw)) - abort (); - - /* don't free ndpy/nssw -- some implementations of putenv (BSD 4.4, - glibc 2.0) copy the argument, but some (libc4,5, glibc 2.1.2) - do not. So we must leak it (and/or the previous setting). Yay. - */ -#endif /* HAVE_PUTENV */ -} - - -/* GL crap */ - Visual * get_best_gl_visual (saver_info *si, Screen *screen) { + saver_preferences *p = &si->prefs; pid_t forked; int fds [2]; int in, out; @@ -1259,7 +1093,7 @@ get_best_gl_visual (saver_info *si, Screen *screen) char *av[10]; int ac = 0; - av[ac++] = "xscreensaver-gl-helper"; + av[ac++] = "xscreensaver-gl-visual"; av[ac] = 0; if (pipe (fds)) @@ -1283,18 +1117,13 @@ get_best_gl_visual (saver_info *si, Screen *screen) errout = errfds [1]; } - block_sigchld(); /* This blocks it in the parent and child, to avoid - racing. It is never unblocked in the child before - the child exits, but that doesn't matter. - */ - switch ((int) (forked = fork ())) { case -1: { sprintf (buf, "%s: couldn't fork", blurb()); perror (buf); - saver_exit (si, 1, 0); + exit (1); } case 0: { @@ -1336,11 +1165,17 @@ get_best_gl_visual (saver_info *si, Screen *screen) int result = 0; int wait_status = 0; pid_t pid = -1; - - FILE *f = fdopen (in, "r"); + FILE *f; unsigned long v = 0; char c; + make_job (forked, 0, av[0]); /* Bookkeeping for SIGCHLD */ + + if (p->verbose_p) + fprintf (stderr, "%s: %d: forked \"%s\" in pid %lu\n", + blurb(), 0, av[0], (unsigned long) forked); + + f = fdopen (in, "r"); close (out); /* don't need this one */ *buf = 0; @@ -1357,16 +1192,8 @@ get_best_gl_visual (saver_info *si, Screen *screen) /* Wait for the child to die - wait for this pid only, not others. */ pid = waitpid (forked, &wait_status, 0); if (si->prefs.debug_p) - { - write_string (STDERR_FILENO, blurb()); - write_string (STDERR_FILENO, ": waitpid("); - write_long (STDERR_FILENO, (long) forked); - write_string (STDERR_FILENO, ") ==> "); - write_long (STDERR_FILENO, (long) pid); - write_string (STDERR_FILENO, "\n"); - } - - unblock_sigchld(); /* child is dead and waited, unblock now. */ + fprintf (stderr, "%s: waitpid(%ld) => %ld\n", blurb(), + (long) forked, (long) pid); if (1 == sscanf (buf, "0x%lx %c", &v, &c)) result = (int) v; @@ -1391,7 +1218,7 @@ get_best_gl_visual (saver_info *si, Screen *screen) { Visual *v = id_to_visual (screen, result); if (si->prefs.verbose_p) - fprintf (stderr, "%s: %d: %s: GL visual is 0x%X%s.\n", + fprintf (stderr, "%s: %d: %s: GL visual is 0x%X%s\n", blurb(), screen_number (screen), av[0], result, (v == DefaultVisualOfScreen (screen) @@ -1403,71 +1230,3 @@ get_best_gl_visual (saver_info *si, Screen *screen) abort(); } - - - -/* Restarting the xscreensaver process from scratch. */ - -static char **saved_argv; - -void -save_argv (int argc, char **argv) -{ - saved_argv = (char **) calloc (argc+2, sizeof (char *)); - saved_argv [argc] = 0; - while (argc--) - { - int i = strlen (argv [argc]) + 1; - saved_argv [argc] = (char *) malloc (i); - memcpy (saved_argv [argc], argv [argc], i); - } -} - - -/* Re-execs the process with the arguments in saved_argv. Does not return. - */ -void -restart_process (saver_info *si) -{ - if (si->screen_blanked_p) - { - unblank_screen (si); - XSync (si->dpy, False); - } - - emergency_kill_subproc (si); - -# ifdef HAVE_LIBSYSTEMD - if (si->systemd_pid) /* Kill background xscreensaver-systemd process */ - { - /* We're exiting, so there's no need to do a full kill_job() here, - which would waitpid(). */ - /* kill_job (si, si->systemd_pid, SIGTERM); */ - kill (si->systemd_pid, SIGTERM); - si->systemd_pid = 0; - } -# endif - - if (si->prefs.verbose_p) - { - int i; - fprintf (stderr, "%s: re-executing", blurb()); - for (i = 0; saved_argv[i]; i++) - fprintf (stderr, " %s", saved_argv[i]); - fprintf (stderr, "\n"); - - describe_uids (si, stderr); - fprintf (stderr, "\n"); - } - - shutdown_stderr (si); - - execvp (saved_argv [0], saved_argv); /* shouldn't return */ - { - char buf [512]; - sprintf (buf, "%s: could not restart process", blurb()); - perror(buf); - fflush(stderr); - abort(); - } -} diff --git a/driver/test-apm.c b/driver/test-apm.c deleted file mode 100644 index 6b87c7e7..00000000 --- a/driver/test-apm.c +++ /dev/null @@ -1,101 +0,0 @@ -/* test-apm.c --- playing with the APM library. - * xscreensaver, Copyright (c) 1999 Jamie Zawinski - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#ifdef HAVE_UNISTD_H -# include -#endif - -#include -#include -#include - -#include -#include - -#include - -#define countof(x) (sizeof((x))/sizeof(*(x))) - - -char *progname = 0; -char *progclass = "XScreenSaver"; - -static const char * -blurb (void) -{ - static char buf[255]; - time_t now = time ((time_t *) 0); - char *ct = (char *) ctime (&now); - int n = strlen(progname); - if (n > 100) n = 99; - strncpy(buf, progname, n); - buf[n++] = ':'; - buf[n++] = ' '; - strncpy(buf+n, ct+11, 8); - strcpy(buf+n+9, ": "); - return buf; -} - -static void -apm_cb (XtPointer closure, int *fd, XtInputId *id) -{ - apm_event_t events[100]; - int n, i; - while ((n = apm_get_events (*fd, 0, events, countof(events))) - > 0) - for (i = 0; i < n; i++) - { - fprintf (stderr, "%s: APM event 0x%x: %s.\n", blurb(), - events[i], apm_event_name (events[i])); -#if 0 - switch (events[i]) - { - case APM_SYS_STANDBY: - case APM_USER_STANDBY: - case APM_SYS_SUSPEND: - case APM_USER_SUSPEND: - case APM_CRITICAL_SUSPEND: - break; - } -#endif - } -} - -int -main (int argc, char **argv) -{ - XtAppContext app; - Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0, - &argc, argv, 0, 0, 0); - Display *dpy = XtDisplay (toplevel_shell); - int fd; - XtInputId id; - XtGetApplicationNameAndClass (dpy, &progname, &progclass); - - fd = apm_open (); - if (fd <= 0) - { - fprintf (stderr, "%s: couldn't initialize APM.\n", blurb()); - exit (1); - } - - id = XtAppAddInput(app, fd, - (XtPointer) (XtInputReadMask | XtInputWriteMask), - apm_cb, 0); - XtAppMainLoop (app); - exit (0); -} diff --git a/driver/test-fade.c b/driver/test-fade.c index 9db773d0..31852ef8 100644 --- a/driver/test-fade.c +++ b/driver/test-fade.c @@ -1,5 +1,5 @@ /* test-fade.c --- playing with colormap and/or gamma fading. - * xscreensaver, Copyright (c) 2001, 2004 Jamie Zawinski + * xscreensaver, Copyright © 2001-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -21,30 +21,35 @@ #include +#include #include + #include "xscreensaver.h" +#include "resources.h" +#include "screens.h" #include "fade.h" +#include "atoms.h" -#ifdef HAVE_SGI_VC_EXTENSION -# include -#endif #ifdef HAVE_XF86VMODE_GAMMA # include #endif +#ifdef HAVE_RANDR +# include +#endif XrmDatabase db = 0; -char *progname = 0; char *progclass = "XScreenSaver"; +Bool debug_p = True; -#define SGI_VC_NAME "SGI-VIDEO-CONTROL" #define XF86_VIDMODE_NAME "XFree86-VidModeExtension" +#define RANDR_NAME "RANDR" int main (int argc, char **argv) { - int seconds = 3; - int ticks = 20; - int delay = 1; + double seconds = 3; + double ratio = 1/3.0; + int delay = 2; int op, event, error, major, minor; @@ -52,70 +57,151 @@ main (int argc, char **argv) Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0, &argc, argv, 0, 0, 0); Display *dpy = XtDisplay (toplevel_shell); - Colormap *current_maps; - int i; - - XtGetApplicationNameAndClass (dpy, &progname, &progclass); + Screen *screen = ScreenOfDisplay (dpy, 0); + int nwindows, i; + Window windows[100]; + + int x, y; + unsigned int bw, d; + Window root = RootWindow (dpy, 0); + Visual *visual = DefaultVisual (dpy, 0); + Pixmap logo, logo_clipmask; + int logo_npixels; + unsigned long *logo_pixels; + unsigned int logo_width, logo_height; + XSetWindowAttributes attrs; + unsigned long attrmask = 0; + void *state = 0; + + verbose_p += 2; + + progname = argv[0]; + progclass = "XScreenSaver"; db = XtDatabase (dpy); - current_maps = (Colormap *) calloc(sizeof(Colormap), ScreenCount(dpy)); - for (i = 0; i < ScreenCount(dpy); i++) - current_maps[i] = DefaultColormap (dpy, i); + init_xscreensaver_atoms (dpy); + + { + const char * version_number = "test-fade"; + Window daemon_window = + XCreateWindow (dpy, RootWindow (dpy, 0), + 0, 0, 1, 1, 0, + DefaultDepth (dpy, 0), InputOutput, + DefaultVisual (dpy, 0), attrmask, &attrs); + XChangeProperty (dpy, daemon_window, XA_SCREENSAVER_VERSION, XA_STRING, + 8, PropModeReplace, (unsigned char *) version_number, + strlen (version_number)); + } - if (!XQueryExtension (dpy, SGI_VC_NAME, &op, &event, &error)) - fprintf(stderr, "%s: no " SGI_VC_NAME " extension\n", progname); - else - { -# ifdef HAVE_SGI_VC_EXTENSION - if (!XSGIvcQueryVersion (dpy, &major, &minor)) - fprintf(stderr, "%s: unable to get " SGI_VC_NAME " version\n", - progname); - else - fprintf(stderr, "%s: " SGI_VC_NAME " version %d.%d\n", - progname, major, minor); -# else /* !HAVE_SGI_VC_EXTENSION */ - fprintf(stderr, "%s: no support for display's " SGI_VC_NAME - " extension\n", progname); -# endif /* !HAVE_SGI_VC_EXTENSION */ - } if (!XQueryExtension (dpy, XF86_VIDMODE_NAME, &op, &event, &error)) - fprintf(stderr, "%s: no " XF86_VIDMODE_NAME " extension\n", progname); + fprintf(stderr, "%s: no " XF86_VIDMODE_NAME " extension\n", blurb()); else { # ifdef HAVE_XF86VMODE_GAMMA if (!XF86VidModeQueryVersion (dpy, &major, &minor)) fprintf(stderr, "%s: unable to get " XF86_VIDMODE_NAME " version\n", - progname); + blurb()); else fprintf(stderr, "%s: " XF86_VIDMODE_NAME " version %d.%d\n", - progname, major, minor); + blurb(), major, minor); # else /* !HAVE_XF86VMODE_GAMMA */ fprintf(stderr, "%s: no support for display's " XF86_VIDMODE_NAME - " extension\n", progname); + " extension\n", blurb()); # endif /* !HAVE_XF86VMODE_GAMMA */ } + if (!XQueryExtension (dpy, RANDR_NAME, &op, &event, &error)) + fprintf(stderr, "%s: no " RANDR_NAME " extension\n", blurb()); + else + { +# ifdef HAVE_RANDR + if (!XRRQueryVersion (dpy, &major, &minor)) + fprintf(stderr, "%s: unable to get " RANDR_NAME " version\n", + blurb()); + else + fprintf(stderr, "%s: " RANDR_NAME " version %d.%d\n", + blurb(), major, minor); +# else /* !HAVE_RANDR */ + fprintf(stderr, "%s: no support for display's " RANDR_NAME + " extension\n", blurb()); +# endif /* !HAVE_RANDR */ + } + + logo = xscreensaver_logo (screen, visual, root, DefaultColormap (dpy, 0), + WhitePixel (dpy, 0), + &logo_pixels, &logo_npixels, + &logo_clipmask, True); + XGetGeometry (dpy, logo, &root, &x, &y, &logo_width, &logo_height, &bw, &d); + + nwindows = 0; + { + int x, y; + for (y = 0; y < 2; y++) + for (x = 0; x < 2; x++) + { + int win_width = 250; + int win_height = 200; + + attrmask = CWOverrideRedirect; + attrs.override_redirect = True; + windows[nwindows] = + XCreateWindow (dpy, root, + 200 + x * win_width * 1.5, + 200 + y * win_height * 1.5, + win_width, win_height, 0, DefaultDepth (dpy, 0), + InputOutput, visual, + attrmask, &attrs); + XSetWindowBackground (dpy, windows[nwindows], BlackPixel (dpy, 0)); + XClearWindow (dpy, windows[nwindows]); + nwindows++; + } + } + fprintf (stderr, "%s: fading %d screen%s\n", - progname, ScreenCount(dpy), ScreenCount(dpy) == 1 ? "" : "s"); + blurb(), ScreenCount(dpy), ScreenCount(dpy) == 1 ? "" : "s"); while (1) { XSync (dpy, False); - fprintf(stderr, "%s: out...", progname); + fprintf(stderr, "%s: fading out\n\n", blurb()); fflush(stderr); - fade_screens (dpy, current_maps, 0, 0, seconds, ticks, True, False); - fprintf(stderr, "done.\n"); + fade_screens (app, dpy, windows, nwindows, seconds, + True, /* out_p */ + True, /* from_desktop_p */ + &state); + for (i = 0; i < nwindows; i++) + XMapRaised (dpy, windows[i]); + XSync (dpy, False); + fprintf(stderr, "%s: out done\n\n", blurb()); fflush(stderr); + for (i = 0; i < nwindows; i++) + { + XSetWindowBackgroundPixmap (dpy, windows[i], logo); + XClearWindow (dpy, windows[i]); + XSetWindowBackground (dpy, windows[i], BlackPixel (dpy, 0)); + } + XSync (dpy, False); + if (delay) sleep (delay); - fprintf(stderr,"%s: in...", progname); + fprintf(stderr, "%s: fading in\n\n", blurb()); fflush(stderr); - fade_screens (dpy, current_maps, 0, 0, seconds, ticks, False, False); - fprintf(stderr, "done.\n"); + fade_screens (app, dpy, windows, nwindows, + seconds * ratio, + True, /* out_p */ + False, /* from_desktop_p */ + &state); + fade_screens (app, dpy, windows, nwindows, + seconds * ratio, + False, /* out_p */ + False, /* from_desktop_p */ + &state); + XSync (dpy, False); + fprintf(stderr, "%s: in done\n\n", blurb()); fflush(stderr); if (delay) sleep (delay); diff --git a/driver/test-grab.c b/driver/test-grab.c index 03018eb5..65313a14 100644 --- a/driver/test-grab.c +++ b/driver/test-grab.c @@ -1,5 +1,5 @@ /* test-uid.c --- playing with grabs. - * xscreensaver, Copyright (c) 1999, 2004 Jamie Zawinski + * xscreensaver, Copyright © 1999-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -24,8 +24,9 @@ #include #include +#include -char *progname = 0; +#include "blurb.h" char *progclass = "XScreenSaver"; #define ALL_POINTER_EVENTS \ @@ -38,38 +39,89 @@ int main (int argc, char **argv) { XtAppContext app; - int kstatus, mstatus; - Cursor cursor = 0; - int delay = 60 * 15; + int kstatus = AlreadyGrabbed, mstatus = AlreadyGrabbed; + Cursor cursor1, cursor2; + int delay1 = 15; + int delay2 = 60 * 15 - delay1; Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0, &argc, argv, 0, 0, 0); Display *dpy = XtDisplay (toplevel_shell); Window w = RootWindow (dpy, DefaultScreen(dpy)); - XtGetApplicationNameAndClass (dpy, &progname, &progclass); - - kstatus = XGrabKeyboard (dpy, w, True, - GrabModeSync, GrabModeAsync, - CurrentTime); - fprintf (stderr, "%s: grabbing keyboard on 0x%lx... %s.\n", - progname, (unsigned long) w, - (kstatus == GrabSuccess ? "GrabSuccess" : - kstatus == AlreadyGrabbed ? "AlreadyGrabbed" : - kstatus == GrabInvalidTime ? "GrabInvalidTime" : - kstatus == GrabNotViewable ? "GrabNotViewable" : - kstatus == GrabFrozen ? "GrabFrozen" : - "???")); - - mstatus = XGrabPointer (dpy, w, True, ALL_POINTER_EVENTS, - GrabModeAsync, GrabModeAsync, None, - cursor, CurrentTime); - fprintf (stderr, "%s: grabbing mouse on 0x%lx... %s.\n", - progname, (unsigned long) w, - (mstatus == GrabSuccess ? "GrabSuccess" : - mstatus == AlreadyGrabbed ? "AlreadyGrabbed" : - mstatus == GrabInvalidTime ? "GrabInvalidTime" : - mstatus == GrabNotViewable ? "GrabNotViewable" : - mstatus == GrabFrozen ? "GrabFrozen" : - "???")); + int i; + + Bool grab_kbd_p = True; + Bool grab_mouse_p = True; + Bool mouse_sync_p = True; + Bool kbd_sync_p = True; + + progname = argv[0]; + + cursor1 = XCreateFontCursor (dpy, XC_hand1); + cursor2 = XCreateFontCursor (dpy, XC_gumby); + + for (i = 1; i < argc; i++) + { + const char *oa = argv[i]; + if (argv[i][0] == '-' && argv[i][1] == '-') + argv[i]++; + if (!strcmp (argv[i], "-kbd") || !strcmp (argv[i], "-keyboard")) + grab_mouse_p = False; + else if (!strcmp (argv[i], "-mouse") || !strcmp (argv[i], "-pointer")) + grab_kbd_p = False; + else if (!strcmp (argv[i], "-kbd-sync") || + !strcmp (argv[i], "-keyboard-sync")) + kbd_sync_p = True; + else if (!strcmp (argv[i], "-kbd-async") || + !strcmp (argv[i], "-keyboard-async")) + kbd_sync_p = False; + else if (!strcmp (argv[i], "-mouse-sync") || + !strcmp (argv[i], "-pointer-sync")) + mouse_sync_p = True; + else if (!strcmp (argv[i], "-mouse-async") || + !strcmp (argv[i], "-pointer-async")) + mouse_sync_p = False; + else + { + fprintf (stderr, "%s: unknown option: %s\n", blurb(), oa); + exit (1); + } + } + + if (grab_kbd_p) + { + kstatus = XGrabKeyboard (dpy, w, True, + (mouse_sync_p ? GrabModeSync : GrabModeAsync), + (kbd_sync_p ? GrabModeSync : GrabModeAsync), + CurrentTime); + fprintf (stderr, "%s: grabbing keyboard on 0x%lx (%s, %s)... %s\n", + progname, (unsigned long) w, + (mouse_sync_p ? "sync" : "async"), + (kbd_sync_p ? "sync" : "async"), + (kstatus == GrabSuccess ? "GrabSuccess" : + kstatus == AlreadyGrabbed ? "AlreadyGrabbed" : + kstatus == GrabInvalidTime ? "GrabInvalidTime" : + kstatus == GrabNotViewable ? "GrabNotViewable" : + kstatus == GrabFrozen ? "GrabFrozen" : + "???")); + } + + if (grab_mouse_p) + { + mstatus = XGrabPointer (dpy, w, True, ALL_POINTER_EVENTS, + (mouse_sync_p ? GrabModeSync : GrabModeAsync), + (kbd_sync_p ? GrabModeSync : GrabModeAsync), + None, cursor1, CurrentTime); + fprintf (stderr, "%s: grabbing mouse on 0x%lx (%s, %s)... %s\n", + progname, (unsigned long) w, + (mouse_sync_p ? "sync" : "async"), + (kbd_sync_p ? "sync" : "async"), + (mstatus == GrabSuccess ? "GrabSuccess" : + mstatus == AlreadyGrabbed ? "AlreadyGrabbed" : + mstatus == GrabInvalidTime ? "GrabInvalidTime" : + mstatus == GrabNotViewable ? "GrabNotViewable" : + mstatus == GrabFrozen ? "GrabFrozen" : + "???")); + } XSync(dpy, False); @@ -77,12 +129,34 @@ main (int argc, char **argv) { fprintf (stderr, "%s: sleeping for %d:%02d:%02d...\n", progname, - delay / (60 * 60), - (delay % (60 * 60)) / 60, - delay % 60); - fflush(stderr); - sleep (delay); - XSync(dpy, False); + delay1 / (60 * 60), + (delay1 % (60 * 60)) / 60, + delay1 % 60); + sleep (delay1); + fprintf (stderr, "%s: changing mouse cursor...\n", progname); + + mstatus = XGrabPointer (dpy, w, True, ALL_POINTER_EVENTS, + (mouse_sync_p ? GrabModeSync : GrabModeAsync), + (kbd_sync_p ? GrabModeSync : GrabModeAsync), + None, cursor2, CurrentTime); + XSync (dpy, False); + if (mstatus != GrabSuccess) + fprintf (stderr, "%s: failed: %s\n", progname, + (mstatus == GrabSuccess ? "GrabSuccess" : + mstatus == AlreadyGrabbed ? "AlreadyGrabbed" : + mstatus == GrabInvalidTime ? "GrabInvalidTime" : + mstatus == GrabNotViewable ? "GrabNotViewable" : + mstatus == GrabFrozen ? "GrabFrozen" : + "???")); + + fprintf (stderr, "%s: sleeping for %d:%02d:%02d...\n", + progname, + delay2 / (60 * 60), + (delay2 % (60 * 60)) / 60, + delay2 % 60); + fflush (stderr); + sleep (delay2); + XSync (dpy, False); } exit (0); diff --git a/driver/test-mlstring.c b/driver/test-mlstring.c deleted file mode 100644 index e269a004..00000000 --- a/driver/test-mlstring.c +++ /dev/null @@ -1,312 +0,0 @@ -/* - * (c) 2007, Quest Software, Inc. All rights reserved. - * - * This file is part of XScreenSaver, - * Copyright (c) 1993-2004 Jamie Zawinski - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ - -#include -#include -#include - -#include "mlstring.c" /* hokey, but whatever */ - -#define WRAP_WIDTH_PX 100 - -#undef Bool -#undef True -#undef False -typedef int Bool; -#define True 1 -#define False 0 - -#define SKIPPED -1 -#define SUCCESS 0 -#define FAILURE 1 - -#define FAIL(msg, ...) \ - do { \ - ++failcount; \ - fprintf(stderr, "[FAIL] "); \ - fprintf(stderr, msg, __VA_ARGS__); \ - putc('\n', stderr); \ - return FAILURE; \ - } while (0) - -#define SUCCEED(testname) \ - do { \ - fprintf(stderr, "[SUCCESS] %s\n", (testname)); \ - } while (0) - -#define SKIP(testname) \ - do { \ - fprintf(stderr, "[SKIPPED] %s\n", (testname)); \ - } while (0) - -extern mlstring* mlstring_allocate(const char *msg); -extern void mlstring_wrap(mlstring *mstr, XFontStruct *font, Dimension width); - -static int failcount = 0; - -static char *mlstring_to_cstr(const mlstring *mlstr) { - char *cstr; - size_t cstrlen = 0, alloclen = 1024; - const struct mlstr_line *line; - - cstr = malloc(alloclen); - if (!cstr) - return NULL; - cstr[0] = '\0'; - - for (line = mlstr->lines; line; line = line->next_line) { - /* Extend the buffer if necessary. */ - if (cstrlen + strlen(line->line) + 1 > alloclen) { - cstr = realloc(cstr, alloclen *= 2); - if (!cstr) - return NULL; - } - - /* If this is not the first line */ - if (line != mlstr->lines) { - /* Append a newline character */ - cstr[cstrlen] = '\n'; - ++cstrlen; - cstr[cstrlen] = '\0'; - } - - strcat(cstr, line->line); - cstrlen += strlen(line->line); - } - return cstr; -} - -/* Pass -1 for expect_min or expect_exact to not check that value. - * expect_empty_p means an empty line is expected at some point in the string. - * Also ensures that the string was not too wide after wrapping. */ -static int mlstring_expect_lines(const mlstring *mlstr, int expect_min, int expect_exact, Bool expect_empty_p) -{ - int count; - Bool got_empty_line = False; - const struct mlstr_line *line = mlstr->lines; - - for (count = 0; line; line = line->next_line) { - if (line->line[0] == '\0') { - if (!expect_empty_p) - FAIL("Not expecting empty lines, but got one on line %d of [%s]", count + 1, mlstring_to_cstr(mlstr)); - got_empty_line = True; - } - ++count; - } - - if (expect_empty_p && !got_empty_line) - FAIL("Expecting an empty line, but none found in [%s]", mlstring_to_cstr(mlstr)); - - if (expect_exact != -1 && expect_exact != count) - FAIL("Expected %d lines, got %d", expect_exact, count); - - if (expect_min != -1 && count < expect_min) - FAIL("Expected at least %d lines, got %d", expect_min, count); - - return SUCCESS; -} - -static int mlstring_expect(const char *msg, int expect_lines, const mlstring *mlstr, Bool expect_empty_p) -{ - char *str, *str_top; - const struct mlstr_line *cur; - int linecount = 0; - - /* Duplicate msg so we can chop it up */ - str_top = strdup(msg); - if (!str_top) - return SKIPPED; - - /* Replace all newlines with NUL */ - str = str_top; - while ((str = strchr(str, '\n'))) - *str++ = '\0'; - - /* str is now used to point to the expected string */ - str = str_top; - - for (cur = mlstr->lines; cur; cur = cur->next_line) - { - ++linecount; - if (strcmp(cur->line, str)) - FAIL("lines didn't match; expected [%s], got [%s]", str, cur->line); - - str += strlen(str) + 1; /* Point to the next expected string */ - } - - free(str_top); - - return mlstring_expect_lines(mlstr, -1, expect_lines, expect_empty_p); -} - -/* Ensures that the width has been set properly after wrapping */ -static int check_width(const char *msg, const mlstring *mlstr) { - if (mlstr->overall_width == 0) - FAIL("Overall width was zero for string [%s]", msg); - - if (mlstr->overall_width > WRAP_WIDTH_PX) - FAIL("Overall width was %hu but the maximum wrap width was %d", mlstr->overall_width, WRAP_WIDTH_PX); - - return SUCCESS; -} - -/* FAIL() actually returns the wrong return codes in main, but it - * prints a message which is what we want. */ - -#define TRY_NEW(str, numl, expect_empty) \ - do { \ - mlstr = mlstring_allocate((str)); \ - if (!mlstr) \ - FAIL("%s", #str); \ - if (SUCCESS == mlstring_expect((str), (numl), mlstr, (expect_empty))) \ - SUCCEED(#str); \ - free(mlstr); \ - } while (0) - -/* Expects an XFontStruct* font, and tries to wrap to 100px */ -#define TRY_WRAP(str, minl, expect_empty) \ - do { \ - mltest = mlstring_allocate((str)); \ - if (!mltest) \ - SKIP(#str); \ - else { \ - mlstring_wrap(mltest, font, WRAP_WIDTH_PX); \ - check_width((str), mltest); \ - if (SUCCESS == mlstring_expect_lines(mltest, (minl), -1, (expect_empty))) \ - SUCCEED(#str); \ - free(mltest); \ - mltest = NULL; \ - } \ - } while (0) - - -/* Ideally this function would use stub functions rather than real Xlib. - * Then it would be possible to test for exact line counts, which would be - * more reliable. - * It also doesn't handle Xlib errors. - * - * Don't print anything based on the return value of this function, it only - * returns a value so that I can use the FAIL() macro without warning. - * - * Anyone who understands this function wins a cookie ;) - */ -static int test_wrapping(void) -{ - Display *dpy = NULL; - XFontStruct *font = NULL; - mlstring *mltest = NULL; - int ok = 0; - int chars_per_line, chars_first_word, i; - - const char *test_short = "a"; - const char *test_hardwrap = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; - const char *test_withnewlines = "a\nb"; - char *test_softwrap = NULL; - - dpy = XOpenDisplay(NULL); - if (!dpy) - goto end; - - font = XLoadQueryFont(dpy, "fixed"); - if (!font) - goto end; - - TRY_WRAP(test_short, 1, False); - TRY_WRAP(test_hardwrap, 2, False); - TRY_WRAP(test_withnewlines, 2, False); - - /* See if wrapping splits on word boundaries like it should */ - chars_per_line = WRAP_WIDTH_PX / font->max_bounds.width; - if (chars_per_line < 3) - goto end; - - /* Allocate for 2 lines + \0 */ - test_softwrap = malloc(chars_per_line * 2 + 1); - if (!test_softwrap) - goto end; - - /* 2 = strlen(' a'); that is, the minimum space required to start a new word - * on the same line. */ - chars_first_word = chars_per_line - 2; - - for (i = 0; i < chars_first_word; ++i) { - test_softwrap[i] = 'a'; /* first word */ - test_softwrap[i + chars_per_line] = 'b'; /* second word */ - } - /* space between first & second words */ - test_softwrap[chars_first_word] = ' '; - /* first char of second word (last char of first line) */ - test_softwrap[chars_first_word + 1] = 'b'; - /* after second word */ - test_softwrap[chars_per_line * 2] = '\0'; - - mltest = mlstring_allocate(test_softwrap); - mlstring_wrap(mltest, font, WRAP_WIDTH_PX); - - /* reusing 'i' for a moment here to make freeing mltest easier */ - i = strlen(mltest->lines->line); - free(mltest); - - if (i != chars_first_word) - FAIL("Soft wrap failed, expected the first line to be %d chars, but it was %d.", chars_first_word, i); - SUCCEED("Soft wrap"); - - ok = 1; - -end: - if (test_softwrap) - free(test_softwrap); - - if (font) - XFreeFont(dpy, font); - - if (dpy) - XCloseDisplay(dpy); - - if (!ok) - SKIP("wrapping"); - - return ok ? SUCCESS : SKIPPED; /* Unused, actually */ -} - - -int main(int argc, char *argv[]) -{ - const char *oneline = "1Foo"; - const char *twolines = "2Foo\nBar"; - const char *threelines = "3Foo\nBar\nWhippet"; - const char *trailnewline = "4Foo\n"; - const char *trailnewlines = "5Foo\n\n"; - const char *embeddednewlines = "6Foo\n\nBar"; - mlstring *mlstr; - - TRY_NEW(oneline, 1, False); - TRY_NEW(twolines, 2, False); - TRY_NEW(threelines, 3, False); - TRY_NEW(trailnewline, 2, True); - TRY_NEW(trailnewlines, 3, True); - TRY_NEW(embeddednewlines, 3, True); - - (void) test_wrapping(); - - fprintf(stdout, "%d test failures.\n", failcount); - - return !!failcount; -} - -/* vim:ts=8:sw=2:noet - */ diff --git a/driver/test-passwd.c b/driver/test-passwd.c index 9b4f98e4..2c894ac1 100644 --- a/driver/test-passwd.c +++ b/driver/test-passwd.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1998-2017 Jamie Zawinski +/* xscreensaver, Copyright © 1998-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -10,8 +10,6 @@ */ /* This is a kludgy test harness for debugging the password dialog box. - It's somewhat easier to debug it here than in the xscreensaver executable - itself. */ #ifdef HAVE_CONFIG_H @@ -19,288 +17,101 @@ #endif #include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "xscreensaver.h" -#include "resources.h" -#include "version.h" -#include "visual.h" +#include +#include "blurb.h" #include "auth.h" -char *progname = 0; -char *progclass = 0; -XrmDatabase db = 0; -saver_info *global_si_kludge; - -FILE *real_stderr, *real_stdout; - -void monitor_power_on (saver_info *si, Bool on_p) {} -Bool monitor_powered_on_p (saver_info *si) { return True; } -void initialize_screensaver_window (saver_info *si) {} -void raise_window (saver_info *si, Bool i, Bool b, Bool d) {} -Bool blank_screen (saver_info *si) {return False;} -void unblank_screen (saver_info *si) {} -void reset_watchdog_timer(saver_info *si, Bool on_p) {} -Bool select_visual (saver_screen_info *ssi, const char *v) { return False; } -Bool window_exists_p (Display *dpy, Window window) {return True;} -void start_notice_events_timer (saver_info *si, Window w, Bool b) {} -Bool handle_clientmessage (saver_info *si, XEvent *e, Bool u) { return False; } -int BadWindow_ehandler (Display *dpy, XErrorEvent *error) { exit(1); } -const char *signal_name(int signal) { return "???"; } -Bool restore_real_vroot (saver_info *si) { return False; } -void store_saver_status (saver_info *si) {} -void saver_exit (saver_info *si, int status, const char *core) { exit(status);} -int move_mouse_grab (saver_info *si, Window to, Cursor c, int ts) { return 0; } -int mouse_screen (saver_info *si) { return 0; } -void check_for_leaks (const char *where) { } -void shutdown_stderr (saver_info *si) { } -void resize_screensaver_window (saver_info *si) { } -void describe_monitor_layout (saver_info *si) { } -Bool update_screen_layout (saver_info *si) { return 0; } -Bool in_signal_handler_p = 0; -char *timestring (time_t when) { return ""; } - -const char *blurb(void) { return progname; } -Atom XA_SCREENSAVER, XA_DEMO, XA_PREFS; +extern Bool test_auth_conv (void *, int, auth_message *, auth_response **); -void -idle_timer (XtPointer closure, XtIntervalId *id) +Bool +test_auth_conv (void *closure, + int nmsgs, + auth_message *msg, + auth_response **resp) { - saver_info *si = (saver_info *) closure; - XEvent fake_event; - fake_event.type = 0; /* XAnyEvent type, ignored. */ - fake_event.xany.display = si->dpy; - fake_event.xany.window = 0; - XPutBackEvent (si->dpy, &fake_event); -} - -static int -text_auth_conv ( - int num_msg, - const struct auth_message *auth_msgs, - struct auth_response **resp, - saver_info *si) -{ - char *input; - char buf[255]; - struct auth_response *responses; + int page = 1; int i; + nmsgs = 0; + msg = (auth_message *) calloc (100, sizeof(*msg)); - responses = calloc(num_msg, sizeof(struct auth_response)); - if (!responses) - return -1; - - /* The unlock state won't actually be used until this function returns and - * the auth module processes the response, but set it anyway for consistency - */ - si->unlock_state = ul_read; - - for (i = 0; i < num_msg; ++i) - { - printf ("\n%s: %s", progname, auth_msgs[i].msg); - if ( auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_NOECHO - || auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_ECHO) - { - input = fgets (buf, sizeof(buf)-1, stdin); - if (!input || !*input) - exit (0); - if (input[strlen(input)-1] == '\n') - input[strlen(input)-1] = 0; - - responses[i].response = strdup(input); - } - } - - *resp = responses; - - si->unlock_state = ul_finished; - - return 0; -} - - -#ifdef __GNUC__ - __extension__ /* shut up about "string length is greater than the length - ISO C89 compilers are required to support" when including - the .ad file... */ -#endif - -static char *fallback[] = { -#include "XScreenSaver_ad.h" - 0 -}; +# define DIALOG() \ + fprintf (stderr, "\n%s: page %d\n", blurb(), page++); \ + xscreensaver_auth_conv (closure, nmsgs, msg, resp); \ + if (*resp) \ + for (i = 0; i < nmsgs; i++) \ + fprintf (stderr, "%s: resp %d = \"%s\"\n", blurb(), i, \ + ((*resp)[i].response ? (*resp)[i].response : "")); \ + nmsgs = 0 -extern Bool debug_passwd_window_p; /* lock.c kludge */ -int -main (int argc, char **argv) -{ - enum { PASS, SPLASH, TTY } which; - Widget toplevel_shell = 0; - saver_screen_info ssip; - saver_info sip; - saver_info *si = &sip; - saver_preferences *p = &si->prefs; - struct passwd *pw; + msg[nmsgs].type = AUTH_MSGTYPE_INFO; + msg[nmsgs].msg = "1/4 Page One"; + nmsgs++; - memset(&sip, 0, sizeof(sip)); - memset(&ssip, 0, sizeof(ssip)); + msg[nmsgs].type = AUTH_MSGTYPE_INFO; + msg[nmsgs].msg = "2/4 All work and no play makes Jack a dull boy. " + "All work and no play makes Jack a dull boy. "; + nmsgs++; - si->nscreens = 1; - si->screens = si->default_screen = &ssip; - ssip.global = si; + msg[nmsgs].type = AUTH_MSGTYPE_ERROR; + msg[nmsgs].msg = "3/4 Red"; + nmsgs++; - global_si_kludge = si; - real_stderr = stderr; - real_stdout = stdout; + msg[nmsgs].type = AUTH_MSGTYPE_INFO; + msg[nmsgs].msg = "4/4 Greets to Crash Override."; + nmsgs++; + DIALOG(); - si->version = (char *) malloc (5); - memcpy (si->version, screensaver_id + 17, 4); - si->version[4] = 0; - progname = argv[0]; - { - char *s = strrchr(progname, '/'); - if (*s) progname = s+1; - } - if (argc != 2) goto USAGE; - else if (!strcmp (argv[1], "pass")) which = PASS; - else if (!strcmp (argv[1], "splash")) which = SPLASH; - else if (!strcmp (argv[1], "tty")) which = TTY; - else - { - USAGE: - fprintf (stderr, "usage: %s [ pass | splash | tty ]\n", progname); - exit (1); - } - -#ifdef NO_LOCKING - if (which == PASS || which == TTY) - { - fprintf (stderr, "%s: compiled with NO_LOCKING\n", progname); - exit (1); - } -#endif - -#ifndef NO_LOCKING - /* before hack_uid() for proper permissions */ - lock_priv_init (argc, argv, True); - - hack_uid (si); - - if (! lock_init (argc, argv, True)) - { - si->locking_disabled_p = True; - si->nolock_reason = "error getting password"; - } -#endif + msg[nmsgs].type = AUTH_MSGTYPE_INFO; + msg[nmsgs].msg = "1/1 Page Two"; + nmsgs++; + DIALOG(); - progclass = "XScreenSaver"; - if (!setlocale (LC_CTYPE, "")) - fprintf (stderr, "%s: warning: could not set default locale\n", - progname); + msg[nmsgs].type = AUTH_MSGTYPE_INFO; + msg[nmsgs].msg = "1/2 Page Three"; + nmsgs++; + msg[nmsgs].type = AUTH_MSGTYPE_PROMPT_NOECHO; + msg[nmsgs].msg = "2/2 Greets to Crash Override and also Joey"; + nmsgs++; - if (which != TTY) - { - toplevel_shell = XtAppInitialize (&si->app, progclass, 0, 0, - &argc, argv, fallback, - 0, 0); - si->dpy = XtDisplay (toplevel_shell); - p->db = XtDatabase (si->dpy); - si->default_screen->toplevel_shell = toplevel_shell; - si->default_screen->screen = XtScreen(toplevel_shell); - si->default_screen->default_visual = - si->default_screen->current_visual = - DefaultVisualOfScreen(si->default_screen->screen); - si->default_screen->screensaver_window = - RootWindowOfScreen(si->default_screen->screen); - si->default_screen->current_depth = - visual_depth(si->default_screen->screen, - si->default_screen->current_visual); + msg[nmsgs].type = AUTH_MSGTYPE_PROMPT_NOECHO; + msg[nmsgs].msg = "1/3 Page Four"; + nmsgs++; - ssip.width = WidthOfScreen(ssip.screen); - ssip.height = HeightOfScreen(ssip.screen); + msg[nmsgs].type = AUTH_MSGTYPE_INFO; + msg[nmsgs].msg = "2/3 Hack the planet."; + nmsgs++; - db = p->db; - XtGetApplicationNameAndClass (si->dpy, &progname, &progclass); + msg[nmsgs].type = AUTH_MSGTYPE_INFO; + msg[nmsgs].msg = "3/3 Hack the planet."; + nmsgs++; + DIALOG(); - load_init_file (si->dpy, &si->prefs); - } - p->verbose_p = True; + msg[nmsgs].type = AUTH_MSGTYPE_PROMPT_ECHO; + msg[nmsgs].msg = "1/1 Page Five visible text"; + nmsgs++; - pw = getpwuid (getuid ()); - si->user = strdup (pw->pw_name); + msg[nmsgs].type = AUTH_MSGTYPE_PROMPT_ECHO; + msg[nmsgs].msg = "1/3 Page six visible text"; + nmsgs++; -/* si->nscreens = 0; - si->screens = si->default_screen = 0; */ + msg[nmsgs].type = AUTH_MSGTYPE_INFO; + msg[nmsgs].msg = "2/3 Poop."; + nmsgs++; - while (1) - { -#ifndef NO_LOCKING - if (which == PASS) - { - si->unlock_cb = gui_auth_conv; - si->auth_finished_cb = auth_finished_cb; + msg[nmsgs].type = AUTH_MSGTYPE_INFO; + msg[nmsgs].msg = "3/3 \xF0\x9F\x92\xA9 \xF0\x9F\x92\xA9 \xF0\x9F\x92\xA9" + " \xE2\x80\x9C" + " \xE2\xAC\xA4 \xE2\x80\xA2 \xE2\xAD\x98 " + "\xE2\x80\x9D"; + nmsgs++; + DIALOG(); - debug_passwd_window_p = True; - xss_authenticate(si, True); - - if (si->unlock_state == ul_success) - fprintf (stderr, "%s: authentication succeeded\n", progname); - else - fprintf (stderr, "%s: authentication FAILED!\n", progname); - - XSync(si->dpy, False); - fprintf (stderr, "\n######################################\n\n"); - sleep (3); - } - else -#endif - if (which == SPLASH) - { - XEvent event; - make_splash_dialog (si); - XtAppAddTimeOut (si->app, p->splash_duration + 1000, - idle_timer, (XtPointer) si); - while (si->splash_dialog) - { - XtAppNextEvent (si->app, &event); - if (event.xany.window == si->splash_dialog) - handle_splash_event (si, &event); - XtDispatchEvent (&event); - } - XSync (si->dpy, False); - sleep (1); - } -#ifndef NO_LOCKING - else if (which == TTY) - { - si->unlock_cb = text_auth_conv; - - printf ("%s: Authenticating user %s\n", progname, si->user); - xss_authenticate(si, True); - - if (si->unlock_state == ul_success) - printf ("%s: Ok!\n", progname); - else - printf ("%s: Wrong!\n", progname); - } -#endif - else - abort(); - } - - free(si->user); + exit(0); } + diff --git a/driver/test-randr.c b/driver/test-randr.c index 74ead37f..1f88d99c 100644 --- a/driver/test-randr.c +++ b/driver/test-randr.c @@ -1,5 +1,5 @@ /* test-randr.c --- playing with the Resize And Rotate extension. - * xscreensaver, Copyright (c) 2004-2008 Jamie Zawinski + * xscreensaver, Copyright © 2004-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -30,26 +30,9 @@ #include #include -char *progname = 0; +#include "blurb.h" char *progclass = "XScreenSaver"; -static const char * -blurb (void) -{ - static char buf[255]; - time_t now = time ((time_t *) 0); - char *ct = (char *) ctime (&now); - int n = strlen(progname); - if (n > 100) n = 99; - strncpy(buf, progname, n); - buf[n++] = ':'; - buf[n++] = ' '; - strncpy(buf+n, ct+11, 8); - strcpy(buf+n+9, ": "); - return buf; -} - - static Bool error_handler_hit_p = False; static int @@ -72,15 +55,15 @@ main (int argc, char **argv) Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0, &argc, argv, 0, 0, 0); Display *dpy = XtDisplay (toplevel_shell); - XtGetApplicationNameAndClass (dpy, &progname, &progclass); + progname = argv[0]; nscreens = ScreenCount(dpy); if (!XRRQueryExtension(dpy, &event_number, &error_number)) { fprintf(stderr, "%s: XRRQueryExtension(dpy, ...) ==> False\n", blurb()); - fprintf(stderr, "%s: server does not support the RANDR extension.\n", + fprintf(stderr, "%s: server does not support the RANDR extension\n", blurb()); major = -1; } diff --git a/driver/test-screens.c b/driver/test-screens.c index 2fb3e35d..141b7ad9 100644 --- a/driver/test-screens.c +++ b/driver/test-screens.c @@ -1,5 +1,5 @@ /* test-screens.c --- some test cases for the "monitor sanity" checks. - * xscreensaver, Copyright (c) 2008 Jamie Zawinski + * xscreensaver, Copyright © 2008-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -14,39 +14,20 @@ # include "config.h" #endif +#include +#include +#include #include -/* This file doesn't need the Xt headers, so stub these types out... */ -#undef XtPointer -#define XtAppContext void* -#define XrmDatabase void* -#define XtIntervalId void* -#define XtPointer void* -#define Widget void* - -#include "xscreensaver.h" +#include "blurb.h" #include "visual.h" +#include "screens.h" #undef WidthOfScreen #undef HeightOfScreen #define WidthOfScreen(s) 10240 #define HeightOfScreen(s) 10240 -#undef screen_number -#define screen_number(s) ((int) s) - -#include "screens.c" /* to get at static void check_monitor_sanity() */ - -char *progname = 0; -char *progclass = "XScreenSaver"; - -const char *blurb(void) { return progname; } - -Bool safe_XF86VidModeGetViewPort(Display *d, int i, int *x, int *y) { abort(); } -void initialize_screen_root_widget(saver_screen_info *ssi) { abort(); } -Visual *get_best_gl_visual (saver_info *si, Screen *sc) { abort(); } - - static const char * failstr (monitor_sanity san) { diff --git a/driver/test-uid.c b/driver/test-uid.c index 6a1f9cc1..713a3fd8 100644 --- a/driver/test-uid.c +++ b/driver/test-uid.c @@ -124,12 +124,12 @@ main (int argc, char **argv) { if (was_numeric) { - fprintf(stderr, "no group numbered %s.\n", group); + fprintf(stderr, "no group numbered %s\n", group); group = ""; } else { - fprintf(stderr, "no group named %s.\n", group); + fprintf(stderr, "no group named %s\n", group); goto NOGROUP; } } @@ -138,14 +138,14 @@ main (int argc, char **argv) { gid_t g2 = gid; if (setgroups(1, &g2) == 0) - fprintf(stderr, " succeeded.\n"); + fprintf(stderr, " succeeded\n"); else perror(" failed"); } fprintf(stderr, "setgid(%ld) \"%s\"", gid, group); if (setgid(gid) == 0) - fprintf(stderr, " succeeded.\n"); + fprintf(stderr, " succeeded\n"); else perror(" failed"); @@ -177,19 +177,19 @@ main (int argc, char **argv) { if (was_numeric) { - fprintf(stderr, "no user numbered \"%s\".\n", user); + fprintf(stderr, "no user numbered \"%s\"\n", user); user = ""; } else { - fprintf(stderr, "no user named %s.\n", user); + fprintf(stderr, "no user named %s\n", user); goto NOUSER; } } fprintf(stderr, "setuid(%ld) \"%s\"", uid, user); if (setuid(uid) == 0) - fprintf(stderr, " succeeded.\n"); + fprintf(stderr, " succeeded\n"); else perror(" failed"); NOUSER: ; diff --git a/driver/test-vp.c b/driver/test-vp.c index bf1a0b18..ded5acaa 100644 --- a/driver/test-vp.c +++ b/driver/test-vp.c @@ -1,5 +1,5 @@ /* test-xinerama.c --- playing with XF86VidModeGetViewPort - * xscreensaver, Copyright (c) 2004 Jamie Zawinski + * xscreensaver, Copyright © 2004-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -31,26 +31,9 @@ #include #include -char *progname = 0; +#include "blurb.h" char *progclass = "XScreenSaver"; -static const char * -blurb (void) -{ - static char buf[255]; - time_t now = time ((time_t *) 0); - char *ct = (char *) ctime (&now); - int n = strlen(progname); - if (n > 100) n = 99; - strncpy(buf, progname, n); - buf[n++] = ':'; - buf[n++] = ' '; - strncpy(buf+n, ct+11, 8); - strcpy(buf+n+9, ": "); - return buf; -} - - static Bool error_handler_hit_p = False; static int @@ -129,14 +112,13 @@ main (int argc, char **argv) Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0, &argc, argv, 0, 0, 0); Display *dpy = XtDisplay (toplevel_shell); - XtGetApplicationNameAndClass (dpy, &progname, &progclass); if (!XF86VidModeQueryExtension(dpy, &event_number, &error_number)) { fprintf(stderr, "%s: XF86VidModeQueryExtension(dpy, ...) ==> False\n", blurb()); fprintf(stderr, - "%s: server does not support the XF86VidMode extension.\n", + "%s: server does not support the XF86VidMode extension\n", blurb()); exit(1); } diff --git a/driver/test-xdpms.c b/driver/test-xdpms.c index b86aed3a..e837d8d0 100644 --- a/driver/test-xdpms.c +++ b/driver/test-xdpms.c @@ -1,5 +1,5 @@ /* test-xdpms.c --- playing with the XDPMS extension. - * xscreensaver, Copyright (c) 1998-2011 Jamie Zawinski + * xscreensaver, Copyright © 1998-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -29,42 +29,11 @@ #include #include -#include +/*#include */ -extern Bool DPMSQueryExtension (Display *dpy, int *event_ret, int *error_ret); -extern Bool DPMSCapable (Display *dpy); -extern Status DPMSForceLevel (Display *dpy, CARD16 level); -extern Status DPMSInfo (Display *dpy, CARD16 *power_level, BOOL *state); - -extern Status DPMSGetVersion (Display *dpy, int *major_ret, int *minor_ret); -extern Status DPMSSetTimeouts (Display *dpy, - CARD16 standby, CARD16 suspend, CARD16 off); -extern Bool DPMSGetTimeouts (Display *dpy, - CARD16 *standby, CARD16 *suspend, CARD16 *off); -extern Status DPMSEnable (Display *dpy); -extern Status DPMSDisable (Display *dpy); - - -char *progname = 0; +#include "blurb.h" char *progclass = "XScreenSaver"; -static const char * -blurb (void) -{ - static char buf[255]; - time_t now = time ((time_t *) 0); - char *ct = (char *) ctime (&now); - int n = strlen(progname); - if (n > 100) n = 99; - strncpy(buf, progname, n); - buf[n++] = ':'; - buf[n++] = ' '; - strncpy(buf+n, ct+11, 8); - strcpy(buf+n+9, ": "); - return buf; -} - - static Bool error_handler_hit_p = False; static int @@ -90,13 +59,12 @@ main (int argc, char **argv) Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0, &argc, argv, 0, 0, 0); Display *dpy = XtDisplay (toplevel_shell); - XtGetApplicationNameAndClass (dpy, &progname, &progclass); if (!DPMSQueryExtension(dpy, &event_number, &error_number)) { fprintf(stderr, "%s: DPMSQueryExtension(dpy, ...) ==> False\n", blurb()); - fprintf(stderr, "%s: server does not support the XDPMS extension.\n", + fprintf(stderr, "%s: server does not support the XDPMS extension\n", blurb()); exit(1); } @@ -107,7 +75,7 @@ main (int argc, char **argv) if (!DPMSCapable(dpy)) { fprintf(stderr, "%s: DPMSCapable(dpy) ==> False\n", blurb()); - fprintf(stderr, "%s: server says hardware doesn't support DPMS.\n", + fprintf(stderr, "%s: server says hardware doesn't support DPMS\n", blurb()); exit(1); } @@ -158,13 +126,12 @@ main (int argc, char **argv) state == DPMSModeSuspend || state == DPMSModeOff) { - XErrorHandler old_handler; int st; - fprintf(stderr, "%s: monitor is off; turning it on.\n", blurb()); + fprintf(stderr, "%s: monitor is off; turning it on\n", blurb()); XSync (dpy, False); error_handler_hit_p = False; - old_handler = XSetErrorHandler (ignore_all_errors_ehandler); + XSetErrorHandler (ignore_all_errors_ehandler); XSync (dpy, False); st = DPMSForceLevel (dpy, DPMSModeOn); XSync (dpy, False); diff --git a/driver/test-xinerama.c b/driver/test-xinerama.c index 8bafbb07..cd8add46 100644 --- a/driver/test-xinerama.c +++ b/driver/test-xinerama.c @@ -1,5 +1,5 @@ /* test-xinerama.c --- playing with the Xinerama extension. - * xscreensaver, Copyright (c) 2003 Jamie Zawinski + * xscreensaver, Copyright © 2003-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -30,26 +30,9 @@ #include #include -char *progname = 0; +#include "blurb.h" char *progclass = "XScreenSaver"; -static const char * -blurb (void) -{ - static char buf[255]; - time_t now = time ((time_t *) 0); - char *ct = (char *) ctime (&now); - int n = strlen(progname); - if (n > 100) n = 99; - strncpy(buf, progname, n); - buf[n++] = ':'; - buf[n++] = ' '; - strncpy(buf+n, ct+11, 8); - strcpy(buf+n+9, ": "); - return buf; -} - - int main (int argc, char **argv) { @@ -63,13 +46,12 @@ main (int argc, char **argv) Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0, &argc, argv, 0, 0, 0); Display *dpy = XtDisplay (toplevel_shell); - XtGetApplicationNameAndClass (dpy, &progname, &progclass); if (!XineramaQueryExtension(dpy, &event_number, &error_number)) { fprintf(stderr, "%s: XineramaQueryExtension(dpy, ...) ==> False\n", blurb()); - fprintf(stderr, "%s: server does not support the Xinerama extension.\n", + fprintf(stderr, "%s: server does not support the Xinerama extension\n", blurb()); exit(1); } @@ -80,7 +62,7 @@ main (int argc, char **argv) if (!XineramaIsActive(dpy)) { fprintf(stderr, "%s: XineramaIsActive(dpy) ==> False\n", blurb()); - fprintf(stderr, "%s: server says Xinerama is turned off.\n", blurb()); + fprintf(stderr, "%s: server says Xinerama is turned off\n", blurb()); exit(1); } else diff --git a/driver/test-xinput.c b/driver/test-xinput.c new file mode 100644 index 00000000..e3a64874 --- /dev/null +++ b/driver/test-xinput.c @@ -0,0 +1,306 @@ +/* test-xinput.c --- playing with the XInput2 extension. + * xscreensaver, Copyright © 2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#ifdef HAVE_UNISTD_H +# include +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "blurb.h" +#include "xinput.h" + +char *progclass = "XScreenSaver"; +Bool debug_p = True; + +static void +ungrab_timer (XtPointer closure, XtIntervalId *id) +{ + Display *dpy = (Display *) closure; + fprintf (stderr, "\n%s: ungrabbing\n\n", blurb()); + XUngrabKeyboard (dpy, CurrentTime); + XUngrabPointer (dpy, CurrentTime); +} + + +static const char * +grab_string (int status) +{ + switch (status) { + case GrabSuccess: return "GrabSuccess"; + case AlreadyGrabbed: return "AlreadyGrabbed"; + case GrabInvalidTime: return "GrabInvalidTime"; + case GrabNotViewable: return "GrabNotViewable"; + case GrabFrozen: return "GrabFrozen"; + default: + { + static char buf[255]; + sprintf(buf, "unknown status: %d", status); + return buf; + } + } +} + + +int +main (int argc, char **argv) +{ + XtAppContext app; + Widget toplevel_shell; + Display *dpy; + int xi_opcode; + Bool grab_kbd_p = False; + Bool grab_mouse_p = False; + Bool mouse_sync_p = True; + Bool kbd_sync_p = True; + int i; + + progname = argv[0]; + + for (i = 1; i < argc; i++) + { + const char *oa = argv[i]; + if (argv[i][0] == '-' && argv[i][1] == '-') + argv[i]++; + if (!strcmp (argv[i], "-grab")) + grab_kbd_p = grab_mouse_p = True; + else if (!strcmp (argv[i], "-grab-kbd") || + !strcmp (argv[i], "-grab-keyboard")) + grab_kbd_p = True; + else if (!strcmp (argv[i], "-grab-mouse") || + !strcmp (argv[i], "-grab-pointer")) + grab_mouse_p = True; + else if (!strcmp (argv[i], "-kbd-sync") || + !strcmp (argv[i], "-keyboard-sync")) + kbd_sync_p = True; + else if (!strcmp (argv[i], "-kbd-async") || + !strcmp (argv[i], "-keyboard-async")) + kbd_sync_p = False; + else if (!strcmp (argv[i], "-mouse-sync") || + !strcmp (argv[i], "-pointer-sync")) + mouse_sync_p = True; + else if (!strcmp (argv[i], "-mouse-async") || + !strcmp (argv[i], "-pointer-async")) + mouse_sync_p = False; + else + { + fprintf (stderr, "%s: unknown option: %s\n", blurb(), oa); + exit (1); + } + } + + toplevel_shell = XtAppInitialize (&app, progclass, 0, 0, + &argc, argv, 0, 0, 0); + dpy = XtDisplay (toplevel_shell); + if (!dpy) exit(1); + + if (! init_xinput (dpy, &xi_opcode)) + exit (1); + + if (grab_kbd_p || grab_mouse_p) + { + int timeout = 15; + Window w = RootWindow (dpy, 0); + int status; + XColor black = { 0, }; + Pixmap bit = XCreateBitmapFromData (dpy, w, "\000", 1, 1); + Cursor cursor = XCreatePixmapCursor (dpy, bit, bit, &black, &black, 0, 0); + + if (grab_kbd_p) + { + status = XGrabKeyboard (dpy, w, True, + (mouse_sync_p ? GrabModeSync : GrabModeAsync), + (kbd_sync_p ? GrabModeSync : GrabModeAsync), + CurrentTime); + if (status == GrabSuccess) + fprintf (stderr, "%s: grabbed keyboard (%s, %s)\n", blurb(), + (mouse_sync_p ? "sync" : "async"), + (kbd_sync_p ? "sync" : "async")); + else + { + fprintf (stderr, "%s: failed to grab keyboard (%s, %s): %s\n", + blurb(), + (mouse_sync_p ? "sync" : "async"), + (kbd_sync_p ? "sync" : "async"), + grab_string (status)); + exit(1); + } + } + + if (grab_mouse_p) + { + status = XGrabPointer (dpy, w, True, + (ButtonPressMask | ButtonReleaseMask | + EnterWindowMask | LeaveWindowMask | + PointerMotionMask | PointerMotionHintMask | + Button1MotionMask | Button2MotionMask | + Button3MotionMask | Button4MotionMask | + Button5MotionMask | ButtonMotionMask), + (mouse_sync_p ? GrabModeSync : GrabModeAsync), + (kbd_sync_p ? GrabModeSync : GrabModeAsync), + w, cursor, CurrentTime); + if (status == GrabSuccess) + fprintf (stderr, "%s: grabbed mouse (%s, %s)\n", blurb(), + (mouse_sync_p ? "sync" : "async"), + (kbd_sync_p ? "sync" : "async")); + else + { + fprintf (stderr, "%s: failed to grab mouse (%s, %s): %s\n", + blurb(), + (mouse_sync_p ? "sync" : "async"), + (kbd_sync_p ? "sync" : "async"), + grab_string (status)); + exit(1); + } + } + + fprintf (stderr, "%s: ungrabbing in %d seconds\n", blurb(), timeout); + XtAppAddTimeOut (app, 1000 * timeout, ungrab_timer, (XtPointer) dpy); + } + + while (1) + { + XEvent xev; + XIRawEvent *re; + + XtAppNextEvent (app, &xev); + XtDispatchEvent (&xev); + + switch (xev.xany.type) { + case KeyPress: + case KeyRelease: + { + static XComposeStatus compose = { 0, }; + KeySym keysym = 0; + char c[100]; + int n; + n = XLookupString (&xev.xkey, c, sizeof(c)-1, &keysym, &compose); + c[n] = 0; + fprintf (stderr, "%s: X11 Key%s %02x %02x %s \"%s\"\n", blurb(), + (xev.xkey.type == KeyPress ? "Press " : "Release"), + xev.xkey.keycode, xev.xkey.state, + XKeysymToString (keysym), c); + } + break; + case ButtonPress: + case ButtonRelease: + fprintf (stderr, "%s: X11 Button%s %d %d\n", blurb(), + (xev.xany.type == ButtonPress ? "Press " : "Release"), + xev.xbutton.button, xev.xbutton.state); + break; + case MotionNotify: + fprintf (stderr, "%s: X11 MotionNotify %4d, %-4d\n", + blurb(), xev.xmotion.x_root, xev.xmotion.y_root); + break; + case GenericEvent: + break; + case EnterNotify: + case LeaveNotify: + break; + default: + fprintf (stderr, "%s: X11 event %d on 0x%lx\n", + blurb(), xev.xany.type, xev.xany.window); + break; + } + + if (xev.xcookie.type != GenericEvent || + xev.xcookie.extension != xi_opcode) + continue; /* not an XInput event */ + if (!xev.xcookie.data) + XGetEventData (dpy, &xev.xcookie); + if (!xev.xcookie.data) + continue; /* Bogus XInput event */ + + re = xev.xcookie.data; + switch (xev.xcookie.evtype) { + case XI_RawKeyPress: + case XI_RawKeyRelease: + { + /* Fake up an XKeyEvent in order to call XKeysymToString(). */ + XEvent ev2; + Bool ok = xinput_event_to_xlib (xev.xcookie.evtype, + (XIDeviceEvent *) re, + &ev2); + if (!ok) + fprintf (stderr, "%s: unable to translate XInput2 event\n", + blurb()); + else + { + static XComposeStatus compose = { 0, }; + KeySym keysym = 0; + char c[100]; + int n; + n = XLookupString (&ev2.xkey, c, sizeof(c)-1, &keysym, &compose); + c[n] = 0; + fprintf (stderr, "%s: XI_RawKey%s %02x %02x %s \"%s\"\n", + blurb(), + (ev2.xkey.type == KeyPress ? "Press " : "Release"), + ev2.xkey.keycode, ev2.xkey.state, + XKeysymToString (keysym), c); + } + } + break; + case XI_RawButtonPress: + case XI_RawButtonRelease: + fprintf (stderr, "%s: XI_RawButton%s %d\n", blurb(), + (re->evtype == XI_RawButtonPress ? "Press " : "Release"), + re->detail); + break; + case XI_RawMotion: + { + Window root_ret, child_ret; + int root_x, root_y; + int win_x, win_y; + unsigned int mask; + XQueryPointer (dpy, DefaultRootWindow (dpy), + &root_ret, &child_ret, &root_x, &root_y, + &win_x, &win_y, &mask); + fprintf (stderr, "%s: XI_RawMotion %4d, %-4d %7.02f, %-7.02f\n", + blurb(), + root_x, root_y, + re->raw_values[0], re->raw_values[1]); + } + break; + case XI_RawTouchBegin: + fprintf (stderr, "%s: XI_RawTouchBegin\n", blurb()); + break; + case XI_RawTouchEnd: + fprintf (stderr, "%s: XI_RawTouchEnd", blurb()); + break; + case XI_RawTouchUpdate: + fprintf (stderr, "%s: XI_RawTouchUpdate", blurb()); + break; + + default: + fprintf (stderr, "%s: XInput unknown event %d\n", blurb(), + xev.xcookie.evtype); + break; + } + + XFreeEventData (dpy, &xev.xcookie); + } + + exit (0); +} diff --git a/driver/test-xkb.c b/driver/test-xkb.c new file mode 100644 index 00000000..8d26b733 --- /dev/null +++ b/driver/test-xkb.c @@ -0,0 +1,89 @@ +/* test-xkb.c --- playing with the X Keyboard extension. + * xscreensaver, Copyright © 2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#ifdef HAVE_UNISTD_H +# include +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "blurb.h" + +char *progclass = "XScreenSaver"; + +int +main (int argc, char **argv) +{ + XtAppContext app; + Widget toplevel_shell; + Display *dpy; + int i; + + progname = argv[0]; + + for (i = 1; i < argc; i++) + { + const char *oa = argv[i]; + if (argv[i][0] == '-' && argv[i][1] == '-') + argv[i]++; + if (0) ; + else + { + fprintf (stderr, "%s: unknown option: %s\n", blurb(), oa); + exit (1); + } + } + + toplevel_shell = XtAppInitialize (&app, progclass, 0, 0, + &argc, argv, 0, 0, 0); + dpy = XtDisplay (toplevel_shell); + if (!dpy) exit(1); + + { + XkbStateRec state; + XkbDescPtr desc; + char *group; + Atom name; + + if (XkbGetState (dpy, XkbUseCoreKbd, &state)) + { + fprintf (stderr, "%s: XkbGetState failed\n", progname); + exit (1); + } + desc = XkbGetKeyboard (dpy, XkbAllComponentsMask, XkbUseCoreKbd); + if (!desc || !desc->names) + { + fprintf (stderr, "%s: XkbGetKeyboard failed\n", progname); + exit (1); + } + + name = desc->names->groups[state.group]; + group = (name ? XGetAtomName (dpy, name) : strdup("NULL")); + fprintf (stderr, "%s: kbd name: %s\n", progname, group); + free (group); + } + + exit (0); +} diff --git a/driver/test-yarandom.c b/driver/test-yarandom.c index 6701ff8d..e4343774 100644 --- a/driver/test-yarandom.c +++ b/driver/test-yarandom.c @@ -21,10 +21,9 @@ #include #include +#include "blurb.h" #include "yarandom.h" -char *progname = 0; - int main (int argc, char **argv) { diff --git a/driver/timers.c b/driver/timers.c deleted file mode 100644 index eacb41c0..00000000 --- a/driver/timers.c +++ /dev/null @@ -1,1797 +0,0 @@ -/* timers.c --- detecting when the user is idle, and other timer-related tasks. - * xscreensaver, Copyright (c) 1991-2019 Jamie Zawinski - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_XMU -# ifndef VMS -# include -# else /* VMS */ -# include -# endif /* VMS */ -# else /* !HAVE_XMU */ -# include "xmu.h" -#endif /* !HAVE_XMU */ - -#ifdef HAVE_XIDLE_EXTENSION -#include -#endif /* HAVE_XIDLE_EXTENSION */ - -#ifdef HAVE_MIT_SAVER_EXTENSION -#include -#endif /* HAVE_MIT_SAVER_EXTENSION */ - -#ifdef HAVE_SGI_SAVER_EXTENSION -#include -#endif /* HAVE_SGI_SAVER_EXTENSION */ - -#ifdef HAVE_RANDR -#include -#endif /* HAVE_RANDR */ - -#include "xscreensaver.h" - -#undef ABS -#define ABS(x)((x)<0?-(x):(x)) - -#undef MAX -#define MAX(x,y)((x)>(y)?(x):(y)) - - -#ifdef HAVE_PROC_INTERRUPTS -static Bool proc_interrupts_activity_p (saver_info *si); -#endif /* HAVE_PROC_INTERRUPTS */ - -static void check_for_clock_skew (saver_info *si); - - -void -idle_timer (XtPointer closure, XtIntervalId *id) -{ - saver_info *si = (saver_info *) closure; - - /* What an amazingly shitty design. Not only does Xt execute timeout - events from XtAppNextEvent() instead of from XtDispatchEvent(), but - there is no way to tell Xt to block until there is an X event OR a - timeout happens. Once your timeout proc is called, XtAppNextEvent() - still won't return until a "real" X event comes in. - - So this function pushes a stupid, gratuitous, unnecessary event back - on the event queue to force XtAppNextEvent to return Right Fucking Now. - When the code in sleep_until_idle() sees an event of type XAnyEvent, - which the server never generates, it knows that a timeout has occurred. - */ - XEvent fake_event; - fake_event.type = 0; /* XAnyEvent type, ignored. */ - fake_event.xany.display = si->dpy; - fake_event.xany.window = 0; - XPutBackEvent (si->dpy, &fake_event); - - /* If we are the timer that just went off, clear the pointer to the id. */ - if (id) - { - if (si->timer_id && *id != si->timer_id) - abort(); /* oops, scheduled timer twice?? */ - si->timer_id = 0; - } -} - - -void -schedule_wakeup_event (saver_info *si, Time when, Bool verbose_p) -{ - if (si->timer_id) - { - if (verbose_p) - fprintf (stderr, "%s: idle_timer already running\n", blurb()); - return; - } - - /* Wake up periodically to ask the server if we are idle. */ - si->timer_id = XtAppAddTimeOut (si->app, when, idle_timer, - (XtPointer) si); - - if (verbose_p) - fprintf (stderr, "%s: starting idle_timer (%ld, %ld)\n", - blurb(), when, si->timer_id); -} - - -static void -notice_events (saver_info *si, Window window, Bool top_p) -{ - saver_preferences *p = &si->prefs; - XWindowAttributes attrs; - unsigned long events; - Window root, parent, *kids; - unsigned int nkids; - int screen_no; - - if (XtWindowToWidget (si->dpy, window)) - /* If it's one of ours, don't mess up its event mask. */ - return; - - if (!XQueryTree (si->dpy, window, &root, &parent, &kids, &nkids)) - return; - if (window == root) - top_p = False; - - /* Figure out which screen this window is on, for the diagnostics. */ - for (screen_no = 0; screen_no < si->nscreens; screen_no++) - if (root == RootWindowOfScreen (si->screens[screen_no].screen)) - break; - - XGetWindowAttributes (si->dpy, window, &attrs); - events = ((attrs.all_event_masks | attrs.do_not_propagate_mask) - & (KeyPressMask | PropertyChangeMask)); - - /* Select for SubstructureNotify on all windows. - Select for PropertyNotify on all windows. - Select for KeyPress on all windows that already have it selected. - - Note that we can't select for ButtonPress, because of X braindamage: - only one client at a time may select for ButtonPress on a given - window, though any number can select for KeyPress. Someone explain - *that* to me. - - So, if the user spends a while clicking the mouse without ever moving - the mouse or touching the keyboard, we won't know that they've been - active, and the screensaver will come on. That sucks, but I don't - know how to get around it. - - Since X presents mouse wheels as clicks, this applies to those, too: - scrolling through a document using only the mouse wheel doesn't - count as activity... Fortunately, /proc/interrupts helps, on - systems that have it. Oh, if it's a PS/2 mouse, not serial or USB. - This sucks! - */ - XSelectInput (si->dpy, window, - SubstructureNotifyMask | PropertyChangeMask | events); - - if (top_p && p->debug_p && (events & KeyPressMask)) - { - /* Only mention one window per tree (hack hack). */ - fprintf (stderr, "%s: %d: selected KeyPress on 0x%lX\n", - blurb(), screen_no, (unsigned long) window); - top_p = False; - } - - if (kids) - { - while (nkids) - notice_events (si, kids [--nkids], top_p); - XFree ((char *) kids); - } -} - - -int -BadWindow_ehandler (Display *dpy, XErrorEvent *error) -{ - /* When we notice a window being created, we spawn a timer that waits - 30 seconds or so, and then selects events on that window. This error - handler is used so that we can cope with the fact that the window - may have been destroyed <30 seconds after it was created. - */ - if (error->error_code == BadWindow || - error->error_code == BadMatch || - error->error_code == BadDrawable) - return 0; - else - return saver_ehandler (dpy, error); -} - - -struct notice_events_timer_arg { - saver_info *si; - Window w; -}; - -static void -notice_events_timer (XtPointer closure, XtIntervalId *id) -{ - struct notice_events_timer_arg *arg = - (struct notice_events_timer_arg *) closure; - - XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler); - - saver_info *si = arg->si; - Window window = arg->w; - - free(arg); - notice_events (si, window, True); - XSync (si->dpy, False); - XSetErrorHandler (old_handler); -} - -void -start_notice_events_timer (saver_info *si, Window w, Bool verbose_p) -{ - saver_preferences *p = &si->prefs; - struct notice_events_timer_arg *arg = - (struct notice_events_timer_arg *) malloc(sizeof(*arg)); - arg->si = si; - arg->w = w; - XtAppAddTimeOut (si->app, p->notice_events_timeout, notice_events_timer, - (XtPointer) arg); - - if (verbose_p) - fprintf (stderr, "%s: starting notice_events_timer for 0x%X (%lu)\n", - blurb(), (unsigned int) w, p->notice_events_timeout); -} - - -/* When the screensaver is active, this timer will periodically change - the running program. - */ -void -cycle_timer (XtPointer closure, XtIntervalId *id) -{ - saver_info *si = (saver_info *) closure; - saver_preferences *p = &si->prefs; - Time how_long = p->cycle; - - if (si->selection_mode > 0 && - screenhack_running_p (si)) - /* If we're in "SELECT n" mode, the cycle timer going off will just - restart this same hack again. There's not much point in doing this - every 5 or 10 minutes, but on the other hand, leaving one hack running - for days is probably not a great idea, since they tend to leak and/or - crash. So, restart the thing once an hour. */ - how_long = 1000 * 60 * 60; - - if (si->dbox_up_p) - { - if (p->verbose_p) - fprintf (stderr, "%s: dialog box up; delaying hack change.\n", - blurb()); - how_long = 30000; /* 30 secs */ - } - else - { - int i; - maybe_reload_init_file (si); - for (i = 0; i < si->nscreens; i++) - kill_screenhack (&si->screens[i]); - - raise_window (si, True, True, False); - - if (!si->throttled_p) - for (i = 0; i < si->nscreens; i++) - spawn_screenhack (&si->screens[i]); - else - { - if (p->verbose_p) - fprintf (stderr, "%s: not launching new hack (throttled.)\n", - blurb()); - } - } - - if (how_long > 0) - { - si->cycle_id = XtAppAddTimeOut (si->app, how_long, cycle_timer, - (XtPointer) si); - - if (p->debug_p) - fprintf (stderr, "%s: starting cycle_timer (%ld, %ld)\n", - blurb(), how_long, si->cycle_id); - } - else - { - if (p->debug_p) - fprintf (stderr, "%s: not starting cycle_timer: how_long == %ld\n", - blurb(), (unsigned long) how_long); - } -} - - -void -activate_lock_timer (XtPointer closure, XtIntervalId *id) -{ - saver_info *si = (saver_info *) closure; - saver_preferences *p = &si->prefs; - - if (p->verbose_p) - fprintf (stderr, "%s: timed out; activating lock.\n", blurb()); - - if (!si->locked_p) - /* So that "xscreensaver-command -watch" reports the time that the - screen was locked, instead of duplicating the blank time. */ - si->blank_time = time ((time_t *) 0); - - set_locked_p (si, True); -} - - -/* Call this when user activity (or "simulated" activity) has been noticed. - */ -void -reset_timers (saver_info *si) -{ - saver_preferences *p = &si->prefs; - if (si->using_mit_saver_extension || si->using_sgi_saver_extension) - return; - - if (si->timer_id) - { - if (p->debug_p) - fprintf (stderr, "%s: killing idle_timer (%ld, %ld)\n", - blurb(), p->timeout, si->timer_id); - XtRemoveTimeOut (si->timer_id); - si->timer_id = 0; - } - - schedule_wakeup_event (si, p->timeout, p->debug_p); /* sets si->timer_id */ - - if (si->cycle_id) abort (); /* no cycle timer when inactive */ - - si->last_activity_time = time ((time_t *) 0); - - /* This will (hopefully, supposedly) tell the server to re-set its - DPMS timer. Without this, the -deactivate clientmessage would - prevent xscreensaver from blanking, but would not prevent the - monitor from powering down. */ -#if 0 - /* #### With some servers, this causes the screen to flicker every - time a key is pressed! Ok, I surrender. I give up on ever - having DPMS work properly. - */ - XForceScreenSaver (si->dpy, ScreenSaverReset); - - /* And if the monitor is already powered off, turn it on. - You'd think the above would do that, but apparently not? */ - monitor_power_on (si, True); -#endif - -} - - -/* Returns true if a mouse has moved since the last time we checked. - Small motions (of less than "hysteresis" pixels/second) are ignored. - */ -static Bool -device_pointer_moved_p (saver_info *si, poll_mouse_data *last_poll_mouse, - poll_mouse_data *this_poll_mouse, Bool mods_p, - const char *debug_type, int debug_id) -{ - saver_preferences *p = &si->prefs; - - unsigned int distance, dps; - unsigned long seconds = 0; - Bool moved_p = False; - - distance = MAX (ABS (last_poll_mouse->root_x - this_poll_mouse->root_x), - ABS (last_poll_mouse->root_y - this_poll_mouse->root_y)); - seconds = (this_poll_mouse->time - last_poll_mouse->time); - - - /* When the screen is blanked, we get MotionNotify events, but when not - blanked, we poll only every 5 seconds, and that's not enough resolution - to do hysteresis based on a 1 second interval. So, assume that any - motion we've seen during the 5 seconds when our eyes were closed happened - in the last 1 second instead. - */ - if (seconds > 1) seconds = 1; - - dps = (seconds <= 0 ? distance : (distance / seconds)); - - /* Motion only counts if the rate is more than N pixels per second. - */ - if (dps >= p->pointer_hysteresis && - distance > 0) - moved_p = True; - - /* If the mouse is not on this screen but used to be, that's motion. - If the mouse was not on this screen, but is now, that's motion. - */ - { - Bool on_screen_p = (this_poll_mouse->root_x != -1 && - this_poll_mouse->root_y != -1); - Bool was_on_screen_p = (last_poll_mouse->root_x != -1 && - last_poll_mouse->root_y != -1); - - if (on_screen_p != was_on_screen_p) - moved_p = True; - } - - if (p->debug_p && (distance != 0 || moved_p)) - { - fprintf (stderr, "%s: %s %d: pointer %s", blurb(), debug_type, debug_id, - (moved_p ? "moved: " : "ignored:")); - if (last_poll_mouse->root_x == -1) - fprintf (stderr, "off screen"); - else - fprintf (stderr, "%d,%d", - last_poll_mouse->root_x, - last_poll_mouse->root_y); - fprintf (stderr, " -> "); - if (this_poll_mouse->root_x == -1) - fprintf (stderr, "off screen"); - else - fprintf (stderr, "%d,%d", this_poll_mouse->root_x, - this_poll_mouse->root_y); - if (last_poll_mouse->root_x != -1 && this_poll_mouse->root_x != -1) - fprintf (stderr, " (%d,%d; %d/%lu=%d)", - ABS(last_poll_mouse->root_x - this_poll_mouse->root_x), - ABS(last_poll_mouse->root_y - this_poll_mouse->root_y), - distance, seconds, dps); - - fprintf (stderr, ".\n"); - } - - if (!moved_p && - mods_p && - this_poll_mouse->mask != last_poll_mouse->mask) - { - moved_p = True; - - if (p->debug_p) - fprintf (stderr, "%s: %s %d: modifiers changed: 0x%04x -> 0x%04x.\n", - blurb(), debug_type, debug_id, - last_poll_mouse->mask, this_poll_mouse->mask); - } - - last_poll_mouse->child = this_poll_mouse->child; - last_poll_mouse->mask = this_poll_mouse->mask; - - if (moved_p || seconds > 0) - { - last_poll_mouse->time = this_poll_mouse->time; - last_poll_mouse->root_x = this_poll_mouse->root_x; - last_poll_mouse->root_y = this_poll_mouse->root_y; - } - - return moved_p; -} - -/* Returns true if core mouse pointer has moved since the last time we checked. - */ -static Bool -pointer_moved_p (saver_screen_info *ssi, Bool mods_p) -{ - saver_info *si = ssi->global; - - Window root; - poll_mouse_data this_poll_mouse; - int x, y; - - /* don't check xinerama pseudo-screens. */ - if (!ssi->real_screen_p) return False; - - this_poll_mouse.time = time ((time_t *) 0); - - if (!XQueryPointer (si->dpy, ssi->screensaver_window, &root, - &this_poll_mouse.child, - &this_poll_mouse.root_x, &this_poll_mouse.root_y, - &x, &y, &this_poll_mouse.mask)) - { - /* If XQueryPointer() returns false, the mouse is not on this screen. - */ - this_poll_mouse.root_x = -1; - this_poll_mouse.root_y = -1; - this_poll_mouse.child = 0; - this_poll_mouse.mask = 0; - } - else - si->last_activity_screen = ssi; - - return device_pointer_moved_p(si, &(ssi->last_poll_mouse), &this_poll_mouse, - mods_p, "screen", ssi->number); -} - - -/* When we aren't using a server extension, this timer is used to periodically - wake up and poll the mouse position, which is possibly more reliable than - selecting motion events on every window. - */ -static void -check_pointer_timer (XtPointer closure, XtIntervalId *id) -{ - int i; - saver_info *si = (saver_info *) closure; - saver_preferences *p = &si->prefs; - Bool active_p = False; - - if (!si->using_proc_interrupts && - (si->using_xidle_extension || - si->using_mit_saver_extension || - si->using_sgi_saver_extension)) - /* If an extension is in use, we should not be polling the mouse. - Unless we're also checking /proc/interrupts, in which case, we should. - */ - abort (); - - if (id && *id == si->check_pointer_timer_id) /* this is us - it's expired */ - si->check_pointer_timer_id = 0; - - if (si->check_pointer_timer_id) /* only queue one at a time */ - XtRemoveTimeOut (si->check_pointer_timer_id); - - si->check_pointer_timer_id = /* now re-queue */ - XtAppAddTimeOut (si->app, p->pointer_timeout, check_pointer_timer, - (XtPointer) si); - - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - if (pointer_moved_p (ssi, True)) - active_p = True; - } - -#ifdef HAVE_PROC_INTERRUPTS - if (!active_p && - si->using_proc_interrupts && - proc_interrupts_activity_p (si)) - { - active_p = True; - } -#endif /* HAVE_PROC_INTERRUPTS */ - - if (active_p) - reset_timers (si); - - check_for_clock_skew (si); -} - - -/* An unfortunate situation is this: the saver is not active, because the - user has been typing. The machine is a laptop. The user closes the lid - and suspends it. The CPU halts. Some hours later, the user opens the - lid. At this point, Xt's timers will fire, and xscreensaver will blank - the screen. - - So far so good -- well, not really, but it's the best that we can do, - since the OS doesn't send us a signal *before* shutdown -- but if the - user had delayed locking (lockTimeout > 0) then we should start off - in the locked state, rather than only locking N minutes from when the - lid was opened. Also, eschewing fading is probably a good idea, to - clamp down as soon as possible. - - We only do this when we'd be polling the mouse position anyway. - This amounts to an assumption that machines with APM support also - have /proc/interrupts. - - Now here's a thing that sucks about this: if the user actually changes - the time of the machine, it will either trigger or delay the triggering - of a lock. On most systems, that requires root, but I'll bet at least - some GUI configs let non-root do it. Also, NTP attacks. - - On Linux 2.6.39+ systems, there exists clock_gettime(CLOCK_BOOTTIME) - which would allow us to detect the "laptop CPU had been halted" state - independently of changes in wall-clock time. But of course that's not - portable. - - When the wall clock changes, what do Xt timers do, anyway? If I have - a timer set for 30 seconds from now, and adjust the wall clock +15 seconds, - does the timer fire 30 seconds from now or 15? I actually have no idea. - It does not appear to be specified. - */ -static void -check_for_clock_skew (saver_info *si) -{ - saver_preferences *p = &si->prefs; - time_t now = time ((time_t *) 0); - long shift = now - si->last_wall_clock_time; - - if (p->debug_p) - { - int i = (si->last_wall_clock_time == 0 ? 0 : shift); - fprintf (stderr, - "%s: checking wall clock for hibernation (%d:%02d:%02d).\n", - blurb(), - (i / (60 * 60)), ((i / 60) % 60), (i % 60)); - } - - if (si->last_wall_clock_time != 0 && - shift > (p->timeout / 1000)) - { - if (p->verbose_p) - fprintf (stderr, "%s: wall clock has jumped by %ld:%02ld:%02ld%s\n", - blurb(), - (shift / (60 * 60)), ((shift / 60) % 60), (shift % 60), - (p->mode == DONT_BLANK ? " while saver disabled" : "")); - - /* If the saver is entirely disabled, there's no need to do the - emergency-blank-and-lock thing. - */ - if (p->mode != DONT_BLANK) - { - si->emergency_lock_p = True; - idle_timer ((XtPointer) si, 0); - } - } - - si->last_wall_clock_time = now; -} - - - -static void -dispatch_event (saver_info *si, XEvent *event) -{ - /* If this is for the splash dialog, pass it along. - Note that the password dialog is handled with its own event loop, - so events for that window will never come through here. - */ - if (si->splash_dialog && event->xany.window == si->splash_dialog) - handle_splash_event (si, event); - - XtDispatchEvent (event); -} - - -static void -swallow_unlock_typeahead_events (saver_info *si, XEvent *e) -{ - XEvent event; - char buf [100]; - int i = 0; - - memset (buf, 0, sizeof(buf)); - - event = *e; - - do - { - if (event.xany.type == KeyPress) - { - char s[2]; - int size = XLookupString ((XKeyEvent *) &event, s, 1, 0, 0); - if (size != 1) continue; - switch (*s) - { - case '\010': case '\177': /* Backspace */ - if (i > 0) i--; - break; - case '\025': case '\030': /* Erase line */ - case '\012': case '\015': /* Enter */ - case '\033': /* ESC */ - i = 0; - break; - case '\040': /* Space */ - if (i == 0) - break; /* ignore space at beginning of line */ - /* else, fall through */ - default: - buf [i++] = *s; - break; - } - } - - } while (i < sizeof(buf)-1 && - XCheckMaskEvent (si->dpy, KeyPressMask, &event)); - - buf[i] = 0; - - if (si->unlock_typeahead) - { - memset (si->unlock_typeahead, 0, strlen(si->unlock_typeahead)); - free (si->unlock_typeahead); - } - - if (i > 0) - si->unlock_typeahead = strdup (buf); - else - si->unlock_typeahead = 0; - - memset (buf, 0, sizeof(buf)); -} - - -/* methods of detecting idleness: - - explicitly informed by SGI SCREEN_SAVER server event; - explicitly informed by MIT-SCREEN-SAVER server event; - poll server idle time with XIDLE extension; - select events on all windows, and note absence of recent events; - note that /proc/interrupts has not changed in a while; - activated by clientmessage. - - methods of detecting non-idleness: - - read events on the xscreensaver window; - explicitly informed by SGI SCREEN_SAVER server event; - explicitly informed by MIT-SCREEN-SAVER server event; - select events on all windows, and note events on any of them; - note that a client updated their window's _NET_WM_USER_TIME property; - note that /proc/interrupts has changed; - deactivated by clientmessage. - - I trust that explains why this function is a big hairy mess. - - See the very long comment at the top of xscreensaver.c for why the - MIT-SCREEN-SAVER extension is garbage and should not be used. - */ -void -sleep_until_idle (saver_info *si, Bool until_idle_p) -{ - saver_preferences *p = &si->prefs; - - /* We have to go through this union bullshit because gcc-4.4.0 has - stricter struct-aliasing rules. Without this, the optimizer - can fuck things up. - */ - union { - XEvent x_event; -# ifdef HAVE_RANDR - XRRScreenChangeNotifyEvent xrr_event; -# endif /* HAVE_RANDR */ -# ifdef HAVE_MIT_SAVER_EXTENSION - XScreenSaverNotifyEvent sevent; -# endif /* HAVE_MIT_SAVER_EXTENSION */ - } event; - - /* We need to select events on all windows if we're not using any extensions. - Otherwise, we don't need to. */ - Bool scanning_all_windows = !(si->using_xidle_extension || - si->using_mit_saver_extension || - si->using_sgi_saver_extension); - - /* We need to periodically wake up and check for idleness if we're not using - any extensions, or if we're using the XIDLE extension. The other two - extensions explicitly deliver events when we go idle/non-idle, so we - don't need to poll. */ - Bool polling_for_idleness = !(si->using_mit_saver_extension || - si->using_sgi_saver_extension); - - /* Whether we need to periodically wake up and check to see if the mouse has - moved. We only need to do this when not using any extensions. The reason - this isn't the same as `polling_for_idleness' is that the "idleness" poll - can happen (for example) 5 minutes from now, whereas the mouse-position - poll should happen with low periodicity. We don't need to poll the mouse - position with the XIDLE extension, but we do need to periodically wake up - and query the server with that extension. For our purposes, polling - /proc/interrupts is just like polling the mouse position. It has to - happen on the same kind of schedule. */ - Bool polling_mouse_position = (si->using_proc_interrupts || - !(si->using_xidle_extension || - si->using_mit_saver_extension || - si->using_sgi_saver_extension) || - si->using_xinput_extension); - - const char *why = 0; /* What caused the idle-state to change? */ - - if (until_idle_p) - { - if (polling_for_idleness) - /* This causes a no-op event to be delivered to us in a while, so that - we come back around through the event loop again. */ - schedule_wakeup_event (si, p->timeout, p->debug_p); - - if (polling_mouse_position) - /* Check to see if the mouse has moved, and set up a repeating timer - to do so periodically (typically, every 5 seconds.) */ - check_pointer_timer ((XtPointer) si, 0); - } - - while (1) - { - XtAppNextEvent (si->app, &event.x_event); - - switch (event.x_event.xany.type) { - case 0: /* our synthetic "timeout" event has been signalled */ - if (until_idle_p) - { - Time idle; - - /* We may be idle; check one last time to see if the mouse has - moved, just in case the idle-timer went off within the 5 second - window between mouse polling. If the mouse has moved, then - check_pointer_timer() will reset last_activity_time. - */ - if (polling_mouse_position) - check_pointer_timer ((XtPointer) si, 0); - -#ifdef HAVE_XIDLE_EXTENSION - if (si->using_xidle_extension) - { - /* The XIDLE extension uses the synthetic event to prod us into - re-asking the server how long the user has been idle. */ - if (! XGetIdleTime (si->dpy, &idle)) - { - fprintf (stderr, "%s: XGetIdleTime() failed.\n", blurb()); - saver_exit (si, 1, 0); - } - } - else -#endif /* HAVE_XIDLE_EXTENSION */ -#ifdef HAVE_MIT_SAVER_EXTENSION - if (si->using_mit_saver_extension) - { - /* We don't need to do anything in this case - the synthetic - event isn't necessary, as we get sent specific events - to wake us up. In fact, this event generally shouldn't - be being delivered when the MIT extension is in use. */ - idle = 0; - } - else -#endif /* HAVE_MIT_SAVER_EXTENSION */ -#ifdef HAVE_SGI_SAVER_EXTENSION - if (si->using_sgi_saver_extension) - { - /* We don't need to do anything in this case - the synthetic - event isn't necessary, as we get sent specific events - to wake us up. In fact, this event generally shouldn't - be being delivered when the SGI extension is in use. */ - idle = 0; - } - else -#endif /* HAVE_SGI_SAVER_EXTENSION */ - { - /* Otherwise, no server extension is in use. The synthetic - event was to tell us to wake up and see if the user is now - idle. Compute the amount of idle time by comparing the - `last_activity_time' to the wall clock. The l_a_t was set - by calling `reset_timers()', which is called only in only - two situations: when polling the mouse position has revealed - the the mouse has moved (user activity) or when we have read - an event (again, user activity.) - */ - idle = 1000 * (si->last_activity_time - time ((time_t *) 0)); - } - - if (idle >= p->timeout) - { - /* Look, we've been idle long enough. We're done. */ - why = "timeout"; - goto DONE; - } - else if (si->emergency_lock_p) - { - /* Oops, the wall clock has jumped far into the future, so - we need to lock down in a hurry! */ - why = "large wall clock change"; - goto DONE; - } - else - { - /* The event went off, but it turns out that the user has not - yet been idle for long enough. So re-signal the event. - Be economical: if we should blank after 5 minutes, and the - user has been idle for 2 minutes, then set this timer to - go off in 3 minutes. - */ - if (polling_for_idleness) - schedule_wakeup_event (si, p->timeout - idle, p->debug_p); - } - } - break; - - case ClientMessage: - if (handle_clientmessage (si, &event.x_event, until_idle_p)) - { - why = "ClientMessage"; - goto DONE; - } - break; - - case CreateNotify: - /* A window has been created on the screen somewhere. If we're - supposed to scan all windows for events, prepare this window. */ - if (scanning_all_windows) - { - Window w = event.x_event.xcreatewindow.window; - start_notice_events_timer (si, w, p->debug_p); - } - break; - - case KeyPress: - case ButtonPress: - /* Ignore release events so that hitting ESC at the password dialog - doesn't result in the password dialog coming right back again when - the fucking release key is seen! */ - /* case KeyRelease:*/ - /* case ButtonRelease:*/ - case MotionNotify: - - if (p->debug_p) - { - Window root=0, window=0; - int x=-1, y=-1; - const char *type = 0; - if (event.x_event.xany.type == MotionNotify) - { - /*type = "MotionNotify";*/ - root = event.x_event.xmotion.root; - window = event.x_event.xmotion.window; - x = event.x_event.xmotion.x_root; - y = event.x_event.xmotion.y_root; - } - else if (event.x_event.xany.type == KeyPress) - { - type = "KeyPress"; - root = event.x_event.xkey.root; - window = event.x_event.xkey.window; - x = y = -1; - } - else if (event.x_event.xany.type == ButtonPress) - { - type = "ButtonPress"; - root = event.x_event.xkey.root; - window = event.x_event.xkey.window; - x = event.x_event.xmotion.x_root; - y = event.x_event.xmotion.y_root; - } - - if (type) - { - int i; - for (i = 0; i < si->nscreens; i++) - if (root == RootWindowOfScreen (si->screens[i].screen)) - break; - fprintf (stderr,"%s: %d: %s on 0x%lx", - blurb(), i, type, (unsigned long) window); - - /* Be careful never to do this unless in -debug mode, as - this could expose characters from the unlock password. */ - if (p->debug_p && event.x_event.xany.type == KeyPress) - { - KeySym keysym; - char c = 0; - XLookupString (&event.x_event.xkey, &c, 1, &keysym, 0); - fprintf (stderr, " (%s%s)", - (event.x_event.xkey.send_event ? "synthetic " : ""), - XKeysymToString (keysym)); - } - - if (x == -1) - fprintf (stderr, "\n"); - else - fprintf (stderr, " at %d,%d.\n", x, y); - } - } - - /* If any widgets want to handle this event, let them. */ - dispatch_event (si, &event.x_event); - - - /* If we got a MotionNotify event, figure out what screen it - was on and poll the mouse there: if the mouse hasn't moved - far enough to count as "real" motion, then ignore this - event. - */ - if (event.x_event.xany.type == MotionNotify) - { - int i; - for (i = 0; i < si->nscreens; i++) - if (event.x_event.xmotion.root == - RootWindowOfScreen (si->screens[i].screen)) - break; - if (i < si->nscreens) - { - if (!pointer_moved_p (&si->screens[i], False)) - continue; - } - } - - - /* We got a user event. - If we're waiting for the user to become active, this is it. - If we're waiting until the user becomes idle, reset the timers - (since now we have longer to wait.) - */ - if (!until_idle_p) - { - if (si->demoing_p && - (event.x_event.xany.type == MotionNotify || - event.x_event.xany.type == KeyRelease)) - /* When we're demoing a single hack, mouse motion doesn't - cause deactivation. Only clicks and keypresses do. */ - ; - else - { - /* If we're not demoing, then any activity causes deactivation. - */ - why = (event.x_event.xany.type == MotionNotify ?"mouse motion": - event.x_event.xany.type == KeyPress?"keyboard activity": - event.x_event.xany.type == ButtonPress ? "mouse click" : - "unknown user activity"); - goto DONE; - } - } - else - reset_timers (si); - - break; - - case PropertyNotify: - - /* Starting in late 2014, GNOME programs don't actually select for - or receive KeyPress events: they do it behind the scenes through - some kind of Input Method magic, even when running in an en_US - locale. However, those applications *do* update the WM_USER_TIME - property on their own windows every time they recieve a secret - KeyPress, so we must *also* monitor that property on every - window, and treat changes to it as identical to KeyPress. - - _NET_WM_USER_TIME is documented (such as it is) here: - - http://standards.freedesktop.org/wm-spec/latest/ar01s05.html - #idm139870829932528 - - Specifically: - - "Contains the XServer time at which last user activity in this - window took place. [...] A client [...] might, for example, - use the timestamp of the last KeyPress or ButtonPress event." - - As of early 2016, KDE4 does something really stupid, though: some - hidden power management thing reduces the display brightness 150 - seconds after the screen is blanked -- and sets a WM_USER_TIME - property on a hidden "kded4" window whose time is in the distant - past (the time at which the X server launched). - - So we ignore any WM_USER_TIME whose timestamp is more than a - couple seconds old. - */ - if (event.x_event.xproperty.state == PropertyNewValue && - event.x_event.xproperty.atom == XA_NET_WM_USER_TIME) - { - int threshold = 2; /* seconds */ - Bool bogus_p = True; - Window w = event.x_event.xproperty.window; - - Atom type; - int format; - unsigned long nitems, bytesafter; - unsigned char *data = 0; - Cardinal user_time = 0; - XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler); - - if (XGetWindowProperty (si->dpy, w, - XA_NET_WM_USER_TIME, 0L, 1L, False, - XA_CARDINAL, &type, &format, &nitems, - &bytesafter, &data) - == Success && - data && - type == XA_CARDINAL && - format == 32 && - nitems == 1) - { - long diff; - user_time = ((Cardinal *) data)[0]; - diff = event.x_event.xproperty.time - user_time; - if (diff >= 0 && diff < threshold) - bogus_p = False; - } - - if (data) XFree (data); - - why = "WM_USER_TIME"; - - if (p->debug_p) - { - XWindowAttributes xgwa; - int i; - - XGetWindowAttributes (si->dpy, w, &xgwa); - for (i = 0; i < si->nscreens; i++) - if (xgwa.root == RootWindowOfScreen (si->screens[i].screen)) - break; - fprintf (stderr,"%s: %d: %s = %ld%s on 0x%lx\n", - blurb(), i, why, (unsigned long) user_time, - (bogus_p ? " (bad)" : ""), - (unsigned long) w); - } - - XSync (si->dpy, False); - XSetErrorHandler (old_handler); - - if (bogus_p) - break; - else if (until_idle_p) - reset_timers (si); - else - goto DONE; - } - break; - - default: - -#ifdef HAVE_MIT_SAVER_EXTENSION - if (event.x_event.type == si->mit_saver_ext_event_number) - { - /* This event's number is that of the MIT-SCREEN-SAVER server - extension. This extension has one event number, and the event - itself contains sub-codes that say what kind of event it was - (an "idle" or "not-idle" event.) - */ - if (event.sevent.state == ScreenSaverOn) - { - int i = 0; - if (p->verbose_p) - fprintf (stderr, "%s: MIT ScreenSaverOn event received.\n", - blurb()); - - /* Get the "real" server window(s) out of the way as soon - as possible. */ - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - if (ssi->server_mit_saver_window && - window_exists_p (si->dpy, - ssi->server_mit_saver_window)) - XUnmapWindow (si->dpy, ssi->server_mit_saver_window); - } - - if (event.sevent.kind != ScreenSaverExternal) - { - fprintf (stderr, - "%s: ScreenSaverOn event wasn't of type External!\n", - blurb()); - } - - if (until_idle_p) - { - why = "MIT ScreenSaverOn"; - goto DONE; - } - } - else if (event.sevent.state == ScreenSaverOff) - { - if (p->verbose_p) - fprintf (stderr, "%s: MIT ScreenSaverOff event received.\n", - blurb()); - if (!until_idle_p) - { - why = "MIT ScreenSaverOff"; - goto DONE; - } - } - else - fprintf (stderr, - "%s: unknown MIT-SCREEN-SAVER event %d received!\n", - blurb(), event.sevent.state); - } - else - -#endif /* HAVE_MIT_SAVER_EXTENSION */ - - -#ifdef HAVE_SGI_SAVER_EXTENSION - if (event.x_event.type == (si->sgi_saver_ext_event_number + ScreenSaverStart)) - { - /* The SGI SCREEN_SAVER server extension has two event numbers, - and this event matches the "idle" event. */ - if (p->verbose_p) - fprintf (stderr, "%s: SGI ScreenSaverStart event received.\n", - blurb()); - - if (until_idle_p) - { - why = "SGI ScreenSaverStart"; - goto DONE; - } - } - else if (event.x_event.type == (si->sgi_saver_ext_event_number + - ScreenSaverEnd)) - { - /* The SGI SCREEN_SAVER server extension has two event numbers, - and this event matches the "idle" event. */ - if (p->verbose_p) - fprintf (stderr, "%s: SGI ScreenSaverEnd event received.\n", - blurb()); - if (!until_idle_p) - { - why = "SGI ScreenSaverEnd"; - goto DONE; - } - } - else -#endif /* HAVE_SGI_SAVER_EXTENSION */ - -#ifdef HAVE_XINPUT - /* If we got a MotionNotify event, check to see if the mouse has - moved far enough to count as "real" motion, if not, then ignore - this event. - */ - if ((si->num_xinput_devices > 0) && - (event.x_event.type == si->xinput_DeviceMotionNotify)) - { - XDeviceMotionEvent *dme = (XDeviceMotionEvent *) &event; - poll_mouse_data *last_poll_mouse = NULL; - int d; - - for (d = 0; d < si->num_xinput_devices; d++) - { - if (si->xinput_devices[d].device->device_id == dme->deviceid) - { - last_poll_mouse = &(si->xinput_devices[d].last_poll_mouse); - break; - } - } - - if (last_poll_mouse) - { - poll_mouse_data this_poll_mouse; - this_poll_mouse.root_x = dme->x_root; - this_poll_mouse.root_y = dme->y_root; - this_poll_mouse.child = dme->subwindow; - this_poll_mouse.mask = dme->device_state; - this_poll_mouse.time = dme->time / 1000; /* milliseconds */ - - if (!device_pointer_moved_p (si, last_poll_mouse, - &this_poll_mouse, False, - "device", dme->deviceid)) - continue; - } - else if (p->debug_p) - fprintf (stderr, - "%s: received MotionNotify from unknown device %d\n", - blurb(), (int) dme->deviceid); - } - - if ((!until_idle_p) && - (si->num_xinput_devices > 0) && - (event.x_event.type == si->xinput_DeviceMotionNotify || - event.x_event.type == si->xinput_DeviceButtonPress)) - /* Ignore DeviceButtonRelease, see ButtonRelease comment above. */ - { - - dispatch_event (si, &event.x_event); - if (si->demoing_p && - event.x_event.type == si->xinput_DeviceMotionNotify) - /* When we're demoing a single hack, mouse motion doesn't - cause deactivation. Only clicks and keypresses do. */ - ; - else - /* If we're not demoing, then any activity causes deactivation. - */ - { - why = (event.x_event.type == si->xinput_DeviceMotionNotify - ? "XI mouse motion" : - event.x_event.type == si->xinput_DeviceButtonPress - ? "XI mouse click" : "unknown XINPUT event"); - goto DONE; - } - } - else -#endif /* HAVE_XINPUT */ - -#ifdef HAVE_RANDR - if (si->using_randr_extension && - (event.x_event.type == - (si->randr_event_number + RRScreenChangeNotify))) - { - /* The Resize and Rotate extension sends an event when the - size, rotation, or refresh rate of any screen has changed. - */ - if (p->verbose_p) - { - /* XRRRootToScreen is in Xrandr.h 1.4, 2001/06/07 */ - int screen = XRRRootToScreen (si->dpy, event.xrr_event.window); - fprintf (stderr, "%s: %d: screen change event received\n", - blurb(), screen); - } - -# ifdef RRScreenChangeNotifyMask - /* Inform Xlib that it's ok to update its data structures. */ - XRRUpdateConfiguration (&event.x_event); /* Xrandr.h 1.9, 2002/09/29 */ -# endif /* RRScreenChangeNotifyMask */ - - /* Resize the existing xscreensaver windows and cached ssi data. */ - if (update_screen_layout (si)) - { - if (p->verbose_p) - { - fprintf (stderr, "%s: new layout:\n", blurb()); - describe_monitor_layout (si); - } - resize_screensaver_window (si); - } - } - else -#endif /* HAVE_RANDR */ - - /* Just some random event. Let the Widgets handle it, if desired. */ - dispatch_event (si, &event.x_event); - } - } - DONE: - - if (p->verbose_p) - { - if (! why) why = "unknown reason"; - fprintf (stderr, "%s: %s (%s)\n", blurb(), - (until_idle_p ? "user is idle" : "user is active"), - why); - } - - /* If there's a user event on the queue, swallow it. - If we're using a server extension, and the user becomes active, we - get the extension event before the user event -- so the keypress or - motion or whatever is still on the queue. This makes "unfade" not - work, because it sees that event, and bugs out. (This problem - doesn't exhibit itself without an extension, because in that case, - there's only one event generated by user activity, not two.) - */ - if (!until_idle_p && si->locked_p) - swallow_unlock_typeahead_events (si, &event.x_event); - else - while (XCheckMaskEvent (si->dpy, - (KeyPressMask|ButtonPressMask|PointerMotionMask), - &event.x_event)) - ; - - - if (si->check_pointer_timer_id) - { - XtRemoveTimeOut (si->check_pointer_timer_id); - si->check_pointer_timer_id = 0; - } - if (si->timer_id) - { - XtRemoveTimeOut (si->timer_id); - si->timer_id = 0; - } - - if (until_idle_p && si->cycle_id) /* no cycle timer when inactive */ - abort (); -} - - - -/* Some crap for dealing with /proc/interrupts. - - On Linux systems, it's possible to see the hardware interrupt count - associated with the keyboard. We can therefore use that as another method - of detecting idleness. - - Why is it a good idea to do this? Because it lets us detect keyboard - activity that is not associated with X events. For example, if the user - has switched to another virtual console, it's good for xscreensaver to not - be running graphics hacks on the (non-visible) X display. The common - complaint that checking /proc/interrupts addresses is that the user is - playing Quake on a non-X console, and the GL hacks are perceptibly slowing - the game... - - This is tricky for a number of reasons. - - * First, we must be sure to only do this when running on an X server that - is on the local machine (because otherwise, we'd be reacting to the - wrong keyboard.) The way we do this is by noting that the $DISPLAY is - pointing to display 0 on the local machine. It *could* be that display - 1 is also on the local machine (e.g., two X servers, each on a different - virtual-terminal) but it's also possible that screen 1 is an X terminal, - using this machine as the host. So we can't take that chance. - - * Second, one can only access these interrupt numbers in a completely - and utterly brain-damaged way. You would think that one would use an - ioctl for this. But no. The ONLY way to get this information is to - open the pseudo-file /proc/interrupts AS A FILE, and read the numbers - out of it TEXTUALLY. Because this is Unix, and all the world's a file, - and the only real data type is the short-line sequence of ASCII bytes. - - Now it's all well and good that the /proc/interrupts pseudo-file - exists; that's a clever idea, and a useful API for things that are - already textually oriented, like shell scripts, and users doing - interactive debugging sessions. But to make a *C PROGRAM* open a file - and parse the textual representation of integers out of it is just - insane. - - * Third, you can't just hold the file open, and fseek() back to the - beginning to get updated data! If you do that, the data never changes. - And I don't want to call open() every five seconds, because I don't want - to risk going to disk for any inodes. It turns out that if you dup() - it early, then each copy gets fresh data, so we can get around that in - this way (but for how many releases, one might wonder?) - - * Fourth, the format of the output of the /proc/interrupts file is - undocumented, and has changed several times already! In Linux 2.0.33, - even on a multiprocessor machine, it looks like this: - - 0: 309453991 timer - 1: 4771729 keyboard - - but in Linux 2.2 and 2.4 kernels with MP machines, it looks like this: - - CPU0 CPU1 - 0: 1671450 1672618 IO-APIC-edge timer - 1: 13037 13495 IO-APIC-edge keyboard - - and in Linux 2.6, it's gotten even goofier: now there are two lines - labelled "i8042". One of them is the keyboard, and one of them is - the PS/2 mouse -- and of course, you can't tell them apart, except - by wiggling the mouse and noting which one changes: - - CPU0 CPU1 - 1: 32051 30864 IO-APIC-edge i8042 - 12: 476577 479913 IO-APIC-edge i8042 - - Joy! So how are we expected to parse that? Well, this code doesn't - parse it: it saves the first line with the string "keyboard" (or - "i8042") in it, and does a string-comparison to note when it has - changed. If there are two "i8042" lines, we assume the first is - the keyboard and the second is the mouse (doesn't matter which is - which, really, as long as we don't compare them against each other.) - - Thanks to Nat Friedman for figuring out most of this crap. - - Note that if you have a serial or USB mouse, or a USB keyboard, it won't - detect it. That's because there's no way to tell the difference between a - serial mouse and a general serial port, and all USB devices look the same - from here. It would be somewhat unfortunate to have the screensaver turn - off when the modem on COM1 burped, or when a USB disk was accessed. - */ - - -#ifdef HAVE_PROC_INTERRUPTS - -#define PROC_INTERRUPTS "/proc/interrupts" - -Bool -query_proc_interrupts_available (saver_info *si, const char **why) -{ - /* We can use /proc/interrupts if $DISPLAY points to :0, and if the - "/proc/interrupts" file exists and is readable. - */ - FILE *f; - if (why) *why = 0; - - if (!display_is_on_console_p (si)) - { - if (why) *why = "not on primary console"; - return False; - } - - f = fopen (PROC_INTERRUPTS, "r"); - if (!f) - { - if (why) *why = "does not exist"; - return False; - } - - fclose (f); - return True; -} - - -static Bool -proc_interrupts_activity_p (saver_info *si) -{ - static FILE *f0 = 0; - FILE *f1 = 0; - int fd; - static char last_kbd_line[255] = { 0, }; - static char last_ptr_line[255] = { 0, }; - char new_line[sizeof(last_kbd_line)]; - Bool checked_kbd = False, kbd_changed = False; - Bool checked_ptr = False, ptr_changed = False; - int i8042_count = 0; - - if (!f0) - { - /* First time -- open the file. */ - f0 = fopen (PROC_INTERRUPTS, "r"); - if (!f0) - { - char buf[255]; - sprintf(buf, "%s: error opening %s", blurb(), PROC_INTERRUPTS); - perror (buf); - goto FAIL; - } - -# if defined(HAVE_FCNTL) && defined(FD_CLOEXEC) - /* Close this fd upon exec instead of inheriting / leaking it. */ - if (fcntl (fileno (f0), F_SETFD, FD_CLOEXEC) != 0) - perror ("fcntl: CLOEXEC:"); -# endif - } - - if (f0 == (FILE *) -1) /* means we got an error initializing. */ - return False; - - fd = dup (fileno (f0)); - if (fd < 0) - { - char buf[255]; - sprintf(buf, "%s: could not dup() the %s fd", blurb(), PROC_INTERRUPTS); - perror (buf); - goto FAIL; - } - - f1 = fdopen (fd, "r"); - if (!f1) - { - char buf[255]; - sprintf(buf, "%s: could not fdopen() the %s fd", blurb(), - PROC_INTERRUPTS); - perror (buf); - goto FAIL; - } - - /* Actually, I'm unclear on why this fseek() is necessary, given the timing - of the dup() above, but it is. */ - if (fseek (f1, 0, SEEK_SET) != 0) - { - char buf[255]; - sprintf(buf, "%s: error rewinding %s", blurb(), PROC_INTERRUPTS); - perror (buf); - goto FAIL; - } - - /* Now read through the pseudo-file until we find the "keyboard", - "PS/2 mouse", or "i8042" lines. */ - - while (fgets (new_line, sizeof(new_line)-1, f1)) - { - Bool i8042_p = !!strstr (new_line, "i8042"); - if (i8042_p) i8042_count++; - - if (strchr (new_line, ',')) - { - /* Ignore any line that has a comma on it: this is because - a setup like this: - - 12: 930935 XT-PIC usb-uhci, PS/2 Mouse - - is really bad news. It *looks* like we can note mouse - activity from that line, but really, that interrupt gets - fired any time any USB device has activity! So we have - to ignore any shared IRQs. - */ - } - else if (!checked_kbd && - (strstr (new_line, "keyboard") || - (i8042_p && i8042_count == 1))) - { - /* Assume the keyboard interrupt is the line that says "keyboard", - or the *first* line that says "i8042". - */ - kbd_changed = (*last_kbd_line && !!strcmp (new_line, last_kbd_line)); - strcpy (last_kbd_line, new_line); - checked_kbd = True; - } - else if (!checked_ptr && - (strstr (new_line, "PS/2 Mouse") || - (i8042_p && i8042_count == 2))) - { - /* Assume the mouse interrupt is the line that says "PS/2 mouse", - or the *second* line that says "i8042". - */ - ptr_changed = (*last_ptr_line && !!strcmp (new_line, last_ptr_line)); - strcpy (last_ptr_line, new_line); - checked_ptr = True; - } - - if (checked_kbd && checked_ptr) - break; - } - - if (checked_kbd || checked_ptr) - { - fclose (f1); - - if (si->prefs.debug_p && (kbd_changed || ptr_changed)) - fprintf (stderr, "%s: /proc/interrupts activity: %s\n", - blurb(), - ((kbd_changed && ptr_changed) ? "mouse and kbd" : - kbd_changed ? "kbd" : - ptr_changed ? "mouse" : "ERR")); - - return (kbd_changed || ptr_changed); - } - - - /* If we got here, we didn't find either a "keyboard" or a "PS/2 Mouse" - line in the file at all. */ - fprintf (stderr, "%s: no keyboard or mouse data in %s?\n", - blurb(), PROC_INTERRUPTS); - - FAIL: - if (f1) - fclose (f1); - - if (f0 && f0 != (FILE *) -1) - fclose (f0); - - f0 = (FILE *) -1; - return False; -} - -#endif /* HAVE_PROC_INTERRUPTS */ - - -/* This timer goes off every few minutes, whether the user is idle or not, - to try and clean up anything that has gone wrong. - - It calls disable_builtin_screensaver() so that if xset has been used, - or some other program (like xlock) has messed with the XSetScreenSaver() - settings, they will be set back to sensible values (if a server extension - is in use, messing with xlock can cause xscreensaver to never get a wakeup - event, and could cause monitor power-saving to occur, and all manner of - heinousness.) - - If the screen is currently blanked, it raises the window, in case some - other window has been mapped on top of it. - - If the screen is currently blanked, and there is no hack running, it - clears the window, in case there is an error message printed on it (we - don't want the error message to burn in.) - */ - -static void -watchdog_timer (XtPointer closure, XtIntervalId *id) -{ - saver_info *si = (saver_info *) closure; - saver_preferences *p = &si->prefs; - - disable_builtin_screensaver (si, False); - - /* If the DPMS settings on the server have changed, change them back to - what ~/.xscreensaver says they should be. */ - sync_server_dpms_settings (si->dpy, - (p->dpms_enabled_p && - p->mode != DONT_BLANK), - p->dpms_quickoff_p, - p->dpms_standby / 1000, - p->dpms_suspend / 1000, - p->dpms_off / 1000, - False); - - if (si->screen_blanked_p) - { - Bool running_p = screenhack_running_p (si); - - if (si->dbox_up_p) - { - if (si->prefs.debug_p) - fprintf (stderr, "%s: dialog box is up: not raising screen.\n", - blurb()); - } - else - { - if (si->prefs.debug_p) - fprintf (stderr, "%s: watchdog timer raising %sscreen.\n", - blurb(), (running_p ? "" : "and clearing ")); - - raise_window (si, True, True, running_p); - } - - if (screenhack_running_p (si) && - !monitor_powered_on_p (si)) - { - int i; - if (si->prefs.verbose_p) - fprintf (stderr, - "%s: X says monitor has powered down; " - "killing running hacks.\n", blurb()); - for (i = 0; i < si->nscreens; i++) - kill_screenhack (&si->screens[i]); - } - - /* Re-schedule this timer. The watchdog timer defaults to a bit less - than the hack cycle period, but is never longer than one hour. - */ - si->watchdog_id = 0; - reset_watchdog_timer (si, True); - } -} - - -void -reset_watchdog_timer (saver_info *si, Bool on_p) -{ - saver_preferences *p = &si->prefs; - - if (si->watchdog_id) - { - XtRemoveTimeOut (si->watchdog_id); - si->watchdog_id = 0; - } - - if (on_p && p->watchdog_timeout) - { - si->watchdog_id = XtAppAddTimeOut (si->app, p->watchdog_timeout, - watchdog_timer, (XtPointer) si); - - if (p->debug_p) - fprintf (stderr, "%s: restarting watchdog_timer (%ld, %ld)\n", - blurb(), p->watchdog_timeout, si->watchdog_id); - } -} - - -/* It's possible that a race condition could have led to the saver - window being unexpectedly still mapped. This can happen like so: - - - screen is blanked - - hack is launched - - that hack tries to grab a screen image (it does this by - first unmapping the saver window, then remapping it.) - - hack unmaps window - - hack waits - - user becomes active - - hack re-maps window (*) - - driver kills subprocess - - driver unmaps window (**) - - The race is that (*) might have been sent to the server before - the client process was killed, but, due to scheduling randomness, - might not have been received by the server until after (**). - In other words, (*) and (**) might happen out of order, meaning - the driver will unmap the window, and then after that, the - recently-dead client will re-map it. This leaves the user - locked out (it looks like a desktop, but it's not!) - - To avoid this: after un-blanking the screen, we launch a timer - that wakes up once a second for ten seconds, and makes damned - sure that the window is still unmapped. - */ - -void -de_race_timer (XtPointer closure, XtIntervalId *id) -{ - saver_info *si = (saver_info *) closure; - saver_preferences *p = &si->prefs; - int secs = 1; - - if (id == 0) /* if id is 0, this is the initialization call. */ - { - si->de_race_ticks = 10; - if (p->verbose_p) - fprintf (stderr, "%s: starting de-race timer (%d seconds.)\n", - blurb(), si->de_race_ticks); - } - else - { - int i; - XSync (si->dpy, False); - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - Window w = ssi->screensaver_window; - XWindowAttributes xgwa; - XGetWindowAttributes (si->dpy, w, &xgwa); - if (xgwa.map_state != IsUnmapped) - { - if (p->verbose_p) - fprintf (stderr, - "%s: %d: client race! emergency unmap 0x%lx.\n", - blurb(), i, (unsigned long) w); - XUnmapWindow (si->dpy, w); - } - else if (p->debug_p) - fprintf (stderr, "%s: %d: (de-race of 0x%lx is cool.)\n", - blurb(), i, (unsigned long) w); - } - XSync (si->dpy, False); - - si->de_race_ticks--; - } - - if (id && *id == si->de_race_id) - si->de_race_id = 0; - - if (si->de_race_id) abort(); - - if (si->de_race_ticks <= 0) - { - si->de_race_id = 0; - if (p->verbose_p) - fprintf (stderr, "%s: de-race completed.\n", blurb()); - } - else - { - si->de_race_id = XtAppAddTimeOut (si->app, secs * 1000, - de_race_timer, closure); - } -} diff --git a/driver/types.h b/driver/types.h index ebea9e03..d8e48807 100644 --- a/driver/types.h +++ b/driver/types.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1993-2020 Jamie Zawinski +/* xscreensaver, Copyright © 1993-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -14,15 +14,6 @@ typedef struct saver_info saver_info; -typedef enum { - ul_read, /* reading input or ready to do so */ - ul_success, /* auth success, unlock */ - ul_fail, /* auth fail */ - ul_cancel, /* user cancelled auth (pw_cancel or pw_null) */ - ul_time, /* timed out */ - ul_finished /* user pressed enter */ -} unlock_state; - typedef struct screenhack screenhack; struct screenhack { Bool enabled_p; @@ -39,44 +30,13 @@ typedef enum { TEXT_DATE, TEXT_LITERAL, TEXT_FILE, TEXT_PROGRAM, TEXT_URL } text_mode; -struct auth_message; -struct auth_response; - -typedef int (*auth_conv_cb_t) ( - int num_msg, - const struct auth_message *msg, - struct auth_response **resp, - saver_info *si); - typedef struct saver_preferences saver_preferences; typedef struct saver_screen_info saver_screen_info; -typedef struct passwd_dialog_data passwd_dialog_data; -typedef struct splash_dialog_data splash_dialog_data; -typedef struct _monitor monitor; - -typedef struct poll_mouse_data poll_mouse_data; -struct poll_mouse_data { - int root_x; - int root_y; - Window child; - unsigned int mask; - time_t time; -}; - -#ifdef HAVE_XINPUT -/* XInputExtension device support */ -#include -typedef struct xinput_dev_info xinput_dev_info; -struct xinput_dev_info { - XDevice *device; - XEventClass press, release, valuator; - poll_mouse_data last_poll_mouse; -}; -#endif /* This structure holds all the user-specified parameters, read from the command line, the resource database, or entered through a dialog box. + It is used by xscreensaver-gfx and xscreensaver-settings; */ struct saver_preferences { @@ -89,23 +49,20 @@ struct saver_preferences { wrote it. */ Bool verbose_p; /* whether to print out lots of status info */ - Bool timestamp_p; /* whether to mark messages with a timestamp */ - Bool capture_stderr_p; /* whether to redirect stdout/stderr */ Bool ignore_uninstalled_p; /* whether to avoid displaying or complaining about hacks that are not on $PATH */ Bool debug_p; /* pay no mind to the man behind the curtain */ - Bool xsync_p; /* whether XSynchronize has been called */ + Bool xsync_p; /* whether to XSynchronize */ Bool lock_p; /* whether to lock as well as save */ Bool fade_p; /* whether to fade to black, if possible */ Bool unfade_p; /* whether to fade from black, if possible */ Time fade_seconds; /* how long that should take */ - int fade_ticks; /* how many ticks should be used */ Bool splash_p; /* whether to do a splash screen at startup */ Bool install_cmap_p; /* whether we should use our own colormap - when using the screen's default visual. */ + when using the screen's default visual */ # ifdef QUAD_MODE Bool quad_p; /* whether to run four savers per monitor */ @@ -118,21 +75,17 @@ struct saver_preferences { int selected_hack; /* in one_hack mode, this is the one */ int nice_inferior; /* nice value for subprocs */ - int inferior_memory_limit; /* setrlimit(LIMIT_AS) value for subprocs */ - Time initial_delay; /* how long to sleep after launch */ Time splash_duration; /* how long the splash screen stays up */ Time timeout; /* how much idle time before activation */ Time lock_timeout; /* how long after activation locking starts */ Time cycle; /* how long each hack should run */ - Time passwd_timeout; /* how much time before pw dialog goes down */ - Time pointer_timeout; /* how often to check mouse position */ - Time notice_events_timeout; /* how long after window creation to select */ + Time passwd_timeout; /* how long before pw dialog goes down */ Time watchdog_timeout; /* how often to re-raise and re-blank screen */ int pointer_hysteresis; /* mouse motions less than N/sec are ignored */ - Bool dpms_enabled_p; /* Whether to power down the monitor */ - Bool dpms_quickoff_p; /* Whether to power down monitor immediately + Bool dpms_enabled_p; /* whether to power down the monitor */ + Bool dpms_quickoff_p; /* whether to power down monitor immediately in "Blank Only" mode */ Time dpms_standby; /* how long until monitor goes black */ Time dpms_suspend; /* how long until monitor power-saves */ @@ -141,7 +94,7 @@ struct saver_preferences { Bool grab_desktop_p; /* These are not used by "xscreensaver" */ Bool grab_video_p; /* itself: they are used by the external */ Bool random_image_p; /* "xscreensaver-getimage" program, and set */ - char *image_directory; /* by the "xscreensaver-demo" configurator. */ + char *image_directory; /* by "xscreensaver-settings". */ text_mode tmode; /* How we generate text to display. */ char *text_literal; /* used when tmode is TEXT_LITERAL. */ @@ -149,21 +102,13 @@ struct saver_preferences { char *text_program; /* used when tmode is TEXT_PROGRAM. */ char *text_url; /* used when tmode is TEXT_URL. */ - Bool use_xidle_extension; /* which extension to use, if possible */ - Bool use_mit_saver_extension; - Bool use_sgi_saver_extension; - Bool use_proc_interrupts; - Bool use_xinput_extension; - - Bool getviewport_full_of_lies_p; /* XFree86 bug #421 */ - char *shell; /* where to find /bin/sh */ char *demo_command; /* How to enter demo mode. */ - char *prefs_command; /* How to edit preferences. */ char *help_url; /* Where the help document resides. */ char *load_url_command; /* How one loads URLs. */ char *new_login_command; /* Command for the "New Login" button. */ + char *dialog_theme; /* Color scheme on the unlock dialog */ int auth_warning_slack; /* Don't warn about login failures if they all happen within this many seconds of @@ -172,188 +117,46 @@ struct saver_preferences { /* This structure holds all the data that applies to the program as a whole, or to the non-screen-specific parts of the display connection. - - The saver_preferences structure (prefs.h) holds all the user-specified - parameters, read from the command line, the resource database, or entered - through a dialog box. + It is used only by xscreensaver-gfx. */ struct saver_info { + + XtAppContext app; + Display *dpy; + char *version; saver_preferences prefs; int nscreens; int ssi_count; saver_screen_info *screens; - saver_screen_info *default_screen; /* ...on which dialogs will appear. */ - monitor **monitor_layout; /* private to screens.c */ + struct _monitor **monitor_layout; /* private to screens.c */ Visual **best_gl_visuals; /* visuals for GL hacks on screen N */ + void *fade_state; /* fade.c private data */ - /* ======================================================================= - global connection info - ======================================================================= */ - - XtAppContext app; - Display *dpy; - - /* ======================================================================= - server extension info - ======================================================================= */ - - Bool using_xidle_extension; /* which extension is being used. */ - Bool using_mit_saver_extension; /* Note that `p->use_*' is the *request*, */ - Bool using_sgi_saver_extension; /* and `si->using_*' is the *reality*. */ - Bool using_proc_interrupts; - -# ifdef HAVE_MIT_SAVER_EXTENSION - int mit_saver_ext_event_number; - int mit_saver_ext_error_number; -# endif -# ifdef HAVE_SGI_SAVER_EXTENSION - int sgi_saver_ext_event_number; - int sgi_saver_ext_error_number; -# endif # ifdef HAVE_RANDR int randr_event_number; int randr_error_number; Bool using_randr_extension; # endif - Bool using_xinput_extension; /* Note that `p->use_*' is the *request*, */ - /* and `si->using_*' is the *reality*. */ -#ifdef HAVE_XINPUT - int xinput_ext_event_number; /* may not be used */ - int xinput_ext_error_number; - int xinput_DeviceButtonPress; /* Extension device event codes. */ - int xinput_DeviceButtonRelease; /* Assigned by server at runtime */ - int xinput_DeviceMotionNotify; - xinput_dev_info *xinput_devices; - int num_xinput_devices; -# endif - - /* ======================================================================= - blanking - ======================================================================= */ - - Bool screen_blanked_p; /* Whether the saver is currently active. */ - Window mouse_grab_window; /* Window holding our mouse grab */ - Window keyboard_grab_window; /* Window holding our keyboard grab */ - int mouse_grab_screen; /* The screen number the mouse grab is on */ - int keyboard_grab_screen; /* The screen number the keyboard grab is on */ - Bool fading_possible_p; /* Whether fading to/from black is possible. */ - Bool throttled_p; /* Whether we should temporarily just blank - the screen, not run hacks. (Deprecated: - users should use "xset dpms force off" - instead.) */ - time_t blank_time; /* The time at which the screen was blanked - (if currently blanked) or unblanked (if - not blanked.) */ - - - /* ======================================================================= - locking and runtime privileges - ======================================================================= */ - - Bool locked_p; /* Whether the screen is currently locked. */ - Bool dbox_up_p; /* Whether the demo-mode or passwd dialogs - are currently visible */ - - Bool locking_disabled_p; /* Sometimes locking is impossible. */ - char *nolock_reason; /* This is why. */ - - char *orig_uid; /* What uid/gid we had at startup, before - discarding privileges. */ - char *uid_message; /* Any diagnostics from our attempt to - discard privileges (printed only in - -verbose mode.) */ - Bool dangerous_uid_p; /* Set to true if we're running as a user id - which is known to not be a normal, non- - privileged user. */ - - Window passwd_dialog; /* The password dialog, if it's up. */ - passwd_dialog_data *pw_data; /* Other info necessary to draw it. */ - - int unlock_failures; /* Counts failed login attempts while the - screen is locked. */ - time_t unlock_failure_time; /* Time of first failed login attempt. */ - time_t unlock_dismiss_time; /* Time lock dialog most recently dismissed. */ - - char *unlock_typeahead; /* If the screen is locked, and the user types - a character, we assume that it is the first - character of the password. It's stored here - for the password dialog to use to populate - itself. */ - - char *user; /* The user whose session is locked. */ - char *cached_passwd; /* Cached password, used to avoid multiple - prompts for password-only auth mechanisms.*/ - unlock_state unlock_state; - - auth_conv_cb_t unlock_cb; /* The function used to prompt for creds. */ - void (*auth_finished_cb) (saver_info *si); - /* Called when authentication has finished, - regardless of success or failure. - May be NULL. */ - - - /* ======================================================================= - demoing - ======================================================================= */ - Bool demoing_p; /* Whether we are demoing a single hack (without UI.) */ - - Window splash_dialog; /* The splash dialog, if its up. */ - splash_dialog_data *sp_data; /* Other info necessary to draw it. */ - - - /* ======================================================================= - timers - ======================================================================= */ - - XtIntervalId lock_id; /* Timer to implement `prefs.lock_timeout' */ - XtIntervalId cycle_id; /* Timer to implement `prefs.cycle' */ - XtIntervalId timer_id; /* Timer to implement `prefs.timeout' */ + Bool emergency_p; /* Restarted because of a crash */ XtIntervalId watchdog_id; /* Timer to implement `prefs.watchdog */ - XtIntervalId check_pointer_timer_id; /* `prefs.pointer_timeout' */ - - XtIntervalId de_race_id; /* Timer to make sure screen un-blanks */ - int de_race_ticks; - - time_t last_activity_time; /* Used only when no server exts. */ - time_t last_wall_clock_time; /* Used to detect laptop suspend. */ - saver_screen_info *last_activity_screen; - - Bool emergency_lock_p; /* Set when the wall clock has jumped - (presumably due to laptop suspend) and we - need to lock down right away instead of - waiting for the lock timer to go off. */ - - - /* ======================================================================= - remote control - ======================================================================= */ int selection_mode; /* Set to -1 if the NEXT ClientMessage has just been received; set to -2 if PREV has just been received; set to N if SELECT or DEMO N has been received. (This is kind of nasty.) */ - - /* ======================================================================= - subprocs - ======================================================================= */ - - XtIntervalId stderr_popup_timer; - -# ifdef HAVE_LIBSYSTEMD - pid_t systemd_pid; -# endif }; + /* This structure holds all the data that applies to the screen-specific parts of the display connection; if the display has multiple screens, there will - be one of these for each screen. - */ + be one of these for each screen. It is used only by xscreensaver-gfx. +*/ struct saver_screen_info { saver_info *global; @@ -370,17 +173,10 @@ struct saver_screen_info { Bool real_screen_p; /* This will be true of exactly one ssi per X screen. */ - Widget toplevel_shell; - - /* ======================================================================= - blanking - ======================================================================= */ - Window screensaver_window; /* The window that will impersonate the root, - when the screensaver activates. Note that - the window stored here may change, as we - destroy and recreate it on different - visuals. */ + Window screensaver_window; /* The window on which hacks are drawn. This + window might be destroyed and re-created as + hacks cycle. */ Colormap cmap; /* The colormap that goes with the window. */ Bool install_cmap_p; /* Whether this screen should have its own colormap installed, for whichever of several @@ -392,55 +188,31 @@ struct saver_screen_info { Visual *default_visual; /* visual to use when none other specified */ - Window real_vroot; /* The original virtual-root window. */ - Window real_vroot_value; /* What was in the __SWM_VROOT property. */ - Cursor cursor; /* A blank cursor that goes with the real root window. */ unsigned long black_pixel; /* Black, allocated from `cmap'. */ - - int blank_vp_x, blank_vp_y; /* Where the virtual-scrolling viewport was - when the screen went blank. We need to - prevent the X server from letting the mouse - bump the edges to scroll while the screen - is locked, so we reset to this when it has - moved, and the lock dialog is up... */ - -# ifdef HAVE_MIT_SAVER_EXTENSION - Window server_mit_saver_window; -# endif + Window error_dialog; /* Error message about crashed savers */ - /* ======================================================================= - demoing - ======================================================================= */ - - Colormap demo_cmap; /* The colormap that goes with the dialogs: - this might be the same as `cmap' so care - must be taken not to free it while it's - still in use. */ - - /* ======================================================================= - timers - ======================================================================= */ + XtIntervalId cycle_id; /* Timer to implement `prefs.cycle' */ + time_t cycle_at; /* When cycle_id will fire */ + int current_hack; /* Index into `prefs.screenhacks' */ + pid_t pid; +}; - poll_mouse_data last_poll_mouse; /* Used only when no server exts. */ - /* ======================================================================= - subprocs - ======================================================================= */ +/* From dpms.c */ +extern void sync_server_dpms_settings (Display *, struct saver_preferences *); - int current_hack; /* Index into `prefs.screenhacks' */ - pid_t pid; - int stderr_text_x; - int stderr_text_y; - int stderr_line_height; - XFontStruct *stderr_font; - GC stderr_gc; - Window stderr_overlay_window; /* Used if the server has overlay planes */ - Colormap stderr_cmap; -}; +const char *init_file_name (void); +extern Bool init_file_changed_p (saver_preferences *); +extern void load_init_file (Display *, saver_preferences *); +extern int write_init_file (Display *, + saver_preferences *, const char *version_string, + Bool verbose_p); +extern Bool senescent_p (void); +char *make_hack_name (Display *, const char *shell_command); #endif /* __XSCREENSAVER_TYPES_H__ */ diff --git a/driver/vms-getpwnam.c b/driver/vms-getpwnam.c deleted file mode 100644 index ec0650c9..00000000 --- a/driver/vms-getpwnam.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * getpwnam(name) - retrieves a UAF entry - * - * Author: Patrick L. Mahan - * Location: TGV, Inc - * Date: 15-Nov-1991 - * - * Purpose: Provides emulation for the UNIX getpwname routine. - * - * Modification History - * - * Date | Who | Version | Reason - * ------------+-----------+---------------+--------------------------- - * 15-Nov-1991 | PLM | 1.0 | First Write - */ - -#define PASSWDROUTINES - -#include -#include -#include -#include -#include -#include -#include "vms-pwd.h" - -struct uic { - unsigned short uid; - unsigned short gid; -}; - -#define TEST(ptr, str) { if (ptr == NULL) { \ - fprintf(stderr, "getpwnam: memory allocation failure for \"%s\"\n", \ - str); \ - return ((struct passwd *)(NULL)); \ - } } - -struct passwd *getpwnam(name) -char *name; -{ - int istatus; - int UserNameLen; - int UserOwnerLen; - int UserDeviceLen; - int UserDirLen; - static char UserName[13]; - static char UserOwner[32]; - static char UserDevice[32]; - static char UserDir[64]; - char *cptr, *sptr; - unsigned long int UserPwd[2]; - unsigned short int UserSalt; - unsigned long int UserEncrypt; - struct uic UicValue; - struct passwd *entry; - - struct dsc$descriptor_s VMSNAME = - {strlen(name), DSC$K_DTYPE_T, DSC$K_CLASS_S, name}; - - struct itmlist3 { - unsigned short int length; - unsigned short int item; - unsigned long int addr; - unsigned long int retaddr; - } ItemList[] = { - {12, UAI$_USERNAME, (unsigned long)&UserName, (unsigned long)&UserNameLen}, - {8, UAI$_PWD, (unsigned long)&UserPwd, 0}, - {4, UAI$_UIC, (unsigned long)&UicValue, 0}, - {32, UAI$_OWNER, (unsigned long)&UserOwner, (unsigned long)&UserOwnerLen}, - {32, UAI$_DEFDEV, (unsigned long)&UserDevice, (unsigned long)&UserDeviceLen}, - {64, UAI$_DEFDIR, (unsigned long)&UserDir, (unsigned long)&UserDirLen}, - {2, UAI$_SALT, (unsigned long)&UserSalt, 0}, - {4, UAI$_ENCRYPT, (unsigned long)&UserEncrypt, 0}, - {0, 0, 0, 0} - }; - - UserNameLen = 0; - istatus = sys$getuai (0, 0, &VMSNAME, &ItemList, 0, 0, 0); - - if (!(istatus & 1)) { - fprintf (stderr, "getpwnam: unable to retrieve passwd entry for %s\n", - name); - fprintf (stderr, "getpwnam: vms error number is 0x%x\n", istatus); - return ((struct passwd *)NULL); - } - - entry = (struct passwd *) calloc (1, sizeof(struct passwd)); - TEST(entry, "PASSWD_ENTRY"); - - entry->pw_uid = UicValue.uid; - entry->pw_gid = UicValue.gid; - entry->pw_salt = UserSalt; - entry->pw_encrypt = UserEncrypt; - - sptr = UserName; - cptr = calloc (UserNameLen+1, sizeof(char)); - TEST(cptr, "USERNAME"); - strncpy (cptr, sptr, UserNameLen); - cptr[UserNameLen] = '\0'; - entry->pw_name = cptr; - - cptr = calloc(8, sizeof(char)); - TEST(cptr, "PASSWORD"); - memcpy(cptr, UserPwd, 8); - entry->pw_passwd = cptr; - - sptr = UserOwner; sptr++; - cptr = calloc ((int)UserOwner[0]+1, sizeof(char)); - TEST(cptr, "FULLNAME"); - strncpy (cptr, sptr, (int)UserOwner[0]); - cptr[(int)UserOwner[0]] = '\0'; - entry->pw_gecos = cptr; - - cptr = calloc ((int)UserDevice[0]+(int)UserDir[0]+1, sizeof(char)); - TEST(cptr, "HOME"); - sptr = UserDevice; sptr++; - strncpy (cptr, sptr, (int)UserDevice[0]); - sptr = UserDir; sptr++; - strncat (cptr, sptr, (int)UserDir[0]); - cptr[(int)UserDevice[0]+(int)UserDir[0]] = '\0'; - entry->pw_dir = cptr; - - cptr = calloc (strlen("SYS$SYSTEM:LOGINOUT.EXE")+1, sizeof(char)); - TEST(cptr,"SHELL"); - strcpy (cptr, "SYS$SYSTEM:LOGINOUT.EXE"); - entry->pw_shell = cptr; - - return (entry); -} diff --git a/driver/vms-hpwd.c b/driver/vms-hpwd.c deleted file mode 100644 index 707e3ea5..00000000 --- a/driver/vms-hpwd.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * VAX/VMS Password hashing routines: - * - * uses the System Service SYS$HASH_PASSWORD - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#include -#include -#include -#include -/* - * Hashing routine - */ -hash_vms_password(output_buf,input_buf,input_length,username,encryption_type,salt) -char *output_buf; -char *input_buf; -int input_length; -char *username; -int encryption_type; -unsigned short salt; -{ - struct dsc$descriptor_s password; - struct dsc$descriptor_s user; - - /* - * Check the VMS Version. If this is V5.4 or later, then - * we can use the new system service SYS$HASH_PASSWORD. Else - * fail and return garbage. - */ - - static char VMS_Version[32]; - struct { - unsigned short int Size; - unsigned short int Code; - char *Buffer; - unsigned short int *Resultant_Size; - } Item_List[2]={32, SYI$_VERSION, VMS_Version, 0, 0, 0}; - struct {int Size; char *Ptr;} Descr1; - - /* - * Get the information - */ - sys$getsyiw(0,0,0,Item_List,0,0,0); - /* - * Call the old routine if this isn't V5.4 or later... - */ -#ifndef __DECC - if ((VMS_Version[1] < '5') || - ((VMS_Version[1] == '5') && (VMS_Version[3] < '4'))) { - printf("Unsupported OS version\n"); - return(1); - } -#endif /* !__DECC */ - /* - * Call the SYS$HASH_PASSWORD system service... - */ - password.dsc$b_dtype = DSC$K_DTYPE_T; - password.dsc$b_class = DSC$K_CLASS_S; - password.dsc$w_length = input_length; - password.dsc$a_pointer = input_buf; - user.dsc$b_dtype = DSC$K_DTYPE_T; - user.dsc$b_class = DSC$K_CLASS_S; - user.dsc$w_length = strlen(username); - user.dsc$a_pointer = username; - sys$hash_password (&password, encryption_type, salt, &user, output_buf); -} diff --git a/driver/vms-pwd.h b/driver/vms-pwd.h deleted file mode 100644 index 6cb73d3e..00000000 --- a/driver/vms-pwd.h +++ /dev/null @@ -1,48 +0,0 @@ -/* @(#)pwd.h 1.7 89/08/24 SMI; from S5R2 1.1 */ - -#ifndef __pwd_h -#define __pwd_h - -#ifdef vax11c -#include -#else -#include -#endif /* vax11c */ - -#ifdef PASSWDROUTINES -#define EXTERN -#else -#define EXTERN extern -#endif /* PASSWDROUTINES */ - -struct passwd { - char *pw_name; - char *pw_passwd; - int pw_uid; - int pw_gid; - short pw_salt; - int pw_encrypt; - char *pw_age; - char *pw_comment; - char *pw_gecos; - char *pw_dir; - char *pw_shell; -}; - - -#ifndef _POSIX_SOURCE -extern struct passwd *getpwent(); - -struct comment { - char *c_dept; - char *c_name; - char *c_acct; - char *c_bin; -}; - -#endif - -EXTERN struct passwd *getpwuid(/* uid_t uid */); -EXTERN struct passwd *getpwnam(/* char *name */); - -#endif /* !__pwd_h */ diff --git a/driver/vms-validate.c b/driver/vms-validate.c deleted file mode 100644 index 8f7141d6..00000000 --- a/driver/vms-validate.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * validate a password for a user - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ - -/* - * Includes - */ -#include -#include -#include - -#include "vms-pwd.h" -int hash_vms_password(char *output_buf,char *input_buf,int input_length, - char *username,int encryption_type,unsigned short salt); - -/* - * - * Validate a VMS UserName/Password pair. - * - */ - -int validate_user(name,password) -char *name; -char *password; -{ - char password_buf[64]; - char username_buf[31]; - char encrypt_buf[8]; - register int i; - register char *cp,*cp1; - struct passwd *user_entry; - - /* - * Get the users UAF entry - */ - user_entry = getpwnam(name); - - /* - * If user_entry == NULL then we got a bad error - * return -1 to indicate a bad error - */ - if (user_entry == NULL) return (-1); - - /* - * Uppercase the password - */ - cp = password; - cp1 = password_buf; - while (*cp) - if (islower(*cp)) - *cp1++ = toupper(*cp++); - else - *cp1++ = *cp++; - /* - * Get the length of the password - */ - i = strlen(password); - /* - * Encrypt the password - */ - hash_vms_password(encrypt_buf,password_buf,i,user_entry->pw_name, - user_entry->pw_encrypt, user_entry->pw_salt); - if (memcmp(encrypt_buf,user_entry->pw_passwd,8) == 0) - return(1); - else return(0); -} - diff --git a/driver/vms_axp.opt b/driver/vms_axp.opt deleted file mode 100644 index 04d465df..00000000 --- a/driver/vms_axp.opt +++ /dev/null @@ -1,5 +0,0 @@ -[-.UTILS]UTILS.OLB_AXP/LIB -SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE -SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE -SYS$SHARE:DECW$XTSHR.EXE/SHARE -SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/driver/vms_axp_12.opt b/driver/vms_axp_12.opt deleted file mode 100644 index 25dd1f18..00000000 --- a/driver/vms_axp_12.opt +++ /dev/null @@ -1,5 +0,0 @@ -[-.UTILS]UTILS.OLB_AXP/LIB -SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE -SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE -SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE -SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/driver/vms_decc.opt b/driver/vms_decc.opt deleted file mode 100644 index 65bec033..00000000 --- a/driver/vms_decc.opt +++ /dev/null @@ -1,5 +0,0 @@ -[-.UTILS]UTILS.OLB_DECC/LIB -SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE -SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE -SYS$SHARE:DECW$XTSHR.EXE/SHARE -SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/driver/vms_decc_12.opt b/driver/vms_decc_12.opt deleted file mode 100644 index fdd9a802..00000000 --- a/driver/vms_decc_12.opt +++ /dev/null @@ -1,5 +0,0 @@ -[-.UTILS]UTILS.OLB_DECC/LIB -SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE -SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE -SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE -SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/driver/windows.c b/driver/windows.c index c19b93c0..c9cdf9d2 100644 --- a/driver/windows.c +++ b/driver/windows.c @@ -1,5 +1,5 @@ /* windows.c --- turning the screen black; dealing with visuals, virtual roots. - * xscreensaver, Copyright (c) 1991-2020 Jamie Zawinski + * xscreensaver, Copyright © 1991-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -14,41 +14,17 @@ # include "config.h" #endif -#ifdef VMS -# include /* for getpid() */ -# include "vms-gtod.h" /* for gettimeofday() */ -#endif /* VMS */ - -#ifndef VMS -# include /* for getpwuid() */ -#else /* VMS */ -# include "vms-pwd.h" -#endif /* VMS */ - #ifdef HAVE_UNAME # include /* for uname() */ #endif /* HAVE_UNAME */ #include -/* #include / * for CARD32 */ +#include /* for getpwuid() */ #include #include /* for XSetClassHint() */ #include -#include /* for time() */ -#include /* for the signal names */ +#include #include -#include - -/* You might think that to store an array of 32-bit quantities onto a - server-side property, you would pass an array of 32-bit data quantities - into XChangeProperty(). You would be wrong. You have to use an array - of longs, even if long is 64 bits (using 32 of each 64.) - */ -typedef long PROP32; - -#ifdef HAVE_MIT_SAVER_EXTENSION -# include -#endif /* HAVE_MIT_SAVER_EXTENSION */ #ifdef HAVE_XF86VMODE # include @@ -58,1119 +34,98 @@ typedef long PROP32; # include #endif /* HAVE_XINERAMA */ -/* This file doesn't need the Xt headers, so stub these types out... */ -#undef XtPointer -#define XtAppContext void* -#define XrmDatabase void* -#define XtIntervalId unsigned long -#define XtPointer void* -#define Widget void* - #include "xscreensaver.h" +#include "atoms.h" #include "visual.h" +#include "screens.h" #include "fade.h" +#include "resources.h" +#include "xft.h" +#include "font-retry.h" extern int kill (pid_t, int); /* signal() is in sys/signal.h... */ -Atom XA_VROOT, XA_XSETROOT_ID, XA_ESETROOT_PMAP_ID, XA_XROOTPMAP_ID; -Atom XA_NET_WM_USER_TIME; -Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID; -Atom XA_SCREENSAVER_STATUS; - -extern saver_info *global_si_kludge; /* I hate C so much... */ - -static void maybe_transfer_grabs (saver_screen_info *ssi, - Window old_w, Window new_w, int new_screen); - -#define ALL_POINTER_EVENTS \ - (ButtonPressMask | ButtonReleaseMask | EnterWindowMask | \ - LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | \ - Button1MotionMask | Button2MotionMask | Button3MotionMask | \ - Button4MotionMask | Button5MotionMask | ButtonMotionMask) - - -static const char * -grab_string(int status) -{ - switch (status) - { - case GrabSuccess: return "GrabSuccess"; - case AlreadyGrabbed: return "AlreadyGrabbed"; - case GrabInvalidTime: return "GrabInvalidTime"; - case GrabNotViewable: return "GrabNotViewable"; - case GrabFrozen: return "GrabFrozen"; - default: - { - static char foo[255]; - sprintf(foo, "unknown status: %d", status); - return foo; - } - } -} - -static int -grab_kbd(saver_info *si, Window w, int screen_no) -{ - saver_preferences *p = &si->prefs; - int status = XGrabKeyboard (si->dpy, w, True, - /* I don't really understand Sync vs Async, - but these seem to work... */ - GrabModeSync, GrabModeAsync, - CurrentTime); - if (status == GrabSuccess) - { - si->keyboard_grab_window = w; - si->keyboard_grab_screen = screen_no; - } - - if (p->verbose_p) - fprintf(stderr, "%s: %d: grabbing keyboard on 0x%lx... %s.\n", - blurb(), screen_no, (unsigned long) w, grab_string(status)); - return status; -} - - -static int -grab_mouse (saver_info *si, Window w, Cursor cursor, int screen_no) -{ - saver_preferences *p = &si->prefs; - int status = XGrabPointer (si->dpy, w, True, ALL_POINTER_EVENTS, - GrabModeAsync, GrabModeAsync, w, - cursor, CurrentTime); - if (status == GrabSuccess) - { - si->mouse_grab_window = w; - si->mouse_grab_screen = screen_no; - } - - if (p->verbose_p) - fprintf(stderr, "%s: %d: grabbing mouse on 0x%lx... %s.\n", - blurb(), screen_no, (unsigned long) w, grab_string(status)); - return status; -} - - -static void -ungrab_kbd(saver_info *si) -{ - saver_preferences *p = &si->prefs; - XUngrabKeyboard(si->dpy, CurrentTime); - if (p->verbose_p) - fprintf(stderr, "%s: %d: ungrabbing keyboard (was 0x%lx).\n", - blurb(), si->keyboard_grab_screen, - (unsigned long) si->keyboard_grab_window); - si->keyboard_grab_window = 0; -} - - -static void -ungrab_mouse(saver_info *si) -{ - saver_preferences *p = &si->prefs; - XUngrabPointer(si->dpy, CurrentTime); - if (p->verbose_p) - fprintf(stderr, "%s: %d: ungrabbing mouse (was 0x%lx).\n", - blurb(), si->mouse_grab_screen, - (unsigned long) si->mouse_grab_window); - si->mouse_grab_window = 0; -} - - -/* Apparently there is this program called "rdesktop" which is a windows - terminal server client for Unix. It would seem that this program holds - the keyboard GRABBED the whole time it has focus! This is, of course, - completely idiotic: the whole point of grabbing is to get events when - you do *not* have focus, so grabbing *only when* you have focus is - completely redundant -- unless your goal is to make xscreensaver not - able to ever lock the screen when your program is running. - - If xscreensaver blanks while rdesktop still has a keyboard grab, then - when we try to prompt for the password, we won't get the characters: - they'll be typed into rdesktop. - - Perhaps rdesktop will release its keyboard grab if it loses focus? - What the hell, let's give it a try. If we fail to grab the keyboard - four times in a row, we forcibly set focus to "None" and try four - more times. (We don't touch focus unless we're already having a hard - time getting a grab.) - */ -static void -nuke_focus (saver_info *si, int screen_no) -{ - saver_preferences *p = &si->prefs; - Window focus = 0; - int rev = 0; - - XGetInputFocus (si->dpy, &focus, &rev); - - if (p->verbose_p) - { - char w[255], r[255]; - - if (focus == PointerRoot) strcpy (w, "PointerRoot"); - else if (focus == None) strcpy (w, "None"); - else sprintf (w, "0x%lx", (unsigned long) focus); - - if (rev == RevertToParent) strcpy (r, "RevertToParent"); - else if (rev == RevertToPointerRoot) strcpy (r, "RevertToPointerRoot"); - else if (rev == RevertToNone) strcpy (r, "RevertToNone"); - else sprintf (r, "0x%x", rev); - - fprintf (stderr, "%s: %d: removing focus from %s / %s.\n", - blurb(), screen_no, w, r); - } - - XSetInputFocus (si->dpy, None, RevertToNone, CurrentTime); - XSync (si->dpy, False); -} - - -static void -ungrab_keyboard_and_mouse (saver_info *si) -{ - ungrab_mouse (si); - ungrab_kbd (si); -} - - -static Bool -grab_keyboard_and_mouse (saver_info *si, Window window, Cursor cursor, - int screen_no) -{ - Status mstatus = 0, kstatus = 0; - int i; - int retries = 4; - Bool focus_fuckus = False; - - AGAIN: - - for (i = 0; i < retries; i++) - { - XSync (si->dpy, False); - kstatus = grab_kbd (si, window, screen_no); - if (kstatus == GrabSuccess) - break; - - /* else, wait a second and try to grab again. */ - sleep (1); - } - - if (kstatus != GrabSuccess) - { - fprintf (stderr, "%s: couldn't grab keyboard! (%s)\n", - blurb(), grab_string(kstatus)); - - if (! focus_fuckus) - { - focus_fuckus = True; - nuke_focus (si, screen_no); - goto AGAIN; - } - } - - for (i = 0; i < retries; i++) - { - XSync (si->dpy, False); - mstatus = grab_mouse (si, window, cursor, screen_no); - if (mstatus == GrabSuccess) - break; - - /* else, wait a second and try to grab again. */ - sleep (1); - } - - if (mstatus != GrabSuccess) - fprintf (stderr, "%s: couldn't grab pointer! (%s)\n", - blurb(), grab_string(mstatus)); - - - /* When should we allow blanking to proceed? The current theory - is that a keyboard grab is mandatory; a mouse grab is optional. - - - If we don't have a keyboard grab, then we won't be able to - read a password to unlock, so the kbd grab is mandatory. - (We can't conditionalize this on locked_p, because someone - might run "xscreensaver-command -lock" at any time.) - - - If we don't have a mouse grab, then we might not see mouse - clicks as a signal to unblank -- but we will still see kbd - activity, so that's not a disaster. - - It has been suggested that we should allow blanking if locking - is disabled, and we have a mouse grab but no keyboard grab - (that is: kstatus != GrabSuccess && - mstatus == GrabSuccess && - si->locking_disabled_p) - That would allow screen blanking (but not locking) while the gdm - login screen had the keyboard grabbed, but one would have to use - the mouse to unblank. Keyboard characters would go to the gdm - login field without unblanking. I have not made this change - because I'm not completely convinced it is a safe thing to do. - */ - - if (kstatus != GrabSuccess) /* Do not blank without a kbd grab. */ - { - /* If we didn't get both grabs, release the one we did get. */ - ungrab_keyboard_and_mouse (si); - return False; - } - - return True; /* Grab is good, go ahead and blank. */ -} - - -int -move_mouse_grab (saver_info *si, Window to, Cursor cursor, int to_screen_no) -{ - Window old = si->mouse_grab_window; - - if (old == 0) - return grab_mouse (si, to, cursor, to_screen_no); - else - { - saver_preferences *p = &si->prefs; - int status; - - XSync (si->dpy, False); - XGrabServer (si->dpy); /* ############ DANGER! */ - XSync (si->dpy, False); - - if (p->verbose_p) - fprintf(stderr, "%s: grabbing server...\n", blurb()); - - ungrab_mouse (si); - status = grab_mouse (si, to, cursor, to_screen_no); - - if (status != GrabSuccess) /* Augh! */ - { - sleep (1); /* Note dramatic evil of sleeping - with server grabbed. */ - XSync (si->dpy, False); - status = grab_mouse (si, to, cursor, to_screen_no); - } - - if (status != GrabSuccess) /* Augh! Try to get the old one back... */ - grab_mouse (si, old, cursor, to_screen_no); - - XUngrabServer (si->dpy); - XSync (si->dpy, False); /* ###### (danger over) */ - - if (p->verbose_p) - fprintf(stderr, "%s: ungrabbing server.\n", blurb()); - - return status; - } -} - - -/* Prints an error message to stderr and returns True if there is another - xscreensaver running already. Silently returns False otherwise. */ -Bool -ensure_no_screensaver_running (Display *dpy, Screen *screen) -{ - Bool status = 0; - int i; - Window root = RootWindowOfScreen (screen); - Window root2, parent, *kids; - unsigned int nkids; - XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler); - - if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) - abort (); - if (root != root2) - abort (); - if (parent) - abort (); - for (i = 0; i < nkids; i++) - { - Atom type; - int format; - unsigned long nitems, bytesafter; - unsigned char *version; - - if (XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_VERSION, 0, 1, - False, XA_STRING, &type, &format, &nitems, - &bytesafter, &version) - == Success - && type != None) - { - unsigned char *id; - if (XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_ID, 0, 512, - False, XA_STRING, &type, &format, &nitems, - &bytesafter, &id) - != Success - || type == None) - id = (unsigned char *) "???"; - - fprintf (stderr, - "%s: already running on display %s (window 0x%x)\n from process %s.\n", - blurb(), DisplayString (dpy), (int) kids [i], - (char *) id); - status = True; - } - - else if (XGetWindowProperty (dpy, kids[i], XA_WM_COMMAND, 0, 128, - False, XA_STRING, &type, &format, &nitems, - &bytesafter, &version) - == Success - && type != None - && !strcmp ((char *) version, "gnome-screensaver")) - { - fprintf (stderr, - "%s: \"%s\" is already running on display %s (window 0x%x)\n", - blurb(), (char *) version, - DisplayString (dpy), (int) kids [i]); - status = True; - break; - } - } - - if (kids) XFree ((char *) kids); - XSync (dpy, False); - XSetErrorHandler (old_handler); - return status; -} - - - -/* Virtual-root hackery */ - #ifdef _VROOT_H_ ERROR! You must not include vroot.h in this file. #endif -static void -store_vroot_property (Display *dpy, Window win, Window value) -{ -#if 0 - if (p->verbose_p) - fprintf (stderr, - "%s: storing XA_VROOT = 0x%x (%s) = 0x%x (%s)\n", blurb(), - win, - (win == screensaver_window ? "ScreenSaver" : - (win == real_vroot ? "VRoot" : - (win == real_vroot_value ? "Vroot_value" : "???"))), - value, - (value == screensaver_window ? "ScreenSaver" : - (value == real_vroot ? "VRoot" : - (value == real_vroot_value ? "Vroot_value" : "???")))); -#endif - XChangeProperty (dpy, win, XA_VROOT, XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &value, 1); -} - -static void -remove_vroot_property (Display *dpy, Window win) -{ -#if 0 - if (p->verbose_p) - fprintf (stderr, "%s: removing XA_VROOT from 0x%x (%s)\n", blurb(), win, - (win == screensaver_window ? "ScreenSaver" : - (win == real_vroot ? "VRoot" : - (win == real_vroot_value ? "Vroot_value" : "???")))); -#endif - XDeleteProperty (dpy, win, XA_VROOT); -} - -static Bool safe_XKillClient (Display *dpy, XID id); +static void reset_watchdog_timer (saver_info *si); -static void -kill_xsetroot_data_1 (Display *dpy, Window window, - Atom prop, const char *atom_name, - Bool verbose_p) +void +store_saver_status (saver_info *si) { - Atom type; - int format; - unsigned long nitems, bytesafter; - unsigned char *dataP = 0; - - /* If the user has been using xv or xsetroot as a screensaver (to display - an image on the screensaver window, as a kind of slideshow) then the - pixmap and its associated color cells have been put in RetainPermanent - CloseDown mode. Since we're not destroying the xscreensaver window, - but merely unmapping it, we need to free these resources or those - colormap cells will stay allocated while the screensaver is off. (We - could just delete the screensaver window and recreate it later, but - that could cause other problems.) This code does an atomic read-and- - delete of the _XSETROOT_ID property, and if it held a pixmap, then we - cause the RetainPermanent resources of the client which created it - (and which no longer exists) to be freed. - - Update: it seems that Gnome and KDE do this same trick, but with the - properties "ESETROOT_PMAP_ID" and/or "_XROOTPMAP_ID" instead of - "_XSETROOT_ID". So, we'll kill those too. - */ - if (XGetWindowProperty (dpy, window, prop, 0, 1, - True, AnyPropertyType, &type, &format, &nitems, - &bytesafter, &dataP) - == Success - && type != None) - { - Pixmap *pixP = (Pixmap *) dataP; - if (pixP && *pixP && type == XA_PIXMAP && format == 32 && - nitems == 1 && bytesafter == 0) - { - if (verbose_p) - fprintf (stderr, "%s: destroying %s data (0x%lX).\n", - blurb(), atom_name, *pixP); - safe_XKillClient (dpy, *pixP); - } - else - fprintf (stderr, - "%s: deleted unrecognised %s property: \n" - "\t%lu, %lu; type: %lu, format: %d, " - "nitems: %lu, bytesafter %ld\n", - blurb(), atom_name, - (unsigned long) pixP, (pixP ? *pixP : 0), type, - format, nitems, bytesafter); - } -} + /* The contents of XA_SCREENSAVER_STATUS has LOCK/BLANK/0 in the first slot, + the time at which that state began in the second slot, and the ordinal of + the running hacks on each screen (1-based) in subsequent slots. Since + we don't know the blank-versus-lock status here, we leave whatever was + there before unchanged: it will be updated by "xscreensaver". + XA_SCREENSAVER_STATUS is stored on the (real) root window of screen 0. -static void -kill_xsetroot_data (Display *dpy, Window w, Bool verbose_p) -{ - kill_xsetroot_data_1 (dpy, w, XA_XSETROOT_ID, "_XSETROOT_ID", verbose_p); - kill_xsetroot_data_1 (dpy, w, XA_ESETROOT_PMAP_ID, "ESETROOT_PMAP_ID", - verbose_p); - kill_xsetroot_data_1 (dpy, w, XA_XROOTPMAP_ID, "_XROOTPMAP_ID", verbose_p); -} + XA_SCREENSAVER_VERSION and XA_SCREENSAVER_ID are stored on the unmapped + window created by the "xscreensaver" process. ClientMessage events are + sent to that window, and the responses are sent via the + XA_SCREENSAVER_RESPONSE property on it. + These properties are not used on the windows created by "xscreensaver-gfx" + for use by the display hacks. -static void -save_real_vroot (saver_screen_info *ssi) -{ - saver_info *si = ssi->global; + See the different version of this function in xscreensaver.c. + */ Display *dpy = si->dpy; - Screen *screen = ssi->screen; + Window w = RootWindow (dpy, 0); /* always screen 0 */ + Atom type; + unsigned char *dataP = 0; + PROP32 *status = 0; + int format; + unsigned long nitems, bytesafter; + int nitems2 = si->nscreens + 2; int i; - Window root = RootWindowOfScreen (screen); - Window root2, parent, *kids; - unsigned int nkids; - XErrorHandler old_handler; - - /* It's possible that a window might be deleted between our call to - XQueryTree() and our call to XGetWindowProperty(). Don't die if - that happens (but just ignore that window, it's not the one we're - interested in anyway.) - */ - XSync (dpy, False); - old_handler = XSetErrorHandler (BadWindow_ehandler); - XSync (dpy, False); - - ssi->real_vroot = 0; - ssi->real_vroot_value = 0; - if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) - abort (); - if (root != root2) - abort (); - if (parent) - abort (); - for (i = 0; i < nkids; i++) - { - Atom type; - int format; - unsigned long nitems, bytesafter; - unsigned char *dataP = 0; - Window *vrootP; - int j; - - /* Skip this window if it is the xscreensaver window of any other - screen (this can happen in the Xinerama case.) - */ - for (j = 0; j < si->nscreens; j++) - { - saver_screen_info *ssi2 = &si->screens[j]; - if (kids[i] == ssi2->screensaver_window) - goto SKIP; - } - - if (XGetWindowProperty (dpy, kids[i], XA_VROOT, 0, 1, False, XA_WINDOW, - &type, &format, &nitems, &bytesafter, - &dataP) - != Success) - continue; - if (! dataP) - continue; - vrootP = (Window *) dataP; - if (ssi->real_vroot) - { - if (*vrootP == ssi->screensaver_window) abort (); - fprintf (stderr, - "%s: more than one virtual root window found (0x%x and 0x%x).\n", - blurb(), (int) ssi->real_vroot, (int) kids [i]); - exit (1); - } - ssi->real_vroot = kids [i]; - ssi->real_vroot_value = *vrootP; - SKIP: - ; - } + /* Read the old property, so we can change just our parts. */ + XGetWindowProperty (dpy, w, + XA_SCREENSAVER_STATUS, + 0, 999, False, XA_INTEGER, + &type, &format, &nitems, &bytesafter, + &dataP); - XSync (dpy, False); - XSetErrorHandler (old_handler); - XSync (dpy, False); + status = (PROP32 *) calloc (nitems2, sizeof(PROP32)); - if (ssi->real_vroot) + if (dataP && type == XA_INTEGER && nitems >= 3) { - remove_vroot_property (si->dpy, ssi->real_vroot); - XSync (dpy, False); + status[0] = ((PROP32 *) dataP)[0]; + status[1] = ((PROP32 *) dataP)[1]; } - XFree ((char *) kids); -} - - -static Bool -restore_real_vroot_1 (saver_screen_info *ssi) -{ - saver_info *si = ssi->global; - saver_preferences *p = &si->prefs; - if (p->verbose_p && ssi->real_vroot) - fprintf (stderr, - "%s: restoring __SWM_VROOT property on the real vroot (0x%lx).\n", - blurb(), (unsigned long) ssi->real_vroot); - if (ssi->screensaver_window) - remove_vroot_property (si->dpy, ssi->screensaver_window); - if (ssi->real_vroot) - { - store_vroot_property (si->dpy, ssi->real_vroot, ssi->real_vroot_value); - ssi->real_vroot = 0; - ssi->real_vroot_value = 0; - /* make sure the property change gets there before this process - terminates! We might be doing this because we have intercepted - SIGTERM or something. */ - XSync (si->dpy, False); - return True; - } - return False; -} - -Bool -restore_real_vroot (saver_info *si) -{ - int i; - Bool did_any = False; for (i = 0; i < si->nscreens; i++) { saver_screen_info *ssi = &si->screens[i]; - if (restore_real_vroot_1 (ssi)) - did_any = True; - } - return did_any; -} - - -/* Signal hackery to ensure that the vroot doesn't get left in an - inconsistent state - */ - -const char * -signal_name(int signal) -{ - switch (signal) { - case SIGHUP: return "SIGHUP"; - case SIGINT: return "SIGINT"; - case SIGQUIT: return "SIGQUIT"; - case SIGILL: return "SIGILL"; - case SIGTRAP: return "SIGTRAP"; -#ifdef SIGABRT - case SIGABRT: return "SIGABRT"; -#endif - case SIGFPE: return "SIGFPE"; - case SIGKILL: return "SIGKILL"; - case SIGBUS: return "SIGBUS"; - case SIGSEGV: return "SIGSEGV"; - case SIGPIPE: return "SIGPIPE"; - case SIGALRM: return "SIGALRM"; - case SIGTERM: return "SIGTERM"; -#ifdef SIGSTOP - case SIGSTOP: return "SIGSTOP"; -#endif -#ifdef SIGCONT - case SIGCONT: return "SIGCONT"; -#endif -#ifdef SIGUSR1 - case SIGUSR1: return "SIGUSR1"; -#endif -#ifdef SIGUSR2 - case SIGUSR2: return "SIGUSR2"; -#endif -#ifdef SIGEMT - case SIGEMT: return "SIGEMT"; -#endif -#ifdef SIGSYS - case SIGSYS: return "SIGSYS"; -#endif -#ifdef SIGCHLD - case SIGCHLD: return "SIGCHLD"; -#endif -#ifdef SIGPWR - case SIGPWR: return "SIGPWR"; -#endif -#ifdef SIGWINCH - case SIGWINCH: return "SIGWINCH"; -#endif -#ifdef SIGURG - case SIGURG: return "SIGURG"; -#endif -#ifdef SIGIO - case SIGIO: return "SIGIO"; -#endif -#ifdef SIGVTALRM - case SIGVTALRM: return "SIGVTALRM"; -#endif -#ifdef SIGXCPU - case SIGXCPU: return "SIGXCPU"; -#endif -#ifdef SIGXFSZ - case SIGXFSZ: return "SIGXFSZ"; -#endif -#ifdef SIGDANGER - case SIGDANGER: return "SIGDANGER"; -#endif - default: - { - static char buf[50]; - sprintf(buf, "signal %d\n", signal); - return buf; - } - } -} - - - -static RETSIGTYPE -restore_real_vroot_handler (int sig) -{ - saver_info *si = global_si_kludge; /* I hate C so much... */ - Bool restored_p; - - signal (sig, SIG_DFL); - -# ifdef HAVE_LIBSYSTEMD - if (si->systemd_pid) /* Kill background xscreensaver-systemd process */ - { - /* We're exiting, so there's no need to do a full kill_job() here, - which would waitpid(). */ - /* kill_job (si, si->systemd_pid, SIGTERM); */ - kill (si->systemd_pid, SIGTERM); - si->systemd_pid = 0; - } -# endif - - /* This is a signal handler, and the following might do X protocol, - which is horrible, but we're about to terminate so we don't have - a choice... */ - restored_p = restore_real_vroot (si); - - /* Calling fprintf from a signal handler is also risky, but we're - so far into the weeds on that front already... */ - fprintf (stderr, "\n%s: %s%s\n\n", blurb(), signal_name(sig), - (restored_p ? ", vroot restored" : "")); - - shutdown_stderr (si); - - kill (getpid (), sig); -} - - -static void -catch_signal (saver_info *si, int sig, RETSIGTYPE (*handler) (int)) -{ -# ifdef HAVE_SIGACTION - - struct sigaction a; - a.sa_handler = handler; - sigemptyset (&a.sa_mask); - a.sa_flags = 0; - - /* On Linux 2.4.9 (at least) we need to tell the kernel to not mask delivery - of this signal from inside its handler, or else when we execvp() the - process again, it starts up with SIGHUP blocked, meaning that killing - it with -HUP only works *once*. You'd think that execvp() would reset - all the signal masks, but it doesn't. - */ -# if defined(SA_NOMASK) - a.sa_flags |= SA_NOMASK; -# elif defined(SA_NODEFER) - a.sa_flags |= SA_NODEFER; -# endif - - if (sigaction (sig, &a, 0) < 0) -# else /* !HAVE_SIGACTION */ - if (((long) signal (sig, handler)) == -1L) -# endif /* !HAVE_SIGACTION */ - { - char buf [255]; - sprintf (buf, "%s: couldn't catch %s", blurb(), signal_name(sig)); - perror (buf); - saver_exit (si, 1, 0); - } -} - -static RETSIGTYPE saver_sighup_handler (int sig); - -void -handle_signals (saver_info *si) -{ - catch_signal (si, SIGHUP, saver_sighup_handler); - - catch_signal (si, SIGINT, restore_real_vroot_handler); - catch_signal (si, SIGQUIT, restore_real_vroot_handler); - catch_signal (si, SIGILL, restore_real_vroot_handler); - catch_signal (si, SIGTRAP, restore_real_vroot_handler); -#ifdef SIGIOT - catch_signal (si, SIGIOT, restore_real_vroot_handler); -#endif - catch_signal (si, SIGABRT, restore_real_vroot_handler); -#ifdef SIGEMT - catch_signal (si, SIGEMT, restore_real_vroot_handler); -#endif - catch_signal (si, SIGFPE, restore_real_vroot_handler); - catch_signal (si, SIGBUS, restore_real_vroot_handler); - catch_signal (si, SIGSEGV, restore_real_vroot_handler); -#ifdef SIGSYS - catch_signal (si, SIGSYS, restore_real_vroot_handler); -#endif - catch_signal (si, SIGTERM, restore_real_vroot_handler); -#ifdef SIGXCPU - catch_signal (si, SIGXCPU, restore_real_vroot_handler); -#endif -#ifdef SIGXFSZ - catch_signal (si, SIGXFSZ, restore_real_vroot_handler); -#endif -#ifdef SIGDANGER - catch_signal (si, SIGDANGER, restore_real_vroot_handler); -#endif -} - - -static RETSIGTYPE -saver_sighup_handler (int sig) -{ - saver_info *si = global_si_kludge; /* I hate C so much... */ - - /* Re-establish SIGHUP handler */ - catch_signal (si, SIGHUP, saver_sighup_handler); - - fprintf (stderr, "%s: %s received: restarting...\n", - blurb(), signal_name(sig)); - - restart_process (si); /* Does not return */ - abort (); -} - - - -void -saver_exit (saver_info *si, int status, const char *dump_core_reason) -{ - saver_preferences *p = &si->prefs; - static Bool exiting = False; - Bool bugp; - Bool vrs; - - if (exiting) - exit (status); - - exiting = True; - - vrs = restore_real_vroot (si); - if (p->verbose_p && vrs) - fprintf (real_stderr, "%s: old vroot restored.\n", blurb()); - - emergency_kill_subproc (si); - -# ifdef HAVE_LIBSYSTEMD - if (si->systemd_pid) /* Kill background xscreensaver-systemd process */ - { - kill_job (si, si->systemd_pid, SIGTERM); - si->systemd_pid = 0; - } -# endif - - shutdown_stderr (si); - - bugp = !!dump_core_reason; - - if (si->prefs.debug_p && !dump_core_reason) - dump_core_reason = "because of -debug"; - - if (dump_core_reason) - { - /* Note that the Linux man page for setuid() says If uid is - different from the old effective uid, the process will be - forbidden from leaving core dumps. - */ - char cwd[4096]; /* should really be PATH_MAX, but who cares. */ - cwd[0] = 0; - fprintf(real_stderr, "%s: dumping core (%s)\n", blurb(), - dump_core_reason); - - if (bugp) - fprintf(real_stderr, - "%s: see https://www.jwz.org/xscreensaver/bugs.html\n" - "\t\t\tfor bug reporting information.\n\n", - blurb()); - -# if defined(HAVE_GETCWD) - if (!getcwd (cwd, sizeof(cwd))) -# elif defined(HAVE_GETWD) - if (!getwd (cwd)) -# endif - strcpy(cwd, "unknown."); - - fprintf (real_stderr, "%s: current directory is %s\n", blurb(), cwd); - describe_uids (si, real_stderr); - - /* Do this to drop a core file, so that we can get a stack trace. */ - abort(); + status[2 + i] = ssi->current_hack + 1; /* 1-based */ } -# ifdef VMS /* on VMS, 1 is the "normal" exit code instead of 0. */ - if (status == 0) status = 1; - else if (status == 1) status = -1; -# endif - - exit (status); -} - - -/* Managing the actual screensaver window */ - -Bool -window_exists_p (Display *dpy, Window window) -{ - XErrorHandler old_handler; - XWindowAttributes xgwa; - xgwa.screen = 0; - old_handler = XSetErrorHandler (BadWindow_ehandler); - XGetWindowAttributes (dpy, window, &xgwa); + XChangeProperty (si->dpy, w, XA_SCREENSAVER_STATUS, XA_INTEGER, 32, + PropModeReplace, (unsigned char *) status, nitems2); XSync (dpy, False); - XSetErrorHandler (old_handler); - return (xgwa.screen != 0); -} -static void -store_saver_id (saver_screen_info *ssi) -{ - XClassHint class_hints; - saver_info *si = ssi->global; - unsigned long pid = (unsigned long) getpid (); - char buf[20]; - struct passwd *p = getpwuid (getuid ()); - const char *name, *host; - char *id; -# if defined(HAVE_UNAME) - struct utsname uts; -# endif /* UNAME */ - - /* First store the name and class on the window. - */ - class_hints.res_name = progname; - class_hints.res_class = progclass; - XSetClassHint (si->dpy, ssi->screensaver_window, &class_hints); - XStoreName (si->dpy, ssi->screensaver_window, "screensaver"); - - /* Then store the xscreensaver version number. - */ - XChangeProperty (si->dpy, ssi->screensaver_window, - XA_SCREENSAVER_VERSION, - XA_STRING, 8, PropModeReplace, - (unsigned char *) si->version, - strlen (si->version)); - - /* Now store the XSCREENSAVER_ID property, that says what user and host - xscreensaver is running as. - */ - - if (p && p->pw_name && *p->pw_name) - name = p->pw_name; - else if (p) + if (si->prefs.debug_p && si->prefs.verbose_p) { - sprintf (buf, "%lu", (unsigned long) p->pw_uid); - name = buf; - } - else - name = "???"; - -# if defined(HAVE_UNAME) - { - if (uname (&uts) < 0) - host = "???"; - else - host = uts.nodename; - } -# elif defined(VMS) - host = getenv("SYS$NODE"); -# else /* !HAVE_UNAME && !VMS */ - host = "???"; -# endif /* !HAVE_UNAME && !VMS */ - - id = (char *) malloc (strlen(name) + strlen(host) + 50); - sprintf (id, "%lu (%s@%s)", pid, name, host); - - XChangeProperty (si->dpy, ssi->screensaver_window, - XA_SCREENSAVER_ID, XA_STRING, - 8, PropModeReplace, - (unsigned char *) id, strlen (id)); - free (id); -} - - -void -store_saver_status (saver_info *si) -{ - PROP32 *status; - int size = si->nscreens + 2; - int i; - - status = (PROP32 *) calloc (size, sizeof(PROP32)); - - status[0] = (PROP32) (si->screen_blanked_p || si->locked_p - ? (si->locked_p ? XA_LOCK : XA_BLANK) - : 0); - status[1] = (PROP32) si->blank_time; - - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - status [2 + i] = ssi->current_hack + 1; - } - - XChangeProperty (si->dpy, - RootWindow (si->dpy, 0), /* always screen #0 */ - XA_SCREENSAVER_STATUS, - XA_INTEGER, 32, PropModeReplace, - (unsigned char *) status, size); - free (status); -} - - -static Bool error_handler_hit_p = False; - -static int -ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) -{ - error_handler_hit_p = True; - return 0; -} - - -/* Returns True if successful, False if an X error occurred. - We need this because other programs might have done things to - our window that will cause XChangeWindowAttributes() to fail: - if that happens, we give up, destroy the window, and re-create - it. - */ -static Bool -safe_XChangeWindowAttributes (Display *dpy, Window window, - unsigned long mask, - XSetWindowAttributes *attrs) -{ - XErrorHandler old_handler; - XSync (dpy, False); - error_handler_hit_p = False; - old_handler = XSetErrorHandler (ignore_all_errors_ehandler); - - XChangeWindowAttributes (dpy, window, mask, attrs); - - XSync (dpy, False); - XSetErrorHandler (old_handler); - XSync (dpy, False); - - return (!error_handler_hit_p); -} - - -/* This might not be necessary, but just in case. */ -static Bool -safe_XConfigureWindow (Display *dpy, Window window, - unsigned long mask, XWindowChanges *changes) -{ - XErrorHandler old_handler; - XSync (dpy, False); - error_handler_hit_p = False; - old_handler = XSetErrorHandler (ignore_all_errors_ehandler); - - XConfigureWindow (dpy, window, mask, changes); - - XSync (dpy, False); - XSetErrorHandler (old_handler); - XSync (dpy, False); - - return (!error_handler_hit_p); -} - -/* This might not be necessary, but just in case. */ -static Bool -safe_XDestroyWindow (Display *dpy, Window window) -{ - XErrorHandler old_handler; - XSync (dpy, False); - error_handler_hit_p = False; - old_handler = XSetErrorHandler (ignore_all_errors_ehandler); - - XDestroyWindow (dpy, window); - - XSync (dpy, False); - XSetErrorHandler (old_handler); - XSync (dpy, False); - - return (!error_handler_hit_p); -} - - -static Bool -safe_XKillClient (Display *dpy, XID id) -{ - XErrorHandler old_handler; - XSync (dpy, False); - error_handler_hit_p = False; - old_handler = XSetErrorHandler (ignore_all_errors_ehandler); - - XKillClient (dpy, id); - - XSync (dpy, False); - XSetErrorHandler (old_handler); - XSync (dpy, False); - - return (!error_handler_hit_p); -} - - -#ifdef HAVE_XF86VMODE -Bool -safe_XF86VidModeGetViewPort (Display *dpy, int screen, int *xP, int *yP) -{ - Bool result; - XErrorHandler old_handler; - XSync (dpy, False); - error_handler_hit_p = False; - old_handler = XSetErrorHandler (ignore_all_errors_ehandler); - - result = XF86VidModeGetViewPort (dpy, screen, xP, yP); - - XSync (dpy, False); - XSetErrorHandler (old_handler); - XSync (dpy, False); - - return (error_handler_hit_p - ? False - : result); -} - -/* There is no "safe_XF86VidModeGetModeLine" because it fails with an - untrappable I/O error instead of an X error -- so one must call - safe_XF86VidModeGetViewPort first, and assume that both have the - same error condition. Thank you XFree, may I have another. - */ + int i; + fprintf (stderr, "%s: wrote status property: 0x%lx: %s", blurb(), + (unsigned long) w, + (status[0] == XA_LOCK ? "LOCK" : + status[0] == XA_BLANK ? "BLANK" : + status[0] == 0 ? "0" : "???")); + for (i = 1; i < nitems; i++) + fprintf (stderr, ", %lu", status[i]); + fprintf (stderr, "\n"); + } -#endif /* HAVE_XF86VMODE */ + free (status); + if (dataP) + XFree (dataP); +} static void @@ -1183,7 +138,8 @@ initialize_screensaver_window_1 (saver_screen_info *ssi) /* This resets the screensaver window as fully as possible, since there's no way of knowing what some random client may have done to us in the meantime. We could just destroy and recreate the window, but that has - its own set of problems... + its own set of problems. (Update: that's exactly what we're doing + these days.) */ XColor black; XSetWindowAttributes attrs; @@ -1217,8 +173,7 @@ initialize_screensaver_window_1 (saver_screen_info *ssi) if (ssi->cmap) { XFreeColors (si->dpy, ssi->cmap, &ssi->black_pixel, 1, 0); - if (ssi->cmap != ssi->demo_cmap && - ssi->cmap != def_cmap) + if (ssi->cmap != def_cmap) XFreeColormap (si->dpy, ssi->cmap); } ssi->cmap = def_cmap; @@ -1229,20 +184,18 @@ initialize_screensaver_window_1 (saver_screen_info *ssi) CWBackPixel | CWBackingPixel | CWBorderPixel); attrs.override_redirect = True; - /* When use_mit_saver_extension or use_sgi_saver_extension is true, we won't - actually be reading these events during normal operation; but we still - need to see Button events for demo-mode to work properly. - */ attrs.event_mask = (KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask); - attrs.backing_store = NotUseful; + attrs.backing_store = Always; attrs.colormap = ssi->cmap; attrs.background_pixel = ssi->black_pixel; attrs.backing_pixel = ssi->black_pixel; attrs.border_pixel = ssi->black_pixel; + printed_visual_info = True; /* Too noisy */ + if (!p->verbose_p || printed_visual_info) ; else if (ssi->current_visual == DefaultVisualOfScreen (ssi->screen)) @@ -1263,60 +216,11 @@ initialize_screensaver_window_1 (saver_screen_info *ssi) } printed_visual_info = True; -#ifdef HAVE_MIT_SAVER_EXTENSION - if (si->using_mit_saver_extension) + if (ssi->error_dialog) { - XScreenSaverInfo *info; - Window root = RootWindowOfScreen (ssi->screen); - -#if 0 - /* This call sets the server screensaver timeouts to what we think - they should be (based on the resources and args xscreensaver was - started with.) It's important that we do this to sync back up - with the server - if we have turned on prematurely, as by an - ACTIVATE ClientMessage, then the server may decide to activate - the screensaver while it's already active. That's ok for us, - since we would know to ignore that ScreenSaverActivate event, - but a side effect of this would be that the server would map its - saver window (which we then hide again right away) meaning that - the bits currently on the screen get blown away. Ugly. */ - - /* #### Ok, that doesn't work - when we tell the server that the - screensaver is "off" it sends us a Deactivate event, which is - sensible... but causes the saver to never come on. Hmm. */ - disable_builtin_screensaver (si, True); -#endif /* 0 */ - -#if 0 - /* #### The MIT-SCREEN-SAVER extension gives us access to the - window that the server itself uses for saving the screen. - However, using this window in any way, in particular, calling - XScreenSaverSetAttributes() as below, tends to make the X server - crash. So fuck it, let's try and get along without using it... - - It's also inconvenient to use this window because it doesn't - always exist (though the ID is constant.) So to use this - window, we'd have to reimplement the ACTIVATE ClientMessage to - tell the *server* to tell *us* to turn on, to cause the window - to get created at the right time. Gag. - - See the very long comment at the top of xscreensaver.c for why the - MIT-SCREEN-SAVER extension is garbage and should not be used. - */ - XScreenSaverSetAttributes (si->dpy, root, - 0, 0, width, height, 0, - current_depth, InputOutput, visual, - attrmask, &attrs); - XSync (si->dpy, False); -#endif /* 0 */ - - info = XScreenSaverAllocInfo (); - XScreenSaverQueryInfo (si->dpy, root, info); - ssi->server_mit_saver_window = info->window; - if (! ssi->server_mit_saver_window) abort (); - XFree (info); + XDestroyWindow (si->dpy, ssi->error_dialog); + ssi->error_dialog = 0; } -#endif /* HAVE_MIT_SAVER_EXTENSION */ if (ssi->screensaver_window) { @@ -1328,10 +232,13 @@ initialize_screensaver_window_1 (saver_screen_info *ssi) changes.height = ssi->height; changes.border_width = 0; - if (! (safe_XConfigureWindow (si->dpy, ssi->screensaver_window, - changesmask, &changes) && - safe_XChangeWindowAttributes (si->dpy, ssi->screensaver_window, - attrmask, &attrs))) + /* XConfigureWindow and XChangeWindowAttributes can fail if a hack did + something weird to the window. In that case, we must destroy and + re-create it. */ + if (! (XConfigureWindow (si->dpy, ssi->screensaver_window, + changesmask, &changes) && + XChangeWindowAttributes (si->dpy, ssi->screensaver_window, + attrmask, &attrs))) { horked_window = ssi->screensaver_window; ssi->screensaver_window = 0; @@ -1345,35 +252,31 @@ initialize_screensaver_window_1 (saver_screen_info *ssi) ssi->x, ssi->y, ssi->width, ssi->height, 0, ssi->current_depth, InputOutput, ssi->current_visual, attrmask, &attrs); - reset_stderr (ssi); + xscreensaver_set_wm_atoms (si->dpy, ssi->screensaver_window, + ssi->width, ssi->height, 0); if (horked_window) { fprintf (stderr, "%s: someone horked our saver window (0x%lx)! Recreating it...\n", blurb(), (unsigned long) horked_window); - maybe_transfer_grabs (ssi, horked_window, ssi->screensaver_window, - ssi->number); - safe_XDestroyWindow (si->dpy, horked_window); - horked_window = 0; + XDestroyWindow (si->dpy, horked_window); } - if (p->verbose_p) - fprintf (stderr, "%s: %d: saver window is 0x%lx.\n", + if (p->verbose_p > 1) + fprintf (stderr, "%s: %d: saver window is 0x%lx\n", blurb(), ssi->number, (unsigned long) ssi->screensaver_window); } - store_saver_id (ssi); /* store window name and IDs */ - if (!ssi->cursor) { - Pixmap bit; - bit = XCreatePixmapFromBitmapData (si->dpy, ssi->screensaver_window, - "\000", 1, 1, - BlackPixelOfScreen (ssi->screen), - BlackPixelOfScreen (ssi->screen), - 1); + Pixmap bit = + XCreatePixmapFromBitmapData (si->dpy, ssi->screensaver_window, + "\000", 1, 1, + BlackPixelOfScreen (ssi->screen), + BlackPixelOfScreen (ssi->screen), + 1); ssi->cursor = XCreatePixmapCursor (si->dpy, bit, bit, &black, &black, 0, 0); XFreePixmap (si->dpy, bit); @@ -1387,6 +290,7 @@ initialize_screensaver_window_1 (saver_screen_info *ssi) XDefineCursor (si->dpy, ssi->screensaver_window, ssi->cursor); } + void initialize_screensaver_window (saver_info *si) { @@ -1396,6 +300,27 @@ initialize_screensaver_window (saver_info *si) } +static void +raise_window (saver_screen_info *ssi) +{ + saver_info *si = ssi->global; + if (ssi->error_dialog) + { + /* Make the error be topmost, and the saver be directly below it. */ + Window windows[2]; + windows[0] = ssi->error_dialog; + windows[1] = ssi->screensaver_window; + XMapRaised (si->dpy, windows[0]); + XRestackWindows (si->dpy, windows, countof(windows)); + } + else + XMapRaised (si->dpy, ssi->screensaver_window); + + if (ssi->cmap) + XInstallColormap (si->dpy, ssi->cmap); +} + + /* Called when the RANDR (Resize and Rotate) extension tells us that the size of the screen has changed while the screen was blanked. Call update_screen_layout() first, then call this to synchronize @@ -1450,8 +375,8 @@ resize_screensaver_window (saver_info *si) xgwa.width, xgwa.height, xgwa.x, xgwa.y, ssi->width, ssi->height, ssi->x, ssi->y); - if (! safe_XConfigureWindow (si->dpy, ssi->screensaver_window, - changesmask, &changes)) + if (! XConfigureWindow (si->dpy, ssi->screensaver_window, + changesmask, &changes)) fprintf (stderr, "%s: %d: someone horked our saver window" " (0x%lx)! Unable to resize it!\n", blurb(), i, (unsigned long) ssi->screensaver_window); @@ -1465,27 +390,10 @@ resize_screensaver_window (saver_info *si) Note that spawn_screenhack() calls select_visual() which may destroy and re-create the window via initialize_screensaver_window_1(). */ - if (si->screen_blanked_p) - { - if (ssi->cmap) - XInstallColormap (si->dpy, ssi->cmap); - XMapRaised (si->dpy, ssi->screensaver_window); - XSync (si->dpy, False); - if (! ssi->pid) - spawn_screenhack (ssi); - - /* Make sure the act of adding a screen doesn't present as - pointer motion (and thus cause an unblank). */ - { - Window root, child; - int x, y; - unsigned int mask; - XQueryPointer (si->dpy, ssi->screensaver_window, &root, &child, - &ssi->last_poll_mouse.root_x, - &ssi->last_poll_mouse.root_y, - &x, &y, &mask); - } - } + raise_window (ssi); + XSync (si->dpy, False); + if (! ssi->pid) + spawn_screenhack (ssi); } /* Kill off any savers running on no-longer-extant monitors. @@ -1498,44 +406,47 @@ resize_screensaver_window (saver_info *si) if (ssi->screensaver_window) { XUnmapWindow (si->dpy, ssi->screensaver_window); - restore_real_vroot_1 (ssi); } } } -void -raise_window (saver_info *si, - Bool inhibit_fade, Bool between_hacks_p, Bool dont_clear) +static void +raise_windows (saver_info *si) { - saver_preferences *p = &si->prefs; int i; + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + raise_window (ssi); + } +} - if (si->demoing_p) - inhibit_fade = True; - - if (si->emergency_lock_p) - inhibit_fade = True; - if (!dont_clear) - initialize_screensaver_window (si); +/* Called only once, before the main loop begins. + */ +void +blank_screen (saver_info *si) +{ + saver_preferences *p = &si->prefs; + Bool user_active_p = False; + int i; - reset_watchdog_timer (si, True); + initialize_screensaver_window (si); + sync_server_dpms_settings (si->dpy, p); - if (p->fade_p && si->fading_possible_p && !inhibit_fade) + if (p->fade_p && + !si->demoing_p && + !si->emergency_p) { Window *current_windows = (Window *) - calloc(sizeof(Window), si->nscreens); - Colormap *current_maps = (Colormap *) - calloc(sizeof(Colormap), si->nscreens); + malloc (si->nscreens * sizeof(*current_windows)); + if (!current_windows) abort(); for (i = 0; i < si->nscreens; i++) { saver_screen_info *ssi = &si->screens[i]; current_windows[i] = ssi->screensaver_window; - current_maps[i] = (between_hacks_p - ? ssi->cmap - : DefaultColormapOfScreen (ssi->screen)); /* Ensure that the default background of the window is really black, not a pixmap or something. (This does not clear the window.) */ XSetWindowBackground (si->dpy, ssi->screensaver_window, @@ -1544,236 +455,98 @@ raise_window (saver_info *si, if (p->verbose_p) fprintf (stderr, "%s: fading...\n", blurb()); - XGrabServer (si->dpy); /* ############ DANGER! */ - - /* Clear the stderr layer on each screen. - */ - if (!dont_clear) - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - if (ssi->stderr_overlay_window) - /* Do this before the fade, since the stderr cmap won't fade - even if we uninstall it (beats me...) */ - clear_stderr (ssi); - } - - /* Note! The server is grabbed, and this will take several seconds - to complete! */ - fade_screens (si->dpy, current_maps, - current_windows, si->nscreens, - p->fade_seconds/1000, p->fade_ticks, True, !dont_clear); - - free(current_maps); - free(current_windows); - current_maps = 0; - current_windows = 0; - - if (p->verbose_p) fprintf (stderr, "%s: fading done.\n", blurb()); - -#ifdef HAVE_MIT_SAVER_EXTENSION - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - if (ssi->server_mit_saver_window && - window_exists_p (si->dpy, ssi->server_mit_saver_window)) - XUnmapWindow (si->dpy, ssi->server_mit_saver_window); - } -#endif /* HAVE_MIT_SAVER_EXTENSION */ - - XUngrabServer (si->dpy); - XSync (si->dpy, False); /* ###### (danger over) */ - } - else - { - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - if (!dont_clear) - XClearWindow (si->dpy, ssi->screensaver_window); - if (!dont_clear || ssi->stderr_overlay_window) - clear_stderr (ssi); - XMapRaised (si->dpy, ssi->screensaver_window); - XSync (si->dpy, False); -#ifdef HAVE_MIT_SAVER_EXTENSION - if (ssi->server_mit_saver_window && - window_exists_p (si->dpy, ssi->server_mit_saver_window)) - XUnmapWindow (si->dpy, ssi->server_mit_saver_window); -#endif /* HAVE_MIT_SAVER_EXTENSION */ - } - } - - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - if (ssi->cmap) - XInstallColormap (si->dpy, ssi->cmap); - } -} - - -int -mouse_screen (saver_info *si) -{ - saver_preferences *p = &si->prefs; - Window pointer_root, pointer_child; - int root_x, root_y, win_x, win_y; - unsigned int mask; - int i; - - if (si->nscreens == 1) - return 0; - - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - if (XQueryPointer (si->dpy, RootWindowOfScreen (ssi->screen), - &pointer_root, &pointer_child, - &root_x, &root_y, &win_x, &win_y, &mask) && - root_x >= ssi->x && - root_y >= ssi->y && - root_x < ssi->x + ssi->width && - root_y < ssi->y + ssi->height) - { - if (p->verbose_p) - fprintf (stderr, "%s: mouse is on screen %d of %d\n", - blurb(), i, si->nscreens); - return i; - } + /* This will take several seconds to complete. */ + user_active_p = fade_screens (si->app, si->dpy, + current_windows, si->nscreens, + p->fade_seconds / 1000.0, + True, /* out_p */ + True, /* from_desktop_p */ + &si->fade_state); + free (current_windows); + + if (!p->verbose_p) + ; + else if (user_active_p) + fprintf (stderr, "%s: fading aborted\n", blurb()); + else + fprintf (stderr, "%s: fading done\n", blurb()); } - /* couldn't figure out where the mouse is? Oh well. */ - return 0; -} - + raise_windows (si); + reset_watchdog_timer (si); -Bool -blank_screen (saver_info *si) -{ - int i; - Bool ok; - Window w; - int mscreen; - - /* Note: we do our grabs on the root window, not on the screensaver window. - If we grabbed on the saver window, then the demo mode and lock dialog - boxes wouldn't get any events. - - By "the root window", we mean "the root window that contains the mouse." - We use to always grab the mouse on screen 0, but that has the effect of - moving the mouse to screen 0 from whichever screen it was on, on - multi-head systems. - */ - mscreen = mouse_screen (si); - w = RootWindowOfScreen(si->screens[mscreen].screen); - ok = grab_keyboard_and_mouse (si, w, - (si->demoing_p ? 0 : si->screens[0].cursor), - mscreen); - - -# if 0 - if (si->using_mit_saver_extension || si->using_sgi_saver_extension) - /* If we're using a server extension, then failure to get a grab is - not a big deal -- even without the grab, we will still be able - to un-blank when there is user activity, since the server will - tell us. */ - /* #### No, that's not true: if we don't have a keyboard grab, - then we can't read passwords to unlock. - */ - ok = True; -# endif /* 0 */ - - if (!ok) - return False; + /* user_active_p means that the user aborted the fade-out -- but that does + not mean that we are necessarily about to exit. If we are locking, then + the user activity will cause the unlock dialog to appear, but + authentication might not succeed. */ for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - if (ssi->real_screen_p) - save_real_vroot (ssi); - store_vroot_property (si->dpy, - ssi->screensaver_window, - ssi->screensaver_window); - -#ifdef HAVE_XF86VMODE - { - int ev, er; - if (!XF86VidModeQueryExtension (si->dpy, &ev, &er) || - !safe_XF86VidModeGetViewPort (si->dpy, i, - &ssi->blank_vp_x, - &ssi->blank_vp_y)) - ssi->blank_vp_x = ssi->blank_vp_y = -1; - } -#endif /* HAVE_XF86VMODE */ - } + /* This also queues each screen's cycle_timer. */ + spawn_screenhack (&si->screens[i]); - raise_window (si, False, False, False); + /* Turn off "next" and "prev" modes after they have happened once. */ + if (si->selection_mode < 0) + si->selection_mode = 0; - si->screen_blanked_p = True; - si->blank_time = time ((time_t *) 0); - si->last_wall_clock_time = 0; - - store_saver_status (si); /* store blank time */ - - return True; + /* If we are blanking only, optionally power down monitor right now. */ + if (p->mode == BLANK_ONLY && + p->dpms_quickoff_p) + monitor_power_on (si, False); } +/* Called only once, upon receipt of SIGTERM, just before exiting. + */ void unblank_screen (saver_info *si) { saver_preferences *p = &si->prefs; - Bool unfade_p = (si->fading_possible_p && p->unfade_p); + Bool unfade_p = p->unfade_p; int i; monitor_power_on (si, True); - reset_watchdog_timer (si, False); if (si->demoing_p) unfade_p = False; if (unfade_p) { + double seconds = p->fade_seconds / 1000.0; + double ratio = 1/3.0; Window *current_windows = (Window *) calloc(sizeof(Window), si->nscreens); + Bool interrupted_p = False; for (i = 0; i < si->nscreens; i++) { saver_screen_info *ssi = &si->screens[i]; current_windows[i] = ssi->screensaver_window; - /* Ensure that the default background of the window is really black, - not a pixmap or something. (This does not clear the window.) */ - XSetWindowBackground (si->dpy, ssi->screensaver_window, - ssi->black_pixel); } if (p->verbose_p) fprintf (stderr, "%s: unfading...\n", blurb()); + monitor_power_on (si, True); + + /* When we fade in to the desktop, first fade out from the saver to + black, then fade in from black to the desktop. */ + interrupted_p = fade_screens (si->app, si->dpy, + current_windows, si->nscreens, + seconds * ratio, + True, /* out_p */ + False, /* from_desktop_p */ + &si->fade_state); + if (! interrupted_p) + interrupted_p = fade_screens (si->app, si->dpy, + current_windows, si->nscreens, + seconds * (1-ratio), + False, /* out_p */ + False, /* from_desktop_p */ + &si->fade_state); + free (current_windows); - XSync (si->dpy, False); - XGrabServer (si->dpy); /* ############ DANGER! */ - XSync (si->dpy, False); - - /* Clear the stderr layer on each screen. - */ - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - clear_stderr (ssi); - } - - XUngrabServer (si->dpy); - XSync (si->dpy, False); /* ###### (danger over) */ - - fade_screens (si->dpy, 0, - current_windows, si->nscreens, - p->fade_seconds/1000, p->fade_ticks, - False, False); - - free(current_windows); - current_windows = 0; - - if (p->verbose_p) fprintf (stderr, "%s: unfading done.\n", blurb()); + if (p->verbose_p) + fprintf (stderr, "%s: unfading done%s\n", blurb(), + (interrupted_p ? " (interrupted)" : "")); } else { @@ -1784,118 +557,33 @@ unblank_screen (saver_info *si) { Colormap c = DefaultColormapOfScreen (ssi->screen); /* avoid technicolor */ + XSetWindowBackground (si->dpy, ssi->screensaver_window, + BlackPixelOfScreen (ssi->screen)); XClearWindow (si->dpy, ssi->screensaver_window); if (c) XInstallColormap (si->dpy, c); } XUnmapWindow (si->dpy, ssi->screensaver_window); } } - - - /* If the focus window does has a non-default colormap, then install - that colormap as well. (On SGIs, this will cause both the root map - and the focus map to be installed simultaneously. It'd be nice to - pick up the other colormaps that had been installed, too; perhaps - XListInstalledColormaps could be used for that?) - */ - { - Window focus = 0; - int revert_to; - XSync (si->dpy, False); - XGetInputFocus (si->dpy, &focus, &revert_to); - if (focus && focus != PointerRoot && focus != None) - { - XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler); - XWindowAttributes xgwa; - xgwa.colormap = 0; - if (XGetWindowAttributes (si->dpy, focus, &xgwa) && - xgwa.colormap && - xgwa.colormap != DefaultColormapOfScreen (xgwa.screen)) - XInstallColormap (si->dpy, xgwa.colormap); - XSetErrorHandler (old_handler); - } - } - - - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - kill_xsetroot_data (si->dpy, ssi->screensaver_window, p->verbose_p); - } - - store_saver_status (si); /* store unblank time */ - ungrab_keyboard_and_mouse (si); - restore_real_vroot (si); - - /* Unmap the windows a second time, dammit -- just to avoid a race - with the screen-grabbing hacks. (I'm not sure if this is really - necessary; I'm stabbing in the dark now.) - */ - for (i = 0; i < si->nscreens; i++) - XUnmapWindow (si->dpy, si->screens[i].screensaver_window); - - si->screen_blanked_p = False; - si->blank_time = time ((time_t *) 0); - si->last_wall_clock_time = 0; - - store_saver_status (si); /* store unblank time */ -} - - -/* Transfer any grabs from the old window to the new. - Actually I think none of this is necessary, since we always - hold our grabs on the root window, but I wrote this before - re-discovering that... - */ -static void -maybe_transfer_grabs (saver_screen_info *ssi, - Window old_w, Window new_w, - int new_screen_no) -{ - saver_info *si = ssi->global; - - /* If the old window held our mouse grab, transfer the grab to the new - window. (Grab the server while so doing, to avoid a race condition.) - */ - if (old_w == si->mouse_grab_window) - { - XGrabServer (si->dpy); /* ############ DANGER! */ - ungrab_mouse (si); - grab_mouse (si, ssi->screensaver_window, - (si->demoing_p ? 0 : ssi->cursor), - new_screen_no); - XUngrabServer (si->dpy); - XSync (si->dpy, False); /* ###### (danger over) */ - } - - /* If the old window held our keyboard grab, transfer the grab to the new - window. (Grab the server while so doing, to avoid a race condition.) - */ - if (old_w == si->keyboard_grab_window) - { - XGrabServer (si->dpy); /* ############ DANGER! */ - ungrab_kbd(si); - grab_kbd(si, ssi->screensaver_window, ssi->number); - XUngrabServer (si->dpy); - XSync (si->dpy, False); /* ###### (danger over) */ - } } static Visual * get_screen_gl_visual (saver_info *si, int real_screen_number) { - int i; int nscreens = ScreenCount (si->dpy); if (! si->best_gl_visuals) - si->best_gl_visuals = (Visual **) - calloc (nscreens + 1, sizeof (*si->best_gl_visuals)); + { + int i; + si->best_gl_visuals = (Visual **) + calloc (nscreens + 1, sizeof (*si->best_gl_visuals)); - for (i = 0; i < nscreens; i++) - if (! si->best_gl_visuals[i]) - si->best_gl_visuals[i] = - get_best_gl_visual (si, ScreenOfDisplay (si->dpy, i)); + for (i = 0; i < nscreens; i++) + if (! si->best_gl_visuals[i]) + si->best_gl_visuals[i] = + get_best_gl_visual (si, ScreenOfDisplay (si->dpy, i)); + } if (real_screen_number < 0 || real_screen_number >= nscreens) abort(); return si->best_gl_visuals[real_screen_number]; @@ -1933,28 +621,21 @@ select_visual (saver_screen_info *ssi, const char *visual_name) if (visual_name && *visual_name) { - if (!strcmp(visual_name, "default-i") || - !strcmp(visual_name, "Default-i") || - !strcmp(visual_name, "Default-I") - ) + if (!strcasecmp(visual_name, "default-i")) { visual_name = "default"; install_cmap_p = True; } - else if (!strcmp(visual_name, "default-n") || - !strcmp(visual_name, "Default-n") || - !strcmp(visual_name, "Default-N")) + else if (!strcasecmp(visual_name, "default-n")) { visual_name = "default"; install_cmap_p = False; } - else if (!strcmp(visual_name, "gl") || - !strcmp(visual_name, "Gl") || - !strcmp(visual_name, "GL")) + else if (!strcasecmp(visual_name, "GL")) { new_v = get_screen_gl_visual (si, ssi->real_screen_number); if (!new_v && p->verbose_p) - fprintf (stderr, "%s: no GL visuals.\n", progname); + fprintf (stderr, "%s: no GL visuals\n", blurb()); } if (!new_v) @@ -1986,8 +667,10 @@ select_visual (saver_screen_info *ssi, const char *visual_name) if (p->verbose_p) { +#if 0 fprintf (stderr, "%s: %d: visual ", blurb(), ssi->number); describe_visual (stderr, ssi->screen, new_v, install_cmap_p); +#endif #if 0 fprintf (stderr, "%s: from ", blurb()); describe_visual (stderr, ssi->screen, ssi->current_visual, @@ -1995,39 +678,334 @@ select_visual (saver_screen_info *ssi, const char *visual_name) #endif } - reset_stderr (ssi); ssi->current_visual = new_v; ssi->current_depth = visual_depth(ssi->screen, new_v); ssi->cmap = 0; ssi->screensaver_window = 0; initialize_screensaver_window_1 (ssi); - - /* stderr_overlay_window is a child of screensaver_window, so we need - to destroy that as well (actually, we just need to invalidate and - drop our pointers to it, but this will destroy it, which is ok so - long as it happens before old_w itself is destroyed.) */ - reset_stderr (ssi); - - raise_window (si, True, True, False); - store_vroot_property (si->dpy, - ssi->screensaver_window, ssi->screensaver_window); - - /* Transfer any grabs from the old window to the new. */ - maybe_transfer_grabs (ssi, old_w, ssi->screensaver_window, ssi->number); + raise_window (ssi); /* Now we can destroy the old window without horking our grabs. */ XDestroyWindow (si->dpy, old_w); - if (p->verbose_p) - fprintf (stderr, "%s: %d: destroyed old saver window 0x%lx.\n", + if (p->verbose_p > 1) + fprintf (stderr, "%s: %d: destroyed old saver window 0x%lx\n", blurb(), ssi->number, (unsigned long) old_w); if (old_c && - old_c != DefaultColormapOfScreen (ssi->screen) && - old_c != ssi->demo_cmap) + old_c != DefaultColormapOfScreen (ssi->screen)) XFreeColormap (si->dpy, old_c); } return got_it; } + + +/* Synchronize the contents of si->ssi to the current state of the monitors. + Doesn't change anything if nothing has changed; otherwise, alters and + reuses existing saver_screen_info structs as much as possible. + Returns True if anything changed. + */ +Bool +update_screen_layout (saver_info *si) +{ + monitor **monitors = scan_monitors (si->dpy); + int count = 0; + int good_count = 0; + int i, j; + int seen_screens[100] = { 0, }; + + if (! monitor_layouts_differ_p (monitors, si->monitor_layout)) + { + free_monitors (monitors); + return False; + } + + free_monitors (si->monitor_layout); + si->monitor_layout = monitors; + check_monitor_sanity (si->monitor_layout); + + while (monitors[count]) + { + if (monitors[count]->sanity == S_SANE) + good_count++; + count++; + } + + if (si->ssi_count == 0) + { + si->ssi_count = 10; + si->screens = (saver_screen_info *) + calloc (sizeof(*si->screens), si->ssi_count); + } + + if (si->ssi_count <= good_count) + { + si->ssi_count = good_count + 10; + si->screens = (saver_screen_info *) + realloc (si->screens, sizeof(*si->screens) * si->ssi_count); + memset (si->screens + si->nscreens, 0, + sizeof(*si->screens) * (si->ssi_count - si->nscreens)); + } + + if (! si->screens) abort(); + + si->nscreens = good_count; + + /* Regenerate the list of GL visuals as needed. */ + if (si->best_gl_visuals) + free (si->best_gl_visuals); + si->best_gl_visuals = 0; + + for (i = 0, j = 0; i < count; i++) + { + monitor *m = monitors[i]; + saver_screen_info *ssi = &si->screens[j]; + int sn; + if (monitors[i]->sanity != S_SANE) continue; + + ssi->global = si; + ssi->number = j; + + sn = screen_number (m->screen); + ssi->screen = m->screen; + ssi->real_screen_number = sn; + ssi->real_screen_p = (seen_screens[sn] == 0); + seen_screens[sn]++; + + ssi->default_visual = + get_visual_resource (ssi->screen, "visualID", "VisualID", False); + ssi->current_visual = ssi->default_visual; + ssi->current_depth = visual_depth (ssi->screen, ssi->current_visual); + + ssi->x = m->x; + ssi->y = m->y; + ssi->width = m->width; + ssi->height = m->height; + +# ifndef DEBUG_MULTISCREEN + { + saver_preferences *p = &si->prefs; + if (p->debug_p +# ifdef QUAD_MODE + && !p->quad_p +# endif + ) + ssi->width /= 2; + } +# endif + + j++; + } + + return True; +} + + +/* When the screensaver is active, this timer will periodically change + the running program. Each screen has its own timer. + */ +void +cycle_timer (XtPointer closure, XtIntervalId *id) +{ + saver_screen_info *ssi = (saver_screen_info *) closure; + saver_info *si = ssi->global; + + if (ssi->error_dialog) + { + XDestroyWindow (si->dpy, ssi->error_dialog); + ssi->error_dialog = 0; + } + + maybe_reload_init_file (si); + kill_screenhack (ssi); + raise_window (ssi); + + /* We could do a fade-out of just this screen here; but that would only work + if the fade method is SHM, not gamma or colormap. It would also only + look right if the cycle timers never fire at the same time, which is + currently the case. */ + + XSync (si->dpy, False); + spawn_screenhack (ssi); /* This also re-adds the cycle_id timer */ +} + + +/* Called when a screenhack has exited unexpectedly. + We print a notification on the window, and in a little while, launch + a new hack (rather than waiting for the cycle timer to fire). + */ +void +screenhack_obituary (saver_screen_info *ssi, + const char *name, const char *error) +{ + saver_info *si = ssi->global; + saver_preferences *p = &si->prefs; + Time how_long = p->cycle; + Time max = 1000 * 60; /* Message stays up no longer than this */ + Window window; + Visual *visual; + XSetWindowAttributes attrs; + XWindowChanges changes; + unsigned long attrmask; + XftFont *font; + XftColor fg; + XftDraw *xftdraw; + XGlyphInfo overall; + XGCValues gcv; + GC gc; + char *fn, *cn; + char buf[255]; + int x, y, pad; + int bw = 4; + Colormap cmap; + + /* Restart the cycle timer, to take down the error dialog and launch + a new hack. + */ + if (how_long > max) + how_long = max; + if (ssi->cycle_id) + XtRemoveTimeOut (ssi->cycle_id); + ssi->cycle_id = + XtAppAddTimeOut (si->app, how_long, cycle_timer, (XtPointer) ssi); + ssi->cycle_at = time ((time_t *) 0) + how_long / 1000; + if (p->verbose_p) + fprintf (stderr, "%s: %d: cycling in %lu sec\n", blurb(), ssi->number, + how_long / 1000); + + /* Render an error message while we wait. + + We can't just render text on top of ssi->screensaver_window because + if there was an OpenGL hack running on it, Xlib graphics might not + show up at all. Likewise, creating a sub-window doesn't work. + So it must be a top-level override-redirect window atop the saver. + */ + cmap = ssi->cmap ? ssi->cmap : DefaultColormapOfScreen (ssi->screen); + window = ssi->error_dialog; + if (window) XDestroyWindow (si->dpy, window); + attrs.override_redirect = True; + attrs.background_pixel = ssi->black_pixel; + attrs.border_pixel = ssi->black_pixel; + attrs.backing_store = Always; + attrs.colormap = cmap; + attrmask = (CWOverrideRedirect | CWBackPixel | CWBorderPixel | + CWBackingStore | CWColormap); + visual = ssi->current_visual; + window = ssi->error_dialog = + XCreateWindow (si->dpy, RootWindowOfScreen (ssi->screen), + 0, 0, 1, 1, 0, ssi->current_depth, InputOutput, visual, + attrmask, &attrs); + + fn = get_string_resource (si->dpy, "errorFont", "Font"); + cn = get_string_resource (si->dpy, "errorColor", "Color"); + if (!fn || !*fn) fn = strdup ("monospace bold 16"); + if (!cn || !*cn) cn = strdup ("#FF0000"); + + font = load_xft_font_retry (si->dpy, screen_number (ssi->screen), fn); + XftColorAllocName (si->dpy, visual, cmap, cn, &fg); + xftdraw = XftDrawCreate (si->dpy, window, visual, cmap); + + gcv.foreground = + get_pixel_resource (si->dpy, cmap, "errorColor", "Color"); + gcv.line_width = bw; + gc = XCreateGC (si->dpy, window, GCForeground | GCLineWidth, &gcv); + + sprintf (buf, "\"%.100s\" %.100s", name, error); + + XftTextExtentsUtf8 (si->dpy, font, (FcChar8 *) buf, strlen(buf), &overall); + x = (ssi->width - overall.width) / 2; + y = (ssi->height - overall.height) / 2 + font->ascent; + pad = bw + font->ascent * 2; + + attrmask = CWX | CWY | CWWidth | CWHeight; + changes.x = ssi->x + x - pad; + changes.y = ssi->y + y - (font->ascent + pad); + changes.width = overall.width + pad * 2; + changes.height = font->ascent + font->descent + pad * 2; + XConfigureWindow (si->dpy, window, attrmask, &changes); + xscreensaver_set_wm_atoms (si->dpy, window, changes.width, changes.height, + ssi->screensaver_window); + XMapRaised (si->dpy, window); + XClearWindow (si->dpy, window); + + XDrawRectangle (si->dpy, window, gc, gcv.line_width/2, gcv.line_width/2, + changes.width - gcv.line_width, + changes.height - gcv.line_width); + + x = pad; + y = font->ascent + pad; + XftDrawStringUtf8 (xftdraw, &fg, font, x, y, (FcChar8 *) buf, strlen (buf)); + XSync (si->dpy, False); + + XFreeGC (si->dpy, gc); + XftDrawDestroy (xftdraw); + /* XftColorFree (si->dpy, visual, cmap, &fg); */ + XftFontClose (si->dpy, font); + free (fn); + free (cn); +} + + +/* This timer goes off every few minutes to try and clean up anything that has + gone wrong. It raises the windows, in case some other window has been + mapped on top of them, and re-sets the server's DPMS settings. + + Maybe we should respond to Expose events to detect when another window has + raised above us and re-raise ourselves sooner. But that would result in us + fighting against "xscreensaver-auth" which tries very hard to be on top. + */ +static void +watchdog_timer (XtPointer closure, XtIntervalId *id) +{ + saver_info *si = (saver_info *) closure; + saver_preferences *p = &si->prefs; + + /* If the DPMS settings on the server have changed, change them back to + what ~/.xscreensaver says they should be. */ + sync_server_dpms_settings (si->dpy, p); + + if (si->prefs.debug_p) + fprintf (stderr, "%s: watchdog timer raising screen\n", blurb()); + + raise_windows (si); + + if (any_screenhacks_running_p (si) && + !monitor_powered_on_p (si->dpy)) + { + int i; + if (si->prefs.verbose_p) + fprintf (stderr, + "%s: monitor has powered down; killing running hacks\n", + blurb()); + for (i = 0; i < si->nscreens; i++) + kill_screenhack (&si->screens[i]); + } + + /* Re-schedule this timer. The watchdog timer defaults to a bit less + than the hack cycle period, but is never longer than one hour. + */ + si->watchdog_id = 0; + reset_watchdog_timer (si); +} + + +static void +reset_watchdog_timer (saver_info *si) +{ + saver_preferences *p = &si->prefs; + + if (si->watchdog_id) + { + XtRemoveTimeOut (si->watchdog_id); + si->watchdog_id = 0; + } + + if (p->watchdog_timeout <= 0) return; + si->watchdog_id = XtAppAddTimeOut (si->app, p->watchdog_timeout, + watchdog_timer, (XtPointer) si); + if (p->debug_p) + fprintf (stderr, "%s: restarting watchdog_timer (%ld, %ld)\n", + blurb(), p->watchdog_timeout, si->watchdog_id); +} diff --git a/driver/xdpyinfo.c b/driver/xdpyinfo.c index 9f679665..4bb071c8 100644 --- a/driver/xdpyinfo.c +++ b/driver/xdpyinfo.c @@ -34,9 +34,14 @@ in this Software without prior written authorization from The Open Group. * -DHAVE_XRECORD */ +#include +#include +#include + #include #include #include /* for CARD32 */ +#include #include #ifdef HAVE_XIE #include @@ -69,18 +74,16 @@ in this Software without prior written authorization from The Open Group. char *ProgramName; Bool queryExtensions = False; -static int StrCmp(a, b) - char **a, **b; +static int StrCmp(const void *a, const void *b) { - return strcmp(*a, *b); + return strcmp(*((char **)a), *((char **)b)); } #ifdef HAVE_GLX /* Added by jwz, 11-Nov-99 */ static void -print_glx_versions (dpy) - Display *dpy; +print_glx_versions (Display *dpy) { /* Note: with Mesa 3.0, this lies: it prints the info from the client's GL library, rather than the info from the GLX server. @@ -100,9 +103,7 @@ print_glx_versions (dpy) } static void -print_glx_visual_info (dpy, vip) - Display *dpy; - XVisualInfo *vip; +print_glx_visual_info (Display *dpy, XVisualInfo *vip) { int status, value = False; @@ -271,8 +272,7 @@ struct overlay_list static struct overlay_list *overlays = 0; static void -find_overlay_info (dpy) - Display *dpy; +find_overlay_info (Display *dpy) { int screen; Atom OVERLAY = XInternAtom (dpy, "SERVER_OVERLAY_VISUALS", False); @@ -307,8 +307,7 @@ find_overlay_info (dpy) } static void -print_overlay_visual_info (vip) - XVisualInfo *vip; +print_overlay_visual_info (XVisualInfo *vip) { int i; int vis = vip->visualid; @@ -327,7 +326,7 @@ print_overlay_visual_info (vip) if (ov->transparency == 1) printf ("transparent pixel %lu\n", (unsigned long) ov->value); else if (ov->transparency == 2) - printf ("transparent mask 0x%x\n", (unsigned long) ov->value); + printf ("transparent mask 0x%lx\n", (unsigned long) ov->value); else printf ("opaque\n"); } @@ -335,9 +334,8 @@ print_overlay_visual_info (vip) #endif /* HAVE_OVERLAY */ -void -print_extension_info (dpy) - Display *dpy; +static void +print_extension_info (Display *dpy) { int n = 0; char **extlist = XListExtensions (dpy, &n); @@ -367,9 +365,8 @@ print_extension_info (dpy) } } -void -print_display_info (dpy) - Display *dpy; +static void +print_display_info (Display *dpy) { char dummybuf[40]; char *cp; @@ -393,7 +390,7 @@ print_display_info (dpy) req_size = XExtendedMaxRequestSize (dpy); if (!req_size) req_size = XMaxRequestSize (dpy); printf ("maximum request size: %ld bytes\n", req_size * 4); - printf ("motion buffer size: %d\n", XDisplayMotionBufferSize (dpy)); + printf ("motion buffer size: %ld\n", XDisplayMotionBufferSize (dpy)); switch (BitmapBitOrder (dpy)) { case LSBFirst: cp = "LSBFirst"; break; @@ -470,9 +467,8 @@ print_display_info (dpy) printf ("number of screens: %d\n", ScreenCount (dpy)); } -void -print_visual_info (vip) - XVisualInfo *vip; +static void +print_visual_info (XVisualInfo *vip) { char errorbuf[40]; /* for sprintfing into */ char *class = NULL; /* for printing */ @@ -507,10 +503,15 @@ print_visual_info (vip) vip->bits_per_rgb); } -void -print_screen_info (dpy, scr) - Display *dpy; - int scr; +static int print_event_mask ( + char *buf, /* string to write into */ + int lastcol, /* strlen(buf)+1 */ + int indent, /* amount by which to indent */ + long mask); /* event mask */ + + +static void +print_screen_info (Display *dpy, int scr) { Screen *s = ScreenOfDisplay (dpy, scr); /* opaque structure */ XVisualInfo viproto; /* fill in for getting info */ @@ -565,7 +566,7 @@ print_screen_info (dpy, scr) printf (" default colormap: 0x%lx\n", DefaultColormap (dpy, scr)); printf (" default number of colormap cells: %d\n", DisplayCells (dpy, scr)); - printf (" preallocated pixels: black %d, white %d\n", + printf (" preallocated pixels: black %lu, white %lu\n", BlackPixel (dpy, scr), WhitePixel (dpy, scr)); printf (" options: backing-store %s, save-unders %s\n", (DoesBackingStore (s) == NotUseful) ? no : @@ -637,11 +638,11 @@ static struct _event_table { { "OwnerGrabButtonMask ", OwnerGrabButtonMask }, { NULL, 0 }}; -int print_event_mask (buf, lastcol, indent, mask) - char *buf; /* string to write into */ - int lastcol; /* strlen(buf)+1 */ - int indent; /* amount by which to indent */ - long mask; /* event mask */ +static int print_event_mask ( + char *buf, /* string to write into */ + int lastcol, /* strlen(buf)+1 */ + int indent, /* amount by which to indent */ + long mask) /* event mask */ { struct _event_table *etp; int len; @@ -673,11 +674,9 @@ int print_event_mask (buf, lastcol, indent, mask) return (bitsfound); } -void -print_standard_extension_info(dpy, extname, majorrev, minorrev) - Display *dpy; - char *extname; - int majorrev, minorrev; +static void +print_standard_extension_info(Display *dpy, char *extname, + int majorrev, int minorrev) { int opcode, event, error; @@ -692,10 +691,8 @@ print_standard_extension_info(dpy, extname, majorrev, minorrev) printf("\n"); } -int -print_multibuf_info(dpy, extname) - Display *dpy; - char *extname; +static int +print_multibuf_info(Display *dpy, char *extname) { int i, j; /* temp variable: iterator */ int nmono, nstereo; /* count */ @@ -850,10 +847,8 @@ print_sync_info(dpy, extname) } #endif /* HAVE_XSYNC */ -int -print_shape_info(dpy, extname) - Display *dpy; - char *extname; +static int +print_shape_info(Display *dpy, char *extname) { int majorrev, minorrev; @@ -979,9 +974,8 @@ ExtensionPrintInfo known_extensions[] = int num_known_extensions = sizeof known_extensions / sizeof known_extensions[0]; -void -print_known_extensions(f) - FILE *f; +static void +print_known_extensions(FILE *f) { int i; for (i = 0; i < num_known_extensions; i++) @@ -990,9 +984,8 @@ print_known_extensions(f) } } -void -mark_extension_for_printing(extname) - char *extname; +static void +mark_extension_for_printing(char *extname) { int i; @@ -1015,9 +1008,8 @@ mark_extension_for_printing(extname) } } -void -print_marked_extensions(dpy) - Display *dpy; +static void +print_marked_extensions(Display *dpy) { int i; for (i = 0; i < num_known_extensions; i++) @@ -1035,7 +1027,7 @@ print_marked_extensions(dpy) } } -static void usage () +static void usage (void) { fprintf (stderr, "usage: %s [options]\n", ProgramName); fprintf (stderr, "-display displayname\tserver to query\n"); @@ -1047,15 +1039,11 @@ static void usage () exit (1); } -int main (argc, argv) - int argc; - char *argv[]; +int main (int argc, char *argv[]) { Display *dpy; /* X connection */ char *displayname = NULL; /* server to contact */ int i; /* temp variable: iterator */ - Bool multibuf = False; - int mbuf_event_base, mbuf_error_base; ProgramName = argv[0]; @@ -1077,7 +1065,7 @@ int main (argc, argv) dpy = XOpenDisplay (displayname); if (!dpy) { - fprintf (stderr, "%s: unable to open display \"%s\".\n", + fprintf (stderr, "%s: unable to open display \"%s\"\n", ProgramName, XDisplayName (displayname)); exit (1); } diff --git a/driver/xinput.c b/driver/xinput.c new file mode 100644 index 00000000..3b21db02 --- /dev/null +++ b/driver/xinput.c @@ -0,0 +1,381 @@ +/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include +#include +#include + +#include "blurb.h" +#include "xinput.h" + +extern Bool debug_p; + +#undef countof +#define countof(x) (sizeof((x))/sizeof((*x))) + + +/* Initialize the XInput2 extension. Returns True on success. + */ +Bool +init_xinput (Display *dpy, int *opcode_ret) +{ + int nscreens = ScreenCount (dpy); + XIEventMask evmasks[1]; + unsigned char mask1[(XI_LASTEVENT + 7)/8]; + int major, minor; + int xi_opcode, ev, err; + int i; + int ndevs = 0; + XIDeviceInfo *devs; + + if (!XQueryExtension (dpy, "XInputExtension", &xi_opcode, &ev, &err)) + { + fprintf (stderr, "%s: XInput extension missing\n", blurb()); + return False; + } + + major = 2; /* Desired version */ + minor = 2; + if (XIQueryVersion (dpy, &major, &minor) != Success) + { + fprintf (stderr, "%s: server only supports XInput %d.%d\n", + blurb(), major, minor); + return False; + } + + if (verbose_p) + fprintf (stderr, "%s: XInput version %d.%d\n", blurb(), major, minor); + + memset (mask1, 0, sizeof(mask1)); + + XISetMask (mask1, XI_RawMotion); + XISetMask (mask1, XI_RawKeyPress); + XISetMask (mask1, XI_RawKeyRelease); + XISetMask (mask1, XI_RawButtonPress); + XISetMask (mask1, XI_RawButtonRelease); + XISetMask (mask1, XI_RawTouchBegin); + XISetMask (mask1, XI_RawTouchUpdate); + XISetMask (mask1, XI_RawTouchEnd); + + /* If we use XIAllDevices instead, we get double events. */ + evmasks[0].deviceid = XIAllMasterDevices; + evmasks[0].mask_len = sizeof(mask1); + evmasks[0].mask = mask1; + + for (i = 0; i < nscreens; i++) + { + Window root = RootWindow (dpy, i); + if (XISelectEvents (dpy, root, evmasks, countof(evmasks)) != Success) + { + fprintf (stderr, "%s: XISelectEvents failed\n", blurb()); + return False; + } + } + + XFlush (dpy); + + devs = XIQueryDevice (dpy, XIAllDevices, &ndevs); + if (!ndevs) + { + fprintf (stderr, "%s: XInput: no devices\n", blurb()); + return False; + } + + if (verbose_p) + for (i = 0; i < ndevs; i++) + { + XIDeviceInfo *d = &devs[i]; + fprintf (stderr, "%s: device %2d/%d: %s: %s\n", + blurb(), d->deviceid, d->attachment, + (d->use == XIMasterPointer ? "MP" : + d->use == XIMasterKeyboard ? "MK" : + d->use == XISlavePointer ? "SP" : + d->use == XISlaveKeyboard ? "SK" : + d->use == XIFloatingSlave ? "FS" : "??"), + d->name); + } + + XIFreeDeviceInfo (devs); + *opcode_ret = xi_opcode; + return True; +} + + +/* Convert an XInput2 event to corresponding old-school Xlib event. + Returns true on success. + */ +Bool +xinput_event_to_xlib (int evtype, XIDeviceEvent *in, XEvent *out) +{ + Display *dpy = in->display; + Bool ok = False; + + int root_x = 0, root_y = 0; + unsigned int mods = 0; + + /* The closest thing to actual documentation on XInput2 seems to be a series + of blog posts by Peter Hutterer. There's basically nothing about it on + www.x.org. In http://who-t.blogspot.com/2009/07/xi2-recipes-part-4.html + he says: + + "XIDeviceEvent [...] contains the state of the modifier keys [...] + The base modifiers are the ones currently pressed, latched the ones + pressed until a key is pressed that's configured to unlatch it (e.g. + some shift-capslock interactions have this behaviour) and finally + locked modifiers are the ones permanently active until unlocked + (default capslock behaviour in the US layout). The effective modifiers + are a bitwise OR of the three above - which is essentially equivalent + to the modifiers state supplied in the core protocol events." + + However, I'm seeing random noise in the various XIDeviceEvent.mods fields. + Nonsensical values like base = 0x6045FB3D. So, let's poll the actual + modifiers from XQueryPointer. This can race: maybe the modifier state + changed between when the server generated the keyboard event, and when + we receive it and poll. However, if an actual human is typing and + releasing their modifier keys on such a tight timeframe... that's + probably already not going well. + + I'm also seeing random noise in the event_xy and root_xy fields in + motion events. So just always use XQueryPointer. + */ + switch (evtype) { + case XI_RawKeyPress: + case XI_RawKeyRelease: + case XI_RawButtonPress: + case XI_RawButtonRelease: + case XI_RawMotion: + { + Window root_ret, child_ret; + int win_x, win_y; + int i; + for (i = 0; i < ScreenCount (dpy); i++) /* query on correct screen */ + if (XQueryPointer (dpy, RootWindow (dpy, i), + &root_ret, &child_ret, &root_x, &root_y, + &win_x, &win_y, &mods)) + break; + } + default: break; + } + + switch (evtype) { + case XI_RawKeyPress: + case XI_RawKeyRelease: + out->xkey.type = (evtype == XI_RawKeyPress ? KeyPress : KeyRelease); + out->xkey.display = in->display; + out->xkey.window = in->event; + out->xkey.root = in->root; + out->xkey.subwindow = in->child; + out->xkey.time = in->time; + out->xkey.x = root_x; + out->xkey.y = root_y; + out->xkey.x_root = root_x; + out->xkey.y_root = root_y; + out->xkey.state = mods; + out->xkey.keycode = in->detail; + ok = True; + break; + case XI_RawButtonPress: + case XI_RawButtonRelease: + out->xbutton.type = (evtype == XI_RawButtonPress + ? ButtonPress : ButtonRelease); + out->xbutton.display = in->display; + out->xbutton.window = in->event; + out->xbutton.root = in->root; + out->xbutton.subwindow = in->child; + out->xbutton.time = in->time; + out->xbutton.x = root_x; + out->xbutton.y = root_y; + out->xbutton.x_root = root_x; + out->xbutton.y_root = root_y; + out->xbutton.state = mods; + out->xbutton.button = in->detail; + ok = True; + break; + case XI_RawMotion: + out->xmotion.type = MotionNotify; + out->xmotion.display = in->display; + out->xmotion.window = in->event; + out->xmotion.root = in->root; + out->xmotion.subwindow = in->child; + out->xmotion.time = in->time; + out->xmotion.x = root_x; + out->xmotion.y = root_y; + out->xmotion.x_root = root_x; + out->xmotion.y_root = root_y; + out->xmotion.state = mods; + ok = True; + break; + default: + break; + } + + return ok; +} + + +static void +print_kbd_event (XEvent *xev, XComposeStatus *compose, Bool x11_p) +{ + if (debug_p) /* Passwords show up in plaintext! */ + { + KeySym keysym = 0; + char c[100]; + char M[100], *mods = M; + int n = XLookupString (&xev->xkey, c, sizeof(c)-1, &keysym, compose); + const char *ks = keysym ? XKeysymToString (keysym) : "NULL"; + c[n] = 0; + if (*c == '\n') strcpy (c, "\\n"); + else if (*c == '\r') strcpy (c, "\\r"); + else if (*c == '\t') strcpy (c, "\\t"); + + *mods = 0; + if (xev->xkey.state & ShiftMask) strcat (mods, "-Sh"); + if (xev->xkey.state & LockMask) strcat (mods, "-Lk"); + if (xev->xkey.state & ControlMask) strcat (mods, "-C"); + if (xev->xkey.state & Mod1Mask) strcat (mods, "-M1"); + if (xev->xkey.state & Mod2Mask) strcat (mods, "-M2"); + if (xev->xkey.state & Mod3Mask) strcat (mods, "-M3"); + if (xev->xkey.state & Mod4Mask) strcat (mods, "-M4"); + if (xev->xkey.state & Mod5Mask) strcat (mods, "-M5"); + if (*mods) mods++; + if (!*mods) strcat (mods, "0"); + + fprintf (stderr, "%s: %s 0x%02X %s %s \"%s\"\n", blurb(), + (x11_p + ? (xev->xkey.type == KeyPress + ? "X11 KeyPress " + : "X11 KeyRelease ") + : (xev->xkey.type == KeyPress + ? "XI_RawKeyPress " + : "XI_RawKeyRelease")), + xev->xkey.keycode, mods, ks, c); + } + else /* Log only that the KeyPress happened. */ + { + fprintf (stderr, "%s: X11 Key%s\n", blurb(), + (xev->xkey.type == KeyPress ? "Press " : "Release")); + } +} + + +void +print_xinput_event (Display *dpy, XEvent *xev, const char *desc) +{ + XIRawEvent *re; + + switch (xev->xany.type) { + case KeyPress: + case KeyRelease: + { + static XComposeStatus compose = { 0, }; + print_kbd_event (xev, &compose, True); + } + break; + + case ButtonPress: + case ButtonRelease: + fprintf (stderr, "%s: X11 Button%s %d %d\n", blurb(), + (xev->xany.type == ButtonPress ? "Press " : "Release"), + xev->xbutton.button, xev->xbutton.state); + break; + + case MotionNotify: + fprintf (stderr, "%s: X11 MotionNotify %4d, %-4d" + " %s\n", + blurb(), xev->xmotion.x_root, xev->xmotion.y_root, + (desc ? desc : "")); + break; + default: + break; + } + + if (xev->xany.type != GenericEvent) + return; /* not an XInput event */ + + if (!xev->xcookie.data) + XGetEventData (dpy, &xev->xcookie); + + re = xev->xcookie.data; + if (!re) return; /* Bogus XInput event */ + + switch (re->evtype) { + case XI_RawKeyPress: + case XI_RawKeyRelease: + if (debug_p) + { + /* Fake up an XKeyEvent in order to call XKeysymToString(). */ + XEvent ev2; + Bool ok = xinput_event_to_xlib (xev->xcookie.evtype, + (XIDeviceEvent *) re, + &ev2); + if (!ok) + fprintf (stderr, "%s: unable to translate XInput2 event\n", blurb()); + else + { + static XComposeStatus compose = { 0, }; + print_kbd_event (&ev2, &compose, False); + } + break; + } + else + fprintf (stderr, "%s: XI RawKey%s\n", blurb(), + (re->evtype == XI_RawKeyPress ? "Press " : "Release")); + break; + + case XI_RawButtonPress: + case XI_RawButtonRelease: + fprintf (stderr, "%s: XI RawButton%s %d\n", blurb(), + (re->evtype == XI_RawButtonPress ? "Press " : "Release"), + re->detail); + break; + + case XI_RawMotion: + if (verbose_p > 1) + { + Window root_ret, child_ret; + int root_x, root_y; + int win_x, win_y; + unsigned int mask; + XQueryPointer (dpy, DefaultRootWindow (dpy), + &root_ret, &child_ret, &root_x, &root_y, + &win_x, &win_y, &mask); + fprintf (stderr, + "%s: XI_RawMotion %4d, %-4d %7.02f, %-7.02f%s\n", + blurb(), root_x, root_y, re->raw_values[0], re->raw_values[1], + (desc ? desc : "")); + } + break; + + /* Touch-screens, possibly trackpads or tablets. */ + case XI_RawTouchBegin: + fprintf (stderr, "%s: XI RawTouchBegin\n", blurb()); + break; + case XI_RawTouchEnd: + fprintf (stderr, "%s: XI RawTouchEnd\n", blurb()); + break; + case XI_RawTouchUpdate: + if (verbose_p > 1) + fprintf (stderr, "%s: XI RawTouchUpdate\n", blurb()); + break; + + default: + fprintf (stderr, "%s: unknown XInput event %d\n", blurb(), re->type); + break; + } +} diff --git a/driver/xinput.h b/driver/xinput.h new file mode 100644 index 00000000..2ee20ee4 --- /dev/null +++ b/driver/xinput.h @@ -0,0 +1,19 @@ +/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifndef __XSCREENSAVER_XINPUT_H__ +#define __XSCREENSAVER_XINPUT_H__ + +extern Bool init_xinput (Display *dpy, int *opcode_ret); +extern Bool xinput_event_to_xlib (int evtype, XIDeviceEvent *in, XEvent *out); +extern void print_xinput_event (Display *, XEvent *, const char *desc); + +#endif /* __XSCREENSAVER_XINPUT_H__ */ diff --git a/driver/xscreensaver-auth.c b/driver/xscreensaver-auth.c new file mode 100644 index 00000000..4344d206 --- /dev/null +++ b/driver/xscreensaver-auth.c @@ -0,0 +1,340 @@ +/* xscreensaver, Copyright © 1991-2021 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * XScreenSaver Daemon, version 6. + * + * This is "xscreensaver-auth" -- When the screen is locked and there is + * user activity, this program is launched to pop up a dialog, authenticate + * the user, and eventually exit with a status code indicating success or + * failure. See the comment atop xscreensaver.c for details of the division + * of powers. + * + * Flow of control within xscreensaver-auth: + * + * - Privileged password initialization (e.g. read /etc/shadow as root) + * - Disavow privileges + * - Unprivileged password initialization + * - Connect to X server + * - xss_authenticate (passwd.c) + * - Tries PAM, Kerberos, pwent, shadow passwords (passwd-*.c) until + * one of them works. Non-PAM methods are wrapped to act like PAM. + * - pam_conv calls our "conversation" function zero or more times. + * That function is expected to present messages to the user and/or + * to prompt the user to answer a question, wait for the answer, and + * return it. There might be only one question (the password) or + * there might be others, even multiple passwords. + * - xscreensaver_auth_conv (dialog.c) is our conversation function. + * - First time it is called, it creates the window. + * - Subsequent times, it reuses that window. + * - Runs an X11 event loop waiting for the user to complete + * or timeout, then returns the entered strings. + * - pam_conv takes the user input and returns success/failure. + * - xscreensaver_auth_finished is called to pop up a final dialog to + * present any error messages. + * - Exit with appropriate code. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef ENABLE_NLS +# include +# include +#endif + +#include "xscreensaver.h" +#include "version.h" +#include "atoms.h" +#include "yarandom.h" +#include "resources.h" +#include "visual.h" +#include "auth.h" + +#ifdef __GNUC__ + __extension__ /* shut up about "string length is greater than the length + ISO C89 compilers are required to support" when including + the .ad file... */ +#endif + +static char *defaults[] = { +#include "XScreenSaver_ad.h" + 0 +}; + + +char *progclass = 0; +Bool debug_p = False; + + +#ifdef HAVE_PROC_OOM +/* Linux systems have an "out-of-memory killer" that will nuke random procs in + low-memory situations. You'd think it would pick the process using the + most memory, but most of the time it seems to pick the process that would + be most comically inconvenient, such as your screen locker, or crond. + + Since killing "xscreensaver" unlocks the screen... that would be bad. + + This program, "xscreensaver-auth", is the part of the XScreenSaver daemon + that might need to be setuid for other reasons, so we handle the OOM killer + here. We could instead handle OOM in the "xscreensaver" program, but then + that program would *also* need to be setuid. + + So instead, "xscreensaver-auth" sets OOM immunity on its *parent* process. + That means that if you run it by hand, it will apply that immunity to the + parent shell. Maybe that's bad? I think I don't care. + + Linux >= 2.6.11: echo -17 > /proc/$$/oom_adj + Linux >= 2.6.37: echo -1000 > /proc/$$/oom_score_adj + + "An aircraft company discovered that it was cheaper to fly its planes with + less fuel on board. On rare occasions, however, the amount of fuel was + insufficient, and the plane would crash. In emergency cases, a passenger + was selected and thrown out of the plane. When necessary, the procedure + was repeated." + + https://lwn.net/Articles/104179/ + + The OOM killer preferentially kills processes whose *children* use a lot of + memory, and processes that are niced. So if a display mode uses a lot of + memory, the OOM-killer is more likely to shoot down the XScreenSaver + *daemon* than just that screenhack! + + To disable the OOM-killer entirely: + + echo 2 > /proc/sys/vm/overcommit_memory + echo vm.overcommit_memory = 2 >> /etc/sysctl.conf + */ +static void +oom_assassin_immunity (void) +{ +# define OOM_VAL "-1000" + char fn[1024]; + struct stat st; + FILE *fd; + pid_t pid = getppid(); /* our parent, not us */ + + sprintf (fn, "/proc/%d/oom_score_adj", pid); + if (stat(fn, &st) != 0) + { + if (verbose_p) + fprintf (stderr, "%s: OOM: %s does not exist\n", blurb(), fn); + return; + } + fd = fopen (fn, "w"); + if (!fd) goto FAIL; + if (fputs (OOM_VAL "\n", fd) <= 0) goto FAIL; + if (fclose (fd) != 0) goto FAIL; + + if (verbose_p) + fprintf (stderr, "%s: OOM: echo " OOM_VAL " > %s\n", blurb(), fn); + return; + + FAIL: + { + char buf[1024]; + const char *b = blurb(); + sprintf (buf, "%.40s: OOM: %.200s", b, fn); + perror (buf); + if (getuid() == geteuid()) + fprintf (stderr, + "%s: To prevent the kernel from randomly unlocking\n" + "%s: your screen via the out-of-memory killer,\n" + "%s: \"%s\" must be setuid root.\n", + b, b, b, progname); + } +} +#endif /* HAVE_PROC_OOM */ + + +int +main (int argc, char **argv) +{ + Display *dpy; + XtAppContext app; + Widget root_widget; + char *dpy_str = getenv ("DISPLAY"); + Bool xsync_p = False; + Bool splash_p = False; + Bool init_p = False; + int i; + +# undef ya_rand_init + ya_rand_init (0); + + /* For Xt and X resource database purposes, this program is + "xscreensaver", not "xscreensaver-auth". + */ + { + char *s = strrchr(argv[0], '/'); + if (s) s++; + else s = argv[0]; + if (strlen(s) > 20) /* keep it short. */ + s[20] = 0; + progname = s; + } + + progclass = "XScreenSaver"; + argv[0] = "xscreensaver"; + + if (! dpy_str) dpy_str = ":0"; + + for (i = 1; i < argc; i++) + { + const char *oa = argv[i]; + /* XScreenSaver predates the "--arg" convention. */ + if (argv[i][0] == '-' && argv[i][1] == '-') + argv[i]++; + + if (!strcmp (argv[i], "-v") || !strcmp (argv[i], "-verbose")) + verbose_p++; + else if (!strcmp (argv[i], "-vv")) verbose_p += 2; + else if (!strcmp (argv[i], "-vvv")) verbose_p += 3; + else if (!strcmp (argv[i], "-vvvv")) verbose_p += 4; + else if (!strcmp (argv[i], "-q") || !strcmp (argv[i], "-quiet")) + verbose_p = False; + else if (!strcmp (argv[i], "-debug")) + /* Does nothing else at the moment but warn that "xscreensaver" + is logging keystrokes to stderr. */ + debug_p = True; + else if (!strcmp (argv[i], "-d") || + !strcmp (argv[i], "-dpy") || + !strcmp (argv[i], "-disp") || + !strcmp (argv[i], "-display")) + { + dpy_str = argv[++i]; + if (!dpy_str) goto HELP; + } + else if (!strcmp (argv[i], "-sync") || + !strcmp (argv[i], "-synch") || + !strcmp (argv[i], "-synchronize") || + !strcmp (argv[i], "-synchronise")) + xsync_p = True; + else if (!strcmp (argv[i], "-splash")) + splash_p = True; + else if (!strcmp (argv[i], "-init")) + init_p = True; + else if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "-help")) + { + HELP: + fprintf (stderr, + "\n" + "\txscreensaver-auth is launched by the xscreensaver daemon\n" + "\tto authenticate the user by prompting for a password.\n" + "\tDo not run this directly.\n" + "\n" + "\tOptions:\n" + "\t\t--dpy host:display.screen\n" + "\t\t--verbose --sync --splash --init\n" + "\n" + "\tRun 'xscreensaver-settings' to configure.\n" + "\n"); + exit (1); + } + else + { + fprintf (stderr, "\n%s: unknown option: %s\n", blurb(), oa); + goto HELP; + } + } + + if (!splash_p && init_p) + { + const char *v = XSCREENSAVER_VERSION; + if (strstr (v, "a") || strstr (v, "b")) + splash_p = True; /* Not optional for alpha and beta releases */ + } + +# ifdef HAVE_PROC_OOM + if (splash_p || init_p) + oom_assassin_immunity (); +# endif + + if (!splash_p && !init_p) + lock_priv_init (); + + if (!splash_p && init_p) + exit (0); + + disavow_privileges (); + + if (!splash_p) + lock_init (); + + /* Setting the locale is necessary for XLookupString to return multi-byte + characters, enabling their use in passwords. + */ +# ifdef ENABLE_NLS + { + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + textdomain (GETTEXT_PACKAGE); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + if (!setlocale (LC_ALL, "")) + fprintf (stderr, "%s: warning: could not set default locale\n", + progname); + } +# endif /* ENABLE_NLS */ + + + /* Copy the -dpy arg to $DISPLAY for subprocesses. */ + { + char *s = (char *) malloc (strlen(dpy_str) + 20); + sprintf (s, "DISPLAY=%s", dpy_str); + putenv (s); + /* free (s); */ /* some versions of putenv do not copy */ + } + + /* Open the display */ + { + XrmOptionDescRec options; + argc = 1; /* Xt does not receive any of our command-line options. */ + root_widget = XtAppInitialize (&app, progclass, &options, 0, + &argc, argv, defaults, 0, 0); + } + + dpy = XtDisplay (root_widget); + if (xsync_p) XSynchronize (dpy, True); + init_xscreensaver_atoms (dpy); + + if (splash_p) + { + xscreensaver_splash (root_widget); + exit (0); + } + else if (xscreensaver_auth ((void *) root_widget, + xscreensaver_auth_conv, + xscreensaver_auth_finished)) + { + if (verbose_p) + fprintf (stderr, "%s: authentication succeeded\n", blurb()); + exit (200); + } + else + { + if (verbose_p) + fprintf (stderr, "%s: authentication failed\n", blurb()); + exit (-1); + } + + /* On timeout, xscreensaver_auth did exit(0) */ +} diff --git a/driver/xscreensaver-auth.man b/driver/xscreensaver-auth.man new file mode 100644 index 00000000..16556026 --- /dev/null +++ b/driver/xscreensaver-auth.man @@ -0,0 +1,27 @@ +.TH XScreenSaver 1 "06-Jan-2021 (6.00)" "X Version 11" +.SH NAME +xscreensaver - extensible screen saver and screen locking framework +.SH SYNOPSIS +.B xscreensaver-auth +[\-display \fIhost:display.screen\fP] +.SH DESCRIPTION +The +.BR xscreensaver (1) +daemon launches this program to prompt the user for their password. +Do not run this program directly. +.SH SEE ALSO +.BR xscreensaver (1), +.BR xscreensaver\-settings (1), +.BR xscreensaver\-gfx (MANSUFFIX), +.BR xscreensaver\-systemd (MANSUFFIX). +.SH COPYRIGHT +Copyright \(co 2021 by Jamie Zawinski. +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation. No representations are made about the +suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. +.SH AUTHOR +Jamie Zawinski diff --git a/driver/xscreensaver-command.c b/driver/xscreensaver-command.c index e4521125..0dab5648 100644 --- a/driver/xscreensaver-command.c +++ b/driver/xscreensaver-command.c @@ -1,4 +1,4 @@ -/* xscreensaver-command, Copyright (c) 1991-2020 Jamie Zawinski +/* xscreensaver-command, Copyright © 1991-2021 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -31,30 +31,15 @@ #include /* only needed to get through xscreensaver.h */ - -/* You might think that to read an array of 32-bit quantities out of a - server-side property, you would pass an array of 32-bit data quantities - into XGetWindowProperty(). You would be wrong. You have to use an array - of longs, even if long is 64 bits (using 32 of each 64.) - */ -typedef long PROP32; - +#include "blurb.h" #include "remote.h" #include "version.h" +#include "atoms.h" #ifdef _VROOT_H_ ERROR! you must not include vroot.h in this file #endif -char *progname; - -Atom XA_VROOT; -Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE; -Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO, XA_EXIT; -Atom XA_BLANK, XA_LOCK, XA_ACTIVATE, XA_SUSPEND, XA_NEXT, XA_PREV; -static Atom XA_DEACTIVATE, XA_CYCLE; -static Atom XA_RESTART, XA_PREFS, XA_THROTTLE, XA_UNTHROTTLE; - static char *screensaver_version; # ifdef __GNUC__ __extension__ /* don't warn about "string length is greater than the @@ -74,11 +59,6 @@ usage: %s -